Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥[听]六月听书[DS]@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumhtemdouWKoOi9vVwiLFwicGF0aFwiOlwicGFnZUxvYWRcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbihpbXBvcnRQYXJhbSkge1xcbiAgICB2YXIgbG9hZFVybCA9IGltcG9ydFBhcmFtIHx8IGdldFBhcmFtKFxcXCJyZWRpcmVjdFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHZhciBjb2RlID0gSlNPTi5wYXJzZShmZXRjaChcXFwiaGlrZXI6Ly9wYWdlL1xcXCIgKyBsb2FkVXJsKSkucnVsZTtcXG4gICAgICAgIC8vbG9nKGNvZGUpXFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgICAgIGRlc2M6IFxcXCLkuI3lrZjlnKjor6XpobXpnaI6XFxcIiArIGxvYWRVcmwsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxFUlJPUuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfV0pO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuXFxuICAgIHRyeSB7XFxuICAgICAgICBldmFsLmNhbGwobnVsbCwgY29kZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZCAhPSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgICAgIHZhciBkID0gW107XFxuICAgICAgICB9XFxuICAgICAgICBkID0gQXJyYXkuaXNBcnJheShkKSA/IGQgOiBbXTtcXG4gICAgICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcIm5lZWQgbG9naW5cXFwiKSkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6ZyA6KaB55m75b2VXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJpZ19iaWdfYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnEVSUk9S4oCd4oCdXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldFJlc3VsdChkKTtcXG4gICAgfVxcbn0pKCQuaW1wb3J0UGFyYW0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiQVBJXCIsXCJwYXRoXCI6XCJBUElcIixcInJ1bGVcIjpcImpzOlxcbmxldCBiYXNpY1VybCA9IFxcXCJodHRwczovL3d3dy5zb3VyY2Vwb3dlci50b3BcXFwiO1xcbmxldCB1c2VyID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwidXNlclxcXCIsIHt9KTtcXG5cXG5sZXQgdG9rZW4gPSB1c2VyLnRva2VuO1xcbi8qXFxuZnVuY3Rpb24gZ2V0VmVyaWZDb29raWUodXJsKXtcXG4gICAgbGV0IGNvb2tpZT1cXFwiXFxcIjtcXG59XFxuXFxuRCovXFxuLy9mdW5jdGlvblxcbmZ1bmN0aW9uIGdldFRva2VuKCkge1xcbiAgbGV0IGVtYWlsID0gZ2V0SXRlbShcXFwiZW1haWxcXFwiLCBcXFwiXFxcIik7XFxuICBsZXQgcGFzcyA9IGdldEl0ZW0oXFxcInBhc3NcXFwiLCBcXFwiXFxcIik7XFxuICBsZXQgcmVzdWx0ID0gcG9zdChcXFwiaHR0cHM6Ly93d3cuc291cmNlcG93ZXIudG9wL2FwaS92MS91c2VyL2xvZ2luXFxcIiwge1xcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgXFxcIngtcmVxdWVzdGVkLXdpdGhcXFwiOiBcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICBcXFwicmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5zb3VyY2Vwb3dlci50b3AvbG9naW5cXFwiXFxuICAgIH0sXFxuICAgIGJvZHk6IHtcXG4gICAgICBcXFwiZW1haWxcXFwiOiBlbWFpbCxcXG4gICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzXFxuICAgIH1cXG4gIH0pXFxuICB0cnkge1xcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KS5kYXRhO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1c2VyXFxcIiwgZGF0YSk7XFxuICB9IGNhdGNoIHsgfVxcbn1cXG5cXG5mdW5jdGlvbiByZWZyZXNoVG9rZW4oKSB7XFxuICBsZXQgdWVzciA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVzZXJcXFwiLCB7fSk7XFxuICBpZiAodXNlci5oYXNPd25Qcm9wZXJ0eShcXFwidG9rZW5cXFwiKSkge1xcbiAgICB0cnkge1xcbiAgICAgIGxldCBwYXlsb2FkID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUodXNlci50b2tlbi5zcGxpdChcXFwiLlxcXCIpWzFdKSk7XFxuICAgICAgbGV0IGV4cCA9IG5ldyBEYXRlKHBheWxvYWQuZXhwICogMTAwMCk7XFxuICAgICAgbGV0IG5vd3RpbWUgPSBuZXcgRGF0ZSgpO1xcbiAgICAgIGlmIChub3d0aW1lID4gZXhwKSB7XFxuICAgICAgICBsb2coXFxcIuWIt+aWsFRva2VuXFxcIik7XFxuICAgICAgICBnZXRUb2tlbigpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICBsb2codXNlci50b2tlbik7XFxuICAgICAgbG9nKGUubWVzc2FnZSlcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRTb3VyY2VMaXN0KGMsIHBhZ2UpIHtcXG4gIGxldCByZXMgPSByZXF1ZXN0KGJ1aWxkVXJsKGAke2Jhc2ljVXJsfS9hcGkvdjEvY29udGVudC9hbGxgLCBPYmplY3QuYXNzaWduKHtcXG4gICAgdHlwZTogXFxcInNpdGVcXFwiLFxcbiAgICAvL3NlbnNpdGl2ZTogXFxcIm5vc2Vuc2l0aXZlXFxcIixcXG4gICAgbmFtZTogXFxcIlxcXCIsXFxuICAgIHVzZXJfaWQ6IFxcXCJcXFwiLFxcbiAgICBwYWdlTnVtOiBwYWdlIHx8IDEsXFxuICAgIHBhZ2VTaXplOiAxNlxcbiAgfSwgYykpLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICBcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXCI6IFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFwiLFxcbiAgICB9XFxuICB9KTtcXG4gIHJldHVybiBKU09OLnBhcnNlKHJlcykuZGF0YS5saXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRTb3VyY2VDb250ZW50KGlkKSB7XFxuICBpZiAoIXRva2VuKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwibmVlZCBsb2dpblxcXCIpO1xcbiAgfVxcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L2RldGFpbC8ke2lkfWAsIHtcXG4gICAgaGVhZGVyczoge1xcbiAgICAgIFxcXCJ4LXJlcXVlc3RlZC13aXRoXFxcIjogXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXCIsXFxuICAgICAgYXV0aG9yaXphdGlvbjogXFxcIkJlYXJlciBcXFwiICsgdG9rZW5cXG4gICAgfVxcbiAgfSk7XFxuXFxuICByZXMgPSBKU09OLnBhcnNlKHJlcyk7XFxuICBpZiAocmVzLmNvZGUgPT0gLTEpIHtcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXCJuZWVkIGxvZ2luXFxcIik7XFxuICB9XFxuICByZXR1cm4gcmVzLmRhdGE7XFxufVxcblxcbmZ1bmN0aW9uIGdldFNoYXJpbmdMaXN0KCkge1xcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L3JhbmtgLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICBcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXCI6IFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFwiLFxcbiAgICB9XFxuICB9KTtcXG4gIHJldHVybiBKU09OLnBhcnNlKHJlcykuZGF0YS5saXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBdXRob3JMaXN0KCkge1xcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L2NyZWF0b3JgLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICBcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXCI6IFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFwiLFxcbiAgICB9XFxuICB9KTtcXG4gIHJldHVybiBKU09OLnBhcnNlKHJlcykuZGF0YS5saXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRJcCgpIHtcXG4gIHRyeSB7XFxuICAgIGxldCByZXMgPSByZXF1ZXN0KGAke2Jhc2ljVXJsfS9hcGkvdjEvc3lzdGVtL2luZm9gLCB7XFxuICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgXFxcIngtcmVxdWVzdGVkLXdpdGhcXFwiOiBcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICB9XFxuICAgIH0pO1xcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpLmRhdGEuaXA7XFxuICB9IGNhdGNoIChlKSB7XFxuICAgIHJldHVybiBcXFwiXFxcIjtcXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0U3ViKGlwKSB7XFxuICBpZiAoIXRva2VuKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwibmVlZCBsb2dpblxcXCIpO1xcbiAgfVxcbiAgbGV0IHJlcyA9IHBvc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9zdWJzY3JpYmUvYXV0aGAsIHtcXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgIGFsbG93X2lwczogaXBcXG4gICAgfSksXFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICBcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXCI6XFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXCIsXFxuICAgICAgYXV0aG9yaXphdGlvbjogXFxcIkJlYXJlciBcXFwiICsgdG9rZW5cXG4gICAgfVxcbiAgfSk7XFxuICByZXMgPSBKU09OLnBhcnNlKHJlcyk7XFxuICBpZiAocmVzLmNvZGUgPT0gLTEpIHtcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXCJuZWVkIGxvZ2luXFxcIik7XFxuICB9XFxuICByZXR1cm4gcmVzLmRhdGEuY29kZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0SGlzdG9yeShwYWdlKSB7XFxuICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGJhc2ljVXJsICsgYC9hcGkvdjEvY29udGVudC9jcmVhdGVkP3BhZ2U9JHtwYWdlfSZsaW1pdD0yMGAsIHtcXG4gICAgaGVhZGVyczoge1xcbiAgICAgIFxcXCJ4LXJlcXVlc3RlZC13aXRoXFxcIjpcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICBhdXRob3JpemF0aW9uOiBcXFwiQmVhcmVyIFxcXCIgKyB0b2tlblxcbiAgICB9XFxuICB9KSk7XFxuICBpZiAocmVzdWx0LmNvZGUgPT0gMCkge1xcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XFxuICB9XFxuICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRUYWIobmFtZSwgYXJyLCB0eXBlLCBjb250cmFzdCwgY29sb3JzLCBhZGRvYmopIHtcXG4gIGxldCBkZWZjb2xvcnMgPSB7XFxuICAgIGZjOiBcXFwiIzQ0OUY1MDtcXFwiLFxcbiAgICBiYzogXFxcIiNGRkUwRjBFMztcXFwiXFxuICB9XFxuICBjb2xvcnMgPSBPYmplY3QuYXNzaWduKGRlZmNvbG9ycywgY29sb3JzKTtcXG4gIGxldCBmY3MgPSBjb2xvcnMuZmMuc3BsaXQoXFxcIjtcXFwiKTtcXG4gIGxldCBiY3MgPSBjb2xvcnMuYmMuc3BsaXQoXFxcIjtcXFwiKTtcXG4gIGlmIChuYW1lKSB7XFxuICAgIGxldCBuYXYgPSB7XFxuICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9XFxuICAgIGlmICh0eXBlb2YgbmFtZSA9PSBcXFwib2JqZWN0XFxcIikge1xcbiAgICAgIG5hdiA9IE9iamVjdC5hc3NpZ24obmF2LCBuYW1lKTtcXG4gICAgfVxcbiAgICBkLnB1c2gobmF2KTtcXG4gIH1cXG4gIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XFxuICAgIGxldCBjb2xvciA9IGl0ZW1bMV0gPT09IGNvbnRyYXN0ID8gZmNzWzBdIDogZmNzWzFdO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGl0ZW1bMF0uZm9udGNvbG9yKGNvbG9yKSxcXG4gICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGtleSwgdHlwZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIodHlwZSwga2V5KTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgaXRlbVsxXSwgdHlwZSksXFxuICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtWzFdID09PSBjb250cmFzdCA/IGJjc1swXSA6IGJjc1sxXSxcXG4gICAgICB9XFxuICAgIH0pO1xcbiAgfVxcbiAgaWYgKGFkZG9iaikge1xcbiAgICBkLnB1c2goYWRkb2JqKVxcbiAgfVxcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUJvdW5kYXJ5KHByZWZpeCwgcmFuZG9tTGVuZ3RoKSB7XFxuICBjb25zdCBjaGFyYWN0ZXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcXG4gIGxldCBib3VuZGFyeSA9ICcnO1xcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5kb21MZW5ndGg7IGkrKykgeyAvLyDmoLnmja7mjIflrprplb/luqbnlJ/miJDpmo/mnLrpg6jliIZcXG4gICAgYm91bmRhcnkgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVycy5sZW5ndGgpKTtcXG4gIH1cXG4gIHJldHVybiBgJHtwcmVmaXh9JHtib3VuZGFyeX1gOyAvLyDov5Tlm57lrozmlbTnmoTovrnnlYzlrZfnrKbkuLJcXG59XFxuXFxuZnVuY3Rpb24gZm9ybWRhdGEodXJsLCBpbmhlYWQsIGJvZHksIGJvdW5vYmopIHtcXG4gIGxldCBmaWxlID0gZmFsc2U7XFxuICBsZXQgZGVmb2JqID0ge1xcbiAgICBwcmVmaXg6ICctLVdlYktpdEZvcm1Cb3VuZGFyeScsXFxuICAgIG51bTogMTYsXFxuICAgIGZpbGw6IFs0LCA0LCAyXVxcbiAgfVxcbiAgaWYgKGJvdW5vYmogPT0gdW5kZWZpbmVkKSB7XFxuICAgIGJvdW5vYmogPSBkZWZvYmo7XFxuICB9IGVsc2Uge1xcbiAgICBib3Vub2JqID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmb2JqLCBib3Vub2JqKTtcXG4gIH1cXG4gIC8vbG9nKGJvdW5vYmopXFxuXFxuICB2YXIgZmlsbCA9IGJvdW5vYmouZmlsbC5tYXAoY291bnQgPT4gJy0nLnJlcGVhdChjb3VudCkpO1xcbiAgLy9sb2coZmlsbClcXG4gIHZhciBib3VuZGFyeSA9IGdlbmVyYXRlQm91bmRhcnkoYm91bm9iai5wcmVmaXgsIGJvdW5vYmoubnVtKTtcXG4gIGxldCBkZWZoZWFkID0ge1xcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUEsXFxuICAgIH0sXFxuICAgIG1ldGhvZDogJ1BVVCcsXFxuICB9XFxuICBpZiAoaW5oZWFkLmhlYWRlcnMgJiYgaW5oZWFkLmhlYWRlcnMuaGFzT3duUHJvcGVydHkoXFxcImNvbnRlbnQtdHlwZVxcXCIpKSB7XFxuICAgIGluaGVhZC5oZWFkZXJzW1xcXCJjb250ZW50LXR5cGVcXFwiXSA9IGluaGVhZC5oZWFkZXJzW1xcXCJjb250ZW50LXR5cGVcXFwiXS5yZXBsYWNlKFxcXCIke2JvdW5kYXJ5fVxcXCIsIGJvdW5kYXJ5KTtcXG4gIH1cXG4gIHZhciBoZWFkID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaGVhZCwgaW5oZWFkKTtcXG4gIGlmIChib2R5ICYmIGJvZHkuaXNmaWxlKSB7XFxuICAgIGZpbGUgPSBib2R5LmlzZmlsZTtcXG4gICAgZGVsZXRlIGJvZHkuaXNmaWxlO1xcbiAgfVxcblxcbiAgaWYgKGJvZHkpIHtcXG4gICAgaWYgKGZpbGUpIHtcXG4gICAgICBoZWFkLmhlYWRlcnMuYm9keSA9IE9iamVjdC5rZXlzKGJvZHkpLm1hcChrZXkgPT4ge1xcbiAgICAgICAgcmV0dXJuIGAke2ZpbGxbMF19JHtib3VuZGFyeX1cXFxcclxcXFxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVxcXCIke2tleX1cXFwiOyBmaWxlbmFtZT1cXFwiJHtib2R5W2tleV1bXFxcIm5hbWVcXFwiXX1cXFwiXFxcXHJcXFxcbkNvbnRlbnQtVHlwZTogJHtib2R5W2tleV1bXFxcIm1pbWVcXFwiXX1cXFxcclxcXFxuXFxcXHJcXFxcbiR7Ym9keVtrZXldW1xcXCJ2YWx1ZVxcXCJdfWBcXG4gICAgICB9KS5qb2luKCdcXFxcclxcXFxuJykgKyBgXFxcXHJcXFxcbiR7ZmlsbFsxXX0ke2JvdW5kYXJ5fSR7ZmlsbFsyXX1cXFxcclxcXFxuYFxcbiAgICB9IGVsc2Uge1xcbiAgICAgIGhlYWQuaGVhZGVycy5ib2R5ID0gT2JqZWN0LmtleXMoYm9keSkubWFwKGtleSA9PiB7XFxuICAgICAgICByZXR1cm4gYCR7ZmlsbFswXX0ke2JvdW5kYXJ5fVxcXFxyXFxcXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XFxcIiR7a2V5fVxcXCJcXFxcclxcXFxuXFxcXHJcXFxcbiR7Ym9keVtrZXldfWBcXG4gICAgICB9KS5qb2luKCdcXFxcclxcXFxuJykgKyBgJHtmaWxsWzFdfSR7Ym91bmRhcnl9JHtmaWxsWzJdfVxcXFxyXFxcXG5gXFxuICAgIH1cXG4gICAgLy9sb2coaGVhZC5oZWFkZXJzLmJvZHkpXFxuICB9XFxuICByZXR1cm4gZmV0Y2godXJsLCBoZWFkKTtcXG59XFxuXFxuZnVuY3Rpb24gdXBGaWxlKGluZm8sIGNvbnRlbnQpIHtcXG4gIHZhciBib3VuZGFyeSA9IGdlbmVyYXRlQm91bmRhcnkoJy0tV2ViS2l0Rm9ybUJvdW5kYXJ5JywgMTYpO1xcbiAgbGV0IHJlc3VsdCA9IGZvcm1kYXRhKGJhc2ljVXJsICsgJy9hcGkvdjEvc3lzdGVtL3VwbG9hZCcsIHtcXG4gICAgaGVhZGVyczoge1xcbiAgICAgIFxcXCJ4LXJlcXVlc3RlZC13aXRoXFxcIjpcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS0tJHtib3VuZGFyeX1cXFwiLFxcbiAgICAgIFxcXCJyZWZlcmVyXFxcIjogYmFzaWNVcmwgKyBcXFwiL3N1Ym1pdFxcXCIsXFxuICAgICAgYXV0aG9yaXphdGlvbjogXFxcIkJlYXJlciBcXFwiICsgdG9rZW5cXG4gICAgfSxcXG4gICAgbWV0aG9kOiAnUE9TVCcsXFxuICB9LCB7XFxuICAgIGlzZmlsZTogdHJ1ZSxcXG4gICAgZmlsZToge1xcbiAgICAgIG5hbWU6IGluZm8uZmlsZU5hbWUsXFxuICAgICAgbWltZTogaW5mby5taW1lLFxcbiAgICAgIHZhbHVlOiBjb250ZW50XFxuICAgIH1cXG4gIH0sIHtcXG4gICAgcHJlZml4OiAnLS1XZWJLaXRGb3JtQm91bmRhcnknLFxcbiAgICBudW06IDE2LFxcbiAgICBmaWxsOiBbNCwgNCwgMl1cXG4gIH0pXFxuICB0cnkge1xcbiAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICB9IGNhdGNoIChlKSB7IH1cXG4gIHJldHVybiByZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHN1Ym1pdChvYmopIHtcXG4gIGxldCBpZCA9IFxcXCJcXFwiO1xcbiAgbGV0IG1ldGhvZCA9IFxcXCJQT1NUXFxcIjtcXG4gIGlmIChvYmouaGFzT3duUHJvcGVydHkoXFxcImlkXFxcIikpIHtcXG4gICAgaWQgPSBcXFwiL1xcXCIgKyBvYmouaWQ7XFxuICAgIGRlbGV0ZSBvYmouaWQ7XFxuICAgIG1ldGhvZCA9IFxcXCJQVVRcXFwiO1xcbiAgfVxcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50JHtpZH1gLCB7XFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9iaiksXFxuICAgIG1ldGhvZDogbWV0aG9kLFxcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgXFxcIngtcmVxdWVzdGVkLXdpdGhcXFwiOlxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFwiLFxcbiAgICAgIFxcXCJyZWZlcmVyXFxcIjogYmFzaWNVcmwgKyBcXFwiL3N1Ym1pdFxcXCIsXFxuICAgICAgYXV0aG9yaXphdGlvbjogXFxcIkJlYXJlciBcXFwiICsgdG9rZW5cXG4gICAgfVxcbiAgfSk7XFxuICB0cnkge1xcbiAgICByZXMgPSBKU09OLnBhcnNlKHJlcyk7XFxuICB9IGNhdGNoIChlKSB7IH1cXG4gIHJldHVybiByZXM7XFxufVxcblxcbmZ1bmN0aW9uIGRhdGVGb3JtYXQoZGF0ZSwgdCkge1xcbiAgbGV0IHRleHQgPSAneXl5eS1NTS1kZCBISDptbTpzcyc7XFxuICBpZiAodCkge1xcbiAgICB0ZXh0ID0gdDtcXG4gIH1cXG4gIHJldHVybiAkLmRhdGVGb3JtYXQoZGF0ZS5nZXRUaW1lKCksIHRleHQpO1xcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICBiYXNpY1VybCxcXG4gIHVzZXIsXFxuICB1cEZpbGUsXFxuICBzdWJtaXQsXFxuICBkYXRlRm9ybWF0LFxcbiAgc2V0VGFiLFxcbiAgaGlrZXJQb3A6ICgpID0+IHtcXG4gICAgcmV0dXJuICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgfSxcXG4gIGdldEJvdW5kYXJ5OiBnZW5lcmF0ZUJvdW5kYXJ5LFxcbiAgZm9ybWRhdGE6IGZvcm1kYXRhLFxcbiAgZ2V0SGlzdG9yeSxcXG4gIGdldFNvdXJjZUxpc3QsXFxuICBnZXRTb3VyY2VDb250ZW50LFxcbiAgZ2V0U2hhcmluZ0xpc3QsXFxuICBnZXRBdXRob3JMaXN0LFxcbiAgcmVmcmVzaFRva2VuLFxcbiAgZ2V0VG9rZW4sXFxuICBnZXRJcCxcXG4gIGdldFN1YixcXG4gIHRva2VuXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwic291cmNlTGlzdFwiLFwicGF0aFwiOlwic291cmNlTGlzdFwiLFwicnVsZVwiOlwianM6XFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXCJBUElcXFwiKTtcXG5cXG52YXIgZCA9IFtdO1xcbmxldCBjb24gPSB7fTtcXG50cnkge1xcbiAgY29uID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJjb25cXFwiLCBcXFwiXFxcIikpKSB8fCBcXFwie31cXFwiKTtcXG59IGNhdGNoIChlKSB7XFxuICBsb2coZS50b1N0cmluZygpKVxcbn1cXG4vKlxcbmlmIChNWV9VUkwuaW5jbHVkZXMoXFxcInNvdXJjZUxpc3RcXFwiKSAmJiBNWV9QQUdFID09IDEpIHtcXG4gIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInRlbXAuc291cmNlZmlsdGVyLnNlbnNpdGl2ZVxcXCIpO1xcbiAgfSkpO1xcbiAgbGV0IHRhYj1BUEkuc2V0VGFiO1xcbiAgbGV0IHNlbnNpdGl2ZSA9IGdldE15VmFyKFxcXCJ0ZW1wLnNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFwiLCBjb24uc2Vuc2l0aXZlP2Nvbi5zZW5zaXRpdmU6XFxcIlxcXCIpO1xcbiAgdGFiKFxcXCLov4fmu6Q6XFxcIiwgW1xcbiAgICBbXFxcIuWFqOmDqFxcXCIsIFxcXCJcXFwiXSxcXG4gICAgW1xcXCLkuI3mlY/mhJ9cXFwiLCBcXFwibm9zZW5zaXRpdmVcXFwiXSxcXG4gICAgW1xcXCLmlY/mhJ9cXFwiLCBcXFwic2Vuc2l0aXZlXFxcIl0sXFxuICBdLCBcXFwidGVtcC5zb3VyY2VmaWx0ZXIuc2Vuc2l0aXZlXFxcIiwgc2Vuc2l0aXZlKTtcXG4gIGNvbltcXFwic2Vuc2l0aXZlXFxcIl09Z2V0TXlWYXIoXFxcInRlbXAuc291cmNlZmlsdGVyLnNlbnNpdGl2ZVxcXCIsIHNlbnNpdGl2ZSk7XFxufVxcbiovXFxubGV0IGxpc3QgPSBBUEkuZ2V0U291cmNlTGlzdChPYmplY3QuYXNzaWduKHt9LCBjb24sIHtcXG4gIHBhZ2VOdW06IE1ZX1BBR0UsXFxufSkpO1xcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgbGV0IGNvbCA9ICFpIHx8ICgoaSArIDEpICUgMiA9PT0gMSkgPyBcXFwiY2FyZF9waWNfMl8yX2xlZnRcXFwiIDogXFxcImNhcmRfcGljXzJfMlxcXCI7XFxuICBsZXQgaXRlbSA9IGxpc3RbaV07XFxuICBkLnB1c2goe1xcbiAgICBkZXNjOiBcXFwiODBcXFwiLFxcbiAgICB0aXRsZTogXFxcIuKAmOKAmOKAmeKAmVxcXCIgKyBgJHtTdHJpbmcoaXRlbS5uYW1lKS5iaWcoKS5mb250Y29sb3IoXFxcImJsYWNrXFxcIil9XFxcXG4ke1N0cmluZyhpdGVtLnR5cGUpLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpfXwkeyhpdGVtLnNlbnNpdGl2ZSA/IFxcXCLmlY/mhJ9cXFwiIDogXFxcIuW4uOinhFxcXCIpLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpfXwke1N0cmluZyhpdGVtLnVwZGF0ZWRfYXQpLnNwbGl0KFxcXCJUXFxcIilbMF0uZm9udGNvbG9yKFxcXCJncmV5XFxcIil9XFxcXG48Yj4ke1N0cmluZyhpdGVtLnVzZXJuYW1lKS5mb250Y29sb3IoXFxcImJsYWNrXFxcIil9ICR7XFxcIuaPkOS+m1xcXCIuc21hbGwoKS5mb250Y29sb3IoXFxcImdyZXlcXFwiKX1gLnNtYWxsKCksXFxuICAgIGNvbF90eXBlOiBjb2wsXFxuICAgIHBpY191cmw6IFxcXCIjRkZGM0YzRjNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcGFnZUxvYWQ/cmVkaXJlY3Q9Y29udGVudFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgcGFnZVRpdGxlOiBpdGVtLm5hbWUsXFxuICAgICAgaXRlbVxcbiAgICB9XFxuICB9KTtcXG59XFxuZC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxufSlcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJjb250ZW50XCIsXCJwYXRoXCI6XCJjb250ZW50XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcblxcbnZhciBkID0gW107XFxuXFxubGV0IGNvbnRlbnQgPSBBUEkuZ2V0U291cmNlQ29udGVudChNWV9QQVJBTVMuaXRlbS5pZCk7XFxuXFxuaWYgKGNvbnRlbnQubmFtZSA9PSBcXFwiVG9rZW5FeHBpcmVkRXJyb3JcXFwiKSB7XFxuICAgIGxvZyhcXFwi55m75b2V6L+H5pyfXFxcIilcXG4gICAgQVBJLmdldFRva2VuKCk7XFxuICAgIGNvbnRlbnQgPSBBUEkuZ2V0U291cmNlQ29udGVudChNWV9QQVJBTVMuaXRlbS5pZCk7XFxufVxcblxcbmxldCB1cGRhdGUgPSBcXFwiXFxcIjtcXG5pZiAoY29udGVudC5jcmVhdGVkX2F0ICE9IGNvbnRlbnQudXBkYXRlZF9hdCkge1xcbiAgICB1cGRhdGUgPSBcXFwifFU6XFxcIiArIEFQSS5kYXRlRm9ybWF0KG5ldyBEYXRlKGNvbnRlbnQudXBkYXRlZF9hdCksIFxcXCJ5eXl5LU1NLWRkIEhIOm1tXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgdGl0bGU6IFxcXCLnroDku4vkv6Hmga9cXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9ib29rbWFyazJcXFwiLFxcbiAgICBkZXNjOiBcXFwiQzpcXFwiICsgQVBJLmRhdGVGb3JtYXQobmV3IERhdGUoY29udGVudC5jcmVhdGVkX2F0KSwgXFxcInl5eXktTU0tZGRcXFwiKSArIHVwZGF0ZSxcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiBjb250ZW50LmRlc2MgfHwgXFxcIuS4iuS8oOiAheWkquaHkuS6hu+8jOS7gOS5iOmDveayoeacieeVmeS4i+WTpn5cXFwiLFxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiZmxleF9idXR0b25cXFwiLFxcbiAgICB0aXRsZTogY29udGVudC50eXBlLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcGFnZUxvYWQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3BhZ2U9ZnlwYWdlJnJlZGlyZWN0PXNvdXJjZUxpc3QmY29uPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgIHR5cGU6IGNvbnRlbnQudHlwZVxcbiAgICB9KSkpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5p+l6K+i57G75Z6LOlxcXCIgKyBjb250ZW50LnR5cGVcXG4gICAgfVxcbn0pO1xcbmxldCBleHQgPSBjb250ZW50LmV4dDtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgdGl0bGU6IFxcXCLmianlsZXnsbvlnos6XFxcIitleHQudHlwZSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlPWZ5cGFnZSZyZWRpcmVjdD1zb3VyY2VMaXN0JmNvbj1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICBleHRUeXBlOiBleHQudHlwZVxcbiAgICB9KSkpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5p+l6K+iOlxcXCIgKyAoZXh0LnR5cGUpLFxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJmbGV4X2J1dHRvblxcXCIsXFxuICAgIHRpdGxlOiBjb250ZW50LnVzZXJuYW1lICsgXFxcIiDmj5DkvptcXFwiLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVzZXIpID0+IHtcXG4gICAgICAgIGxldCBhdXRob3JMaXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlciMuYXV0aG9yTGlzdFxcXCIsIFtdKTtcXG4gICAgICAgIGlmICghYXV0aG9yTGlzdC5sZW5ndGgpIHtcXG4gICAgICAgICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbiAgICAgICAgICAgIGF1dGhvckxpc3QgPSBBUEkuZ2V0QXV0aG9yTGlzdCgpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIjLmF1dGhvckxpc3RcXFwiLCBhdXRob3JMaXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGF1dGhvckxpc3QgPSBhdXRob3JMaXN0LmZpbHRlcih2ID0+IFN0cmluZyh2LnVzZXJuYW1lKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHVzZXIpKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlPWZ5cGFnZSZyZWRpcmVjdD1zb3VyY2VMaXN0JmNvbj1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgdXNlcl9pZDogYXV0aG9yTGlzdFswXS5pZFxcbiAgICAgICAgfSkpKVxcbiAgICB9LCBjb250ZW50LnVzZXJuYW1lKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuafpeivouWIm+S9nOiAhTpcXFwiICsgY29udGVudC51c2VybmFtZSxcXG4gICAgfVxcbn0pO1xcblxcbmlmIChjb250ZW50LnR5cGUgPT0gXFxcImxpdmVcXFwiKSB7XFxuICAgIGlmIChjb250ZW50LmRhdGEuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6ZO+5o6lXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChkYXRhKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIGRhdGE7XFxuICAgICAgICAgICAgfSwgY29udGVudC5kYXRhKVxcbiAgICAgICAgfSlcXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogY29udGVudC5kYXRhLFxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXFxuICAgICAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgICAgIGhlaWdodDogMlxcbiAgICAgICAgfVxcbiAgICB9KVxcbiAgICBzZXRSZXN1bHQoZClcXG59XFxubGV0IGRycHlFbmNyeXB0ID0gJC5yZXF1aXJlKFxcXCJkcnB5RW5jcnlwdFxcXCIpO1xcbmxldCBhcGkgPSBcXFwiZHJweTJcXFwiO1xcbmxldCBzYXBpID0gXFxcIi4vZHJweV9saWJzL2RycHkyLm1pbi5qc1xcXCI7XFxuXFxubGV0IGRhdGEgPSBjb250ZW50LmNvbnRlbnQgfHwgY29udGVudC5kYXRhO1xcblxcbmxldCBjdXJyZW50X21hdGNoID0gZHJweUVuY3J5cHQuZ2V0UmVnZXgoKTtcXG5cXG50cnkge1xcbiAgICAvL2xvZyghY3VycmVudF9tYXRjaC50ZXN0KGRhdGEpKVxcbiAgICBpZiAoIWN1cnJlbnRfbWF0Y2gudGVzdChkYXRhKSkge1xcbiAgICAgICAgbGV0IHRlbXBkYXRhID0gYmFzZTY0RGVjb2RlKGRhdGEpO1xcbiAgICAgICAgaWYgKGN1cnJlbnRfbWF0Y2gudGVzdCh0ZW1wZGF0YSkpIHtcXG4gICAgICAgICAgICBkYXRhID0gdGVtcGRhdGE7XFxuICAgICAgICB9XFxuICAgIH1cXG59IGNhdGNoIChlKSB7XFxuICAgIGxvZyhlLm1lc3NhZ2UpO1xcbn1cXG5cXG5pZiAoZXh0LnR5cGUgPT0gXFxcIjFcXFwiKSB7XFxuICAgIHNhcGkgPSBcXFwiY3NwX1hCUFFcXFwiO1xcbiAgICBhcGkgPSBcXFwiWEJQUVxcXCI7XFxufVxcblxcbmlmIChzYXBpID09IFxcXCJjc3BfWEJQUVxcXCIpIHtcXG4gICAgaWYgKHR5cGVvZiBkYXRhID09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICBkYXRhID0gZHJweUVuY3J5cHQudHJ5RGVjcnlwdChkYXRhKTtcXG4gICAgICAgIGlmIChkYXRhLmVuZHNXaXRoKFxcXCIsXFxcIikpIHtcXG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCAtMSk7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoZGF0YSkpO1xcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFxcXCJleHRcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5leHQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBkYXRhID0ge1xcbiAgICAgICAgICAgICAgICBlcnJvcjogZS5tZXNzYWdlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblxcbiQuZXh0ZW5kKHtcXG4gICAgZGF0YTogZGF0YVxcbn0pXFxuXFxubGV0IGpzbmFtZSA9IGNvbnRlbnQuZGF0YS5zcGxpdChcXFwiL1xcXCIpWzFdO1xcbmpzbmFtZSA9IGpzbmFtZS5yZXBsYWNlKC9cXFxcZHsxM30tLywgXFxcIlxcXCIpO1xcblxcbmxldCBuYW1lID0ganNuYW1lID8ganNuYW1lIDogXFxcIuaXoOWQjVxcXCI7XFxuaWYgKG5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSB7XFxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXFxcIi5qc1xcXCIsIFxcXCJcXFwiKTtcXG59IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoXFxcIi5qc29uXFxcIikpIHtcXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZShcXFwiLmpzb25cXFwiLCBcXFwiXFxcIik7XFxufVxcblxcbmxldCBqc3YgPSBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvc291cmNlX3ZpZXcuanNcXFwiO1xcbmlmIChleHQudHlwZSA9PT0gMykge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZjliLDmnKzlnLBcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoY29udGVudCwganNuYW1lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRJdGVtKFxcXCJEc1NhdmVQYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmICghcGF0aCkgcmV0dXJuIFxcXCJ0b2FzdDovL+i/mOayoeacieiuvue9ruS/neWtmOi3r+W+hFxcXCI7XFxuICAgICAgICAgICAgbGV0IHMgPSAoY29udGVudCwganNuYW1lKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0SXRlbShcXFwiRHNTYXZlUGF0aFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBcXFwiL1xcXCIgKyBqc25hbWUsIGNvbnRlbnQpO1xcbiAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KHBhdGggKyBcXFwiL1xcXCIgKyBqc25hbWUpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChmaWxlRXhpc3QocGF0aCArIFxcXCIvXFxcIiArIGpzbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuacrOWcsOW3sue7j+WtmOWcqOivpeaWh+S7tuaYr+WQpuimhueblu+8n1xcXCIpLmNvbmZpcm0ocywgY29udGVudCwganNuYW1lKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHMoY29udGVudCwganNuYW1lKTtcXG4gICAgICAgIH0sIGNvbnRlbnQuY29udGVudCwganNuYW1lKVxcbiAgICB9KTtcXG59IGVsc2UgaWYgKGNvbnRlbnQudHlwZSA9PSBcXFwic2l0ZVxcXCIpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWlRHJweUhpa2VyXFxcIixcXG4gICAgICAgIC8vdXJsOlxcXCJ0b2FzdDovL+i/mOayoeWBmlxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNvbnRlbnQsIGpzbmFtZSwgc2FwaSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBkYXRhID0gJC5kYXRhO1xcbiAgICAgICAgICAgIGxldCBhcGkgPSBcXFwiZHJweTJcXFwiO1xcbiAgICAgICAgICAgIGlmIChzYXBpLmluY2x1ZGVzKFxcXCJYQlBRXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgYXBpID0gXFxcIlhCUFFcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcXFwiZXJyb3JcXFwiKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGRhdGEuZXJyb3JcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaW1wb3J0P3J1bGU9XFxcIiArIFxcXCJEcnB5SGlrZXJcXFwiKShjb250ZW50Lm5hbWUgKyBcXFwiJGJhc2U2NDpcXFwiICsgYmFzZTY0RW5jb2RlKGRhdGEpICsgXFxcIiRcXFwiICsganNuYW1lICsgXFxcIiNcXFwiICsgYXBpLCB0cnVlKVxcbiAgICAgICAgfSwgY29udGVudCwganNuYW1lLCBzYXBpKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiZmxleF9idXR0b25cXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCJEcnB5SGlrZXLmn6XnnItcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChjb250ZW50LCBqc3YpID0+IHtcXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICQuZGF0YTtcXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcXFwiZXJyb3JcXFwiKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGRhdGEuZXJyb3JcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd3JpdGVGaWxlKGpzdiwgZGF0YSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZWRpdFNvdXJjZXMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3J1bGU9RHJweUhpa2VyXFxcIlxcbiAgICAgICAgfSwgY29udGVudCwganN2KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgXFxcImNvbmZpZ1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogXFxcIlxcXCIsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBcXFwic291cmNlXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiYXBpXFxcIjogc2FwaSxcXG4gICAgICAgICAgICAgICAgXFxcImV4dFxcXCI6IGdldFBhdGgoanN2KSxcXG4gICAgICAgICAgICAgICAgXFxcImZpbHRlcmFibGVcXFwiOiAxLFxcbiAgICAgICAgICAgICAgICBcXFwia2V5XFxcIjogYXBpICsgXFxcIl9cXFwiICsgbmFtZSxcXG4gICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgICAgICBcXFwib3JkZXJfbnVtXFxcIjogMCxcXG4gICAgICAgICAgICAgICAgXFxcInF1aWNrU2VhcmNoXFxcIjogMSxcXG4gICAgICAgICAgICAgICAgXFxcInNlYXJjaGFibGVcXFwiOiAxLFxcbiAgICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IDNcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgdGl0bGU6IFxcXCLmlbDmja7lhoXlrrlcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9ib29rbWFyazJcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Li76KaB5Y+C5pWwXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbnRlbnQuY29udGVudCB8fCBjb250ZW50LmRhdGEsXFxuICAgICAgICB0eXBlOiAndGV4dGFyZWEnLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgaGVpZ2h0OiAzXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaJqeWxleWPguaVsFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb250ZW50LmV4dCxcXG4gICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBoZWlnaHQ6IDJcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImxvZ2luXCIsXCJwYXRoXCI6XCJsb2dpblwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumCrueusVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJlbWFpbFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRJdGVtKFxcXCJlbWFpbFxcXCIsIFxcXCJcXFwiKVxcbiAgICB9XFxufSlcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWvhueggVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicGFzc1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRJdGVtKFxcXCJwYXNzXFxcIiwgXFxcIlxcXCIpICAgIH1cXG59KVxcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi55m75b2VXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCB7XFxuICAgICAgICAgICAgZ2V0VG9rZW5cXG4gICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbiAgICAgICAgZ2V0VG9rZW4oKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pXFxufSlcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJzaGFyaW5nTGlzdFwiLFwicGF0aFwiOlwic2hhcmluZ0xpc3RcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEFQSSA9ICQucmVxdWlyZShcXFwiQVBJXFxcIik7XFxuXFxudmFyIGQgPSBbXTtcXG5cXG5sZXQgbGlzdCA9IEFQSS5nZXRTaGFyaW5nTGlzdCgpO1xcbmxldCBnZXRUaXRsZSA9IChpLCBuYW1lKSA9PiB7XFxuICAgIGxldCBjb2xvcjtcXG4gICAgc3dpdGNoIChpKSB7XFxuICAgICAgICBjYXNlIDA6XFxuICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmMzMwMFxcXCI7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIDE6XFxuICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmNjYwMFxcXCI7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIDI6XFxuICAgICAgICAgICAgY29sb3IgPSBcXFwiI2ZmOTkwMFxcXCJcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgY29sb3IgPSBcXFwiYmxhY2tcXFwiO1xcbiAgICB9XFxuICAgIHJldHVybiBTdHJpbmcoaSArIDEpLmZvbnRjb2xvcihjb2xvcikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIG5hbWU7XFxufVxcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgdGl0bGU6IGdldFRpdGxlKGksIGxpc3RbaV0udXNlcm5hbWUpLFxcbiAgICAgICAgZGVzYzogbGlzdFtpXS5jb3VudCxcXG4gICAgICAgIHVybDpcXFwibWFpbHRvOi8vXFxcIitsaXN0W2ldLmVtYWlsLFxcbiAgICAgICAgcGljX3VybDpcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbjRcXFwiLFxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZmlsdGVyXCIsXCJwYXRoXCI6XCJmaWx0ZXJcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBsaXN0TXlWYXJLZXlzKCkuZm9yRWFjaCh2ID0+IHYuaW5jbHVkZXMoXFxcInNvdXJjZWZpbHRlci5cXFwiKSAmJiBjbGVhck15VmFyKHYpKTtcXG59KTtcXG5kLnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICB0aXRsZTogXFxcIuWQjeensFxcXCIsXFxuICBleHRyYToge1xcbiAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdzb3VyY2VmaWx0ZXIua2V5d29yZCcsaW5wdXQpXFxcIlxcbiAgfVxcbn0pO1xcbmxldCBhdXRob3JMaXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlciMuYXV0aG9yTGlzdFxcXCIsIFtdKTtcXG5pZiAoIWF1dGhvckxpc3QubGVuZ3RoKSB7XFxuICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbiAgYXV0aG9yTGlzdCA9IEFQSS5nZXRBdXRob3JMaXN0KCk7XFxuICBzdG9yYWdlMC5wdXRNeVZhcihcXFwic291cmNlZmlsdGVyIy5hdXRob3JMaXN0XFxcIiwgYXV0aG9yTGlzdCk7XFxufVxcbmQucHVzaCh7XFxuICB0aXRsZTogXFxcIuWIm+S9nOiAhVxcXCIsXFxuICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgdGl0bGU6IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcIiwgXFxcIlxcXCIpLFxcbiAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgdXBkYXRlSXRlbShcXFwic291cmNlZmlsdGVyLmF1dGhvclxcXCIsIHtcXG4gICAgICB0aXRsZTogXFxcIlxcXCJcXG4gICAgfSk7XFxuICAgIHB1dE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBwdXRNeVZhcihcXFwic291cmNlZmlsdGVyLmF1dGhvcklkXFxcIiwgXFxcIlxcXCIpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6ZmkXFxcIjtcXG4gIH0pLFxcbiAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gIGV4dHJhOiB7XFxuICAgIGlkOiBcXFwic291cmNlZmlsdGVyLmF1dGhvclxcXCJcXG4gIH1cXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgbGV0IGF1dGhvckxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwic291cmNlZmlsdGVyIy5hdXRob3JMaXN0XFxcIiwgW10pO1xcbiAgICAvL2xvZyhhdXRob3JMaXN0KVxcbiAgICBsZXQgbmFtZXMgPSBhdXRob3JMaXN0Lm1hcCh4ID0+IHgudXNlcm5hbWUpO1xcbiAgICBsZXQgc3BlbiA9IDI7XFxuXFxuICAgIGxldCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiQVBJXFxcIikuaGlrZXJQb3AoKTtcXG4gICAgbGV0IHBvcCA9IGhpa2VyUG9wLnNlbGVjdEJvdHRvbVJlcyh7XFxuICAgICAgb3B0aW9uczogbmFtZXMsXFxuICAgICAgY29sdW1uczogc3BlbixcXG4gICAgICB0aXRsZTogXFxcIuaQnOe0ouWIm+S9nOiAhTpcXFwiICsgZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgbm9BdXRvRGlzbWlzczogdHJ1ZSxcXG4gICAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgICBoaW50OiBcXFwi562b6YCJ6YCJ6aG5XFxcIixcXG4gICAgICAgIG9uQ2hhbmdlKHMsIG1hbmFnZSkge1xcbiAgICAgICAgICBsZXQgZmxpc3QgPSBuYW1lcy5maWx0ZXIoeCA9PiB4LmluZGV4T2YocykgPj0gMCk7XFxuICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgfSk7XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJidG51cmxfaGlzdG9yeVxcXCIsIHMpO1xcbiAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICB9LFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiYnRudXJsX2hpc3RvcnlcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgICAgfSksXFxuICAgICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuICAgICAgICBsZXQgb2kgPSBhdXRob3JMaXN0LmZpbmRJbmRleCh4ID0+IHgudXNlcm5hbWUgPT0gcyk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcIiwge1xcbiAgICAgICAgICB0aXRsZTogc1xcbiAgICAgICAgfSk7XFxuICAgICAgICBwdXRNeVZhcihcXFwic291cmNlZmlsdGVyLmF1dGhvclxcXCIsIHMpO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInNvdXJjZWZpbHRlci5hdXRob3JJZFxcXCIsIGF1dGhvckxpc3Rbb2ldLmlkKTtcXG4gICAgICAgIC8vcG9wLmRpc21pc3MoKTtcXG4gICAgICAgIHJldHVybiBwb3AuZGlzbWlzc1dpdGgoKCkgPT4ge1xcbiAgICAgICAgICBoaWtlclBvcC5ydW5Pbk5ld1RocmVhZCgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGNvbiA9IHsgdHlwZTogZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlci50eXBlXFxcIiwgXFxcIlxcXCIpLCBzZW5zaXRpdmU6IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIuc2Vuc2l0aXZlXFxcIiwgXFxcIlxcXCIpLCBrZXl3b3JkOiBnZXRNeVZhcihcXFwic291cmNlZmlsdGVyLmtleXdvcmRcXFwiLCBcXFwiXFxcIiksIGNyZWF0b3I6IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9ySWRcXFwiLCBcXFwiXFxcIikgfTtcXG4gICAgICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlPWZ5cGFnZSZyZWRpcmVjdD1zb3VyY2VMaXN0JmNvbj1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShjb24pKSk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuICAgICAgfSxcXG4gICAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgICBoaWtlclBvcC5zZWxlY3RDZW50ZXIoe1xcbiAgICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLlgJLluo9cXFwiLCBcXFwi5ruR5Yqo5Yiw5pyA5ZCOXFxcIiwgXFxcIua7keWKqOWIsOmhtumDqFxcXCJdLFxcbiAgICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICAgIGNsaWNrKHMsIGkpIHtcXG4gICAgICAgICAgICBpZiAocyA9PSBcXFwi5pS55Y+Y5qC35byPXFxcIikge1xcbiAgICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMSA/IDIgOiAxO1xcbiAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzID09IFxcXCLlgJLluo9cXFwiKSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzID09IFxcXCLmu5HliqjliLDmnIDlkI5cXFwiKSB7XFxuICAgICAgICAgICAgICBtYW5hZ2Uuc2Nyb2xsVG9Qb3NpdGlvbihtYW5hZ2UubGlzdC5sZW5ndGggLSAxLCB0cnVlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHMgPT0gXFxcIua7keWKqOWIsOmhtumDqFxcXCIpIHtcXG4gICAgICAgICAgICAgIG1hbmFnZS5zY3JvbGxUb1Bvc2l0aW9uKDAsIHRydWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSxcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgfSk7XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICB9KSxcXG4gIC8qdXJsOiAkKFxcXCJcXFwiLCBcXFwi5pCc57Si5Yib5L2c6ICFXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICBsZXQgYXV0aG9yTGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIjLmF1dGhvckxpc3RcXFwiLCBbXSk7XFxuXFxuICAgIGlmIChpbnB1dCkge1xcbiAgICAgIGlucHV0ID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcXG4gICAgICBhdXRob3JMaXN0ID0gYXV0aG9yTGlzdC5maWx0ZXIodiA9PiBTdHJpbmcodi51c2VybmFtZSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpbnB1dCkpO1xcbiAgICB9XFxuICAgIGxldCBzaG93TGlzdCA9IGF1dGhvckxpc3QubWFwKHYgPT4gdi51c2VybmFtZSk7XFxuICAgIHJldHVybiAkKHNob3dMaXN0KS5zZWxlY3QoKGF1dGhvckxpc3QpID0+IHtcXG4gICAgICB1cGRhdGVJdGVtKFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IGlucHV0XFxuICAgICAgfSk7XFxuICAgICAgcHV0TXlWYXIoXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFwiLCBpbnB1dCk7XFxuICAgICAgcHV0TXlWYXIoXFxcInNvdXJjZWZpbHRlci5hdXRob3JJZFxcXCIsIGF1dGhvckxpc3RbTVlfSU5ERVhdLmlkKTtcXG4gICAgfSwgYXV0aG9yTGlzdCk7XFxuICB9KSwqL1xcbiAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcblxcbmQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbn0pO1xcblxcbmxldCB7IHNldFRhYiB9ID0gJC5yZXF1aXJlKFxcXCJBUElcXFwiKTtcXG5cXG5sZXQgdHlwZSA9IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIudHlwZVxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2Vuc2l0aXZlID0gZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFwiLCBcXFwiXFxcIik7XFxuc2V0VGFiKFxcXCLnsbvlnotcXFwiLCBbXFxuICBbXFxcIuWFqOmDqFxcXCIsIFxcXCJcXFwiXSxcXG4gIFtcXFwi5b2x6KeGXFxcIiwgXFxcInNpdGVcXFwiXSxcXG4gIFtcXFwi55S16KeGXFxcIiwgXFxcImxpdmVcXFwiXSxcXG4gIFtcXFwi6Kej5p6QXFxcIiwgXFxcInBhcnNlXFxcIl1cXG5dLCBcXFwic291cmNlZmlsdGVyLnR5cGVcXFwiLCB0eXBlKTtcXG5zZXRUYWIoXFxcIuaJqeWxleexu+Wei1xcXCIsIFtcXG4gIFtcXFwiMFxcXCIsIFxcXCIwXFxcIl0sXFxuICBbXFxcIjFcXFwiLCBcXFwiMVxcXCJdLFxcbiAgW1xcXCIyXFxcIiwgXFxcIjJcXFwiXSxcXG4gIFtcXFwiM1xcXCIsIFxcXCIzXFxcIl0sXFxuXSwgXFxcInNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFwiLCBzZW5zaXRpdmUpO1xcbmQucHVzaCh7XFxuICB0aXRsZTogXFxcIuafpeivolxcXCIsXFxuICB1cmw6ICQoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgIGxldCBjb24gPSB7XFxuICAgICAgdHlwZTogZ2V0TXlWYXIoXFxcInNvdXJjZWZpbHRlci50eXBlXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgIGV4dFR5cGU6IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIuc2Vuc2l0aXZlXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgIG5hbWU6IGdldE15VmFyKFxcXCJzb3VyY2VmaWx0ZXIua2V5d29yZFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICB1c2VyX2lkOiBnZXRNeVZhcihcXFwic291cmNlZmlsdGVyLmF1dGhvcklkXFxcIiwgXFxcIlxcXCIpLFxcbiAgICB9O1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9wYWdlTG9hZCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cGFnZT1meXBhZ2UmcmVkaXJlY3Q9c291cmNlTGlzdCZjb249XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoY29uKSkpO1xcbiAgfSksXFxuICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwic3ViXCIsXCJwYXRoXCI6XCJzdWJcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXCJBUElcXFwiKTtcXG5pZiAoIUFQSS50b2tlbikge1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIm5lZWQgbG9naW5cXFwiKTtcXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorqLpmIVcXFwiLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl5o6I5p2D5Zyw5Z2A6YCX5Y+35YiG6ZqUXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICByZXR1cm4gJChbXFxcIuWFqOmDqFxcXCIsIFxcXCLmlY/mhJ9cXFwiLCBcXFwi5bi46KeEXFxcIl0pLnNlbGVjdCgoaXBzKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXCJBUElcXFwiKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IEFQSS5nZXRTdWIoaXBzKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVybD1cXFwiaHR0cHM6Ly93d3cuc291cmNlcG93ZXIudG9wL2FwaS92MS9zdWJzY3JpYmUvXFxcIitjb2RlK1xcXCIvc3ViXFxcIitbXFxcIlxcXCIsXFxcIj90eXBlPXNlbnNpdGl2ZVxcXCIsXFxcIj90eXBlPW5vc2Vuc2l0aXZlXFxcIl1bTVlfSU5ERVhdO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJCh1cmwrXFxcIlxcXFxuY29kZTpcXFwiK2NvZGUpLmNvbmZpcm0oKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIit1cmw7XFxuICAgICAgICAgICAgICAgIH0sIHVybCk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIitlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaW5wdXQpO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogQVBJLmdldElwKClcXG4gICAgfVxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcInN1Ym1pdFwiLFwicGF0aFwiOlwic3VibWl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnZhciBwYWdlID0gTVlfUEFHRTtcXG5jb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbmxldCB0YWIgPSBBUEkuc2V0VGFiO1xcblxcbmxldCBjb2xvcnMgPSB7XFxuICBmYzogXFxcIiNGRkZGRkY7IzAwMDAwMFxcXCIsXFxuICBiYzogXFxcIiNGRjAwNTJEOTsjRkZFOEU4RThcXFwiXFxufVxcblxcblxcbmxldCB0aSA9IGdldE15VmFyKFxcXCJ0aXRsZWlcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCB0aXRsZXMgPSBbXFxcIuaKleeov1xcXCIsIFxcXCLljoblj7JcXFwiXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuaKleeov1xcXCIpO1xcbmlmIChwYWdlID09IDEpIHtcXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgdGl0bGU6IFxcXCLpobvnn6VcXFwiLFxcbiAgICBpbWc6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2luZm9fZmlsbFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgbGV0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJBUElcXFwiKS5oaWtlclBvcCgpO1xcbiAgICAgIGxldCBwb3AgPSBoaWtlclBvcC5pbmZvQm90dG9tKHtcXG4gICAgICAgIGNvbnRlbnQ6IFxcXCLor6bnu4ZcXFwiLFxcbiAgICAgICAgb3B0aW9uczogW1xcbiAgICAgICAgICBcXFwiMS7mhJ/osKLmgqjnmoTmlK/mjIEsIOaPkOS6pOWJjeehruS/neaCqOaYr+eZu+W9leeKtuaAgVxcXFxuMi7kuIrkvKDlkI7ljbPliJvkvZzogIXmjojmnYPlubPlj7Dmi6XmnInlrqPkvKDliIblj5HmnYPliKlcXFxcbjMu5pWw5o2u5YaF5a656ZyA5a6h5qC46YCa6L+H5ZCO5bGV56S6XFxcXG40Luivt+WLv+mikee5geinpuWPkeaWh+S7tuS4iuS8oCwg5Lya5ouJ6buRXFxcXG41LjEwc+WGheWkmuasoeaPkOS6pOS7heesrOS4gOasoeaPkOS6pOaIkOWKn1xcXCJcXG4gICAgICAgIF1cXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcIlxcXCJcXG4gICAgfVxcbiAgfSk7XFxuICB0aXRsZXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICh0aSA9PSBpID8gJzxiPicgKyBpdGVtLmZvbnRjb2xvcihcXFwiIzQ1ODJFNlxcXCIpICsgJzwvYj4nIDogaXRlbSksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXQsIGkpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJ0aXRsZWlcXFwiLCBpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgaXRlbSwgaSksXFxuICAgICAgZXh0cmE6IHtcXG5cXG4gICAgICB9XFxuICAgIH0pXFxuICB9KVxcbn1cXG5cXG5pZiAodGkgPT0gXFxcIjBcXFwiICYmIHBhZ2UgPT0gMSkge1xcbiAgbGV0IG1vZGUgPSBnZXRNeVZhcihcXFwibmF2YnRuXFxcIiwgXFxcIuaWsOWinlxcXCIpO1xcbiAgbGV0IG5hdmJ0biA9IFtcXFwi5paw5aKeXFxcIiwgXFxcIue8lui+kVxcXCJdO1xcbiAgbmF2YnRuLmZvckVhY2goaXRlbSA9PiB7XFxuICAgIGxldCBjb2xvciA9IG1vZGUgPT0gaXRlbSA/IFxcXCIjRkZGRkZGXFxcIiA6IFxcXCIjMDAwMDAwXFxcIlxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGl0ZW0uZm9udGNvbG9yKGNvbG9yKSxcXG4gICAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGl0KSA9PiB7XFxuICAgICAgICBpZiAoaXQgPT0gXFxcIue8lui+kVxcXCIpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aXoOazleaJi+WKqOmAieaLqee8lui+kSzpnIDopoHlnKjljoblj7Lngrnlh7vnm7jlupTpobnnm65cXFwiXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaXQgPT0gXFxcIuaWsOWinlxcXCIpIHtcXG4gICAgICAgICAgbGlzdE15VmFyS2V5cygpLmZpbHRlcihlID0+IGUuaW5jbHVkZXMoXFxcInN1Ym1pdC5cXFwiKSkuZm9yRWFjaChmID0+IHtcXG4gICAgICAgICAgICBjbGVhck15VmFyKGYpO1xcbiAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICAgICAgcHV0TXlWYXIoXFxcIm5hdmJ0blxcXCIsIGl0KTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgaXRlbSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbW9kZSA9PSBpdGVtID8gXFxcIiNGRjAwNTJEOVxcXCIgOiBcXFwiI0ZGRThFOEU4XFxcIlxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0pXFxuXFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIirlkI3np7BcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG5cXG4gICAgfSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJzdWJtaXRfbmFtZVxcXCIsXFxuICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwic3VibWl0Lm5hbWVcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInN1Ym1pdC5uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICB9XFxuICB9KVxcblxcbiAgbGV0IHR5cGUgPSBnZXRNeVZhcihcXFwic3VibWl0LnR5cGVcXFwiLCBcXFwic2l0ZVxcXCIpO1xcbiAgbGV0IHNlbnNpdGl2ZSA9IGdldE15VmFyKFxcXCJzdWJtaXQuc2Vuc2l0aXZlXFxcIiwgXFxcImZhbHNlXFxcIik7XFxuXFxuICB0YWIoXFxcIuexu+Wei1xcXCIsIFtcXG4gICAgW1xcXCLlvbHop4ZcXFwiLCBcXFwic2l0ZVxcXCJdLFxcbiAgICBbXFxcIueUteinhlxcXCIsIFxcXCJsaXZlXFxcIl0sXFxuICAgIFtcXFwi6Kej5p6QXFxcIiwgXFxcInBhcnNlXFxcIl1cXG4gIF0sIFxcXCJzdWJtaXQudHlwZVxcXCIsIHR5cGUsIGNvbG9ycyk7XFxuXFxuICB0YWIoeyB0aXRsZTogXFxcIuaVj+aEn1xcXCIsIHVybDogXFxcInRvYXN0Oi8v5ZOO5ZGm55a8562J5Z2H5pWw5o2u5pWP5oSf6LWE5rqQXFxcIiB9LCBbXFxuICAgIFtcXFwi5ZCmXFxcIiwgXFxcImZhbHNlXFxcIl0sXFxuICAgIFtcXFwi5pivXFxcIiwgXFxcInRydWVcXFwiXSxcXG4gIF0sIFxcXCJzdWJtaXQuc2Vuc2l0aXZlXFxcIiwgc2Vuc2l0aXZlLCBjb2xvcnMpO1xcblxcbiAgJC5leHRlbmQoe1xcbiAgICBmc3VybDogXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTcwMTNcXFwiLFxcbiAgICBmcygpIHtcXG4gICAgICBsZXQgZnMgPSAkLnJlcXVpcmUoJC5mc3VybCk7XFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZnMsIHtcXG4gICAgICAgIGdldEluZm86IHtcXG4gICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChwYXRoKSB7XFxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnZmlsZTovLycsICcnKTtcXG4gICAgICAgICAgICBsZXQgYyA9IGZzLnN0YXQocGF0aCkudG9Kc29uKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgIGZ1bGxwYXRoOiBwYXRoLFxcbiAgICAgICAgICAgICAgcGF0aDogZnMuZ2V0UGFyZW50UGF0aChwYXRoKSxcXG4gICAgICAgICAgICAgIGZpbGVOYW1lOiBjLm5hbWUsXFxuICAgICAgICAgICAgICBleHRlbnNpb246IGMuZXR5cGUsXFxuICAgICAgICAgICAgICBuYW1lOiBjLndvZW5hbWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0sXFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gZnM7XFxuICAgIH0sXFxuICAgIGdldE1JTUUoZmlsZVBhdGgpIHtcXG4gICAgICBjb25zdCBQYXRocyA9IGphdmEubmlvLmZpbGUuUGF0aHM7XFxuICAgICAgY29uc3QgRmlsZXMgPSBqYXZhLm5pby5maWxlLkZpbGVzO1xcbiAgICAgIGxldCBwYXRoID0gUGF0aHMuZ2V0KGZpbGVQYXRoKTtcXG4gICAgICBsZXQgbWltZVR5cGU7XFxuICAgICAgdHJ5IHtcXG4gICAgICAgIG1pbWVUeXBlID0gRmlsZXMucHJvYmVDb250ZW50VHlwZShwYXRoKTtcXG4gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7XFxuICAgICAgICAgIC8vbG9nKFxcXCJNSU1FIHR5cGUgb2YgdGhlIGZpbGUgaXM6IFxcXCIgKyBtaW1lVHlwZSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBsb2coXFxcIk1JTUUgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICB9XFxuICAgICAgaWYgKG1pbWVUeXBlKSB7XFxuICAgICAgICByZXR1cm4gU3RyaW5nKG1pbWVUeXBlKS5yZXBsYWNlKFxcXCJhcHBsaWNhdGlvblxcXCIsIFxcXCJ0ZXh0XFxcIik7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybjtcXG4gICAgICB9XFxuICAgIH1cXG4gIH0pXFxuXFxuXFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIirmlbDmja5cXFwiLFxcbiAgICBkZXNjOiBcXFwi55u06ZO+6L6T5YWlLOeCueWHu+inpuWPkeaWh+S7tuS4iuS8oFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIGxldCBsb2NrdGltZSA9IGdldE15VmFyKFxcXCJsb2NrdGltZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICBpZiAobG9ja3RpbWUpIHtcXG4gICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IG5ldyBEYXRlKCk7XFxuICAgICAgICBsb2NrdGltZSA9IG5ldyBEYXRlKHBhcnNlSW50KGxvY2t0aW1lKSk7XFxuICAgICAgICBsZXQgcnRpbWUgPSBsb2NrdGltZSAtIGN1cnJlbnRkYXRlO1xcbiAgICAgICAgaWYgKHJ0aW1lID4gMCkge1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiK5Lyg6ZSB5a6a5LitLOi/mOmcgOimgVxcXCIgKyAocnRpbWUgLyAxMDAwKSArIFxcXCLnp5JcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG4gICAgICBsZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbiAgICAgIHJldHVybiBmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcblxcbiAgICAgICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbiAgICAgICAgICBjb25zdCBmcyA9ICQuZnMoKTtcXG4gICAgICAgICAgbG9nKFBBVEgpXFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJyUEFUSFxcXCIsIFBBVEgucmVwbGFjZSgvKC4qXFxcXC8pLiovLCBcXFwiJDFcXFwiKSk7XFxuICAgICAgICAgIGxldCBtaW1lID0gJC5nZXRNSU1FKFBBVEgpO1xcbiAgICAgICAgICBsZXQgaW5mbyA9IGZzLmdldEluZm8oUEFUSCk7XFxuICAgICAgICAgIGluZm9bXFxcIm1pbWVcXFwiXSA9IG1pbWU7XFxuICAgICAgICAgIC8vbG9nKGluZm8pXFxuICAgICAgICAgIHZhciBjb250ZW50ID0gZnMucmVhZEZpbGUoUEFUSCk7XFxuICAgICAgICAgIGxldCBzaGFyZV9lbmNvZGUgPSBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwi5LiN57yW56CBXFxcIik7XFxuICAgICAgICAgIGxldCBkcnB5RW5jcnlwdCA9ICQucmVxdWlyZShcXFwiZHJweUVuY3J5cHRcXFwiKTtcXG4gICAgICAgICAgaWYgKHNoYXJlX2VuY29kZSAhPSBcXFwi5LiN57yW56CBXFxcIikge1xcbiAgICAgICAgICAgIGxldCBydWxlID0gZHJweUVuY3J5cHQudHJ5RGVjcnlwdChjb250ZW50KTtcXG4gICAgICAgICAgICBsZXQgZW5jb2RldGV4dCA9IGRycHlFbmNyeXB0LmVuY3J5cHQocnVsZSwgc2hhcmVfZW5jb2RlKTtcXG4gICAgICAgICAgICBjb250ZW50ID0gZW5jb2RldGV4dDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgY3VycmVudF9tYXRjaCA9IGRycHlFbmNyeXB0LmdldFJlZ2V4KCk7XFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRfbWF0Y2gudGVzdChjb250ZW50KSkge1xcbiAgICAgICAgICAgICAgY29udGVudD1iYXNlNjRFbmNvZGUoY29udGVudCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIC8vbG9nKGNvbnRlbnQpXFxuXFxuICAgICAgICAgIGxldCBzdWJlID0gZmluZEl0ZW0oXFxcInN1Ym1pdF9uYW1lXFxcIikuZXh0cmE7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcInN1Ym1pdF9uYW1lXFxcIiwge1xcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHN1YmUsIHtcXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaW5mby5uYW1lXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IEFQSS51cEZpbGUoaW5mbywgY29udGVudCk7XFxuICAgICAgICAgIGlmIChyZXN1bHQuY29kZSA9PSAwKSB7XFxuICAgICAgICAgICAgbG9nKHJlc3VsdC5kYXRhKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5LiK5Lyg5a6M5oiQXFxcIik7XFxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJzdWJtaXRfZGF0YVxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcInN1Ym1pdF9kYXRhXFxcIiwge1xcbiAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcmVzdWx0LmRhdGEudXJsXFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcImxvY2t0aW1lXFxcIiwgU3RyaW5nKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMTAwMDApKTtcXG4gICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgaW5pdGlhbFBhdGg6IGdldE15VmFyKFxcXCJyUEFUSFxcXCIsIHBhdGgpLFxcbiAgICAgICAgcGF0dGVybjogMCxcXG4gICAgICAgIGZpbGVUeXBlOiBcXFwiLmpzb258LmpzXFxcIixcXG4gICAgICB9KVxcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInN1Ym1pdF9kYXRhXFxcIixcXG4gICAgICBwYWdlVGl0bGU6IFxcXCLpgInmi6nmlofku7ZcXFwiLFxcbiAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgaGVpZ2h0OiAtMSxcXG4gICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJzdWJtaXQuZGF0YVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwic3VibWl0LmRhdGFcXFwiLCBpbnB1dCk7XFxuICAgICAgfSlcXG4gICAgfVxcbiAgfSlcXG5cXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi57yW56CBOlxcXCIgKyAoZ2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgXFxcIuS4jee8lueggVxcXCIpID09IFxcXCLkuI3nvJbnoIFcXFwiID8gXFxcIuaXoFxcXCIgOiBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwi5LiN57yW56CBXFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICB0aXRsZTogXFxcIue8lueggeexu+Wei1xcXCIsXFxuICAgICAgICBvcHRpb25zOiBbXFxcIuS4jee8lueggVxcXCIsIFxcXCJHemlwXFxcIiwgXFxcIkJhc2U2NFxcXCIsIFxcXCJBRVNcXFwiXSxcXG4gICAgICAgIGNvbDogMSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgdXBkYXRlSXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi57yW56CBOlxcXCIgKyAoZ2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgXFxcIuS4jee8lueggVxcXCIpID09IFxcXCLkuI3nvJbnoIFcXFwiID8gXFxcIuaXoFxcXCIgOiBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwi5LiN57yW56CBXFxcIikpLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGlucHV0O1xcbiAgICAgICAgfSlcXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgIGlkOiBcXFwic2hhcmVfZW5jb2RlXFxcIlxcbiAgICB9XFxuICB9KVxcblxcblxcbiAgZC5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuaPj+i/sFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcblxcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxcbiAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICBoZWlnaHQ6IDIsXFxuICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwic3VibWl0LmRlc2NcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInN1Ym1pdC5kZXNjXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICB9XFxuICB9KVxcblxcbiAgbGV0IGRlZmV4dCA9IHtcXG4gICAgdHlwZTogMFxcbiAgfVxcblxcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c21hbGw+6Kej5p6Q5aGr5YaZe1xcXCJ0eXBlXFxcIjogMHwxfSAw5qCH6K+Gd2ViIHwgMeagh+ivhmpzb25cXFxcbuW9seinhuWhq+WGmXtcXFwidHlwZVxcXCI6IDB8MX0gMOagh+ivhmRycHkgfCAx5qCH6K+GeGJwcTwvc21hbGw+JyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgfSlcXG5cXG4gIGQucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLmianlsZVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxcbiAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInN1Ym1pdC5leHRcXFwiLCBkZWZleHQpLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJzdWJtaXQuZXh0XFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICB9XFxuICB9KVxcblxcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IG1vZGUgPT0gXFxcIuaWsOWinlxcXCIgPyBcXFwi5o+Q5LqkXFxcIiA6IFxcXCLmm7TmlrBcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgbGV0IG1vZGUgPSBnZXRNeVZhcihcXFwibmF2YnRuXFxcIiwgXFxcIuaWsOWinlxcXCIpO1xcbiAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvQm9vbGVhbihzdHIpIHtcXG4gICAgICAgIHJldHVybiBzdHIgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XFxuICAgICAgfVxcbiAgICAgIGxldCBkYXRhcyA9IHtcXG4gICAgICAgIG5hbWU6IGdldE15VmFyKFxcXCJzdWJtaXQubmFtZVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgIGRlc2M6IGdldE15VmFyKFxcXCJzdWJtaXQuZGVzY1xcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgIHR5cGU6IGdldE15VmFyKFxcXCJzdWJtaXQudHlwZVxcXCIsIFxcXCJzaXRlXFxcIiksXFxuICAgICAgICBzZW5zaXRpdmU6IHN0cmluZ1RvQm9vbGVhbihnZXRNeVZhcihcXFwic3VibWl0LnNlbnNpdGl2ZVxcXCIsIFxcXCJmYWxzZVxcXCIpKSxcXG4gICAgICAgIGV4dDogc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInN1Ym1pdC5leHRcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICBkYXRhOiBnZXRNeVZhcihcXFwic3VibWl0LmRhdGFcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgfVxcbiAgICAgIGlmIChtb2RlID09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICBkYXRhc1tcXFwiaWRcXFwiXSA9IGdldE15VmFyKFxcXCJzdWJtaXQuaWRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgfVxcbiAgICAgIGlmICghZGF0YXMubmFtZSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQjeensOS4jeWPr+S7peS4uuepulxcXCI7XFxuICAgICAgfVxcbiAgICAgIGlmICghZGF0YXMuZGF0YSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aVsOaNruS4jeWPr+S7peS4uuepulxcXCI7XFxuICAgICAgfVxcbiAgICAgIGlmIChkYXRhcy50eXBlID09IFxcXCJsaXZlXFxcIikge1xcbiAgICAgICAgZGVsZXRlIGRhdGFzLmV4dFxcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRyeXtcXG4gICAgICAgICAgICAgIGRhdGFzW1xcXCJleHRcXFwiXSA9IEpTT04ucGFyc2UoZGF0YXNbXFxcImV4dFxcXCJdfHxcXFwie31cXFwiKTtcXG4gICAgICAgICAgfWNhdGNoKGUpe1xcbiAgICAgICAgICAgICAgcmV0dXJuIFxcXCJleHTplJnor6/vvIzlv4XpobvkuLpqc29uXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgXFxuICAgICAgfVxcblxcbiAgICAgIGxvZyhkYXRhcylcXG4gICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpO1xcbiAgICAgIGxldCByZXN1bHQgPSBBUEkuc3VibWl0KGRhdGFzKTtcXG4gICAgICBpZiAocmVzdWx0LmNvZGUgPT0gMCkge1xcbiAgICAgICAgaWYgKG1vZGUgPT0gXFxcIue8lui+kVxcXCIpIHtcXG4gICAgICAgICAgdG9hc3QoXFxcIuabtOaWsOaIkOWKnzpcXFwiICsgQVBJLmRhdGVGb3JtYXQobmV3IERhdGUocmVzdWx0LmRhdGEudXBkYXRlZF9hdCkpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChtb2RlID09IFxcXCLmlrDlop5cXFwiKSB7XFxuICAgICAgICAgIHRvYXN0KFxcXCLmj5DkuqTmiJDlip86XFxcIiArIEFQSS5kYXRlRm9ybWF0KG5ldyBEYXRlKHJlc3VsdC5kYXRhLmNyZWF0ZWRfYXQpKSk7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSlcXG4gIH0pXFxuXFxuXFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumHjee9rlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICBsaXN0TXlWYXJLZXlzKCkuZmlsdGVyKGUgPT4gZS5pbmNsdWRlcyhcXFwic3VibWl0LlxcXCIpKS5mb3JFYWNoKGYgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihmKTtcXG4gICAgICB9KVxcbiAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgfSlcXG4gIH0pXFxufVxcblxcbmlmICh0aSA9PSBcXFwiMVxcXCIpIHtcXG4gIGxldCBhdWRpdCA9IGdldE15VmFyKFxcXCJhdWRpdGluZ1xcXCIsIFxcXCJcXFwiKTtcXG4gIGxldCByZXN1bHQgPSBBUEkuZ2V0SGlzdG9yeShwYWdlKTtcXG4gIGxldCBzcGxpdHBhZ2UgPSBNYXRoLmNlaWwocmVzdWx0LnRvdGFsIC8gMTYpO1xcbiAgLy9sb2coc3BsaXRwYWdlKTtcXG4gIGxldCBwYWdlc2hvdyA9IFxcXCJcXFwiO1xcbiAgaWYgKHNwbGl0cGFnZSA+IDEpIHtcXG4gICAgcGFnZXNob3cgPSBgXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOmhteaVsCR7cGFnZX0vJHtzcGxpdHBhZ2V9YDtcXG4gIH1cXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuaAu+aVsDpcXFwiICsgcmVzdWx0LnRvdGFsICsgcGFnZXNob3csXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcInBhZ2VzaG93XFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0gZWxzZSB7XFxuICAgIGlmIChzcGxpdHBhZ2UgPiAxICYmIHBhZ2UgPD0gc3BsaXRwYWdlKSB7XFxuICAgICAgdXBkYXRlSXRlbShcXFwicGFnZXNob3dcXFwiLCB7XFxuICAgICAgICB0aXRsZTogXFxcIuaAu+aVsDpcXFwiICsgcmVzdWx0LnRvdGFsICsgcGFnZXNob3dcXG4gICAgICB9KVxcbiAgICB9XFxuICB9XFxuXFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIHRhYihudWxsLCBbXFxuICAgICAgW1xcXCLlhajpg6hcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgW1xcXCLlrqHmoLjkuK1cXFwiLCBcXFwiLTFcXFwiXSxcXG4gICAgICBbXFxcIumAmui/h1xcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgW1xcXCLpqbPlm55cXFwiLCBcXFwiLTJcXFwiXSxcXG4gICAgXSwgXFxcImF1ZGl0aW5nXFxcIiwgYXVkaXQsIGNvbG9ycywge1xcbiAgICAgIHRpdGxlOiBcXFwi5qC35byPXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcIkFQSVxcXCIpLmhpa2VyUG9wKCk7XFxuICAgICAgICBsZXQgc3R5bGVzID0gWycnXS5jb25jYXQoZ2V0Q29sVHlwZXMoKSk7XFxuICAgICAgICBzdHlsZXMgPSBzdHlsZXMuZmlsdGVyKHggPT5cXG4gICAgICAgICAgLyh0ZXh0X3xmbGV4KS4qLy50ZXN0KHgpICYmIHggIT0gJ3RleHRfaWNvbicgJiYgeCAhPSBcXFwidGV4dF81XFxcIik7XFxuICAgICAgICBsZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIFxcXCJ0ZXh0XzFcXFwiKTtcXG4gICAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICAgIG9wdGlvbnM6IHN0eWxlcyxcXG4gICAgICAgICAgY29sdW1uczogMixcXG4gICAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgICBwb3NpdGlvbjogc3R5bGVzLmZpbmRJbmRleCh4ID0+IHggPT0gc3R5bGUpLFxcbiAgICAgICAgICBjbGljayhzKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3AucnVuT25OZXdUaHJlYWQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3R5bGVcXFwiLCBzKTtcXG4gICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/moLflvI/orr7nva7kuLo6XFxcIiArIHM7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0sXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSlcXG4gICAgfSk7XFxuICB9XFxuXFxuICBsZXQgY29sb3JUaXRsZSA9IG5ldyBNYXAoW1xcbiAgICBbMCwgeyB2YWx1ZTogXFxcIumAmui/h1xcXCIsIGNvbG9yOiBcXFwiIzJFQTM3NlxcXCIgfV0sXFxuICAgIFstMSwgeyB2YWx1ZTogXFxcIuWuoeaguFxcXCIsIGNvbG9yOiBcXFwiIzQ1ODJFNlxcXCIgfV0sXFxuICAgIFstMiwgeyB2YWx1ZTogXFxcIumps+WbnlxcXCIsIGNvbG9yOiBcXFwiI2ZmNjYwMFxcXCIgfV1cXG4gIF0pXFxuXFxuICBsZXQgbGlzdCA9IHJlc3VsdC5saXN0O1xcbiAgLy9sb2cobGlzdC5tYXAoeCA9PiB4LmF1ZGl0KSlcXG4gIGlmIChhdWRpdCkge1xcbiAgICBsaXN0ID0gbGlzdC5maWx0ZXIoZiA9PiBmLmF1ZGl0ID09IGF1ZGl0KTtcXG4gIH1cXG4gIGxldCBodG1sc3R5bGUgPSB0cnVlO1xcbiAgbGV0IHN0eWxlID0gZ2V0SXRlbShcXFwic3R5bGVcXFwiLCBcXFwidGV4dF8xXFxcIik7XFxuICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XFxuICAgIC8vbG9nKGl0ZW0pXFxuICAgIGxldCB0aXRsZSA9IFxcXCJcXFwiO1xcbiAgICBsZXQgY2EgPSBjb2xvclRpdGxlLmdldChpdGVtLmF1ZGl0KTtcXG4gICAgbGV0IGNyID0gY2EudmFsdWUuZm9udGNvbG9yKGNhLmNvbG9yKTtcXG4gICAgaWYgKHN0eWxlID09IFxcXCJ0ZXh0XzFcXFwiIHx8IHN0eWxlID09IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIikge1xcbiAgICAgIHRpdGxlID0gXFxcIjxzbWFsbD7lkI3np7A6XFxcIiArIGl0ZW0ubmFtZSArIFxcXCI8L3NtYWxsPlxcXFxuPHNtYWxsPlxcXCIgKyBg54q25oCBOiR7Y3J9XFxcXG7mm7TmlrDml7bpl7Q6JHtBUEkuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLnVwZGF0ZWRfYXQpKX1gICsgXFxcIjwvc21hbGw+XFxcIjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICB0aXRsZSA9IFxcXCJcXFwiICsgaXRlbS5uYW1lLmZvbnRjb2xvcihjYS5jb2xvcikgKyBcXFwiXFxcIjtcXG4gICAgfVxcbiAgICBpZiAoaHRtbHN0eWxlKSB7XFxuICAgICAgdGl0bGUgPSBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHRpdGxlO1xcbiAgICB9XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgIGRlc2M6IFxcXCJcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICBpbWc6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3NlbF9maWxsXFxcIixcXG4gICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG9iaikgPT4ge1xcbiAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGsgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwic3VibWl0LlxcXCIgKyBrLCBvYmpba10pO1xcbiAgICAgICAgfSlcXG4gICAgICAgIHB1dE15VmFyKFxcXCJ0aXRsZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIm5hdmJ0blxcXCIsIFxcXCLnvJbovpFcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgaXRlbSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGl0ZW06IHsgaWQ6IGl0ZW0uaWQgfSxcXG4gICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgdGl0bGU6IFxcXCLor6bmg4VcXFwiLFxcbiAgICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkP3JlZGlyZWN0PWNvbnRlbnRcXFwiXFxuICAgICAgICAgIH0sIGl0ZW0pXFxuICAgICAgICB9XVxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0pXFxufVxcblxcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZHJweUVuY3J5cHRcIixcInBhdGhcIjpcImRycHlFbmNyeXB0XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgRmlsZVV0aWwgPSBjb20uZXhhbXBsZS5oaWtlcnZpZXcudXRpbHMuRmlsZVV0aWw7XFxubGV0IGphdmFTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nO1xcbmxldCBCYXNlNjQgPSBqYXZhLnV0aWwuQmFzZTY0O1xcbmNvbnN0IEdaSVBPdXRwdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07XFxuY29uc3QgR1pJUElucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtO1xcbmNvbnN0IEluZmxhdGVySW5wdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXJJbnB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJJbnB1dFN0cmVhbTtcXG5jb25zdCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTtcXG5jb25zdCBCeXRlQXJyYXlJbnB1dFN0cmVhbSA9IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07XFxuY29uc3QgRGVmbGF0ZXIgPSBqYXZhLnV0aWwuemlwLkRlZmxhdGVyO1xcblxcbmZ1bmN0aW9uIHppcCh0ZXh0LCBtb2RlKSB7XFxuICBtb2RlID0gbW9kZSA/IG1vZGUgOiBcXFwiZ3ppcFxcXCI7XFxuICBsZXQgYmFzZVN0ciA9IG5ldyBqYXZhU3RyaW5nKHRleHQpO1xcbiAgLy8g5L2/55SoIEJ5dGVBcnJheU91dHB1dFN0cmVhbSDmnaXmjZXojrfljovnvKnlkI7nmoTmlbDmja5cXG4gIHZhciBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO1xcbiAgaWYgKG1vZGUgPT0gXFxcImRlZmxhdGVcXFwiKSB7XFxuICAgIHZhciBkZWZsYXRlciA9IG5ldyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyKCk7XFxuICAgIGRlZmxhdGVyLnNldExldmVsKGphdmEudXRpbC56aXAuRGVmbGF0ZXIuQkVTVF9DT01QUkVTU0lPTik7XFxuICAgIHZhciBkb3MgPSBuZXcgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbShiYW9zLCBkZWZsYXRlcik7XFxuICAgIGRvcy53cml0ZShiYXNlU3RyLmdldEJ5dGVzKFxcXCJVVEYtOFxcXCIpKTtcXG4gICAgZG9zLmZpbmlzaCgpOyAvLyDlrozmiJDljovnvKlcXG4gICAgZG9zLmNsb3NlKCk7XFxuICB9IGVsc2Uge1xcbiAgICB2YXIgZ3pvcyA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0oYmFvcyk7XFxuICAgIGd6b3Mud3JpdGUoYmFzZVN0ci5nZXRCeXRlcyhcXFwiVVRGLThcXFwiKSk7XFxuICAgIGd6b3MuY2xvc2UoKTsgLy8g5YWz6Zet5Y6L57yp5rWBXFxuICB9XFxuICAvLyDlsIbljovnvKnlkI7nmoTmlbDmja7ovazmjaLkuLogQmFzZTY0IOe8lueggeeahOWtl+espuS4slxcbiAgdmFyIGNvbXByZXNzZWREYXRhID0gYmFvcy50b0J5dGVBcnJheSgpO1xcbiAgdmFyIGJhc2U2NFN0cmluZyA9IGphdmEudXRpbC5CYXNlNjQuZ2V0RW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGNvbXByZXNzZWREYXRhKTtcXG5cXG4gIC8vIOWFs+mXrSBCeXRlQXJyYXlPdXRwdXRTdHJlYW1cXG4gIGJhb3MuY2xvc2UoKTtcXG4gIHJldHVybiBTdHJpbmcoYmFzZTY0U3RyaW5nKTtcXG59XFxuXFxuZnVuY3Rpb24gdW56aXAodGV4dCwgbW9kZSkge1xcbiAgbW9kZSA9IG1vZGUgPyBtb2RlIDogXFxcImd6aXBcXFwiO1xcbiAgdmFyIGNvbXByZXNzZWREYXRhID0gQmFzZTY0LmdldERlY29kZXIoKS5kZWNvZGUodGV4dCk7XFxuICB2YXIgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb21wcmVzc2VkRGF0YSk7XFxuICB2YXIgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTtcXG4gIHZhciBidWZmZXIgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQnl0ZS5UWVBFLCAxMDI0KTtcXG4gIGlmIChtb2RlID09IFxcXCJnemlwXFxcIikge1xcbiAgICB2YXIgZ2lzID0gbmV3IEdaSVBJbnB1dFN0cmVhbShiYWlzKTtcXG4gICAgbGV0IGxlbjtcXG4gICAgd2hpbGUgKChsZW4gPSBnaXMucmVhZChidWZmZXIpKSAhPSAtMSkge1xcbiAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBsZW4pO1xcbiAgICB9XFxuICAgIGdpcy5jbG9zZSgpO1xcbiAgfSBlbHNlIGlmIChtb2RlID09IFxcXCJkZWZsYXRlXFxcIikge1xcbiAgICB2YXIgaWlzID0gbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oYmFpcyk7XFxuICAgIGxldCBsZW47XFxuICAgIHdoaWxlICgobGVuID0gaWlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHtcXG4gICAgICBiYW9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXG4gICAgfVxcbiAgICBpaXMuY2xvc2UoKTtcXG4gIH1cXG4gIGJhaXMuY2xvc2UoKTtcXG4gIGJhb3MuY2xvc2UoKTtcXG4gIHZhciBkZWNvbXByZXNzZWRTdHJpbmcgPSBuZXcgamF2YVN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksIFxcXCJVVEYtOFxcXCIpO1xcbiAgLy8g5omT5Y2w6Kej5Y6L57yp5ZCO55qE5a2X56ym5LiyXFxuICByZXR1cm4gU3RyaW5nKGRlY29tcHJlc3NlZFN0cmluZyk7XFxufVxcblxcbmxldCBHWklQID0ge1xcbiAgemlwLFxcbiAgdW56aXBcXG59XFxuXFxuZnVuY3Rpb24gZW5jcnlwdChydWxlLCBlbmNvZGVNb2RlKSB7XFxuICBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkd6aXBcXFwiKSB7XFxuICAgIHJ1bGUgPSBHWklQLnppcChydWxlKTtcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkJhc2U2NFxcXCIpIHtcXG4gICAgcnVsZSA9IGJhc2U2NEVuY29kZShydWxlKTtcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkFFU1xcXCIpIHtcXG4gICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFwiKTtcXG4gICAgbGV0IGtleSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChcXFwiNjg2QTY0Njg2RTc4MEEwQTBBMEEwQTBBMEEwQTBBMEFcXFwiKTtcXG4gICAgbGV0IGl2ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2NDdBNzk3OTY0NzMwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICBsZXQgdGV4dERhdGEgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VVVEY4KHJ1bGUpO1xcbiAgICBsZXQgZW5jcnlwdGVkMCA9IENyeXB0b1V0aWwuQUVTLmVuY3J5cHQodGV4dERhdGEsIGtleSwge1xcbiAgICAgIG1vZGU6IFxcXCJBRVMvQ0JDL1BLQ1M3UGFkZGluZ1xcXCIsXFxuICAgICAgaXY6IGl2XFxuICAgIH0pO1xcbiAgICBydWxlID0gZW5jcnlwdGVkMC50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgfVxcbiAgcmV0dXJuIHJ1bGU7XFxufVxcblxcbmZ1bmN0aW9uIGRlY3J5cHQocnVsZSwgZW5jb2RlTW9kZSkge1xcbiAgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJHemlwXFxcIikge1xcbiAgICBydWxlID0gR1pJUC51bnppcChydWxlKTtcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkJhc2U2NFxcXCIpIHtcXG4gICAgcnVsZSA9IGJhc2U2NERlY29kZShydWxlKTtcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkFFU1xcXCIpIHtcXG4gICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFwiKTtcXG4gICAgbGV0IGtleSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChcXFwiNjg2QTY0Njg2RTc4MEEwQTBBMEEwQTBBMEEwQTBBMEFcXFwiKTtcXG4gICAgbGV0IGl2ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2NDdBNzk3OTY0NzMwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICBsZXQgdGV4dERhdGEgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VCYXNlNjQocnVsZSk7XFxuICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZGVjcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxuICAgICAgbW9kZTogXFxcIkFFUy9DQkMvUEtDUzdQYWRkaW5nXFxcIixcXG4gICAgICBpdjogaXZcXG4gICAgfSk7XFxuICAgIHJ1bGUgPSBlbmNyeXB0ZWQwLnRvU3RyaW5nKCk7XFxuICB9XFxuICByZXR1cm4gcnVsZTtcXG59XFxuXFxubGV0IGN1cnJlbnRfbWF0Y2ggPSAvXihcXFxccyspP1xcXFx7fHZhciBydWxlfGZ1bmN0aW9ufGxldCB8dmFyIHxjb25zdCAvO1xcblxcbmZ1bmN0aW9uIGdldFJlZ2V4KCkge1xcbiAgcmV0dXJuIGN1cnJlbnRfbWF0Y2g7XFxufVxcblxcbmZ1bmN0aW9uIHRyeURlY3J5cHQocnVsZSkge1xcbiAgaWYgKGN1cnJlbnRfbWF0Y2gudGVzdChydWxlKSkge1xcbiAgICByZXR1cm4gcnVsZTtcXG4gIH1cXG4gIGxldCB0eXBlID0gW1xcXCJHemlwXFxcIiwgXFxcIkJhc2U2NFxcXCIsIFxcXCJBRVNcXFwiXTtcXG4gIGZvciAobGV0IGl0IG9mIHR5cGUpIHtcXG4gICAgbG9nKGl0KVxcbiAgICB0cnkge1xcbiAgICAgIGxldCBjcnVsZSA9IGRlY3J5cHQocnVsZSwgaXQpO1xcbiAgICAgIGxvZyhjcnVsZS5zbGljZSgwLCAxMDApKTtcXG4gICAgICBsb2coY3VycmVudF9tYXRjaC50ZXN0KGNydWxlKSlcXG4gICAgICBpZiAoY3VycmVudF9tYXRjaC50ZXN0KGNydWxlKSkge1xcblxcbiAgICAgICAgcmV0dXJuIGNydWxlO1xcbiAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkgeyB9XFxuICB9XFxuICByZXR1cm4gcnVsZTtcXG59XFxuJC5leHBvcnRzID0ge1xcbiAgZ2V0UmVnZXgsXFxuICBlbmNyeXB0LFxcbiAgZGVjcnlwdCxcXG4gIHRyeURlY3J5cHRcXG59XCJ9XSxcInBhcmFtc1wiOlwie1xcXCJpdGVtXFxcIjp7XFxcImNyZWF0ZWRfYXRcXFwiOlxcXCIyMDI1LTAxLTA3VDEzOjIyOjI4Ljg2OVpcXFwiLFxcXCJlbWFpbFxcXCI6XFxcIjc2NjAyNTk4MkBxcS5jb21cXFwiLFxcXCJpZFxcXCI6MTMxMCxcXFwibmFtZVxcXCI6XFxcIlvlkKxd5YWt5pyI5ZCs5LmmW0RTXVxcXCIsXFxcInNlbnNpdGl2ZVxcXCI6ZmFsc2UsXFxcInR5cGVcXFwiOlxcXCJzaXRlXFxcIixcXFwidXBkYXRlZF9hdFxcXCI6XFxcIjIwMjUtMDEtMDdUMTM6MjM6MTQuNjIzWlxcXCIsXFxcInVzZXJuYW1lXFxcIjpcXFwiemh4eVxcXCJ9LFxcXCJwYWdlVGl0bGVcXFwiOlxcXCJb5ZCsXeWFreaciOWQrOS5pltEU11cXFwifVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCLmupDliqjliptcIixcInZlcnNpb25cIjowLFwidXJsXCI6XCJoaWtlcjovL3BhZ2UvcGFnZUxvYWQ/cmVkaXJlY3Q9Y29udGVudFwiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uKGltcG9ydFBhcmFtKSB7XFxuICAgIHZhciBsb2FkVXJsID0gaW1wb3J0UGFyYW0gfHwgZ2V0UGFyYW0oXFxcInJlZGlyZWN0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICB0cnkge1xcbiAgICAgICAgdmFyIGNvZGUgPSBKU09OLnBhcnNlKGZldGNoKFxcXCJoaWtlcjovL3BhZ2UvXFxcIiArIGxvYWRVcmwpKS5ydWxlO1xcbiAgICAgICAgLy9sb2coY29kZSlcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgc2V0UmVzdWx0KFt7XFxuICAgICAgICAgICAgZGVzYzogXFxcIuS4jeWtmOWcqOivpemhtemdojpcXFwiICsgbG9hZFVybCxcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnEVSUk9S4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICB9XSk7XFxuICAgICAgICByZXR1cm47XFxuICAgIH1cXG5cXG4gICAgdHJ5IHtcXG4gICAgICAgIGV2YWwuY2FsbChudWxsLCBjb2RlKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgaWYgKHR5cGVvZiBkICE9IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgdmFyIGQgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgICAgIGQgPSBBcnJheS5pc0FycmF5KGQpID8gZCA6IFtdO1xcbiAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFwibmVlZCBsb2dpblxcXCIpKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLpnIDopoHnmbvlvZVcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICBkZXNjOiBlLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcRVJST1LigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0UmVzdWx0KGQpO1xcbiAgICB9XFxufSkoJC5pbXBvcnRQYXJhbSk7XCIsXCJncm91cFwiOlwiIyPluLjnlKhcIixcInVhXCI6XCJtb2JpbGVcIixcInByZVJ1bGVcIjpcIlwiLFwicGFnZXNcIjpcIlt7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpobXpnaLliqDovb1cXFwiLFxcXCJwYXRoXFxcIjpcXFwicGFnZUxvYWRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4oZnVuY3Rpb24oaW1wb3J0UGFyYW0pIHtcXFxcbiAgICB2YXIgbG9hZFVybCA9IGltcG9ydFBhcmFtIHx8IGdldFBhcmFtKFxcXFxcXFwicmVkaXJlY3RcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgdmFyIGNvZGUgPSBKU09OLnBhcnNlKGZldGNoKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1xcXFxcXFwiICsgbG9hZFVybCkpLnJ1bGU7XFxcXG4gICAgICAgIC8vbG9nKGNvZGUpXFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBzZXRSZXN1bHQoW3tcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5LiN5a2Y5Zyo6K+l6aG16Z2iOlxcXFxcXFwiICsgbG9hZFVybCxcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnEVSUk9S4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gICAgICAgIH1dKTtcXFxcbiAgICAgICAgcmV0dXJuO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGV2YWwuY2FsbChudWxsLCBjb2RlKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgZCAhPSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICB2YXIgZCA9IFtdO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGQgPSBBcnJheS5pc0FycmF5KGQpID8gZCA6IFtdO1xcXFxuICAgICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXFxcXFwibmVlZCBsb2dpblxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLpnIDopoHnmbvlvZVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnEVSUk9S4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNldFJlc3VsdChkKTtcXFxcbiAgICB9XFxcXG59KSgkLmltcG9ydFBhcmFtKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJBUElcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQVBJXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGJhc2ljVXJsID0gXFxcXFxcXCJodHRwczovL3d3dy5zb3VyY2Vwb3dlci50b3BcXFxcXFxcIjtcXFxcbmxldCB1c2VyID0gc3RvcmFnZTAuZ2V0SXRlbShcXFxcXFxcInVzZXJcXFxcXFxcIiwge30pO1xcXFxuXFxcXG5sZXQgdG9rZW4gPSB1c2VyLnRva2VuO1xcXFxuLypcXFxcbmZ1bmN0aW9uIGdldFZlcmlmQ29va2llKHVybCl7XFxcXG4gICAgbGV0IGNvb2tpZT1cXFxcXFxcIlxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5EKi9cXFxcbi8vZnVuY3Rpb25cXFxcbmZ1bmN0aW9uIGdldFRva2VuKCkge1xcXFxuICBsZXQgZW1haWwgPSBnZXRJdGVtKFxcXFxcXFwiZW1haWxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gIGxldCBwYXNzID0gZ2V0SXRlbShcXFxcXFxcInBhc3NcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gIGxldCByZXN1bHQgPSBwb3N0KFxcXFxcXFwiaHR0cHM6Ly93d3cuc291cmNlcG93ZXIudG9wL2FwaS92MS91c2VyL2xvZ2luXFxcXFxcXCIsIHtcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIngtcmVxdWVzdGVkLXdpdGhcXFxcXFxcIjogXFxcXFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFxcXFxcIixcXFxcbiAgICAgIFxcXFxcXFwicmVmZXJlclxcXFxcXFwiOiBcXFxcXFxcImh0dHBzOi8vd3d3LnNvdXJjZXBvd2VyLnRvcC9sb2dpblxcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBib2R5OiB7XFxcXG4gICAgICBcXFxcXFxcImVtYWlsXFxcXFxcXCI6IGVtYWlsLFxcXFxuICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBwYXNzXFxcXG4gICAgfVxcXFxuICB9KVxcXFxuICB0cnkge1xcXFxuICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpLmRhdGE7XFxcXG4gICAgc3RvcmFnZTAuc2V0SXRlbShcXFxcXFxcInVzZXJcXFxcXFxcIiwgZGF0YSk7XFxcXG4gIH0gY2F0Y2ggeyB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlZnJlc2hUb2tlbigpIHtcXFxcbiAgbGV0IHVlc3IgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXFxcXFwidXNlclxcXFxcXFwiLCB7fSk7XFxcXG4gIGlmICh1c2VyLmhhc093blByb3BlcnR5KFxcXFxcXFwidG9rZW5cXFxcXFxcIikpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgbGV0IHBheWxvYWQgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZSh1c2VyLnRva2VuLnNwbGl0KFxcXFxcXFwiLlxcXFxcXFwiKVsxXSkpO1xcXFxuICAgICAgbGV0IGV4cCA9IG5ldyBEYXRlKHBheWxvYWQuZXhwICogMTAwMCk7XFxcXG4gICAgICBsZXQgbm93dGltZSA9IG5ldyBEYXRlKCk7XFxcXG4gICAgICBpZiAobm93dGltZSA+IGV4cCkge1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLliLfmlrBUb2tlblxcXFxcXFwiKTtcXFxcbiAgICAgICAgZ2V0VG9rZW4oKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgIH1cXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICBsb2codXNlci50b2tlbik7XFxcXG4gICAgICBsb2coZS5tZXNzYWdlKVxcXFxuICAgIH1cXFxcbiAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRTb3VyY2VMaXN0KGMsIHBhZ2UpIHtcXFxcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYnVpbGRVcmwoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L2FsbGAsIE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIHR5cGU6IFxcXFxcXFwic2l0ZVxcXFxcXFwiLFxcXFxuICAgIC8vc2Vuc2l0aXZlOiBcXFxcXFxcIm5vc2Vuc2l0aXZlXFxcXFxcXCIsXFxcXG4gICAgbmFtZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICB1c2VyX2lkOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIHBhZ2VOdW06IHBhZ2UgfHwgMSxcXFxcbiAgICBwYWdlU2l6ZTogMTZcXFxcbiAgfSwgYykpLCB7XFxcXG4gICAgaGVhZGVyczoge1xcXFxuICAgICAgXFxcXFxcXCJ4LXJlcXVlc3RlZC13aXRoXFxcXFxcXCI6IFxcXFxcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcXFxcXCIsXFxcXG4gICAgfVxcXFxuICB9KTtcXFxcbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzKS5kYXRhLmxpc3Q7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFNvdXJjZUNvbnRlbnQoaWQpIHtcXFxcbiAgaWYgKCF0b2tlbikge1xcXFxuICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIm5lZWQgbG9naW5cXFxcXFxcIik7XFxcXG4gIH1cXFxcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L2RldGFpbC8ke2lkfWAsIHtcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIngtcmVxdWVzdGVkLXdpdGhcXFxcXFxcIjogXFxcXFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFxcXFxcIixcXFxcbiAgICAgIGF1dGhvcml6YXRpb246IFxcXFxcXFwiQmVhcmVyIFxcXFxcXFwiICsgdG9rZW5cXFxcbiAgICB9XFxcXG4gIH0pO1xcXFxuXFxcXG4gIHJlcyA9IEpTT04ucGFyc2UocmVzKTtcXFxcbiAgaWYgKHJlcy5jb2RlID09IC0xKSB7XFxcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwibmVlZCBsb2dpblxcXFxcXFwiKTtcXFxcbiAgfVxcXFxuICByZXR1cm4gcmVzLmRhdGE7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFNoYXJpbmdMaXN0KCkge1xcXFxuICBsZXQgcmVzID0gcmVxdWVzdChgJHtiYXNpY1VybH0vYXBpL3YxL2NvbnRlbnQvcmFua2AsIHtcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIngtcmVxdWVzdGVkLXdpdGhcXFxcXFxcIjogXFxcXFxcXCJjb20uZXhhbXBsZS5oaWtlcnZpZXdcXFxcXFxcIixcXFxcbiAgICB9XFxcXG4gIH0pO1xcXFxuICByZXR1cm4gSlNPTi5wYXJzZShyZXMpLmRhdGEubGlzdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0QXV0aG9yTGlzdCgpIHtcXFxcbiAgbGV0IHJlcyA9IHJlcXVlc3QoYCR7YmFzaWNVcmx9L2FwaS92MS9jb250ZW50L2NyZWF0b3JgLCB7XFxcXG4gICAgaGVhZGVyczoge1xcXFxuICAgICAgXFxcXFxcXCJ4LXJlcXVlc3RlZC13aXRoXFxcXFxcXCI6IFxcXFxcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcXFxcXCIsXFxcXG4gICAgfVxcXFxuICB9KTtcXFxcbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzKS5kYXRhLmxpc3Q7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldElwKCkge1xcXFxuICB0cnkge1xcXFxuICAgIGxldCByZXMgPSByZXF1ZXN0KGAke2Jhc2ljVXJsfS9hcGkvdjEvc3lzdGVtL2luZm9gLCB7XFxcXG4gICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgIFxcXFxcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXFxcXFwiOiBcXFxcXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXFxcXFwiLFxcXFxuICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuZGF0YS5pcDtcXFxcbiAgfSBjYXRjaCAoZSkge1xcXFxuICAgIHJldHVybiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFN1YihpcCkge1xcXFxuICBpZiAoIXRva2VuKSB7XFxcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwibmVlZCBsb2dpblxcXFxcXFwiKTtcXFxcbiAgfVxcXFxuICBsZXQgcmVzID0gcG9zdChgJHtiYXNpY1VybH0vYXBpL3YxL3N1YnNjcmliZS9hdXRoYCwge1xcXFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgIGFsbG93X2lwczogaXBcXFxcbiAgICB9KSxcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIngtcmVxdWVzdGVkLXdpdGhcXFxcXFxcIjpcXFxcXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXFxcXFwiLFxcXFxuICAgICAgYXV0aG9yaXphdGlvbjogXFxcXFxcXCJCZWFyZXIgXFxcXFxcXCIgKyB0b2tlblxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG4gIHJlcyA9IEpTT04ucGFyc2UocmVzKTtcXFxcbiAgaWYgKHJlcy5jb2RlID09IC0xKSB7XFxcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwibmVlZCBsb2dpblxcXFxcXFwiKTtcXFxcbiAgfVxcXFxuICByZXR1cm4gcmVzLmRhdGEuY29kZTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0SGlzdG9yeShwYWdlKSB7XFxcXG4gIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHJlcXVlc3QoYmFzaWNVcmwgKyBgL2FwaS92MS9jb250ZW50L2NyZWF0ZWQ/cGFnZT0ke3BhZ2V9JmxpbWl0PTIwYCwge1xcXFxuICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgIFxcXFxcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXFxcXFwiOlxcXFxcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcXFxcXCIsXFxcXG4gICAgICBhdXRob3JpemF0aW9uOiBcXFxcXFxcIkJlYXJlciBcXFxcXFxcIiArIHRva2VuXFxcXG4gICAgfVxcXFxuICB9KSk7XFxcXG4gIGlmIChyZXN1bHQuY29kZSA9PSAwKSB7XFxcXG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xcXFxuICB9XFxcXG4gIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFRhYihuYW1lLCBhcnIsIHR5cGUsIGNvbnRyYXN0LCBjb2xvcnMsIGFkZG9iaikge1xcXFxuICBsZXQgZGVmY29sb3JzID0ge1xcXFxuICAgIGZjOiBcXFxcXFxcIiM0NDlGNTA7XFxcXFxcXCIsXFxcXG4gICAgYmM6IFxcXFxcXFwiI0ZGRTBGMEUzO1xcXFxcXFwiXFxcXG4gIH1cXFxcbiAgY29sb3JzID0gT2JqZWN0LmFzc2lnbihkZWZjb2xvcnMsIGNvbG9ycyk7XFxcXG4gIGxldCBmY3MgPSBjb2xvcnMuZmMuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICBsZXQgYmNzID0gY29sb3JzLmJjLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKTtcXFxcbiAgaWYgKG5hbWUpIHtcXFxcbiAgICBsZXQgbmF2ID0ge1xcXFxuICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfVxcXFxuICAgIGlmICh0eXBlb2YgbmFtZSA9PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiKSB7XFxcXG4gICAgICBuYXYgPSBPYmplY3QuYXNzaWduKG5hdiwgbmFtZSk7XFxcXG4gICAgfVxcXFxuICAgIGQucHVzaChuYXYpO1xcXFxuICB9XFxcXG4gIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XFxcXG4gICAgbGV0IGNvbG9yID0gaXRlbVsxXSA9PT0gY29udHJhc3QgPyBmY3NbMF0gOiBmY3NbMV07XFxcXG5cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBpdGVtWzBdLmZvbnRjb2xvcihjb2xvciksXFxcXG4gICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoa2V5LCB0eXBlKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKHR5cGUsIGtleSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgfSwgaXRlbVsxXSwgdHlwZSksXFxcXG4gICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICBleHRyYToge1xcXFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGl0ZW1bMV0gPT09IGNvbnRyYXN0ID8gYmNzWzBdIDogYmNzWzFdLFxcXFxuICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICB9XFxcXG4gIGlmIChhZGRvYmopIHtcXFxcbiAgICBkLnB1c2goYWRkb2JqKVxcXFxuICB9XFxcXG5cXFxcbiAgZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZW5lcmF0ZUJvdW5kYXJ5KHByZWZpeCwgcmFuZG9tTGVuZ3RoKSB7XFxcXG4gIGNvbnN0IGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xcXFxuICBsZXQgYm91bmRhcnkgPSAnJztcXFxcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5kb21MZW5ndGg7IGkrKykgeyAvLyDmoLnmja7mjIflrprplb/luqbnlJ/miJDpmo/mnLrpg6jliIZcXFxcbiAgICBib3VuZGFyeSArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCkpO1xcXFxuICB9XFxcXG4gIHJldHVybiBgJHtwcmVmaXh9JHtib3VuZGFyeX1gOyAvLyDov5Tlm57lrozmlbTnmoTovrnnlYzlrZfnrKbkuLJcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZm9ybWRhdGEodXJsLCBpbmhlYWQsIGJvZHksIGJvdW5vYmopIHtcXFxcbiAgbGV0IGZpbGUgPSBmYWxzZTtcXFxcbiAgbGV0IGRlZm9iaiA9IHtcXFxcbiAgICBwcmVmaXg6ICctLVdlYktpdEZvcm1Cb3VuZGFyeScsXFxcXG4gICAgbnVtOiAxNixcXFxcbiAgICBmaWxsOiBbNCwgNCwgMl1cXFxcbiAgfVxcXFxuICBpZiAoYm91bm9iaiA9PSB1bmRlZmluZWQpIHtcXFxcbiAgICBib3Vub2JqID0gZGVmb2JqO1xcXFxuICB9IGVsc2Uge1xcXFxuICAgIGJvdW5vYmogPSBPYmplY3QuYXNzaWduKHt9LCBkZWZvYmosIGJvdW5vYmopO1xcXFxuICB9XFxcXG4gIC8vbG9nKGJvdW5vYmopXFxcXG5cXFxcbiAgdmFyIGZpbGwgPSBib3Vub2JqLmZpbGwubWFwKGNvdW50ID0+ICctJy5yZXBlYXQoY291bnQpKTtcXFxcbiAgLy9sb2coZmlsbClcXFxcbiAgdmFyIGJvdW5kYXJ5ID0gZ2VuZXJhdGVCb3VuZGFyeShib3Vub2JqLnByZWZpeCwgYm91bm9iai5udW0pO1xcXFxuICBsZXQgZGVmaGVhZCA9IHtcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogTU9CSUxFX1VBLFxcXFxuICAgIH0sXFxcXG4gICAgbWV0aG9kOiAnUFVUJyxcXFxcbiAgfVxcXFxuICBpZiAoaW5oZWFkLmhlYWRlcnMgJiYgaW5oZWFkLmhlYWRlcnMuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIikpIHtcXFxcbiAgICBpbmhlYWQuaGVhZGVyc1tcXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiXSA9IGluaGVhZC5oZWFkZXJzW1xcXFxcXFwiY29udGVudC10eXBlXFxcXFxcXCJdLnJlcGxhY2UoXFxcXFxcXCIke2JvdW5kYXJ5fVxcXFxcXFwiLCBib3VuZGFyeSk7XFxcXG4gIH1cXFxcbiAgdmFyIGhlYWQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZoZWFkLCBpbmhlYWQpO1xcXFxuICBpZiAoYm9keSAmJiBib2R5LmlzZmlsZSkge1xcXFxuICAgIGZpbGUgPSBib2R5LmlzZmlsZTtcXFxcbiAgICBkZWxldGUgYm9keS5pc2ZpbGU7XFxcXG4gIH1cXFxcblxcXFxuICBpZiAoYm9keSkge1xcXFxuICAgIGlmIChmaWxlKSB7XFxcXG4gICAgICBoZWFkLmhlYWRlcnMuYm9keSA9IE9iamVjdC5rZXlzKGJvZHkpLm1hcChrZXkgPT4ge1xcXFxuICAgICAgICByZXR1cm4gYCR7ZmlsbFswXX0ke2JvdW5kYXJ5fVxcXFxcXFxcclxcXFxcXFxcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cXFxcXFxcIiR7a2V5fVxcXFxcXFwiOyBmaWxlbmFtZT1cXFxcXFxcIiR7Ym9keVtrZXldW1xcXFxcXFwibmFtZVxcXFxcXFwiXX1cXFxcXFxcIlxcXFxcXFxcclxcXFxcXFxcbkNvbnRlbnQtVHlwZTogJHtib2R5W2tleV1bXFxcXFxcXCJtaW1lXFxcXFxcXCJdfVxcXFxcXFxcclxcXFxcXFxcblxcXFxcXFxcclxcXFxcXFxcbiR7Ym9keVtrZXldW1xcXFxcXFwidmFsdWVcXFxcXFxcIl19YFxcXFxuICAgICAgfSkuam9pbignXFxcXFxcXFxyXFxcXFxcXFxuJykgKyBgXFxcXFxcXFxyXFxcXFxcXFxuJHtmaWxsWzFdfSR7Ym91bmRhcnl9JHtmaWxsWzJdfVxcXFxcXFxcclxcXFxcXFxcbmBcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgaGVhZC5oZWFkZXJzLmJvZHkgPSBPYmplY3Qua2V5cyhib2R5KS5tYXAoa2V5ID0+IHtcXFxcbiAgICAgICAgcmV0dXJuIGAke2ZpbGxbMF19JHtib3VuZGFyeX1cXFxcXFxcXHJcXFxcXFxcXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XFxcXFxcXCIke2tleX1cXFxcXFxcIlxcXFxcXFxcclxcXFxcXFxcblxcXFxcXFxcclxcXFxcXFxcbiR7Ym9keVtrZXldfWBcXFxcbiAgICAgIH0pLmpvaW4oJ1xcXFxcXFxcclxcXFxcXFxcbicpICsgYCR7ZmlsbFsxXX0ke2JvdW5kYXJ5fSR7ZmlsbFsyXX1cXFxcXFxcXHJcXFxcXFxcXG5gXFxcXG4gICAgfVxcXFxuICAgIC8vbG9nKGhlYWQuaGVhZGVycy5ib2R5KVxcXFxuICB9XFxcXG4gIHJldHVybiBmZXRjaCh1cmwsIGhlYWQpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB1cEZpbGUoaW5mbywgY29udGVudCkge1xcXFxuICB2YXIgYm91bmRhcnkgPSBnZW5lcmF0ZUJvdW5kYXJ5KCctLVdlYktpdEZvcm1Cb3VuZGFyeScsIDE2KTtcXFxcbiAgbGV0IHJlc3VsdCA9IGZvcm1kYXRhKGJhc2ljVXJsICsgJy9hcGkvdjEvc3lzdGVtL3VwbG9hZCcsIHtcXFxcbiAgICBoZWFkZXJzOiB7XFxcXG4gICAgICBcXFxcXFxcIngtcmVxdWVzdGVkLXdpdGhcXFxcXFxcIjpcXFxcXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXFxcXFwiLFxcXFxuICAgICAgXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tLSR7Ym91bmRhcnl9XFxcXFxcXCIsXFxcXG4gICAgICBcXFxcXFxcInJlZmVyZXJcXFxcXFxcIjogYmFzaWNVcmwgKyBcXFxcXFxcIi9zdWJtaXRcXFxcXFxcIixcXFxcbiAgICAgIGF1dGhvcml6YXRpb246IFxcXFxcXFwiQmVhcmVyIFxcXFxcXFwiICsgdG9rZW5cXFxcbiAgICB9LFxcXFxuICAgIG1ldGhvZDogJ1BPU1QnLFxcXFxuICB9LCB7XFxcXG4gICAgaXNmaWxlOiB0cnVlLFxcXFxuICAgIGZpbGU6IHtcXFxcbiAgICAgIG5hbWU6IGluZm8uZmlsZU5hbWUsXFxcXG4gICAgICBtaW1lOiBpbmZvLm1pbWUsXFxcXG4gICAgICB2YWx1ZTogY29udGVudFxcXFxuICAgIH1cXFxcbiAgfSwge1xcXFxuICAgIHByZWZpeDogJy0tV2ViS2l0Rm9ybUJvdW5kYXJ5JyxcXFxcbiAgICBudW06IDE2LFxcXFxuICAgIGZpbGw6IFs0LCA0LCAyXVxcXFxuICB9KVxcXFxuICB0cnkge1xcXFxuICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgfSBjYXRjaCAoZSkgeyB9XFxcXG4gIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHN1Ym1pdChvYmopIHtcXFxcbiAgbGV0IGlkID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgbGV0IG1ldGhvZCA9IFxcXFxcXFwiUE9TVFxcXFxcXFwiO1xcXFxuICBpZiAob2JqLmhhc093blByb3BlcnR5KFxcXFxcXFwiaWRcXFxcXFxcIikpIHtcXFxcbiAgICBpZCA9IFxcXFxcXFwiL1xcXFxcXFwiICsgb2JqLmlkO1xcXFxuICAgIGRlbGV0ZSBvYmouaWQ7XFxcXG4gICAgbWV0aG9kID0gXFxcXFxcXCJQVVRcXFxcXFxcIjtcXFxcbiAgfVxcXFxuICBsZXQgcmVzID0gcmVxdWVzdChgJHtiYXNpY1VybH0vYXBpL3YxL2NvbnRlbnQke2lkfWAsIHtcXFxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvYmopLFxcXFxuICAgIG1ldGhvZDogbWV0aG9kLFxcXFxuICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgIFxcXFxcXFwieC1yZXF1ZXN0ZWQtd2l0aFxcXFxcXFwiOlxcXFxcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcXFxcXCIsXFxcXG4gICAgICBcXFxcXFxcInJlZmVyZXJcXFxcXFxcIjogYmFzaWNVcmwgKyBcXFxcXFxcIi9zdWJtaXRcXFxcXFxcIixcXFxcbiAgICAgIGF1dGhvcml6YXRpb246IFxcXFxcXFwiQmVhcmVyIFxcXFxcXFwiICsgdG9rZW5cXFxcbiAgICB9XFxcXG4gIH0pO1xcXFxuICB0cnkge1xcXFxuICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKTtcXFxcbiAgfSBjYXRjaCAoZSkgeyB9XFxcXG4gIHJldHVybiByZXM7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGRhdGVGb3JtYXQoZGF0ZSwgdCkge1xcXFxuICBsZXQgdGV4dCA9ICd5eXl5LU1NLWRkIEhIOm1tOnNzJztcXFxcbiAgaWYgKHQpIHtcXFxcbiAgICB0ZXh0ID0gdDtcXFxcbiAgfVxcXFxuICByZXR1cm4gJC5kYXRlRm9ybWF0KGRhdGUuZ2V0VGltZSgpLCB0ZXh0KTtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0ge1xcXFxuICBiYXNpY1VybCxcXFxcbiAgdXNlcixcXFxcbiAgdXBGaWxlLFxcXFxuICBzdWJtaXQsXFxcXG4gIGRhdGVGb3JtYXQsXFxcXG4gIHNldFRhYixcXFxcbiAgaGlrZXJQb3A6ICgpID0+IHtcXFxcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXFxcXFwiKTtcXFxcbiAgfSxcXFxcbiAgZ2V0Qm91bmRhcnk6IGdlbmVyYXRlQm91bmRhcnksXFxcXG4gIGZvcm1kYXRhOiBmb3JtZGF0YSxcXFxcbiAgZ2V0SGlzdG9yeSxcXFxcbiAgZ2V0U291cmNlTGlzdCxcXFxcbiAgZ2V0U291cmNlQ29udGVudCxcXFxcbiAgZ2V0U2hhcmluZ0xpc3QsXFxcXG4gIGdldEF1dGhvckxpc3QsXFxcXG4gIHJlZnJlc2hUb2tlbixcXFxcbiAgZ2V0VG9rZW4sXFxcXG4gIGdldElwLFxcXFxuICBnZXRTdWIsXFxcXG4gIHRva2VuXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwic291cmNlTGlzdFxcXCIsXFxcInBhdGhcXFwiOlxcXCJzb3VyY2VMaXN0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXFxcXFwiQVBJXFxcXFxcXCIpO1xcXFxuXFxcXG52YXIgZCA9IFtdO1xcXFxubGV0IGNvbiA9IHt9O1xcXFxudHJ5IHtcXFxcbiAgY29uID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwiY29uXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKSkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbn0gY2F0Y2ggKGUpIHtcXFxcbiAgbG9nKGUudG9TdHJpbmcoKSlcXFxcbn1cXFxcbi8qXFxcXG5pZiAoTVlfVVJMLmluY2x1ZGVzKFxcXFxcXFwic291cmNlTGlzdFxcXFxcXFwiKSAmJiBNWV9QQUdFID09IDEpIHtcXFxcbiAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJ0ZW1wLnNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIik7XFxcXG4gIH0pKTtcXFxcbiAgbGV0IHRhYj1BUEkuc2V0VGFiO1xcXFxuICBsZXQgc2Vuc2l0aXZlID0gZ2V0TXlWYXIoXFxcXFxcXCJ0ZW1wLnNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIiwgY29uLnNlbnNpdGl2ZT9jb24uc2Vuc2l0aXZlOlxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICB0YWIoXFxcXFxcXCLov4fmu6Q6XFxcXFxcXCIsIFtcXFxcbiAgICBbXFxcXFxcXCLlhajpg6hcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIl0sXFxcXG4gICAgW1xcXFxcXFwi5LiN5pWP5oSfXFxcXFxcXCIsIFxcXFxcXFwibm9zZW5zaXRpdmVcXFxcXFxcIl0sXFxcXG4gICAgW1xcXFxcXFwi5pWP5oSfXFxcXFxcXCIsIFxcXFxcXFwic2Vuc2l0aXZlXFxcXFxcXCJdLFxcXFxuICBdLCBcXFxcXFxcInRlbXAuc291cmNlZmlsdGVyLnNlbnNpdGl2ZVxcXFxcXFwiLCBzZW5zaXRpdmUpO1xcXFxuICBjb25bXFxcXFxcXCJzZW5zaXRpdmVcXFxcXFxcIl09Z2V0TXlWYXIoXFxcXFxcXCJ0ZW1wLnNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIiwgc2Vuc2l0aXZlKTtcXFxcbn1cXFxcbiovXFxcXG5sZXQgbGlzdCA9IEFQSS5nZXRTb3VyY2VMaXN0KE9iamVjdC5hc3NpZ24oe30sIGNvbiwge1xcXFxuICBwYWdlTnVtOiBNWV9QQUdFLFxcXFxufSkpO1xcXFxuXFxcXG5mb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXFxcbiAgbGV0IGNvbCA9ICFpIHx8ICgoaSArIDEpICUgMiA9PT0gMSkgPyBcXFxcXFxcImNhcmRfcGljXzJfMl9sZWZ0XFxcXFxcXCIgOiBcXFxcXFxcImNhcmRfcGljXzJfMlxcXFxcXFwiO1xcXFxuICBsZXQgaXRlbSA9IGxpc3RbaV07XFxcXG4gIGQucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCI4MFxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAmOKAmOKAmeKAmVxcXFxcXFwiICsgYCR7U3RyaW5nKGl0ZW0ubmFtZSkuYmlnKCkuZm9udGNvbG9yKFxcXFxcXFwiYmxhY2tcXFxcXFxcIil9XFxcXFxcXFxuJHtTdHJpbmcoaXRlbS50eXBlKS5mb250Y29sb3IoXFxcXFxcXCJncmV5XFxcXFxcXCIpfXwkeyhpdGVtLnNlbnNpdGl2ZSA/IFxcXFxcXFwi5pWP5oSfXFxcXFxcXCIgOiBcXFxcXFxcIuW4uOinhFxcXFxcXFwiKS5mb250Y29sb3IoXFxcXFxcXCJncmV5XFxcXFxcXCIpfXwke1N0cmluZyhpdGVtLnVwZGF0ZWRfYXQpLnNwbGl0KFxcXFxcXFwiVFxcXFxcXFwiKVswXS5mb250Y29sb3IoXFxcXFxcXCJncmV5XFxcXFxcXCIpfVxcXFxcXFxcbjxiPiR7U3RyaW5nKGl0ZW0udXNlcm5hbWUpLmZvbnRjb2xvcihcXFxcXFxcImJsYWNrXFxcXFxcXCIpfSAke1xcXFxcXFwi5o+Q5L6bXFxcXFxcXCIuc21hbGwoKS5mb250Y29sb3IoXFxcXFxcXCJncmV5XFxcXFxcXCIpfWAuc21hbGwoKSxcXFxcbiAgICBjb2xfdHlwZTogY29sLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiI0ZGRjNGM0YzXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9wYWdlTG9hZD9yZWRpcmVjdD1jb250ZW50XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgIHBhZ2VUaXRsZTogaXRlbS5uYW1lLFxcXFxuICAgICAgaXRlbVxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG59XFxcXG5kLnB1c2goe1xcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG59KVxcXFxuXFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiY29udGVudFxcXCIsXFxcInBhdGhcXFwiOlxcXCJjb250ZW50XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXFxcXFwiQVBJXFxcXFxcXCIpO1xcXFxuXFxcXG52YXIgZCA9IFtdO1xcXFxuXFxcXG5sZXQgY29udGVudCA9IEFQSS5nZXRTb3VyY2VDb250ZW50KE1ZX1BBUkFNUy5pdGVtLmlkKTtcXFxcblxcXFxuaWYgKGNvbnRlbnQubmFtZSA9PSBcXFxcXFxcIlRva2VuRXhwaXJlZEVycm9yXFxcXFxcXCIpIHtcXFxcbiAgICBsb2coXFxcXFxcXCLnmbvlvZXov4fmnJ9cXFxcXFxcIilcXFxcbiAgICBBUEkuZ2V0VG9rZW4oKTtcXFxcbiAgICBjb250ZW50ID0gQVBJLmdldFNvdXJjZUNvbnRlbnQoTVlfUEFSQU1TLml0ZW0uaWQpO1xcXFxufVxcXFxuXFxcXG5sZXQgdXBkYXRlID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbmlmIChjb250ZW50LmNyZWF0ZWRfYXQgIT0gY29udGVudC51cGRhdGVkX2F0KSB7XFxcXG4gICAgdXBkYXRlID0gXFxcXFxcXCJ8VTpcXFxcXFxcIiArIEFQSS5kYXRlRm9ybWF0KG5ldyBEYXRlKGNvbnRlbnQudXBkYXRlZF9hdCksIFxcXFxcXFwieXl5eS1NTS1kZCBISDptbVxcXFxcXFwiKTtcXFxcbn1cXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnroDku4vkv6Hmga9cXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfYm9va21hcmsyXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCJDOlxcXFxcXFwiICsgQVBJLmRhdGVGb3JtYXQobmV3IERhdGUoY29udGVudC5jcmVhdGVkX2F0KSwgXFxcXFxcXCJ5eXl5LU1NLWRkXFxcXFxcXCIpICsgdXBkYXRlLFxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBjb250ZW50LmRlc2MgfHwgXFxcXFxcXCLkuIrkvKDogIXlpKrmh5LkuobvvIzku4DkuYjpg73msqHmnInnlZnkuIvlk6Z+XFxcXFxcXCIsXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJmbGV4X2J1dHRvblxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBjb250ZW50LnR5cGUsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9wYWdlTG9hZCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cGFnZT1meXBhZ2UmcmVkaXJlY3Q9c291cmNlTGlzdCZjb249XFxcXFxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgdHlwZTogY29udGVudC50eXBlXFxcXG4gICAgfSkpKSxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXFxcXFwi5p+l6K+i57G75Z6LOlxcXFxcXFwiICsgY29udGVudC50eXBlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgZXh0ID0gY29udGVudC5leHQ7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImZsZXhfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5omp5bGV57G75Z6LOlxcXFxcXFwiK2V4dC50eXBlLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcGFnZUxvYWQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3BhZ2U9ZnlwYWdlJnJlZGlyZWN0PXNvdXJjZUxpc3QmY29uPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgIGV4dFR5cGU6IGV4dC50eXBlXFxcXG4gICAgfSkpKSxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXFxcXFwi5p+l6K+iOlxcXFxcXFwiICsgKGV4dC50eXBlKSxcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJmbGV4X2J1dHRvblxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBjb250ZW50LnVzZXJuYW1lICsgXFxcXFxcXCIg5o+Q5L6bXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh1c2VyKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdXRob3JMaXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIjLmF1dGhvckxpc3RcXFxcXFxcIiwgW10pO1xcXFxuICAgICAgICBpZiAoIWF1dGhvckxpc3QubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBhdXRob3JMaXN0ID0gQVBJLmdldEF1dGhvckxpc3QoKTtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyIy5hdXRob3JMaXN0XFxcXFxcXCIsIGF1dGhvckxpc3QpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGF1dGhvckxpc3QgPSBhdXRob3JMaXN0LmZpbHRlcih2ID0+IFN0cmluZyh2LnVzZXJuYW1lKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHVzZXIpKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlPWZ5cGFnZSZyZWRpcmVjdD1zb3VyY2VMaXN0JmNvbj1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgdXNlcl9pZDogYXV0aG9yTGlzdFswXS5pZFxcXFxuICAgICAgICB9KSkpXFxcXG4gICAgfSwgY29udGVudC51c2VybmFtZSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgcGFnZVRpdGxlOiBcXFxcXFxcIuafpeivouWIm+S9nOiAhTpcXFxcXFxcIiArIGNvbnRlbnQudXNlcm5hbWUsXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmlmIChjb250ZW50LnR5cGUgPT0gXFxcXFxcXCJsaXZlXFxcXFxcXCIpIHtcXFxcbiAgICBpZiAoY29udGVudC5kYXRhLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLpk77mjqVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGRhdGEpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ3ZWI6Ly9cXFxcXFxcIiArIGRhdGE7XFxcXG4gICAgICAgICAgICB9LCBjb250ZW50LmRhdGEpXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbnRlbnQuZGF0YSxcXFxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXFxcXG4gICAgICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxcXG4gICAgICAgICAgICBoZWlnaHQ6IDJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pXFxcXG4gICAgc2V0UmVzdWx0KGQpXFxcXG59XFxcXG5sZXQgZHJweUVuY3J5cHQgPSAkLnJlcXVpcmUoXFxcXFxcXCJkcnB5RW5jcnlwdFxcXFxcXFwiKTtcXFxcbmxldCBhcGkgPSBcXFxcXFxcImRycHkyXFxcXFxcXCI7XFxcXG5sZXQgc2FwaSA9IFxcXFxcXFwiLi9kcnB5X2xpYnMvZHJweTIubWluLmpzXFxcXFxcXCI7XFxcXG5cXFxcbmxldCBkYXRhID0gY29udGVudC5jb250ZW50IHx8IGNvbnRlbnQuZGF0YTtcXFxcblxcXFxubGV0IGN1cnJlbnRfbWF0Y2ggPSBkcnB5RW5jcnlwdC5nZXRSZWdleCgpO1xcXFxuXFxcXG50cnkge1xcXFxuICAgIC8vbG9nKCFjdXJyZW50X21hdGNoLnRlc3QoZGF0YSkpXFxcXG4gICAgaWYgKCFjdXJyZW50X21hdGNoLnRlc3QoZGF0YSkpIHtcXFxcbiAgICAgICAgbGV0IHRlbXBkYXRhID0gYmFzZTY0RGVjb2RlKGRhdGEpO1xcXFxuICAgICAgICBpZiAoY3VycmVudF9tYXRjaC50ZXN0KHRlbXBkYXRhKSkge1xcXFxuICAgICAgICAgICAgZGF0YSA9IHRlbXBkYXRhO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxufVxcXFxuXFxcXG5pZiAoZXh0LnR5cGUgPT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBzYXBpID0gXFxcXFxcXCJjc3BfWEJQUVxcXFxcXFwiO1xcXFxuICAgIGFwaSA9IFxcXFxcXFwiWEJQUVxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5pZiAoc2FwaSA9PSBcXFxcXFxcImNzcF9YQlBRXFxcXFxcXCIpIHtcXFxcbiAgICBpZiAodHlwZW9mIGRhdGEgPT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICBkYXRhID0gZHJweUVuY3J5cHQudHJ5RGVjcnlwdChkYXRhKTtcXFxcbiAgICAgICAgaWYgKGRhdGEuZW5kc1dpdGgoXFxcXFxcXCIsXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCAtMSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoZGF0YSkpO1xcXFxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJleHRcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5leHQ7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGRhdGEgPSB7XFxcXG4gICAgICAgICAgICAgICAgZXJyb3I6IGUubWVzc2FnZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG4kLmV4dGVuZCh7XFxcXG4gICAgZGF0YTogZGF0YVxcXFxufSlcXFxcblxcXFxubGV0IGpzbmFtZSA9IGNvbnRlbnQuZGF0YS5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbMV07XFxcXG5qc25hbWUgPSBqc25hbWUucmVwbGFjZSgvXFxcXFxcXFxkezEzfS0vLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcblxcXFxubGV0IG5hbWUgPSBqc25hbWUgPyBqc25hbWUgOiBcXFxcXFxcIuaXoOWQjVxcXFxcXFwiO1xcXFxuaWYgKG5hbWUuZW5kc1dpdGgoXFxcXFxcXCIuanNcXFxcXFxcIikpIHtcXFxcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFxcXFxcXFwiLmpzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKFxcXFxcXFwiLmpzb25cXFxcXFxcIikpIHtcXFxcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFxcXFxcXFwiLmpzb25cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59XFxcXG5cXFxcbmxldCBqc3YgPSBcXFxcXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3NvdXJjZV92aWV3LmpzXFxcXFxcXCI7XFxcXG5pZiAoZXh0LnR5cGUgPT09IDMpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkv53lrZjliLDmnKzlnLBcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoY29udGVudCwganNuYW1lKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgcGF0aCA9IGdldEl0ZW0oXFxcXFxcXCJEc1NhdmVQYXRoXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKCFwYXRoKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i/mOayoeacieiuvue9ruS/neWtmOi3r+W+hFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IHMgPSAoY29udGVudCwganNuYW1lKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRJdGVtKFxcXFxcXFwiRHNTYXZlUGF0aFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsganNuYW1lLCBjb250ZW50KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KHBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGpzbmFtZSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/neWtmOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChmaWxlRXhpc3QocGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsganNuYW1lKSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwi5pys5Zyw5bey57uP5a2Y5Zyo6K+l5paH5Lu25piv5ZCm6KaG55uW77yfXFxcXFxcXCIpLmNvbmZpcm0ocywgY29udGVudCwganNuYW1lKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBzKGNvbnRlbnQsIGpzbmFtZSk7XFxcXG4gICAgICAgIH0sIGNvbnRlbnQuY29udGVudCwganNuYW1lKVxcXFxuICAgIH0pO1xcXFxufSBlbHNlIGlmIChjb250ZW50LnR5cGUgPT0gXFxcXFxcXCJzaXRlXFxcXFxcXCIpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImZsZXhfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWvvOWFpURycHlIaWtlclxcXFxcXFwiLFxcXFxuICAgICAgICAvL3VybDpcXFxcXFxcInRvYXN0Oi8v6L+Y5rKh5YGaXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChjb250ZW50LCBqc25hbWUsIHNhcGkpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBkYXRhID0gJC5kYXRhO1xcXFxuICAgICAgICAgICAgbGV0IGFwaSA9IFxcXFxcXFwiZHJweTJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGlmIChzYXBpLmluY2x1ZGVzKFxcXFxcXFwiWEJQUVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIGFwaSA9IFxcXFxcXFwiWEJQUVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJlcnJvclxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBkYXRhLmVycm9yXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwiaW1wb3J0P3J1bGU9XFxcXFxcXCIgKyBcXFxcXFxcIkRycHlIaWtlclxcXFxcXFwiKShjb250ZW50Lm5hbWUgKyBcXFxcXFxcIiRiYXNlNjQ6XFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUoZGF0YSkgKyBcXFxcXFxcIiRcXFxcXFxcIiArIGpzbmFtZSArIFxcXFxcXFwiI1xcXFxcXFwiICsgYXBpLCB0cnVlKVxcXFxuICAgICAgICB9LCBjb250ZW50LCBqc25hbWUsIHNhcGkpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImZsZXhfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIkRycHlIaWtlcuafpeeci1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoY29udGVudCwganN2KSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICQuZGF0YTtcXFxcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFxcXFxcXFwiZXJyb3JcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgZGF0YS5lcnJvclxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKGpzdiwgZGF0YSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvZWRpdFNvdXJjZXMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3J1bGU9RHJweUhpa2VyXFxcXFxcXCJcXFxcbiAgICAgICAgfSwgY29udGVudCwganN2KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgcGF0aDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBcXFxcXFxcInNvdXJjZVxcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJhcGlcXFxcXFxcIjogc2FwaSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImV4dFxcXFxcXFwiOiBnZXRQYXRoKGpzdiksXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJmaWx0ZXJhYmxlXFxcXFxcXCI6IDEsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJrZXlcXFxcXFxcIjogYXBpICsgXFxcXFxcXCJfXFxcXFxcXCIgKyBuYW1lLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBuYW1lLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwib3JkZXJfbnVtXFxcXFxcXCI6IDAsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJxdWlja1NlYXJjaFxcXFxcXFwiOiAxLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwic2VhcmNoYWJsZVxcXFxcXFwiOiAxLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwidHlwZVxcXFxcXFwiOiAzXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5pWw5o2u5YaF5a65XFxcXFxcXCIsXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX2Jvb2ttYXJrMlxcXFxcXFwiLFxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuS4u+imgeWPguaVsFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb250ZW50LmNvbnRlbnQgfHwgY29udGVudC5kYXRhLFxcXFxuICAgICAgICB0eXBlOiAndGV4dGFyZWEnLFxcXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxcXG4gICAgICAgIGhlaWdodDogM1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmianlsZXlj4LmlbBcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29udGVudC5leHQsXFxcXG4gICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXFxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXFxcbiAgICAgICAgaGVpZ2h0OiAyXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwibG9naW5cXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9naW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZCA9IFtdO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumCrueusVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJlbWFpbFxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldEl0ZW0oXFxcXFxcXCJlbWFpbFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgIH1cXFxcbn0pXFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5a+G56CBXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgfSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicGFzc1xcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldEl0ZW0oXFxcXFxcXCJwYXNzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpICAgIH1cXFxcbn0pXFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi55m75b2VXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgbGV0IHtcXFxcbiAgICAgICAgICAgIGdldFRva2VuXFxcXG4gICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG4gICAgICAgIGdldFRva2VuKCk7XFxcXG4gICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pXFxcXG59KVxcXFxuXFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwic2hhcmluZ0xpc3RcXFwiLFxcXCJwYXRoXFxcIjpcXFwic2hhcmluZ0xpc3RcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG5cXFxcbnZhciBkID0gW107XFxcXG5cXFxcbmxldCBsaXN0ID0gQVBJLmdldFNoYXJpbmdMaXN0KCk7XFxcXG5sZXQgZ2V0VGl0bGUgPSAoaSwgbmFtZSkgPT4ge1xcXFxuICAgIGxldCBjb2xvcjtcXFxcbiAgICBzd2l0Y2ggKGkpIHtcXFxcbiAgICAgICAgY2FzZSAwOlxcXFxuICAgICAgICAgICAgY29sb3IgPSBcXFxcXFxcIiNmZjMzMDBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICBjYXNlIDE6XFxcXG4gICAgICAgICAgICBjb2xvciA9IFxcXFxcXFwiI2ZmNjYwMFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgMjpcXFxcbiAgICAgICAgICAgIGNvbG9yID0gXFxcXFxcXCIjZmY5OTAwXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICBkZWZhdWx0OlxcXFxuICAgICAgICAgICAgY29sb3IgPSBcXFxcXFxcImJsYWNrXFxcXFxcXCI7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBTdHJpbmcoaSArIDEpLmZvbnRjb2xvcihjb2xvcikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgbmFtZTtcXFxcbn1cXFxcblxcXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgIHRpdGxlOiBnZXRUaXRsZShpLCBsaXN0W2ldLnVzZXJuYW1lKSxcXFxcbiAgICAgICAgZGVzYzogbGlzdFtpXS5jb3VudCxcXFxcbiAgICAgICAgdXJsOlxcXFxcXFwibWFpbHRvOi8vXFxcXFxcXCIrbGlzdFtpXS5lbWFpbCxcXFxcbiAgICAgICAgcGljX3VybDpcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb240XFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG59XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiZmlsdGVyXFxcIixcXFwicGF0aFxcXCI6XFxcImZpbHRlclxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBkID0gW107XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgKCkgPT4ge1xcXFxuICBsaXN0TXlWYXJLZXlzKCkuZm9yRWFjaCh2ID0+IHYuaW5jbHVkZXMoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuXFxcXFxcXCIpICYmIGNsZWFyTXlWYXIodikpO1xcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICB0aXRsZTogXFxcXFxcXCLlkI3np7BcXFxcXFxcIixcXFxcbiAgZXh0cmE6IHtcXFxcbiAgICBvbkNoYW5nZTogXFxcXFxcXCJwdXRNeVZhcignc291cmNlZmlsdGVyLmtleXdvcmQnLGlucHV0KVxcXFxcXFwiXFxcXG4gIH1cXFxcbn0pO1xcXFxubGV0IGF1dGhvckxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlciMuYXV0aG9yTGlzdFxcXFxcXFwiLCBbXSk7XFxcXG5pZiAoIWF1dGhvckxpc3QubGVuZ3RoKSB7XFxcXG4gIGNvbnN0IEFQSSA9ICQucmVxdWlyZShcXFxcXFxcIkFQSVxcXFxcXFwiKTtcXFxcbiAgYXV0aG9yTGlzdCA9IEFQSS5nZXRBdXRob3JMaXN0KCk7XFxcXG4gIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyIy5hdXRob3JMaXN0XFxcXFxcXCIsIGF1dGhvckxpc3QpO1xcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgdGl0bGU6IFxcXFxcXFwi5Yib5L2c6ICFXFxcXFxcXCIsXFxcXG4gIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICB0aXRsZTogZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgdXBkYXRlSXRlbShcXFxcXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFxcXFxcIiwge1xcXFxuICAgICAgdGl0bGU6IFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9ySWRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaRcXFxcXFxcIjtcXFxcbiAgfSksXFxcXG4gIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgZXh0cmE6IHtcXFxcbiAgICBpZDogXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9yXFxcXFxcXCJcXFxcbiAgfVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gIHRpdGxlOiBcXFxcXFxcIumAieaLqVxcXFxcXFwiLFxcXFxuICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgIGxldCBhdXRob3JMaXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIjLmF1dGhvckxpc3RcXFxcXFxcIiwgW10pO1xcXFxuICAgIC8vbG9nKGF1dGhvckxpc3QpXFxcXG4gICAgbGV0IG5hbWVzID0gYXV0aG9yTGlzdC5tYXAoeCA9PiB4LnVzZXJuYW1lKTtcXFxcbiAgICBsZXQgc3BlbiA9IDI7XFxcXG5cXFxcbiAgICBsZXQgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIikuaGlrZXJQb3AoKTtcXFxcbiAgICBsZXQgcG9wID0gaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXFxcbiAgICAgIG9wdGlvbnM6IG5hbWVzLFxcXFxuICAgICAgY29sdW1uczogc3BlbixcXFxcbiAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0ouWIm+S9nOiAhTpcXFxcXFxcIiArIGdldE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyLmF1dGhvclxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxcXG4gICAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxcXG4gICAgICAgIGhpbnQ6IFxcXFxcXFwi562b6YCJ6YCJ6aG5XFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlKHMsIG1hbmFnZSkge1xcXFxuICAgICAgICAgIGxldCBmbGlzdCA9IG5hbWVzLmZpbHRlcih4ID0+IHguaW5kZXhPZihzKSA+PSAwKTtcXFxcbiAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcXFxuICAgICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcXFxuICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiYnRudXJsX2hpc3RvcnlcXFxcXFxcIiwgcyk7XFxcXG4gICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiYnRudXJsX2hpc3RvcnlcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgIH0pLFxcXFxuICAgICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxcXG4gICAgICAgIGxldCBvaSA9IGF1dGhvckxpc3QuZmluZEluZGV4KHggPT4geC51c2VybmFtZSA9PSBzKTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFxcXFxcIiwge1xcXFxuICAgICAgICAgIHRpdGxlOiBzXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFxcXFxcIiwgcyk7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyLmF1dGhvcklkXFxcXFxcXCIsIGF1dGhvckxpc3Rbb2ldLmlkKTtcXFxcbiAgICAgICAgLy9wb3AuZGlzbWlzcygpO1xcXFxuICAgICAgICByZXR1cm4gcG9wLmRpc21pc3NXaXRoKCgpID0+IHtcXFxcbiAgICAgICAgICBoaWtlclBvcC5ydW5Pbk5ld1RocmVhZCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgY29uID0geyB0eXBlOiBnZXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci50eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLCBzZW5zaXRpdmU6IGdldE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyLnNlbnNpdGl2ZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwga2V5d29yZDogZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIua2V5d29yZFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwgY3JlYXRvcjogZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9ySWRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikgfTtcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3BhZ2VMb2FkI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlPWZ5cGFnZSZyZWRpcmVjdD1zb3VyY2VMaXN0JmNvbj1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoY29uKSkpO1xcXFxuICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgIH0sXFxcXG4gICAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxcXG4gICAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxcXG4gICAgICAgICAgb3B0aW9uczogW1xcXFxcXFwi5pS55Y+Y5qC35byPXFxcXFxcXCIsIFxcXFxcXFwi5YCS5bqPXFxcXFxcXCIsIFxcXFxcXFwi5ruR5Yqo5Yiw5pyA5ZCOXFxcXFxcXCIsIFxcXFxcXFwi5ruR5Yqo5Yiw6aG26YOoXFxcXFxcXCJdLFxcXFxuICAgICAgICAgIGNvbHVtbnM6IDIsXFxcXG4gICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K+36YCJ5oupXFxcXFxcXCIsXFxcXG4gICAgICAgICAgY2xpY2socywgaSkge1xcXFxuICAgICAgICAgICAgaWYgKHMgPT0gXFxcXFxcXCLmlLnlj5jmoLflvI9cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAxID8gMiA6IDE7XFxcXG4gICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzID09IFxcXFxcXFwi5YCS5bqPXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcXFxuICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHMgPT0gXFxcXFxcXCLmu5HliqjliLDmnIDlkI5cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICBtYW5hZ2Uuc2Nyb2xsVG9Qb3NpdGlvbihtYW5hZ2UubGlzdC5sZW5ndGggLSAxLCB0cnVlKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocyA9PSBcXFxcXFxcIua7keWKqOWIsOmhtumDqFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgIG1hbmFnZS5zY3JvbGxUb1Bvc2l0aW9uKDAsIHRydWUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgIH0sXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgfSksXFxcXG4gIC8qdXJsOiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi5pCc57Si5Yib5L2c6ICFXFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICBsZXQgYXV0aG9yTGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyIy5hdXRob3JMaXN0XFxcXFxcXCIsIFtdKTtcXFxcblxcXFxuICAgIGlmIChpbnB1dCkge1xcXFxuICAgICAgaW5wdXQgPSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xcXFxuICAgICAgYXV0aG9yTGlzdCA9IGF1dGhvckxpc3QuZmlsdGVyKHYgPT4gU3RyaW5nKHYudXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaW5wdXQpKTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IHNob3dMaXN0ID0gYXV0aG9yTGlzdC5tYXAodiA9PiB2LnVzZXJuYW1lKTtcXFxcbiAgICByZXR1cm4gJChzaG93TGlzdCkuc2VsZWN0KChhdXRob3JMaXN0KSA9PiB7XFxcXG4gICAgICB1cGRhdGVJdGVtKFxcXFxcXFwic291cmNlZmlsdGVyLmF1dGhvclxcXFxcXFwiLCB7XFxcXG4gICAgICAgIHRpdGxlOiBpbnB1dFxcXFxuICAgICAgfSk7XFxcXG4gICAgICBwdXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5hdXRob3JcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgcHV0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9ySWRcXFxcXFxcIiwgYXV0aG9yTGlzdFtNWV9JTkRFWF0uaWQpO1xcXFxuICAgIH0sIGF1dGhvckxpc3QpO1xcXFxuICB9KSwqL1xcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IHsgc2V0VGFiIH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG5cXFxcbmxldCB0eXBlID0gZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIudHlwZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBzZW5zaXRpdmUgPSBnZXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5zZXRUYWIoXFxcXFxcXCLnsbvlnotcXFxcXFxcIiwgW1xcXFxuICBbXFxcXFxcXCLlhajpg6hcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIl0sXFxcXG4gIFtcXFxcXFxcIuW9seinhlxcXFxcXFwiLCBcXFxcXFxcInNpdGVcXFxcXFxcIl0sXFxcXG4gIFtcXFxcXFxcIueUteinhlxcXFxcXFwiLCBcXFxcXFxcImxpdmVcXFxcXFxcIl0sXFxcXG4gIFtcXFxcXFxcIuino+aekFxcXFxcXFwiLCBcXFxcXFxcInBhcnNlXFxcXFxcXCJdXFxcXG5dLCBcXFxcXFxcInNvdXJjZWZpbHRlci50eXBlXFxcXFxcXCIsIHR5cGUpO1xcXFxuc2V0VGFiKFxcXFxcXFwi5omp5bGV57G75Z6LXFxcXFxcXCIsIFtcXFxcbiAgW1xcXFxcXFwiMFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIl0sXFxcXG4gIFtcXFxcXFxcIjFcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCJdLFxcXFxuICBbXFxcXFxcXCIyXFxcXFxcXCIsIFxcXFxcXFwiMlxcXFxcXFwiXSxcXFxcbiAgW1xcXFxcXFwiM1xcXFxcXFwiLCBcXFxcXFxcIjNcXFxcXFxcIl0sXFxcXG5dLCBcXFxcXFxcInNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIiwgc2Vuc2l0aXZlKTtcXFxcbmQucHVzaCh7XFxcXG4gIHRpdGxlOiBcXFxcXFxcIuafpeivolxcXFxcXFwiLFxcXFxuICB1cmw6ICQoKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgbGV0IGNvbiA9IHtcXFxcbiAgICAgIHR5cGU6IGdldE15VmFyKFxcXFxcXFwic291cmNlZmlsdGVyLnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICBleHRUeXBlOiBnZXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5zZW5zaXRpdmVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICBuYW1lOiBnZXRNeVZhcihcXFxcXFxcInNvdXJjZWZpbHRlci5rZXl3b3JkXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgdXNlcl9pZDogZ2V0TXlWYXIoXFxcXFxcXCJzb3VyY2VmaWx0ZXIuYXV0aG9ySWRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgfTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvcGFnZUxvYWQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3BhZ2U9ZnlwYWdlJnJlZGlyZWN0PXNvdXJjZUxpc3QmY29uPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShjb24pKSk7XFxcXG4gIH0pLFxcXFxuICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcInN1YlxcXCIsXFxcInBhdGhcXFwiOlxcXCJzdWJcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgZCA9IFtdO1xcXFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXFxcXFwiQVBJXFxcXFxcXCIpO1xcXFxuaWYgKCFBUEkudG9rZW4pIHtcXFxcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJuZWVkIGxvZ2luXFxcXFxcXCIpO1xcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLorqLpmIVcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaOiOadg+WcsOWdgOmAl+WPt+WIhumalFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcmV0dXJuICQoW1xcXFxcXFwi5YWo6YOoXFxcXFxcXCIsIFxcXFxcXFwi5pWP5oSfXFxcXFxcXCIsIFxcXFxcXFwi5bi46KeEXFxcXFxcXCJdKS5zZWxlY3QoKGlwcykgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXFxcXFwiQVBJXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IEFQSS5nZXRTdWIoaXBzKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXJsPVxcXFxcXFwiaHR0cHM6Ly93d3cuc291cmNlcG93ZXIudG9wL2FwaS92MS9zdWJzY3JpYmUvXFxcXFxcXCIrY29kZStcXFxcXFxcIi9zdWJcXFxcXFxcIitbXFxcXFxcXCJcXFxcXFxcIixcXFxcXFxcIj90eXBlPXNlbnNpdGl2ZVxcXFxcXFwiLFxcXFxcXFwiP3R5cGU9bm9zZW5zaXRpdmVcXFxcXFxcIl1bTVlfSU5ERVhdO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKHVybCtcXFxcXFxcIlxcXFxcXFxcbmNvZGU6XFxcXFxcXCIrY29kZSkuY29uZmlybSgodXJsKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIit1cmw7XFxcXG4gICAgICAgICAgICAgICAgfSwgdXJsKTtcXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiK2UubWVzc2FnZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgaW5wdXQpO1xcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogQVBJLmdldElwKClcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcInN1Ym1pdFxcXCIsXFxcInBhdGhcXFwiOlxcXCJzdWJtaXRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgZCA9IFtdO1xcXFxudmFyIHBhZ2UgPSBNWV9QQUdFO1xcXFxuY29uc3QgQVBJID0gJC5yZXF1aXJlKFxcXFxcXFwiQVBJXFxcXFxcXCIpO1xcXFxubGV0IHRhYiA9IEFQSS5zZXRUYWI7XFxcXG5cXFxcbmxldCBjb2xvcnMgPSB7XFxcXG4gIGZjOiBcXFxcXFxcIiNGRkZGRkY7IzAwMDAwMFxcXFxcXFwiLFxcXFxuICBiYzogXFxcXFxcXCIjRkYwMDUyRDk7I0ZGRThFOEU4XFxcXFxcXCJcXFxcbn1cXFxcblxcXFxuXFxcXG5sZXQgdGkgPSBnZXRNeVZhcihcXFxcXFxcInRpdGxlaVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgdGl0bGVzID0gW1xcXFxcXFwi5oqV56i/XFxcXFxcXCIsIFxcXFxcXFwi5Y6G5Y+yXFxcXFxcXCJdO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5oqV56i/XFxcXFxcXCIpO1xcXFxuaWYgKHBhZ2UgPT0gMSkge1xcXFxuICBkLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumhu+efpVxcXFxcXFwiLFxcXFxuICAgIGltZzogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2luZm9fZmlsbFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgIGxldCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFxcXFxcIkFQSVxcXFxcXFwiKS5oaWtlclBvcCgpO1xcXFxuICAgICAgbGV0IHBvcCA9IGhpa2VyUG9wLmluZm9Cb3R0b20oe1xcXFxuICAgICAgICBjb250ZW50OiBcXFxcXFxcIuivpue7hlxcXFxcXFwiLFxcXFxuICAgICAgICBvcHRpb25zOiBbXFxcXG4gICAgICAgICAgXFxcXFxcXCIxLuaEn+iwouaCqOeahOaUr+aMgSwg5o+Q5Lqk5YmN56Gu5L+d5oKo5piv55m75b2V54q25oCBXFxcXFxcXFxuMi7kuIrkvKDlkI7ljbPliJvkvZzogIXmjojmnYPlubPlj7Dmi6XmnInlrqPkvKDliIblj5HmnYPliKlcXFxcXFxcXG4zLuaVsOaNruWGheWuuemcgOWuoeaguOmAmui/h+WQjuWxleekulxcXFxcXFxcbjQu6K+35Yu/6aKR57mB6Kem5Y+R5paH5Lu25LiK5LygLCDkvJrmi4npu5FcXFxcXFxcXG41LjEwc+WGheWkmuasoeaPkOS6pOS7heesrOS4gOasoeaPkOS6pOaIkOWKn1xcXFxcXFwiXFxcXG4gICAgICAgIF1cXFxcbiAgICAgIH0pO1xcXFxuICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgfSk7XFxcXG4gIHRpdGxlcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICh0aSA9PSBpID8gJzxiPicgKyBpdGVtLmZvbnRjb2xvcihcXFxcXFxcIiM0NTgyRTZcXFxcXFxcIikgKyAnPC9iPicgOiBpdGVtKSxcXFxcbiAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGl0LCBpKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwidGl0bGVpXFxcXFxcXCIsIGkpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgIH0sIGl0ZW0sIGkpLFxcXFxuICAgICAgZXh0cmE6IHtcXFxcblxcXFxuICAgICAgfVxcXFxuICAgIH0pXFxcXG4gIH0pXFxcXG59XFxcXG5cXFxcbmlmICh0aSA9PSBcXFxcXFxcIjBcXFxcXFxcIiAmJiBwYWdlID09IDEpIHtcXFxcbiAgbGV0IG1vZGUgPSBnZXRNeVZhcihcXFxcXFxcIm5hdmJ0blxcXFxcXFwiLCBcXFxcXFxcIuaWsOWinlxcXFxcXFwiKTtcXFxcbiAgbGV0IG5hdmJ0biA9IFtcXFxcXFxcIuaWsOWinlxcXFxcXFwiLCBcXFxcXFxcIue8lui+kVxcXFxcXFwiXTtcXFxcbiAgbmF2YnRuLmZvckVhY2goaXRlbSA9PiB7XFxcXG4gICAgbGV0IGNvbG9yID0gbW9kZSA9PSBpdGVtID8gXFxcXFxcXCIjRkZGRkZGXFxcXFxcXCIgOiBcXFxcXFxcIiMwMDAwMDBcXFxcXFxcIlxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGl0ZW0uZm9udGNvbG9yKGNvbG9yKSxcXFxcbiAgICAgIGNvbF90eXBlOiBcXFxcXFxcImZsZXhfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXQpID0+IHtcXFxcbiAgICAgICAgaWYgKGl0ID09IFxcXFxcXFwi57yW6L6RXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aXoOazleaJi+WKqOmAieaLqee8lui+kSzpnIDopoHlnKjljoblj7Lngrnlh7vnm7jlupTpobnnm65cXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChpdCA9PSBcXFxcXFxcIuaWsOWinlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgbGlzdE15VmFyS2V5cygpLmZpbHRlcihlID0+IGUuaW5jbHVkZXMoXFxcXFxcXCJzdWJtaXQuXFxcXFxcXCIpKS5mb3JFYWNoKGYgPT4ge1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihmKTtcXFxcbiAgICAgICAgICB9KVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwibmF2YnRuXFxcXFxcXCIsIGl0KTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICB9LCBpdGVtKSxcXFxcbiAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbW9kZSA9PSBpdGVtID8gXFxcXFxcXCIjRkYwMDUyRDlcXFxcXFxcIiA6IFxcXFxcXFwiI0ZGRThFOEU4XFxcXFxcXCJcXFxcbiAgICAgIH1cXFxcbiAgICB9KVxcXFxuICB9KVxcXFxuXFxcXG4gIGQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiKuWQjeensFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcblxcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJzdWJtaXRfbmFtZVxcXFxcXFwiLFxcXFxuICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFxcXFxcInN1Ym1pdC5uYW1lXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcInN1Ym1pdC5uYW1lXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgIH0pLFxcXFxuICAgIH1cXFxcbiAgfSlcXFxcblxcXFxuICBsZXQgdHlwZSA9IGdldE15VmFyKFxcXFxcXFwic3VibWl0LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJzaXRlXFxcXFxcXCIpO1xcXFxuICBsZXQgc2Vuc2l0aXZlID0gZ2V0TXlWYXIoXFxcXFxcXCJzdWJtaXQuc2Vuc2l0aXZlXFxcXFxcXCIsIFxcXFxcXFwiZmFsc2VcXFxcXFxcIik7XFxcXG5cXFxcbiAgdGFiKFxcXFxcXFwi57G75Z6LXFxcXFxcXCIsIFtcXFxcbiAgICBbXFxcXFxcXCLlvbHop4ZcXFxcXFxcIiwgXFxcXFxcXCJzaXRlXFxcXFxcXCJdLFxcXFxuICAgIFtcXFxcXFxcIueUteinhlxcXFxcXFwiLCBcXFxcXFxcImxpdmVcXFxcXFxcIl0sXFxcXG4gICAgW1xcXFxcXFwi6Kej5p6QXFxcXFxcXCIsIFxcXFxcXFwicGFyc2VcXFxcXFxcIl1cXFxcbiAgXSwgXFxcXFxcXCJzdWJtaXQudHlwZVxcXFxcXFwiLCB0eXBlLCBjb2xvcnMpO1xcXFxuXFxcXG4gIHRhYih7IHRpdGxlOiBcXFxcXFxcIuaVj+aEn1xcXFxcXFwiLCB1cmw6IFxcXFxcXFwidG9hc3Q6Ly/lk47lkabnlrznrYnlnYfmlbDmja7mlY/mhJ/otYTmupBcXFxcXFxcIiB9LCBbXFxcXG4gICAgW1xcXFxcXFwi5ZCmXFxcXFxcXCIsIFxcXFxcXFwiZmFsc2VcXFxcXFxcIl0sXFxcXG4gICAgW1xcXFxcXFwi5pivXFxcXFxcXCIsIFxcXFxcXFwidHJ1ZVxcXFxcXFwiXSxcXFxcbiAgXSwgXFxcXFxcXCJzdWJtaXQuc2Vuc2l0aXZlXFxcXFxcXCIsIHNlbnNpdGl2ZSwgY29sb3JzKTtcXFxcblxcXFxuICAkLmV4dGVuZCh7XFxcXG4gICAgZnN1cmw6IFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NzAxM1xcXFxcXFwiLFxcXFxuICAgIGZzKCkge1xcXFxuICAgICAgbGV0IGZzID0gJC5yZXF1aXJlKCQuZnN1cmwpO1xcXFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZnMsIHtcXFxcbiAgICAgICAgZ2V0SW5mbzoge1xcXFxuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAocGF0aCkge1xcXFxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnZmlsZTovLycsICcnKTtcXFxcbiAgICAgICAgICAgIGxldCBjID0gZnMuc3RhdChwYXRoKS50b0pzb24oKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICAgIGZ1bGxwYXRoOiBwYXRoLFxcXFxuICAgICAgICAgICAgICBwYXRoOiBmcy5nZXRQYXJlbnRQYXRoKHBhdGgpLFxcXFxuICAgICAgICAgICAgICBmaWxlTmFtZTogYy5uYW1lLFxcXFxuICAgICAgICAgICAgICBleHRlbnNpb246IGMuZXR5cGUsXFxcXG4gICAgICAgICAgICAgIG5hbWU6IGMud29lbmFtZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXFxcXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcXFxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfSk7XFxcXG4gICAgICByZXR1cm4gZnM7XFxcXG4gICAgfSxcXFxcbiAgICBnZXRNSU1FKGZpbGVQYXRoKSB7XFxcXG4gICAgICBjb25zdCBQYXRocyA9IGphdmEubmlvLmZpbGUuUGF0aHM7XFxcXG4gICAgICBjb25zdCBGaWxlcyA9IGphdmEubmlvLmZpbGUuRmlsZXM7XFxcXG4gICAgICBsZXQgcGF0aCA9IFBhdGhzLmdldChmaWxlUGF0aCk7XFxcXG4gICAgICBsZXQgbWltZVR5cGU7XFxcXG4gICAgICB0cnkge1xcXFxuICAgICAgICBtaW1lVHlwZSA9IEZpbGVzLnByb2JlQ29udGVudFR5cGUocGF0aCk7XFxcXG4gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgLy9sb2coXFxcXFxcXCJNSU1FIHR5cGUgb2YgdGhlIGZpbGUgaXM6IFxcXFxcXFwiICsgbWltZVR5cGUpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgIGxvZyhcXFxcXFxcIk1JTUUgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cXFxcXFxcIik7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAobWltZVR5cGUpIHtcXFxcbiAgICAgICAgcmV0dXJuIFN0cmluZyhtaW1lVHlwZSkucmVwbGFjZShcXFxcXFxcImFwcGxpY2F0aW9uXFxcXFxcXCIsIFxcXFxcXFwidGV4dFxcXFxcXFwiKTtcXFxcbiAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHJldHVybjtcXFxcbiAgICAgIH1cXFxcbiAgICB9XFxcXG4gIH0pXFxcXG5cXFxcblxcXFxuICBkLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIirmlbDmja5cXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuebtOmTvui+k+WFpSzngrnlh7vop6blj5Hmlofku7bkuIrkvKBcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICBsZXQgbG9ja3RpbWUgPSBnZXRNeVZhcihcXFxcXFxcImxvY2t0aW1lXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgaWYgKGxvY2t0aW1lKSB7XFxcXG4gICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IG5ldyBEYXRlKCk7XFxcXG4gICAgICAgIGxvY2t0aW1lID0gbmV3IERhdGUocGFyc2VJbnQobG9ja3RpbWUpKTtcXFxcbiAgICAgICAgbGV0IHJ0aW1lID0gbG9ja3RpbWUgLSBjdXJyZW50ZGF0ZTtcXFxcbiAgICAgICAgaWYgKHJ0aW1lID4gMCkge1xcXFxuICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LiK5Lyg6ZSB5a6a5LitLOi/mOmcgOimgVxcXFxcXFwiICsgKHJ0aW1lIC8gMTAwMCkgKyBcXFxcXFxcIuenklxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9XFxcXG5cXFxcbiAgICAgIGxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9cXFxcXFxcIiksIFxcXFxcXFwiLi4vXFxcXFxcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXFxcbiAgICAgIGxldCBmID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXFxcXFwiKTtcXFxcbiAgICAgIHJldHVybiBmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcXFxuICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG5cXFxcbiAgICAgICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG4gICAgICAgICAgY29uc3QgZnMgPSAkLmZzKCk7XFxcXG4gICAgICAgICAgbG9nKFBBVEgpXFxcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJyUEFUSFxcXFxcXFwiLCBQQVRILnJlcGxhY2UoLyguKlxcXFxcXFxcLykuKi8sIFxcXFxcXFwiJDFcXFxcXFxcIikpO1xcXFxuICAgICAgICAgIGxldCBtaW1lID0gJC5nZXRNSU1FKFBBVEgpO1xcXFxuICAgICAgICAgIGxldCBpbmZvID0gZnMuZ2V0SW5mbyhQQVRIKTtcXFxcbiAgICAgICAgICBpbmZvW1xcXFxcXFwibWltZVxcXFxcXFwiXSA9IG1pbWU7XFxcXG4gICAgICAgICAgLy9sb2coaW5mbylcXFxcbiAgICAgICAgICB2YXIgY29udGVudCA9IGZzLnJlYWRGaWxlKFBBVEgpO1xcXFxuICAgICAgICAgIGxldCBzaGFyZV9lbmNvZGUgPSBnZXRJdGVtKFxcXFxcXFwic2hhcmVfZW5jb2RlXFxcXFxcXCIsIFxcXFxcXFwi5LiN57yW56CBXFxcXFxcXCIpO1xcXFxuICAgICAgICAgIGxldCBkcnB5RW5jcnlwdCA9ICQucmVxdWlyZShcXFxcXFxcImRycHlFbmNyeXB0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgIGlmIChzaGFyZV9lbmNvZGUgIT0gXFxcXFxcXCLkuI3nvJbnoIFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBkcnB5RW5jcnlwdC50cnlEZWNyeXB0KGNvbnRlbnQpO1xcXFxuICAgICAgICAgICAgbGV0IGVuY29kZXRleHQgPSBkcnB5RW5jcnlwdC5lbmNyeXB0KHJ1bGUsIHNoYXJlX2VuY29kZSk7XFxcXG4gICAgICAgICAgICBjb250ZW50ID0gZW5jb2RldGV4dDtcXFxcbiAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGV0IGN1cnJlbnRfbWF0Y2ggPSBkcnB5RW5jcnlwdC5nZXRSZWdleCgpO1xcXFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRfbWF0Y2gudGVzdChjb250ZW50KSkge1xcXFxuICAgICAgICAgICAgICBjb250ZW50PWJhc2U2NEVuY29kZShjb250ZW50KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgICAgLy9sb2coY29udGVudClcXFxcblxcXFxuICAgICAgICAgIGxldCBzdWJlID0gZmluZEl0ZW0oXFxcXFxcXCJzdWJtaXRfbmFtZVxcXFxcXFwiKS5leHRyYTtcXFxcbiAgICAgICAgICB1cGRhdGVJdGVtKFxcXFxcXFwic3VibWl0X25hbWVcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oc3ViZSwge1xcXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGluZm8ubmFtZVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICB9KVxcXFxuXFxcXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IEFQSS51cEZpbGUoaW5mbywgY29udGVudCk7XFxcXG4gICAgICAgICAgaWYgKHJlc3VsdC5jb2RlID09IDApIHtcXFxcbiAgICAgICAgICAgIGxvZyhyZXN1bHQuZGF0YSk7XFxcXG4gICAgICAgICAgICB0b2FzdChcXFxcXFxcIuS4iuS8oOWujOaIkFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFxcXFxcInN1Ym1pdF9kYXRhXFxcXFxcXCIpLmV4dHJhO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFxcXFxcInN1Ym1pdF9kYXRhXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiByZXN1bHQuZGF0YS51cmxcXFxcbiAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwibG9ja3RpbWVcXFxcXFxcIiwgU3RyaW5nKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMTAwMDApKTtcXFxcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcXFxuICAgICAgICBpbml0aWFsUGF0aDogZ2V0TXlWYXIoXFxcXFxcXCJyUEFUSFxcXFxcXFwiLCBwYXRoKSxcXFxcbiAgICAgICAgcGF0dGVybjogMCxcXFxcbiAgICAgICAgZmlsZVR5cGU6IFxcXFxcXFwiLmpzb258LmpzXFxcXFxcXCIsXFxcXG4gICAgICB9KVxcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICBpZDogXFxcXFxcXCJzdWJtaXRfZGF0YVxcXFxcXFwiLFxcXFxuICAgICAgcGFnZVRpdGxlOiBcXFxcXFxcIumAieaLqeaWh+S7tlxcXFxcXFwiLFxcXFxuICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgaGVpZ2h0OiAtMSxcXFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcXFxcXCJzdWJtaXQuZGF0YVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJzdWJtaXQuZGF0YVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICB9KVxcXFxuICAgIH1cXFxcbiAgfSlcXFxcblxcXFxuICBkLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIue8lueggTpcXFxcXFxcIiArIChnZXRJdGVtKFxcXFxcXFwic2hhcmVfZW5jb2RlXFxcXFxcXCIsIFxcXFxcXFwi5LiN57yW56CBXFxcXFxcXCIpID09IFxcXFxcXFwi5LiN57yW56CBXFxcXFxcXCIgPyBcXFxcXFxcIuaXoFxcXFxcXFwiIDogZ2V0SXRlbShcXFxcXFxcInNoYXJlX2VuY29kZVxcXFxcXFwiLCBcXFxcXFxcIuS4jee8lueggVxcXFxcXFwiKSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiZmxleF9idXR0b25cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIue8lueggeexu+Wei1xcXFxcXFwiLFxcXFxuICAgICAgICBvcHRpb25zOiBbXFxcXFxcXCLkuI3nvJbnoIFcXFxcXFxcIiwgXFxcXFxcXCJHemlwXFxcXFxcXCIsIFxcXFxcXFwiQmFzZTY0XFxcXFxcXCIsIFxcXFxcXFwiQUVTXFxcXFxcXCJdLFxcXFxuICAgICAgICBjb2w6IDEsXFxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXFxcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFxcXFxcInNoYXJlX2VuY29kZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInNoYXJlX2VuY29kZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcXFxcXCJzaGFyZV9lbmNvZGVcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi57yW56CBOlxcXFxcXFwiICsgKGdldEl0ZW0oXFxcXFxcXCJzaGFyZV9lbmNvZGVcXFxcXFxcIiwgXFxcXFxcXCLkuI3nvJbnoIFcXFxcXFxcIikgPT0gXFxcXFxcXCLkuI3nvJbnoIFcXFxcXFxcIiA/IFxcXFxcXFwi5pegXFxcXFxcXCIgOiBnZXRJdGVtKFxcXFxcXFwic2hhcmVfZW5jb2RlXFxcXFxcXCIsIFxcXFxcXFwi5LiN57yW56CBXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgICB9KVxcXFxuICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpbnB1dDtcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgIH0pO1xcXFxuICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgIGlkOiBcXFxcXFxcInNoYXJlX2VuY29kZVxcXFxcXFwiXFxcXG4gICAgfVxcXFxuICB9KVxcXFxuXFxcXG5cXFxcbiAgZC5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuaPj+i/sFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcblxcXFxuICAgIH0pLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxcXFxuICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcXFxuICAgICAgaGVpZ2h0OiAyLFxcXFxuICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFxcXFxcInN1Ym1pdC5kZXNjXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcInN1Ym1pdC5kZXNjXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgIH0pLFxcXFxuICAgIH1cXFxcbiAgfSlcXFxcblxcXFxuICBsZXQgZGVmZXh0ID0ge1xcXFxuICAgIHR5cGU6IDBcXFxcbiAgfVxcXFxuXFxcXG4gIGQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c21hbGw+6Kej5p6Q5aGr5YaZe1xcXFxcXFwidHlwZVxcXFxcXFwiOiAwfDF9IDDmoIfor4Z3ZWIgfCAx5qCH6K+GanNvblxcXFxcXFxcbuW9seinhuWhq+WGmXtcXFxcXFxcInR5cGVcXFxcXFxcIjogMHwxfSAw5qCH6K+GZHJweSB8IDHmoIfor4Z4YnBxPC9zbWFsbD4nLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgfSlcXFxcblxcXFxuICBkLnB1c2goe1xcXFxuICAgIGRlc2M6IFxcXFxcXFwi5omp5bGVXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgdHlwZTogJ3RleHRhcmVhJyxcXFxcbiAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXFxcbiAgICAgIGhlaWdodDogLTEsXFxcXG4gICAgICBkZWZhdWx0VmFsdWU6IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwic3VibWl0LmV4dFxcXFxcXFwiLCBkZWZleHQpLFxcXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcInN1Ym1pdC5leHRcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgfSksXFxcXG4gICAgfVxcXFxuICB9KVxcXFxuXFxcXG4gIGQucHVzaCh7XFxcXG4gICAgdGl0bGU6IG1vZGUgPT0gXFxcXFxcXCLmlrDlop5cXFxcXFxcIiA/IFxcXFxcXFwi5o+Q5LqkXFxcXFxcXCIgOiBcXFxcXFxcIuabtOaWsFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgIGxldCBtb2RlID0gZ2V0TXlWYXIoXFxcXFxcXCJuYXZidG5cXFxcXFxcIiwgXFxcXFxcXCLmlrDlop5cXFxcXFxcIik7XFxcXG4gICAgICBmdW5jdGlvbiBzdHJpbmdUb0Jvb2xlYW4oc3RyKSB7XFxcXG4gICAgICAgIHJldHVybiBzdHIgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XFxcXG4gICAgICB9XFxcXG4gICAgICBsZXQgZGF0YXMgPSB7XFxcXG4gICAgICAgIG5hbWU6IGdldE15VmFyKFxcXFxcXFwic3VibWl0Lm5hbWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgIGRlc2M6IGdldE15VmFyKFxcXFxcXFwic3VibWl0LmRlc2NcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgIHR5cGU6IGdldE15VmFyKFxcXFxcXFwic3VibWl0LnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJzaXRlXFxcXFxcXCIpLFxcXFxuICAgICAgICBzZW5zaXRpdmU6IHN0cmluZ1RvQm9vbGVhbihnZXRNeVZhcihcXFxcXFxcInN1Ym1pdC5zZW5zaXRpdmVcXFxcXFxcIiwgXFxcXFxcXCJmYWxzZVxcXFxcXFwiKSksXFxcXG4gICAgICAgIGV4dDogc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJzdWJtaXQuZXh0XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICBkYXRhOiBnZXRNeVZhcihcXFxcXFxcInN1Ym1pdC5kYXRhXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgfVxcXFxuICAgICAgaWYgKG1vZGUgPT0gXFxcXFxcXCLnvJbovpFcXFxcXFxcIikge1xcXFxuICAgICAgICBkYXRhc1tcXFxcXFxcImlkXFxcXFxcXCJdID0gZ2V0TXlWYXIoXFxcXFxcXCJzdWJtaXQuaWRcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAoIWRhdGFzLm5hbWUpIHtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lkI3np7DkuI3lj6/ku6XkuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgIH1cXFxcbiAgICAgIGlmICghZGF0YXMuZGF0YSkge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aVsOaNruS4jeWPr+S7peS4uuepulxcXFxcXFwiO1xcXFxuICAgICAgfVxcXFxuICAgICAgaWYgKGRhdGFzLnR5cGUgPT0gXFxcXFxcXCJsaXZlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgZGVsZXRlIGRhdGFzLmV4dFxcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICAgIGRhdGFzW1xcXFxcXFwiZXh0XFxcXFxcXCJdID0gSlNPTi5wYXJzZShkYXRhc1tcXFxcXFxcImV4dFxcXFxcXFwiXXx8XFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICB9Y2F0Y2goZSl7XFxcXG4gICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImV4dOmUmeivr++8jOW/hemhu+S4umpzb25cXFxcXFxcIjtcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgIFxcXFxuICAgICAgfVxcXFxuXFxcXG4gICAgICBsb2coZGF0YXMpXFxcXG4gICAgICBjb25zdCBBUEkgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIik7XFxcXG4gICAgICBsZXQgcmVzdWx0ID0gQVBJLnN1Ym1pdChkYXRhcyk7XFxcXG4gICAgICBpZiAocmVzdWx0LmNvZGUgPT0gMCkge1xcXFxuICAgICAgICBpZiAobW9kZSA9PSBcXFxcXFxcIue8lui+kVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgdG9hc3QoXFxcXFxcXCLmm7TmlrDmiJDlip86XFxcXFxcXCIgKyBBUEkuZGF0ZUZvcm1hdChuZXcgRGF0ZShyZXN1bHQuZGF0YS51cGRhdGVkX2F0KSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChtb2RlID09IFxcXFxcXFwi5paw5aKeXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICB0b2FzdChcXFxcXFxcIuaPkOS6pOaIkOWKnzpcXFxcXFxcIiArIEFQSS5kYXRlRm9ybWF0KG5ldyBEYXRlKHJlc3VsdC5kYXRhLmNyZWF0ZWRfYXQpKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH1cXFxcbiAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0pXFxcXG4gIH0pXFxcXG5cXFxcblxcXFxuICBkLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumHjee9rlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgIGxpc3RNeVZhcktleXMoKS5maWx0ZXIoZSA9PiBlLmluY2x1ZGVzKFxcXFxcXFwic3VibWl0LlxcXFxcXFwiKSkuZm9yRWFjaChmID0+IHtcXFxcbiAgICAgICAgY2xlYXJNeVZhcihmKTtcXFxcbiAgICAgIH0pXFxcXG4gICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXFxcXFwiO1xcXFxuICAgIH0pXFxcXG4gIH0pXFxcXG59XFxcXG5cXFxcbmlmICh0aSA9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICBsZXQgYXVkaXQgPSBnZXRNeVZhcihcXFxcXFxcImF1ZGl0aW5nXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICBsZXQgcmVzdWx0ID0gQVBJLmdldEhpc3RvcnkocGFnZSk7XFxcXG4gIGxldCBzcGxpdHBhZ2UgPSBNYXRoLmNlaWwocmVzdWx0LnRvdGFsIC8gMTYpO1xcXFxuICAvL2xvZyhzcGxpdHBhZ2UpO1xcXFxuICBsZXQgcGFnZXNob3cgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICBpZiAoc3BsaXRwYWdlID4gMSkge1xcXFxuICAgIHBhZ2VzaG93ID0gYFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdOmhteaVsCR7cGFnZX0vJHtzcGxpdHBhZ2V9YDtcXFxcbiAgfVxcXFxuICBpZiAocGFnZSA9PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIHRpdGxlOiBcXFxcXFxcIuaAu+aVsDpcXFxcXFxcIiArIHJlc3VsdC50b3RhbCArIHBhZ2VzaG93LFxcXFxuICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwicGFnZXNob3dcXFxcXFxcIixcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICB9XFxcXG4gICAgfSlcXFxcbiAgfSBlbHNlIHtcXFxcbiAgICBpZiAoc3BsaXRwYWdlID4gMSAmJiBwYWdlIDw9IHNwbGl0cGFnZSkge1xcXFxuICAgICAgdXBkYXRlSXRlbShcXFxcXFxcInBhZ2VzaG93XFxcXFxcXCIsIHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5oC75pWwOlxcXFxcXFwiICsgcmVzdWx0LnRvdGFsICsgcGFnZXNob3dcXFxcbiAgICAgIH0pXFxcXG4gICAgfVxcXFxuICB9XFxcXG5cXFxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcXFxuICAgIHRhYihudWxsLCBbXFxcXG4gICAgICBbXFxcXFxcXCLlhajpg6hcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIl0sXFxcXG4gICAgICBbXFxcXFxcXCLlrqHmoLjkuK1cXFxcXFxcIiwgXFxcXFxcXCItMVxcXFxcXFwiXSxcXFxcbiAgICAgIFtcXFxcXFxcIumAmui/h1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIl0sXFxcXG4gICAgICBbXFxcXFxcXCLpqbPlm55cXFxcXFxcIiwgXFxcXFxcXCItMlxcXFxcXFwiXSxcXFxcbiAgICBdLCBcXFxcXFxcImF1ZGl0aW5nXFxcXFxcXCIsIGF1ZGl0LCBjb2xvcnMsIHtcXFxcbiAgICAgIHRpdGxlOiBcXFxcXFxcIuagt+W8j1xcXFxcXFwiLFxcXFxuICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiLFxcXFxuICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBsZXQgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcXFxcXCJBUElcXFxcXFxcIikuaGlrZXJQb3AoKTtcXFxcbiAgICAgICAgbGV0IHN0eWxlcyA9IFsnJ10uY29uY2F0KGdldENvbFR5cGVzKCkpO1xcXFxuICAgICAgICBzdHlsZXMgPSBzdHlsZXMuZmlsdGVyKHggPT5cXFxcbiAgICAgICAgICAvKHRleHRffGZsZXgpLiovLnRlc3QoeCkgJiYgeCAhPSAndGV4dF9pY29uJyAmJiB4ICE9IFxcXFxcXFwidGV4dF81XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgc3R5bGUgPSBnZXRJdGVtKFxcXFxcXFwic3R5bGVcXFxcXFxcIiwgXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIik7XFxcXG4gICAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxcXG4gICAgICAgICAgb3B0aW9uczogc3R5bGVzLFxcXFxuICAgICAgICAgIGNvbHVtbnM6IDIsXFxcXG4gICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K+36YCJ5oupXFxcXFxcXCIsXFxcXG4gICAgICAgICAgcG9zaXRpb246IHN0eWxlcy5maW5kSW5kZXgoeCA9PiB4ID09IHN0eWxlKSxcXFxcbiAgICAgICAgICBjbGljayhzKSB7XFxcXG4gICAgICAgICAgICBoaWtlclBvcC5ydW5Pbk5ld1RocmVhZCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJzdHlsZVxcXFxcXFwiLCBzKTtcXFxcbiAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+agt+W8j+iuvue9ruS4ujpcXFxcXFxcIiArIHM7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICB9LFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgfSlcXFxcbiAgICB9KTtcXFxcbiAgfVxcXFxuXFxcXG4gIGxldCBjb2xvclRpdGxlID0gbmV3IE1hcChbXFxcXG4gICAgWzAsIHsgdmFsdWU6IFxcXFxcXFwi6YCa6L+HXFxcXFxcXCIsIGNvbG9yOiBcXFxcXFxcIiMyRUEzNzZcXFxcXFxcIiB9XSxcXFxcbiAgICBbLTEsIHsgdmFsdWU6IFxcXFxcXFwi5a6h5qC4XFxcXFxcXCIsIGNvbG9yOiBcXFxcXFxcIiM0NTgyRTZcXFxcXFxcIiB9XSxcXFxcbiAgICBbLTIsIHsgdmFsdWU6IFxcXFxcXFwi6amz5ZueXFxcXFxcXCIsIGNvbG9yOiBcXFxcXFxcIiNmZjY2MDBcXFxcXFxcIiB9XVxcXFxuICBdKVxcXFxuXFxcXG4gIGxldCBsaXN0ID0gcmVzdWx0Lmxpc3Q7XFxcXG4gIC8vbG9nKGxpc3QubWFwKHggPT4geC5hdWRpdCkpXFxcXG4gIGlmIChhdWRpdCkge1xcXFxuICAgIGxpc3QgPSBsaXN0LmZpbHRlcihmID0+IGYuYXVkaXQgPT0gYXVkaXQpO1xcXFxuICB9XFxcXG4gIGxldCBodG1sc3R5bGUgPSB0cnVlO1xcXFxuICBsZXQgc3R5bGUgPSBnZXRJdGVtKFxcXFxcXFwic3R5bGVcXFxcXFxcIiwgXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIik7XFxcXG4gIGxpc3QuZm9yRWFjaChpdGVtID0+IHtcXFxcbiAgICAvL2xvZyhpdGVtKVxcXFxuICAgIGxldCB0aXRsZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgbGV0IGNhID0gY29sb3JUaXRsZS5nZXQoaXRlbS5hdWRpdCk7XFxcXG4gICAgbGV0IGNyID0gY2EudmFsdWUuZm9udGNvbG9yKGNhLmNvbG9yKTtcXFxcbiAgICBpZiAoc3R5bGUgPT0gXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIiB8fCBzdHlsZSA9PSBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIikge1xcXFxuICAgICAgdGl0bGUgPSBcXFxcXFxcIjxzbWFsbD7lkI3np7A6XFxcXFxcXCIgKyBpdGVtLm5hbWUgKyBcXFxcXFxcIjwvc21hbGw+XFxcXFxcXFxuPHNtYWxsPlxcXFxcXFwiICsgYOeKtuaAgToke2NyfVxcXFxcXFxcbuabtOaWsOaXtumXtDoke0FQSS5kYXRlRm9ybWF0KG5ldyBEYXRlKGl0ZW0udXBkYXRlZF9hdCkpfWAgKyBcXFxcXFxcIjwvc21hbGw+XFxcXFxcXCI7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgIHRpdGxlID0gXFxcXFxcXCJcXFxcXFxcIiArIGl0ZW0ubmFtZS5mb250Y29sb3IoY2EuY29sb3IpICsgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGh0bWxzdHlsZSkge1xcXFxuICAgICAgdGl0bGUgPSBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgdGl0bGU7XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICBjb2xfdHlwZTogc3R5bGUsXFxcXG4gICAgICBpbWc6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zZWxfZmlsbFxcXFxcXFwiLFxcXFxuICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG9iaikgPT4ge1xcXFxuICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XFxcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJzdWJtaXQuXFxcXFxcXCIgKyBrLCBvYmpba10pO1xcXFxuICAgICAgICB9KVxcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcInRpdGxlaVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwibmF2YnRuXFxcXFxcXCIsIFxcXFxcXFwi57yW6L6RXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgIH0sIGl0ZW0pLFxcXFxuICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaXRlbTogeyBpZDogaXRlbS5pZCB9LFxcXFxuICAgICAgICBsb25nQ2xpY2s6IFt7XFxcXG4gICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K+m5oOFXFxcXFxcXCIsXFxcXG4gICAgICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9wYWdlTG9hZD9yZWRpcmVjdD1jb250ZW50XFxcXFxcXCJcXFxcbiAgICAgICAgICB9LCBpdGVtKVxcXFxuICAgICAgICB9XVxcXFxuICAgICAgfVxcXFxuICAgIH0pXFxcXG4gIH0pXFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChkKVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcImRycHlFbmNyeXB0XFxcIixcXFwicGF0aFxcXCI6XFxcImRycHlFbmNyeXB0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IEZpbGVVdGlsID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnV0aWxzLkZpbGVVdGlsO1xcXFxubGV0IGphdmFTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nO1xcXFxubGV0IEJhc2U2NCA9IGphdmEudXRpbC5CYXNlNjQ7XFxcXG5jb25zdCBHWklQT3V0cHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtO1xcXFxuY29uc3QgR1pJUElucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07XFxcXG5jb25zdCBEZWZsYXRlck91dHB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07XFxcXG5jb25zdCBJbmZsYXRlcklucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtO1xcXFxuY29uc3QgRGVmbGF0ZXJJbnB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJJbnB1dFN0cmVhbTtcXFxcbmNvbnN0IEJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtO1xcXFxuY29uc3QgQnl0ZUFycmF5SW5wdXRTdHJlYW0gPSBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtO1xcXFxuY29uc3QgRGVmbGF0ZXIgPSBqYXZhLnV0aWwuemlwLkRlZmxhdGVyO1xcXFxuXFxcXG5mdW5jdGlvbiB6aXAodGV4dCwgbW9kZSkge1xcXFxuICBtb2RlID0gbW9kZSA/IG1vZGUgOiBcXFxcXFxcImd6aXBcXFxcXFxcIjtcXFxcbiAgbGV0IGJhc2VTdHIgPSBuZXcgamF2YVN0cmluZyh0ZXh0KTtcXFxcbiAgLy8g5L2/55SoIEJ5dGVBcnJheU91dHB1dFN0cmVhbSDmnaXmjZXojrfljovnvKnlkI7nmoTmlbDmja5cXFxcbiAgdmFyIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XFxcXG4gIGlmIChtb2RlID09IFxcXFxcXFwiZGVmbGF0ZVxcXFxcXFwiKSB7XFxcXG4gICAgdmFyIGRlZmxhdGVyID0gbmV3IGphdmEudXRpbC56aXAuRGVmbGF0ZXIoKTtcXFxcbiAgICBkZWZsYXRlci5zZXRMZXZlbChqYXZhLnV0aWwuemlwLkRlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pO1xcXFxuICAgIHZhciBkb3MgPSBuZXcgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbShiYW9zLCBkZWZsYXRlcik7XFxcXG4gICAgZG9zLndyaXRlKGJhc2VTdHIuZ2V0Qnl0ZXMoXFxcXFxcXCJVVEYtOFxcXFxcXFwiKSk7XFxcXG4gICAgZG9zLmZpbmlzaCgpOyAvLyDlrozmiJDljovnvKlcXFxcbiAgICBkb3MuY2xvc2UoKTtcXFxcbiAgfSBlbHNlIHtcXFxcbiAgICB2YXIgZ3pvcyA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0oYmFvcyk7XFxcXG4gICAgZ3pvcy53cml0ZShiYXNlU3RyLmdldEJ5dGVzKFxcXFxcXFwiVVRGLThcXFxcXFxcIikpO1xcXFxuICAgIGd6b3MuY2xvc2UoKTsgLy8g5YWz6Zet5Y6L57yp5rWBXFxcXG4gIH1cXFxcbiAgLy8g5bCG5Y6L57yp5ZCO55qE5pWw5o2u6L2s5o2i5Li6IEJhc2U2NCDnvJbnoIHnmoTlrZfnrKbkuLJcXFxcbiAgdmFyIGNvbXByZXNzZWREYXRhID0gYmFvcy50b0J5dGVBcnJheSgpO1xcXFxuICB2YXIgYmFzZTY0U3RyaW5nID0gamF2YS51dGlsLkJhc2U2NC5nZXRFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoY29tcHJlc3NlZERhdGEpO1xcXFxuXFxcXG4gIC8vIOWFs+mXrSBCeXRlQXJyYXlPdXRwdXRTdHJlYW1cXFxcbiAgYmFvcy5jbG9zZSgpO1xcXFxuICByZXR1cm4gU3RyaW5nKGJhc2U2NFN0cmluZyk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHVuemlwKHRleHQsIG1vZGUpIHtcXFxcbiAgbW9kZSA9IG1vZGUgPyBtb2RlIDogXFxcXFxcXCJnemlwXFxcXFxcXCI7XFxcXG4gIHZhciBjb21wcmVzc2VkRGF0YSA9IEJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKHRleHQpO1xcXFxuICB2YXIgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb21wcmVzc2VkRGF0YSk7XFxcXG4gIHZhciBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO1xcXFxuICB2YXIgYnVmZmVyID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoamF2YS5sYW5nLkJ5dGUuVFlQRSwgMTAyNCk7XFxcXG4gIGlmIChtb2RlID09IFxcXFxcXFwiZ3ppcFxcXFxcXFwiKSB7XFxcXG4gICAgdmFyIGdpcyA9IG5ldyBHWklQSW5wdXRTdHJlYW0oYmFpcyk7XFxcXG4gICAgbGV0IGxlbjtcXFxcbiAgICB3aGlsZSAoKGxlbiA9IGdpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7XFxcXG4gICAgICBiYW9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXFxcbiAgICB9XFxcXG4gICAgZ2lzLmNsb3NlKCk7XFxcXG4gIH0gZWxzZSBpZiAobW9kZSA9PSBcXFxcXFxcImRlZmxhdGVcXFxcXFxcIikge1xcXFxuICAgIHZhciBpaXMgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShiYWlzKTtcXFxcbiAgICBsZXQgbGVuO1xcXFxuICAgIHdoaWxlICgobGVuID0gaWlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHtcXFxcbiAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBsZW4pO1xcXFxuICAgIH1cXFxcbiAgICBpaXMuY2xvc2UoKTtcXFxcbiAgfVxcXFxuICBiYWlzLmNsb3NlKCk7XFxcXG4gIGJhb3MuY2xvc2UoKTtcXFxcbiAgdmFyIGRlY29tcHJlc3NlZFN0cmluZyA9IG5ldyBqYXZhU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgXFxcXFxcXCJVVEYtOFxcXFxcXFwiKTtcXFxcbiAgLy8g5omT5Y2w6Kej5Y6L57yp5ZCO55qE5a2X56ym5LiyXFxcXG4gIHJldHVybiBTdHJpbmcoZGVjb21wcmVzc2VkU3RyaW5nKTtcXFxcbn1cXFxcblxcXFxubGV0IEdaSVAgPSB7XFxcXG4gIHppcCxcXFxcbiAgdW56aXBcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZW5jcnlwdChydWxlLCBlbmNvZGVNb2RlKSB7XFxcXG4gIGlmIChlbmNvZGVNb2RlID09PSBcXFxcXFxcIkd6aXBcXFxcXFxcIikge1xcXFxuICAgIHJ1bGUgPSBHWklQLnppcChydWxlKTtcXFxcbiAgfSBlbHNlIGlmIChlbmNvZGVNb2RlID09PSBcXFxcXFxcIkJhc2U2NFxcXFxcXFwiKSB7XFxcXG4gICAgcnVsZSA9IGJhc2U2NEVuY29kZShydWxlKTtcXFxcbiAgfSBlbHNlIGlmIChlbmNvZGVNb2RlID09PSBcXFxcXFxcIkFFU1xcXFxcXFwiKSB7XFxcXG4gICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcXFxcXCIpO1xcXFxuICAgIGxldCBrZXkgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VIZXgoXFxcXFxcXCI2ODZBNjQ2ODZFNzgwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgaXYgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VIZXgoXFxcXFxcXCI2NDdBNzk3OTY0NzMwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgdGV4dERhdGEgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VVVEY4KHJ1bGUpO1xcXFxuICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZW5jcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxcXG4gICAgICBtb2RlOiBcXFxcXFxcIkFFUy9DQkMvUEtDUzdQYWRkaW5nXFxcXFxcXCIsXFxcXG4gICAgICBpdjogaXZcXFxcbiAgICB9KTtcXFxcbiAgICBydWxlID0gZW5jcnlwdGVkMC50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcXFxuICB9XFxcXG4gIHJldHVybiBydWxlO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBkZWNyeXB0KHJ1bGUsIGVuY29kZU1vZGUpIHtcXFxcbiAgaWYgKGVuY29kZU1vZGUgPT09IFxcXFxcXFwiR3ppcFxcXFxcXFwiKSB7XFxcXG4gICAgcnVsZSA9IEdaSVAudW56aXAocnVsZSk7XFxcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcXFxcXCJCYXNlNjRcXFxcXFxcIikge1xcXFxuICAgIHJ1bGUgPSBiYXNlNjREZWNvZGUocnVsZSk7XFxcXG4gIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcXFxcXCJBRVNcXFxcXFxcIikge1xcXFxuICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXFxcXFwiKTtcXFxcbiAgICBsZXQga2V5ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXFxcXFwiNjg2QTY0Njg2RTc4MEEwQTBBMEEwQTBBMEEwQTBBMEFcXFxcXFxcIik7XFxcXG4gICAgbGV0IGl2ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXFxcXFwiNjQ3QTc5Nzk2NDczMEEwQTBBMEEwQTBBMEEwQTBBMEFcXFxcXFxcIik7XFxcXG4gICAgbGV0IHRleHREYXRhID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KHJ1bGUpO1xcXFxuICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZGVjcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxcXG4gICAgICBtb2RlOiBcXFxcXFxcIkFFUy9DQkMvUEtDUzdQYWRkaW5nXFxcXFxcXCIsXFxcXG4gICAgICBpdjogaXZcXFxcbiAgICB9KTtcXFxcbiAgICBydWxlID0gZW5jcnlwdGVkMC50b1N0cmluZygpO1xcXFxuICB9XFxcXG4gIHJldHVybiBydWxlO1xcXFxufVxcXFxuXFxcXG5sZXQgY3VycmVudF9tYXRjaCA9IC9eKFxcXFxcXFxccyspP1xcXFxcXFxce3x2YXIgcnVsZXxmdW5jdGlvbnxsZXQgfHZhciB8Y29uc3QgLztcXFxcblxcXFxuZnVuY3Rpb24gZ2V0UmVnZXgoKSB7XFxcXG4gIHJldHVybiBjdXJyZW50X21hdGNoO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0cnlEZWNyeXB0KHJ1bGUpIHtcXFxcbiAgaWYgKGN1cnJlbnRfbWF0Y2gudGVzdChydWxlKSkge1xcXFxuICAgIHJldHVybiBydWxlO1xcXFxuICB9XFxcXG4gIGxldCB0eXBlID0gW1xcXFxcXFwiR3ppcFxcXFxcXFwiLCBcXFxcXFxcIkJhc2U2NFxcXFxcXFwiLCBcXFxcXFxcIkFFU1xcXFxcXFwiXTtcXFxcbiAgZm9yIChsZXQgaXQgb2YgdHlwZSkge1xcXFxuICAgIGxvZyhpdClcXFxcbiAgICB0cnkge1xcXFxuICAgICAgbGV0IGNydWxlID0gZGVjcnlwdChydWxlLCBpdCk7XFxcXG4gICAgICBsb2coY3J1bGUuc2xpY2UoMCwgMTAwKSk7XFxcXG4gICAgICBsb2coY3VycmVudF9tYXRjaC50ZXN0KGNydWxlKSlcXFxcbiAgICAgIGlmIChjdXJyZW50X21hdGNoLnRlc3QoY3J1bGUpKSB7XFxcXG5cXFxcbiAgICAgICAgcmV0dXJuIGNydWxlO1xcXFxuICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHsgfVxcXFxuICB9XFxcXG4gIHJldHVybiBydWxlO1xcXFxufVxcXFxuJC5leHBvcnRzID0ge1xcXFxuICBnZXRSZWdleCxcXFxcbiAgZW5jcnlwdCxcXFxcbiAgZGVjcnlwdCxcXFxcbiAgdHJ5RGVjcnlwdFxcXFxufVxcXCJ9XVwiLFwicHJveHlcIjpcIlwifSIsInBpY1VybCI6IiNGRkYzRjNGMyIsInRpdGxlIjoiW+WQrF3lha3mnIjlkKzkuaZbRFNdIn0=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement