Análisis de máquinas de azar
Ingresa con tu cuenta autorizada.
Usuario
Contraseña
Ingresar
Ingresa con tu cuenta autorizada.
Enjoy Los Ángeles · Supabase · aporte de salones v20
Cerrar sesión
ENJOY LOS ÁNGELES / ANÁLISIS DE MÁQUINAS DE AZAR
Panorama de rendimiento
Explora el desempeño de tu parque de máquinas.
↑ Actualizar matriz
Leyendo matriz…
Desde
Hasta
Restablecer filtros
Guardar vista
Mis vistas guardadas
Agrupar por
Indicador
Evolución
Mensual
Semanal
Diaria
Referencia de ratios
Total del período, sin filtros de categorías
Salón de cada grupo
Selección filtrada
↓ Exportar consulta
CmZ1bmN0aW9uIGF4aXNQZXJpb2RWMTQobGFiZWwpewogY29uc3QgbT1TdHJpbmcobGFiZWwpLm1hdGNoKC9eKC4qPylccysoPzrCt1xzKik/KFxkezR9KSQvKTsKIHJldHVybiBtID8gZXNjKG1bMV0pKyc8dHNwYW4geD0iMCIgZHk9IjE3Ij4nK21bMl0rJzwvdHNwYW4+JyA6IGVzYyhsYWJlbCk7Cn0KZnVuY3Rpb24gYXhpc0RhdGVzVjE0KHJhbmdlKXsKIGNvbnN0IG1vbnRocz17ZW5lcm86JzAxJyxmZWJyZXJvOicwMicsbWFyem86JzAzJyxhYnJpbDonMDQnLG1heW86JzA1JyxqdW5pbzonMDYnLGp1bGlvOicwNycsYWdvc3RvOicwOCcsc2VwdGllbWJyZTonMDknLG9jdHVicmU6JzEwJyxub3ZpZW1icmU6JzExJyxkaWNpZW1icmU6JzEyJ307CiByZXR1cm4gU3RyaW5nKHJhbmdlKS5yZXBsYWNlKC8oXGR7MSwyfSkgKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpIFxkezR9L2csKG0sZCxtb250aCk9PmQucGFkU3RhcnQoMiwnMCcpKycvJyttb250aHNbbW9udGhdKS5yZXBsYWNlKCcg4oaSICcsJyDigJMgJyk7Cn0KY29uc3QgJD1zPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpLCBlc2M9cz0+U3RyaW5nKHM/PydTaW4gZGF0bycpLnJlcGxhY2UoL1smPD4iJ10vZyxjPT4oeycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnIic6JyZxdW90OycsIiciOicmIzM5Oyd9W2NdKSk7CmNvbnN0IGRpbXM9ezE6J03DoXF1aW5hJywyOidNYXJjYSAvIEZhYnJpY2FudGUnLDM6J1BsYXRhZm9ybWEnLDQ6J01vZGVsbyAvIEp1ZWdvJyw5OidCYW5jbyAvIEJsb3F1ZScsODonUG96byAvIElELVByb2cnLDU6J1NlY3RvciAvIFNlY2Npw7NuJyw3OidTYWzDs24nfTsKY29uc3QgbWV0cmljcz17d2luOidXaW4gb3BlcmFjaW9uYWwnLGNvaW46J0NvaW4gSW4nLHdkOidXaW4gLyBkw61hIHJlZ2lzdHJhZG8nLGNkOidDb2luIEluIC8gZMOtYSByZWdpc3RyYWRvJyxiZXQ6J0FwdWVzdGEgcHJvbWVkaW8nLHBvOidQYXlvdXQnLHBvbjonUGF5b3V0IGNvbiBOQ0MnLGRldjonRGVzdmlhY2nDs24gTkNDJyxzcGluOidTcGlucycsc2Q6J1NwaW5zIC8gZMOtYSByZWdpc3RyYWRvJyxyYXRpbzonUmF0aW8gQ29pbiBJbiAvIGTDrWEnLHJzOidSYXRpbyBzcGlucyAvIGTDrWEnLHJiOidSYXRpbyBhcHVlc3RhIHByb21lZGlvJyxvY2M6J09jdXBhY2nDs24gbWVkaWEnLHByaXplOidQcmVtaW9zJyxwcm9tbzonUHJvbW8gbmV0YSd9OwpsZXQgZGF0YSx0YWI9J1Jlc3VtZW4nLHBhZ2U9MCxzb3J0PSd3aW4nLGRlc2M9dHJ1ZSx0YWJsZVJvd3M9W10scXVlcnk9Jyc7CmNvbnN0IG51bT0odik9PnR5cGVvZiB2PT09J251bWJlcicmJk51bWJlci5pc0Zpbml0ZSh2KT92OjAsIGRpdj0oYSxiKT0+YT09bnVsbHx8Yj09bnVsbHx8Yj09PTA/bnVsbDphL2I7CmNvbnN0IGZtdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJ10uaW5jbHVkZXMoayk/KHYqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKyclJzpbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP3YudG9GaXhlZCgyKSsnw5cnOnYudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOk1hdGguYWJzKHYpPDEwMD8yOjB9KTsKY29uc3QgY29tcGFjdD0odixrKT0+dj09bnVsbD8n4oCUJzpbJ3BvJywncG9uJywnZGV2Jywnb2NjJywncmF0aW8nLCdycycsJ3JiJ10uaW5jbHVkZXMoayk/Zm10KHYsayk6TWF0aC5hYnModik+PTFlNj8odi8xZTYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyBNJzpmbXQodixrKTsKZnVuY3Rpb24gYWdnKHJvd3Mpe2xldCBhPXt3aW46MCxjb2luOjAsc3BpbjowLHByaXplOjAscHJvbW86MCxvYzowLG46MCxkYXlzOjB9LGRheXM9bmV3IFNldDtmb3IoY29uc3QgciBvZiByb3dzKXthLndpbis9bnVtKHJbMTZdKTthLmNvaW4rPW51bShyWzE4XSk7YS5zcGluKz1udW0oclsyMF0pO2EucHJpemUrPW51bShyWzE1XSk7YS5wcm9tbys9bnVtKHJbMjZdKS1udW0oclsyN10pO2lmKHR5cGVvZiByWzIyXT09PSdudW1iZXInKXthLm9jKz1yWzIyXTthLm4rK31pZihyWzFdIT1udWxsKWRheXMuYWRkKHJbMF0rJ3wnK3JbMV0pfWEuZGF5cz1kYXlzLnNpemU7YS53ZD1kaXYoYS53aW4sYS5kYXlzKTthLmNkPWRpdihhLmNvaW4sYS5kYXlzKTthLnNkPWRpdihhLnNwaW4sYS5kYXlzKTthLmJldD1kaXYoYS5jb2luLGEuc3Bpbik7YS5wbz1hLmNvaW4/MS1hLndpbi9hLmNvaW46bnVsbDthLnBvbj1hLmNvaW4/MS0oYS53aW4rYS5wcm9tbykvYS5jb2luOm51bGw7YS5kZXY9YS5wbz09bnVsbD9udWxsOmEucG8tYS5wb247YS5vY2M9ZGl2KGEub2MsYS5uKTtyZXR1cm4gYX0KZnVuY3Rpb24gc2VsZWN0ZWQoKXtyZXR1cm4gT2JqZWN0LmtleXMoZGltcykubWFwKGs9PlsrayxbLi4uJCgnI2YnK2spLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpXSkuZmlsdGVyKHg9PnhbMV0ubGVuZ3RoKX0KZnVuY3Rpb24gZGF0ZWQoKXtyZXR1cm4gZGF0YS5yb3dzLmZpbHRlcihyPT4oISQoJyNmcm9tJykudmFsdWV8fHJbMF0+PSQoJyNmcm9tJykudmFsdWUpJiYoISQoJyN0bycpLnZhbHVlfHxyWzBdPD0kKCcjdG8nKS52YWx1ZSkpfQpmdW5jdGlvbiBmaWx0ZXJlZCgpe2xldCBzZWw9c2VsZWN0ZWQoKTtyZXR1cm4gZGF0ZWQoKS5maWx0ZXIocj0+c2VsLmV2ZXJ5KChbayx2XSk9PnYuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpfQpmdW5jdGlvbiBpbml0KCl7bGV0IGRhdGVzPWRhdGEucm93cy5tYXAocj0+clswXSkuc29ydCgpOyQoJyNmcm9tJykudmFsdWU9ZGF0ZXNbMF07JCgnI3RvJykudmFsdWU9ZGF0ZXMuYXQoLTEpOyQoJyNmaWx0ZXJzJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPGxhYmVsPiR7dn08c2VsZWN0IGlkPSJmJHtrfSIgbXVsdGlwbGUgYXJpYS1sYWJlbD0iJHt2fSI+JHtbLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PlN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpXS5maWx0ZXIodmFsdWU9PnZhbHVlLnRyaW0oKS50b0xvY2FsZVVwcGVyQ2FzZSgnZXMnKSE9PSdFWFBJUkFET1MnKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKS5tYXAodj0+YDxvcHRpb24gdmFsdWU9IiR7ZXNjKHYpfSI+JHtlc2Modil9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD5gKS5qb2luKCcnKTskKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9YCR7ZGF0YS5uYW1lfSDCtyAke2ZtdChkYXRhLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7ZGF0ZXNbMF19IOKGkiAke2RhdGVzLmF0KC0xKX0gwrcgQ3RybC9DbWQgKyBjbGljIHBhcmEgc2VsZWNjacOzbiBtw7psdGlwbGVgOyQoJyNmb290JykudGV4dENvbnRlbnQ9J0RhdG9zIGFjdHVhbGl6YWRvcyBoYXN0YSAnK2RhdGVzLmF0KC0xKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBzZWxlY3QnKS5mb3JFYWNoKGU9PmUub25jaGFuZ2U9KCk9PntwYWdlPTA7cmVuZGVyKCl9KTtyZW5kZXIoKX0KZnVuY3Rpb24gZ3JvdXBzKHJvd3Msa2V5KXtsZXQgbT1uZXcgTWFwO2ZvcihsZXQgciBvZiByb3dzKXtsZXQgaz1rZXkocik7aWYoIW0uaGFzKGspKW0uc2V0KGssW10pO20uZ2V0KGspLnB1c2gocil9cmV0dXJuIFsuLi5tXS5tYXAoKFtuYW1lLHJvd3NdKT0+KHtuYW1lLHJvd3MsLi4uYWdnKHJvd3MpfSkpfQpmdW5jdGlvbiByYXRpb3MoYSxyZWYpe2EucmF0aW89ZGl2KGEuY2QscmVmLmNkKTthLnJzPWRpdihhLnNkLHJlZi5zZCk7YS5yYj1kaXYoYS5iZXQscmVmLmJldCk7cmV0dXJuIGF9CmZ1bmN0aW9uIGxlZ2FjeVJlbmRlcigpe2lmKCFkYXRhKXJldHVybjtsZXQgcm93cz1maWx0ZXJlZCgpLGJhc2U9ZGF0ZWQoKSxhPWFnZyhyb3dzKSxyZWZlcmVuY2U9YWdnKCQoJyNyZWYnKS52YWx1ZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKSxnPSskKCcjZ3JvdXAnKS52YWx1ZSxrPSQoJyNtZXRyaWMnKS52YWx1ZTtyYXRpb3MoYSxyZWZlcmVuY2UpO3RhYmxlUm93cz1ncm91cHMocm93cyxyPT5TdHJpbmcocltnXT8/J1NpbiBkYXRvJykpO2xldCBzYWxvbkNhY2hlPW5ldyBNYXA7Zm9yKGxldCBpdGVtIG9mIHRhYmxlUm93cyl7bGV0IHJlZj1yZWZlcmVuY2U7aWYoJCgnI3JlZicpLnZhbHVlPT09J3NhbG9uJyl7bGV0IHNhbG9ucz1bLi4ubmV3IFNldChpdGVtLnJvd3MubWFwKHI9PnJbN10pKV0uc29ydCgpLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMpO2lmKCFzYWxvbkNhY2hlLmhhcyhrZXkpKXNhbG9uQ2FjaGUuc2V0KGtleSxhZ2coYmFzZS5maWx0ZXIocj0+c2Fsb25zLmluY2x1ZGVzKHJbN10pKSkpO3JlZj1zYWxvbkNhY2hlLmdldChrZXkpfXJhdGlvcyhpdGVtLHJlZil9JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9KHtSZXN1bWVuOidQYW5vcmFtYSBkZSByZW5kaW1pZW50bycsQ29tcGFyYXRpdm9zOidDb21wYXJhdGl2b3MgZGVsIHBhcnF1ZScsRXZvbHVjacOzbjonRXZvbHVjacOzbiBkZSBpbmRpY2Fkb3JlcycsUmF0aW9zOidSYXRpb3MgZGUgcmVuZGltaWVudG8nLE1ldG9kb2xvZ8OtYTonQ8OhbGN1bG9zIHkgYWN0dWFsaXphY2nDs24nfSlbdGFiXTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJyl7bWV0aG9kKCk7cmV0dXJufWxldCBjYXJkcz1bJ3dpbicsJ2NvaW4nLCdwbycsJ2JldCddOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJrcGlzIj4ke2NhcmRzLm1hcChrPT5gPGRpdiBjbGFzcz0iY2FyZCBrcGkiPjxzbWFsbD4ke21ldHJpY3Nba10udG9VcHBlckNhc2UoKX08L3NtYWxsPjxzdHJvbmc+JHtjb21wYWN0KGFba10sayl9PC9zdHJvbmc+PHNwYW4+JHtbJ3dpbicsJ2NvaW4nLCdiZXQnXS5pbmNsdWRlcyhrKT8nQ0xQIMK3ICc6Jyd9JHtrPT09J3BvJz8nQ2FsY3VsYWRvIHNvYnJlIHRvdGFsZXMnOmZtdChhLmRheXMpKycgbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXMnfTwvc3Bhbj48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj4keyFyb3dzLmxlbmd0aD8nPGRpdiBjbGFzcz0iY2FyZCBlbXB0eSI+Tm8gaGF5IHJlZ2lzdHJvcyBwYXJhIGVzdGEgc2VsZWNjacOzbi4gQWp1c3RhIGxvcyBmaWx0cm9zLjwvZGl2Pic6YDxkaXYgY2xhc3M9ImNoYXJ0cyI+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7dGFiPT09J1JhdGlvcyc/J1JlbmRpbWllbnRvIHJlbGF0aXZvJzonUmFua2luZyBwb3IgJyttZXRyaWNzW2tdfTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7ZGltc1tnXX0gwrcgU2VsZWNjacOzbiBhY3R1YWwgwrcgVG9wIDg8L2Rpdj48ZGl2IGlkPSJiYXJzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBkZSAke21ldHJpY3Nba119PC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+JHskKCcjZ3JhaW4nKS5zZWxlY3RlZE9wdGlvbnNbMF0udGV4dH0gwrcgJHtzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpfTwvZGl2PjxkaXYgaWQ9ImxpbmUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9InRhYmxldG9wIj48ZGl2PjxoMj5EZXRhbGxlIGNvbXBhcmF0aXZvPC9oMj48c3BhbiBjbGFzcz0ic3VidGl0bGUiPk9yZGVuYSBkZXNkZSBsb3MgZW5jYWJlemFkb3MgwrcgUmF0aW9zOiAxw5cgPSByZWZlcmVuY2lhPC9zcGFuPjwvZGl2PjxpbnB1dCBpZD0ic2VhcmNoIiBwbGFjZWhvbGRlcj0iQnVzY2FyIGdydXBv4oCmIiB2YWx1ZT0iJHtlc2MocXVlcnkpfSI+PC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIiBpZD0idGFibGUiPjwvZGl2PjxkaXYgY2xhc3M9InBhZ2VyIj48c3BhbiBpZD0iY291bnQiPjwvc3Bhbj48ZGl2PjxidXR0b24gaWQ9InByZXYiPuKGkDwvYnV0dG9uPiA8YnV0dG9uIGlkPSJuZXh0Ij7ihpI8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gfWA7aWYoIXJvd3MubGVuZ3RoKXJldHVybjtsZXQgcmFua2VkPVsuLi50YWJsZVJvd3NdLnNvcnQoKGEsYik9PihiW2tdPz8tSW5maW5pdHkpLShhW2tdPz8tSW5maW5pdHkpKS5zbGljZSgwLDgpLG1heD1NYXRoLm1heCguLi5yYW5rZWQubWFwKHI9Pk1hdGguYWJzKHJba118fDApKSwxKTskKCcjYmFycycpLmlubmVySFRNTD1yYW5rZWQubWFwKHI9PmA8ZGl2IGNsYXNzPSJiYXJyb3ciPjxzcGFuIGNsYXNzPSJiYXJsYWJlbCIgdGl0bGU9IiR7ZXNjKHIubmFtZSl9Ij4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyICR7cltrXTwwPyduZWdhdGl2ZSc6Jyd9IiBzdHlsZT0id2lkdGg6JHtNYXRoLm1heCgwLE1hdGguYWJzKHJba118fDApL21heCoxMDApfSUiPjwvZGl2PjwvZGl2PjxiPiR7Y29tcGFjdChyW2tdLGspfTwvYj48L2Rpdj5gKS5qb2luKCcnKTtsZXQgdHJlbmQ9Z3JvdXBzKHJvd3Mscj0+JCgnI2dyYWluJykudmFsdWU9PT0nbW9udGgnP3JbMF0uc2xpY2UoMCw3KTokKCcjZ3JhaW4nKS52YWx1ZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTt0cmVuZC5mb3JFYWNoKHQ9PnJhdGlvcyh0LHJlZmVyZW5jZSkpO2xldCB2YWxzPXRyZW5kLm1hcCh0PT50W2tdKSxsbz1NYXRoLm1pbigwLC4uLnZhbHMuZmlsdGVyKHY9PnYhPW51bGwpKSxoaT1NYXRoLm1heCguLi52YWxzLmZpbHRlcih2PT52IT1udWxsKSwxKSxyYW5nZT1oaS1sb3x8MTskKCcjbGluZScpLmlubmVySFRNTD1gPHN2ZyB2aWV3Qm94PSIwIDAgNTAwIDIyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFdm9sdWNpw7NuIj48bGluZSB4MT0iMTAiIHkxPSIxODUiIHgyPSI0OTAiIHkyPSIxODUiIHN0cm9rZT0iI2RjZTdlOSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxZDllOGQiIHN0cm9rZS13aWR0aD0iMyIgcG9pbnRzPSIke3RyZW5kLmZpbHRlcih0PT50W2tdIT1udWxsKS5tYXAodD0+YCR7MTArdHJlbmQuaW5kZXhPZih0KS9NYXRoLm1heCgxLHRyZW5kLmxlbmd0aC0xKSo0ODB9LCR7MTgwLSh0W2tdLWxvKS9yYW5nZSoxNTB9YCkuam9pbignICcpfSIvPiR7dHJlbmQubWFwKCh0LGkpPT5gPGNpcmNsZSBjeD0iJHsxMCtpL01hdGgubWF4KDEsdHJlbmQubGVuZ3RoLTEpKjQ4MH0iIGN5PSIke3Rba109PW51bGw/MTg1OjE4MC0odFtrXS1sbykvcmFuZ2UqMTUwfSIgcj0iMyIgZmlsbD0iIzFkOWU4ZCI+PHRpdGxlPiR7ZXNjKHQubmFtZSl9OiAke2ZtdCh0W2tdLGspfTwvdGl0bGU+PC9jaXJjbGU+YCkuam9pbignJyl9PHRleHQgeD0iMTAiIHk9IjIxNCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmRbMF0/Lm5hbWUpfTwvdGV4dD48dGV4dCB4PSI0OTAiIHk9IjIxNCIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzdiOTA5YiI+JHtlc2ModHJlbmQuYXQoLTEpPy5uYW1lKX08L3RleHQ+PHRleHQgeD0iMTAiIHk9IjE0IiBmb250LXNpemU9IjExIiBmaWxsPSIjN2I5MDliIj5Nw6F4LiAke2NvbXBhY3QoaGksayl9PC90ZXh0Pjwvc3ZnPmA7JCgnI3NlYXJjaCcpLm9uaW5wdXQ9ZT0+e3F1ZXJ5PWUudGFyZ2V0LnZhbHVlO3BhZ2U9MDt0YWJsZSgpfTskKCcjcHJldicpLm9uY2xpY2s9KCk9PntwYWdlPU1hdGgubWF4KDAscGFnZS0xKTt0YWJsZSgpfTskKCcjbmV4dCcpLm9uY2xpY2s9KCk9PntpZigocGFnZSsxKSoyMDx2aXNpYmxlUm93cygpLmxlbmd0aClwYWdlKys7dGFibGUoKX07dGFibGUoKX0KZnVuY3Rpb24gdmlzaWJsZVJvd3MoKXtyZXR1cm4gdGFibGVSb3dzLmZpbHRlcihyPT5yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSkuc29ydCgoYSxiKT0+c29ydD09PSduYW1lJz8oZGVzYz8tMToxKSphLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpOihkZXNjPy0xOjEpKigoYVtzb3J0XT8/LUluZmluaXR5KS0oYltzb3J0XT8/LUluZmluaXR5KSkpfQpmdW5jdGlvbiB0YWJsZSgpe2xldCBjb2xzPXRhYj09PSdSYXRpb3MnP1snY2QnLCdzZCcsJ2JldCcsJ3JhdGlvJywncnMnLCdyYiddOlsnd2luJywnY29pbicsJ3dkJywncG8nLCdwb24nLCdiZXQnLCdzcGluJywncmF0aW8nXTtsZXQgYWxsPXZpc2libGVSb3dzKCk7JCgnI3RhYmxlJykuaW5uZXJIVE1MPWA8dGFibGU+PHRoZWFkPjx0cj48dGggZGF0YS1rPSJuYW1lIj4ke2RpbXNbJCgnI2dyb3VwJykudmFsdWVdfSDihpU8L3RoPiR7Y29scy5tYXAoaz0+YDx0aCBkYXRhLWs9IiR7a30iPiR7bWV0cmljc1trXX0g4oaVPC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7YWxsLnNsaWNlKHBhZ2UqMjAscGFnZSoyMCsyMCkubWFwKHI9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD4ke2NvbHMubWFwKGs9PmA8dGQ+JHtbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspP2A8c3BhbiBkYXRhLXJhdGlvLXY2PSIke3Jba10/PycnfSIgY2xhc3M9InBpbGwgJHtyW2tdPDE/J2xvdyc6Jyd9Ij4ke2ZtdChyW2tdLGspfTwvc3Bhbj5gOmZtdChyW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+YDskKCcjY291bnQnKS50ZXh0Q29udGVudD1gJHthbGwubGVuZ3RofSBncnVwb3MgwrcgUMOhZ2luYSAke3BhZ2UrMX0gZGUgJHtNYXRoLm1heCgxLE1hdGguY2VpbChhbGwubGVuZ3RoLzIwKSl9YDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpLmZvckVhY2godGg9PnRoLm9uY2xpY2s9KCk9PntkZXNjPXNvcnQ9PT10aC5kYXRhc2V0Lms/IWRlc2M6dHJ1ZTtzb3J0PXRoLmRhdGFzZXQuazt0YWJsZSgpfSl9CmZ1bmN0aW9uIG1ldGhvZCgpeyQoJyNjb250ZW50JykuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJub3RpY2UiPkFjdHVhbGl6YSBjb24gdW4gRXhjZWwgLnhsc3ggcXVlIGluY2x1eWEgbGEgcGVzdGHDsWEgTWF0cml6IHkgbG9zIG1pc21vcyBlbmNhYmV6YWRvcy4gTGEgY2FyZ2EgcGVybWl0ZSBhY3R1YWxpemFyIGTDrWFzIHJlY2liaWRvcyBvIHJlZW1wbGF6YXIgdG9kbyBlbCBoaXN0w7NyaWNvOyByZXZpc2EgbGEgdmlzdGEgcHJldmlhLiBHdWFyZGEgZWwgRXhjZWwgZW4gc3UgYXBsaWNhY2nDs24gYW50ZXMgZGUgY2FyZ2FybG8gcGFyYSBhY3R1YWxpemFyIGxvcyByZXN1bHRhZG9zIGRlIHN1cyBmw7NybXVsYXMuPC9kaXY+PGRpdiBjbGFzcz0iZm9ybXVsYXMiPiR7W1snV2luIG9wZXJhY2lvbmFsJywnU1VNQShNYXRyaXohUTpRKScsJ1NlIHVzYSBsYSBwcmltZXJhIGNvbHVtbmEgV2luIChRKS4gTGEgc2VndW5kYSwgWCwgY29ycmVzcG9uZGUgYSBvdHJvIHZhbG9yIGRlbCBhcmNoaXZvIHkgbm8gc2UgbWV6Y2xhLiddLFsnUGF5b3V0IHkgTkNDJywnUE8gPSAxIOKIkiBXaW4gLyBDb2luIEluPGJyPlBPIE5DQyA9IDEg4oiSIChXaW4gKyBQcm9tbyBuZXRhKSAvIENvaW4gSW48YnI+RGVzdmlhY2nDs24gPSBQTyDiiJIgUE8gTkNDJywnUmVwbGljYSBsYXMgZsOzcm11bGFzIGRlIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIFByb21vIG5ldGEgPSBQcm9tbyBJbiDiiJIgUHJvbW8gT3V0LiddLFsnQXB1ZXN0YSBwcm9tZWRpbycsJ1NVTUEoQ29pbiBJbikgLyBTVU1BKFNwaW4pJywnU2UgY2FsY3VsYSBzb2JyZSB0b3RhbGVzOyBubyBlcyBlbCBwcm9tZWRpbyBkZSBhcHVlc3RhcyBkZSBjYWRhIGZpbGEuJ10sWydSZW5kaW1pZW50byBkaWFyaW8nLCdDb2luIEluIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+V2luIC8gbcOhcXVpbmFzLWTDrWEgcmVnaXN0cmFkYXM8YnI+U3BpbnMgLyBtw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsJ0NhZGEgY29tYmluYWNpw7NuIMO6bmljYSBkZSBmZWNoYSB5IG3DoXF1aW5hIGN1ZW50YSB1bmEgdmV6LiBObyBzZSBpbXB1dGFuIGTDrWFzIHNpbiByZWdpc3Ryby4nXSxbJ1JhdGlvcyBjb21wYXJhdGl2b3MnLCdSYXRpbyBDSSA9IENJIGRpYXJpbyBkZWwgZ3J1cG8gLyBDSSBkaWFyaW8gZGUgcmVmZXJlbmNpYTxicj5SYXRpbyBTcGlucyA9IFNwaW5zIGRpYXJpb3MgLyBTcGlucyBkaWFyaW9zIGRlIHJlZmVyZW5jaWE8YnI+UmF0aW8gQXB1ZXN0YSA9IEFwdWVzdGEgcHJvbWVkaW8gLyBBcHVlc3RhIGRlIHJlZmVyZW5jaWEnLCdJbnNwaXJhZG8gZW4gUmF0aW8uIFJlZmVyZW5jaWEgY29uZmlndXJhYmxlOiB0b3RhbCBkZWwgcGVyw61vZG8sIHNhbMOzbiBvIHNlbGVjY2nDs24gZmlsdHJhZGEuIEVuIGdydXBvcyBkZSB2YXJpb3Mgc2Fsb25lcyBzZSB1c2Egc3UgY29uanVudG8uIExhIHNlcmllIHRlbXBvcmFsIGRlIHJhdGlvcyB1c2EgbGEgcmVmZXJlbmNpYSBkZWwgcGVyw61vZG8gY29tcGxldG8uJ10sWydGaWx0cm9zIHkgcGVyc2lzdGVuY2lhJywnQmFuY28gPSBCbG9xdWUgwrcgUG96byA9IElELVByb2c8YnI+U2VjdG9yID0gU2VjY2nDs24gwrcgTWFyY2EgPSBGYWJyaWNhbnRlJywnRXN0YXMgZXF1aXZhbGVuY2lhcyBzb24gc3VwdWVzdG9zIHZpc2libGVzLiBMYXMgdmlzdGFzIHkgbGEgbWF0cml6IHNlIGd1YXJkYW4gZW4gR29vZ2xlLiBBbCBhYnJpciBsYSB3ZWIgZGVzZGUgb3RybyBkaXNwb3NpdGl2byBzZSBjYXJnYSBsYSDDumx0aW1hIG1hdHJpeiBndWFyZGFkYS4gUmVjYXJnYSBsYSBww6FnaW5hIHBhcmEgdmVyIGNhbWJpb3MgaGVjaG9zIGVuIG90cmEgc2VzacOzbi4nXSxbJ0NhbGlkYWQgZGUgZGF0b3MnLCdTaW4gZGVub21pbmFkb3Ig4oaSIOKAlDxicj5PY3VwYWNpw7NuID0gcHJvbWVkaW8gZGUgY2VsZGFzIG51bcOpcmljYXMgZGUgJSBPY3VwJywnU2UgaW5jbHV5ZW4gdG9kb3MgbG9zIHJlZ2lzdHJvcyBkZSBNYXRyaXosIHRhbWJpw6luIGFqdXN0ZXMgeSBjYXRlZ29yw61hcyBzaW4gZGF0by4gTm8gc2UgZWxpbWluYW4gZHVwbGljYWRvcyBhdXRvbcOhdGljYW1lbnRlLiBMb3MgaW1wb3J0ZXMgZXN0w6FuIGVuIENMUCwgbm8gZW4gbWlsbG9uZXMgc2Fsdm8gcXVlIHNlIGluZGlxdWUgTS4nXSxbJ0bDs3JtdWxhcyBkZWwgRXhjZWwnLCdTZSBsZWVuIHJlc3VsdGFkb3MgZ3VhcmRhZG9zLCBubyBzZSBlamVjdXRhbiBmw7NybXVsYXMgYXJiaXRyYXJpYXMnLCdTZSByZWN1cGVyYW4gZGVzY3JpcGNpb25lcyBkZXNkZSBKdWVnb3MgY3VhbmRvIGZhbHRhbiByZXN1bHRhZG9zIGRlIGLDunNxdWVkYS4gU2VtYW5hIHNpZ3VlIFdFRUtOVU0oZmVjaGEsMikuIFNpIGZhbHRhbiByZXN1bHRhZG9zIG51bcOpcmljb3MgbmVjZXNhcmlvcywgbGEgY2FyZ2Egc2UgcmVjaGF6YS4nXV0ubWFwKChbaCxmLHBdKT0+YDxkaXYgY2xhc3M9ImNhcmQiPjxoMj4ke2h9PC9oMj48ZGl2IGNsYXNzPSJmb3JtdWxhIj4ke2Z9PC9kaXY+PHA+JHtwfTwvcD48L2Rpdj5gKS5qb2luKCcnKX08L2Rpdj5gfQpmdW5jdGlvbiBycGMobmFtZSwuLi5hcmdzKXtyZXR1cm4gbmV3IFByb21pc2UoKG9rLG5vKT0+Z29vZ2xlLnNjcmlwdC5ydW4ud2l0aFN1Y2Nlc3NIYW5kbGVyKG9rKS53aXRoRmFpbHVyZUhhbmRsZXIobm8pW25hbWVdKC4uLmFyZ3MpKX0KYXN5bmMgZnVuY3Rpb24gY2FjaGVkKCl7cmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgcnBjKCdnZXRNYXRyaXgnKSl9CmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3Qodil7YXdhaXQgcnBjKCdzYXZlTWF0cml4JyxKU09OLnN0cmluZ2lmeSh2KSl9CmxldCBzYXZlZFZpZXdzPVtdOwphc3luYyBmdW5jdGlvbiBzeW5jVmlld3MoKXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkoc2F2ZWRWaWV3cykpfQokKCcjbmF2JykuaW5uZXJIVE1MPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXS5tYXAoKHQsaSk9PmA8YnV0dG9uIGNsYXNzPSIke2k/Jyc6J2FjdGl2ZSd9Ij4ke1sn4perJywn4pakJywn4oaXJywn4peOJywn4pOYJ11baV19ICZuYnNwOyAke3R9PC9idXR0b24+YCkuam9pbignJyk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goYj0+Yi5vbmNsaWNrPSgpPT57dGFiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KC9ccysvKS5hdCgtMSk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbicpLmZvckVhY2goZT0+ZS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLGU9PT1iKSk7aWYodGFiPT09J1JhdGlvcycpJCgnI21ldHJpYycpLnZhbHVlPSdyYXRpbyc7cGFnZT0wO3JlbmRlcigpfSk7JCgnI2dyb3VwJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKGRpbXMpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpOyQoJyNncm91cCcpLnZhbHVlPScyJzskKCcjbWV0cmljJykuaW5uZXJIVE1MPU9iamVjdC5lbnRyaWVzKG1ldHJpY3MpLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpO1snZ3JvdXAnLCdtZXRyaWMnLCdncmFpbicsJ3JlZicsJ2Zyb20nLCd0byddLmZvckVhY2goaWQ9PiQoJyMnK2lkKS5vbmNoYW5nZT0oKT0+e3BhZ2U9MDtyZW5kZXIoKX0pOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9PntxdWVyeT0nJztwYWdlPTA7aW5pdCgpfTsKZnVuY3Rpb24gbG9hZFZpZXdzKCl7bGV0IHY9c2F2ZWRWaWV3czskKCcjdmlld3MnKS5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+TWlzIHZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3YubWFwKCh4LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2MoeC5uYW1lKX08L29wdGlvbj5gKS5qb2luKCcnKX0kKCcjc2F2ZScpLm9uY2xpY2s9KCk9PntsZXQgbmFtZT1wcm9tcHQoJ05vbWJyZSBkZSBsYSB2aXN0YScpO2lmKCFuYW1lKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzO3YucHVzaCh7bmFtZSxzZWw6c2VsZWN0ZWQoKSxzZXR0aW5nczpPYmplY3QuZnJvbUVudHJpZXMoWydmcm9tJywndG8nLCdncm91cCcsJ21ldHJpYycsJ2dyYWluJywncmVmJ10ubWFwKGs9PltrLCQoJyMnK2spLnZhbHVlXSkpfSk7c2F2ZWRWaWV3cz12O3N5bmNWaWV3cygpLnRoZW4obG9hZFZpZXdzKS5jYXRjaChlPT5hbGVydCgnTm8gc2UgZ3VhcmTDsyBsYSB2aXN0YTogJytlLm1lc3NhZ2UpKX07JCgnI3ZpZXdzJykub25jaGFuZ2U9KCk9PntpZigkKCcjdmlld3MnKS52YWx1ZT09PScnKXJldHVybjtsZXQgdj1zYXZlZFZpZXdzWyQoJyN2aWV3cycpLnZhbHVlXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmlsdGVycyBvcHRpb24nKS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9ZmFsc2UpO3Yuc2VsLmZvckVhY2goKFtrLHZhbHNdKT0+Wy4uLiQoJyNmJytrKS5vcHRpb25zXS5mb3JFYWNoKG89Pm8uc2VsZWN0ZWQ9dmFscy5pbmNsdWRlcyhvLnZhbHVlKSkpO09iamVjdC5lbnRyaWVzKHYuc2V0dGluZ3MpLmZvckVhY2goKFtrLHZdKT0+JCgnIycraykudmFsdWU9dik7cGFnZT0wO3JlbmRlcigpfTskKCcjZXhwb3J0Jykub25jbGljaz0oKT0+e2xldCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdwbycsJ3BvbicsJ2JldCcsJ3NwaW4nLCdyYXRpbycsJ3JzJywncmInXSxjc3Y9J1x1ZmVmZicrW1tkaW1zWyQoJyNncm91cCcpLnZhbHVlXSwuLi5rZXlzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4udmlzaWJsZVJvd3MoKS5tYXAocj0+W3IubmFtZSwuLi5rZXlzLm1hcChrPT5yW2tdPz8nJyldKV0ubWFwKHJvdz0+cm93Lm1hcCh2PT4nIicrU3RyaW5nKHYpLnJlcGxhY2UoLyIvZywnIiInKSsnIicpLmpvaW4oJzsnKSkuam9pbignXHJcbicpO2xldCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbY3N2XSx7dHlwZTondGV4dC9jc3Y7Y2hhcnNldD11dGYtOCd9KSk7YS5kb3dubG9hZD0nY29uc3VsdGEtbWFxdWluYXMuY3N2JzthLmNsaWNrKCk7c2V0VGltZW91dCgoKT0+VVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpLDEwMDApfTsKLy8gTWluaW1hbCBaSVAvWE1MIHJlYWRlcjogWExTWCBpcyBhIFpJUCBvZiBYTUwgZG9jdW1lbnRzLiBObyBleHRlcm5hbCBzY3JpcHRzLgphc3luYyBmdW5jdGlvbiByZWFkWGxzeChmaWxlKXtsZXQgYnVmPWF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtpZihidWYuYnl0ZUxlbmd0aDwyMil0aHJvdyBFcnJvcignQXJjaGl2byBYTFNYIG5vIHbDoWxpZG8nKTtsZXQgdmlldz1uZXcgRGF0YVZpZXcoYnVmKSx1PW5ldyBVaW50OEFycmF5KGJ1ZiksZW5kPXUubGVuZ3RoLTIyO3doaWxlKGVuZD49TWF0aC5tYXgoMCx1Lmxlbmd0aC02NTU1NykmJnZpZXcuZ2V0VWludDMyKGVuZCx0cnVlKSE9PTB4MDYwNTRiNTApZW5kLS07aWYoZW5kPE1hdGgubWF4KDAsdS5sZW5ndGgtNjU1NTcpKXRocm93IEVycm9yKCdBcmNoaXZvIFhMU1ggbm8gdsOhbGlkbycpO2xldCBwb3M9dmlldy5nZXRVaW50MzIoZW5kKzE2LHRydWUpLGNvdW50PXZpZXcuZ2V0VWludDE2KGVuZCsxMCx0cnVlKSxlbnRyaWVzPXt9O2ZvcihsZXQgaT0wO2k8Y291bnQ7aSsrKXtpZih2aWV3LmdldFVpbnQzMihwb3MsdHJ1ZSkhPT0weDAyMDE0YjUwKXRocm93IEVycm9yKCdEaXJlY3RvcmlvIFpJUCBpbnbDoWxpZG8nKTtsZXQgbWV0aG9kPXZpZXcuZ2V0VWludDE2KHBvcysxMCx0cnVlKSxzaXplPXZpZXcuZ2V0VWludDMyKHBvcysyMCx0cnVlKSxubD12aWV3LmdldFVpbnQxNihwb3MrMjgsdHJ1ZSksZWw9dmlldy5nZXRVaW50MTYocG9zKzMwLHRydWUpLGNsPXZpZXcuZ2V0VWludDE2KHBvcyszMix0cnVlKSxvZmZzZXQ9dmlldy5nZXRVaW50MzIocG9zKzQyLHRydWUpLG5hbWU9bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHUuc2xpY2UocG9zKzQ2LHBvcys0NitubCkpO2VudHJpZXNbbmFtZV09e21ldGhvZCxzaXplLG9mZnNldH07cG9zKz00NitubCtlbCtjbH1hc3luYyBmdW5jdGlvbiB4bWwobmFtZSl7bGV0IGU9ZW50cmllc1tuYW1lXTtpZighZSlyZXR1cm4gbnVsbDtsZXQgb2ZmPWUub2Zmc2V0KzMwK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI2LHRydWUpK3ZpZXcuZ2V0VWludDE2KGUub2Zmc2V0KzI4LHRydWUpLGJ5dGVzPXUuc2xpY2Uob2ZmLG9mZitlLnNpemUpO2xldCB0ZXh0PWUubWV0aG9kPT09MD9uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpOmUubWV0aG9kPT09OD9hd2FpdCBuZXcgUmVzcG9uc2UobmV3IEJsb2IoW2J5dGVzXSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUtcmF3JykpKS50ZXh0KCk6bnVsbDtpZih0ZXh0PT1udWxsKXRocm93IEVycm9yKCdDb21wcmVzacOzbiBubyBjb21wYXRpYmxlJyk7cmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwnYXBwbGljYXRpb24veG1sJyl9CmxldCBzaGFyZWQ9YXdhaXQgeG1sKCd4bC9zaGFyZWRTdHJpbmdzLnhtbCcpLHN0cmluZ3M9c2hhcmVkP1suLi5zaGFyZWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NpJyldLm1hcChuPT5bLi4ubi5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJykpOltdO3NoYXJlZD1udWxsO2xldCB3b3JrYm9vaz1hd2FpdCB4bWwoJ3hsL3dvcmtib29rLnhtbCcpLHJlbHM9YXdhaXQgeG1sKCd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycpLHRhcmdldHM9e307Wy4uLnJlbHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1JlbGF0aW9uc2hpcCcpXS5mb3JFYWNoKHI9PnRhcmdldHNbci5nZXRBdHRyaWJ1dGUoJ0lkJyldPXIuZ2V0QXR0cmlidXRlKCdUYXJnZXQnKSk7YXN5bmMgZnVuY3Rpb24gc2hlZXQobmFtZSl7bGV0IHM9Wy4uLndvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzaGVldCcpXS5maW5kKHM9PnMuZ2V0QXR0cmlidXRlKCduYW1lJykudHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1uYW1lLnRvTG93ZXJDYXNlKCkpO2lmKCFzKXJldHVybiBudWxsO2xldCBwYXRoPXRhcmdldHNbcy5nZXRBdHRyaWJ1dGUoJ3I6aWQnKV07cGF0aD1wYXRoLnN0YXJ0c1dpdGgoJy8nKT9wYXRoLnNsaWNlKDEpOid4bC8nK3BhdGg7bGV0IGRvYz1hd2FpdCB4bWwocGF0aCk7cmV0dXJuIFsuLi5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3JvdycpXS5tYXAocm93PT57bGV0IGE9W107Zm9yKGxldCBjIG9mIHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYycpKXtsZXQgY29sPWMuZ2V0QXR0cmlidXRlKCdyJykubWF0Y2goL1tBLVpdKy8pWzBdLGlkeD0wO2ZvcihsZXQgY2ggb2YgY29sKWlkeD1pZHgqMjYrY2guY2hhckNvZGVBdCgwKS02NDtsZXQgdj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2JylbMF0/LnRleHRDb250ZW50LHQ9Yy5nZXRBdHRyaWJ1dGUoJ3QnKTthW2lkeC0xXT10PT09J3MnP3N0cmluZ3NbK3ZdOnQ9PT0naW5saW5lU3RyJz9bLi4uYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndCcpXS5tYXAodD0+dC50ZXh0Q29udGVudCkuam9pbignJyk6dD09PSdlJz92OnY9PW51bGw/bnVsbDp0PT09J3N0cic/djpOdW1iZXIodil9cmV0dXJuIGF9KX1yZXR1cm4gbm9ybWFsaXplV29ya2Jvb2soYXdhaXQgc2hlZXQoJ01hdHJpeicpLGF3YWl0IHNoZWV0KCdKdWVnb3MnKSxmaWxlLm5hbWUsWycxJywndHJ1ZSddLmluY2x1ZGVzKHdvcmtib29rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd3b3JrYm9va1ByJylbMF0/LmdldEF0dHJpYnV0ZSgnZGF0ZTE5MDQnKSksYXdhaXQgc2hlZXQoJ1VUSUxJREFEIFJFU1VNRU4nKSk7fQokKCcjZmlsZScpLm9uY2hhbmdlPWFzeW5jIGU9PntsZXQgZj1lLnRhcmdldC5maWxlc1swXTtpZighZilyZXR1cm47JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdMZXllbmRvICcrZi5uYW1lKyfigKYnO3RyeXtsZXQgbmV4dD1hd2FpdCByZWFkWGxzeChmKTthd2FpdCBwZXJzaXN0KG5leHQpO2RhdGE9bmV4dDtwYWdlPTA7cXVlcnk9Jyc7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9JyDCtyBHdWFyZGFkYSBlbiBTdXBhYmFzZSDCtyBEaXNwb25pYmxlIGVuIHR1cyBkaXNwb3NpdGl2b3MnfWNhdGNoKGVycil7JCgnI3N0YXR1cycpLnRleHRDb250ZW50PSdObyBzZSBjYW1iacOzIGxhIG1hdHJpejogJytlcnIubWVzc2FnZX1maW5hbGx5e2UudGFyZ2V0LnZhbHVlPScnfX07Ci8vIFYyOiBpbmRlcGVuZGVudCBhbmFseXRpY2FsIHZpZXdzIGFuZCBjb21wYXJpc29uIHBlcmlvZHMuCmNvbnN0IHZpZXdTdGF0ZT17CiAgQTp7bmFtZTonU2VsZWNjacOzbiBBJyxmcm9tOicnLHRvOicnLGZpbHRlcnM6e319LAogIEI6e25hbWU6J1NlbGVjY2nDs24gQicsZnJvbTonJyx0bzonJyxmaWx0ZXJzOnt9fSwKICBldm9sdXRpb246e2ZpbHRlcnM6e30sbWV0cmljOid3aW4nLGdyYWluOidtb250aCcsc2VyaWVzOid0b3RhbCd9LAogIHJhdGlvczp7ZmlsdGVyczp7fSxncm91cDonMScsbWV0cmljOidyYXRpbycscmVmZXJlbmNlOidhbGwnfQp9OwpsZXQgZXhwb3J0Um93cz1bXTsKY29uc3QgaXNFeHBpcmVkPXY9PlN0cmluZyh2Pz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpPT09J0VYUElSQURPUyc7CmxldCBvcHRpb25zRm9yPWs9PlsuLi5uZXcgU2V0KGRhdGEucm93cy5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKTsKY29uc3QgZGF0ZVJhbmdlPSgpPT57Y29uc3QgZGF0ZXM9ZGF0YS5yb3dzLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuW2RhdGVzWzBdLGRhdGVzLmF0KC0xKV19OwpmdW5jdGlvbiBzbGljZVJvd3MoZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+KCFmcm9tfHxyWzBdPj1mcm9tKSYmKCF0b3x8clswXTw9dG8pJiZPYmplY3QuZW50cmllcyhmaWx0ZXJzKS5ldmVyeSgoW2ssdmFsc10pPT4hdmFscy5sZW5ndGh8fHZhbHMuaW5jbHVkZXMoU3RyaW5nKHJba10/PydTaW4gZGF0bycpKSkpOwp9CmZ1bmN0aW9uIGZpbHRlckZpZWxkcyhzdGF0ZSxwcmVmaXgsa2V5cz1PYmplY3Qua2V5cyhkaW1zKSl7CiByZXR1cm4ga2V5cy5tYXAoaz0+YDxsYWJlbD4ke2RpbXNba119PHNlbGVjdCBtdWx0aXBsZSBkYXRhLWZpbHRlcj0iJHtrfSIgZGF0YS1vd25lcj0iJHtwcmVmaXh9Ij4ke29wdGlvbnNGb3IoaykubWFwKHY9PmA8b3B0aW9uIHZhbHVlPSIke2VzYyh2KX0iICR7KHN0YXRlLmZpbHRlcnNba118fFtdKS5pbmNsdWRlcyh2KT8nc2VsZWN0ZWQnOicnfT4ke2VzYyh2KX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIHNlbGVjdG9yKGxhYmVsLGlkLHZhbHVlLG9wdGlvbnMpe3JldHVybiBgPGxhYmVsPiR7bGFiZWx9PHNlbGVjdCBpZD0iJHtpZH0iPiR7T2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChbayx2XSk9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke1N0cmluZyh2YWx1ZSk9PT1TdHJpbmcoayk/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+YH0KZnVuY3Rpb24gYmluZEZpbHRlcnMoKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXJdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pnt2aWV3U3RhdGVbZWwuZGF0YXNldC5vd25lcl0uZmlsdGVyc1tlbC5kYXRhc2V0LmZpbHRlcl09Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGJhbm5lcih0aXRsZSxkZXNjcmlwdGlvbil7cmV0dXJuIGA8ZGl2IGNsYXNzPSJ2aWV3YmFubmVyIj48aDI+JHt0aXRsZX08L2gyPjxwPiR7ZGVzY3JpcHRpb259PC9wPjwvZGl2PmB9CmZ1bmN0aW9uIG1hY2hpbmVDb3VudChyb3dzKXtyZXR1cm4gbmV3IFNldChyb3dzLmZpbHRlcihyPT5yWzFdIT1udWxsJiYhaXNFeHBpcmVkKHJbMV0pKS5tYXAocj0+clsxXSkpLnNpemV9CmZ1bmN0aW9uIHN0YXRDYXJkcyhpdGVtcyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJrcGlzIj4ke2l0ZW1zLm1hcCgoW2xhYmVsLHZhbHVlLG5vdGVdKT0+YDxkaXYgY2xhc3M9ImNhcmQga3BpIj48c21hbGw+JHtsYWJlbH08L3NtYWxsPjxzdHJvbmc+JHt2YWx1ZX08L3N0cm9uZz48c3Bhbj4ke25vdGV9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfTwvZGl2PmB9CmZ1bmN0aW9uIGJhcnNWMihpdGVtcyxrZXksY29sb3I9J3ZhcigtLXRlYWwpJyl7CiBsZXQgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHg9Pk1hdGguYWJzKHhba2V5XXx8MCkpKTsKIHJldHVybiBpdGVtcy5tYXAoeD0+YDxkaXYgY2xhc3M9ImJhcnJvdyI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIiB0aXRsZT0iJHtlc2MoeC5uYW1lKX0iPiR7ZXNjKHgubmFtZSl9PC9zcGFuPjxkaXYgY2xhc3M9InRyYWNrIj48ZGl2IGNsYXNzPSJiYXIiIHN0eWxlPSJiYWNrZ3JvdW5kOiR7eFtrZXldPDA/JyNiODZkNjInOmNvbG9yfTt3aWR0aDoke01hdGguYWJzKHhba2V5XXx8MCkvbWF4KjEwMH0lIj48L2Rpdj48L2Rpdj48Yj4ke2NvbXBhY3QoeFtrZXldLGtleSl9PC9iPjwvZGl2PmApLmpvaW4oJycpOwp9CmZ1bmN0aW9uIGNoYXJ0VjIoc2VyaWVzLGtleSl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgdmFsdWVzPXNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5wW2tleV0pKS5maWx0ZXIodj0+diE9bnVsbCYmTnVtYmVyLmlzRmluaXRlKHYpKTsKIGNvbnN0IGxvPU1hdGgubWluKDAsLi4udmFsdWVzKSxoaT1NYXRoLm1heCgxLC4uLnZhbHVlcyksc3Bhbj1oaS1sb3x8MTsKIGNvbnN0IGNvbG9ycz1bJyMxMjhmOTEnLCcjMTgzYjYwJywnIzVkODNhMicsJyM3NWE4OTgnLCcjOTQ3ZDU1JywnIzU0NmM4NycsJyM5NDdjOWUnLCcjYjA2YTYzJ107CiBjb25zdCB4PWk9PjM1K2kvTWF0aC5tYXgoMSxsYWJlbHMubGVuZ3RoLTEpKjUzMCx5PXY9PjE5MC0odi1sbykvc3BhbioxNTA7CiByZXR1cm4gYDxzdmcgdmlld0JveD0iMCAwIDYwMCAyMzUiIGFyaWEtbGFiZWw9IlNlcmllIHRlbXBvcmFsIiByb2xlPSJpbWciPjxsaW5lIHgxPSIzNSIgeTE9IjE5MCIgeDI9IjU2NSIgeTI9IjE5MCIgc3Ryb2tlPSIjZDllM2ViIi8+PHRleHQgeD0iMzUiIHk9IjIwIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNzE4Njk0Ij4ke2NvbXBhY3QoaGksa2V5KX08L3RleHQ+JHtzZXJpZXMubWFwKChzLGkpPT57bGV0IHBvaW50cz1zLnBvaW50cy5maWx0ZXIocD0+cFtrZXldIT1udWxsKTtyZXR1cm4gYDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3JzW2klOF19IiBzdHJva2Utd2lkdGg9IjIuNSIgcG9pbnRzPSIke3BvaW50cy5tYXAocD0+YCR7eChsYWJlbHMuaW5kZXhPZihwLm5hbWUpKX0sJHt5KHBba2V5XSl9YCkuam9pbignICcpfSIvPiR7cG9pbnRzLm1hcChwPT5gPGNpcmNsZSBjeD0iJHt4KGxhYmVscy5pbmRleE9mKHAubmFtZSkpfSIgY3k9IiR7eShwW2tleV0pfSIgcj0iMyIgZmlsbD0iJHtjb2xvcnNbaSU4XX0iPjx0aXRsZT4ke2VzYyhzLm5hbWUpfSDCtyAke2VzYyhwLm5hbWUpfTogJHtmbXQocFtrZXldLGtleSl9PC90aXRsZT48L2NpcmNsZT5gKS5qb2luKCcnKX1gfSkuam9pbignJyl9PHRleHQgeD0iMzUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2MobGFiZWxzWzBdKX08L3RleHQ+PHRleHQgeD0iNTY1IiB5PSIyMjAiIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiM3MTg2OTQiPiR7ZXNjKGxhYmVscy5hdCgtMSkpfTwvdGV4dD48L3N2Zz48ZGl2IGNsYXNzPSJsZWdlbmQiPiR7c2VyaWVzLm1hcCgocyxpKT0+YDxzcGFuPjxpIHN0eWxlPSJiYWNrZ3JvdW5kOiR7Y29sb3JzW2klOF19Ij48L2k+JHtlc2Mocy5uYW1lKX08L3NwYW4+YCkuam9pbignJyl9PC9kaXY+YDsKfQpmdW5jdGlvbiBzdW1tYXJ5VmlldygpewogY29uc3Qgcm93cz1zbGljZVJvd3MoKSxhPWFnZyhyb3dzKTsKIGNvbnN0IGJyYW5kcz1ncm91cHMocm93cyxyPT5TdHJpbmcoclsyXT8/J1NpbiBkYXRvJykpLnNvcnQoKHgseSk9Pnkud2luLXgud2luKTsKIGNvbnN0IHNlY3RvcnM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbNV0/PydTaW4gZGF0bycpKS5zb3J0KCh4LHkpPT55LmNvaW4teC5jb2luKTsKIGNvbnN0IG1vbnRobHk9Z3JvdXBzKHJvd3Mscj0+clswXS5zbGljZSgwLDcpKS5zb3J0KCh4LHkpPT54Lm5hbWUubG9jYWxlQ29tcGFyZSh5Lm5hbWUpKTsKIGV4cG9ydFJvd3M9W1snTWFyY2EnLCdXaW4gQ0xQJywnQ29pbiBJbiBDTFAnLCdNw6FxdWluYXMnXSwuLi5icmFuZHMubWFwKHg9Plt4Lm5hbWUseC53aW4seC5jb2luLG1hY2hpbmVDb3VudCh4LnJvd3MpXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdWaXNpw7NuIGdlbmVyYWwgZGVsIHBhcnF1ZScsJ1RvZG8gZWwgcGFycXVlIGRlbnRybyBkZSBsYXMgZmVjaGFzIHNlbGVjY2lvbmFkYXMuIEVzdGEgdmlzdGEgbm8gYXBsaWNhIGZpbHRyb3MgZGUgbcOhcXVpbmFzLCBiYW5jb3Mgbmkgc2VjdG9yZXMuJykrc3RhdENhcmRzKFsKIFsnV0lOIE9QRVJBQ0lPTkFMJyxjb21wYWN0KGEud2luLCd3aW4nKSwnQ0xQIMK3IFRvdGFsIGRlbCBwYXJxdWUnXSxbJ0NPSU4gSU4nLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCDCtyBUb3RhbCBhcG9zdGFkbyddLFsnTcOBUVVJTkFTJyxmbXQobWFjaGluZUNvdW50KHJvd3MpKSwnSWRlbnRpZmljYWRvcmVzIMO6bmljb3MgZW4gZWwgcGVyw61vZG8nXSxbJ1BBWU9VVCcsZm10KGEucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSBsb3MgdG90YWxlcyddCiBdKStgPGRpdiBjbGFzcz0iY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RXZvbHVjacOzbiBtZW5zdWFsIGRlbCBXaW48L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5QYW5vcmFtYSBnZW5lcmFsIMK3IENMUDwvZGl2PiR7Y2hhcnRWMihbe25hbWU6J1RvZG8gZWwgcGFycXVlJyxwb2ludHM6bW9udGhseX1dLCd3aW4nKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+V2luIHBvciBtYXJjYTwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPlRvcCA4IMK3IENMUDwvZGl2PiR7YmFyc1YyKGJyYW5kcy5zbGljZSgwLDgpLCd3aW4nKX08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjaGFydHMiPjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5BY3RpdmlkYWQgcG9yIHNlY3RvcjwvaDI+PGRpdiBjbGFzcz0ic3VidGl0bGUiPkNvaW4gSW4gwrcgVG9wIDg8L2Rpdj4ke2JhcnNWMihzZWN0b3JzLnNsaWNlKDAsOCksJ2NvaW4nLCd2YXIoLS1uYXZ5KScpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5JbmRpY2Fkb3JlcyBkZWwgcGVyw61vZG88L2gyPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0Ym9keT4ke1tbJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsZm10KGEud2QpXSxbJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGZtdChhLmNkKV0sWydBcHVlc3RhIHByb21lZGlvJyxmbXQoYS5iZXQpXSxbJ1NwaW5zJyxmbXQoYS5zcGluKV0sWydNw6FxdWluYXMtZMOtYSByZWdpc3RyYWRhcycsZm10KGEuZGF5cyldLFsnUHJvbW8gbmV0YScsZm10KGEucHJvbW8pXSxbJ1ByZW1pb3MnLGZtdChhLnByaXplKV1dLm1hcCgoW2ssdl0pPT5gPHRyPjx0ZD4ke2t9PC90ZD48dGQ+JHt2fTwvdGQ+PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PC9kaXY+YDsKfQpmdW5jdGlvbiBjb21wYXJlUGFuZWwoa2V5KXtjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQgY29tcGFyZXBhbmVsIHNpZGUke2tleX0iPjxkaXYgY2xhc3M9InNpZGVoZWFkaW5nIj48Yj4ke2tleX08L2I+PGlucHV0IGlkPSJuYW1lJHtrZXl9IiBhcmlhLWxhYmVsPSJOb21icmUgZGUgc2VsZWNjacOzbiAke2tleX0iIHZhbHVlPSIke2VzYyhzLm5hbWUpfSI+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZURhdGVzIj48bGFiZWw+RGVzZGU8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImZyb20ke2tleX0iIHZhbHVlPSIke3MuZnJvbX0iPjwvbGFiZWw+PGxhYmVsPkhhc3RhPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJ0byR7a2V5fSIgdmFsdWU9IiR7cy50b30iPjwvbGFiZWw+PC9kaXY+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocyxrZXkpfTwvZGl2PjxidXR0b24gaWQ9ImNsZWFyJHtrZXl9IiBjbGFzcz0ic3VidGxlIj5MaW1waWFyIGZpbHRyb3MgJHtrZXl9PC9idXR0b24+PC9zZWN0aW9uPmB9CmZ1bmN0aW9uIGRlbHRhKGEsYixrZXkpe2lmKGE9PW51bGx8fGI9PW51bGwpcmV0dXJuICfigJQnO2xldCBkPWItYTtpZihbJ3BvJywncG9uJywnb2NjJywnZGV2J10uaW5jbHVkZXMoa2V5KSlyZXR1cm4gKGQqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn0pKycgcHAnO3JldHVybiAoZD4wPycrJzonJykrZm10KGQsa2V5KX0KZnVuY3Rpb24gY29tcGFyZVZpZXcoKXsKIGxldCBbbWluLG1heF09ZGF0ZVJhbmdlKCk7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tfHw9bWluO3ZpZXdTdGF0ZVtrZXldLnRvfHw9bWF4fQogY29uc3QgQT12aWV3U3RhdGUuQSxCPXZpZXdTdGF0ZS5CLHJhPXNsaWNlUm93cyhBLmZpbHRlcnMsQS5mcm9tLEEudG8pLHJiPXNsaWNlUm93cyhCLmZpbHRlcnMsQi5mcm9tLEIudG8pLGE9YWdnKHJhKSxiPWFnZyhyYik7CiBjb25zdCBrZXlzPVsnd2luJywnY29pbicsJ3dkJywnY2QnLCdzcGluJywnc2QnLCdiZXQnLCdwbycsJ3BvbicsJ3Byb21vJywncHJpemUnLCdvY2MnXTsKIGNvbnN0IGJSZWNvcmRzPW5ldyBTZXQocmIpO2NvbnN0IG92ZXJsYXA9cmEuZmlsdGVyKHI9PmJSZWNvcmRzLmhhcyhyKSkubGVuZ3RoOwogZXhwb3J0Um93cz1bWydJbmRpY2Fkb3InLEEubmFtZSxCLm5hbWUsJ0RpZmVyZW5jaWEgQiAtIEEnLCdWYXJpYWNpw7NuICUnXSwuLi5rZXlzLm1hcChrPT5bbWV0cmljc1trXSxhW2tdPz8nJyxiW2tdPz8nJyxhW2tdPT1udWxsfHxiW2tdPT1udWxsPycnOmJba10tYVtrXSxhW2tdPygoYltrXS1hW2tdKS9NYXRoLmFicyhhW2tdKSkqMTAwOicnXSldOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdEb3Mgc2VsZWNjaW9uZXMsIGRvcyBwZXLDrW9kb3MnLCdDb21wYXJhIGVsIG1pc21vIGJhbmNvIGFudGVzIHkgZGVzcHXDqXMsIGRvcyB1YmljYWNpb25lcywgbcOhcXVpbmFzIG8gZ3J1cG9zLiBBIHkgQiB0aWVuZW4gZmVjaGFzIHkgZmlsdHJvcyBpbmRlcGVuZGllbnRlcy4nKStgPGRpdiBjbGFzcz0iY29tcGFyZXRvb2xzIj48YnV0dG9uIGlkPSJjb3B5QUIiPkNvcGlhciBmaWx0cm9zIHkgZmVjaGFzIEEg4oaSIEI8L2J1dHRvbj48YnV0dG9uIGlkPSJzd2FwQUIiPkludGVyY2FtYmlhciBBIOKGlCBCPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFyZWdyaWQiPiR7Y29tcGFyZVBhbmVsKCdBJyl9JHtjb21wYXJlUGFuZWwoJ0InKX08L2Rpdj48ZGl2IGNsYXNzPSJjb21wYXJpc29uTm90ZSI+QTogJHtmbXQocmEubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJhKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGEuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiAmbmJzcDsgQjogJHtmbXQocmIubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7bWFjaGluZUNvdW50KHJiKX0gbcOhcXVpbmFzIMK3ICR7Zm10KGIuZGF5cyl9IG3DoXF1aW5hcy1kw61hLiR7b3ZlcmxhcD9gIEhheSAke2ZtdChvdmVybGFwKX0gcmVnaXN0cm9zIGNvbXBhcnRpZG9zIGVudHJlIGxhcyBzZWxlY2Npb25lcy5gOicnfSBMYXMgZGlmZXJlbmNpYXMgc2UgZXhwcmVzYW4gY29tbyBCIOKIkiBBLiBQYXJhIHBlcsOtb2RvcyBkZSBkaXN0aW50YSBkdXJhY2nDs24sIGNvbXBhcmEgbG9zIGluZGljYWRvcmVzIGRpYXJpb3MuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPiR7ZXNjKEEubmFtZSl9IGZyZW50ZSBhICR7ZXNjKEIubmFtZSl9PC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5JbmRpY2Fkb3I8L3RoPjx0aCBjbGFzcz0iY29sQSI+JHtlc2MoQS5uYW1lKX08YnI+JHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KCdBJykpfTwvdGg+PHRoIGNsYXNzPSJjb2xCIj4ke2VzYyhCLm5hbWUpfTxicj4ke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0InKSl9PC90aD48dGg+RGlmZXJlbmNpYSBCIOKIkiBBPC90aD48dGg+VmFyaWFjacOzbiByZWxhdGl2YTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4ke2tleXMubWFwKGs9PmA8dHI+PHRkPiR7bWV0cmljc1trXX08L3RkPjx0ZD4ke2ZtdChhW2tdLGspfTwvdGQ+PHRkPiR7Zm10KGJba10sayl9PC90ZD48dGQ+JHtkZWx0YShhW2tdLGJba10sayl9PC90ZD48dGQ+JHthW2tdPT1udWxsfHxiW2tdPT1udWxsfHxhW2tdPT09MD8n4oCUJzooKGJba10tYVtrXSkvTWF0aC5hYnMoYVtrXSkqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pKyclJ308L3RkPjwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQga2V5IG9mIFsnQScsJ0InXSl7CiAgZm9yKGxldCBmaWVsZCBvZiBbJ2Zyb20nLCd0bycsJ25hbWUnXSkkKCcjJytmaWVsZCtrZXkpLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGVba2V5XVtmaWVsZF09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9OwogICQoJyNjbGVhcicra2V5KS5vbmNsaWNrPSgpPT57dmlld1N0YXRlW2tleV0uZmlsdGVycz17fTtyZW5kZXIoKX07CiB9CiAkKCcjY29weUFCJykub25jbGljaz0oKT0+e3ZpZXdTdGF0ZS5CPXsuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5BKSksbmFtZTp2aWV3U3RhdGUuQi5uYW1lfTtyZW5kZXIoKX07CiAkKCcjc3dhcEFCJykub25jbGljaz0oKT0+e1t2aWV3U3RhdGUuQSx2aWV3U3RhdGUuQl09W3ZpZXdTdGF0ZS5CLHZpZXdTdGF0ZS5BXTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcGVyaW9kS2V5KHIsZ3JhaW4pe3JldHVybiBncmFpbj09PSdtb250aCc/clswXS5zbGljZSgwLDcpOmdyYWluPT09J3dlZWsnP3JbMF0uc2xpY2UoMCw0KSsnIMK3IFMnK1N0cmluZyhyWzMwXSkucGFkU3RhcnQoMiwnMCcpOnJbMF19CmZ1bmN0aW9uIGV2b2x1dGlvblZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV2b2x1dGlvbixyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGs9cy5tZXRyaWM7CiBjb25zdCBieT1zLnNlcmllcz09PSd0b3RhbCc/W3tuYW1lOidTZWxlY2Npw7NuIGNvbXBsZXRhJyxyb3dzLC4uLmFnZyhyb3dzKX1dOmdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3Muc2VyaWVzXT8/J1NpbiBkYXRvJykpLnNvcnQoKGEsYik9PmIuY29pbi1hLmNvaW4pLnNsaWNlKDAsOCk7CiBjb25zdCBzZXJpZXM9YnkubWFwKGc9Pih7bmFtZTpnLm5hbWUscG9pbnRzOmdyb3VwcyhnLnJvd3Mscj0+cGVyaW9kS2V5KHIscy5ncmFpbikpLnNvcnQoKGEsYik9PmEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpfSkpOwogY29uc3QgYXZhaWxhYmxlPU9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZXRyaWNzKS5maWx0ZXIoKFtrXSk9PiFbJ3JhdGlvJywncnMnLCdyYiddLmluY2x1ZGVzKGspKSk7CiBleHBvcnRSb3dzPVtbJ1NlcmllJywnUGVyw61vZG8nLG1ldHJpY3Nba11dLC4uLnNlcmllcy5mbGF0TWFwKHM9PnMucG9pbnRzLm1hcChwPT5bcy5uYW1lLHAubmFtZSxwW2tdPz8nJ10pKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ0NvbXBvcnRhbWllbnRvIGEgdHJhdsOpcyBkZWwgdGllbXBvJywnU2lndWUgdW5hIG3DoXF1aW5hLCBiYW5jbyBvIHNlY3Rvci4gRWxpZ2UgZWwgaW5kaWNhZG9yLCBsYSBmcmVjdWVuY2lhIHkgbGFzIHNlcmllcyBxdWUgcXVpZXJlcyB2ZXIuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIGV2b2x1dGlvbmZpbHRlcnMiPiR7ZmlsdGVyRmllbGRzKHMsJ2V2b2x1dGlvbicsWzEsMiwzLDksNSw3XSl9PC9kaXY+PGRpdiBjbGFzcz0idmlld2NvbnRyb2xzIj4ke3NlbGVjdG9yKCdJbmRpY2Fkb3InLCdlbWV0cmljJyxrLGF2YWlsYWJsZSl9JHtzZWxlY3RvcignRnJlY3VlbmNpYScsJ2VncmFpbicscy5ncmFpbix7bW9udGg6J01lbnN1YWwnLHdlZWs6J1NlbWFuYWwnLGRheTonRGlhcmlhJ30pfSR7c2VsZWN0b3IoJ1NlcGFyYXIgbMOtbmVhcyBwb3InLCdlc2VyaWVzJyxzLnNlcmllcyx7dG90YWw6J1RvZGEgbGEgc2VsZWNjacOzbicsMTonTcOhcXVpbmEnLDI6J01hcmNhJyw5OidCYW5jbycsNTonU2VjdG9yJ30pfTwvZGl2Pjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJjYXJkIGxhcmdlY2hhcnQiPjxoMj4ke21ldHJpY3Nba119IMK3ICR7c2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKX08L2gyPjxkaXYgY2xhc3M9InN1YnRpdGxlIj5Nw6F4aW1vIDggc2VyaWVzLCBwcmlvcml6YWRhcyBwb3IgQ29pbiBJbi4gUGFzYSBlbCBjdXJzb3IgcG9yIGxvcyBwdW50b3MgcGFyYSB2ZXIgbG9zIHZhbG9yZXMuPC9kaXY+JHtjaGFydFYyKHNlcmllcyxrKX08L2Rpdj5gOwogYmluZEZpbHRlcnMoKTtmb3IobGV0IFtpZCxrZXldb2YgW1snZW1ldHJpYycsJ21ldHJpYyddLFsnZWdyYWluJywnZ3JhaW4nXSxbJ2VzZXJpZXMnLCdzZXJpZXMnXV0pJCgnIycraWQpLm9uY2hhbmdlPWU9PntzW2tleV09ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9Owp9CmZ1bmN0aW9uIHJhdGlvc1ZpZXcoKXsKIGNvbnN0IHM9dmlld1N0YXRlLnJhdGlvcyxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMpLGJhc2U9c2xpY2VSb3dzKCkscmVmZXJlbmNlPWFnZyhzLnJlZmVyZW5jZT09PSdmaWx0ZXJlZCc/cm93czpiYXNlKTsKIGxldCBsaXN0PWdyb3Vwcyhyb3dzLHI9PlN0cmluZyhyW3MuZ3JvdXBdPz8nU2luIGRhdG8nKSk7CiBjb25zdCByZWZzPW5ldyBNYXA7CiBmb3IoY29uc3QgZyBvZiBsaXN0KXtsZXQgcmVmPXJlZmVyZW5jZTtpZihzLnJlZmVyZW5jZT09PSdzYWxvbicpe2xldCBzYWxvbnM9Wy4uLm5ldyBTZXQoZy5yb3dzLm1hcChyPT5yWzddKSldLGtleT1KU09OLnN0cmluZ2lmeShzYWxvbnMuc29ydCgpKTtpZighcmVmcy5oYXMoa2V5KSlyZWZzLnNldChrZXksYWdnKGJhc2UuZmlsdGVyKHI9PnNhbG9ucy5pbmNsdWRlcyhyWzddKSkpKTtyZWY9cmVmcy5nZXQoa2V5KX1yYXRpb3MoZyxyZWYpfQogbGlzdC5zb3J0KChhLGIpPT4oYltzLm1ldHJpY10/Py1JbmZpbml0eSktKGFbcy5tZXRyaWNdPz8tSW5maW5pdHkpKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3NkJywnYmV0JywncmF0aW8nLCdycycsJ3JiJ107CiBleHBvcnRSb3dzPVtbZGltc1tzLmdyb3VwXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAoZz0+W2cubmFtZSwuLi5jb2xzLm1hcChrPT5nW2tdPz8nJyldKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ1JlbmRpbWllbnRvIHJlbGF0aXZvJywnMcOXIGVxdWl2YWxlIGEgbGEgcmVmZXJlbmNpYS4gTcOhcyBkZSAxw5cgc3VwZXJhIGVzZSBuaXZlbDsgbWVub3MgZGUgMcOXIHF1ZWRhIHBvciBkZWJham8uIENvbXBhcmEgYWN0aXZpZGFkIHkgYXB1ZXN0YSwgbm8gcmVudGFiaWxpZGFkIHBvciBzw60gc29sYS4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsJ3JhdGlvcycpfTwvZGl2PjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+JHtzZWxlY3RvcignQWdydXBhciBwb3InLCdyZ3JvdXAnLHMuZ3JvdXAsZGltcyl9JHtzZWxlY3RvcignUmF0aW8gZGVsIHJhbmtpbmcnLCdybWV0cmljJyxzLm1ldHJpYyx7cmF0aW86J0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLHJzOidTcGlucyBwb3IgbcOhcXVpbmEtZMOtYScscmI6J0FwdWVzdGEgcHJvbWVkaW8nfSl9JHtzZWxlY3RvcignUmVmZXJlbmNpYScsJ3JyZWZlcmVuY2UnLHMucmVmZXJlbmNlLHthbGw6J1RvZG8gZWwgcGFycXVlIGVuIGVzdGFzIGZlY2hhcycsc2Fsb246J1NhbMOzbiBkZSBjYWRhIGdydXBvJyxmaWx0ZXJlZDonU2VsZWNjacOzbiBmaWx0cmFkYSd9KX08L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iY2hhcnRzIHJhdGlvY2hhcnRzIj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmFua2luZyDCtyAke21ldHJpY3Nbcy5tZXRyaWNdfTwvaDI+JHtiYXJzVjIobGlzdC5zbGljZSgwLDEwKSxzLm1ldHJpYyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkPDs21vIGxlZXIgZWwgcmVzdWx0YWRvPC9oMj48cD4xLDIww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgc3VwZXJpb3IgYSBsYSByZWZlcmVuY2lhLiAwLDgww5cgcmVwcmVzZW50YSB1biBuaXZlbCAyMCUgaW5mZXJpb3IuPC9wPjxwPkxvcyByYXRpb3MgZGUgQ29pbiBJbiB5IHNwaW5zIHV0aWxpemFuIG3DoXF1aW5hcy1kw61hIHJlZ2lzdHJhZGFzIHBhcmEgbm9ybWFsaXphciBsYSBleHBvc2ljacOzbi4gTGEgYXB1ZXN0YSBzZSBjYWxjdWxhIGNvbW8gQ29pbiBJbiB0b3RhbCAvIHNwaW5zIHRvdGFsZXMuPC9wPjxwPkxhIHJlZmVyZW5jaWEgdXNhIGxhcyBtaXNtYXMgZmVjaGFzLiDCq1RvZG8gZWwgcGFycXVlwrsgbm8gYXBsaWNhIGxvcyBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzOyDCq1NlbGVjY2nDs24gZmlsdHJhZGHCuyBzw60gbG9zIGFwbGljYS48L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkRldGFsbGUgZGUgcmF0aW9zIMK3ICR7bGlzdC5sZW5ndGh9IGdydXBvczwvaDI+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtkaW1zW3MuZ3JvdXBdfTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcChnPT5gPHRyPjx0ZD4ke2VzYyhnLm5hbWUpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7WydyYXRpbycsJ3JzJywncmInXS5pbmNsdWRlcyhrKT9gPHNwYW4gZGF0YS1yYXRpby12Nj0iJHtnW2tdPz8nJ30iIGNsYXNzPSJwaWxsICR7Z1trXTwxPydsb3cnOicnfSI+JHtmbXQoZ1trXSxrKX08L3NwYW4+YDpmbXQoZ1trXSxrKX08L3RkPmApLmpvaW4oJycpfTwvdHI+YCkuam9pbignJyl9PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PmA7CiBiaW5kRmlsdGVycygpO2ZvcihsZXQgW2lkLGtleV1vZiBbWydyZ3JvdXAnLCdncm91cCddLFsncm1ldHJpYycsJ21ldHJpYyddLFsncnJlZmVyZW5jZScsJ3JlZmVyZW5jZSddXSkkKCcjJytpZCkub25jaGFuZ2U9ZT0+e3Nba2V5XT1lLnRhcmdldC52YWx1ZTtyZW5kZXIoKX07Cn0KZnVuY3Rpb24gcmVuZGVyKCl7CiBpZighZGF0YSlyZXR1cm47CiAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PVsnQ29tcGFyYXRpdm9zJywnTWV0b2RvbG9nw61hJ10uaW5jbHVkZXModGFiKT8nbm9uZSc6J2Jsb2NrJzsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjsKICQoJyN0aXRsZScpLnRleHRDb250ZW50PXtSZXN1bWVuOidSZXN1bWVuIGRlbCBwYXJxdWUnLENvbXBhcmF0aXZvczonQ29tcGFyYXIgc2VsZWNjaW9uZXMgeSBwZXLDrW9kb3MnLEV2b2x1Y2nDs246J0V2b2x1Y2nDs24gZGVsIHJlbmRpbWllbnRvJyxSYXRpb3M6J1JhdGlvcyBkZSByZW5kaW1pZW50bycsTWV0b2RvbG9nw61hOidNZXRvZG9sb2fDrWEgeSBjw6FsY3Vsb3MnfVt0YWJdOwogJCgnI3ZpZXdIZWxwJykudGV4dENvbnRlbnQ9dGFiPT09J0NvbXBhcmF0aXZvcyc/J0EgeSBCIHRpZW5lbiBmZWNoYXMgaW5kZXBlbmRpZW50ZXMuJzp0YWI9PT0nUmVzdW1lbic/J0ZlY2hhcyBkZWwgcGFub3JhbWEgZ2VuZXJhbCBkZWwgcGFycXVlLic6J0ZlY2hhcyBkZSBlc3RhIGNvbnN1bHRhLic7CiBpZih0YWI9PT0nUmVzdW1lbicpc3VtbWFyeVZpZXcoKTtlbHNlIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKWNvbXBhcmVWaWV3KCk7ZWxzZSBpZih0YWI9PT0nRXZvbHVjacOzbicpZXZvbHV0aW9uVmlldygpO2Vsc2UgaWYodGFiPT09J1JhdGlvcycpcmF0aW9zVmlldygpO2Vsc2V7bWV0aG9kKCk7JCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCc8ZGl2IGNsYXNzPSJub3RpY2UiPkNvbXBhcmF0aXZvcyBwZXJtaXRlIGZlY2hhcyB5IGZpbHRyb3MgaW5kZXBlbmRpZW50ZXMgcGFyYSBBIHkgQi4gTG9zIGNhbWJpb3MgaGlzdMOzcmljb3MgZGUgdWJpY2FjacOzbiBzb2xvIHNlIHB1ZWRlbiBhbmFsaXphciBzaSBsYSBtYXRyaXogY29uc2VydmEgbGEgdWJpY2FjacOzbiByZWFsIGRlIGNhZGEgZmVjaGEuIEVYUElSQURPUyBzZSBvY3VsdGEgZGUgbG9zIGZpbHRyb3MsIHkgc2UgZXhjbHV5ZSBkZSBsb3MgdG90YWxlcy48L2Rpdj4nKX0KfQovLyBSZXBsYWNlIG5hdmlnYXRpb24gYW5kIHZpZXcgcGVyc2lzdGVuY2Ugd2l0aCBzdGF0ZSBzcGVjaWZpYyB0byBlYWNoIHNlY3Rpb24uCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kYXRlcm93JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPHNwYW4gaWQ9InZpZXdIZWxwIiBjbGFzcz0iZGF0ZWhlbHAiPjwvc3Bhbj4nKTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyIHAnKS50ZXh0Q29udGVudD0nUGFub3JhbWEgZ2VuZXJhbCwgY29tcGFyYWNpb25lcyBpbmRlcGVuZGllbnRlcywgZXZvbHVjacOzbiB5IHJhdGlvcy4nOwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJywnPGRpdiBjbGFzcz0id29ya3NwYWNlYmFyIj48YnV0dG9uIGlkPSJ2MnNhdmUiPkd1YXJkYXIgdmlzdGEgYWN0dWFsPC9idXR0b24+PHNlbGVjdCBpZD0idjJ2aWV3cyI+PG9wdGlvbiB2YWx1ZT0iIj5WaXN0YXMgZ3VhcmRhZGFzPC9vcHRpb24+PC9zZWxlY3Q+PGJ1dHRvbiBpZD0idjJleHBvcnQiPuKGkyBFeHBvcnRhciBlc3RhIGNvbnN1bHRhPC9idXR0b24+PC9kaXY+Jyk7CiQoJyNzYXZlJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI3ZpZXdzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChidXR0b24saSk9PmJ1dHRvbi5vbmNsaWNrPSgpPT57dGFiPVsnUmVzdW1lbicsJ0NvbXBhcmF0aXZvcycsJ0V2b2x1Y2nDs24nLCdSYXRpb3MnLCdNZXRvZG9sb2fDrWEnXVtpXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYj09PWJ1dHRvbikpO3JlbmRlcigpfSk7CmxvYWRWaWV3cz1mdW5jdGlvbigpe2NvbnN0IHNlbGVjdD0kKCcjdjJ2aWV3cycpO3NlbGVjdC5pbm5lckhUTUw9JzxvcHRpb24gdmFsdWU9IiI+VmlzdGFzIGd1YXJkYWRhczwvb3B0aW9uPicrc2F2ZWRWaWV3cy5tYXAoKHYsaSk9PmA8b3B0aW9uIHZhbHVlPSIke2l9Ij4ke2VzYyh2Lm5hbWUpfSR7di52ZXJzaW9uPT09Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yyc2F2ZScpLm9uY2xpY2s9YXN5bmMoKT0+e2lmKCFkYXRhKXJldHVybjtjb25zdCBuYW1lPXByb21wdCgnTm9tYnJlIGRlIGxhIHZpc3RhJyk7aWYoIW5hbWUpcmV0dXJuO2xldCBuZXh0PVsuLi5zYXZlZFZpZXdzLHt2ZXJzaW9uOjIsbmFtZSx0YWIsZnJvbTokKCcjZnJvbScpLnZhbHVlLHRvOiQoJyN0bycpLnZhbHVlLHN0YXRlOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlKSl9XTt0cnl7YXdhaXQgcnBjKCdzYXZlVmlld3MnLEpTT04uc3RyaW5naWZ5KG5leHQpKTtzYXZlZFZpZXdzPW5leHQ7bG9hZFZpZXdzKCl9Y2F0Y2goZSl7YWxlcnQoJ05vIHNlIGd1YXJkw7M6ICcrZS5tZXNzYWdlKX19OwokKCcjdjJ2aWV3cycpLm9uY2hhbmdlPSgpPT57aWYoJCgnI3Yydmlld3MnKS52YWx1ZT09PScnKXJldHVybjtjb25zdCB2PXNhdmVkVmlld3NbJCgnI3Yydmlld3MnKS52YWx1ZV07aWYodi52ZXJzaW9uIT09Mil7YWxlcnQoJ0VzdGEgdmlzdGEgcGVydGVuZWNlIGFsIGRpc2XDsW8gYW50ZXJpb3IuIENyZWEgdW5hIG51ZXZhIGNvbiBsb3MgZmlsdHJvcyBhY3R1YWxlcy4nKTtyZXR1cm59T2JqZWN0LmFzc2lnbih2aWV3U3RhdGUsSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2LnN0YXRlKSkpOyQoJyNmcm9tJykudmFsdWU9di5mcm9tOyQoJyN0bycpLnZhbHVlPXYudG87dGFiPXYudGFiO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b24nKS5mb3JFYWNoKChiLGkpPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsWydSZXN1bWVuJywnQ29tcGFyYXRpdm9zJywnRXZvbHVjacOzbicsJ1JhdGlvcycsJ01ldG9kb2xvZ8OtYSddW2ldPT09dGFiKSk7cmVuZGVyKCl9OwokKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57Y29uc3QgW2Zyb20sdG9dPWRhdGVSYW5nZSgpOyQoJyNmcm9tJykudmFsdWU9ZnJvbTskKCcjdG8nKS52YWx1ZT10bztpZih0YWI9PT0nRXZvbHVjacOzbicpdmlld1N0YXRlLmV2b2x1dGlvbi5maWx0ZXJzPXt9O2lmKHRhYj09PSdSYXRpb3MnKXZpZXdTdGF0ZS5yYXRpb3MuZmlsdGVycz17fTtyZW5kZXIoKX07CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9KCk9PntpZih0YWI9PT0nTWV0b2RvbG9nw61hJ3x8IWV4cG9ydFJvd3MubGVuZ3RoKXJldHVybjtjb25zdCBjc3Y9J1x1ZmVmZicrZXhwb3J0Um93cy5tYXAocm93PT5yb3cubWFwKHY9PiciJytTdHJpbmcodikucmVwbGFjZSgvIi9nLCciIicpKyciJykuam9pbignOycpKS5qb2luKCdcclxuJyk7bGV0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2EuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtjc3ZdLHt0eXBlOid0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04J30pKTthLmRvd25sb2FkPSdMQS0nK3RhYisnLmNzdic7YS5jbGljaygpO3NldFRpbWVvdXQoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKSwxMDAwKX07Cgpjb25zdCBjYW5vbmljYWxIZWFkZXJzPVsnRmVjaGEnLCdNw6FxdWluYScsJ0ZhYnJpY2FudGUnLCdQbGF0YWZvcm1hJywnTW9kZWxvJywnU2VjY2nDs24nLCdWYWxvcicsJ1NhbMOzbicsJ0lELVByb2cnLCdCbG9xdWUnLCdUaWNrZXQgSW4nLCdUaWNrZXQgT3V0JywnQmlsbGV0ZScsJ1ZwcCcsJ0V4cGlyYWRvcycsJ1ByZW1pb3MnLCdXaW4nLCdXRFAnLCdDb2luIEluJywnQ29pbiBPdXQnLCdTcGluJywnQXB1ZXN0YScsJyUgT2N1cCcsJ1dpbicsJ0RhdG9zIFdpbk1ldHJvIE1DQycsJ07CsDEgRGlmZXJlbmNpYScsJ1Byb21vIEluJywnUHJvbW8gT3V0JywnRGlmZXJlbmNpYSBXaW4gUmVhbCcsJ0hvcmEnLCdTZW1hbmEnLCdNZXMnLCdEaWFTZW0nLCdBw7FvIEZhYicsJ0FudGlndWVkYWQnLCdjaGVjayddOwpmdW5jdGlvbiBoZWFkZXJLZXkocyl7cmV0dXJuIFN0cmluZyhzPz8nJykubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXHUwMzAwLVx1MDM2Zl0vZywnJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywnJyl9CmZ1bmN0aW9uIGV4Y2VsRGF0ZSh2LGRhdGUxOTA0PWZhbHNlKXsKIGlmKHR5cGVvZiB2PT09J251bWJlcicpe2NvbnN0IGQ9bmV3IERhdGUoKGRhdGUxOTA0P0RhdGUuVVRDKDE5MDQsMCwxKTpEYXRlLlVUQygxODk5LDExLDMwKSkrTWF0aC5mbG9vcih2KSo4NjRlNSk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSk/ZC50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApOm51bGx9CiBjb25zdCBzPVN0cmluZyh2Pz8nJykudHJpbSgpO2xldCBtPXMubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pO2lmKCFtKXtsZXQgbG9jYWw9cy5tYXRjaCgvXihcZHsxLDJ9KVtcLy1dKFxkezEsMn0pW1wvLV0oXGR7NH0pJC8pO2lmKGxvY2FsKW09W2xvY2FsWzBdLGxvY2FsWzNdLGxvY2FsWzJdLnBhZFN0YXJ0KDIsJzAnKSxsb2NhbFsxXS5wYWRTdGFydCgyLCcwJyldfQogaWYoIW0pcmV0dXJuIG51bGw7bGV0IHJlc3VsdD1gJHttWzFdfS0ke21bMl19LSR7bVszXX1gLGQ9bmV3IERhdGUocmVzdWx0KydUMDA6MDA6MDBaJyk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShkLmdldFRpbWUoKSkmJmQudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKT09PXJlc3VsdD9yZXN1bHQ6bnVsbDsKfQpmdW5jdGlvbiBub3JtYWxpemVXb3JrYm9vayhtYXRyaXgsanVlZ29zLG5hbWUsZGF0ZTE5MDQ9ZmFsc2UsdXRpbGl0eT1udWxsKXsKIGlmKCFtYXRyaXgpdGhyb3cgRXJyb3IoJ0VsIGFyY2hpdm8gZGViZSBpbmNsdWlyIGxhIHBlc3Rhw7FhIE1hdHJpei4nKTsKIGxldCBzdGFydD1tYXRyaXguZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nZmVjaGEnKSYmci5zb21lKHY9PmhlYWRlcktleSh2KT09PSdtYXF1aW5hJykpOwogaWYoc3RhcnQ8MCl0aHJvdyBFcnJvcignTm8gc2UgZW5jb250cmFyb24gbG9zIGVuY2FiZXphZG9zIEZlY2hhIHkgTcOhcXVpbmEuJyk7CiBjb25zdCBoZWFkZXJzPW1hdHJpeFtzdGFydF0scG9zaXRpb25zPXt9O2hlYWRlcnMuZm9yRWFjaCgodixpKT0+e2xldCBrZXk9aGVhZGVyS2V5KHYpOyhwb3NpdGlvbnNba2V5XT8/PVtdKS5wdXNoKGkpfSk7CiBjb25zdCBtYXBwaW5nPWNhbm9uaWNhbEhlYWRlcnMubWFwKGg9PnBvc2l0aW9uc1toZWFkZXJLZXkoaCldPy5bMF0/Py0xKTsKIG1hcHBpbmdbMjNdPXBvc2l0aW9ucy53aW4/LlsxXT8/LTE7CiBtYXBwaW5nWzI0XT1wb3NpdGlvbnMuZGF0b3N3aW5tZXRyb21jYz8uWzBdPz8tMTttYXBwaW5nWzI1XT1wb3NpdGlvbnMubjFkaWZlcm5jaWE/LlswXT8/cG9zaXRpb25zLm4xZGlmZXJlbmNpYT8uWzBdPz8tMTsKIGZvcihsZXQgaSBvZiBbMCwxLDE2LDE4LDIwLDI2LDI3XSlpZihtYXBwaW5nW2ldPDApdGhyb3cgRXJyb3IoJ0ZhbHRhIGxhIGNvbHVtbmEgJytjYW5vbmljYWxIZWFkZXJzW2ldKTsKIGNvbnN0IGpTdGFydD0oanVlZ29zfHxbXSkuZmluZEluZGV4KHI9PnIuc29tZSh2PT5oZWFkZXJLZXkodik9PT0nbWFxdWluYScpKTsKIGNvbnN0IGRlc2NyaXB0aW9ucz1uZXcgTWFwOwogaWYoalN0YXJ0Pj0wKXtjb25zdCBqaD1qdWVnb3NbalN0YXJ0XS5tYXAoaGVhZGVyS2V5KSxtaz1qaC5pbmRleE9mKCdtYXF1aW5hJyk7Zm9yKGNvbnN0IHJvdyBvZiBqdWVnb3Muc2xpY2UoalN0YXJ0KzEpKWlmKHJvd1tta10hPW51bGwpZGVzY3JpcHRpb25zLnNldChTdHJpbmcocm93W21rXSkse3JvdyxoZWFkZXJzOmpofSl9CiBsZXQgc2tpcHBlZD0wLG1pc3NpbmdEZXNjcmlwdGlvbnM9MCxlcnJvcnM9MDtjb25zdCByb3dzPVtdOwogZm9yKGxldCBpPXN0YXJ0KzE7aTxtYXRyaXgubGVuZ3RoO2krKyl7CiAgY29uc3Qgc291cmNlPW1hdHJpeFtpXTtpZihtYXBwaW5nLnNsaWNlKDAsMzApLmZpbHRlcihrPT5rPj0wKS5ldmVyeShrPT5zb3VyY2Vba109PW51bGx8fHNvdXJjZVtrXT09PScnKSl7c2tpcHBlZCsrO2NvbnRpbnVlfQogIGNvbnN0IGR2PXNvdXJjZVttYXBwaW5nWzBdXTtpZigvXnRvdGFsKCBnZW5lcmFsKT8kL2kudGVzdChTdHJpbmcoZHY/PycnKS50cmltKCkpKXtza2lwcGVkKys7Y29udGludWV9CiAgY29uc3QgZGF0ZT1leGNlbERhdGUoZHYsZGF0ZTE5MDQpO2lmKCFkYXRlKXRocm93IEVycm9yKGBGaWxhICR7aSsxfTogZmVjaGEgdmFjw61hIG8gbm8gdsOhbGlkYS5gKTsKICBsZXQgcj1jYW5vbmljYWxIZWFkZXJzLm1hcCgoaCxrKT0+bWFwcGluZ1trXTwwP251bGw6c291cmNlW21hcHBpbmdba11dPz9udWxsKTtyWzBdPWRhdGU7CiAgZm9yKGxldCBrIG9mIFsxNiwxOCwyMCwyNiwyN10paWYodHlwZW9mIHJba10hPT0nbnVtYmVyJ3x8IU51bWJlci5pc0Zpbml0ZShyW2tdKSl0aHJvdyBFcnJvcihgRmlsYSAke2krMX06ICR7Y2Fub25pY2FsSGVhZGVyc1trXX0gbm8gdGllbmUgcmVzdWx0YWRvIG51bcOpcmljby4gUmVjYWxjdWxhIHkgZ3VhcmRhIGVsIEV4Y2VsLmApOwogIGNvbnN0IGRlc2M9ZGVzY3JpcHRpb25zLmdldChTdHJpbmcoclsxXSkpO2ZvcihsZXQgaz0yO2s8PTk7aysrKXtpZihyW2tdPT1udWxsJiZkZXNjKXtsZXQgaXg9ZGVzYy5oZWFkZXJzLmluZGV4T2YoaGVhZGVyS2V5KGNhbm9uaWNhbEhlYWRlcnNba10pKTtpZihpeD49MClyW2tdPWRlc2Mucm93W2l4XT8/bnVsbH19CiAgZm9yKGxldCBrPTA7azxyLmxlbmd0aDtrKyspaWYodHlwZW9mIHJba109PT0nc3RyaW5nJyYmL14jKFJFRiF8TlwvQXxWQUxVRSF8RElWXC8wIXxOQU1FXD98TlVNIXxOVUxMISkvLnRlc3QocltrXSkpe3Jba109bnVsbDtlcnJvcnMrK30KICBpZihyWzJdPT1udWxsJiYhaXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKW1pc3NpbmdEZXNjcmlwdGlvbnMrKzsKICBjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7clszMF09TWF0aC5mbG9vcigoKGQtZmlyc3QpLzg2NGU1KyhmaXJzdC5nZXRVVENEYXkoKSs2KSU3KS83KSsxO3JbMzFdPWQuZ2V0VVRDTW9udGgoKSsxO3JbMzJdPShkLmdldFVUQ0RheSgpKzYpJTcrMTsKICAvLyBUaGUgbGFzdCBjb2x1bW5zIG9mIFdpbiBUaXR0byBhcmUgdmFsaWRhdGlvbiBmaWVsZHMsIG5vdCBjYWxlbmRhci9tYW51ZmFjdHVyZSBmaWVsZHMuCiAgZm9yKGxldCBrIG9mIFszMywzNCwzNV0paWYobWFwcGluZ1trXTwwKXJba109bnVsbDsKICByb3dzLnB1c2gocik7CiB9CiBpZighcm93cy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIHBlc3Rhw7FhIE1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgdsOhbGlkb3MuJyk7CiBsZXQgY29udHJvbHM9W107CiBpZih1dGlsaXR5KXtmb3IobGV0IHJvdyBvZiB1dGlsaXR5KXtjb25zdCBkYXRlPWV4Y2VsRGF0ZShyb3dbMF0sZGF0ZTE5MDQpO2lmKGRhdGUmJnR5cGVvZiByb3dbNF09PT0nbnVtYmVyJyljb250cm9scy5wdXNoKHtkYXRlLG5ldDpyb3dbMV0sdnBwOnJvd1syXSxleHBpcmVkOnJvd1szXSx3aW46cm93WzRdfSl9fQogY29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksa2V5cz1uZXcgU2V0O2NvbnRyb2xzPWNvbnRyb2xzLmZpbHRlcihjPT5kYXRlcy5pbmNsdWRlcyhjLmRhdGUpKTtsZXQgZHVwbGljYXRlcz0wO2ZvcihsZXQgciBvZiByb3dzKXtsZXQga2V5PXJbMF0rJ3wnK3JbMV07aWYoa2V5cy5oYXMoa2V5KSlkdXBsaWNhdGVzKys7a2V5cy5hZGQoa2V5KX0KIHJldHVybiB7aGVhZGVyczpjYW5vbmljYWxIZWFkZXJzLHJvd3MsbmFtZSxjb250cm9scyxpbXBvcnRJbmZvOntza2lwcGVkLG1pc3NpbmdEZXNjcmlwdGlvbnMsZXJyb3JzLGR1cGxpY2F0ZXMsZnJvbTpkYXRlc1swXSx0bzpkYXRlcy5hdCgtMSksZGF0ZXM6ZGF0ZXMubGVuZ3RoLGZvcm1hdDpwb3NpdGlvbnMuZXN0YWRvZGVtYXF1aW5hPydXaW4gVGl0dG8nOidNYXRyaXogLyBSZXBvcnRlIExBJ319Owp9CmZ1bmN0aW9uIGNvbWJpbmVNYXRyaWNlcyhwcmV2aW91cyxpbmNvbWluZyxtb2RlKXsKIGlmKG1vZGU9PT0ncmVwbGFjZSd8fCFwcmV2aW91cylyZXR1cm4gey4uLmluY29taW5nfTsKIGNvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpOwogY29uc3Qgcm93cz1bLi4ucHJldmlvdXMucm93cy5maWx0ZXIocj0+IWRhdGVzLmhhcyhyWzBdKSksLi4uaW5jb21pbmcucm93c10uc29ydCgoYSxiKT0+YVswXS5sb2NhbGVDb21wYXJlKGJbMF0pfHxTdHJpbmcoYVsxXSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlsxXSksdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSk7CiBjb25zdCBjb250cm9scz1bLi4uKHByZXZpb3VzLmNvbnRyb2xzfHxbXSkuZmlsdGVyKGM9PiFkYXRlcy5oYXMoYy5kYXRlKSksLi4uKGluY29taW5nLmNvbnRyb2xzfHxbXSldOwogcmV0dXJuIHsuLi5pbmNvbWluZyxyb3dzLGNvbnRyb2xzLG5hbWU6J0hpc3TDs3JpY28gwrcgJytpbmNvbWluZy5uYW1lfTsKfQpsZXQgcGVuZGluZ0ltcG9ydD1udWxsOwpmdW5jdGlvbiBzaG93SW1wb3J0UHJldmlldyhpbmNvbWluZyl7CiBwZW5kaW5nSW1wb3J0PWluY29taW5nO2NvbnN0IGRhdGVzPW5ldyBTZXQoaW5jb21pbmcucm93cy5tYXAocj0+clswXSkpLG9sZD0oZGF0YT8ucm93c3x8W10pLmZpbHRlcihyPT5kYXRlcy5oYXMoclswXSkpLGE9YWdnKGluY29taW5nLnJvd3MpLGluZm89aW5jb21pbmcuaW1wb3J0SW5mbzsKIGNvbnN0IGRpYWxvZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaWFsb2cnKTtkaWFsb2cuaWQ9J2ltcG9ydERpYWxvZyc7ZGlhbG9nLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iaW1wb3J0Ym94Ij48aDI+UmV2aXNhciBhY3R1YWxpemFjacOzbjwvaDI+PHA+JHtlc2MoaW5jb21pbmcubmFtZSl9IMK3ICR7aW5mby5mb3JtYXR9PC9wPjxkaXYgY2xhc3M9Im5vdGljZSI+JHtpbmZvLmZyb219IOKGkiAke2luZm8udG99IMK3ICR7Zm10KGluY29taW5nLnJvd3MubGVuZ3RoKX0gcmVnaXN0cm9zIMK3ICR7aW5mby5kYXRlc30gZMOtYXMuPGJyPldpbjogJHtmbXQoYS53aW4pfSBDTFAgwrcgQ29pbiBJbjogJHtmbXQoYS5jb2luKX0gQ0xQLjxicj4ke2luZm8uc2tpcHBlZH0gZmlsYXMgdmFjw61hcyBvIGRlIHRvdGFsZXMgb21pdGlkYXMuICR7aW5mby5kdXBsaWNhdGVzfSBjbGF2ZXMgZmVjaGEvbcOhcXVpbmEgcmVwZXRpZGFzIChzZSBjb25zZXJ2YW4pLiAke2luZm8ubWlzc2luZ0Rlc2NyaXB0aW9uc30gcmVnaXN0cm9zIHNpbiBmYWJyaWNhbnRlLiAke2luZm8uZXJyb3JzfSBlcnJvcmVzIGVuIGNvbHVtbmFzIGF1eGlsaWFyZXMgc2UgbWFyY2Fyb24gY29tbyBzaW4gZGF0by48L2Rpdj48bGFiZWw+Q8OzbW8gYWN0dWFsaXphcjxzZWxlY3QgaWQ9ImltcG9ydE1vZGUiPjxvcHRpb24gdmFsdWU9Im1lcmdlIj5BY3R1YWxpemFyIGxvcyBkw61hcyByZWNpYmlkb3MgeSBjb25zZXJ2YXIgZWwgcmVzdG8gZGVsIGhpc3TDs3JpY288L29wdGlvbj48b3B0aW9uIHZhbHVlPSJyZXBsYWNlIj5SZWVtcGxhemFyIFRPRE8gZWwgaGlzdMOzcmljbyBwb3IgZXN0ZSBhcmNoaXZvPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48cD5FbiBtb2RvIGhpc3TDs3JpY28gc2UgcmVlbXBsYXphbiAke2ZtdChvbGQubGVuZ3RoKX0gcmVnaXN0cm9zIGRlIGxvcyBkw61hcyByZWNpYmlkb3MuIExvcyBkZW3DoXMgZMOtYXMgc2UgY29uc2VydmFuLiBSZXBldGlyIGVsIG1pc21vIGFyY2hpdm8gbm8gZHVwbGljYSBkYXRvcy4gQ2FkYSBkw61hIGRlbCBhcmNoaXZvIHNlIGNvbnNpZGVyYSBjb21wbGV0by48L3A+PHAgaWQ9ImltcG9ydE1lc3NhZ2UiPjwvcD48ZGl2IGNsYXNzPSJjb21wYXJldG9vbHMiPjxidXR0b24gaWQ9ImNhbmNlbEltcG9ydCI+Q2FuY2VsYXI8L2J1dHRvbj48YnV0dG9uIGlkPSJjb25maXJtSW1wb3J0IiBjbGFzcz0icHJpbWFyeSI+Q29uZmlybWFyIGFjdHVhbGl6YWNpw7NuPC9idXR0b24+PC9kaXY+PC9kaXY+YDsKIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTtkaWFsb2cuc2hvd01vZGFsKCk7JCgnI2NhbmNlbEltcG9ydCcpLm9uY2xpY2s9KCk9PntkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7cGVuZGluZ0ltcG9ydD1udWxsfTsKICQoJyNjb25maXJtSW1wb3J0Jykub25jbGljaz1hc3luYygpPT57CiAgY29uc3QgbW9kZT0kKCcjaW1wb3J0TW9kZScpLnZhbHVlO2lmKG1vZGU9PT0ncmVwbGFjZScmJiFjb25maXJtKCdFc3RvIHJlZW1wbGF6YXLDoSBUT0RPIGVsIGhpc3TDs3JpY28gYWN0dWFsLiDCv0NvbnRpbnVhcj8nKSlyZXR1cm47CiAgJCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNjYW5jZWxJbXBvcnQnKS5kaXNhYmxlZD10cnVlOyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J0d1YXJkYW5kbyBlbiBHb29nbGUgRHJpdmXigKYnOwogIHRyeXtjb25zdCBuZXh0PWNvbWJpbmVNYXRyaWNlcyhkYXRhLGluY29taW5nLG1vZGUpLHJlc3BvbnNlPWF3YWl0IHJwYygnaW1wb3J0TWF0cml4JyxKU09OLnN0cmluZ2lmeShpbmNvbWluZyksbW9kZSxkYXRhPy5zdG9yYWdlUmV2aXNpb24/Pydpbml0aWFsJyk7bmV4dC5zdG9yYWdlUmV2aXNpb249cmVzcG9uc2UucmV2aXNpb247bmV4dC5zdG9yYWdlVXBkYXRlZEF0PXJlc3BvbnNlLnVwZGF0ZWRBdDtkYXRhPW5leHQ7Zm9yKGxldCBrZXkgb2YgWydBJywnQiddKXt2aWV3U3RhdGVba2V5XS5mcm9tPScnO3ZpZXdTdGF0ZVtrZXldLnRvPScnfWRpYWxvZy5jbG9zZSgpO2RpYWxvZy5yZW1vdmUoKTtwZW5kaW5nSW1wb3J0PW51bGw7aW5pdCgpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudCs9YCDCtyBIaXN0w7NyaWNvIGFjdHVhbGl6YWRvIGVuIERyaXZlIMK3ICR7cmVzcG9uc2Uucm93c30gcmVnaXN0cm9zYH0KICBjYXRjaChlcnIpeyQoJyNpbXBvcnRNZXNzYWdlJykudGV4dENvbnRlbnQ9J05vIHNlIGd1YXJkw7M6ICcrZXJyLm1lc3NhZ2U7JCgnI2NvbmZpcm1JbXBvcnQnKS5kaXNhYmxlZD1mYWxzZTskKCcjY2FuY2VsSW1wb3J0JykuZGlzYWJsZWQ9ZmFsc2V9CiB9Owp9CiQoJyNmaWxlJykub25jaGFuZ2U9YXN5bmMgZT0+e2NvbnN0IGZpbGU9ZS50YXJnZXQuZmlsZXNbMF07aWYoIWZpbGUpcmV0dXJuOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTGV5ZW5kbyB5IHZhbGlkYW5kbyAnK2ZpbGUubmFtZSsn4oCmJzt0cnl7c2hvd0ltcG9ydFByZXZpZXcoYXdhaXQgcmVhZFhsc3goZmlsZSkpOyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nQXJjaGl2byB2YWxpZGFkby4gUmV2aXNhIHkgY29uZmlybWEgbGEgYWN0dWFsaXphY2nDs24uJ31jYXRjaChlcnIpeyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTm8gc2UgbW9kaWZpY2Fyb24gbG9zIGRhdG9zOiAnK2Vyci5tZXNzYWdlfWZpbmFsbHl7ZS50YXJnZXQudmFsdWU9Jyd9fTsKCmNvbnN0IHRhYnNWMz1bJ1Jlc3VtZW4nLCdDb21wYXJhdGl2b3MnLCdFdm9sdWNpw7NuJywnUmF0aW9zJywnUmVwb3J0ZSBzZW1hbmFsJywnUmVwb3J0ZSBtZW5zdWFsJywnRXZvbHV0aXZvIG1lbnN1YWwnLCdPdHJvcyBpbmZvcm1lcycsJ01ldG9kb2xvZ8OtYSddOwpmb3IoY29uc3Qga2V5IG9mIFsnd2Vla2x5JywnbW9udGhseScsJ21vbnRobHlFdm9sdXRpb24nLCdleHRyYSddKXZpZXdTdGF0ZVtrZXldPz89e2ZpbHRlcnM6e30sbGltaXQ6JzEyJyxraW5kOidzYWxvbid9OwpmdW5jdGlvbiByZXBvcnRQZXJpb2Qocix0eXBlKXtyZXR1cm4gdHlwZT09PSd3ZWVrJz9yWzBdLnNsaWNlKDAsNCkrJyDCtyBTJytTdHJpbmcoclszMF0pLnBhZFN0YXJ0KDIsJzAnKTpyWzBdLnNsaWNlKDAsNyl9CmZ1bmN0aW9uIHByZWZlcmVuY2lhbChyKXtyZXR1cm4gaGVhZGVyS2V5KHJbNV0pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKXx8aGVhZGVyS2V5KHJbN10pLmluY2x1ZGVzKCdwcmVmZXJlbmNpYWwnKX0KZnVuY3Rpb24gcmVwb3J0U2VyaWVzKHJvd3MsdHlwZSl7cmV0dXJuIGdyb3Vwcyhyb3dzLHI9PnJlcG9ydFBlcmlvZChyLHR5cGUpKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKX0KZnVuY3Rpb24gcmVwb3J0VGFibGUobGlzdCxjb2xzLHBlcmlvZExhYmVsPSdQZXLDrW9kbycpewogcmV0dXJuIGA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD4ke3BlcmlvZExhYmVsfTwvdGg+PHRoPkNvYmVydHVyYTwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtsaXN0Lm1hcCh4PT5gPHRyPjx0ZD4ke2VzYyh4Lm5hbWUpfTwvdGQ+PHRkPiR7Y292ZXJhZ2VMYWJlbCh4LnJvd3MpfTwvdGQ+JHtjb2xzLm1hcChrPT5gPHRkPiR7Zm10KHhba10sayl9PC90ZD5gKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwp9CmZ1bmN0aW9uIGNvdmVyYWdlTGFiZWwocm93cyl7aWYoIXJvd3MubGVuZ3RoKXJldHVybiAnU2luIGRhdG9zJztsZXQgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksbW9udGhzPW5ldyBTZXQoZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpO2lmKG1vbnRocy5zaXplPT09MSl7bGV0W3ksbV09ZGF0ZXNbMF0uc3BsaXQoJy0nKS5tYXAoTnVtYmVyKSxkYXlzPW5ldyBEYXRlKERhdGUuVVRDKHksbSwwKSkuZ2V0VVRDRGF0ZSgpO3JldHVybiBgJHtkYXRlcy5sZW5ndGh9IGTDrWFzIHJlZ2lzdHJhZG9zYH1yZXR1cm4gYCR7ZGF0ZXMubGVuZ3RofSBkw61hcyByZWdpc3RyYWRvc2B9CmZ1bmN0aW9uIGNvbWJpbmVkQ2hhcnQocG9pbnRzLGZpcnN0LHNlY29uZCl7CiBjb25zdCB2YWxpZD1wb2ludHMuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsfHxwW3NlY29uZF0hPW51bGwpO2lmKCF2YWxpZC5sZW5ndGgpcmV0dXJuICc8cD5TaW4gZGF0b3MuPC9wPic7CiBjb25zdCBsZWZ0PXZhbGlkLm1hcChwPT5wW2ZpcnN0XSkuZmlsdGVyKHY9PnYhPW51bGwpLHJpZ2h0PXZhbGlkLm1hcChwPT5wW3NlY29uZF0pLmZpbHRlcih2PT52IT1udWxsKTsKIGNvbnN0IGxvMT1NYXRoLm1pbigwLC4uLmxlZnQpLGhpMT1NYXRoLm1heCgxLC4uLmxlZnQpLGxvMj1NYXRoLm1pbigwLC4uLnJpZ2h0KSxoaTI9TWF0aC5tYXgoMC4wMDAwMDEsLi4ucmlnaHQpLHg9aT0+NDUraS9NYXRoLm1heCgxLHZhbGlkLmxlbmd0aC0xKSo0OTA7CiBjb25zdCB5MT12PT4xODUtKHYtbG8xKS8oaGkxLWxvMXx8MSkqMTMwLHkyPXY9PjE4NS0odi1sbzIpLyhoaTItbG8yfHwxKSoxMzA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImR1YWxMZWdlbmQiPjxzcGFuPuKXjyBJenF1aWVyZGE6ICR7bWV0cmljc1tmaXJzdF19PC9zcGFuPjxzcGFuPuKXjyBEZXJlY2hhOiAke21ldHJpY3Nbc2Vjb25kXX08L3NwYW4+PC9kaXY+PHN2ZyB2aWV3Qm94PSIwIDAgNjAwIDI0MCIgYXJpYS1sYWJlbD0iJHttZXRyaWNzW2ZpcnN0XX0geSAke21ldHJpY3Nbc2Vjb25kXX0sIGVqZXMgaW5kZXBlbmRpZW50ZXMiIHJvbGU9ImltZyI+PGxpbmUgeDE9IjQ1IiB5MT0iMTg1IiB4Mj0iNTM1IiB5Mj0iMTg1IiBzdHJva2U9IiNkOWUzZWIiLz48dGV4dCB4PSIxNSIgeT0iMzUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiMxNzM2NTIiPiR7Y29tcGFjdChoaTEsZmlyc3QpfTwvdGV4dD48dGV4dCB4PSI1ODAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjEwIiBmaWxsPSIjMTM4ZjkzIj4ke2NvbXBhY3QoaGkyLHNlY29uZCl9PC90ZXh0Pjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxNzM2NTIiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbZmlyc3RdIT1udWxsKS5tYXAocD0+YCR7eCh2YWxpZC5pbmRleE9mKHApKX0sJHt5MShwW2ZpcnN0XSl9YCkuam9pbignICcpfSIvPjxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMxMzhmOTMiIHN0cm9rZS13aWR0aD0iMi41IiBwb2ludHM9IiR7dmFsaWQuZmlsdGVyKHA9PnBbc2Vjb25kXSE9bnVsbCkubWFwKHA9PmAke3godmFsaWQuaW5kZXhPZihwKSl9LCR7eTIocFtzZWNvbmRdKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHAsaSk9PmAke3BbZmlyc3RdPT1udWxsPycnOmA8Y2lyY2xlIGN4PSIke3goaSl9IiBjeT0iJHt5MShwW2ZpcnN0XSl9IiByPSIzIiBmaWxsPSIjMTczNjUyIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW2ZpcnN0XX06ICR7Zm10KHBbZmlyc3RdLGZpcnN0KX08L3RpdGxlPjwvY2lyY2xlPmB9JHtwW3NlY29uZF09PW51bGw/Jyc6YDxjaXJjbGUgY3g9IiR7eChpKX0iIGN5PSIke3kyKHBbc2Vjb25kXSl9IiByPSIzIiBmaWxsPSIjMTM4ZjkzIj48dGl0bGU+JHtlc2MocC5uYW1lKX0gwrcgJHttZXRyaWNzW3NlY29uZF19OiAke2ZtdChwW3NlY29uZF0sc2Vjb25kKX08L3RpdGxlPjwvY2lyY2xlPmB9YCkuam9pbignJyl9PHRleHQgeD0iNDUiIHk9IjIyMCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzcxODY5NCI+JHtlc2ModmFsaWRbMF0ubmFtZSl9PC90ZXh0Pjx0ZXh0IHg9IjUzNSIgeT0iMjIwIiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjExIiBmaWxsPSIjNzE4Njk0Ij4ke2VzYyh2YWxpZC5hdCgtMSkubmFtZSl9PC90ZXh0Pjwvc3ZnPmA7Cn0KZnVuY3Rpb24gZ3JhcGhDYXJkKHRpdGxlLGh0bWwsbm90ZT0nJyl7cmV0dXJuIGA8ZGl2IGNsYXNzPSJjYXJkIj48aDI+JHt0aXRsZX08L2gyPiR7bm90ZT9gPGRpdiBjbGFzcz0ic3VidGl0bGUiPiR7bm90ZX08L2Rpdj5gOicnfSR7aHRtbH08L2Rpdj5gfQpmdW5jdGlvbiByZXBvcnRGaWx0ZXJzKGtleSxleHRyYT0nJyl7CiBjb25zdCBzPXZpZXdTdGF0ZVtrZXldO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPiR7ZmlsdGVyRmllbGRzKHMsa2V5LFsyLDMsNSw3LDksMSw4LDRdKX08L2Rpdj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ01vc3RyYXIgcGVyw61vZG9zJywncmVwb3J0TGltaXQnLHMubGltaXQsezY6J8OabHRpbW9zIDYnLDEyOifDmmx0aW1vcyAxMicsMjQ6J8OabHRpbW9zIDI0JyxhbGw6J1RvZG9zIGVuIGxhcyBmZWNoYXMnfSl9JHtleHRyYX08L2Rpdj48L3NlY3Rpb24+YDsKfQpmdW5jdGlvbiBiaW5kUmVwb3J0KGtleSl7YmluZEZpbHRlcnMoKTskKCcjcmVwb3J0TGltaXQnKS5vbmNoYW5nZT1lPT57dmlld1N0YXRlW2tleV0ubGltaXQ9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCl9fQpmdW5jdGlvbiBwZXJpb2RSZXBvcnRzKHR5cGUpewogY29uc3Qga2V5PXR5cGU9PT0nd2Vlayc/J3dlZWtseSc6J21vbnRobHknLHM9dmlld1N0YXRlW2tleV0scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsdHlwZSksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKTsKIGNvbnN0IHBlcmlvZHM9bmV3IFNldChsaXN0Lm1hcCh4PT54Lm5hbWUpKSx2aXNpYmxlPXJvd3MuZmlsdGVyKHI9PnBlcmlvZHMuaGFzKHJlcG9ydFBlcmlvZChyLHR5cGUpKSksdG90YWw9YWdnKHZpc2libGUpLHNhbG9uPXJlcG9ydFNlcmllcyh2aXNpYmxlLmZpbHRlcihwcmVmZXJlbmNpYWwpLHR5cGUpOwogY29uc3QgYWxpZ25lZD1zYWxvbi5tYXAocD0+KHsuLi5wfSkpO2NvbnN0IGNvbHM9Wyd3aW4nLCdjb2luJywnc3BpbicsJ2JldCcsJ3BvJywncG9uJywnZGV2JywncHJvbW8nLCdwcml6ZSddOwogZXhwb3J0Um93cz1bWydQZXLDrW9kbycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSxuZXcgU2V0KHAucm93cy5tYXAocj0+clswXSkpLnNpemUsLi4uY29scy5tYXAoaz0+cFtrXT8/JycpXSldOwogY29uc3QgY2hhcnRzPVtncmFwaENhcmQoJ1dpbiB5IHBheW91dCcsY29tYmluZWRDaGFydChsaXN0LCd3aW4nLCdwbycpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ0NvaW4gSW4geSBhcHVlc3RhIHByb21lZGlvJyxjb21iaW5lZENoYXJ0KGxpc3QsJ2NvaW4nLCdiZXQnKSwnQ0xQIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IGRlc3ZpYWNpw7NuIE5DQycsY29tYmluZWRDaGFydChsaXN0LCdwbycsJ2RldicpLCclIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSxncmFwaENhcmQoJ1BheW91dCB5IHBheW91dCBjb24gTkNDJyxjaGFydFYyKFt7bmFtZTonUGF5b3V0Jyxwb2ludHM6bGlzdH0se25hbWU6J1BheW91dCBOQ0MnLHBvaW50czpsaXN0Lm1hcChwPT4oey4uLnAscG86cC5wb259KSl9XSwncG8nKSksZ3JhcGhDYXJkKCdQcm9tbyBuZXRhIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3Byb21vJywnZGV2JyksJ0NMUCB5ICUgwrcgRWplcyBpbmRlcGVuZGllbnRlcycpLGdyYXBoQ2FyZCgnUHJlbWlvcycsY2hhcnRWMihbe25hbWU6J1ByZW1pb3MnLHBvaW50czpsaXN0fV0sJ3ByaXplJykpXTsKIGNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIHkgZGVzdmlhY2nDs24gTkNDJyxjb21iaW5lZENoYXJ0KGxpc3QsJ3dpbicsJ2RldicpLCdDTFAgeSAlIMK3IEVqZXMgaW5kZXBlbmRpZW50ZXMnKSk7CiBpZih0eXBlPT09J3dlZWsnKWNoYXJ0cy5wdXNoKGdyYXBoQ2FyZCgnV2luIMK3IFNlbGVjY2nDs24geSBzYWzDs24gcHJlZmVyZW5jaWFsJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbiBjb21wbGV0YScscG9pbnRzOmxpc3R9LHtuYW1lOidQcmVmZXJlbmNpYWwgZGVudHJvIGRlIHNlbGVjY2nDs24nLHBvaW50czphbGlnbmVkfV0sJ3dpbicpLCdFbCBzYWzDs24gZXMgcGFydGUgZGVsIHRvdGFsOyBubyBzdW1hciBhbWJhcyBsw61uZWFzLicpLGdyYXBoQ2FyZCgnQ29pbiBJbiDCtyBTZWxlY2Npw7NuIHkgc2Fsw7NuIHByZWZlcmVuY2lhbCcsY2hhcnRWMihbe25hbWU6J1NlbGVjY2nDs24gY29tcGxldGEnLHBvaW50czpsaXN0fSx7bmFtZTonUHJlZmVyZW5jaWFsIGRlbnRybyBkZSBzZWxlY2Npw7NuJyxwb2ludHM6YWxpZ25lZH1dLCdjb2luJyksJ0VsIHNhbMOzbiBlcyBwYXJ0ZSBkZWwgdG90YWw7IG5vIHN1bWFyIGFtYmFzIGzDrW5lYXMuJykpOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKHR5cGU9PT0nd2Vlayc/J1JlcG9ydGUgc2VtYW5hbCc6J1JlcG9ydGUgbWVuc3VhbCcsJ0luZGljYWRvcmVzIHkgY29tYmluYWNpb25lcyBkZSBncsOhZmljb3MgYmFzYWRvcyBlbiBsYXMgcGVzdGHDsWFzIFJlcG9ydGUgU2VtYW5hIHkgUmVwb3J0ZSBNZXMuIExvcyBwZXLDrW9kb3MgeSB2YWxvcmVzIHNlIHJlY2FsY3VsYW4gY29uIHR1IGhpc3TDs3JpY28uJykrcmVwb3J0RmlsdGVycyhrZXkpK3N0YXRDYXJkcyhbWydXSU4nLGNvbXBhY3QodG90YWwud2luLCd3aW4nKSwnQ0xQIMK3IFBlcsOtb2RvcyBtb3N0cmFkb3MnXSxbJ0NPSU4gSU4nLGNvbXBhY3QodG90YWwuY29pbiwnY29pbicpLCdDTFAgwrcgUGVyw61vZG9zIG1vc3RyYWRvcyddLFsnUEFZT1VUJyxmbXQodG90YWwucG8sJ3BvJyksJ0NhbGN1bGFkbyBzb2JyZSB0b3RhbGVzJ10sWydBUFVFU1RBIFBST01FRElPJyxmbXQodG90YWwuYmV0KSwnQ0xQIHBvciBzcGluJ11dKStgPGRpdiBjbGFzcz0ibm90aWNlIj4ke3R5cGU9PT0nd2Vlayc/J1NlbWFuYSBkZSBFeGNlbCBXRUVLTlVNKGZlY2hhLDIpLCBjb24gbHVuZXMgY29tbyBpbmljaW8uJzonTWVzIGNhbGVuZGFyaW8uJ30gTGFzIHRhYmxhcyBpbmNsdXllbiBzb2xvIGZlY2hhcyBwcmVzZW50ZXMgZW4gZWwgaGlzdMOzcmljbyB5IGVuIHR1IHNlbGVjY2nDs24uIExvcyBwZXLDrW9kb3MgY29uIG1lbm9zIGTDrWFzIHB1ZWRlbiBlc3RhciBpbmNvbXBsZXRvczsgdXNhIGxvcyBpbmRpY2Fkb3JlcyBkaWFyaW9zIHBhcmEgY29tcGFyYXJsb3MuPC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Y2hhcnRzIj4ke2NoYXJ0cy5qb2luKCcnKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+RGV0YWxsZSAke3R5cGU9PT0nd2Vlayc/J3NlbWFuYWwnOidtZW5zdWFsJ308L2gyPiR7cmVwb3J0VGFibGUobGlzdCxjb2xzKX08L2Rpdj5gOwogYmluZFJlcG9ydChrZXkpOwp9CmZ1bmN0aW9uIG1vbnRobHlFdm9sdXRpb25SZXBvcnQoKXsKIGNvbnN0IHM9dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb24scm93cz1zbGljZVJvd3Mocy5maWx0ZXJzKSxhbGw9cmVwb3J0U2VyaWVzKHJvd3MsJ21vbnRoJyksbGlzdD1zLmxpbWl0PT09J2FsbCc/YWxsOmFsbC5zbGljZSgtTnVtYmVyKHMubGltaXQpKSxwZXJpb2RzPW5ldyBTZXQobGlzdC5tYXAocD0+cC5uYW1lKSksdmlzaWJsZT1yb3dzLmZpbHRlcihyPT5wZXJpb2RzLmhhcyhyZXBvcnRQZXJpb2QociwnbW9udGgnKSkpLGJhc2U9YWdnKHZpc2libGUpOwogY29uc3QgcGxhdGZvcm1zPWdyb3Vwcyh2aXNpYmxlLHI9PlN0cmluZyhyWzNdPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKTsKIGNvbnN0IGNvbHM9WydjZCcsJ3dkJywnc2QnLCdiZXQnLCdwbycsJ2RldicsJ3Byb21vJywnd2luJywnY29pbiddOwogZXhwb3J0Um93cz1bWydNZXMnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5saXN0Lm1hcChwPT5bcC5uYW1lLC4uLmNvbHMubWFwKGs9PnBba10/PycnKV0pXTsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignRXZvbHV0aXZvIG1lbnN1YWwnLCdTZWd1aW1pZW50byBtZW5zdWFsIGRlbCBDb2luIEluLCBXaW4geSBzcGlucyBwb3IgbcOhcXVpbmEtZMOtYSwgY29uIGNvbXBhcmFjacOzbiBkZSBwbGF0YWZvcm1hcyBmcmVudGUgYWwgcHJvbWVkaW8gZGUgbGEgc2VsZWNjacOzbi4nKStyZXBvcnRGaWx0ZXJzKCdtb250aGx5RXZvbHV0aW9uJykrYDxkaXYgY2xhc3M9InJlcG9ydGNoYXJ0cyI+JHtncmFwaENhcmQoJ0NvaW4gSW4gcG9yIG3DoXF1aW5hLWTDrWEnLGNoYXJ0VjIoW3tuYW1lOidTZWxlY2Npw7NuJyxwb2ludHM6bGlzdH1dLCdjZCcpKX0ke2dyYXBoQ2FyZCgnV2luIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnd2QnKSl9JHtncmFwaENhcmQoJ1NwaW5zIHBvciBtw6FxdWluYS1kw61hJyxjaGFydFYyKFt7bmFtZTonU2VsZWNjacOzbicscG9pbnRzOmxpc3R9XSwnc2QnKSl9JHtncmFwaENhcmQoJ0FwdWVzdGEgcHJvbWVkaW8geSBwYXlvdXQnLGNvbWJpbmVkQ2hhcnQobGlzdCwnYmV0JywncG8nKSwnQ0xQIHkgJSDCtyBFamVzIGluZGVwZW5kaWVudGVzJyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkluZGljYWRvcmVzIG1lbnN1YWxlczwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsJ01lcycpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5QbGF0YWZvcm1hcyBmcmVudGUgYSBsYSBzZWxlY2Npw7NuPC9oMj48ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+VmFyaWFjacOzbiA9IGluZGljYWRvciBkZSBsYSBwbGF0YWZvcm1hIC8gaW5kaWNhZG9yIGRlIGxhIHNlbGVjY2nDs24g4oiSIDEuIE1pc21hcyBmZWNoYXMuPC9kaXY+PGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+UGxhdGFmb3JtYTwvdGg+PHRoPkNvaW4gSW4gLyBkw61hPC90aD48dGg+VmFyaWFjacOzbiBDSTwvdGg+PHRoPldpbiAvIGTDrWE8L3RoPjx0aD5WYXJpYWNpw7NuIFdpbjwvdGg+PHRoPlNwaW5zIC8gZMOtYTwvdGg+PHRoPlZhcmlhY2nDs24gc3BpbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtwbGF0Zm9ybXMubWFwKHA9PmA8dHI+PHRkPiR7ZXNjKHAubmFtZSl9PC90ZD4ke1snY2QnLCd3ZCcsJ3NkJ10ubWFwKGs9PmA8dGQ+JHtmbXQocFtrXSl9PC90ZD48dGQ+JHshYmFzZVtrXT8n4oCUJzooKHBba10vYmFzZVtrXS0xKSoxMDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyUnfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKIGJpbmRSZXBvcnQoJ21vbnRobHlFdm9sdXRpb24nKTsKfQpmdW5jdGlvbiBleHRyYVJlcG9ydHMoKXsKIGNvbnN0IHM9dmlld1N0YXRlLmV4dHJhLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyk7bGV0IGNvbnRlbnQ9JycsZXhwb3J0RGF0YT1bXTsKIGlmKHMua2luZD09PSd3aW5sb3NlJyl7CiAgY29uc3QgbWFjaGluZXM9Z3JvdXBzKHJvd3Mscj0+U3RyaW5nKHJbMV0/PydTaW4gZGF0bycpKSx3aW5zPW1hY2hpbmVzLmZpbHRlcihwPT5wLndpbj49MCkuc29ydCgoYSxiKT0+Yi53aW4tYS53aW4pLGxvc3Nlcz1tYWNoaW5lcy5maWx0ZXIocD0+cC53aW48MCkuc29ydCgoYSxiKT0+YS53aW4tYi53aW4pLGNvbHM9Wyd3aW4nLCdwbycsJ3BvbicsJ2RldicsJ3ByaXplJywncHJvbW8nXTsKICBjb25zdCBkZXRhaWw9aXRlbXM9PmA8ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5Nw6FxdWluYSAvIE1vZGVsbzwvdGg+JHtjb2xzLm1hcChrPT5gPHRoPiR7bWV0cmljc1trXX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtpdGVtcy5tYXAocD0+YDx0cj48dGQ+JHtlc2MocC5uYW1lKX0gwrcgJHtlc2MocC5yb3dzLmF0KC0xKT8uWzRdKX08L3RkPiR7Y29scy5tYXAoaz0+YDx0ZD4ke2ZtdChwW2tdLGspfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKX08L3Rib2R5PjwvdGFibGU+PC9kaXY+YDsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdNYXlvciBXaW4gb3BlcmFjaW9uYWwnLGJhcnNWMih3aW5zLnNsaWNlKDAsMTApLCd3aW4nKSl9JHtncmFwaENhcmQoJ01lbm9yIFdpbiBvcGVyYWNpb25hbCcsYmFyc1YyKGxvc3Nlcy5zbGljZSgwLDEwKSwnd2luJykpfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5XaW4gcG9zaXRpdm8gbyBjZXJvIMK3ICR7d2lucy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwod2lucyl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPldpbiBuZWdhdGl2byDCtyAke2xvc3Nlcy5sZW5ndGh9IG3DoXF1aW5hczwvaDI+JHtkZXRhaWwobG9zc2VzKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTcOhcXVpbmEnLC4uLmNvbHMubWFwKGs9Pm1ldHJpY3Nba10pXSwuLi5tYWNoaW5lcy5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9ZWxzZSBpZihzLmtpbmQ9PT0nc2Fsb24nKXsKICBjb25zdCBwcmVmPXJvd3MuZmlsdGVyKHByZWZlcmVuY2lhbCksbW9udGhzPXJlcG9ydFNlcmllcyhwcmVmLCdtb250aCcpLHdlZWtzPXJlcG9ydFNlcmllcyhwcmVmLCd3ZWVrJyksYT1hZ2cocHJlZik7CiAgY29udGVudD1zdGF0Q2FyZHMoW1snV0lOIFBSRUZFUkVOQ0lBTCcsY29tcGFjdChhLndpbiwnd2luJyksJ0NMUCddLFsnQ09JTiBJTiBQUkVGRVJFTkNJQUwnLGNvbXBhY3QoYS5jb2luLCdjb2luJyksJ0NMUCddLFsnQ09JTiBJTiAvIETDjUEnLGZtdChhLmNkKSwnUG9yIG3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkbyddLFsnV0lOIC8gRMONQScsZm10KGEud2QpLCdQb3IgbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRvJ11dKStgPGRpdiBjbGFzcz0iY2hhcnRzIj4ke2dyYXBoQ2FyZCgnU2VndWltaWVudG8gc2VtYW5hbCDCtyBDb2luIEluIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnY2QnKSl9JHtncmFwaENhcmQoJ1NlZ3VpbWllbnRvIHNlbWFuYWwgwrcgV2luIHBvciBkw61hJyxjaGFydFYyKFt7bmFtZTonUHJlZmVyZW5jaWFsJyxwb2ludHM6d2Vla3N9XSwnd2QnKSl9PC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkV2b2x1dGl2byBtZW5zdWFsIGRlbCBzYWzDs24gcHJlZmVyZW5jaWFsPC9oMj4ke3JlcG9ydFRhYmxlKG1vbnRocyxbJ2NkJywnd2QnLCdzZCcsJ2JldCcsJ3BvJywncG9uJywnd2luJywnY29pbiddKX08L2Rpdj5gOwogIGV4cG9ydERhdGE9W1snTWVzJywnQ29pbiBJbiBwb3IgZMOtYScsJ1dpbiBwb3IgZMOtYScsJ1NwaW5zIHBvciBkw61hJ10sLi4ubW9udGhzLm1hcChwPT5bcC5uYW1lLHAuY2QscC53ZCxwLnNkXSldOwogfWVsc2UgaWYocy5raW5kPT09J3F1YWxpdHknKXsKICBjb25zdCBieURhdGU9bmV3IE1hcChncm91cHMoc2xpY2VSb3dzKCkscj0+clswXSkubWFwKHA9PltwLm5hbWUscF0pKSxjb250cm9scz0oZGF0YS5jb250cm9sc3x8W10pLmZpbHRlcihjPT5hY2NlcHRzQ2FsZW5kYXJWOChbYy5kYXRlXSxjYWxlbmRhclN0YXRlVjgoJ2dsb2JhbCcpLCQoJyNmcm9tJykudmFsdWUsJCgnI3RvJykudmFsdWUpKSxkZXRhaWxzPWNvbnRyb2xzLm1hcChjPT4oe2RhdGU6Yy5kYXRlLHNvdXJjZTpjLndpbixhY3R1YWw6YnlEYXRlLmdldChjLmRhdGUpPy53aW4/P251bGx9KSk7CiAgY29udGVudD1gPGRpdiBjbGFzcz0ibm90aWNlIj5Db25jaWxpYWNpw7NuIGNvbnRyYSBXSU4gZmluYWwgZGUgVVRJTElEQUQgUkVTVU1FTiBkZWwgYXJjaGl2byBXaW4gVGl0dG8uIFNlIGNvbnN1bHRhIHRvZG8gZWwgcGFycXVlIGVuIGxhcyBmZWNoYXMsIHNpbiBmaWx0cm9zIGRlIGNhdGVnb3LDrWFzLiBTb2xvIGhheSBjb250cm9sZXMgcGFyYSBmZWNoYXMgaW1wb3J0YWRhcyBkZXNkZSB1biBhcmNoaXZvIGNvbiBlc2EgcGVzdGHDsWEuIExvcyBjb250cm9sZXMgZGUgbGEgZnVlbnRlIHNlIGFqdXN0YW4gYSBsYSBtaXNtYSBwb2JsYWNpw7NuIGRlIHJlZ2lzdHJvcyBhcGxpY2FibGVzIHV0aWxpemFkYSBlbiBsb3MgaW5mb3JtZXMuPC9kaXY+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPkNvbmNpbGlhY2nDs24gZGlhcmlhPC9oMj48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5GZWNoYTwvdGg+PHRoPldJTiBmdWVudGUgYWp1c3RhZG88L3RoPjx0aD5XaW4gYXBsaWNhYmxlIGRlIE1hdHJpejwvdGg+PHRoPkRpZmVyZW5jaWE8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtkZXRhaWxzLm1hcChjPT5gPHRyPjx0ZD4ke2MuZGF0ZX08L3RkPjx0ZD4ke2ZtdChjLnNvdXJjZSl9PC90ZD48dGQ+JHtmbXQoYy5hY3R1YWwpfTwvdGQ+PHRkPiR7Yy5hY3R1YWw9PW51bGw/J1NpbiByZWdpc3Rybyc6Zm10KGMuYWN0dWFsLWMuc291cmNlKX08L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjQiPlNpbiBjb250cm9sZXMgZGUgVVRJTElEQUQgUkVTVU1FTiBwYXJhIGVzdGFzIGZlY2hhcy48L3RkPjwvdHI+J308L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+YDsKICBleHBvcnREYXRhPVtbJ0ZlY2hhJywnV0lOIGZ1ZW50ZSBhanVzdGFkbycsJ1dpbiBNYXRyaXonLCdEaWZlcmVuY2lhJ10sLi4uZGV0YWlscy5tYXAoYz0+W2MuZGF0ZSxjLnNvdXJjZSxjLmFjdHVhbCxjLmFjdHVhbD09bnVsbD8nJzpjLmFjdHVhbC1jLnNvdXJjZV0pXTsKIH1lbHNlewogIGNvbnN0IGRpbT1zLmtpbmQ9PT0nYnJhbmRzJz8yOjMsbGlzdD1ncm91cHMocm93cyxyPT5TdHJpbmcocltkaW1dPz8nU2luIGRhdG8nKSkuc29ydCgoYSxiKT0+Yi5jZC1hLmNkKSxjb2xzPVsnY2QnLCd3ZCcsJ2JldCcsJ3BvJywncG9uJywncHJvbW8nLCd3aW4nLCdjb2luJywnc2QnXTsKICBjb250ZW50PWA8ZGl2IGNsYXNzPSJjaGFydHMiPiR7Z3JhcGhDYXJkKCdDb2luIEluIHBvciBtw6FxdWluYS1kw61hJyxiYXJzVjIobGlzdC5zbGljZSgwLDEyKSwnY2QnKSl9JHtncmFwaENhcmQoJ1dpbiBwb3IgbcOhcXVpbmEtZMOtYScsYmFyc1YyKFsuLi5saXN0XS5zb3J0KChhLGIpPT5iLndkLWEud2QpLnNsaWNlKDAsMTIpLCd3ZCcpKX08L2Rpdj48ZGl2IGNsYXNzPSJjYXJkIj48aDI+UmVuZGltaWVudG8gcG9yICR7ZGltPT09Mj8nZmFicmljYW50ZSc6J3BsYXRhZm9ybWEnfTwvaDI+JHtyZXBvcnRUYWJsZShsaXN0LGNvbHMsZGltc1tkaW1dKX08L2Rpdj48cCBjbGFzcz0ic3VidGl0bGUiPkVsIGFyY2hpdm8gV2luIFRpdHRvIG5vIGluY2x1eWUgYcOxbyBkZSBmYWJyaWNhY2nDs246IG5vIHNlIGluZmllcmUgYW50aWfDvGVkYWQgcGFyYSBsb3MgZ3LDoWZpY29zIGRlbCBwYXJxdWUgcG9yIGVkYWQuPC9wPmA7CiAgZXhwb3J0RGF0YT1bW2RpbXNbZGltXSwuLi5jb2xzLm1hcChrPT5tZXRyaWNzW2tdKV0sLi4ubGlzdC5tYXAocD0+W3AubmFtZSwuLi5jb2xzLm1hcChrPT5wW2tdPz8nJyldKV07CiB9CiBleHBvcnRSb3dzPWV4cG9ydERhdGE7CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ03DoXMgaW5mb3JtZXMgZGVsIEV4Y2VsJywnU2Fsw7NuIHByZWZlcmVuY2lhbCwgV2luIC8gTG9zZSwgZmFicmljYW50ZXMsIHBsYXRhZm9ybWFzIHkgY29uY2lsaWFjacOzbiBkZSBsYSBmdWVudGUuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ0luZm9ybWUnLCdleHRyYUtpbmQnLHMua2luZCx7c2Fsb246J1NhbMOzbiBwcmVmZXJlbmNpYWwnLHdpbmxvc2U6J1dpbiAvIExvc2UgcG9yIG3DoXF1aW5hJyxicmFuZHM6J0ZhYnJpY2FudGVzJyxwbGF0Zm9ybXM6J1BsYXRhZm9ybWFzJyxxdWFsaXR5OidDb25jaWxpYWNpw7NuIGRlIFdpbiBUaXR0byd9KX08L2Rpdj4ke3Mua2luZD09PSdxdWFsaXR5Jz8nJzpgPGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocywnZXh0cmEnKX08L2Rpdj5gfTwvc2VjdGlvbj5gK2NvbnRlbnQ7CiBiaW5kRmlsdGVycygpOyQoJyNleHRyYUtpbmQnKS5vbmNoYW5nZT1lPT57cy5raW5kPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpfTsKfQpjb25zdCByZW5kZXJCZWZvcmVSZXBvcnRzPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBpZighZGF0YSlyZXR1cm47CiBpZihbJ1JlcG9ydGUgc2VtYW5hbCcsJ1JlcG9ydGUgbWVuc3VhbCcsJ0V2b2x1dGl2byBtZW5zdWFsJywnT3Ryb3MgaW5mb3JtZXMnXS5pbmNsdWRlcyh0YWIpKXsKICAkKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nYmxvY2snO2RvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjskKCcjdmlld0hlbHAnKS50ZXh0Q29udGVudD0nRmVjaGFzIGRlIGVzdGUgaW5mb3JtZS4nOyQoJyN0aXRsZScpLnRleHRDb250ZW50PXRhYjsKICBpZih0YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJylwZXJpb2RSZXBvcnRzKCd3ZWVrJyk7ZWxzZSBpZih0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJylwZXJpb2RSZXBvcnRzKCdtb250aCcpO2Vsc2UgaWYodGFiPT09J0V2b2x1dGl2byBtZW5zdWFsJyltb250aGx5RXZvbHV0aW9uUmVwb3J0KCk7ZWxzZSBleHRyYVJlcG9ydHMoKTsKIH1lbHNle3JlbmRlckJlZm9yZVJlcG9ydHMoKTtpZih0YWI9PT0nTWV0b2RvbG9nw61hJykkKCcjY29udGVudCcpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsJzxkaXYgY2xhc3M9Im5vdGljZSI+Q2FyZ2EgZGlyZWN0YTogV2luIFRpdHRvIG8gUmVwb3J0ZSBMQSDihpIgTWF0cml6LiBTZSBhc2lnbmFuIGNvbHVtbmFzIHBvciBlbmNhYmV6YWRvIHkgc2UgY2FsY3VsYW4gU2VtYW5hLCBNZXMgeSBkw61hLiBQb3IgZGVmZWN0bywgbG9zIGTDrWFzIHJlY2liaWRvcyByZWVtcGxhemFuIGVzb3MgZMOtYXMgZGVsIGhpc3TDs3JpY287IGxvcyBkZW3DoXMgc2UgY29uc2VydmFuLiBMb3MgaW5mb3JtZXMgdXNhbiByZWdpc3Ryb3MgZGVsIGhpc3TDs3JpY28sIG5vIHRhYmxhcyBkaW7DoW1pY2FzIGd1YXJkYWRhcy4gTG9zIGdyw6FmaWNvcyBjb21iaW5hZG9zIHRpZW5lbiBlamVzIGluZGVwZW5kaWVudGVzIHkgdW5pZGFkZXMgaW5kaWNhZGFzLiBObyBzZSByZXByb2R1Y2VuIHJlZmVyZW5jaWFzIGRlZmVjdHVvc2FzIGRlbCBFeGNlbCBuaSBzZSBpbnZlbnRhIGVsIGHDsW8gZGUgZmFicmljYWNpw7NuIHF1ZSBubyB0cmFlIFdpbiBUaXR0by48L2Rpdj4nKX0KfTsKJCgnI25hdicpLmlubmVySFRNTD10YWJzVjMubWFwKCh0LGkpPT5gPGJ1dHRvbiBkYXRhLXRhYj0iJHt0fSIgY2xhc3M9IiR7dD09PXRhYj8nYWN0aXZlJzonJ30iPiR7Wyfil6snLCfilqQnLCfihpcnLCfil44nLCfilqUnLCfilqYnLCfijIEnLCfilqMnLCfik5gnXVtpXX0gJm5ic3A7ICR7dH08L2J1dHRvbj5gKS5qb2luKCcnKTsKZnVuY3Rpb24gYWN0aXZhdGVUYWJWMyh0KXt0YWI9dDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYi5kYXRhc2V0LnRhYj09PXRhYikpO3JlbmRlcigpfQpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoYi5kYXRhc2V0LnRhYikpOwokKCcjdjJzYXZlJykub25jbGljaz1hc3luYygpPT57aWYoIWRhdGEpcmV0dXJuO2NvbnN0IG5hbWU9cHJvbXB0KCdOb21icmUgZGUgbGEgdmlzdGEnKTtpZighbmFtZSlyZXR1cm47bGV0IG5leHQ9Wy4uLnNhdmVkVmlld3Mse3ZlcnNpb246MyxuYW1lLHRhYixmcm9tOiQoJyNmcm9tJykudmFsdWUsdG86JCgnI3RvJykudmFsdWUsc3RhdGU6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUpKX1dO3RyeXthd2FpdCBycGMoJ3NhdmVWaWV3cycsSlNPTi5zdHJpbmdpZnkobmV4dCkpO3NhdmVkVmlld3M9bmV4dDtsb2FkVmlld3MoKX1jYXRjaChlKXthbGVydCgnTm8gc2UgZ3VhcmTDszogJytlLm1lc3NhZ2UpfX07CmxvYWRWaWV3cz1mdW5jdGlvbigpeyQoJyN2MnZpZXdzJykuaW5uZXJIVE1MPSc8b3B0aW9uIHZhbHVlPSIiPlZpc3RhcyBndWFyZGFkYXM8L29wdGlvbj4nK3NhdmVkVmlld3MubWFwKCh2LGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHtlc2Modi5uYW1lKX0ke3YudmVyc2lvbj49Mj8nJzonIChhbnRlcmlvciknfTwvb3B0aW9uPmApLmpvaW4oJycpfTsKJCgnI3Yydmlld3MnKS5vbmNoYW5nZT0oKT0+e2lmKCQoJyN2MnZpZXdzJykudmFsdWU9PT0nJylyZXR1cm47Y29uc3Qgdj1zYXZlZFZpZXdzWyQoJyN2MnZpZXdzJykudmFsdWVdO2lmKHYudmVyc2lvbjwyfHwhdi5zdGF0ZSl7YWxlcnQoJ0NyZWEgZGUgbnVldm8gZXN0YSB2aXN0YSBkZWwgZGlzZcOxbyBpbmljaWFsLicpO3JldHVybn1PYmplY3QuYXNzaWduKHZpZXdTdGF0ZSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHYuc3RhdGUpKSk7JCgnI2Zyb20nKS52YWx1ZT12LmZyb207JCgnI3RvJykudmFsdWU9di50bzthY3RpdmF0ZVRhYlYzKHYudGFiKX07CmNvbnN0IHJlc2V0QmVmb3JlUmVwb3J0cz0kKCcjcmVzZXQnKS5vbmNsaWNrOyQoJyNyZXNldCcpLm9uY2xpY2s9KCk9Pntjb25zdCBrZXk9eydSZXBvcnRlIHNlbWFuYWwnOid3ZWVrbHknLCdSZXBvcnRlIG1lbnN1YWwnOidtb250aGx5JywnRXZvbHV0aXZvIG1lbnN1YWwnOidtb250aGx5RXZvbHV0aW9uJywnT3Ryb3MgaW5mb3JtZXMnOidleHRyYSd9W3RhYl07aWYoa2V5KXt2aWV3U3RhdGVba2V5XS5maWx0ZXJzPXt9O2xldFttaW4sbWF4XT1kYXRlUmFuZ2UoKTskKCcjZnJvbScpLnZhbHVlPW1pbjskKCcjdG8nKS52YWx1ZT1tYXg7cmVuZGVyKCl9ZWxzZSByZXNldEJlZm9yZVJlcG9ydHMoKX07Ci8vIEFkanVzdG1lbnRzIGRvIG5vdCBhcHBlYXIgYXMgc2VsZWN0YWJsZSBtYWNoaW5lcywgYmFua3MsIHNlY3RvcnMgb3IgbWFudWZhY3R1cmVycy4KY29uc3Qgb3B0aW9uc0JlZm9yZVJlcG9ydHM9b3B0aW9uc0ZvcjsKb3B0aW9uc0Zvcj1mdW5jdGlvbihrKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLmZpbHRlcihyPT4haXNFeHBpcmVkKHJbNV0pJiYhaXNFeHBpcmVkKHJbN10pKS5tYXAocj0+U3RyaW5nKHJba10/PydTaW4gZGF0bycpKSldLmZpbHRlcih2PT4haXNFeHBpcmVkKHYpKS5zb3J0KChhLGIpPT5hLmxvY2FsZUNvbXBhcmUoYix1bmRlZmluZWQse251bWVyaWM6dHJ1ZX0pKX07CgpsZXQgY2hhcnRDb3VudGVyVjQ9MDsKY29uc3QgY2hhcnRQb2ludHNWND1uZXcgTWFwKCk7CmZ1bmN0aW9uIHBlcmlvZERlc2NyaXB0aW9uVjQobmFtZSxwb2ludHMpewogY29uc3Qgcm93cz1wb2ludHMuZmxhdE1hcChwPT5wLnJvd3N8fFtdKSxkYXRlcz1bLi4ubmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKTsKIGlmKCFkYXRlcy5sZW5ndGgpcmV0dXJuIHtsYWJlbDpuYW1lLHJhbmdlOicnLGZ1bGw6bmFtZX07CiBjb25zdCByYW5nZT1kYXRlc1swXT09PWRhdGVzLmF0KC0xKT9kYXRlc1swXTpkYXRlc1swXSsnIOKGkiAnK2RhdGVzLmF0KC0xKTsKIHJldHVybiB7bGFiZWw6bmFtZSxyYW5nZSxmdWxsOm5hbWUrJyDCtyBEYXRvczogJytyYW5nZSsnIMK3ICcrZGF0ZXMubGVuZ3RoKycgZMOtYXMgcmVnaXN0cmFkb3MnfTsKfQpmdW5jdGlvbiB2YWx1ZVY0KHZhbHVlLGtleSl7cmV0dXJuIGZtdCh2YWx1ZSxrZXkpKyhbJ3dpbicsJ2NvaW4nLCd3ZCcsJ2NkJywnYmV0JywncHJvbW8nLCdwcml6ZSddLmluY2x1ZGVzKGtleSkmJnZhbHVlIT1udWxsPycgQ0xQJzonJyl9CmZ1bmN0aW9uIGxhYmVsZWRDaGFydFY0KHNlcmllcyxrZXksZHVhbEtleXM9bnVsbCl7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogaWYoIWxhYmVscy5sZW5ndGgpcmV0dXJuICc8ZGl2IGNsYXNzPSJlbXB0eSI+U2luIGRhdG9zIHBhcmEgZXN0ZSBwZXLDrW9kby48L2Rpdj4nOwogY29uc3QgaWQ9J2NoYXJ0djQtJysoKytjaGFydENvdW50ZXJWNCksY29sb3JzPVsnIzI3YjhiZCcsJyM2NjhmY2InLCcjOGVjNmExJywnI2MwYTVkZicsJyNkOWFkNmUnLCcjZTY5NDhjJywnIzhjYmJjOScsJyNjNGNiODYnXTsKIGNvbnN0IGVudHJpZXM9bGFiZWxzLm1hcChsYWJlbD0+e2NvbnN0IHBvaW50cz1zZXJpZXMubWFwKHM9PnMucG9pbnRzLmZpbmQocD0+cC5uYW1lPT09bGFiZWwpKTtyZXR1cm4ge3BlcmlvZDpwZXJpb2REZXNjcmlwdGlvblY0KGxhYmVsLHBvaW50cy5maWx0ZXIoQm9vbGVhbikpLHZhbHVlczpwb2ludHMubWFwKChwLGkpPT5wPy5bZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5XT8/bnVsbCl9fSk7CiBjb25zdCB3aWR0aD1NYXRoLm1heCg2ODAsbGFiZWxzLmxlbmd0aCoxMDArMTIwKSxsZWZ0PTYwLHJpZ2h0PXdpZHRoLTYwLHRvcD03MCxib3R0b209MjQwLHg9aT0+bGFiZWxzLmxlbmd0aD09PTE/d2lkdGgvMjpsZWZ0K2kvKGxhYmVscy5sZW5ndGgtMSkqKHJpZ2h0LWxlZnQpOwogY29uc3QgYWxsVmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5lLnZhbHVlcykuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7CiBjb25zdCBjb21tb249e2xvOk1hdGgubWluKDAsLi4uYWxsVmFsdWVzKSxoaTpNYXRoLm1heCgxLC4uLmFsbFZhbHVlcyl9OwogY29uc3Qgc2NhbGVzPXNlcmllcy5tYXAoKHMsaSk9PntpZighZHVhbEtleXMpcmV0dXJuIGNvbW1vbjtsZXQgdmFscz1lbnRyaWVzLm1hcChlPT5lLnZhbHVlc1tpXSkuZmlsdGVyKHY9PnYhPW51bGwmJk51bWJlci5pc0Zpbml0ZSh2KSk7cmV0dXJuIHtsbzpNYXRoLm1pbigwLC4uLnZhbHMpLGhpOk1hdGgubWF4KDAuMDAwMDAxLC4uLnZhbHMpfX0pOwogY29uc3QgeT0odixpKT0+Ym90dG9tLSh2LXNjYWxlc1tpXS5sbykvKHNjYWxlc1tpXS5oaS1zY2FsZXNbaV0ubG98fDEpKihib3R0b20tdG9wKTsKIGNvbnN0IHRleHRzPWVudHJpZXMubWFwKGU9PmUucGVyaW9kLmZ1bGwrJyB8ICcrc2VyaWVzLm1hcCgocyxpKT0+cy5uYW1lKyc6ICcrdmFsdWVWNChlLnZhbHVlc1tpXSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpKS5qb2luKCcgfCAnKSk7Y2hhcnRQb2ludHNWNC5zZXQoaWQsdGV4dHMpOwogY29uc3QgbGVnZW5kPWA8ZGl2IGNsYXNzPSJsZWdlbmQgbGFiZWxlZGxlZ2VuZCI+JHtzZXJpZXMubWFwKChzLGkpPT5gPHNwYW4+PGkgc3R5bGU9ImJhY2tncm91bmQ6JHtjb2xvcnNbaSVjb2xvcnMubGVuZ3RoXX0iPjwvaT4ke2VzYyhzLm5hbWUpfSR7ZHVhbEtleXM/KGk9PT0wPycgwrcgZWplIGl6cXVpZXJkbyc6JyDCtyBlamUgZGVyZWNobycpOicnfTwvc3Bhbj5gKS5qb2luKCcnKX08L2Rpdj5gOwogbGV0IGxpbmVzPXNlcmllcy5tYXAoKHMsaSk9PnsKICBjb25zdCB2YWxpZD1lbnRyaWVzLm1hcCgoZSxqKT0+KHtlLGp9KSkuZmlsdGVyKCh7ZX0pPT5lLnZhbHVlc1tpXSE9bnVsbCk7CiAgcmV0dXJuIGA8cG9seWxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke2NvbG9yc1tpJWNvbG9ycy5sZW5ndGhdfSIgc3Ryb2tlLXdpZHRoPSIzIiBwb2ludHM9IiR7dmFsaWQubWFwKCh7ZSxqfSk9PmAke3goail9LCR7eShlLnZhbHVlc1tpXSxpKX1gKS5qb2luKCcgJyl9Ii8+JHt2YWxpZC5tYXAoKHtlLGp9KT0+ewogICBjb25zdCBjeT15KGUudmFsdWVzW2ldLGkpLG90aGVyPWR1YWxLZXlzJiZlLnZhbHVlc1sxLWldIT1udWxsP3koZS52YWx1ZXNbMS1pXSwxLWkpOm51bGw7CiAgIGNvbnN0IG9mZnNldD1vdGhlcj09bnVsbD8tMTM6KGN5PD1vdGhlcj8tMTM6MjIpOwogICByZXR1cm4gYDxjaXJjbGUgY3g9IiR7eChqKX0iIGN5PSIke2N5fSIgcj0iNiIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iIHN0cm9rZT0idmFyKC0tcGxvdGJnKSIgc3Ryb2tlLXdpZHRoPSIyIiB0YWJpbmRleD0iMCIgcm9sZT0iYnV0dG9uIiBkYXRhLWNoYXJ0djQ9IiR7aWR9IiBkYXRhLXBvaW50djQ9IiR7an0iIGFyaWEtbGFiZWw9IiR7ZXNjKHRleHRzW2pdKX0iPjx0aXRsZT4ke2VzYyh0ZXh0c1tqXSl9PC90aXRsZT48L2NpcmNsZT4ke3Nlcmllcy5sZW5ndGg8PTI/YDx0ZXh0IHg9IiR7eChqKX0iIHk9IiR7Y3krb2Zmc2V0fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iJHtwb2ludENvbG9yVjYoZW50cmllcyxqLGksZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX0iPiR7ZXNjKGNvbXBhY3QoZS52YWx1ZXNbaV0sZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KSl9PC90ZXh0PmA6Jyd9YDsKICB9KS5qb2luKCcnKX1gOwogfSkuam9pbignJyk7CiBjb25zdCB0aWNrcz1bMCwuNSwxXS5tYXAoZj0+e2NvbnN0IHl5PWJvdHRvbS1mKihib3R0b20tdG9wKTtyZXR1cm4gYDxsaW5lIHgxPSIke2xlZnR9IiB5MT0iJHt5eX0iIHgyPSIke3JpZ2h0fSIgeTI9IiR7eXl9IiBzdHJva2U9InZhcigtLXBsb3RncmlkKSIgc3Ryb2tlLWRhc2hhcnJheT0iMyA0Ii8+PHRleHQgeD0iJHtsZWZ0LTEyfSIgeT0iJHt5eSs0fSIgdGV4dC1hbmNob3I9ImVuZCIgZm9udC1zaXplPSIxMCIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhjb21wYWN0KHNjYWxlc1swXS5sbytmKihzY2FsZXNbMF0uaGktc2NhbGVzWzBdLmxvKSxkdWFsS2V5cz9kdWFsS2V5c1swXTprZXkpKX08L3RleHQ+JHtkdWFsS2V5cz9gPHRleHQgeD0iJHtyaWdodCsxMn0iIHk9IiR7eXkrNH0iIGZvbnQtc2l6ZT0iMTAiIGZpbGw9InZhcigtLXBsb3R0ZXh0KSI+JHtlc2MoY29tcGFjdChzY2FsZXNbMV0ubG8rZiooc2NhbGVzWzFdLmhpLXNjYWxlc1sxXS5sbyksZHVhbEtleXNbMV0pKX08L3RleHQ+YDonJ31gfSkuam9pbignJyk7CiBjb25zdCBwZXJpb2RzPWVudHJpZXMubWFwKChlLGopPT5gPHRleHQgeD0iJHt4KGopfSIgeT0iMjg1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7YXhpc1BlcmlvZFYxNChlLnBlcmlvZC5sYWJlbCkucmVwbGFjZSgneD0iMCInLCd4PSInK3goaikrJyInKX08L3RleHQ+PHRleHQgeD0iJHt4KGopfSIgeT0iMzI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKGF4aXNEYXRlc1YxNChlLnBlcmlvZC5yYW5nZSkpfTwvdGV4dD5gKS5qb2luKCcnKTsKIGNvbnN0IGRldGFpbHM9YDxkaXYgY2xhc3M9ImNoYXJ0ZGF0YXdyYXAiPjx0YWJsZSBjbGFzcz0iY2hhcnRkYXRhdGFibGUiPjxjYXB0aW9uPlZhbG9yZXMgZXhhY3RvcyBkZSB0b2RvcyBsb3MgcHVudG9zPC9jYXB0aW9uPjx0aGVhZD48dHI+PHRoPlBlcsOtb2RvPC90aD48dGg+RmVjaGFzIGNvbiBkYXRvczwvdGg+JHtzZXJpZXMubWFwKHM9PmA8dGg+JHtlc2Mocy5uYW1lKX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHtlbnRyaWVzLm1hcChlPT5gPHRyPjx0ZD4ke2VzYyhlLnBlcmlvZC5sYWJlbCl9PC90ZD48dGQ+JHtlc2MoZS5wZXJpb2QucmFuZ2V8fCfigJQnKX08L3RkPiR7ZS52YWx1ZXMubWFwKCh2LGkpPT57Y29uc3QgaW5kZXg9ZW50cmllcy5pbmRleE9mKGUpLHNpZ25hbD1wb2ludFNpZ25hbFY2KGVudHJpZXMsaW5kZXgsaSxkdWFsS2V5cz9kdWFsS2V5c1tpXTprZXkpO3JldHVybiBgPHRkIGNsYXNzPSJ0cmFmZmljLSR7c2lnbmFsLnN0YXRlfSIgdGl0bGU9IiR7ZXNjKHNpZ25hbC5sYWJlbCl9Ij4ke3NpZ25hbC5zdGF0ZT09PSduZXV0cmFsJz8nJzon4pePICd9JHt2YWx1ZVY0KHYsZHVhbEtleXM/ZHVhbEtleXNbaV06a2V5KX08L3RkPmB9KS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj5gOwogcmV0dXJuIGxlZ2VuZCtgPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPjxzdmcgY2xhc3M9ImxhYmVsZWRzdmciIHN0eWxlPSJmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmO3dpZHRoOiR7d2lkdGh9cHg7bWluLXdpZHRoOjEwMCU7aGVpZ2h0OjM1MHB4IiB2aWV3Qm94PSIwIDAgJHt3aWR0aH0gMzUwIiByb2xlPSJpbWciIGFyaWEtbGFiZWw9IiR7ZXNjKHNlcmllcy5tYXAocz0+cy5uYW1lKS5qb2luKCcgeSAnKSl9Ij4ke3RpY2tzfSR7bGluZXN9JHtwZXJpb2RzfTwvc3ZnPjwvZGl2PjxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0iY2hhcnRyZWFkb3V0IiBhcmlhLWxpdmU9InBvbGl0ZSI+UGFzYSBlbCBjdXJzb3IsIHRvY2EgbyBlbmZvY2EgdW4gcHVudG8gcGFyYSB2ZXIgc3UgcGVyw61vZG8geSB0b2RvcyBzdXMgdmFsb3Jlcy4gU2kgaGF5IG11Y2hvcyBwZXLDrW9kb3MsIGRlc2xpemEgZWwgZ3LDoWZpY28gaG9yaXpvbnRhbG1lbnRlLjwvZGl2PmArZGV0YWlsczsKfQpjaGFydFYyPWZ1bmN0aW9uKHNlcmllcyxrZXkpe3JldHVybiBsYWJlbGVkQ2hhcnRWNChzZXJpZXMsa2V5KX07CmNvbWJpbmVkQ2hhcnQ9ZnVuY3Rpb24ocG9pbnRzLGZpcnN0LHNlY29uZCl7cmV0dXJuIGxhYmVsZWRDaGFydFY0KFt7bmFtZTptZXRyaWNzW2ZpcnN0XSxwb2ludHN9LHtuYW1lOm1ldHJpY3Nbc2Vjb25kXSxwb2ludHN9XSxudWxsLFtmaXJzdCxzZWNvbmRdKX07CmZ1bmN0aW9uIGluc3BlY3RQb2ludFY0KGV2ZW50KXtjb25zdCB0YXJnZXQ9ZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/LignW2RhdGEtY2hhcnR2NF0nKTtpZighdGFyZ2V0KXJldHVybjtjb25zdCB2YWx1ZXM9Y2hhcnRQb2ludHNWNC5nZXQodGFyZ2V0LmRhdGFzZXQuY2hhcnR2NCkscmVhZG91dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQuZGF0YXNldC5jaGFydHY0KTtpZih2YWx1ZXMmJnJlYWRvdXQpcmVhZG91dC50ZXh0Q29udGVudD12YWx1ZXNbK3RhcmdldC5kYXRhc2V0LnBvaW50djRdfQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyb3ZlcicsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLGluc3BlY3RQb2ludFY0KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsaW5zcGVjdFBvaW50VjQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VudGVyJ3x8ZXZlbnQua2V5PT09JyAnKXtpZihldmVudC50YXJnZXQuY2xvc2VzdD8uKCdbZGF0YS1jaGFydHY0XScpKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2luc3BlY3RQb2ludFY0KGV2ZW50KX19fSk7CmNvbnN0IHJlbmRlckJlZm9yZVY0PXJlbmRlcjtyZW5kZXI9ZnVuY3Rpb24oKXtjaGFydFBvaW50c1Y0LmNsZWFyKCk7cmVuZGVyQmVmb3JlVjQoKX07Cgpjb25zdCBtb250aE5hbWVzVjU9WydlbmVybycsJ2ZlYnJlcm8nLCdtYXJ6bycsJ2FicmlsJywnbWF5bycsJ2p1bmlvJywnanVsaW8nLCdhZ29zdG8nLCdzZXB0aWVtYnJlJywnb2N0dWJyZScsJ25vdmllbWJyZScsJ2RpY2llbWJyZSddOwpmdW5jdGlvbiBkaXNwbGF5RGF0ZXNWNSh2YWx1ZSl7CiByZXR1cm4gU3RyaW5nKHZhbHVlPz8nJykucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSktKFxkezJ9KVxiL2csKG1hdGNoLHksbSxkKT0+ewogIGNvbnN0IG1vbnRoPSttO2lmKG1vbnRoPDF8fG1vbnRoPjEyfHwrZDwxfHwrZD4zMSlyZXR1cm4gbWF0Y2g7CiAgcmV0dXJuIGAke051bWJlcihkKX0gJHttb250aE5hbWVzVjVbbW9udGgtMV19ICR7eX1gOwogfSkucmVwbGFjZSgvXGIoXGR7NH0pLShcZHsyfSlcYi9nLChtYXRjaCx5LG0pPT57CiAgY29uc3QgbW9udGg9K207aWYobW9udGg8MXx8bW9udGg+MTIpcmV0dXJuIG1hdGNoOwogIGNvbnN0IG5hbWU9bW9udGhOYW1lc1Y1W21vbnRoLTFdO3JldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkrbmFtZS5zbGljZSgxKSsnICcreTsKIH0pLnJlcGxhY2UoL1xiKFxkezR9KSDCtyBTKFxkezEsMn0pXGIvZywobWF0Y2gseSx3KT0+YFNlbWFuYSAke051bWJlcih3KX0gwrcgJHt5fWApOwp9CmNvbnN0IHBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjU9cGVyaW9kRGVzY3JpcHRpb25WNDsKcGVyaW9kRGVzY3JpcHRpb25WND1mdW5jdGlvbihuYW1lLHBvaW50cyl7CiBjb25zdCBwPXBlcmlvZERlc2NyaXB0aW9uQmVmb3JlVjUobmFtZSxwb2ludHMpOwogcmV0dXJuIHtsYWJlbDpkaXNwbGF5RGF0ZXNWNShwLmxhYmVsKSxyYW5nZTpkaXNwbGF5RGF0ZXNWNShwLnJhbmdlKSxmdWxsOmRpc3BsYXlEYXRlc1Y1KHAuZnVsbCl9Owp9OwpmdW5jdGlvbiBmb3JtYXRUZXh0RGF0ZXNWNShyb290KXsKIGlmKCFyb290KXJldHVybjsKIGlmKHJvb3Qubm9kZVR5cGU9PT0zKXsKICBpZihyb290LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGNvbnN0IHRleHQ9ZGlzcGxheURhdGVzVjUocm9vdC5ub2RlVmFsdWUpO2lmKHRleHQhPT1yb290Lm5vZGVWYWx1ZSlyb290Lm5vZGVWYWx1ZT10ZXh0OwogIHJldHVybjsKIH0KIGlmKHJvb3Qubm9kZVR5cGU9PT0xKXsKICBpZihyb290Lm1hdGNoZXMoJ3NjcmlwdCxzdHlsZSxvcHRpb24sdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdJykpcmV0dXJuOwogIGZvcihjb25zdCBjaGlsZCBvZiByb290LmNoaWxkTm9kZXMpZm9ybWF0VGV4dERhdGVzVjUoY2hpbGQpOwogfQp9CmNvbnN0IHJlbmRlckJlZm9yZVY1PXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlVjUoKTtmb3JtYXRUZXh0RGF0ZXNWNShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJykpfTsKLy8gU3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnRlcmFjdGl2ZSBwb2ludCBkZXRhaWxzIGNhbiB1cGRhdGUgYWZ0ZXIgYSByZW5kZXIuCmNvbnN0IGRhdGVPYnNlcnZlclY1PW5ldyBNdXRhdGlvbk9ic2VydmVyKHJlY29yZHM9PnsKIGZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7CiAgaWYocmVjb3JkLnR5cGU9PT0nY2hhcmFjdGVyRGF0YScpZm9ybWF0VGV4dERhdGVzVjUocmVjb3JkLnRhcmdldCk7CiAgZWxzZSBmb3IoY29uc3Qgbm9kZSBvZiByZWNvcmQuYWRkZWROb2Rlcylmb3JtYXRUZXh0RGF0ZXNWNShub2RlKTsKIH0KfSk7CmRhdGVPYnNlcnZlclY1Lm9ic2VydmUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpLHtjaGlsZExpc3Q6dHJ1ZSxjaGFyYWN0ZXJEYXRhOnRydWUsc3VidHJlZTp0cnVlfSk7CmNvbnN0IGV4cG9ydEJlZm9yZVY1PSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGNvbnN0IG9yaWdpbmFsPWV4cG9ydFJvd3M7CiB0cnl7ZXhwb3J0Um93cz1vcmlnaW5hbC5tYXAocm93PT5yb3cubWFwKHY9PnR5cGVvZiB2PT09J3N0cmluZyc/ZGlzcGxheURhdGVzVjUodik6dikpO3JldHVybiBleHBvcnRCZWZvcmVWNSgpfQogZmluYWxseXtleHBvcnRSb3dzPW9yaWdpbmFsfQp9OwoKY29uc3QgcmF0aW9LZXlzVjY9WydyYXRpbycsJ3JzJywncmInXTsKY29uc3QgdHJhZmZpY0NvbG9yc1Y2PXtyZWQ6JyNkNzQ3NDcnLHllbGxvdzonI2Q2OWIxNicsZ3JlZW46JyMxNjg0NTQnLG5ldXRyYWw6JyM4Mzk1YTUnfTsKZnVuY3Rpb24gcmF0aW9MaW1pdHNWNigpe2NvbnN0IHM9dmlld1N0YXRlLnJhdGlvcztyZXR1cm4ge3JlZDpOdW1iZXIuaXNGaW5pdGUocy5yZWRMaW1pdCk/cy5yZWRMaW1pdDouNjUsZ3JlZW46TnVtYmVyLmlzRmluaXRlKHMuZ3JlZW5MaW1pdCk/cy5ncmVlbkxpbWl0OjF9fQpmdW5jdGlvbiByYXRpb1NpZ25hbFY2KHZhbHVlKXsKIGlmKHZhbHVlPT1udWxsfHwhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIHJlZmVyZW5jaWEgZGlzcG9uaWJsZSd9OwogY29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTsKIHJldHVybiB2YWx1ZTxsaW1pdHMucmVkP3tzdGF0ZToncmVkJyxsYWJlbDonQmFqbzogbWVub3IgcXVlICcrbGltaXRzLnJlZCsnw5cnfTp2YWx1ZTxsaW1pdHMuZ3JlZW4/e3N0YXRlOid5ZWxsb3cnLGxhYmVsOidNZWRpbyBhIGJham86IGVudHJlICcrbGltaXRzLnJlZCsnw5cgeSAnK2xpbWl0cy5ncmVlbisnw5cnfTp7c3RhdGU6J2dyZWVuJyxsYWJlbDonRW4gbyBzb2JyZSBlbCBuaXZlbCBlc3BlcmFkbzogZGVzZGUgJytsaW1pdHMuZ3JlZW4rJ8OXJ307Cn0KZnVuY3Rpb24gcmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KXsKIGlmKHJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIHJhdGlvU2lnbmFsVjYodmFsdWUpOwogaWYodmFsdWU9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gZGF0b3MnfTsKIGlmKCFbJ3dpbicsJ3dkJywnY29pbicsJ2NkJywnc3BpbicsJ3NkJ10uaW5jbHVkZXMoa2V5KSlyZXR1cm4ge3N0YXRlOiduZXV0cmFsJyxsYWJlbDonU2luIG1ldGEgZGVmaW5pZGE6IG5vIHNlIGNhbGlmaWNhIGNvbW8gYnVlbm8gbyBtYWxvJ307CiBpZigoa2V5PT09J3dpbid8fGtleT09PSd3ZCcpJiZ2YWx1ZTwwKXJldHVybiB7c3RhdGU6J3JlZCcsbGFiZWw6J1dpbiBuZWdhdGl2byd9OwogaWYocHJldmlvdXM9PW51bGx8fCFOdW1iZXIuaXNGaW5pdGUocHJldmlvdXMpKXJldHVybiB7c3RhdGU6J25ldXRyYWwnLGxhYmVsOidTaW4gcGVyw61vZG8gYW50ZXJpb3IgZGlzcG9uaWJsZSd9OwogaWYoKGtleT09PSd3aW4nfHxrZXk9PT0nd2QnKSYmcHJldmlvdXM8MClyZXR1cm4ge3N0YXRlOidncmVlbicsbGFiZWw6J1dpbiBwYXPDsyBkZSBuZWdhdGl2byBhIG5vIG5lZ2F0aXZvJ307CiByZXR1cm4gdmFsdWU+PXByZXZpb3VzP3tzdGF0ZTonZ3JlZW4nLGxhYmVsOidJZ3VhbCBvIHN1cGVyaW9yIGFsIHBlcsOtb2RvIGFudGVyaW9yIG1vc3RyYWRvJ306e3N0YXRlOidyZWQnLGxhYmVsOidJbmZlcmlvciBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkbyd9Owp9CmZ1bmN0aW9uIHBvaW50U2lnbmFsVjYoZW50cmllcyxqLGksa2V5KXtyZXR1cm4gcmVwb3J0U2lnbmFsVjYoZW50cmllc1tqXS52YWx1ZXNbaV0saj9lbnRyaWVzW2otMV0udmFsdWVzW2ldOm51bGwsa2V5KX0KZnVuY3Rpb24gcG9pbnRDb2xvclY2KGVudHJpZXMsaixpLGtleSl7cmV0dXJuIHRyYWZmaWNDb2xvcnNWNltwb2ludFNpZ25hbFY2KGVudHJpZXMsaixpLGtleSkuc3RhdGVdfQpmdW5jdGlvbiBzaWduYWxDZWxsVjYodmFsdWUsa2V5LHByZXZpb3VzKXtjb25zdCBzaWduYWw9cmVwb3J0U2lnbmFsVjYodmFsdWUscHJldmlvdXMsa2V5KTtyZXR1cm4gYDx0ZCBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+JHtzaWduYWwuc3RhdGU9PT0nbmV1dHJhbCc/Jyc6YDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj7il48gPC9zcGFuPmB9JHtmbXQodmFsdWUsa2V5KX08L3RkPmB9CmNvbnN0IGJhcnNCZWZvcmVWNj1iYXJzVjI7CmJhcnNWMj1mdW5jdGlvbihpdGVtcyxrZXksY29sb3IpewogaWYoIXJhdGlvS2V5c1Y2LmluY2x1ZGVzKGtleSkpcmV0dXJuIGJhcnNCZWZvcmVWNihpdGVtcyxrZXksY29sb3IpOwogY29uc3QgbWF4PU1hdGgubWF4KDEsLi4uaXRlbXMubWFwKHI9Pk1hdGguYWJzKHJba2V5XT8/MCkpKTsKIHJldHVybiBpdGVtcy5tYXAocj0+e2NvbnN0IHNpZ25hbD1yYXRpb1NpZ25hbFY2KHJba2V5XSk7cmV0dXJuIGA8ZGl2IGNsYXNzPSJiYXJyb3ciIHRpdGxlPSIke2VzYyhzaWduYWwubGFiZWwpfSI+PHNwYW4gY2xhc3M9ImJhcmxhYmVsIj4ke2VzYyhyLm5hbWUpfTwvc3Bhbj48ZGl2IGNsYXNzPSJ0cmFjayI+PGRpdiBjbGFzcz0iYmFyIiBzdHlsZT0id2lkdGg6JHtNYXRoLmFicyhyW2tleV0/PzApL21heCoxMDB9JTtiYWNrZ3JvdW5kOiR7dHJhZmZpY0NvbG9yc1Y2W3NpZ25hbC5zdGF0ZV19Ij48L2Rpdj48L2Rpdj48YiBjbGFzcz0idHJhZmZpYy0ke3NpZ25hbC5zdGF0ZX0iPiR7Zm10KHJba2V5XSxrZXkpfTwvYj48L2Rpdj5gfSkuam9pbignJyk7Cn07CnJlcG9ydFRhYmxlPWZ1bmN0aW9uKGxpc3QsY29scyxwZXJpb2RMYWJlbD0nUGVyw61vZG8nKXsKIGNvbnN0IHRlbXBvcmFsPWxpc3QuZXZlcnkocj0+L15cZHs0fSgtXGR7Mn18IMK3IFNcZHsxLDJ9fC1UWzEtNF0pJC8udGVzdChyLm5hbWUpKTsKIHJldHVybiBgPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj48dGg+JHtwZXJpb2RMYWJlbH08L3RoPjx0aD5Db2JlcnR1cmE8L3RoPiR7Y29scy5tYXAoaz0+YDx0aD4ke21ldHJpY3Nba119PC90aD5gKS5qb2luKCcnKX08L3RyPjwvdGhlYWQ+PHRib2R5PiR7bGlzdC5tYXAoKHIsaSk9PmA8dHI+PHRkPiR7ZXNjKHIubmFtZSl9PC90ZD48dGQ+JHtjb3ZlcmFnZUxhYmVsKHIucm93cyl9PC90ZD4ke2NvbHMubWFwKGs9PnNpZ25hbENlbGxWNihyW2tdLGssdGVtcG9yYWwmJmk/bGlzdFtpLTFdW2tdOm51bGwpKS5qb2luKCcnKX08L3RyPmApLmpvaW4oJycpfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+U2Vtw6Fmb3JvIHRlbXBvcmFsOiBXaW4sIGFjdGl2aWRhZCB5IHNwaW5zIGZyZW50ZSBhbCBwZXLDrW9kbyBhbnRlcmlvciBtb3N0cmFkby4gVmVyZGUgPSBpZ3VhbCBvIHN1cGVyaW9yOyByb2pvID0gaW5mZXJpb3IgbyBXaW4gbmVnYXRpdm8uIFByaW1lciBwZXLDrW9kbyB5IG3DqXRyaWNhcyBzaW4gbWV0YTogbmV1dHJvcy4gUmV2aXNhIGxhIGNvYmVydHVyYSBkZSBkw61hcyBhbnRlcyBkZSBjb21wYXJhciB0b3RhbGVzLjwvcD5gOwp9OwpmdW5jdGlvbiBhcHBseVJhdGlvQ2VsbHNWNigpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5waWxsJykuZm9yRWFjaChlbD0+e2NvbnN0IHJhdz1lbC5kYXRhc2V0LnJhdGlvVjYsdGV4dD1lbC50ZXh0Q29udGVudC50cmltKCk7aWYocmF3PT1udWxsJiYhdGV4dC5lbmRzV2l0aCgnw5cnKSlyZXR1cm47Y29uc3QgdmFsdWU9cmF3PT09Jyc/bnVsbDpyYXchPW51bGw/TnVtYmVyKHJhdyk6TnVtYmVyKHRleHQuc2xpY2UoMCwtMSkucmVwbGFjZSgnLCcsJy4nKSk7Y29uc3Qgcz1yYXRpb1NpZ25hbFY2KHZhbHVlKTtlbC5jbGFzc0xpc3QucmVtb3ZlKCdsb3cnKTtlbC5jbGFzc0xpc3QuYWRkKCdyYXRpby0nK3Muc3RhdGUpO2VsLnRpdGxlPXMubGFiZWx9KX0KZnVuY3Rpb24gdHJhZmZpY0xlZ2VuZFY2KCl7Y29uc3QgbGltaXRzPXJhdGlvTGltaXRzVjYoKTtyZXR1cm4gYDxkaXYgY2xhc3M9InRyYWZmaWNMZWdlbmQiPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXJlZCI+4pePIEJham86ICZsdDsgJHtsaW1pdHMucmVkfcOXPC9zcGFuPjxzcGFuIGNsYXNzPSJ0cmFmZmljLXllbGxvdyI+4pePIE1lZGlvIGEgYmFqbzogJHtsaW1pdHMucmVkfcOXIGEgJmx0OyAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48c3BhbiBjbGFzcz0idHJhZmZpYy1ncmVlbiI+4pePIEVzcGVyYWRvIG8gc3VwZXJpb3I6IOKJpSAke2xpbWl0cy5ncmVlbn3Dlzwvc3Bhbj48L2Rpdj5gfQpjb25zdCByZW5kZXJCZWZvcmVWNj1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogcmVuZGVyQmVmb3JlVjYoKTtpZighZGF0YSlyZXR1cm47YXBwbHlSYXRpb0NlbGxzVjYoKTsKIGlmKHRhYj09PSdSYXRpb3MnKXsKICBjb25zdCBsaW1pdHM9cmF0aW9MaW1pdHNWNigpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC52aWV3YmFubmVyJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsYDxzZWN0aW9uIGNsYXNzPSJjYXJkIHRyYWZmaWNTZXR0aW5ncyI+PGgyPkNvbmZpZ3VyYWNpw7NuIGRlbCBzZW3DoWZvcm8gZGUgcmF0aW9zPC9oMj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxsYWJlbD5Mw61taXRlIHJvam8gLyBhbWFyaWxsbzxpbnB1dCBpZD0icmVkUmF0aW9WNiIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDUiIHZhbHVlPSIke2xpbWl0cy5yZWR9Ij48L2xhYmVsPjxsYWJlbD5OaXZlbCBlc3BlcmFkbzogaW5pY2lvIGRlbCB2ZXJkZTxpbnB1dCBpZD0iZ3JlZW5SYXRpb1Y2IiB0eXBlPSJudW1iZXIiIG1pbj0iMC4wMSIgc3RlcD0iMC4wNSIgdmFsdWU9IiR7bGltaXRzLmdyZWVufSI+PC9sYWJlbD48YnV0dG9uIGlkPSJhcHBseVJhdGlvVjYiPkFwbGljYXIgZXNjYWxhPC9idXR0b24+PC9kaXY+JHt0cmFmZmljTGVnZW5kVjYoKX08cCBjbGFzcz0ic2lnbmFsbm90ZSI+TGEgZXNjYWxhIHNlIGFwbGljYSBzb2xvIGEgcmF0aW9zLiAxw5cgZXMgZWwgdmFsb3IgZGUgbGEgcmVmZXJlbmNpYSBlbGVnaWRhLiBQdWVkZXMgZ3VhcmRhciBsYSBjb25maWd1cmFjacOzbiBqdW50byBjb24gbGEgdmlzdGEuPC9wPjwvc2VjdGlvbj5gKTsKICAkKCcjYXBwbHlSYXRpb1Y2Jykub25jbGljaz0oKT0+e2NvbnN0IHJlZD1OdW1iZXIoJCgnI3JlZFJhdGlvVjYnKS52YWx1ZSksZ3JlZW49TnVtYmVyKCQoJyNncmVlblJhdGlvVjYnKS52YWx1ZSk7aWYoIU51bWJlci5pc0Zpbml0ZShyZWQpfHwhTnVtYmVyLmlzRmluaXRlKGdyZWVuKXx8cmVkPDB8fGdyZWVuPD1yZWQpe2FsZXJ0KCdFbCBsw61taXRlIHJvam8gZGViZSBzZXIgY2VybyBvIG1heW9yIHkgZWwgbml2ZWwgdmVyZGUgZGViZSBzZXIgc3VwZXJpb3IgYWwgcm9qby4nKTtyZXR1cm59dmlld1N0YXRlLnJhdGlvcy5yZWRMaW1pdD1yZWQ7dmlld1N0YXRlLnJhdGlvcy5ncmVlbkxpbWl0PWdyZWVuO3JlbmRlcigpfTsKIH1lbHNlIGlmKHRhYiE9PSdNZXRvZG9sb2fDrWEnKSQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPGRpdiBjbGFzcz0ic2lnbmFsbm90ZSB0cmFmZmljSW50cm8iPlB1bnRvcyBkZSBsb3MgZ3LDoWZpY29zOiB2ZXJkZSA9IGlndWFsIG8gc3VwZXJpb3IgYWwgcGVyw61vZG8gYW50ZXJpb3IgbW9zdHJhZG87IHJvam8gPSBpbmZlcmlvciBvIFdpbiBuZWdhdGl2by4gR3JpcyA9IHNpbiBjb21wYXJhY2nDs24gbyBzaW4gbWV0YS4gUGF5b3V0LCBhcHVlc3RhLCBwcmVtaW9zIHkgcHJvbW8gc2UgbWFudGllbmVuIG5ldXRyb3MgYWwgbm8gdGVuZXIgdW5hIG1ldGEgZGVmaW5pZGEuIExhIGVzY2FsYSBkZSB0cmVzIGNvbG9yZXMgc2UgcmVzZXJ2YSBwYXJhIHJhdGlvcy48L2Rpdj4nKTsKfTsKCmZ1bmN0aW9uIGV4Y2x1ZGVkUmVjb3JkVjcocm93KXtyZXR1cm4gWzEsMiwzLDQsNSw3LDgsOV0uc29tZShrPT57Y29uc3Qgdj1TdHJpbmcocm93W2tdPz8nJykudHJpbSgpLnRvTG9jYWxlVXBwZXJDYXNlKCdlcycpO3JldHVybiB2PT09J0VYUElSQURPUyd8fC9eWy3igJPigJRdezMsfSQvLnRlc3Qodil9KX0KZnVuY3Rpb24gY2xlYW5NYXRyaXhWNyhtYXRyaXgpewogY29uc3QgcmVtb3ZlZD1tYXRyaXgucm93cy5maWx0ZXIoZXhjbHVkZWRSZWNvcmRWNyk7aWYoIXJlbW92ZWQubGVuZ3RoKXJldHVybiBtYXRyaXg7CiBjb25zdCBhZGp1c3RtZW50PW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgcmVtb3ZlZClhZGp1c3RtZW50LnNldChyWzBdLChhZGp1c3RtZW50LmdldChyWzBdKXx8MCkrKHR5cGVvZiByWzE2XT09PSdudW1iZXInP3JbMTZdOjApKTsKIHJldHVybiB7Li4ubWF0cml4LHJvd3M6bWF0cml4LnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKSxjb250cm9sczoobWF0cml4LmNvbnRyb2xzfHxbXSkubWFwKGM9Pih7Li4uYyx3aW46Yy53aW4tKGFkanVzdG1lbnQuZ2V0KGMuZGF0ZSl8fDApfSkpfTsKfQpjb25zdCBjYWNoZWRCZWZvcmVWNz1jYWNoZWQ7Y2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFuTWF0cml4VjcoYXdhaXQgY2FjaGVkQmVmb3JlVjcoKSl9Owpjb25zdCBub3JtYWxpemVCZWZvcmVWNz1ub3JtYWxpemVXb3JrYm9vaztub3JtYWxpemVXb3JrYm9vaz1mdW5jdGlvbiguLi5hcmdzKXtjb25zdCBjbGVhbmVkPWNsZWFuTWF0cml4Vjcobm9ybWFsaXplQmVmb3JlVjcoLi4uYXJncykpO2lmKCFjbGVhbmVkLnJvd3MubGVuZ3RoKXRocm93IEVycm9yKCdFbCBhcmNoaXZvIG5vIGNvbnRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpO3JldHVybiBjbGVhbmVkfTsKY29uc3QgY29tYmluZUJlZm9yZVY3PWNvbWJpbmVNYXRyaWNlcztjb21iaW5lTWF0cmljZXM9ZnVuY3Rpb24ocHJldmlvdXMsaW5jb21pbmcsbW9kZSl7cmV0dXJuIGNsZWFuTWF0cml4VjcoY29tYmluZUJlZm9yZVY3KHByZXZpb3VzP2NsZWFuTWF0cml4VjcocHJldmlvdXMpOnByZXZpb3VzLGNsZWFuTWF0cml4VjcoaW5jb21pbmcpLG1vZGUpKX07CmNvbnN0IGluaXRCZWZvcmVWNz1pbml0O2luaXQ9ZnVuY3Rpb24oKXtkYXRhPWNsZWFuTWF0cml4VjcoZGF0YSk7aW5pdEJlZm9yZVY3KCl9OwoKY29uc3QgbW9udGhTaG9ydFY4PVsnRU5FJywnRkVCJywnTUFSJywnQUJSJywnTUFZJywnSlVOJywnSlVMJywnQUdPJywnU0VQJywnT0NUJywnTk9WJywnRElDJ107CmZ1bmN0aW9uIGNhbGVuZGFyU3RhdGVWOChzY29wZSl7dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3JldHVybiB2aWV3U3RhdGUuY2FsZW5kYXJzW3Njb3BlXT8/PXttb2RlOidyYW5nZScsZGF0ZXM6W10sbW9udGg6Jycsd2Vla3M6W10scXVhcnRlcjonJ319CmZ1bmN0aW9uIHdlZWtOdW1iZXJWOChkYXRlKXtjb25zdCBkPW5ldyBEYXRlKGRhdGUrJ1QwMDowMDowMFonKSxmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksMCwxKSk7cmV0dXJuIE1hdGguZmxvb3IoKChkLWZpcnN0KS84NjRlNSsoZmlyc3QuZ2V0VVRDRGF5KCkrNiklNykvNykrMX0KZnVuY3Rpb24gcXVhcnRlcktleVY4KGRhdGUpe3JldHVybiBkYXRlLnNsaWNlKDAsNCkrJy1UJytNYXRoLmNlaWwoTnVtYmVyKGRhdGUuc2xpY2UoNSw3KSkvMyl9CmZ1bmN0aW9uIGFjY2VwdHNDYWxlbmRhclY4KHJvdyxzdGF0ZSxmcm9tLHRvKXsKIGNvbnN0IGRhdGU9cm93WzBdOwogaWYoc3RhdGUubW9kZT09PSdkYXRlcycpcmV0dXJuIHN0YXRlLmRhdGVzLmluY2x1ZGVzKGRhdGUpOwogaWYoc3RhdGUubW9kZT09PSdtb250aCcpcmV0dXJuICFzdGF0ZS5tb250aHx8ZGF0ZS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKTsKIGlmKHN0YXRlLm1vZGU9PT0nd2VlaycpcmV0dXJuICghc3RhdGUubW9udGh8fGRhdGUuc3RhcnRzV2l0aChzdGF0ZS5tb250aCkpJiYoIXN0YXRlLndlZWtzLmxlbmd0aHx8c3RhdGUud2Vla3MuaW5jbHVkZXMoU3RyaW5nKHdlZWtOdW1iZXJWOChkYXRlKSkpKTsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpcmV0dXJuICFzdGF0ZS5xdWFydGVyfHxxdWFydGVyS2V5VjgoZGF0ZSk9PT1zdGF0ZS5xdWFydGVyOwogcmV0dXJuICghZnJvbXx8ZGF0ZT49ZnJvbSkmJighdG98fGRhdGU8PXRvKTsKfQpzbGljZVJvd3M9ZnVuY3Rpb24oZmlsdGVycz17fSxmcm9tPSQoJyNmcm9tJykudmFsdWUsdG89JCgnI3RvJykudmFsdWUpewogY29uc3Qgc2NvcGU9ZmlsdGVycz09PXZpZXdTdGF0ZS5BLmZpbHRlcnM/J0EnOmZpbHRlcnM9PT12aWV3U3RhdGUuQi5maWx0ZXJzPydCJzonZ2xvYmFsJyxzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpOwogcmV0dXJuIGRhdGEucm93cy5maWx0ZXIocj0+YWNjZXB0c0NhbGVuZGFyVjgocixzdGF0ZSxmcm9tLHRvKSYmT2JqZWN0LmVudHJpZXMoZmlsdGVycykuZXZlcnkoKFtrLHZhbHVlc10pPT4hdmFsdWVzLmxlbmd0aHx8dmFsdWVzLmluY2x1ZGVzKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpKTsKfTsKZnVuY3Rpb24gd2Vla0xhYmVsVjgoeWVhcix3ZWVrLHJvd3M9W10pewogbGV0IGRhdGVzPVsuLi5uZXcgU2V0KHJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aCh5ZWFyKSYmd2Vla051bWJlclY4KHJbMF0pPT09TnVtYmVyKHdlZWspKS5tYXAocj0+clswXSkpXS5zb3J0KCk7CiBpZighZGF0ZXMubGVuZ3RoKXtjb25zdCBmaXJzdD1uZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIoeWVhciksMCwxKSksb2Zmc2V0PShmaXJzdC5nZXRVVENEYXkoKSs2KSU3LGQ9bmV3IERhdGUoZmlyc3QuZ2V0VGltZSgpK01hdGgubWF4KDAsKE51bWJlcih3ZWVrKS0xKSo3LW9mZnNldCkqODY0ZTUpO2RhdGVzPVtkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCldfQogY29uc3QgbW9udGhzPVsuLi5uZXcgU2V0KGRhdGVzLm1hcChkPT5tb250aFNob3J0VjhbTnVtYmVyKGQuc2xpY2UoNSw3KSktMV0pKV07cmV0dXJuIG1vbnRocy5qb2luKCcvJykrJy0nK051bWJlcih3ZWVrKSsnIMK3ICcreWVhcjsKfQpjb25zdCBkaXNwbGF5QmVmb3JlVjg9ZGlzcGxheURhdGVzVjU7CmRpc3BsYXlEYXRlc1Y1PWZ1bmN0aW9uKHZhbHVlKXtsZXQgdGV4dD1TdHJpbmcodmFsdWU/PycnKS5yZXBsYWNlKC9cYihcZHs0fSkgwrcgUyhcZHsxLDJ9KVxiL2csKG0seSx3KT0+d2Vla0xhYmVsRmFzdExBKHksdykpLnJlcGxhY2UoL1xiKFxkezR9KS1UKFsxLTRdKVxiL2csKG0seSxxKT0+YFRyaW1lc3RyZSAke3F9IMK3ICR7eX1gKTtyZXR1cm4gZGlzcGxheUJlZm9yZVY4KHRleHQpfTsKY29uc3QgZGVzY3JpcHRpb25CZWZvcmVWOD1wZXJpb2REZXNjcmlwdGlvblY0OwpwZXJpb2REZXNjcmlwdGlvblY0PWZ1bmN0aW9uKG5hbWUscG9pbnRzKXtjb25zdCByZXN1bHQ9ZGVzY3JpcHRpb25CZWZvcmVWOChuYW1lLHBvaW50cyksbWF0Y2g9bmFtZS5tYXRjaCgvXihcZHs0fSkgwrcgUyhcZHsxLDJ9KSQvKTtpZihtYXRjaCl7cmVzdWx0LmxhYmVsPXdlZWtMYWJlbFY4KG1hdGNoWzFdLG1hdGNoWzJdLHBvaW50cy5mbGF0TWFwKHA9PnAucm93c3x8W10pKTtyZXN1bHQuZnVsbD1yZXN1bHQubGFiZWwrJyDCtyBEYXRvczogJytyZXN1bHQucmFuZ2V9cmV0dXJuIHJlc3VsdH07CmNvbnN0IGtleUJlZm9yZVY4PXBlcmlvZEtleTsKcGVyaW9kS2V5PWZ1bmN0aW9uKHJvdyxncmFpbil7cmV0dXJuIGdyYWluPT09J3F1YXJ0ZXInP3F1YXJ0ZXJLZXlWOChyb3dbMF0pOmtleUJlZm9yZVY4KHJvdyxncmFpbil9Owpjb25zdCByZXBvcnRQZXJpb2RCZWZvcmVWOD1yZXBvcnRQZXJpb2Q7CnJlcG9ydFBlcmlvZD1mdW5jdGlvbihyb3csdHlwZSl7Y29uc3Qgc3RhdGU9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/dmlld1N0YXRlLndlZWtseTp0YWI9PT0nUmVwb3J0ZSBtZW5zdWFsJz92aWV3U3RhdGUubW9udGhseTp0YWI9PT0nRXZvbHV0aXZvIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5RXZvbHV0aW9uOm51bGw7cmV0dXJuIHN0YXRlPy5ncm91cFF1YXJ0ZXI/cXVhcnRlcktleVY4KHJvd1swXSk6cmVwb3J0UGVyaW9kQmVmb3JlVjgocm93LHR5cGUpfTsKZnVuY3Rpb24gbW9udGhDaG9pY2VzVjgoKXtyZXR1cm4gWy4uLm5ldyBTZXQoZGF0YS5yb3dzLm1hcChyPT5yWzBdLnNsaWNlKDAsNykpKV0uc29ydCgpfQpmdW5jdGlvbiBjYWxlbmRhclBhbmVsVjgoc2NvcGUpewogY29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKSxtb250aHM9bW9udGhDaG9pY2VzVjgoKSxxdWFydGVycz1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCk7c3RhdGUubW9udGh8fD1tb250aHMuYXQoLTEpfHwnJztzdGF0ZS5xdWFydGVyfHw9cXVhcnRlcnMuYXQoLTEpfHwnJzsKIGNvbnN0IHdlZWtzPVsuLi5uZXcgU2V0KGRhdGEucm93cy5maWx0ZXIocj0+clswXS5zdGFydHNXaXRoKHN0YXRlLm1vbnRoKSkubWFwKHI9PndlZWtOdW1iZXJWOChyWzBdKSkpXS5zb3J0KChhLGIpPT5hLWIpOwogbGV0IGRldGFpbHM9Jyc7CiBpZihzdGF0ZS5tb2RlPT09J2RhdGVzJylkZXRhaWxzPWA8bGFiZWw+QWdyZWdhciB1bmEgZmVjaGEgY29uIGNhbGVuZGFyaW88aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImRheS0ke3Njb3BlfSI+PC9sYWJlbD48YnV0dG9uIGRhdGEtYWRkZGF5PSIke3Njb3BlfSI+QWdyZWdhciBkw61hPC9idXR0b24+PGRpdiBjbGFzcz0iZGF0ZWNoaXBzIj4ke3N0YXRlLmRhdGVzLm1hcChkPT5gPGJ1dHRvbiBkYXRhLXJlbW92ZWRheT0iJHtzY29wZX18JHtkfSI+JHtkaXNwbGF5RGF0ZXNWNShkKX0gw5c8L2J1dHRvbj5gKS5qb2luKCcnKXx8JzxzcGFuPkVsaWdlIHVubyBvIHZhcmlvcyBkw61hcyBlc3BlY8OtZmljb3MuPC9zcGFuPid9PC9kaXY+YDsKIGlmKFsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpZGV0YWlscz1gPGxhYmVsPjEuIE1lczxzZWxlY3QgZGF0YS1jYWxtb250aD0iJHtzY29wZX0iPiR7bW9udGhzLm1hcChtPT5gPG9wdGlvbiB2YWx1ZT0iJHttfSIgJHttPT09c3RhdGUubW9udGg/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShtKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPGxhYmVsPjIuIFNlbWFuYXMgZGVsIG1lczxzZWxlY3QgbXVsdGlwbGUgZGF0YS1jYWx3ZWVrcz0iJHtzY29wZX0iPiR7d2Vla3MubWFwKHc9Pntjb25zdCBkYXRlcz1kYXRhLnJvd3MuZmlsdGVyKHI9PnJbMF0uc3RhcnRzV2l0aChzdGF0ZS5tb250aCkmJndlZWtOdW1iZXJWOChyWzBdKT09PXcpLm1hcChyPT5yWzBdKS5zb3J0KCk7cmV0dXJuIGA8b3B0aW9uIHZhbHVlPSIke3d9IiAke3N0YXRlLndlZWtzLmluY2x1ZGVzKFN0cmluZyh3KSk/J3NlbGVjdGVkJzonJ30+JHttb250aFNob3J0VjhbTnVtYmVyKHN0YXRlLm1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKX0gYSAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSl9PC9vcHRpb24+YH0pLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+PHNtYWxsPlNpbiBzZWxlY2Npw7NuIGRlIHNlbWFuYTogdG9kbyBlbCBtZXMuIEN0cmwvQ21kICsgY2xpYyBwZXJtaXRlIGVsZWdpciB2YXJpYXMuIFVuYSBzZW1hbmEgcXVlIGNydXphIGRlIG1lcyBpbmNsdXllIGFxdcOtIHNvbG8gbG9zIGTDrWFzIGRlbCBtZXMgZWxlZ2lkby48L3NtYWxsPmA6Jyd9YDsKIGlmKHN0YXRlLm1vZGU9PT0ncXVhcnRlcicpZGV0YWlscz1gPGxhYmVsPlRyaW1lc3RyZTxzZWxlY3QgZGF0YS1jYWxxdWFydGVyPSIke3Njb3BlfSI+JHtxdWFydGVycy5tYXAocT0+YDxvcHRpb24gdmFsdWU9IiR7cX0iICR7cT09PXN0YXRlLnF1YXJ0ZXI/J3NlbGVjdGVkJzonJ30+JHtkaXNwbGF5RGF0ZXNWNShxKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmA7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwiIGRhdGEtY2FsZW5kYXJwYW5lbD0iJHtzY29wZX0iPjxkaXYgY2xhc3M9ImNhbGVuZGFyQ29udHJvbHMiPjxsYWJlbD5TZWxlY2Npb25hciBmZWNoYXMgcG9yPHNlbGVjdCBkYXRhLWNhbG1vZGU9IiR7c2NvcGV9Ij4ke09iamVjdC5lbnRyaWVzKHtyYW5nZTonUmFuZ28gY29uIGNhbGVuZGFyaW8nLGRhdGVzOidEw61hcyBlc3BlY8OtZmljb3MnLG1vbnRoOidNZXMnLHdlZWs6J01lcyB5IHNlbWFuYXMnLHF1YXJ0ZXI6J1RyaW1lc3RyZSd9KS5tYXAoKFtrLHZdKT0+YDxvcHRpb24gdmFsdWU9IiR7a30iICR7c3RhdGUubW9kZT09PWs/J3NlbGVjdGVkJzonJ30+JHt2fTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjwvbGFiZWw+JHtkZXRhaWxzfTwvZGl2PjwvZGl2PmA7Cn0KZnVuY3Rpb24gc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKHN0YXRlLm1vZGU9PT0nZGF0ZXMnKXJldHVybiBzdGF0ZS5kYXRlcy5sZW5ndGg/c3RhdGUuZGF0ZXMubWFwKGRpc3BsYXlEYXRlc1Y1KS5qb2luKCcsICcpOidTaW4gZMOtYXMgZWxlZ2lkb3MnO2lmKHN0YXRlLm1vZGU9PT0nbW9udGgnKXJldHVybiBkaXNwbGF5RGF0ZXNWNShzdGF0ZS5tb250aCk7aWYoc3RhdGUubW9kZT09PSd3ZWVrJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUubW9udGgpKyhzdGF0ZS53ZWVrcy5sZW5ndGg/JyDCtyBTZW1hbmFzICcrc3RhdGUud2Vla3Muam9pbignLCAnKTonIMK3IFRvZGFzIGxhcyBzZW1hbmFzJyk7aWYoc3RhdGUubW9kZT09PSdxdWFydGVyJylyZXR1cm4gZGlzcGxheURhdGVzVjUoc3RhdGUucXVhcnRlcik7Y29uc3QgZnJvbT1zY29wZT09PSdnbG9iYWwnPyQoJyNmcm9tJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS5mcm9tLHRvPXNjb3BlPT09J2dsb2JhbCc/JCgnI3RvJykudmFsdWU6dmlld1N0YXRlW3Njb3BlXS50bztyZXR1cm4gZGlzcGxheURhdGVzVjUoZnJvbSkrJyDihpIgJytkaXNwbGF5RGF0ZXNWNSh0byl9CmZ1bmN0aW9uIGJpbmRDYWxlbmRhcnNWOCgpewogZm9yKGNvbnN0IFthdHRyaWJ1dGUsa2V5XW9mIFtbJ2NhbG1vZGUnLCdtb2RlJ10sWydjYWxtb250aCcsJ21vbnRoJ10sWydjYWxxdWFydGVyJywncXVhcnRlciddXSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK2F0dHJpYnV0ZSsnXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57bGV0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChlbC5kYXRhc2V0W2F0dHJpYnV0ZV0pO3N0YXRlW2tleV09ZWwudmFsdWU7aWYoa2V5PT09J21vbnRoJylzdGF0ZS53ZWVrcz1bXTtyZW5kZXIoKX0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2Fsd2Vla3NdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9PntjYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldC5jYWx3ZWVrcykud2Vla3M9Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hZGRkYXldJykuZm9yRWFjaChlbD0+ZWwub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWVsLmRhdGFzZXQuYWRkZGF5LGQ9JCgnI2RheS0nK3Njb3BlKS52YWx1ZTtpZighZClyZXR1cm47Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KHNjb3BlKTtpZighc3RhdGUuZGF0ZXMuaW5jbHVkZXMoZCkpc3RhdGUuZGF0ZXMucHVzaChkKTtzdGF0ZS5kYXRlcy5zb3J0KCk7cmVuZGVyKCl9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlbW92ZWRheV0nKS5mb3JFYWNoKGVsPT5lbC5vbmNsaWNrPSgpPT57bGV0W3Njb3BlLGRheV09ZWwuZGF0YXNldC5yZW1vdmVkYXkuc3BsaXQoJ3wnKTtjYWxlbmRhclN0YXRlVjgoc2NvcGUpLmRhdGVzPWNhbGVuZGFyU3RhdGVWOChzY29wZSkuZGF0ZXMuZmlsdGVyKGQ9PmQhPT1kYXkpO3JlbmRlcigpfSk7Cn0KY29uc3QgY29weUJlZm9yZVY4PWNvbXBhcmVWaWV3Owpjb21wYXJlVmlldz1mdW5jdGlvbigpe2NvcHlCZWZvcmVWOCgpO2Zvcihjb25zdCBzY29wZSBvZiBbJ0EnLCdCJ10pe2NvbnN0IHBhbmVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlJytzY29wZSk7cGFuZWwucXVlcnlTZWxlY3RvcignLmNvbXBhcmVEYXRlcycpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLGNhbGVuZGFyUGFuZWxWOChzY29wZSkpO3BhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJlRGF0ZXMnKS5zdHlsZS5kaXNwbGF5PWNhbGVuZGFyU3RhdGVWOChzY29wZSkubW9kZT09PSdyYW5nZSc/J2dyaWQnOidub25lJztwYW5lbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsYDxwIGNsYXNzPSJzaWduYWxub3RlIj5QZXLDrW9kbyAke3Njb3BlfTogJHtlc2Moc2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSl9PC9wPmApfQogY29uc3QgY29weT0kKCcjY29weUFCJykub25jbGljayxzd2FwPSQoJyNzd2FwQUInKS5vbmNsaWNrOyQoJyNjb3B5QUInKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O3ZpZXdTdGF0ZS5jYWxlbmRhcnMuQj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhbGVuZGFyU3RhdGVWOCgnQScpKSk7Y29weSgpfTskKCcjc3dhcEFCJykub25jbGljaz0oKT0+e2NvbnN0IGE9Y2FsZW5kYXJTdGF0ZVY4KCdBJyksYj1jYWxlbmRhclN0YXRlVjgoJ0InKTt2aWV3U3RhdGUuY2FsZW5kYXJzLkE9Yjt2aWV3U3RhdGUuY2FsZW5kYXJzLkI9YTtzd2FwKCl9Owp9Owpjb25zdCByZW5kZXJCZWZvcmVWOD1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhbGVuZGFyUGFuZWwnKS5mb3JFYWNoKHBhbmVsPT5wYW5lbC5yZW1vdmUoKSk7CiBpZihkYXRhKXtmb3IoY29uc3Qgc2NvcGUgb2YgWydnbG9iYWwnLCdBJywnQiddKXtjb25zdCBzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO3N0YXRlLm1vbnRofHw9bW9udGhDaG9pY2VzVjgoKS5hdCgtMSl8fCcnO3N0YXRlLnF1YXJ0ZXJ8fD1bLi4ubmV3IFNldChkYXRhLnJvd3MubWFwKHI9PnF1YXJ0ZXJLZXlWOChyWzBdKSkpXS5zb3J0KCkuYXQoLTEpfHwnJ319CiByZW5kZXJCZWZvcmVWOCgpO2lmKCFkYXRhKXJldHVybjsKIGlmKCFbJ0NvbXBhcmF0aXZvcycsJ01ldG9kb2xvZ8OtYSddLmluY2x1ZGVzKHRhYikpewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGNhbGVuZGFyUGFuZWxWOCgnZ2xvYmFsJykpO2Zvcihjb25zdCBpZCBvZiBbJ2Zyb20nLCd0byddKSQoJyMnK2lkKS5jbG9zZXN0KCdsYWJlbCcpLnN0eWxlLmRpc3BsYXk9Y2FsZW5kYXJTdGF0ZVY4KCdnbG9iYWwnKS5tb2RlPT09J3JhbmdlJz8nZmxleCc6J25vbmUnOyQoJyN2aWV3SGVscCcpLnRleHRDb250ZW50PXNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyk7CiB9CiBjb25zdCBzdGF0ZT10YWI9PT0nUmVwb3J0ZSBzZW1hbmFsJz92aWV3U3RhdGUud2Vla2x5OnRhYj09PSdSZXBvcnRlIG1lbnN1YWwnP3ZpZXdTdGF0ZS5tb250aGx5OnRhYj09PSdFdm9sdXRpdm8gbWVuc3VhbCc/dmlld1N0YXRlLm1vbnRobHlFdm9sdXRpb246bnVsbDsKIGlmKHN0YXRlKXtjb25zdCBjb250cm9scz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudCAudmlld2NvbnRyb2xzJyk7Y29udHJvbHMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLHNlbGVjdG9yKCdBZ3J1cGFjacOzbiBkZWwgaW5mb3JtZScsJ3F1YXJ0ZXJHcm91cFY4JyxzdGF0ZS5ncm91cFF1YXJ0ZXI/J3F1YXJ0ZXInOidvcmlnaW5hbCcse29yaWdpbmFsOnRhYj09PSdSZXBvcnRlIHNlbWFuYWwnPydTZW1hbmFsJzonTWVuc3VhbCcscXVhcnRlcjonVHJpbWVzdHJhbCd9KSk7JCgnI3F1YXJ0ZXJHcm91cFY4Jykub25jaGFuZ2U9ZT0+e3N0YXRlLmdyb3VwUXVhcnRlcj1lLnRhcmdldC52YWx1ZT09PSdxdWFydGVyJztyZW5kZXIoKX19CiBpZih0YWI9PT0nRXZvbHVjacOzbicpe2NvbnN0IHNlbGVjdD0kKCcjZWdyYWluJyk7aWYoIVsuLi5zZWxlY3Qub3B0aW9uc10uc29tZShvPT5vLnZhbHVlPT09J3F1YXJ0ZXInKSlzZWxlY3QuYWRkKG5ldyBPcHRpb24oJ1RyaW1lc3RyYWwnLCdxdWFydGVyJykpO3NlbGVjdC52YWx1ZT12aWV3U3RhdGUuZXZvbHV0aW9uLmdyYWlufQogaWYodGFiIT09J01ldG9kb2xvZ8OtYScpJCgnI2NvbnRlbnQnKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLGA8ZGl2IGNsYXNzPSJkYXRlU3VtbWFyeVY4Ij4ke3RhYj09PSdDb21wYXJhdGl2b3MnP2BBOiAke2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ0EnKSl9PGJyPkI6ICR7ZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnQicpKX1gOidQZXLDrW9kbyBzZWxlY2Npb25hZG86ICcrZXNjKHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJykpfTwvZGl2PmApOwogYmluZENhbGVuZGFyc1Y4KCk7ZGVjb3JhdGVDaGFydHNWOCgpO2Zvcm1hdFRleHREYXRlc1Y1KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSk7Cn07CmNvbnN0IHJlc2V0QmVmb3JlVjg9JCgnI3Jlc2V0Jykub25jbGljazskKCcjcmVzZXQnKS5vbmNsaWNrPSgpPT57dmlld1N0YXRlLmNhbGVuZGFycz8/PXt9O2RlbGV0ZSB2aWV3U3RhdGUuY2FsZW5kYXJzLmdsb2JhbDtyZXNldEJlZm9yZVY4KCl9OwoKYXN5bmMgZnVuY3Rpb24gY2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKXsKIGNvbnN0IGNsb25lPXN2Zy5jbG9uZU5vZGUodHJ1ZSksYm94PXN2Zy52aWV3Qm94LmJhc2VWYWwsd2lkdGg9Ym94LndpZHRofHw2MDAsaGVpZ2h0PWJveC5oZWlnaHR8fDM1MDsKIGNvbnN0IHN0eWxlPWdldENvbXB1dGVkU3R5bGUoc3ZnKSxiZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RiZycpLnRyaW0oKXx8JyNmZmYnLGZnPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdHRleHQnKS50cmltKCl8fCcjMjc0NTU5JyxncmlkPXN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tcGxvdGdyaWQnKS50cmltKCl8fCcjZGJlNWVkJzsKIGNsb25lLnNldEF0dHJpYnV0ZSgneG1sbnMnLCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpO2Nsb25lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHdpZHRoKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaGVpZ2h0KTtjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7Y2xvbmUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsJ0FyaWFsLCBzYW5zLXNlcmlmJyk7CiBsZXQgc2VyaWFsaXplZD1uZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKS5yZXBsYWNlKC92YXJcKC0tcGxvdGJnXCkvZyxiZykucmVwbGFjZSgvdmFyXCgtLXBsb3R0ZXh0XCkvZyxmZykucmVwbGFjZSgvdmFyXCgtLXBsb3RncmlkXCkvZyxncmlkKTsKIGNvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzZXJpYWxpemVkXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04J30pKTsKIHRyeXtjb25zdCBpbWFnZT1hd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgaT1uZXcgSW1hZ2U7aS5vbmxvYWQ9KCk9Pm9rKGkpO2kub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY29udmVydGlyIGVsIGdyw6FmaWNvIGEgaW1hZ2VuLicpKTtpLnNyYz11cmx9KTtjb25zdCBzY2FsZT1NYXRoLm1pbigyLDgwMDAvd2lkdGgpLGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9TWF0aC5jZWlsKHdpZHRoKnNjYWxlKTtjYW52YXMuaGVpZ2h0PU1hdGguY2VpbCgoaGVpZ2h0KzEzMCkqc2NhbGUpO2NvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguc2NhbGUoc2NhbGUsc2NhbGUpO2N0eC5maWxsU3R5bGU9Ymc7Y3R4LmZpbGxSZWN0KDAsMCx3aWR0aCxoZWlnaHQrMTMwKTtjdHguZmlsbFN0eWxlPWZnO2N0eC5mb250PSdib2xkIDI4cHggQXJpYWwnO2N0eC5maWxsVGV4dCh0aXRsZSwyNCw0MCx3aWR0aC00OCk7Y3R4LmZvbnQ9JzE2cHggQXJpYWwnO2N0eC5maWxsVGV4dChsZWdlbmQuc2xpY2UoMCxNYXRoLmZsb29yKHdpZHRoLzkpKSwyNCw3MCx3aWR0aC00OCk7Y3R4LmRyYXdJbWFnZShpbWFnZSwwLDEwMCx3aWR0aCxoZWlnaHQpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgob2ssbm8pPT5jYW52YXMudG9CbG9iKGJsb2I9PmJsb2I/b2soYmxvYik6bm8oRXJyb3IoJ05vIHNlIHB1ZG8gZ2VuZXJhciBlbCBQTkcuJykpLCdpbWFnZS9wbmcnKSl9ZmluYWxseXtVUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9Cn0KZnVuY3Rpb24gZG93bmxvYWRCbG9iVjgoYmxvYixuYW1lKXtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTthLmRvd25sb2FkPW5hbWU7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTthLmNsaWNrKCk7YS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZiksMjAwMCl9CmZ1bmN0aW9uIGRlY29yYXRlQ2hhcnRzVjgoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5jaGFydHNjcm9sbCcpLmZvckVhY2goKGhvc3QsaW5kZXgpPT57CiAgY29uc3Qgc3ZnPWhvc3QucXVlcnlTZWxlY3Rvcignc3ZnJyk7aWYoIXN2ZylyZXR1cm47Y29uc3QgY2FyZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyksdGl0bGU9Y2FyZD8ucXVlcnlTZWxlY3RvcignaDInKT8udGV4dENvbnRlbnR8fCdHcsOhZmljbycsbGVnZW5kPWNhcmQ/LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJyk/LnRleHRDb250ZW50fHwnJzsKICBjb25zdCBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7YmFyLmNsYXNzTmFtZT0nY2hhcnRUb29sc1Y4JztiYXIuaW5uZXJIVE1MPSc8YnV0dG9uPkNvcGlhciBpbWFnZW48L2J1dHRvbj48YnV0dG9uPkRlc2NhcmdhciBQTkc8L2J1dHRvbj48c3BhbiByb2xlPSJzdGF0dXMiPjwvc3Bhbj4nO2hvc3QuYmVmb3JlKGJhcik7Y29uc3RbY29weSxzYXZlXT1iYXIucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksc3RhdHVzPWJhci5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7CiAgc2F2ZS5vbmNsaWNrPWFzeW5jKCk9Pnt0cnl7c3RhdHVzLnRleHRDb250ZW50PSdHZW5lcmFuZG/igKYnO2Rvd25sb2FkQmxvYlY4KGF3YWl0IGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCksJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0ltYWdlbiBkZXNjYXJnYWRhJ31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9ZS5tZXNzYWdlfX07CiAgY29weS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCBwbmc9Y2hhcnRQbmdWOChzdmcsdGl0bGUsbGVnZW5kKTt0cnl7aWYoIW5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlfHx0eXBlb2YgQ2xpcGJvYXJkSXRlbT09PSd1bmRlZmluZWQnKXRocm93IEVycm9yKCdQb3J0YXBhcGVsZXMgbm8gZGlzcG9uaWJsZScpO2F3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW25ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzpwbmd9KV0pO3N0YXR1cy50ZXh0Q29udGVudD0nQ29waWFkby4gUHVlZGVzIHBlZ2FybG8gZW4gV29yZCwgUG93ZXJQb2ludCBvIGNvcnJlby4nfWNhdGNoKGUpe3RyeXtkb3dubG9hZEJsb2JWOChhd2FpdCBwbmcsJ0xBLWdyYWZpY28tJysoaW5kZXgrMSkrJy5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0VsIG5hdmVnYWRvciBubyBwZXJtaXRpw7MgY29waWFyLiBTZSBkZXNjYXJnw7MgZWwgUE5HLid9Y2F0Y2goZXJyKXtzdGF0dXMudGV4dENvbnRlbnQ9ZXJyLm1lc3NhZ2V9fX07CiB9KTsKfQovLyBNaW5pbWFsIFhMU1ggd3JpdGVyOiBpbmxpbmUgc3RyaW5ncyArIG51bWJlcnMgaW4gYW4gdW5jb21wcmVzc2VkIFpJUC4KLy8gRGF0YSBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJyb3dzZXI7IG5vIGV4dHJhIHNlcnZpY2Ugb3IgZXh0ZXJuYWwgbGlicmFyeSBpcyB1c2VkLgpmdW5jdGlvbiB4bWxFc2NhcGVWOCh2YWx1ZSl7cmV0dXJuIFN0cmluZyh2YWx1ZT8/JycpLnJlcGxhY2UoL1tcdTAwMDAtXHUwMDA4XHUwMDBCXHUwMDBDXHUwMDBFLVx1MDAxRl0vZywnJykucmVwbGFjZSgvWyY8PiInXS9nLGM9Pih7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyZhcG9zOyd9W2NdKSl9CmZ1bmN0aW9uIGNvbE5hbWVWOChpKXtsZXQgcz0nJztmb3IoaSsrO2k7aT1NYXRoLmZsb29yKChpLTEpLzI2KSlzPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUrKGktMSklMjYpK3M7cmV0dXJuIHN9CmZ1bmN0aW9uIHNoZWV0WG1sVjgocm93cyl7cmV0dXJuIGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXRWaWV3cz48c2hlZXRWaWV3IHdvcmtib29rVmlld0lkPSIwIj48cGFuZSB5U3BsaXQ9IjEiIHRvcExlZnRDZWxsPSJBMiIgYWN0aXZlUGFuZT0iYm90dG9tTGVmdCIgc3RhdGU9ImZyb3plbiIvPjwvc2hlZXRWaWV3Pjwvc2hlZXRWaWV3cz48c2hlZXRGb3JtYXRQciBkZWZhdWx0Um93SGVpZ2h0PSIxOCIvPjxjb2xzPjxjb2wgbWluPSIxIiBtYXg9IjEiIHdpZHRoPSIzMiIgY3VzdG9tV2lkdGg9IjEiLz48Y29sIG1pbj0iMiIgbWF4PSIxMDAiIHdpZHRoPSIyNCIgY3VzdG9tV2lkdGg9IjEiLz48L2NvbHM+PHNoZWV0RGF0YT4ke3Jvd3MubWFwKChyb3cscik9PmA8cm93IHI9IiR7cisxfSI+JHtyb3cubWFwKCh2LGMpPT57Y29uc3QgcmVmPWNvbE5hbWVWOChjKSsocisxKTtyZXR1cm4gdHlwZW9mIHY9PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKHYpP2A8YyByPSIke3JlZn0iIHM9IiR7cj09PTA/MTovcGF5b3V0fGRlc3ZpYWNpw7NuIG5jY3xjdW1wbGltaWVudG8uKiV8YXBvcnRlLiolL2kudGVzdChTdHJpbmcocm93c1swXT8uW2NdPz8nJykpPzM6Mn0iPjx2PiR7dn08L3Y+PC9jPmA6YDxjIHI9IiR7cmVmfSIgcz0iJHtyPT09MD8xOjB9IiB0PSJpbmxpbmVTdHIiPjxpcz48dCB4bWw6c3BhY2U9InByZXNlcnZlIj4ke3htbEVzY2FwZVY4KHR5cGVvZiB2PT09J3N0cmluZyc/ZGlzcGxheURhdGVzVjUodik6dil9PC90PjwvaXM+PC9jPmB9KS5qb2luKCcnKX08L3Jvdz5gKS5qb2luKCcnKX08L3NoZWV0RGF0YT4ke3Jvd3MubGVuZ3RoPjE/YDxhdXRvRmlsdGVyIHJlZj0iQTE6JHtjb2xOYW1lVjgoTWF0aC5tYXgoLi4ucm93cy5tYXAocj0+ci5sZW5ndGgpLDEpLTEpfSR7cm93cy5sZW5ndGh9Ii8+YDonJ308L3dvcmtzaGVldD5gfQpmdW5jdGlvbiBjcmMzMlY4KGJ5dGVzKXtsZXQgY3JjPTB4ZmZmZmZmZmY7Zm9yKGNvbnN0IGIgb2YgYnl0ZXMpe2NyY149Yjtmb3IobGV0IGs9MDtrPDg7aysrKWNyYz0oY3JjPj4+MSleKChjcmMmMSk/MHhlZGI4ODMyMDowKX1yZXR1cm4gKGNyY14weGZmZmZmZmZmKT4+PjB9CmZ1bmN0aW9uIHppcEZpbGVzVjgoZmlsZXMpe2NvbnN0IGVuY29kZXI9bmV3IFRleHRFbmNvZGVyLGxvY2FsPVtdLGNlbnRyYWw9W107bGV0IG9mZnNldD0wO2Zvcihjb25zdFtuYW1lLHRleHRdb2YgZmlsZXMpe2NvbnN0IG49ZW5jb2Rlci5lbmNvZGUobmFtZSksZGF0YT1lbmNvZGVyLmVuY29kZSh0ZXh0KSxjcmM9Y3JjMzJWOChkYXRhKSxsaD1uZXcgVWludDhBcnJheSgzMCksbHY9bmV3IERhdGFWaWV3KGxoLmJ1ZmZlcik7bHYuc2V0VWludDMyKDAsMHgwNDAzNGI1MCx0cnVlKTtsdi5zZXRVaW50MTYoNCwyMCx0cnVlKTtsdi5zZXRVaW50MTYoNiwweDgwMCx0cnVlKTtsdi5zZXRVaW50MzIoMTQsY3JjLHRydWUpO2x2LnNldFVpbnQzMigxOCxkYXRhLmxlbmd0aCx0cnVlKTtsdi5zZXRVaW50MzIoMjIsZGF0YS5sZW5ndGgsdHJ1ZSk7bHYuc2V0VWludDE2KDI2LG4ubGVuZ3RoLHRydWUpO2xvY2FsLnB1c2gobGgsbixkYXRhKTtjb25zdCBjaD1uZXcgVWludDhBcnJheSg0NiksY3Y9bmV3IERhdGFWaWV3KGNoLmJ1ZmZlcik7Y3Yuc2V0VWludDMyKDAsMHgwMjAxNGI1MCx0cnVlKTtjdi5zZXRVaW50MTYoNCwyMCx0cnVlKTtjdi5zZXRVaW50MTYoNiwyMCx0cnVlKTtjdi5zZXRVaW50MTYoOCwweDgwMCx0cnVlKTtjdi5zZXRVaW50MzIoMTYsY3JjLHRydWUpO2N2LnNldFVpbnQzMigyMCxkYXRhLmxlbmd0aCx0cnVlKTtjdi5zZXRVaW50MzIoMjQsZGF0YS5sZW5ndGgsdHJ1ZSk7Y3Yuc2V0VWludDE2KDI4LG4ubGVuZ3RoLHRydWUpO2N2LnNldFVpbnQzMig0MixvZmZzZXQsdHJ1ZSk7Y2VudHJhbC5wdXNoKGNoLG4pO29mZnNldCs9MzArbi5sZW5ndGgrZGF0YS5sZW5ndGh9Y29uc3QgY2VudHJhbFNpemU9Y2VudHJhbC5yZWR1Y2UoKHMseCk9PnMreC5sZW5ndGgsMCksZW5kPW5ldyBVaW50OEFycmF5KDIyKSxldj1uZXcgRGF0YVZpZXcoZW5kLmJ1ZmZlcik7ZXYuc2V0VWludDMyKDAsMHgwNjA1NGI1MCx0cnVlKTtldi5zZXRVaW50MTYoOCxmaWxlcy5sZW5ndGgsdHJ1ZSk7ZXYuc2V0VWludDE2KDEwLGZpbGVzLmxlbmd0aCx0cnVlKTtldi5zZXRVaW50MzIoMTIsY2VudHJhbFNpemUsdHJ1ZSk7ZXYuc2V0VWludDMyKDE2LG9mZnNldCx0cnVlKTtyZXR1cm4gbmV3IEJsb2IoWy4uLmxvY2FsLC4uLmNlbnRyYWwsZW5kXSx7dHlwZTonYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnfSl9CmZ1bmN0aW9uIHdvcmtib29rQmxvYlY4KHNoZWV0cyl7CiBjb25zdCBucz0naHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnJyxmaWxlcz1bXTsKIGZpbGVzLnB1c2goWydbQ29udGVudF9UeXBlc10ueG1sJyxgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48VHlwZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlcyI+PERlZmF1bHQgRXh0ZW5zaW9uPSJyZWxzIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiLz48RGVmYXVsdCBFeHRlbnNpb249InhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtib29rLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIi8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvc3R5bGVzLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWwiLz4ke3NoZWV0cy5tYXAoKHMsaSk9PmA8T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0JHtpKzF9LnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWwiLz5gKS5qb2luKCcnKX08L1R5cGVzPmBdKTsKIGZpbGVzLnB1c2goWydfcmVscy8ucmVscycsYDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9IiR7bnN9L3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIj48UmVsYXRpb25zaGlwIElkPSJySWQxIiBUeXBlPSIke25zfS9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPmBdKTsKIGZpbGVzLnB1c2goWyd4bC93b3JrYm9vay54bWwnLGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjx3b3JrYm9vayB4bWxucz0iJHtuc30vc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iIHhtbG5zOnI9IiR7bnN9L29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyI+PHNoZWV0cz4ke3NoZWV0cy5tYXAoKHMsaSk9PmA8c2hlZXQgbmFtZT0iJHt4bWxFc2NhcGVWOChzLm5hbWUpfSIgc2hlZXRJZD0iJHtpKzF9IiByOmlkPSJySWQke2krMX0iLz5gKS5qb2luKCcnKX08L3NoZWV0cz48Y2FsY1ByIGNhbGNJZD0iMTkxMDI5Ii8+PC93b3JrYm9vaz5gXSk7CiBmaWxlcy5wdXNoKFsneGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHMnLGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSIke25zfS9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcyI+JHtzaGVldHMubWFwKChzLGkpPT5gPFJlbGF0aW9uc2hpcCBJZD0icklkJHtpKzF9IiBUeXBlPSIke25zfS9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0IiBUYXJnZXQ9IndvcmtzaGVldHMvc2hlZXQke2krMX0ueG1sIi8+YCkuam9pbignJyl9PFJlbGF0aW9uc2hpcCBJZD0icklkJHtzaGVldHMubGVuZ3RoKzF9IiBUeXBlPSIke25zfS9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc3R5bGVzIiBUYXJnZXQ9InN0eWxlcy54bWwiLz48L1JlbGF0aW9uc2hpcHM+YF0pOwogZmlsZXMucHVzaChbJ3hsL3N0eWxlcy54bWwnLGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxzdHlsZVNoZWV0IHhtbG5zPSIke25zfS9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI+PGZvbnRzIGNvdW50PSIyIj48Zm9udD48c3ogdmFsPSIxMSIvPjxuYW1lIHZhbD0iQ2FsaWJyaSIvPjwvZm9udD48Zm9udD48Yi8+PGNvbG9yIHJnYj0iRkZGRkZGRkYiLz48c3ogdmFsPSIxMSIvPjxuYW1lIHZhbD0iQ2FsaWJyaSIvPjwvZm9udD48L2ZvbnRzPjxmaWxscyBjb3VudD0iMyI+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIi8+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0iZ3JheTEyNSIvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9IkZGMTczNjUyIi8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48L2ZpbGxzPjxib3JkZXJzIGNvdW50PSIxIj48Ym9yZGVyPjxsZWZ0Lz48cmlnaHQvPjx0b3AvPjxib3R0b20vPjxkaWFnb25hbC8+PC9ib3JkZXI+PC9ib3JkZXJzPjxjZWxsU3R5bGVYZnMgY291bnQ9IjEiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIi8+PC9jZWxsU3R5bGVYZnM+PGNlbGxYZnMgY291bnQ9IjQiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiB4ZklkPSIwIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIHhmSWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIi8+PHhmIG51bUZtdElkPSI0IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjwvY2VsbFhmcz48Y2VsbFN0eWxlcyBjb3VudD0iMSI+PGNlbGxTdHlsZSBuYW1lPSJOb3JtYWwiIHhmSWQ9IjAiIGJ1aWx0aW5JZD0iMCIvPjwvY2VsbFN0eWxlcz48L3N0eWxlU2hlZXQ+YF0pOwogc2hlZXRzLmZvckVhY2goKHNoZWV0LGkpPT5maWxlcy5wdXNoKFtgeGwvd29ya3NoZWV0cy9zaGVldCR7aSsxfS54bWxgLHNoZWV0WG1sVjgoc2hlZXQucm93cyldKSk7cmV0dXJuIHppcEZpbGVzVjgoZmlsZXMpOwp9CmZ1bmN0aW9uIGV4cG9ydEV4Y2VsVjgoKXsKIGlmKCFkYXRhfHx0YWI9PT0nTWV0b2RvbG9nw61hJylyZXR1cm47CiBjb25zdCBzZWxlY3Rpb249W1snUGFyw6FtZXRybycsJ1NlbGVjY2nDs24nXSxbJ0luZm9ybWUnLHRhYl0sWydBcmNoaXZvIGZ1ZW50ZScsZGF0YS5uYW1lXSxbJ0ZlY2hhcycsdGFiPT09J0NvbXBhcmF0aXZvcyc/J1ZlciBzZWxlY2Npb25lcyBBIHkgQic6c2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKV0sWydGaWx0cm9zIHkgY29uZmlndXJhY2nDs24nLEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZSldLFsnVW5pZGFkZXMnLCdJbXBvcnRlcyBlbiBDTFAuIEVuIERhdG9zLCBwYXlvdXQvcG9yY2VudGFqZXMgc2UgZXhwb3J0YW4gY29tbyBmcmFjY2nDs24gKDAsOTUgPSA5NSUpLiBSYXRpb3MgZW4gbcO6bHRpcGxvcyBkZSByZWZlcmVuY2lhLiddLFsnQ29udGVuaWRvJywnVGFibGFzIHkgdmFsb3JlcyBkZWwgaW5mb3JtZS4gTG9zIGdyw6FmaWNvcyBzZSBwdWVkZW4gY29waWFyIG8gZGVzY2FyZ2FyIGNvbW8gUE5HIGRlc2RlIGxhIHdlYi4nXV07CiBpZih0YWI9PT0nQ29tcGFyYXRpdm9zJylzZWxlY3Rpb24ucHVzaChbJ0ZlY2hhcyBBJyxzZWxlY3RlZERhdGVUZXh0VjgoJ0EnKV0sWydGZWNoYXMgQicsc2VsZWN0ZWREYXRlVGV4dFY4KCdCJyldKTsKIGNvbnN0IHNoZWV0cz1be25hbWU6J0RhdG9zJyxyb3dzOmV4cG9ydFJvd3MubGVuZ3RoP2V4cG9ydFJvd3M6W1snU2luIGRhdG9zJ11dfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6c2VsZWN0aW9ufV07CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCB0YWJsZScpLmZvckVhY2goKHRhYmxlLGkpPT57Y29uc3Qgcm93cz1bLi4udGFibGUucm93c10ubWFwKHI9PlsuLi5yLmNlbGxzXS5tYXAoYz0+Yy5pbm5lclRleHQudHJpbSgpKSk7aWYocm93cy5sZW5ndGgpc2hlZXRzLnB1c2goe25hbWU6J1RhYmxhICcrKGkrMSkscm93c30pfSk7CiBkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChzaGVldHMpLCdMQS0nK3RhYi5yZXBsYWNlKC9bXmEtesOhw6nDrcOzw7rDsTAtOV0vZ2ksJy0nKSsnLnhsc3gnKTsKfQpjb25zdCBjc3ZFeHBvcnRCZWZvcmVWOD0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOyQoJyN2MmV4cG9ydCcpLnRleHRDb250ZW50PSfihpMgRXhwb3J0YXIgRXhjZWwnOyQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZXhwb3J0RXhjZWxWODsKCmNvbnN0IHJwY0JlZm9yZVY5PXJwYzsKcnBjPWZ1bmN0aW9uKG5hbWUsLi4uYXJncyl7cmV0dXJuIG5ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCB0aW1lb3V0PXNldFRpbWVvdXQoKCk9Pm5vKEVycm9yKCdHb29nbGUgbm8gcmVzcG9uZGnDsyBhICcrbmFtZSsnIGRlbnRybyBkZWwgdGllbXBvIGVzcGVyYWRvLiBSZWNhcmdhIGxhIHdlYiB5IGNvbXBydWViYSB0dSBzZXNpw7NuLicpKSxuYW1lPT09J2ltcG9ydE1hdHJpeCc/OTAwMDAwOm5hbWU9PT0nZ2V0Vmlld3MnPzE1MDAwOjkwMDAwKTtycGNCZWZvcmVWOShuYW1lLC4uLmFyZ3MpLnRoZW4odmFsdWU9PntjbGVhclRpbWVvdXQodGltZW91dCk7b2sodmFsdWUpfSxlcnJvcj0+e2NsZWFyVGltZW91dCh0aW1lb3V0KTtubyhlcnJvcil9KX0pfTsKY2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7CiAkKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9J1JlY3VwZXJhbmRvIGxhIG1hdHJpeiBwcml2YWRh4oCmJzsKIGNvbnN0IHRyYW5zcG9ydD1hd2FpdCBycGMoJ2dldE1hdHJpeFRyYW5zcG9ydCcpOwogaWYoIXRyYW5zcG9ydHx8dHJhbnNwb3J0LmVuY29kaW5nIT09J2d6aXAtYmFzZTY0J3x8dHlwZW9mIHRyYW5zcG9ydC5kYXRhIT09J3N0cmluZycpdGhyb3cgRXJyb3IoJ0xhIHJlc3B1ZXN0YSBkZWwgc2Vydmlkb3Igbm8gdGllbmUgZWwgZm9ybWF0byBlc3BlcmFkby4gQWN0dWFsaXphIHRhbWJpw6luIENvZGUuZ3MgeSBwdWJsaWNhIGFtYm9zIGFyY2hpdm9zIGp1bnRvcy4nKTsKICQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTWF0cml6IHJlY2liaWRhLiBQcmVwYXJhbmRvIGluZm9ybWVz4oCmJzsKIGxldCBqc29uOwogaWYodHlwZW9mIERlY29tcHJlc3Npb25TdHJlYW09PT0ndW5kZWZpbmVkJylqc29uPWF3YWl0IHJwYygnZ2V0TWF0cml4Jyk7CiBlbHNle2NvbnN0IGJpbmFyeT1hdG9iKHRyYW5zcG9ydC5kYXRhKSxieXRlcz1uZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTtmb3IobGV0IGk9MDtpPGJpbmFyeS5sZW5ndGg7aSsrKWJ5dGVzW2ldPWJpbmFyeS5jaGFyQ29kZUF0KGkpO2pzb249YXdhaXQgbmV3IFJlc3BvbnNlKG5ldyBCbG9iKFtieXRlc10pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJykpKS50ZXh0KCl9CiBjb25zdCByZXN1bHQ9Y2xlYW5NYXRyaXhWNyhKU09OLnBhcnNlKGpzb24pKTtpZighQXJyYXkuaXNBcnJheShyZXN1bHQucm93cyl8fCFyZXN1bHQucm93cy5sZW5ndGgpdGhyb3cgRXJyb3IoJ0xhIG1hdHJpeiBubyBjb250aWVuZSByZWdpc3Ryb3MgYXBsaWNhYmxlcy4nKTtyZXR1cm4gcmVzdWx0Owp9Owphc3luYyBmdW5jdGlvbiBzdGFydERhc2hib2FyZFY5KCl7CiB0cnl7CiAgZGF0YT1hd2FpdCBjYWNoZWQoKTtzYXZlZFZpZXdzPVtdO2xvYWRWaWV3cygpOwogIC8vIFlpZWxkIGJlZm9yZSByZW5kZXJpbmcgc28gdGhlIHJlY2VpdmVkLWRhdGEgc3RhdHVzIGNhbiBiZSBwYWludGVkLgogIGF3YWl0IG5ldyBQcm9taXNlKG9rPT5zZXRUaW1lb3V0KG9rLDApKTtpbml0KCk7CiAgLy8gU2F2ZWQgdmlld3MgYXJlIG9wdGlvbmFsOyB0aGV5IG11c3QgbmV2ZXIgYmxvY2sgdGhlIG1hdHJpeC9kYXNoYm9hcmQuCiAgcnBjKCdnZXRWaWV3cycpLnRoZW4odmFsdWU9Pnt0cnl7Y29uc3Qgdmlld3M9SlNPTi5wYXJzZSh2YWx1ZSk7aWYoIUFycmF5LmlzQXJyYXkodmlld3MpKXRocm93IEVycm9yKCdGb3JtYXRvIGRlIHZpc3RhcyBubyB2w6FsaWRvJyk7c2F2ZWRWaWV3cz12aWV3cztsb2FkVmlld3MoKX1jYXRjaChlcnJvcil7JCgnI3N0YXR1cycpLnRleHRDb250ZW50Kz0nIMK3IE5vIHNlIGNhcmdhcm9uIGxhcyB2aXN0YXMgZ3VhcmRhZGFzOiAnK2Vycm9yLm1lc3NhZ2V9fSkuY2F0Y2goZXJyb3I9PnskKCcjc3RhdHVzJykudGV4dENvbnRlbnQrPScgwrcgTWF0cml6IGRpc3BvbmlibGU7IGxhcyB2aXN0YXMgZ3VhcmRhZGFzIG5vIHJlc3BvbmRpZXJvbi4nfSk7CiB9Y2F0Y2goZXJyb3IpeyQoJyNzdGF0dXMnKS50ZXh0Q29udGVudD0nTm8gc2UgcHVkbyBpbmljaWFyOiAnK2Vycm9yLm1lc3NhZ2UrJyBTaSBhcGFyZWNlIGdldE1hdHJpeFRyYW5zcG9ydCwgcmVlbXBsYXphIHRhbWJpw6luIENvZGUuZ3MgcG9yIGxhIHZlcnNpw7NuIG51ZXZhIHkgdnVlbHZlIGEgaW1wbGVtZW50YXIuJztjb25zb2xlLmVycm9yKGVycm9yKX0KfQpjb25zdCBjYWxlbmRhckJlZm9yZVYxMT1jYWxlbmRhclN0YXRlVjg7CmNhbGVuZGFyU3RhdGVWOD1mdW5jdGlvbihzY29wZSl7Y29uc3Qgc3RhdGU9Y2FsZW5kYXJCZWZvcmVWMTEoc2NvcGUpO2lmKCFBcnJheS5pc0FycmF5KHN0YXRlLm1vbnRocykpc3RhdGUubW9udGhzPXN0YXRlLm1vbnRoP1tzdGF0ZS5tb250aF06W107c3RhdGUud2Vla3M9KHN0YXRlLndlZWtzfHxbXSkubWFwKHc9PlN0cmluZyh3KS5pbmNsdWRlcygnfCcpP1N0cmluZyh3KTooc3RhdGUubW9udGg/c3RhdGUubW9udGgrJ3wnK3c6U3RyaW5nKHcpKSk7cmV0dXJuIHN0YXRlfTsKY29uc3QgYWNjZXB0QmVmb3JlVjExPWFjY2VwdHNDYWxlbmRhclY4OwphY2NlcHRzQ2FsZW5kYXJWOD1mdW5jdGlvbihyb3csc3RhdGUsZnJvbSx0byl7CiBpZighWydtb250aCcsJ3dlZWsnXS5pbmNsdWRlcyhzdGF0ZS5tb2RlKSlyZXR1cm4gYWNjZXB0QmVmb3JlVjExKHJvdyxzdGF0ZSxmcm9tLHRvKTsKIGNvbnN0IG1vbnRoPXJvd1swXS5zbGljZSgwLDcpLG1vbnRocz1BcnJheS5pc0FycmF5KHN0YXRlLm1vbnRocyk/c3RhdGUubW9udGhzOnN0YXRlLm1vbnRoP1tzdGF0ZS5tb250aF06W107CiBpZihtb250aHMubGVuZ3RoJiYhbW9udGhzLmluY2x1ZGVzKG1vbnRoKSlyZXR1cm4gZmFsc2U7CiBpZihzdGF0ZS5tb2RlPT09J21vbnRoJylyZXR1cm4gdHJ1ZTsKIGNvbnN0IGtleT1tb250aCsnfCcrd2Vla051bWJlclY4KHJvd1swXSk7cmV0dXJuICFzdGF0ZS53ZWVrcy5sZW5ndGh8fHN0YXRlLndlZWtzLmluY2x1ZGVzKGtleSl8fCghQXJyYXkuaXNBcnJheShzdGF0ZS5tb250aHMpJiZzdGF0ZS53ZWVrcy5pbmNsdWRlcyhTdHJpbmcod2Vla051bWJlclY4KHJvd1swXSkpKSk7Cn07CmNvbnN0IHBhbmVsQmVmb3JlVjExPWNhbGVuZGFyUGFuZWxWODsKY2FsZW5kYXJQYW5lbFY4PWZ1bmN0aW9uKHNjb3BlKXsKIGNvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7aWYoIVsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpcmV0dXJuIHBhbmVsQmVmb3JlVjExKHNjb3BlKTsKIGNvbnN0IG1vbnRocz1tb250aENob2ljZXNWOCgpO2lmKCFzdGF0ZS5tb250aHMubGVuZ3RoJiZzdGF0ZS5tb250aCYmIXN0YXRlLm1vbnRoc0luaXRpYWxpemVkKXtzdGF0ZS5tb250aHM9W3N0YXRlLm1vbnRoXTtzdGF0ZS5tb250aHNJbml0aWFsaXplZD10cnVlfQogY29uc3Qgc2VsZWN0ZWQ9c3RhdGUubW9udGhzLmxlbmd0aD9zdGF0ZS5tb250aHM6bW9udGhzOwogY29uc3QgbW9udGhPcHRpb25zPW1vbnRocy5tYXAobT0+YDxvcHRpb24gdmFsdWU9IiR7bX0iICR7c3RhdGUubW9udGhzLmluY2x1ZGVzKG0pPydzZWxlY3RlZCc6Jyd9PiR7ZGlzcGxheURhdGVzVjUobSl9PC9vcHRpb24+YCkuam9pbignJyk7CiBjb25zdCB3ZWVrT3B0aW9ucz1zZWxlY3RlZC5tYXAobT0+e2NvbnN0IHdlZWtNYXA9bmV3IE1hcDtmb3IoY29uc3QgciBvZiBkYXRhLnJvd3Mpe2lmKCFyWzBdLnN0YXJ0c1dpdGgobSkpY29udGludWU7bGV0IHc9d2Vla051bWJlclY4KHJbMF0pO2lmKCF3ZWVrTWFwLmhhcyh3KSl3ZWVrTWFwLnNldCh3LFtdKTt3ZWVrTWFwLmdldCh3KS5wdXNoKHJbMF0pfXJldHVybiBgPG9wdGdyb3VwIGxhYmVsPSIke2Rpc3BsYXlEYXRlc1Y1KG0pfSI+JHtbLi4ud2Vla01hcF0uc29ydCgoYSxiKT0+YVswXS1iWzBdKS5tYXAoKFt3LGRhdGVzXSk9PntkYXRlcy5zb3J0KCk7bGV0IGtleT1tKyd8Jyt3O3JldHVybiBgPG9wdGlvbiB2YWx1ZT0iJHtrZXl9IiAke3N0YXRlLndlZWtzLmluY2x1ZGVzKGtleSk/J3NlbGVjdGVkJzonJ30+JHttb250aFNob3J0VjhbTnVtYmVyKG0uc2xpY2UoNSkpLTFdfS0ke3d9IMK3ICR7bS5zbGljZSgwLDQpfSDCtyAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKX0gYSAke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSl9PC9vcHRpb24+YH0pLmpvaW4oJycpfTwvb3B0Z3JvdXA+YH0pLmpvaW4oJycpOwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjYWxlbmRhclBhbmVsIiBkYXRhLWNhbGVuZGFycGFuZWw9IiR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJjYWxlbmRhckNvbnRyb2xzIj48bGFiZWw+U2VsZWNjaW9uYXIgZmVjaGFzIHBvcjxzZWxlY3QgZGF0YS1jYWxtb2RlPSIke3Njb3BlfSI+JHtPYmplY3QuZW50cmllcyh7cmFuZ2U6J1JhbmdvIGNvbiBjYWxlbmRhcmlvJyxkYXRlczonRMOtYXMgZXNwZWPDrWZpY29zJyxtb250aDonTWVzZXMnLHdlZWs6J01lc2VzIHkgc2VtYW5hcycscXVhcnRlcjonVHJpbWVzdHJlJ30pLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtzdGF0ZS5tb2RlPT09az8nc2VsZWN0ZWQnOicnfT4ke3Z9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD48bGFiZWw+MS4gTWVzZXMgwrcgQ3RybC9DbWQgKyBjbGljPHNlbGVjdCBtdWx0aXBsZSBkYXRhLWNhbG1vbnRoPSIke3Njb3BlfSIgYXJpYS1sYWJlbD0iTWVzZXMgc2VsZWNjaW9uYWRvcyI+JHttb250aE9wdGlvbnN9PC9zZWxlY3Q+PC9sYWJlbD4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/YDxsYWJlbD4yLiBTZW1hbmFzIGRlIGxvcyBtZXNlcyBlbGVnaWRvczxzZWxlY3QgbXVsdGlwbGUgZGF0YS1jYWx3ZWVrcz0iJHtzY29wZX0iPiR7d2Vla09wdGlvbnN9PC9zZWxlY3Q+PC9sYWJlbD5gOicnfTxzbWFsbD5DdHJsL0NtZCArIGNsaWMgcGFyYSBzZWxlY2Npb25hciB2YXJpb3MgbWVzZXMke3N0YXRlLm1vZGU9PT0nd2Vlayc/JyBvIHNlbWFuYXMnOicnfS4gU2luIG1lc2VzIHNlbGVjY2lvbmFkb3M6IHRvZG9zIGxvcyBtZXNlcy4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/JyBTaW4gc2VtYW5hcyBzZWxlY2Npb25hZGFzOiB0b2RhcyBsYXMgc2VtYW5hcyBkZSBsb3MgbWVzZXMgZWxlZ2lkb3MuIENhZGEgc2VtYW5hIGluY2x1eWUgc29sbyBsb3MgZMOtYXMgZGUgc3UgbWVzLic6Jyd9PC9zbWFsbD48L2Rpdj48L2Rpdj5gOwp9Owpjb25zdCBiaW5kQmVmb3JlVjExPWJpbmRDYWxlbmRhcnNWODsKYmluZENhbGVuZGFyc1Y4PWZ1bmN0aW9uKCl7YmluZEJlZm9yZVYxMSgpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhbG1vbnRoXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57Y29uc3Qgc3RhdGU9Y2FsZW5kYXJTdGF0ZVY4KGVsLmRhdGFzZXQuY2FsbW9udGgpO3N0YXRlLm1vbnRocz1bLi4uZWwuc2VsZWN0ZWRPcHRpb25zXS5tYXAobz0+by52YWx1ZSk7c3RhdGUubW9udGhzSW5pdGlhbGl6ZWQ9dHJ1ZTtzdGF0ZS5tb250aD1zdGF0ZS5tb250aHNbMF18fCcnO3N0YXRlLndlZWtzPVtdO3JlbmRlcigpfSk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2Fsd2Vla3NdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9PntjYWxlbmRhclN0YXRlVjgoZWwuZGF0YXNldC5jYWx3ZWVrcykud2Vla3M9Wy4uLmVsLnNlbGVjdGVkT3B0aW9uc10ubWFwKG89Pm8udmFsdWUpO3JlbmRlcigpfSl9Owpjb25zdCBzZWxlY3RlZEJlZm9yZVYxMT1zZWxlY3RlZERhdGVUZXh0Vjg7CnNlbGVjdGVkRGF0ZVRleHRWOD1mdW5jdGlvbihzY29wZSl7Y29uc3Qgcz1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO2lmKCFbJ21vbnRoJywnd2VlayddLmluY2x1ZGVzKHMubW9kZSkpcmV0dXJuIHNlbGVjdGVkQmVmb3JlVjExKHNjb3BlKTtjb25zdCBtb250aHM9cy5tb250aHMubGVuZ3RoP3MubW9udGhzLm1hcChkaXNwbGF5RGF0ZXNWNSkuam9pbignLCAnKTonVG9kb3MgbG9zIG1lc2VzJztyZXR1cm4gbW9udGhzKyhzLm1vZGU9PT0nd2Vlayc/KHMud2Vla3MubGVuZ3RoPycgwrcgJytzLndlZWtzLm1hcChrZXk9Pntjb25zdFttLHddPWtleS5zcGxpdCgnfCcpO3JldHVybiBtb250aFNob3J0VjhbTnVtYmVyKG0uc2xpY2UoNSkpLTFdKyctJyt3KycgwrcgJyttLnNsaWNlKDAsNCl9KS5qb2luKCcsICcpOicgwrcgVG9kYXMgbGFzIHNlbWFuYXMnKTonJyl9OwoKY29uc3QgcGFuZWxCZWZvcmVWMTI9Y2FsZW5kYXJQYW5lbFY4OwpmdW5jdGlvbiB3ZWVrQ2hlY2tzVjEyKHNjb3BlLG1vbnRocyxzZWxlY3RlZFdlZWtzKXsKIGNvbnN0IGF2YWlsYWJsZT1tb250aHMubGVuZ3RoP21vbnRoczptb250aENob2ljZXNWOCgpOwogcmV0dXJuIGF2YWlsYWJsZS5tYXAobW9udGg9Pntjb25zdCB3ZWVrcz1uZXcgTWFwO2Zvcihjb25zdCByIG9mIGRhdGEucm93cyl7aWYoIXJbMF0uc3RhcnRzV2l0aChtb250aCkpY29udGludWU7Y29uc3Qgdz13ZWVrTnVtYmVyVjgoclswXSk7aWYoIXdlZWtzLmhhcyh3KSl3ZWVrcy5zZXQodyxbXSk7d2Vla3MuZ2V0KHcpLnB1c2goclswXSl9cmV0dXJuIGA8ZGl2IGNsYXNzPSJ3ZWVrTW9udGhWMTIiPjxiPiR7ZGlzcGxheURhdGVzVjUobW9udGgpfTwvYj4ke1suLi53ZWVrc10uc29ydCgoYSxiKT0+YVswXS1iWzBdKS5tYXAoKFt3LGRhdGVzXSk9PntkYXRlcy5zb3J0KCk7Y29uc3QgdmFsdWU9bW9udGgrJ3wnK3c7cmV0dXJuIGA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXdlZWtjaGVjaz0iJHtzY29wZX0iIHZhbHVlPSIke3ZhbHVlfSIgJHtzZWxlY3RlZFdlZWtzLmluY2x1ZGVzKHZhbHVlKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7bW9udGhTaG9ydFY4W051bWJlcihtb250aC5zbGljZSg1KSktMV19LSR7d30gwrcgJHttb250aC5zbGljZSgwLDQpfTxzbWFsbD4ke2Rpc3BsYXlEYXRlc1Y1KGRhdGVzWzBdKX0g4oaSICR7ZGlzcGxheURhdGVzVjUoZGF0ZXMuYXQoLTEpKX08L3NtYWxsPjwvc3Bhbj48L2xhYmVsPmB9KS5qb2luKCcnKX08L2Rpdj5gfSkuam9pbignJyk7Cn0KY2FsZW5kYXJQYW5lbFY4PWZ1bmN0aW9uKHNjb3BlKXsKIGNvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7aWYoIVsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpcmV0dXJuIHBhbmVsQmVmb3JlVjEyKHNjb3BlKTsKIGNvbnN0IG1vbnRocz1tb250aENob2ljZXNWOCgpO2lmKCFzdGF0ZS5tb250aHMubGVuZ3RoJiZzdGF0ZS5tb250aCYmIXN0YXRlLm1vbnRoc0luaXRpYWxpemVkKXtzdGF0ZS5tb250aHM9W3N0YXRlLm1vbnRoXTtzdGF0ZS5tb250aHNJbml0aWFsaXplZD10cnVlfQogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjYWxlbmRhclBhbmVsIiBkYXRhLWNhbGVuZGFycGFuZWw9IiR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJjYWxlbmRhckNvbnRyb2xzIj48bGFiZWw+U2VsZWNjaW9uYXIgZmVjaGFzIHBvcjxzZWxlY3QgZGF0YS1jYWxtb2RlPSIke3Njb3BlfSI+JHtPYmplY3QuZW50cmllcyh7cmFuZ2U6J1JhbmdvIGNvbiBjYWxlbmRhcmlvJyxkYXRlczonRMOtYXMgZXNwZWPDrWZpY29zJyxtb250aDonTWVzZXMnLHdlZWs6J01lc2VzIHkgc2VtYW5hcycscXVhcnRlcjonVHJpbWVzdHJlJ30pLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtzdGF0ZS5tb2RlPT09az8nc2VsZWN0ZWQnOicnfT4ke3Z9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD48L2Rpdj48ZGl2IGNsYXNzPSJtb250aEFjdGlvbnNWMTIiPjxiPjEuIE1hcmNhIGxvcyBtZXNlcyBxdWUgcXVpZXJhcyBjb25zdWx0YXI8L2I+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbW9udGhhbGw9IiR7c2NvcGV9Ij5Ub2RvczwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW1vbnRoY2xlYXI9IiR7c2NvcGV9Ij5MaW1waWFyPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0ibW9udGhDaGVja3NWMTIiPiR7bW9udGhzLm1hcChtPT5gPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1tb250aGNoZWNrPSIke3Njb3BlfSIgdmFsdWU9IiR7bX0iICR7c3RhdGUubW9udGhzLmluY2x1ZGVzKG0pPydjaGVja2VkJzonJ30+PHNwYW4+JHtkaXNwbGF5RGF0ZXNWNShtKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKX08L2Rpdj4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/YDxwPjxiPjIuIE1hcmNhIGxhcyBzZW1hbmFzIGRlIGVzb3MgbWVzZXM8L2I+PC9wPjxkaXYgY2xhc3M9IndlZWtDaGVja3NWMTIiIGRhdGEtd2Vla2xpc3Q9IiR7c2NvcGV9Ij4ke3dlZWtDaGVja3NWMTIoc2NvcGUsc3RhdGUubW9udGhzLHN0YXRlLndlZWtzKX08L2Rpdj5gOicnfTxkaXYgY2xhc3M9ImFwcGx5TW9udGhzVjEyIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGRhdGEtYXBwbHltb250aHM9IiR7c2NvcGV9Ij5BcGxpY2FyIHNlbGVjY2nDs248L2J1dHRvbj48c3BhbiBkYXRhLW1vbnRobWVzc2FnZT0iJHtzY29wZX0iPlB1ZWRlcyBtYXJjYXIgdmFyaW9zIHNpbiB1c2FyIEN0cmwuIExvcyBpbmZvcm1lcyBjYW1iaWFuIGFsIHB1bHNhciBBcGxpY2FyIHNlbGVjY2nDs24uPC9zcGFuPjwvZGl2PjxwIGNsYXNzPSJzaWduYWxub3RlIj5TaW4gbWVzZXMgbWFyY2Fkb3Mgc2UgY29uc3VsdGFuIHRvZG9zIGxvcyBtZXNlcy4ke3N0YXRlLm1vZGU9PT0nd2Vlayc/JyBTaW4gc2VtYW5hcyBtYXJjYWRhcyBzZSBjb25zdWx0YW4gdG9kYXMgbGFzIHNlbWFuYXMgZGUgbG9zIG1lc2VzIGVsZWdpZG9zLic6Jyd9PC9wPjwvZGl2PmA7Cn07CmZ1bmN0aW9uIGNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsdHlwZSl7cmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK3R5cGUrJz0iJytzY29wZSsnIl0nKV0uZmlsdGVyKGVsPT5lbC5jaGVja2VkKS5tYXAoZWw9PmVsLnZhbHVlKX0KZnVuY3Rpb24gcmVmcmVzaFdlZWtzVjEyKHNjb3BlKXtjb25zdCBjb250YWluZXI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtd2Vla2xpc3Q9Iicrc2NvcGUrJyJdJyk7aWYoY29udGFpbmVyKXtjb25zdCB3ZWVrcz1jaGVja2VkVmFsdWVzVjEyKHNjb3BlLCd3ZWVrY2hlY2snKTtjb250YWluZXIuaW5uZXJIVE1MPXdlZWtDaGVja3NWMTIoc2NvcGUsY2hlY2tlZFZhbHVlc1YxMihzY29wZSwnbW9udGhjaGVjaycpLHdlZWtzKX1jb25zdCBtZXNzYWdlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vbnRobWVzc2FnZT0iJytzY29wZSsnIl0nKTtpZihtZXNzYWdlKW1lc3NhZ2UudGV4dENvbnRlbnQ9J1NlbGVjY2nDs24gcGVuZGllbnRlLiBQdWxzYSBBcGxpY2FyIHNlbGVjY2nDs24gcGFyYSBhY3R1YWxpemFyIGVsIGluZm9ybWUuJ30KY29uc3QgYmluZEJlZm9yZVYxMj1iaW5kQ2FsZW5kYXJzVjg7CmJpbmRDYWxlbmRhcnNWOD1mdW5jdGlvbigpewogYmluZEJlZm9yZVYxMigpOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9udGhjaGVja10nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT0oKT0+cmVmcmVzaFdlZWtzVjEyKGVsLmRhdGFzZXQubW9udGhjaGVjaykpOwogZm9yKGNvbnN0W3R5cGUsY2hlY2tlZF1vZiBbWydtb250aGFsbCcsdHJ1ZV0sWydtb250aGNsZWFyJyxmYWxzZV1dKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLScrdHlwZSsnXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24ub25jbGljaz0oKT0+e2NvbnN0IHNjb3BlPWJ1dHRvbi5kYXRhc2V0W3R5cGVdO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vbnRoY2hlY2s9Iicrc2NvcGUrJyJdJykuZm9yRWFjaChlbD0+ZWwuY2hlY2tlZD1jaGVja2VkKTtyZWZyZXNoV2Vla3NWMTIoc2NvcGUpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hcHBseW1vbnRoc10nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9KCk9Pntjb25zdCBzY29wZT1idXR0b24uZGF0YXNldC5hcHBseW1vbnRocyxzdGF0ZT1jYWxlbmRhclN0YXRlVjgoc2NvcGUpO3N0YXRlLm1vbnRocz1jaGVja2VkVmFsdWVzVjEyKHNjb3BlLCdtb250aGNoZWNrJyk7c3RhdGUubW9udGhzSW5pdGlhbGl6ZWQ9dHJ1ZTtzdGF0ZS5tb250aD1zdGF0ZS5tb250aHNbMF18fCcnO3N0YXRlLndlZWtzPXN0YXRlLm1vZGU9PT0nd2Vlayc/Y2hlY2tlZFZhbHVlc1YxMihzY29wZSwnd2Vla2NoZWNrJyk6W107cmVuZGVyKCl9KTsKfTsKCmNvbnN0IHBhbmVsQmVmb3JlVjEzPWNhbGVuZGFyUGFuZWxWODsKZnVuY3Rpb24gc2VsZWN0aW9uQ2FwdGlvblYxMyh2YWx1ZXMsdHlwZSl7aWYoIXZhbHVlcy5sZW5ndGgpcmV0dXJuIHR5cGU9PT0nbW9udGgnPydUb2RvcyBsb3MgbWVzZXMnOidUb2RhcyBsYXMgc2VtYW5hcyc7aWYodmFsdWVzLmxlbmd0aD4yKXJldHVybiB2YWx1ZXMubGVuZ3RoKyh0eXBlPT09J21vbnRoJz8nIG1lc2VzIHNlbGVjY2lvbmFkb3MnOicgc2VtYW5hcyBzZWxlY2Npb25hZGFzJyk7cmV0dXJuIHZhbHVlcy5tYXAodmFsdWU9PntpZih0eXBlPT09J21vbnRoJylyZXR1cm4gZGlzcGxheURhdGVzVjUodmFsdWUpO2NvbnN0W20sd109dmFsdWUuc3BsaXQoJ3wnKTtyZXR1cm4gbW9udGhTaG9ydFY4W051bWJlcihtLnNsaWNlKDUpKS0xXSsnLScrdysnIMK3ICcrbS5zbGljZSgwLDQpfSkuam9pbignLCAnKX0KY2FsZW5kYXJQYW5lbFY4PWZ1bmN0aW9uKHNjb3BlKXsKIGNvbnN0IHN0YXRlPWNhbGVuZGFyU3RhdGVWOChzY29wZSk7aWYoIVsnbW9udGgnLCd3ZWVrJ10uaW5jbHVkZXMoc3RhdGUubW9kZSkpcmV0dXJuIHBhbmVsQmVmb3JlVjEzKHNjb3BlKTsKIGNvbnN0IG1vbnRocz1tb250aENob2ljZXNWOCgpO2lmKCFzdGF0ZS5tb250aHMubGVuZ3RoJiZzdGF0ZS5tb250aCYmIXN0YXRlLm1vbnRoc0luaXRpYWxpemVkKXtzdGF0ZS5tb250aHM9W3N0YXRlLm1vbnRoXTtzdGF0ZS5tb250aHNJbml0aWFsaXplZD10cnVlfQogY29uc3QgY2hlY2tzPW1vbnRocy5tYXAobT0+YDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtbW9udGhjaGVjaz0iJHtzY29wZX0iIHZhbHVlPSIke219IiAke3N0YXRlLm1vbnRocy5pbmNsdWRlcyhtKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZGlzcGxheURhdGVzVjUobSl9PC9zcGFuPjwvbGFiZWw+YCkuam9pbignJyk7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNhbGVuZGFyUGFuZWwgY29tcGFjdENhbGVuZGFyVjEzIiBkYXRhLWNhbGVuZGFycGFuZWw9IiR7c2NvcGV9Ij48ZGl2IGNsYXNzPSJjb21wYWN0Um93VjEzIj48bGFiZWw+U2VsZWNjaW9uYXIgZmVjaGFzIHBvcjxzZWxlY3QgZGF0YS1jYWxtb2RlPSIke3Njb3BlfSI+JHtPYmplY3QuZW50cmllcyh7cmFuZ2U6J1JhbmdvIGNvbiBjYWxlbmRhcmlvJyxkYXRlczonRMOtYXMgZXNwZWPDrWZpY29zJyxtb250aDonTWVzZXMnLHdlZWs6J01lc2VzIHkgc2VtYW5hcycscXVhcnRlcjonVHJpbWVzdHJlJ30pLm1hcCgoW2ssdl0pPT5gPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtzdGF0ZS5tb2RlPT09az8nc2VsZWN0ZWQnOicnfT4ke3Z9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9sYWJlbD48ZGl2IGNsYXNzPSJkcm9wZG93bkZpZWxkVjEzIj48c3Bhbj5NZXNlczwvc3Bhbj48ZGV0YWlscyBjbGFzcz0iZXhjZWxEcm9wZG93blYxMyIgZGF0YS1leGNlbGRyb3A9IiR7c2NvcGV9LW1vbnRoIj48c3VtbWFyeT48c3BhbiBkYXRhLW1vbnRoY2FwdGlvbj0iJHtzY29wZX0iPiR7ZXNjKHNlbGVjdGlvbkNhcHRpb25WMTMoc3RhdGUubW9udGhzLCdtb250aCcpKX08L3NwYW4+PGI+4pa+PC9iPjwvc3VtbWFyeT48ZGl2IGNsYXNzPSJleGNlbE1lbnVWMTMiPjxpbnB1dCB0eXBlPSJzZWFyY2giIHBsYWNlaG9sZGVyPSJCdXNjYXIgbWVz4oCmIiBhcmlhLWxhYmVsPSJCdXNjYXIgbWVzIiBkYXRhLWRyb3Bkb3duc2VhcmNoPSJtb250aC0ke3Njb3BlfSI+PGRpdiBjbGFzcz0iZHJvcGRvd25BY3Rpb25zVjEzIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1tb250aGFsbD0iJHtzY29wZX0iPlNlbGVjY2lvbmFyIHRvZG9zPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbW9udGhjbGVhcj0iJHtzY29wZX0iPkxpbXBpYXI8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJtb250aENoZWNrc1YxMiIgZGF0YS1zZWFyY2hsaXN0PSJtb250aC0ke3Njb3BlfSI+JHtjaGVja3N9PC9kaXY+PHNtYWxsPk1hcmNhIHZhcmlvcyBtZXNlcyBzaW4gdXNhciBDdHJsLjwvc21hbGw+PC9kaXY+PC9kZXRhaWxzPjwvZGl2PiR7c3RhdGUubW9kZT09PSd3ZWVrJz9gPGRpdiBjbGFzcz0iZHJvcGRvd25GaWVsZFYxMyI+PHNwYW4+U2VtYW5hcyBkZSBlc29zIG1lc2VzPC9zcGFuPjxkZXRhaWxzIGNsYXNzPSJleGNlbERyb3Bkb3duVjEzIiBkYXRhLWV4Y2VsZHJvcD0iJHtzY29wZX0td2VlayI+PHN1bW1hcnk+PHNwYW4gZGF0YS13ZWVrY2FwdGlvbj0iJHtzY29wZX0iPiR7ZXNjKHNlbGVjdGlvbkNhcHRpb25WMTMoc3RhdGUud2Vla3MsJ3dlZWsnKSl9PC9zcGFuPjxiPuKWvjwvYj48L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48aW5wdXQgdHlwZT0ic2VhcmNoIiBwbGFjZWhvbGRlcj0iQnVzY2FyIHNlbWFuYeKApiIgYXJpYS1sYWJlbD0iQnVzY2FyIHNlbWFuYSIgZGF0YS1kcm9wZG93bnNlYXJjaD0id2Vlay0ke3Njb3BlfSI+PGRpdiBjbGFzcz0iZHJvcGRvd25BY3Rpb25zVjEzIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS13ZWVrYWxsdjEzPSIke3Njb3BlfSI+U2VsZWNjaW9uYXIgdG9kYXM8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS13ZWVrY2xlYXJ2MTM9IiR7c2NvcGV9Ij5MaW1waWFyPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0id2Vla0NoZWNrc1YxMiIgZGF0YS13ZWVrbGlzdD0iJHtzY29wZX0iIGRhdGEtc2VhcmNobGlzdD0id2Vlay0ke3Njb3BlfSI+JHt3ZWVrQ2hlY2tzVjEyKHNjb3BlLHN0YXRlLm1vbnRocyxzdGF0ZS53ZWVrcyl9PC9kaXY+PHNtYWxsPlNpbiBzZW1hbmFzIG1hcmNhZGFzOiB0b2RhcyBsYXMgZGUgbG9zIG1lc2VzIGVsZWdpZG9zLjwvc21hbGw+PC9kaXY+PC9kZXRhaWxzPjwvZGl2PmA6Jyd9PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwcmltYXJ5IiBkYXRhLWFwcGx5bW9udGhzPSIke3Njb3BlfSI+QXBsaWNhciBzZWxlY2Npw7NuPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0iY29tcGFjdE1lc3NhZ2VWMTMiIGRhdGEtbW9udGhtZXNzYWdlPSIke3Njb3BlfSI+U2VsZWNjaW9uYSBtZXNlcyR7c3RhdGUubW9kZT09PSd3ZWVrJz8nIHkgc2VtYW5hcyc6Jyd9IHkgcHVsc2EgQXBsaWNhciBzZWxlY2Npw7NuLjwvZGl2PjwvZGl2PmA7Cn07CmZ1bmN0aW9uIHVwZGF0ZUNhcHRpb25zVjEzKHNjb3BlKXtjb25zdCBtb250aD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb250aGNhcHRpb249Iicrc2NvcGUrJyJdJyksd2Vlaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS13ZWVrY2FwdGlvbj0iJytzY29wZSsnIl0nKTtpZihtb250aCltb250aC50ZXh0Q29udGVudD1zZWxlY3Rpb25DYXB0aW9uVjEzKGNoZWNrZWRWYWx1ZXNWMTIoc2NvcGUsJ21vbnRoY2hlY2snKSwnbW9udGgnKTtpZih3ZWVrKXdlZWsudGV4dENvbnRlbnQ9c2VsZWN0aW9uQ2FwdGlvblYxMyhjaGVja2VkVmFsdWVzVjEyKHNjb3BlLCd3ZWVrY2hlY2snKSwnd2VlaycpfQpjb25zdCByZWZyZXNoQmVmb3JlVjEzPXJlZnJlc2hXZWVrc1YxMjsKcmVmcmVzaFdlZWtzVjEyPWZ1bmN0aW9uKHNjb3BlKXtyZWZyZXNoQmVmb3JlVjEzKHNjb3BlKTt1cGRhdGVDYXB0aW9uc1YxMyhzY29wZSl9Owpjb25zdCBiaW5kQmVmb3JlVjEzPWJpbmRDYWxlbmRhcnNWODsKYmluZENhbGVuZGFyc1Y4PWZ1bmN0aW9uKCl7CiBiaW5kQmVmb3JlVjEzKCk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS13ZWVrY2hlY2tdJykuZm9yRWFjaChlbD0+ZWwub25jaGFuZ2U9KCk9Pnt1cGRhdGVDYXB0aW9uc1YxMyhlbC5kYXRhc2V0LndlZWtjaGVjayl9KTsKIGZvcihjb25zdFt0eXBlLGNoZWNrZWRdb2YgW1snd2Vla2FsbHYxMycsdHJ1ZV0sWyd3ZWVrY2xlYXJ2MTMnLGZhbHNlXV0pZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtJyt0eXBlKyddJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPSgpPT57Y29uc3Qgc2NvcGU9YnV0dG9uLmRhdGFzZXRbdHlwZV07ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtd2Vla2NoZWNrPSInK3Njb3BlKyciXScpLmZvckVhY2goZWw9PmVsLmNoZWNrZWQ9Y2hlY2tlZCk7dXBkYXRlQ2FwdGlvbnNWMTMoc2NvcGUpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kcm9wZG93bnNlYXJjaF0nKS5mb3JFYWNoKGlucHV0PT5pbnB1dC5vbmlucHV0PSgpPT57Y29uc3QgbGlzdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWFyY2hsaXN0PSInK2lucHV0LmRhdGFzZXQuZHJvcGRvd25zZWFyY2grJyJdJyk7aWYoIWxpc3QpcmV0dXJuO2NvbnN0IHNlYXJjaD1pbnB1dC52YWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJyk7bGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hlY2tJdGVtVjEyJykuZm9yRWFjaChsYWJlbD0+bGFiZWwuc3R5bGUuZGlzcGxheT1sYWJlbC50ZXh0Q29udGVudC50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKS5pbmNsdWRlcyhzZWFyY2gpPydmbGV4Jzonbm9uZScpfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjZWxEcm9wZG93blYxMycpLmZvckVhY2goZHJvcD0+ZHJvcC5hZGRFdmVudExpc3RlbmVyKCd0b2dnbGUnLCgpPT57aWYoZHJvcC5vcGVuKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGNlbERyb3Bkb3duVjEzJykuZm9yRWFjaChvdGhlcj0+e2lmKG90aGVyIT09ZHJvcClvdGhlci5vcGVuPWZhbHNlfSl9KSk7Cn07Ci8vIFdlZWsgb3B0aW9ucyBhcmUgcmVnZW5lcmF0ZWQgd2hlbiBtb250aHMgY2hhbmdlOiBoYW5kbGUgdGhlaXIgY2FwdGlvbnMgYnkgZGVsZWdhdGlvbi4KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxldmVudD0+e2lmKGV2ZW50LnRhcmdldC5tYXRjaGVzPy4oJ1tkYXRhLXdlZWtjaGVja10nKSl1cGRhdGVDYXB0aW9uc1YxMyhldmVudC50YXJnZXQuZGF0YXNldC53ZWVrY2hlY2spfSk7CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxldmVudD0+ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4Y2VsRHJvcGRvd25WMTNbb3Blbl0nKS5mb3JFYWNoKGRyb3A9PntpZighZHJvcC5jb250YWlucyhldmVudC50YXJnZXQpKWRyb3Aub3Blbj1mYWxzZX0pKTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihldmVudC5rZXk9PT0nRXNjYXBlJylkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjZWxEcm9wZG93blYxM1tvcGVuXScpLmZvckVhY2goZHJvcD0+ZHJvcC5vcGVuPWZhbHNlKX0pOwoKbGV0IGFwcFNlc3Npb25WMTU9bnVsbCxzdGFydGVkU2Vzc2lvblYxNT1mYWxzZTsKZnVuY3Rpb24gdXBsb2FkUHJvZ3Jlc3NMQSh0ZXh0KXsKIGZvcihjb25zdCBpZCBvZiBbJ2xvZ2luTWVzc2FnZVYxNScsJ3N0YXR1cyddKXtjb25zdCBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYoZWwpZWwudGV4dENvbnRlbnQ9dGV4dDt9Cn0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkQ2h1bmtzTEEoaW5jb21pbmcsbW9kZSxleHBlY3RlZFJldmlzaW9uLHRva2VuKXsKIGlmKCFpbmNvbWluZz8ucm93cz8ubGVuZ3RoKXRocm93IEVycm9yKCdMYSBtYXRyaXogbm8gdGllbmUgcmVnaXN0cm9zIGFwbGljYWJsZXMuJyk7CiBpZihpbmNvbWluZy5yb3dzLmxlbmd0aD4yMDAwMDApdGhyb3cgRXJyb3IoJ0xhIGltcG9ydGFjacOzbiBzdXBlcmEgMjAwLjAwMCByZWdpc3Ryb3MuJyk7CiBjb25zdCBlbmNvZGVkPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShpbmNvbWluZykpOwogaWYoZW5jb2RlZC5ieXRlTGVuZ3RoPjQwMDAwMDAwKXRocm93IEVycm9yKCdFbCBhcmNoaXZvIG5vcm1hbGl6YWRvIHN1cGVyYSA0MCBNQi4nKTsKIGNvbnN0IGRpZ2VzdD1hd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsZW5jb2RlZCksZmluZ2VycHJpbnQ9QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShkaWdlc3QpLHg9PngudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsJzAnKSkuam9pbignJyk7CiBjb25zdCByZXZpc2lvbj1leHBlY3RlZFJldmlzaW9uJiZleHBlY3RlZFJldmlzaW9uIT09J2luaXRpYWwnP2V4cGVjdGVkUmV2aXNpb246bnVsbDsKIGNvbnN0IHN0b3JhZ2VLZXk9J0xBX1VQTE9BRDonK2ZpbmdlcnByaW50Kyc6Jyttb2RlKyc6JysocmV2aXNpb258fCdpbml0aWFsJyk7CiBsZXQgdXBsb2FkSWQ7dHJ5e3VwbG9hZElkPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSl9Y2F0Y2goZSl7fQogaWYoIXVwbG9hZElkKXt1cGxvYWRJZD1jcnlwdG8ucmFuZG9tVVVJRCgpO3RyeXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksdXBsb2FkSWQpfWNhdGNoKGUpe319CiBjb25zdCB7cm93cywuLi5tZXRhZGF0YX09aW5jb21pbmc7ZGVsZXRlIG1ldGFkYXRhLnN0b3JhZ2VSZXZpc2lvbjsKIGNvbnN0IHBhcnRzPU1hdGguY2VpbChyb3dzLmxlbmd0aC81MDApOwogYXN5bmMgZnVuY3Rpb24gY2FsbChuYW1lLGJvZHkpewogIGxldCBsYXN0OwogIGZvcihsZXQgYXR0ZW1wdD0wO2F0dGVtcHQ8MzthdHRlbXB0KyspewogICB0cnl7cmV0dXJuIGF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9ycGMvJytuYW1lLHttZXRob2Q6J1BPU1QnLGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSl9LHRva2VuKX0KICAgY2F0Y2goZXJyb3Ipe2xhc3Q9ZXJyb3I7aWYoZXJyb3Iuc3RhdHVzJiZlcnJvci5zdGF0dXM8NTAwKXRocm93IGVycm9yO2lmKGF0dGVtcHQ8Milhd2FpdCBuZXcgUHJvbWlzZShvaz0+c2V0VGltZW91dChvaywoYXR0ZW1wdCsxKSoxMDAwKSk7fQogIH0KICB0aHJvdyBFcnJvcignQ2FyZ2EgaW50ZXJydW1waWRhOiAnK2xhc3QubWVzc2FnZSsnLiBWdWVsdmUgYSBzZWxlY2Npb25hciBlbCBtaXNtbyBhcmNoaXZvIHBhcmEgcmVhbnVkYXIuJyk7CiB9CiB1cGxvYWRQcm9ncmVzc0xBKCdJbmljaWFuZG8gY2FyZ2EgcG9yIGJsb3F1ZXPigKYnKTsKIGNvbnN0IHN0YXRlPWF3YWl0IGNhbGwoJ2xhX3VwbG9hZF9iZWdpbicse3BfdXBsb2FkOnVwbG9hZElkLHBfbWV0YWRhdGE6bWV0YWRhdGEscF9tb2RlOm1vZGUscF9yZXZpc2lvbjpyZXZpc2lvbixwX3BhcnRzOnBhcnRzLHBfcm93czpyb3dzLmxlbmd0aCxwX2ZpbmdlcnByaW50OmZpbmdlcnByaW50fSk7CiBpZihzdGF0ZS5yZXN1bHQpe3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXkpfWNhdGNoKGUpe31yZXR1cm4gc3RhdGUucmVzdWx0fQogY29uc3QgcmVjZWl2ZWQ9bmV3IFNldChzdGF0ZS5yZWNlaXZlZHx8W10pOwogZm9yKGxldCBwYXJ0PTA7cGFydDxwYXJ0cztwYXJ0KyspewogIGlmKCFyZWNlaXZlZC5oYXMocGFydCkpYXdhaXQgY2FsbCgnbGFfdXBsb2FkX3BhcnQnLHtwX3VwbG9hZDp1cGxvYWRJZCxwX3BhcnQ6cGFydCxwX3Jvd3M6cm93cy5zbGljZShwYXJ0KjUwMCwocGFydCsxKSo1MDApfSk7CiAgdXBsb2FkUHJvZ3Jlc3NMQSgnQ2FyZ2FuZG8gaGlzdMOzcmljbzogYmxvcXVlICcrKHBhcnQrMSkrJyBkZSAnK3BhcnRzKycgwrcgJytNYXRoLm1pbihyb3dzLmxlbmd0aCwocGFydCsxKSo1MDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcpKycgcmVnaXN0cm9zJyk7CiB9CiB1cGxvYWRQcm9ncmVzc0xBKCdUb2RvcyBsb3MgYmxvcXVlcyByZWNpYmlkb3MuIEFjdGl2YW5kbyBoaXN0w7NyaWNv4oCmJyk7CiBjb25zdCByZXN1bHQ9YXdhaXQgY2FsbCgnbGFfdXBsb2FkX2ZpbmlzaCcse3BfdXBsb2FkOnVwbG9hZElkfSk7CiB0cnl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KX1jYXRjaChlKXt9cmV0dXJuIHJlc3VsdDsKfQoKLy8gUmVwbGFjZXMgR29vZ2xlIFJQQywga2VlcGluZyBkYXNoYm9hcmQgY2FsY3VsYXRpb25zIGFuZCByZXBvcnRzIGludGFjdC4KYXN5bmMgZnVuY3Rpb24gc3VwYWJhc2VSZXF1ZXN0TEEocGF0aCxvcHRpb25zPXt9LHRva2VuPW51bGwpewogY29uc3QgY29uZmlnPXdpbmRvdy5MQV9DT05GSUd8fHt9OwogaWYoIS9eaHR0cHM6XC9cL1thLXowLTktXStcLnN1cGFiYXNlXC5jbyQvLnRlc3QoY29uZmlnLnN1cGFiYXNlVXJsfHwnJyl8fCFjb25maWcucHVibGlzaGFibGVLZXkpdGhyb3cgRXJyb3IoJ0ZhbHRhIGNvbmZpZ3VyYXIgbGEgVVJMIHkgbGEgY2xhdmUgcMO6YmxpY2EgZGUgU3VwYWJhc2UgZW4gY29uZmlnLmpzLicpOwogaWYoL15zYl9zZWNyZXRfLy50ZXN0KGNvbmZpZy5wdWJsaXNoYWJsZUtleSkpdGhyb3cgRXJyb3IoJ0xhIGNvbmZpZ3VyYWNpw7NuIGNvbnRpZW5lIHVuYSBjbGF2ZSBzZWNyZXRhLiBSZXTDrXJhbGEgeSByw7N0YWxhIGVuIFN1cGFiYXNlLicpOwogaWYoY29uZmlnLnB1Ymxpc2hhYmxlS2V5LnN0YXJ0c1dpdGgoJ2V5SicpKXsKICBsZXQgY2xhaW1zO3RyeXtjbGFpbXM9SlNPTi5wYXJzZShhdG9iKGNvbmZpZy5wdWJsaXNoYWJsZUtleS5zcGxpdCgnLicpWzFdLnJlcGxhY2UoLy0vZywnKycpLnJlcGxhY2UoL18vZywnLycpKSl9Y2F0Y2goZSl7dGhyb3cgRXJyb3IoJ0NsYXZlIHDDumJsaWNhIGhlcmVkYWRhIG5vIHbDoWxpZGEuJyl9CiAgaWYoY2xhaW1zLnJvbGUhPT0nYW5vbicpdGhyb3cgRXJyb3IoJ1NvbG8gc2UgYWRtaXRlIGxhIGNsYXZlIHDDumJsaWNhIGFub247IG51bmNhIHNlcnZpY2Vfcm9sZS4nKTsKIH0KIGNvbnN0IGNvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcigpLHRpbWVyPXNldFRpbWVvdXQoKCk9PmNvbnRyb2xsZXIuYWJvcnQoKSw5MDAwMCk7CiB0cnl7CiAgY29uc3QgaGVhZGVycz17YXBpa2V5OmNvbmZpZy5wdWJsaXNoYWJsZUtleSwnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbicsLi4uKHRva2VuP3tBdXRob3JpemF0aW9uOidCZWFyZXIgJyt0b2tlbn06e30pLC4uLihvcHRpb25zLmhlYWRlcnN8fHt9KX07CiAgY29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goY29uZmlnLnN1cGFiYXNlVXJsK3BhdGgsey4uLm9wdGlvbnMsaGVhZGVycyxzaWduYWw6Y29udHJvbGxlci5zaWduYWx9KTsKICBjb25zdCB0ZXh0PWF3YWl0IHJlc3BvbnNlLnRleHQoKTtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9dGV4dD9KU09OLnBhcnNlKHRleHQpOm51bGx9Y2F0Y2goZSl7dGhyb3cgRXJyb3IoJ0VsIHNlcnZpZG9yIGRldm9sdmnDsyB1bmEgcmVzcHVlc3RhIG5vIHbDoWxpZGEuJyl9CiAgaWYoIXJlc3BvbnNlLm9rKXtjb25zdCBlcnJvcj1FcnJvcihyZXNwb25zZS5zdGF0dXM9PT00MDE/J0FVVEhfUkVRVUlSRUQ6IExhIHNlc2nDs24gdGVybWluw7MgbyBsYXMgY3JlZGVuY2lhbGVzIG5vIHNvbiB2w6FsaWRhcy4nOnJlc3VsdD8ubXNnfHxyZXN1bHQ/Lm1lc3NhZ2V8fHJlc3VsdD8uZXJyb3JfZGVzY3JpcHRpb258fCdFcnJvciBkZSBjb25leGnDs24gKCcrcmVzcG9uc2Uuc3RhdHVzKycpLicpO2Vycm9yLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7dGhyb3cgZXJyb3I7fQogIHJldHVybiByZXN1bHQ7CiB9Y2F0Y2goZXJyb3Ipe2lmKGVycm9yLm5hbWU9PT0nQWJvcnRFcnJvcicpdGhyb3cgRXJyb3IoJ0xhIGNvbmV4acOzbiB0YXJkw7MgZGVtYXNpYWRvLiBJbnRlbnRhIG51ZXZhbWVudGUuJyk7dGhyb3cgZXJyb3J9ZmluYWxseXtjbGVhclRpbWVvdXQodGltZXIpfQp9CmFzeW5jIGZ1bmN0aW9uIHN1cGFiYXNlUHJvZmlsZUxBKHRva2VuKXsKIGNvbnN0IGxpc3Q9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX3Byb2ZpbGVzP3NlbGVjdD11c2VyX2lkLHVzZXJuYW1lLHJvbGUnLHt9LHRva2VuKTsKIGlmKCFBcnJheS5pc0FycmF5KGxpc3QpfHxsaXN0Lmxlbmd0aCE9PTEpdGhyb3cgRXJyb3IoJ0VzdGEgY3VlbnRhIGHDum4gbm8gdGllbmUgdW4gcGVybWlzbyBhc2lnbmFkbyBlbiBlbCBkYXNoYm9hcmQuJyk7cmV0dXJuIGxpc3RbMF07Cn0KYXN5bmMgZnVuY3Rpb24gc3VwYWJhc2VScGNMQShuYW1lLC4uLmFyZ3MpewogaWYobmFtZT09PSdsb2dpbicpewogIGNvbnN0IHVzZXJuYW1lPVN0cmluZyhhcmdzWzBdfHwnJykudHJpbSgpLnRvVXBwZXJDYXNlKCksZW1haWw9d2luZG93LkxBX0NPTkZJRz8uYWNjb3VudHM/Llt1c2VybmFtZV07CiAgaWYoIWVtYWlsKXRocm93IEVycm9yKCdVc3VhcmlvIG8gY29udHJhc2XDsWEgbm8gdsOhbGlkb3MuJyk7CiAgY29uc3QgcmVzdWx0PWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvYXV0aC92MS90b2tlbj9ncmFudF90eXBlPXBhc3N3b3JkJyx7bWV0aG9kOidQT1NUJyxib2R5OkpTT04uc3RyaW5naWZ5KHtlbWFpbCxwYXNzd29yZDphcmdzWzFdfSl9KTsKICBjb25zdCBwcm9maWxlPWF3YWl0IHN1cGFiYXNlUHJvZmlsZUxBKHJlc3VsdC5hY2Nlc3NfdG9rZW4pOwogIHJldHVybiB7Li4ucHJvZmlsZSx0b2tlbjpyZXN1bHQuYWNjZXNzX3Rva2VuLGV4cGlyZXM6RGF0ZS5ub3coKStyZXN1bHQuZXhwaXJlc19pbioxMDAwfTsKIH0KIGNvbnN0IHRva2VuPWFyZ3MuYXQoLTEpOwogaWYobmFtZT09PSdzZXNzaW9uSW5mbycpcmV0dXJuIHsuLi5hd2FpdCBzdXBhYmFzZVByb2ZpbGVMQSh0b2tlbiksZXhwaXJlczpKU09OLnBhcnNlKGF0b2IodG9rZW4uc3BsaXQoJy4nKVsxXS5yZXBsYWNlKC8tL2csJysnKS5yZXBsYWNlKC9fL2csJy8nKSkpLmV4cCoxMDAwfTsKIGlmKG5hbWU9PT0nbG9nb3V0Jyl7YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9hdXRoL3YxL2xvZ291dCcse21ldGhvZDonUE9TVCd9LHRva2VuKTtyZXR1cm4gdHJ1ZX0KIGlmKG5hbWU9PT0nZ2V0TWF0cml4Jyl7CiAgY29uc3QgbGlzdD1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfbWF0cml4P2lkPWVxLjEmc2VsZWN0PXBheWxvYWQscmV2aXNpb24sdXBkYXRlZF9hdCcse30sdG9rZW4pOwogIGlmKCFsaXN0Lmxlbmd0aCl0aHJvdyBFcnJvcignQcO6biBubyBoYXkgbWF0cml6LiBBZG1pbmlzdHJhY2nDs24gZGViZSBpbXBvcnRhciBlbCBoaXN0w7NyaWNvIGluaWNpYWwgY29uIGVsIGJvdMOzbiBkZWwgaW5ncmVzby4nKTsKICByZXR1cm4gey4uLmxpc3RbMF0ucGF5bG9hZCxzdG9yYWdlUmV2aXNpb246bGlzdFswXS5yZXZpc2lvbixzdG9yYWdlVXBkYXRlZEF0Omxpc3RbMF0udXBkYXRlZF9hdH07CiB9CiBpZihuYW1lPT09J2dldFZpZXdzJyl7CiAgY29uc3QgbGlzdD1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfdmlld3M/c2VsZWN0PXBheWxvYWQnLHt9LHRva2VuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobGlzdFswXT8ucGF5bG9hZHx8W10pOwogfQogaWYobmFtZT09PSdzYXZlVmlld3MnKXsKICBjb25zdCBwYXlsb2FkPUpTT04ucGFyc2UoYXJnc1swXSk7aWYoIUFycmF5LmlzQXJyYXkocGF5bG9hZCl8fEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLmxlbmd0aD44NTAwKXRocm93IEVycm9yKCdWaXN0YXMgbm8gdsOhbGlkYXMgbyBkZW1hc2lhZG8gZ3JhbmRlcy4nKTsKICBjb25zdCBwcm9maWxlPWF3YWl0IHN1cGFiYXNlUHJvZmlsZUxBKHRva2VuKTsKICBhd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfdmlld3M/b25fY29uZmxpY3Q9dXNlcl9pZCcse21ldGhvZDonUE9TVCcsaGVhZGVyczp7UHJlZmVyOidyZXNvbHV0aW9uPW1lcmdlLWR1cGxpY2F0ZXMnfSxib2R5OkpTT04uc3RyaW5naWZ5KHt1c2VyX2lkOnByb2ZpbGUudXNlcl9pZCxwYXlsb2FkfSl9LHRva2VuKTtyZXR1cm4gdHJ1ZTsKIH0KIGlmKG5hbWU9PT0naW1wb3J0TWF0cml4Jyl7CiAgY29uc3QgaW5jb21pbmc9Y2xlYW5NYXRyaXhWNyhKU09OLnBhcnNlKGFyZ3NbMF0pKTsKICByZXR1cm4gdXBsb2FkQ2h1bmtzTEEoaW5jb21pbmcsYXJnc1sxXSxhcmdzWzJdLHRva2VuKTsKIH0KIHRocm93IEVycm9yKCdPcGVyYWNpw7NuIG5vIGRpc3BvbmlibGU6ICcrbmFtZSk7Cn0KCmNvbnN0IGRpcmVjdFJwY1YxNT1zdXBhYmFzZVJwY0xBOwpmdW5jdGlvbiBsb2dpblNjcmVlblYxNShtZXNzYWdlPScnKXsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbG9ja2VkVjE1Jyk7JCgnI2xvZ2luVjE1JykuaGlkZGVuPWZhbHNlOyQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9CmZ1bmN0aW9uIGVuZExvY2FsU2Vzc2lvblYxNShtZXNzYWdlPScnKXsKIGFwcFNlc3Npb25WMTU9bnVsbDtkYXRhPW51bGw7c2F2ZWRWaWV3cz1bXTtjaGFydFBvaW50c1Y0LmNsZWFyKCk7JCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9Jyc7dHJ5e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ0xBX0FVVEhfU0VTU0lPTicpfWNhdGNoKGUpe31sb2dpblNjcmVlblYxNShtZXNzYWdlKTsKfQpycGM9ZnVuY3Rpb24obmFtZSwuLi5hcmdzKXsKIGlmKCFhcHBTZXNzaW9uVjE1KXJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcignQVVUSF9SRVFVSVJFRDogSW5pY2lhIHNlc2nDs24uJykpOwogcmV0dXJuIG5ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCB0aW1lb3V0PXNldFRpbWVvdXQoKCk9Pm5vKEVycm9yKCdFbCBzZXJ2aWNpbyBubyByZXNwb25kacOzLiBJbnRlbnRhIG51ZXZhbWVudGUuJykpLG5hbWU9PT0naW1wb3J0TWF0cml4Jz85MDAwMDA6bmFtZT09PSdnZXRWaWV3cyc/MTUwMDA6OTAwMDApOwogZGlyZWN0UnBjVjE1KG5hbWUsLi4uYXJncyxhcHBTZXNzaW9uVjE1LnRva2VuKS50aGVuKHZhbHVlPT57Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO29rKHZhbHVlKX0sZXJyb3I9PntjbGVhclRpbWVvdXQodGltZW91dCk7aWYoU3RyaW5nKGVycm9yLm1lc3NhZ2V8fGVycm9yKS5pbmNsdWRlcygnQVVUSF9SRVFVSVJFRDonKSllbmRMb2NhbFNlc3Npb25WMTUoJ0xhIHNlc2nDs24gdGVybWluw7MuIFZ1ZWx2ZSBhIGluZ3Jlc2FyLicpO25vKGVycm9yKX0pfSk7Cn07CmZ1bmN0aW9uIHJvbGVJbnRlcmZhY2VWMTUoKXsKIGlmKCFhcHBTZXNzaW9uVjE1KXJldHVybjsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2VyVjE1JyxhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTskKCcjbG9naW5WMTUnKS5oaWRkZW49dHJ1ZTsKfQphc3luYyBmdW5jdGlvbiBvcGVuU2Vzc2lvblYxNShzZXNzaW9uKXsKIGFwcFNlc3Npb25WMTU9c2Vzc2lvbjt0cnl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnTEFfQVVUSF9TRVNTSU9OJyxKU09OLnN0cmluZ2lmeShzZXNzaW9uKSl9Y2F0Y2goZSl7fXJvbGVJbnRlcmZhY2VWMTUoKTtzdGFydGVkU2Vzc2lvblYxNT10cnVlO2F3YWl0IHN0YXJ0RGFzaGJvYXJkVjkoKTsKfQokKCcjbG9naW5Gb3JtVjE1Jykub25zdWJtaXQ9YXN5bmMgZXZlbnQ9PnsKIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JCgnI2xvZ2luQnV0dG9uVjE1JykuZGlzYWJsZWQ9dHJ1ZTskKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQ9J1ZhbGlkYW5kbyBhY2Nlc2/igKYnOwogY29uc3QgcGFzc3dvcmQ9JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU7JCgnI3Bhc3N3b3JkVjE1JykudmFsdWU9Jyc7CiB0cnl7Y29uc3Qgc2Vzc2lvbj1hd2FpdCBkaXJlY3RScGNWMTUoJ2xvZ2luJywkKCcjdXNlcm5hbWVWMTUnKS52YWx1ZSxwYXNzd29yZCk7YXdhaXQgb3BlblNlc3Npb25WMTUoc2Vzc2lvbil9Y2F0Y2goZXJyb3Ipe2xvZ2luU2NyZWVuVjE1KGVycm9yLm1lc3NhZ2V8fFN0cmluZyhlcnJvcikpfWZpbmFsbHl7JCgnI2xvZ2luQnV0dG9uVjE1JykuZGlzYWJsZWQ9ZmFsc2V9Cn07CiQoJyNsb2dvdXRWMTUnKS5vbmNsaWNrPWFzeW5jKCk9Pntjb25zdCB0b2tlbj1hcHBTZXNzaW9uVjE1Py50b2tlbjtlbmRMb2NhbFNlc3Npb25WMTUoJ1Nlc2nDs24gY2VycmFkYS4nKTtpZih0b2tlbil0cnl7YXdhaXQgZGlyZWN0UnBjVjE1KCdsb2dvdXQnLHRva2VuKX1jYXRjaChlKXt9fTsKY29uc3QgZmlsZUhhbmRsZXJCZWZvcmVWMTU9JCgnI2ZpbGUnKS5vbmNoYW5nZTsKJCgnI2ZpbGUnKS5vbmNoYW5nZT1ldmVudD0+e2lmKGFwcFNlc3Npb25WMTU/LnJvbGUhPT0nYWRtaW4nKXtldmVudC50YXJnZXQudmFsdWU9Jyc7YWxlcnQoJ1NvbG8gYWRtaW5pc3RyYWNpw7NuIHB1ZWRlIGNhcmdhciBtYXRyaWNlcy4nKTtyZXR1cm59cmV0dXJuIGZpbGVIYW5kbGVyQmVmb3JlVjE1KGV2ZW50KX07CmNvbnN0IHByZXZpZXdCZWZvcmVWMTU9c2hvd0ltcG9ydFByZXZpZXc7CnNob3dJbXBvcnRQcmV2aWV3PWZ1bmN0aW9uKGluY29taW5nKXtpZihhcHBTZXNzaW9uVjE1Py5yb2xlIT09J2FkbWluJyl0aHJvdyBFcnJvcignU29sbyBhZG1pbmlzdHJhY2nDs24gcHVlZGUgY2FyZ2FyIG1hdHJpY2VzLicpO3JldHVybiBwcmV2aWV3QmVmb3JlVjE1KGluY29taW5nKX07Ci8vIFByZXZlbnQgYXV0b21hdGljIHJlc3RhcnQgYWZ0ZXIgc2lnbi1vdXQgd2hpbGUgYW4gZWFybGllciBsb2FkIGlzIHN0aWxsIGNvbXBsZXRpbmcuCmNvbnN0IGluaXRCZWZvcmVWMTU9aW5pdDtpbml0PWZ1bmN0aW9uKCl7aWYoIWFwcFNlc3Npb25WMTUpe2RhdGE9bnVsbDtyZXR1cm59aW5pdEJlZm9yZVYxNSgpO3JvbGVJbnRlcmZhY2VWMTUoKX07Cihhc3luYygpPT57bG9naW5TY3JlZW5WMTUoKTt0cnl7Y29uc3Qgc3RvcmVkPUpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnTEFfQVVUSF9TRVNTSU9OJyl8fCdudWxsJyk7aWYoc3RvcmVkPy50b2tlbil7Y29uc3QgaW5mbz1hd2FpdCBkaXJlY3RScGNWMTUoJ3Nlc3Npb25JbmZvJyxzdG9yZWQudG9rZW4pO2lmKGluZm8uZXhwaXJlcz5EYXRlLm5vdygpKWF3YWl0IG9wZW5TZXNzaW9uVjE1KHsuLi5pbmZvLHRva2VuOnN0b3JlZC50b2tlbn0pfX1jYXRjaChlcnJvcil7ZW5kTG9jYWxTZXNzaW9uVjE1KCl9fSkoKTsKCgoKY29uc3QgRU5KT1lfTE9HT19WMTY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBeG9BQUFGR0NBWUFBQUR0aytuM0FBQUFDWEJJV1hNQUFDNGpBQUF1SXdGNHBUOTJBQUFCTm1sRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYXJZNnhTc05RRkVEUGk2TGlVQ3NFY1hCNGt5Z290dXBneHFRdFJSQ3MxU0hKMXFTaFNta1NYbDdWZm9Tald3Y1hkNy9BeVZGd1VQd0MvMEJ4NnVBUUlZT0RDSjdwM01QbGNzR28ySFduWVpSaEVHdlZianJTOVh3NSs4UU1Vd0RRQ2JQVWJyVU9BT0lranZqQjV5c0M0SG5UcmpzTi9zWjhtQ29OVElEdGJwU0ZJQ3BBLzBLbkdzUVlNSU4rcWtIY0FhWTZhZGRBUEFDbFh1NHZRQ25JL1Ewb0tkZnpRWHdBWnMvMWZERG1BRFBJZlFVd2RYU3BBV3BKT2xKbnZWTXRxNVpsU2J1YkJKRThIbVU2R21SeVB3NFRsU2FxbzZNdWtQOEh3R0srMkc0NmNxMXFXWHZyL0RPdTU4dmMzbzhRZ0ZoNkxGcEJPRlRuM3lxTW5kL240c1o0R1E1dllYcFN0TjBydU5tQWhldWlyVmFodkFYMzR5L0F4ay85NkZwUFlnQUFBQ0JqU0ZKTkFBQjZKUUFBZ0lNQUFQbi9BQUNBNkFBQVVnZ0FBUlZZQUFBNmx3QUFGMi9YV2grUUFBQlVlVWxFUVZSNDJ1emRkNWdieGYzSDhmZTVkeHNiakRETnBzZ1VZNHJwSmZST2FBbGdhaUFraUY1Q0NUV2gxd0NtQkJBdFFLZ2hkQWdkVE9qVnBvUWlpazJ4a1kwTjd0M24zeDh6OS9QNUxOMUpwOW5kMmQzUDYzbjJ3ZWlrMWU3czdHcS9PelBmQVJHSnZXSXV1MXN4bHgyc2toQVJFUkZmdEZFUmlNUSt5RmdOdUJmb3J0SVFFUkVSWDdSVEVZaDRGVFFzQVZ3Si9ET1RMN3hjd2Z0N0FJL2FJS085U2xCRVJFUjhvUllORVk5azhvVmZnTStBbDRxNTdNZkZYUGJJWWk3YnRVeVEwUWJUa2pGUUpTY2lJaUlLTkVTa0pkY0FvNEJCd0kzQUQ4VmM5dXBpTHJ0eWsvZWRCK3lxNGhJUkVSRWYxYWtJUlB4VHpHWDNCaDVxOHZJQzRHbmdPcUFiOEdDVHYrK1F5UmVlVittSmlJaUlEOVNpSWVLaFRMN3dNUEJLaVFjRHU5aGc0OEVTSCt1cWtoTVJFUkVGR2lMU2toTXhyUmdpSWlJaUNqUkV4STFNdmpBU3VFMGxJU0lpSWdvMFJNUzFzNEdwRmI2M3A0cExSRVJFRkdpSVNJc3krY0k0NEtJSzMzNXRNWmZkU0tVbUlpSWlDalJFcEJJZlZmaStIc0J6Q2paRVJFUkVnWWFJTkt1WXkyN0Q0bWx1Rld5SWlJaUk5elNQaG9qZlFjYVRRT2RXZkh3S1psNk50MVdTSWlJaW9rQkRSQnFDakcyQkoxb1paRFFPTnJiTDVBdnZxa1JGUkVRa2JPbzZKZUpma0xFN1psSyt6ald1cWdmd24ySXV1NVpLVlVSRVJNS21GZzBSLzRLTWZ3UHQ3VXZqZ1g5aTV0TjRHK2plNUNObkFHOEJHYUFmc0RTd2JKUC8xZ1BiWlBLRmoxWENJaUlpRXBaMktnSVI3NEtNTnBpeEdiY0RUMmJ5aGJuMjcvT2JmR1E0Y0ZrbVgxalF3bm83QWwxVndpSWlJaEltdFdpSStCTmtYQXpjRGR5WnlSZCtMUEdlMGNDSzluOW5BSU15K2NJb2xaNklpSWo0U0MwYUl0RUhHUjJCY2NCYUxiUk96R3YwNzdNVVpJaUlpSWdDRFJFcEs1TXZ6TWFNdjJqSk5QdmYxNEJyVlhJaUlpTGlNMldkRW9tUE9jQnM0UEJNdmxDdjRoQVJFUkVGR2lMaXdnemduRXkrVUZCUmlJaUlpQUlORVhGbE9IQ1Zpa0ZFUkVSRVJKd3A1ckx0VlFvaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaUlpSWlJaEtsWWk3YlFhVWdJaUlpRWg1bG5aSzB1TnFUZ0VjRHVrVkVSRVNCaGtnU0ZIUFpJNEVEUGRtY1M0cTU3T282S2lJaUlxSkFReVRlUWNZUVlKaEhtelFlZUt1WXkrNmdveU1pSWlJS05FVGlHV1QwQXY0RmRQUm9zOTRBZWdCUEYzUFpZM1dVUkVSRVJJR0dTTHlDakRyZ0g4QktubTNhZThCY2UrNWRWOHhsYnlqbXN1MGM3M3NuMVFBUkVSRlJvQ0VTakQ4QmUvcTJVWmw4WVJZd290RkxSMkZhTjNvNUNERGFGblBaVTRHY0RyK0lpSWdvMEpEVUt1YXlTeFJ6MmYyS3VXeG54K3ZkRkxqVTQxMS9zOG4vYjRjWnQ3RnFEZnU4S2pBY3VCeDRVYlZMUkVSRUZHaElhbVh5aFYrQW1jQ29ZaTU3ZFRHWEhlZ2d5RmdTTXk2am5jZTcva2FKMXdiYVlHT3JLdmUzcnBqTEhvTnBKZGtjK0Q2VEwzeWkyaVVpSWlJS05DVHR3Y2Jqd0JIQWNjRG54VnoyeFdJdSs1dld6RGRSekdYYkFQY0N5M3ErMjIrVWViMDM4Rnd4bC8xamhmdTdBdkE4Y0QzUTFiNzhIOVVxRVJFUlVhQWhzakRZK0IxUUQyd0QvQnY0dHBqTG5sL01aWmV2WWxWbkE5dkhZSDkvQUg0bzgrZjJ3TTNGWFBiS1lpN2J0cGtnNHpEZ0UyRGJKbjlTb0NFaUlpSmVxRk1SaUMrS3VleEJ3RCtidkZ3UFBBSGNCRHlYeVJmcXkzeDJXK0M1Wm9MbnlabDhvWmRIKy9vQXNHOExiM3NLMkQrVEwweHQ5TGtNY0N1d2E0bjN6d0Y2Wi9LRjZhcE5JaUlpRWpXMWFJZzNNdm5DM2NEUkplcm9Ic0RUd0pmRlhQWTBPdzZqOFUxN1AweVhxVGpWNXpjcmVNK3V3QnZGWExhLzNjK2h3UC9LQkJrQXd4VmtpSWlJaUMvVW9pSGVzUlBaWGRmTVcrWUFEMkphT2Q0Q1hnSzJhR0cxdnJWb2JBaThYZUhieDl2My9ycUY5NTJVeVJlR3FRYUppSWlJRDlTaUlkN0o1QXZYQTJjMDg1WU93SUhBcTVpeERsdkVjRGRIQUxNcWZHL2ZDb0lNTUYydFJFUkVSQlJvaURRVGJGd0svS1dDdHk0ZDAvMmJpNWtsM0pXdk0vbkNsNm81SWlJaW9rQkRwT1diOFF1QXl4SzhpMjg0WEpkYU0wUkVSRVNCaGtnVndjYnB3TlVPVnRXOW1NdmVYY3hsRDJvNm1EeENienBjbDlMYWlvaUlpRmMwR0Z5OFp5ZnZleE1ZNG1pVkM0QjNnV2N4MmF6ZXllUUw4eVBZcjc3QU9BZXJtb2xKYXp0THRVVkVSRVFVYUlpMGZDUGVEVGdjT0JsWVBzQ3YraGt6QjhmVHdET1pmR0Y4aVB2NEZiQnlqYXQ1SXBNdjdLNGFJeUlpSWo1cHB5SVFEd09NSllIak1YTnE5QW5oSzNzRFErMnlvSmpMamdRdXorUUw5d2U0ajIyQWc0QWVEbGIzdEdxTmlJaUlLTkFRS1gvejNSL1RlbkU0MERtaXpYZ09NeWJrdVlEMnNRNHpBZUZGd0JxT1ZxdnhHU0lpSXFKQVE2VEV6ZmRnNE0vQWZrRGJDRFpoRm5BM2NIVW1YL2cwd1AzY0JyZ1kyTWpoYW1jRGsxV0xSRVJFUklHR3lNSWI3eTJCMDRHZEl0cUVjY0QxUUQ2VEwvd1U0SDV1YUFPTWJRTllmVWZnVk9BczFTZ1JFUkh4aVFhRFMxUkJSamRnQjJEdFJrdi9rTDcrUTJBWWNHOG1YNWdUNEQ2dWdla2l0V2ZBK3pNZFdDV1RMeFJWczBSRVJFU0Joc2ppTitZOUdnVWRnKzEvMThMTmVJMEZtRW50cnM3a0N5OEZ2QjhyQXVjQkJ4UGVYRFhYWmZLRjQxV0xSRVJFUklHR1NHVTM3VzJCVlZpMDVXTUlrS2x3RlhPQVc0RnJNdmxDSWVCdHpRQm5Ba2NDN1VNdXFybkFxcGw4NFZ2VkdoRVJFVkdnSWRLNkcvcFZnQzhyZlBzMW1Yemh4SUMzcHhkbW5NUUpRTmNJaStiT1RMNXdxR3FJaUlpSUtOQVFhZjNOL2NmQW9BcmV1a1ltWC9nc29HM29iSU9MUHdPOVduajdaR0FpWm5MQWhtVTVZSE9IbTFRUHJCVms1aXdSRVJHUlNpbnJsTVRWb3hVRUdxOEVHR1FNQVk3RlpIMjZ4d1lPRSt4L2Yya1NVUHljeVJmbWwxakhMWTREalRiQWhjRGVxaDRpSWlJU05iVm9TQ3paRy8zM1duamJmcGw4NFY4ZTc4TW9nc20wdFVFbVgzaFB0VVJFUkVTaTFFWkZJREgxQWZCOU0zOGZoMm4xOERYSVdLWENJR011WmtCN05TNVc5UkFSRVJFRkdpS3RrTWtYRnJRUVNOeFc2UndaeFZ4MjZRaDJZZnNLM2pNQjJBNHpsdU1Nb05LTVV0c1hjOW10VkV0RVJFUkVnWVpJNjVRTE5CWUFOMWV4bnYyTHVleStuZ1VhbjJDNlFQMDNreS84bE1rWExnVldBdllBbnJINzJKeExWVDFFUkVSRWdZWkk2N3lDR1hqZDFGTlZ6aWZSRWJpcG1Nc3VHOFpHMjdsQnRtN21MVThBbTJieWhkR05YOHprQy9XWmZPSHhUTDZ3TTdBcWNHV1ovUWZZcUpqTDdxRXFJaUlpSWdvMFJLcGtNems5VWVKUE4xVzVxczdBRXNDZHhWdzJqQVFKNjFNK0hlNWx3SjZaZkdGcUMvditkU1pmT0FWWUZqaU0wZ1BqTHl6bXNqckhSVVJFUklHR1NDczgwdVQvdndXZXJuSWRQZXgvdDhYTWl4RzBVdDJtWmdNSFovS0YwelA1UW4wVndkYk1UTDV3UnlaZjJBRFlFTGpUcmd0TSt0OERWRVZFUkVSRWdZWkk5WjRGWmpYNi81dXJ1VkczT2piNjk2WEZYSGJOa0FPTmNjQldtWHpoN2xwV21za1gzclV6Zy9mRHpGVCtEWEJ1TVpmdG9Hb2lJaUlpQ2pSRXFydTVubW1ERFRDcFlHOXR4V3E2TmdrNjdpM21zaDJEMk41aUx0c1YyS1RSU3lNd2c3N2ZjbGdtUDJmeWhiOWh4bkVjQjZ5bW1pSWlJaUpoMDh6Z2tnU1BZTEl4UFp6SkY4YTM0dlBkbXZ6L1lNd00yNmNHc0sxYkFlM3R2eDhDRHNua0N6TUNDc0xxcWI0Ym1ZaUlpSWdUYXRHUUpIZ0NxS2Y2UWVBTlNyVmVuQnpRWEJUYjJmK2VCK3dUVkpBaElpSWlva0JEcEVhWmZPRm40TVpNdmpDOGxhdm9YdUsxT3VDdVlpN2J5L0htYmdvTXplUUw1OXBKQjBWRVJFUVVhSWg0ckpadVRsM0t2TDQ4OEhkWEcxak1aVHNCUjJYeWhRZDB1RVJFUkNUcDZsUUVrbmJGWEhZa3NIWXpiOWsva3kvY3I1SVNFUkVScVp4YU5FVEtUNTdYNEtaaUxydThpa2xFUkVSRWdZWklOVnBLWmRzVE0ydTR6aGNSRVJFUkJSb2lGZXRjd1h1MkJrNVNVWW1JaUlnbzBCQ3BWSThLMzNkeE1aY2RyT0lTRVJFUlVhQWgwcXhpTHR1ZXlwTWlkQUR1dHRtalJFUkVSRVNCaGtoWlhhdDgvMXJBeFFFSFAyc1VjOW56aXJsc1JvZEhSRVJFRkdpSXhGTzNWbnptcEdJdXU2M2o0R0tsWWk1N2VqR1gvUmo0SDdCMEpsOG82dkNJaUloSVhMVlRFVWpLZFd6bDUrNHM1ckpyWmZLRlgyb0lMdm9CdndVT0FEWnE5S2VmZ0ROMGFFUkVSRVNCaGtoOGRXL2w1NVlGYmdTR1ZobGM5QWIyQnZZSHRxSjBxK0xwdFFRd1ZXekxKc0F2bVh6aGMxVURFUkVSVWFBaDRsYVhHajY3WHpHWGZTS1RMOXpUd2cxOU4rRFhtSmFMSFlIMnpiejlMZUFmSVFRWnZZQjdnYjFVQlVSRVJFU0Job2g3SFdyOC9BM0ZYUGExVEw3d2JaTWIrWTdBenBnV2o5MnBiSzZPK2NDUm1YeGhRUWo3ZlN2UVg0ZGZSRVJFRkdpSUJLTlhqWi92QWR4VnpHVzN4cVRKM1JiWUR6UDJva2VWNjdvaGt5OThHUFFPRjNQWkk0SGYyUC90cUNvZ0lpSWlDalJFM0hOeG8vMHI0QmxnSFdDcFZxNWpQSEJPQ0VIR1dzRFZqVjdxckNvZ0lpSWlDalJFM0hOMW83MTlqWi8vVXlaZm1GeEJvTEF1c0M3d1lDWmZtRnBsa05FVnVCL1FoSU1pSWlJU09NMmpJV25YdzROdCtDOW1ZSGFMTXZuQ0NFd3J6SmhpTG51YnpSeFZxV3VBTlpxOFZxY3FJQ0lpSWdvMFJOeUxlb3pDZk9DWWFnYUFaL0tGRzRFL0E3OEgzaWptc3Y4cjVySi9LdWF5UzViN1RER1hIUW9jWHVKUFBWVUZSRVJFUklHR2lIdGRJLzcrcXpQNXdpZlZmc2dHRzBmYi8xMER1QklZVzh4bEh5em1zanNXYzlrMmpZS01sWUc4RHJXSWlJZ28wQkFKVDdjSXYzc3NjSDVyUDl3azJBQXpQOGR2TVFQVFJ4VnoyWE9MdWV5cW1IRVpQWFNvUlVSRVJJR0dTQWpzay81Vkk5eUVrNnNkMEYxQnNORmdCZUN2UUFGWXY1bFZkRlZORUJFUmtTQW82NVNrSmFqb0JLd0hiQTVzQW13SzlJMXdrMTdJNUF2M3UxaFJKbCs0c1pqTEF0elFpbyszViswUUVSR1JJQ2pqakNRMXNPaG5nNGxOYldBeHhLT2I2cm5BNEV5KzhMbmpmVDZxRmNIR1JPQjU0QVViL0h5cjJpTWlJaUl1cUVWRGtoQlV0QU1HTndvc05nVlc5SGlUcjNJZFpGaWpnQitBNWFyNFRCOWdxRjBvNXJKZk53bzhYczdrQ3orcmhvbUlpRWhycUVWRDRoaFk5QVkyeG5TRDJoallDT2dTazgzL0RsZzlreS9NY0ZRV2RjQnV3Rm0ySEZ5YUQxd01uSnZKRitwVjgwUkVSS1FhYXRFUTM0T0tPbUExWURNV2pxMVlMY2E3ZEpLTElNT21yOTBMT0J0WUo0QUE0MzdnOGt5KzhKRnFvWWlJaUxTR1dqVEV0OENpRzdDaERTb2Fnb3RlQ2RtOVp6UDV3azQxbGs4N1lCL2dIR0IxeDlzM0hiZ051REtUTDN5bjJpZ2lJaUsxVUl1R1JCMVlaSUJ0R2dVVmc0RzJDZHpWMmNBeE5aWlZXK0EwWUhlZ244TnRtd2hjQTl5UXlSY21xbGFLaUlpSUMyclJpTmV4Nm9PWllLNmJEUkxicy9nOENQWEFGUHZ2V2NBdndNK1lURWMrQmhwdE1ITlpySXRKUDl2dzM5NEpPMzRYWlBLRnZ6Z3V1MlV4czRLdmFaZUdmL2VzY0JXak1ET0szNTdKRjJicUZCTVJFUkVGR3NuVEMrZ1BETEJMZjh5RWEzMXRjTkhIM25qWGNyeW0yNkJqQW1aRzZ1L3Q4Z05tZ0hJQkdPTlJBTEtDRFRnYUJ4LzlZbnA4UndGcmhuVXozeWkxNzRQTnZPMTlZT05NdmpCUHA1K0lpSWdvMElpL0xzQWdZQzFNRjZHR3haZW45MU9CejRIUDdQSytYYnhJY1ZyTVpmczJDVHpXQlZhT3dYSC9iU1pmZUNpQzhucmZsbE1wUjJieWhieE9TUkVSRVFtS3htZ0Vhd0RteWZMbW1ERUlnendQN3JvREc5aWxzVkhBdThBN3dDdkFDRXhtb2xCbDhvWHh3RE4yYWJpWjdvbkp1alNrMFg4SDR0YzRqd1VSZmUrRFpRS05HY0I5T2oxRlJFUWtTR3JSY0h3dkRPd0U3QWhzQ1N5VDBQMmNBcndLREFkZXNvSEhBbDgycnBqTGRnYldiaEtBREFZNlJMUkpWMmJ5aFZNaUtJZVZnYTlLL09uT1RMNXdxRTVYRVJFUlVhRGhyN2FZbG9xZDdiSjJTc3ZoUitBcDRFbk1qTkxUZmR2QVlpN2JIamdBdUNPQ3IzOHpreTlzR3RGK2wrbys5YXRNdnZDcVRsOFJFUkZSb09HWE5qYTQyQS9ZRjFoS1JiS0kyY0R6d0QwMjhKam1VYkR4SWlhVmJ0am1BRDB5K2NMc0NQYjVkT0NTUmk4Vk12bkNRRlZURVJFUkNlT21XU3F6QVhBZEprdlRmekZ6SWlqSVdGeEhZRGZNR0lCeG1CbW1kL0FneU5ndG9pQURUSmV0OVNMNjdxYVpwMjVWRlJVUkVSRUZHdEhyWlFPS2taaUIwTWVTM0hFWFFlaUNhZm41UThSQlJqdmcwb2pMWXJNb3ZqU1RMM3dOZkdEL2R4NXdsNnFsaUlpSWhFRlpwMHJiQkRnUzJBZm9yT0tvMmJzUmYvL3ZNUlBaUlYybm90S1FmZXFKVEw0d1R0VlJSRVJFd3FBV2pVWEw0amZBNjhBYndDRUtNcHg1UDZvdkx1YXkzWUR6UENpRFRTUDg3b2J1VTdlcEtvcUlpSWdDamZCMHdYU1ArZ0w0ZDhRM2hFbTBBSGd2d3U4L0ZaTjJPR3FaWWk2N1VpUmZiTHBQUFU2aitVZEVSRVJFZ3BibXJsT2RnUnh3QnRCWFZTRXdCY3k4RzZFcjVyTDlnRk04S291TmdXOGkrdTdETS9uQ2ZGVkhFUkVSQ1VzYVd6UTZBRWZiRzc2ckZXUUU3djBJdi90OFRJdVZMemFQNm9zeitjSUVWVVVSRVJGUm9CSGN2aDZHbVNuNTcvalJuU1lOSWhrSVhzeGwxN0xIdXhiZkEwY0IxenZhckkxVkhVUkVSRVNCUnJKc2prbFBlenV3dkE1NzhnTU40UElhNm5jUk9BbkladktGbXpMNXduR1lXY1ZybmZGOGJUczRYVVJFUkNUeGtqNHorQXJBWmNCUUhlcEkxQU05SE55Z1Z4Y2w1TExiWVdZbnI5WkU0Ry9BZFpsOFlYcUo5YTZPU1Jpd1JnMmJ0MjBtWDNoSlZVTkVSRVNTTHFrdEd1MkJNekdacEJSa1JPZlRDSUtNTnNDVlZYNXNNaVlGN3NxWmZPSFNVa0VHUUNaZitBellDRFByZVdzcHE1bUlpSWlrUWhLelRxMlBtUzlnc0E1djVLTG9OblZJRmNkK09tYjh4UldaZkdGaUpSL0k1QXZUZ0FPS3VlenJtR1FDN1JWb2lJaUlpQ3d1U1YybnVnQVhBaWVnK1VGOGNTeG00SDBvaXJsc1orQkxZTmtXM2pvTHlBT1haZktGSDJ2NHZnMHhYYW1xR2ZjekNlaWR5UmNXcUhxSWlJaElraVhsaG54VDRCUE1BRjRGR2Y0SXUwWGo1QmFDakxrMndCaVl5UmRPckNYSUFNamtDKzhBNndMUFZ2R3hYc0JxcWhvaUlpS2lRTU52N1RCOTYxOEZCdWh3ZW1VZThHRllYMWJNWmZzQ3A1WDU4M3pnVG1DTlRMNXdaQ1pmK003Vjk5b3VWN3NBNTJJR3YxZGlNMVVQRVJFUlNibzRqOUZZQ2JnYjJFU0gwVXNmQTdORC9MNXpnZTVOWGxzQS9BczRQNU12ZkJyVUYyZnloWHJndkdJdSt5WndMOUNuaFk5c0F0eXFLaUlpSWlKSkZ0Y1dqYUhBU0FVWlhuc25yQzhxNXJJRGdTT2F2UHdZTUNTVEx3d05Nc2hvRW5BOGgrbEs5WFlMYjlXQWNCRVJFVkdnNFpsMm1Fdy85N0g0MDJ2eHkvc2hmdGZsUUZ2NzcyZUJUVEw1d3A2WmZHRkUyRHVkeVJlK0IzNEZYTmZNMjFZcjVySzlWVVZFUkVRa3llS1VkU29EUEdCdjR0THVLeHRzTlIwVE1CdVk2Y0gyelFNZUFuNE0rb3VLdWV5V3dIRGdGZURjVEw0dzNKZURWTXhsOThPa1d1NWE0cys3WnZLRi82Z3FpNGlJaUFLTmFHMkNTU1BhVDRmcy83MExIQSs4bGRZQ0tPYXlkWmlXZ3ljeitjSXpubTVqdWRuRUw4N2tDMmVwR291SWlFaFN4YUhyMUw3QXl3b3lGck1COENZbW05SXlLUzZINDN3Tk1xRFoyY1ExdmtoRVJFUVN6ZmNXalQ4RGwrb3d0V2dxWnJMQ1ljQWNGWWVmaXJuc01TeWNUWHc2MEN1VEw4eFR5WWlJaUVnUytkcWkwUll6c1pxQ2pNcDBCeTdEVEZxNGk0ckRUNWw4NGUvQTVzRDNtSEViZzFVcUlpSWlva0FqUEYyQXAxZzhYYW0wYkZWYmR2K3gveGIvZ28zR3M0bXIrNVNJaUlna2xtOWRwM29DandCYjY5RFViQzZtbTg2Rm1LNVY0cEZpTHRzR1dDK1RMN3luMHFoWkIyQTFZQUN3QXJBYzBCdFl3bDVUMmpkNS96eGdNakFKK0JtVEhXME04QTFRc0g4VFA2MWdqL05LOWpqM3hVeVEyY1VlNjdvbXgza1M4QXN3SHRPU09BcjREUGhPUlNrT0xZVkorREd3VWQzc0J5d0o5QUo2QUIyQlRvMCtNOFArVGpmVTBaL3NkZWdINEd2Z1UrQnpZSXFLVnhSb3VORUw4NVIzUXgwV3QvZTB3T25BWFppWnNrWGlmczFhRzlNRmJWTmdmV0JsM0xiTy9naU13R1IyZXcxNHc5NFVTTGk2MmVPOGpUM082OWpnMFlYSm1FbEYzd0NleDB5eXFmRlNpeHRrYjVacjlSNHdMU0ZsMGhaWUQ5Z1drK2hqUTRKTlZsTm9kQzE2QVpQZTNrZURNUTk0WFByYzNzTWtXUWJ6b015MWp6QVAwbHhwWjYvSmM2cjlQZlFsMEZnS2VNbGUxQ1FZYndQSDJRdVdTSngwQkhZQWZndnNoSG1LSGFiWjlrZitVVXlMNjVnRWxlM1dtSmFBV3IwR1RIQ3ducjdBM3NBK21EbVQyb1ZVRHIvWVkzdXYvUzNTUXhualVXQVBCK3RaRnhnWjg2QjNGMXMzZDNKMHpyVFd0OERqd0lQQTZ5dytuMVpVOXJUbmtFdHZBRnQ0dEkrdXRiSFhUdGZkcUwvQVBKaVpWY002ZW1PeXZ1NEVETUcwMGpXWWhtbHgreTltempUdnAxbFlDdmpZWHRpMUJMdlVZeWFRVzFxL254SURRNENiTVUrZmZUcUhuZ09HWXJwc3hkMUlSK1d5VlkzYnNSVm1RdFk1SGh6akwrMURtYzQ2QlhuVVVabXVFOVA5M3hLVFFuNjZwNy9wM3dNWFlMb1QrdUNlQVBieHVBU2ZYMGNGVUY3emdZMXIyS1lsTUJsTVoxYnhuZS9iZ01STFBURmRGQlFFaEx0TUJrNW04YjdySWxHcnd6eEJmVE1HNTlFUHdHbjJhYWNDamRiWnlUNE44L0g0amdPT0pieFdGUVVhZnVnQUhJcnBlaEtuaDRnUFlicVRScWtQcHF1VHkzMmJCcXlZd0hPclgwQVAwYTZvWVp0MnhveG5hN3JPZWZZQnpQdVk3S2JUeW56M2ZaZ3NxTjdvaXVuT294di82SmJQZ1IxMWJ5dWUySlY0dG03K0JKd1EwOEE5cWtCakRSWjJVZko5K1F3elZrU0JScklEalhZMndCZ1Y4OS8xWnpFVCtrWjVIUTlpbjVMbW9ZRHU2VHExY251T3diU0dORjdmNDhCdW1HUWJqYld4ZFd4WWlhRGpRMHhQcGNoMWlkR1BUQnFXeHpBRGFrV2lNQkF6eURIdTU5R25tSzRXQ2pUS2F3OWNoTW0yRTdkdXAxZVJqTzV5Q2pRV3Q3VjlVcHVrMy9WN2dHVWlLczg3QXRpZjN5WG92Tm9kdjdwTUhWYml0MnlqQ2orYktYR2QrSkNJV3piYVlnWU02UWJmcjJVMmNBbng3Z1lpOGRJTytJdXRlMGs2bDY2dDRhbFNrZ09OVlRIWmgrSjhiTjhsMkF4RENqVEMxUWU0TzhHLzYxTXgzZi9DVHZ6VEM1TTB3K1crVENRWjQwdTdZOUpyKzlKbGFyMG12OEhQTkxvUEhHRFAzY2JMUUV5UHBNYnFNRk1wTk42ZXU2TXM1R3QwVSsvMU1nWTRBUC9tV0pGa1dSbC8rK2E3V0Q0QlZsR2c4ZisyeFdSMlNzS3hIWXRKNWFsQUk5NkJ4dTY0SDAvZzYvSXlaZzZhTUFYUmhlcGZDVGluZ3JnSGJtMlhxVGJBQjQzVzh4YUxkcE1xZC83UHgyU2NhdHJxY1YyVDkwVXlRUHc0M2NqSFpubmRScm9pcnUyR21hUXE2ZWZRTDhEMkNqUTRrUGgxbGFva29jWkdLVGhYa3hob3RBZitsc0xmOUo4eGczM0RkR3NBKzdGbmpNK25EVmg4SEVTVVhhYUdObHJQZEJZZmROOXcvdGNEbysxRGxubU5Qak1EV0xQSnVkWDROK1h0S0o0ZXpFYzM4SEhybDN3ejRjOWJJTWwxaHExWGFUbUg1Z0Q3cHpqUU9DckIxLzNKbU1rakZXakVKOURvWTUvRXB2bDMvV3pDNjdIUUEvZmRoTVppdW1iRlRUdUgxMXRYV2FiZWFMU2VjNXM1L3ljMUNTWWFkNU82dXNsbnRtcXlmYUU5c0I1c0l4L2R2TWYzeWV3SnBEdk5vOVNtTFhCOVNzK2YrZmFwZnRvQ2pmMVRjR3pIa2N6VW0wa01OTEtZV2JYMW13NTNFVjVpZ3gwQzJQNWJZM2d1blJaQU9kU1NaV3E1UnV1WlMrbE1VYVVDRFRCalpSbysrM0NKenpXZXR1TENNQXAzQ2VCcm5kaUpXUDRIYkpmQ20rVHRnYWVwZlZLeU5BY1o5NlQ4M0prUDdKZWlRT05YK0RINVhoakxDQlpQLzZoQXc2OUFZeTFNR21yOWppOWNuZ2l4M3Q0U3dQWnZFNlB6YUtVQUhyYlhPakhmZ1N3NmhvY3FBbzFCalQ1N2ZZblBuZEhvNzY4RVhiaHRnS2QwUWlkdWVRUi9aaUlOU252Z0lFeWF0b2I5TGhKZHVzQzRhcU1nWTVITWJyN054eEJFb0xFY01DRmx4L1ptQlJyZUJocnJrNXhFQks2WGwwSUtObnBnK3ZpNzNQYXZZeFRnUHh2QXNidWl4bTI2cU5HNkxxc2kwT2h1SDd3MmZIYUhFcC9ic3RIZnh3ZGR1T2ZxUkU3c01oTzRJSUZQOHJwalprMHYxNi8wVlRTamVqV0c2VnhaWkpsQStObGZ3Z3cwMmdHdnBmVFk3cWxBdzd0QVl3MjFaTFM0L0lkd3VsRnRIY0MyWHhtRGMrakFBUGE3bGk1VERXNXZ0TDdqV2pqLzU5cC9QOGVpaVZ5dUwvTzVGUnR2YjVCOTduZkc1TWlYWk9xRUdWUjJLSEFxOElDdFZIRzFMR1ljeWhGQXoyYmV0emx3T1hDU3FrQ0xUclpsR29XeFFNRmVGQ2RqWmk4Rmt4KzhHMll1aEFHWXlZYkMxQWQ0RU5nQzA3VW9hVTRGTmd0bzNRdUE3ekV6TjQvSHpCRXdGVE93dGFkOTZMRXNKcTF3RkFrc2JnU0dzM2czQTRuR2N2YkdhTWtJdm5zeXBqWDhTK0JiRyt6ODNPU2M3d2oweHZSMzcyL3I3V0RDbitoc1orQk9URnI3SUgvRFh3WnVBSTUydU00VGdmc3g4OXY0cURlTEQ1YXVWYjI5NzVwVjQzcmFOUHIzdkJiZTJ3N1l3LzU3UG5BZmNDL3daSm4zVHcyamNKZTJQd1I2V3BDZTViL0VNd1BMV3ZZaVcyMS84bDMxTzk3aWoxZFkyWVptQXk4Q1oyTDZyRmJ6UTkwTk13Ym5yNFE3cjhjbG5oeW5rYmhyMGNqYUh6OVhaVFFMMCtYZ0pHQVRvSE9WUC9CN1lwNTQvaERpY2IwMlllZnhvOFN6UmFNTGk4NFBFTWJFZVA4Ry9vQ1ptTEsxNm9EVk1ObmFIc1AwSEFockh5NEs0Ymgwc3c4S1hNOVo1R3N2Zzl2eHI4dFVneHNhcmZPdkxaei9rMW40TUhtQkRYU2FrMlhSRkxqTzFhRnhHV2tlOEJxWDNQTGJZV2JBYk8yK2ppY1pzNVFHWVNYQzZSUDlJYWJKZHduSDIzNU9DQTlLYWgzSTUyT2c4WnlqZGIwREhJYnAxKzFDRzh5RWdjK0VVQ2ZuQWFzcjBJZzgwTGcvcE4rODRaanNhcDBEMm85dTlxYnV6WkQyNTRBUWpzM1d1RTl4L2xjUHo1MnQ4TFBMVklOVFdYVGNiWFBuL3lSTTYvOGsrLzlUYUg2Yzd1Nk4xdjFSRUlWN3JHNjRVN3U4aXQ4emlyZkQ5SmNjNFdoL24wSXpxRGZWUG9TV2dUY0lQZ05ZWitCNFRIZUhJR2NQanpwbHRLdEE0eElINjNnTms2MHFTQnNEN3dWY1ArOVhvQkZwb0JIR1BjaGpoRCtoN2FiQTh3SHYxelFXbllBdEtNTnczNnE5cGtmblRTZmdDODhmVG0zSG9uTUNkV3doMEFBNGtrVXpWWlc3LzJrOCs3bnpSQmxyNHJicFhFdDhscm1ZbEdjKzZrYnpBN3hyV1k1VmJMR0lDd09zWXovWkoyNWhCbmQ5TVRubmc5cW5QeVVrMEtpbGkwZVJjRlAvdGdQT0lyaXVmZldZN2k4S05NSVBOQWJabTg0Z0h3NXNHZkV4MlFrejlpUElOUGFkQXQ2SExnSHN3MXNzT3U0Z1N1Y0hjRnl1Y0x5Tm5URmQvaHJXZjBnRmdVWWJGcDNrNzRneVFkWTRBdXBtM2c1NFh6ZmNxVjJ1d0QvOWdFdFpORXVDNjJVNnlVLzFXNmwxTVYxSGdpam5weWs5b1ZCWURpV1kvdEtUY052MUs2cEFvNVpjL24waTJ2ZmQ3QlBjSVBicjFvU2MwM0VLTk5vSFdKL25ZOFl3K0RJV29IT1RwOGF1bDZ0RDJJY3RjTitGNmtRUGpzMGF1SjlEeUdXWHFjWWFqeUg1c2tTclJ0TkFveUdZbjh2Q0xsUk5zeWllMEdpZDMrRzQxZjRVM1d5bmR2a2U2T3JaRDJRbndwc3c3QVhVaGFvdHdRMit2TmlUOGgxQ01La3lMMDlwb0hHaEI4ZDFJL3V3d1BXK3pRQjZLZEFJTmRBNG0rQmFVbjJkcUhZUFRMZVhJRnJsdGdoaCs0YzUzdTVwRVQvNHF3TmVEeURJRFdvODN4b3Mycko3WlFXQkJ2WTN1ZkZEd0FZck4ya2xPY0xseHE2TSsxa1B0Y1JuMmR2VGkzQ1laWEI0eWdPTkl3TjZpbmlrWi9zNU1JQmdZenJScE9DTU10QTR5cU5qdW1OQUR5V09VYUFSV3FBeGdHQmFITCswOXpjK1c5TSs3QXVpQzFYUUxUaWQ3Tk42bDl2OVhJUVBNSUw0SFF5NnQ4ajFUYjZ2OFcvdVVNeDhlS2MzK1V4bnpQUVY1OXFsSDZiSHdXZU4xdk0yRHJ1eTFka251cnJoVHVmeWxNY1g0TWtobHNNazBqdHJlQytDbVFuYTErQnRTQUEzTmVlbEtOQTQyc05qZW1vQSsvbXFBbzNRQW8xSEFqaCtIeE50ZDgxcUxBZDhGVUFabkJyQ3RtK00rL0ZTaDBWd0RKYkJmVGZ0b0xwTU5kWVYrTFRKOTU1VFpaQ3dKbWJlcW9iUFQ4Unh5OUtodXRsTzllemdLM2w4OFIwYmNubmNrOUpBNDd3QXl2TFBudS96QVk3M2R3S2xzMzRrTGRDNHhOUGpXWWU3OUx5TnU1L0UvZUZESEFLTnpRS29wNFVZQlJtTmd3M1hMUnVUQ0djTTFSV090L3NYd3ArTTlWL0VwOHRVVS8xWmZMNmh0ekNwaUp1ekZHYnNVdU1rVUpOeFBNMUJEeFlkWGE0bFhjdlpubDk0djRxZ1RMWWdYWmJFL1lEYU8yT3k3N2M1M3UrREV4NW9QSTNmWTVsV3duM0dvaU5qZm43SElkQjR4ZkV4RytmNUE3U1duaXk3ZnFwK1ZRamJIVVFYcW9kQ0xQZmRpRitYcWFaV3hMVGlOZDJPVHpGak53N0JUSUs2RDZZcjFWTWxycGZmWXBMQ09IVzViclpUdTN3UjBSTlluNS9XTmt3aTE0NzArQXZ1bTRxN3hXVGZlMkZTczhhNXEwMVk1OGdZb3NzdVZZM0xBZ2l1RkdnRUYyaHM2Zmg0elNYNjlMVXVibnBkWm5PYWlVbnpIYlFOY1orMU1JenhvOTF3bnpvL2pDNVRwWFMyZ1dWcmpzTnRCSkJCY1JYQ3krcWp4YjlsdXhoY2NGK0pxR3lTTUFpMDBvdVN5NEhSOHpIakgrTGtFTWQxcDM5Q0E0MWRZM0k4ZStNMkM5VlVURVkyQlJyQmVOcHhQVDBySWRkbTExMlJMZzFwdXk5eXZOMUZncy8rZGpYeDdUSlZ6a3JBdFJYOHZrL0ZwTWhkdy9jTGtKYjRMZmZGNUdMN2RFVGxNd0hUclREcERuVmNic05pV0FadFdId2dYUzNMbVFrTU5QNGRzMk42bytQOVh5L0c1N2pQZ2NacWpvL1QyeVNuTmJvVEptdVV5ekVQWWFTdzc0aVpGTkhsY2IwOXdPMWRIL2NEMlgyYWs2eXQzY2ZEZ2IvYTMraUxNQk1WYndGMENQTEx0OWJOZG1xWEtjUm5nT08vSXl5bkMxSVFhTHpoT0Rqckh0TnlPTWhoT2J5ZnNFQmpKdUczMHRScXNPTXlPRUdCUmlDQnhyVU9qOUVza2pPYmUrT2JZSmRka1k2TTZYWXZBTFlQWUR2YjRYN3VxS2k2VEhucExkMXdwM1k1UGtiMTlJNEl5MmtheVU1MzYvcHA0cWt4TG91TzlvbWZxN0pZTGtHQnhyQ1lIdFBQU0Y4TGNKd0NqWTY0SGZSOGNVS3YwemM0TEtNUklXNzNCWTZ2UTZOdzN5TGplcEpxSDdwTWVXTW4zV3luZGhsQnZQb2JYeHR4ZWQyUTRPdkErUTdMYVNKbXZFZWNYZSt3UEk0SWNidURERFRtQU12SDlIaTZUSEl3VW9HRzgwQmpINGZINXllUzI5VjFhUmFkcWJuV1pYQkkyOTArZ0d1VHk0Y2UvWEUvU2ZVVkNHQlNFNzZ2Rys1VUx2VTR6bzNjNk1uVVJiU2NyN2sxTG9tNHpPWUFLeVQwV3ZDRnczSzZKQUhsOFN1SDVmRkFRZ0tOZkl5UHA4dTVHV2JoY0laY0JSb0FQT3p3K0J5YjhQdTJzMk42TTd3T0pndVlqeTBHejZBdVU0SFpVemZjcVYyQ3VHbFluNFVEdjhZQnl6cGUvemtlbE50TkNid09aQjBIc01zbm9FemFZY1l2dVhyQ0d0WjhFMEVHR212RitIaDJjUHpFTXE3ek12Z1lhSFRHalAxeHNWM2pVM0NEMXhOM3JScGZoN3p0NXpxK0puMUM3V241OTBkZHBnSTFRamZjcVZ6R1k5SSt1dExRaXRGMHdOY2J1TTFpY0tJSFpUZVQ1STNWY05rMzlhVUVsY3NqRHN0bFlNd0RqYmNUY0R4ZmRWZ2VPeXZRY0dZUGg4ZmwzSlRjdTduc1JqdzR4TzF1SDhCOVp5M0hmQW5jVDFLZCtDNVQxVFRuYmsrd3MzdUt2MDREZm5hMHJvMHhtUnJPWlBIeEhwc0FmM080M1ZNOEtMdE93SjhUVmg5Y3pxRnlYNExLNVIySDY5b281bVZ4Y3dLTzUwY08xN1VjNHNwT2p0WXpCNVBLT0EydXNUZTFMb1E1Sjg1YzRHQjdyRnc1Q3hqVXlzOWVnZHZKQzcvQTlMd1E2MW4wWkQrTnk2dTQ2Y2JSeVo2a2xlU2NQc0JSblIzcVNSbE93MjJMVUpUYTJmMXgxVzJxYjRLdWtUczdyRE4vRDJtYlJ3WlEzK2NTL0NSWllUamVZWm1jR2RNeWVCVC9XalMrZExSTkQ2WHNIdTVGUitYMllnVGJmcGJqYTlRN1ZKL1l4dlVzOU9veTFjUmF1dUZPNVRLM2hzaS9zWTB4ZzUwcS9kN3BqcjczMXg2VjVXa0p1UlpzNkxCTVBrallkWEpaeHdGK1hBT05GeEp5UEhkd1dDYlhLZER3N2h6YkwyWDNjVWM2S3JkWmhEK3VwUjN3bnVQcjFKK3ErUDZPVmQ3RHFNdFVJNVYyblRwWnNWWXFEY01Nbm1xdHp2WmtlcDNxK3B4M3dXUVZxVFhsNEZTUHl2SllrakhyN0FZTzEvVnN3czZYTVRZNGQvVndKNjRlVGNqeC9OSGh1dm9pTG16aWFEM1RnY2RUVm5ZUFlzWkYxcW9qc0c3STJ6NFBPQlMzWGFndXBQSWtEV2ZpZHR4Y3FycE1WUkpvWkhEWGxVWGk0d2RxR3pTMUJhYVA4eW0wTHJYanFwZ0o5MnJwdHVWVG9MRThzSmNDalVXOG1jRHpacXlqOWZRa3Z0bTRua3pJc1J6dmNGMTk5SlBpeElhTzF2TXNKbEZIbWt6RVhVdnBKaEZzL3llWVZMMnVkQVp1cWVBZVkzWGdkSWZmVzIrRHBsa0tOQlk2RkRQeVg5TGxCTXhUbjJwMXdiU0V2QUtzVXVNMjdFVnRNMFpQOTZ4TWowOUF2WENaY2VUdEJKNDNZeDJ1YStVWTd2OFlZSFJDanVWUER0ZlZEbkZoaUtQMXZKelM4bnZKcytOUXJhc2MvMjVzQS95K21iL1hZUkpiZEhDOEQyL3BWRjYwa0w5Q1l4WFN0anpWeXZxeUJlNEc2alVlTU5YYXlmeFc4TEJzVjQvNWd3bFhjd3Y4a05CcjVuTU82OHJoSVd6dlNNZjErNzZFSGM4NXBEdmQ3NlA0TlVhajZHaDdCcEZPbXpzcXY0OGkzSWZWTUswQnJxNVprNEIrWmI3ckNNZlh4MVJPek5kU2k4YldNWDJxSnEwM0N6aXV5czkwdzZUUGM5R0tVYXFPM2svckp2T2I0bUg1SGg3anVyRUNwcm5aaGM4U2V2N01jTGl1T0U3eTlvcU9aMGtka1ZyMUFaWjJzSjZKd1A5U1dvYnY0S2JMem1wRTE5UGxjOXlPYitnSjNGRGk5UXh3dWNQdlNWMlhxUVl0TmVmK1FkZTIxTGtJK0thSzkyOE4zQTcwRDNDYittSUdzbTFGZFlQQnBucFl2Z2NEWitCdTBIQ1lYQjdqc1FIWEdWK3ZxZFZZTm9iN1AwS1gwSkk2cUFocXRvckRPcm9ncFdVNEIvZ1VXSy9HOWJUSFBIajZPcUw5dUFvemNlTm1qdGEzQjdDUHZjOW9NTXdHSVM2M1dWMm1tdWdOekViZGlOSzBmRUhsVDk2NllYTDloN2w5MTdhaUh2dFloK002S1B4UW5TT2hMcytGY0V4SE90emVlbnRkU0pKSmpzcG1kRXozLzFIODZUcTF2Nk50R1pieWU3czdISlhqOWhIdng2cTQ2OHE3QU5NdHJ5RnB3eTZveTVRenpYV2Qya3RQWVZMbkdIdGozcEt0Z1krQm8wUGV2dU9vUGdQYWRBL0wrYUNZMW85K09rVkN0VXpNdG5jVVpqSkhrU0QwZDdTZWoxTmVqcTY2alEySWVEKyt4TzFFbUVzRFZ3SmRjVHRqZkdxN1RGVVNhT3l2NjFxcTNFL0xFMjMxd0dSZ2VJbm91cjNjQXF4WnhmdDlIS2V4Qy9GODhwdlJhUktxdU0wbS83RU9tY1RnK3ZORnlzdnhNOCtPUnkydUJWNXp1TDdmQVU5Z3VvVzVrdm91VStVQ2piNjBQdE9QeE05VVdwNGxjd2RNSHVzL1JyeXREWlA1ZGEvdy9UNCtZZTBFN0JuRGVxSkp4OElWdDdrWFJ1dVFTWUNXZHJTZXNTa3ZSMWNUVWZyUTRsb1BISWJibmdzdTczMVROVEZmdFlIRzNyUnVraldKcDdPYnVmajB3TFFpUElzL0U0aGxxWHd5dittZWx2bCtNYXduUFhTcWhLb2o4WnJENkRzZE1nblFVZ28wdk5yL3BUelpuNitBUDN0WXpxbnZNdFZTb0xHUHJtbXBNUkl6cUx1VUhUR3RHRDVtSDlzYk9MbUM5ODN3dE54M3dHMUdpekIwMCtrU3VxNEtORVFBTnc4Nkp1bkdqL0gySnRpSDQrSEtEY0J3ejhwWldhYWFDVFNXd0tRUmxlUmJBQnlKbVJTdnNWNllGb05uOEtjVm81UkxLNmlya3ozZDlnNUVuN1Vqemo4c2FWRVhvMjM5WG9kTEF0VGR3VG9tcVJpWmo1dlU3OTA5MnFjRm1CbStmZW5Cb0M1VExRUWFPNkJ1VTJseEM0dlBXTHNySml2RjcyS3cvVzB4ZzlpYnk0YmtjeGFjWFZVRnBRVnhhdldhb01NbEFYS1JIblN5aXRGWk9YVDJiSjlHQWFkNnNCM3FNbFZCb0xHVGlpVVZmc0pNSE5lZ0Y2WVY0MG5pbGNaMGFjd2tPK1g2c3Mvd2VOdDNKbDVQckRXN3NUVG5GeFdCaEh5L1VxMEZLa1puNWREV3cvMjZDWGcrNG0xUWw2a1dUdHc2VEw5OFNiN1RnSi90di9jZ1BxMFlwV3dLL0szTTM2Wjd2TjFMQStzcTBKQm1kSS9SdGlyUWtDQzU2THFwRmcxMzVlRGp0V2tCWmt6cDFJaStYMTJtS2dnMDFpWitrMFJKOVY0RDdzU2t6N3dITS90cjNDZGpPeDRZR3NNZmxsMWlWTVpUZE9xRXJtMU10bk15ZWxvc0VoZEpQbGUvbzdKRU1hNnB5MVNGZ2NZT0twTEVtd2NjeGNKV2pBTVN0Ryszc3Zoa2Z0TTkzK1l0VlNVbEFmU2tXSUkyMDhFNnVxb1lBVGNaQkdkNnZIKzNBcytGL0ozcU1sVmhvTEc1aWlUeC9va1ptL0VJN2laQThrVlhGcC9Nei9kQVl4T2dYVXpLZDc1T0h5bERyUmtTdE5rTzF0RmV4UWlPZm5ObWU3eC9EVm1vd25vQW9pNVRGUVlhZFppKzdwSnMrNUdzVm95bW1rN21OOFB6N2UwS3JCK1RzcDJxMDBkRUlqTFB3VHE2cXhnQk55MGE4enpmeHpIQWlTRjhqN3BNVlJIVkRzVDAyWmRrNjVLQ2ZXeVl6Tzl2eENOditoYkVvOG5WWlZuZWdrbElJTWtJN2licFVFa016b1hPS2tabmdVWWN4dXpkZ1ptQU9zaXhrT295VlVXZ3NabUtReExrVXVBOS9PODZCZkZwU1hSNTA5dGZONmNpVWdVWDNXRDZZbnB5MUtlNEhIdmpKb05nWEpLREhJRVpqeHJFbkVUcU1sV0JOZ28wSktFYUp2UHJGWU50SFJLVE1oM3ZjRjBEVlVWRnBBb1RIZjB1TEozeWNzdzRXczlQTWRuZk1jQ3hBYXhYWGFaYUVXZ01VWEZJd2l3TlhCMkQ3VndlV0NwbGdjWUt1R20rRjVGMGNIWDlXVGJsNWVncWxmMVBNZHJudTRISEhLOVRYYWFxRERUYUEydW9PQ1NCNHZLakVvZEEvMGZINjF0ZjFWTkVLbFIwdEo3bFVsNk9LM242ZXhDMEkzSFhsZnByMUdXcTZrQmpOZUtUWWxNa2llSVFhSHpyZUgwYjZiQ0xTTWpYbjdWU1hvNkRISzNudXhnR3FoTWNyZXNUMUdXcTZrQmpzSXBDSkZKeCtQSDd4dkg2TnRGaEY1RUtqWEswbnJVVmFIajVleUFLTkVRa1FIRVlIRDBHbU9Od2ZWdWhsbFFSQ2ZmR051MHRHb005T3g2U2trQmpUUldGU0tTeUxKeGswRmYxd0djTzE5Y1QyRmlIWGtRcThEMXVVcXF1UWpDcFR1TmdOZHpNbC9ZdDhVZ2RMeDRGR2l1cktFUWkxUVdUZmNwM0h6bGUzODQ2OUNKU29VOGMzZmRzbmRMeTI4clQzd0ZKUWFBeFFFVWhFcmxzRExieFk4ZnIyMWVIWFVRcTlLR2o5V3l2UU1PTDR5QXBDVFF5dUprbFVrUnFFNGVXeFRjZHIyOFYxSDFLUkNyamF0NkNOQVlhN1lFZFBQMGRrSVFIR3YxVkRDSmVpTU9jSCs4RDh4eXY4MkFkZWhHcHdOdU8xck1xNlJ1YnVoMndoR2ZIUVZJU2FLeWtZaEJSb0ZHaG1jQjdqdGQ1Q09rZG5Da2lsZnNDZHhQM0haS3lzanZBMFhvK0JpYXFLa28xZ2NaeUtnWVJMOFRsWEh6ZThmcTZBWC9VNFJlUkNyem9hRDBIc1hDY2F0SjFBL1p3dEs0WFZBV2wya0NqajRwQnhBc3JwRFRRQURnZTZLQXFJQ0l0ZU5iUmV2b0JPNmFrekE0RHVudFcvcUpBUTBSQ0ZwZHo4UTNnSjhmclhCNDRWbFZBeEN2dFBkeW1wNEQ1anRaMVVrcnU4MDV3dEs0cHdNczZMYVRhQ3JpVWlrSEVDMHZFWkR2bkEwOEVzTjZ6Z0Y2cUJpTGU2T3JoTnYwTXZPSm9YZHNEUXhKK0RQZkNYVWJEcDRBNU9pMmsya0JqU1JXRGlCZmFZZnJTeHNHL0FsaG5iK0I4VlFNUmIvaDZmM0NmdzNWZG5QRGZGSmY3ZDQ5T0NXbE5vS0d1VXlMKzZCV1Q3WHdlR0JQQWVvOEZ0bEExRVBHQ3J6MGVIZ1JtT1ZyWERpUjNyTWFSdUpzSWRqd2FueUd0RERRNnFSaEV2QkdYN2xQMXdCMEJyTGNPdUkzNHRPeUlKRlUzb0srbjJ6WVplTWpoK3E0aGVSTVg5d0grNm5COWQrSitEaVZKU2FEUlM4VWc0bzA0QmY1NTNBM0tiR3hWRzJ5SVNIUUdlcjU5MXp2ZTEzTVNkdnh1eEYzWHR3WEFEVG9scExXQmhvajRvMnVNdHZWN1RCZUdJT3dML0VuVlFTUXlHM2krZlc4Qjd6dGMzK25BcGdrNWRrT0JmUnl1NzFGZ3RFNEphVzJnMFZuRklDS3RkSG1BNjc0QytFM0N5MjlwVlNIeDFPWU8xelVyb0cyODBPRzYybUlHbWNjOUUrZEt1Rzk5dUZTbmc5UVNhR2lTTEJGL3hLMmY4QWpnc1FDdlQvY0J1eWYwV0o4RjdLOHFMeDVxQyt3U2cwRGpjZUF6aCt0YkFkTktHOWY3b202WTFnZVhZLzJlQmQ3UktTRzEvSkNMaUQvaTJNTDRGOHpnOENDMEIvNE43Sm1nWTl3RHVBdTNUMk5GWE5yVzhjM3FsSUMyc3g3VDVjbWxMZTM1MlRabXg2eUR2VmF1NVhDZEM0QXpkVHFJQWcwUmlkSkh3QzBCcnI4OUpzUE1VUWtvcTcyQlQ0Q0RWVzNFWThjNlhOZE16Q1I3UVhrY2VOM3hPdmZESktTSVM3RFJFR1M0VHRON0gvQ0JUZ2RSb0NHU0hOTml1dDFuQjN3ejBRYlQ3L2cyNHBtU2UwZmdOUnN3TGE5cUxoNWJCOWpONGZxK0MyR2JqOE45cStydjdJMjI3OTJvdXRqcnlxOEQrQzA2VGFlREtOQVFTWmE0NWltZkFCd2Z3dmY4SHZPRWJkMFlsRWtYNEhETU9KWm5nTTFVdmNWemRaZzVKZW9jcm5OVUNOczlBdmg3QU92ZEIzZ0pmNU0yTEF1ODdEZ3diUEJYZ3BtVVZWSVlhRXhSTVlpSUEvY0FUNFh3UGFzRDd3Slg0dDg4UUhYQXJ6QnpqSXdGYnNVOElSYUpnOU5zL1hVcHJLNDNaeEZNQ3RiTmJDQ3puV2ZIYWtkTWV0OE5BMWozMnpiZ0ZIRVNhQ3hRTWNUYWZPQW40RnU3Zk5QbzM5TlVQTEV6T2ViYmZ5amhQQVZyaTVsbjR5dmdaS0tkU2J3dHNCVndyVDN2WGdHT0FIcXFPa3VNN0ExY0hNQjZ3OHBZTkJVNExLQjdtbVdBNTRHYmlQN2hSbS9nWmt3cmFSQXRMVE9CUXdobU1sWkpxZS90aWFuRjM2V0lTVEYzSmZBSFlIdk1US1k5S2ppKzdZRittSW1JRGdRdXdLUWpIYU55OVhJWmxJQnJ5dWJBM0pETGJTSm1UbzlWUTlySGZ2YW01Z0hnbHhxMis4U0lqOVZJUitVL01xRy9qNU1jbGM5b3ovZno5OENjZ003TnNMc2RYUlR3dFdZQ2NBTGhad2pzYks4WEV3TGV2OE1UZkw4NzJsRVpQYXJRb1RvZjYrYk95OERpRGt4bW1wVUNQUFlETUUrZy8rWHdCMVZMYmN1eUNibXVIQmxoR2I0Ri9CbFlHM2Q5elpmRFpLSVo1dkRtWElHR0FvMm9MWVZKNVJya3VSaTJ0cGhXeGFDdk16OWlrbUJrQXQ2ZmpQMmVIMFBZcHpzU2ZyK3JRQ01pcitubXpvdGxqRzJ4V0IrM0EvRXExUjR6TWRvRHdHd2RqOGlXTGdtNnRsemxRWGxPQlA1am4zSWVoT2x2dlNLbSswUFQxSlhkYkV2RkpqWUF2eGg0R1BnaHdPMVRvS0ZBb3hackFodTE0bk1yQTVlRjhJRHB6eEVkdDc0T2J5cGJXdVppdWpIOTBUNlFjUFZnNHdqZ2FVeUNrREQyNDIzaU9ZK1RBZzNQdGJNWEdvbkdBbnNUOUhkTTE2ajZDTGRsTGlZZitlUDJJdjFIVEM3MWpBNVRhR1lETXhLMFB5ZGpKdjA2Tk1KdDZBM3NiSmRTNW1ENkpIZEhXZmdrZmpZQS9vRVptL2VnZlhENEJhWTdYME1HdSs2WWx0S1Y3SU9zclFnbmExdTlmWEFWaGZHWVRFeXZVMWtYNDFydm8zWms0UndXbyt4Tit4ZkFsMEFCTTQ1eW1yMitOMXpqZTJER2NTMkRtWkY4VldDd0RSd0hoRnhlM3dGNzJHdWhpSE4zbzZmSVlTOXo3SS9ES3A3WGpjNDIyTkI0am5DV0h4TjRmV21MeVVhbDQ2c1dqVGlhaE44dEdvZDZYTGNmOHVENGJXMXZubld0S2IvOEJLeVdrdnZkMGFoRkkzUnRVSjdrc04wSFpERURTYi95ZkZ0bkF0ZmI3VDJQWkQxdDk5SFBDZHluK1ppeFJqZnA4SXFreXRVZWJNUExtTEZWYzNVNFNwb0M3QVI4cnFLUUlBT05zU3FHVUl6QU5Ja2VnUDhaU0pxYURweUw2US84ckE1bFlMNVA2SDdWQTBkaDh0eUxTUEk5anVuRzVjdTIvRmJCeG1JbUFEdGc1dUlRQ1RUUStGSEZFS2had0NtWVNYWGVpZm0rak1ZOC9UamNCaC9pMW5jSjM3K0xNYm42TmIrTFNITE53WXpQOGkzdzJVWFhudi8zSTdBTlppeUpTT0NCeGc4cWhzQjhCQXpCWkpPYWw2RDl1aDFZRC9oUWg5aXA3MU93ajQvWXVqTlNoMXNra2M3SHoyN0JMd0JiNko2SER6RzlLejVXVlpXd0FvM3ZWQXlCdUFYVGl2RnBRdmV2Z0prRThENGRhbWZTOGdQNEpiQXhjQW1hZlZZa1NWNENMdlY0KzBiYTMrWC9wdlQ0UEdpRHJlOVZWU1hNUUdNTXBudVB1REVYeUdGeVlNOU8rTDdPd0l3NStZc091eE5wQ3ZwbkEyZGlucXk5cTBNdmtvZ0hDUHZHNE9IQmo4QzJOaUJha0tMcjdmSDIrRXhWVlpXd0E0MEYrSi85S0M2bUFMc0NONmRzdnk4QWZrKzA4NEFrd1JjcDNPZjNNYTBiaDVHKzhXSUxTR2FtTVVtZk1aaDVKQ2JHWkh2bkFXY0FXNmJnL3VkOXpMd3AxNm1hU2xTQkJnbzBuSmlBbVFqcCtaVHUveitBUTFCWG1OYWFTbnI3RHRjRGQyQm1LejRKS0NaOGY3OEd6Z0g2QTNlcDZrdk1mWWJwUmpzcWh0ditLckEySmxIRm5JUWRseW5BQ1pnSE9aK3Bta3JVTGtPVDF0UTY0YzFhcWthQXlTbzBYM1dpNmtYZGh4YnFpSm1JYkdTQ2p1OVl6QlBGellFNmo4cmFWUm1QVEdoZG5JUW03R3R1ZVJ6b2xaQmp2VEp3djMzd0VmY0pnVzhDbHRaUHlXSkdvd243SW5PQWJ2UVVaRGowZTlXTHFwYzdWVzFLMnNqK2FFNks0VEg5MWdZWFc3Q3c5ZGczQ2pRVWFMUm1tUUw4MGJPZzJaVjFNWU9tNC9iQWJCWndxdzJZUklHR045clovMzZrb21pVmFjRE9oSnNtcmcyd09yQUpac2J1bFlBVmdhV0F6a0Fub0MwdzJmNFlmR20zNzMxTXQ2NHdCb0xkYnArbVhLd3FVckZQVlFRbHZXMlg0ekFET1BmQzVNTmZ6c050blEyOEFmd0hlQWI0SkFibE85VmVLMXlzSjRrbU8xclBsSVNVeHdMZ1g4QnBKRGQ1eFFoZ0gyQ0F2ZTRjREN6cDhmWitiMzl6YndURzZTZERmQTQ0WnFPbnl0VXM4NER0UXpvK1BZSGZBVThBdjFCYmsrcnp3RkNnZlFqYi9VL1ZrNHFYN1hVWnFzcnF3REhBdlpneEQxRWNzM0hBMDhEcG1DNVJIWFJZSkdTSGhsVFg1d0wvQmdhbnNJdzdBTC9CZEt1YTVzbnZ4YzgydU5nUmYxdExmVFFhdFdpRXJuR3o1L3VZaWJTa01zY0Nmdy80T3piRnpMQzZXd0EzTVdPQnE0RnJDVzRRWEVmTVlMc05WRjFhMUFkbElLcTEvTmF5eTBCTVM5OEFUR3RmWndmbnlsZkFONWo1WXo3Q1BQVWNxMktYaUcxaWY0ZldEV2o5SDlzYjdOdEpmcEtHU25UR0pIM1pEdFBDdWxaSU4vcno3RDNhQzhDTHdHczIrSlBxL0FYbzdlaTh1RTNGV1gyZ2tjZk0vU0F0dXhYVFB6VW8yMkptVjkwMGhIMFpaWU9aUndKYS93RGdBNUl6WURBSVh3R3JxaGdDMHhYb0J5d0JkTGRMcnlZM0R6TXhnMENuMkgrUHg3UllUQ0I1Mldna2VYb0RReG90YXdLclVGM0w5VHhNZDc4Um1DNkF6NkJadEN1NXRqU1UrZXJBYXBneEVwbFdCaUR6N0FPTXJ6R1pvajdISkFvWmllWTdrd1FFR3IvRHBKaVVsaVBaRFFNNjZWY0Vyc0prYmdyYjNaaXVLRUgwSmY0dFpuQ2RsUFlBcGp1YmlJZ3I3VEFwbExPWU1YTkxBRDNzMzZaaUJqdVB4OHlCOFFPbXI3K0NhbmRsdnpSbWJNY1NtQWNiYlJxVlA1anhQL1dZN3RDL1lCNXFqRVB6VVVtQ1pWRS8rWmFXNmZhcFJSQUIzOUdZbWJhajNMOVJ3RG9CMWE5N1ZIL0tMaWZyOGlNaUlpSkpOMEUzZmMwdUp3UlE1dDJCaHp6YXg2bVlyRDZ1OWJGUHoxU1BGbC9XMTZWSFJFUkVrdTVSM2ZTVlhWN0YvYUN2RlRBRFMzM2IxL25BZ1FIVXIwTlZqeFpiSm1QU0VZdUlpSWdrMm5HNjhTdWIybTgxeDJXOUNxWmZySy83SEVTd1VRZThydnEweVBLWUxqc2lJaUtTQnF2cnhxL2tjbVhLZ296R3djWnZIZS83cHFwUGl5d242cklqSWlJaWFmRzlidjRXV1g1aTBVd1J0ZXFMeWNjZmwvMmZpY25WN3RKanFsZi92d3pXSlVkRVJFVFM0aCs2K1F2c2lYTjc0dGwxNkVkZ0dZZmxzSzdxRlF0c1VDOGlJaUtTR252ckJuQ1JHOEhPRHN2MnNoaVh4WE1zT3U5S3JaNVIvZUlHWFc1RVJFUWtUYnBodXNzbzBEQ0Q0MTNaS1FIbGNiVEQ4dGhHOVN1UU5NSWlJaUlpWG50U040Rk10RUdYQzExSnh0aVhhWmlVdkM3VUFaK2x1SDVOQnpycFVpTWlJaUpKVlc1ZWlFZFZOTnhvYjZ4ZE9BZFlMZ0ZsMGhXNHlORzZGdGd5VHF1bmdWazZ6VVJFUkNSdGxzTE1IWkhXcDgzemdlVWRsZVdxd0p3RWxVMDlzSjZqc3VtVDRucjJHMTFtUkVSRUpLMmVTbkdnOFlURGNyd2pnZVhqY3BLNXgxTll2eWJqTnNtQWlJaUlpSGZhTlBPM2UxSmNMdjl3dEo0VmdBTVNXRDYvQmdZNFd0ZDlLYXhmajJFU0xvaUlpSWlrVWxmTUdJVTBQbTN1NktnTXIwbHdPYm1hTGIwWDZlcyt0Wk11THlJaUlwSjIvMHhob09HcU5hTTlNQ0hCNVRTTzVsdkVxdkZDaXVyWDkwQmJYVnBFUkVRazZWcTZVYnc1aFdYeXNLUDE3SW9aN0p4VWZZRk5IYTNybVJUVnI5c3d5UVpFUkVSRVVoMW92SXFaNnlBdFpnRXZPbHJYZ1Nrb3I3MGNyV2Q0U3VxWHl4WXpFUkVSa1ZnSEdwQ3VWbzJYZ0JrTzF0TVcyRDRGNWJXdG8vVjhBRXhLUVhrOUEzeXJ5NDZJaUlnbzBERHVjblR6SFFmUE8xclBSa0RQRkpUWElFelNnRnJWQSsra29MeHUwaVZIUkVSRUZHZ3M5RE5tTG9nMEdPNW9QZHVscEx6YUFrTWNyZXZkaEpmVmw4Q1R1dVNJaUlpSUFvMUZOYVJwVGJJcHdNZU8xclZCaXVyUUlBVWFGYmthMDNJaklpSWlva0Nqa1FMSmZ4cjdEdTZ5QWEyZG9qclUzOUY2UGs1d0dmME0zS25MallpSWlDalFLTzJLaEpmRmU0N1dzd1N3dkFLTnFvMG11Yk5sMzBoNnhqbUppSWlJVkIxb3ZBcThrdUN5Y05WMVoyREs2bEEvUit1cEI3NUlZUGxNQjRicFVpTWlJaUlLTkpwM2JvTEx3bFhYbmVWU1ZvZTZPVnpYcUFTV3ovV1lHZUpGUkVSRUZHZzBZemltWlNOcDVnTGZPRnJYc2ltclExMGRybXQwd3NwbU92QTNYV1pFUkVRa2pkcTE0alBuNDI2K0NWOThqcnVCNEROSWRoZXpwb29PMTVXMHllelVtaUVpSWlKU3BlY3g2VzZUc2p5cVErcUZvUW1xVTVPQUpYVklSVVJFSkszYXRQSnpwNUtzZVRWR3F5cDQ0YWNFN2N2RnFEVkRSRVJFRkdoVWJTUndyd0lOY1N3cE4rYmZBdGZxY0lxSWlJZ0NqZFk1RzVpVmtISVlxNnJnaGNrSjJZOHpFM1J1aUlpSWlJUWVhSXdHTGtsSU9ZeFRWZkRDbEFUc3d6dkFmVHFVSWlJaUlyWHBoSm43SU80RGQxZlhvZlJDKzVqWG8vbkFlanFNSW9uU0RkZ1dxRk5SaUlpRWIvY0VCQnBMNlRCNkk4NzE2Qm9kUHBIRXVkK2UzNThBUndDZFZTUWlJdUY2TE9ZM2lKMTBDQlZvMUxqOENQVFE0Uk5KbE9OTG5Pc1RNVm5sOUlCS1JDUWt5MklHOHNieEJuR2VEcDhDRFFmTGZqcDBJb215Q1RDbnpQbCtLMnJaRUJFSjFSK0o3OFJxb2tDamx1VVJIVGFSUkZrSytLSEV1VDRkK0oyS1IwUWtmSFhBeXpHOFNmeEpoMDZCUm8zMVIxMG9SSktqTGZCQ2lYUDlNMkJORlkrSVNIUldKSDVkcUVicnNDblFxR0haUjRkTUpGRXVMSEdlMzQzSlBpVWlJbFZvNTNoOTN3TEhBUDlVMFVvS1BBQThxR0lRU1l6ZVFGY1d6U0EzRXJoRFJTTWk0bytHZElCcTBaQnF4YVhlakFLVzBPRVNFUkVSQ2RjU21OYU50QVVhRHhQL09VVzB0THpNQlRiV2FTNGlJaUpTWHJ1QTF2c0xwdS82YTVqWm5uM1cwZUc2cHFoS3BjSlp3RnNxQmxZQmxpdngrbGVZakQxeFU0Y1o3UHNyWUhWZ0pVdzNtczZZYkVQajdMNjliNjl0RXp5K3B2MEsyQUFZd01Ka0JkTXh5UXUrQlQ0QTNyT3Z5VUsvQVpadjh0cDg0TzlBdlFmYnR3N1FxOGxyTTRHM0hheDdTV0JRaWRkL3NQVStTcDB3RDNjMkFWWUQrdGx6c3g2VG9uNGM4QjFtVXNXM2dDOGkyTWJsN0RVeFNLTngzd3VqM0hiN2NOeExXWi9neDB1OUJjd0thWC82QXRzQWc0SCtRQmNXWmtUOUVmalNYcXYvNThrMXlEdkhrYTcwdGplanAvMUpYNTYyTjZRQ3c4cVUwWWt4MjQ4VmdNc3BuYzYwM0ZJUHZBUWNGT0FEbTJxdENOeGdIM2hVc2cremdQOEErOGJnZ1ZCWVAvaXp5NVRWcnozWnh1Rmx0bTkvQit2ZXM4eTZoMFc0dnh0anhzZE1xL0k2L1RWd1BtYU9yN0NjR01Mdno3a2hidmN3VDgvVGtTR1VjLzhROW1OSFRIYTcrZ3EzcVFqY0NBelJwWHB4RCtCL041aWdiN3kwSkdQNUNvM0xTRktnc1NSd2kzMGlXa3U5K0E0WUd1RisxQUduMk1DaGxuMzRQZEFteGZYNUw4MlV6NHVlQnhyVHFEMzFyaytCeGtBYkJOZDZ6WjREWE0zaXJVQUtOQlJvUkJWbzlBWWVxM0g3bnNPMDdNUkNHRDhxaHdNZmVWd0c3WERYZlVyZEVKSnJ1djBoL2tWRmtRaDdZYnBYL0FFemIwSXRsZ2Z1c3pkR1MwWVFaTndCWEZIamRXeDU0RFpNbDdDQkthd1BIWUNqbS9uN05zQmFIbTkvVitBaG9Ic0Nqc1dKOXA1aFp3ZnJhbS9YOXo5Z0oxMzJKR0xMQWU4QXU5ZTRudTB4M1NXdndYUXJUSDJnTWMwV3FzOFQ0L1Z3dEo3Sk9vOFM2MkJNLzErSnYvTXdpUnQ2TzE3dnpwaXhEMnVFdUM4WEFvYzRYTjhtbURFb3E2U3NUZ3dGbHE3Z0J0aG5BNEhiaVcvWHp2YkFYWmdXaUE2TzE5M1BQZ2o0a3k1L0VwRk90ZzZ1N1BEKy9YaE02NGJYd3VwYi9DMW1rTjJMK05rWGVFbEhnZEFZblV1SnZURjlSTVdRQ0ZkV2VMTXhCL2djTXhodnJyMUdyRWJMWFRDV0IxNEJ0Z1ErRFhoZjFnRk9iK2J2TTRCMzdmVzNIdWlER2V3N29JWDFQbytmZzBDRFZFa1FjYUF0YjU4Zm12M1c3c3ZWTVN2L3RzQy9NSzNHTGZuWm5wc1Q3TTFiSHhzWTkyemhjL1g0M2J0Q2t1MHNtbThWL2RGZXIzKzI1OFB5bEU3KzBOU05DalFXZWhVNEF2aUhoK1hRRi9qTXdYckc2bHhLbkx0c29DSEp1SmxzS2NoNEFzaGpCbnJQYlBLM09tQnRUQXZDRVpqdUt1VWVYRHlENlVNN1BzRDlPWVBTcmRKemdiOEMxd05UUy94OVJjd0E4Q014bWJXYS90ajlNV1gxWWd0ZzNRcmUxOUdXMlFXZTc4L2xtQ3cxcjhib0dGelZRcEF4RjlOYWM1dmR0d1VsenMxQndONzIzT3hYWWgzSFlnYmZodTBhM0kxM21LVExlTFBuc2F0c2g2NnpKblp2NW1IR2FNeEUxMCtYcU5kdGdBM3RiODRoSlg1ejdzRjAyNVVtenNHL1FiNzdPdHEzRmRHQTZTUXR6K0crQ1Q5SmhoR2Z3ZUFiMnB1VmNzZjZVMkNqS3RhM0ZQQlBvc3RRMXRrR1FxVytkNzhLMTlFR09OUStJR240N0E0cHJNY1BVVHFyMkp3U3I0K04rSm93dk1KcjExZ2dVK1c2OXlTYVFjRjd0ckF2L3kwUkVEZW5BM0FxaTJhcXVpNmtCeGxoRGVBT1k3dUhlYnE5STRrdVUxUnI3VXY1VEZMTFZMaU9KVEV0OGczSlMwYlRjaXRlcXQzbzJRM2xLWTcycXczbDB5TnFpZGZ5b1U3aXhBUWE3VERqYThvZDZ5ZG9mVjcyNHpEekxKUmI5NEVCN2ROR1piN3ZnMWFzcXdmbVNmSFZLYXpEL2NzY3Z5ZWFDU1FQaWtHZ3NjQyt0NXBlQzFFRUd0MHhyV2psOXVFV1d0L2RPb3ZwS3ZVTXRTZDhVS0NoUUtNV1Y1WFo1dE5ic2E3QndBaGdzN2hjWktOS1pYZ3M4S2hINWJDaW8vWFVFM3kvYkFuZTE4QXVhSEIvVXZ5Qjhxay9YOEdNSDV2V3luVmZaNjluNVZ4Q01FL0ErNVY1dlRVSkM2WmdzZ09tY2FEc2NXVitCNjlyNWticnhKanMyNWEyL3Zuc05NcTN2RHlNNlFiVjJoVDBCVXh5Zy8xc01Da1NGWmZYNjQ4d2MybThya0NqZWZQdHlmK01KK1hnTWhMV1lMTjRHd05zaHdiMkowVmJlek5UeWdSTWsvYWNHci9qUnVEdU1uOWJIamVUcVRWVjdrbDFMZWwxRjZTc2JuU3pRV2hUbjJNR3hMOFB2Rm5pNzBPQXpUM2JseWxsWGo4Rk0yN0IxL0l2RjZTUEJnNXpVQ2Vub3dkR0VyME9qcS9Yc1pvaFBNckptZVpnbmlTKzdFRTVyTzV3WGUvb25JcXQ4Y0JXOWtkT2ttRTd5bWRaT2hOM2c3VlBhdWFHNWc4QjdOZWtNcTl2UTNYOTJkUHNNRXFuTnIrdTBRM3VOV1UrZTRKbisvSkh5ai81dndOWTFjUHkzNXZ5R1hWT2FTWjRFb21iQ1dWZS96M3hUVWNkaTBBRFRQckYzVHk0T1IrQXUwbjczdFE1RmRzTHdYYWtMNjFuMHUxVDV2V3g5Z2JNWmYzNWU1bS9iVWIxQTNOYjhrV1oxenRpbnNhdnIwUGY0bS9mY1NWZW40TEpOTmZnSVVxM2J1NkZ1eTYzTHJ4RCtTNWQzVEhka0xwNmRnektKUzM0ekc2dlNGSjhYdWIxTFRCWm8zb25lZWZiZUxBTk00QnRpYlpsb3cwbVI3NExINkttMnJqNUVmTWsrR01WUmVKc1UrYjF1Mmw5Mys5eWJpL3plaDJtcGN5bDc1cjU4VnJKM25nK0F1eUtNcWVWc2d1bG4vTGZ6cUxqZGVZQk41UjRYMXVhSDVzVGhSc3dBOWhMR1FUYzVORzJ0cVY4OTdPN1NGODNQa20yNTFvSXVML0JaSlFhbE1TZGIrZkpka3pEdEd3OGlwbGFQUXBEYkpCUXEvbVlIUHg3NmR5S2hUSDJKbEF0R2NuVGgvTGRwcDRONFB1K3RqZi9wUjVhckFQYzcvajdoalZ6ODFpSHlTSzBKK1lwL1hPWUNWTmZwbnhyU0pxY1dPSzFCWmk1UjVxNkdaT1d2Vk9UMS8rQW1XTm5ta2Y3ZFJSbVRwQlNOeXdIWVZyY2IvQmdPd2RTdXRzYXdGTUpxMnY5SFR4bytJVHkzVy9FMkpqYXh0dk9BMTRMYU5zK1llRkVycVgweENUaitKUDlIWG5HWHF0ZnhremdwMEREa1ladVZBOEN1MGNVYU56dWFGMVBLZENJaGE4eHJXbmZxaWdTYVpWbS92WkJRTi81VHBsQVkrVUF2dXRXZS9QWTBzRGtIcGdabzM5ci8vODdHM2c4YWdPdWVTbXJGMnZaODc3VWRmdnJFcTlQQU83RjlLZHVyQmRtRXEwYlBOcTM2Wml4RCsrVnVaRWZoaG5rL25iRTIxbHV6TWdjNEg4VnJtTUZ5cmRZdHVTT0VQZjFkM2FweFY3NGxhblRSN1ZPWERlWmxtZmhyc1dSbUptL1cwcWx2akptQXI5ak1JTyszN2VCeHdOVm5CdlNncmFZbk81aHo1dnduc045V0lybWMrdHJpWDc1Z01vbnlwSFNodUgzUEJxN2w5bStxUUYrNTRXVW45TWdDSDJBdDJvNEQ4WmhVcUF1bWFKNmUwdVpzbWh1c3NLMXkzem1DOElkekRtY3l1WVEyTHVaWS81ZG1lTzlKK0hOcDNCWW1lK3FwbVY1enhycWZSQk9EUEQzYXM4QTY5U0pKR01lalZxWFNTRnMrOWIyZTFxN2pTTXdrNnkyaTlNRnQ0MkgyelFmazlQOXZKQy9kMTNLTitWVzZ5ZE05eW54MDdPWUpzd2ZWUlNKMXFuTTZ6TUQvTTV5UDFaZEF2cStpU3ljTDZFMVkwNzZZaWFOR28zSnd0VTI0WFZpU1VwUHVOZVEwcmFjRDhzRWkxbGdady8zODJIZ2lqSi9XeDd6OURmS1kxMXVNdFJwaUNUWHk4QjZMVnhybXJNTzhBOU13b1J0NHJMVGJUemV0bk14ay9YTUM3RXNOblc0dmp0MVRubnBIOEN2Q2ZhcHR2aGhUcFVCaUF2bE12dk1DUEE3WjlzZ29UOXdHZVpCUjJ1Mit5TGdhVm8vUzNvYzVNb2MvOFlwYmN1NXRzenJKM3E2cjJkZytvV1hzaDN3MXdpM3JkejUwRm1YTFVtNGJ6Q3RwNXRqdXNPMTVoNTNGZUFGVEJwb0JSbzF1Z1hZRWZnbHBPL2J3ZUc2SGc1eHU2VmxDNEN6TUsxbGMxVWNxVkR1L091T3U5Ykxwc3Fsc1ExalFOOVlUT3RFUDh4VDlyejlVYXZHOXNDL1NHWnU5dzdBMFNWZWI1clN0cHpIS1QyZWEzdkt6endmcGZuQVVNcTMzSjZEeVVvV2hYSXRGK3JPS21ueE9tYnN6ZEtZeEJLUFVWM0cwanBNcStYdmZkL1JPUFR6ZWduWUFIZ1NkeWxveTlrWk0rcmZoUm1Zd1pxbjZueUszRlRnQUZ1SEpEMUdOL08zZFNuL3RMY1dhNWQ1L2VzUTkzc2VadkRnTS9iL0IyQUdQMitGZVppeVZBWFh3VU5JWHF2c1BqWUlhK3AyS3V1eU14L1Q4dkczRW44N0FkTUM3NXVpM2UvaFpYN3YvNGxKaERMS2szT3pPN0FjOEVNRjY1aE15NWtpVnlINitVT3VvZmJ4RHVPUmxteFJZYjBwSjZyWnRuL0dqRXUrRGRPZGNYM01XSTV0Z1YvUmNucnlhK3hERUdVbGM2Q0hMY3lnQndtdjRuQ2JWOEIwMzlEZzYraVdMMElJVU5OcUdINFBCcSt6Ri9GUzIzaEJBTi9YczVuei9VQlB5cVN0RFRqdXRRRkp1Zk1taVhQS3ZCUGdkV1lHWm1CKzBJWlQyV0R3cGs2aStjUVluUWgzTUhpdlpyYm40QkRLS3dnbmx2bXVjejAvTDA0a0dZUEIreWZ3bXRVVE0vajd2UmF1UDJmN3ZCTnRZbFRnVTRBOU1GMEQ1Z2Y0UGI5MXVLN3ZNR01DSkJxUEFodFJmbUl6U2JZRndLdGwvbll3N2x0MDl3WGFsL25iSzU2VXlYeDc4M1VBWm1CaG9jejdCZ0hMSnFndWJJcHBHUTlLWi94czBXaHdOU1oxZkNuclVucitrQ0JOd2d4b0xXVWZYYnBFQU5OcWQ0ZTlkaDFHK1c3ZnUvcThFMjFpVnVnTE1JTWR0eUc0akVHdUwzS1hVbjVRcWdSakRuQWNKc1hqSkJWSDZvUE5VbFlFOW5mNFBlMkFrOHY4N1cxcWE5SVB5aWVZOFFYbHNuQ3RsS0I2Y0dJSTMzRk1NNEdtRHc2bi9FT1h3KzJOVEppZUx2UDZicFNmWjBNa2pSYllnT09rTW44Zm9FRER2ZjlpbnNZRk1ZUG9lcGhaUzEwWmhlblhLK0g0Q3RnRTg0UnVnWW9qOVI3R1RHSld5bVZBYjBmZmMwSXoxdzJmV3pXL28vd2NIMzBUVWdkV3NBOGRncllzYmx2RVhac0svS2FaOHlIc2lYTHZMdk42SFhDbExsMGlpeWszYnM3cmVaRGF4TGpBeDJQU2xCNk4rN3o0ZjNDOHZnc3dFMk5Kc0c2emdlSUhLZ3F4SmdNM2wvbmJNcGpCc0xYT0o3QXhKalZzS2VPb0xLTlJheDFrcjRPMUtKY1JhMzVDNnNDeGhEZG54QW1lbDhXbm1OWUxINHpBWk40cDVkZVlWTVFpU2RFVzA4TmwrUnJXTVkzUzNhZThmcWphTHVZSGJnRndJeVl6MVQyWTdCa3VISXhKaGVxcXk5TmtUSlBYdlRyWEFqRVcwei82S1JXRmxIQXBwbHRJcnhKLzI4VUdHNGUyOG56ZkNIZ0M2RmptNytjUTNBU0JtMk15SnJVRExzWk1jdHFhMU0yRG1qbXY0cTRycFI4Y3piVkJXaTNYK051QkpVclVoNDB4czdYNzZnSE1tSlhqUGRpV3Z3QXZsdm5iOVRZSWZsQ1hNRW1BeXpEZGF3KzF5ek90V01kQVNuZlBIS1BpRFM5YVBCV1QvY05GRnBHREF0akdSMUFXS05mTFBTVis3Q1Vjdy9BNzYxUmp1UmJxMFZ0VTEyV3lEampLQmhIbDF2a3F3YlVhRDhDa00yejhmU09BemFwY3oyL0tiUHNzZ3B2TlBFeEhsZG0vZnpwWTl4VmwxbjEvZ1BzekhEY1pkOW9EYjFSNGpSMFc4REY2c0pudnJzZjBDT2hRNVRvNzJ5Qm1Mc282MWRydEh1YnA5bzRrZmxtbi9sQmllMituL0x4TDVYNXp5cDByRCtsMkpGeXJZcVo1ci9VRzlyMEF0bTBwVEY1ekJRaTFMOTlnbmthTEFnMFhOelFMTUUrMzg1anVkK1YwdFE4aFJyU3dycDh3OHdFRW9TZW1DMHk1NzM0V2s2cTBRd3MzbXNkU1BoM3ZZd21vbjNXWXdjK2w5bTlqQit0ZnlkNElOMTMzdkFDUHZhdEFBOHlZa25FZUJCcDlnTzliMklZdjdjMWF0d3FPeVFVVjdKY0NEUVVhWWRtcW1ldnNURXpMM1RvdHJDTmpIMkNVcTg4SCtINGhUcUk2eklSVGwxUGJnTVp0Yk5EaTBqYkE4OFI3ZkV5VTVtS2VKRjVJY0YxU3BQSkFJOGcrNlV2Z05tdFlGK0FGVExLQWxvd0Yzc2RraTVwanQyVVZUSnJCbGpJTHpRUzJCTjROcUZ4T3RkZTJsa3pIUExYK0g2WnBmUjdtU2UvcXdFNDBQM0hmcnlpZkdqZ3VkZ2IrVStMMWQ0RU5IWDNIazVST0xYa1pKaFY3RUlIR2xpVmVIMER6RTFTV3M3VTlKNXI3UGJvbWhJY0g2MkJTUVBkbzRYMnpNVm5jUHJMQi9Eek1RTmpsYlBCWVNmLzNXZlk4Q09LRy9lb3kyenpMMFhlOGhzbktGY1oydTdLdURRNWNCaHFsSmthZGlydEo5NDdHWFZmMzk2aXNXLzhZekppbEwxazQrZDVTOXJQYk5QTzc4eTJRUmRsTkk5UFRYaVRuMGJxbjVzTUQycTQvb3hhSjFpelAyNXNrOFNmUUNQSjQ5d3JvbXZCeWdOczhFZE5QUCtnSEtXZGpCbXNIc1ErM0phUitQa1B3RThMdFhPWTdmaWFZcm1mRGNmODA5M1NpYmRGb3NKRTlmNEs4cG96QzNWak9VamZzUWY4R0RvL2hkcS9qZUh0SGhsRE9oenJjM2o2WWNjUkJiZXRPdWhYeHd5Qk16dTdXSE1SdEE5cW1meWh3cUhqNUZIV1RVcURoVGtjV3BqOTJ1YndQckJ4aStXK01tZm5lNVQ2OFJQbUI3WEd5ZXBuOUcrOTQvOXBnVW1xWCtxNGdzaVlGRVdqVVllYWJpVHJRQU5QMU9ZZ2J5WHBNOXJrZUFXNjdBZzBGR3MxZEowN0UzUmppaHVVRXhEdmIwdkpVN2syWEVRVFR6YWxERGNGUFdwYnh3SkhFUHp1YUFnMi9BbzBHMjJCbUo2NTFPNmRodWpORk1WbGJCL3RqTTk3QmZ0eEk5WU51ZlhWVG1YMjhJSUR2T3FtWkJ5U3V1eWNIRVdoZ3o3V3Y4S092ZmlkTTFrZFhOMlV2QXV1SHNOMEtOQlJvdEdSWnpDRHd1VFZ1M3lSZ1A5MkMrS3ZPSHFCUHF6aW9RYzJZMm9WZ205VGl1a3pBTk9kM1UzVlZvQkd3TnNCUXpIaUVhcmR2TkNhelRXOFBqa1ZIZTUxNmtlcTZWTlZqeGpGc21xQjYyYnZNVGVwYyswUHYyaExOM0JUdkdKTkFBMkJ3bWYwWUZ0RnhYQW80SHpPcFpMWG41aStZRm93aElXNnZBZzBGR3BWYURqUE85S3NxdDJzeWNCVXhtMHcxcVlQQks3M0IyTmZlS0xUVTcvOG5ZRFhLVDJ4VmE3RHhKR1pRWHRwTkJQNkc2ZFl5VGNYaHZRMkJOUUpjLzcyRU84QnRCV0FIVElyWTFlei9kOFU4NVorT3lSajNGV1l3Nmt1WVFjVStUcFMwSkdZdzk0YVlRWUlyWUxxTXRMYzNZRDlqc3JhOWpXbFZIWnV3ZXRrZmsrbWwxUFhsaVlDK2MwZk1CSkJOZldiTDJaV2RLSjBTODkrT3JwbWJZYm92TmZZcDhFN0V2OVViWVFiQmI0Qkp5ckFNQ3dkMFQ3Ty8wVjhDSHdML3hTUkJDSHR3N0JxNFN6SlFUcEhXemI4UTVYWS83dmplYWZjUUh1NjhacS8xWVZqTlhxL1hzWFc3TDJZczRWeGJiaE14Q1QzK2F4OGtLUWxPVEFPT2ZleVBRWE9SNUswQmJrTm5UQjdrdExaZ2pNWjBQMUFMaG9pSWlJZ2swbWFZSjBQMVpXNklkd2p3dTl0aW51YW5LY0I0RjlPTlRXTXdSRVJFUkNRVkJnQVhzL2prZW1NSXZzbnVBRXhUY0ZLRGl4bkFIU1NyVDdpSWlJaUlTRlhhWTdwVnZjakNWbzZIQ1g1c1M1YUYvYitUc253TUhFYzRBM3hGUkVSRVJHSmpXVXdLeTVIQUtTRjhYenZNeEg2dTh5Nkh1WHlIbWNWN1BWVWZFUkVSRVpHV1pRa3ZZOWNLd0QweENpNSt3T1RqMzRKZzVoOFJFUkVSRVJHSEJnSDNBL1B3YzFEM1g0RjFTWGZLWkJFUkVSR1IyRm9CdUlqV1RXTGthdmtjTS9QdVVHQnBIUklSRVJFUmFVcFBuK09yRFNaejArNll5YUxXQ3VoNFRnTSt3RXpZOUI3d0NpWWJsNGlJaUlpSUFvMFVXQUl6dStmYW1Kbk9CMkFHc1BkbThaUzhNekd6cHM2dy8vM0ZCZzgvQXVNd013VVhnVStBTHpBWnQwUkVSRVJFS3ZaL0F3RFdiOGgzcExhdEN3QUFBQUJKUlU1RXJrSmdnZz09IjsKbGV0IGVuam95TG9nb1Byb21pc2VWMTY7CmZ1bmN0aW9uIGVuam95TG9nb1YxNigpe3JldHVybiBlbmpveUxvZ29Qcm9taXNlVjE2Pz89bmV3IFByb21pc2UoKG9rLG5vKT0+e2NvbnN0IGltYWdlPW5ldyBJbWFnZTtpbWFnZS5vbmxvYWQ9KCk9Pm9rKGltYWdlKTtpbWFnZS5vbmVycm9yPSgpPT5ubyhFcnJvcignTm8gc2UgcHVkbyBjYXJnYXIgZWwgbG9nbyBkZSBFbmpveS4nKSk7aW1hZ2Uuc3JjPUVOSk9ZX0xPR09fVjE2fSl9CmNoYXJ0UG5nVjg9YXN5bmMgZnVuY3Rpb24oc3ZnLHRpdGxlLGxlZ2VuZCl7CiBjb25zdCBjbG9uZT1zdmcuY2xvbmVOb2RlKHRydWUpLGJveD1zdmcudmlld0JveC5iYXNlVmFsLHdpZHRoPWJveC53aWR0aHx8NjgwLGhlaWdodD1ib3guaGVpZ2h0fHwzNTA7CiBjb25zdCBzdHlsZT1nZXRDb21wdXRlZFN0eWxlKHN2ZyksYmc9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wbG90YmcnKS50cmltKCl8fCcjZmZmJyxmZz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3R0ZXh0JykudHJpbSgpfHwnIzI3NDU1OScsZ3JpZD1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXBsb3RncmlkJykudHJpbSgpfHwnI2RiZTVlZCc7CiBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtjbG9uZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3aWR0aCk7Y2xvbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGhlaWdodCk7Y2xvbmUuc2V0QXR0cmlidXRlKCdmb250LWZhbWlseScsJ0FyaWFsLCBzYW5zLXNlcmlmJyk7Y2xvbmUucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpOwogY29uc3Qgc2VyaWFsaXplZD1uZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKS5yZXBsYWNlKC92YXJcKC0tcGxvdGJnXCkvZyxiZykucmVwbGFjZSgvdmFyXCgtLXBsb3R0ZXh0XCkvZyxmZykucmVwbGFjZSgvdmFyXCgtLXBsb3RncmlkXCkvZyxncmlkKTsKIGNvbnN0IHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzZXJpYWxpemVkXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04J30pKTsKIHRyeXsKICBjb25zdCBbaW1hZ2UsbG9nb109YXdhaXQgUHJvbWlzZS5hbGwoW25ldyBQcm9taXNlKChvayxubyk9Pntjb25zdCBpbWFnZT1uZXcgSW1hZ2U7aW1hZ2Uub25sb2FkPSgpPT5vayhpbWFnZSk7aW1hZ2Uub25lcnJvcj0oKT0+bm8oRXJyb3IoJ05vIHNlIHB1ZG8gY29udmVydGlyIGVsIGdyw6FmaWNvIGEgaW1hZ2VuLicpKTtpbWFnZS5zcmM9dXJsfSksZW5qb3lMb2dvVjE2KCldKTsKICBjb25zdCBzY2FsZT1NYXRoLm1pbigyLDgwMDAvd2lkdGgpLGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9TWF0aC5jZWlsKHdpZHRoKnNjYWxlKTtjYW52YXMuaGVpZ2h0PU1hdGguY2VpbCgoaGVpZ2h0KzIyMCkqc2NhbGUpOwogIGNvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguc2NhbGUoc2NhbGUsc2NhbGUpO2N0eC5maWxsU3R5bGU9Ymc7Y3R4LmZpbGxSZWN0KDAsMCx3aWR0aCxoZWlnaHQrMjIwKTtjdHguZmlsbFN0eWxlPWZnOwogIGN0eC5mb250PSdib2xkIDI4cHggQXJpYWwnO2N0eC5maWxsVGV4dCh0aXRsZSwyNCw0MCx3aWR0aC00OCk7Y3R4LmZvbnQ9JzE2cHggQXJpYWwnO2N0eC5maWxsVGV4dChsZWdlbmQuc2xpY2UoMCxNYXRoLmZsb29yKHdpZHRoLzkpKSwyNCw3MCx3aWR0aC00OCk7Y3R4LmRyYXdJbWFnZShpbWFnZSwwLDEwMCx3aWR0aCxoZWlnaHQpOwogIGNvbnN0IGxvZ29XaWR0aD1NYXRoLm1pbigxNTAsd2lkdGgqLjE5KSxsb2dvSGVpZ2h0PWxvZ29XaWR0aCozMjYvNzk0LHg9d2lkdGgtbG9nb1dpZHRoLTI0LHk9aGVpZ2h0KzEzMjsKICBjdHguZmlsbFN0eWxlPScjZmZmZmZmJztjdHguZmlsbFJlY3QoeC05LHktOSxsb2dvV2lkdGgrMTgsbG9nb0hlaWdodCsxOCk7Y3R4LmRyYXdJbWFnZShsb2dvLHgseSxsb2dvV2lkdGgsbG9nb0hlaWdodCk7CiAgY3R4LmZpbGxTdHlsZT1mZztjdHguZm9udD0nMTJweCBBcmlhbCc7Y3R4LmZpbGxUZXh0KCdFbmpveSBMb3Mgw4FuZ2VsZXMgwrcgQW7DoWxpc2lzIGRlIG3DoXF1aW5hcyBkZSBhemFyJywyNCxoZWlnaHQrMTY4LE1hdGgubWF4KDEwMCx3aWR0aC1sb2dvV2lkdGgtODUpKTsKICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKG9rLG5vKT0+Y2FudmFzLnRvQmxvYihibG9iPT5ibG9iP29rKGJsb2IpOm5vKEVycm9yKCdObyBzZSBwdWRvIGdlbmVyYXIgZWwgUE5HLicpKSwnaW1hZ2UvcG5nJykpOwogfWZpbmFsbHl7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpfQp9Owpkb2N1bWVudC50aXRsZT0nRW5qb3kgTG9zIMOBbmdlbGVzIMK3IEFuw6FsaXNpcyBkZSBtw6FxdWluYXMgZGUgYXphcic7CgpsZXQgZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7CmxvZ2luU2NyZWVuVjE1PWZ1bmN0aW9uKG1lc3NhZ2U9JycpewogZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKIGNvbnN0IHBhbmVsPSQoJyNsb2dpblYxNScpO3BhbmVsLmhpZGRlbj1mYWxzZTtwYW5lbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnLCdpbXBvcnRhbnQnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9Owpyb2xlSW50ZXJmYWNlVjE1PWZ1bmN0aW9uKCl7CiBpZighYXBwU2Vzc2lvblYxNXx8IWRhc2hib2FyZFJlYWR5VjE3KXJldHVybjsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlld2VyVjE1JyxhcHBTZXNzaW9uVjE1LnJvbGUhPT0nYWRtaW4nKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTsKIGNvbnN0IG1haW49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpLGFzaWRlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FzaWRlJyk7aWYobWFpbil7bWFpbi5oaWRkZW49ZmFsc2U7bWFpbi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpfWlmKGFzaWRlKXthc2lkZS5oaWRkZW49ZmFsc2U7YXNpZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKX0KIGNvbnN0IHBhbmVsPSQoJyNsb2dpblYxNScpO3BhbmVsLmhpZGRlbj10cnVlO3BhbmVsLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5Jywnbm9uZScsJ2ltcG9ydGFudCcpOwp9OwpvcGVuU2Vzc2lvblYxNT1hc3luYyBmdW5jdGlvbihzZXNzaW9uKXsKIGFwcFNlc3Npb25WMTU9c2Vzc2lvbjtkYXNoYm9hcmRSZWFkeVYxNz1mYWxzZTsKIHRyeXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdMQV9BVVRIX1NFU1NJT04nLEpTT04uc3RyaW5naWZ5KHNlc3Npb24pKX1jYXRjaChlKXt9CiAkKCcjbG9naW5WMTUnKS5oaWRkZW49ZmFsc2U7JCgnI2xvZ2luVjE1Jykuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdmbGV4JywnaW1wb3J0YW50Jyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD0nQWNjZXNvIHZhbGlkYWRvLiBSZWN1cGVyYW5kbyBsYSBtYXRyaXogcHJpdmFkYeKApic7CiB0cnl7CiAgY29uc3QgaW5jb21pbmc9YXdhaXQgY2FjaGVkKCk7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW4hPT1zZXNzaW9uLnRva2VuKXJldHVybjsKICBkYXRhPWluY29taW5nO3NhdmVkVmlld3M9W107bG9hZFZpZXdzKCk7JCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdNYXRyaXogcmVjaWJpZGEuIFByZXBhcmFuZG8gaW5mb3JtZXPigKYnOwogIGF3YWl0IG5ldyBQcm9taXNlKG9rPT5zZXRUaW1lb3V0KG9rLDIwKSk7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW4hPT1zZXNzaW9uLnRva2VuKXJldHVybjsKICBpbml0KCk7aWYoISQoJyNjb250ZW50JykuaW5uZXJIVE1MLnRyaW0oKSl0aHJvdyBFcnJvcignTm8gc2UgZ2VuZXLDsyBlbCBjb250ZW5pZG8gZGVsIGluZm9ybWUuJyk7CiAgZGFzaGJvYXJkUmVhZHlWMTc9dHJ1ZTtzdGFydGVkU2Vzc2lvblYxNT10cnVlO3JvbGVJbnRlcmZhY2VWMTUoKTsKICBycGMoJ2dldFZpZXdzJykudGhlbih2YWx1ZT0+e2lmKGFwcFNlc3Npb25WMTU/LnRva2VuIT09c2Vzc2lvbi50b2tlbilyZXR1cm47Y29uc3Qgdmlld3M9SlNPTi5wYXJzZSh2YWx1ZSk7aWYoQXJyYXkuaXNBcnJheSh2aWV3cykpe3NhdmVkVmlld3M9dmlld3M7bG9hZFZpZXdzKCl9fSkuY2F0Y2goZXJyb3I9PntpZihhcHBTZXNzaW9uVjE1Py50b2tlbj09PXNlc3Npb24udG9rZW4pJCgnI3N0YXR1cycpLnRleHRDb250ZW50Kz0nIMK3IE5vIHNlIGNhcmdhcm9uIGxhcyB2aXN0YXMgZ3VhcmRhZGFzLid9KTsKIH1jYXRjaChlcnJvcil7CiAgZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7ZGF0YT1udWxsOyQoJyNjb250ZW50JykuaW5uZXJIVE1MPScnO3RyeXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdMQV9BVVRIX1NFU1NJT04nKX1jYXRjaChlKXt9CiAgYXBwU2Vzc2lvblYxNT1udWxsO2xvZ2luU2NyZWVuVjE1KCdObyBzZSBwdWRvIGFicmlyIGVsIGRhc2hib2FyZDogJysoZXJyb3IubWVzc2FnZXx8U3RyaW5nKGVycm9yKSkrJy4gUHVlZGVzIHZvbHZlciBhIGluZ3Jlc2FyLicpO3Rocm93IGVycm9yOwogfQp9OwoKZnVuY3Rpb24gc2hvd0xvZ2luVjE4KG1lc3NhZ2U9JycpewogZGFzaGJvYXJkUmVhZHlWMTc9ZmFsc2U7CiBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoYm9hcmRSb290VjE4JyksbG9naW49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luVjE1Jyk7CiBpZihyb290KXtyb290LmhpZGRlbj10cnVlO3Jvb3Quc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyl9CiBpZihsb2dpbil7bG9naW4uaGlkZGVuPWZhbHNlO2xvZ2luLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpfQogZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsb2NrZWRWMTUnKTsKICQoJyNsb2dpbk1lc3NhZ2VWMTUnKS50ZXh0Q29udGVudD1tZXNzYWdlOyQoJyNwYXNzd29yZFYxNScpLnZhbHVlPScnOwp9CmxvZ2luU2NyZWVuVjE1PXNob3dMb2dpblYxODsKcm9sZUludGVyZmFjZVYxNT1mdW5jdGlvbigpewogaWYoIWFwcFNlc3Npb25WMTV8fCFkYXNoYm9hcmRSZWFkeVYxNylyZXR1cm47CiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ3ZpZXdlclYxNScsYXBwU2Vzc2lvblYxNS5yb2xlIT09J2FkbWluJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsb2NrZWRWMTUnKTsKICQoJyNzZXNzaW9uTmFtZVYxNScpLnRleHRDb250ZW50PWFwcFNlc3Npb25WMTUudXNlcm5hbWUrJyDCtyAnKyhhcHBTZXNzaW9uVjE1LnJvbGU9PT0nYWRtaW4nPydBZG1pbmlzdHJhY2nDs24nOidDb25zdWx0YScpOwogY29uc3Qgcm9vdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkUm9vdFYxOCcpO3Jvb3QuaGlkZGVuPWZhbHNlO3Jvb3Quc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdibG9jaycsJ2ltcG9ydGFudCcpOwogZm9yKGNvbnN0IHNlbGVjdG9yIG9mIFsnbWFpbicsJ2FzaWRlJ10pe2NvbnN0IGVsZW1lbnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7aWYoZWxlbWVudCl7ZWxlbWVudC5oaWRkZW49ZmFsc2U7ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2Jsb2NrJywnaW1wb3J0YW50Jyl9fQogJCgnI2xvZ2luVjE1JykuaGlkZGVuPXRydWU7JCgnI2xvZ2luVjE1Jykuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdub25lJywnaW1wb3J0YW50Jyk7Cn07CmNvbnN0IHN1Ym1pdEJlZm9yZVYxOD0kKCcjbG9naW5Gb3JtVjE1Jykub25zdWJtaXQ7CmxldCBzdWJtaXR0aW5nVjE4PWZhbHNlOwphc3luYyBmdW5jdGlvbiBzdWJtaXRMb2dpblYxOChldmVudCl7CiBpZihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24/LigpfQogaWYoc3VibWl0dGluZ1YxOClyZXR1cm47Y29uc3QgZm9ybT0kKCcjbG9naW5Gb3JtVjE1Jyk7aWYoZm9ybS5yZXBvcnRWYWxpZGl0eSYmIWZvcm0ucmVwb3J0VmFsaWRpdHkoKSlyZXR1cm47CiBzdWJtaXR0aW5nVjE4PXRydWU7dHJ5e2F3YWl0IHN1Ym1pdEJlZm9yZVYxOCh7cHJldmVudERlZmF1bHQoKXt9fSl9Y2F0Y2goZXJyb3Ipe3Nob3dMb2dpblYxOCgnTm8gc2UgcHVkbyBpbmdyZXNhcjogJysoZXJyb3IubWVzc2FnZXx8ZXJyb3IpKX1maW5hbGx5e3N1Ym1pdHRpbmdWMTg9ZmFsc2V9Cn0KLy8gQSBub24tc3VibWl0IGJ1dHRvbiBjYW5ub3QgbmF2aWdhdGUvcmVsb2FkIHRoZSBBcHBzIFNjcmlwdCBpZnJhbWUuCiQoJyNsb2dpbkJ1dHRvblYxNScpLnR5cGU9J2J1dHRvbic7JCgnI2xvZ2luQnV0dG9uVjE1Jykub25jbGljaz1zdWJtaXRMb2dpblYxODsKJCgnI2xvZ2luRm9ybVYxNScpLm9uc3VibWl0PWV2ZW50PT57ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24/LigpO3N1Ym1pdExvZ2luVjE4KGV2ZW50KTtyZXR1cm4gZmFsc2V9OwokKCcjbG9naW5Gb3JtVjE1JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihldmVudC5rZXk9PT0nRW50ZXInKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3N1Ym1pdExvZ2luVjE4KGV2ZW50KX19KTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJyxldmVudD0+e2lmKCFkYXNoYm9hcmRSZWFkeVYxNylzaG93TG9naW5WMTgoJ0Vycm9yIGRlIGxhIHDDoWdpbmE6ICcrZXZlbnQubWVzc2FnZSl9KTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsZXZlbnQ9PntpZighZGFzaGJvYXJkUmVhZHlWMTcpc2hvd0xvZ2luVjE4KCdObyBzZSBjb21wbGV0w7MgZWwgaW5ncmVzbzogJysoZXZlbnQucmVhc29uPy5tZXNzYWdlfHxTdHJpbmcoZXZlbnQucmVhc29uKSkpfSk7Ci8vIFJlY292ZXIgYSB2aXNpYmx5IGVtcHR5IHNoZWxsIHdpdGhvdXQgcmVxdWVzdGluZyBvciBleHBvc2luZyBhbnkgZGF0YS4Kc2V0VGltZW91dCgoKT0+e2lmKCFkYXNoYm9hcmRSZWFkeVYxNyl7Y29uc3QgcGFuZWw9JCgnI2xvZ2luVjE1Jyk7cGFuZWwuaGlkZGVuPWZhbHNlO3BhbmVsLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcsJ2ltcG9ydGFudCcpO2lmKCEkKCcjbG9naW5NZXNzYWdlVjE1JykudGV4dENvbnRlbnQpJCgnI2xvZ2luTWVzc2FnZVYxNScpLnRleHRDb250ZW50PSdJbmdyZXNhIGNvbiB0dSB1c3VhcmlvIHkgY29udHJhc2XDsWEuJ319LDI1MDApOwoKCmZ1bmN0aW9uIGNvbXBhcmlzb25Db21iaW5lZFYyMihlbnRyaWVzKXsKIGNvbnN0IGtleXM9Wydjb2luJywnd2luJ10sdmFsdWVzPWVudHJpZXMuZmxhdE1hcChlPT5rZXlzLm1hcChrPT5OdW1iZXIoZS50b3RhbFtrXSl8fDApKTsKIGNvbnN0IGxvPU1hdGgubWluKDAsLi4udmFsdWVzKSxoaT1NYXRoLm1heCgwLC4uLnZhbHVlcyksc3Bhbj1oaS1sb3x8MSx5PXY9PjIxNS0odi1sbykvc3BhbioxNjUsemVybz15KDApOwogY29uc3QgY29sb3I9e2NvaW46JyMxNzM2NTInLHdpbjonIzEzOGY5Myd9OwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCI+PHN2ZyB2aWV3Qm94PSIwIDAgNzYwIDMyMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJDb2luIEluIHkgV2luOiBjb21wYXJhY2nDs24gQSB5IEIsIGVzY2FsYSBjb23Dum4gZW4gQ0xQIiBzdHlsZT0iaGVpZ2h0OjMyMHB4Ij48dGV4dCB4PSIyNSIgeT0iMjAiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIiBmb250LWZhbWlseT0iQXJpYWwiPkNMUCDCtyBFc2NhbGEgY29tw7puPC90ZXh0PjxsaW5lIHgxPSIzNSIgeTE9IiR7emVyb30iIHgyPSI3MjUiIHkyPSIke3plcm99IiBzdHJva2U9IiNhNmJiYzgiLz4ke2VudHJpZXMubWFwKChlLGkpPT57Y29uc3QgY2VudGVyPTIxMCtpKjM0MDtyZXR1cm4ga2V5cy5tYXAoKGtleSxqKT0+e2NvbnN0IHg9Y2VudGVyKyhqPzYyOi02Miksdj1OdW1iZXIoZS50b3RhbFtrZXldKXx8MDtyZXR1cm4gYDxyZWN0IHg9IiR7eC0zOH0iIHk9IiR7TWF0aC5taW4oeSh2KSx6ZXJvKX0iIHdpZHRoPSI3NiIgaGVpZ2h0PSIke01hdGguYWJzKHkodiktemVybyl9IiBmaWxsPSIke2NvbG9yW2tleV19IiByeD0iMyI+PHRpdGxlPiR7ZXNjKGUuc2NvcGUrJyDCtyAnK2UubmFtZSsnIMK3ICcrZS5wZXJpb2QrJyDCtyAnK21ldHJpY3Nba2V5XSsnOiAnK2ZtdCh2LGtleSkpfTwvdGl0bGU+PC9yZWN0Pjx0ZXh0IHg9IiR7eH0iIHk9IiR7dj49MD95KHYpLTk6eSh2KSsxOX0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZmlsbD0idmFyKC0tcGxvdHRleHQsIzQyNWM3MCkiPiR7ZXNjKGNvbXBhY3QodixrZXkpKX08L3RleHQ+PHRleHQgeD0iJHt4fSIgeT0iMjUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmb250LWZhbWlseT0iQXJpYWwiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIj4ke2VzYyhtZXRyaWNzW2tleV0pfTwvdGV4dD5gfSkuam9pbignJykrYDx0ZXh0IHg9IiR7Y2VudGVyfSIgeT0iMjgyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LWZhbWlseT0iQXJpYWwiIGZpbGw9InZhcigtLXBsb3R0ZXh0LCM0MjVjNzApIj5TZWxlY2Npw7NuICR7ZS5zY29wZX08L3RleHQ+YH0pLmpvaW4oJycpfTwvc3ZnPjwvZGl2PmA7Cn0KY29uc3QgY29tcGFyZUJlZm9yZVYyMj1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXsKIGNvbXBhcmVCZWZvcmVWMjIoKTsKIGNvbnN0IGVudHJpZXM9WydBJywnQiddLm1hcChzY29wZT0+e2NvbnN0IHM9dmlld1N0YXRlW3Njb3BlXSxyb3dzPXNsaWNlUm93cyhzLmZpbHRlcnMscy5mcm9tLHMudG8pO3JldHVybntzY29wZSxuYW1lOnMubmFtZSxwZXJpb2Q6c2VsZWN0ZWREYXRlVGV4dFY4KHNjb3BlKSx0b3RhbDphZ2cocm93cyksY291bnQ6cm93cy5sZW5ndGh9fSk7CiBjb25zdCBodG1sPWA8ZGl2IGNsYXNzPSJjYXJkIiBpZD0iY29tcGFyaXNvbkNoYXJ0c1YyMiI+PGgyPkNvaW4gSW4geSBXaW4gwrcgQ29tcGFyYWNpw7NuIEEgeSBCPC9oMj48ZGl2IGNsYXNzPSJsYWJlbGVkbGVnZW5kIj48cD5BenVsIG1hcmlubzogQ29pbiBJbiDCtyBUdXJxdWVzYTogV2luPC9wPiR7ZW50cmllcy5tYXAoZT0+YDxwPjxiPiR7ZS5zY29wZX06ICR7ZXNjKGUubmFtZSl9PC9iPiDCtyAke2VzYyhlLnBlcmlvZCl9JHtlLmNvdW50PycnOicgwrcgU2luIHJlZ2lzdHJvcyd9PC9wPmApLmpvaW4oJycpfTwvZGl2PiR7Y29tcGFyaXNvbkNvbWJpbmVkVjIyKGVudHJpZXMpfTxwIGNsYXNzPSJzaWduYWxub3RlIj5Ub3RhbGVzIGVuIENMUCBlbiB1bmEgbWlzbWEgZXNjYWxhLiBQYXJhIHBlcsOtb2RvcyBkZSBkaXN0aW50YSBkdXJhY2nDs24sIHJldmlzYSB0YW1iacOpbiBsb3MgaW5kaWNhZG9yZXMgZGlhcmlvcyBkZSBsYSB0YWJsYS48L3A+PC9kaXY+YDsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5jb21wYXJpc29uTm90ZScpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLGh0bWwpOwp9OwoKY2FjaGVkPWFzeW5jIGZ1bmN0aW9uKCl7CiAkKCcjc3RhdHVzJykudGV4dENvbnRlbnQ9J1JlY3VwZXJhbmRvIGxhIG1hdHJpeiBwcml2YWRh4oCmJzsKIGNvbnN0IHJlc3BvbnNlPWF3YWl0IHJwYygnZ2V0TWF0cml4Jyk7CiBjb25zdCByZXN1bHQ9Y2xlYW5NYXRyaXhWNyh0eXBlb2YgcmVzcG9uc2U9PT0nc3RyaW5nJz9KU09OLnBhcnNlKHJlc3BvbnNlKTpyZXNwb25zZSk7CiBpZighcmVzdWx0LnJvd3M/Lmxlbmd0aCl0aHJvdyBFcnJvcignTGEgbWF0cml6IG5vIGNvbnRpZW5lIHJlZ2lzdHJvcyBhcGxpY2FibGVzLicpO3JldHVybiByZXN1bHQ7Cn07Ci8vIEZpcnN0IGltcG9ydCB1c2VzIHRoZSBzYW1lIGF1dGhlbnRpY2F0ZWQgUlBDIGFuZCBSTFMgYXMgbGF0ZXIgYWRtaW4gdXBkYXRlcy4KJCgnI2xvZ2luRm9ybVYxNScpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywnPGRldGFpbHMgc3R5bGU9Im1hcmdpbi10b3A6MThweCI+PHN1bW1hcnk+QWRtaW5pc3RyYWNpw7NuOiBpbXBvcnRhciBoaXN0w7NyaWNvIGluaWNpYWw8L3N1bW1hcnk+PHA+RXNjcmliZSB1c3VhcmlvIHkgY29udHJhc2XDsWEgZGUgYWRtaW5pc3RyYWNpw7NuIGFycmliYSwgc2VsZWNjaW9uYSBlbCBFeGNlbCBoaXN0w7NyaWNvIGNvbXBsZXRvIHkgcHVsc2EgZXN0ZSBib3TDs24uIFZlcsOhcyBlbCBhdmFuY2UgcG9yIGJsb3F1ZXMuPC9wPjxpbnB1dCBpZD0ic2VlZE1hdHJpeExBIiB0eXBlPSJmaWxlIiBhY2NlcHQ9Ii54bHN4LC5qc29uIj48YnV0dG9uIGlkPSJzZWVkSW1wb3J0TEEiIHR5cGU9ImJ1dHRvbiI+SW1wb3J0YXIgaGlzdMOzcmljbyBpbmljaWFsPC9idXR0b24+PC9kZXRhaWxzPicpOwokKCcjc2VlZEltcG9ydExBJykub25jbGljaz1hc3luYyBmdW5jdGlvbigpewogY29uc3QgbWVzc2FnZT0kKCcjbG9naW5NZXNzYWdlVjE1JyksZmlsZT0kKCcjc2VlZE1hdHJpeExBJykuZmlsZXNbMF07CiBpZighZmlsZSl7bWVzc2FnZS50ZXh0Q29udGVudD0nU2VsZWNjaW9uYSBlbCBFeGNlbCBoaXN0w7NyaWNvIGNvbXBsZXRvIG8gc3UgY29waWEgSlNPTi4nO3JldHVybn0KIHRoaXMuZGlzYWJsZWQ9dHJ1ZTsKIHRyeXsKICBpZighYXBwU2Vzc2lvblYxNSl7CiAgIG1lc3NhZ2UudGV4dENvbnRlbnQ9J1ZhbGlkYW5kbyBhZG1pbmlzdHJhY2nDs27igKYnOwogICBjb25zdCBwYXNzd29yZD0kKCcjcGFzc3dvcmRWMTUnKS52YWx1ZTskKCcjcGFzc3dvcmRWMTUnKS52YWx1ZT0nJzsKICAgYXBwU2Vzc2lvblYxNT1hd2FpdCBkaXJlY3RScGNWMTUoJ2xvZ2luJywkKCcjdXNlcm5hbWVWMTUnKS52YWx1ZSxwYXNzd29yZCk7CiAgfQogIGlmKGFwcFNlc3Npb25WMTUucm9sZSE9PSdhZG1pbicpdGhyb3cgRXJyb3IoJ1NvbG8gYWRtaW5pc3RyYWNpw7NuIHB1ZWRlIGltcG9ydGFyIGVsIGhpc3TDs3JpY28uJyk7CiAgbWVzc2FnZS50ZXh0Q29udGVudD0nVmFsaWRhbmRvIGhpc3TDs3JpY28gaW5pY2lhbOKApic7CiAgY29uc3QgZXhpc3Rpbmc9YXdhaXQgc3VwYWJhc2VSZXF1ZXN0TEEoJy9yZXN0L3YxL2xhX21hdHJpeD9pZD1lcS4xJnNlbGVjdD1yZXZpc2lvbicse30sYXBwU2Vzc2lvblYxNS50b2tlbik7CiAgaWYoZXhpc3RpbmcubGVuZ3RoKXRocm93IEVycm9yKCdZYSBoYXkgdW5hIG1hdHJpei4gQWN0dWFsw616YWxhIGRlc2RlIGVsIGRhc2hib2FyZDsgZWwgaW1wb3J0YWRvciBpbmljaWFsIG5vIHJlZW1wbGF6YSBkYXRvcyBleGlzdGVudGVzLicpOwogIGNvbnN0IGluY29taW5nPWNsZWFuTWF0cml4VjcoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5qc29uJyk/SlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk6YXdhaXQgcmVhZFhsc3goZmlsZSkpOwogIGF3YWl0IHJwYygnaW1wb3J0TWF0cml4JyxKU09OLnN0cmluZ2lmeShpbmNvbWluZyksJ3JlcGxhY2UnLG51bGwpOwogIG1lc3NhZ2UudGV4dENvbnRlbnQ9J0hpc3TDs3JpY28gZ3VhcmRhZG8uIEFicmllbmRvIGRhc2hib2FyZOKApic7YXdhaXQgb3BlblNlc3Npb25WMTUoYXBwU2Vzc2lvblYxNSk7CiB9Y2F0Y2goZXJyb3Ipe21lc3NhZ2UudGV4dENvbnRlbnQ9ZXJyb3IubWVzc2FnZX1maW5hbGx5e3RoaXMuZGlzYWJsZWQ9ZmFsc2V9Cn07CgovLyBQcmVtaW9zIGlzIGNhbm9uaWNhbCBjb2x1bW4gUCAoaW5kZXggMTUpLiBJdCBpcyBzZXBhcmF0ZSBmcm9tIENvaW4gT3V0IGFuZCBUaWNrZXQgT3V0LgpmdW5jdGlvbiBwcml6ZVdlZWtLZXlMQShyb3cpe3JldHVybiByb3dbMF0uc2xpY2UoMCw0KSsnIMK3IFMnK1N0cmluZyh3ZWVrTnVtYmVyVjgocm93WzBdKSkucGFkU3RhcnQoMiwnMCcpO30KZnVuY3Rpb24gcHJpemVTdW1tYXJ5TEEocm93cyl7CiBjb25zdCBtYWNoaW5lcz1uZXcgTWFwKCksd2Vla3M9bmV3IE1hcCgpLGRhdGVzPW5ldyBTZXQoKTtsZXQgcGFpZD0wLGFkanVzdG1lbnRzPTAscmVjb3Jkcz0wOwogZm9yKGNvbnN0IHIgb2Ygcm93cyl7CiAgaWYoZXhjbHVkZWRSZWNvcmRWNyhyKSljb250aW51ZTsKICBjb25zdCBhbW91bnQ9dHlwZW9mIHJbMTVdPT09J251bWJlcicmJk51bWJlci5pc0Zpbml0ZShyWzE1XSk/clsxNV06MDsKICBjb25zdCBrZXk9cHJpemVXZWVrS2V5TEEocik7aWYoIXdlZWtzLmhhcyhrZXkpKXdlZWtzLnNldChrZXkse25hbWU6a2V5LHByaXplOjAscGFpZDowLGFkanVzdG1lbnRzOjAscm93czpbXX0pOwogIGNvbnN0IHc9d2Vla3MuZ2V0KGtleSk7dy5wcml6ZSs9YW1vdW50O3cucGFpZCs9TWF0aC5tYXgoMCxhbW91bnQpO3cuYWRqdXN0bWVudHMrPU1hdGgubWluKDAsYW1vdW50KTt3LnJvd3MucHVzaChyKTtkYXRlcy5hZGQoclswXSk7CiAgcGFpZCs9TWF0aC5tYXgoMCxhbW91bnQpO2FkanVzdG1lbnRzKz1NYXRoLm1pbigwLGFtb3VudCk7aWYoYW1vdW50PjApcmVjb3JkcysrOwogIGlmKCFhbW91bnQpY29udGludWU7CiAgY29uc3QgaWQ9U3RyaW5nKHJbMV0/PycnKS50cmltKCksbWFjaGluZUtleT1pZHx8J19fbWlzc2luZ19pZF9fJzsKICBpZighbWFjaGluZXMuaGFzKG1hY2hpbmVLZXkpKW1hY2hpbmVzLnNldChtYWNoaW5lS2V5LHtpZDppZHx8J1NpbiBpZGVudGlmaWNhY2nDs24nLGlkZW50aWZpZWQ6ISFpZCxwYWlkOjAsYWRqdXN0bWVudHM6MCxuZXQ6MCxyZWNvcmRzOjAsZGF5czpuZXcgU2V0KCksbG9jYXRpb25zOk9iamVjdC5mcm9tRW50cmllcyhbMiwzLDQsNSw3LDgsOV0ubWFwKGs9PltrLG5ldyBTZXQoKV0pKX0pOwogIGNvbnN0IG09bWFjaGluZXMuZ2V0KG1hY2hpbmVLZXkpO20ucGFpZCs9TWF0aC5tYXgoMCxhbW91bnQpO20uYWRqdXN0bWVudHMrPU1hdGgubWluKDAsYW1vdW50KTttLm5ldCs9YW1vdW50OwogIGlmKGFtb3VudD4wKXttLnJlY29yZHMrKzttLmRheXMuYWRkKHJbMF0pO30KICBmb3IoY29uc3QgayBvZiBbMiwzLDQsNSw3LDgsOV0pe2NvbnN0IHZhbHVlPVN0cmluZyhyW2tdPz8nJykudHJpbSgpO2lmKHZhbHVlKW0ubG9jYXRpb25zW2tdLmFkZCh2YWx1ZSk7fQogfQogY29uc3QgbGlzdD1bLi4ubWFjaGluZXMudmFsdWVzKCldLnNvcnQoKGEsYik9PmIucGFpZC1hLnBhaWR8fGEuaWQubG9jYWxlQ29tcGFyZShiLmlkLHVuZGVmaW5lZCx7bnVtZXJpYzp0cnVlfSkpOwogcmV0dXJuIHtwYWlkLGFkanVzdG1lbnRzLG5ldDpwYWlkK2FkanVzdG1lbnRzLHJlY29yZHMsZGF0ZXM6Wy4uLmRhdGVzXS5zb3J0KCksbWFjaGluZXM6bGlzdCxtYWNoaW5lQ291bnQ6bGlzdC5maWx0ZXIobT0+bS5pZGVudGlmaWVkJiZtLnBhaWQ+MCkubGVuZ3RoLHdlZWtzOlsuLi53ZWVrcy52YWx1ZXMoKV0uc29ydCgoYSxiKT0+YS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSl9Owp9CmZ1bmN0aW9uIHByaXplU3RhdGVMQSgpewogaWYoIXZpZXdTdGF0ZS5wcml6ZXMpe2NvbnN0IGtleXM9Wy4uLm5ldyBTZXQoZGF0YS5yb3dzLmZpbHRlcihyPT4hZXhjbHVkZWRSZWNvcmRWNyhyKSkubWFwKHByaXplV2Vla0tleUxBKSldLnNvcnQoKTt2aWV3U3RhdGUucHJpemVzPXt3ZWVrczprZXlzLmxlbmd0aD9ba2V5cy5hdCgtMSldOltdLG1vbnRoOicnLGZpbHRlcnM6e30sc2VhcmNoOicnLG9ubHlQYWlkOnRydWV9O30KIHJldHVybiB2aWV3U3RhdGUucHJpemVzOwp9CmZ1bmN0aW9uIHByaXplV2Vla0xhYmVsTEEoa2V5LHJvd3Mpe2NvbnN0W3ksd109a2V5LnNwbGl0KCcgwrcgUycpO3JldHVybiB3ZWVrTGFiZWxWOCh5LHcscm93cyk7fQpmdW5jdGlvbiBwcml6ZVBlcmlvZFRleHRMQSgpe2NvbnN0IHN0YXRlPXByaXplU3RhdGVMQSgpO3JldHVybiBzdGF0ZS53ZWVrcy5sZW5ndGg/c3RhdGUud2Vla3MubWFwKGs9PnByaXplV2Vla0xhYmVsTEEoayxkYXRhLnJvd3MpKS5qb2luKCcsICcpOidTaW4gc2VtYW5hcyBzZWxlY2Npb25hZGFzJzt9CmZ1bmN0aW9uIHByaXplUmFua2luZ0xBKGxpc3QpewogY29uc3QgZW50cmllcz1saXN0LmZpbHRlcihtPT5tLnBhaWQ+MCkuc2xpY2UoMCwxMCk7aWYoIWVudHJpZXMubGVuZ3RoKXJldHVybiAnPHA+U2luIHByZW1pb3MgcG9zaXRpdm9zIGVuIGVzdGEgc2VsZWNjacOzbi48L3A+JzsKIGNvbnN0IG1heD1NYXRoLm1heCguLi5lbnRyaWVzLm1hcChtPT5tLnBhaWQpKSxoZWlnaHQ9NjUrZW50cmllcy5sZW5ndGgqMzk7CiByZXR1cm4gYDxkaXYgY2xhc3M9ImNoYXJ0c2Nyb2xsIj48c3ZnIHZpZXdCb3g9IjAgMCA3NDAgJHtoZWlnaHR9IiBzdHlsZT0iaGVpZ2h0OiR7aGVpZ2h0fXB4IiByb2xlPSJpbWciIGFyaWEtbGFiZWw9Ik3DoXF1aW5hcyBjb24gbWF5b3JlcyBwcmVtaW9zIHBhZ2Fkb3MiPjx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC1zaXplPSIxMyIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj5QcmVtaW9zIHBvc2l0aXZvcyDCtyBDTFAgwrcgVG9wIDEwPC90ZXh0PiR7ZW50cmllcy5tYXAoKG0saSk9Pntjb25zdCB5PTUyK2kqMzk7cmV0dXJuIGA8dGV4dCB4PSIyMCIgeT0iJHt5KzE1fSIgZm9udC1zaXplPSIxMiIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhtLmlkKX08L3RleHQ+PHJlY3QgeD0iMTgwIiB5PSIke3l9IiB3aWR0aD0iJHttLnBhaWQvbWF4KjM1MH0iIGhlaWdodD0iMjMiIHJ4PSIzIiBmaWxsPSIjMTM4ZjkzIj48dGl0bGU+TcOhcXVpbmEgJHtlc2MobS5pZCl9OiAke2VzYyhmbXQobS5wYWlkLCdwcml6ZScpKX0gQ0xQPC90aXRsZT48L3JlY3Q+PHRleHQgeD0iNTUwIiB5PSIke3krMTZ9IiBmb250LXNpemU9IjEyIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7ZXNjKGNvbXBhY3QobS5wYWlkLCdwcml6ZScpKX08L3RleHQ+YH0pLmpvaW4oJycpfTwvc3ZnPjwvZGl2PmA7Cn0KZnVuY3Rpb24gcHJpemVNYWNoaW5lUm93c0xBKGxpc3QpewogcmV0dXJuIFtbJ03DoXF1aW5hJywnTWFyY2EnLCdQbGF0YWZvcm1hJywnTW9kZWxvJywnQmFuY28nLCdTZWN0b3InLCdTYWzDs24nLCdQb3pvJywnUHJlbWlvcyBwb3NpdGl2b3MgQ0xQJywnQWp1c3RlcyBuZWdhdGl2b3MgQ0xQJywnUHJlbWlvcyBuZXRvcyBDTFAnLCdEw61hcyBjb24gcHJlbWlvcycsJ1JlZ2lzdHJvcyBjb24gcHJlbWlvcyddLC4uLmxpc3QubWFwKG09PlttLmlkLC4uLlsyLDMsNCw5LDUsNyw4XS5tYXAoaz0+Wy4uLm0ubG9jYXRpb25zW2tdXS5qb2luKCcgLyAnKSksbS5wYWlkLG0uYWRqdXN0bWVudHMsbS5uZXQsbS5kYXlzLnNpemUsbS5yZWNvcmRzXSldOwp9CmxldCBjdXJyZW50UHJpemVSZXBvcnRMQT1udWxsOwpmdW5jdGlvbiByZW5kZXJQcml6ZXNMQSgpewogY29uc3Qgc3RhdGU9cHJpemVTdGF0ZUxBKCksYWxsPWRhdGEucm93cy5maWx0ZXIocj0+IWV4Y2x1ZGVkUmVjb3JkVjcocikpLG1vbnRocz1bLi4ubmV3IFNldChhbGwubWFwKHI9PnJbMF0uc2xpY2UoMCw3KSkpXS5zb3J0KCk7CiBjb25zdCB3ZWVrTWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgciBvZiBhbGwpe2NvbnN0IGs9cHJpemVXZWVrS2V5TEEocik7aWYoIXdlZWtNYXAuaGFzKGspKXdlZWtNYXAuc2V0KGssW10pO3dlZWtNYXAuZ2V0KGspLnB1c2gocik7fQogY29uc3QgY2hvaWNlcz1bLi4ud2Vla01hcF0uZmlsdGVyKChbayxyb3dzXSk9PiFzdGF0ZS5tb250aHx8cm93cy5zb21lKHI9PnJbMF0uc3RhcnRzV2l0aChzdGF0ZS5tb250aCkpKS5zb3J0KChbYV0sW2JdKT0+YS5sb2NhbGVDb21wYXJlKGIpKTsKIGNvbnN0IHdlZWtSb3dzPWFsbC5maWx0ZXIocj0+c3RhdGUud2Vla3MuaW5jbHVkZXMocHJpemVXZWVrS2V5TEEocikpKTsKIGNvbnN0IGZpbHRlcmVkPXdlZWtSb3dzLmZpbHRlcihyPT5PYmplY3QuZW50cmllcyhzdGF0ZS5maWx0ZXJzKS5ldmVyeSgoW2ssdmFsdWVdKT0+IXZhbHVlfHxTdHJpbmcocltrXT8/JycpPT09dmFsdWUpKTsKIGNvbnN0IHN1bW1hcnk9cHJpemVTdW1tYXJ5TEEoZmlsdGVyZWQpLHNlYXJjaD1zdGF0ZS5zZWFyY2gudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpOwogY29uc3QgdmlzaWJsZT1zdW1tYXJ5Lm1hY2hpbmVzLmZpbHRlcihtPT4oIXN0YXRlLm9ubHlQYWlkfHxtLnBhaWQ+MCkmJighc2VhcmNofHxbbS5pZCwuLi5PYmplY3QudmFsdWVzKG0ubG9jYXRpb25zKS5mbGF0TWFwKHM9PlsuLi5zXSldLmpvaW4oJyAnKS50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKS5pbmNsdWRlcyhzZWFyY2gpKSk7CiBjdXJyZW50UHJpemVSZXBvcnRMQT17c3VtbWFyeSx2aXNpYmxlLHJvd3M6ZmlsdGVyZWR9O2V4cG9ydFJvd3M9cHJpemVNYWNoaW5lUm93c0xBKHZpc2libGUpOwogZG9jdW1lbnQuYm9keS5kYXRhc2V0LnZpZXc9J1ByZW1pb3Mgc2VtYW5hbGVzJzskKCcjdGl0bGUnKS50ZXh0Q29udGVudD0nUHJlbWlvcyBwYWdhZG9zIHBvciBtw6FxdWluYSc7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNjb250cm9scycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOyQoJyNmaWx0ZXJzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiBjb25zdCBwZXJpb2Q9cHJpemVQZXJpb2RUZXh0TEEoKSxyYW5nZT1zdW1tYXJ5LmRhdGVzLmxlbmd0aD9kaXNwbGF5RGF0ZXNWNShzdW1tYXJ5LmRhdGVzWzBdKSsnIOKGkiAnK2Rpc3BsYXlEYXRlc1Y1KHN1bW1hcnkuZGF0ZXMuYXQoLTEpKTonU2luIHJlZ2lzdHJvcyc7CiBjb25zdCBmaWVsZHM9WzEsOSw1LDcsMiwzXTsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignUHJlbWlvcyBzZW1hbmFsZXMgZGVsIGNhc2lubycsJ0NvbnN1bHRhIGxvcyBpbXBvcnRlcyBkZSBsYSBjb2x1bW5hIFByZW1pb3MgeSBsYXMgbcOhcXVpbmFzIHF1ZSByZWdpc3RyYXJvbiBwYWdvcyBlbiB1bmEgbyB2YXJpYXMgc2VtYW5hcy4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxkaXYgY2xhc3M9ImZpbHRlcmdyaWQiPjxsYWJlbD5NZXMgcGFyYSBidXNjYXIgc2VtYW5hczxzZWxlY3QgaWQ9InByaXplTW9udGhMQSI+PG9wdGlvbiB2YWx1ZT0iIj5Ub2RvcyBsb3MgbWVzZXM8L29wdGlvbj4ke21vbnRocy5tYXAobT0+YDxvcHRpb24gdmFsdWU9IiR7bX0iICR7bT09PXN0YXRlLm1vbnRoPydzZWxlY3RlZCc6Jyd9PiR7ZXNjKGRpc3BsYXlEYXRlc1Y1KG0pKX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPjxkaXY+PGxhYmVsPlNlbWFuYXM8L2xhYmVsPjxkZXRhaWxzIGNsYXNzPSJleGNlbERyb3Bkb3duVjEzIj48c3VtbWFyeT4ke3N0YXRlLndlZWtzLmxlbmd0aH0gc2VtYW5hKHMpIHNlbGVjY2lvbmFkYShzKTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJleGNlbE1lbnVWMTMiIHN0eWxlPSJtaW4td2lkdGg6MzEwcHgiPjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InByaXplQWxsTEEiPlNlbGVjY2lvbmFyIHRvZGFzPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwcml6ZU5vbmVMQSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgc3R5bGU9Im1heC1oZWlnaHQ6MjQwcHg7b3ZlcmZsb3c6YXV0byI+JHtjaG9pY2VzLm1hcCgoW2tleSxyb3dzXSk9Pntjb25zdCBkYXRlcz1bLi4ubmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSldLnNvcnQoKTtyZXR1cm4gYDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1wcml6ZXdlZWs9IiR7a2V5fSIgJHtzdGF0ZS53ZWVrcy5pbmNsdWRlcyhrZXkpPydjaGVja2VkJzonJ30+JHtlc2MocHJpemVXZWVrTGFiZWxMQShrZXkscm93cykpfSDCtyAke2VzYyhkaXNwbGF5RGF0ZXNWNShkYXRlc1swXSkpfSBhICR7ZXNjKGRpc3BsYXlEYXRlc1Y1KGRhdGVzLmF0KC0xKSkpfTwvbGFiZWw+YH0pLmpvaW4oJycpfTwvZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icHJpbWFyeSIgaWQ9InByaXplQXBwbHlMQSI+QXBsaWNhciBzZW1hbmFzPC9idXR0b24+PC9kaXY+PC9kZXRhaWxzPjwvZGl2PiR7ZmllbGRzLm1hcChrPT57Y29uc3Qgb3B0cz1bLi4ubmV3IFNldCh3ZWVrUm93cy5tYXAocj0+U3RyaW5nKHJba10/PycnKSkpXS5maWx0ZXIoQm9vbGVhbikuc29ydCgoYSxiKT0+YS5sb2NhbGVDb21wYXJlKGIsdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSk7cmV0dXJuIGA8bGFiZWw+JHtkaW1zW2tdfTxzZWxlY3QgZGF0YS1wcml6ZWZpbHRlcj0iJHtrfSI+PG9wdGlvbiB2YWx1ZT0iIj5Ub2Rvczwvb3B0aW9uPiR7b3B0cy5tYXAodj0+YDxvcHRpb24gdmFsdWU9IiR7ZXNjKHYpfSIgJHtzdGF0ZS5maWx0ZXJzW2tdPT09dj8nc2VsZWN0ZWQnOicnfT4ke2VzYyh2KX08L29wdGlvbj5gKS5qb2luKCcnKX08L3NlbGVjdD48L2xhYmVsPmB9KS5qb2luKCcnKX08L2Rpdj48cD5QZXLDrW9kbzogJHtlc2MocGVyaW9kKX0gwrcgRmVjaGFzIGNvbiBkYXRvczogJHtlc2MocmFuZ2UpfSDCtyAke3N1bW1hcnkuZGF0ZXMubGVuZ3RofSBkw61hcyByZWdpc3RyYWRvcy48L3A+PHAgY2xhc3M9InNpZ25hbG5vdGUiPkVsIG1lcyBheXVkYSBhIGJ1c2NhciBzZW1hbmFzLiBDYWRhIHNlbWFuYSBpbmNsdXllIHRvZG9zIHN1cyBkw61hcyBkaXNwb25pYmxlcywgaW5jbHVzbyBzaSBjcnV6YSBkZSBtZXMuIExvcyBpbXBvcnRlcyBjb3JyZXNwb25kZW4gYSBsb3MgZGF0b3MgY2FyZ2Fkb3M7IGxhIMO6bHRpbWEgc2VtYW5hIHB1ZWRlIGVzdGFyIGluY29tcGxldGEuPC9wPjxidXR0b24gaWQ9InByaXplUmVzZXRMQSI+TGltcGlhciBmaWx0cm9zIGRlIG3DoXF1aW5hcyB5IHViaWNhY2lvbmVzPC9idXR0b24+PC9zZWN0aW9uPjxkaXYgY2xhc3M9ImtwaXMiPiR7W1snUHJlbWlvcyBwYWdhZG9zIHBvc2l0aXZvcycsZm10KHN1bW1hcnkucGFpZCwncHJpemUnKSsnIENMUCcsJ1N1bWEgZGUgaW1wb3J0ZXMgbWF5b3JlcyBxdWUgY2VybyddLFsnTcOhcXVpbmFzIHF1ZSBwYWdhcm9uJyxmbXQoc3VtbWFyeS5tYWNoaW5lQ291bnQpLCdNw6FxdWluYXMgaWRlbnRpZmljYWRhcyBjb24gcHJlbWlvcyBwb3NpdGl2b3MnXSxbJ0FqdXN0ZXMgbmVnYXRpdm9zJyxmbXQoc3VtbWFyeS5hZGp1c3RtZW50cywncHJpemUnKSsnIENMUCcsJ1JlZ2lzdHJvcyBuZWdhdGl2b3Mgc2VwYXJhZG9zIGRlIGxvcyBwYWdvcyddLFsnUHJlbWlvcyBuZXRvcycsZm10KHN1bW1hcnkubmV0LCdwcml6ZScpKycgQ0xQJywnUHJlbWlvcyBwb3NpdGl2b3MgbcOhcyBhanVzdGVzIG5lZ2F0aXZvcyddXS5tYXAoKFtsYWJlbCx2YWx1ZSxoZWxwXSk9PmA8ZGl2IGNsYXNzPSJjYXJkIGtwaSI+PHNtYWxsPiR7bGFiZWx9PC9zbWFsbD48c3Ryb25nIHN0eWxlPSJmb250LXNpemU6MjRweCI+JHt2YWx1ZX08L3N0cm9uZz48c3Bhbj4ke2hlbHB9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfTwvZGl2PjxkaXYgY2xhc3M9InJlcG9ydGNoYXJ0cyI+PGRpdiBjbGFzcz0iY2FyZCI+PGgyPlByZW1pb3MgbmV0b3MgcG9yIHNlbWFuYTwvaDI+JHtzdW1tYXJ5LndlZWtzLmxlbmd0aD9jaGFydFYyKFt7bmFtZTonUHJlbWlvcyBuZXRvcycscG9pbnRzOnN1bW1hcnkud2Vla3N9XSwncHJpemUnKTonPHA+U2VsZWNjaW9uYSBhbCBtZW5vcyB1bmEgc2VtYW5hLjwvcD4nfTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQiPjxoMj5Nw6FxdWluYXMgY29uIG1heW9yZXMgcHJlbWlvczwvaDI+JHtwcml6ZVJhbmtpbmdMQShzdW1tYXJ5Lm1hY2hpbmVzKX08L2Rpdj48L2Rpdj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPk3DoXF1aW5hcyB5IHByZW1pb3MgwrcgJHt2aXNpYmxlLmxlbmd0aH0gZmlsYXM8L2gyPjxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+PGxhYmVsPkJ1c2NhciBtw6FxdWluYSwgYmFuY28gbyBtYXJjYTxpbnB1dCBpZD0icHJpemVTZWFyY2hMQSIgdmFsdWU9IiR7ZXNjKHN0YXRlLnNlYXJjaCl9IiBwbGFjZWhvbGRlcj0iQnVzY2FyIHkgcHVsc2FyIEVudGVyIj48L2xhYmVsPjxsYWJlbCBzdHlsZT0iZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlciI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icHJpemVPbmx5TEEiICR7c3RhdGUub25seVBhaWQ/J2NoZWNrZWQnOicnfT5Tb2xvIG3DoXF1aW5hcyBjb24gcGFnb3MgcG9zaXRpdm9zPC9sYWJlbD48L2Rpdj48cD4ke3N1bW1hcnkucmVjb3Jkc30gcmVnaXN0cm9zIGNvbiBwcmVtaW9zIHBvc2l0aXZvcy4gU29uIHJlZ2lzdHJvcyBkZSBsYSBtYXRyaXosIG5vIGNhbnRpZGFkIGRlIHByZW1pb3MgaW5kaXZpZHVhbGVzLiBMYXMgdWJpY2FjaW9uZXMgbcO6bHRpcGxlcyBzZSBtdWVzdHJhbiBzZXBhcmFkYXMgcG9yIMKrL8K7LjwvcD48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPiR7ZXhwb3J0Um93c1swXS5tYXAoaD0+YDx0aD4ke2VzYyhoKX08L3RoPmApLmpvaW4oJycpfTwvdHI+PC90aGVhZD48dGJvZHk+JHt2aXNpYmxlLm1hcChtPT5gPHRyPjx0ZD4ke2VzYyhtLmlkKX08L3RkPiR7WzIsMyw0LDksNSw3LDhdLm1hcChrPT5gPHRkPiR7ZXNjKFsuLi5tLmxvY2F0aW9uc1trXV0uam9pbignIC8gJyl8fCfigJQnKX08L3RkPmApLmpvaW4oJycpfTx0ZD4ke2ZtdChtLnBhaWQsJ3ByaXplJyl9PC90ZD48dGQ+JHtmbXQobS5hZGp1c3RtZW50cywncHJpemUnKX08L3RkPjx0ZD4ke2ZtdChtLm5ldCwncHJpemUnKX08L3RkPjx0ZD4ke20uZGF5cy5zaXplfTwvdGQ+PHRkPiR7bS5yZWNvcmRzfTwvdGQ+PC90cj5gKS5qb2luKCcnKXx8Jzx0cj48dGQgY29sc3Bhbj0iMTMiPlNpbiBtw6FxdWluYXMgcGFyYSBlc3RhIHNlbGVjY2nDs24uPC90ZD48L3RyPid9PC90Ym9keT48L3RhYmxlPjwvZGl2Pjwvc2VjdGlvbj48ZGl2IGNsYXNzPSJub3RpY2UiPkZ1ZW50ZTogY29sdW1uYSBQcmVtaW9zIGRlIE1hdHJpeiAoUCkuIE5vIHNlIHN1bWEgVGlja2V0IE91dCBuaSBDb2luIE91dC4gRXN0ZSBpbmZvcm1lIG5vIGlkZW50aWZpY2EgamFja3BvdHMsIHBhZ29zIG1hbnVhbGVzIHUgb3RyYXMgY2xhc2VzIGRlIHByZW1pbyBzaSBlbCBhcmNoaXZvIG5vIHRyYWUgZXNhIGNsYXNpZmljYWNpw7NuLiBFbCB0b3RhbCBpbmNsdXllIGZpbGFzIHNpbiBpZGVudGlmaWNhY2nDs24gZGUgbcOhcXVpbmE7IGFwYXJlY2VuIGNvbW8gwqtTaW4gaWRlbnRpZmljYWNpw7NuwrsgeSBubyBhdW1lbnRhbiBlbCBjb250YWRvciBkZSBtw6FxdWluYXMgaWRlbnRpZmljYWRhcy48L2Rpdj5gOwogJCgnI3ByaXplTW9udGhMQScpLm9uY2hhbmdlPWU9PntzdGF0ZS5tb250aD1lLnRhcmdldC52YWx1ZTtzdGF0ZS53ZWVrcz1bXTtyZW5kZXIoKTt9OwogJCgnI3ByaXplQXBwbHlMQScpLm9uY2xpY2s9KCk9PntzdGF0ZS53ZWVrcz1bLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJpemV3ZWVrXTpjaGVja2VkJyldLm1hcChlPT5lLmRhdGFzZXQucHJpemV3ZWVrKTtyZW5kZXIoKTt9OwogJCgnI3ByaXplQWxsTEEnKS5vbmNsaWNrPSgpPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wcml6ZXdlZWtdJykuZm9yRWFjaChlPT5lLmNoZWNrZWQ9dHJ1ZSk7CiAkKCcjcHJpemVOb25lTEEnKS5vbmNsaWNrPSgpPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wcml6ZXdlZWtdJykuZm9yRWFjaChlPT5lLmNoZWNrZWQ9ZmFsc2UpOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJpemVmaWx0ZXJdJykuZm9yRWFjaChlPT5lLm9uY2hhbmdlPSgpPT57c3RhdGUuZmlsdGVyc1tlLmRhdGFzZXQucHJpemVmaWx0ZXJdPWUudmFsdWU7cmVuZGVyKCk7fSk7CiAkKCcjcHJpemVSZXNldExBJykub25jbGljaz0oKT0+e3N0YXRlLmZpbHRlcnM9e307c3RhdGUuc2VhcmNoPScnO3JlbmRlcigpO307CiAkKCcjcHJpemVTZWFyY2hMQScpLm9uY2hhbmdlPWU9PntzdGF0ZS5zZWFyY2g9ZS50YXJnZXQudmFsdWU7cmVuZGVyKCk7fTsKICQoJyNwcml6ZU9ubHlMQScpLm9uY2hhbmdlPWU9PntzdGF0ZS5vbmx5UGFpZD1lLnRhcmdldC5jaGVja2VkO3JlbmRlcigpO307CiBkZWNvcmF0ZUNoYXJ0c1Y4KCk7Zm9ybWF0VGV4dERhdGVzVjUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpKTsKfQpjb25zdCByZW5kZXJCZWZvcmVQcml6ZXNMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe2lmKGRhdGEmJnRhYj09PSdQcmVtaW9zIHNlbWFuYWxlcycpe2NoYXJ0UG9pbnRzVjQuY2xlYXIoKTtyZW5kZXJQcml6ZXNMQSgpO31lbHNlIHJlbmRlckJlZm9yZVByaXplc0xBKCk7fTsKY29uc3QgZGF0ZVRleHRCZWZvcmVQcml6ZXNMQT1zZWxlY3RlZERhdGVUZXh0Vjg7CnNlbGVjdGVkRGF0ZVRleHRWOD1mdW5jdGlvbihzY29wZSl7cmV0dXJuIHRhYj09PSdQcmVtaW9zIHNlbWFuYWxlcycmJnNjb3BlPT09J2dsb2JhbCc/cHJpemVQZXJpb2RUZXh0TEEoKTpkYXRlVGV4dEJlZm9yZVByaXplc0xBKHNjb3BlKTt9Owpjb25zdCBwcml6ZVRhYkJ1dHRvbkxBPSc8YnV0dG9uIGRhdGEtdGFiPSJQcmVtaW9zIHNlbWFuYWxlcyI+4pmiICZuYnNwOyBQcmVtaW9zIHNlbWFuYWxlczwvYnV0dG9uPic7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9Ik1ldG9kb2xvZ8OtYSJdJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicscHJpemVUYWJCdXR0b25MQSk7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IlByZW1pb3Mgc2VtYW5hbGVzIl0nKS5vbmNsaWNrPSgpPT5hY3RpdmF0ZVRhYlYzKCdQcmVtaW9zIHNlbWFuYWxlcycpOwpjb25zdCBleHBvcnRCZWZvcmVQcml6ZXNMQT0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOwokKCcjdjJleHBvcnQnKS5vbmNsaWNrPWZ1bmN0aW9uKCl7CiBpZih0YWIhPT0nUHJlbWlvcyBzZW1hbmFsZXMnKXJldHVybiBleHBvcnRCZWZvcmVQcml6ZXNMQSgpOwogY29uc3QgcmVwb3J0PWN1cnJlbnRQcml6ZVJlcG9ydExBO2lmKCFyZXBvcnQpcmV0dXJuOwogY29uc3Qgd2Vla3M9W1snU2VtYW5hJywnUHJlbWlvcyBwb3NpdGl2b3MgQ0xQJywnQWp1c3RlcyBuZWdhdGl2b3MgQ0xQJywnUHJlbWlvcyBuZXRvcyBDTFAnXSwuLi5yZXBvcnQuc3VtbWFyeS53ZWVrcy5tYXAodz0+W3ByaXplV2Vla0xhYmVsTEEody5uYW1lLHcucm93cyksdy5wYWlkLHcuYWRqdXN0bWVudHMsdy5wcml6ZV0pXTsKIGNvbnN0IGRldGFpbD1bWydGZWNoYScsJ1NlbWFuYScsJ03DoXF1aW5hJywnTWFyY2EnLCdCYW5jbycsJ1NlY3RvcicsJ1NhbMOzbicsJ1ByZW1pb3MgQ0xQJ10sLi4ucmVwb3J0LnJvd3MuZmlsdGVyKHI9PnR5cGVvZiByWzE1XT09PSdudW1iZXInJiZyWzE1XSE9PTApLm1hcChyPT5bZGlzcGxheURhdGVzVjUoclswXSkscHJpemVXZWVrTGFiZWxMQShwcml6ZVdlZWtLZXlMQShyKSxbcl0pLHJbMV0/PydTaW4gaWRlbnRpZmljYWNpw7NuJyxyWzJdPz8nJyxyWzldPz8nJyxyWzVdPz8nJyxyWzddPz8nJyxyWzE1XV0pXTsKIGNvbnN0IGNvbnN1bHRhdGlvbj1bWydQYXLDoW1ldHJvJywnVmFsb3InXSxbJ0luZm9ybWUnLCdQcmVtaW9zIHNlbWFuYWxlcyddLFsnU2VtYW5hcycscHJpemVQZXJpb2RUZXh0TEEoKV0sWydGaWx0cm9zJyxKU09OLnN0cmluZ2lmeShwcml6ZVN0YXRlTEEoKS5maWx0ZXJzKV0sWydGdWVudGUnLCdQcmVtaW9zIGRlIE1hdHJpeiwgY29sdW1uYSBQLiBObyBlcXVpdmFsZSBhIGNhbnRpZGFkIGRlIHByZW1pb3MgaW5kaXZpZHVhbGVzLiddLFsnUHJlbWlvcyBwb3NpdGl2b3MgQ0xQJyxyZXBvcnQuc3VtbWFyeS5wYWlkXSxbJ0FqdXN0ZXMgbmVnYXRpdm9zIENMUCcscmVwb3J0LnN1bW1hcnkuYWRqdXN0bWVudHNdLFsnUHJlbWlvcyBuZXRvcyBDTFAnLHJlcG9ydC5zdW1tYXJ5Lm5ldF0sWydCw7pzcXVlZGEgZGVsIGRldGFsbGUnLHByaXplU3RhdGVMQSgpLnNlYXJjaF0sWydTb2xvIG3DoXF1aW5hcyBjb24gcGFnb3MgcG9zaXRpdm9zJyxwcml6ZVN0YXRlTEEoKS5vbmx5UGFpZD8nU8OtJzonTm8nXV07CiBkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J01hcXVpbmFzJyxyb3dzOnByaXplTWFjaGluZVJvd3NMQShyZXBvcnQudmlzaWJsZSl9LHtuYW1lOidTZW1hbmFzJyxyb3dzOndlZWtzfSx7bmFtZTonRGV0YWxsZSBkaWFyaW8nLHJvd3M6ZGV0YWlsfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6Y29uc3VsdGF0aW9ufV0pLCdMQS1QcmVtaW9zLXNlbWFuYWxlcy54bHN4Jyk7Cn07CgovLyBIaWRlIGNvbnRyb2xzLCByZXRhaW4gc2V0dGluZ3MgYW5kIGRhdGEuIFNhdmVkIFBvem8gZmlsdGVycyBtdXN0IG5vdCByZW1haW4gYWN0aXZlIGludmlzaWJseS4KZnVuY3Rpb24gY2xlYXJQb3pvRmlsdGVyc0xBKCl7CiBmb3IoY29uc3Qgc3RhdGUgb2YgT2JqZWN0LnZhbHVlcyh2aWV3U3RhdGUpKXtpZihzdGF0ZSYmdHlwZW9mIHN0YXRlPT09J29iamVjdCcmJnN0YXRlLmZpbHRlcnMpZGVsZXRlIHN0YXRlLmZpbHRlcnNbJzgnXTt9CiBjb25zdCBsZWdhY3k9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Y4Jyk7aWYobGVnYWN5KWZvcihjb25zdCBvcHRpb24gb2YgbGVnYWN5Lm9wdGlvbnMpb3B0aW9uLnNlbGVjdGVkPWZhbHNlOwp9CmNvbnN0IGZpbHRlckZpZWxkc0JlZm9yZUNvbXBhY3RMQT1maWx0ZXJGaWVsZHM7CmZpbHRlckZpZWxkcz1mdW5jdGlvbihzdGF0ZSxwcmVmaXgsa2V5cz1PYmplY3Qua2V5cyhkaW1zKSl7cmV0dXJuIGZpbHRlckZpZWxkc0JlZm9yZUNvbXBhY3RMQShzdGF0ZSxwcmVmaXgsa2V5cy5maWx0ZXIoaz0+TnVtYmVyKGspIT09OCkpO307CmZ1bmN0aW9uIGZvbGRDb250cm9sTEEobm9kZSxrZXksdGV4dCl7CiBpZighbm9kZSlyZXR1cm4gbnVsbDsKIHZpZXdTdGF0ZS5jb21wYWN0UGFuZWxzPz89e307CiBsZXQgZm9sZD1ub2RlLnBhcmVudEVsZW1lbnQ/LmRhdGFzZXQ/LmZvbGRLZXk9PT1rZXk/bm9kZS5wYXJlbnRFbGVtZW50Om51bGw7CiBpZighZm9sZCl7CiAgZm9sZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7Zm9sZC5jbGFzc05hbWU9J2NvbXBhY3RGb2xkTEEnO2ZvbGQuZGF0YXNldC5mb2xkS2V5PWtleTsKICBjb25zdCBzdW1tYXJ5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtmb2xkLmFwcGVuZENoaWxkKHN1bW1hcnkpOwogIG5vZGUuYmVmb3JlKGZvbGQpO2ZvbGQuYXBwZW5kQ2hpbGQobm9kZSk7Zm9sZC5vcGVuPSEhdmlld1N0YXRlLmNvbXBhY3RQYW5lbHNba2V5XTsKICBmb2xkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvZ2dsZScsKCk9Pnt2aWV3U3RhdGUuY29tcGFjdFBhbmVscz8/PXt9O3ZpZXdTdGF0ZS5jb21wYWN0UGFuZWxzW2tleV09Zm9sZC5vcGVuO30pOwogfQogY29uc3Qgc3VtbWFyeT1mb2xkLnF1ZXJ5U2VsZWN0b3IoJ3N1bW1hcnknKTtzdW1tYXJ5LnRleHRDb250ZW50PXRleHQ7c3VtbWFyeS50aXRsZT10ZXh0O3JldHVybiBmb2xkOwp9CmZ1bmN0aW9uIGNvbXBhY3RDb250cm9sc0xBKCl7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXI9IjgiXSxbZGF0YS1wcml6ZWZpbHRlcj0iOCJdLCNmOCcpLmZvckVhY2goZWw9PmVsLmNsb3Nlc3QoJ2xhYmVsJyk/LnJlbW92ZSgpKTsKIGNvbnN0IGdsb2JhbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpOwogaWYoZ2xvYmFsKXsKICBjb25zdCB2aXNpYmxlPWdsb2JhbC5zdHlsZS5kaXNwbGF5IT09J25vbmUnJiYhWydDb21wYXJhdGl2b3MnLCdNZXRvZG9sb2fDrWEnLCdQcmVtaW9zIHNlbWFuYWxlcyddLmluY2x1ZGVzKHRhYik7CiAgY29uc3QgZm9sZD1mb2xkQ29udHJvbExBKGdsb2JhbCwnZGF0ZXMtZ2xvYmFsJywnRmVjaGFzIMK3ICcrc2VsZWN0ZWREYXRlVGV4dFY4KCdnbG9iYWwnKSsnIMK3IGFicmlyIHBhcmEgY2FtYmlhcicpOwogIGZvbGQuc3R5bGUuZGlzcGxheT12aXNpYmxlPydibG9jayc6J25vbmUnOwogfQogaWYodGFiPT09J1JhdGlvcycpewogIGNvbnN0IGxpbWl0cz1yYXRpb0xpbWl0c1Y2KCk7Zm9sZENvbnRyb2xMQShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHJhZmZpY1NldHRpbmdzJyksJ3JhdGlvLXNldHRpbmdzJywnQ29uZmlndXJhciBzZW3DoWZvcm8gZGUgcmF0aW9zIMK3IFJvam8gPCAnK2xpbWl0cy5yZWQrJ8OXIMK3IFZlcmRlIOKJpSAnK2xpbWl0cy5ncmVlbisnw5cnKTsKIH0KIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKWZvcihjb25zdCBzY29wZSBvZiBbJ0EnLCdCJ10pewogIGNvbnN0IHBhbmVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaWRlJytzY29wZSk7aWYoIXBhbmVsKWNvbnRpbnVlOwogIGNvbnN0IGRhdGVzPXBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJlRGF0ZXMnKSxjYWxlbmRhcj1wYW5lbC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXJQYW5lbCcpOwogIGNvbnN0IGZvbGQ9Zm9sZENvbnRyb2xMQShkYXRlcywnZGF0ZXMtJytzY29wZSwnRmVjaGFzICcrc2NvcGUrJyDCtyAnK3NlbGVjdGVkRGF0ZVRleHRWOChzY29wZSkpO2lmKGNhbGVuZGFyKWZvbGQuYXBwZW5kQ2hpbGQoY2FsZW5kYXIpOwogfQogaWYodGFiPT09J1ByZW1pb3Mgc2VtYW5hbGVzJylmb2xkQ29udHJvbExBKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IHNlY3Rpb24uY2FyZCcpLCdwcml6ZS1maWx0ZXJzJywnRmlsdHJhciBzZW1hbmFzIHkgbcOhcXVpbmFzIMK3ICcrcHJpemVQZXJpb2RUZXh0TEEoKSk7Cn0KY29uc3QgcmVuZGVyQmVmb3JlQ29tcGFjdExBPXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7Y2xlYXJQb3pvRmlsdGVyc0xBKCk7cmVuZGVyQmVmb3JlQ29tcGFjdExBKCk7aWYoZGF0YSljb21wYWN0Q29udHJvbHNMQSgpO307Cgpjb25zdCBtb250aHNTcGFuaXNoTEE9WydFbmVybycsJ0ZlYnJlcm8nLCdNYXJ6bycsJ0FicmlsJywnTWF5bycsJ0p1bmlvJywnSnVsaW8nLCdBZ29zdG8nLCdTZXB0aWVtYnJlJywnT2N0dWJyZScsJ05vdmllbWJyZScsJ0RpY2llbWJyZSddOwpmdW5jdGlvbiBkYXRlUGFydHNTcGFuaXNoTEEodmFsdWUpewogY29uc3QgbWF0Y2g9L14oXGR7NH0pLShcZHsyfSktKFxkezJ9KSQvLmV4ZWModmFsdWV8fCcnKTtpZighbWF0Y2gpcmV0dXJuIG51bGw7CiBjb25zdCB5ZWFyPU51bWJlcihtYXRjaFsxXSksbW9udGg9TnVtYmVyKG1hdGNoWzJdKS0xLGRheT1OdW1iZXIobWF0Y2hbM10pLGRhdGU9bmV3IERhdGUoRGF0ZS5VVEMoeWVhcixtb250aCxkYXkpKTsKIHJldHVybiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk9PT15ZWFyJiZkYXRlLmdldFVUQ01vbnRoKCk9PT1tb250aCYmZGF0ZS5nZXRVVENEYXRlKCk9PT1kYXk/e3llYXIsbW9udGgsZGF5fTpudWxsOwp9CmZ1bmN0aW9uIGRhdGVJc29TcGFuaXNoTEEoeWVhcixtb250aCxkYXkpe3JldHVybiBTdHJpbmcoeWVhcikucGFkU3RhcnQoNCwnMCcpKyctJytTdHJpbmcobW9udGgrMSkucGFkU3RhcnQoMiwnMCcpKyctJytTdHJpbmcoZGF5KS5wYWRTdGFydCgyLCcwJyk7fQpmdW5jdGlvbiBkYXRlTGFiZWxTcGFuaXNoTEEodmFsdWUpe2NvbnN0IGQ9ZGF0ZVBhcnRzU3BhbmlzaExBKHZhbHVlKTtyZXR1cm4gZD9TdHJpbmcoZC5kYXkpLnBhZFN0YXJ0KDIsJzAnKSsnICcrbW9udGhzU3BhbmlzaExBW2QubW9udGhdLnRvTG93ZXJDYXNlKCkrJyAnK2QueWVhcjonU2VsZWNjaW9uYXIgZmVjaGEnO30KZnVuY3Rpb24gZGF0ZUdyaWRTcGFuaXNoTEEoeWVhcixtb250aCl7CiBjb25zdCBvZmZzZXQ9KG5ldyBEYXRlKERhdGUuVVRDKHllYXIsbW9udGgsMSkpLmdldFVUQ0RheSgpKzYpJTcsZGF5cz1uZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLG1vbnRoKzEsMCkpLmdldFVUQ0RhdGUoKTsKIHJldHVybiBbLi4uQXJyYXkob2Zmc2V0KS5maWxsKG51bGwpLC4uLkFycmF5LmZyb20oe2xlbmd0aDpkYXlzfSwoXyxpKT0+ZGF0ZUlzb1NwYW5pc2hMQSh5ZWFyLG1vbnRoLGkrMSkpXTsKfQpsZXQgc3BhbmlzaENhbGVuZGFyTEE9bnVsbCxzcGFuaXNoQ2FsZW5kYXJDb3VudGVyTEE9MDsKZnVuY3Rpb24gY2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmb2N1cz10cnVlKXsKIGlmKCFzcGFuaXNoQ2FsZW5kYXJMQSlyZXR1cm47Y29uc3Qge3BvcHVwLHRyaWdnZXJ9PXNwYW5pc2hDYWxlbmRhckxBO3NwYW5pc2hDYWxlbmRhckxBPW51bGw7cG9wdXAucmVtb3ZlKCk7dHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCdmYWxzZScpO2lmKGZvY3VzJiZ0cmlnZ2VyLmlzQ29ubmVjdGVkKXRyaWdnZXIuZm9jdXMoKTsKfQpmdW5jdGlvbiBzaG93U3BhbmlzaENhbGVuZGFyTEEoaW5wdXQsdHJpZ2dlcil7CiBjbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKTtjb25zdCBub3c9bmV3IERhdGUoKSxpbml0aWFsPWRhdGVQYXJ0c1NwYW5pc2hMQShpbnB1dC52YWx1ZSl8fHt5ZWFyOm5vdy5nZXRGdWxsWWVhcigpLG1vbnRoOm5vdy5nZXRNb250aCgpfTsKIGNvbnN0IHBvcHVwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3BvcHVwLmNsYXNzTmFtZT0nc3BhbmlzaENhbGVuZGFyTEEnO3BvcHVwLmxhbmc9J2VzLUNMJztwb3B1cC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdkaWFsb2cnKTtwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdTZWxlY2Npb25hciBmZWNoYScpO3BvcHVwLmlkPSdzcGFuaXNoLWNhbGVuZGFyLWxhJzsKIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXApO3NwYW5pc2hDYWxlbmRhckxBPXtwb3B1cCxpbnB1dCx0cmlnZ2VyLHllYXI6aW5pdGlhbC55ZWFyLG1vbnRoOmluaXRpYWwubW9udGh9O3RyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywndHJ1ZScpOwogZnVuY3Rpb24gc2VsZWN0KHZhbHVlKXsKICBpbnB1dC52YWx1ZT12YWx1ZTt0cmlnZ2VyLnRleHRDb250ZW50PWRhdGVMYWJlbFNwYW5pc2hMQSh2YWx1ZSk7Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQSgpOwogIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcse2J1YmJsZXM6dHJ1ZX0pKTtpbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJyx7YnViYmxlczp0cnVlfSkpOwogfQogZnVuY3Rpb24gcGFpbnQoKXsKICBjb25zdCBzdGF0ZT1zcGFuaXNoQ2FsZW5kYXJMQTtpZighc3RhdGUpcmV0dXJuO2NvbnN0IHt5ZWFyLG1vbnRofT1zdGF0ZTsKICBjb25zdCBzZWxlY3RlZD1pbnB1dC52YWx1ZSx0b2RheT1kYXRlSXNvU3BhbmlzaExBKG5vdy5nZXRGdWxsWWVhcigpLG5vdy5nZXRNb250aCgpLG5vdy5nZXREYXRlKCkpOwogIGNvbnN0IG1pblllYXI9TWF0aC5taW4oMTkwMCx5ZWFyKSxtYXhZZWFyPU1hdGgubWF4KDIxMDAseWVhcik7CiAgcG9wdXAuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJzcGFuaXNoQ2FsSGVhZGluZ0xBIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWxwcmV2IGFyaWEtbGFiZWw9Ik1lcyBhbnRlcmlvciI+4oC5PC9idXR0b24+PHNlbGVjdCBkYXRhLWNhbG1vbnRoLWVzIGFyaWEtbGFiZWw9Ik1lcyI+JHttb250aHNTcGFuaXNoTEEubWFwKChuYW1lLGkpPT5gPG9wdGlvbiB2YWx1ZT0iJHtpfSIgJHtpPT09bW9udGg/J3NlbGVjdGVkJzonJ30+JHtuYW1lfTwvb3B0aW9uPmApLmpvaW4oJycpfTwvc2VsZWN0PjxzZWxlY3QgZGF0YS1jYWx5ZWFyLWVzIGFyaWEtbGFiZWw9IkHDsW8iPiR7QXJyYXkuZnJvbSh7bGVuZ3RoOm1heFllYXItbWluWWVhcisxfSwoXyxpKT0+bWluWWVhcitpKS5tYXAoeT0+YDxvcHRpb24gJHt5PT09eWVhcj8nc2VsZWN0ZWQnOicnfT4ke3l9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FsbmV4dCBhcmlhLWxhYmVsPSJNZXMgc2lndWllbnRlIj7igLo8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJzcGFuaXNoQ2FsRGF5c0xBIj4ke1snTHVuJywnTWFyJywnTWnDqScsJ0p1ZScsJ1ZpZScsJ1PDoWInLCdEb20nXS5tYXAoZD0+YDxzcGFuPiR7ZH08L3NwYW4+YCkuam9pbignJyl9JHtkYXRlR3JpZFNwYW5pc2hMQSh5ZWFyLG1vbnRoKS5tYXAoaXNvPT5pc28/YDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNhbGRheS1lcz0iJHtpc299IiAke2lucHV0Lm1pbiYmaXNvPGlucHV0Lm1pbnx8aW5wdXQubWF4JiZpc28+aW5wdXQubWF4PydkaXNhYmxlZCc6Jyd9ICR7aXNvPT09c2VsZWN0ZWQ/J2FyaWEtY3VycmVudD0iZGF0ZSInOicnfSB0aXRsZT0iJHtkYXRlTGFiZWxTcGFuaXNoTEEoaXNvKX0iIGNsYXNzPSIke2lzbz09PXNlbGVjdGVkPydzZWxlY3RlZCAnOicnfSR7aXNvPT09dG9kYXk/J3RvZGF5JzonJ30iPiR7TnVtYmVyKGlzby5zbGljZSgtMikpfTwvYnV0dG9uPmA6JzxzcGFuPjwvc3Bhbj4nKS5qb2luKCcnKX08L2Rpdj48ZGl2IGNsYXNzPSJzcGFuaXNoQ2FsQWN0aW9uc0xBIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWx0b2RheS1lcz5Ib3k8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1jYWxjbGVhci1lcz5MaW1waWFyPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtY2FsY2xvc2UtZXM+Q2VycmFyPC9idXR0b24+PC9kaXY+YDsKICBwb3B1cC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxwcmV2XScpLm9uY2xpY2s9KCk9PntzdGF0ZS5tb250aC0tO2lmKHN0YXRlLm1vbnRoPDApe3N0YXRlLm1vbnRoPTExO3N0YXRlLnllYXItLTt9cGFpbnQoKTt9OwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbG5leHRdJykub25jbGljaz0oKT0+e3N0YXRlLm1vbnRoKys7aWYoc3RhdGUubW9udGg+MTEpe3N0YXRlLm1vbnRoPTA7c3RhdGUueWVhcisrO31wYWludCgpO307CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsbW9udGgtZXNdJykub25jaGFuZ2U9ZT0+e3N0YXRlLm1vbnRoPU51bWJlcihlLnRhcmdldC52YWx1ZSk7cGFpbnQoKTt9OwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbHllYXItZXNdJykub25jaGFuZ2U9ZT0+e3N0YXRlLnllYXI9TnVtYmVyKGUudGFyZ2V0LnZhbHVlKTtwYWludCgpO307CiAgcG9wdXAucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2FsZGF5LWVzXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24ub25jbGljaz0oKT0+c2VsZWN0KGJ1dHRvbi5kYXRhc2V0LmNhbGRheUVzKSk7CiAgcG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsdG9kYXktZXNdJykub25jbGljaz0oKT0+e2lmKGlucHV0Lm1pbiYmdG9kYXk8aW5wdXQubWlufHxpbnB1dC5tYXgmJnRvZGF5PmlucHV0Lm1heClyZXR1cm47c2VsZWN0KHRvZGF5KTt9OwogIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbGNsZWFyLWVzXScpLm9uY2xpY2s9KCk9PnNlbGVjdCgnJyk7cG9wdXAucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsY2xvc2UtZXNdJykub25jbGljaz0oKT0+Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQSgpOwogIGNvbnN0IHJlY3Q9dHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtwb3B1cC5zdHlsZS5sZWZ0PU1hdGgubWF4KDgsTWF0aC5taW4ocmVjdC5sZWZ0LHdpbmRvdy5pbm5lcldpZHRoLTMyOCkpKydweCc7cG9wdXAuc3R5bGUudG9wPU1hdGgubWF4KDgsTWF0aC5taW4ocmVjdC5ib3R0b20rNix3aW5kb3cuaW5uZXJIZWlnaHQtcG9wdXAub2Zmc2V0SGVpZ2h0LTgpKSsncHgnOwogfQogcGFpbnQoKTsocG9wdXAucXVlcnlTZWxlY3RvcignW2FyaWEtY3VycmVudD0iZGF0ZSJdJyl8fHBvcHVwLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhbGRheS1lc106bm90KDpkaXNhYmxlZCknKSk/LmZvY3VzKCk7Cn0KZnVuY3Rpb24gZGVjb3JhdGVTcGFuaXNoRGF0ZXNMQSgpewogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmc9J2VzLUNMJzsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImRhdGUiXScpLmZvckVhY2goaW5wdXQ9PnsKICBpbnB1dC5sYW5nPSdlcy1DTCc7bGV0IHRyaWdnZXI9aW5wdXQuX3NwYW5pc2hUcmlnZ2VyTEE7CiAgaWYoIXRyaWdnZXJ8fCF0cmlnZ2VyLmlzQ29ubmVjdGVkKXsKICAgdHJpZ2dlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTt0cmlnZ2VyLnR5cGU9J2J1dHRvbic7dHJpZ2dlci5jbGFzc05hbWU9J3NwYW5pc2hEYXRlVHJpZ2dlckxBJzt0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1oYXNwb3B1cCcsJ2RpYWxvZycpO3RyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywnZmFsc2UnKTsKICAgdHJpZ2dlci5pZD0nZGF0ZS10cmlnZ2VyLWxhLScrKCsrc3BhbmlzaENhbGVuZGFyQ291bnRlckxBKTt0cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsKGlucHV0LmNsb3Nlc3QoJ2xhYmVsJyk/LnRleHRDb250ZW50LnRyaW0oKXx8J0ZlY2hhJykrJzogYWJyaXIgY2FsZW5kYXJpbyBlbiBlc3Bhw7FvbCcpOwogICBpbnB1dC5oaWRkZW49dHJ1ZTtpbnB1dC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ25vbmUnLCdpbXBvcnRhbnQnKTtpbnB1dC5hZnRlcih0cmlnZ2VyKTtpbnB1dC5fc3BhbmlzaFRyaWdnZXJMQT10cmlnZ2VyOwogICB0cmlnZ2VyLm9uY2xpY2s9ZXZlbnQ9PntldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2lmKHNwYW5pc2hDYWxlbmRhckxBPy5pbnB1dD09PWlucHV0KWNsb3NlU3BhbmlzaENhbGVuZGFyTEEoKTtlbHNlIHNob3dTcGFuaXNoQ2FsZW5kYXJMQShpbnB1dCx0cmlnZ2VyKTt9OwogIH0KICB0cmlnZ2VyLnRleHRDb250ZW50PWRhdGVMYWJlbFNwYW5pc2hMQShpbnB1dC52YWx1ZSk7CiB9KTsKfQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZXZlbnQ9PntpZihzcGFuaXNoQ2FsZW5kYXJMQSYmIXNwYW5pc2hDYWxlbmRhckxBLnBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkmJiFzcGFuaXNoQ2FsZW5kYXJMQS50cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpY2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSk7fSk7CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57aWYoZXZlbnQua2V5PT09J0VzY2FwZScmJnNwYW5pc2hDYWxlbmRhckxBKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2Nsb3NlU3BhbmlzaENhbGVuZGFyTEEoKTt9fSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCgpPT5jbG9zZVNwYW5pc2hDYWxlbmRhckxBKGZhbHNlKSk7CmNvbnN0IHJlbmRlckJlZm9yZVNwYW5pc2hMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe2Nsb3NlU3BhbmlzaENhbGVuZGFyTEEoZmFsc2UpO3JlbmRlckJlZm9yZVNwYW5pc2hMQSgpO2lmKGRhdGEpZGVjb3JhdGVTcGFuaXNoRGF0ZXNMQSgpO307CgpmdW5jdGlvbiBkYXRlRXh0ZW50TEEocm93cyl7bGV0IGZpcnN0PScnLGxhc3Q9Jyc7Y29uc3QgZGF5cz1uZXcgU2V0KCk7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgZD1yWzBdO2lmKCFmaXJzdHx8ZDxmaXJzdClmaXJzdD1kO2lmKGQ+bGFzdClsYXN0PWQ7ZGF5cy5hZGQoZCk7fXJldHVybntmaXJzdCxsYXN0LGRheXN9O30KZnVuY3Rpb24gc2hpZnREYXRlTEEoaXNvLGRheXMpe2NvbnN0IGQ9bmV3IERhdGUoaXNvKydUMDA6MDA6MDBaJyk7ZC5zZXRVVENEYXRlKGQuZ2V0VVRDRGF0ZSgpK2RheXMpO3JldHVybiBkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCk7fQpmdW5jdGlvbiBhbGVydFdpbmRvd3NMQShlbmQsZGF5cyl7cmV0dXJuIHtmcm9tOnNoaWZ0RGF0ZUxBKGVuZCwxLWRheXMpLHRvOmVuZCxwcmV2aW91c0Zyb206c2hpZnREYXRlTEEoZW5kLDEtZGF5cyoyKSxwcmV2aW91c1RvOnNoaWZ0RGF0ZUxBKGVuZCwtZGF5cyl9O30KZnVuY3Rpb24gYnVpbGRBbGVydHNMQShyb3dzLHNldHRpbmdzKXsKIGNvbnN0IHdpbmRvd3M9YWxlcnRXaW5kb3dzTEEoc2V0dGluZ3MuZW5kLHNldHRpbmdzLmRheXMpLG1hcD1uZXcgTWFwKCksY3VycmVudERhdGVzPW5ldyBTZXQoKSxwcmV2aW91c0RhdGVzPW5ldyBTZXQoKTsKIGZvcihjb25zdCByIG9mIHJvd3MpewogIGlmKGV4Y2x1ZGVkUmVjb3JkVjcocil8fCFPYmplY3QuZW50cmllcyhzZXR0aW5ncy5maWx0ZXJzfHx7fSkuZXZlcnkoKFtrLHZhbHVlc10pPT5OdW1iZXIoayk9PT04fHwhdmFsdWVzLmxlbmd0aHx8dmFsdWVzLmluY2x1ZGVzKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpKWNvbnRpbnVlOwogIGNvbnN0IGN1cnJlbnQ9clswXT49d2luZG93cy5mcm9tJiZyWzBdPD13aW5kb3dzLnRvLHByZXZpb3VzPXJbMF0+PXdpbmRvd3MucHJldmlvdXNGcm9tJiZyWzBdPD13aW5kb3dzLnByZXZpb3VzVG87CiAgaWYoIWN1cnJlbnQmJiFwcmV2aW91cyljb250aW51ZTtjb25zdCBrZXk9U3RyaW5nKHJbc2V0dGluZ3MuZ3JvdXBdPz8nU2luIGlkZW50aWZpY2FjacOzbicpO2lmKCFtYXAuaGFzKGtleSkpbWFwLnNldChrZXkse25hbWU6a2V5LGN1cnJlbnQ6W10scHJldmlvdXM6W119KTsKICBtYXAuZ2V0KGtleSlbY3VycmVudD8nY3VycmVudCc6J3ByZXZpb3VzJ10ucHVzaChyKTsoY3VycmVudD9jdXJyZW50RGF0ZXM6cHJldmlvdXNEYXRlcykuYWRkKHJbMF0pOwogfQogY29uc3QgZW50cmllcz1bLi4ubWFwLnZhbHVlcygpXS5tYXAoZz0+ewogIGNvbnN0IGE9YWdnKGcucHJldmlvdXMpLGI9YWdnKGcuY3VycmVudCksZGF5c0E9bmV3IFNldChnLnByZXZpb3VzLm1hcChyPT5yWzBdKSkuc2l6ZSxkYXlzQj1uZXcgU2V0KGcuY3VycmVudC5tYXAocj0+clswXSkpLnNpemUsb2xkPWFbc2V0dGluZ3MubWV0cmljXSx2YWx1ZT1iW3NldHRpbmdzLm1ldHJpY107CiAgbGV0IHN0YXR1cz0nb2snLHJlYXNvbj0nU2luIGNhw61kYSBzdXBlcmlvciBhbCB1bWJyYWwnLGNoYW5nZT1udWxsOwogIGlmKCFnLmN1cnJlbnQubGVuZ3RoKXtzdGF0dXM9J2luZm8nO3JlYXNvbj0nU2luIHJlZ2lzdHJvcyBhY3R1YWxlcyc7fQogIGVsc2UgaWYoZGF5c0E8c2V0dGluZ3MubWluRGF5c3x8ZGF5c0I8c2V0dGluZ3MubWluRGF5cyl7c3RhdHVzPSdpbmZvJztyZWFzb249J0NvYmVydHVyYSBpbnN1ZmljaWVudGUgcGFyYSBjb21wYXJhcic7fQogIGVsc2UgaWYob2xkPT1udWxsfHxvbGQ8PTApe3N0YXR1cz0naW5mbyc7cmVhc29uPSdTaW4gYmFzZSBwb3NpdGl2YSBjb21wYXJhYmxlJzt9CiAgZWxzZSB7Y2hhbmdlPSh2YWx1ZS1vbGQpL01hdGguYWJzKG9sZCkqMTAwO2lmKGNoYW5nZTw9LXNldHRpbmdzLnRocmVzaG9sZCl7c3RhdHVzPSdkcm9wJztyZWFzb249J0Nhw61kYSBkZSAnK01hdGguYWJzKGNoYW5nZSkudG9GaXhlZCgxKS5yZXBsYWNlKCcuJywnLCcpKyclJzt9fQogIGlmKHNldHRpbmdzLm1ldHJpYz09PSd3ZCcmJnZhbHVlPDAmJmcuY3VycmVudC5sZW5ndGgpe3N0YXR1cz0nZHJvcCc7cmVhc29uPSdXaW4gcG9yIG3DoXF1aW5hLWTDrWEgbmVnYXRpdm8nKyhjaGFuZ2U9PW51bGw/JyDCtyBzaW4gdmFyaWFjacOzbiBjb21wYXJhYmxlJzonJyk7fQogIHJldHVybiB7Li4uZyxvbGQsdmFsdWUsZGF5c0EsZGF5c0IsY2hhbmdlLHN0YXR1cyxyZWFzb24sbWFjaGluZURheXNBOmEuZGF5cyxtYWNoaW5lRGF5c0I6Yi5kYXlzfTsKIH0pLnNvcnQoKGEsYik9PihhLnN0YXR1cz09PSdkcm9wJz8wOmEuc3RhdHVzPT09J2luZm8nPzE6MiktKGIuc3RhdHVzPT09J2Ryb3AnPzA6Yi5zdGF0dXM9PT0naW5mbyc/MToyKXx8KGEuY2hhbmdlPz8wKS0oYi5jaGFuZ2U/PzApfHxhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTsKIHJldHVybnt3aW5kb3dzLGVudHJpZXMsY3VycmVudERheXM6Y3VycmVudERhdGVzLnNpemUscHJldmlvdXNEYXlzOnByZXZpb3VzRGF0ZXMuc2l6ZX07Cn0KbGV0IGRlbnNpdHlMQT0nY29tcGFjdCc7dHJ5e2RlbnNpdHlMQT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTEFfREVOU0lUWScpPT09J2NvbWZvcnRhYmxlJz8nY29tZm9ydGFibGUnOidjb21wYWN0Jzt9Y2F0Y2goZSl7fQpkb2N1bWVudC5ib2R5LmRhdGFzZXQuZGVuc2l0eT1kZW5zaXR5TEE7CmZ1bmN0aW9uIHNldHVwRXhwZXJpZW5jZUhlYWRlckxBKCl7CiBpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbnNpdHlMQScpKXsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2Vzc2lvbkJhclYxNScpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsYDxsYWJlbCBjbGFzcz0iZGVuc2l0eUNvbnRyb2xMQSI+VmlzdGE8c2VsZWN0IGlkPSJkZW5zaXR5TEEiPjxvcHRpb24gdmFsdWU9ImNvbXBhY3QiPkNvbXBhY3RhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY29tZm9ydGFibGUiPkPDs21vZGE8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPmApOwogICQoJyNkZW5zaXR5TEEnKS52YWx1ZT1kZW5zaXR5TEE7JCgnI2RlbnNpdHlMQScpLm9uY2hhbmdlPWU9PntkZW5zaXR5TEE9ZS50YXJnZXQudmFsdWU7ZG9jdW1lbnQuYm9keS5kYXRhc2V0LmRlbnNpdHk9ZGVuc2l0eUxBO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTEFfREVOU0lUWScsZGVuc2l0eUxBKX1jYXRjaChlcnJvcil7fX07CiB9CiBsZXQgYmFja3Vwcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3Vwc0xBJyk7CiBpZighYmFja3Vwcyl7YmFja3Vwcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtiYWNrdXBzLmlkPSdiYWNrdXBzTEEnO2JhY2t1cHMudGV4dENvbnRlbnQ9J1Jlc3BhbGRvcyc7YmFja3Vwcy5vbmNsaWNrPW9wZW5CYWNrdXBzTEE7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlc3Npb25CYXJWMTUnKS5hcHBlbmRDaGlsZChiYWNrdXBzKTt9CiBiYWNrdXBzLmhpZGRlbj1hcHBTZXNzaW9uVjE1Py5yb2xlIT09J2FkbWluJzsKfQpmdW5jdGlvbiBmb3JtYXRVcGRhdGVMQSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybiAnU2luIGZlY2hhIGRpc3BvbmlibGUnO2NvbnN0IGRhdGU9bmV3IERhdGUodmFsdWUpO3JldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpPydTaW4gZmVjaGEgZGlzcG9uaWJsZSc6ZGF0ZS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHt0aW1lWm9uZTonQW1lcmljYS9TYW50aWFnbycsZGF5OicyLWRpZ2l0Jyxtb250aDonbG9uZycseWVhcjonbnVtZXJpYycsaG91cjonMi1kaWdpdCcsbWludXRlOicyLWRpZ2l0J30pO30KbGV0IGV4dGVudENhY2hlTEE9bnVsbDsKZnVuY3Rpb24gZGF0YVN0YXR1c0xBKCl7CiBpZihleHRlbnRDYWNoZUxBPy5tYXRyaXghPT1kYXRhKWV4dGVudENhY2hlTEE9e21hdHJpeDpkYXRhLC4uLmRhdGVFeHRlbnRMQShkYXRhLnJvd3MpfTsKIGNvbnN0IGU9ZXh0ZW50Q2FjaGVMQSxkYXk9bmV3IERhdGUoZS5sYXN0KydUMDA6MDA6MDBaJyksc3RhcnQ9c2hpZnREYXRlTEEoZS5sYXN0LC0oKGRheS5nZXRVVENEYXkoKSs2KSU3KSk7CiBjb25zdCBjb3ZlcmVkPVsuLi5lLmRheXNdLmZpbHRlcihkPT5kPj1zdGFydCYmZDw9ZS5sYXN0KS5sZW5ndGg7CiByZXR1cm4gYDxzcGFuPkRhdG9zIGhhc3RhIDxiPiR7ZXNjKGRpc3BsYXlEYXRlc1Y1KGUubGFzdCkpfTwvYj48L3NwYW4+PHNwYW4+QWN0dWFsaXphY2nDs246ICR7ZXNjKGZvcm1hdFVwZGF0ZUxBKGRhdGEuc3RvcmFnZVVwZGF0ZWRBdCkpfSDCtyBob3JhIGRlIENoaWxlPC9zcGFuPjxzcGFuIGNsYXNzPSIke2NvdmVyZWQ8Nz8nY292ZXJhZ2VMQSc6Jyd9Ij7Dmmx0aW1hIHNlbWFuYTogJHtjb3ZlcmVkfS83IGTDrWFzIGNvbiBkYXRvcyR7Y292ZXJlZDw3PycgwrcgY29iZXJ0dXJhIHBhcmNpYWwnOicnfTwvc3Bhbj5gOwp9CmZ1bmN0aW9uIGZpbHRlclRleHRMQShmaWx0ZXJzLHByZWZpeD0nJyl7CiByZXR1cm4gT2JqZWN0LmVudHJpZXMoZmlsdGVyc3x8e30pLmZpbHRlcigoW2ssdl0pPT5OdW1iZXIoaykhPT04JiYoQXJyYXkuaXNBcnJheSh2KT92Lmxlbmd0aDohIXYpKS5tYXAoKFtrLHZdKT0+e2NvbnN0IGxpc3Q9QXJyYXkuaXNBcnJheSh2KT92Olt2XTtyZXR1cm4gcHJlZml4KyhkaW1zW2tdfHxrKSsnOiAnKyhsaXN0Lmxlbmd0aD4yP2xpc3QubGVuZ3RoKycgc2VsZWNjaW9uYWRvcyc6bGlzdC5qb2luKCcsICcpKTt9KTsKfQpmdW5jdGlvbiBhY3RpdmVGaWx0ZXJzTEEoKXsKIGlmKHRhYj09PSdNZXRvZG9sb2fDrWEnKXJldHVybiAnJzsKIGxldCBjaGlwcz1bXTsKIGlmKHRhYj09PSdDb21wYXJhdGl2b3MnKWZvcihjb25zdCBzY29wZSBvZiBbJ0EnLCdCJ10pe2NoaXBzLnB1c2goc2NvcGUrJzogJytzZWxlY3RlZERhdGVUZXh0Vjgoc2NvcGUpLC4uLmZpbHRlclRleHRMQSh2aWV3U3RhdGVbc2NvcGVdLmZpbHRlcnMsc2NvcGUrJyDCtyAnKSk7fQogZWxzZSBpZih0YWI9PT0nQWxlcnRhcycpe2NvbnN0IHM9YWxlcnRTZXR0aW5nc0xBKCksdz1hbGVydFdpbmRvd3NMQShzLmVuZCxzLmRheXMpO2NoaXBzPVtkaXNwbGF5RGF0ZXNWNSh3LmZyb20pKycg4oaSICcrZGlzcGxheURhdGVzVjUody50byksLi4uZmlsdGVyVGV4dExBKHMuZmlsdGVycyksZGltc1tzLmdyb3VwXSsnIMK3ICcrbWV0cmljc1tzLm1ldHJpY11dO30KIGVsc2Uge2NoaXBzPVtzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpXTtjb25zdCBrZXk9e0V2b2x1Y2nDs246J2V2b2x1dGlvbicsUmF0aW9zOidyYXRpb3MnLCdSZXBvcnRlIHNlbWFuYWwnOid3ZWVrbHknLCdSZXBvcnRlIG1lbnN1YWwnOidtb250aGx5JywnRXZvbHV0aXZvIG1lbnN1YWwnOidtb250aGx5RXZvbHV0aW9uJywnT3Ryb3MgaW5mb3JtZXMnOidleHRyYScsJ1ByZW1pb3Mgc2VtYW5hbGVzJzoncHJpemVzJ31bdGFiXTtjaGlwcy5wdXNoKC4uLmZpbHRlclRleHRMQSh2aWV3U3RhdGVba2V5XT8uZmlsdGVycykpO2lmKHRhYj09PSdSZXN1bWVuJyljaGlwcy5wdXNoKCdUb2RvIGVsIHBhcnF1ZScpO30KIHJldHVybiBgPGRpdiBjbGFzcz0iYWN0aXZlRmlsdGVyc0xBIiBhcmlhLWxhYmVsPSJGaWx0cm9zIGFjdGl2b3MiIHN0eWxlPSJwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDo4Ij48Yj5Db25zdWx0YSBhY3R1YWw8L2I+JHtjaGlwcy5tYXAodGV4dD0+YDxzcGFuIGNsYXNzPSJmaWx0ZXJDaGlwTEEiIHRpdGxlPSIke2VzYyh0ZXh0KX0iPiR7ZXNjKHRleHQpfTwvc3Bhbj5gKS5qb2luKCcnKX08L2Rpdj5gOwp9CmZ1bmN0aW9uIHNvcnRhYmxlVmFsdWVMQSh0ZXh0KXtjb25zdCByYXc9U3RyaW5nKHRleHQpLnRyaW0oKTtjb25zdCB2YWx1ZT1yYXcucmVwbGFjZSgvW+KXj1xzXS9nLCcnKS5yZXBsYWNlKC9DTFB8cHB8JXzDly9nLCcnKTtpZigvXlsrLV0/W1xkLl0rKD86LFxkKyk/JC8udGVzdCh2YWx1ZSkpcmV0dXJue251bWJlcjpOdW1iZXIodmFsdWUucmVwbGFjZSgvXC4vZywnJykucmVwbGFjZSgnLCcsJy4nKSl9O3JldHVybnt0ZXh0OnJhdy50b0xvY2FsZUxvd2VyQ2FzZSgnZXMnKX07fQpmdW5jdGlvbiBlbmhhbmNlVGFibGVzTEEoKXsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC50YWJsZXdyYXAsI2NvbnRlbnQgLmNoYXJ0ZGF0YXdyYXAnKS5mb3JFYWNoKGhvc3Q9PnsKICBjb25zdCB0YWJsZT1ob3N0LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7aWYoIXRhYmxlfHwhdGFibGUudEhlYWR8fCF0YWJsZS50Qm9kaWVzLmxlbmd0aHx8aG9zdC5kYXRhc2V0LmVuaGFuY2VkTGEpcmV0dXJuOwogIGhvc3QuZGF0YXNldC5lbmhhbmNlZExhPSd0cnVlJztob3N0LmNsYXNzTGlzdC5hZGQoJ3NtYXJ0VGFibGVMQScpOwogIGNvbnN0IHJvd3M9Wy4uLnRhYmxlLnRCb2RpZXNbMF0ucm93c107aWYocm93cy5sZW5ndGg+OCl7CiAgIGNvbnN0IHRvb2xzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3Rvb2xzLmNsYXNzTmFtZT0ndGFibGVTZWFyY2hMQSc7dG9vbHMuaW5uZXJIVE1MPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBhcmlhLWxhYmVsPSJCdXNjYXIgZW4gZXN0YSB0YWJsYSIgcGxhY2Vob2xkZXI9IkJ1c2NhciBlbiBlc3RhIHRhYmxh4oCmIj48c3Bhbj5MYSBiw7pzcXVlZGEgdmlzdWFsIG5vIGNhbWJpYSBsb3MgdG90YWxlcyBuaSBsYSBleHBvcnRhY2nDs24uPC9zcGFuPic7CiAgIGhvc3QuYmVmb3JlKHRvb2xzKTt0b29scy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLm9uaW5wdXQ9ZT0+e2NvbnN0IHE9ZS50YXJnZXQudmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpO3Jvd3MuZm9yRWFjaChyPT5yLmhpZGRlbj0hIXEmJiFyLnRleHRDb250ZW50LnRvTG9jYWxlTG93ZXJDYXNlKCdlcycpLmluY2x1ZGVzKHEpKTt9OwogIH0KICBbLi4udGFibGUudEhlYWQucm93c1swXS5jZWxsc10uZm9yRWFjaCgodGgsaW5kZXgpPT57CiAgIGlmKHRoLm9uY2xpY2spcmV0dXJuO3RoLnRhYkluZGV4PTA7dGgudGl0bGU9J09yZGVuYXIgcG9yICcrdGgudGV4dENvbnRlbnQudHJpbSgpO3RoLnNldEF0dHJpYnV0ZSgnYXJpYS1zb3J0Jywnbm9uZScpOwogICBmdW5jdGlvbiBzb3J0Um93cygpe2NvbnN0IGFzY2VuZGluZz10aC5nZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcpIT09J2FzY2VuZGluZyc7Wy4uLnRhYmxlLnRIZWFkLnJvd3NbMF0uY2VsbHNdLmZvckVhY2goYz0+Yy5zZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcsJ25vbmUnKSk7dGguc2V0QXR0cmlidXRlKCdhcmlhLXNvcnQnLGFzY2VuZGluZz8nYXNjZW5kaW5nJzonZGVzY2VuZGluZycpOwogICAgY29uc3Qgc29ydGVkPXJvd3MubWFwKChyb3cscG9zaXRpb24pPT4oe3Jvdyxwb3NpdGlvbix2YWx1ZTpzb3J0YWJsZVZhbHVlTEEocm93LmNlbGxzW2luZGV4XT8udGV4dENvbnRlbnR8fCcnKX0pKS5zb3J0KChhLGIpPT57Y29uc3QgcmVzdWx0PWEudmFsdWUubnVtYmVyIT1udWxsJiZiLnZhbHVlLm51bWJlciE9bnVsbD9hLnZhbHVlLm51bWJlci1iLnZhbHVlLm51bWJlcjooYS52YWx1ZS50ZXh0Pz9TdHJpbmcoYS52YWx1ZS5udW1iZXIpKS5sb2NhbGVDb21wYXJlKGIudmFsdWUudGV4dD8/U3RyaW5nKGIudmFsdWUubnVtYmVyKSwnZXMnLHtudW1lcmljOnRydWV9KTtyZXR1cm4oYXNjZW5kaW5nP3Jlc3VsdDotcmVzdWx0KXx8YS5wb3NpdGlvbi1iLnBvc2l0aW9uO30pOwogICAgc29ydGVkLmZvckVhY2goKHtyb3d9KT0+dGFibGUudEJvZGllc1swXS5hcHBlbmRDaGlsZChyb3cpKTt9CiAgIHRoLm9uY2xpY2s9c29ydFJvd3M7dGgub25rZXlkb3duPWU9PntpZihlLmtleT09PSdFbnRlcid8fGUua2V5PT09JyAnKXtlLnByZXZlbnREZWZhdWx0KCk7c29ydFJvd3MoKTt9fTsKICB9KTsKIH0pOwp9CmZ1bmN0aW9uIGNvbXBhcmlzb25Ob3JtYWxpemVkTEEoKXsKIGlmKHRhYiE9PSdDb21wYXJhdGl2b3MnKXJldHVybjsKIGNvbnN0IGJveD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyaXNvbkNoYXJ0c1YyMicpO2lmKCFib3gpcmV0dXJuOwogdmlld1N0YXRlLmNvbXBhcmVVbml0cz8/PSd0b3RhbCc7CiBib3guY2xhc3NMaXN0LmFkZCgnbm9ybWFsaXphdGlvbkxBJyk7Ym94LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicsYDxkaXYgY2xhc3M9InZpZXdjb250cm9scyI+PGxhYmVsPk1vc3RyYXIgZ3LDoWZpY28gcG9yPHNlbGVjdCBpZD0iY29tcGFyZVVuaXRzTEEiPjxvcHRpb24gdmFsdWU9InRvdGFsIj5Ub3RhbCBkZWwgcGVyw61vZG88L29wdGlvbj48b3B0aW9uIHZhbHVlPSJkYXkiPkTDrWEgY29uIHJlZ2lzdHJvczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1hY2hpbmVEYXkiPk3DoXF1aW5hLWTDrWEgcmVnaXN0cmFkYTwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+PC9kaXY+YCk7CiAkKCcjY29tcGFyZVVuaXRzTEEnKS52YWx1ZT12aWV3U3RhdGUuY29tcGFyZVVuaXRzOyQoJyNjb21wYXJlVW5pdHNMQScpLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGUuY29tcGFyZVVuaXRzPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpO307CiBjb25zdCB1bml0PXZpZXdTdGF0ZS5jb21wYXJlVW5pdHM7aWYodW5pdD09PSd0b3RhbCcpcmV0dXJuOwogY29uc3QgZW50cmllcz1bJ0EnLCdCJ10ubWFwKHNjb3BlPT57Y29uc3Qgcz12aWV3U3RhdGVbc2NvcGVdLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyxzLmZyb20scy50byksdG90YWw9YWdnKHJvd3MpLGRlbm9taW5hdG9yPXVuaXQ9PT0nZGF5Jz9uZXcgU2V0KHJvd3MubWFwKHI9PnJbMF0pKS5zaXplOnRvdGFsLmRheXM7cmV0dXJue3Njb3BlLG5hbWU6cy5uYW1lLHBlcmlvZDpzZWxlY3RlZERhdGVUZXh0Vjgoc2NvcGUpLHRvdGFsOntjb2luOmRlbm9taW5hdG9yP3RvdGFsLmNvaW4vZGVub21pbmF0b3I6MCx3aW46ZGVub21pbmF0b3I/dG90YWwud2luL2Rlbm9taW5hdG9yOjB9fTt9KTsKIGNvbnN0IGhvc3Q9Ym94LnF1ZXJ5U2VsZWN0b3IoJy5jaGFydHNjcm9sbCcpO2hvc3Qub3V0ZXJIVE1MPWNvbXBhcmlzb25Db21iaW5lZFYyMihlbnRyaWVzKTsKIGJveC5xdWVyeVNlbGVjdG9yKCdoMicpLnRleHRDb250ZW50PSdDb2luIEluIHkgV2luIMK3ICcrKHVuaXQ9PT0nZGF5Jz8ncG9yIGTDrWEgY29uIHJlZ2lzdHJvcyc6J3BvciBtw6FxdWluYS1kw61hIHJlZ2lzdHJhZGEnKTsKIGNvbnN0IHN2Zz1ib3gucXVlcnlTZWxlY3Rvcignc3ZnJyk7c3ZnLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsYm94LnF1ZXJ5U2VsZWN0b3IoJ2gyJykudGV4dENvbnRlbnQpO3N2Zy5xdWVyeVNlbGVjdG9yKCd0ZXh0JykudGV4dENvbnRlbnQ9J0NMUCAvICcrKHVuaXQ9PT0nZGF5Jz8nZMOtYSBjb24gcmVnaXN0cm9zJzonbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRhJyk7CiBib3gucXVlcnlTZWxlY3RvcignLnNpZ25hbG5vdGUnKS50ZXh0Q29udGVudD0nRWwgZ3LDoWZpY28gZGl2aWRlIGNhZGEgc2VsZWNjacOzbiBwb3Igc3VzICcrKHVuaXQ9PT0nZGF5Jz8nZMOtYXMgZGlzdGludG9zIGNvbiByZWdpc3Ryb3MnOidjb21iaW5hY2lvbmVzIMO6bmljYXMgZGUgbcOhcXVpbmEgeSBmZWNoYScpKycuIExhIHRhYmxhIGNvbnNlcnZhIGxvcyB0b3RhbGVzIHkgbG9zIGluZGljYWRvcmVzIGRpYXJpb3MuIENlcm8gZXhwb3NpY2nDs24gc2UgcmVwcmVzZW50YSBjb21vIGNlcm8gZW4gZWwgZ3LDoWZpY287IHJldmlzYSBsb3MgcmVnaXN0cm9zIGRlIGNhZGEgc2VsZWNjacOzbi4nOwogLy8gRXhpc3RpbmcgUE5HIGhhbmRsZXJzIHJlZmVyZW5jZSB0aGUgcmVwbGFjZWQgU1ZHOiByZXBsYWNlIGp1c3QgdGhlaXIgdG9vbGJhcnMgYW5kIGJpbmQgYWdhaW4uCiBib3gucXVlcnlTZWxlY3RvckFsbCgnLmNoYXJ0VG9vbHNWOCcpLmZvckVhY2goZWw9PmVsLnJlbW92ZSgpKTsKIGNvbnN0IGxvY2FsPWJveC5xdWVyeVNlbGVjdG9yKCcuY2hhcnRzY3JvbGwnKTtsb2NhbC5kYXRhc2V0Lm5vcm1hbGl6ZWRMYT0ndHJ1ZSc7CiBjb25zdCBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7YmFyLmNsYXNzTmFtZT0nY2hhcnRUb29sc1Y4JztiYXIuaW5uZXJIVE1MPSc8YnV0dG9uPkNvcGlhciBpbWFnZW48L2J1dHRvbj48YnV0dG9uPkRlc2NhcmdhciBQTkc8L2J1dHRvbj48c3BhbiByb2xlPSJzdGF0dXMiPjwvc3Bhbj4nO2xvY2FsLmJlZm9yZShiYXIpOwogY29uc3QgW2NvcHksc2F2ZV09YmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLHN0YXR1cz1iYXIucXVlcnlTZWxlY3Rvcignc3BhbicpLHRpdGxlPWJveC5xdWVyeVNlbGVjdG9yKCdoMicpLnRleHRDb250ZW50LGxlZ2VuZD1ib3gucXVlcnlTZWxlY3RvcignLmxhYmVsZWRsZWdlbmQnKS50ZXh0Q29udGVudDsKIHNhdmUub25jbGljaz1hc3luYygpPT57dHJ5e2Rvd25sb2FkQmxvYlY4KGF3YWl0IGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCksJ0xBLWNvbXBhcmF0aXZvLnBuZycpO3N0YXR1cy50ZXh0Q29udGVudD0nRGVzY2FyZ2Fkbyc7fWNhdGNoKGUpe3N0YXR1cy50ZXh0Q29udGVudD1lLm1lc3NhZ2U7fX07CiBjb3B5Lm9uY2xpY2s9YXN5bmMoKT0+e3RyeXtjb25zdCBibG9iPWF3YWl0IGNoYXJ0UG5nVjgoc3ZnLHRpdGxlLGxlZ2VuZCk7aWYoIW5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlfHx0eXBlb2YgQ2xpcGJvYXJkSXRlbT09PSd1bmRlZmluZWQnKXtkb3dubG9hZEJsb2JWOChibG9iLCdMQS1jb21wYXJhdGl2by5wbmcnKTtzdGF0dXMudGV4dENvbnRlbnQ9J0ltYWdlbiBkZXNjYXJnYWRhJztyZXR1cm47fWF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW25ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzpibG9ifSldKTtzdGF0dXMudGV4dENvbnRlbnQ9J0NvcGlhZG8nO31jYXRjaChlKXtzdGF0dXMudGV4dENvbnRlbnQ9ZS5tZXNzYWdlO319Owp9CmZ1bmN0aW9uIGFsZXJ0U2V0dGluZ3NMQSgpe3ZpZXdTdGF0ZS5hbGVydHM/Pz17ZGF5czo3LGVuZDpkYXRlRXh0ZW50TEEoZGF0YS5yb3dzKS5sYXN0LGdyb3VwOic5JyxtZXRyaWM6J2NkJyx0aHJlc2hvbGQ6MTUsbWluRGF5czozLG9ubHlEcm9wczp0cnVlLGZpbHRlcnM6e319O3JldHVybiB2aWV3U3RhdGUuYWxlcnRzO30KbGV0IGFsZXJ0UmVwb3J0TEE9bnVsbDsKZnVuY3Rpb24gcmVuZGVyQWxlcnRzTEEoKXsKIGNvbnN0IHM9YWxlcnRTZXR0aW5nc0xBKCkscmVwb3J0PWJ1aWxkQWxlcnRzTEEoZGF0YS5yb3dzLHMpO2FsZXJ0UmVwb3J0TEE9cmVwb3J0OwogY29uc3QgdmlzaWJsZT1yZXBvcnQuZW50cmllcy5maWx0ZXIoZz0+IXMub25seURyb3BzfHxnLnN0YXR1cz09PSdkcm9wJyksdz1yZXBvcnQud2luZG93czsKIGRvY3VtZW50LmJvZHkuZGF0YXNldC52aWV3PXRhYjskKCcjdGl0bGUnKS50ZXh0Q29udGVudD0nQWxlcnRhcyBkZSByZW5kaW1pZW50byc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKIGV4cG9ydFJvd3M9W1snR3J1cG8nLCdFc3RhZG8nLCdNb3Rpdm8nLCdWYWxvciBhbnRlcmlvcicsJ1ZhbG9yIGFjdHVhbCcsJ1ZhcmlhY2nDs24gJScsJ0TDrWFzIGFudGVyaW9yZXMnLCdEw61hcyBhY3R1YWxlcycsJ03DoXF1aW5hcy1kw61hIGFudGVyaW9yZXMnLCdNw6FxdWluYXMtZMOtYSBhY3R1YWxlcyddLC4uLnZpc2libGUubWFwKGc9PltnLm5hbWUsZy5zdGF0dXMsZy5yZWFzb24sZy5vbGQ/PycnLGcudmFsdWU/PycnLGcuY2hhbmdlPz8nJyxnLmRheXNBLGcuZGF5c0IsZy5tYWNoaW5lRGF5c0EsZy5tYWNoaW5lRGF5c0JdKV07CiAkKCcjY29udGVudCcpLmlubmVySFRNTD1iYW5uZXIoJ0RldGVjdGFyIGNhw61kYXMgY29uIGNvbnRleHRvJywnQ29tcGFyYSB2ZW50YW5hcyBkZSBpZ3VhbCBkdXJhY2nDs24gY29uIG3DqXRyaWNhcyBwb3IgbcOhcXVpbmEtZMOtYS4gTGEgY29iZXJ0dXJhIGRlIHJlZ2lzdHJvcyBzZSBtdWVzdHJhIGFudGVzIGRlIGludGVycHJldGFyIHVuYSBjYcOtZGEuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIiBpZD0iYWxlcnRDb25maWdMQSI+PGRpdiBjbGFzcz0iYWxlcnRTZXR0aW5nc0xBIj4ke3NlbGVjdG9yKCdWZW50YW5hIGRlIGTDrWFzJywnYWxlcnREYXlzTEEnLHMuZGF5cyx7NzonNyBkw61hcycsMTQ6JzE0IGTDrWFzJywyODonMjggZMOtYXMnfSl9PGxhYmVsPkhhc3RhPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJhbGVydEVuZExBIiB2YWx1ZT0iJHtzLmVuZH0iPjwvbGFiZWw+JHtzZWxlY3RvcignQWdydXBhcicsJ2FsZXJ0R3JvdXBMQScscy5ncm91cCx7OTonQmFuY28nLDE6J03DoXF1aW5hJ30pfSR7c2VsZWN0b3IoJ0luZGljYWRvcicsJ2FsZXJ0TWV0cmljTEEnLHMubWV0cmljLHtjZDonQ29pbiBJbiAvIG3DoXF1aW5hLWTDrWEnLHdkOidXaW4gLyBtw6FxdWluYS1kw61hJyxzZDonU3BpbnMgLyBtw6FxdWluYS1kw61hJ30pfTxsYWJlbD5VbWJyYWwgZGUgY2HDrWRhICglKTxpbnB1dCBpZD0iYWxlcnRUaHJlc2hvbGRMQSIgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iMTAwIiB2YWx1ZT0iJHtzLnRocmVzaG9sZH0iPjwvbGFiZWw+PGxhYmVsPk3DrW5pbW8gZGUgZMOtYXMgcG9yIGdydXBvPGlucHV0IGlkPSJhbGVydE1pbkxBIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSIke3MuZGF5c30iIHZhbHVlPSIke3MubWluRGF5c30iPjwvbGFiZWw+PC9kaXY+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCIgc3R5bGU9Im1hcmdpbi10b3A6MTRweCI+JHtmaWx0ZXJGaWVsZHMocywnYWxlcnRzJyxbMiwzLDUsN10pfTwvZGl2PjxidXR0b24gY2xhc3M9InByaW1hcnkiIGlkPSJhbGVydEFwcGx5TEEiIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHgiPkFwbGljYXIgdW1icmFsIHkgZmVjaGE8L2J1dHRvbj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iY29tcGFyaXNvbk5vdGUiPkFjdHVhbDogJHtkaXNwbGF5RGF0ZXNWNSh3LmZyb20pfSDihpIgJHtkaXNwbGF5RGF0ZXNWNSh3LnRvKX0gwrcgJHtyZXBvcnQuY3VycmVudERheXN9LyR7cy5kYXlzfSBkw61hcyBjb24gZGF0b3MgZW4gbGEgc2VsZWNjacOzbi48YnI+QW50ZXJpb3I6ICR7ZGlzcGxheURhdGVzVjUody5wcmV2aW91c0Zyb20pfSDihpIgJHtkaXNwbGF5RGF0ZXNWNSh3LnByZXZpb3VzVG8pfSDCtyAke3JlcG9ydC5wcmV2aW91c0RheXN9LyR7cy5kYXlzfSBkw61hcyBjb24gZGF0b3MuPC9kaXY+PGRpdiBjbGFzcz0ia3BpcyI+JHtzdGF0Q2FyZHMoW1snQUxFUlRBUycscmVwb3J0LmVudHJpZXMuZmlsdGVyKGc9Pmcuc3RhdHVzPT09J2Ryb3AnKS5sZW5ndGgsJ0Nhw61kYSBkZSBhbCBtZW5vcyAnK3MudGhyZXNob2xkKyclIG8gV2luIGRpYXJpbyBuZWdhdGl2byddLFsnU0lOIENPTVBBUkFDScOTTicscmVwb3J0LmVudHJpZXMuZmlsdGVyKGc9Pmcuc3RhdHVzPT09J2luZm8nKS5sZW5ndGgsJ1NpbiBiYXNlIHBvc2l0aXZhLCByZWdpc3Ryb3MgbyBjb2JlcnR1cmEgc3VmaWNpZW50ZSddLFsnR1JVUE9TJyxyZXBvcnQuZW50cmllcy5sZW5ndGgsJ0NvbiByZWdpc3Ryb3MgZW4gYWxndW5hIGRlIGxhcyBkb3MgdmVudGFuYXMnXV0pLnJlcGxhY2UoL148ZGl2IGNsYXNzPSJrcGlzIj58PFwvZGl2PiQvZywnJyl9PC9kaXY+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj5SZXN1bHRhZG9zIHBvciAke2RpbXNbcy5ncm91cF19PC9oMj48bGFiZWwgc3R5bGU9ImZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXIiPjxpbnB1dCBpZD0iYWxlcnRPbmx5TEEiIHR5cGU9ImNoZWNrYm94IiAke3Mub25seURyb3BzPydjaGVja2VkJzonJ30+TW9zdHJhciBzb2xvIGFsZXJ0YXM8L2xhYmVsPjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0aGVhZD48dHI+JHtleHBvcnRSb3dzWzBdLm1hcChoPT5gPHRoPiR7ZXNjKGgpfTwvdGg+YCkuam9pbignJyl9PC90cj48L3RoZWFkPjx0Ym9keT4ke3Zpc2libGUubWFwKGc9PmA8dHI+PHRkPiR7ZXNjKGcubmFtZSl9PC90ZD48dGQ+PHNwYW4gY2xhc3M9ImFsZXJ0QmFkZ2VMQSAke2cuc3RhdHVzfSI+JHtnLnN0YXR1cz09PSdkcm9wJz8nUmV2aXNhcic6Zy5zdGF0dXM9PT0nb2snPydTaW4gY2HDrWRhJzonU2luIGNvbXBhcmFjacOzbid9PC9zcGFuPjwvdGQ+PHRkPiR7ZXNjKGcucmVhc29uKX08L3RkPjx0ZD4ke2ZtdChnLm9sZCxzLm1ldHJpYyl9PC90ZD48dGQ+JHtmbXQoZy52YWx1ZSxzLm1ldHJpYyl9PC90ZD48dGQ+JHtnLmNoYW5nZT09bnVsbD8n4oCUJzpnLmNoYW5nZS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pKyclJ308L3RkPjx0ZD4ke2cuZGF5c0F9PC90ZD48dGQ+JHtnLmRheXNCfTwvdGQ+PHRkPiR7Zy5tYWNoaW5lRGF5c0F9PC90ZD48dGQ+JHtnLm1hY2hpbmVEYXlzQn08L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjEwIj5TaW4gYWxlcnRhcyBjb24gbG9zIGNyaXRlcmlvcyBhY3R1YWxlcy4gRGVzbWFyY2EgwqtNb3N0cmFyIHNvbG8gYWxlcnRhc8K7IHBhcmEgcmV2aXNhciBsYSBjb2JlcnR1cmEgZGUgdG9kb3MgbG9zIGdydXBvcy48L3RkPjwvdHI+J308L3Rib2R5PjwvdGFibGU+PC9kaXY+PHAgY2xhc3M9InNpZ25hbG5vdGUiPlVuYSBhbGVydGEgZXMgdW5hIHNlw7FhbCBkZSByZXZpc2nDs24sIG5vIHVuYSBleHBsaWNhY2nDs24gZGUgc3UgY2F1c2EuIE5vIHNlIGNvbnNpZGVyYSBjZXJvIHVuIHBlcsOtb2RvIHNpbiByZWdpc3Ryb3MuIExvcyBjYW1iaW9zIGRlIHViaWNhY2nDs24gc2UgaW50ZXJwcmV0YW4gc2Vnw7puIGxhIHViaWNhY2nDs24gaGlzdMOzcmljYSBjYXJnYWRhLiBVbiBXaW4gbmVnYXRpdm8gc2Ugc2XDsWFsYSBhdW4gc2luIHJlZmVyZW5jaWEgY29tcGFyYWJsZS48L3A+PC9zZWN0aW9uPmA7CiBiaW5kRmlsdGVycygpO2Zvcihjb25zdFtpZCxrZXldb2YgW1snYWxlcnREYXlzTEEnLCdkYXlzJ10sWydhbGVydEdyb3VwTEEnLCdncm91cCddLFsnYWxlcnRNZXRyaWNMQScsJ21ldHJpYyddXSkkKCcjJytpZCkub25jaGFuZ2U9ZT0+e3Nba2V5XT1rZXk9PT0nZGF5cyc/TnVtYmVyKGUudGFyZ2V0LnZhbHVlKTplLnRhcmdldC52YWx1ZTtzLm1pbkRheXM9TWF0aC5taW4ocy5taW5EYXlzLHMuZGF5cyk7cmVuZGVyKCk7fTsKICQoJyNhbGVydEFwcGx5TEEnKS5vbmNsaWNrPSgpPT57Y29uc3QgdGhyZXNob2xkPU51bWJlcigkKCcjYWxlcnRUaHJlc2hvbGRMQScpLnZhbHVlKSxtaW5EYXlzPU51bWJlcigkKCcjYWxlcnRNaW5MQScpLnZhbHVlKSxlbmQ9JCgnI2FsZXJ0RW5kTEEnKS52YWx1ZTtpZighZW5kfHx0aHJlc2hvbGQ8MXx8dGhyZXNob2xkPjEwMHx8bWluRGF5czwxfHxtaW5EYXlzPnMuZGF5c3x8IU51bWJlci5pc0ludGVnZXIobWluRGF5cykpe2FsZXJ0KCdSZXZpc2EgbGEgZmVjaGEsIGVsIHVtYnJhbCAoMSBhIDEwMCUpIHkgZWwgbcOtbmltbyBkZSBkw61hcy4nKTtyZXR1cm47fU9iamVjdC5hc3NpZ24ocyx7dGhyZXNob2xkLG1pbkRheXMsZW5kfSk7cmVuZGVyKCk7fTsKICQoJyNhbGVydE9ubHlMQScpLm9uY2hhbmdlPWU9PntzLm9ubHlEcm9wcz1lLnRhcmdldC5jaGVja2VkO3JlbmRlcigpO307CiBmb2xkQ29udHJvbExBKCQoJyNhbGVydENvbmZpZ0xBJyksJ2FsZXJ0LWNvbmZpZycsJ0NvbmZpZ3VyYXIgYWxlcnRhcyDCtyAnK3MuZGF5cysnIGTDrWFzIMK3IGNhw61kYSDiiaUgJytzLnRocmVzaG9sZCsnJSDCtyBhYnJpciBwYXJhIGNhbWJpYXInKTsKfQphc3luYyBmdW5jdGlvbiBvcGVuQmFja3Vwc0xBKCl7CiBpZihhcHBTZXNzaW9uVjE1Py5yb2xlIT09J2FkbWluJylyZXR1cm47CiBjb25zdCBkaWFsb2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGlhbG9nJyk7ZGlhbG9nLmNsYXNzTmFtZT0nZXhwZXJpZW5jZURpYWxvZ0xBJztkaWFsb2cuaW5uZXJIVE1MPSc8aDI+UmVzcGFsZG9zIGRlIG1hdHJpY2VzPC9oMj48cD5TZSBjb25zZXJ2YW4gbGFzIHRyZXMgbWF0cmljZXMgYW50ZXJpb3Jlcy4gQ2FkYSBhY3R1YWxpemFjacOzbiBndWFyZGEgbGEgbWF0cml6IGFjdGl2YSBhbnRlcyBkZSBzdXN0aXR1aXJsYTsgbGEgcHJpbWVyYSBjYXJnYSBubyB0aWVuZSB1bmEgdmVyc2nDs24gcHJldmlhLjwvcD48cCBjbGFzcz0iYmFja3VwU3RhdHVzTEEiPkNvbnN1bHRhbmRvIHJlc3BhbGRvc+KApjwvcD48dWwgY2xhc3M9ImJhY2t1cExpc3RMQSI+PC91bD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1iYWNrdXBkb3dubG9hZD5EZXNjYXJnYXIgbWF0cml6IGFjdHVhbCAoSlNPTik8L2J1dHRvbj4gPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtYmFja3VwY2xvc2U+Q2VycmFyPC9idXR0b24+JzsKIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTtkaWFsb2cuc2hvd01vZGFsKCk7ZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJhY2t1cGNsb3NlXScpLm9uY2xpY2s9KCk9PntkaWFsb2cuY2xvc2UoKTtkaWFsb2cucmVtb3ZlKCk7fTsKIGRpYWxvZy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1iYWNrdXBkb3dubG9hZF0nKS5vbmNsaWNrPSgpPT5kb3dubG9hZEJsb2JWOChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLHt0eXBlOidhcHBsaWNhdGlvbi9qc29uJ30pLCdMQS1tYXRyaXotcmVzcGFsZG8uanNvbicpOwogY29uc3Qgc3RhdHVzPWRpYWxvZy5xdWVyeVNlbGVjdG9yKCcuYmFja3VwU3RhdHVzTEEnKTsKIHRyeXsKICBjb25zdCBiYWNrdXBzPWF3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9sYV9iYWNrdXBzP3NlbGVjdD1pZCxjcmVhdGVkX2F0LHNvdXJjZV91cGRhdGVkX2F0LHJvd19jb3VudCxzb3VyY2VfbmFtZSZvcmRlcj12ZXJzaW9uX3NlcS5kZXNjJmxpbWl0PTMnLHt9LGFwcFNlc3Npb25WMTUudG9rZW4pOwogIHN0YXR1cy50ZXh0Q29udGVudD1iYWNrdXBzLmxlbmd0aD8nUmVzdGF1cmFyIHJlZW1wbGF6YSBsYSBtYXRyaXogYWN0aXZhIHkgZ3VhcmRhIHVuIHJlc3BhbGRvIGRlIGxhIHF1ZSBlc3TDoSB1c2FuZG8gYWhvcmEuJzonQcO6biBubyBoYXkgdmVyc2lvbmVzIGFudGVyaW9yZXMuIEVsIHNpZ3VpZW50ZSBjYW1iaW8gZGUgbWF0cml6IGdlbmVyYXLDoSBlbCBwcmltZXIgcmVzcGFsZG8uJzsKICBkaWFsb2cucXVlcnlTZWxlY3RvcignLmJhY2t1cExpc3RMQScpLmlubmVySFRNTD1iYWNrdXBzLm1hcChiPT5gPGxpPjxzcGFuPjxiPiR7ZXNjKGIuc291cmNlX25hbWV8fCdNYXRyaXonKX08L2I+PGJyPiR7ZXNjKGZvcm1hdFVwZGF0ZUxBKGIuY3JlYXRlZF9hdCkpfSDCtyAke2ZtdChiLnJvd19jb3VudCl9IHJlZ2lzdHJvczwvc3Bhbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1yZXN0b3JlYmFja3VwPSIke2IuaWR9Ij5SZXN0YXVyYXI8L2J1dHRvbj48L2xpPmApLmpvaW4oJycpOwogIGRpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXN0b3JlYmFja3VwXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24ub25jbGljaz1hc3luYygpPT57CiAgIGlmKCFjb25maXJtKCfCv1Jlc3RhdXJhciBlc3RhIG1hdHJpeiBhbnRlcmlvcj8gTGEgbWF0cml6IGFjdHVhbCBxdWVkYXLDoSByZXNwYWxkYWRhLicpKXJldHVybjsKICAgZGlhbG9nLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmZvckVhY2goYj0+Yi5kaXNhYmxlZD10cnVlKTtzdGF0dXMudGV4dENvbnRlbnQ9J1Jlc3RhdXJhbmRv4oCmJzsKICAgdHJ5e2F3YWl0IHN1cGFiYXNlUmVxdWVzdExBKCcvcmVzdC92MS9ycGMvbGFfcmVzdG9yZV9iYWNrdXAnLHttZXRob2Q6J1BPU1QnLGJvZHk6SlNPTi5zdHJpbmdpZnkoe3BfYmFja3VwOmJ1dHRvbi5kYXRhc2V0LnJlc3RvcmViYWNrdXAscF9yZXZpc2lvbjpkYXRhLnN0b3JhZ2VSZXZpc2lvbn0pfSxhcHBTZXNzaW9uVjE1LnRva2VuKTtkYXRhPWF3YWl0IGNhY2hlZCgpO2RpYWxvZy5jbG9zZSgpO2RpYWxvZy5yZW1vdmUoKTtpbml0KCk7fQogICBjYXRjaChlcnJvcil7c3RhdHVzLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7ZGlhbG9nLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmZvckVhY2goYj0+Yi5kaXNhYmxlZD1mYWxzZSk7fQogIH0pOwogfWNhdGNoKGVycm9yKXtzdGF0dXMudGV4dENvbnRlbnQ9ZXJyb3Iuc3RhdHVzPT09NDA0PydGYWx0YSBlamVjdXRhciByZXNwYWxkb3MtdjUuc3FsIGVuIFN1cGFiYXNlLiBQdWVkZXMgZGVzY2FyZ2FyIHVuYSBjb3BpYSBKU09OIG1pZW50cmFzIHRhbnRvLic6ZXJyb3IubWVzc2FnZTt9Cn0KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2IGJ1dHRvbltkYXRhLXRhYj0iTWV0b2RvbG9nw61hIl0nKS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJywnPGJ1dHRvbiBkYXRhLXRhYj0iQWxlcnRhcyI+4pqRICZuYnNwOyBBbGVydGFzPC9idXR0b24+Jyk7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IkFsZXJ0YXMiXScpLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoJ0FsZXJ0YXMnKTsKY29uc3QgZXhwb3J0QmVmb3JlRXhwZXJpZW5jZUxBPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXtpZih0YWIhPT0nQWxlcnRhcycpcmV0dXJuIGV4cG9ydEJlZm9yZUV4cGVyaWVuY2VMQSgpO2Rvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFt7bmFtZTonQWxlcnRhcycscm93czpleHBvcnRSb3dzfSx7bmFtZTonQ29uZmlndXJhY2lvbicscm93czpbWydQYXLDoW1ldHJvJywnVmFsb3InXSwuLi5PYmplY3QuZW50cmllcyhhbGVydFNldHRpbmdzTEEoKSkubWFwKChbayx2XSk9PltrLHR5cGVvZiB2PT09J29iamVjdCc/SlNPTi5zdHJpbmdpZnkodik6dl0pLFsnVmVudGFuYXMnLEpTT04uc3RyaW5naWZ5KGFsZXJ0UmVwb3J0TEEud2luZG93cyldLFsnVW5pZGFkZXMnLCdDTFAgbyBzcGlucyBwb3IgbcOhcXVpbmEtZMOtYSByZWdpc3RyYWRhLCBzZWfDum4gaW5kaWNhZG9yJ11dfV0pLCdMQS1hbGVydGFzLnhsc3gnKTt9Owpjb25zdCByZW5kZXJCZWZvcmVFeHBlcmllbmNlTEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXsKIGlmKGRhdGEmJnRhYj09PSdBbGVydGFzJyl7Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSk7cmVuZGVyQWxlcnRzTEEoKTtjb21wYWN0Q29udHJvbHNMQSgpO2RlY29yYXRlU3BhbmlzaERhdGVzTEEoKTt9ZWxzZSByZW5kZXJCZWZvcmVFeHBlcmllbmNlTEEoKTsKIGlmKCFkYXRhKXJldHVybjtzZXR1cEV4cGVyaWVuY2VIZWFkZXJMQSgpOwogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RhdGFTdGF0dXNMQScpPy5yZW1vdmUoKTtjb25zdCBzdGF0dXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7c3RhdHVzLmlkPSdkYXRhU3RhdHVzTEEnO3N0YXR1cy5jbGFzc05hbWU9J2RhdGFTdGF0dXNMQSc7c3RhdHVzLmlubmVySFRNTD1kYXRhU3RhdHVzTEEoKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKS5hZnRlcihzdGF0dXMpOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQgLmFjdGl2ZUZpbHRlcnNMQScpPy5yZW1vdmUoKTskKCcjY29udGVudCcpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsYWN0aXZlRmlsdGVyc0xBKCkpO2NvbXBhcmlzb25Ob3JtYWxpemVkTEEoKTtlbmhhbmNlVGFibGVzTEEoKTsKfTsKCmNvbnN0IHJlc3BvbnNpdmVDaGFydE1vZGVsc0xBPW5ldyBNYXAoKTsKZnVuY3Rpb24gY2hhcnRUaWNrSW5kZXhlc0xBKGNvdW50LHNwYWNpbmcsbWluaW11bSl7CiBpZihjb3VudDwyKXJldHVybiBjb3VudD9bMF06W107CiBjb25zdCBzdGVwPU1hdGgubWF4KDEsTWF0aC5jZWlsKG1pbmltdW0vTWF0aC5tYXgoc3BhY2luZywxKSkpLGluZGV4ZXM9W107CiBmb3IobGV0IGk9MDtpPGNvdW50O2krPXN0ZXApaW5kZXhlcy5wdXNoKGkpOwogaWYoaW5kZXhlcy5hdCgtMSkhPT1jb3VudC0xKXtpZihpbmRleGVzLmxlbmd0aD4xJiYoY291bnQtMS1pbmRleGVzLmF0KC0xKSkqc3BhY2luZzxtaW5pbXVtKWluZGV4ZXMucG9wKCk7aW5kZXhlcy5wdXNoKGNvdW50LTEpO30KIHJldHVybiBpbmRleGVzOwp9CmZ1bmN0aW9uIHJlc3BvbnNpdmVDaGFydExheW91dExBKG1vZGVsLHJlcXVlc3RlZFdpZHRoKXsKIGNvbnN0IHtzZXJpZXMsa2V5LGR1YWxLZXlzLGlkfT1tb2RlbCxjb2xvcnM9dHlwZW9mIGNoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEE9PT0nZnVuY3Rpb24nP2NoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEEobW9kZWwpOlsnIzE2YTlhZScsJyM1NDdmYzUnLCcjNjdhNzgyJywnI2E1ODhjMicsJyNjNzhlNDUnLCcjZDY4MTc4JywnIzVhOWZhNCcsJyNhMmE4NjYnXTsKIGNvbnN0IGF4ZXM9ZHVhbEtleXM/KG1vZGVsLnBlcmlvZFYxMD9bLi4ubmV3IFNldChkdWFsS2V5cyldOmR1YWxLZXlzLnNsaWNlKDAsMikpOltrZXldLGF4aXNTZXJpZXM9YXhlcy5tYXAobWV0cmljPT5kdWFsS2V5cz9kdWFsS2V5cy5pbmRleE9mKG1ldHJpYyk6MCk7CiBjb25zdCB3aWR0aD1NYXRoLm1heCgyNjAsTWF0aC5yb3VuZChyZXF1ZXN0ZWRXaWR0aHx8NjQwKSksYWxsRGFpbHlMYWJlbHM9ISFtb2RlbC5hbGlnbmVkV2Vla3NWMTAscGFja0xhYmVscz1hbGxEYWlseUxhYmVsc3x8KG1vZGVsLnBlcmlvZFYxMCYmc2VyaWVzLmxlbmd0aD4yKSxoZWlnaHQ9cGFja0xhYmVscz9NYXRoLm1heCgzNDAsMjAwK3Nlcmllcy5sZW5ndGgqKHdpZHRoPDUwMD8oYXhlcy5sZW5ndGg+Mj81MjozNCk6MTgpKTozNDAsbGVmdD13aWR0aDwzODA/NDk6NjAscmlnaHQ9d2lkdGgtKGF4ZXMubGVuZ3RoPjI/MTIwOmR1YWxLZXlzPzU1OjI4KSx0b3A9NTgsYm90dG9tPWhlaWdodC0xMTU7CiBjb25zdCBsYWJlbHM9Wy4uLm5ldyBTZXQoc2VyaWVzLmZsYXRNYXAocz0+cy5wb2ludHMubWFwKHA9PnAubmFtZSkpKV0uc29ydCgpOwogY29uc3QgZW50cmllcz1sYWJlbHMubWFwKGxhYmVsPT57Y29uc3QgcG9pbnRzPXNlcmllcy5tYXAocz0+cy5wb2ludHMuZmluZChwPT5wLm5hbWU9PT1sYWJlbCkpO3JldHVybntwZXJpb2Q6cGVyaW9kRGVzY3JpcHRpb25WNChsYWJlbCxwb2ludHMuZmlsdGVyKEJvb2xlYW4pKSx2YWx1ZXM6cG9pbnRzLm1hcCgocCxpKT0+cD8uW2R1YWxLZXlzP2R1YWxLZXlzW2ldOmtleV0/P251bGwpfTt9KTsKIGNvbnN0IHZhbHVlcz1lbnRyaWVzLmZsYXRNYXAoZT0+ZS52YWx1ZXMpLmZpbHRlcih2PT52IT1udWxsJiZOdW1iZXIuaXNGaW5pdGUodikpLGNvbW1vbj17bG86TWF0aC5taW4oMCwuLi52YWx1ZXMpLGhpOk1hdGgubWF4KDEsLi4udmFsdWVzKX07CiBjb25zdCBzY2FsZXM9c2VyaWVzLm1hcCgocyxpKT0+e2lmKCFkdWFsS2V5cylyZXR1cm4gY29tbW9uO2NvbnN0IGxpc3Q9KG1vZGVsLmFsaWduZWRXZWVrc1YxMHx8bW9kZWwuc2hhcmVkTWV0cmljU2NhbGVzVjEyP2VudHJpZXMuZmxhdE1hcChlPT5lLnZhbHVlcy5maWx0ZXIoKHYsaik9PmR1YWxLZXlzW2pdPT09ZHVhbEtleXNbaV0pKTplbnRyaWVzLm1hcChlPT5lLnZhbHVlc1tpXSkpLmZpbHRlcih2PT52IT1udWxsJiZOdW1iZXIuaXNGaW5pdGUodikpO3JldHVybntsbzpNYXRoLm1pbigwLC4uLmxpc3QpLGhpOk1hdGgubWF4KC4wMDAwMDEsLi4ubGlzdCl9O30pOwogY29uc3Qgc3BhY2luZz1sYWJlbHMubGVuZ3RoPjE/KHJpZ2h0LWxlZnQpLyhsYWJlbHMubGVuZ3RoLTEpOnJpZ2h0LWxlZnQseD1qPT5sYWJlbHMubGVuZ3RoPT09MT8obGVmdCtyaWdodCkvMjpsZWZ0K2oqc3BhY2luZyx5PSh2LGkpPT5ib3R0b20tKHYtc2NhbGVzW2ldLmxvKS8oc2NhbGVzW2ldLmhpLXNjYWxlc1tpXS5sb3x8MSkqKGJvdHRvbS10b3ApOwogY29uc3QgdGV4dHM9ZW50cmllcy5tYXAoZT0+ZS5wZXJpb2QuZnVsbCsnIHwgJytzZXJpZXMubWFwKChzLGkpPT5zLm5hbWUrJzogJyt2YWx1ZVY0KGUudmFsdWVzW2ldLGR1YWxLZXlzP2R1YWxLZXlzW2ldOmtleSkpLmpvaW4oJyB8ICcpKTsKIGNoYXJ0UG9pbnRzVjQuc2V0KGlkLHRleHRzKTsKIGNvbnN0IG1heExhYmVsPU1hdGgubWF4KDQwLC4uLnZhbHVlcy5tYXAoKHYpPT5jb21wYWN0KHYsa2V5fHxkdWFsS2V5cz8uWzBdKS5sZW5ndGgqNisxNCkpOwogY29uc3QgdmlzaWJsZVZhbHVlcz1uZXcgU2V0KGFsbERhaWx5TGFiZWxzP2xhYmVscy5tYXAoKF8saSk9PmkpOmNoYXJ0VGlja0luZGV4ZXNMQShsYWJlbHMubGVuZ3RoLHNwYWNpbmcsbWF4TGFiZWwpKTsKIGNvbnN0IGF4aXNJbmRleGVzPWNoYXJ0VGlja0luZGV4ZXNMQShsYWJlbHMubGVuZ3RoLHNwYWNpbmcsd2lkdGg8MzgwPzg1OjEwMCk7CiBjb25zdCBsYWJlbFBvc2l0aW9ucz1lbnRyaWVzLm1hcChlPT57CiAgY29uc3QgcG9zPWUudmFsdWVzLm1hcCgodixpKT0+dj09bnVsbD9udWxsOnkodixpKS0xMyk7CiAgaWYoc2VyaWVzLmxlbmd0aD09PTImJmUudmFsdWVzLmV2ZXJ5KHY9PnYhPW51bGwpJiZNYXRoLmFicyh5KGUudmFsdWVzWzBdLDApLXkoZS52YWx1ZXNbMV0sMSkpPDI4KXsKICAgY29uc3QgdXBwZXI9eShlLnZhbHVlc1swXSwwKTw9eShlLnZhbHVlc1sxXSwxKT8wOjEsbG93ZXI9MS11cHBlcjsKICAgcG9zW3VwcGVyXT15KGUudmFsdWVzW3VwcGVyXSx1cHBlciktMTU7cG9zW2xvd2VyXT15KGUudmFsdWVzW2xvd2VyXSxsb3dlcikrMjM7CiAgfQogIHJldHVybiBwb3M7CiB9KTsKIGNvbnN0IGxhYmVsRm9udD1wYWNrTGFiZWxzPzEwOjExLGxhYmVsQm94ZXM9W107CiBpZihwYWNrTGFiZWxzKXsKICBjb25zdCBzbG90cz1BcnJheS5mcm9tKHtsZW5ndGg6TWF0aC5mbG9vcigoYm90dG9tKzIyLTEyKS8xNSkrMX0sKF8saSk9PjEyK2kqMTUpOwogIGVudHJpZXMuZm9yRWFjaCgoZW50cnksaik9PnsKICAgaWYoIXZpc2libGVWYWx1ZXMuaGFzKGopKXJldHVybjsKICAgY29uc3Qgb3JkZXJlZD1lbnRyeS52YWx1ZXMubWFwKCh2YWx1ZSxpKT0+KHt2YWx1ZSxpfSkpLmZpbHRlcihwPT5wLnZhbHVlIT1udWxsKS5zb3J0KChhLGIpPT55KGEudmFsdWUsYS5pKS15KGIudmFsdWUsYi5pKSk7CiAgIGZvcihjb25zdHt2YWx1ZSxpfW9mIG9yZGVyZWQpewogICAgY29uc3QgdGV4dD1jb21wYWN0KHZhbHVlLGR1YWxLZXlzP2R1YWxLZXlzW2ldOmtleSksdz10ZXh0Lmxlbmd0aCpsYWJlbEZvbnQqLjYyKzYsYW5jaG9yPWo9PT0wPydzdGFydCc6aj09PWVudHJpZXMubGVuZ3RoLTE/J2VuZCc6J21pZGRsZScsbGVmdEVkZ2U9eChqKS0oYW5jaG9yPT09J2VuZCc/dzphbmNob3I9PT0nbWlkZGxlJz93LzI6MCksZGVzaXJlZD15KHZhbHVlLGkpLTEzOwogICAgY29uc3QgY2FuZGlkYXRlcz1bLi4uc2xvdHNdLnNvcnQoKGEsYik9Pk1hdGguYWJzKGEtZGVzaXJlZCktTWF0aC5hYnMoYi1kZXNpcmVkKSk7CiAgICBjb25zdCBjaG9zZW49Y2FuZGlkYXRlcy5maW5kKGN5PT4hbGFiZWxCb3hlcy5zb21lKGJveD0+bGVmdEVkZ2U8Ym94LnJpZ2h0JiZsZWZ0RWRnZSt3PmJveC5sZWZ0JiZjeS0xMTxib3guYm90dG9tJiZjeSszPmJveC50b3ApKTsKICAgIGNvbnN0IGN5PWNob3Nlbj8/Y2FuZGlkYXRlc1swXTtsYWJlbFBvc2l0aW9uc1tqXVtpXT1jeTtsYWJlbEJveGVzLnB1c2goe2xlZnQ6bGVmdEVkZ2UscmlnaHQ6bGVmdEVkZ2Urdyx0b3A6Y3ktMTEsYm90dG9tOmN5KzMsaixpfSk7CiAgIH0KICB9KTsKIH0KIGNvbnN0IHRpY2tzPVswLC41LDFdLm1hcChmPT57Y29uc3QgY3k9Ym90dG9tLWYqKGJvdHRvbS10b3ApO3JldHVybiBgPGxpbmUgeDE9IiR7bGVmdH0iIHkxPSIke2N5fSIgeDI9IiR7cmlnaHR9IiB5Mj0iJHtjeX0iIHN0cm9rZT0idmFyKC0tcGxvdGdyaWQpIiBzdHJva2UtZGFzaGFycmF5PSIzIDQiLz5gK2F4ZXMubWFwKChtZXRyaWMsYSk9Pntjb25zdCBzY2FsZT1zY2FsZXNbYXhpc1Nlcmllc1thXV0sY29sb3I9YXhlcy5sZW5ndGg+Mj9jb2xvcnNbYXhpc1Nlcmllc1thXSVjb2xvcnMubGVuZ3RoXTondmFyKC0tcGxvdHRleHQpJztyZXR1cm4gYDx0ZXh0IGRhdGEtYXhpcy1tZXRyaWMtbGE9IiR7ZXNjKG1ldHJpYyl9IiB4PSIke2E9PT0wP2xlZnQtODpyaWdodCs4KyhhLTEpKjYyfSIgeT0iJHtjeSs0fSIgJHthPT09MD8ndGV4dC1hbmNob3I9ImVuZCInOicnfSBmb250LXNpemU9IjEwIiBmaWxsPSIke2NvbG9yfSI+JHtlc2MoY29tcGFjdChzY2FsZS5sbytmKihzY2FsZS5oaS1zY2FsZS5sbyksbWV0cmljKSl9PC90ZXh0PmA7fSkuam9pbignJyk7fSkuam9pbignJyk7CiBjb25zdCBsaW5lcz1zZXJpZXMubWFwKChzLGkpPT57CiAgY29uc3QgbWV0cmljPWR1YWxLZXlzP2R1YWxLZXlzW2ldOmtleSx2YWxpZD1lbnRyaWVzLm1hcCgoZSxqKT0+KHtlLGp9KSkuZmlsdGVyKCh7ZX0pPT5lLnZhbHVlc1tpXSE9bnVsbCk7CiAgY29uc3QgY29sb3I9aj0+dHlwZW9mIHJhdGlvS2V5c1Y2IT09J3VuZGVmaW5lZCcmJnJhdGlvS2V5c1Y2LmluY2x1ZGVzKG1ldHJpYyk/cG9pbnRDb2xvclY2KGVudHJpZXMsaixpLG1ldHJpYyk6dHlwZW9mIGNoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEE9PT0nZnVuY3Rpb24nP2NvbG9yc1tpJWNvbG9ycy5sZW5ndGhdOlsncG8nLCdwb24nLCdkZXYnLCdiZXQnLCdwcml6ZScsJ3Byb21vJywnb2NjJ10uaW5jbHVkZXMobWV0cmljKT9jb2xvcnNbaSVjb2xvcnMubGVuZ3RoXTpwb2ludENvbG9yVjYoZW50cmllcyxqLGksbWV0cmljKTsKICBjb25zdCBzZWdtZW50cz1bXTtsZXQgc2VnbWVudD1bXTtmb3IobGV0IGo9MDtqPGVudHJpZXMubGVuZ3RoO2orKyl7aWYoZW50cmllc1tqXS52YWx1ZXNbaV0hPW51bGwpe3NlZ21lbnQucHVzaCh7ZTplbnRyaWVzW2pdLGp9KTt9ZWxzZSBpZihtb2RlbC5wZXJpb2RWMTAmJnNlZ21lbnQubGVuZ3RoKXtzZWdtZW50cy5wdXNoKHNlZ21lbnQpO3NlZ21lbnQ9W107fX1pZihzZWdtZW50Lmxlbmd0aClzZWdtZW50cy5wdXNoKHNlZ21lbnQpOwogIGNvbnN0IGRhc2g9dHlwZW9mIHNlcmllc1N0eWxlVjEzPT09J2Z1bmN0aW9uJz9zZXJpZXNTdHlsZVYxMyhtb2RlbCxpKS5kYXNoOm1vZGVsLmFsaWduZWRXZWVrc1YxMD9bJycsJzggNCcsJzMgMycsJzEwIDMgMiAzJ11bTWF0aC5mbG9vcihpLyhtb2RlbC5tZXRyaWNDb3VudFYxMHx8MSkpJTRdOihpPT09MT8nNyAzJzonJyk7CiAgY29uc3QgcGF0aHM9KG1vZGVsLnBlcmlvZFYxMD9zZWdtZW50czpbdmFsaWRdKS5tYXAocGFydD0+YDxwb2x5bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3JzW2klY29sb3JzLmxlbmd0aF19IiBzdHJva2Utd2lkdGg9IjIuNSIgJHtkYXNoPydzdHJva2UtZGFzaGFycmF5PSInK2Rhc2grJyInOicnfSBwb2ludHM9IiR7cGFydC5tYXAoKHtlLGp9KT0+YCR7eChqKX0sJHt5KGUudmFsdWVzW2ldLGkpfWApLmpvaW4oJyAnKX0iLz5gKS5qb2luKCcnKTsKICByZXR1cm4gcGF0aHMrYCR7dmFsaWQubWFwKCh7ZSxqfSk9PmAke3BhY2tMYWJlbHMmJnZpc2libGVWYWx1ZXMuaGFzKGopJiZNYXRoLmFicyhsYWJlbFBvc2l0aW9uc1tqXVtpXS0oeShlLnZhbHVlc1tpXSxpKS0xMykpPjEwP2A8bGluZSB4MT0iJHt4KGopfSIgeTE9IiR7eShlLnZhbHVlc1tpXSxpKX0iIHgyPSIke3goail9IiB5Mj0iJHtsYWJlbFBvc2l0aW9uc1tqXVtpXS00fSIgc3Ryb2tlPSIke2NvbG9yKGopfSIgc3Ryb2tlLW9wYWNpdHk9Ii4zNSIvPmA6Jyd9PGNpcmNsZSBjeD0iJHt4KGopfSIgY3k9IiR7eShlLnZhbHVlc1tpXSxpKX0iIHI9IiR7c3BhY2luZzwxOD8zOjV9IiBmaWxsPSIke2NvbG9yKGopfSIgc3Ryb2tlPSJ2YXIoLS1wbG90YmcpIiBzdHJva2Utd2lkdGg9IjEuNSIgdGFiaW5kZXg9IjAiIHJvbGU9ImJ1dHRvbiIgZGF0YS1jaGFydHY0PSIke2lkfSIgZGF0YS1wb2ludHY0PSIke2p9IiBhcmlhLWxhYmVsPSIke2VzYyh0ZXh0c1tqXSl9Ij48dGl0bGU+JHtlc2ModGV4dHNbal0pfTwvdGl0bGU+PC9jaXJjbGU+JHsoc2VyaWVzLmxlbmd0aDw9Mnx8bW9kZWwucGVyaW9kVjEwKSYmdmlzaWJsZVZhbHVlcy5oYXMoaik/YDx0ZXh0IGRhdGEtdmFsdWUtbGFiZWwtbGE9IiR7an0tJHtpfSIgeD0iJHt4KGopfSIgeT0iJHtsYWJlbFBvc2l0aW9uc1tqXVtpXX0iIHRleHQtYW5jaG9yPSIke3BhY2tMYWJlbHM/KGo9PT0wPydzdGFydCc6aj09PWVudHJpZXMubGVuZ3RoLTE/J2VuZCc6J21pZGRsZScpOidtaWRkbGUnfSIgZm9udC1zaXplPSIke2xhYmVsRm9udH0iIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiR7Y29sb3Ioail9IiBzdHJva2U9InZhcigtLXBsb3RiZykiIHN0cm9rZS13aWR0aD0iMyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+JHtlc2MoY29tcGFjdChlLnZhbHVlc1tpXSxtZXRyaWMpKX08L3RleHQ+YDonJ31gKS5qb2luKCcnKX1gOwogfSkuam9pbignJyk7CiBjb25zdCBwZXJpb2RzPWF4aXNJbmRleGVzLm1hcChqPT57Y29uc3QgZT1lbnRyaWVzW2pdLGFuY2hvcj1qPT09MD8nc3RhcnQnOmo9PT1lbnRyaWVzLmxlbmd0aC0xPydlbmQnOidtaWRkbGUnO3JldHVybiBgPHRleHQgeD0iJHt4KGopfSIgeT0iJHtib3R0b20rNDJ9IiB0ZXh0LWFuY2hvcj0iJHthbmNob3J9IiBmb250LXNpemU9IjExIiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSJ2YXIoLS1wbG90dGV4dCkiPiR7YXhpc1BlcmlvZFYxNChlLnBlcmlvZC5sYWJlbCkucmVwbGFjZSgneD0iMCInLCd4PSInK3goaikrJyInKX08L3RleHQ+PHRleHQgeD0iJHt4KGopfSIgeT0iJHtib3R0b20rODV9IiB0ZXh0LWFuY2hvcj0iJHthbmNob3J9IiBmb250LXNpemU9IjkuNSIgZmlsbD0idmFyKC0tcGxvdHRleHQpIj4ke2VzYyhheGlzRGF0ZXNWMTQoZS5wZXJpb2QucmFuZ2UpKX08L3RleHQ+YDt9KS5qb2luKCcnKTsKIGNvbnN0IHZhbHVlVGV4dFBhdHRlcm49Lzx0ZXh0IGRhdGEtdmFsdWUtbGFiZWwtbGE9IlteIl0rIltcc1xTXSo/PFwvdGV4dD4vZyx2YWx1ZVRleHRzPWxpbmVzLm1hdGNoKHZhbHVlVGV4dFBhdHRlcm4pfHxbXSxnZW9tZXRyeT1saW5lcy5yZXBsYWNlKHZhbHVlVGV4dFBhdHRlcm4sJycpOwogcmV0dXJue3dpZHRoLGhlaWdodCxpbm5lcjp0aWNrcytnZW9tZXRyeStwZXJpb2RzK3ZhbHVlVGV4dHMuam9pbignJyksbGFiZWxQb3NpdGlvbnMsbGFiZWxCb3hlcyxheGVzLHNjYWxlcyx2aXNpYmxlVmFsdWVzOlsuLi52aXNpYmxlVmFsdWVzXSxheGlzSW5kZXhlcyxlbnRyaWVzfTsKfQpjb25zdCBsYWJlbGVkQ2hhcnRCZWZvcmVSZXNwb25zaXZlTEE9bGFiZWxlZENoYXJ0VjQ7CmxhYmVsZWRDaGFydFY0PWZ1bmN0aW9uKHNlcmllcyxrZXksZHVhbEtleXM9bnVsbCl7CiBjb25zdCBodG1sPWxhYmVsZWRDaGFydEJlZm9yZVJlc3BvbnNpdmVMQShzZXJpZXMsa2V5LGR1YWxLZXlzKSxpZD1odG1sLm1hdGNoKC9pZD0iKGNoYXJ0djQtXGQrKSIvKT8uWzFdOwogaWYoIWlkKXJldHVybiBodG1sO3Jlc3BvbnNpdmVDaGFydE1vZGVsc0xBLnNldChpZCx7c2VyaWVzLGtleSxkdWFsS2V5cyxpZH0pOwogcmV0dXJuIGh0bWwucmVwbGFjZSgnPGRpdiBjbGFzcz0iY2hhcnRzY3JvbGwiPicsJzxkaXYgY2xhc3M9ImNoYXJ0c2Nyb2xsIHJlc3BvbnNpdmVDaGFydExBIiBkYXRhLXJlc3BvbnNpdmUtY2hhcnQtbGE9IicraWQrJyI+Jyk7Cn07CmZ1bmN0aW9uIGZpdFJlc3BvbnNpdmVDaGFydHNMQSgpewogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVzcG9uc2l2ZS1jaGFydC1sYV0nKS5mb3JFYWNoKGhvc3Q9PnsKICBjb25zdCBpZD1ob3N0LmRhdGFzZXQucmVzcG9uc2l2ZUNoYXJ0TGEsbW9kZWw9cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuZ2V0KGlkKSxzdmc9aG9zdC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtpZighbW9kZWx8fCFzdmcpcmV0dXJuOwogIGlmKGhvc3QuY2xvc2VzdCgnLmNhcmQnKT8uaGlkZGVuKXJldHVybjsKICBjb25zdCBtZWFzdXJlZD1ob3N0LmNsaWVudFdpZHRofHxob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdD8uKCkud2lkdGh8fDY0MDsKICBjb25zdCBsYXlvdXQ9cmVzcG9uc2l2ZUNoYXJ0TGF5b3V0TEEobW9kZWwsbWVhc3VyZWQpOwogIGlmKGhvc3QuZGF0YXNldC5maXRXaWR0aExhPT09U3RyaW5nKGxheW91dC53aWR0aCkmJnN2Zy5kYXRhc2V0LmZpdExhKXJldHVybjsKICBob3N0LmRhdGFzZXQuZml0V2lkdGhMYT1TdHJpbmcobGF5b3V0LndpZHRoKTtzdmcuZGF0YXNldC5maXRMYT0ndHJ1ZSc7c3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsYDAgMCAke2xheW91dC53aWR0aH0gJHtsYXlvdXQuaGVpZ2h0fWApOwogIHN2Zy5zdHlsZS53aWR0aD0nMTAwJSc7c3ZnLnN0eWxlLm1pbldpZHRoPScwJztzdmcuc3R5bGUubWF4V2lkdGg9JzEwMCUnO3N2Zy5zdHlsZS5oZWlnaHQ9bGF5b3V0LmhlaWdodCsncHgnO3N2Zy5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCd4TWlkWU1pZCBtZWV0Jyk7c3ZnLmlubmVySFRNTD1sYXlvdXQuaW5uZXI7CiAgY29uc3QgcmVhZG91dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYocmVhZG91dClyZWFkb3V0LnRleHRDb250ZW50PSdHcsOhZmljbyBjb21wbGV0byBhanVzdGFkbyBhbCBhbmNoby4gVG9jYSBvIGVuZm9jYSB1biBwdW50byBwYXJhIHZlciBzdSBwZXLDrW9kbyB5IHRvZG9zIGxvcyB2YWxvcmVzLiBFbiBzZWxlY2Npb25lcyBleHRlbnNhcyBzZSBlc3BhY2lhbiBsYXMgZXRpcXVldGFzOyBsYSB0YWJsYSBjb25zZXJ2YSB0b2RvcyBsb3MgZGF0b3MuJzsKICBjb25zdCBsZWdlbmQ9aG9zdC5jbG9zZXN0KCcuY2FyZCcpPy5xdWVyeVNlbGVjdG9yQWxsKCcubGFiZWxlZGxlZ2VuZCBpJykscGFsZXR0ZT10eXBlb2YgY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT09PSdmdW5jdGlvbic/Y2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQShtb2RlbCk6WycjMTZhOWFlJywnIzU0N2ZjNScsJyM2N2E3ODInLCcjYTU4OGMyJywnI2M3OGU0NScsJyNkNjgxNzgnLCcjNWE5ZmE0JywnI2EyYTg2NiddO2xlZ2VuZD8uZm9yRWFjaCgoaXRlbSxpKT0+aXRlbS5zdHlsZS5iYWNrZ3JvdW5kPXBhbGV0dGVbaSVwYWxldHRlLmxlbmd0aF0pOwogIGlmKHR5cGVvZiBkZWNvcmF0ZVNlcmllc0xlZ2VuZFYxMz09PSdmdW5jdGlvbicpZGVjb3JhdGVTZXJpZXNMZWdlbmRWMTMoaG9zdCxtb2RlbCk7CiB9KTsKfQpsZXQgcmVzcG9uc2l2ZUNoYXJ0T2JzZXJ2ZXJMQT1udWxsOwppZih0eXBlb2YgUmVzaXplT2JzZXJ2ZXIhPT0ndW5kZWZpbmVkJyl7CiByZXNwb25zaXZlQ2hhcnRPYnNlcnZlckxBPW5ldyBSZXNpemVPYnNlcnZlcigoKT0+Zml0UmVzcG9uc2l2ZUNoYXJ0c0xBKCkpOwogcmVzcG9uc2l2ZUNoYXJ0T2JzZXJ2ZXJMQS5vYnNlcnZlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKSk7Cn1lbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLGZpdFJlc3BvbnNpdmVDaGFydHNMQSk7CmNvbnN0IHJlbmRlckJlZm9yZVJlc3BvbnNpdmVMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3Jlc3BvbnNpdmVDaGFydE1vZGVsc0xBLmNsZWFyKCk7cmVuZGVyQmVmb3JlUmVzcG9uc2l2ZUxBKCk7aWYoZGF0YSlmaXRSZXNwb25zaXZlQ2hhcnRzTEEoKTt9OwoKZnVuY3Rpb24gcmVwb3J0Q2hhcnRTdGF0ZUxBKHRpdGxlcyl7CiBjb25zdCBrZXk9dGFiPT09J0Fuw6FsaXNpcyBwb3IgcGVyw61vZG8nPydwZXJpb2RBbmFseXNpcyc6dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/J3dlZWtseSc6J21vbnRobHknLHN0YXRlPXZpZXdTdGF0ZVtrZXldOwogaWYoIUFycmF5LmlzQXJyYXkoc3RhdGUuY2hhcnRTZWxlY3Rpb24pKXsKICBsZXQgc2F2ZWQ7dHJ5e3NhdmVkPUpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xBX1JFUE9SVF9DSEFSVFNfJytrZXkpfHwnbnVsbCcpfWNhdGNoKGUpe30KICBzdGF0ZS5jaGFydFNlbGVjdGlvbj1BcnJheS5pc0FycmF5KHNhdmVkPy5zZWxlY3Rpb24pP3NhdmVkLnNlbGVjdGlvbi5maWx0ZXIodD0+dGl0bGVzLmluY2x1ZGVzKHQpKTpbLi4udGl0bGVzXTsKICBzdGF0ZS5jaGFydENvbHVtbnM9WzEsMiw0XS5pbmNsdWRlcyhzYXZlZD8uY29sdW1ucyk/c2F2ZWQuY29sdW1uczoyOwogfQogc3RhdGUuY2hhcnRDb2x1bW5zPVsxLDIsNF0uaW5jbHVkZXMoTnVtYmVyKHN0YXRlLmNoYXJ0Q29sdW1ucykpP051bWJlcihzdGF0ZS5jaGFydENvbHVtbnMpOjI7CiByZXR1cm4ge2tleSxzdGF0ZX07Cn0KZnVuY3Rpb24gcmVtZW1iZXJSZXBvcnRDaGFydHNMQShrZXksc3RhdGUpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTEFfUkVQT1JUX0NIQVJUU18nK2tleSxKU09OLnN0cmluZ2lmeSh7c2VsZWN0aW9uOnN0YXRlLmNoYXJ0U2VsZWN0aW9uLGNvbHVtbnM6c3RhdGUuY2hhcnRDb2x1bW5zfSkpfWNhdGNoKGUpe319CmZ1bmN0aW9uIGNvbmZpZ3VyZVJlcG9ydENoYXJ0c0xBKCl7CiBpZighWydSZXBvcnRlIHNlbWFuYWwnLCdSZXBvcnRlIG1lbnN1YWwnLCdBbsOhbGlzaXMgcG9yIHBlcsOtb2RvJ10uaW5jbHVkZXModGFiKSlyZXR1cm47CiBjb25zdCBncmlkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5yZXBvcnRjaGFydHMnKTtpZighZ3JpZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcG9ydENoYXJ0c1Rvb2xiYXJMQScpKXJldHVybjsKIGNvbnN0IGNhcmRzPVsuLi5ncmlkLmNoaWxkcmVuXS5maWx0ZXIoZWw9PmVsLmNsYXNzTGlzdC5jb250YWlucygnY2FyZCcpKSx0aXRsZXM9Y2FyZHMubWFwKGNhcmQ9PmNhcmQuZGF0YXNldC5jaGFydFNsb3RUaXRsZXx8Y2FyZC5xdWVyeVNlbGVjdG9yKCdoMicpPy50ZXh0Q29udGVudC50cmltKCl8fCdHcsOhZmljbycpLGRpc3BsYXlUaXRsZXM9Y2FyZHMubWFwKChjYXJkLGkpPT4oY2FyZC5kYXRhc2V0LnBlcmlvZENoYXJ0U2xvdCE9bnVsbD8nR3LDoWZpY28gJysoaSsxKSsnIMK3ICc6JycpKyhjYXJkLnF1ZXJ5U2VsZWN0b3IoJ2gyJyk/LnRleHRDb250ZW50LnRyaW0oKXx8dGl0bGVzW2ldKSk7CiBjb25zdCB7a2V5LHN0YXRlfT1yZXBvcnRDaGFydFN0YXRlTEEodGl0bGVzKTtncmlkLmNsYXNzTGlzdC5hZGQoJ3JlcG9ydENoYXJ0R3JpZExBJyk7CiBjb25zdCB0b29sYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTt0b29sYmFyLmlkPSdyZXBvcnRDaGFydHNUb29sYmFyTEEnO3Rvb2xiYXIuY2xhc3NOYW1lPSdyZXBvcnRDaGFydHNUb29sYmFyTEEnOwogdG9vbGJhci5pbm5lckhUTUw9YDxkaXYgY2xhc3M9ImRyb3Bkb3duRmllbGRWMTMiPjxzcGFuPkdyw6FmaWNvcyBxdWUgcXVpZXJlcyB2ZXI8L3NwYW4+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiIGlkPSJyZXBvcnRDaGFydHNNZW51TEEiPjxzdW1tYXJ5PjxzcGFuIGlkPSJyZXBvcnRDaGFydHNDYXB0aW9uTEEiPjwvc3Bhbj48Yj7ilr48L2I+PC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyI+PGRpdiBjbGFzcz0iZHJvcGRvd25BY3Rpb25zVjEzIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InJlcG9ydENoYXJ0c0FsbExBIj5NYXJjYXIgdG9kb3M8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InJlcG9ydENoYXJ0c05vbmVMQSI+TGltcGlhcjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9InJlcG9ydENoYXJ0Q2hlY2tzTEEiPiR7dGl0bGVzLm1hcCgodGl0bGUsaW5kZXgpPT5gPGxhYmVsIGNsYXNzPSJjaGVja0l0ZW1WMTIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1yZXBvcnQtY2hhcnQtbGE9IiR7aW5kZXh9IiAke3N0YXRlLmNoYXJ0U2VsZWN0aW9uLmluY2x1ZGVzKHRpdGxlKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZXNjKGRpc3BsYXlUaXRsZXNbaW5kZXhdKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKX08L2Rpdj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGlkPSJyZXBvcnRDaGFydHNBcHBseUxBIj5BcGxpY2FyIHNlbGVjY2nDs248L2J1dHRvbj48L2Rpdj48L2RldGFpbHM+PC9kaXY+PGxhYmVsPkRpc3RyaWJ1Y2nDs248c2VsZWN0IGlkPSJyZXBvcnRDaGFydENvbHVtbnNMQSI+PG9wdGlvbiB2YWx1ZT0iMSI+MSBncsOhZmljbyBwb3IgZmlsYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIiPjIgcG9yIGZpbGEgwrcgY3VhdHJvIGVuIGRvcyBmaWxhczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjQiPjQgcG9yIGZpbGEgwrcgcGFudGFsbGEgYW1wbGlhPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48c3BhbiBpZD0icmVwb3J0Q2hhcnRzQ291bnRMQSIgYXJpYS1saXZlPSJwb2xpdGUiPjwvc3Bhbj5gOwogZ3JpZC5iZWZvcmUodG9vbGJhcik7JCgnI3JlcG9ydENoYXJ0Q29sdW1uc0xBJykudmFsdWU9U3RyaW5nKHN0YXRlLmNoYXJ0Q29sdW1ucyk7CiBjb25zdCBlbXB0eT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtlbXB0eS5jbGFzc05hbWU9J3JlcG9ydENoYXJ0RW1wdHlMQSc7ZW1wdHkudGV4dENvbnRlbnQ9J01hcmNhIHVubyBvIHZhcmlvcyBncsOhZmljb3MgZW4gZWwgbWVuw7ogcGFyYSBtb3N0cmFybG9zLic7Z3JpZC5hZnRlcihlbXB0eSk7CiBmdW5jdGlvbiBhcHBseSgpewogIGxldCB2aXNpYmxlPTA7Y2FyZHMuZm9yRWFjaCgoY2FyZCxpbmRleCk9PntjYXJkLmhpZGRlbj0hc3RhdGUuY2hhcnRTZWxlY3Rpb24uaW5jbHVkZXModGl0bGVzW2luZGV4XSk7aWYoIWNhcmQuaGlkZGVuKXZpc2libGUrKzt9KTsKICBncmlkLmRhdGFzZXQuY29sdW1ucz1TdHJpbmcoc3RhdGUuY2hhcnRDb2x1bW5zKTtncmlkLmhpZGRlbj0hdmlzaWJsZTtlbXB0eS5oaWRkZW49ISF2aXNpYmxlOwogICQoJyNyZXBvcnRDaGFydHNDYXB0aW9uTEEnKS50ZXh0Q29udGVudD12aXNpYmxlKycgZGUgJytjYXJkcy5sZW5ndGgrJyBzZWxlY2Npb25hZG9zJzskKCcjcmVwb3J0Q2hhcnRzQ291bnRMQScpLnRleHRDb250ZW50PXZpc2libGUrJyBncsOhZmljb3MgdmlzaWJsZXMgwrcgZWwgZGV0YWxsZSBkZWwgaW5mb3JtZSBzZSBjb25zZXJ2YSBhYmFqbyc7CiAgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhXScpLmZvckVhY2goaG9zdD0+aG9zdC5kYXRhc2V0LmZpdFdpZHRoTGE9JycpO2ZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO3JlbWVtYmVyUmVwb3J0Q2hhcnRzTEEoa2V5LHN0YXRlKTsKIH0KICQoJyNyZXBvcnRDaGFydHNBbGxMQScpLm9uY2xpY2s9KCk9PnRvb2xiYXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVwb3J0LWNoYXJ0LWxhXScpLmZvckVhY2goaW5wdXQ9PmlucHV0LmNoZWNrZWQ9dHJ1ZSk7CiAkKCcjcmVwb3J0Q2hhcnRzTm9uZUxBJykub25jbGljaz0oKT0+dG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXBvcnQtY2hhcnQtbGFdJykuZm9yRWFjaChpbnB1dD0+aW5wdXQuY2hlY2tlZD1mYWxzZSk7CiAkKCcjcmVwb3J0Q2hhcnRzQXBwbHlMQScpLm9uY2xpY2s9KCk9PntzdGF0ZS5jaGFydFNlbGVjdGlvbj1bLi4udG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZXBvcnQtY2hhcnQtbGFdOmNoZWNrZWQnKV0ubWFwKGlucHV0PT50aXRsZXNbTnVtYmVyKGlucHV0LmRhdGFzZXQucmVwb3J0Q2hhcnRMYSldKTskKCcjcmVwb3J0Q2hhcnRzTWVudUxBJykub3Blbj1mYWxzZTthcHBseSgpO307CiAkKCcjcmVwb3J0Q2hhcnRDb2x1bW5zTEEnKS5vbmNoYW5nZT1lPT57c3RhdGUuY2hhcnRDb2x1bW5zPU51bWJlcihlLnRhcmdldC52YWx1ZSk7YXBwbHkoKTt9OwogLy8gS2VlcCB0aGUgZXhhY3QgZGF0YSBhdCBoYW5kIHdpdGhvdXQgbWFraW5nIGVhY2ggY2hhcnQgY2FyZCB1bm5lY2Vzc2FyaWx5IHRhbGwuCiBjYXJkcy5mb3JFYWNoKChjYXJkLGluZGV4KT0+ewogIGNvbnN0IHZhbHVlcz1jYXJkLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydGRhdGF3cmFwJyk7aWYoIXZhbHVlcylyZXR1cm47CiAgc3RhdGUuY2hhcnRWYWx1ZXNPcGVuPz89e307Y29uc3QgZGV0YWlscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7ZGV0YWlscy5jbGFzc05hbWU9J3JlcG9ydENoYXJ0VmFsdWVzTEEnOwogIGNvbnN0IHN1bW1hcnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO3N1bW1hcnkudGV4dENvbnRlbnQ9J1ZlciB2YWxvcmVzIGV4YWN0b3MnO2RldGFpbHMuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7CiAgY29uc3Qgc2VhcmNoPXZhbHVlcy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ3RhYmxlU2VhcmNoTEEnKT92YWx1ZXMucHJldmlvdXNFbGVtZW50U2libGluZzpudWxsOwogIHZhbHVlcy5iZWZvcmUoZGV0YWlscyk7aWYoc2VhcmNoKWRldGFpbHMuYXBwZW5kQ2hpbGQoc2VhcmNoKTtkZXRhaWxzLmFwcGVuZENoaWxkKHZhbHVlcyk7ZGV0YWlscy5vcGVuPSEhc3RhdGUuY2hhcnRWYWx1ZXNPcGVuW3RpdGxlc1tpbmRleF1dOwogIGRldGFpbHMuYWRkRXZlbnRMaXN0ZW5lcigndG9nZ2xlJywoKT0+e3N0YXRlLmNoYXJ0VmFsdWVzT3Blblt0aXRsZXNbaW5kZXhdXT1kZXRhaWxzLm9wZW47fSk7CiB9KTsKIGFwcGx5KCk7Cn0KY29uc3QgcmVuZGVyQmVmb3JlUmVwb3J0U2VsZWN0b3JMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3JlbmRlckJlZm9yZVJlcG9ydFNlbGVjdG9yTEEoKTtpZihkYXRhKWNvbmZpZ3VyZVJlcG9ydENoYXJ0c0xBKCk7fTsKY29uc3QgZXhwb3J0QmVmb3JlUmVwb3J0U2VsZWN0b3JMQT0kKCcjdjJleHBvcnQnKS5vbmNsaWNrOwokKCcjdjJleHBvcnQnKS5vbmNsaWNrPWZ1bmN0aW9uKCl7CiBpZighWydSZXBvcnRlIHNlbWFuYWwnLCdSZXBvcnRlIG1lbnN1YWwnXS5pbmNsdWRlcyh0YWIpKXJldHVybiBleHBvcnRCZWZvcmVSZXBvcnRTZWxlY3RvckxBKCk7CiBjb25zdCBrZXk9dGFiPT09J1JlcG9ydGUgc2VtYW5hbCc/J3dlZWtseSc6J21vbnRobHknLHM9dmlld1N0YXRlW2tleV07CiBjb25zdCBzaGVldHM9W3tuYW1lOidEYXRvcycscm93czpleHBvcnRSb3dzfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGFyw6FtZXRybycsJ1NlbGVjY2nDs24nXSxbJ0luZm9ybWUnLHRhYl0sWydGZWNoYXMnLHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnRmlsdHJvcycsSlNPTi5zdHJpbmdpZnkocy5maWx0ZXJzKV0sWydHcsOhZmljb3MgdmlzaWJsZXMnLChzLmNoYXJ0U2VsZWN0aW9ufHxbXSkuam9pbignIC8gJyldLFsnRGlzdHJpYnVjacOzbicscy5jaGFydENvbHVtbnMrJyBwb3IgZmlsYSddLFsnQ29udGVuaWRvJywnRGF0b3MgY29uc2VydmEgdG9kb3MgbG9zIGluZGljYWRvcmVzIGRlbCBpbmZvcm1lOyBsYXMgdGFibGFzIGRlIGdyw6FmaWNvcyBpbmNsdXllbiBzb2xvIGxvcyBzZWxlY2Npb25hZG9zLiddXX1dOwogbGV0IGluZGV4PTE7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgdGFibGUnKS5mb3JFYWNoKHRhYmxlPT57aWYodGFibGUuY2xvc2VzdCgnLnJlcG9ydENoYXJ0R3JpZExBPi5jYXJkW2hpZGRlbl0nKSlyZXR1cm47Y29uc3Qgcm93cz1bLi4udGFibGUucm93c10ubWFwKHJvdz0+Wy4uLnJvdy5jZWxsc10ubWFwKGNlbGw9PihjZWxsLmlubmVyVGV4dHx8Y2VsbC50ZXh0Q29udGVudCkudHJpbSgpKSk7aWYocm93cy5sZW5ndGgpc2hlZXRzLnB1c2goe25hbWU6J1RhYmxhICcraW5kZXgrKyxyb3dzfSk7fSk7CiBkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChzaGVldHMpLCdMQS0nK2tleSsnLnhsc3gnKTsKfTsKCmxldCBtYXRyaXhJbmRleExBPW51bGwsd2Vla0xhYmVsQ2FjaGVMQT1udWxsOwpmdW5jdGlvbiBtYXRyaXhJbmRleEZhc3RMQSgpewogaWYobWF0cml4SW5kZXhMQT8ubWF0cml4PT09ZGF0YSlyZXR1cm4gbWF0cml4SW5kZXhMQTsKIGNvbnN0IGRhdGVzPW5ldyBTZXQoKSxjYXRlZ29yaWVzPW5ldyBNYXAoT2JqZWN0LmtleXMoZGltcykubWFwKGs9PltOdW1iZXIoayksbmV3IFNldCgpXSkpOwogZm9yKGNvbnN0IHIgb2YgZGF0YS5yb3dzKXtkYXRlcy5hZGQoclswXSk7Zm9yKGNvbnN0W2ssdmFsdWVzXW9mIGNhdGVnb3JpZXMpdmFsdWVzLmFkZChTdHJpbmcocltrXT8/J1NpbiBkYXRvJykpO30KIG1hdHJpeEluZGV4TEE9e21hdHJpeDpkYXRhLGRhdGVzOlsuLi5kYXRlc10uc29ydCgpLGNhdGVnb3JpZXM6bmV3IE1hcChbLi4uY2F0ZWdvcmllc10ubWFwKChbayx2XSk9PltrLFsuLi52XS5maWx0ZXIoeD0+IWlzRXhwaXJlZCh4KSkuc29ydCgoYSxiKT0+YS5sb2NhbGVDb21wYXJlKGIsdW5kZWZpbmVkLHtudW1lcmljOnRydWV9KSldKSl9O3JldHVybiBtYXRyaXhJbmRleExBOwp9CmNvbnN0IHdlZWtOdW1iZXJCZWZvcmVGYXN0TEE9d2Vla051bWJlclY4LHdlZWtOdW1iZXJDYWNoZUxBPW5ldyBNYXAoKTsKd2Vla051bWJlclY4PWZ1bmN0aW9uKGRhdGUpe2lmKCF3ZWVrTnVtYmVyQ2FjaGVMQS5oYXMoZGF0ZSkpd2Vla051bWJlckNhY2hlTEEuc2V0KGRhdGUsd2Vla051bWJlckJlZm9yZUZhc3RMQShkYXRlKSk7cmV0dXJuIHdlZWtOdW1iZXJDYWNoZUxBLmdldChkYXRlKTt9Owpjb25zdCBvcHRpb25zQmVmb3JlRmFzdExBPW9wdGlvbnNGb3I7Cm9wdGlvbnNGb3I9ZnVuY3Rpb24oayl7cmV0dXJuIGRhdGE/bWF0cml4SW5kZXhGYXN0TEEoKS5jYXRlZ29yaWVzLmdldChOdW1iZXIoaykpfHxbXTpvcHRpb25zQmVmb3JlRmFzdExBKGspO307Cm1vbnRoQ2hvaWNlc1Y4PWZ1bmN0aW9uKCl7cmV0dXJuIFsuLi5uZXcgU2V0KG1hdHJpeEluZGV4RmFzdExBKCkuZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpXTt9OwpmdW5jdGlvbiB3ZWVrTGFiZWxGYXN0TEEoeWVhcix3ZWVrKXsKIGlmKCFkYXRhKXJldHVybiB3ZWVrTGFiZWxWOCh5ZWFyLHdlZWssW10pOwogY29uc3Qgc2lnbmF0dXJlPSgkKCcjZnJvbScpPy52YWx1ZXx8JycpKyd8JysoJCgnI3RvJyk/LnZhbHVlfHwnJykrJ3wnK0pTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZS5jYWxlbmRhcnM/Lmdsb2JhbHx8e30pOwogaWYod2Vla0xhYmVsQ2FjaGVMQT8ubWF0cml4IT09ZGF0YXx8d2Vla0xhYmVsQ2FjaGVMQS5zaWduYXR1cmUhPT1zaWduYXR1cmUpewogIGNvbnN0IGRhdGVzPW5ldyBTZXQoc2xpY2VSb3dzKCkubWFwKHI9PnJbMF0pKSxtYXA9bmV3IE1hcCgpO2Zvcihjb25zdCBkYXRlIG9mIFsuLi5kYXRlc10uc29ydCgpKXtjb25zdCBrZXk9ZGF0ZS5zbGljZSgwLDQpKyd8Jyt3ZWVrTnVtYmVyVjgoZGF0ZSk7aWYoIW1hcC5oYXMoa2V5KSltYXAuc2V0KGtleSxuZXcgU2V0KCkpO21hcC5nZXQoa2V5KS5hZGQobW9udGhTaG9ydFY4W051bWJlcihkYXRlLnNsaWNlKDUsNykpLTFdKTt9CiAgd2Vla0xhYmVsQ2FjaGVMQT17bWF0cml4OmRhdGEsc2lnbmF0dXJlLG1hcH07CiB9CiBjb25zdCBtb250aHM9d2Vla0xhYmVsQ2FjaGVMQS5tYXAuZ2V0KHllYXIrJ3wnK051bWJlcih3ZWVrKSk7cmV0dXJuIG1vbnRocz9bLi4ubW9udGhzXS5qb2luKCcvJykrJy0nK051bWJlcih3ZWVrKSsnIMK3ICcreWVhcjp3ZWVrTGFiZWxWOCh5ZWFyLHdlZWssW10pOwp9CmNvbnN0IHNsaWNlQmVmb3JlRmFzdExBPXNsaWNlUm93cyxhZ2dyZWdhdGVCZWZvcmVGYXN0TEE9YWdnOwpsZXQgc2xpY2VDYWNoZUZhc3RMQT1uZXcgTWFwKCksYWdncmVnYXRlQ2FjaGVGYXN0TEE9bmV3IFdlYWtNYXAoKTsKc2xpY2VSb3dzPWZ1bmN0aW9uKGZpbHRlcnM9e30sZnJvbT0kKCcjZnJvbScpLnZhbHVlLHRvPSQoJyN0bycpLnZhbHVlKXsKIGNvbnN0IHNjb3BlPWZpbHRlcnM9PT12aWV3U3RhdGUuQS5maWx0ZXJzPydBJzpmaWx0ZXJzPT09dmlld1N0YXRlLkIuZmlsdGVycz8nQic6J2dsb2JhbCc7CiBjb25zdCBrZXk9c2NvcGUrJ3wnK2Zyb20rJ3wnK3RvKyd8JytKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSsnfCcrSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlLmNhbGVuZGFycz8uW3Njb3BlXXx8e30pOwogaWYoIXNsaWNlQ2FjaGVGYXN0TEEuaGFzKGtleSkpc2xpY2VDYWNoZUZhc3RMQS5zZXQoa2V5LHNsaWNlQmVmb3JlRmFzdExBKGZpbHRlcnMsZnJvbSx0bykpO3JldHVybiBzbGljZUNhY2hlRmFzdExBLmdldChrZXkpOwp9OwphZ2c9ZnVuY3Rpb24ocm93cyl7aWYoIWFnZ3JlZ2F0ZUNhY2hlRmFzdExBLmhhcyhyb3dzKSlhZ2dyZWdhdGVDYWNoZUZhc3RMQS5zZXQocm93cyxhZ2dyZWdhdGVCZWZvcmVGYXN0TEEocm93cykpO3JldHVybnsuLi5hZ2dyZWdhdGVDYWNoZUZhc3RMQS5nZXQocm93cyl9O307CmNvbnN0IHByZWZlcmVuY2lhbENhY2hlTEE9bmV3IFdlYWtNYXAoKSxwcmVmZXJlbmNpYWxCZWZvcmVGYXN0TEE9cHJlZmVyZW5jaWFsOwpwcmVmZXJlbmNpYWw9ZnVuY3Rpb24ocm93KXtpZighcHJlZmVyZW5jaWFsQ2FjaGVMQS5oYXMocm93KSlwcmVmZXJlbmNpYWxDYWNoZUxBLnNldChyb3cscHJlZmVyZW5jaWFsQmVmb3JlRmFzdExBKHJvdykpO3JldHVybiBwcmVmZXJlbmNpYWxDYWNoZUxBLmdldChyb3cpO307CndlZWtDaGVja3NWMTI9ZnVuY3Rpb24oc2NvcGUsbW9udGhzLHNlbGVjdGVkV2Vla3MpewogY29uc3Qgc2VsZWN0ZWQ9bW9udGhzLmxlbmd0aD9tb250aHM6bW9udGhDaG9pY2VzVjgoKSxkYXRlcz1tYXRyaXhJbmRleEZhc3RMQSgpLmRhdGVzOwogcmV0dXJuIHNlbGVjdGVkLm1hcChtb250aD0+ewogIGNvbnN0IHdlZWtzPW5ldyBNYXAoKTtmb3IoY29uc3QgZGF0ZSBvZiBkYXRlcyl7aWYoIWRhdGUuc3RhcnRzV2l0aChtb250aCkpY29udGludWU7Y29uc3Qgdz13ZWVrTnVtYmVyVjgoZGF0ZSk7aWYoIXdlZWtzLmhhcyh3KSl3ZWVrcy5zZXQodyxbXSk7d2Vla3MuZ2V0KHcpLnB1c2goZGF0ZSk7fQogIHJldHVybiBgPGRpdiBjbGFzcz0id2Vla01vbnRoVjEyIj48Yj4ke2Rpc3BsYXlEYXRlc1Y1KG1vbnRoKX08L2I+JHtbLi4ud2Vla3NdLnNvcnQoKGEsYik9PmFbMF0tYlswXSkubWFwKChbdyxkYXlzXSk9Pntjb25zdCB2YWx1ZT1tb250aCsnfCcrdztyZXR1cm4gYDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtd2Vla2NoZWNrPSIke3Njb3BlfSIgdmFsdWU9IiR7dmFsdWV9IiAke3NlbGVjdGVkV2Vla3MuaW5jbHVkZXModmFsdWUpPydjaGVja2VkJzonJ30+PHNwYW4+JHttb250aFNob3J0VjhbTnVtYmVyKG1vbnRoLnNsaWNlKDUpKS0xXX0tJHt3fSDCtyAke21vbnRoLnNsaWNlKDAsNCl9PHNtYWxsPiR7ZGlzcGxheURhdGVzVjUoZGF5c1swXSl9IOKGkiAke2Rpc3BsYXlEYXRlc1Y1KGRheXMuYXQoLTEpKX08L3NtYWxsPjwvc3Bhbj48L2xhYmVsPmA7fSkuam9pbignJyl9PC9kaXY+YDsKIH0pLmpvaW4oJycpOwp9Owpjb25zdCByZW5kZXJCZWZvcmVGYXN0TEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtzbGljZUNhY2hlRmFzdExBPW5ldyBNYXAoKTthZ2dyZWdhdGVDYWNoZUZhc3RMQT1uZXcgV2Vha01hcCgpO3JlbmRlckJlZm9yZUZhc3RMQSgpO307CgovLyBOb3JtYWxpemUgYnkgb2JzZXJ2ZWQgZGF0ZXMgYW5kIG1hY2hpbmUtZGF5czsgYWJzZW5jZSBpcyBuZXZlciB6ZXJvIGFjdGl2aXR5LgpmdW5jdGlvbiBkYWlseVBhcmtMQShyb3dzKXsKIGNvbnN0IG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgaWQ9U3RyaW5nKHJbMV0/PycnKS50cmltKCk7aWYoIWlkKWNvbnRpbnVlO2NvbnN0IGtleT1KU09OLnN0cmluZ2lmeShbclswXSxpZF0pO2lmKCFtYXAuaGFzKGtleSkpbWFwLnNldChrZXkse2lkLGRhdGU6clswXSxjb2luOjAsd2luOjAsc3BpbjowLHByaXplOjAscHJvbW86MCxwcm9tb3RlZDpmYWxzZSxsb2NhdGlvbnM6bmV3IFNldCgpfSk7Y29uc3QgZD1tYXAuZ2V0KGtleSk7Zm9yKGNvbnN0W2ssaV1vZiBbWydjb2luJywxOF0sWyd3aW4nLDE2XSxbJ3NwaW4nLDIwXSxbJ3ByaXplJywxNV1dKWRba10rPW51bShyW2ldKTtkLnByb21vKz1udW0oclsyNl0pLW51bShyWzI3XSk7ZC5wcm9tb3RlZHx8PW51bShyWzI2XSkhPT0wfHxudW0oclsyN10pIT09MDtkLmxvY2F0aW9ucy5hZGQoSlNPTi5zdHJpbmdpZnkoW3JbOV0/PycnLHJbNV0/PycnLHJbN10/PycnXSkpO31yZXR1cm4gWy4uLm1hcC52YWx1ZXMoKV07Cn0KZnVuY3Rpb24gd2Vla2RheVBhcmtMQShyb3dzKXsKIGNvbnN0IG5hbWVzPVsnTHVuZXMnLCdNYXJ0ZXMnLCdNacOpcmNvbGVzJywnSnVldmVzJywnVmllcm5lcycsJ1PDoWJhZG8nLCdEb21pbmdvJ10sbGlzdD1uYW1lcy5tYXAobmFtZT0+KHtuYW1lLHJvd3M6W10sZGF0ZXM6bmV3IFNldCgpfSkpO2Zvcihjb25zdCByIG9mIHJvd3Mpe2NvbnN0IGk9KG5ldyBEYXRlKHJbMF0rJ1QxMjowMDowMFonKS5nZXRVVENEYXkoKSs2KSU3O2lmKCFsaXN0W2ldKWNvbnRpbnVlO2xpc3RbaV0ucm93cy5wdXNoKHIpO2xpc3RbaV0uZGF0ZXMuYWRkKHJbMF0pO31yZXR1cm4gbGlzdC5tYXAoZz0+e2NvbnN0IGE9YWdnKGcucm93cyk7cmV0dXJue25hbWU6Zy5uYW1lLC4uLmEsY2FsZW5kYXJEYXlzOmcuZGF0ZXMuc2l6ZSx3aW5EYXRlOmRpdihhLndpbixnLmRhdGVzLnNpemUpLGNvaW5EYXRlOmRpdihhLmNvaW4sZy5kYXRlcy5zaXplKX07fSk7Cn0KZnVuY3Rpb24gc3RhYmlsaXR5UGFya0xBKGRheXMsbWluRGF5cz03KXsKIGNvbnN0IG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IGQgb2YgZGF5cyl7aWYoIW1hcC5oYXMoZC5pZCkpbWFwLnNldChkLmlkLFtdKTttYXAuZ2V0KGQuaWQpLnB1c2goZCk7fXJldHVybiBbLi4ubWFwXS5tYXAoKFtpZCxsaXN0XSk9Pntjb25zdCBjb3VudD1saXN0Lmxlbmd0aCxtZWFuPWxpc3QucmVkdWNlKChzLGQpPT5zK2QuY29pbiwwKS9jb3VudCxzZD1NYXRoLnNxcnQobGlzdC5yZWR1Y2UoKHMsZCk9PnMrKGQuY29pbi1tZWFuKSoqMiwwKS9jb3VudCkscG9zaXRpdmVXaW49bGlzdC5yZWR1Y2UoKHMsZCk9PnMrTWF0aC5tYXgoMCxkLndpbiksMCk7cmV0dXJue2lkLGNvdW50LG1lYW4sc2QsY3Y6Y291bnQ+PW1pbkRheXMmJm1lYW4+MD9zZC9tZWFuOm51bGwsYmVzdFdpblNoYXJlOnBvc2l0aXZlV2luP01hdGgubWF4KC4uLmxpc3QubWFwKGQ9Pk1hdGgubWF4KDAsZC53aW4pKSkvcG9zaXRpdmVXaW46bnVsbCx3aW46bGlzdC5yZWR1Y2UoKHMsZCk9PnMrZC53aW4sMCl9O30pLnNvcnQoKGEsYik9PihiLmN2Pz8tMSktKGEuY3Y/Py0xKSk7Cn0KZnVuY3Rpb24gYWN0aXZpdHlQYXJrTEEoZGF5cyxwYXJrRGF0ZXMsdGhyZXNob2xkPTAuMjUpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZighbWFwLmhhcyhkLmlkKSltYXAuc2V0KGQuaWQsW10pO21hcC5nZXQoZC5pZCkucHVzaChkKTt9cmV0dXJuIFsuLi5tYXBdLm1hcCgoW2lkLGxpc3RdKT0+e2xpc3Quc29ydCgoYSxiKT0+YS5kYXRlLmxvY2FsZUNvbXBhcmUoYi5kYXRlKSk7Y29uc3QgdmFsdWVzPWxpc3QuZmlsdGVyKGQ9PmQuY29pbj4wKS5tYXAoZD0+ZC5jb2luKS5zb3J0KChhLGIpPT5hLWIpLG49dmFsdWVzLmxlbmd0aCxtZWRpYW49bj8odmFsdWVzW01hdGguZmxvb3Iobi8yKV0rdmFsdWVzW01hdGguY2VpbChuLzIpLTFdKS8yOjAsZmlyc3Q9bGlzdFswXS5kYXRlLGxhc3Q9bGlzdC5hdCgtMSkuZGF0ZTtyZXR1cm57aWQsZmlyc3QsbGFzdCxkYXlzOmxpc3QubGVuZ3RoLG1pc3Npbmc6cGFya0RhdGVzLmZpbHRlcihkPT5kPj1maXJzdCYmZDw9bGFzdCkubGVuZ3RoLWxpc3QubGVuZ3RoLHplcm86bGlzdC5maWx0ZXIoZD0+ZC5jb2luPT09MCYmZC5zcGluPT09MCkubGVuZ3RoLGxvdzptZWRpYW4/bGlzdC5maWx0ZXIoZD0+ZC5jb2luPjAmJmQuY29pbjxtZWRpYW4qdGhyZXNob2xkKS5sZW5ndGg6MCxtZWRpYW59O30pLnNvcnQoKGEsYik9PihiLm1pc3NpbmcrYi56ZXJvK2IubG93KS0oYS5taXNzaW5nK2EuemVybythLmxvdykpOwp9CmZ1bmN0aW9uIHByb21vdGlvblBhcmtMQShkYXlzKXtyZXR1cm4gW3RydWUsZmFsc2VdLm1hcChwcm9tb3RlZD0+e2NvbnN0IGE9e25hbWU6cHJvbW90ZWQ/J0NvbiBtb3ZpbWllbnRvcyBwcm9tb2Npb25hbGVzJzonU2luIG1vdmltaWVudG9zIHByb21vY2lvbmFsZXMnLGRheXM6MCxjb2luOjAsd2luOjAsc3BpbjowLHByb21vOjB9O2Zvcihjb25zdCBkIG9mIGRheXMpaWYoZC5wcm9tb3RlZD09PXByb21vdGVkKXthLmRheXMrKztmb3IoY29uc3QgayBvZiBbJ2NvaW4nLCd3aW4nLCdzcGluJywncHJvbW8nXSlhW2tdKz1kW2tdO31yZXR1cm57Li4uYSxjZDpkaXYoYS5jb2luLGEuZGF5cyksd2Q6ZGl2KGEud2luLGEuZGF5cyksc2Q6ZGl2KGEuc3BpbixhLmRheXMpLHBvOmEuY29pbj8xLWEud2luL2EuY29pbjpudWxsLHBvbjphLmNvaW4/MS0oYS53aW4rYS5wcm9tbykvYS5jb2luOm51bGx9O30pO30KZnVuY3Rpb24gcGFyZXRvUGFya0xBKHJvd3Msa2V5LG1ldHJpYyl7Y29uc3QgbGlzdD1ncm91cHMocm93cyxyPT5TdHJpbmcocltrZXldPz8nU2luIGlkZW50aWZpY2FjacOzbicpKS5zb3J0KChhLGIpPT5iW21ldHJpY10tYVttZXRyaWNdKSxiYXNlPWxpc3QucmVkdWNlKChzLGcpPT5zK01hdGgubWF4KDAsZ1ttZXRyaWNdKSwwKTtsZXQgY3VtdWxhdGl2ZT0wO3JldHVybiBsaXN0Lm1hcChnPT57Y29uc3Qgc2hhcmU9YmFzZT9NYXRoLm1heCgwLGdbbWV0cmljXSkvYmFzZTpudWxsO2N1bXVsYXRpdmUrPXNoYXJlfHwwO3JldHVybntuYW1lOmcubmFtZSx2YWx1ZTpnW21ldHJpY10sc2hhcmUsY3VtdWxhdGl2ZTpiYXNlP2N1bXVsYXRpdmU6bnVsbH07fSk7fQpmdW5jdGlvbiBtb3Zlc1BhcmtMQShkYXlzLHdpbmRvd0RheXM9MTQpewogY29uc3QgbWFwPW5ldyBNYXAoKTtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZighbWFwLmhhcyhkLmlkKSltYXAuc2V0KGQuaWQsW10pO21hcC5nZXQoZC5pZCkucHVzaChkKTt9Y29uc3QgcmVzdWx0PVtdO2Zvcihjb25zdFtpZCxsaXN0XW9mIG1hcCl7bGlzdC5zb3J0KChhLGIpPT5hLmRhdGUubG9jYWxlQ29tcGFyZShiLmRhdGUpKTtsZXQgcHJldmlvdXM9bnVsbDtmb3IoY29uc3QgZCBvZiBsaXN0KXtpZihkLmxvY2F0aW9ucy5zaXplIT09MSl7cHJldmlvdXM9bnVsbDtjb250aW51ZTt9Y29uc3QgbG9jYXRpb249Wy4uLmQubG9jYXRpb25zXVswXTtpZihwcmV2aW91cyYmcHJldmlvdXMhPT1sb2NhdGlvbil7Y29uc3QgYT1saXN0LmZpbHRlcih4PT54LmRhdGU8ZC5kYXRlJiZ4LmRhdGU+PXNoaWZ0RGF0ZUxBKGQuZGF0ZSwtd2luZG93RGF5cykmJngubG9jYXRpb25zLnNpemU9PT0xJiZ4LmxvY2F0aW9ucy5oYXMocHJldmlvdXMpKSxiPWxpc3QuZmlsdGVyKHg9PnguZGF0ZT49ZC5kYXRlJiZ4LmRhdGU8PXNoaWZ0RGF0ZUxBKGQuZGF0ZSx3aW5kb3dEYXlzLTEpJiZ4LmxvY2F0aW9ucy5zaXplPT09MSYmeC5sb2NhdGlvbnMuaGFzKGxvY2F0aW9uKSksbWVhbj0oaXRlbXMsayk9PmRpdihpdGVtcy5yZWR1Y2UoKHMseCk9PnMreFtrXSwwKSxpdGVtcy5sZW5ndGgpO3Jlc3VsdC5wdXNoKHtpZCxkYXRlOmQuZGF0ZSxvbGQ6SlNPTi5wYXJzZShwcmV2aW91cyksbmV4dDpKU09OLnBhcnNlKGxvY2F0aW9uKSxiZWZvcmU6YS5sZW5ndGgsYWZ0ZXI6Yi5sZW5ndGgsY29pbkE6bWVhbihhLCdjb2luJyksY29pbkI6bWVhbihiLCdjb2luJyksd2luQTptZWFuKGEsJ3dpbicpLHdpbkI6bWVhbihiLCd3aW4nKX0pO31wcmV2aW91cz1sb2NhdGlvbjt9fXJldHVybiByZXN1bHQuc29ydCgoYSxiKT0+Yi5kYXRlLmxvY2FsZUNvbXBhcmUoYS5kYXRlKXx8YS5pZC5sb2NhbGVDb21wYXJlKGIuaWQpKTsKfQpmdW5jdGlvbiBxdWFsaXR5UGFya0xBKHJvd3Mpe2NvbnN0IHNlZW49bmV3IFNldCgpO2xldCBkdXBsaWNhdGVzPTAsbWlzc2luZz0wLGludmFsaWREYXRlcz0wLGludmFsaWROdW1iZXJzPTA7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7Y29uc3QgaWQ9U3RyaW5nKHJbMV0/PycnKS50cmltKCk7aWYoIWlkKW1pc3NpbmcrKztlbHNle2NvbnN0IGtleT1KU09OLnN0cmluZ2lmeShbclswXSxpZF0pO2lmKHNlZW4uaGFzKGtleSkpZHVwbGljYXRlcysrO3NlZW4uYWRkKGtleSk7fWNvbnN0IG1zPURhdGUucGFyc2UoclswXSsnVDAwOjAwOjAwWicpO2lmKCEvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChyWzBdKXx8IU51bWJlci5pc0Zpbml0ZShtcyl8fG5ldyBEYXRlKG1zKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApIT09clswXSlpbnZhbGlkRGF0ZXMrKztmb3IoY29uc3QgayBvZiBbMTUsMTYsMTgsMjAsMjYsMjddKWlmKHJba10hPW51bGwmJnJba10hPT0nJyYmKHR5cGVvZiByW2tdIT09J251bWJlcid8fCFOdW1iZXIuaXNGaW5pdGUocltrXSkpKWludmFsaWROdW1iZXJzKys7fXJldHVybntkdXBsaWNhdGVzLG1pc3NpbmcsaW52YWxpZERhdGVzLGludmFsaWROdW1iZXJzLGFtYmlndW91czpkYWlseVBhcmtMQShyb3dzKS5maWx0ZXIoZD0+ZC5sb2NhdGlvbnMuc2l6ZT4xKS5sZW5ndGh9O30KZnVuY3Rpb24gcGVyc2lzdGVudFBhcmtMQShlbnRyaWVzLHMpe3JldHVybiBlbnRyaWVzLm1hcChnPT57Y29uc3QgZGF5cz1ncm91cHMoZy5jdXJyZW50LHI9PnJbMF0pLnNvcnQoKGEsYik9PmIubmFtZS5sb2NhbGVDb21wYXJlKGEubmFtZSkpO2xldCBzdHJlYWs9MDtmb3IoY29uc3QgZCBvZiBkYXlzKXtpZihkLm5hbWUhPT1zaGlmdERhdGVMQShzLmVuZCwtc3RyZWFrKXx8Zy5vbGQ9PW51bGx8fGcub2xkPD0wfHxkW3MubWV0cmljXT09bnVsbHx8ZFtzLm1ldHJpY10+Zy5vbGQqKDEtcy50aHJlc2hvbGQvMTAwKSlicmVhaztzdHJlYWsrKzt9cmV0dXJue25hbWU6Zy5uYW1lLHN0cmVhayxvbGQ6Zy5vbGQsZGF5czpnLmRheXNCLHplcm86ZGFpbHlQYXJrTEEoZy5jdXJyZW50KS5maWx0ZXIoZD0+ZC5jb2luPT09MCYmZC5zcGluPT09MCkubGVuZ3RoLGNvdmVyYWdlOmcubWFjaGluZURheXNCLHByZXZpb3VzQ292ZXJhZ2U6Zy5tYWNoaW5lRGF5c0F9O30pLnNvcnQoKGEsYik9PmIuc3RyZWFrLWEuc3RyZWFrfHxiLnplcm8tYS56ZXJvKTt9CmNvbnN0IHBlcmNlbnRQYXJrTEE9dj0+dj09bnVsbD8n4oCUJzooMTAwKnYpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoyfSkrJyUnOwovLyBPbmx5IDUwIHJvd3MgZW50ZXIgdGhlIERPTSwgd2hpbGUgZXhwb3J0cyByZXRhaW4gdGhlIGNvbXBsZXRlIHJlcG9ydC4KZnVuY3Rpb24gcGFya1RhYmxlTEEoaG9zdCxoZWFkZXJzLHJvd3MsZm9ybWF0cz1bXSl7bGV0IHBhZ2U9MDtob3N0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0idGFibGV3cmFwIj48dGFibGU+PHRoZWFkPjx0cj4nK2hlYWRlcnMubWFwKGg9Pic8dGg+Jytlc2MoaCkrJzwvdGg+Jykuam9pbignJykrJzwvdHI+PC90aGVhZD48dGJvZHk+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9InBhcmtQYWdlc0xBIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1wcmV2PkFudGVyaW9yPC9idXR0b24+PHNwYW4+PC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW5leHQ+U2lndWllbnRlPC9idXR0b24+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57aG9zdC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmlubmVySFRNTD1yb3dzLnNsaWNlKHBhZ2UqNTAscGFnZSo1MCs1MCkubWFwKHJvdz0+Jzx0cj4nK3Jvdy5tYXAoKHYsaSk9Pic8dGQ+Jytlc2MoZm9ybWF0c1tpXT9mb3JtYXRzW2ldKHYpOnR5cGVvZiB2PT09J251bWJlcic/Zm10KHYpOnY/PyfigJQnKSsnPC90ZD4nKS5qb2luKCcnKSsnPC90cj4nKS5qb2luKCcnKXx8Jzx0cj48dGQgY29sc3Bhbj0iJytoZWFkZXJzLmxlbmd0aCsnIj5TaW4gcmVnaXN0cm9zIHBhcmEgZXN0YSBzZWxlY2Npw7NuLjwvdGQ+PC90cj4nO2hvc3QucXVlcnlTZWxlY3RvcignLnBhcmtQYWdlc0xBIHNwYW4nKS50ZXh0Q29udGVudD1yb3dzLmxlbmd0aCsnIGZpbGFzIMK3IFDDoWdpbmEgJysocGFnZSsxKSsnIGRlICcrTWF0aC5tYXgoMSxNYXRoLmNlaWwocm93cy5sZW5ndGgvNTApKTtob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByZXZdJykuZGlzYWJsZWQ9cGFnZT09PTA7aG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uZXh0XScpLmRpc2FibGVkPShwYWdlKzEpKjUwPj1yb3dzLmxlbmd0aDt9O2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcHJldl0nKS5vbmNsaWNrPSgpPT57cGFnZS0tO2RyYXcoKTt9O2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbmV4dF0nKS5vbmNsaWNrPSgpPT57cGFnZSsrO2RyYXcoKTt9O2RyYXcoKTt9CmZ1bmN0aW9uIHBhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMscm93cyxuYW1lKXtjb25zdCBidXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7YnV0dG9uLnR5cGU9J2J1dHRvbic7YnV0dG9uLnRleHRDb250ZW50PSdEZXNjYXJnYXIgZXN0ZSBhbsOhbGlzaXMgZW4gRXhjZWwnO2J1dHRvbi5vbmNsaWNrPSgpPT5kb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FuYWxpc2lzJyxyb3dzOltoZWFkZXJzLC4uLnJvd3NdfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snUGVyw61vZG8nLHNlbGVjdGVkRGF0ZVRleHRWOCgnZ2xvYmFsJyldLFsnTm90YScsJ0TDrWFzIHJlZ2lzdHJhZG9zIHkgbcOhcXVpbmFzLWTDrWE7IGRhdG9zIGF1c2VudGVzIG5vIHNlIGN1ZW50YW4gY29tbyBjZXJvcy4nXV19XSksbmFtZSsnLnhsc3gnKTtob3N0LmFwcGVuZENoaWxkKGJ1dHRvbik7fQpmdW5jdGlvbiBhZGRQYXJrRm9sZExBKGlkLHRpdGxlLGJ1aWxkKXtpZigkKCcjJytpZCkpcmV0dXJuOyQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCc8ZGV0YWlscyBjbGFzcz0iY2FyZCBwYXJrRm9sZExBIiBpZD0iJytpZCsnIj48c3VtbWFyeT4nK2VzYyh0aXRsZSkrJzwvc3VtbWFyeT48ZGl2IGNsYXNzPSJwYXJrRm9sZEJvZHlMQSI+PC9kaXY+PC9kZXRhaWxzPicpO2NvbnN0IGZvbGQ9JCgnIycraWQpO2ZvbGQub250b2dnbGU9KCk9PntpZihmb2xkLm9wZW4mJiFmb2xkLmRhdGFzZXQucmVhZHkpe2ZvbGQuZGF0YXNldC5yZWFkeT0ndHJ1ZSc7YnVpbGQoZm9sZC5xdWVyeVNlbGVjdG9yKCcucGFya0ZvbGRCb2R5TEEnKSk7fX07fQpmdW5jdGlvbiByZW5kZXJQYXJrTEEoKXsKIHZpZXdTdGF0ZS5wYXJrPz89e2ZpbHRlcnM6e30sa2luZDond2Vla2RheXMnLG1pbkRheXM6Nyxsb3dQZXJjZW50OjI1fTtjb25zdCBzPXZpZXdTdGF0ZS5wYXJrLHJvd3M9c2xpY2VSb3dzKHMuZmlsdGVycyksZGF5cz1kYWlseVBhcmtMQShyb3dzKSxraW5kcz17d2Vla2RheXM6J0TDrWFzIGRlIGxhIHNlbWFuYScsc3RhYmlsaXR5OidFc3RhYmlsaWRhZCBwb3IgbcOhcXVpbmEnLGFjdGl2aXR5OidBY3RpdmlkYWQgYmFqYSBvIHNpbiByZWdpc3RybycscHJvbW90aW9uczonUHJvbW9jaW9uZXMgeSByZW5kaW1pZW50byd9OwogZG9jdW1lbnQuYm9keS5kYXRhc2V0LnZpZXc9dGFiOyQoJyN0aXRsZScpLnRleHRDb250ZW50PSdBbsOhbGlzaXMgZGVsIHBhcnF1ZSc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7JCgnI2NvbnRyb2xzJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7JCgnI2ZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICQoJyNjb250ZW50JykuaW5uZXJIVE1MPWJhbm5lcignQW7DoWxpc2lzIGRlbCBwYXJxdWUnLCdTZWxlY2Npb25hIHVuIGFuw6FsaXNpcyB5IHV0aWxpemEgbGFzIGZlY2hhcyBnZW5lcmFsZXMgeSBmaWx0cm9zIGRlIGVzdGEgcGVzdGHDsWEuJykrYDxzZWN0aW9uIGNsYXNzPSJjYXJkIj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPiR7c2VsZWN0b3IoJ0Fuw6FsaXNpcycsJ3BhcmtLaW5kTEEnLHMua2luZCxraW5kcyl9PGxhYmVsPk3DrW5pbW8gZGUgZMOtYXMgcGFyYSBlc3RhYmlsaWRhZDxpbnB1dCBpZD0icGFya01pbkRheXNMQSIgdHlwZT0ibnVtYmVyIiBtaW49IjIiIG1heD0iMzY2IiB2YWx1ZT0iJHtzLm1pbkRheXN9Ij48L2xhYmVsPjxsYWJlbD5BY3RpdmlkYWQgYmFqYTogbWVub3MgZGVsICUgZGUgc3UgbWVkaWFuYTxpbnB1dCBpZD0icGFya0xvd0xBIiB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSI5OSIgdmFsdWU9IiR7cy5sb3dQZXJjZW50fSI+PC9sYWJlbD48YnV0dG9uIGlkPSJwYXJrQXBwbHlMQSI+QXBsaWNhcjwvYnV0dG9uPjwvZGl2PjxkZXRhaWxzIGNsYXNzPSJjb21wYWN0Rm9sZExBIj48c3VtbWFyeT5GaWx0cmFyIG3DoXF1aW5hcywgYmFuY29zLCBtYXJjYXMgeSB1YmljYWNpb25lczwvc3VtbWFyeT48ZGl2IGNsYXNzPSJmaWx0ZXJncmlkIj4ke2ZpbHRlckZpZWxkcyhzLCdwYXJrJyxbMSwyLDMsNCw5LDUsN10pfTwvZGl2PjwvZGV0YWlscz48L3NlY3Rpb24+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj4ke2tpbmRzW3Mua2luZF19PC9oMj48cCBpZD0icGFya0hlbHBMQSIgY2xhc3M9InNpZ25hbG5vdGUiPjwvcD48ZGl2IGlkPSJwYXJrUmVzdWx0c0xBIj48L2Rpdj48L3NlY3Rpb24+YDsKIGxldCBoZWFkZXJzLGJvZHksZm9ybWF0cz1bXTsKIGlmKHMua2luZD09PSd3ZWVrZGF5cycpe2hlYWRlcnM9WydEw61hJywnRmVjaGFzIGNvbiBkYXRvcycsJ03DoXF1aW5hcy1kw61hJywnV2luIHRvdGFsIENMUCcsJ0NvaW4gSW4gdG90YWwgQ0xQJywnV2luIHBvciBmZWNoYSBDTFAnLCdDb2luIEluIHBvciBmZWNoYSBDTFAnLCdXaW4gLyBtw6FxdWluYS1kw61hJywnQ29pbiBJbiAvIG3DoXF1aW5hLWTDrWEnLCdQYXlvdXQnXTtib2R5PXdlZWtkYXlQYXJrTEEocm93cykubWFwKGc9PltnLm5hbWUsZy5jYWxlbmRhckRheXMsZy5kYXlzLGcud2luLGcuY29pbixnLndpbkRhdGUsZy5jb2luRGF0ZSxnLndkLGcuY2QsZy5wb10pO2Zvcm1hdHNbOV09cGVyY2VudFBhcmtMQTskKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50PSdDb21wYXJhIHByb21lZGlvcyBwb3IgZmVjaGEgbyBtw6FxdWluYS1kw61hOiBsb3MgdG90YWxlcyBkZXBlbmRlbiBkZSBjdcOhbnRvcyBsdW5lcywgbWFydGVzLCBldGMuIGhheWEgZW4gbGEgc2VsZWNjacOzbi4nO30KIGVsc2UgaWYocy5raW5kPT09J3N0YWJpbGl0eScpe2hlYWRlcnM9WydNw6FxdWluYScsJ0TDrWFzIHJlZ2lzdHJhZG9zJywnQ29pbiBJbiBtZWRpbyBkaWFyaW8nLCdEZXN2aWFjacOzbiBlc3TDoW5kYXIgZGlhcmlhJywnVmFyaWFiaWxpZGFkIENvaW4gSW4gKENWKScsJ01heW9yIGTDrWEgLyBXaW4gcG9zaXRpdm8nLCdXaW4gdG90YWwgQ0xQJ107Ym9keT1zdGFiaWxpdHlQYXJrTEEoZGF5cyxzLm1pbkRheXMpLm1hcChnPT5bZy5pZCxnLmNvdW50LGcubWVhbixnLnNkLGcuY3YsZy5iZXN0V2luU2hhcmUsZy53aW5dKTtmb3JtYXRzWzRdPXBlcmNlbnRQYXJrTEE7Zm9ybWF0c1s1XT1wZXJjZW50UGFya0xBOyQoJyNwYXJrSGVscExBJykudGV4dENvbnRlbnQ9J0NWID0gZGVzdmlhY2nDs24gZXN0w6FuZGFyIHBvYmxhY2lvbmFsIC8gcHJvbWVkaW8gZGlhcmlvIGRlIENvaW4gSW4uIFNlIG9jdWx0YSBjb24gcG9jb3MgZMOtYXMgbyBwcm9tZWRpbyBubyBwb3NpdGl2by4gTGEgY29uY2VudHJhY2nDs24gZGUgV2luIHVzYSBzb2xvIGTDrWFzIGNvbiBXaW4gcG9zaXRpdm87IG5vIGV4cGxpY2Egc3VzIGNhdXNhcy4nO30KIGVsc2UgaWYocy5raW5kPT09J2FjdGl2aXR5Jyl7aGVhZGVycz1bJ03DoXF1aW5hJywnUHJpbWVyIHJlZ2lzdHJvJywnw5psdGltbyByZWdpc3RybycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywnRMOtYXMgaW50ZXJtZWRpb3Mgc2luIHJlZ2lzdHJvJywnRMOtYXMgY29uIENvaW4gSW4geSBzcGlucyBjZXJvJywnRMOtYXMgY29uIENvaW4gSW4gYmFqbycsJ01lZGlhbmEgQ29pbiBJbiBwb3NpdGl2byddO2JvZHk9YWN0aXZpdHlQYXJrTEEoZGF5cyxbLi4ubmV3IFNldChzbGljZVJvd3MoKS5tYXAocj0+clswXSkpXS5zb3J0KCkscy5sb3dQZXJjZW50LzEwMCkubWFwKGc9PltnLmlkLGcuZmlyc3QsZy5sYXN0LGcuZGF5cyxnLm1pc3NpbmcsZy56ZXJvLGcubG93LGcubWVkaWFuXSk7JCgnI3BhcmtIZWxwTEEnKS50ZXh0Q29udGVudD0nU2luIHJlZ2lzdHJvOiBmZWNoYSBjb24gZGF0b3MgZGVsIHBhcnF1ZSBlbnRyZSBlbCBwcmltZXIgeSDDumx0aW1vIHJlZ2lzdHJvIGRlIGVzYSBtw6FxdWluYS4gQ2VybzogZXhpc3RlIHJlZ2lzdHJvIGNvbiBDb2luIEluIHkgc3BpbnMgaWd1YWxlcyBhIGNlcm8uIEJham86IENvaW4gSW4gcG9zaXRpdm8gaW5mZXJpb3IgYWwgdW1icmFsIGRlIHN1IHByb3BpYSBtZWRpYW5hIHBvc2l0aXZhLiBOaW5ndW5vIGNvbmZpcm1hIHVuYSBmYWxsYSB0w6ljbmljYS4nO30KIGVsc2V7aGVhZGVycz1bJ1RpcG8gZGUgbcOhcXVpbmEtZMOtYScsJ03DoXF1aW5hcy1kw61hJywnQ29pbiBJbiBDTFAnLCdXaW4gQ0xQJywnUHJvbW8gbmV0YSBDTFAnLCdDb2luIEluIC8gbcOhcXVpbmEtZMOtYScsJ1dpbiAvIG3DoXF1aW5hLWTDrWEnLCdTcGlucyAvIG3DoXF1aW5hLWTDrWEnLCdQYXlvdXQnLCdQYXlvdXQgY29uIE5DQyddO2JvZHk9cHJvbW90aW9uUGFya0xBKGRheXMpLm1hcChnPT5bZy5uYW1lLGcuZGF5cyxnLmNvaW4sZy53aW4sZy5wcm9tbyxnLmNkLGcud2QsZy5zZCxnLnBvLGcucG9uXSk7Zm9ybWF0c1s4XT1mb3JtYXRzWzldPXBlcmNlbnRQYXJrTEE7JCgnI3BhcmtIZWxwTEEnKS50ZXh0Q29udGVudD0nQ29uIHByb21vY2nDs24gc2lnbmlmaWNhIGFsZ8O6biBtb3ZpbWllbnRvIFByb21vIEluIHUgT3V0LCBpbmNsdXNvIGN1YW5kbyBlbCBuZXRvIGVzIGNlcm8uIENvbXBhcmFjacOzbiBkZXNjcmlwdGl2YTogbm8gbWlkZSBlZmVjdG8gY2F1c2FsIG5pIHJlbnRhYmlsaWRhZCBkZSBsYSBwcm9tb2Npw7NuIHNpbiBzdXMgY29zdG9zIHkgY29uZGljaW9uZXMuJzt9CiBleHBvcnRSb3dzPVtoZWFkZXJzLC4uLmJvZHldO3BhcmtUYWJsZUxBKCQoJyNwYXJrUmVzdWx0c0xBJyksaGVhZGVycyxib2R5LGZvcm1hdHMpO2JpbmRGaWx0ZXJzKCk7JCgnI3BhcmtLaW5kTEEnKS5vbmNoYW5nZT1lPT57cy5raW5kPWUudGFyZ2V0LnZhbHVlO3JlbmRlcigpO307JCgnI3BhcmtBcHBseUxBJykub25jbGljaz0oKT0+e3MubWluRGF5cz1NYXRoLm1heCgyLE1hdGgubWluKDM2NixOdW1iZXIoJCgnI3BhcmtNaW5EYXlzTEEnKS52YWx1ZSl8fDcpKTtzLmxvd1BlcmNlbnQ9TWF0aC5tYXgoMSxNYXRoLm1pbig5OSxOdW1iZXIoJCgnI3BhcmtMb3dMQScpLnZhbHVlKXx8MjUpKTtyZW5kZXIoKTt9OyQoJyNjb250ZW50JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJyxhY3RpdmVGaWx0ZXJzTEEoKSk7Cn0KY29uc3Qgc3VtbWFyeUJlZm9yZVBhcmtMQT1zdW1tYXJ5VmlldzsKc3VtbWFyeVZpZXc9ZnVuY3Rpb24oKXtzdW1tYXJ5QmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgncGFyZXRvUGFya0xBJywnQ29uY2VudHJhY2nDs24gZGVsIHJlc3VsdGFkbyDCtyBQYXJldG8gcG9yIG3DoXF1aW5hcyB5IGJhbmNvcycsaG9zdD0+e2hvc3QuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPicrc2VsZWN0b3IoJ0FncnVwYXInLCdwYXJldG9Hcm91cExBJywnMScsezE6J03DoXF1aW5hJyw5OidCYW5jbyd9KStzZWxlY3RvcignSW5kaWNhZG9yJywncGFyZXRvTWV0cmljTEEnLCdjb2luJyx7Y29pbjonQ29pbiBJbicsd2luOidXaW4gb3BlcmFjaW9uYWwnfSkrJzwvZGl2PjxwIGNsYXNzPSJzaWduYWxub3RlIj5Qb3JjZW50YWplcyBzb2JyZSBjb250cmlidWNpb25lcyBwb3NpdGl2YXMuIExvcyBncnVwb3MgY29uIFdpbiBuZWdhdGl2byBzZSBtdWVzdHJhbiwgcGVybyBubyBhdW1lbnRhbiBsYSBiYXNlIG5pIGVsIGFjdW11bGFkby48L3A+PGRpdiBkYXRhLXBhcmV0b3RhYmxlPjwvZGl2PjxkaXYgZGF0YS1wYXJldG9leHBvcnQ+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57Y29uc3QgbWV0cmljPSQoJyNwYXJldG9NZXRyaWNMQScpLnZhbHVlLGhlYWRlcnM9WydHcnVwbycsbWV0cmljc1ttZXRyaWNdKycgQ0xQJywnUGFydGljaXBhY2nDs24gcG9zaXRpdmEnLCdBY3VtdWxhZG8gcG9zaXRpdm8nXSxyb3dzPXBhcmV0b1BhcmtMQShzbGljZVJvd3MoKSxOdW1iZXIoJCgnI3BhcmV0b0dyb3VwTEEnKS52YWx1ZSksbWV0cmljKS5tYXAoZz0+W2cubmFtZSxnLnZhbHVlLGcuc2hhcmUsZy5jdW11bGF0aXZlXSk7cGFya1RhYmxlTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYXJldG90YWJsZV0nKSxoZWFkZXJzLHJvd3MsW251bGwsbnVsbCxwZXJjZW50UGFya0xBLHBlcmNlbnRQYXJrTEFdKTtob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhcmV0b2V4cG9ydF0nKS5pbm5lckhUTUw9Jyc7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtcGFyZXRvZXhwb3J0XScpLGhlYWRlcnMscm93cywnTEEtUGFyZXRvJyk7fTskKCcjcGFyZXRvR3JvdXBMQScpLm9uY2hhbmdlPWRyYXc7JCgnI3BhcmV0b01ldHJpY0xBJykub25jaGFuZ2U9ZHJhdztkcmF3KCk7fSk7fTsKY29uc3QgY29tcGFyZUJlZm9yZVBhcmtMQT1jb21wYXJlVmlldzsKY29tcGFyZVZpZXc9ZnVuY3Rpb24oKXtjb21wYXJlQmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgnbW92ZXNQYXJrTEEnLCdSZXViaWNhY2lvbmVzIGRldGVjdGFkYXMgwrcgY29tcGFyYXIgYW50ZXMgeSBkZXNwdcOpcycsaG9zdD0+e2hvc3QuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPicrc2VsZWN0b3IoJ1ZlbnRhbmEgYW50ZXMgeSBkZXNwdcOpcycsJ21vdmVEYXlzTEEnLCcxNCcsezc6JzcgZMOtYXMnLDE0OicxNCBkw61hcycsMjg6JzI4IGTDrWFzJ30pKyc8L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+Q2FtYmlvcyBkZSBiYW5jbywgc2VjdG9yIG8gc2Fsw7NuIG9ic2VydmFkb3MgZW4gdG9kbyBlbCBoaXN0w7NyaWNvLiBMYSBmZWNoYSBlcyBlbCBwcmltZXIgcmVnaXN0cm8gZW4gbGEgbnVldmEgdWJpY2FjacOzbiwgbm8gY29uZmlybWEgZWwgbW9tZW50byBkZWwgdHJhc2xhZG8uIFNlIGRlc2NhcnRhbiBkw61hcyBjb24gdWJpY2FjaW9uZXMgY29udHJhZGljdG9yaWFzLiBQcm9tZWRpb3MgcG9yIGTDrWEgcmVnaXN0cmFkbzogY29tcGFyYSBsYSBjb2JlcnR1cmEgYW50ZXMgZGUgY29uY2x1aXIuPC9wPjxkaXYgZGF0YS1tb3ZldGFibGU+PC9kaXY+PGRpdiBkYXRhLW1vdmVleHBvcnQ+PC9kaXY+Jztjb25zdCBkcmF3PSgpPT57Y29uc3QgaGVhZGVycz1bJ03DoXF1aW5hJywnUHJpbWVyIHJlZ2lzdHJvIG51ZXZhIHViaWNhY2nDs24nLCdBbnRlczogYmFuY28gLyBzZWN0b3IgLyBzYWzDs24nLCdEZXNwdcOpczogYmFuY28gLyBzZWN0b3IgLyBzYWzDs24nLCdEw61hcyBhbnRlcycsJ0TDrWFzIGRlc3B1w6lzJywnQ29pbiBJbi9kw61hIGFudGVzJywnQ29pbiBJbi9kw61hIGRlc3B1w6lzJywnV2luL2TDrWEgYW50ZXMnLCdXaW4vZMOtYSBkZXNwdcOpcyddLHJvd3M9bW92ZXNQYXJrTEEoZGFpbHlQYXJrTEEoZGF0YS5yb3dzKSxOdW1iZXIoJCgnI21vdmVEYXlzTEEnKS52YWx1ZSkpLm1hcChtPT5bbS5pZCxtLmRhdGUsbS5vbGQuam9pbignIC8gJyksbS5uZXh0LmpvaW4oJyAvICcpLG0uYmVmb3JlLG0uYWZ0ZXIsbS5jb2luQSxtLmNvaW5CLG0ud2luQSxtLndpbkJdKTtwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vdmV0YWJsZV0nKSxoZWFkZXJzLHJvd3MpO2hvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW92ZWV4cG9ydF0nKS5pbm5lckhUTUw9Jyc7cGFya0V4cG9ydEJ1dHRvbkxBKGhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW92ZWV4cG9ydF0nKSxoZWFkZXJzLHJvd3MsJ0xBLVJldWJpY2FjaW9uZXMnKTt9OyQoJyNtb3ZlRGF5c0xBJykub25jaGFuZ2U9ZHJhdztkcmF3KCk7fSk7fTsKY29uc3QgcHJpemVzQmVmb3JlUGFya0xBPXJlbmRlclByaXplc0xBOwpyZW5kZXJQcml6ZXNMQT1mdW5jdGlvbigpe3ByaXplc0JlZm9yZVBhcmtMQSgpO2FkZFBhcmtGb2xkTEEoJ3ByaXplc0FjdGl2aXR5TEEnLCdQcmVtaW9zIGZyZW50ZSBhIGFjdGl2aWRhZCDCtyBzZW1hbmFzIHkgbcOhcXVpbmFzJyxob3N0PT57Y29uc3Qgcm93cz1jdXJyZW50UHJpemVSZXBvcnRMQS5yb3dzLGhlYWRlcnM9WydNw6FxdWluYScsJ1ByZW1pb3MgbmV0b3MgQ0xQJywnQ29pbiBJbiBDTFAnLCdTcGlucycsJ1ByZW1pb3MgLyBDb2luIEluJywnUHJlbWlvcyBwb3IgMS4wMDAgc3BpbnMnLCdQcmVtaW9zIC8gQ29pbiBJbiBoaXN0w7NyaWNvIGRlIG3DoXF1aW5hJ10saGlzdG9yeT1uZXcgTWFwKGdyb3VwcyhkYXRhLnJvd3Mscj0+U3RyaW5nKHJbMV0/PydTaW4gaWRlbnRpZmljYWNpw7NuJykpLm1hcChnPT5bZy5uYW1lLGRpdihnLnByaXplLGcuY29pbildKSksYm9keT1ncm91cHMocm93cyxyPT5TdHJpbmcoclsxXT8/J1NpbiBpZGVudGlmaWNhY2nDs24nKSkuc29ydCgoYSxiKT0+Yi5wcml6ZS1hLnByaXplKS5tYXAoZz0+W2cubmFtZSxnLnByaXplLGcuY29pbixnLnNwaW4sZGl2KGcucHJpemUsZy5jb2luKSxnLnNwaW4/Zy5wcml6ZS9nLnNwaW4qMTAwMDpudWxsLGhpc3RvcnkuZ2V0KGcubmFtZSldKSx0b3RhbD1hZ2cocm93cyk7aG9zdC5pbm5lckhUTUw9JzxwIGNsYXNzPSJzaWduYWxub3RlIj5Vc2EgbGFzIHNlbWFuYXMgeSBmaWx0cm9zIHNlbGVjY2lvbmFkb3MgYXJyaWJhLiBQcmVtaW9zIG5ldG9zIGluY2x1eWVuIGFqdXN0ZXMgbmVnYXRpdm9zLiBMYSByZWZlcmVuY2lhIGhpc3TDs3JpY2EgdXNhIHRvZG9zIGxvcyBkw61hcyBjYXJnYWRvcyBkZSBsYSBtw6FxdWluYSwgaW5jbHVpZGEgbGEgc2VsZWNjacOzbjsgbm8gY2xhc2lmaWNhIHRpcG9zIGRlIHByZW1pb3MuPC9wPicrc3RhdENhcmRzKFtbJ1BSRU1JT1MgLyBDT0lOIElOJyxwZXJjZW50UGFya0xBKGRpdih0b3RhbC5wcml6ZSx0b3RhbC5jb2luKSksJ1Byb3BvcmNpw7NuIHNvYnJlIGVsIENvaW4gSW4gc2VsZWNjaW9uYWRvJ10sWydQUkVNSU9TIC8gMS4wMDAgU1BJTlMnLGZtdCh0b3RhbC5zcGluP3RvdGFsLnByaXplL3RvdGFsLnNwaW4qMTAwMDpudWxsKSwnQ0xQIHBvciBtaWwgc3BpbnMnXV0pKyc8ZGl2IGRhdGEtcHJpemVzYWN0aXZpdHk+PC9kaXY+JztwYXJrVGFibGVMQShob3N0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByaXplc2FjdGl2aXR5XScpLGhlYWRlcnMsYm9keSxbbnVsbCxudWxsLG51bGwsbnVsbCxwZXJjZW50UGFya0xBLG51bGwscGVyY2VudFBhcmtMQV0pO3BhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMsYm9keSwnTEEtUHJlbWlvcy1hY3RpdmlkYWQnKTt9KTt9Owpjb25zdCBhbGVydHNCZWZvcmVQYXJrTEE9cmVuZGVyQWxlcnRzTEE7CnJlbmRlckFsZXJ0c0xBPWZ1bmN0aW9uKCl7YWxlcnRzQmVmb3JlUGFya0xBKCk7YWRkUGFya0ZvbGRMQSgncGVyc2lzdGVudFBhcmtMQScsJ1BlcnNpc3RlbmNpYSBkZSBjYcOtZGFzIHkgcmVnaXN0cm9zIGRlIGFjdGl2aWRhZCBjZXJvJyxob3N0PT57Y29uc3QgaGVhZGVycz1bJ0dydXBvJywnRMOtYXMgY29uc2VjdXRpdm9zIGRlIGNhw61kYSBoYXN0YSBmZWNoYSBmaW5hbCcsJ0Jhc2UgYW50ZXJpb3IgLyBtw6FxdWluYS1kw61hJywnRMOtYXMgYWN0dWFsZXMgcmVnaXN0cmFkb3MnLCdNw6FxdWluYXMtZMOtYSBjb24gYWN0aXZpZGFkIGNlcm8nLCdNw6FxdWluYXMtZMOtYSBhY3R1YWxlcycsJ03DoXF1aW5hcy1kw61hIGFudGVyaW9yZXMnXSxyb3dzPXBlcnNpc3RlbnRQYXJrTEEoYWxlcnRSZXBvcnRMQS5lbnRyaWVzLGFsZXJ0U2V0dGluZ3NMQSgpKS5tYXAoZz0+W2cubmFtZSxnLnN0cmVhayxnLm9sZCxnLmRheXMsZy56ZXJvLGcuY292ZXJhZ2UsZy5wcmV2aW91c0NvdmVyYWdlXSk7aG9zdC5pbm5lckhUTUw9JzxwIGNsYXNzPSJzaWduYWxub3RlIj5MYSByYWNoYSBjb21wYXJhIGNhZGEgZMOtYSBjb24gZWwgcHJvbWVkaW8gYW50ZXJpb3IgeSBlbCB1bWJyYWwgY29uZmlndXJhZG8uIFNvbG8gY3VlbnRhIGTDrWFzIGNvbnNlY3V0aXZvcyBoYXN0YSBsYSBmZWNoYSBmaW5hbDsgbG9zIGTDrWFzIHNpbiByZWdpc3Ryb3MgaW50ZXJydW1wZW4gbGEgcmFjaGEuIENlcm8gcmVxdWllcmUgQ29pbiBJbiB5IHNwaW5zIGNlcm87IG5vIHNlIGludGVycHJldGEgY29tbyBhdmVyw61hLjwvcD48ZGl2IGRhdGEtcGVyc2lzdGVudHRhYmxlPjwvZGl2Pic7cGFya1RhYmxlTEEoaG9zdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wZXJzaXN0ZW50dGFibGVdJyksaGVhZGVycyxyb3dzKTtwYXJrRXhwb3J0QnV0dG9uTEEoaG9zdCxoZWFkZXJzLHJvd3MsJ0xBLVBlcnNpc3RlbmNpYS1hbGVydGFzJyk7fSk7fTsKY29uc3QgZXh0cmFCZWZvcmVQYXJrTEE9ZXh0cmFSZXBvcnRzOwpleHRyYVJlcG9ydHM9ZnVuY3Rpb24oKXtleHRyYUJlZm9yZVBhcmtMQSgpO2lmKHZpZXdTdGF0ZS5leHRyYS5raW5kPT09J3F1YWxpdHknKWFkZFBhcmtGb2xkTEEoJ3F1YWxpdHlQYXJrTEEnLCdDYWxpZGFkIGRlbCBoaXN0w7NyaWNvIMK3IGlkZW50aWZpY2Fkb3JlcywgZHVwbGljYWRvcyB5IHViaWNhY2lvbmVzJyxob3N0PT57Y29uc3QgcT1xdWFsaXR5UGFya0xBKHNsaWNlUm93cygpKSxoZWFkZXJzPVsnQ29udHJvbCcsJ0NhbnRpZGFkJywnSW50ZXJwcmV0YWNpw7NuJ10scm93cz1bWydGaWxhcyBhZGljaW9uYWxlcyBkZSB1bmEgbcOhcXVpbmEgeSBmZWNoYScscS5kdXBsaWNhdGVzLCdSZXZpc2FyIGdyYW51bGFyaWRhZDsgbm8gc2UgZWxpbWluYW4gYXV0b23DoXRpY2FtZW50ZSddLFsnRmlsYXMgc2luIG3DoXF1aW5hJyxxLm1pc3NpbmcsJ0V4Y2x1aWRhcyBkZWwgYW7DoWxpc2lzIHBvciBtw6FxdWluYS1kw61hIGRlIGVzdGEgbnVldmEgcGVzdGHDsWEnXSxbJ0ZlY2hhcyBpbnbDoWxpZGFzJyxxLmludmFsaWREYXRlcywnU29icmUgbGEgbWF0cml6IHlhIGNhcmdhZGEnXSxbJ0NlbGRhcyBudW3DqXJpY2FzIGludsOhbGlkYXMnLHEuaW52YWxpZE51bWJlcnMsJ1ByZW1pb3MsIFdpbiwgQ29pbiBJbiwgc3BpbnMgeSBwcm9tb2Npb25lcyddLFsnTcOhcXVpbmFzLWTDrWEgY29uIHViaWNhY2lvbmVzIGNvbnRyYWRpY3RvcmlhcycscS5hbWJpZ3VvdXMsJ1NlIG9taXRlbiBhbCBkZXRlY3RhciB0cmFzbGFkb3MnXV07cGFya1RhYmxlTEEoaG9zdCxoZWFkZXJzLHJvd3MpO3BhcmtFeHBvcnRCdXR0b25MQShob3N0LGhlYWRlcnMscm93cywnTEEtQ2FsaWRhZCcpO30pO307CmNvbnN0IGZpbHRlcnNCZWZvcmVQYXJrTEE9YWN0aXZlRmlsdGVyc0xBOwphY3RpdmVGaWx0ZXJzTEE9ZnVuY3Rpb24oKXtpZih0YWIhPT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXJldHVybiBmaWx0ZXJzQmVmb3JlUGFya0xBKCk7Y29uc3Qgcz12aWV3U3RhdGUucGFya3x8e2ZpbHRlcnM6e319LGxhYmVscz1PYmplY3QuZW50cmllcyhzLmZpbHRlcnMpLmZpbHRlcigoWyx2XSk9PnYubGVuZ3RoKS5tYXAoKFtrLHZdKT0+ZGltc1trXSsnOiAnK3Yuam9pbignLCAnKSk7cmV0dXJuICc8ZGl2IGNsYXNzPSJhY3RpdmVGaWx0ZXJzTEEiPjxiPkNvbnN1bHRhIGFjdHVhbDwvYj48c3Bhbj4nK2VzYyhzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpKSsnPC9zcGFuPicrbGFiZWxzLm1hcCh2PT4nPHNwYW4+Jytlc2ModikrJzwvc3Bhbj4nKS5qb2luKCcnKSsnPC9kaXY+Jzt9Owpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJNZXRvZG9sb2fDrWEiXScpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCc8YnV0dG9uIGRhdGEtdGFiPSJBbsOhbGlzaXMgZGVsIHBhcnF1ZSI+4panICZuYnNwOyBBbsOhbGlzaXMgZGVsIHBhcnF1ZTwvYnV0dG9uPicpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IkFuw6FsaXNpcyBkZWwgcGFycXVlIl0nKS5vbmNsaWNrPSgpPT5hY3RpdmF0ZVRhYlYzKCdBbsOhbGlzaXMgZGVsIHBhcnF1ZScpOwpjb25zdCByZW5kZXJCZWZvcmVQYXJrTEE9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtyZW5kZXJCZWZvcmVQYXJrTEEoKTtpZihkYXRhJiZ0YWI9PT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXtyZW5kZXJQYXJrTEEoKTtmb3JtYXRUZXh0RGF0ZXNWNSgkKCcjY29udGVudCcpKTt9fTsKY29uc3QgZXhwb3J0QmVmb3JlUGFya0xBPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXtpZih0YWIhPT0nQW7DoWxpc2lzIGRlbCBwYXJxdWUnKXJldHVybiBleHBvcnRCZWZvcmVQYXJrTEEoKTtkb3dubG9hZEJsb2JWOCh3b3JrYm9va0Jsb2JWOChbe25hbWU6J0FuYWxpc2lzIGRlbCBwYXJxdWUnLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0NvbnN1bHRhJyxyb3dzOltbJ1BlcsOtb2RvJyxzZWxlY3RlZERhdGVUZXh0VjgoJ2dsb2JhbCcpXSxbJ0NvbmZpZ3VyYWNpw7NuJyxKU09OLnN0cmluZ2lmeSh2aWV3U3RhdGUucGFyayldLFsnTGltaXRhY2lvbmVzJywkKCcjcGFya0hlbHBMQScpLnRleHRDb250ZW50XV19XSksJ0xBLUFuYWxpc2lzLWRlbC1wYXJxdWUueGxzeCcpO307Cgpjb25zdCBtZXRyaWNDb2xvcnNWaXN1YWxMQT17Y29pbjonIzAwOGY5NScsd2luOicjMzY1ZmI2JyxwbzonI2E4NzUxNCcscG9uOicjODA1N2IzJyxkZXY6JyNiMjRkNzAnLGJldDonIzI0N2M5YicscHJpemU6JyM4MTU0YWEnLHByb21vOicjOWE2NDFlJyxzcGluOicjMzc4MTZjJyxvY2M6JyM1MzZjODQnfTsKZnVuY3Rpb24gbWV0cmljVmlzdWFsTEEobGFiZWwpe2NvbnN0IHRleHQ9U3RyaW5nKGxhYmVsKS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCcnKS50b1VwcGVyQ2FzZSgpO2lmKC9ERVNWSUFDSU9OLy50ZXN0KHRleHQpKXJldHVybiAnZGV2JztpZigvUEFZT1VULipOQ0MvLnRlc3QodGV4dCkpcmV0dXJuICdwb24nO2lmKC9QQVlPVVQvLnRlc3QodGV4dCkpcmV0dXJuICdwbyc7aWYoL0NPSU4gSU4vLnRlc3QodGV4dCkpcmV0dXJuICdjb2luJztpZigvV0lOLy50ZXN0KHRleHQpKXJldHVybiAnd2luJztpZigvQVBVRVNUQS8udGVzdCh0ZXh0KSlyZXR1cm4gJ2JldCc7aWYoL1BSRU1JTy8udGVzdCh0ZXh0KSlyZXR1cm4gJ3ByaXplJztpZigvUFJPTU8vLnRlc3QodGV4dCkpcmV0dXJuICdwcm9tbyc7aWYoL1NQSU4vLnRlc3QodGV4dCkpcmV0dXJuICdzcGluJztyZXR1cm4gbnVsbDt9CmZ1bmN0aW9uIGNoYXJ0U2VyaWVzQ29sb3JzVmlzdWFsTEEobW9kZWwpewogcmV0dXJuIG1vZGVsLnNlcmllcy5tYXAoKHNlcmllcyxpKT0+e2xldCBtZXRyaWM9bW9kZWwuZHVhbEtleXM/bW9kZWwuZHVhbEtleXNbaV06bW9kZWwua2V5O2lmKG1ldHJpYz09PSdwbycmJi9OQ0MvaS50ZXN0KHNlcmllcy5uYW1lKSltZXRyaWM9J3Bvbic7Y29uc3QgYmFzZT1tZXRyaWNDb2xvcnNWaXN1YWxMQVttZXRyaWNdO2lmKCFiYXNlKXJldHVybiBbJyMwMDhmOTUnLCcjMzY1ZmI2JywnIzgwNTdiMycsJyNiMjRkNzAnLCcjMzc4MTZjJywnIzlhNjQxZSddW2klNl07aWYobW9kZWwuZHVhbEtleXN8fG1vZGVsLnNlcmllcy5sZW5ndGg9PT0xfHxtZXRyaWMhPT1tb2RlbC5rZXkpcmV0dXJuIGJhc2U7CiAvLyBDb21wYXJpc29ucyBvZiBzZXZlcmFsIGdyb3VwcyByZXRhaW4gZGlzdGluY3Qgc2VyaWVzLCB3aGlsZSB0aGUgbWFpbiBtZXRyaWMga2VlcHMgaXRzIGNvbG9yLgogcmV0dXJuIGk9PT0wP2Jhc2U6WycjNTM2Yzg0JywnIzgwNTdiMycsJyNiMjRkNzAnLCcjMzc4MTZjJywnIzlhNjQxZSddWygoaS0xKSU1KV07fSk7Cn0KY29uc3QgZmlsdGVyT3BlblZpc3VhbExBPW5ldyBTZXQoKTsKY29uc3QgYmFyc0JlZm9yZVZpc3VhbExBPWJhcnNWMjsKYmFyc1YyPWZ1bmN0aW9uKGl0ZW1zLGtleSxjb2xvcil7cmV0dXJuIGJhcnNCZWZvcmVWaXN1YWxMQShpdGVtcyxrZXksbWV0cmljQ29sb3JzVmlzdWFsTEFba2V5XXx8Y29sb3IpO307CmZ1bmN0aW9uIHBvbGlzaFZpc3VhbExBKCl7CiBpZighZGF0YSlyZXR1cm47CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY29udGVudCAua3BpJykuZm9yRWFjaChjYXJkPT57Y29uc3QgbGFiZWw9Y2FyZC5xdWVyeVNlbGVjdG9yKCdzbWFsbCcpPy50ZXh0Q29udGVudHx8JycsbWV0cmljPW1ldHJpY1Zpc3VhbExBKGxhYmVsKTtpZihtZXRyaWMpe2NhcmQuZGF0YXNldC5tZXRyaWNWaXN1YWxMYT1tZXRyaWM7Y2FyZC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tZXRyaWMtYWNjZW50LWxhJyxtZXRyaWNDb2xvcnNWaXN1YWxMQVttZXRyaWNdKTt9Y29uc3QgdmFsdWU9Y2FyZC5xdWVyeVNlbGVjdG9yKCdzdHJvbmcnKTtpZih2YWx1ZSl2YWx1ZS50aXRsZT12YWx1ZS50ZXh0Q29udGVudDt9KTsKIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb250ZW50IC5maWx0ZXJncmlkJykuZm9yRWFjaCgoZ3JpZCxpKT0+ewogIGlmKGdyaWQuY2xvc2VzdCgnZGV0YWlscycpfHxncmlkLmNsb3Nlc3QoJy5jb21wYXJlcGFuZWwnKXx8Z3JpZC5jbG9zZXN0KCcjYWxlcnRDb25maWdMQScpKXJldHVybjsKICBjb25zdCBrZXk9dGFiKyd8JytpLGZvbGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO2ZvbGQuY2xhc3NOYW1lPSdjb21wYWN0Rm9sZExBIHZpc3VhbEZpbHRlcnNMQSc7Zm9sZC5vcGVuPWZpbHRlck9wZW5WaXN1YWxMQS5oYXMoa2V5KTsKICBjb25zdCBzdW1tYXJ5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtjb25zdCBsYWJlbHM9Wy4uLmdyaWQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W2RhdGEtZmlsdGVyXScpXSxzZWxlY3RlZD1sYWJlbHMucmVkdWNlKChuLGVsKT0+bitbLi4uZWwuc2VsZWN0ZWRPcHRpb25zXS5sZW5ndGgsMCk7c3VtbWFyeS50ZXh0Q29udGVudD0nRmlsdHJvcyBkZSBtw6FxdWluYXMgeSB1YmljYWNpb25lcycrKHNlbGVjdGVkPycgwrcgJytzZWxlY3RlZCsnIHNlbGVjY2nDs24oZXMpIGFjdGl2YXMnOicgwrcgdG9kb3MnKTtmb2xkLmFwcGVuZENoaWxkKHN1bW1hcnkpO2dyaWQuYmVmb3JlKGZvbGQpO2ZvbGQuYXBwZW5kQ2hpbGQoZ3JpZCk7Zm9sZC5vbnRvZ2dsZT0oKT0+e2lmKGZvbGQub3BlbilmaWx0ZXJPcGVuVmlzdWFsTEEuYWRkKGtleSk7ZWxzZSBmaWx0ZXJPcGVuVmlzdWFsTEEuZGVsZXRlKGtleSk7fTsKIH0pOwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NvbnRlbnQgLnRhYmxld3JhcCwjY29udGVudCAuY2hhcnRkYXRhd3JhcCcpLmZvckVhY2goaG9zdD0+e2hvc3QuY2xhc3NMaXN0LmFkZCgndmlzdWFsVGFibGVMQScpO2lmKCFob3N0Lmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSlob3N0LnRhYkluZGV4PTA7aWYoIWhvc3QuaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpaG9zdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdUYWJsYSBkZSBkYXRvczsgcHVlZGVzIGRlc3BsYXphcnRlIHBhcmEgdmVyIHRvZGFzIGxhcyBjb2x1bW5hcycpO30pOwp9Ci8vIFJlYWwgb3BlcmF0aW9uIHN0YWdlcywgbm90IGFuIGludmVudGVkIGNvbXBsZXRpb24gcGVyY2VudGFnZS4KY29uc3QgYnVzeU9wZXJhdGlvbnNWaXN1YWxMQT1uZXcgTWFwKCk7bGV0IGJ1c3lTZXF1ZW5jZVZpc3VhbExBPTA7CmZ1bmN0aW9uIGRyYXdCdXN5VmlzdWFsTEEoKXsKIGxldCBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1c3lWaXN1YWxMQScpO2lmKCFib3gpe2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtib3guaWQ9J2J1c3lWaXN1YWxMQSc7Ym94LnNldEF0dHJpYnV0ZSgncm9sZScsJ3N0YXR1cycpO2JveC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsJ3BvbGl0ZScpO2JveC5pbm5lckhUTUw9JzxzcGFuIGNsYXNzPSJidXN5U3Bpbm5lckxBIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPjxzcGFuIGRhdGEtYnVzeS1sYWJlbD48L3NwYW4+Jztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJveCk7fQogY29uc3QgYWN0aXZlPVsuLi5idXN5T3BlcmF0aW9uc1Zpc3VhbExBLnZhbHVlcygpXS5hdCgtMSk7Ym94LmhpZGRlbj0hYWN0aXZlO2JveC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idXN5LWxhYmVsXScpLnRleHRDb250ZW50PWFjdGl2ZXx8Jyc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWFpbicpPy5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsYWN0aXZlPyd0cnVlJzonZmFsc2UnKTsKfQphc3luYyBmdW5jdGlvbiB3aXRoQnVzeVZpc3VhbExBKGxhYmVsLG9wZXJhdGlvbil7Y29uc3QgaWQ9KytidXN5U2VxdWVuY2VWaXN1YWxMQTtidXN5T3BlcmF0aW9uc1Zpc3VhbExBLnNldChpZCxsYWJlbCk7ZHJhd0J1c3lWaXN1YWxMQSgpO3RyeXtyZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7fWZpbmFsbHl7YnVzeU9wZXJhdGlvbnNWaXN1YWxMQS5kZWxldGUoaWQpO2RyYXdCdXN5VmlzdWFsTEEoKTt9fQpjb25zdCBjYWNoZWRCZWZvcmVWaXN1YWxMQT1jYWNoZWQ7CmNhY2hlZD1hc3luYyBmdW5jdGlvbigpe3JldHVybiB3aXRoQnVzeVZpc3VhbExBKCdEZXNjYXJnYW5kbyB5IHZhbGlkYW5kbyBsb3MgZGF0b3PigKYnLCgpPT5jYWNoZWRCZWZvcmVWaXN1YWxMQSgpKTt9Owpjb25zdCBvcGVuU2Vzc2lvbkJlZm9yZVZpc3VhbExBPW9wZW5TZXNzaW9uVjE1OwpvcGVuU2Vzc2lvblYxNT1hc3luYyBmdW5jdGlvbihzZXNzaW9uKXtyZXR1cm4gd2l0aEJ1c3lWaXN1YWxMQSgnUHJlcGFyYW5kbyBlbCBpbmZvcm1lIGluaWNpYWzigKYnLCgpPT5vcGVuU2Vzc2lvbkJlZm9yZVZpc3VhbExBKHNlc3Npb24pKTt9OwovLyBZaWVsZCBiZWZvcmUgYSByZXBvcnQgaXMgY2FsY3VsYXRlZCBzbyB0aGUgYnJvd3NlciBjYW4gcGFpbnQgaXRzIGxvYWRpbmcgc3RhdGUuCmxldCBwZW5kaW5nTmF2aWdhdGlvblZpc3VhbExBPTA7CmFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlVmlzdWFsTEEobmV4dCl7Y29uc3QgdGlja2V0PSsrcGVuZGluZ05hdmlnYXRpb25WaXN1YWxMQTtyZXR1cm4gd2l0aEJ1c3lWaXN1YWxMQSgnUHJlcGFyYW5kbyAnK25leHQudG9Mb2NhbGVMb3dlckNhc2UoJ2VzJykrJ+KApicsYXN5bmMoKT0+e2F3YWl0IG5ldyBQcm9taXNlKHJlc29sdmU9PnNldFRpbWVvdXQocmVzb2x2ZSwzMikpO2lmKHRpY2tldCE9PXBlbmRpbmdOYXZpZ2F0aW9uVmlzdWFsTEF8fCFkYXRhKXJldHVybjthY3RpdmF0ZVRhYlYzKG5leHQpO30pO30KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT57Y29uc3QgYnV0dG9uPWV2ZW50LnRhcmdldC5jbG9zZXN0Py4oJ25hdiBidXR0b25bZGF0YS10YWJdJyk7aWYoIWJ1dHRvbnx8IWRhdGEpcmV0dXJuO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7bmF2aWdhdGVWaXN1YWxMQShidXR0b24uZGF0YXNldC50YWIpLmNhdGNoKGVycm9yPT57Y29uc3Qgc3RhdHVzPSQoJyNzdGF0dXMnKTtpZihzdGF0dXMpc3RhdHVzLnRleHRDb250ZW50PSdObyBzZSBwdWRvIHByZXBhcmFyIGVsIGluZm9ybWU6ICcrZXJyb3IubWVzc2FnZTt9KTt9LHRydWUpOwpjb25zdCByZW5kZXJCZWZvcmVWaXN1YWxMQT1yZW5kZXI7CnJlbmRlcj1mdW5jdGlvbigpe3JlbmRlckJlZm9yZVZpc3VhbExBKCk7cG9saXNoVmlzdWFsTEEoKTt9Owpjb25zdCBwYXJrVGFibGVCZWZvcmVWaXN1YWxMQT1wYXJrVGFibGVMQTsKcGFya1RhYmxlTEE9ZnVuY3Rpb24oLi4uYXJncyl7cGFya1RhYmxlQmVmb3JlVmlzdWFsTEEoLi4uYXJncyk7YXJnc1swXS5xdWVyeVNlbGVjdG9yKCcudGFibGV3cmFwJyk/LmNsYXNzTGlzdC5hZGQoJ3Zpc3VhbFRhYmxlTEEnKTt9OwoKY29uc3QgcGVyaW9kVGFiVjEwPSdBbsOhbGlzaXMgcG9yIHBlcsOtb2RvJyxwZXJpb2REYXlzVjEwPVsnTHVuZXMnLCdNYXJ0ZXMnLCdNacOpcmNvbGVzJywnSnVldmVzJywnVmllcm5lcycsJ1PDoWJhZG8nLCdEb21pbmdvJ10scGVyaW9kTWV0cmljc1YxMD1bJ3dpbicsJ2NvaW4nLCdzcGluJywnYmV0JywncG8nLCdwb24nLCdkZXYnLCdwcm9tbycsJ3ByaXplJywnd2QnLCdjZCcsJ3NkJywnb2NjJ107CmZ1bmN0aW9uIG1vbmRheVYxMChkYXRlKXtyZXR1cm4gc2hpZnREYXRlTEEoZGF0ZSwtKChuZXcgRGF0ZShkYXRlKydUMTI6MDA6MDBaJykuZ2V0VVRDRGF5KCkrNiklNykpO30KZnVuY3Rpb24gc2hvcnREYXRlUGVyaW9kVjEwKGRhdGUpe3JldHVybiBkYXRlLnNsaWNlKDgsMTApKycvJytkYXRlLnNsaWNlKDUsNykrJy8nK2RhdGUuc2xpY2UoMCw0KTt9CmZ1bmN0aW9uIHdlZWtUZXh0VjEwKHN0YXJ0KXtyZXR1cm4gc2hvcnREYXRlUGVyaW9kVjEwKHN0YXJ0KSsnIOKGkiAnK3Nob3J0RGF0ZVBlcmlvZFYxMChzaGlmdERhdGVMQShzdGFydCw2KSk7fQpmdW5jdGlvbiBjYXRhbG9nUGVyaW9kVjEwKHJvd3MpewogY29uc3QgZGF0ZXM9Wy4uLm5ldyBTZXQocm93cy5tYXAocj0+clswXSkpXS5zb3J0KCksd2Vla3M9bmV3IE1hcCgpO2Zvcihjb25zdCBkYXRlIG9mIGRhdGVzKXtjb25zdCBrZXk9bW9uZGF5VjEwKGRhdGUpO2lmKCF3ZWVrcy5oYXMoa2V5KSl3ZWVrcy5zZXQoa2V5LHtrZXksbW9udGhzOm5ldyBTZXQoKSxkYXRlczpbXX0pO3dlZWtzLmdldChrZXkpLm1vbnRocy5hZGQoZGF0ZS5zbGljZSgwLDcpKTt3ZWVrcy5nZXQoa2V5KS5kYXRlcy5wdXNoKGRhdGUpO30KIHJldHVybntkYXRlcyxtb250aHM6Wy4uLm5ldyBTZXQoZGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpXSx3ZWVrczpbLi4ud2Vla3MudmFsdWVzKCldLnNvcnQoKGEsYik9PmEua2V5LmxvY2FsZUNvbXBhcmUoYi5rZXkpKX07Cn0KbGV0IGNhdGFsb2dDYWNoZVBlcmlvZFYxMD1udWxsLGN1cnJlbnRQZXJpb2RSZXBvcnRWMTA9bnVsbDsKZnVuY3Rpb24gY2F0YWxvZ0N1cnJlbnRWMTAoKXtpZihjYXRhbG9nQ2FjaGVQZXJpb2RWMTA/Lm1hdHJpeCE9PWRhdGEpY2F0YWxvZ0NhY2hlUGVyaW9kVjEwPXttYXRyaXg6ZGF0YSxjYXRhbG9nOmNhdGFsb2dQZXJpb2RWMTAoZGF0YS5yb3dzKX07cmV0dXJuIGNhdGFsb2dDYWNoZVBlcmlvZFYxMC5jYXRhbG9nO30KZnVuY3Rpb24gYXZhaWxhYmxlV2Vla3NWMTAoY2F0YWxvZyxtb250aHMpe3JldHVybiBjYXRhbG9nLndlZWtzLmZpbHRlcih3PT4hbW9udGhzLmxlbmd0aHx8Wy4uLncubW9udGhzXS5zb21lKG09Pm1vbnRocy5pbmNsdWRlcyhtKSkpO30KZnVuY3Rpb24gc3RhdGVQZXJpb2RWMTAobGVnYWN5KXsKIGlmKCF2aWV3U3RhdGUucGVyaW9kQW5hbHlzaXMpe2NvbnN0IG9sZD1sZWdhY3k/dmlld1N0YXRlW2xlZ2FjeV06dmlld1N0YXRlLndlZWtseTt2aWV3U3RhdGUucGVyaW9kQW5hbHlzaXM9e2ZpbHRlcnM6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvbGQ/LmZpbHRlcnN8fHt9KSksZ3JhaW46bGVnYWN5PT09J21vbnRobHknPydtb250aCc6J3dlZWsnLG1vbnRoczpsZWdhY3k/W106W2NhdGFsb2dDdXJyZW50VjEwKCkubW9udGhzLmF0KC0xKV0uZmlsdGVyKEJvb2xlYW4pLHdlZWtzOltdLHdlZWtkYXlzOlswLDEsMiwzLDQsNSw2XSxjaGFydENvbHVtbnM6b2xkPy5jaGFydENvbHVtbnN8fDIsLi4uKEFycmF5LmlzQXJyYXkob2xkPy5jaGFydFNlbGVjdGlvbik/e2NoYXJ0U2VsZWN0aW9uOlsuLi5vbGQuY2hhcnRTZWxlY3Rpb25dfTp7fSl9O30KIGNvbnN0IHM9dmlld1N0YXRlLnBlcmlvZEFuYWx5c2lzO3MuZmlsdGVycz8/PXt9O2RlbGV0ZSBzLmZpbHRlcnNbJzgnXTtzLm1vbnRocz1BcnJheS5pc0FycmF5KHMubW9udGhzKT9zLm1vbnRoczpbXTtzLndlZWtzPUFycmF5LmlzQXJyYXkocy53ZWVrcyk/cy53ZWVrczpbXTtzLndlZWtkYXlzPUFycmF5LmlzQXJyYXkocy53ZWVrZGF5cyk/cy53ZWVrZGF5czpbMCwxLDIsMyw0LDUsNl07aWYoIVsnZGF5Jywnd2VlaycsJ21vbnRoJywnb3ZlcmxheSddLmluY2x1ZGVzKHMuZ3JhaW4pKXMuZ3JhaW49J3dlZWsnO3JldHVybiBzOwp9CmZ1bmN0aW9uIGJ1aWxkUGVyaW9kVjEwKHJvd3MscyxjYXRhbG9nKXsKIGNvbnN0IGF2YWlsYWJsZT1hdmFpbGFibGVXZWVrc1YxMChjYXRhbG9nLHMubW9udGhzKSx3ZWVrS2V5cz1zLndlZWtzLmxlbmd0aD9zLndlZWtzLmZpbHRlcihrPT5hdmFpbGFibGUuc29tZSh3PT53LmtleT09PWspKTphdmFpbGFibGUubWFwKHc9Pncua2V5KSx3ZWVrU2V0PW5ldyBTZXQod2Vla0tleXMpLHdlZWtkYXlTZXQ9bmV3IFNldChzLndlZWtkYXlzLm1hcChOdW1iZXIpKTsKIGNvbnN0IG1vbnRoTWF0Y2g9ZD0+IXMubW9udGhzLmxlbmd0aHx8cy5tb250aHMuaW5jbHVkZXMoZC5zbGljZSgwLDcpKSxsZWdhY3lEYXRlcz1BcnJheS5pc0FycmF5KHMubGVnYWN5RGF0ZXMpP25ldyBTZXQocy5sZWdhY3lEYXRlcyk6bnVsbDsKIGNvbnN0IGRhdGVNYXRjaD1kPT57aWYobGVnYWN5RGF0ZXMmJiFsZWdhY3lEYXRlcy5oYXMoZCkpcmV0dXJuIGZhbHNlO2NvbnN0IGluV2Vlaz13ZWVrU2V0Lmhhcyhtb25kYXlWMTAoZCkpO3JldHVybiAocy5ncmFpbj09PSd3ZWVrJ3x8cy5ncmFpbj09PSdvdmVybGF5J3x8cy53ZWVrcy5sZW5ndGg/aW5XZWVrOnRydWUpJiYocy5ncmFpbj09PSdtb250aCd8fChzLmdyYWluPT09J2RheScmJiFzLndlZWtzLmxlbmd0aCk/bW9udGhNYXRjaChkKTp0cnVlKSYmd2Vla2RheVNldC5oYXMoKG5ldyBEYXRlKGQrJ1QxMjowMDowMFonKS5nZXRVVENEYXkoKSs2KSU3KTt9OwogY29uc3QgYWNjZXB0ZWREYXRlcz1uZXcgU2V0KGNhdGFsb2cuZGF0ZXMuZmlsdGVyKGRhdGVNYXRjaCkpOwogY29uc3Qgc2VsZWN0ZWQ9cm93cy5maWx0ZXIocj0+YWNjZXB0ZWREYXRlcy5oYXMoclswXSkmJk9iamVjdC5lbnRyaWVzKHMuZmlsdGVycykuZXZlcnkoKFtrLHZdKT0+IXYubGVuZ3RofHx2LmluY2x1ZGVzKFN0cmluZyhyW2tdPz8nU2luIGRhdG8nKSkpKTsKIGNvbnN0IGJ5RGF0ZT1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2Ygc2VsZWN0ZWQpe2lmKCFieURhdGUuaGFzKHJbMF0pKWJ5RGF0ZS5zZXQoclswXSxbXSk7YnlEYXRlLmdldChyWzBdKS5wdXNoKHIpO30KIGNvbnN0IHBvaW50PShuYW1lLHNvdXJjZSxsYWJlbCxyYW5nZSk9Pih7bmFtZSxyb3dzOnNvdXJjZSwuLi4oc291cmNlLmxlbmd0aD9hZ2coc291cmNlKTpPYmplY3QuZnJvbUVudHJpZXMocGVyaW9kTWV0cmljc1YxMC5tYXAoaz0+W2ssbnVsbF0pKSksbGFiZWxWMTA6bGFiZWwscmFuZ2VWMTA6cmFuZ2Usb2JzZXJ2ZWQ6c291cmNlLmxlbmd0aD4wLGRheXNPYnNlcnZlZDpuZXcgU2V0KHNvdXJjZS5tYXAocj0+clswXSkpLnNpemV9KTsKIGNvbnN0IGRhaWx5PShzdGFydCxvdmVybGF5KT0+cy53ZWVrZGF5cy5tYXAoTnVtYmVyKS5zb3J0KChhLGIpPT5hLWIpLm1hcChkYXk9Pntjb25zdCBkYXRlPXNoaWZ0RGF0ZUxBKHN0YXJ0LGRheSk7cmV0dXJuey4uLnBvaW50KG92ZXJsYXk/U3RyaW5nKGRheSsxKS5wYWRTdGFydCgyLCcwJykrJyDCtyAnK3BlcmlvZERheXNWMTBbZGF5XTpkYXRlLGJ5RGF0ZS5nZXQoZGF0ZSl8fFtdLG92ZXJsYXk/cGVyaW9kRGF5c1YxMFtkYXldOnNob3J0RGF0ZVBlcmlvZFYxMChkYXRlKSxvdmVybGF5PycnOnNob3J0RGF0ZVBlcmlvZFYxMChkYXRlKSksZGF0ZSx3ZWVrOnN0YXJ0LGRheX07fSk7CiBsZXQgbGlzdD1bXSxzZXJpZXM9W107CiBpZihzLmdyYWluPT09J292ZXJsYXknKXtzZXJpZXM9d2Vla0tleXMubWFwKHN0YXJ0PT4oe25hbWU6d2Vla1RleHRWMTAoc3RhcnQpLHdlZWs6c3RhcnQscG9pbnRzOmRhaWx5KHN0YXJ0LHRydWUpfSkpO2xpc3Q9c2VyaWVzLmZsYXRNYXAoZz0+Zy5wb2ludHMubWFwKHA9Pih7Li4ucCxuYW1lOmcud2VlaysnfCcrcC5kYXRlLGxhYmVsVjEwOmRpc3BsYXlEYXRlc1Y1KHAuZGF0ZSl9KSkpO30KIGVsc2UgaWYocy5ncmFpbj09PSd3ZWVrJyl7Y29uc3QgZ3JvdXBlZD1uZXcgTWFwKHdlZWtLZXlzLm1hcChrPT5bayxbXV0pKTtmb3IoY29uc3QgciBvZiBzZWxlY3RlZClncm91cGVkLmdldChtb25kYXlWMTAoclswXSkpPy5wdXNoKHIpO2xpc3Q9Wy4uLmdyb3VwZWRdLm1hcCgoW3N0YXJ0LHNvdXJjZV0pPT4oey4uLnBvaW50KCdXfCcrc3RhcnQsc291cmNlLCdTJyt3ZWVrTnVtYmVyVjgoc3RhcnQpKycgwrcgJytzdGFydC5zbGljZSg4KSsnLycrc3RhcnQuc2xpY2UoNSw3KSsnICcrc3RhcnQuc2xpY2UoMCw0KSxzdGFydC5zbGljZSg4KSsnLycrc3RhcnQuc2xpY2UoNSw3KSsn4oCTJytzaGlmdERhdGVMQShzdGFydCw2KS5zbGljZSg4KSsnLycrc2hpZnREYXRlTEEoc3RhcnQsNikuc2xpY2UoNSw3KSksd2VlazpzdGFydH0pKTt9CiBlbHNlIGlmKHMuZ3JhaW49PT0nbW9udGgnKXtjb25zdCBtb250aHM9cy5tb250aHMubGVuZ3RoP2NhdGFsb2cubW9udGhzLmZpbHRlcihtPT5zLm1vbnRocy5pbmNsdWRlcyhtKSk6Y2F0YWxvZy5tb250aHMsZ3JvdXBlZD1uZXcgTWFwKG1vbnRocy5tYXAoaz0+W2ssW11dKSk7Zm9yKGNvbnN0IHIgb2Ygc2VsZWN0ZWQpZ3JvdXBlZC5nZXQoclswXS5zbGljZSgwLDcpKT8ucHVzaChyKTtsaXN0PVsuLi5ncm91cGVkXS5tYXAoKFttb250aCxzb3VyY2VdKT0+cG9pbnQobW9udGgsc291cmNlLGRpc3BsYXlEYXRlc1Y1KG1vbnRoKSxtb250aCkpO30KIGVsc2UgaWYocy53ZWVrcy5sZW5ndGgpe2xpc3Q9d2Vla0tleXMuZmxhdE1hcChzdGFydD0+ZGFpbHkoc3RhcnQsZmFsc2UpKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTt9CiBlbHNlIGxpc3Q9Y2F0YWxvZy5kYXRlcy5maWx0ZXIoZGF0ZU1hdGNoKS5tYXAoZGF0ZT0+KHsuLi5wb2ludChkYXRlLGJ5RGF0ZS5nZXQoZGF0ZSl8fFtdLGRpc3BsYXlEYXRlc1Y1KGRhdGUpLGRpc3BsYXlEYXRlc1Y1KGRhdGUpKSxkYXRlLHdlZWs6bW9uZGF5VjEwKGRhdGUpfSkpOwogcmV0dXJue3Jvd3M6c2VsZWN0ZWQsbGlzdCxzZXJpZXMsd2Vla3M6d2Vla0tleXMsc3VtbWFyeTphZ2coc2VsZWN0ZWQpfTsKfQpmdW5jdGlvbiB0ZXh0UGVyaW9kVjEwKCl7Y29uc3Qgcz1zdGF0ZVBlcmlvZFYxMCgpLGdyYWluPXtkYXk6J0TDrWFzJyx3ZWVrOidTZW1hbmFzJyxtb250aDonTWVzZXMnLG92ZXJsYXk6J0NvbXBhcmFjacOzbiBsdW5lcyBhIGRvbWluZ28nfVtzLmdyYWluXSxkYXlzPXMud2Vla2RheXMubGVuZ3RoPT09Nz8nVG9kb3MgbG9zIGTDrWFzJzpzLndlZWtkYXlzLmxlbmd0aD9zLndlZWtkYXlzLm1hcChpPT5wZXJpb2REYXlzVjEwW2ldKS5qb2luKCcsICcpOidTaW4gZMOtYXMgc2VsZWNjaW9uYWRvcyc7cmV0dXJuIGdyYWluKycgwrcgJysocy5tb250aHMubGVuZ3RoP3MubW9udGhzLm1hcChkaXNwbGF5RGF0ZXNWNSkuam9pbignLCAnKTonVG9kb3MgbG9zIG1lc2VzJykrJyDCtyAnKyhzLndlZWtzLmxlbmd0aD9zLndlZWtzLmxlbmd0aCsnIHNlbWFuYXMgZWxlZ2lkYXMnOidUb2RhcyBsYXMgc2VtYW5hcyBkaXNwb25pYmxlcycpKycgwrcgJytkYXlzKyhBcnJheS5pc0FycmF5KHMubGVnYWN5RGF0ZXMpPycgwrcgVmlzdGEgYW50ZXJpb3I6ICcrcy5sZWdhY3lEYXRlcy5sZW5ndGgrJyBmZWNoYXMgb3JpZ2luYWxlczsgQXBsaWNhciBzZWxlY2Npw7NuIGFjdHVhbGl6YSBlbCBwZXLDrW9kbyc6JycpO30KY29uc3QgZGVzY3JpYmVCZWZvcmVQZXJpb2RWMTA9cGVyaW9kRGVzY3JpcHRpb25WNDsKcGVyaW9kRGVzY3JpcHRpb25WND1mdW5jdGlvbihuYW1lLHBvaW50cyl7Y29uc3QgcG9pbnQ9cG9pbnRzLmZpbmQocD0+cC5sYWJlbFYxMCk7cmV0dXJuIHBvaW50P3tsYWJlbDpwb2ludC5sYWJlbFYxMCxyYW5nZTpwb2ludC5yYW5nZVYxMCxmdWxsOnBvaW50LmxhYmVsVjEwKycgwrcgJytwb2ludC5yYW5nZVYxMH06ZGVzY3JpYmVCZWZvcmVQZXJpb2RWMTAobmFtZSxwb2ludHMpO307CmNvbnN0IGNvbG9yc0JlZm9yZVBlcmlvZFYxMD1jaGFydFNlcmllc0NvbG9yc1Zpc3VhbExBOwpjaGFydFNlcmllc0NvbG9yc1Zpc3VhbExBPWZ1bmN0aW9uKG1vZGVsKXtjb25zdCBjb2xvcnM9Y29sb3JzQmVmb3JlUGVyaW9kVjEwKG1vZGVsKTtpZighbW9kZWwuYWxpZ25lZFdlZWtzVjEwKXJldHVybiBjb2xvcnM7cmV0dXJuIGNvbG9ycy5tYXAoKGNvbG9yLGkpPT57Y29uc3Qgd2Vlaz1NYXRoLmZsb29yKGkvKG1vZGVsLm1ldHJpY0NvdW50VjEwfHwxKSksbj13ZWVrJTY7aWYoIW58fCEvXiNbXGRhLWZdezZ9JC9pLnRlc3QoY29sb3IpKXJldHVybiBjb2xvcjtyZXR1cm4gJyMnK1sxLDMsNV0ubWFwKGs9Pk1hdGgucm91bmQocGFyc2VJbnQoY29sb3Iuc2xpY2UoayxrKzIpLDE2KSooMS1uKi4xMCkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCcwJykpLmpvaW4oJycpO30pO307CmZ1bmN0aW9uIHByZWZlclBvaW50UGVyaW9kVjEwKHBvaW50KXtjb25zdCByb3dzPXBvaW50LnJvd3MuZmlsdGVyKHByZWZlcmVuY2lhbCk7cmV0dXJuey4uLnBvaW50LHJvd3MsLi4uKHJvd3MubGVuZ3RoP2FnZyhyb3dzKTpPYmplY3QuZnJvbUVudHJpZXMocGVyaW9kTWV0cmljc1YxMC5tYXAoaz0+W2ssbnVsbF0pKSksb2JzZXJ2ZWQ6cm93cy5sZW5ndGg+MCxkYXlzT2JzZXJ2ZWQ6bmV3IFNldChyb3dzLm1hcChyPT5yWzBdKSkuc2l6ZX07fQpmdW5jdGlvbiBjaGFydFBlcmlvZFYxMChyZXBvcnQscyxrZXlzLHByZWZlcmVudGlhbD1mYWxzZSl7CiBsZXQgc2VyaWVzLGR1YWw9bnVsbCxrZXk9a2V5cy5sZW5ndGg9PT0xP2tleXNbMF06bnVsbDsKIGlmKHMuZ3JhaW49PT0nb3ZlcmxheScpe3Nlcmllcz1yZXBvcnQuc2VyaWVzLmZsYXRNYXAoZ3JvdXA9PmtleXMubWFwKG1ldHJpYz0+KHtuYW1lOmdyb3VwLm5hbWUrJyDCtyAnK21ldHJpY3NbbWV0cmljXSxwb2ludHM6Z3JvdXAucG9pbnRzfSkpKTtpZihrZXlzLmxlbmd0aD4xKWR1YWw9cmVwb3J0LnNlcmllcy5mbGF0TWFwKCgpPT5rZXlzKTt9CiBlbHNle3Nlcmllcz1rZXlzLm1hcChtZXRyaWM9Pih7bmFtZTptZXRyaWNzW21ldHJpY10scG9pbnRzOnJlcG9ydC5saXN0fSkpO2lmKGtleXMubGVuZ3RoPjEpZHVhbD1rZXlzO30KIGlmKHByZWZlcmVudGlhbCl7Y29uc3QgZ3JvdXBzPXMuZ3JhaW49PT0nb3ZlcmxheSc/cmVwb3J0LnNlcmllczpbe25hbWU6JycscG9pbnRzOnJlcG9ydC5saXN0fV07c2VyaWVzPWdyb3Vwcy5mbGF0TWFwKGdyb3VwPT5rZXlzLmZsYXRNYXAobWV0cmljPT5be25hbWU6Z3JvdXAubmFtZSsnIMK3ICcrbWV0cmljc1ttZXRyaWNdKycgwrcgU2VsZWNjacOzbiBjb21wbGV0YScscG9pbnRzOmdyb3VwLnBvaW50c30se25hbWU6Z3JvdXAubmFtZSsnIMK3ICcrbWV0cmljc1ttZXRyaWNdKycgwrcgUHJlZmVyZW5jaWFsJyxwb2ludHM6Z3JvdXAucG9pbnRzLm1hcChwcmVmZXJQb2ludFBlcmlvZFYxMCl9XSkpO2R1YWw9a2V5cy5sZW5ndGg+MT9ncm91cHMuZmxhdE1hcCgoKT0+a2V5cy5mbGF0TWFwKGs9PltrLGtdKSk6bnVsbDt9CiBjb25zdCBodG1sPWxhYmVsZWRDaGFydFY0KHNlcmllcyxrZXksZHVhbCksaWQ9aHRtbC5tYXRjaCgvZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhPSIoW14iXSspIi8pPy5bMV0sbW9kZWw9cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuZ2V0KGlkKTtpZihtb2RlbCl7bW9kZWwucGVyaW9kVjEwPXRydWU7bW9kZWwuc2hhcmVkTWV0cmljU2NhbGVzVjEyPXRydWU7bW9kZWwuYWxpZ25lZFdlZWtzVjEwPXMuZ3JhaW49PT0nb3ZlcmxheSc7bW9kZWwubWV0cmljQ291bnRWMTA9a2V5cy5sZW5ndGgqKHByZWZlcmVudGlhbD8yOjEpO30KIGlmKGR1YWwpe2NvbnN0IGF4ZXM9Wy4uLm5ldyBTZXQoZHVhbCldO2xldCBpbmRleD0wO3JldHVybiBodG1sLnJlcGxhY2UoLyDCtyBlamUgKD86aXpxdWllcmRvfGRlcmVjaG8pL2csKCk9Pntjb25zdCBheGlzPWF4ZXMuaW5kZXhPZihkdWFsW2luZGV4KytdKTtyZXR1cm4gYXhpcz09PTA/JyDCtyBlamUgaXpxdWllcmRvJzpheGlzPT09MT8nIMK3IGVqZSBkZXJlY2hvJzonIMK3IGVqZSBkZXJlY2hvIDInO30pO30KIHJldHVybiBodG1sOwp9CmZ1bmN0aW9uIGNob2ljZXNQZXJpb2RWMTAocyxjYXRhbG9nKXtjb25zdCB3ZWVrQ2hvaWNlcz1jYXRhbG9nLndlZWtzLGF2YWlsYWJsZT1uZXcgU2V0KGF2YWlsYWJsZVdlZWtzVjEwKGNhdGFsb2cscy5tb250aHMpLm1hcCh3PT53LmtleSkpO3JldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQgcGVyaW9kQ29udHJvbHNWMTAiPjxkaXYgY2xhc3M9InBlcmlvZENvbnRyb2xSb3dWMTAiPiR7c2VsZWN0b3IoJ1ZlciBwb3InLCdwZXJpb2RHcmFpblYxMCcscy5ncmFpbix7d2VlazonU2VtYW5hcyBkZWwgbWVzJyxkYXk6J0TDrWFzJyxtb250aDonTWVzZXMnLG92ZXJsYXk6J0NvbXBhcmFyIHNlbWFuYXMgwrcgbHVuZXMgYSBkb21pbmdvJ30pfTxkZXRhaWxzIGNsYXNzPSJleGNlbERyb3Bkb3duVjEzIj48c3VtbWFyeT5NZXNlcyDCtyAke3MubW9udGhzLmxlbmd0aHx8J3RvZG9zJ308L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48cD5TaW4gbWFyY2FyOiB0b2RvcyBsb3MgbWVzZXMuPC9wPjxkaXYgY2xhc3M9InBlcmlvZENob2ljZXNWMTAiPiR7Y2F0YWxvZy5tb250aHMubWFwKG09PmA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXBlcmlvZC1tb250aD0iJHttfSIgJHtzLm1vbnRocy5pbmNsdWRlcyhtKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZXNjKGRpc3BsYXlEYXRlc1Y1KG0pKX08L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKX08L2Rpdj48L2Rpdj48L2RldGFpbHM+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiPjxzdW1tYXJ5PlNlbWFuYXMgwrcgJHtzLndlZWtzLmxlbmd0aHx8J3RvZGFzJ308L3N1bW1hcnk+PGRpdiBjbGFzcz0iZXhjZWxNZW51VjEzIj48cD5TZW1hbmFzIGRpc3BvbmlibGVzIGVuIGxvcyBtZXNlcyBlbGVnaWRvcy4gU2luIG1hcmNhcjogdG9kYXMuIFNlIGluY2x1eWUgbGEgc2VtYW5hIGNvbXBsZXRhIGFsIHZlciBwb3IgZMOtYXMsIHNlbWFuYXMgbyBjb21wYXJhci48L3A+PGRpdiBjbGFzcz0icGVyaW9kQ2hvaWNlc1YxMCI+JHt3ZWVrQ2hvaWNlcy5tYXAodz0+YDxsYWJlbCBjbGFzcz0iY2hlY2tJdGVtVjEyIiAke2F2YWlsYWJsZS5oYXMody5rZXkpPycnOidoaWRkZW4nfT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtcGVyaW9kLXdlZWs9IiR7dy5rZXl9IiAke3Mud2Vla3MuaW5jbHVkZXMody5rZXkpPydjaGVja2VkJzonJ30+PHNwYW4+JHtlc2Mod2Vla1RleHRWMTAody5rZXkpKX08c21hbGw+JHt3LmRhdGVzLmxlbmd0aH0vNyBkw61hcyBlbiBlbCBoaXN0w7NyaWNvPC9zbWFsbD48L3NwYW4+PC9sYWJlbD5gKS5qb2luKCcnKX08L2Rpdj48L2Rpdj48L2RldGFpbHM+PGRldGFpbHMgY2xhc3M9ImV4Y2VsRHJvcGRvd25WMTMiPjxzdW1tYXJ5PkTDrWFzIMK3ICR7cy53ZWVrZGF5cy5sZW5ndGg9PT03Pyd0b2Rvcyc6cy53ZWVrZGF5cy5sZW5ndGgrJyBlbGVnaWRvcyd9PC9zdW1tYXJ5PjxkaXYgY2xhc3M9ImV4Y2VsTWVudVYxMyI+PGRpdiBjbGFzcz0iZHJvcGRvd25BY3Rpb25zVjEzIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9InBlcmlvZEFsbERheXNWMTAiPlRvZG9zPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwZXJpb2ROb0RheXNWMTAiPk5pbmd1bm88L2J1dHRvbj48L2Rpdj4ke3BlcmlvZERheXNWMTAubWFwKChkYXksaSk9PmA8bGFiZWwgY2xhc3M9ImNoZWNrSXRlbVYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLXBlcmlvZC1kYXk9IiR7aX0iICR7cy53ZWVrZGF5cy5pbmNsdWRlcyhpKT8nY2hlY2tlZCc6Jyd9PjxzcGFuPiR7ZGF5fTwvc3Bhbj48L2xhYmVsPmApLmpvaW4oJycpfTwvZGl2PjwvZGV0YWlscz48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InByaW1hcnkiIGlkPSJwZXJpb2RBcHBseVYxMCI+QXBsaWNhciBzZWxlY2Npw7NuPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJwZXJpb2RSZXNldFYxMCI+w5psdGltbyBtZXMgwrcgdG9kb3MgbG9zIGTDrWFzPC9idXR0b24+PC9kaXY+PHAgY2xhc3M9InNpZ25hbG5vdGUiIGlkPSJwZXJpb2RQZW5kaW5nVjEwIj5Mb3MgbWVzZXMgZGVsaW1pdGFuIGxhcyBzZW1hbmFzIGRpc3BvbmlibGVzLiBQYXJhIGNvbXBhcmFyIHNlbWFuYXMgZGUgZGlzdGludG9zIG1lc2VzLCBtYXJjYSBlc29zIG1lc2VzIHkgZGVzcHXDqXMgbGFzIHNlbWFuYXMuPC9wPjxkZXRhaWxzIGNsYXNzPSJjb21wYWN0Rm9sZExBIj48c3VtbWFyeT5Nw6FxdWluYXMsIGJhbmNvcyB5IHViaWNhY2lvbmVzIMK3ICR7T2JqZWN0LnZhbHVlcyhzLmZpbHRlcnMpLmZpbHRlcih2PT52Lmxlbmd0aCkubGVuZ3RofSBmaWx0cm9zIGFjdGl2b3M8L3N1bW1hcnk+PGRpdiBjbGFzcz0iZmlsdGVyZ3JpZCI+JHtmaWx0ZXJGaWVsZHMocywncGVyaW9kQW5hbHlzaXMnLFsxLDIsMyw0LDksNSw3XSl9PC9kaXY+PC9kZXRhaWxzPjwvc2VjdGlvbj5gO30KZnVuY3Rpb24gYmluZFBlcmlvZFYxMChzLGNhdGFsb2cpewogY29uc3QgY2hlY2tlZD1rZXk9PlsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2QtJytrZXkrJ10nKV0uZmlsdGVyKGVsPT5lbC5jaGVja2VkKS5tYXAoZWw9PmVsLmRhdGFzZXRbJ3BlcmlvZCcra2V5WzBdLnRvVXBwZXJDYXNlKCkra2V5LnNsaWNlKDEpXSk7CiBjb25zdCBtYXJrUGVuZGluZz0oKT0+eyQoJyNwZXJpb2RQZW5kaW5nVjEwJykudGV4dENvbnRlbnQ9J1NlbGVjY2nDs24gcGVuZGllbnRlLiBQdWxzYSBBcGxpY2FyIHNlbGVjY2nDs24gcGFyYSBhY3R1YWxpemFyIGxvcyBncsOhZmljb3MuJzt9OwogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGVyaW9kLW1vbnRoXScpLmZvckVhY2goZWw9PmVsLm9uY2hhbmdlPSgpPT57Y29uc3QgbW9udGhzPWNoZWNrZWQoJ21vbnRoJyksYXZhaWxhYmxlPWF2YWlsYWJsZVdlZWtzVjEwKGNhdGFsb2csbW9udGhzKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2Qtd2Vla10nKS5mb3JFYWNoKGlucHV0PT57Y29uc3QgdmlzaWJsZT1hdmFpbGFibGUuc29tZSh3PT53LmtleT09PWlucHV0LmRhdGFzZXQucGVyaW9kV2Vlayk7aW5wdXQuY2xvc2VzdCgnbGFiZWwnKS5oaWRkZW49IXZpc2libGU7aWYoIXZpc2libGUpaW5wdXQuY2hlY2tlZD1mYWxzZTt9KTttYXJrUGVuZGluZygpO30pOwogLy8gQWxsIHdlZWtzIGV4aXN0IGluIHRoZSBzZWxlY3RvcjsgbW9udGggY2hhbmdlcyByZXZlYWwgb3B0aW9ucyB3aXRob3V0IHJlbmRlcmluZyB0aGUgcmVwb3J0LgogJCgnI3BlcmlvZEFwcGx5VjEwJykub25jbGljaz0oKT0+e2RlbGV0ZSBzLmxlZ2FjeURhdGVzO3MuZ3JhaW49JCgnI3BlcmlvZEdyYWluVjEwJykudmFsdWU7cy5tb250aHM9Y2hlY2tlZCgnbW9udGgnKTtzLndlZWtzPWNoZWNrZWQoJ3dlZWsnKTtzLndlZWtkYXlzPWNoZWNrZWQoJ2RheScpLm1hcChOdW1iZXIpO3JlbmRlcigpO307CiAkKCcjcGVyaW9kR3JhaW5WMTAnKS5vbmNoYW5nZT1tYXJrUGVuZGluZztkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2Qtd2Vla10sW2RhdGEtcGVyaW9kLWRheV0nKS5mb3JFYWNoKGVsPT5lbC5vbmNoYW5nZT1tYXJrUGVuZGluZyk7CiAkKCcjcGVyaW9kQWxsRGF5c1YxMCcpLm9uY2xpY2s9KCk9Pntkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJpb2QtZGF5XScpLmZvckVhY2goZWw9PmVsLmNoZWNrZWQ9dHJ1ZSk7bWFya1BlbmRpbmcoKTt9OyQoJyNwZXJpb2ROb0RheXNWMTAnKS5vbmNsaWNrPSgpPT57ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGVyaW9kLWRheV0nKS5mb3JFYWNoKGVsPT5lbC5jaGVja2VkPWZhbHNlKTttYXJrUGVuZGluZygpO307CiAkKCcjcGVyaW9kUmVzZXRWMTAnKS5vbmNsaWNrPSgpPT57ZGVsZXRlIHMubGVnYWN5RGF0ZXM7cy5tb250aHM9W2NhdGFsb2cubW9udGhzLmF0KC0xKV0uZmlsdGVyKEJvb2xlYW4pO3Mud2Vla3M9W107cy53ZWVrZGF5cz1bMCwxLDIsMyw0LDUsNl07cmVuZGVyKCk7fTtiaW5kRmlsdGVycygpOwp9CmZ1bmN0aW9uIHJlbmRlclBlcmlvZFYxMCgpewogY29uc3Qgcz1zdGF0ZVBlcmlvZFYxMCgpLGNhdGFsb2c9Y2F0YWxvZ0N1cnJlbnRWMTAoKSxyZXBvcnQ9YnVpbGRQZXJpb2RWMTAoZGF0YS5yb3dzLHMsY2F0YWxvZyk7Y3VycmVudFBlcmlvZFJlcG9ydFYxMD1yZXBvcnQ7Y2hhcnRQb2ludHNWNC5jbGVhcigpO3Jlc3BvbnNpdmVDaGFydE1vZGVsc0xBLmNsZWFyKCk7CiBkb2N1bWVudC5ib2R5LmRhdGFzZXQudmlldz1wZXJpb2RUYWJWMTA7JCgnI3RpdGxlJykudGV4dENvbnRlbnQ9cGVyaW9kVGFiVjEwOyQoJyN2aWV3SGVscCcpLnRleHRDb250ZW50PSdMb3MgcGVyw61vZG9zIHNlIGVsaWdlbiBkZW50cm8gZGUgZXN0ZSBpbmZvcm1lLic7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjZmlsdGVycycpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogY29uc3Qgc3BlYz1bWydXaW4geSBwYXlvdXQnLFsnd2luJywncG8nXV0sWydDb2luIEluIHkgYXB1ZXN0YSBwcm9tZWRpbycsWydjb2luJywnYmV0J11dLFsnUGF5b3V0IHkgZGVzdmlhY2nDs24gTkNDJyxbJ3BvJywnZGV2J11dLFsnUGF5b3V0IHkgcGF5b3V0IGNvbiBOQ0MnLFsncG8nLCdwb24nXV0sWydQcm9tbyBuZXRhIHkgZGVzdmlhY2nDs24gTkNDJyxbJ3Byb21vJywnZGV2J11dLFsnUHJlbWlvcycsWydwcml6ZSddXSxbJ1dpbiB5IGRlc3ZpYWNpw7NuIE5DQycsWyd3aW4nLCdkZXYnXV0sWydDb2luIEluIHBvciBtw6FxdWluYS1kw61hJyxbJ2NkJ11dLFsnV2luIHBvciBtw6FxdWluYS1kw61hJyxbJ3dkJ11dLFsnV2luIMK3IFNlbGVjY2nDs24geSBzYWzDs24gcHJlZmVyZW5jaWFsJyxbJ3dpbiddLHRydWVdLFsnQ29pbiBJbiDCtyBTZWxlY2Npw7NuIHkgc2Fsw7NuIHByZWZlcmVuY2lhbCcsWydjb2luJ10sdHJ1ZV1dOwogY29uc3QgY2hhcnRzPXR5cGVvZiBlZGl0YWJsZUNhcmRzUGVyaW9kVjEyPT09J2Z1bmN0aW9uJz9lZGl0YWJsZUNhcmRzUGVyaW9kVjEyKHNwZWMscmVwb3J0LHMpOnNwZWMubWFwKChbdGl0bGUsa2V5cyxwcmVmXSk9PmdyYXBoQ2FyZCh0aXRsZSxjaGFydFBlcmlvZFYxMChyZXBvcnQscyxrZXlzLHByZWYpLChwcmVmPydFbCBzYWzDs24gZXN0w6EgaW5jbHVpZG8gZW4gZWwgdG90YWw7IG5vIHN1bWFyIGzDrW5lYXMuIMK3ICc6a2V5cy5sZW5ndGg+MT8nRWplcyBpbmRlcGVuZGllbnRlcyDCtyAnOicnKSsocy5ncmFpbj09PSdvdmVybGF5Jz8nQ2FkYSBzZW1hbmEgc2UgY29tcGFyYSBlbiBsb3MgbWlzbW9zIGTDrWFzOyBsb3MgaHVlY29zIG5vIGVxdWl2YWxlbiBhIGNlcm8uJzonQWdyZWdhZG9zIGRlIGxhIHNlbGVjY2nDs247IHJldmlzYXIgZMOtYXMgZGlzcG9uaWJsZXMuJykpKS5qb2luKCcnKSx0b3RhbD1yZXBvcnQuc3VtbWFyeTsKIGNvbnN0IGhlYWRlcnM9WydQZXLDrW9kbycsJ0VzdGFkbycsJ0TDrWFzIHJlZ2lzdHJhZG9zJywnTcOhcXVpbmFzLWTDrWEnLC4uLnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9Pm1ldHJpY3Nba10pXSxkZXRhaWw9cmVwb3J0Lmxpc3QubWFwKHA9PltwLmxhYmVsVjEwKyhwLndlZWs/JyDCtyAnK3dlZWtUZXh0VjEwKHAud2Vlayk6JycpLHAub2JzZXJ2ZWQ/J0NvbiByZWdpc3Ryb3MnOidTaW4gcmVnaXN0cm8nLHAuZGF5c09ic2VydmVkLHAub2JzZXJ2ZWQ/YWdnKHAucm93cykuZGF5czpudWxsLC4uLnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9PnBba10/P251bGwpXSk7ZXhwb3J0Um93cz1baGVhZGVycywuLi5kZXRhaWxdOwogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKHBlcmlvZFRhYlYxMCwnVW4gw7puaWNvIGluZm9ybWUgcGFyYSBhZ3J1cGFyIHBvciBkw61hcywgc2VtYW5hcyBvIG1lc2VzIHkgc3VwZXJwb25lciBzZW1hbmFzIGFudGVyaW9yZXMuJykrY2hvaWNlc1BlcmlvZFYxMChzLGNhdGFsb2cpK3N0YXRDYXJkcyhbWydXSU4nLGNvbXBhY3QocmVwb3J0LnJvd3MubGVuZ3RoP3RvdGFsLndpbjpudWxsLCd3aW4nKSwnQ0xQIMK3IFNlbGVjY2nDs24gYWN0dWFsJ10sWydDT0lOIElOJyxjb21wYWN0KHJlcG9ydC5yb3dzLmxlbmd0aD90b3RhbC5jb2luOm51bGwsJ2NvaW4nKSwnQ0xQIMK3IFNlbGVjY2nDs24gYWN0dWFsJ10sWydQQVlPVVQnLGZtdCh0b3RhbC5wbywncG8nKSwnU29icmUgbG9zIHRvdGFsZXMsIG5vIHByb21lZGlvIGRlIHBvcmNlbnRhamVzJ10sWydBUFVFU1RBIFBST01FRElPJyxmbXQodG90YWwuYmV0KSwnQ0xQIHBvciBzcGluJ11dKStgPGRpdiBjbGFzcz0ibm90aWNlIj5TZW1hbmFzIGRlIGx1bmVzIGEgZG9taW5nbywgaWRlbnRpZmljYWRhcyBwb3Igc3UgZmVjaGEgZGUgaW5pY2lvLiBBbCBlbGVnaXIgc2VtYW5hcyBzZSBpbmNsdXllbiBzdXMgZMOtYXMgY29tcGxldG9zIGF1bnF1ZSBjcnVjZW4gZGUgbWVzLiBFbiB2aXN0YSBtZW5zdWFsIHNlIHJlc3BldGFuIGxvcyBsw61taXRlcyBkZWwgbWVzLiBEw61hcyBzaW4gcmVnaXN0cm9zOiDCq+KAlMK7OyBkw61hcyBjb24gcmVnaXN0cm9zIHkgdmFsb3JlcyBjZXJvOiAwLiBMYXMgc2VtYW5hcyBwYXJjaWFsZXMgcHVlZGVuIG5vIHNlciBjb21wYXJhYmxlcyBwb3IgdG90YWxlczsgdGFtYmnDqW4gdGllbmVzIGluZGljYWRvcmVzIHBvciBtw6FxdWluYS1kw61hLjwvZGl2PjxkaXYgY2xhc3M9InBlcmlvZENvdmVyYWdlVjEwIj4ke3JlcG9ydC5yb3dzLmxlbmd0aC50b0xvY2FsZVN0cmluZygnZXMtQ0wnKX0gcmVnaXN0cm9zIMK3ICR7bmV3IFNldChyZXBvcnQucm93cy5tYXAocj0+clswXSkpLnNpemV9IGZlY2hhcyBjb24gZGF0b3MgwrcgJHtzLmdyYWluPT09J292ZXJsYXknP3JlcG9ydC5zZXJpZXMubGVuZ3RoKycgc2VtYW5hcyBzdXBlcnB1ZXN0YXMnOnJlcG9ydC5saXN0Lmxlbmd0aCsnIHBlcsOtb2Rvcyd9PC9kaXY+PGRpdiBjbGFzcz0icmVwb3J0Y2hhcnRzIj4ke2NoYXJ0c308L2Rpdj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPkRldGFsbGUgZGUgcGVyw61vZG9zIHkgY29iZXJ0dXJhPC9oMj48ZGl2IGlkPSJwZXJpb2REZXRhaWxWMTAiPjwvZGl2Pjwvc2VjdGlvbj5gOwogcGFya1RhYmxlTEEoJCgnI3BlcmlvZERldGFpbFYxMCcpLGhlYWRlcnMsZGV0YWlsLGhlYWRlcnMubWFwKChoLGkpPT5bJ3BvJywncG9uJywnZGV2Jywnb2NjJ10uaW5jbHVkZXMocGVyaW9kTWV0cmljc1YxMFtpLTRdKT9wZXJjZW50UGFya0xBOm51bGwpKTtiaW5kUGVyaW9kVjEwKHMsY2F0YWxvZyk7CiAkKCcjY29udGVudCcpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsYWN0aXZlRmlsdGVyc0xBKCkpO2RlY29yYXRlQ2hhcnRzVjgoKTtlbmhhbmNlVGFibGVzTEEoKTtjb25maWd1cmVSZXBvcnRDaGFydHNMQSgpO2ZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO3BvbGlzaFZpc3VhbExBKCk7Zm9ybWF0VGV4dERhdGVzVjUoJCgnI2NvbnRlbnQnKSk7CiBpZih0eXBlb2YgYmluZEVkaXRhYmxlUGVyaW9kVjEyPT09J2Z1bmN0aW9uJyliaW5kRWRpdGFibGVQZXJpb2RWMTIoc3BlYyk7CiBzZXR1cEV4cGVyaWVuY2VIZWFkZXJMQSgpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhU3RhdHVzTEEnKT8ucmVtb3ZlKCk7Y29uc3Qgc3RhdHVzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3N0YXR1cy5pZD0nZGF0YVN0YXR1c0xBJztzdGF0dXMuY2xhc3NOYW1lPSdkYXRhU3RhdHVzTEEnO3N0YXR1cy5pbm5lckhUTUw9ZGF0YVN0YXR1c0xBKCk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJykuYWZ0ZXIoc3RhdHVzKTsKIC8vIFJlc3RvcmUgdmlzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhbCBkYXRlIHBhbmVsIHdoZW4gdmlzaXRpbmcgYSBkaWZmZXJlbnQgdGFiLgogY29uc3QgZm9sZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsdGVycycpPy5jbG9zZXN0KCdkZXRhaWxzLmNvbXBhY3RGb2xkTEEnKTtpZihmb2xkKWZvbGQuc3R5bGUuZGlzcGxheT0nbm9uZSc7Cn0KY29uc3QgYWN0aXZlRmlsdGVyc0JlZm9yZVBlcmlvZFYxMD1hY3RpdmVGaWx0ZXJzTEE7CmFjdGl2ZUZpbHRlcnNMQT1mdW5jdGlvbigpe2lmKHRhYiE9PXBlcmlvZFRhYlYxMClyZXR1cm4gYWN0aXZlRmlsdGVyc0JlZm9yZVBlcmlvZFYxMCgpO3JldHVybiAnPGRpdiBjbGFzcz0iYWN0aXZlRmlsdGVyc0xBIj48Yj5Db25zdWx0YSBhY3R1YWw8L2I+PHNwYW4+Jytlc2ModGV4dFBlcmlvZFYxMCgpKSsnPC9zcGFuPicrZmlsdGVyVGV4dExBKHN0YXRlUGVyaW9kVjEwKCkuZmlsdGVycykubWFwKHQ9Pic8c3BhbiBjbGFzcz0iZmlsdGVyQ2hpcExBIj4nK2VzYyh0KSsnPC9zcGFuPicpLmpvaW4oJycpKyc8L2Rpdj4nO307CmNvbnN0IHNlbGVjdGVkQmVmb3JlUGVyaW9kVjEwPXNlbGVjdGVkRGF0ZVRleHRWODsKc2VsZWN0ZWREYXRlVGV4dFY4PWZ1bmN0aW9uKHNjb3BlKXtyZXR1cm4gdGFiPT09cGVyaW9kVGFiVjEwJiZzY29wZT09PSdnbG9iYWwnP3RleHRQZXJpb2RWMTAoKTpzZWxlY3RlZEJlZm9yZVBlcmlvZFYxMChzY29wZSk7fTsKY29uc3QgYWN0aXZhdGVCZWZvcmVQZXJpb2RWMTA9YWN0aXZhdGVUYWJWMzsKYWN0aXZhdGVUYWJWMz1mdW5jdGlvbihuZXh0KXtpZihuZXh0PT09J1JlcG9ydGUgc2VtYW5hbCd8fG5leHQ9PT0nUmVwb3J0ZSBtZW5zdWFsJyl7Y29uc3Qga2V5PW5leHQ9PT0nUmVwb3J0ZSBtZW5zdWFsJz8nbW9udGhseSc6J3dlZWtseScscz1zdGF0ZVBlcmlvZFYxMChrZXkpO2NsZWFyUG96b0ZpbHRlcnNMQSgpO3MuZ3JhaW49a2V5PT09J21vbnRobHknPydtb250aCc6J3dlZWsnO3MuZmlsdGVycz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZpZXdTdGF0ZVtrZXldPy5maWx0ZXJzfHx7fSkpO3MubGVnYWN5RGF0ZXM9Wy4uLm5ldyBTZXQoc2xpY2VSb3dzKHMuZmlsdGVycykubWFwKHI9PnJbMF0pKV0uc29ydCgpO3MubW9udGhzPVsuLi5uZXcgU2V0KHMubGVnYWN5RGF0ZXMubWFwKGQ9PmQuc2xpY2UoMCw3KSkpXTtzLndlZWtzPWtleT09PSd3ZWVrbHknP1suLi5uZXcgU2V0KHMubGVnYWN5RGF0ZXMubWFwKG1vbmRheVYxMCkpXTpbXTtuZXh0PXBlcmlvZFRhYlYxMDt9YWN0aXZhdGVCZWZvcmVQZXJpb2RWMTAobmV4dCk7fTsKY29uc3Qgd2Vla2x5QnV0dG9uVjEwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdiBidXR0b25bZGF0YS10YWI9IlJlcG9ydGUgc2VtYW5hbCJdJyk7d2Vla2x5QnV0dG9uVjEwLmRhdGFzZXQudGFiPXBlcmlvZFRhYlYxMDt3ZWVrbHlCdXR0b25WMTAudGV4dENvbnRlbnQ9J+KWpiAgJytwZXJpb2RUYWJWMTA7d2Vla2x5QnV0dG9uVjEwLm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMocGVyaW9kVGFiVjEwKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJSZXBvcnRlIG1lbnN1YWwiXScpPy5yZW1vdmUoKTsKY29uc3Qgb2xkV2Vla1RhYkluZGV4VjEwPXRhYnNWMy5pbmRleE9mKCdSZXBvcnRlIHNlbWFuYWwnKTtpZihvbGRXZWVrVGFiSW5kZXhWMTA+PTApdGFic1YzW29sZFdlZWtUYWJJbmRleFYxMF09cGVyaW9kVGFiVjEwO2NvbnN0IG9sZE1vbnRoVGFiSW5kZXhWMTA9dGFic1YzLmluZGV4T2YoJ1JlcG9ydGUgbWVuc3VhbCcpO2lmKG9sZE1vbnRoVGFiSW5kZXhWMTA+PTApdGFic1YzLnNwbGljZShvbGRNb250aFRhYkluZGV4VjEwLDEpOwpjb25zdCByZW5kZXJCZWZvcmVQZXJpb2RWMTA9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtpZihkYXRhJiZ0YWI9PT1wZXJpb2RUYWJWMTApe3NsaWNlQ2FjaGVGYXN0TEE9bmV3IE1hcCgpO2FnZ3JlZ2F0ZUNhY2hlRmFzdExBPW5ldyBXZWFrTWFwKCk7Y2xlYXJQb3pvRmlsdGVyc0xBKCk7Y2xvc2VTcGFuaXNoQ2FsZW5kYXJMQShmYWxzZSk7cmVuZGVyUGVyaW9kVjEwKCk7fWVsc2UgcmVuZGVyQmVmb3JlUGVyaW9kVjEwKCk7fTsKY29uc3QgZXhwb3J0QmVmb3JlUGVyaW9kVjEwPSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKIGlmKHRhYiE9PXBlcmlvZFRhYlYxMClyZXR1cm4gZXhwb3J0QmVmb3JlUGVyaW9kVjEwKCk7Y29uc3Qgcz1zdGF0ZVBlcmlvZFYxMCgpLHI9Y3VycmVudFBlcmlvZFJlcG9ydFYxMCxkYWlseT1yLnNlcmllcy5sZW5ndGg/ci5zZXJpZXMuZmxhdE1hcChnPT5nLnBvaW50cyk6cy5ncmFpbj09PSdkYXknP3IubGlzdDpncm91cHMoci5yb3dzLHJvdz0+cm93WzBdKS5zb3J0KChhLGIpPT5hLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKS5tYXAoZz0+KHsuLi5nLGRhdGU6Zy5uYW1lLHdlZWs6bW9uZGF5VjEwKGcubmFtZSksZGF5OihuZXcgRGF0ZShnLm5hbWUrJ1QxMjowMDowMFonKS5nZXRVVENEYXkoKSs2KSU3LG9ic2VydmVkOnRydWV9KSk7CiBjb25zdCByb3dzPVtbJ1NlbWFuYSBkZXNkZScsJ0ZlY2hhJywnRMOtYScsJ0VzdGFkbycsLi4ucGVyaW9kTWV0cmljc1YxMC5tYXAoaz0+bWV0cmljc1trXSldLC4uLmRhaWx5Lm1hcChwPT5bcC53ZWVrfHwnJyxwLmRhdGUscC5kYXkhPW51bGw/cGVyaW9kRGF5c1YxMFtwLmRheV06cC5sYWJlbFYxMCxwLm9ic2VydmVkPydDb24gcmVnaXN0cm9zJzonU2luIHJlZ2lzdHJvJywuLi5wZXJpb2RNZXRyaWNzVjEwLm1hcChrPT5wW2tdPz9udWxsKV0pXSxwcmVmPVtleHBvcnRSb3dzWzBdLC4uLnIubGlzdC5tYXAocHJlZmVyUG9pbnRQZXJpb2RWMTApLm1hcChwPT5bcC5sYWJlbFYxMCsocC53ZWVrPycgwrcgJyt3ZWVrVGV4dFYxMChwLndlZWspOicnKSxwLm9ic2VydmVkPydDb24gcmVnaXN0cm9zJzonU2luIHJlZ2lzdHJvJyxwLmRheXNPYnNlcnZlZCxwLm9ic2VydmVkP2FnZyhwLnJvd3MpLmRheXM6bnVsbCwuLi5wZXJpb2RNZXRyaWNzVjEwLm1hcChrPT5wW2tdPz9udWxsKV0pXTsKIGRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFsuLi4odHlwZW9mIHNhbG9uRXhwb3J0VjIwPT09J2Z1bmN0aW9uJz9zYWxvbkV4cG9ydFYyMCgpOltdKSx7bmFtZTonUGVyaW9kb3MnLHJvd3M6ZXhwb3J0Um93c30se25hbWU6J0NvbXBhcmFjaW9uIGRpYXJpYScscm93c30se25hbWU6J1ByZWZlcmVuY2lhbCBmaWx0cmFkbycscm93czpwcmVmfSx7bmFtZTonQ29uc3VsdGEnLHJvd3M6W1snSW5mb3JtZScscGVyaW9kVGFiVjEwXSxbJ1NlbGVjY2nDs24nLHRleHRQZXJpb2RWMTAoKV0sWydDb25maWd1cmFjacOzbicsSlNPTi5zdHJpbmdpZnkocyldLFsnR3LDoWZpY29zIGVsZWdpZG9zJywocy5jaGFydFNlbGVjdGlvbnx8W10pLmpvaW4oJyAvICcpXSxbJ05vdGEnLCdTZW1hbmFzIGx1bmVzLWRvbWluZ28uIEF1c2VudGUgPSBjZWxkYSB2YWPDrWEsIG5vIGNlcm87IHBvcmNlbnRhamVzIHNvYnJlIGxvcyB0b3RhbGVzLiddXX1dKSwnTEEtQW5hbGlzaXMtcG9yLXBlcmlvZG8ueGxzeCcpOwp9OwoKZnVuY3Rpb24gbm9ybWFsaXplQ2hhcnRLZXlzVjEyKGtleXMsZmFsbGJhY2spe2NvbnN0IHZhbGlkPUFycmF5LmlzQXJyYXkoa2V5cyk/Wy4uLm5ldyBTZXQoa2V5cy5maWx0ZXIoaz0+cGVyaW9kTWV0cmljc1YxMC5pbmNsdWRlcyhrKSkpXTpbXTtyZXR1cm4gdmFsaWQubGVuZ3RoJiZ2YWxpZC5sZW5ndGg8PTM/dmFsaWQ6Wy4uLmZhbGxiYWNrXTt9CmZ1bmN0aW9uIHNldHRpbmdzQ2hhcnRzVjEyKHN0YXRlKXtpZighc3RhdGUuY2hhcnRNZXRyaWNzVjEyKXtsZXQgc2F2ZWQ7dHJ5e3NhdmVkPUpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xBX1BFUklPRF9FRElUQUJMRV9WMTInKXx8J251bGwnKX1jYXRjaChlKXt9c3RhdGUuY2hhcnRNZXRyaWNzVjEyPXNhdmVkJiZ0eXBlb2Ygc2F2ZWQ9PT0nb2JqZWN0JyYmIUFycmF5LmlzQXJyYXkoc2F2ZWQpP3NhdmVkOnt9O31yZXR1cm4gc3RhdGUuY2hhcnRNZXRyaWNzVjEyO30KZnVuY3Rpb24gZWRpdGFibGVDYXJkc1BlcmlvZFYxMihzcGVjLHJlcG9ydCxzdGF0ZSl7CiBjb25zdCBzZXR0aW5ncz1zZXR0aW5nc0NoYXJ0c1YxMihzdGF0ZSk7cmV0dXJuIHNwZWMubWFwKChbb3JpZ2luYWwsZGVmYXVsdHMscHJlZkRlZmF1bHRdLGluZGV4KT0+ewogIGlmKChpbmRleD09PTl8fGluZGV4PT09MTApJiZ0eXBlb2YgY2FyZFNhbG9uc1YyMD09PSdmdW5jdGlvbicmJmN1cnJlbnRTYWxvbnNWMjApcmV0dXJuIGNhcmRTYWxvbnNWMjAoaW5kZXgsb3JpZ2luYWwsY3VycmVudFNhbG9uc1YyMCxzdGF0ZSk7CiAgY29uc3Qgc2F2ZWQ9c2V0dGluZ3NbaW5kZXhdLGtleXM9bm9ybWFsaXplQ2hhcnRLZXlzVjEyKHNhdmVkPy5rZXlzLGRlZmF1bHRzKSxwcmVmPXR5cGVvZiBzYXZlZD8ucHJlZmVyZW50aWFsPT09J2Jvb2xlYW4nP3NhdmVkLnByZWZlcmVudGlhbDohIXByZWZEZWZhdWx0OwogIGNvbnN0IG9wdGlvbnM9c2VsZWN0ZWQ9PnBlcmlvZE1ldHJpY3NWMTAubWFwKGs9PmA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2s9PT1zZWxlY3RlZD8nc2VsZWN0ZWQnOicnfT4ke2VzYyhtZXRyaWNzW2tdKX08L29wdGlvbj5gKS5qb2luKCcnKTsKICBjb25zdCBlZGl0b3I9YDxkZXRhaWxzIGNsYXNzPSJjaGFydEVkaXRvclYxMiIgZGF0YS1jaGFydC1lZGl0b3I9IiR7aW5kZXh9Ij48c3VtbWFyeT5FZGl0YXIgaW5kaWNhZG9yZXMgwrcgJHtrZXlzLmxlbmd0aH0gZGUgMzwvc3VtbWFyeT48ZGl2IGNsYXNzPSJjaGFydEVkaXRvckZpZWxkc1YxMiI+JHtbMCwxLDJdLm1hcChpPT5gPGxhYmVsPkRhdG8gJHtpKzF9JHtpPycgwrcgb3BjaW9uYWwnOicnfTxzZWxlY3QgZGF0YS1jaGFydC1tZXRyaWMtc2xvdD0iJHtpbmRleH0iIGRhdGEtY2hhcnQtbWV0cmljLXBvc2l0aW9uPSIke2l9Ij4ke2k/JzxvcHRpb24gdmFsdWU9IiI+U2luIGRhdG8gYWRpY2lvbmFsPC9vcHRpb24+JzonJ30ke29wdGlvbnMoa2V5c1tpXSl9PC9zZWxlY3Q+PC9sYWJlbD5gKS5qb2luKCcnKX08bGFiZWwgY2xhc3M9ImNoYXJ0UHJlZlYxMiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLWNoYXJ0LXByZWZlcmVudGlhbD0iJHtpbmRleH0iICR7cHJlZj8nY2hlY2tlZCc6Jyd9PkNvbXBhcmFyIGNvbiBzYWzDs24gcHJlZmVyZW5jaWFsPC9sYWJlbD48ZGl2PjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNoYXJ0LWFwcGx5PSIke2luZGV4fSIgY2xhc3M9InByaW1hcnkiPkFwbGljYXIgYSBlc3RlIGdyw6FmaWNvPC9idXR0b24+IDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLWNoYXJ0LXJlc2V0PSIke2luZGV4fSI+UmVzdGFibGVjZXIgZXN0ZSBncsOhZmljbzwvYnV0dG9uPjwvZGl2PjxzcGFuIGRhdGEtY2hhcnQtZWRpdG9yLXN0YXR1cz0iJHtpbmRleH0iIHJvbGU9InN0YXR1cyI+PC9zcGFuPjwvZGl2PjwvZGV0YWlscz5gOwogIHJldHVybiBgPGRpdiBjbGFzcz0iY2FyZCIgZGF0YS1wZXJpb2QtY2hhcnQtc2xvdD0iJHtpbmRleH0iIGRhdGEtY2hhcnQtc2xvdC10aXRsZT0iJHtlc2Mob3JpZ2luYWwpfSI+PHNtYWxsIGNsYXNzPSJjaGFydFNsb3RWMTIiPkdyw6FmaWNvICR7aW5kZXgrMX08L3NtYWxsPjxoMj4ke2tleXMubWFwKGs9PmVzYyhtZXRyaWNzW2tdKSkuam9pbignICsgJyl9JHtwcmVmPycgwrcgc2VsZWNjacOzbiB5IHByZWZlcmVuY2lhbCc6Jyd9PC9oMj4ke2VkaXRvcn08cCBjbGFzcz0ic2lnbmFsbm90ZSI+JHtrZXlzLmxlbmd0aD4xPydDYWRhIGluZGljYWRvciB0aWVuZSBzdSBwcm9waWEgZXNjYWxhOyBjb21wYXJhIHN1cyB1bmlkYWRlcywgbm8gbGEgYWx0dXJhIGVudHJlIGluZGljYWRvcmVzLiAnOicnfSR7cHJlZj8nUHJlZmVyZW5jaWFsIGVzdMOhIGluY2x1aWRvIGVuIGxhIHNlbGVjY2nDs247IG5vIHN1bWFyIGzDrW5lYXMuICc6Jyd9JHtzdGF0ZS5ncmFpbj09PSdvdmVybGF5Jz8nU2UgY29tcGFyYW4gbG9zIG1pc21vcyBkw61hcyBkZSBjYWRhIHNlbWFuYS4nOidQZXLDrW9kb3MgZGUgbGEgc2VsZWNjacOzbiBhY3R1YWwuJ308L3A+JHtjaGFydFBlcmlvZFYxMChyZXBvcnQsc3RhdGUsa2V5cyxwcmVmKX08L2Rpdj5gOwogfSkuam9pbignJyk7Cn0KZnVuY3Rpb24gYmluZEVkaXRhYmxlUGVyaW9kVjEyKHNwZWMpewogY29uc3Qgc3RhdGU9c3RhdGVQZXJpb2RWMTAoKSxzZXR0aW5ncz1zZXR0aW5nc0NoYXJ0c1YxMihzdGF0ZSk7CiBjb25zdCByZW1lbWJlcj0oKT0+e3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTEFfUEVSSU9EX0VESVRBQkxFX1YxMicsSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpKTt9Y2F0Y2goZSl7fX07CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1hcHBseV0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9YXN5bmMoKT0+ewogIGNvbnN0IGluZGV4PU51bWJlcihidXR0b24uZGF0YXNldC5jaGFydEFwcGx5KSxrZXlzPVsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1tZXRyaWMtc2xvdD0iJytpbmRleCsnIl0nKV0ubWFwKGVsPT5lbC52YWx1ZSkuZmlsdGVyKEJvb2xlYW4pLHN0YXR1cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFydC1lZGl0b3Itc3RhdHVzPSInK2luZGV4KyciXScpOwogIGlmKCFrZXlzLmxlbmd0aHx8a2V5cy5sZW5ndGg+M3x8bmV3IFNldChrZXlzKS5zaXplIT09a2V5cy5sZW5ndGgpe3N0YXR1cy50ZXh0Q29udGVudD0nRWxpZ2UgZW50cmUgdW5vIHkgdHJlcyBpbmRpY2Fkb3JlcyBkaXN0aW50b3MuJztyZXR1cm47fQogIHNldHRpbmdzW2luZGV4XT17a2V5cyxwcmVmZXJlbnRpYWw6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcnQtcHJlZmVyZW50aWFsPSInK2luZGV4KyciXScpLmNoZWNrZWR9O3JlbWVtYmVyKCk7YXdhaXQgbmF2aWdhdGVWaXN1YWxMQShwZXJpb2RUYWJWMTApOwogfSk7CiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jaGFydC1yZXNldF0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLm9uY2xpY2s9YXN5bmMoKT0+e2NvbnN0IGluZGV4PU51bWJlcihidXR0b24uZGF0YXNldC5jaGFydFJlc2V0KTtkZWxldGUgc2V0dGluZ3NbaW5kZXhdO3JlbWVtYmVyKCk7YXdhaXQgbmF2aWdhdGVWaXN1YWxMQShwZXJpb2RUYWJWMTApO30pOwp9Cgpjb25zdCBzZXJpZXNQYWxldHRlVjEzPVtbJyMxODU5YjUnLCdhenVsJ10sWycjY2Y1NzAwJywnbmFyYW5qYSddLFsnIzAwN2Y2NCcsJ3ZlcmRlJ10sWycjNzY0NGI3JywndmlvbGV0YSddLFsnI2JlMjg2YScsJ21hZ2VudGEnXSxbJyM2YTc0MDAnLCdvbGl2YSddLFsnI2I4MzIyNycsJ3Jvam8nXSxbJyMwMDdhOTknLCdhenVsIHBldHLDs2xlbyddLFsnIzc5NTAzNycsJ21hcnLDs24nXSxbJyM0NjU2NmEnLCdncmlzIHBpemFycmEnXSxbJyNhNzdjMDAnLCdvY3JlJ11dOwpjb25zdCBzZXJpZXNQYXR0ZXJuc1YxMz1bWycnLCdsw61uZWEgY29udGludWEnXSxbJzkgNCcsJ2zDrW5lYSBkaXNjb250aW51YSddLFsnMiA0JywnbMOtbmVhIGRlIHB1bnRvcyddLFsnMTAgMyAyIDMnLCdsw61uZWEgZGUgcmF5YSB5IHB1bnRvJ10sWycxMCAzIDIgMyAyIDMnLCdsw61uZWEgZGUgcmF5YSB5IGRvcyBwdW50b3MnXSxbJzQgMycsJ2zDrW5lYSBkZSB0cmF6b3MgY29ydG9zJ11dOwpmdW5jdGlvbiBzZXJpZXNTdHlsZVYxMyhtb2RlbCxpbmRleCl7Y29uc3RbY29sb3IsY29sb3JOYW1lXT1zZXJpZXNQYWxldHRlVjEzW2luZGV4JXNlcmllc1BhbGV0dGVWMTMubGVuZ3RoXSxncm91cD1tb2RlbC5hbGlnbmVkV2Vla3NWMTA/TWF0aC5mbG9vcihpbmRleC8obW9kZWwubWV0cmljQ291bnRWMTB8fDEpKTppbmRleCxbZGFzaCxsaW5lTmFtZV09c2VyaWVzUGF0dGVybnNWMTNbZ3JvdXAlc2VyaWVzUGF0dGVybnNWMTMubGVuZ3RoXTtyZXR1cm57Y29sb3IsY29sb3JOYW1lLGRhc2gsbGluZU5hbWV9O30KY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT1mdW5jdGlvbihtb2RlbCl7cmV0dXJuIG1vZGVsLnNlcmllcy5tYXAoKF8saSk9PnNlcmllc1N0eWxlVjEzKG1vZGVsLGkpLmNvbG9yKTt9OwpmdW5jdGlvbiBkZWNvcmF0ZVNlcmllc0xlZ2VuZFYxMyhob3N0LG1vZGVsKXsKIGNvbnN0IGxlZ2VuZD1ob3N0LmNsb3Nlc3QoJy5jYXJkJyk/LnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbGVkbGVnZW5kJyk7aWYoIWxlZ2VuZClyZXR1cm47CiBbLi4ubGVnZW5kLmNoaWxkcmVuXS5maWx0ZXIoZWw9PmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSdzcGFuJykuZm9yRWFjaCgoZW50cnksaSk9PnsKICBpZighbW9kZWwuc2VyaWVzW2ldKXJldHVybjtjb25zdCBzdHlsZT1zZXJpZXNTdHlsZVYxMyhtb2RlbCxpKSxsYWJlbD1lbnRyeS5kYXRhc2V0Lm9yaWdpbmFsTGVnZW5kVjEzfHxlbnRyeS50ZXh0Q29udGVudC50cmltKCk7ZW50cnkuZGF0YXNldC5vcmlnaW5hbExlZ2VuZFYxMz1sYWJlbDsKICBlbnRyeS50ZXh0Q29udGVudD0nJztjb25zdCBzYW1wbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ3N2ZycpO3NhbXBsZS5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCcwIDAgNDggMTYnKTtzYW1wbGUuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtzYW1wbGUuY2xhc3NMaXN0LmFkZCgnc2VyaWVzU3dhdGNoVjEzJyk7c2FtcGxlLnN0eWxlLndpZHRoPSc0OHB4JztzYW1wbGUuc3R5bGUuaGVpZ2h0PScxNnB4JztzYW1wbGUuc3R5bGUubWluV2lkdGg9JzQ4cHgnOwogIHNhbXBsZS5pbm5lckhUTUw9YDxsaW5lIHgxPSIyIiB5MT0iOCIgeDI9IjQ2IiB5Mj0iOCIgc3Ryb2tlPSIke3N0eWxlLmNvbG9yfSIgc3Ryb2tlLXdpZHRoPSIzIiAke3N0eWxlLmRhc2g/J3N0cm9rZS1kYXNoYXJyYXk9Iicrc3R5bGUuZGFzaCsnIic6Jyd9Lz5gOwogIGVudHJ5LmFwcGVuZENoaWxkKHNhbXBsZSk7ZW50cnkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGFiZWwrJyDCtyAnK3N0eWxlLmxpbmVOYW1lKycgwrcgJytzdHlsZS5jb2xvck5hbWUpKTtlbnRyeS50aXRsZT1sYWJlbCsnIMK3ICcrc3R5bGUubGluZU5hbWUrJyDCtyAnK3N0eWxlLmNvbG9yTmFtZTtlbnRyeS5kYXRhc2V0LnNlcmllc0NvbG9yVjEzPXN0eWxlLmNvbG9yO2VudHJ5LmRhdGFzZXQuc2VyaWVzRGFzaFYxMz1zdHlsZS5kYXNoOwogfSk7Cn0KY29uc3QgYmFyc0JlZm9yZUNvbnRyYXN0VjEzPWJhcnNWMjsKYmFyc1YyPWZ1bmN0aW9uKGl0ZW1zLGtleSxjb2xvcil7Y29uc3QgaHRtbD1iYXJzQmVmb3JlQ29udHJhc3RWMTMoaXRlbXMsa2V5LGNvbG9yKTtpZihyYXRpb0tleXNWNi5pbmNsdWRlcyhrZXkpKXJldHVybiBodG1sO2xldCBpPTA7cmV0dXJuIGh0bWwucmVwbGFjZSgvKDxkaXYgY2xhc3M9ImJhciIgc3R5bGU9IlteIl0qYmFja2dyb3VuZDopW147IlxzXSsvZywoXyxwcmVmaXgpPT5wcmVmaXgrc2VyaWVzUGFsZXR0ZVYxM1soaSsrKSVzZXJpZXNQYWxldHRlVjEzLmxlbmd0aF1bMF0pO307CmNvbnN0IHByaXplUmFua2luZ0JlZm9yZUNvbnRyYXN0VjEzPXByaXplUmFua2luZ0xBOwpwcml6ZVJhbmtpbmdMQT1mdW5jdGlvbihsaXN0KXtsZXQgaT0wO3JldHVybiBwcml6ZVJhbmtpbmdCZWZvcmVDb250cmFzdFYxMyhsaXN0KS5yZXBsYWNlKC8oPHJlY3RcYltePl0qZmlsbD0iKSMxMzhmOTMvZywoXyxwcmVmaXgpPT5wcmVmaXgrc2VyaWVzUGFsZXR0ZVYxM1soaSsrKSVzZXJpZXNQYWxldHRlVjEzLmxlbmd0aF1bMF0pO307CgovLyBTbG90cyAxMC8xMSBhbHdheXMgY29tcGFyZSBkaXNqb2ludCBwYXJrLXdpZGUgZ3JvdXBzIG92ZXIgdGhlIGNob3NlbiBkYXRlcy4KbGV0IGN1cnJlbnRTYWxvbnNWMjA9bnVsbDsKbGV0IHNhbG9uUG9pbnRDYWNoZVYyMD1uZXcgV2Vha01hcCgpOwpjb25zdCBzYWxvbkJhcnNWMjA9bmV3IE1hcCgpOwpmdW5jdGlvbiBzYWxvblBvaW50VjIwKHBvaW50KXsKIGlmKHNhbG9uUG9pbnRDYWNoZVYyMC5oYXMocG9pbnQucm93cykpcmV0dXJue3BvaW50LC4uLnNhbG9uUG9pbnRDYWNoZVYyMC5nZXQocG9pbnQucm93cyl9OwogY29uc3QgcHJlZj1wb2ludC5yb3dzLmZpbHRlcihwcmVmZXJlbmNpYWwpLHJlc3Q9cG9pbnQucm93cy5maWx0ZXIocj0+IXByZWZlcmVuY2lhbChyKSk7CiBjb25zdCBtZXRyaWNzRm9yPXJvd3M9PnJvd3MubGVuZ3RoP2FnZyhyb3dzKTp7d2luOm51bGwsY29pbjpudWxsfTsKIGNvbnN0IHJlc3VsdD17cHJlZjptZXRyaWNzRm9yKHByZWYpLHJlc3Q6bWV0cmljc0ZvcihyZXN0KSx0b3RhbDptZXRyaWNzRm9yKHBvaW50LnJvd3MpLHByZWZEYXlzOm5ldyBTZXQocHJlZi5tYXAocj0+clswXSkpLnNpemUscmVzdERheXM6bmV3IFNldChyZXN0Lm1hcChyPT5yWzBdKSkuc2l6ZX07c2Fsb25Qb2ludENhY2hlVjIwLnNldChwb2ludC5yb3dzLHJlc3VsdCk7cmV0dXJue3BvaW50LC4uLnJlc3VsdH07Cn0KZnVuY3Rpb24gc2hhcmVTYWxvbnNWMjAocHJlZixyZXN0LHRvdGFsKXtyZXR1cm4gcHJlZiE9bnVsbCYmcmVzdCE9bnVsbCYmcHJlZj49MCYmcmVzdD49MCYmdG90YWw+MD9wcmVmL3RvdGFsOm51bGw7fQpmdW5jdGlvbiBhbW91bnRTYWxvbnNWMjAodixrKXtyZXR1cm4gdj09bnVsbD8nU2luIHJlZ2lzdHJvcyc6Zm10KHYsaykrJyBDTFAnO30KZnVuY3Rpb24gcGVyY2VudFNhbG9uc1YyMCh2KXtyZXR1cm4gdj09bnVsbD8n4oCUJzoodioxMDApLnRvTG9jYWxlU3RyaW5nKCdlcy1DTCcse21heGltdW1GcmFjdGlvbkRpZ2l0czoxfSkrJyAlJzt9CmZ1bmN0aW9uIHJvd3NTYWxvbnNWMjAocmVwb3J0KXtyZXR1cm4gcmVwb3J0Lmxpc3QubWFwKHNhbG9uUG9pbnRWMjApO30KZnVuY3Rpb24gbGluZXNTYWxvbnNWMjAocmVwb3J0LHN0YXRlLGtleSl7CiBjb25zdCBzZXRzPXN0YXRlLmdyYWluPT09J292ZXJsYXknP3JlcG9ydC5zZXJpZXM6W3tuYW1lOicnLHBvaW50czpyZXBvcnQubGlzdH1dLHNlcmllcz1zZXRzLmZsYXRNYXAoc2V0PT5bCiAge25hbWU6KHNldC5uYW1lP3NldC5uYW1lKycgwrcgJzonJykrJ1ByZWZlcmVuY2lhbCcscG9pbnRzOnNldC5wb2ludHMubWFwKHA9Pih7Li4ucCxba2V5XTpzYWxvblBvaW50VjIwKHApLnByZWZba2V5XX0pKX0sCiAge25hbWU6KHNldC5uYW1lP3NldC5uYW1lKycgwrcgJzonJykrJ1Jlc3RvIGRlIHNhbG9uZXMnLHBvaW50czpzZXQucG9pbnRzLm1hcChwPT4oey4uLnAsW2tleV06c2Fsb25Qb2ludFYyMChwKS5yZXN0W2tleV19KSl9CiBdKTsKIGNvbnN0IGh0bWw9bGFiZWxlZENoYXJ0VjQoc2VyaWVzLGtleSksaWQ9aHRtbC5tYXRjaCgvZGF0YS1yZXNwb25zaXZlLWNoYXJ0LWxhPSIoW14iXSspIi8pPy5bMV0sbW9kZWw9cmVzcG9uc2l2ZUNoYXJ0TW9kZWxzTEEuZ2V0KGlkKTsKIGlmKG1vZGVsKU9iamVjdC5hc3NpZ24obW9kZWwse3BlcmlvZFYxMDp0cnVlLHNhbG9uQ29tcG9zaXRpb25WMjA6dHJ1ZSxhbGlnbmVkV2Vla3NWMTA6c3RhdGUuZ3JhaW49PT0nb3ZlcmxheScsbWV0cmljQ291bnRWMTA6Mn0pOwogcmV0dXJuIGh0bWw7Cn0KY29uc3Qgc3R5bGVCZWZvcmVTYWxvbnNWMjA9c2VyaWVzU3R5bGVWMTM7CnNlcmllc1N0eWxlVjEzPWZ1bmN0aW9uKG1vZGVsLGluZGV4KXtpZighbW9kZWwuc2Fsb25Db21wb3NpdGlvblYyMClyZXR1cm4gc3R5bGVCZWZvcmVTYWxvbnNWMjAobW9kZWwsaW5kZXgpO2NvbnN0IGdyb3VwPWluZGV4JTIsd2Vlaz1tb2RlbC5hbGlnbmVkV2Vla3NWMTA/TWF0aC5mbG9vcihpbmRleC8yKTpncm91cCxbZGFzaCxsaW5lTmFtZV09c2VyaWVzUGF0dGVybnNWMTNbd2VlayVzZXJpZXNQYXR0ZXJuc1YxMy5sZW5ndGhdO3JldHVybntjb2xvcjpncm91cD8nIzQ2Njg4MSc6JyNjNjRiMDgnLGNvbG9yTmFtZTpncm91cD8nYXp1bCBncmlzw6FjZW8nOiduYXJhbmphJyxkYXNoLGxpbmVOYW1lfTt9Owpjb25zdCBjb2xvcnNCZWZvcmVTYWxvbnNWMjA9Y2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQTsKY2hhcnRTZXJpZXNDb2xvcnNWaXN1YWxMQT1mdW5jdGlvbihtb2RlbCl7cmV0dXJuIG1vZGVsLnNhbG9uQ29tcG9zaXRpb25WMjA/bW9kZWwuc2VyaWVzLm1hcCgoXyxpKT0+c2VyaWVzU3R5bGVWMTMobW9kZWwsaSkuY29sb3IpOmNvbG9yc0JlZm9yZVNhbG9uc1YyMChtb2RlbCk7fTsKZnVuY3Rpb24gY29sdW1uTGF5b3V0U2Fsb25zVjIwKGl0ZW1zLGtleSx3aWR0aCl7CiB3aWR0aD1NYXRoLm1heCgzMDAsTWF0aC5yb3VuZCh3aWR0aHx8NjQwKSk7Y29uc3QgaGVpZ2h0PTM2NSxsZWZ0PTYwLHJpZ2h0PXdpZHRoLTE4LHRvcD00Nixib3R0b209MjYwLHZhbHVlcz1pdGVtcy5tYXAoeD0+W3gucHJlZltrZXldLHgucmVzdFtrZXldXSksbG89TWF0aC5taW4oMCwuLi52YWx1ZXMubWFwKHY9PnYucmVkdWNlKChuLHgpPT5uKyh4IT1udWxsJiZ4PDA/eDowKSwwKSkpLGhpPU1hdGgubWF4KDEsLi4udmFsdWVzLm1hcCh2PT52LnJlZHVjZSgobix4KT0+bisoeCE9bnVsbCYmeD4wP3g6MCksMCkpKSx5PXY9PmJvdHRvbS0odi1sbykvKGhpLWxvKSooYm90dG9tLXRvcCksc3Bhbj0ocmlnaHQtbGVmdCkvTWF0aC5tYXgoMSxpdGVtcy5sZW5ndGgpLGJhcj1NYXRoLm1heCgxLE1hdGgubWluKDU4LHNwYW4qLjY4KSksbGFiZWxFdmVyeT1NYXRoLm1heCgxLE1hdGguY2VpbCgod2lkdGg8NDUwPzk1OjgwKS9zcGFuKSk7CiBsZXQgaHRtbD1bMCwuNSwxXS5tYXAodD0+e2NvbnN0IHY9bG8rKGhpLWxvKSp0LGN5PXkodik7cmV0dXJuIGA8bGluZSB4MT0iJHtsZWZ0fSIgeDI9IiR7cmlnaHR9IiB5MT0iJHtjeX0iIHkyPSIke2N5fSIgc3Ryb2tlPSIjZTVlMGRhIiBzdHJva2UtZGFzaGFycmF5PSIzIDQiLz48dGV4dCB4PSIke2xlZnQtOH0iIHk9IiR7Y3krNH0iIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM1MDUwNTAiPiR7ZXNjKGNvbXBhY3QodixrZXkpKX08L3RleHQ+YDt9KS5qb2luKCcnKTsKIGh0bWwrPWA8bGluZSB4MT0iJHtsZWZ0fSIgeDI9IiR7cmlnaHR9IiB5MT0iJHt5KDApfSIgeTI9IiR7eSgwKX0iIHN0cm9rZT0iIzkwODc3ZiIvPmA7CiBpdGVtcy5mb3JFYWNoKChlbnRyeSxpKT0+e2NvbnN0IHA9ZW50cnkucG9pbnQsY2VudGVyPWxlZnQrc3BhbiooaSsuNSkscHJlZj1lbnRyeS5wcmVmW2tleV0scmVzdD1lbnRyeS5yZXN0W2tleV0sdG90YWw9ZW50cnkudG90YWxba2V5XSxzaGFyZT1zaGFyZVNhbG9uc1YyMChwcmVmLHJlc3QsdG90YWwpLGxhYmVsPXAubGFiZWxWMTB8fGRpc3BsYXlEYXRlc1Y1KHAubmFtZSksZnVsbD0ocC53ZWVrP3dlZWtUZXh0VjEwKHAud2VlaykrJyDCtyAnOicnKStsYWJlbCsnIHwgUHJlZmVyZW5jaWFsOiAnK2Ftb3VudFNhbG9uc1YyMChwcmVmLGtleSkrJyB8IFJlc3RvOiAnK2Ftb3VudFNhbG9uc1YyMChyZXN0LGtleSkrJyB8IFRvdGFsOiAnK2Ftb3VudFNhbG9uc1YyMCh0b3RhbCxrZXkpKycgfCBBcG9ydGU6ICcrcGVyY2VudFNhbG9uc1YyMChzaGFyZSk7CiAgaHRtbCs9YDxnIHRhYmluZGV4PSIwIiByb2xlPSJpbWciIGRhdGEtc2Fsb24tcG9pbnQtdjIwPSIke2l9IiBhcmlhLWxhYmVsPSIke2VzYyhmdWxsKX0iPjx0aXRsZT4ke2VzYyhmdWxsKX08L3RpdGxlPmA7CiAgaWYocHJlZiE9bnVsbCYmcmVzdCE9bnVsbCl7bGV0IHBvc2l0aXZlPTAsbmVnYXRpdmU9MDtbcHJlZixyZXN0XS5mb3JFYWNoKCh2LGopPT57Y29uc3Qgc3RhcnQ9dj49MD9wb3NpdGl2ZTpuZWdhdGl2ZSxlbmQ9c3RhcnQrdjtpZih2Pj0wKXBvc2l0aXZlPWVuZDtlbHNlIG5lZ2F0aXZlPWVuZDtjb25zdCB5eT1NYXRoLm1pbih5KHN0YXJ0KSx5KGVuZCkpLGhoPU1hdGguYWJzKHkoZW5kKS15KHN0YXJ0KSk7aHRtbCs9YDxyZWN0IHg9IiR7Y2VudGVyLWJhci8yfSIgeT0iJHt5eX0iIHdpZHRoPSIke2Jhcn0iIGhlaWdodD0iJHtoaH0iIGZpbGw9IiR7aj8nIzQ2Njg4MSc6JyNjNjRiMDgnfSIvPmA7aWYoIWomJnNoYXJlIT1udWxsJiZiYXI+PTM0JiZoaD49MjIpaHRtbCs9YDx0ZXh0IHg9IiR7Y2VudGVyfSIgeT0iJHt5eStoaC8yKzR9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjZmZmIiBmb250LXNpemU9IjExIj4ke2VzYyhwZXJjZW50U2Fsb25zVjIwKHNoYXJlKSl9PC90ZXh0PmA7fSk7fQogIGVsc2UgaHRtbCs9YDx0ZXh0IHg9IiR7Y2VudGVyfSIgeT0iJHt5KDApLTEwfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzc3NyIgZm9udC1zaXplPSIxMiI+4oCUPC90ZXh0PmA7CiAgY29uc3QgdmlzaWJsZT1pJWxhYmVsRXZlcnk9PT0wfHxpPT09aXRlbXMubGVuZ3RoLTE7CiAgaWYodmlzaWJsZSl7aWYodG90YWwhPW51bGwmJnByZWYhPW51bGwmJnJlc3QhPW51bGwpaHRtbCs9YDx0ZXh0IHg9IiR7Y2VudGVyfSIgeT0iJHtNYXRoLm1heCgxNix5KE1hdGgubWF4KDAscHJlZikrTWF0aC5tYXgoMCxyZXN0KSktOSl9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iIzMwMzAzMCI+JHtlc2MoY29tcGFjdCh0b3RhbCxrZXkpKX08L3RleHQ+YDsKICAgY29uc3QgbGluZXM9KHAud2VlayYmcC5kYXRlP1tzaG9ydERhdGVQZXJpb2RWMTAocC5kYXRlKSwnUycrd2Vla051bWJlclY4KHAud2VlaykrJyDCtyAnK3Aud2Vlay5zbGljZSg4KSsnLycrcC53ZWVrLnNsaWNlKDUsNyldOltsYWJlbCxwLnJhbmdlVjEwfHwnJ10pLmZpbHRlcihCb29sZWFuKTtodG1sKz1saW5lcy5tYXAoKHMsaik9PmA8dGV4dCB4PSIke2NlbnRlcn0iIHk9IiR7Mjg3K2oqMTd9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IiR7aj85OjExfSIgZmlsbD0iIzQ4NDg0OCI+JHtlc2Mocyl9PC90ZXh0PmApLmpvaW4oJycpO30KICBodG1sKz0nPC9nPic7CiB9KTtyZXR1cm4ge3dpZHRoLGhlaWdodCxodG1sfTsKfQpmdW5jdGlvbiBjb2x1bW5zU2Fsb25zVjIwKGl0ZW1zLGtleSxpbmRleCl7Y29uc3QgaWQ9J3NhbG9uLWJhcnMtJytpbmRleCxsYXlvdXQ9Y29sdW1uTGF5b3V0U2Fsb25zVjIwKGl0ZW1zLGtleSw2NDApO3NhbG9uQmFyc1YyMC5zZXQoaWQse2l0ZW1zLGtleX0pO3JldHVybiBgPGRpdiBjbGFzcz0ibGFiZWxlZGxlZ2VuZCBzYWxvbkxlZ2VuZFYyMCI+PHNwYW4+PGkgc3R5bGU9ImJhY2tncm91bmQ6I2M2NGIwOCI+PC9pPlByZWZlcmVuY2lhbDwvc3Bhbj48c3Bhbj48aSBzdHlsZT0iYmFja2dyb3VuZDojNDY2ODgxIj48L2k+UmVzdG8gZGUgc2Fsb25lczwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJjaGFydHNjcm9sbCBzYWxvbkNvbHVtbnNWMjAiIGRhdGEtc2Fsb24tYmFycy12MjA9IiR7aWR9Ij48c3ZnIHZpZXdCb3g9IjAgMCAke2xheW91dC53aWR0aH0gJHtsYXlvdXQuaGVpZ2h0fSIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSIke2tleT09PSd3aW4nPydXaW4nOidDb2luIEluJ30gZGVsIHByZWZlcmVuY2lhbCB5IHJlc3RvIGRlIHNhbG9uZXMgZW4gY29sdW1uYXMgYXBpbGFkYXMiPiR7bGF5b3V0Lmh0bWx9PC9zdmc+PC9kaXY+PHAgY2xhc3M9InNpZ25hbG5vdGUiIGRhdGEtc2Fsb24tcmVhZG91dC12MjA9IiR7aWR9Ij5MYSBhbHR1cmEgY29tcGxldGEgcmVwcmVzZW50YSBlbCB0b3RhbCBkZWwgY2FzaW5vLiBUb2NhIHVuYSBjb2x1bW5hIHBhcmEgdmVyIHN1cyBtb250b3MuIFNpIHVuIGdydXBvIG5vIHRpZW5lIHJlZ2lzdHJvcywgc2UgbXVlc3RyYSDCq+KAlMK7LiBDb24gV2luIG5lZ2F0aXZvLCBsb3Mgc2VnbWVudG9zIHNlIHNlcGFyYW4gc29icmUgeSBiYWpvIGNlcm87IG5vIHNlIGNhbGN1bGEgcGFydGljaXBhY2nDs24gcG9yY2VudHVhbC48L3A+YDt9CmZ1bmN0aW9uIGZpdENvbHVtbnNTYWxvbnNWMjAoKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zYWxvbi1iYXJzLXYyMF0nKS5mb3JFYWNoKGhvc3Q9PntpZihob3N0LmNsb3Nlc3QoJy5jYXJkJyk/LmhpZGRlbilyZXR1cm47Y29uc3QgbW9kZWw9c2Fsb25CYXJzVjIwLmdldChob3N0LmRhdGFzZXQuc2Fsb25CYXJzVjIwKSxzdmc9aG9zdC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtpZighbW9kZWx8fCFzdmcpcmV0dXJuO2NvbnN0IGxheW91dD1jb2x1bW5MYXlvdXRTYWxvbnNWMjAobW9kZWwuaXRlbXMsbW9kZWwua2V5LGhvc3QuY2xpZW50V2lkdGh8fGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0Py4oKS53aWR0aHx8NjQwKTtzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JyxgMCAwICR7bGF5b3V0LndpZHRofSAke2xheW91dC5oZWlnaHR9YCk7c3ZnLnN0eWxlLndpZHRoPScxMDAlJztzdmcuc3R5bGUuaGVpZ2h0PWxheW91dC5oZWlnaHQrJ3B4JztzdmcuaW5uZXJIVE1MPWxheW91dC5odG1sO2NvbnN0IHNob3c9ZT0+e2NvbnN0IGl0ZW09ZS50YXJnZXQuY2xvc2VzdD8uKCdbZGF0YS1zYWxvbi1wb2ludC12MjBdJyk7aWYoaXRlbSl7Y29uc3QgcmVhZG91dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zYWxvbi1yZWFkb3V0LXYyMD0iJytob3N0LmRhdGFzZXQuc2Fsb25CYXJzVjIwKyciXScpO2lmKHJlYWRvdXQpcmVhZG91dC50ZXh0Q29udGVudD1pdGVtLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO319O3N2Zy5vbmNsaWNrPXNob3c7c3ZnLm9uZm9jdXNpbj1zaG93O30pO30KY29uc3QgZml0QmVmb3JlU2Fsb25zVjIwPWZpdFJlc3BvbnNpdmVDaGFydHNMQTsKZml0UmVzcG9uc2l2ZUNoYXJ0c0xBPWZ1bmN0aW9uKCl7Zml0QmVmb3JlU2Fsb25zVjIwKCk7Zml0Q29sdW1uc1NhbG9uc1YyMCgpO307CmZ1bmN0aW9uIGNhcmRTYWxvbnNWMjAoaW5kZXgsb3JpZ2luYWwscmVwb3J0LHN0YXRlKXsKIGNvbnN0IGtleT1pbmRleD09PTk/J3dpbic6J2NvaW4nLGxhYmVsPWtleT09PSd3aW4nPydXaW4gb3BlcmFjaW9uYWwnOidDb2luIEluJztzdGF0ZS5zYWxvblZpZXdzVjIwPz89e307Y29uc3QgbW9kZT1zdGF0ZS5zYWxvblZpZXdzVjIwW2luZGV4XT09PSdjb2x1bW5zJz8nY29sdW1ucyc6J2xpbmVzJyxpdGVtcz1yb3dzU2Fsb25zVjIwKHJlcG9ydCksc3VtPXNhbG9uUG9pbnRWMjAoe3Jvd3M6cmVwb3J0LnJvd3N9KSxzaGFyZT1zaGFyZVNhbG9uc1YyMChzdW0ucHJlZltrZXldLHN1bS5yZXN0W2tleV0sc3VtLnRvdGFsW2tleV0pOwogY29uc3QgZGV0YWlsPWl0ZW1zLm1hcCh4PT5gPHRyPjx0ZD4ke2VzYygoeC5wb2ludC53ZWVrJiZ4LnBvaW50LmRhdGU/c2hvcnREYXRlUGVyaW9kVjEwKHgucG9pbnQuZGF0ZSkrJyDCtyAnK3dlZWtUZXh0VjEwKHgucG9pbnQud2Vlayk6eC5wb2ludC5sYWJlbFYxMCl8fHgucG9pbnQubmFtZSl9PC90ZD48dGQ+JHthbW91bnRTYWxvbnNWMjAoeC5wcmVmW2tleV0sa2V5KX08L3RkPjx0ZD4ke2Ftb3VudFNhbG9uc1YyMCh4LnJlc3Rba2V5XSxrZXkpfTwvdGQ+PHRkPiR7YW1vdW50U2Fsb25zVjIwKHgudG90YWxba2V5XSxrZXkpfTwvdGQ+PHRkPiR7cGVyY2VudFNhbG9uc1YyMChzaGFyZVNhbG9uc1YyMCh4LnByZWZba2V5XSx4LnJlc3Rba2V5XSx4LnRvdGFsW2tleV0pKX08L3RkPjx0ZD4ke3gucHJlZkRheXN9IC8gJHt4LnJlc3REYXlzfTwvdGQ+PC90cj5gKS5qb2luKCcnKTsKIHJldHVybiBgPHNlY3Rpb24gY2xhc3M9ImNhcmQgc2Fsb25DYXJkVjIwIiBkYXRhLXBlcmlvZC1jaGFydC1zbG90PSIke2luZGV4fSIgZGF0YS1jaGFydC1zbG90LXRpdGxlPSIke2VzYyhvcmlnaW5hbCl9Ij48c21hbGwgY2xhc3M9ImNoYXJ0U2xvdFYxMiI+R3LDoWZpY28gJHtpbmRleCsxfTwvc21hbGw+PGgyPiR7bGFiZWx9IMK3IHByZWZlcmVuY2lhbCBmcmVudGUgYWwgcmVzdG88L2gyPjxkaXYgY2xhc3M9InNhbG9uQ29udHJvbHNWMjAiPjxsYWJlbD5WaXN0YSBkZWwgZ3LDoWZpY288c2VsZWN0IGRhdGEtc2Fsb24tdmlldy12MjA9IiR7aW5kZXh9Ij48b3B0aW9uIHZhbHVlPSJsaW5lcyIgJHttb2RlPT09J2xpbmVzJz8nc2VsZWN0ZWQnOicnfT5Fdm9sdWNpw7NuIMK3IGzDrW5lYXMgZW4gcGVzb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjb2x1bW5zIiAke21vZGU9PT0nY29sdW1ucyc/J3NlbGVjdGVkJzonJ30+QXBvcnRlIGFsIHRvdGFsIMK3IGNvbHVtbmFzIGFwaWxhZGFzPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48L2Rpdj48cCBjbGFzcz0ic2lnbmFsbm90ZSI+VG9kbyBlbCBwYXJxdWUgZW4gbGFzIGZlY2hhcyB5IGTDrWFzIGVsZWdpZG9zLiBMb3MgZmlsdHJvcyBkZSBtw6FxdWluYXMsIHNlY3RvcmVzIHkgc2Fsb25lcyBkZSBhcnJpYmEgbm8gc2UgYXBsaWNhbiBhIGVzdG9zIGRvcyBncsOhZmljb3MuIFByZWZlcmVuY2lhbCBhZ3J1cGEgbG9zIHNlY3RvcmVzIG8gc2Fsb25lcyBjdXlvIG5vbWJyZSBjb250aWVuZSDCq3ByZWZlcmVuY2lhbMK7OyBlbCByZXN0byBpbmNsdXllIHRvZG9zIGxvcyBkZW3DoXMuIEFtYm9zIHVzYW4gdW5hIG1pc21hIGVzY2FsYSBDTFAuPC9wPiR7bW9kZT09PSdsaW5lcyc/bGluZXNTYWxvbnNWMjAocmVwb3J0LHN0YXRlLGtleSk6Y29sdW1uc1NhbG9uc1YyMChpdGVtcyxrZXksaW5kZXgpfTxkaXYgY2xhc3M9InNhbG9uU3VtbWFyeVYyMCI+PGI+QXBvcnRlIGRlbCBwcmVmZXJlbmNpYWw6ICR7cGVyY2VudFNhbG9uc1YyMChzaGFyZSl9PC9iPjxzcGFuPlByZWZlcmVuY2lhbDogJHthbW91bnRTYWxvbnNWMjAoc3VtLnByZWZba2V5XSxrZXkpfTwvc3Bhbj48c3Bhbj5SZXN0byBkZSBzYWxvbmVzOiAke2Ftb3VudFNhbG9uc1YyMChzdW0ucmVzdFtrZXldLGtleSl9PC9zcGFuPjxzcGFuPlRvdGFsIGRlbCBjYXNpbm86ICR7YW1vdW50U2Fsb25zVjIwKHN1bS50b3RhbFtrZXldLGtleSl9PC9zcGFuPjxzbWFsbD4ke3N1bS5wcmVmRGF5c30gZMOtYXMgY29uIHJlZ2lzdHJvcyBkZWwgcHJlZmVyZW5jaWFsIMK3ICR7c3VtLnJlc3REYXlzfSBkZWwgcmVzdG8uICR7c2hhcmU9PW51bGw/J1BvcmNlbnRhamUgbm8gZGlzcG9uaWJsZSBzaSBmYWx0YSB1biBncnVwbywgZWwgdG90YWwgZXMgY2VybyBvIGhheSBzYWxkb3MgbmVnYXRpdm9zLic6J1BhcnRpY2lwYWNpw7NuIHNvYnJlIGxvcyBpbXBvcnRlcyByZWdpc3RyYWRvcywgc2luIHByb21lZGlhciBwb3JjZW50YWplcyBkaWFyaW9zLid9PC9zbWFsbD48L2Rpdj48ZGV0YWlscyBjbGFzcz0ic2Fsb25EZXRhaWxWMjAiPjxzdW1tYXJ5PlZlciBhcG9ydGUgeSBtb250b3MgcG9yIHBlcsOtb2RvPC9zdW1tYXJ5PjxkaXYgY2xhc3M9InRhYmxld3JhcCI+PHRhYmxlPjx0aGVhZD48dHI+PHRoPlBlcsOtb2RvPC90aD48dGg+UHJlZmVyZW5jaWFsPC90aD48dGg+UmVzdG88L3RoPjx0aD5Ub3RhbCBjYXNpbm88L3RoPjx0aD5BcG9ydGUgcHJlZmVyZW5jaWFsPC90aD48dGg+RMOtYXMgcHJlZi4gLyByZXN0bzwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4ke2RldGFpbHx8Jzx0cj48dGQgY29sc3Bhbj0iNiI+U2luIHBlcsOtb2RvcyBzZWxlY2Npb25hZG9zLjwvdGQ+PC90cj4nfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48L2RldGFpbHM+PC9zZWN0aW9uPmA7Cn0KY29uc3QgZWRpdGFibGVCZWZvcmVTYWxvbnNWMjA9ZWRpdGFibGVDYXJkc1BlcmlvZFYxMjsKZWRpdGFibGVDYXJkc1BlcmlvZFYxMj1mdW5jdGlvbihzcGVjLHJlcG9ydCxzdGF0ZSl7c2Fsb25CYXJzVjIwLmNsZWFyKCk7c2Fsb25Qb2ludENhY2hlVjIwPW5ldyBXZWFrTWFwKCk7Y3VycmVudFNhbG9uc1YyMD1PYmplY3QudmFsdWVzKHN0YXRlLmZpbHRlcnN8fHt9KS5zb21lKHY9PnYubGVuZ3RoKT9idWlsZFBlcmlvZFYxMChkYXRhLnJvd3MuZmlsdGVyKHI9PiFleGNsdWRlZFJlY29yZFY3KHIpKSx7Li4uc3RhdGUsZmlsdGVyczp7fX0sY2F0YWxvZ0N1cnJlbnRWMTAoKSk6cmVwb3J0O3JldHVybiBlZGl0YWJsZUJlZm9yZVNhbG9uc1YyMChzcGVjLHJlcG9ydCxzdGF0ZSk7fTsKY29uc3QgYmluZEJlZm9yZVNhbG9uc1YyMD1iaW5kRWRpdGFibGVQZXJpb2RWMTI7CmJpbmRFZGl0YWJsZVBlcmlvZFYxMj1mdW5jdGlvbihzcGVjKXtiaW5kQmVmb3JlU2Fsb25zVjIwKHNwZWMpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNhbG9uLXZpZXctdjIwXScpLmZvckVhY2goc2VsZWN0PT5zZWxlY3Qub25jaGFuZ2U9YXN5bmMoKT0+e2NvbnN0IHM9c3RhdGVQZXJpb2RWMTAoKTtzLnNhbG9uVmlld3NWMjA/Pz17fTtzLnNhbG9uVmlld3NWMjBbc2VsZWN0LmRhdGFzZXQuc2Fsb25WaWV3VjIwXT1zZWxlY3QudmFsdWU7YXdhaXQgbmF2aWdhdGVWaXN1YWxMQShwZXJpb2RUYWJWMTApO30pO307CmZ1bmN0aW9uIHNhbG9uRXhwb3J0VjIwKCl7aWYoIWN1cnJlbnRTYWxvbnNWMjApcmV0dXJuW107cmV0dXJuW3tuYW1lOidBcG9ydGUgc2Fsb25lcycscm93czpbWydQZXLDrW9kbycsJ1NlbWFuYSBkZXNkZScsJ0ZlY2hhJywnV2luIHByZWZlcmVuY2lhbCBDTFAnLCdXaW4gcmVzdG8gQ0xQJywnV2luIHRvdGFsIENMUCcsJ0Fwb3J0ZSBXaW4gJScsJ0NvaW4gSW4gcHJlZmVyZW5jaWFsIENMUCcsJ0NvaW4gSW4gcmVzdG8gQ0xQJywnQ29pbiBJbiB0b3RhbCBDTFAnLCdBcG9ydGUgQ29pbiBJbiAlJywnRMOtYXMgcHJlZmVyZW5jaWFsJywnRMOtYXMgcmVzdG8nXSwuLi5yb3dzU2Fsb25zVjIwKGN1cnJlbnRTYWxvbnNWMjApLm1hcCh4PT5beC5wb2ludC5sYWJlbFYxMCx4LnBvaW50LndlZWt8fCcnLHgucG9pbnQuZGF0ZXx8JycseC5wcmVmLndpbix4LnJlc3Qud2luLHgudG90YWwud2luLHNoYXJlU2Fsb25zVjIwKHgucHJlZi53aW4seC5yZXN0Lndpbix4LnRvdGFsLndpbikseC5wcmVmLmNvaW4seC5yZXN0LmNvaW4seC50b3RhbC5jb2luLHNoYXJlU2Fsb25zVjIwKHgucHJlZi5jb2luLHgucmVzdC5jb2luLHgudG90YWwuY29pbikseC5wcmVmRGF5cyx4LnJlc3REYXlzXSldfSx7bmFtZTonQWxjYW5jZSBzYWxvbmVzJyxyb3dzOltbJ0dyw6FmaWNvcycsJzEwID0gV2luLCAxMSA9IENvaW4gSW4uIFByZWZlcmVuY2lhbCB2cyByZXN0byBkZWwgcGFycXVlLiddLFsnRmlsdHJvcycsJ1NvbG8gZmVjaGFzIHkgZMOtYXMgZGUgbGEgY29uc3VsdGE7IG5vIHNlIGFwbGljYW4gZmlsdHJvcyBkZSBtw6FxdWluYXMgbyBzYWxvbmVzLiddLFsnR3J1cG9zJywnUHJlZmVyZW5jaWFsIHNlZ8O6biBzZWN0b3IgbyBzYWzDs24gcXVlIGNvbnRpZW5lIHByZWZlcmVuY2lhbDsgcmVzdG8gPSB0b2RhcyBsYXMgb3RyYXMgZmlsYXMuJ10sWydDw6FsY3VsbycsJ1BhcnRpY2lwYWNpw7NuID0gcHJlZmVyZW5jaWFsIC8gdG90YWwsIHNvbG8gY29uIGFtYm9zIGdydXBvcyByZWdpc3RyYWRvcywgdG90YWwgcG9zaXRpdm8geSBzaW4gc2FsZG9zIG5lZ2F0aXZvcy4gQXVzZW50ZSBubyBlcyBjZXJvLiddXX1dO30KDQoKLy8gQWRqYWNlbnQgcGVyaW9kcyB1c2UgaW5jbHVzaXZlIFVUQyBjYWxlbmRhciBkYXlzLCBpbmRlcGVuZGVudCBvZiByZWNvcmRlZCBhY3Rpdml0eS4Kdmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNT8/PSdtYW51YWwnOwpmdW5jdGlvbiBhZGphY2VudENhbGVuZGFyVjE1KGZyb20sdG8sZGlyZWN0aW9uKXsKIGlmKCFkYXRlUGFydHNTcGFuaXNoTEEoZnJvbSl8fCFkYXRlUGFydHNTcGFuaXNoTEEodG8pKXJldHVybiBudWxsOwogY29uc3Qgc3RhcnQ9RGF0ZS5wYXJzZShmcm9tKydUMDA6MDA6MDBaJyksZW5kPURhdGUucGFyc2UodG8rJ1QwMDowMDowMFonKTsKIGlmKGVuZDxzdGFydClyZXR1cm4gbnVsbDsKIGNvbnN0IGRheT04NjQwMDAwMCxkYXlzPU1hdGgucm91bmQoKGVuZC1zdGFydCkvZGF5KSsxOwogY29uc3QgYlN0YXJ0PWRpcmVjdGlvbj09PSdwcmV2aW91cyc/c3RhcnQtZGF5cypkYXk6ZW5kK2RheTsKIHJldHVybiB7ZnJvbTpuZXcgRGF0ZShiU3RhcnQpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCksdG86bmV3IERhdGUoYlN0YXJ0KyhkYXlzLTEpKmRheSkudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKSxkYXlzfTsKfQpjb25zdCBjb21wYXJlQmVmb3JlQ2FsZW5kYXJWMTU9Y29tcGFyZVZpZXc7CmNvbXBhcmVWaWV3PWZ1bmN0aW9uKCl7CiBjb25zdCBtb2RlPXZpZXdTdGF0ZS5jb21wYXJlQ2FsZW5kYXJWMTU7CiBpZighWydtYW51YWwnLCdwcmV2aW91cycsJ25leHQnXS5pbmNsdWRlcyhtb2RlKSl2aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1PSdtYW51YWwnOwogbGV0IHJlc3VsdD1udWxsOwogaWYobW9kZT09PSdwcmV2aW91cyd8fG1vZGU9PT0nbmV4dCcpewogIGlmKGNhbGVuZGFyU3RhdGVWOCgnQScpLm1vZGUhPT0ncmFuZ2UnKXZpZXdTdGF0ZS5jb21wYXJlQ2FsZW5kYXJWMTU9J21hbnVhbCc7CiAgZWxzZXsKICAgY29uc3QgYm91bmRzPWRhdGVSYW5nZSgpOwogICB2aWV3U3RhdGUuQS5mcm9tfHw9Ym91bmRzWzBdO3ZpZXdTdGF0ZS5BLnRvfHw9Ym91bmRzWzFdOwogICByZXN1bHQ9YWRqYWNlbnRDYWxlbmRhclYxNSh2aWV3U3RhdGUuQS5mcm9tLHZpZXdTdGF0ZS5BLnRvLG1vZGUpOwogICBpZihyZXN1bHQpe09iamVjdC5hc3NpZ24odmlld1N0YXRlLkIse2Zyb206cmVzdWx0LmZyb20sdG86cmVzdWx0LnRvfSk7Y2FsZW5kYXJTdGF0ZVY4KCdCJykubW9kZT0ncmFuZ2UnO30KICB9CiB9CiBjb21wYXJlQmVmb3JlQ2FsZW5kYXJWMTUoKTsKIGNvbnN0IHRvb2xzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb21wYXJldG9vbHMnKTtpZighdG9vbHMpcmV0dXJuOwogdG9vbHMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsYDxkaXYgY2xhc3M9ImNhcmQgY29tcGFyZUNhbGVuZGFyVjE1Ij48bGFiZWw+RmVjaGFzIGRlIEIgcmVzcGVjdG8gZGUgQTxzZWxlY3QgaWQ9ImNvbXBhcmVDYWxlbmRhclYxNSI+PG9wdGlvbiB2YWx1ZT0ibWFudWFsIj5FbGVnaXIgZmVjaGFzIG1hbnVhbG1lbnRlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHJldmlvdXMiPlBlcsOtb2RvIGFudGVyaW9yIMK3IG1pc21vcyBkw61hcyBjYWxlbmRhcmlvPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibmV4dCI+UGVyw61vZG8gcG9zdGVyaW9yIMK3IG1pc21vcyBkw61hcyBjYWxlbmRhcmlvPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48cCBpZD0iY29tcGFyZUNhbGVuZGFyTm90ZVYxNSIgY2xhc3M9InN1YnRpdGxlIj4ke3Jlc3VsdD9gQTogJHtkYXRlTGFiZWxTcGFuaXNoTEEodmlld1N0YXRlLkEuZnJvbSl9IOKGkiAke2RhdGVMYWJlbFNwYW5pc2hMQSh2aWV3U3RhdGUuQS50byl9IMK3ICR7cmVzdWx0LmRheXN9IGTDrWFzLiBCOiAke2RhdGVMYWJlbFNwYW5pc2hMQShyZXN1bHQuZnJvbSl9IOKGkiAke2RhdGVMYWJlbFNwYW5pc2hMQShyZXN1bHQudG8pfSDCtyAke3Jlc3VsdC5kYXlzfSBkw61hcy5gOnZpZXdTdGF0ZS5jb21wYXJlQ2FsZW5kYXJWMTU9PT0nbWFudWFsJz8nU2VsZWNjaW9uYSBsYXMgZmVjaGFzIGRlIEEgeSBlbGlnZSBlbCBwZXLDrW9kbyBhbnRlcmlvciBvIHBvc3RlcmlvciBwYXJhIGNhbGN1bGFyIEIgYXV0b23DoXRpY2FtZW50ZS4nOidSZXZpc2EgbGFzIGZlY2hhcyBkZSBBOiBlbCBpbmljaW8gZGViZSBzZXIgYW50ZXJpb3IgbyBpZ3VhbCBhbCBmaW5hbC4nfSBTZSBjdWVudGFuIGFtYm9zIGV4dHJlbW9zLCBpbmNsdXNvIGTDrWFzIHNpbiByZWdpc3Ryb3MuIExvcyBmaWx0cm9zIGRlIG3DoXF1aW5hcyBkZSBCIHNlIG1hbnRpZW5lbi48L3A+PC9kaXY+YCk7CiAkKCcjY29tcGFyZUNhbGVuZGFyVjE1JykudmFsdWU9dmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNTsKICQoJyNjb21wYXJlQ2FsZW5kYXJWMTUnKS5vbmNoYW5nZT1lPT57dmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNT1lLnRhcmdldC52YWx1ZTtpZihlLnRhcmdldC52YWx1ZSE9PSdtYW51YWwnKWNhbGVuZGFyU3RhdGVWOCgnQScpLm1vZGU9J3JhbmdlJztyZW5kZXIoKTt9OwogZm9yKGNvbnN0IGlkIG9mIFsnZnJvbUInLCd0b0InLCdjb3B5QUInLCdzd2FwQUInXSl7Y29uc3Qgbm9kZT0kKCcjJytpZCksb2xkPW5vZGU/LltpZC5zdGFydHNXaXRoKCdmcm9tJyl8fGlkLnN0YXJ0c1dpdGgoJ3RvJyk/J29uY2hhbmdlJzonb25jbGljayddO2lmKG5vZGUpe2NvbnN0IGV2ZW50PWlkPT09J2Zyb21CJ3x8aWQ9PT0ndG9CJz8nb25jaGFuZ2UnOidvbmNsaWNrJztub2RlW2V2ZW50XT1lPT57dmlld1N0YXRlLmNvbXBhcmVDYWxlbmRhclYxNT0nbWFudWFsJztvbGQ/LmNhbGwobm9kZSxlKTt9O319CiAvLyBDaG9vc2luZyBhbm90aGVyIEIgY2FsZW5kYXIgbW9kZSBpcyBhbiBleHBsaWNpdCByZXR1cm4gdG8gaW5kZXBlbmRlbnQgZGF0ZXMuCiBjb25zdCBiTW9kZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYWxtb2RlPSJCIl0nKTtpZihiTW9kZSl7Y29uc3Qgb2xkPWJNb2RlLm9uY2hhbmdlO2JNb2RlLm9uY2hhbmdlPWU9Pnt2aWV3U3RhdGUuY29tcGFyZUNhbGVuZGFyVjE1PSdtYW51YWwnO29sZD8uY2FsbChiTW9kZSxlKTt9O30KfTsKCi8vIERhaWx5IHBhcmstd2lkZSB0YXJnZXRzIGFyZSBwcml2YXRlLCBhdXRoZW50aWNhdGVkIGRhdGE7IG5ldmVyIGVtYmVkZGVkIGluIHRoZSBwdWJsaWMgYnVuZGxlLgpjb25zdCBidWRnZXRUYWJWMTg9J0N1bXBsaW1pZW50byBQUFRPJzsKdmlld1N0YXRlLmJ1ZGdldFYxOD8/PXtmcm9tOicnLHRvOicnLGdyYWluOid3ZWVrJyxtZXRyaWM6J3dpbid9OwpsZXQgYnVkZ2V0Um93c1YxOD1udWxsLGJ1ZGdldE93bmVyVjE4PW51bGwsYnVkZ2V0TG9hZGluZ1YxOD1mYWxzZSxidWRnZXRFcnJvclYxOD0nJyxidWRnZXRTdG9yYWdlVjE4PW51bGwsY3VycmVudEJ1ZGdldFYxOD1udWxsOwpmdW5jdGlvbiB2YWxpZGF0ZUJ1ZGdldFYxOChyb3dzKXsKIGlmKCFBcnJheS5pc0FycmF5KHJvd3MpKXRocm93IEVycm9yKCdFbCBwcmVzdXB1ZXN0byBubyB0aWVuZSB1biBmb3JtYXRvIHbDoWxpZG8uJyk7CiBjb25zdCBzZWVuPW5ldyBTZXQoKTtyZXR1cm4gcm93cy5tYXAocj0+e2lmKCFkYXRlUGFydHNTcGFuaXNoTEEoci5kYXRlKXx8c2Vlbi5oYXMoci5kYXRlKXx8ci53aW49PW51bGx8fHIuY29pbj09bnVsbHx8IU51bWJlci5pc0Zpbml0ZShOdW1iZXIoci53aW4pKXx8IU51bWJlci5pc0Zpbml0ZShOdW1iZXIoci5jb2luKSl8fE51bWJlcihyLndpbik8MHx8TnVtYmVyKHIuY29pbik8MCl0aHJvdyBFcnJvcignSGF5IGZlY2hhcyBkdXBsaWNhZGFzIG8gbWV0YXMgaW52w6FsaWRhcyBlbiBlbCBwcmVzdXB1ZXN0by4nKTtzZWVuLmFkZChyLmRhdGUpO3JldHVybiB7ZGF0ZTpyLmRhdGUsd2luOk51bWJlcihyLndpbiksY29pbjpOdW1iZXIoci5jb2luKSxzb3VyY2U6U3RyaW5nKHIuc291cmNlfHwnUHJlc3VwdWVzdG8gZGlhcmlvJyl9O30pLnNvcnQoKGEsYik9PmEuZGF0ZS5sb2NhbGVDb21wYXJlKGIuZGF0ZSkpOwp9CmZ1bmN0aW9uIGJ1aWxkQnVkZ2V0VjE4KHJvd3MsdGFyZ2V0cyxzKXsKIGlmKCFkYXRlUGFydHNTcGFuaXNoTEEocy5mcm9tKXx8IWRhdGVQYXJ0c1NwYW5pc2hMQShzLnRvKXx8cy5mcm9tPnMudG8pdGhyb3cgRXJyb3IoJ1NlbGVjY2lvbmEgdW4gcmFuZ28gZGUgZmVjaGFzIHbDoWxpZG8uJyk7CiBjb25zdCB0YXJnZXRNYXA9bmV3IE1hcCh2YWxpZGF0ZUJ1ZGdldFYxOCh0YXJnZXRzKS5maWx0ZXIocj0+ci5kYXRlPj1zLmZyb20mJnIuZGF0ZTw9cy50bykubWFwKHI9PltyLmRhdGUscl0pKTsKIGNvbnN0IGFjdHVhbD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2Ygcm93cyl7aWYoclswXTxzLmZyb218fHJbMF0+cy50b3x8ZXhjbHVkZWRSZWNvcmRWNyhyKSljb250aW51ZTtsZXQgYT1hY3R1YWwuZ2V0KHJbMF0pO2lmKCFhKXthPXt3aW46MCxjb2luOjB9O2FjdHVhbC5zZXQoclswXSxhKTt9YS53aW4rPW51bShyWzE2XSk7YS5jb2luKz1udW0oclsxOF0pO30KIGNvbnN0IGRhdGVzPVsuLi5uZXcgU2V0KFsuLi50YXJnZXRNYXAua2V5cygpLC4uLmFjdHVhbC5rZXlzKCldKV0uc29ydCgpLHRvdGFscz17YWN0dWFsOnt3aW46MCxjb2luOjB9LHRhcmdldDp7d2luOjAsY29pbjowfSxmdWxsVGFyZ2V0Ont3aW46MCxjb2luOjB9fSxkYWlseT1kYXRlcy5tYXAoZGF0ZT0+e2NvbnN0IGE9YWN0dWFsLmdldChkYXRlKSxiPXRhcmdldE1hcC5nZXQoZGF0ZSksbWF0Y2hlZD0hIWEmJiEhYjtmb3IoY29uc3QgayBvZiBbJ3dpbicsJ2NvaW4nXSl7aWYoYil0b3RhbHMuZnVsbFRhcmdldFtrXSs9YltrXTtpZihtYXRjaGVkKXt0b3RhbHMuYWN0dWFsW2tdKz1hW2tdO3RvdGFscy50YXJnZXRba10rPWJba107fX1yZXR1cm57ZGF0ZSxhY3R1YWw6YXx8bnVsbCx0YXJnZXQ6Ynx8bnVsbCxtYXRjaGVkfTt9KTsKIGNvbnN0IGdyb3VwZWQ9bmV3IE1hcCgpO2Zvcihjb25zdCBkIG9mIGRhaWx5KXtjb25zdCBrZXk9cy5ncmFpbj09PSdtb250aCc/ZC5kYXRlLnNsaWNlKDAsNyk6cy5ncmFpbj09PSdkYXknP2QuZGF0ZTptb25kYXlWMTAoZC5kYXRlKTtpZighZ3JvdXBlZC5oYXMoa2V5KSlncm91cGVkLnNldChrZXkse25hbWU6a2V5LGZyb206ZC5kYXRlLHRvOmQuZGF0ZSxhY3R1YWw6e3dpbjowLGNvaW46MH0sdGFyZ2V0Ont3aW46MCxjb2luOjB9LG1hdGNoZWQ6MCxidWRnZXREYXlzOjAsYWN0dWFsRGF5czowfSk7Y29uc3QgZz1ncm91cGVkLmdldChrZXkpO2cudG89ZC5kYXRlO2lmKGQuYWN0dWFsKWcuYWN0dWFsRGF5cysrO2lmKGQudGFyZ2V0KWcuYnVkZ2V0RGF5cysrO2lmKGQubWF0Y2hlZCl7Zy5tYXRjaGVkKys7Zm9yKGNvbnN0IGsgb2YgWyd3aW4nLCdjb2luJ10pe2cuYWN0dWFsW2tdKz1kLmFjdHVhbFtrXTtnLnRhcmdldFtrXSs9ZC50YXJnZXRba107fX19CiBsZXQgYWNjdW11bGF0ZWRBPTAsYWNjdW11bGF0ZWRCPTA7Y29uc3QgY3VtdWxhdGl2ZT1kYWlseS5tYXAoZD0+e2lmKCFkLm1hdGNoZWQpcmV0dXJue25hbWU6ZC5kYXRlLHdpbjpudWxsLGNvaW46bnVsbH07YWNjdW11bGF0ZWRBKz1kLmFjdHVhbFtzLm1ldHJpY107YWNjdW11bGF0ZWRCKz1kLnRhcmdldFtzLm1ldHJpY107cmV0dXJue25hbWU6ZC5kYXRlLHdpbjphY2N1bXVsYXRlZEEsY29pbjphY2N1bXVsYXRlZEJ9O30pOwogcmV0dXJue2RhaWx5LGxpc3Q6Wy4uLmdyb3VwZWQudmFsdWVzKCldLHRvdGFscyxjdW11bGF0aXZlLG1hdGNoZWQ6ZGFpbHkuZmlsdGVyKGQ9PmQubWF0Y2hlZCkubGVuZ3RoLG1pc3NpbmdCdWRnZXQ6ZGFpbHkuZmlsdGVyKGQ9PmQuYWN0dWFsJiYhZC50YXJnZXQpLmxlbmd0aCxtaXNzaW5nQWN0dWFsOmRhaWx5LmZpbHRlcihkPT5kLnRhcmdldCYmIWQuYWN0dWFsKS5sZW5ndGgsYWN0dWFsRGF5czphY3R1YWwuc2l6ZSxidWRnZXREYXlzOnRhcmdldE1hcC5zaXplLGNhbGVuZGFyRGF5czpNYXRoLnJvdW5kKChEYXRlLnBhcnNlKHMudG8pLURhdGUucGFyc2Uocy5mcm9tKSkvODY0MDAwMDApKzF9Owp9CmZ1bmN0aW9uIHJhdGlvQnVkZ2V0VjE4KHJlYWwsdGFyZ2V0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHJlYWwpJiZOdW1iZXIuaXNGaW5pdGUodGFyZ2V0KSYmdGFyZ2V0PjA/cmVhbC90YXJnZXQ6bnVsbDt9CmZ1bmN0aW9uIGJ1ZGdldFBlcmNlbnRWMTgodmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbD8n4oCUJzoodmFsdWUqMTAwKS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pKycgJSc7fQpmdW5jdGlvbiBnYXVnZUJ1ZGdldFYxOChsYWJlbCxhY3R1YWwsdGFyZ2V0KXsKIGNvbnN0IHJhdGlvPXJhdGlvQnVkZ2V0VjE4KGFjdHVhbCx0YXJnZXQpLHRvbmU9cmF0aW89PW51bGw/J25ldXRyYWwnOnJhdGlvPj0xPydzdWNjZXNzJzpyYXRpbz49Ljk/J25lYXInOidiZWhpbmQnLHByb2dyZXNzPU1hdGgubWF4KDAsTWF0aC5taW4oMSxyYXRpb3x8MCkpLG1vbmV5PXY9PnY9PW51bGw/J+KAlCc6Zm10KHYsJ3dpbicpKycgQ0xQJzsKIHJldHVybiBgPGFydGljbGUgY2xhc3M9ImNhcmQgYnVkZ2V0SGVyb1YxOCAke3RvbmV9Ij48ZGl2PjxzbWFsbD4ke2VzYyhsYWJlbCl9IMK3IENVTVBMSU1JRU5UTzwvc21hbGw+PGgyPiR7YnVkZ2V0UGVyY2VudFYxOChyYXRpbyl9PC9oMj48cD4ke3JhdGlvPT1udWxsPydTaW4gbWV0YSBjb21wYXJhYmxlJzpyYXRpbz49MT8nTWV0YSBhbGNhbnphZGEnOidCYWpvIGxhIG1ldGEgZGVsIHBlcsOtb2RvIGNvbXBhcmFibGUnfTwvcD48L2Rpdj48c3ZnIGNsYXNzPSJidWRnZXRHYXVnZVYxOCIgdmlld0JveD0iMCAwIDE2MCAxNjAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iJHtlc2MobGFiZWwpfTogJHtidWRnZXRQZXJjZW50VjE4KHJhdGlvKX0gZGUgY3VtcGxpbWllbnRvIj48Y2lyY2xlIGN4PSI4MCIgY3k9IjgwIiByPSI2NCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWNlOWU2IiBzdHJva2Utd2lkdGg9IjEzIi8+PGNpcmNsZSBjeD0iODAiIGN5PSI4MCIgcj0iNjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEzIiBzdHJva2UtZGFzaGFycmF5PSIke3Byb2dyZXNzKjQwMi4xMjR9IDQwMi4xMjQiIHRyYW5zZm9ybT0icm90YXRlKC05MCA4MCA4MCkiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjx0ZXh0IHg9IjgwIiB5PSI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzI1MjUyNSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjIyIiBmb250LXdlaWdodD0iYm9sZCI+JHtidWRnZXRQZXJjZW50VjE4KHJhdGlvKX08L3RleHQ+PC9zdmc+PGRsPjxkaXY+PGR0PlJlYWw8L2R0PjxkZD4ke21vbmV5KGFjdHVhbCl9PC9kZD48L2Rpdj48ZGl2PjxkdD5QUFRPIMK3IG1pc21vcyBkw61hczwvZHQ+PGRkPiR7bW9uZXkodGFyZ2V0KX08L2RkPjwvZGl2PjxkaXY+PGR0PkJyZWNoYSByZWFsIOKIkiBQUFRPPC9kdD48ZGQ+JHtyYXRpbz09bnVsbD8n4oCUJzptb25leShhY3R1YWwtdGFyZ2V0KX08L2RkPjwvZGl2PjwvZGw+PHAgY2xhc3M9ImJ1ZGdldE5vdGVWMTgiPlNvYnJlIGTDrWFzIGNvbiByZWdpc3Ryb3MgcmVhbGVzIHkgcHJlc3VwdWVzdG8gZGVsIG1pc21vIGHDsW8uIEVsIGFuaWxsbyBzZSBjb21wbGV0YSBhbCAxMDAgJTsgbGEgY2lmcmEgbXVlc3RyYSBlbCBwb3JjZW50YWplIHNpbiBsw61taXRlLjwvcD48L2FydGljbGU+YDsKfQphc3luYyBmdW5jdGlvbiBsb2FkQnVkZ2V0VjE4KGZvcmNlPWZhbHNlKXsKIGNvbnN0IG93bmVyPWFwcFNlc3Npb25WMTU/LnRva2VuO2lmKCFvd25lcnx8KGJ1ZGdldExvYWRpbmdWMTgmJmJ1ZGdldE93bmVyVjE4PT09b3duZXIpKXJldHVybjsKIGlmKCFmb3JjZSYmYnVkZ2V0T3duZXJWMTg9PT1vd25lciYmKGJ1ZGdldFJvd3NWMTghPT1udWxsfHxidWRnZXRFcnJvclYxOCkpcmV0dXJuOwogYnVkZ2V0TG9hZGluZ1YxOD10cnVlO2J1ZGdldE93bmVyVjE4PW93bmVyO2J1ZGdldEVycm9yVjE4PScnO2J1ZGdldFJvd3NWMTg9bnVsbDtidWRnZXRTdG9yYWdlVjE4PW51bGw7CiB0cnl7bGV0IGxpc3Q9W107Zm9yKGxldCBvZmZzZXQ9MDtvZmZzZXQ8MjAwMDA7b2Zmc2V0Kz0xMDAwKXtjb25zdCBjaHVuaz1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvbGFfYnVkZ2V0X2RhaWx5P3NlbGVjdD1kYXRlLHdpbixjb2luLHNvdXJjZSZvcmRlcj1kYXRlJmxpbWl0PTEwMDAmb2Zmc2V0PScrb2Zmc2V0LHt9LG93bmVyKTtpZighQXJyYXkuaXNBcnJheShjaHVuaykpdGhyb3cgRXJyb3IoJ05vIHNlIHB1ZG8gbGVlciBlbCBwcmVzdXB1ZXN0by4nKTtsaXN0LnB1c2goLi4uY2h1bmspO2lmKGNodW5rLmxlbmd0aDwxMDAwKWJyZWFrO2lmKG9mZnNldD09PTE5MDAwKXRocm93IEVycm9yKCdFbCBwcmVzdXB1ZXN0byBzdXBlcmEgZWwgbMOtbWl0ZSBkZSBmZWNoYXMgYWRtaXRpZGFzLicpO31jb25zdCB2YWxpZD12YWxpZGF0ZUJ1ZGdldFYxOChsaXN0KTtpZihhcHBTZXNzaW9uVjE1Py50b2tlbiE9PW93bmVyKXJldHVybjtidWRnZXRSb3dzVjE4PXZhbGlkOwogIGlmKGFwcFNlc3Npb25WMTU/LnJvbGU9PT0nYWRtaW4nKXRyeXtjb25zdCB1c2FnZT1hd2FpdCBzdXBhYmFzZVJlcXVlc3RMQSgnL3Jlc3QvdjEvcnBjL2xhX3N0b3JhZ2Vfc3RhdHVzX3YxOCcse21ldGhvZDonUE9TVCcsYm9keTone30nfSxvd25lcik7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW49PT1vd25lcilidWRnZXRTdG9yYWdlVjE4PXVzYWdlO31jYXRjaChlKXsvKiBBIHVzYWdlIGVycm9yIGRvZXMgbm90IGhpZGUgdGhlIGJ1ZGdldC4gKi99CiB9Y2F0Y2goZSl7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW49PT1vd25lcilidWRnZXRFcnJvclYxOD1lLm1lc3NhZ2U7fQogZmluYWxseXtpZihidWRnZXRPd25lclYxOD09PW93bmVyKWJ1ZGdldExvYWRpbmdWMTg9ZmFsc2U7aWYoYXBwU2Vzc2lvblYxNT8udG9rZW49PT1vd25lciYmdGFiPT09YnVkZ2V0VGFiVjE4KXJlbmRlcigpO30KfQpmdW5jdGlvbiByZW5kZXJCdWRnZXRWMTgoKXsKIGNoYXJ0UG9pbnRzVjQuY2xlYXIoKTtyZXNwb25zaXZlQ2hhcnRNb2RlbHNMQS5jbGVhcigpO2NvbnN0IHM9dmlld1N0YXRlLmJ1ZGdldFYxOD8/PXtmcm9tOicnLHRvOicnLGdyYWluOid3ZWVrJyxtZXRyaWM6J3dpbid9LGJvdW5kcz1kYXRlUmFuZ2UoKTtzLmZyb218fD1ib3VuZHNbMF07cy50b3x8PWJvdW5kc1sxXTtpZighWydkYXknLCd3ZWVrJywnbW9udGgnXS5pbmNsdWRlcyhzLmdyYWluKSlzLmdyYWluPSd3ZWVrJztpZighWyd3aW4nLCdjb2luJ10uaW5jbHVkZXMocy5tZXRyaWMpKXMubWV0cmljPSd3aW4nOwogZG9jdW1lbnQuYm9keS5kYXRhc2V0LnZpZXc9YnVkZ2V0VGFiVjE4OyQoJyN0aXRsZScpLnRleHRDb250ZW50PWJ1ZGdldFRhYlYxODskKCcjdmlld0hlbHAnKS50ZXh0Q29udGVudD0nUGFycXVlIFRHTSBjb21wbGV0byDCtyBwcmVzdXB1ZXN0byBkaWFyaW8gcG9yIGZlY2hhIGV4YWN0YSc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlcnMnKS5zdHlsZS5kaXNwbGF5PSdub25lJzskKCcjY29udHJvbHMnKS5zdHlsZS5kaXNwbGF5PSdub25lJztjb25zdCBmb2xkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXJzJyk/LmNsb3Nlc3QoJ2RldGFpbHMuY29tcGFjdEZvbGRMQScpO2lmKGZvbGQpZm9sZC5zdHlsZS5kaXNwbGF5PSdub25lJzsKIGxldCBjb250ZW50PScnO2N1cnJlbnRCdWRnZXRWMTg9bnVsbDsKIGlmKGJ1ZGdldE93bmVyVjE4IT09YXBwU2Vzc2lvblYxNT8udG9rZW58fGJ1ZGdldFJvd3NWMTg9PT1udWxsKXtjb250ZW50PWA8ZGl2IGNsYXNzPSJjYXJkIj48cCByb2xlPSJzdGF0dXMiPiR7ZXNjKGJ1ZGdldEVycm9yVjE4fHwnQ2FyZ2FuZG8gcHJlc3VwdWVzdG8gcHJpdmFkb+KApicpfTwvcD4ke2J1ZGdldEVycm9yVjE4Pyc8YnV0dG9uIGlkPSJidWRnZXRSZXRyeVYxOCI+Vm9sdmVyIGEgaW50ZW50YXI8L2J1dHRvbj4nOicnfTwvZGl2PmA7fQogZWxzZSB0cnl7Y29uc3Qgcj1idWlsZEJ1ZGdldFYxOChkYXRhLnJvd3MsYnVkZ2V0Um93c1YxOCxzKTtjdXJyZW50QnVkZ2V0VjE4PXI7Y29uc3Qgaz1zLm1ldHJpYyxsYWJlbD1rPT09J3dpbic/J1dpbiBvcGVyYWNpb25hbCc6J0NvaW4gSW4nLGhlYWRlcnM9WydQZXLDrW9kbycsJ0Rlc2RlJywnSGFzdGEnLCdEw61hcyBjb21wYXJhYmxlcycsJ0TDrWFzIGNvbiBQUFRPJywnRMOtYXMgcmVhbGVzJywnV2luIHJlYWwgQ0xQJywnV2luIFBQVE8gY29tcGFyYWJsZSBDTFAnLCdDdW1wbGltaWVudG8gV2luICUnLCdCcmVjaGEgV2luIENMUCcsJ0NvaW4gSW4gcmVhbCBDTFAnLCdDb2luIEluIFBQVE8gY29tcGFyYWJsZSBDTFAnLCdDdW1wbGltaWVudG8gQ29pbiBJbiAlJywnQnJlY2hhIENvaW4gSW4gQ0xQJ107CiAgY29uc3QgZGV0YWlsPXIubGlzdC5tYXAoZz0+W3MuZ3JhaW49PT0nd2Vlayc/J1NlbWFuYSBkZWwgJytkYXRlTGFiZWxTcGFuaXNoTEEoZy5uYW1lKTpkaXNwbGF5RGF0ZXNWNShnLm5hbWUpLGcuZnJvbSxnLnRvLGcubWF0Y2hlZCxnLmJ1ZGdldERheXMsZy5hY3R1YWxEYXlzLGcubWF0Y2hlZD9nLmFjdHVhbC53aW46bnVsbCxnLm1hdGNoZWQ/Zy50YXJnZXQud2luOm51bGwscmF0aW9CdWRnZXRWMTgoZy5hY3R1YWwud2luLGcudGFyZ2V0LndpbiksZy5tYXRjaGVkP2cuYWN0dWFsLndpbi1nLnRhcmdldC53aW46bnVsbCxnLm1hdGNoZWQ/Zy5hY3R1YWwuY29pbjpudWxsLGcubWF0Y2hlZD9nLnRhcmdldC5jb2luOm51bGwscmF0aW9CdWRnZXRWMTgoZy5hY3R1YWwuY29pbixnLnRhcmdldC5jb2luKSxnLm1hdGNoZWQ/Zy5hY3R1YWwuY29pbi1nLnRhcmdldC5jb2luOm51bGxdKTtleHBvcnRSb3dzPVtoZWFkZXJzLC4uLmRldGFpbF07CiAgY29uc3QgcmVhbD1yLmxpc3QubWFwKGc9Pih7bmFtZTpnLm5hbWUsW2tdOmcubWF0Y2hlZD9nLmFjdHVhbFtrXTpudWxsfSkpLHRhcmdldD1yLmxpc3QubWFwKGc9Pih7bmFtZTpnLm5hbWUsW2tdOmcubWF0Y2hlZD9nLnRhcmdldFtrXTpudWxsfSkpOwogIGNvbnRlbnQ9YDxkaXYgY2xhc3M9ImJ1ZGdldENvdmVyYWdlVjE4Ij48Yj4ke3IubWF0Y2hlZH0gZMOtYXMgY29tcGFyYWJsZXMgZGUgJHtyLmNhbGVuZGFyRGF5c30gZMOtYXMgY2FsZW5kYXJpbzwvYj48c3Bhbj4ke3IubWlzc2luZ0FjdHVhbH0gZMOtYXMgY29uIFBQVE8gc2luIGRhdG9zIHJlYWxlcyDCtyAke3IubWlzc2luZ0J1ZGdldH0gZMOtYXMgcmVhbGVzIHNpbiBQUFRPPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJ1ZGdldEhlcm9lc1YxOCI+JHtnYXVnZUJ1ZGdldFYxOCgnV2luIG9wZXJhY2lvbmFsJyxyLm1hdGNoZWQ/ci50b3RhbHMuYWN0dWFsLndpbjpudWxsLHIubWF0Y2hlZD9yLnRvdGFscy50YXJnZXQud2luOm51bGwpfSR7Z2F1Z2VCdWRnZXRWMTgoJ0NvaW4gSW4nLHIubWF0Y2hlZD9yLnRvdGFscy5hY3R1YWwuY29pbjpudWxsLHIubWF0Y2hlZD9yLnRvdGFscy50YXJnZXQuY29pbjpudWxsKX08L2Rpdj48c2VjdGlvbiBjbGFzcz0iY2FyZCBidWRnZXRGdWxsVjE4Ij48aDI+UFBUTyBjb21wbGV0byBkZWwgcmFuZ28gc2VsZWNjaW9uYWRvPC9oMj48cD5XaW46IDxiPiR7Zm10KHIudG90YWxzLmZ1bGxUYXJnZXQud2luLCd3aW4nKX0gQ0xQPC9iPiDCtyBDb2luIEluOiA8Yj4ke2ZtdChyLnRvdGFscy5mdWxsVGFyZ2V0LmNvaW4sJ2NvaW4nKX0gQ0xQPC9iPiDCtyAke3IuYnVkZ2V0RGF5c30gZmVjaGFzIGNvbiBtZXRhLjwvcD48cCBjbGFzcz0ic3VidGl0bGUiPkVsIGN1bXBsaW1pZW50byBzdXBlcmlvciB1c2Egw7puaWNhbWVudGUgZmVjaGFzIHF1ZSB0aWVuZW4gYW1ib3MgZGF0b3MuIExvcyBkw61hcyBzaW4gcmVnaXN0cm9zIG5vIHNlIGNvbnZpZXJ0ZW4gZW4gY2VybyB5IG5vIHNlIGNvbXBhcmFuIG1ldGFzIGRlIG90cm8gYcOxby48L3A+PC9zZWN0aW9uPjxkaXYgY2xhc3M9ImNoYXJ0cyI+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj4ke2xhYmVsfSByZWFsIGZyZW50ZSBhbCBQUFRPPC9oMj48cCBjbGFzcz0ic3VidGl0bGUiPlRvdGFsZXMgY29tcGFyYWJsZXMgcG9yICR7cy5ncmFpbj09PSdkYXknPydkw61hJzpzLmdyYWluPT09J3dlZWsnPydzZW1hbmEnOidtZXMnfSDCtyBDTFA8L3A+JHtyLm1hdGNoZWQ/Y2hhcnRWMihbe25hbWU6bGFiZWwrJyByZWFsJyxwb2ludHM6cmVhbH0se25hbWU6J1BQVE8gwrcgbWlzbW9zIGTDrWFzJyxwb2ludHM6dGFyZ2V0fV0sayk6JzxwPlNpbiBmZWNoYXMgY29tcGFyYWJsZXMuIFJldmlzYSBlbCBhw7FvIHkgbG9zIGRhdG9zIGNhcmdhZG9zLjwvcD4nfTwvc2VjdGlvbj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPkF2YW5jZSBhY3VtdWxhZG8gwrcgJHtsYWJlbH08L2gyPjxwIGNsYXNzPSJzdWJ0aXRsZSI+QWN1bXVsYWRvIHNvbG8gZGUgZMOtYXMgY29tcGFyYWJsZXMgwrcgQ0xQIMK3IGxvcyBodWVjb3Mgbm8gZXF1aXZhbGVuIGEgY2VybzwvcD4ke3IubWF0Y2hlZD9jaGFydFYyKFt7bmFtZTpsYWJlbCsnIGFjdW11bGFkbyByZWFsJyxwb2ludHM6ci5jdW11bGF0aXZlLm1hcChwPT4oe25hbWU6cC5uYW1lLHdpbjpwLndpbn0pKX0se25hbWU6J1BQVE8gYWN1bXVsYWRvJyxwb2ludHM6ci5jdW11bGF0aXZlLm1hcChwPT4oe25hbWU6cC5uYW1lLHdpbjpwLmNvaW59KSl9XSwnd2luJyk6JzxwPlNpbiBkYXRvcyBwYXJhIGVsIGFjdW11bGFkby48L3A+J308L3NlY3Rpb24+PC9kaXY+PHNlY3Rpb24gY2xhc3M9ImNhcmQiPjxoMj5DdW1wbGltaWVudG8gcG9yIHBlcsOtb2RvIMK3ICR7bGFiZWx9PC9oMj48cCBjbGFzcz0ic3VidGl0bGUiPkzDrW5lYSBkZSByZWZlcmVuY2lhOiAxMDAgJSBkZSBsYSBtZXRhIMK3IGNhZGEgYmFycmEgY29uc2VydmEgc3UgcG9yY2VudGFqZSBleGFjdG88L3A+PGRpdiBjbGFzcz0iYnVkZ2V0QmFyc1YxOCI+JHtyLmxpc3QubWFwKGc9Pntjb25zdCBxPXJhdGlvQnVkZ2V0VjE4KGcuYWN0dWFsW2tdLGcudGFyZ2V0W2tdKTtyZXR1cm4gYDxkaXYgY2xhc3M9ImJ1ZGdldEJhclJvd1YxOCI+PHNwYW4+JHtlc2Mocy5ncmFpbj09PSd3ZWVrJz8nU2VtYW5hIGRlbCAnK2RhdGVMYWJlbFNwYW5pc2hMQShnLm5hbWUpOmRpc3BsYXlEYXRlc1Y1KGcubmFtZSkpfTxzbWFsbD4ke2cubWF0Y2hlZH0vJHtnLmJ1ZGdldERheXN9IGTDrWFzIGNvbiBtZXRhIGNvbXBhcmFkb3M8L3NtYWxsPjwvc3Bhbj48ZGl2IGNsYXNzPSJidWRnZXRUcmFja1YxOCI+PGkgc3R5bGU9IndpZHRoOiR7TWF0aC5tYXgoMCxNYXRoLm1pbigxMDAsKHF8fDApKjEwMC8xLjUpKX0lO2JhY2tncm91bmQ6JHtxPj0xPycjMjM3MzU0JzonI2UxNWIxNid9Ij48L2k+PGIgYXJpYS1oaWRkZW49InRydWUiPjwvYj48L2Rpdj48c3Ryb25nPiR7YnVkZ2V0UGVyY2VudFYxOChxKX08L3N0cm9uZz48L2Rpdj5gO30pLmpvaW4oJycpfHwnPHA+Tm8gaGF5IGZlY2hhcyBkZW50cm8gZGVsIHJhbmdvLjwvcD4nfTwvZGl2Pjwvc2VjdGlvbj48c2VjdGlvbiBjbGFzcz0iY2FyZCI+PGgyPkRldGFsbGUgZGUgY3VtcGxpbWllbnRvIHkgY29iZXJ0dXJhPC9oMj48ZGl2IGlkPSJidWRnZXREZXRhaWxWMTgiPjwvZGl2Pjwvc2VjdGlvbj48ZGV0YWlscyBjbGFzcz0iY2FyZCBidWRnZXRNZXRob2RWMTgiPjxzdW1tYXJ5PkZ1ZW50ZSwgY8OhbGN1bG8geSBhbG1hY2VuYW1pZW50bzwvc3VtbWFyeT48cD5GdWVudGU6ICR7ZXNjKFsuLi5uZXcgU2V0KGJ1ZGdldFJvd3NWMTgubWFwKHI9PnIuc291cmNlKSldLmpvaW4oJywgJykpfHwnU2luIHByZXN1cHVlc3RvIGNhcmdhZG8nfSDCtyBob2phIGJhc2VzLCBBID0gZmVjaGEsIEQgPSBXSU4gVEdNIHkgRSA9IENPSU4gSU4uIFZhbG9yZXMgZW4gQ0xQLiBSZWFsOiBwcmltZXIgV2luIG9wZXJhY2lvbmFsIChjb2x1bW5hIFEpIHkgQ29pbiBJbiAoUykgZGUgbGEgbWF0cml6LiBTZSBleGNsdXllbiBFWFBJUkFET1MgeSBzZXBhcmFkb3Jlcy48L3A+PHA+Q3VtcGxpbWllbnRvID0gc3VtYSByZWFsIMO3IHN1bWEgUFBUTyBwYXJhIGxhcyBtaXNtYXMgZmVjaGFzLiBCcmVjaGEgPSByZWFsIOKIkiBQUFRPLiBMYXMgbWV0YXMgc29uIGRlbCBwYXJxdWUgY29tcGxldG87IG5vIHNlIHJlcGFydGVuIGVudHJlIG3DoXF1aW5hcyBuaSBzZSBwcm9tZWRpYW4gcG9yY2VudGFqZXMgZGlhcmlvcy4gTm8gc2UgcmVhbGl6YSBwcm95ZWNjacOzbiBhdXRvbcOhdGljYS4gU2VtYW5hcyBkZSBsdW5lcyBhIGRvbWluZ28sIHJlY29ydGFkYXMgYWwgcmFuZ28gc29saWNpdGFkby48L3A+JHtidWRnZXRTdG9yYWdlVjE4P2A8cD48Yj5Vc28gcmVhbCBkZSBsYSBiYXNlIGNvbXBsZXRhOiAkeyhidWRnZXRTdG9yYWdlVjE4LmRhdGFiYXNlQnl0ZXMvMWU2KS50b0xvY2FsZVN0cmluZygnZXMtQ0wnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pfSBNQjwvYj4gZGUgbG9zIDUwMCBNQiBkZWwgcGxhbiBncmF0dWl0byAoJHsoYnVkZ2V0U3RvcmFnZVYxOC5kYXRhYmFzZUJ5dGVzLzVlNikudG9Mb2NhbGVTdHJpbmcoJ2VzLUNMJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjF9KX0gJSkuIENvbnN1bHRhIHB1bnR1YWw7IGVsIHVzbyBjYW1iaWEgY29uIGxhcyBjYXJnYXMuIEluY2x1eWUgb3RyYXMgYXBsaWNhY2lvbmVzIGRlbCBtaXNtbyBwcm95ZWN0by48L3A+YDonJ308cD5FeGNlbCBvcmlnaW5hbCB5IGFyY2hpdm8gaGlzdMOzcmljbzogPGEgaHJlZj0iaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2RyaXZlL2ZvbGRlcnMvMTU0LVllSGo0UVZzc2V3QjAyQ1FieXRVZGIwaXZCY3lQIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+Y2FycGV0YSBkZSBEcml2ZTwvYT4uIExvcyBkYXRvcyBhY3Rpdm9zIHBlcm1hbmVjZW4gZW4gU3VwYWJhc2UuIEVzdGEgY2FycGV0YSBubyBpbXBsaWNhIHJlc3BhbGRvcyBhdXRvbcOhdGljb3MgZGUgZnV0dXJhcyBjYXJnYXMuPC9wPjwvZGV0YWlscz5gOwogICQoJyNjb250ZW50JykuaW5uZXJIVE1MPScnOyAvLyBUaGUgZmluYWwgRE9NIGlzIGNvbW1pdHRlZCBiZWxvdyBvbmx5IGFmdGVyIGNhbGN1bGF0aW9uIHN1Y2NlZWRzLgogIGN1cnJlbnRCdWRnZXRWMTguZGV0YWlsPXtoZWFkZXJzLHJvd3M6ZGV0YWlsfTsKIH1jYXRjaChlKXtjb250ZW50PSc8ZGl2IGNsYXNzPSJub3RpY2UiPicrZXNjKGUubWVzc2FnZSkrJzwvZGl2Pic7fQogJCgnI2NvbnRlbnQnKS5pbm5lckhUTUw9YmFubmVyKCdDdW1wbGltaWVudG8gZGVsIHByZXN1cHVlc3RvIFRHTScsJ1dpbiB5IENvaW4gSW4gZnJlbnRlIGEgbGFzIG1ldGFzIGRpYXJpYXMgZGVsIG1pc21vIGHDsW8sIGNvbiBjb2JlcnR1cmEgdmlzaWJsZSB5IG1vbnRvcyBjb21wYXJhYmxlcy4nKStgPHNlY3Rpb24gY2xhc3M9ImNhcmQgYnVkZ2V0Q29udHJvbHNWMTgiPjxsYWJlbD5EZXNkZTxpbnB1dCB0eXBlPSJkYXRlIiBpZD0iYnVkZ2V0RnJvbVYxOCIgdmFsdWU9IiR7ZXNjKHMuZnJvbSl9Ij48L2xhYmVsPjxsYWJlbD5IYXN0YTxpbnB1dCB0eXBlPSJkYXRlIiBpZD0iYnVkZ2V0VG9WMTgiIHZhbHVlPSIke2VzYyhzLnRvKX0iPjwvbGFiZWw+PGxhYmVsPkFncnVwYXIgcG9yPHNlbGVjdCBpZD0iYnVkZ2V0R3JhaW5WMTgiPjxvcHRpb24gdmFsdWU9ImRheSI+RMOtYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IndlZWsiPlNlbWFuYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1vbnRoIj5NZXM8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjxsYWJlbD5JbmRpY2Fkb3IgZW4gZ3LDoWZpY29zPHNlbGVjdCBpZD0iYnVkZ2V0TWV0cmljVjE4Ij48b3B0aW9uIHZhbHVlPSJ3aW4iPldpbiBvcGVyYWNpb25hbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNvaW4iPkNvaW4gSW48L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjxidXR0b24gaWQ9ImJ1ZGdldEFwcGx5VjE4IiBjbGFzcz0icHJpbWFyeSI+QXBsaWNhcjwvYnV0dG9uPjxidXR0b24gaWQ9ImJ1ZGdldFJlbG9hZFYxOCI+QWN0dWFsaXphciBQUFRPPC9idXR0b24+PHA+VG9kbyBlbCBwYXJxdWUgwrcgbG9zIGZpbHRyb3MgZGUgbcOhcXVpbmFzIGRlIG90cmFzIHBlc3Rhw7FhcyBubyBzZSBhcGxpY2FuIGEgZXN0YSBtZXRhIGdlbmVyYWwuPC9wPjwvc2VjdGlvbj5gK2NvbnRlbnQ7CiAkKCcjYnVkZ2V0R3JhaW5WMTgnKS52YWx1ZT1zLmdyYWluOyQoJyNidWRnZXRNZXRyaWNWMTgnKS52YWx1ZT1zLm1ldHJpYzsKICQoJyNidWRnZXRBcHBseVYxOCcpLm9uY2xpY2s9KCk9PntzLmZyb209JCgnI2J1ZGdldEZyb21WMTgnKS52YWx1ZTtzLnRvPSQoJyNidWRnZXRUb1YxOCcpLnZhbHVlO3MuZ3JhaW49JCgnI2J1ZGdldEdyYWluVjE4JykudmFsdWU7cy5tZXRyaWM9JCgnI2J1ZGdldE1ldHJpY1YxOCcpLnZhbHVlO3JlbmRlcigpO307CiAkKCcjYnVkZ2V0UmVsb2FkVjE4Jykub25jbGljaz0oKT0+e2xvYWRCdWRnZXRWMTgodHJ1ZSk7cmVuZGVyKCk7fTtjb25zdCByZXRyeT0kKCcjYnVkZ2V0UmV0cnlWMTgnKTtpZihyZXRyeSlyZXRyeS5vbmNsaWNrPSgpPT57bG9hZEJ1ZGdldFYxOCh0cnVlKTtyZW5kZXIoKTt9OwogaWYoY3VycmVudEJ1ZGdldFYxOD8uZGV0YWlsKXtjb25zdCB7aGVhZGVycyxyb3dzfT1jdXJyZW50QnVkZ2V0VjE4LmRldGFpbDtwYXJrVGFibGVMQSgkKCcjYnVkZ2V0RGV0YWlsVjE4JyksaGVhZGVycyxyb3dzLGhlYWRlcnMubWFwKChoLGkpPT5bOCwxMl0uaW5jbHVkZXMoaSk/cGVyY2VudFBhcmtMQTpudWxsKSk7fQogZGVjb3JhdGVDaGFydHNWOCgpO2VuaGFuY2VUYWJsZXNMQSgpO2ZpdFJlc3BvbnNpdmVDaGFydHNMQSgpO3BvbGlzaFZpc3VhbExBKCk7ZGVjb3JhdGVTcGFuaXNoRGF0ZXNMQSgpO3NldHVwRXhwZXJpZW5jZUhlYWRlckxBKCk7CiBpZihidWRnZXRPd25lclYxOCE9PWFwcFNlc3Npb25WMTU/LnRva2VufHwoIWJ1ZGdldExvYWRpbmdWMTgmJmJ1ZGdldFJvd3NWMTg9PT1udWxsJiYhYnVkZ2V0RXJyb3JWMTgpKWxvYWRCdWRnZXRWMTgoKTsKfQpjb25zdCBidWRnZXROYXZWMTg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7YnVkZ2V0TmF2VjE4LmRhdGFzZXQudGFiPWJ1ZGdldFRhYlYxODtidWRnZXROYXZWMTgudGV4dENvbnRlbnQ9J+KXjiAgJytidWRnZXRUYWJWMTg7YnVkZ2V0TmF2VjE4Lm9uY2xpY2s9KCk9PmFjdGl2YXRlVGFiVjMoYnVkZ2V0VGFiVjE4KTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCduYXYgYnV0dG9uW2RhdGEtdGFiPSJNZXRvZG9sb2fDrWEiXScpLmJlZm9yZShidWRnZXROYXZWMTgpOwpjb25zdCByZW5kZXJCZWZvcmVCdWRnZXRWMTg9cmVuZGVyOwpyZW5kZXI9ZnVuY3Rpb24oKXtpZihkYXRhJiZ0YWI9PT1idWRnZXRUYWJWMTgpe3NsaWNlQ2FjaGVGYXN0TEE9bmV3IE1hcCgpO2FnZ3JlZ2F0ZUNhY2hlRmFzdExBPW5ldyBXZWFrTWFwKCk7cmVuZGVyQnVkZ2V0VjE4KCk7fWVsc2UgcmVuZGVyQmVmb3JlQnVkZ2V0VjE4KCk7fTsKY29uc3QgZXhwb3J0QmVmb3JlQnVkZ2V0VjE4PSQoJyN2MmV4cG9ydCcpLm9uY2xpY2s7CiQoJyN2MmV4cG9ydCcpLm9uY2xpY2s9ZnVuY3Rpb24oKXtpZih0YWIhPT1idWRnZXRUYWJWMTgpcmV0dXJuIGV4cG9ydEJlZm9yZUJ1ZGdldFYxOCgpO2NvbnN0IHI9Y3VycmVudEJ1ZGdldFYxODtpZighcil7YWxlcnQoJ0VzcGVyYSBhIHF1ZSBzZSBjYXJndWUgZWwgcHJlc3VwdWVzdG8geSBzZWxlY2Npb25hIGZlY2hhcyB2w6FsaWRhcy4nKTtyZXR1cm47fWRvd25sb2FkQmxvYlY4KHdvcmtib29rQmxvYlY4KFt7bmFtZTonQ3VtcGxpbWllbnRvJyxyb3dzOmV4cG9ydFJvd3N9LHtuYW1lOidEaWFyaW8nLHJvd3M6W1snRmVjaGEnLCdXaW4gcmVhbCBDTFAnLCdXaW4gUFBUTyBDTFAnLCdDb2luIEluIHJlYWwgQ0xQJywnQ29pbiBJbiBQUFRPIENMUCcsJ0NvbXBhcmFibGUnXSwuLi5yLmRhaWx5Lm1hcChkPT5bZC5kYXRlLGQuYWN0dWFsPy53aW4/P251bGwsZC50YXJnZXQ/Lndpbj8/bnVsbCxkLmFjdHVhbD8uY29pbj8/bnVsbCxkLnRhcmdldD8uY29pbj8/bnVsbCxkLm1hdGNoZWQ/J1PDrSc6J05vJ10pXX0se25hbWU6J0NvbnN1bHRhJyxyb3dzOltbJ1BlcsOtb2RvJyx2aWV3U3RhdGUuYnVkZ2V0VjE4LmZyb20rJyBhICcrdmlld1N0YXRlLmJ1ZGdldFYxOC50b10sWydGdWVudGUnLCdDSUVSUkUgUFBUTyAyMDI1Lnhsc3ggwrcgYmFzZXMgQSxELEUgwrcgY29udGllbmUgbWV0YXMgMjAyNSB5IDIwMjYnXSxbJ0FsY2FuY2UnLCdUb2RvIGVsIHBhcnF1ZS4gQ3VtcGxpbWllbnRvIHNvYnJlIGxhcyBtaXNtYXMgZmVjaGFzIGNvbiBkYXRvcyByZWFsZXMgeSBtZXRhLiBEw61hcyBhdXNlbnRlcyBubyBzb24gY2Vyby4nXV19XSksJ0xBLUN1bXBsaW1pZW50by1QUFRPLnhsc3gnKTt9Owpjb25zdCBlbmRCZWZvcmVCdWRnZXRWMTg9ZW5kTG9jYWxTZXNzaW9uVjE1OwplbmRMb2NhbFNlc3Npb25WMTU9ZnVuY3Rpb24obWVzc2FnZSl7YnVkZ2V0Um93c1YxOD1udWxsO2J1ZGdldE93bmVyVjE4PW51bGw7YnVkZ2V0RXJyb3JWMTg9Jyc7YnVkZ2V0U3RvcmFnZVYxOD1udWxsO2N1cnJlbnRCdWRnZXRWMTg9bnVsbDtyZXR1cm4gZW5kQmVmb3JlQnVkZ2V0VjE4KG1lc3NhZ2UpO307Cg0KDQoKLy8gT25seSBxdWVyeSBjb25maWd1cmF0aW9uIGlzIHBlcnNpc3RlZCwgc2NvcGVkIHRvIHRoZSBjdXJyZW50IGFjY291bnQgYW5kIHByb2plY3QuCmNvbnN0IGRlZmF1bHRTdGF0ZVF1ZXJ5VjE0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmlld1N0YXRlKSk7CmxldCBvd25lclF1ZXJ5VjE0PW51bGwscGVuZGluZ1F1ZXJ5VjE0PW51bGwsYm9vdFF1ZXJ5VjE0PWZhbHNlLHRpbWVyUXVlcnlWMTQ9bnVsbCxyZXN0b3JlZFF1ZXJ5VjE0PWZhbHNlOwpmdW5jdGlvbiBrZXlRdWVyeVYxNCgpe2NvbnN0IHVzZXJuYW1lPVN0cmluZyhhcHBTZXNzaW9uVjE1Py51c2VybmFtZXx8JycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO3JldHVybiB1c2VybmFtZT8nTEFfTEFTVF9RVUVSWV9WMTR8JytTdHJpbmcod2luZG93LkxBX0NPTkZJRz8uc3VwYWJhc2VVcmx8fCcnKSsnfCcrdXNlcm5hbWU6bnVsbDt9CmZ1bmN0aW9uIGNsZWFuSlNPTlF1ZXJ5VjE0KHZhbHVlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSwoa2V5LGl0ZW0pPT5bJ19fcHJvdG9fXycsJ2NvbnN0cnVjdG9yJywncHJvdG90eXBlJywndG9rZW4nLCdwYXNzd29yZCcsJ2FjY2Vzc190b2tlbicsJ3JlZnJlc2hfdG9rZW4nLCdyb3dzJywncGF5bG9hZCddLmluY2x1ZGVzKGtleSk/dW5kZWZpbmVkOml0ZW0pKTt9CmZ1bmN0aW9uIGNhcHR1cmVRdWVyeVYxNCgpe3JldHVybnt2ZXJzaW9uOjEsc2F2ZWRBdDpuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksdGFiLGZyb206JCgnI2Zyb20nKT8udmFsdWV8fCcnLHRvOiQoJyN0bycpPy52YWx1ZXx8Jycsc3RhdGU6Y2xlYW5KU09OUXVlcnlWMTQodmlld1N0YXRlKSxkZW5zaXR5OmRlbnNpdHlMQX07fQpmdW5jdGlvbiBsb2FkUXVlcnlWMTQoa2V5KXt0cnl7Y29uc3QgcmF3PWxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7aWYoIXJhd3x8cmF3Lmxlbmd0aD4yNTAwMDApcmV0dXJuIG51bGw7Y29uc3Qgc2F2ZWQ9SlNPTi5wYXJzZShyYXcsKG5hbWUsdmFsdWUpPT5bJ19fcHJvdG9fXycsJ2NvbnN0cnVjdG9yJywncHJvdG90eXBlJ10uaW5jbHVkZXMobmFtZSk/dW5kZWZpbmVkOnZhbHVlKTtpZihzYXZlZD8udmVyc2lvbiE9PTF8fCFzYXZlZC5zdGF0ZXx8dHlwZW9mIHNhdmVkLnN0YXRlIT09J29iamVjdCd8fEFycmF5LmlzQXJyYXkoc2F2ZWQuc3RhdGUpKXJldHVybiBudWxsO2Zvcihjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHNhdmVkLnN0YXRlKSlpZih2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT09J29iamVjdCcmJkFycmF5LmlzQXJyYXkodmFsdWUpKXJldHVybiBudWxsO3JldHVybiBzYXZlZDt9Y2F0Y2goZXJyb3Ipe3JldHVybiBudWxsO319CmZ1bmN0aW9uIHN0YXR1c1F1ZXJ5VjE0KG1lc3NhZ2Upe2xldCBiYWRnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFzdFF1ZXJ5U3RhdHVzVjE0Jyk7aWYoIWJhZGdlKXtjb25zdCBiYXI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndvcmtzcGFjZWJhcicpO2lmKCFiYXIpcmV0dXJuO2JhZGdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtiYWRnZS5pZD0nbGFzdFF1ZXJ5U3RhdHVzVjE0JztiYWRnZS5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdzdGF0dXMnKTtiYXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO31iYWRnZS50ZXh0Q29udGVudD1tZXNzYWdlO2JhZGdlLnRpdGxlPSdGZWNoYXMsIGZpbHRyb3MgeSBncsOhZmljb3Mgc2UgcmVjdWVyZGFuIHBvciB1c3VhcmlvIGVuIGVzdGUgbmF2ZWdhZG9yLiBObyBzZSBndWFyZGFuIGNvbnRyYXNlw7FhcyBuaSBtYXRyaWNlcy4nO30KZnVuY3Rpb24gc2F2ZVF1ZXJ5VjE0KCl7CiBpZihib290UXVlcnlWMTR8fCFkYXRhfHwhb3duZXJRdWVyeVYxNHx8b3duZXJRdWVyeVYxNCE9PWtleVF1ZXJ5VjE0KCkpcmV0dXJuIGZhbHNlOwogaWYodGltZXJRdWVyeVYxNCl7Y2xlYXJUaW1lb3V0KHRpbWVyUXVlcnlWMTQpO3RpbWVyUXVlcnlWMTQ9bnVsbDt9CiB0cnl7Y29uc3QgdGV4dD1KU09OLnN0cmluZ2lmeShjYXB0dXJlUXVlcnlWMTQoKSk7aWYodGV4dC5sZW5ndGg+MjUwMDAwKXRocm93IEVycm9yKCdDb25maWd1cmFjacOzbiBkZW1hc2lhZG8gZ3JhbmRlJyk7bG9jYWxTdG9yYWdlLnNldEl0ZW0ob3duZXJRdWVyeVYxNCx0ZXh0KTtzdGF0dXNRdWVyeVYxNCgnQ29uc3VsdGEgZ3VhcmRhZGEgZW4gZXN0ZSBlcXVpcG8nKTtyZXR1cm4gdHJ1ZTt9Y2F0Y2goZXJyb3Ipe3N0YXR1c1F1ZXJ5VjE0KCdFc3RlIG5hdmVnYWRvciBubyBwZXJtaXRlIGd1YXJkYXIgbGEgY29uc3VsdGEnKTtyZXR1cm4gZmFsc2U7fQp9CmZ1bmN0aW9uIHF1ZXVlUXVlcnlWMTQoKXtpZihib290UXVlcnlWMTR8fCFvd25lclF1ZXJ5VjE0KXJldHVybjtpZih0aW1lclF1ZXJ5VjE0KWNsZWFyVGltZW91dCh0aW1lclF1ZXJ5VjE0KTt0aW1lclF1ZXJ5VjE0PXNldFRpbWVvdXQoc2F2ZVF1ZXJ5VjE0LDE4MCk7fQpmdW5jdGlvbiByZXNldFN0YXRlUXVlcnlWMTQoKXtmb3IoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZpZXdTdGF0ZSkpZGVsZXRlIHZpZXdTdGF0ZVtrZXldO09iamVjdC5hc3NpZ24odmlld1N0YXRlLEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFN0YXRlUXVlcnlWMTQpKSk7fQpmdW5jdGlvbiBhcHBseVF1ZXJ5VjE0KHNhdmVkKXsKIHJlc2V0U3RhdGVRdWVyeVYxNCgpO2lmKHNhdmVkKU9iamVjdC5hc3NpZ24odmlld1N0YXRlLGNsZWFuSlNPTlF1ZXJ5VjE0KHNhdmVkLnN0YXRlKSk7CiBjb25zdCBhdmFpbGFibGU9Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ25hdiBidXR0b25bZGF0YS10YWJdJyldLm1hcChidXR0b249PmJ1dHRvbi5kYXRhc2V0LnRhYik7dGFiPXNhdmVkJiZhdmFpbGFibGUuaW5jbHVkZXMoc2F2ZWQudGFiKT9zYXZlZC50YWI6J1Jlc3VtZW4nOwogaWYoc2F2ZWQpe2Zvcihjb25zdCBuYW1lIG9mIFsnZnJvbScsJ3RvJ10paWYoc2F2ZWRbbmFtZV09PT0nJ3x8L15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3Qoc2F2ZWRbbmFtZV0pKSQoJyMnK25hbWUpLnZhbHVlPXNhdmVkW25hbWVdO2RlbnNpdHlMQT1zYXZlZC5kZW5zaXR5PT09J2NvbWZvcnRhYmxlJz8nY29tZm9ydGFibGUnOidjb21wYWN0Jztkb2N1bWVudC5ib2R5LmRhdGFzZXQuZGVuc2l0eT1kZW5zaXR5TEE7Y29uc3Qgc2VsZWN0PSQoJyNkZW5zaXR5TEEnKTtpZihzZWxlY3Qpc2VsZWN0LnZhbHVlPWRlbnNpdHlMQTt9CiBjbGVhclBvem9GaWx0ZXJzTEEoKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYgYnV0dG9uW2RhdGEtdGFiXScpLmZvckVhY2goYnV0dG9uPT5idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxidXR0b24uZGF0YXNldC50YWI9PT10YWIpKTsKfQpjb25zdCBpbml0QmVmb3JlUXVlcnlWMTQ9aW5pdDsKaW5pdD1mdW5jdGlvbigpewogY29uc3Qga2V5PWtleVF1ZXJ5VjE0KCk7aWYoIWtleSlyZXR1cm4gaW5pdEJlZm9yZVF1ZXJ5VjE0KCk7CiBpZih0aW1lclF1ZXJ5VjE0KXtjbGVhclRpbWVvdXQodGltZXJRdWVyeVYxNCk7dGltZXJRdWVyeVYxND1udWxsO31vd25lclF1ZXJ5VjE0PWtleTtwZW5kaW5nUXVlcnlWMTQ9e3NhdmVkOmxvYWRRdWVyeVYxNChrZXkpfTtib290UXVlcnlWMTQ9dHJ1ZTsKIHRyeXtpbml0QmVmb3JlUXVlcnlWMTQoKTt9ZmluYWxseXtib290UXVlcnlWMTQ9ZmFsc2U7cGVuZGluZ1F1ZXJ5VjE0PW51bGw7fQogc2F2ZVF1ZXJ5VjE0KCk7Cn07CmNvbnN0IHJlbmRlckJlZm9yZVF1ZXJ5VjE0PXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7CiBjb25zdCByZXN0b3JlPXBlbmRpbmdRdWVyeVYxNDtwZW5kaW5nUXVlcnlWMTQ9bnVsbDsKIGlmKHJlc3RvcmUpe2FwcGx5UXVlcnlWMTQocmVzdG9yZS5zYXZlZCk7cmVzdG9yZWRRdWVyeVYxND0hIXJlc3RvcmUuc2F2ZWQ7fQogdHJ5e3JlbmRlckJlZm9yZVF1ZXJ5VjE0KCk7fWNhdGNoKGVycm9yKXtpZighcmVzdG9yZT8uc2F2ZWQpdGhyb3cgZXJyb3I7cmVzZXRTdGF0ZVF1ZXJ5VjE0KCk7dGFiPSdSZXN1bWVuJztjb25zdCBkYXRlcz1tYXRyaXhJbmRleEZhc3RMQSgpLmRhdGVzOyQoJyNmcm9tJykudmFsdWU9ZGF0ZXNbMF18fCcnOyQoJyN0bycpLnZhbHVlPWRhdGVzLmF0KC0xKXx8Jyc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbmF2IGJ1dHRvbltkYXRhLXRhYl0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsYnV0dG9uLmRhdGFzZXQudGFiPT09dGFiKSk7cmVuZGVyQmVmb3JlUXVlcnlWMTQoKTtyZXN0b3JlZFF1ZXJ5VjE0PWZhbHNlO3N0YXR1c1F1ZXJ5VjE0KCdObyBzZSBwdWRvIHJlY3VwZXJhciBsYSBjb25zdWx0YSBhbnRlcmlvcicpO30KIGlmKHJlc3RvcmVkUXVlcnlWMTQmJnJlc3RvcmUpc3RhdHVzUXVlcnlWMTQoJ8OabHRpbWEgY29uc3VsdGEgcmVjdXBlcmFkYScpO3F1ZXVlUXVlcnlWMTQoKTsKfTsKY29uc3QgZW5kU2Vzc2lvbkJlZm9yZVF1ZXJ5VjE0PWVuZExvY2FsU2Vzc2lvblYxNTsKZW5kTG9jYWxTZXNzaW9uVjE1PWZ1bmN0aW9uKC4uLmFyZ3Mpe3NhdmVRdWVyeVYxNCgpO293bmVyUXVlcnlWMTQ9bnVsbDtpZih0aW1lclF1ZXJ5VjE0KXtjbGVhclRpbWVvdXQodGltZXJRdWVyeVYxNCk7dGltZXJRdWVyeVYxND1udWxsO31yZXR1cm4gZW5kU2Vzc2lvbkJlZm9yZVF1ZXJ5VjE0KC4uLmFyZ3MpO307CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsKCk9PnNhdmVRdWVyeVYxNCgpKTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsKCk9PntpZihkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU9PT0naGlkZGVuJylzYXZlUXVlcnlWMTQoKTt9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+e2lmKGRhdGEmJm93bmVyUXVlcnlWMTQpcXVldWVRdWVyeVYxNCgpO30pOwoKbGV0IGRlc2t0b3BIaWRkZW5WMTY9ZmFsc2UsbW9iaWxlT3BlblYxNj1mYWxzZTsKdHJ5e2Rlc2t0b3BIaWRkZW5WMTY9bG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xBX05BVl9ISURERU5fVjE2Jyk9PT0nMSc7fWNhdGNoKGUpe30KZnVuY3Rpb24gbW9iaWxlTmF2aWdhdGlvblYxNigpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aDw9OTAwO30KZnVuY3Rpb24gc2V0TmF2aWdhdGlvblYxNihvcGVuLGZvY3VzPWZhbHNlKXsKIGlmKG1vYmlsZU5hdmlnYXRpb25WMTYoKSltb2JpbGVPcGVuVjE2PW9wZW47CiBlbHNle2Rlc2t0b3BIaWRkZW5WMTY9IW9wZW47dHJ5e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCdMQV9OQVZfSElEREVOX1YxNicsb3Blbj8nMCc6JzEnKTt9Y2F0Y2goZSl7fX0KIHVwZGF0ZU5hdmlnYXRpb25WMTYoKTsKIGlmKGZvY3VzKXtjb25zdCB0YXJnZXQ9b3Blbj9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhc2lkZSBuYXYgYnV0dG9uLmFjdGl2ZSxhc2lkZSBuYXYgYnV0dG9uJyk6JCgnI25hdlRvZ2dsZVYxNicpO3RhcmdldD8uZm9jdXMoKTt9CiBpZih0eXBlb2YgZml0UmVzcG9uc2l2ZUNoYXJ0c0xBPT09J2Z1bmN0aW9uJylmaXRSZXNwb25zaXZlQ2hhcnRzTEEoKTsKfQpmdW5jdGlvbiB1cGRhdGVOYXZpZ2F0aW9uVjE2KCl7CiBjb25zdCBtb2JpbGU9bW9iaWxlTmF2aWdhdGlvblYxNigpLG9wZW49bW9iaWxlP21vYmlsZU9wZW5WMTY6IWRlc2t0b3BIaWRkZW5WMTYsYXNpZGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYXNpZGUnKTsKIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnbmF2SGlkZGVuVjE2Jywhb3Blbik7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCduYXZNb2JpbGVPcGVuVjE2Jyxtb2JpbGUmJm9wZW4pOwogaWYoYXNpZGUpe2FzaWRlLmlkPSduYXZpZ2F0aW9uUGFuZWxWMTYnO2FzaWRlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ01lbsO6IGRlIGFuw6FsaXNpcycpO2FzaWRlLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLFN0cmluZyghb3BlbikpO2FzaWRlLmluZXJ0PSFvcGVuO30KIGNvbnN0IHRvZ2dsZT0kKCcjbmF2VG9nZ2xlVjE2Jyk7aWYodG9nZ2xlKXt0b2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyxTdHJpbmcob3BlbikpO3RvZ2dsZS50ZXh0Q29udGVudD1vcGVuPyfimLAgT2N1bHRhciBtZW7Duic6J+KYsCBNZW7Duic7fQogY29uc3QgY3VycmVudD0kKCcjbmF2Q3VycmVudFYxNicpO2lmKGN1cnJlbnQpY3VycmVudC50ZXh0Q29udGVudD10YWI7CiBjb25zdCBiYWNrZHJvcD0kKCcjbmF2QmFja2Ryb3BWMTYnKTtpZihiYWNrZHJvcCliYWNrZHJvcC5oaWRkZW49IShtb2JpbGUmJm9wZW4pOwp9CmZ1bmN0aW9uIHNldHVwTmF2aWdhdGlvblYxNigpewogY29uc3QgbWFpbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtYWluJyksYXNpZGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYXNpZGUnKTtpZighbWFpbnx8IWFzaWRlKXJldHVybjsKIGlmKCEkKCcjbmF2VG9vbGJhclYxNicpKXsKICBjb25zdCBiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7YmFyLmlkPSduYXZUb29sYmFyVjE2JztiYXIuaW5uZXJIVE1MPSc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9Im5hdlRvZ2dsZVYxNiIgYXJpYS1jb250cm9scz0ibmF2aWdhdGlvblBhbmVsVjE2IiBhcmlhLWV4cGFuZGVkPSJmYWxzZSI+4piwIE1lbsO6PC9idXR0b24+PHNwYW4gaWQ9Im5hdkN1cnJlbnRWMTYiPjwvc3Bhbj4nO21haW4ucHJlcGVuZChiYXIpOwogICQoJyNuYXZUb2dnbGVWMTYnKS5vbmNsaWNrPSgpPT5zZXROYXZpZ2F0aW9uVjE2KG1vYmlsZU5hdmlnYXRpb25WMTYoKT8hbW9iaWxlT3BlblYxNjpkZXNrdG9wSGlkZGVuVjE2LHRydWUpOwogIGNvbnN0IGNsb3NlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2Nsb3NlLmlkPSduYXZDbG9zZVYxNic7Y2xvc2UudHlwZT0nYnV0dG9uJztjbG9zZS50ZXh0Q29udGVudD0n4pyVIENlcnJhciBtZW7Duic7Y2xvc2Uub25jbGljaz0oKT0+c2V0TmF2aWdhdGlvblYxNihmYWxzZSx0cnVlKTthc2lkZS5wcmVwZW5kKGNsb3NlKTsKICBjb25zdCBiYWNrZHJvcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtiYWNrZHJvcC5pZD0nbmF2QmFja2Ryb3BWMTYnO2JhY2tkcm9wLnR5cGU9J2J1dHRvbic7YmFja2Ryb3Auc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnQ2VycmFyIG1lbsO6Jyk7YmFja2Ryb3AudGFiSW5kZXg9LTE7YmFja2Ryb3AuaGlkZGVuPXRydWU7YmFja2Ryb3Aub25jbGljaz0oKT0+c2V0TmF2aWdhdGlvblYxNihmYWxzZSx0cnVlKTttYWluLmJlZm9yZShiYWNrZHJvcCk7CiAgYXNpZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntpZihlLnRhcmdldC5jbG9zZXN0KCduYXYgYnV0dG9uJykmJm1vYmlsZU5hdmlnYXRpb25WMTYoKSlzZXROYXZpZ2F0aW9uVjE2KGZhbHNlLHRydWUpO30pOwogfQogdXBkYXRlTmF2aWdhdGlvblYxNigpOwp9CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57CiBpZighbW9iaWxlTmF2aWdhdGlvblYxNigpfHwhbW9iaWxlT3BlblYxNilyZXR1cm47CiBpZihldmVudC5rZXk9PT0nRXNjYXBlJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzZXROYXZpZ2F0aW9uVjE2KGZhbHNlLHRydWUpO30KIGlmKGV2ZW50LmtleT09PSdUYWInKXsKICBjb25zdCBpdGVtcz1bLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYXNpZGUgYnV0dG9uLGFzaWRlIGFbaHJlZl0sYXNpZGUgaW5wdXQsYXNpZGUgc2VsZWN0JyldLmZpbHRlcihlbD0+IWVsLmRpc2FibGVkJiYhZWwuaGlkZGVuKSxmaXJzdD1pdGVtc1swXSxsYXN0PWl0ZW1zLmF0KC0xKTsKICBpZihldmVudC5zaGlmdEtleSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWZpcnN0KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2xhc3Q/LmZvY3VzKCk7fQogIGVsc2UgaWYoIWV2ZW50LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bGFzdCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtmaXJzdD8uZm9jdXMoKTt9CiB9Cn0pOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywoKT0+e21vYmlsZU9wZW5WMTY9ZmFsc2U7dXBkYXRlTmF2aWdhdGlvblYxNigpO30pOwpjb25zdCByZW5kZXJCZWZvcmVOYXZpZ2F0aW9uVjE2PXJlbmRlcjsKcmVuZGVyPWZ1bmN0aW9uKCl7cmVuZGVyQmVmb3JlTmF2aWdhdGlvblYxNigpO2lmKGRhdGEpc2V0dXBOYXZpZ2F0aW9uVjE2KCk7fTsKCmZ1bmN0aW9uIHByaXplUGVyaW9kc1YxNyhyZXBvcnQpe3JldHVybiByZXBvcnQuc3VtbWFyeS53ZWVrcy5tYXAodz0+e2NvbnN0IGRhdGVzPVsuLi5uZXcgU2V0KHcucm93cy5tYXAocj0+clswXSkpXS5zb3J0KCk7cmV0dXJuIHtsYWJlbDpwcml6ZVdlZWtMYWJlbExBKHcubmFtZSx3LnJvd3MpLGZyb206ZGF0ZXNbMF0sdG86ZGF0ZXMuYXQoLTEpLHBhaWQ6dy5wYWlkLG5ldDp3LnByaXplLGFkanVzdG1lbnRzOncuYWRqdXN0bWVudHN9O30pO30KZnVuY3Rpb24gcHJpemVTaGFyZUJsb2JWMTcocmVwb3J0KXsKIGNvbnN0IHBlcmlvZHM9cHJpemVQZXJpb2RzVjE3KHJlcG9ydCksY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD0xMjAwO2NhbnZhcy5oZWlnaHQ9NjgwK3BlcmlvZHMubGVuZ3RoKjc2OwogY29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLG1vbmV5PXY9PmZtdCh2LCdwcml6ZScpKycgQ0xQJzsKIGN0eC5maWxsU3R5bGU9JyMxMDJlNDQnO2N0eC5maWxsUmVjdCgwLDAsY2FudmFzLndpZHRoLGNhbnZhcy5oZWlnaHQpOwogY29uc3QgdGV4dD0odmFsdWUseCx5LHNpemU9MjQsY29sb3I9JyMxNzM2NTInKT0+e2N0eC5mb250PWAke3NpemU+PTMwPydib2xkICc6Jyd9JHtzaXplfXB4IEFyaWFsYDtjdHguZmlsbFN0eWxlPWNvbG9yO2N0eC5maWxsVGV4dCh2YWx1ZSx4LHkpO307CiB0ZXh0KCdlbmpveSDCtyBMT1Mgw4FOR0VMRVMnLDQ4LDY1LDM0LCcjZmZmZmZmJyk7dGV4dCgnUmVzdW1lbiBkZSBwcmVtaW9zIHBhZ2Fkb3MnLDQ4LDExMCwyNiwnI2ZmZmZmZicpOwogY3R4LmZpbGxTdHlsZT0nI2ZmZmZmZic7Y3R4LmZpbGxSZWN0KDMyLDE0MCwxMTM2LGNhbnZhcy5oZWlnaHQtMTcyKTsKIHRleHQoJ1BSRU1JT1MgUEFHQURPUyBQT1NJVElWT1MnLDYwLDE4NSwyMCk7dGV4dChtb25leShyZXBvcnQuc3VtbWFyeS5wYWlkKSw2MCwyMzgsNDIpOwogdGV4dCgnTcOBUVVJTkFTIFFVRSBQQUdBUk9OJyw3NjAsMTg1LDIwKTt0ZXh0KFN0cmluZyhyZXBvcnQuc3VtbWFyeS5tYWNoaW5lQ291bnQpLDc2MCwyMzgsNDIpOwogdGV4dCgnQWp1c3RlczogJyttb25leShyZXBvcnQuc3VtbWFyeS5hZGp1c3RtZW50cykrJyAgIMK3ICAgTmV0bzogJyttb25leShyZXBvcnQuc3VtbWFyeS5uZXQpLDYwLDI4MywyMCk7CiB0ZXh0KCdQRVLDjU9ET1MgwrcgRkVDSEFTIENPTiBEQVRPUycsNjAsMzMwLDIyKTsKIHBlcmlvZHMuZm9yRWFjaCgocCxpKT0+e2NvbnN0IHk9MzcwK2kqNzY7dGV4dChwLmxhYmVsLDYwLHksMjIpO3RleHQoZGF0ZUxhYmVsU3BhbmlzaExBKHAuZnJvbSkrJyDihpIgJytkYXRlTGFiZWxTcGFuaXNoTEEocC50byksNjAseSsyOCwxOCk7dGV4dChtb25leShwLnBhaWQpLDgwMCx5KzEyLDI1KTt9KTsKIGNvbnN0IHRvcD00MTArcGVyaW9kcy5sZW5ndGgqNzYsYm90dG9tPXRvcCsxNjAsbG89TWF0aC5taW4oMCwuLi5wZXJpb2RzLm1hcChwPT5wLm5ldCkpLGhpPU1hdGgubWF4KDEsLi4ucGVyaW9kcy5tYXAocD0+cC5uZXQpKSxjaGFydFk9dj0+Ym90dG9tLTEzMCoodi1sbykvKGhpLWxvKTsKIHRleHQoJ1ByZW1pb3MgbmV0b3MgcG9yIHNlbWFuYSDCtyBDTFAnLDYwLHRvcC0xOCwyMik7CiBjdHguc3Ryb2tlU3R5bGU9JyNkNGUwZTgnO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKDcwLGJvdHRvbSk7Y3R4LmxpbmVUbygxMTEwLGJvdHRvbSk7Y3R4LnN0cm9rZSgpOwogcGVyaW9kcy5mb3JFYWNoKChwLGkpPT57Y29uc3QgeD0xMjAraSo5NjAvTWF0aC5tYXgoMSxwZXJpb2RzLmxlbmd0aC0xKSx5PWNoYXJ0WShwLm5ldCk7Y3R4LmZpbGxTdHlsZT0nIzE4NTliNSc7Y3R4LmJlZ2luUGF0aCgpO2N0eC5hcmMoeCx5LDYsMCxNYXRoLlBJKjIpO2N0eC5maWxsKCk7aWYoaSl7Y29uc3QgcHJldj1wZXJpb2RzW2ktMV0scHg9MTIwKyhpLTEpKjk2MC9NYXRoLm1heCgxLHBlcmlvZHMubGVuZ3RoLTEpO2N0eC5zdHJva2VTdHlsZT0nIzE4NTliNSc7Y3R4LmxpbmVXaWR0aD0zO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKHB4LGNoYXJ0WShwcmV2Lm5ldCkpO2N0eC5saW5lVG8oeCx5KTtjdHguc3Ryb2tlKCk7fXRleHQoY29tcGFjdChwLm5ldCwncHJpemUnKSxNYXRoLm1pbih4LTI4LDEwNDApLHktMTUsMTgpO30pOwogdGV4dCgnRnVlbnRlOiBjb2x1bW5hIFByZW1pb3Mgwrcgc2VsZWNjacOzbiBhY3R1YWwgwrcgZmVjaGFzIGNvbiByZWdpc3Ryb3MsIHB1ZWRlIGluY2x1aXIgcGVyw61vZG9zIGluY29tcGxldG9zLicsNjAsY2FudmFzLmhlaWdodC01OCwxNik7CiByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+Y2FudmFzLnRvQmxvYihibG9iPT5ibG9iP3Jlc29sdmUoYmxvYik6cmVqZWN0KEVycm9yKCdObyBzZSBwdWRvIGdlbmVyYXIgbGEgaW1hZ2VuLicpKSwnaW1hZ2UvcG5nJykpOwp9CmNvbnN0IHJlbmRlclByaXplc0JlZm9yZVNoYXJlVjE3PXJlbmRlclByaXplc0xBOwpyZW5kZXJQcml6ZXNMQT1mdW5jdGlvbigpewogcmVuZGVyUHJpemVzQmVmb3JlU2hhcmVWMTcoKTtjb25zdCByZXBvcnQ9Y3VycmVudFByaXplUmVwb3J0TEE7aWYoIXJlcG9ydClyZXR1cm47CiBjb25zdCBrcGlzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5rcGlzJyksY2hhcnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50IC5yZXBvcnRjaGFydHMnKTtpZigha3Bpc3x8IWNoYXJ0cylyZXR1cm47CiBrcGlzLmNsYXNzTGlzdC5hZGQoJ3ByaXplU3VtbWFyeVYxNycpOwogY29uc3QgcGVyaW9kcz1wcml6ZVBlcmlvZHNWMTcocmVwb3J0KTsKIGNoYXJ0cy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJyxgPHNlY3Rpb24gY2xhc3M9ImNhcmQiIGlkPSJwcml6ZVBlcmlvZHNWMTciPjxoMj5QZXLDrW9kb3MgeSBwcmVtaW9zIHBhZ2Fkb3M8L2gyPjxwIGNsYXNzPSJzdWJ0aXRsZSI+RmVjaGFzIGNvbiByZWdpc3Ryb3MgZGUgbGEgc2VsZWNjacOzbiBhY3R1YWwuIExvcyBwYWdvcyBwb3NpdGl2b3Mgc2UgbXVlc3RyYW4gc2VwYXJhZG9zIGRlIGxvcyBhanVzdGVzLjwvcD48ZGl2IGNsYXNzPSJ0YWJsZXdyYXAiPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5TZW1hbmE8L3RoPjx0aD5EZXNkZTwvdGg+PHRoPkhhc3RhPC90aD48dGg+VG90YWwgcGFnYWRvIHBvc2l0aXZvPC90aD48dGg+QWp1c3RlczwvdGg+PHRoPk5ldG88L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtwZXJpb2RzLm1hcChwPT5gPHRyPjx0ZD4ke2VzYyhwLmxhYmVsKX08L3RkPjx0ZD4ke2VzYyhkYXRlTGFiZWxTcGFuaXNoTEEocC5mcm9tKSl9PC90ZD48dGQ+JHtlc2MoZGF0ZUxhYmVsU3BhbmlzaExBKHAudG8pKX08L3RkPjx0ZD4ke2ZtdChwLnBhaWQsJ3ByaXplJyl9IENMUDwvdGQ+PHRkPiR7Zm10KHAuYWRqdXN0bWVudHMsJ3ByaXplJyl9IENMUDwvdGQ+PHRkPiR7Zm10KHAubmV0LCdwcml6ZScpfSBDTFA8L3RkPjwvdHI+YCkuam9pbignJyl8fCc8dHI+PHRkIGNvbHNwYW49IjYiPlNpbiByZWdpc3Ryb3MgcGFyYSBsYSBzZWxlY2Npw7NuLjwvdGQ+PC90cj4nfTwvdGJvZHk+PC90YWJsZT48L2Rpdj48ZGl2IGNsYXNzPSJ2aWV3Y29udHJvbHMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icHJpemVDb3B5VjE3Ij5Db3BpYXIgcmVzdW1lbiBjb21vIGltYWdlbjwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0icHJpemVEb3dubG9hZFYxNyI+RGVzY2FyZ2FyIHJlc3VtZW4gUE5HPC9idXR0b24+PHNwYW4gaWQ9InByaXplU2hhcmVTdGF0dXNWMTciIHJvbGU9InN0YXR1cyI+PC9zcGFuPjwvZGl2Pjwvc2VjdGlvbj5gKTsKIGNvbnN0IHNoYXJlPWFzeW5jIGNvcHk9Pntjb25zdCBzdGF0dXM9JCgnI3ByaXplU2hhcmVTdGF0dXNWMTcnKTt0cnl7c3RhdHVzLnRleHRDb250ZW50PSdQcmVwYXJhbmRvIGltYWdlbuKApic7Y29uc3QgYmxvYj1hd2FpdCBwcml6ZVNoYXJlQmxvYlYxNyhyZXBvcnQpO2lmKGNvcHkmJm5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlJiZ0eXBlb2YgQ2xpcGJvYXJkSXRlbSE9PSd1bmRlZmluZWQnKXt0cnl7YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbbmV3IENsaXBib2FyZEl0ZW0oeydpbWFnZS9wbmcnOmJsb2J9KV0pO3N0YXR1cy50ZXh0Q29udGVudD0nSW1hZ2VuIGNvcGlhZGEuIFB1ZWRlcyBwZWdhcmxhIGVuIHR1IG1lbnNhamUuJztyZXR1cm47fWNhdGNoKGUpe319ZG93bmxvYWRCbG9iVjgoYmxvYiwnRW5qb3ktcHJlbWlvcy0nKyhwZXJpb2RzWzBdPy5mcm9tfHwnc2VsZWNjaW9uJykrJy0nKyhwZXJpb2RzLmF0KC0xKT8udG98fCdhY3R1YWwnKSsnLnBuZycpO3N0YXR1cy50ZXh0Q29udGVudD1jb3B5PydTZSBkZXNjYXJnw7MgZWwgUE5HOyBlc3RlIG5hdmVnYWRvciBubyBwZXJtaXRpw7MgY29waWFybG8uJzonSW1hZ2VuIGRlc2NhcmdhZGEuJzt9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PSdObyBzZSBwdWRvIGdlbmVyYXIgbGEgaW1hZ2VuOiAnK2UubWVzc2FnZTt9fTsKICQoJyNwcml6ZUNvcHlWMTcnKS5vbmNsaWNrPSgpPT5zaGFyZSh0cnVlKTskKCcjcHJpemVEb3dubG9hZFYxNycpLm9uY2xpY2s9KCk9PnNoYXJlKGZhbHNlKTsKfTsKDQo=