@vonage/ml-transformers 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1056,6 +1056,10 @@ axios$1.spread = spread;
1056
1056
  axios$1.isAxiosError = isAxiosError;
1057
1057
  axios$2.exports = axios$1;
1058
1058
  axios$2.exports.default = axios$1;
1059
+ let _metadata;
1060
+ function getMetadata() {
1061
+ return _metadata;
1062
+ }
1059
1063
  var byteToHex = [];
1060
1064
  for (var i = 0; i < 256; ++i) {
1061
1065
  byteToHex.push((i + 256).toString(16).substr(1));
@@ -1494,7 +1498,7 @@ class MediaProcessorConnector {
1494
1498
  });
1495
1499
  }
1496
1500
  }
1497
- const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LER0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIFV0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBCdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBOdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIEh0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gJHQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBXdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIGp0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gcXQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBWdChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24genQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEp0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBRdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPUR0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBYdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpVdCxpc0Zvcm1EYXRhOkJ0LGlzQXJyYXlCdWZmZXJWaWV3Ok50LGlzU3RyaW5nOkh0LGlzTnVtYmVyOiR0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOld0LGlzRmlsZTpqdCxpc0Jsb2I6cXQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTpWdCxpc1VSTFNlYXJjaFBhcmFtczp6dCxpc1N0YW5kYXJkQnJvd3NlckVudjpHdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpRdCx0cmltOkp0LHN0cmlwQk9NOlh0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLG0pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/bT1tKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChtKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sS3Q9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtLdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFl0PXNlLFp0PVAsZXI9ZnVuY3Rpb24oZSx0KXtadC5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sdHI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHRyKGEsdCxuLHMsbyl9LHJyPW50LG5yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQocnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsc3I9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksaXI9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sb3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sYXI9aXIsdXI9b3IsZnI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIWFyKHQpP3VyKGUsdCk6dH0sSWU9UCxscj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGNyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZsci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxocj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxkcj1ucixwcj1zcixtcj10dCxncj1mcixfcj1jcix5cj1ocixGZT1udCx2cj1mZSx3cj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIG0oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsUj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK1IpfXZhciB2PWdyKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksbXIodixlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBUPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj9fcihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6VCxjb25maWc6ZSxyZXF1ZXN0OmZ9O2RyKGZ1bmN0aW9uKFgpe24oWCksbSgpfSxmdW5jdGlvbihYKXtzKFgpLG0oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8dnIudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx5cih2KSkmJmUueHNyZkNvb2tpZU5hbWU/cHIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKFQpeyFmfHwocyghVHx8VCYmVC50eXBlP25ldyB3cigiY2FuY2VsZWQiKTpUKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sdz1QLG90PWVyLGJyPXJ0LEVyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshdy5pc1VuZGVmaW5lZChyKSYmdy5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBUcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIENyKHIsZSx0KXtpZih3LmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksdy50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOlRyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksdy5pc0Zvcm1EYXRhKGUpfHx3LmlzQXJyYXlCdWZmZXIoZSl8fHcuaXNCdWZmZXIoZSl8fHcuaXNTdHJlYW0oZSl8fHcuaXNGaWxlKGUpfHx3LmlzQmxvYihlKT9lOncuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6dy5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOncuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksQ3IoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJncuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/YnIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O3cuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksdy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT13Lm1lcmdlKEVyKX0pO3ZhciBmZT11ZSxScj1QLFByPWZlLE9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxQcjtyZXR1cm4gUnIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9T3IsU3I9dXQsTXI9ZmUsQXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEFyKCJjYW5jZWxlZCIpfXZhciBJcj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fE1yLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBTcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBtPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgUj1tW2RdfHxvLHY9UihkKTtTLmlzVW5kZWZpbmVkKHYpJiZSIT09Y3x8KG5bZF09dil9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0seHI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2Iit4cisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIEZyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBMcj17YXNzZXJ0T3B0aW9uczpGcix2YWxpZGF0b3JzOkRlfSxkdD1QLGtyPXR0LHB0PVl0LG10PUlyLGxlPWx0LGd0PUxyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHYpe3R5cGVvZiB2LnJ1bldoZW49PSJmdW5jdGlvbiImJnYucnVuV2hlbih0KT09PSExfHwobz1vJiZ2LnN5bmNocm9ub3VzLHMudW5zaGlmdCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2EucHVzaCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIG09dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7bT1mKG0pfWNhdGNoKFIpe2QoUik7YnJlYWt9fXRyeXt1PW10KG0pfWNhdGNoKFIpe3JldHVybiBQcm9taXNlLnJlamVjdChSKX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxrcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBEcj1LLFVyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBVcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgQnI9eixOcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LEhyPVAsJHI9ZnVuY3Rpb24oZSl7cmV0dXJuIEhyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLFdyPVhlLGNlPURyLGpyPWx0LHFyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PVdyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KGpyKHIscykpfSx0fXZhciBMPXl0KHFyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49QnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPU5yLEwuaXNBeGlvc0Vycm9yPSRyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgVnI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgenI9IjEuMS4xIjtjbGFzcyBre2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVwb3J0PXthY3Rpb246cC5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6cC5vZk51bGxhYmxlKG51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpwLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6cC5lbXB0eSgpLGd1aWQ6cC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpwLmVtcHR5KCksbWVzc2FnZTpwLmVtcHR5KCksc291cmNlOnAub2ZOdWxsYWJsZShudWxsKSx0cmFuc2Zvcm1lZEZwczpwLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOnAuZW1wdHkoKSx2YXJpYXRpb246cC5lbXB0eSgpLHZpZGVvSGVpZ2h0OnAuZW1wdHkoKSx2aWRlb1dpZHRoOnAuZW1wdHkoKSx2ZXJzaW9uOnpyLGVycm9yOnAuZW1wdHkoKX19YWN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuYWN0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfWZyYW1lc1RyYW5zZm9ybWVkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnJhbWVzVHJhbnNmb3JtZWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnBzPXAub2ZOdWxsYWJsZShlKSx0aGlzfWd1aWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5ndWlkPXAub2ZOdWxsYWJsZShlKSx0aGlzfW1lc3NhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5tZXNzYWdlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVkRnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZWRGcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZXJUeXBlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZXJUeXBlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZhcmlhdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZhcmlhdGlvbj1wLm9mTnVsbGFibGUoZSksdGhpc312aWRlb0hlaWdodChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvSGVpZ2h0PXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvV2lkdGgoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb1dpZHRoPXAub2ZOdWxsYWJsZShlKSx0aGlzfWVycm9yKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZXJyb3I9cC5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBKcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyBEe3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYoZS5hcHBsaWNhdGlvbklkPT09bnVsbHx8ZS5zb3VyY2U9PT1udWxsKXt0KCJzdWNjZXNzIik7cmV0dXJufWxldCBzPVZyLmNyZWF0ZSgpLG89e3RpbWVvdXQ6MWU0LHRpbWVvdXRFcnJvck1lc3NhZ2U6IlJlcXVlc3QgdGltZW91dCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX07Y29uc3QgYT0iaHR0cHM6Ly9obGcuZGV2LnRva2JveC5jb20vZGV2L2xvZ2dpbmcvdmNwX3dlYnJ0YyI7cy5wb3N0KGEsSnIoZSksbykudGhlbih1PT57Y29uc29sZS5sb2codSksdCgic3VjY2VzcyIpfSkuY2F0Y2godT0+e2NvbnNvbGUubG9nKHUpLG4odSl9KX0pfX12YXIgaGUsR3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIFFyKCl7aWYoIWhlJiYoaGU9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWhlKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGhlKEdyKX12YXIgWHI9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIEtyKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJlhyLnRlc3Qocil9Zm9yKHZhciBiPVtdLFVlPTA7VWU8MjU2OysrVWUpYi5wdXNoKChVZSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIFlyKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KGJbcltlKzBdXStiW3JbZSsxXV0rYltyW2UrMl1dK2JbcltlKzNdXSsiLSIrYltyW2UrNF1dK2JbcltlKzVdXSsiLSIrYltyW2UrNl1dK2JbcltlKzddXSsiLSIrYltyW2UrOF1dK2JbcltlKzldXSsiLSIrYltyW2UrMTBdXStiW3JbZSsxMV1dK2JbcltlKzEyXV0rYltyW2UrMTNdXStiW3JbZSsxNF1dK2JbcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIUtyKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gYnQocixlLHQpe3I9cnx8e307dmFyIG49ci5yYW5kb218fChyLnJuZ3x8UXIpKCk7aWYobls2XT1uWzZdJjE1fDY0LG5bOF09bls4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgcz0wO3M8MTY7KytzKWVbdCtzXT1uW3NdO3JldHVybiBlfXJldHVybiBZcihuKX1jb25zdCBOPW5ldyBXZWFrTWFwLGRlPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsQmU9U3ltYm9sKCJhbnlQcm9kdWNlciIpLEV0PVByb21pc2UucmVzb2x2ZSgpLHBlPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLG1lPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IE5lPSExO2Z1bmN0aW9uIEoocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBnZShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBHKHIsZSl7Y29uc3QgdD1kZS5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIFoocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6QmUsbj1ZLmdldChyKTtyZXR1cm4gbi5oYXModCl8fG4uc2V0KHQsbmV3IFNldCksbi5nZXQodCl9ZnVuY3Rpb24gWnIocixlLHQpe2NvbnN0IG49WS5nZXQocik7aWYobi5oYXMoZSkpZm9yKGNvbnN0IHMgb2Ygbi5nZXQoZSkpcy5lbnF1ZXVlKHQpO2lmKG4uaGFzKEJlKSl7Y29uc3Qgcz1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygbi5nZXQoQmUpKW8uZW5xdWV1ZShzKX19ZnVuY3Rpb24gVHQocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEsbj0oKT0+e30scz1bXTtjb25zdCBvPXtlbnF1ZXVlKGEpe3MucHVzaChhKSxuKCl9LGZpbmlzaCgpe3Q9ITAsbigpfX07Zm9yKGNvbnN0IGEgb2YgZSlaKHIsYSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIHM/cy5sZW5ndGg9PT0wP3Q/KHM9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoYT0+e249YX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBzLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGEpe3M9dm9pZCAwO2Zvcihjb25zdCB1IG9mIGUpWihyLHUpLmRlbGV0ZShvKTtyZXR1cm4gbigpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBhfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIEN0KHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIFJ0O2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighUnQuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBIZT1yPT5yPT09cGV8fHI9PT1tZTtjbGFzcyBXe3N0YXRpYyBtaXhpbihlLHQpe3JldHVybiB0PUN0KHQpLG49PntpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGZ1bmN0aW9uIik7Zm9yKGNvbnN0IGEgb2YgdClpZihuLnByb3RvdHlwZVthXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7YX1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7ZnVuY3Rpb24gcygpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiExLHZhbHVlOm5ldyBXfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6c30pO2NvbnN0IG89YT0+ZnVuY3Rpb24oLi4udSl7cmV0dXJuIHRoaXNbZV1bYV0oLi4udSl9O2Zvcihjb25zdCBhIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITEsdmFsdWU6byhhKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBOZTtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxOZX1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe05lPWV9Y29uc3RydWN0b3IoZT17fSl7Ti5zZXQodGhpcyxuZXcgU2V0KSxkZS5zZXQodGhpcyxuZXcgTWFwKSxZLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LG4scyxvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIHM9PSJzeW1ib2wiJiYocz1zLnRvU3RyaW5nKCkpO2NvbnN0IGE9bmV3IERhdGUsdT1gJHthLmdldEhvdXJzKCl9OiR7YS5nZXRNaW51dGVzKCl9OiR7YS5nZXRTZWNvbmRzKCl9LiR7YS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHt1fV1bZW1pdHRlcnk6JHt0fV1bJHtufV0gRXZlbnQgTmFtZTogJHtzfQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LG4peyhXLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LG4pfW9uKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLEhlKG4pfHx0aGlzLmVtaXQocGUse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChtZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBuPXRoaXMub24oZSxzPT57bigpLHQocyl9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlKKHQpO3JldHVybiBUdCh0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCksWnIodGhpcyxlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1IZShlKT9bXTpbLi4uc107YXdhaXQgRXQsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIHU9PntpZihuLmhhcyh1KSlyZXR1cm4gdSh0KX0pLC4uLmEubWFwKGFzeW5jIHU9PntpZihzLmhhcyh1KSlyZXR1cm4gdShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7SihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1bLi4uc107YXdhaXQgRXQ7Zm9yKGNvbnN0IHUgb2YgbyluLmhhcyh1KSYmYXdhaXQgdSh0KTtmb3IoY29uc3QgdSBvZiBhKXMuaGFzKHUpJiZhd2FpdCB1KGUsdCl9b25BbnkoZSl7cmV0dXJuIGdlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksTi5nZXQodGhpcykuYWRkKGUpLHRoaXMuZW1pdChwZSx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBUdCh0aGlzKX1vZmZBbnkoZSl7Z2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChtZSx7bGlzdGVuZXI6ZX0pLE4uZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtHKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBuPVoodGhpcyx0KTtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7Ti5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBkZS5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIFkuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXtpZih0eXBlb2Ygbj09InN0cmluZyIpe3QrPU4uZ2V0KHRoaXMpLnNpemUrRyh0aGlzLG4pLnNpemUrWih0aGlzLG4pLnNpemUrWih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBuIT0idW5kZWZpbmVkIiYmSihuKSx0Kz1OLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBzIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemU7Zm9yKGNvbnN0IHMgb2YgWS5nZXQodGhpcykudmFsdWVzKCkpdCs9cy5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9Q3QodCk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IFJ0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFcucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6cGUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVywibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6bWUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgJGU9VztmdW5jdGlvbiBlbihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdG4ocil7aWYoZW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gV2Uocil7cmV0dXJuIHRuKHIpLm1lc3NhZ2V9dmFyIGplOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KShqZXx8KGplPXt9KSk7Y29uc3Qgcm49NTAwLG5uPS44O2NsYXNzIHNuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1idCgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQobil9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaCh0KXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodCkpLmJ1aWxkKCk7RC5yZXBvcnQobik7Y29uc3Qgcz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixzKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4scyxvLGE7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSx0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShzPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9zOjAsKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgoYT0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6YS5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PXJuJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaCh1KXtjb25zdCBjPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3RyYW5zZm9ybSkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKHUpKS5idWlsZCgpO0QucmVwb3J0KGMpO2NvbnN0IG09e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnUsZnVuY3Rpb246InRyYW5zZm9ybSJ9O3RoaXMuZW1pdCgiZXJyb3IiLG0pfX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKG4pe2NvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfZmx1c2gpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZShuKSkuYnVpbGQoKTtELnJlcG9ydChzKTtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjpuLGZ1bmN0aW9uOiJmbHVzaCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG8pfX10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKTtjb25zdCB0PW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCl9c3RvcCgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFN0b3Agc3RyZWFtLiIpLHRoaXMuc2hvdWxkU3RvcF89ITB9bWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpe2xldCBlPShEYXRlLm5vdygpLXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXykvMWUzLHQ9dGhpcy5mcmFtZXNGcm9tU291cmNlXy9lLG49dGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8vZTtpZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKm5uPnQpe2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOmplLkZQU19EUk9QLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBzPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtELnJlcG9ydChzKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3Mgb24gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49bmV3IHNuKGVbdF0sdCk7bi5vbigiZXJyb3IiLHM9Pnt0aGlzLmVtaXQoImVycm9yIixzKX0pLG4ub24oIndhcm4iLHM9Pnt0aGlzLmVtaXQoIndhcm4iLHMpfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gobil9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgbj1lO2ZvcihsZXQgcyBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0ocykpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBuLmNhbmNlbCgpfSkuY2F0Y2goYXN5bmMgcz0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChzKSxhd2FpdCBuLmNhbmNlbChzKX0pfWNhdGNoe3RoaXMuZGVzdHJveSgpO3JldHVybn1jb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIGFuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMudXVpZF89YnQoKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO0QucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtELnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKX10aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpLHRoaXMucGlwZWxpbmVfPW5ldyBvbih0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChuPT57dChuKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQudXBkYXRlcy50cmFuc2Zvcm1lcl9uZXcpLnZhcmlhdGlvbigiVXBkYXRlIikuYnVpbGQoKTtyZXR1cm4gRC5yZXBvcnQodCksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCksZSgpfSl9fXZhciBfZTsoZnVuY3Rpb24ocil7ci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIn0pKF9lfHwoX2U9e30pKTtjbGFzcyBQdHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5maWx0ZXI9dGhpcy5ibHVyRmlsdGVyXyxlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNsYXNzIHVue2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuaW1hZ2VDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLmltYWdlQ3R4Xz10aGlzLmltYWdlQ2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLHdpbGxSZWFkRnJlcXVlbnRseTohMCxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLmltYWdlQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7dGhpcy5pbWFnZUJsb2JfPXZvaWQgMCxmZXRjaChlKS50aGVuKHQ9Pnt0LmJsb2IoKS50aGVuKG49Pnt0aGlzLmltYWdlQmxvYl89bn0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJibG9iIGVycm9yIixuKX0pfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoImZldGNoIGVycm9yIix0KX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKHR5cGVvZiB0aGlzLmltYWdlQmxvYl8hPSJ1bmRlZmluZWQiJiYodGhpcy5pbWFnZUNhbnZhc18ud2lkdGghPXQud2lkdGh8fHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCE9dC5oZWlnaHQpKXt0aGlzLmltYWdlQ2FudmFzXy53aWR0aD10LndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodD10LmhlaWdodDtjb25zdCBuPSJoaWdoIixzPXtyZXNpemVXaWR0aDp0LndpZHRoLHJlc2l6ZUhlaWdodDp0LmhlaWdodCxyZXNpemVRdWFsaXR5Om59LG89Y3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5pbWFnZUJsb2JfLHMpLnRoZW4oYT0+e3RoaXMuaW1hZ2VDdHhfLmRyYXdJbWFnZShhLDAsMCl9KS5jYXRjaChhPT57Y29uc29sZS5lcnJvcigiZXJyb3IgY3JlYXRlSW1hZ2VCaXRtYXAiLGEpfSl9ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZHJhd0ltYWdlKHRoaXMuaW1hZ2VDYW52YXNfLDAsMCx0aGlzLmltYWdlQ2FudmFzXy53aWR0aCx0aGlzLmltYWdlQ2FudmFzXy5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlydHVhbFBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgZm57Y29uc3RydWN0b3IoZT0xLzApe3RoaXMuY2FwYWNpdHk9ZSx0aGlzLnN0b3JhZ2U9W119ZW5xdWV1ZShlKXtpZih0aGlzLnNpemUoKT09PXRoaXMuY2FwYWNpdHkpdGhyb3cgRXJyb3IoIlF1ZXVlIGhhcyByZWFjaGVkIG1heCBjYXBhY2l0eSwgeW91IGNhbm5vdCBhZGQgbW9yZSBpdGVtcyIpO3RoaXMuc3RvcmFnZS5wdXNoKGUpfWRlcXVldWUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLnNoaWZ0KCl9c2l6ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2UubGVuZ3RofX1jbGFzcyBsbntjb25zdHJ1Y3RvcihlKXtjb25zb2xlLmxvZygiW1ZpZGVvUG9zdFByb2Nlc3NdIEN0b3IiKSx0aGlzLnF1ZXVlXz1uZXcgZm4sZSYmKHRoaXMuZnJhbWVSZWFkZXJfPWUuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXByb2Nlc3NGcmFtZShlKXtlLmRvbmV8fCh0aGlzLnF1ZXVlXy5lbnF1ZXVlKGUudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHRoaXMucHJvY2Vzc0ZyYW1lLmJpbmQodGhpcykpLmNhdGNoKHQ9PmNvbnNvbGUuZXJyb3IodCkpKX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtpZihlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IG49dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UuZHJhd0ltYWdlKG4sMCwwLHQud2lkdGgsdC5oZWlnaHQpLG4uY2xvc2UoKX1lbHNlIGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWZ1bmN0aW9uIGNuKCl7cmV0dXJuInNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIn12YXIgeWU9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZSE9InVuZGVmaW5lZCI/ZTp7fSxuLHM7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihpLGwpe249aSxzPWx9KTt2YXIgbz17fSxhO2ZvcihhIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShhKSYmKG9bYV09dFthXSk7dmFyIHU9Ii4vdGhpcy5wcm9ncmFtIixjPWZ1bmN0aW9uKGksbCl7dGhyb3cgbH0sbT0hMCxmPSIiO2Z1bmN0aW9uIGQoaSl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoaSxmKTpmK2l9dmFyIFI7dHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGY9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihmPXIpLGYuaW5kZXhPZigiYmxvYjoiKSE9PTA/Zj1mLnN1YnN0cigwLGYucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpmPSIiO3ZhciB2PXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksTT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IoYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJih0W2FdPW9bYV0pO289bnVsbCx0LmFyZ3VtZW50cyx0LnRoaXNQcm9ncmFtJiYodT10LnRoaXNQcm9ncmFtKSx0LnF1aXQmJihjPXQucXVpdCk7dmFyIEE7dC53YXNtQmluYXJ5JiYoQT10Lndhc21CaW5hcnkpO3ZhciBUPXQubm9FeGl0UnVudGltZXx8ITA7dHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmSCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBPLEk9ITEsdmU9dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gWChpLGwsaCl7Zm9yKHZhciBnPWwraCx5PWw7aVt5XSYmISh5Pj1nKTspKyt5O2lmKHktbD4xNiYmaS5zdWJhcnJheSYmdmUpcmV0dXJuIHZlLmRlY29kZShpLnN1YmFycmF5KGwseSkpO2Zvcih2YXIgRT0iIjtsPHk7KXt2YXIgXz1pW2wrK107aWYoIShfJjEyOCkpe0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoXyk7Y29udGludWV9dmFyIEM9aVtsKytdJjYzO2lmKChfJjIyNCk9PTE5Mil7RSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoXyYzMSk8PDZ8Qyk7Y29udGludWV9dmFyIFU9aVtsKytdJjYzO2lmKChfJjI0MCk9PTIyND9fPShfJjE1KTw8MTJ8Qzw8NnxVOl89KF8mNyk8PDE4fEM8PDEyfFU8PDZ8aVtsKytdJjYzLF88NjU1MzYpRSs9U3RyaW5nLmZyb21DaGFyQ29kZShfKTtlbHNle3ZhciBrdD1fLTY1NTM2O0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8a3Q+PjEwLDU2MzIwfGt0JjEwMjMpfX1yZXR1cm4gRX1mdW5jdGlvbiB3ZShpLGwpe3JldHVybiBpP1goZWUsaSxsKToiIn1mdW5jdGlvbiBfbihpLGwsaCl7Zm9yKHZhciBnPTA7ZzxpLmxlbmd0aDsrK2cpYmVbbCsrPj4wXT1pLmNoYXJDb2RlQXQoZyk7aHx8KGJlW2w+PjBdPTApfWZ1bmN0aW9uIHluKGksbCl7cmV0dXJuIGklbD4wJiYoaSs9bC1pJWwpLGl9dmFyIE90LGJlLGVlLHg7ZnVuY3Rpb24gU3QoaSl7T3Q9aSx0LkhFQVA4PWJlPW5ldyBJbnQ4QXJyYXkoaSksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkoaSksdC5IRUFQMzI9eD1uZXcgSW50MzJBcnJheShpKSx0LkhFQVBVOD1lZT1uZXcgVWludDhBcnJheShpKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGkpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkoaSksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoaSksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoaSl9dC5JTklUSUFMX01FTU9SWTt2YXIgemUsTXQ9W10sQXQ9W10sSXQ9W10sdm49MDtmdW5jdGlvbiB3bigpe3JldHVybiBUfHx2bj4wfWZ1bmN0aW9uIGJuKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspQ24odC5wcmVSdW4uc2hpZnQoKSk7SmUoTXQpfWZ1bmN0aW9uIEVuKCl7SmUoQXQpfWZ1bmN0aW9uIFRuKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOylQbih0LnBvc3RSdW4uc2hpZnQoKSk7SmUoSXQpfWZ1bmN0aW9uIENuKGkpe010LnVuc2hpZnQoaSl9ZnVuY3Rpb24gUm4oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBQbihpKXtJdC51bnNoaWZ0KGkpfXZhciBqPTAsdGU9bnVsbDtmdW5jdGlvbiBPbihpKXtqKyssdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoail9ZnVuY3Rpb24gU24oaSl7aWYoai0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGopLGo9PTAmJnRlKXt2YXIgbD10ZTt0ZT1udWxsLGwoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gSChpKXt0Lm9uQWJvcnQmJnQub25BYm9ydChpKSxpPSJBYm9ydGVkKCIraSsiKSIsTShpKSxJPSEwLGkrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgbD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGkpO3Rocm93IHMobCksbH12YXIgTW49ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIHh0KGkpe3JldHVybiBpLnN0YXJ0c1dpdGgoTW4pfXZhciBGO0Y9InRmbGl0ZS1zaW1kLndhc20iLHh0KEYpfHwoRj1kKEYpKTtmdW5jdGlvbiBGdChpKXt0cnl7aWYoaT09RiYmQSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQSk7aWYoIVIpdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKGwpe0gobCl9fWZ1bmN0aW9uIEFuKCl7cmV0dXJuIUEmJm0mJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihpKXtpZighaS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK0YrIiciO3JldHVybiBpLmFycmF5QnVmZmVyKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBGdChGKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRnQoRil9KX1mdW5jdGlvbiBJbigpe3ZhciBpPXthOllufTtmdW5jdGlvbiBsKF8sQyl7dmFyIFU9Xy5leHBvcnRzO3QuYXNtPVUsTz10LmFzbS5xLFN0KE8uYnVmZmVyKSx6ZT10LmFzbS5ELFJuKHQuYXNtLnIpLFNuKCl9T24oKTtmdW5jdGlvbiBoKF8pe2woXy5pbnN0YW5jZSl9ZnVuY3Rpb24gZyhfKXtyZXR1cm4gQW4oKS50aGVuKGZ1bmN0aW9uKEMpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShDLGkpfSkudGhlbihmdW5jdGlvbihDKXtyZXR1cm4gQ30pLnRoZW4oXyxmdW5jdGlvbihDKXtNKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK0MpLEgoQyl9KX1mdW5jdGlvbiB5KCl7cmV0dXJuIUEmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09ImZ1bmN0aW9uIiYmIXh0KEYpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goRix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oXyl7dmFyIEM9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoXyxpKTtyZXR1cm4gQy50aGVuKGgsZnVuY3Rpb24oVSl7cmV0dXJuIE0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK1UpLE0oImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksZyhoKX0pfSk6ZyhoKX1pZih0Lmluc3RhbnRpYXRlV2FzbSl0cnl7dmFyIEU9dC5pbnN0YW50aWF0ZVdhc20oaSxsKTtyZXR1cm4gRX1jYXRjaChfKXtyZXR1cm4gTSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitfKSwhMX1yZXR1cm4geSgpLmNhdGNoKHMpLHt9fWZ1bmN0aW9uIEplKGkpe2Zvcig7aS5sZW5ndGg+MDspe3ZhciBsPWkuc2hpZnQoKTtpZih0eXBlb2YgbD09ImZ1bmN0aW9uIil7bCh0KTtjb250aW51ZX12YXIgaD1sLmZ1bmM7dHlwZW9mIGg9PSJudW1iZXIiP2wuYXJnPT09dm9pZCAwP3plLmdldChoKSgpOnplLmdldChoKShsLmFyZyk6aChsLmFyZz09PXZvaWQgMD9udWxsOmwuYXJnKX19ZnVuY3Rpb24geG4oaSxsLGgsZyl7SCgiQXNzZXJ0aW9uIGZhaWxlZDogIit3ZShpKSsiLCBhdDogIitbbD93ZShsKToidW5rbm93biBmaWxlbmFtZSIsaCxnP3dlKGcpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIEZuKGksbCl7SCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gTG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBrbigpe0goIiIpfXZhciBFZTtFZT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIERuPSEwO2Z1bmN0aW9uIFVuKGkpe3JldHVybiB4W0x0KCk+PjJdPWksaX1mdW5jdGlvbiBCbihpLGwpe3ZhciBoO2lmKGk9PT0wKWg9RGF0ZS5ub3coKTtlbHNlIGlmKChpPT09MXx8aT09PTQpJiZEbiloPUVlKCk7ZWxzZSByZXR1cm4gVW4oMjgpLC0xO3JldHVybiB4W2w+PjJdPWgvMWUzfDAseFtsKzQ+PjJdPWglMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIE5uKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSG4oaSxsLGgpe2VlLmNvcHlXaXRoaW4oaSxsLGwraCl9ZnVuY3Rpb24gJG4oaSl7dHJ5e3JldHVybiBPLmdyb3coaS1PdC5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLFN0KE8uYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gV24oaSl7dmFyIGw9ZWUubGVuZ3RoO2k9aT4+PjA7dmFyIGg9MjE0NzQ4MzY0ODtpZihpPmgpcmV0dXJuITE7Zm9yKHZhciBnPTE7Zzw9NDtnKj0yKXt2YXIgeT1sKigxKy4yL2cpO3k9TWF0aC5taW4oeSxpKzEwMDY2MzI5Nik7dmFyIEU9TWF0aC5taW4oaCx5bihNYXRoLm1heChpLHkpLDY1NTM2KSksXz0kbihFKTtpZihfKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGpuKGkpe2Zvcih2YXIgbD1FZSgpO0VlKCktbDxpOyk7fXZhciBHZT17fTtmdW5jdGlvbiBxbigpe3JldHVybiB1fHwiLi90aGlzLnByb2dyYW0ifWZ1bmN0aW9uIHJlKCl7aWYoIXJlLnN0cmluZ3Mpe3ZhciBpPSh0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLGw9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzppLF86cW4oKX07Zm9yKHZhciBoIGluIEdlKUdlW2hdPT09dm9pZCAwP2RlbGV0ZSBsW2hdOmxbaF09R2VbaF07dmFyIGc9W107Zm9yKHZhciBoIGluIGwpZy5wdXNoKGgrIj0iK2xbaF0pO3JlLnN0cmluZ3M9Z31yZXR1cm4gcmUuc3RyaW5nc312YXIgVGU9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihpLGwpe3ZhciBoPVRlLmJ1ZmZlcnNbaV07bD09PTB8fGw9PT0xMD8oKGk9PT0xP3Y6TSkoWChoLDApKSxoLmxlbmd0aD0wKTpoLnB1c2gobCl9LHZhcmFyZ3M6dm9pZCAwLGdldDpmdW5jdGlvbigpe1RlLnZhcmFyZ3MrPTQ7dmFyIGk9eFtUZS52YXJhcmdzLTQ+PjJdO3JldHVybiBpfSxnZXRTdHI6ZnVuY3Rpb24oaSl7dmFyIGw9d2UoaSk7cmV0dXJuIGx9LGdldDY0OmZ1bmN0aW9uKGksbCl7cmV0dXJuIGl9fTtmdW5jdGlvbiBWbihpLGwpe3ZhciBoPTA7cmV0dXJuIHJlKCkuZm9yRWFjaChmdW5jdGlvbihnLHkpe3ZhciBFPWwraDt4W2kreSo0Pj4yXT1FLF9uKGcsRSksaCs9Zy5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gem4oaSxsKXt2YXIgaD1yZSgpO3hbaT4+Ml09aC5sZW5ndGg7dmFyIGc9MDtyZXR1cm4gaC5mb3JFYWNoKGZ1bmN0aW9uKHkpe2crPXkubGVuZ3RoKzF9KSx4W2w+PjJdPWcsMH1mdW5jdGlvbiBKbihpKXtlcyhpKX1mdW5jdGlvbiBHbihpKXtyZXR1cm4gMH1mdW5jdGlvbiBRbihpLGwsaCxnLHkpe31mdW5jdGlvbiBYbihpLGwsaCxnKXtmb3IodmFyIHk9MCxFPTA7RTxoO0UrKyl7Zm9yKHZhciBfPXhbbCtFKjg+PjJdLEM9eFtsKyhFKjgrNCk+PjJdLFU9MDtVPEM7VSsrKVRlLnByaW50Q2hhcihpLGVlW18rVV0pO3krPUN9cmV0dXJuIHhbZz4+Ml09eSwwfWZ1bmN0aW9uIEtuKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgaT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpKSxpWzBdfX1lbHNlIHJldHVybiBmdW5jdGlvbigpe0goInJhbmRvbURldmljZSIpfX1mdW5jdGlvbiBDZShpLGwpe0NlLnJhbmRvbURldmljZXx8KENlLnJhbmRvbURldmljZT1LbigpKTtmb3IodmFyIGg9MDtoPGw7aCsrKWJlW2kraD4+MF09Q2UucmFuZG9tRGV2aWNlKCk7cmV0dXJuIDB9dmFyIFluPXthOnhuLGU6Rm4sZDpMbixiOmtuLG46Qm4saDpObixsOkhuLG06V24scDpqbixmOlZuLGc6em4sajpKbixpOkduLGs6UW4sYzpYbixvOkNlfTtJbigpLHQuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX19fd2FzbV9jYWxsX2N0b3JzPXQuYXNtLnIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9dC5hc20ucykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD10LmFzbS50KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0SGVpZ2h0PXQuYXNtLnUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dFdpZHRoPXQuYXNtLnYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9dC5hc20udykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PXQuYXNtLngpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dEhlaWdodD10LmFzbS55KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dFdpZHRoPXQuYXNtLnopLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dENoYW5uZWxDb3VudD10LmFzbS5BKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2xvYWRNb2RlbD1mdW5jdGlvbigpe3JldHVybih0Ll9sb2FkTW9kZWw9dC5hc20uQikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9ydW5JbmZlcmVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4odC5fcnVuSW5mZXJlbmNlPXQuYXNtLkMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEx0PXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oTHQ9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5FKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJlO2Z1bmN0aW9uIFpuKGkpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIraSsiKSIsdGhpcy5zdGF0dXM9aX10ZT1mdW5jdGlvbiBpKCl7UmV8fFFlKCksUmV8fCh0ZT1pKX07ZnVuY3Rpb24gUWUoaSl7aWYoaj4wfHwoYm4oKSxqPjApKXJldHVybjtmdW5jdGlvbiBsKCl7UmV8fChSZT0hMCx0LmNhbGxlZFJ1bj0hMCwhSSYmKEVuKCksbih0KSx0Lm9uUnVudGltZUluaXRpYWxpemVkJiZ0Lm9uUnVudGltZUluaXRpYWxpemVkKCksVG4oKSkpfXQuc2V0U3RhdHVzPyh0LnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZXRTdGF0dXMoIiIpfSwxKSxsKCl9LDEpKTpsKCl9dC5ydW49UWU7ZnVuY3Rpb24gZXMoaSxsKXt0cyhpKX1mdW5jdGlvbiB0cyhpKXt3bigpfHwodC5vbkV4aXQmJnQub25FeGl0KGkpLEk9ITApLGMoaSxuZXcgWm4oaSkpfWlmKHQucHJlSW5pdClmb3IodHlwZW9mIHQucHJlSW5pdD09ImZ1bmN0aW9uIiYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7dC5wcmVJbml0Lmxlbmd0aD4wOyl0LnByZUluaXQucG9wKCkoKTtyZXR1cm4gUWUoKSxlLnJlYWR5fX0oKTt0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiP21vZHVsZS5leHBvcnRzPXllOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHllfSk6dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiYoZXhwb3J0cy5jcmVhdGVWb25hZ2VURkxpdGVTaW1kTW9kdWxlPXllKTtjbGFzcyBobntjb25zdHJ1Y3Rvcigpe3RoaXMuaXNTSU1EU3VwcG9ydGVkXz0hMSx0aGlzLmlzVGhyZWFkc1N1cHBvcnRlZF89ITEsdGhpcy5pbnB1dFdpZHRoXz0wLHRoaXMuaW5wdXRIZWlnaHRfPTAsdGhpcy5pbnB1dENoYW5uZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0V2lkdGhfPTAsdGhpcy5vdXRwdXRIZWlnaHRfPTAsdGhpcy5vdXRwdXRDaGFubmVsQ291bnRfPTAsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPTB9fWFzeW5jIGZ1bmN0aW9uIGRuKHIsZSl7bGV0IHQ9bmV3IGhuO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsbyl7YXN5bmMgZnVuY3Rpb24gYSgpe3JldHVybiB5ZSh7bG9jYXRlRmlsZTpmdW5jdGlvbihtKXtyZXR1cm4gcittfX0pfWFzeW5jIGZ1bmN0aW9uIHUoYyl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKG0sZik9Pntjb25zdCBkPWM7aWYodHlwZW9mIGQ9PSJ1bmRlZmluZWQiKXJldHVybiBmKCJURkxpdGUgYmFja2VuZCB1bmF2YWlsYWJsZTogd2FzbVNpbWQiKTtjb25zdCBSPWNuKCk7Y29uc29sZS5sb2coIkxvYWRpbmcgdGZsaXRlIG1vZGVsOiIsUik7bGV0IHY9ZStgJHtSfS50ZmxpdGVgO2NvbnNvbGUubG9nKCJURkxpdGUgbW9kZWxVcmw6ICIrdik7dHJ5e2NvbnN0IEE9YXdhaXQoYXdhaXQgZmV0Y2godikpLmFycmF5QnVmZmVyKCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBzaXplOiIsQS5ieXRlTGVuZ3RoKTtjb25zdCBUPWQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBtZW1vcnkgb2Zmc2V0OiIsVCksY29uc29sZS5sb2coIkxvYWRpbmcgbW9kZWwgYnVmZmVyLi4uIiksZC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KEEpLFQpO2NvbnN0IE89ZC5fbG9hZE1vZGVsKEEuYnl0ZUxlbmd0aCk7aWYoY29uc29sZS5sb2coIkxvYWQgbW9kZWwgcmVzdWx0OiIsTyksTyE9PTApe2YoIkNhbm5vdCBsb2FkIG1vZGVsIik7cmV0dXJufXQuaW5wdXRXaWR0aF89ZC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHRfPWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudF89ZC5fZ2V0SW5wdXRDaGFubmVsQ291bnQoKSx0LmlucHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0XyksY29uc29sZS5sb2coIklucHV0IHdpZHRoOiIsdC5pbnB1dFdpZHRoXyksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudF8pLHQub3V0cHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSx0Lm91dHB1dFdpZHRoXz1kLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0Xz1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudF89ZC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCksY29uc29sZS5sb2coIk91dHB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5vdXRwdXRNZW1vcnlPZmZzZXRfKSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0XyksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGhfKSxjb25zb2xlLmxvZygiT3V0cHV0IGNoYW5uZWxzOiIsdC5vdXRwdXRDaGFubmVsQ291bnRfKSx0LnNlbGVjdGVkVEZMaXRlXz1kfWNhdGNoKE0pe2YoTSk7cmV0dXJufW0oKX0pfWEoKS50aGVuKGM9PntpZihjPT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjt1KGMpLnRoZW4obT0+e3ModCl9KS5jYXRjaChtPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKGM9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsYyksbygibG9hZFRGTGl0ZSBlcnJvcjoiK2MpfSl9KTtyZXR1cm4gbn1jbGFzcyBwbntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNvbnN0IFE9Y2xhc3N7Y29uc3RydWN0b3Iocil7aWYodGhpcy5jb25maWdfPXIsdGhpcy5mcmFtZUNvdW50ZXJfPTAsdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz0wLHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF89dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPTAsdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MCxyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCI/KHRoaXMudGltZXJHYXBfPVEuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHVuKHIuYmFja2dyb3VuZEFzc2V0VXJpKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iQmFja2dyb3VuZEJsdXIiPyh0aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBQdChyLnJhZGl1cykpOnIudHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCI/dGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORDpyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHBuKHIucmFkaXVzKSk6KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IFB0KX1pbml0KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnthd2FpdCBkbih0aGlzLmNvbmZpZ18ud2FzbUFzc2V0VXJpUGF0aCx0aGlzLmNvbmZpZ18udGZsaXRlQXNzZXRVcmlQYXRoKS50aGVuKHQ9Pnt0JiYodGhpcy52b2FuZ2VURkxpdGVJbmZvXz10LHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18ud2lkdGg9dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8qdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8sdGhpcy5zZWdtZW50YXRpb25NYXNrXz1uZXcgSW1hZ2VEYXRhKHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRNZW1vcnlPZmZzZXRfLzQsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18ub3V0cHV0TWVtb3J5T2Zmc2V0Xy80LHIoKSl9KS5jYXRjaCh0PT57Y29uc29sZS5sb2coImVycm9yIHVzZVRGTGl0ZToiLHQpLGUodCl9KX0pfWFzeW5jIHN0YXJ0KCl7aWYodHlwZW9mIHRoaXMudm9hbmdlVEZMaXRlSW5mb189PSJ1bmRlZmluZWQiKXRocm93InRyYW5zZm9ybWVyIG5vdCBpbml0In1hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCksKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCE9ci5kaXNwbGF5V2lkdGh8fHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQhPXIuZGlzcGxheUhlaWdodCkmJih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGg9ci5kaXNwbGF5V2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodD1yLmRpc3BsYXlIZWlnaHQpO2NvbnN0IHQ9ci50aW1lc3RhbXA7Y3JlYXRlSW1hZ2VCaXRtYXAocikudGhlbihuPT57ci5jbG9zZSgpLHRoaXMucHJvY2Vzc0ZyYW1lKGUsbix0KX0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJjcmVhdGVJbWFnZUJpdG1hcCIsbiksZS5lbnF1ZXVlKHIpfSl9cHJvY2Vzc0ZyYW1lKHIsZSx0KXt0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfJiYodGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz10LHRoaXMucHJvY2Vzc1NvdXJjZShlKSksdGhpcy5yZXN1bHRDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18sMCwwLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0KSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHIuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSh0aGlzLnJlc3VsdENhbnZhc18se3RpbWVzdGFtcDp0LGFscGhhOiJkaXNjYXJkIn0pKSx0aGlzLmZyYW1lQ291bnRlcl8rK31wcm9jZXNzU291cmNlKHIpe3RoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmdldEltYWdlRGF0YSgwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyk7Zm9yKGxldCB0PTA7dDx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfO3QrKyl0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLnNlbGVjdGVkVEZMaXRlXy5IRUFQRjMyW3RoaXMuaW5wdXRNZW1vcnlPZmZzZXRfK3QqM109ZS5kYXRhW3QqNF0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzFdPWUuZGF0YVt0KjQrMV0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzJdPWUuZGF0YVt0KjQrMl0vMjU1O3RoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLl9ydW5JbmZlcmVuY2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXtjb25zdCBuPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfK3RdO3RoaXMuc2VnbWVudGF0aW9uTWFza18uZGF0YVt0KjQrM109MjU1Km59dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5wdXRJbWFnZURhdGEodGhpcy5zZWdtZW50YXRpb25NYXNrXywwLDApLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXywwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpfWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXNldFZpZGVvQkdSZWFkYWJsZShyKXt0aGlzLmNvbmZpZ18udHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCImJih0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgbG4ocikpfX07bGV0IHFlPVE7cWUuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MmU1LHFlLlZJUlRVQUxfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EPTE1ZTQ7ZnVuY3Rpb24gbW4ocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIGduKHIpe2lmKG1uKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFZlKHIpe3JldHVybiB0eXBlb2Ygcj09InVuZGVmaW5lZCI/IiI6Z24ocikubWVzc2FnZX1pZih0eXBlb2YgaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIil7bGV0IHI9bmV3IGFuO3Iub24oImVycm9yIixlPT57Y29uc3QgdD17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksci5vbigid2FybiIsZT0+e2NvbnN0IHQ9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksb25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdHtvcGVyYXRpb246dH09ZS5kYXRhO2lmKGNvbnNvbGUubG9nKCJvcGVyYXRpb249Iix0KSx0PT09InRyYW5zZm9ybSIpe2NvbnN0e3JlYWRhYmxlOm4sd3JpdGFibGU6cyxjb25maWc6byx2aWRlb0JHUmVhZGFibGU6YX09ZS5kYXRhO2xldCB1PVtdO2NvbnN0IGM9bmV3IHFlKEpTT04ucGFyc2UobykpO2Muc2V0VmlkZW9CR1JlYWRhYmxlKGEpLGMuaW5pdCgpLnRoZW4oKCk9Pnt1LnB1c2goYyksci5zZXRUcmFuc2Zvcm1lcnModSkudGhlbigoKT0+e3IudHJhbnNmb3JtKG4scykudGhlbigoKT0+e2NvbnN0IG09e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobSkpfSkuY2F0Y2gobT0+e2NvbnN0IGY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUobSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGYpKX0pfSl9KS5jYXRjaChtPT57Y29uc3QgZj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShtKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZikpfSl9ZWxzZSB0PT09ImRlc3Ryb3kiP3IuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBuPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShuKSl9KS5jYXRjaChuPT57Y29uc3Qgcz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShuKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkocykpfSk6dD09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJnIuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZS5kYXRhLnJhdGUpfX19KSgpOwo=";
1501
+ const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LFV0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIEJ0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBOdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBIdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uICR0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gV3Qocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBqdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHF0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gVnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiB6dChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24gSnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEd0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gUXQoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBYdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPVV0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBLdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpCdCxpc0Zvcm1EYXRhOk50LGlzQXJyYXlCdWZmZXJWaWV3Okh0LGlzU3RyaW5nOiR0LGlzTnVtYmVyOld0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOmp0LGlzRmlsZTpxdCxpc0Jsb2I6VnQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTp6dCxpc1VSTFNlYXJjaFBhcmFtczpKdCxpc1N0YW5kYXJkQnJvd3NlckVudjpRdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpYdCx0cmltOkd0LHN0cmlwQk9NOkt0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLF8pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/Xz1fKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChfKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sWXQ9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtZdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFp0PXNlLGVyPVAsdHI9ZnVuY3Rpb24oZSx0KXtlci5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0scnI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHJyKGEsdCxuLHMsbyl9LG5yPW50LHNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQobnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsaXI9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksb3I9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sYXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sdXI9b3IsZnI9YXIsbHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIXVyKHQpP2ZyKGUsdCk6dH0sSWU9UCxjcj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGhyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZjci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxkcj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxwcj1zcixtcj1pcixncj10dCxfcj1scix5cj1ocix2cj1kcixGZT1udCx3cj1mZSxicj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIF8oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsdj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK3YpfXZhciB3PV9yKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksZ3IodyxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBDPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj95cihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6Qyxjb25maWc6ZSxyZXF1ZXN0OmZ9O3ByKGZ1bmN0aW9uKFgpe24oWCksXygpfSxmdW5jdGlvbihYKXtzKFgpLF8oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8d3IudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx2cih3KSkmJmUueHNyZkNvb2tpZU5hbWU/bXIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKEMpeyFmfHwocyghQ3x8QyYmQy50eXBlP25ldyBicigiY2FuY2VsZWQiKTpDKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sYj1QLG90PXRyLEVyPXJ0LFRyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshYi5pc1VuZGVmaW5lZChyKSYmYi5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBDcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIFJyKHIsZSx0KXtpZihiLmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksYi50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOkNyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksYi5pc0Zvcm1EYXRhKGUpfHxiLmlzQXJyYXlCdWZmZXIoZSl8fGIuaXNCdWZmZXIoZSl8fGIuaXNTdHJlYW0oZSl8fGIuaXNGaWxlKGUpfHxiLmlzQmxvYihlKT9lOmIuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6Yi5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOmIuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksUnIoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJmIuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/RXIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2IuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksYi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT1iLm1lcmdlKFRyKX0pO3ZhciBmZT11ZSxQcj1QLE9yPWZlLFNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxPcjtyZXR1cm4gUHIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9U3IsTXI9dXQsQXI9ZmUsSXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IElyKCJjYW5jZWxlZCIpfXZhciB4cj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fEFyLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBNcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBfPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgdj1fW2RdfHxvLHc9dihkKTtTLmlzVW5kZWZpbmVkKHcpJiZ2IT09Y3x8KG5bZF09dyl9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0sRnI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2IitGcisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIExyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBrcj17YXNzZXJ0T3B0aW9uczpMcix2YWxpZGF0b3JzOkRlfSxkdD1QLERyPXR0LHB0PVp0LG10PXhyLGxlPWx0LGd0PWtyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3R5cGVvZiB3LnJ1bldoZW49PSJmdW5jdGlvbiImJncucnVuV2hlbih0KT09PSExfHwobz1vJiZ3LnN5bmNocm9ub3VzLHMudW5zaGlmdCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2EucHVzaCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIF89dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7Xz1mKF8pfWNhdGNoKHYpe2Qodik7YnJlYWt9fXRyeXt1PW10KF8pfWNhdGNoKHYpe3JldHVybiBQcm9taXNlLnJlamVjdCh2KX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxEcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBVcj1LLEJyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBCcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgTnI9eixIcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LCRyPVAsV3I9ZnVuY3Rpb24oZSl7cmV0dXJuICRyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLGpyPVhlLGNlPVVyLHFyPWx0LFZyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PWpyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KHFyKHIscykpfSx0fXZhciBMPXl0KFZyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49TnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPUhyLEwuaXNBeGlvc0Vycm9yPVdyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgenI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgSnI9IjEuMS4zIjtsZXQgYnQ7ZnVuY3Rpb24gR3Iocil7YnQ9cn1mdW5jdGlvbiBRcigpe3JldHVybiBidH1jbGFzcyBre2NvbnN0cnVjdG9yKCl7Y29uc3QgZT1RcigpO3RoaXMuX3JlcG9ydD17YWN0aW9uOnAuZW1wdHkoKSxhcHBsaWNhdGlvbklkOnAub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UuYXBwSWQ6bnVsbCksdGltZXN0YW1wOkRhdGUubm93KCksZnBzOnAuZW1wdHkoKSxmcmFtZXNUcmFuc2Zvcm1lZDpwLmVtcHR5KCksZ3VpZDpwLmVtcHR5KCksaGlnaGVzdEZyYW1lVHJhbnNmb3JtQ3B1OnAuZW1wdHkoKSxtZXNzYWdlOnAuZW1wdHkoKSxzb3VyY2U6cC5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5zb3VyY2VUeXBlOm51bGwpLHRyYW5zZm9ybWVkRnBzOnAuZW1wdHkoKSx0cmFuc2Zvcm1lclR5cGU6cC5lbXB0eSgpLHZhcmlhdGlvbjpwLmVtcHR5KCksdmlkZW9IZWlnaHQ6cC5lbXB0eSgpLHZpZGVvV2lkdGg6cC5lbXB0eSgpLHZlcnNpb246SnIsZXJyb3I6cC5lbXB0eSgpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1wLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1wLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1wLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IFhyPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIER7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IHM9enIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fTtjb25zdCBhPSJodHRwczovL2hsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIjtzLnBvc3QoYSxYcihlKSxvKS50aGVuKHU9Pntjb25zb2xlLmxvZyh1KSx0KCJzdWNjZXNzIil9KS5jYXRjaCh1PT57Y29uc29sZS5sb2codSksbih1KX0pfSl9fXZhciBoZSxLcj1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gWXIoKXtpZighaGUmJihoZT10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhaGUpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gaGUoS3IpfXZhciBacj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gZW4ocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmWnIudGVzdChyKX1mb3IodmFyIEU9W10sVWU9MDtVZTwyNTY7KytVZSlFLnB1c2goKFVlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gdG4ocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oRVtyW2UrMF1dK0VbcltlKzFdXStFW3JbZSsyXV0rRVtyW2UrM11dKyItIitFW3JbZSs0XV0rRVtyW2UrNV1dKyItIitFW3JbZSs2XV0rRVtyW2UrN11dKyItIitFW3JbZSs4XV0rRVtyW2UrOV1dKyItIitFW3JbZSsxMF1dK0VbcltlKzExXV0rRVtyW2UrMTJdXStFW3JbZSsxM11dK0VbcltlKzE0XV0rRVtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighZW4odCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBFdChyLGUsdCl7cj1yfHx7fTt2YXIgbj1yLnJhbmRvbXx8KHIucm5nfHxZcikoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBzPTA7czwxNjsrK3MpZVt0K3NdPW5bc107cmV0dXJuIGV9cmV0dXJuIHRuKG4pfWNvbnN0IE49bmV3IFdlYWtNYXAsZGU9bmV3IFdlYWtNYXAsWT1uZXcgV2Vha01hcCxCZT1TeW1ib2woImFueVByb2R1Y2VyIiksVHQ9UHJvbWlzZS5yZXNvbHZlKCkscGU9U3ltYm9sKCJsaXN0ZW5lckFkZGVkIiksbWU9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgTmU9ITE7ZnVuY3Rpb24gSihyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIGdlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEcocixlKXtjb25zdCB0PWRlLmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gWihyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCI/ZTpCZSxuPVkuZ2V0KHIpO3JldHVybiBuLmhhcyh0KXx8bi5zZXQodCxuZXcgU2V0KSxuLmdldCh0KX1mdW5jdGlvbiBybihyLGUsdCl7Y29uc3Qgbj1ZLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgcyBvZiBuLmdldChlKSlzLmVucXVldWUodCk7aWYobi5oYXMoQmUpKXtjb25zdCBzPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChCZSkpby5lbnF1ZXVlKHMpfX1mdW5jdGlvbiBDdChyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxzPVtdO2NvbnN0IG89e2VucXVldWUoYSl7cy5wdXNoKGEpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgYSBvZiBlKVoocixhKS5hZGQobyk7cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gcz9zLmxlbmd0aD09PTA/dD8ocz12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShhPT57bj1hfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IHMuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4oYSl7cz12b2lkIDA7Zm9yKGNvbnN0IHUgb2YgZSlaKHIsdSkuZGVsZXRlKG8pO3JldHVybiBuKCksYXJndW1lbnRzLmxlbmd0aD4wP3tkb25lOiEwLHZhbHVlOmF3YWl0IGF9Ontkb25lOiEwfX0sW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19ZnVuY3Rpb24gUnQocil7aWYocj09PXZvaWQgMClyZXR1cm4gUHQ7aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MiKTtmb3IoY29uc3QgZSBvZiByKWlmKCFQdC5pbmNsdWRlcyhlKSl0aHJvdyB0eXBlb2YgZSE9InN0cmluZyI/bmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBlbGVtZW50IG11c3QgYmUgYSBzdHJpbmciKTpuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IEVtaXR0ZXJ5IG1ldGhvZGApO3JldHVybiByfWNvbnN0IEhlPXI9PnI9PT1wZXx8cj09PW1lO2NsYXNzIFd7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9UnQodCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgYSBvZiB0KWlmKG4ucHJvdG90eXBlW2FdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHthfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBzKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IFd9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpzfSk7Y29uc3Qgbz1hPT5mdW5jdGlvbiguLi51KXtyZXR1cm4gdGhpc1tlXVthXSguLi51KX07Zm9yKGNvbnN0IGEgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsYSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGEpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIE5lO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fE5lfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7TmU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtOLnNldCh0aGlzLG5ldyBTZXQpLGRlLnNldCh0aGlzLG5ldyBNYXApLFkuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixzLG8pPT57bz1KU09OLnN0cmluZ2lmeShvKSx0eXBlb2Ygcz09InN5bWJvbCImJihzPXMudG9TdHJpbmcoKSk7Y29uc3QgYT1uZXcgRGF0ZSx1PWAke2EuZ2V0SG91cnMoKX06JHthLmdldE1pbnV0ZXMoKX06JHthLmdldFNlY29uZHMoKX0uJHthLmdldE1pbGxpc2Vjb25kcygpfWA7Y29uc29sZS5sb2coYFske3V9XVtlbWl0dGVyeToke3R9XVske259XSBFdmVudCBOYW1lOiAke3N9CglkYXRhOiAke299YCl9KX1sb2dJZkRlYnVnRW5hYmxlZChlLHQsbil7KFcuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChwZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5kZWxldGUodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxIZShuKXx8dGhpcy5lbWl0KG1lLHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IG49dGhpcy5vbihlLHM9PntuKCksdChzKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUoodCk7cmV0dXJuIEN0KHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0ooZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSxybih0aGlzLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPUhlKGUpP1tdOlsuLi5zXTthd2FpdCBUdCxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgdT0+e2lmKG4uaGFzKHUpKXJldHVybiB1KHQpfSksLi4uYS5tYXAoYXN5bmMgdT0+e2lmKHMuaGFzKHUpKXJldHVybiB1KGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPVsuLi5zXTthd2FpdCBUdDtmb3IoY29uc3QgdSBvZiBvKW4uaGFzKHUpJiZhd2FpdCB1KHQpO2Zvcihjb25zdCB1IG9mIGEpcy5oYXModSkmJmF3YWl0IHUoZSx0KX1vbkFueShlKXtyZXR1cm4gZ2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxOLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KHBlLHtsaXN0ZW5lcjplfSksdGhpcy5vZmZBbnkuYmluZCh0aGlzLGUpfWFueUV2ZW50KCl7cmV0dXJuIEN0KHRoaXMpfW9mZkFueShlKXtnZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KG1lLHtsaXN0ZW5lcjplfSksTi5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe0codGhpcyx0KS5jbGVhcigpO2NvbnN0IG49Wih0aGlzLHQpO2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9ZWxzZXtOLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBuIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSluLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgWS5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBuIG9mIGUpe2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7dCs9Ti5nZXQodGhpcykuc2l6ZStHKHRoaXMsbikuc2l6ZStaKHRoaXMsbikuc2l6ZStaKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZKKG4pLHQrPU4uZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IHMgb2YgZGUuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPXMuc2l6ZTtmb3IoY29uc3QgcyBvZiBZLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1SdCh0KTtmb3IoY29uc3QgbiBvZiB0KXtpZihlW25dIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtufVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbbl0uYmluZCh0aGlzKX0pfX19Y29uc3QgUHQ9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpwZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTptZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciAkZT1XO2Z1bmN0aW9uIG5uKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiBzbihyKXtpZihubihyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBXZShyKXtyZXR1cm4gc24ocikubWVzc2FnZX12YXIgamU7KGZ1bmN0aW9uKHIpe3IuRlBTX0RST1A9ImZwc19kcm9wIn0pKGplfHwoamU9e30pKTtjb25zdCBvbj01MDAsYW49Ljg7Y2xhc3MgdW4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCk7dGhpcy5pbmRleF89dCx0aGlzLnV1aWRfPUV0KCksdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZwc189MCx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpO2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtELnJlcG9ydChuKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfc3RhcnQpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZSh0KSkuYnVpbGQoKTtELnJlcG9ydChuKTtjb25zdCBzPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjp0LGZ1bmN0aW9uOiJzdGFydCJ9O3RoaXMuZW1pdCgiZXJyb3IiLHMpfX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgbixzLG8sYTtpZih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89PT0wJiYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPURhdGUubm93KCkpLHRoaXMudmlkZW9IZWlnaHRfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/bjowLHRoaXMudmlkZW9XaWR0aF89KHM9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP3M6MCwrK3RoaXMuZnJhbWVzRnJvbVNvdXJjZV8sdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyllLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2UgdHJ5e2F3YWl0KChhPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDphLmNhbGwobyxlLHQpKSwrK3RoaXMuZnJhbWVzVHJhbnNmb3JtZWRfLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPT09b24mJnRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpfWNhdGNoKHUpe2NvbnN0IGM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodSkpLmJ1aWxkKCk7RC5yZXBvcnQoYyk7Y29uc3QgXz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsXyl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2gobil7Y29uc3Qgcz1uZXcgaygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKG4pKS5idWlsZCgpO0QucmVwb3J0KHMpO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOm4sZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Usbj10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qYW4+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6amUuRlBTX0RST1AsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnR9fTt0aGlzLmVtaXQoIndhcm4iLG8pfWNvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5mcHModCkudHJhbnNmb3JtZWRGcHMobikuZnJhbWVzVHJhbnNmb3JtZWQodGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8pLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmlkZW9IZWlnaHQodGhpcy52aWRlb0hlaWdodF8pLnZpZGVvV2lkdGgodGhpcy52aWRlb1dpZHRoXykudmFyaWF0aW9uKCJRb1MiKS5idWlsZCgpO0QucmVwb3J0KHMpLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wfX1jbGFzcyBmbiBleHRlbmRzICRle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1uZXcgdW4oZVt0XSx0KTtuLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksbi5vbigid2FybiIscz0+e3RoaXMuZW1pdCgid2FybiIscyl9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChuKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHQgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXQuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUsdCl7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBuPWU7Zm9yKGxldCBzIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShzKSk7ZS5waXBlVG8odCkudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgdC5hYm9ydCgpLGF3YWl0IG4uY2FuY2VsKCl9KS5jYXRjaChhc3luYyBzPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KHMpLGF3YWl0IG4uY2FuY2VsKHMpfSl9Y2F0Y2h7dGhpcy5kZXN0cm95KCk7cmV0dXJufWNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgbG4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy51dWlkXz1FdCgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO0QucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpfXRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCksdGhpcy5waXBlbGluZV89bmV3IGZuKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG49Pnt0KG4pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiBELnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KSxlKCl9KX19dmFyIF9lOyhmdW5jdGlvbihyKXtyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2gifSkoX2V8fChfZT17fSkpO2NsYXNzIE90e2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgY257Y29uc3RydWN0b3IoZSl7aWYodGhpcy5pbWFnZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuaW1hZ2VDdHhfPXRoaXMuaW1hZ2VDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsd2lsbFJlYWRGcmVxdWVudGx5OiEwLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMuaW1hZ2VDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLmltYWdlQmxvYl89dm9pZCAwLGZldGNoKGUpLnRoZW4odD0+e3QuYmxvYigpLnRoZW4obj0+e3RoaXMuaW1hZ2VCbG9iXz1ufSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImJsb2IgZXJyb3IiLG4pfSl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcigiZmV0Y2ggZXJyb3IiLHQpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7aWYodHlwZW9mIHRoaXMuaW1hZ2VCbG9iXyE9InVuZGVmaW5lZCImJih0aGlzLmltYWdlQ2FudmFzXy53aWR0aCE9dC53aWR0aHx8dGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0IT10LmhlaWdodCkpe3RoaXMuaW1hZ2VDYW52YXNfLndpZHRoPXQud2lkdGgsdGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ImhpZ2giLHM9e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6bn0sbz1jcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmltYWdlQmxvYl8scykudGhlbihhPT57dGhpcy5pbWFnZUN0eF8uZHJhd0ltYWdlKGEsMCwwKX0pLmNhdGNoKGE9Pntjb25zb2xlLmVycm9yKCJlcnJvciBjcmVhdGVJbWFnZUJpdG1hcCIsYSl9KX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5pbWFnZUNhbnZhc18sMCwwLHRoaXMuaW1hZ2VDYW52YXNfLndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaXJ0dWFsUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsbil9fX1jbGFzcyBobntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNsYXNzIGRue2NvbnN0cnVjdG9yKGUpe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gQ3RvciIpLHRoaXMucXVldWVfPW5ldyBobixlJiYodGhpcy5mcmFtZVJlYWRlcl89ZS5nZXRSZWFkZXIoKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbih0aGlzLnByb2Nlc3NGcmFtZS5iaW5kKHRoaXMpKS5jYXRjaCh0PT5jb25zb2xlLmVycm9yKHQpKSl9cHJvY2Vzc0ZyYW1lKGUpe2UuZG9uZXx8KHRoaXMucXVldWVfLmVucXVldWUoZS52YWx1ZSksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3Qgbj10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ZS5kcmF3SW1hZ2UobiwwLDAsdC53aWR0aCx0LmhlaWdodCksbi5jbG9zZSgpfWVsc2UgZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaWRlb1Bvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19ZnVuY3Rpb24gcG4oKXtyZXR1cm4ic2VsZmllX3NlZ21lbnRhdGlvbl9sYW5kc2NhcGUifXZhciB5ZT1mdW5jdGlvbigpe3ZhciByPXR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwO3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXR5cGVvZiBlIT0idW5kZWZpbmVkIj9lOnt9LG4sczt0LnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKGksbCl7bj1pLHM9bH0pO3ZhciBvPXt9LGE7Zm9yKGEgaW4gdCl0Lmhhc093blByb3BlcnR5KGEpJiYob1thXT10W2FdKTt2YXIgdT0iLi90aGlzLnByb2dyYW0iLGM9ZnVuY3Rpb24oaSxsKXt0aHJvdyBsfSxfPSEwLGY9IiI7ZnVuY3Rpb24gZChpKXtyZXR1cm4gdC5sb2NhdGVGaWxlP3QubG9jYXRlRmlsZShpLGYpOmYraX12YXIgdjt0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoZj1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKGY9ciksZi5pbmRleE9mKCJibG9iOiIpIT09MD9mPWYuc3Vic3RyKDAsZi5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOmY9IiI7dmFyIHc9dC5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxNPXQucHJpbnRFcnJ8fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmKHRbYV09b1thXSk7bz1udWxsLHQuYXJndW1lbnRzLHQudGhpc1Byb2dyYW0mJih1PXQudGhpc1Byb2dyYW0pLHQucXVpdCYmKGM9dC5xdWl0KTt2YXIgQTt0Lndhc21CaW5hcnkmJihBPXQud2FzbUJpbmFyeSk7dmFyIEM9dC5ub0V4aXRSdW50aW1lfHwhMDt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZIKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIE8sST0hMSx2ZT10eXBlb2YgVGV4dERlY29kZXIhPSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMDtmdW5jdGlvbiBYKGksbCxoKXtmb3IodmFyIG09bCtoLHk9bDtpW3ldJiYhKHk+PW0pOykrK3k7aWYoeS1sPjE2JiZpLnN1YmFycmF5JiZ2ZSlyZXR1cm4gdmUuZGVjb2RlKGkuc3ViYXJyYXkobCx5KSk7Zm9yKHZhciBUPSIiO2w8eTspe3ZhciBnPWlbbCsrXTtpZighKGcmMTI4KSl7VCs9U3RyaW5nLmZyb21DaGFyQ29kZShnKTtjb250aW51ZX12YXIgUj1pW2wrK10mNjM7aWYoKGcmMjI0KT09MTkyKXtUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChnJjMxKTw8NnxSKTtjb250aW51ZX12YXIgVT1pW2wrK10mNjM7aWYoKGcmMjQwKT09MjI0P2c9KGcmMTUpPDwxMnxSPDw2fFU6Zz0oZyY3KTw8MTh8Ujw8MTJ8VTw8NnxpW2wrK10mNjMsZzw2NTUzNilUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGcpO2Vsc2V7dmFyIER0PWctNjU1MzY7VCs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxEdD4+MTAsNTYzMjB8RHQmMTAyMyl9fXJldHVybiBUfWZ1bmN0aW9uIHdlKGksbCl7cmV0dXJuIGk/WChlZSxpLGwpOiIifWZ1bmN0aW9uIHduKGksbCxoKXtmb3IodmFyIG09MDttPGkubGVuZ3RoOysrbSliZVtsKys+PjBdPWkuY2hhckNvZGVBdChtKTtofHwoYmVbbD4+MF09MCl9ZnVuY3Rpb24gYm4oaSxsKXtyZXR1cm4gaSVsPjAmJihpKz1sLWklbCksaX12YXIgU3QsYmUsZWUseDtmdW5jdGlvbiBNdChpKXtTdD1pLHQuSEVBUDg9YmU9bmV3IEludDhBcnJheShpKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShpKSx0LkhFQVAzMj14PW5ldyBJbnQzMkFycmF5KGkpLHQuSEVBUFU4PWVlPW5ldyBVaW50OEFycmF5KGkpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoaSksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShpKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShpKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShpKX10LklOSVRJQUxfTUVNT1JZO3ZhciB6ZSxBdD1bXSxJdD1bXSx4dD1bXSxFbj0wO2Z1bmN0aW9uIFRuKCl7cmV0dXJuIEN8fEVuPjB9ZnVuY3Rpb24gQ24oKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylPbih0LnByZVJ1bi5zaGlmdCgpKTtKZShBdCl9ZnVuY3Rpb24gUm4oKXtKZShJdCl9ZnVuY3Rpb24gUG4oKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KU1uKHQucG9zdFJ1bi5zaGlmdCgpKTtKZSh4dCl9ZnVuY3Rpb24gT24oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBTbihpKXtJdC51bnNoaWZ0KGkpfWZ1bmN0aW9uIE1uKGkpe3h0LnVuc2hpZnQoaSl9dmFyIGo9MCx0ZT1udWxsO2Z1bmN0aW9uIEFuKGkpe2orKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhqKX1mdW5jdGlvbiBJbihpKXtpZihqLS0sdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoaiksaj09MCYmdGUpe3ZhciBsPXRlO3RlPW51bGwsbCgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBIKGkpe3Qub25BYm9ydCYmdC5vbkFib3J0KGkpLGk9IkFib3J0ZWQoIitpKyIpIixNKGkpLEk9ITAsaSs9Ii4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3ZhciBsPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoaSk7dGhyb3cgcyhsKSxsfXZhciB4bj0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gRnQoaSl7cmV0dXJuIGkuc3RhcnRzV2l0aCh4bil9dmFyIEY7Rj0idGZsaXRlLXNpbWQud2FzbSIsRnQoRil8fChGPWQoRikpO2Z1bmN0aW9uIEx0KGkpe3RyeXtpZihpPT1GJiZBKXJldHVybiBuZXcgVWludDhBcnJheShBKTtpZighdil0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2gobCl7SChsKX19ZnVuY3Rpb24gRm4oKXtyZXR1cm4hQSYmXyYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKEYse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGkpe2lmKCFpLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrRisiJyI7cmV0dXJuIGkuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIEx0KEYpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBMdChGKX0pfWZ1bmN0aW9uIExuKCl7dmFyIGk9e2E6dHN9O2Z1bmN0aW9uIGwoZyxSKXt2YXIgVT1nLmV4cG9ydHM7dC5hc209VSxPPXQuYXNtLnEsTXQoTy5idWZmZXIpLHplPXQuYXNtLkQsU24odC5hc20uciksSW4oKX1BbigpO2Z1bmN0aW9uIGgoZyl7bChnLmluc3RhbmNlKX1mdW5jdGlvbiBtKGcpe3JldHVybiBGbigpLnRoZW4oZnVuY3Rpb24oUil7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKFIsaSl9KS50aGVuKGZ1bmN0aW9uKFIpe3JldHVybiBSfSkudGhlbihnLGZ1bmN0aW9uKFIpe00oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrUiksSChSKX0pfWZ1bmN0aW9uIHkoKXtyZXR1cm4hQSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhRnQoRikmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihnKXt2YXIgUj1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhnLGkpO3JldHVybiBSLnRoZW4oaCxmdW5jdGlvbihVKXtyZXR1cm4gTSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrVSksTSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxtKGgpfSl9KTptKGgpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgVD10Lmluc3RhbnRpYXRlV2FzbShpLGwpO3JldHVybiBUfWNhdGNoKGcpe3JldHVybiBNKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2cpLCExfXJldHVybiB5KCkuY2F0Y2gocykse319ZnVuY3Rpb24gSmUoaSl7Zm9yKDtpLmxlbmd0aD4wOyl7dmFyIGw9aS5zaGlmdCgpO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXtsKHQpO2NvbnRpbnVlfXZhciBoPWwuZnVuYzt0eXBlb2YgaD09Im51bWJlciI/bC5hcmc9PT12b2lkIDA/emUuZ2V0KGgpKCk6emUuZ2V0KGgpKGwuYXJnKTpoKGwuYXJnPT09dm9pZCAwP251bGw6bC5hcmcpfX1mdW5jdGlvbiBrbihpLGwsaCxtKXtIKCJBc3NlcnRpb24gZmFpbGVkOiAiK3dlKGkpKyIsIGF0OiAiK1tsP3dlKGwpOiJ1bmtub3duIGZpbGVuYW1lIixoLG0/d2UobSk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gRG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBVbihpLGwpe0goIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIEJuKCl7SCgiIil9dmFyIEVlO0VlPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgTm49ITA7ZnVuY3Rpb24gSG4oaSl7cmV0dXJuIHhba3QoKT4+Ml09aSxpfWZ1bmN0aW9uICRuKGksbCl7dmFyIGg7aWYoaT09PTApaD1EYXRlLm5vdygpO2Vsc2UgaWYoKGk9PT0xfHxpPT09NCkmJk5uKWg9RWUoKTtlbHNlIHJldHVybiBIbigyOCksLTE7cmV0dXJuIHhbbD4+Ml09aC8xZTN8MCx4W2wrND4+Ml09aCUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gV24oKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBqbihpLGwsaCl7ZWUuY29weVdpdGhpbihpLGwsbCtoKX1mdW5jdGlvbiBxbihpKXt0cnl7cmV0dXJuIE8uZ3JvdyhpLVN0LmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksTXQoTy5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBWbihpKXt2YXIgbD1lZS5sZW5ndGg7aT1pPj4+MDt2YXIgaD0yMTQ3NDgzNjQ4O2lmKGk+aClyZXR1cm4hMTtmb3IodmFyIG09MTttPD00O20qPTIpe3ZhciB5PWwqKDErLjIvbSk7eT1NYXRoLm1pbih5LGkrMTAwNjYzMjk2KTt2YXIgVD1NYXRoLm1pbihoLGJuKE1hdGgubWF4KGkseSksNjU1MzYpKSxnPXFuKFQpO2lmKGcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gem4oaSl7Zm9yKHZhciBsPUVlKCk7RWUoKS1sPGk7KTt9dmFyIEdlPXt9O2Z1bmN0aW9uIEpuKCl7cmV0dXJuIHV8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gcmUoKXtpZighcmUuc3RyaW5ncyl7dmFyIGk9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsbD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmksXzpKbigpfTtmb3IodmFyIGggaW4gR2UpR2VbaF09PT12b2lkIDA/ZGVsZXRlIGxbaF06bFtoXT1HZVtoXTt2YXIgbT1bXTtmb3IodmFyIGggaW4gbCltLnB1c2goaCsiPSIrbFtoXSk7cmUuc3RyaW5ncz1tfXJldHVybiByZS5zdHJpbmdzfXZhciBUZT17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGksbCl7dmFyIGg9VGUuYnVmZmVyc1tpXTtsPT09MHx8bD09PTEwPygoaT09PTE/dzpNKShYKGgsMCkpLGgubGVuZ3RoPTApOmgucHVzaChsKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7VGUudmFyYXJncys9NDt2YXIgaT14W1RlLnZhcmFyZ3MtND4+Ml07cmV0dXJuIGl9LGdldFN0cjpmdW5jdGlvbihpKXt2YXIgbD13ZShpKTtyZXR1cm4gbH0sZ2V0NjQ6ZnVuY3Rpb24oaSxsKXtyZXR1cm4gaX19O2Z1bmN0aW9uIEduKGksbCl7dmFyIGg9MDtyZXR1cm4gcmUoKS5mb3JFYWNoKGZ1bmN0aW9uKG0seSl7dmFyIFQ9bCtoO3hbaSt5KjQ+PjJdPVQsd24obSxUKSxoKz1tLmxlbmd0aCsxfSksMH1mdW5jdGlvbiBRbihpLGwpe3ZhciBoPXJlKCk7eFtpPj4yXT1oLmxlbmd0aDt2YXIgbT0wO3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oeSl7bSs9eS5sZW5ndGgrMX0pLHhbbD4+Ml09bSwwfWZ1bmN0aW9uIFhuKGkpe25zKGkpfWZ1bmN0aW9uIEtuKGkpe3JldHVybiAwfWZ1bmN0aW9uIFluKGksbCxoLG0seSl7fWZ1bmN0aW9uIFpuKGksbCxoLG0pe2Zvcih2YXIgeT0wLFQ9MDtUPGg7VCsrKXtmb3IodmFyIGc9eFtsK1QqOD4+Ml0sUj14W2wrKFQqOCs0KT4+Ml0sVT0wO1U8UjtVKyspVGUucHJpbnRDaGFyKGksZWVbZytVXSk7eSs9Un1yZXR1cm4geFttPj4yXT15LDB9ZnVuY3Rpb24gZXMoKXtpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpe3ZhciBpPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGkpLGlbMF19fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKCl7SCgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIENlKGksbCl7Q2UucmFuZG9tRGV2aWNlfHwoQ2UucmFuZG9tRGV2aWNlPWVzKCkpO2Zvcih2YXIgaD0wO2g8bDtoKyspYmVbaStoPj4wXT1DZS5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgdHM9e2E6a24sZTpEbixkOlVuLGI6Qm4sbjokbixoOlduLGw6am4sbTpWbixwOnpuLGY6R24sZzpRbixqOlhuLGk6S24sazpZbixjOlpuLG86Q2V9O0xuKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIga3Q9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihrdD10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUmU7ZnVuY3Rpb24gcnMoaSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitpKyIpIix0aGlzLnN0YXR1cz1pfXRlPWZ1bmN0aW9uIGkoKXtSZXx8UWUoKSxSZXx8KHRlPWkpfTtmdW5jdGlvbiBRZShpKXtpZihqPjB8fChDbigpLGo+MCkpcmV0dXJuO2Z1bmN0aW9uIGwoKXtSZXx8KFJlPSEwLHQuY2FsbGVkUnVuPSEwLCFJJiYoUm4oKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxQbigpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGwoKX0sMSkpOmwoKX10LnJ1bj1RZTtmdW5jdGlvbiBucyhpLGwpe3NzKGkpfWZ1bmN0aW9uIHNzKGkpe1RuKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQoaSksST0hMCksYyhpLG5ldyBycyhpKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBRZSgpLGUucmVhZHl9fSgpO3R5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCI/bW9kdWxlLmV4cG9ydHM9eWU6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4geWV9KTp0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJihleHBvcnRzLmNyZWF0ZVZvbmFnZVRGTGl0ZVNpbWRNb2R1bGU9eWUpO2NsYXNzIG1ue2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NJTURTdXBwb3J0ZWRfPSExLHRoaXMuaXNUaHJlYWRzU3VwcG9ydGVkXz0hMSx0aGlzLmlucHV0V2lkdGhfPTAsdGhpcy5pbnB1dEhlaWdodF89MCx0aGlzLmlucHV0Q2hhbm5lbENvdW50Xz0wLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPTAsdGhpcy5vdXRwdXRXaWR0aF89MCx0aGlzLm91dHB1dEhlaWdodF89MCx0aGlzLm91dHB1dENoYW5uZWxDb3VudF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MH19YXN5bmMgZnVuY3Rpb24gZ24ocixlKXtsZXQgdD1uZXcgbW47dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24ocyxvKXthc3luYyBmdW5jdGlvbiBhKCl7cmV0dXJuIHllKHtsb2NhdGVGaWxlOmZ1bmN0aW9uKF8pe3JldHVybiByK199fSl9YXN5bmMgZnVuY3Rpb24gdShjKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoXyxmKT0+e2NvbnN0IGQ9YztpZih0eXBlb2YgZD09InVuZGVmaW5lZCIpcmV0dXJuIGYoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHY9cG4oKTtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6Iix2KTtsZXQgdz1lK2Ake3Z9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIit3KTt0cnl7Y29uc3QgQT1hd2FpdChhd2FpdCBmZXRjaCh3KSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6IixBLmJ5dGVMZW5ndGgpO2NvbnN0IEM9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6IixDKSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoQSksQyk7Y29uc3QgTz1kLl9sb2FkTW9kZWwoQS5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixPKSxPIT09MCl7ZigiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoXz1kLl9nZXRJbnB1dFdpZHRoKCksdC5pbnB1dEhlaWdodF89ZC5fZ2V0SW5wdXRIZWlnaHQoKSx0LmlucHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXRfPWQuX2dldElucHV0TWVtb3J5T2Zmc2V0KCksY29uc29sZS5sb2coIklucHV0IG1lbW9yeSBvZmZzZXQ6Iix0LmlucHV0TWVtb3J5T2Zmc2V0XyksY29uc29sZS5sb2coIklucHV0IGhlaWdodDoiLHQuaW5wdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGhfKSxjb25zb2xlLmxvZygiSW5wdXQgY2hhbm5lbHM6Iix0LmlucHV0Q2hhbm5lbENvdW50XyksdC5vdXRwdXRNZW1vcnlPZmZzZXRfPWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGhfPWQuX2dldE91dHB1dFdpZHRoKCksdC5vdXRwdXRIZWlnaHRfPWQuX2dldE91dHB1dEhlaWdodCgpLHQub3V0cHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgaGVpZ2h0OiIsdC5vdXRwdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiT3V0cHV0IHdpZHRoOiIsdC5vdXRwdXRXaWR0aF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudF8pLHQuc2VsZWN0ZWRURkxpdGVfPWR9Y2F0Y2goTSl7ZihNKTtyZXR1cm59XygpfSl9YSgpLnRoZW4oYz0+e2lmKGM9PT1udWxsKXRocm93IGNvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgbnVsbCIpLCJsb2FkVEZMaXRlIG51bGwiO3UoYykudGhlbihfPT57cyh0KX0pLmNhdGNoKF89Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKSxvKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKX0pfSkuY2F0Y2goYz0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgZXJyb3I6IixjKSxvKCJsb2FkVEZMaXRlIGVycm9yOiIrYyl9KX0pO3JldHVybiBufWNsYXNzIF9ue2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPSJibHVyKDBweCkiLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y29uc3QgUT1jbGFzc3tjb25zdHJ1Y3RvcihyKXtpZih0aGlzLmNvbmZpZ189cix0aGlzLmZyYW1lQ291bnRlcl89MCx0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF8pdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIpO3RoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0TWVtb3J5T2Zmc2V0Xz0wLHIudHJhbnNmb3JtZXJUeXBlPT09IlZpcnR1YWxCYWNrZ3JvdW5kIj8odGhpcy50aW1lckdhcF89US5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgY24oci5iYWNrZ3JvdW5kQXNzZXRVcmkpKTpyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IE90KHIucmFkaXVzKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIj90aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EOnIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIj8odGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgX24oci5yYWRpdXMpKToodGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgT3QpfWluaXQoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocixlKT0+e2F3YWl0IGduKHRoaXMuY29uZmlnXy53YXNtQXNzZXRVcmlQYXRoLHRoaXMuY29uZmlnXy50ZmxpdGVBc3NldFVyaVBhdGgpLnRoZW4odD0+e3QmJih0aGlzLnZvYW5nZVRGTGl0ZUluZm9fPXQsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0PXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyp0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tfPW5ldyBJbWFnZURhdGEodGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XyksdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dE1lbW9yeU9mZnNldF8vNCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5vdXRwdXRNZW1vcnlPZmZzZXRfLzQscigpKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmxvZygiZXJyb3IgdXNlVEZMaXRlOiIsdCksZSh0KX0pfSl9YXN5bmMgc3RhcnQoKXtpZih0eXBlb2YgdGhpcy52b2FuZ2VURkxpdGVJbmZvXz09InVuZGVmaW5lZCIpdGhyb3cidHJhbnNmb3JtZXIgbm90IGluaXQifWFzeW5jIHRyYW5zZm9ybShyLGUpeyh0aGlzLnJlc3VsdENhbnZhc18ud2lkdGghPXIuZGlzcGxheVdpZHRofHx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0IT1yLmRpc3BsYXlIZWlnaHQpJiYodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoPXIuZGlzcGxheVdpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQ9ci5kaXNwbGF5SGVpZ2h0KSwodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKG49PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxuLHQpfSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImNyZWF0ZUltYWdlQml0bWFwIixuKSxlLmVucXVldWUocil9KX1wcm9jZXNzRnJhbWUocixlLHQpe3QtdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz49dGhpcy50aW1lckdhcF8mJih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPXQsdGhpcy5wcm9jZXNzU291cmNlKGUpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1hdG9wIix0aGlzLnJlc3VsdEN0eF8uZmlsdGVyPSJub25lIix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfJiZ0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5ydW5Qb3N0UHJvY2Vzc2luZyh0aGlzLnJlc3VsdEN0eF8sZSksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLHRoaXMuZnJhbWVDb3VudGVyXysrfXByb2Nlc3NTb3VyY2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozXT1lLmRhdGFbdCo0XS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMV09ZS5kYXRhW3QqNCsxXS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMl09ZS5kYXRhW3QqNCsyXS8yNTU7dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgdD0wO3Q8dGhpcy5zZWdtZW50YXRpb25QaXhlbENvdW50Xzt0Kyspe2NvbnN0IG49dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLm91dHB1dE1lbW9yeU9mZnNldF8rdF07dGhpcy5zZWdtZW50YXRpb25NYXNrXy5kYXRhW3QqNCszXT0yNTUqbn10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLnB1dEltYWdlRGF0YSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tfLDAsMCksdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCl9Zmx1c2goKXt9Z2V0VHJhbnNmb3JtZXJUeXBlKCl7cmV0dXJuIkJhY2tncm91bmRUcmFuc2Zvcm1lciJ9c2V0VmlkZW9CR1JlYWRhYmxlKHIpe3RoaXMuY29uZmlnXy50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIiYmKHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBkbihyKSl9fTtsZXQgcWU9UTtxZS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUscWUuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MTVlNDtmdW5jdGlvbiB5bihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdm4ocil7aWYoeW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gVmUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjp2bihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKGU9bmV3IGxuLGUub24oImVycm9yIix0PT57Y29uc3Qgbj17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSksZS5vbigid2FybiIsdD0+e2NvbnN0IG49e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSkpfSxlO29ubWVzc2FnZT1hc3luYyB0PT57Y29uc3R7b3BlcmF0aW9uOm59PXQuZGF0YTtpZihjb25zb2xlLmxvZygib3BlcmF0aW9uPSIsbiksbj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpzLHdyaXRhYmxlOm8sY29uZmlnOmEsdmlkZW9CR1JlYWRhYmxlOnUsbWV0YURhdGE6Y309dC5kYXRhO3R5cGVvZiBjPT0ic3RyaW5nIiYmR3IoSlNPTi5wYXJzZShjKSkscigpO2xldCBfPVtdO2NvbnN0IGY9bmV3IHFlKEpTT04ucGFyc2UoYSkpO2Yuc2V0VmlkZW9CR1JlYWRhYmxlKHUpLGYuaW5pdCgpLnRoZW4oKCk9PntfLnB1c2goZiksZS5zZXRUcmFuc2Zvcm1lcnMoXykudGhlbigoKT0+e2UudHJhbnNmb3JtKHMsbykudGhlbigoKT0+e2NvbnN0IGQ9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZCkpfSkuY2F0Y2goZD0+e2NvbnN0IHY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUoZCl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHYpKX0pfSl9KS5jYXRjaChkPT57Y29uc3Qgdj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShkKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodikpfSl9ZWxzZSBuPT09ImRlc3Ryb3kiP2UuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBzPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShzKSl9KS5jYXRjaChzPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShzKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfSk6bj09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJmUuc2V0VHJhY2tFeHBlY3RlZFJhdGUodC5kYXRhLnJhdGUpfX19KSgpOwo=";
1498
1502
  const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
1499
1503
  function WorkerWrapper() {
1500
1504
  const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
@@ -1889,6 +1893,10 @@ class VonageMediaProcessorWorker extends emittery {
1889
1893
  }
1890
1894
  transform(readable, writable) {
1891
1895
  return new Promise(async (resolve, reject) => {
1896
+ let metaDataStr = JSON.stringify(getMetadata());
1897
+ if (typeof metaDataStr != "string") {
1898
+ metaDataStr = JSON.stringify({});
1899
+ }
1892
1900
  if (this.config_.transformerType === "VideoBackground") {
1893
1901
  const bgvideo = document.createElement("video");
1894
1902
  bgvideo.src = this.config_.backgroundAssetUri;
@@ -1907,14 +1915,16 @@ class VonageMediaProcessorWorker extends emittery {
1907
1915
  readable,
1908
1916
  writable,
1909
1917
  config: JSON.stringify(this.config_),
1910
- videoBGReadable
1918
+ videoBGReadable,
1919
+ metaData: metaDataStr
1911
1920
  }, [readable, writable, videoBGReadable]);
1912
1921
  } else {
1913
1922
  this.worker_.postMessage({
1914
1923
  operation: "transform",
1915
1924
  readable,
1916
1925
  writable,
1917
- config: JSON.stringify(this.config_)
1926
+ config: JSON.stringify(this.config_),
1927
+ metaData: metaDataStr
1918
1928
  }, [readable, writable]);
1919
1929
  }
1920
1930
  this.onMessage_.then(() => {
@@ -1,4 +1,4 @@
1
- (function(r,g){typeof exports=="object"&&typeof module!="undefined"?g(exports):typeof define=="function"&&define.amd?define(["exports"],g):(r=typeof globalThis!="undefined"?globalThis:r||self,g(r["ml-transformers"]={}))})(this,function(r){"use strict";function g(){return new Promise((Z,l)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?l("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):Z()})}var Yl={exports:{}},Jl=function(l,d){return function(){for(var b=new Array(arguments.length),e=0;e<b.length;e++)b[e]=arguments[e];return l.apply(d,b)}},nd=Jl,y=Object.prototype.toString;function el(Z){return Array.isArray(Z)}function nl(Z){return typeof Z=="undefined"}function td(Z){return Z!==null&&!nl(Z)&&Z.constructor!==null&&!nl(Z.constructor)&&typeof Z.constructor.isBuffer=="function"&&Z.constructor.isBuffer(Z)}function Il(Z){return y.call(Z)==="[object ArrayBuffer]"}function id(Z){return y.call(Z)==="[object FormData]"}function md(Z){var l;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?l=ArrayBuffer.isView(Z):l=Z&&Z.buffer&&Il(Z.buffer),l}function ud(Z){return typeof Z=="string"}function od(Z){return typeof Z=="number"}function Kl(Z){return Z!==null&&typeof Z=="object"}function T(Z){if(y.call(Z)!=="[object Object]")return!1;var l=Object.getPrototypeOf(Z);return l===null||l===Object.prototype}function ad(Z){return y.call(Z)==="[object Date]"}function sd(Z){return y.call(Z)==="[object File]"}function Xd(Z){return y.call(Z)==="[object Blob]"}function fl(Z){return y.call(Z)==="[object Function]"}function Wd(Z){return Kl(Z)&&fl(Z.pipe)}function rd(Z){return y.call(Z)==="[object URLSearchParams]"}function Gd(Z){return Z.trim?Z.trim():Z.replace(/^\s+|\s+$/g,"")}function hd(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function tl(Z,l){if(!(Z===null||typeof Z=="undefined"))if(typeof Z!="object"&&(Z=[Z]),el(Z))for(var d=0,c=Z.length;d<c;d++)l.call(null,Z[d],d,Z);else for(var b in Z)Object.prototype.hasOwnProperty.call(Z,b)&&l.call(null,Z[b],b,Z)}function il(){var Z={};function l(b,e){T(Z[e])&&T(b)?Z[e]=il(Z[e],b):T(b)?Z[e]=il({},b):el(b)?Z[e]=b.slice():Z[e]=b}for(var d=0,c=arguments.length;d<c;d++)tl(arguments[d],l);return Z}function pd(Z,l,d){return tl(l,function(b,e){d&&typeof b=="function"?Z[e]=nd(b,d):Z[e]=b}),Z}function yd(Z){return Z.charCodeAt(0)===65279&&(Z=Z.slice(1)),Z}var a={isArray:el,isArrayBuffer:Il,isBuffer:td,isFormData:id,isArrayBufferView:md,isString:ud,isNumber:od,isObject:Kl,isPlainObject:T,isUndefined:nl,isDate:ad,isFile:sd,isBlob:Xd,isFunction:fl,isStream:Wd,isURLSearchParams:rd,isStandardBrowserEnv:hd,forEach:tl,merge:il,extend:pd,trim:Gd,stripBOM:yd},I=a;function Sl(Z){return encodeURIComponent(Z).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Hl=function(l,d,c){if(!d)return l;var b;if(c)b=c(d);else if(I.isURLSearchParams(d))b=d.toString();else{var e=[];I.forEach(d,function(m,s){m===null||typeof m=="undefined"||(I.isArray(m)?s=s+"[]":m=[m],I.forEach(m,function(u){I.isDate(u)?u=u.toISOString():I.isObject(u)&&(u=JSON.stringify(u)),e.push(Sl(s)+"="+Sl(u))}))}),b=e.join("&")}if(b){var n=l.indexOf("#");n!==-1&&(l=l.slice(0,n)),l+=(l.indexOf("?")===-1?"?":"&")+b}return l},Vd=a;function w(){this.handlers=[]}w.prototype.use=function(l,d,c){return this.handlers.push({fulfilled:l,rejected:d,synchronous:c?c.synchronous:!1,runWhen:c?c.runWhen:null}),this.handlers.length-1},w.prototype.eject=function(l){this.handlers[l]&&(this.handlers[l]=null)},w.prototype.forEach=function(l){Vd.forEach(this.handlers,function(c){c!==null&&l(c)})};var Rd=w,Yd=a,Jd=function(l,d){Yd.forEach(l,function(b,e){e!==d&&e.toUpperCase()===d.toUpperCase()&&(l[d]=b,delete l[e])})},Ll=function(l,d,c,b,e){return l.config=d,c&&(l.code=c),l.request=b,l.response=e,l.isAxiosError=!0,l.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},l},Id=Ll,Nl=function(l,d,c,b,e){var n=new Error(l);return Id(n,d,c,b,e)},Kd=Nl,fd=function(l,d,c){var b=c.config.validateStatus;!c.status||!b||b(c.status)?l(c):d(Kd("Request failed with status code "+c.status,c.config,null,c.request,c))},Q=a,Sd=Q.isStandardBrowserEnv()?function(){return{write:function(d,c,b,e,n,t){var m=[];m.push(d+"="+encodeURIComponent(c)),Q.isNumber(b)&&m.push("expires="+new Date(b).toGMTString()),Q.isString(e)&&m.push("path="+e),Q.isString(n)&&m.push("domain="+n),t===!0&&m.push("secure"),document.cookie=m.join("; ")},read:function(d){var c=document.cookie.match(new RegExp("(^|;\\s*)("+d+")=([^;]*)"));return c?decodeURIComponent(c[3]):null},remove:function(d){this.write(d,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Hd=function(l){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(l)},Ld=function(l,d){return d?l.replace(/\/+$/,"")+"/"+d.replace(/^\/+/,""):l},Nd=Hd,Fd=Ld,vd=function(l,d){return l&&!Nd(d)?Fd(l,d):d},ml=a,zd=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],gd=function(l){var d={},c,b,e;return l&&ml.forEach(l.split(`
2
- `),function(t){if(e=t.indexOf(":"),c=ml.trim(t.substr(0,e)).toLowerCase(),b=ml.trim(t.substr(e+1)),c){if(d[c]&&zd.indexOf(c)>=0)return;c==="set-cookie"?d[c]=(d[c]?d[c]:[]).concat([b]):d[c]=d[c]?d[c]+", "+b:b}}),d},Fl=a,kd=Fl.isStandardBrowserEnv()?function(){var l=/(msie|trident)/i.test(navigator.userAgent),d=document.createElement("a"),c;function b(e){var n=e;return l&&(d.setAttribute("href",n),n=d.href),d.setAttribute("href",n),{href:d.href,protocol:d.protocol?d.protocol.replace(/:$/,""):"",host:d.host,search:d.search?d.search.replace(/^\?/,""):"",hash:d.hash?d.hash.replace(/^#/,""):"",hostname:d.hostname,port:d.port,pathname:d.pathname.charAt(0)==="/"?d.pathname:"/"+d.pathname}}return c=b(window.location.href),function(n){var t=Fl.isString(n)?b(n):n;return t.protocol===c.protocol&&t.host===c.host}}():function(){return function(){return!0}}();function ul(Z){this.message=Z}ul.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},ul.prototype.__CANCEL__=!0;var P=ul,j=a,Cd=fd,xd=Sd,Ud=Hl,Bd=vd,Td=gd,wd=kd,ol=Nl,Qd=E,Pd=P,vl=function(l){return new Promise(function(c,b){var e=l.data,n=l.headers,t=l.responseType,m;function s(){l.cancelToken&&l.cancelToken.unsubscribe(m),l.signal&&l.signal.removeEventListener("abort",m)}j.isFormData(e)&&delete n["Content-Type"];var i=new XMLHttpRequest;if(l.auth){var u=l.auth.username||"",p=l.auth.password?unescape(encodeURIComponent(l.auth.password)):"";n.Authorization="Basic "+btoa(u+":"+p)}var X=Bd(l.baseURL,l.url);i.open(l.method.toUpperCase(),Ud(X,l.params,l.paramsSerializer),!0),i.timeout=l.timeout;function bd(){if(!!i){var G="getAllResponseHeaders"in i?Td(i.getAllResponseHeaders()):null,z=!t||t==="text"||t==="json"?i.responseText:i.response,J={data:z,status:i.status,statusText:i.statusText,headers:G,config:l,request:i};Cd(function(Rl){c(Rl),s()},function(Rl){b(Rl),s()},J),i=null}}if("onloadend"in i?i.onloadend=bd:i.onreadystatechange=function(){!i||i.readyState!==4||i.status===0&&!(i.responseURL&&i.responseURL.indexOf("file:")===0)||setTimeout(bd)},i.onabort=function(){!i||(b(ol("Request aborted",l,"ECONNABORTED",i)),i=null)},i.onerror=function(){b(ol("Network Error",l,null,i)),i=null},i.ontimeout=function(){var z=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded",J=l.transitional||Qd.transitional;l.timeoutErrorMessage&&(z=l.timeoutErrorMessage),b(ol(z,l,J.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",i)),i=null},j.isStandardBrowserEnv()){var ed=(l.withCredentials||wd(X))&&l.xsrfCookieName?xd.read(l.xsrfCookieName):void 0;ed&&(n[l.xsrfHeaderName]=ed)}"setRequestHeader"in i&&j.forEach(n,function(z,J){typeof e=="undefined"&&J.toLowerCase()==="content-type"?delete n[J]:i.setRequestHeader(J,z)}),j.isUndefined(l.withCredentials)||(i.withCredentials=!!l.withCredentials),t&&t!=="json"&&(i.responseType=l.responseType),typeof l.onDownloadProgress=="function"&&i.addEventListener("progress",l.onDownloadProgress),typeof l.onUploadProgress=="function"&&i.upload&&i.upload.addEventListener("progress",l.onUploadProgress),(l.cancelToken||l.signal)&&(m=function(G){!i||(b(!G||G&&G.type?new Pd("canceled"):G),i.abort(),i=null)},l.cancelToken&&l.cancelToken.subscribe(m),l.signal&&(l.signal.aborted?m():l.signal.addEventListener("abort",m))),e||(e=null),i.send(e)})},o=a,zl=Jd,jd=Ll,Md={"Content-Type":"application/x-www-form-urlencoded"};function gl(Z,l){!o.isUndefined(Z)&&o.isUndefined(Z["Content-Type"])&&(Z["Content-Type"]=l)}function Ed(){var Z;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(Z=vl),Z}function Od(Z,l,d){if(o.isString(Z))try{return(l||JSON.parse)(Z),o.trim(Z)}catch(c){if(c.name!=="SyntaxError")throw c}return(d||JSON.stringify)(Z)}var M={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:Ed(),transformRequest:[function(l,d){return zl(d,"Accept"),zl(d,"Content-Type"),o.isFormData(l)||o.isArrayBuffer(l)||o.isBuffer(l)||o.isStream(l)||o.isFile(l)||o.isBlob(l)?l:o.isArrayBufferView(l)?l.buffer:o.isURLSearchParams(l)?(gl(d,"application/x-www-form-urlencoded;charset=utf-8"),l.toString()):o.isObject(l)||d&&d["Content-Type"]==="application/json"?(gl(d,"application/json"),Od(l)):l}],transformResponse:[function(l){var d=this.transitional||M.transitional,c=d&&d.silentJSONParsing,b=d&&d.forcedJSONParsing,e=!c&&this.responseType==="json";if(e||b&&o.isString(l)&&l.length)try{return JSON.parse(l)}catch(n){if(e)throw n.name==="SyntaxError"?jd(n,this,"E_JSON_PARSE"):n}return l}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(l){return l>=200&&l<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],function(l){M.headers[l]={}}),o.forEach(["post","put","patch"],function(l){M.headers[l]=o.merge(Md)});var E=M,Dd=a,Ad=E,$d=function(l,d,c){var b=this||Ad;return Dd.forEach(c,function(n){l=n.call(b,l,d)}),l},kl=function(l){return!!(l&&l.__CANCEL__)},Cl=a,al=$d,_d=kl,qd=E,lc=P;function sl(Z){if(Z.cancelToken&&Z.cancelToken.throwIfRequested(),Z.signal&&Z.signal.aborted)throw new lc("canceled")}var dc=function(l){sl(l),l.headers=l.headers||{},l.data=al.call(l,l.data,l.headers,l.transformRequest),l.headers=Cl.merge(l.headers.common||{},l.headers[l.method]||{},l.headers),Cl.forEach(["delete","get","head","post","put","patch","common"],function(b){delete l.headers[b]});var d=l.adapter||qd.adapter;return d(l).then(function(b){return sl(l),b.data=al.call(l,b.data,b.headers,l.transformResponse),b},function(b){return _d(b)||(sl(l),b&&b.response&&(b.response.data=al.call(l,b.response.data,b.response.headers,l.transformResponse))),Promise.reject(b)})},W=a,xl=function(l,d){d=d||{};var c={};function b(i,u){return W.isPlainObject(i)&&W.isPlainObject(u)?W.merge(i,u):W.isPlainObject(u)?W.merge({},u):W.isArray(u)?u.slice():u}function e(i){if(W.isUndefined(d[i])){if(!W.isUndefined(l[i]))return b(void 0,l[i])}else return b(l[i],d[i])}function n(i){if(!W.isUndefined(d[i]))return b(void 0,d[i])}function t(i){if(W.isUndefined(d[i])){if(!W.isUndefined(l[i]))return b(void 0,l[i])}else return b(void 0,d[i])}function m(i){if(i in d)return b(l[i],d[i]);if(i in l)return b(void 0,l[i])}var s={url:n,method:n,data:n,baseURL:t,transformRequest:t,transformResponse:t,paramsSerializer:t,timeout:t,timeoutMessage:t,withCredentials:t,adapter:t,responseType:t,xsrfCookieName:t,xsrfHeaderName:t,onUploadProgress:t,onDownloadProgress:t,decompress:t,maxContentLength:t,maxBodyLength:t,transport:t,httpAgent:t,httpsAgent:t,cancelToken:t,socketPath:t,responseEncoding:t,validateStatus:m};return W.forEach(Object.keys(l).concat(Object.keys(d)),function(u){var p=s[u]||e,X=p(u);W.isUndefined(X)&&p!==m||(c[u]=X)}),c},Ul={version:"0.25.0"},cc=Ul.version,Xl={};["object","boolean","number","function","string","symbol"].forEach(function(Z,l){Xl[Z]=function(c){return typeof c===Z||"a"+(l<1?"n ":" ")+Z}});var Bl={};Xl.transitional=function(l,d,c){function b(e,n){return"[Axios v"+cc+"] Transitional option '"+e+"'"+n+(c?". "+c:"")}return function(e,n,t){if(l===!1)throw new Error(b(n," has been removed"+(d?" in "+d:"")));return d&&!Bl[n]&&(Bl[n]=!0,console.warn(b(n," has been deprecated since v"+d+" and will be removed in the near future"))),l?l(e,n,t):!0}};function Zc(Z,l,d){if(typeof Z!="object")throw new TypeError("options must be an object");for(var c=Object.keys(Z),b=c.length;b-- >0;){var e=c[b],n=l[e];if(n){var t=Z[e],m=t===void 0||n(t,e,Z);if(m!==!0)throw new TypeError("option "+e+" must be "+m);continue}if(d!==!0)throw Error("Unknown option "+e)}}var bc={assertOptions:Zc,validators:Xl},Tl=a,ec=Hl,wl=Rd,Ql=dc,O=xl,Pl=bc,K=Pl.validators;function k(Z){this.defaults=Z,this.interceptors={request:new wl,response:new wl}}k.prototype.request=function(l,d){if(typeof l=="string"?(d=d||{},d.url=l):d=l||{},!d.url)throw new Error("Provided config url is not valid");d=O(this.defaults,d),d.method?d.method=d.method.toLowerCase():this.defaults.method?d.method=this.defaults.method.toLowerCase():d.method="get";var c=d.transitional;c!==void 0&&Pl.assertOptions(c,{silentJSONParsing:K.transitional(K.boolean),forcedJSONParsing:K.transitional(K.boolean),clarifyTimeoutError:K.transitional(K.boolean)},!1);var b=[],e=!0;this.interceptors.request.forEach(function(X){typeof X.runWhen=="function"&&X.runWhen(d)===!1||(e=e&&X.synchronous,b.unshift(X.fulfilled,X.rejected))});var n=[];this.interceptors.response.forEach(function(X){n.push(X.fulfilled,X.rejected)});var t;if(!e){var m=[Ql,void 0];for(Array.prototype.unshift.apply(m,b),m=m.concat(n),t=Promise.resolve(d);m.length;)t=t.then(m.shift(),m.shift());return t}for(var s=d;b.length;){var i=b.shift(),u=b.shift();try{s=i(s)}catch(p){u(p);break}}try{t=Ql(s)}catch(p){return Promise.reject(p)}for(;n.length;)t=t.then(n.shift(),n.shift());return t},k.prototype.getUri=function(l){if(!l.url)throw new Error("Provided config url is not valid");return l=O(this.defaults,l),ec(l.url,l.params,l.paramsSerializer).replace(/^\?/,"")},Tl.forEach(["delete","get","head","options"],function(l){k.prototype[l]=function(d,c){return this.request(O(c||{},{method:l,url:d,data:(c||{}).data}))}}),Tl.forEach(["post","put","patch"],function(l){k.prototype[l]=function(d,c,b){return this.request(O(b||{},{method:l,url:d,data:c}))}});var nc=k,tc=P;function f(Z){if(typeof Z!="function")throw new TypeError("executor must be a function.");var l;this.promise=new Promise(function(b){l=b});var d=this;this.promise.then(function(c){if(!!d._listeners){var b,e=d._listeners.length;for(b=0;b<e;b++)d._listeners[b](c);d._listeners=null}}),this.promise.then=function(c){var b,e=new Promise(function(n){d.subscribe(n),b=n}).then(c);return e.cancel=function(){d.unsubscribe(b)},e},Z(function(b){d.reason||(d.reason=new tc(b),l(d.reason))})}f.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},f.prototype.subscribe=function(l){if(this.reason){l(this.reason);return}this._listeners?this._listeners.push(l):this._listeners=[l]},f.prototype.unsubscribe=function(l){if(!!this._listeners){var d=this._listeners.indexOf(l);d!==-1&&this._listeners.splice(d,1)}},f.source=function(){var l,d=new f(function(b){l=b});return{token:d,cancel:l}};var ic=f,mc=function(l){return function(c){return l.apply(null,c)}},uc=a,oc=function(l){return uc.isObject(l)&&l.isAxiosError===!0},jl=a,ac=Jl,D=nc,sc=xl,Xc=E;function Ml(Z){var l=new D(Z),d=ac(D.prototype.request,l);return jl.extend(d,D.prototype,l),jl.extend(d,l),d.create=function(b){return Ml(sc(Z,b))},d}var h=Ml(Xc);h.Axios=D,h.Cancel=P,h.CancelToken=ic,h.isCancel=kl,h.VERSION=Ul.version,h.all=function(l){return Promise.all(l)},h.spread=mc,h.isAxiosError=oc,Yl.exports=h,Yl.exports.default=h;for(var Wc=[],Wl=0;Wl<256;++Wl)Wc.push((Wl+256).toString(16).substr(1));const V=new WeakMap,A=new WeakMap,C=new WeakMap,rl=Symbol("anyProducer"),El=Promise.resolve(),$=Symbol("listenerAdded"),_=Symbol("listenerRemoved");let Gl=!1;function S(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function q(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function H(Z,l){const d=A.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function x(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:rl,c=C.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function rc(Z,l,d){const c=C.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(rl)){const b=Promise.all([l,d]);for(const e of c.get(rl))e.enqueue(b)}}function Ol(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(n){b.push(n),c()},finish(){d=!0,c()}};for(const n of l)x(Z,n).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(n=>{c=n}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(n){b=void 0;for(const t of l)x(Z,t).delete(e);return c(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Dl(Z){if(Z===void 0)return Al;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Al.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const hl=Z=>Z===$||Z===_;class L{static mixin(l,d){return d=Dl(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const n of d)if(c.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new L}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=n=>function(...t){return this[l][n](...t)};for(const n of d)Object.defineProperty(c.prototype,n,{enumerable:!1,value:e(n)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Gl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Gl}static set isDebugEnabled(l){Gl=l}constructor(l={}){V.set(this,new Set),A.set(this,new Map),C.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const n=new Date,t=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${t}][emittery:${d}][${c}] Event Name: ${b}
3
- data: ${e}`)})}logIfDebugEnabled(l,d,c){(L.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){q(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),H(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),hl(c)||this.emit($,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){q(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),H(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),hl(c)||this.emit(_,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)S(d);return Ol(this,l)}async emit(l,d){S(l),this.logIfDebugEnabled("emit",l,d),rc(this,l,d);const c=H(this,l),b=V.get(this),e=[...c],n=hl(l)?[]:[...b];await El,await Promise.all([...e.map(async t=>{if(c.has(t))return t(d)}),...n.map(async t=>{if(b.has(t))return t(l,d)})])}async emitSerial(l,d){S(l),this.logIfDebugEnabled("emitSerial",l,d);const c=H(this,l),b=V.get(this),e=[...c],n=[...b];await El;for(const t of e)c.has(t)&&await t(d);for(const t of n)b.has(t)&&await t(l,d)}onAny(l){return q(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),V.get(this).add(l),this.emit($,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return Ol(this)}offAny(l){q(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(_,{listener:l}),V.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){H(this,d).clear();const c=x(this,d);for(const b of c)b.finish();c.clear()}else{V.get(this).clear();for(const c of A.get(this).values())c.clear();for(const c of C.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=V.get(this).size+H(this,c).size+x(this,c).size+x(this).size;continue}typeof c!="undefined"&&S(c),d+=V.get(this).size;for(const b of A.get(this).values())d+=b.size;for(const b of C.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=Dl(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Al=Object.getOwnPropertyNames(L.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(L,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(L,"listenerRemoved",{value:_,writable:!1,enumerable:!0,configurable:!1});var $l;(function(Z){Z.FPS_DROP="fps_drop"})($l||($l={}));class Gc{constructor(){this.processor_=null,this.generator_=null}init(l){return new Promise((d,c)=>{try{this.processor_=new MediaStreamTrackProcessor(l)}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${b}`),c(b)}try{l.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):l.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):c("kind not supported")}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${b}`),c(b)}d()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class hc{constructor(l){this.insertableStreamHelper_=new Gc,this.mediaProcessor_=l}setTrack(l){return new Promise((d,c)=>{this.insertableStreamHelper_.init(l).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{d(this.insertableStreamHelper_.getProccesorTrack())}).catch(b=>{c(b)})}).catch(b=>{c(b)})})}destroy(){return new Promise((l,d)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{l()}).catch(c=>{d(c)}):d("no processor")})}}const _l="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LER0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIFV0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBCdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBOdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIEh0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gJHQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBXdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIGp0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gcXQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBWdChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24genQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEp0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBRdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPUR0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBYdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpVdCxpc0Zvcm1EYXRhOkJ0LGlzQXJyYXlCdWZmZXJWaWV3Ok50LGlzU3RyaW5nOkh0LGlzTnVtYmVyOiR0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOld0LGlzRmlsZTpqdCxpc0Jsb2I6cXQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTpWdCxpc1VSTFNlYXJjaFBhcmFtczp6dCxpc1N0YW5kYXJkQnJvd3NlckVudjpHdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpRdCx0cmltOkp0LHN0cmlwQk9NOlh0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLG0pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/bT1tKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChtKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sS3Q9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtLdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFl0PXNlLFp0PVAsZXI9ZnVuY3Rpb24oZSx0KXtadC5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sdHI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHRyKGEsdCxuLHMsbyl9LHJyPW50LG5yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQocnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsc3I9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksaXI9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sb3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sYXI9aXIsdXI9b3IsZnI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIWFyKHQpP3VyKGUsdCk6dH0sSWU9UCxscj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGNyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZsci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxocj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxkcj1ucixwcj1zcixtcj10dCxncj1mcixfcj1jcix5cj1ocixGZT1udCx2cj1mZSx3cj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIG0oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsUj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK1IpfXZhciB2PWdyKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksbXIodixlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBUPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj9fcihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6VCxjb25maWc6ZSxyZXF1ZXN0OmZ9O2RyKGZ1bmN0aW9uKFgpe24oWCksbSgpfSxmdW5jdGlvbihYKXtzKFgpLG0oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8dnIudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx5cih2KSkmJmUueHNyZkNvb2tpZU5hbWU/cHIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKFQpeyFmfHwocyghVHx8VCYmVC50eXBlP25ldyB3cigiY2FuY2VsZWQiKTpUKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sdz1QLG90PWVyLGJyPXJ0LEVyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshdy5pc1VuZGVmaW5lZChyKSYmdy5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBUcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIENyKHIsZSx0KXtpZih3LmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksdy50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOlRyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksdy5pc0Zvcm1EYXRhKGUpfHx3LmlzQXJyYXlCdWZmZXIoZSl8fHcuaXNCdWZmZXIoZSl8fHcuaXNTdHJlYW0oZSl8fHcuaXNGaWxlKGUpfHx3LmlzQmxvYihlKT9lOncuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6dy5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOncuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksQ3IoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJncuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/YnIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O3cuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksdy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT13Lm1lcmdlKEVyKX0pO3ZhciBmZT11ZSxScj1QLFByPWZlLE9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxQcjtyZXR1cm4gUnIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9T3IsU3I9dXQsTXI9ZmUsQXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEFyKCJjYW5jZWxlZCIpfXZhciBJcj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fE1yLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBTcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBtPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgUj1tW2RdfHxvLHY9UihkKTtTLmlzVW5kZWZpbmVkKHYpJiZSIT09Y3x8KG5bZF09dil9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0seHI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2Iit4cisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIEZyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBMcj17YXNzZXJ0T3B0aW9uczpGcix2YWxpZGF0b3JzOkRlfSxkdD1QLGtyPXR0LHB0PVl0LG10PUlyLGxlPWx0LGd0PUxyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHYpe3R5cGVvZiB2LnJ1bldoZW49PSJmdW5jdGlvbiImJnYucnVuV2hlbih0KT09PSExfHwobz1vJiZ2LnN5bmNocm9ub3VzLHMudW5zaGlmdCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2EucHVzaCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIG09dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7bT1mKG0pfWNhdGNoKFIpe2QoUik7YnJlYWt9fXRyeXt1PW10KG0pfWNhdGNoKFIpe3JldHVybiBQcm9taXNlLnJlamVjdChSKX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxrcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBEcj1LLFVyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBVcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgQnI9eixOcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LEhyPVAsJHI9ZnVuY3Rpb24oZSl7cmV0dXJuIEhyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLFdyPVhlLGNlPURyLGpyPWx0LHFyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PVdyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KGpyKHIscykpfSx0fXZhciBMPXl0KHFyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49QnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPU5yLEwuaXNBeGlvc0Vycm9yPSRyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgVnI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgenI9IjEuMS4xIjtjbGFzcyBre2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVwb3J0PXthY3Rpb246cC5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6cC5vZk51bGxhYmxlKG51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpwLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6cC5lbXB0eSgpLGd1aWQ6cC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpwLmVtcHR5KCksbWVzc2FnZTpwLmVtcHR5KCksc291cmNlOnAub2ZOdWxsYWJsZShudWxsKSx0cmFuc2Zvcm1lZEZwczpwLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOnAuZW1wdHkoKSx2YXJpYXRpb246cC5lbXB0eSgpLHZpZGVvSGVpZ2h0OnAuZW1wdHkoKSx2aWRlb1dpZHRoOnAuZW1wdHkoKSx2ZXJzaW9uOnpyLGVycm9yOnAuZW1wdHkoKX19YWN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuYWN0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfWZyYW1lc1RyYW5zZm9ybWVkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnJhbWVzVHJhbnNmb3JtZWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnBzPXAub2ZOdWxsYWJsZShlKSx0aGlzfWd1aWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5ndWlkPXAub2ZOdWxsYWJsZShlKSx0aGlzfW1lc3NhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5tZXNzYWdlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVkRnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZWRGcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZXJUeXBlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZXJUeXBlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZhcmlhdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZhcmlhdGlvbj1wLm9mTnVsbGFibGUoZSksdGhpc312aWRlb0hlaWdodChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvSGVpZ2h0PXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvV2lkdGgoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb1dpZHRoPXAub2ZOdWxsYWJsZShlKSx0aGlzfWVycm9yKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZXJyb3I9cC5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBKcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyBEe3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYoZS5hcHBsaWNhdGlvbklkPT09bnVsbHx8ZS5zb3VyY2U9PT1udWxsKXt0KCJzdWNjZXNzIik7cmV0dXJufWxldCBzPVZyLmNyZWF0ZSgpLG89e3RpbWVvdXQ6MWU0LHRpbWVvdXRFcnJvck1lc3NhZ2U6IlJlcXVlc3QgdGltZW91dCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX07Y29uc3QgYT0iaHR0cHM6Ly9obGcuZGV2LnRva2JveC5jb20vZGV2L2xvZ2dpbmcvdmNwX3dlYnJ0YyI7cy5wb3N0KGEsSnIoZSksbykudGhlbih1PT57Y29uc29sZS5sb2codSksdCgic3VjY2VzcyIpfSkuY2F0Y2godT0+e2NvbnNvbGUubG9nKHUpLG4odSl9KX0pfX12YXIgaGUsR3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIFFyKCl7aWYoIWhlJiYoaGU9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWhlKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGhlKEdyKX12YXIgWHI9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIEtyKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJlhyLnRlc3Qocil9Zm9yKHZhciBiPVtdLFVlPTA7VWU8MjU2OysrVWUpYi5wdXNoKChVZSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIFlyKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KGJbcltlKzBdXStiW3JbZSsxXV0rYltyW2UrMl1dK2JbcltlKzNdXSsiLSIrYltyW2UrNF1dK2JbcltlKzVdXSsiLSIrYltyW2UrNl1dK2JbcltlKzddXSsiLSIrYltyW2UrOF1dK2JbcltlKzldXSsiLSIrYltyW2UrMTBdXStiW3JbZSsxMV1dK2JbcltlKzEyXV0rYltyW2UrMTNdXStiW3JbZSsxNF1dK2JbcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIUtyKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gYnQocixlLHQpe3I9cnx8e307dmFyIG49ci5yYW5kb218fChyLnJuZ3x8UXIpKCk7aWYobls2XT1uWzZdJjE1fDY0LG5bOF09bls4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgcz0wO3M8MTY7KytzKWVbdCtzXT1uW3NdO3JldHVybiBlfXJldHVybiBZcihuKX1jb25zdCBOPW5ldyBXZWFrTWFwLGRlPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsQmU9U3ltYm9sKCJhbnlQcm9kdWNlciIpLEV0PVByb21pc2UucmVzb2x2ZSgpLHBlPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLG1lPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IE5lPSExO2Z1bmN0aW9uIEoocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBnZShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBHKHIsZSl7Y29uc3QgdD1kZS5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIFoocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6QmUsbj1ZLmdldChyKTtyZXR1cm4gbi5oYXModCl8fG4uc2V0KHQsbmV3IFNldCksbi5nZXQodCl9ZnVuY3Rpb24gWnIocixlLHQpe2NvbnN0IG49WS5nZXQocik7aWYobi5oYXMoZSkpZm9yKGNvbnN0IHMgb2Ygbi5nZXQoZSkpcy5lbnF1ZXVlKHQpO2lmKG4uaGFzKEJlKSl7Y29uc3Qgcz1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygbi5nZXQoQmUpKW8uZW5xdWV1ZShzKX19ZnVuY3Rpb24gVHQocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEsbj0oKT0+e30scz1bXTtjb25zdCBvPXtlbnF1ZXVlKGEpe3MucHVzaChhKSxuKCl9LGZpbmlzaCgpe3Q9ITAsbigpfX07Zm9yKGNvbnN0IGEgb2YgZSlaKHIsYSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIHM/cy5sZW5ndGg9PT0wP3Q/KHM9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoYT0+e249YX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBzLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGEpe3M9dm9pZCAwO2Zvcihjb25zdCB1IG9mIGUpWihyLHUpLmRlbGV0ZShvKTtyZXR1cm4gbigpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBhfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIEN0KHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIFJ0O2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighUnQuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBIZT1yPT5yPT09cGV8fHI9PT1tZTtjbGFzcyBXe3N0YXRpYyBtaXhpbihlLHQpe3JldHVybiB0PUN0KHQpLG49PntpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGZ1bmN0aW9uIik7Zm9yKGNvbnN0IGEgb2YgdClpZihuLnByb3RvdHlwZVthXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7YX1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7ZnVuY3Rpb24gcygpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiExLHZhbHVlOm5ldyBXfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6c30pO2NvbnN0IG89YT0+ZnVuY3Rpb24oLi4udSl7cmV0dXJuIHRoaXNbZV1bYV0oLi4udSl9O2Zvcihjb25zdCBhIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITEsdmFsdWU6byhhKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBOZTtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxOZX1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe05lPWV9Y29uc3RydWN0b3IoZT17fSl7Ti5zZXQodGhpcyxuZXcgU2V0KSxkZS5zZXQodGhpcyxuZXcgTWFwKSxZLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LG4scyxvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIHM9PSJzeW1ib2wiJiYocz1zLnRvU3RyaW5nKCkpO2NvbnN0IGE9bmV3IERhdGUsdT1gJHthLmdldEhvdXJzKCl9OiR7YS5nZXRNaW51dGVzKCl9OiR7YS5nZXRTZWNvbmRzKCl9LiR7YS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHt1fV1bZW1pdHRlcnk6JHt0fV1bJHtufV0gRXZlbnQgTmFtZTogJHtzfQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LG4peyhXLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LG4pfW9uKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLEhlKG4pfHx0aGlzLmVtaXQocGUse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChtZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBuPXRoaXMub24oZSxzPT57bigpLHQocyl9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlKKHQpO3JldHVybiBUdCh0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCksWnIodGhpcyxlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1IZShlKT9bXTpbLi4uc107YXdhaXQgRXQsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIHU9PntpZihuLmhhcyh1KSlyZXR1cm4gdSh0KX0pLC4uLmEubWFwKGFzeW5jIHU9PntpZihzLmhhcyh1KSlyZXR1cm4gdShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7SihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1bLi4uc107YXdhaXQgRXQ7Zm9yKGNvbnN0IHUgb2YgbyluLmhhcyh1KSYmYXdhaXQgdSh0KTtmb3IoY29uc3QgdSBvZiBhKXMuaGFzKHUpJiZhd2FpdCB1KGUsdCl9b25BbnkoZSl7cmV0dXJuIGdlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksTi5nZXQodGhpcykuYWRkKGUpLHRoaXMuZW1pdChwZSx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBUdCh0aGlzKX1vZmZBbnkoZSl7Z2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChtZSx7bGlzdGVuZXI6ZX0pLE4uZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtHKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBuPVoodGhpcyx0KTtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7Ti5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBkZS5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIFkuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXtpZih0eXBlb2Ygbj09InN0cmluZyIpe3QrPU4uZ2V0KHRoaXMpLnNpemUrRyh0aGlzLG4pLnNpemUrWih0aGlzLG4pLnNpemUrWih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBuIT0idW5kZWZpbmVkIiYmSihuKSx0Kz1OLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBzIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemU7Zm9yKGNvbnN0IHMgb2YgWS5nZXQodGhpcykudmFsdWVzKCkpdCs9cy5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9Q3QodCk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IFJ0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFcucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6cGUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVywibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6bWUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgJGU9VztmdW5jdGlvbiBlbihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdG4ocil7aWYoZW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gV2Uocil7cmV0dXJuIHRuKHIpLm1lc3NhZ2V9dmFyIGplOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KShqZXx8KGplPXt9KSk7Y29uc3Qgcm49NTAwLG5uPS44O2NsYXNzIHNuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1idCgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQobil9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaCh0KXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodCkpLmJ1aWxkKCk7RC5yZXBvcnQobik7Y29uc3Qgcz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixzKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4scyxvLGE7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSx0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShzPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9zOjAsKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgoYT0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6YS5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PXJuJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaCh1KXtjb25zdCBjPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3RyYW5zZm9ybSkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKHUpKS5idWlsZCgpO0QucmVwb3J0KGMpO2NvbnN0IG09e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnUsZnVuY3Rpb246InRyYW5zZm9ybSJ9O3RoaXMuZW1pdCgiZXJyb3IiLG0pfX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKG4pe2NvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfZmx1c2gpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZShuKSkuYnVpbGQoKTtELnJlcG9ydChzKTtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjpuLGZ1bmN0aW9uOiJmbHVzaCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG8pfX10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKTtjb25zdCB0PW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCl9c3RvcCgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFN0b3Agc3RyZWFtLiIpLHRoaXMuc2hvdWxkU3RvcF89ITB9bWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpe2xldCBlPShEYXRlLm5vdygpLXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXykvMWUzLHQ9dGhpcy5mcmFtZXNGcm9tU291cmNlXy9lLG49dGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8vZTtpZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKm5uPnQpe2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOmplLkZQU19EUk9QLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBzPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtELnJlcG9ydChzKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3Mgb24gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49bmV3IHNuKGVbdF0sdCk7bi5vbigiZXJyb3IiLHM9Pnt0aGlzLmVtaXQoImVycm9yIixzKX0pLG4ub24oIndhcm4iLHM9Pnt0aGlzLmVtaXQoIndhcm4iLHMpfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gobil9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgbj1lO2ZvcihsZXQgcyBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0ocykpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBuLmNhbmNlbCgpfSkuY2F0Y2goYXN5bmMgcz0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChzKSxhd2FpdCBuLmNhbmNlbChzKX0pfWNhdGNoe3RoaXMuZGVzdHJveSgpO3JldHVybn1jb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIGFuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMudXVpZF89YnQoKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO0QucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtELnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKX10aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpLHRoaXMucGlwZWxpbmVfPW5ldyBvbih0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChuPT57dChuKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQudXBkYXRlcy50cmFuc2Zvcm1lcl9uZXcpLnZhcmlhdGlvbigiVXBkYXRlIikuYnVpbGQoKTtyZXR1cm4gRC5yZXBvcnQodCksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCksZSgpfSl9fXZhciBfZTsoZnVuY3Rpb24ocil7ci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIn0pKF9lfHwoX2U9e30pKTtjbGFzcyBQdHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5maWx0ZXI9dGhpcy5ibHVyRmlsdGVyXyxlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNsYXNzIHVue2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuaW1hZ2VDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLmltYWdlQ3R4Xz10aGlzLmltYWdlQ2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLHdpbGxSZWFkRnJlcXVlbnRseTohMCxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLmltYWdlQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7dGhpcy5pbWFnZUJsb2JfPXZvaWQgMCxmZXRjaChlKS50aGVuKHQ9Pnt0LmJsb2IoKS50aGVuKG49Pnt0aGlzLmltYWdlQmxvYl89bn0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJibG9iIGVycm9yIixuKX0pfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoImZldGNoIGVycm9yIix0KX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKHR5cGVvZiB0aGlzLmltYWdlQmxvYl8hPSJ1bmRlZmluZWQiJiYodGhpcy5pbWFnZUNhbnZhc18ud2lkdGghPXQud2lkdGh8fHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCE9dC5oZWlnaHQpKXt0aGlzLmltYWdlQ2FudmFzXy53aWR0aD10LndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodD10LmhlaWdodDtjb25zdCBuPSJoaWdoIixzPXtyZXNpemVXaWR0aDp0LndpZHRoLHJlc2l6ZUhlaWdodDp0LmhlaWdodCxyZXNpemVRdWFsaXR5Om59LG89Y3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5pbWFnZUJsb2JfLHMpLnRoZW4oYT0+e3RoaXMuaW1hZ2VDdHhfLmRyYXdJbWFnZShhLDAsMCl9KS5jYXRjaChhPT57Y29uc29sZS5lcnJvcigiZXJyb3IgY3JlYXRlSW1hZ2VCaXRtYXAiLGEpfSl9ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZHJhd0ltYWdlKHRoaXMuaW1hZ2VDYW52YXNfLDAsMCx0aGlzLmltYWdlQ2FudmFzXy53aWR0aCx0aGlzLmltYWdlQ2FudmFzXy5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlydHVhbFBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgZm57Y29uc3RydWN0b3IoZT0xLzApe3RoaXMuY2FwYWNpdHk9ZSx0aGlzLnN0b3JhZ2U9W119ZW5xdWV1ZShlKXtpZih0aGlzLnNpemUoKT09PXRoaXMuY2FwYWNpdHkpdGhyb3cgRXJyb3IoIlF1ZXVlIGhhcyByZWFjaGVkIG1heCBjYXBhY2l0eSwgeW91IGNhbm5vdCBhZGQgbW9yZSBpdGVtcyIpO3RoaXMuc3RvcmFnZS5wdXNoKGUpfWRlcXVldWUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLnNoaWZ0KCl9c2l6ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2UubGVuZ3RofX1jbGFzcyBsbntjb25zdHJ1Y3RvcihlKXtjb25zb2xlLmxvZygiW1ZpZGVvUG9zdFByb2Nlc3NdIEN0b3IiKSx0aGlzLnF1ZXVlXz1uZXcgZm4sZSYmKHRoaXMuZnJhbWVSZWFkZXJfPWUuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXByb2Nlc3NGcmFtZShlKXtlLmRvbmV8fCh0aGlzLnF1ZXVlXy5lbnF1ZXVlKGUudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHRoaXMucHJvY2Vzc0ZyYW1lLmJpbmQodGhpcykpLmNhdGNoKHQ9PmNvbnNvbGUuZXJyb3IodCkpKX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtpZihlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IG49dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UuZHJhd0ltYWdlKG4sMCwwLHQud2lkdGgsdC5oZWlnaHQpLG4uY2xvc2UoKX1lbHNlIGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWZ1bmN0aW9uIGNuKCl7cmV0dXJuInNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIn12YXIgeWU9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZSE9InVuZGVmaW5lZCI/ZTp7fSxuLHM7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihpLGwpe249aSxzPWx9KTt2YXIgbz17fSxhO2ZvcihhIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShhKSYmKG9bYV09dFthXSk7dmFyIHU9Ii4vdGhpcy5wcm9ncmFtIixjPWZ1bmN0aW9uKGksbCl7dGhyb3cgbH0sbT0hMCxmPSIiO2Z1bmN0aW9uIGQoaSl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoaSxmKTpmK2l9dmFyIFI7dHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGY9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihmPXIpLGYuaW5kZXhPZigiYmxvYjoiKSE9PTA/Zj1mLnN1YnN0cigwLGYucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpmPSIiO3ZhciB2PXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksTT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IoYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJih0W2FdPW9bYV0pO289bnVsbCx0LmFyZ3VtZW50cyx0LnRoaXNQcm9ncmFtJiYodT10LnRoaXNQcm9ncmFtKSx0LnF1aXQmJihjPXQucXVpdCk7dmFyIEE7dC53YXNtQmluYXJ5JiYoQT10Lndhc21CaW5hcnkpO3ZhciBUPXQubm9FeGl0UnVudGltZXx8ITA7dHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmSCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBPLEk9ITEsdmU9dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gWChpLGwsaCl7Zm9yKHZhciBnPWwraCx5PWw7aVt5XSYmISh5Pj1nKTspKyt5O2lmKHktbD4xNiYmaS5zdWJhcnJheSYmdmUpcmV0dXJuIHZlLmRlY29kZShpLnN1YmFycmF5KGwseSkpO2Zvcih2YXIgRT0iIjtsPHk7KXt2YXIgXz1pW2wrK107aWYoIShfJjEyOCkpe0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoXyk7Y29udGludWV9dmFyIEM9aVtsKytdJjYzO2lmKChfJjIyNCk9PTE5Mil7RSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoXyYzMSk8PDZ8Qyk7Y29udGludWV9dmFyIFU9aVtsKytdJjYzO2lmKChfJjI0MCk9PTIyND9fPShfJjE1KTw8MTJ8Qzw8NnxVOl89KF8mNyk8PDE4fEM8PDEyfFU8PDZ8aVtsKytdJjYzLF88NjU1MzYpRSs9U3RyaW5nLmZyb21DaGFyQ29kZShfKTtlbHNle3ZhciBrdD1fLTY1NTM2O0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8a3Q+PjEwLDU2MzIwfGt0JjEwMjMpfX1yZXR1cm4gRX1mdW5jdGlvbiB3ZShpLGwpe3JldHVybiBpP1goZWUsaSxsKToiIn1mdW5jdGlvbiBfbihpLGwsaCl7Zm9yKHZhciBnPTA7ZzxpLmxlbmd0aDsrK2cpYmVbbCsrPj4wXT1pLmNoYXJDb2RlQXQoZyk7aHx8KGJlW2w+PjBdPTApfWZ1bmN0aW9uIHluKGksbCl7cmV0dXJuIGklbD4wJiYoaSs9bC1pJWwpLGl9dmFyIE90LGJlLGVlLHg7ZnVuY3Rpb24gU3QoaSl7T3Q9aSx0LkhFQVA4PWJlPW5ldyBJbnQ4QXJyYXkoaSksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkoaSksdC5IRUFQMzI9eD1uZXcgSW50MzJBcnJheShpKSx0LkhFQVBVOD1lZT1uZXcgVWludDhBcnJheShpKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGkpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkoaSksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoaSksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoaSl9dC5JTklUSUFMX01FTU9SWTt2YXIgemUsTXQ9W10sQXQ9W10sSXQ9W10sdm49MDtmdW5jdGlvbiB3bigpe3JldHVybiBUfHx2bj4wfWZ1bmN0aW9uIGJuKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspQ24odC5wcmVSdW4uc2hpZnQoKSk7SmUoTXQpfWZ1bmN0aW9uIEVuKCl7SmUoQXQpfWZ1bmN0aW9uIFRuKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOylQbih0LnBvc3RSdW4uc2hpZnQoKSk7SmUoSXQpfWZ1bmN0aW9uIENuKGkpe010LnVuc2hpZnQoaSl9ZnVuY3Rpb24gUm4oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBQbihpKXtJdC51bnNoaWZ0KGkpfXZhciBqPTAsdGU9bnVsbDtmdW5jdGlvbiBPbihpKXtqKyssdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoail9ZnVuY3Rpb24gU24oaSl7aWYoai0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGopLGo9PTAmJnRlKXt2YXIgbD10ZTt0ZT1udWxsLGwoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gSChpKXt0Lm9uQWJvcnQmJnQub25BYm9ydChpKSxpPSJBYm9ydGVkKCIraSsiKSIsTShpKSxJPSEwLGkrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgbD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGkpO3Rocm93IHMobCksbH12YXIgTW49ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIHh0KGkpe3JldHVybiBpLnN0YXJ0c1dpdGgoTW4pfXZhciBGO0Y9InRmbGl0ZS1zaW1kLndhc20iLHh0KEYpfHwoRj1kKEYpKTtmdW5jdGlvbiBGdChpKXt0cnl7aWYoaT09RiYmQSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQSk7aWYoIVIpdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKGwpe0gobCl9fWZ1bmN0aW9uIEFuKCl7cmV0dXJuIUEmJm0mJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihpKXtpZighaS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK0YrIiciO3JldHVybiBpLmFycmF5QnVmZmVyKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBGdChGKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRnQoRil9KX1mdW5jdGlvbiBJbigpe3ZhciBpPXthOllufTtmdW5jdGlvbiBsKF8sQyl7dmFyIFU9Xy5leHBvcnRzO3QuYXNtPVUsTz10LmFzbS5xLFN0KE8uYnVmZmVyKSx6ZT10LmFzbS5ELFJuKHQuYXNtLnIpLFNuKCl9T24oKTtmdW5jdGlvbiBoKF8pe2woXy5pbnN0YW5jZSl9ZnVuY3Rpb24gZyhfKXtyZXR1cm4gQW4oKS50aGVuKGZ1bmN0aW9uKEMpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShDLGkpfSkudGhlbihmdW5jdGlvbihDKXtyZXR1cm4gQ30pLnRoZW4oXyxmdW5jdGlvbihDKXtNKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK0MpLEgoQyl9KX1mdW5jdGlvbiB5KCl7cmV0dXJuIUEmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09ImZ1bmN0aW9uIiYmIXh0KEYpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goRix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oXyl7dmFyIEM9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoXyxpKTtyZXR1cm4gQy50aGVuKGgsZnVuY3Rpb24oVSl7cmV0dXJuIE0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK1UpLE0oImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksZyhoKX0pfSk6ZyhoKX1pZih0Lmluc3RhbnRpYXRlV2FzbSl0cnl7dmFyIEU9dC5pbnN0YW50aWF0ZVdhc20oaSxsKTtyZXR1cm4gRX1jYXRjaChfKXtyZXR1cm4gTSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitfKSwhMX1yZXR1cm4geSgpLmNhdGNoKHMpLHt9fWZ1bmN0aW9uIEplKGkpe2Zvcig7aS5sZW5ndGg+MDspe3ZhciBsPWkuc2hpZnQoKTtpZih0eXBlb2YgbD09ImZ1bmN0aW9uIil7bCh0KTtjb250aW51ZX12YXIgaD1sLmZ1bmM7dHlwZW9mIGg9PSJudW1iZXIiP2wuYXJnPT09dm9pZCAwP3plLmdldChoKSgpOnplLmdldChoKShsLmFyZyk6aChsLmFyZz09PXZvaWQgMD9udWxsOmwuYXJnKX19ZnVuY3Rpb24geG4oaSxsLGgsZyl7SCgiQXNzZXJ0aW9uIGZhaWxlZDogIit3ZShpKSsiLCBhdDogIitbbD93ZShsKToidW5rbm93biBmaWxlbmFtZSIsaCxnP3dlKGcpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIEZuKGksbCl7SCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gTG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBrbigpe0goIiIpfXZhciBFZTtFZT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIERuPSEwO2Z1bmN0aW9uIFVuKGkpe3JldHVybiB4W0x0KCk+PjJdPWksaX1mdW5jdGlvbiBCbihpLGwpe3ZhciBoO2lmKGk9PT0wKWg9RGF0ZS5ub3coKTtlbHNlIGlmKChpPT09MXx8aT09PTQpJiZEbiloPUVlKCk7ZWxzZSByZXR1cm4gVW4oMjgpLC0xO3JldHVybiB4W2w+PjJdPWgvMWUzfDAseFtsKzQ+PjJdPWglMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIE5uKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSG4oaSxsLGgpe2VlLmNvcHlXaXRoaW4oaSxsLGwraCl9ZnVuY3Rpb24gJG4oaSl7dHJ5e3JldHVybiBPLmdyb3coaS1PdC5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLFN0KE8uYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gV24oaSl7dmFyIGw9ZWUubGVuZ3RoO2k9aT4+PjA7dmFyIGg9MjE0NzQ4MzY0ODtpZihpPmgpcmV0dXJuITE7Zm9yKHZhciBnPTE7Zzw9NDtnKj0yKXt2YXIgeT1sKigxKy4yL2cpO3k9TWF0aC5taW4oeSxpKzEwMDY2MzI5Nik7dmFyIEU9TWF0aC5taW4oaCx5bihNYXRoLm1heChpLHkpLDY1NTM2KSksXz0kbihFKTtpZihfKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGpuKGkpe2Zvcih2YXIgbD1FZSgpO0VlKCktbDxpOyk7fXZhciBHZT17fTtmdW5jdGlvbiBxbigpe3JldHVybiB1fHwiLi90aGlzLnByb2dyYW0ifWZ1bmN0aW9uIHJlKCl7aWYoIXJlLnN0cmluZ3Mpe3ZhciBpPSh0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLGw9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzppLF86cW4oKX07Zm9yKHZhciBoIGluIEdlKUdlW2hdPT09dm9pZCAwP2RlbGV0ZSBsW2hdOmxbaF09R2VbaF07dmFyIGc9W107Zm9yKHZhciBoIGluIGwpZy5wdXNoKGgrIj0iK2xbaF0pO3JlLnN0cmluZ3M9Z31yZXR1cm4gcmUuc3RyaW5nc312YXIgVGU9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihpLGwpe3ZhciBoPVRlLmJ1ZmZlcnNbaV07bD09PTB8fGw9PT0xMD8oKGk9PT0xP3Y6TSkoWChoLDApKSxoLmxlbmd0aD0wKTpoLnB1c2gobCl9LHZhcmFyZ3M6dm9pZCAwLGdldDpmdW5jdGlvbigpe1RlLnZhcmFyZ3MrPTQ7dmFyIGk9eFtUZS52YXJhcmdzLTQ+PjJdO3JldHVybiBpfSxnZXRTdHI6ZnVuY3Rpb24oaSl7dmFyIGw9d2UoaSk7cmV0dXJuIGx9LGdldDY0OmZ1bmN0aW9uKGksbCl7cmV0dXJuIGl9fTtmdW5jdGlvbiBWbihpLGwpe3ZhciBoPTA7cmV0dXJuIHJlKCkuZm9yRWFjaChmdW5jdGlvbihnLHkpe3ZhciBFPWwraDt4W2kreSo0Pj4yXT1FLF9uKGcsRSksaCs9Zy5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gem4oaSxsKXt2YXIgaD1yZSgpO3hbaT4+Ml09aC5sZW5ndGg7dmFyIGc9MDtyZXR1cm4gaC5mb3JFYWNoKGZ1bmN0aW9uKHkpe2crPXkubGVuZ3RoKzF9KSx4W2w+PjJdPWcsMH1mdW5jdGlvbiBKbihpKXtlcyhpKX1mdW5jdGlvbiBHbihpKXtyZXR1cm4gMH1mdW5jdGlvbiBRbihpLGwsaCxnLHkpe31mdW5jdGlvbiBYbihpLGwsaCxnKXtmb3IodmFyIHk9MCxFPTA7RTxoO0UrKyl7Zm9yKHZhciBfPXhbbCtFKjg+PjJdLEM9eFtsKyhFKjgrNCk+PjJdLFU9MDtVPEM7VSsrKVRlLnByaW50Q2hhcihpLGVlW18rVV0pO3krPUN9cmV0dXJuIHhbZz4+Ml09eSwwfWZ1bmN0aW9uIEtuKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgaT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpKSxpWzBdfX1lbHNlIHJldHVybiBmdW5jdGlvbigpe0goInJhbmRvbURldmljZSIpfX1mdW5jdGlvbiBDZShpLGwpe0NlLnJhbmRvbURldmljZXx8KENlLnJhbmRvbURldmljZT1LbigpKTtmb3IodmFyIGg9MDtoPGw7aCsrKWJlW2kraD4+MF09Q2UucmFuZG9tRGV2aWNlKCk7cmV0dXJuIDB9dmFyIFluPXthOnhuLGU6Rm4sZDpMbixiOmtuLG46Qm4saDpObixsOkhuLG06V24scDpqbixmOlZuLGc6em4sajpKbixpOkduLGs6UW4sYzpYbixvOkNlfTtJbigpLHQuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX19fd2FzbV9jYWxsX2N0b3JzPXQuYXNtLnIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9dC5hc20ucykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD10LmFzbS50KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0SGVpZ2h0PXQuYXNtLnUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dFdpZHRoPXQuYXNtLnYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9dC5hc20udykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PXQuYXNtLngpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dEhlaWdodD10LmFzbS55KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dFdpZHRoPXQuYXNtLnopLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dENoYW5uZWxDb3VudD10LmFzbS5BKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2xvYWRNb2RlbD1mdW5jdGlvbigpe3JldHVybih0Ll9sb2FkTW9kZWw9dC5hc20uQikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9ydW5JbmZlcmVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4odC5fcnVuSW5mZXJlbmNlPXQuYXNtLkMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEx0PXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oTHQ9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5FKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJlO2Z1bmN0aW9uIFpuKGkpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIraSsiKSIsdGhpcy5zdGF0dXM9aX10ZT1mdW5jdGlvbiBpKCl7UmV8fFFlKCksUmV8fCh0ZT1pKX07ZnVuY3Rpb24gUWUoaSl7aWYoaj4wfHwoYm4oKSxqPjApKXJldHVybjtmdW5jdGlvbiBsKCl7UmV8fChSZT0hMCx0LmNhbGxlZFJ1bj0hMCwhSSYmKEVuKCksbih0KSx0Lm9uUnVudGltZUluaXRpYWxpemVkJiZ0Lm9uUnVudGltZUluaXRpYWxpemVkKCksVG4oKSkpfXQuc2V0U3RhdHVzPyh0LnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZXRTdGF0dXMoIiIpfSwxKSxsKCl9LDEpKTpsKCl9dC5ydW49UWU7ZnVuY3Rpb24gZXMoaSxsKXt0cyhpKX1mdW5jdGlvbiB0cyhpKXt3bigpfHwodC5vbkV4aXQmJnQub25FeGl0KGkpLEk9ITApLGMoaSxuZXcgWm4oaSkpfWlmKHQucHJlSW5pdClmb3IodHlwZW9mIHQucHJlSW5pdD09ImZ1bmN0aW9uIiYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7dC5wcmVJbml0Lmxlbmd0aD4wOyl0LnByZUluaXQucG9wKCkoKTtyZXR1cm4gUWUoKSxlLnJlYWR5fX0oKTt0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiP21vZHVsZS5leHBvcnRzPXllOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHllfSk6dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiYoZXhwb3J0cy5jcmVhdGVWb25hZ2VURkxpdGVTaW1kTW9kdWxlPXllKTtjbGFzcyBobntjb25zdHJ1Y3Rvcigpe3RoaXMuaXNTSU1EU3VwcG9ydGVkXz0hMSx0aGlzLmlzVGhyZWFkc1N1cHBvcnRlZF89ITEsdGhpcy5pbnB1dFdpZHRoXz0wLHRoaXMuaW5wdXRIZWlnaHRfPTAsdGhpcy5pbnB1dENoYW5uZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0V2lkdGhfPTAsdGhpcy5vdXRwdXRIZWlnaHRfPTAsdGhpcy5vdXRwdXRDaGFubmVsQ291bnRfPTAsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPTB9fWFzeW5jIGZ1bmN0aW9uIGRuKHIsZSl7bGV0IHQ9bmV3IGhuO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsbyl7YXN5bmMgZnVuY3Rpb24gYSgpe3JldHVybiB5ZSh7bG9jYXRlRmlsZTpmdW5jdGlvbihtKXtyZXR1cm4gcittfX0pfWFzeW5jIGZ1bmN0aW9uIHUoYyl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKG0sZik9Pntjb25zdCBkPWM7aWYodHlwZW9mIGQ9PSJ1bmRlZmluZWQiKXJldHVybiBmKCJURkxpdGUgYmFja2VuZCB1bmF2YWlsYWJsZTogd2FzbVNpbWQiKTtjb25zdCBSPWNuKCk7Y29uc29sZS5sb2coIkxvYWRpbmcgdGZsaXRlIG1vZGVsOiIsUik7bGV0IHY9ZStgJHtSfS50ZmxpdGVgO2NvbnNvbGUubG9nKCJURkxpdGUgbW9kZWxVcmw6ICIrdik7dHJ5e2NvbnN0IEE9YXdhaXQoYXdhaXQgZmV0Y2godikpLmFycmF5QnVmZmVyKCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBzaXplOiIsQS5ieXRlTGVuZ3RoKTtjb25zdCBUPWQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBtZW1vcnkgb2Zmc2V0OiIsVCksY29uc29sZS5sb2coIkxvYWRpbmcgbW9kZWwgYnVmZmVyLi4uIiksZC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KEEpLFQpO2NvbnN0IE89ZC5fbG9hZE1vZGVsKEEuYnl0ZUxlbmd0aCk7aWYoY29uc29sZS5sb2coIkxvYWQgbW9kZWwgcmVzdWx0OiIsTyksTyE9PTApe2YoIkNhbm5vdCBsb2FkIG1vZGVsIik7cmV0dXJufXQuaW5wdXRXaWR0aF89ZC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHRfPWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudF89ZC5fZ2V0SW5wdXRDaGFubmVsQ291bnQoKSx0LmlucHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0XyksY29uc29sZS5sb2coIklucHV0IHdpZHRoOiIsdC5pbnB1dFdpZHRoXyksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudF8pLHQub3V0cHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSx0Lm91dHB1dFdpZHRoXz1kLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0Xz1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudF89ZC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCksY29uc29sZS5sb2coIk91dHB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5vdXRwdXRNZW1vcnlPZmZzZXRfKSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0XyksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGhfKSxjb25zb2xlLmxvZygiT3V0cHV0IGNoYW5uZWxzOiIsdC5vdXRwdXRDaGFubmVsQ291bnRfKSx0LnNlbGVjdGVkVEZMaXRlXz1kfWNhdGNoKE0pe2YoTSk7cmV0dXJufW0oKX0pfWEoKS50aGVuKGM9PntpZihjPT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjt1KGMpLnRoZW4obT0+e3ModCl9KS5jYXRjaChtPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKGM9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsYyksbygibG9hZFRGTGl0ZSBlcnJvcjoiK2MpfSl9KTtyZXR1cm4gbn1jbGFzcyBwbntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNvbnN0IFE9Y2xhc3N7Y29uc3RydWN0b3Iocil7aWYodGhpcy5jb25maWdfPXIsdGhpcy5mcmFtZUNvdW50ZXJfPTAsdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz0wLHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF89dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPTAsdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MCxyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCI/KHRoaXMudGltZXJHYXBfPVEuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHVuKHIuYmFja2dyb3VuZEFzc2V0VXJpKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iQmFja2dyb3VuZEJsdXIiPyh0aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBQdChyLnJhZGl1cykpOnIudHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCI/dGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORDpyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHBuKHIucmFkaXVzKSk6KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IFB0KX1pbml0KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnthd2FpdCBkbih0aGlzLmNvbmZpZ18ud2FzbUFzc2V0VXJpUGF0aCx0aGlzLmNvbmZpZ18udGZsaXRlQXNzZXRVcmlQYXRoKS50aGVuKHQ9Pnt0JiYodGhpcy52b2FuZ2VURkxpdGVJbmZvXz10LHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18ud2lkdGg9dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8qdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8sdGhpcy5zZWdtZW50YXRpb25NYXNrXz1uZXcgSW1hZ2VEYXRhKHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRNZW1vcnlPZmZzZXRfLzQsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18ub3V0cHV0TWVtb3J5T2Zmc2V0Xy80LHIoKSl9KS5jYXRjaCh0PT57Y29uc29sZS5sb2coImVycm9yIHVzZVRGTGl0ZToiLHQpLGUodCl9KX0pfWFzeW5jIHN0YXJ0KCl7aWYodHlwZW9mIHRoaXMudm9hbmdlVEZMaXRlSW5mb189PSJ1bmRlZmluZWQiKXRocm93InRyYW5zZm9ybWVyIG5vdCBpbml0In1hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCksKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCE9ci5kaXNwbGF5V2lkdGh8fHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQhPXIuZGlzcGxheUhlaWdodCkmJih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGg9ci5kaXNwbGF5V2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodD1yLmRpc3BsYXlIZWlnaHQpO2NvbnN0IHQ9ci50aW1lc3RhbXA7Y3JlYXRlSW1hZ2VCaXRtYXAocikudGhlbihuPT57ci5jbG9zZSgpLHRoaXMucHJvY2Vzc0ZyYW1lKGUsbix0KX0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJjcmVhdGVJbWFnZUJpdG1hcCIsbiksZS5lbnF1ZXVlKHIpfSl9cHJvY2Vzc0ZyYW1lKHIsZSx0KXt0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfJiYodGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz10LHRoaXMucHJvY2Vzc1NvdXJjZShlKSksdGhpcy5yZXN1bHRDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18sMCwwLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0KSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHIuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSh0aGlzLnJlc3VsdENhbnZhc18se3RpbWVzdGFtcDp0LGFscGhhOiJkaXNjYXJkIn0pKSx0aGlzLmZyYW1lQ291bnRlcl8rK31wcm9jZXNzU291cmNlKHIpe3RoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmdldEltYWdlRGF0YSgwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyk7Zm9yKGxldCB0PTA7dDx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfO3QrKyl0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLnNlbGVjdGVkVEZMaXRlXy5IRUFQRjMyW3RoaXMuaW5wdXRNZW1vcnlPZmZzZXRfK3QqM109ZS5kYXRhW3QqNF0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzFdPWUuZGF0YVt0KjQrMV0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzJdPWUuZGF0YVt0KjQrMl0vMjU1O3RoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLl9ydW5JbmZlcmVuY2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXtjb25zdCBuPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfK3RdO3RoaXMuc2VnbWVudGF0aW9uTWFza18uZGF0YVt0KjQrM109MjU1Km59dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5wdXRJbWFnZURhdGEodGhpcy5zZWdtZW50YXRpb25NYXNrXywwLDApLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXywwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpfWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXNldFZpZGVvQkdSZWFkYWJsZShyKXt0aGlzLmNvbmZpZ18udHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCImJih0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgbG4ocikpfX07bGV0IHFlPVE7cWUuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MmU1LHFlLlZJUlRVQUxfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EPTE1ZTQ7ZnVuY3Rpb24gbW4ocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIGduKHIpe2lmKG1uKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFZlKHIpe3JldHVybiB0eXBlb2Ygcj09InVuZGVmaW5lZCI/IiI6Z24ocikubWVzc2FnZX1pZih0eXBlb2YgaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIil7bGV0IHI9bmV3IGFuO3Iub24oImVycm9yIixlPT57Y29uc3QgdD17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksci5vbigid2FybiIsZT0+e2NvbnN0IHQ9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksb25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdHtvcGVyYXRpb246dH09ZS5kYXRhO2lmKGNvbnNvbGUubG9nKCJvcGVyYXRpb249Iix0KSx0PT09InRyYW5zZm9ybSIpe2NvbnN0e3JlYWRhYmxlOm4sd3JpdGFibGU6cyxjb25maWc6byx2aWRlb0JHUmVhZGFibGU6YX09ZS5kYXRhO2xldCB1PVtdO2NvbnN0IGM9bmV3IHFlKEpTT04ucGFyc2UobykpO2Muc2V0VmlkZW9CR1JlYWRhYmxlKGEpLGMuaW5pdCgpLnRoZW4oKCk9Pnt1LnB1c2goYyksci5zZXRUcmFuc2Zvcm1lcnModSkudGhlbigoKT0+e3IudHJhbnNmb3JtKG4scykudGhlbigoKT0+e2NvbnN0IG09e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobSkpfSkuY2F0Y2gobT0+e2NvbnN0IGY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUobSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGYpKX0pfSl9KS5jYXRjaChtPT57Y29uc3QgZj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShtKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZikpfSl9ZWxzZSB0PT09ImRlc3Ryb3kiP3IuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBuPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShuKSl9KS5jYXRjaChuPT57Y29uc3Qgcz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShuKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkocykpfSk6dD09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJnIuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZS5kYXRhLnJhdGUpfX19KSgpOwo=",ql=typeof window!="undefined"&&window.Blob&&new Blob([atob(_l)],{type:"text/javascript;charset=utf-8"});function pc(){const Z=ql&&(window.URL||window.webkitURL).createObjectURL(ql);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+_l,{type:"module"})}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}const R=new WeakMap,ll=new WeakMap,U=new WeakMap,pl=Symbol("anyProducer"),ld=Promise.resolve(),dl=Symbol("listenerAdded"),cl=Symbol("listenerRemoved");let yl=!1;function N(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Zl(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function F(Z,l){const d=ll.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function B(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:pl,c=U.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function yc(Z,l,d){const c=U.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(pl)){const b=Promise.all([l,d]);for(const e of c.get(pl))e.enqueue(b)}}function dd(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(n){b.push(n),c()},finish(){d=!0,c()}};for(const n of l)B(Z,n).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(n=>{c=n}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(n){b=void 0;for(const t of l)B(Z,t).delete(e);return c(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cd(Z){if(Z===void 0)return Zd;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Zd.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const Vl=Z=>Z===dl||Z===cl;class Y{static mixin(l,d){return d=cd(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const n of d)if(c.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new Y}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=n=>function(...t){return this[l][n](...t)};for(const n of d)Object.defineProperty(c.prototype,n,{enumerable:!1,value:e(n)});return c}}static get isDebugEnabled(){if(typeof process!="object")return yl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||yl}static set isDebugEnabled(l){yl=l}constructor(l={}){R.set(this,new Set),ll.set(this,new Map),U.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const n=new Date,t=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${t}][emittery:${d}][${c}] Event Name: ${b}
4
- data: ${e}`)})}logIfDebugEnabled(l,d,c){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)N(c),F(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),Vl(c)||this.emit(dl,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)N(c),F(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),Vl(c)||this.emit(cl,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)N(d);return dd(this,l)}async emit(l,d){N(l),this.logIfDebugEnabled("emit",l,d),yc(this,l,d);const c=F(this,l),b=R.get(this),e=[...c],n=Vl(l)?[]:[...b];await ld,await Promise.all([...e.map(async t=>{if(c.has(t))return t(d)}),...n.map(async t=>{if(b.has(t))return t(l,d)})])}async emitSerial(l,d){N(l),this.logIfDebugEnabled("emitSerial",l,d);const c=F(this,l),b=R.get(this),e=[...c],n=[...b];await ld;for(const t of e)c.has(t)&&await t(d);for(const t of n)b.has(t)&&await t(l,d)}onAny(l){return Zl(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(l),this.emit(dl,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return dd(this)}offAny(l){Zl(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(cl,{listener:l}),R.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){F(this,d).clear();const c=B(this,d);for(const b of c)b.finish();c.clear()}else{R.get(this).clear();for(const c of ll.get(this).values())c.clear();for(const c of U.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=R.get(this).size+F(this,c).size+B(this,c).size+B(this).size;continue}typeof c!="undefined"&&N(c),d+=R.get(this).size;for(const b of ll.get(this).values())d+=b.size;for(const b of U.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=cd(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Zd=Object.getOwnPropertyNames(Y.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:dl,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:cl,writable:!1,enumerable:!0,configurable:!1});var Vc=Y;class Rc extends Vc{constructor(l){super();this.config_=l,this.worker_=new pc,this.trackExpectedRate_=-1,this.workerInited_=!1,this.onMessage_=new Promise((d,c)=>{this.worker_.addEventListener("message",b=>{let e=JSON.parse(b.data);e.callbackType==="success"?d():e.callbackType==="error"?c(e.message):e.callbackType==="media_processor_error_event"?this.emit("error",e.message):e.callbackType==="media_processor_warn_event"&&this.emit("warn",e.message)})})}transform(l,d){return new Promise(async(c,b)=>{if(this.config_.transformerType==="VideoBackground"){const e=document.createElement("video");e.src=this.config_.backgroundAssetUri,e.muted=!0;try{await e.play()}catch(s){b(s);return}const n=e.captureStream().getVideoTracks()[0],m=new MediaStreamTrackProcessor(n).readable;this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),videoBGReadable:m},[l,d,m])}else this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_)},[l,d]);this.onMessage_.then(()=>{console.log("Worker inited"),this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),c()}).catch(e=>{console.log("Worker inited error"),b(e)})})}destroy(){return new Promise(async(l,d)=>{this.worker_.postMessage({operation:"destroy"}),this.onMessage_.then(()=>{console.log("Worker destroyed"),l()}).catch(c=>{console.log("Worker destroy error"),d(c)})})}setTrackExpectedRate(l){this.trackExpectedRate_=l,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}}r.BlurRadius=void 0,function(Z){Z.Low="Low",Z.High="High"}(r.BlurRadius||(r.BlurRadius={}));const Yc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Jc(){return new Promise(async(Z,l)=>{try{await g()}catch(d){l(d);return}Yc().then(d=>{if(d===!1){l("Your browser does not support WebAssembly features.");return}Z()}).catch(d=>{l(d)})})}let v,bl=-1;function Ic(){return v}function Kc(Z){bl=Z,typeof v!="undefined"&&v.setTrackExpectedRate(bl)}function fc(Z){return new Promise(async(l,d)=>{v=new Rc(Z),bl!=-1&&v.setTrackExpectedRate(bl);const c=new hc(v);l(c)})}r.createVonageMediaProcessorConnector=fc,r.getVonageEventEmitter=Ic,r.isSupported=Jc,r.setTrackExpectedRate=Kc,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(r,F){typeof exports=="object"&&typeof module!="undefined"?F(exports):typeof define=="function"&&define.amd?define(["exports"],F):(r=typeof globalThis!="undefined"?globalThis:r||self,F(r["ml-transformers"]={}))})(this,function(r){"use strict";function F(){return new Promise((Z,l)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?l("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):Z()})}var Yl={exports:{}},Jl=function(l,d){return function(){for(var b=new Array(arguments.length),e=0;e<b.length;e++)b[e]=arguments[e];return l.apply(d,b)}},ed=Jl,V=Object.prototype.toString;function tl(Z){return Array.isArray(Z)}function el(Z){return typeof Z=="undefined"}function nd(Z){return Z!==null&&!el(Z)&&Z.constructor!==null&&!el(Z.constructor)&&typeof Z.constructor.isBuffer=="function"&&Z.constructor.isBuffer(Z)}function Il(Z){return V.call(Z)==="[object ArrayBuffer]"}function id(Z){return V.call(Z)==="[object FormData]"}function md(Z){var l;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?l=ArrayBuffer.isView(Z):l=Z&&Z.buffer&&Il(Z.buffer),l}function ud(Z){return typeof Z=="string"}function od(Z){return typeof Z=="number"}function Kl(Z){return Z!==null&&typeof Z=="object"}function T(Z){if(V.call(Z)!=="[object Object]")return!1;var l=Object.getPrototypeOf(Z);return l===null||l===Object.prototype}function sd(Z){return V.call(Z)==="[object Date]"}function ad(Z){return V.call(Z)==="[object File]"}function Xd(Z){return V.call(Z)==="[object Blob]"}function fl(Z){return V.call(Z)==="[object Function]"}function hd(Z){return Kl(Z)&&fl(Z.pipe)}function rd(Z){return V.call(Z)==="[object URLSearchParams]"}function Gd(Z){return Z.trim?Z.trim():Z.replace(/^\s+|\s+$/g,"")}function Wd(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function nl(Z,l){if(!(Z===null||typeof Z=="undefined"))if(typeof Z!="object"&&(Z=[Z]),tl(Z))for(var d=0,c=Z.length;d<c;d++)l.call(null,Z[d],d,Z);else for(var b in Z)Object.prototype.hasOwnProperty.call(Z,b)&&l.call(null,Z[b],b,Z)}function il(){var Z={};function l(b,e){T(Z[e])&&T(b)?Z[e]=il(Z[e],b):T(b)?Z[e]=il({},b):tl(b)?Z[e]=b.slice():Z[e]=b}for(var d=0,c=arguments.length;d<c;d++)nl(arguments[d],l);return Z}function pd(Z,l,d){return nl(l,function(b,e){d&&typeof b=="function"?Z[e]=ed(b,d):Z[e]=b}),Z}function Vd(Z){return Z.charCodeAt(0)===65279&&(Z=Z.slice(1)),Z}var a={isArray:tl,isArrayBuffer:Il,isBuffer:nd,isFormData:id,isArrayBufferView:md,isString:ud,isNumber:od,isObject:Kl,isPlainObject:T,isUndefined:el,isDate:sd,isFile:ad,isBlob:Xd,isFunction:fl,isStream:hd,isURLSearchParams:rd,isStandardBrowserEnv:Wd,forEach:nl,merge:il,extend:pd,trim:Gd,stripBOM:Vd},I=a;function Sl(Z){return encodeURIComponent(Z).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Nl=function(l,d,c){if(!d)return l;var b;if(c)b=c(d);else if(I.isURLSearchParams(d))b=d.toString();else{var e=[];I.forEach(d,function(m,s){m===null||typeof m=="undefined"||(I.isArray(m)?s=s+"[]":m=[m],I.forEach(m,function(u){I.isDate(u)?u=u.toISOString():I.isObject(u)&&(u=JSON.stringify(u)),e.push(Sl(s)+"="+Sl(u))}))}),b=e.join("&")}if(b){var t=l.indexOf("#");t!==-1&&(l=l.slice(0,t)),l+=(l.indexOf("?")===-1?"?":"&")+b}return l},yd=a;function w(){this.handlers=[]}w.prototype.use=function(l,d,c){return this.handlers.push({fulfilled:l,rejected:d,synchronous:c?c.synchronous:!1,runWhen:c?c.runWhen:null}),this.handlers.length-1},w.prototype.eject=function(l){this.handlers[l]&&(this.handlers[l]=null)},w.prototype.forEach=function(l){yd.forEach(this.handlers,function(c){c!==null&&l(c)})};var Rd=w,Yd=a,Jd=function(l,d){Yd.forEach(l,function(b,e){e!==d&&e.toUpperCase()===d.toUpperCase()&&(l[d]=b,delete l[e])})},Hl=function(l,d,c,b,e){return l.config=d,c&&(l.code=c),l.request=b,l.response=e,l.isAxiosError=!0,l.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},l},Id=Hl,Ll=function(l,d,c,b,e){var t=new Error(l);return Id(t,d,c,b,e)},Kd=Ll,fd=function(l,d,c){var b=c.config.validateStatus;!c.status||!b||b(c.status)?l(c):d(Kd("Request failed with status code "+c.status,c.config,null,c.request,c))},Q=a,Sd=Q.isStandardBrowserEnv()?function(){return{write:function(d,c,b,e,t,n){var m=[];m.push(d+"="+encodeURIComponent(c)),Q.isNumber(b)&&m.push("expires="+new Date(b).toGMTString()),Q.isString(e)&&m.push("path="+e),Q.isString(t)&&m.push("domain="+t),n===!0&&m.push("secure"),document.cookie=m.join("; ")},read:function(d){var c=document.cookie.match(new RegExp("(^|;\\s*)("+d+")=([^;]*)"));return c?decodeURIComponent(c[3]):null},remove:function(d){this.write(d,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Nd=function(l){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(l)},Hd=function(l,d){return d?l.replace(/\/+$/,"")+"/"+d.replace(/^\/+/,""):l},Ld=Nd,vd=Hd,gd=function(l,d){return l&&!Ld(d)?vd(l,d):d},ml=a,kd=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],Fd=function(l){var d={},c,b,e;return l&&ml.forEach(l.split(`
2
+ `),function(n){if(e=n.indexOf(":"),c=ml.trim(n.substr(0,e)).toLowerCase(),b=ml.trim(n.substr(e+1)),c){if(d[c]&&kd.indexOf(c)>=0)return;c==="set-cookie"?d[c]=(d[c]?d[c]:[]).concat([b]):d[c]=d[c]?d[c]+", "+b:b}}),d},vl=a,zd=vl.isStandardBrowserEnv()?function(){var l=/(msie|trident)/i.test(navigator.userAgent),d=document.createElement("a"),c;function b(e){var t=e;return l&&(d.setAttribute("href",t),t=d.href),d.setAttribute("href",t),{href:d.href,protocol:d.protocol?d.protocol.replace(/:$/,""):"",host:d.host,search:d.search?d.search.replace(/^\?/,""):"",hash:d.hash?d.hash.replace(/^#/,""):"",hostname:d.hostname,port:d.port,pathname:d.pathname.charAt(0)==="/"?d.pathname:"/"+d.pathname}}return c=b(window.location.href),function(t){var n=vl.isString(t)?b(t):t;return n.protocol===c.protocol&&n.host===c.host}}():function(){return function(){return!0}}();function ul(Z){this.message=Z}ul.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},ul.prototype.__CANCEL__=!0;var P=ul,M=a,Cd=fd,xd=Sd,Ud=Nl,Bd=gd,Td=Fd,wd=zd,ol=Ll,Qd=E,Pd=P,gl=function(l){return new Promise(function(c,b){var e=l.data,t=l.headers,n=l.responseType,m;function s(){l.cancelToken&&l.cancelToken.unsubscribe(m),l.signal&&l.signal.removeEventListener("abort",m)}M.isFormData(e)&&delete t["Content-Type"];var i=new XMLHttpRequest;if(l.auth){var u=l.auth.username||"",p=l.auth.password?unescape(encodeURIComponent(l.auth.password)):"";t.Authorization="Basic "+btoa(u+":"+p)}var X=Bd(l.baseURL,l.url);i.open(l.method.toUpperCase(),Ud(X,l.params,l.paramsSerializer),!0),i.timeout=l.timeout;function bd(){if(!!i){var G="getAllResponseHeaders"in i?Td(i.getAllResponseHeaders()):null,k=!n||n==="text"||n==="json"?i.responseText:i.response,J={data:k,status:i.status,statusText:i.statusText,headers:G,config:l,request:i};Cd(function(Rl){c(Rl),s()},function(Rl){b(Rl),s()},J),i=null}}if("onloadend"in i?i.onloadend=bd:i.onreadystatechange=function(){!i||i.readyState!==4||i.status===0&&!(i.responseURL&&i.responseURL.indexOf("file:")===0)||setTimeout(bd)},i.onabort=function(){!i||(b(ol("Request aborted",l,"ECONNABORTED",i)),i=null)},i.onerror=function(){b(ol("Network Error",l,null,i)),i=null},i.ontimeout=function(){var k=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded",J=l.transitional||Qd.transitional;l.timeoutErrorMessage&&(k=l.timeoutErrorMessage),b(ol(k,l,J.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",i)),i=null},M.isStandardBrowserEnv()){var td=(l.withCredentials||wd(X))&&l.xsrfCookieName?xd.read(l.xsrfCookieName):void 0;td&&(t[l.xsrfHeaderName]=td)}"setRequestHeader"in i&&M.forEach(t,function(k,J){typeof e=="undefined"&&J.toLowerCase()==="content-type"?delete t[J]:i.setRequestHeader(J,k)}),M.isUndefined(l.withCredentials)||(i.withCredentials=!!l.withCredentials),n&&n!=="json"&&(i.responseType=l.responseType),typeof l.onDownloadProgress=="function"&&i.addEventListener("progress",l.onDownloadProgress),typeof l.onUploadProgress=="function"&&i.upload&&i.upload.addEventListener("progress",l.onUploadProgress),(l.cancelToken||l.signal)&&(m=function(G){!i||(b(!G||G&&G.type?new Pd("canceled"):G),i.abort(),i=null)},l.cancelToken&&l.cancelToken.subscribe(m),l.signal&&(l.signal.aborted?m():l.signal.addEventListener("abort",m))),e||(e=null),i.send(e)})},o=a,kl=Jd,Md=Hl,jd={"Content-Type":"application/x-www-form-urlencoded"};function Fl(Z,l){!o.isUndefined(Z)&&o.isUndefined(Z["Content-Type"])&&(Z["Content-Type"]=l)}function Ed(){var Z;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(Z=gl),Z}function Od(Z,l,d){if(o.isString(Z))try{return(l||JSON.parse)(Z),o.trim(Z)}catch(c){if(c.name!=="SyntaxError")throw c}return(d||JSON.stringify)(Z)}var j={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:Ed(),transformRequest:[function(l,d){return kl(d,"Accept"),kl(d,"Content-Type"),o.isFormData(l)||o.isArrayBuffer(l)||o.isBuffer(l)||o.isStream(l)||o.isFile(l)||o.isBlob(l)?l:o.isArrayBufferView(l)?l.buffer:o.isURLSearchParams(l)?(Fl(d,"application/x-www-form-urlencoded;charset=utf-8"),l.toString()):o.isObject(l)||d&&d["Content-Type"]==="application/json"?(Fl(d,"application/json"),Od(l)):l}],transformResponse:[function(l){var d=this.transitional||j.transitional,c=d&&d.silentJSONParsing,b=d&&d.forcedJSONParsing,e=!c&&this.responseType==="json";if(e||b&&o.isString(l)&&l.length)try{return JSON.parse(l)}catch(t){if(e)throw t.name==="SyntaxError"?Md(t,this,"E_JSON_PARSE"):t}return l}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(l){return l>=200&&l<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],function(l){j.headers[l]={}}),o.forEach(["post","put","patch"],function(l){j.headers[l]=o.merge(jd)});var E=j,Dd=a,Ad=E,$d=function(l,d,c){var b=this||Ad;return Dd.forEach(c,function(t){l=t.call(b,l,d)}),l},zl=function(l){return!!(l&&l.__CANCEL__)},Cl=a,sl=$d,qd=zl,_d=E,lc=P;function al(Z){if(Z.cancelToken&&Z.cancelToken.throwIfRequested(),Z.signal&&Z.signal.aborted)throw new lc("canceled")}var dc=function(l){al(l),l.headers=l.headers||{},l.data=sl.call(l,l.data,l.headers,l.transformRequest),l.headers=Cl.merge(l.headers.common||{},l.headers[l.method]||{},l.headers),Cl.forEach(["delete","get","head","post","put","patch","common"],function(b){delete l.headers[b]});var d=l.adapter||_d.adapter;return d(l).then(function(b){return al(l),b.data=sl.call(l,b.data,b.headers,l.transformResponse),b},function(b){return qd(b)||(al(l),b&&b.response&&(b.response.data=sl.call(l,b.response.data,b.response.headers,l.transformResponse))),Promise.reject(b)})},h=a,xl=function(l,d){d=d||{};var c={};function b(i,u){return h.isPlainObject(i)&&h.isPlainObject(u)?h.merge(i,u):h.isPlainObject(u)?h.merge({},u):h.isArray(u)?u.slice():u}function e(i){if(h.isUndefined(d[i])){if(!h.isUndefined(l[i]))return b(void 0,l[i])}else return b(l[i],d[i])}function t(i){if(!h.isUndefined(d[i]))return b(void 0,d[i])}function n(i){if(h.isUndefined(d[i])){if(!h.isUndefined(l[i]))return b(void 0,l[i])}else return b(void 0,d[i])}function m(i){if(i in d)return b(l[i],d[i]);if(i in l)return b(void 0,l[i])}var s={url:t,method:t,data:t,baseURL:n,transformRequest:n,transformResponse:n,paramsSerializer:n,timeout:n,timeoutMessage:n,withCredentials:n,adapter:n,responseType:n,xsrfCookieName:n,xsrfHeaderName:n,onUploadProgress:n,onDownloadProgress:n,decompress:n,maxContentLength:n,maxBodyLength:n,transport:n,httpAgent:n,httpsAgent:n,cancelToken:n,socketPath:n,responseEncoding:n,validateStatus:m};return h.forEach(Object.keys(l).concat(Object.keys(d)),function(u){var p=s[u]||e,X=p(u);h.isUndefined(X)&&p!==m||(c[u]=X)}),c},Ul={version:"0.25.0"},cc=Ul.version,Xl={};["object","boolean","number","function","string","symbol"].forEach(function(Z,l){Xl[Z]=function(c){return typeof c===Z||"a"+(l<1?"n ":" ")+Z}});var Bl={};Xl.transitional=function(l,d,c){function b(e,t){return"[Axios v"+cc+"] Transitional option '"+e+"'"+t+(c?". "+c:"")}return function(e,t,n){if(l===!1)throw new Error(b(t," has been removed"+(d?" in "+d:"")));return d&&!Bl[t]&&(Bl[t]=!0,console.warn(b(t," has been deprecated since v"+d+" and will be removed in the near future"))),l?l(e,t,n):!0}};function Zc(Z,l,d){if(typeof Z!="object")throw new TypeError("options must be an object");for(var c=Object.keys(Z),b=c.length;b-- >0;){var e=c[b],t=l[e];if(t){var n=Z[e],m=n===void 0||t(n,e,Z);if(m!==!0)throw new TypeError("option "+e+" must be "+m);continue}if(d!==!0)throw Error("Unknown option "+e)}}var bc={assertOptions:Zc,validators:Xl},Tl=a,tc=Nl,wl=Rd,Ql=dc,O=xl,Pl=bc,K=Pl.validators;function z(Z){this.defaults=Z,this.interceptors={request:new wl,response:new wl}}z.prototype.request=function(l,d){if(typeof l=="string"?(d=d||{},d.url=l):d=l||{},!d.url)throw new Error("Provided config url is not valid");d=O(this.defaults,d),d.method?d.method=d.method.toLowerCase():this.defaults.method?d.method=this.defaults.method.toLowerCase():d.method="get";var c=d.transitional;c!==void 0&&Pl.assertOptions(c,{silentJSONParsing:K.transitional(K.boolean),forcedJSONParsing:K.transitional(K.boolean),clarifyTimeoutError:K.transitional(K.boolean)},!1);var b=[],e=!0;this.interceptors.request.forEach(function(X){typeof X.runWhen=="function"&&X.runWhen(d)===!1||(e=e&&X.synchronous,b.unshift(X.fulfilled,X.rejected))});var t=[];this.interceptors.response.forEach(function(X){t.push(X.fulfilled,X.rejected)});var n;if(!e){var m=[Ql,void 0];for(Array.prototype.unshift.apply(m,b),m=m.concat(t),n=Promise.resolve(d);m.length;)n=n.then(m.shift(),m.shift());return n}for(var s=d;b.length;){var i=b.shift(),u=b.shift();try{s=i(s)}catch(p){u(p);break}}try{n=Ql(s)}catch(p){return Promise.reject(p)}for(;t.length;)n=n.then(t.shift(),t.shift());return n},z.prototype.getUri=function(l){if(!l.url)throw new Error("Provided config url is not valid");return l=O(this.defaults,l),tc(l.url,l.params,l.paramsSerializer).replace(/^\?/,"")},Tl.forEach(["delete","get","head","options"],function(l){z.prototype[l]=function(d,c){return this.request(O(c||{},{method:l,url:d,data:(c||{}).data}))}}),Tl.forEach(["post","put","patch"],function(l){z.prototype[l]=function(d,c,b){return this.request(O(b||{},{method:l,url:d,data:c}))}});var ec=z,nc=P;function f(Z){if(typeof Z!="function")throw new TypeError("executor must be a function.");var l;this.promise=new Promise(function(b){l=b});var d=this;this.promise.then(function(c){if(!!d._listeners){var b,e=d._listeners.length;for(b=0;b<e;b++)d._listeners[b](c);d._listeners=null}}),this.promise.then=function(c){var b,e=new Promise(function(t){d.subscribe(t),b=t}).then(c);return e.cancel=function(){d.unsubscribe(b)},e},Z(function(b){d.reason||(d.reason=new nc(b),l(d.reason))})}f.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},f.prototype.subscribe=function(l){if(this.reason){l(this.reason);return}this._listeners?this._listeners.push(l):this._listeners=[l]},f.prototype.unsubscribe=function(l){if(!!this._listeners){var d=this._listeners.indexOf(l);d!==-1&&this._listeners.splice(d,1)}},f.source=function(){var l,d=new f(function(b){l=b});return{token:d,cancel:l}};var ic=f,mc=function(l){return function(c){return l.apply(null,c)}},uc=a,oc=function(l){return uc.isObject(l)&&l.isAxiosError===!0},Ml=a,sc=Jl,D=ec,ac=xl,Xc=E;function jl(Z){var l=new D(Z),d=sc(D.prototype.request,l);return Ml.extend(d,D.prototype,l),Ml.extend(d,l),d.create=function(b){return jl(ac(Z,b))},d}var W=jl(Xc);W.Axios=D,W.Cancel=P,W.CancelToken=ic,W.isCancel=zl,W.VERSION=Ul.version,W.all=function(l){return Promise.all(l)},W.spread=mc,W.isAxiosError=oc,Yl.exports=W,Yl.exports.default=W;let hc;function rc(){return hc}for(var Gc=[],hl=0;hl<256;++hl)Gc.push((hl+256).toString(16).substr(1));const y=new WeakMap,A=new WeakMap,C=new WeakMap,rl=Symbol("anyProducer"),El=Promise.resolve(),$=Symbol("listenerAdded"),q=Symbol("listenerRemoved");let Gl=!1;function S(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function _(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function N(Z,l){const d=A.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function x(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:rl,c=C.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function Wc(Z,l,d){const c=C.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(rl)){const b=Promise.all([l,d]);for(const e of c.get(rl))e.enqueue(b)}}function Ol(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(t){b.push(t),c()},finish(){d=!0,c()}};for(const t of l)x(Z,t).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(t=>{c=t}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(t){b=void 0;for(const n of l)x(Z,n).delete(e);return c(),arguments.length>0?{done:!0,value:await t}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Dl(Z){if(Z===void 0)return Al;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Al.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const Wl=Z=>Z===$||Z===q;class H{static mixin(l,d){return d=Dl(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const t of d)if(c.prototype[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new H}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=t=>function(...n){return this[l][t](...n)};for(const t of d)Object.defineProperty(c.prototype,t,{enumerable:!1,value:e(t)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Gl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Gl}static set isDebugEnabled(l){Gl=l}constructor(l={}){y.set(this,new Set),A.set(this,new Map),C.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const t=new Date,n=`${t.getHours()}:${t.getMinutes()}:${t.getSeconds()}.${t.getMilliseconds()}`;console.log(`[${n}][emittery:${d}][${c}] Event Name: ${b}
3
+ data: ${e}`)})}logIfDebugEnabled(l,d,c){(H.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){_(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),N(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),Wl(c)||this.emit($,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){_(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),N(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),Wl(c)||this.emit(q,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)S(d);return Ol(this,l)}async emit(l,d){S(l),this.logIfDebugEnabled("emit",l,d),Wc(this,l,d);const c=N(this,l),b=y.get(this),e=[...c],t=Wl(l)?[]:[...b];await El,await Promise.all([...e.map(async n=>{if(c.has(n))return n(d)}),...t.map(async n=>{if(b.has(n))return n(l,d)})])}async emitSerial(l,d){S(l),this.logIfDebugEnabled("emitSerial",l,d);const c=N(this,l),b=y.get(this),e=[...c],t=[...b];await El;for(const n of e)c.has(n)&&await n(d);for(const n of t)b.has(n)&&await n(l,d)}onAny(l){return _(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),y.get(this).add(l),this.emit($,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return Ol(this)}offAny(l){_(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(q,{listener:l}),y.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){N(this,d).clear();const c=x(this,d);for(const b of c)b.finish();c.clear()}else{y.get(this).clear();for(const c of A.get(this).values())c.clear();for(const c of C.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=y.get(this).size+N(this,c).size+x(this,c).size+x(this).size;continue}typeof c!="undefined"&&S(c),d+=y.get(this).size;for(const b of A.get(this).values())d+=b.size;for(const b of C.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=Dl(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Al=Object.getOwnPropertyNames(H.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(H,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(H,"listenerRemoved",{value:q,writable:!1,enumerable:!0,configurable:!1});var $l;(function(Z){Z.FPS_DROP="fps_drop"})($l||($l={}));class pc{constructor(){this.processor_=null,this.generator_=null}init(l){return new Promise((d,c)=>{try{this.processor_=new MediaStreamTrackProcessor(l)}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${b}`),c(b)}try{l.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):l.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):c("kind not supported")}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${b}`),c(b)}d()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class Vc{constructor(l){this.insertableStreamHelper_=new pc,this.mediaProcessor_=l}setTrack(l){return new Promise((d,c)=>{this.insertableStreamHelper_.init(l).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{d(this.insertableStreamHelper_.getProccesorTrack())}).catch(b=>{c(b)})}).catch(b=>{c(b)})})}destroy(){return new Promise((l,d)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{l()}).catch(c=>{d(c)}):d("no processor")})}}const ql="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LFV0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIEJ0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBOdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBIdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uICR0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gV3Qocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBqdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHF0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gVnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiB6dChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24gSnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEd0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gUXQoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBYdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPVV0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBLdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpCdCxpc0Zvcm1EYXRhOk50LGlzQXJyYXlCdWZmZXJWaWV3Okh0LGlzU3RyaW5nOiR0LGlzTnVtYmVyOld0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOmp0LGlzRmlsZTpxdCxpc0Jsb2I6VnQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTp6dCxpc1VSTFNlYXJjaFBhcmFtczpKdCxpc1N0YW5kYXJkQnJvd3NlckVudjpRdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpYdCx0cmltOkd0LHN0cmlwQk9NOkt0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLF8pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/Xz1fKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChfKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sWXQ9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtZdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFp0PXNlLGVyPVAsdHI9ZnVuY3Rpb24oZSx0KXtlci5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0scnI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHJyKGEsdCxuLHMsbyl9LG5yPW50LHNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQobnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsaXI9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksb3I9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sYXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sdXI9b3IsZnI9YXIsbHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIXVyKHQpP2ZyKGUsdCk6dH0sSWU9UCxjcj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGhyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZjci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxkcj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxwcj1zcixtcj1pcixncj10dCxfcj1scix5cj1ocix2cj1kcixGZT1udCx3cj1mZSxicj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIF8oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsdj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK3YpfXZhciB3PV9yKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksZ3IodyxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBDPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj95cihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6Qyxjb25maWc6ZSxyZXF1ZXN0OmZ9O3ByKGZ1bmN0aW9uKFgpe24oWCksXygpfSxmdW5jdGlvbihYKXtzKFgpLF8oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8d3IudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx2cih3KSkmJmUueHNyZkNvb2tpZU5hbWU/bXIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKEMpeyFmfHwocyghQ3x8QyYmQy50eXBlP25ldyBicigiY2FuY2VsZWQiKTpDKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sYj1QLG90PXRyLEVyPXJ0LFRyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshYi5pc1VuZGVmaW5lZChyKSYmYi5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBDcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIFJyKHIsZSx0KXtpZihiLmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksYi50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOkNyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksYi5pc0Zvcm1EYXRhKGUpfHxiLmlzQXJyYXlCdWZmZXIoZSl8fGIuaXNCdWZmZXIoZSl8fGIuaXNTdHJlYW0oZSl8fGIuaXNGaWxlKGUpfHxiLmlzQmxvYihlKT9lOmIuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6Yi5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOmIuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksUnIoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJmIuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/RXIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2IuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksYi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT1iLm1lcmdlKFRyKX0pO3ZhciBmZT11ZSxQcj1QLE9yPWZlLFNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxPcjtyZXR1cm4gUHIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9U3IsTXI9dXQsQXI9ZmUsSXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IElyKCJjYW5jZWxlZCIpfXZhciB4cj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fEFyLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBNcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBfPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgdj1fW2RdfHxvLHc9dihkKTtTLmlzVW5kZWZpbmVkKHcpJiZ2IT09Y3x8KG5bZF09dyl9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0sRnI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2IitGcisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIExyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBrcj17YXNzZXJ0T3B0aW9uczpMcix2YWxpZGF0b3JzOkRlfSxkdD1QLERyPXR0LHB0PVp0LG10PXhyLGxlPWx0LGd0PWtyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3R5cGVvZiB3LnJ1bldoZW49PSJmdW5jdGlvbiImJncucnVuV2hlbih0KT09PSExfHwobz1vJiZ3LnN5bmNocm9ub3VzLHMudW5zaGlmdCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2EucHVzaCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIF89dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7Xz1mKF8pfWNhdGNoKHYpe2Qodik7YnJlYWt9fXRyeXt1PW10KF8pfWNhdGNoKHYpe3JldHVybiBQcm9taXNlLnJlamVjdCh2KX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxEcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBVcj1LLEJyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBCcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgTnI9eixIcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LCRyPVAsV3I9ZnVuY3Rpb24oZSl7cmV0dXJuICRyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLGpyPVhlLGNlPVVyLHFyPWx0LFZyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PWpyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KHFyKHIscykpfSx0fXZhciBMPXl0KFZyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49TnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPUhyLEwuaXNBeGlvc0Vycm9yPVdyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgenI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgSnI9IjEuMS4zIjtsZXQgYnQ7ZnVuY3Rpb24gR3Iocil7YnQ9cn1mdW5jdGlvbiBRcigpe3JldHVybiBidH1jbGFzcyBre2NvbnN0cnVjdG9yKCl7Y29uc3QgZT1RcigpO3RoaXMuX3JlcG9ydD17YWN0aW9uOnAuZW1wdHkoKSxhcHBsaWNhdGlvbklkOnAub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UuYXBwSWQ6bnVsbCksdGltZXN0YW1wOkRhdGUubm93KCksZnBzOnAuZW1wdHkoKSxmcmFtZXNUcmFuc2Zvcm1lZDpwLmVtcHR5KCksZ3VpZDpwLmVtcHR5KCksaGlnaGVzdEZyYW1lVHJhbnNmb3JtQ3B1OnAuZW1wdHkoKSxtZXNzYWdlOnAuZW1wdHkoKSxzb3VyY2U6cC5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5zb3VyY2VUeXBlOm51bGwpLHRyYW5zZm9ybWVkRnBzOnAuZW1wdHkoKSx0cmFuc2Zvcm1lclR5cGU6cC5lbXB0eSgpLHZhcmlhdGlvbjpwLmVtcHR5KCksdmlkZW9IZWlnaHQ6cC5lbXB0eSgpLHZpZGVvV2lkdGg6cC5lbXB0eSgpLHZlcnNpb246SnIsZXJyb3I6cC5lbXB0eSgpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1wLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1wLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1wLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IFhyPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIER7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IHM9enIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fTtjb25zdCBhPSJodHRwczovL2hsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIjtzLnBvc3QoYSxYcihlKSxvKS50aGVuKHU9Pntjb25zb2xlLmxvZyh1KSx0KCJzdWNjZXNzIil9KS5jYXRjaCh1PT57Y29uc29sZS5sb2codSksbih1KX0pfSl9fXZhciBoZSxLcj1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gWXIoKXtpZighaGUmJihoZT10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhaGUpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gaGUoS3IpfXZhciBacj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gZW4ocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmWnIudGVzdChyKX1mb3IodmFyIEU9W10sVWU9MDtVZTwyNTY7KytVZSlFLnB1c2goKFVlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gdG4ocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oRVtyW2UrMF1dK0VbcltlKzFdXStFW3JbZSsyXV0rRVtyW2UrM11dKyItIitFW3JbZSs0XV0rRVtyW2UrNV1dKyItIitFW3JbZSs2XV0rRVtyW2UrN11dKyItIitFW3JbZSs4XV0rRVtyW2UrOV1dKyItIitFW3JbZSsxMF1dK0VbcltlKzExXV0rRVtyW2UrMTJdXStFW3JbZSsxM11dK0VbcltlKzE0XV0rRVtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighZW4odCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBFdChyLGUsdCl7cj1yfHx7fTt2YXIgbj1yLnJhbmRvbXx8KHIucm5nfHxZcikoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBzPTA7czwxNjsrK3MpZVt0K3NdPW5bc107cmV0dXJuIGV9cmV0dXJuIHRuKG4pfWNvbnN0IE49bmV3IFdlYWtNYXAsZGU9bmV3IFdlYWtNYXAsWT1uZXcgV2Vha01hcCxCZT1TeW1ib2woImFueVByb2R1Y2VyIiksVHQ9UHJvbWlzZS5yZXNvbHZlKCkscGU9U3ltYm9sKCJsaXN0ZW5lckFkZGVkIiksbWU9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgTmU9ITE7ZnVuY3Rpb24gSihyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIGdlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEcocixlKXtjb25zdCB0PWRlLmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gWihyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCI/ZTpCZSxuPVkuZ2V0KHIpO3JldHVybiBuLmhhcyh0KXx8bi5zZXQodCxuZXcgU2V0KSxuLmdldCh0KX1mdW5jdGlvbiBybihyLGUsdCl7Y29uc3Qgbj1ZLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgcyBvZiBuLmdldChlKSlzLmVucXVldWUodCk7aWYobi5oYXMoQmUpKXtjb25zdCBzPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChCZSkpby5lbnF1ZXVlKHMpfX1mdW5jdGlvbiBDdChyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxzPVtdO2NvbnN0IG89e2VucXVldWUoYSl7cy5wdXNoKGEpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgYSBvZiBlKVoocixhKS5hZGQobyk7cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gcz9zLmxlbmd0aD09PTA/dD8ocz12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShhPT57bj1hfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IHMuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4oYSl7cz12b2lkIDA7Zm9yKGNvbnN0IHUgb2YgZSlaKHIsdSkuZGVsZXRlKG8pO3JldHVybiBuKCksYXJndW1lbnRzLmxlbmd0aD4wP3tkb25lOiEwLHZhbHVlOmF3YWl0IGF9Ontkb25lOiEwfX0sW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19ZnVuY3Rpb24gUnQocil7aWYocj09PXZvaWQgMClyZXR1cm4gUHQ7aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MiKTtmb3IoY29uc3QgZSBvZiByKWlmKCFQdC5pbmNsdWRlcyhlKSl0aHJvdyB0eXBlb2YgZSE9InN0cmluZyI/bmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBlbGVtZW50IG11c3QgYmUgYSBzdHJpbmciKTpuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IEVtaXR0ZXJ5IG1ldGhvZGApO3JldHVybiByfWNvbnN0IEhlPXI9PnI9PT1wZXx8cj09PW1lO2NsYXNzIFd7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9UnQodCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgYSBvZiB0KWlmKG4ucHJvdG90eXBlW2FdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHthfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBzKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IFd9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpzfSk7Y29uc3Qgbz1hPT5mdW5jdGlvbiguLi51KXtyZXR1cm4gdGhpc1tlXVthXSguLi51KX07Zm9yKGNvbnN0IGEgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsYSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGEpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIE5lO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fE5lfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7TmU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtOLnNldCh0aGlzLG5ldyBTZXQpLGRlLnNldCh0aGlzLG5ldyBNYXApLFkuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixzLG8pPT57bz1KU09OLnN0cmluZ2lmeShvKSx0eXBlb2Ygcz09InN5bWJvbCImJihzPXMudG9TdHJpbmcoKSk7Y29uc3QgYT1uZXcgRGF0ZSx1PWAke2EuZ2V0SG91cnMoKX06JHthLmdldE1pbnV0ZXMoKX06JHthLmdldFNlY29uZHMoKX0uJHthLmdldE1pbGxpc2Vjb25kcygpfWA7Y29uc29sZS5sb2coYFske3V9XVtlbWl0dGVyeToke3R9XVske259XSBFdmVudCBOYW1lOiAke3N9CglkYXRhOiAke299YCl9KX1sb2dJZkRlYnVnRW5hYmxlZChlLHQsbil7KFcuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChwZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5kZWxldGUodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxIZShuKXx8dGhpcy5lbWl0KG1lLHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IG49dGhpcy5vbihlLHM9PntuKCksdChzKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUoodCk7cmV0dXJuIEN0KHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0ooZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSxybih0aGlzLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPUhlKGUpP1tdOlsuLi5zXTthd2FpdCBUdCxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgdT0+e2lmKG4uaGFzKHUpKXJldHVybiB1KHQpfSksLi4uYS5tYXAoYXN5bmMgdT0+e2lmKHMuaGFzKHUpKXJldHVybiB1KGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPVsuLi5zXTthd2FpdCBUdDtmb3IoY29uc3QgdSBvZiBvKW4uaGFzKHUpJiZhd2FpdCB1KHQpO2Zvcihjb25zdCB1IG9mIGEpcy5oYXModSkmJmF3YWl0IHUoZSx0KX1vbkFueShlKXtyZXR1cm4gZ2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxOLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KHBlLHtsaXN0ZW5lcjplfSksdGhpcy5vZmZBbnkuYmluZCh0aGlzLGUpfWFueUV2ZW50KCl7cmV0dXJuIEN0KHRoaXMpfW9mZkFueShlKXtnZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KG1lLHtsaXN0ZW5lcjplfSksTi5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe0codGhpcyx0KS5jbGVhcigpO2NvbnN0IG49Wih0aGlzLHQpO2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9ZWxzZXtOLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBuIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSluLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgWS5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBuIG9mIGUpe2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7dCs9Ti5nZXQodGhpcykuc2l6ZStHKHRoaXMsbikuc2l6ZStaKHRoaXMsbikuc2l6ZStaKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZKKG4pLHQrPU4uZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IHMgb2YgZGUuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPXMuc2l6ZTtmb3IoY29uc3QgcyBvZiBZLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1SdCh0KTtmb3IoY29uc3QgbiBvZiB0KXtpZihlW25dIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtufVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbbl0uYmluZCh0aGlzKX0pfX19Y29uc3QgUHQ9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpwZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTptZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciAkZT1XO2Z1bmN0aW9uIG5uKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiBzbihyKXtpZihubihyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBXZShyKXtyZXR1cm4gc24ocikubWVzc2FnZX12YXIgamU7KGZ1bmN0aW9uKHIpe3IuRlBTX0RST1A9ImZwc19kcm9wIn0pKGplfHwoamU9e30pKTtjb25zdCBvbj01MDAsYW49Ljg7Y2xhc3MgdW4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCk7dGhpcy5pbmRleF89dCx0aGlzLnV1aWRfPUV0KCksdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZwc189MCx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpO2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtELnJlcG9ydChuKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfc3RhcnQpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZSh0KSkuYnVpbGQoKTtELnJlcG9ydChuKTtjb25zdCBzPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjp0LGZ1bmN0aW9uOiJzdGFydCJ9O3RoaXMuZW1pdCgiZXJyb3IiLHMpfX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgbixzLG8sYTtpZih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89PT0wJiYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPURhdGUubm93KCkpLHRoaXMudmlkZW9IZWlnaHRfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/bjowLHRoaXMudmlkZW9XaWR0aF89KHM9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP3M6MCwrK3RoaXMuZnJhbWVzRnJvbVNvdXJjZV8sdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyllLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2UgdHJ5e2F3YWl0KChhPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDphLmNhbGwobyxlLHQpKSwrK3RoaXMuZnJhbWVzVHJhbnNmb3JtZWRfLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPT09b24mJnRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpfWNhdGNoKHUpe2NvbnN0IGM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodSkpLmJ1aWxkKCk7RC5yZXBvcnQoYyk7Y29uc3QgXz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsXyl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2gobil7Y29uc3Qgcz1uZXcgaygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKG4pKS5idWlsZCgpO0QucmVwb3J0KHMpO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOm4sZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Usbj10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qYW4+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6amUuRlBTX0RST1AsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnR9fTt0aGlzLmVtaXQoIndhcm4iLG8pfWNvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5mcHModCkudHJhbnNmb3JtZWRGcHMobikuZnJhbWVzVHJhbnNmb3JtZWQodGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8pLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmlkZW9IZWlnaHQodGhpcy52aWRlb0hlaWdodF8pLnZpZGVvV2lkdGgodGhpcy52aWRlb1dpZHRoXykudmFyaWF0aW9uKCJRb1MiKS5idWlsZCgpO0QucmVwb3J0KHMpLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wfX1jbGFzcyBmbiBleHRlbmRzICRle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1uZXcgdW4oZVt0XSx0KTtuLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksbi5vbigid2FybiIscz0+e3RoaXMuZW1pdCgid2FybiIscyl9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChuKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHQgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXQuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUsdCl7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBuPWU7Zm9yKGxldCBzIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShzKSk7ZS5waXBlVG8odCkudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgdC5hYm9ydCgpLGF3YWl0IG4uY2FuY2VsKCl9KS5jYXRjaChhc3luYyBzPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KHMpLGF3YWl0IG4uY2FuY2VsKHMpfSl9Y2F0Y2h7dGhpcy5kZXN0cm95KCk7cmV0dXJufWNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgbG4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy51dWlkXz1FdCgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO0QucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpfXRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCksdGhpcy5waXBlbGluZV89bmV3IGZuKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG49Pnt0KG4pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiBELnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KSxlKCl9KX19dmFyIF9lOyhmdW5jdGlvbihyKXtyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2gifSkoX2V8fChfZT17fSkpO2NsYXNzIE90e2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgY257Y29uc3RydWN0b3IoZSl7aWYodGhpcy5pbWFnZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuaW1hZ2VDdHhfPXRoaXMuaW1hZ2VDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsd2lsbFJlYWRGcmVxdWVudGx5OiEwLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMuaW1hZ2VDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLmltYWdlQmxvYl89dm9pZCAwLGZldGNoKGUpLnRoZW4odD0+e3QuYmxvYigpLnRoZW4obj0+e3RoaXMuaW1hZ2VCbG9iXz1ufSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImJsb2IgZXJyb3IiLG4pfSl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcigiZmV0Y2ggZXJyb3IiLHQpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7aWYodHlwZW9mIHRoaXMuaW1hZ2VCbG9iXyE9InVuZGVmaW5lZCImJih0aGlzLmltYWdlQ2FudmFzXy53aWR0aCE9dC53aWR0aHx8dGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0IT10LmhlaWdodCkpe3RoaXMuaW1hZ2VDYW52YXNfLndpZHRoPXQud2lkdGgsdGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ImhpZ2giLHM9e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6bn0sbz1jcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmltYWdlQmxvYl8scykudGhlbihhPT57dGhpcy5pbWFnZUN0eF8uZHJhd0ltYWdlKGEsMCwwKX0pLmNhdGNoKGE9Pntjb25zb2xlLmVycm9yKCJlcnJvciBjcmVhdGVJbWFnZUJpdG1hcCIsYSl9KX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5pbWFnZUNhbnZhc18sMCwwLHRoaXMuaW1hZ2VDYW52YXNfLndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaXJ0dWFsUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsbil9fX1jbGFzcyBobntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNsYXNzIGRue2NvbnN0cnVjdG9yKGUpe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gQ3RvciIpLHRoaXMucXVldWVfPW5ldyBobixlJiYodGhpcy5mcmFtZVJlYWRlcl89ZS5nZXRSZWFkZXIoKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbih0aGlzLnByb2Nlc3NGcmFtZS5iaW5kKHRoaXMpKS5jYXRjaCh0PT5jb25zb2xlLmVycm9yKHQpKSl9cHJvY2Vzc0ZyYW1lKGUpe2UuZG9uZXx8KHRoaXMucXVldWVfLmVucXVldWUoZS52YWx1ZSksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3Qgbj10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ZS5kcmF3SW1hZ2UobiwwLDAsdC53aWR0aCx0LmhlaWdodCksbi5jbG9zZSgpfWVsc2UgZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaWRlb1Bvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19ZnVuY3Rpb24gcG4oKXtyZXR1cm4ic2VsZmllX3NlZ21lbnRhdGlvbl9sYW5kc2NhcGUifXZhciB5ZT1mdW5jdGlvbigpe3ZhciByPXR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwO3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXR5cGVvZiBlIT0idW5kZWZpbmVkIj9lOnt9LG4sczt0LnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKGksbCl7bj1pLHM9bH0pO3ZhciBvPXt9LGE7Zm9yKGEgaW4gdCl0Lmhhc093blByb3BlcnR5KGEpJiYob1thXT10W2FdKTt2YXIgdT0iLi90aGlzLnByb2dyYW0iLGM9ZnVuY3Rpb24oaSxsKXt0aHJvdyBsfSxfPSEwLGY9IiI7ZnVuY3Rpb24gZChpKXtyZXR1cm4gdC5sb2NhdGVGaWxlP3QubG9jYXRlRmlsZShpLGYpOmYraX12YXIgdjt0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoZj1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKGY9ciksZi5pbmRleE9mKCJibG9iOiIpIT09MD9mPWYuc3Vic3RyKDAsZi5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOmY9IiI7dmFyIHc9dC5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxNPXQucHJpbnRFcnJ8fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmKHRbYV09b1thXSk7bz1udWxsLHQuYXJndW1lbnRzLHQudGhpc1Byb2dyYW0mJih1PXQudGhpc1Byb2dyYW0pLHQucXVpdCYmKGM9dC5xdWl0KTt2YXIgQTt0Lndhc21CaW5hcnkmJihBPXQud2FzbUJpbmFyeSk7dmFyIEM9dC5ub0V4aXRSdW50aW1lfHwhMDt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZIKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIE8sST0hMSx2ZT10eXBlb2YgVGV4dERlY29kZXIhPSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMDtmdW5jdGlvbiBYKGksbCxoKXtmb3IodmFyIG09bCtoLHk9bDtpW3ldJiYhKHk+PW0pOykrK3k7aWYoeS1sPjE2JiZpLnN1YmFycmF5JiZ2ZSlyZXR1cm4gdmUuZGVjb2RlKGkuc3ViYXJyYXkobCx5KSk7Zm9yKHZhciBUPSIiO2w8eTspe3ZhciBnPWlbbCsrXTtpZighKGcmMTI4KSl7VCs9U3RyaW5nLmZyb21DaGFyQ29kZShnKTtjb250aW51ZX12YXIgUj1pW2wrK10mNjM7aWYoKGcmMjI0KT09MTkyKXtUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChnJjMxKTw8NnxSKTtjb250aW51ZX12YXIgVT1pW2wrK10mNjM7aWYoKGcmMjQwKT09MjI0P2c9KGcmMTUpPDwxMnxSPDw2fFU6Zz0oZyY3KTw8MTh8Ujw8MTJ8VTw8NnxpW2wrK10mNjMsZzw2NTUzNilUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGcpO2Vsc2V7dmFyIER0PWctNjU1MzY7VCs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxEdD4+MTAsNTYzMjB8RHQmMTAyMyl9fXJldHVybiBUfWZ1bmN0aW9uIHdlKGksbCl7cmV0dXJuIGk/WChlZSxpLGwpOiIifWZ1bmN0aW9uIHduKGksbCxoKXtmb3IodmFyIG09MDttPGkubGVuZ3RoOysrbSliZVtsKys+PjBdPWkuY2hhckNvZGVBdChtKTtofHwoYmVbbD4+MF09MCl9ZnVuY3Rpb24gYm4oaSxsKXtyZXR1cm4gaSVsPjAmJihpKz1sLWklbCksaX12YXIgU3QsYmUsZWUseDtmdW5jdGlvbiBNdChpKXtTdD1pLHQuSEVBUDg9YmU9bmV3IEludDhBcnJheShpKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShpKSx0LkhFQVAzMj14PW5ldyBJbnQzMkFycmF5KGkpLHQuSEVBUFU4PWVlPW5ldyBVaW50OEFycmF5KGkpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoaSksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShpKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShpKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShpKX10LklOSVRJQUxfTUVNT1JZO3ZhciB6ZSxBdD1bXSxJdD1bXSx4dD1bXSxFbj0wO2Z1bmN0aW9uIFRuKCl7cmV0dXJuIEN8fEVuPjB9ZnVuY3Rpb24gQ24oKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylPbih0LnByZVJ1bi5zaGlmdCgpKTtKZShBdCl9ZnVuY3Rpb24gUm4oKXtKZShJdCl9ZnVuY3Rpb24gUG4oKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KU1uKHQucG9zdFJ1bi5zaGlmdCgpKTtKZSh4dCl9ZnVuY3Rpb24gT24oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBTbihpKXtJdC51bnNoaWZ0KGkpfWZ1bmN0aW9uIE1uKGkpe3h0LnVuc2hpZnQoaSl9dmFyIGo9MCx0ZT1udWxsO2Z1bmN0aW9uIEFuKGkpe2orKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhqKX1mdW5jdGlvbiBJbihpKXtpZihqLS0sdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoaiksaj09MCYmdGUpe3ZhciBsPXRlO3RlPW51bGwsbCgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBIKGkpe3Qub25BYm9ydCYmdC5vbkFib3J0KGkpLGk9IkFib3J0ZWQoIitpKyIpIixNKGkpLEk9ITAsaSs9Ii4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3ZhciBsPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoaSk7dGhyb3cgcyhsKSxsfXZhciB4bj0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gRnQoaSl7cmV0dXJuIGkuc3RhcnRzV2l0aCh4bil9dmFyIEY7Rj0idGZsaXRlLXNpbWQud2FzbSIsRnQoRil8fChGPWQoRikpO2Z1bmN0aW9uIEx0KGkpe3RyeXtpZihpPT1GJiZBKXJldHVybiBuZXcgVWludDhBcnJheShBKTtpZighdil0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2gobCl7SChsKX19ZnVuY3Rpb24gRm4oKXtyZXR1cm4hQSYmXyYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKEYse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGkpe2lmKCFpLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrRisiJyI7cmV0dXJuIGkuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIEx0KEYpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBMdChGKX0pfWZ1bmN0aW9uIExuKCl7dmFyIGk9e2E6dHN9O2Z1bmN0aW9uIGwoZyxSKXt2YXIgVT1nLmV4cG9ydHM7dC5hc209VSxPPXQuYXNtLnEsTXQoTy5idWZmZXIpLHplPXQuYXNtLkQsU24odC5hc20uciksSW4oKX1BbigpO2Z1bmN0aW9uIGgoZyl7bChnLmluc3RhbmNlKX1mdW5jdGlvbiBtKGcpe3JldHVybiBGbigpLnRoZW4oZnVuY3Rpb24oUil7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKFIsaSl9KS50aGVuKGZ1bmN0aW9uKFIpe3JldHVybiBSfSkudGhlbihnLGZ1bmN0aW9uKFIpe00oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrUiksSChSKX0pfWZ1bmN0aW9uIHkoKXtyZXR1cm4hQSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhRnQoRikmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihnKXt2YXIgUj1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhnLGkpO3JldHVybiBSLnRoZW4oaCxmdW5jdGlvbihVKXtyZXR1cm4gTSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrVSksTSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxtKGgpfSl9KTptKGgpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgVD10Lmluc3RhbnRpYXRlV2FzbShpLGwpO3JldHVybiBUfWNhdGNoKGcpe3JldHVybiBNKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2cpLCExfXJldHVybiB5KCkuY2F0Y2gocykse319ZnVuY3Rpb24gSmUoaSl7Zm9yKDtpLmxlbmd0aD4wOyl7dmFyIGw9aS5zaGlmdCgpO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXtsKHQpO2NvbnRpbnVlfXZhciBoPWwuZnVuYzt0eXBlb2YgaD09Im51bWJlciI/bC5hcmc9PT12b2lkIDA/emUuZ2V0KGgpKCk6emUuZ2V0KGgpKGwuYXJnKTpoKGwuYXJnPT09dm9pZCAwP251bGw6bC5hcmcpfX1mdW5jdGlvbiBrbihpLGwsaCxtKXtIKCJBc3NlcnRpb24gZmFpbGVkOiAiK3dlKGkpKyIsIGF0OiAiK1tsP3dlKGwpOiJ1bmtub3duIGZpbGVuYW1lIixoLG0/d2UobSk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gRG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBVbihpLGwpe0goIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIEJuKCl7SCgiIil9dmFyIEVlO0VlPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgTm49ITA7ZnVuY3Rpb24gSG4oaSl7cmV0dXJuIHhba3QoKT4+Ml09aSxpfWZ1bmN0aW9uICRuKGksbCl7dmFyIGg7aWYoaT09PTApaD1EYXRlLm5vdygpO2Vsc2UgaWYoKGk9PT0xfHxpPT09NCkmJk5uKWg9RWUoKTtlbHNlIHJldHVybiBIbigyOCksLTE7cmV0dXJuIHhbbD4+Ml09aC8xZTN8MCx4W2wrND4+Ml09aCUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gV24oKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBqbihpLGwsaCl7ZWUuY29weVdpdGhpbihpLGwsbCtoKX1mdW5jdGlvbiBxbihpKXt0cnl7cmV0dXJuIE8uZ3JvdyhpLVN0LmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksTXQoTy5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBWbihpKXt2YXIgbD1lZS5sZW5ndGg7aT1pPj4+MDt2YXIgaD0yMTQ3NDgzNjQ4O2lmKGk+aClyZXR1cm4hMTtmb3IodmFyIG09MTttPD00O20qPTIpe3ZhciB5PWwqKDErLjIvbSk7eT1NYXRoLm1pbih5LGkrMTAwNjYzMjk2KTt2YXIgVD1NYXRoLm1pbihoLGJuKE1hdGgubWF4KGkseSksNjU1MzYpKSxnPXFuKFQpO2lmKGcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gem4oaSl7Zm9yKHZhciBsPUVlKCk7RWUoKS1sPGk7KTt9dmFyIEdlPXt9O2Z1bmN0aW9uIEpuKCl7cmV0dXJuIHV8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gcmUoKXtpZighcmUuc3RyaW5ncyl7dmFyIGk9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsbD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmksXzpKbigpfTtmb3IodmFyIGggaW4gR2UpR2VbaF09PT12b2lkIDA/ZGVsZXRlIGxbaF06bFtoXT1HZVtoXTt2YXIgbT1bXTtmb3IodmFyIGggaW4gbCltLnB1c2goaCsiPSIrbFtoXSk7cmUuc3RyaW5ncz1tfXJldHVybiByZS5zdHJpbmdzfXZhciBUZT17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGksbCl7dmFyIGg9VGUuYnVmZmVyc1tpXTtsPT09MHx8bD09PTEwPygoaT09PTE/dzpNKShYKGgsMCkpLGgubGVuZ3RoPTApOmgucHVzaChsKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7VGUudmFyYXJncys9NDt2YXIgaT14W1RlLnZhcmFyZ3MtND4+Ml07cmV0dXJuIGl9LGdldFN0cjpmdW5jdGlvbihpKXt2YXIgbD13ZShpKTtyZXR1cm4gbH0sZ2V0NjQ6ZnVuY3Rpb24oaSxsKXtyZXR1cm4gaX19O2Z1bmN0aW9uIEduKGksbCl7dmFyIGg9MDtyZXR1cm4gcmUoKS5mb3JFYWNoKGZ1bmN0aW9uKG0seSl7dmFyIFQ9bCtoO3hbaSt5KjQ+PjJdPVQsd24obSxUKSxoKz1tLmxlbmd0aCsxfSksMH1mdW5jdGlvbiBRbihpLGwpe3ZhciBoPXJlKCk7eFtpPj4yXT1oLmxlbmd0aDt2YXIgbT0wO3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oeSl7bSs9eS5sZW5ndGgrMX0pLHhbbD4+Ml09bSwwfWZ1bmN0aW9uIFhuKGkpe25zKGkpfWZ1bmN0aW9uIEtuKGkpe3JldHVybiAwfWZ1bmN0aW9uIFluKGksbCxoLG0seSl7fWZ1bmN0aW9uIFpuKGksbCxoLG0pe2Zvcih2YXIgeT0wLFQ9MDtUPGg7VCsrKXtmb3IodmFyIGc9eFtsK1QqOD4+Ml0sUj14W2wrKFQqOCs0KT4+Ml0sVT0wO1U8UjtVKyspVGUucHJpbnRDaGFyKGksZWVbZytVXSk7eSs9Un1yZXR1cm4geFttPj4yXT15LDB9ZnVuY3Rpb24gZXMoKXtpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpe3ZhciBpPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGkpLGlbMF19fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKCl7SCgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIENlKGksbCl7Q2UucmFuZG9tRGV2aWNlfHwoQ2UucmFuZG9tRGV2aWNlPWVzKCkpO2Zvcih2YXIgaD0wO2g8bDtoKyspYmVbaStoPj4wXT1DZS5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgdHM9e2E6a24sZTpEbixkOlVuLGI6Qm4sbjokbixoOlduLGw6am4sbTpWbixwOnpuLGY6R24sZzpRbixqOlhuLGk6S24sazpZbixjOlpuLG86Q2V9O0xuKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIga3Q9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihrdD10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUmU7ZnVuY3Rpb24gcnMoaSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitpKyIpIix0aGlzLnN0YXR1cz1pfXRlPWZ1bmN0aW9uIGkoKXtSZXx8UWUoKSxSZXx8KHRlPWkpfTtmdW5jdGlvbiBRZShpKXtpZihqPjB8fChDbigpLGo+MCkpcmV0dXJuO2Z1bmN0aW9uIGwoKXtSZXx8KFJlPSEwLHQuY2FsbGVkUnVuPSEwLCFJJiYoUm4oKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxQbigpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGwoKX0sMSkpOmwoKX10LnJ1bj1RZTtmdW5jdGlvbiBucyhpLGwpe3NzKGkpfWZ1bmN0aW9uIHNzKGkpe1RuKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQoaSksST0hMCksYyhpLG5ldyBycyhpKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBRZSgpLGUucmVhZHl9fSgpO3R5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCI/bW9kdWxlLmV4cG9ydHM9eWU6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4geWV9KTp0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJihleHBvcnRzLmNyZWF0ZVZvbmFnZVRGTGl0ZVNpbWRNb2R1bGU9eWUpO2NsYXNzIG1ue2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NJTURTdXBwb3J0ZWRfPSExLHRoaXMuaXNUaHJlYWRzU3VwcG9ydGVkXz0hMSx0aGlzLmlucHV0V2lkdGhfPTAsdGhpcy5pbnB1dEhlaWdodF89MCx0aGlzLmlucHV0Q2hhbm5lbENvdW50Xz0wLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPTAsdGhpcy5vdXRwdXRXaWR0aF89MCx0aGlzLm91dHB1dEhlaWdodF89MCx0aGlzLm91dHB1dENoYW5uZWxDb3VudF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MH19YXN5bmMgZnVuY3Rpb24gZ24ocixlKXtsZXQgdD1uZXcgbW47dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24ocyxvKXthc3luYyBmdW5jdGlvbiBhKCl7cmV0dXJuIHllKHtsb2NhdGVGaWxlOmZ1bmN0aW9uKF8pe3JldHVybiByK199fSl9YXN5bmMgZnVuY3Rpb24gdShjKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoXyxmKT0+e2NvbnN0IGQ9YztpZih0eXBlb2YgZD09InVuZGVmaW5lZCIpcmV0dXJuIGYoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHY9cG4oKTtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6Iix2KTtsZXQgdz1lK2Ake3Z9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIit3KTt0cnl7Y29uc3QgQT1hd2FpdChhd2FpdCBmZXRjaCh3KSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6IixBLmJ5dGVMZW5ndGgpO2NvbnN0IEM9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6IixDKSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoQSksQyk7Y29uc3QgTz1kLl9sb2FkTW9kZWwoQS5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixPKSxPIT09MCl7ZigiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoXz1kLl9nZXRJbnB1dFdpZHRoKCksdC5pbnB1dEhlaWdodF89ZC5fZ2V0SW5wdXRIZWlnaHQoKSx0LmlucHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXRfPWQuX2dldElucHV0TWVtb3J5T2Zmc2V0KCksY29uc29sZS5sb2coIklucHV0IG1lbW9yeSBvZmZzZXQ6Iix0LmlucHV0TWVtb3J5T2Zmc2V0XyksY29uc29sZS5sb2coIklucHV0IGhlaWdodDoiLHQuaW5wdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGhfKSxjb25zb2xlLmxvZygiSW5wdXQgY2hhbm5lbHM6Iix0LmlucHV0Q2hhbm5lbENvdW50XyksdC5vdXRwdXRNZW1vcnlPZmZzZXRfPWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGhfPWQuX2dldE91dHB1dFdpZHRoKCksdC5vdXRwdXRIZWlnaHRfPWQuX2dldE91dHB1dEhlaWdodCgpLHQub3V0cHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgaGVpZ2h0OiIsdC5vdXRwdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiT3V0cHV0IHdpZHRoOiIsdC5vdXRwdXRXaWR0aF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudF8pLHQuc2VsZWN0ZWRURkxpdGVfPWR9Y2F0Y2goTSl7ZihNKTtyZXR1cm59XygpfSl9YSgpLnRoZW4oYz0+e2lmKGM9PT1udWxsKXRocm93IGNvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgbnVsbCIpLCJsb2FkVEZMaXRlIG51bGwiO3UoYykudGhlbihfPT57cyh0KX0pLmNhdGNoKF89Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKSxvKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKX0pfSkuY2F0Y2goYz0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgZXJyb3I6IixjKSxvKCJsb2FkVEZMaXRlIGVycm9yOiIrYyl9KX0pO3JldHVybiBufWNsYXNzIF9ue2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPSJibHVyKDBweCkiLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y29uc3QgUT1jbGFzc3tjb25zdHJ1Y3RvcihyKXtpZih0aGlzLmNvbmZpZ189cix0aGlzLmZyYW1lQ291bnRlcl89MCx0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF8pdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIpO3RoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0TWVtb3J5T2Zmc2V0Xz0wLHIudHJhbnNmb3JtZXJUeXBlPT09IlZpcnR1YWxCYWNrZ3JvdW5kIj8odGhpcy50aW1lckdhcF89US5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgY24oci5iYWNrZ3JvdW5kQXNzZXRVcmkpKTpyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IE90KHIucmFkaXVzKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIj90aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EOnIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIj8odGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgX24oci5yYWRpdXMpKToodGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgT3QpfWluaXQoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocixlKT0+e2F3YWl0IGduKHRoaXMuY29uZmlnXy53YXNtQXNzZXRVcmlQYXRoLHRoaXMuY29uZmlnXy50ZmxpdGVBc3NldFVyaVBhdGgpLnRoZW4odD0+e3QmJih0aGlzLnZvYW5nZVRGTGl0ZUluZm9fPXQsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0PXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyp0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tfPW5ldyBJbWFnZURhdGEodGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XyksdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dE1lbW9yeU9mZnNldF8vNCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5vdXRwdXRNZW1vcnlPZmZzZXRfLzQscigpKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmxvZygiZXJyb3IgdXNlVEZMaXRlOiIsdCksZSh0KX0pfSl9YXN5bmMgc3RhcnQoKXtpZih0eXBlb2YgdGhpcy52b2FuZ2VURkxpdGVJbmZvXz09InVuZGVmaW5lZCIpdGhyb3cidHJhbnNmb3JtZXIgbm90IGluaXQifWFzeW5jIHRyYW5zZm9ybShyLGUpeyh0aGlzLnJlc3VsdENhbnZhc18ud2lkdGghPXIuZGlzcGxheVdpZHRofHx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0IT1yLmRpc3BsYXlIZWlnaHQpJiYodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoPXIuZGlzcGxheVdpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQ9ci5kaXNwbGF5SGVpZ2h0KSwodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKG49PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxuLHQpfSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImNyZWF0ZUltYWdlQml0bWFwIixuKSxlLmVucXVldWUocil9KX1wcm9jZXNzRnJhbWUocixlLHQpe3QtdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz49dGhpcy50aW1lckdhcF8mJih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPXQsdGhpcy5wcm9jZXNzU291cmNlKGUpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1hdG9wIix0aGlzLnJlc3VsdEN0eF8uZmlsdGVyPSJub25lIix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfJiZ0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5ydW5Qb3N0UHJvY2Vzc2luZyh0aGlzLnJlc3VsdEN0eF8sZSksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLHRoaXMuZnJhbWVDb3VudGVyXysrfXByb2Nlc3NTb3VyY2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozXT1lLmRhdGFbdCo0XS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMV09ZS5kYXRhW3QqNCsxXS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMl09ZS5kYXRhW3QqNCsyXS8yNTU7dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgdD0wO3Q8dGhpcy5zZWdtZW50YXRpb25QaXhlbENvdW50Xzt0Kyspe2NvbnN0IG49dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLm91dHB1dE1lbW9yeU9mZnNldF8rdF07dGhpcy5zZWdtZW50YXRpb25NYXNrXy5kYXRhW3QqNCszXT0yNTUqbn10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLnB1dEltYWdlRGF0YSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tfLDAsMCksdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCl9Zmx1c2goKXt9Z2V0VHJhbnNmb3JtZXJUeXBlKCl7cmV0dXJuIkJhY2tncm91bmRUcmFuc2Zvcm1lciJ9c2V0VmlkZW9CR1JlYWRhYmxlKHIpe3RoaXMuY29uZmlnXy50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIiYmKHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBkbihyKSl9fTtsZXQgcWU9UTtxZS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUscWUuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MTVlNDtmdW5jdGlvbiB5bihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdm4ocil7aWYoeW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gVmUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjp2bihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKGU9bmV3IGxuLGUub24oImVycm9yIix0PT57Y29uc3Qgbj17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSksZS5vbigid2FybiIsdD0+e2NvbnN0IG49e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSkpfSxlO29ubWVzc2FnZT1hc3luYyB0PT57Y29uc3R7b3BlcmF0aW9uOm59PXQuZGF0YTtpZihjb25zb2xlLmxvZygib3BlcmF0aW9uPSIsbiksbj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpzLHdyaXRhYmxlOm8sY29uZmlnOmEsdmlkZW9CR1JlYWRhYmxlOnUsbWV0YURhdGE6Y309dC5kYXRhO3R5cGVvZiBjPT0ic3RyaW5nIiYmR3IoSlNPTi5wYXJzZShjKSkscigpO2xldCBfPVtdO2NvbnN0IGY9bmV3IHFlKEpTT04ucGFyc2UoYSkpO2Yuc2V0VmlkZW9CR1JlYWRhYmxlKHUpLGYuaW5pdCgpLnRoZW4oKCk9PntfLnB1c2goZiksZS5zZXRUcmFuc2Zvcm1lcnMoXykudGhlbigoKT0+e2UudHJhbnNmb3JtKHMsbykudGhlbigoKT0+e2NvbnN0IGQ9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZCkpfSkuY2F0Y2goZD0+e2NvbnN0IHY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUoZCl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHYpKX0pfSl9KS5jYXRjaChkPT57Y29uc3Qgdj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShkKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodikpfSl9ZWxzZSBuPT09ImRlc3Ryb3kiP2UuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBzPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShzKSl9KS5jYXRjaChzPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShzKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfSk6bj09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJmUuc2V0VHJhY2tFeHBlY3RlZFJhdGUodC5kYXRhLnJhdGUpfX19KSgpOwo=",_l=typeof window!="undefined"&&window.Blob&&new Blob([atob(ql)],{type:"text/javascript;charset=utf-8"});function yc(){const Z=_l&&(window.URL||window.webkitURL).createObjectURL(_l);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ql,{type:"module"})}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}const R=new WeakMap,ll=new WeakMap,U=new WeakMap,pl=Symbol("anyProducer"),ld=Promise.resolve(),dl=Symbol("listenerAdded"),cl=Symbol("listenerRemoved");let Vl=!1;function L(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Zl(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function v(Z,l){const d=ll.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function B(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:pl,c=U.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function Rc(Z,l,d){const c=U.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(pl)){const b=Promise.all([l,d]);for(const e of c.get(pl))e.enqueue(b)}}function dd(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(t){b.push(t),c()},finish(){d=!0,c()}};for(const t of l)B(Z,t).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(t=>{c=t}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(t){b=void 0;for(const n of l)B(Z,n).delete(e);return c(),arguments.length>0?{done:!0,value:await t}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cd(Z){if(Z===void 0)return Zd;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Zd.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const yl=Z=>Z===dl||Z===cl;class Y{static mixin(l,d){return d=cd(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const t of d)if(c.prototype[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new Y}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=t=>function(...n){return this[l][t](...n)};for(const t of d)Object.defineProperty(c.prototype,t,{enumerable:!1,value:e(t)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Vl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Vl}static set isDebugEnabled(l){Vl=l}constructor(l={}){R.set(this,new Set),ll.set(this,new Map),U.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const t=new Date,n=`${t.getHours()}:${t.getMinutes()}:${t.getSeconds()}.${t.getMilliseconds()}`;console.log(`[${n}][emittery:${d}][${c}] Event Name: ${b}
4
+ data: ${e}`)})}logIfDebugEnabled(l,d,c){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)L(c),v(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),yl(c)||this.emit(dl,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)L(c),v(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),yl(c)||this.emit(cl,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)L(d);return dd(this,l)}async emit(l,d){L(l),this.logIfDebugEnabled("emit",l,d),Rc(this,l,d);const c=v(this,l),b=R.get(this),e=[...c],t=yl(l)?[]:[...b];await ld,await Promise.all([...e.map(async n=>{if(c.has(n))return n(d)}),...t.map(async n=>{if(b.has(n))return n(l,d)})])}async emitSerial(l,d){L(l),this.logIfDebugEnabled("emitSerial",l,d);const c=v(this,l),b=R.get(this),e=[...c],t=[...b];await ld;for(const n of e)c.has(n)&&await n(d);for(const n of t)b.has(n)&&await n(l,d)}onAny(l){return Zl(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(l),this.emit(dl,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return dd(this)}offAny(l){Zl(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(cl,{listener:l}),R.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){v(this,d).clear();const c=B(this,d);for(const b of c)b.finish();c.clear()}else{R.get(this).clear();for(const c of ll.get(this).values())c.clear();for(const c of U.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=R.get(this).size+v(this,c).size+B(this,c).size+B(this).size;continue}typeof c!="undefined"&&L(c),d+=R.get(this).size;for(const b of ll.get(this).values())d+=b.size;for(const b of U.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=cd(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Zd=Object.getOwnPropertyNames(Y.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:dl,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:cl,writable:!1,enumerable:!0,configurable:!1});var Yc=Y;class Jc extends Yc{constructor(l){super();this.config_=l,this.worker_=new yc,this.trackExpectedRate_=-1,this.workerInited_=!1,this.onMessage_=new Promise((d,c)=>{this.worker_.addEventListener("message",b=>{let e=JSON.parse(b.data);e.callbackType==="success"?d():e.callbackType==="error"?c(e.message):e.callbackType==="media_processor_error_event"?this.emit("error",e.message):e.callbackType==="media_processor_warn_event"&&this.emit("warn",e.message)})})}transform(l,d){return new Promise(async(c,b)=>{let e=JSON.stringify(rc());if(typeof e!="string"&&(e=JSON.stringify({})),this.config_.transformerType==="VideoBackground"){const t=document.createElement("video");t.src=this.config_.backgroundAssetUri,t.muted=!0;try{await t.play()}catch(i){b(i);return}const n=t.captureStream().getVideoTracks()[0],s=new MediaStreamTrackProcessor(n).readable;this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),videoBGReadable:s,metaData:e},[l,d,s])}else this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),metaData:e},[l,d]);this.onMessage_.then(()=>{console.log("Worker inited"),this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),c()}).catch(t=>{console.log("Worker inited error"),b(t)})})}destroy(){return new Promise(async(l,d)=>{this.worker_.postMessage({operation:"destroy"}),this.onMessage_.then(()=>{console.log("Worker destroyed"),l()}).catch(c=>{console.log("Worker destroy error"),d(c)})})}setTrackExpectedRate(l){this.trackExpectedRate_=l,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}}r.BlurRadius=void 0,function(Z){Z.Low="Low",Z.High="High"}(r.BlurRadius||(r.BlurRadius={}));const Ic=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Kc(){return new Promise(async(Z,l)=>{try{await F()}catch(d){l(d);return}Ic().then(d=>{if(d===!1){l("Your browser does not support WebAssembly features.");return}Z()}).catch(d=>{l(d)})})}let g,bl=-1;function fc(){return g}function Sc(Z){bl=Z,typeof g!="undefined"&&g.setTrackExpectedRate(bl)}function Nc(Z){return new Promise(async(l,d)=>{g=new Jc(Z),bl!=-1&&g.setTrackExpectedRate(bl);const c=new Vc(g);l(c)})}r.createVonageMediaProcessorConnector=Nc,r.getVonageEventEmitter=fc,r.isSupported=Kc,r.setTrackExpectedRate=Sc,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vonage/ml-transformers",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "author": "Guy Mininberg <guy.mininberg@vonage.com>",
5
5
  "contributors": [
6
6
  "Guy Mininberg <guy.mininberg@vonage.com>",
@@ -37,7 +37,7 @@
37
37
  "axios": "^0.25.0",
38
38
  "uuid": "^8.3.2",
39
39
  "typescript-optional": "3.0.0-alpha.3",
40
- "@vonage/media-processor": "1.1.1"
40
+ "@vonage/media-processor": "1.1.3"
41
41
  },
42
42
  "files": [
43
43
  "dist"