{"id":276,"date":"2021-07-06T21:08:57","date_gmt":"2021-07-06T21:08:57","guid":{"rendered":"https:\/\/www.vextor.net\/?page_id=276"},"modified":"2021-07-06T21:10:01","modified_gmt":"2021-07-06T21:10:01","slug":"asdf","status":"publish","type":"page","link":"https:\/\/www.vextor.net\/?page_id=276","title":{"rendered":"RDG"},"content":{"rendered":"\n<!DOCTYPE html>\n<html>\n  <head>\n    <title>Random Dungeon Generator v1.0.3<\/title>\n    <script type=\"text\/javascript\">\n\/\/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\/\/ this is a completely self-contained random dungeon generator,\n\/\/ implemented in HTML5 and JavaScript.\n\/\/\n\/\/   version 1.0.3      updated save_canvas to use filename\n\/\/   version 1.0.2      linked to generator.js version 2.0\n\/\/   version 1.0.1      cache set_pixel() for performance\n\/\/   version 1.0        initial release\n\/\/\n\/\/ written by drow [drow@bin.sh]\n\/\/ http:\/\/creativecommons.org\/licenses\/by-nc\/3.0\/\n\n\/\/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n    <\/script>\n    <link rel=\"stylesheet\" type=\"text\/css\" href=\"data:text\/css;base64,LyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLyogZHVuZ2Vvbi5jc3MgKi8KCi8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi8qIHN0cnVjdHVyZSAqLwoKYm9keSB7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHg7CiAgZm9udC1mYW1pbHk6ICdBc3VsJywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNHB4OyB9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBjb21tb24gKi8KCmgxIHsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE1MCU7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Cgpmb3JtIHsgbWFyZ2luOiAyZXggMmVtOyBwYWRkaW5nOiAwcHg7IH0KaW5wdXQgeyBtYXJnaW4tcmlnaHQ6IDAuNWVtOyBwYWRkaW5nOiAwLjVleCAwLjVlbTsKICBmb250LWZhbWlseTogTW9uYWNvLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTFweDsgfQpzZWxlY3QgeyBtaW4td2lkdGg6IDEwZW07IG1hcmdpbi1yaWdodDogMC41ZW07IGZvbnQtc2l6ZTogMTFweDsgfQoKdGFibGUgeyBtYXJnaW46IDBweCAyZW07IGJvcmRlcjogbm9uZTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQp0ZCB7IHBhZGRpbmc6IDAuNWV4IDAuNWVtOyB0ZXh0LWFsaWduOiBsZWZ0OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9CnRkLmtleSB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXdlaWdodDogYm9sZDsgfQoKY2FudmFzIHsgbWFyZ2luOiAyZXggYXV0bzsgfQoKLmNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlcjsgfQp0YWJsZS5jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBzY3JlZW4gKi8KCkBtZWRpYSBzY3JlZW4gewogIGgxLnRpdGxlIHsgZGlzcGxheTogbm9uZTsgfQogIGZvcm0geyBkaXNwbGF5OiBibG9jazsgfQp9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBwcmludCAqLwoKQG1lZGlhIHByaW50IHsKICBoMS50aXRsZSB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgZm9ybSB7IGRpc3BsYXk6IG5vbmU7IH0KfQoKLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8K\" \/>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,dmFyIFByb3RvdHlwZT17VmVyc2lvbjoiMS43LjIiLEJyb3dzZXI6ZnVuY3Rpb24oKXt2YXIgdWE9bmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgaXNPcGVyYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKT09IltvYmplY3QgT3BlcmFdIjtyZXR1cm57SUU6ISF3aW5kb3cuYXR0YWNoRXZlbnQmJiFpc09wZXJhLE9wZXJhOmlzT3BlcmEsV2ViS2l0OnVhLmluZGV4T2YoIkFwcGxlV2ViS2l0LyIpPi0xLEdlY2tvOnVhLmluZGV4T2YoIkdlY2tvIik+LTEmJnVhLmluZGV4T2YoIktIVE1MIik9PT0tMSxNb2JpbGVTYWZhcmk6L0FwcGxlLipNb2JpbGUvLnRlc3QodWEpfX0oKSxCcm93c2VyRmVhdHVyZXM6e1hQYXRoOiEhZG9jdW1lbnQuZXZhbHVhdGUsU2VsZWN0b3JzQVBJOiEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcixFbGVtZW50RXh0ZW5zaW9uczpmdW5jdGlvbigpe3ZhciBjb25zdHJ1Y3Rvcj13aW5kb3cuRWxlbWVudHx8d2luZG93LkhUTUxFbGVtZW50OwpyZXR1cm4hIShjb25zdHJ1Y3RvciYmY29uc3RydWN0b3IucHJvdG90eXBlKX0oKSxTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOmZ1bmN0aW9uKCl7aWYodHlwZW9mIHdpbmRvdy5IVE1MRGl2RWxlbWVudCE9PSJ1bmRlZmluZWQiKXJldHVybiB0cnVlO3ZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZm9ybT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksaXNTdXBwb3J0ZWQ9ZmFsc2U7aWYoZGl2WyJfX3Byb3RvX18iXSYmZGl2WyJfX3Byb3RvX18iXSE9PWZvcm1bIl9fcHJvdG9fXyJdKWlzU3VwcG9ydGVkPXRydWU7ZGl2PWZvcm09bnVsbDtyZXR1cm4gaXNTdXBwb3J0ZWR9KCl9LFNjcmlwdEZyYWdtZW50OiI8c2NyaXB0W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0XFxzKj4iLEpTT05GaWx0ZXI6L15cL1wqLXNlY3VyZS0oW1xzXFNdKilcKlwvXHMqJC8sZW1wdHlGdW5jdGlvbjpmdW5jdGlvbigpe30sSzpmdW5jdGlvbih4KXtyZXR1cm4geH19OwppZihQcm90b3R5cGUuQnJvd3Nlci5Nb2JpbGVTYWZhcmkpUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zPWZhbHNlOwp2YXIgQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgSVNfRE9OVEVOVU1fQlVHR1k9ZnVuY3Rpb24oKXtmb3IodmFyIHAgaW57dG9TdHJpbmc6MX0paWYocD09PSJ0b1N0cmluZyIpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSgpO2Z1bmN0aW9uIHN1YmNsYXNzKCl7fWZ1bmN0aW9uIGNyZWF0ZSgpe3ZhciBwYXJlbnQ9bnVsbCxwcm9wZXJ0aWVzPSRBKGFyZ3VtZW50cyk7aWYoT2JqZWN0LmlzRnVuY3Rpb24ocHJvcGVydGllc1swXSkpcGFyZW50PXByb3BlcnRpZXMuc2hpZnQoKTtmdW5jdGlvbiBrbGFzcygpe3RoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9T2JqZWN0LmV4dGVuZChrbGFzcyxDbGFzcy5NZXRob2RzKTtrbGFzcy5zdXBlcmNsYXNzPXBhcmVudDtrbGFzcy5zdWJjbGFzc2VzPVtdO2lmKHBhcmVudCl7c3ViY2xhc3MucHJvdG90eXBlPXBhcmVudC5wcm90b3R5cGU7a2xhc3MucHJvdG90eXBlPW5ldyBzdWJjbGFzcztwYXJlbnQuc3ViY2xhc3Nlcy5wdXNoKGtsYXNzKX1mb3IodmFyIGk9CjAsbGVuZ3RoPXByb3BlcnRpZXMubGVuZ3RoO2k8bGVuZ3RoO2krKylrbGFzcy5hZGRNZXRob2RzKHByb3BlcnRpZXNbaV0pO2lmKCFrbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZSlrbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZT1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjtrbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2xhc3M7cmV0dXJuIGtsYXNzfWZ1bmN0aW9uIGFkZE1ldGhvZHMoc291cmNlKXt2YXIgYW5jZXN0b3I9dGhpcy5zdXBlcmNsYXNzJiZ0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlLHByb3BlcnRpZXM9T2JqZWN0LmtleXMoc291cmNlKTtpZihJU19ET05URU5VTV9CVUdHWSl7aWYoc291cmNlLnRvU3RyaW5nIT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKXByb3BlcnRpZXMucHVzaCgidG9TdHJpbmciKTtpZihzb3VyY2UudmFsdWVPZiE9T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKXByb3BlcnRpZXMucHVzaCgidmFsdWVPZiIpfWZvcih2YXIgaT0wLGxlbmd0aD0KcHJvcGVydGllcy5sZW5ndGg7aTxsZW5ndGg7aSsrKXt2YXIgcHJvcGVydHk9cHJvcGVydGllc1tpXSx2YWx1ZT1zb3VyY2VbcHJvcGVydHldO2lmKGFuY2VzdG9yJiZPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkmJnZhbHVlLmFyZ3VtZW50TmFtZXMoKVswXT09IiRzdXBlciIpe3ZhciBtZXRob2Q9dmFsdWU7dmFsdWU9ZnVuY3Rpb24obSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFuY2VzdG9yW21dLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KHByb3BlcnR5KS53cmFwKG1ldGhvZCk7dmFsdWUudmFsdWVPZj1mdW5jdGlvbihtZXRob2Qpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBtZXRob2QudmFsdWVPZi5jYWxsKG1ldGhvZCl9fShtZXRob2QpO3ZhbHVlLnRvU3RyaW5nPWZ1bmN0aW9uKG1ldGhvZCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG1ldGhvZC50b1N0cmluZy5jYWxsKG1ldGhvZCl9fShtZXRob2QpfXRoaXMucHJvdG90eXBlW3Byb3BlcnR5XT12YWx1ZX1yZXR1cm4gdGhpc30KcmV0dXJue2NyZWF0ZTpjcmVhdGUsTWV0aG9kczp7YWRkTWV0aG9kczphZGRNZXRob2RzfX19KCk7CihmdW5jdGlvbigpe3ZhciBfdG9TdHJpbmc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxfaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxOVUxMX1RZUEU9Ik51bGwiLFVOREVGSU5FRF9UWVBFPSJVbmRlZmluZWQiLEJPT0xFQU5fVFlQRT0iQm9vbGVhbiIsTlVNQkVSX1RZUEU9Ik51bWJlciIsU1RSSU5HX1RZUEU9IlN0cmluZyIsT0JKRUNUX1RZUEU9Ik9iamVjdCIsRlVOQ1RJT05fQ0xBU1M9IltvYmplY3QgRnVuY3Rpb25dIixCT09MRUFOX0NMQVNTPSJbb2JqZWN0IEJvb2xlYW5dIixOVU1CRVJfQ0xBU1M9IltvYmplY3QgTnVtYmVyXSIsU1RSSU5HX0NMQVNTPSJbb2JqZWN0IFN0cmluZ10iLEFSUkFZX0NMQVNTPSJbb2JqZWN0IEFycmF5XSIsREFURV9DTEFTUz0iW29iamVjdCBEYXRlXSIsTkFUSVZFX0pTT05fU1RSSU5HSUZZX1NVUFBPUlQ9d2luZG93LkpTT04mJnR5cGVvZiBKU09OLnN0cmluZ2lmeT09PSJmdW5jdGlvbiImJkpTT04uc3RyaW5naWZ5KDApPT09CiIwIiYmdHlwZW9mIEpTT04uc3RyaW5naWZ5KFByb3RvdHlwZS5LKT09PSJ1bmRlZmluZWQiO3ZhciBET05UX0VOVU1TPVsidG9TdHJpbmciLCJ0b0xvY2FsZVN0cmluZyIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImNvbnN0cnVjdG9yIl07dmFyIElTX0RPTlRFTlVNX0JVR0dZPWZ1bmN0aW9uKCl7Zm9yKHZhciBwIGlue3RvU3RyaW5nOjF9KWlmKHA9PT0idG9TdHJpbmciKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX0oKTtmdW5jdGlvbiBUeXBlKG8pe3N3aXRjaChvKXtjYXNlIG51bGw6cmV0dXJuIE5VTExfVFlQRTtjYXNlIHZvaWQgMDpyZXR1cm4gVU5ERUZJTkVEX1RZUEV9dmFyIHR5cGU9dHlwZW9mIG87c3dpdGNoKHR5cGUpe2Nhc2UgImJvb2xlYW4iOnJldHVybiBCT09MRUFOX1RZUEU7Y2FzZSAibnVtYmVyIjpyZXR1cm4gTlVNQkVSX1RZUEU7Y2FzZSAic3RyaW5nIjpyZXR1cm4gU1RSSU5HX1RZUEV9cmV0dXJuIE9CSkVDVF9UWVBFfQpmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sc291cmNlKXtmb3IodmFyIHByb3BlcnR5IGluIHNvdXJjZSlkZXN0aW5hdGlvbltwcm9wZXJ0eV09c291cmNlW3Byb3BlcnR5XTtyZXR1cm4gZGVzdGluYXRpb259ZnVuY3Rpb24gaW5zcGVjdChvYmplY3Qpe3RyeXtpZihpc1VuZGVmaW5lZChvYmplY3QpKXJldHVybiJ1bmRlZmluZWQiO2lmKG9iamVjdD09PW51bGwpcmV0dXJuIm51bGwiO3JldHVybiBvYmplY3QuaW5zcGVjdD9vYmplY3QuaW5zcGVjdCgpOlN0cmluZyhvYmplY3QpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXJldHVybiIuLi4iO3Rocm93IGU7fX1mdW5jdGlvbiB0b0pTT04odmFsdWUpe3JldHVybiBTdHIoIiIseyIiOnZhbHVlfSxbXSl9ZnVuY3Rpb24gU3RyKGtleSxob2xkZXIsc3RhY2spe3ZhciB2YWx1ZT1ob2xkZXJba2V5XTtpZihUeXBlKHZhbHVlKT09PU9CSkVDVF9UWVBFJiZ0eXBlb2YgdmFsdWUudG9KU09OPT09ImZ1bmN0aW9uIil2YWx1ZT0KdmFsdWUudG9KU09OKGtleSk7dmFyIF9jbGFzcz1fdG9TdHJpbmcuY2FsbCh2YWx1ZSk7c3dpdGNoKF9jbGFzcyl7Y2FzZSBOVU1CRVJfQ0xBU1M6Y2FzZSBCT09MRUFOX0NMQVNTOmNhc2UgU1RSSU5HX0NMQVNTOnZhbHVlPXZhbHVlLnZhbHVlT2YoKX1zd2l0Y2godmFsdWUpe2Nhc2UgbnVsbDpyZXR1cm4ibnVsbCI7Y2FzZSB0cnVlOnJldHVybiJ0cnVlIjtjYXNlIGZhbHNlOnJldHVybiJmYWxzZSJ9dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3N3aXRjaCh0eXBlKXtjYXNlICJzdHJpbmciOnJldHVybiB2YWx1ZS5pbnNwZWN0KHRydWUpO2Nhc2UgIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKHZhbHVlKT9TdHJpbmcodmFsdWUpOiJudWxsIjtjYXNlICJvYmplY3QiOmZvcih2YXIgaT0wLGxlbmd0aD1zdGFjay5sZW5ndGg7aTxsZW5ndGg7aSsrKWlmKHN0YWNrW2ldPT09dmFsdWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3ljbGljIHJlZmVyZW5jZSB0byAnIit2YWx1ZSsiJyBpbiBvYmplY3QiKTsKc3RhY2sucHVzaCh2YWx1ZSk7dmFyIHBhcnRpYWw9W107aWYoX2NsYXNzPT09QVJSQVlfQ0xBU1Mpe2Zvcih2YXIgaT0wLGxlbmd0aD12YWx1ZS5sZW5ndGg7aTxsZW5ndGg7aSsrKXt2YXIgc3RyPVN0cihpLHZhbHVlLHN0YWNrKTtwYXJ0aWFsLnB1c2godHlwZW9mIHN0cj09PSJ1bmRlZmluZWQiPyJudWxsIjpzdHIpfXBhcnRpYWw9IlsiK3BhcnRpYWwuam9pbigiLCIpKyJdIn1lbHNle3ZhciBrZXlzPU9iamVjdC5rZXlzKHZhbHVlKTtmb3IodmFyIGk9MCxsZW5ndGg9a2V5cy5sZW5ndGg7aTxsZW5ndGg7aSsrKXt2YXIga2V5PWtleXNbaV0sc3RyPVN0cihrZXksdmFsdWUsc3RhY2spO2lmKHR5cGVvZiBzdHIhPT0idW5kZWZpbmVkIilwYXJ0aWFsLnB1c2goa2V5Lmluc3BlY3QodHJ1ZSkrIjoiK3N0cil9cGFydGlhbD0ieyIrcGFydGlhbC5qb2luKCIsIikrIn0ifXN0YWNrLnBvcCgpO3JldHVybiBwYXJ0aWFsfX1mdW5jdGlvbiBzdHJpbmdpZnkob2JqZWN0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0KX0KZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhvYmplY3Qpe3JldHVybiAkSChvYmplY3QpLnRvUXVlcnlTdHJpbmcoKX1mdW5jdGlvbiB0b0hUTUwob2JqZWN0KXtyZXR1cm4gb2JqZWN0JiZvYmplY3QudG9IVE1MP29iamVjdC50b0hUTUwoKTpTdHJpbmcuaW50ZXJwcmV0KG9iamVjdCl9ZnVuY3Rpb24ga2V5cyhvYmplY3Qpe2lmKFR5cGUob2JqZWN0KSE9PU9CSkVDVF9UWVBFKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIHJlc3VsdHM9W107Zm9yKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpaWYoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSlyZXN1bHRzLnB1c2gocHJvcGVydHkpO2lmKElTX0RPTlRFTlVNX0JVR0dZKWZvcih2YXIgaT0wO3Byb3BlcnR5PURPTlRfRU5VTVNbaV07aSsrKWlmKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxwcm9wZXJ0eSkpcmVzdWx0cy5wdXNoKHByb3BlcnR5KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KXt2YXIgcmVzdWx0cz0KW107Zm9yKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpcmVzdWx0cy5wdXNoKG9iamVjdFtwcm9wZXJ0eV0pO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIGNsb25lKG9iamVjdCl7cmV0dXJuIGV4dGVuZCh7fSxvYmplY3QpfWZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3Qpe3JldHVybiEhKG9iamVjdCYmb2JqZWN0Lm5vZGVUeXBlPT0xKX1mdW5jdGlvbiBpc0FycmF5KG9iamVjdCl7cmV0dXJuIF90b1N0cmluZy5jYWxsKG9iamVjdCk9PT1BUlJBWV9DTEFTU312YXIgaGFzTmF0aXZlSXNBcnJheT10eXBlb2YgQXJyYXkuaXNBcnJheT09ImZ1bmN0aW9uIiYmQXJyYXkuaXNBcnJheShbXSkmJiFBcnJheS5pc0FycmF5KHt9KTtpZihoYXNOYXRpdmVJc0FycmF5KWlzQXJyYXk9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBpc0hhc2gob2JqZWN0KXtyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgSGFzaH1mdW5jdGlvbiBpc0Z1bmN0aW9uKG9iamVjdCl7cmV0dXJuIF90b1N0cmluZy5jYWxsKG9iamVjdCk9PT0KRlVOQ1RJT05fQ0xBU1N9ZnVuY3Rpb24gaXNTdHJpbmcob2JqZWN0KXtyZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqZWN0KT09PVNUUklOR19DTEFTU31mdW5jdGlvbiBpc051bWJlcihvYmplY3Qpe3JldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpPT09TlVNQkVSX0NMQVNTfWZ1bmN0aW9uIGlzRGF0ZShvYmplY3Qpe3JldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpPT09REFURV9DTEFTU31mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmplY3Qpe3JldHVybiB0eXBlb2Ygb2JqZWN0PT09InVuZGVmaW5lZCJ9ZXh0ZW5kKE9iamVjdCx7ZXh0ZW5kOmV4dGVuZCxpbnNwZWN0Omluc3BlY3QsdG9KU09OOk5BVElWRV9KU09OX1NUUklOR0lGWV9TVVBQT1JUP3N0cmluZ2lmeTp0b0pTT04sdG9RdWVyeVN0cmluZzp0b1F1ZXJ5U3RyaW5nLHRvSFRNTDp0b0hUTUwsa2V5czpPYmplY3Qua2V5c3x8a2V5cyx2YWx1ZXM6dmFsdWVzLGNsb25lOmNsb25lLGlzRWxlbWVudDppc0VsZW1lbnQsaXNBcnJheTppc0FycmF5LAppc0hhc2g6aXNIYXNoLGlzRnVuY3Rpb246aXNGdW5jdGlvbixpc1N0cmluZzppc1N0cmluZyxpc051bWJlcjppc051bWJlcixpc0RhdGU6aXNEYXRlLGlzVW5kZWZpbmVkOmlzVW5kZWZpbmVkfSl9KSgpOwpPYmplY3QuZXh0ZW5kKEZ1bmN0aW9uLnByb3RvdHlwZSxmdW5jdGlvbigpe3ZhciBzbGljZT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gdXBkYXRlKGFycmF5LGFyZ3Mpe3ZhciBhcnJheUxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPWFyZ3MubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWFycmF5W2FycmF5TGVuZ3RoK2xlbmd0aF09YXJnc1tsZW5ndGhdO3JldHVybiBhcnJheX1mdW5jdGlvbiBtZXJnZShhcnJheSxhcmdzKXthcnJheT1zbGljZS5jYWxsKGFycmF5LDApO3JldHVybiB1cGRhdGUoYXJyYXksYXJncyl9ZnVuY3Rpb24gYXJndW1lbnROYW1lcygpe3ZhciBuYW1lcz10aGlzLnRvU3RyaW5nKCkubWF0Y2goL15bXHNcKF0qZnVuY3Rpb25bXihdKlwoKFteKV0qKVwpLylbMV0ucmVwbGFjZSgvXC9cLy4qP1tcclxuXXxcL1wqKD86LnxbXHJcbl0pKj9cKlwvL2csIiIpLnJlcGxhY2UoL1xzKy9nLCIiKS5zcGxpdCgiLCIpO3JldHVybiBuYW1lcy5sZW5ndGg9PTEmJiFuYW1lc1swXT8KW106bmFtZXN9ZnVuY3Rpb24gYmluZChjb250ZXh0KXtpZihhcmd1bWVudHMubGVuZ3RoPDImJk9iamVjdC5pc1VuZGVmaW5lZChhcmd1bWVudHNbMF0pKXJldHVybiB0aGlzO2lmKCFPYmplY3QuaXNGdW5jdGlvbih0aGlzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZS4iKTt2YXIgbm9wPWZ1bmN0aW9uKCl7fTt2YXIgX19tZXRob2Q9dGhpcyxhcmdzPXNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3ZhciBib3VuZD1mdW5jdGlvbigpe3ZhciBhPW1lcmdlKGFyZ3MsYXJndW1lbnRzKTt2YXIgYz10aGlzIGluc3RhbmNlb2YgYm91bmQ\/dGhpczpjb250ZXh0O3JldHVybiBfX21ldGhvZC5hcHBseShjLGEpfTtub3AucHJvdG90eXBlPXRoaXMucHJvdG90eXBlO2JvdW5kLnByb3RvdHlwZT1uZXcgbm9wO3JldHVybiBib3VuZH1mdW5jdGlvbiBiaW5kQXNFdmVudExpc3RlbmVyKGNvbnRleHQpe3ZhciBfX21ldGhvZD10aGlzLGFyZ3M9c2xpY2UuY2FsbChhcmd1bWVudHMsCjEpO3JldHVybiBmdW5jdGlvbihldmVudCl7dmFyIGE9dXBkYXRlKFtldmVudHx8d2luZG93LmV2ZW50XSxhcmdzKTtyZXR1cm4gX19tZXRob2QuYXBwbHkoY29udGV4dCxhKX19ZnVuY3Rpb24gY3VycnkoKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgX19tZXRob2Q9dGhpcyxhcmdzPXNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW1lcmdlKGFyZ3MsYXJndW1lbnRzKTtyZXR1cm4gX19tZXRob2QuYXBwbHkodGhpcyxhKX19ZnVuY3Rpb24gZGVsYXkodGltZW91dCl7dmFyIF9fbWV0aG9kPXRoaXMsYXJncz1zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt0aW1lb3V0PXRpbWVvdXQqMUUzO3JldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBfX21ldGhvZC5hcHBseShfX21ldGhvZCxhcmdzKX0sdGltZW91dCl9ZnVuY3Rpb24gZGVmZXIoKXt2YXIgYXJncz11cGRhdGUoWzAuMDFdLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuZGVsYXkuYXBwbHkodGhpcywKYXJncyl9ZnVuY3Rpb24gd3JhcCh3cmFwcGVyKXt2YXIgX19tZXRob2Q9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT11cGRhdGUoW19fbWV0aG9kLmJpbmQodGhpcyldLGFyZ3VtZW50cyk7cmV0dXJuIHdyYXBwZXIuYXBwbHkodGhpcyxhKX19ZnVuY3Rpb24gbWV0aG9kaXplKCl7aWYodGhpcy5fbWV0aG9kaXplZClyZXR1cm4gdGhpcy5fbWV0aG9kaXplZDt2YXIgX19tZXRob2Q9dGhpcztyZXR1cm4gdGhpcy5fbWV0aG9kaXplZD1mdW5jdGlvbigpe3ZhciBhPXVwZGF0ZShbdGhpc10sYXJndW1lbnRzKTtyZXR1cm4gX19tZXRob2QuYXBwbHkobnVsbCxhKX19dmFyIGV4dGVuc2lvbnM9e2FyZ3VtZW50TmFtZXM6YXJndW1lbnROYW1lcyxiaW5kQXNFdmVudExpc3RlbmVyOmJpbmRBc0V2ZW50TGlzdGVuZXIsY3Vycnk6Y3VycnksZGVsYXk6ZGVsYXksZGVmZXI6ZGVmZXIsd3JhcDp3cmFwLG1ldGhvZGl6ZTptZXRob2RpemV9O2lmKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZClleHRlbnNpb25zLmJpbmQ9CmJpbmQ7cmV0dXJuIGV4dGVuc2lvbnN9KCkpOyhmdW5jdGlvbihwcm90byl7ZnVuY3Rpb24gdG9JU09TdHJpbmcoKXtyZXR1cm4gdGhpcy5nZXRVVENGdWxsWWVhcigpKyItIisodGhpcy5nZXRVVENNb250aCgpKzEpLnRvUGFkZGVkU3RyaW5nKDIpKyItIit0aGlzLmdldFVUQ0RhdGUoKS50b1BhZGRlZFN0cmluZygyKSsiVCIrdGhpcy5nZXRVVENIb3VycygpLnRvUGFkZGVkU3RyaW5nKDIpKyI6Iit0aGlzLmdldFVUQ01pbnV0ZXMoKS50b1BhZGRlZFN0cmluZygyKSsiOiIrdGhpcy5nZXRVVENTZWNvbmRzKCkudG9QYWRkZWRTdHJpbmcoMikrIloifWZ1bmN0aW9uIHRvSlNPTigpe3JldHVybiB0aGlzLnRvSVNPU3RyaW5nKCl9aWYoIXByb3RvLnRvSVNPU3RyaW5nKXByb3RvLnRvSVNPU3RyaW5nPXRvSVNPU3RyaW5nO2lmKCFwcm90by50b0pTT04pcHJvdG8udG9KU09OPXRvSlNPTn0pKERhdGUucHJvdG90eXBlKTtSZWdFeHAucHJvdG90eXBlLm1hdGNoPVJlZ0V4cC5wcm90b3R5cGUudGVzdDsKUmVnRXhwLmVzY2FwZT1mdW5jdGlvbihzdHIpe3JldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX07CnZhciBQZXJpb2RpY2FsRXhlY3V0ZXI9Q2xhc3MuY3JlYXRlKHtpbml0aWFsaXplOmZ1bmN0aW9uKGNhbGxiYWNrLGZyZXF1ZW5jeSl7dGhpcy5jYWxsYmFjaz1jYWxsYmFjazt0aGlzLmZyZXF1ZW5jeT1mcmVxdWVuY3k7dGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9ZmFsc2U7dGhpcy5yZWdpc3RlckNhbGxiYWNrKCl9LHJlZ2lzdGVyQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnRpbWVyPXNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksdGhpcy5mcmVxdWVuY3kqMUUzKX0sZXhlY3V0ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2sodGhpcyl9LHN0b3A6ZnVuY3Rpb24oKXtpZighdGhpcy50aW1lcilyZXR1cm47Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTt0aGlzLnRpbWVyPW51bGx9LG9uVGltZXJFdmVudDpmdW5jdGlvbigpe2lmKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyl0cnl7dGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9dHJ1ZTt0aGlzLmV4ZWN1dGUoKTsKdGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9ZmFsc2V9Y2F0Y2goZSl7dGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9ZmFsc2U7dGhyb3cgZTt9fX0pO09iamVjdC5leHRlbmQoU3RyaW5nLHtpbnRlcnByZXQ6ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbD8iIjpTdHJpbmcodmFsdWUpfSxzcGVjaWFsQ2hhcjp7Ilx1MDAwOCI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcdTAwMGMiOiJcXGYiLCJcciI6IlxcciIsIlxcIjoiXFxcXCJ9fSk7Ck9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSxmdW5jdGlvbigpe3ZhciBOQVRJVkVfSlNPTl9QQVJTRV9TVVBQT1JUPXdpbmRvdy5KU09OJiZ0eXBlb2YgSlNPTi5wYXJzZT09PSJmdW5jdGlvbiImJkpTT04ucGFyc2UoJ3sidGVzdCI6IHRydWV9JykudGVzdDtmdW5jdGlvbiBwcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpe2lmKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSlyZXR1cm4gcmVwbGFjZW1lbnQ7dmFyIHRlbXBsYXRlPW5ldyBUZW1wbGF0ZShyZXBsYWNlbWVudCk7cmV0dXJuIGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gdGVtcGxhdGUuZXZhbHVhdGUobWF0Y2gpfX1mdW5jdGlvbiBpc05vbkVtcHR5UmVnRXhwKHJlZ2V4cCl7cmV0dXJuIHJlZ2V4cC5zb3VyY2UmJnJlZ2V4cC5zb3VyY2UhPT0iKD86KSJ9ZnVuY3Rpb24gZ3N1YihwYXR0ZXJuLHJlcGxhY2VtZW50KXt2YXIgcmVzdWx0PSIiLHNvdXJjZT10aGlzLG1hdGNoO3JlcGxhY2VtZW50PXByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CmlmKE9iamVjdC5pc1N0cmluZyhwYXR0ZXJuKSlwYXR0ZXJuPVJlZ0V4cC5lc2NhcGUocGF0dGVybik7aWYoIShwYXR0ZXJuLmxlbmd0aHx8aXNOb25FbXB0eVJlZ0V4cChwYXR0ZXJuKSkpe3JlcGxhY2VtZW50PXJlcGxhY2VtZW50KCIiKTtyZXR1cm4gcmVwbGFjZW1lbnQrc291cmNlLnNwbGl0KCIiKS5qb2luKHJlcGxhY2VtZW50KStyZXBsYWNlbWVudH13aGlsZShzb3VyY2UubGVuZ3RoPjApe21hdGNoPXNvdXJjZS5tYXRjaChwYXR0ZXJuKTtpZihtYXRjaCYmbWF0Y2hbMF0ubGVuZ3RoPjApe3Jlc3VsdCs9c291cmNlLnNsaWNlKDAsbWF0Y2guaW5kZXgpO3Jlc3VsdCs9U3RyaW5nLmludGVycHJldChyZXBsYWNlbWVudChtYXRjaCkpO3NvdXJjZT1zb3VyY2Uuc2xpY2UobWF0Y2guaW5kZXgrbWF0Y2hbMF0ubGVuZ3RoKX1lbHNlIHJlc3VsdCs9c291cmNlLHNvdXJjZT0iIn1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN1YihwYXR0ZXJuLHJlcGxhY2VtZW50LGNvdW50KXtyZXBsYWNlbWVudD0KcHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTtjb3VudD1PYmplY3QuaXNVbmRlZmluZWQoY291bnQpPzE6Y291bnQ7cmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLGZ1bmN0aW9uKG1hdGNoKXtpZigtLWNvdW50PDApcmV0dXJuIG1hdGNoWzBdO3JldHVybiByZXBsYWNlbWVudChtYXRjaCl9KX1mdW5jdGlvbiBzY2FuKHBhdHRlcm4saXRlcmF0b3Ipe3RoaXMuZ3N1YihwYXR0ZXJuLGl0ZXJhdG9yKTtyZXR1cm4gU3RyaW5nKHRoaXMpfWZ1bmN0aW9uIHRydW5jYXRlKGxlbmd0aCx0cnVuY2F0aW9uKXtsZW5ndGg9bGVuZ3RofHwzMDt0cnVuY2F0aW9uPU9iamVjdC5pc1VuZGVmaW5lZCh0cnVuY2F0aW9uKT8iLi4uIjp0cnVuY2F0aW9uO3JldHVybiB0aGlzLmxlbmd0aD5sZW5ndGg\/dGhpcy5zbGljZSgwLGxlbmd0aC10cnVuY2F0aW9uLmxlbmd0aCkrdHJ1bmNhdGlvbjpTdHJpbmcodGhpcyl9ZnVuY3Rpb24gc3RyaXAoKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sCiIiKX1mdW5jdGlvbiBzdHJpcFRhZ3MoKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC88XHcrKFxzKygiW14iXSoifCdbXiddKid8W14+XSkrKT8+fDxcL1x3Kz4vZ2ksIiIpfWZ1bmN0aW9uIHN0cmlwU2NyaXB0cygpe3JldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsImltZyIpLCIiKX1mdW5jdGlvbiBleHRyYWN0U2NyaXB0cygpe3ZhciBtYXRjaEFsbD1uZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwiaW1nIiksbWF0Y2hPbmU9bmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsImltIik7cmV0dXJuKHRoaXMubWF0Y2gobWF0Y2hBbGwpfHxbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZyl7cmV0dXJuKHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSl8fFsiIiwiIl0pWzFdfSl9ZnVuY3Rpb24gZXZhbFNjcmlwdHMoKXtyZXR1cm4gdGhpcy5leHRyYWN0U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3JpcHQpe3JldHVybiBldmFsKHNjcmlwdCl9KX0KZnVuY3Rpb24gZXNjYXBlSFRNTCgpe3JldHVybiB0aGlzLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiB1bmVzY2FwZUhUTUwoKXtyZXR1cm4gdGhpcy5zdHJpcFRhZ3MoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mYW1wOy9nLCImIil9ZnVuY3Rpb24gdG9RdWVyeVBhcmFtcyhzZXBhcmF0b3Ipe3ZhciBtYXRjaD10aGlzLnN0cmlwKCkubWF0Y2goLyhbXj8jXSopKCMuKik\/JC8pO2lmKCFtYXRjaClyZXR1cm57fTtyZXR1cm4gbWF0Y2hbMV0uc3BsaXQoc2VwYXJhdG9yfHwiJiIpLmluamVjdCh7fSxmdW5jdGlvbihoYXNoLHBhaXIpe2lmKChwYWlyPXBhaXIuc3BsaXQoIj0iKSlbMF0pe3ZhciBrZXk9ZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2hpZnQoKSksdmFsdWU9cGFpci5sZW5ndGg+MT9wYWlyLmpvaW4oIj0iKTpwYWlyWzBdO2lmKHZhbHVlIT0KdW5kZWZpbmVkKXt2YWx1ZT12YWx1ZS5nc3ViKCIrIiwiICIpO3ZhbHVlPWRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9aWYoa2V5IGluIGhhc2gpe2lmKCFPYmplY3QuaXNBcnJheShoYXNoW2tleV0pKWhhc2hba2V5XT1baGFzaFtrZXldXTtoYXNoW2tleV0ucHVzaCh2YWx1ZSl9ZWxzZSBoYXNoW2tleV09dmFsdWV9cmV0dXJuIGhhc2h9KX1mdW5jdGlvbiB0b0FycmF5KCl7cmV0dXJuIHRoaXMuc3BsaXQoIiIpfWZ1bmN0aW9uIHN1Y2MoKXtyZXR1cm4gdGhpcy5zbGljZSgwLHRoaXMubGVuZ3RoLTEpK1N0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jaGFyQ29kZUF0KHRoaXMubGVuZ3RoLTEpKzEpfWZ1bmN0aW9uIHRpbWVzKGNvdW50KXtyZXR1cm4gY291bnQ8MT8iIjoobmV3IEFycmF5KGNvdW50KzEpKS5qb2luKHRoaXMpfWZ1bmN0aW9uIGNhbWVsaXplKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvLSsoLik\/L2csZnVuY3Rpb24obWF0Y2gsY2hyKXtyZXR1cm4gY2hyP2Noci50b1VwcGVyQ2FzZSgpOgoiIn0pfWZ1bmN0aW9uIGNhcGl0YWxpemUoKXtyZXR1cm4gdGhpcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHVuZGVyc2NvcmUoKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC86Oi9nLCIvIikucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywiJDFfJDIiKS5yZXBsYWNlKC8oW2EtelxkXSkoW0EtWl0pL2csIiQxXyQyIikucmVwbGFjZSgvLS9nLCJfIikudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBkYXNoZXJpemUoKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC9fL2csIi0iKX1mdW5jdGlvbiBpbnNwZWN0KHVzZURvdWJsZVF1b3Rlcyl7dmFyIGVzY2FwZWRTdHJpbmc9dGhpcy5yZXBsYWNlKC9bXHgwMC1ceDFmXFxdL2csZnVuY3Rpb24oY2hhcmFjdGVyKXtpZihjaGFyYWN0ZXIgaW4gU3RyaW5nLnNwZWNpYWxDaGFyKXJldHVybiBTdHJpbmcuc3BlY2lhbENoYXJbY2hhcmFjdGVyXTtyZXR1cm4iXFx1MDAiK2NoYXJhY3Rlci5jaGFyQ29kZUF0KCkudG9QYWRkZWRTdHJpbmcoMiwKMTYpfSk7aWYodXNlRG91YmxlUXVvdGVzKXJldHVybiciJytlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLyIvZywnXFwiJykrJyInO3JldHVybiInIitlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLycvZywiXFwnIikrIicifWZ1bmN0aW9uIHVuZmlsdGVySlNPTihmaWx0ZXIpe3JldHVybiB0aGlzLnJlcGxhY2UoZmlsdGVyfHxQcm90b3R5cGUuSlNPTkZpbHRlciwiJDEiKX1mdW5jdGlvbiBpc0pTT04oKXt2YXIgc3RyPXRoaXM7aWYoc3RyLmJsYW5rKCkpcmV0dXJuIGZhbHNlO3N0cj1zdHIucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCJAIik7c3RyPXN0ci5yZXBsYWNlKC8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg\/OlwuXGQqKT8oPzpbZUVdWytcLV0\/XGQrKT8vZywiXSIpO3N0cj1zdHIucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCIiKTtyZXR1cm4vXltcXSw6e31cc10qJC8udGVzdChzdHIpfWZ1bmN0aW9uIGV2YWxKU09OKHNhbml0aXplKXt2YXIganNvbj0KdGhpcy51bmZpbHRlckpTT04oKSxjeD0vW1x1MDAwMFx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nO2lmKGN4LnRlc3QoanNvbikpanNvbj1qc29uLnJlcGxhY2UoY3gsZnVuY3Rpb24oYSl7cmV0dXJuIlxcdSIrKCIwMDAwIithLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9KTt0cnl7aWYoIXNhbml0aXplfHxqc29uLmlzSlNPTigpKXJldHVybiBldmFsKCIoIitqc29uKyIpIil9Y2F0Y2goZSl7fXRocm93IG5ldyBTeW50YXhFcnJvcigiQmFkbHkgZm9ybWVkIEpTT04gc3RyaW5nOiAiK3RoaXMuaW5zcGVjdCgpKTt9ZnVuY3Rpb24gcGFyc2VKU09OKCl7dmFyIGpzb249dGhpcy51bmZpbHRlckpTT04oKTtyZXR1cm4gSlNPTi5wYXJzZShqc29uKX1mdW5jdGlvbiBpbmNsdWRlKHBhdHRlcm4pe3JldHVybiB0aGlzLmluZGV4T2YocGF0dGVybik+Ci0xfWZ1bmN0aW9uIHN0YXJ0c1dpdGgocGF0dGVybixwb3NpdGlvbil7cG9zaXRpb249T2JqZWN0LmlzTnVtYmVyKHBvc2l0aW9uKT9wb3NpdGlvbjowO3JldHVybiB0aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4scG9zaXRpb24pPT09cG9zaXRpb259ZnVuY3Rpb24gZW5kc1dpdGgocGF0dGVybixwb3NpdGlvbil7cGF0dGVybj1TdHJpbmcocGF0dGVybik7cG9zaXRpb249T2JqZWN0LmlzTnVtYmVyKHBvc2l0aW9uKT9wb3NpdGlvbjp0aGlzLmxlbmd0aDtpZihwb3NpdGlvbjwwKXBvc2l0aW9uPTA7aWYocG9zaXRpb24+dGhpcy5sZW5ndGgpcG9zaXRpb249dGhpcy5sZW5ndGg7dmFyIGQ9cG9zaXRpb24tcGF0dGVybi5sZW5ndGg7cmV0dXJuIGQ+PTAmJnRoaXMuaW5kZXhPZihwYXR0ZXJuLGQpPT09ZH1mdW5jdGlvbiBlbXB0eSgpe3JldHVybiB0aGlzPT0iIn1mdW5jdGlvbiBibGFuaygpe3JldHVybi9eXHMqJC8udGVzdCh0aGlzKX1mdW5jdGlvbiBpbnRlcnBvbGF0ZShvYmplY3QscGF0dGVybil7cmV0dXJuKG5ldyBUZW1wbGF0ZSh0aGlzLApwYXR0ZXJuKSkuZXZhbHVhdGUob2JqZWN0KX1yZXR1cm57Z3N1Yjpnc3ViLHN1YjpzdWIsc2NhbjpzY2FuLHRydW5jYXRlOnRydW5jYXRlLHN0cmlwOlN0cmluZy5wcm90b3R5cGUudHJpbXx8c3RyaXAsc3RyaXBUYWdzOnN0cmlwVGFncyxzdHJpcFNjcmlwdHM6c3RyaXBTY3JpcHRzLGV4dHJhY3RTY3JpcHRzOmV4dHJhY3RTY3JpcHRzLGV2YWxTY3JpcHRzOmV2YWxTY3JpcHRzLGVzY2FwZUhUTUw6ZXNjYXBlSFRNTCx1bmVzY2FwZUhUTUw6dW5lc2NhcGVIVE1MLHRvUXVlcnlQYXJhbXM6dG9RdWVyeVBhcmFtcyxwYXJzZVF1ZXJ5OnRvUXVlcnlQYXJhbXMsdG9BcnJheTp0b0FycmF5LHN1Y2M6c3VjYyx0aW1lczp0aW1lcyxjYW1lbGl6ZTpjYW1lbGl6ZSxjYXBpdGFsaXplOmNhcGl0YWxpemUsdW5kZXJzY29yZTp1bmRlcnNjb3JlLGRhc2hlcml6ZTpkYXNoZXJpemUsaW5zcGVjdDppbnNwZWN0LHVuZmlsdGVySlNPTjp1bmZpbHRlckpTT04saXNKU09OOmlzSlNPTixldmFsSlNPTjpOQVRJVkVfSlNPTl9QQVJTRV9TVVBQT1JUPwpwYXJzZUpTT046ZXZhbEpTT04saW5jbHVkZTppbmNsdWRlLHN0YXJ0c1dpdGg6U3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRofHxzdGFydHNXaXRoLGVuZHNXaXRoOlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGh8fGVuZHNXaXRoLGVtcHR5OmVtcHR5LGJsYW5rOmJsYW5rLGludGVycG9sYXRlOmludGVycG9sYXRlfX0oKSk7CnZhciBUZW1wbGF0ZT1DbGFzcy5jcmVhdGUoe2luaXRpYWxpemU6ZnVuY3Rpb24odGVtcGxhdGUscGF0dGVybil7dGhpcy50ZW1wbGF0ZT10ZW1wbGF0ZS50b1N0cmluZygpO3RoaXMucGF0dGVybj1wYXR0ZXJufHxUZW1wbGF0ZS5QYXR0ZXJufSxldmFsdWF0ZTpmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdCYmT2JqZWN0LmlzRnVuY3Rpb24ob2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMpKW9iamVjdD1vYmplY3QudG9UZW1wbGF0ZVJlcGxhY2VtZW50cygpO3JldHVybiB0aGlzLnRlbXBsYXRlLmdzdWIodGhpcy5wYXR0ZXJuLGZ1bmN0aW9uKG1hdGNoKXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIG1hdGNoWzFdKyIiO3ZhciBiZWZvcmU9bWF0Y2hbMV18fCIiO2lmKGJlZm9yZT09IlxcIilyZXR1cm4gbWF0Y2hbMl07dmFyIGN0eD1vYmplY3QsZXhwcj1tYXRjaFszXSxwYXR0ZXJuPS9eKFteLltdK3xcWygoPzouKj9bXlxcXSk\/KVxdKShcLnxcW3wkKS87bWF0Y2g9cGF0dGVybi5leGVjKGV4cHIpOwppZihtYXRjaD09bnVsbClyZXR1cm4gYmVmb3JlO3doaWxlKG1hdGNoIT1udWxsKXt2YXIgY29tcD1tYXRjaFsxXS5zdGFydHNXaXRoKCJbIik\/bWF0Y2hbMl0ucmVwbGFjZSgvXFxcXF0vZywiXSIpOm1hdGNoWzFdO2N0eD1jdHhbY29tcF07aWYobnVsbD09Y3R4fHwiIj09bWF0Y2hbM10pYnJlYWs7ZXhwcj1leHByLnN1YnN0cmluZygiWyI9PW1hdGNoWzNdP21hdGNoWzFdLmxlbmd0aDptYXRjaFswXS5sZW5ndGgpO21hdGNoPXBhdHRlcm4uZXhlYyhleHByKX1yZXR1cm4gYmVmb3JlK1N0cmluZy5pbnRlcnByZXQoY3R4KX0pfX0pO1RlbXBsYXRlLlBhdHRlcm49LyhefC58XHJ8XG4pKCNceyguKj8pXH0pLzt2YXIgJGJyZWFrPXt9Owp2YXIgRW51bWVyYWJsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGVhY2goaXRlcmF0b3IsY29udGV4dCl7dHJ5e3RoaXMuX2VhY2goaXRlcmF0b3IsY29udGV4dCl9Y2F0Y2goZSl7aWYoZSE9JGJyZWFrKXRocm93IGU7fXJldHVybiB0aGlzfWZ1bmN0aW9uIGVhY2hTbGljZShudW1iZXIsaXRlcmF0b3IsY29udGV4dCl7dmFyIGluZGV4PS1udW1iZXIsc2xpY2VzPVtdLGFycmF5PXRoaXMudG9BcnJheSgpO2lmKG51bWJlcjwxKXJldHVybiBhcnJheTt3aGlsZSgoaW5kZXgrPW51bWJlcik8YXJyYXkubGVuZ3RoKXNsaWNlcy5wdXNoKGFycmF5LnNsaWNlKGluZGV4LGluZGV4K251bWJlcikpO3JldHVybiBzbGljZXMuY29sbGVjdChpdGVyYXRvcixjb250ZXh0KX1mdW5jdGlvbiBhbGwoaXRlcmF0b3IsY29udGV4dCl7aXRlcmF0b3I9aXRlcmF0b3J8fFByb3RvdHlwZS5LO3ZhciByZXN1bHQ9dHJ1ZTt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpe3Jlc3VsdD1yZXN1bHQmJiEhaXRlcmF0b3IuY2FsbChjb250ZXh0LAp2YWx1ZSxpbmRleCx0aGlzKTtpZighcmVzdWx0KXRocm93ICRicmVhazt9LHRoaXMpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYW55KGl0ZXJhdG9yLGNvbnRleHQpe2l0ZXJhdG9yPWl0ZXJhdG9yfHxQcm90b3R5cGUuSzt2YXIgcmVzdWx0PWZhbHNlO3RoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7aWYocmVzdWx0PSEhaXRlcmF0b3IuY2FsbChjb250ZXh0LHZhbHVlLGluZGV4LHRoaXMpKXRocm93ICRicmVhazt9LHRoaXMpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29sbGVjdChpdGVyYXRvcixjb250ZXh0KXtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIHJlc3VsdHM9W107dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXtyZXN1bHRzLnB1c2goaXRlcmF0b3IuY2FsbChjb250ZXh0LHZhbHVlLGluZGV4LHRoaXMpKX0sdGhpcyk7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gZGV0ZWN0KGl0ZXJhdG9yLGNvbnRleHQpe3ZhciByZXN1bHQ7dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLAppbmRleCl7aWYoaXRlcmF0b3IuY2FsbChjb250ZXh0LHZhbHVlLGluZGV4LHRoaXMpKXtyZXN1bHQ9dmFsdWU7dGhyb3cgJGJyZWFrO319LHRoaXMpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZmluZEFsbChpdGVyYXRvcixjb250ZXh0KXt2YXIgcmVzdWx0cz1bXTt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpe2lmKGl0ZXJhdG9yLmNhbGwoY29udGV4dCx2YWx1ZSxpbmRleCx0aGlzKSlyZXN1bHRzLnB1c2godmFsdWUpfSx0aGlzKTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBncmVwKGZpbHRlcixpdGVyYXRvcixjb250ZXh0KXtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIHJlc3VsdHM9W107aWYoT2JqZWN0LmlzU3RyaW5nKGZpbHRlcikpZmlsdGVyPW5ldyBSZWdFeHAoUmVnRXhwLmVzY2FwZShmaWx0ZXIpKTt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpe2lmKGZpbHRlci5tYXRjaCh2YWx1ZSkpcmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwKdmFsdWUsaW5kZXgsdGhpcykpfSx0aGlzKTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBpbmNsdWRlKG9iamVjdCl7aWYoT2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSYmdGhpcy5pbmRleE9mKG9iamVjdCkhPS0xKXJldHVybiB0cnVlO3ZhciBmb3VuZD1mYWxzZTt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUpe2lmKHZhbHVlPT1vYmplY3Qpe2ZvdW5kPXRydWU7dGhyb3cgJGJyZWFrO319KTtyZXR1cm4gZm91bmR9ZnVuY3Rpb24gaW5Hcm91cHNPZihudW1iZXIsZmlsbFdpdGgpe2ZpbGxXaXRoPU9iamVjdC5pc1VuZGVmaW5lZChmaWxsV2l0aCk\/bnVsbDpmaWxsV2l0aDtyZXR1cm4gdGhpcy5lYWNoU2xpY2UobnVtYmVyLGZ1bmN0aW9uKHNsaWNlKXt3aGlsZShzbGljZS5sZW5ndGg8bnVtYmVyKXNsaWNlLnB1c2goZmlsbFdpdGgpO3JldHVybiBzbGljZX0pfWZ1bmN0aW9uIGluamVjdChtZW1vLGl0ZXJhdG9yLGNvbnRleHQpe3RoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSxpbmRleCl7bWVtbz0KaXRlcmF0b3IuY2FsbChjb250ZXh0LG1lbW8sdmFsdWUsaW5kZXgsdGhpcyl9LHRoaXMpO3JldHVybiBtZW1vfWZ1bmN0aW9uIGludm9rZShtZXRob2Qpe3ZhciBhcmdzPSRBKGFyZ3VtZW50cykuc2xpY2UoMSk7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSxhcmdzKX0pfWZ1bmN0aW9uIG1heChpdGVyYXRvcixjb250ZXh0KXtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIHJlc3VsdDt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpe3ZhbHVlPWl0ZXJhdG9yLmNhbGwoY29udGV4dCx2YWx1ZSxpbmRleCx0aGlzKTtpZihyZXN1bHQ9PW51bGx8fHZhbHVlPj1yZXN1bHQpcmVzdWx0PXZhbHVlfSx0aGlzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1pbihpdGVyYXRvcixjb250ZXh0KXtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIHJlc3VsdDt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsCmluZGV4KXt2YWx1ZT1pdGVyYXRvci5jYWxsKGNvbnRleHQsdmFsdWUsaW5kZXgsdGhpcyk7aWYocmVzdWx0PT1udWxsfHx2YWx1ZTxyZXN1bHQpcmVzdWx0PXZhbHVlfSx0aGlzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHBhcnRpdGlvbihpdGVyYXRvcixjb250ZXh0KXtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIHRydWVzPVtdLGZhbHNlcz1bXTt0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsaW5kZXgpeyhpdGVyYXRvci5jYWxsKGNvbnRleHQsdmFsdWUsaW5kZXgsdGhpcyk\/dHJ1ZXM6ZmFsc2VzKS5wdXNoKHZhbHVlKX0sdGhpcyk7cmV0dXJuW3RydWVzLGZhbHNlc119ZnVuY3Rpb24gcGx1Y2socHJvcGVydHkpe3ZhciByZXN1bHRzPVtdO3RoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0cy5wdXNoKHZhbHVlW3Byb3BlcnR5XSl9KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZWplY3QoaXRlcmF0b3IsY29udGV4dCl7dmFyIHJlc3VsdHM9W107dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLAppbmRleCl7aWYoIWl0ZXJhdG9yLmNhbGwoY29udGV4dCx2YWx1ZSxpbmRleCx0aGlzKSlyZXN1bHRzLnB1c2godmFsdWUpfSx0aGlzKTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBzb3J0QnkoaXRlcmF0b3IsY29udGV4dCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXtyZXR1cm57dmFsdWU6dmFsdWUsY3JpdGVyaWE6aXRlcmF0b3IuY2FsbChjb250ZXh0LHZhbHVlLGluZGV4LHRoaXMpfX0sdGhpcykuc29ydChmdW5jdGlvbihsZWZ0LHJpZ2h0KXt2YXIgYT1sZWZ0LmNyaXRlcmlhLGI9cmlnaHQuY3JpdGVyaWE7cmV0dXJuIGE8Yj8tMTphPmI\/MTowfSkucGx1Y2soInZhbHVlIil9ZnVuY3Rpb24gdG9BcnJheSgpe3JldHVybiB0aGlzLm1hcCgpfWZ1bmN0aW9uIHppcCgpe3ZhciBpdGVyYXRvcj1Qcm90b3R5cGUuSyxhcmdzPSRBKGFyZ3VtZW50cyk7aWYoT2JqZWN0LmlzRnVuY3Rpb24oYXJncy5sYXN0KCkpKWl0ZXJhdG9yPWFyZ3MucG9wKCk7dmFyIGNvbGxlY3Rpb25zPQpbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXtyZXR1cm4gaXRlcmF0b3IoY29sbGVjdGlvbnMucGx1Y2soaW5kZXgpKX0pfWZ1bmN0aW9uIHNpemUoKXtyZXR1cm4gdGhpcy50b0FycmF5KCkubGVuZ3RofWZ1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4iIzxFbnVtZXJhYmxlOiIrdGhpcy50b0FycmF5KCkuaW5zcGVjdCgpKyI+In1yZXR1cm57ZWFjaDplYWNoLGVhY2hTbGljZTplYWNoU2xpY2UsYWxsOmFsbCxldmVyeTphbGwsYW55OmFueSxzb21lOmFueSxjb2xsZWN0OmNvbGxlY3QsbWFwOmNvbGxlY3QsZGV0ZWN0OmRldGVjdCxmaW5kQWxsOmZpbmRBbGwsc2VsZWN0OmZpbmRBbGwsZmlsdGVyOmZpbmRBbGwsZ3JlcDpncmVwLGluY2x1ZGU6aW5jbHVkZSxtZW1iZXI6aW5jbHVkZSxpbkdyb3Vwc09mOmluR3JvdXBzT2YsaW5qZWN0OmluamVjdCxpbnZva2U6aW52b2tlLG1heDptYXgsbWluOm1pbixwYXJ0aXRpb246cGFydGl0aW9uLApwbHVjazpwbHVjayxyZWplY3Q6cmVqZWN0LHNvcnRCeTpzb3J0QnksdG9BcnJheTp0b0FycmF5LGVudHJpZXM6dG9BcnJheSx6aXA6emlwLHNpemU6c2l6ZSxpbnNwZWN0Omluc3BlY3QsZmluZDpkZXRlY3R9fSgpO2Z1bmN0aW9uICRBKGl0ZXJhYmxlKXtpZighaXRlcmFibGUpcmV0dXJuW107aWYoInRvQXJyYXkiaW4gT2JqZWN0KGl0ZXJhYmxlKSlyZXR1cm4gaXRlcmFibGUudG9BcnJheSgpO3ZhciBsZW5ndGg9aXRlcmFibGUubGVuZ3RofHwwLHJlc3VsdHM9bmV3IEFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pcmVzdWx0c1tsZW5ndGhdPWl0ZXJhYmxlW2xlbmd0aF07cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gJHcoc3RyaW5nKXtpZighT2JqZWN0LmlzU3RyaW5nKHN0cmluZykpcmV0dXJuW107c3RyaW5nPXN0cmluZy5zdHJpcCgpO3JldHVybiBzdHJpbmc\/c3RyaW5nLnNwbGl0KC9ccysvKTpbXX1BcnJheS5mcm9tPSRBOwooZnVuY3Rpb24oKXt2YXIgYXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGUsc2xpY2U9YXJyYXlQcm90by5zbGljZSxfZWFjaD1hcnJheVByb3RvLmZvckVhY2g7ZnVuY3Rpb24gZWFjaChpdGVyYXRvcixjb250ZXh0KXtmb3IodmFyIGk9MCxsZW5ndGg9dGhpcy5sZW5ndGg+Pj4wO2k8bGVuZ3RoO2krKylpZihpIGluIHRoaXMpaXRlcmF0b3IuY2FsbChjb250ZXh0LHRoaXNbaV0saSx0aGlzKX1pZighX2VhY2gpX2VhY2g9ZWFjaDtmdW5jdGlvbiBjbGVhcigpe3RoaXMubGVuZ3RoPTA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gZmlyc3QoKXtyZXR1cm4gdGhpc1swXX1mdW5jdGlvbiBsYXN0KCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV19ZnVuY3Rpb24gY29tcGFjdCgpe3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsfSl9ZnVuY3Rpb24gZmxhdHRlbigpe3JldHVybiB0aGlzLmluamVjdChbXSxmdW5jdGlvbihhcnJheSx2YWx1ZSl7aWYoT2JqZWN0LmlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheS5jb25jYXQodmFsdWUuZmxhdHRlbigpKTsKYXJyYXkucHVzaCh2YWx1ZSk7cmV0dXJuIGFycmF5fSl9ZnVuY3Rpb24gd2l0aG91dCgpe3ZhciB2YWx1ZXM9c2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4hdmFsdWVzLmluY2x1ZGUodmFsdWUpfSl9ZnVuY3Rpb24gcmV2ZXJzZShpbmxpbmUpe3JldHVybihpbmxpbmU9PT1mYWxzZT90aGlzLnRvQXJyYXkoKTp0aGlzKS5fcmV2ZXJzZSgpfWZ1bmN0aW9uIHVuaXEoc29ydGVkKXtyZXR1cm4gdGhpcy5pbmplY3QoW10sZnVuY3Rpb24oYXJyYXksdmFsdWUsaW5kZXgpe2lmKDA9PWluZGV4fHwoc29ydGVkP2FycmF5Lmxhc3QoKSE9dmFsdWU6IWFycmF5LmluY2x1ZGUodmFsdWUpKSlhcnJheS5wdXNoKHZhbHVlKTtyZXR1cm4gYXJyYXl9KX1mdW5jdGlvbiBpbnRlcnNlY3QoYXJyYXkpe3JldHVybiB0aGlzLnVuaXEoKS5maW5kQWxsKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBhcnJheS5pbmRleE9mKGl0ZW0pIT09LTF9KX0KZnVuY3Rpb24gY2xvbmUoKXtyZXR1cm4gc2xpY2UuY2FsbCh0aGlzLDApfWZ1bmN0aW9uIHNpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGh9ZnVuY3Rpb24gaW5zcGVjdCgpe3JldHVybiJbIit0aGlzLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbigiLCAiKSsiXSJ9ZnVuY3Rpb24gaW5kZXhPZihpdGVtLGkpe2lmKHRoaXM9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgYXJyYXk9T2JqZWN0KHRoaXMpLGxlbmd0aD1hcnJheS5sZW5ndGg+Pj4wO2lmKGxlbmd0aD09PTApcmV0dXJuLTE7aT1OdW1iZXIoaSk7aWYoaXNOYU4oaSkpaT0wO2Vsc2UgaWYoaSE9PTAmJmlzRmluaXRlKGkpKWk9KGk+MD8xOi0xKSpNYXRoLmZsb29yKE1hdGguYWJzKGkpKTtpZihpPmxlbmd0aClyZXR1cm4tMTt2YXIgaz1pPj0wP2k6TWF0aC5tYXgobGVuZ3RoLU1hdGguYWJzKGkpLDApO2Zvcig7azxsZW5ndGg7aysrKWlmKGsgaW4gYXJyYXkmJmFycmF5W2tdPT09aXRlbSlyZXR1cm4gaztyZXR1cm4tMX1mdW5jdGlvbiBsYXN0SW5kZXhPZihpdGVtLAppKXtpZih0aGlzPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGFycmF5PU9iamVjdCh0aGlzKSxsZW5ndGg9YXJyYXkubGVuZ3RoPj4+MDtpZihsZW5ndGg9PT0wKXJldHVybi0xO2lmKCFPYmplY3QuaXNVbmRlZmluZWQoaSkpe2k9TnVtYmVyKGkpO2lmKGlzTmFOKGkpKWk9MDtlbHNlIGlmKGkhPT0wJiZpc0Zpbml0ZShpKSlpPShpPjA\/MTotMSkqTWF0aC5mbG9vcihNYXRoLmFicyhpKSl9ZWxzZSBpPWxlbmd0aDt2YXIgaz1pPj0wP01hdGgubWluKGksbGVuZ3RoLTEpOmxlbmd0aC1NYXRoLmFicyhpKTtmb3IoO2s+PTA7ay0tKWlmKGsgaW4gYXJyYXkmJmFycmF5W2tdPT09aXRlbSlyZXR1cm4gaztyZXR1cm4tMX1mdW5jdGlvbiBjb25jYXQoXyl7dmFyIGFycmF5PVtdLGl0ZW1zPXNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGl0ZW0sbj0wO2l0ZW1zLnVuc2hpZnQodGhpcyk7Zm9yKHZhciBpPTAsbGVuZ3RoPWl0ZW1zLmxlbmd0aDtpPGxlbmd0aDtpKyspe2l0ZW09aXRlbXNbaV07CmlmKE9iamVjdC5pc0FycmF5KGl0ZW0pJiYhKCJjYWxsZWUiaW4gaXRlbSkpZm9yKHZhciBqPTAsYXJyYXlMZW5ndGg9aXRlbS5sZW5ndGg7ajxhcnJheUxlbmd0aDtqKyspe2lmKGogaW4gaXRlbSlhcnJheVtuXT1pdGVtW2pdO24rK31lbHNlIGFycmF5W24rK109aXRlbX1hcnJheS5sZW5ndGg9bjtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gd3JhcE5hdGl2ZShtZXRob2Qpe3JldHVybiBmdW5jdGlvbigpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiBtZXRob2QuY2FsbCh0aGlzLFByb3RvdHlwZS5LKTtlbHNlIGlmKGFyZ3VtZW50c1swXT09PXVuZGVmaW5lZCl7dmFyIGFyZ3M9c2xpY2UuY2FsbChhcmd1bWVudHMsMSk7YXJncy51bnNoaWZ0KFByb3RvdHlwZS5LKTtyZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsYXJncyl9ZWxzZSByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gbWFwKGl0ZXJhdG9yKXtpZih0aGlzPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3I7Cml0ZXJhdG9yPWl0ZXJhdG9yfHxQcm90b3R5cGUuSzt2YXIgb2JqZWN0PU9iamVjdCh0aGlzKTt2YXIgcmVzdWx0cz1bXSxjb250ZXh0PWFyZ3VtZW50c1sxXSxuPTA7Zm9yKHZhciBpPTAsbGVuZ3RoPW9iamVjdC5sZW5ndGg+Pj4wO2k8bGVuZ3RoO2krKyl7aWYoaSBpbiBvYmplY3QpcmVzdWx0c1tuXT1pdGVyYXRvci5jYWxsKGNvbnRleHQsb2JqZWN0W2ldLGksb2JqZWN0KTtuKyt9cmVzdWx0cy5sZW5ndGg9bjtyZXR1cm4gcmVzdWx0c31pZihhcnJheVByb3RvLm1hcCltYXA9d3JhcE5hdGl2ZShBcnJheS5wcm90b3R5cGUubWFwKTtmdW5jdGlvbiBmaWx0ZXIoaXRlcmF0b3Ipe2lmKHRoaXM9PW51bGx8fCFPYmplY3QuaXNGdW5jdGlvbihpdGVyYXRvcikpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgb2JqZWN0PU9iamVjdCh0aGlzKTt2YXIgcmVzdWx0cz1bXSxjb250ZXh0PWFyZ3VtZW50c1sxXSx2YWx1ZTtmb3IodmFyIGk9MCxsZW5ndGg9b2JqZWN0Lmxlbmd0aD4+PjA7aTxsZW5ndGg7aSsrKWlmKGkgaW4Kb2JqZWN0KXt2YWx1ZT1vYmplY3RbaV07aWYoaXRlcmF0b3IuY2FsbChjb250ZXh0LHZhbHVlLGksb2JqZWN0KSlyZXN1bHRzLnB1c2godmFsdWUpfXJldHVybiByZXN1bHRzfWlmKGFycmF5UHJvdG8uZmlsdGVyKWZpbHRlcj1BcnJheS5wcm90b3R5cGUuZmlsdGVyO2Z1bmN0aW9uIHNvbWUoaXRlcmF0b3Ipe2lmKHRoaXM9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcjtpdGVyYXRvcj1pdGVyYXRvcnx8UHJvdG90eXBlLks7dmFyIGNvbnRleHQ9YXJndW1lbnRzWzFdO3ZhciBvYmplY3Q9T2JqZWN0KHRoaXMpO2Zvcih2YXIgaT0wLGxlbmd0aD1vYmplY3QubGVuZ3RoPj4+MDtpPGxlbmd0aDtpKyspaWYoaSBpbiBvYmplY3QmJml0ZXJhdG9yLmNhbGwoY29udGV4dCxvYmplY3RbaV0saSxvYmplY3QpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1pZihhcnJheVByb3RvLnNvbWUpdmFyIHNvbWU9d3JhcE5hdGl2ZShBcnJheS5wcm90b3R5cGUuc29tZSk7ZnVuY3Rpb24gZXZlcnkoaXRlcmF0b3Ipe2lmKHRoaXM9PQpudWxsKXRocm93IG5ldyBUeXBlRXJyb3I7aXRlcmF0b3I9aXRlcmF0b3J8fFByb3RvdHlwZS5LO3ZhciBjb250ZXh0PWFyZ3VtZW50c1sxXTt2YXIgb2JqZWN0PU9iamVjdCh0aGlzKTtmb3IodmFyIGk9MCxsZW5ndGg9b2JqZWN0Lmxlbmd0aD4+PjA7aTxsZW5ndGg7aSsrKWlmKGkgaW4gb2JqZWN0JiYhaXRlcmF0b3IuY2FsbChjb250ZXh0LG9iamVjdFtpXSxpLG9iamVjdCkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWlmKGFycmF5UHJvdG8uZXZlcnkpdmFyIGV2ZXJ5PXdyYXBOYXRpdmUoQXJyYXkucHJvdG90eXBlLmV2ZXJ5KTt2YXIgX3JlZHVjZT1hcnJheVByb3RvLnJlZHVjZTtmdW5jdGlvbiBpbmplY3QobWVtbyxpdGVyYXRvcil7aXRlcmF0b3I9aXRlcmF0b3J8fFByb3RvdHlwZS5LO3ZhciBjb250ZXh0PWFyZ3VtZW50c1syXTtyZXR1cm4gX3JlZHVjZS5jYWxsKHRoaXMsaXRlcmF0b3IuYmluZChjb250ZXh0KSxtZW1vKX1pZighYXJyYXlQcm90by5yZWR1Y2UpdmFyIGluamVjdD0KRW51bWVyYWJsZS5pbmplY3Q7T2JqZWN0LmV4dGVuZChhcnJheVByb3RvLEVudW1lcmFibGUpO2lmKCFhcnJheVByb3RvLl9yZXZlcnNlKWFycmF5UHJvdG8uX3JldmVyc2U9YXJyYXlQcm90by5yZXZlcnNlO09iamVjdC5leHRlbmQoYXJyYXlQcm90byx7X2VhY2g6X2VhY2gsbWFwOm1hcCxjb2xsZWN0Om1hcCxzZWxlY3Q6ZmlsdGVyLGZpbHRlcjpmaWx0ZXIsZmluZEFsbDpmaWx0ZXIsc29tZTpzb21lLGFueTpzb21lLGV2ZXJ5OmV2ZXJ5LGFsbDpldmVyeSxpbmplY3Q6aW5qZWN0LGNsZWFyOmNsZWFyLGZpcnN0OmZpcnN0LGxhc3Q6bGFzdCxjb21wYWN0OmNvbXBhY3QsZmxhdHRlbjpmbGF0dGVuLHdpdGhvdXQ6d2l0aG91dCxyZXZlcnNlOnJldmVyc2UsdW5pcTp1bmlxLGludGVyc2VjdDppbnRlcnNlY3QsY2xvbmU6Y2xvbmUsdG9BcnJheTpjbG9uZSxzaXplOnNpemUsaW5zcGVjdDppbnNwZWN0fSk7dmFyIENPTkNBVF9BUkdVTUVOVFNfQlVHR1k9ZnVuY3Rpb24oKXtyZXR1cm5bXS5jb25jYXQoYXJndW1lbnRzKVswXVswXSE9PQoxfSgxLDIpO2lmKENPTkNBVF9BUkdVTUVOVFNfQlVHR1kpYXJyYXlQcm90by5jb25jYXQ9Y29uY2F0O2lmKCFhcnJheVByb3RvLmluZGV4T2YpYXJyYXlQcm90by5pbmRleE9mPWluZGV4T2Y7aWYoIWFycmF5UHJvdG8ubGFzdEluZGV4T2YpYXJyYXlQcm90by5sYXN0SW5kZXhPZj1sYXN0SW5kZXhPZn0pKCk7ZnVuY3Rpb24gJEgob2JqZWN0KXtyZXR1cm4gbmV3IEhhc2gob2JqZWN0KX0KdmFyIEhhc2g9Q2xhc3MuY3JlYXRlKEVudW1lcmFibGUsZnVuY3Rpb24oKXtmdW5jdGlvbiBpbml0aWFsaXplKG9iamVjdCl7dGhpcy5fb2JqZWN0PU9iamVjdC5pc0hhc2gob2JqZWN0KT9vYmplY3QudG9PYmplY3QoKTpPYmplY3QuY2xvbmUob2JqZWN0KX1mdW5jdGlvbiBfZWFjaChpdGVyYXRvcixjb250ZXh0KXt2YXIgaT0wO2Zvcih2YXIga2V5IGluIHRoaXMuX29iamVjdCl7dmFyIHZhbHVlPXRoaXMuX29iamVjdFtrZXldLHBhaXI9W2tleSx2YWx1ZV07cGFpci5rZXk9a2V5O3BhaXIudmFsdWU9dmFsdWU7aXRlcmF0b3IuY2FsbChjb250ZXh0LHBhaXIsaSk7aSsrfX1mdW5jdGlvbiBzZXQoa2V5LHZhbHVlKXtyZXR1cm4gdGhpcy5fb2JqZWN0W2tleV09dmFsdWV9ZnVuY3Rpb24gZ2V0KGtleSl7aWYodGhpcy5fb2JqZWN0W2tleV0hPT1PYmplY3QucHJvdG90eXBlW2tleV0pcmV0dXJuIHRoaXMuX29iamVjdFtrZXldfWZ1bmN0aW9uIHVuc2V0KGtleSl7dmFyIHZhbHVlPXRoaXMuX29iamVjdFtrZXldOwpkZWxldGUgdGhpcy5fb2JqZWN0W2tleV07cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIHRvT2JqZWN0KCl7cmV0dXJuIE9iamVjdC5jbG9uZSh0aGlzLl9vYmplY3QpfWZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gdGhpcy5wbHVjaygia2V5Iil9ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIHRoaXMucGx1Y2soInZhbHVlIil9ZnVuY3Rpb24gaW5kZXgodmFsdWUpe3ZhciBtYXRjaD10aGlzLmRldGVjdChmdW5jdGlvbihwYWlyKXtyZXR1cm4gcGFpci52YWx1ZT09PXZhbHVlfSk7cmV0dXJuIG1hdGNoJiZtYXRjaC5rZXl9ZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLnVwZGF0ZShvYmplY3QpfWZ1bmN0aW9uIHVwZGF0ZShvYmplY3Qpe3JldHVybihuZXcgSGFzaChvYmplY3QpKS5pbmplY3QodGhpcyxmdW5jdGlvbihyZXN1bHQscGFpcil7cmVzdWx0LnNldChwYWlyLmtleSxwYWlyLnZhbHVlKTtyZXR1cm4gcmVzdWx0fSl9ZnVuY3Rpb24gdG9RdWVyeVBhaXIoa2V5LAp2YWx1ZSl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSlyZXR1cm4ga2V5O3ZhbHVlPVN0cmluZy5pbnRlcnByZXQodmFsdWUpO3ZhbHVlPXZhbHVlLmdzdWIoLyhccik\/XG4vLCJcclxuIik7dmFsdWU9ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTt2YWx1ZT12YWx1ZS5nc3ViKC8lMjAvLCIrIik7cmV0dXJuIGtleSsiPSIrdmFsdWV9ZnVuY3Rpb24gdG9RdWVyeVN0cmluZygpe3JldHVybiB0aGlzLmluamVjdChbXSxmdW5jdGlvbihyZXN1bHRzLHBhaXIpe3ZhciBrZXk9ZW5jb2RlVVJJQ29tcG9uZW50KHBhaXIua2V5KSx2YWx1ZXM9cGFpci52YWx1ZTtpZih2YWx1ZXMmJnR5cGVvZiB2YWx1ZXM9PSJvYmplY3QiKXtpZihPYmplY3QuaXNBcnJheSh2YWx1ZXMpKXt2YXIgcXVlcnlWYWx1ZXM9W107Zm9yKHZhciBpPTAsbGVuPXZhbHVlcy5sZW5ndGgsdmFsdWU7aTxsZW47aSsrKXt2YWx1ZT12YWx1ZXNbaV07cXVlcnlWYWx1ZXMucHVzaCh0b1F1ZXJ5UGFpcihrZXksdmFsdWUpKX1yZXR1cm4gcmVzdWx0cy5jb25jYXQocXVlcnlWYWx1ZXMpfX1lbHNlIHJlc3VsdHMucHVzaCh0b1F1ZXJ5UGFpcihrZXksCnZhbHVlcykpO3JldHVybiByZXN1bHRzfSkuam9pbigiJiIpfWZ1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4iIzxIYXNoOnsiK3RoaXMubWFwKGZ1bmN0aW9uKHBhaXIpe3JldHVybiBwYWlyLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbigiOiAiKX0pLmpvaW4oIiwgIikrIn0+In1mdW5jdGlvbiBjbG9uZSgpe3JldHVybiBuZXcgSGFzaCh0aGlzKX1yZXR1cm57aW5pdGlhbGl6ZTppbml0aWFsaXplLF9lYWNoOl9lYWNoLHNldDpzZXQsZ2V0OmdldCx1bnNldDp1bnNldCx0b09iamVjdDp0b09iamVjdCx0b1RlbXBsYXRlUmVwbGFjZW1lbnRzOnRvT2JqZWN0LGtleXM6a2V5cyx2YWx1ZXM6dmFsdWVzLGluZGV4OmluZGV4LG1lcmdlOm1lcmdlLHVwZGF0ZTp1cGRhdGUsdG9RdWVyeVN0cmluZzp0b1F1ZXJ5U3RyaW5nLGluc3BlY3Q6aW5zcGVjdCx0b0pTT046dG9PYmplY3QsY2xvbmU6Y2xvbmV9fSgpKTtIYXNoLmZyb209JEg7Ck9iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSxmdW5jdGlvbigpe2Z1bmN0aW9uIHRvQ29sb3JQYXJ0KCl7cmV0dXJuIHRoaXMudG9QYWRkZWRTdHJpbmcoMiwxNil9ZnVuY3Rpb24gc3VjYygpe3JldHVybiB0aGlzKzF9ZnVuY3Rpb24gdGltZXMoaXRlcmF0b3IsY29udGV4dCl7JFIoMCx0aGlzLHRydWUpLmVhY2goaXRlcmF0b3IsY29udGV4dCk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gdG9QYWRkZWRTdHJpbmcobGVuZ3RoLHJhZGl4KXt2YXIgc3RyaW5nPXRoaXMudG9TdHJpbmcocmFkaXh8fDEwKTtyZXR1cm4iMCIudGltZXMobGVuZ3RoLXN0cmluZy5sZW5ndGgpK3N0cmluZ31mdW5jdGlvbiBhYnMoKXtyZXR1cm4gTWF0aC5hYnModGhpcyl9ZnVuY3Rpb24gcm91bmQoKXtyZXR1cm4gTWF0aC5yb3VuZCh0aGlzKX1mdW5jdGlvbiBjZWlsKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzKX1mdW5jdGlvbiBmbG9vcigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMpfXJldHVybnt0b0NvbG9yUGFydDp0b0NvbG9yUGFydCwKc3VjYzpzdWNjLHRpbWVzOnRpbWVzLHRvUGFkZGVkU3RyaW5nOnRvUGFkZGVkU3RyaW5nLGFiczphYnMscm91bmQ6cm91bmQsY2VpbDpjZWlsLGZsb29yOmZsb29yfX0oKSk7ZnVuY3Rpb24gJFIoc3RhcnQsZW5kLGV4Y2x1c2l2ZSl7cmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCxlbmQsZXhjbHVzaXZlKX0KdmFyIE9iamVjdFJhbmdlPUNsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaW5pdGlhbGl6ZShzdGFydCxlbmQsZXhjbHVzaXZlKXt0aGlzLnN0YXJ0PXN0YXJ0O3RoaXMuZW5kPWVuZDt0aGlzLmV4Y2x1c2l2ZT1leGNsdXNpdmV9ZnVuY3Rpb24gX2VhY2goaXRlcmF0b3IsY29udGV4dCl7dmFyIHZhbHVlPXRoaXMuc3RhcnQsaTtmb3IoaT0wO3RoaXMuaW5jbHVkZSh2YWx1ZSk7aSsrKXtpdGVyYXRvci5jYWxsKGNvbnRleHQsdmFsdWUsaSk7dmFsdWU9dmFsdWUuc3VjYygpfX1mdW5jdGlvbiBpbmNsdWRlKHZhbHVlKXtpZih2YWx1ZTx0aGlzLnN0YXJ0KXJldHVybiBmYWxzZTtpZih0aGlzLmV4Y2x1c2l2ZSlyZXR1cm4gdmFsdWU8dGhpcy5lbmQ7cmV0dXJuIHZhbHVlPD10aGlzLmVuZH1yZXR1cm57aW5pdGlhbGl6ZTppbml0aWFsaXplLF9lYWNoOl9lYWNoLGluY2x1ZGU6aW5jbHVkZX19KCkpO3ZhciBBYnN0cmFjdD17fTsKdmFyIFRyeT17dGhlc2U6ZnVuY3Rpb24oKXt2YXIgcmV0dXJuVmFsdWU7Zm9yKHZhciBpPTAsbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW5ndGg7aSsrKXt2YXIgbGFtYmRhPWFyZ3VtZW50c1tpXTt0cnl7cmV0dXJuVmFsdWU9bGFtYmRhKCk7YnJlYWt9Y2F0Y2goZSl7fX1yZXR1cm4gcmV0dXJuVmFsdWV9fTt2YXIgQWpheD17Z2V0VHJhbnNwb3J0OmZ1bmN0aW9uKCl7cmV0dXJuIFRyeS50aGVzZShmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpfSxmdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX0pfHxmYWxzZX0sYWN0aXZlUmVxdWVzdENvdW50OjB9OwpBamF4LlJlc3BvbmRlcnM9e3Jlc3BvbmRlcnM6W10sX2VhY2g6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7dGhpcy5yZXNwb25kZXJzLl9lYWNoKGl0ZXJhdG9yLGNvbnRleHQpfSxyZWdpc3RlcjpmdW5jdGlvbihyZXNwb25kZXIpe2lmKCF0aGlzLmluY2x1ZGUocmVzcG9uZGVyKSl0aGlzLnJlc3BvbmRlcnMucHVzaChyZXNwb25kZXIpfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKHJlc3BvbmRlcil7dGhpcy5yZXNwb25kZXJzPXRoaXMucmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcil9LGRpc3BhdGNoOmZ1bmN0aW9uKGNhbGxiYWNrLHJlcXVlc3QsdHJhbnNwb3J0LGpzb24pe3RoaXMuZWFjaChmdW5jdGlvbihyZXNwb25kZXIpe2lmKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3BvbmRlcltjYWxsYmFja10pKXRyeXtyZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlcixbcmVxdWVzdCx0cmFuc3BvcnQsanNvbl0pfWNhdGNoKGUpe319KX19OwpPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycyxFbnVtZXJhYmxlKTtBamF4LlJlc3BvbmRlcnMucmVnaXN0ZXIoe29uQ3JlYXRlOmZ1bmN0aW9uKCl7QWpheC5hY3RpdmVSZXF1ZXN0Q291bnQrK30sb25Db21wbGV0ZTpmdW5jdGlvbigpe0FqYXguYWN0aXZlUmVxdWVzdENvdW50LS19fSk7CkFqYXguQmFzZT1DbGFzcy5jcmVhdGUoe2luaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7dGhpcy5vcHRpb25zPXttZXRob2Q6InBvc3QiLGFzeW5jaHJvbm91czp0cnVlLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGVuY29kaW5nOiJVVEYtOCIscGFyYW1ldGVyczoiIixldmFsSlNPTjp0cnVlLGV2YWxKUzp0cnVlfTtPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucyxvcHRpb25zfHx7fSk7dGhpcy5vcHRpb25zLm1ldGhvZD10aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7aWYoT2JqZWN0LmlzSGFzaCh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykpdGhpcy5vcHRpb25zLnBhcmFtZXRlcnM9dGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9PYmplY3QoKX19KTsKQWpheC5SZXF1ZXN0PUNsYXNzLmNyZWF0ZShBamF4LkJhc2Use19jb21wbGV0ZTpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcix1cmwsb3B0aW9ucyl7JHN1cGVyKG9wdGlvbnMpO3RoaXMudHJhbnNwb3J0PUFqYXguZ2V0VHJhbnNwb3J0KCk7dGhpcy5yZXF1ZXN0KHVybCl9LHJlcXVlc3Q6ZnVuY3Rpb24odXJsKXt0aGlzLnVybD11cmw7dGhpcy5tZXRob2Q9dGhpcy5vcHRpb25zLm1ldGhvZDt2YXIgcGFyYW1zPU9iamVjdC5pc1N0cmluZyh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk\/dGhpcy5vcHRpb25zLnBhcmFtZXRlcnM6T2JqZWN0LnRvUXVlcnlTdHJpbmcodGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpO2lmKCFbImdldCIsInBvc3QiXS5pbmNsdWRlKHRoaXMubWV0aG9kKSl7cGFyYW1zKz0ocGFyYW1zPyImIjoiIikrIl9tZXRob2Q9Iit0aGlzLm1ldGhvZDt0aGlzLm1ldGhvZD0icG9zdCJ9aWYocGFyYW1zJiZ0aGlzLm1ldGhvZD09PSJnZXQiKXRoaXMudXJsKz0odGhpcy51cmwuaW5jbHVkZSgiPyIpPwoiJiI6Ij8iKStwYXJhbXM7dGhpcy5wYXJhbWV0ZXJzPXBhcmFtcy50b1F1ZXJ5UGFyYW1zKCk7dHJ5e3ZhciByZXNwb25zZT1uZXcgQWpheC5SZXNwb25zZSh0aGlzKTtpZih0aGlzLm9wdGlvbnMub25DcmVhdGUpdGhpcy5vcHRpb25zLm9uQ3JlYXRlKHJlc3BvbnNlKTtBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goIm9uQ3JlYXRlIix0aGlzLHJlc3BvbnNlKTt0aGlzLnRyYW5zcG9ydC5vcGVuKHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCksdGhpcy51cmwsdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyk7aWYodGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyl0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUuYmluZCh0aGlzKS5kZWZlcigxKTt0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7dGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpO3RoaXMuYm9keT10aGlzLm1ldGhvZD09InBvc3QiP3RoaXMub3B0aW9ucy5wb3N0Qm9keXx8CnBhcmFtczpudWxsO3RoaXMudHJhbnNwb3J0LnNlbmQodGhpcy5ib2R5KTtpZighdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyYmdGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSl0aGlzLm9uU3RhdGVDaGFuZ2UoKX1jYXRjaChlKXt0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpfX0sb25TdGF0ZUNoYW5nZTpmdW5jdGlvbigpe3ZhciByZWFkeVN0YXRlPXRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGU7aWYocmVhZHlTdGF0ZT4xJiYhKHJlYWR5U3RhdGU9PTQmJnRoaXMuX2NvbXBsZXRlKSl0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZSl9LHNldFJlcXVlc3RIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGhlYWRlcnM9eyJYLVJlcXVlc3RlZC1XaXRoIjoiWE1MSHR0cFJlcXVlc3QiLCJYLVByb3RvdHlwZS1WZXJzaW9uIjpQcm90b3R5cGUuVmVyc2lvbixBY2NlcHQ6InRleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyoifTsKaWYodGhpcy5tZXRob2Q9PSJwb3N0Iil7aGVhZGVyc1siQ29udGVudC10eXBlIl09dGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlKyh0aGlzLm9wdGlvbnMuZW5jb2Rpbmc\/IjsgY2hhcnNldD0iK3RoaXMub3B0aW9ucy5lbmNvZGluZzoiIik7aWYodGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSYmKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8oXGR7NH0pLyl8fFswLDIwMDVdKVsxXTwyMDA1KWhlYWRlcnNbIkNvbm5lY3Rpb24iXT0iY2xvc2UifWlmKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM9PSJvYmplY3QiKXt2YXIgZXh0cmFzPXRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycztpZihPYmplY3QuaXNGdW5jdGlvbihleHRyYXMucHVzaCkpZm9yKHZhciBpPTAsbGVuZ3RoPWV4dHJhcy5sZW5ndGg7aTxsZW5ndGg7aSs9MiloZWFkZXJzW2V4dHJhc1tpXV09ZXh0cmFzW2krMV07ZWxzZSAkSChleHRyYXMpLmVhY2goZnVuY3Rpb24ocGFpcil7aGVhZGVyc1twYWlyLmtleV09CnBhaXIudmFsdWV9KX1mb3IodmFyIG5hbWUgaW4gaGVhZGVycylpZihoZWFkZXJzW25hbWVdIT1udWxsKXRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIobmFtZSxoZWFkZXJzW25hbWVdKX0sc3VjY2VzczpmdW5jdGlvbigpe3ZhciBzdGF0dXM9dGhpcy5nZXRTdGF0dXMoKTtyZXR1cm4hc3RhdHVzfHxzdGF0dXM+PTIwMCYmc3RhdHVzPDMwMHx8c3RhdHVzPT0zMDR9LGdldFN0YXR1czpmdW5jdGlvbigpe3RyeXtpZih0aGlzLnRyYW5zcG9ydC5zdGF0dXM9PT0xMjIzKXJldHVybiAyMDQ7cmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1c3x8MH1jYXRjaChlKXtyZXR1cm4gMH19LHJlc3BvbmRUb1JlYWR5U3RhdGU6ZnVuY3Rpb24ocmVhZHlTdGF0ZSl7dmFyIHN0YXRlPUFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV0scmVzcG9uc2U9bmV3IEFqYXguUmVzcG9uc2UodGhpcyk7aWYoc3RhdGU9PSJDb21wbGV0ZSIpe3RyeXt0aGlzLl9jb21wbGV0ZT10cnVlOyh0aGlzLm9wdGlvbnNbIm9uIisKcmVzcG9uc2Uuc3RhdHVzXXx8dGhpcy5vcHRpb25zWyJvbiIrKHRoaXMuc3VjY2VzcygpPyJTdWNjZXNzIjoiRmFpbHVyZSIpXXx8UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLHJlc3BvbnNlLmhlYWRlckpTT04pfWNhdGNoKGUpe3RoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSl9dmFyIGNvbnRlbnRUeXBlPXJlc3BvbnNlLmdldEhlYWRlcigiQ29udGVudC10eXBlIik7aWYodGhpcy5vcHRpb25zLmV2YWxKUz09ImZvcmNlInx8dGhpcy5vcHRpb25zLmV2YWxKUyYmdGhpcy5pc1NhbWVPcmlnaW4oKSYmY29udGVudFR5cGUmJmNvbnRlbnRUeXBlLm1hdGNoKC9eXHMqKHRleHR8YXBwbGljYXRpb24pXC8oeC0pPyhqYXZhfGVjbWEpc2NyaXB0KDsuKik\/XHMqJC9pKSl0aGlzLmV2YWxSZXNwb25zZSgpfXRyeXsodGhpcy5vcHRpb25zWyJvbiIrc3RhdGVdfHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikocmVzcG9uc2UscmVzcG9uc2UuaGVhZGVySlNPTik7QWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCJvbiIrCnN0YXRlLHRoaXMscmVzcG9uc2UscmVzcG9uc2UuaGVhZGVySlNPTil9Y2F0Y2goZSl7dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKX1pZihzdGF0ZT09IkNvbXBsZXRlIil0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2U9UHJvdG90eXBlLmVtcHR5RnVuY3Rpb259LGlzU2FtZU9yaWdpbjpmdW5jdGlvbigpe3ZhciBtPXRoaXMudXJsLm1hdGNoKC9eXHMqaHR0cHM\/OlwvXC9bXlwvXSovKTtyZXR1cm4hbXx8bVswXT09IiN7cHJvdG9jb2x9Ly8je2RvbWFpbn0je3BvcnR9Ii5pbnRlcnBvbGF0ZSh7cHJvdG9jb2w6bG9jYXRpb24ucHJvdG9jb2wsZG9tYWluOmRvY3VtZW50LmRvbWFpbixwb3J0OmxvY2F0aW9uLnBvcnQ\/IjoiK2xvY2F0aW9uLnBvcnQ6IiJ9KX0sZ2V0SGVhZGVyOmZ1bmN0aW9uKG5hbWUpe3RyeXtyZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSl8fG51bGx9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSxldmFsUmVzcG9uc2U6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dHx8CiIiKS51bmZpbHRlckpTT04oKSl9Y2F0Y2goZSl7dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKX19LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKGV4Y2VwdGlvbil7KHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbnx8UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHRoaXMsZXhjZXB0aW9uKTtBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goIm9uRXhjZXB0aW9uIix0aGlzLGV4Y2VwdGlvbil9fSk7QWpheC5SZXF1ZXN0LkV2ZW50cz1bIlVuaW5pdGlhbGl6ZWQiLCJMb2FkaW5nIiwiTG9hZGVkIiwiSW50ZXJhY3RpdmUiLCJDb21wbGV0ZSJdOwpBamF4LlJlc3BvbnNlPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihyZXF1ZXN0KXt0aGlzLnJlcXVlc3Q9cmVxdWVzdDt2YXIgdHJhbnNwb3J0PXRoaXMudHJhbnNwb3J0PXJlcXVlc3QudHJhbnNwb3J0LHJlYWR5U3RhdGU9dGhpcy5yZWFkeVN0YXRlPXRyYW5zcG9ydC5yZWFkeVN0YXRlO2lmKHJlYWR5U3RhdGU+MiYmIVByb3RvdHlwZS5Ccm93c2VyLklFfHxyZWFkeVN0YXRlPT00KXt0aGlzLnN0YXR1cz10aGlzLmdldFN0YXR1cygpO3RoaXMuc3RhdHVzVGV4dD10aGlzLmdldFN0YXR1c1RleHQoKTt0aGlzLnJlc3BvbnNlVGV4dD1TdHJpbmcuaW50ZXJwcmV0KHRyYW5zcG9ydC5yZXNwb25zZVRleHQpO3RoaXMuaGVhZGVySlNPTj10aGlzLl9nZXRIZWFkZXJKU09OKCl9aWYocmVhZHlTdGF0ZT09NCl7dmFyIHhtbD10cmFuc3BvcnQucmVzcG9uc2VYTUw7dGhpcy5yZXNwb25zZVhNTD1PYmplY3QuaXNVbmRlZmluZWQoeG1sKT9udWxsOnhtbDt0aGlzLnJlc3BvbnNlSlNPTj0KdGhpcy5fZ2V0UmVzcG9uc2VKU09OKCl9fSxzdGF0dXM6MCxzdGF0dXNUZXh0OiIiLGdldFN0YXR1czpBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldFN0YXR1cyxnZXRTdGF0dXNUZXh0OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXNUZXh0fHwiIn1jYXRjaChlKXtyZXR1cm4iIn19LGdldEhlYWRlcjpBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlcixnZXRBbGxIZWFkZXJzOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpfWNhdGNoKGUpe3JldHVybiBudWxsfX0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24obmFtZSl7cmV0dXJuIHRoaXMudHJhbnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl9LF9nZXRIZWFkZXJKU09OOmZ1bmN0aW9uKCl7dmFyIGpzb249CnRoaXMuZ2V0SGVhZGVyKCJYLUpTT04iKTtpZighanNvbilyZXR1cm4gbnVsbDt0cnl7anNvbj1kZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGpzb24pKX1jYXRjaChlKXt9dHJ5e3JldHVybiBqc29uLmV2YWxKU09OKHRoaXMucmVxdWVzdC5vcHRpb25zLnNhbml0aXplSlNPTnx8IXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSl9Y2F0Y2goZSl7dGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpfX0sX2dldFJlc3BvbnNlSlNPTjpmdW5jdGlvbigpe3ZhciBvcHRpb25zPXRoaXMucmVxdWVzdC5vcHRpb25zO2lmKCFvcHRpb25zLmV2YWxKU09OfHxvcHRpb25zLmV2YWxKU09OIT0iZm9yY2UiJiYhKHRoaXMuZ2V0SGVhZGVyKCJDb250ZW50LXR5cGUiKXx8IiIpLmluY2x1ZGUoImFwcGxpY2F0aW9uL2pzb24iKXx8dGhpcy5yZXNwb25zZVRleHQuYmxhbmsoKSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIHRoaXMucmVzcG9uc2VUZXh0LmV2YWxKU09OKG9wdGlvbnMuc2FuaXRpemVKU09OfHwKIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSl9Y2F0Y2goZSl7dGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpfX19KTsKQWpheC5VcGRhdGVyPUNsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3Qse2luaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLGNvbnRhaW5lcix1cmwsb3B0aW9ucyl7dGhpcy5jb250YWluZXI9e3N1Y2Nlc3M6Y29udGFpbmVyLnN1Y2Nlc3N8fGNvbnRhaW5lcixmYWlsdXJlOmNvbnRhaW5lci5mYWlsdXJlfHwoY29udGFpbmVyLnN1Y2Nlc3M\/bnVsbDpjb250YWluZXIpfTtvcHRpb25zPU9iamVjdC5jbG9uZShvcHRpb25zKTt2YXIgb25Db21wbGV0ZT1vcHRpb25zLm9uQ29tcGxldGU7b3B0aW9ucy5vbkNvbXBsZXRlPWZ1bmN0aW9uKHJlc3BvbnNlLGpzb24pe3RoaXMudXBkYXRlQ29udGVudChyZXNwb25zZS5yZXNwb25zZVRleHQpO2lmKE9iamVjdC5pc0Z1bmN0aW9uKG9uQ29tcGxldGUpKW9uQ29tcGxldGUocmVzcG9uc2UsanNvbil9LmJpbmQodGhpcyk7JHN1cGVyKHVybCxvcHRpb25zKX0sdXBkYXRlQ29udGVudDpmdW5jdGlvbihyZXNwb25zZVRleHQpe3ZhciByZWNlaXZlcj10aGlzLmNvbnRhaW5lclt0aGlzLnN1Y2Nlc3MoKT8KInN1Y2Nlc3MiOiJmYWlsdXJlIl0sb3B0aW9ucz10aGlzLm9wdGlvbnM7aWYoIW9wdGlvbnMuZXZhbFNjcmlwdHMpcmVzcG9uc2VUZXh0PXJlc3BvbnNlVGV4dC5zdHJpcFNjcmlwdHMoKTtpZihyZWNlaXZlcj0kKHJlY2VpdmVyKSlpZihvcHRpb25zLmluc2VydGlvbilpZihPYmplY3QuaXNTdHJpbmcob3B0aW9ucy5pbnNlcnRpb24pKXt2YXIgaW5zZXJ0aW9uPXt9O2luc2VydGlvbltvcHRpb25zLmluc2VydGlvbl09cmVzcG9uc2VUZXh0O3JlY2VpdmVyLmluc2VydChpbnNlcnRpb24pfWVsc2Ugb3B0aW9ucy5pbnNlcnRpb24ocmVjZWl2ZXIscmVzcG9uc2VUZXh0KTtlbHNlIHJlY2VpdmVyLnVwZGF0ZShyZXNwb25zZVRleHQpfX0pOwpBamF4LlBlcmlvZGljYWxVcGRhdGVyPUNsYXNzLmNyZWF0ZShBamF4LkJhc2Use2luaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLGNvbnRhaW5lcix1cmwsb3B0aW9ucyl7JHN1cGVyKG9wdGlvbnMpO3RoaXMub25Db21wbGV0ZT10aGlzLm9wdGlvbnMub25Db21wbGV0ZTt0aGlzLmZyZXF1ZW5jeT10aGlzLm9wdGlvbnMuZnJlcXVlbmN5fHwyO3RoaXMuZGVjYXk9dGhpcy5vcHRpb25zLmRlY2F5fHwxO3RoaXMudXBkYXRlcj17fTt0aGlzLmNvbnRhaW5lcj1jb250YWluZXI7dGhpcy51cmw9dXJsO3RoaXMuc3RhcnQoKX0sc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub25Db21wbGV0ZT10aGlzLnVwZGF0ZUNvbXBsZXRlLmJpbmQodGhpcyk7dGhpcy5vblRpbWVyRXZlbnQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMudXBkYXRlci5vcHRpb25zLm9uQ29tcGxldGU9dW5kZWZpbmVkO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsodGhpcy5vbkNvbXBsZXRlfHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywKYXJndW1lbnRzKX0sdXBkYXRlQ29tcGxldGU6ZnVuY3Rpb24ocmVzcG9uc2Upe2lmKHRoaXMub3B0aW9ucy5kZWNheSl7dGhpcy5kZWNheT1yZXNwb25zZS5yZXNwb25zZVRleHQ9PXRoaXMubGFzdFRleHQ\/dGhpcy5kZWNheSp0aGlzLm9wdGlvbnMuZGVjYXk6MTt0aGlzLmxhc3RUZXh0PXJlc3BvbnNlLnJlc3BvbnNlVGV4dH10aGlzLnRpbWVyPXRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcykuZGVsYXkodGhpcy5kZWNheSp0aGlzLmZyZXF1ZW5jeSl9LG9uVGltZXJFdmVudDpmdW5jdGlvbigpe3RoaXMudXBkYXRlcj1uZXcgQWpheC5VcGRhdGVyKHRoaXMuY29udGFpbmVyLHRoaXMudXJsLHRoaXMub3B0aW9ucyl9fSk7CihmdW5jdGlvbihHTE9CQUwpe3ZhciBVTkRFRklORUQ7dmFyIFNMSUNFPUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgRElWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Z1bmN0aW9uICQoZWxlbWVudCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IodmFyIGk9MCxlbGVtZW50cz1bXSxsZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtpPGxlbmd0aDtpKyspZWxlbWVudHMucHVzaCgkKGFyZ3VtZW50c1tpXSkpO3JldHVybiBlbGVtZW50c31pZihPYmplY3QuaXNTdHJpbmcoZWxlbWVudCkpZWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTtyZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCl9R0xPQkFMLiQ9JDtpZighR0xPQkFMLk5vZGUpR0xPQkFMLk5vZGU9e307aWYoIUdMT0JBTC5Ob2RlLkVMRU1FTlRfTk9ERSlPYmplY3QuZXh0ZW5kKEdMT0JBTC5Ob2RlLHtFTEVNRU5UX05PREU6MSxBVFRSSUJVVEVfTk9ERToyLFRFWFRfTk9ERTozLENEQVRBX1NFQ1RJT05fTk9ERTo0LApFTlRJVFlfUkVGRVJFTkNFX05PREU6NSxFTlRJVFlfTk9ERTo2LFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTo3LENPTU1FTlRfTk9ERTo4LERPQ1VNRU5UX05PREU6OSxET0NVTUVOVF9UWVBFX05PREU6MTAsRE9DVU1FTlRfRlJBR01FTlRfTk9ERToxMSxOT1RBVElPTl9OT0RFOjEyfSk7dmFyIEVMRU1FTlRfQ0FDSEU9e307ZnVuY3Rpb24gc2hvdWxkVXNlQ3JlYXRpb25DYWNoZSh0YWdOYW1lLGF0dHJpYnV0ZXMpe2lmKHRhZ05hbWU9PT0ic2VsZWN0IilyZXR1cm4gZmFsc2U7aWYoInR5cGUiaW4gYXR0cmlidXRlcylyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9dmFyIEhBU19FWFRFTkRFRF9DUkVBVEVfRUxFTUVOVF9TWU5UQVg9ZnVuY3Rpb24oKXt0cnl7dmFyIGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJzxpbnB1dCBuYW1lPSJ4Ij4nKTtyZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmZWwubmFtZT09PSJ4In1jYXRjaChlcnIpe3JldHVybiBmYWxzZX19KCk7CnZhciBvbGRFbGVtZW50PUdMT0JBTC5FbGVtZW50O2Z1bmN0aW9uIEVsZW1lbnQodGFnTmFtZSxhdHRyaWJ1dGVzKXthdHRyaWJ1dGVzPWF0dHJpYnV0ZXN8fHt9O3RhZ05hbWU9dGFnTmFtZS50b0xvd2VyQ2FzZSgpO2lmKEhBU19FWFRFTkRFRF9DUkVBVEVfRUxFTUVOVF9TWU5UQVgmJmF0dHJpYnV0ZXMubmFtZSl7dGFnTmFtZT0iPCIrdGFnTmFtZSsnIG5hbWU9IicrYXR0cmlidXRlcy5uYW1lKyciPic7ZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTtyZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpLGF0dHJpYnV0ZXMpfWlmKCFFTEVNRU5UX0NBQ0hFW3RhZ05hbWVdKUVMRU1FTlRfQ0FDSEVbdGFnTmFtZV09RWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7dmFyIG5vZGU9c2hvdWxkVXNlQ3JlYXRpb25DYWNoZSh0YWdOYW1lLGF0dHJpYnV0ZXMpP0VMRU1FTlRfQ0FDSEVbdGFnTmFtZV0uY2xvbmVOb2RlKGZhbHNlKToKZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtyZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShub2RlLGF0dHJpYnV0ZXMpfUdMT0JBTC5FbGVtZW50PUVsZW1lbnQ7T2JqZWN0LmV4dGVuZChHTE9CQUwuRWxlbWVudCxvbGRFbGVtZW50fHx7fSk7aWYob2xkRWxlbWVudClHTE9CQUwuRWxlbWVudC5wcm90b3R5cGU9b2xkRWxlbWVudC5wcm90b3R5cGU7RWxlbWVudC5NZXRob2RzPXtCeVRhZzp7fSxTaW11bGF0ZWQ6e319O3ZhciBtZXRob2RzPXt9O3ZhciBJTlNQRUNUX0FUVFJJQlVURVM9e2lkOiJpZCIsY2xhc3NOYW1lOiJjbGFzcyJ9O2Z1bmN0aW9uIGluc3BlY3QoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciByZXN1bHQ9IjwiK2VsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBhdHRyaWJ1dGUsdmFsdWU7Zm9yKHZhciBwcm9wZXJ0eSBpbiBJTlNQRUNUX0FUVFJJQlVURVMpe2F0dHJpYnV0ZT1JTlNQRUNUX0FUVFJJQlVURVNbcHJvcGVydHldOwp2YWx1ZT0oZWxlbWVudFtwcm9wZXJ0eV18fCIiKS50b1N0cmluZygpO2lmKHZhbHVlKXJlc3VsdCs9IiAiK2F0dHJpYnV0ZSsiPSIrdmFsdWUuaW5zcGVjdCh0cnVlKX1yZXR1cm4gcmVzdWx0KyI+In1tZXRob2RzLmluc3BlY3Q9aW5zcGVjdDtmdW5jdGlvbiB2aXNpYmxlKGVsZW1lbnQpe3JldHVybiAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkhPT0ibm9uZSJ9ZnVuY3Rpb24gdG9nZ2xlKGVsZW1lbnQsYm9vbCl7ZWxlbWVudD0kKGVsZW1lbnQpO2lmKE9iamVjdC5pc1VuZGVmaW5lZChib29sKSlib29sPSFFbGVtZW50LnZpc2libGUoZWxlbWVudCk7RWxlbWVudFtib29sPyJzaG93IjoiaGlkZSJdKGVsZW1lbnQpO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIGhpZGUoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO2VsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gc2hvdyhlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7ZWxlbWVudC5zdHlsZS5kaXNwbGF5PQoiIjtyZXR1cm4gZWxlbWVudH1PYmplY3QuZXh0ZW5kKG1ldGhvZHMse3Zpc2libGU6dmlzaWJsZSx0b2dnbGU6dG9nZ2xlLGhpZGU6aGlkZSxzaG93OnNob3d9KTtmdW5jdGlvbiByZW1vdmUoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO2VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtyZXR1cm4gZWxlbWVudH12YXIgU0VMRUNUX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZPWZ1bmN0aW9uKCl7dmFyIGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGlzQnVnZ3k9dHJ1ZTtlbC5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9InRlc3QiPnRlc3Q8L29wdGlvbj4nO2lmKGVsLm9wdGlvbnMmJmVsLm9wdGlvbnNbMF0paXNCdWdneT1lbC5vcHRpb25zWzBdLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkhPT0iT1BUSU9OIjtlbD1udWxsO3JldHVybiBpc0J1Z2d5fSgpO3ZhciBUQUJMRV9FTEVNRU5UX0lOTkVSSFRNTF9CVUdHWT1mdW5jdGlvbigpe3RyeXt2YXIgZWw9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7aWYoZWwmJmVsLnRCb2RpZXMpe2VsLmlubmVySFRNTD0iPHRib2R5Pjx0cj48dGQ+dGVzdDwvdGQ+PC90cj48L3Rib2R5PiI7dmFyIGlzQnVnZ3k9dHlwZW9mIGVsLnRCb2RpZXNbMF09PSJ1bmRlZmluZWQiO2VsPW51bGw7cmV0dXJuIGlzQnVnZ3l9fWNhdGNoKGUpe3JldHVybiB0cnVlfX0oKTt2YXIgTElOS19FTEVNRU5UX0lOTkVSSFRNTF9CVUdHWT1mdW5jdGlvbigpe3RyeXt2YXIgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZWwuaW5uZXJIVE1MPSI8bGluayAvPiI7dmFyIGlzQnVnZ3k9ZWwuY2hpbGROb2Rlcy5sZW5ndGg9PT0wO2VsPW51bGw7cmV0dXJuIGlzQnVnZ3l9Y2F0Y2goZSl7cmV0dXJuIHRydWV9fSgpO3ZhciBBTllfSU5ORVJIVE1MX0JVR0dZPVNFTEVDVF9FTEVNRU5UX0lOTkVSSFRNTF9CVUdHWXx8VEFCTEVfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1l8fExJTktfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1k7CnZhciBTQ1JJUFRfRUxFTUVOVF9SRUpFQ1RTX1RFWFROT0RFX0FQUEVORElORz1mdW5jdGlvbigpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGlzQnVnZ3k9ZmFsc2U7dHJ5e3MuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpKTtpc0J1Z2d5PSFzLmZpcnN0Q2hpbGR8fHMuZmlyc3RDaGlsZCYmcy5maXJzdENoaWxkLm5vZGVUeXBlIT09M31jYXRjaChlKXtpc0J1Z2d5PXRydWV9cz1udWxsO3JldHVybiBpc0J1Z2d5fSgpO2Z1bmN0aW9uIHVwZGF0ZShlbGVtZW50LGNvbnRlbnQpe2VsZW1lbnQ9JChlbGVtZW50KTt2YXIgZGVzY2VuZGFudHM9ZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGk9ZGVzY2VuZGFudHMubGVuZ3RoO3doaWxlKGktLSlwdXJnZUVsZW1lbnQoZGVzY2VuZGFudHNbaV0pO2lmKGNvbnRlbnQmJmNvbnRlbnQudG9FbGVtZW50KWNvbnRlbnQ9Y29udGVudC50b0VsZW1lbnQoKTtpZihPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKXJldHVybiBlbGVtZW50LnVwZGF0ZSgpLmluc2VydChjb250ZW50KTsKY29udGVudD1PYmplY3QudG9IVE1MKGNvbnRlbnQpO3ZhciB0YWdOYW1lPWVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKHRhZ05hbWU9PT0iU0NSSVBUIiYmU0NSSVBUX0VMRU1FTlRfUkVKRUNUU19URVhUTk9ERV9BUFBFTkRJTkcpe2VsZW1lbnQudGV4dD1jb250ZW50O3JldHVybiBlbGVtZW50fWlmKEFOWV9JTk5FUkhUTUxfQlVHR1kpaWYodGFnTmFtZSBpbiBJTlNFUlRJT05fVFJBTlNMQVRJT05TLnRhZ3Mpe3doaWxlKGVsZW1lbnQuZmlyc3RDaGlsZCllbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7dmFyIG5vZGVzPWdldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpO2Zvcih2YXIgaT0wLG5vZGU7bm9kZT1ub2Rlc1tpXTtpKyspZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKX1lbHNlIGlmKExJTktfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1kmJk9iamVjdC5pc1N0cmluZyhjb250ZW50KSYmCmNvbnRlbnQuaW5kZXhPZigiPGxpbmsiKT4tMSl7d2hpbGUoZWxlbWVudC5maXJzdENoaWxkKWVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTt2YXIgbm9kZXM9Z2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsY29udGVudC5zdHJpcFNjcmlwdHMoKSx0cnVlKTtmb3IodmFyIGk9MCxub2RlO25vZGU9bm9kZXNbaV07aSsrKWVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSl9ZWxzZSBlbGVtZW50LmlubmVySFRNTD1jb250ZW50LnN0cmlwU2NyaXB0cygpO2Vsc2UgZWxlbWVudC5pbm5lckhUTUw9Y29udGVudC5zdHJpcFNjcmlwdHMoKTtjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTtyZXR1cm4gZWxlbWVudH1mdW5jdGlvbiByZXBsYWNlKGVsZW1lbnQsY29udGVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO2lmKGNvbnRlbnQmJmNvbnRlbnQudG9FbGVtZW50KWNvbnRlbnQ9Y29udGVudC50b0VsZW1lbnQoKTtlbHNlIGlmKCFPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKXtjb250ZW50PQpPYmplY3QudG9IVE1MKGNvbnRlbnQpO3ZhciByYW5nZT1lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtyYW5nZS5zZWxlY3ROb2RlKGVsZW1lbnQpO2NvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpO2NvbnRlbnQ9cmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpfWVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCxlbGVtZW50KTtyZXR1cm4gZWxlbWVudH12YXIgSU5TRVJUSU9OX1RSQU5TTEFUSU9OUz17YmVmb3JlOmZ1bmN0aW9uKGVsZW1lbnQsbm9kZSl7ZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLGVsZW1lbnQpfSx0b3A6ZnVuY3Rpb24oZWxlbWVudCxub2RlKXtlbGVtZW50Lmluc2VydEJlZm9yZShub2RlLGVsZW1lbnQuZmlyc3RDaGlsZCl9LGJvdHRvbTpmdW5jdGlvbihlbGVtZW50LG5vZGUpe2VsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSl9LGFmdGVyOmZ1bmN0aW9uKGVsZW1lbnQsCm5vZGUpe2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSxlbGVtZW50Lm5leHRTaWJsaW5nKX0sdGFnczp7VEFCTEU6WyI8dGFibGU+IiwiPC90YWJsZT4iLDFdLFRCT0RZOlsiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+IiwyXSxUUjpbIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiIsM10sVEQ6WyI8dGFibGU+PHRib2R5Pjx0cj48dGQ+IiwiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4iLDRdLFNFTEVDVDpbIjxzZWxlY3Q+IiwiPC9zZWxlY3Q+IiwxXX19O3ZhciB0YWdzPUlOU0VSVElPTl9UUkFOU0xBVElPTlMudGFncztPYmplY3QuZXh0ZW5kKHRhZ3Mse1RIRUFEOnRhZ3MuVEJPRFksVEZPT1Q6dGFncy5UQk9EWSxUSDp0YWdzLlREfSk7ZnVuY3Rpb24gcmVwbGFjZV9JRShlbGVtZW50LGNvbnRlbnQpe2VsZW1lbnQ9JChlbGVtZW50KTtpZihjb250ZW50JiZjb250ZW50LnRvRWxlbWVudCljb250ZW50PWNvbnRlbnQudG9FbGVtZW50KCk7CmlmKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpe2VsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCxlbGVtZW50KTtyZXR1cm4gZWxlbWVudH1jb250ZW50PU9iamVjdC50b0hUTUwoY29udGVudCk7dmFyIHBhcmVudD1lbGVtZW50LnBhcmVudE5vZGUsdGFnTmFtZT1wYXJlbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKHRhZ05hbWUgaW4gSU5TRVJUSU9OX1RSQU5TTEFUSU9OUy50YWdzKXt2YXIgbmV4dFNpYmxpbmc9RWxlbWVudC5uZXh0KGVsZW1lbnQpO3ZhciBmcmFnbWVudHM9Z2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsY29udGVudC5zdHJpcFNjcmlwdHMoKSk7cGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO3ZhciBpdGVyYXRvcjtpZihuZXh0U2libGluZylpdGVyYXRvcj1mdW5jdGlvbihub2RlKXtwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsbmV4dFNpYmxpbmcpfTtlbHNlIGl0ZXJhdG9yPWZ1bmN0aW9uKG5vZGUpe3BhcmVudC5hcHBlbmRDaGlsZChub2RlKX07CmZyYWdtZW50cy5lYWNoKGl0ZXJhdG9yKX1lbHNlIGVsZW1lbnQub3V0ZXJIVE1MPWNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7Y29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7cmV0dXJuIGVsZW1lbnR9aWYoIm91dGVySFRNTCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmVwbGFjZT1yZXBsYWNlX0lFO2Z1bmN0aW9uIGlzQ29udGVudChjb250ZW50KXtpZihPYmplY3QuaXNVbmRlZmluZWQoY29udGVudCl8fGNvbnRlbnQ9PT1udWxsKXJldHVybiBmYWxzZTtpZihPYmplY3QuaXNTdHJpbmcoY29udGVudCl8fE9iamVjdC5pc051bWJlcihjb250ZW50KSlyZXR1cm4gdHJ1ZTtpZihPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKXJldHVybiB0cnVlO2lmKGNvbnRlbnQudG9FbGVtZW50fHxjb250ZW50LnRvSFRNTClyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gaW5zZXJ0Q29udGVudEF0KGVsZW1lbnQsY29udGVudCxwb3NpdGlvbil7cG9zaXRpb249CnBvc2l0aW9uLnRvTG93ZXJDYXNlKCk7dmFyIG1ldGhvZD1JTlNFUlRJT05fVFJBTlNMQVRJT05TW3Bvc2l0aW9uXTtpZihjb250ZW50JiZjb250ZW50LnRvRWxlbWVudCljb250ZW50PWNvbnRlbnQudG9FbGVtZW50KCk7aWYoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSl7bWV0aG9kKGVsZW1lbnQsY29udGVudCk7cmV0dXJuIGVsZW1lbnR9Y29udGVudD1PYmplY3QudG9IVE1MKGNvbnRlbnQpO3ZhciB0YWdOYW1lPShwb3NpdGlvbj09PSJiZWZvcmUifHxwb3NpdGlvbj09PSJhZnRlciI\/ZWxlbWVudC5wYXJlbnROb2RlOmVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKTt2YXIgY2hpbGROb2Rlcz1nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSxjb250ZW50LnN0cmlwU2NyaXB0cygpKTtpZihwb3NpdGlvbj09PSJ0b3AifHxwb3NpdGlvbj09PSJhZnRlciIpY2hpbGROb2Rlcy5yZXZlcnNlKCk7Zm9yKHZhciBpPTAsbm9kZTtub2RlPWNoaWxkTm9kZXNbaV07aSsrKW1ldGhvZChlbGVtZW50LApub2RlKTtjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKX1mdW5jdGlvbiBpbnNlcnQoZWxlbWVudCxpbnNlcnRpb25zKXtlbGVtZW50PSQoZWxlbWVudCk7aWYoaXNDb250ZW50KGluc2VydGlvbnMpKWluc2VydGlvbnM9e2JvdHRvbTppbnNlcnRpb25zfTtmb3IodmFyIHBvc2l0aW9uIGluIGluc2VydGlvbnMpaW5zZXJ0Q29udGVudEF0KGVsZW1lbnQsaW5zZXJ0aW9uc1twb3NpdGlvbl0scG9zaXRpb24pO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIHdyYXAoZWxlbWVudCx3cmFwcGVyLGF0dHJpYnV0ZXMpe2VsZW1lbnQ9JChlbGVtZW50KTtpZihPYmplY3QuaXNFbGVtZW50KHdyYXBwZXIpKSQod3JhcHBlcikud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlc3x8e30pO2Vsc2UgaWYoT2JqZWN0LmlzU3RyaW5nKHdyYXBwZXIpKXdyYXBwZXI9bmV3IEVsZW1lbnQod3JhcHBlcixhdHRyaWJ1dGVzKTtlbHNlIHdyYXBwZXI9bmV3IEVsZW1lbnQoImRpdiIsd3JhcHBlcik7CmlmKGVsZW1lbnQucGFyZW50Tm9kZSllbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBwZXIsZWxlbWVudCk7d3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50KTtyZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjbGVhbldoaXRlc3BhY2UoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBub2RlPWVsZW1lbnQuZmlyc3RDaGlsZDt3aGlsZShub2RlKXt2YXIgbmV4dE5vZGU9bm9kZS5uZXh0U2libGluZztpZihub2RlLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUmJiEvXFMvLnRlc3Qobm9kZS5ub2RlVmFsdWUpKWVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7bm9kZT1uZXh0Tm9kZX1yZXR1cm4gZWxlbWVudH1mdW5jdGlvbiBlbXB0eShlbGVtZW50KXtyZXR1cm4gJChlbGVtZW50KS5pbm5lckhUTUwuYmxhbmsoKX1mdW5jdGlvbiBnZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSxodG1sLGZvcmNlKXt2YXIgdD1JTlNFUlRJT05fVFJBTlNMQVRJT05TLnRhZ3NbdGFnTmFtZV0sCmRpdj1ESVY7dmFyIHdvcmthcm91bmQ9ISF0O2lmKCF3b3JrYXJvdW5kJiZmb3JjZSl7d29ya2Fyb3VuZD10cnVlO3Q9WyIiLCIiLDBdfWlmKHdvcmthcm91bmQpe2Rpdi5pbm5lckhUTUw9IiYjMTYwOyIrdFswXStodG1sK3RbMV07ZGl2LnJlbW92ZUNoaWxkKGRpdi5maXJzdENoaWxkKTtmb3IodmFyIGk9dFsyXTtpLS07KWRpdj1kaXYuZmlyc3RDaGlsZH1lbHNlIGRpdi5pbm5lckhUTUw9aHRtbDtyZXR1cm4gJEEoZGl2LmNoaWxkTm9kZXMpfWZ1bmN0aW9uIGNsb25lKGVsZW1lbnQsZGVlcCl7aWYoIShlbGVtZW50PSQoZWxlbWVudCkpKXJldHVybjt2YXIgY2xvbmU9ZWxlbWVudC5jbG9uZU5vZGUoZGVlcCk7aWYoIUhBU19VTklRVUVfSURfUFJPUEVSVFkpe2Nsb25lLl9wcm90b3R5cGVVSUQ9VU5ERUZJTkVEO2lmKGRlZXApe3ZhciBkZXNjZW5kYW50cz1FbGVtZW50LnNlbGVjdChjbG9uZSwiKiIpLGk9ZGVzY2VuZGFudHMubGVuZ3RoO3doaWxlKGktLSlkZXNjZW5kYW50c1tpXS5fcHJvdG90eXBlVUlEPQpVTkRFRklORUR9fXJldHVybiBFbGVtZW50LmV4dGVuZChjbG9uZSl9ZnVuY3Rpb24gcHVyZ2VFbGVtZW50KGVsZW1lbnQpe3ZhciB1aWQ9Z2V0VW5pcXVlRWxlbWVudElEKGVsZW1lbnQpO2lmKHVpZCl7RWxlbWVudC5zdG9wT2JzZXJ2aW5nKGVsZW1lbnQpO2lmKCFIQVNfVU5JUVVFX0lEX1BST1BFUlRZKWVsZW1lbnQuX3Byb3RvdHlwZVVJRD1VTkRFRklORUQ7ZGVsZXRlIEVsZW1lbnQuU3RvcmFnZVt1aWRdfX1mdW5jdGlvbiBwdXJnZUNvbGxlY3Rpb24oZWxlbWVudHMpe3ZhciBpPWVsZW1lbnRzLmxlbmd0aDt3aGlsZShpLS0pcHVyZ2VFbGVtZW50KGVsZW1lbnRzW2ldKX1mdW5jdGlvbiBwdXJnZUNvbGxlY3Rpb25fSUUoZWxlbWVudHMpe3ZhciBpPWVsZW1lbnRzLmxlbmd0aCxlbGVtZW50LHVpZDt3aGlsZShpLS0pe2VsZW1lbnQ9ZWxlbWVudHNbaV07dWlkPWdldFVuaXF1ZUVsZW1lbnRJRChlbGVtZW50KTtkZWxldGUgRWxlbWVudC5TdG9yYWdlW3VpZF07ZGVsZXRlIEV2ZW50LmNhY2hlW3VpZF19fQppZihIQVNfVU5JUVVFX0lEX1BST1BFUlRZKXB1cmdlQ29sbGVjdGlvbj1wdXJnZUNvbGxlY3Rpb25fSUU7ZnVuY3Rpb24gcHVyZ2UoZWxlbWVudCl7aWYoIShlbGVtZW50PSQoZWxlbWVudCkpKXJldHVybjtwdXJnZUVsZW1lbnQoZWxlbWVudCk7dmFyIGRlc2NlbmRhbnRzPWVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxpPWRlc2NlbmRhbnRzLmxlbmd0aDt3aGlsZShpLS0pcHVyZ2VFbGVtZW50KGRlc2NlbmRhbnRzW2ldKTtyZXR1cm4gbnVsbH1PYmplY3QuZXh0ZW5kKG1ldGhvZHMse3JlbW92ZTpyZW1vdmUsdXBkYXRlOnVwZGF0ZSxyZXBsYWNlOnJlcGxhY2UsaW5zZXJ0Omluc2VydCx3cmFwOndyYXAsY2xlYW5XaGl0ZXNwYWNlOmNsZWFuV2hpdGVzcGFjZSxlbXB0eTplbXB0eSxjbG9uZTpjbG9uZSxwdXJnZTpwdXJnZX0pO2Z1bmN0aW9uIHJlY3Vyc2l2ZWx5Q29sbGVjdChlbGVtZW50LHByb3BlcnR5LG1heGltdW1MZW5ndGgpe2VsZW1lbnQ9JChlbGVtZW50KTsKbWF4aW11bUxlbmd0aD1tYXhpbXVtTGVuZ3RofHwtMTt2YXIgZWxlbWVudHM9W107d2hpbGUoZWxlbWVudD1lbGVtZW50W3Byb3BlcnR5XSl7aWYoZWxlbWVudC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKWVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpO2lmKGVsZW1lbnRzLmxlbmd0aD09PW1heGltdW1MZW5ndGgpYnJlYWt9cmV0dXJuIGVsZW1lbnRzfWZ1bmN0aW9uIGFuY2VzdG9ycyhlbGVtZW50KXtyZXR1cm4gcmVjdXJzaXZlbHlDb2xsZWN0KGVsZW1lbnQsInBhcmVudE5vZGUiKX1mdW5jdGlvbiBkZXNjZW5kYW50cyhlbGVtZW50KXtyZXR1cm4gRWxlbWVudC5zZWxlY3QoZWxlbWVudCwiKiIpfWZ1bmN0aW9uIGZpcnN0RGVzY2VuZGFudChlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCkuZmlyc3RDaGlsZDt3aGlsZShlbGVtZW50JiZlbGVtZW50Lm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpZWxlbWVudD1lbGVtZW50Lm5leHRTaWJsaW5nOwpyZXR1cm4gJChlbGVtZW50KX1mdW5jdGlvbiBpbW1lZGlhdGVEZXNjZW5kYW50cyhlbGVtZW50KXt2YXIgcmVzdWx0cz1bXSxjaGlsZD0kKGVsZW1lbnQpLmZpcnN0Q2hpbGQ7d2hpbGUoY2hpbGQpe2lmKGNoaWxkLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmVzdWx0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7Y2hpbGQ9Y2hpbGQubmV4dFNpYmxpbmd9cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gcHJldmlvdXNTaWJsaW5ncyhlbGVtZW50KXtyZXR1cm4gcmVjdXJzaXZlbHlDb2xsZWN0KGVsZW1lbnQsInByZXZpb3VzU2libGluZyIpfWZ1bmN0aW9uIG5leHRTaWJsaW5ncyhlbGVtZW50KXtyZXR1cm4gcmVjdXJzaXZlbHlDb2xsZWN0KGVsZW1lbnQsIm5leHRTaWJsaW5nIil9ZnVuY3Rpb24gc2libGluZ3MoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBwcmV2aW91cz1wcmV2aW91c1NpYmxpbmdzKGVsZW1lbnQpLG5leHQ9bmV4dFNpYmxpbmdzKGVsZW1lbnQpOwpyZXR1cm4gcHJldmlvdXMucmV2ZXJzZSgpLmNvbmNhdChuZXh0KX1mdW5jdGlvbiBtYXRjaChlbGVtZW50LHNlbGVjdG9yKXtlbGVtZW50PSQoZWxlbWVudCk7aWYoT2JqZWN0LmlzU3RyaW5nKHNlbGVjdG9yKSlyZXR1cm4gUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsc2VsZWN0b3IpO3JldHVybiBzZWxlY3Rvci5tYXRjaChlbGVtZW50KX1mdW5jdGlvbiBfcmVjdXJzaXZlbHlGaW5kKGVsZW1lbnQscHJvcGVydHksZXhwcmVzc2lvbixpbmRleCl7ZWxlbWVudD0kKGVsZW1lbnQpLGV4cHJlc3Npb249ZXhwcmVzc2lvbnx8MCxpbmRleD1pbmRleHx8MDtpZihPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikpaW5kZXg9ZXhwcmVzc2lvbixleHByZXNzaW9uPW51bGw7d2hpbGUoZWxlbWVudD1lbGVtZW50W3Byb3BlcnR5XSl7aWYoZWxlbWVudC5ub2RlVHlwZSE9PTEpY29udGludWU7aWYoZXhwcmVzc2lvbiYmIVByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaChlbGVtZW50LGV4cHJlc3Npb24pKWNvbnRpbnVlOwppZigtLWluZGV4Pj0wKWNvbnRpbnVlO3JldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KX19ZnVuY3Rpb24gdXAoZWxlbWVudCxleHByZXNzaW9uLGluZGV4KXtlbGVtZW50PSQoZWxlbWVudCk7aWYoYXJndW1lbnRzLmxlbmd0aD09PTEpcmV0dXJuICQoZWxlbWVudC5wYXJlbnROb2RlKTtyZXR1cm4gX3JlY3Vyc2l2ZWx5RmluZChlbGVtZW50LCJwYXJlbnROb2RlIixleHByZXNzaW9uLGluZGV4KX1mdW5jdGlvbiBkb3duKGVsZW1lbnQsZXhwcmVzc2lvbixpbmRleCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTEpcmV0dXJuIGZpcnN0RGVzY2VuZGFudChlbGVtZW50KTtlbGVtZW50PSQoZWxlbWVudCksZXhwcmVzc2lvbj1leHByZXNzaW9ufHwwLGluZGV4PWluZGV4fHwwO2lmKE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSlpbmRleD1leHByZXNzaW9uLGV4cHJlc3Npb249IioiO3ZhciBub2RlPVByb3RvdHlwZS5TZWxlY3Rvci5zZWxlY3QoZXhwcmVzc2lvbixlbGVtZW50KVtpbmRleF07CnJldHVybiBFbGVtZW50LmV4dGVuZChub2RlKX1mdW5jdGlvbiBwcmV2aW91cyhlbGVtZW50LGV4cHJlc3Npb24saW5kZXgpe3JldHVybiBfcmVjdXJzaXZlbHlGaW5kKGVsZW1lbnQsInByZXZpb3VzU2libGluZyIsZXhwcmVzc2lvbixpbmRleCl9ZnVuY3Rpb24gbmV4dChlbGVtZW50LGV4cHJlc3Npb24saW5kZXgpe3JldHVybiBfcmVjdXJzaXZlbHlGaW5kKGVsZW1lbnQsIm5leHRTaWJsaW5nIixleHByZXNzaW9uLGluZGV4KX1mdW5jdGlvbiBzZWxlY3QoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBleHByZXNzaW9ucz1TTElDRS5jYWxsKGFyZ3VtZW50cywxKS5qb2luKCIsICIpO3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KGV4cHJlc3Npb25zLGVsZW1lbnQpfWZ1bmN0aW9uIGFkamFjZW50KGVsZW1lbnQpe2VsZW1lbnQ9JChlbGVtZW50KTt2YXIgZXhwcmVzc2lvbnM9U0xJQ0UuY2FsbChhcmd1bWVudHMsMSkuam9pbigiLCAiKTt2YXIgc2libGluZ3M9CkVsZW1lbnQuc2libGluZ3MoZWxlbWVudCkscmVzdWx0cz1bXTtmb3IodmFyIGk9MCxzaWJsaW5nO3NpYmxpbmc9c2libGluZ3NbaV07aSsrKWlmKFByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaChzaWJsaW5nLGV4cHJlc3Npb25zKSlyZXN1bHRzLnB1c2goc2libGluZyk7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gZGVzY2VuZGFudE9mX0RPTShlbGVtZW50LGFuY2VzdG9yKXtlbGVtZW50PSQoZWxlbWVudCksYW5jZXN0b3I9JChhbmNlc3Rvcik7d2hpbGUoZWxlbWVudD1lbGVtZW50LnBhcmVudE5vZGUpaWYoZWxlbWVudD09PWFuY2VzdG9yKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1mdW5jdGlvbiBkZXNjZW5kYW50T2ZfY29udGFpbnMoZWxlbWVudCxhbmNlc3Rvcil7ZWxlbWVudD0kKGVsZW1lbnQpLGFuY2VzdG9yPSQoYW5jZXN0b3IpO2lmKCFhbmNlc3Rvci5jb250YWlucylyZXR1cm4gZGVzY2VuZGFudE9mX0RPTShlbGVtZW50LGFuY2VzdG9yKTtyZXR1cm4gYW5jZXN0b3IuY29udGFpbnMoZWxlbWVudCkmJgphbmNlc3RvciE9PWVsZW1lbnR9ZnVuY3Rpb24gZGVzY2VuZGFudE9mX2NvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQsYW5jZXN0b3Ipe2VsZW1lbnQ9JChlbGVtZW50KSxhbmNlc3Rvcj0kKGFuY2VzdG9yKTtyZXR1cm4oZWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhbmNlc3RvcikmOCk9PT04fXZhciBkZXNjZW5kYW50T2Y7aWYoRElWLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKWRlc2NlbmRhbnRPZj1kZXNjZW5kYW50T2ZfY29tcGFyZURvY3VtZW50UG9zaXRpb247ZWxzZSBpZihESVYuY29udGFpbnMpZGVzY2VuZGFudE9mPWRlc2NlbmRhbnRPZl9jb250YWlucztlbHNlIGRlc2NlbmRhbnRPZj1kZXNjZW5kYW50T2ZfRE9NO09iamVjdC5leHRlbmQobWV0aG9kcyx7cmVjdXJzaXZlbHlDb2xsZWN0OnJlY3Vyc2l2ZWx5Q29sbGVjdCxhbmNlc3RvcnM6YW5jZXN0b3JzLGRlc2NlbmRhbnRzOmRlc2NlbmRhbnRzLGZpcnN0RGVzY2VuZGFudDpmaXJzdERlc2NlbmRhbnQsCmltbWVkaWF0ZURlc2NlbmRhbnRzOmltbWVkaWF0ZURlc2NlbmRhbnRzLHByZXZpb3VzU2libGluZ3M6cHJldmlvdXNTaWJsaW5ncyxuZXh0U2libGluZ3M6bmV4dFNpYmxpbmdzLHNpYmxpbmdzOnNpYmxpbmdzLG1hdGNoOm1hdGNoLHVwOnVwLGRvd246ZG93bixwcmV2aW91czpwcmV2aW91cyxuZXh0Om5leHQsc2VsZWN0OnNlbGVjdCxhZGphY2VudDphZGphY2VudCxkZXNjZW5kYW50T2Y6ZGVzY2VuZGFudE9mLGdldEVsZW1lbnRzQnlTZWxlY3RvcjpzZWxlY3QsY2hpbGRFbGVtZW50czppbW1lZGlhdGVEZXNjZW5kYW50c30pO3ZhciBpZENvdW50ZXI9MTtmdW5jdGlvbiBpZGVudGlmeShlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIGlkPUVsZW1lbnQucmVhZEF0dHJpYnV0ZShlbGVtZW50LCJpZCIpO2lmKGlkKXJldHVybiBpZDtkbyBpZD0iYW5vbnltb3VzX2VsZW1lbnRfIitpZENvdW50ZXIrKzt3aGlsZSgkKGlkKSk7RWxlbWVudC53cml0ZUF0dHJpYnV0ZShlbGVtZW50LAoiaWQiLGlkKTtyZXR1cm4gaWR9ZnVuY3Rpb24gcmVhZEF0dHJpYnV0ZShlbGVtZW50LG5hbWUpe3JldHVybiAkKGVsZW1lbnQpLmdldEF0dHJpYnV0ZShuYW1lKX1mdW5jdGlvbiByZWFkQXR0cmlidXRlX0lFKGVsZW1lbnQsbmFtZSl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciB0YWJsZT1BVFRSSUJVVEVfVFJBTlNMQVRJT05TLnJlYWQ7aWYodGFibGUudmFsdWVzW25hbWVdKXJldHVybiB0YWJsZS52YWx1ZXNbbmFtZV0oZWxlbWVudCxuYW1lKTtpZih0YWJsZS5uYW1lc1tuYW1lXSluYW1lPXRhYmxlLm5hbWVzW25hbWVdO2lmKG5hbWUuaW5jbHVkZSgiOiIpKXtpZighZWxlbWVudC5hdHRyaWJ1dGVzfHwhZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdKXJldHVybiBudWxsO3JldHVybiBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWV9cmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpfWZ1bmN0aW9uIHJlYWRBdHRyaWJ1dGVfT3BlcmEoZWxlbWVudCxuYW1lKXtpZihuYW1lPT09CiJ0aXRsZSIpcmV0dXJuIGVsZW1lbnQudGl0bGU7cmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpfXZhciBQUk9CTEVNQVRJQ19BVFRSSUJVVEVfUkVBRElORz1mdW5jdGlvbigpe0RJVi5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLFtdKTt2YXIgdmFsdWU9RElWLmdldEF0dHJpYnV0ZSgib25jbGljayIpO3ZhciBpc0Z1bmN0aW9uPU9iamVjdC5pc0FycmF5KHZhbHVlKTtESVYucmVtb3ZlQXR0cmlidXRlKCJvbmNsaWNrIik7cmV0dXJuIGlzRnVuY3Rpb259KCk7aWYoUFJPQkxFTUFUSUNfQVRUUklCVVRFX1JFQURJTkcpcmVhZEF0dHJpYnV0ZT1yZWFkQXR0cmlidXRlX0lFO2Vsc2UgaWYoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpcmVhZEF0dHJpYnV0ZT1yZWFkQXR0cmlidXRlX09wZXJhO2Z1bmN0aW9uIHdyaXRlQXR0cmlidXRlKGVsZW1lbnQsbmFtZSx2YWx1ZSl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBhdHRyaWJ1dGVzPXt9LHRhYmxlPUFUVFJJQlVURV9UUkFOU0xBVElPTlMud3JpdGU7CmlmKHR5cGVvZiBuYW1lPT09Im9iamVjdCIpYXR0cmlidXRlcz1uYW1lO2Vsc2UgYXR0cmlidXRlc1tuYW1lXT1PYmplY3QuaXNVbmRlZmluZWQodmFsdWUpP3RydWU6dmFsdWU7Zm9yKHZhciBhdHRyIGluIGF0dHJpYnV0ZXMpe25hbWU9dGFibGUubmFtZXNbYXR0cl18fGF0dHI7dmFsdWU9YXR0cmlidXRlc1thdHRyXTtpZih0YWJsZS52YWx1ZXNbYXR0cl0pbmFtZT10YWJsZS52YWx1ZXNbYXR0cl0oZWxlbWVudCx2YWx1ZSl8fG5hbWU7aWYodmFsdWU9PT1mYWxzZXx8dmFsdWU9PT1udWxsKWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO2Vsc2UgaWYodmFsdWU9PT10cnVlKWVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsbmFtZSk7ZWxzZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLHZhbHVlKX1yZXR1cm4gZWxlbWVudH12YXIgUFJPQkxFTUFUSUNfSEFTX0FUVFJJQlVURV9XSVRIX0NIRUNLQk9YRVM9ZnVuY3Rpb24oKXtpZighSEFTX0VYVEVOREVEX0NSRUFURV9FTEVNRU5UX1NZTlRBWClyZXR1cm4gZmFsc2U7CnZhciBjaGVja2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCc8aW5wdXQgdHlwZT0iY2hlY2tib3giPicpO2NoZWNrYm94LmNoZWNrZWQ9dHJ1ZTt2YXIgbm9kZT1jaGVja2JveC5nZXRBdHRyaWJ1dGVOb2RlKCJjaGVja2VkIik7cmV0dXJuIW5vZGV8fCFub2RlLnNwZWNpZmllZH0oKTtmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWxlbWVudCxhdHRyaWJ1dGUpe2F0dHJpYnV0ZT1BVFRSSUJVVEVfVFJBTlNMQVRJT05TLmhhc1thdHRyaWJ1dGVdfHxhdHRyaWJ1dGU7dmFyIG5vZGU9JChlbGVtZW50KS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZSk7cmV0dXJuISEobm9kZSYmbm9kZS5zcGVjaWZpZWQpfWZ1bmN0aW9uIGhhc0F0dHJpYnV0ZV9JRShlbGVtZW50LGF0dHJpYnV0ZSl7aWYoYXR0cmlidXRlPT09ImNoZWNrZWQiKXJldHVybiBlbGVtZW50LmNoZWNrZWQ7cmV0dXJuIGhhc0F0dHJpYnV0ZShlbGVtZW50LGF0dHJpYnV0ZSl9R0xPQkFMLkVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQuaGFzQXR0cmlidXRlPQpQUk9CTEVNQVRJQ19IQVNfQVRUUklCVVRFX1dJVEhfQ0hFQ0tCT1hFUz9oYXNBdHRyaWJ1dGVfSUU6aGFzQXR0cmlidXRlO2Z1bmN0aW9uIGNsYXNzTmFtZXMoZWxlbWVudCl7cmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCl9dmFyIHJlZ0V4cENhY2hlPXt9O2Z1bmN0aW9uIGdldFJlZ0V4cEZvckNsYXNzTmFtZShjbGFzc05hbWUpe2lmKHJlZ0V4cENhY2hlW2NsYXNzTmFtZV0pcmV0dXJuIHJlZ0V4cENhY2hlW2NsYXNzTmFtZV07dmFyIHJlPW5ldyBSZWdFeHAoIihefFxccyspIitjbGFzc05hbWUrIihcXHMrfCQpIik7cmVnRXhwQ2FjaGVbY2xhc3NOYW1lXT1yZTtyZXR1cm4gcmV9ZnVuY3Rpb24gaGFzQ2xhc3NOYW1lKGVsZW1lbnQsY2xhc3NOYW1lKXtpZighKGVsZW1lbnQ9JChlbGVtZW50KSkpcmV0dXJuO3ZhciBlbGVtZW50Q2xhc3NOYW1lPWVsZW1lbnQuY2xhc3NOYW1lO2lmKGVsZW1lbnRDbGFzc05hbWUubGVuZ3RoPT09MClyZXR1cm4gZmFsc2U7aWYoZWxlbWVudENsYXNzTmFtZT09PQpjbGFzc05hbWUpcmV0dXJuIHRydWU7cmV0dXJuIGdldFJlZ0V4cEZvckNsYXNzTmFtZShjbGFzc05hbWUpLnRlc3QoZWxlbWVudENsYXNzTmFtZSl9ZnVuY3Rpb24gYWRkQ2xhc3NOYW1lKGVsZW1lbnQsY2xhc3NOYW1lKXtpZighKGVsZW1lbnQ9JChlbGVtZW50KSkpcmV0dXJuO2lmKCFoYXNDbGFzc05hbWUoZWxlbWVudCxjbGFzc05hbWUpKWVsZW1lbnQuY2xhc3NOYW1lKz0oZWxlbWVudC5jbGFzc05hbWU\/IiAiOiIiKStjbGFzc05hbWU7cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gcmVtb3ZlQ2xhc3NOYW1lKGVsZW1lbnQsY2xhc3NOYW1lKXtpZighKGVsZW1lbnQ9JChlbGVtZW50KSkpcmV0dXJuO2VsZW1lbnQuY2xhc3NOYW1lPWVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoZ2V0UmVnRXhwRm9yQ2xhc3NOYW1lKGNsYXNzTmFtZSksIiAiKS5zdHJpcCgpO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIHRvZ2dsZUNsYXNzTmFtZShlbGVtZW50LGNsYXNzTmFtZSxib29sKXtpZighKGVsZW1lbnQ9CiQoZWxlbWVudCkpKXJldHVybjtpZihPYmplY3QuaXNVbmRlZmluZWQoYm9vbCkpYm9vbD0haGFzQ2xhc3NOYW1lKGVsZW1lbnQsY2xhc3NOYW1lKTt2YXIgbWV0aG9kPUVsZW1lbnRbYm9vbD8iYWRkQ2xhc3NOYW1lIjoicmVtb3ZlQ2xhc3NOYW1lIl07cmV0dXJuIG1ldGhvZChlbGVtZW50LGNsYXNzTmFtZSl9dmFyIEFUVFJJQlVURV9UUkFOU0xBVElPTlM9e307dmFyIGNsYXNzUHJvcD0iY2xhc3NOYW1lIixmb3JQcm9wPSJmb3IiO0RJVi5zZXRBdHRyaWJ1dGUoY2xhc3NQcm9wLCJ4Iik7aWYoRElWLmNsYXNzTmFtZSE9PSJ4Iil7RElWLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJ4Iik7aWYoRElWLmNsYXNzTmFtZT09PSJ4IiljbGFzc1Byb3A9ImNsYXNzIn12YXIgTEFCRUw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtMQUJFTC5zZXRBdHRyaWJ1dGUoZm9yUHJvcCwieCIpO2lmKExBQkVMLmh0bWxGb3IhPT0ieCIpe0xBQkVMLnNldEF0dHJpYnV0ZSgiaHRtbEZvciIsIngiKTsKaWYoTEFCRUwuaHRtbEZvcj09PSJ4Iilmb3JQcm9wPSJodG1sRm9yIn1MQUJFTD1udWxsO2Z1bmN0aW9uIF9nZXRBdHRyKGVsZW1lbnQsYXR0cmlidXRlKXtyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKX1mdW5jdGlvbiBfZ2V0QXR0cjIoZWxlbWVudCxhdHRyaWJ1dGUpe3JldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsMil9ZnVuY3Rpb24gX2dldEF0dHJOb2RlKGVsZW1lbnQsYXR0cmlidXRlKXt2YXIgbm9kZT1lbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTtyZXR1cm4gbm9kZT9ub2RlLnZhbHVlOiIifWZ1bmN0aW9uIF9nZXRGbGFnKGVsZW1lbnQsYXR0cmlidXRlKXtyZXR1cm4gJChlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKT9hdHRyaWJ1dGU6bnVsbH1ESVYub25jbGljaz1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjt2YXIgb25jbGlja1ZhbHVlPURJVi5nZXRBdHRyaWJ1dGUoIm9uY2xpY2siKTt2YXIgX2dldEV2OwppZihTdHJpbmcob25jbGlja1ZhbHVlKS5pbmRleE9mKCJ7Iik+LTEpX2dldEV2PWZ1bmN0aW9uKGVsZW1lbnQsYXR0cmlidXRlKXt2YXIgdmFsdWU9ZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtpZighdmFsdWUpcmV0dXJuIG51bGw7dmFsdWU9dmFsdWUudG9TdHJpbmcoKTt2YWx1ZT12YWx1ZS5zcGxpdCgieyIpWzFdO3ZhbHVlPXZhbHVlLnNwbGl0KCJ9IilbMF07cmV0dXJuIHZhbHVlLnN0cmlwKCl9O2Vsc2UgaWYob25jbGlja1ZhbHVlPT09IiIpX2dldEV2PWZ1bmN0aW9uKGVsZW1lbnQsYXR0cmlidXRlKXt2YXIgdmFsdWU9ZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtpZighdmFsdWUpcmV0dXJuIG51bGw7cmV0dXJuIHZhbHVlLnN0cmlwKCl9O0FUVFJJQlVURV9UUkFOU0xBVElPTlMucmVhZD17bmFtZXM6eyJjbGFzcyI6Y2xhc3NQcm9wLGNsYXNzTmFtZTpjbGFzc1Byb3AsImZvciI6Zm9yUHJvcCxodG1sRm9yOmZvclByb3B9LHZhbHVlczp7c3R5bGU6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGVsZW1lbnQuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfSwKdGl0bGU6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGVsZW1lbnQudGl0bGV9fX07QVRUUklCVVRFX1RSQU5TTEFUSU9OUy53cml0ZT17bmFtZXM6e2NsYXNzTmFtZToiY2xhc3MiLGh0bWxGb3I6ImZvciIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmcifSx2YWx1ZXM6e2NoZWNrZWQ6ZnVuY3Rpb24oZWxlbWVudCx2YWx1ZSl7ZWxlbWVudC5jaGVja2VkPSEhdmFsdWV9LHN0eWxlOmZ1bmN0aW9uKGVsZW1lbnQsdmFsdWUpe2VsZW1lbnQuc3R5bGUuY3NzVGV4dD12YWx1ZT92YWx1ZToiIn19fTtBVFRSSUJVVEVfVFJBTlNMQVRJT05TLmhhcz17bmFtZXM6e319O09iamVjdC5leHRlbmQoQVRUUklCVVRFX1RSQU5TTEFUSU9OUy53cml0ZS5uYW1lcyxBVFRSSUJVVEVfVFJBTlNMQVRJT05TLnJlYWQubmFtZXMpO3ZhciBDQU1FTF9DQVNFRF9BVFRSSUJVVEVfTkFNRVM9JHcoImNvbFNwYW4gcm93U3BhbiB2QWxpZ24gZGF0ZVRpbWUgIisiYWNjZXNzS2V5IHRhYkluZGV4IGVuY1R5cGUgbWF4TGVuZ3RoIHJlYWRPbmx5IGxvbmdEZXNjIGZyYW1lQm9yZGVyIik7CmZvcih2YXIgaT0wLGF0dHI7YXR0cj1DQU1FTF9DQVNFRF9BVFRSSUJVVEVfTkFNRVNbaV07aSsrKXtBVFRSSUJVVEVfVFJBTlNMQVRJT05TLndyaXRlLm5hbWVzW2F0dHIudG9Mb3dlckNhc2UoKV09YXR0cjtBVFRSSUJVVEVfVFJBTlNMQVRJT05TLmhhcy5uYW1lc1thdHRyLnRvTG93ZXJDYXNlKCldPWF0dHJ9T2JqZWN0LmV4dGVuZChBVFRSSUJVVEVfVFJBTlNMQVRJT05TLnJlYWQudmFsdWVzLHtocmVmOl9nZXRBdHRyMixzcmM6X2dldEF0dHIyLHR5cGU6X2dldEF0dHIsYWN0aW9uOl9nZXRBdHRyTm9kZSxkaXNhYmxlZDpfZ2V0RmxhZyxjaGVja2VkOl9nZXRGbGFnLHJlYWRvbmx5Ol9nZXRGbGFnLG11bHRpcGxlOl9nZXRGbGFnLG9ubG9hZDpfZ2V0RXYsb251bmxvYWQ6X2dldEV2LG9uY2xpY2s6X2dldEV2LG9uZGJsY2xpY2s6X2dldEV2LG9ubW91c2Vkb3duOl9nZXRFdixvbm1vdXNldXA6X2dldEV2LG9ubW91c2VvdmVyOl9nZXRFdixvbm1vdXNlbW92ZTpfZ2V0RXYsb25tb3VzZW91dDpfZ2V0RXYsCm9uZm9jdXM6X2dldEV2LG9uYmx1cjpfZ2V0RXYsb25rZXlwcmVzczpfZ2V0RXYsb25rZXlkb3duOl9nZXRFdixvbmtleXVwOl9nZXRFdixvbnN1Ym1pdDpfZ2V0RXYsb25yZXNldDpfZ2V0RXYsb25zZWxlY3Q6X2dldEV2LG9uY2hhbmdlOl9nZXRFdn0pO09iamVjdC5leHRlbmQobWV0aG9kcyx7aWRlbnRpZnk6aWRlbnRpZnkscmVhZEF0dHJpYnV0ZTpyZWFkQXR0cmlidXRlLHdyaXRlQXR0cmlidXRlOndyaXRlQXR0cmlidXRlLGNsYXNzTmFtZXM6Y2xhc3NOYW1lcyxoYXNDbGFzc05hbWU6aGFzQ2xhc3NOYW1lLGFkZENsYXNzTmFtZTphZGRDbGFzc05hbWUscmVtb3ZlQ2xhc3NOYW1lOnJlbW92ZUNsYXNzTmFtZSx0b2dnbGVDbGFzc05hbWU6dG9nZ2xlQ2xhc3NOYW1lfSk7ZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVOYW1lKHN0eWxlKXtpZihzdHlsZT09PSJmbG9hdCJ8fHN0eWxlPT09InN0eWxlRmxvYXQiKXJldHVybiJjc3NGbG9hdCI7cmV0dXJuIHN0eWxlLmNhbWVsaXplKCl9ZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVOYW1lX0lFKHN0eWxlKXtpZihzdHlsZT09PQoiZmxvYXQifHxzdHlsZT09PSJjc3NGbG9hdCIpcmV0dXJuInN0eWxlRmxvYXQiO3JldHVybiBzdHlsZS5jYW1lbGl6ZSgpfWZ1bmN0aW9uIHNldFN0eWxlKGVsZW1lbnQsc3R5bGVzKXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIGVsZW1lbnRTdHlsZT1lbGVtZW50LnN0eWxlLG1hdGNoO2lmKE9iamVjdC5pc1N0cmluZyhzdHlsZXMpKXtlbGVtZW50U3R5bGUuY3NzVGV4dCs9IjsiK3N0eWxlcztpZihzdHlsZXMuaW5jbHVkZSgib3BhY2l0eSIpKXt2YXIgb3BhY2l0eT1zdHlsZXMubWF0Y2goL29wYWNpdHk6XHMqKFxkP1wuP1xkKikvKVsxXTtFbGVtZW50LnNldE9wYWNpdHkoZWxlbWVudCxvcGFjaXR5KX1yZXR1cm4gZWxlbWVudH1mb3IodmFyIHByb3BlcnR5IGluIHN0eWxlcylpZihwcm9wZXJ0eT09PSJvcGFjaXR5IilFbGVtZW50LnNldE9wYWNpdHkoZWxlbWVudCxzdHlsZXNbcHJvcGVydHldKTtlbHNle3ZhciB2YWx1ZT1zdHlsZXNbcHJvcGVydHldO2lmKHByb3BlcnR5PT09ImZsb2F0Inx8CnByb3BlcnR5PT09ImNzc0Zsb2F0Iilwcm9wZXJ0eT1PYmplY3QuaXNVbmRlZmluZWQoZWxlbWVudFN0eWxlLnN0eWxlRmxvYXQpPyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiO2VsZW1lbnRTdHlsZVtwcm9wZXJ0eV09dmFsdWV9cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gZ2V0U3R5bGUoZWxlbWVudCxzdHlsZSl7ZWxlbWVudD0kKGVsZW1lbnQpO3N0eWxlPW5vcm1hbGl6ZVN0eWxlTmFtZShzdHlsZSk7dmFyIHZhbHVlPWVsZW1lbnQuc3R5bGVbc3R5bGVdO2lmKCF2YWx1ZXx8dmFsdWU9PT0iYXV0byIpe3ZhciBjc3M9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LG51bGwpO3ZhbHVlPWNzcz9jc3Nbc3R5bGVdOm51bGx9aWYoc3R5bGU9PT0ib3BhY2l0eSIpcmV0dXJuIHZhbHVlP3BhcnNlRmxvYXQodmFsdWUpOjE7cmV0dXJuIHZhbHVlPT09ImF1dG8iP251bGw6dmFsdWV9ZnVuY3Rpb24gZ2V0U3R5bGVfT3BlcmEoZWxlbWVudCxzdHlsZSl7c3dpdGNoKHN0eWxlKXtjYXNlICJoZWlnaHQiOmNhc2UgIndpZHRoIjppZighRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpKXJldHVybiBudWxsOwp2YXIgZGltPXBhcnNlSW50KGdldFN0eWxlKGVsZW1lbnQsc3R5bGUpLDEwKTtpZihkaW0hPT1lbGVtZW50WyJvZmZzZXQiK3N0eWxlLmNhcGl0YWxpemUoKV0pcmV0dXJuIGRpbSsicHgiO3JldHVybiBFbGVtZW50Lm1lYXN1cmUoZWxlbWVudCxzdHlsZSk7ZGVmYXVsdDpyZXR1cm4gZ2V0U3R5bGUoZWxlbWVudCxzdHlsZSl9fWZ1bmN0aW9uIGdldFN0eWxlX0lFKGVsZW1lbnQsc3R5bGUpe2VsZW1lbnQ9JChlbGVtZW50KTtzdHlsZT1ub3JtYWxpemVTdHlsZU5hbWVfSUUoc3R5bGUpO3ZhciB2YWx1ZT1lbGVtZW50LnN0eWxlW3N0eWxlXTtpZighdmFsdWUmJmVsZW1lbnQuY3VycmVudFN0eWxlKXZhbHVlPWVsZW1lbnQuY3VycmVudFN0eWxlW3N0eWxlXTtpZihzdHlsZT09PSJvcGFjaXR5IiYmIVNUQU5EQVJEX0NTU19PUEFDSVRZX1NVUFBPUlRFRClyZXR1cm4gZ2V0T3BhY2l0eV9JRShlbGVtZW50KTtpZih2YWx1ZT09PSJhdXRvIil7aWYoKHN0eWxlPT09IndpZHRoInx8c3R5bGU9PT0KImhlaWdodCIpJiZFbGVtZW50LnZpc2libGUoZWxlbWVudCkpcmV0dXJuIEVsZW1lbnQubWVhc3VyZShlbGVtZW50LHN0eWxlKSsicHgiO3JldHVybiBudWxsfXJldHVybiB2YWx1ZX1mdW5jdGlvbiBzdHJpcEFscGhhRnJvbUZpbHRlcl9JRShmaWx0ZXIpe3JldHVybihmaWx0ZXJ8fCIiKS5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksIiIpfWZ1bmN0aW9uIGhhc0xheW91dF9JRShlbGVtZW50KXtpZighZWxlbWVudC5jdXJyZW50U3R5bGV8fCFlbGVtZW50LmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpZWxlbWVudC5zdHlsZS56b29tPTE7cmV0dXJuIGVsZW1lbnR9dmFyIFNUQU5EQVJEX0NTU19PUEFDSVRZX1NVUFBPUlRFRD1mdW5jdGlvbigpe0RJVi5zdHlsZS5jc3NUZXh0PSJvcGFjaXR5Oi41NSI7cmV0dXJuL14wLjU1Ly50ZXN0KERJVi5zdHlsZS5vcGFjaXR5KX0oKTtmdW5jdGlvbiBzZXRPcGFjaXR5KGVsZW1lbnQsdmFsdWUpe2VsZW1lbnQ9JChlbGVtZW50KTtpZih2YWx1ZT09CjF8fHZhbHVlPT09IiIpdmFsdWU9IiI7ZWxzZSBpZih2YWx1ZTwxLjBFLTUpdmFsdWU9MDtlbGVtZW50LnN0eWxlLm9wYWNpdHk9dmFsdWU7cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gc2V0T3BhY2l0eV9JRShlbGVtZW50LHZhbHVlKXtpZihTVEFOREFSRF9DU1NfT1BBQ0lUWV9TVVBQT1JURUQpcmV0dXJuIHNldE9wYWNpdHkoZWxlbWVudCx2YWx1ZSk7ZWxlbWVudD1oYXNMYXlvdXRfSUUoJChlbGVtZW50KSk7dmFyIGZpbHRlcj1FbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsImZpbHRlciIpLHN0eWxlPWVsZW1lbnQuc3R5bGU7aWYodmFsdWU9PTF8fHZhbHVlPT09IiIpe2ZpbHRlcj1zdHJpcEFscGhhRnJvbUZpbHRlcl9JRShmaWx0ZXIpO2lmKGZpbHRlcilzdHlsZS5maWx0ZXI9ZmlsdGVyO2Vsc2Ugc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKTtyZXR1cm4gZWxlbWVudH1pZih2YWx1ZTwxLjBFLTUpdmFsdWU9MDtzdHlsZS5maWx0ZXI9c3RyaXBBbHBoYUZyb21GaWx0ZXJfSUUoZmlsdGVyKSsKImFscGhhKG9wYWNpdHk9Iit2YWx1ZSoxMDArIikiO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIGdldE9wYWNpdHkoZWxlbWVudCl7cmV0dXJuIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwib3BhY2l0eSIpfWZ1bmN0aW9uIGdldE9wYWNpdHlfSUUoZWxlbWVudCl7aWYoU1RBTkRBUkRfQ1NTX09QQUNJVFlfU1VQUE9SVEVEKXJldHVybiBnZXRPcGFjaXR5KGVsZW1lbnQpO3ZhciBmaWx0ZXI9RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJmaWx0ZXIiKTtpZihmaWx0ZXIubGVuZ3RoPT09MClyZXR1cm4gMTt2YXIgbWF0Y2g9KGZpbHRlcnx8IiIpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKTtpZihtYXRjaCYmbWF0Y2hbMV0pcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0pLzEwMDtyZXR1cm4gMX1PYmplY3QuZXh0ZW5kKG1ldGhvZHMse3NldFN0eWxlOnNldFN0eWxlLGdldFN0eWxlOmdldFN0eWxlLHNldE9wYWNpdHk6c2V0T3BhY2l0eSxnZXRPcGFjaXR5OmdldE9wYWNpdHl9KTsKaWYoInN0eWxlRmxvYXQiaW4gRElWLnN0eWxlKXttZXRob2RzLmdldFN0eWxlPWdldFN0eWxlX0lFO21ldGhvZHMuc2V0T3BhY2l0eT1zZXRPcGFjaXR5X0lFO21ldGhvZHMuZ2V0T3BhY2l0eT1nZXRPcGFjaXR5X0lFfXZhciBVSUQ9MDtHTE9CQUwuRWxlbWVudC5TdG9yYWdlPXtVSUQ6MX07ZnVuY3Rpb24gZ2V0VW5pcXVlRWxlbWVudElEKGVsZW1lbnQpe2lmKGVsZW1lbnQ9PT13aW5kb3cpcmV0dXJuIDA7aWYodHlwZW9mIGVsZW1lbnQuX3Byb3RvdHlwZVVJRD09PSJ1bmRlZmluZWQiKWVsZW1lbnQuX3Byb3RvdHlwZVVJRD1FbGVtZW50LlN0b3JhZ2UuVUlEKys7cmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZVVJRH1mdW5jdGlvbiBnZXRVbmlxdWVFbGVtZW50SURfSUUoZWxlbWVudCl7aWYoZWxlbWVudD09PXdpbmRvdylyZXR1cm4gMDtpZihlbGVtZW50PT1kb2N1bWVudClyZXR1cm4gMTtyZXR1cm4gZWxlbWVudC51bmlxdWVJRH12YXIgSEFTX1VOSVFVRV9JRF9QUk9QRVJUWT0idW5pcXVlSUQiaW4KRElWO2lmKEhBU19VTklRVUVfSURfUFJPUEVSVFkpZ2V0VW5pcXVlRWxlbWVudElEPWdldFVuaXF1ZUVsZW1lbnRJRF9JRTtmdW5jdGlvbiBnZXRTdG9yYWdlKGVsZW1lbnQpe2lmKCEoZWxlbWVudD0kKGVsZW1lbnQpKSlyZXR1cm47dmFyIHVpZD1nZXRVbmlxdWVFbGVtZW50SUQoZWxlbWVudCk7aWYoIUVsZW1lbnQuU3RvcmFnZVt1aWRdKUVsZW1lbnQuU3RvcmFnZVt1aWRdPSRIKCk7cmV0dXJuIEVsZW1lbnQuU3RvcmFnZVt1aWRdfWZ1bmN0aW9uIHN0b3JlKGVsZW1lbnQsa2V5LHZhbHVlKXtpZighKGVsZW1lbnQ9JChlbGVtZW50KSkpcmV0dXJuO3ZhciBzdG9yYWdlPWdldFN0b3JhZ2UoZWxlbWVudCk7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpc3RvcmFnZS51cGRhdGUoa2V5KTtlbHNlIHN0b3JhZ2Uuc2V0KGtleSx2YWx1ZSk7cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gcmV0cmlldmUoZWxlbWVudCxrZXksZGVmYXVsdFZhbHVlKXtpZighKGVsZW1lbnQ9JChlbGVtZW50KSkpcmV0dXJuOwp2YXIgc3RvcmFnZT1nZXRTdG9yYWdlKGVsZW1lbnQpLHZhbHVlPXN0b3JhZ2UuZ2V0KGtleSk7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSl7c3RvcmFnZS5zZXQoa2V5LGRlZmF1bHRWYWx1ZSk7dmFsdWU9ZGVmYXVsdFZhbHVlfXJldHVybiB2YWx1ZX1PYmplY3QuZXh0ZW5kKG1ldGhvZHMse2dldFN0b3JhZ2U6Z2V0U3RvcmFnZSxzdG9yZTpzdG9yZSxyZXRyaWV2ZTpyZXRyaWV2ZX0pO3ZhciBNZXRob2RzPXt9LEJ5VGFnPUVsZW1lbnQuTWV0aG9kcy5CeVRhZyxGPVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXM7aWYoIUYuRWxlbWVudEV4dGVuc2lvbnMmJiJfX3Byb3RvX18iaW4gRElWKXtHTE9CQUwuSFRNTEVsZW1lbnQ9e307R0xPQkFMLkhUTUxFbGVtZW50LnByb3RvdHlwZT1ESVZbIl9fcHJvdG9fXyJdO0YuRWxlbWVudEV4dGVuc2lvbnM9dHJ1ZX1mdW5jdGlvbiBjaGVja0VsZW1lbnRQcm90b3R5cGVEZWZpY2llbmN5KHRhZ05hbWUpe2lmKHR5cGVvZiB3aW5kb3cuRWxlbWVudD09PQoidW5kZWZpbmVkIilyZXR1cm4gZmFsc2U7aWYoIUhBU19FWFRFTkRFRF9DUkVBVEVfRUxFTUVOVF9TWU5UQVgpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7aWYocHJvdG8pe3ZhciBpZD0iXyIrKE1hdGgucmFuZG9tKCkrIiIpLnNsaWNlKDIpLGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7cHJvdG9baWRdPSJ4Ijt2YXIgaXNCdWdneT1lbFtpZF0hPT0ieCI7ZGVsZXRlIHByb3RvW2lkXTtlbD1udWxsO3JldHVybiBpc0J1Z2d5fXJldHVybiBmYWxzZX12YXIgSFRNTE9CSkVDVEVMRU1FTlRfUFJPVE9UWVBFX0JVR0dZPWNoZWNrRWxlbWVudFByb3RvdHlwZURlZmljaWVuY3koIm9iamVjdCIpO2Z1bmN0aW9uIGV4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsbWV0aG9kcyl7Zm9yKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKXt2YXIgdmFsdWU9bWV0aG9kc1twcm9wZXJ0eV07aWYoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpJiYhKHByb3BlcnR5IGluCmVsZW1lbnQpKWVsZW1lbnRbcHJvcGVydHldPXZhbHVlLm1ldGhvZGl6ZSgpfX12YXIgRVhURU5ERUQ9e307ZnVuY3Rpb24gZWxlbWVudElzRXh0ZW5kZWQoZWxlbWVudCl7dmFyIHVpZD1nZXRVbmlxdWVFbGVtZW50SUQoZWxlbWVudCk7cmV0dXJuIHVpZCBpbiBFWFRFTkRFRH1mdW5jdGlvbiBleHRlbmQoZWxlbWVudCl7aWYoIWVsZW1lbnR8fGVsZW1lbnRJc0V4dGVuZGVkKGVsZW1lbnQpKXJldHVybiBlbGVtZW50O2lmKGVsZW1lbnQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8ZWxlbWVudD09d2luZG93KXJldHVybiBlbGVtZW50O3ZhciBtZXRob2RzPU9iamVjdC5jbG9uZShNZXRob2RzKSx0YWdOYW1lPWVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKEJ5VGFnW3RhZ05hbWVdKU9iamVjdC5leHRlbmQobWV0aG9kcyxCeVRhZ1t0YWdOYW1lXSk7ZXh0ZW5kRWxlbWVudFdpdGgoZWxlbWVudCxtZXRob2RzKTtFWFRFTkRFRFtnZXRVbmlxdWVFbGVtZW50SUQoZWxlbWVudCldPQp0cnVlO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIGV4dGVuZF9JRTgoZWxlbWVudCl7aWYoIWVsZW1lbnR8fGVsZW1lbnRJc0V4dGVuZGVkKGVsZW1lbnQpKXJldHVybiBlbGVtZW50O3ZhciB0PWVsZW1lbnQudGFnTmFtZTtpZih0JiYvXig\/Om9iamVjdHxhcHBsZXR8ZW1iZWQpJC9pLnRlc3QodCkpe2V4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsRWxlbWVudC5NZXRob2RzKTtleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQpO2V4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsRWxlbWVudC5NZXRob2RzLkJ5VGFnW3QudG9VcHBlckNhc2UoKV0pfXJldHVybiBlbGVtZW50fWlmKEYuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucylleHRlbmQ9SFRNTE9CSkVDVEVMRU1FTlRfUFJPVE9UWVBFX0JVR0dZP2V4dGVuZF9JRTg6UHJvdG90eXBlLks7ZnVuY3Rpb24gYWRkTWV0aG9kc1RvVGFnTmFtZSh0YWdOYW1lLG1ldGhvZHMpe3RhZ05hbWU9dGFnTmFtZS50b1VwcGVyQ2FzZSgpOwppZighQnlUYWdbdGFnTmFtZV0pQnlUYWdbdGFnTmFtZV09e307T2JqZWN0LmV4dGVuZChCeVRhZ1t0YWdOYW1lXSxtZXRob2RzKX1mdW5jdGlvbiBtZXJnZU1ldGhvZHMoZGVzdGluYXRpb24sbWV0aG9kcyxvbmx5SWZBYnNlbnQpe2lmKE9iamVjdC5pc1VuZGVmaW5lZChvbmx5SWZBYnNlbnQpKW9ubHlJZkFic2VudD1mYWxzZTtmb3IodmFyIHByb3BlcnR5IGluIG1ldGhvZHMpe3ZhciB2YWx1ZT1tZXRob2RzW3Byb3BlcnR5XTtpZighT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpKWNvbnRpbnVlO2lmKCFvbmx5SWZBYnNlbnR8fCEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKWRlc3RpbmF0aW9uW3Byb3BlcnR5XT12YWx1ZS5tZXRob2RpemUoKX19ZnVuY3Rpb24gZmluZERPTUNsYXNzKHRhZ05hbWUpe3ZhciBrbGFzczt2YXIgdHJhbnM9e09QVEdST1VQOiJPcHRHcm91cCIsVEVYVEFSRUE6IlRleHRBcmVhIixQOiJQYXJhZ3JhcGgiLEZJRUxEU0VUOiJGaWVsZFNldCIsVUw6IlVMaXN0IiwKT0w6Ik9MaXN0IixETDoiRExpc3QiLERJUjoiRGlyZWN0b3J5IixIMToiSGVhZGluZyIsSDI6IkhlYWRpbmciLEgzOiJIZWFkaW5nIixINDoiSGVhZGluZyIsSDU6IkhlYWRpbmciLEg2OiJIZWFkaW5nIixROiJRdW90ZSIsSU5TOiJNb2QiLERFTDoiTW9kIixBOiJBbmNob3IiLElNRzoiSW1hZ2UiLENBUFRJT046IlRhYmxlQ2FwdGlvbiIsQ09MOiJUYWJsZUNvbCIsQ09MR1JPVVA6IlRhYmxlQ29sIixUSEVBRDoiVGFibGVTZWN0aW9uIixURk9PVDoiVGFibGVTZWN0aW9uIixUQk9EWToiVGFibGVTZWN0aW9uIixUUjoiVGFibGVSb3ciLFRIOiJUYWJsZUNlbGwiLFREOiJUYWJsZUNlbGwiLEZSQU1FU0VUOiJGcmFtZVNldCIsSUZSQU1FOiJJRnJhbWUifTtpZih0cmFuc1t0YWdOYW1lXSlrbGFzcz0iSFRNTCIrdHJhbnNbdGFnTmFtZV0rIkVsZW1lbnQiO2lmKHdpbmRvd1trbGFzc10pcmV0dXJuIHdpbmRvd1trbGFzc107a2xhc3M9IkhUTUwiK3RhZ05hbWUrIkVsZW1lbnQiO2lmKHdpbmRvd1trbGFzc10pcmV0dXJuIHdpbmRvd1trbGFzc107CmtsYXNzPSJIVE1MIit0YWdOYW1lLmNhcGl0YWxpemUoKSsiRWxlbWVudCI7aWYod2luZG93W2tsYXNzXSlyZXR1cm4gd2luZG93W2tsYXNzXTt2YXIgZWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpLHByb3RvPWVsZW1lbnRbIl9fcHJvdG9fXyJdfHxlbGVtZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZTtlbGVtZW50PW51bGw7cmV0dXJuIHByb3RvfWZ1bmN0aW9uIGFkZE1ldGhvZHMobWV0aG9kcyl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApYWRkRm9ybU1ldGhvZHMoKTtpZihhcmd1bWVudHMubGVuZ3RoPT09Mil7dmFyIHRhZ05hbWU9bWV0aG9kczttZXRob2RzPWFyZ3VtZW50c1sxXX1pZighdGFnTmFtZSlPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcyxtZXRob2RzfHx7fSk7ZWxzZSBpZihPYmplY3QuaXNBcnJheSh0YWdOYW1lKSlmb3IodmFyIGk9MCx0YWc7dGFnPXRhZ05hbWVbaV07aSsrKWFkZE1ldGhvZHNUb1RhZ05hbWUodGFnLG1ldGhvZHMpOwplbHNlIGFkZE1ldGhvZHNUb1RhZ05hbWUodGFnTmFtZSxtZXRob2RzKTt2YXIgRUxFTUVOVF9QUk9UT1RZUEU9d2luZG93LkhUTUxFbGVtZW50P0hUTUxFbGVtZW50LnByb3RvdHlwZTpFbGVtZW50LnByb3RvdHlwZTtpZihGLkVsZW1lbnRFeHRlbnNpb25zKXttZXJnZU1ldGhvZHMoRUxFTUVOVF9QUk9UT1RZUEUsRWxlbWVudC5NZXRob2RzKTttZXJnZU1ldGhvZHMoRUxFTUVOVF9QUk9UT1RZUEUsRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCx0cnVlKX1pZihGLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMpZm9yKHZhciB0YWcgaW4gRWxlbWVudC5NZXRob2RzLkJ5VGFnKXt2YXIga2xhc3M9ZmluZERPTUNsYXNzKHRhZyk7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKGtsYXNzKSljb250aW51ZTttZXJnZU1ldGhvZHMoa2xhc3MucHJvdG90eXBlLEJ5VGFnW3RhZ10pfU9iamVjdC5leHRlbmQoRWxlbWVudCxFbGVtZW50Lk1ldGhvZHMpO09iamVjdC5leHRlbmQoRWxlbWVudCxFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTsKZGVsZXRlIEVsZW1lbnQuQnlUYWc7ZGVsZXRlIEVsZW1lbnQuU2ltdWxhdGVkO0VsZW1lbnQuZXh0ZW5kLnJlZnJlc2goKTtFTEVNRU5UX0NBQ0hFPXt9fU9iamVjdC5leHRlbmQoR0xPQkFMLkVsZW1lbnQse2V4dGVuZDpleHRlbmQsYWRkTWV0aG9kczphZGRNZXRob2RzfSk7aWYoZXh0ZW5kPT09UHJvdG90eXBlLkspR0xPQkFMLkVsZW1lbnQuZXh0ZW5kLnJlZnJlc2g9UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247ZWxzZSBHTE9CQUwuRWxlbWVudC5leHRlbmQucmVmcmVzaD1mdW5jdGlvbigpe2lmKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMpcmV0dXJuO09iamVjdC5leHRlbmQoTWV0aG9kcyxFbGVtZW50Lk1ldGhvZHMpO09iamVjdC5leHRlbmQoTWV0aG9kcyxFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTtFWFRFTkRFRD17fX07ZnVuY3Rpb24gYWRkRm9ybU1ldGhvZHMoKXtPYmplY3QuZXh0ZW5kKEZvcm0sRm9ybS5NZXRob2RzKTtPYmplY3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwKRm9ybS5FbGVtZW50Lk1ldGhvZHMpO09iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnLHtGT1JNOk9iamVjdC5jbG9uZShGb3JtLk1ldGhvZHMpLElOUFVUOk9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksU0VMRUNUOk9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksVEVYVEFSRUE6T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSxCVVRUT046T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKX0pfUVsZW1lbnQuYWRkTWV0aG9kcyhtZXRob2RzKTtmdW5jdGlvbiBkZXN0cm95Q2FjaGVfSUUoKXtESVY9bnVsbDtFTEVNRU5UX0NBQ0hFPW51bGx9aWYod2luZG93LmF0dGFjaEV2ZW50KXdpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLGRlc3Ryb3lDYWNoZV9JRSl9KSh0aGlzKTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdG9EZWNpbWFsKHBjdFN0cmluZyl7dmFyIG1hdGNoPXBjdFN0cmluZy5tYXRjaCgvXihcZCspJT8kL2kpO2lmKCFtYXRjaClyZXR1cm4gbnVsbDtyZXR1cm4gTnVtYmVyKG1hdGNoWzFdKS8xMDB9ZnVuY3Rpb24gZ2V0UmF3U3R5bGUoZWxlbWVudCxzdHlsZSl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciB2YWx1ZT1lbGVtZW50LnN0eWxlW3N0eWxlXTtpZighdmFsdWV8fHZhbHVlPT09ImF1dG8iKXt2YXIgY3NzPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCxudWxsKTt2YWx1ZT1jc3M\/Y3NzW3N0eWxlXTpudWxsfWlmKHN0eWxlPT09Im9wYWNpdHkiKXJldHVybiB2YWx1ZT9wYXJzZUZsb2F0KHZhbHVlKToxO3JldHVybiB2YWx1ZT09PSJhdXRvIj9udWxsOnZhbHVlfWZ1bmN0aW9uIGdldFJhd1N0eWxlX0lFKGVsZW1lbnQsc3R5bGUpe3ZhciB2YWx1ZT1lbGVtZW50LnN0eWxlW3N0eWxlXTtpZighdmFsdWUmJmVsZW1lbnQuY3VycmVudFN0eWxlKXZhbHVlPQplbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIGdldENvbnRlbnRXaWR0aChlbGVtZW50LGNvbnRleHQpe3ZhciBib3hXaWR0aD1lbGVtZW50Lm9mZnNldFdpZHRoO3ZhciBibD1nZXRQaXhlbFZhbHVlKGVsZW1lbnQsImJvcmRlckxlZnRXaWR0aCIsY29udGV4dCl8fDA7dmFyIGJyPWdldFBpeGVsVmFsdWUoZWxlbWVudCwiYm9yZGVyUmlnaHRXaWR0aCIsY29udGV4dCl8fDA7dmFyIHBsPWdldFBpeGVsVmFsdWUoZWxlbWVudCwicGFkZGluZ0xlZnQiLGNvbnRleHQpfHwwO3ZhciBwcj1nZXRQaXhlbFZhbHVlKGVsZW1lbnQsInBhZGRpbmdSaWdodCIsY29udGV4dCl8fDA7cmV0dXJuIGJveFdpZHRoLWJsLWJyLXBsLXByfWlmKCJjdXJyZW50U3R5bGUiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KWdldFJhd1N0eWxlPWdldFJhd1N0eWxlX0lFO2Z1bmN0aW9uIGdldFBpeGVsVmFsdWUodmFsdWUscHJvcGVydHksY29udGV4dCl7dmFyIGVsZW1lbnQ9Cm51bGw7aWYoT2JqZWN0LmlzRWxlbWVudCh2YWx1ZSkpe2VsZW1lbnQ9dmFsdWU7dmFsdWU9Z2V0UmF3U3R5bGUoZWxlbWVudCxwcm9wZXJ0eSl9aWYodmFsdWU9PT1udWxsfHxPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKXJldHVybiBudWxsO2lmKC9eKD86LSk\/XGQrKFwuXGQrKT8ocHgpPyQvaS50ZXN0KHZhbHVlKSlyZXR1cm4gd2luZG93LnBhcnNlRmxvYXQodmFsdWUpO3ZhciBpc1BlcmNlbnRhZ2U9dmFsdWUuaW5jbHVkZSgiJSIpLGlzVmlld3BvcnQ9Y29udGV4dD09PWRvY3VtZW50LnZpZXdwb3J0O2lmKC9cZC8udGVzdCh2YWx1ZSkmJmVsZW1lbnQmJmVsZW1lbnQucnVudGltZVN0eWxlJiYhKGlzUGVyY2VudGFnZSYmaXNWaWV3cG9ydCkpe3ZhciBzdHlsZT1lbGVtZW50LnN0eWxlLmxlZnQsclN0eWxlPWVsZW1lbnQucnVudGltZVN0eWxlLmxlZnQ7ZWxlbWVudC5ydW50aW1lU3R5bGUubGVmdD1lbGVtZW50LmN1cnJlbnRTdHlsZS5sZWZ0O2VsZW1lbnQuc3R5bGUubGVmdD0KdmFsdWV8fDA7dmFsdWU9ZWxlbWVudC5zdHlsZS5waXhlbExlZnQ7ZWxlbWVudC5zdHlsZS5sZWZ0PXN0eWxlO2VsZW1lbnQucnVudGltZVN0eWxlLmxlZnQ9clN0eWxlO3JldHVybiB2YWx1ZX1pZihlbGVtZW50JiZpc1BlcmNlbnRhZ2Upe2NvbnRleHQ9Y29udGV4dHx8ZWxlbWVudC5wYXJlbnROb2RlO3ZhciBkZWNpbWFsPXRvRGVjaW1hbCh2YWx1ZSksd2hvbGU9bnVsbDt2YXIgaXNIb3Jpem9udGFsPXByb3BlcnR5LmluY2x1ZGUoImxlZnQiKXx8cHJvcGVydHkuaW5jbHVkZSgicmlnaHQiKXx8cHJvcGVydHkuaW5jbHVkZSgid2lkdGgiKTt2YXIgaXNWZXJ0aWNhbD1wcm9wZXJ0eS5pbmNsdWRlKCJ0b3AiKXx8cHJvcGVydHkuaW5jbHVkZSgiYm90dG9tIil8fHByb3BlcnR5LmluY2x1ZGUoImhlaWdodCIpO2lmKGNvbnRleHQ9PT1kb2N1bWVudC52aWV3cG9ydClpZihpc0hvcml6b250YWwpd2hvbGU9ZG9jdW1lbnQudmlld3BvcnQuZ2V0V2lkdGgoKTtlbHNle2lmKGlzVmVydGljYWwpd2hvbGU9CmRvY3VtZW50LnZpZXdwb3J0LmdldEhlaWdodCgpfWVsc2UgaWYoaXNIb3Jpem9udGFsKXdob2xlPSQoY29udGV4dCkubWVhc3VyZSgid2lkdGgiKTtlbHNlIGlmKGlzVmVydGljYWwpd2hvbGU9JChjb250ZXh0KS5tZWFzdXJlKCJoZWlnaHQiKTtyZXR1cm4gd2hvbGU9PT1udWxsPzA6d2hvbGUqZGVjaW1hbH1yZXR1cm4gMH1mdW5jdGlvbiB0b0NTU1BpeGVscyhudW1iZXIpe2lmKE9iamVjdC5pc1N0cmluZyhudW1iZXIpJiZudW1iZXIuZW5kc1dpdGgoInB4IikpcmV0dXJuIG51bWJlcjtyZXR1cm4gbnVtYmVyKyJweCJ9ZnVuY3Rpb24gaXNEaXNwbGF5ZWQoZWxlbWVudCl7d2hpbGUoZWxlbWVudCYmZWxlbWVudC5wYXJlbnROb2RlKXt2YXIgZGlzcGxheT1lbGVtZW50LmdldFN0eWxlKCJkaXNwbGF5Iik7aWYoZGlzcGxheT09PSJub25lIilyZXR1cm4gZmFsc2U7ZWxlbWVudD0kKGVsZW1lbnQucGFyZW50Tm9kZSl9cmV0dXJuIHRydWV9dmFyIGhhc0xheW91dD1Qcm90b3R5cGUuSzsKaWYoImN1cnJlbnRTdHlsZSJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpaGFzTGF5b3V0PWZ1bmN0aW9uKGVsZW1lbnQpe2lmKCFlbGVtZW50LmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpZWxlbWVudC5zdHlsZS56b29tPTE7cmV0dXJuIGVsZW1lbnR9O2Z1bmN0aW9uIGNzc05hbWVGb3Ioa2V5KXtpZihrZXkuaW5jbHVkZSgiYm9yZGVyIikpa2V5PWtleSsiLXdpZHRoIjtyZXR1cm4ga2V5LmNhbWVsaXplKCl9RWxlbWVudC5MYXlvdXQ9Q2xhc3MuY3JlYXRlKEhhc2gse2luaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLGVsZW1lbnQscHJlQ29tcHV0ZSl7JHN1cGVyKCk7dGhpcy5lbGVtZW50PSQoZWxlbWVudCk7RWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5lYWNoKGZ1bmN0aW9uKHByb3BlcnR5KXt0aGlzLl9zZXQocHJvcGVydHksbnVsbCl9LHRoaXMpO2lmKHByZUNvbXB1dGUpe3RoaXMuX3ByZUNvbXB1dGluZz10cnVlO3RoaXMuX2JlZ2luKCk7RWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5lYWNoKHRoaXMuX2NvbXB1dGUsCnRoaXMpO3RoaXMuX2VuZCgpO3RoaXMuX3ByZUNvbXB1dGluZz1mYWxzZX19LF9zZXQ6ZnVuY3Rpb24ocHJvcGVydHksdmFsdWUpe3JldHVybiBIYXNoLnByb3RvdHlwZS5zZXQuY2FsbCh0aGlzLHByb3BlcnR5LHZhbHVlKX0sc2V0OmZ1bmN0aW9uKHByb3BlcnR5LHZhbHVlKXt0aHJvdyJQcm9wZXJ0aWVzIG9mIEVsZW1lbnQuTGF5b3V0IGFyZSByZWFkLW9ubHkuIjt9LGdldDpmdW5jdGlvbigkc3VwZXIscHJvcGVydHkpe3ZhciB2YWx1ZT0kc3VwZXIocHJvcGVydHkpO3JldHVybiB2YWx1ZT09PW51bGw\/dGhpcy5fY29tcHV0ZShwcm9wZXJ0eSk6dmFsdWV9LF9iZWdpbjpmdW5jdGlvbigpe2lmKHRoaXMuX2lzUHJlcGFyZWQoKSlyZXR1cm47dmFyIGVsZW1lbnQ9dGhpcy5lbGVtZW50O2lmKGlzRGlzcGxheWVkKGVsZW1lbnQpKXt0aGlzLl9zZXRQcmVwYXJlZCh0cnVlKTtyZXR1cm59dmFyIG9yaWdpbmFsU3R5bGVzPXtwb3NpdGlvbjplbGVtZW50LnN0eWxlLnBvc2l0aW9ufHwiIiwKd2lkdGg6ZWxlbWVudC5zdHlsZS53aWR0aHx8IiIsdmlzaWJpbGl0eTplbGVtZW50LnN0eWxlLnZpc2liaWxpdHl8fCIiLGRpc3BsYXk6ZWxlbWVudC5zdHlsZS5kaXNwbGF5fHwiIn07ZWxlbWVudC5zdG9yZSgicHJvdG90eXBlX29yaWdpbmFsX3N0eWxlcyIsb3JpZ2luYWxTdHlsZXMpO3ZhciBwb3NpdGlvbj1nZXRSYXdTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpLHdpZHRoPWVsZW1lbnQub2Zmc2V0V2lkdGg7aWYod2lkdGg9PT0wfHx3aWR0aD09PW51bGwpe2VsZW1lbnQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3dpZHRoPWVsZW1lbnQub2Zmc2V0V2lkdGh9dmFyIGNvbnRleHQ9cG9zaXRpb249PT0iZml4ZWQiP2RvY3VtZW50LnZpZXdwb3J0OmVsZW1lbnQucGFyZW50Tm9kZTt2YXIgdGVtcFN0eWxlcz17dmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9O2lmKHBvc2l0aW9uIT09ImZpeGVkIil0ZW1wU3R5bGVzLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZWxlbWVudC5zZXRTdHlsZSh0ZW1wU3R5bGVzKTsKdmFyIHBvc2l0aW9uZWRXaWR0aD1lbGVtZW50Lm9mZnNldFdpZHRoLG5ld1dpZHRoO2lmKHdpZHRoJiZwb3NpdGlvbmVkV2lkdGg9PT13aWR0aCluZXdXaWR0aD1nZXRDb250ZW50V2lkdGgoZWxlbWVudCxjb250ZXh0KTtlbHNlIGlmKHBvc2l0aW9uPT09ImFic29sdXRlInx8cG9zaXRpb249PT0iZml4ZWQiKW5ld1dpZHRoPWdldENvbnRlbnRXaWR0aChlbGVtZW50LGNvbnRleHQpO2Vsc2V7dmFyIHBhcmVudD1lbGVtZW50LnBhcmVudE5vZGUscExheW91dD0kKHBhcmVudCkuZ2V0TGF5b3V0KCk7bmV3V2lkdGg9cExheW91dC5nZXQoIndpZHRoIiktdGhpcy5nZXQoIm1hcmdpbi1sZWZ0IiktdGhpcy5nZXQoImJvcmRlci1sZWZ0IiktdGhpcy5nZXQoInBhZGRpbmctbGVmdCIpLXRoaXMuZ2V0KCJwYWRkaW5nLXJpZ2h0IiktdGhpcy5nZXQoImJvcmRlci1yaWdodCIpLXRoaXMuZ2V0KCJtYXJnaW4tcmlnaHQiKX1lbGVtZW50LnNldFN0eWxlKHt3aWR0aDpuZXdXaWR0aCsicHgifSk7CnRoaXMuX3NldFByZXBhcmVkKHRydWUpfSxfZW5kOmZ1bmN0aW9uKCl7dmFyIGVsZW1lbnQ9dGhpcy5lbGVtZW50O3ZhciBvcmlnaW5hbFN0eWxlcz1lbGVtZW50LnJldHJpZXZlKCJwcm90b3R5cGVfb3JpZ2luYWxfc3R5bGVzIik7ZWxlbWVudC5zdG9yZSgicHJvdG90eXBlX29yaWdpbmFsX3N0eWxlcyIsbnVsbCk7ZWxlbWVudC5zZXRTdHlsZShvcmlnaW5hbFN0eWxlcyk7dGhpcy5fc2V0UHJlcGFyZWQoZmFsc2UpfSxfY29tcHV0ZTpmdW5jdGlvbihwcm9wZXJ0eSl7dmFyIENPTVBVVEFUSU9OUz1FbGVtZW50LkxheW91dC5DT01QVVRBVElPTlM7aWYoIShwcm9wZXJ0eSBpbiBDT01QVVRBVElPTlMpKXRocm93IlByb3BlcnR5IG5vdCBmb3VuZC4iO3JldHVybiB0aGlzLl9zZXQocHJvcGVydHksQ09NUFVUQVRJT05TW3Byb3BlcnR5XS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50KSl9LF9pc1ByZXBhcmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5yZXRyaWV2ZSgicHJvdG90eXBlX2VsZW1lbnRfbGF5b3V0X3ByZXBhcmVkIiwKZmFsc2UpfSxfc2V0UHJlcGFyZWQ6ZnVuY3Rpb24oYm9vbCl7cmV0dXJuIHRoaXMuZWxlbWVudC5zdG9yZSgicHJvdG90eXBlX2VsZW1lbnRfbGF5b3V0X3ByZXBhcmVkIixib29sKX0sdG9PYmplY3Q6ZnVuY3Rpb24oKXt2YXIgYXJncz0kQShhcmd1bWVudHMpO3ZhciBrZXlzPWFyZ3MubGVuZ3RoPT09MD9FbGVtZW50LkxheW91dC5QUk9QRVJUSUVTOmFyZ3Muam9pbigiICIpLnNwbGl0KCIgIik7dmFyIG9iaj17fTtrZXlzLmVhY2goZnVuY3Rpb24oa2V5KXtpZighRWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5pbmNsdWRlKGtleSkpcmV0dXJuO3ZhciB2YWx1ZT10aGlzLmdldChrZXkpO2lmKHZhbHVlIT1udWxsKW9ialtrZXldPXZhbHVlfSx0aGlzKTtyZXR1cm4gb2JqfSx0b0hhc2g6ZnVuY3Rpb24oKXt2YXIgb2JqPXRoaXMudG9PYmplY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuZXcgSGFzaChvYmopfSx0b0NTUzpmdW5jdGlvbigpe3ZhciBhcmdzPSRBKGFyZ3VtZW50cyk7CnZhciBrZXlzPWFyZ3MubGVuZ3RoPT09MD9FbGVtZW50LkxheW91dC5QUk9QRVJUSUVTOmFyZ3Muam9pbigiICIpLnNwbGl0KCIgIik7dmFyIGNzcz17fTtrZXlzLmVhY2goZnVuY3Rpb24oa2V5KXtpZighRWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5pbmNsdWRlKGtleSkpcmV0dXJuO2lmKEVsZW1lbnQuTGF5b3V0LkNPTVBPU0lURV9QUk9QRVJUSUVTLmluY2x1ZGUoa2V5KSlyZXR1cm47dmFyIHZhbHVlPXRoaXMuZ2V0KGtleSk7aWYodmFsdWUhPW51bGwpY3NzW2Nzc05hbWVGb3Ioa2V5KV09dmFsdWUrInB4In0sdGhpcyk7cmV0dXJuIGNzc30saW5zcGVjdDpmdW5jdGlvbigpe3JldHVybiIjPEVsZW1lbnQuTGF5b3V0PiJ9fSk7T2JqZWN0LmV4dGVuZChFbGVtZW50LkxheW91dCx7UFJPUEVSVElFUzokdygiaGVpZ2h0IHdpZHRoIHRvcCBsZWZ0IHJpZ2h0IGJvdHRvbSBib3JkZXItbGVmdCBib3JkZXItcmlnaHQgYm9yZGVyLXRvcCBib3JkZXItYm90dG9tIHBhZGRpbmctbGVmdCBwYWRkaW5nLXJpZ2h0IHBhZGRpbmctdG9wIHBhZGRpbmctYm90dG9tIG1hcmdpbi10b3AgbWFyZ2luLWJvdHRvbSBtYXJnaW4tbGVmdCBtYXJnaW4tcmlnaHQgcGFkZGluZy1ib3gtd2lkdGggcGFkZGluZy1ib3gtaGVpZ2h0IGJvcmRlci1ib3gtd2lkdGggYm9yZGVyLWJveC1oZWlnaHQgbWFyZ2luLWJveC13aWR0aCBtYXJnaW4tYm94LWhlaWdodCIpLApDT01QT1NJVEVfUFJPUEVSVElFUzokdygicGFkZGluZy1ib3gtd2lkdGggcGFkZGluZy1ib3gtaGVpZ2h0IG1hcmdpbi1ib3gtd2lkdGggbWFyZ2luLWJveC1oZWlnaHQgYm9yZGVyLWJveC13aWR0aCBib3JkZXItYm94LWhlaWdodCIpLENPTVBVVEFUSU9OUzp7aGVpZ2h0OmZ1bmN0aW9uKGVsZW1lbnQpe2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpdGhpcy5fYmVnaW4oKTt2YXIgYkhlaWdodD10aGlzLmdldCgiYm9yZGVyLWJveC1oZWlnaHQiKTtpZihiSGVpZ2h0PD0wKXtpZighdGhpcy5fcHJlQ29tcHV0aW5nKXRoaXMuX2VuZCgpO3JldHVybiAwfXZhciBiVG9wPXRoaXMuZ2V0KCJib3JkZXItdG9wIiksYkJvdHRvbT10aGlzLmdldCgiYm9yZGVyLWJvdHRvbSIpO3ZhciBwVG9wPXRoaXMuZ2V0KCJwYWRkaW5nLXRvcCIpLHBCb3R0b209dGhpcy5nZXQoInBhZGRpbmctYm90dG9tIik7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl0aGlzLl9lbmQoKTtyZXR1cm4gYkhlaWdodC1iVG9wLWJCb3R0b20tCnBUb3AtcEJvdHRvbX0sd2lkdGg6ZnVuY3Rpb24oZWxlbWVudCl7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl0aGlzLl9iZWdpbigpO3ZhciBiV2lkdGg9dGhpcy5nZXQoImJvcmRlci1ib3gtd2lkdGgiKTtpZihiV2lkdGg8PTApe2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpdGhpcy5fZW5kKCk7cmV0dXJuIDB9dmFyIGJMZWZ0PXRoaXMuZ2V0KCJib3JkZXItbGVmdCIpLGJSaWdodD10aGlzLmdldCgiYm9yZGVyLXJpZ2h0Iik7dmFyIHBMZWZ0PXRoaXMuZ2V0KCJwYWRkaW5nLWxlZnQiKSxwUmlnaHQ9dGhpcy5nZXQoInBhZGRpbmctcmlnaHQiKTtpZighdGhpcy5fcHJlQ29tcHV0aW5nKXRoaXMuX2VuZCgpO3JldHVybiBiV2lkdGgtYkxlZnQtYlJpZ2h0LXBMZWZ0LXBSaWdodH0sInBhZGRpbmctYm94LWhlaWdodCI6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIGhlaWdodD10aGlzLmdldCgiaGVpZ2h0IikscFRvcD10aGlzLmdldCgicGFkZGluZy10b3AiKSxwQm90dG9tPXRoaXMuZ2V0KCJwYWRkaW5nLWJvdHRvbSIpOwpyZXR1cm4gaGVpZ2h0K3BUb3ArcEJvdHRvbX0sInBhZGRpbmctYm94LXdpZHRoIjpmdW5jdGlvbihlbGVtZW50KXt2YXIgd2lkdGg9dGhpcy5nZXQoIndpZHRoIikscExlZnQ9dGhpcy5nZXQoInBhZGRpbmctbGVmdCIpLHBSaWdodD10aGlzLmdldCgicGFkZGluZy1yaWdodCIpO3JldHVybiB3aWR0aCtwTGVmdCtwUmlnaHR9LCJib3JkZXItYm94LWhlaWdodCI6ZnVuY3Rpb24oZWxlbWVudCl7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl0aGlzLl9iZWdpbigpO3ZhciBoZWlnaHQ9ZWxlbWVudC5vZmZzZXRIZWlnaHQ7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl0aGlzLl9lbmQoKTtyZXR1cm4gaGVpZ2h0fSwiYm9yZGVyLWJveC13aWR0aCI6ZnVuY3Rpb24oZWxlbWVudCl7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl0aGlzLl9iZWdpbigpO3ZhciB3aWR0aD1lbGVtZW50Lm9mZnNldFdpZHRoO2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpdGhpcy5fZW5kKCk7cmV0dXJuIHdpZHRofSwibWFyZ2luLWJveC1oZWlnaHQiOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBiSGVpZ2h0PQp0aGlzLmdldCgiYm9yZGVyLWJveC1oZWlnaHQiKSxtVG9wPXRoaXMuZ2V0KCJtYXJnaW4tdG9wIiksbUJvdHRvbT10aGlzLmdldCgibWFyZ2luLWJvdHRvbSIpO2lmKGJIZWlnaHQ8PTApcmV0dXJuIDA7cmV0dXJuIGJIZWlnaHQrbVRvcCttQm90dG9tfSwibWFyZ2luLWJveC13aWR0aCI6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIGJXaWR0aD10aGlzLmdldCgiYm9yZGVyLWJveC13aWR0aCIpLG1MZWZ0PXRoaXMuZ2V0KCJtYXJnaW4tbGVmdCIpLG1SaWdodD10aGlzLmdldCgibWFyZ2luLXJpZ2h0Iik7aWYoYldpZHRoPD0wKXJldHVybiAwO3JldHVybiBiV2lkdGgrbUxlZnQrbVJpZ2h0fSx0b3A6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIG9mZnNldD1lbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoKTtyZXR1cm4gb2Zmc2V0LnRvcH0sYm90dG9tOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBvZmZzZXQ9ZWxlbWVudC5wb3NpdGlvbmVkT2Zmc2V0KCkscGFyZW50PWVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCksCnBIZWlnaHQ9cGFyZW50Lm1lYXN1cmUoImhlaWdodCIpO3ZhciBtSGVpZ2h0PXRoaXMuZ2V0KCJib3JkZXItYm94LWhlaWdodCIpO3JldHVybiBwSGVpZ2h0LW1IZWlnaHQtb2Zmc2V0LnRvcH0sbGVmdDpmdW5jdGlvbihlbGVtZW50KXt2YXIgb2Zmc2V0PWVsZW1lbnQucG9zaXRpb25lZE9mZnNldCgpO3JldHVybiBvZmZzZXQubGVmdH0scmlnaHQ6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIG9mZnNldD1lbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoKSxwYXJlbnQ9ZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKSxwV2lkdGg9cGFyZW50Lm1lYXN1cmUoIndpZHRoIik7dmFyIG1XaWR0aD10aGlzLmdldCgiYm9yZGVyLWJveC13aWR0aCIpO3JldHVybiBwV2lkdGgtbVdpZHRoLW9mZnNldC5sZWZ0fSwicGFkZGluZy10b3AiOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiBnZXRQaXhlbFZhbHVlKGVsZW1lbnQsInBhZGRpbmdUb3AiKX0sInBhZGRpbmctYm90dG9tIjpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LAoicGFkZGluZ0JvdHRvbSIpfSwicGFkZGluZy1sZWZ0IjpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCJwYWRkaW5nTGVmdCIpfSwicGFkZGluZy1yaWdodCI6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwicGFkZGluZ1JpZ2h0Iil9LCJib3JkZXItdG9wIjpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCJib3JkZXJUb3BXaWR0aCIpfSwiYm9yZGVyLWJvdHRvbSI6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwiYm9yZGVyQm90dG9tV2lkdGgiKX0sImJvcmRlci1sZWZ0IjpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCJib3JkZXJMZWZ0V2lkdGgiKX0sImJvcmRlci1yaWdodCI6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwiYm9yZGVyUmlnaHRXaWR0aCIpfSwKIm1hcmdpbi10b3AiOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiBnZXRQaXhlbFZhbHVlKGVsZW1lbnQsIm1hcmdpblRvcCIpfSwibWFyZ2luLWJvdHRvbSI6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwibWFyZ2luQm90dG9tIil9LCJtYXJnaW4tbGVmdCI6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwibWFyZ2luTGVmdCIpfSwibWFyZ2luLXJpZ2h0IjpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCJtYXJnaW5SaWdodCIpfX19KTtpZigiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTGF5b3V0LkNPTVBVVEFUSU9OUyx7cmlnaHQ6ZnVuY3Rpb24oZWxlbWVudCl7dmFyIHBhcmVudD1oYXNMYXlvdXQoZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKSk7dmFyIHJlY3Q9ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKcFJlY3Q9cGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybihwUmVjdC5yaWdodC1yZWN0LnJpZ2h0KS5yb3VuZCgpfSxib3R0b206ZnVuY3Rpb24oZWxlbWVudCl7dmFyIHBhcmVudD1oYXNMYXlvdXQoZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKSk7dmFyIHJlY3Q9ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwUmVjdD1wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKHBSZWN0LmJvdHRvbS1yZWN0LmJvdHRvbSkucm91bmQoKX19KTtFbGVtZW50Lk9mZnNldD1DbGFzcy5jcmVhdGUoe2luaXRpYWxpemU6ZnVuY3Rpb24obGVmdCx0b3Ape3RoaXMubGVmdD1sZWZ0LnJvdW5kKCk7dGhpcy50b3A9dG9wLnJvdW5kKCk7dGhpc1swXT10aGlzLmxlZnQ7dGhpc1sxXT10aGlzLnRvcH0scmVsYXRpdmVUbzpmdW5jdGlvbihvZmZzZXQpe3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodGhpcy5sZWZ0LW9mZnNldC5sZWZ0LHRoaXMudG9wLW9mZnNldC50b3ApfSwKaW5zcGVjdDpmdW5jdGlvbigpe3JldHVybiIjPEVsZW1lbnQuT2Zmc2V0IGxlZnQ6ICN7bGVmdH0gdG9wOiAje3RvcH0+Ii5pbnRlcnBvbGF0ZSh0aGlzKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iWyN7bGVmdH0sICN7dG9wfV0iLmludGVycG9sYXRlKHRoaXMpfSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMubGVmdCx0aGlzLnRvcF19fSk7ZnVuY3Rpb24gZ2V0TGF5b3V0KGVsZW1lbnQscHJlQ29tcHV0ZSl7cmV0dXJuIG5ldyBFbGVtZW50LkxheW91dChlbGVtZW50LHByZUNvbXB1dGUpfWZ1bmN0aW9uIG1lYXN1cmUoZWxlbWVudCxwcm9wZXJ0eSl7cmV0dXJuICQoZWxlbWVudCkuZ2V0TGF5b3V0KCkuZ2V0KHByb3BlcnR5KX1mdW5jdGlvbiBnZXRIZWlnaHQoZWxlbWVudCl7cmV0dXJuIEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVtZW50KS5oZWlnaHR9ZnVuY3Rpb24gZ2V0V2lkdGgoZWxlbWVudCl7cmV0dXJuIEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVtZW50KS53aWR0aH0KZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIGRpc3BsYXk9RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJkaXNwbGF5Iik7aWYoZGlzcGxheSYmZGlzcGxheSE9PSJub25lIilyZXR1cm57d2lkdGg6ZWxlbWVudC5vZmZzZXRXaWR0aCxoZWlnaHQ6ZWxlbWVudC5vZmZzZXRIZWlnaHR9O3ZhciBzdHlsZT1lbGVtZW50LnN0eWxlO3ZhciBvcmlnaW5hbFN0eWxlcz17dmlzaWJpbGl0eTpzdHlsZS52aXNpYmlsaXR5LHBvc2l0aW9uOnN0eWxlLnBvc2l0aW9uLGRpc3BsYXk6c3R5bGUuZGlzcGxheX07dmFyIG5ld1N0eWxlcz17dmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9O2lmKG9yaWdpbmFsU3R5bGVzLnBvc2l0aW9uIT09ImZpeGVkIiluZXdTdHlsZXMucG9zaXRpb249ImFic29sdXRlIjtFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsbmV3U3R5bGVzKTt2YXIgZGltZW5zaW9ucz17d2lkdGg6ZWxlbWVudC5vZmZzZXRXaWR0aCwKaGVpZ2h0OmVsZW1lbnQub2Zmc2V0SGVpZ2h0fTtFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsb3JpZ2luYWxTdHlsZXMpO3JldHVybiBkaW1lbnNpb25zfWZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7aWYoaXNEb2N1bWVudChlbGVtZW50KXx8aXNEZXRhY2hlZChlbGVtZW50KXx8aXNCb2R5KGVsZW1lbnQpfHxpc0h0bWwoZWxlbWVudCkpcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7dmFyIGlzSW5saW5lPUVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwiZGlzcGxheSIpPT09ImlubGluZSI7aWYoIWlzSW5saW5lJiZlbGVtZW50Lm9mZnNldFBhcmVudClyZXR1cm4gJChlbGVtZW50Lm9mZnNldFBhcmVudCk7d2hpbGUoKGVsZW1lbnQ9ZWxlbWVudC5wYXJlbnROb2RlKSYmZWxlbWVudCE9PWRvY3VtZW50LmJvZHkpaWYoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpIT09InN0YXRpYyIpcmV0dXJuIGlzSHRtbChlbGVtZW50KT8KJChkb2N1bWVudC5ib2R5KTokKGVsZW1lbnQpO3JldHVybiAkKGRvY3VtZW50LmJvZHkpfWZ1bmN0aW9uIGN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciB2YWx1ZVQ9MCx2YWx1ZUw9MDtpZihlbGVtZW50LnBhcmVudE5vZGUpe2Rve3ZhbHVlVCs9ZWxlbWVudC5vZmZzZXRUb3B8fDA7dmFsdWVMKz1lbGVtZW50Lm9mZnNldExlZnR8fDA7ZWxlbWVudD1lbGVtZW50Lm9mZnNldFBhcmVudH13aGlsZShlbGVtZW50KX1yZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KHZhbHVlTCx2YWx1ZVQpfWZ1bmN0aW9uIHBvc2l0aW9uZWRPZmZzZXQoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBsYXlvdXQ9ZWxlbWVudC5nZXRMYXlvdXQoKTt2YXIgdmFsdWVUPTAsdmFsdWVMPTA7ZG97dmFsdWVUKz1lbGVtZW50Lm9mZnNldFRvcHx8MDt2YWx1ZUwrPWVsZW1lbnQub2Zmc2V0TGVmdHx8MDtlbGVtZW50PWVsZW1lbnQub2Zmc2V0UGFyZW50O2lmKGVsZW1lbnQpe2lmKGlzQm9keShlbGVtZW50KSlicmVhazsKdmFyIHA9RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpO2lmKHAhPT0ic3RhdGljIilicmVha319d2hpbGUoZWxlbWVudCk7dmFsdWVMLT1sYXlvdXQuZ2V0KCJtYXJnaW4tdG9wIik7dmFsdWVULT1sYXlvdXQuZ2V0KCJtYXJnaW4tbGVmdCIpO3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLHZhbHVlVCl9ZnVuY3Rpb24gY3VtdWxhdGl2ZVNjcm9sbE9mZnNldChlbGVtZW50KXt2YXIgdmFsdWVUPTAsdmFsdWVMPTA7ZG8gaWYoZWxlbWVudD09PWRvY3VtZW50LmJvZHkpe3ZhciBib2R5U2Nyb2xsTm9kZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keTt2YWx1ZVQrPSFPYmplY3QuaXNVbmRlZmluZWQod2luZG93LnBhZ2VZT2Zmc2V0KT93aW5kb3cucGFnZVlPZmZzZXQ6Ym9keVNjcm9sbE5vZGUuc2Nyb2xsVG9wfHwwO3ZhbHVlTCs9IU9iamVjdC5pc1VuZGVmaW5lZCh3aW5kb3cucGFnZVhPZmZzZXQpPwp3aW5kb3cucGFnZVhPZmZzZXQ6Ym9keVNjcm9sbE5vZGUuc2Nyb2xsTGVmdHx8MDticmVha31lbHNle3ZhbHVlVCs9ZWxlbWVudC5zY3JvbGxUb3B8fDA7dmFsdWVMKz1lbGVtZW50LnNjcm9sbExlZnR8fDA7ZWxlbWVudD1lbGVtZW50LnBhcmVudE5vZGV9d2hpbGUoZWxlbWVudCk7cmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCh2YWx1ZUwsdmFsdWVUKX1mdW5jdGlvbiB2aWV3cG9ydE9mZnNldChmb3JFbGVtZW50KXt2YXIgdmFsdWVUPTAsdmFsdWVMPTAsZG9jQm9keT1kb2N1bWVudC5ib2R5O2ZvckVsZW1lbnQ9JChmb3JFbGVtZW50KTt2YXIgZWxlbWVudD1mb3JFbGVtZW50O2Rve3ZhbHVlVCs9ZWxlbWVudC5vZmZzZXRUb3B8fDA7dmFsdWVMKz1lbGVtZW50Lm9mZnNldExlZnR8fDA7aWYoZWxlbWVudC5vZmZzZXRQYXJlbnQ9PWRvY0JvZHkmJkVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwicG9zaXRpb24iKT09ImFic29sdXRlIilicmVha313aGlsZShlbGVtZW50PWVsZW1lbnQub2Zmc2V0UGFyZW50KTsKZWxlbWVudD1mb3JFbGVtZW50O2RvIGlmKGVsZW1lbnQhPWRvY0JvZHkpe3ZhbHVlVC09ZWxlbWVudC5zY3JvbGxUb3B8fDA7dmFsdWVMLT1lbGVtZW50LnNjcm9sbExlZnR8fDB9d2hpbGUoZWxlbWVudD1lbGVtZW50LnBhcmVudE5vZGUpO3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLHZhbHVlVCl9ZnVuY3Rpb24gYWJzb2x1dGl6ZShlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7aWYoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpPT09ImFic29sdXRlIilyZXR1cm4gZWxlbWVudDt2YXIgb2Zmc2V0UGFyZW50PWdldE9mZnNldFBhcmVudChlbGVtZW50KTt2YXIgZU9mZnNldD1lbGVtZW50LnZpZXdwb3J0T2Zmc2V0KCkscE9mZnNldD1vZmZzZXRQYXJlbnQudmlld3BvcnRPZmZzZXQoKTt2YXIgb2Zmc2V0PWVPZmZzZXQucmVsYXRpdmVUbyhwT2Zmc2V0KTt2YXIgbGF5b3V0PWVsZW1lbnQuZ2V0TGF5b3V0KCk7ZWxlbWVudC5zdG9yZSgicHJvdG90eXBlX2Fic29sdXRpemVfb3JpZ2luYWxfc3R5bGVzIiwKe3Bvc2l0aW9uOmVsZW1lbnQuZ2V0U3R5bGUoInBvc2l0aW9uIiksbGVmdDplbGVtZW50LmdldFN0eWxlKCJsZWZ0IiksdG9wOmVsZW1lbnQuZ2V0U3R5bGUoInRvcCIpLHdpZHRoOmVsZW1lbnQuZ2V0U3R5bGUoIndpZHRoIiksaGVpZ2h0OmVsZW1lbnQuZ2V0U3R5bGUoImhlaWdodCIpfSk7ZWxlbWVudC5zZXRTdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6b2Zmc2V0LnRvcCsicHgiLGxlZnQ6b2Zmc2V0LmxlZnQrInB4Iix3aWR0aDpsYXlvdXQuZ2V0KCJ3aWR0aCIpKyJweCIsaGVpZ2h0OmxheW91dC5nZXQoImhlaWdodCIpKyJweCJ9KTtyZXR1cm4gZWxlbWVudH1mdW5jdGlvbiByZWxhdGl2aXplKGVsZW1lbnQpe2VsZW1lbnQ9JChlbGVtZW50KTtpZihFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsInBvc2l0aW9uIik9PT0icmVsYXRpdmUiKXJldHVybiBlbGVtZW50O3ZhciBvcmlnaW5hbFN0eWxlcz1lbGVtZW50LnJldHJpZXZlKCJwcm90b3R5cGVfYWJzb2x1dGl6ZV9vcmlnaW5hbF9zdHlsZXMiKTsKaWYob3JpZ2luYWxTdHlsZXMpZWxlbWVudC5zZXRTdHlsZShvcmlnaW5hbFN0eWxlcyk7cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gc2Nyb2xsVG8oZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBwb3M9RWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpO3dpbmRvdy5zY3JvbGxUbyhwb3MubGVmdCxwb3MudG9wKTtyZXR1cm4gZWxlbWVudH1mdW5jdGlvbiBtYWtlUG9zaXRpb25lZChlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIHBvc2l0aW9uPUVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwicG9zaXRpb24iKSxzdHlsZXM9e307aWYocG9zaXRpb249PT0ic3RhdGljInx8IXBvc2l0aW9uKXtzdHlsZXMucG9zaXRpb249InJlbGF0aXZlIjtpZihQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSl7c3R5bGVzLnRvcD0wO3N0eWxlcy5sZWZ0PTB9RWxlbWVudC5zZXRTdHlsZShlbGVtZW50LHN0eWxlcyk7RWxlbWVudC5zdG9yZShlbGVtZW50LCJwcm90b3R5cGVfbWFkZV9wb3NpdGlvbmVkIiwKdHJ1ZSl9cmV0dXJuIGVsZW1lbnR9ZnVuY3Rpb24gdW5kb1Bvc2l0aW9uZWQoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBzdG9yYWdlPUVsZW1lbnQuZ2V0U3RvcmFnZShlbGVtZW50KSxtYWRlUG9zaXRpb25lZD1zdG9yYWdlLmdldCgicHJvdG90eXBlX21hZGVfcG9zaXRpb25lZCIpO2lmKG1hZGVQb3NpdGlvbmVkKXtzdG9yYWdlLnVuc2V0KCJwcm90b3R5cGVfbWFkZV9wb3NpdGlvbmVkIik7RWxlbWVudC5zZXRTdHlsZShlbGVtZW50LHtwb3NpdGlvbjoiIix0b3A6IiIsYm90dG9tOiIiLGxlZnQ6IiIscmlnaHQ6IiJ9KX1yZXR1cm4gZWxlbWVudH1mdW5jdGlvbiBtYWtlQ2xpcHBpbmcoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBzdG9yYWdlPUVsZW1lbnQuZ2V0U3RvcmFnZShlbGVtZW50KSxtYWRlQ2xpcHBpbmc9c3RvcmFnZS5nZXQoInByb3RvdHlwZV9tYWRlX2NsaXBwaW5nIik7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKG1hZGVDbGlwcGluZykpe3ZhciBvdmVyZmxvdz0KRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJvdmVyZmxvdyIpO3N0b3JhZ2Uuc2V0KCJwcm90b3R5cGVfbWFkZV9jbGlwcGluZyIsb3ZlcmZsb3cpO2lmKG92ZXJmbG93IT09ImhpZGRlbiIpZWxlbWVudC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn1yZXR1cm4gZWxlbWVudH1mdW5jdGlvbiB1bmRvQ2xpcHBpbmcoZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBzdG9yYWdlPUVsZW1lbnQuZ2V0U3RvcmFnZShlbGVtZW50KSxvdmVyZmxvdz1zdG9yYWdlLmdldCgicHJvdG90eXBlX21hZGVfY2xpcHBpbmciKTtpZighT2JqZWN0LmlzVW5kZWZpbmVkKG92ZXJmbG93KSl7c3RvcmFnZS51bnNldCgicHJvdG90eXBlX21hZGVfY2xpcHBpbmciKTtlbGVtZW50LnN0eWxlLm92ZXJmbG93PW92ZXJmbG93fHwiIn1yZXR1cm4gZWxlbWVudH1mdW5jdGlvbiBjbG9uZVBvc2l0aW9uKGVsZW1lbnQsc291cmNlLG9wdGlvbnMpe29wdGlvbnM9T2JqZWN0LmV4dGVuZCh7c2V0TGVmdDp0cnVlLApzZXRUb3A6dHJ1ZSxzZXRXaWR0aDp0cnVlLHNldEhlaWdodDp0cnVlLG9mZnNldFRvcDowLG9mZnNldExlZnQ6MH0sb3B0aW9uc3x8e30pO3NvdXJjZT0kKHNvdXJjZSk7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBwLGRlbHRhLGxheW91dCxzdHlsZXM9e307aWYob3B0aW9ucy5zZXRMZWZ0fHxvcHRpb25zLnNldFRvcCl7cD1FbGVtZW50LnZpZXdwb3J0T2Zmc2V0KHNvdXJjZSk7ZGVsdGE9WzAsMF07aWYoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpPT09ImFic29sdXRlIil7dmFyIHBhcmVudD1FbGVtZW50LmdldE9mZnNldFBhcmVudChlbGVtZW50KTtpZihwYXJlbnQhPT1kb2N1bWVudC5ib2R5KWRlbHRhPUVsZW1lbnQudmlld3BvcnRPZmZzZXQocGFyZW50KX19aWYob3B0aW9ucy5zZXRXaWR0aHx8b3B0aW9ucy5zZXRIZWlnaHQpbGF5b3V0PUVsZW1lbnQuZ2V0TGF5b3V0KHNvdXJjZSk7aWYob3B0aW9ucy5zZXRMZWZ0KXN0eWxlcy5sZWZ0PXBbMF0tZGVsdGFbMF0rCm9wdGlvbnMub2Zmc2V0TGVmdCsicHgiO2lmKG9wdGlvbnMuc2V0VG9wKXN0eWxlcy50b3A9cFsxXS1kZWx0YVsxXStvcHRpb25zLm9mZnNldFRvcCsicHgiO2lmKG9wdGlvbnMuc2V0V2lkdGgpc3R5bGVzLndpZHRoPWxheW91dC5nZXQoImJvcmRlci1ib3gtd2lkdGgiKSsicHgiO2lmKG9wdGlvbnMuc2V0SGVpZ2h0KXN0eWxlcy5oZWlnaHQ9bGF5b3V0LmdldCgiYm9yZGVyLWJveC1oZWlnaHQiKSsicHgiO3JldHVybiBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsc3R5bGVzKX1pZihQcm90b3R5cGUuQnJvd3Nlci5JRSl7Z2V0T2Zmc2V0UGFyZW50PWdldE9mZnNldFBhcmVudC53cmFwKGZ1bmN0aW9uKHByb2NlZWQsZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO2lmKGlzRG9jdW1lbnQoZWxlbWVudCl8fGlzRGV0YWNoZWQoZWxlbWVudCl8fGlzQm9keShlbGVtZW50KXx8aXNIdG1sKGVsZW1lbnQpKXJldHVybiAkKGRvY3VtZW50LmJvZHkpO3ZhciBwb3NpdGlvbj1lbGVtZW50LmdldFN0eWxlKCJwb3NpdGlvbiIpOwppZihwb3NpdGlvbiE9PSJzdGF0aWMiKXJldHVybiBwcm9jZWVkKGVsZW1lbnQpO2VsZW1lbnQuc2V0U3R5bGUoe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KTt2YXIgdmFsdWU9cHJvY2VlZChlbGVtZW50KTtlbGVtZW50LnNldFN0eWxlKHtwb3NpdGlvbjpwb3NpdGlvbn0pO3JldHVybiB2YWx1ZX0pO3Bvc2l0aW9uZWRPZmZzZXQ9cG9zaXRpb25lZE9mZnNldC53cmFwKGZ1bmN0aW9uKHByb2NlZWQsZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO2lmKCFlbGVtZW50LnBhcmVudE5vZGUpcmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCgwLDApO3ZhciBwb3NpdGlvbj1lbGVtZW50LmdldFN0eWxlKCJwb3NpdGlvbiIpO2lmKHBvc2l0aW9uIT09InN0YXRpYyIpcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7dmFyIG9mZnNldFBhcmVudD1lbGVtZW50LmdldE9mZnNldFBhcmVudCgpO2lmKG9mZnNldFBhcmVudCYmb2Zmc2V0UGFyZW50LmdldFN0eWxlKCJwb3NpdGlvbiIpPT09ImZpeGVkIiloYXNMYXlvdXQob2Zmc2V0UGFyZW50KTsKZWxlbWVudC5zZXRTdHlsZSh7cG9zaXRpb246InJlbGF0aXZlIn0pO3ZhciB2YWx1ZT1wcm9jZWVkKGVsZW1lbnQpO2VsZW1lbnQuc2V0U3R5bGUoe3Bvc2l0aW9uOnBvc2l0aW9ufSk7cmV0dXJuIHZhbHVlfSl9ZWxzZSBpZihQcm90b3R5cGUuQnJvd3Nlci5XZWJraXQpY3VtdWxhdGl2ZU9mZnNldD1mdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIHZhbHVlVD0wLHZhbHVlTD0wO2Rve3ZhbHVlVCs9ZWxlbWVudC5vZmZzZXRUb3B8fDA7dmFsdWVMKz1lbGVtZW50Lm9mZnNldExlZnR8fDA7aWYoZWxlbWVudC5vZmZzZXRQYXJlbnQ9PWRvY3VtZW50LmJvZHkpaWYoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCJwb3NpdGlvbiIpPT0iYWJzb2x1dGUiKWJyZWFrO2VsZW1lbnQ9ZWxlbWVudC5vZmZzZXRQYXJlbnR9d2hpbGUoZWxlbWVudCk7cmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCh2YWx1ZUwsdmFsdWVUKX07RWxlbWVudC5hZGRNZXRob2RzKHtnZXRMYXlvdXQ6Z2V0TGF5b3V0LAptZWFzdXJlOm1lYXN1cmUsZ2V0V2lkdGg6Z2V0V2lkdGgsZ2V0SGVpZ2h0OmdldEhlaWdodCxnZXREaW1lbnNpb25zOmdldERpbWVuc2lvbnMsZ2V0T2Zmc2V0UGFyZW50OmdldE9mZnNldFBhcmVudCxjdW11bGF0aXZlT2Zmc2V0OmN1bXVsYXRpdmVPZmZzZXQscG9zaXRpb25lZE9mZnNldDpwb3NpdGlvbmVkT2Zmc2V0LGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQ6Y3VtdWxhdGl2ZVNjcm9sbE9mZnNldCx2aWV3cG9ydE9mZnNldDp2aWV3cG9ydE9mZnNldCxhYnNvbHV0aXplOmFic29sdXRpemUscmVsYXRpdml6ZTpyZWxhdGl2aXplLHNjcm9sbFRvOnNjcm9sbFRvLG1ha2VQb3NpdGlvbmVkOm1ha2VQb3NpdGlvbmVkLHVuZG9Qb3NpdGlvbmVkOnVuZG9Qb3NpdGlvbmVkLG1ha2VDbGlwcGluZzptYWtlQ2xpcHBpbmcsdW5kb0NsaXBwaW5nOnVuZG9DbGlwcGluZyxjbG9uZVBvc2l0aW9uOmNsb25lUG9zaXRpb259KTtmdW5jdGlvbiBpc0JvZHkoZWxlbWVudCl7cmV0dXJuIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PQoiQk9EWSJ9ZnVuY3Rpb24gaXNIdG1sKGVsZW1lbnQpe3JldHVybiBlbGVtZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iSFRNTCJ9ZnVuY3Rpb24gaXNEb2N1bWVudChlbGVtZW50KXtyZXR1cm4gZWxlbWVudC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERX1mdW5jdGlvbiBpc0RldGFjaGVkKGVsZW1lbnQpe3JldHVybiBlbGVtZW50IT09ZG9jdW1lbnQuYm9keSYmIUVsZW1lbnQuZGVzY2VuZGFudE9mKGVsZW1lbnQsZG9jdW1lbnQuYm9keSl9aWYoImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpRWxlbWVudC5hZGRNZXRob2RzKHt2aWV3cG9ydE9mZnNldDpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7aWYoaXNEZXRhY2hlZChlbGVtZW50KSlyZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KDAsMCk7dmFyIHJlY3Q9ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkb2NFbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CnJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQocmVjdC5sZWZ0LWRvY0VsLmNsaWVudExlZnQscmVjdC50b3AtZG9jRWwuY2xpZW50VG9wKX19KX0pKCk7CihmdW5jdGlvbigpe3ZhciBJU19PTERfT1BFUkE9UHJvdG90eXBlLkJyb3dzZXIuT3BlcmEmJndpbmRvdy5wYXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpPDkuNTt2YXIgUk9PVD1udWxsO2Z1bmN0aW9uIGdldFJvb3RFbGVtZW50KCl7aWYoUk9PVClyZXR1cm4gUk9PVDtST09UPUlTX09MRF9PUEVSQT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtyZXR1cm4gUk9PVH1mdW5jdGlvbiBnZXREaW1lbnNpb25zKCl7cmV0dXJue3dpZHRoOnRoaXMuZ2V0V2lkdGgoKSxoZWlnaHQ6dGhpcy5nZXRIZWlnaHQoKX19ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gZ2V0Um9vdEVsZW1lbnQoKS5jbGllbnRXaWR0aH1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gZ2V0Um9vdEVsZW1lbnQoKS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gZ2V0U2Nyb2xsT2Zmc2V0cygpe3ZhciB4PXdpbmRvdy5wYWdlWE9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fApkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7dmFyIHk9d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtyZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KHgseSl9ZG9jdW1lbnQudmlld3BvcnQ9e2dldERpbWVuc2lvbnM6Z2V0RGltZW5zaW9ucyxnZXRXaWR0aDpnZXRXaWR0aCxnZXRIZWlnaHQ6Z2V0SGVpZ2h0LGdldFNjcm9sbE9mZnNldHM6Z2V0U2Nyb2xsT2Zmc2V0c319KSgpO3dpbmRvdy4kJD1mdW5jdGlvbigpe3ZhciBleHByZXNzaW9uPSRBKGFyZ3VtZW50cykuam9pbigiLCAiKTtyZXR1cm4gUHJvdG90eXBlLlNlbGVjdG9yLnNlbGVjdChleHByZXNzaW9uLGRvY3VtZW50KX07ClByb3RvdHlwZS5TZWxlY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHNlbGVjdCgpe3Rocm93IG5ldyBFcnJvcignTWV0aG9kICJQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0IiBtdXN0IGJlIGRlZmluZWQuJyk7fWZ1bmN0aW9uIG1hdGNoKCl7dGhyb3cgbmV3IEVycm9yKCdNZXRob2QgIlByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaCIgbXVzdCBiZSBkZWZpbmVkLicpO31mdW5jdGlvbiBmaW5kKGVsZW1lbnRzLGV4cHJlc3Npb24saW5kZXgpe2luZGV4PWluZGV4fHwwO3ZhciBtYXRjaD1Qcm90b3R5cGUuU2VsZWN0b3IubWF0Y2gsbGVuZ3RoPWVsZW1lbnRzLmxlbmd0aCxtYXRjaEluZGV4PTAsaTtmb3IoaT0wO2k8bGVuZ3RoO2krKylpZihtYXRjaChlbGVtZW50c1tpXSxleHByZXNzaW9uKSYmaW5kZXg9PW1hdGNoSW5kZXgrKylyZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudHNbaV0pfWZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzKGVsZW1lbnRzKXtmb3IodmFyIGk9MCxsZW5ndGg9ZWxlbWVudHMubGVuZ3RoO2k8Cmxlbmd0aDtpKyspRWxlbWVudC5leHRlbmQoZWxlbWVudHNbaV0pO3JldHVybiBlbGVtZW50c312YXIgSz1Qcm90b3R5cGUuSztyZXR1cm57c2VsZWN0OnNlbGVjdCxtYXRjaDptYXRjaCxmaW5kOmZpbmQsZXh0ZW5kRWxlbWVudHM6RWxlbWVudC5leHRlbmQ9PT1LP0s6ZXh0ZW5kRWxlbWVudHMsZXh0ZW5kRWxlbWVudDpFbGVtZW50LmV4dGVuZH19KCk7UHJvdG90eXBlLl9vcmlnaW5hbF9wcm9wZXJ0eT13aW5kb3cuU2l6emxlOwooZnVuY3Rpb24od2luZG93KXt2YXIgaSxzdXBwb3J0LEV4cHIsZ2V0VGV4dCxpc1hNTCxjb21waWxlLHNlbGVjdCxvdXRlcm1vc3RDb250ZXh0LHNvcnRJbnB1dCxoYXNEdXBsaWNhdGUsc2V0RG9jdW1lbnQsZG9jdW1lbnQsZG9jRWxlbSxkb2N1bWVudElzSFRNTCxyYnVnZ3lRU0EscmJ1Z2d5TWF0Y2hlcyxtYXRjaGVzLGNvbnRhaW5zLGV4cGFuZG89InNpenpsZSIrLW5ldyBEYXRlLHByZWZlcnJlZERvYz13aW5kb3cuZG9jdW1lbnQsZGlycnVucz0wLGRvbmU9MCxjbGFzc0NhY2hlPWNyZWF0ZUNhY2hlKCksdG9rZW5DYWNoZT1jcmVhdGVDYWNoZSgpLGNvbXBpbGVyQ2FjaGU9Y3JlYXRlQ2FjaGUoKSxzb3J0T3JkZXI9ZnVuY3Rpb24oYSxiKXtpZihhPT09YiloYXNEdXBsaWNhdGU9dHJ1ZTtyZXR1cm4gMH0sc3RydW5kZWZpbmVkPXR5cGVvZiB1bmRlZmluZWQsTUFYX05FR0FUSVZFPTE8PDMxLGhhc093bj17fS5oYXNPd25Qcm9wZXJ0eSxhcnI9W10scG9wPWFyci5wb3AscHVzaF9uYXRpdmU9CmFyci5wdXNoLHB1c2g9YXJyLnB1c2gsc2xpY2U9YXJyLnNsaWNlLGluZGV4T2Y9YXJyLmluZGV4T2Z8fGZ1bmN0aW9uKGVsZW0pe3ZhciBpPTAsbGVuPXRoaXMubGVuZ3RoO2Zvcig7aTxsZW47aSsrKWlmKHRoaXNbaV09PT1lbGVtKXJldHVybiBpO3JldHVybi0xfSxib29sZWFucz0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLHdoaXRlc3BhY2U9IltcXHgyMFxcdFxcclxcblxcZl0iLGNoYXJhY3RlckVuY29kaW5nPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsaWRlbnRpZmllcj1jaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCJ3IiwidyMiKSxhdHRyaWJ1dGVzPSJcXFsiK3doaXRlc3BhY2UrIiooIitjaGFyYWN0ZXJFbmNvZGluZysiKSIrd2hpdGVzcGFjZSsiKig\/OihbKl4kfCF+XT89KSIrCndoaXRlc3BhY2UrIiooPzooWydcIl0pKCg\/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK2lkZW50aWZpZXIrIil8KXwpIit3aGl0ZXNwYWNlKyIqXFxdIixwc2V1ZG9zPSI6KCIrY2hhcmFjdGVyRW5jb2RpbmcrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo\/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK2F0dHJpYnV0ZXMucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLHJ0cmltPW5ldyBSZWdFeHAoIl4iK3doaXRlc3BhY2UrIit8KCg\/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrd2hpdGVzcGFjZSsiKyQiLCJnIikscmNvbW1hPW5ldyBSZWdFeHAoIl4iK3doaXRlc3BhY2UrIiosIit3aGl0ZXNwYWNlKyIqIikscmNvbWJpbmF0b3JzPW5ldyBSZWdFeHAoIl4iK3doaXRlc3BhY2UrIiooWz4rfl18Iit3aGl0ZXNwYWNlKyIpIit3aGl0ZXNwYWNlKyIqIikscmF0dHJpYnV0ZVF1b3Rlcz1uZXcgUmVnRXhwKCI9Iit3aGl0ZXNwYWNlKyIqKFteXFxdJ1wiXSo\/KSIrCndoaXRlc3BhY2UrIipcXF0iLCJnIikscnBzZXVkbz1uZXcgUmVnRXhwKHBzZXVkb3MpLHJpZGVudGlmaWVyPW5ldyBSZWdFeHAoIl4iK2lkZW50aWZpZXIrIiQiKSxtYXRjaEV4cHI9e0lEOm5ldyBSZWdFeHAoIl4jKCIrY2hhcmFjdGVyRW5jb2RpbmcrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrY2hhcmFjdGVyRW5jb2RpbmcrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK2NoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIithdHRyaWJ1dGVzKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcHNldWRvcyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIit3aGl0ZXNwYWNlKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIit3aGl0ZXNwYWNlKyIqKD86KFsrLV18KSIrd2hpdGVzcGFjZSsiKihcXGQrKXwpKSIrd2hpdGVzcGFjZSsiKlxcKXwpIiwKImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK2Jvb2xlYW5zKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrd2hpdGVzcGFjZSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIit3aGl0ZXNwYWNlKyIqKCg\/Oi1cXGQpP1xcZCopIit3aGl0ZXNwYWNlKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxyaW5wdXRzPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kscmhlYWRlcj0vXmhcZCQvaSxybmF0aXZlPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxycXVpY2tFeHByPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8scnNpYmxpbmc9L1srfl0vLHJlc2NhcGU9Lyd8XFwvZyxydW5lc2NhcGU9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9Iit3aGl0ZXNwYWNlKyI\/fCgiK3doaXRlc3BhY2UrIil8LikiLCJpZyIpLGZ1bmVzY2FwZT1mdW5jdGlvbihfLGVzY2FwZWQsZXNjYXBlZFdoaXRlc3BhY2Upe3ZhciBoaWdoPQoiMHgiK2VzY2FwZWQtNjU1MzY7cmV0dXJuIGhpZ2ghPT1oaWdofHxlc2NhcGVkV2hpdGVzcGFjZT9lc2NhcGVkOmhpZ2g8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGhpZ2grNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoaGlnaD4+MTB8NTUyOTYsaGlnaCYxMDIzfDU2MzIwKX07dHJ5e3B1c2guYXBwbHkoYXJyPXNsaWNlLmNhbGwocHJlZmVycmVkRG9jLmNoaWxkTm9kZXMpLHByZWZlcnJlZERvYy5jaGlsZE5vZGVzKTthcnJbcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtwdXNoPXthcHBseTphcnIubGVuZ3RoP2Z1bmN0aW9uKHRhcmdldCxlbHMpe3B1c2hfbmF0aXZlLmFwcGx5KHRhcmdldCxzbGljZS5jYWxsKGVscykpfTpmdW5jdGlvbih0YXJnZXQsZWxzKXt2YXIgaj10YXJnZXQubGVuZ3RoLGk9MDt3aGlsZSh0YXJnZXRbaisrXT1lbHNbaSsrXSk7dGFyZ2V0Lmxlbmd0aD1qLTF9fX1mdW5jdGlvbiBTaXp6bGUoc2VsZWN0b3IsY29udGV4dCwKcmVzdWx0cyxzZWVkKXt2YXIgbWF0Y2gsZWxlbSxtLG5vZGVUeXBlLGksZ3JvdXBzLG9sZCxuaWQsbmV3Q29udGV4dCxuZXdTZWxlY3RvcjtpZigoY29udGV4dD9jb250ZXh0Lm93bmVyRG9jdW1lbnR8fGNvbnRleHQ6cHJlZmVycmVkRG9jKSE9PWRvY3VtZW50KXNldERvY3VtZW50KGNvbnRleHQpO2NvbnRleHQ9Y29udGV4dHx8ZG9jdW1lbnQ7cmVzdWx0cz1yZXN1bHRzfHxbXTtpZighc2VsZWN0b3J8fHR5cGVvZiBzZWxlY3RvciE9PSJzdHJpbmciKXJldHVybiByZXN1bHRzO2lmKChub2RlVHlwZT1jb250ZXh0Lm5vZGVUeXBlKSE9PTEmJm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZihkb2N1bWVudElzSFRNTCYmIXNlZWQpe2lmKG1hdGNoPXJxdWlja0V4cHIuZXhlYyhzZWxlY3RvcikpaWYobT1tYXRjaFsxXSlpZihub2RlVHlwZT09PTkpe2VsZW09Y29udGV4dC5nZXRFbGVtZW50QnlJZChtKTtpZihlbGVtJiZlbGVtLnBhcmVudE5vZGUpe2lmKGVsZW0uaWQ9PT1tKXtyZXN1bHRzLnB1c2goZWxlbSk7CnJldHVybiByZXN1bHRzfX1lbHNlIHJldHVybiByZXN1bHRzfWVsc2V7aWYoY29udGV4dC5vd25lckRvY3VtZW50JiYoZWxlbT1jb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobSkpJiZjb250YWlucyhjb250ZXh0LGVsZW0pJiZlbGVtLmlkPT09bSl7cmVzdWx0cy5wdXNoKGVsZW0pO3JldHVybiByZXN1bHRzfX1lbHNlIGlmKG1hdGNoWzJdKXtwdXNoLmFwcGx5KHJlc3VsdHMsY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3RvcikpO3JldHVybiByZXN1bHRzfWVsc2UgaWYoKG09bWF0Y2hbM10pJiZzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSl7cHVzaC5hcHBseShyZXN1bHRzLGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtKSk7cmV0dXJuIHJlc3VsdHN9aWYoc3VwcG9ydC5xc2EmJighcmJ1Z2d5UVNBfHwhcmJ1Z2d5UVNBLnRlc3Qoc2VsZWN0b3IpKSl7bmlkPW9sZD1leHBhbmRvOwpuZXdDb250ZXh0PWNvbnRleHQ7bmV3U2VsZWN0b3I9bm9kZVR5cGU9PT05JiZzZWxlY3RvcjtpZihub2RlVHlwZT09PTEmJmNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXtncm91cHM9dG9rZW5pemUoc2VsZWN0b3IpO2lmKG9sZD1jb250ZXh0LmdldEF0dHJpYnV0ZSgiaWQiKSluaWQ9b2xkLnJlcGxhY2UocmVzY2FwZSwiXFwkJiIpO2Vsc2UgY29udGV4dC5zZXRBdHRyaWJ1dGUoImlkIixuaWQpO25pZD0iW2lkPSciK25pZCsiJ10gIjtpPWdyb3Vwcy5sZW5ndGg7d2hpbGUoaS0tKWdyb3Vwc1tpXT1uaWQrdG9TZWxlY3Rvcihncm91cHNbaV0pO25ld0NvbnRleHQ9cnNpYmxpbmcudGVzdChzZWxlY3RvcikmJnRlc3RDb250ZXh0KGNvbnRleHQucGFyZW50Tm9kZSl8fGNvbnRleHQ7bmV3U2VsZWN0b3I9Z3JvdXBzLmpvaW4oIiwiKX1pZihuZXdTZWxlY3Rvcil0cnl7cHVzaC5hcHBseShyZXN1bHRzLG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbChuZXdTZWxlY3RvcikpOwpyZXR1cm4gcmVzdWx0c31jYXRjaChxc2FFcnJvcil7fWZpbmFsbHl7aWYoIW9sZCljb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBzZWxlY3Qoc2VsZWN0b3IucmVwbGFjZShydHJpbSwiJDEiKSxjb250ZXh0LHJlc3VsdHMsc2VlZCl9ZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKXt2YXIga2V5cz1bXTtmdW5jdGlvbiBjYWNoZShrZXksdmFsdWUpe2lmKGtleXMucHVzaChrZXkrIiAiKT5FeHByLmNhY2hlTGVuZ3RoKWRlbGV0ZSBjYWNoZVtrZXlzLnNoaWZ0KCldO3JldHVybiBjYWNoZVtrZXkrIiAiXT12YWx1ZX1yZXR1cm4gY2FjaGV9ZnVuY3Rpb24gbWFya0Z1bmN0aW9uKGZuKXtmbltleHBhbmRvXT10cnVlO3JldHVybiBmbn1mdW5jdGlvbiBhc3NlcnQoZm4pe3ZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhZm4oZGl2KX1jYXRjaChlKXtyZXR1cm4gZmFsc2V9ZmluYWxseXtpZihkaXYucGFyZW50Tm9kZSlkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOwpkaXY9bnVsbH19ZnVuY3Rpb24gYWRkSGFuZGxlKGF0dHJzLGhhbmRsZXIpe3ZhciBhcnI9YXR0cnMuc3BsaXQoInwiKSxpPWF0dHJzLmxlbmd0aDt3aGlsZShpLS0pRXhwci5hdHRySGFuZGxlW2FycltpXV09aGFuZGxlcn1mdW5jdGlvbiBzaWJsaW5nQ2hlY2soYSxiKXt2YXIgY3VyPWImJmEsZGlmZj1jdXImJmEubm9kZVR5cGU9PT0xJiZiLm5vZGVUeXBlPT09MSYmKH5iLnNvdXJjZUluZGV4fHxNQVhfTkVHQVRJVkUpLSh+YS5zb3VyY2VJbmRleHx8TUFYX05FR0FUSVZFKTtpZihkaWZmKXJldHVybiBkaWZmO2lmKGN1cil3aGlsZShjdXI9Y3VyLm5leHRTaWJsaW5nKWlmKGN1cj09PWIpcmV0dXJuLTE7cmV0dXJuIGE\/MTotMX1mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyh0eXBlKXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7dmFyIG5hbWU9ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBuYW1lPT09ImlucHV0IiYmZWxlbS50eXBlPT09dHlwZX19ZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKHR5cGUpe3JldHVybiBmdW5jdGlvbihlbGVtKXt2YXIgbmFtZT0KZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihuYW1lPT09ImlucHV0Inx8bmFtZT09PSJidXR0b24iKSYmZWxlbS50eXBlPT09dHlwZX19ZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmbil7cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbihhcmd1bWVudCl7YXJndW1lbnQ9K2FyZ3VtZW50O3JldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oc2VlZCxtYXRjaGVzKXt2YXIgaixtYXRjaEluZGV4ZXM9Zm4oW10sc2VlZC5sZW5ndGgsYXJndW1lbnQpLGk9bWF0Y2hJbmRleGVzLmxlbmd0aDt3aGlsZShpLS0paWYoc2VlZFtqPW1hdGNoSW5kZXhlc1tpXV0pc2VlZFtqXT0hKG1hdGNoZXNbal09c2VlZFtqXSl9KX0pfWZ1bmN0aW9uIHRlc3RDb250ZXh0KGNvbnRleHQpe3JldHVybiBjb250ZXh0JiZ0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PXN0cnVuZGVmaW5lZCYmY29udGV4dH1zdXBwb3J0PVNpenpsZS5zdXBwb3J0PXt9O2lzWE1MPQpTaXp6bGUuaXNYTUw9ZnVuY3Rpb24oZWxlbSl7dmFyIGRvY3VtZW50RWxlbWVudD1lbGVtJiYoZWxlbS5vd25lckRvY3VtZW50fHxlbGVtKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGRvY3VtZW50RWxlbWVudD9kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3NldERvY3VtZW50PVNpenpsZS5zZXREb2N1bWVudD1mdW5jdGlvbihub2RlKXt2YXIgaGFzQ29tcGFyZSxkb2M9bm9kZT9ub2RlLm93bmVyRG9jdW1lbnR8fG5vZGU6cHJlZmVycmVkRG9jLHBhcmVudD1kb2MuZGVmYXVsdFZpZXc7aWYoZG9jPT09ZG9jdW1lbnR8fGRvYy5ub2RlVHlwZSE9PTl8fCFkb2MuZG9jdW1lbnRFbGVtZW50KXJldHVybiBkb2N1bWVudDtkb2N1bWVudD1kb2M7ZG9jRWxlbT1kb2MuZG9jdW1lbnRFbGVtZW50O2RvY3VtZW50SXNIVE1MPSFpc1hNTChkb2MpO2lmKHBhcmVudCYmcGFyZW50IT09cGFyZW50LnRvcClpZihwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcilwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXtzZXREb2N1bWVudCgpfSxmYWxzZSk7ZWxzZSBpZihwYXJlbnQuYXR0YWNoRXZlbnQpcGFyZW50LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXtzZXREb2N1bWVudCgpfSk7c3VwcG9ydC5hdHRyaWJ1dGVzPWFzc2VydChmdW5jdGlvbihkaXYpe2Rpdi5jbGFzc05hbWU9ImkiO3JldHVybiFkaXYuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pO3N1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU9YXNzZXJ0KGZ1bmN0aW9uKGRpdil7ZGl2LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIiKSk7cmV0dXJuIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pO3N1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1ybmF0aXZlLnRlc3QoZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpJiZhc3NlcnQoZnVuY3Rpb24oZGl2KXtkaXYuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiI7CmRpdi5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSI7cmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RoPT09Mn0pO3N1cHBvcnQuZ2V0QnlJZD1hc3NlcnQoZnVuY3Rpb24oZGl2KXtkb2NFbGVtLmFwcGVuZENoaWxkKGRpdikuaWQ9ZXhwYW5kbztyZXR1cm4hZG9jLmdldEVsZW1lbnRzQnlOYW1lfHwhZG9jLmdldEVsZW1lbnRzQnlOYW1lKGV4cGFuZG8pLmxlbmd0aH0pO2lmKHN1cHBvcnQuZ2V0QnlJZCl7RXhwci5maW5kWyJJRCJdPWZ1bmN0aW9uKGlkLGNvbnRleHQpe2lmKHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkIT09c3RydW5kZWZpbmVkJiZkb2N1bWVudElzSFRNTCl7dmFyIG09Y29udGV4dC5nZXRFbGVtZW50QnlJZChpZCk7cmV0dXJuIG0mJm0ucGFyZW50Tm9kZT9bbV06W119fTtFeHByLmZpbHRlclsiSUQiXT1mdW5jdGlvbihpZCl7dmFyIGF0dHJJZD1pZC5yZXBsYWNlKHJ1bmVzY2FwZSxmdW5lc2NhcGUpO3JldHVybiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik9PT0KYXR0cklkfX19ZWxzZXtkZWxldGUgRXhwci5maW5kWyJJRCJdO0V4cHIuZmlsdGVyWyJJRCJdPWZ1bmN0aW9uKGlkKXt2YXIgYXR0cklkPWlkLnJlcGxhY2UocnVuZXNjYXBlLGZ1bmVzY2FwZSk7cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe3ZhciBub2RlPXR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUhPT1zdHJ1bmRlZmluZWQmJmVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbm9kZSYmbm9kZS52YWx1ZT09PWF0dHJJZH19fUV4cHIuZmluZFsiVEFHIl09c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0YWcsY29udGV4dCl7aWYodHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1zdHJ1bmRlZmluZWQpcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKX06ZnVuY3Rpb24odGFnLGNvbnRleHQpe3ZhciBlbGVtLHRtcD1bXSxpPTAscmVzdWx0cz1jb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7aWYodGFnPT09CiIqIil7d2hpbGUoZWxlbT1yZXN1bHRzW2krK10paWYoZWxlbS5ub2RlVHlwZT09PTEpdG1wLnB1c2goZWxlbSk7cmV0dXJuIHRtcH1yZXR1cm4gcmVzdWx0c307RXhwci5maW5kWyJDTEFTUyJdPXN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oY2xhc3NOYW1lLGNvbnRleHQpe2lmKHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1zdHJ1bmRlZmluZWQmJmRvY3VtZW50SXNIVE1MKXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKX07cmJ1Z2d5TWF0Y2hlcz1bXTtyYnVnZ3lRU0E9W107aWYoc3VwcG9ydC5xc2E9cm5hdGl2ZS50ZXN0KGRvYy5xdWVyeVNlbGVjdG9yQWxsKSl7YXNzZXJ0KGZ1bmN0aW9uKGRpdil7ZGl2LmlubmVySFRNTD0iPHNlbGVjdCB0PScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjtpZihkaXYucXVlcnlTZWxlY3RvckFsbCgiW3RePScnXSIpLmxlbmd0aClyYnVnZ3lRU0EucHVzaCgiWypeJF09IisKd2hpdGVzcGFjZSsiKig\/OicnfFwiXCIpIik7aWYoIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoKXJidWdneVFTQS5wdXNoKCJcXFsiK3doaXRlc3BhY2UrIiooPzp2YWx1ZXwiK2Jvb2xlYW5zKyIpIik7aWYoIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aClyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKX0pO2Fzc2VydChmdW5jdGlvbihkaXYpe3ZhciBpbnB1dD1kb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtpbnB1dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKTtkaXYuYXBwZW5kQ2hpbGQoaW5wdXQpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKTtpZihkaXYucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgpcmJ1Z2d5UVNBLnB1c2goIm5hbWUiK3doaXRlc3BhY2UrIipbKl4kfCF+XT89Iik7aWYoIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aClyYnVnZ3lRU0EucHVzaCgiOmVuYWJsZWQiLAoiOmRpc2FibGVkIik7ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTtyYnVnZ3lRU0EucHVzaCgiLC4qOiIpfSl9aWYoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3I9cm5hdGl2ZS50ZXN0KG1hdGNoZXM9ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yfHxkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3J8fGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpKWFzc2VydChmdW5jdGlvbihkaXYpe3N1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2g9bWF0Y2hlcy5jYWxsKGRpdiwiZGl2Iik7bWF0Y2hlcy5jYWxsKGRpdiwiW3MhPScnXTp4Iik7cmJ1Z2d5TWF0Y2hlcy5wdXNoKCIhPSIscHNldWRvcyl9KTtyYnVnZ3lRU0E9cmJ1Z2d5UVNBLmxlbmd0aCYmbmV3IFJlZ0V4cChyYnVnZ3lRU0Euam9pbigifCIpKTtyYnVnZ3lNYXRjaGVzPXJidWdneU1hdGNoZXMubGVuZ3RoJiZuZXcgUmVnRXhwKHJidWdneU1hdGNoZXMuam9pbigifCIpKTtoYXNDb21wYXJlPQpybmF0aXZlLnRlc3QoZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbik7Y29udGFpbnM9aGFzQ29tcGFyZXx8cm5hdGl2ZS50ZXN0KGRvY0VsZW0uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGFkb3duPWEubm9kZVR5cGU9PT05P2EuZG9jdW1lbnRFbGVtZW50OmEsYnVwPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWJ1cHx8ISEoYnVwJiZidXAubm9kZVR5cGU9PT0xJiYoYWRvd24uY29udGFpbnM\/YWRvd24uY29udGFpbnMoYnVwKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGJ1cCkmMTYpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX07c29ydE9yZGVyPWhhc0NvbXBhcmU\/ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aGFzRHVwbGljYXRlPXRydWU7cmV0dXJuIDB9dmFyIGNvbXBhcmU9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tCiFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO2lmKGNvbXBhcmUpcmV0dXJuIGNvbXBhcmU7Y29tcGFyZT0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MTtpZihjb21wYXJlJjF8fCFzdXBwb3J0LnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWNvbXBhcmUpe2lmKGE9PT1kb2N8fGEub3duZXJEb2N1bWVudD09PXByZWZlcnJlZERvYyYmY29udGFpbnMocHJlZmVycmVkRG9jLGEpKXJldHVybi0xO2lmKGI9PT1kb2N8fGIub3duZXJEb2N1bWVudD09PXByZWZlcnJlZERvYyYmY29udGFpbnMocHJlZmVycmVkRG9jLGIpKXJldHVybiAxO3JldHVybiBzb3J0SW5wdXQ\/aW5kZXhPZi5jYWxsKHNvcnRJbnB1dCxhKS1pbmRleE9mLmNhbGwoc29ydElucHV0LGIpOjB9cmV0dXJuIGNvbXBhcmUmND8tMToxfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoYXNEdXBsaWNhdGU9dHJ1ZTsKcmV0dXJuIDB9dmFyIGN1cixpPTAsYXVwPWEucGFyZW50Tm9kZSxidXA9Yi5wYXJlbnROb2RlLGFwPVthXSxicD1bYl07aWYoIWF1cHx8IWJ1cClyZXR1cm4gYT09PWRvYz8tMTpiPT09ZG9jPzE6YXVwPy0xOmJ1cD8xOnNvcnRJbnB1dD9pbmRleE9mLmNhbGwoc29ydElucHV0LGEpLWluZGV4T2YuY2FsbChzb3J0SW5wdXQsYik6MDtlbHNlIGlmKGF1cD09PWJ1cClyZXR1cm4gc2libGluZ0NoZWNrKGEsYik7Y3VyPWE7d2hpbGUoY3VyPWN1ci5wYXJlbnROb2RlKWFwLnVuc2hpZnQoY3VyKTtjdXI9Yjt3aGlsZShjdXI9Y3VyLnBhcmVudE5vZGUpYnAudW5zaGlmdChjdXIpO3doaWxlKGFwW2ldPT09YnBbaV0paSsrO3JldHVybiBpP3NpYmxpbmdDaGVjayhhcFtpXSxicFtpXSk6YXBbaV09PT1wcmVmZXJyZWREb2M\/LTE6YnBbaV09PT1wcmVmZXJyZWREb2M\/MTowfTtyZXR1cm4gZG9jfTtTaXp6bGUubWF0Y2hlcz1mdW5jdGlvbihleHByLGVsZW1lbnRzKXtyZXR1cm4gU2l6emxlKGV4cHIsCm51bGwsbnVsbCxlbGVtZW50cyl9O1NpenpsZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZWxlbSxleHByKXtpZigoZWxlbS5vd25lckRvY3VtZW50fHxlbGVtKSE9PWRvY3VtZW50KXNldERvY3VtZW50KGVsZW0pO2V4cHI9ZXhwci5yZXBsYWNlKHJhdHRyaWJ1dGVRdW90ZXMsIj0nJDEnXSIpO2lmKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yJiZkb2N1bWVudElzSFRNTCYmKCFyYnVnZ3lNYXRjaGVzfHwhcmJ1Z2d5TWF0Y2hlcy50ZXN0KGV4cHIpKSYmKCFyYnVnZ3lRU0F8fCFyYnVnZ3lRU0EudGVzdChleHByKSkpdHJ5e3ZhciByZXQ9bWF0Y2hlcy5jYWxsKGVsZW0sZXhwcik7aWYocmV0fHxzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNofHxlbGVtLmRvY3VtZW50JiZlbGVtLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIHJldH1jYXRjaChlKXt9cmV0dXJuIFNpenpsZShleHByLGRvY3VtZW50LG51bGwsW2VsZW1dKS5sZW5ndGg+MH07U2l6emxlLmNvbnRhaW5zPWZ1bmN0aW9uKGNvbnRleHQsCmVsZW0pe2lmKChjb250ZXh0Lm93bmVyRG9jdW1lbnR8fGNvbnRleHQpIT09ZG9jdW1lbnQpc2V0RG9jdW1lbnQoY29udGV4dCk7cmV0dXJuIGNvbnRhaW5zKGNvbnRleHQsZWxlbSl9O1NpenpsZS5hdHRyPWZ1bmN0aW9uKGVsZW0sbmFtZSl7aWYoKGVsZW0ub3duZXJEb2N1bWVudHx8ZWxlbSkhPT1kb2N1bWVudClzZXREb2N1bWVudChlbGVtKTt2YXIgZm49RXhwci5hdHRySGFuZGxlW25hbWUudG9Mb3dlckNhc2UoKV0sdmFsPWZuJiZoYXNPd24uY2FsbChFeHByLmF0dHJIYW5kbGUsbmFtZS50b0xvd2VyQ2FzZSgpKT9mbihlbGVtLG5hbWUsIWRvY3VtZW50SXNIVE1MKTp1bmRlZmluZWQ7cmV0dXJuIHZhbCE9PXVuZGVmaW5lZD92YWw6c3VwcG9ydC5hdHRyaWJ1dGVzfHwhZG9jdW1lbnRJc0hUTUw\/ZWxlbS5nZXRBdHRyaWJ1dGUobmFtZSk6KHZhbD1lbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpJiZ2YWwuc3BlY2lmaWVkP3ZhbC52YWx1ZTpudWxsfTtTaXp6bGUuZXJyb3I9ZnVuY3Rpb24obXNnKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrCm1zZyk7fTtTaXp6bGUudW5pcXVlU29ydD1mdW5jdGlvbihyZXN1bHRzKXt2YXIgZWxlbSxkdXBsaWNhdGVzPVtdLGo9MCxpPTA7aGFzRHVwbGljYXRlPSFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7c29ydElucHV0PSFzdXBwb3J0LnNvcnRTdGFibGUmJnJlc3VsdHMuc2xpY2UoMCk7cmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7aWYoaGFzRHVwbGljYXRlKXt3aGlsZShlbGVtPXJlc3VsdHNbaSsrXSlpZihlbGVtPT09cmVzdWx0c1tpXSlqPWR1cGxpY2F0ZXMucHVzaChpKTt3aGlsZShqLS0pcmVzdWx0cy5zcGxpY2UoZHVwbGljYXRlc1tqXSwxKX1zb3J0SW5wdXQ9bnVsbDtyZXR1cm4gcmVzdWx0c307Z2V0VGV4dD1TaXp6bGUuZ2V0VGV4dD1mdW5jdGlvbihlbGVtKXt2YXIgbm9kZSxyZXQ9IiIsaT0wLG5vZGVUeXBlPWVsZW0ubm9kZVR5cGU7aWYoIW5vZGVUeXBlKXdoaWxlKG5vZGU9ZWxlbVtpKytdKXJldCs9Z2V0VGV4dChub2RlKTtlbHNlIGlmKG5vZGVUeXBlPT09MXx8bm9kZVR5cGU9PT0KOXx8bm9kZVR5cGU9PT0xMSlpZih0eXBlb2YgZWxlbS50ZXh0Q29udGVudD09PSJzdHJpbmciKXJldHVybiBlbGVtLnRleHRDb250ZW50O2Vsc2UgZm9yKGVsZW09ZWxlbS5maXJzdENoaWxkO2VsZW07ZWxlbT1lbGVtLm5leHRTaWJsaW5nKXJldCs9Z2V0VGV4dChlbGVtKTtlbHNlIGlmKG5vZGVUeXBlPT09M3x8bm9kZVR5cGU9PT00KXJldHVybiBlbGVtLm5vZGVWYWx1ZTtyZXR1cm4gcmV0fTtFeHByPVNpenpsZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzptYXJrRnVuY3Rpb24sbWF0Y2g6bWF0Y2hFeHByLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OnRydWV9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6dHJ1ZX0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24obWF0Y2gpe21hdGNoWzFdPQptYXRjaFsxXS5yZXBsYWNlKHJ1bmVzY2FwZSxmdW5lc2NhcGUpO21hdGNoWzNdPShtYXRjaFs0XXx8bWF0Y2hbNV18fCIiKS5yZXBsYWNlKHJ1bmVzY2FwZSxmdW5lc2NhcGUpO2lmKG1hdGNoWzJdPT09In49IiltYXRjaFszXT0iICIrbWF0Y2hbM10rIiAiO3JldHVybiBtYXRjaC5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihtYXRjaCl7bWF0Y2hbMV09bWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtpZihtYXRjaFsxXS5zbGljZSgwLDMpPT09Im50aCIpe2lmKCFtYXRjaFszXSlTaXp6bGUuZXJyb3IobWF0Y2hbMF0pO21hdGNoWzRdPSsobWF0Y2hbNF0\/bWF0Y2hbNV0rKG1hdGNoWzZdfHwxKToyKihtYXRjaFszXT09PSJldmVuInx8bWF0Y2hbM109PT0ib2RkIikpO21hdGNoWzVdPSsobWF0Y2hbN10rbWF0Y2hbOF18fG1hdGNoWzNdPT09Im9kZCIpfWVsc2UgaWYobWF0Y2hbM10pU2l6emxlLmVycm9yKG1hdGNoWzBdKTtyZXR1cm4gbWF0Y2h9LFBTRVVETzpmdW5jdGlvbihtYXRjaCl7dmFyIGV4Y2VzcywKdW5xdW90ZWQ9IW1hdGNoWzVdJiZtYXRjaFsyXTtpZihtYXRjaEV4cHJbIkNISUxEIl0udGVzdChtYXRjaFswXSkpcmV0dXJuIG51bGw7aWYobWF0Y2hbM10mJm1hdGNoWzRdIT09dW5kZWZpbmVkKW1hdGNoWzJdPW1hdGNoWzRdO2Vsc2UgaWYodW5xdW90ZWQmJnJwc2V1ZG8udGVzdCh1bnF1b3RlZCkmJihleGNlc3M9dG9rZW5pemUodW5xdW90ZWQsdHJ1ZSkpJiYoZXhjZXNzPXVucXVvdGVkLmluZGV4T2YoIikiLHVucXVvdGVkLmxlbmd0aC1leGNlc3MpLXVucXVvdGVkLmxlbmd0aCkpe21hdGNoWzBdPW1hdGNoWzBdLnNsaWNlKDAsZXhjZXNzKTttYXRjaFsyXT11bnF1b3RlZC5zbGljZSgwLGV4Y2Vzcyl9cmV0dXJuIG1hdGNoLnNsaWNlKDAsMyl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihub2RlTmFtZVNlbGVjdG9yKXt2YXIgbm9kZU5hbWU9bm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKHJ1bmVzY2FwZSxmdW5lc2NhcGUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3I9PT0KIioiP2Z1bmN0aW9uKCl7cmV0dXJuIHRydWV9OmZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLm5vZGVOYW1lJiZlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ub2RlTmFtZX19LENMQVNTOmZ1bmN0aW9uKGNsYXNzTmFtZSl7dmFyIHBhdHRlcm49Y2xhc3NDYWNoZVtjbGFzc05hbWUrIiAiXTtyZXR1cm4gcGF0dGVybnx8KHBhdHRlcm49bmV3IFJlZ0V4cCgiKF58Iit3aGl0ZXNwYWNlKyIpIitjbGFzc05hbWUrIigiK3doaXRlc3BhY2UrInwkKSIpKSYmY2xhc3NDYWNoZShjbGFzc05hbWUsZnVuY3Rpb24oZWxlbSl7cmV0dXJuIHBhdHRlcm4udGVzdCh0eXBlb2YgZWxlbS5jbGFzc05hbWU9PT0ic3RyaW5nIiYmZWxlbS5jbGFzc05hbWV8fHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSE9PXN0cnVuZGVmaW5lZCYmZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKG5hbWUsb3BlcmF0b3IsY2hlY2spe3JldHVybiBmdW5jdGlvbihlbGVtKXt2YXIgcmVzdWx0PQpTaXp6bGUuYXR0cihlbGVtLG5hbWUpO2lmKHJlc3VsdD09bnVsbClyZXR1cm4gb3BlcmF0b3I9PT0iIT0iO2lmKCFvcGVyYXRvcilyZXR1cm4gdHJ1ZTtyZXN1bHQrPSIiO3JldHVybiBvcGVyYXRvcj09PSI9Ij9yZXN1bHQ9PT1jaGVjazpvcGVyYXRvcj09PSIhPSI\/cmVzdWx0IT09Y2hlY2s6b3BlcmF0b3I9PT0iXj0iP2NoZWNrJiZyZXN1bHQuaW5kZXhPZihjaGVjayk9PT0wOm9wZXJhdG9yPT09Iio9Ij9jaGVjayYmcmVzdWx0LmluZGV4T2YoY2hlY2spPi0xOm9wZXJhdG9yPT09IiQ9Ij9jaGVjayYmcmVzdWx0LnNsaWNlKC1jaGVjay5sZW5ndGgpPT09Y2hlY2s6b3BlcmF0b3I9PT0ifj0iPygiICIrcmVzdWx0KyIgIikuaW5kZXhPZihjaGVjayk+LTE6b3BlcmF0b3I9PT0ifD0iP3Jlc3VsdD09PWNoZWNrfHxyZXN1bHQuc2xpY2UoMCxjaGVjay5sZW5ndGgrMSk9PT1jaGVjaysiLSI6ZmFsc2V9fSxDSElMRDpmdW5jdGlvbih0eXBlLHdoYXQsYXJndW1lbnQsZmlyc3QsbGFzdCl7dmFyIHNpbXBsZT0KdHlwZS5zbGljZSgwLDMpIT09Im50aCIsZm9yd2FyZD10eXBlLnNsaWNlKC00KSE9PSJsYXN0IixvZlR5cGU9d2hhdD09PSJvZi10eXBlIjtyZXR1cm4gZmlyc3Q9PT0xJiZsYXN0PT09MD9mdW5jdGlvbihlbGVtKXtyZXR1cm4hIWVsZW0ucGFyZW50Tm9kZX06ZnVuY3Rpb24oZWxlbSxjb250ZXh0LHhtbCl7dmFyIGNhY2hlLG91dGVyQ2FjaGUsbm9kZSxkaWZmLG5vZGVJbmRleCxzdGFydCxkaXI9c2ltcGxlIT09Zm9yd2FyZD8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHBhcmVudD1lbGVtLnBhcmVudE5vZGUsbmFtZT1vZlR5cGUmJmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx1c2VDYWNoZT0heG1sJiYhb2ZUeXBlO2lmKHBhcmVudCl7aWYoc2ltcGxlKXt3aGlsZShkaXIpe25vZGU9ZWxlbTt3aGlsZShub2RlPW5vZGVbZGlyXSlpZihvZlR5cGU\/bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09bmFtZTpub2RlLm5vZGVUeXBlPT09MSlyZXR1cm4gZmFsc2U7CnN0YXJ0PWRpcj10eXBlPT09Im9ubHkiJiYhc3RhcnQmJiJuZXh0U2libGluZyJ9cmV0dXJuIHRydWV9c3RhcnQ9W2ZvcndhcmQ\/cGFyZW50LmZpcnN0Q2hpbGQ6cGFyZW50Lmxhc3RDaGlsZF07aWYoZm9yd2FyZCYmdXNlQ2FjaGUpe291dGVyQ2FjaGU9cGFyZW50W2V4cGFuZG9dfHwocGFyZW50W2V4cGFuZG9dPXt9KTtjYWNoZT1vdXRlckNhY2hlW3R5cGVdfHxbXTtub2RlSW5kZXg9Y2FjaGVbMF09PT1kaXJydW5zJiZjYWNoZVsxXTtkaWZmPWNhY2hlWzBdPT09ZGlycnVucyYmY2FjaGVbMl07bm9kZT1ub2RlSW5kZXgmJnBhcmVudC5jaGlsZE5vZGVzW25vZGVJbmRleF07d2hpbGUobm9kZT0rK25vZGVJbmRleCYmbm9kZSYmbm9kZVtkaXJdfHwoZGlmZj1ub2RlSW5kZXg9MCl8fHN0YXJ0LnBvcCgpKWlmKG5vZGUubm9kZVR5cGU9PT0xJiYrK2RpZmYmJm5vZGU9PT1lbGVtKXtvdXRlckNhY2hlW3R5cGVdPVtkaXJydW5zLG5vZGVJbmRleCxkaWZmXTticmVha319ZWxzZSBpZih1c2VDYWNoZSYmCihjYWNoZT0oZWxlbVtleHBhbmRvXXx8KGVsZW1bZXhwYW5kb109e30pKVt0eXBlXSkmJmNhY2hlWzBdPT09ZGlycnVucylkaWZmPWNhY2hlWzFdO2Vsc2Ugd2hpbGUobm9kZT0rK25vZGVJbmRleCYmbm9kZSYmbm9kZVtkaXJdfHwoZGlmZj1ub2RlSW5kZXg9MCl8fHN0YXJ0LnBvcCgpKWlmKChvZlR5cGU\/bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09bmFtZTpub2RlLm5vZGVUeXBlPT09MSkmJisrZGlmZil7aWYodXNlQ2FjaGUpKG5vZGVbZXhwYW5kb118fChub2RlW2V4cGFuZG9dPXt9KSlbdHlwZV09W2RpcnJ1bnMsZGlmZl07aWYobm9kZT09PWVsZW0pYnJlYWt9ZGlmZi09bGFzdDtyZXR1cm4gZGlmZj09PWZpcnN0fHxkaWZmJWZpcnN0PT09MCYmZGlmZi9maXJzdD49MH19fSxQU0VVRE86ZnVuY3Rpb24ocHNldWRvLGFyZ3VtZW50KXt2YXIgYXJncyxmbj1FeHByLnBzZXVkb3NbcHNldWRvXXx8RXhwci5zZXRGaWx0ZXJzW3BzZXVkby50b0xvd2VyQ2FzZSgpXXx8U2l6emxlLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrCnBzZXVkbyk7aWYoZm5bZXhwYW5kb10pcmV0dXJuIGZuKGFyZ3VtZW50KTtpZihmbi5sZW5ndGg+MSl7YXJncz1bcHNldWRvLHBzZXVkbywiIixhcmd1bWVudF07cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShwc2V1ZG8udG9Mb3dlckNhc2UoKSk\/bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKHNlZWQsbWF0Y2hlcyl7dmFyIGlkeCxtYXRjaGVkPWZuKHNlZWQsYXJndW1lbnQpLGk9bWF0Y2hlZC5sZW5ndGg7d2hpbGUoaS0tKXtpZHg9aW5kZXhPZi5jYWxsKHNlZWQsbWF0Y2hlZFtpXSk7c2VlZFtpZHhdPSEobWF0Y2hlc1tpZHhdPW1hdGNoZWRbaV0pfX0pOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBmbihlbGVtLDAsYXJncyl9fXJldHVybiBmbn19LHBzZXVkb3M6e25vdDptYXJrRnVuY3Rpb24oZnVuY3Rpb24oc2VsZWN0b3Ipe3ZhciBpbnB1dD1bXSxyZXN1bHRzPVtdLG1hdGNoZXI9Y29tcGlsZShzZWxlY3Rvci5yZXBsYWNlKHJ0cmltLCIkMSIpKTtyZXR1cm4gbWF0Y2hlcltleHBhbmRvXT8KbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKHNlZWQsbWF0Y2hlcyxjb250ZXh0LHhtbCl7dmFyIGVsZW0sdW5tYXRjaGVkPW1hdGNoZXIoc2VlZCxudWxsLHhtbCxbXSksaT1zZWVkLmxlbmd0aDt3aGlsZShpLS0paWYoZWxlbT11bm1hdGNoZWRbaV0pc2VlZFtpXT0hKG1hdGNoZXNbaV09ZWxlbSl9KTpmdW5jdGlvbihlbGVtLGNvbnRleHQseG1sKXtpbnB1dFswXT1lbGVtO21hdGNoZXIoaW5wdXQsbnVsbCx4bWwscmVzdWx0cyk7cmV0dXJuIXJlc3VsdHMucG9wKCl9fSksaGFzOm1hcmtGdW5jdGlvbihmdW5jdGlvbihzZWxlY3Rvcil7cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe3JldHVybiBTaXp6bGUoc2VsZWN0b3IsZWxlbSkubGVuZ3RoPjB9fSksY29udGFpbnM6bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKHRleHQpe3JldHVybiBmdW5jdGlvbihlbGVtKXtyZXR1cm4oZWxlbS50ZXh0Q29udGVudHx8ZWxlbS5pbm5lclRleHR8fGdldFRleHQoZWxlbSkpLmluZGV4T2YodGV4dCk+LTF9fSksbGFuZzptYXJrRnVuY3Rpb24oZnVuY3Rpb24obGFuZyl7aWYoIXJpZGVudGlmaWVyLnRlc3QobGFuZ3x8CiIiKSlTaXp6bGUuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrbGFuZyk7bGFuZz1sYW5nLnJlcGxhY2UocnVuZXNjYXBlLGZ1bmVzY2FwZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7dmFyIGVsZW1MYW5nO2RvIGlmKGVsZW1MYW5nPWRvY3VtZW50SXNIVE1MP2VsZW0ubGFuZzplbGVtLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSl7ZWxlbUxhbmc9ZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtyZXR1cm4gZWxlbUxhbmc9PT1sYW5nfHxlbGVtTGFuZy5pbmRleE9mKGxhbmcrIi0iKT09PTB9d2hpbGUoKGVsZW09ZWxlbS5wYXJlbnROb2RlKSYmZWxlbS5ub2RlVHlwZT09PTEpO3JldHVybiBmYWxzZX19KSx0YXJnZXQ6ZnVuY3Rpb24oZWxlbSl7dmFyIGhhc2g9d2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaGFzaDtyZXR1cm4gaGFzaCYmaGFzaC5zbGljZSgxKT09PWVsZW0uaWR9LHJvb3Q6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW09PT0KZG9jRWxlbX0sZm9jdXM6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW09PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50JiYoIWRvY3VtZW50Lmhhc0ZvY3VzfHxkb2N1bWVudC5oYXNGb2N1cygpKSYmISEoZWxlbS50eXBlfHxlbGVtLmhyZWZ8fH5lbGVtLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5kaXNhYmxlZD09PWZhbHNlfSxkaXNhYmxlZDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5kaXNhYmxlZD09PXRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oZWxlbSl7dmFyIG5vZGVOYW1lPWVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gbm9kZU5hbWU9PT0iaW5wdXQiJiYhIWVsZW0uY2hlY2tlZHx8bm9kZU5hbWU9PT0ib3B0aW9uIiYmISFlbGVtLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlbGVtKXtpZihlbGVtLnBhcmVudE5vZGUpZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGVsZW0uc2VsZWN0ZWQ9PT10cnVlfSwKZW1wdHk6ZnVuY3Rpb24oZWxlbSl7Zm9yKGVsZW09ZWxlbS5maXJzdENoaWxkO2VsZW07ZWxlbT1lbGVtLm5leHRTaWJsaW5nKWlmKGVsZW0ubm9kZVR5cGU8NilyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9LHBhcmVudDpmdW5jdGlvbihlbGVtKXtyZXR1cm4hRXhwci5wc2V1ZG9zWyJlbXB0eSJdKGVsZW0pfSxoZWFkZXI6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIHJoZWFkZXIudGVzdChlbGVtLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIHJpbnB1dHMudGVzdChlbGVtLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGVsZW0pe3ZhciBuYW1lPWVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gbmFtZT09PSJpbnB1dCImJmVsZW0udHlwZT09PSJidXR0b24ifHxuYW1lPT09ImJ1dHRvbiJ9LHRleHQ6ZnVuY3Rpb24oZWxlbSl7dmFyIGF0dHI7cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJmVsZW0udHlwZT09PSJ0ZXh0IiYmCigoYXR0cj1lbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpKT09bnVsbHx8YXR0ci50b0xvd2VyQ2FzZSgpPT09InRleHQiKX0sZmlyc3Q6Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbihtYXRjaEluZGV4ZXMsbGVuZ3RoKXtyZXR1cm5bbGVuZ3RoLTFdfSksZXE6Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbihtYXRjaEluZGV4ZXMsbGVuZ3RoLGFyZ3VtZW50KXtyZXR1cm5bYXJndW1lbnQ8MD9hcmd1bWVudCtsZW5ndGg6YXJndW1lbnRdfSksZXZlbjpjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKG1hdGNoSW5kZXhlcyxsZW5ndGgpe3ZhciBpPTA7Zm9yKDtpPGxlbmd0aDtpKz0yKW1hdGNoSW5kZXhlcy5wdXNoKGkpO3JldHVybiBtYXRjaEluZGV4ZXN9KSxvZGQ6Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbihtYXRjaEluZGV4ZXMsbGVuZ3RoKXt2YXIgaT0KMTtmb3IoO2k8bGVuZ3RoO2krPTIpbWF0Y2hJbmRleGVzLnB1c2goaSk7cmV0dXJuIG1hdGNoSW5kZXhlc30pLGx0OmNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24obWF0Y2hJbmRleGVzLGxlbmd0aCxhcmd1bWVudCl7dmFyIGk9YXJndW1lbnQ8MD9hcmd1bWVudCtsZW5ndGg6YXJndW1lbnQ7Zm9yKDstLWk+PTA7KW1hdGNoSW5kZXhlcy5wdXNoKGkpO3JldHVybiBtYXRjaEluZGV4ZXN9KSxndDpjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKG1hdGNoSW5kZXhlcyxsZW5ndGgsYXJndW1lbnQpe3ZhciBpPWFyZ3VtZW50PDA\/YXJndW1lbnQrbGVuZ3RoOmFyZ3VtZW50O2Zvcig7KytpPGxlbmd0aDspbWF0Y2hJbmRleGVzLnB1c2goaSk7cmV0dXJuIG1hdGNoSW5kZXhlc30pfX07RXhwci5wc2V1ZG9zWyJudGgiXT1FeHByLnBzZXVkb3NbImVxIl07Zm9yKGkgaW57cmFkaW86dHJ1ZSxjaGVja2JveDp0cnVlLGZpbGU6dHJ1ZSxwYXNzd29yZDp0cnVlLGltYWdlOnRydWV9KUV4cHIucHNldWRvc1tpXT0KY3JlYXRlSW5wdXRQc2V1ZG8oaSk7Zm9yKGkgaW57c3VibWl0OnRydWUscmVzZXQ6dHJ1ZX0pRXhwci5wc2V1ZG9zW2ldPWNyZWF0ZUJ1dHRvblBzZXVkbyhpKTtmdW5jdGlvbiBzZXRGaWx0ZXJzKCl7fXNldEZpbHRlcnMucHJvdG90eXBlPUV4cHIuZmlsdGVycz1FeHByLnBzZXVkb3M7RXhwci5zZXRGaWx0ZXJzPW5ldyBzZXRGaWx0ZXJzO2Z1bmN0aW9uIHRva2VuaXplKHNlbGVjdG9yLHBhcnNlT25seSl7dmFyIG1hdGNoZWQsbWF0Y2gsdG9rZW5zLHR5cGUsc29GYXIsZ3JvdXBzLHByZUZpbHRlcnMsY2FjaGVkPXRva2VuQ2FjaGVbc2VsZWN0b3IrIiAiXTtpZihjYWNoZWQpcmV0dXJuIHBhcnNlT25seT8wOmNhY2hlZC5zbGljZSgwKTtzb0Zhcj1zZWxlY3Rvcjtncm91cHM9W107cHJlRmlsdGVycz1FeHByLnByZUZpbHRlcjt3aGlsZShzb0Zhcil7aWYoIW1hdGNoZWR8fChtYXRjaD1yY29tbWEuZXhlYyhzb0ZhcikpKXtpZihtYXRjaClzb0Zhcj1zb0Zhci5zbGljZShtYXRjaFswXS5sZW5ndGgpfHwKc29GYXI7Z3JvdXBzLnB1c2godG9rZW5zPVtdKX1tYXRjaGVkPWZhbHNlO2lmKG1hdGNoPXJjb21iaW5hdG9ycy5leGVjKHNvRmFyKSl7bWF0Y2hlZD1tYXRjaC5zaGlmdCgpO3Rva2Vucy5wdXNoKHt2YWx1ZTptYXRjaGVkLHR5cGU6bWF0Y2hbMF0ucmVwbGFjZShydHJpbSwiICIpfSk7c29GYXI9c29GYXIuc2xpY2UobWF0Y2hlZC5sZW5ndGgpfWZvcih0eXBlIGluIEV4cHIuZmlsdGVyKWlmKChtYXRjaD1tYXRjaEV4cHJbdHlwZV0uZXhlYyhzb0ZhcikpJiYoIXByZUZpbHRlcnNbdHlwZV18fChtYXRjaD1wcmVGaWx0ZXJzW3R5cGVdKG1hdGNoKSkpKXttYXRjaGVkPW1hdGNoLnNoaWZ0KCk7dG9rZW5zLnB1c2goe3ZhbHVlOm1hdGNoZWQsdHlwZTp0eXBlLG1hdGNoZXM6bWF0Y2h9KTtzb0Zhcj1zb0Zhci5zbGljZShtYXRjaGVkLmxlbmd0aCl9aWYoIW1hdGNoZWQpYnJlYWt9cmV0dXJuIHBhcnNlT25seT9zb0Zhci5sZW5ndGg6c29GYXI\/U2l6emxlLmVycm9yKHNlbGVjdG9yKTp0b2tlbkNhY2hlKHNlbGVjdG9yLApncm91cHMpLnNsaWNlKDApfWZ1bmN0aW9uIHRvU2VsZWN0b3IodG9rZW5zKXt2YXIgaT0wLGxlbj10b2tlbnMubGVuZ3RoLHNlbGVjdG9yPSIiO2Zvcig7aTxsZW47aSsrKXNlbGVjdG9yKz10b2tlbnNbaV0udmFsdWU7cmV0dXJuIHNlbGVjdG9yfWZ1bmN0aW9uIGFkZENvbWJpbmF0b3IobWF0Y2hlcixjb21iaW5hdG9yLGJhc2Upe3ZhciBkaXI9Y29tYmluYXRvci5kaXIsY2hlY2tOb25FbGVtZW50cz1iYXNlJiZkaXI9PT0icGFyZW50Tm9kZSIsZG9uZU5hbWU9ZG9uZSsrO3JldHVybiBjb21iaW5hdG9yLmZpcnN0P2Z1bmN0aW9uKGVsZW0sY29udGV4dCx4bWwpe3doaWxlKGVsZW09ZWxlbVtkaXJdKWlmKGVsZW0ubm9kZVR5cGU9PT0xfHxjaGVja05vbkVsZW1lbnRzKXJldHVybiBtYXRjaGVyKGVsZW0sY29udGV4dCx4bWwpfTpmdW5jdGlvbihlbGVtLGNvbnRleHQseG1sKXt2YXIgb2xkQ2FjaGUsb3V0ZXJDYWNoZSxuZXdDYWNoZT1bZGlycnVucyxkb25lTmFtZV07aWYoeG1sKXdoaWxlKGVsZW09CmVsZW1bZGlyXSl7aWYoZWxlbS5ub2RlVHlwZT09PTF8fGNoZWNrTm9uRWxlbWVudHMpaWYobWF0Y2hlcihlbGVtLGNvbnRleHQseG1sKSlyZXR1cm4gdHJ1ZX1lbHNlIHdoaWxlKGVsZW09ZWxlbVtkaXJdKWlmKGVsZW0ubm9kZVR5cGU9PT0xfHxjaGVja05vbkVsZW1lbnRzKXtvdXRlckNhY2hlPWVsZW1bZXhwYW5kb118fChlbGVtW2V4cGFuZG9dPXt9KTtpZigob2xkQ2FjaGU9b3V0ZXJDYWNoZVtkaXJdKSYmb2xkQ2FjaGVbMF09PT1kaXJydW5zJiZvbGRDYWNoZVsxXT09PWRvbmVOYW1lKXJldHVybiBuZXdDYWNoZVsyXT1vbGRDYWNoZVsyXTtlbHNle291dGVyQ2FjaGVbZGlyXT1uZXdDYWNoZTtpZihuZXdDYWNoZVsyXT1tYXRjaGVyKGVsZW0sY29udGV4dCx4bWwpKXJldHVybiB0cnVlfX19fWZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKG1hdGNoZXJzKXtyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoPjE\/ZnVuY3Rpb24oZWxlbSxjb250ZXh0LHhtbCl7dmFyIGk9bWF0Y2hlcnMubGVuZ3RoOwp3aGlsZShpLS0paWYoIW1hdGNoZXJzW2ldKGVsZW0sY29udGV4dCx4bWwpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX06bWF0Y2hlcnNbMF19ZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyhzZWxlY3Rvcixjb250ZXh0cyxyZXN1bHRzKXt2YXIgaT0wLGxlbj1jb250ZXh0cy5sZW5ndGg7Zm9yKDtpPGxlbjtpKyspU2l6emxlKHNlbGVjdG9yLGNvbnRleHRzW2ldLHJlc3VsdHMpO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIGNvbmRlbnNlKHVubWF0Y2hlZCxtYXAsZmlsdGVyLGNvbnRleHQseG1sKXt2YXIgZWxlbSxuZXdVbm1hdGNoZWQ9W10saT0wLGxlbj11bm1hdGNoZWQubGVuZ3RoLG1hcHBlZD1tYXAhPW51bGw7Zm9yKDtpPGxlbjtpKyspaWYoZWxlbT11bm1hdGNoZWRbaV0paWYoIWZpbHRlcnx8ZmlsdGVyKGVsZW0sY29udGV4dCx4bWwpKXtuZXdVbm1hdGNoZWQucHVzaChlbGVtKTtpZihtYXBwZWQpbWFwLnB1c2goaSl9cmV0dXJuIG5ld1VubWF0Y2hlZH1mdW5jdGlvbiBzZXRNYXRjaGVyKHByZUZpbHRlciwKc2VsZWN0b3IsbWF0Y2hlcixwb3N0RmlsdGVyLHBvc3RGaW5kZXIscG9zdFNlbGVjdG9yKXtpZihwb3N0RmlsdGVyJiYhcG9zdEZpbHRlcltleHBhbmRvXSlwb3N0RmlsdGVyPXNldE1hdGNoZXIocG9zdEZpbHRlcik7aWYocG9zdEZpbmRlciYmIXBvc3RGaW5kZXJbZXhwYW5kb10pcG9zdEZpbmRlcj1zZXRNYXRjaGVyKHBvc3RGaW5kZXIscG9zdFNlbGVjdG9yKTtyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKHNlZWQscmVzdWx0cyxjb250ZXh0LHhtbCl7dmFyIHRlbXAsaSxlbGVtLHByZU1hcD1bXSxwb3N0TWFwPVtdLHByZWV4aXN0aW5nPXJlc3VsdHMubGVuZ3RoLGVsZW1zPXNlZWR8fG11bHRpcGxlQ29udGV4dHMoc2VsZWN0b3J8fCIqIixjb250ZXh0Lm5vZGVUeXBlP1tjb250ZXh0XTpjb250ZXh0LFtdKSxtYXRjaGVySW49cHJlRmlsdGVyJiYoc2VlZHx8IXNlbGVjdG9yKT9jb25kZW5zZShlbGVtcyxwcmVNYXAscHJlRmlsdGVyLGNvbnRleHQseG1sKTplbGVtcyxtYXRjaGVyT3V0PQptYXRjaGVyP3Bvc3RGaW5kZXJ8fChzZWVkP3ByZUZpbHRlcjpwcmVleGlzdGluZ3x8cG9zdEZpbHRlcik\/W106cmVzdWx0czptYXRjaGVySW47aWYobWF0Y2hlciltYXRjaGVyKG1hdGNoZXJJbixtYXRjaGVyT3V0LGNvbnRleHQseG1sKTtpZihwb3N0RmlsdGVyKXt0ZW1wPWNvbmRlbnNlKG1hdGNoZXJPdXQscG9zdE1hcCk7cG9zdEZpbHRlcih0ZW1wLFtdLGNvbnRleHQseG1sKTtpPXRlbXAubGVuZ3RoO3doaWxlKGktLSlpZihlbGVtPXRlbXBbaV0pbWF0Y2hlck91dFtwb3N0TWFwW2ldXT0hKG1hdGNoZXJJbltwb3N0TWFwW2ldXT1lbGVtKX1pZihzZWVkKXtpZihwb3N0RmluZGVyfHxwcmVGaWx0ZXIpe2lmKHBvc3RGaW5kZXIpe3RlbXA9W107aT1tYXRjaGVyT3V0Lmxlbmd0aDt3aGlsZShpLS0paWYoZWxlbT1tYXRjaGVyT3V0W2ldKXRlbXAucHVzaChtYXRjaGVySW5baV09ZWxlbSk7cG9zdEZpbmRlcihudWxsLG1hdGNoZXJPdXQ9W10sdGVtcCx4bWwpfWk9bWF0Y2hlck91dC5sZW5ndGg7CndoaWxlKGktLSlpZigoZWxlbT1tYXRjaGVyT3V0W2ldKSYmKHRlbXA9cG9zdEZpbmRlcj9pbmRleE9mLmNhbGwoc2VlZCxlbGVtKTpwcmVNYXBbaV0pPi0xKXNlZWRbdGVtcF09IShyZXN1bHRzW3RlbXBdPWVsZW0pfX1lbHNle21hdGNoZXJPdXQ9Y29uZGVuc2UobWF0Y2hlck91dD09PXJlc3VsdHM\/bWF0Y2hlck91dC5zcGxpY2UocHJlZXhpc3RpbmcsbWF0Y2hlck91dC5sZW5ndGgpOm1hdGNoZXJPdXQpO2lmKHBvc3RGaW5kZXIpcG9zdEZpbmRlcihudWxsLHJlc3VsdHMsbWF0Y2hlck91dCx4bWwpO2Vsc2UgcHVzaC5hcHBseShyZXN1bHRzLG1hdGNoZXJPdXQpfX0pfWZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKHRva2Vucyl7dmFyIGNoZWNrQ29udGV4dCxtYXRjaGVyLGosbGVuPXRva2Vucy5sZW5ndGgsbGVhZGluZ1JlbGF0aXZlPUV4cHIucmVsYXRpdmVbdG9rZW5zWzBdLnR5cGVdLGltcGxpY2l0UmVsYXRpdmU9bGVhZGluZ1JlbGF0aXZlfHxFeHByLnJlbGF0aXZlWyIgIl0sCmk9bGVhZGluZ1JlbGF0aXZlPzE6MCxtYXRjaENvbnRleHQ9YWRkQ29tYmluYXRvcihmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbT09PWNoZWNrQ29udGV4dH0saW1wbGljaXRSZWxhdGl2ZSx0cnVlKSxtYXRjaEFueUNvbnRleHQ9YWRkQ29tYmluYXRvcihmdW5jdGlvbihlbGVtKXtyZXR1cm4gaW5kZXhPZi5jYWxsKGNoZWNrQ29udGV4dCxlbGVtKT4tMX0saW1wbGljaXRSZWxhdGl2ZSx0cnVlKSxtYXRjaGVycz1bZnVuY3Rpb24oZWxlbSxjb250ZXh0LHhtbCl7cmV0dXJuIWxlYWRpbmdSZWxhdGl2ZSYmKHhtbHx8Y29udGV4dCE9PW91dGVybW9zdENvbnRleHQpfHwoKGNoZWNrQ29udGV4dD1jb250ZXh0KS5ub2RlVHlwZT9tYXRjaENvbnRleHQoZWxlbSxjb250ZXh0LHhtbCk6bWF0Y2hBbnlDb250ZXh0KGVsZW0sY29udGV4dCx4bWwpKX1dO2Zvcig7aTxsZW47aSsrKWlmKG1hdGNoZXI9RXhwci5yZWxhdGl2ZVt0b2tlbnNbaV0udHlwZV0pbWF0Y2hlcnM9W2FkZENvbWJpbmF0b3IoZWxlbWVudE1hdGNoZXIobWF0Y2hlcnMpLAptYXRjaGVyKV07ZWxzZXttYXRjaGVyPUV4cHIuZmlsdGVyW3Rva2Vuc1tpXS50eXBlXS5hcHBseShudWxsLHRva2Vuc1tpXS5tYXRjaGVzKTtpZihtYXRjaGVyW2V4cGFuZG9dKXtqPSsraTtmb3IoO2o8bGVuO2orKylpZihFeHByLnJlbGF0aXZlW3Rva2Vuc1tqXS50eXBlXSlicmVhaztyZXR1cm4gc2V0TWF0Y2hlcihpPjEmJmVsZW1lbnRNYXRjaGVyKG1hdGNoZXJzKSxpPjEmJnRvU2VsZWN0b3IodG9rZW5zLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOnRva2Vuc1tpLTJdLnR5cGU9PT0iICI\/IioiOiIifSkpLnJlcGxhY2UocnRyaW0sIiQxIiksbWF0Y2hlcixpPGomJm1hdGNoZXJGcm9tVG9rZW5zKHRva2Vucy5zbGljZShpLGopKSxqPGxlbiYmbWF0Y2hlckZyb21Ub2tlbnModG9rZW5zPXRva2Vucy5zbGljZShqKSksajxsZW4mJnRvU2VsZWN0b3IodG9rZW5zKSl9bWF0Y2hlcnMucHVzaChtYXRjaGVyKX1yZXR1cm4gZWxlbWVudE1hdGNoZXIobWF0Y2hlcnMpfWZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyhlbGVtZW50TWF0Y2hlcnMsCnNldE1hdGNoZXJzKXt2YXIgYnlTZXQ9c2V0TWF0Y2hlcnMubGVuZ3RoPjAsYnlFbGVtZW50PWVsZW1lbnRNYXRjaGVycy5sZW5ndGg+MCxzdXBlck1hdGNoZXI9ZnVuY3Rpb24oc2VlZCxjb250ZXh0LHhtbCxyZXN1bHRzLG91dGVybW9zdCl7dmFyIGVsZW0saixtYXRjaGVyLG1hdGNoZWRDb3VudD0wLGk9IjAiLHVubWF0Y2hlZD1zZWVkJiZbXSxzZXRNYXRjaGVkPVtdLGNvbnRleHRCYWNrdXA9b3V0ZXJtb3N0Q29udGV4dCxlbGVtcz1zZWVkfHxieUVsZW1lbnQmJkV4cHIuZmluZFsiVEFHIl0oIioiLG91dGVybW9zdCksZGlycnVuc1VuaXF1ZT1kaXJydW5zKz1jb250ZXh0QmFja3VwPT1udWxsPzE6TWF0aC5yYW5kb20oKXx8MC4xLGxlbj1lbGVtcy5sZW5ndGg7aWYob3V0ZXJtb3N0KW91dGVybW9zdENvbnRleHQ9Y29udGV4dCE9PWRvY3VtZW50JiZjb250ZXh0O2Zvcig7aSE9PWxlbiYmKGVsZW09ZWxlbXNbaV0pIT1udWxsO2krKyl7aWYoYnlFbGVtZW50JiZlbGVtKXtqPTA7d2hpbGUobWF0Y2hlcj0KZWxlbWVudE1hdGNoZXJzW2orK10paWYobWF0Y2hlcihlbGVtLGNvbnRleHQseG1sKSl7cmVzdWx0cy5wdXNoKGVsZW0pO2JyZWFrfWlmKG91dGVybW9zdClkaXJydW5zPWRpcnJ1bnNVbmlxdWV9aWYoYnlTZXQpe2lmKGVsZW09IW1hdGNoZXImJmVsZW0pbWF0Y2hlZENvdW50LS07aWYoc2VlZCl1bm1hdGNoZWQucHVzaChlbGVtKX19bWF0Y2hlZENvdW50Kz1pO2lmKGJ5U2V0JiZpIT09bWF0Y2hlZENvdW50KXtqPTA7d2hpbGUobWF0Y2hlcj1zZXRNYXRjaGVyc1tqKytdKW1hdGNoZXIodW5tYXRjaGVkLHNldE1hdGNoZWQsY29udGV4dCx4bWwpO2lmKHNlZWQpe2lmKG1hdGNoZWRDb3VudD4wKXdoaWxlKGktLSlpZighKHVubWF0Y2hlZFtpXXx8c2V0TWF0Y2hlZFtpXSkpc2V0TWF0Y2hlZFtpXT1wb3AuY2FsbChyZXN1bHRzKTtzZXRNYXRjaGVkPWNvbmRlbnNlKHNldE1hdGNoZWQpfXB1c2guYXBwbHkocmVzdWx0cyxzZXRNYXRjaGVkKTtpZihvdXRlcm1vc3QmJiFzZWVkJiZzZXRNYXRjaGVkLmxlbmd0aD4KMCYmbWF0Y2hlZENvdW50K3NldE1hdGNoZXJzLmxlbmd0aD4xKVNpenpsZS51bmlxdWVTb3J0KHJlc3VsdHMpfWlmKG91dGVybW9zdCl7ZGlycnVucz1kaXJydW5zVW5pcXVlO291dGVybW9zdENvbnRleHQ9Y29udGV4dEJhY2t1cH1yZXR1cm4gdW5tYXRjaGVkfTtyZXR1cm4gYnlTZXQ\/bWFya0Z1bmN0aW9uKHN1cGVyTWF0Y2hlcik6c3VwZXJNYXRjaGVyfWNvbXBpbGU9U2l6emxlLmNvbXBpbGU9ZnVuY3Rpb24oc2VsZWN0b3IsbWF0Y2gpe3ZhciBpLHNldE1hdGNoZXJzPVtdLGVsZW1lbnRNYXRjaGVycz1bXSxjYWNoZWQ9Y29tcGlsZXJDYWNoZVtzZWxlY3RvcisiICJdO2lmKCFjYWNoZWQpe2lmKCFtYXRjaCltYXRjaD10b2tlbml6ZShzZWxlY3Rvcik7aT1tYXRjaC5sZW5ndGg7d2hpbGUoaS0tKXtjYWNoZWQ9bWF0Y2hlckZyb21Ub2tlbnMobWF0Y2hbaV0pO2lmKGNhY2hlZFtleHBhbmRvXSlzZXRNYXRjaGVycy5wdXNoKGNhY2hlZCk7ZWxzZSBlbGVtZW50TWF0Y2hlcnMucHVzaChjYWNoZWQpfWNhY2hlZD0KY29tcGlsZXJDYWNoZShzZWxlY3RvcixtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoZWxlbWVudE1hdGNoZXJzLHNldE1hdGNoZXJzKSk7Y2FjaGVkLnNlbGVjdG9yPXNlbGVjdG9yfXJldHVybiBjYWNoZWR9O3NlbGVjdD1TaXp6bGUuc2VsZWN0PWZ1bmN0aW9uKHNlbGVjdG9yLGNvbnRleHQscmVzdWx0cyxzZWVkKXt2YXIgaSx0b2tlbnMsdG9rZW4sdHlwZSxmaW5kLGNvbXBpbGVkPXR5cGVvZiBzZWxlY3Rvcj09PSJmdW5jdGlvbiImJnNlbGVjdG9yLG1hdGNoPSFzZWVkJiZ0b2tlbml6ZShzZWxlY3Rvcj1jb21waWxlZC5zZWxlY3Rvcnx8c2VsZWN0b3IpO3Jlc3VsdHM9cmVzdWx0c3x8W107aWYobWF0Y2gubGVuZ3RoPT09MSl7dG9rZW5zPW1hdGNoWzBdPW1hdGNoWzBdLnNsaWNlKDApO2lmKHRva2Vucy5sZW5ndGg+MiYmKHRva2VuPXRva2Vuc1swXSkudHlwZT09PSJJRCImJnN1cHBvcnQuZ2V0QnlJZCYmY29udGV4dC5ub2RlVHlwZT09PTkmJmRvY3VtZW50SXNIVE1MJiZFeHByLnJlbGF0aXZlW3Rva2Vuc1sxXS50eXBlXSl7Y29udGV4dD0KKEV4cHIuZmluZFsiSUQiXSh0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLGZ1bmVzY2FwZSksY29udGV4dCl8fFtdKVswXTtpZighY29udGV4dClyZXR1cm4gcmVzdWx0cztlbHNlIGlmKGNvbXBpbGVkKWNvbnRleHQ9Y29udGV4dC5wYXJlbnROb2RlO3NlbGVjdG9yPXNlbGVjdG9yLnNsaWNlKHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1tYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3Qoc2VsZWN0b3IpPzA6dG9rZW5zLmxlbmd0aDt3aGlsZShpLS0pe3Rva2VuPXRva2Vuc1tpXTtpZihFeHByLnJlbGF0aXZlW3R5cGU9dG9rZW4udHlwZV0pYnJlYWs7aWYoZmluZD1FeHByLmZpbmRbdHlwZV0paWYoc2VlZD1maW5kKHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsZnVuZXNjYXBlKSxyc2libGluZy50ZXN0KHRva2Vuc1swXS50eXBlKSYmdGVzdENvbnRleHQoY29udGV4dC5wYXJlbnROb2RlKXx8Y29udGV4dCkpe3Rva2Vucy5zcGxpY2UoaSwKMSk7c2VsZWN0b3I9c2VlZC5sZW5ndGgmJnRvU2VsZWN0b3IodG9rZW5zKTtpZighc2VsZWN0b3Ipe3B1c2guYXBwbHkocmVzdWx0cyxzZWVkKTtyZXR1cm4gcmVzdWx0c31icmVha319fShjb21waWxlZHx8Y29tcGlsZShzZWxlY3RvcixtYXRjaCkpKHNlZWQsY29udGV4dCwhZG9jdW1lbnRJc0hUTUwscmVzdWx0cyxyc2libGluZy50ZXN0KHNlbGVjdG9yKSYmdGVzdENvbnRleHQoY29udGV4dC5wYXJlbnROb2RlKXx8Y29udGV4dCk7cmV0dXJuIHJlc3VsdHN9O3N1cHBvcnQuc29ydFN0YWJsZT1leHBhbmRvLnNwbGl0KCIiKS5zb3J0KHNvcnRPcmRlcikuam9pbigiIik9PT1leHBhbmRvO3N1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcz0hIWhhc0R1cGxpY2F0ZTtzZXREb2N1bWVudCgpO3N1cHBvcnQuc29ydERldGFjaGVkPWFzc2VydChmdW5jdGlvbihkaXYxKXtyZXR1cm4gZGl2MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkmMX0pOwppZighYXNzZXJ0KGZ1bmN0aW9uKGRpdil7ZGl2LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiI7cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09IiMifSkpYWRkSGFuZGxlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlbGVtLG5hbWUsaXNYTUwpe2lmKCFpc1hNTClyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUobmFtZSxuYW1lLnRvTG93ZXJDYXNlKCk9PT0idHlwZSI\/MToyKX0pO2lmKCFzdXBwb3J0LmF0dHJpYnV0ZXN8fCFhc3NlcnQoZnVuY3Rpb24oZGl2KXtkaXYuaW5uZXJIVE1MPSI8aW5wdXQvPiI7ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpO3JldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT0iIn0pKWFkZEhhbmRsZSgidmFsdWUiLGZ1bmN0aW9uKGVsZW0sbmFtZSxpc1hNTCl7aWYoIWlzWE1MJiZlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiKXJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZX0pOwppZighYXNzZXJ0KGZ1bmN0aW9uKGRpdil7cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PW51bGx9KSlhZGRIYW5kbGUoYm9vbGVhbnMsZnVuY3Rpb24oZWxlbSxuYW1lLGlzWE1MKXt2YXIgdmFsO2lmKCFpc1hNTClyZXR1cm4gZWxlbVtuYW1lXT09PXRydWU\/bmFtZS50b0xvd2VyQ2FzZSgpOih2YWw9ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSYmdmFsLnNwZWNpZmllZD92YWwudmFsdWU6bnVsbH0pO2lmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShmdW5jdGlvbigpe3JldHVybiBTaXp6bGV9KTtlbHNlIGlmKHR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiYmbW9kdWxlLmV4cG9ydHMpbW9kdWxlLmV4cG9ydHM9U2l6emxlO2Vsc2Ugd2luZG93LlNpenpsZT1TaXp6bGV9KSh3aW5kb3cpOwooZnVuY3Rpb24oZW5naW5lKXt2YXIgZXh0ZW5kRWxlbWVudHM9UHJvdG90eXBlLlNlbGVjdG9yLmV4dGVuZEVsZW1lbnRzO2Z1bmN0aW9uIHNlbGVjdChzZWxlY3RvcixzY29wZSl7cmV0dXJuIGV4dGVuZEVsZW1lbnRzKGVuZ2luZShzZWxlY3RvcixzY29wZXx8ZG9jdW1lbnQpKX1mdW5jdGlvbiBtYXRjaChlbGVtZW50LHNlbGVjdG9yKXtyZXR1cm4gZW5naW5lLm1hdGNoZXMoc2VsZWN0b3IsW2VsZW1lbnRdKS5sZW5ndGg9PTF9UHJvdG90eXBlLlNlbGVjdG9yLmVuZ2luZT1lbmdpbmU7UHJvdG90eXBlLlNlbGVjdG9yLnNlbGVjdD1zZWxlY3Q7UHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoPW1hdGNofSkoU2l6emxlKTt3aW5kb3cuU2l6emxlPVByb3RvdHlwZS5fb3JpZ2luYWxfcHJvcGVydHk7ZGVsZXRlIFByb3RvdHlwZS5fb3JpZ2luYWxfcHJvcGVydHk7CnZhciBGb3JtPXtyZXNldDpmdW5jdGlvbihmb3JtKXtmb3JtPSQoZm9ybSk7Zm9ybS5yZXNldCgpO3JldHVybiBmb3JtfSxzZXJpYWxpemVFbGVtZW50czpmdW5jdGlvbihlbGVtZW50cyxvcHRpb25zKXtpZih0eXBlb2Ygb3B0aW9ucyE9Im9iamVjdCIpb3B0aW9ucz17aGFzaDohIW9wdGlvbnN9O2Vsc2UgaWYoT2JqZWN0LmlzVW5kZWZpbmVkKG9wdGlvbnMuaGFzaCkpb3B0aW9ucy5oYXNoPXRydWU7dmFyIGtleSx2YWx1ZSxzdWJtaXR0ZWQ9ZmFsc2Usc3VibWl0PW9wdGlvbnMuc3VibWl0LGFjY3VtdWxhdG9yLGluaXRpYWw7aWYob3B0aW9ucy5oYXNoKXtpbml0aWFsPXt9O2FjY3VtdWxhdG9yPWZ1bmN0aW9uKHJlc3VsdCxrZXksdmFsdWUpe2lmKGtleSBpbiByZXN1bHQpe2lmKCFPYmplY3QuaXNBcnJheShyZXN1bHRba2V5XSkpcmVzdWx0W2tleV09W3Jlc3VsdFtrZXldXTtyZXN1bHRba2V5XT1yZXN1bHRba2V5XS5jb25jYXQodmFsdWUpfWVsc2UgcmVzdWx0W2tleV09dmFsdWU7CnJldHVybiByZXN1bHR9fWVsc2V7aW5pdGlhbD0iIjthY2N1bXVsYXRvcj1mdW5jdGlvbihyZXN1bHQsa2V5LHZhbHVlcyl7aWYoIU9iamVjdC5pc0FycmF5KHZhbHVlcykpdmFsdWVzPVt2YWx1ZXNdO2lmKCF2YWx1ZXMubGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIGVuY29kZWRLZXk9ZW5jb2RlVVJJQ29tcG9uZW50KGtleSkuZ3N1YigvJTIwLywiKyIpO3JldHVybiByZXN1bHQrKHJlc3VsdD8iJiI6IiIpK3ZhbHVlcy5tYXAoZnVuY3Rpb24odmFsdWUpe3ZhbHVlPXZhbHVlLmdzdWIoLyhccik\/XG4vLCJcclxuIik7dmFsdWU9ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTt2YWx1ZT12YWx1ZS5nc3ViKC8lMjAvLCIrIik7cmV0dXJuIGVuY29kZWRLZXkrIj0iK3ZhbHVlfSkuam9pbigiJiIpfX1yZXR1cm4gZWxlbWVudHMuaW5qZWN0KGluaXRpYWwsZnVuY3Rpb24ocmVzdWx0LGVsZW1lbnQpe2lmKCFlbGVtZW50LmRpc2FibGVkJiZlbGVtZW50Lm5hbWUpe2tleT1lbGVtZW50Lm5hbWU7CnZhbHVlPSQoZWxlbWVudCkuZ2V0VmFsdWUoKTtpZih2YWx1ZSE9bnVsbCYmZWxlbWVudC50eXBlIT0iZmlsZSImJihlbGVtZW50LnR5cGUhPSJzdWJtaXQifHwhc3VibWl0dGVkJiZzdWJtaXQhPT1mYWxzZSYmKCFzdWJtaXR8fGtleT09c3VibWl0KSYmKHN1Ym1pdHRlZD10cnVlKSkpcmVzdWx0PWFjY3VtdWxhdG9yKHJlc3VsdCxrZXksdmFsdWUpfXJldHVybiByZXN1bHR9KX19OwpGb3JtLk1ldGhvZHM9e3NlcmlhbGl6ZTpmdW5jdGlvbihmb3JtLG9wdGlvbnMpe3JldHVybiBGb3JtLnNlcmlhbGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMoZm9ybSksb3B0aW9ucyl9LGdldEVsZW1lbnRzOmZ1bmN0aW9uKGZvcm0pe3ZhciBlbGVtZW50cz0kKGZvcm0pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7dmFyIGVsZW1lbnQscmVzdWx0cz1bXSxzZXJpYWxpemVycz1Gb3JtLkVsZW1lbnQuU2VyaWFsaXplcnM7Zm9yKHZhciBpPTA7ZWxlbWVudD1lbGVtZW50c1tpXTtpKyspaWYoc2VyaWFsaXplcnNbZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCldKXJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7cmV0dXJuIHJlc3VsdHN9LGdldElucHV0czpmdW5jdGlvbihmb3JtLHR5cGVOYW1lLG5hbWUpe2Zvcm09JChmb3JtKTt2YXIgaW5wdXRzPWZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7aWYoIXR5cGVOYW1lJiYhbmFtZSlyZXR1cm4gJEEoaW5wdXRzKS5tYXAoRWxlbWVudC5leHRlbmQpOwpmb3IodmFyIGk9MCxtYXRjaGluZ0lucHV0cz1bXSxsZW5ndGg9aW5wdXRzLmxlbmd0aDtpPGxlbmd0aDtpKyspe3ZhciBpbnB1dD1pbnB1dHNbaV07aWYodHlwZU5hbWUmJmlucHV0LnR5cGUhPXR5cGVOYW1lfHxuYW1lJiZpbnB1dC5uYW1lIT1uYW1lKWNvbnRpbnVlO21hdGNoaW5nSW5wdXRzLnB1c2goRWxlbWVudC5leHRlbmQoaW5wdXQpKX1yZXR1cm4gbWF0Y2hpbmdJbnB1dHN9LGRpc2FibGU6ZnVuY3Rpb24oZm9ybSl7Zm9ybT0kKGZvcm0pO0Zvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCJkaXNhYmxlIik7cmV0dXJuIGZvcm19LGVuYWJsZTpmdW5jdGlvbihmb3JtKXtmb3JtPSQoZm9ybSk7Rm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoImVuYWJsZSIpO3JldHVybiBmb3JtfSxmaW5kRmlyc3RFbGVtZW50OmZ1bmN0aW9uKGZvcm0pe3ZhciBlbGVtZW50cz0kKGZvcm0pLmdldEVsZW1lbnRzKCkuZmluZEFsbChmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4iaGlkZGVuIiE9CmVsZW1lbnQudHlwZSYmIWVsZW1lbnQuZGlzYWJsZWR9KTt2YXIgZmlyc3RCeUluZGV4PWVsZW1lbnRzLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0YWJJbmRleCIpJiZlbGVtZW50LnRhYkluZGV4Pj0wfSkuc29ydEJ5KGZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiBlbGVtZW50LnRhYkluZGV4fSkuZmlyc3QoKTtyZXR1cm4gZmlyc3RCeUluZGV4P2ZpcnN0QnlJbmRleDplbGVtZW50cy5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybi9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KGVsZW1lbnQudGFnTmFtZSl9KX0sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oZm9ybSl7Zm9ybT0kKGZvcm0pO3ZhciBlbGVtZW50PWZvcm0uZmluZEZpcnN0RWxlbWVudCgpO2lmKGVsZW1lbnQpZWxlbWVudC5hY3RpdmF0ZSgpO3JldHVybiBmb3JtfSxyZXF1ZXN0OmZ1bmN0aW9uKGZvcm0sb3B0aW9ucyl7Zm9ybT0kKGZvcm0pLApvcHRpb25zPU9iamVjdC5jbG9uZShvcHRpb25zfHx7fSk7dmFyIHBhcmFtcz1vcHRpb25zLnBhcmFtZXRlcnMsYWN0aW9uPWZvcm0ucmVhZEF0dHJpYnV0ZSgiYWN0aW9uIil8fCIiO2lmKGFjdGlvbi5ibGFuaygpKWFjdGlvbj13aW5kb3cubG9jYXRpb24uaHJlZjtvcHRpb25zLnBhcmFtZXRlcnM9Zm9ybS5zZXJpYWxpemUodHJ1ZSk7aWYocGFyYW1zKXtpZihPYmplY3QuaXNTdHJpbmcocGFyYW1zKSlwYXJhbXM9cGFyYW1zLnRvUXVlcnlQYXJhbXMoKTtPYmplY3QuZXh0ZW5kKG9wdGlvbnMucGFyYW1ldGVycyxwYXJhbXMpfWlmKGZvcm0uaGFzQXR0cmlidXRlKCJtZXRob2QiKSYmIW9wdGlvbnMubWV0aG9kKW9wdGlvbnMubWV0aG9kPWZvcm0ubWV0aG9kO3JldHVybiBuZXcgQWpheC5SZXF1ZXN0KGFjdGlvbixvcHRpb25zKX19OwpGb3JtLkVsZW1lbnQ9e2ZvY3VzOmZ1bmN0aW9uKGVsZW1lbnQpeyQoZWxlbWVudCkuZm9jdXMoKTtyZXR1cm4gZWxlbWVudH0sc2VsZWN0OmZ1bmN0aW9uKGVsZW1lbnQpeyQoZWxlbWVudCkuc2VsZWN0KCk7cmV0dXJuIGVsZW1lbnR9fTsKRm9ybS5FbGVtZW50Lk1ldGhvZHM9e3NlcmlhbGl6ZTpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7aWYoIWVsZW1lbnQuZGlzYWJsZWQmJmVsZW1lbnQubmFtZSl7dmFyIHZhbHVlPWVsZW1lbnQuZ2V0VmFsdWUoKTtpZih2YWx1ZSE9dW5kZWZpbmVkKXt2YXIgcGFpcj17fTtwYWlyW2VsZW1lbnQubmFtZV09dmFsdWU7cmV0dXJuIE9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhaXIpfX1yZXR1cm4iIn0sZ2V0VmFsdWU6ZnVuY3Rpb24oZWxlbWVudCl7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBtZXRob2Q9ZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpfSxzZXRWYWx1ZTpmdW5jdGlvbihlbGVtZW50LHZhbHVlKXtlbGVtZW50PSQoZWxlbWVudCk7dmFyIG1ldGhvZD1lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50LAp2YWx1ZSk7cmV0dXJuIGVsZW1lbnR9LGNsZWFyOmZ1bmN0aW9uKGVsZW1lbnQpeyQoZWxlbWVudCkudmFsdWU9IiI7cmV0dXJuIGVsZW1lbnR9LHByZXNlbnQ6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuICQoZWxlbWVudCkudmFsdWUhPSIifSxhY3RpdmF0ZTpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7dHJ5e2VsZW1lbnQuZm9jdXMoKTtpZihlbGVtZW50LnNlbGVjdCYmKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIT0iaW5wdXQifHwhL14oPzpidXR0b258cmVzZXR8c3VibWl0KSQvaS50ZXN0KGVsZW1lbnQudHlwZSkpKWVsZW1lbnQuc2VsZWN0KCl9Y2F0Y2goZSl7fXJldHVybiBlbGVtZW50fSxkaXNhYmxlOmZ1bmN0aW9uKGVsZW1lbnQpe2VsZW1lbnQ9JChlbGVtZW50KTtlbGVtZW50LmRpc2FibGVkPXRydWU7cmV0dXJuIGVsZW1lbnR9LGVuYWJsZTpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PSQoZWxlbWVudCk7ZWxlbWVudC5kaXNhYmxlZD0KZmFsc2U7cmV0dXJuIGVsZW1lbnR9fTt2YXIgRmllbGQ9Rm9ybS5FbGVtZW50O3ZhciAkRj1Gb3JtLkVsZW1lbnQuTWV0aG9kcy5nZXRWYWx1ZTsKRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaW5wdXQoZWxlbWVudCx2YWx1ZSl7c3dpdGNoKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKXtjYXNlICJjaGVja2JveCI6Y2FzZSAicmFkaW8iOnJldHVybiBpbnB1dFNlbGVjdG9yKGVsZW1lbnQsdmFsdWUpO2RlZmF1bHQ6cmV0dXJuIHZhbHVlU2VsZWN0b3IoZWxlbWVudCx2YWx1ZSl9fWZ1bmN0aW9uIGlucHV0U2VsZWN0b3IoZWxlbWVudCx2YWx1ZSl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSlyZXR1cm4gZWxlbWVudC5jaGVja2VkP2VsZW1lbnQudmFsdWU6bnVsbDtlbHNlIGVsZW1lbnQuY2hlY2tlZD0hIXZhbHVlfWZ1bmN0aW9uIHZhbHVlU2VsZWN0b3IoZWxlbWVudCx2YWx1ZSl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSlyZXR1cm4gZWxlbWVudC52YWx1ZTtlbHNlIGVsZW1lbnQudmFsdWU9dmFsdWV9ZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQsdmFsdWUpe2lmKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpcmV0dXJuKGVsZW1lbnQudHlwZT09PQoic2VsZWN0LW9uZSI\/c2VsZWN0T25lOnNlbGVjdE1hbnkpKGVsZW1lbnQpO3ZhciBvcHQsY3VycmVudFZhbHVlLHNpbmdsZT0hT2JqZWN0LmlzQXJyYXkodmFsdWUpO2Zvcih2YXIgaT0wLGxlbmd0aD1lbGVtZW50Lmxlbmd0aDtpPGxlbmd0aDtpKyspe29wdD1lbGVtZW50Lm9wdGlvbnNbaV07Y3VycmVudFZhbHVlPXRoaXMub3B0aW9uVmFsdWUob3B0KTtpZihzaW5nbGUpe2lmKGN1cnJlbnRWYWx1ZT09dmFsdWUpe29wdC5zZWxlY3RlZD10cnVlO3JldHVybn19ZWxzZSBvcHQuc2VsZWN0ZWQ9dmFsdWUuaW5jbHVkZShjdXJyZW50VmFsdWUpfX1mdW5jdGlvbiBzZWxlY3RPbmUoZWxlbWVudCl7dmFyIGluZGV4PWVsZW1lbnQuc2VsZWN0ZWRJbmRleDtyZXR1cm4gaW5kZXg+PTA\/b3B0aW9uVmFsdWUoZWxlbWVudC5vcHRpb25zW2luZGV4XSk6bnVsbH1mdW5jdGlvbiBzZWxlY3RNYW55KGVsZW1lbnQpe3ZhciB2YWx1ZXMsbGVuZ3RoPWVsZW1lbnQubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIG51bGw7CmZvcih2YXIgaT0wLHZhbHVlcz1bXTtpPGxlbmd0aDtpKyspe3ZhciBvcHQ9ZWxlbWVudC5vcHRpb25zW2ldO2lmKG9wdC5zZWxlY3RlZCl2YWx1ZXMucHVzaChvcHRpb25WYWx1ZShvcHQpKX1yZXR1cm4gdmFsdWVzfWZ1bmN0aW9uIG9wdGlvblZhbHVlKG9wdCl7cmV0dXJuIEVsZW1lbnQuaGFzQXR0cmlidXRlKG9wdCwidmFsdWUiKT9vcHQudmFsdWU6b3B0LnRleHR9cmV0dXJue2lucHV0OmlucHV0LGlucHV0U2VsZWN0b3I6aW5wdXRTZWxlY3Rvcix0ZXh0YXJlYTp2YWx1ZVNlbGVjdG9yLHNlbGVjdDpzZWxlY3Qsc2VsZWN0T25lOnNlbGVjdE9uZSxzZWxlY3RNYW55OnNlbGVjdE1hbnksb3B0aW9uVmFsdWU6b3B0aW9uVmFsdWUsYnV0dG9uOnZhbHVlU2VsZWN0b3J9fSgpOwpBYnN0cmFjdC5UaW1lZE9ic2VydmVyPUNsYXNzLmNyZWF0ZShQZXJpb2RpY2FsRXhlY3V0ZXIse2luaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLGVsZW1lbnQsZnJlcXVlbmN5LGNhbGxiYWNrKXskc3VwZXIoY2FsbGJhY2ssZnJlcXVlbmN5KTt0aGlzLmVsZW1lbnQ9JChlbGVtZW50KTt0aGlzLmxhc3RWYWx1ZT10aGlzLmdldFZhbHVlKCl9LGV4ZWN1dGU6ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5nZXRWYWx1ZSgpO2lmKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkmJk9iamVjdC5pc1N0cmluZyh2YWx1ZSk\/dGhpcy5sYXN0VmFsdWUhPXZhbHVlOlN0cmluZyh0aGlzLmxhc3RWYWx1ZSkhPVN0cmluZyh2YWx1ZSkpe3RoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LHZhbHVlKTt0aGlzLmxhc3RWYWx1ZT12YWx1ZX19fSk7Rm9ybS5FbGVtZW50Lk9ic2VydmVyPUNsYXNzLmNyZWF0ZShBYnN0cmFjdC5UaW1lZE9ic2VydmVyLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KX19KTsKRm9ybS5PYnNlcnZlcj1DbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlcix7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KX19KTsKQWJzdHJhY3QuRXZlbnRPYnNlcnZlcj1DbGFzcy5jcmVhdGUoe2luaXRpYWxpemU6ZnVuY3Rpb24oZWxlbWVudCxjYWxsYmFjayl7dGhpcy5lbGVtZW50PSQoZWxlbWVudCk7dGhpcy5jYWxsYmFjaz1jYWxsYmFjazt0aGlzLmxhc3RWYWx1ZT10aGlzLmdldFZhbHVlKCk7aWYodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ImZvcm0iKXRoaXMucmVnaXN0ZXJGb3JtQ2FsbGJhY2tzKCk7ZWxzZSB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5lbGVtZW50KX0sb25FbGVtZW50RXZlbnQ6ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5nZXRWYWx1ZSgpO2lmKHRoaXMubGFzdFZhbHVlIT12YWx1ZSl7dGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsdmFsdWUpO3RoaXMubGFzdFZhbHVlPXZhbHVlfX0scmVnaXN0ZXJGb3JtQ2FsbGJhY2tzOmZ1bmN0aW9uKCl7Rm9ybS5nZXRFbGVtZW50cyh0aGlzLmVsZW1lbnQpLmVhY2godGhpcy5yZWdpc3RlckNhbGxiYWNrLHRoaXMpfSwKcmVnaXN0ZXJDYWxsYmFjazpmdW5jdGlvbihlbGVtZW50KXtpZihlbGVtZW50LnR5cGUpc3dpdGNoKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKXtjYXNlICJjaGVja2JveCI6Y2FzZSAicmFkaW8iOkV2ZW50Lm9ic2VydmUoZWxlbWVudCwiY2xpY2siLHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7YnJlYWs7ZGVmYXVsdDpFdmVudC5vYnNlcnZlKGVsZW1lbnQsImNoYW5nZSIsdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTticmVha319fSk7Rm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpfX0pO0Zvcm0uRXZlbnRPYnNlcnZlcj1DbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlcix7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KX19KTsKKGZ1bmN0aW9uKEdMT0JBTCl7dmFyIERJVj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt2YXIgZG9jRWw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRD0ib25tb3VzZWVudGVyImluIGRvY0VsJiYib25tb3VzZWxlYXZlImluIGRvY0VsO3ZhciBFdmVudD17S0VZX0JBQ0tTUEFDRTo4LEtFWV9UQUI6OSxLRVlfUkVUVVJOOjEzLEtFWV9FU0M6MjcsS0VZX0xFRlQ6MzcsS0VZX1VQOjM4LEtFWV9SSUdIVDozOSxLRVlfRE9XTjo0MCxLRVlfREVMRVRFOjQ2LEtFWV9IT01FOjM2LEtFWV9FTkQ6MzUsS0VZX1BBR0VVUDozMyxLRVlfUEFHRURPV046MzQsS0VZX0lOU0VSVDo0NX07dmFyIGlzSUVMZWdhY3lFdmVudD1mdW5jdGlvbihldmVudCl7cmV0dXJuIGZhbHNlfTtpZih3aW5kb3cuYXR0YWNoRXZlbnQpaWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpaXNJRUxlZ2FjeUV2ZW50PWZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4hKGV2ZW50IGluc3RhbmNlb2YKd2luZG93LkV2ZW50KX07ZWxzZSBpc0lFTGVnYWN5RXZlbnQ9ZnVuY3Rpb24oZXZlbnQpe3JldHVybiB0cnVlfTt2YXIgX2lzQnV0dG9uO2Z1bmN0aW9uIF9pc0J1dHRvbkZvckRPTUV2ZW50cyhldmVudCxjb2RlKXtyZXR1cm4gZXZlbnQud2hpY2g\/ZXZlbnQud2hpY2g9PT1jb2RlKzE6ZXZlbnQuYnV0dG9uPT09Y29kZX12YXIgbGVnYWN5QnV0dG9uTWFwPXswOjEsMTo0LDI6Mn07ZnVuY3Rpb24gX2lzQnV0dG9uRm9yTGVnYWN5RXZlbnRzKGV2ZW50LGNvZGUpe3JldHVybiBldmVudC5idXR0b249PT1sZWdhY3lCdXR0b25NYXBbY29kZV19ZnVuY3Rpb24gX2lzQnV0dG9uRm9yV2ViS2l0KGV2ZW50LGNvZGUpe3N3aXRjaChjb2RlKXtjYXNlIDA6cmV0dXJuIGV2ZW50LndoaWNoPT0xJiYhZXZlbnQubWV0YUtleTtjYXNlIDE6cmV0dXJuIGV2ZW50LndoaWNoPT0yfHxldmVudC53aGljaD09MSYmZXZlbnQubWV0YUtleTtjYXNlIDI6cmV0dXJuIGV2ZW50LndoaWNoPT0zO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX0KaWYod2luZG93LmF0dGFjaEV2ZW50KWlmKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcilfaXNCdXR0b249X2lzQnV0dG9uRm9yTGVnYWN5RXZlbnRzO2Vsc2UgX2lzQnV0dG9uPWZ1bmN0aW9uKGV2ZW50LGNvZGUpe3JldHVybiBpc0lFTGVnYWN5RXZlbnQoZXZlbnQpP19pc0J1dHRvbkZvckxlZ2FjeUV2ZW50cyhldmVudCxjb2RlKTpfaXNCdXR0b25Gb3JET01FdmVudHMoZXZlbnQsY29kZSl9O2Vsc2UgaWYoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KV9pc0J1dHRvbj1faXNCdXR0b25Gb3JXZWJLaXQ7ZWxzZSBfaXNCdXR0b249X2lzQnV0dG9uRm9yRE9NRXZlbnRzO2Z1bmN0aW9uIGlzTGVmdENsaWNrKGV2ZW50KXtyZXR1cm4gX2lzQnV0dG9uKGV2ZW50LDApfWZ1bmN0aW9uIGlzTWlkZGxlQ2xpY2soZXZlbnQpe3JldHVybiBfaXNCdXR0b24oZXZlbnQsMSl9ZnVuY3Rpb24gaXNSaWdodENsaWNrKGV2ZW50KXtyZXR1cm4gX2lzQnV0dG9uKGV2ZW50LDIpfWZ1bmN0aW9uIGVsZW1lbnQoZXZlbnQpe3JldHVybiBFbGVtZW50LmV4dGVuZChfZWxlbWVudChldmVudCkpfQpmdW5jdGlvbiBfZWxlbWVudChldmVudCl7ZXZlbnQ9RXZlbnQuZXh0ZW5kKGV2ZW50KTt2YXIgbm9kZT1ldmVudC50YXJnZXQsdHlwZT1ldmVudC50eXBlLGN1cnJlbnRUYXJnZXQ9ZXZlbnQuY3VycmVudFRhcmdldDtpZihjdXJyZW50VGFyZ2V0JiZjdXJyZW50VGFyZ2V0LnRhZ05hbWUpaWYodHlwZT09PSJsb2FkInx8dHlwZT09PSJlcnJvciJ8fHR5cGU9PT0iY2xpY2siJiZjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJmN1cnJlbnRUYXJnZXQudHlwZT09PSJyYWRpbyIpbm9kZT1jdXJyZW50VGFyZ2V0O3JldHVybiBub2RlLm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERT9ub2RlLnBhcmVudE5vZGU6bm9kZX1mdW5jdGlvbiBmaW5kRWxlbWVudChldmVudCxleHByZXNzaW9uKXt2YXIgZWxlbWVudD1fZWxlbWVudChldmVudCksc2VsZWN0b3I9UHJvdG90eXBlLlNlbGVjdG9yO2lmKCFleHByZXNzaW9uKXJldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KTsKd2hpbGUoZWxlbWVudCl7aWYoT2JqZWN0LmlzRWxlbWVudChlbGVtZW50KSYmc2VsZWN0b3IubWF0Y2goZWxlbWVudCxleHByZXNzaW9uKSlyZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7ZWxlbWVudD1lbGVtZW50LnBhcmVudE5vZGV9fWZ1bmN0aW9uIHBvaW50ZXIoZXZlbnQpe3JldHVybnt4OnBvaW50ZXJYKGV2ZW50KSx5OnBvaW50ZXJZKGV2ZW50KX19ZnVuY3Rpb24gcG9pbnRlclgoZXZlbnQpe3ZhciBkb2NFbGVtZW50PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxib2R5PWRvY3VtZW50LmJvZHl8fHtzY3JvbGxMZWZ0OjB9O3JldHVybiBldmVudC5wYWdlWHx8ZXZlbnQuY2xpZW50WCsoZG9jRWxlbWVudC5zY3JvbGxMZWZ0fHxib2R5LnNjcm9sbExlZnQpLShkb2NFbGVtZW50LmNsaWVudExlZnR8fDApfWZ1bmN0aW9uIHBvaW50ZXJZKGV2ZW50KXt2YXIgZG9jRWxlbWVudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYm9keT1kb2N1bWVudC5ib2R5fHx7c2Nyb2xsVG9wOjB9OwpyZXR1cm4gZXZlbnQucGFnZVl8fGV2ZW50LmNsaWVudFkrKGRvY0VsZW1lbnQuc2Nyb2xsVG9wfHxib2R5LnNjcm9sbFRvcCktKGRvY0VsZW1lbnQuY2xpZW50VG9wfHwwKX1mdW5jdGlvbiBzdG9wKGV2ZW50KXtFdmVudC5leHRlbmQoZXZlbnQpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZXZlbnQuc3RvcHBlZD10cnVlfUV2ZW50Lk1ldGhvZHM9e2lzTGVmdENsaWNrOmlzTGVmdENsaWNrLGlzTWlkZGxlQ2xpY2s6aXNNaWRkbGVDbGljayxpc1JpZ2h0Q2xpY2s6aXNSaWdodENsaWNrLGVsZW1lbnQ6ZWxlbWVudCxmaW5kRWxlbWVudDpmaW5kRWxlbWVudCxwb2ludGVyOnBvaW50ZXIscG9pbnRlclg6cG9pbnRlclgscG9pbnRlclk6cG9pbnRlclksc3RvcDpzdG9wfTt2YXIgbWV0aG9kcz1PYmplY3Qua2V5cyhFdmVudC5NZXRob2RzKS5pbmplY3Qoe30sZnVuY3Rpb24obSxuYW1lKXttW25hbWVdPUV2ZW50Lk1ldGhvZHNbbmFtZV0ubWV0aG9kaXplKCk7CnJldHVybiBtfSk7aWYod2luZG93LmF0dGFjaEV2ZW50KXtmdW5jdGlvbiBfcmVsYXRlZFRhcmdldChldmVudCl7dmFyIGVsZW1lbnQ7c3dpdGNoKGV2ZW50LnR5cGUpe2Nhc2UgIm1vdXNlb3ZlciI6Y2FzZSAibW91c2VlbnRlciI6ZWxlbWVudD1ldmVudC5mcm9tRWxlbWVudDticmVhaztjYXNlICJtb3VzZW91dCI6Y2FzZSAibW91c2VsZWF2ZSI6ZWxlbWVudD1ldmVudC50b0VsZW1lbnQ7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCl9dmFyIGFkZGl0aW9uYWxNZXRob2RzPXtzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEJ1YmJsZT10cnVlfSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ZmFsc2V9LGluc3BlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBFdmVudF0ifX07RXZlbnQuZXh0ZW5kPWZ1bmN0aW9uKGV2ZW50LGVsZW1lbnQpe2lmKCFldmVudClyZXR1cm4gZmFsc2U7CmlmKCFpc0lFTGVnYWN5RXZlbnQoZXZlbnQpKXJldHVybiBldmVudDtpZihldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSlyZXR1cm4gZXZlbnQ7ZXZlbnQuX2V4dGVuZGVkQnlQcm90b3R5cGU9UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247dmFyIHBvaW50ZXI9RXZlbnQucG9pbnRlcihldmVudCk7T2JqZWN0LmV4dGVuZChldmVudCx7dGFyZ2V0OmV2ZW50LnNyY0VsZW1lbnR8fGVsZW1lbnQscmVsYXRlZFRhcmdldDpfcmVsYXRlZFRhcmdldChldmVudCkscGFnZVg6cG9pbnRlci54LHBhZ2VZOnBvaW50ZXIueX0pO09iamVjdC5leHRlbmQoZXZlbnQsbWV0aG9kcyk7T2JqZWN0LmV4dGVuZChldmVudCxhZGRpdGlvbmFsTWV0aG9kcyk7cmV0dXJuIGV2ZW50fX1lbHNlIEV2ZW50LmV4dGVuZD1Qcm90b3R5cGUuSztpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7RXZlbnQucHJvdG90eXBlPXdpbmRvdy5FdmVudC5wcm90b3R5cGV8fGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikuX19wcm90b19fOwpPYmplY3QuZXh0ZW5kKEV2ZW50LnByb3RvdHlwZSxtZXRob2RzKX12YXIgRVZFTlRfVFJBTlNMQVRJT05TPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07ZnVuY3Rpb24gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSl7cmV0dXJuIEVWRU5UX1RSQU5TTEFUSU9OU1tldmVudE5hbWVdfHxldmVudE5hbWV9aWYoTU9VU0VFTlRFUl9NT1VTRUxFQVZFX0VWRU5UU19TVVBQT1JURUQpZ2V0RE9NRXZlbnROYW1lPVByb3RvdHlwZS5LO2Z1bmN0aW9uIGdldFVuaXF1ZUVsZW1lbnRJRChlbGVtZW50KXtpZihlbGVtZW50PT09d2luZG93KXJldHVybiAwO2lmKHR5cGVvZiBlbGVtZW50Ll9wcm90b3R5cGVVSUQ9PT0idW5kZWZpbmVkIillbGVtZW50Ll9wcm90b3R5cGVVSUQ9RWxlbWVudC5TdG9yYWdlLlVJRCsrO3JldHVybiBlbGVtZW50Ll9wcm90b3R5cGVVSUR9ZnVuY3Rpb24gZ2V0VW5pcXVlRWxlbWVudElEX0lFKGVsZW1lbnQpe2lmKGVsZW1lbnQ9PT0Kd2luZG93KXJldHVybiAwO2lmKGVsZW1lbnQ9PWRvY3VtZW50KXJldHVybiAxO3JldHVybiBlbGVtZW50LnVuaXF1ZUlEfWlmKCJ1bmlxdWVJRCJpbiBESVYpZ2V0VW5pcXVlRWxlbWVudElEPWdldFVuaXF1ZUVsZW1lbnRJRF9JRTtmdW5jdGlvbiBpc0N1c3RvbUV2ZW50KGV2ZW50TmFtZSl7cmV0dXJuIGV2ZW50TmFtZS5pbmNsdWRlKCI6Iil9RXZlbnQuX2lzQ3VzdG9tRXZlbnQ9aXNDdXN0b21FdmVudDtmdW5jdGlvbiBnZXRSZWdpc3RyeUZvckVsZW1lbnQoZWxlbWVudCx1aWQpe3ZhciBDQUNIRT1HTE9CQUwuRXZlbnQuY2FjaGU7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKHVpZCkpdWlkPWdldFVuaXF1ZUVsZW1lbnRJRChlbGVtZW50KTtpZighQ0FDSEVbdWlkXSlDQUNIRVt1aWRdPXtlbGVtZW50OmVsZW1lbnR9O3JldHVybiBDQUNIRVt1aWRdfWZ1bmN0aW9uIGRlc3Ryb3lSZWdpc3RyeUZvckVsZW1lbnQoZWxlbWVudCx1aWQpe2lmKE9iamVjdC5pc1VuZGVmaW5lZCh1aWQpKXVpZD0KZ2V0VW5pcXVlRWxlbWVudElEKGVsZW1lbnQpO2RlbGV0ZSBHTE9CQUwuRXZlbnQuY2FjaGVbdWlkXX1mdW5jdGlvbiByZWdpc3RlcihlbGVtZW50LGV2ZW50TmFtZSxoYW5kbGVyKXt2YXIgcmVnaXN0cnk9Z2V0UmVnaXN0cnlGb3JFbGVtZW50KGVsZW1lbnQpO2lmKCFyZWdpc3RyeVtldmVudE5hbWVdKXJlZ2lzdHJ5W2V2ZW50TmFtZV09W107dmFyIGVudHJpZXM9cmVnaXN0cnlbZXZlbnROYW1lXTt2YXIgaT1lbnRyaWVzLmxlbmd0aDt3aGlsZShpLS0paWYoZW50cmllc1tpXS5oYW5kbGVyPT09aGFuZGxlcilyZXR1cm4gbnVsbDt2YXIgdWlkPWdldFVuaXF1ZUVsZW1lbnRJRChlbGVtZW50KTt2YXIgcmVzcG9uZGVyPUdMT0JBTC5FdmVudC5fY3JlYXRlUmVzcG9uZGVyKHVpZCxldmVudE5hbWUsaGFuZGxlcik7dmFyIGVudHJ5PXtyZXNwb25kZXI6cmVzcG9uZGVyLGhhbmRsZXI6aGFuZGxlcn07ZW50cmllcy5wdXNoKGVudHJ5KTtyZXR1cm4gZW50cnl9ZnVuY3Rpb24gdW5yZWdpc3RlcihlbGVtZW50LApldmVudE5hbWUsaGFuZGxlcil7dmFyIHJlZ2lzdHJ5PWdldFJlZ2lzdHJ5Rm9yRWxlbWVudChlbGVtZW50KTt2YXIgZW50cmllcz1yZWdpc3RyeVtldmVudE5hbWVdO2lmKCFlbnRyaWVzKXJldHVybjt2YXIgaT1lbnRyaWVzLmxlbmd0aCxlbnRyeTt3aGlsZShpLS0paWYoZW50cmllc1tpXS5oYW5kbGVyPT09aGFuZGxlcil7ZW50cnk9ZW50cmllc1tpXTticmVha31pZighZW50cnkpcmV0dXJuO3ZhciBpbmRleD1lbnRyaWVzLmluZGV4T2YoZW50cnkpO2VudHJpZXMuc3BsaWNlKGluZGV4LDEpO3JldHVybiBlbnRyeX1mdW5jdGlvbiBvYnNlcnZlKGVsZW1lbnQsZXZlbnROYW1lLGhhbmRsZXIpe2VsZW1lbnQ9JChlbGVtZW50KTt2YXIgZW50cnk9cmVnaXN0ZXIoZWxlbWVudCxldmVudE5hbWUsaGFuZGxlcik7aWYoZW50cnk9PT1udWxsKXJldHVybiBlbGVtZW50O3ZhciByZXNwb25kZXI9ZW50cnkucmVzcG9uZGVyO2lmKGlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSlvYnNlcnZlQ3VzdG9tRXZlbnQoZWxlbWVudCwKZXZlbnROYW1lLHJlc3BvbmRlcik7ZWxzZSBvYnNlcnZlU3RhbmRhcmRFdmVudChlbGVtZW50LGV2ZW50TmFtZSxyZXNwb25kZXIpO3JldHVybiBlbGVtZW50fWZ1bmN0aW9uIG9ic2VydmVTdGFuZGFyZEV2ZW50KGVsZW1lbnQsZXZlbnROYW1lLHJlc3BvbmRlcil7dmFyIGFjdHVhbEV2ZW50TmFtZT1nZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTtpZihlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGFjdHVhbEV2ZW50TmFtZSxyZXNwb25kZXIsZmFsc2UpO2Vsc2UgZWxlbWVudC5hdHRhY2hFdmVudCgib24iK2FjdHVhbEV2ZW50TmFtZSxyZXNwb25kZXIpfWZ1bmN0aW9uIG9ic2VydmVDdXN0b21FdmVudChlbGVtZW50LGV2ZW50TmFtZSxyZXNwb25kZXIpe2lmKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcillbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRhdGFhdmFpbGFibGUiLHJlc3BvbmRlcixmYWxzZSk7ZWxzZXtlbGVtZW50LmF0dGFjaEV2ZW50KCJvbmRhdGFhdmFpbGFibGUiLApyZXNwb25kZXIpO2VsZW1lbnQuYXR0YWNoRXZlbnQoIm9ubG9zZWNhcHR1cmUiLHJlc3BvbmRlcil9fWZ1bmN0aW9uIHN0b3BPYnNlcnZpbmcoZWxlbWVudCxldmVudE5hbWUsaGFuZGxlcil7ZWxlbWVudD0kKGVsZW1lbnQpO3ZhciBoYW5kbGVyR2l2ZW49IU9iamVjdC5pc1VuZGVmaW5lZChoYW5kbGVyKSxldmVudE5hbWVHaXZlbj0hT2JqZWN0LmlzVW5kZWZpbmVkKGV2ZW50TmFtZSk7aWYoIWV2ZW50TmFtZUdpdmVuJiYhaGFuZGxlckdpdmVuKXtzdG9wT2JzZXJ2aW5nRWxlbWVudChlbGVtZW50KTtyZXR1cm4gZWxlbWVudH1pZighaGFuZGxlckdpdmVuKXtzdG9wT2JzZXJ2aW5nRXZlbnROYW1lKGVsZW1lbnQsZXZlbnROYW1lKTtyZXR1cm4gZWxlbWVudH12YXIgZW50cnk9dW5yZWdpc3RlcihlbGVtZW50LGV2ZW50TmFtZSxoYW5kbGVyKTtpZighZW50cnkpcmV0dXJuIGVsZW1lbnQ7cmVtb3ZlRXZlbnQoZWxlbWVudCxldmVudE5hbWUsZW50cnkucmVzcG9uZGVyKTtyZXR1cm4gZWxlbWVudH0KZnVuY3Rpb24gc3RvcE9ic2VydmluZ1N0YW5kYXJkRXZlbnQoZWxlbWVudCxldmVudE5hbWUscmVzcG9uZGVyKXt2YXIgYWN0dWFsRXZlbnROYW1lPWdldERPTUV2ZW50TmFtZShldmVudE5hbWUpO2lmKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcillbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYWN0dWFsRXZlbnROYW1lLHJlc3BvbmRlcixmYWxzZSk7ZWxzZSBlbGVtZW50LmRldGFjaEV2ZW50KCJvbiIrYWN0dWFsRXZlbnROYW1lLHJlc3BvbmRlcil9ZnVuY3Rpb24gc3RvcE9ic2VydmluZ0N1c3RvbUV2ZW50KGVsZW1lbnQsZXZlbnROYW1lLHJlc3BvbmRlcil7aWYoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKWVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGF0YWF2YWlsYWJsZSIscmVzcG9uZGVyLGZhbHNlKTtlbHNle2VsZW1lbnQuZGV0YWNoRXZlbnQoIm9uZGF0YWF2YWlsYWJsZSIscmVzcG9uZGVyKTtlbGVtZW50LmRldGFjaEV2ZW50KCJvbmxvc2VjYXB0dXJlIiwKcmVzcG9uZGVyKX19ZnVuY3Rpb24gc3RvcE9ic2VydmluZ0VsZW1lbnQoZWxlbWVudCl7dmFyIHVpZD1nZXRVbmlxdWVFbGVtZW50SUQoZWxlbWVudCkscmVnaXN0cnk9R0xPQkFMLkV2ZW50LmNhY2hlW3VpZF07aWYoIXJlZ2lzdHJ5KXJldHVybjtkZXN0cm95UmVnaXN0cnlGb3JFbGVtZW50KGVsZW1lbnQsdWlkKTt2YXIgZW50cmllcyxpO2Zvcih2YXIgZXZlbnROYW1lIGluIHJlZ2lzdHJ5KXtpZihldmVudE5hbWU9PT0iZWxlbWVudCIpY29udGludWU7ZW50cmllcz1yZWdpc3RyeVtldmVudE5hbWVdO2k9ZW50cmllcy5sZW5ndGg7d2hpbGUoaS0tKXJlbW92ZUV2ZW50KGVsZW1lbnQsZXZlbnROYW1lLGVudHJpZXNbaV0ucmVzcG9uZGVyKX19ZnVuY3Rpb24gc3RvcE9ic2VydmluZ0V2ZW50TmFtZShlbGVtZW50LGV2ZW50TmFtZSl7dmFyIHJlZ2lzdHJ5PWdldFJlZ2lzdHJ5Rm9yRWxlbWVudChlbGVtZW50KTt2YXIgZW50cmllcz1yZWdpc3RyeVtldmVudE5hbWVdO2lmKCFlbnRyaWVzKXJldHVybjsKZGVsZXRlIHJlZ2lzdHJ5W2V2ZW50TmFtZV07dmFyIGk9ZW50cmllcy5sZW5ndGg7d2hpbGUoaS0tKXJlbW92ZUV2ZW50KGVsZW1lbnQsZXZlbnROYW1lLGVudHJpZXNbaV0ucmVzcG9uZGVyKX1mdW5jdGlvbiByZW1vdmVFdmVudChlbGVtZW50LGV2ZW50TmFtZSxoYW5kbGVyKXtpZihpc0N1c3RvbUV2ZW50KGV2ZW50TmFtZSkpc3RvcE9ic2VydmluZ0N1c3RvbUV2ZW50KGVsZW1lbnQsZXZlbnROYW1lLGhhbmRsZXIpO2Vsc2Ugc3RvcE9ic2VydmluZ1N0YW5kYXJkRXZlbnQoZWxlbWVudCxldmVudE5hbWUsaGFuZGxlcil9ZnVuY3Rpb24gZ2V0RmlyZVRhcmdldChlbGVtZW50KXtpZihlbGVtZW50IT09ZG9jdW1lbnQpcmV0dXJuIGVsZW1lbnQ7aWYoZG9jdW1lbnQuY3JlYXRlRXZlbnQmJiFlbGVtZW50LmRpc3BhdGNoRXZlbnQpcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtyZXR1cm4gZWxlbWVudH1mdW5jdGlvbiBmaXJlKGVsZW1lbnQsZXZlbnROYW1lLG1lbW8sYnViYmxlKXtlbGVtZW50PQpnZXRGaXJlVGFyZ2V0KCQoZWxlbWVudCkpO2lmKE9iamVjdC5pc1VuZGVmaW5lZChidWJibGUpKWJ1YmJsZT10cnVlO21lbW89bWVtb3x8e307dmFyIGV2ZW50PWZpcmVFdmVudChlbGVtZW50LGV2ZW50TmFtZSxtZW1vLGJ1YmJsZSk7cmV0dXJuIEV2ZW50LmV4dGVuZChldmVudCl9ZnVuY3Rpb24gZmlyZUV2ZW50X0RPTShlbGVtZW50LGV2ZW50TmFtZSxtZW1vLGJ1YmJsZSl7dmFyIGV2ZW50PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7ZXZlbnQuaW5pdEV2ZW50KCJkYXRhYXZhaWxhYmxlIixidWJibGUsdHJ1ZSk7ZXZlbnQuZXZlbnROYW1lPWV2ZW50TmFtZTtldmVudC5tZW1vPW1lbW87ZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtyZXR1cm4gZXZlbnR9ZnVuY3Rpb24gZmlyZUV2ZW50X0lFKGVsZW1lbnQsZXZlbnROYW1lLG1lbW8sYnViYmxlKXt2YXIgZXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtldmVudC5ldmVudFR5cGU9YnViYmxlPwoib25kYXRhYXZhaWxhYmxlIjoib25sb3NlY2FwdHVyZSI7ZXZlbnQuZXZlbnROYW1lPWV2ZW50TmFtZTtldmVudC5tZW1vPW1lbW87ZWxlbWVudC5maXJlRXZlbnQoZXZlbnQuZXZlbnRUeXBlLGV2ZW50KTtyZXR1cm4gZXZlbnR9dmFyIGZpcmVFdmVudD1kb2N1bWVudC5jcmVhdGVFdmVudD9maXJlRXZlbnRfRE9NOmZpcmVFdmVudF9JRTtFdmVudC5IYW5kbGVyPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihlbGVtZW50LGV2ZW50TmFtZSxzZWxlY3RvcixjYWxsYmFjayl7dGhpcy5lbGVtZW50PSQoZWxlbWVudCk7dGhpcy5ldmVudE5hbWU9ZXZlbnROYW1lO3RoaXMuc2VsZWN0b3I9c2VsZWN0b3I7dGhpcy5jYWxsYmFjaz1jYWxsYmFjazt0aGlzLmhhbmRsZXI9dGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpfSxzdGFydDpmdW5jdGlvbigpe0V2ZW50Lm9ic2VydmUodGhpcy5lbGVtZW50LHRoaXMuZXZlbnROYW1lLHRoaXMuaGFuZGxlcik7cmV0dXJuIHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXtFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMuZWxlbWVudCwKdGhpcy5ldmVudE5hbWUsdGhpcy5oYW5kbGVyKTtyZXR1cm4gdGhpc30saGFuZGxlRXZlbnQ6ZnVuY3Rpb24oZXZlbnQpe3ZhciBlbGVtZW50PUV2ZW50LmZpbmRFbGVtZW50KGV2ZW50LHRoaXMuc2VsZWN0b3IpO2lmKGVsZW1lbnQpdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuZWxlbWVudCxldmVudCxlbGVtZW50KX19KTtmdW5jdGlvbiBvbihlbGVtZW50LGV2ZW50TmFtZSxzZWxlY3RvcixjYWxsYmFjayl7ZWxlbWVudD0kKGVsZW1lbnQpO2lmKE9iamVjdC5pc0Z1bmN0aW9uKHNlbGVjdG9yKSYmT2JqZWN0LmlzVW5kZWZpbmVkKGNhbGxiYWNrKSljYWxsYmFjaz1zZWxlY3RvcixzZWxlY3Rvcj1udWxsO3JldHVybihuZXcgRXZlbnQuSGFuZGxlcihlbGVtZW50LGV2ZW50TmFtZSxzZWxlY3RvcixjYWxsYmFjaykpLnN0YXJ0KCl9T2JqZWN0LmV4dGVuZChFdmVudCxFdmVudC5NZXRob2RzKTtPYmplY3QuZXh0ZW5kKEV2ZW50LHtmaXJlOmZpcmUsb2JzZXJ2ZTpvYnNlcnZlLHN0b3BPYnNlcnZpbmc6c3RvcE9ic2VydmluZywKb246b259KTtFbGVtZW50LmFkZE1ldGhvZHMoe2ZpcmU6ZmlyZSxvYnNlcnZlOm9ic2VydmUsc3RvcE9ic2VydmluZzpzdG9wT2JzZXJ2aW5nLG9uOm9ufSk7T2JqZWN0LmV4dGVuZChkb2N1bWVudCx7ZmlyZTpmaXJlLm1ldGhvZGl6ZSgpLG9ic2VydmU6b2JzZXJ2ZS5tZXRob2RpemUoKSxzdG9wT2JzZXJ2aW5nOnN0b3BPYnNlcnZpbmcubWV0aG9kaXplKCksb246b24ubWV0aG9kaXplKCksbG9hZGVkOmZhbHNlfSk7aWYoR0xPQkFMLkV2ZW50KU9iamVjdC5leHRlbmQod2luZG93LkV2ZW50LEV2ZW50KTtlbHNlIEdMT0JBTC5FdmVudD1FdmVudDtHTE9CQUwuRXZlbnQuY2FjaGU9e307ZnVuY3Rpb24gZGVzdHJveUNhY2hlX0lFKCl7R0xPQkFMLkV2ZW50LmNhY2hlPW51bGx9aWYod2luZG93LmF0dGFjaEV2ZW50KXdpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLGRlc3Ryb3lDYWNoZV9JRSk7RElWPW51bGw7ZG9jRWw9bnVsbH0pKHRoaXMpOwooZnVuY3Rpb24oR0xPQkFMKXt2YXIgZG9jRWw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRD0ib25tb3VzZWVudGVyImluIGRvY0VsJiYib25tb3VzZWxlYXZlImluIGRvY0VsO2Z1bmN0aW9uIGlzU2ltdWxhdGVkTW91c2VFbnRlckxlYXZlRXZlbnQoZXZlbnROYW1lKXtyZXR1cm4hTU9VU0VFTlRFUl9NT1VTRUxFQVZFX0VWRU5UU19TVVBQT1JURUQmJihldmVudE5hbWU9PT0ibW91c2VlbnRlciJ8fGV2ZW50TmFtZT09PSJtb3VzZWxlYXZlIil9ZnVuY3Rpb24gY3JlYXRlUmVzcG9uZGVyKHVpZCxldmVudE5hbWUsaGFuZGxlcil7aWYoRXZlbnQuX2lzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSlyZXR1cm4gY3JlYXRlUmVzcG9uZGVyRm9yQ3VzdG9tRXZlbnQodWlkLGV2ZW50TmFtZSxoYW5kbGVyKTtpZihpc1NpbXVsYXRlZE1vdXNlRW50ZXJMZWF2ZUV2ZW50KGV2ZW50TmFtZSkpcmV0dXJuIGNyZWF0ZU1vdXNlRW50ZXJMZWF2ZVJlc3BvbmRlcih1aWQsCmV2ZW50TmFtZSxoYW5kbGVyKTtyZXR1cm4gZnVuY3Rpb24oZXZlbnQpe2lmKCFFdmVudC5jYWNoZSlyZXR1cm47dmFyIGVsZW1lbnQ9RXZlbnQuY2FjaGVbdWlkXS5lbGVtZW50O0V2ZW50LmV4dGVuZChldmVudCxlbGVtZW50KTtoYW5kbGVyLmNhbGwoZWxlbWVudCxldmVudCl9fWZ1bmN0aW9uIGNyZWF0ZVJlc3BvbmRlckZvckN1c3RvbUV2ZW50KHVpZCxldmVudE5hbWUsaGFuZGxlcil7cmV0dXJuIGZ1bmN0aW9uKGV2ZW50KXt2YXIgZWxlbWVudD1FdmVudC5jYWNoZVt1aWRdLmVsZW1lbnQ7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKGV2ZW50LmV2ZW50TmFtZSkpcmV0dXJuIGZhbHNlO2lmKGV2ZW50LmV2ZW50TmFtZSE9PWV2ZW50TmFtZSlyZXR1cm4gZmFsc2U7RXZlbnQuZXh0ZW5kKGV2ZW50LGVsZW1lbnQpO2hhbmRsZXIuY2FsbChlbGVtZW50LGV2ZW50KX19ZnVuY3Rpb24gY3JlYXRlTW91c2VFbnRlckxlYXZlUmVzcG9uZGVyKHVpZCxldmVudE5hbWUsaGFuZGxlcil7cmV0dXJuIGZ1bmN0aW9uKGV2ZW50KXt2YXIgZWxlbWVudD0KRXZlbnQuY2FjaGVbdWlkXS5lbGVtZW50O0V2ZW50LmV4dGVuZChldmVudCxlbGVtZW50KTt2YXIgcGFyZW50PWV2ZW50LnJlbGF0ZWRUYXJnZXQ7d2hpbGUocGFyZW50JiZwYXJlbnQhPT1lbGVtZW50KXRyeXtwYXJlbnQ9cGFyZW50LnBhcmVudE5vZGV9Y2F0Y2goZSl7cGFyZW50PWVsZW1lbnR9aWYocGFyZW50PT09ZWxlbWVudClyZXR1cm47aGFuZGxlci5jYWxsKGVsZW1lbnQsZXZlbnQpfX1HTE9CQUwuRXZlbnQuX2NyZWF0ZVJlc3BvbmRlcj1jcmVhdGVSZXNwb25kZXI7ZG9jRWw9bnVsbH0pKHRoaXMpOwooZnVuY3Rpb24oR0xPQkFMKXt2YXIgVElNRVI7ZnVuY3Rpb24gZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpe2lmKGRvY3VtZW50LmxvYWRlZClyZXR1cm47aWYoVElNRVIpd2luZG93LmNsZWFyVGltZW91dChUSU1FUik7ZG9jdW1lbnQubG9hZGVkPXRydWU7ZG9jdW1lbnQuZmlyZSgiZG9tOmxvYWRlZCIpfWZ1bmN0aW9uIGNoZWNrUmVhZHlTdGF0ZSgpe2lmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXtkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixjaGVja1JlYWR5U3RhdGUpO2ZpcmVDb250ZW50TG9hZGVkRXZlbnQoKX19ZnVuY3Rpb24gcG9sbERvU2Nyb2xsKCl7dHJ5e2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe1RJTUVSPXBvbGxEb1Njcm9sbC5kZWZlcigpO3JldHVybn1maXJlQ29udGVudExvYWRlZEV2ZW50KCl9aWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2ZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKcmV0dXJufWlmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZmlyZUNvbnRlbnRMb2FkZWRFdmVudCxmYWxzZSk7ZWxzZXtkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixjaGVja1JlYWR5U3RhdGUpO2lmKHdpbmRvdz09dG9wKVRJTUVSPXBvbGxEb1Njcm9sbC5kZWZlcigpfUV2ZW50Lm9ic2VydmUod2luZG93LCJsb2FkIixmaXJlQ29udGVudExvYWRlZEV2ZW50KX0pKHRoaXMpO0VsZW1lbnQuYWRkTWV0aG9kcygpO0hhc2gudG9RdWVyeVN0cmluZz1PYmplY3QudG9RdWVyeVN0cmluZzt2YXIgVG9nZ2xlPXtkaXNwbGF5OkVsZW1lbnQudG9nZ2xlfTtFbGVtZW50Lk1ldGhvZHMuY2hpbGRPZj1FbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mOwp2YXIgSW5zZXJ0aW9uPXtCZWZvcmU6ZnVuY3Rpb24oZWxlbWVudCxjb250ZW50KXtyZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCx7YmVmb3JlOmNvbnRlbnR9KX0sVG9wOmZ1bmN0aW9uKGVsZW1lbnQsY29udGVudCl7cmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQse3RvcDpjb250ZW50fSl9LEJvdHRvbTpmdW5jdGlvbihlbGVtZW50LGNvbnRlbnQpe3JldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LHtib3R0b206Y29udGVudH0pfSxBZnRlcjpmdW5jdGlvbihlbGVtZW50LGNvbnRlbnQpe3JldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LHthZnRlcjpjb250ZW50fSl9fTt2YXIgJGNvbnRpbnVlPW5ldyBFcnJvcignInRocm93ICRjb250aW51ZSIgaXMgZGVwcmVjYXRlZCwgdXNlICJyZXR1cm4iIGluc3RlYWQnKTsKdmFyIFBvc2l0aW9uPXtpbmNsdWRlU2Nyb2xsT2Zmc2V0czpmYWxzZSxwcmVwYXJlOmZ1bmN0aW9uKCl7dGhpcy5kZWx0YVg9d2luZG93LnBhZ2VYT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0fHwwO3RoaXMuZGVsdGFZPXdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3B8fDB9LHdpdGhpbjpmdW5jdGlvbihlbGVtZW50LHgseSl7aWYodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cylyZXR1cm4gdGhpcy53aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzKGVsZW1lbnQseCx5KTt0aGlzLnhjb21wPXg7dGhpcy55Y29tcD15O3RoaXMub2Zmc2V0PUVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTtyZXR1cm4geT49dGhpcy5vZmZzZXRbMV0mJnk8dGhpcy5vZmZzZXRbMV0rZWxlbWVudC5vZmZzZXRIZWlnaHQmJgp4Pj10aGlzLm9mZnNldFswXSYmeDx0aGlzLm9mZnNldFswXStlbGVtZW50Lm9mZnNldFdpZHRofSx3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzOmZ1bmN0aW9uKGVsZW1lbnQseCx5KXt2YXIgb2Zmc2V0Y2FjaGU9RWxlbWVudC5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1lbnQpO3RoaXMueGNvbXA9eCtvZmZzZXRjYWNoZVswXS10aGlzLmRlbHRhWDt0aGlzLnljb21wPXkrb2Zmc2V0Y2FjaGVbMV0tdGhpcy5kZWx0YVk7dGhpcy5vZmZzZXQ9RWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpO3JldHVybiB0aGlzLnljb21wPj10aGlzLm9mZnNldFsxXSYmdGhpcy55Y29tcDx0aGlzLm9mZnNldFsxXStlbGVtZW50Lm9mZnNldEhlaWdodCYmdGhpcy54Y29tcD49dGhpcy5vZmZzZXRbMF0mJnRoaXMueGNvbXA8dGhpcy5vZmZzZXRbMF0rZWxlbWVudC5vZmZzZXRXaWR0aH0sb3ZlcmxhcDpmdW5jdGlvbihtb2RlLGVsZW1lbnQpe2lmKCFtb2RlKXJldHVybiAwO2lmKG1vZGU9PQoidmVydGljYWwiKXJldHVybih0aGlzLm9mZnNldFsxXStlbGVtZW50Lm9mZnNldEhlaWdodC10aGlzLnljb21wKS9lbGVtZW50Lm9mZnNldEhlaWdodDtpZihtb2RlPT0iaG9yaXpvbnRhbCIpcmV0dXJuKHRoaXMub2Zmc2V0WzBdK2VsZW1lbnQub2Zmc2V0V2lkdGgtdGhpcy54Y29tcCkvZWxlbWVudC5vZmZzZXRXaWR0aH0sY3VtdWxhdGl2ZU9mZnNldDpFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCxwb3NpdGlvbmVkT2Zmc2V0OkVsZW1lbnQuTWV0aG9kcy5wb3NpdGlvbmVkT2Zmc2V0LGFic29sdXRpemU6ZnVuY3Rpb24oZWxlbWVudCl7UG9zaXRpb24ucHJlcGFyZSgpO3JldHVybiBFbGVtZW50LmFic29sdXRpemUoZWxlbWVudCl9LHJlbGF0aXZpemU6ZnVuY3Rpb24oZWxlbWVudCl7UG9zaXRpb24ucHJlcGFyZSgpO3JldHVybiBFbGVtZW50LnJlbGF0aXZpemUoZWxlbWVudCl9LHJlYWxPZmZzZXQ6RWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQsCm9mZnNldFBhcmVudDpFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50LHBhZ2U6RWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LGNsb25lOmZ1bmN0aW9uKHNvdXJjZSx0YXJnZXQsb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtyZXR1cm4gRWxlbWVudC5jbG9uZVBvc2l0aW9uKHRhcmdldCxzb3VyY2Usb3B0aW9ucyl9fTsKaWYoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1mdW5jdGlvbihpbnN0YW5jZU1ldGhvZHMpe2Z1bmN0aW9uIGl0ZXIobmFtZSl7cmV0dXJuIG5hbWUuYmxhbmsoKT9udWxsOiJbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICIrbmFtZSsiICcpXSJ9aW5zdGFuY2VNZXRob2RzLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9UHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aD9mdW5jdGlvbihlbGVtZW50LGNsYXNzTmFtZSl7Y2xhc3NOYW1lPWNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7dmFyIGNvbmQ9L1xzLy50ZXN0KGNsYXNzTmFtZSk\/JHcoY2xhc3NOYW1lKS5tYXAoaXRlcikuam9pbigiIik6aXRlcihjbGFzc05hbWUpO3JldHVybiBjb25kP2RvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgoIi4vLyoiK2NvbmQsZWxlbWVudCk6W119OmZ1bmN0aW9uKGVsZW1lbnQsY2xhc3NOYW1lKXtjbGFzc05hbWU9CmNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7dmFyIGVsZW1lbnRzPVtdLGNsYXNzTmFtZXM9L1xzLy50ZXN0KGNsYXNzTmFtZSk\/JHcoY2xhc3NOYW1lKTpudWxsO2lmKCFjbGFzc05hbWVzJiYhY2xhc3NOYW1lKXJldHVybiBlbGVtZW50czt2YXIgbm9kZXM9JChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2NsYXNzTmFtZT0iICIrY2xhc3NOYW1lKyIgIjtmb3IodmFyIGk9MCxjaGlsZCxjbjtjaGlsZD1ub2Rlc1tpXTtpKyspaWYoY2hpbGQuY2xhc3NOYW1lJiYoY249IiAiK2NoaWxkLmNsYXNzTmFtZSsiICIpJiYoY24uaW5jbHVkZShjbGFzc05hbWUpfHxjbGFzc05hbWVzJiZjbGFzc05hbWVzLmFsbChmdW5jdGlvbihuYW1lKXtyZXR1cm4hbmFtZS50b1N0cmluZygpLmJsYW5rKCkmJmNuLmluY2x1ZGUoIiAiK25hbWUrIiAiKX0pKSllbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7cmV0dXJuIGVsZW1lbnRzfTtyZXR1cm4gZnVuY3Rpb24oY2xhc3NOYW1lLApwYXJlbnRFbGVtZW50KXtyZXR1cm4gJChwYXJlbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5KS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSl9fShFbGVtZW50Lk1ldGhvZHMpO0VsZW1lbnQuQ2xhc3NOYW1lcz1DbGFzcy5jcmVhdGUoKTsKRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZT17aW5pdGlhbGl6ZTpmdW5jdGlvbihlbGVtZW50KXt0aGlzLmVsZW1lbnQ9JChlbGVtZW50KX0sX2VhY2g6ZnVuY3Rpb24oaXRlcmF0b3IsY29udGV4dCl7dGhpcy5lbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0aW9uKG5hbWUpe3JldHVybiBuYW1lLmxlbmd0aD4wfSkuX2VhY2goaXRlcmF0b3IsY29udGV4dCl9LHNldDpmdW5jdGlvbihjbGFzc05hbWUpe3RoaXMuZWxlbWVudC5jbGFzc05hbWU9Y2xhc3NOYW1lfSxhZGQ6ZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpe2lmKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkpcmV0dXJuO3RoaXMuc2V0KCRBKHRoaXMpLmNvbmNhdChjbGFzc05hbWVUb0FkZCkuam9pbigiICIpKX0scmVtb3ZlOmZ1bmN0aW9uKGNsYXNzTmFtZVRvUmVtb3ZlKXtpZighdGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvUmVtb3ZlKSlyZXR1cm47dGhpcy5zZXQoJEEodGhpcykud2l0aG91dChjbGFzc05hbWVUb1JlbW92ZSkuam9pbigiICIpKX0sCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuICRBKHRoaXMpLmpvaW4oIiAiKX19O09iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSxFbnVtZXJhYmxlKTsKKGZ1bmN0aW9uKCl7d2luZG93LlNlbGVjdG9yPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihleHByZXNzaW9uKXt0aGlzLmV4cHJlc3Npb249ZXhwcmVzc2lvbi5zdHJpcCgpfSxmaW5kRWxlbWVudHM6ZnVuY3Rpb24ocm9vdEVsZW1lbnQpe3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KHRoaXMuZXhwcmVzc2lvbixyb290RWxlbWVudCl9LG1hdGNoOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2goZWxlbWVudCx0aGlzLmV4cHJlc3Npb24pfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cHJlc3Npb259LGluc3BlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4iIzxTZWxlY3RvcjogIit0aGlzLmV4cHJlc3Npb24rIj4ifX0pO09iamVjdC5leHRlbmQoU2VsZWN0b3Ise21hdGNoRWxlbWVudHM6ZnVuY3Rpb24oZWxlbWVudHMsZXhwcmVzc2lvbil7dmFyIG1hdGNoPVByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaCxyZXN1bHRzPQpbXTtmb3IodmFyIGk9MCxsZW5ndGg9ZWxlbWVudHMubGVuZ3RoO2k8bGVuZ3RoO2krKyl7dmFyIGVsZW1lbnQ9ZWxlbWVudHNbaV07aWYobWF0Y2goZWxlbWVudCxleHByZXNzaW9uKSlyZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpfXJldHVybiByZXN1bHRzfSxmaW5kRWxlbWVudDpmdW5jdGlvbihlbGVtZW50cyxleHByZXNzaW9uLGluZGV4KXtpbmRleD1pbmRleHx8MDt2YXIgbWF0Y2hJbmRleD0wLGVsZW1lbnQ7Zm9yKHZhciBpPTAsbGVuZ3RoPWVsZW1lbnRzLmxlbmd0aDtpPGxlbmd0aDtpKyspe2VsZW1lbnQ9ZWxlbWVudHNbaV07aWYoUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsZXhwcmVzc2lvbikmJmluZGV4PT09bWF0Y2hJbmRleCsrKXJldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KX19LGZpbmRDaGlsZEVsZW1lbnRzOmZ1bmN0aW9uKGVsZW1lbnQsZXhwcmVzc2lvbnMpe3ZhciBzZWxlY3Rvcj1leHByZXNzaW9ucy50b0FycmF5KCkuam9pbigiLCAiKTsKcmV0dXJuIFByb3RvdHlwZS5TZWxlY3Rvci5zZWxlY3Qoc2VsZWN0b3IsZWxlbWVudHx8ZG9jdW1lbnQpfX0pfSkoKTsK\"><\/script>\n  <\/head>\n  <body>\n    <form method=\"get\" onsubmit=\"return false;\">\n      <h1>Random Dungeon Generator<\/h1>\n      <table id=\"form\" class=\"center\">\n        <tr>\n          <td class=\"key\">Dungeon Name:<\/td>\n          <td colspan=\"5\" class=\"value\"><input id=\"dungeon_name\" size=\"60\" \/> &nbsp; <input type=\"button\" id=\"new_name\" value=\"New\" \/> <\/td>\n        <\/tr>\n        <tr>\n          <td class=\"key\">Map Style:<\/td>\n          <td class=\"value\"><select id=\"map_style\"><\/select><\/td>\n          <td class=\"key\">Grid:<\/td>\n          <td class=\"value\"><select id=\"grid\"><\/select><\/td>\n        <\/tr>\n        <tr>\n          <td class=\"key\">Dungeon Layout:<\/td>\n          <td class=\"value\"><select id=\"dungeon_layout\"><\/select><\/td>\n          <td class=\"key\">Size:<\/td>\n          <td class=\"value\"><select id=\"dungeon_size\"><\/select><\/td>\n          <td class=\"key\">Stairs?<\/td>\n          <td class=\"value\"><select id=\"add_stairs\"><\/select><\/td>\n        <\/tr>\n        <tr>\n          <td class=\"key\">Room Layout:<\/td>\n          <td class=\"value\"><select id=\"room_layout\"><\/select><\/td>\n          <td class=\"key\">Size:<\/td>\n          <td class=\"value\"><select id=\"room_size\"><\/select><\/td>\n          <td class=\"key\">Doors:<\/td>\n          <td class=\"value\"><select id=\"doors\"><\/select><\/td>\n        <\/tr>\n        <tr>\n          <td class=\"key\">Corridors:<\/td>\n          <td class=\"value\"><select id=\"corridor_layout\"><\/select><\/td>\n          <td class=\"key\">Trim?<\/td>\n          <td class=\"value\"><select id=\"remove_deadends\"><\/select><\/td>\n        <\/tr>\n        <tr>\n          <td colspan=\"6\"><\/td>\n        <\/tr>\n        <tr>\n          <td colspan=\"6\" class=\"center\" style=\"background: #dedede;\">\n            <input type=\"button\" value=\"Save as PNG\" onclick=\"save_map();\" \/>\n            &nbsp; <input type=\"button\" value=\"Print\" onclick=\"window.print();\" \/>\n          <\/td>\n        <\/tr>\n      <\/table>\n    <\/form>\n    <div class=\"center\">\n      <h1 id=\"dungeon_title\" class=\"title\"><\/h1>\n      <canvas id=\"map\" width=\"1\" height=\"1\"><p>Your web browser does not appear to support the HTML5 &lt;canvas&gt; element.<\/p><\/canvas>\n      <p><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhHAIfAMQAAIqJiry8vEdFR2hnaO7u7t7d3hUTFZuamyUkJaurq83MzTY1NlhWWHl4eczOzPz+\/AQCBP\/\/\/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAcAh8AAAX\/oAONZGmOTqSubOu+cCzPrXjeZErvfO\/buJvORywWgUHT0MhswpDJnHNKVUGjkGV1+8MqueCuVxouz65RrXm9QifV7LU7CI+X57i6HYwX7u19J3p\/VYFfhHJjZIh3iiiMZoYlg5BMkouVW5ePmVybWZ2ejqChhaOUpTyfqKk0q61Tr7BNsrNGtbZEuLk9u7w7vr9np8JiiqzFVsTJwMvMw47IyQ7U1dQ51tXPrtnXKN3SxeBA49tn4Njd5jLj6dnrMe3f6vAvDg\/4+Q8k+vnhwvf67Rsh8MG\/XwH78RN4kFdCfQv7Ncz1MF9EfRNtVcR30V89ewU74ss4a+NACAVJ\/8IyKdLgRxcsCTJ8WSOkTIk0WcREOTOnFZs8cfqMsDPlUKJAjQ4t2tMnU6FOkzbNabKgx6UQcWA8+jDIVqwWtV6NGtKqylZVrboEq3Yqza5lx1KFaLGu3Ld0BQZdS1ahyLOpqu792rctYRcAEuxQ0CAUXL2HIwiYLGBAgG2P99kd2UJAEc89QHvKqzByhAaUJzeOc+AALciD7wZYMIIBgSoKCrBJa7YzZQaXaSje0VpyBMaFDLtdQWDBgh0BRFfKTJqvCggBsh8wMHwa6aB7tUAoMr5H+dGbq6tRkB17AAV2AAB4XTo2Z+YILhNAXUVA8EhW2WddBO4FsJ1uMkTHg\/98BEZAAHxU8KYUYgcMAGEBCQzAQAEKDCDAfNEdUBmEiFCXnngsKICACgEwIIBrDgJQmW4YaoggIZmBF9l5K7T4ogr7VXZbeQnMR4CMAyDYoQAJ8JhceifGcF6NGy7JAHwH+DgcANFdqUIBHgJwWwRINjCfJbD11qN0Z4L54ZgJuKhYAHEOEIGPrgWAQJJyKAfVdSyYGYGbYt5Z5wAIuLbkfAXASCaZ843XqAoyenmEn6apgAABGbIIAQAHEGAAlwtwCYFlAzzHiIkc7djCAuwZcEACpUoGHAAGEBDAp47i+F2ULDgZgKy0zldZAB42uB18DNyaq6iJ0RZGQF7c98L\/ebuCCm0AAKwoQKIJGHAZBEziSgABCHCZLAALcPspfX7Zt4SoAyQwpoPpIuvZsAmEyy13CSgg62xc7nnjtAGquQKPA4g5qo9kAoxoqA+XqiCgDI6n4AHtdnsLpnexaGcEC9w2mwoVfpndioCuWh2wC3eGLIwFIFDzCgNkqSokOcLcMs4028xyBK5BsOygQ+ec8qBORvhyqyHHzKKqnH453oco2wkBhEqPHIHQCDYMb31uKcCAARB4ufTXYMIYQAEArJbzl97+dwfI1l4nHwCIErC2zXGz6NnSBWQn2ngZ3+mZjPAd3AveA6qA6GSyKk7pmYJLXeLTmt3lZLv+LXwx\/6Sju7yZjp7LLLp0BBqQ650m7K25JpyHJ+WaK8gIAQJXB6fgeXubsGvumF9aVmx1dJgrAMKHTrwKApggmd0Ix+XWp\/KFCukK\/jFoufeZYxyp5QQwsHvxj+OthqjZGfjcxYGjPHrTgNTu6goFGBABA8Plr8DODSvd5k7nswaxgH9fMsD\/VmCvrfHtODvTTfwIQD8nsKpzeWsBtkDDseBcbThxItCYzBS\/QUXgdadB3w8ShjwWHKB4HVuNCRE4KG6diYYmdB6A1KdBxMgQAQrwnoJKmKXDbU9jnjmX3xRoPJCpoYQkYw9o8ncZGc2PZ\/ZLnQr+Nx+OFYAAA7BTuu5kgP\/Csc5XBIRaBp3kRTCKEUS5Kk+7vsao\/NTsMgOo4NjsYzsYbJBSDHBQHiVTsgIsQDGnupPNqEjG\/QzgQaMaG0dasgSBXShXjByW3xbwRQbIjmicJJNnmLSbhE3oZ\/gTF5lWJMTnMJJxZTwN4sanoDDii0Tpc6ILgMgCvo0uAbwTgBRn94euiGWNJBgjpdD2yONEDwFzOmMxs3KDHZWgisy8jQKeiUgWbWqbEIhkBIAJgQboEU1hqWbUfnYxAkTPAA0oY2Vcd6Zy7g6EvIOmIHfnSUlC6S7boRyMyKnPiJ3qSJjDFbngw7xe8QFyKHIBOYW5PXytaKLwiaesZtkgBbnkM5wqBIZU\/oQXvdwkU\/V4CkrhodJ1+kCHqKyfSeX1guzcixktzeBLchq5j\/AUMKX4KVdGutLQUO+c1YvXKUuq1OX4lKguXYdQ2ULNpe4UqjotwgEcF9I+zdSqT\/2qU1OKjnm8YyllzQI4uJLWcqC1G+6wBlvhala5vjUbcdXGUpxBFb6+xa87BaxPBZtSwrLUsFJFrDmCUdhocEWxmIHsMxh7WMfu1bJOkSxONTsNzorDswABLUJE6xDSUsS0GkFtSVS7EtaixbWBgW1QZesY2naCsonFbF91+1feBta3gwVuPUIAADs=\" alt=\"\" \/><\/p>\n      <p>Random Dungeon Generator<br \/>http:\/\/donjon.bin.sh\/<\/p>\n    <\/div>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIHBybmcuanMKLy8gc2VlZGVkIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgp2YXIgc2VlZD1EYXRlLm5vdygpO2Z1bmN0aW9uIGluaXRfc2VlZChhKXtyZXR1cm4gc2VlZD10eXBlb2YgYT09Im51bWJlciI\/TWF0aC5mbG9vcihhKTp0eXBlb2YgYT09InN0cmluZyI\/aGFzaF9zdHJpbmcoNDIsYSk6RGF0ZS5ub3coKX1mdW5jdGlvbiBoYXNoX3N0cmluZyhhLGMpe3ZhciBiO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe2E9KGE8PDUpLWErYy5jaGFyQ29kZUF0KGIpO2EmPTIxNDc0ODM2NDd9cmV0dXJuIGF9ZnVuY3Rpb24gcmFuZG9tKGEpe3NlZWQ9MTEwMzUxNTI0NSpzZWVkKzEyMzQ1O3NlZWQmPTIxNDc0ODM2NDc7cmV0dXJuIGE+MT8oc2VlZD4+OCklYTowfTsK\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGRpY2UuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKdmFyIGZuPS8oW2Etel0qKVwoKFteKCldKj8pXCkvLGRpY2U9LyhcZCopZChcZCspLyxpbmNyPS8oWystXT9cZCtcLlxkK3xbKy1dP1xkKykoXCtcK3wtLSkvLG11bHQ9LyhbKy1dP1xkK1wuXGQrfFsrLV0\/XGQrKVxzKihcKnxcL3wlKVxzKihbKy1dP1xkK1wuXGQrfFsrLV0\/XGQrKS8sYWRkPS8oWystXT9cZCtcLlxkK3xbKy1dP1xkKylccyooXCt8LSlccyooWystXT9cZCtcLlxkK3xbKy1dP1xkKykvLGZwPS8oXGQrXC5cZFxkXGQrKS8sbWF4X2RpY2U9MUUzOwpmdW5jdGlvbiByb2xsX2RpY2UoYil7Zm9yKHZhciBhO2E9Zm4uZXhlYyhiKTspe2E9cmRfZm4oYVsxXSxhWzJdKTtiPWIucmVwbGFjZShmbixhKX1mb3IoO2E9ZGljZS5leGVjKGIpOyl7YT1yZF9kaWNlKGFbMV0sYVsyXSk7Yj1iLnJlcGxhY2UoZGljZSxhKX1mb3IoO2E9aW5jci5leGVjKGIpOyl7YT1yZF9tYXRoKGFbMV0sYVsyXSk7Yj1iLnJlcGxhY2UoaW5jcixhKX1mb3IoO2E9bXVsdC5leGVjKGIpOyl7YT1yZF9tYXRoKGFbMV0sYVsyXSxhWzNdKTtiPWIucmVwbGFjZShtdWx0LGEpfWZvcig7YT1hZGQuZXhlYyhiKTspe2E9cmRfbWF0aChhWzFdLGFbMl0sYVszXSk7Yj1iLnJlcGxhY2UoYWRkLGEpfWZvcig7YT1mcC5leGVjKGIpOyl7YT1NYXRoLmZsb29yKGFbMV0qMTAwKzAuNSkvMTAwO2I9Yi5yZXBsYWNlKGZwLGEpfXJldHVybiBifQpmdW5jdGlvbiByZF9mbihiLGEpe2E9cm9sbF9kaWNlKGEpO2lmKGI9PSJpbnQiKXJldHVybiBNYXRoLmZsb29yKGEpO2Vsc2UgaWYoYj09InJvdW5kIilyZXR1cm4gTWF0aC5mbG9vcihhKzAuNSk7ZWxzZSBpZihiPT0ic3FydCIpcmV0dXJuIE1hdGguc3FydChhKTtyZXR1cm4gYX1mdW5jdGlvbiByZF9kaWNlKGIsYSl7Yj1wYXJzZUludChiKTtpZihpc05hTihiKXx8YjwxKWI9MTthPXBhcnNlSW50KGEpO2lmKGlzTmFOKGEpfHxhPDApcmV0dXJuIDA7aWYoYj5tYXhfZGljZSlyZXR1cm4gMDt2YXIgYz0wLGQ7Zm9yKGQ9MDtkPGI7ZCsrKWMrPXJkX3JhbmQoYSkrMTtyZXR1cm4gY31mdW5jdGlvbiByZF9yYW5kKGIpe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYil9CmZ1bmN0aW9uIHJkX21hdGgoYixhLGMpe2I9cGFyc2VGbG9hdChiKTtpZihpc05hTihiKSliPTA7Yz1wYXJzZUZsb2F0KGMpO2lmKGlzTmFOKGMpKWM9MDtpZihhPT0iKysiKXJldHVybisrYjtpZihhPT0iLS0iKXJldHVybi0tYjtpZihhPT0iKiIpcmV0dXJuIGIqYztpZihhPT0iLyIpcmV0dXJuIGIvYztpZihhPT0iJSIpcmV0dXJuIGIlYztpZihhPT0iKyIpcmV0dXJuIGIrYztpZihhPT0iLSIpcmV0dXJuIGItYztyZXR1cm4gMH07Cg==\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGdlbmVyYXRvci5qcwovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgpmdW5jdGlvbiBnZW5lcmF0ZV90ZXh0KGEpe2lmKGE9Z2VuX2RhdGFbYV0paWYoYT1zZWxlY3RfZnJvbShhKSl7dmFyIGM9bmV3X3RyYWNlKCk7cmV0dXJuIGV4cGFuZF90b2tlbnMoYSxjKX1yZXR1cm4iIn1mdW5jdGlvbiBzZWxlY3RfZnJvbShhKXtyZXR1cm4gYS5jb25zdHJ1Y3Rvcj09QXJyYXk\/c2VsZWN0X2Zyb21fYXJyYXkoYSk6c2VsZWN0X2Zyb21fdGFibGUoYSl9ZnVuY3Rpb24gc2VsZWN0X2Zyb21fYXJyYXkoYSl7cmV0dXJuIGFbcmFuZG9tKGEubGVuZ3RoKV19ZnVuY3Rpb24gc2VsZWN0X2Zyb21fdGFibGUoYSl7dmFyIGM7aWYoYz1zY2FsZV90YWJsZShhKSl7Yz1yYW5kb20oYykrMTt2YXIgYjtmb3IoYiBpbiBhKXt2YXIgZD1rZXlfcmFuZ2UoYik7aWYoYz49ZFswXSYmYzw9ZFsxXSlyZXR1cm4gYVtiXX19cmV0dXJuIiJ9CmZ1bmN0aW9uIHNjYWxlX3RhYmxlKGEpe3ZhciBjPTAsYjtmb3IoYiBpbiBhKXt2YXIgZD1rZXlfcmFuZ2UoYik7aWYoZFsxXT5jKWM9ZFsxXX1yZXR1cm4gY31mdW5jdGlvbiBrZXlfcmFuZ2UoYSl7dmFyIGM7cmV0dXJuKGM9LyhcZCspLTAwLy5leGVjKGEpKT9bcGFyc2VJbnQoY1sxXSwxMCksMTAwXTooYz0vKFxkKyktKFxkKykvLmV4ZWMoYSkpP1twYXJzZUludChjWzFdLDEwKSxwYXJzZUludChjWzJdLDEwKV06YT09IjAwIj9bMTAwLDEwMF06W3BhcnNlSW50KGEsMTApLHBhcnNlSW50KGEsMTApXX1mdW5jdGlvbiBuZXdfdHJhY2UoKXtyZXR1cm57ZXhjbHVkZTp7fSwidmFyIjp7fX19ZnVuY3Rpb24gbG9jYWxfdHJhY2UoYSl7dmFyIGM9T2JqZWN0LmNsb25lKGEpO2NbInZhciJdPU9iamVjdC5jbG9uZShhWyJ2YXIiXSk7cmV0dXJuIGN9CmZ1bmN0aW9uIGV4cGFuZF90b2tlbnMoYSxjKXtmb3IodmFyIGI9L1wkeyAoW157fV0rKSB9LyxkO2Q9Yi5leGVjKGEpOyl7ZD1kWzFdO3ZhciBlO2E9KGU9ZXhwYW5kX3Rva2VuKGQsYykpP2EucmVwbGFjZSgiJHsgIitkKyIgfSIsZSk6YS5yZXBsYWNlKCJ7IitkKyJ9IixkKX1yZXR1cm4gYX0KZnVuY3Rpb24gZXhwYW5kX3Rva2VuKGEsYyl7dmFyIGIsZDtpZihiPS9eXGQqZFxkKy8uZXhlYyhhKSlyZXR1cm4gcm9sbF9kaWNlKGJbMV0pO2Vsc2UgaWYoYj0vXmNhbGMgKC4rKS8uZXhlYyhhKSlyZXR1cm4gcm9sbF9kaWNlKGJbMV0pO2Vsc2UgaWYoYj0vXihcZCspIHggKC4rKS8uZXhlYyhhKSlyZXR1cm4gZXhwYW5kX3goYlsxXSxiWzJdLGMpO2Vsc2UgaWYoYj0vXlxbICguKykgXF0vLmV4ZWMoYSkpe2Q9YlsxXS5zcGxpdCgvLFxzKi8pO3JldHVybiBleHBhbmRfdG9rZW5zKHNlbGVjdF9mcm9tX2FycmF5KGQpLGMpfWVsc2UgaWYoZD1nZW5fZGF0YVthXSlyZXR1cm4gZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSxjKTtlbHNlIGlmKGI9L15hbHQgKC4rKSBkZWYgKC4rKS8uZXhlYyhhKSlyZXR1cm4oZD1nZW5fZGF0YVtiWzFdXSk\/ZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSxjKTooZD1nZW5fZGF0YVtiWzJdXSk\/ZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSwKYyk6YlsyXTtlbHNlIGlmKGI9L151bmlxdWUgKC4rKS8uZXhlYyhhKSlyZXR1cm4gZXhwYW5kX3VuaXF1ZShiWzFdLGMpO2Vsc2UgaWYoYj0vXmxvY2FsICguKykvLmV4ZWMoYSkpe2E9bG9jYWxfdHJhY2UoYyk7cmV0dXJuIGV4cGFuZF90b2tlbihiWzFdLGEpfWVsc2UgaWYoYj0vXm5ldyAoLispLy5leGVjKGEpKXthPW5ld190cmFjZSgpO3JldHVybiBleHBhbmRfdG9rZW4oYlsxXSxhKX1lbHNlIGlmKGI9L15zZXQgKFx3KykgPSAoLis\/KSBpbiAoLispLy5leGVjKGEpKXtjWyJ2YXIiXVtiWzFdXT1iWzJdO3JldHVybiBleHBhbmRfdG9rZW4oYlszXSxjKX1lbHNlIGlmKGI9L15zZXQgKFx3KykgPSAoLispLy5leGVjKGEpKXJldHVybiBzZXRfdmFyKGJbMV0sYlsyXSxjKTtlbHNlIGlmKGI9L15nZXQgKFx3KykgZGVmICguKykvLmV4ZWMoYSkpcmV0dXJuIGNbInZhciJdW2JbMV1dfHxiWzJdO2Vsc2UgaWYoYj0vXmdldCAoXHcrKSBmaXggKC4rKS8uZXhlYyhhKSlyZXR1cm4gY1sidmFyIl1bYlsxXV18fApzZXRfdmFyKGJbMV0sYlsyXSxjKTtlbHNlIGlmKGI9L15nZXQgKFx3KykvLmV4ZWMoYSkpcmV0dXJuIGNbInZhciJdW2JbMV1dO2Vsc2UgaWYoYj0vXnNoaWZ0IChcdyspID0gKC4rKS8uZXhlYyhhKSl7Y1sidmFyIl1bYlsxXV09YlsyXS5zcGxpdCgvLFxzKi8pO3JldHVybiBjWyJ2YXIiXVtiWzFdXS5zaGlmdCgpfWVsc2UgaWYoYj0vXnNoaWZ0IChcdyspLy5leGVjKGEpKXJldHVybiBjWyJ2YXIiXVtiWzFdXS5zaGlmdCgpO2Vsc2UgaWYoYj0vXmFuICguKykvLmV4ZWMoYSkpcmV0dXJuIGFvcmFuKGV4cGFuZF90b2tlbihiWzFdLGMpKTtlbHNlIGlmKGI9L15BbiAoLispLy5leGVjKGEpKXJldHVybiB1Y2ZpcnN0KGFvcmFuKGV4cGFuZF90b2tlbihiWzFdLGMpKSk7ZWxzZSBpZihiPS9ebnQgKC4rKS8uZXhlYyhhKSlyZXR1cm4gbm90aGUoZXhwYW5kX3Rva2VuKGJbMV0sYykpO2Vsc2UgaWYoYj0vXmxjICguKykvLmV4ZWMoYSkpcmV0dXJuIGxjKGV4cGFuZF90b2tlbihiWzFdLGMpKTsKZWxzZSBpZihiPS9ebGYgKC4rKS8uZXhlYyhhKSlyZXR1cm4gaW5saW5lX2Nhc2UoZXhwYW5kX3Rva2VuKGJbMV0sYykpO2Vsc2UgaWYoYj0vXmx0ICguKykvLmV4ZWMoYSkpcmV0dXJuIGx0aGUoZXhwYW5kX3Rva2VuKGJbMV0sYykpO2Vsc2UgaWYoYj0vXnVjICguKykvLmV4ZWMoYSkpcmV0dXJuIHVjKGV4cGFuZF90b2tlbihiWzFdLGMpKTtlbHNlIGlmKGI9L151ZiAoLispLy5leGVjKGEpKXJldHVybiB1Y2ZpcnN0KGV4cGFuZF90b2tlbihiWzFdLGMpKTtlbHNlIGlmKGI9L15zYyAoLispLy5leGVjKGEpKXJldHVybiB1Y2ZpcnN0KGxjKGV4cGFuZF90b2tlbihiWzFdLGMpKSk7ZWxzZSBpZihiPS9edGMgKC4rKS8uZXhlYyhhKSlyZXR1cm4gdGl0bGVfY2FzZShleHBhbmRfdG9rZW4oYlsxXSxjKSk7ZWxzZSBpZihiPS9eZ2VuX25hbWUgKC4rKS8uZXhlYyhhKSl7Yj1iWzFdLnJlcGxhY2UoLywuKi8sIiIpO3JldHVybiBnZW5lcmF0ZV9uYW1lKGIpfXJldHVybiBhfQpmdW5jdGlvbiBleHBhbmRfeChhLGMsYil7Zm9yKHZhciBkPXt9LGU9W10saT1iLmNvbW1hfHwiLCAiO21hdGNoPS9eKGFuZHxsaXRlcmFsfHVuaXF1ZSkgKC4rKS8uZXhlYyhjKTspe29wdFttYXRjaFsxXV09dHJ1ZTtjPW1hdGNoWzJdfXZhciBoO2ZvcihoPTA7aDxhO2grKyl7dmFyIGY9bmV3IFN0cmluZyhjKTtmPW9wdC51bmlxdWU\/ZXhwYW5kX3VuaXF1ZShmLGIpOmV4cGFuZF90b2tlbihmLGIpO2lmKG9wdC5saXRlcmFsKWUucHVzaChmKTtlbHNlIGlmKG1hdGNoPS9eKFxkKykgeCAoLispLylkW21hdGNoWzJdXSs9cGFyc2VJbnQobWF0Y2hbMV0sMTApO2Vsc2UgZFtmXSs9MX0kSChkKS5rZXlzKCkuc29ydCgpLmVhY2goZnVuY3Rpb24oZyl7ZFtnXT4xP2UucHVzaChbZFtnXSxnXS5qb2luKCIgeCAiKSk6ZS5wdXNoKGcpfSk7aWYob3B0LmFuZCl7YT1lLnBvcCgpO3JldHVybiBlLmxlbmd0aD9bZS5qb2luKGkpLGFdLmpvaW4oIiBhbmQgIik6YX1lbHNlIHJldHVybiBlLmpvaW4oaSl9CmZ1bmN0aW9uIGV4cGFuZF91bmlxdWUoYSxjKXt2YXIgYjtmb3IoYj0wO2I8MTAwO2IrKyl7dmFyIGQ9ZXhwYW5kX3Rva2VuKGEsYyk7aWYoIWMuZXhjbHVkZVtkXSl7Yy5leGNsdWRlW2RdPXRydWU7cmV0dXJuIGR9fXJldHVybiIifWZ1bmN0aW9uIHNldF92YXIoYSxjLGIpe2lmKGE9PSJucGNfbmFtZSIpYlsidmFyIl0ubmFtZT0obWF0Y2g9L14oLis\/KSAuKy8uZXhlYyhjKSk\/bWF0Y2hbMV06YztyZXR1cm4gYlsidmFyIl1bYV09Y30KZnVuY3Rpb24gYW9yYW4oYSl7cmV0dXJuL150aGUgL2kudGVzdChhKT9hOi9eKG51bmNoYWt1KS9pLnRlc3QoYSk\/YTovXih1bmljb3JufHVuaXF1ZXx1bml2ZXJzaXR5KS9pLnRlc3QoYSk\/ImEgIithOi9eKGhvdXIpL2kudGVzdChhKT8iYW4gIithOi9eW0JDREdKS1BRVFVWV1laXVtBLVowLTldKy8udGVzdChhKT8iYSAiK2E6L15bQUVGSElMTU5PUlNYXVtBLVowLTldKy8udGVzdChhKT8iYW4gIithOi9eW2FlaW91XS9pLnRlc3QoYSk\/ImFuICIrYToiYSAiK2F9ZnVuY3Rpb24gbm90aGUoYSl7cmV0dXJuKG1hdGNoPS9edGhlICguKykvaS5leGVjKGEpKT9tYXRjaFsxXTphfWZ1bmN0aW9uIGxjKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbGNmaXJzdChhKXtyZXR1cm4obWF0Y2g9L14oW2Etel0pKC4qKS9pLmV4ZWMoYSkpP2xjKG1hdGNoWzFdKSttYXRjaFsyXTphfQpmdW5jdGlvbiBpbmxpbmVfY2FzZShhKXtyZXR1cm4vXltBLVpdW0EtWl0vLnRlc3QoYSk\/YTpsY2ZpcnN0KGEpfWZ1bmN0aW9uIGx0aGUoYSl7cmV0dXJuKG1hdGNoPS9edGhlICguKykvaS5leGVjKGEpKT8idGhlICIrbWF0Y2hbMV06YX1mdW5jdGlvbiB1YyhhKXtyZXR1cm4gYS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIHVjZmlyc3QoYSl7cmV0dXJuKG1hdGNoPS9eKFthLXpdKSguKikvaS5leGVjKGEpKT91YyhtYXRjaFsxXSkrbWF0Y2hbMl06YX1mdW5jdGlvbiB0aXRsZV9jYXNlKGEpe3JldHVybiBhLnNwbGl0KC9ccysvKS5tYXAodWMpLmpvaW4oIiAiKX07Cg==\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIG5hbWUuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKdmFyIGNoYWluX2NhY2hlPXt9O2Z1bmN0aW9uIGdlbmVyYXRlX25hbWUoYSl7aWYoYT1tYXJrb3ZfY2hhaW4oYSkpcmV0dXJuIG1hcmtvdl9uYW1lKGEpO3JldHVybiIifWZ1bmN0aW9uIG1hcmtvdl9jaGFpbihhKXt2YXIgYjtpZihiPWNoYWluX2NhY2hlW2FdKXJldHVybiBiO2Vsc2UgaWYoYj1uYW1lX3NldFthXSlpZihiPWNvbnN0cnVjdF9jaGFpbihiKSlyZXR1cm4gY2hhaW5fY2FjaGVbYV09YjtyZXR1cm4gZmFsc2V9CmZ1bmN0aW9uIGNvbnN0cnVjdF9jaGFpbihhKXt2YXIgYj17fSxjO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBlPWFbY10uc3BsaXQoL1xzKy8pO2I9aW5jcl9jaGFpbihiLCJwYXJ0cyIsZS5sZW5ndGgpO3ZhciBmO2ZvcihmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBkPWVbZl07Yj1pbmNyX2NoYWluKGIsIm5hbWVfbGVuIixkLmxlbmd0aCk7dmFyIGc9ZC5zdWJzdHIoMCwxKTtiPWluY3JfY2hhaW4oYiwiaW5pdGlhbCIsZyk7ZD1kLnN1YnN0cigxKTtmb3IodmFyIGg9ZztkLmxlbmd0aD4wOyl7Zz1kLnN1YnN0cigwLDEpO2I9aW5jcl9jaGFpbihiLGgsZyk7ZD1kLnN1YnN0cigxKTtoPWd9fX1yZXR1cm4gc2NhbGVfY2hhaW4oYil9ZnVuY3Rpb24gaW5jcl9jaGFpbihhLGIsYyl7aWYoYVtiXSlpZihhW2JdW2NdKWFbYl1bY10rKztlbHNlIGFbYl1bY109MTtlbHNle2FbYl09e307YVtiXVtjXT0xfXJldHVybiBhfQpmdW5jdGlvbiBzY2FsZV9jaGFpbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpe2JbY109MDt2YXIgZTtmb3IoZSBpbiBhW2NdKXt2YXIgZj1hW2NdW2VdO2Y9TWF0aC5mbG9vcihNYXRoLnBvdyhmLDEuMykpO2FbY11bZV09ZjtiW2NdKz1mfX1hLnRhYmxlX2xlbj1iO3JldHVybiBhfWZ1bmN0aW9uIG1hcmtvdl9uYW1lKGEpe3ZhciBiPXNlbGVjdF9saW5rKGEsInBhcnRzIiksYz1bXSxlO2ZvcihlPTA7ZTxiO2UrKyl7dmFyIGY9c2VsZWN0X2xpbmsoYSwibmFtZV9sZW4iKSxkPXNlbGVjdF9saW5rKGEsImluaXRpYWwiKSxnPWQ7Zm9yKGQ9ZDtnLmxlbmd0aDxmOyl7ZD1zZWxlY3RfbGluayhhLGQpO2crPWQ7ZD1kfWMucHVzaChnKX1yZXR1cm4gYy5qb2luKCIgIil9CmZ1bmN0aW9uIHNlbGVjdF9saW5rKGEsYil7dmFyIGM9YS50YWJsZV9sZW5bYl07Yz1yYW5kb20oYyk7dmFyIGU9MDtmb3IodG9rZW4gaW4gYVtiXSl7ZSs9YVtiXVt0b2tlbl07aWYoYzxlKXJldHVybiB0b2tlbn1yZXR1cm4iLSJ9Owo=\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24vZ2VuX2RhdGEuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKdmFyIGdlbl9kYXRhPXsiRHVuZ2VvbiBOYW1lIjpbIlRoZSAkeyBEdW5nZW9uIFR5cGUgfSBvZiAkeyBEaXJlIEhvcnJvciB9ICR7IER1bmdlb24gSG9ycm9yIH0iLCJUaGUgJHsgTG9zdCBEdW5nZW9uIH0gJHsgRHVuZ2VvbiBUeXBlIH0gb2YgJHsgRHVuZ2VvbiBIb3Jyb3IgfSIsIlRoZSAkeyBEdW5nZW9uIFR5cGUgfSBvZiAkeyBsdCBUaGUgRGFya2xvcmQgfSIsIlRoZSAkeyBMb3N0IER1bmdlb24gfSAkeyBEdW5nZW9uIFR5cGUgfSBvZiAkeyBsdCBUaGUgRGFya2xvcmQgfSJdLCJMb3N0IER1bmdlb24iOlsiQmxhY2siLCJEYXJrIiwiRHJlYWQiLCJGb3JzYWtlbiIsIkxvc3QiLCJTZWNyZXQiXSwiRHVuZ2VvbiBUeXBlIjpbIkJhcnJvdyIsIkNhdGFjb21icyIsIkNhdmVybnMiLCJDaGFtYmVycyIsIkNyeXB0cyIsIkN5c3QiLCJEZWx2ZSIsIkR1bmdlb24iLCJHYXVudGxldCIsIkhhbGxzIiwiSGl2ZSIsIkxhYnlyaW50aCIsIkxhaXIiLCJQaXQiLCJQcmlzb24iLCJTYW5jdHVtIiwKIlNlcHVsY2hlciIsIlNocmluZSIsIlRlbXBsZSIsIlRvbWIiLCJUdW5uZWxzIiwiVW5kZXJjcnlwdCIsIlZhdWx0cyIsIldhcnJlbnMiXSwiRGlyZSBIb3Jyb3IiOlsiJHsgQmxvb2R5IEVwaXRoZXQgfSIsIiR7IERhcmsgRXBpdGhldCB9IiwiJHsgRGlyZSBFcGl0aGV0IH0iLCIkeyBFbGRyaXRjaCBFcGl0aGV0IH0iLCIkeyBGaWVuZGlzaCBFcGl0aGV0IH0iLCIkeyBNaWdodHkgRXBpdGhldCB9Il0sIkJsb29keSBFcGl0aGV0IjpbIkJsb29keSIsIkNyaW1zb24iLCJHaGFzdGx5IiwiR3J1ZXNvbWUiXSwiRGFyayBFcGl0aGV0IjpbIkFwaG90aWMiLCJCbGFjayIsIkRhcmsiLCJEaXNtYWwiLCJHbG9vbXkiLCJUZW5lYnJvdXMiLCJTaGFkb3d5IiwiU3VubGVzcyJdLCJEaXJlIEVwaXRoZXQiOlsiQmFsZWZ1bCIsIkNydWVsIiwiRGlyZSIsIkdyaW0iLCJIb3JyZW5kb3VzIiwiTWVyY2lsZXNzIiwiUG9pc29ub3VzIiwiU2luaXN0ZXIiLCJUcmVhY2hlcm91cyIsIlVuc3BlYWthYmxlIiwKIldvZWZ1bCJdLCJFbGRyaXRjaCBFcGl0aGV0IjpbIkFyY2FuZSIsIkRlbW9uaWMiLCJFbGRyaXRjaCIsIkVsZW1lbnRhbCIsIkZpZW5kaXNoIiwiSW5mZXJuYWwiLCJVbmVhcnRobHkiXSwiRmllbmRpc2ggRXBpdGhldCI6WyJBYnlzc2FsIiwiQWNjdXJzZWQiLCJCYWF0b3JpYW4iLCJCbGFjayIsIkNvcnJ1cHQiLCJEYW1uZWQiLCJEZW1vbmljIiwiRmFsbGVuIiwiRmVsbCIsIkZpZW5kaXNoIiwiSGVsbGlzaCIsIk1hbGVmaWMiLCJNYWxldm9sZW50IiwiTWFsaWduIiwiUHJvZmFuZSIsIlZpbGUiLCJXaWNrZWQiXSwiTWlnaHR5IEVwaXRoZXQiOlsiQWRhbWFudCIsIkF3ZXNvbWUiLCJJbmRvbWl0YWJsZSIsIk1pZ2h0eSIsIlRlcnJpYmxlIl0sIkR1bmdlb24gSG9ycm9yIjpbIkFnZXMiLCJBbm5paGlsYXRpb24iLCJDaGFvcyIsIkRlYXRoIiwiRGV2YXN0YXRpb24iLCJEb29tIiwiRXZpbCIsIkhvcnJvciIsIk1hZG5lc3MiLCJNYWxpY2UiLCJOZWNyb21hbmN5IiwiTmlnaHRtYXJlcyIsCiJSdWluIiwiU2VjcmV0cyIsIlNvcnJvd3MiLCJTb3VscyIsIlRlcnJvciIsIldvZSIsIldvcm1zIl0sIlRoZSBEYXJrbG9yZCI6WyIkeyBOYW1lZCBEYXJrbG9yZCB9IiwiJHsgRGFya2xvcmQgTmFtZSB9IiwiJHsgRGFya2xvcmQgTmFtZSB9IHRoZSAkeyBEYXJrbG9yZCBFcGl0aGV0IH0iLCJUaGUgJHsgTW9uc3RlciBFcGl0aGV0IH0gJHsgTm9ibGUgVGl0bGUgfSJdLCJOYW1lZCBEYXJrbG9yZCI6WyJFbWlya29sIHRoZSBDaGFvdGljIiwiR290aG1vZyBvZiBVZHVuIiwiS2FzIHRoZSBCbG9vZHkiLCJLYXMgdGhlIEJldHJheWVyIiwiTG9yZCBHcmV5d3VsZiIsIk1hcmNlbGluZSB0aGUgVmFtcGlyZSBRdWVlbiIsIlNoaXZhIHRoZSBEZXN0cm95ZXIiLCJUaGUgR29ibGluIEtpbmciLCJVbGZhbmcgdGhlIEJsYWNrIiwiWmVpcmFtIHRoZSBMaWNoIl0sIkRhcmtsb3JkIE5hbWUiOlsiJHsgZ2VuX25hbWUgRHJhY29uaWMgfSIsIiR7IGdlbl9uYW1lIEdvdGhpYyB9IiwiJHsgZ2VuX25hbWUgRmllbmRpc2ggfSJdLAoiRGFya2xvcmQgRXBpdGhldCI6WyIkeyBCbG9vZHkgRXBpdGhldCB9IiwiJHsgRGlyZSBFcGl0aGV0IH0iLCIkeyBFbGRyaXRjaCBFcGl0aGV0IH0iLCIkeyBGaWVuZGlzaCBFcGl0aGV0IH0iLCIkeyBJbnNhbmUgRXBpdGhldCB9IiwiJHsgTWlnaHR5IEVwaXRoZXQgfSIsIiR7IERhcmttYWdlIH0iXSwiSW5zYW5lIEVwaXRoZXQiOlsiRGVyYW5nZWQiLCJJbnNhbmUiLCJMdW5hdGljIiwiTWFkIiwiUG9zc2Vzc2VkIl0sRGFya21hZ2U6WyJBcmNobWFnZSIsIkVuY2hhbnRyZXNzIiwiTmVjcm9tYW5jZXIiLCJQb250aWZleCIsIlNvcmNlcm9yIiwiV2FybG9jayIsIldpdGNoIl0sIk1vbnN0ZXIgRXBpdGhldCI6WyJEZW1vbiIsIkdhcmdveWxlIiwiTGljaCIsIlNoYWRvdyIsIlZhbXBpcmUiLCJXcmFpdGgiLCJXeXJtIl0sIk5vYmxlIFRpdGxlIjpbIkJhcm9uIiwiQ291bnQiLCJEdWtlIiwiS25pZ2h0IiwiTG9yZCIsIldhcmxvcmQiLCJCYXJvbmVzcyIsIkNvdW50ZXNzIiwiRHVjaGVzcyIsCiJLbmlnaHQiLCJFbXBlcm9yIiwiS2luZyIsIlByaW5jZSIsIlR5cmFudCIsIkVtcHJlc3MiLCJQcmluY2VzcyIsIlF1ZWVuIl19Owo=\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24vbmFtZV9zZXQuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKdmFyIG5hbWVfc2V0PXtEcmFjb25pYzpbIkFiZGkiLCJBYmlkaXRhYW4iLCJBYmllc3V1aCIsIkFtbWlkaXRhbmEiLCJBbW1pc2FkdWthIiwiQW11cnJ1IiwiQXBpbHNpbiIsIkFyYW1tYWRhcmEiLCJBcnNhY2VzIiwiQXNtYWR1IiwiQmFsc2hhenphciIsIkJlcm9zc3VzIiwiQmhoYXp1dW0iLCJCdXJuYWJ1cmlhc2giLCJEYWFkIiwiRGl0YW51IiwiR2V6ZXIiLCJIZWFuYSIsIklibmkiLCJJbGltYSIsIklwdGl5YW11dGEiLCJLYWRhc2htYW4iLCJLaGViYSIsIk1hYW0iLCJNaWxraWx1IiwiTmFib25pZHVzIiwiTmFidW5haWQiLCJOYWJ1cG9sYXNzYXIiLCJOYW1odXUiLCJOYW16dXUiLCJOZWJ1Y2hhZG5lenplciIsIk5pbnVzIiwiTmlueWFzIiwiT2JhcmVzIiwiU2FhbXN1aWx1bmEiLCJTaGVzaGJhenphciIsIlNpbm11YmFsaWl0IiwiU3VtYWxpa2EiLCJTdW11bGEiLCJTdW5pIiwiVGF0dGVuYWkiLCJUdXVidGl5YW11dGEiLCJZYWFta3V1enp1aGFsYW1tYSIsIlphYml1bSIsCiJadXVtbWFidSIsIkFiaWVzaGEiLCJBbW1pc2FkdWdhIiwiQW51bm5ha2kiLCJBdHJhaGFyc2lzIiwiQmFhbCIsIkJlbCIsIkJlbHNoaW1tYW5uaSIsIkJpbGl0IiwiRGFnb24iLCJEYW11emkiLCJFbmtpIiwiRW5saWwiLCJFbm1lcmthciIsIkdpbGdhbWVzaCIsIkd1ZGVhIiwiSGFtbXVyYWJpIiwiS3VyIiwiTWFyZHVrIiwiTWlsaXQiLCJOZXJnYWwiLCJOaW5henUiLCJOaW5naXJzdSIsIlNhYml1bSIsIlNhbXN1ZGl0YW5hIiwiU2FtdWdhbiIsIlNhbmd1c3UiLCJTaHVsbGF0IiwiU2luIiwiU3VtdWFidW0iLCJTdW11bGFlbCIsIlV0dSJdLEZpZW5kaXNoOlsiQWJhZGRvbiIsIkFiYWxhbSIsIkFicmF4YXMiLCJBYnl6b3UiLCJBZHJhbWVsZWNoIiwiQWVzaG1hIiwiQWdhcmVzIiwiQWhyaW1hbiIsIkFrdmFuIiwiQWxsb2NlcyIsIkFtb24iLCJBbmFtYWxlY2giLCJBbmRoYWthIiwiQW56dSIsIkFybWFyb3MiLCJBc2Fra3UiLCJBc3Rhcm90aCIsIkJhZWwiLCJCYWxiZXJpdGgiLAoiQmFwaG9tZXQiLCJCYXJiYXRvcyIsIkJlaGVtb3RoIiwiQmVsZXRoIiwiQmVscGhlZ29yIiwiQ2hhcnVuIiwiQ2hlbW9zaCIsIkN1bHN1IiwiRGFnb24iLCJEcmVrYXZhYyIsIkVibGlzIiwiRWxpZ29zIiwiRXVyeWFsZSIsIkZvY2Fsb3IiLCJGb3JuZXVzIiwiR2FkZXJlbCIsIkdha2kiLCJHYW1pZ2luIiwiR2xhc3lhIiwiR29tb3J5IiwiR3Vzb3luIiwiSGFscGhhcyIsIkhhdXJlcyIsIklibGlzIiwiS2FsaSIsIkthc2FkeWEiLCJLaW1hcmlzIiwiTGFtYXNodHUiLCJMZWNoaWVzIiwiTGVyYWllIiwiTGlsaXRoIiwiTWFsYXBoYXIiLCJNYWxwaGFzIiwiTWFsdGh1cyIsIk1hbW1vbiIsIk1hcmEiLCJNYXJiYXMiLCJNYXJpY2hhIiwiTWFzdGVtYSIsIk1lbGNoaXJlc2EiLCJNZXBoaXN0b3BoZWxlcyIsIk1lcmloZW0iLCJNb2xvY2giLCJOYWJlcnVzIiwiTmFwaHVsYSIsIk5pbnVydGEiLCJPcmlheCIsIk9yb2JvcyIsIlBhenV6dSIsIlBoZW5leCIsIlBydXNsYXMiLCJSYWtzaGFzYSIsCiJSYXVtIiwiUnVteWFsIiwiU2FsZW9zIiwiU2FtYWVsIiwiU2VteWF6IiwiU2hlZGltIiwiU3RoZW5ubyIsIlN1cmdhdCIsIlVrb2JhY2giLCJWYWxhYyIsIlZhcHVsYSIsIlZhc3NhZ28iLCJWZXBhciIsIlZlcGhhciIsIlhhcGhhbiIsIllldGVyZWwiLCJaYWdhbiIsIlplcGFyIl0sR290aGljOlsiQWJsYWJpdXMiLCJBY2hpbGEiLCJBZ2lsYSIsIkFnaXd1bGYiLCJBZ3Jpd3VsZiIsIkFpZG9pbmd1cyIsIkFpdGhhbmFyaWQiLCJBbGFyaWMiLCJBbGF0aGV1cyIsIkFsYXZpdiIsIkFsaWNhIiwiQWxpZ2VybiIsIkFsbGEiLCJBbWFsIiwiQW1hbGFyaWMiLCJBbW1pdXMiLCJBbmFnYXN0ZXMiLCJBbmRhZ2lzIiwiQW5pYW51cyIsIkFuc2lsYSIsIkFuc2lzIiwiQW9yaWMiLCJBcGFoaWRhIiwiQXJkYWJ1ciIsIkFyZGFyaWMiLCJBcmdhaXRoIiwiQXJpYXJpYyIsIkFyaW1pciIsIkFyaXVzIiwiQXJuZWdsaXNjdXMiLCJBcnZhbmR1cyIsIkFzYmFkIiwiQXNwYXIiLCJBdGF1bGYiLCJBdGF1bHBoIiwKIkF0aGFsYXJpYyIsIkF0aGFuYWdpbGQiLCJBdGhhbmFyaWMiLCJBdGhhcmlkIiwiQXRoYXVsZiIsIkJhYmFpIiwiQmFkdWEiLCJCYWR1aWxhIiwiQmF6YSIsIkJlcmlnIiwiQmVyaW11ZCIsIkJlcmltdW5kIiwiQmVzc2EiLCJCZXNzYXMiLCJCZXNzaSIsIkJldWNhIiwiQmV1Y2FkIiwiQmlnZWxpcyIsIkJpbGltZXIiLCJCb3JhbmkiLCJCcmFnYSIsIkJyYW5kaWxhIiwiQ2FuZGFjIiwiQ2FubmFiYXMiLCJDYW5uYWJhdWRlcyIsIkNldGhlZ3VzIiwiQ2hpbmRhc3VpbnRoIiwiQ25pdmEiLCJDbml2aWRhIiwiQ29saWFzIiwiQ3JvY3VzIiwiQ3VuaWdhc3QiLCJDdW5pbXVuZCIsIkN5cmlsYSIsIkR1Yml1cyIsIkR1ZGEiLCJFYmVybXVkIiwiRWJlcndvbGYiLCJFYnJpbXVkIiwiRWRpY2EiLCJFcmFyaWMiLCJFcml1bGYiLCJFcm1hbmFyaWMiLCJFcm1lbGFuZHVzIiwiRXJ2aWciLCJFdXJpYyIsIkV1dGhhcmljIiwiRmFybm9iaXVzIiwiRmFzdGlkYSIsIkZlbGV0aGV1cyIsIkZldmEiLAoiRmlsaW1lciIsIkZsYWNjaXRoZXVzIiwiRnJhdml0dGEiLCJGcmVkZWdhciIsIkZyZXRlbGEiLCJGcmlkZXJpYyIsIkZyaWRpZ2VybiIsIkZyaWdlcmlkdXMiLCJGcml0aGlsYSIsIkZyaXRpZ2VybiIsIkdhZGFyaWMiLCJHYWluYXMiLCJHYWlzZXJpYyIsIkdhbGluZG8iLCJHYWxpbmR1cyIsIkdhdXQiLCJHYXV0ZXJpdCIsIkdlYmVyaWMiLCJHZWxpbWVyIiwiR2VudG8iLCJHZXJ1bmciLCJHZXNhbGVjIiwiR2VzaW11bmQiLCJHZXRpY2EiLCJHb2FyIiwiR29kZGFzIiwiR29kZWdpc2VsIiwiR29kaWdpc2NsdXMiLCJHb2lhcmljdXMiLCJHb3V0aHRoYXMiLCJHdW5kZWhhciIsIkd1bmRpb2siLCJHdW5kb2JhZCIsIkd1bnRlcmljIiwiR3VudGhpZ2lzIiwiR3V0dGhpa2FzIiwiSGFkdWJyYW5kIiwiSGVsZGViYWxkIiwiSGVsZGVmcmVkdXMiLCJIZXJpYnJhbmQiLCJIZXJtYW5naWxkIiwiSGVybWVuaWdpbGQiLCJIZXJtaW5hZnJpZCIsIkhlcm5lZ2xpc2N1cyIsIkhpbGRlYmFkIiwKIkhpbGRlYnJhbmQiLCJIaWxkZXJpYyIsIkhpbGRlcml0aCIsIkhpbW5lcml0aCIsIkhpc2FybmEiLCJIdWxtdWwiLCJIdW1sIiwiSHVuZXJpYyIsIkh1bmlnaWxkIiwiSHVuaW11bmQiLCJIdW51bGYiLCJIdW51bXVuZCIsIkliYmEiLCJJbGRlYmFkIiwiSW5uYSIsIklybmZyaWVkIiwiSm9yZGFuZXMiLCJMYWdhcmltYW4iLCJMYW1wcmlkaXVzIiwiTGVvdmlnaWxkIiwiTGV1dmliaWxkIiwiTGl2aWxhIiwiTWFyY29taXIiLCJNb2RhaGFyaXVzIiwiTW9kYXJlcyIsIk11bmRlcmljIiwiTXVuZG8iLCJOYW1hdGl1cyIsIk5hdWxhYmF0ZXMiLCJOaWRhZGEiLCJOaWtldGFzIiwiT2RvaW4iLCJPZG90aGV1cyIsIk9kb3ZhY2FyIiwiT3N0cm9nb3RoYSIsIk9zdWluIiwiT3ZpZGEiLCJQYXR6YSIsIlJhZGFnYWlzdXMiLCJSYXVzaW1vZCIsIlJlY2FyZWQiLCJSZWNjYXJlZCIsIlJlY2Nlc3dpbnRoIiwiUmVjaGlhciIsIlJlY2hpbXVuZCIsIlJlY2l0YWNoIiwiUmVraXRhY2giLCJSZW1pc211bmQiLAoiUmVzcGEiLCJSZXRlbWVyaXMiLCJSaGltYSIsIlJpY2ltZXIiLCJSaWN0aW92YXJ1cyIsIlJpa2lhciIsIlJvZGVyaWMiLCJSb2RvbGYiLCJSb2R1dWxmIiwiUnVkZXNpbmQiLCJTYWJhIiwiU2FkYWdhcmVzIiwiU2FmcmF4IiwiU2FsbGEiLCJTYW5naWJhbiIsIlNhbnNhbGFzIiwiU2FwaHJheCIsIlNhcnVzIiwiU2VnZXJpYyIsIlNlbGVuYXMiLCJTaGFwdXIiLCJTaWRpbXVuZCIsIlNpZ2VyaWMiLCJTaWdlc2FyIiwiU2lnaWJhbGQiLCJTaWdpc211bmQiLCJTaWdpc3Z1bHQiLCJTaW5kaWxhIiwiU2lzYmVydCIsIlNpc2VidXQiLCJTaXNlbmFuZCIsIlNvYXMiLCJTdWF0cml1cyIsIlN1ZXJpZHVzIiwiU3VuZXJpY3VzIiwiU3VubmlhIiwiVGFuYWlzIiwiVGFuY2EiLCJUZWlhcyIsIlRlamEiLCJUaGFydWFybyIsIlRoZWxhIiwiVGhlb2RhaGFkIiwiVGhlb2RlaGFkIiwiVGhlb2RlbWVyIiwiVGhlb2RlcmljIiwiVGhlb2RlcmlkIiwiVGhlb2RvcmljIiwiVGhlb2R1bGYiLCJUaGV1ZGVnaXNlbCIsCiJUaGV1ZGVnaXNrbG9zIiwiVGhldWRpcyIsIlRoaWRyZWsiLCJUaGl1ZGltaXIiLCJUaG9yaXNtdWQiLCJUaG9yaXNtdW5kIiwiVGhyYXNhbXVuZCIsIlRocmFzYXJpYyIsIlRocmF1c3RpbGEiLCJUb3RpbGEiLCJUcmliaWdpbGQiLCJUdWZhIiwiVHVsdWluIiwiVWxmaWxhcyIsIlVuaWdpbGQiLCJVbmlsYSIsIlVuaW11bmQiLCJVcmFpYXMiLCJWYWxhbWVyIiwiVmFsYW1pciIsIlZhbGFyYXZhbnMiLCJWYWxpYSIsIlZhbmRhbGFyaXVzIiwiVmFuZGlsIiwiVmVkdWNvIiwiVmV0ZXJpY3VzIiwiVmV0cmFuaW8iLCJWaWRlcmljIiwiVmlkaWdvaWEiLCJWaWRpbWlyIiwiVmlsaWFyaXMiLCJWaW5pdGhhcml1cyIsIlZpc2ltYXIiLCJWaXRoaW1pcmlzIiwiVml0aG1pcmlzIiwiVml0aWdpcyIsIlZpdHRhbWFyIiwiVnVsdHV1bGYiLCJXYWxhIiwiV2FsYWhtYXIiLCJXYWxsaWEiLCJXYW1iYSIsIldlbGxhIiwiV2luZ3VyaWMiLCJXaXRpZ2UiLCJXaXR0aWdpcyIsIldpdHRpemEiXX07Cg==\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGNhbnZhcy5qcwovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgp2YXIgcmdiX2NhY2hlPXt9LGNhY2hlX3BpeD1mYWxzZSxwaXhlbF9jYWNoZT17fTtmdW5jdGlvbiBmbXRfY29sb3IoYSxjLGIpe3ZhciBkPSIjIitpMmgoYSkraTJoKGMpK2kyaChiKTtyZ2JfY2FjaGVbZF09W2EsYyxiLDI1NV07cmV0dXJuIGR9ZnVuY3Rpb24gaTJoKGEpe2E9YS50b1N0cmluZygxNik7cmV0dXJuIGEubGVuZ3RoPjE\/YToiMCIrYX1mdW5jdGlvbiBjb2xvcl9yZ2IoYSl7dmFyIGM7aWYocmdiX2NhY2hlW2FdKXJldHVybiByZ2JfY2FjaGVbYV07ZWxzZSBpZihjPXBhcnNlX2NvbG9yKGEpKXJldHVybiByZ2JfY2FjaGVbYV09YztyZXR1cm5bMCwwLDAsMjU1XX0KZnVuY3Rpb24gcGFyc2VfY29sb3IoYSl7aWYobWF0Y2g9L14jKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pL2kuZXhlYyhhKSlyZXR1cm5baDJpKG1hdGNoWzFdKSxoMmkobWF0Y2hbMl0pLGgyaShtYXRjaFszXSksMjU1XTtlbHNlIGlmKG1hdGNoPS9eIyhbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKS9pLmV4ZWMoYSkpcmV0dXJuW2gyaShtYXRjaFsxXSksaDJpKG1hdGNoWzJdKSxoMmkobWF0Y2hbM10pLDI1NV07ZWxzZSBpZihtYXRjaD0vXnJnYlsoXShcZCspLChcZCspLChcZCspWyldL2kuZXhlYyhhKSlyZXR1cm5bZDJpKG1hdGNoWzFdKSxkMmkobWF0Y2hbMl0pLGQyaShtYXRjaFszXSksMjU1XTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gZDJpKGEpe3JldHVybiBwYXJzZUludChhLDEwKX1mdW5jdGlvbiBoMmkoYSl7cmV0dXJuIHBhcnNlSW50KGEsMTYpfQpmdW5jdGlvbiBzZXRfcGl4ZWwoYSxjLGIsZCl7aWYoY2FjaGVfcGl4KWlmKHBpeGVsX2NhY2hlW2RdKXBpeGVsX2NhY2hlW2RdLnB1c2goW2MsYl0pO2Vsc2UgcGl4ZWxfY2FjaGVbZF09W1tjLGJdXTtlbHNlIGZpbGxfcmVjdChhLGMsYixjLGIsZCl9ZnVuY3Rpb24gY2FjaGVfcGl4ZWxzKGEpe2NhY2hlX3BpeD1hfWZ1bmN0aW9uIGR1bXBfcGl4ZWxzKGEpe3ZhciBjPWEuY2FudmFzLndpZHRoLGI9YS5jYW52YXMuaGVpZ2h0LGQ9YS5nZXRJbWFnZURhdGEoMCwwLGMsYik7JEgocGl4ZWxfY2FjaGUpLmtleXMoKS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWNvbG9yX3JnYihlKTtwaXhlbF9jYWNoZVtlXS5lYWNoKGZ1bmN0aW9uKGgpe2g9aFsxXSpjK2hbMF08PDI7dmFyIGc7Zm9yKGc9MDtnPDQ7ZysrKWQuZGF0YVtoK2ddPWZbZ119KX0pO2EucHV0SW1hZ2VEYXRhKGQsMCwwKTtjYWNoZV9waXg9ZmFsc2U7cGl4ZWxfY2FjaGU9e319CmZ1bmN0aW9uIGR1bXBfcGl4ZWxzXzF4MShhKXskSChwaXhlbF9jYWNoZSkua2V5cygpLmVhY2goZnVuY3Rpb24oYyl7YS5maWxsU3R5bGU9YztwaXhlbF9jYWNoZVtjXS5lYWNoKGZ1bmN0aW9uKGIpe2EuZmlsbFJlY3QoYlswXSxiWzFdLDEsMSl9KX0pO2NhY2hlX3BpeD1mYWxzZTtwaXhlbF9jYWNoZT17fX1mdW5jdGlvbiBkcmF3X2xpbmUoYSxjLGIsZCxlLGYpe2lmKGQ9PWMmJmU9PWIpc2V0X3BpeGVsKGEsYyxiLGYpO2Vsc2V7YS5iZWdpblBhdGgoKTthLm1vdmVUbyhjKzAuNSxiKzAuNSk7YS5saW5lVG8oZCswLjUsZSswLjUpO2Euc3Ryb2tlU3R5bGU9ZjthLnN0cm9rZSgpfX1mdW5jdGlvbiBmaWxsX3JlY3QoYSxjLGIsZCxlLGYpe2EuZmlsbFN0eWxlPWY7YS5maWxsUmVjdChjLGIsZC1jKzEsZS1iKzEpfWZ1bmN0aW9uIHN0cm9rZV9yZWN0KGEsYyxiLGQsZSxmKXthLnN0cm9rZVN0eWxlPWY7YS5zdHJva2VSZWN0KGMsYixkLWMrMSxlLWIrMSl9CmZ1bmN0aW9uIGRyYXdfc3RyaW5nKGEsYyxiLGQsZSxmKXthLnRleHRCYXNlbGluZT0ibWlkZGxlIjthLnRleHRBbGlnbj0iY2VudGVyIjthLmZvbnQ9ZTthLmZpbGxTdHlsZT1mO2EuZmlsbFRleHQoYyxiLGQpfWZ1bmN0aW9uIGRyYXdfaW1hZ2UoYSxjLGIsZCl7YS5kcmF3SW1hZ2UoYyxiLGQpfWZ1bmN0aW9uIHNhdmVfY2FudmFzKGEsYyl7YT1hLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7YT1hLnJlcGxhY2UoImltYWdlL3BuZyIsImltYWdlL29jdGV0LXN0cmVhbSIpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtpZih0eXBlb2YgYi5kb3dubG9hZD09PSJzdHJpbmciKXtiLmhyZWY9YTtiLmRvd25sb2FkPWM7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTtiLmNsaWNrKCk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKX1lbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oYSl9Owo=\"><\/script>\n    <script type=\"text\/javascript\" src=\"data:text\/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24uanMgLy8gdmVyc2lvbiAxLjAuMwovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgp2YXIgZGM9e21hcF9zdHlsZTp7c3RhbmRhcmQ6e3RpdGxlOiJTdGFuZGFyZCJ9LGNsYXNzaWM6e3RpdGxlOiJDbGFzc2ljIn0sZ3JhcGg6e3RpdGxlOiJHcmFwaFBhcGVyIn19LGdyaWQ6e25vbmU6e3RpdGxlOiJOb25lIn0sc3F1YXJlOnt0aXRsZToiU3F1YXJlIn0saGV4Ont0aXRsZToiSGV4In0sdmV4Ont0aXRsZToiVmVydEhleCJ9fSxkdW5nZW9uX2xheW91dDp7c3F1YXJlOnt0aXRsZToiU3F1YXJlIixhc3BlY3Q6MX0scmVjdGFuZ2xlOnt0aXRsZToiUmVjdGFuZ2xlIixhc3BlY3Q6MS4zfSxib3g6e3RpdGxlOiJCb3giLGFzcGVjdDoxLG1hc2s6W1sxLDEsMV0sWzEsMCwxXSxbMSwxLDFdXX0sY3Jvc3M6e3RpdGxlOiJDcm9zcyIsYXNwZWN0OjEsbWFzazpbWzAsMSwwXSxbMSwxLDFdLFswLDEsMF1dfSxkYWdnZXI6e3RpdGxlOiJEYWdnZXIiLGFzcGVjdDoxLjMsbWFzazpbWzAsMSwwXSxbMSwxLDFdLFswLDEsMF0sWzAsMSwwXV19LHNhbHRpcmU6e3RpdGxlOiJTYWx0aXJlIiwKYXNwZWN0OjF9LGtlZXA6e3RpdGxlOiJLZWVwIixhc3BlY3Q6MSxtYXNrOltbMSwxLDAsMCwxLDFdLFsxLDEsMSwxLDEsMV0sWzAsMSwxLDEsMSwwXSxbMCwxLDEsMSwxLDBdLFsxLDEsMSwxLDEsMV0sWzEsMSwwLDAsMSwxXV19LGhleGFnb246e3RpdGxlOiJIZXhhZ29uIixhc3BlY3Q6MC45fSxyb3VuZDp7dGl0bGU6IlJvdW5kIixhc3BlY3Q6MX19LGR1bmdlb25fc2l6ZTp7ZmluZTp7dGl0bGU6IkZpbmUiLHNpemU6MjAwLGNlbGw6MTh9LGRpbWluOnt0aXRsZToiRGltaW5pdXRpdmUiLHNpemU6MjUyLGNlbGw6MTh9LHRpbnk6e3RpdGxlOiJUaW55IixzaXplOjMxOCxjZWxsOjE4fSxzbWFsbDp7dGl0bGU6IlNtYWxsIixzaXplOjQwMCxjZWxsOjE4fSxtZWRpdW06e3RpdGxlOiJNZWRpdW0iLHNpemU6NTA0LGNlbGw6MTh9LGxhcmdlOnt0aXRsZToiTGFyZ2UiLHNpemU6NjM1LGNlbGw6MTh9LGh1Z2U6e3RpdGxlOiJIdWdlIixzaXplOjgwMCxjZWxsOjE4fSxnYXJnYW50Ont0aXRsZToiR2FyZ2FudHVhbiIsCnNpemU6MTAwOCxjZWxsOjE4fSxjb2xvc3NhbDp7dGl0bGU6IkNvbG9zc2FsIixzaXplOjEyNzAsY2VsbDoxOH19LGFkZF9zdGFpcnM6e25vOnt0aXRsZToiTm8ifSx5ZXM6e3RpdGxlOiJZZXMifSxtYW55Ont0aXRsZToiTWFueSJ9fSxyb29tX2xheW91dDp7c3BhcnNlOnt0aXRsZToiU3BhcnNlIn0sc2NhdHRlcmVkOnt0aXRsZToiU2NhdHRlcmVkIn0sZGVuc2U6e3RpdGxlOiJEZW5zZSJ9fSxyb29tX3NpemU6e3NtYWxsOnt0aXRsZToiU21hbGwiLHNpemU6MixyYWRpeDoyfSxtZWRpdW06e3RpdGxlOiJNZWRpdW0iLHNpemU6MixyYWRpeDo1fSxsYXJnZTp7dGl0bGU6IkxhcmdlIixzaXplOjUscmFkaXg6Mn0saHVnZTp7dGl0bGU6Ikh1Z2UiLHNpemU6NSxyYWRpeDo1LGh1Z2U6MX0sZ2FyZ2FudDp7dGl0bGU6IkdhcmdhbnR1YW4iLHNpemU6OCxyYWRpeDo1LGh1Z2U6MX0sY29sb3NzYWw6e3RpdGxlOiJDb2xvc3NhbCIsc2l6ZTo4LHJhZGl4OjgsaHVnZToxfX0sZG9vcnM6e25vbmU6e3RpdGxlOiJOb25lIn0sCmJhc2ljOnt0aXRsZToiQmFzaWMifSxzZWN1cmU6e3RpdGxlOiJTZWN1cmUifSxzdGFuZGFyZDp7dGl0bGU6IlN0YW5kYXJkIn0sZGVhdGh0cmFwOnt0aXRsZToiRGVhdGh0cmFwIn19LGNvcnJpZG9yX2xheW91dDp7bGFieXJpbnRoOnt0aXRsZToiTGFieXJpbnRoIixwY3Q6MH0sZXJyYW50Ont0aXRsZToiRXJyYW50IixwY3Q6NTB9LHN0cmFpZ2h0Ont0aXRsZToiU3RyYWlnaHQiLHBjdDo5MH19LHJlbW92ZV9kZWFkZW5kczp7bm9uZTp7dGl0bGU6Ik5vbmUiLHBjdDowfSxzb21lOnt0aXRsZToiU29tZSIscGN0OjUwfSxhbGw6e3RpdGxlOiJBbGwiLHBjdDoxMDB9fX0sZGVmYXVsdF9xdWVyeT17bWFwX3N0eWxlOiJzdGFuZGFyZCIsZ3JpZDoic3F1YXJlIixkdW5nZW9uX2xheW91dDoicmVjdGFuZ2xlIixkdW5nZW9uX3NpemU6Im1lZGl1bSIsYWRkX3N0YWlyczoieWVzIixyb29tX2xheW91dDoic2NhdHRlcmVkIixyb29tX3NpemU6Im1lZGl1bSIsZG9vcnM6InN0YW5kYXJkIixjb3JyaWRvcl9sYXlvdXQ6ImVycmFudCIsCnJlbW92ZV9kZWFkZW5kczoic29tZSJ9LE5PVEhJTkc9MCxCTE9DS0VEPTEsUk9PTT0yLENPUlJJRE9SPTQsUEVSSU1FVEVSPTE2LEVOVFJBTkNFPTMyLFJPT01fSUQ9NjU0NzIsQVJDSD02NTUzNixET09SPTEzMTA3MixMT0NLRUQ9MjYyMTQ0LFRSQVBQRUQ9NTI0Mjg4LFNFQ1JFVD0xMDQ4NTc2LFBPUlRDPTIwOTcxNTIsU1RBSVJfRE49NDE5NDMwNCxTVEFJUl9VUD04Mzg4NjA4LExBQkVMPTQyNzgxOTAwODAsT1BFTlNQQUNFPVJPT018Q09SUklET1IsRE9PUlNQQUNFPUFSQ0h8RE9PUnxMT0NLRUR8VFJBUFBFRHxTRUNSRVR8UE9SVEMsRVNQQUNFPUVOVFJBTkNFfERPT1JTUEFDRXw0Mjc4MTkwMDgwLFNUQUlSUz1TVEFJUl9ETnxTVEFJUl9VUCxCTE9DS19ST09NPUJMT0NLRUR8Uk9PTSxCTE9DS19DT1JSPUJMT0NLRUR8UEVSSU1FVEVSfENPUlJJRE9SLEJMT0NLX0RPT1I9QkxPQ0tFRHxET09SU1BBQ0UsZGk9e25vcnRoOi0xLHNvdXRoOjEsd2VzdDowLGVhc3Q6MH0sZGo9e25vcnRoOjAsCnNvdXRoOjAsd2VzdDotMSxlYXN0OjF9LGRqX2RpcnM9JEgoZGopLmtleXMoKS5zb3J0KCksb3Bwb3NpdGU9e25vcnRoOiJzb3V0aCIsc291dGg6Im5vcnRoIix3ZXN0OiJlYXN0IixlYXN0OiJ3ZXN0In07ZnVuY3Rpb24gaW5pdF9mb3JtKCl7JCgiZHVuZ2Vvbl9uYW1lIikub2JzZXJ2ZSgiY2hhbmdlIixuYW1lX3JlYWN0aW9uKTskKCJuZXdfbmFtZSIpLm9ic2VydmUoImNsaWNrIixuZXdfbmFtZSk7JEgoZGMpLmtleXMoKS5lYWNoKGZ1bmN0aW9uKGEpeyRIKGRjW2FdKS5rZXlzKCkuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1kY1thXVtiXS50aXRsZTskKGEpLmluc2VydChjcmVhdGVfb3B0aW9uKGIsYykpfSk7JChhKS5vYnNlcnZlKCJjaGFuZ2UiLG5ld19kdW5nZW9uKX0pOyRIKGRlZmF1bHRfcXVlcnkpLmtleXMoKS5lYWNoKGZ1bmN0aW9uKGEpeyQoYSkuc2V0VmFsdWUoZGVmYXVsdF9xdWVyeVthXSl9KTtuZXdfbmFtZSgpfQpmdW5jdGlvbiBjcmVhdGVfb3B0aW9uKGEsYil7cmV0dXJuIG5ld19vcHRpb24oe3ZhbHVlOmF9KS51cGRhdGUoYil9ZnVuY3Rpb24gbmV3X29wdGlvbihhKXtyZXR1cm4gYnVpbGRfdGFnKCJvcHRpb24iLGEpfWZ1bmN0aW9uIGJ1aWxkX3RhZyhhLGIpe3JldHVybiBuZXcgRWxlbWVudChhLGIpfWZ1bmN0aW9uIG5hbWVfcmVhY3Rpb24oKXskKCJkdW5nZW9uX3RpdGxlIikudXBkYXRlKCQoImR1bmdlb25fbmFtZSIpLmdldFZhbHVlKCkpO25ld19kdW5nZW9uKCl9ZnVuY3Rpb24gbmV3X25hbWUoKXskKCJkdW5nZW9uX25hbWUiKS5zZXRWYWx1ZShnZW5lcmF0ZV90ZXh0KCJEdW5nZW9uIE5hbWUiKSk7bmFtZV9yZWFjdGlvbigpfWZ1bmN0aW9uIG5ld19kdW5nZW9uKCl7dmFyIGE9Y3JlYXRlX2R1bmdlb24oKTtpbWFnZV9kdW5nZW9uKGEpfQpmdW5jdGlvbiBjcmVhdGVfZHVuZ2Vvbigpe3ZhciBhPWluaXRfZHVuZ2VvbigpO2E9ZW1wbGFjZV9yb29tcyhhKTthPW9wZW5fcm9vbXMoYSk7YT1sYWJlbF9yb29tcyhhKTthPWNvcnJpZG9ycyhhKTtpZihhLmFkZF9zdGFpcnMpYT1lbXBsYWNlX3N0YWlycyhhKTtyZXR1cm4gYT1nZWxhdGlub3VzX2N1YmUoYSl9CmZ1bmN0aW9uIGluaXRfZHVuZ2Vvbigpe3ZhciBhPXtzZWVkOmluaXRfc2VlZCgkKCJkdW5nZW9uX25hbWUiKS5nZXRWYWx1ZSgpKX07JEgoZGMpLmtleXMoKS5lYWNoKGZ1bmN0aW9uKGcpe2FbZ109JChnKS5nZXRWYWx1ZSgpfSk7dmFyIGI9Z2V0X2RjKCJkdW5nZW9uX3NpemUiLGEpLGM9Z2V0X2RjKCJkdW5nZW9uX2xheW91dCIsYSksZD1iLnNpemUsZT1jLmFzcGVjdDtiPWIuY2VsbDthLm5faT1NYXRoLmZsb29yKGQqZS9iKTthLm5faj1NYXRoLmZsb29yKGQvYik7YS5jZWxsX3NpemU9YjthLm5fcm93cz1hLm5faSoyO2Eubl9jb2xzPWEubl9qKjI7YS5tYXhfcm93PWEubl9yb3dzLTE7YS5tYXhfY29sPWEubl9jb2xzLTE7YS5jZWxsPVtdO2ZvcihkPTA7ZDw9YS5uX3Jvd3M7ZCsrKXthLmNlbGxbZF09W107Zm9yKGU9MDtlPD1hLm5fY29scztlKyspYS5jZWxsW2RdW2VdPU5PVEhJTkd9aWYoYz1jLm1hc2spYT1tYXNrX2NlbGxzKGEsYyk7ZWxzZSBpZihhLmR1bmdlb25fbGF5b3V0PT0KInNhbHRpcmUiKWE9c2FsdGlyZV9tYXNrKGEpO2Vsc2UgaWYoYS5kdW5nZW9uX2xheW91dD09ImhleGFnb24iKWE9aGV4X21hc2soYSk7ZWxzZSBpZihhLmR1bmdlb25fbGF5b3V0PT0icm91bmQiKWE9cm91bmRfbWFzayhhKTtyZXR1cm4gYX1mdW5jdGlvbiBnZXRfZGMoYSxiKXtyZXR1cm4gZGNbYV1bYlthXV19ZnVuY3Rpb24gbWFza19jZWxscyhhLGIpe3ZhciBjPWIubGVuZ3RoLyhhLm5fcm93cysxKSxkPWJbMF0ubGVuZ3RoLyhhLm5fY29scysxKSxlO2ZvcihlPTA7ZTw9YS5uX3Jvd3M7ZSsrKXt2YXIgZz1iW01hdGguZmxvb3IoZSpjKV0sZjtmb3IoZj0wO2Y8PWEubl9jb2xzO2YrKylnW01hdGguZmxvb3IoZipkKV18fChhLmNlbGxbZV1bZl09QkxPQ0tFRCl9cmV0dXJuIGF9CmZ1bmN0aW9uIHNhbHRpcmVfbWFzayhhKXtNYXRoLmZsb29yKGEubl9yb3dzLzIpO3ZhciBiPU1hdGguZmxvb3IoYS5uX3Jvd3MvNCksYztmb3IoYz0wO2M8YjtjKyspe3ZhciBkPWIrYyxlPWEubl9jb2xzLWQ7Zm9yKGQ9ZDtkPD1lO2QrKyl7YS5jZWxsW2NdW2RdPUJMT0NLRUQ7YS5jZWxsW2Eubl9yb3dzLWNdW2RdPUJMT0NLRUQ7YS5jZWxsW2RdW2NdPUJMT0NLRUQ7YS5jZWxsW2RdW2Eubl9jb2xzLWNdPUJMT0NLRUR9fXJldHVybiBhfWZ1bmN0aW9uIGhleF9tYXNrKGEpe3ZhciBiPU1hdGguZmxvb3IoYS5uX3Jvd3MvMiksYztmb3IoYz0wO2M8PWEubl9yb3dzO2MrKyl7dmFyIGQ9TWF0aC5mbG9vcihNYXRoLmFicyhjLWIpKjAuNTc3MzUpKzEsZT1hLm5fY29scy1kLGc7Zm9yKGc9MDtnPD1hLm5fY29scztnKyspaWYoZzxkfHxnPmUpYS5jZWxsW2NdW2ddPUJMT0NLRUR9cmV0dXJuIGF9CmZ1bmN0aW9uIHJvdW5kX21hc2soYSl7dmFyIGI9YS5uX3Jvd3MvMixjPWEubl9jb2xzLzIsZDtmb3IoZD0wO2Q8PWEubl9yb3dzO2QrKyl7dmFyIGU9TWF0aC5wb3coZC9iLTEsMiksZztmb3IoZz0wO2c8PWEubl9jb2xzO2crKyl7dmFyIGY9TWF0aC5zcXJ0KGUrTWF0aC5wb3coZy9jLTEsMikpO2lmKGY+MSlhLmNlbGxbZF1bZ109QkxPQ0tFRH19cmV0dXJuIGF9ZnVuY3Rpb24gZW1wbGFjZV9yb29tcyhhKXt2YXIgYj1nZXRfZGMoInJvb21fc2l6ZSIsYSksYz1nZXRfZGMoInJvb21fbGF5b3V0IixhKTthLmh1Z2Vfcm9vbXM9Yi5odWdlO2EuY29tcGxleF9yb29tcz1jLmNvbXBsZXg7YS5uX3Jvb21zPTA7YS5yb29tPVtdO3JldHVybiBhPWEucm9vbV9sYXlvdXQ9PSJkZW5zZSI\/ZGVuc2Vfcm9vbXMoYSk6c2NhdHRlcl9yb29tcyhhKX0KZnVuY3Rpb24gc2NhdHRlcl9yb29tcyhhKXt2YXIgYj1hbGxvY19yb29tcyhhKSxjO2ZvcihjPTA7YzxiO2MrKylhPWVtcGxhY2Vfcm9vbShhKTtpZihhLmh1Z2Vfcm9vbXMpe2I9YWxsb2Nfcm9vbXMoYSwibWVkaXVtIik7Zm9yKGM9MDtjPGI7YysrKXt2YXIgZD17c2l6ZToibWVkaXVtIn07YT1lbXBsYWNlX3Jvb20oYSxkKX19cmV0dXJuIGF9ZnVuY3Rpb24gYWxsb2Nfcm9vbXMoYSxiKXthPWE7dmFyIGM9Ynx8YS5yb29tX3NpemU7Yj1hLm5fY29scyphLm5fcm93czt2YXIgZD1kYy5yb29tX3NpemVbY107Yz1kLnNpemV8fDI7ZD1kLnJhZGl4fHw1O2M9YytkKzE7Yz1jKmM7Yj1NYXRoLmZsb29yKGIvYykqMjtpZihhLnJvb21fbGF5b3V0PT0ic3BhcnNlIiliLz0xMztyZXR1cm4gYn0KZnVuY3Rpb24gZGVuc2Vfcm9vbXMoYSl7dmFyIGI7Zm9yKGI9MDtiPGEubl9pO2IrKyl7dmFyIGM9YioyKzEsZDtmb3IoZD0wO2Q8YS5uX2o7ZCsrKXt2YXIgZT1kKjIrMTtpZighKGEuY2VsbFtjXVtlXSZST09NKSlpZighKChiPT0wfHxkPT0wKSYmcmFuZG9tKDIpPjApKXt2YXIgZz17aTpiLGo6ZH07YT1lbXBsYWNlX3Jvb20oYSxnKTtpZihhLmh1Z2Vfcm9vbXMpaWYoIShhLmNlbGxbY11bZV0mUk9PTSkpe2c9e2k6YixqOmQsc2l6ZToibWVkaXVtIn07YT1lbXBsYWNlX3Jvb20oYSxnKX19fX1yZXR1cm4gYX0KZnVuY3Rpb24gZW1wbGFjZV9yb29tKGEsYil7YT1hO2lmKGEubl9yb29tcz09OTk5KXJldHVybiBhO3ZhciBjPWJ8fHt9O2M9c2V0X3Jvb20oYSxjKTtiPWMuaSoyKzE7dmFyIGQ9Yy5qKjIrMSxlPShjLmkrYy5oZWlnaHQpKjItMSxnPShjLmorYy53aWR0aCkqMi0xO2lmKGI8MXx8ZT5hLm1heF9yb3cpcmV0dXJuIGE7aWYoZDwxfHxnPmEubWF4X2NvbClyZXR1cm4gYTt2YXIgZj1zb3VuZF9yb29tKGEsYixkLGUsZyk7aWYoZi5ibG9ja2VkKXJldHVybiBhO2Y9JEgoZikua2V5cygpO3ZhciBoPWYubGVuZ3RoO2lmKGg9PTApe2Y9YS5uX3Jvb21zKzE7YS5uX3Jvb21zPWZ9ZWxzZSBpZihoPT0xKWlmKGEuY29tcGxleF9yb29tcyl7Zj1mWzBdO2lmKGYhPWMuY29tcGxleF9pZClyZXR1cm4gYX1lbHNlIHJldHVybiBhO2Vsc2UgcmV0dXJuIGE7Zm9yKGg9YjtoPD1lO2grKyl7dmFyIGk7Zm9yKGk9ZDtpPD1nO2krKyl7aWYoYS5jZWxsW2hdW2ldJkVOVFJBTkNFKWEuY2VsbFtoXVtpXSY9Cn5FU1BBQ0U7ZWxzZSBpZihhLmNlbGxbaF1baV0mUEVSSU1FVEVSKWEuY2VsbFtoXVtpXSY9flBFUklNRVRFUjthLmNlbGxbaF1baV18PVJPT018Zjw8Nn19aD0oZS1iKzEpKjEwO2k9KGctZCsxKSoxMDtjPXtpZDpmLHNpemU6Yy5zaXplLHJvdzpiLGNvbDpkLG5vcnRoOmIsc291dGg6ZSx3ZXN0OmQsZWFzdDpnLGhlaWdodDpoLHdpZHRoOmksZG9vcjp7bm9ydGg6W10sc291dGg6W10sd2VzdDpbXSxlYXN0OltdfX07aWYoaD1hLnJvb21bZl0paWYoaC5jb21wbGV4KWguY29tcGxleC5wdXNoKGMpO2Vsc2V7Y29tcGxleD17Y29tcGxleDpbaCxjXX07YS5yb29tW2ZdPWNvbXBsZXh9ZWxzZSBhLnJvb21bZl09Yztmb3IoaD1iLTE7aDw9ZSsxO2grKyl7YS5jZWxsW2hdW2QtMV0mKFJPT018RU5UUkFOQ0UpfHwoYS5jZWxsW2hdW2QtMV18PVBFUklNRVRFUik7YS5jZWxsW2hdW2crMV0mKFJPT018RU5UUkFOQ0UpfHwoYS5jZWxsW2hdW2crMV18PVBFUklNRVRFUil9Zm9yKGk9ZC0xO2k8PQpnKzE7aSsrKXthLmNlbGxbYi0xXVtpXSYoUk9PTXxFTlRSQU5DRSl8fChhLmNlbGxbYi0xXVtpXXw9UEVSSU1FVEVSKTthLmNlbGxbZSsxXVtpXSYoUk9PTXxFTlRSQU5DRSl8fChhLmNlbGxbZSsxXVtpXXw9UEVSSU1FVEVSKX1yZXR1cm4gYX0KZnVuY3Rpb24gc2V0X3Jvb20oYSxiKXtiLnNpemV8fChiLnNpemU9YS5yb29tX3NpemUpO3ZhciBjPWRjLnJvb21fc2l6ZVtiLnNpemVdLGQ9Yy5zaXplfHwyO2M9Yy5yYWRpeHx8NTtpZighKCJoZWlnaHQiaW4gYikpaWYoImkiaW4gYil7dmFyIGU9YS5uX2ktZC1iLmk7aWYoZTwwKWU9MDtlPWU8Yz9lOmM7Yi5oZWlnaHQ9cmFuZG9tKGUpK2R9ZWxzZSBiLmhlaWdodD1yYW5kb20oYykrZDtpZighKCJ3aWR0aCJpbiBiKSlpZigiaiJpbiBiKXtlPWEubl9qLWQtYi5qO2lmKGU8MCllPTA7ZT1lPGM\/ZTpjO2Iud2lkdGg9cmFuZG9tKGUpK2R9ZWxzZSBiLndpZHRoPXJhbmRvbShjKStkOyJpImluIGJ8fChiLmk9cmFuZG9tKGEubl9pLWIuaGVpZ2h0KSk7ImoiaW4gYnx8KGIuaj1yYW5kb20oYS5uX2otYi53aWR0aCkpO3JldHVybiBifQpmdW5jdGlvbiBzb3VuZF9yb29tKGEsYixjLGQsZSl7dmFyIGc9e307Zm9yKGI9YjtiPD1kO2IrKyl7dmFyIGY7Zm9yKGY9YztmPD1lO2YrKyl7aWYoYS5jZWxsW2JdW2ZdJkJMT0NLRUQpcmV0dXJue2Jsb2NrZWQ6MX07aWYoYS5jZWxsW2JdW2ZdJlJPT00pe3ZhciBoPShhLmNlbGxbYl1bZl0mUk9PTV9JRCk+PjY7Z1toXSs9MX19fXJldHVybiBnfXZhciBjb25uZWN0PXt9O2Z1bmN0aW9uIG9wZW5fcm9vbXMoYSl7Y29ubmVjdD17fTt2YXIgYjtmb3IoYj0xO2I8PWEubl9yb29tcztiKyspYT1vcGVuX3Jvb20oYSxhLnJvb21bYl0pO3JldHVybiBhfQpmdW5jdGlvbiBvcGVuX3Jvb20oYSxiKXt2YXIgYz1kb29yX3NpbGxzKGEsYik7aWYoIWMubGVuZ3RoKXJldHVybiBhO3ZhciBkPWFsbG9jX29wZW5zKGEsYiksZTtmb3IoZT0wO2U8ZDtlKyspe3ZhciBnPWMuc3BsaWNlKHJhbmRvbShjLmxlbmd0aCksMSkuc2hpZnQoKTtpZighZylicmVhazt2YXIgZj1nLmRvb3JfcixoPWcuZG9vcl9jO2Y9YS5jZWxsW2ZdW2hdO2lmKCEoZiZET09SU1BBQ0UpKWlmKGY9Zy5vdXRfaWQpe2Y9W2IuaWQsZl0uc29ydChjbXBfaW50KS5qb2luKCIsIik7aWYoIWNvbm5lY3RbZl0pe2E9b3Blbl9kb29yKGEsYixnKTtjb25uZWN0W2ZdPTF9fWVsc2UgYT1vcGVuX2Rvb3IoYSxiLGcpfXJldHVybiBhfWZ1bmN0aW9uIGNtcF9pbnQoYSxiKXtyZXR1cm4gYS1ifQpmdW5jdGlvbiBkb29yX3NpbGxzKGEsYil7dmFyIGM9YS5jZWxsLGQsZT1bXTtpZihiLmNvbXBsZXgpYi5jb21wbGV4LmVhY2goZnVuY3Rpb24oayl7az1kb29yX3NpbGxzKGEsayk7aWYoay5sZW5ndGgpZT1lLmNvbmNhdChrKX0pO2Vsc2V7dmFyIGc9Yi5ub3J0aCxmPWIuc291dGgsaD1iLndlc3QsaT1iLmVhc3Q7aWYoZz49Myl7dmFyIGo7Zm9yKGo9aDtqPD1pO2orPTIpaWYoZD1jaGVja19zaWxsKGMsYixnLGosIm5vcnRoIikpZS5wdXNoKGQpfWlmKGY8PWEubl9yb3dzLTMpZm9yKGo9aDtqPD1pO2orPTIpaWYoZD1jaGVja19zaWxsKGMsYixmLGosInNvdXRoIikpZS5wdXNoKGQpO2lmKGg+PTMpZm9yKGo9ZztqPD1mO2orPTIpaWYoZD1jaGVja19zaWxsKGMsYixqLGgsIndlc3QiKSllLnB1c2goZCk7aWYoaTw9YS5uX2NvbHMtMylmb3Ioaj1nO2o8PWY7ais9MilpZihkPWNoZWNrX3NpbGwoYyxiLGosaSwiZWFzdCIpKWUucHVzaChkKX1yZXR1cm4gZX0KZnVuY3Rpb24gY2hlY2tfc2lsbChhLGIsYyxkLGUpe3ZhciBnPWMrZGlbZV0sZj1kK2RqW2VdLGg9YVtnXVtmXTtpZighKGgmUEVSSU1FVEVSKSlyZXR1cm4gZmFsc2U7aWYoaCZCTE9DS19ET09SKXJldHVybiBmYWxzZTtoPWcrZGlbZV07dmFyIGk9ZitkaltlXTthPWFbaF1baV07aWYoYSZCTE9DS0VEKXJldHVybiBmYWxzZTthPShhJlJPT01fSUQpPj42O2lmKGE9PWIuaWQpcmV0dXJuIGZhbHNlO3JldHVybiBiPXtzaWxsX3I6YyxzaWxsX2M6ZCxkaXI6ZSxkb29yX3I6Zyxkb29yX2M6ZixvdXRfaWQ6YX19ZnVuY3Rpb24gYWxsb2Nfb3BlbnMoYSxiKXthPShiLnNvdXRoLWIubm9ydGgpLzIrMTtiPShiLmVhc3QtYi53ZXN0KS8yKzE7Yj1NYXRoLmZsb29yKE1hdGguc3FydChiKmEpKTtyZXR1cm4gYj1iK3JhbmRvbShiKX1kYy5kb29ycy5ub25lLnRhYmxlPXsiMDEtMTUiOkFSQ0h9O2RjLmRvb3JzLmJhc2ljLnRhYmxlPXsiMDEtMTUiOkFSQ0gsIjE2LTYwIjpET09SfTsKZGMuZG9vcnMuc2VjdXJlLnRhYmxlPXsiMDEtMTUiOkFSQ0gsIjE2LTYwIjpET09SLCI2MS03NSI6TE9DS0VEfTtkYy5kb29ycy5zdGFuZGFyZC50YWJsZT17IjAxLTE1IjpBUkNILCIxNi02MCI6RE9PUiwiNjEtNzUiOkxPQ0tFRCwiNzYtOTAiOlRSQVBQRUQsIjkxLTEwMCI6U0VDUkVULCIxMDEtMTEwIjpQT1JUQ307ZGMuZG9vcnMuZGVhdGh0cmFwLnRhYmxlPXsiMDEtMTUiOkFSQ0gsIjE2LTMwIjpUUkFQUEVELCIzMS00MCI6U0VDUkVUfTsKZnVuY3Rpb24gb3Blbl9kb29yKGEsYixjKXt2YXIgZD1nZXRfZGMoImRvb3JzIixhKSxlPWQudGFibGU7ZD1jLmRvb3Jfcjt2YXIgZz1jLmRvb3JfYyxmPWMuc2lsbF9yLGg9Yy5zaWxsX2MsaT1jLmRpcjtjPWMub3V0X2lkO3ZhciBqO2ZvcihqPTA7ajwzO2orKyl7dmFyIGs9ZitkaVtpXSpqLGw9aCtkaltpXSpqO2EuY2VsbFtrXVtsXSY9flBFUklNRVRFUjthLmNlbGxba11bbF18PUVOVFJBTkNFfWU9c2VsZWN0X2Zyb21fdGFibGUoZSk7Zj17cm93OmQsY29sOmd9O2lmKGU9PUFSQ0gpe2EuY2VsbFtkXVtnXXw9QVJDSDtmLmtleT0iYXJjaCI7Zi50eXBlPSJBcmNod2F5In1lbHNlIGlmKGU9PURPT1Ipe2EuY2VsbFtkXVtnXXw9RE9PUjtmLmtleT0ib3BlbiI7Zi50eXBlPSJVbmxvY2tlZCBEb29yIn1lbHNlIGlmKGU9PUxPQ0tFRCl7YS5jZWxsW2RdW2ddfD1MT0NLRUQ7Zi5rZXk9ImxvY2siO2YudHlwZT0iTG9ja2VkIERvb3IifWVsc2UgaWYoZT09VFJBUFBFRCl7YS5jZWxsW2RdW2ddfD0KVFJBUFBFRDtmLmtleT0idHJhcCI7Zi50eXBlPSJUcmFwcGVkIERvb3IifWVsc2UgaWYoZT09U0VDUkVUKXthLmNlbGxbZF1bZ118PVNFQ1JFVDtmLmtleT0ic2VjcmV0IjtmLnR5cGU9IlNlY3JldCBEb29yIn1lbHNlIGlmKGU9PVBPUlRDKXthLmNlbGxbZF1bZ118PVBPUlRDO2Yua2V5PSJwb3J0YyI7Zi50eXBlPSJQb3J0Y3VsbGlzIn1pZihjKWYub3V0X2lkPWM7Yi5kb29yW2ldLnB1c2goZik7Yi5sYXN0X2Rvb3I9ZjtyZXR1cm4gYX1mdW5jdGlvbiBsYWJlbF9yb29tcyhhKXt2YXIgYjtmb3IoYj0xO2I8PWEubl9yb29tcztiKyspe3ZhciBjPWEucm9vbVtiXSxkPWMuaWQudG9TdHJpbmcoKSxlPWQubGVuZ3RoLGc9TWF0aC5mbG9vcigoYy5ub3J0aCtjLnNvdXRoKS8yKTtjPU1hdGguZmxvb3IoKGMud2VzdCtjLmVhc3QtZSkvMikrMTt2YXIgZjtmb3IoZj0wO2Y8ZTtmKyspYS5jZWxsW2ddW2MrZl18PWQuY2hhckNvZGVBdChmKTw8MjR9cmV0dXJuIGF9CmZ1bmN0aW9uIGNvcnJpZG9ycyhhKXt2YXIgYj1nZXRfZGMoImNvcnJpZG9yX2xheW91dCIsYSk7YS5zdHJhaWdodF9wY3Q9Yi5wY3Q7Zm9yKGI9MTtiPGEubl9pO2IrKyl7dmFyIGM9YioyKzEsZDtmb3IoZD0xO2Q8YS5uX2o7ZCsrKXt2YXIgZT1kKjIrMTthLmNlbGxbY11bZV0mQ09SUklET1J8fChhPXR1bm5lbChhLGIsZCkpfX1yZXR1cm4gYX1mdW5jdGlvbiB0dW5uZWwoYSxiLGMsZCl7ZD10dW5uZWxfZGlycyhhLGQpO2QuZWFjaChmdW5jdGlvbihlKXtpZihvcGVuX3R1bm5lbChhLGIsYyxlKSl7dmFyIGc9YitkaVtlXSxmPWMrZGpbZV07YT10dW5uZWwoYSxnLGYsZSl9fSk7cmV0dXJuIGF9ZnVuY3Rpb24gdHVubmVsX2RpcnMoYSxiKXt2YXIgYz1zaHVmZmxlKGRqX2RpcnMpO2ImJmEuc3RyYWlnaHRfcGN0JiZyYW5kb20oMTAwKTxhLnN0cmFpZ2h0X3BjdCYmYy51bnNoaWZ0KGIpO3JldHVybiBjfQpmdW5jdGlvbiBzaHVmZmxlKGEpe2E9YS5jb25jYXQoKTt2YXIgYjtmb3IoYj1hLmxlbmd0aC0xO2I+MDtiLS0pe3ZhciBjPXJhbmRvbShiKzEpLGQ9YVtiXTthW2JdPWFbY107YVtjXT1kfXJldHVybiBhfWZ1bmN0aW9uIG9wZW5fdHVubmVsKGEsYixjLGQpe3ZhciBlPWIqMisxLGc9YyoyKzE7Yj0oYitkaVtkXSkqMisxO2M9KGMrZGpbZF0pKjIrMTtkPShlK2IpLzI7dmFyIGY9KGcrYykvMjtyZXR1cm4gc291bmRfdHVubmVsKGEsZCxmLGIsYyk\/ZGVsdmVfdHVubmVsKGEsZSxnLGIsYyk6ZmFsc2V9CmZ1bmN0aW9uIHNvdW5kX3R1bm5lbChhLGIsYyxkLGUpe2lmKGQ8MHx8ZD5hLm5fcm93cylyZXR1cm4gZmFsc2U7aWYoZTwwfHxlPmEubl9jb2xzKXJldHVybiBmYWxzZTtiPVtiLGRdLnNvcnQoY21wX2ludCk7Yz1bYyxlXS5zb3J0KGNtcF9pbnQpO2ZvcihlPWJbMF07ZTw9YlsxXTtlKyspZm9yKGQ9Y1swXTtkPD1jWzFdO2QrKylpZihhLmNlbGxbZV1bZF0mQkxPQ0tfQ09SUilyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gZGVsdmVfdHVubmVsKGEsYixjLGQsZSl7Yj1bYixkXS5zb3J0KGNtcF9pbnQpO2M9W2MsZV0uc29ydChjbXBfaW50KTtmb3IoZT1iWzBdO2U8PWJbMV07ZSsrKWZvcihkPWNbMF07ZDw9Y1sxXTtkKyspe2EuY2VsbFtlXVtkXSY9fkVOVFJBTkNFO2EuY2VsbFtlXVtkXXw9Q09SUklET1J9cmV0dXJuIHRydWV9CmZ1bmN0aW9uIGVtcGxhY2Vfc3RhaXJzKGEpe3ZhciBiPXN0YWlyX2VuZHMoYSk7aWYoIWIubGVuZ3RoKXJldHVybiBhO3ZhciBjPWFsbG9jX3N0YWlycyhhKTtpZihjPT0wKXJldHVybiBhO3ZhciBkPVtdLGU7Zm9yKGU9MDtlPGM7ZSsrKXt2YXIgZz1iLnNwbGljZShyYW5kb20oYi5sZW5ndGgpLDEpLnNoaWZ0KCk7aWYoIWcpYnJlYWs7dmFyIGY9Zy5yb3csaD1nLmNvbCxpPWU8Mj9lOnJhbmRvbSgyKTtpZihpPT0wKXthLmNlbGxbZl1baF18PVNUQUlSX0ROO2cua2V5PSJkb3duIn1lbHNle2EuY2VsbFtmXVtoXXw9U1RBSVJfVVA7Zy5rZXk9InVwIn1kLnB1c2goZyl9YS5zdGFpcj1kO3JldHVybiBhfQpmdW5jdGlvbiBzdGFpcl9lbmRzKGEpe3ZhciBiPWEuY2VsbCxjPVtdLGQ7Zm9yKGQ9MDtkPGEubl9pO2QrKyl7dmFyIGU9ZCoyKzEsZztmb3IoZz0wO2c8YS5uX2o7ZysrKXt2YXIgZj1nKjIrMTtpZihhLmNlbGxbZV1bZl09PUNPUlJJRE9SKWEuY2VsbFtlXVtmXSZTVEFJUlN8fCRIKHN0YWlyX2VuZCkua2V5cygpLmVhY2goZnVuY3Rpb24oaCl7aWYoY2hlY2tfdHVubmVsKGIsZSxmLHN0YWlyX2VuZFtoXSkpe3ZhciBpPXtyb3c6ZSxjb2w6ZixkaXI6aH07aD1zdGFpcl9lbmRbaF0ubmV4dDtpLm5leHRfcm93PWkucm93K2hbMF07aS5uZXh0X2NvbD1pLmNvbCtoWzFdO2MucHVzaChpKX19KX19cmV0dXJuIGN9CnZhciBzdGFpcl9lbmQ9e25vcnRoOnt3YWxsZWQ6W1sxLC0xXSxbMCwtMV0sWy0xLC0xXSxbLTEsMF0sWy0xLDFdLFswLDFdLFsxLDFdXSxjb3JyaWRvcjpbWzAsMF0sWzEsMF0sWzIsMF1dLHN0YWlyOlswLDBdLG5leHQ6WzEsMF19LHNvdXRoOnt3YWxsZWQ6W1stMSwtMV0sWzAsLTFdLFsxLC0xXSxbMSwwXSxbMSwxXSxbMCwxXSxbLTEsMV1dLGNvcnJpZG9yOltbMCwwXSxbLTEsMF0sWy0yLDBdXSxzdGFpcjpbMCwwXSxuZXh0OlstMSwwXX0sd2VzdDp7d2FsbGVkOltbLTEsMV0sWy0xLDBdLFstMSwtMV0sWzAsLTFdLFsxLC0xXSxbMSwwXSxbMSwxXV0sY29ycmlkb3I6W1swLDBdLFswLDFdLFswLDJdXSxzdGFpcjpbMCwwXSxuZXh0OlswLDFdfSxlYXN0Ont3YWxsZWQ6W1stMSwtMV0sWy0xLDBdLFstMSwxXSxbMCwxXSxbMSwxXSxbMSwwXSxbMSwtMV1dLGNvcnJpZG9yOltbMCwwXSxbMCwtMV0sWzAsLTJdXSxzdGFpcjpbMCwwXSxuZXh0OlswLC0xXX19OwpmdW5jdGlvbiBjaGVja190dW5uZWwoYSxiLGMsZCl7dmFyIGU9dHJ1ZSxnO2lmKGc9ZC5jb3JyaWRvcil7Zy5lYWNoKGZ1bmN0aW9uKGYpe2lmKGFbYitmWzBdXSlpZihhW2IrZlswXV1bYytmWzFdXSE9Q09SUklET1IpZT1mYWxzZX0pO2lmKCFlKXJldHVybiBmYWxzZX1pZihkPWQud2FsbGVkKXtkLmVhY2goZnVuY3Rpb24oZil7aWYoYVtiK2ZbMF1dKWlmKGFbYitmWzBdXVtjK2ZbMV1dJk9QRU5TUEFDRSllPWZhbHNlfSk7aWYoIWUpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIGFsbG9jX3N0YWlycyhhKXt2YXIgYj0wO2lmKGEuYWRkX3N0YWlycz09Im1hbnkiKXthPWEubl9jb2xzKmEubl9yb3dzO2I9MytyYW5kb20oTWF0aC5mbG9vcihhLzFFMykpfWVsc2UgaWYoYS5hZGRfc3RhaXJzPT0ieWVzIiliPTI7cmV0dXJuIGJ9ZnVuY3Rpb24gcGVyaXBoZXJhbF9lZ3Jlc3MoYSl7cmV0dXJuIGF9CmZ1bmN0aW9uIGdlbGF0aW5vdXNfY3ViZShhKXtpZihhLnJlbW92ZV9kZWFkZW5kcylhPXJlbW92ZV9kZWFkZW5kcyhhKTtpZihhLnJlbW92ZV9kZWFkZW5kcylpZihhLmNvcnJpZG9yX2xheW91dD09ImVycmFudCIpYS5jbG9zZV9hcmNzPWEucmVtb3ZlX3BjdDtlbHNlIGlmKGEuY29ycmlkb3JfbGF5b3V0PT0ic3RyYWlnaHQiKWEuY2xvc2VfYXJjcz1hLnJlbW92ZV9wY3Q7aWYoYS5jbG9zZV9hcmNzKWE9Y2xvc2VfYXJjcyhhKTthPWZpeF9kb29ycyhhKTtyZXR1cm4gYT1lbXB0eV9ibG9ja3MoYSl9ZnVuY3Rpb24gcmVtb3ZlX2RlYWRlbmRzKGEpe3ZhciBiPWdldF9kYygicmVtb3ZlX2RlYWRlbmRzIixhKTthLnJlbW92ZV9wY3Q9Yi5wY3Q7Yj1hLnJlbW92ZV9wY3Q7cmV0dXJuIGNvbGxhcHNlX3R1bm5lbHMoYSxiLGNsb3NlX2VuZCl9CnZhciBjbG9zZV9lbmQ9e25vcnRoOnt3YWxsZWQ6W1swLC0xXSxbMSwtMV0sWzEsMF0sWzEsMV0sWzAsMV1dLGNsb3NlOltbMCwwXV0scmVjdXJzZTpbLTEsMF19LHNvdXRoOnt3YWxsZWQ6W1swLC0xXSxbLTEsLTFdLFstMSwwXSxbLTEsMV0sWzAsMV1dLGNsb3NlOltbMCwwXV0scmVjdXJzZTpbMSwwXX0sd2VzdDp7d2FsbGVkOltbLTEsMF0sWy0xLDFdLFswLDFdLFsxLDFdLFsxLDBdXSxjbG9zZTpbWzAsMF1dLHJlY3Vyc2U6WzAsLTFdfSxlYXN0Ont3YWxsZWQ6W1stMSwwXSxbLTEsLTFdLFswLC0xXSxbMSwtMV0sWzEsMF1dLGNsb3NlOltbMCwwXV0scmVjdXJzZTpbMCwxXX19O2Z1bmN0aW9uIGNsb3NlX2FyY3MoYSl7dmFyIGI9YS5jbG9zZV9hcmNzO3JldHVybiBjb2xsYXBzZV90dW5uZWxzKGEsYixjbG9zZV9hcmNzKX0KdmFyIGNsb3NlX2FyYz17Im5vcnRoLXdlc3QiOntjb3JyaWRvcjpbWzAsMF0sWy0xLDBdLFstMiwwXSxbLTIsLTFdLFstMiwtMl0sWy0xLC0yXSxbMCwtMl1dLHdhbGxlZDpbWy0xLDFdLFstMiwxXSxbLTMsMV0sWy0zLDBdLFstMywtMV0sWy0zLC0yXSxbLTMsLTNdLFstMiwtM10sWy0xLC0zXSxbMCwtMV0sWy0xLC0xXV0sY2xvc2U6W1stMSwwXSxbLTIsMF0sWy0yLC0xXSxbLTIsLTJdLFstMSwtMl1dLG9wZW46WzAsLTFdLHJlY3Vyc2U6WzIsMF19LCJub3J0aC1lYXN0Ijp7Y29ycmlkb3I6W1swLDBdLFstMSwwXSxbLTIsMF0sWy0yLDFdLFstMiwyXSxbLTEsMl0sWzAsMl1dLHdhbGxlZDpbWy0xLC0xXSxbLTIsLTFdLFstMywtMV0sWy0zLDBdLFstMywxXSxbLTMsMl0sWy0zLDNdLFstMiwzXSxbLTEsM10sWzAsMV0sWy0xLDFdXSxjbG9zZTpbWy0xLDBdLFstMiwwXSxbLTIsMV0sWy0yLDJdLFstMSwyXV0sb3BlbjpbMCwxXSxyZWN1cnNlOlsyLDBdfSwic291dGgtd2VzdCI6e2NvcnJpZG9yOltbMCwKMF0sWzEsMF0sWzIsMF0sWzIsLTFdLFsyLC0yXSxbMSwtMl0sWzAsLTJdXSx3YWxsZWQ6W1sxLDFdLFsyLDFdLFszLDFdLFszLDBdLFszLC0xXSxbMywtMl0sWzMsLTNdLFsyLC0zXSxbMSwtM10sWzAsLTFdLFsxLC0xXV0sY2xvc2U6W1sxLDBdLFsyLDBdLFsyLC0xXSxbMiwtMl0sWzEsLTJdXSxvcGVuOlswLC0xXSxyZWN1cnNlOlstMiwwXX0sInNvdXRoLWVhc3QiOntjb3JyaWRvcjpbWzAsMF0sWzEsMF0sWzIsMF0sWzIsMV0sWzIsMl0sWzEsMl0sWzAsMl1dLHdhbGxlZDpbWzEsLTFdLFsyLC0xXSxbMywtMV0sWzMsMF0sWzMsMV0sWzMsMl0sWzMsM10sWzIsM10sWzEsM10sWzAsMV0sWzEsMV1dLGNsb3NlOltbMSwwXSxbMiwwXSxbMiwxXSxbMiwyXSxbMSwyXV0sb3BlbjpbMCwxXSxyZWN1cnNlOlstMiwwXX0sIndlc3Qtbm9ydGgiOntjb3JyaWRvcjpbWzAsMF0sWzAsLTFdLFswLC0yXSxbLTEsLTJdLFstMiwtMl0sWy0yLC0xXSxbLTIsMF1dLHdhbGxlZDpbWzEsLTFdLFsxLC0yXSwKWzEsLTNdLFswLC0zXSxbLTEsLTNdLFstMiwtM10sWy0zLC0zXSxbLTMsLTJdLFstMywtMV0sWy0xLDBdLFstMSwtMV1dLGNsb3NlOltbMCwtMV0sWzAsLTJdLFstMSwtMl0sWy0yLC0yXSxbLTIsLTFdXSxvcGVuOlstMSwwXSxyZWN1cnNlOlswLDJdfSwid2VzdC1zb3V0aCI6e2NvcnJpZG9yOltbMCwwXSxbMCwtMV0sWzAsLTJdLFsxLC0yXSxbMiwtMl0sWzIsLTFdLFsyLDBdXSx3YWxsZWQ6W1stMSwtMV0sWy0xLC0yXSxbLTEsLTNdLFswLC0zXSxbMSwtM10sWzIsLTNdLFszLC0zXSxbMywtMl0sWzMsLTFdLFsxLDBdLFsxLC0xXV0sY2xvc2U6W1swLC0xXSxbMCwtMl0sWzEsLTJdLFsyLC0yXSxbMiwtMV1dLG9wZW46WzEsMF0scmVjdXJzZTpbMCwyXX0sImVhc3Qtbm9ydGgiOntjb3JyaWRvcjpbWzAsMF0sWzAsMV0sWzAsMl0sWy0xLDJdLFstMiwyXSxbLTIsMV0sWy0yLDBdXSx3YWxsZWQ6W1sxLDFdLFsxLDJdLFsxLDNdLFswLDNdLFstMSwzXSxbLTIsM10sWy0zLDNdLFstMywyXSwKWy0zLDFdLFstMSwwXSxbLTEsMV1dLGNsb3NlOltbMCwxXSxbMCwyXSxbLTEsMl0sWy0yLDJdLFstMiwxXV0sb3BlbjpbLTEsMF0scmVjdXJzZTpbMCwtMl19LCJlYXN0LXNvdXRoIjp7Y29ycmlkb3I6W1swLDBdLFswLDFdLFswLDJdLFsxLDJdLFsyLDJdLFsyLDFdLFsyLDBdXSx3YWxsZWQ6W1stMSwxXSxbLTEsMl0sWy0xLDNdLFswLDNdLFsxLDNdLFsyLDNdLFszLDNdLFszLDJdLFszLDFdLFsxLDBdLFsxLDFdXSxjbG9zZTpbWzAsMV0sWzAsMl0sWzEsMl0sWzIsMl0sWzIsMV1dLG9wZW46WzEsMF0scmVjdXJzZTpbMCwtMl19fTsKZnVuY3Rpb24gY29sbGFwc2VfdHVubmVscyhhLGIsYyl7dmFyIGQ9Yj09MTAwLGU7Zm9yKGU9MDtlPGEubl9pO2UrKyl7dmFyIGc9ZSoyKzEsZjtmb3IoZj0wO2Y8YS5uX2o7ZisrKXt2YXIgaD1mKjIrMTtpZihhLmNlbGxbZ11baF0mT1BFTlNQQUNFKWlmKCEoYS5jZWxsW2ddW2hdJlNUQUlSUykpaWYoZHx8cmFuZG9tKDEwMCk8YilhPWNvbGxhcHNlKGEsZyxoLGMpfX1yZXR1cm4gYX0KZnVuY3Rpb24gY29sbGFwc2UoYSxiLGMsZCl7dmFyIGU9YS5jZWxsO2lmKCEoYS5jZWxsW2JdW2NdJk9QRU5TUEFDRSkpcmV0dXJuIGE7JEgoZCkua2V5cygpLmVhY2goZnVuY3Rpb24oZyl7aWYoY2hlY2tfdHVubmVsKGUsYixjLGRbZ10pKXt2YXIgZjtpZihmPWRbZ10uY2xvc2UpZi5lYWNoKGZ1bmN0aW9uKGgpe2VbYitoWzBdXVtjK2hbMV1dPU5PVEhJTkd9KTtpZihmPWRbZ10ub3BlbillW2IrZlswXV1bYytmWzFdXXw9Q09SUklET1I7aWYoZz1kW2ddLnJlY3Vyc2UpYT1jb2xsYXBzZShhLGIrZ1swXSxjK2dbMV0sZCl9fSk7YS5jZWxsPWU7cmV0dXJuIGF9CmZ1bmN0aW9uIGZpeF9kb29ycyhhKXt2YXIgYj17fSxjPVtdO2Eucm9vbS5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWQuaWQ7JEgoZC5kb29yKS5rZXlzKCkuZWFjaChmdW5jdGlvbihnKXt2YXIgZj1bXTtkLmRvb3JbZ10uZWFjaChmdW5jdGlvbihoKXt2YXIgaT1oLnJvdyxqPWguY29sLGs9YS5jZWxsW2ldW2pdO2lmKGsmT1BFTlNQQUNFKXtpPVtpLGpdLmpvaW4oIiwiKTtpZihiW2ldKWYucHVzaChoKTtlbHNle2lmKGo9aC5vdXRfaWQpe2s9YS5yb29tW2pdO3ZhciBsPW9wcG9zaXRlW2ddO2gub3V0X2lkPXt9O2gub3V0X2lkW2VdPWo7aC5vdXRfaWRbal09ZTtrLmRvb3JbbF0ucHVzaChoKX1mLnB1c2goaCk7YltpXT10cnVlfX19KTtpZihmLmxlbmd0aCl7ZC5kb29yW2ddPWY7Yz1jLmNvbmNhdChmKX1lbHNlIGQuZG9vcltnXT1bXX0pfSk7YS5kb29yPWM7cmV0dXJuIGF9CmZ1bmN0aW9uIGVtcHR5X2Jsb2NrcyhhKXt2YXIgYj1hLmNlbGwsYztmb3IoYz0wO2M8PWEubl9yb3dzO2MrKyl7dmFyIGQ7Zm9yKGQ9MDtkPD1hLm5fY29scztkKyspaWYoYltjXVtkXSZCTE9DS0VEKWJbY11bZF09Tk9USElOR31hLmNlbGw9YjtyZXR1cm4gYX0KdmFyIHBhbGV0dGU9e3N0YW5kYXJkOntjb2xvcnM6e2ZpbGw6IiMwMDAwMDAiLG9wZW46IiNmZmZmZmYiLG9wZW5fZ3JpZDoiI2NjY2NjYyJ9fSxjbGFzc2ljOntjb2xvcnM6e2ZpbGw6IiMzMzk5Y2MiLG9wZW46IiNmZmZmZmYiLG9wZW5fZ3JpZDoiIzMzOTljYyIsaG92ZXI6IiNiNmRlZjIifX0sZ3JhcGg6e2NvbG9yczp7ZmlsbDoiI2ZmZmZmZiIsb3BlbjoiI2ZmZmZmZiIsZ3JpZDoiI2M5ZWJmNSIsd2FsbDoiIzY2NjY2NiIsd2FsbF9zaGFkaW5nOiIjNjY2NjY2Iixkb29yOiIjMzMzMzMzIixsYWJlbDoiIzMzMzMzMyIsdGFnOiIjNjY2NjY2In19fSxjb2xvcl9jaGFpbj17ZG9vcjoiZmlsbCIsbGFiZWw6ImZpbGwiLHN0YWlyOiJ3YWxsIix3YWxsOiJmaWxsIixmaWxsOiJibGFjayIsdGFnOiJ3aGl0ZSJ9OwpmdW5jdGlvbiBpbWFnZV9kdW5nZW9uKGEpe3ZhciBiPXNjYWxlX2R1bmdlb24oYSksYz1uZXdfaW1hZ2UoYi53aWR0aCxiLmhlaWdodCksZD1nZXRfcGFsZXR0ZShiKTtiLnBhbGV0dGU9ZDtkPWJhc2VfbGF5ZXIoYSxiLGMpO2IuYmFzZV9sYXllcj1kO2ZpbGxfaW1hZ2UoYSxiLGMpO29wZW5fY2VsbHMoYSxiLGMpO2ltYWdlX3dhbGxzKGEsYixjKTthLmRvb3ImJmltYWdlX2Rvb3JzKGEsYixjKTtpbWFnZV9sYWJlbHMoYSxiLGMpO2Euc3RhaXImJmltYWdlX3N0YWlycyhhLGIsYyl9ZnVuY3Rpb24gbmV3X2ltYWdlKGEsYil7dmFyIGM9JCgibWFwIik7Yy53aWR0aD1hO2MuaGVpZ2h0PWI7cmV0dXJuIGE9Yy5nZXRDb250ZXh0KCIyZCIpfQpmdW5jdGlvbiBzY2FsZV9kdW5nZW9uKGEpe3ZhciBiPXttYXBfc3R5bGU6YS5tYXBfc3R5bGUsZ3JpZDphLmdyaWR9O2IuY2VsbF9zaXplPWEuY2VsbF9zaXplO2Iud2lkdGg9KGEubl9jb2xzKzEpKmIuY2VsbF9zaXplKzE7Yi5oZWlnaHQ9KGEubl9yb3dzKzEpKmIuY2VsbF9zaXplKzE7Yi5tYXhfeD1iLndpZHRoLTE7Yi5tYXhfeT1iLmhlaWdodC0xO2E9TWF0aC5mbG9vcihiLmNlbGxfc2l6ZSowLjc1KTtiLmZvbnQ9YS50b1N0cmluZygpKyJweCBzYW5zLXNlcmlmIjtyZXR1cm4gYn0KZnVuY3Rpb24gZ2V0X3BhbGV0dGUoYSl7dmFyIGI7Yj1hLnBhbGV0dGU\/YS5wYWxldHRlOihzdHlsZT1hLm1hcF9zdHlsZSk\/cGFsZXR0ZVtzdHlsZV0\/cGFsZXR0ZVtzdHlsZV06cGFsZXR0ZS5zdGFuZGFyZDpwYWxldHRlLnN0YW5kYXJkO3ZhciBjO2lmKGM9Yi5jb2xvcnMpJEgoYykua2V5cygpLmVhY2goZnVuY3Rpb24oZCl7YltkXT1jW2RdfSk7Yi5ibGFja3x8KGIuYmxhY2s9IiMwMDAwMDAiKTtiLndoaXRlfHwoYi53aGl0ZT0iI2ZmZmZmZiIpO3JldHVybiBifWZ1bmN0aW9uIGdldF9jb2xvcihhLGIpe2Zvcig7Yjspe2lmKGFbYl0pcmV0dXJuIGFbYl07Yj1jb2xvcl9jaGFpbltiXX1yZXR1cm4iIzAwMDAwMCJ9CmZ1bmN0aW9uIGJhc2VfbGF5ZXIoYSxiKXt2YXIgYz1uZXcgRWxlbWVudCgiY2FudmFzIik7Yy53aWR0aD1iLndpZHRoO2MuaGVpZ2h0PWIuaGVpZ2h0O3ZhciBkPWMuZ2V0Q29udGV4dCgiMmQiKSxlPWIubWF4X3gsZz1iLm1heF95LGY9Yi5wYWxldHRlLGg7KGg9Zi5vcGVuKT9maWxsX3JlY3QoZCwwLDAsZSxnLGgpOmZpbGxfcmVjdChkLDAsMCxlLGcsZi53aGl0ZSk7aWYoaD1mLm9wZW5fZ3JpZClpbWFnZV9ncmlkKGEsYixoLGQpO2Vsc2UgaWYoaD1mLmdyaWQpaW1hZ2VfZ3JpZChhLGIsaCxkKTtyZXR1cm4gY31mdW5jdGlvbiBpbWFnZV9ncmlkKGEsYixjLGQpe2lmKGEuZ3JpZCE9Im5vbmUiKWlmKGEuZ3JpZD09ImhleCIpaGV4X2dyaWQoYSxiLGMsZCk7ZWxzZSBhLmdyaWQ9PSJ2ZXgiP3ZleF9ncmlkKGEsYixjLGQpOnNxdWFyZV9ncmlkKGEsYixjLGQpO3JldHVybiB0cnVlfQpmdW5jdGlvbiBzcXVhcmVfZ3JpZChhLGIsYyxkKXthPWIuY2VsbF9zaXplO3ZhciBlO2ZvcihlPTA7ZTw9Yi5tYXhfeDtlKz1hKWRyYXdfbGluZShkLGUsMCxlLGIubWF4X3ksYyk7Zm9yKGU9MDtlPD1iLm1heF95O2UrPWEpZHJhd19saW5lKGQsMCxlLGIubWF4X3gsZSxjKTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBoZXhfZ3JpZChhLGIsYyxkKXt2YXIgZT1iLmNlbGxfc2l6ZTthPWUvMy40NjQxMDE2MTUxO2U9ZS8yO3ZhciBnPWIud2lkdGgvKDMqYSk7Yj1iLmhlaWdodC9lO3ZhciBmO2ZvcihmPTA7ZjxnO2YrKyl7dmFyIGg9ZiozKmEsaT1oK2Esaj1oKzMqYSxrO2ZvcihrPTA7azxiO2srKyl7dmFyIGw9ayplLG89bCtlO2lmKChmK2spJTIhPTApe2RyYXdfbGluZShkLGgsbCxpLG8sYyk7ZHJhd19saW5lKGQsaSxvLGosbyxjKX1lbHNlIGRyYXdfbGluZShkLGksbCxoLG8sYyl9fXJldHVybiB0cnVlfQpmdW5jdGlvbiB2ZXhfZ3JpZChhLGIsYyxkKXt2YXIgZT1iLmNlbGxfc2l6ZTthPWUvMjtlPWUvMy40NjQxMDE2MTUxO3ZhciBnPWIud2lkdGgvYTtiPWIuaGVpZ2h0LygzKmUpO3ZhciBmO2ZvcihmPTA7ZjxiO2YrKyl7dmFyIGg9ZiozKmUsaT1oK2Usaj1oKzMqZSxrO2ZvcihrPTA7azxnO2srKyl7dmFyIGw9ayphLG89bCthO2lmKChmK2spJTIhPTApe2RyYXdfbGluZShkLGwsaCxvLGksYyk7ZHJhd19saW5lKGQsbyxpLG8saixjKX1lbHNlIGRyYXdfbGluZShkLGwsaSxvLGgsYyl9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBmaWxsX2ltYWdlKGEsYixjKXt2YXIgZD1iLm1heF94LGU9Yi5tYXhfeSxnPWIucGFsZXR0ZSxmOyhmPWcuZmlsbCk\/ZmlsbF9yZWN0KGMsMCwwLGQsZSxmKTpmaWxsX3JlY3QoYywwLDAsZCxlLGcuYmxhY2spO2lmKGY9Zy5maWxsKWZpbGxfcmVjdChjLDAsMCxkLGUsZik7aWYoZj1nLmZpbGxfZ3JpZClpbWFnZV9ncmlkKGEsYixmLGMpO2Vsc2UgaWYoZj1nLmdyaWQpaW1hZ2VfZ3JpZChhLGIsZixjKTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBvcGVuX2NlbGxzKGEsYixjKXt2YXIgZD1iLmNlbGxfc2l6ZTtiPWIuYmFzZV9sYXllcjt2YXIgZTtmb3IoZT0wO2U8PWEubl9yb3dzO2UrKyl7dmFyIGc9ZSpkLGY7Zm9yKGY9MDtmPD1hLm5fY29scztmKyspaWYoYS5jZWxsW2VdW2ZdJk9QRU5TUEFDRSl7dmFyIGg9ZipkO2MuZHJhd0ltYWdlKGIsaCxnLGQsZCxoLGcsZCxkKX19cmV0dXJuIHRydWV9CmZ1bmN0aW9uIGltYWdlX3dhbGxzKGEsYixjKXt2YXIgZD1iLmNlbGxfc2l6ZSxlPU1hdGguZmxvb3IoZC80KTtpZihlPDMpZT0zO2I9Yi5wYWxldHRlO3ZhciBnO2NhY2hlX3BpeGVscyh0cnVlKTt2YXIgZjtmb3IoZj0wO2Y8PWEubl9yb3dzO2YrKyl7dmFyIGg9ZipkLGk9aCtkLGo7Zm9yKGo9MDtqPD1hLm5fY29scztqKyspaWYoYS5jZWxsW2ZdW2pdJk9QRU5TUEFDRSl7dmFyIGs9aipkLGw9aytkO2lmKGc9Yi5iZXZlbF9udyl7YS5jZWxsW2ZdW2otMV0mT1BFTlNQQUNFfHxkcmF3X2xpbmUoYyxrLTEsaCxrLTEsaSxnKTthLmNlbGxbZi0xXVtqXSZPUEVOU1BBQ0V8fGRyYXdfbGluZShjLGssaC0xLGwsaC0xLGcpO2lmKGc9Yi5iZXZlbF9zZSl7YS5jZWxsW2ZdW2orMV0mT1BFTlNQQUNFfHxkcmF3X2xpbmUoYyxsKzEsaCsxLGwrMSxpLGcpO2EuY2VsbFtmKzFdW2pdJk9QRU5TUEFDRXx8ZHJhd19saW5lKGMsaysxLGkrMSxsLGkrMSxnKX19ZWxzZSBpZihnPWIud2FsbF9zaGFkaW5nKXthLmNlbGxbZi0KMV1bai0xXSZPUEVOU1BBQ0V8fHdhbGxfc2hhZGluZyhjLGstZSxoLWUsay0xLGgtMSxnKTthLmNlbGxbZi0xXVtqXSZPUEVOU1BBQ0V8fHdhbGxfc2hhZGluZyhjLGssaC1lLGwsaC0xLGcpO2EuY2VsbFtmLTFdW2orMV0mT1BFTlNQQUNFfHx3YWxsX3NoYWRpbmcoYyxsKzEsaC1lLGwrZSxoLTEsZyk7YS5jZWxsW2ZdW2otMV0mT1BFTlNQQUNFfHx3YWxsX3NoYWRpbmcoYyxrLWUsaCxrLTEsaSxnKTthLmNlbGxbZl1baisxXSZPUEVOU1BBQ0V8fHdhbGxfc2hhZGluZyhjLGwrMSxoLGwrZSxpLGcpO2EuY2VsbFtmKzFdW2otMV0mT1BFTlNQQUNFfHx3YWxsX3NoYWRpbmcoYyxrLWUsaSsxLGstMSxpK2UsZyk7YS5jZWxsW2YrMV1bal0mT1BFTlNQQUNFfHx3YWxsX3NoYWRpbmcoYyxrLGkrMSxsLGkrZSxnKTthLmNlbGxbZisxXVtqKzFdJk9QRU5TUEFDRXx8d2FsbF9zaGFkaW5nKGMsbCsxLGkrMSxsK2UsaStlLGcpfWlmKGc9Yi53YWxsKXthLmNlbGxbZi0xXVtqXSZPUEVOU1BBQ0V8fApkcmF3X2xpbmUoYyxrLGgsbCxoLGcpO2EuY2VsbFtmXVtqLTFdJk9QRU5TUEFDRXx8ZHJhd19saW5lKGMsayxoLGssaSxnKTthLmNlbGxbZl1baisxXSZPUEVOU1BBQ0V8fGRyYXdfbGluZShjLGwsaCxsLGksZyk7YS5jZWxsW2YrMV1bal0mT1BFTlNQQUNFfHxkcmF3X2xpbmUoYyxrLGksbCxpLGcpfX19ZHVtcF9waXhlbHMoYyk7cmV0dXJuIHRydWV9ZnVuY3Rpb24gd2FsbF9zaGFkaW5nKGEsYixjLGQsZSxnKXtmb3IoYj1iO2I8PWQ7YisrKXt2YXIgZjtmb3IoZj1jO2Y8PWU7ZisrKShiK2YpJTIhPTAmJnNldF9waXhlbChhLGIsZixnKX1yZXR1cm4gdHJ1ZX0KZnVuY3Rpb24gaW1hZ2VfZG9vcnMoYSxiLGMpe3ZhciBkPWEuZG9vcixlPWIuY2VsbF9zaXplLGc9TWF0aC5mbG9vcihlLzYpLGY9TWF0aC5mbG9vcihlLzQpLGg9TWF0aC5mbG9vcihlLzMpO2I9Yi5wYWxldHRlO3ZhciBpPWdldF9jb2xvcihiLCJ3YWxsIiksaj1nZXRfY29sb3IoYiwiZG9vciIpO2QuZWFjaChmdW5jdGlvbihrKXt2YXIgbD1rLnJvdyxvPWwqZSxwPWsuY29sLHE9cCplO2s9ZG9vcl9hdHRyKGspO3ZhciByPWEuY2VsbFtsXVtwLTFdJk9QRU5TUEFDRTtsPW8rZTtwPXErZTt2YXIgbT1NYXRoLmZsb29yKChvK2wpLzIpLG49TWF0aC5mbG9vcigocStwKS8yKTtpZihrLndhbGwpcj9kcmF3X2xpbmUoYyxuLG8sbixsLGkpOmRyYXdfbGluZShjLHEsbSxwLG0saSk7aWYoay5hcmNoKWlmKHIpe2ZpbGxfcmVjdChjLG4tMSxvLG4rMSxvK2csaSk7ZmlsbF9yZWN0KGMsbi0xLGwtZyxuKzEsbCxpKX1lbHNle2ZpbGxfcmVjdChjLHEsbS0xLHErZyxtKzEsaSk7ZmlsbF9yZWN0KGMsCnAtZyxtLTEscCxtKzEsaSl9aWYoay5kb29yKXI\/c3Ryb2tlX3JlY3QoYyxuLWYsbytnKzEsbitmLGwtZy0xLGopOnN0cm9rZV9yZWN0KGMscStnKzEsbS1mLHAtZy0xLG0rZixqKTtpZihrLmxvY2spcj9kcmF3X2xpbmUoYyxuLG8rZysxLG4sbC1nLTEsaik6ZHJhd19saW5lKGMscStnKzEsbSxwLWctMSxtLGopO2lmKGsudHJhcClyP2RyYXdfbGluZShjLG4taCxtLG4raCxtLGopOmRyYXdfbGluZShjLG4sbS1oLG4sbStoLGopO2lmKGsuc2VjcmV0KWlmKHIpe2RyYXdfbGluZShjLG4tMSxtLWYsbisyLG0tZixqKTtkcmF3X2xpbmUoYyxuLTIsbS1mKzEsbi0yLG0tMSxqKTtkcmF3X2xpbmUoYyxuLTEsbSxuKzEsbSxqKTtkcmF3X2xpbmUoYyxuKzIsbSsxLG4rMixtK2YtMSxqKTtkcmF3X2xpbmUoYyxuLTIsbStmLG4rMSxtK2Ysail9ZWxzZXtkcmF3X2xpbmUoYyxuLWYsbS0yLG4tZixtKzEsaik7ZHJhd19saW5lKGMsbi1mKzEsbSsyLG4tMSxtKzIsaik7ZHJhd19saW5lKGMsbixtLQoxLG4sbSsxLGopO2RyYXdfbGluZShjLG4rMSxtLTIsbitmLTEsbS0yLGopO2RyYXdfbGluZShjLG4rZixtLTEsbitmLG0rMixqKX1pZihrLnBvcnRjKWlmKHIpZm9yKG89bytnKzI7bzxsLWc7bys9MilzZXRfcGl4ZWwoYyxuLG8saik7ZWxzZSBmb3Iobz1xK2crMjtvPHAtZztvKz0yKXNldF9waXhlbChjLG8sbSxqKX0pO3JldHVybiB0cnVlfQpmdW5jdGlvbiBkb29yX2F0dHIoYSl7dmFyIGI7aWYoYS5rZXk9PSJhcmNoIiliPXthcmNoOjF9O2Vsc2UgaWYoYS5rZXk9PSJvcGVuIiliPXthcmNoOjEsZG9vcjoxfTtlbHNlIGlmKGEua2V5PT0ibG9jayIpYj17YXJjaDoxLGRvb3I6MSxsb2NrOjF9O2Vsc2UgaWYoYS5rZXk9PSJ0cmFwIil7Yj17YXJjaDoxLGRvb3I6MSx0cmFwOjF9O2lmKC9Mb2NrLy50ZXN0KGEuZGVzYykpYi5sb2NrPTF9ZWxzZSBpZihhLmtleT09InNlY3JldCIpYj17d2FsbDoxLGFyY2g6MSxzZWNyZXQ6MX07ZWxzZSBpZihhLmtleT09InBvcnRjIiliPXthcmNoOjEscG9ydGM6MX07cmV0dXJuIGJ9CmZ1bmN0aW9uIGltYWdlX2xhYmVscyhhLGIsYyl7dmFyIGQ9Yi5jZWxsX3NpemUsZT1NYXRoLmZsb29yKGQvMiksZz1iLnBhbGV0dGU7Yj1iLmZvbnQ7Zz1nZXRfY29sb3IoZywibGFiZWwiKTt2YXIgZjtmb3IoZj0wO2Y8PWEubl9yb3dzO2YrKyl7dmFyIGg7Zm9yKGg9MDtoPD1hLm5fY29scztoKyspaWYoYS5jZWxsW2ZdW2hdJk9QRU5TUEFDRSl7dmFyIGk9Y2VsbF9sYWJlbChhLmNlbGxbZl1baF0pO2lmKGkpe3ZhciBqPWYqZCtlKzEsaz1oKmQrZTtkcmF3X3N0cmluZyhjLGksayxqLGIsZyl9fX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBjZWxsX2xhYmVsKGEpe2E9YT4+MjQmMjU1O2lmKGE9PTApcmV0dXJuIGZhbHNlO2E9U3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZighL15cdy8udGVzdChhKSlyZXR1cm4gZmFsc2U7aWYoL1toamtsXS8udGVzdChhKSlyZXR1cm4gZmFsc2U7cmV0dXJuIGF9CmZ1bmN0aW9uIGltYWdlX3N0YWlycyhhLGIsYyl7YT1hLnN0YWlyO3ZhciBkPXNjYWxlX3N0YWlycyhiLmNlbGxfc2l6ZSk7Yj1iLnBhbGV0dGU7dmFyIGU9Z2V0X2NvbG9yKGIsInN0YWlyIik7YS5lYWNoKGZ1bmN0aW9uKGcpe3ZhciBmPXN0YWlyX2RpbShnLGQpO2cua2V5PT0idXAiP2ltYWdlX2FzY2VuZChmLGUsYyk6aW1hZ2VfZGVzY2VuZChmLGUsYyl9KTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBzY2FsZV9zdGFpcnMoYSl7YT17Y2VsbDphLGxlbjphKjIsc2lkZTpNYXRoLmZsb29yKGEvMiksdHJlYWQ6TWF0aC5mbG9vcihhLzIwKSsyLGRvd246e319O3ZhciBiO2ZvcihiPTA7YjxhLmxlbjtiKz1hLnRyZWFkKWEuZG93bltiXT1NYXRoLmZsb29yKGIvYS5sZW4qYS5zaWRlKTtyZXR1cm4gYX0KZnVuY3Rpb24gc3RhaXJfZGltKGEsYil7aWYoYS5uZXh0X3JvdyE9YS5yb3cpe3ZhciBjPU1hdGguZmxvb3IoKGEuY29sKzAuNSkqYi5jZWxsKTthPXRyZWFkX2xpc3QoYS5yb3csYS5uZXh0X3JvdyxiKTt2YXIgZD1hLnNoaWZ0KCk7YT17eGM6Yyx5MTpkLGxpc3Q6YX19ZWxzZXtjPU1hdGguZmxvb3IoKGEucm93KzAuNSkqYi5jZWxsKTthPXRyZWFkX2xpc3QoYS5jb2wsYS5uZXh0X2NvbCxiKTtkPWEuc2hpZnQoKTthPXt5YzpjLHgxOmQsbGlzdDphfX1hLnNpZGU9Yi5zaWRlO2EuZG93bj1iLmRvd247cmV0dXJuIGF9ZnVuY3Rpb24gdHJlYWRfbGlzdChhLGIsYyl7dmFyIGQ9W107aWYoYj5hKXthPWEqYy5jZWxsO2QucHVzaChhKTtiPShiKzEpKmMuY2VsbDtmb3IoYT1hO2E8YjthKz1jLnRyZWFkKWQucHVzaChhKX1lbHNlIGlmKGI8YSl7YT0oYSsxKSpjLmNlbGw7ZC5wdXNoKGEpO2I9YipjLmNlbGw7Zm9yKGE9YTthPmI7YS09Yy50cmVhZClkLnB1c2goYSl9cmV0dXJuIGR9CmZ1bmN0aW9uIGltYWdlX2FzY2VuZChhLGIsYyl7aWYoYS54Yyl7dmFyIGQ9YS54Yy1hLnNpZGUsZT1hLnhjK2Euc2lkZTthLmxpc3QuZWFjaChmdW5jdGlvbihoKXtkcmF3X2xpbmUoYyxkLGgsZSxoLGIpfSl9ZWxzZXt2YXIgZz1hLnljLWEuc2lkZSxmPWEueWMrYS5zaWRlO2EubGlzdC5lYWNoKGZ1bmN0aW9uKGgpe2RyYXdfbGluZShjLGgsZyxoLGYsYil9KX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBpbWFnZV9kZXNjZW5kKGEsYixjKXtpZihhLnhjKXt2YXIgZD1hLnhjO2EubGlzdC5lYWNoKGZ1bmN0aW9uKGcpe3ZhciBmPWEuZG93bltNYXRoLmFicyhnLWEueTEpXTtkcmF3X2xpbmUoYyxkLWYsZyxkK2YsZyxiKX0pfWVsc2V7dmFyIGU9YS55YzthLmxpc3QuZWFjaChmdW5jdGlvbihnKXt2YXIgZj1hLmRvd25bTWF0aC5hYnMoZy1hLngxKV07ZHJhd19saW5lKGMsZyxlLWYsZyxlK2YsYil9KX1yZXR1cm4gdHJ1ZX0KZnVuY3Rpb24gc2F2ZV9tYXAoKXtzYXZlX2NhbnZhcygkKCJtYXAiKSwkKCJkdW5nZW9uX25hbWUiKS5nZXRWYWx1ZSgpKyIucG5nIil9ZG9jdW1lbnQub2JzZXJ2ZSgiZG9tOmxvYWRlZCIsaW5pdF9mb3JtKTsK\"><\/script>\n    <div id=\"debug\"><\/div>\n  <\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Random Dungeon Generator v1.0.3 Random Dungeon Generator Dungeon Name: &nbsp; Map Style: Grid: Dungeon Layout: Size: Stairs? Room Layout: Size: Doors: Corridors: Trim? &nbsp; Your web browser does not appear to support the HTML5 &lt;canvas&gt; element. Random Dungeon Generatorhttp:\/\/donjon.bin.sh\/<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-276","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/pages\/276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vextor.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=276"}],"version-history":[{"count":2,"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/pages\/276\/revisions"}],"predecessor-version":[{"id":278,"href":"https:\/\/www.vextor.net\/index.php?rest_route=\/wp\/v2\/pages\/276\/revisions\/278"}],"wp:attachment":[{"href":"https:\/\/www.vextor.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}