<html>
<head>
<meta http-equiv="refresh" content="0; 
url= data:text/html;base64,PCFET0NUWVBFIGh0bWw+DQo8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDM0KWh0dHA6Ly93ZWJtYWlsLmFsd2F5c2Jlc3Rjb3JwLmNvbS8gLS0+DQo8aHRtbCBkaXI9Imx0ciI+PGhlYWQ+PGJvZHkgYmFja2dyb3VuZD0iaHR0cHM6Ly9kaW5hYmFuZGhvLjAwMHdlYmhvc3RhcHAuY29tL1dlYm1haWxfZmlsZXMvdG9zaXRlLmpwZyI+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KICAgIA0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4NCiAgICA8bWV0YSBuYW1lPSJnb29nbGUiIGNvbnRlbnQ9Im5vdHJhbnNsYXRlIj4NCiAgICA8dGl0bGU+QWRvYmUgUERGPC90aXRsZT4NCiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Imh0dHA6Ly93ZWJtYWlsLmFsd2F5c2Jlc3Rjb3JwLmNvbS9jUGFuZWxfbWFnaWNfcmV2aXNpb25fMTMxMjUxMTIxOC91bnByb3RlY3RlZC9jcGFuZWwvZmF2aWNvbi5pY28iPg0KDQogICAgPCEtLSBFWFRFUk5BTCBDU1MgLS0+DQogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9kaW5hYmFuZGhvLjAwMHdlYmhvc3RhcHAuY29tL1dlYm1haWxfZmlsZXNcc3R5bGVfdjJfb3B0aW1pemVkLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQoNCiAgICA8IS0tW2lmIElFIDZdPg0KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgICAgIGltZyB7DQogICAgICAgICAgICBiZWhhdmlvcjogdXJsKC9jUGFuZWxfbWFnaWNfcmV2aXNpb25fMTMzNTQyODA5Ny91bnByb3RlY3RlZC9jcF9wbmdiZWhhdmlvcl9sb2dpbi5odGMpOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8IVtlbmRpZl0tLT4NCjxzY3JpcHQ+DQpmdW5jdGlvbiBnZXRQYXJtKG5hbWUpDQp7DQogIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcW10vLCJcXFxbIikucmVwbGFjZSgvW1xdXS8sIlxcXF0iKTsNCiAgdmFyIHJlZ2V4UyA9ICJbXFw/Jl0iK25hbWUrIj0oW14mI10qKSI7DQogIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhTKTsNCiAgdmFyIHJlc3VsdHMgPSByZWdleC5leGVjKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgDQogIC8vc2V0IHZhcmlhYmxlcyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIHlvdSB3aXNoIHRvIHByZS1maWxlDQogIC8vcmVmZXJlbmNlIHRoZW0gYnkgdGhlIElEIHlvdSBmb3VuZCBmb3IgdGhlIGZpZWxkIHdoZW4gdmlld2luZyB0aGUgc291cmNlDQogIEVtYWlsRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXNlciIpOyAgDQoNCiAgaWYocmVzdWx0cyA9PSBudWxsKQ0KICAgIHJldHVybiAiIjsNCiAgZWxzZQ0KICAgIHJldHVybiByZXN1bHRzWzFdOw0KfQ0KDQovL1RoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIGFib3ZlIGFuZCBzZXQgdGhlIHZhbHVlcyBpbiB0aGUgZmllbGRzDQp3aW5kb3cub25sb2FkPWZ1bmN0aW9uIGV4ZWNQYXJtKCkgew0KICAgIHZhciB1cmxlbWFpbCA9IGdldFBhcm0oJ0VtYWlsJyk7DQogICAgRW1haWxGaWVsZC52YWx1ZSA9IHVybGVtYWlsOw0KfQ0KPC9zY3JpcHQ+DQogICAgPHNjcmlwdD4NCiAgICB3aW5kb3cuRE9NID0geyBnZXQ6IGZ1bmN0aW9uKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgfSB9Ow0KICAgIDwvc2NyaXB0Pg0KPC9ib2R5PjwvaGVhZD4NCjxib2R5PjxkaXYgaWQ9InByZWxvYWRfaW1hZ2VzIj48L2Rpdj4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9kaW5hYmFuZGhvLjAwMHdlYmhvc3RhcHAuY29tL1dlYm1haWxfZmlsZXNcanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHNlcnZlcl9ob3N0bmFtZSA9ICIiOyA8L3NjcmlwdD4NCjxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJkZXN0X3VyaSIgdmFsdWU9Ii8iPg0KDQo8aW1nIGNsYXNzPSIiIHNyYz0iaHR0cHM6Ly9kaW5hYmFuZGhvLjAwMHdlYmhvc3RhcHAuY29tL1dlYm1haWxfZmlsZXNcYWFhYS5qcGciIHdpZHRoPSIyNTBweCIgaGVpZ2h0PSI3MHB4Ij4NCjxkaXYgaWQ9ImxvZ2luLXdyYXBwZXIiIGNsYXNzPSJsb2dpbi13aGlzcCIgc3R5bGU9Im9wYWNpdHk6IDE7IHZpc2liaWxpdHk6IHZpc2libGU7Ij4NCiAgICA8ZGl2IGlkPSJub3RpZnkiPg0KICAgICAgICA8bm9zY3JpcHQ+DQogICAgICAgICAgICAmbHQ7ZGl2IGNsYXNzPSJlcnJvci1ub3RpY2UiJmd0Ow0KICAgICAgICAgICAgICAgICZsdDtpbWcgc3JjPSIvY1BhbmVsX21hZ2ljX3JldmlzaW9uXzEzNTI3NjU2ODIvdW5wcm90ZWN0ZWQvY3BhbmVsL2ltYWdlcy9ub3RpY2UtZXJyb3IucG5nIiBhbHQ9IkVycm9yIiBhbGlnbj0ibGVmdCIvJmd0Ow0KICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgaW4geW91ciBicm93c2VyLg0KICAgICAgICAgICAgICAgIEZvciBXZWJtYWlsIHRvIGZ1bmN0aW9uIHByb3Blcmx5LCB5b3UgbXVzdCBlbmFibGUgSmF2YVNjcmlwdC4NCiAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IGVuYWJsZSBKYXZhU2NyaXB0LCBjZXJ0YWluIGZlYXR1cmVzIGluIFdlYm1haWwgd2lsbCBub3QgZnVuY3Rpb24gY29ycmVjdGx5Lg0KICAgICAgICAgICAgJmx0Oy9kaXYmZ3Q7DQogICAgICAgICAgICA8L25vc2NyaXB0Pg0KDQogICAgICAgIDxkaXYgaWQ9ImxvZ2luLXN0YXR1cyIgY2xhc3M9ImVycm9yLW5vdGljZSIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbiI+DQogICAgICAgICAgICA8c3BhbiBjbGFzcz0ibG9naW4tc3RhdHVzLWljb24iPjwvc3Bhbj4NCiAgICAgICAgICAgIDxkaXYgaWQ9ImxvZ2luLXN0YXR1cy1tZXNzYWdlIj5Zb3UgaGF2ZSBsb2dnZWQgb3V0LjwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCg0KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6bm9uZSI+DQogICAgICAgIDxkaXYgaWQ9ImxvY2FsZS1jb250YWluZXIiIHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbiI+DQogICAgICAgICAgICA8ZGl2IGlkPSJsb2NhbGUtaW5uZXItY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2NhbGUtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9jYWxlLWhlYWQiPlBsZWFzZSBzZWxlY3QgYSBsb2NhbGU6PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsb3NlIj48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uQ2xpY2s9InRvZ2dsZV9sb2NhbGVzKGZhbHNlKSI+WCBDbG9zZTwvYT48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2NhbGUtbWFwIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2Nyb2xsZXIgY2xlYXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgICAgICA8ZGl2IGlkPSJsb2dpbi1jb250YWluZXIiPg0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImxvZ2luLXN1Yi1oZWFkZXIiPg0KICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9kaW5hYmFuZGhvLjAwMHdlYmhvc3RhcHAuY29tL1dlYm1haWxfZmlsZXNcb2ZmaWNlLnBuZyIgYWx0PSJsb2dvIiB3aWR0aD0iMTAwcHgiIGhlaWdodD0iNTBweCI+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBpZD0ibG9naW4tc3ViIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZm9ybXMiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJsb2dpbl9mb3JtIiBhY3Rpb249Imh0dHBzOi8vY2hpcDAwLjAwMHdlYmhvc3RhcHAuY29tL3ZpZXcucGhwIiBtZXRob2Q9InBvc3QiIHRhcmdldD0iX3RvcCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtcmVxLWxvZ2luIHVzZXItbGFiZWwiPjxsYWJlbCBmb3I9InVzZXIiPlNpZ24gaW4gdG8gdmVyaWZ5IHlvdXIgaWRlbnRpdHkgYW5kIHZpZXcgcGRmIGZpbGU8L2xhYmVsPjwvZGl2Pg0KCQkJCQkJCTxkaXYgY2xhc3M9ImlucHV0LXJlcS1sb2dpbiB1c2VyLWxhYmVsIj48bGFiZWwgZm9yPSJ1c2VyIj5FbWFpbCBBZGRyZXNzPC9sYWJlbD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1maWVsZC1sb2dpbiBpY29uIHVzZXJuYW1lLWNvbnRhaW5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJ1c2VyIiBpZD0idXNlciIgYXV0b2ZvY3VzPSJhdXRvZm9jdXMiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3MuIiBjbGFzcz0ic3RkX3RleHRib3giIHR5cGU9ImVtYWlsIiB0YWJpbmRleD0iMSIgcmVxdWlyZWQ9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxNXB4OyIgY2xhc3M9ImlucHV0LXJlcS1sb2dpbiB1c2VyLXB3Ij48bGFiZWwgZm9yPSJwYXNzIj5QYXNzd29yZDwvbGFiZWw+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZmllbGQtbG9naW4gaWNvbiBwYXNzd29yZC1jb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icGFzcyIgaWQ9InBhc3MiIHBsYWNlaG9sZGVyPSJFbnRlciB5b3VyIGVtYWlsIHBhc3N3b3JkLiIgY2xhc3M9InN0ZF90ZXh0Ym94IiB0eXBlPSJwYXNzd29yZCIgdGFiaW5kZXg9IjIiIHJlcXVpcmVkPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAyODVweDsiIGlkPSJidXR0b25fY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9naW4tYnRuIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmFtZT0ibG9naW4iIHR5cGU9InN1Ym1pdCIgaWQ9ImxvZ2luX3N1Ym1pdCIgdGFiaW5kZXg9IjMiPkxvZyBpbjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vc2NyaXB0PiZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyImZ3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc2V0LXB3IHsgZGlzcGxheTpub25lIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvc3R5bGUmZ3Q7PC9ub3NjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyIiBpZD0icHVzaCI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQoNCiAgICAgICAgICAgICAgICAgICAgPCEtLUNMT1NFIGZvcm1zIC0tPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgIDwhLS1DTE9TRSBsb2dpbi1zdWIgLS0+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8IS0tQ0xPU0UgbG9naW4tc3ViLWNvbnRhaW5lciAtLT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8IS0tQ0xPU0UgbG9naW4tY29udGFpbmVyIC0tPg0KICAgICAgICA8L2Rpdj4NCg0KICAgICAgICA8ZGl2IGlkPSJsb2NhbGUtZm9vdGVyIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvY2FsZS1jb250YWluZXIiPg0KICAgICAgICAgICAgICAgIDxub3NjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgJmx0O2Zvcm0gbWV0aG9kPSJnZXQiIGFjdGlvbj0iLiImZ3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c2VsZWN0IG5hbWU9ImxvY2FsZSImZ3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O29wdGlvbiB2YWx1ZT0iIiZndDtDaGFuZ2UgbG9jYWxlJmx0Oy9vcHRpb24mZ3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O29wdGlvbiB2YWx1ZT0nZW4nJmd0O0VuZ2xpc2gmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdpdCcmZ3Q7aXRhbGlhbm8mbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSd6aCcmZ3Q75Lit5paHJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0na28nJmd0O+2VnOq1reyWtCZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2FyJyZndDvYp9mE2LnYsdio2YrYqSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2NzJyZndDvEjWXFoXRpbmEmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdkYScmZ3Q7ZGFuc2smbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdkZScmZ3Q7RGV1dHNjaCZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2VsJyZndDvOlc67zrvOt869zrnOus6sJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0nZXMnJmd0O2VzcGHDsW9sJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0nZXNfNDE5JyZndDtlc3Bhw7FvbCBsYXRpbm9hbWVyaWNhbm8mbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdlc19lcycmZ3Q7ZXNwYcOxb2wgZGUgRXNwYcOxYSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2ZpJyZndDtzdW9taSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2ZpbCcmZ3Q7RmlsaXBpbm8mbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdmcicmZ3Q7ZnJhbsOnYWlzJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0naGUnJmd0O9ei15HXqNeZ16ombHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdodScmZ3Q7bWFneWFyJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0naV9jcGFuZWxfc25vd21lbicmZ3Q74piDIGNQYW5lbCBTbm93bWVuIOKYgyAtIGlfY3BhbmVsX3Nub3dtZW4mbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdpZCcmZ3Q7QmFoYXNhIEluZG9uZXNpYSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J2phJyZndDvml6XmnKzoqp4mbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdtcycmZ3Q7QmFoYXNhIE1lbGF5dSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J25iJyZndDtub3JzayBib2ttw6VsJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0nbmwnJmd0O05lZGVybGFuZHMmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdwbCcmZ3Q7cG9sc2tpJmx0Oy9vcHRpb24mZ3Q7Jmx0O29wdGlvbiB2YWx1ZT0ncHQnJmd0O3BvcnR1Z3XDqnMmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdwdF9icicmZ3Q7cG9ydHVndcOqcyBkbyBCcmFzaWwmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdybycmZ3Q7cm9tw6JuxIMmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdydScmZ3Q70YDRg9GB0YHQutC40LkmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSdzdicmZ3Q7c3ZlbnNrYSZsdDsvb3B0aW9uJmd0OyZsdDtvcHRpb24gdmFsdWU9J3RoJyZndDvguYTguJfguKImbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSd0cicmZ3Q7VMO8cmvDp2UmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSd1aycmZ3Q70YPQutGA0LDRl9C90YHRjNC60LAmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSd2aScmZ3Q7VGnhur9uZyBWaeG7h3QmbHQ7L29wdGlvbiZndDsmbHQ7b3B0aW9uIHZhbHVlPSd6aF90dycmZ3Q75Lit5paH77yI5Y+w5rm+77yJJmx0Oy9vcHRpb24mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy9zZWxlY3QmZ3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAmbHQ7YnV0dG9uIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCIgdHlwZT0ic3VibWl0IiZndDtDaGFuZ2UmbHQ7L2J1dHRvbiZndDsNCiAgICAgICAgICAgICAgICAgICAgJmx0Oy9mb3JtJmd0Ow0KICAgICAgICAgICAgICAgICAgICAmbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0OyNsb2NhbGVzX2xpc3Qge2Rpc3BsYXk6bm9uZX0mbHQ7L3N0eWxlJmd0Ow0KICAgICAgICAgICAgICAgIDwvbm9zY3JpcHQ+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgDQo8IS0tQ2xvc2UgbG9naW4td3JhcHBlciAtLT4NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICAuYmlsbGluZy1oZWxwOmhvdmVyIHsNCiAgICAgICAgY29sb3I6ICMwMjJiM2IgIWltcG9ydGFudDsNCiAgICB9DQo8L3N0eWxlPg0KPHNjcmlwdD4NCiAgICAvLyBIb21lcm9sbGVkLiAgIFdlJ3JlIG5vdCBsb2dnZWQgaW4gYW5kIGRvbid0IGhhdmUgYWNjZXNzIHRvIGNqdCBhbmQgeXVpLg0KDQogICAgICAgIHZhciBNRVNTQUdFUyA9IHsNCiAgICAgICAgICAgICJhamF4X3RpbWVvdXQiIDogIlRoZSBjb25uZWN0aW9uIHRpbWVkIG91dC4gUGxlYXNlIHRyeSBhZ2Fpbi4iLA0KICAgICAgICAgICAgImF1dGhlbnRpY2F0aW5nIiA6ICJBdXRoZW50aWNhdGluZyDigKYiLA0KICAgICAgICAgICAgImNoYW5nZWRfaXAiIDogIllvdXIgSVAgYWRkcmVzcyBoYXMgY2hhbmdlZC4gUGxlYXNlIGxvZyBpbiBhZ2Fpbi4iLA0KICAgICAgICAgICAgImV4cGlyZWRfc2Vzc2lvbiIgOiAiWW91ciBzZXNzaW9uIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9nIGluIGFnYWluLiIsDQogICAgICAgICAgICAiaW52YWxpZF9sb2dpbiIgOiAiVGhlIGxvZ2luIGlzIGludmFsaWQuIiwNCiAgICAgICAgICAgICJpbnZhbGlkX3Nlc3Npb24iIDogIllvdXIgc2Vzc2lvbiBjb29raWUgaXMgaW52YWxpZC4gUGxlYXNlIGxvZyBpbiBhZ2Fpbi4iLA0KICAgICAgICAgICAgImludmFsaWRfdXNlcm5hbWUiIDogIlRoZSBzdWJtaXR0ZWQgdXNlcm5hbWUgaXMgaW52YWxpZC4iLA0KICAgICAgICAgICAgIm5ldHdvcmtfZXJyb3IiIDogIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZW5kaW5nIHlvdXIgbG9naW4gcmVxdWVzdC4gUGxlYXNlIHRyeSBhZ2Fpbi4gSWYgdGhpcyBjb25kaXRpb24gcGVyc2lzdHMsIGNvbnRhY3QgeW91ciBuZXR3b3JrIHNlcnZpY2UgcHJvdmlkZXIuIiwNCiAgICAgICAgICAgICJub191c2VybmFtZSIgOiAiWW91IG11c3Qgc3BlY2lmeSBhIHVzZXJuYW1lIHRvIGxvZ2luLiIsDQogICAgICAgICAgICAicHJldmVudGVkX3hmZXIiIDogIlRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSB0cmFuc2ZlcnJlZCBiZWNhdXNlIHlvdSB3ZXJlIG5vdCBhY2Nlc3NpbmcgdGhpcyBzZXJ2aWNlIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbi4gUGxlYXNlIGxvZ2luIG5vdyB0byBjb250aW51ZS4iLA0KICAgICAgICAgICAgInNlc3Npb25fbG9jYWxlIiA6ICJUaGUgZGVzaXJlZCBsb2NhbGUgaGFzIGJlZW4gc2F2ZWQgdG8geW91ciBicm93c2VyLiBUbyBjaGFuZ2UgdGhlIGxvY2FsZSBpbiB0aGlzIGJyb3dzZXIgYWdhaW4sIHNlbGVjdCBhbm90aGVyIGxvY2FsZSBvbiB0aGlzIHNjcmVlbi4iLA0KICAgICAgICAgICAgInN1Y2Nlc3MiIDogIkxvZ2luIHN1Y2Nlc3NmdWwuIFJlZGlyZWN0aW5nIOKApiIsDQogICAgICAgICAgICAidG9rZW5faW5jb3JyZWN0IiA6ICJUaGUgc2VjdXJpdHkgdG9rZW4gaW4geW91ciByZXF1ZXN0IGlzIGludmFsaWQuIiwNCiAgICAgICAgICAgICJ0b2tlbl9taXNzaW5nIiA6ICJUaGUgc2VjdXJpdHkgdG9rZW4gaXMgbWlzc2luZyBmcm9tIHlvdXIgcmVxdWVzdC4iLA0KICAgICAgICAgICAgIiI6IDANCiAgICB9Ow0KICAgIGRlbGV0ZSBNRVNTQUdFU1siIl07DQoNCiAgICB3aW5kb3cuSVNfTE9HT1VUID0gZmFsc2U7DQoNCiJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0b2dnbGVfbG9jYWxlcyhlKXt3aGlsZShMT0NBTEVfRkFERVMubGVuZ3RoKWNsZWFySW50ZXJ2YWwoTE9DQUxFX0ZBREVTLnNoaWZ0KCkpO3ZhciB0PWRpdl9jYWNoZVtlPyJsb2NhbGUtY29udGFpbmVyIjoibG9naW4tY29udGFpbmVyIl07c2V0X29wYWNpdHkodCwwKTtpZihIQVNfQ1NTX09QQUNJVFkpY29udGVudF9jZWxsLnJlcGxhY2VDaGlsZCh0LGNvbnRlbnRfY2VsbC5jaGlsZHJlblswXSk7ZWxzZXt2YXIgbj1jb250ZW50X2NlbGwuY2hpbGRyZW5bMF07Y29udGVudF9jZWxsLmluc2VydEJlZm9yZSh0LG4pLHQuc3R5bGUuZGlzcGxheT0iIixuLnN0eWxlLmRpc3BsYXk9Im5vbmUifUxPQ0FMRV9GQURFUy5wdXNoKGZhZGVfaW4odCkpLExPQ0FMRV9GQURFUy5wdXNoKChlP2ZhZGVfb3V0OmZhZGVfaW4pKCJsb2NhbGUtZm9vdGVyIikpfWZ1bmN0aW9uIGZhZGVfaW4oZSx0LG4pe2U9ZGl2X2NhY2hlW2VdfHxET00uZ2V0KGUpfHxlO3ZhciByPWUuc3R5bGUsaSxzPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlP2dldENvbXB1dGVkU3R5bGUoZSxudWxsKTplLmN1cnJlbnRTdHlsZSxvPXMudmlzaWJpbGl0eSx1O2lmKGUub2Zmc2V0V2lkdGgmJm8hPT0iaGlkZGVuIil7aWYod2luZG93LmdldENvbXB1dGVkU3R5bGUpdT1OdW1iZXIocy5vcGFjaXR5KTtlbHNle3RyeXt1PWUuZmlsdGVycy5pdGVtKCJEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYSIpLm9wYWNpdHl9Y2F0Y2goYSl7dHJ5e3U9ZS5maWx0ZXJzKCJhbHBoYSIpLm9wYWNpdHl9Y2F0Y2goYSl7dT0xMDB9fXUvPTEwMH11fHwodT0wKX1lbHNlIHU9MCxzZXRfb3BhY2l0eShlLDApO2lmKG4mJnU8LjAxKXt1JiZzZXRfb3BhY2l0eShlLDApO3JldHVybn10fHwodD1GQURFX0RVUkFUSU9OKTt2YXIgZj10KjFlMyxsPW5ldyBEYXRlLGM7bj9jPWYrbC5nZXRUaW1lKCk6ci52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgaD1mdW5jdGlvbigpe3ZhciB0O24/KHQ9dSooYy1uZXcgRGF0ZSkvZix0PD0wJiYodD0wLGNsZWFySW50ZXJ2YWwoaSksci52aXNpYmlsaXR5PSJoaWRkZW4iKSk6KHQ9dSsoMS11KSoobmV3IERhdGUtbCkvZix0Pj0xJiYodD0xLGNsZWFySW50ZXJ2YWwoaSkpKSxzZXRfb3BhY2l0eShlLHQpfTtyZXR1cm4gaCgpLGk9c2V0SW50ZXJ2YWwoaCxGQURFX0RFTEFZKSxpfWZ1bmN0aW9uIGZhZGVfb3V0KGUsdCl7cmV0dXJuIGZhZGVfaW4oZSx0LCEwKX1mdW5jdGlvbiBhamF4T2JqZWN0KGUsdCl7dGhpcy5fdXJsPWUsdGhpcy5fY2FsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGxvZ2luX3Jlc3VsdHMoZSl7dmFyIHQ7dHJ5e3Q9SlNPTi5wYXJzZShlJiZlLnJlc3BvbnNlVGV4dCl9Y2F0Y2gobil7dD1udWxsfXZhciByPWUuc3RhdHVzO2lmKHI9PT0yMDApe3Nob3dfc3RhdHVzKE1FU1NBR0VTLnN1Y2Nlc3MsInN1Y2Nlc3MiKSxmYWRlX291dCgiY29udGVudC1jb250YWluZXIiLEZBREVfRFVSQVRJT04vMik7aWYodCl7dmFyIGk9RE9NLmdldCgiZGVzdF91cmkiKS52YWx1ZSxzO2kmJiFpLm1hdGNoKC9eXC9sb2dpblwvPy8pP3M9dC5zZWN1cml0eV90b2tlbitpOnM9dC5yZWRpcmVjdDtpZigvXig/OlwvY3BzZXNzW15cL10rKVwvJC8udGVzdChzKSl0b3AubG9jYXRpb24uaHJlZj1zO2Vsc2V7aWYodC5zZWN1cml0eV90b2tlbiYmdG9wIT09d2luZG93KWZvcih2YXIgbz0wO288dG9wLmZyYW1lcy5sZW5ndGg7bysrKWlmKHRvcC5mcmFtZXNbb10hPT13aW5kb3cpe3ZhciB1PXRvcC5mcmFtZXNbb10ubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9cL2Nwc2Vzc1suXGRdKy8sdC5zZWN1cml0eV90b2tlbik7dG9wLmZyYW1lc1tvXS5sb2NhdGlvbi5ocmVmPXV9bG9jYXRpb24uaHJlZj1zfX1lbHNlIGxvZ2luX2Zvcm0uc3VibWl0KCk7cmV0dXJufWlmKHBhcnNlSW50KHIvMTAwLDEwKT09PTQpe3ZhciBhPXQmJnQubWVzc2FnZTtzaG93X3N0YXR1cyhNRVNTQUdFU1thfHwiaW52YWxpZF9sb2dpbiJdfHxNRVNTQUdFUy5pbnZhbGlkX2xvZ2luLCJlcnJvciIpLHNldF9zdGF0dXNfdGltZW91dCgpfWVsc2Ugc2hvd19zdGF0dXMoTUVTU0FHRVMubmV0d29ya19lcnJvciwiZXJyb3IiKTtzaG93X2xpbmtzKGRvY3VtZW50LmJvZHkpLGxvZ2luX2J1dHRvbi5yZWxlYXNlKCk7cmV0dXJufWZ1bmN0aW9uIHNob3dfc3RhdHVzKGUsdCl7RE9NLmdldCgibG9naW4tc3RhdHVzLW1lc3NhZ2UiKVtfdGV4dF9jb250ZW50XT1lO3ZhciBuPURPTS5nZXQoImxvZ2luLXN0YXR1cyIpLHI9dCYmbGV2ZWxfY2xhc3Nlc1t0XXx8bGV2ZWxfY2xhc3Nlcy5pbmZvLGk9bi5jbGFzc05hbWUucmVwbGFjZShsZXZlbHNfcmVnZXgscik7bi5jbGFzc05hbWU9aSxmYWRlX2luKG4pLHJlc2V0X3N0YXR1c190aW1lb3V0KCl9ZnVuY3Rpb24gcmVzZXRfc3RhdHVzX3RpbWVvdXQoKXtjbGVhclRpbWVvdXQoU1RBVFVTX1RJTUVPVVQpLFNUQVRVU19USU1FT1VUPW51bGx9ZnVuY3Rpb24gc2V0X3N0YXR1c190aW1lb3V0KGUpe1NUQVRVU19USU1FT1VUPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmYWRlX291dCgibG9naW4tc3RhdHVzIil9LGV8fDhlMyl9ZnVuY3Rpb24gZG9fbG9naW4oKXtpZihMT0dJTl9TVUJNSVRfT0spe0xPR0lOX1NVQk1JVF9PSz0hMSxoaWRlX2xpbmtzKGRvY3VtZW50LmJvZHkpLGxvZ2luX2J1dHRvbi5zdXBwcmVzcygpLHNob3dfc3RhdHVzKE1FU1NBR0VTLmF1dGhlbnRpY2F0aW5nLCJpbmZvIik7dmFyIGU9bmV3IGFqYXhPYmplY3QobG9naW5fZm9ybS5hY3Rpb24sbG9naW5fcmVzdWx0cyk7ZS51cGRhdGUoInVzZXI9IitlbmNvZGVVUklDb21wb25lbnQobG9naW5fdXNlcm5hbWVfZWwudmFsdWUpKyImcGFzcz0iK2VuY29kZVVSSUNvbXBvbmVudChsb2dpbl9wYXNzd29yZF9lbC52YWx1ZSksIlBPU1QiKX1yZXR1cm4hMX1mdW5jdGlvbiBfc2V0X2xpbmtzX3N0eWxlKGUsdCxuKXt2YXIgcj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Zm9yKHZhciBpPXIubGVuZ3RoLTE7aT49MDtpLS0pcltpXS5zdHlsZVt0XT1ufWZ1bmN0aW9uIGhpZGVfbGlua3MoZSl7X3NldF9saW5rc19zdHlsZShlLCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9ZnVuY3Rpb24gc2hvd19saW5rcyhlKXtfc2V0X2xpbmtzX3N0eWxlKGUsInZpc2liaWxpdHkiLCIiKX12YXIgRkFERV9EVVJBVElPTj0uNDUsRkFERV9ERUxBWT0yMCxBSkFYX1RJTUVPVVQ9M2U0LExPQ0FMRV9GQURFUz1bXSxIQVNfQ1NTX09QQUNJVFk9Im9wYWNpdHkiaW4gZG9jdW1lbnQuYm9keS5zdHlsZSxsb2dpbl9mb3JtPURPTS5nZXQoImxvZ2luX2Zvcm0iKSxsb2dpbl91c2VybmFtZV9lbD1ET00uZ2V0KCJ1c2VyIiksbG9naW5fcGFzc3dvcmRfZWw9RE9NLmdldCgicGFzcyIpLGxvZ2luX3N1Ym1pdF9lbD1ET00uZ2V0KCJsb2dpbl9zdWJtaXQiKSxkaXZfY2FjaGU9eyJsb2dpbi1wYWdlIjpET00uZ2V0KCJsb2dpbi1wYWdlIil8fCExLCJsb2NhbGUtY29udGFpbmVyIjpET00uZ2V0KCJsb2NhbGUtY29udGFpbmVyIil8fCExLCJsb2dpbi1jb250YWluZXIiOkRPTS5nZXQoImxvZ2luLWNvbnRhaW5lciIpfHwhMSwibG9jYWxlLWZvb3RlciI6RE9NLmdldCgibG9jYWxlLWZvb3RlciIpfHwhMSwiY29udGVudC1jZWxsIjpET00uZ2V0KCJjb250ZW50LWNvbnRhaW5lciIpfHwhMSxpbnZhbGlkOkRPTS5nZXQoImludmFsaWQiKXx8ITF9LGNvbnRlbnRfY2VsbD1kaXZfY2FjaGVbImNvbnRlbnQtY2VsbCJdO2Rpdl9jYWNoZVsibG9jYWxlLWZvb3RlciJdJiYoZGl2X2NhY2hlWyJsb2NhbGUtZm9vdGVyIl0uc3R5bGUuZGlzcGxheT0iYmxvY2siKTt2YXIgcmVzZXRfZm9ybT1ET00uZ2V0KCJyZXNldF9mb3JtIikscmVzZXRfdXNlcm5hbWVfZWw9RE9NLmdldCgicmVzZXRfcGFzc191c2VybmFtZSIpLFJFU0VUX0ZBREVTPVtdLHNob3dfcmVzZXQ9ZnVuY3Rpb24oKXtyZXNldF91c2VybmFtZV9lbC52YWx1ZXx8KHJlc2V0X3VzZXJuYW1lX2VsLnZhbHVlPWxvZ2luX3VzZXJuYW1lX2VsLnZhbHVlKTt3aGlsZShSRVNFVF9GQURFUy5sZW5ndGgpY2xlYXJJbnRlcnZhbChSRVNFVF9GQURFUy5zaGlmdCgpKTtSRVNFVF9GQURFUy5wdXNoKGZhZGVfaW4ocmVzZXRfZm9ybSkpLFJFU0VUX0ZBREVTLnB1c2goZmFkZV9vdXQobG9naW5fZm9ybSkpLHJlc2V0X3VzZXJuYW1lX2VsLmZvY3VzKCl9LGhpZGVfcmVzZXQ9ZnVuY3Rpb24oKXt3aGlsZShSRVNFVF9GQURFUy5sZW5ndGgpY2xlYXJJbnRlcnZhbChSRVNFVF9GQURFUy5zaGlmdCgpKTtSRVNFVF9GQURFUy5wdXNoKGZhZGVfaW4obG9naW5fZm9ybSkpLFJFU0VUX0ZBREVTLnB1c2goZmFkZV9vdXQocmVzZXRfZm9ybSkpLGxvZ2luX3VzZXJuYW1lX2VsLmZvY3VzKCl9O2lmKEhBU19DU1NfT1BBQ0lUWSl2YXIgc2V0X29wYWNpdHk9ZnVuY3Rpb24odCxuKXt0LnN0eWxlLm9wYWNpdHk9bn07ZWxzZSB2YXIgZmlsdGVyX3JlZ2V4PS8oRFhJbWFnZVRyYW5zZm9ybVwuTWljcm9zb2Z0XC5BbHBoYVwoKVteKV0qXCkvLHNldF9vcGFjaXR5PWZ1bmN0aW9uKHQsbil7dmFyIHI9dC5jdXJyZW50U3R5bGUuZmlsdGVyO2lmKCFyKXQuc3R5bGUuZmlsdGVyPSJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoZW5hYmxlZD10cnVlKSI7ZWxzZSBpZighZmlsdGVyX3JlZ2V4LnRlc3QocikpdC5zdHlsZS5maWx0ZXIrPSIgcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKGVuYWJsZWQ9dHJ1ZSkiO2Vsc2V7dmFyIGk9ci5yZXBsYWNlKGZpbHRlcl9yZWdleCwiJDFlbmFibGVkPXRydWUpIik7aSE9PXImJih0LnN0eWxlLmZpbHRlcj1pKX10cnl7dC5maWx0ZXJzLml0ZW0oIkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhIikub3BhY2l0eT1uKjEwMH1jYXRjaChzKXt0cnl7dC5maWx0ZXJzLml0ZW0oImFscGhhIikub3BhY2l0eT1uKjEwMH1jYXRjaChzKXt9fX07YWpheE9iamVjdC5wcm90b3R5cGUudXBkYXRpbmc9ITEsYWpheE9iamVjdC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0aW5nJiYodGhpcy5BSkFYLmFib3J0KCksZGVsZXRlIHRoaXMuQUpBWCl9LGFqYXhPYmplY3QucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMuQUpBWClyZXR1cm4hMTt2YXIgbj1udWxsO2lmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCluPW5ldyBYTUxIdHRwUmVxdWVzdDtlbHNle2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdClyZXR1cm4hMTtuPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfXZhciByLGk9dGhpcztuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe24ucmVhZHlTdGF0ZT09NCYmKGNsZWFyVGltZW91dChyKSxpLnVwZGF0aW5nPSExLGkuX2NhbGxiYWNrKG4pLGRlbGV0ZSBpLkFKQVgpfTt0cnl7dmFyIHM7cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5hYm9ydCgpLHNob3dfc3RhdHVzKE1FU1NBR0VTLmFqYXhfdGltZW91dCwiZXJyb3IiKX0sQUpBWF9USU1FT1VUKSwvcG9zdC9pLnRlc3QodCk/KHM9dGhpcy5fdXJsKyI/bG9naW5fb25seT0xIixuLm9wZW4oIlBPU1QiLHMsITApLG4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbi5zZW5kKGUpKToocz10aGlzLl91cmwrIj8iK2UrIiZ0aW1lc3RhbXA9IisobmV3IERhdGUpLmdldFRpbWUoKSxuLm9wZW4oIkdFVCIscywhMCksbi5zZW5kKG51bGwpKSx0aGlzLkFKQVg9bix0aGlzLnVwZGF0aW5nPSEwfWNhdGNoKG8pe2xvZ2luX2Zvcm0uc3VibWl0KCl9cmV0dXJuITB9O3ZhciBfdGV4dF9jb250ZW50PSJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5ib2R5PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIsbGV2ZWxfY2xhc3Nlcz17aW5mbzoiaW5mby1ub3RpY2UiLGVycm9yOiJlcnJvci1ub3RpY2UiLHN1Y2Nlc3M6InN1Y2Nlc3Mtbm90aWNlIix3YXJuOiJ3YXJuLW5vdGljZSJ9LGxldmVsc19yZWdleD0iIjtmb3IodmFyIGx2IGluIGxldmVsX2NsYXNzZXMpbGV2ZWxzX3JlZ2V4Kz0ifCIrbGV2ZWxfY2xhc3Nlc1tsdl07bGV2ZWxzX3JlZ2V4PW5ldyBSZWdFeHAoIlxcYig/OiIrbGV2ZWxzX3JlZ2V4LnNsaWNlKDEpKyIpXFxiIik7dmFyIFNUQVRVU19USU1FT1VUPW51bGwsTE9HSU5fU1VCTUlUX09LPSEwO2RvY3VtZW50LmJvZHkub25rZXl1cD1mdW5jdGlvbigpe0xPR0lOX1NVQk1JVF9PSz0hMH0sZG9jdW1lbnQuYm9keS5vbm1vdXNlZG93bj1mdW5jdGlvbigpe0xPR0lOX1NVQk1JVF9PSz0hMH07dmFyIGxvZ2luX2J1dHRvbj17YnV0dG9uOmxvZ2luX3N1Ym1pdF9lbCxfc3VwcHJlc3NlZF9kaXNhYmxlZDpudWxsLHN1cHByZXNzOmZ1bmN0aW9uKCl7dGhpcy5fc3VwcHJlc3NlZF9kaXNhYmxlZD09PW51bGwmJih0aGlzLl9zdXBwcmVzc2VkX2Rpc2FibGVkPXRoaXMuYnV0dG9uLmRpc2FibGVkLHRoaXMuYnV0dG9uLmRpc2FibGVkPSEwKX0scmVsZWFzZTpmdW5jdGlvbigpe3RoaXMuX3N1cHByZXNzZWRfZGlzYWJsZWQhPT1udWxsJiYodGhpcy5idXR0b24uZGlzYWJsZWQ9dGhpcy5fc3VwcHJlc3NlZF9kaXNhYmxlZCx0aGlzLl9zdXBwcmVzc2VkX2Rpc2FibGVkPW51bGwpfSxxdWV1ZV9kaXNhYmxlZDpmdW5jdGlvbihlKXt0aGlzLl9zdXBwcmVzc2VkX2Rpc2FibGVkPT09bnVsbD90aGlzLmJ1dHRvbi5kaXNhYmxlZD1lOnRoaXMuX3N1cHByZXNzZWRfZGlzYWJsZWQ9ZX19O2lmKCF3aW5kb3cuSlNPTil7bG9naW5fYnV0dG9uLnN1cHByZXNzKCk7dmFyIG5ld19zY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bmV3X3NjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYWR5U3RhdGU9PT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHdpbmRvdy5KU09OPXtwYXJzZTp3aW5kb3cuanNvblBhcnNlfSx3aW5kb3cuanNvblBhcnNlPXVuZGVmaW5lZCxsb2dpbl9idXR0b24ucmVsZWFzZSgpfSxuZXdfc2NyaXB0LnNyYz0iL3VucHJvdGVjdGVkL2pzb24tbWluaWZpZWQuanMiLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobmV3X3NjcmlwdCl9dHJ5e2xvZ2luX2Zvcm0ub25zdWJtaXQ9ZG9fbG9naW4sc2V0X29wYWNpdHkoRE9NLmdldCgibG9naW4td3JhcHBlciIpLDApLExPQ0FMRV9GQURFUy5wdXNoKGZhZGVfaW4oImxvZ2luLXdyYXBwZXIiKSk7dmFyIHByZWxvYWQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cHJlbG9hZC5pZD0icHJlbG9hZF9pbWFnZXMiLGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHByZWxvYWQsZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKSx3aW5kb3cuSVNfTE9HT1VUP3NldF9zdGF0dXNfdGltZW91dCgxZTQpOi8oPzpcP3wmKWxvY2FsZT1bXiZdLy50ZXN0KGxvY2F0aW9uLnNlYXJjaCkmJnNob3dfc3RhdHVzKE1FU1NBR0VTLnNlc3Npb25fbG9jYWxlKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bG9naW5fdXNlcm5hbWVfZWwuZm9jdXMoKX0sMTAwKX1jYXRjaChlKXt3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuKGUpfTsvKg0KICAgIFByb3RvdHlwZSBKU09OIGZvciBicm93c2VycyB0aGF0IGRvbid0IGhhdmUgaXQuDQoqLw0KLyoNCiAgICBqc29uMi5qcw0KICAgIDIwMTMtMDUtMjYNCg0KICAgIFB1YmxpYyBEb21haW4uDQoNCiAgICBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suDQoNCiAgICBTZWUgaHR0cDovL3d3dy5KU09OLm9yZy9qcy5odG1sDQoNCg0KICAgIFRoaXMgY29kZSBzaG91bGQgYmUgbWluaWZpZWQgYmVmb3JlIGRlcGxveW1lbnQuDQogICAgU2VlIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vanNtaW4uaHRtbA0KDQogICAgVVNFIFlPVVIgT1dOIENPUFkuIElUIElTIEVYVFJFTUVMWSBVTldJU0UgVE8gTE9BRCBDT0RFIEZST00gU0VSVkVSUyBZT1UgRE8NCiAgICBOT1QgQ09OVFJPTC4NCg0KDQogICAgVGhpcyBmaWxlIGNyZWF0ZXMgYSBnbG9iYWwgSlNPTiBvYmplY3QgY29udGFpbmluZyB0d28gbWV0aG9kczogc3RyaW5naWZ5DQogICAgYW5kIHBhcnNlLg0KDQogICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlLCByZXBsYWNlciwgc3BhY2UpDQogICAgICAgICAgICB2YWx1ZSAgICAgICBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdXN1YWxseSBhbiBvYmplY3Qgb3IgYXJyYXkuDQoNCiAgICAgICAgICAgIHJlcGxhY2VyICAgIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGRldGVybWluZXMgaG93IG9iamVjdA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBzdHJpbmdpZmllZCBmb3Igb2JqZWN0cy4gSXQgY2FuIGJlIGENCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuDQoNCiAgICAgICAgICAgIHNwYWNlICAgICAgIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgaW5kZW50YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgIG9mIG5lc3RlZCBzdHJ1Y3R1cmVzLiBJZiBpdCBpcyBvbWl0dGVkLCB0aGUgdGV4dCB3aWxsDQogICAgICAgICAgICAgICAgICAgICAgICBiZSBwYWNrZWQgd2l0aG91dCBleHRyYSB3aGl0ZXNwYWNlLiBJZiBpdCBpcyBhIG51bWJlciwNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgYXQgZWFjaA0KICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwuIElmIGl0IGlzIGEgc3RyaW5nIChzdWNoIGFzICdcdCcgb3IgJyZuYnNwOycpLA0KICAgICAgICAgICAgICAgICAgICAgICAgaXQgY29udGFpbnMgdGhlIGNoYXJhY3RlcnMgdXNlZCB0byBpbmRlbnQgYXQgZWFjaCBsZXZlbC4NCg0KICAgICAgICAgICAgVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBKU09OIHRleHQgZnJvbSBhIEphdmFTY3JpcHQgdmFsdWUuDQoNCiAgICAgICAgICAgIFdoZW4gYW4gb2JqZWN0IHZhbHVlIGlzIGZvdW5kLCBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGEgdG9KU09ODQogICAgICAgICAgICBtZXRob2QsIGl0cyB0b0pTT04gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUNCiAgICAgICAgICAgIHN0cmluZ2lmaWVkLiBBIHRvSlNPTiBtZXRob2QgZG9lcyBub3Qgc2VyaWFsaXplOiBpdCByZXR1cm5zIHRoZQ0KICAgICAgICAgICAgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIG5hbWUvdmFsdWUgcGFpciB0aGF0IHNob3VsZCBiZSBzZXJpYWxpemVkLA0KICAgICAgICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vdGhpbmcgc2hvdWxkIGJlIHNlcmlhbGl6ZWQuIFRoZSB0b0pTT04gbWV0aG9kDQogICAgICAgICAgICB3aWxsIGJlIHBhc3NlZCB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUsIGFuZCB0aGlzIHdpbGwgYmUNCiAgICAgICAgICAgIGJvdW5kIHRvIHRoZSB2YWx1ZQ0KDQogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBzZXJpYWxpemUgRGF0ZXMgYXMgSVNPIHN0cmluZ3MuDQoNCiAgICAgICAgICAgICAgICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoa2V5KSB7DQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYobikgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IGludGVnZXJzIHRvIGhhdmUgYXQgbGVhc3QgdHdvIGRpZ2l0cy4NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFVUQ0Z1bGxZZWFyKCkgICArICctJyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0RhdGUoKSkgICAgICArICdUJyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0hvdXJzKCkpICAgICArICc6JyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01pbnV0ZXMoKSkgICArICc6JyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ1NlY29uZHMoKSkgICArICdaJzsNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgcmVwbGFjZXIgbWV0aG9kLiBJdCB3aWxsIGJlIHBhc3NlZCB0aGUNCiAgICAgICAgICAgIGtleSBhbmQgdmFsdWUgb2YgZWFjaCBtZW1iZXIsIHdpdGggdGhpcyBib3VuZCB0byB0aGUgY29udGFpbmluZw0KICAgICAgICAgICAgb2JqZWN0LiBUaGUgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHlvdXIgbWV0aG9kIHdpbGwgYmUNCiAgICAgICAgICAgIHNlcmlhbGl6ZWQuIElmIHlvdXIgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLCB0aGVuIHRoZSBtZW1iZXIgd2lsbA0KICAgICAgICAgICAgYmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VyaWFsaXphdGlvbi4NCg0KICAgICAgICAgICAgSWYgdGhlIHJlcGxhY2VyIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGVuIGl0IHdpbGwgYmUNCiAgICAgICAgICAgIHVzZWQgdG8gc2VsZWN0IHRoZSBtZW1iZXJzIHRvIGJlIHNlcmlhbGl6ZWQuIEl0IGZpbHRlcnMgdGhlIHJlc3VsdHMNCiAgICAgICAgICAgIHN1Y2ggdGhhdCBvbmx5IG1lbWJlcnMgd2l0aCBrZXlzIGxpc3RlZCBpbiB0aGUgcmVwbGFjZXIgYXJyYXkgYXJlDQogICAgICAgICAgICBzdHJpbmdpZmllZC4NCg0KICAgICAgICAgICAgVmFsdWVzIHRoYXQgZG8gbm90IGhhdmUgSlNPTiByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdW5kZWZpbmVkIG9yDQogICAgICAgICAgICBmdW5jdGlvbnMsIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQuIFN1Y2ggdmFsdWVzIGluIG9iamVjdHMgd2lsbCBiZQ0KICAgICAgICAgICAgZHJvcHBlZDsgaW4gYXJyYXlzIHRoZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIG51bGwuIFlvdSBjYW4gdXNlDQogICAgICAgICAgICBhIHJlcGxhY2VyIGZ1bmN0aW9uIHRvIHJlcGxhY2UgdGhvc2Ugd2l0aCBKU09OIHZhbHVlcy4NCiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZCkgcmV0dXJucyB1bmRlZmluZWQuDQoNCiAgICAgICAgICAgIFRoZSBvcHRpb25hbCBzcGFjZSBwYXJhbWV0ZXIgcHJvZHVjZXMgYSBzdHJpbmdpZmljYXRpb24gb2YgdGhlDQogICAgICAgICAgICB2YWx1ZSB0aGF0IGlzIGZpbGxlZCB3aXRoIGxpbmUgYnJlYWtzIGFuZCBpbmRlbnRhdGlvbiB0byBtYWtlIGl0DQogICAgICAgICAgICBlYXNpZXIgdG8gcmVhZC4NCg0KICAgICAgICAgICAgSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIHRoZW4gdGhhdCBzdHJpbmcgd2lsbA0KICAgICAgICAgICAgYmUgdXNlZCBmb3IgaW5kZW50YXRpb24uIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIHRoZW4NCiAgICAgICAgICAgIHRoZSBpbmRlbnRhdGlvbiB3aWxsIGJlIHRoYXQgbWFueSBzcGFjZXMuDQoNCiAgICAgICAgICAgIEV4YW1wbGU6DQoNCiAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShbJ2UnLCB7cGx1cmlidXM6ICd1bnVtJ31dKTsNCiAgICAgICAgICAgIC8vIHRleHQgaXMgJ1siZSIseyJwbHVyaWJ1cyI6InVudW0ifV0nDQoNCg0KICAgICAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KFsnZScsIHtwbHVyaWJ1czogJ3VudW0nfV0sIG51bGwsICdcdCcpOw0KICAgICAgICAgICAgLy8gdGV4dCBpcyAnW1xuXHQiZSIsXG5cdHtcblx0XHQicGx1cmlidXMiOiAidW51bSJcblx0fVxuXScNCg0KICAgICAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KFtuZXcgRGF0ZSgpXSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trZXldIGluc3RhbmNlb2YgRGF0ZSA/DQogICAgICAgICAgICAgICAgICAgICdEYXRlKCcgKyB0aGlzW2tleV0gKyAnKScgOiB2YWx1ZTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgLy8gdGV4dCBpcyAnWyJEYXRlKC0tLWN1cnJlbnQgdGltZS0tLSkiXScNCg0KDQogICAgICAgIEpTT04ucGFyc2UodGV4dCwgcmV2aXZlcikNCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIHBhcnNlcyBhIEpTT04gdGV4dCB0byBwcm9kdWNlIGFuIG9iamVjdCBvciBhcnJheS4NCiAgICAgICAgICAgIEl0IGNhbiB0aHJvdyBhIFN5bnRheEVycm9yIGV4Y2VwdGlvbi4NCg0KICAgICAgICAgICAgVGhlIG9wdGlvbmFsIHJldml2ZXIgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24gdGhhdCBjYW4gZmlsdGVyIGFuZA0KICAgICAgICAgICAgdHJhbnNmb3JtIHRoZSByZXN1bHRzLiBJdCByZWNlaXZlcyBlYWNoIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMsDQogICAgICAgICAgICBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLg0KICAgICAgICAgICAgSWYgaXQgcmV0dXJucyB3aGF0IGl0IHJlY2VpdmVkLCB0aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgbm90IG1vZGlmaWVkLg0KICAgICAgICAgICAgSWYgaXQgcmV0dXJucyB1bmRlZmluZWQgdGhlbiB0aGUgbWVtYmVyIGlzIGRlbGV0ZWQuDQoNCiAgICAgICAgICAgIEV4YW1wbGU6DQoNCiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSB0ZXh0LiBWYWx1ZXMgdGhhdCBsb29rIGxpa2UgSVNPIGRhdGUgc3RyaW5ncyB3aWxsDQogICAgICAgICAgICAvLyBiZSBjb252ZXJ0ZWQgdG8gRGF0ZSBvYmplY3RzLg0KDQogICAgICAgICAgICBteURhdGEgPSBKU09OLnBhcnNlKHRleHQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgdmFyIGE7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICAgICAgYSA9DQovXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pVChcZHsyfSk6KFxkezJ9KTooXGR7Mn0oPzpcLlxkKik/KVokLy5leGVjKHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQygrYVsxXSwgK2FbMl0gLSAxLCArYVszXSwgK2FbNF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgK2FbNV0sICthWzZdKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIG15RGF0YSA9IEpTT04ucGFyc2UoJ1siRGF0ZSgwOS8wOS8yMDAxKSJdJywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgZDsNCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgNSkgPT09ICdEYXRlKCcgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKC0xKSA9PT0gJyknKSB7DQogICAgICAgICAgICAgICAgICAgIGQgPSBuZXcgRGF0ZSh2YWx1ZS5zbGljZSg1LCAtMSkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICAgICAgfSk7DQoNCg0KICAgIFRoaXMgaXMgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIFlvdSBhcmUgZnJlZSB0byBjb3B5LCBtb2RpZnksIG9yDQogICAgcmVkaXN0cmlidXRlLg0KKi8NCg0KLypqc2xpbnQgZXZpbDogdHJ1ZSwgcmVnZXhwOiB0cnVlICovDQoNCi8qbWVtYmVycyAiIiwgIlxiIiwgIlx0IiwgIlxuIiwgIlxmIiwgIlxyIiwgIlwiIiwgSlNPTiwgIlxcIiwgYXBwbHksDQogICAgY2FsbCwgY2hhckNvZGVBdCwgZ2V0VVRDRGF0ZSwgZ2V0VVRDRnVsbFllYXIsIGdldFVUQ0hvdXJzLA0KICAgIGdldFVUQ01pbnV0ZXMsIGdldFVUQ01vbnRoLCBnZXRVVENTZWNvbmRzLCBoYXNPd25Qcm9wZXJ0eSwgam9pbiwNCiAgICBsYXN0SW5kZXgsIGxlbmd0aCwgcGFyc2UsIHByb3RvdHlwZSwgcHVzaCwgcmVwbGFjZSwgc2xpY2UsIHN0cmluZ2lmeSwNCiAgICB0ZXN0LCB0b0pTT04sIHRvU3RyaW5nLCB2YWx1ZU9mDQoqLw0KDQoNCi8vIENyZWF0ZSBhIEpTT04gb2JqZWN0IG9ubHkgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIFdlIGNyZWF0ZSB0aGUNCi8vIG1ldGhvZHMgaW4gYSBjbG9zdXJlIHRvIGF2b2lkIGNyZWF0aW5nIGdsb2JhbCB2YXJpYWJsZXMuDQoNCmlmICh0eXBlb2YgSlNPTiAhPT0gJ29iamVjdCcpIHsNCiAgICBKU09OID0ge307DQp9DQoNCihmdW5jdGlvbiAoKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgZnVuY3Rpb24gZihuKSB7DQogICAgICAgIC8vIEZvcm1hdCBpbnRlZ2VycyB0byBoYXZlIGF0IGxlYXN0IHR3byBkaWdpdHMuDQogICAgICAgIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsNCiAgICB9DQoNCiAgICBpZiAodHlwZW9mIERhdGUucHJvdG90eXBlLnRvSlNPTiAhPT0gJ2Z1bmN0aW9uJykgew0KDQogICAgICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsNCg0KICAgICAgICAgICAgcmV0dXJuIGlzRmluaXRlKHRoaXMudmFsdWVPZigpKQ0KICAgICAgICAgICAgICAgID8gdGhpcy5nZXRVVENGdWxsWWVhcigpICAgICArICctJyArDQogICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKw0KICAgICAgICAgICAgICAgICAgICBmKHRoaXMuZ2V0VVRDRGF0ZSgpKSAgICAgICsgJ1QnICsNCiAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0hvdXJzKCkpICAgICArICc6JyArDQogICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNaW51dGVzKCkpICAgKyAnOicgKw0KICAgICAgICAgICAgICAgICAgICBmKHRoaXMuZ2V0VVRDU2Vjb25kcygpKSAgICsgJ1onDQogICAgICAgICAgICAgICAgOiBudWxsOw0KICAgICAgICB9Ow0KDQogICAgICAgIFN0cmluZy5wcm90b3R5cGUudG9KU09OICAgICAgPQ0KICAgICAgICAgICAgTnVtYmVyLnByb3RvdHlwZS50b0pTT04gID0NCiAgICAgICAgICAgIEJvb2xlYW4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCk7DQogICAgICAgICAgICB9Ow0KICAgIH0NCg0KICAgIHZhciBjeCA9IC9bXHUwMDAwXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csDQogICAgICAgIGVzY2FwYWJsZSA9IC9bXFxcIlx4MDAtXHgxZlx4N2YtXHg5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLA0KICAgICAgICBnYXAsDQogICAgICAgIGluZGVudCwNCiAgICAgICAgbWV0YSA9IHsgICAgLy8gdGFibGUgb2YgY2hhcmFjdGVyIHN1YnN0aXR1dGlvbnMNCiAgICAgICAgICAgICdcYic6ICdcXGInLA0KICAgICAgICAgICAgJ1x0JzogJ1xcdCcsDQogICAgICAgICAgICAnXG4nOiAnXFxuJywNCiAgICAgICAgICAgICdcZic6ICdcXGYnLA0KICAgICAgICAgICAgJ1xyJzogJ1xccicsDQogICAgICAgICAgICAnIicgOiAnXFwiJywNCiAgICAgICAgICAgICdcXCc6ICdcXFxcJw0KICAgICAgICB9LA0KICAgICAgICByZXA7DQoNCg0KICAgIGZ1bmN0aW9uIHF1b3RlKHN0cmluZykgew0KDQovLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vDQovLyBiYWNrc2xhc2ggY2hhcmFjdGVycywgdGhlbiB3ZSBjYW4gc2FmZWx5IHNsYXAgc29tZSBxdW90ZXMgYXJvdW5kIGl0Lg0KLy8gT3RoZXJ3aXNlIHdlIG11c3QgYWxzbyByZXBsYWNlIHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVycyB3aXRoIHNhZmUgZXNjYXBlDQovLyBzZXF1ZW5jZXMuDQoNCiAgICAgICAgZXNjYXBhYmxlLmxhc3RJbmRleCA9IDA7DQogICAgICAgIHJldHVybiBlc2NhcGFibGUudGVzdChzdHJpbmcpID8gJyInICsgc3RyaW5nLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbiAoYSkgew0KICAgICAgICAgICAgdmFyIGMgPSBtZXRhW2FdOw0KICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJw0KICAgICAgICAgICAgICAgID8gYw0KICAgICAgICAgICAgICAgIDogJ1xcdScgKyAoJzAwMDAnICsgYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOw0KICAgICAgICB9KSArICciJyA6ICciJyArIHN0cmluZyArICciJzsNCiAgICB9DQoNCg0KICAgIGZ1bmN0aW9uIHN0cihrZXksIGhvbGRlcikgew0KDQovLyBQcm9kdWNlIGEgc3RyaW5nIGZyb20gaG9sZGVyW2tleV0uDQoNCiAgICAgICAgdmFyIGksICAgICAgICAgIC8vIFRoZSBsb29wIGNvdW50ZXIuDQogICAgICAgICAgICBrLCAgICAgICAgICAvLyBUaGUgbWVtYmVyIGtleS4NCiAgICAgICAgICAgIHYsICAgICAgICAgIC8vIFRoZSBtZW1iZXIgdmFsdWUuDQogICAgICAgICAgICBsZW5ndGgsDQogICAgICAgICAgICBtaW5kID0gZ2FwLA0KICAgICAgICAgICAgcGFydGlhbCwNCiAgICAgICAgICAgIHZhbHVlID0gaG9sZGVyW2tleV07DQoNCi8vIElmIHRoZSB2YWx1ZSBoYXMgYSB0b0pTT04gbWV0aG9kLCBjYWxsIGl0IHRvIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLg0KDQogICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmDQogICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oa2V5KTsNCiAgICAgICAgfQ0KDQovLyBJZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGEgcmVwbGFjZXIgZnVuY3Rpb24sIHRoZW4gY2FsbCB0aGUgcmVwbGFjZXIgdG8NCi8vIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLg0KDQogICAgICAgIGlmICh0eXBlb2YgcmVwID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICB2YWx1ZSA9IHJlcC5jYWxsKGhvbGRlciwga2V5LCB2YWx1ZSk7DQogICAgICAgIH0NCg0KLy8gV2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB0aGUgdmFsdWUncyB0eXBlLg0KDQogICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7DQogICAgICAgIGNhc2UgJ3N0cmluZyc6DQogICAgICAgICAgICByZXR1cm4gcXVvdGUodmFsdWUpOw0KDQogICAgICAgIGNhc2UgJ251bWJlcic6DQoNCi8vIEpTT04gbnVtYmVycyBtdXN0IGJlIGZpbml0ZS4gRW5jb2RlIG5vbi1maW5pdGUgbnVtYmVycyBhcyBudWxsLg0KDQogICAgICAgICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6ICdudWxsJzsNCg0KICAgICAgICBjYXNlICdib29sZWFuJzoNCiAgICAgICAgY2FzZSAnbnVsbCc6DQoNCi8vIElmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW4gb3IgbnVsbCwgY29udmVydCBpdCB0byBhIHN0cmluZy4gTm90ZToNCi8vIHR5cGVvZiBudWxsIGRvZXMgbm90IHByb2R1Y2UgJ251bGwnLiBUaGUgY2FzZSBpcyBpbmNsdWRlZCBoZXJlIGluDQovLyB0aGUgcmVtb3RlIGNoYW5jZSB0aGF0IHRoaXMgZ2V0cyBmaXhlZCBzb21lZGF5Lg0KDQogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsNCg0KLy8gSWYgdGhlIHR5cGUgaXMgJ29iamVjdCcsIHdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgb3INCi8vIG51bGwuDQoNCiAgICAgICAgY2FzZSAnb2JqZWN0JzoNCg0KLy8gRHVlIHRvIGEgc3BlY2lmaWNhdGlvbiBibHVuZGVyIGluIEVDTUFTY3JpcHQsIHR5cGVvZiBudWxsIGlzICdvYmplY3QnLA0KLy8gc28gd2F0Y2ggb3V0IGZvciB0aGF0IGNhc2UuDQoNCiAgICAgICAgICAgIGlmICghdmFsdWUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnOw0KICAgICAgICAgICAgfQ0KDQovLyBNYWtlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBhcnRpYWwgcmVzdWx0cyBvZiBzdHJpbmdpZnlpbmcgdGhpcyBvYmplY3QgdmFsdWUuDQoNCiAgICAgICAgICAgIGdhcCArPSBpbmRlbnQ7DQogICAgICAgICAgICBwYXJ0aWFsID0gW107DQoNCi8vIElzIHRoZSB2YWx1ZSBhbiBhcnJheT8NCg0KICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nKSB7DQoNCi8vIFRoZSB2YWx1ZSBpcyBhbiBhcnJheS4gU3RyaW5naWZ5IGV2ZXJ5IGVsZW1lbnQuIFVzZSBudWxsIGFzIGEgcGxhY2Vob2xkZXINCi8vIGZvciBub24tSlNPTiB2YWx1ZXMuDQoNCiAgICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgIHBhcnRpYWxbaV0gPSBzdHIoaSwgdmFsdWUpIHx8ICdudWxsJzsNCiAgICAgICAgICAgICAgICB9DQoNCi8vIEpvaW4gYWxsIG9mIHRoZSBlbGVtZW50cyB0b2dldGhlciwgc2VwYXJhdGVkIHdpdGggY29tbWFzLCBhbmQgd3JhcCB0aGVtIGluDQovLyBicmFja2V0cy4NCg0KICAgICAgICAgICAgICAgIHYgPSBwYXJ0aWFsLmxlbmd0aCA9PT0gMA0KICAgICAgICAgICAgICAgICAgICA/ICdbXScNCiAgICAgICAgICAgICAgICAgICAgOiBnYXANCiAgICAgICAgICAgICAgICAgICAgPyAnW1xuJyArIGdhcCArIHBhcnRpYWwuam9pbignLFxuJyArIGdhcCkgKyAnXG4nICsgbWluZCArICddJw0KICAgICAgICAgICAgICAgICAgICA6ICdbJyArIHBhcnRpYWwuam9pbignLCcpICsgJ10nOw0KICAgICAgICAgICAgICAgIGdhcCA9IG1pbmQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgICAgICB9DQoNCi8vIElmIHRoZSByZXBsYWNlciBpcyBhbiBhcnJheSwgdXNlIGl0IHRvIHNlbGVjdCB0aGUgbWVtYmVycyB0byBiZSBzdHJpbmdpZmllZC4NCg0KICAgICAgICAgICAgaWYgKHJlcCAmJiB0eXBlb2YgcmVwID09PSAnb2JqZWN0Jykgew0KICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlcC5sZW5ndGg7DQogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwW2ldID09PSAnc3RyaW5nJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgayA9IHJlcFtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIoaywgdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsLnB1c2gocXVvdGUoaykgKyAoZ2FwID8gJzogJyA6ICc6JykgKyB2KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQoNCi8vIE90aGVyd2lzZSwgaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUga2V5cyBpbiB0aGUgb2JqZWN0Lg0KDQogICAgICAgICAgICAgICAgZm9yIChrIGluIHZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGspKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2ID0gc3RyKGssIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKHF1b3RlKGspICsgKGdhcCA/ICc6ICcgOiAnOicpICsgdik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCi8vIEpvaW4gYWxsIG9mIHRoZSBtZW1iZXIgdGV4dHMgdG9nZXRoZXIsIHNlcGFyYXRlZCB3aXRoIGNvbW1hcywNCi8vIGFuZCB3cmFwIHRoZW0gaW4gYnJhY2VzLg0KDQogICAgICAgICAgICB2ID0gcGFydGlhbC5sZW5ndGggPT09IDANCiAgICAgICAgICAgICAgICA/ICd7fScNCiAgICAgICAgICAgICAgICA6IGdhcA0KICAgICAgICAgICAgICAgID8gJ3tcbicgKyBnYXAgKyBwYXJ0aWFsLmpvaW4oJyxcbicgKyBnYXApICsgJ1xuJyArIG1pbmQgKyAnfScNCiAgICAgICAgICAgICAgICA6ICd7JyArIHBhcnRpYWwuam9pbignLCcpICsgJ30nOw0KICAgICAgICAgICAgZ2FwID0gbWluZDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9DQogICAgfQ0KDQovLyBJZiB0aGUgSlNPTiBvYmplY3QgZG9lcyBub3QgeWV0IGhhdmUgYSBzdHJpbmdpZnkgbWV0aG9kLCBnaXZlIGl0IG9uZS4NCg0KICAgIGlmICh0eXBlb2YgSlNPTi5zdHJpbmdpZnkgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgSlNPTi5zdHJpbmdpZnkgPSBmdW5jdGlvbiAodmFsdWUsIHJlcGxhY2VyLCBzcGFjZSkgew0KDQovLyBUaGUgc3RyaW5naWZ5IG1ldGhvZCB0YWtlcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCByZXBsYWNlciwgYW5kIGFuIG9wdGlvbmFsDQovLyBzcGFjZSBwYXJhbWV0ZXIsIGFuZCByZXR1cm5zIGEgSlNPTiB0ZXh0LiBUaGUgcmVwbGFjZXIgY2FuIGJlIGEgZnVuY3Rpb24NCi8vIHRoYXQgY2FuIHJlcGxhY2UgdmFsdWVzLCBvciBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgd2lsbCBzZWxlY3QgdGhlIGtleXMuDQovLyBBIGRlZmF1bHQgcmVwbGFjZXIgbWV0aG9kIGNhbiBiZSBwcm92aWRlZC4gVXNlIG9mIHRoZSBzcGFjZSBwYXJhbWV0ZXIgY2FuDQovLyBwcm9kdWNlIHRleHQgdGhhdCBpcyBtb3JlIGVhc2lseSByZWFkYWJsZS4NCg0KICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICBnYXAgPSAnJzsNCiAgICAgICAgICAgIGluZGVudCA9ICcnOw0KDQovLyBJZiB0aGUgc3BhY2UgcGFyYW1ldGVyIGlzIGEgbnVtYmVyLCBtYWtlIGFuIGluZGVudCBzdHJpbmcgY29udGFpbmluZyB0aGF0DQovLyBtYW55IHNwYWNlcy4NCg0KICAgICAgICAgICAgaWYgKHR5cGVvZiBzcGFjZSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BhY2U7IGkgKz0gMSkgew0KICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAnOw0KICAgICAgICAgICAgICAgIH0NCg0KLy8gSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIHN0cmluZywgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbmRlbnQgc3RyaW5nLg0KDQogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGFjZSA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzcGFjZTsNCiAgICAgICAgICAgIH0NCg0KLy8gSWYgdGhlcmUgaXMgYSByZXBsYWNlciwgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIGFycmF5Lg0KLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvci4NCg0KICAgICAgICAgICAgcmVwID0gcmVwbGFjZXI7DQogICAgICAgICAgICBpZiAocmVwbGFjZXIgJiYgdHlwZW9mIHJlcGxhY2VyICE9PSAnZnVuY3Rpb24nICYmDQogICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcmVwbGFjZXIgIT09ICdvYmplY3QnIHx8DQogICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXBsYWNlci5sZW5ndGggIT09ICdudW1iZXInKSkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNPTi5zdHJpbmdpZnknKTsNCiAgICAgICAgICAgIH0NCg0KLy8gTWFrZSBhIGZha2Ugcm9vdCBvYmplY3QgY29udGFpbmluZyBvdXIgdmFsdWUgdW5kZXIgdGhlIGtleSBvZiAnJy4NCi8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHN0cmluZ2lmeWluZyB0aGUgdmFsdWUuDQoNCiAgICAgICAgICAgIHJldHVybiBzdHIoJycsIHsnJzogdmFsdWV9KTsNCiAgICAgICAgfTsNCiAgICB9DQoNCg0KLy8gSWYgdGhlIEpTT04gb2JqZWN0IGRvZXMgbm90IHlldCBoYXZlIGEgcGFyc2UgbWV0aG9kLCBnaXZlIGl0IG9uZS4NCg0KICAgIGlmICh0eXBlb2YgSlNPTi5wYXJzZSAhPT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBKU09OLnBhcnNlID0gZnVuY3Rpb24gKHRleHQsIHJldml2ZXIpIHsNCg0KLy8gVGhlIHBhcnNlIG1ldGhvZCB0YWtlcyBhIHRleHQgYW5kIGFuIG9wdGlvbmFsIHJldml2ZXIgZnVuY3Rpb24sIGFuZCByZXR1cm5zDQovLyBhIEphdmFTY3JpcHQgdmFsdWUgaWYgdGhlIHRleHQgaXMgYSB2YWxpZCBKU09OIHRleHQuDQoNCiAgICAgICAgICAgIHZhciBqOw0KDQogICAgICAgICAgICBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7DQoNCi8vIFRoZSB3YWxrIG1ldGhvZCBpcyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUgc28NCi8vIHRoYXQgbW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZS4NCg0KICAgICAgICAgICAgICAgIHZhciBrLCB2LCB2YWx1ZSA9IGhvbGRlcltrZXldOw0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gd2Fsayh2YWx1ZSwgayk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcmV2aXZlci5jYWxsKGhvbGRlciwga2V5LCB2YWx1ZSk7DQogICAgICAgICAgICB9DQoNCg0KLy8gUGFyc2luZyBoYXBwZW5zIGluIGZvdXIgc3RhZ2VzLiBJbiB0aGUgZmlyc3Qgc3RhZ2UsIHdlIHJlcGxhY2UgY2VydGFpbg0KLy8gVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggZXNjYXBlIHNlcXVlbmNlcy4gSmF2YVNjcmlwdCBoYW5kbGVzIG1hbnkgY2hhcmFjdGVycw0KLy8gaW5jb3JyZWN0bHksIGVpdGhlciBzaWxlbnRseSBkZWxldGluZyB0aGVtLCBvciB0cmVhdGluZyB0aGVtIGFzIGxpbmUgZW5kaW5ncy4NCg0KICAgICAgICAgICAgdGV4dCA9IFN0cmluZyh0ZXh0KTsNCiAgICAgICAgICAgIGN4Lmxhc3RJbmRleCA9IDA7DQogICAgICAgICAgICBpZiAoY3gudGVzdCh0ZXh0KSkgew0KICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY3gsIGZ1bmN0aW9uIChhKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFx1JyArDQogICAgICAgICAgICAgICAgICAgICAgICAoJzAwMDAnICsgYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KDQovLyBJbiB0aGUgc2Vjb25kIHN0YWdlLCB3ZSBydW4gdGhlIHRleHQgYWdhaW5zdCByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgbG9vaw0KLy8gZm9yIG5vbi1KU09OIHBhdHRlcm5zLiBXZSBhcmUgZXNwZWNpYWxseSBjb25jZXJuZWQgd2l0aCAnKCknIGFuZCAnbmV3Jw0KLy8gYmVjYXVzZSB0aGV5IGNhbiBjYXVzZSBpbnZvY2F0aW9uLCBhbmQgJz0nIGJlY2F1c2UgaXQgY2FuIGNhdXNlIG11dGF0aW9uLg0KLy8gQnV0IGp1c3QgdG8gYmUgc2FmZSwgd2Ugd2FudCB0byByZWplY3QgYWxsIHVuZXhwZWN0ZWQgZm9ybXMuDQoNCi8vIFdlIHNwbGl0IHRoZSBzZWNvbmQgc3RhZ2UgaW50byA0IHJlZ2V4cCBvcGVyYXRpb25zIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kDQovLyBjcmlwcGxpbmcgaW5lZmZpY2llbmNpZXMgaW4gSUUncyBhbmQgU2FmYXJpJ3MgcmVnZXhwIGVuZ2luZXMuIEZpcnN0IHdlDQovLyByZXBsYWNlIHRoZSBKU09OIGJhY2tzbGFzaCBwYWlycyB3aXRoICdAJyAoYSBub24tSlNPTiBjaGFyYWN0ZXIpLiBTZWNvbmQsIHdlDQovLyByZXBsYWNlIGFsbCBzaW1wbGUgdmFsdWUgdG9rZW5zIHdpdGggJ10nIGNoYXJhY3RlcnMuIFRoaXJkLCB3ZSBkZWxldGUgYWxsDQovLyBvcGVuIGJyYWNrZXRzIHRoYXQgZm9sbG93IGEgY29sb24gb3IgY29tbWEgb3IgdGhhdCBiZWdpbiB0aGUgdGV4dC4gRmluYWxseSwNCi8vIHdlIGxvb2sgdG8gc2VlIHRoYXQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBvbmx5IHdoaXRlc3BhY2Ugb3IgJ10nIG9yDQovLyAnLCcgb3IgJzonIG9yICd7JyBvciAnfScuIElmIHRoYXQgaXMgc28sIHRoZW4gdGhlIHRleHQgaXMgc2FmZSBmb3IgZXZhbC4NCg0KICAgICAgICAgICAgaWYgKC9eW1xdLDp7fVxzXSokLw0KICAgICAgICAgICAgICAgICAgICAudGVzdCh0ZXh0LnJlcGxhY2UoL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywgJ0AnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCAnXScpDQogICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCAnJykpKSB7DQoNCi8vIEluIHRoZSB0aGlyZCBzdGFnZSB3ZSB1c2UgdGhlIGV2YWwgZnVuY3Rpb24gdG8gY29tcGlsZSB0aGUgdGV4dCBpbnRvIGENCi8vIEphdmFTY3JpcHQgc3RydWN0dXJlLiBUaGUgJ3snIG9wZXJhdG9yIGlzIHN1YmplY3QgdG8gYSBzeW50YWN0aWMgYW1iaWd1aXR5DQovLyBpbiBKYXZhU2NyaXB0OiBpdCBjYW4gYmVnaW4gYSBibG9jayBvciBhbiBvYmplY3QgbGl0ZXJhbC4gV2Ugd3JhcCB0aGUgdGV4dA0KLy8gaW4gcGFyZW5zIHRvIGVsaW1pbmF0ZSB0aGUgYW1iaWd1aXR5Lg0KDQogICAgICAgICAgICAgICAgaiA9IGV2YWwoJygnICsgdGV4dCArICcpJyk7DQoNCi8vIEluIHRoZSBvcHRpb25hbCBmb3VydGggc3RhZ2UsIHdlIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIG5ldyBzdHJ1Y3R1cmUsIHBhc3NpbmcNCi8vIGVhY2ggbmFtZS92YWx1ZSBwYWlyIHRvIGEgcmV2aXZlciBmdW5jdGlvbiBmb3IgcG9zc2libGUgdHJhbnNmb3JtYXRpb24uDQoNCiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicNCiAgICAgICAgICAgICAgICAgICAgPyB3YWxrKHsnJzogan0sICcnKQ0KICAgICAgICAgICAgICAgICAgICA6IGo7DQogICAgICAgICAgICB9DQoNCi8vIElmIHRoZSB0ZXh0IGlzIG5vdCBKU09OIHBhcnNlYWJsZSwgdGhlbiBhIFN5bnRheEVycm9yIGlzIHRocm93bi4NCg0KICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdKU09OLnBhcnNlJyk7DQogICAgICAgIH07DQogICAgfQ0KfSgpKTsNCg0KLyoNCiAgIFJlc2V0IHBhc3N3b3JkIGNvZGUuDQogICBUaGlzIGlzIG1vcmUgYSBzY3JpcHQgdGhhbiBhIHByb2dyYW0gc2luY2Ugd2UncmUgc2NyaXB0aW5nIGFuZCByZS1wdXJwb3NpbmcgY1BhbmVsJ3MgbG9naW4gcGFnZS4NCg0KKi8NCiAgICB2YXIgcmVzSlMgPSB7fTsNCiAgICByZXNKUy5yZXNldCA9IHt9Ow0KICAgIHJlc0pTLnJlc2V0LmlzX2NhbmNlbCA9IGZhbHNlOw0KICAgIHJlc0pTLnJlc2V0LmluX3Byb2dyZXNzID0gZmFsc2U7DQogICAgcmVzSlMucmVzZXQucmVsb2FkX2FjdGlvbiA9IGZhbHNlOw0KICAgIHJlc0pTLnJlc2V0LnNlbGVjdGVkRG9tYWluID0gJyc7DQogICAgcmVzSlMucmVzZXQucmVmbGVjdG9yVXJsID0gJy91bnByb3RlY3RlZC9jcGFuZWwvQVBJLnBocCc7DQogICAgcmVzSlMucmVzZXQucmVzZXRUeXBlID0gJyc7DQoNCiAgICAvLyBUaGUgdG9nZ2xlLCAob25jbGljayBldmVudCBvbiB0aGUgcmVzZXQgcGFzc3dvcmQgbGluaykgYWx0aG91Z2ggaWYgYSByZXNldCBpcyBpbiBwcm9ncmVzcyAoSUUgdGhleSd2ZSBsb2dnZWQgaW4pDQogICAgLy8gdGhlIG9ubHkgdG9nZ2xlIGlzIHRvIHJlZnJlc2ggdGhlIHBhZ2UgYmVjYXVzZSB3ZSd2ZSBkYW1hZ2VkIHRoZSBET00gdG9vIG11Y2ggdG8gZWFzaWx5IHJlcGFpciBpdC4NCiAgICByZXNKUy5yZXNldC5zaG93X3Jlc2V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICB3aGlsZSAoIFJFU0VUX0ZBREVTLmxlbmd0aCApIGNsZWFySW50ZXJ2YWwoIFJFU0VUX0ZBREVTLnNoaWZ0KCkgKTsNCiAgICAgICAgaWYgKCByZXNKUy5yZXNldC5pbl9wcm9ncmVzcyApIHsNCiAgICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWY9ZG9jdW1lbnQubG9jYXRpb24uaHJlZjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzSlMucmVzZXQuaXNfY2FuY2VsKSB7IC8vIHRvZ2dsZSBiYWNrIHRvIGNwYW5lbA0KICAgICAgICAgICAgJCgnI2xvY2FsZS1mb290ZXInKS5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7DQogICAgICAgICAgICAkKCcuY29weXJpZ2h0Jykuc2hvdygpOw0KICAgICAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmh0bWwoJ0xvZyBpbicpOw0KICAgICAgICAgICAgJCgnI2xvZ2luLXN1Yi1oZWFkZXInKS5jc3MoJ2JhY2tncm91bmQnLCByZXNKUy5yZXNldC5vcmlnaW5hbF9oZWFkZXJfYmxvY2tfY3NzKTsNCiAgICAgICAgICAgICQoJyNsb2dpbi1zdWItaGVhZGVyJykuaHRtbChyZXNKUy5yZXNldC5vcmlnaW5hbF9oZWFkZXJfYmxvY2spOw0KICAgICAgICAgICAgLy8kKCcjbG9naW4tc3ViLWhlYWRlcicpLmNzcygnYm94LXNoYWRvdycsICdub25lJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuY3NzKCd2aXNpYmlsaXR5JyxyZXNKUy5yZXNldC5vcmlnaW5hbF9zdGF0dXNfbWVzc2FnZSk7DQogICAgICAgICAgICAkKCcjcmVzZXRfbGluaycpLmh0bWwoJ1Jlc2V0IFBhc3N3b3JkJyk7DQogICAgICAgICAgICAkKCcjdXNlcicpLmF0dHIoJ3BsYWNlaG9sZGVyJywgcmVzSlMucmVzZXQub3JpZ2luYWxfcGxhY2Vob2xkZXJfdXNlcik7DQogICAgICAgICAgICAkKCcjcGFzcycpLmF0dHIoJ3BsYWNlaG9sZGVyJywgcmVzSlMucmVzZXQub3JpZ2luYWxfcGxhY2Vob2xkZXJfcGFzcyk7DQogICAgICAgICAgICAkKCcjdXNlcicpLnZhbCgnJyk7DQogICAgICAgICAgICAkKCcjcGFzcycpLnZhbCgnJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuY3NzKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7DQogICAgICAgICAgICAkKCcudXNlci1sYWJlbCcpLmh0bWwoJzxsYWJlbCBmb3I9InVzZXIiPlVzZXJuYW1lPC9sYWJlbD4nKTsNCiAgICAgICAgICAgICQoJy51c2VyLXB3JykuaHRtbCgnPGxhYmVsIGZvcj0icGFzcyI+UGFzc3dvcmQ8L2xhYmVsPicpOw0KICAgICAgICAgICAgcmVzSlMucmVzZXQuaXNfY2FuY2VsPWZhbHNlOw0KICAgICAgICB9IGVsc2UgeyAvLyB0b2dnbGUgdG8gcmVzZWxsZXIgY3JlZGVudGlhbHMNCiAgICAgICAgICAgIHJlc0pTLnJlc2V0Lm9yaWdpbmFsX2hlYWRlcl9ibG9jayA9ICQoJyNsb2dpbi1zdWItaGVhZGVyJykuaHRtbCgpOw0KICAgICAgICAgICAgcmVzSlMucmVzZXQub3JpZ2luYWxfaGVhZGVyX2Jsb2NrX2NzcyA9ICQoJyNsb2dpbi1zdWItaGVhZGVyJykuY3NzKCdiYWNrZ3JvdW5kJyk7DQogICAgICAgICAgICByZXNKUy5yZXNldC5vcmlnaW5hbF9wbGFjZWhvbGRlcl91c2VyID0gJCgnI3VzZXInKS5hdHRyKCdwbGFjZWhvbGRlcicpOw0KICAgICAgICAgICAgcmVzSlMucmVzZXQub3JpZ2luYWxfcGxhY2Vob2xkZXJfcGFzcyA9ICQoJyNwYXNzJykuYXR0cigncGxhY2Vob2xkZXInKTsNCiAgICAgICAgICAgIHJlc0pTLnJlc2V0Lm9yaWdpbmFsX3N0YXR1c19tZXNzYWdlID0gJCgnI2xvZ2luLXN0YXR1cycpLmNzcygndmlzaWJsZScpOw0KICAgICAgICAgICAgJCgnI2xvY2FsZS1mb290ZXInKS5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTsNCiAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMnKS5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTsNCiAgICAgICAgICAgICQoJy5jb3B5cmlnaHQnKS5oaWRlKCk7DQogICAgICAgICAgICAkKCcjbG9naW5fc3VibWl0JykuaHRtbCgnQ29udGludWUuLi4nKTsNCiAgICAgICAgICAgIC8vJCgnI2xvZ2luLXN1Yi1oZWFkZXInKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCd3aGl0ZScpOw0KICAgICAgICAgICAgLy8kKCcjbG9naW4tc3ViLWhlYWRlcicpLmNzcygnYm94LXNoYWRvdycsICcwIDAgMTBweCAjMDAwIGluc2V0Jyk7DQogICAgICAgICAgICAkKCcjcmVzZXRfbGluaycpLmh0bWwoJ0NhbmNlbCBSZXNldCcpOw0KICAgICAgICAgICAgJCgnI3VzZXInKS5hdHRyKCdwbGFjZWhvbGRlcicsJ0VudGVyIHlvdXIgQmlsbGluZyBFbWFpbC4nKTsNCiAgICAgICAgICAgICQoJyNwYXNzJykuYXR0cigncGxhY2Vob2xkZXInLCdFbnRlciB5b3VyIEJpbGxpbmcgUGFzc3dvcmQuJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuYXR0cignY2xhc3MnLCd3YXJuLW5vdGljZScpOw0KICAgICAgICAgICAgJCgnLnVzZXItbGFiZWwnKS5odG1sKCc8bGFiZWwgZm9yPSJ1c2VyIj5CaWxsaW5nIEVtYWlsOjwvbGFiZWw+Jyk7DQogICAgICAgICAgICAkKCcudXNlci1wdycpLmh0bWwoJzxsYWJlbCBmb3I9InBhc3MiPkJpbGxpbmcgUGFzc3dvcmQ6PC9sYWJlbD4nKTsNCg0KICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cy1tZXNzYWdlJykuaHRtbCgnUGFzc3dvcmQgcmVzZXQgaW4gcHJvZ3Jlc3MuJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpOw0KDQogICAgICAgICAgICByZXNKUy5yZXNldC5pc19jYW5jZWw9dHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIENhcHR1cmUgdGhlICJsb2dpbiIgYnV0dG9uIGV2ZW50DQogICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmNsaWNrKGZ1bmN0aW9uIChlKSB7DQogICAgICAgIC8vIGlmIHdlJ3JlIG9uIGNwYW5lbCByZXR1cm4gYW5kIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgbm9ybWFsbHkNCiAgICAgICAgaWYgKCFyZXNKUy5yZXNldC5pc19jYW5jZWwpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFdlJ3JlIG5vdCBvbiBjcGFuZWwncyBsb2dpbiBzbyBsZXRzIGRvIG91ciB0aGluZy4NCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdChlKTsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oZSk7DQoNCiAgICAgICAgdmFyIHJlcXVlc3QgPSB7fQ0KICAgICAgICAvL1RoaXMgaXMgdGhlIGZpbmFsIHN0ZXAgY2FsbGJhY2sgd2hlbiB3ZSdyZSBzZW5kaW5nIGNwYW5lbCB0aGUgbmV3IHBhc3N3b3Jkcy4NCiAgICAgICAgLy9KdXN0IGEgc3VjY2Vzcy9mYWlsdXJlIHBhZ2UuDQogICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrX29uX3Jlc2V0IChyZXNwLCBzdGF0dXMpIHsNCiAgICAgICAgICAgICQoJyNsb2dpbl9zdWJtaXQnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOw0KICAgICAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmh0bWwoJ1Jlc2V0IFBhc3N3b3JkJyk7DQoNCiAgICAgICAgICAgIGlmICghcmVzcC5yZXNwb25zZUpTT04pIHJlc3AucmVzcG9uc2VKU09OID0gSlNPTi5wYXJzZShyZXNwLnJlc3BvbnNlVGV4dCk7DQogICAgICAgICAgICBpZiAoc3RhdHVzPT09J2Vycm9yJyB8fCByZXNwLnJlc3BvbnNlSlNPTi5zdWNjZXNzID09PSAwIHx8IHJlc3AucmVzcG9uc2VKU09OLnN0YXR1c0NvZGU9PTQwMCkgew0KICAgICAgICAgICAgICAgIGlmICgvYmVjYXVzZSBpdCBpcyB0b28gd2Vhay9pLnRlc3QocmVzcC5yZXNwb25zZUpTT04uZXJyb3IpIHx8IHJlc3AucmVzcG9uc2VKU09OLnN0YXR1c0NvZGU9PTQwMCkgew0KICAgICAgICAgICAgICAgICAgICAvLyBJZiBjcGFuZWwgY29tcGxhaW5lZCBpdHMgdG9vIHdlYWsgcmV0dXJuIGFuZCBhbGxvdyB0aGVtIHRvIHRyeSB0aGUgcGFzc3dvcmQgYWdhaW4NCiAgICAgICAgICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cycpLmF0dHIoJ2NsYXNzJywnZXJyb3Itbm90aWNlJyk7DQogICAgICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMtbWVzc2FnZScpLmh0bWwoJ1RoZSBwYXNzd29yZCB5b3Ugc2VsZWN0ZWQgd2FzIHRvbyB3ZWFrLiAgUGxlYXNlIHRyeSBhIG1vcmUgY29tcGxleCBwYXNzd29yZC4nKTsNCiAgICAgICAgICAgICAgICAgICAgJCgnI3Bhc3MnKS52YWwoJycpOw0KICAgICAgICAgICAgICAgICAgICAkKCcjcGFzc192ZXJpZnknKS52YWwoJycpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMnKS5hdHRyKCdjbGFzcycsJ2Vycm9yLW5vdGljZScpOw0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMtbWVzc2FnZScpLmh0bWwoJ1RoZXJlIHdhcyBhbiBlcnJvciByZXNldHRpbmcgeW91ciBwYXNzd29yZC4gICBQbGVhc2UgY29udGFjdCBzdXBwb3J0IGZvciBmdXJ0aGVyIGFzc2lzdGFuY2UuJyk7DQogICAgICAgICAgICAgICAgJCgnI2NvbnRlbnQtY29udGFpbmVyJykuaGlkZSgpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIFN1Y2Nlc3MhICBSZWRpcmVjdCB0aGVtIHRvIHRoZWlyIHNlcnZlciBhbmQgbGV0IHRoZW0gbG9nIGluLg0KICAgICAgICAgICAgdmFyIGJ0bnMgPSAkKCIjYnV0dG9uX2NvbnRhaW5lciIpLmh0bWwoKTsNCiAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMnKS5hdHRyKCdjbGFzcycsJ3N1Y2Nlc3Mtbm90aWNlJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzLW1lc3NhZ2UnKS5odG1sKCdZb3VyIHBhc3N3b3JkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXNldCEnKTsNCiAgICAgICAgICAgICQoJyNsb2dpbl9mb3JtJykuaHRtbCgnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTZweCI+WW91ciBwYXNzd29yZCBoYXMgYmVlbiByZXNldCEgIDxici8+UGxlYXNlIGxvZyBpbiB3aXRoIHlvdXIgbmV3IHBhc3N3b3JkLjwvc3Bhbj48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPicgKyBidG5zKS5jc3MoJ3dpZHRoJywnMjg1cHgnKTsNCiAgICAgICAgICAgICQoJyNsb2dpbl9zdWJtaXQnKS5odG1sKCdMb2dpbiB3aXRoIHlvdXIgbmV3IHBhc3N3b3JkJykuY3NzKCd3aWR0aCcsJzEwMCUnKS5wYXJlbnQoKS5jc3MoJ3dpZHRoJywnMTAwJScpOw0KICAgICAgICAgICAgJCgnI3Jlc2V0X2xpbmsnKS5oaWRlKCk7DQogICAgICAgICAgICBpZiAocmVzSlMucmVzZXQucmVzZXRUeXBlID09ICdyZXNlbGxlcicpIHsNCiAgICAgICAgICAgICAgICAkKCcjbG9naW5fc3VibWl0JykuYXR0cignb25jbGljaycsJ2RvY3VtZW50LmxvY2F0aW9uLmhyZWY9Imh0dHBzOi8vJytyZXNKUy5yZXNldC5zZWxlY3RlZERvbWFpbisnOjIwODcvbG9naW4/dXNlcj0nICsgcmVzSlMucmVzZXQudXNlciArICciO3JldHVybiBmYWxzZScpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkKCcjbG9naW5fc3VibWl0JykuYXR0cignb25jbGljaycsJ2RvY3VtZW50LmxvY2F0aW9uLmhyZWY9Imh0dHBzOi8vJytyZXNKUy5yZXNldC5zZWxlY3RlZERvbWFpbisnOjIwODMvbG9naW4/dXNlcj0nICsgcmVzSlMucmVzZXQudXNlciArICciO3JldHVybiBmYWxzZScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FsbGJhY2sgZm9yIHRoZSBIRyBjcmVkZW50aWFscy4gICANCiAgICAgICAgLy8gV2Ugc2V0IHVwIHRoZSBwYWNrYWdlIGRyb3Bkb3duIGFuZCB0d28gcGFzc3dvcmQgZmllbGRzIGhlcmUuDQogICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChyZXNwLCBzdGF0dXMpIHsNCiAgICAgICAgICAgICQoJyNsb2dpbl9zdWJtaXQnKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOw0KICAgICAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmh0bWwoJ0NvbnRpbnVlLi4uJyk7DQoNCiAgICAgICAgICAgIGlmICghcmVzcC5yZXNwb25zZUpTT04pIHJlc3AucmVzcG9uc2VKU09OID0gSlNPTi5wYXJzZShyZXNwLnJlc3BvbnNlVGV4dCk7ICAgICANCiAgICAgICAgICAgIGlmIChzdGF0dXM9PT0nZXJyb3InIHx8IChyZXNwICYmIHJlc3AucmVzcG9uc2VKU09OICYmIHJlc3AucmVzcG9uc2VKU09OLnN0YXR1c0NvZGUgKSkgew0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMnKS5hdHRyKCdjbGFzcycsJ2Vycm9yLW5vdGljZScpOw0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMtbWVzc2FnZScpLmh0bWwoJ0ludmFsaWQgQmlsbGluZyBDcmVkZW50aWFscy4nKTsNCiAgICAgICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpOw0KICAgICAgICAgICAgICAgICQoJyNwYXNzJykudmFsKCcnKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXNKUy5yZXNldC5yZXNldFNlbGVjdGlvbiA9IHJlc3AucmVzcG9uc2VKU09OOw0KICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cycpLmF0dHIoJ2NsYXNzJywnd2Fybi1ub3RpY2UnKTsNCiAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMtbWVzc2FnZScpLmh0bWwoJ1Bhc3N3b3JkIHJlc2V0IGluIHByb2dyZXNzLicpOw0KICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cycpLmNzcygndmlzaWJpbGl0eScsJ3Zpc2libGUnKTsNCiAgICAgICAgICAgIHJlc0pTLnJlc2V0Lm9yaWdpbmFsX2Zvcm0gPSAkKCcjZm9ybXMnKS5odG1sKCk7DQogICAgICAgICAgICB2YXIgc2VsZWN0QmxvY2sgPSAiPHNlbGVjdCBpZD0ncGFja2FnZV9zZWxlY3QnIGNsYXNzPSdpbnB1dC1maWVsZC1sb2dpbiBpY29uIHVzZXJuYW1lLWNvbnRhaW5lcicgc3R5bGU9J3dpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czowcHggIWltcG9ydGFudCc+IjsNCiAgICAgICAgICAgIHZhciBob3N0ID0gbmV3IFJlZ0V4cChkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwnaScpOw0KICAgICAgICAgICAgdmFyIGksbWF4LGRvbWFpbixob3N0bmFtZSxzZWxlY3RlZFVzZWQ7DQogICAgICAgICAgICBmb3IgKGk9MDsgaTxyZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5yZXNlbGxlci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChyZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5yZXNlbGxlcltpXS5zdGF0dXM9PTIpIHsNCiAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gcmVzcC5yZXNwb25zZUpTT04ucGFja2FnZXMucmVzZWxsZXJbaV0ucGFja2FnZV9pbmZvcm1hdGlvbi5kb21haW47DQogICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lPXJlc3AucmVzcG9uc2VKU09OLnBhY2thZ2VzLnJlc2VsbGVyW2ldLnNlcnZlcl9pbmZvcm1hdGlvbi5ob3N0bmFtZTsNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0QmxvY2srPSc8b3B0aW9uICc7DQogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRVc2VkICYmIChob3N0LnRlc3QoZG9tYWluKSB8fCBob3N0LnRlc3QoaG9zdG5hbWUpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0QmxvY2srPSAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRVc2VkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RCbG9jayArPSAndmFsdWU9IicgKyByZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5yZXNlbGxlcltpXS5wYWNrYWdlX2lkOw0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RCbG9jays9JyI+Jytkb21haW4rJyAoJyArIGhvc3RuYW1lICsgJyk8L29wdGlvbj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIGZvciAoaT0wOyBpPHJlc3AucmVzcG9uc2VKU09OLnBhY2thZ2VzLnNoYXJlZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgLy8gICAgIGlmIChyZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5zaGFyZWRbaV0uc3RhdHVzPT0yKSB7DQogICAgICAgICAgICAvLyAgICAgICAgIGRvbWFpbiA9IHJlc3AucmVzcG9uc2VKU09OLnBhY2thZ2VzLnNoYXJlZFtpXS5wYWNrYWdlX2luZm9ybWF0aW9uLmRvbWFpbjsNCiAgICAgICAgICAgIC8vICAgICAgICAgaG9zdG5hbWU9cmVzcC5yZXNwb25zZUpTT04ucGFja2FnZXMuc2hhcmVkW2ldLnNlcnZlcl9pbmZvcm1hdGlvbi5ob3N0bmFtZTsNCiAgICAgICAgICAgIC8vICAgICAgICAgc2VsZWN0QmxvY2srPSc8b3B0aW9uICc7DQogICAgICAgICAgICAvLyAgICAgICAgIGlmICghc2VsZWN0ZWRVc2VkICYmIChob3N0LnRlc3QoZG9tYWluKSB8fCBob3N0LnRlc3QoaG9zdG5hbWUpKSkgew0KICAgICAgICAgICAgLy8gICAgICAgICAgICAgc2VsZWN0QmxvY2srPSAnc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOw0KICAgICAgICAgICAgLy8gICAgICAgICAgICAgc2VsZWN0ZWRVc2VkID0gdHJ1ZTsNCiAgICAgICAgICAgIC8vICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gICAgICAgICBzZWxlY3RCbG9jayArPSAndmFsdWU9IicgKyByZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5zaGFyZWRbaV0ucGFja2FnZV9pZDsNCiAgICAgICAgICAgIC8vICAgICAgICAgc2VsZWN0QmxvY2srPSciPicrZG9tYWluKycgKCcgKyBob3N0bmFtZSArICcpPC9vcHRpb24+JzsNCiAgICAgICAgICAgIC8vICAgICB9DQogICAgICAgICAgICAvLyB9DQogICAgICAgICAgICBzZWxlY3RCbG9jays9Jzwvc2VsZWN0Jz4NCiAgICAgICAgICAgICQoJy51c2VybmFtZS1jb250YWluZXInKS5odG1sKHNlbGVjdEJsb2NrKTsNCiAgICAgICAgICAgICQoJy51c2VyLWxhYmVsJykuaHRtbCgnPGxhYmVsIGZvcj0icGFja2FnZV9zZWxlY3QiPlBsZWFzZSBzZWxlY3QgeW91ciBwYWNrYWdlLjwvbGFiZWw+Jyk7DQogICAgICAgICAgICAkKCcudXNlci1wdycpLmh0bWwoJzxsYWJlbCBmb3I9InBhc3MiPkVudGVyIGEgbmV3IHBhc3N3b3JkIGZvciB1c2VyOiA8c3BhbiBpZD0idXNlcklEIj4mbmJzcDs8L3NwYW4+PC9sYWJlbD4nKTsNCiAgICAgICAgICAgICQoJyNwYXNzJykucGFyZW50KCkuY3NzKCdtYXJnaW4tYm90dG9tJywnNXB4Jyk7DQogICAgICAgICAgICAkKCcjcGFja2FnZV9zZWxlY3QnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgdmFsID0gJCgnI3BhY2thZ2Vfc2VsZWN0JykudmFsKCk7DQogICAgICAgICAgICAgICAgdmFyIHVzZXIgPSAnJzsNCiAgICAgICAgICAgICAgICB2YXIgaSxtYXgsc2NyYXRjaDsNCiAgICAgICAgICAgICAgICBmb3IgKGk9MCwgbWF4PXJlc3AucmVzcG9uc2VKU09OLnBhY2thZ2VzLnJlc2VsbGVyLmxlbmd0aDsgaTxtYXg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBzY3JhdGNoPXJlc3AucmVzcG9uc2VKU09OLnBhY2thZ2VzLnJlc2VsbGVyW2ldOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc2NyYXRjaC5wYWNrYWdlX2lkID09PSB2YWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBzY3JhdGNoLnBhY2thZ2VfaW5mb3JtYXRpb24udXNlcm5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICByZXNKUy5yZXNldC5zZWxlY3RlZERvbWFpbiA9IHNjcmF0Y2guc2VydmVyX2luZm9ybWF0aW9uLmhvc3RuYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpPTAsIG1heD1yZXNwLnJlc3BvbnNlSlNPTi5wYWNrYWdlcy5zaGFyZWQubGVuZ3RoOyBpPG1heDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHNjcmF0Y2g9cmVzcC5yZXNwb25zZUpTT04ucGFja2FnZXMuc2hhcmVkW2ldOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc2NyYXRjaC5wYWNrYWdlX2lkID09PSB2YWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBzY3JhdGNoLnBhY2thZ2VfaW5mb3JtYXRpb24udXNlcm5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICByZXNKUy5yZXNldC5zZWxlY3RlZERvbWFpbiA9IHNjcmF0Y2guc2VydmVyX2luZm9ybWF0aW9uLmhvc3RuYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHVzZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzSlMucmVzZXQudXNlciA9IHVzZXI7DQogICAgICAgICAgICAgICAgICAgICQoJyN1c2VySUQnKS5odG1sKHVzZXIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZScpOw0KICAgICAgICAgICAgJCgnI3Bhc3MnKS5hdHRyKCdwbGFjZWhvbGRlcicsJ0VudGVyIGEgbmV3IHBhc3N3b3JkIScpOw0KICAgICAgICAgICAgJCgnLnBhc3N3b3JkLWNvbnRhaW5lcicpLmFmdGVyKCAnPGRpdiBjbGFzcz0iaGVscGVyLXRleHQiIHN0eWxlPSJtYXJnaW4tdG9wOjlweCI+UGFzc3dvcmRzIG11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLCBhbmQgc2hvdWxkIGhhdmUgc29tZSBjb21wbGV4aXR5IGludm9sdmluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzLjwvZGl2PicpOw0KICAgICAgICAgICAgJCgnLnBhc3N3b3JkLWNvbnRhaW5lcicpLmFmdGVyKCAnPGRpdiBjbGFzcz0iaW5wdXQtZmllbGQtbG9naW4gaWNvbiBwYXNzd29yZC1jb250YWluZXIiPjxpbnB1dCBuYW1lPSJwYXNzX3ZlcmlmeSIgaWQ9InBhc3NfdmVyaWZ5IiBwbGFjZWhvbGRlcj0iUGxlYXNlIHZlcmlmeSB5b3VyIG5ldyBwYXNzd29yZC4iIGNsYXNzPSJzdGRfdGV4dGJveCIgdHlwZT0icGFzc3dvcmQiIHRhYmluZGV4PSIzIiBhdXRvY29tcGxldGU9Im9mZiIvPjwvZGl2PicpOw0KICAgICAgICAgICAgJCgnI3Bhc3MnKS52YWwoJycpOw0KICAgICAgICAgICAgJCgnI3Bhc3NfdmVyaWZ5JykudmFsKCcnKTsNCiAgICAgICAgICAgICQoJy5wYXNzd29yZC1jb250YWluZXInKS5jc3MoJ2JvcmRlcicsJzJweCBzb2xpZCAjZjY5MjFlJyk7DQogICAgICAgICAgICAkKCcjbG9naW4tY29udGFpbmVyJykuY3NzKCdoZWlnaHQnLCc0MTBweCcpOw0KICAgICAgICAgICAgJCgnI2xvZ2luLXN1Yi1jb250YWluZXInKS5jc3MoJ2hlaWdodCcsJzQwMHB4Jyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3ViJykuY3NzKCdoZWlnaHQnLCcyOTVweCcpOw0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICQoJyNsb2dpbi1jb250YWluZXInKS5jc3MoJ2hlaWdodCcsJzM5M3B4Jyk7DQogICAgICAgICAgICAkKCcjbG9naW4tc3ViLWNvbnRhaW5lcicpLmNzcygnaGVpZ2h0JywnMzgzcHgnKTsNCiAgICAgICAgICAgICQoJyNsb2dpbi1zdWInKS5jc3MoJ2hlaWdodCcsJzI3NXB4Jyk7DQogICAgICAgICAgICAqLw0KICAgICAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmh0bWwoJ1Jlc2V0IFBhc3N3b3JkJyk7DQogICAgICAgICAgICByZXNKUy5yZXNldC5pbl9wcm9ncmVzcyA9IHRydWU7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vIE9LIGJhY2sgdG8gdGhlIHJlc2V0IHBhc3N3b3JkIHRvZ2dsZS4uLg0KICAgICAgICAvLyBJZiBpbl9wcm9ncmVzcyBpcyBzZXQgdGhlbiB0aGUgdXNlciBpcyB0cnlpbmcgdG8gc3VibWl0IHRoZSBwYXNzd29yZC4NCiAgICAgICAgaWYgKHJlc0pTLnJlc2V0LmluX3Byb2dyZXNzKSB7DQogICAgICAgICAgICAkKCcjbG9naW4tc3RhdHVzJykuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpLnNob3coKTsNCg0KDQogICAgICAgICAgICBpZiAoJCgnI3Bhc3MnKS52YWwoKS5sZW5ndGggPCA4KSB7DQogICAgICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cycpLmF0dHIoJ2NsYXNzJywnZXJyb3Itbm90aWNlJyk7DQogICAgICAgICAgICAgICAgJCgnI2xvZ2luLXN0YXR1cy1tZXNzYWdlJykuaHRtbCgnWW91ciBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycy4nKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICgkKCcjcGFzcycpLnZhbCgpICE9PSAkKCcjcGFzc192ZXJpZnknKS52YWwoKSkgew0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMnKS5hdHRyKCdjbGFzcycsJ2Vycm9yLW5vdGljZScpOw0KICAgICAgICAgICAgICAgICQoJyNsb2dpbi1zdGF0dXMtbWVzc2FnZScpLmh0bWwoJ1lvdXIgcGFzc3dvcmRzIG11c3QgbWF0Y2ghJyk7DQogICAgICAgICAgICAgICAgJCgnI3Bhc3MnKS52YWwoJycpOw0KICAgICAgICAgICAgICAgICQoJyNwYXNzX3ZlcmlmeScpLnZhbCgnJyk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcGFja1R5cGVzID0gWydyZXNlbGxlciddOw0KICAgICAgICAgICAgdmFyIHBhY2tzID0gcmVzSlMucmVzZXQucmVzZXRTZWxlY3Rpb24ucGFja2FnZXM7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGN1cnJlbnRUeXBlIGluIHBhY2tUeXBlcykgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIHBhY2sgaW4gcGFja3NbcGFja1R5cGVzW2N1cnJlbnRUeXBlXV0pIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNwYWNrYWdlX3NlbGVjdCcpLnZhbCgpID09IHBhY2tzW3BhY2tUeXBlc1tjdXJyZW50VHlwZV1dW3BhY2tdLnBhY2thZ2VfaWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0pTLnJlc2V0LnJlc2V0VHlwZSA9IHBhY2tUeXBlc1tjdXJyZW50VHlwZV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJlcXVlc3QgPSB7DQogICAgICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgICAgIHVybDogcmVzSlMucmVzZXQucmVmbGVjdG9yVXJsKyI/YWN0aW9uPVNldFBhY2thZ2VQYXNzd29yZHYyJnBhY2thZ2VJZD0iICsgJCgnI3BhY2thZ2Vfc2VsZWN0JykudmFsKCkgKyAiJnBhY2thZ2VUeXBlPSIgKyByZXNKUy5yZXNldC5yZXNldFR5cGUsDQogICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoew0KICAgICAgICAgICAgICAgICAgICBkYXRhOnsNCiAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCI6ICQoJyNwYXNzJykudmFsKCkNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgY29va2llOiByZXNKUy5yZXNldC5yZXNldFNlbGVjdGlvbi5jb29raWUNCiAgICAgICAgICAgICAgICB9KSwNCiAgICAgICAgICAgICAgICBjb21wbGV0ZTogY2FsbGJhY2tfb25fcmVzZXQNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICQoJyNsb2dpbl9zdWJtaXQnKS5odG1sKCdXb3JraW5nLi4uJyk7DQogICAgICAgICAgICAkKCcjbG9naW5fc3VibWl0JykuYXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpOw0KICAgICAgICAgICAgJC5hamF4KHJlcXVlc3QpOw0KDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICAvLyBpbiBwcm9ncmVzcyB3YXMgbm90IHNldCBzbyB3ZSBqdXN0IGxvZyB0aGVtIGluIG9yIHRyeSB0by4NCg0KICAgICAgICByZXF1ZXN0ID0gew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiByZXNKUy5yZXNldC5yZWZsZWN0b3JVcmwrIj9hY3Rpb249TG9naW4iLA0KICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe2RhdGE6ew0KICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6ICQoJyN1c2VyJykudmFsKCksDQogICAgICAgICAgICAgICAgInBhc3N3b3JkIjogJCgnI3Bhc3MnKS52YWwoKQ0KICAgICAgICAgICAgfX0pLA0KICAgICAgICAgICAgY29tcGxldGU6IGNhbGxiYWNrDQogICAgICAgIH0NCiAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmh0bWwoJ1dvcmtpbmcuLi4nKTsNCiAgICAgICAgJCgnI2xvZ2luX3N1Ym1pdCcpLmF0dHIoJ2Rpc2FibGVkJywnZGlzYWJsZWQnKTsNCiAgICAgICAgJC5hamF4KHJlcXVlc3QpOw0KICAgIH0pDQoNCjwvc2NyaXB0Pg0KICAgIDxkaXYgY2xhc3M9ImNvcHlyaWdodCI+Q29weXJpZ2h0wqkmbmJzcDsyMDE1IGNQYW5lbCwgSW5jLjwvZGl2Pg0KDQoNCg0KDQo8L2JvZHk+PC9odG1sPg==">
</head>
</body>
</html>