Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥帮助@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLkZpbGXlt6XlhbdcIixcInBhdGhcIjpcIkZpbGUuanNcIixcInJ1bGVcIjpcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuY29uc3Qge1xcbiAgICBGaWxlcyxcXG4gICAgUGF0aHMsXFxuICAgIFN0YW5kYXJkQ29weU9wdGlvbixcXG4gICAgU3RhbmRhcmRPcGVuT3B0aW9uXFxufSA9IGphdmEubmlvLmZpbGU7XFxuY29uc3QgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IGphdmFTY29wZSA9IG5ldyBKYXZhSW1wb3J0ZXIoamF2YS5pbywgamF2YS5sYW5nLCBqYXZhLmxhbmcucmVmbGVjdCwgamF2YS51dGlsLlZlY3Rvcik7XFxuXFxuZnVuY3Rpb24gZGVsZXRlRmlsZXMoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXCIgKyBmaWxlTmFtZSArIFxcXCLmlofku7bkuI3lrZjlnKhcXFwiKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGUoZmlsZU5hbWUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbn1cXG4vKipcXG4gKiDliKDpmaTljZXkuKrmlofku7ZcXG4gKiBcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOaWh+S7tueahOaWh+S7tuWQjVxcbiAqIEByZXR1cm4g5Y2V5Liq5paH5Lu25Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZUZpbGUoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgIGZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuaIkOWKn++8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuWksei0pe+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuXFxufVxcbi8qKlxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcbiAqIFxcbiAqIEBwYXJhbSBkaXJcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcbiAqIEByZXR1cm4g55uu5b2V5Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXG4gICAgLy8g5aaC5p6cZGly5LiN5Lul5paH5Lu25YiG6ZqU56ym57uT5bC+77yM6Ieq5Yqo5re75Yqg5paH5Lu25YiG6ZqU56ymXFxuICAgIGlmICghZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkge1xcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxuICAgIH1cXG4gICAgbGV0IGRpckZpbGUgPSBuZXcgRmlsZShkaXIpO1xcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXG4gICAgaWYgKCFkaXJGaWxlLmV4aXN0cygpIHx8ICFkaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgIC8vbG9nKFxcXCLliKDpmaTnm67lvZXlpLHotKVcXFwiICsgZGlyICsgXFxcIuebruW9leS4jeWtmOWcqO+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuICAgIGxldCBmbGFnID0gdHJ1ZTtcXG4gICAgLy8g5Yig6Zmk5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2KOWMheaLrOWtkOebruW9lSlcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgLy8g5Yig6Zmk5a2Q5paH5Lu2XFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7XFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7IC8vIOWIoOmZpOWtkOebruW9lVxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgLy8g5Yig6Zmk5b2T5YmN55uu5b2VXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2VXFxcIiArIGRpciArIFxcXCLmiJDlip/vvIFcXFwiKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOebruW9lVxcXCIgKyBkaXIgKyBcXFwi5aSx6LSl77yBXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuLy9jb3B55Y2V5Liq5paH5Lu2XFxuZnVuY3Rpb24gY29weUZpbGUoc291cmNlLCB0YXJnZXQsIGlzQ292ZXIpIHtcXG4gICAgbGV0IHNvdXJjZVBhdGggPSBQYXRocy5nZXQoc291cmNlKTtcXG4gICAgbGV0IHRhcmdldFBhdGggPSBQYXRocy5nZXQodGFyZ2V0KTtcXG4gICAgbGV0IGlzRXhpc3QgPSBGaWxlcy5leGlzdHModGFyZ2V0UGF0aCk7XFxuICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShzb3VyY2VQYXRoKSB8fCAoaXNFeGlzdCAmJiAhaXNDb3ZlcikgfHwgKGlzRXhpc3QgJiYgRmlsZXMuaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpKSB7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghaXNFeGlzdCkge1xcbiAgICAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKHRhcmdldFBhdGguZ2V0UGFyZW50KCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzQ292ZXIgPT09IHRydWUpIHtcXG4gICAgICAgICAgICBGaWxlcy5jb3B5KHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgRmlsZXMuY29weShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVUaW1lKHBhdGgpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXG4gICAgbGV0IGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7XFxuICAgIGxldCBkYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTtcXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXROYW1lKHBhdGgpIHtcXG4gICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldE5hbWUoKSArIFxcXCJcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpIHtcXG4gICAgdHlwZSA9IHR5cGUgfHwgXFxcImZpbGVcXFwiO1xcbiAgICBpZiAoIVtcXFwiZmlsZVxcXCIsIFxcXCJkaXJcXFwiXS5pbmNsdWRlcyh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFxcXCLnsbvlnovplJnor69cXFwiKTtcXG4gICAgbGV0IGZpbGVUeXBlID0gdHlwZSA9PT0gXFxcImZpbGVcXFwiID8gXFxcImlzRmlsZVxcXCIgOiBcXFwiaXNEaXJlY3RvcnlcXFwiO1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgYXJyYXkgPSBmaWxlLmxpc3RGaWxlcygpIHx8IFtdO1xcbiAgICBsZXQgcGF0aExpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgaWYgKGFycmF5W2ldW2ZpbGVUeXBlXSgpKSB7XFxuICAgICAgICAgICAgcGF0aExpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGFycmF5W2ldLmdldE5hbWUoKSArIFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBhcnJheVtpXS5nZXRQYXRoKCkgKyBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBOdW1iZXIoYXJyYXlbaV0ubGFzdE1vZGlmaWVkKCkpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChleHBhbmQpIHtcXG4gICAgICAgIHBhdGhMaXN0ID0gcGF0aExpc3QuZmlsdGVyKGl0ID0+IGl0Lm5hbWUuZW5kc1dpdGgoZXhwYW5kKSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHBhdGhMaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlcyhwYXRoLCB0eXBlLCBleHBhbmQpIHtcXG4gICAgbGV0IHR5cGVzID0ge1xcbiAgICAgICAgXFxcImZpbGVcXFwiOiBcXFwiaXNGaWxlXFxcIixcXG4gICAgICAgIFxcXCJkaXJcXFwiOiBcXFwiaXNEaXJlY3RvcnlcXFwiXFxuICAgIH07XFxuICAgIGxldCBmaWxlVHlwZSA9IHR5cGVzW3R5cGVdO1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgYXJyYXkgPSBmaWxlLmxpc3RGaWxlcygpIHx8IFtdO1xcbiAgICBsZXQgZmlsZUxpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGZpbGUgPSBhcnJheVtpXTtcXG4gICAgICAgIGlmICgoIWZpbGVUeXBlIHx8IGZpbGVbZmlsZVR5cGVdKCkpICYmICghZXhwYW5kIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4cGFuZCkpKSB7XFxuICAgICAgICAgICAgZmlsZUxpc3QucHVzaChmaWxlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gZmlsZUxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIHJlbmFtZUZpbGUoZnJvbVBhdGgsIG5hbWUpIHtcXG4gICAgbGV0IGZyb21GaWxlID0gbmV3IEZpbGUoZnJvbVBhdGgpO1xcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUoZnJvbUZpbGUuZ2V0UGFyZW50KCkgKyBcXFwiL1xcXCIgKyBuYW1lKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghZnJvbUZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodG9GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgaWYgKCF0b0ZpbGUuZGVsZXRlKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIG1vdmVGaWxlcyhmcm9tUGF0aCwgdG9QYXRoKSB7XFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKHRvUGF0aCk7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgICAgIGlmICghZGVsZXRlRmlsZXModG9QYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgRmlsZXMubW92ZShmcm9tRmlsZS50b1BhdGgoKSwgdG9GaWxlLnRvUGF0aCgpLCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZmlsZVdyaXRlKHBhdGgsIGNvbnRlbnQpIHtcXG4gICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgsIGNvbnRlbnQpXFxufVxcblxcbmZ1bmN0aW9uIGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSB7XFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxuICAgIGxldCBwYXRocyA9IGZpbGUudG9QYXRoKCk7XFxuICAgIGlmIChmaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICBGaWxlcy53cml0ZShwYXRocywgbmV3IGphdmFTdHJpbmcoY29udGVudCkuZ2V0Qnl0ZXMoKSwgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCwgY29udGVudCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGZpbGUpIHtcXG4gICAgaWYgKGZpbGUuaXNGaWxlKCkpIHtcXG4gICAgICAgIHJldHVybiBmaWxlLmxlbmd0aCgpO1xcbiAgICB9XFxuICAgIGxldCBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7XFxuICAgIGxldCB0b3RhbCA9IDA7XFxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XFxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xcbiAgICAgICAgICAgIHRvdGFsICs9IGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihjaGlsZCk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIHRvdGFsO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlU2l6ZShmaWxlUGF0aCkge1xcbiAgICAvL0J5dGVcXG4gICAgbGV0IHNpemUgPSBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIobmV3IEZpbGUoZmlsZVBhdGgpKTtcXG4gICAgaWYgKHNpemUgPCAwKSB7XFxuICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgfVxcbiAgICBsZXQgdW5pdEZvcm0gPSBbXFxcIkJ5dGVcXFwiLCBcXFwiS0JcXFwiLCBcXFwiTUJcXFwiLCBcXFwiR0JcXFwiLCBcXFwiVEJcXFwiXTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHVuaXRGb3JtLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgICAgICBpZiAoc2l6ZSA+IDEwMjQpIHtcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBzaXplLnRvRml4ZWQoMikucmVwbGFjZSgvKFxcXFwuMDApJC8sIFxcXCJcXFwiKSArIHVuaXRGb3JtW2ldO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBcXFwiRVJST1I65pWw5YC86L+H5aSnXFxcIjtcXG59XFxuLy/lrozmlbTlkIjlubZcXG4vKlxcbmZ1bmN0aW9uIGZpbGVDb21iaW5lKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGV4dGVuc2lvbiwgaW50ZXJjZXB0KSB7XFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxuICAgICAgICBjb25zdCBUTVBfQlVGRkVSX1NJWkUgPSAweDMwMDAwO1xcbiAgICAgICAgY29uc3QgQlVGRkVSX1NJWkUgPSAweDMwMDAwMDtcXG4gICAgICAgIC8v5ZCI5bm25Li05pe25paH5Lu2XFxuICAgICAgICBsZXQgaW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxuICAgICAgICBsZXQgdG1wRmlsZSA9IG5ldyBGaWxlKGZpbGVPdXQgKyBcXFwiLnRtcFxcXCIpO1xcbiAgICAgICAgbGV0IHRvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7XFxuICAgICAgICBsZXQgaW5wdXRGaWxlcyA9IGlucHV0RmlsZS5saXN0RmlsZXMoKTtcXG4gICAgICAgIGxldCB0YnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBUTVBfQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBpbnB1dEZpbGVzKSB7XFxuICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gaXMucmVhZCh0YnlzKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvcy53cml0ZSh0YnlzLCAwLCBsZW4pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdG9zLmNsb3NlKCk7XFxuICAgICAgICAvL+inhOWImeabv+aNouinhOWImTtcXG4gICAgICAgIGxldCBvdXRGaWxlID0gbmV3IEZpbGUoZmlsZU91dCk7XFxuICAgICAgICBpZiAodHlwZW9mIGludGVyY2VwdCA9PT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcbiAgICAgICAgICAgIGxldCBvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7XFxuICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgICAgIHdoaWxlICgobGVuID0gdGlzLnJlYWQoYnlzKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ieXMgPSBpbnRlcmNlcHQobmV3IFN0cmluZyhieXMsMCxsZW4pKTtcXG4gICAgICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpO1xcbiAgICAgICAgICAgIHRpcy5jbG9zZSgpO1xcbiAgICAgICAgICAgIG9zLmNsb3NlKCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgICAgIG91dEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRtcEZpbGUucmVuYW1lVG8ob3V0RmlsZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG59Ki9cXG4vL+aui1xcbmZ1bmN0aW9uIGZpbGVSdWxlKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdCkge1xcbiAgICB3aXRoKGphdmFTY29wZSkge1xcbiAgICAgICAgY29uc3QgQlVGRkVSX1NJWkUgPSAweDMwMDAwMDtcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxuICAgICAgICBpZiAoISh0bXBGaWxlLmV4aXN0cygpICYmIHRtcEZpbGUuaXNGaWxlKCkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXG5cXG4gICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcbiAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXG4gICAgICAgIGxldCBsZW4gPSAwO1xcbiAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcbiAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgIGxldCBuYnlzID0gaW50ZXJjZXB0KG5ldyBTdHJpbmcoYnlzLCAwLCBsZW4pKTtcXG4gICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxuICAgICAgICB9XFxuICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpO1xcbiAgICAgICAgdGlzLmNsb3NlKCk7XFxuICAgICAgICBvcy5jbG9zZSgpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gcmVhZEZpbGUocGF0aCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHBhdGhzID0gUGF0aHMuZ2V0KHBhdGgpO1xcbiAgICAgICAgaWYgKCFGaWxlcy5leGlzdHMocGF0aHMpKSByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICByZXR1cm4gU3RyaW5nKG5ldyBqYXZhU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRocykpKTtcXG4gICAgfSBjYXRjaCB7XFxuICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRGaWxlVGltZTogKHBhdGgpID0+IGdldEZpbGVUaW1lKHBhdGgpLFxcbiAgICBnZXRGaWxlUGF0aDogKHBhdGgsIHR5cGUsIGV4cGFuZCkgPT4gZ2V0RmlsZVBhdGgocGF0aCwgdHlwZSwgZXhwYW5kKSxcXG4gICAgZGVsZXRlRmlsZXM6IChwYXRoKSA9PiBkZWxldGVGaWxlcyhwYXRoKSxcXG4gICAgcmVuYW1lRmlsZTogKHBhdGgsIG5hbWUpID0+IHJlbmFtZUZpbGUocGF0aCwgbmFtZSksXFxuICAgIG1vdmVGaWxlczogKGZyb21QYXRoLCB0b1BhdGgpID0+IG1vdmVGaWxlcyhmcm9tUGF0aCwgdG9QYXRoKSxcXG4gICAgZmlsZVdyaXRlOiAocGF0aCwgY29udGVudCkgPT4gZmlsZVdyaXRlKHBhdGgsIGNvbnRlbnQpLFxcbiAgICBmaWxlV3JpdGVBcHBlbmQ6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCksXFxuICAgIGdldE5hbWU6IChwYXRoKSA9PiBnZXROYW1lKHBhdGgpLFxcbiAgICBnZXRGaWxlU2l6ZTogKGZpbGVQYXRoKSA9PiBnZXRGaWxlU2l6ZShmaWxlUGF0aCksXFxuICAgIGZpbGVSdWxlOiAoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSA9PiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpLFxcbiAgICBjb3B5RmlsZTogKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSA9PiBjb3B5RmlsZShzb3VyY2UsIHRhcmdldCwgaXNDb3ZlciksXFxuICAgIHJlYWRGaWxlOiAocGF0aCkgPT4gcmVhZEZpbGUocGF0aCksXFxuICAgIGdldEZpbGVzOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlcyhwYXRoLCB0eXBlLCBleHBhbmQpLFxcbiAgICBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXI6KGZpbGUpPT5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoZmlsZSlcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzJcIixcIm5hbWVcIjpcIiN2LuS4i+i9veWIl+ihqC3mma7pgJrkuIvovb1cIixcInBhdGhcIjpcImRvd25sb2FkLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHZpZXdDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcbiAgICBpbmZvOiB7fSxcXG4gICAgZGVmYXVsdFZpZXc6IFxcXCIwXFxcIlxcbn0sIE1ZX1BBUkFNUyk7XFxudmlld0NvbmZpZy5pbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIHJ1bGVOYW1lOiBcXFwiXFxcIixcXG4gICAgYm9va05hbWU6IFxcXCJcXFwiLFxcbiAgICBib29rVG9wUGljOiBcXFwiXFxcIixcXG4gICAgcGFyc2VDb2RlOiBcXFwiXFxcIixcXG4gICAgZGVjb2RlOiB1bmRlZmluZWQsXFxuICAgIHR5cGU6IFxcXCJjb21pY1xcXCIsXFxuICAgIGNvbWljU2NoZW1lOiBcXFwiMVxcXCIsXFxuICAgIGJvb2tJZDpcXFwiXFxcIixcXG59LCB2aWV3Q29uZmlnLmluZm8pO1xcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBkZWZhdWx0Vmlld1xcbn0gPSB2aWV3Q29uZmlnO1xcbnNldFBhZ2VUaXRsZShcXFwi6YCJ5oup5ZmofFxcXCIgKyBpbmZvLmJvb2tOYW1lKVxcblxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG52aWV3Q29uZmlnLmluZm8uYm9va05hbWUgPSBUb29sLnRleHRTaGllbGQodmlld0NvbmZpZy5pbmZvLmJvb2tOYW1lKTtcXG52aWV3Q29uZmlnLmluZm8ucnVsZU5hbWUgPSBUb29sLnRleHRTaGllbGQodmlld0NvbmZpZy5pbmZvLnJ1bGVOYW1lKTtcXG5cXG5jb25zdCBNWV9JRCA9IGluZm8ucnVsZU5hbWUgKyBcXFwiLy9cXFwiICsgaW5mby5ib29rTmFtZStcXFwiLy9cXFwiK2luZm8uYm9va0lkO1xcbmxldCBib2lkPWluZm8uYm9va0lkP1xcXCIkXFxcIitpbmZvLmJvb2tJZDpcXFwiXFxcIjtcXG5jb25zdCBjcGF0aD1cXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZStib2lkO1xcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG5sZXQgdmlld01vZGUgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBkZWZhdWx0Vmlldyk7XFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCB0YWdGaWx0ZXIgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiwgQ29uZmlnLmRlZl9Eb1ZpX1R5cGUpO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIpO1xcbn0sIE1ZX0lEKSk7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcblxcbmlmIChpc1N0YXJ0ID09PSBcXFwiMVxcXCIpIHtcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgZGVmYXVsdFZpZXcpO1xcbiAgICB2aWV3TW9kZSA9IFxcXCIxXFxcIjtcXG59XFxuXFxubGV0IGJhY2t1cENoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3Q7XFxuaWYgKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgaWYgKGNoYXB0ZXJMaXN0LnN0YXJ0c1dpdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIikpIHtcXG4gICAgICAgIGNoYXB0ZXJMaXN0ID0gZ2V0UGF0aChjaGFwdGVyTGlzdCkuc2xpY2UoNyk7XFxuICAgICAgICBiYWNrdXBDaGFwdGVyTGlzdCA9IGNoYXB0ZXJMaXN0O1xcbiAgICB9XFxuICAgIGNoYXB0ZXJMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIGNoYXB0ZXJMaXN0KSB8fCBcXFwiW11cXFwiKTtcXG59XFxubGV0IGNoYXB0ZXJBbGwgPSBjaGFwdGVyTGlzdDtcXG5jaGFwdGVyTGlzdCA9IGNoYXB0ZXJMaXN0Lm1hcCgoaXRlbSwgQ0lEKSA9PiB7XFxuICAgIGl0ZW0uQ0lEID0gQ0lEO1xcbiAgICBpdGVtLnRpdGxlID0gVG9vbC50ZXh0U2hpZWxkKGl0ZW0udGl0bGUpO1xcbiAgICByZXR1cm4gaXRlbTtcXG59KTtcXG5sZXQgcGFnZU51bSA9IE51bWJlcihnZXRNeVZhcihNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIsIFxcXCIxXFxcIikpO1xcbmxldCBjaGFwdGVyQ2h1bmsgPSBbY2hhcHRlckxpc3RdLmNvbmNhdChUb29sLmNodW5rKGNoYXB0ZXJMaXN0LCBDb25maWcudmlld1BhZ2VTaXplKSk7XFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyQ2h1bmtbcGFnZU51bV0gfHwgW107XFxuY29uc3QgZGVmX0RvVmlfU3R5bGUgPSBjaGFwdGVyQWxsLmxlbmd0aCA9PT0gMSA/IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIiA6IENvbmZpZy5kZWZfRG9WaV9TdHlsZTtcXG5cXG5mdW5jdGlvbiBzZXRUeXBlKCkge1xcbiAgICBsZXQgc2V0ID0gKHRhZywgcHV0KSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH07XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIChcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIikuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIDAsIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoYXB0ZXJDaHVuay5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IHRhZ1RleHQgPSAoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIFxcXCItXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiB0YWdUZXh0LFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0YWdGaWx0ZXIgPT09IFxcXCIwXFxcIiA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWFqOmDqFxcXCIuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIFxcXCIwXFxcIiwgTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRhZ0ZpbHRlciA9PT0gXFxcIjFcXFwiID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5pyq5LiL6L29XFxcIi5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLmnKrkuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgXFxcIjFcXFwiLCBNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFwiMlxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlt7LkuIvovb1cXFwiLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuW3suS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBcXFwiMlxcXCIsIE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBjaGFwdGVyVGVhbSA9IFtdO1xcbmxldCByZWNvcmQgPSBbXTtcXG5pZiAoaW5mby50eXBlID09PSBcXFwiY29taWNcXFwiKSB7XFxuICAgIGxldCBsYXp5ID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChpbnB1dCk7XFxuICAgICAgICBsZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gXFxcImZpbGU6Ly9cXFwiICsgaW5wdXQgKyBcXFwiL1xcXCIgKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNsaXN0LmpvaW4oXFxcIiYmXFxcIik7XFxuICAgIH0pO1xcblxcbiAgICBmdW5jdGlvbiBjb21GdW4oaSwgaXRlbSkge1xcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIGNwYXRoICsgXFxcIi9cXFwiICsgaSArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogcm9vdFBhdGggKyBsYXp5LFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGksXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFwiUGF0aFxcXCJdICtjcGF0aCwgXFxcImRpclxcXCIpLmZvckVhY2goKGZpbGUpID0+IHtcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgICAgIGlmIChhdHQubGVuZ3RoID09PSAzICYmIGF0dFsxXSA9PT0gKFxcXCJBXFxcIikpIHtcXG4gICAgICAgICAgICByZWNvcmQucHVzaChhdHRbMl0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBmdW5jdGlvbiBjb21GdW4oaSwgaXRlbSkge1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGksXFxuICAgICAgICAgICAgICAgIHBhdGg6IENvbmZpZy5ub3ZlbFBhdGggKyBjcGF0aCArIFxcXCIvXFxcIiArIGkgKyBcXFwiJEEkXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiLnR4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFwiUGF0aFxcXCJdICsgY3BhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi50eHRcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gVG9vbC5zcGxpdChmaWxlLm5hbWUsIFxcXCIkXFxcIiwgMik7XFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFwiQVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdLnNsaWNlKDAsIGF0dFsyXS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBjbGlja0Rvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKSB7XFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCBFbGVtZW50SW5kZXggPSBsb2FkaW5nVGVhbS5pbmRleE9mKGkpO1xcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb1cXFwiO1xcblxcbiAgICBsb2FkaW5nVGVhbS5wdXNoKGkpO1xcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShsb2FkaW5nVGVhbSkpO1xcbiAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCY4oCYXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCZ4oCZXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IHJlc3VsdCA9IFxcXCJ0b2FzdDovL+S4i+i9veWksei0pVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICB0b2FzdChcXFwi5byA5aeL5LiL6L29OlxcXCIgKyBpdGVtLnRpdGxlKTtcXG4gICAgICAgIGxldCBkb3dubG9hZCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0Rvd25sb2FkLmV4ZS5qc1xcXCIpO1xcbiAgICAgICAgcmVzdWx0ID0gZG93bmxvYWQoaXRlbSwgaW5mbywgaSwgTVlfSUQpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcInRvYXN0Oi8v5bey5LiL6L29XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgbG9hZGluZ1RlYW0uc3BsaWNlKEVsZW1lbnRJbmRleCwgMSk7XFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShsb2FkaW5nVGVhbSkpO1xcbiAgICB9XFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHNpbmdsZVZpZXcoKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y+N6L2s5YiX6KGoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjppc1JldmVyc2VcXFwiLCBpc1JldmVyc2UgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpc1JldmVyc2UsIE1ZX0lEKSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9pZD0zM252RHFiSEg3SFcmc2l6ZT00OCZmb3JtYXQ9Z2lmJnRva2VuPVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fMlxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5om56YeP5LiL6L29XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGlmIChsb2FkaW5nVGVhbS5sZW5ndGggPiAwKSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5pyJ5Lu75Yqh5rKh5pyJ5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICBpZiAoZ2V0QXBwVmVyc2lvbigpIDwgMjU5NCkgcmV0dXJuIFxcXCJ0b2FzdDovL+acquW8gOaUvlxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG5cXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPTB1YWZhTU56eGo4OCZ0b2tlbj1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJcXFwiXFxuICAgIH0pO1xcbiAgICBzZXRUeXBlKCk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGZvciAobGV0IGkgPSAwLCBpdGVtID0gY2hhcHRlckxpc3RbMF07IGkgPCBjaGFwdGVyTGlzdC5sZW5ndGg7IGl0ZW0gPSBjaGFwdGVyTGlzdFsrK2ldKSB7XFxuICAgICAgICBsZXQgaXNfZG93bmxvYWQgPSByZWNvcmQuaW5jbHVkZXMoaXRlbS50aXRsZSk7XFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBjaGFwdGVyVGVhbS5wdXNoKGNvbUZ1bihpdGVtLkNJRCwgaXRlbSkpO1xcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMlxcXCIpIHtcXG4gICAgICAgICAgICBjaGFwdGVyVGVhbS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGxvYWRpbmdUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiIDogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGNsaWNrRG93bmxvYWQsIGl0ZW0sIGluZm8sIE1ZX0lELCBpdGVtLkNJRCksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpdGVtLkNJRFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBjbGlja0Nob29zZSh0aXRsZSwgTVlfSUQsIGkpIHtcXG4gICAgbGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpO1xcbiAgICBpZiAoaXNTdGFydCA9PT0gXFxcIjFcXFwiKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcIjtcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gYmF0Y2hUZWFtLmluZGV4T2YoaSk7XFxuICAgIGlmIChFbGVtZW50SW5kZXggPiAtMSkge1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGJhdGNoVGVhbS5zcGxpY2UoRWxlbWVudEluZGV4LCAxKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCY4oCYXFxcIiArIHRpdGxlICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgYmF0Y2hUZWFtLnB1c2goaSk7XFxuICAgIH1cXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBiYXRjaFZpZXcoKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y2V6YCJ5LiL6L29XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9pZD1QSWljdkY2ZWJ6TW4mc2l6ZT00OCZmb3JtYXQ9Z2lmJnRva2VuPVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIikgPT09IFxcXCIxXFxcIikgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOaJuemHj+S4i+i9vVxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IHN0YXJ0ID0gQ29uZmlnLnZpZXdQYWdlU2l6ZSAqIE1hdGgubWF4KHBhZ2VOdW0gLSAxLCAwKTtcXG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgY2hhcHRlckxpc3QubGVuZ3RoO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIumAieaLqeWFqOmDqFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0xSFZjSExvTnpyaXQmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKSA9PT0gXFxcIjFcXFwiKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L295ZOmflxcXCI7XFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgY2hvb3NlVGVhbSA9IFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCk7XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IEFycmF5LmZyb20obmV3IFNldChiYXRjaFRlYW0uY29uY2F0KGNob29zZVRlYW0pKSk7XFxuICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoKGkpID0+ICFjb21wbGV0ZWQuaW5jbHVkZXMoaSkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWPlua2iOWFqOmDqFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD1IekVqUHBJM05MOEQmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKSA9PT0gXFxcIjFcXFwiKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L295ZOmflxcXCI7XFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgY2hvb3NlVGVhbSA9IG5ldyBTZXQoVG9vbC5yYW5nZShzdGFydCwgZW5kKSk7XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoeCA9PiAhY2hvb3NlVGVhbS5oYXMoeCkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuehruiupOmAieS4rVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD10TXJ2dGM2VDloVmImdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiLCBcXFwiLTFcXFwiKSAhPT0gXFxcIi0xXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L295ZOmflxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hUZWFtLmxlbmd0aCA9PT0gMCA/IFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeaciemAiVxcXCIgOiBcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoLnZpZXcjbm9SZWZyZXNoIyNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgfSwgTVlfSUQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBuZXdXaW5kb3c6IHRydWUsXFxuICAgICAgICAgICAgd2luZG93SWQ6IE1ZX0lEICsgXFxcIi8v5om56YeP5LiL6L29XFxcIixcXG4gICAgICAgICAgICBNWV9JRDogTVlfSUQsXFxuICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGJhY2t1cENoYXB0ZXJMaXN0LFxcbiAgICAgICAgICAgIGluZm86IGluZm9cXG4gICAgICAgIH0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIHNldFR5cGUoKTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgY29tcGxldGVkID0gW107XFxuICAgIGZvciAobGV0IGkgPSAwLCBpdGVtID0gY2hhcHRlckxpc3RbMF07IGkgPCBjaGFwdGVyTGlzdC5sZW5ndGg7IGl0ZW0gPSBjaGFwdGVyTGlzdFsrK2ldKSB7XFxuICAgICAgICBsZXQgaXNfZG93bmxvYWQgPSByZWNvcmQuaW5jbHVkZXMoaXRlbS50aXRsZSk7XFxuXFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQpIHtcXG4gICAgICAgICAgICBjb21wbGV0ZWQucHVzaChpdGVtLkNJRCk7XFxuICAgICAgICAgICAgaWYgKHRhZ0ZpbHRlciAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMlxcXCIpIHtcXG4gICAgICAgICAgICBjaGFwdGVyVGVhbS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGJhdGNoVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFwi4oCY4oCYXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCZ4oCZXFxcIiA6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShjbGlja0Nob29zZSwgaXRlbS50aXRsZSwgTVlfSUQsIGl0ZW0uQ0lEKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGl0ZW0uQ0lEXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpjb21wbGV0ZWRcXFwiLCBKU09OLnN0cmluZ2lmeShjb21wbGV0ZWQpKTtcXG59XFxuc3dpdGNoICh2aWV3TW9kZSkge1xcbiAgICBjYXNlIFxcXCIwXFxcIjpcXG4gICAgICAgIHNpbmdsZVZpZXcoKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIFxcXCIxXFxcIjpcXG4gICAgICAgIGJhdGNoVmlldygpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmlmIChpc1JldmVyc2UgPT09IFxcXCIxXFxcIikge1xcbiAgICBjaGFwdGVyVGVhbS5yZXZlcnNlKCk7XFxufVxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgY2hhcHRlclRlYW0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5om56YeP5LiL6L295ZmoXCIsXCJwYXRoXCI6XCJCYXRjaC52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5sZXQge1xcbiAgICBjaGFwdGVyTGlzdCxcXG4gICAgaW5mbyxcXG4gICAgTVlfSURcXG59ID0gTVlfUEFSQU1TO1xcbnNldFBhZ2VUaXRsZShcXFwi5LiL6L295ZmofFxcXCIraW5mby5ib29rTmFtZSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKChNWV9JRCkgPT4ge1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoKTtcXG59LCBNWV9JRCkpO1xcblxcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxuXFxubGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbmlmKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpe1xcbiAgICBjaGFwdGVyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIrY2hhcHRlckxpc3QpfHxcXFwiW11cXFwiKTtcXG59XFxubGV0IGNoYXB0ZXJUZWFtID0gYmF0Y2hUZWFtLm1hcCh2ID0+IHtcXG4gICAgbGV0IGNoYXB0ZXJJdGVtID0gY2hhcHRlckxpc3Rbdl07XFxuICAgIGNoYXB0ZXJJdGVtLkNJRCA9IHY7XFxuICAgIHJldHVybiBjaGFwdGVySXRlbTtcXG59KTtcXG5pZiAoaXNTdGFydCA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5byA5aeL5LiL6L29W1xcXCIgKyBjaGFwdGVyVGVhbS5sZW5ndGggKyBcXFwiXVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgbGV0IGRvd25sb2FkID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2hTdGF0aXN0aWNzLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYoaW5mby50eXBlPT09XFxcImNvbWljXFxcIiYmaW5mby5jb21pY1NjaGVtZT09PVxcXCIxXFxcIil7XFxuICAgICAgICAgICAgICAgIGRvd25sb2FkPWRvd25sb2FkLmI7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGRvd25sb2FkPWRvd25sb2FkLmE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkb3dubG9hZChjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpIHx8IFxcXCJ0b2FzdDovL+S4i+i9vemUmeivr1xcXCI7XFxuICAgICAgICB9LCBjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85byA5aeL5LiL6L29XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLku7vliqHliJfooajvvJpcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB9KTtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyVGVhbSkge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG59IGVsc2Uge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4i+i9vei/m+W6pjowL1xcXCIrY2hhcHRlclRlYW0ubGVuZ3RoLFxcbiAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneKWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh1xcXCIuZm9udGNvbG9yKFxcXCIjZTVlMWU0XFxcIikrXFxcIiAwJVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9vei/m+W6plxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWQjuWPsOS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJmdW5jOi8vYmFja2dyb3VuZFxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgfSk7XFxuXFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBbXFxcIlvlj5bmtojkuIvovb1dXFxcIiwgXFxcIlvmraPlnKjlgZzmraIuLi5dXFxcIiwgXFxcIlvov5Tlm55dXFxcIiwgXFxcIlvlpITnkIblpLHotKVdXFxcIiwgXFxcIlvph43mlrDlvIDlp4tdXFxcIl1bc3RhdHVzXSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+ato+WcqOWBnOatoi4uLl1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5Y+W5raI5LiL6L295Lu75YqhXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmmoLlgZwuLi5cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcXFwiMlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YCA5Ye65LiL6L295ZmoXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtcXFwiM1xcXCIsIFxcXCI0XFxcIl0uaW5jbHVkZXMoc3RhdHVzKSkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpsb2dcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mHjeaWsOeCueWHu+S4i+i9vVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7kuIvovb3ml6Xlv5c8L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzml6Xlv5dcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi4oCc4oCc4oCd4oCdJD5cXFwiK1xcXCLlvIDlp4vkuIvovb0uLi4uLi5cXFwiLmZvbnRjb2xvcihcXFwiIzAwZmYwMFxcXCIpLFxcbiAgICAgICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNsb2cjMFxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6ZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuaJuemHj+S4i+i9vee7n+iuoVwiLFwicGF0aFwiOlwiQmF0Y2hTdGF0aXN0aWNzLmpzXCIsXCJydWxlXCI6XCJjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcblxcbiQuZXhwb3J0cy5hID0gZnVuY3Rpb24oY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB7XFxuICAgIGlmIChjaGFwdGVyVGVhbS5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nqbrnmoTkuIvovb3pmJ/liJdcXFwiO1xcbiAgICB9XFxuXFxuICAgIHZhciBjb3VudCA9IDA7XFxuICAgIHZhciB0YXNrQ291bnQgPSBjaGFwdGVyVGVhbS5sZW5ndGg7XFxuICAgIHZhciBzdWNjZXNzQ0lEID0gW107XFxuICAgIHZhciBmYWlsTmFtZSA9IFtdO1xcbiAgICB2YXIgbG9nQ291bnQgPSAxO1xcbiAgICB2YXIgdGFza1RlYW0gPSBjaGFwdGVyVGVhbS5tYXAoY2hhcHRlckl0ZW0gPT4gKHtcXG4gICAgICAgIGZ1bmM6IHRhc2ssXFxuICAgICAgICBpZDogY2hhcHRlckl0ZW0udGl0bGUsXFxuICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgIGNoYXB0ZXJJdGVtOiBjaGFwdGVySXRlbSxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvLFxcbiAgICAgICAgICAgIE1ZX0lEOiBNWV9JRFxcbiAgICAgICAgfVxcbiAgICB9KSk7XFxuICAgIGxldCBsb2dOdW0gPSBDb25maWcubG9nTnVtO1xcblxcblxcbiAgICBmdW5jdGlvbiBwdXRMb2codGV4dCkge1xcbiAgICAgICAgbG9nKHRleHQpO1xcbiAgICAgICAgaWYgKGxvZ0NvdW50ID49IGxvZ051bSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW0oTVlfSUQgKyBcXFwiI2xvZyNcXFwiICsgKGxvZ0NvdW50IC0gMTApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGFkZEl0ZW1BZnRlcihNWV9JRCArIFxcXCJ8fOaXpeW/l1xcXCIsIHtcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIiQ+XFxcIiArIHRleHQsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNsb2cjXFxcIiArIGxvZ0NvdW50XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsb2dDb3VudCsrO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHRhc2sodGFza1BhcmFtKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2guZXhlLmpzXFxcIikodGFza1BhcmFtKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIocGVyY2gsIGlkLCBlcnJvciwgQ0lEKSB7XFxuICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgbGV0IGlzU3VjY2VzcyA9IGZhbHNlO1xcbiAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHtcXG4gICAgICAgICAgICBmYWlsTmFtZS5wdXNoKGlkKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3kuIvovb3lpLHotKXvvJpcXFwiICsgaWQgKyBcXFwiPEVSUk9SQCBcXFwiICsgZXJyb3IgKyBcXFwiPlxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPj0gMCkge1xcbiAgICAgICAgICAgIHN1Y2Nlc3NDSUQucHVzaChDSUQpO1xcbiAgICAgICAgICAgIGxldCByYXRpbyA9IChjb3VudCAvIHRhc2tDb3VudCkudG9GaXhlZCg0KTtcXG4gICAgICAgICAgICBsZXQgc3RyaXBDb3VudCA9IE1hdGguY2VpbChyYXRpbyAqIDEwKTtcXG4gICAgICAgICAgICBpc1N1Y2Nlc3MgPSB0cnVlO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS4i+i9vei/m+W6pu+8mlxcXCIgKyBzdWNjZXNzQ0lELmxlbmd0aCArIFxcXCIvXFxcIiArIHRhc2tDb3VudCxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi4paHXFxcIi5yZXBlYXQoc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXCIjZmZhYzJkXFxcIikgKyBcXFwi4paHXFxcIi5yZXBlYXQoMTAgLSBzdHJpcENvdW50KS5mb250Y29sb3IoXFxcIiNlNWUxZTRcXFwiKSArIFxcXCIgXFxcIiArIFN0cmluZygocmF0aW8gKiAxMDApKS5zbGljZSgwLCA1KSArIFxcXCIlXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9vei/m+W6plxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXeW3suWujOaIkOS4i+i9ve+8mlxcXCIgKyBpZCk7XFxuICAgICAgICB9IGVsc2UgaWYgKENJRCA9PT0gLTEpIHtcXG4gICAgICAgICAgICBmYWlsTmFtZS5wdXNoKGlkKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3lt7LlgZzmraLvvJpcXFwiICsgaWQpO1xcbiAgICAgICAgICAgIGNvdW50ID0gdGFza0NvdW50O1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKHRhc2tDb3VudCAhPT0gY291bnQpIHJldHVybjtcXG4gICAgICAgIGlmIChzdWNjZXNzQ0lELmxlbmd0aCA9PT0gdGFza0NvdW50KSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuKWh1xcXCIucmVwZWF0KDEwKS5mb250Y29sb3IoXFxcIiMwMGZmMDBcXFwiKSArIFxcXCIgMTAwJVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3ov5vluqZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIGxldCBmYWlsVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIodiA9PiAhc3VjY2Vzc0NJRC5pbmNsdWRlcyh2KSk7XFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoZmFpbFRlYW0pKTtcXG4gICAgICAgIGlmIChmYWlsVGVhbS5sZW5ndGggPiAwICYmIHN0YXR1cyAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIzXFxcIik7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCLkuIvovb3lpLHotKU6W1xcXCIgKyBmYWlsTmFtZS5qb2luKFxcXCJd77yMW1xcXCIpICsgXFxcIl3jgIJcXFwiKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJb5aSE55CG5aSx6LSlXVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiNFxcXCIpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXSPlt7LlgZzmraLmiYDmnInku7vliqHvvIzkvYblt7LmnInov5vluqbkuI3kvJrmtojlpLEjXFxcIik7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+mHjeaWsOW8gOWni11cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJicmVha1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMlxcXCIpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwi5LiL6L295Lu75YqhW1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIl3lt7Llhajpg6jmiJDlip/lrozmiJBcXFwiKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCJb6L+U5ZueXVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRvYXN0KFxcXCLkuIvovb3ku7vliqFbXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiXeW3suWujOaIkFxcXCIpO1xcbiAgICB9XFxuICAgIGxldCB0YXNrVGVhbUNodW5rID0gW107XFxuICAgIGlmIChDb25maWcudGhyZWFkTnVtID4gMCkge1xcbiAgICAgICAgdGFza1RlYW1DaHVuayA9IFRvb2wuY2h1bmsodGFza1RlYW0sIENvbmZpZy50aHJlYWROdW0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGFza1RlYW1DaHVuayA9IFt0YXNrVGVhbV07XFxuICAgIH1cXG4gICAgZm9yIChsZXQgdGFza0xpc3Qgb2YgdGFza1RlYW1DaHVuaykge1xcbiAgICAgICAgYmUodGFza0xpc3QsIHtcXG4gICAgICAgICAgICBmdW5jOiBsaXN0ZW5lclxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICBpZiAoc3RhdHVzID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgLy9sZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoZmFpbFRlYW0pKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjRcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvph43mlrDlvIDlp4tdXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9XFxuXFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG59O1xcblxcbiQuZXhwb3J0cy5iID0gZnVuY3Rpb24gY29taWMoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB7XFxuICAgIGlmIChjaGFwdGVyVGVhbS5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nqbrnmoTkuIvovb3pmJ/liJdcXFwiO1xcbiAgICB9XFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuXFxuICAgIGxldCBsb2dOdW0gPSBDb25maWcubG9nTnVtO1xcbiAgICBsZXQgbG9nQ291bnQgPSAwO1xcblxcbiAgICBmdW5jdGlvbiBwdXRMb2codGV4dCkge1xcbiAgICAgICAgbG9nKHRleHQpO1xcbiAgICAgICAgaWYgKGxvZ0NvdW50ID49IGxvZ051bSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW0oTVlfSUQgKyBcXFwiI2xvZyNcXFwiICsgKGxvZ0NvdW50IC0gMTApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGFkZEl0ZW1BZnRlcihNWV9JRCArIFxcXCJ8fOaXpeW/l1xcXCIsIHtcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIiQ+XFxcIiArIHRleHQsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNsb2cjXFxcIiArIGxvZ0NvdW50XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsb2dDb3VudCsrO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHRhc2sodGFza1BhcmFtKSB7XFxuICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWModGFza1BhcmFtLnVybCk7XFxuICAgICAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQocGljWzBdLCB0YXNrUGFyYW0uY2hhcHRlclBhdGggKyAodGFza1BhcmFtLmkgKyAxKSArIFxcXCIuanBnXFxcIiwgcGljWzFdLCB0YXNrUGFyYW0uZGVjb2RlKTtcXG4gICAgICAgICAgICAgICAgaWYgKGdldE15VmFyKHRhc2tQYXJhbS5NWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBlcnJvck51bSA9IDA7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGFza1BhcmFtLkNJRDtcXG4gICAgfVxcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XFxuICAgIGxldCBzdWNjZXNzQ0lEID0gW107XFxuXFxuICAgIGZ1bmN0aW9uIGxpc3RlbmVyKHBhcmFtLCBpZCwgZXJyb3IsIHJlc3VsdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB0b3RhbENvdW50Kys7XFxuXFxuICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5LiL6L295aSx6LSl77yaXFxcIiArIGlkICsgXFxcIjxFUlJPUkAgXFxcIiArIGVycm9yICsgXFxcIj5cXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5bey5YGc5q2i77yaXFxcIiArIGlkKTtcXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHBhcmFtLnBpdkNvdW50O1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxuICAgICAgICAgICAgICAgIGxldCByYXRpbyA9ICgoY291bnQgLyBwYXJhbS5waXZDb3VudCkpLnRvRml4ZWQoNCk7XFxuICAgICAgICAgICAgICAgIGxldCBzdHJpcENvdW50ID0gTWF0aC5jZWlsKHJhdGlvICogMTApO1xcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0ucGl2Q291bnQgPT09IHRvdGFsQ291bnQgJiYgdG90YWxDb3VudCA9PT0gY291bnQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDSUQucHVzaChwYXJhbS5DSUQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLkuIvovb3ov5vluqbvvJpcXFwiICsgKHN1Y2Nlc3NDSUQubGVuZ3RoKSArIFxcXCIvXFxcIiArIHBhcmFtLnRvdGFsLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi4paHXFxcIi5yZXBlYXQoc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXCIjZmZhYzJkXFxcIikgKyBcXFwi4paHXFxcIi5yZXBlYXQoMTAgLSBzdHJpcENvdW50KS5mb250Y29sb3IoXFxcIiNlNWUxZTRcXFwiKSArIFxcXCIgXFxcIiArIFN0cmluZygocmF0aW8gKiAxMDApKS5zbGljZSgwLCA1KSArIFxcXCIlXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L296L+b5bqmXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgLy9wdXRMb2coXFxcIltsaXN0ZW5lcl3lt7LlrozmiJDkuIvovb3vvJpcXFwiICsgaWQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodG90YWxDb3VudCAhPT0gcGFyYW0ucGl2Q291bnQpIHJldHVybjtcXG4gICAgICAgICAgICBpZiAodG90YWxDb3VudCA9PT0gY291bnQpIHtcXG4gICAgICAgICAgICAgICAgRmlsZS5yZW5hbWVGaWxlKHBhcmFtLmNoYXB0ZXJQYXRoLCBwYXJhbS5DSUQgKyBcXFwiJEEkXFxcIiArIFRvb2wudGV4dFNoaWVsZChwYXJhbS50aXRsZSkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0b3RhbENvdW50ID0gY291bnQgPSAwO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiYnJlYWtcXFwiO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCB0YXNrVGVhbSA9IFtdO1xcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIFRvb2wudGV4dFNoaWVsZChpbmZvLmJvb2tOYW1lKSArIFxcXCIvXFxcIjtcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICBUb29sLnBpY0Rvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXCIuanBnXFxcIiwgYm9va1RvcFBpY1sxXSwgaW5mby5kZWNvZGUpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjaGFwdGVyVGVhbS5sZW5ndGg7IGsrKykge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBjaGFwdGVyVGVhbVtrXTtcXG4gICAgICAgIGxldCBvcmRlciA9IGs7XFxuICAgICAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIGl0ZW0uQ0lEICsgXFxcIiRCJFxcXCIgKyBUb29sLnRleHRTaGllbGQoaXRlbS50aXRsZSkgKyBcXFwiL1xcXCI7XFxuICAgICAgICBsZXQgcGljTGlzdCA9IFtdO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwidXJsXFxcIiwgXFxcImluZGV4XFxcIiwgXFxcInRpdGxlXFxcIiwgXFxcInJldHVyblxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxuICAgICAgICAgICAgcGljTGlzdCA9IGdldFBpY0xpc3QoaXRlbS51cmwsIGl0ZW0udXJsLCBrLCBpdGVtLnRpdGxlKTtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBpY0xpc3QgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHBpY0xpc3QgPSBwaWNMaXN0LnJlcGxhY2UoXFxcInBpY3M6Ly9cXFwiLCBcXFwiXFxcIikuc3BsaXQoXFxcIiYmXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocGljTGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor6/vvJrlm77niYfpk77mjqXov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5maWx0ZXIocCA9PiBwKTtcXG4gICAgICAgIHZhciB0YXNrVGVhbSA9IHBpY0xpc3QubWFwKCh1cmwsIGkpID0+ICh7XFxuICAgICAgICAgICAgZnVuYzogdGFzayxcXG4gICAgICAgICAgICBpZDogaSxcXG4gICAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICAgICAgY2hhcHRlclBhdGg6IGNoYXB0ZXJQYXRoLFxcbiAgICAgICAgICAgICAgICBNWV9JRDogTVlfSUQsXFxuICAgICAgICAgICAgICAgIGRlY29kZTogaW5mby5kZWNvZGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSk7XFxuICAgICAgICBiZSh0YXNrVGVhbSwge1xcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyLFxcbiAgICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgICAgIHBpdkNvdW50OiBwaWNMaXN0Lmxlbmd0aCxcXG4gICAgICAgICAgICAgICAgdG90YWw6IGNoYXB0ZXJUZWFtLmxlbmd0aCxcXG4gICAgICAgICAgICAgICAgb3JkZXI6IG9yZGVyLFxcbiAgICAgICAgICAgICAgICBDSUQ6IGl0ZW0uQ0lELFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgY2hhcHRlclBhdGg6IGNoYXB0ZXJQYXRoXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDQwKTtcXG4gICAgLy9sZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCBmYWlsVGVhbSA9IGNoYXB0ZXJUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYuQ0lEKSk7XFxuICAgIGxldCBmYWlsTmFtZSA9IGZhaWxUZWFtLm1hcChpdGVtID0+IGl0ZW0udGl0bGUpO1xcbiAgICBsZXQgYmF0Y2hUZWFtID0gZmFpbFRlYW0ubWFwKGl0ZW0gPT4gaXRlbS5DSUQpO1xcblxcbiAgICBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgIT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIzXFxcIik7XFxuICAgICAgICBwdXRMb2coXFxcIuS4i+i9veWksei0pTpbXFxcIiArIGZhaWxOYW1lLmpvaW4oXFxcIl3vvIxbXFxcIikgKyBcXFwiXeOAglxcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJb5aSE55CG5aSx6LSlXVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiNFxcXCIpO1xcbiAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFwiKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiW+mHjeaWsOW8gOWni11cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMlxcXCIpO1xcbiAgICAgICAgcHV0TG9nKFxcXCLkuIvovb3ku7vliqFbXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJb6L+U5ZueXVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuaJuemHj+S4u+eoi+W6j1wiLFwicGF0aFwiOlwiQmF0Y2guZXhlLmpzXCIsXCJydWxlXCI6XCJjb25zdCBNaWFuID0gJC5yZXF1aXJlKFxcXCJtYWluRG93bmxvYWRcXFwiKTtcXG5mdW5jdGlvbiBjb21pYyh0YXNrUGFyYW0pIHtcXG4gICAgbGV0IHtcXG4gICAgICAgIGNoYXB0ZXJJdGVtLFxcbiAgICAgICAgaW5mbyxcXG4gICAgICAgIE1ZX0lELFxcbiAgICB9ID0gdGFza1BhcmFtO1xcbiAgICByZXR1cm4gTWlhbi5jb21pYyhjaGFwdGVySXRlbSwgaW5mbywgY2hhcHRlckl0ZW0uQ0lELCBNWV9JRCwgdHJ1ZSl8fGNoYXB0ZXJJdGVtLkNJRDtcXG59XFxuXFxuZnVuY3Rpb24gbm92ZWwodGFza1BhcmFtKSB7XFxuICAgIGxldCB7XFxuICAgICAgICBjaGFwdGVySXRlbSxcXG4gICAgICAgIGluZm8sXFxuICAgICAgICBNWV9JRCxcXG4gICAgfSA9IHRhc2tQYXJhbTtcXG4gICAgcmV0dXJuIE1pYW4ubm92ZWwoY2hhcHRlckl0ZW0sIGluZm8sIGNoYXB0ZXJJdGVtLkNJRCxNWV9JRCwgdHJ1ZSl8fGNoYXB0ZXJJdGVtLkNJRDtcXG4gICAgLy9GaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIGNoYXB0ZXJJdGVtLkNJRCArIFxcXCIkQSRcXFwiICsgY2hhcHRlckl0ZW0udGl0bGUpO1xcbn1cXG52YXIgJGV4ZSA9IHtcXG4gICAgY29taWM6IGNvbWljLFxcbiAgICBub3ZlbDogbm92ZWxcXG59O1xcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhc2tQYXJhbSkge1xcbiAgICByZXR1cm4gJGV4ZVt0YXNrUGFyYW0uaW5mby50eXBlXSh0YXNrUGFyYW0pO1xcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZmcu5pmu6YCa5Li756iL5bqPXCIsXCJwYXRoXCI6XCJEb3dubG9hZC5leGUuanNcIixcInJ1bGVcIjpcImNvbnN0IE1pYW4gPSAkLnJlcXVpcmUoXFxcIm1haW5Eb3dubG9hZFxcXCIpO1xcbmZ1bmN0aW9uIG5vdmVsKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCkge1xcbiAgICBNaWFuLm5vdmVsKGl0ZW0sIGluZm8sIG9yZGVyKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIkBcXFwiICsgaXRlbS50aXRsZSArIFxcXCIg5LiL6L295a6M5oiQXFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gY29taWMoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKSB7XFxuICAgIE1pYW4uY29taWMoaXRlbSwgaW5mbywgb3JkZXIpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiQFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIiDkuIvovb3lrozmiJBcXFwiO1xcbn1cXG52YXIgJGV4ZSA9IHtcXG4gICAgY29taWM6IGNvbWljLFxcbiAgICBub3ZlbDogbm92ZWxcXG59O1xcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCkge1xcbiAgICByZXR1cm4gJGV4ZVtpbmZvLnR5cGVdKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCk7XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLumAmueUqOW3peWFt1wiLFwicGF0aFwiOlwiVG9vbC5qc1wiLFwicnVsZVwiOlwiY29uc3QgdiA9IHtcXG4gICAgc3BsaXQodGV4dCwgdGFyZ2V0LCBjb3VudCkge1xcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xcbiAgICAgICAgbGV0IGFycmF5ID0gW3RleHRdO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdGV4dCA9IGFycmF5W2ldO1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRleHQuaW5kZXhPZih0YXJnZXQpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGFycmF5W2ldID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XFxuICAgICAgICAgICAgYXJyYXlbaSArIDFdID0gdGV4dC5zbGljZShpbmRleCArIHRhcmdldC5sZW5ndGgpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGFycmF5O1xcbiAgICB9LFxcbiAgICBjaHVuayhhcnIsIHNpemUpIHtcXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpICs9IHNpemUpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnIuc2xpY2UoaSwgaSArIHNpemUpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGhpa2VyUGljKHVybCkge1xcbiAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTtcXG4gICAgICAgIGxldCB1cmxzID0gdXJsLnNwbGl0KFxcXCJAXFxcIik7XFxuICAgICAgICBsZXQgcGljVXJsID0gdXJscy5zaGlmdCgpO1xcbiAgICAgICAgbGV0IGxlbmd0aCA9IHVybHMubGVuZ3RoO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSB2LnNwbGl0KHVybHNbaV0sIFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXFxcImhlYWRlcnNcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIEpTT04ucGFyc2UodmFsdWUpKTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5pbmNsdWRlcyhcXFwiLlxcXCIpIHx8IGtleS5pbmNsdWRlcyhcXFwiP1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHBpY1VybCArPSBcXFwiQFxcXCIgKyBrZXkgKyAodmFsdWUgPyBcXFwiPVxcXCIgKyB2YWx1ZSA6IFxcXCJcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gXFxcImpzXFxcIikge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gW3BpY1VybCwgaGVhZGVyc107XFxuICAgIH0sXFxuICAgIHJhbmdlKHN0YXJ0LCBlbmQpIHtcXG4gICAgICAgIHJldHVybiBBcnJheShlbmQgLSBzdGFydCkuZmlsbCgwKS5tYXAoKGVsLCBpKSA9PiBzdGFydCArIGkpO1xcbiAgICB9LFxcbiAgICBwaWNEb3dubG9hZCh1cmwsIHBhdGgsIGhlYWRlcnMsIGRlY2lwaGUpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZGVjaXBoZSA9PT0gXFxcInN0cmluZ1xcXCIgJiYgZGVjaXBoZS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgbGV0IGluc3RyZWFtO1xcbiAgICAgICAgICAgIGxldCBvdXRzdHJlYW07XFxuICAgICAgICAgICAgbGV0IGZpbGU7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxuICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IGRpciA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpO1xcbiAgICAgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgIWRpci5leGlzdHMoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGlyLm1rZGlycygpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluc3RyZWFtID0gZmV0Y2godXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW06IHRydWVcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgICAgIG91dHN0cmVhbSA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7XFxuICAgICAgICAgICAgICAgIGxldCB0ID0gJC5oaWtlci5pbnB1dCxcXG4gICAgICAgICAgICAgICAgICAgIGMgPSAkLmhpa2VyLnVybDtcXG4gICAgICAgICAgICAgICAgJC5oaWtlci5pbnB1dCA9IGluc3RyZWFtO1xcbiAgICAgICAgICAgICAgICAkLmhpa2VyLnVybCA9IHVybDtcXG4gICAgICAgICAgICAgICAgbGV0IHBpY2luID0gKG5ldyBGdW5jdGlvbihcXFwicmV0dXJuIFxcXCIgKyBkZWNpcGhlKSkoKTtcXG4gICAgICAgICAgICAgICAgJC5oaWtlci5pbnB1dCA9IHQ7XFxuICAgICAgICAgICAgICAgICQuaGlrZXIudXJsID0gYztcXG4gICAgICAgICAgICAgICAgbGV0IGJ1ZiA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGphdmEubGFuZy5CeXRlLlRZUEUsIDEwMjQpO1xcbiAgICAgICAgICAgICAgICBsZXQgbGVuO1xcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IHBpY2luLnJlYWQoYnVmKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS53cml0ZShidWYsIDAsIGxlbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2xvc2VNZShpbnN0cmVhbSk7XFxuICAgICAgICAgICAgICAgIGNsb3NlTWUob3V0c3RyZWFtKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGNsb3NlTWUoaW5zdHJlYW0pO1xcbiAgICAgICAgICAgICAgICBjbG9zZU1lKG91dHN0cmVhbSk7XFxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgamF2YS5pby5GaWxlICYmIGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbG9nKFxcXCI86Kej5a+G5LiL6L29RXJyb3I+XFxcIiArIGUudG9TdHJpbmcoKSlcXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgICAgICAgICBjbG9zZU1lKGluc3RyZWFtKTtcXG4gICAgICAgICAgICAgICAgY2xvc2VNZShvdXRzdHJlYW0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKHVybCwgcGF0aCwgaGVhZGVycyk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHRleHRTaGllbGQodGV4dCkge1xcbiAgICAgICAgbGV0IGUgPSAvI3w6fCZ8XFxcXHx8XFxcXF58QHxcXFxcPHxcXFxcPnwlfFxcXFwvfFxcXFw/fFxcXFwkL2c7XFxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKGUsIFxcXCJfXFxcIik7XFxuICAgIH1cXG4gICAgXFxufVxcblxcbiQuZXhwb3J0cyA9IHY7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7kuLvpobXpnaJcIixcInBhdGhcIjpcIk1haW4udmlld1wiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gbWFpbigpIHtcXG4gICAgdmFyIGxheW91dCA9IFtdO1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG4gICAgbGV0IHR5cGUgPSBnZXRNeVZhcihcXFwiLnR5cGVcXFwiLCBnZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBDb25maWcuZGVmX0xvcmRfVHlwZSkpO1xcbiAgICBsZXQgdGdudW0gPSBnZXRNeVZhcihcXFwiLnRnbnVtXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKChNWV9JRCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwic2VhcmNoS2V5XFxcIik7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgfSkpO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcImNvbWljXFxcIiA/IFxcXCLil4nmvKvnlLtcXFwiIDogXFxcIuKXi+a8q+eUu1xcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcImNvbWljXFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnR5cGVcXFwiLCBcXFwiY29taWNcXFwiKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBcXFwiY29taWNcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHR5cGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXCJub3ZlbFxcXCIgPyBcXFwi4peJ5bCP6K+0XFxcIiA6IFxcXCLil4vlsI/or7RcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh0eXBlKSA9PiB7XFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXCJub3ZlbFxcXCIpIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi50eXBlXFxcIiwgXFxcIm5vdmVsXFxcIik7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwibWFpbjp0eXBlXFxcIiwgXFxcIm5vdmVsXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiLnRnbnVtXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB0eXBlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0eXBlID09PSBcXFwidHh0XFxcIiA/IFxcXCLil4nmlbTmnKzlsI/or7RcXFwiIDogXFxcIuKXi+aVtOacrOWwj+ivtFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcInR4dFxcXCIpIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQ29sbGVjdGVkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnR5cGVcXFwiLCBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwibWFpbjp0eXBlXFxcIiwgXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdHlwZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfSk7XFxuICAgIGlmICh0eXBlID09PSBcXFwidHh0XFxcIikge1xcbiAgICAgICAgbGV0IHR4dFZpZXcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9leHRlcm5hbGltcG9ydFR4dC52aWV3XFxcIik7XFxuICAgICAgICByZXR1cm4gdHh0VmlldyhsYXlvdXQpO1xcbiAgICB9XFxuICAgIGxldCB0YWcgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1t0eXBlICsgXFxcIlBhdGhcXFwiXSwgXFxcImRpclxcXCIpO1xcbiAgICBpZiAodGFnLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCIsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiuvue9rlxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHZlcnNpb246IE1ZX1JVTEUudmVyc2lvblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc5biu5Yqp4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaGVscC52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2tleXdvcmQ9bm92ZWxDb21pY1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+5ZWl6YO95rKh5pyJ6IC2PC9oMT4nLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc5L2g5oOz6KaB55qEI1xcXCIgKyB0eXBlICsgXFxcIiMuLi4uLi5cXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCLwn5SNXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygodGFnLCB0eXBlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIxID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIxLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ0aXRsZVxcXCI6IHRhZ1tpXS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzZWFyY2hfdXJsXFxcIjogXFxcImhpa2VyOi8vZW1wdHk/aXNBbGw9MSZzZWFyY2hUZXJtcz0qKiZ0eXBlPVxcXCIgKyB0eXBlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzZWFyY2hGaW5kXFxcIjogXFxcImpzOiQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL1NlYXJjaC52aWV3P3J1bGU9JytNWV9SVUxFLl90aXRsZSk7XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFycjEpO1xcbiAgICAgICAgICAgIH0sIHRhZywgdHlwZSksXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJjigJjimpnorr7nva7igJnigJlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb25cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuXFxuICAgIGZvciAobGV0IGkgaW4gdGFnKSB7XFxuICAgICAgICBsZXQgaXQgPSB0YWdbaV07XFxuICAgICAgICBpZiAodGdudW0gPT09IGkpIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0Lm5hbWUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFtcXFwi5Yig6Zmk6K+l55uu5b2VXFxcIiwgXFxcIui3s+i9rOWwj+eoi+W6j1xcXCIsIFxcXCLmiZPlvIDkuabmnrZcXFwiXSwgMSwgXFxcIumAieaLqeaTjeS9nFxcXCIpLnNlbGVjdCgoaXQsIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChcXFwi6Lez6L2s5bCP56iL5bqPXFxcIiA9PT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vaG9tZUBcXFwiICsgaXQubmFtZTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihcXFwi5Yig6Zmk6K+l55uu5b2VXFxcIj09PWlucHV0KXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0aGVuKFtcXFwi6K+l5pON5L2c5LiN5Lya5Yig6Zmk5bCP56iL5bqP77yM5L2G6K+l5bCP56iL5bqP5LiL6L2955qE5omA5pyJ5ryr55S75bCG6KKr5Yig6ZmkXFxcIl0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnIkg5ryr55S7L+Wwj+ivtCDlsIbooqvliKDpmaRcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXQucGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9Cb29rcmFjay52aWV3P3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnJ1bGVOYW1lPVxcXCIraXQubmFtZStcXFwiJnR5cGU9XFxcIit0eXBlO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpdCwgdHlwZSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi50Z251bVxcXCIsIGkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGkpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBwYXRoID0gdGFnW3RnbnVtXS5wYXRoO1xcbiAgICBsZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZGlyXFxcIik7XFxuXFxuICAgIGlmIChtaGxpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWVpemDveayoeacieiAtlxcXCIuYmlnKCksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBzZXRSZXN1bHQobGF5b3V0KTtcXG4gICAgfVxcbiAgICBsZXQgcGFnZVVybCA9IHR5cGUgPT09IFxcXCJub3ZlbFxcXCIgPyBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQnJvd3Nlci52aWV3XFxcIiA6IFxcXCJoaWtlcjovL3BhZ2UvQ29taWNCcm93c2VyLnZpZXdcXFwiO1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcbiAgICAgICAgbGV0IHBpYyA9IGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBpdGVtLnBhdGggKyBcXFwiL1xcXCIgKyBpdGVtLm5hbWUgKyBcXFwiLmpwZ1xcXCIpID8gaXRlbS5wYXRoICsgXFxcIi9cXFwiICsgaXRlbS5uYW1lICsgXFxcIi5qcGdcXFwiIDogQ29uZmlnLmRlZl9QaWM7XFxuICAgICAgICBsZXQgbmFtZXM9U3RyaW5nKGl0ZW0ubmFtZSkuc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZXNbMF0sXFxuICAgICAgICAgICAgZGVzYzogbmFtZXNbMV0sXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcbiAgICAgICAgICAgIHVybDogdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/cGFnZVVybCArIFxcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYWdlVXJsLCBwYXRoKT0+e1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJsb25nUHJlc3MuanNcXFwiKS5zaW5nbGVFbnRlcihwYWdlVXJsLCBwYXRoKTtcXG4gICAgICAgICAgICB9LCBwYWdlVXJsLCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKGl0ZW0sIHtcXG4gICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJsb25nUHJlc3MuanNcXFwiKS5kZWxldGVGaWxlRm9yQm9vayhwYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgfSwgaXRlbS5wYXRoKVxcbiAgICAgICAgICAgICAgICB9XSxcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0ucGF0aFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQobGF5b3V0KTtcXG59XFxuXFxubWFpbigpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCIjdi7mvKvnlLvnq6DoioLliJfooahcIixcInBhdGhcIjpcIkNvbWljQnJvd3Nlci52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJUb29sLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJDb25maWcuanNcXFwiKTtcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJGaWxlLmpzXFxcIik7XFxuaWYgKGdldFBhcmFtKFxcXCJoYXNQYXJhbXNcXFwiKSA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgIE1ZX1BBUkFNUyA9IHtcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpKSxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwibmFtZVxcXCIpKSxcXG4gICAgICAgIGJvb2tOYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcImJvb2tOYW1lXFxcIikpLFxcbiAgICAgICAgcnVsZU5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicnVsZU5hbWVcXFwiKSksXFxuICAgICAgICBjb21pY1N0eWxlOiBnZXRQYXJhbShcXFwiY29taWNTdHlsZVxcXCIpXFxuICAgIH1cXG59XFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXG5pZiAoIXBhdGgpIHtcXG4gICAgcGF0aCA9IENvbmZpZy5jb21pY1BhdGggKyBcXFwiL1xcXCIgKyBNWV9QQVJBTVMucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBNWV9QQVJBTVMuYm9va05hbWU7XFxufVxcbmlmIChNWV9QQVJBTVMuY29taWNTdHlsZSkge1xcbiAgICBDb25maWcuZGVmX0NvbWljX1N0eWxlID0gTVlfUEFSQU1TLmNvbWljU3R5bGU7XFxufVxcbnNldFBhZ2VUaXRsZShcXFwiQ1Z8XFxcIiArIChNWV9QQVJBTVMubmFtZSB8fCBGaWxlLmdldE5hbWUocGF0aCkpKTtcXG5cXG52YXIgbGF5b3V0ID0gW107XFxubGV0IG1vZGUgPSBnZXRNeVZhcihcXFwiLm1vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIFxcXCIwXFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiLm1vZGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIpO1xcbn0pKTtcXG5jb25zdCBjb21pY1N0YXR1cyA9IG5ldyBNYXAoW1xcbiAgICBbXFxcIkFcXFwiLCBcXFwiXFxcIl0sXFxuICAgIFtcXFwiQlxcXCIsIFxcXCLigJjigJhb5pyq5a6M5oiQXeKAmeKAmVxcXCJdXFxuXSk7XFxuXFxuZnVuY3Rpb24gZ2V0VGl0bGUodGl0bGUpIHtcXG4gICAgbGV0IHRpdGxlcyA9IFRvb2wuc3BsaXQodGl0bGUsIFxcXCIkXFxcIiwgMik7XFxuICAgIHJldHVybiBjb21pY1N0YXR1cy5nZXQodGl0bGVzWzFdKSArIHRpdGxlc1syXSB8fCB0aXRsZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VGl0bGUyKHRpdGxlKSB7XFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFwiJFxcXCIsIDIpO1xcbiAgICByZXR1cm4gdGl0bGVzWzJdIHx8IHRpdGxlO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pW05pysXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaTmlbTmnKzmvKvnlLvvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLnnIvmvKvnlLtcXFwiLCBcXFwi5Yig6Zmk56ug6IqCXFxcIl1bbW9kZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlXFxcIiwgbW9kZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBtb2RlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSlcXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZGlyXFxcIik7XFxubWhsaXN0LnNvcnQoKGEsIGIpID0+IHtcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIHJldHVybiBhIC0gYjtcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5YWx5pyJOlxcXCIgKyBtaGxpc3QubGVuZ3RoICsgXFxcIueroFxcXCIpLnNtYWxsKCksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpc1JldmVyc2UpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sZXQgYXJyYXkgPSBbXTtcXG5cXG5pZiAobW9kZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGlmIChDb25maWcuZGVmX2lzQ29taWNDb21wYXRpYmxlID09PSBcXFwiMFxcXCIpIHtcXG4gICAgICAgIGxldCBsYXp5ID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgc2hvcnRlbiA9IGlucHV0LnJlcGxhY2UoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKS5zbGljZSg3KSwgXFxcImhpa2VyOi8vZmlsZXMvXFxcIik7XFxuICAgICAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHNob3J0ZW4gKyBcXFwiL1xcXCIgKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInBpY3M6Ly9cXFwiICsgcGljbGlzdC5qb2luKFxcXCImJlxcXCIpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxuICAgICAgICAgICAgYXJyYXkucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiBpdGVtLnBhdGggKyBsYXp5LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9Db21pY19TdHlsZSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaXRlbS5wYXRoICsgXFxcIi8xLmpwZ1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvY29taWNDb21wYXRpYmxlLnZpZXcjYXV0b1BhZ2UjI3JlYWRUaGVtZSM/cGF0aD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0ucGF0aCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX0NvbWljX1N0eWxlLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdGVtLnBhdGggKyBcXFwiLzEuanBnXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRUaXRsZTIoaXRlbS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG59IGVsc2Uge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZTIoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5Yig6ZmkW1xcXCIgKyBuYW1lICsgXFxcIl3vvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX0NvbWljX1N0eWxlLFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0ucGF0aCArIFxcXCIvMS5qcGdcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAoaXNSZXZlcnNlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYXJyYXkucmV2ZXJzZSgpO1xcbn1cXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGFycmF5KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuiBmuWQiOaQnOe0olwiLFwicGF0aFwiOlwiU2VhcmNoLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanM/cnVsZT1cXFwiICsgTVlfUlVMRS5fdGl0bGUpO1xcbmxldCBjb21pY1J1bGVEaXJzID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWdbZ2V0UGFyYW0oXFxcInR5cGVcXFwiKSArIFxcXCJQYXRoXFxcIl0sIFxcXCJkaXJcXFwiKTtcXG5pZiAoZ2V0UGFyYW0oXFxcImlzQWxsXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICBjb21pY1J1bGVEaXJzID0gY29taWNSdWxlRGlycy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgPT09IE1ZX1JVTEUudGl0bGUpO1xcbn1cXG5cXG5sZXQgc2VhcmNoUmVzdWx0ID0gW107XFxubGV0IHNlYXJjaFRlcm1zPSBnZXRQYXJhbShcXFwic2VhcmNoVGVybXNcXFwiKTtcXG5sZXQgc2VhcmNoVGVzdDtcXG5cXG5pZiAoIWdldFNlYXJjaE1vZGUoKSkge1xcbiAgICBsZXQgdGVybXNBcnIgPSBzZWFyY2hUZXJtcy5zcGxpdChcXFwiXFxcIikubWFwKHQgPT4gdC5yZXBsYWNlKC9cXFxcKnxcXFxcLnxcXFxcP3xcXFxcK3xcXFxcJHxcXFxcXnxcXFxcW3xcXFxcXXxcXFxcKHxcXFxcKXxcXFxce3xcXFxcfXxcXFxcfHxcXFxcL3xcXFxcXFxcXC9nLCBrID0+IFxcXCJcXFxcXFxcXFxcXCIgKyBrKSk7XFxuICAgIGxldCByZWcgPSBuZXcgUmVnRXhwKHRlcm1zQXJyLmpvaW4oXFxcIi4qXFxcIiksIFxcXCJpXFxcIik7XFxuICAgIHNlYXJjaFRlc3QgPSB0ZXh0ID0+IHJlZy50ZXN0KHRleHQpO1xcbn0gZWxzZSB7XFxuICAgIHNlYXJjaFRlc3QgPSB0ZXh0ID0+IHNlYXJjaENvbnRhaW5zKHRleHQsIHNlYXJjaFRlcm1zLCBmYWxzZSk7XFxufVxcblxcbmxldCBwYWdlVXJsID0gZ2V0UGFyYW0oXFxcInR5cGVcXFwiKSA9PT0gXFxcIm5vdmVsXFxcIiA/IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFwiIDogXFxcImhpa2VyOi8vcGFnZS9Db21pY0Jyb3dzZXIudmlld1xcXCI7XFxuZm9yIChsZXQgc29uRGlyIG9mIGNvbWljUnVsZURpcnMpIHtcXG4gICAgbGV0IGNvbWljTGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgoc29uRGlyLnBhdGgsIFxcXCJkaXJcXFwiKTtcXG4gICAgZm9yIChsZXQgY29taWMgb2YgY29taWNMaXN0KSB7XFxuICAgICAgICBpZiAoc2VhcmNoVGVzdChjb21pYy5uYW1lKSkge1xcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNvbWljLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGNvbWljLnBhdGggKyBcXFwiL1xcXCIgKyBjb21pYy5uYW1lICsgXFxcIi5qcGdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IHBhZ2VVcmwgKyBcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBzb25EaXIubmFtZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IGNvbWljXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG59XFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7orr7nva5cIixcInBhdGhcIjpcIlNldHRpbmcudmlld1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKE1ZX1JVTEUudGl0bGUgKyBcXFwifOiuvue9rlxcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcblxcbmxldCBsYXlvdXQgPSBbXTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7ln7rnoYDorr7nva48L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi55uu5b2V6Lev5b6EXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWNvbnRlbnRzXFxcIixcXG4gICAgZGVzYzogQ29uZmlnLmhvbWVQYXRoLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K6+572u6buY6K6k5bCB6Z2iXFxcIixcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9QaWMsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1kZWZhdWx0UGljXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7kuIvovb3lmajorr7nva48L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5cXG5mdW5jdGlvbiBzZXROdW0oa2V5LCB0ZXN0KSB7XFxuICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0KTtcXG4gICAgaWYgKE51bWJlci5pc05hTihpbnB1dCkpIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmlbDlrZdcXFwiO1xcbiAgICBpZiAoIXRlc3QoaW5wdXQpKSByZXR1cm4gXFxcInRvYXN0Oi8v5LiN56ym5ZCI5p2h5Lu2XFxcIjtcXG4gICAgQ29uZmlnW2tleV0gPSBpbnB1dDtcXG4gICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCJsb2fmlbBcXFwiLFxcbiAgICB1cmw6ICQoQ29uZmlnLmxvZ051bSwgXFxcIjA8TjwxMDBcXFwiKS5pbnB1dChzZXROdW0sIFxcXCJsb2dOdW1cXFwiLCBpdCA9PiBpdCA+IDAgJiYgaXQgPCAxMDApLFxcbiAgICBkZXNjOiBcXFwiXFxcIiArIENvbmZpZy5sb2dOdW0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbmibnkuIvovb3mlbAoMOS4jeW8gOWQrylcXFwiLFxcbiAgICB1cmw6ICQoXFxcIlxcXCIgKyBDb25maWcudGhyZWFkTnVtLCBcXFwiTj4tMVxcXCIpLmlucHV0KHNldE51bSwgXFxcInRocmVhZE51bVxcXCIsIGl0ID0+IGl0ID4gLTEpLFxcbiAgICBkZXNjOiBcXFwiXFxcIiArIENvbmZpZy50aHJlYWROdW0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcblxcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWwj+ivtOmYheivu+WZqOiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpu5jorqTlvIDlkK/liIbpobXpmIXor7tcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGRlZl9pc1BhZ2luYXRlKSA9PiB7XFxuICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG5cXG4gICAgICAgIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSA9IGRlZl9pc1BhZ2luYXRlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCI7XFxuXFxuICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSksXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfaXNQYWdpbmF0ZSA9PT0gXFxcIjBcXFwiID8gXFxcIuS4jeW8gOWQr1xcXCIgOiBcXFwi5byA5ZCvXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuavj+mhteacgOWkp+eroOaVsFxcXCIsXFxuICAgIHVybDogJChDb25maWcudmlld1BhZ2VTaXplLCBcXFwiMzA8Tjw1MDBcXFwiKS5pbnB1dChzZXROdW0sIFxcXCJ2aWV3UGFnZVNpemVcXFwiLCBpdCA9PiBpdCA+IDMwICYmIGl0IDwgNTAwKSxcXG4gICAgZGVzYzogXFxcIlxcXCIgKyBDb25maWcudmlld1BhZ2VTaXplLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5pu/5o2i6KeE5YiZXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7mvKvnlLvpmIXor7vlmajorr7nva48L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YW85a655qih5byPXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChkZWZfaXNDb21pY0NvbXBhdGlibGUpID0+IHtcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcblxcbiAgICAgICAgQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSA9IGRlZl9pc0NvbWljQ29tcGF0aWJsZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiO1xcblxcbiAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBDb25maWcuZGVmX2lzQ29taWNDb21wYXRpYmxlKSxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSA9PT0gXFxcIjBcXFwiID8gXFxcIuS4jeW8gOWQr1xcXCIgOiBcXFwi5byA5ZCvXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua8q+eUu+WIl+ihqOagt+W8j1xcXCIsXFxuICAgIHVybDogJChbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiLCBcXFwicGljXzNcXFwiLCBcXFwicGljXzNfc3F1YXJlXFxcIiwgXFxcIm1vdmllXzNfbWFycXVlZVxcXCJdLCAxLCBcXFwi6K+36YCJ5oup5ryr55S75YiX6KGo5pi+56S65qC35byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgQ29uZmlnLmRlZl9Db21pY19TdHlsZSA9IGlucHV0O1xcbiAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBDb25maWcuZGVmX0NvbWljX1N0eWxlKSxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9Db21pY19TdHlsZXx8XFxcIlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWFtuS7luiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop4TliJnlj5HluIPpobVcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbHZlcjogTVlfUEFSQU1TLnZlcnNpb24gfHwgXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXCIsXFxuICAgICAgICBpZDogXFxcIjM1NTlcXFwiXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmgaLlpI3pu5jorqTorr7nva5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOaBouWkjem7mOiupOiuvue9ru+8n1xcXCIpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mgaLlpI3lrozmiJBcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heeQhue8k+WtmFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y2FjaGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5paH5Lu2566h55CGXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0ZpbGVNYW5hZ2VtZW50LnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sZXQgdGlkID0gRGF0ZS5ub3coKTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5qOA5rWL5pu05pawXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG9sZFZlcnNpb24sIHRpZCkgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL2Rldi9nZXRieWlkP2lkPTM1NTlcXFwiLCB7XFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDIwMDBcXG4gICAgICAgICAgICB9KSkucmVzdWx0LnZlcjtcXG4gICAgICAgICAgICBpZiAobmV3VmVyc2lvbiA8PSBvbGRWZXJzaW9uKSB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlt7Lnu4/mmK/mnIDmlrDniYjmnKzkuoZcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5paw54mI5pys5LqGXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHRpZCArIFxcXCIj6K6+572uX+abtOaWsFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5pyJ5paw54mI5pys6L+Y5pyq5pu05pawXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuacieaWsOeJiOacrOi/mOacquabtOaWsFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly81clczNlppVTZLZUc1NVdNNzcrbGFHOXRaVjl5ZFd4bFgzVnliTysvcFdoMGRIQTZMeTlvYVd0bGNpNXViMnRwWVM1d2NtVnpjeTlvYVd0bGNuVnNaUzl5ZFd4bGJHbHpkQzVxYzI5dVAybGtQVE0xTlRrPVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS/oeaBr+iOt+WPluWksei0pVxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pu05paw5L+h5oGv6I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgTVlfUEFSQU1TLnZlcnNpb24sIHRpZCksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogdGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIlxcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWFs+S6juWmguS9leiwg+eUqFxcXCIsXFxuICAgIHVybDogXFxcIm1xcWFwaTovL2ZvcndhcmQvdXJsP3NyY190eXBlPXdlYiZzdHlsZT1kZWZhdWx0JnBsZ19hdXRoPTEmdmVyc2lvbj0xJnVybF9wcmVmaXg9YUhSMGNITTZMeTl4ZFc0dWNYRXVZMjl0TDNGeGQyVmlMM0YxYm5CeWJ5OXphR0Z5WlQ5ZmQzWTlNeVpmZDNkMlBURXlPQ1pwYm5acGRHVkRiMlJsUFRGSVJubENTaVptY205dFBUSTBOall4TUNaaWFYbzlhMkVqTDI5MWRBPT1cXFwiLFxcbiAgICBkZXNjOiBcXFwi6K+m57uG54K55Ye75Yqg5YWl6aKR6YGTKOW/q+adpeWNjuWxseS4juaIkeiuultqaV3liZEpXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumXrumimOWPjemmiFxcXCIsXFxuICAgIHVybDogXFxcIm1xcWFwaTovL2ZvcndhcmQvdXJsP3NyY190eXBlPXdlYiZzdHlsZT1kZWZhdWx0JnBsZ19hdXRoPTEmdmVyc2lvbj0xJnVybF9wcmVmaXg9YUhSMGNITTZMeTl4ZFc0dWNYRXVZMjl0TDNGeGQyVmlMM0YxYm5CeWJ5OXphR0Z5WlQ5ZmQzWTlNeVpmZDNkMlBURXlPQ1poY0hCRGFHRnVibVZzUFhOb1lYSmxKbWx1ZG1sMFpVTnZaR1U5TVZoT1lXeEJSWGwyVm1vbVkyOXVkR1Z1ZEVsRVBXTXpiRWxRSm1KMWMybHVaWE56Vkhsd1pUMHlKbVp5YjIwOU1UZ3hNRGMwSm1KcGVqMXJZU1p0WVdsdVUyOTFjbU5sU1dROWMyaGhjbVVtYzNWaVUyOTFjbU5sU1dROWIzUm9aWEp6Sm1wMWJYQnpiM1Z5WTJVOWMyaHZjblIxY213PSZ0PTE2NzE4OTMxMjM1OTcjSW50ZW50O3NjaGVtZT1tcXFhcGk7cGFja2FnZT1jb20udGVuY2VudC5tb2JpbGVxcTtlbmRcXFwiLFxcbiAgICBkZXNjOiBcXFwi57ud5a+55LiN5Lya5pyJYnVnKOWViuaIkeS4jeaOpeWPlyEpXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuLypcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF6Zmk5bCP6K+05YiG6aG16K6w5b2VXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaTlsI/or7TliIbpobXorrDlvZXvvJ9cXFwiKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcIm5vdmVsRm9vdHByaW50Lmpzb25cXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuKi9cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5bCP6K+056ug6IqC5YiX6KGoXCIsXCJwYXRoXCI6XCJOb3ZlbEJyb3dzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuaWYgKGdldFBhcmFtKFxcXCJoYXNQYXJhbXNcXFwiKSA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgIE1ZX1BBUkFNUyA9IHtcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpKSxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwibmFtZVxcXCIpKVxcbiAgICB9XFxufVxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxuc2V0UGFnZVRpdGxlKFxcXCJOVnxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBmb290OiAwLFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxuICAgIGlzU2VnbWVudDogdHJ1ZVxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbnZhciBsYXlvdXQgPSBbXTtcXG5sZXQgbW9kZSA9IGdldE15VmFyKFxcXCIubW9kZVxcXCIsIFxcXCIwXFxcIik7XFxubGV0IG1vZGUyID0gZ2V0TXlWYXIoXFxcIi5tb2RlMlxcXCIsIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSk7XFxuXFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKFxcXCIuaXNSZXZlcnNlXFxcIiwgXFxcIjBcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCIubW9kZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIubW9kZTJcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIucGFnZU51bVxcXCIpO1xcbn0pKTtcXG5cXG5mdW5jdGlvbiBnZXRUaXRsZSh0aXRsZSkge1xcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgcmV0dXJuIHRpdGxlc1syXSAhPT0gdW5kZWZpbmVkID8gdGl0bGVzWzJdLnNsaWNlKDAsIHRpdGxlc1syXS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKSA6IHRpdGxlO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pW05pysXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaTmlbTmnKzlsI/or7TvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLnnIvlsI/or7RcXFwiLCBcXFwi5Yig6Zmk56ug6IqCXFxcIl1bbW9kZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlXFxcIiwgbW9kZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBtb2RlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAmOKAmOabtOWkmuWKn+iDvSA+4oCZ4oCZXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5cXG5mdW5jdGlvbiB0eHQocGF0aHMpIHtcXG4gICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWQiOW5ti4uLlxcXCIpO1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG4gICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRocy5wYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIik7XFxuICAgIGxldCBsaXN0TGVuZ3RoID0gZmlsZWxpc3QubGVuZ3RoO1xcbiAgICBpZiAobGlzdExlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nqbrnmoTnq6DoioJcXFwiO1xcbiAgICB9XFxuICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICBzZWxlY3RlZDogW10sXFxuICAgICAgICBpc1JlcGxhY2U6IHRydWVcXG4gICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGhzLnBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuICAgIGxldCBidWZpbGVsaXN0ID0gW107XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgZmlsZSA9IGZpbGVsaXN0W2ldO1xcbiAgICAgICAgbGV0IGZpbGVJbmZvID0gVG9vbC5zcGxpdChmaWxlLm5hbWUsIFxcXCIkXFxcIiwgMik7XFxuICAgICAgICBidWZpbGVsaXN0LnB1c2goe1xcbiAgICAgICAgICAgIG5hbWU6IGZpbGVJbmZvWzJdLnNsaWNlKDAsIGZpbGVJbmZvWzJdLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpLFxcbiAgICAgICAgICAgIHBhdGg6IFxcXCJmaWxlOi8vXFxcIiArIGZpbGUucGF0aCxcXG4gICAgICAgICAgICBpZDogTnVtYmVyKGZpbGVJbmZvWzBdKSB8fCAwXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBidWZpbGVsaXN0LnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTtcXG4gICAgbGV0IGVudGlyZVBhdGggPSBwYXRocy5wYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcIi50eHRcXFwiO1xcbiAgICBsZXQgZW50aXJlUGF0aHRvID0gYm9va0luZm8uaXNSZXBsYWNlID8gZW50aXJlUGF0aCArIFxcXCIudG1wXFxcIiA6IGVudGlyZVBhdGg7XFxuXFxuICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgZW50aXJlUGF0aCkpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLliJ3lp4vljJbmlofku7ZcXFwiKTtcXG4gICAgICAgIGlmICghRmlsZS5kZWxldGVGaWxlcyhlbnRpcmVQYXRoKSkge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIneWni+WMluWksei0pVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLliJ3lp4vljJbmiJDlip9cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBidWZpbGVsaXN0W2ldO1xcbiAgICAgICAgbGV0IGNvbnRlbnQgPSByZXF1ZXN0KGl0ZW0ucGF0aCk7XFxuICAgICAgICBGaWxlLmZpbGVXcml0ZUFwcGVuZChlbnRpcmVQYXRodG8sIGl0ZW0ubmFtZSArIFxcXCJcXFxcbuOAgOOAgFxcXCIgKyBjb250ZW50LnJlcGxhY2UoLyZuYnNwOy9nLFxcXCJcXFwiKS5zcGxpdCgvKFxcXFxufFxcXFxyKSsvKS5maWx0ZXIoaXQgPT4gaXQudHJpbSgpLmxlbmd0aCA+IDEpLm1hcChpdD0+aXQudHJpbSgpKS5qb2luKFxcXCJcXFxccuOAgOOAgFxcXCIpICsgXFxcIlxcXFxuXFxcXG5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoYm9va0luZm8uaXNSZXBsYWNlKSB7XFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICBsZXQgbGVuID0gcnVsZUxpc3QubGVuZ3RoO1xcbiAgICAgICAgbGV0IHJlcGxhY2VQYXR0ZXJuID0gW1xcXCJyZXBsYWNlXFxcIiwgXFxcInJlcGxhY2VBbGxcXFwiXTtcXG4gICAgICAgIGxldCBmbGFnID0gRmlsZS5maWxlUnVsZShlbnRpcmVQYXRodG8sIGVudGlyZVBhdGgsIChqYXZhU3RyaW5nKSA9PiB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgaWYgKCFib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gcmVwbGFjZVBhdHRlcm5bMCArIHJlcGxhY2VSdWxlLmlzUmVnZXhdO1xcbiAgICAgICAgICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBqYXZhU3RyaW5nLmdldEJ5dGVzKCk7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQiOW5tuWksei0pVxcXCI7XFxuICAgICAgICB9XFxuXFxuICAgIH1cXG4gICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQiOW5tuWujOaIkFxcXCI7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlkIjlubblsI/or7RcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruWumuWQiOW5tj9cXFxcbuS8muimhuebluW3suaciVRYVFxcXCIpLmNvbmZpcm0odHh0LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLimJDliIbpobVcXFwiLCBcXFwi4piR5YiG6aG1XFxcIl1bbW9kZTJdLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG1vZGUyKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLm1vZGUyXFxcIiwgbW9kZTIgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIG1vZGUyKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFtcXFwi4piQ5YiG5q61XFxcIiwgXFxcIuKYkeWIhuautVxcXCJdW051bWJlcihib29rSW5mby5pc1NlZ21lbnQpXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpc1NlZ21lbnQsIHBhdGgpID0+IHtcXG4gICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgIGJvb2tJbmZvLmlzU2VnbWVudCA9ICFpc1NlZ21lbnQ7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCtcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgYm9va0luZm8uaXNTZWdtZW50LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlh4DljJZcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDdXN0b20udmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCIsXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5aSW6YOo5p+l55yLXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG4gICAgICAgIGxldCBlbnRpcmVQYXRoID0gcGF0aC5yZXBsYWNlKENvbmZpZy5ub3ZlbFBhdGgsIENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSArIFxcXCIudHh0XFxcIjtcXG4gICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgZW50aXJlUGF0aCkpIHtcXG4gICAgICAgICAgICB0b2FzdChcXFwi6LCD55So56ys5LiJ5pa55bqU55So5omT5byA5paH5Lu2XFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFwiICsgZW50aXJlUGF0aFxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pys5Zyw5pqC5peg5Y+v5L6b5aSW6YOo5omT5byA55qEdHh05paH5Lu277yM6K+35YWI5ZCI5bm25bCP6K+077yBXFxcIlxcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcblxcbmxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi50eHRcXFwiKTtcXG5taGxpc3Quc29ydCgoYSwgYikgPT4ge1xcbiAgICBhID0gKGEubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIGIgPSAoYi5uYW1lLm1hdGNoKC9cXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXG4gICAgcmV0dXJuIGEgLSBiO1xcbn0pO1xcbmxldCBjaGFwdGVyTGlzdCA9IFtdO1xcbmxldCBjaGFwdGVyQ291bnQgPSBtaGxpc3QubGVuZ3RoO1xcblxcbmlmIChtb2RlMiA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGxldCBtaGxpc3RDaHVuayA9IFRvb2wuY2h1bmsobWhsaXN0LCBDb25maWcudmlld1BhZ2VTaXplKTtcXG4gICAgbGV0IHZpZXdQYWdlQ291bnQgPSBtaGxpc3RDaHVuay5sZW5ndGg7XFxuICAgIGxldCBkZWZQYWdlID0gKHZpZXdQYWdlQ291bnQgLSAxIDwgYm9va0luZm8uZm9vdCA/IDAgOiBib29rSW5mby5mb290KSB8fCAwO1xcbiAgICBsZXQgcGFnZU51bSA9IE51bWJlcihnZXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGRlZlBhZ2UpKTtcXG4gICAgY2hhcHRlckxpc3QgPSBtaGxpc3RDaHVua1twYWdlTnVtXSB8fCBbXTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIueroOiKgiBcXFwiLmJpZygpICsgKFxcXCLmnKzpobU6XFxcIiArIGNoYXB0ZXJMaXN0Lmxlbmd0aCArIFxcXCIg5YWx5pyJOlxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFwi56ugIOW9k+WJjTpcXFwiICsgKHBhZ2VOdW0gKyAxKSArIFxcXCIvXFxcIiArIHZpZXdQYWdlQ291bnQpLnNtYWxsKCksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIuaXNSZXZlcnNlXFxcIiwgaXNSZXZlcnNlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6Lez6ZuGXFxcIixcXG4gICAgICAgIHVybDogJChjaGFwdGVyQ291bnQsIFxcXCLovpPlhaXot7Povaznq6DoioIgMS1cXFwiICsgY2hhcHRlckNvdW50KS5pbnB1dCgoY2hhcHRlckNvdW50LCBwYWdlTnVtLCB2aWV3UGFnZVNpemUsIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBOdW1iZXIoaW5wdXQpO1xcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXROdW0pIHx8IGlucHV0TnVtIDwgMCB8fCBpbnB1dE51bSA+IGNoYXB0ZXJDb3VudCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5q2j56Gu6IyD5Zu05YaF55qE5pWw5a2XXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaW5wdXROdW0gPSBNYXRoLmZsb29yKChpbnB1dE51bSArIHZpZXdQYWdlU2l6ZSkgLyB2aWV3UGFnZVNpemUpIC0gMTtcXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0pIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgfSwgY2hhcHRlckNvdW50LCBwYWdlTnVtLCBDb25maWcudmlld1BhZ2VTaXplLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLot7PpobVcXFwiLFxcbiAgICAgICAgdXJsOiAkKHBhZ2VOdW0gKyAxLCBcXFwi6Lez6L2s6aG15pWwIDEtXFxcIiArIHZpZXdQYWdlQ291bnQpLmlucHV0KCh2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gTnVtYmVyKGlucHV0KSAtIDE7XFxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dE51bSkgfHwgaW5wdXROdW0gPCAwIHx8IGlucHV0TnVtID4gdmlld1BhZ2VDb3VudCAtIDEpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSkgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOW9k+WJjemhtemdolxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5LiK5LiA6aG1XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGFnZU51bSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHBhZ2VOdW0gLSAxO1xcbiAgICAgICAgICAgIGlmIChpbnB1dE51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+esrOS4gOmhteS6hlxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgcGFnZU51bSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5LiL5LiA6aG1XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHBhZ2VOdW0gKyAxO1xcbiAgICAgICAgICAgIGlmIChpbnB1dE51bSA+IHZpZXdQYWdlQ291bnQgLSAxKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/mnIDlkI7kuIDpobXkuoZcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuacq+mhtVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSB2aWV3UGFnZUNvdW50IC0gMTtcXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0gfHwgaW5wdXROdW0gPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/mnIDlkI7kuIDpobXkuoZcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGNoYXB0ZXJMaXN0ID0gbWhsaXN0O1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi56ug6IqCIFxcXCIuYmlnKCkgKyAoXFxcIuWFseaciTpcXFwiICsgY2hhcHRlckNvdW50ICsgXFxcIueroFxcXCIpLnNtYWxsKCksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIuaXNSZXZlcnNlXFxcIiwgaXNSZXZlcnNlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBhcnJheSA9IFtdO1xcbmlmIChtb2RlID09PSBcXFwiMFxcXCIpIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyTGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcbiAgICAgICAgYXJyYXkucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcXG4gICAgICAgICAgICAgICAgZGlyUGF0aDogcGF0aCxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9WaWV3X1N0eWxlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0gZWxzZSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5Yig6ZmkW1xcXCIgKyBuYW1lICsgXFxcIl3vvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChpc1JldmVyc2UgPT09IFxcXCIxXFxcIikge1xcbiAgICBhcnJheS5yZXZlcnNlKCk7XFxufVxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgYXJyYXkpO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5bCP6K+05q2j5paH6ZiF6K+7XCIsXCJwYXRoXCI6XCJOb3ZlbE1haW5Cb2R5XCIsXCJydWxlXCI6XCJqczpcXG52YXIgbGF5b3V0ID0gW107XFxubGV0IGNvbnRlbnQgPSByZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIE1ZX1BBUkFNUy5wYXRoKTtcXG4vL2NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcXFxufFxcXFxyL2csIFxcXCI8YnI+XFxcIikucmVwbGFjZSgvKCZuYnNwOykrL2csXFxcIiBcXFwiKTtcXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBzZWxlY3RlZDogW10sXFxuICAgIGlzUmVwbGFjZTogZmFsc2UsXFxuICAgIGlzU2VnbWVudDogdHJ1ZSxcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgTVlfUEFSQU1TLmRpclBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuXFxuaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcbiAgICBsZXQgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmcoY29udGVudCk7XFxuICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IHJlcGxhY2VQYXR0ZXJuID0gW1xcXCJyZXBsYWNlXFxcIiwgXFxcInJlcGxhY2VBbGxcXFwiXTtcXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxuICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgIGlmICghYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVwbGFjZSA9IHJlcGxhY2VQYXR0ZXJuWzAgKyByZXBsYWNlUnVsZS5pc1JlZ2V4XTtcXG4gICAgICAgIGphdmFTdHJpbmcgPSBqYXZhU3RyaW5nW3JlcGxhY2VdKHJlcGxhY2VSdWxlLnBhdHRlcm4sIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KTtcXG4gICAgfVxcbiAgICBjb250ZW50ID0gU3RyaW5nKGphdmFTdHJpbmcpO1xcbn1cXG5pZiAoYm9va0luZm8uaXNTZWdtZW50KSB7XFxuICAgIGNvbnRlbnQgPSBcXFwi44CA44CAXFxcIiArIGNvbnRlbnQuc3BsaXQoLyhcXFxcbnxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0LnRyaW0oKS5sZW5ndGggPiAxKS5tYXAoaXQgPT4gaXQudHJpbSgpKS5qb2luKFxcXCI8YnI+44CA44CAXFxcIik7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBNWV9QQVJBTVMudGl0bGUgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCIjdi7lkIjlubZUWFRcIixcInBhdGhcIjpcIk5vdmVsQ29sbGVjdGVkLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxubGV0IHJ1bGVsRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcubm92ZWxGdWxsUGF0aCwgXFxcImRpclxcXCIpO1xcbnNldFBhZ2VUaXRsZShcXFwi5ZCI5bm2VFhUXFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcblxcbmZ1bmN0aW9uIG9wZXJhdGlvbihwYXRoKSB7XFxuICAgIHN3aXRjaCAoaW5wdXQpIHtcXG4gICAgICAgIGNhc2UgXFxcIuWIhuS6q1xcXCI6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSBcXFwi5Yig6ZmkXFxcIjpcXG4gICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIGNhc2UgXFxcIua1t+mYlOmihOiniFxcXCI6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvdHh0UGFyc2VyLnZpZXdcXFwiO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSBcXFwi5omT5byA5pa55byPXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICB9XFxufVxcbmZvciAobGV0IHJ1bGVQYXRocyBvZiBydWxlbERpcikge1xcbiAgICBsZXQgbm92ZWxzID0gRmlsZS5nZXRGaWxlUGF0aChydWxlUGF0aHMucGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnR4dFxcXCIpO1xcbiAgICBmb3IgKGxldCBub3ZlbCBvZiBub3ZlbHMpIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoW1xcXCLliIbkuqtcXFwiLCBcXFwi5Yig6ZmkXFxcIiwgXFxcIua1t+mYlOmihOiniFxcXCIsIFxcXCLmiZPlvIDmlrnlvI9cXFwiXSwgMSkuc2VsZWN0KG9wZXJhdGlvbiwgbm92ZWwucGF0aCksXFxuICAgICAgICAgICAgZGVzYzogXFxcIuadpea6kO+8mlxcXCIgKyBydWxlUGF0aHMubmFtZSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogbm92ZWwucGF0aFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChsYXlvdXQubGVuZ3RoID09PSAwKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufVxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5pu05aSa6K6+572uXCIsXCJwYXRoXCI6XCJTZXR0aW5nL01vcmUudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG5jb25zdCBzZXR0aW5nVHlwZSA9IE1ZX1BBUkFNUy5zZXR0aW5nVHlwZSB8fCBnZXRQYXJhbShcXFwic2V0dGluZ1R5cGVcXFwiKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGlkID0gXFxcIiNcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuc3dpdGNoIChzZXR0aW5nVHlwZSkge1xcbiAgICBjYXNlIFxcXCJjYWNoZVxcXCI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIua4hemZpOe8k+WtmHzorr7nva5cXFwiKTtcXG4gICAgICAgIGNvbnN0IGtub3duTGlzdCA9IG5ldyBNYXAoW1xcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLm5vdmVsUGF0aCksIFxcXCIj566h55CG5ZmoI+Wwj+ivtOe8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcIl0sXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuY29taWNQYXRoKSwgXFxcIiPnrqHnkIblmagj5ryr55S757yT5a2Y55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGgpLCBcXFwiI+euoeeQhuWZqCPlr7zlhaXnmoRUWFTnm67lvZVb5LiN5bu66K6u5riF6ZmkXVxcXCJdLFxcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLm5vdmVsRnVsbFBhdGgpLCBcXFwiI+euoeeQhuWZqCPlsI/or7TlkIjlubbnm67lvZVb5Y+v5Lul5riF6ZmkXVxcXCJdLFxcbiAgICAgICAgICAgIFtcXFwiZHLnq6DoioLnvJPlrZhcXFwiLCBcXFwi6YGT6ZW/5qih5p2/5Li05pe257yT5a2YW+W7uuiurua4hemZpF1cXFwiXVxcbiAgICAgICAgXSk7XFxuXFxuICAgICAgICBsZXQgY2FjaGVEaXIgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5ob21lUGF0aCwgXFxcImRpclxcXCIpO1xcblxcbiAgICAgICAgZnVuY3Rpb24gY2xlYW5DYWNoZShwYXRoKSB7XFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGZvciAobGV0IGNhY2hlIG9mIGNhY2hlRGlyKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogY2FjaGUubmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuWkp+Wwj++8mlxcXCIgKyBGaWxlLmdldEZpbGVTaXplKGNhY2hlLnBhdGgpICsgXFxcIlxcXFxu5o+P6L+w77yaXFxcIiArIChrbm93bkxpc3QuZ2V0KGNhY2hlLm5hbWUpIHx8IFxcXCLmnKrnn6Xnm67lvZVb6aOO6Zmp5pyq55+lXVxcXCIpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5riF6ZmkIFxcXCIgKyBjYWNoZS5uYW1lICsgXFxcIiA/XFxcIikuY29uZmlybShjbGVhbkNhY2hlLCBjYWNoZS5wYXRoKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5YWo6YOo5riF6ZmkKFxcXCIgKyBGaWxlLmdldEZpbGVTaXplKENvbmZpZy5ob21lUGF0aCkgKyBcXFwiKVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOa4hemZpOWFqOmDqOe8k+WtmOaVsOaNrj9cXFwiKS5jb25maXJtKGNsZWFuQ2FjaGUsIENvbmZpZy5ob21lUGF0aClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcImRlZmF1bHRQaWNcXFwiOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLpu5jorqTlsIHpnaJ86K6+572uXFxcIik7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcIjpkZWZhdWx0UGljQmFja1xcXCIpKSB7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIjpkZWZhdWx0UGljQmFja1xcXCIpO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gc2V0RGVmYXVsdFBpYyh1cmwpIHtcXG4gICAgICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBDb25maWcuZGVmX1BpYyA9IHVybDtcXG4gICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgc3RhcnQgPSAxO1xcbiAgICAgICAgaWYgKHR5cGVvZihNWV9OQU1FKSAhPT0gXFxcInVuZGVmaW5lZFxcXCIgJiYgTVlfTkFNRSA9PT0gXFxcIuWXheiniea1j+iniOWZqFxcXCIpIHtcXG4gICAgICAgICAgICBzdGFydCA9IDQ7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Zu+54mHbGF0ZVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibW92aWVfM1xcXCIsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX2xhdGVcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0RGVmYXVsdFBpYywgXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfbGF0ZVxcXCIpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gNDsgaSsrKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWbvueJh1xcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzNcXFwiLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldERlZmF1bHRQaWMsIFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXCIgKyBpKVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6Ieq5a6a5LmJ4p6VXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFtcXFwi6Ieq5a6a5LmJdXJsXFxcIiwgXFxcIumAieaLqeaWh+S7tui3r+W+hFxcXCJdKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLoh6rlrprkuYl1cmxcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIui+k+WFpeWbvueJh+eahOi3r+W+hOaIluiAhemTvuaOpVxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuZGVmX1BpYyA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShyZXF1aXJlVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWZfUGljID0gXFxcImZpbGU6Ly9cXFwiICsgUEFUSDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFwiLCBcXFwidHJ1ZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlOiBcXFwiLmpwZ3wuanBlZ3wuZ2lmfC5wbmd8LnN2Z3wuYm1wXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcImNvbmZpcm1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBcXFwic2VsZWN0UGF0aENhY2hlMlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UGF0aDogdHJ1ZVxcbiAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIFxcXCJyZXBsYWNlUnVsZVxcXCI6XFxuICAgICAgICBpZiAoTVlfUEFSQU1TLmlzUmVmcmVzaCkge1xcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiByZWZyZXNoUGFnZSgpKSk7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuabv+aNouinhOWImXzorr7nva5cXFwiKTtcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IFtdO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfplJnor6/mj5DnpLonLFxcbiAgICAgICAgICAgICAgICBjb250ZW50OiAn5pu/5o2i5pWw5o2u6K+75Y+W5aSx6LSl77yM5piv5ZCm5Yid5aeL5YyW77yfXFxcXG7or6Xmk43kvZzkvJrmuIXpmaTkvaDnmoTmm7/mjaLmlbDmja4hISEnLFxcbiAgICAgICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLliJ3lp4vljJblrozmiJBcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGNhbmNlbDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlj5bmtohcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5paw5bu65pu/5o2iXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aXNOZXc9dHJ1ZVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWvvOWHuuinhOWImVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTlr7zlh7pcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcIuadoeinhOWIme+8n1xcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFwiKS5jb25maXJtKChudW0pID0+IHtcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBzYXZlUHRhID0gQ29uZmlnLmhvbWVQYXRoICsgXFxcIi9yZXBsYWNlUnVsZS5qc29uXFxcIjtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHNhdmVQdGEsIHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgIGxvZyhcXFwiXFxcXG7ot6/lvoTvvJpcXFwiICsgc2F2ZVB0YSArIFxcXCJcXFxcbuWvvOWHuuinhOWImSBcXFwiICsgbnVtICsgXFxcIiDmnaFcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBzYXZlUHRhO1xcbiAgICAgICAgICAgIH0sIHJ1bGVMaXN0Lmxlbmd0aCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGltcG9ydFJ1bGUoaXNiYWNrKSB7XFxuICAgICAgICAgICAgaW5wdXQgPSB0eXBlb2YgUEFUSCA9PT0gXFxcInVuZGVmaW5lZFxcXCIgPyBpbnB1dCA6IFBBVEg7XFxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikgPyBpbnB1dCA6IFxcXCJmaWxlOi8vXFxcIiArIGlucHV0XFxuICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgaWYgKCFydWxlVGV4dCkgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluaWh+S7tuS4uuepulxcXCI7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld1J1bGVMaXN0ID0gSlNPTi5wYXJzZShydWxlVGV4dCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvdW50ID0gMCxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvdW50ID0gMDtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBuZXdSdWxlTGlzdCkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1J1bGUgPSBuZXdSdWxlTGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFwicmVwbGFjZW1lbnRcXFwiKSB8fCAhbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFwicGF0dGVyblxcXCIpIHx8ICFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXCJuYW1lXFxcIikgfHwgKG5ld1J1bGUuc2NvcGVDb250ZW50ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6ICFuZXdSdWxlLnNjb3BlQ29udGVudCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IG5ld1J1bGUuaWQ7XFxuICAgICAgICAgICAgICAgICAgICBuZXdSdWxlLmlkID0gaWQgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRJbmRleCA9IHJ1bGVMaXN0LmZpbmRJbmRleChydWxlID0+IHJ1bGUuaWQgPT09IGlkKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZEluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCsrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnNwbGljZShpZEluZGV4LCAxLCBuZXdSdWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQrKztcXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlTGlzdC5wdXNoKG5ld1J1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkocnVsZUxpc3QpKTtcXG4gICAgICAgICAgICAgICAgaWYgKGlzYmFjaykge1xcbiAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsb2coXFxcIlxcXFxu6Lev5b6E77yaXFxcIiArIGlucHV0ICsgXFxcIlxcXFxu5oC76KeE5YiZ5pWw77yaXFxcIiArIG5ld1J1bGVMaXN0Lmxlbmd0aCArIFxcXCJcXFxcbuabtOaWsOinhOWImSBcXFwiICsgdXBkYXRlQ291bnQgKyBcXFwiIOadoVxcXFx05paw5aKe6KeE5YiZIFxcXCIgKyBuZXdDb3VudCArIFxcXCIg5p2hXFxcIik7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlr7zlhaXmiJDlip9cXFwiKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICBpZiAoaXNiYWNrKSBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIuWklumDqOaWh+S7tlxcXCIsIFxcXCLlhoXpg6jmlofku7ZcXFwiXSwgMSwgXFxcIuinhOWImeWvvOWFpVxcXCIpLnNlbGVjdCgoaW1wb3J0UnVsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLlpJbpg6jmlofku7ZcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImZpbGVTZWxlY3Q6Ly9cXFwiICsgJC50b1N0cmluZyhpbXBvcnRSdWxlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1aXJlVXJsID0gXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSByZXF1aXJlKHJlcXVpcmVVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoaW1wb3J0UnVsZSwgdHJ1ZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZVVybDogcmVxdWlyZVVybCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcImNvbmZpcm1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeTogXFxcInNlbGVjdFBhdGhDYWNoZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgaW1wb3J0UnVsZSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXCIuXFxcIiArIGluZGV4KTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLliKDpmaTmiJDlip9cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGlkLCBpKSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbovpFcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aW5kZXg9XFxcIiArIGksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiLlxcXCIgKyBpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiY29udGVudHNcXFwiOlxcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuebruW9leiuvue9rnzorr7nva5cXFwiKTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tuWkuVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShpZCkuZXh0cmE7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgICAgIGluaXRpYWxQYXRoOiBDb25maWcuaG9tZVBhdGgsXFxuICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIixcXG4gICAgICAgICAgICAgICAgcGF0dGVybjogMVxcbiAgICAgICAgICAgIH0pKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5pSv5oyBaGlrZXI6Ly9maWxlc+i3r+W+hCjor6Xmk43kvZzkuI3kvJrliJ3lp4vljJbnm67lvZUpXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IENvbmZpZy5ob21lUGF0aCxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9LCBpZCksXFxuICAgICAgICAgICAgICAgIGlkOiBpZFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IGdldE15VmFyKGlkLCBmaW5kSXRlbShpZCkuZXh0cmEuZGVmYXVsdFZhbHVlIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpKSBpbnB1dCA9IGdldFBhdGgoaW5wdXQpLnNsaWNlKDcpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZW5kc1dpdGgoXFxcIi9cXFwiKSkgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXFxcLyQvLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChDb25maWcuaG9tZVBhdGggPT0gaW5wdXQpIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/lvZPliY3nm67lvZVcXFwiO1xcbiAgICAgICAgICAgICAgICBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgICAgICBDb25maWcuaG9tZVBhdGggPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suS/neWtmFxcXCI7XFxuICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGJyZWFrO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2Lue8lui+keabv+aNouinhOWImVwiLFwicGF0aFwiOlwiZWRpdFJlcGxhY2VSdWxlLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IGlzTmV3ID0gTVlfUEFSQU1TLmlzTmV3IHx8IGdldFBhcmFtKFxcXCJpc05ld1xcXCIpO1xcbmNvbnN0IGluZGV4ID0gTVlfUEFSQU1TLmluZGV4IHx8IE51bWJlcihnZXRQYXJhbShcXFwiaW5kZXhcXFwiKSk7XFxubGV0IGxheW91dCA9IFtdO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIpO1xcbiAgICAvL2NsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFwiKTtcXG59KSk7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbi8vbGV0IHJlcGxhY2VSdWxlID0gaXNOZXcgPT0gXFxcInRydWVcXFwiP3t9OnJ1bGVMaXN0W2luZGV4XTtcXG5pZiAoaXNOZXcgPT0gXFxcInRydWVcXFwiKSB7XFxuICAgIHJlcGxhY2VSdWxlID0ge1xcbiAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxcbiAgICAgICAgaXNSZWdleDogZmFsc2UsXFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2luZGV4XTtcXG59XFxuLy/pppbmrKHliJ3lp4vljJZcXG5pZihnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIsXFxcIlxcXCIpPT1cXFwiXFxcIil7XFxuICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiLCBcXFwiXFxcIiArIHJlcGxhY2VSdWxlLmlzUmVnZXgpO1xcbiAgICBwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIsXFxcIjFcXFwiKTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaLt+i0nVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gW1xcXCJuYW1lXFxcIiwgXFxcImlzUmVnZXhcXFwiLCBcXFwicGF0dGVyblxcXCIsIFxcXCJyZXBsYWNlbWVudFxcXCJdO1xcbiAgICAgICAgbGV0IGpzb24gPSB7fTtcXG4gICAgICAgIGF0dC5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuXFxcIiArIGtleSwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFxcXCJpc1JlZ2V4XFxcIikge1xcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcXFwidHJ1ZVxcXCIgPyB0cnVlIDogZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGpzb25ba2V5XSA9IHZhbHVlO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi57KY6LS0XFxcIixcXG4gICAgdXJsOiAkKFxcXCJ7e2NsaXBib2FyZH19XFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaW5wdXQpO1xcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pIHx8IGpzb24ucGF0dGVybiA9PSB1bmRlZmluZWQpIHJldHVybjtcXG4gICAgICAgICAgICBsZXQgYXR0ID0gW1xcXCJuYW1lXFxcIiwgXFxcImlzUmVnZXhcXFwiLCBcXFwicGF0dGVyblxcXCIsIFxcXCJyZXBsYWNlbWVudFxcXCJdO1xcbiAgICAgICAgICAgIGF0dC5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLlxcXCIgKyBrZXksIFN0cmluZyhqc29uW2tleV0pKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pu/5o2i6KeE5YiZ5ZCN56ewXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiLCByZXBsYWNlUnVsZS5uYW1lKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIsaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLop4TliJlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIiwgcmVwbGFjZVJ1bGUucGF0dGVybiksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFwiLCBpbnB1dCk7J1xcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaYr+WQpuS9v+eUqOato+WImeihqOi+vuW8j++8mlxcXCIgKyBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIiksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBpc1JlZ2V4ID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpID09PSBcXFwidHJ1ZVxcXCIgPyBmYWxzZSA6IHRydWU7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5piv5ZCm5L2/55So5q2j5YiZ6KGo6L6+5byP77yaXFxcIiArIGlzUmVnZXhcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIsIFxcXCJcXFwiICsgaXNSZWdleCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpZCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBpZFxcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuabv+aNouS4ulxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogLTEsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcIiwgcmVwbGFjZVJ1bGUucmVwbGFjZW1lbnQpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXCIsaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHJlcGxhY2VSdWxlLCBpc05ldywgaW5kZXgpID0+IHtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghcGF0dGVybikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mm7/mjaLop4TliJnkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBsYWNlUnVsZSwge1xcbiAgICAgICAgICAgIG5hbWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgaXNSZWdleDogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpID09PSBcXFwidHJ1ZVxcXCIgPyB0cnVlIDogZmFsc2UsXFxuICAgICAgICAgICAgcGF0dGVybjogcGF0dGVybixcXG4gICAgICAgICAgICByZXBsYWNlbWVudDogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgaWYgKGlzTmV3ID09IFxcXCJ0cnVlXFxcIikge1xcbiAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gocmVwbGFjZVJ1bGUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBydWxlTGlzdC5zcGxpY2UoaW5kZXgsIDEsIHJlcGxhY2VSdWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNhdmVGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkocnVsZUxpc3QpKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICB9LCByZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5cXG4vKlxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLojIPlm7RcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFwiLGlucHV0KTsnXFxuICAgIH1cXG59KTtcXG5cXG4qL1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5bCP6K+05Liq5oCn5YyW5YeA5YyWXCIsXCJwYXRoXCI6XCJOb3ZlbEN1c3RvbS52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuabv+aNouinhOWImXxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG5sZXQgaWQgPSBcXFwiI1xcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG5cXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBmb290OiAwLFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxuICAgIHNlbGVjdGVkOiBbXVxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBNWV9QQVJBTVMucGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLimJDlh4DljJZcXFwiLCBcXFwi4piR5YeA5YyWXFxcIl1bMCArIGJvb2tJbmZvLmlzUmVwbGFjZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoJGlkLCBwYXRoKSA9PiB7XFxuXFxuICAgICAgICB2YXIgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgbGV0IGlzUmVwbGFjZSA9IGJvb2tJbmZvLmlzUmVwbGFjZT09PXVuZGVmaW5lZD90cnVlOmJvb2tJbmZvLmlzUmVwbGFjZTtcXG4gICAgICAgIGJvb2tJbmZvLmlzUmVwbGFjZSA9ICFpc1JlcGxhY2U7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcbiAgICAgICAgICAgIHRpdGxlOiBpc1JlcGxhY2UgPyBcXFwi4piQ5YeA5YyWXFxcIiA6IFxcXCLimJHlh4DljJZcXFwiLFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpZCArIFxcXCIjLTFcXFwiLCBNWV9QQVJBTVMucGF0aCksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogaWQgKyBcXFwiIy0xXFxcIlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi57yW6L6R6KeE5YiZXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBpc1JlZnJlc2g6IHRydWVcXG4gICAgfVxcbn0pO1xcbmZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgbGV0IGlzVHJ1ZSA9IGJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IChpc1RydWUgPyBcXFwi4pePXFxcIiA6IFxcXCLil4tcXFwiKSArIHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIHk6IDAsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlzVHJ1ZTogaXNUcnVlLFxcbiAgICAgICAgICAgIGlkOiBpZCArIGksXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuW8gOWQr1xcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCRpZCwgcmVwbGFjZVJ1bGUsIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoZmluZEl0ZW0oJGlkKS5leHRyYS5pc1RydWUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suW8gOWQr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcbiAgICAgICAgICAgIH0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLnNlbGVjdGVkLnB1c2gocmVwbGFjZVJ1bGUuaWQpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4pePXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpc1RydWU6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICBpZDogJGlkLFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGlkICsgaSwgcmVwbGFjZVJ1bGUsIE1ZX1BBUkFNUy5wYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlhbPpl61cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgkaWQsIHJlcGxhY2VSdWxlLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKCFmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YWz6ZetXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IFtdXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuICAgICAgICAgICAgYm9va0luZm8uc2VsZWN0ZWQuc3BsaWNlKGJvb2tJbmZvLnNlbGVjdGVkLmluZGV4T2YocmVwbGFjZVJ1bGUuaWQpLCAxKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKXi1xcXCIgKyByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAkaWQsXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaWQgKyBpLCByZXBsYWNlUnVsZSwgTVlfUEFSQU1TLnBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuWkluWvvOWwj+ivtFwiLFwicGF0aFwiOlwiZXh0ZXJuYWxpbXBvcnRUeHQudmlld1wiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gdHh0VmlldyhsYXlvdXQpIHtcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgIGxldCBmaWxlcyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCk7XFxuICAgIGZpbGVzID0gZmlsZXMuZmlsdGVyKHYgPT4gLyhcXFxcLnR4dHxcXFxcLmVwdWIpJC8udGVzdCh2Lm5hbWUpKTtcXG5cXG4gICAgc2V0UGFnZVRpdGxlKFxcXCLlsI/or7TkuabmnrZcXFwiKTtcXG4gICAgLy9sZXQgbGF5b3V0ID0gW107XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHVybDogJ2lucHV0P1xcXCJoaWtlcjovL3BhZ2UvdHh0U2VhcmNoLnZpZXcjbm9SZWZyZXNoIz9zZWFyY2hUZXJtcz1cXFwiK2VuY29kZVVSSUNvbXBvbmVudChpbnB1dCk6XFxcInRvYXN0Oi8v6K+36L6T5YWl5bCP6K+05ZCNXFxcIicsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+UjVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwic2VhcmNoS2V5QnlUeHRcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5QnlUeHQnLGlucHV0KVxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl5bCP6K+0XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICAgIHVybDogJChbXFxcIuezu+e7n+mAieaLqeWZqFxcXCIsIFxcXCLmtbfpmJTpgInmi6nlmahcXFwiXSwgMSwgXFxcIumAieaLqeWZqOexu+Wei1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi57O757uf6YCJ5oup5ZmoXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImZpbGVTZWxlY3Q6Ly9cXFwiICsgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIS8oXFxcXC50eHR8LmVwdWIpJC9pLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIumAieaLqeS6humUmeivr+eahOaWh+S7tuexu+Wei1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVNYXRjaCA9IGlucHV0Lm1hdGNoKC9cXFxcLyhbXlxcXFwvXSo/KShcXFxcLnR4dHxcXFxcLmVwdWIpJC9pKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBub3ZlbE5hbWUgPSBmaWxlTWF0Y2hbMV0ucmVwbGFjZShcXFwiX2ZpbGVTZWxlY3RfXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcGF0aCA9IENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGggKyBub3ZlbE5hbWUgKyBmaWxlTWF0Y2hbMl07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wYXRoQ2FjaGUgPSBDb25maWcuY29udGVudHNDYWNoZSArIG5vdmVsTmFtZSArIGZpbGVNYXRjaFsyXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gaW5wdXQucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgdG9wYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeaPkOekulxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLlt7LlrZjlnKhbXFxcIiArIG5vdmVsTmFtZSArIFxcXCJd5piv5ZCm6KaG55uWP1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKHBhdGgsIHRvcGF0aCwgdG9wYXRoQ2FjaGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aENhY2hlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXModG9wYXRoQ2FjaGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgsIHRvcGF0aCwgdG9wYXRoQ2FjaGUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aENhY2hlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLlr7zlhaXmiJDlip9cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXF1aXJlVXJsID0gXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiO1xcbiAgICAgICAgICAgICAgICBsZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShyZXF1aXJlVXJsKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVNYXRjaCA9IFBBVEgubWF0Y2goL1xcXFwvKFteXFxcXC9dKj8pKFxcXFwudHh0fFxcXFwuZXB1YikkL2kpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3ZlbE5hbWUgPSBmaWxlTWF0Y2hbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvcGF0aCA9IENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGggKyBub3ZlbE5hbWUgKyBmaWxlTWF0Y2hbMl07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvcGF0aENhY2hlID0gQ29uZmlnLmNvbnRlbnRzQ2FjaGUgKyBub3ZlbE5hbWUgKyBmaWxlTWF0Y2hbMl07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQQVRIO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgdG9wYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi5bey5a2Y5ZyoW1xcXCIgKyBub3ZlbE5hbWUgKyBcXFwiXeaYr+WQpuimhueblj9cXFwiKS5jb25maXJtKChwYXRoLCB0b3BhdGgsIHRvcGF0aENhY2hlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGhDYWNoZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoLCB0b3BhdGgsIHRvcGF0aENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgdG9wYXRoQ2FjaGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIudHh0fC5lcHViXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tUeXBlOiBcXFwiY29uZmlybVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogXFxcInNlbGVjdFBhdGhDYWNoZTFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgbWVtb3J5UGF0aDogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgb3B0aW9ucyA9IFtcXFwi6ZiF6K+7XFxcIiwgXFxcIuWIhuS6q1xcXCIsIFxcXCLliKDpmaRcXFwiLCBcXFwi5omT5byA5pa55byPXFxcIl07XFxuXFxuICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcIjp0eHRQYXR0ZXJuXFxcIiwgb3B0aW9uc1swXSk7XFxuICAgIGxldCBpZCA9IERhdGUubm93KCkgKyBcXFwiOuaooeW8j1xcXCI7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwYXR0ZXJuLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgICAgdXJsOiAkKG9wdGlvbnMsIDEsIFxcXCLmk43kvZzmqKHlvI9cXFwiKS5zZWxlY3QoKGlkKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIjp0eHRQYXR0ZXJuXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LCBpZCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmlofku7bnrqHnkIZcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0ZpbGVNYW5hZ2VtZW50LnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/dHlwZT1leHRlcm5hbEltcG9ydFBhdGhcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcblxcbiAgICBmdW5jdGlvbiBvcGVyYXRpb24ocGF0aCwgbmFtZSwgdHlwZSkge1xcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFwiOnR4dFBhdHRlcm5cXFwiLCBcXFwi6ZiF6K+7XFxcIik7XFxuICAgICAgICBzd2l0Y2ggKHBhdHRlcm4pIHtcXG4gICAgICAgICAgICBjYXNlIFxcXCLliIbkuqtcXFwiOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIuWIoOmZpFxcXCI6XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaRbXFxcIiArIG5hbWUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIuanNvblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXMocGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShwYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgcGF0aCk7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIumYheivu1xcXCI6XFxuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZT09PVxcXCIudHh0XFxcIj9cXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcIjpcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjXFxcIikrXFxcIj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICBjYXNlIFxcXCLmiZPlvIDmlrnlvI9cXFwiOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBmb3IgKGxldCBub3ZlbCBvZiBmaWxlcykge1xcbiAgICAgICAgbGV0IHR5cGUgPSBub3ZlbC5uYW1lLnN1YnN0cmluZyhub3ZlbC5uYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBub3ZlbC5uYW1lLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShvcGVyYXRpb24sIG5vdmVsLnBhdGgsIG5vdmVsLm5hbWUsIHR5cGUpLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLlpKflsI/vvJpcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShub3ZlbC5wYXRoKSArIFxcXCJcXFxcbuS/ruaUueaXtumXtO+8mlxcXCIgKyAkLmRhdGVGb3JtYXQobm92ZWwubGFzdE1vZGlmaWVkLCBcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBwYXRoOiBub3ZlbC5wYXRoLFxcbiAgICAgICAgICAgICAgICBpc0NhY2hlOiB0cnVlLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXG4gICAgICAgICAgICAgICAgaWQ6IG5vdmVsLnBhdGgsXFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5YiG5LqrXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwic2hhcmU6Ly9cXFwiICsgbm92ZWwucGF0aClcXG4gICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLpmIXor7tcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KCh0eXBlPT09XFxcIi50eHRcXFwiP1xcXCJoaWtlcjovL3BhZ2UvdHh0UGFyc2VyLnZpZXdcXFwiOlxcXCJoaWtlcjovL3BhZ2UvZXB1YlBhcnNlci52aWV3I2F1dG9DYWNoZSNcXFwiKStcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUpXFxuICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5omT5byA5pa55byPXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcIiArIG5vdmVsLnBhdGgpXFxuICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwibG9uZ1ByZXNzLmpzXFxcIikuZGVsZXRlRmlsZUZvclR4dChwYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgfSwgbm92ZWwucGF0aClcXG4gICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLorr7nva5cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb25cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOW4ruWKqeKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2hlbHAudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9rZXl3b3JkPXR4dFxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+5ZWl6YO95rKh5pyJ6IC2PC9oMT4nLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxufVxcblxcbmlmICgkLmltcG9ydFBhcmFtID09PSB1bmRlZmluZWQpIHtcXG4gICAgJC5leHBvcnRzID0gdHh0VmlldztcXG59IGVsc2UgaWYgKCQuaW1wb3J0UGFyYW0gPT09IG51bGwpIHtcXG4gICAgc2V0UmVzdWx0KHR4dFZpZXcoW10pKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi5UWFTop6PmnpDlmahcIixcInBhdGhcIjpcInR4dFBhcnNlci52aWV3XCIsXCJydWxlXCI6XCJqczpcXG4oZnVuY3Rpb24oKSB7XFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiQ29uZmlnLmpzXFxcIik7XFxuICAgIGxldCByZWdzID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvcmVndWxhckNoYXB0ZXIuZlxcXCIpO1xcbiAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpIHx8IFxcXCJcXFwiKSB8fCBNWV9QQVJBTVMucGF0aDtcXG4gICAgbGV0IGNoYXJzdCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwiY2hhcnN0XFxcIikgfHwgXFxcIlxcXCIpIHx8IE1ZX1BBUkFNUy5jaGFyc3QgfHwgXFxcIlVURi04XFxcIjtcXG4gICAgbGV0IGlzQ2FjaGUgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcImlzQ2FjaGVcXFwiKSB8fCBcXFwiXFxcIikgfHwgTVlfUEFSQU1TLmlzQ2FjaGU7XFxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikpIHtcXG4gICAgICAgIHBhdGggPSBcXFwiZmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICB9XFxuICAgIGlmKE1ZX1BBUkFNUy50aXRsZSl7XFxuICAgICAgICBzZXRQYWdlVGl0bGUoTVlfUEFSQU1TLnRpdGxlKTtcXG4gICAgfWVsc2V7XFxuICAgICAgICBzZXRQYWdlVGl0bGUoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpLmdldE5hbWUocGF0aCkpO1xcbiAgICB9XFxuICAgIGxldCBsYXlvdXQgPSBbXTtcXG4gICAgbGV0IGNoYXB0ZXJOYW1lcyA9IFtdO1xcbiAgICBsZXQgaW50ZXJ2YWxzID0gW107XFxuICAgIGxldCBoYXNQcmVmYWNlID0gZmFsc2U7XFxuICAgIGxldCBjYWNoZVBhdGggPSBwYXRoLnJlcGxhY2UoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCwgQ29uZmlnLmNvbnRlbnRzQ2FjaGUpO1xcbiAgICBpZiAoaXNDYWNoZSYmZmlsZUV4aXN0KGNhY2hlUGF0aCkpIHtcXG4gICAgICAgIHRyeSB7XFxuXFxuICAgICAgICAgICAgbGV0IGMgPSBKU09OLnBhcnNlKHJlcXVlc3QoY2FjaGVQYXRoKSk7XFxuICAgICAgICAgICAgY2hhcHRlck5hbWVzID0gYy5jaGFwdGVyTmFtZXM7XFxuICAgICAgICAgICAgaW50ZXJ2YWxzID0gYy5pbnRlcnZhbHM7XFxuICAgICAgICAgICAgaGFzUHJlZmFjZSA9IGMuaGFzUHJlZmFjZTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6YeN5paw6Kej5p6Q55uu5b2VXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgrXFxcIi5qc29uXFxcIiksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTpmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuebruW9leino+aekOWksei0pSjph43mlrDop6PmnpApPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgrXFxcIi5qc29uXFxcIiksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo6Kej5p6Q55uu5b2VXFxcIik7XFxuICAgICAgICBsZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAvL1xcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwidGV4dC9wbGFpbjsgY2hhcnN0PVxcXCIgKyBjaGFyc3RcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gcmVncy5nZXRUb2NSdWxlKHR4dCk7XFxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+55uu5b2V6Kej5p6Q5aSx6LSlPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih0eHQpO1xcbiAgICAgICAgbGV0IHBvaW50ZXIgPSAwO1xcbiAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7XFxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpO1xcbiAgICAgICAgICAgIGxldCBlbmQgPSBtYXRjaGVyLmVuZCgpO1xcbiAgICAgICAgICAgIGxldCB0ID0gbWF0Y2hlci5ncm91cCgpO1xcbiAgICAgICAgICAgIGlmIChwb2ludGVyID09PSAwICYmIHN0YXJ0ID4gMzApIHtcXG4gICAgICAgICAgICAgICAgaGFzUHJlZmFjZSA9IHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNoYXB0ZXJOYW1lcy5wdXNoKHQpO1xcbiAgICAgICAgICAgIGludGVydmFscy5wdXNoKFtwb2ludGVyLCBzdGFydF0pO1xcbiAgICAgICAgICAgIHBvaW50ZXIgPSBlbmQ7XFxuICAgICAgICB9XFxuICAgICAgICBpbnRlcnZhbHMucHVzaChbcG9pbnRlciwgdHh0Lmxlbmd0aF0pO1xcbiAgICAgICAgaWYgKGlzQ2FjaGUpIHtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJOYW1lczogY2hhcHRlck5hbWVzLFxcbiAgICAgICAgICAgICAgICBpbnRlcnZhbHM6IGludGVydmFscyxcXG4gICAgICAgICAgICAgICAgaGFzUHJlZmFjZTogaGFzUHJlZmFjZVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG5cXG5cXG4gICAgaWYgKGhhc1ByZWZhY2UpIHtcXG4gICAgICAgIGxldCBpbnRlcnZhbCA9IGludGVydmFsc1swXTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuW6j+iogFxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9UWFRWaWV3ZXIudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgY2hhcHRlck5hbWU6IFxcXCLluo/oqIBcXFwiLFxcbiAgICAgICAgICAgICAgICBzdGFydDogaW50ZXJ2YWxbMF0sXFxuICAgICAgICAgICAgICAgIGVuZDogaW50ZXJ2YWxbMV0sXFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgICAgIGNoYXJzdDogY2hhcnN0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFwdGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBuYW1lID0gY2hhcHRlck5hbWVzW2ldO1xcbiAgICAgICAgbGV0IGludGVydmFsID0gaW50ZXJ2YWxzW2kgKyAxXTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1RYVFZpZXdlci52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBzdGFydDogaW50ZXJ2YWxbMF0sXFxuICAgICAgICAgICAgICAgIGVuZDogaW50ZXJ2YWxbMV0sXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJOYW1lOiBuYW1lLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxcbiAgICAgICAgICAgICAgICBjaGFyc3Q6IGNoYXJzdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChsYXlvdXQpO1xcbn0pKClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LlRYVOafpeeci+WZqFwiLFwicGF0aFwiOlwiVFhUVmlld2VyLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxubGV0IGNoYXJzdCA9IE1ZX1BBUkFNUy5jaGFyc3Q7XFxubGV0IHR4dCA9IHJlcXVlc3QocGF0aCwge1xcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgIC8vXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJ0ZXh0L3BsYWluOyBjaGFyc3Q9XFxcIiArIGNoYXJzdFxcbiAgICB9XFxufSk7XFxuXFxubGV0IHRhcmdldFRleHRzID0gdHh0LnN1YnN0cmluZyhNWV9QQVJBTVMuc3RhcnQsIE1ZX1BBUkFNUy5lbmQpO1xcblxcbmxldCBjb250ZW50ID0gdGFyZ2V0VGV4dHMuc3BsaXQoLyhcXFxcbnxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0Lmxlbmd0aCA+IDEpLmpvaW4oXFxcIjxicj5cXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIE1ZX1BBUkFNUy5jaGFwdGVyTmFtZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjai7nq6DoioLmraPliJlcIixcInBhdGhcIjpcInJlZ3VsYXJDaGFwdGVyLmZcIixcInJ1bGVcIjpcImpzOlxcbmxldCBydWxlcyA9IFt7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMSxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi55uu5b2VKOWOu+epuueZvSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSkpKS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDlgYfoo4XnrKzkuIDnq6DliY3pnaLmnInnqbrnmb3kvYbmiJHkuI3opoFcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDBcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTIsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxzezAsNH1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXznr4coPyHlvKApKSkuezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag5qCH5YeG55qE57Kk6K+t5bCx5piv6L+Z5qC3XFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0zLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi55uu5b2VKOWMuemFjeeugOS7iylcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl856+HKD8h5bygKSkpLnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi566A5LuLIOiAgeWkq+ivuOiRm+adkeWkq1xcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMlxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtNCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiBmYWxzZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lSjlj6TlhbjjgIHovbvlsI/or7TlpIfnlKgpXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0fSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl86K+dfOevhyg/IeW8oCkpKS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDmr5TkuIrpnaLlj6rlpJrkuoblm57lkozor51cXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDNcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTUsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLmlbDlrZco57qv5pWw5a2X5qCH6aKYKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W+OAgFxcXFxcXFxcc10pXFxcXFxcXFxkK1xcXFxcXFxcLj9bIOOAgFxcXFxcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiMTJcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDRcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTYsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlpKflhpnmlbDlrZco57qv5pWw5a2X5qCH6aKYKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W+OAgFxcXFxcXFxcc10pW+OAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSwxMn1bIOOAgFxcXFxcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5LiA55m+5LiD5Y2BXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA0XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC03LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH1cXFxcXFxcXGR7MSw1fVs677yaLC7vvIwg44CBX+KAlFxcXFxcXFxcLV0uezEsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCIx44CB6L+Z5Liq5bCx5piv5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA1XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC04LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlpKflhpnmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CBX+KAlFxcXFxcXFxcLV0uezEsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLkuIDjgIHlj6rmnInliY3pnaLnmoTmlbDlrZfmnInlt67liKtcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDZcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTksXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuato+aWhyDmoIfpopgv5bqP5Y+3XFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0feato+aWh1sg44CAXXsxLDR9LnswLDIwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5q2j5paHIOaIkeWltuW4uOWxsei1teWtkOm+mVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogN1xcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTAsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIkNoYXB0ZXIvU2VjdGlvbi9QYXJ0L0VwaXNvZGUg5bqP5Y+3IOagh+mimFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzpbQ2NdaGFwdGVyfFtTc11lY3Rpb258W1BwXWFydHzvvLDvvKHvvLLvvLR8W05uXVtvT11cXFxcXFxcXC58W0VlXXBpc29kZXwoPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklilcXFxcXFxcXHN7MCw0fVxcXFxcXFxcZHsxLDR9LnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiQ2hhcHRlciAxIE15R3JhbmRtYUlzTkJcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDhcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTExLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwiQ2hhcHRlcijljrvnroDku4spXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0fSg/OltDY11oYXB0ZXJ8W1NzXWVjdGlvbnxbUHBdYXJ0fO+8sO+8oe+8su+8tHxbTm5dW09vXVxcXFxcXFxcLnxbRWVdcGlzb2RlKVxcXFxcXFxcc3swLDR9XFxcXFxcXFxkezEsNH0uezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCJDaGFwdGVyIDEgTXlHcmFuZG1hSXNOQlxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogOVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTIsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIueJueauiuespuWPtyDluo/lj7cg5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1bXFxcXFxcXFxz44CAXSlb44CQ44CU44CW44CM44CO44CI77y7XFxcXFxcXFxbXSg/OuesrHxbQ2NdaGFwdGVyKVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsMTB9W+eroOiKgl0uezAsMjB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLjgJDnrKzkuIDnq6Ag5ZCO6Z2i55qE56ym5Y+35Y+v5Lul5rKh5pyJXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxMFxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTMsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnibnmrornrKblj7cg5qCH6aKYKOaIkOWvuSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVtcXFxcXFxcXHPjgIBdezAsNH0pKD86W1xcXFxcXFxcW+OAiOOAjOOAjuOAluOAlOOAiu+8iOOAkFxcXFxcXFxcKF0uezEsMzB9W1xcXFxcXFxcKeOAke+8ieOAi+OAleOAl+OAj+OAjeOAiVxcXFxcXFxcXV0/fCg/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWKVsg44CAXXswLDR9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLjgI7liqDkuKrnm7Top5LlvJXlj7fmm7TkuJPkuJrjgI9cXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDExXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xNCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi54m55q6K56ym5Y+3IOagh+mimCjljZXkuKopXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1bXFxcXFxcXFxz44CAXXswLDR9KSg/OlvimIbimIXinKbinKddLnsxLDMwfXwoPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklilbIOOAgF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi4piG44CB5pmL5rGf5L2c6ICF5pyA5Zac5qyi55qE5qC85byPXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxMlxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTUsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIueroC/ljbcg5bqP5Y+3IOagh+mimFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyBcXFxcXFxcXHTjgIBdezAsNH0oPzooPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb5Y2356ugXVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH0pWyDjgIBdezAsNH0uezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLljbfkupQg5byA5rqQ55ub5LiWXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxM1xcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTYsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLpobbmoLzmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlxcXFxcXFxcUy57MSwyMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuS4jei2hei/hzIw5Liq5a2X6aG25qC85YaZ55qE6YO95piv5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxNFxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTcsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlj4zmoIfpopgo5YmN5ZCRKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoP20pKD88PVsgXFxcXFxcXFx044CAXXswLDR9KeesrFtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JCg/PVtcXFxcXFxcXHPjgIBdezAsOH3nrKxbXFxcXFxcXFxk6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh956ugKVxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag55yf5q2j55qE5qCH6aKY5bm25YGH6KOF5o2i6KGM56ys5LiA56ugIOi/meS4quS4jeimgVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTVcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTE4LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Y+M5qCH6aKYKOWQjuWQkSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD9tKSg/PD1bIFxcXFxcXFxcdOOAgF17MCw0feesrFtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFtcXFxcXFxcXHPjgIBdezAsOH0p56ysW1xcXFxcXFxcZOmbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4feeroC57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDov5nkuKrmoIfpopjkuI3opoHlubblgYfoo4XmjaLooYznrKzkuIDnq6DnnJ/mraPnmoTmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDE2XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xOSxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Lmm5ZCNIOaLrOWPtyDluo/lj7dcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXi57MSwyMH1bKO+8iF1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9WynvvIldWyDjgIBcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5qCH6aKY5ZCO6Z2i5pWw5a2X5pyJ5ous5Y+3KDEyKVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTdcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTIwLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLkuablkI0g5bqP5Y+3XFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl4uezEsMjB9W1xcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fVsg44CAXFxcXHRdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuagh+mimOWQjumdouaVsOWtl+ayoeacieaLrOWPtzEyNFxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMThcXG4gICAgfVxcbl07XFxubGV0IE1hdGNoZXIgPSBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjtcXG5sZXQgUGF0dGVybiA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuO1xcblxcbmZ1bmN0aW9uIGdldFRvY1J1bGUoY29udGVudCkge1xcbiAgICBsZXQgbWF4Q3MgPSAxO1xcbiAgICBsZXQgdG9jUGF0dGVybiA9IG51bGw7XFxuICAgIGZvciAobGV0IHRvY1J1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgIGlmICghdG9jUnVsZS5lbmFibGUpIGNvbnRpbnVlO1xcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodG9jUnVsZS5ydWxlLCBQYXR0ZXJuLk1VTFRJTElORSk7XFxuICAgICAgICBsZXQgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihjb250ZW50KTtcXG4gICAgICAgIGxldCBjcyA9IDA7XFxuICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHtcXG4gICAgICAgICAgICBjcysrO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGNzID49IG1heENzKSB7XFxuICAgICAgICAgICAgbWF4Q3MgPSBjcztcXG4gICAgICAgICAgICB0b2NQYXR0ZXJuID0gcGF0dGVybjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gdG9jUGF0dGVybjtcXG59XFxuJC5leHBvcnRzLmdldFRvY1J1bGUgPSBnZXRUb2NSdWxlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI1Yu5biu5YqpXCIsXCJwYXRoXCI6XCJoZWxwLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmxldCBoZWxwVGV4dCA9IHtcXG4gICAgXFxcInR4dFxcXCI6IGBcXG4gICAgICAgIDxoMSBpZD1cXFwidHh05piv5LuA5LmIXFxcIj5UWFTmmK/ku4DkuYg/PC9oMT5cXG4gICAgICAgIDxwPjxhIGhyZWY9XFxcImh0dHBzOi8vYmFpa2UuYmFpZHUuY29tL2l0ZW0vdHh0LzEyMTczMzBcXFwiPuaIkeW3sue7j+W4ruS9oOeZvuW6puS6hjwvYT7vvJvnroDljZXmnaXor7TlsLHmmK/kuIDnp43lgqjlrZjlsI/or7TnmoTmlofku7Yo5omp5bGV5ZCNOnR4dCnjgII8L3A+XFxuICAgICAgICA8aDEgaWQ9XFxcIuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtFxcXCI+5aaC5L2V55So6K+l5bCP56iL5bqP6ZiF6K+7dHh05bCP6K+0PzwvaDE+XFxuICAgICAgICA8cD7lnKjkuLvpobXpnaIg4peJVFhUIOeVjOmdouS4i++8jOeCueWHu+WvvOWFpVRYVO+8jOmAieaLqeebruagh+Wwj+ivtOaWh+S7tih0eHTmlofku7bvvIw8ZW0+6K+l5pON5L2c5LiN5Lya5Yig6ZmkdHh05paH5Lu277yM6ICM5pivY29weeS4gOS7veWIsOWwj+eoi+W6j+eahOi3r+W+hOS4izwvZW0+Ke+8jOWvvOWFpeWQjuWGjeWcqCDil4lUWFQg55WM6Z2i5LiL6YCJ5oup5oOz6KaB6ZiF6K+755qE5bCP6K+05Y2z5Y+v44CCPC9wPlxcblxcbiAgICBgLFxcbiAgICBcXFwibm92ZWxDb21pY1xcXCI6IGBcXG4gICAgICAgIDxoMSBpZD1cXFwi6L+Z5Liq5bCP56iL5bqP5pyJ5LuA5LmI55So77yfXFxcIj7ov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ88L2gxPlxcbiAgICAgICAgPHVsPlxcbiAgICAgICAgPGxpPjx1PuS7o+eggeS4iuS4uuWFtuS7luWwj+eoi+W6jyjmvKvnlLvnsbsv5bCP6K+057G7KeaPkOS+m+S4i+i9veaOpeWPo+OAgjwvdT48L2xpPlxcbiAgICAgICAgPGxpPjx1PuacrOS9k+WFheW9k+mYheivu+WZqO+8jOWPr+S7pea1j+iniOeUqOivpeWwj+eoi+W6j+aPkOS+m+eahOS4i+i9veaOpeWPoyjkuIrpnaIp77yM5LiL6L2955qE5ryr55S7L+Wwj+ivtOOAgjwvdT48L2xpPlxcbiAgICAgICAgPGxpPjx1PuaPkOS+m1RYVOagvOW8j+Wwj+ivtOaWh+S7tuino+aekOWKn+iDveOAgjwvdT5cXG4gICAgICAgIDxoMSBpZD1cXFwi5Li65LuA5LmI5YiX6KGo6YeM5LuA5LmI6YO95rKh55SoXFxcIj7kuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKg/PC9oMT5cXG4gICAgICAgIDx1PuWIneasoeS9v+eUqO+8jOayoeacieW+iOato+W4uOWQp+OAgvCfpJQ8L3U+XFxuICAgICAgICA8aDEgaWQ9XFxcIuivpeWmguS9lea3u+WKoOa8q+eUu+aIluWwj+ivtFxcXCI+6K+l5aaC5L2V5re75Yqg5ryr55S7KOaIluWwj+ivtCk/PC9oMT5cXG4gICAgICAgIDx1PiDlnKjkuIDkuKrmnInkuIvovb3lip/og73nmoTlsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynkuK3kuIvovb3kuIDmnKzmvKvnlLsv5bCP6K+077yM6L+U5Zue6K+l6KeE5YiZ5Y2z5Y+v5rWP6KeI44CCPC91PjwvbGk+XFxuICAgICAgICA8L3VsPlxcbiAgICBgXFxufTtcXG5zZXRQYWdlVGl0bGUoXFxcIuW4ruWKqVxcXCIpO1xcbmxldCBrZXl3b3JkID0gZ2V0UGFyYW0oXFxcImtleXdvcmRcXFwiKTtcXG5sZXQgdGV4dDtcXG5pZiAoa2V5d29yZCA9PT0gdW5kZWZpbmVkIHx8ICEodGV4dCA9IGhlbHBUZXh0W2tleXdvcmRdKSkge1xcbiAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7otYTmlpnkuI3op4Hlkq88L2gxPicsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfV0pO1xcbn0gZWxzZSB7XFxuICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgdGl0bGU6IHRleHQsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfV0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5aSW5a+85pCc57SiXCIsXCJwYXRoXCI6XCJ0eHRTZWFyY2gudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG5cXG5sZXQgc2VhcmNoVGVybXMgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInNlYXJjaFRlcm1zXFxcIikpO1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIHNlYXJjaFRlcm1zICsgXFxcIuOAjeeahOaQnOe0oue7k+aenFxcXCIpO1xcbmxldCBkYXRhID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoLCB1bmRlZmluZWQpO1xcbmRhdGEgPSBkYXRhLmZpbHRlcih2ID0+IC8oXFxcXC50eHR8XFxcXC5lcHViKSQvLnRlc3Qodi5uYW1lKSk7XFxuXFxubGV0IHRlcm1zQXJyID0gc2VhcmNoVGVybXMuc3BsaXQoXFxcIlxcXCIpLm1hcCh0ID0+IHQucmVwbGFjZSgvXFxcXCp8XFxcXC58XFxcXD98XFxcXCt8XFxcXCR8XFxcXF58XFxcXFt8XFxcXF18XFxcXCh8XFxcXCl8XFxcXHt8XFxcXH18XFxcXHx8XFxcXC98XFxcXFxcXFwvZywgayA9PiBcXFwiXFxcXFxcXFxcXFwiICsgaykpO1xcbmxldCByZWcgPSBuZXcgUmVnRXhwKHRlcm1zQXJyLmpvaW4oXFxcIi4qXFxcIiksIFxcXCJpXFxcIik7XFxubGV0IHNlYXJjaFJlc3VsdCA9IFtdO1xcbmZvciAobGV0IHR4dCBvZiBkYXRhKSB7XFxuICAgIGlmIChyZWcudGVzdCh0eHQubmFtZSkpIHtcXG4gICAgICAgIGxldCB0eXBlID0gdHh0Lm5hbWUuc3Vic3RyaW5nKHR4dC5uYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgc2VhcmNoUmVzdWx0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiB0eHQubmFtZSxcXG4gICAgICAgICAgICB1cmw6ICh0eXBlPT09XFxcIi50eHRcXFwiP1xcXCJoaWtlcjovL3BhZ2UvdHh0UGFyc2VyLnZpZXdcXFwiOlxcXCJoaWtlcjovL3BhZ2UvZXB1YlBhcnNlci52aWV3I2F1dG9DYWNoZSNcXFwiKStcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUsXFxuICAgICAgICAgICAgZGVzYzogdHh0LnBhdGgsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogdHh0LnBhdGgsXFxuICAgICAgICAgICAgICAgIGlzQ2FjaGU6IHRydWUsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0eHQubmFtZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChzZWFyY2hSZXN1bHQubGVuZ3RoID09PSAwKSB7XFxuICAgIHNlYXJjaFJlc3VsdC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiAnPGgyIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7wn5SO5rKh5pyJ5om+5Yiw55u45YWz5Lmm57GNPC9oMj4nLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQoc2VhcmNoUmVzdWx0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLumVv+aMiS/ngrnlh7tcIixcInBhdGhcIjpcImxvbmdQcmVzcy5qc1wiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzID0ge1xcbiAgICBkZWxldGVGaWxlRm9yQm9vayhwYXRoKSB7XFxuICAgICAgICAvL3JldHVybiAkKFxcXCLmiYDmnInnmoQg5ryr55S7L+Wwj+ivtCDnq6DoioLlsIbooqvliKDpmaRcXFxcbeehruiupOWIoOmZpO+8n1xcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW0ocGF0aClcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICAvL30sIHBhdGgpO1xcbiAgICB9LFxcbiAgICBkZWxldGVGaWxlRm9yVHh0KHBhdGgpIHtcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIuanNvblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXMocGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBkZWxldGVJdGVtKHBhdGgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgc2luZ2xlRW50ZXIocGFnZVVybCwgcGF0aCkge1xcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgIGxldCBkaXJzID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZGlyXFxcIik7XFxuICAgICAgICBpZiAoZGlycy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmkgPSBkaXJzWzBdLnBhdGg7XFxuICAgICAgICAgICAgaWYgKENvbmZpZy5kZWZfaXNDb21pY0NvbXBhdGlibGUgPT09IFxcXCIwXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGZpKTtcXG4gICAgICAgICAgICAgICAgbGV0IHNob3J0ZW4gPSBmaS5yZXBsYWNlKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIikuc2xpY2UoNyksIFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gc2hvcnRlbiArIFxcXCIvXFxcIiArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInBpY3M6Ly9cXFwiICsgcGljbGlzdC5qb2luKFxcXCImJlxcXCIpO1xcblxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2NvbWljQ29tcGF0aWJsZS52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjP3BhdGg9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChmaSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gcGFnZVVybCArIFxcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZVxcbiAgICAgICAgfVxcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuS4i+i9veS4u+eoi+W6j1wiLFwicGF0aFwiOlwibWFpbkRvd25sb2FkXCIsXCJydWxlXCI6XCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXCIpO1xcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuXFxuXFxuJC5leHBvcnRzLm5vdmVsID0gZnVuY3Rpb24gbm92ZWwoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lELCBpbnRlcnJ1cHQpIHtcXG4gICAgbGV0IGlkID0gaW5mby5ib29rSWQgPyBcXFwiJFxcXCIgKyBpbmZvLmJvb2tJZCA6IFxcXCJcXFwiO1xcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcubm92ZWxQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIFRvb2wudGV4dFNoaWVsZChpbmZvLmJvb2tOYW1lKSArIGlkICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBUb29sLnRleHRTaGllbGQoaXRlbS50aXRsZSkgKyBcXFwiLnR4dFxcXCI7XFxuICAgIGxldCBjb250ZW50ID0gXFxcIlxcXCI7XFxuICAgIGlmIChpbnRlcnJ1cHQgJiYgZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICByZXR1cm4gLTE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBzZXRSZXN1bHQgPSBkYXRhID0+IHtcXG4gICAgICAgICAgICBjb250ZW50ID0gZGF0YVswXS50aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAxICYmIGRhdGFbMV0udGl0bGUgJiYgZGF0YVsxXS50aXRsZS5sZW5ndGggPiBjb250ZW50Lmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gZGF0YVsxXS50aXRsZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZ2V0UmVzQ29kZSA9ICgpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goaXRlbS51cmwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGdldENvbnRlbnQgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcInVybFxcXCIsIFxcXCJpbmRleFxcXCIsIFxcXCJ0aXRsZVxcXCIsIFxcXCJzZXRSZXN1bHRcXFwiLCBcXFwiZ2V0UmVzQ29kZVxcXCIsIFxcXCJyZXR1cm4gXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgIGNvbnRlbnQgPSBnZXRDb250ZW50KGl0ZW0udXJsLCBpdGVtLnVybCwgb3JkZXIsIGl0ZW0udGl0bGUsIHNldFJlc3VsdCwgZ2V0UmVzQ29kZSkgfHwgY29udGVudCB8fCBcXFwiXFxcIjtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor68+IFxcXCIgKyBlLm1lc3NhZ2U7XFxuICAgICAgICB0aHJvdyBlO1xcbiAgICB9XFxuICAgIGlmICghY29udGVudCkge1xcbiAgICAgICAgdG9hc3QoXFxcIuWwj+ivtOS4uuepulxcXCIpO1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+v77ya5q2j5paH6L+U5Zue5Li656m6PlxcXCIpO1xcbiAgICB9XFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxuICAgICAgICAgICAgVG9vbC5waWNEb3dubG9hZChib29rVG9wUGljWzBdLCBtYWluUGF0aCArIGluZm8uYm9va05hbWUgKyBpZCArIFxcXCIuanBnXFxcIiwgYm9va1RvcFBpY1sxXSwgaW5mby5kZWNvZGUpO1xcblxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5maWxlV3JpdGUoY2hhcHRlclBhdGgsIGNvbnRlbnQucmVwbGFjZSgvPHNjcmlwdD4uKj88XFxcXC9zY3JpcHQ+L2dtaSwgXFxcIlxcXCIpLnRyaW1SaWdodCgpKTtcXG4gICAgLy9GaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiKTtcXG59XFxuXFxuJC5leHBvcnRzLmNvbWljID0gZnVuY3Rpb24gY29taWMoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lELCBpbnRlcnJ1cHQpIHtcXG4gICAgbGV0IGlkID0gaW5mby5ib29rSWQgPyBcXFwiJFxcXCIgKyBpbmZvLmJvb2tJZCA6IFxcXCJcXFwiO1xcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIFRvb2wudGV4dFNoaWVsZChpbmZvLmJvb2tOYW1lKSArIGlkICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcIiRCJFxcXCIgKyBUb29sLnRleHRTaGllbGQoaXRlbS50aXRsZSkgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBwaWNMaXN0ID0gW107XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwidXJsXFxcIiwgXFxcImluZGV4XFxcIiwgXFxcInRpdGxlXFxcIiwgXFxcInJldHVyblxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxuICAgICAgICBwaWNMaXN0ID0gZ2V0UGljTGlzdChpdGVtLnVybCwgaXRlbS51cmwsIG9yZGVyLCBpdGVtLnRpdGxlKTtcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXCJwaWNzOi8vXFxcIiwgXFxcIlxcXCIpLnNwbGl0KFxcXCImJlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivrz4gXFxcIiArIGUubWVzc2FnZTtcXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG4gICAgcGljTGlzdCA9IHBpY0xpc3QuZmlsdGVyKHAgPT4gcCk7XFxuICAgIGNvbnN0IEwgPSBwaWNMaXN0Lmxlbmd0aDtcXG4gICAgaWYgKEwgPT09IDApIHtcXG4gICAgICAgIHRvYXN0KFxcXCLlm77niYfpk77mjqXkuLrnqbpcXFwiKTtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8muWbvueJh+mTvuaOpei/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgaWQgKyBcXFwiLmpwZ1xcXCIsIGJvb2tUb3BQaWNbMV0sIGluZm8uZGVjb2RlKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIjzlsIHpnaLkuIvovb3plJnor68+IFxcXCIgKyBlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIGxldCBlcnJvck51bSA9IDA7XFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTDsgaSsrKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBwaWMgPSBUb29sLmhpa2VyUGljKHBpY0xpc3RbaV0pO1xcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQocGljWzBdLCBjaGFwdGVyUGF0aCArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCIsIHBpY1sxXSwgaW5mby5kZWNvZGUpO1xcbiAgICAgICAgICAgIGlmIChpbnRlcnJ1cHQgJiYgZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCJcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZXJyb3JOdW0gPSAwO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGlmIChlcnJvck51bSA8IDEwKSB7XFxuICAgICAgICAgICAgICAgIGktLTtcXG4gICAgICAgICAgICAgICAgZXJyb3JOdW0rKztcXG4gICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgRmlsZS5yZW5hbWVGaWxlKGNoYXB0ZXJQYXRoLCBvcmRlciArIFxcXCIkQSRcXFwiICsgVG9vbC50ZXh0U2hpZWxkKGl0ZW0udGl0bGUpKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7mvKvnlLvlhbzlrrlcIixcInBhdGhcIjpcImNvbWljQ29tcGF0aWJsZS52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbnNldFBhZ2VUaXRsZShNWV9QQVJBTVMudGl0bGUpO1xcbmxldCBwYXRoPWRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIsTVlfUEFSQU1TLnBhdGgpKTtcXG5sZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgpO1xcbmxldCBwaWNsaXN0ID0gZmlsZWxpc3QubWFwKChpdGVtLCBpKSA9PiAoe1xcbiAgICBjb2xfdHlwZTogXFxcInBpY18xX2Z1bGxcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgcGljX3VybDogcGF0aCArIFxcXCIvXFxcIiArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCJcXG59KSk7XFxuXFxuc2V0UmVzdWx0KHBpY2xpc3QpO1xcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5Lmm5p62XCIsXCJwYXRoXCI6XCJCb29rcmFjay52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJGaWxlLmpzXFxcIik7XFxuY29uc3QgcmFuayA9ICQucmVxdWlyZShcXFwiZmlsZVJhbmsuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJUb29sLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJDb25maWcuanNcXFwiKTtcXG5cXG4oZnVuY3Rpb24oKSB7XFxuICAgIGxldCB0eXBlID0gTVlfUEFSQU1TLnR5cGUgfHwgZ2V0UGFyYW0oXFxcInR5cGVcXFwiLCBcXFwiXFxcIikgfHwgXFxcImNvbWljXFxcIjtcXG4gICAgbGV0IHJ1bGVOYW1lID0gVG9vbC50ZXh0U2hpZWxkKE1ZX1BBUkFNUy5ydWxlTmFtZSB8fCBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJ1bGVOYW1lXFxcIikpKTtcXG4gICAgaWYgKCFydWxlTmFtZSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuivt+S8oOWFpeinhOWImeWQjVxcXCIpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgIH1cXG4gICAgaWYgKCFbXFxcImNvbWljXFxcIiwgXFxcIm5vdmVsXFxcIl0uaW5jbHVkZXModHlwZSkpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLor7fkvKDlhaXmraPnoa7nmoR0eXBlOmNvbWljIG5vdmVsXFxcIik7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgfVxcbiAgICBzZXRQYWdlVGl0bGUocnVsZU5hbWUgKyBcXFwifOacrOWcsOS5puaetlxcXCIpO1xcbiAgICBsZXQgbGF5b3V0ID0gW107XFxuICAgIGxldCBwYXRoID0gQ29uZmlnW3R5cGUgKyBcXFwiUGF0aFxcXCJdICsgcnVsZU5hbWU7XFxuICAgIGxldCBjb2xfdHlwZSA9IGdldEl0ZW0oXFxcImJvb2tyYWNrOmNvbF90eXBlXFxcIiwgXFxcIm1vdmllXzNfbWFycXVlZVxcXCIpO1xcbiAgICBsZXQgcmFua01ldGhvZCA9IGdldEl0ZW0oXFxcImJvb2tyYWNrOnJhbmtNZXRob2RcXFwiLCBcXFwi57O757ufXFxcIik7XFxuICAgIGxldCByYW5rSXNSZXZlcnNlID0gZ2V0SXRlbShcXFwiYm9va3JhY2s6cmFua0lzUmV2ZXJzZVxcXCIsIFxcXCJcXFwiKTtcXG5cXG4gICAgbGV0IGNvbFR5cGVzID0gW1xcXCJtb3ZpZV8xXFxcIiwgXFxcIm1vdmllXzJcXFwiLCBcXFwibW92aWVfM19tYXJxdWVlXFxcIiwgXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIiwgXFxcInBpY18yXFxcIiwgXFxcInBpY18zXFxcIiwgXFxcInBpY18zX3NxdWFyZVxcXCIsIFxcXCJwaWNfMl9jYXJkXFxcIl07XFxuICAgIFxcbiAgICBsZXQgcmFua01ldGhvZHMgPSBbXFxcIuezu+e7n1xcXCIsIFxcXCLlpKflsI9cXFwiLCBcXFwi5ZCN56ewXFxcIiwgXFxcIuaXtumXtFxcXCJdO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB1cmw6ICdcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiK2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLmkJzkvaDmg7PopoHnmoQjXFxcIiArIHR5cGUgKyBcXFwiIy4uLi4uLlxcXCIsXFxuICAgICAgICB0aXRsZTogXFxcIvCflI1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKChydWxlTmFtZSwgdHlwZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyMSA9IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRpdGxlXFxcIjogcnVsZU5hbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaF91cmxcXFwiOiBcXFwiaGlrZXI6Ly9lbXB0eT9pc0FsbD0xJnNlYXJjaFRlcm1zPSoqJnR5cGU9XFxcIiArIHR5cGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNlYXJjaEZpbmRcXFwiOiBcXFwianM6JC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvU2VhcmNoLnZpZXc/cnVsZT0nK01ZX1JVTEUuX3RpdGxlKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XTtcXG4gICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnIxKTtcXG4gICAgICAgICAgICB9LCBydWxlTmFtZSwgdHlwZSksXFxuICAgICAgICAgICAgLypkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdzZWFyY2hLZXknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiKi9cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+nqVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgICAgIHVybDogJChjb2xUeXBlcy5tYXAodj0+dj09PWNvbF90eXBlP1xcXCLigJzigJxcXFwiK3YrXFxcIuKAneKAnVxcXCI6dikpLnNlbGVjdCgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgIGlmKC/igJzigJwuKj/igJ3igJ0vLnRlc3QoaW5wdXQpKSByZXR1cm47XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiYm9va3JhY2s6Y29sX3R5cGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pXFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBuYW1lIG9mIHJhbmtNZXRob2RzKSB7XFxuICAgICAgICBsZXQgYSA9IHJhbmtNZXRob2QgPT09IG5hbWU7XFxuICAgICAgICBsZXQgdGl0bGVhID0gYSA/IFxcXCLigJjigJhcXFwiICsgbmFtZSArIFxcXCLigJnigJlcXFwiIDogbmFtZTtcXG4gICAgICAgIGxldCB0aXRsZWIgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChhKSB7XFxuICAgICAgICAgICAgdGl0bGViID0gIXJhbmtJc1JldmVyc2UgPyBcXFwi4oaTXFxcIiA6IFxcXCLihpFcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aXRsZWIgPSBcXFwi4oaVXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVhICsgdGl0bGViLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiZmxleF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcmFua01ldGhvZCA9IGdldEl0ZW0oXFxcImJvb2tyYWNrOnJhbmtNZXRob2RcXFwiLCBcXFwi57O757ufXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCByYW5rSXNSZXZlcnNlID0gZ2V0SXRlbShcXFwiYm9va3JhY2s6cmFua0lzUmV2ZXJzZVxcXCIsIFxcXCJcXFwiKTtcXG5cXG4gICAgICAgICAgICAgICAgaWYgKHJhbmtNZXRob2QgPT09IG5hbWUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5rSXNSZXZlcnNlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFua0lzUmV2ZXJzZSA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5rSXNSZXZlcnNlID0gXFxcIjFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYm9va3JhY2s6cmFua0lzUmV2ZXJzZVxcXCIsIHJhbmtJc1JldmVyc2UpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYm9va3JhY2s6cmFua0lzUmV2ZXJzZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImJvb2tyYWNrOnJhbmtNZXRob2RcXFwiLCBuYW1lKTtcXG5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSwgbmFtZSlcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGxldCByYW5rTWV0aG9kTWFwID0ge1xcbiAgICAgICAgXFxcIuezu+e7n1xcXCI6IFxcXCJcXFwiLFxcbiAgICAgICAgXFxcIuWkp+Wwj1xcXCI6IFxcXCJzaXplXFxcIixcXG4gICAgICAgIFxcXCLlkI3np7BcXFwiOiBcXFwibmFtZVxcXCIsXFxuICAgICAgICBcXFwi5pe26Ze0XFxcIjogXFxcInRpbWVcXFwiXFxuICAgIH07XFxuICAgIGxldCBib29rTGlzdCA9IFtdO1xcbiAgICBsZXQgbGlzdCA9IHJhbmsoRmlsZS5nZXRGaWxlcyhwYXRoLCBcXFwiZGlyXFxcIiksIHJhbmtNZXRob2RNYXBbcmFua01ldGhvZF0pO1xcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGJvb2tMaXN0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLllaXpg73msqHmnInogLZcXFwiLmJpZygpLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuXFxuICAgIH1cXG4gICAgbGV0IHBhZ2VVcmwgPSB0eXBlID09PSBcXFwibm92ZWxcXFwiID8gXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEJyb3dzZXIudmlld1xcXCIgOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcIjtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgcGljID0gZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIGl0ZW0uZ2V0UGF0aCgpICsgXFxcIi9cXFwiICsgaXRlbS5nZXROYW1lKCkgKyBcXFwiLmpwZ1xcXCIpID8gaXRlbS5nZXRQYXRoKCkgKyBcXFwiL1xcXCIgKyBpdGVtLmdldE5hbWUoKSArIFxcXCIuanBnXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcbiAgICAgICAgbGV0IG5hbWVzPVN0cmluZyhpdGVtLmdldE5hbWUoKSkuc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGJvb2tMaXN0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lc1swXSxcXG4gICAgICAgICAgICBkZXNjOiBuYW1lc1sxXSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxuICAgICAgICAgICAgdXJsOiB0eXBlID09PSBcXFwibm92ZWxcXFwiID9wYWdlVXJsICsgXFxcIj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlOiQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhZ2VVcmwsIHBhdGgpPT57XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImxvbmdQcmVzcy5qc1xcXCIpLnNpbmdsZUVudGVyKHBhZ2VVcmwsIHBhdGgpO1xcbiAgICAgICAgICAgIH0sIHBhZ2VVcmwsIGl0ZW0uZ2V0UGF0aCgpKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTpjb2xfdHlwZSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygocGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImxvbmdQcmVzcy5qc1xcXCIpLmRlbGV0ZUZpbGVGb3JCb29rKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgaXRlbS5nZXRQYXRoKCkpXFxuICAgICAgICAgICAgICAgIH1dLFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5nZXRQYXRoKCksXFxuICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0uZ2V0UGF0aCgpLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLmdldE5hbWUoKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGlmIChyYW5rSXNSZXZlcnNlKSB7XFxuICAgICAgICBib29rTGlzdC5yZXZlcnNlKCk7XFxuICAgIH1cXG5cXG4gICAgc2V0UmVzdWx0KGxheW91dC5jb25jYXQoYm9va0xpc3QpKTtcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2Yu5paH5Lu25o6S5bqPXCIsXCJwYXRoXCI6XCJmaWxlUmFuay5qc1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiRmlsZS5qc1xcXCIpO1xcbmxldCBjaG5OdW1DaGFyID0ge1xcbiAgICDpm7Y6IDAsXFxuICAgIOS4gDogMSxcXG4gICAg5LqMOiAyLFxcbiAgICDkuIk6IDMsXFxuICAgIOWbmzogNCxcXG4gICAg5LqUOiA1LFxcbiAgICDlha06IDYsXFxuICAgIOS4gzogNyxcXG4gICAg5YWrOiA4LFxcbiAgICDkuZ06IDlcXG59O1xcblxcbmxldCBjaG5OYW1lVmFsdWUgPSB7XFxuICAgIOWNgToge1xcbiAgICAgICAgdmFsdWU6IDEwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg55m+OiB7XFxuICAgICAgICB2YWx1ZTogMTAwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg5Y2DOiB7XFxuICAgICAgICB2YWx1ZTogMTAwMCxcXG4gICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxuICAgIH0sXFxuICAgIOS4hzoge1xcbiAgICAgICAgdmFsdWU6IDEwMDAwLFxcbiAgICAgICAgc2VjVW5pdDogdHJ1ZVxcbiAgICB9LFxcbiAgICDkur86IHtcXG4gICAgICAgIHZhbHVlOiAxMDAwMDAwMDAsXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gQ2hpbmVzZVRvTnVtYmVyKGNoblN0cikge1xcbiAgICBsZXQgcnRuID0gMDtcXG4gICAgbGV0IHNlY3Rpb24gPSAwO1xcbiAgICBsZXQgbnVtYmVyID0gMDtcXG4gICAgbGV0IHNlY1VuaXQgPSBmYWxzZTtcXG4gICAgbGV0IHN0ciA9IGNoblN0ci5zcGxpdCgnJyk7XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgbnVtID0gY2huTnVtQ2hhcltzdHJbaV1dO1xcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09ICd1bmRlZmluZWQnKSB7XFxuICAgICAgICAgICAgbnVtYmVyID0gbnVtO1xcbiAgICAgICAgICAgIGlmIChpID09PSBzdHIubGVuZ3RoIC0gMSkge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IG51bWJlcjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB1bml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0udmFsdWU7XFxuICAgICAgICAgICAgc2VjVW5pdCA9IGNobk5hbWVWYWx1ZVtzdHJbaV1dLnNlY1VuaXQ7XFxuICAgICAgICAgICAgaWYgKHNlY1VuaXQpIHtcXG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9IChzZWN0aW9uICsgbnVtYmVyKSAqIHVuaXQ7XFxuICAgICAgICAgICAgICAgIHJ0biArPSBzZWN0aW9uO1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uID0gMDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IChudW1iZXIgKiB1bml0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbnVtYmVyID0gMDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gcnRuICsgc2VjdGlvbjtcXG59XFxuXFxuZnVuY3Rpb24gbmFtZUNvbXBhcmUoYSwgYikge1xcbiAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbClcXG4gICAgICAgIHJldHVybiBhID09IG51bGwgPyBiID09IG51bGwgPyAwIDogLTEgOiAxO1xcblxcbiAgICBhID0gYS5yZXBsYWNlKC8oW+mbtuS4gOS6jOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+S6v10pL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzLCBvZmZzZXQsIHN0cmluZykge1xcbiAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcbiAgICAgICAgcmV0dXJuIENoaW5lc2VUb051bWJlcihwMSk7XFxuICAgIH0pXFxuICAgIGIgPSBiLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICByZXR1cm4gQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgfSlcXG5cXG4gICAgbGV0IE5VTUJFUlMgPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKFxcXCIoPzw9XFxcXFxcXFxEKSg/PVxcXFxcXFxcZCl8KD88PVxcXFxcXFxcZCkoPz1cXFxcXFxcXEQpXFxcIik7XFxuICAgIGxldCBzcGxpdDEgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGEpKTtcXG4gICAgbGV0IHNwbGl0MiA9IE5VTUJFUlMuc3BsaXQobmV3IGphdmEubGFuZy5TdHJpbmcoYikpO1xcblxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNwbGl0MS5sZW5ndGgsIHNwbGl0Mi5sZW5ndGgpOyBpKyspIHtcXG4gICAgICAgIGxldCBjMSA9IHNwbGl0MVtpXS5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgbGV0IGMyID0gc3BsaXQyW2ldLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICBsZXQgY21wID0gMDtcXG4gICAgICAgIGxldCB6ZXJvQ2hhckNvZGUgPSAnMCcuY2hhckNvZGVBdCgwKTtcXG4gICAgICAgIGxldCBuaW5lQ2hhckNvZGUgPSAnOScuY2hhckNvZGVBdCgwKTtcXG5cXG4gICAgICAgIGlmIChjMSA+PSB6ZXJvQ2hhckNvZGUgJiYgYzEgPD0gbmluZUNoYXJDb2RlICYmIGMyID49IHplcm9DaGFyQ29kZSAmJiBjMiA8PSBuaW5lQ2hhckNvZGUpIHtcXG4gICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQxW2ldKS5jb21wYXJlVG8obmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKHNwbGl0MltpXSkpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xcbiAgICAgICAgICAgIGxldCByZWdleCA9IC9bYS16QS1aMC05XS9cXG4gICAgICAgICAgICBsZXQgczEgPSBTdHJpbmcoc3BsaXQxW2ldKVxcbiAgICAgICAgICAgIGxldCBzMiA9IFN0cmluZyhzcGxpdDJbaV0pXFxuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3QoczEpIHx8IHJlZ2V4LnRlc3QoczIpKSB7XFxuICAgICAgICAgICAgICAgIGNtcCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nKHNwbGl0MVtpXSkuY29tcGFyZVRvKG5ldyBqYXZhLmxhbmcuU3RyaW5nKHNwbGl0MltpXSkpO1xcbiAgICAgICAgICAgICAgICAvLyBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnZW4nKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGNtcCA9IHMxLmxvY2FsZUNvbXBhcmUoczIsICd6aCcpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBjbXA7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IGxlbmd0aENtcCA9IHNwbGl0MS5sZW5ndGggLSBzcGxpdDIubGVuZ3RoO1xcbiAgICAvLyBpZiAobGVuZ3RoQ21wICE9PSAwKSBsZW5ndGhDbXAgPSBsZW5ndGhDbXAgPiAwID8gLTEgOiAxO1xcbiAgICByZXR1cm4gbGVuZ3RoQ21wO1xcbn1cXG5cXG5mdW5jdGlvbiByYW5rKGxpc3QsIG0pIHtcXG4gICAgc3dpdGNoIChtKSB7XFxuICAgICAgICBjYXNlIFxcXCJ0eXBlXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcXG4gICAgICAgIGNhc2UgXFxcIm5hbWVcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvcnQoKGEsIGIpID0+IG5hbWVDb21wYXJlKFN0cmluZyhhLmdldE5hbWUoKSksIFN0cmluZyhiLmdldE5hbWUoKSkpKTtcXG4gICAgICAgIGNhc2UgXFxcInNpemVcXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvcnQoKGEsIGIpID0+IEZpbGUuZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGEpIC0gRmlsZS5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoYikpO1xcbiAgICAgICAgY2FzZSBcXFwidGltZVxcXCI6XFxuICAgICAgICAgICAgcmV0dXJuIGxpc3Quc29ydCgoYSwgYikgPT4gYS5sYXN0TW9kaWZpZWQoKSAtIGIubGFzdE1vZGlmaWVkKCkpO1xcbiAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcXG4gICAgfVxcblxcbn1cXG4kLmV4cG9ydHM9cmFuaztcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LmVwdWLop6PmnpDlmahcIixcInBhdGhcIjpcImVwdWJQYXJzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxudmFyIGxheW91dCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5Lmm57GN5L+h5oGvXFxcIik7XFxubGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInBhdGhcXFwiKSB8fCBcXFwiXFxcIikgfHwgTVlfUEFSQU1TLnBhdGg7XFxubGV0IG1ldGEgPSBnZXRFcHViTWV0YWRhdGEocGF0aCk7XFxuLy9sb2cobWV0YSlcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBtZXRhLmZpcnN0VGl0bGUsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi8J+RpOS9nOiAhe+8mlxcXCIgKyBtZXRhLmF1dGhvcnNbMF0ubGFzdG5hbWUsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG59KTtcXG5sZXQgZGVzY3JpcHRpb24gPSAobWV0YS5kZXNjcmlwdGlvbnNbMF0gfHwgXFxcIlxcXCIpLnJlcGxhY2UoLzxwLio/Pnw8XFxcXC9wPi9nLCBcXFwiXFxcIik7XFxubGV0IHRkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xcbmlmIChkZXNjcmlwdGlvbikge1xcbiAgICBcXG4gICAgaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCA+IDUwKSB7XFxuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCA1MCkgK1xcXCIuLi4uLi5cXFwiICtcXFwi5pu05aSaPlxcXCIubGluaygkKCkuYjY0KFxcXCInXFxcIikucnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLnroDku4tcXFwiKTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnroDku4vvvJo8YnI+44CA44CAXFxcIiArIE1ZX1BBUkFNUy50ZXh0LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuXFxuICAgICAgICAgICAgfV0pO1xcbiAgICAgICAgfSkpO1xcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+TneeugOS7i++8mjxicj7jgIDjgIBcXFwiK2Rlc2NyaXB0aW9uLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiB0ZGVzY3JpcHRpb25cXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbi8vc2V0UGFnZVRpdGxlKG1ldGEuZmlyc3RUaXRsZSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmxldCBjaGFwdGVycyA9IGdldEVwdWJDaGFwdGVycyhwYXRoKTtcXG5mb3IgKGxldCBpdCBvZiBjaGFwdGVycykge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZXB1YlZpZXdlci52aWV3I3JlYWRUaGVtZSMjYXV0b1BhZ2UjXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaHJlZjogaXQudXJsLFxcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LmVwdWLmn6XnnIvlmahcIixcInBhdGhcIjpcImVwdWJWaWV3ZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXG5sZXQgdXJsID0gTVlfUEFSQU1TLmhyZWY7XFxubGV0IGMgPSBnZXRFcHViQ29udGVudChwYXRoLCB1cmwpO1xcbi8vbGV0IGE9IGMucmVwbGFjZSgvXFxcXHM/PGRpdi4qPz58PFxcXFwvZGl2PlxcXFxzPy9nLCBcXFwiXFxcIikucmVwbGFjZSgvXFxcXHM/PHAuKj8+KC4qKTxcXFxcL3A+XFxcXHM/L2csIFxcXCJcXFxcdTMwMDBcXFxcdTMwMDAkMTxicj5cXFwiKTtcXG4vL2xldCBiPWMucmVwbGFjZSgvXFxcXHM/PGRpdi4qPz58PFxcXFwvZGl2PlxcXFxzPy9nLCBcXFwiXFxcIikucmVwbGFjZSgvXFxcXHM/PHAuKj8+KC4qPyk8XFxcXC9wPlxcXFxzPy9nLCBcXFwiXFxcXHUzMDAwXFxcXHUzMDAwJDE8YnI+XFxcIik7XFxuLy9sb2coYT09YilcXG4vL2xvZyhnZXRFcHViQ29udGVudDAocGF0aCwgdXJsKSlcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIE1ZX1BBUkFNUy50aXRsZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjduaWh+S7tueuoeeQhlwiLFwicGF0aFwiOlwiRmlsZU1hbmFnZW1lbnQudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcIik7XFxubGV0IHVybCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIjtcXG5sZXQgZiA9ICQucmVxdWlyZSh1cmwpO1xcbmxldCB0eXBlID0gZ2V0UGFyYW0oXFxcInR5cGVcXFwiLCBcXFwiaG9tZVBhdGhcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgcmVmcmVzaFBhZ2UoKTtcXG59KTtcXG5sZXQgaGlrZXJQYXRoID0gXFxcImZpbGU6Ly9cXFwiICsgQ29uZmlnLmhvbWVQYXRoO1xcbmlmKCFmaWxlRXhpc3QoaGlrZXJQYXRoKSl7XFxuICAgIHdyaXRlRmlsZShoaWtlclBhdGgrXFxcIi/liJvlu7rnm67lvZUudHh0XFxcIixcXFwiXFxcIik7XFxuICAgIGRlbGV0ZUZpbGUoaGlrZXJQYXRoK1xcXCIv5Yib5bu655uu5b2VLnR4dFxcXCIpO1xcbn1cXG5mLmZpbGVTZWxlY3Rpb24oe1xcbiAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAvL+agueaNruaWh+S7tuaJqeWxleWQje+8jOeUqOS4jeWQjOWwj+eoi+W6j+aJk+W8gFxcbiAgICAgICAgaWYgKFxcXCIuanBnXFxcIiA9PT0gVFlQRSkge1xcbiAgICAgICAgICAgIHJldHVybiBQQVRIO1xcbiAgICAgICAgfSBlbHNlIGlmIChcXFwiLnR4dFxcXCIgPT09IFRZUEUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlldz9pc0NhY2hlPXRydWUmcnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcGF0aD1cXFwiICsgUEFUSDtcXG4gICAgICAgIH0gZWxzZSBpZiAoXFxcIi5lcHViXFxcIiA9PT0gVFlQRSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnBhdGg9XFxcIiArIFBBVEg7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCLml6Dms5XmiZPlvIDvvIzmmK/lkKbkvb/nlKjlhbbku5blupTnlKjmiZPlvIDvvJ9cXFwiKS5jb25maXJtKHBhdGggPT4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBwYXRoLCBQQVRIKTtcXG4gICAgICAgIH1cXG4gICAgfSksXFxuICAgIGluaXRpYWxQYXRoOiBDb25maWdbdHlwZV0sXFxuICAgIHJvb3REaXJQYXRoOiBDb25maWcuaG9tZVBhdGgsXFxuICAgIC8vb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgLy9tZW1vcnk6IFxcXCJGaWxlTWFuYWdlbWVudDptZW1vcnlcXFwiLFxcbiAgICBmaWxlVHlwZTogXFxcIlxcXFwudHh0fFxcXFwuZXB1YnwuanBnXFxcIixcXG4gICAgLy9jSG9tZVRpcHM6IFxcXCLmmK/lkKbkvb/nlKjmtbfpmJTlsI/nqIvluo/miZPlvIBbJHtuYW1lfV0/XFxcIixcXG4gICAgLy9jU2VhcmNoVGlwczogXFxcIuaYr+WQpuS9v+eUqOa1t+mYlOWwj+eoi+W6j+aJk+W8gFske3BhdGh9XT9cXFwiXFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjai5Db25maWdcIixcInBhdGhcIjpcIkNvbmZpZy5qc1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFwiKTtcXG5cXG5sZXQgbG9jYWxDb25maWcgPSB7fTtcXG5cXG50cnkge1xcbiAgICBsb2NhbENvbmZpZyA9IEpTT04ucGFyc2UoRmlsZS5yZWFkRmlsZShnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2ZpbGVzL+acrOWcsOi1hOa6kOeuoeeQhi9jb25maWcuanNvblxcXCIpLnNsaWNlKDcpKSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkZWxldGVGaWxlKFxcXCJjb25maWcuanNvblxcXCIpO1xcbn1cXG5jb25zdCBDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgaG9tZVBhdGg6IGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvbG9jYWxNYW5hZ2VyXFxcIikuc2xpY2UoNyksXFxuICAgIGxvZ051bTogMTAsXFxuICAgIHRocmVhZE51bTogMCxcXG4gICAgZGVmX2lzUGFnaW5hdGU6IFxcXCIxXFxcIiwgLy8x6buY6K6k5byA5ZCv5YiG6aG177yMMOm7mOiupOWFs+mXrVxcbiAgICB2aWV3UGFnZVNpemU6IDIwMCxcXG4gICAgZGVmX1BpYzogXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljNFxcXCIsXFxuICAgIGRlZl9Mb3JkX1R5cGU6IFxcXCJjb21pY1xcXCIsXFxuICAgIGRlZl9WaWV3X1N0eWxlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZGVmX0RvVmlfU3R5bGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICBkZWZfRG9WaV9UeXBlOiBcXFwiMVxcXCIsIC8vMOWFqOmDqCwgMeacquWujOaIkO+8jDLlt7LlrozmiJBcXG4gICAgZGVmX2lzQ29taWNDb21wYXRpYmxlOiBcXFwiMFxcXCIsXFxuICAgIGRlZl9Db21pY19TdHlsZTogXFxcInRleHRfMVxcXCJcXG59LCBsb2NhbENvbmZpZyk7XFxuY29uc3QgUEFUSFMgPSB7XFxuICAgIG5vdmVsUGF0aDogXFxcIi/lsI/or7QvXFxcIixcXG4gICAgY29taWNQYXRoOiBcXFwiL+a8q+eUuy9cXFwiLFxcbiAgICBub3ZlbEZ1bGxQYXRoOiBcXFwiL+Wwj+ivtOWQiOW5ti9cXFwiLFxcbiAgICBleHRlcm5hbEltcG9ydFBhdGg6IFxcXCIv5aSW5a+85bCP6K+0L1xcXCIsXFxuICAgIGNvbnRlbnRzQ2FjaGU6IFxcXCIv55uu5b2V57yT5a2YL1xcXCJcXG59XFxuXFxuXFxuT2JqZWN0LmtleXMoUEFUSFMpLmZvckVhY2goa2V5ID0+IENvbmZpZ1trZXldID0gQ29uZmlnLmhvbWVQYXRoICsgUEFUSFNba2V5XSk7XFxuXFxuJC5leHBvcnRzID0gQ29uZmlnO1wifV0sXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIuacrOWcsOi1hOa6kOeuoeeQhlwiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD1ub3ZlbENvbWljXCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG5sZXQgaGVscFRleHQgPSB7XFxuICAgIFxcXCJ0eHRcXFwiOiBgXFxuICAgICAgICA8aDEgaWQ9XFxcInR4dOaYr+S7gOS5iFxcXCI+VFhU5piv5LuA5LmIPzwvaDE+XFxuICAgICAgICA8cD48YSBocmVmPVxcXCJodHRwczovL2JhaWtlLmJhaWR1LmNvbS9pdGVtL3R4dC8xMjE3MzMwXFxcIj7miJHlt7Lnu4/luK7kvaDnmb7luqbkuoY8L2E+77yb566A5Y2V5p2l6K+05bCx5piv5LiA56eN5YKo5a2Y5bCP6K+055qE5paH5Lu2KOaJqeWxleWQjTp0eHQp44CCPC9wPlxcbiAgICAgICAgPGgxIGlkPVxcXCLlpoLkvZXnlKjor6XlsI/nqIvluo/pmIXor7t0eHTlsI/or7RcXFwiPuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtD88L2gxPlxcbiAgICAgICAgPHA+5Zyo5Li76aG16Z2iIOKXiVRYVCDnlYzpnaLkuIvvvIzngrnlh7vlr7zlhaVUWFTvvIzpgInmi6nnm67moIflsI/or7Tmlofku7YodHh05paH5Lu277yMPGVtPuivpeaTjeS9nOS4jeS8muWIoOmZpHR4dOaWh+S7tu+8jOiAjOaYr2NvcHnkuIDku73liLDlsI/nqIvluo/nmoTot6/lvoTkuIs8L2VtPinvvIzlr7zlhaXlkI7lho3lnKgg4peJVFhUIOeVjOmdouS4i+mAieaLqeaDs+imgemYheivu+eahOWwj+ivtOWNs+WPr+OAgjwvcD5cXG5cXG4gICAgYCxcXG4gICAgXFxcIm5vdmVsQ29taWNcXFwiOiBgXFxuICAgICAgICA8aDEgaWQ9XFxcIui/meS4quWwj+eoi+W6j+acieS7gOS5iOeUqO+8n1xcXCI+6L+Z5Liq5bCP56iL5bqP5pyJ5LuA5LmI55So77yfPC9oMT5cXG4gICAgICAgIDx1bD5cXG4gICAgICAgIDxsaT48dT7ku6PnoIHkuIrkuLrlhbbku5blsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynmj5DkvpvkuIvovb3mjqXlj6PjgII8L3U+PC9saT5cXG4gICAgICAgIDxsaT48dT7mnKzkvZPlhYXlvZPpmIXor7vlmajvvIzlj6/ku6XmtY/op4jnlKjor6XlsI/nqIvluo/mj5DkvpvnmoTkuIvovb3mjqXlj6Mo5LiK6Z2iKe+8jOS4i+i9veeahOa8q+eUuy/lsI/or7TjgII8L3U+PC9saT5cXG4gICAgICAgIDxsaT48dT7mj5DkvptUWFTmoLzlvI/lsI/or7Tmlofku7bop6PmnpDlip/og73jgII8L3U+XFxuICAgICAgICA8aDEgaWQ9XFxcIuS4uuS7gOS5iOWIl+ihqOmHjOS7gOS5iOmDveayoeeUqFxcXCI+5Li65LuA5LmI5YiX6KGo6YeM5LuA5LmI6YO95rKh55SoPzwvaDE+XFxuICAgICAgICA8dT7liJ3mrKHkvb/nlKjvvIzmsqHmnInlvojmraPluLjlkKfjgILwn6SUPC91PlxcbiAgICAgICAgPGgxIGlkPVxcXCLor6XlpoLkvZXmt7vliqDmvKvnlLvmiJblsI/or7RcXFwiPuivpeWmguS9lea3u+WKoOa8q+eUuyjmiJblsI/or7QpPzwvaDE+XFxuICAgICAgICA8dT4g5Zyo5LiA5Liq5pyJ5LiL6L295Yqf6IO955qE5bCP56iL5bqPKOa8q+eUu+exuy/lsI/or7Tnsbsp5Lit5LiL6L295LiA5pys5ryr55S7L+Wwj+ivtO+8jOi/lOWbnuivpeinhOWImeWNs+WPr+a1j+iniOOAgjwvdT48L2xpPlxcbiAgICAgICAgPC91bD5cXG4gICAgYFxcbn07XFxuc2V0UGFnZVRpdGxlKFxcXCLluK7liqlcXFwiKTtcXG5sZXQga2V5d29yZCA9IGdldFBhcmFtKFxcXCJrZXl3b3JkXFxcIik7XFxubGV0IHRleHQ7XFxuaWYgKGtleXdvcmQgPT09IHVuZGVmaW5lZCB8fCAhKHRleHQgPSBoZWxwVGV4dFtrZXl3b3JkXSkpIHtcXG4gICAgc2V0UmVzdWx0KFt7XFxuICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+6LWE5paZ5LiN6KeB5ZKvPC9oMT4nLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH1dKTtcXG59IGVsc2Uge1xcbiAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgIHRpdGxlOiB0ZXh0LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH1dKTtcXG59XCIsXCJncm91cFwiOlwi4p6K4pOQ5bi455SoXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJcIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2YuRmlsZeW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJGaWxlLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxcXG5jb25zdCB7XFxcXG4gICAgRmlsZXMsXFxcXG4gICAgUGF0aHMsXFxcXG4gICAgU3RhbmRhcmRDb3B5T3B0aW9uLFxcXFxuICAgIFN0YW5kYXJkT3Blbk9wdGlvblxcXFxufSA9IGphdmEubmlvLmZpbGU7XFxcXG5jb25zdCBqYXZhU3RyaW5nID0gamF2YS5sYW5nLlN0cmluZztcXFxcbmxldCBqYXZhU2NvcGUgPSBuZXcgSmF2YUltcG9ydGVyKGphdmEuaW8sIGphdmEubGFuZywgamF2YS5sYW5nLnJlZmxlY3QsIGphdmEudXRpbC5WZWN0b3IpO1xcXFxuXFxcXG5mdW5jdGlvbiBkZWxldGVGaWxlcyhmaWxlTmFtZSkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpO1xcXFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXFxcXFwiICsgZmlsZU5hbWUgKyBcXFxcXFxcIuaWh+S7tuS4jeWtmOWcqFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRmlsZShmaWxlTmFtZSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfVxcXFxuXFxcXG59XFxcXG4vKipcXFxcbiAqIOWIoOmZpOWNleS4quaWh+S7tlxcXFxuICogXFxcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXFxcbiAqICAgICAgICAgICAg6KKr5Yig6Zmk5paH5Lu255qE5paH5Lu25ZCNXFxcXG4gKiBAcmV0dXJuIOWNleS4quaWh+S7tuWIoOmZpOaIkOWKn+i/lOWbnnRydWUs5ZCm5YiZ6L+U5ZueZmFsc2VcXFxcbiAqL1xcXFxuZnVuY3Rpb24gZGVsZXRlRmlsZShmaWxlTmFtZSkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpO1xcXFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgZmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTljZXkuKrmlofku7ZcXFxcXFxcIiArIGZpbGVOYW1lICsgXFxcXFxcXCLmiJDlip/vvIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcXFxcXCIgKyBmaWxlTmFtZSArIFxcXFxcXFwi5aSx6LSl77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxuXFxcXG59XFxcXG4vKipcXFxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcXFxuICogXFxcXG4gKiBAcGFyYW0gZGlyXFxcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcXFxuICogQHJldHVybiDnm67lvZXliKDpmaTmiJDlip/ov5Tlm550cnVlLOWQpuWImei/lOWbnmZhbHNlXFxcXG4gKi9cXFxcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXFxcbiAgICAvLyDlpoLmnpxkaXLkuI3ku6Xmlofku7bliIbpmpTnrKbnu5PlsL7vvIzoh6rliqjmt7vliqDmlofku7bliIbpmpTnrKZcXFxcbiAgICBpZiAoIWRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHtcXFxcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxcXG4gICAgfVxcXFxuICAgIGxldCBkaXJGaWxlID0gbmV3IEZpbGUoZGlyKTtcXFxcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXFxcbiAgICBpZiAoIWRpckZpbGUuZXhpc3RzKCkgfHwgIWRpckZpbGUuaXNEaXJlY3RvcnkoKSkge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOebruW9leWksei0pVxcXFxcXFwiICsgZGlyICsgXFxcXFxcXCLnm67lvZXkuI3lrZjlnKjvvIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGZsYWcgPSB0cnVlO1xcXFxuICAgIC8vIOWIoOmZpOaWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tijljIXmi6zlrZDnm67lvZUpXFxcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIC8vIOWIoOmZpOWtkOaWh+S7tlxcXFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXFxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTtcXFxcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGVsc2UgeyAvLyDliKDpmaTlrZDnm67lvZVcXFxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcXFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKCFmbGFnKSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxuICAgIC8vIOWIoOmZpOW9k+WJjeebruW9lVxcXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk55uu5b2VXFxcXFxcXCIgKyBkaXIgKyBcXFxcXFxcIuaIkOWKn++8gVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTnm67lvZVcXFxcXFxcIiArIGRpciArIFxcXFxcXFwi5aSx6LSl77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG4vL2NvcHnljZXkuKrmlofku7ZcXFxcbmZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSB7XFxcXG4gICAgbGV0IHNvdXJjZVBhdGggPSBQYXRocy5nZXQoc291cmNlKTtcXFxcbiAgICBsZXQgdGFyZ2V0UGF0aCA9IFBhdGhzLmdldCh0YXJnZXQpO1xcXFxuICAgIGxldCBpc0V4aXN0ID0gRmlsZXMuZXhpc3RzKHRhcmdldFBhdGgpO1xcXFxuICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShzb3VyY2VQYXRoKSB8fCAoaXNFeGlzdCAmJiAhaXNDb3ZlcikgfHwgKGlzRXhpc3QgJiYgRmlsZXMuaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpKSB7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKCFpc0V4aXN0KSB7XFxcXG4gICAgICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3Rvcmllcyh0YXJnZXRQYXRoLmdldFBhcmVudCgpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoaXNDb3ZlciA9PT0gdHJ1ZSkge1xcXFxuICAgICAgICAgICAgRmlsZXMuY29weShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORywgU3RhbmRhcmRDb3B5T3B0aW9uLkNPUFlfQVRUUklCVVRFUyk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBGaWxlcy5jb3B5KHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIFN0YW5kYXJkQ29weU9wdGlvbi5DT1BZX0FUVFJJQlVURVMpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRGaWxlVGltZShwYXRoKSB7XFxcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXFxcbiAgICBsZXQgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTtcXFxcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKGxhc3RNb2RpZmllZCk7XFxcXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXROYW1lKHBhdGgpIHtcXFxcbiAgICByZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpICsgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RmlsZVBhdGgocGF0aCwgdHlwZSwgZXhwYW5kKSB7XFxcXG4gICAgdHlwZSA9IHR5cGUgfHwgXFxcXFxcXCJmaWxlXFxcXFxcXCI7XFxcXG4gICAgaWYgKCFbXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiZGlyXFxcXFxcXCJdLmluY2x1ZGVzKHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLnsbvlnovplJnor69cXFxcXFxcIik7XFxcXG4gICAgbGV0IGZpbGVUeXBlID0gdHlwZSA9PT0gXFxcXFxcXCJmaWxlXFxcXFxcXCIgPyBcXFxcXFxcImlzRmlsZVxcXFxcXFwiIDogXFxcXFxcXCJpc0RpcmVjdG9yeVxcXFxcXFwiO1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxcXG4gICAgbGV0IGFycmF5ID0gZmlsZS5saXN0RmlsZXMoKSB8fCBbXTtcXFxcbiAgICBsZXQgcGF0aExpc3QgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGlmIChhcnJheVtpXVtmaWxlVHlwZV0oKSkge1xcXFxuICAgICAgICAgICAgcGF0aExpc3QucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTogYXJyYXlbaV0uZ2V0TmFtZSgpICsgXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBwYXRoOiBhcnJheVtpXS5nZXRQYXRoKCkgKyBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogTnVtYmVyKGFycmF5W2ldLmxhc3RNb2RpZmllZCgpKSxcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmIChleHBhbmQpIHtcXFxcbiAgICAgICAgcGF0aExpc3QgPSBwYXRoTGlzdC5maWx0ZXIoaXQgPT4gaXQubmFtZS5lbmRzV2l0aChleHBhbmQpKTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHBhdGhMaXN0O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRGaWxlcyhwYXRoLCB0eXBlLCBleHBhbmQpIHtcXFxcbiAgICBsZXQgdHlwZXMgPSB7XFxcXG4gICAgICAgIFxcXFxcXFwiZmlsZVxcXFxcXFwiOiBcXFxcXFxcImlzRmlsZVxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImRpclxcXFxcXFwiOiBcXFxcXFxcImlzRGlyZWN0b3J5XFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuICAgIGxldCBmaWxlVHlwZSA9IHR5cGVzW3R5cGVdO1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxcXG4gICAgbGV0IGFycmF5ID0gZmlsZS5saXN0RmlsZXMoKSB8fCBbXTtcXFxcbiAgICBsZXQgZmlsZUxpc3QgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBmaWxlID0gYXJyYXlbaV07XFxcXG4gICAgICAgIGlmICgoIWZpbGVUeXBlIHx8IGZpbGVbZmlsZVR5cGVdKCkpICYmICghZXhwYW5kIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4cGFuZCkpKSB7XFxcXG4gICAgICAgICAgICBmaWxlTGlzdC5wdXNoKGZpbGUpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBmaWxlTGlzdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcmVuYW1lRmlsZShmcm9tUGF0aCwgbmFtZSkge1xcXFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXFxcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUoZnJvbUZpbGUuZ2V0UGFyZW50KCkgKyBcXFxcXFxcIi9cXFxcXFxcIiArIG5hbWUpO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGlmICghZnJvbUZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodG9GaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICBpZiAoIXRvRmlsZS5kZWxldGUoKSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBGaWxlcy5tb3ZlKGZyb21GaWxlLnRvUGF0aCgpLCB0b0ZpbGUudG9QYXRoKCksIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpIHtcXFxcbiAgICBsZXQgZnJvbUZpbGUgPSBuZXcgRmlsZShmcm9tUGF0aCk7XFxcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKHRvUGF0aCk7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKCFmcm9tRmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh0b0ZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgICAgIGlmICghZGVsZXRlRmlsZXModG9QYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBGaWxlcy5tb3ZlKGZyb21GaWxlLnRvUGF0aCgpLCB0b0ZpbGUudG9QYXRoKCksIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZmlsZVdyaXRlKHBhdGgsIGNvbnRlbnQpIHtcXFxcbiAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoLCBjb250ZW50KVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxcXG4gICAgbGV0IHBhdGhzID0gZmlsZS50b1BhdGgoKTtcXFxcbiAgICBpZiAoZmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICBGaWxlcy53cml0ZShwYXRocywgbmV3IGphdmFTdHJpbmcoY29udGVudCkuZ2V0Qnl0ZXMoKSwgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCwgY29udGVudCk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoZmlsZSkge1xcXFxuICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxcXG4gICAgICAgIHJldHVybiBmaWxlLmxlbmd0aCgpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpO1xcXFxuICAgIGxldCB0b3RhbCA9IDA7XFxcXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcXFxcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcXFxcbiAgICAgICAgICAgIHRvdGFsICs9IGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihjaGlsZCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHRvdGFsO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRGaWxlU2l6ZShmaWxlUGF0aCkge1xcXFxuICAgIC8vQnl0ZVxcXFxuICAgIGxldCBzaXplID0gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKG5ldyBGaWxlKGZpbGVQYXRoKSk7XFxcXG4gICAgaWYgKHNpemUgPCAwKSB7XFxcXG4gICAgICAgIHJldHVybiBudWxsO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdW5pdEZvcm0gPSBbXFxcXFxcXCJCeXRlXFxcXFxcXCIsIFxcXFxcXFwiS0JcXFxcXFxcIiwgXFxcXFxcXCJNQlxcXFxcXFwiLCBcXFxcXFxcIkdCXFxcXFxcXCIsIFxcXFxcXFwiVEJcXFxcXFxcIl07XFxcXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHVuaXRGb3JtLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxcXG4gICAgICAgIGlmIChzaXplID4gMTAyNCkge1xcXFxuICAgICAgICAgICAgc2l6ZSAvPSAxMDI0O1xcXFxuICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gc2l6ZS50b0ZpeGVkKDIpLnJlcGxhY2UoLyhcXFxcXFxcXC4wMCkkLywgXFxcXFxcXCJcXFxcXFxcIikgKyB1bml0Rm9ybVtpXTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gXFxcXFxcXCJFUlJPUjrmlbDlgLzov4flpKdcXFxcXFxcIjtcXFxcbn1cXFxcbi8v5a6M5pW05ZCI5bm2XFxcXG4vKlxcXFxuZnVuY3Rpb24gZmlsZUNvbWJpbmUoZmlsZXNJbnB1dCwgZmlsZU91dCwgZXh0ZW5zaW9uLCBpbnRlcmNlcHQpIHtcXFxcbiAgICB3aXRoKGphdmFTY29wZSkge1xcXFxuICAgICAgICBjb25zdCBUTVBfQlVGRkVSX1NJWkUgPSAweDMwMDAwO1xcXFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcXFxuICAgICAgICAvL+WQiOW5tuS4tOaXtuaWh+S7tlxcXFxuICAgICAgICBsZXQgaW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZU91dCArIFxcXFxcXFwiLnRtcFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHRvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSk7XFxcXG4gICAgICAgIGxldCBpbnB1dEZpbGVzID0gaW5wdXRGaWxlLmxpc3RGaWxlcygpO1xcXFxuICAgICAgICBsZXQgdGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgVE1QX0JVRkZFUl9TSVpFKTtcXFxcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBpbnB1dEZpbGVzKSB7XFxcXG4gICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxcXG4gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKHRieXMpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0b3Mud3JpdGUodGJ5cywgMCwgbGVuKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0b3MuY2xvc2UoKTtcXFxcbiAgICAgICAgLy/op4TliJnmm7/mjaLop4TliJk7XFxcXG4gICAgICAgIGxldCBvdXRGaWxlID0gbmV3IEZpbGUoZmlsZU91dCk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0ID09PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcXFxuICAgICAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXFxcbiAgICAgICAgICAgIGxldCBsZW4gPSAwO1xcXFxuICAgICAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcXFxuICAgICAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBuYnlzID0gaW50ZXJjZXB0KG5ldyBTdHJpbmcoYnlzLDAsbGVuKSk7XFxcXG4gICAgICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgdG1wRmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgICAgIHRpcy5jbG9zZSgpO1xcXFxuICAgICAgICAgICAgb3MuY2xvc2UoKTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHRtcEZpbGUucmVuYW1lVG8ob3V0RmlsZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG59Ki9cXFxcbi8v5q6LXFxcXG5mdW5jdGlvbiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpIHtcXFxcbiAgICB3aXRoKGphdmFTY29wZSkge1xcXFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcXFxuICAgICAgICBsZXQgdG1wRmlsZSA9IG5ldyBGaWxlKGZpbGVzSW5wdXQpO1xcXFxuICAgICAgICBpZiAoISh0bXBGaWxlLmV4aXN0cygpICYmIHRtcEZpbGUuaXNGaWxlKCkpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXFxcblxcXFxuICAgICAgICBsZXQgdGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBGaWxlKTtcXFxcbiAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXFxcbiAgICAgICAgbGV0IGxlbiA9IDA7XFxcXG4gICAgICAgIGxldCBieXMgPSBBcnJheS5uZXdJbnN0YW5jZShCeXRlLlRZUEUsIEJVRkZFUl9TSVpFKTtcXFxcbiAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgbGV0IG5ieXMgPSBpbnRlcmNlcHQobmV3IFN0cmluZyhieXMsIDAsIGxlbikpO1xcXFxuICAgICAgICAgICAgb3Mud3JpdGUobmJ5cywgMCwgbmJ5cy5sZW5ndGgpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxcXG4gICAgICAgIHRpcy5jbG9zZSgpO1xcXFxuICAgICAgICBvcy5jbG9zZSgpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlYWRGaWxlKHBhdGgpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgcGF0aHMgPSBQYXRocy5nZXQocGF0aCk7XFxcXG4gICAgICAgIGlmICghRmlsZXMuZXhpc3RzKHBhdGhzKSkgcmV0dXJuIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIHJldHVybiBTdHJpbmcobmV3IGphdmFTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGhzKSkpO1xcXFxuICAgIH0gY2F0Y2gge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB9XFxcXG59XFxcXG4kLmV4cG9ydHMgPSB7XFxcXG4gICAgZ2V0RmlsZVRpbWU6IChwYXRoKSA9PiBnZXRGaWxlVGltZShwYXRoKSxcXFxcbiAgICBnZXRGaWxlUGF0aDogKHBhdGgsIHR5cGUsIGV4cGFuZCkgPT4gZ2V0RmlsZVBhdGgocGF0aCwgdHlwZSwgZXhwYW5kKSxcXFxcbiAgICBkZWxldGVGaWxlczogKHBhdGgpID0+IGRlbGV0ZUZpbGVzKHBhdGgpLFxcXFxuICAgIHJlbmFtZUZpbGU6IChwYXRoLCBuYW1lKSA9PiByZW5hbWVGaWxlKHBhdGgsIG5hbWUpLFxcXFxuICAgIG1vdmVGaWxlczogKGZyb21QYXRoLCB0b1BhdGgpID0+IG1vdmVGaWxlcyhmcm9tUGF0aCwgdG9QYXRoKSxcXFxcbiAgICBmaWxlV3JpdGU6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGUocGF0aCwgY29udGVudCksXFxcXG4gICAgZmlsZVdyaXRlQXBwZW5kOiAocGF0aCwgY29udGVudCkgPT4gZmlsZVdyaXRlQXBwZW5kKHBhdGgsIGNvbnRlbnQpLFxcXFxuICAgIGdldE5hbWU6IChwYXRoKSA9PiBnZXROYW1lKHBhdGgpLFxcXFxuICAgIGdldEZpbGVTaXplOiAoZmlsZVBhdGgpID0+IGdldEZpbGVTaXplKGZpbGVQYXRoKSxcXFxcbiAgICBmaWxlUnVsZTogKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdCkgPT4gZmlsZVJ1bGUoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSxcXFxcbiAgICBjb3B5RmlsZTogKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSA9PiBjb3B5RmlsZShzb3VyY2UsIHRhcmdldCwgaXNDb3ZlciksXFxcXG4gICAgcmVhZEZpbGU6IChwYXRoKSA9PiByZWFkRmlsZShwYXRoKSxcXFxcbiAgICBnZXRGaWxlczogKHBhdGgsIHR5cGUsIGV4cGFuZCkgPT4gZ2V0RmlsZXMocGF0aCwgdHlwZSwgZXhwYW5kKSxcXFxcbiAgICBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXI6KGZpbGUpPT5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoZmlsZSlcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF8yXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuS4i+i9veWIl+ihqC3mma7pgJrkuIvovb1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiZG93bmxvYWQudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHZpZXdDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICBjaGFwdGVyTGlzdDogW10sXFxcXG4gICAgaW5mbzoge30sXFxcXG4gICAgZGVmYXVsdFZpZXc6IFxcXFxcXFwiMFxcXFxcXFwiXFxcXG59LCBNWV9QQVJBTVMpO1xcXFxudmlld0NvbmZpZy5pbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgcnVsZU5hbWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgYm9va05hbWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgYm9va1RvcFBpYzogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICBwYXJzZUNvZGU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgZGVjb2RlOiB1bmRlZmluZWQsXFxcXG4gICAgdHlwZTogXFxcXFxcXCJjb21pY1xcXFxcXFwiLFxcXFxuICAgIGNvbWljU2NoZW1lOiBcXFxcXFxcIjFcXFxcXFxcIixcXFxcbiAgICBib29rSWQ6XFxcXFxcXCJcXFxcXFxcIixcXFxcbn0sIHZpZXdDb25maWcuaW5mbyk7XFxcXG5sZXQge1xcXFxuICAgIGNoYXB0ZXJMaXN0LFxcXFxuICAgIGluZm8sXFxcXG4gICAgZGVmYXVsdFZpZXdcXFxcbn0gPSB2aWV3Q29uZmlnO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6YCJ5oup5ZmofFxcXFxcXFwiICsgaW5mby5ib29rTmFtZSlcXFxcblxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcblxcXFxudmlld0NvbmZpZy5pbmZvLmJvb2tOYW1lID0gVG9vbC50ZXh0U2hpZWxkKHZpZXdDb25maWcuaW5mby5ib29rTmFtZSk7XFxcXG52aWV3Q29uZmlnLmluZm8ucnVsZU5hbWUgPSBUb29sLnRleHRTaGllbGQodmlld0NvbmZpZy5pbmZvLnJ1bGVOYW1lKTtcXFxcblxcXFxuY29uc3QgTVlfSUQgPSBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvL1xcXFxcXFwiICsgaW5mby5ib29rTmFtZStcXFxcXFxcIi8vXFxcXFxcXCIraW5mby5ib29rSWQ7XFxcXG5sZXQgYm9pZD1pbmZvLmJvb2tJZD9cXFxcXFxcIiRcXFxcXFxcIitpbmZvLmJvb2tJZDpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuY29uc3QgY3BhdGg9XFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lK2JvaWQ7XFxcXG5sZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbmxldCB2aWV3TW9kZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIiwgZGVmYXVsdFZpZXcpO1xcXFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNSZXZlcnNlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCB0YWdGaWx0ZXIgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiLCBDb25maWcuZGVmX0RvVmlfVHlwZSk7XFxcXG5cXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKChNWV9JRCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmNvbXBsZXRlZFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjp0YWdGaWx0ZXJcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOnBhZ2VOdW1cXFxcXFxcIik7XFxcXG59LCBNWV9JRCkpO1xcXFxuXFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5cXFxcbmlmIChpc1N0YXJ0ID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIiwgZGVmYXVsdFZpZXcpO1xcXFxuICAgIHZpZXdNb2RlID0gXFxcXFxcXCIxXFxcXFxcXCI7XFxcXG59XFxcXG5cXFxcbmxldCBiYWNrdXBDaGFwdGVyTGlzdCA9IGNoYXB0ZXJMaXN0O1xcXFxuaWYgKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgIGlmIChjaGFwdGVyTGlzdC5zdGFydHNXaXRoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgY2hhcHRlckxpc3QgPSBnZXRQYXRoKGNoYXB0ZXJMaXN0KS5zbGljZSg3KTtcXFxcbiAgICAgICAgYmFja3VwQ2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcbiAgICB9XFxcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBjaGFwdGVyTGlzdCkgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbn1cXFxcbmxldCBjaGFwdGVyQWxsID0gY2hhcHRlckxpc3Q7XFxcXG5jaGFwdGVyTGlzdCA9IGNoYXB0ZXJMaXN0Lm1hcCgoaXRlbSwgQ0lEKSA9PiB7XFxcXG4gICAgaXRlbS5DSUQgPSBDSUQ7XFxcXG4gICAgaXRlbS50aXRsZSA9IFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKTtcXFxcbiAgICByZXR1cm4gaXRlbTtcXFxcbn0pO1xcXFxubGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpwYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKSk7XFxcXG5sZXQgY2hhcHRlckNodW5rID0gW2NoYXB0ZXJMaXN0XS5jb25jYXQoVG9vbC5jaHVuayhjaGFwdGVyTGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSkpO1xcXFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyQ2h1bmtbcGFnZU51bV0gfHwgW107XFxcXG5jb25zdCBkZWZfRG9WaV9TdHlsZSA9IGNoYXB0ZXJBbGwubGVuZ3RoID09PSAxID8gXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIgOiBDb25maWcuZGVmX0RvVmlfU3R5bGU7XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFR5cGUoKSB7XFxcXG4gICAgbGV0IHNldCA9ICh0YWcsIHB1dCkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgKFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIikuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoc2V0LCAwLCBNWV9JRCArIFxcXFxcXFwiOnBhZ2VOdW1cXFxcXFxcIiksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hhcHRlckNodW5rLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCB0YWdUZXh0ID0gKGkgLSAxKSAqIENvbmZpZy52aWV3UGFnZVNpemUgKyBcXFxcXFxcIi1cXFxcXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaSA9PSBwYWdlTnVtID8gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IHRhZ1RleHQsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcXFxcXCI6cGFnZU51bVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMFxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjFcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMVxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjJcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMlxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgY2hhcHRlclRlYW0gPSBbXTtcXFxcbmxldCByZWNvcmQgPSBbXTtcXFxcbmlmIChpbmZvLnR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIikge1xcXFxuICAgIGxldCBsYXp5ID0gJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXFxcbiAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIi9cXFxcXFxcIiArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY2xpc3Quam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIGNwYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGl0ZW0udGl0bGU7XFxcXG4gICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIuKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiByb290UGF0aCArIGxhenksXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFxcXFxcIlBhdGhcXFxcXFxcIl0gK2NwYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFxcXFxcIkFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpLFxcXFxuICAgICAgICAgICAgICAgIHBhdGg6IENvbmZpZy5ub3ZlbFBhdGggKyBjcGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaSArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIudHh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGVcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFxcXFxcIlBhdGhcXFxcXFxcIl0gKyBjcGF0aCwgXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiLnR4dFxcXFxcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFxcXFxcIkFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXS5zbGljZSgwLCBhdHRbMl0ubGFzdEluZGV4T2YoXFxcXFxcXCIuXFxcXFxcXCIpKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY2xpY2tEb3dubG9hZChpdGVtLCBpbmZvLCBNWV9JRCwgaSkge1xcXFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgbGV0IEVsZW1lbnRJbmRleCA9IGxvYWRpbmdUZWFtLmluZGV4T2YoaSk7XFxcXG4gICAgaWYgKEVsZW1lbnRJbmRleCA+IC0xKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vVxcXFxcXFwiO1xcXFxuXFxcXG4gICAgbG9hZGluZ1RlYW0ucHVzaChpKTtcXFxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvYWRpbmdUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGxvYWRpbmdUZWFtKSk7XFxcXG4gICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAmOKAmFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCByZXN1bHQgPSBcXFxcXFxcInRvYXN0Oi8v5LiL6L295aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLlvIDlp4vkuIvovb06XFxcXFxcXCIgKyBpdGVtLnRpdGxlKTtcXFxcbiAgICAgICAgbGV0IGRvd25sb2FkID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0Rvd25sb2FkLmV4ZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVzdWx0ID0gZG93bmxvYWQoaXRlbSwgaW5mbywgaSwgTVlfSUQpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwidG9hc3Q6Ly/lt7LkuIvovb1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICB9IGZpbmFsbHkge1xcXFxuICAgICAgICBsb2FkaW5nVGVhbS5zcGxpY2UoRWxlbWVudEluZGV4LCAxKTtcXFxcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShsb2FkaW5nVGVhbSkpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcmVzdWx0O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzaW5nbGVWaWV3KCkge1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Y+N6L2s5YiX6KGoXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpc1JldmVyc2UsIE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzUmV2ZXJzZVxcXFxcXFwiLCBpc1JldmVyc2UgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSwgTVlfSUQpLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2lkPTMzbnZEcWJISDdIVyZzaXplPTQ4JmZvcm1hdD1naWYmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fMlxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmibnph4/kuIvovb1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKGxvYWRpbmdUZWFtLmxlbmd0aCA+IDApIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6L+Y5pyJ5Lu75Yqh5rKh5pyJ5a6M5oiQXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBpZiAoZ2V0QXBwVmVyc2lvbigpIDwgMjU5NCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrlvIDmlL5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuXFxcXG4gICAgICAgIH0sIE1ZX0lEKSxcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPTB1YWZhTU56eGo4OCZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBzZXRUeXBlKCk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGZvciAobGV0IGkgPSAwLCBpdGVtID0gY2hhcHRlckxpc3RbMF07IGkgPCBjaGFwdGVyTGlzdC5sZW5ndGg7IGl0ZW0gPSBjaGFwdGVyTGlzdFsrK2ldKSB7XFxcXG4gICAgICAgIGxldCBpc19kb3dubG9hZCA9IHJlY29yZC5pbmNsdWRlcyhpdGVtLnRpdGxlKTtcXFxcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcXFxcXCIyXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBsb2FkaW5nVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFxcXFxcIuKAmOKAmFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIgOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKGNsaWNrRG93bmxvYWQsIGl0ZW0sIGluZm8sIE1ZX0lELCBpdGVtLkNJRCksXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpdGVtLkNJRFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY2xpY2tDaG9vc2UodGl0bGUsIE1ZX0lELCBpKSB7XFxcXG4gICAgbGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIik7XFxcXG4gICAgaWYgKGlzU3RhcnQgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vS4uLlxcXFxcXFwiO1xcXFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gYmF0Y2hUZWFtLmluZGV4T2YoaSk7XFxcXG4gICAgaWYgKEVsZW1lbnRJbmRleCA+IC0xKSB7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGJhdGNoVGVhbS5zcGxpY2UoRWxlbWVudEluZGV4LCAxKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAmOKAmFxcXFxcXFwiICsgdGl0bGUgKyBcXFxcXFxcIuKAmeKAmVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGJhdGNoVGVhbS5wdXNoKGkpO1xcXFxuICAgIH1cXFxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGJhdGNoVmlldygpIHtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWNlemAieS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2lkPVBJaWN2RjZlYnpNbiZzaXplPTQ4JmZvcm1hdD1naWYmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5om56YeP5LiL6L29XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIE1ZX0lEKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF80XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgc3RhcnQgPSBDb25maWcudmlld1BhZ2VTaXplICogTWF0aC5tYXgocGFnZU51bSAtIDEsIDApO1xcXFxuICAgIGxldCBlbmQgPSBzdGFydCArIGNoYXB0ZXJMaXN0Lmxlbmd0aDtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIumAieaLqeWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MUhWY0hMb056cml0JnRva2VuPVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9veWTpn5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gVG9vbC5yYW5nZShzdGFydCwgZW5kKTtcXFxcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IEFycmF5LmZyb20obmV3IFNldChiYXRjaFRlYW0uY29uY2F0KGNob29zZVRlYW0pKSk7XFxcXG4gICAgICAgICAgICBsZXQgY29tcGxldGVkID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmNvbXBsZXRlZFxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBiYXRjaFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKChpKSA9PiAhY29tcGxldGVkLmluY2x1ZGVzKGkpKTtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIHN0YXJ0LCBlbmQsIE1ZX0lEKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF80XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWPlua2iOWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9SHpFalBwSTNOTDhEJnRva2VuPVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9veWTpn5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gbmV3IFNldChUb29sLnJhbmdlKHN0YXJ0LCBlbmQpKTtcXFxcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoeCA9PiAhY2hvb3NlVGVhbS5oYXMoeCkpO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi56Gu6K6k6YCJ5LitXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD10TXJ2dGM2VDloVmImdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiLCBcXFxcXFxcIi0xXFxcXFxcXCIpICE9PSBcXFxcXFxcIi0xXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9veWTpn5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBiYXRjaFRlYW0ubGVuZ3RoID09PSAwID8gXFxcXFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeaciemAiVxcXFxcXFwiIDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2gudmlldyNub1JlZnJlc2gjI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiO1xcXFxuICAgICAgICB9LCBNWV9JRCksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBuZXdXaW5kb3c6IHRydWUsXFxcXG4gICAgICAgICAgICB3aW5kb3dJZDogTVlfSUQgKyBcXFxcXFxcIi8v5om56YeP5LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBNWV9JRDogTVlfSUQsXFxcXG4gICAgICAgICAgICBjaGFwdGVyTGlzdDogYmFja3VwQ2hhcHRlckxpc3QsXFxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgc2V0VHlwZSgpO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGxldCBjb21wbGV0ZWQgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMCwgaXRlbSA9IGNoYXB0ZXJMaXN0WzBdOyBpIDwgY2hhcHRlckxpc3QubGVuZ3RoOyBpdGVtID0gY2hhcHRlckxpc3RbKytpXSkge1xcXFxuICAgICAgICBsZXQgaXNfZG93bmxvYWQgPSByZWNvcmQuaW5jbHVkZXMoaXRlbS50aXRsZSk7XFxcXG5cXFxcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkKSB7XFxcXG4gICAgICAgICAgICBjb21wbGV0ZWQucHVzaChpdGVtLkNJRCk7XFxcXG4gICAgICAgICAgICBpZiAodGFnRmlsdGVyICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcXFxcXCIyXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBiYXRjaFRlYW0uaW5jbHVkZXMoaXRlbS5DSUQpID8gXFxcXFxcXCLigJjigJhcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIuKAmeKAmVxcXFxcXFwiIDogaXRlbS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShjbGlja0Nob29zZSwgaXRlbS50aXRsZSwgTVlfSUQsIGl0ZW0uQ0lEKSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGl0ZW0uQ0lEXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6Y29tcGxldGVkXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGNvbXBsZXRlZCkpO1xcXFxufVxcXFxuc3dpdGNoICh2aWV3TW9kZSkge1xcXFxuICAgIGNhc2UgXFxcXFxcXCIwXFxcXFxcXCI6XFxcXG4gICAgICAgIHNpbmdsZVZpZXcoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSBcXFxcXFxcIjFcXFxcXFxcIjpcXFxcbiAgICAgICAgYmF0Y2hWaWV3KCk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBjaGFwdGVyVGVhbS5yZXZlcnNlKCk7XFxcXG59XFxcXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGNoYXB0ZXJUZWFtKTtcXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuaJuemHj+S4i+i9veWZqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJCYXRjaC52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IHtcXFxcbiAgICBjaGFwdGVyTGlzdCxcXFxcbiAgICBpbmZvLFxcXFxuICAgIE1ZX0lEXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5LiL6L295ZmofFxcXFxcXFwiK2luZm8uYm9va05hbWUpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIpO1xcXFxuICAgIHJlZnJlc2hQYWdlKCk7XFxcXG59LCBNWV9JRCkpO1xcXFxuXFxcXG5sZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuXFxcXG5sZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG5pZih0eXBlb2YgY2hhcHRlckxpc3QgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpe1xcXFxuICAgIGNoYXB0ZXJMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiK2NoYXB0ZXJMaXN0KXx8XFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbn1cXFxcbmxldCBjaGFwdGVyVGVhbSA9IGJhdGNoVGVhbS5tYXAodiA9PiB7XFxcXG4gICAgbGV0IGNoYXB0ZXJJdGVtID0gY2hhcHRlckxpc3Rbdl07XFxcXG4gICAgY2hhcHRlckl0ZW0uQ0lEID0gdjtcXFxcbiAgICByZXR1cm4gY2hhcHRlckl0ZW07XFxcXG59KTtcXFxcbmlmIChpc1N0YXJ0ID09PSBcXFxcXFxcIjBcXFxcXFxcIikge1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5byA5aeL5LiL6L29W1xcXFxcXFwiICsgY2hhcHRlclRlYW0ubGVuZ3RoICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2hTdGF0aXN0aWNzLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYoaW5mby50eXBlPT09XFxcXFxcXCJjb21pY1xcXFxcXFwiJiZpbmZvLmNvbWljU2NoZW1lPT09XFxcXFxcXCIxXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgICAgIGRvd25sb2FkPWRvd25sb2FkLmI7XFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICBkb3dubG9hZD1kb3dubG9hZC5hO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkgfHwgXFxcXFxcXCJ0b2FzdDovL+S4i+i9vemUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICB9LCBjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85byA5aeL5LiL6L29XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Lu75Yqh5YiX6KGo77yaXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlclRlYW0pIHtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuXFxcXG59IGVsc2Uge1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5LiL6L296L+b5bqmOjAvXFxcXFxcXCIrY2hhcHRlclRlYW0ubGVuZ3RoLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuKAnOKAnOKAneKAneKWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh1xcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiNlNWUxZTRcXFxcXFxcIikrXFxcXFxcXCIgMCVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9vei/m+W6plxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWQjuWPsOS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiZnVuYzovL2JhY2tncm91bmRcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFtcXFxcXFxcIlvlj5bmtojkuIvovb1dXFxcXFxcXCIsIFxcXFxcXFwiW+ato+WcqOWBnOatoi4uLl1cXFxcXFxcIiwgXFxcXFxcXCJb6L+U5ZueXVxcXFxcXFwiLCBcXFxcXFxcIlvlpITnkIblpLHotKVdXFxcXFxcXCIsIFxcXFxcXFwiW+mHjeaWsOW8gOWni11cXFxcXFxcIl1bc3RhdHVzXSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXFxcXFxcXCIwXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvmraPlnKjlgZzmraIuLi5dXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5Y+W5raI5LiL6L295Lu75YqhXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOaaguWBnC4uLlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFxcXFxcXFwiMlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey6YCA5Ye65LiL6L295ZmoXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtcXFxcXFxcIjNcXFxcXFxcIiwgXFxcXFxcXCI0XFxcXFxcXCJdLmluY2x1ZGVzKHN0YXR1cykpIHtcXFxcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2dcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mHjeaWsOeCueWHu+S4i+i9vVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIE1ZX0lEKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8c3Ryb25nPuS4i+i9veaXpeW/lzwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85pel5b+XXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6XFxcXFxcXCLigJzigJzigJ3igJ0kPlxcXFxcXFwiK1xcXFxcXFwi5byA5aeL5LiL6L29Li4uLi4uXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiIzAwZmYwMFxcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI2xvZyMwXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTpmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiNmZy7mibnph4/kuIvovb3nu5/orqFcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQmF0Y2hTdGF0aXN0aWNzLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG5cXFxcbiQuZXhwb3J0cy5hID0gZnVuY3Rpb24oY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB7XFxcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIHZhciBjb3VudCA9IDA7XFxcXG4gICAgdmFyIHRhc2tDb3VudCA9IGNoYXB0ZXJUZWFtLmxlbmd0aDtcXFxcbiAgICB2YXIgc3VjY2Vzc0NJRCA9IFtdO1xcXFxuICAgIHZhciBmYWlsTmFtZSA9IFtdO1xcXFxuICAgIHZhciBsb2dDb3VudCA9IDE7XFxcXG4gICAgdmFyIHRhc2tUZWFtID0gY2hhcHRlclRlYW0ubWFwKGNoYXB0ZXJJdGVtID0+ICh7XFxcXG4gICAgICAgIGZ1bmM6IHRhc2ssXFxcXG4gICAgICAgIGlkOiBjaGFwdGVySXRlbS50aXRsZSxcXFxcbiAgICAgICAgcGFyYW06IHtcXFxcbiAgICAgICAgICAgIGNoYXB0ZXJJdGVtOiBjaGFwdGVySXRlbSxcXFxcbiAgICAgICAgICAgIGluZm86IGluZm8sXFxcXG4gICAgICAgICAgICBNWV9JRDogTVlfSURcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pKTtcXFxcbiAgICBsZXQgbG9nTnVtID0gQ29uZmlnLmxvZ051bTtcXFxcblxcXFxuXFxcXG4gICAgZnVuY3Rpb24gcHV0TG9nKHRleHQpIHtcXFxcbiAgICAgICAgbG9nKHRleHQpO1xcXFxuICAgICAgICBpZiAobG9nQ291bnQgPj0gbG9nTnVtKSB7XFxcXG4gICAgICAgICAgICBkZWxldGVJdGVtKE1ZX0lEICsgXFxcXFxcXCIjbG9nI1xcXFxcXFwiICsgKGxvZ0NvdW50IC0gMTApKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoTVlfSUQgKyBcXFxcXFxcInx85pel5b+XXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCIkPlxcXFxcXFwiICsgdGV4dCxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjbG9nI1xcXFxcXFwiICsgbG9nQ291bnRcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxvZ0NvdW50Kys7XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZnVuY3Rpb24gdGFzayh0YXNrUGFyYW0pIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9CYXRjaC5leGUuanNcXFxcXFxcIikodGFza1BhcmFtKTtcXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBsaXN0ZW5lcihwZXJjaCwgaWQsIGVycm9yLCBDSUQpIHtcXFxcbiAgICAgICAgY291bnQrKztcXFxcbiAgICAgICAgbGV0IGlzU3VjY2VzcyA9IGZhbHNlO1xcXFxuICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgZmFpbE5hbWUucHVzaChpZCk7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJd5LiL6L295aSx6LSl77yaXFxcXFxcXCIgKyBpZCArIFxcXFxcXFwiPEVSUk9SQCBcXFxcXFxcIiArIGVycm9yICsgXFxcXFxcXCI+XFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKENJRCA+PSAwKSB7XFxcXG4gICAgICAgICAgICBzdWNjZXNzQ0lELnB1c2goQ0lEKTtcXFxcbiAgICAgICAgICAgIGxldCByYXRpbyA9IChjb3VudCAvIHRhc2tDb3VudCkudG9GaXhlZCg0KTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJpcENvdW50ID0gTWF0aC5jZWlsKHJhdGlvICogMTApO1xcXFxuICAgICAgICAgICAgaXNTdWNjZXNzID0gdHJ1ZTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuS4i+i9vei/m+W6pu+8mlxcXFxcXFwiICsgc3VjY2Vzc0NJRC5sZW5ndGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIHRhc2tDb3VudCxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLilodcXFxcXFxcIi5yZXBlYXQoc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXFxcXFwiI2ZmYWMyZFxcXFxcXFwiKSArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KDEwIC0gc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXFxcXFwiI2U1ZTFlNFxcXFxcXFwiKSArIFxcXFxcXFwiIFxcXFxcXFwiICsgU3RyaW5nKChyYXRpbyAqIDEwMCkpLnNsaWNlKDAsIDUpICsgXFxcXFxcXCIlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9vei/m+W6plxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJd5bey5a6M5oiQ5LiL6L2977yaXFxcXFxcXCIgKyBpZCk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoQ0lEID09PSAtMSkge1xcXFxuICAgICAgICAgICAgZmFpbE5hbWUucHVzaChpZCk7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJd5bey5YGc5q2i77yaXFxcXFxcXCIgKyBpZCk7XFxcXG4gICAgICAgICAgICBjb3VudCA9IHRhc2tDb3VudDtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIGlmICh0YXNrQ291bnQgIT09IGNvdW50KSByZXR1cm47XFxcXG4gICAgICAgIGlmIChzdWNjZXNzQ0lELmxlbmd0aCA9PT0gdGFza0NvdW50KSB7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLilodcXFxcXFxcIi5yZXBlYXQoMTApLmZvbnRjb2xvcihcXFxcXFxcIiMwMGZmMDBcXFxcXFxcIikgKyBcXFxcXFxcIiAxMDAlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9vei/m+W6plxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZmFpbFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKHYgPT4gIXN1Y2Nlc3NDSUQuaW5jbHVkZXModikpO1xcXFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcXFxuICAgICAgICBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgIT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCLkuIvovb3lpLHotKU6W1xcXFxcXFwiICsgZmFpbE5hbWUuam9pbihcXFxcXFxcIl3vvIxbXFxcXFxcXCIpICsgXFxcXFxcXCJd44CCXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+WkhOeQhuWksei0pV1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChmYWlsVGVhbS5sZW5ndGggPiAwICYmIHN0YXR1cyA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiNFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvph43mlrDlvIDlp4tdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJicmVha1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwi5LiL6L295Lu75YqhW1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLkuIvovb3ku7vliqFbXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJd5bey5a6M5oiQXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdGFza1RlYW1DaHVuayA9IFtdO1xcXFxuICAgIGlmIChDb25maWcudGhyZWFkTnVtID4gMCkge1xcXFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gVG9vbC5jaHVuayh0YXNrVGVhbSwgQ29uZmlnLnRocmVhZE51bSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdGFza1RlYW1DaHVuayA9IFt0YXNrVGVhbV07XFxcXG4gICAgfVxcXFxuICAgIGZvciAobGV0IHRhc2tMaXN0IG9mIHRhc2tUZWFtQ2h1bmspIHtcXFxcbiAgICAgICAgYmUodGFza0xpc3QsIHtcXFxcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgLy9sZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGZhaWxUZWFtKSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICB9XFxcXG5cXFxcbiAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG59O1xcXFxuXFxcXG4kLmV4cG9ydHMuYiA9IGZ1bmN0aW9uIGNvbWljKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkge1xcXFxuICAgIGlmIChjaGFwdGVyVGVhbS5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nqbrnmoTkuIvovb3pmJ/liJdcXFxcXFxcIjtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxcXG4gICAgbGV0IGxvZ0NvdW50ID0gMDtcXFxcblxcXFxuICAgIGZ1bmN0aW9uIHB1dExvZyh0ZXh0KSB7XFxcXG4gICAgICAgIGxvZyh0ZXh0KTtcXFxcbiAgICAgICAgaWYgKGxvZ0NvdW50ID49IGxvZ051bSkge1xcXFxuICAgICAgICAgICAgZGVsZXRlSXRlbShNWV9JRCArIFxcXFxcXFwiI2xvZyNcXFxcXFxcIiArIChsb2dDb3VudCAtIDEwKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgYWRkSXRlbUFmdGVyKE1ZX0lEICsgXFxcXFxcXCJ8fOaXpeW/l1xcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiJD5cXFxcXFxcIiArIHRleHQsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI2xvZyNcXFxcXFxcIiArIGxvZ0NvdW50XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsb2dDb3VudCsrO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGZ1bmN0aW9uIHRhc2sodGFza1BhcmFtKSB7XFxcXG4gICAgICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBwaWMgPSBUb29sLmhpa2VyUGljKHRhc2tQYXJhbS51cmwpO1xcXFxuICAgICAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQocGljWzBdLCB0YXNrUGFyYW0uY2hhcHRlclBhdGggKyAodGFza1BhcmFtLmkgKyAxKSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBwaWNbMV0sIHRhc2tQYXJhbS5kZWNvZGUpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcih0YXNrUGFyYW0uTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgZXJyb3JOdW0gPSAwO1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIGlmIChpID09PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0YXNrUGFyYW0uQ0lEO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgY291bnQgPSAwO1xcXFxuICAgIGxldCB0b3RhbENvdW50ID0gMDtcXFxcbiAgICBsZXQgc3VjY2Vzc0NJRCA9IFtdO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIocGFyYW0sIGlkLCBlcnJvciwgcmVzdWx0KSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICB0b3RhbENvdW50Kys7XFxcXG5cXFxcbiAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXeS4i+i9veWksei0pe+8mlxcXFxcXFwiICsgaWQgKyBcXFxcXFxcIjxFUlJPUkAgXFxcXFxcXCIgKyBlcnJvciArIFxcXFxcXFwiPlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl3lt7LlgZzmraLvvJpcXFxcXFxcIiArIGlkKTtcXFxcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcGFyYW0ucGl2Q291bnQ7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJhdGlvID0gKChjb3VudCAvIHBhcmFtLnBpdkNvdW50KSkudG9GaXhlZCg0KTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc3RyaXBDb3VudCA9IE1hdGguY2VpbChyYXRpbyAqIDEwKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0ucGl2Q291bnQgPT09IHRvdGFsQ291bnQgJiYgdG90YWxDb3VudCA9PT0gY291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NJRC5wdXNoKHBhcmFtLkNJRCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3ov5vluqbvvJpcXFxcXFxcIiArIChzdWNjZXNzQ0lELmxlbmd0aCkgKyBcXFxcXFxcIi9cXFxcXFxcIiArIHBhcmFtLnRvdGFsLFxcXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLilodcXFxcXFxcIi5yZXBlYXQoc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXFxcXFwiI2ZmYWMyZFxcXFxcXFwiKSArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KDEwIC0gc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXFxcXFwiI2U1ZTFlNFxcXFxcXFwiKSArIFxcXFxcXFwiIFxcXFxcXFwiICsgU3RyaW5nKChyYXRpbyAqIDEwMCkpLnNsaWNlKDAsIDUpICsgXFxcXFxcXCIlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L296L+b5bqmXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIC8vcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXeW3suWujOaIkOS4i+i9ve+8mlxcXFxcXFwiICsgaWQpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHRvdGFsQ291bnQgIT09IHBhcmFtLnBpdkNvdW50KSByZXR1cm47XFxcXG4gICAgICAgICAgICBpZiAodG90YWxDb3VudCA9PT0gY291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICBGaWxlLnJlbmFtZUZpbGUocGFyYW0uY2hhcHRlclBhdGgsIHBhcmFtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBUb29sLnRleHRTaGllbGQocGFyYW0udGl0bGUpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb3VudCA9IDA7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJicmVha1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsZXQgdGFza1RlYW0gPSBbXTtcXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBUb29sLnRleHRTaGllbGQoaW5mby5ib29rTmFtZSkgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXFxcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0sIGluZm8uZGVjb2RlKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcXFxcXCIgKyBlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjaGFwdGVyVGVhbS5sZW5ndGg7IGsrKykge1xcXFxuICAgICAgICBsZXQgaXRlbSA9IGNoYXB0ZXJUZWFtW2tdO1xcXFxuICAgICAgICBsZXQgb3JkZXIgPSBrO1xcXFxuICAgICAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIGl0ZW0uQ0lEICsgXFxcXFxcXCIkQiRcXFxcXFxcIiArIFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKSArIFxcXFxcXFwiL1xcXFxcXFwiO1xcXFxuICAgICAgICBsZXQgcGljTGlzdCA9IFtdO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGdldFBpY0xpc3QgPSBuZXcgRnVuY3Rpb24oXFxcXFxcXCJpbnB1dFxcXFxcXFwiLCBcXFxcXFxcInVybFxcXFxcXFwiLCBcXFxcXFxcImluZGV4XFxcXFxcXCIsIFxcXFxcXFwidGl0bGVcXFxcXFxcIiwgXFxcXFxcXCJyZXR1cm5cXFxcXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXFxcbiAgICAgICAgICAgIHBpY0xpc3QgPSBnZXRQaWNMaXN0KGl0ZW0udXJsLCBpdGVtLnVybCwgaywgaXRlbS50aXRsZSk7XFxcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBpY0xpc3QgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXFxcXFwicGljczovL1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAocGljTGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor6/vvJrlm77niYfpk77mjqXov5Tlm57kuLrnqbo+XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QuZmlsdGVyKHAgPT4gcCk7XFxcXG4gICAgICAgIHZhciB0YXNrVGVhbSA9IHBpY0xpc3QubWFwKCh1cmwsIGkpID0+ICh7XFxcXG4gICAgICAgICAgICBmdW5jOiB0YXNrLFxcXFxuICAgICAgICAgICAgaWQ6IGksXFxcXG4gICAgICAgICAgICBwYXJhbToge1xcXFxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxcXFxuICAgICAgICAgICAgICAgIGk6IGksXFxcXG4gICAgICAgICAgICAgICAgY2hhcHRlclBhdGg6IGNoYXB0ZXJQYXRoLFxcXFxuICAgICAgICAgICAgICAgIE1ZX0lEOiBNWV9JRCxcXFxcbiAgICAgICAgICAgICAgICBkZWNvZGU6IGluZm8uZGVjb2RlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pKTtcXFxcbiAgICAgICAgYmUodGFza1RlYW0sIHtcXFxcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyLFxcXFxuICAgICAgICAgICAgcGFyYW06IHtcXFxcbiAgICAgICAgICAgICAgICBwaXZDb3VudDogcGljTGlzdC5sZW5ndGgsXFxcXG4gICAgICAgICAgICAgICAgdG90YWw6IGNoYXB0ZXJUZWFtLmxlbmd0aCxcXFxcbiAgICAgICAgICAgICAgICBvcmRlcjogb3JkZXIsXFxcXG4gICAgICAgICAgICAgICAgQ0lEOiBpdGVtLkNJRCxcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyUGF0aDogY2hhcHRlclBhdGhcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDQwKTtcXFxcbiAgICAvL2xldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgZmFpbFRlYW0gPSBjaGFwdGVyVGVhbS5maWx0ZXIodiA9PiAhc3VjY2Vzc0NJRC5pbmNsdWRlcyh2LkNJRCkpO1xcXFxuICAgIGxldCBmYWlsTmFtZSA9IGZhaWxUZWFtLm1hcChpdGVtID0+IGl0ZW0udGl0bGUpO1xcXFxuICAgIGxldCBiYXRjaFRlYW0gPSBmYWlsVGVhbS5tYXAoaXRlbSA9PiBpdGVtLkNJRCk7XFxcXG5cXFxcbiAgICBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgIT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcXFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjNcXFxcXFxcIik7XFxcXG4gICAgICAgIHB1dExvZyhcXFxcXFxcIuS4i+i9veWksei0pTpbXFxcXFxcXCIgKyBmYWlsTmFtZS5qb2luKFxcXFxcXFwiXe+8jFtcXFxcXFxcIikgKyBcXFxcXFxcIl3jgIJcXFxcXFxcIik7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+WkhOeQhuWksei0pV1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gZWxzZSBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcXFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIik7XFxcXG4gICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXFxcXFwiKTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCIpO1xcXFxuICAgICAgICBwdXRMb2coXFxcXFxcXCLkuIvovb3ku7vliqFbXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJd5bey5YWo6YOo5oiQ5Yqf5a6M5oiQXFxcXFxcXCIpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiNmZy7mibnph4/kuLvnqIvluo9cXFwiLFxcXCJwYXRoXFxcIjpcXFwiQmF0Y2guZXhlLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IE1pYW4gPSAkLnJlcXVpcmUoXFxcXFxcXCJtYWluRG93bmxvYWRcXFxcXFxcIik7XFxcXG5mdW5jdGlvbiBjb21pYyh0YXNrUGFyYW0pIHtcXFxcbiAgICBsZXQge1xcXFxuICAgICAgICBjaGFwdGVySXRlbSxcXFxcbiAgICAgICAgaW5mbyxcXFxcbiAgICAgICAgTVlfSUQsXFxcXG4gICAgfSA9IHRhc2tQYXJhbTtcXFxcbiAgICByZXR1cm4gTWlhbi5jb21pYyhjaGFwdGVySXRlbSwgaW5mbywgY2hhcHRlckl0ZW0uQ0lELCBNWV9JRCwgdHJ1ZSl8fGNoYXB0ZXJJdGVtLkNJRDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbm92ZWwodGFza1BhcmFtKSB7XFxcXG4gICAgbGV0IHtcXFxcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxcXG4gICAgICAgIGluZm8sXFxcXG4gICAgICAgIE1ZX0lELFxcXFxuICAgIH0gPSB0YXNrUGFyYW07XFxcXG4gICAgcmV0dXJuIE1pYW4ubm92ZWwoY2hhcHRlckl0ZW0sIGluZm8sIGNoYXB0ZXJJdGVtLkNJRCxNWV9JRCwgdHJ1ZSl8fGNoYXB0ZXJJdGVtLkNJRDtcXFxcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgY2hhcHRlckl0ZW0uQ0lEICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGNoYXB0ZXJJdGVtLnRpdGxlKTtcXFxcbn1cXFxcbnZhciAkZXhlID0ge1xcXFxuICAgIGNvbWljOiBjb21pYyxcXFxcbiAgICBub3ZlbDogbm92ZWxcXFxcbn07XFxcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbih0YXNrUGFyYW0pIHtcXFxcbiAgICByZXR1cm4gJGV4ZVt0YXNrUGFyYW0uaW5mby50eXBlXSh0YXNrUGFyYW0pO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5pmu6YCa5Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIkRvd25sb2FkLmV4ZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBNaWFuID0gJC5yZXF1aXJlKFxcXFxcXFwibWFpbkRvd25sb2FkXFxcXFxcXCIpO1xcXFxuZnVuY3Rpb24gbm92ZWwoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKSB7XFxcXG4gICAgTWlhbi5ub3ZlbChpdGVtLCBpbmZvLCBvcmRlcik7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIkBcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIiDkuIvovb3lrozmiJBcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY29taWMoaXRlbSwgaW5mbywgb3JkZXIsIE1ZX0lEKSB7XFxcXG4gICAgTWlhbi5jb21pYyhpdGVtLCBpbmZvLCBvcmRlcik7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIkBcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIiDkuIvovb3lrozmiJBcXFxcXFxcIjtcXFxcbn1cXFxcbnZhciAkZXhlID0ge1xcXFxuICAgIGNvbWljOiBjb21pYyxcXFxcbiAgICBub3ZlbDogbm92ZWxcXFxcbn07XFxcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVtLCBpbmZvLCBvcmRlciwgTVlfSUQpIHtcXFxcbiAgICByZXR1cm4gJGV4ZVtpbmZvLnR5cGVdKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCk7XFxcXG59O1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiNmLumAmueUqOW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJUb29sLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IHYgPSB7XFxcXG4gICAgc3BsaXQodGV4dCwgdGFyZ2V0LCBjb3VudCkge1xcXFxuICAgICAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7XFxcXG4gICAgICAgIGxldCBhcnJheSA9IFt0ZXh0XTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB0ZXh0ID0gYXJyYXlbaV07XFxcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0ZXh0LmluZGV4T2YodGFyZ2V0KTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGFycmF5W2ldID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XFxcXG4gICAgICAgICAgICBhcnJheVtpICsgMV0gPSB0ZXh0LnNsaWNlKGluZGV4ICsgdGFyZ2V0Lmxlbmd0aCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIGFycmF5O1xcXFxuICAgIH0sXFxcXG4gICAgY2h1bmsoYXJyLCBzaXplKSB7XFxcXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcXFxcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gc2l6ZSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyLnNsaWNlKGksIGkgKyBzaXplKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIGhpa2VyUGljKHVybCkge1xcXFxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xcXFxuICAgICAgICBsZXQgdXJscyA9IHVybC5zcGxpdChcXFxcXFxcIkBcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBwaWNVcmwgPSB1cmxzLnNoaWZ0KCk7XFxcXG4gICAgICAgIGxldCBsZW5ndGggPSB1cmxzLmxlbmd0aDtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHYuc3BsaXQodXJsc1tpXSwgXFxcXFxcXCI9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXFxcXFxcXCJoZWFkZXJzXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIEpTT04ucGFyc2UodmFsdWUpKTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmluY2x1ZGVzKFxcXFxcXFwiLlxcXFxcXFwiKSB8fCBrZXkuaW5jbHVkZXMoXFxcXFxcXCI/XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgcGljVXJsICs9IFxcXFxcXFwiQFxcXFxcXFwiICsga2V5ICsgKHZhbHVlID8gXFxcXFxcXCI9XFxcXFxcXCIgKyB2YWx1ZSA6IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFxcXFxcXFwianNcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBbcGljVXJsLCBoZWFkZXJzXTtcXFxcbiAgICB9LFxcXFxuICAgIHJhbmdlKHN0YXJ0LCBlbmQpIHtcXFxcbiAgICAgICAgcmV0dXJuIEFycmF5KGVuZCAtIHN0YXJ0KS5maWxsKDApLm1hcCgoZWwsIGkpID0+IHN0YXJ0ICsgaSk7XFxcXG4gICAgfSxcXFxcbiAgICBwaWNEb3dubG9hZCh1cmwsIHBhdGgsIGhlYWRlcnMsIGRlY2lwaGUpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNpcGhlID09PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiICYmIGRlY2lwaGUubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgbGV0IGluc3RyZWFtO1xcXFxuICAgICAgICAgICAgbGV0IG91dHN0cmVhbTtcXFxcbiAgICAgICAgICAgIGxldCBmaWxlO1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxldCBkaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgIWRpci5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGluc3RyZWFtID0gZmV0Y2godXJsLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXFxcXG4gICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBvdXRzdHJlYW0gPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKHBhdGgpO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0ID0gJC5oaWtlci5pbnB1dCxcXFxcbiAgICAgICAgICAgICAgICAgICAgYyA9ICQuaGlrZXIudXJsO1xcXFxuICAgICAgICAgICAgICAgICQuaGlrZXIuaW5wdXQgPSBpbnN0cmVhbTtcXFxcbiAgICAgICAgICAgICAgICAkLmhpa2VyLnVybCA9IHVybDtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGljaW4gPSAobmV3IEZ1bmN0aW9uKFxcXFxcXFwicmV0dXJuIFxcXFxcXFwiICsgZGVjaXBoZSkpKCk7XFxcXG4gICAgICAgICAgICAgICAgJC5oaWtlci5pbnB1dCA9IHQ7XFxcXG4gICAgICAgICAgICAgICAgJC5oaWtlci51cmwgPSBjO1xcXFxuICAgICAgICAgICAgICAgIGxldCBidWYgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQnl0ZS5UWVBFLCAxMDI0KTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbGVuO1xcXFxuICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gcGljaW4ucmVhZChidWYpKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0ud3JpdGUoYnVmLCAwLCBsZW4pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBjbG9zZU1lKGluc3RyZWFtKTtcXFxcbiAgICAgICAgICAgICAgICBjbG9zZU1lKG91dHN0cmVhbSk7XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgY2xvc2VNZShpbnN0cmVhbSk7XFxcXG4gICAgICAgICAgICAgICAgY2xvc2VNZShvdXRzdHJlYW0pO1xcXFxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgamF2YS5pby5GaWxlICYmIGZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOino+WvhuS4i+i9vUVycm9yPlxcXFxcXFwiICsgZS50b1N0cmluZygpKVxcXFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xcXFxuICAgICAgICAgICAgICAgIGNsb3NlTWUoaW5zdHJlYW0pO1xcXFxuICAgICAgICAgICAgICAgIGNsb3NlTWUob3V0c3RyZWFtKTtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKHVybCwgcGF0aCwgaGVhZGVycyk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHRleHRTaGllbGQodGV4dCkge1xcXFxuICAgICAgICBsZXQgZSA9IC8jfDp8JnxcXFxcXFxcXHx8XFxcXFxcXFxefEB8XFxcXFxcXFw8fFxcXFxcXFxcPnwlfFxcXFxcXFxcL3xcXFxcXFxcXD98XFxcXFxcXFwkL2c7XFxcXG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZSwgXFxcXFxcXCJfXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0gdjtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7kuLvpobXpnaJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTWFpbi52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gbWFpbigpIHtcXFxcbiAgICB2YXIgbGF5b3V0ID0gW107XFxcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG4gICAgbGV0IHR5cGUgPSBnZXRNeVZhcihcXFxcXFxcIi50eXBlXFxcXFxcXCIsIGdldEl0ZW0oXFxcXFxcXCJtYWluOnR5cGVcXFxcXFxcIiwgQ29uZmlnLmRlZl9Mb3JkX1R5cGUpKTtcXFxcbiAgICBsZXQgdGdudW0gPSBnZXRNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJzZWFyY2hLZXlcXFxcXFxcIik7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIudGdudW1cXFxcXFxcIik7XFxcXG4gICAgfSkpO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIiA/IFxcXFxcXFwi4peJ5ryr55S7XFxcXFxcXCIgOiBcXFxcXFxcIuKXi+a8q+eUu1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIudHlwZVxcXFxcXFwiLCBcXFxcXFxcImNvbWljXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcIm1haW46dHlwZVxcXFxcXFwiLCBcXFxcXFxcImNvbWljXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdHlwZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiLFxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXFxcXFwibm92ZWxcXFxcXFxcIiA/IFxcXFxcXFwi4peJ5bCP6K+0XFxcXFxcXCIgOiBcXFxcXFxcIuKXi+Wwj+ivtFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwibm92ZWxcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIudHlwZVxcXFxcXFwiLCBcXFxcXFxcIm5vdmVsXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcIm1haW46dHlwZVxcXFxcXFwiLCBcXFxcXFxcIm5vdmVsXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdHlwZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiLFxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXFxcXFwidHh0XFxcXFxcXCIgPyBcXFxcXFxcIuKXieaVtOacrOWwj+ivtFxcXFxcXFwiIDogXFxcXFxcXCLil4vmlbTmnKzlsI/or7RcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXFxcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFxcXFxcInR4dFxcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDb2xsZWN0ZWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJ0eHRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwibWFpbjp0eXBlXFxcXFxcXCIsIFxcXFxcXFwidHh0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdHlwZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgaWYgKHR5cGUgPT09IFxcXFxcXFwidHh0XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IHR4dFZpZXcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvZXh0ZXJuYWxpbXBvcnRUeHQudmlld1xcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIHR4dFZpZXcobGF5b3V0KTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IHRhZyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW3R5cGUgKyBcXFxcXFxcIlBhdGhcXFxcXFxcIl0sIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuICAgIGlmICh0YWcubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIixcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuiuvue9rlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb25cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc5biu5Yqp4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2hlbHAudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9rZXl3b3JkPW5vdmVsQ29taWNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdChsYXlvdXQpO1xcXFxuICAgIH1cXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHVybDogJ1xcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFxcXFxcIitpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi5pCc5L2g5oOz6KaB55qEI1xcXFxcXFwiICsgdHlwZSArIFxcXFxcXFwiIy4uLi4uLlxcXFxcXFwiLFxcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLwn5SNXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygodGFnLCB0eXBlKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGFycjEgPSBbXTtcXFxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZy5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgICAgICBhcnIxLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ0aXRsZVxcXFxcXFwiOiB0YWdbaV0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwic2VhcmNoX3VybFxcXFxcXFwiOiBcXFxcXFxcImhpa2VyOi8vZW1wdHk/aXNBbGw9MSZzZWFyY2hUZXJtcz0qKiZ0eXBlPVxcXFxcXFwiICsgdHlwZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwic2VhcmNoRmluZFxcXFxcXFwiOiBcXFxcXFxcImpzOiQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL1NlYXJjaC52aWV3P3J1bGU9JytNWV9SVUxFLl90aXRsZSk7XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFycjEpO1xcXFxuICAgICAgICAgICAgfSwgdGFnLCB0eXBlKSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFxcXFxcInB1dE15VmFyKCdzZWFyY2hLZXknLGlucHV0KVxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCY4pqZ6K6+572u4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHZlcnNpb246IE1ZX1JVTEUudmVyc2lvblxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG5cXFxcblxcXFxuICAgIGZvciAobGV0IGkgaW4gdGFnKSB7XFxcXG4gICAgICAgIGxldCBpdCA9IHRhZ1tpXTtcXFxcbiAgICAgICAgaWYgKHRnbnVtID09PSBpKSB7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdC5uYW1lICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFtcXFxcXFxcIuWIoOmZpOivpeebruW9lVxcXFxcXFwiLCBcXFxcXFxcIui3s+i9rOWwj+eoi+W6j1xcXFxcXFwiLCBcXFxcXFxcIuaJk+W8gOS5puaetlxcXFxcXFwiXSwgMSwgXFxcXFxcXCLpgInmi6nmk43kvZxcXFxcXFxcIikuc2VsZWN0KChpdCwgdHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoXFxcXFxcXCLot7PovazlsI/nqIvluo9cXFxcXFxcIiA9PT0gaW5wdXQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vaG9tZUBcXFxcXFxcIiArIGl0Lm5hbWU7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihcXFxcXFxcIuWIoOmZpOivpeebruW9lVxcXFxcXFwiPT09aW5wdXQpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdGhlbihbXFxcXFxcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnInmvKvnlLvlsIbooqvliKDpmaRcXFxcXFxcIl0pO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnIkg5ryr55S7L+Wwj+ivtCDlsIbooqvliKDpmaRcXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXQucGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXc/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYmcnVsZU5hbWU9XFxcXFxcXCIraXQubmFtZStcXFxcXFxcIiZ0eXBlPVxcXFxcXFwiK3R5cGU7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9LCBpdCwgdHlwZSlcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIudGdudW1cXFxcXFxcIiwgaSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9LCBpKSxcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYXRoID0gdGFnW3RnbnVtXS5wYXRoO1xcXFxuICAgIGxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgaWYgKG1obGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuWVpemDveayoeacieiAtlxcXFxcXFwiLmJpZygpLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYWdlVXJsID0gdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXFxcbiAgICAgICAgbGV0IHBpYyA9IGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGl0ZW0ucGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaXRlbS5uYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIpID8gaXRlbS5wYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpdGVtLm5hbWUgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcXFxuICAgICAgICBsZXQgbmFtZXM9U3RyaW5nKGl0ZW0ubmFtZSkuc3BsaXQoXFxcXFxcXCIkXFxcXFxcXCIpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbmFtZXNbMF0sXFxcXG4gICAgICAgICAgICBkZXNjOiBuYW1lc1sxXSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpYyxcXFxcbiAgICAgICAgICAgIHVybDogdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID9wYWdlVXJsICsgXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGU6JChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChwYWdlVXJsLCBwYXRoKT0+e1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcXFxcXCJsb25nUHJlc3MuanNcXFxcXFxcIikuc2luZ2xlRW50ZXIocGFnZVVybCwgcGF0aCk7XFxcXG4gICAgICAgICAgICB9LCBwYWdlVXJsLCBpdGVtLnBhdGgpLFxcXFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oaXRlbSwge1xcXFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwibG9uZ1ByZXNzLmpzXFxcXFxcXCIpLmRlbGV0ZUZpbGVGb3JCb29rKHBhdGgpXFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIGl0ZW0ucGF0aClcXFxcbiAgICAgICAgICAgICAgICB9XSxcXFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5wYXRoXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxcXG59XFxcXG5cXFxcbm1haW4oKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF8xXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2Lua8q+eUu+eroOiKguWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJDb21pY0Jyb3dzZXIudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJUb29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcIkZpbGUuanNcXFxcXFxcIik7XFxcXG5pZiAoZ2V0UGFyYW0oXFxcXFxcXCJoYXNQYXJhbXNcXFxcXFxcIikgPT09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiKSB7XFxcXG4gICAgTVlfUEFSQU1TID0ge1xcXFxuICAgICAgICBwYXRoOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgbmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwibmFtZVxcXFxcXFwiKSksXFxcXG4gICAgICAgIGJvb2tOYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJib29rTmFtZVxcXFxcXFwiKSksXFxcXG4gICAgICAgIHJ1bGVOYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJydWxlTmFtZVxcXFxcXFwiKSksXFxcXG4gICAgICAgIGNvbWljU3R5bGU6IGdldFBhcmFtKFxcXFxcXFwiY29taWNTdHlsZVxcXFxcXFwiKVxcXFxuICAgIH1cXFxcbn1cXFxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxcXG5pZiAoIXBhdGgpIHtcXFxcbiAgICBwYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgTVlfUEFSQU1TLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBNWV9QQVJBTVMuYm9va05hbWU7XFxcXG59XFxcXG5pZiAoTVlfUEFSQU1TLmNvbWljU3R5bGUpIHtcXFxcbiAgICBDb25maWcuZGVmX0NvbWljX1N0eWxlID0gTVlfUEFSQU1TLmNvbWljU3R5bGU7XFxcXG59XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCJDVnxcXFxcXFxcIiArIChNWV9QQVJBTVMubmFtZSB8fCBGaWxlLmdldE5hbWUocGF0aCkpKTtcXFxcblxcXFxudmFyIGxheW91dCA9IFtdO1xcXFxubGV0IG1vZGUgPSBnZXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIubW9kZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmNvbnN0IGNvbWljU3RhdHVzID0gbmV3IE1hcChbXFxcXG4gICAgW1xcXFxcXFwiQVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiXSxcXFxcbiAgICBbXFxcXFxcXCJCXFxcXFxcXCIsIFxcXFxcXFwi4oCY4oCYW+acquWujOaIkF3igJnigJlcXFxcXFxcIl1cXFxcbl0pO1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRUaXRsZSh0aXRsZSkge1xcXFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgcmV0dXJuIGNvbWljU3RhdHVzLmdldCh0aXRsZXNbMV0pICsgdGl0bGVzWzJdIHx8IHRpdGxlO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRUaXRsZTIodGl0bGUpIHtcXFxcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgIHJldHVybiB0aXRsZXNbMl0gfHwgdGl0bGU7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5Yig6Zmk5pW05pysXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6Zmk5pW05pys5ryr55S777yfXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBwYXRoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFtcXFxcXFxcIueci+a8q+eUu1xcXFxcXFwiLCBcXFxcXFxcIuWIoOmZpOeroOiKglxcXFxcXFwiXVttb2RlXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIsIG1vZGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBtb2RlKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KVxcXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG5taGxpc3Quc29ydCgoYSwgYikgPT4ge1xcXFxuICAgIGEgPSAoYS5uYW1lLm1hdGNoKC9cXFxcXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxcXG4gICAgYiA9IChiLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICByZXR1cm4gYSAtIGI7XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLlhbHmnIk6XFxcXFxcXCIgKyBtaGxpc3QubGVuZ3RoICsgXFxcXFxcXCLnq6BcXFxcXFxcIikuc21hbGwoKSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiLCBpc1JldmVyc2UgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCBpc1JldmVyc2UpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBhcnJheSA9IFtdO1xcXFxuXFxcXG5pZiAobW9kZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIpIHtcXFxcbiAgICBpZiAoQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IGxhenkgPSAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgc2hvcnRlbiA9IGlucHV0LnJlcGxhY2UoZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpLnNsaWNlKDcpLCBcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHNob3J0ZW4gKyBcXFxcXFxcIi9cXFxcXFxcIiArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJwaWNzOi8vXFxcXFxcXCIgKyBwaWNsaXN0LmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcXFxuICAgICAgICAgICAgYXJyYXkucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogaXRlbS5wYXRoICsgbGF6eSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9Db21pY19TdHlsZSxcXFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdGVtLnBhdGggKyBcXFxcXFxcIi8xLmpwZ1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcXFxuICAgICAgICAgICAgYXJyYXkucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvY29taWNDb21wYXRpYmxlLnZpZXcjYXV0b1BhZ2UjI3JlYWRUaGVtZSM/cGF0aD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLnBhdGgpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX0NvbWljX1N0eWxlLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGl0ZW0ucGF0aCArIFxcXFxcXFwiLzEuanBnXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUyKGl0ZW0ubmFtZSlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxufSBlbHNlIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIG1obGlzdCkge1xcXFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlMihpdGVtLm5hbWUpO1xcXFxuICAgICAgICBhcnJheS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6ZmkW1xcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiXe+8n1xcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX0NvbWljX1N0eWxlLFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5wYXRoICsgXFxcXFxcXCIvMS5qcGdcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAoaXNSZXZlcnNlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGFycmF5LnJldmVyc2UoKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgYXJyYXkpO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu6IGa5ZCI5pCc57SiXFxcIixcXFwicGF0aFxcXCI6XFxcIlNlYXJjaC52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLl90aXRsZSk7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLl90aXRsZSk7XFxcXG5sZXQgY29taWNSdWxlRGlycyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2dldFBhcmFtKFxcXFxcXFwidHlwZVxcXFxcXFwiKSArIFxcXFxcXFwiUGF0aFxcXFxcXFwiXSwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG5pZiAoZ2V0UGFyYW0oXFxcXFxcXCJpc0FsbFxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBjb21pY1J1bGVEaXJzID0gY29taWNSdWxlRGlycy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgPT09IE1ZX1JVTEUudGl0bGUpO1xcXFxufVxcXFxuXFxcXG5sZXQgc2VhcmNoUmVzdWx0ID0gW107XFxcXG5sZXQgc2VhcmNoVGVybXM9IGdldFBhcmFtKFxcXFxcXFwic2VhcmNoVGVybXNcXFxcXFxcIik7XFxcXG5sZXQgc2VhcmNoVGVzdDtcXFxcblxcXFxuaWYgKCFnZXRTZWFyY2hNb2RlKCkpIHtcXFxcbiAgICBsZXQgdGVybXNBcnIgPSBzZWFyY2hUZXJtcy5zcGxpdChcXFxcXFxcIlxcXFxcXFwiKS5tYXAodCA9PiB0LnJlcGxhY2UoL1xcXFxcXFxcKnxcXFxcXFxcXC58XFxcXFxcXFw/fFxcXFxcXFxcK3xcXFxcXFxcXCR8XFxcXFxcXFxefFxcXFxcXFxcW3xcXFxcXFxcXF18XFxcXFxcXFwofFxcXFxcXFxcKXxcXFxcXFxcXHt8XFxcXFxcXFx9fFxcXFxcXFxcfHxcXFxcXFxcXC98XFxcXFxcXFxcXFxcXFxcXC9nLCBrID0+IFxcXFxcXFwiXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwiICsgaykpO1xcXFxuICAgIGxldCByZWcgPSBuZXcgUmVnRXhwKHRlcm1zQXJyLmpvaW4oXFxcXFxcXCIuKlxcXFxcXFwiKSwgXFxcXFxcXCJpXFxcXFxcXCIpO1xcXFxuICAgIHNlYXJjaFRlc3QgPSB0ZXh0ID0+IHJlZy50ZXN0KHRleHQpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBzZWFyY2hUZXN0ID0gdGV4dCA9PiBzZWFyY2hDb250YWlucyh0ZXh0LCBzZWFyY2hUZXJtcywgZmFsc2UpO1xcXFxufVxcXFxuXFxcXG5sZXQgcGFnZVVybCA9IGdldFBhcmFtKFxcXFxcXFwidHlwZVxcXFxcXFwiKSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG5mb3IgKGxldCBzb25EaXIgb2YgY29taWNSdWxlRGlycykge1xcXFxuICAgIGxldCBjb21pY0xpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHNvbkRpci5wYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbiAgICBmb3IgKGxldCBjb21pYyBvZiBjb21pY0xpc3QpIHtcXFxcbiAgICAgICAgaWYgKHNlYXJjaFRlc3QoY29taWMubmFtZSkpIHtcXFxcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogY29taWMubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBjb21pYy5wYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBjb21pYy5uYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBwYWdlVXJsICsgXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUuX3RpdGxlLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IHNvbkRpci5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiBjb21pY1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbn1cXFxcbnNldFJlc3VsdChzZWFyY2hSZXN1bHQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2Luiuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJTZXR0aW5nLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoTVlfUlVMRS50aXRsZSArIFxcXFxcXFwifOiuvue9rlxcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG5cXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5Z+656GA6K6+572uPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuebruW9lei3r+W+hFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y29udGVudHNcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBDb25maWcuaG9tZVBhdGgsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuiuvue9rum7mOiupOWwgemdolxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfUGljLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9ZGVmYXVsdFBpY1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHN0cm9uZz7kuIvovb3lmajorr7nva48L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiBzZXROdW0oa2V5LCB0ZXN0KSB7XFxcXG4gICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCAwKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQpO1xcXFxuICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaVsOWtl1xcXFxcXFwiO1xcXFxuICAgIGlmICghdGVzdChpbnB1dCkpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LiN56ym5ZCI5p2h5Lu2XFxcXFxcXCI7XFxcXG4gICAgQ29uZmlnW2tleV0gPSBpbnB1dDtcXFxcbiAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxufVxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcImxvZ+aVsFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChDb25maWcubG9nTnVtLCBcXFxcXFxcIjA8TjwxMDBcXFxcXFxcIikuaW5wdXQoc2V0TnVtLCBcXFxcXFxcImxvZ051bVxcXFxcXFwiLCBpdCA9PiBpdCA+IDAgJiYgaXQgPCAxMDApLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXCIgKyBDb25maWcubG9nTnVtLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWIhuaJueS4i+i9veaVsCgw5LiN5byA5ZCvKVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIlxcXFxcXFwiICsgQ29uZmlnLnRocmVhZE51bSwgXFxcXFxcXCJOPi0xXFxcXFxcXCIpLmlucHV0KHNldE51bSwgXFxcXFxcXCJ0aHJlYWROdW1cXFxcXFxcIiwgaXQgPT4gaXQgPiAtMSksXFxcXG4gICAgZGVzYzogXFxcXFxcXCJcXFxcXFxcIiArIENvbmZpZy50aHJlYWROdW0sXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHN0cm9uZz7lsI/or7TpmIXor7vlmajorr7nva48L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6buY6K6k5byA5ZCv5YiG6aG16ZiF6K+7XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGRlZl9pc1BhZ2luYXRlKSA9PiB7XFxcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICBDb25maWcuZGVmX2lzUGFnaW5hdGUgPSBkZWZfaXNQYWdpbmF0ZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiO1xcXFxuXFxcXG4gICAgICAgIHNhdmVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSksXFxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9pc1BhZ2luYXRlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwi5LiN5byA5ZCvXFxcXFxcXCIgOiBcXFxcXFxcIuW8gOWQr1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuavj+mhteacgOWkp+eroOaVsFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChDb25maWcudmlld1BhZ2VTaXplLCBcXFxcXFxcIjMwPE48NTAwXFxcXFxcXCIpLmlucHV0KHNldE51bSwgXFxcXFxcXCJ2aWV3UGFnZVNpemVcXFxcXFxcIiwgaXQgPT4gaXQgPiAzMCAmJiBpdCA8IDUwMCksXFxcXG4gICAgZGVzYzogXFxcXFxcXCJcXFxcXFxcIiArIENvbmZpZy52aWV3UGFnZVNpemUsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuabv+aNouinhOWImVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/c2V0dGluZ1R5cGU9cmVwbGFjZVJ1bGVcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwiPHN0cm9uZz7mvKvnlLvpmIXor7vlmajorr7nva48L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWFvOWuueaooeW8j1xcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChkZWZfaXNDb21pY0NvbXBhdGlibGUpID0+IHtcXFxcbiAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCAwKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgIENvbmZpZy5kZWZfaXNDb21pY0NvbXBhdGlibGUgPSBkZWZfaXNDb21pY0NvbXBhdGlibGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIjtcXFxcblxcXFxuICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCBDb25maWcuZGVmX2lzQ29taWNDb21wYXRpYmxlKSxcXFxcbiAgICBkZXNjOiBDb25maWcuZGVmX2lzQ29taWNDb21wYXRpYmxlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwi5LiN5byA5ZCvXFxcXFxcXCIgOiBcXFxcXFxcIuW8gOWQr1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmvKvnlLvliJfooajmoLflvI9cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoW1xcXFxcXFwidGV4dF8xXFxcXFxcXCIsIFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsIFxcXFxcXFwicGljXzNcXFxcXFxcIiwgXFxcXFxcXCJwaWNfM19zcXVhcmVcXFxcXFxcIiwgXFxcXFxcXCJtb3ZpZV8zX21hcnF1ZWVcXFxcXFxcIl0sIDEsIFxcXFxcXFwi6K+36YCJ5oup5ryr55S75YiX6KGo5pi+56S65qC35byPXFxcXFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgQ29uZmlnLmRlZl9Db21pY19TdHlsZSA9IGlucHV0O1xcXFxuICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCBDb25maWcuZGVmX0NvbWljX1N0eWxlKSxcXFxcbiAgICBkZXNjOiBDb25maWcuZGVmX0NvbWljX1N0eWxlfHxcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5YW25LuW6K6+572uPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLop4TliJnlj5HluIPpobVcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbHZlcjogTVlfUEFSQU1TLnZlcnNpb24gfHwgXFxcXFxcXCLojrflj5bniYjmnKzlpLHotKXvvIzoh6rooYzmn6XnnItcXFxcXFxcIixcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwiMzU1OVxcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmgaLlpI3pu5jorqTorr7nva5cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTmgaLlpI3pu5jorqTorr7nva7vvJ9cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7XFxcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aBouWkjeWujOaIkFxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmuIXnkIbnvJPlrZhcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1jYWNoZVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmlofku7bnrqHnkIZcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGVNYW5hZ2VtZW50LnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sZXQgdGlkID0gRGF0ZS5ub3coKTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmo4DmtYvmm7TmlrBcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgob2xkVmVyc2lvbiwgdGlkKSA9PiB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9kZXYvZ2V0YnlpZD9pZD0zNTU5XFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwXFxcXG4gICAgICAgICAgICB9KSkucmVzdWx0LnZlcjtcXFxcbiAgICAgICAgICAgIGlmIChuZXdWZXJzaW9uIDw9IG9sZFZlcnNpb24pIHtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHRpZCArIFxcXFxcXFwiI+iuvue9rl/mm7TmlrBcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlt7Lnu4/mmK/mnIDmlrDniYjmnKzkuoZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5paw54mI5pys5LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcXFxcXCIj6K6+572uX+abtOaWsFxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuacieaWsOeJiOacrOi/mOacquabtOaWsFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLmnInmlrDniYjmnKzov5jmnKrmm7TmlrBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwicnVsZTovLzVyVzM2WmlVNktlRzU1V003NytsYUc5dFpWOXlkV3hsWDNWeWJPKy9wV2gwZEhBNkx5OW9hV3RsY2k1dWIydHBZUzV3Y21WemN5OW9hV3RsY25Wc1pTOXlkV3hsYkdsemRDNXFjMjl1UDJsa1BUTTFOVGs9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcXFxcXCIj6K6+572uX+abtOaWsFxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5L+h5oGv6I635Y+W5aSx6LSlXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mm7TmlrDkv6Hmga/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIE1ZX1BBUkFNUy52ZXJzaW9uLCB0aWQpLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiB0aWQgKyBcXFxcXFxcIiPorr7nva5f5pu05pawXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLlhbPkuo7lpoLkvZXosIPnlKhcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwibXFxYXBpOi8vZm9yd2FyZC91cmw/c3JjX3R5cGU9d2ViJnN0eWxlPWRlZmF1bHQmcGxnX2F1dGg9MSZ2ZXJzaW9uPTEmdXJsX3ByZWZpeD1hSFIwY0hNNkx5OXhkVzR1Y1hFdVkyOXRMM0Z4ZDJWaUwzRjFibkJ5Ynk5emFHRnlaVDlmZDNZOU15WmZkM2QyUFRFeU9DWnBiblpwZEdWRGIyUmxQVEZJUm5sQ1NpWm1jbTl0UFRJME5qWXhNQ1ppYVhvOWEyRWpMMjkxZEE9PVxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+m57uG54K55Ye75Yqg5YWl6aKR6YGTKOW/q+adpeWNjuWxseS4juaIkeiuultqaV3liZEpXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumXrumimOWPjemmiFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJtcXFhcGk6Ly9mb3J3YXJkL3VybD9zcmNfdHlwZT13ZWImc3R5bGU9ZGVmYXVsdCZwbGdfYXV0aD0xJnZlcnNpb249MSZ1cmxfcHJlZml4PWFIUjBjSE02THk5eGRXNHVjWEV1WTI5dEwzRnhkMlZpTDNGMWJuQnlieTl6YUdGeVpUOWZkM1k5TXlaZmQzZDJQVEV5T0NaaGNIQkRhR0Z1Ym1Wc1BYTm9ZWEpsSm1sdWRtbDBaVU52WkdVOU1WaE9ZV3hCUlhsMlZtb21ZMjl1ZEdWdWRFbEVQV016YkVsUUptSjFjMmx1WlhOelZIbHdaVDB5Sm1aeWIyMDlNVGd4TURjMEptSnBlajFyWVNadFlXbHVVMjkxY21ObFNXUTljMmhoY21VbWMzVmlVMjkxY21ObFNXUTliM1JvWlhKekptcDFiWEJ6YjNWeVkyVTljMmh2Y25SMWNtdz0mdD0xNjcxODkzMTIzNTk3I0ludGVudDtzY2hlbWU9bXFxYXBpO3BhY2thZ2U9Y29tLnRlbmNlbnQubW9iaWxlcXE7ZW5kXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLnu53lr7nkuI3kvJrmnIlidWco5ZWK5oiR5LiN5o6l5Y+XISlcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG4vKlxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIua4hemZpOWwj+ivtOWIhumhteiusOW9lVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruiupOa4hemZpOWwj+ivtOWIhumhteiusOW9le+8n1xcXFxcXFwiKS5jb25maXJtKCgpID0+IHtcXFxcbiAgICAgICAgZGVsZXRlRmlsZShcXFxcXFxcIm5vdmVsRm9vdHByaW50Lmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuKi9cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5bCP6K+056ug6IqC5YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcIk5vdmVsQnJvd3Nlci52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuaWYgKGdldFBhcmFtKFxcXFxcXFwiaGFzUGFyYW1zXFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIikge1xcXFxuICAgIE1ZX1BBUkFNUyA9IHtcXFxcbiAgICAgICAgcGF0aDogZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicGF0aFxcXFxcXFwiKSksXFxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcIm5hbWVcXFxcXFxcIikpXFxcXG4gICAgfVxcXFxufVxcXFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIk5WfFxcXFxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgZm9vdDogMCxcXFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxcXG4gICAgaXNTZWdtZW50OiB0cnVlXFxcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG52YXIgbGF5b3V0ID0gW107XFxcXG5sZXQgbW9kZSA9IGdldE15VmFyKFxcXFxcXFwiLm1vZGVcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IG1vZGUyID0gZ2V0TXlWYXIoXFxcXFxcXCIubW9kZTJcXFxcXFxcIiwgQ29uZmlnLmRlZl9pc1BhZ2luYXRlKTtcXFxcblxcXFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIubW9kZTJcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRUaXRsZSh0aXRsZSkge1xcXFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgcmV0dXJuIHRpdGxlc1syXSAhPT0gdW5kZWZpbmVkID8gdGl0bGVzWzJdLnNsaWNlKDAsIHRpdGxlc1syXS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpIDogdGl0bGU7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5Yig6Zmk5pW05pysXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6Zmk5pW05pys5bCP6K+077yfXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBwYXRoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi55yL5bCP6K+0XFxcXFxcXCIsIFxcXFxcXFwi5Yig6Zmk56ug6IqCXFxcXFxcXCJdW21vZGVdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChtb2RlKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLm1vZGVcXFxcXFxcIiwgbW9kZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0sIG1vZGUpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuKAmOKAmOabtOWkmuWKn+iDvSA+4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiB0eHQocGF0aHMpIHtcXFxcbiAgICBzaG93TG9hZGluZyhcXFxcXFxcIuato+WcqOWQiOW5ti4uLlxcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG5cXFxcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGhzLnBhdGgsIFxcXFxcXFwiZmlsZVxcXFxcXFwiLCBcXFxcXFxcIi50eHRcXFxcXFxcIik7XFxcXG4gICAgbGV0IGxpc3RMZW5ndGggPSBmaWxlbGlzdC5sZW5ndGg7XFxcXG4gICAgaWYgKGxpc3RMZW5ndGggPT09IDApIHtcXFxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nqbrnmoTnq6DoioJcXFxcXFxcIjtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICAgICAgc2VsZWN0ZWQ6IFtdLFxcXFxuICAgICAgICBpc1JlcGxhY2U6IHRydWVcXFxcbiAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRocy5wYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcbiAgICBsZXQgYnVmaWxlbGlzdCA9IFtdO1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBmaWxlID0gZmlsZWxpc3RbaV07XFxcXG4gICAgICAgIGxldCBmaWxlSW5mbyA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgICAgIGJ1ZmlsZWxpc3QucHVzaCh7XFxcXG4gICAgICAgICAgICBuYW1lOiBmaWxlSW5mb1syXS5zbGljZSgwLCBmaWxlSW5mb1syXS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpLFxcXFxuICAgICAgICAgICAgcGF0aDogXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBmaWxlLnBhdGgsXFxcXG4gICAgICAgICAgICBpZDogTnVtYmVyKGZpbGVJbmZvWzBdKSB8fCAwXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBidWZpbGVsaXN0LnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTtcXFxcbiAgICBsZXQgZW50aXJlUGF0aCA9IHBhdGhzLnBhdGgucmVwbGFjZShDb25maWcubm92ZWxQYXRoLCBDb25maWcubm92ZWxGdWxsUGF0aCkgKyBcXFxcXFxcIi50eHRcXFxcXFxcIjtcXFxcbiAgICBsZXQgZW50aXJlUGF0aHRvID0gYm9va0luZm8uaXNSZXBsYWNlID8gZW50aXJlUGF0aCArIFxcXFxcXFwiLnRtcFxcXFxcXFwiIDogZW50aXJlUGF0aDtcXFxcblxcXFxuICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBlbnRpcmVQYXRoKSkge1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuWIneWni+WMluaWh+S7tlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKCFGaWxlLmRlbGV0ZUZpbGVzKGVudGlyZVBhdGgpKSB7XFxcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liJ3lp4vljJblpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5Yid5aeL5YyW5oiQ5YqfXFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgbGV0IGl0ZW0gPSBidWZpbGVsaXN0W2ldO1xcXFxuICAgICAgICBsZXQgY29udGVudCA9IHJlcXVlc3QoaXRlbS5wYXRoKTtcXFxcbiAgICAgICAgRmlsZS5maWxlV3JpdGVBcHBlbmQoZW50aXJlUGF0aHRvLCBpdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbuOAgOOAgFxcXFxcXFwiICsgY29udGVudC5yZXBsYWNlKC8mbmJzcDsvZyxcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdCgvKFxcXFxcXFxcbnxcXFxcXFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0PT5pdC50cmltKCkpLmpvaW4oXFxcXFxcXCJcXFxcXFxcXHLjgIDjgIBcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFxcblxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcXFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgbGVuID0gcnVsZUxpc3QubGVuZ3RoO1xcXFxuICAgICAgICBsZXQgcmVwbGFjZVBhdHRlcm4gPSBbXFxcXFxcXCJyZXBsYWNlXFxcXFxcXCIsIFxcXFxcXFwicmVwbGFjZUFsbFxcXFxcXFwiXTtcXFxcbiAgICAgICAgbGV0IGZsYWcgPSBGaWxlLmZpbGVSdWxlKGVudGlyZVBhdGh0bywgZW50aXJlUGF0aCwgKGphdmFTdHJpbmcpID0+IHtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoIWJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUGF0dGVyblswICsgcmVwbGFjZVJ1bGUuaXNSZWdleF07XFxcXG4gICAgICAgICAgICAgICAgamF2YVN0cmluZyA9IGphdmFTdHJpbmdbcmVwbGFjZV0ocmVwbGFjZVJ1bGUucGF0dGVybiwgcmVwbGFjZVJ1bGUucmVwbGFjZW1lbnQpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIGphdmFTdHJpbmcuZ2V0Qnl0ZXMoKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGlmICghZmxhZykge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5ZCI5bm25aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH1cXFxcbiAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5ZCI5bm25a6M5oiQXFxcXFxcXCI7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5ZCI5bm25bCP6K+0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwi56Gu5a6a5ZCI5bm2P1xcXFxcXFxcbuS8muimhuebluW3suaciVRYVFxcXFxcXFwiKS5jb25maXJtKHR4dCwgTVlfUEFSQU1TKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBbXFxcXFxcXCLimJDliIbpobVcXFxcXFxcIiwgXFxcXFxcXCLimJHliIbpobVcXFxcXFxcIl1bbW9kZTJdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChtb2RlMikgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5tb2RlMlxcXFxcXFwiLCBtb2RlMiA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCBtb2RlMiksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi4piQ5YiG5q61XFxcXFxcXCIsIFxcXFxcXFwi4piR5YiG5q61XFxcXFxcXCJdW051bWJlcihib29rSW5mby5pc1NlZ21lbnQpXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNTZWdtZW50LCBwYXRoKSA9PiB7XFxcXG4gICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgYm9va0luZm8uaXNTZWdtZW50ID0gIWlzU2VnbWVudDtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCtcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIGJvb2tJbmZvLmlzU2VnbWVudCwgcGF0aCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLlh4DljJZcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsQ3VzdG9tLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFxcXFxcIixcXFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5aSW6YOo5p+l55yLXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBhdGgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGVudGlyZVBhdGggPSBwYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcXFxcXCIudHh0XFxcXFxcXCI7XFxcXG4gICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBlbnRpcmVQYXRoKSkge1xcXFxuICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLosIPnlKjnrKzkuInmlrnlupTnlKjmiZPlvIDmlofku7ZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFxcXFxcIiArIGVudGlyZVBhdGhcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pys5Zyw5pqC5peg5Y+v5L6b5aSW6YOo5omT5byA55qEdHh05paH5Lu277yM6K+35YWI5ZCI5bm25bCP6K+077yBXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIHBhdGgpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiLnR4dFxcXFxcXFwiKTtcXFxcbm1obGlzdC5zb3J0KChhLCBiKSA9PiB7XFxcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXFxcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcXFxuICAgIHJldHVybiBhIC0gYjtcXFxcbn0pO1xcXFxubGV0IGNoYXB0ZXJMaXN0ID0gW107XFxcXG5sZXQgY2hhcHRlckNvdW50ID0gbWhsaXN0Lmxlbmd0aDtcXFxcblxcXFxuaWYgKG1vZGUyID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGxldCBtaGxpc3RDaHVuayA9IFRvb2wuY2h1bmsobWhsaXN0LCBDb25maWcudmlld1BhZ2VTaXplKTtcXFxcbiAgICBsZXQgdmlld1BhZ2VDb3VudCA9IG1obGlzdENodW5rLmxlbmd0aDtcXFxcbiAgICBsZXQgZGVmUGFnZSA9ICh2aWV3UGFnZUNvdW50IC0gMSA8IGJvb2tJbmZvLmZvb3QgPyAwIDogYm9va0luZm8uZm9vdCkgfHwgMDtcXFxcbiAgICBsZXQgcGFnZU51bSA9IE51bWJlcihnZXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBkZWZQYWdlKSk7XFxcXG4gICAgY2hhcHRlckxpc3QgPSBtaGxpc3RDaHVua1twYWdlTnVtXSB8fCBbXTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLmnKzpobU6XFxcXFxcXCIgKyBjaGFwdGVyTGlzdC5sZW5ndGggKyBcXFxcXFxcIiDlhbHmnIk6XFxcXFxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFxcXFxcIueroCDlvZPliY06XFxcXFxcXCIgKyAocGFnZU51bSArIDEpICsgXFxcXFxcXCIvXFxcXFxcXCIgKyB2aWV3UGFnZUNvdW50KS5zbWFsbCgpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgaXNSZXZlcnNlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIui3s+mbhlxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoY2hhcHRlckNvdW50LCBcXFxcXFxcIui+k+WFpei3s+i9rOeroOiKgiAxLVxcXFxcXFwiICsgY2hhcHRlckNvdW50KS5pbnB1dCgoY2hhcHRlckNvdW50LCBwYWdlTnVtLCB2aWV3UGFnZVNpemUsIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCk7XFxcXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0TnVtKSB8fCBpbnB1dE51bSA8IDAgfHwgaW5wdXROdW0gPiBjaGFwdGVyQ291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaW5wdXROdW0gPSBNYXRoLmZsb29yKChpbnB1dE51bSArIHZpZXdQYWdlU2l6ZSkgLyB2aWV3UGFnZVNpemUpIC0gMTtcXFxcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlucHV0TnVtKTtcXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIH0sIGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgQ29uZmlnLnZpZXdQYWdlU2l6ZSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLot7PpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKHBhZ2VOdW0gKyAxLCBcXFxcXFxcIui3s+i9rOmhteaVsCAxLVxcXFxcXFwiICsgdmlld1BhZ2VDb3VudCkuaW5wdXQoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCkgLSAxO1xcXFxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dE51bSkgfHwgaW5wdXROdW0gPCAwIHx8IGlucHV0TnVtID4gdmlld1BhZ2VDb3VudCAtIDEpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehruiMg+WbtOWGheeahOaVsOWtl1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+ato+WcqOW9k+WJjemhtemdolxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiICsgaW5wdXROdW0pO1xcXFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIrkuIDpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHBhZ2VOdW0gLSAxO1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0TnVtIDwgMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv56ys5LiA6aG15LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBwYWdlTnVtLCBwYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS4i+S4gOmhtVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gcGFnZU51bSArIDE7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXROdW0gPiB2aWV3UGFnZUNvdW50IC0gMSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuacq+mhtVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gdmlld1BhZ2VDb3VudCAtIDE7XFxcXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0gfHwgaW5wdXROdW0gPT09IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/mnIDlkI7kuIDpobXkuoZcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlucHV0TnVtKTtcXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzVcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufSBlbHNlIHtcXFxcbiAgICBjaGFwdGVyTGlzdCA9IG1obGlzdDtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLnq6DoioIgXFxcXFxcXCIuYmlnKCkgKyAoXFxcXFxcXCLlhbHmnIk6XFxcXFxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFxcXFxcIueroFxcXFxcXFwiKS5zbWFsbCgpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5pc1JldmVyc2VcXFxcXFxcIiwgaXNSZXZlcnNlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmxldCBhcnJheSA9IFtdO1xcXFxuaWYgKG1vZGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiKSB7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyTGlzdCkge1xcXFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxcXG4gICAgICAgIGFycmF5LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcXFxuICAgICAgICAgICAgICAgIGRpclBhdGg6IHBhdGgsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59IGVsc2Uge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXFxcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcXFxuICAgICAgICBhcnJheS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5Yig6ZmkW1xcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiXe+8n1xcXFxcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSwgaXRlbS5wYXRoKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBhcnJheS5yZXZlcnNlKCk7XFxcXG59XFxcXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGFycmF5KTtcXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWwj+ivtOato+aWh+mYheivu1xcXCIsXFxcInBhdGhcXFwiOlxcXCJOb3ZlbE1haW5Cb2R5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGxheW91dCA9IFtdO1xcXFxubGV0IGNvbnRlbnQgPSByZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgTVlfUEFSQU1TLnBhdGgpO1xcXFxuLy9jb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXFxcXFxcXG58XFxcXFxcXFxyL2csIFxcXFxcXFwiPGJyPlxcXFxcXFwiKS5yZXBsYWNlKC8oJm5ic3A7KSsvZyxcXFxcXFxcIiBcXFxcXFxcIik7XFxcXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIHNlbGVjdGVkOiBbXSxcXFxcbiAgICBpc1JlcGxhY2U6IGZhbHNlLFxcXFxuICAgIGlzU2VnbWVudDogdHJ1ZSxcXFxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIE1ZX1BBUkFNUy5kaXJQYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcblxcXFxuaWYgKGJvb2tJbmZvLmlzUmVwbGFjZSkge1xcXFxuICAgIGxldCBqYXZhU3RyaW5nID0gamF2YS5sYW5nLlN0cmluZyhjb250ZW50KTtcXFxcbiAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFxcXFxcInJlcGxhY2VcXFxcXFxcIiwgXFxcXFxcXCJyZXBsYWNlQWxsXFxcXFxcXCJdO1xcXFxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcXFxuICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXFxcbiAgICAgICAgaWYgKCFib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCkpIHtcXFxcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCByZXBsYWNlID0gcmVwbGFjZVBhdHRlcm5bMCArIHJlcGxhY2VSdWxlLmlzUmVnZXhdO1xcXFxuICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxcXG4gICAgfVxcXFxuICAgIGNvbnRlbnQgPSBTdHJpbmcoamF2YVN0cmluZyk7XFxcXG59XFxcXG5pZiAoYm9va0luZm8uaXNTZWdtZW50KSB7XFxcXG4gICAgY29udGVudCA9IFxcXFxcXFwi44CA44CAXFxcXFxcXCIgKyBjb250ZW50LnNwbGl0KC8oXFxcXFxcXFxufFxcXFxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0LnRyaW0oKS5sZW5ndGggPiAxKS5tYXAoaXQgPT4gaXQudHJpbSgpKS5qb2luKFxcXFxcXFwiPGJyPuOAgOOAgFxcXFxcXFwiKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICB0aXRsZTogKFxcXFxcXFwiPHN0cm9uZz5cXFxcXFxcIiArIE1ZX1BBUkFNUy50aXRsZSArIFxcXFxcXFwiPC9zdHJvbmc+XFxcXFxcXCIpLmJpZygpLFxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogY29udGVudCxcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcXFxuICAgICAgICBjbGljazogdHJ1ZVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7lkIjlubZUWFRcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTm92ZWxDb2xsZWN0ZWQudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG5sZXQgcnVsZWxEaXIgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5ub3ZlbEZ1bGxQYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuWQiOW5tlRYVFxcXFxcXFwiKTtcXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcblxcXFxuZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgpIHtcXFxcbiAgICBzd2l0Y2ggKGlucHV0KSB7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLliIbkuqtcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInNoYXJlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLliKDpmaRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLmtbfpmJTpooTop4hcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgIH1cXFxcbn1cXFxcbmZvciAobGV0IHJ1bGVQYXRocyBvZiBydWxlbERpcikge1xcXFxuICAgIGxldCBub3ZlbHMgPSBGaWxlLmdldEZpbGVQYXRoKHJ1bGVQYXRocy5wYXRoLCBcXFxcXFxcImZpbGVcXFxcXFxcIiwgXFxcXFxcXCIudHh0XFxcXFxcXCIpO1xcXFxuICAgIGZvciAobGV0IG5vdmVsIG9mIG5vdmVscykge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLliIbkuqtcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaRcXFxcXFxcIiwgXFxcXFxcXCLmtbfpmJTpooTop4hcXFxcXFxcIiwgXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIl0sIDEpLnNlbGVjdChvcGVyYXRpb24sIG5vdmVsLnBhdGgpLFxcXFxuICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLmnaXmupDvvJpcXFxcXFxcIiArIHJ1bGVQYXRocy5uYW1lLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHBhdGg6IG5vdmVsLnBhdGhcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGxheW91dC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXFxcXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXFxcXFwiPuWVpemDveayoeacieiAtjwvaDE+JyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuabtOWkmuiuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJTZXR0aW5nL01vcmUudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG5cXFxcbmNvbnN0IHNldHRpbmdUeXBlID0gTVlfUEFSQU1TLnNldHRpbmdUeXBlIHx8IGdldFBhcmFtKFxcXFxcXFwic2V0dGluZ1R5cGVcXFxcXFxcIik7XFxcXG5cXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG5zd2l0Y2ggKHNldHRpbmdUeXBlKSB7XFxcXG4gICAgY2FzZSBcXFxcXFxcImNhY2hlXFxcXFxcXCI6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIua4hemZpOe8k+WtmHzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGNvbnN0IGtub3duTGlzdCA9IG5ldyBNYXAoW1xcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcubm92ZWxQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+Wwj+ivtOe8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuY29taWNQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+a8q+eUu+e8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+WvvOWFpeeahFRYVOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcubm92ZWxGdWxsUGF0aCksIFxcXFxcXFwiI+euoeeQhuWZqCPlsI/or7TlkIjlubbnm67lvZVb5Y+v5Lul5riF6ZmkXVxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgIFtcXFxcXFxcImRy56ug6IqC57yT5a2YXFxcXFxcXCIsIFxcXFxcXFwi6YGT6ZW/5qih5p2/5Li05pe257yT5a2YW+W7uuiurua4hemZpF1cXFxcXFxcIl1cXFxcbiAgICAgICAgXSk7XFxcXG5cXFxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcXFxuICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBjYWNoZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5aSn5bCP77yaXFxcXFxcXCIgKyBGaWxlLmdldEZpbGVTaXplKGNhY2hlLnBhdGgpICsgXFxcXFxcXCJcXFxcXFxcXG7mj4/ov7DvvJpcXFxcXFxcIiArIChrbm93bkxpc3QuZ2V0KGNhY2hlLm5hbWUpIHx8IFxcXFxcXFwi5pyq55+l55uu5b2VW+mjjumZqeacquefpV1cXFxcXFxcIiksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5riF6ZmkIFxcXFxcXFwiICsgY2FjaGUubmFtZSArIFxcXFxcXFwiID9cXFxcXFxcIikuY29uZmlybShjbGVhbkNhY2hlLCBjYWNoZS5wYXRoKVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlhajpg6jmuIXpmaQoXFxcXFxcXCIgKyBGaWxlLmdldEZpbGVTaXplKENvbmZpZy5ob21lUGF0aCkgKyBcXFxcXFxcIilcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIuehruiupOa4hemZpOWFqOmDqOe8k+WtmOaVsOaNrj9cXFxcXFxcIikuY29uZmlybShjbGVhbkNhY2hlLCBDb25maWcuaG9tZVBhdGgpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIFxcXFxcXFwiZGVmYXVsdFBpY1xcXFxcXFwiOlxcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLpu5jorqTlsIHpnaJ86K6+572uXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcXFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRQaWModXJsKSB7XFxcXG4gICAgICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIDApIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBDb25maWcuZGVmX1BpYyA9IHVybDtcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBzdGFydCA9IDE7XFxcXG4gICAgICAgIGlmICh0eXBlb2YoTVlfTkFNRSkgIT09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIgJiYgTVlfTkFNRSA9PT0gXFxcXFxcXCLll4Xop4nmtY/op4jlmahcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgc3RhcnQgPSA0O1xcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlm77niYdsYXRlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibW92aWVfM1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9sYXRlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoc2V0RGVmYXVsdFBpYywgXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX2xhdGVcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IDQ7IGkrKykge1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWbvueJh1xcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJtb3ZpZV8zXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXREZWZhdWx0UGljLCBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljXFxcXFxcXCIgKyBpKVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6Ieq5a6a5LmJ4p6VXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLoh6rlrprkuYl1cmxcXFxcXFxcIiwgXFxcXFxcXCLpgInmi6nmlofku7bot6/lvoRcXFxcXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiHquWumuS5iXVybFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6L6T5YWl5Zu+54mH55qE6Lev5b6E5oiW6ICF6ZO+5o6lXFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWZfUGljID0gaW5wdXQ7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUocmVxdWlyZVVybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuZGVmX1BpYyA9IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgUEFUSDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiOmRlZmF1bHRQaWNCYWNrXFxcXFxcXCIsIFxcXFxcXFwidHJ1ZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXFxcXFwiLmpwZ3wuanBlZ3wuZ2lmfC5wbmd8LnN2Z3wuYm1wXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcXFxcXCJjb25maXJtXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogXFxcXFxcXCJzZWxlY3RQYXRoQ2FjaGUyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlQYXRoOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJyZXBsYWNlUnVsZVxcXFxcXFwiOlxcXFxuICAgICAgICBpZiAoTVlfUEFSQU1TLmlzUmVmcmVzaCkge1xcXFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4gcmVmcmVzaFBhZ2UoKSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuabv+aNouinhOWImXzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IFtdO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBjb25maXJtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+mUmeivr+aPkOekuicsXFxcXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+abv+aNouaVsOaNruivu+WPluWksei0pe+8jOaYr+WQpuWIneWni+WMlu+8n1xcXFxcXFxcbuivpeaTjeS9nOS8mua4hemZpOS9oOeahOabv+aNouaVsOaNriEhIScsXFxcXG4gICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWIneWni+WMluWujOaIkFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXFxcXFwi5Y+W5raIXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaWsOW7uuabv+aNolxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9lZGl0UmVwbGFjZVJ1bGUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9pc05ldz10cnVlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85Ye66KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTlr7zlh7pcXFxcXFxcIiArIHJ1bGVMaXN0Lmxlbmd0aCArIFxcXFxcXFwi5p2h6KeE5YiZ77yfXFxcXFxcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFxcXFxcIikuY29uZmlybSgobnVtKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc2F2ZVB0YSA9IENvbmZpZy5ob21lUGF0aCArIFxcXFxcXFwiL3JlcGxhY2VSdWxlLmpzb25cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoc2F2ZVB0YSwgcmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwiXFxcXFxcXFxu6Lev5b6E77yaXFxcXFxcXCIgKyBzYXZlUHRhICsgXFxcXFxcXCJcXFxcXFxcXG7lr7zlh7rop4TliJkgXFxcXFxcXCIgKyBudW0gKyBcXFxcXFxcIiDmnaFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwic2hhcmU6Ly9cXFxcXFxcIiArIHNhdmVQdGE7XFxcXG4gICAgICAgICAgICB9LCBydWxlTGlzdC5sZW5ndGgpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgZnVuY3Rpb24gaW1wb3J0UnVsZShpc2JhY2spIHtcXFxcbiAgICAgICAgICAgIGlucHV0ID0gdHlwZW9mIFBBVEggPT09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIgPyBpbnB1dCA6IFBBVEg7XFxcXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIpID8gaW5wdXQgOiBcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGlucHV0XFxcXG4gICAgICAgICAgICBsZXQgcnVsZVRleHQgPSByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgICAgIGlmICghcnVsZVRleHQpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5paH5Lu25Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlTGlzdCA9IEpTT04ucGFyc2UocnVsZVRleHQpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvdW50ID0gMCxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQgPSAwO1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gbmV3UnVsZUxpc3QpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1J1bGUgPSBuZXdSdWxlTGlzdFtpXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXFxcXFwicmVwbGFjZW1lbnRcXFxcXFxcIikgfHwgIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJwYXR0ZXJuXFxcXFxcXCIpIHx8ICFuZXdSdWxlLmhhc093blByb3BlcnR5KFxcXFxcXFwibmFtZVxcXFxcXFwiKSB8fCAobmV3UnVsZS5zY29wZUNvbnRlbnQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogIW5ld1J1bGUuc2NvcGVDb250ZW50KSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gbmV3UnVsZS5pZDtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmV3UnVsZS5pZCA9IGlkIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRJbmRleCA9IHJ1bGVMaXN0LmZpbmRJbmRleChydWxlID0+IHJ1bGUuaWQgPT09IGlkKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkSW5kZXggPiAtMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQrKztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnNwbGljZShpZEluZGV4LCAxLCBuZXdSdWxlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50Kys7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlTGlzdC5wdXNoKG5ld1J1bGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpc2JhY2spIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGxvZyhcXFxcXFxcIlxcXFxcXFxcbui3r+W+hO+8mlxcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIlxcXFxcXFxcbuaAu+inhOWImeaVsO+8mlxcXFxcXFwiICsgbmV3UnVsZUxpc3QubGVuZ3RoICsgXFxcXFxcXCJcXFxcXFxcXG7mm7TmlrDop4TliJkgXFxcXFxcXCIgKyB1cGRhdGVDb3VudCArIFxcXFxcXFwiIOadoVxcXFxcXFxcdOaWsOWinuinhOWImSBcXFxcXFxcIiArIG5ld0NvdW50ICsgXFxcXFxcXCIg5p2hXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5a+85YWl5oiQ5YqfXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpc2JhY2spIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWvvOWFpeWksei0pVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLlpJbpg6jmlofku7ZcXFxcXFxcIiwgXFxcXFxcXCLlhoXpg6jmlofku7ZcXFxcXFxcIl0sIDEsIFxcXFxcXFwi6KeE5YiZ5a+85YWlXFxcXFxcXCIpLnNlbGVjdCgoaW1wb3J0UnVsZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLlpJbpg6jmlofku7ZcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJmaWxlU2VsZWN0Oi8vXFxcXFxcXCIgKyAkLnRvU3RyaW5nKGltcG9ydFJ1bGUpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1aXJlVXJsID0gXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU2VsZWN0ID0gcmVxdWlyZShyZXF1aXJlVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZyhpbXBvcnRSdWxlLCB0cnVlKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IHJlcXVpcmVVcmwsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZTogXFxcXFxcXCIuanNvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1R5cGU6IFxcXFxcXFwiY29uZmlybVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5OiBcXFxcXFxcInNlbGVjdFBhdGhDYWNoZVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0sIGltcG9ydFJ1bGUpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJ1bGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcmVwbGFjZVJ1bGUubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIi5cXFxcXFxcIiArIGksXFxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWIoOmZpFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCwgaW5kZXgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGcgPSBydWxlTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZUl0ZW1CeUNscyhpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaW5kZXgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5Yig6Zmk5oiQ5YqfXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgaWQsIGkpLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIi5cXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLnvJbovpFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2VkaXRSZXBsYWNlUnVsZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP2luZGV4PVxcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcXFxcXCIuXFxcXFxcXCIgKyBpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIi5cXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIFxcXFxcXFwiY29udGVudHNcXFxcXFxcIjpcXFxcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXFxcXFwiKTtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi55uu5b2V6K6+572ufOiuvue9rlxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oup5paH5Lu25aS5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShpZCkuZXh0cmE7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICAgICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgICAgICAgICBpbml0aWFsUGF0aDogQ29uZmlnLmhvbWVQYXRoLFxcXFxuICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IDFcXFxcbiAgICAgICAgICAgIH0pKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuaUr+aMgWhpa2VyOi8vZmlsZXPot6/lvoQo6K+l5pON5L2c5LiN5Lya5Yid5aeL5YyW55uu5b2VKVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IENvbmZpZy5ob21lUGF0aCxcXFxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoaWQsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICB9LCBpZCksXFxcXG4gICAgICAgICAgICAgICAgaWQ6IGlkXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuehruiupFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZ2V0TXlWYXIoaWQsIGZpbmRJdGVtKGlkKS5leHRyYS5kZWZhdWx0VmFsdWUgfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpKSBpbnB1dCA9IGdldFBhdGgoaW5wdXQpLnNsaWNlKDcpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5lbmRzV2l0aChcXFxcXFxcIi9cXFxcXFxcIikpIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXFxcXFxcXFwvJC8sIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChDb25maWcuaG9tZVBhdGggPT0gaW5wdXQpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5b2T5YmN55uu5b2VXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIDApIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgQ29uZmlnLmhvbWVQYXRoID0gaW5wdXQ7XFxcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lkv53lrZhcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7nvJbovpHmm7/mjaLop4TliJlcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZWRpdFJlcGxhY2VSdWxlLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBpc05ldyA9IE1ZX1BBUkFNUy5pc05ldyB8fCBnZXRQYXJhbShcXFxcXFxcImlzTmV3XFxcXFxcXCIpO1xcXFxuY29uc3QgaW5kZXggPSBNWV9QQVJBTVMuaW5kZXggfHwgTnVtYmVyKGdldFBhcmFtKFxcXFxcXFwiaW5kZXhcXFxcXFxcIikpO1xcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcXFxcXCIpO1xcXFxuICAgIC8vY2xlYXJNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFxcXFxcIik7XFxcXG59KSk7XFxcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxubGV0IGlkID0gXFxcXFxcXCIjXFxcXFxcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbi8vbGV0IHJlcGxhY2VSdWxlID0gaXNOZXcgPT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCI/e306cnVsZUxpc3RbaW5kZXhdO1xcXFxuaWYgKGlzTmV3ID09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiKSB7XFxcXG4gICAgcmVwbGFjZVJ1bGUgPSB7XFxcXG4gICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcXFxcbiAgICAgICAgaXNSZWdleDogZmFsc2UsXFxcXG4gICAgfVxcXFxufSBlbHNlIHtcXFxcbiAgICByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2luZGV4XTtcXFxcbn1cXFxcbi8v6aaW5qyh5Yid5aeL5YyWXFxcXG5pZihnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKT09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIHJlcGxhY2VSdWxlLmlzUmVnZXgpO1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXFxcXFwiLFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmi7fotJ1cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBbXFxcXFxcXCJuYW1lXFxcXFxcXCIsIFxcXFxcXFwiaXNSZWdleFxcXFxcXFwiLCBcXFxcXFxcInBhdHRlcm5cXFxcXFxcIiwgXFxcXFxcXCJyZXBsYWNlbWVudFxcXFxcXFwiXTtcXFxcbiAgICAgICAgbGV0IGpzb24gPSB7fTtcXFxcbiAgICAgICAgYXR0LmZvckVhY2goa2V5ID0+IHtcXFxcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFxcXFxcIiArIGtleSwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcXFxcXFxcImlzUmVnZXhcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiID8gdHJ1ZSA6IGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAganNvbltrZXldID0gdmFsdWU7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnspjotLRcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCJ7e2NsaXBib2FyZH19XFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShpbnB1dCk7XFxcXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLnBhdHRlcm4gPT0gdW5kZWZpbmVkKSByZXR1cm47XFxcXG4gICAgICAgICAgICBsZXQgYXR0ID0gW1xcXFxcXFwibmFtZVxcXFxcXFwiLCBcXFxcXFxcImlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJwYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwicmVwbGFjZW1lbnRcXFxcXFxcIl07XFxcXG4gICAgICAgICAgICBhdHQuZm9yRWFjaChrZXkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5cXFxcXFxcIiArIGtleSwgU3RyaW5nKGpzb25ba2V5XSkpO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLop4TliJnlkI3np7BcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcXFxcXCIsIHJlcGxhY2VSdWxlLm5hbWUpLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcXFxcXCIsaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLop4TliJlcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDogLTEsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgcmVwbGFjZVJ1bGUucGF0dGVybiksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmmK/lkKbkvb/nlKjmraPliJnooajovr7lvI/vvJpcXFxcXFxcIiArIGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcXFxuICAgICAgICBsZXQgaXNSZWdleCA9IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIiA/IGZhbHNlIDogdHJ1ZTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBpZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaYr+WQpuS9v+eUqOato+WImeihqOi+vuW8j++8mlxcXFxcXFwiICsgaXNSZWdleFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlzUmVnZXgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgfSwgaWQpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBpZFxcXFxuICAgIH1cXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmm7/mjaLkuLpcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDogLTEsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIsIHJlcGxhY2VSdWxlLnJlcGxhY2VtZW50KSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFxcXFxcIixpbnB1dCk7J1xcXFxuICAgIH1cXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChyZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICghcGF0dGVybikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mm7/mjaLop4TliJnkuI3og73kuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBPYmplY3QuYXNzaWduKHJlcGxhY2VSdWxlLCB7XFxcXG4gICAgICAgICAgICBuYW1lOiBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGlzUmVnZXg6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIpID09PSBcXFxcXFxcInRydWVcXFxcXFxcIiA/IHRydWUgOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4sXFxcXG4gICAgICAgICAgICByZXBsYWNlbWVudDogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoaXNOZXcgPT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gocmVwbGFjZVJ1bGUpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGluZGV4LCAxLCByZXBsYWNlUnVsZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCByZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG59KTtcXFxcblxcXFxuLypcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5pu/5o2i6IyD5Zu0XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnNjb3BlXFxcXFxcXCIsaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuKi9cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWwj+ivtOS4quaAp+WMluWHgOWMllxcXCIsXFxcInBhdGhcXFwiOlxcXCJOb3ZlbEN1c3RvbS52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5pu/5o2i6KeE5YiZfFxcXFxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcXFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG5cXFxcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgZm9vdDogMCxcXFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxcXG4gICAgc2VsZWN0ZWQ6IFtdXFxcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBNWV9QQVJBTVMucGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG5cXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi4piQ5YeA5YyWXFxcXFxcXCIsIFxcXFxcXFwi4piR5YeA5YyWXFxcXFxcXCJdWzAgKyBib29rSW5mby5pc1JlcGxhY2VdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgkaWQsIHBhdGgpID0+IHtcXFxcblxcXFxuICAgICAgICB2YXIgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgaXNSZXBsYWNlID0gYm9va0luZm8uaXNSZXBsYWNlPT09dW5kZWZpbmVkP3RydWU6Ym9va0luZm8uaXNSZXBsYWNlO1xcXFxuICAgICAgICBib29rSW5mby5pc1JlcGxhY2UgPSAhaXNSZXBsYWNlO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcXFxuICAgICAgICAgICAgdGl0bGU6IGlzUmVwbGFjZSA/IFxcXFxcXFwi4piQ5YeA5YyWXFxcXFxcXCIgOiBcXFxcXFxcIuKYkeWHgOWMllxcXFxcXFwiLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIGlkICsgXFxcXFxcXCIjLTFcXFxcXFxcIiwgTVlfUEFSQU1TLnBhdGgpLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBpZCArIFxcXFxcXFwiIy0xXFxcXFxcXCJcXFxcbiAgICB9LFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnvJbovpHop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBpc1JlZnJlc2g6IHRydWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbmZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcXFxuICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcXFxuICAgIGxldCBpc1RydWUgPSBib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogKGlzVHJ1ZSA/IFxcXFxcXFwi4pePXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICB5OiAwLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaXNUcnVlOiBpc1RydWUsXFxcXG4gICAgICAgICAgICBpZDogaWQgKyBpLFxcXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuW8gOWQr1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGZpbmRJdGVtKCRpZCkuZXh0cmEuaXNUcnVlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LlvIDlkK9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IFtdXFxcXG4gICAgICAgICAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLnNlbGVjdGVkLnB1c2gocmVwbGFjZVJ1bGUuaWQpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLil49cXFxcXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgICAgICBpZDogJGlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGlkICsgaSwgcmVwbGFjZVJ1bGUsIE1ZX1BBUkFNUy5wYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWFs+mXrVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoJGlkLCByZXBsYWNlUnVsZSwgcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCFmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YWz6ZetXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBib29rSW5mby5zZWxlY3RlZC5zcGxpY2UoYm9va0luZm8uc2VsZWN0ZWQuaW5kZXhPZihyZXBsYWNlUnVsZS5pZCksIDEpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLil4tcXFxcXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBpZCArIGksIHJlcGxhY2VSdWxlLCBNWV9QQVJBTVMucGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5aSW5a+85bCP6K+0XFxcIixcXFwicGF0aFxcXCI6XFxcImV4dGVybmFsaW1wb3J0VHh0LnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5mdW5jdGlvbiB0eHRWaWV3KGxheW91dCkge1xcXFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuICAgIGxldCBmaWxlcyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCk7XFxcXG4gICAgZmlsZXMgPSBmaWxlcy5maWx0ZXIodiA9PiAvKFxcXFxcXFxcLnR4dHxcXFxcXFxcXC5lcHViKSQvLnRlc3Qodi5uYW1lKSk7XFxcXG5cXFxcbiAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLlsI/or7TkuabmnrZcXFxcXFxcIik7XFxcXG4gICAgLy9sZXQgbGF5b3V0ID0gW107XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB1cmw6ICdpbnB1dD9cXFxcXFxcImhpa2VyOi8vcGFnZS90eHRTZWFyY2gudmlldyNub1JlZnJlc2gjP3NlYXJjaFRlcm1zPVxcXFxcXFwiK2VuY29kZVVSSUNvbXBvbmVudChpbnB1dCk6XFxcXFxcXCJ0b2FzdDovL+ivt+i+k+WFpeWwj+ivtOWQjVxcXFxcXFwiJyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+UjVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFxcXFxcInNlYXJjaEtleUJ5VHh0XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0TXlWYXIoJ3NlYXJjaEtleUJ5VHh0JyxpbnB1dClcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlr7zlhaXlsI/or7RcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChbXFxcXFxcXCLns7vnu5/pgInmi6nlmahcXFxcXFxcIiwgXFxcXFxcXCLmtbfpmJTpgInmi6nlmahcXFxcXFxcIl0sIDEsIFxcXFxcXFwi6YCJ5oup5Zmo57G75Z6LXFxcXFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwi57O757uf6YCJ5oup5ZmoXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJmaWxlU2VsZWN0Oi8vXFxcXFxcXCIgKyAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvKFxcXFxcXFxcLnR4dHwuZXB1YikkL2kudGVzdChpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi6YCJ5oup5LqG6ZSZ6K+v55qE5paH5Lu257G75Z6LXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTWF0Y2ggPSBpbnB1dC5tYXRjaCgvXFxcXFxcXFwvKFteXFxcXFxcXFwvXSo/KShcXFxcXFxcXC50eHR8XFxcXFxcXFwuZXB1YikkL2kpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgbm92ZWxOYW1lID0gZmlsZU1hdGNoWzFdLnJlcGxhY2UoXFxcXFxcXCJfZmlsZVNlbGVjdF9cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGggPSBDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoICsgbm92ZWxOYW1lICsgZmlsZU1hdGNoWzJdO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wYXRoQ2FjaGUgPSBDb25maWcuY29udGVudHNDYWNoZSArIG5vdmVsTmFtZSArIGZpbGVNYXRjaFsyXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBpbnB1dC5yZXBsYWNlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHRvcGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm0oe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWvvOWFpeaPkOekulxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXFxcXFwi5bey5a2Y5ZyoW1xcXFxcXFwiICsgbm92ZWxOYW1lICsgXFxcXFxcXCJd5piv5ZCm6KaG55uWP1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKHBhdGgsIHRvcGF0aCwgdG9wYXRoQ2FjaGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCwgdHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyB0b3BhdGhDYWNoZSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXModG9wYXRoQ2FjaGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoLCB0b3BhdGgsIHRvcGF0aENhY2hlKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgdG9wYXRoQ2FjaGUpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWvvOWFpeaIkOWKn1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVVybCA9IFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGxldCBmaWxlU2VsZWN0ID0gJC5yZXF1aXJlKHJlcXVpcmVVcmwpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcXFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVNYXRjaCA9IFBBVEgubWF0Y2goL1xcXFxcXFxcLyhbXlxcXFxcXFxcL10qPykoXFxcXFxcXFwudHh0fFxcXFxcXFxcLmVwdWIpJC9pKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3ZlbE5hbWUgPSBmaWxlTWF0Y2hbMV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9wYXRoID0gQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCArIG5vdmVsTmFtZSArIGZpbGVNYXRjaFsyXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGhDYWNoZSA9IENvbmZpZy5jb250ZW50c0NhY2hlICsgbm92ZWxOYW1lICsgZmlsZU1hdGNoWzJdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQQVRIO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHRvcGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuW3suWtmOWcqFtcXFxcXFxcIiArIG5vdmVsTmFtZSArIFxcXFxcXFwiXeaYr+WQpuimhueblj9cXFxcXFxcIikuY29uZmlybSgocGF0aCwgdG9wYXRoLCB0b3BhdGhDYWNoZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoLCB0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHRvcGF0aENhY2hlKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgsIHRvcGF0aCwgdG9wYXRoQ2FjaGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyB0b3BhdGhDYWNoZSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGhDYWNoZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXFxcXFwiLnR4dHwuZXB1YlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcXFxcXCJjb25maXJtXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBcXFxcXFxcInNlbGVjdFBhdGhDYWNoZTFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgbWVtb3J5UGF0aDogdHJ1ZVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IG9wdGlvbnMgPSBbXFxcXFxcXCLpmIXor7tcXFxcXFxcIiwgXFxcXFxcXCLliIbkuqtcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaRcXFxcXFxcIiwgXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIl07XFxcXG5cXFxcbiAgICBsZXQgcGF0dGVybiA9IGdldE15VmFyKFxcXFxcXFwiOnR4dFBhdHRlcm5cXFxcXFxcIiwgb3B0aW9uc1swXSk7XFxcXG4gICAgbGV0IGlkID0gRGF0ZS5ub3coKSArIFxcXFxcXFwiOuaooeW8j1xcXFxcXFwiO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHBhdHRlcm4sXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQob3B0aW9ucywgMSwgXFxcXFxcXCLmk43kvZzmqKHlvI9cXFxcXFxcIikuc2VsZWN0KChpZCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCI6dHh0UGF0dGVyblxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGlucHV0XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSwgaWQpLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IGlkXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaWh+S7tueuoeeQhlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlTWFuYWdlbWVudC52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3R5cGU9ZXh0ZXJuYWxJbXBvcnRQYXRoXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgsIG5hbWUsIHR5cGUpIHtcXFxcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFxcXFxcIjp0eHRQYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwi6ZiF6K+7XFxcXFxcXCIpO1xcXFxuICAgICAgICBzd2l0Y2ggKHBhdHRlcm4pIHtcXFxcbiAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLliIbkuqtcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLliKDpmaRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuehruiupOWIoOmZpFtcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIl1cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHBhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShwYXRoKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9LCBwYXRoKTtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLpmIXor7tcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGU9PT1cXFxcXFxcIi50eHRcXFxcXFxcIj9cXFxcXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXFxcXFwiOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjXFxcXFxcXCIpK1xcXFxcXFwiP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgY2FzZSBcXFxcXFxcIuaJk+W8gOaWueW8j1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIGZvciAobGV0IG5vdmVsIG9mIGZpbGVzKSB7XFxcXG4gICAgICAgIGxldCB0eXBlID0gbm92ZWwubmFtZS5zdWJzdHJpbmcobm92ZWwubmFtZS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKG9wZXJhdGlvbiwgbm92ZWwucGF0aCwgbm92ZWwubmFtZSwgdHlwZSksXFxcXG4gICAgICAgICAgICBkZXNjOiBcXFxcXFxcIuWkp+Wwj++8mlxcXFxcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShub3ZlbC5wYXRoKSArIFxcXFxcXFwiXFxcXFxcXFxu5L+u5pS55pe26Ze077yaXFxcXFxcXCIgKyAkLmRhdGVGb3JtYXQobm92ZWwubGFzdE1vZGlmaWVkLCBcXFxcXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgcGF0aDogbm92ZWwucGF0aCxcXFxcbiAgICAgICAgICAgICAgICBpc0NhY2hlOiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBub3ZlbC5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGlkOiBub3ZlbC5wYXRoLFxcXFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5YiG5LqrXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFxcXFxcInNoYXJlOi8vXFxcXFxcXCIgKyBub3ZlbC5wYXRoKVxcXFxuICAgICAgICAgICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6ZiF6K+7XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeSgodHlwZT09PVxcXFxcXFwiLnR4dFxcXFxcXFwiP1xcXFxcXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcXFxcXCI6XFxcXFxcXCJoaWtlcjovL3BhZ2UvZXB1YlBhcnNlci52aWV3I2F1dG9DYWNoZSNcXFxcXFxcIikrXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUpXFxcXG4gICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXFxcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcXFxcXCIgKyBub3ZlbC5wYXRoKVxcXFxuICAgICAgICAgICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwibG9uZ1ByZXNzLmpzXFxcXFxcXCIpLmRlbGV0ZUZpbGVGb3JUeHQocGF0aClcXFxcbiAgICAgICAgICAgICAgICAgICAgfSwgbm92ZWwucGF0aClcXFxcbiAgICAgICAgICAgICAgICB9XVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLorr7nva5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOW4ruWKqeKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD10eHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxcXG59XFxcXG5cXFxcbmlmICgkLmltcG9ydFBhcmFtID09PSB1bmRlZmluZWQpIHtcXFxcbiAgICAkLmV4cG9ydHMgPSB0eHRWaWV3O1xcXFxufSBlbHNlIGlmICgkLmltcG9ydFBhcmFtID09PSBudWxsKSB7XFxcXG4gICAgc2V0UmVzdWx0KHR4dFZpZXcoW10pKTtcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi5UWFTop6PmnpDlmahcXFwiLFxcXCJwYXRoXFxcIjpcXFwidHh0UGFyc2VyLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4oZnVuY3Rpb24oKSB7XFxcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuICAgIGxldCByZWdzID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3JlZ3VsYXJDaGFwdGVyLmZcXFxcXFxcIik7XFxcXG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIpIHx8IFxcXFxcXFwiXFxcXFxcXCIpIHx8IE1ZX1BBUkFNUy5wYXRoO1xcXFxuICAgIGxldCBjaGFyc3QgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJjaGFyc3RcXFxcXFxcIikgfHwgXFxcXFxcXCJcXFxcXFxcIikgfHwgTVlfUEFSQU1TLmNoYXJzdCB8fCBcXFxcXFxcIlVURi04XFxcXFxcXCI7XFxcXG4gICAgbGV0IGlzQ2FjaGUgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJpc0NhY2hlXFxcXFxcXCIpIHx8IFxcXFxcXFwiXFxcXFxcXCIpIHx8IE1ZX1BBUkFNUy5pc0NhY2hlO1xcXFxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiKSkge1xcXFxuICAgICAgICBwYXRoID0gXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgIH1cXFxcbiAgICBpZihNWV9QQVJBTVMudGl0bGUpe1xcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoTVlfUEFSQU1TLnRpdGxlKTtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKCQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpLmdldE5hbWUocGF0aCkpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgbGF5b3V0ID0gW107XFxcXG4gICAgbGV0IGNoYXB0ZXJOYW1lcyA9IFtdO1xcXFxuICAgIGxldCBpbnRlcnZhbHMgPSBbXTtcXFxcbiAgICBsZXQgaGFzUHJlZmFjZSA9IGZhbHNlO1xcXFxuICAgIGxldCBjYWNoZVBhdGggPSBwYXRoLnJlcGxhY2UoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCwgQ29uZmlnLmNvbnRlbnRzQ2FjaGUpO1xcXFxuICAgIGlmIChpc0NhY2hlJiZmaWxlRXhpc3QoY2FjaGVQYXRoKSkge1xcXFxuICAgICAgICB0cnkge1xcXFxuXFxcXG4gICAgICAgICAgICBsZXQgYyA9IEpTT04ucGFyc2UocmVxdWVzdChjYWNoZVBhdGgpKTtcXFxcbiAgICAgICAgICAgIGNoYXB0ZXJOYW1lcyA9IGMuY2hhcHRlck5hbWVzO1xcXFxuICAgICAgICAgICAgaW50ZXJ2YWxzID0gYy5pbnRlcnZhbHM7XFxcXG4gICAgICAgICAgICBoYXNQcmVmYWNlID0gYy5oYXNQcmVmYWNlO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIumHjeaWsOino+aekOebruW9lVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgcGF0aCtcXFxcXFxcIi5qc29uXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgICAgIHNldFJlc3VsdChbe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+55uu5b2V6Kej5p6Q5aSx6LSlKOmHjeaWsOino+aekCk8L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0sIHBhdGgrXFxcXFxcXCIuanNvblxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XSk7XFxcXG4gICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5q2j5Zyo6Kej5p6Q55uu5b2VXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgLy9cXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiOiBcXFxcXFxcInRleHQvcGxhaW47IGNoYXJzdD1cXFxcXFxcIiArIGNoYXJzdFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGV0IHBhdHRlcm4gPSByZWdzLmdldFRvY1J1bGUodHh0KTtcXFxcbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XFxcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgc2V0UmVzdWx0KFt7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPHN0cm9uZz7nm67lvZXop6PmnpDlpLHotKU8L3N0cm9uZz5cXFxcXFxcIi5iaWcoKSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1dKTtcXFxcbiAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih0eHQpO1xcXFxuICAgICAgICBsZXQgcG9pbnRlciA9IDA7XFxcXG4gICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkge1xcXFxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpO1xcXFxuICAgICAgICAgICAgbGV0IGVuZCA9IG1hdGNoZXIuZW5kKCk7XFxcXG4gICAgICAgICAgICBsZXQgdCA9IG1hdGNoZXIuZ3JvdXAoKTtcXFxcbiAgICAgICAgICAgIGlmIChwb2ludGVyID09PSAwICYmIHN0YXJ0ID4gMzApIHtcXFxcbiAgICAgICAgICAgICAgICBoYXNQcmVmYWNlID0gdHJ1ZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGNoYXB0ZXJOYW1lcy5wdXNoKHQpO1xcXFxuICAgICAgICAgICAgaW50ZXJ2YWxzLnB1c2goW3BvaW50ZXIsIHN0YXJ0XSk7XFxcXG4gICAgICAgICAgICBwb2ludGVyID0gZW5kO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGludGVydmFscy5wdXNoKFtwb2ludGVyLCB0eHQubGVuZ3RoXSk7XFxcXG4gICAgICAgIGlmIChpc0NhY2hlKSB7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgY2hhcHRlck5hbWVzOiBjaGFwdGVyTmFtZXMsXFxcXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxzOiBpbnRlcnZhbHMsXFxcXG4gICAgICAgICAgICAgICAgaGFzUHJlZmFjZTogaGFzUHJlZmFjZVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgfVxcXFxuXFxcXG5cXFxcbiAgICBpZiAoaGFzUHJlZmFjZSkge1xcXFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbMF07XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuW6j+iogFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1RYVFZpZXdlci52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJOYW1lOiBcXFxcXFxcIuW6j+iogFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBpbnRlcnZhbFswXSxcXFxcbiAgICAgICAgICAgICAgICBlbmQ6IGludGVydmFsWzFdLFxcXFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxcXG4gICAgICAgICAgICAgICAgY2hhcnN0OiBjaGFyc3RcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcHRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gY2hhcHRlck5hbWVzW2ldO1xcXFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbaSArIDFdO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9UWFRWaWV3ZXIudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBzdGFydDogaW50ZXJ2YWxbMF0sXFxcXG4gICAgICAgICAgICAgICAgZW5kOiBpbnRlcnZhbFsxXSxcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTmFtZTogbmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxcXFxuICAgICAgICAgICAgICAgIGNoYXJzdDogY2hhcnN0XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQobGF5b3V0KTtcXFxcbn0pKClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi5UWFTmn6XnnIvlmahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVFhUVmlld2VyLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgcGF0aCA9IE1ZX1BBUkFNUy5wYXRoO1xcXFxubGV0IGNoYXJzdCA9IE1ZX1BBUkFNUy5jaGFyc3Q7XFxcXG5sZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxcXG4gICAgaGVhZGVyczoge1xcXFxuICAgICAgIC8vXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJ0ZXh0L3BsYWluOyBjaGFyc3Q9XFxcXFxcXCIgKyBjaGFyc3RcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGV0IHRhcmdldFRleHRzID0gdHh0LnN1YnN0cmluZyhNWV9QQVJBTVMuc3RhcnQsIE1ZX1BBUkFNUy5lbmQpO1xcXFxuXFxcXG5sZXQgY29udGVudCA9IHRhcmdldFRleHRzLnNwbGl0KC8oXFxcXFxcXFxufFxcXFxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0Lmxlbmd0aCA+IDEpLmpvaW4oXFxcXFxcXCI8YnI+XFxcXFxcXCIpO1xcXFxubGV0IGxheW91dCA9IFtdO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiAoXFxcXFxcXCI8c3Ryb25nPlxcXFxcXFwiICsgTVlfUEFSQU1TLmNoYXB0ZXJOYW1lICsgXFxcXFxcXCI8L3N0cm9uZz5cXFxcXFxcIikuYmlnKCksXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBjb250ZW50LFxcXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjai7nq6DoioLmraPliJlcXFwiLFxcXCJwYXRoXFxcIjpcXFwicmVndWxhckNoYXB0ZXIuZlxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBydWxlcyA9IFt7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTEsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuebruW9lSjljrvnqbrnmb0pXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1b44CAXFxcXFxcXFxcXFxcXFxcXHNdKSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSkpKS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuesrOS4gOeroCDlgYfoo4XnrKzkuIDnq6DliY3pnaLmnInnqbrnmb3kvYbmiJHkuI3opoFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0yLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLnm67lvZVcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiXlsg44CAXFxcXFxcXFxcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fVtcXFxcXFxcXFxcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n10rP1xcXFxcXFxcXFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXznr4coPyHlvKApKSkuezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLnrKzkuIDnq6Ag5qCH5YeG55qE57Kk6K+t5bCx5piv6L+Z5qC3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDFcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMyxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuebruW9lSjljLnphY3nroDku4spXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1b44CAXFxcXFxcXFxcXFxcXFxcXHNdKSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl856+HKD8h5bygKSkpLnswLDMwfSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi566A5LuLIOiAgeWkq+ivuOiRm+adkeWkq1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAyXFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTQsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IGZhbHNlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLnm67lvZUo5Y+k5YW444CB6L275bCP6K+05aSH55SoKVxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl86K+dfOevhyg/IeW8oCkpKS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuesrOS4gOeroCDmr5TkuIrpnaLlj6rlpJrkuoblm57lkozor51cXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogM1xcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC01LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiKD88PVvjgIBcXFxcXFxcXFxcXFxcXFxcc10pXFxcXFxcXFxcXFxcXFxcXGQrXFxcXFxcXFxcXFxcXFxcXC4/WyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwiMTJcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC02LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5aSn5YaZ5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiKD88PVvjgIBcXFxcXFxcXFxcXFxcXFxcc10pW+OAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSwxMn1bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLkuIDnmb7kuIPljYFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC03LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fVxcXFxcXFxcXFxcXFxcXFxkezEsNX1bOu+8miwu77yMIOOAgV/igJRcXFxcXFxcXFxcXFxcXFxcLV0uezEsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCIx44CB6L+Z5Liq5bCx5piv5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDVcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtOCxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogdHJ1ZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5aSn5YaZ5pWw5a2XIOWIhumalOespiDmoIfpopjlkI3np7BcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiXlsg44CAXFxcXFxcXFxcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CBX+KAlFxcXFxcXFxcXFxcXFxcXFwtXS57MSwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuS4gOOAgeWPquacieWJjemdoueahOaVsOWtl+acieW3ruWIq1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiA2XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTksXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuato+aWhyDmoIfpopgv5bqP5Y+3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl5bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR95q2j5paHWyDjgIBdezEsNH0uezAsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLmraPmlocg5oiR5aW25bi45bGx6LW15a2Q6b6ZXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDdcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTAsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIkNoYXB0ZXIvU2VjdGlvbi9QYXJ0L0VwaXNvZGUg5bqP5Y+3IOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSg/OltDY11oYXB0ZXJ8W1NzXWVjdGlvbnxbUHBdYXJ0fO+8sO+8oe+8su+8tHxbTm5dW29PXVxcXFxcXFxcXFxcXFxcXFwufFtFZV1waXNvZGV8KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpXFxcXFxcXFxcXFxcXFxcXHN7MCw0fVxcXFxcXFxcXFxcXFxcXFxkezEsNH0uezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCJDaGFwdGVyIDEgTXlHcmFuZG1hSXNOQlxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiA4XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTExLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwiQ2hhcHRlcijljrvnroDku4spXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl5bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR9KD86W0NjXWhhcHRlcnxbU3NdZWN0aW9ufFtQcF1hcnR877yw77yh77yy77y0fFtObl1bT29dXFxcXFxcXFxcXFxcXFxcXC58W0VlXXBpc29kZSlcXFxcXFxcXFxcXFxcXFxcc3swLDR9XFxcXFxcXFxcXFxcXFxcXGR7MSw0fS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIkNoYXB0ZXIgMSBNeUdyYW5kbWFJc05CXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDlcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTIsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIueJueauiuespuWPtyDluo/lj7cg5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdKVvjgJDjgJTjgJbjgIzjgI7jgIjvvLtcXFxcXFxcXFxcXFxcXFxcW10oPzrnrKx8W0NjXWhhcHRlcilbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsMTB9W+eroOiKgl0uezAsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLjgJDnrKzkuIDnq6Ag5ZCO6Z2i55qE56ym5Y+35Y+v5Lul5rKh5pyJXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDEwXFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTEzLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi54m55q6K56ym5Y+3IOagh+mimCjmiJDlr7kpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdezAsNH0pKD86W1xcXFxcXFxcXFxcXFxcXFxb44CI44CM44CO44CW44CU44CK77yI44CQXFxcXFxcXFxcXFxcXFxcXChdLnsxLDMwfVtcXFxcXFxcXFxcXFxcXFxcKeOAke+8ieOAi+OAleOAl+OAj+OAjeOAiVxcXFxcXFxcXFxcXFxcXFxdXT98KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpWyDjgIBdezAsNH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuOAjuWKoOS4quebtOinkuW8leWPt+abtOS4k+S4muOAj1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxMVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNCxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogdHJ1ZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi54m55q6K56ym5Y+3IOagh+mimCjljZXkuKopXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdezAsNH0pKD86W+KYhuKYheKcpuKcp10uezEsMzB9fCg/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWKVsg44CAXXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLimIbjgIHmmYvmsZ/kvZzogIXmnIDllpzmrKLnmoTmoLzlvI9cXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMTJcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTUsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIueroC/ljbcg5bqP5Y+3IOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyBcXFxcXFxcXFxcXFxcXFxcdOOAgF17MCw0fSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfFvljbfnq6BdW1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CAXXswLDR9LnswLDMwfSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi5Y235LqUIOW8gOa6kOebm+S4llxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxM1xcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNixcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIumhtuagvOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeXFxcXFxcXFxcXFxcXFxcXFMuezEsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLkuI3otoXov4cyMOS4quWtl+mhtuagvOWGmeeahOmDveaYr+agh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNyxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuWPjOagh+mimCjliY3lkJEpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/bSkoPzw9WyBcXFxcXFxcXFxcXFxcXFxcdOOAgF17MCw0fSnnrKxbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JCg/PVtcXFxcXFxcXFxcXFxcXFxcc+OAgF17MCw4feesrFtcXFxcXFxcXFxcXFxcXFxcZOmbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4feeroClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi56ys5LiA56ugIOecn+ato+eahOagh+mimOW5tuWBh+ijheaNouihjOesrOS4gOeroCDov5nkuKrkuI3opoFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMTVcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTgsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IGZhbHNlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLlj4zmoIfpopgo5ZCO5ZCRKVxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCIoP20pKD88PVsgXFxcXFxcXFxcXFxcXFxcXHTjgIBdezAsNH3nrKxbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFtcXFxcXFxcXFxcXFxcXFxcc+OAgF17MCw4fSnnrKxbXFxcXFxcXFxcXFxcXFxcXGTpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLnrKzkuIDnq6Ag6L+Z5Liq5qCH6aKY5LiN6KaB5bm25YGH6KOF5o2i6KGM56ys5LiA56ug55yf5q2j55qE5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDE2XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTE5LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLkuablkI0g5ous5Y+3IOW6j+WPt1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeLnsxLDIwfVso77yIXVtcXFxcXFxcXFxcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fVsp77yJXVsg44CAXFxcXFxcXFx0XXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLmoIfpopjlkI7pnaLmlbDlrZfmnInmi6zlj7coMTIpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDE3XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTIwLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLkuablkI0g5bqP5Y+3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl4uezEsMjB9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9WyDjgIBcXFxcXFxcXHRdezAsNH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuagh+mimOWQjumdouaVsOWtl+ayoeacieaLrOWPtzEyNFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxOFxcXFxuICAgIH1cXFxcbl07XFxcXG5sZXQgTWF0Y2hlciA9IGphdmEudXRpbC5yZWdleC5NYXRjaGVyO1xcXFxubGV0IFBhdHRlcm4gPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybjtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0VG9jUnVsZShjb250ZW50KSB7XFxcXG4gICAgbGV0IG1heENzID0gMTtcXFxcbiAgICBsZXQgdG9jUGF0dGVybiA9IG51bGw7XFxcXG4gICAgZm9yIChsZXQgdG9jUnVsZSBvZiBydWxlcykge1xcXFxuICAgICAgICBpZiAoIXRvY1J1bGUuZW5hYmxlKSBjb250aW51ZTtcXFxcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodG9jUnVsZS5ydWxlLCBQYXR0ZXJuLk1VTFRJTElORSk7XFxcXG4gICAgICAgIGxldCBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGNvbnRlbnQpO1xcXFxuICAgICAgICBsZXQgY3MgPSAwO1xcXFxuICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHtcXFxcbiAgICAgICAgICAgIGNzKys7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGNzID49IG1heENzKSB7XFxcXG4gICAgICAgICAgICBtYXhDcyA9IGNzO1xcXFxuICAgICAgICAgICAgdG9jUGF0dGVybiA9IHBhdHRlcm47XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHRvY1BhdHRlcm47XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0VG9jUnVsZSA9IGdldFRvY1J1bGU7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI1Yu5biu5YqpXFxcIixcXFwicGF0aFxcXCI6XFxcImhlbHAudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBoZWxwVGV4dCA9IHtcXFxcbiAgICBcXFxcXFxcInR4dFxcXFxcXFwiOiBgXFxcXG4gICAgICAgIDxoMSBpZD1cXFxcXFxcInR4dOaYr+S7gOS5iFxcXFxcXFwiPlRYVOaYr+S7gOS5iD88L2gxPlxcXFxuICAgICAgICA8cD48YSBocmVmPVxcXFxcXFwiaHR0cHM6Ly9iYWlrZS5iYWlkdS5jb20vaXRlbS90eHQvMTIxNzMzMFxcXFxcXFwiPuaIkeW3sue7j+W4ruS9oOeZvuW6puS6hjwvYT7vvJvnroDljZXmnaXor7TlsLHmmK/kuIDnp43lgqjlrZjlsI/or7TnmoTmlofku7Yo5omp5bGV5ZCNOnR4dCnjgII8L3A+XFxcXG4gICAgICAgIDxoMSBpZD1cXFxcXFxcIuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtFxcXFxcXFwiPuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtD88L2gxPlxcXFxuICAgICAgICA8cD7lnKjkuLvpobXpnaIg4peJVFhUIOeVjOmdouS4i++8jOeCueWHu+WvvOWFpVRYVO+8jOmAieaLqeebruagh+Wwj+ivtOaWh+S7tih0eHTmlofku7bvvIw8ZW0+6K+l5pON5L2c5LiN5Lya5Yig6ZmkdHh05paH5Lu277yM6ICM5pivY29weeS4gOS7veWIsOWwj+eoi+W6j+eahOi3r+W+hOS4izwvZW0+Ke+8jOWvvOWFpeWQjuWGjeWcqCDil4lUWFQg55WM6Z2i5LiL6YCJ5oup5oOz6KaB6ZiF6K+755qE5bCP6K+05Y2z5Y+v44CCPC9wPlxcXFxuXFxcXG4gICAgYCxcXFxcbiAgICBcXFxcXFxcIm5vdmVsQ29taWNcXFxcXFxcIjogYFxcXFxuICAgICAgICA8aDEgaWQ9XFxcXFxcXCLov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ9cXFxcXFxcIj7ov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ88L2gxPlxcXFxuICAgICAgICA8dWw+XFxcXG4gICAgICAgIDxsaT48dT7ku6PnoIHkuIrkuLrlhbbku5blsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynmj5DkvpvkuIvovb3mjqXlj6PjgII8L3U+PC9saT5cXFxcbiAgICAgICAgPGxpPjx1PuacrOS9k+WFheW9k+mYheivu+WZqO+8jOWPr+S7pea1j+iniOeUqOivpeWwj+eoi+W6j+aPkOS+m+eahOS4i+i9veaOpeWPoyjkuIrpnaIp77yM5LiL6L2955qE5ryr55S7L+Wwj+ivtOOAgjwvdT48L2xpPlxcXFxuICAgICAgICA8bGk+PHU+5o+Q5L6bVFhU5qC85byP5bCP6K+05paH5Lu26Kej5p6Q5Yqf6IO944CCPC91PlxcXFxuICAgICAgICA8aDEgaWQ9XFxcXFxcXCLkuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKhcXFxcXFxcIj7kuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKg/PC9oMT5cXFxcbiAgICAgICAgPHU+5Yid5qyh5L2/55So77yM5rKh5pyJ5b6I5q2j5bi45ZCn44CC8J+klDwvdT5cXFxcbiAgICAgICAgPGgxIGlkPVxcXFxcXFwi6K+l5aaC5L2V5re75Yqg5ryr55S75oiW5bCP6K+0XFxcXFxcXCI+6K+l5aaC5L2V5re75Yqg5ryr55S7KOaIluWwj+ivtCk/PC9oMT5cXFxcbiAgICAgICAgPHU+IOWcqOS4gOS4quacieS4i+i9veWKn+iDveeahOWwj+eoi+W6jyjmvKvnlLvnsbsv5bCP6K+057G7KeS4reS4i+i9veS4gOacrOa8q+eUuy/lsI/or7TvvIzov5Tlm57or6Xop4TliJnljbPlj6/mtY/op4jjgII8L3U+PC9saT5cXFxcbiAgICAgICAgPC91bD5cXFxcbiAgICBgXFxcXG59O1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5biu5YqpXFxcXFxcXCIpO1xcXFxubGV0IGtleXdvcmQgPSBnZXRQYXJhbShcXFxcXFxcImtleXdvcmRcXFxcXFxcIik7XFxcXG5sZXQgdGV4dDtcXFxcbmlmIChrZXl3b3JkID09PSB1bmRlZmluZWQgfHwgISh0ZXh0ID0gaGVscFRleHRba2V5d29yZF0pKSB7XFxcXG4gICAgc2V0UmVzdWx0KFt7XFxcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXFxcXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXFxcXFwiPui1hOaWmeS4jeingeWSrzwvaDE+JyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9XSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIHNldFJlc3VsdChbe1xcXFxuICAgICAgICB0aXRsZTogdGV4dCxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9XSk7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7lpJblr7zmkJzntKJcXFwiLFxcXCJwYXRoXFxcIjpcXFwidHh0U2VhcmNoLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgc2VhcmNoVGVybXMgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJzZWFyY2hUZXJtc1xcXFxcXFwiKSk7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLjgIxcXFxcXFxcIiArIHNlYXJjaFRlcm1zICsgXFxcXFxcXCLjgI3nmoTmkJzntKLnu5PmnpxcXFxcXFxcIik7XFxcXG5sZXQgZGF0YSA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCwgdW5kZWZpbmVkKTtcXFxcbmRhdGEgPSBkYXRhLmZpbHRlcih2ID0+IC8oXFxcXFxcXFwudHh0fFxcXFxcXFxcLmVwdWIpJC8udGVzdCh2Lm5hbWUpKTtcXFxcblxcXFxubGV0IHRlcm1zQXJyID0gc2VhcmNoVGVybXMuc3BsaXQoXFxcXFxcXCJcXFxcXFxcIikubWFwKHQgPT4gdC5yZXBsYWNlKC9cXFxcXFxcXCp8XFxcXFxcXFwufFxcXFxcXFxcP3xcXFxcXFxcXCt8XFxcXFxcXFwkfFxcXFxcXFxcXnxcXFxcXFxcXFt8XFxcXFxcXFxdfFxcXFxcXFxcKHxcXFxcXFxcXCl8XFxcXFxcXFx7fFxcXFxcXFxcfXxcXFxcXFxcXHx8XFxcXFxcXFwvfFxcXFxcXFxcXFxcXFxcXFwvZywgayA9PiBcXFxcXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcIiArIGspKTtcXFxcbmxldCByZWcgPSBuZXcgUmVnRXhwKHRlcm1zQXJyLmpvaW4oXFxcXFxcXCIuKlxcXFxcXFwiKSwgXFxcXFxcXCJpXFxcXFxcXCIpO1xcXFxubGV0IHNlYXJjaFJlc3VsdCA9IFtdO1xcXFxuZm9yIChsZXQgdHh0IG9mIGRhdGEpIHtcXFxcbiAgICBpZiAocmVnLnRlc3QodHh0Lm5hbWUpKSB7XFxcXG4gICAgICAgIGxldCB0eXBlID0gdHh0Lm5hbWUuc3Vic3RyaW5nKHR4dC5uYW1lLmxhc3RJbmRleE9mKFxcXFxcXFwiLlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHNlYXJjaFJlc3VsdC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiB0eHQubmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogKHR5cGU9PT1cXFxcXFxcIi50eHRcXFxcXFxcIj9cXFxcXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXFxcXFwiOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjXFxcXFxcXCIpK1xcXFxcXFwiP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlLFxcXFxuICAgICAgICAgICAgZGVzYzogdHh0LnBhdGgsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHBhdGg6IHR4dC5wYXRoLFxcXFxuICAgICAgICAgICAgICAgIGlzQ2FjaGU6IHRydWUsXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHR4dC5uYW1lXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChzZWFyY2hSZXN1bHQubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgc2VhcmNoUmVzdWx0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgfSwge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgfSwge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgfSwge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJiaWdfYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgfSwge1xcXFxuICAgICAgICB0aXRsZTogJzxoMiBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7wn5SO5rKh5pyJ5om+5Yiw55u45YWz5Lmm57GNPC9oMj4nLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2Yu6ZW/5oyJL+eCueWHu1xcXCIsXFxcInBhdGhcXFwiOlxcXCJsb25nUHJlc3MuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4kLmV4cG9ydHMgPSB7XFxcXG4gICAgZGVsZXRlRmlsZUZvckJvb2socGF0aCkge1xcXFxuICAgICAgICAvL3JldHVybiAkKFxcXFxcXFwi5omA5pyJ55qEIOa8q+eUuy/lsI/or7Qg56ug6IqC5bCG6KKr5Yig6ZmkXFxcXFxcXFxt56Gu6K6k5Yig6Zmk77yfXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgZGVsZXRlSXRlbShwYXRoKVxcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy99LCBwYXRoKTtcXFxcbiAgICB9LFxcXFxuICAgIGRlbGV0ZUZpbGVGb3JUeHQocGF0aCkge1xcXFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHBhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgZGVsZXRlSXRlbShwYXRoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBzaW5nbGVFbnRlcihwYWdlVXJsLCBwYXRoKSB7XFxcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGRpcnMgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXFxcXFwiZGlyXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoZGlycy5sZW5ndGggPT09IDEpIHtcXFxcbiAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBsZXQgZmkgPSBkaXJzWzBdLnBhdGg7XFxcXG4gICAgICAgICAgICBpZiAoQ29uZmlnLmRlZl9pc0NvbWljQ29tcGF0aWJsZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGZpKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hvcnRlbiA9IGZpLnJlcGxhY2UoZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpLnNsaWNlKDcpLCBcXFxcXFxcImhpa2VyOi8vZmlsZXMvXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBwaWNsaXN0ID0gZmlsZWxpc3QubWFwKChpdGVtLCBpKSA9PiBzaG9ydGVuICsgXFxcXFxcXCIvXFxcXFxcXCIgKyAoaSArIDEpICsgXFxcXFxcXCIuanBnXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY2xpc3Quam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9jb21pY0NvbXBhdGlibGUudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lIz9wYXRoPVxcXFxcXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBwYWdlVXJsICsgXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGVcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5LiL6L295Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIm1haW5Eb3dubG9hZFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG5cXFxcbiQuZXhwb3J0cy5ub3ZlbCA9IGZ1bmN0aW9uIG5vdmVsKGl0ZW0sIGluZm8sIG9yZGVyLCBNWV9JRCwgaW50ZXJydXB0KSB7XFxcXG4gICAgbGV0IGlkID0gaW5mby5ib29rSWQgPyBcXFxcXFxcIiRcXFxcXFxcIiArIGluZm8uYm9va0lkIDogXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcubm92ZWxQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBUb29sLnRleHRTaGllbGQoaW5mby5ib29rTmFtZSkgKyBpZCArIFxcXFxcXFwiL1xcXFxcXFwiO1xcXFxuICAgIGxldCBjaGFwdGVyUGF0aCA9IG1haW5QYXRoICsgb3JkZXIgKyBcXFxcXFxcIiRBJFxcXFxcXFwiICsgVG9vbC50ZXh0U2hpZWxkKGl0ZW0udGl0bGUpICsgXFxcXFxcXCIudHh0XFxcXFxcXCI7XFxcXG4gICAgbGV0IGNvbnRlbnQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGlmIChpbnRlcnJ1cHQgJiYgZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiAtMTtcXFxcbiAgICB9XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IHNldFJlc3VsdCA9IGRhdGEgPT4ge1xcXFxuICAgICAgICAgICAgY29udGVudCA9IGRhdGFbMF0udGl0bGUgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDEgJiYgZGF0YVsxXS50aXRsZSAmJiBkYXRhWzFdLnRpdGxlLmxlbmd0aCA+IGNvbnRlbnQubGVuZ3RoKSB7XFxcXG4gICAgICAgICAgICAgICAgY29udGVudCA9IGRhdGFbMV0udGl0bGU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGdldFJlc0NvZGUgPSAoKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goaXRlbS51cmwpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBnZXRDb250ZW50ID0gbmV3IEZ1bmN0aW9uKFxcXFxcXFwiaW5wdXRcXFxcXFxcIiwgXFxcXFxcXCJ1cmxcXFxcXFxcIiwgXFxcXFxcXCJpbmRleFxcXFxcXFwiLCBcXFxcXFxcInRpdGxlXFxcXFxcXCIsIFxcXFxcXFwic2V0UmVzdWx0XFxcXFxcXCIsIFxcXFxcXFwiZ2V0UmVzQ29kZVxcXFxcXFwiLCBcXFxcXFxcInJldHVybiBcXFxcXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXFxcbiAgICAgICAgY29udGVudCA9IGdldENvbnRlbnQoaXRlbS51cmwsIGl0ZW0udXJsLCBvcmRlciwgaXRlbS50aXRsZSwgc2V0UmVzdWx0LCBnZXRSZXNDb2RlKSB8fCBjb250ZW50IHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor68+IFxcXFxcXFwiICsgZS5tZXNzYWdlO1xcXFxuICAgICAgICB0aHJvdyBlO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLlsI/or7TkuLrnqbpcXFxcXFxcIik7XFxcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJrmraPmlofov5Tlm57kuLrnqbo+XFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXFxcbiAgICAgICAgICAgIFRvb2wucGljRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgaWQgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiwgYm9va1RvcFBpY1sxXSwgaW5mby5kZWNvZGUpO1xcXFxuXFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhcXFxcXFxcIjzlsIHpnaLkuIvovb3plJnor68+IFxcXFxcXFwiICsgZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBGaWxlLmZpbGVXcml0ZShjaGFwdGVyUGF0aCwgY29udGVudC5yZXBsYWNlKC88c2NyaXB0Pi4qPzxcXFxcXFxcXC9zY3JpcHQ+L2dtaSwgXFxcXFxcXCJcXFxcXFxcIikudHJpbVJpZ2h0KCkpO1xcXFxuICAgIC8vRmlsZS5yZW5hbWVGaWxlKGNoYXB0ZXJQYXRoLCBvcmRlciArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIudHh0XFxcXFxcXCIpO1xcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMuY29taWMgPSBmdW5jdGlvbiBjb21pYyhpdGVtLCBpbmZvLCBvcmRlciwgTVlfSUQsIGludGVycnVwdCkge1xcXFxuICAgIGxldCBpZCA9IGluZm8uYm9va0lkID8gXFxcXFxcXCIkXFxcXFxcXCIgKyBpbmZvLmJvb2tJZCA6IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgbGV0IG1haW5QYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXFxcXFwiL1xcXFxcXFwiICsgVG9vbC50ZXh0U2hpZWxkKGluZm8uYm9va05hbWUpICsgaWQgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcXFxcXCIkQiRcXFxcXFxcIiArIFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKSArIFxcXFxcXFwiL1xcXFxcXFwiO1xcXFxuICAgIGxldCBwaWNMaXN0ID0gW107XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IGdldFBpY0xpc3QgPSBuZXcgRnVuY3Rpb24oXFxcXFxcXCJpbnB1dFxcXFxcXFwiLCBcXFxcXFxcInVybFxcXFxcXFwiLCBcXFxcXFxcImluZGV4XFxcXFxcXCIsIFxcXFxcXFwidGl0bGVcXFxcXFxcIiwgXFxcXFxcXCJyZXR1cm5cXFxcXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXFxcbiAgICAgICAgcGljTGlzdCA9IGdldFBpY0xpc3QoaXRlbS51cmwsIGl0ZW0udXJsLCBvcmRlciwgaXRlbS50aXRsZSk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QucmVwbGFjZShcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZTtcXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgcGljTGlzdCA9IHBpY0xpc3QuZmlsdGVyKHAgPT4gcCk7XFxcXG4gICAgY29uc3QgTCA9IHBpY0xpc3QubGVuZ3RoO1xcXFxuICAgIGlmIChMID09PSAwKSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5Zu+54mH6ZO+5o6l5Li656m6XFxcXFxcXCIpO1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77ya5Zu+54mH6ZO+5o6l6L+U5Zue5Li656m6PlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxcXG4gICAgICAgICAgICBUb29sLnBpY0Rvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIGlkICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0sIGluZm8uZGVjb2RlKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcXFxcXCIgKyBlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgbGV0IGVycm9yTnVtID0gMDtcXFxcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEw7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxcXG4gICAgICAgICAgICBUb29sLnBpY0Rvd25sb2FkKHBpY1swXSwgY2hhcHRlclBhdGggKyAoaSArIDEpICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIHBpY1sxXSwgaW5mby5kZWNvZGUpO1xcXFxuICAgICAgICAgICAgaWYgKGludGVycnVwdCAmJiBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBlcnJvck51bSA9IDA7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGlmIChlcnJvck51bSA8IDEwKSB7XFxcXG4gICAgICAgICAgICAgICAgaS0tO1xcXFxuICAgICAgICAgICAgICAgIGVycm9yTnVtKys7XFxcXG4gICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIFRvb2wudGV4dFNoaWVsZChpdGVtLnRpdGxlKSk7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5ryr55S75YW85a65XFxcIixcXFwicGF0aFxcXCI6XFxcImNvbWljQ29tcGF0aWJsZS52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuc2V0UGFnZVRpdGxlKE1ZX1BBUkFNUy50aXRsZSk7XFxcXG5sZXQgcGF0aD1kZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIsTVlfUEFSQU1TLnBhdGgpKTtcXFxcbmxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCk7XFxcXG5sZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJwaWNfMV9mdWxsXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBwYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyAoaSArIDEpICsgXFxcXFxcXCIuanBnXFxcXFxcXCJcXFxcbn0pKTtcXFxcblxcXFxuc2V0UmVzdWx0KHBpY2xpc3QpO1xcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5Lmm5p62XFxcIixcXFwicGF0aFxcXCI6XFxcIkJvb2tyYWNrLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IHJhbmsgPSAkLnJlcXVpcmUoXFxcXFxcXCJmaWxlUmFuay5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJUb29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiQ29uZmlnLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG4oZnVuY3Rpb24oKSB7XFxcXG4gICAgbGV0IHR5cGUgPSBNWV9QQVJBTVMudHlwZSB8fCBnZXRQYXJhbShcXFxcXFxcInR5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikgfHwgXFxcXFxcXCJjb21pY1xcXFxcXFwiO1xcXFxuICAgIGxldCBydWxlTmFtZSA9IFRvb2wudGV4dFNoaWVsZChNWV9QQVJBTVMucnVsZU5hbWUgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicnVsZU5hbWVcXFxcXFxcIikpKTtcXFxcbiAgICBpZiAoIXJ1bGVOYW1lKSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi6K+35Lyg5YWl6KeE5YiZ5ZCNXFxcXFxcXCIpO1xcXFxuICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKCFbXFxcXFxcXCJjb21pY1xcXFxcXFwiLCBcXFxcXFxcIm5vdmVsXFxcXFxcXCJdLmluY2x1ZGVzKHR5cGUpKSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi6K+35Lyg5YWl5q2j56Gu55qEdHlwZTpjb21pYyBub3ZlbFxcXFxcXFwiKTtcXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgfVxcXFxuICAgIHNldFBhZ2VUaXRsZShydWxlTmFtZSArIFxcXFxcXFwifOacrOWcsOS5puaetlxcXFxcXFwiKTtcXFxcbiAgICBsZXQgbGF5b3V0ID0gW107XFxcXG4gICAgbGV0IHBhdGggPSBDb25maWdbdHlwZSArIFxcXFxcXFwiUGF0aFxcXFxcXFwiXSArIHJ1bGVOYW1lO1xcXFxuICAgIGxldCBjb2xfdHlwZSA9IGdldEl0ZW0oXFxcXFxcXCJib29rcmFjazpjb2xfdHlwZVxcXFxcXFwiLCBcXFxcXFxcIm1vdmllXzNfbWFycXVlZVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgcmFua01ldGhvZCA9IGdldEl0ZW0oXFxcXFxcXCJib29rcmFjazpyYW5rTWV0aG9kXFxcXFxcXCIsIFxcXFxcXFwi57O757ufXFxcXFxcXCIpO1xcXFxuICAgIGxldCByYW5rSXNSZXZlcnNlID0gZ2V0SXRlbShcXFxcXFxcImJvb2tyYWNrOnJhbmtJc1JldmVyc2VcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5cXFxcbiAgICBsZXQgY29sVHlwZXMgPSBbXFxcXFxcXCJtb3ZpZV8xXFxcXFxcXCIsIFxcXFxcXFwibW92aWVfMlxcXFxcXFwiLCBcXFxcXFxcIm1vdmllXzNfbWFycXVlZVxcXFxcXFwiLCBcXFxcXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcXFxcXCIsIFxcXFxcXFwicGljXzJcXFxcXFxcIiwgXFxcXFxcXCJwaWNfM1xcXFxcXFwiLCBcXFxcXFxcInBpY18zX3NxdWFyZVxcXFxcXFwiLCBcXFxcXFxcInBpY18yX2NhcmRcXFxcXFxcIl07XFxcXG4gICAgXFxcXG4gICAgbGV0IHJhbmtNZXRob2RzID0gW1xcXFxcXFwi57O757ufXFxcXFxcXCIsIFxcXFxcXFwi5aSn5bCPXFxcXFxcXCIsIFxcXFxcXFwi5ZCN56ewXFxcXFxcXCIsIFxcXFxcXFwi5pe26Ze0XFxcXFxcXCJdO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdXJsOiAnXFxcXFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXFxcXFwiK2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzkvaDmg7PopoHnmoQjXFxcXFxcXCIgKyB0eXBlICsgXFxcXFxcXCIjLi4uLi4uXFxcXFxcXCIsXFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCflI1cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKChydWxlTmFtZSwgdHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBhcnIxID0gW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidGl0bGVcXFxcXFxcIjogcnVsZU5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInNlYXJjaF91cmxcXFxcXFxcIjogXFxcXFxcXCJoaWtlcjovL2VtcHR5P2lzQWxsPTEmc2VhcmNoVGVybXM9KiomdHlwZT1cXFxcXFxcIiArIHR5cGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInNlYXJjaEZpbmRcXFxcXFxcIjogXFxcXFxcXCJqczokLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9TZWFyY2gudmlldz9ydWxlPScrTVlfUlVMRS5fdGl0bGUpO1xcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgIH1dO1xcXFxuICAgICAgICAgICAgICAgIFxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnIxKTtcXFxcbiAgICAgICAgICAgIH0sIHJ1bGVOYW1lLCB0eXBlKSxcXFxcbiAgICAgICAgICAgIC8qZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcXFxcXCIqL1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfp6lcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiZmxleF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGNvbFR5cGVzLm1hcCh2PT52PT09Y29sX3R5cGU/XFxcXFxcXCLigJzigJxcXFxcXFxcIit2K1xcXFxcXFwi4oCd4oCdXFxcXFxcXCI6dikpLnNlbGVjdCgobmFtZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYoL+KAnOKAnC4qP+KAneKAnS8udGVzdChpbnB1dCkpIHJldHVybjtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJib29rcmFjazpjb2xfdHlwZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICB9KVxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IG5hbWUgb2YgcmFua01ldGhvZHMpIHtcXFxcbiAgICAgICAgbGV0IGEgPSByYW5rTWV0aG9kID09PSBuYW1lO1xcXFxuICAgICAgICBsZXQgdGl0bGVhID0gYSA/IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyBuYW1lICsgXFxcXFxcXCLigJnigJlcXFxcXFxcIiA6IG5hbWU7XFxcXG4gICAgICAgIGxldCB0aXRsZWIgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBpZiAoYSkge1xcXFxuICAgICAgICAgICAgdGl0bGViID0gIXJhbmtJc1JldmVyc2UgPyBcXFxcXFxcIuKGk1xcXFxcXFwiIDogXFxcXFxcXCLihpFcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRpdGxlYiA9IFxcXFxcXFwi4oaVXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlYSArIHRpdGxlYixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImZsZXhfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCByYW5rTWV0aG9kID0gZ2V0SXRlbShcXFxcXFxcImJvb2tyYWNrOnJhbmtNZXRob2RcXFxcXFxcIiwgXFxcXFxcXCLns7vnu59cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJhbmtJc1JldmVyc2UgPSBnZXRJdGVtKFxcXFxcXFwiYm9va3JhY2s6cmFua0lzUmV2ZXJzZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgIGlmIChyYW5rTWV0aG9kID09PSBuYW1lKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5rSXNSZXZlcnNlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5rSXNSZXZlcnNlID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtJc1JldmVyc2UgPSBcXFxcXFxcIjFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcXFxcXCIsIHJhbmtJc1JldmVyc2UpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJib29rcmFjazpyYW5rSXNSZXZlcnNlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwiYm9va3JhY2s6cmFua01ldGhvZFxcXFxcXFwiLCBuYW1lKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSwgbmFtZSlcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGxldCByYW5rTWV0aG9kTWFwID0ge1xcXFxuICAgICAgICBcXFxcXFxcIuezu+e7n1xcXFxcXFwiOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcIuWkp+Wwj1xcXFxcXFwiOiBcXFxcXFxcInNpemVcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCLlkI3np7BcXFxcXFxcIjogXFxcXFxcXCJuYW1lXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwi5pe26Ze0XFxcXFxcXCI6IFxcXFxcXFwidGltZVxcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBsZXQgYm9va0xpc3QgPSBbXTtcXFxcbiAgICBsZXQgbGlzdCA9IHJhbmsoRmlsZS5nZXRGaWxlcyhwYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKSwgcmFua01ldGhvZE1hcFtyYW5rTWV0aG9kXSk7XFxcXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGJvb2tMaXN0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuWVpemDveayoeacieiAtlxcXFxcXFwiLmJpZygpLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgfVxcXFxuICAgIGxldCBwYWdlVXJsID0gdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0KSB7XFxcXG4gICAgICAgIGxldCBwaWMgPSBmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBpdGVtLmdldFBhdGgoKSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaXRlbS5nZXROYW1lKCkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIikgPyBpdGVtLmdldFBhdGgoKSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaXRlbS5nZXROYW1lKCkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcXFxuICAgICAgICBsZXQgbmFtZXM9U3RyaW5nKGl0ZW0uZ2V0TmFtZSgpKS5zcGxpdChcXFxcXFxcIiRcXFxcXFxcIik7XFxcXG4gICAgICAgIGJvb2tMaXN0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5hbWVzWzBdLFxcXFxuICAgICAgICAgICAgZGVzYzogbmFtZXNbMV0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxcXG4gICAgICAgICAgICB1cmw6IHR5cGUgPT09IFxcXFxcXFwibm92ZWxcXFxcXFxcIiA/cGFnZVVybCArIFxcXFxcXFwiP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlOiQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocGFnZVVybCwgcGF0aCk9PntcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwibG9uZ1ByZXNzLmpzXFxcXFxcXCIpLnNpbmdsZUVudGVyKHBhZ2VVcmwsIHBhdGgpO1xcXFxuICAgICAgICAgICAgfSwgcGFnZVVybCwgaXRlbS5nZXRQYXRoKCkpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6Y29sX3R5cGUsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwibG9uZ1ByZXNzLmpzXFxcXFxcXCIpLmRlbGV0ZUZpbGVGb3JCb29rKHBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9LCBpdGVtLmdldFBhdGgoKSlcXFxcbiAgICAgICAgICAgICAgICB9XSxcXFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5nZXRQYXRoKCksXFxcXG4gICAgICAgICAgICAgICAgcGF0aDogaXRlbS5nZXRQYXRoKCksXFxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5nZXROYW1lKClcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGlmIChyYW5rSXNSZXZlcnNlKSB7XFxcXG4gICAgICAgIGJvb2tMaXN0LnJldmVyc2UoKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBzZXRSZXN1bHQobGF5b3V0LmNvbmNhdChib29rTGlzdCkpO1xcXFxufSkoKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZi7mlofku7bmjpLluo9cXFwiLFxcXCJwYXRoXFxcIjpcXFwiZmlsZVJhbmsuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmxldCBjaG5OdW1DaGFyID0ge1xcXFxuICAgIOmbtjogMCxcXFxcbiAgICDkuIA6IDEsXFxcXG4gICAg5LqMOiAyLFxcXFxuICAgIOS4iTogMyxcXFxcbiAgICDlm5s6IDQsXFxcXG4gICAg5LqUOiA1LFxcXFxuICAgIOWFrTogNixcXFxcbiAgICDkuIM6IDcsXFxcXG4gICAg5YWrOiA4LFxcXFxuICAgIOS5nTogOVxcXFxufTtcXFxcblxcXFxubGV0IGNobk5hbWVWYWx1ZSA9IHtcXFxcbiAgICDljYE6IHtcXFxcbiAgICAgICAgdmFsdWU6IDEwLFxcXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcXFxuICAgIH0sXFxcXG4gICAg55m+OiB7XFxcXG4gICAgICAgIHZhbHVlOiAxMDAsXFxcXG4gICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxcXG4gICAgfSxcXFxcbiAgICDljYM6IHtcXFxcbiAgICAgICAgdmFsdWU6IDEwMDAsXFxcXG4gICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxcXG4gICAgfSxcXFxcbiAgICDkuIc6IHtcXFxcbiAgICAgICAgdmFsdWU6IDEwMDAwLFxcXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxcXG4gICAgfSxcXFxcbiAgICDkur86IHtcXFxcbiAgICAgICAgdmFsdWU6IDEwMDAwMDAwMCxcXFxcbiAgICAgICAgc2VjVW5pdDogdHJ1ZVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gQ2hpbmVzZVRvTnVtYmVyKGNoblN0cikge1xcXFxuICAgIGxldCBydG4gPSAwO1xcXFxuICAgIGxldCBzZWN0aW9uID0gMDtcXFxcbiAgICBsZXQgbnVtYmVyID0gMDtcXFxcbiAgICBsZXQgc2VjVW5pdCA9IGZhbHNlO1xcXFxuICAgIGxldCBzdHIgPSBjaG5TdHIuc3BsaXQoJycpO1xcXFxuXFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgbGV0IG51bSA9IGNobk51bUNoYXJbc3RyW2ldXTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09ICd1bmRlZmluZWQnKSB7XFxcXG4gICAgICAgICAgICBudW1iZXIgPSBudW07XFxcXG4gICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcXFxcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IG51bWJlcjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCB1bml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0udmFsdWU7XFxcXG4gICAgICAgICAgICBzZWNVbml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0uc2VjVW5pdDtcXFxcbiAgICAgICAgICAgIGlmIChzZWNVbml0KSB7XFxcXG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9IChzZWN0aW9uICsgbnVtYmVyKSAqIHVuaXQ7XFxcXG4gICAgICAgICAgICAgICAgcnRuICs9IHNlY3Rpb247XFxcXG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9IDA7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gKG51bWJlciAqIHVuaXQpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbnVtYmVyID0gMDtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcnRuICsgc2VjdGlvbjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbmFtZUNvbXBhcmUoYSwgYikge1xcXFxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxcXFxuICAgICAgICByZXR1cm4gYSA9PSBudWxsID8gYiA9PSBudWxsID8gMCA6IC0xIDogMTtcXFxcblxcXFxuICAgIGEgPSBhLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxcXG4gICAgICAgIC8vIHAxIGlzIG5vbmRpZ2l0cywgcDIgZGlnaXRzLCBhbmQgcDMgbm9uLWFscGhhbnVtZXJpY3NcXFxcbiAgICAgICAgcmV0dXJuIENoaW5lc2VUb051bWJlcihwMSk7XFxcXG4gICAgfSlcXFxcbiAgICBiID0gYi5yZXBsYWNlKC8oW+mbtuS4gOS6jOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+S6v10pL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzLCBvZmZzZXQsIHN0cmluZykge1xcXFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxcXG4gICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcXFxuICAgIH0pXFxcXG5cXFxcbiAgICBsZXQgTlVNQkVSUyA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoXFxcXFxcXCIoPzw9XFxcXFxcXFxcXFxcXFxcXEQpKD89XFxcXFxcXFxcXFxcXFxcXGQpfCg/PD1cXFxcXFxcXFxcXFxcXFxcZCkoPz1cXFxcXFxcXFxcXFxcXFxcRClcXFxcXFxcIik7XFxcXG4gICAgbGV0IHNwbGl0MSA9IE5VTUJFUlMuc3BsaXQobmV3IGphdmEubGFuZy5TdHJpbmcoYSkpO1xcXFxuICAgIGxldCBzcGxpdDIgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGIpKTtcXFxcblxcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oc3BsaXQxLmxlbmd0aCwgc3BsaXQyLmxlbmd0aCk7IGkrKykge1xcXFxuICAgICAgICBsZXQgYzEgPSBzcGxpdDFbaV0uY2hhckNvZGVBdCgwKTtcXFxcbiAgICAgICAgbGV0IGMyID0gc3BsaXQyW2ldLmNoYXJDb2RlQXQoMCk7XFxcXG4gICAgICAgIGxldCBjbXAgPSAwO1xcXFxuICAgICAgICBsZXQgemVyb0NoYXJDb2RlID0gJzAnLmNoYXJDb2RlQXQoMCk7XFxcXG4gICAgICAgIGxldCBuaW5lQ2hhckNvZGUgPSAnOScuY2hhckNvZGVBdCgwKTtcXFxcblxcXFxuICAgICAgICBpZiAoYzEgPj0gemVyb0NoYXJDb2RlICYmIGMxIDw9IG5pbmVDaGFyQ29kZSAmJiBjMiA+PSB6ZXJvQ2hhckNvZGUgJiYgYzIgPD0gbmluZUNoYXJDb2RlKSB7XFxcXG4gICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQxW2ldKS5jb21wYXJlVG8obmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKHNwbGl0MltpXSkpO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xcXFxuICAgICAgICAgICAgbGV0IHJlZ2V4ID0gL1thLXpBLVowLTldL1xcXFxuICAgICAgICAgICAgbGV0IHMxID0gU3RyaW5nKHNwbGl0MVtpXSlcXFxcbiAgICAgICAgICAgIGxldCBzMiA9IFN0cmluZyhzcGxpdDJbaV0pXFxcXG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChzMSkgfHwgcmVnZXgudGVzdChzMikpIHtcXFxcbiAgICAgICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDJbaV0pKTtcXFxcbiAgICAgICAgICAgICAgICAvLyBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnZW4nKVxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnemgnKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGNtcDtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsZXQgbGVuZ3RoQ21wID0gc3BsaXQxLmxlbmd0aCAtIHNwbGl0Mi5sZW5ndGg7XFxcXG4gICAgLy8gaWYgKGxlbmd0aENtcCAhPT0gMCkgbGVuZ3RoQ21wID0gbGVuZ3RoQ21wID4gMCA/IC0xIDogMTtcXFxcbiAgICByZXR1cm4gbGVuZ3RoQ21wO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiByYW5rKGxpc3QsIG0pIHtcXFxcbiAgICBzd2l0Y2ggKG0pIHtcXFxcbiAgICAgICAgY2FzZSBcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgcmV0dXJuIGxpc3Quc29ydCgoYSwgYikgPT4gbmFtZUNvbXBhcmUoU3RyaW5nKGEuZ2V0TmFtZSgpKSwgU3RyaW5nKGIuZ2V0TmFtZSgpKSkpO1xcXFxuICAgICAgICBjYXNlIFxcXFxcXFwic2l6ZVxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgcmV0dXJuIGxpc3Quc29ydCgoYSwgYikgPT4gRmlsZS5nZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoYSkgLSBGaWxlLmdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihiKSk7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCJ0aW1lXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICByZXR1cm4gbGlzdC5zb3J0KChhLCBiKSA9PiBhLmxhc3RNb2RpZmllZCgpIC0gYi5sYXN0TW9kaWZpZWQoKSk7XFxcXG4gICAgICAgIGRlZmF1bHQ6XFxcXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcXFxcbiAgICB9XFxcXG5cXFxcbn1cXFxcbiQuZXhwb3J0cz1yYW5rO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LmVwdWLop6PmnpDlmahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZXB1YlBhcnNlci52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGxheW91dCA9IFtdO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5Lmm57GN5L+h5oGvXFxcXFxcXCIpO1xcXFxubGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIpIHx8IFxcXFxcXFwiXFxcXFxcXCIpIHx8IE1ZX1BBUkFNUy5wYXRoO1xcXFxubGV0IG1ldGEgPSBnZXRFcHViTWV0YWRhdGEocGF0aCk7XFxcXG4vL2xvZyhtZXRhKVxcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IG1ldGEuZmlyc3RUaXRsZSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIvCfkaTkvZzogIXvvJpcXFxcXFxcIiArIG1ldGEuYXV0aG9yc1swXS5sYXN0bmFtZSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbn0pO1xcXFxubGV0IGRlc2NyaXB0aW9uID0gKG1ldGEuZGVzY3JpcHRpb25zWzBdIHx8IFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoLzxwLio/Pnw8XFxcXFxcXFwvcD4vZywgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgdGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XFxcXG5pZiAoZGVzY3JpcHRpb24pIHtcXFxcbiAgICBcXFxcbiAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoID4gNTApIHtcXFxcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgNTApICtcXFxcXFxcIi4uLi4uLlxcXFxcXFwiICtcXFxcXFxcIuabtOWkmj5cXFxcXFxcIi5saW5rKCQoKS5iNjQoXFxcXFxcXCInXFxcXFxcXCIpLnJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgc2V0UmVzdWx0KFt7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi566A5LuL77yaPGJyPuOAgOOAgFxcXFxcXFwiICsgTVlfUEFSQU1TLnRleHQsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG5cXFxcbiAgICAgICAgICAgIH1dKTtcXFxcbiAgICAgICAgfSkpO1xcXFxuICAgIH1cXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfk53nroDku4vvvJo8YnI+44CA44CAXFxcXFxcXCIrZGVzY3JpcHRpb24sXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGV4dDogdGRlc2NyaXB0aW9uXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbi8vc2V0UGFnZVRpdGxlKG1ldGEuZmlyc3RUaXRsZSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGNoYXB0ZXJzID0gZ2V0RXB1YkNoYXB0ZXJzKHBhdGgpO1xcXFxuZm9yIChsZXQgaXQgb2YgY2hhcHRlcnMpIHtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBpdC50aXRsZSxcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9lcHViVmlld2VyLnZpZXcjcmVhZFRoZW1lIyNhdXRvUGFnZSNcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBocmVmOiBpdC51cmwsXFxcXG4gICAgICAgICAgICBwYXRoOiBwYXRoLFxcXFxuICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LmVwdWLmn6XnnIvlmahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZXB1YlZpZXdlci52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXFxcbmxldCB1cmwgPSBNWV9QQVJBTVMuaHJlZjtcXFxcbmxldCBjID0gZ2V0RXB1YkNvbnRlbnQocGF0aCwgdXJsKTtcXFxcbi8vbGV0IGE9IGMucmVwbGFjZSgvXFxcXFxcXFxzPzxkaXYuKj8+fDxcXFxcXFxcXC9kaXY+XFxcXFxcXFxzPy9nLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKC9cXFxcXFxcXHM/PHAuKj8+KC4qKTxcXFxcXFxcXC9wPlxcXFxcXFxccz8vZywgXFxcXFxcXCJcXFxcXFxcXHUzMDAwXFxcXFxcXFx1MzAwMCQxPGJyPlxcXFxcXFwiKTtcXFxcbi8vbGV0IGI9Yy5yZXBsYWNlKC9cXFxcXFxcXHM/PGRpdi4qPz58PFxcXFxcXFxcL2Rpdj5cXFxcXFxcXHM/L2csIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoL1xcXFxcXFxccz88cC4qPz4oLio/KTxcXFxcXFxcXC9wPlxcXFxcXFxccz8vZywgXFxcXFxcXCJcXFxcXFxcXHUzMDAwXFxcXFxcXFx1MzAwMCQxPGJyPlxcXFxcXFwiKTtcXFxcbi8vbG9nKGE9PWIpXFxcXG4vL2xvZyhnZXRFcHViQ29udGVudDAocGF0aCwgdXJsKSlcXFxcblxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiAoXFxcXFxcXCI8c3Ryb25nPlxcXFxcXFwiICsgTVlfUEFSQU1TLnRpdGxlICsgXFxcXFxcXCI8L3N0cm9uZz5cXFxcXFxcIikuYmlnKCksXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBjLFxcXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjduaWh+S7tueuoeeQhlxcXCIsXFxcInBhdGhcXFwiOlxcXCJGaWxlTWFuYWdlbWVudC52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc1xcXFxcXFwiKTtcXFxcbmxldCB1cmwgPSBcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIjtcXFxcbmxldCBmID0gJC5yZXF1aXJlKHVybCk7XFxcXG5sZXQgdHlwZSA9IGdldFBhcmFtKFxcXFxcXFwidHlwZVxcXFxcXFwiLCBcXFxcXFxcImhvbWVQYXRoXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICgpID0+IHtcXFxcbiAgICByZWZyZXNoUGFnZSgpO1xcXFxufSk7XFxcXG5sZXQgaGlrZXJQYXRoID0gXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBDb25maWcuaG9tZVBhdGg7XFxcXG5pZighZmlsZUV4aXN0KGhpa2VyUGF0aCkpe1xcXFxuICAgIHdyaXRlRmlsZShoaWtlclBhdGgrXFxcXFxcXCIv5Yib5bu655uu5b2VLnR4dFxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIGRlbGV0ZUZpbGUoaGlrZXJQYXRoK1xcXFxcXFwiL+WIm+W7uuebruW9lS50eHRcXFxcXFxcIik7XFxcXG59XFxcXG5mLmZpbGVTZWxlY3Rpb24oe1xcXFxuICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgLy/moLnmja7mlofku7bmianlsZXlkI3vvIznlKjkuI3lkIzlsI/nqIvluo/miZPlvIBcXFxcbiAgICAgICAgaWYgKFxcXFxcXFwiLmpwZ1xcXFxcXFwiID09PSBUWVBFKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gUEFUSDtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChcXFxcXFxcIi50eHRcXFxcXFxcIiA9PT0gVFlQRSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3P2lzQ2FjaGU9dHJ1ZSZydWxlPVxcXFxcXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXFxcXFwiJnBhdGg9XFxcXFxcXCIgKyBQQVRIO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKFxcXFxcXFwiLmVwdWJcXFxcXFxcIiA9PT0gVFlQRSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2VwdWJQYXJzZXIudmlldyNhdXRvQ2FjaGUjP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCImcGF0aD1cXFxcXFxcIiArIFBBVEg7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuaXoOazleaJk+W8gO+8jOaYr+WQpuS9v+eUqOWFtuS7luW6lOeUqOaJk+W8gO+8n1xcXFxcXFwiKS5jb25maXJtKHBhdGggPT4gXFxcXFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFxcXFxcIiArIHBhdGgsIFBBVEgpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSksXFxcXG4gICAgaW5pdGlhbFBhdGg6IENvbmZpZ1t0eXBlXSxcXFxcbiAgICByb290RGlyUGF0aDogQ29uZmlnLmhvbWVQYXRoLFxcXFxuICAgIC8vb25DbGlja1R5cGU6IFxcXFxcXFwiY29uZmlybVxcXFxcXFwiLFxcXFxuICAgIC8vbWVtb3J5OiBcXFxcXFxcIkZpbGVNYW5hZ2VtZW50Om1lbW9yeVxcXFxcXFwiLFxcXFxuICAgIGZpbGVUeXBlOiBcXFxcXFxcIlxcXFxcXFxcLnR4dHxcXFxcXFxcXC5lcHVifC5qcGdcXFxcXFxcIixcXFxcbiAgICAvL2NIb21lVGlwczogXFxcXFxcXCLmmK/lkKbkvb/nlKjmtbfpmJTlsI/nqIvluo/miZPlvIBbJHtuYW1lfV0/XFxcXFxcXCIsXFxcXG4gICAgLy9jU2VhcmNoVGlwczogXFxcXFxcXCLmmK/lkKbkvb/nlKjmtbfpmJTlsI/nqIvluo/miZPlvIBbJHtwYXRofV0/XFxcXFxcXCJcXFxcbn0pO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiNqLkNvbmZpZ1xcXCIsXFxcInBhdGhcXFwiOlxcXCJDb25maWcuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFxcXFxcIik7XFxcXG5cXFxcbmxldCBsb2NhbENvbmZpZyA9IHt9O1xcXFxuXFxcXG50cnkge1xcXFxuICAgIGxvY2FsQ29uZmlnID0gSlNPTi5wYXJzZShGaWxlLnJlYWRGaWxlKGdldFBhdGgoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2ZpbGVzL+acrOWcsOi1hOa6kOeuoeeQhi9jb25maWcuanNvblxcXFxcXFwiKS5zbGljZSg3KSkpO1xcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIGRlbGV0ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiKTtcXFxcbn1cXFxcbmNvbnN0IENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIGhvbWVQYXRoOiBnZXRQYXRoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9sb2NhbE1hbmFnZXJcXFxcXFxcIikuc2xpY2UoNyksXFxcXG4gICAgbG9nTnVtOiAxMCxcXFxcbiAgICB0aHJlYWROdW06IDAsXFxcXG4gICAgZGVmX2lzUGFnaW5hdGU6IFxcXFxcXFwiMVxcXFxcXFwiLCAvLzHpu5jorqTlvIDlkK/liIbpobXvvIww6buY6K6k5YWz6ZetXFxcXG4gICAgdmlld1BhZ2VTaXplOiAyMDAsXFxcXG4gICAgZGVmX1BpYzogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpYzRcXFxcXFxcIixcXFxcbiAgICBkZWZfTG9yZF9UeXBlOiBcXFxcXFxcImNvbWljXFxcXFxcXCIsXFxcXG4gICAgZGVmX1ZpZXdfU3R5bGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgZGVmX0RvVmlfU3R5bGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXG4gICAgZGVmX0RvVmlfVHlwZTogXFxcXFxcXCIxXFxcXFxcXCIsIC8vMOWFqOmDqCwgMeacquWujOaIkO+8jDLlt7LlrozmiJBcXFxcbiAgICBkZWZfaXNDb21pY0NvbXBhdGlibGU6IFxcXFxcXFwiMFxcXFxcXFwiLFxcXFxuICAgIGRlZl9Db21pY19TdHlsZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSwgbG9jYWxDb25maWcpO1xcXFxuY29uc3QgUEFUSFMgPSB7XFxcXG4gICAgbm92ZWxQYXRoOiBcXFxcXFxcIi/lsI/or7QvXFxcXFxcXCIsXFxcXG4gICAgY29taWNQYXRoOiBcXFxcXFxcIi/mvKvnlLsvXFxcXFxcXCIsXFxcXG4gICAgbm92ZWxGdWxsUGF0aDogXFxcXFxcXCIv5bCP6K+05ZCI5bm2L1xcXFxcXFwiLFxcXFxuICAgIGV4dGVybmFsSW1wb3J0UGF0aDogXFxcXFxcXCIv5aSW5a+85bCP6K+0L1xcXFxcXFwiLFxcXFxuICAgIGNvbnRlbnRzQ2FjaGU6IFxcXFxcXFwiL+ebruW9lee8k+WtmC9cXFxcXFxcIlxcXFxufVxcXFxuXFxcXG5cXFxcbk9iamVjdC5rZXlzKFBBVEhTKS5mb3JFYWNoKGtleSA9PiBDb25maWdba2V5XSA9IENvbmZpZy5ob21lUGF0aCArIFBBVEhTW2tleV0pO1xcXFxuXFxcXG4kLmV4cG9ydHMgPSBDb25maWc7XFxcIn1dXCIsXCJwcm94eVwiOlwiXCJ9IiwidGl0bGUiOiLluK7liqkifQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement