//{"version":"3.8.7","encode":"base64"} dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIHNQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgbFA9KHYsbCk9Pntmb3IodmFyIGIgaW4gbClzUCh2LGIse2dldDpsW2JdLGVudW1lcmFibGU6ITB9KX07dmFyIHBzPU9iamVjdC5mcmVlemU7ZnVuY3Rpb24gRXUoe2dldEN1cnJlbnRQYWdlczp2LHVuaTpsLFVuaVNoYXJlZDpiLFZ1ZTpULFZ1ZVNoYXJlZDprfSl7dmFyIEM9ZnVuY3Rpb24oZCxtLFIsV2UpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBQdCgpe2xldCBKZT12KCksZHQ9SmUubGVuZ3RoO2lmKGR0KXJldHVybiBKZVtkdC0xXX1mdW5jdGlvbiBlbigpe2xldCBKZT1QdCgpO2lmKEplKXJldHVybiBKZS4kdm19ZnVuY3Rpb24gZ2UoSmUsZHQsU3Qpe2lmKFIuaXNTdHJpbmcoSmUpKVN0PWR0LGR0PUplLEplPWVuKCk7ZWxzZSBpZih0eXBlb2YgSmU9PSJudW1iZXIiKXtsZXQga249digpLmZpbmQoWnQ9Plp0LiRwYWdlLmlkPT09SmUpO2tuP0plPWtuLiR2bTpKZT1lbigpfWlmKCFKZSlyZXR1cm47aWYoSmUuX19jYWxsX2hvb2spcmV0dXJuIEplLl9fY2FsbF9ob29rKGR0LFN0KTtsZXQgdG49SmUuJFtkdF07cmV0dXJuIHRuJiZtLmludm9rZUFycmF5Rm5zKHRuLFN0KX1mdW5jdGlvbiBPKEplLGR0LFN0LHRuKXtSLmlzRnVuY3Rpb24oZHQpJiZXZS5pbmplY3RIb29rKEplLGR0LmJpbmQoU3QpLHRuKX1mdW5jdGlvbiBOdChKZSxkdCxTdCl7dmFyIHRuO2xldCBrbj1KZS5tcFR5cGV8fFN0LiRtcFR5cGU7aWYoISgha258fGtuPT09ImNvbXBvbmVudCIpJiYoT2JqZWN0LmtleXMoSmUpLmZvckVhY2goWnQ9PntpZihtLmlzVW5pTGlmZWN5Y2xlSG9vayhadCxKZVtadF0sITEpKXtsZXQgTG49SmVbWnRdO1IuaXNBcnJheShMbik/TG4uZm9yRWFjaChOcj0+TyhadCxOcixTdCxkdCkpOk8oWnQsTG4sU3QsZHQpfX0pLGtuPT09InBhZ2UiKSl7ZHQuX19pc1Zpc2libGU9ITA7dHJ5e2dlKFN0LG0uT05fTE9BRCxkdC5hdHRycy5fX3BhZ2VRdWVyeSksZGVsZXRlIGR0LmF0dHJzLl9fcGFnZVF1ZXJ5LCgodG49U3QuJHBhZ2UpPT09bnVsbHx8dG49PT12b2lkIDA/dm9pZCAwOnRuLm9wZW5UeXBlKSE9PSJwcmVsb2FkUGFnZSImJmdlKFN0LG0uT05fU0hPVyl9Y2F0Y2goWnQpe2NvbnNvbGUuZXJyb3IoWnQubWVzc2FnZSttLkxJTkVGRUVEK1p0LnN0YWNrKX19fWZ1bmN0aW9uIGpuKEplLGR0KXtfdChkdCxKZS4kcmVuZGVyanMsSmVbIiQiK20uUkVOREVSSlNfTU9EVUxFU10pfWZ1bmN0aW9uIF90KEplLGR0LFN0PXt9KXtpZighUi5pc0FycmF5KGR0KSlyZXR1cm47bGV0IHRuPUplLnVpZCxrbj1KZS4kd3hzTW9kdWxlc3x8KEplLiR3eHNNb2R1bGVzPVtdKSxadD1KZS5jdHg7ZHQuZm9yRWFjaChMbj0+e1N0W0xuXSYmKFp0W0xuXT1KKHRuLFN0W0xuXSxMbiksa24ucHVzaChMbikpfSl9ZnVuY3Rpb24gSihKZSxkdCxTdCl7bGV0IHRuPXt9O3JldHVybiBuZXcgUHJveHkodG4se2dldChrbixadCl7cmV0dXJuIHRuW1p0XXx8KHRuW1p0XT1yZShKZSxkdCxTdCxadCkpfX0pfWZ1bmN0aW9uIHJlKEplLGR0LFN0LHRuKXtsZXQga249KCk9Pnt9LFp0PSgpPT5tLldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbSmUsZHQsU3QrIi4iK3RuXSk7cmV0dXJuIG5ldyBQcm94eShrbix7Z2V0KExuLE5yKXtyZXR1cm4gTnI9PT0idG9KU09OIj9adDprbltOcl18fChrbltOcl09cmUoSmUsZHQsU3QrIi4iK3RuLE5yKSl9LGFwcGx5KExuLE5yLFVyKXtyZXR1cm4gbS5XWFNfUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoW0plLGR0LFN0KyIuIit0bixbLi4uVXJdXSl9fSl9ZnVuY3Rpb24gRG4oSmUsZHQpe190KGR0LEplLiR3eHMsSmVbIiQiK20uV1hTX01PRFVMRVNdKX1mdW5jdGlvbiBmbihKZSxkdCxTdCl7RG4oSmUsZHQpLGpuKEplLGR0KSxOdChKZSxkdCxTdCl9ZnVuY3Rpb24gS3QoSmUsZHQsU3Qpe3JldHVybiBKZVtkdF09U3R9ZnVuY3Rpb24gY24oSmUpe3JldHVybiBmdW5jdGlvbihTdCx0bixrbil7aWYoIXRuKXRocm93IFN0O2xldCBadD1KZS5faW5zdGFuY2U7aWYoIVp0fHwhWnQucHJveHkpdGhyb3cgU3Q7Z2UoWnQucHJveHksbS5PTl9FUlJPUixTdCl9fWZ1bmN0aW9uIElyKEplLGR0KXtyZXR1cm4gSmU/Wy4uLm5ldyBTZXQoW10uY29uY2F0KEplLGR0KSldOmR0fWZ1bmN0aW9uIHdpKEplKXttLlVuaUxpZmVjeWNsZUhvb2tzLmZvckVhY2goZHQ9PntKZVtkdF09SXJ9KX1sZXQgcW4saG49IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IixWdD0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO3R5cGVvZiBhdG9iIT0iZnVuY3Rpb24iP3FuPWZ1bmN0aW9uKEplKXtpZihKZT1TdHJpbmcoSmUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhVnQudGVzdChKZSkpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7SmUrPSI9PSIuc2xpY2UoMi0oSmUubGVuZ3RoJjMpKTtmb3IodmFyIGR0LFN0PSIiLHRuLGtuLFp0PTA7WnQ8SmUubGVuZ3RoOylkdD1obi5pbmRleE9mKEplLmNoYXJBdChadCsrKSk8PDE4fGhuLmluZGV4T2YoSmUuY2hhckF0KFp0KyspKTw8MTJ8KHRuPWhuLmluZGV4T2YoSmUuY2hhckF0KFp0KyspKSk8PDZ8KGtuPWhuLmluZGV4T2YoSmUuY2hhckF0KFp0KyspKSksU3QrPXRuPT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShkdD4+MTYmMjU1KTprbj09PTY0P1N0cmluZy5mcm9tQ2hhckNvZGUoZHQ+PjE2JjI1NSxkdD4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUoZHQ+PjE2JjI1NSxkdD4+OCYyNTUsZHQmMjU1KTtyZXR1cm4gU3R9OnFuPWF0b2I7ZnVuY3Rpb24gTm4oSmUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocW4oSmUpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oZHQpe3JldHVybiIlIisoIjAwIitkdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpfWZ1bmN0aW9uIHluKCl7bGV0IEplPWwuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixkdD1KZS5zcGxpdCgiLiIpO2lmKCFKZXx8ZHQubGVuZ3RoIT09MylyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTtsZXQgU3Q7dHJ5e1N0PUpTT04ucGFyc2UoTm4oZHRbMV0pKX1jYXRjaCh0bil7dGhyb3cgbmV3IEVycm9yKCJcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdTRGRTFcdTYwNkZcdTUxRkFcdTk1MTlcdUZGMENcdThCRTZcdTdFQzZcdTk1MTlcdThCRUZcdTRGRTFcdTYwNkZcdTRFM0FcdUZGMUEiK3RuLm1lc3NhZ2UpfXJldHVybiBTdC50b2tlbkV4cGlyZWQ9U3QuZXhwKjFlMyxkZWxldGUgU3QuZXhwLGRlbGV0ZSBTdC5pYXQsU3R9ZnVuY3Rpb24geG4oSmUpe0plLnVuaUlESGFzUm9sZT1mdW5jdGlvbihkdCl7bGV0e3JvbGU6U3R9PXluKCk7cmV0dXJuIFN0LmluZGV4T2YoZHQpPi0xfSxKZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZHQpe2xldHtwZXJtaXNzaW9uOlN0fT15bigpO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8U3QuaW5kZXhPZihkdCk+LTF9LEplLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe2xldHt0b2tlbkV4cGlyZWQ6ZHR9PXluKCk7cmV0dXJuIGR0PkRhdGUubm93KCl9fWZ1bmN0aW9uIFByKEplKXtsZXQgZHQ9SmUuX2NvbnRleHQuY29uZmlnO2R0LmVycm9ySGFuZGxlcj1tLmludm9rZUNyZWF0ZUVycm9ySGFuZGxlcihKZSxjbiksd2koZHQub3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtsZXQgU3Q9ZHQuZ2xvYmFsUHJvcGVydGllczt4bihTdCksU3QuJHNldD1LdCxTdC4kYXBwbHlPcHRpb25zPWZuLG0uaW52b2tlQ3JlYXRlVnVlQXBwSG9vayhKZSl9cmV0dXJuIGQuaW5pdEFwcD1QcixPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZH0oe30sYixrLFQpO3JldHVybiBDfWZ1bmN0aW9uIG9mKHYse252dWU6bCxVbmlTaGFyZWQ6YixWdWVTaGFyZWQ6VCxWdWVSZWFjdGl2aXR5Omt9KXtsZXQgQz17cGxhdGZvcm06bC5jb25maWcuZW52LnBsYXRmb3JtLFVuaVNoYXJlZDpiLFZ1ZVNoYXJlZDpULFZ1ZVJlYWN0aXZpdHk6a307cmV0dXJuIHYoQyxsLmRvY3VtZW50KX1mdW5jdGlvbiBjUCh7c2V0VGltZW91dDp2LGNsZWFyVGltZW91dDpsLHVuaTpiLGdldEN1cnJlbnRQYWdlczpULFZ1ZTprLHdlZXg6QyxwbHVzOmQsQnJvYWRjYXN0Q2hhbm5lbDptLFVuaVZpZXdKU0JyaWRnZTpSLFZ1ZVNoYXJlZDpXZSxVbmlTaGFyZWQ6UHQsX191bmlDb25maWc6ZW59KXt2YXIgZ2U9ZnVuY3Rpb24oTyxOdCxqbil7InVzZSBzdHJpY3QiO2xldCBfdD1bIm5hdmlnYXRlIiwicmVkaXJlY3QiLCJzd2l0Y2hUYWIiLCJyZUxhdW5jaCIsIm5hdmlnYXRlQmFjayJdLEo9WyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdLHJlPVsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0sRG49e2hvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LHVybDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sb3BlblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRlIix2YWxpZGF0b3IoeSl7cmV0dXJuIEJvb2xlYW4ofl90LmluZGV4T2YoeSkpfX0sZGVsdGE6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MX0saG92ZXJTdGFydFRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NjAwfSxleGlzdHM6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3IoeSl7cmV0dXJuIXl8fEouY29uY2F0KHJlKS5pbmNsdWRlcyh5KX19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjMwMH19O2Z1bmN0aW9uIGZuKHkpe3JldHVybigpPT57aWYoeS5vcGVuVHlwZSE9PSJuYXZpZ2F0ZUJhY2siJiYheS51cmwpe2NvbnNvbGUuZXJyb3IoIjxuYXZpZ2F0b3IvPiBzaG91bGQgaGF2ZSB1cmwgYXR0cmlidXRlIHdoZW4gdXNpbmcgbmF2aWdhdGVUbywgcmVkaXJlY3RUbywgcmVMYXVuY2ggb3Igc3dpdGNoVGFiIik7cmV0dXJufWxldCBNPXBhcnNlSW50KHkuYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaCh5Lm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjpiLm5hdmlnYXRlVG8oe3VybDp5LnVybCxhbmltYXRpb25UeXBlOnkuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246TX0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOmIucmVkaXJlY3RUbyh7dXJsOnkudXJsLGV4aXN0czp5LmV4aXN0c30pO2JyZWFrO2Nhc2Uic3dpdGNoVGFiIjpiLnN3aXRjaFRhYih7dXJsOnkudXJsfSk7YnJlYWs7Y2FzZSJyZUxhdW5jaCI6Yi5yZUxhdW5jaCh7dXJsOnkudXJsfSk7YnJlYWs7Y2FzZSJuYXZpZ2F0ZUJhY2siOmIubmF2aWdhdGVCYWNrKHtkZWx0YTp5LmRlbHRhLGFuaW1hdGlvblR5cGU6eS5hbmltYXRpb25UeXBlfHwicG9wLW91dCIsYW5pbWF0aW9uRHVyYXRpb246TX0pO2JyZWFrfX19ZnVuY3Rpb24gS3QoeSl7aWYoeS5ob3ZlckNsYXNzJiZ5LmhvdmVyQ2xhc3MhPT0ibm9uZSIpe2xldCBNPXtob3ZlckNsYXNzOnkuaG92ZXJDbGFzc307cmV0dXJuIE50Lmhhc093bih5LCJob3ZlclN0YXJ0VGltZSIpJiYoTS5ob3ZlclN0YXJ0VGltZT15LmhvdmVyU3RhcnRUaW1lKSxOdC5oYXNPd24oeSwiaG92ZXJTdGF5VGltZSIpJiYoTS5ob3ZlclN0YXlUaW1lPXkuaG92ZXJTdGF5VGltZSksTnQuaGFzT3duKHksImhvdmVyU3RvcFByb3BhZ2F0aW9uIikmJihNLmhvdmVyU3RvcFByb3BhZ2F0aW9uPXkuaG92ZXJTdG9wUHJvcGFnYXRpb24pLE19cmV0dXJue319ZnVuY3Rpb24gY24oeSxNKXtyZXR1cm4gTy5jcmVhdGVFbGVtZW50Vk5vZGUoInUtdGV4dCIsTnQuZXh0ZW5kKHthcHBlbmRBc1RyZWU6ITB9LE0pLHkpfWxldCBJcj1beyJuYXZpZ2F0b3ItaG92ZXIiOnsiIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuMSkiLG9wYWNpdHk6Ljd9fX1dLHdpPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJOYXZpZ2F0b3IiLHByb3BzOkRuLHN0eWxlczpJcixzZXR1cCh5LHtzbG90czpNfSl7bGV0IFc9Zm4oeSk7cmV0dXJuKCk9Pk8uY3JlYXRlVk5vZGUoInZpZXciLE8ubWVyZ2VQcm9wcyhLdCh5KSx7b25DbGljazpXfSksW00uZGVmYXVsdCYmTS5kZWZhdWx0KCldKX19KTtmdW5jdGlvbiBxbih5KXtyZXR1cm4gU3ltYm9sKHkpfWZ1bmN0aW9uIGhuKCl7bGV0IHk7dHJ5e3k9Ty5nZXRDdXJyZW50SW5zdGFuY2UoKS5yb290LnByb3h5LiRwYWdlLmlkfWNhdGNoKE0pe2xldCBXPWQud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkO3k9aXNOYU4oTnVtYmVyKFcpKT9XOk51bWJlcihXKX1yZXR1cm4geX1sZXQgVnQsTm4seW47ZnVuY3Rpb24geG4oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZ0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiPyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIFByKCl7cmV0dXJuIFZ0LndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH1sZXQgSmUsZHQsU3Q9e307ZnVuY3Rpb24gdG4oeSl7bGV0IE09eS5kYXRhJiZ5LmRhdGEuX19tZXNzYWdlO2lmKCFNfHwhTS5fX3BhZ2UpcmV0dXJuO2xldCBXPU0uX19wYWdlLEg9U3RbV107SCYmSChNKSxNLmtlZXB8fGRlbGV0ZSBTdFtXXX1mdW5jdGlvbiBrbih5LE0pe3huKCk9PT0idjgiP3luPyhKZSYmSmUuY2xvc2UoKSxKZT1uZXcgeW4oUHIoKSksSmUub25tZXNzYWdlPXRuKTpkdHx8KGR0PU5uLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IiksZHQuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLHRuKSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9dG4sU3RbeV09TX1jbGFzcyBadHtjb25zdHJ1Y3RvcihNKXt0aGlzLndlYnZpZXc9TX1zZW5kTWVzc2FnZShNKXtsZXQgVz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtfX21lc3NhZ2U6e2RhdGE6TX19KSksSD10aGlzLndlYnZpZXcuaWQ7eW4/bmV3IHluKEgpLnBvc3RNZXNzYWdlKFcpOlZ0LndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3JiZWdC53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyhXLEgpfWNsb3NlKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9fWZ1bmN0aW9uIExuKHtjb250ZXh0Onk9e30sdXJsOk0sZGF0YTpXPXt9LHN0eWxlOkg9e30sb25NZXNzYWdlOlEsb25DbG9zZTp0ZX0pe2xldCBmZT1lbi5kYXJrbW9kZTtWdD15LnBsdXN8fGQsTm49eS53ZWV4fHwodHlwZW9mIEM9PSJvYmplY3QiP0M6bnVsbCkseW49eS5Ccm9hZGNhc3RDaGFubmVsfHwodHlwZW9mIG09PSJvYmplY3QiP206bnVsbCk7bGV0IHBlPXthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxDZT1gcGFnZSR7RGF0ZS5ub3coKX1gO0g9TnQuZXh0ZW5kKHt9LEgpLEgudGl0bGVOVmlldyE9PSExJiZILnRpdGxlTlZpZXchPT0ibm9uZSImJihILnRpdGxlTlZpZXc9TnQuZXh0ZW5kKHBlLEgudGl0bGVOVmlldykpO2xldCBCZT17dG9wOjAsYm90dG9tOjAsdXNpbmdDb21wb25lbnRzOnt9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUiLGFuaW1hdGlvblR5cGU6InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246MjAwLHVuaU5WaWV3OntwYXRoOmAvJHtNfS5qc2AsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OlZ0LnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtIPU50LmV4dGVuZChCZSxIKTtsZXQgU2U9VnQud2Vidmlldy5jcmVhdGUoIiIsQ2UsSCx7ZXh0cmFzOntmcm9tOlByKCkscnVudGltZTp4bigpLGRhdGE6TnQuZXh0ZW5kKHt9LFcse2Rhcmttb2RlOmZlfSksdXNlR2xvYmFsRXZlbnQ6IXlufX0pO3JldHVybiBTZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsdGUpLGtuKENlLGplPT57TnQuaXNGdW5jdGlvbihRKSYmUShqZS5kYXRhKSxqZS5rZWVwfHxTZS5jbG9zZSgiYXV0byIpfSksU2Uuc2hvdyhILmFuaW1hdGlvblR5cGUsSC5hbmltYXRpb25EdXJhdGlvbiksbmV3IFp0KFNlKX1sZXQgTnI9e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFVyPXFuKCJ1bCIpO2Z1bmN0aW9uIEZpKCl7bGV0IHk9W107cmV0dXJuIE8ucHJvdmlkZShVcix7YWRkSGFuZGxlcihNKXt5LnB1c2goTSl9LHJlbW92ZUhhbmRsZXIoTSl7eS5zcGxpY2UoeS5pbmRleE9mKE0pLDEpfX0pLHl9bGV0IGxyPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJMYWJlbCIscHJvcHM6TnIsc3R5bGVzOltdLHNldHVwKHkse3Nsb3RzOk19KXtsZXQgVz1obigpLEg9RmkoKSxRPXRlPT57eS5mb3I/Ui5lbWl0KGB1bmktbGFiZWwtY2xpY2stJHtXfS0ke3kuZm9yfWAsdGUsITApOkgubGVuZ3RoJiZIWzBdKHRlLCEwKX07cmV0dXJuKCk9Pk8uY3JlYXRlVk5vZGUoInZpZXciLHtvbkNsaWNrOlF9LFtNLmRlZmF1bHQmJk0uZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gRXIoeSxNKXtWaSh5LmlkLE0pLE8ud2F0Y2goKCk9PnkuaWQsKFcsSCk9PntHbyhILE0sITApLFZpKFcsTSwhMCl9KSxPLm9uVW5tb3VudGVkKCgpPT57R28oeS5pZCxNKX0pfWZ1bmN0aW9uIFZpKHksTSxXKXtsZXQgSD1obigpO1cmJiF5fHwhTnQuaXNQbGFpbk9iamVjdChNKXx8T2JqZWN0LmtleXMoTSkuZm9yRWFjaChRPT57Vz9RLmluZGV4T2YoIkAiKSE9PTAmJlEuaW5kZXhPZigidW5pLSIpIT09MCYmUi5vbihgdW5pLSR7UX0tJHtIfS0ke3l9YCxNW1FdKTpRLmluZGV4T2YoInVuaS0iKT09PTA/Ui5vbihRLE1bUV0pOnkmJlIub24oYHVuaS0ke1F9LSR7SH0tJHt5fWAsTVtRXSl9KX1mdW5jdGlvbiBHbyh5LE0sVyl7bGV0IEg9aG4oKTtXJiYheXx8IU50LmlzUGxhaW5PYmplY3QoTSl8fE9iamVjdC5rZXlzKE0pLmZvckVhY2goUT0+e1c/US5pbmRleE9mKCJAIikhPT0wJiZRLmluZGV4T2YoInVuaS0iKSE9PTAmJlIub2ZmKGB1bmktJHtRfS0ke0h9LSR7eX1gLE1bUV0pOlEuaW5kZXhPZigidW5pLSIpPT09MD9SLm9mZihRLE1bUV0pOnkmJlIub2ZmKGB1bmktJHtRfS0ke0h9LSR7eX1gLE1bUV0pfSl9ZnVuY3Rpb24gWW8oeSl7cmV0dXJuIE9iamVjdC5rZXlzKHkpLm1hcChNPT5bTSx5W01dXSl9bGV0IGtyPVsiY2xhc3MiLCJzdHlsZSJdLFJyPS9eb25bQS1aXSsvLHhyPSh5PXt9KT0+e2xldHtleGNsdWRlTGlzdGVuZXJzOk09ITEsZXhjbHVkZUtleXM6Vz1bXX09eSxIPU8uZ2V0Q3VycmVudEluc3RhbmNlKCksUT1PLnNoYWxsb3dSZWYoe30pLHRlPU8uc2hhbGxvd1JlZih7fSksZmU9Ty5zaGFsbG93UmVmKHt9KSxwZT1XLmNvbmNhdChrcik7cmV0dXJuIEguYXR0cnM9Ty5yZWFjdGl2ZShILmF0dHJzKSxPLndhdGNoRWZmZWN0KCgpPT57bGV0IENlPVlvKEguYXR0cnMpLnJlZHVjZSgoQmUsW1NlLGplXSk9PihwZS5pbmNsdWRlcyhTZSk/QmUuZXhjbHVkZVtTZV09amU6UnIudGVzdChTZSk/KE18fChCZS5hdHRyc1tTZV09amUpLEJlLmxpc3RlbmVyc1tTZV09amUpOkJlLmF0dHJzW1NlXT1qZSxCZSkse2V4Y2x1ZGU6e30sYXR0cnM6e30sbGlzdGVuZXJzOnt9fSk7US52YWx1ZT1DZS5hdHRycyx0ZS52YWx1ZT1DZS5saXN0ZW5lcnMsZmUudmFsdWU9Q2UuZXhjbHVkZX0pLHskYXR0cnM6USwkbGlzdGVuZXJzOnRlLCRleGNsdWRlQXR0cnM6ZmV9fSxVaT17aWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJ1dHRvbi1ob3ZlciJ9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjcwfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxsb2FkaW5nOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0scGxhaW46e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sWXI9cW4oInVmIiksVGE9W3t1Yjp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLHBhZGRpbmdMZWZ0OiI1IixwYWRkaW5nUmlnaHQ6IjUiLG92ZXJmbG93OiJoaWRkZW4iLGNvbG9yOiIjMDAwMDAwIixiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgiLGJvcmRlclJhZGl1czoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkYmRiZGIifX0sInViLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAiLGZvbnRTaXplOiIxOCIsdGV4dERlY29yYXRpb246Im5vbmUiLGxpbmVIZWlnaHQ6IjQ2In19LCJ1Yi1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9fSwidWItcCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYiLGJvcmRlckNvbG9yOiIjMDA2MmNjIn19LCJ1Yi13Ijp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2U2NDM0MCIsYm9yZGVyQ29sb3I6IiNiODM2MzMifX0sInViLWQtdCI6eyIiOntjb2xvcjoiIzAwMDAwMCJ9fSwidWItcC10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi13LXQiOnsiIjp7Y29sb3I6IiNmZmZmZmYifX0sInViLWQtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifX0sInViLXAtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiM2M2FjZmMiLGJvcmRlckNvbG9yOiIjNGY4YWNhIn19LCJ1Yi13LWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZWM4Yjg5Iixib3JkZXJDb2xvcjoiI2JkNmY2ZSJ9fSwidWItZC10LWQiOnsiIjp7Y29sb3I6IiNjY2NjY2MifX0sInViLXAtdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLXctdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzM1MzUzNSJ9fSwidWItcC10LXBsYWluIjp7IiI6e2NvbG9yOiIjMDA3YWZmIn19LCJ1Yi13LXQtcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAifX0sInViLWQtZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXAtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXctdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLW1pbmkiOnsiIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In19LCJ1Yi1sb2FkaW5nIjp7IiI6e3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsbWFyZ2luUmlnaHQ6IjEwIn19LCJ1Yi1kLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtbG9hZGluZy1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn19LCJ1Yi13LWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2RlZGVkZSJ9fSwidWItcC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2NlM2MzOSJ9fSwidWItZC10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNikifX0sInViLXAtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItZC1ob3Zlci1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixib3JkZXJDb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX19XSwkaT17ZGVmYXVsdDoiZCIscHJpbWFyeToicCIsd2FybjoidyJ9LG1vPU8uZGVmaW5lQ29tcG9uZW50KHtpbmhlcml0QXR0cnM6ITEsbmFtZToiQnV0dG9uIixwcm9wczpOdC5leHRlbmQoVWkse3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxzaXplOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In19KSxzdHlsZXM6VGEsc2V0dXAoeSx7c2xvdHM6TSxhdHRyczpXfSl7bGV0eyRhdHRyczpILCRleGNsdWRlQXR0cnM6USwkbGlzdGVuZXJzOnRlfT14cih7ZXhjbHVkZUxpc3RlbmVyczohMH0pLGZlPXkudHlwZSxwZT1PLnJlZihudWxsKSxDZT1PLmluamVjdChZciwhMSksQmU9KEV0LEtlKT0+e2xldCBNdD10ZS52YWx1ZS5vbkNsaWNrfHwoKCk9Pnt9KTtpZih5LmRpc2FibGVkKXJldHVybjtNdChFdCk7bGV0IF9uPXkuZm9ybVR5cGU7aWYoX24pe2lmKCFDZSlyZXR1cm47X249PT0ic3VibWl0Ij9DZS5zdWJtaXQoRXQpOl9uPT09InJlc2V0IiYmQ2UucmVzZXQoRXQpfX0sU2U9RXQ9PntsZXQgS2U9InViLSIrJGlbZmVdK0V0O3JldHVybiB5LmRpc2FibGVkJiYoS2UrPSItZCIpLHkucGxhaW4mJihLZSs9Ii1wbGFpbiIpLHkuc2l6ZT09PSJtaW5pIiYmRXQ9PT0iLXQiJiYoS2UrPSIgdWItbWluaSIpLEtlfSxqZT1FdD0+e2lmKHkuZGlzYWJsZWQpcmV0dXJuIiI7bGV0IEtlPSJ1Yi0iKyRpW2ZlXStFdCsiLWhvdmVyIjtyZXR1cm4geS5wbGFpbiYmKEtlKz0iLXBsYWluIiksS2V9LGJ0PU8uaW5qZWN0KFVyLCExKTtidCYmKGJ0LmFkZEhhbmRsZXIoQmUpLE8ub25CZWZvcmVVbm1vdW50KCgpPT57YnQucmVtb3ZlSGFuZGxlcihCZSl9KSksRXIoeSx7ImxhYmVsLWNsaWNrIjpCZX0pO2xldCBDdD1PLmNvbXB1dGVkKCgpPT57bGV0IEV0PXt9O2ZvcihsZXQgS2UgaW4gdGUudmFsdWUpe2xldCBNdD10ZS52YWx1ZVtLZV07S2UhPT0ib25DbGljayImJihFdFtLZV09TXQpfXJldHVybiBFdH0pLFd0PSgpPT57aWYoIU0uZGVmYXVsdClyZXR1cm5bXTtsZXQgRXQ9TS5kZWZhdWx0KCk7cmV0dXJuIEV0Lmxlbmd0aD09PTEmJkV0WzBdLnR5cGU9PT1PLlRleHQ/W2NuKEV0WzBdLmNoaWxkcmVuLHtjbGFzczoidWItdCAiK1NlKCItdCIpfSldOkV0fTtyZXR1cm4oKT0+e2xldCBFdD1OdC5leHRlbmQoe30sS3QoeSkse2hvdmVyQ2xhc3M6amUoIiIpfSxILnZhbHVlLFEudmFsdWUsQ3QudmFsdWUpO3JldHVybiBPLmNyZWF0ZVZOb2RlKCJ2aWV3IixPLm1lcmdlUHJvcHMoe3JlZjpwZSxjbGFzczpbInViIixTZSgiIildLG9uQ2xpY2s6QmV9LEV0KSxbeS5sb2FkaW5nP08uY3JlYXRlVk5vZGUoImxvYWRpbmctaW5kaWNhdG9yIixPLm1lcmdlUHJvcHMoe2NsYXNzOlsidWItbG9hZGluZyIsYHViLSR7JGlbZmVdfS1sb2FkaW5nYF19LHthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9KSxudWxsKTpudWxsLC4uLld0KCldKX19fSksSWE9e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fTtmdW5jdGlvbiBubyh5KXtsZXQgTT1bXTtyZXR1cm4gTnQuaXNBcnJheSh5KSYmeS5mb3JFYWNoKFc9PntPLmlzVk5vZGUoVyk/Vy50eXBlPT09Ty5GcmFnbWVudD9NLnB1c2goLi4ubm8oVy5jaGlsZHJlbikpOk0ucHVzaChXKTpOdC5pc0FycmF5KFcpJiZNLnB1c2goLi4ubm8oVykpfSksTX1mdW5jdGlvbiBxbyh5KXtsZXQgTT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihIKXtyZXR1cm4gTVtIXXx8KE1bSF09eShIKSl9fWxldCBzaT1xbyhmdW5jdGlvbih5KXtsZXQgTT17fSxXPS87KD8hW14oXSpcKSkvZyxIPS86KC4rKS87cmV0dXJuIHkuc3BsaXQoVykuZm9yRWFjaChmdW5jdGlvbihRKXtpZihRKXtsZXQgdGU9US5zcGxpdChIKTt0ZS5sZW5ndGg+MSYmKE1bdGVbMF0udHJpbSgpXT10ZVsxXS50cmltKCkpfX0pLE19KSxQbj15PT5uZXcgUHJvbWlzZSgoTSxXKT0+e2lmKCF5KXJldHVybiBNKHt3aWR0aDowLGhlaWdodDowLHRvcDowLGxlZnQ6MH0pO0MucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh5LCh7c2l6ZTpRfSk9PntNKFEpfSl9KSxjcj1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTW92YWJsZUFyZWEiLHByb3BzOklhLHN0eWxlczpbeyJ1bmktbW92YWJsZS1hcmVhIjp7IiI6e292ZXJmbG93OiJoaWRkZW4iLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19XSxzZXR1cCh5LHtzbG90czpNfSl7bGV0IFc9Ty5yZWYoMCksSD1PLnJlZigwKSxRPU8ucmVmKDApLHRlPU8ucmVmKDApLGZlPU8ucmVmKCExKSxwZT1PLnJlZihudWxsKSxDZT1bXSxCZT1udWxsLFNlPUtlPT57QmU9S2V9LGplPSgpPT5QbihwZS52YWx1ZSkudGhlbigoe3dpZHRoOktlLGhlaWdodDpNdCx0b3A6X24sbGVmdDp3bn0pPT57Vy52YWx1ZT1LZSxILnZhbHVlPU10LFEudmFsdWU9X24sdGUudmFsdWU9d259KSxidD0oKT0+e2plKCkudGhlbigoKT0+e0NlLmZvckVhY2goZnVuY3Rpb24oS2Upe0tlLnNldFBhcmVudCgpfSl9KX07Ty5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57ZmUudmFsdWU9ITAsYnQoKX0sMjAwKX0pO2xldCBDdD17b25QYW5zdGFydChLZSl7QmUmJkJlLnRvdWNoc3RhcnQoS2UpfSxvblBhbm1vdmUoS2Upe0tlLnN0b3BQcm9wYWdhdGlvbigpLEJlJiZCZS50b3VjaG1vdmUoS2UpfSxvblBhbmVuZChLZSl7QmUmJkJlLnRvdWNoZW5kKEtlKSxCZT1udWxsfX0sV3Q9S2U9PntDZS5wdXNoKEtlKX0sRXQ9S2U9PntsZXQgTXQ9Q2UuaW5kZXhPZihLZSk7TXQ+PTAmJkNlLnNwbGljZShNdCwxKX07cmV0dXJuIE8ucHJvdmlkZSgiX2lzTW91bnRlZCIsZmUpLE8ucHJvdmlkZSgicGFyZW50U2l6ZSIse3dpZHRoOlcsaGVpZ2h0OkgsdG9wOlEsbGVmdDp0ZX0pLE8ucHJvdmlkZSgiYWRkTW92YWJsZVZpZXdDb250ZXh0IixXdCksTy5wcm92aWRlKCJyZW1vdmVNb3ZhYmxlVmlld0NvbnRleHQiLEV0KSxPLnByb3ZpZGUoInNldFRvdWNoTW92YWJsZVZpZXdDb250ZXh0IixTZSksKCk9PntsZXQgS2U9TS5kZWZhdWx0JiZNLmRlZmF1bHQoKSxNdD1ubyhLZSk7cmV0dXJuIE8uY3JlYXRlVk5vZGUoInZpZXciLE8ubWVyZ2VQcm9wcyh7cmVmOnBlLGNsYXNzOiJ1bmktbW92YWJsZS1hcmVhIn0sQ3QpLFtNdF0pfX19KTtmdW5jdGlvbiBsaSh5KXtsZXQgTT17fTtmdW5jdGlvbiBXKFNlLGplKXtNW1NlXSYmTVtTZV0oamUpfWZ1bmN0aW9uIEgoU2UsamUpe01bU2VdPWZ1bmN0aW9uKGJ0KXtOdC5pc0Z1bmN0aW9uKGplKSYmKGJ0LnRvdWNoZXM9YnQuY2hhbmdlZFRvdWNoZXMsamUoYnQpPT09ITEmJmJ0LnN0b3BQcm9wYWdhdGlvbigpKX19bGV0IFE9MCx0ZT0wLGZlPTAscGU9MCxDZT1mdW5jdGlvbihTZSxqZSxidCxDdCl7aWYoeSh7dGFyZ2V0OlNlLnRhcmdldCxjdXJyZW50VGFyZ2V0OlNlLmN1cnJlbnRUYXJnZXQsc3RvcFByb3BhZ2F0aW9uOlNlLnN0b3BQcm9wYWdhdGlvbi5iaW5kKFNlKSx0b3VjaGVzOlNlLnRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6U2UuY2hhbmdlZFRvdWNoZXMsZGV0YWlsOntzdGF0ZTpqZSx4OmJ0LHk6Q3QsZHg6YnQtUSxkeTpDdC10ZSxkZHg6YnQtZmUsZGR5OkN0LXBlLHRpbWVTdGFtcDpTZS50aW1lU3RhbXB8fERhdGUubm93KCl9fSk9PT0hMSlyZXR1cm4hMX0sQmU9bnVsbDtyZXR1cm4gSCgidG91Y2hzdGFydCIsZnVuY3Rpb24oU2Upe2lmKCFCZSlyZXR1cm4gQmU9U2UsUT1mZT1TZS50b3VjaGVzWzBdLnBhZ2VYLHRlPXBlPVNlLnRvdWNoZXNbMF0ucGFnZVksQ2UoU2UsInN0YXJ0IixRLHRlKX0pLEgoInRvdWNobW92ZSIsZnVuY3Rpb24oU2Upe2lmKEJlKXtsZXQgamU9Q2UoU2UsIm1vdmUiLFNlLnRvdWNoZXNbMF0ucGFnZVgsU2UudG91Y2hlc1swXS5wYWdlWSk7cmV0dXJuIGZlPVNlLnRvdWNoZXNbMF0ucGFnZVgscGU9U2UudG91Y2hlc1swXS5wYWdlWSxqZX19KSxIKCJ0b3VjaGVuZCIsZnVuY3Rpb24oU2Upe2lmKEJlKXJldHVybiBCZT1udWxsLENlKFNlLCJlbmQiLFNlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLFNlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZKX0pLHt0b3VjaHN0YXJ0OmZ1bmN0aW9uKFNlKXtXKCJ0b3VjaHN0YXJ0IixTZSl9LHRvdWNobW92ZTpmdW5jdGlvbihTZSl7VygidG91Y2htb3ZlIixTZSl9LHRvdWNoZW5kOmZ1bmN0aW9uKFNlKXtXKCJ0b3VjaGVuZCIsU2UpfX19ZnVuY3Rpb24gSm4oeSxNKXtyZXR1cm4oVyxIKT0+e3kudmFsdWUmJk0oVyxKbyhXLHkudmFsdWUsSHx8e30pKX19ZnVuY3Rpb24gSm8oeSxNLFc9e30pe3JldHVybiBNPXJvKE0pLHt0eXBlOnksdGltZVN0YW1wOkRhdGUubm93KCksdGFyZ2V0Ok0sY3VycmVudFRhcmdldDpNLGRldGFpbDpXfX1sZXQgeG89am4uY2FjaGVTdHJpbmdGdW5jdGlvbih5PT55LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK3kuc2xpY2UoMSkpO2Z1bmN0aW9uIHJvKHkpe2xldHtvZmZzZXRMZWZ0Ok0sb2Zmc2V0VG9wOld9PXksSD15LmF0dHIsUT17fTtyZXR1cm4gT2JqZWN0LmtleXMoSHx8e30pLmZvckVhY2godGU9Pnt0ZS5pbmRleE9mKCJkYXRhIik9PT0wJiYoUVt4byh0ZS5yZXBsYWNlKCJkYXRhIiwiIikpXT1IW3RlXSl9KSx7aWQ6SCYmSC5pZHx8IiIsZGF0YXNldDpRLG9mZnNldExlZnQ6TXx8MCxvZmZzZXRUb3A6V3x8MH19ZnVuY3Rpb24gaW8oeSxNLFcpe3JldHVybiB5Pk0tVyYmeTxNK1d9ZnVuY3Rpb24gcXIoeSxNKXtyZXR1cm4gaW8oeSwwLE0pfWZ1bmN0aW9uIG9vKCl7fW9vLnByb3RvdHlwZS54PWZ1bmN0aW9uKHkpe3JldHVybiBNYXRoLnNxcnQoeSl9O2Z1bmN0aW9uIEZuKHksTSl7dGhpcy5fbT15LHRoaXMuX2Y9MWUzKk0sdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fdj0wfUZuLnByb3RvdHlwZS5zZXRWPWZ1bmN0aW9uKHksTSl7bGV0IFc9TWF0aC5wb3coTWF0aC5wb3coeSwyKStNYXRoLnBvdyhNLDIpLC41KTt0aGlzLl94X3Y9eSx0aGlzLl95X3Y9TSx0aGlzLl94X2E9LXRoaXMuX2YqdGhpcy5feF92L1csdGhpcy5feV9hPS10aGlzLl9mKnRoaXMuX3lfdi9XLHRoaXMuX3Q9TWF0aC5hYnMoeS90aGlzLl94X2EpfHxNYXRoLmFicyhNL3RoaXMuX3lfYSksdGhpcy5fbGFzdER0PW51bGwsdGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpfSxGbi5wcm90b3R5cGUuc2V0Uz1mdW5jdGlvbih5LE0pe3RoaXMuX3hfcz15LHRoaXMuX3lfcz1NfSxGbi5wcm90b3R5cGUucz1mdW5jdGlvbih5KXt5PT09dm9pZCAwJiYoeT0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHk+dGhpcy5fdCYmKHk9dGhpcy5fdCx0aGlzLl9sYXN0RHQ9eSk7bGV0IE09dGhpcy5feF92KnkrLjUqdGhpcy5feF9hKk1hdGgucG93KHksMikrdGhpcy5feF9zLFc9dGhpcy5feV92KnkrLjUqdGhpcy5feV9hKk1hdGgucG93KHksMikrdGhpcy5feV9zO3JldHVybih0aGlzLl94X2E+MCYmTTx0aGlzLl9lbmRQb3NpdGlvblh8fHRoaXMuX3hfYTwwJiZNPnRoaXMuX2VuZFBvc2l0aW9uWCkmJihNPXRoaXMuX2VuZFBvc2l0aW9uWCksKHRoaXMuX3lfYT4wJiZXPHRoaXMuX2VuZFBvc2l0aW9uWXx8dGhpcy5feV9hPDAmJlc+dGhpcy5fZW5kUG9zaXRpb25ZKSYmKFc9dGhpcy5fZW5kUG9zaXRpb25ZKSx7eDpNLHk6V319LEZuLnByb3RvdHlwZS5kcz1mdW5jdGlvbih5KXtyZXR1cm4geT09PXZvaWQgMCYmKHk9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx5PnRoaXMuX3QmJih5PXRoaXMuX3QpLHtkeDp0aGlzLl94X3YrdGhpcy5feF9hKnksZHk6dGhpcy5feV92K3RoaXMuX3lfYSp5fX0sRm4ucHJvdG90eXBlLmRlbHRhPWZ1bmN0aW9uKCl7cmV0dXJue3g6LTEuNSpNYXRoLnBvdyh0aGlzLl94X3YsMikvdGhpcy5feF9hfHwwLHk6LTEuNSpNYXRoLnBvdyh0aGlzLl95X3YsMikvdGhpcy5feV9hfHwwfX0sRm4ucHJvdG90eXBlLmR0PWZ1bmN0aW9uKCl7cmV0dXJuLXRoaXMuX3hfdi90aGlzLl94X2F9LEZuLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7bGV0IHk9aW8odGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxpbyh0aGlzLnMoKS55LHRoaXMuX2VuZFBvc2l0aW9uWSl8fHRoaXMuX2xhc3REdD09PXRoaXMuX3Q7cmV0dXJuIHRoaXMuX2xhc3REdD1udWxsLHl9LEZuLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oeSxNKXt0aGlzLl9lbmRQb3NpdGlvblg9eSx0aGlzLl9lbmRQb3NpdGlvblk9TX0sRm4ucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKHksTSl7dGhpcy5fbT15LHRoaXMuX2Y9MWUzKk19O2Z1bmN0aW9uIHdyKHksTSxXKXt0aGlzLl9tPXksdGhpcy5faz1NLHRoaXMuX2M9Vyx0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9d3IucHJvdG90eXBlLl9zb2x2ZT1mdW5jdGlvbih5LE0pe2xldCBXPXRoaXMuX2MsSD10aGlzLl9tLFE9dGhpcy5fayx0ZT1XKlctNCpIKlE7aWYodGU9PT0wKXtsZXQgU2U9LVcvKDIqSCksamU9eSxidD1NLyhTZSp5KTtyZXR1cm57eDpmdW5jdGlvbihDdCl7cmV0dXJuKGplK2J0KkN0KSpNYXRoLnBvdyhNYXRoLkUsU2UqQ3QpfSxkeDpmdW5jdGlvbihDdCl7bGV0IFd0PU1hdGgucG93KE1hdGguRSxTZSpDdCk7cmV0dXJuIFNlKihqZStidCpDdCkqV3QrYnQqV3R9fX1pZih0ZT4wKXtsZXQgU2U9KC1XLU1hdGguc3FydCh0ZSkpLygyKkgpLGplPSgtVytNYXRoLnNxcnQodGUpKS8oMipIKSxidD0oTS1TZSp5KS8oamUtU2UpLEN0PXktYnQ7cmV0dXJue3g6ZnVuY3Rpb24oV3Qpe2xldCBFdCxLZTtyZXR1cm4gV3Q9PT10aGlzLl90JiYoRXQ9dGhpcy5fcG93RVIxVCxLZT10aGlzLl9wb3dFUjJUKSx0aGlzLl90PVd0LEV0fHwoRXQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsU2UqV3QpKSxLZXx8KEtlPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLGplKld0KSksQ3QqRXQrYnQqS2V9LGR4OmZ1bmN0aW9uKFd0KXtsZXQgRXQsS2U7cmV0dXJuIFd0PT09dGhpcy5fdCYmKEV0PXRoaXMuX3Bvd0VSMVQsS2U9dGhpcy5fcG93RVIyVCksdGhpcy5fdD1XdCxFdHx8KEV0PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLFNlKld0KSksS2V8fChLZT10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxqZSpXdCkpLEN0KlNlKkV0K2J0KmplKktlfX19bGV0IGZlPU1hdGguc3FydCg0KkgqUS1XKlcpLygyKkgpLHBlPS1XLzIqSCxDZT15LEJlPShNLXBlKnkpL2ZlO3JldHVybnt4OmZ1bmN0aW9uKFNlKXtyZXR1cm4gTWF0aC5wb3coTWF0aC5FLHBlKlNlKSooQ2UqTWF0aC5jb3MoZmUqU2UpK0JlKk1hdGguc2luKGZlKlNlKSl9LGR4OmZ1bmN0aW9uKFNlKXtsZXQgamU9TWF0aC5wb3coTWF0aC5FLHBlKlNlKSxidD1NYXRoLmNvcyhmZSpTZSksQ3Q9TWF0aC5zaW4oZmUqU2UpO3JldHVybiBqZSooQmUqZmUqYnQtQ2UqZmUqQ3QpK3BlKmplKihCZSpDdCtDZSpidCl9fX0sd3IucHJvdG90eXBlLng9ZnVuY3Rpb24oeSl7cmV0dXJuIHk9PT12b2lkIDAmJih5PShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fZW5kUG9zaXRpb24rdGhpcy5fc29sdXRpb24ueCh5KTowfSx3ci5wcm90b3R5cGUuZHg9ZnVuY3Rpb24oeSl7cmV0dXJuIHk9PT12b2lkIDAmJih5PShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fc29sdXRpb24uZHgoeSk6MH0sd3IucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbih5LE0sVyl7aWYoV3x8KFc9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHkhPT10aGlzLl9lbmRQb3NpdGlvbnx8IXFyKE0sLjEpKXtNPU18fDA7bGV0IEg9dGhpcy5fZW5kUG9zaXRpb247dGhpcy5fc29sdXRpb24mJihxcihNLC4xKSYmKE09dGhpcy5fc29sdXRpb24uZHgoKFctdGhpcy5fc3RhcnRUaW1lKS8xZTMpKSxIPXRoaXMuX3NvbHV0aW9uLngoKFctdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHFyKE0sLjEpJiYoTT0wKSxxcihILC4xKSYmKEg9MCksSCs9dGhpcy5fZW5kUG9zaXRpb24pLHRoaXMuX3NvbHV0aW9uJiZxcihILXksLjEpJiZxcihNLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPXksdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoSC10aGlzLl9lbmRQb3NpdGlvbixNKSx0aGlzLl9zdGFydFRpbWU9Vyl9fSx3ci5wcm90b3R5cGUuc25hcD1mdW5jdGlvbih5KXt0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCksdGhpcy5fZW5kUG9zaXRpb249eSx0aGlzLl9zb2x1dGlvbj17eDpmdW5jdGlvbigpe3JldHVybiAwfSxkeDpmdW5jdGlvbigpe3JldHVybiAwfX19LHdyLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKHkpe3JldHVybiB5fHwoeT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksaW8odGhpcy54KCksdGhpcy5fZW5kUG9zaXRpb24sLjEpJiZxcih0aGlzLmR4KCksLjEpfSx3ci5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oeSxNLFcpe3RoaXMuX209eSx0aGlzLl9rPU0sdGhpcy5fYz1XLHRoaXMuZG9uZSgpfHwodGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUodGhpcy54KCktdGhpcy5fZW5kUG9zaXRpb24sdGhpcy5keCgpKSx0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCkpfSx3ci5wcm90b3R5cGUuc3ByaW5nQ29uc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30sd3IucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sd3IucHJvdG90eXBlLmNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiB5KFcsSCl7Vy5yZWNvbmZpZ3VyZSgxLEgsVy5kYW1waW5nKCkpfWZ1bmN0aW9uIE0oVyxIKXtXLnJlY29uZmlndXJlKDEsVy5zcHJpbmdDb25zdGFudCgpLEgpfXJldHVyblt7bGFiZWw6IlNwcmluZyBDb25zdGFudCIscmVhZDp0aGlzLnNwcmluZ0NvbnN0YW50LmJpbmQodGhpcyksd3JpdGU6eS5iaW5kKHRoaXMsdGhpcyksbWluOjEwMCxtYXg6MWUzfSx7bGFiZWw6IkRhbXBpbmciLHJlYWQ6dGhpcy5kYW1waW5nLmJpbmQodGhpcyksd3JpdGU6TS5iaW5kKHRoaXMsdGhpcyksbWluOjEsbWF4OjUwMH1dfTtmdW5jdGlvbiBjaSh5LE0sVyl7dGhpcy5fc3ByaW5nWD1uZXcgd3IoeSxNLFcpLHRoaXMuX3NwcmluZ1k9bmV3IHdyKHksTSxXKSx0aGlzLl9zcHJpbmdTY2FsZT1uZXcgd3IoeSxNLFcpLHRoaXMuX3N0YXJ0VGltZT0wfWNpLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oeSxNLFcsSCl7bGV0IFE9bmV3IERhdGUoKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoeSxILFEpLHRoaXMuX3NwcmluZ1kuc2V0RW5kKE0sSCxRKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQoVyxILFEpLHRoaXMuX3N0YXJ0VGltZT1RfSxjaS5wcm90b3R5cGUueD1mdW5jdGlvbigpe2xldCB5PShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMztyZXR1cm57eDp0aGlzLl9zcHJpbmdYLngoeSkseTp0aGlzLl9zcHJpbmdZLngoeSksc2NhbGU6dGhpcy5fc3ByaW5nU2NhbGUueCh5KX19LGNpLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7bGV0IHk9bmV3IERhdGUoKS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMuX3NwcmluZ1guZG9uZSh5KSYmdGhpcy5fc3ByaW5nWS5kb25lKHkpJiZ0aGlzLl9zcHJpbmdTY2FsZS5kb25lKHkpfSxjaS5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oeSxNLFcpe3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUoeSxNLFcpLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUoeSxNLFcpLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKHksTSxXKX07bGV0IEtvPXtkaXJlY3Rpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxpbmVydGlhOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sb3V0T2ZCb3VuZHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHk6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sZGFtcGluZzp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyMH0sZnJpY3Rpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlTWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0Oi41fSxzY2FsZU1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMH0sc2NhbGVWYWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxhbmltYXRpb246e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiEwfX07ZnVuY3Rpb24gX28oeSxNKXtyZXR1cm4rKCgxZTMqeS0xZTMqTSkvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIFpvKHksTSxXKXtsZXQgSD17aWQ6MCxjYW5jZWxsZWQ6ITF9LFE9ZnVuY3Rpb24oZmUpe2ZlJiZmZS5pZCYmdWkoZmUuaWQpLGZlJiYoZmUuY2FuY2VsbGVkPSEwKX07ZnVuY3Rpb24gdGUoZmUscGUsQ2UsQmUpe2lmKCFmZXx8IWZlLmNhbmNlbGxlZCl7Q2UocGUpO2xldCBTZT1wZS5kb25lKCk7U2V8fGZlLmNhbmNlbGxlZHx8KGZlLmlkPUVuKHRlLmJpbmQobnVsbCxmZSxwZSxDZSxCZSkpKSxTZSYmQmUmJkJlKHBlKX19cmV0dXJuIHRlKEgseSxNLFcpLHtjYW5jZWw6US5iaW5kKG51bGwsSCksbW9kZWw6eX19bGV0IEpyPSExO2Z1bmN0aW9uIE9uKHkpe0pyfHwoSnI9ITAsRW4oZnVuY3Rpb24oKXt5KCksSnI9ITF9KSl9ZnVuY3Rpb24gRW4oeSl7cmV0dXJuIHYoeSwxNil9ZnVuY3Rpb24gdWkoeSl7bCh5KX1sZXQgQm89Qy5yZXF1aXJlTW9kdWxlKCJhbmltYXRpb24iKSxZYT1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiTW92YWJsZVZpZXciLHByb3BzOktvLGVtaXRzOlsiY2hhbmdlIiwic2NhbGUiXSxzdHlsZXM6W3sidW5pLW1vdmFibGUtdmlldyI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMHB4IixsZWZ0OiIwcHgiLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19XSxzZXR1cCh5LHtlbWl0Ok0sc2xvdHM6V30pe2xldCBIPU8ucmVmKG51bGwpLFE9Sm4oSCxNKSx0ZT1PLmluamVjdCgic2V0VG91Y2hNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksZmU9S24oeSxRLEgsdGUpO3JldHVybigpPT57bGV0IHBlPXtwcmV2ZW50R2VzdHVyZTohMH07cmV0dXJuIE8uY3JlYXRlVk5vZGUoInZpZXciLE8ubWVyZ2VQcm9wcyh7cmVmOkgsb25Ub3VjaHN0YXJ0OmZlLGNsYXNzOiJ1bmktbW92YWJsZS12aWV3IixzdHlsZToidHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyJ9LHBlKSxbVy5kZWZhdWx0JiZXLmRlZmF1bHQoKV0pfX19KTtmdW5jdGlvbiBLbih5LE0sVyxIKXtsZXQgUT1PLmluamVjdCgiX2lzTW91bnRlZCIsTy5yZWYoITEpKSx0ZT1PLmluamVjdCgicGFyZW50U2l6ZSIse3dpZHRoOk8ucmVmKDApLGhlaWdodDpPLnJlZigwKSx0b3A6Ty5yZWYoMCksbGVmdDpPLnJlZigwKX0pLGZlPU8uaW5qZWN0KCJhZGRNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSkscGU9Ty5pbmplY3QoInJlbW92ZU1vdmFibGVWaWV3Q29udGV4dCIsKCk9Pnt9KSxDZT17dG91Y2hzdGFydDooKT0+e30sdG91Y2htb3ZlOigpPT57fSx0b3VjaGVuZDooKT0+e319O2Z1bmN0aW9uIEJlKFVlKXtyZXR1cm4gTnVtYmVyKFVlKXx8MH1mdW5jdGlvbiBTZShVZSl7cmV0dXJuIFVlPU51bWJlcihVZSksaXNOYU4oVWUpPzE6VWV9bGV0IGplPU8ucmVmKEJlKHkueCkpLGJ0PU8ucmVmKEJlKHkueSkpLEN0PU8ucmVmKFNlKE51bWJlcih5LnNjYWxlVmFsdWUpKSksV3Q9Ty5yZWYoMCksRXQ9Ty5yZWYoMCksS2U9Ty5yZWYoMCksTXQ9Ty5yZWYoMCksX249Ty5yZWYoMCksd249Ty5yZWYoMCksQXQ9bnVsbCxubj1udWxsLGFyPXt4OjAseTowfSxKdD17eDowLHk6MH0sR3Q9MSxSbj0wLGVyPTAsQmE9ITEsYnMsTWEsQW89bnVsbCx5cz1udWxsLGVpPXt0b3A6MCxsZWZ0OjAsd2lkdGg6MCxoZWlnaHQ6MH0sRGE9bmV3IG9vLGlhPW5ldyBvbyx0cj17aGlzdG9yeVg6WzAsMF0saGlzdG9yeVk6WzAsMF0saGlzdG9yeVQ6WzAsMF19LEthPU8uY29tcHV0ZWQoKCk9PntsZXQgVWU9TnVtYmVyKHkuZGFtcGluZyk7cmV0dXJuIGlzTmFOKFVlKT8yMDpVZX0pLGNsPU8uY29tcHV0ZWQoKCk9PntsZXQgVWU9TnVtYmVyKHkuZnJpY3Rpb24pO3JldHVybiBpc05hTihVZSl8fFVlPD0wPzI6VWV9KSxGbz1PLmNvbXB1dGVkKCgpPT57bGV0IFVlPU51bWJlcih5LnNjYWxlTWluKTtyZXR1cm4gaXNOYU4oVWUpPy41OlVlfSksV2k9Ty5jb21wdXRlZCgoKT0+e2xldCBVZT1OdW1iZXIoeS5zY2FsZU1heCk7cmV0dXJuIGlzTmFOKFVlKT8xMDpVZX0pLFVuPU8uY29tcHV0ZWQoKCk9PnkuZGlyZWN0aW9uPT09ImFsbCJ8fHkuZGlyZWN0aW9uPT09Imhvcml6b250YWwiKSxHaT1PLmNvbXB1dGVkKCgpPT55LmRpcmVjdGlvbj09PSJhbGwifHx5LmRpcmVjdGlvbj09PSJ2ZXJ0aWNhbCIpLHZpPW5ldyBjaSgxLDkqTWF0aC5wb3coS2EudmFsdWUsMikvNDAsS2EudmFsdWUpLElpPW5ldyBGbigxLGNsLnZhbHVlKTtPLndhdGNoKCgpPT55LngsVWU9PntqZS52YWx1ZT1CZShVZSl9KSxPLndhdGNoKCgpPT55LnksVWU9PntidC52YWx1ZT1CZShVZSl9KSxPLndhdGNoKCgpPT55LnNjYWxlVmFsdWUsVWU9PntDdC52YWx1ZT1TZShOdW1iZXIoVWUpKX0pLE8ud2F0Y2goamUsJHIpLE8ud2F0Y2goYnQsT3IpLE8ud2F0Y2goQ3QsRXMpLE8ud2F0Y2goRm8sUGkpLE8ud2F0Y2goV2ksUGkpO2Z1bmN0aW9uIHRpKCl7bm4mJm5uLmNhbmNlbCgpLEF0JiZBdC5jYW5jZWwoKX1mdW5jdGlvbiAkcihVZSl7aWYoVW4udmFsdWUpe2lmKFVlK0p0Lng9PT1SbilyZXR1cm4gUm47QXQmJkF0LmNhbmNlbCgpLE5pKFVlK0p0LngsYnQudmFsdWUrSnQueSxHdCl9cmV0dXJuIFVlfWZ1bmN0aW9uIE9yKFVlKXtpZihHaS52YWx1ZSl7aWYoVWUrSnQueT09PWVyKXJldHVybiBlcjtBdCYmQXQuY2FuY2VsKCksTmkoamUudmFsdWUrSnQueCxVZStKdC55LEd0KX1yZXR1cm4gVWV9ZnVuY3Rpb24gUGkoKXtpZigheS5zY2FsZSlyZXR1cm4hMTtMYShHdCwhMCl9ZnVuY3Rpb24gRXMoVWUpe3JldHVybiB5LnNjYWxlPyhVZT1wbyhVZSksTGEoVWUsITApLFVlKTohMX1mdW5jdGlvbiBocigpe3kuZGlzYWJsZWR8fCh0aSgpLHRyLmhpc3RvcnlYPVswLDBdLHRyLmhpc3RvcnlZPVswLDBdLHRyLmhpc3RvcnlUPVswLDBdLFVuLnZhbHVlJiYoYnM9Um4pLEdpLnZhbHVlJiYoTWE9ZXIpLEFvPW51bGwseXM9bnVsbCxCYT0hMCl9ZnVuY3Rpb24gQXIoVWUpe2lmKCF5LmRpc2FibGVkJiZCYSl7bGV0IGd0PVJuLHV0PWVyO2lmKHlzPT09bnVsbCYmKHlzPU1hdGguYWJzKFVlLmRldGFpbC5keC9VZS5kZXRhaWwuZHkpPjE/Imh0b3VjaG1vdmUiOiJ2dG91Y2htb3ZlIiksVW4udmFsdWUmJihndD1VZS5kZXRhaWwuZHgrYnMsdHIuaGlzdG9yeVguc2hpZnQoKSx0ci5oaXN0b3J5WC5wdXNoKGd0KSwhR2kudmFsdWUmJkFvPT09bnVsbCYmKEFvPU1hdGguYWJzKFVlLmRldGFpbC5keC9VZS5kZXRhaWwuZHkpPDEpKSxHaS52YWx1ZSYmKHV0PVVlLmRldGFpbC5keStNYSx0ci5oaXN0b3J5WS5zaGlmdCgpLHRyLmhpc3RvcnlZLnB1c2godXQpLCFVbi52YWx1ZSYmQW89PT1udWxsJiYoQW89TWF0aC5hYnMoVWUuZGV0YWlsLmR5L1VlLmRldGFpbC5keCk8MSkpLHRyLmhpc3RvcnlULnNoaWZ0KCksdHIuaGlzdG9yeVQucHVzaChVZS5kZXRhaWwudGltZVN0YW1wKSwhQW8pe2xldCB4dD0idG91Y2giO2d0PEtlLnZhbHVlP3kub3V0T2ZCb3VuZHM/KHh0PSJ0b3VjaC1vdXQtb2YtYm91bmRzIixndD1LZS52YWx1ZS1EYS54KEtlLnZhbHVlLWd0KSk6Z3Q9S2UudmFsdWU6Z3Q+X24udmFsdWUmJih5Lm91dE9mQm91bmRzPyh4dD0idG91Y2gtb3V0LW9mLWJvdW5kcyIsZ3Q9X24udmFsdWUrRGEueChndC1fbi52YWx1ZSkpOmd0PV9uLnZhbHVlKSx1dDxNdC52YWx1ZT95Lm91dE9mQm91bmRzPyh4dD0idG91Y2gtb3V0LW9mLWJvdW5kcyIsdXQ9TXQudmFsdWUtaWEueChNdC52YWx1ZS11dCkpOnV0PU10LnZhbHVlOnV0PnduLnZhbHVlJiYoeS5vdXRPZkJvdW5kcz8oeHQ9InRvdWNoLW91dC1vZi1ib3VuZHMiLHV0PXduLnZhbHVlK2lhLngodXQtd24udmFsdWUpKTp1dD13bi52YWx1ZSksT24oZnVuY3Rpb24oKXtVbyhndCx1dCxHdCx4dCl9KX19fWZ1bmN0aW9uIHpzKCl7aWYoIXkuZGlzYWJsZWQmJkJhJiYoQmE9ITEsIUFvJiYhd3MoIm91dC1vZi1ib3VuZHMiKSYmeS5pbmVydGlhKSl7bGV0IFVlPTFlMyoodHIuaGlzdG9yeVhbMV0tdHIuaGlzdG9yeVhbMF0pLyh0ci5oaXN0b3J5VFsxXS10ci5oaXN0b3J5VFswXSksZ3Q9MWUzKih0ci5oaXN0b3J5WVsxXS10ci5oaXN0b3J5WVswXSkvKHRyLmhpc3RvcnlUWzFdLXRyLmhpc3RvcnlUWzBdKTtJaS5zZXRWKFVlLGd0KSxJaS5zZXRTKFJuLGVyKTtsZXQgdXQ9SWkuZGVsdGEoKS54LHh0PUlpLmRlbHRhKCkueSxZdD11dCtSbixXbj14dCtlcjtZdDxLZS52YWx1ZT8oWXQ9S2UudmFsdWUsV249ZXIrKEtlLnZhbHVlLVJuKSp4dC91dCk6WXQ+X24udmFsdWUmJihZdD1fbi52YWx1ZSxXbj1lcisoX24udmFsdWUtUm4pKnh0L3V0KSxXbjxNdC52YWx1ZT8oV249TXQudmFsdWUsWXQ9Um4rKE10LnZhbHVlLWVyKSp1dC94dCk6V24+d24udmFsdWUmJihXbj13bi52YWx1ZSxZdD1Sbisod24udmFsdWUtZXIpKnV0L3h0KSxJaS5zZXRFbmQoWXQsV24pLG5uPVpvKElpLGZ1bmN0aW9uKCl7bGV0IE1uPUlpLnMoKSxucj1Nbi54LHdhPU1uLnk7VW8obnIsd2EsR3QsImZyaWN0aW9uIil9LGZ1bmN0aW9uKCl7bm4uY2FuY2VsKCl9KX19ZnVuY3Rpb24gbmkoVWUsZ3Qpe2xldCB1dD0hMTtyZXR1cm4gVWU+X24udmFsdWU/KFVlPV9uLnZhbHVlLHV0PSEwKTpVZTxLZS52YWx1ZSYmKFVlPUtlLnZhbHVlLHV0PSEwKSxndD53bi52YWx1ZT8oZ3Q9d24udmFsdWUsdXQ9ITApOmd0PE10LnZhbHVlJiYoZ3Q9TXQudmFsdWUsdXQ9ITApLHt4OlVlLHk6Z3Qsb3V0T2ZCb3VuZHM6dXR9fWZ1bmN0aW9uIFZvKCl7YXIueD1laS5sZWZ0LXRlLmxlZnQudmFsdWUsYXIueT1laS50b3AtdGUudG9wLnZhbHVlfWZ1bmN0aW9uIFlpKFVlKXtVZT1VZXx8R3QsVWU9cG8oVWUpLEV0LnZhbHVlPWVpLmhlaWdodC9HdCxXdC52YWx1ZT1laS53aWR0aC9HdDtsZXQgZ3Q9RXQudmFsdWUqVWUsdXQ9V3QudmFsdWUqVWU7SnQueD0odXQtV3QudmFsdWUpLzIsSnQueT0oZ3QtRXQudmFsdWUpLzJ9ZnVuY3Rpb24gRWEoKXtsZXQgVWU9MC1hci54K0p0LngsZ3Q9dGUud2lkdGgudmFsdWUtV3QudmFsdWUtYXIueC1KdC54O0tlLnZhbHVlPU1hdGgubWluKFVlLGd0KSxfbi52YWx1ZT1NYXRoLm1heChVZSxndCk7bGV0IHV0PTAtYXIueStKdC55LHh0PXRlLmhlaWdodC52YWx1ZS1FdC52YWx1ZS1hci55LUp0Lnk7TXQudmFsdWU9TWF0aC5taW4odXQseHQpLHduLnZhbHVlPU1hdGgubWF4KHV0LHh0KX1mdW5jdGlvbiBMYShVZSxndCl7aWYoeS5zY2FsZSl7VWU9cG8oVWUpLFlpKFVlKSxFYSgpO2xldCB1dD1uaShSbixlcikseHQ9dXQueCxZdD11dC55O2d0P05pKHh0LFl0LFVlLCIiLCEwLCEwKTpPbihmdW5jdGlvbigpe1VvKHh0LFl0LFVlLCIiLCEwLCEwKX0pfX1mdW5jdGlvbiBwbyhVZSl7cmV0dXJuIFVlPU1hdGgubWF4KC41LEZvLnZhbHVlLFVlKSxVZT1NYXRoLm1pbigxMCxXaS52YWx1ZSxVZSksVWV9ZnVuY3Rpb24gTmkoVWUsZ3QsdXQseHQsWXQsV24pe3RpKCksVW4udmFsdWV8fChVZT1SbiksR2kudmFsdWV8fChndD1lcikseS5zY2FsZXx8KHV0PUd0KTtsZXQgTW49bmkoVWUsZ3QpO2lmKFVlPU1uLngsZ3Q9TW4ueSwheS5hbmltYXRpb24pe1VvKFVlLGd0LHV0LHh0LFl0LFduKTtyZXR1cm59dmkuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsdmkuX3NwcmluZ1kuX3NvbHV0aW9uPW51bGwsdmkuX3NwcmluZ1NjYWxlLl9zb2x1dGlvbj1udWxsLHZpLl9zcHJpbmdYLl9lbmRQb3NpdGlvbj1Sbix2aS5fc3ByaW5nWS5fZW5kUG9zaXRpb249ZXIsdmkuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj1HdCx2aS5zZXRFbmQoVWUsZ3QsdXQsMSksQXQ9Wm8odmksZnVuY3Rpb24oKXtsZXQgbnI9dmkueCgpLHdhPW5yLngsa2k9bnIueSwkbz1uci5zY2FsZTtVbyh3YSxraSwkbyx4dCxZdCxXbil9LGZ1bmN0aW9uKCl7QXQuY2FuY2VsKCl9KX1mdW5jdGlvbiB3cyhVZSl7bGV0IGd0PW5pKFJuLGVyKSx1dD1ndC54LHh0PWd0LnksWXQ9Z3Qub3V0T2ZCb3VuZHM7cmV0dXJuIFl0JiZOaSh1dCx4dCxHdCxVZSksWXR9ZnVuY3Rpb24gVW8oVWUsZ3QsdXQseHQ9IiIsWXQsV24pe1VlIT09bnVsbCYmVWUudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgVWU9PSJudW1iZXIifHwoVWU9Um58fDApLGd0IT09bnVsbCYmZ3QudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgZ3Q9PSJudW1iZXIifHwoZ3Q9ZXJ8fDApLFVlPU51bWJlcihVZS50b0ZpeGVkKDEpKSxndD1OdW1iZXIoZ3QudG9GaXhlZCgxKSksdXQ9TnVtYmVyKHV0LnRvRml4ZWQoMSkpLFJuPT09VWUmJmVyPT09Z3R8fFl0fHxNKCJjaGFuZ2UiLHt4Ol9vKFVlLEp0LngpLHk6X28oZ3QsSnQueSksc291cmNlOnh0fSkseS5zY2FsZXx8KHV0PUd0KSx1dD1wbyh1dCksdXQ9K3V0LnRvRml4ZWQoMyksV24mJnV0IT09R3QmJk0oInNjYWxlIix7eDpVZSx5Omd0LHNjYWxlOnV0fSk7bGV0IE1uPWB0cmFuc2xhdGUoJHtVZX1weCwgJHtndH1weCkgc2NhbGUoJHt1dH0pYDtCby50cmFuc2l0aW9uKFcudmFsdWUse3N0eWxlczp7dHJhbnNmb3JtOk1ufSxkdXJhdGlvbjowLGRlbGF5OjB9KSxSbj1VZSxlcj1ndCxHdD11dH1mdW5jdGlvbiBTcygpe3JldHVybiBQbihXLnZhbHVlKS50aGVuKFVlPT57ZWk9VWV9KX1mdW5jdGlvbiBaYSgpe2lmKCFRLnZhbHVlKXJldHVybjt0aSgpO2xldCBVZT15LnNjYWxlP0N0LnZhbHVlOjE7Vm8oKSxZaShVZSksRWEoKSxSbj1qZS52YWx1ZStKdC54LGVyPWJ0LnZhbHVlK0p0Lnk7bGV0IGd0PW5pKFJuLGVyKSx1dD1ndC54LHh0PWd0Lnk7VW8odXQseHQsVWUsIiIsITApfXJldHVybiBPLm9uTW91bnRlZCgoKT0+e0NlPWxpKGd0PT57c3dpdGNoKGd0LmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6aHIoKTticmVhaztjYXNlIm1vdmUiOkFyKGd0KTticmVhaztjYXNlImVuZCI6enMoKX19KSx2KCgpPT57U3MoKS50aGVuKCgpPT57WmEoKX0pfSwxMDApLElpLnJlY29uZmlndXJlKDEsY2wudmFsdWUpLHZpLnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyhLYS52YWx1ZSwyKS80MCxLYS52YWx1ZSk7bGV0IFVlPXtzZXRQYXJlbnQ6WmF9O2ZlKFVlKSxPLm9uVW5tb3VudGVkKCgpPT57cGUoVWUpfSl9KSxPLm9uVW5tb3VudGVkKCgpPT57dGkoKX0pLCgpPT57SChDZSl9fWxldCBLcj0xNix1cj17YWN0aXZlQ29sb3I6am4uUFJJTUFSWV9DT0xPUixiYWNrZ3JvdW5kQ29sb3I6IiNFQkVCRUIiLGFjdGl2ZU1vZGU6ImJhY2t3YXJkcyJ9LER0PXtwZXJjZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjAsdmFsaWRhdG9yKHkpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KHkpKX19LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OktyfSxzaG93SW5mbzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHN0cm9rZVdpZHRoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjYsdmFsaWRhdG9yKHkpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KHkpKX19LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OnVyLmFjdGl2ZUNvbG9yfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDp1ci5hY3RpdmVDb2xvcn0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OnVyLmJhY2tncm91bmRDb2xvcn0sYWN0aXZlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYWN0aXZlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDp1ci5hY3RpdmVNb2RlfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDozMCx2YWxpZGF0b3IoeSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoeSkpfX0sYm9yZGVyUmFkaXVzOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxrZT1beyJ1bmktcHJvZ3Jlc3MiOnsiIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn19LCJ1bmktcHJvZ3Jlc3MtYmFyIjp7IiI6e2ZsZXg6MX19LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9fSwidW5pLXByb2dyZXNzLWluZm8iOnsiIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX1dLGJvPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQcm9ncmVzcyIscHJvcHM6RHQsc3R5bGVzOmtlLGVtaXRzOlsiYWN0aXZlZW5kIl0sc2V0dXAoeSx7ZW1pdDpNfSl7bGV0IFc9Ty5yZWYobnVsbCksSD1PLnJlZihudWxsKSxRPUpuKFcsTSksdGU9eW8oeSk7cmV0dXJuIE8ud2F0Y2goKCk9PnRlLnJlYWxQZXJjZW50LChmZSxwZSk9Pnt0ZS5sYXN0UGVyY2VudD1wZXx8MCxFbyh0ZSx5LFEpfSksTy5vbk1vdW50ZWQoKCk9Pnt2KCgpPT57UG4oSC52YWx1ZSkudGhlbigoe3dpZHRoOmZlfSk9Pnt0ZS5wcm9ncmVzc1dpZHRoPWZlfHwwLEVvKHRlLHksUSl9KX0sNTApfSksKCk9PntsZXR7c2hvd0luZm86ZmUsZm9udFNpemU6cGV9PXkse291dGVyQmFyU3R5bGU6Q2UsaW5uZXJCYXJTdHlsZTpCZSxjdXJyZW50UGVyY2VudDpTZX09dGU7cmV0dXJuIE8uY3JlYXRlVk5vZGUoImRpdiIse3JlZjpXLGNsYXNzOiJ1bmktcHJvZ3Jlc3MifSxbTy5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOkgsc3R5bGU6Q2UsY2xhc3M6InVuaS1wcm9ncmVzcy1iYXIifSxbTy5jcmVhdGVWTm9kZSgiZGl2Iix7c3R5bGU6QmUsY2xhc3M6InVuaS1wcm9ncmVzcy1pbm5lci1iYXIifSxudWxsKV0pLGZlP2NuKFNlKyIlIix7Y2xhc3M6InVuaS1wcm9ncmVzcy1pbmZvIixzdHlsZTp7Zm9udFNpemU6cGV9fSk6bnVsbF0pfX19KTtmdW5jdGlvbiB5byh5KXtsZXQgTT1PLnJlZigwKSxXPU8ucmVmKDApLEg9Ty5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6eS5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyUmFkaXVzOnkuYm9yZGVyUmFkaXVzLGhlaWdodDp5LnN0cm9rZVdpZHRofSkpLFE9Ty5jb21wdXRlZCgoKT0+e2xldCBwZT15LmNvbG9yIT09dXIuYWN0aXZlQ29sb3ImJnkuYWN0aXZlQ29sb3I9PT11ci5hY3RpdmVDb2xvcj95LmNvbG9yOnkuYWN0aXZlQ29sb3I7cmV0dXJue3dpZHRoOk0udmFsdWUqVy52YWx1ZS8xMDAsaGVpZ2h0Onkuc3Ryb2tlV2lkdGgsYmFja2dyb3VuZENvbG9yOnBlLGJvcmRlclJhZGl1czp5LmJvcmRlclJhZGl1c319KSx0ZT1PLmNvbXB1dGVkKCgpPT57bGV0IHBlPXBhcnNlRmxvYXQoeS5wZXJjZW50KTtyZXR1cm4gcGU8MCYmKHBlPTApLHBlPjEwMCYmKHBlPTEwMCkscGV9KTtyZXR1cm4gTy5yZWFjdGl2ZSh7b3V0ZXJCYXJTdHlsZTpILGlubmVyQmFyU3R5bGU6USxyZWFsUGVyY2VudDp0ZSxjdXJyZW50UGVyY2VudDpNLHN0cm9rZVRpbWVyOjAsbGFzdFBlcmNlbnQ6MCxwcm9ncmVzc1dpZHRoOld9KX1mdW5jdGlvbiBFbyh5LE0sVyl7eS5zdHJva2VUaW1lciYmY2xlYXJJbnRlcnZhbCh5LnN0cm9rZVRpbWVyKSxNLmFjdGl2ZT8oeS5jdXJyZW50UGVyY2VudD1NLmFjdGl2ZU1vZGU9PT11ci5hY3RpdmVNb2RlPzA6eS5sYXN0UGVyY2VudCx5LnN0cm9rZVRpbWVyPXNldEludGVydmFsKCgpPT57eS5jdXJyZW50UGVyY2VudCsxPnkucmVhbFBlcmNlbnQ/KHkuY3VycmVudFBlcmNlbnQ9eS5yZWFsUGVyY2VudCx5LnN0cm9rZVRpbWVyJiZjbGVhckludGVydmFsKHkuc3Ryb2tlVGltZXIpLFcoImFjdGl2ZWVuZCIse30pKTp5LmN1cnJlbnRQZXJjZW50Kz0xfSxwYXJzZUZsb2F0KE0uZHVyYXRpb24pKSk6eS5jdXJyZW50UGVyY2VudD15LnJlYWxQZXJjZW50fWxldCBwYT17dmFsdWU6e3R5cGU6QXJyYXksZGVmYXVsdCgpe3JldHVybltdfSx2YWxpZGF0b3I6ZnVuY3Rpb24oeSl7cmV0dXJuIE50LmlzQXJyYXkoeSkmJnkuZmlsdGVyKE09PnR5cGVvZiBNPT0ibnVtYmVyIikubGVuZ3RoPT09eS5sZW5ndGh9fSxpbmRpY2F0b3JTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saW5kaWNhdG9yQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0NsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sWG89TnQuZXh0ZW5kKHt9LHBhLHtoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sbWFza1RvcFN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrQm90dG9tU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSksSGk9Ty5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlclZpZXciLHByb3BzOlhvLGVtaXRzOlsiY2hhbmdlIiwidXBkYXRlOnZhbHVlIl0sc2V0dXAoeSx7c2xvdHM6TSxlbWl0Old9KXtsZXQgSD1PLnJlZihudWxsKSxRPXdvKHkpLHRlPUpuKEgsVyksZmU9W10scGU9QmU9PkFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZmUuZmlsdGVyKFNlPT5TZS50eXBlIT09Ty5Db21tZW50KSxCZSksQ2U9QmU9Pk8uY29tcHV0ZWQoe2dldCgpe2xldCBTZT1wZShCZS52bm9kZSk7cmV0dXJuIFEudmFsdWVbU2VdfHwwfSxzZXQoU2Upe2lmKCFCZS5kYXRhLl9pc01vdW50ZWQpcmV0dXJuO2xldCBqZT1wZShCZS52bm9kZSk7aWYoamU8MClyZXR1cm47aWYoUS52YWx1ZVtqZV0hPT1TZSl7US52YWx1ZVtqZV09U2U7bGV0IEN0PVEudmFsdWUubWFwKFd0PT5XdCk7VygidXBkYXRlOnZhbHVlIixDdCksdGUoImNoYW5nZSIse3ZhbHVlOkN0fSl9fX0pO3JldHVybiBPLnByb3ZpZGUoImdldFBpY2tlclZpZXdDb2x1bW4iLENlKSxPLnByb3ZpZGUoInBpY2tlclZpZXdQcm9wcyIseSksKCk9PntsZXQgQmU9TS5kZWZhdWx0JiZNLmRlZmF1bHQoKTtmZT1ubyhCZSk7bGV0IFNlPXkuaGVpZ2h0P3toZWlnaHQ6YCR7cGFyc2VGbG9hdCh5LmhlaWdodCl9cHhgfTp7fTtyZXR1cm4gTy5jcmVhdGVWTm9kZSgidmlldyIsTy5tZXJnZVByb3BzKHtyZWY6SCxjbGFzczoidW5pLXBpY2tlci12aWV3IixzdHlsZTpTZX0se3ByZXZlbnRHZXN0dXJlOiEwfSksW08uY3JlYXRlVk5vZGUoInZpZXciLHtjbGFzczoidW5pLXBpY2tlci12aWV3LXdyYXBwZXIifSxbZmVdKV0pfX0sc3R5bGVzOlt7InVuaS1waWNrZXItdmlldyI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUifX0sInVuaS1waWNrZXItdmlldy13cmFwcGVyIjp7IiI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fV19KTtmdW5jdGlvbiB3byh5KXtsZXQgTT1PLnJlYWN0aXZlKFsuLi55LnZhbHVlXSksVz1PLnJlYWN0aXZlKHt2YWx1ZTpNfSk7cmV0dXJuIE8ud2F0Y2goKCk9PnkudmFsdWUsSD0+e1cudmFsdWUubGVuZ3RoPUgubGVuZ3RoLE8ubmV4dFRpY2soKCk9PntILmZvckVhY2goKFEsdGUpPT57USE9PVcudmFsdWVbdGVdJiZXLnZhbHVlLnNwbGljZSh0ZSwxLFEpfSl9KX0pLFd9bGV0IFpyPUMucmVxdWlyZU1vZHVsZSgiZG9tIiksZmk9Qy5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCI7ZnVuY3Rpb24gUW8oeSl7cmV0dXJuIE50LmV4dGVuZCh7fSxOdC5pc1N0cmluZyh5KT9zaSh5KTp5KX1sZXQgYW49e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sU289Ty5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLHByb3BzOmFuLGRhdGE6KCk9Pih7X2lzTW91bnRlZDohMX0pLHNldHVwKHkse3Nsb3RzOk19KXtsZXQgVz1PLmdldEN1cnJlbnRJbnN0YW5jZSgpLEg9Ty5yZWYobnVsbCksUT1PLnJlZihudWxsKSx0ZT1PLnJlZihudWxsKSxmZT1PLnJlZihudWxsKSxwZT1PLmluamVjdCgicGlja2VyVmlld1Byb3BzIiksQmU9Ty5pbmplY3QoImdldFBpY2tlclZpZXdDb2x1bW4iKShXKSxTZT1PLmNvbXB1dGVkKCgpPT5RbyhwZS5pbmRpY2F0b3JTdHlsZSkpLGplPU8uY29tcHV0ZWQoKCk9PlFvKHBlLm1hc2tUb3BTdHlsZSkpLGJ0PU8uY29tcHV0ZWQoKCk9PlFvKHBlLm1hc2tCb3R0b21TdHlsZSkpLEN0PU8ucmVmKDApO0N0LnZhbHVlPWRpKFNlLnZhbHVlKTtsZXQgV3Q9Ty5yZWYoMCk7V3QudmFsdWU9cGFyc2VGbG9hdChwZS5oZWlnaHQpO2xldHtzZXRDdXJyZW50OkV0LG9uU2Nyb2xsZW5kOktlfT1nYSh5LEJlLFEsQ3QpLE10PSgpPT57bGV0IHduLEF0O3YoKCk9PntQcm9taXNlLmFsbChbUG4oSC52YWx1ZSkudGhlbigoe2hlaWdodDpubn0pPT57d249V3QudmFsdWU9bm59KSxmaSYmeS5sZW5ndGg/UG4odGUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6bm59KT0+e0F0PUN0LnZhbHVlPW5uL3BhcnNlRmxvYXQoeS5sZW5ndGgpfSk6UG4oZmUudmFsdWUpLnRoZW4oKHtoZWlnaHQ6bm59KT0+e0F0PUN0LnZhbHVlPW5ufSldKS50aGVuKCgpPT57d24mJkF0P3YoKCk9PntXLmRhdGEuX2lzTW91bnRlZD0hMCxFdChCZS52YWx1ZSwhMSwhMCl9LDUwKTpNdCgpfSl9LDUwKX07Ty5vbk1vdW50ZWQoTXQpO2xldCBfbj13bj0+d24/Zmk/Ty5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOnRlLHN0eWxlOiJmbGV4LWRpcmVjdGlvbjpjb2x1bW47In0sW3duXSk6d246bnVsbDtyZXR1cm4oKT0+e2xldCB3bj1NLmRlZmF1bHQmJk0uZGVmYXVsdCgpLEF0PShXdC52YWx1ZS1DdC52YWx1ZSkvMixubj1gJHtXdC52YWx1ZS1BdH1weGAsYXI9e3Nob3dTY3JvbGxiYXI6ITEsc2Nyb2xsVG9CZWdpbjohMSxkZWNlbGVyYXRpb25SYXRlOi4zLHNjcm9sbFk6ITB9O3JldHVybiBmaXx8KGFyLnNjcm9sbFRvcD1CZS52YWx1ZSpDdC52YWx1ZSksTy5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpILGNsYXNzOiJ1bmktcGlja2VyLXZpZXctY29sdW1uIn0sW08uY3JlYXRlVk5vZGUoInNjcm9sbC12aWV3IixPLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktcGlja2VyLXZpZXctZ3JvdXAiLHN0eWxlOiJmbGV4LWRpcmVjdGlvbjpjb2x1bW47IixvblNjcm9sbGVuZDpLZX0sYXIpLFtPLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOlEsY2xhc3M6InVuaS1waWNrZXItdmlldy1jb250ZW50IixzdHlsZTp7cGFkZGluZ1RvcDpgJHtBdH1weGAscGFkZGluZ0JvdHRvbTpgJHtBdH1weGB9fSxbX24od24pXSldKSxPLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7Y2xhc3M6InVuaS1waWNrZXItdmlldy1tYXNrIn0sW08uY3JlYXRlVk5vZGUoInUtc2NhbGFibGUiLHtjbGFzczoidW5pLXBpY2tlci12aWV3LW1hc2sgdW5pLXBpY2tlci12aWV3LW1hc2stdG9wIixzdHlsZTpOdC5leHRlbmQoe30samUudmFsdWUse2JvdHRvbTpubn0pfSxudWxsKSxPLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7Y2xhc3M6InVuaS1waWNrZXItdmlldy1tYXNrIHVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSIsc3R5bGU6TnQuZXh0ZW5kKHt9LGJ0LnZhbHVlLHt0b3A6bm59KX0sbnVsbCldKSxPLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7cmVmOmZlLGNsYXNzOiJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIixzdHlsZTpOdC5leHRlbmQoe30sU2UudmFsdWUse3RvcDpgJHtBdH1weGB9KX0sbnVsbCldKX19LHN0eWxlczpbeyJ1bmktcGlja2VyLXZpZXctY29sdW1uIjp7IiI6e2ZsZXg6MSxwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6InN0cmV0Y2giLG92ZXJmbG93OiJoaWRkZW4ifX0sInVuaS1waWNrZXItdmlldy1tYXNrIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjAscG9pbnRlckV2ZW50czoibm9uZSJ9fSwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIjp7IiI6e2JvdHRvbTowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifX0sInVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSI6eyIiOnt0b3A6MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byB0b3AscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn19LCJ1bmktcGlja2VyLXZpZXctZ3JvdXAiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MH19LCJ1bmktcGlja2VyLXZpZXctY29udGVudCI6eyIiOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MH19LCJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHJpZ2h0OjAsdG9wOjAsaGVpZ2h0OiIzNHB4Iixwb2ludGVyRXZlbnRzOiJub25lIixib3JkZXJDb2xvcjoiI2U1ZTVlNSIsYm9yZGVyVG9wV2lkdGg6IjFweCIsYm9yZGVyQm90dG9tV2lkdGg6IjFweCJ9fX1dfSk7ZnVuY3Rpb24gZGkoeSl7bGV0IFc9KHkuaGVpZ2h0fHx5LmxpbmVIZWlnaHR8fCIiKS5tYXRjaCgvKC0/W1xkXC5dKylweC8pLEg9MDtyZXR1cm4gVyYmKEg9cGFyc2VGbG9hdChXWzFdKSksSH1mdW5jdGlvbiBnYSh5LE0sVyxIKXtsZXQgUTtmdW5jdGlvbiB0ZShDZSxCZT0hMCl7WnIuc2Nyb2xsVG9FbGVtZW50KFcudmFsdWUse29mZnNldDpDZSpILnZhbHVlLGFuaW1hdGVkOkJlfSksQmUmJihRPURhdGUubm93KCkpfU8ud2F0Y2goKCk9PnkubGVuZ3RoLCgpPT57digoKT0+e2ZlKE0udmFsdWUsITAsITApfSwxNTApfSksTy53YXRjaChNLENlPT50ZShDZSkpO2xldCBmZT0oQ2UsQmU9ITAsU2UpPT57TS52YWx1ZT09PUNlJiYhU2V8fChNLnZhbHVlPUNlLGZpJiZ0ZShDZSxCZSkpfTtyZXR1cm57c2V0Q3VycmVudDpmZSxvblNjcm9sbGVuZDpDZT0+e2lmKERhdGUubm93KCktUTwzNDApcmV0dXJuO2xldCBCZT1DZS5kZXRhaWwuY29udGVudE9mZnNldC55LFNlPU1hdGgucm91bmQoQmUvSC52YWx1ZSk7QmUlSC52YWx1ZT9mZShTZSwhMCwhMCk6TS52YWx1ZT1TZX19fWxldCBtbj17U0VMRUNUT1I6InNlbGVjdG9yIixNVUxUSVNFTEVDVE9SOiJtdWx0aVNlbGVjdG9yIixUSU1FOiJ0aW1lIixEQVRFOiJkYXRlIn0sQnI9e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifTtmdW5jdGlvbiBmcih5KXtyZXR1cm4geT45P3k6YDAke3l9YH1mdW5jdGlvbiBlYSh5LE0pe3k9U3RyaW5nKHl8fCIiKTtsZXQgVz1uZXcgRGF0ZTtpZihNPT09bW4uVElNRSl7bGV0IEg9eS5zcGxpdCgiOiIpO0gubGVuZ3RoPT09MiYmVy5zZXRIb3VycyhwYXJzZUludChIWzBdKSxwYXJzZUludChIWzFdKSl9ZWxzZXtsZXQgSD15LnNwbGl0KCItIik7SC5sZW5ndGg9PT0zJiZXLnNldEZ1bGxZZWFyKHBhcnNlSW50KEhbMF0pLHBhcnNlSW50KFN0cmluZyhwYXJzZUZsb2F0KEhbMV0pLTEpKSxwYXJzZUludChIWzJdKSl9cmV0dXJuIFd9ZnVuY3Rpb24gUGEoeSl7aWYoeS5tb2RlPT09bW4uVElNRSlyZXR1cm4iMDA6MDAiO2lmKHkubW9kZT09PW1uLkRBVEUpe2xldCBNPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKS0xMDA7c3dpdGNoKHkuZmllbGRzKXtjYXNlIEJyLllFQVI6cmV0dXJuIE07Y2FzZSBCci5NT05USDpyZXR1cm4gTSsiLTAxIjtkZWZhdWx0OnJldHVybiBNKyItMDEtMDEifX1yZXR1cm4iIn1mdW5jdGlvbiB0YSh5KXtpZih5Lm1vZGU9PT1tbi5USU1FKXJldHVybiIyMzo1OSI7aWYoeS5tb2RlPT09bW4uREFURSl7bGV0IE09bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2goeS5maWVsZHMpe2Nhc2UgQnIuWUVBUjpyZXR1cm4gTTtjYXNlIEJyLk1PTlRIOnJldHVybiBNKyItMTIiO2RlZmF1bHQ6cmV0dXJuIE0rIi0xMi0zMSJ9fXJldHVybiIifWxldCBhbz17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0scmFuZ2U6e3R5cGU6QXJyYXksZGVmYXVsdCgpe3JldHVybltdfX0scmFuZ2VLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nLEFycmF5XSxkZWZhdWx0OjB9LG1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6bW4uU0VMRUNUT1IsdmFsaWRhdG9yKHkpe3JldHVybiBPYmplY3QudmFsdWVzKG1uKS5pbmRleE9mKHkpPj0wfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQYX0sZW5kOnt0eXBlOlN0cmluZyxkZWZhdWx0OnRhfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxabj1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUGlja2VyIixwcm9wczphbyxlbWl0czpbImNoYW5nZSIsImNhbmNlbCIsImNvbHVtbmNoYW5nZSJdLHNldHVwKHkse3Nsb3RzOk0sZW1pdDpXfSl7bGV0IEg9Ty5yZWYobnVsbCksUT1KbihILFcpLHRlPU8ucmVmKG51bGwpLGZlPU8ucmVmKG51bGwpLHBlPSgpPT57bGV0IEV0PXkudmFsdWU7c3dpdGNoKHkubW9kZSl7Y2FzZSBtbi5NVUxUSVNFTEVDVE9SOntOdC5pc0FycmF5KEV0KXx8KEV0PVtdKSxOdC5pc0FycmF5KHRlLnZhbHVlKXx8KHRlLnZhbHVlPVtdKTtsZXQgS2U9dGUudmFsdWUubGVuZ3RoPU1hdGgubWF4KEV0Lmxlbmd0aCx5LnJhbmdlLmxlbmd0aCk7Zm9yKGxldCBNdD0wO010PEtlO010Kyspe2xldCBfbj1OdW1iZXIoRXRbTXRdKSx3bj1OdW1iZXIodGUudmFsdWVbTXRdKSxBdD1pc05hTihfbik/aXNOYU4od24pPzA6d246X247dGUudmFsdWUuc3BsaWNlKE10LDEsQXQ8MD8wOkF0KX19YnJlYWs7Y2FzZSBtbi5USU1FOmNhc2UgbW4uREFURTp0ZS52YWx1ZT1TdHJpbmcoRXQpO2JyZWFrO2RlZmF1bHQ6e2xldCBLZT1OdW1iZXIoRXQpO3RlLnZhbHVlPUtlPDA/MDpLZTticmVha319fSxDZT1FdD0+e2ZlLnZhbHVlJiZmZS52YWx1ZS5zZW5kTWVzc2FnZShFdCl9LEJlPUV0PT57bGV0IEtlPXtldmVudDoiY2FuY2VsIn07ZmUudmFsdWU9TG4oe3VybDoiX191bmlhcHBwaWNrZXIiLGRhdGE6RXQsc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOk10PT57bGV0IF9uPU10LmV2ZW50O2lmKF9uPT09ImNyZWF0ZWQiKXtDZShFdCk7cmV0dXJufWlmKF9uPT09ImNvbHVtbmNoYW5nZSIpe2RlbGV0ZSBNdC5ldmVudCxRKF9uLE10KTtyZXR1cm59S2U9TXR9LG9uQ2xvc2U6KCk9PntmZS52YWx1ZT1udWxsO2xldCBNdD1LZS5ldmVudDtkZWxldGUgS2UuZXZlbnQsTXQmJlEoTXQsS2UpfX0pfSxTZT1FdD0+e2QubmF0aXZlVUlbeS5tb2RlPT09bW4uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKEtlPT57bGV0IE10PUtlLmRhdGU7USgiY2hhbmdlIix7dmFsdWU6eS5tb2RlPT09bW4uVElNRT9gJHtmcihNdC5nZXRIb3VycygpKX06JHtmcihNdC5nZXRNaW51dGVzKCkpfWA6YCR7TXQuZ2V0RnVsbFllYXIoKX0tJHtmcihNdC5nZXRNb250aCgpKzEpfS0ke2ZyKE10LmdldERhdGUoKSl9YH0pfSwoKT0+e1EoImNhbmNlbCIse30pfSx5Lm1vZGU9PT1tbi5USU1FP3t0aW1lOmVhKHkudmFsdWUsbW4uVElNRSl9OntkYXRlOmVhKHkudmFsdWUsbW4uREFURSksbWluRGF0ZTplYSh5LnN0YXJ0LG1uLkRBVEUpLG1heERhdGU6ZWEoeS5lbmQsbW4uREFURSl9KX0samU9RXQ9PnsoRXQubW9kZT09PW1uLlRJTUV8fEV0Lm1vZGU9PT1tbi5EQVRFKSYmIUV0LmZpZWxkcz9TZSgpOihFdC5maWVsZHM9T2JqZWN0LnZhbHVlcyhCcikuaW5jbHVkZXMoRXQuZmllbGRzKT9FdC5maWVsZHM6QnIuREFZLEJlKEV0KSl9LGJ0PUV0PT57eS5kaXNhYmxlZHx8amUoTnQuZXh0ZW5kKHt9LHkse3ZhbHVlOnRlLnZhbHVlLGxvY2FsZTpiLmdldExvY2FsZSgpfSkpfSxDdD1PLmluamVjdChZciwhMSksV3Q9e3N1Ym1pdDooKT0+W3kubmFtZSx0ZS52YWx1ZV0scmVzZXQ6KCk9Pntzd2l0Y2goeS5tb2RlKXtjYXNlIG1uLlNFTEVDVE9SOnRlLnZhbHVlPTA7YnJlYWs7Y2FzZSBtbi5NVUxUSVNFTEVDVE9SOk50LmlzQXJyYXkoeS52YWx1ZSkmJih0ZS52YWx1ZT15LnZhbHVlLm1hcChFdD0+MCkpO2JyZWFrO2Nhc2UgbW4uREFURTpjYXNlIG1uLlRJTUU6dGUudmFsdWU9IiI7YnJlYWt9fX07cmV0dXJuIEN0JiYoQ3QuYWRkRmllbGQoV3QpLE8ub25CZWZvcmVVbm1vdW50KCgpPT5DdC5yZW1vdmVGaWVsZChXdCkpKSxPYmplY3Qua2V5cyh5KS5mb3JFYWNoKEV0PT57Ty53YXRjaCgoKT0+eVtFdF0sS2U9PntsZXQgTXQ9e307TXRbRXRdPUtlLENlKE10KX0se2RlZXA6ITB9KX0pLE8ud2F0Y2goKCk9PnkudmFsdWUscGUse2RlZXA6ITB9KSxwZSgpLCgpPT5PLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOkgsb25DbGljazpidH0sW00uZGVmYXVsdCYmTS5kZWZhdWx0KCldKX19KSxvcj17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxWbj1beyJ1bmktc2xpZGVyIjp7IiI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sInVuaS1zbGlkZXItd3JhcHBlciI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLXNsaWRlci10YXAtYXJlYSI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIscGFkZGluZ1RvcDoiMTQiLHBhZGRpbmdCb3R0b206IjE0In19LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSIsaGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjUiLG1hcmdpblJpZ2h0OiIxNCIsbWFyZ2luTGVmdDoiMTQifX0sInVuaS1zbGlkZXItdHJhY2siOnsiIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9fSwidW5pLXNsaWRlci10aHVtYiI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMSIsd2lkdGg6IjI4IixoZWlnaHQ6IjI4Iixib3JkZXJSYWRpdXM6NTAsYm94U2hhZG93OiIwIDAgNHB4ICNlYmViZWIifX0sInVuaS1zbGlkZXItdmFsdWUiOnsiIjp7Y29sb3I6IiM4ODg4ODgiLGZvbnRTaXplOiIxNiIsd2lkdGg6IjMwIn19fV0sWHI9Ty5kZWZpbmVDb21wb25lbnQoe25hbWU6IlVTbGlkZXIiLHByb3BzOm9yLHN0eWxlczpWbixzZXR1cCh5LHtlbWl0Ok19KXtsZXQgVz1PLnJlZihudWxsKSxIPU8ucmVmKG51bGwpLFE9Sm4oVyxNKSx0ZT1oaSh5KSxmZT1uYSh5LHRlLFEpO3JldHVybiBTaSh5LHRlKSxPLndhdGNoKCgpPT55LnZhbHVlLHBlPT57dGUuc2xpZGVyVmFsdWU9TnVtYmVyKHBlKX0pLE8ub25Nb3VudGVkKCgpPT57digoKT0+e1BuKEgudmFsdWUpLnRoZW4oKHt3aWR0aDpwZSxsZWZ0OkNlfSk9Pnt0ZS5zbGlkZXJMZWZ0PUNlLHRlLnNsaWRlcldpZHRoPXBlfHwwLHRlLnNsaWRlclZhbHVlPU51bWJlcih5LnZhbHVlKX0pfSwxMDApfSksKCk9PntsZXR7c2hvd1ZhbHVlOnBlfT15LHt0cmFja1RhcFN0eWxlOkNlLHRyYWNrU3R5bGU6QmUsdHJhY2tBY3RpdmVTdHlsZTpTZSx0aHVtYlN0eWxlOmplLHNsaWRlclZhbHVlOmJ0fT10ZTtyZXR1cm4gTy5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXIiLHJlZjpXfSxbTy5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItd3JhcHBlciJ9LFtPLmNyZWF0ZVZOb2RlKCJkaXYiLE8ubWVyZ2VQcm9wcyh7Y2xhc3M6InVuaS1zbGlkZXItdGFwLWFyZWEiLHN0eWxlOkNlfSxmZSksW08uY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIixzdHlsZTpCZSxyZWY6SH0sW08uY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXRyYWNrIixzdHlsZTpTZX0sbnVsbCldKSxPLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci10aHVtYiIsc3R5bGU6amV9LG51bGwpXSkscGU/Y24oYnQrIiIse2NsYXNzOiJ1bmktc2xpZGVyLXZhbHVlIn0pOm51bGxdKV0pfX19KTtmdW5jdGlvbiBoaSh5KXtsZXQgTT1PLnJlZigwKSxXPU8ucmVmKDApLEg9Ty5yZWYoMCksUT0oKT0+eS5iYWNrZ3JvdW5kQ29sb3IhPT0iI2U5ZTllOSI/eS5iYWNrZ3JvdW5kQ29sb3I6eS5jb2xvciE9PSIjMDA3YWZmIj95LmNvbG9yOiIjMDA3YWZmIix0ZT0oKT0+eS5hY3RpdmVDb2xvciE9PSIjMDA3YWZmIj95LmFjdGl2ZUNvbG9yOnkuc2VsZWN0ZWRDb2xvciE9PSIjZTllOWU5Ij95LnNlbGVjdGVkQ29sb3I6IiNlOWU5ZTkiLGZlPSgpPT57bGV0IEJlPU51bWJlcih5Lm1heCksU2U9TnVtYmVyKHkubWluKTtyZXR1cm4oSC52YWx1ZS1TZSkvKEJlLVNlKSpXLnZhbHVlfSxwZT1OdW1iZXIoeS5ibG9ja1NpemUpLzI7cmV0dXJuIE8ucmVhY3RpdmUoe3NsaWRlckxlZnQ6TSxzbGlkZXJXaWR0aDpXLHNsaWRlclZhbHVlOkgsc2xpZGVyVGh1bWJPZmZzZXQ6cGUsdHJhY2tUYXBTdHlsZTpPLmNvbXB1dGVkKCgpPT4oe3BhZGRpbmdUb3A6cGUscGFkZGluZ0JvdHRvbTpwZX0pKSx0cmFja1N0eWxlOk8uY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOlEoKSxtYXJnaW5MZWZ0OnBlLG1hcmdpblJpZ2h0OnBlfSkpLHRyYWNrQWN0aXZlU3R5bGU6Ty5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6dGUoKSx3aWR0aDpmZSgpfSkpLHRodW1iU3R5bGU6Ty5jb21wdXRlZCgoKT0+KHt3aWR0aDp5LmJsb2NrU2l6ZSxoZWlnaHQ6eS5ibG9ja1NpemUsYmFja2dyb3VuZENvbG9yOnkuYmxvY2tDb2xvcixsZWZ0OmZlKCl9KSl9KX1mdW5jdGlvbiBuYSh5LE0sVyl7bGV0IEg9bnVsbDtmdW5jdGlvbiBRKHBlLENlKXt5LmRpc2FibGVkfHwocGU9PT0ibW92ZSI/KHRlKENlKSxXKCJjaGFuZ2luZyIse3ZhbHVlOk0uc2xpZGVyVmFsdWV9KSk6cGU9PT0iZW5kIiYmKHRlKENlKSxXKCJjaGFuZ2UiLHt2YWx1ZTpNLnNsaWRlclZhbHVlfSkpKX1mdW5jdGlvbiB0ZShwZSl7cGUtPU0uc2xpZGVyVGh1bWJPZmZzZXQscGU8MCYmKHBlPTApLHBlPk0uc2xpZGVyV2lkdGgmJihwZT1NLnNsaWRlcldpZHRoKTtsZXQgQ2U9TnVtYmVyKHkubWF4KSxCZT1OdW1iZXIoeS5taW4pLFNlPU51bWJlcih5LnN0ZXApLGplPXBlL00uc2xpZGVyV2lkdGgqKENlLUJlKTtTZT4wJiZqZT5TZSYmamUlU2UvU2UhPT0wP2plLT1qZSVTZTpqZT1wYXJzZUludChqZSsiIiksTS5zbGlkZXJWYWx1ZT1qZStCZX1yZXR1cm57b25Ub3VjaHN0YXJ0KHBlKXtwZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiYhSCYmKEg9cGUsUSgic3RhcnQiLHBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKSl9LG9uVG91Y2htb3ZlKHBlKXtwZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT0xJiZIJiZRKCJtb3ZlIixwZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCl9LG9uVG91Y2hlbmQocGUpe3BlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PTEmJkgmJihIPW51bGwsUSgiZW5kIixwZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkpfX19ZnVuY3Rpb24gU2koeSxNKXtsZXQgVz1PLmluamVjdChZciwhMSksSD17c3VibWl0OigpPT57bGV0IFE9WyIiLG51bGxdO3JldHVybiB5Lm5hbWUmJihRWzBdPXkubmFtZSxRWzFdPU0uc2xpZGVyVmFsdWUpLFF9LHJlc2V0OigpPT57TS5zbGlkZXJWYWx1ZT1OdW1iZXIoeS52YWx1ZSl9fTtXJiYoVy5hZGRGaWVsZChIKSxPLm9uVW5tb3VudGVkKCgpPT57Vy5yZW1vdmVGaWVsZChIKX0pKX1sZXQgQ2k9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJzd2l0Y2gifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9fSxzbz17c3dpdGNoOiJzd2l0Y2giLGNoZWNrYm94OiJjaGVja2JveCJ9LHZhPXt3aWR0aDo1MixoZWlnaHQ6MzJ9LE9pPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2l0Y2giLHByb3BzOkNpLGVtaXRzOlsiY2hhbmdlIl0sc2V0dXAoeSx7ZW1pdDpNfSl7bGV0IFc9Ty5yZWYobnVsbCksSD1PLnJlZih5LmNoZWNrZWQpLFE9amkoeSxIKSx0ZT1KbihXLE0pO08ud2F0Y2goKCk9PnkuY2hlY2tlZCxwZT0+e0gudmFsdWU9cGV9KTtsZXQgZmU9KHBlLENlKT0+e3kuZGlzYWJsZWR8fChILnZhbHVlPXBlLmRldGFpbD9wZS5kZXRhaWwudmFsdWU6IUgudmFsdWUsdGUoImNoYW5nZSIse3ZhbHVlOkgudmFsdWV9KSl9O3JldHVybiBRJiYoUS5hZGRIYW5kbGVyKGZlKSxPLm9uQmVmb3JlVW5tb3VudCgoKT0+e1EucmVtb3ZlSGFuZGxlcihmZSl9KSksRXIoeSx7ImxhYmVsLWNsaWNrIjpmZX0pLCgpPT57bGV0e2NvbG9yOnBlLHR5cGU6Q2UsZGlzYWJsZWQ6QmV9PXk7cmV0dXJuIE8uY3JlYXRlVk5vZGUoImRpdiIse3JlZjpXfSxbQ2U9PT1zby5zd2l0Y2g/Ty5jcmVhdGVWTm9kZSgiZGMtc3dpdGNoIixPLm1lcmdlUHJvcHMoe2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIn0se29uQ2hhbmdlOmZlfSx7Y2hlY2tlZDpILnZhbHVlLGNvbG9yOnBlLGRpc2FibGVkOkJlfSx7c3R5bGU6dmF9KSxudWxsKTpudWxsLENlPT09c28uY2hlY2tib3g/Ty5jcmVhdGVWTm9kZShPLnJlc29sdmVDb21wb25lbnQoImNoZWNrYm94IiksTy5tZXJnZVByb3BzKHtzdHlsZTp7Y29sb3I6cGV9fSx7Y2hlY2tlZDpILnZhbHVlLGRpc2FibGVkOkJlfSx7b25DbGljazpmZX0pLG51bGwpOm51bGxdKX19fSk7ZnVuY3Rpb24gamkoeSxNKXtsZXQgVz1PLmluamVjdChZciwhMSksSD1PLmluamVjdChVciwhMSksUT17c3VibWl0OigpPT57bGV0IHRlPVsiIixudWxsXTtyZXR1cm4geS5uYW1lJiYodGVbMF09eS5uYW1lLHRlWzFdPU0udmFsdWUpLHRlfSxyZXNldDooKT0+e00udmFsdWU9ITF9fTtyZXR1cm4gVyYmKFcuYWRkRmllbGQoUSksTy5vblVubW91bnRlZCgoKT0+e1cucmVtb3ZlRmllbGQoUSl9KSksSH1sZXQgZHI9e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sU3I9cW4oInVjZyIpLGxvPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sTW89W3sidW5pLWNoZWNrYm94Ijp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn19LCJ1bmktY2hlY2tib3gtaW5wdXQiOnsiIjp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn19LCJ1bmktaWNvbiI6eyIiOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiIyIixtYXJnaW5Ub3A6IjIiLGNvbG9yOiIjMDA3YWZmIn19LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZTFlMWUxIn19LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQtYmVmb3JlIjp7IiI6e2NvbG9yOiIjYWRhZGFkIn19LCJ1bmktY2hlY2tib3gtc2xvdCI6eyIiOntmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjUifX19XSxDbz1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQ2hlY2tib3giLHByb3BzOmRyLHN0eWxlczpNbyxzZXR1cCh5LHtzbG90czpNfSl7bGV0IFc9Ty5yZWYobnVsbCksSD1PLnJlZih5LmNoZWNrZWQpLFE9Ty5yZWYoeS52YWx1ZSksdGU9Ty5jb21wdXRlZCgoKT0+eS5kaXNhYmxlZD8iI2FkYWRhZCI6eS5jb2xvciksZmU9KCk9PntILnZhbHVlPSExfSxwZT0oamUsYnQpPT57eS5kaXNhYmxlZHx8KEgudmFsdWU9IUgudmFsdWUsQ2UmJkNlLmNoZWNrYm94Q2hhbmdlKGplKSl9LHt1bmlDaGVja0dyb3VwOkNlLHVuaUxhYmVsOkJlfT1BaShILFEsZmUpO0JlJiYoQmUuYWRkSGFuZGxlcihwZSksTy5vbkJlZm9yZVVubW91bnQoKCk9PntCZS5yZW1vdmVIYW5kbGVyKHBlKX0pKSxFcih5LHsibGFiZWwtY2xpY2siOnBlfSksTy53YXRjaChbKCk9PnkuY2hlY2tlZCwoKT0+eS52YWx1ZV0sKFtqZSxidF0pPT57SC52YWx1ZT1qZSxRLnZhbHVlPWJ0fSk7bGV0IFNlPSgpPT57aWYoIU0uZGVmYXVsdClyZXR1cm5bXTtsZXQgamU9TS5kZWZhdWx0KCk7cmV0dXJuIGplLmxlbmd0aD09PTEmJmplWzBdLnR5cGU9PT1UZXh0P1tjbihqZVswXS5jaGlsZHJlbix7Y2xhc3M6InVuaS1jaGVja2JveC1zbG90In0pXTpqZX07cmV0dXJuKCk9Pk8uY3JlYXRlVk5vZGUoImRpdiIsTy5tZXJnZVByb3BzKHtyZWY6V30se2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSx7b25DbGljazpwZSxjbGFzczoidW5pLWNoZWNrYm94In0pLFtPLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCIseyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOnkuZGlzYWJsZWR9XX0sW0gudmFsdWU/Y24oIlx1RUEwOCIse2NsYXNzOiJ1bmktaWNvbiIsc3R5bGU6e2NvbG9yOnRlLnZhbHVlfX0pOm51bGxdKSwuLi5TZSgpXSl9fSk7ZnVuY3Rpb24gQWkoeSxNLFcpe2xldCBIPU8uY29tcHV0ZWQoKCk9Pih7Y2hlY2tib3hDaGVja2VkOkJvb2xlYW4oeS52YWx1ZSksdmFsdWU6TS52YWx1ZX0pKSxRPXtyZXNldDpXfSx0ZT1PLmluamVjdChTciwhMSk7dGUmJnRlLmFkZEZpZWxkKEgpO2xldCBmZT1PLmluamVjdChZciwhMSk7ZmUmJmZlLmFkZEZpZWxkKFEpO2xldCBwZT1PLmluamVjdChVciwhMSk7cmV0dXJuIE8ub25CZWZvcmVVbm1vdW50KCgpPT57dGUmJnRlLnJlbW92ZUZpZWxkKEgpLGZlJiZmZS5yZW1vdmVGaWVsZChRKX0pLHt1bmlDaGVja0dyb3VwOnRlLHVuaUZvcm06ZmUsdW5pTGFiZWw6cGV9fWxldCBwaT1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQ2hlY2tib3hHcm91cCIscHJvcHM6bG8sZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cCh5LHtzbG90czpNLGVtaXQ6V30pe2xldCBIPU8ucmVmKG51bGwpLFE9Sm4oSCxXKTtyZXR1cm4gRG8oeSxRKSwoKT0+Ty5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOkgsY2xhc3M6InVuaS1jaGVja2JveC1ncm91cCJ9LFtNLmRlZmF1bHQmJk0uZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gRG8oeSxNKXtsZXQgVz1bXSxIPSgpPT5XLnJlZHVjZSgodGUsZmUpPT4oZmUudmFsdWUuY2hlY2tib3hDaGVja2VkJiZ0ZS5wdXNoKGZlLnZhbHVlLnZhbHVlKSx0ZSksbmV3IEFycmF5KTtPLnByb3ZpZGUoU3Ise2FkZEZpZWxkKHRlKXtXLnB1c2godGUpfSxyZW1vdmVGaWVsZCh0ZSl7Vy5zcGxpY2UoVy5pbmRleE9mKHRlKSwxKX0sY2hlY2tib3hDaGFuZ2UodGUpe00oImNoYW5nZSIse3ZhbHVlOkgoKX0pfX0pO2xldCBRPU8uaW5qZWN0KFlyLCExKTtyZXR1cm4gUSYmUS5hZGRGaWVsZCh7c3VibWl0OigpPT57bGV0IHRlPVsiIixudWxsXTtyZXR1cm4geS5uYW1lIT09IiImJih0ZVswXT15Lm5hbWUsdGVbMV09SCgpKSx0ZX19KSxIfWxldCBEPXtjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2YWx1ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFo9cW4oInVjZyIpLG1lPXtuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sbGU9W3sidW5pLXJhZGlvIjp7IiI6e2FsaWduSXRlbXM6ImNlbnRlciIsZmxleERpcmVjdGlvbjoicm93In19LCJ1bmktcmFkaW8taW5wdXQiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLG1hcmdpblJpZ2h0OiI1Iixib3JkZXJTdHlsZToic29saWQiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyUmFkaXVzOjUwLHdpZHRoOiIyMiIsaGVpZ2h0OiIyMiIsb3V0bGluZTowfX0sInVuaS1yYWRpby1pbnB1dC1pY29uIjp7IiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTQiLGNvbG9yOiIjZmZmZmZmIn19LCJ1bmktcmFkaW8taW5wdXQtZGlzYWJsZWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZTFlMWUxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsY29sb3I6IiNhZGFkYWQifX0sInVuaS1yYWRpby1zbG90Ijp7IiI6e2ZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiNSJ9fX1dLGhlPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSYWRpbyIscHJvcHM6RCxzdHlsZXM6bGUsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cCh5LHtzbG90czpNfSl7bGV0IFc9Ty5yZWYobnVsbCksSD1PLnJlZih5LmNoZWNrZWQpLFE9Ty5yZWYoeS52YWx1ZSksdGU9Ty5jb21wdXRlZCgoKT0+e2xldCBidD15LmRpc2FibGVkPyIjYWRhZGFkIjp5LmNvbG9yO3JldHVybiBILnZhbHVlP3tiYWNrZ3JvdW5kQ29sb3I6YnQsYm9yZGVyQ29sb3I6YnR9Ontib3JkZXJDb2xvcjoiI2QxZDFkMSJ9fSksZmU9KCk9PntILnZhbHVlPSExfSx7dW5pQ2hlY2tHcm91cDpwZSx1bmlMYWJlbDpDZSxmaWVsZDpCZX09T3QoSCxRLGZlKSxTZT0oYnQsQ3QpPT57eS5kaXNhYmxlZHx8SC52YWx1ZXx8KEgudmFsdWU9IUgudmFsdWUscGUmJnBlLnJhZGlvQ2hhbmdlKGJ0LEJlKSl9O0NlJiYoQ2UuYWRkSGFuZGxlcihTZSksTy5vbkJlZm9yZVVubW91bnQoKCk9PntDZS5yZW1vdmVIYW5kbGVyKFNlKX0pKSxFcih5LHsibGFiZWwtY2xpY2siOlNlfSksTy53YXRjaChbKCk9PnkuY2hlY2tlZCwoKT0+eS52YWx1ZV0sKFtidCxDdF0pPT57SC52YWx1ZT1idCxRLnZhbHVlPUN0fSk7bGV0IGplPSgpPT57aWYoIU0uZGVmYXVsdClyZXR1cm5bXTtsZXQgYnQ9TS5kZWZhdWx0KCk7cmV0dXJuIGJ0Lmxlbmd0aD09PTEmJmJ0WzBdLnR5cGU9PT1UZXh0P1tjbihidFswXS5jaGlsZHJlbix7Y2xhc3M6InVuaS1yYWRpby1zbG90In0pXTpidH07cmV0dXJuKCk9PntsZXR7ZGlzYWJsZWQ6YnR9PXk7cmV0dXJuIE8uY3JlYXRlVk5vZGUoImRpdiIsTy5tZXJnZVByb3BzKHtyZWY6V30se2RhdGFVbmNUeXBlOiJ1bmktcmFkaW8ifSx7b25DbGljazpTZSxjbGFzczoidW5pLXJhZGlvIn0pLFtPLmNyZWF0ZVZOb2RlKCJkaXYiLHtzdHlsZTp0ZS52YWx1ZSxjbGFzczpbInVuaS1yYWRpby1pbnB1dCIseyJ1bmktcmFkaW8taW5wdXQtZGlzYWJsZWQiOmJ0fV19LFtILnZhbHVlP2NuKCJcdUVBMDgiLHtjbGFzczoidW5pLXJhZGlvLWlucHV0LWljb24ifSk6bnVsbF0pLC4uLmplKCldKX19fSk7ZnVuY3Rpb24gT3QoeSxNLFcpe2xldCBIPU8uY29tcHV0ZWQoe2dldDooKT0+KHtyYWRpb0NoZWNrZWQ6Qm9vbGVhbih5LnZhbHVlKSx2YWx1ZTpNLnZhbHVlfSksc2V0Oih7cmFkaW9DaGVja2VkOkNlfSk9Pnt5LnZhbHVlPUNlfX0pLFE9e3Jlc2V0Old9LHRlPU8uaW5qZWN0KFosITEpO3RlJiZ0ZS5hZGRGaWVsZChIKTtsZXQgZmU9Ty5pbmplY3QoWXIsITEpO2ZlJiZmZS5hZGRGaWVsZChRKTtsZXQgcGU9Ty5pbmplY3QoVXIsITEpO3JldHVybiBPLm9uQmVmb3JlVW5tb3VudCgoKT0+e3RlJiZ0ZS5yZW1vdmVGaWVsZChIKSxmZSYmZmUucmVtb3ZlRmllbGQoUSl9KSx7dW5pQ2hlY2tHcm91cDp0ZSx1bmlGb3JtOmZlLHVuaUxhYmVsOnBlLGZpZWxkOkh9fWxldCBLPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSYWRpb0dyb3VwIixwcm9wczptZSxlbWl0czpbImNoYW5nZSJdLHNldHVwKHkse3Nsb3RzOk0sZW1pdDpXfSl7bGV0IEg9Ty5yZWYobnVsbCksUT1KbihILFcpO3JldHVybiBZKHksUSksKCk9Pk8uY3JlYXRlVk5vZGUoImRpdiIse3JlZjpIfSxbTS5kZWZhdWx0JiZNLmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIFkoeSxNKXtsZXQgVz1bXTtPLm9uTW91bnRlZCgoKT0+e3BlKFcubGVuZ3RoLTEpfSk7bGV0IEg9KCk9Pnt2YXIgQ2U7cmV0dXJuKENlPVcuZmluZChCZT0+QmUudmFsdWUucmFkaW9DaGVja2VkKSk9PW51bGw/dm9pZCAwOkNlLnZhbHVlLnZhbHVlfTtPLnByb3ZpZGUoWix7YWRkRmllbGQoQ2Upe1cucHVzaChDZSl9LHJlbW92ZUZpZWxkKENlKXtXLnNwbGljZShXLmluZGV4T2YoQ2UpLDEpfSxyYWRpb0NoYW5nZShDZSxCZSl7bGV0IFNlPVcuaW5kZXhPZihCZSk7cGUoU2UsITApLE0oImNoYW5nZSIse3ZhbHVlOkgoKX0pfX0pO2xldCBRPU8uaW5qZWN0KFlyLCExKSx0ZT17c3VibWl0OigpPT57bGV0IENlPVsiIixudWxsXTtyZXR1cm4geS5uYW1lIT09IiImJihDZVswXT15Lm5hbWUsQ2VbMV09SCgpKSxDZX19O1EmJihRLmFkZEZpZWxkKHRlKSxPLm9uQmVmb3JlVW5tb3VudCgoKT0+e1EucmVtb3ZlRmllbGQodGUpfSkpO2Z1bmN0aW9uIGZlKENlLEJlKXtDZS52YWx1ZT17cmFkaW9DaGVja2VkOkJlLHZhbHVlOkNlLnZhbHVlLnZhbHVlfX1mdW5jdGlvbiBwZShDZSxCZSl7Vy5mb3JFYWNoKChTZSxqZSk9PntqZSE9PUNlJiZCZSYmZmUoV1tqZV0sITEpfSl9cmV0dXJuIFd9bGV0IGNlPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXSx4ZT1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiRm9ybSIsZW1pdHM6WyJzdWJtaXQiLCJyZXNldCJdLHNldHVwKHt9LHtzbG90czp5LGVtaXQ6TX0pe2xldCBXPU8ucmVmKG51bGwpLEg9Sm4oVyxNKSxRPVtdLHRlO3JldHVybiBPLnByb3ZpZGUoWXIse2FkZEZpZWxkKGZlKXtRLnB1c2goZmUpfSxyZW1vdmVGaWVsZChmZSl7US5zcGxpY2UoUS5pbmRleE9mKGZlKSwxKX0sc3VibWl0KGZlKXtsZXQgcGU9e307dGUmJnRlKHBlKTtsZXQgQ2U9US5yZWR1Y2UoKEJlLFNlKT0+e2lmKFNlLnN1Ym1pdCl7bGV0W2plLGJ0XT1TZS5zdWJtaXQoKTtqZSYmKEJlW2plXT1idCl9cmV0dXJuIEJlfSxPYmplY3QuY3JlYXRlKG51bGwpKTtPYmplY3QuYXNzaWduKHBlLENlKSxIKCJzdWJtaXQiLHt2YWx1ZTpwZX0pfSxyZXNldChmZSl7dGUmJnRlKCksUS5mb3JFYWNoKHBlPT5wZS5yZXNldCYmcGUucmVzZXQoKSksSCgicmVzZXQiLGZlKX19KSwoKT0+e2xldCBmZT15LmRlZmF1bHQmJnkuZGVmYXVsdCgpO3JldHVybiB0ZT1sdChmZSksTy5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpXfSxbZmVdKX19fSk7ZnVuY3Rpb24gbHQoeSl7bGV0IE09Qy5yZXF1aXJlTW9kdWxlKCJwbHVzIiksVz0oSCxRKT0+eyhRfHx5fHxbXSkuZm9yRWFjaChmdW5jdGlvbih0ZSl7Y2UuaW5kZXhPZihTdHJpbmcodGUudHlwZSkpPj0wJiZ0ZS5lbCYmdGUuZWwuYXR0ciYmdGUuZWwuYXR0ci5uYW1lJiYoSD9IW3RlLmVsLmF0dHIubmFtZV09TS5nZXRWYWx1ZSh0ZS5lbC5ub2RlSWQpOnRlLmVsLnNldFZhbHVlKCIiKSksTnQuaXNBcnJheSh0ZS5jaGlsZHJlbikmJnRlLmNoaWxkcmVuJiZ0ZS5jaGlsZHJlbi5sZW5ndGgmJlcoSCx0ZS5jaGlsZHJlbil9KX07cmV0dXJuIFd9bGV0IHp0PXt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjIzfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LEFuPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9LFhuPXtzdWNjZXNzOiJcdUVBMDYiLGluZm86Ilx1RUEwMyIsd2FybjoiXHVFQTBCIix3YWl0aW5nOiJcdUVBMDkiLHNhZmVfc3VjY2VzczoiXHVFQTA0IixzYWZlX3dhcm46Ilx1RUEwNSIsc3VjY2Vzc19jaXJjbGU6Ilx1RUEwNyIsc3VjY2Vzc19ub19jaXJjbGU6Ilx1RUEwOCIsd2FpdGluZ19jaXJjbGU6Ilx1RUEwQSIsY2lyY2xlOiJcdUVBMDEiLGRvd25sb2FkOiJcdUVBMDIiLGluZm9fY2lyY2xlOiJcdUVBMEMiLGNhbmNlbDoiXHVFQTBEIixzZWFyY2g6Ilx1RUEwRSIsY2xlYXI6Ilx1RUEwRiJ9LFFyPVt7InVuaS1pY29uIjp7IiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIn19fV0sTXI9Ty5kZWZpbmVDb21wb25lbnQoe25hbWU6Ikljb24iLHByb3BzOnp0LHN0eWxlczpRcixzZXR1cCh5LHt9KXtyZXR1cm4oKT0+Y24oWG5beS50eXBlXSx7Y2xhc3M6InVuaS1pY29uIixzdHlsZTp7Y29sb3I6eS5jb2xvcnx8QW5beS50eXBlXSxmb250U2l6ZTp5LnNpemV9fSl9fSksY289e2luZGljYXRvckRvdHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx2ZXJ0aWNhbDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGF1dG9wbGF5Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY2lyY3VsYXI6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpbnRlcnZhbDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1ZTN9LGR1cmF0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoicmdiYSgwLDAsMCwuMykifSxpbmRpY2F0b3JBY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHByZXZpb3VzTWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxuZXh0TWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjdXJyZW50SXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxza2lwSGlkZGVuSXRlbUxheW91dDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc3BsYXlNdWx0aXBsZUl0ZW1zOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVUb3VjaDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxncj1DLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIixnaT1beyJ1bmktc3dpcGVyIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9fSwidW5pLXN3aXBlci1zbGlkZXIiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH19LCJ1bmktc3dpcGVyLWRvdHMiOnsiIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCxib3R0b206IjEwIixoZWlnaHQ6IjEwIn19fV0sdW89Ty5kZWZpbmVDb21wb25lbnQoe25hbWU6IlN3aXBlciIscHJvcHM6Y28sc3R5bGVzOmdpLGVtaXRzOlsiY2hhbmdlIiwidHJhbnNpdGlvbiIsImFuaW1hdGlvbmZpbmlzaCJdLHNldHVwKHkse3Nsb3RzOk0sZW1pdDpXfSl7bGV0IEg9Ty5yZWYobnVsbCksUT1bXSx0ZT1KbihILFcpLGZlPWZvKHkpLHBlPXJhKGZlLHksUSx0ZSk7cmV0dXJuIE8ud2F0Y2goWygpPT55LmN1cnJlbnQsKCk9PnkuY3VycmVudEl0ZW1JZF0sKFtDZSxCZV0pPT57UW4oZmUseSxRKX0pLE8ub25Nb3VudGVkKCgpPT57digoKT0+e1BuKEgudmFsdWUpLnRoZW4oKHt3aWR0aDpDZSxoZWlnaHQ6QmV9KT0+e2ZlLnN3aXBlcldpZHRoPUNlLGZlLnN3aXBlckhlaWdodD1CZX0pfSw1MCl9KSwoKT0+e2xldCBDZT1NLmRlZmF1bHQmJk0uZGVmYXVsdCgpLHtpbmRpY2F0b3JTdHlsZTpCZSxjdXJyZW50U3luYzpTZX09ZmU7cmV0dXJuIFE9bm8oQ2UpLE8uY3JlYXRlVk5vZGUoImRpdiIse3JlZjpILGNsYXNzOiJ1bmktc3dpcGVyIn0sW08uY3JlYXRlVk5vZGUoInNsaWRlciIsTy5tZXJnZVByb3BzKHtjbGFzczoidW5pLXN3aXBlci1zbGlkZXIifSx7YXV0b1BsYXk6eS5hdXRvcGxheSxpbnRlcnZhbDp5LmludGVydmFsLGluZGV4OlNlLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczp5LmluZGljYXRvckRvdHMsaW5maW5pdGU6eS5jaXJjdWxhcix2ZXJ0aWNhbDp5LnZlcnRpY2FsLHNjcm9sbGFibGU6IXkuZGlzYWJsZVRvdWNofSxwZSksW1EsTy5jcmVhdGVWTm9kZSgiaW5kaWNhdG9yIix7Y2xhc3M6InVuaS1zd2lwZXItZG90cyIsc3R5bGU6QmV9LG51bGwpXSldKX19fSk7ZnVuY3Rpb24gZm8oeSl7bGV0IE09Ty5yZWYoMCksVz1PLnJlZigwKSxIPU8ucmVmKHkuY3VycmVudCksUT1PLnJlZigiYXV0b3BsYXkiKSx0ZT1PLmNvbXB1dGVkKCgpPT4oe2l0ZW1Db2xvcjp5LmluZGljYXRvckNvbG9yLGl0ZW1TZWxlY3RlZENvbG9yOnkuaW5kaWNhdG9yQWN0aXZlQ29sb3IsaXRlbVNpemU6OCxvcGFjaXR5OnkuaW5kaWNhdG9yRG90cz8xOjB9KSk7cmV0dXJuIE8ucmVhY3RpdmUoe3N3aXBlcldpZHRoOk0sc3dpcGVySGVpZ2h0OlcsaW5kaWNhdG9yU3R5bGU6dGUsY3VycmVudFN5bmM6SCxjdXJyZW50Q2hhbmdlU291cmNlOlF9KX1mdW5jdGlvbiByYSh5LE0sVyxIKXtsZXQgUT0wLHRlPVNlPT57bGV0IGplPVNlLmRldGFpbCxidD1NLnZlcnRpY2FsLEN0PShidD9qZS5vZmZzZXRZUmF0aW86amUub2Zmc2V0WFJhdGlvKXx8MDtpZigoU2UuZHJhZ3x8U2UuZHJhZykmJih5LmN1cnJlbnRDaGFuZ2VTb3VyY2U9InRvdWNoIiksQ3Q9PT0wKXtsZXQgV3Q9TWF0aC5hYnMoUSk7aWYoV3Q9PT0xKXJldHVybjtXdD4uNSYmKEN0PTEpfVE9Q3QsSCgidHJhbnNpdGlvbiIse2R4OmJ0PzA6LXkuc3dpcGVyV2lkdGgqQ3QsZHk6YnQ/LXkuc3dpcGVySGVpZ2h0KkN0OjB9KX0sZmU9U2U9PntsZXQgamU9KCk9PntIKCJhbmltYXRpb25maW5pc2giLENlKCkpLHkuY3VycmVudENoYW5nZVNvdXJjZT0iYXV0b3BsYXkifTtncj9qZSgpOnYoamUsNTApfSxwZT1TZT0+e050LmlzU3RyaW5nKFNlLmRldGFpbC5zb3VyY2UpJiYoeS5jdXJyZW50Q2hhbmdlU291cmNlPVNlLmRldGFpbC5zb3VyY2UpLHkuY3VycmVudFN5bmM9U2UuZGV0YWlsLmluZGV4LFE9MH07ZnVuY3Rpb24gQ2UoKXtsZXQgU2U9TnVtYmVyKHkuY3VycmVudFN5bmMpLGplPVdbU2VdfHx7fSxidD1qZS5jb21wb25lbnRJbnN0YW5jZSYmamUuY29tcG9uZW50SW5zdGFuY2UuaXRlbUlkfHwiIjtyZXR1cm57Y3VycmVudDpTZSxjdXJyZW50SXRlbUlkOmJ0LHNvdXJjZTp5LmN1cnJlbnRDaGFuZ2VTb3VyY2V9fXJldHVybiBPLndhdGNoKCgpPT55LmN1cnJlbnRTeW5jLFNlPT57SCgiY2hhbmdlIixDZSgpKX0pLHtvblNjcm9sbDp0ZSxvblNjcm9sbGVuZDpmZSxvbkNoYW5nZTpwZX19ZnVuY3Rpb24gUW4oeSxNLFcpe2xldCBIPS0xO2lmKE0uY3VycmVudEl0ZW1JZClmb3IobGV0IFE9MCx0ZT1XO1E8dGUubGVuZ3RoO1ErKyl7bGV0IGZlPXRlW1FdLmNvbXBvbmVudEluc3RhbmNlO2lmKGZlJiZmZS5pdGVtSWQ9PT1NLmN1cnJlbnRJdGVtSWQpe0g9UTticmVha319SDwwJiYoSD1NYXRoLnJvdW5kKE51bWJlcihNLmN1cnJlbnQpKXx8MCksSD1IPDA/MDpILHkuY3VycmVudFN5bmMhPT1IJiYoeS5jdXJyZW50Q2hhbmdlU291cmNlPSIiLHkuY3VycmVudFN5bmM9SCl9bGV0IERyPXtpdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxxYT1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiU3dpcGVySXRlbSIscHJvcHM6RHIsc2V0dXAoeSx7c2xvdHM6TX0pe3JldHVybigpPT5PLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXN3aXBlci1pdGVtIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19LFtNLmRlZmF1bHQmJk0uZGVmYXVsdCgpXSl9fSk7dmFyIE5hPS9ePChbLUEtWmEtejAtOV9dKykoKD86XHMrW2EtekEtWl86XVstYS16QS1aMC05XzouXSooPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pPi8sTHI9L148XC8oWy1BLVphLXowLTlfXSspW14+XSo+LyxWcz0vKFthLXpBLVpfOl1bLWEtekEtWjAtOV86Ll0qKSg/OlxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpPy9nLFVzPW1hKCJhcmVhLGJhc2UsYmFzZWZvbnQsYnIsY29sLGZyYW1lLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sZW1iZWQsY29tbWFuZCxrZXlnZW4sc291cmNlLHRyYWNrLHdiciIpLGlsPW1hKCJhLGFkZHJlc3MsYXJ0aWNsZSxhcHBsZXQsYXNpZGUsYXVkaW8sYmxvY2txdW90ZSxidXR0b24sY2FudmFzLGNlbnRlcixkZCxkZWwsZGlyLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxmcmFtZXNldCxoMSxoMixoMyxoNCxoNSxoNixoZWFkZXIsaGdyb3VwLGhyLGlmcmFtZSxpc2luZGV4LGxpLG1hcCxtZW51LG5vZnJhbWVzLG5vc2NyaXB0LG9iamVjdCxvbCxvdXRwdXQscCxwcmUsc2VjdGlvbixzY3JpcHQsdGFibGUsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHIsdWwsdmlkZW8iKSxPbz1tYSgiYWJicixhY3JvbnltLGFwcGxldCxiLGJhc2Vmb250LGJkbyxiaWcsYnIsYnV0dG9uLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpZnJhbWUsaW1nLGlucHV0LGlucyxrYmQsbGFiZWwsbWFwLG9iamVjdCxxLHMsc2FtcCxzY3JpcHQsc2VsZWN0LHNtYWxsLHNwYW4sc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHRleHRhcmVhLHR0LHUsdmFyIiksVGk9bWEoImNvbGdyb3VwLGRkLGR0LGxpLG9wdGlvbnMscCx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLGthPW1hKCJjaGVja2VkLGNvbXBhY3QsZGVjbGFyZSxkZWZlcixkaXNhYmxlZCxpc21hcCxtdWx0aXBsZSxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3dyYXAscmVhZG9ubHksc2VsZWN0ZWQiKSxObD1tYSgic2NyaXB0LHN0eWxlIik7ZnVuY3Rpb24gem4oeSxNKXt2YXIgVyxILFEsdGU9W10sZmU9eTtmb3IodGUubGFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RoaXMubGVuZ3RoLTFdfTt5Oyl7aWYoSD0hMCwhdGUubGFzdCgpfHwhTmxbdGUubGFzdCgpXSl7aWYoeS5pbmRleE9mKCI8IS0tIik9PTA/KFc9eS5pbmRleE9mKCItLT4iKSxXPj0wJiYoTS5jb21tZW50JiZNLmNvbW1lbnQoeS5zdWJzdHJpbmcoNCxXKSkseT15LnN1YnN0cmluZyhXKzMpLEg9ITEpKTp5LmluZGV4T2YoIjwvIik9PTA/KFE9eS5tYXRjaChMciksUSYmKHk9eS5zdWJzdHJpbmcoUVswXS5sZW5ndGgpLFFbMF0ucmVwbGFjZShMcixCZSksSD0hMSkpOnkuaW5kZXhPZigiPCIpPT0wJiYoUT15Lm1hdGNoKE5hKSxRJiYoeT15LnN1YnN0cmluZyhRWzBdLmxlbmd0aCksUVswXS5yZXBsYWNlKE5hLENlKSxIPSExKSksSCl7Vz15LmluZGV4T2YoIjwiKTt2YXIgcGU9VzwwP3k6eS5zdWJzdHJpbmcoMCxXKTt5PVc8MD8iIjp5LnN1YnN0cmluZyhXKSxNLmNoYXJzJiZNLmNoYXJzKHBlKX19ZWxzZSB5PXkucmVwbGFjZShuZXcgUmVnRXhwKCIoW1xcc1xcU10qPyk8LyIrdGUubGFzdCgpKyJbXj5dKj4iKSxmdW5jdGlvbihTZSxqZSl7cmV0dXJuIGplPWplLnJlcGxhY2UoLzwhLS0oW1xzXFNdKj8pLS0+fDwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSQyIiksTS5jaGFycyYmTS5jaGFycyhqZSksIiJ9KSxCZSgiIix0ZS5sYXN0KCkpO2lmKHk9PWZlKXRocm93IlBhcnNlIEVycm9yOiAiK3k7ZmU9eX1CZSgpO2Z1bmN0aW9uIENlKFNlLGplLGJ0LEN0KXtpZihqZT1qZS50b0xvd2VyQ2FzZSgpLGlsW2plXSlmb3IoO3RlLmxhc3QoKSYmT29bdGUubGFzdCgpXTspQmUoIiIsdGUubGFzdCgpKTtpZihUaVtqZV0mJnRlLmxhc3QoKT09amUmJkJlKCIiLGplKSxDdD1Vc1tqZV18fCEhQ3QsQ3R8fHRlLnB1c2goamUpLE0uc3RhcnQpe3ZhciBXdD1bXTtidC5yZXBsYWNlKFZzLGZ1bmN0aW9uKEV0LEtlKXt2YXIgTXQ9YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTphcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06a2FbS2VdP0tlOiIiO1d0LnB1c2goe25hbWU6S2UsdmFsdWU6TXQsZXNjYXBlZDpNdC5yZXBsYWNlKC8oXnxbXlxcXSkiL2csJyQxXFwiJyl9KX0pLE0uc3RhcnQmJk0uc3RhcnQoamUsV3QsQ3QpfX1mdW5jdGlvbiBCZShTZSxqZSl7aWYoamUpZm9yKHZhciBidD10ZS5sZW5ndGgtMTtidD49MCYmdGVbYnRdIT1qZTtidC0tKTtlbHNlIHZhciBidD0wO2lmKGJ0Pj0wKXtmb3IodmFyIEN0PXRlLmxlbmd0aC0xO0N0Pj1idDtDdC0tKU0uZW5kJiZNLmVuZCh0ZVtDdF0pO3RlLmxlbmd0aD1idH19fWZ1bmN0aW9uIG1hKHkpe2Zvcih2YXIgTT17fSxXPXkuc3BsaXQoIiwiKSxIPTA7SDxXLmxlbmd0aDtIKyspTVtXW0hdXT0hMDtyZXR1cm4gTX1mdW5jdGlvbiBncyh5KXtyZXR1cm4geS5yZXBsYWNlKC88XD94bWwuKlw/PlxuLywiIikucmVwbGFjZSgvPCFkb2N0eXBlLio+XG4vLCIiKS5yZXBsYWNlKC88IURPQ1RZUEUuKj5cbi8sIiIpfWZ1bmN0aW9uIGhvKHkpe3JldHVybiB5LnJlZHVjZShmdW5jdGlvbihNLFcpe2xldCBIPVcudmFsdWUsUT1XLm5hbWU7cmV0dXJuIEgubWF0Y2goLyAvKSYmWyJzdHlsZSIsInNyYyJdLmluZGV4T2YoUSk9PT0tMSYmKEg9SC5zcGxpdCgiICIpKSxNW1FdP0FycmF5LmlzQXJyYXkoTVtRXSk/TVtRXS5wdXNoKEgpOk1bUV09W01bUV0sSF06TVtRXT1ILE19LHt9KX1mdW5jdGlvbiBKYSh5KXt5PWdzKHkpO2xldCBNPVtdLFc9e25vZGU6InJvb3QiLGNoaWxkcmVuOltdfTtyZXR1cm4gem4oeSx7c3RhcnQ6ZnVuY3Rpb24oSCxRLHRlKXtsZXQgZmU9e25hbWU6SH07aWYoUS5sZW5ndGghPT0wJiYoZmUuYXR0cnM9aG8oUSkpLHRlKXtsZXQgcGU9TVswXXx8VztwZS5jaGlsZHJlbnx8KHBlLmNoaWxkcmVuPVtdKSxwZS5jaGlsZHJlbi5wdXNoKGZlKX1lbHNlIE0udW5zaGlmdChmZSl9LGVuZDpmdW5jdGlvbihIKXtsZXQgUT1NLnNoaWZ0KCk7aWYoUS5uYW1lIT09SCYmY29uc29sZS5lcnJvcigiaW52YWxpZCBzdGF0ZTogbWlzbWF0Y2ggZW5kIHRhZyIpLE0ubGVuZ3RoPT09MClXLmNoaWxkcmVuLnB1c2goUSk7ZWxzZXtsZXQgdGU9TVswXTt0ZS5jaGlsZHJlbnx8KHRlLmNoaWxkcmVuPVtdKSx0ZS5jaGlsZHJlbi5wdXNoKFEpfX0sY2hhcnM6ZnVuY3Rpb24oSCl7bGV0IFE9e3R5cGU6InRleHQiLHRleHQ6SH07aWYoTS5sZW5ndGg9PT0wKVcuY2hpbGRyZW4ucHVzaChRKTtlbHNle2xldCB0ZT1NWzBdO3RlLmNoaWxkcmVufHwodGUuY2hpbGRyZW49W10pLHRlLmNoaWxkcmVuLnB1c2goUSl9fSxjb21tZW50OmZ1bmN0aW9uKEgpe2xldCBRPXtub2RlOiJjb21tZW50Iix0ZXh0Okh9LHRlPU1bMF07dGUuY2hpbGRyZW58fCh0ZS5jaGlsZHJlbj1bXSksdGUuY2hpbGRyZW4ucHVzaChRKX19KSxXLmNoaWxkcmVufWxldCBvbD17bm9kZXM6e3R5cGU6W0FycmF5LFN0cmluZ10sZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybltdfX19LFJhPTE2LGFsPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSaWNoVGV4dCIscHJvcHM6b2wsc2V0dXAoeSl7bGV0IE09Ty5nZXRDdXJyZW50SW5zdGFuY2UoKTtyZXR1cm4oKT0+e2xldCBXPXkubm9kZXM7cmV0dXJuIE50LmlzU3RyaW5nKFcpJiYoVz1KYShXKSksTy5jcmVhdGVWTm9kZSgidS1yaWNoLXRleHQiLHt2YWx1ZTpfYShXfHxbXSxNLnJvb3Qse2RlZmF1bHRGb250U2l6ZTpSYX0pfSxudWxsKX19fSk7ZnVuY3Rpb24gX2EoeSxNLFcpe2xldCBIPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdLFE9e2Jsb2NrcXVvdGU6amUsYnI6RXQsZGl2OmplLGRsOmplLGgxOkN0KDIpLGgyOkN0KDEuNSksaDM6Q3QoMS4xNyksaDQ6Q3QoMSksaDU6Q3QoLjgzKSxoNjpDdCguNjcpLGhyOmplLG9sOmplLHA6amUsc3Ryb25nOld0LHRhYmxlOmplLHRib2R5OmplLHRmb290OmplLHRoZWFkOmplLHVsOmplfSx0ZT0vJihhbXB8Z3R8bHR8bmJzcHxxdW90fGFwb3MpOy9nLGZlPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9LHBlPXt0eXBlOiJzcGFuIixfX3R5cGU6ImJyZWFrIixhdHRyOnt2YWx1ZTpgCmB9fSxDZT17X19ibG9jazohMCxfX2JyZWFrOiEwLGNoaWxkcmVuOltdfSxCZT1udWxsO2Z1bmN0aW9uIFNlKEF0KXtsZXQgbm49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihBdC5hdHRycyl7bGV0IGFyPShBdC5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIik7T2JqZWN0LmFzc2lnbihubixPLnBhcnNlQ2xhc3NMaXN0KGFyLE0pLHNpKEF0LmF0dHJzLnN0eWxlfHwiIikpfWlmKEF0Lm5hbWU9PT0iaW1nInx8QXQubmFtZT09PSJpbWFnZSIpe2xldCBhcj1BdC5hdHRycztubi53aWR0aD1ubi53aWR0aHx8YXIud2lkdGgsbm4uaGVpZ2h0PW5uLmhlaWdodHx8YXIuaGVpZ2h0fXJldHVybiBubn1mdW5jdGlvbiBqZShBdCl7cmV0dXJuIEF0Ll9fYmxvY2s9ITAsQXR9ZnVuY3Rpb24gYnQoQXQsbm4pe3JldHVybiBBdC5zdHlsZSYmIUF0LnN0eWxlLmZvbnRTaXplJiYoQXQuc3R5bGUuZm9udFNpemU9Vy5kZWZhdWx0Rm9udFNpemUqbm4pLGplKFd0KEF0KSl9ZnVuY3Rpb24gQ3QoQXQpe3JldHVybiBmdW5jdGlvbihubil7cmV0dXJuIGJ0KG5uLEF0KX19ZnVuY3Rpb24gV3QoQXQpe3JldHVybiBBdC5zdHlsZSYmIUF0LnN0eWxlLmZvbnRXZWlnaHQmJihBdC5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksQXR9ZnVuY3Rpb24gRXQoQXQpe3JldHVybiBBdC5fX3ZhbHVlPSIgIixqZShBdCl9ZnVuY3Rpb24gS2UoQXQpe3JldHVybiBBdC5yZXBsYWNlKHRlLGZ1bmN0aW9uKG5uLGFyKXtyZXR1cm4gZmVbYXJdfSl9ZnVuY3Rpb24gTXQoQXQpe2xldCBubj0oQXQubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksYXI9bm4sSnQ9UVtubl07SC5pbmRleE9mKG5uKT09PS0xJiYobm49InNwYW4iKSxubj09PSJpbWciJiYobm49ImltYWdlIik7bGV0IEd0PXt0eXBlOm5uLF9fdHlwZTphcixhdHRyOk9iamVjdC5jcmVhdGUobnVsbCl9O3JldHVybihBdC50eXBlPT09InRleHQifHxBdC50ZXh0KSYmKEd0Ll9fdmFsdWU9R3QuYXR0ci52YWx1ZT1LZSgoQXQudGV4dHx8IiIpLnRyaW0oKSkpLEF0LmF0dHJzJiZPYmplY3Qua2V5cyhBdC5hdHRycykuZm9yRWFjaChSbj0+e1JuIT09ImNsYXNzIiYmUm4hPT0ic3R5bGUiJiYoR3QuYXR0cltSbl09QXQuYXR0cnNbUm5dKX0pLEd0LnN0eWxlPVNlKEF0KSxKdCYmSnQoR3QpLChDZS5fX2Jsb2NrfHxHdC5fX2Jsb2NrKSYmKEJlfHwoQ2UuY2hpbGRyZW4ucHVzaChwZSksQmU9W0NlLHBlXSkpLENlPUd0LChDZS5fX3ZhbHVlfHxDZS50eXBlPT09ImltYWdlIiYmQ2UuYXR0ci5zcmMpJiYoQmU9bnVsbCksR3QuY2hpbGRyZW49X24oQXQuY2hpbGRyZW4pLENlPUd0LENlLl9fYmxvY2smJkNlLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChDZS5zdHlsZS5oZWlnaHQpJiYoQmU9bnVsbCksR3R9ZnVuY3Rpb24gX24oQXQpe3JldHVybiBOdC5pc0FycmF5KEF0KT9BdC5tYXAobm49Pk10KG5uKSk6W119bGV0IHduPV9uKHkpO2lmKEJlKXtsZXRbQXQsbm5dPUJlLGFyPUF0LmNoaWxkcmVuLEp0PWFyLmluZGV4T2Yobm4pO2FyLnNwbGljZShKdCwxKX1yZXR1cm4gd259bGV0IHZzPXt9O2Z1bmN0aW9uIG1zKHksTSxXKXtsZXR7YWRwaWQ6SCx3aWR0aDpRfT15LHRlPUgrIi0iK1EsZmU9dnNbdGVdO2lmKGZlJiZmZS5sZW5ndGg+MCl7TShmZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWQuYWQuZ2V0QWRzKHkscGU9PntsZXQgQ2U9cGUuYWRzO00oQ2Uuc3BsaWNlKDAsMSlbMF0pLHZzW3RlXT1mZT9mZS5jb25jYXQoQ2UpOkNlfSxwZT0+e1coe2VyckNvZGU6cGUuY29kZSxlcnJNc2c6cGUubWVzc2FnZX0pfSl9bGV0IHppPXthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNoYW5uZWw6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxDcj17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IiLGRvd25sb2FkY2hhbmdlOiJkb3dubG9hZGNoYW5nZSJ9LGJhPU8uZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJBZCIscHJvcHM6emksZW1pdHM6W0NyLmxvYWQsQ3IuY2xvc2UsQ3IuZXJyb3IsQ3IuZG93bmxvYWRjaGFuZ2VdLHNldHVwKHkse2VtaXQ6TX0pe2xldCBXPU8ucmVmKG51bGwpLEg9Sm4oVyxNKSxRPUxvKCk7Ty53YXRjaCgoKT0+eS5hZHBpZCxmZT0+e3hhKFEseSxIKX0pLE8ud2F0Y2goKCk9PnkuZGF0YSxmZT0+e1EuZGF0YT1mZX0pLE8ub25Nb3VudGVkKCgpPT57digoKT0+e1BuKFcudmFsdWUpLnRoZW4oKHt3aWR0aDpmZX0pPT57US53aWR0aD1mZT09PTA/LTE6ZmUseGEoUSx5LEgpfSl9LDUwKX0pO2xldCB0ZT17b25Eb3dubG9hZGNoYW5nZShmZSl7SChDci5kb3dubG9hZGNoYW5nZSxmZSl9LG9uRGlzbGlrZShmZSl7SChDci5jbG9zZSxmZSl9fTtyZXR1cm4oKT0+Ty5jcmVhdGVWTm9kZSgidS1hZCIsTy5tZXJnZVByb3BzKHtyZWY6V30se2RhdGE6US5kYXRhLHJlbmRlcmluZzohMH0sdGUpLG51bGwpfX0pO2Z1bmN0aW9uIExvKHkpe2xldCBNPU8ucmVmKCIiKTtyZXR1cm4gTy5yZWFjdGl2ZSh7d2lkdGg6MCxkYXRhOk19KX1mdW5jdGlvbiB4YSh5LE0sVyl7bXMoe2FkcGlkOk0uYWRwaWQsd2lkdGg6eS53aWR0aH0sSD0+e3kuZGF0YT1ILFcoQ3IubG9hZCx7fSl9LEg9PntXKENyLmVycm9yLEgpfSl9bGV0IHNsPXt9O2Z1bmN0aW9uICRzKHksTSxXLEgsUSl7bGV0IHRlPXkrIi0iK00sZmU9c2xbdGVdO2lmKGZlJiZmZS5sZW5ndGg+MCl7SChmZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWQuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6U3RyaW5nKHkpLGNvdW50OjMsd2lkdGg6TX0scGU9PntsZXQgQ2U9cGUuYWRzO0goQ2Uuc3BsaWNlKDAsMSlbMF0pLHNsW3RlXT1mZT9mZS5jb25jYXQoQ2UpOkNlfSxwZT0+e1Eoe2VyckNvZGU6cGUuY29kZSxlcnJNc2c6cGUubWVzc2FnZX0pfSl9bGV0IGtsPXthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSx5YT17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IifSxfcz1PLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWREcmF3Iixwcm9wczprbCxlbWl0czpbeWEubG9hZCx5YS5jbG9zZSx5YS5lcnJvcl0sc2V0dXAoeSx7ZW1pdDpNfSl7bGV0IFc9Ty5yZWYobnVsbCksSD1KbihXLE0pLFE9SHMoKTtPLndhdGNoKCgpPT55LmFkcGlkLGZlPT57bGwoUSx5LEgpfSksTy53YXRjaCgoKT0+eS5kYXRhLGZlPT57US5kYXRhPWZlfSk7bGV0IHRlPXtvbkRpc2xpa2UoZmUpe0goeWEuY2xvc2UsZmUpfX07cmV0dXJuIE8ub25Nb3VudGVkKCgpPT57digoKT0+e1BuKFcudmFsdWUpLnRoZW4oKHt3aWR0aDpmZSxoZWlnaHQ6cGV9KT0+e1Eud2lkdGg9ZmU9PT0wPy0xOmZlLFEuaGVpZ2h0PXBlPT09MD8tMTpwZSxsbChRLHksSCl9KX0sNTApfSksKCk9PntsZXR7ZGF0YTpmZX09UTtyZXR1cm4gTy5jcmVhdGVWTm9kZSgidS1hZC1kcmF3IixPLm1lcmdlUHJvcHMoe3JlZjpXfSx7ZGF0YTpmZSxyZW5kZXJpbmc6ITB9LHRlKSxudWxsKX19fSk7ZnVuY3Rpb24gSHMoeSl7bGV0IE09Ty5yZWYoIiIpO3JldHVybiBPLnJlYWN0aXZlKHt3aWR0aDowLGhlaWdodDowLGRhdGE6TX0pfWZ1bmN0aW9uIGxsKHksTSxXKXskcyhNLmFkcGlkLHkud2lkdGgseS5oZWlnaHQsSD0+e3kuZGF0YT1ILFcoeWEubG9hZCx7fSl9LEg9PntXKHlhLmVycm9yLEgpfSl9cmV0dXJue05hdmlnYXRvcjp3aSxMYWJlbDpscixCdXR0b246bW8sTW92YWJsZUFyZWE6Y3IsTW92YWJsZVZpZXc6WWEsUHJvZ3Jlc3M6Ym8sUGlja2VyVmlldzpIaSxQaWNrZXJWaWV3Q29sdW1uOlNvLFBpY2tlcjpabixVU2xpZGVyOlhyLFN3aXRjaDpPaSxDaGVja2JveDpDbyxDaGVja2JveEdyb3VwOnBpLFJhZGlvOmhlLFJhZGlvR3JvdXA6SyxGb3JtOnhlLEljb246TXIsU3dpcGVyOnVvLFN3aXBlckl0ZW06cWEsUmljaFRleHQ6YWwsQWQ6YmEsQWREcmF3Ol9zfX0oayxXZSxQdCk7cmV0dXJuIGdlfWZ1bmN0aW9uIHVQKHYsbCl7bGV0e1VuaVNoYXJlZDpiLFZ1ZTpUfT1sO2Z1bmN0aW9uIGsoZCxtLFIpe2xldCBXZT1kLiRbbV07cmV0dXJuIFdlJiZiLmludm9rZUFycmF5Rm5zKFdlLFIpfWxldCBDPXYuc2V0dXA7cmV0dXJuIHYuaW5oZXJpdEF0dHJzPSExLHYuc2V0dXA9KGQsbSk9PntsZXR7YXR0cnM6e19fcGFnZUlkOlIsX19wYWdlUGF0aDpXZSxfX3BhZ2VRdWVyeTpQdH19PW0sZW49bC5fX3VuaVJvdXRlcy5maW5kKE50PT5OdC5tZXRhLnJvdXRlPT09V2UpLGdlPVQuZ2V0Q3VycmVudEluc3RhbmNlKCksTz1nZS5wcm94eTtpZihlbiYmKGVuLm1ldGEuaXNTdWJOVnVlfHxmUChPLGwse19fcGFnZUlkOlIsX19wYWdlUGF0aDpXZX0pKSxULm9uTW91bnRlZCgoKT0+e1QubmV4dFRpY2soKCk9PntrKE8sYi5PTl9SRUFEWSl9KSxnZS5vblBhZ2VTY3JvbGwmJk8uJGVsLmFkZEV2ZW50KCJzY3JvbGwiLE50PT57TnQuc2Nyb2xsVG9wPU50LmRldGFpbC5zY3JvbGxUb3AsayhPLGIuT05fUEFHRV9TQ1JPTEwsTnQpfSksZ2Uub25SZWFjaEJvdHRvbSYmTy4kZWwuYWRkRXZlbnQoInNjcm9sbHRvbG93ZXIiLE50PT57ayhPLGIuT05fUkVBQ0hfQk9UVE9NLE50KX0pfSksVC5vbkJlZm9yZVVubW91bnQoKCk9PntrKE8sYi5PTl9VTkxPQUQpfSksQylyZXR1cm4gQyhQdCxtKX0sdn1mdW5jdGlvbiBmUCh2LGwse19fcGFnZUlkOmIsX19wYWdlUGF0aDpUfSl7bGV0IGs9bC5nZXRDdXJyZW50UGFnZXMoKSxDPWtbay5sZW5ndGgtMV07aWYoQyYmQy5fX3NldHVwKUMuX19zZXR1cCh2LEMpO2Vsc2V7bGV0IGQ9Ii8iK1Q7cmV0dXJuIGwuX19yZWdpc3RlclBhZ2Uoe3VybDpkLHBhdGg6ZCxxdWVyeTp7fSxvcGVuVHlwZToibGF1bmNoIix3ZWJ2aWV3OntpZDpiKyIifSxudnVlUGFnZVZtOnZ9KX19dmFyIExjPXt9LFlnO2Z1bmN0aW9uIHFnKHYpe1lnPXZ9dmFyIGFmO2Z1bmN0aW9uIGRQKHYpe2lmKGFmKXJldHVybiBhZjtsZXQgbD1uZXcgdi5FbWl0dGVyO3JldHVybiBhZj17b24oYixUKXtyZXR1cm4gbC5vbihiLFQpfSxvbmNlKGIsVCl7cmV0dXJuIGwub25jZShiLFQpfSxvZmYoYixUKXtyZXR1cm4gbC5vZmYoYixUKX0sZW1pdChiLC4uLlQpe3JldHVybiBsLmVtaXQoYiwuLi5UKX19LGFmfWZ1bmN0aW9uIGhQKHYpe3JldHVybihsLGIsVCk9PntsZXR7bnZ1ZTprfT1iLEM9b2YodixiKTtiLlZ1ZT1DLExjW2xdPXtpbnN0YW5jZUlkOmwsY29uZmlnOmsuY29uZmlnLGRvY3VtZW50OmsuZG9jdW1lbnQsZGF0YTpUfTtsZXR7Y3JlYXRlQXBwOmR9PUM7Qy5jcmVhdGVWdWVBcHA9Qy5jcmVhdGVBcHA9KG0sUik9PihiLl9fdW5pQ29uZmlnLnN0eWxlcz1tLnN0eWxlc3x8W10sZChtLFIpLnVzZShwUCxsLGIpKSxDLmNyZWF0ZVBhZ2VBcHA9KG0sUik9Pnt1UChtLGIpO2xldCBXZT1SLiRzdG9yZTtkZWxldGUgUi4kc3RvcmU7bGV0IFB0PWQobSxSKTtyZXR1cm4gV2UmJlB0LnVzZShXZSksUHQudXNlKHZQLEMsbCxiKX19fXZhciBwUD17aW5zdGFsbCh2LGwsYil7RXUoYikuaW5pdEFwcCh2KSxnUCh2LGwsYil9fTtmdW5jdGlvbiBnUCh2LGwsYil7bGV0e21vdW50OlR9PXYsaz1MY1tsXTtyZXR1cm4gdi5tb3VudD1DPT57bGV0IGQ9Qz09PSIjYXBwIixtPWsuYXBwPVQoSmcoay5kb2N1bWVudCx7aXNSb290OmR9KSk7cmV0dXJuIGQmJmIuX19yZWdpc3RlckFwcChtKSxtfSx2fXZhciB2UD17aW5zdGFsbCh2LGwsYixUKXtsZXR7d2VleDprLHBsdXM6QyxCcm9hZGNhc3RDaGFubmVsOmQsVnVlU2hhcmVkOm0sVW5pU2hhcmVkOlIsZ2V0Q3VycmVudFBhZ2VzOldlLHNldFRpbWVvdXQ6UHQsY2xlYXJUaW1lb3V0OmVuLF9fdW5pQ29uZmlnOmdlfT1UO3YuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJHJlcXVpcmVOYXRpdmVQbHVnaW49ay5yZXF1aXJlTW9kdWxlO2xldCBPPWNQKHt1bmk6WWcsVnVlOmwsd2VleDprLHBsdXM6QyxCcm9hZGNhc3RDaGFubmVsOmQsVW5pVmlld0pTQnJpZGdlOmRQKFIpLFZ1ZVNoYXJlZDptLFVuaVNoYXJlZDpSLGdldEN1cnJlbnRQYWdlczpXZSxzZXRUaW1lb3V0OlB0LGNsZWFyVGltZW91dDplbixfX3VuaUNvbmZpZzpnZX0pO09iamVjdC5rZXlzKE8pLmZvckVhY2goTnQ9Pnt2LmNvbXBvbmVudChsLmh5cGhlbmF0ZShOdCksT1tOdF0pfSksRXUoVCkuaW5pdEFwcCh2KSxtUCh2LGIsVCl9fTtmdW5jdGlvbiBtUCh2LGwse252dWU6Yn0pe2xldHtjb25maWc6e2NvbXBpbGVyT3B0aW9uczpUfSxtb3VudDprfT12O1QuaXNDdXN0b21FbGVtZW50PWQ9PiEhYi5zdXBwb3J0cyhgQGNvbXBvbmVudC8ke2R9YCk7bGV0IEM9TGNbbF07cmV0dXJuIHYubW91bnQ9ZD0+e2xldCBtPWQ9PT0iI3Jvb3QiLFI9Qy5hcHA9ayhKZyhDLmRvY3VtZW50LHtpc1Jvb3Q6bX0pKTtpZihtKXRyeXtiLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVGaW5pc2gifSxbXSl9Y2F0Y2goV2Upe31yZXR1cm4gUn0sdn1mdW5jdGlvbiBKZyh2LHtpc1Jvb3Q6bH0pe2lmKGwpcmV0dXJuIHYuZG9jdW1lbnRFbGVtZW50O2xldCBiPXYuY3JlYXRlQ29tbWVudCgicm9vdCIpO3JldHVybiB2LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChiKSxifWZ1bmN0aW9uIEtnKHYpe2xldCBsPUxjW3ZdO2lmKGwmJmwuYXBwJiZsLmRvY3VtZW50KXt0cnl7bC5hcHAuJC5hcHBDb250ZXh0LmFwcC51bm1vdW50KCksbC5kb2N1bWVudC5kZXN0cm95KCl9Y2F0Y2goYil7fWRlbGV0ZSBsLmRvY3VtZW50LGRlbGV0ZSBsLmFwcH1kZWxldGUgTGNbdl19ZnVuY3Rpb24gWmcodil7bGV0IGw9TGNbdl07aWYoIWx8fCFsLmFwcClyZXR1cm4gbmV3IEVycm9yKGByZWZyZXNoSW5zdGFuY2U6IGluc3RhbmNlICR7dn0gbm90IGZvdW5kIWApO2wuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246InJlZnJlc2hGaW5pc2gifSxbXSl9ZnVuY3Rpb24gX1AodixsKXtsZXR7VW5pU2hhcmVkOmIsVnVlU2hhcmVkOlQsVnVlUmVhY3Rpdml0eTprfT12O3ZhciBDPWZ1bmN0aW9uKGQsbSxSLFdlKXsidXNlIHN0cmljdCI7dmFyIFB0PVtdO2Z1bmN0aW9uIGVuKG8pe1B0LnB1c2gobyl9ZnVuY3Rpb24gZ2UoKXtQdC5wb3AoKX1mdW5jdGlvbiBPKG8pe1IucGF1c2VUcmFja2luZygpO2Zvcih2YXIgYz1QdC5sZW5ndGg/UHRbUHQubGVuZ3RoLTFdLmNvbXBvbmVudDpudWxsLGg9YyYmYy5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcixfPU50KCksST1hcmd1bWVudHMubGVuZ3RoLEE9bmV3IEFycmF5KEk+MT9JLTE6MCkseD0xO3g8STt4KyspQVt4LTFdPWFyZ3VtZW50c1t4XTtpZihoKUt0KGgsYywxMSxbbytBLmpvaW4oIiIpLGMmJmMucHJveHksXy5tYXAoJD0+e3Zhcnt2bm9kZTplZX09JDtyZXR1cm4iYXQgPCIuY29uY2F0KFNhKGMsZWUudHlwZSksIj4iKX0pLmpvaW4oYApgKSxfXSk7ZWxzZXt2YXIgej1bIltWdWUgd2Fybl06ICIuY29uY2F0KG8pLC4uLkFdO18ubGVuZ3RoJiZ6LnB1c2goYApgLC4uLmpuKF8pKSxjb25zb2xlLndhcm4oLi4ueil9Ui5yZXNldFRyYWNraW5nKCl9ZnVuY3Rpb24gTnQoKXt2YXIgbz1QdFtQdC5sZW5ndGgtMV07aWYoIW8pcmV0dXJuW107Zm9yKHZhciBjPVtdO287KXt2YXIgaD1jWzBdO2gmJmgudm5vZGU9PT1vP2gucmVjdXJzZUNvdW50Kys6Yy5wdXNoKHt2bm9kZTpvLHJlY3Vyc2VDb3VudDowfSk7dmFyIF89by5jb21wb25lbnQmJm8uY29tcG9uZW50LnBhcmVudDtvPV8mJl8udm5vZGV9cmV0dXJuIGN9ZnVuY3Rpb24gam4obyl7dmFyIGM9W107cmV0dXJuIG8uZm9yRWFjaCgoaCxfKT0+e2MucHVzaCguLi5fPT09MD9bXTpbYApgXSwuLi5fdChoKSl9KSxjfWZ1bmN0aW9uIF90KG8pe3Zhcnt2bm9kZTpjLHJlY3Vyc2VDb3VudDpofT1vLF89aD4wPyIuLi4gKCIuY29uY2F0KGgsIiByZWN1cnNpdmUgY2FsbHMpIik6IiIsST1jLmNvbXBvbmVudD9jLmNvbXBvbmVudC5wYXJlbnQ9PW51bGw6ITEsQT0iIGF0IDwiLmNvbmNhdChTYShjLmNvbXBvbmVudCxjLnR5cGUsSSkpLHg9Ij4iK187cmV0dXJuIGMucHJvcHM/W0EsLi4uSihjLnByb3BzKSx4XTpbQSt4XX1mdW5jdGlvbiBKKG8pe3ZhciBjPVtdLGg9T2JqZWN0LmtleXMobyk7cmV0dXJuIGguc2xpY2UoMCwzKS5mb3JFYWNoKF89PntjLnB1c2goLi4ucmUoXyxvW19dKSl9KSxoLmxlbmd0aD4zJiZjLnB1c2goIiAuLi4iKSxjfWZ1bmN0aW9uIHJlKG8sYyxoKXtyZXR1cm4gbS5pc1N0cmluZyhjKT8oYz1KU09OLnN0cmluZ2lmeShjKSxoP2M6WyIiLmNvbmNhdChvLCI9IikuY29uY2F0KGMpXSk6dHlwZW9mIGM9PSJudW1iZXIifHx0eXBlb2YgYz09ImJvb2xlYW4ifHxjPT1udWxsP2g/YzpbIiIuY29uY2F0KG8sIj0iKS5jb25jYXQoYyldOlIuaXNSZWYoYyk/KGM9cmUobyxSLnRvUmF3KGMudmFsdWUpLCEwKSxoP2M6WyIiLmNvbmNhdChvLCI9UmVmPCIpLGMsIj4iXSk6bS5pc0Z1bmN0aW9uKGMpP1siIi5jb25jYXQobywiPWZuIikuY29uY2F0KGMubmFtZT8iPCIuY29uY2F0KGMubmFtZSwiPiIpOiIiKV06KGM9Ui50b1JhdyhjKSxoP2M6WyIiLmNvbmNhdChvLCI9IiksY10pfWZ1bmN0aW9uIERuKG8sYyl7byE9PXZvaWQgMCYmKHR5cGVvZiBvIT0ibnVtYmVyIj9PKCIiLmNvbmNhdChjLCIgaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIikrImdvdCAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShvKSwiLiIpKTppc05hTihvKSYmTygiIi5jb25jYXQoYywiIGlzIE5hTiAtICIpKyJ0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuIikpfXZhciBmbj17c3A6InNlcnZlclByZWZldGNoIGhvb2siLGJjOiJiZWZvcmVDcmVhdGUgaG9vayIsYzoiY3JlYXRlZCBob29rIixibToiYmVmb3JlTW91bnQgaG9vayIsbToibW91bnRlZCBob29rIixidToiYmVmb3JlVXBkYXRlIGhvb2siLHU6InVwZGF0ZWQiLGJ1bToiYmVmb3JlVW5tb3VudCBob29rIix1bToidW5tb3VudGVkIGhvb2siLGE6ImFjdGl2YXRlZCBob29rIixkYToiZGVhY3RpdmF0ZWQgaG9vayIsZWM6ImVycm9yQ2FwdHVyZWQgaG9vayIscnRjOiJyZW5kZXJUcmFja2VkIGhvb2siLHJ0ZzoicmVuZGVyVHJpZ2dlcmVkIGhvb2siLFswXToic2V0dXAgZnVuY3Rpb24iLFsxXToicmVuZGVyIGZ1bmN0aW9uIixbMl06IndhdGNoZXIgZ2V0dGVyIixbM106IndhdGNoZXIgY2FsbGJhY2siLFs0XToid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uIixbNV06Im5hdGl2ZSBldmVudCBoYW5kbGVyIixbNl06ImNvbXBvbmVudCBldmVudCBoYW5kbGVyIixbN106InZub2RlIGhvb2siLFs4XToiZGlyZWN0aXZlIGhvb2siLFs5XToidHJhbnNpdGlvbiBob29rIixbMTBdOiJhcHAgZXJyb3JIYW5kbGVyIixbMTFdOiJhcHAgd2FybkhhbmRsZXIiLFsxMl06InJlZiBmdW5jdGlvbiIsWzEzXToiYXN5bmMgY29tcG9uZW50IGxvYWRlciIsWzE0XToic2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL25ldy1pc3N1ZS52dWVqcy5vcmcvP3JlcG89dnVlanMvY29yZSJ9O2Z1bmN0aW9uIEt0KG8sYyxoLF8pe3ZhciBJO3RyeXtJPV8/byguLi5fKTpvKCl9Y2F0Y2goQSl7SXIoQSxjLGgpfXJldHVybiBJfWZ1bmN0aW9uIGNuKG8sYyxoLF8pe2lmKG0uaXNGdW5jdGlvbihvKSl7dmFyIEk9S3QobyxjLGgsXyk7cmV0dXJuIEkmJm0uaXNQcm9taXNlKEkpJiZJLmNhdGNoKHo9PntJcih6LGMsaCl9KSxJfWZvcih2YXIgQT1bXSx4PTA7eDxvLmxlbmd0aDt4KyspQS5wdXNoKGNuKG9beF0sYyxoLF8pKTtyZXR1cm4gQX1mdW5jdGlvbiBJcihvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiEwLEk9Yz9jLnZub2RlOm51bGw7aWYoYyl7Zm9yKHZhciBBPWMucGFyZW50LHg9Yy5wcm94eSx6PWZuW2hdfHxoO0E7KXt2YXIgJD1BLmVjO2lmKCQpe2Zvcih2YXIgZWU9MDtlZTwkLmxlbmd0aDtlZSsrKWlmKCRbZWVdKG8seCx6KT09PSExKXJldHVybn1BPUEucGFyZW50fXZhciBJZT1jLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtpZihJZSl7S3QoSWUsbnVsbCwxMCxbbyx4LHpdKTtyZXR1cm59fXdpKG8saCxJLF8pfWZ1bmN0aW9uIHdpKG8sYyxoKXt2YXIgXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITA7e3ZhciBJPWZuW2NdfHxjO2lmKGgmJmVuKGgpLE8oIlVuaGFuZGxlZCBlcnJvciIuY29uY2F0KEk/IiBkdXJpbmcgZXhlY3V0aW9uIG9mICIuY29uY2F0KEkpOiIiKSksaCYmZ2UoKSxfKXRocm93IG87Y29uc29sZS5lcnJvcihvKX19dmFyIHFuPSExLGhuPSExLFZ0PVtdLE5uPTAseW49W10seG49bnVsbCxQcj0wLEplPVByb21pc2UucmVzb2x2ZSgpLGR0PW51bGwsU3Q9MTAwO2Z1bmN0aW9uIHRuKG8pe3ZhciBjPWR0fHxKZTtyZXR1cm4gbz9jLnRoZW4odGhpcz9vLmJpbmQodGhpcyk6byk6Y31mdW5jdGlvbiBrbihvKXtmb3IodmFyIGM9Tm4rMSxoPVZ0Lmxlbmd0aDtjPGg7KXt2YXIgXz1jK2g+Pj4xLEk9RXIoVnRbX10pO0k8bz9jPV8rMTpoPV99cmV0dXJuIGN9ZnVuY3Rpb24gWnQobyl7KCFWdC5sZW5ndGh8fCFWdC5pbmNsdWRlcyhvLHFuJiZvLmFsbG93UmVjdXJzZT9ObisxOk5uKSkmJihvLmlkPT1udWxsP1Z0LnB1c2gobyk6VnQuc3BsaWNlKGtuKG8uaWQpLDAsbyksTG4oKSl9ZnVuY3Rpb24gTG4oKXshcW4mJiFobiYmKGhuPSEwLGR0PUplLnRoZW4oR28pKX1mdW5jdGlvbiBOcihvKXt2YXIgYz1WdC5pbmRleE9mKG8pO2M+Tm4mJlZ0LnNwbGljZShjLDEpfWZ1bmN0aW9uIFVyKG8pe20uaXNBcnJheShvKT95bi5wdXNoKC4uLm8pOigheG58fCF4bi5pbmNsdWRlcyhvLG8uYWxsb3dSZWN1cnNlP1ByKzE6UHIpKSYmeW4ucHVzaChvKSxMbigpfWZ1bmN0aW9uIEZpKG8pe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpxbj9ObisxOjA7Zm9yKG89b3x8bmV3IE1hcDtjPFZ0Lmxlbmd0aDtjKyspe3ZhciBoPVZ0W2NdO2lmKGgmJmgucHJlKXtpZihZbyhvLGgpKWNvbnRpbnVlO1Z0LnNwbGljZShjLDEpLGMtLSxoKCl9fX1mdW5jdGlvbiBscihvKXtpZih5bi5sZW5ndGgpe3ZhciBjPVsuLi5uZXcgU2V0KHluKV07aWYoeW4ubGVuZ3RoPTAseG4pe3huLnB1c2goLi4uYyk7cmV0dXJufWZvcih4bj1jLG89b3x8bmV3IE1hcCx4bi5zb3J0KChoLF8pPT5FcihoKS1FcihfKSksUHI9MDtQcjx4bi5sZW5ndGg7UHIrKylZbyhvLHhuW1ByXSl8fHhuW1ByXSgpO3huPW51bGwsUHI9MH19dmFyIEVyPW89Pm8uaWQ9PW51bGw/MS8wOm8uaWQsVmk9KG8sYyk9Pnt2YXIgaD1FcihvKS1FcihjKTtpZihoPT09MCl7aWYoby5wcmUmJiFjLnByZSlyZXR1cm4tMTtpZihjLnByZSYmIW8ucHJlKXJldHVybiAxfXJldHVybiBofTtmdW5jdGlvbiBHbyhvKXtobj0hMSxxbj0hMCxvPW98fG5ldyBNYXAsVnQuc29ydChWaSk7dmFyIGM9Xz0+WW8obyxfKTt0cnl7Zm9yKE5uPTA7Tm48VnQubGVuZ3RoO05uKyspe3ZhciBoPVZ0W05uXTtpZihoJiZoLmFjdGl2ZSE9PSExKXtpZihjKGgpKWNvbnRpbnVlO0t0KGgsbnVsbCwxNCl9fX1maW5hbGx5e05uPTAsVnQubGVuZ3RoPTAsbHIobykscW49ITEsZHQ9bnVsbCwoVnQubGVuZ3RofHx5bi5sZW5ndGgpJiZHbyhvKX19ZnVuY3Rpb24gWW8obyxjKXtpZighby5oYXMoYykpby5zZXQoYywxKTtlbHNle3ZhciBoPW8uZ2V0KGMpO2lmKGg+U3Qpe3ZhciBfPWMub3duZXJJbnN0YW5jZSxJPV8mJnRzKF8udHlwZSk7cmV0dXJuIE8oIk1heGltdW0gcmVjdXJzaXZlIHVwZGF0ZXMgZXhjZWVkZWQiLmNvbmNhdChJPyIgaW4gY29tcG9uZW50IDwiLmNvbmNhdChJLCI+Iik6IiIsIi4gIikrIlRoaXMgbWVhbnMgeW91IGhhdmUgYSByZWFjdGl2ZSBlZmZlY3QgdGhhdCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY2llcyBhbmQgdGh1cyByZWN1cnNpdmVseSB0cmlnZ2VyaW5nIGl0c2VsZi4gUG9zc2libGUgc291cmNlcyBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3Igd2F0Y2hlciBzb3VyY2UgZnVuY3Rpb24uIiksITB9ZWxzZSBvLnNldChjLGgrMSl9fXZhciBrcj0hMSxScj1uZXcgU2V0O20uZ2V0R2xvYmFsVGhpcygpLl9fVlVFX0hNUl9SVU5USU1FX189e2NyZWF0ZVJlY29yZDpxbyhUYSkscmVyZW5kZXI6cW8obW8pLHJlbG9hZDpxbyhJYSl9O3ZhciB4cj1uZXcgTWFwO2Z1bmN0aW9uIFVpKG8pe3ZhciBjPW8udHlwZS5fX2htcklkLGg9eHIuZ2V0KGMpO2h8fChUYShjLG8udHlwZSksaD14ci5nZXQoYykpLGguaW5zdGFuY2VzLmFkZChvKX1mdW5jdGlvbiBZcihvKXt4ci5nZXQoby50eXBlLl9faG1ySWQpLmluc3RhbmNlcy5kZWxldGUobyl9ZnVuY3Rpb24gVGEobyxjKXtyZXR1cm4geHIuaGFzKG8pPyExOih4ci5zZXQobyx7aW5pdGlhbERlZjokaShjKSxpbnN0YW5jZXM6bmV3IFNldH0pLCEwKX1mdW5jdGlvbiAkaShvKXtyZXR1cm4ga3Mobyk/by5fX3ZjY09wdHM6b31mdW5jdGlvbiBtbyhvLGMpe3ZhciBoPXhyLmdldChvKTshaHx8KGguaW5pdGlhbERlZi5yZW5kZXI9YyxbLi4uaC5pbnN0YW5jZXNdLmZvckVhY2goXz0+e2MmJihfLnJlbmRlcj1jLCRpKF8udHlwZSkucmVuZGVyPWMpLF8ucmVuZGVyQ2FjaGU9W10sa3I9ITAsXy51cGRhdGUoKSxrcj0hMX0pKX1mdW5jdGlvbiBJYShvLGMpe3ZhciBoPXhyLmdldChvKTtpZighIWgpe2M9JGkoYyksbm8oaC5pbml0aWFsRGVmLGMpO3ZhciBfPVsuLi5oLmluc3RhbmNlc107Zm9yKHZhciBJIG9mIF8pe3ZhciBBPSRpKEkudHlwZSk7UnIuaGFzKEEpfHwoQSE9PWguaW5pdGlhbERlZiYmbm8oQSxjKSxSci5hZGQoQSkpLEkuYXBwQ29udGV4dC5vcHRpb25zQ2FjaGUuZGVsZXRlKEkudHlwZSksSS5jZVJlbG9hZD8oUnIuYWRkKEEpLEkuY2VSZWxvYWQoYy5zdHlsZXMpLFJyLmRlbGV0ZShBKSk6SS5wYXJlbnQ/WnQoSS5wYXJlbnQudXBkYXRlKTpJLmFwcENvbnRleHQucmVsb2FkP0kuYXBwQ29udGV4dC5yZWxvYWQoKTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3cubG9jYXRpb24ucmVsb2FkKCk6Y29uc29sZS53YXJuKCJbSE1SXSBSb290IG9yIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UgbW9kaWZpZWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLiIpfVVyKCgpPT57Zm9yKHZhciB4IG9mIF8pUnIuZGVsZXRlKCRpKHgudHlwZSkpfSl9fWZ1bmN0aW9uIG5vKG8sYyl7bS5leHRlbmQobyxjKTtmb3IodmFyIGggaW4gbyloIT09Il9fZmlsZSImJiEoaCBpbiBjKSYmZGVsZXRlIG9baF19ZnVuY3Rpb24gcW8obyl7cmV0dXJuKGMsaCk9Pnt0cnl7cmV0dXJuIG8oYyxoKX1jYXRjaChfKXtjb25zb2xlLmVycm9yKF8pLGNvbnNvbGUud2FybigiW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuIil9fX1kLmRldnRvb2xzPXZvaWQgMDt2YXIgc2k9W10sUG49ITE7ZnVuY3Rpb24gY3Iobyl7Zm9yKHZhciBjPWFyZ3VtZW50cy5sZW5ndGgsaD1uZXcgQXJyYXkoYz4xP2MtMTowKSxfPTE7XzxjO18rKyloW18tMV09YXJndW1lbnRzW19dO2QuZGV2dG9vbHM/ZC5kZXZ0b29scy5lbWl0KG8sLi4uaCk6UG58fHNpLnB1c2goe2V2ZW50Om8sYXJnczpofSl9ZnVuY3Rpb24gbGkobyxjKXt2YXIgaCxfO2lmKGQuZGV2dG9vbHM9byxkLmRldnRvb2xzKWQuZGV2dG9vbHMuZW5hYmxlZD0hMCxzaS5mb3JFYWNoKEE9Pnt2YXJ7ZXZlbnQ6eCxhcmdzOnp9PUE7cmV0dXJuIGQuZGV2dG9vbHMuZW1pdCh4LC4uLnopfSksc2k9W107ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LkhUTUxFbGVtZW50JiYhKChfPShoPXdpbmRvdy5uYXZpZ2F0b3IpPT09bnVsbHx8aD09PXZvaWQgMD92b2lkIDA6aC51c2VyQWdlbnQpPT09bnVsbHx8Xz09PXZvaWQgMD92b2lkIDA6Xy5pbmNsdWRlcygianNkb20iKSkpe3ZhciBJPWMuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1jLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdO0kucHVzaChBPT57bGkoQSxjKX0pLHNldFRpbWVvdXQoKCk9PntkLmRldnRvb2xzfHwoYy5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fPW51bGwsUG49ITAsc2k9W10pfSwzZTMpfWVsc2UgUG49ITAsc2k9W119ZnVuY3Rpb24gSm4obyxjKXtjcigiYXBwOmluaXQiLG8sYyx7RnJhZ21lbnQ6Z3QsVGV4dDp1dCxDb21tZW50Onh0LFN0YXRpYzpZdH0pfWZ1bmN0aW9uIEpvKG8pe2NyKCJhcHA6dW5tb3VudCIsbyl9dmFyIHhvPW9vKCJjb21wb25lbnQ6YWRkZWQiKSxybz1vbygiY29tcG9uZW50OnVwZGF0ZWQiKSxpbz1vbygiY29tcG9uZW50OnJlbW92ZWQiKSxxcj1vPT57ZC5kZXZ0b29scyYmdHlwZW9mIGQuZGV2dG9vbHMuY2xlYW51cEJ1ZmZlcj09ImZ1bmN0aW9uIiYmIWQuZGV2dG9vbHMuY2xlYW51cEJ1ZmZlcihvKSYmaW8obyl9O2Z1bmN0aW9uIG9vKG8pe3JldHVybiBjPT57Y3IobyxjLmFwcENvbnRleHQuYXBwLGMudWlkLGMucGFyZW50P2MucGFyZW50LnVpZDp2b2lkIDAsYyl9fXZhciBGbj1jaSgicGVyZjpzdGFydCIpLHdyPWNpKCJwZXJmOmVuZCIpO2Z1bmN0aW9uIGNpKG8pe3JldHVybihjLGgsXyk9PntjcihvLGMuYXBwQ29udGV4dC5hcHAsYy51aWQsYyxoLF8pfX1mdW5jdGlvbiBLbyhvLGMsaCl7Y3IoImNvbXBvbmVudDplbWl0IixvLmFwcENvbnRleHQuYXBwLG8sYyxoKX1mdW5jdGlvbiBfbyhvLGMpe2lmKCFvLmlzVW5tb3VudGVkKXtmb3IodmFyIGg9by52bm9kZS5wcm9wc3x8bS5FTVBUWV9PQkosXz1hcmd1bWVudHMubGVuZ3RoLEk9bmV3IEFycmF5KF8+Mj9fLTI6MCksQT0yO0E8XztBKyspSVtBLTJdPWFyZ3VtZW50c1tBXTt7dmFye2VtaXRzT3B0aW9uczp4LHByb3BzT3B0aW9uczpbel19PW87aWYoeClpZighKGMgaW4geCkpKCF6fHwhKG0udG9IYW5kbGVyS2V5KGMpaW4geikpJiZPKCdDb21wb25lbnQgZW1pdHRlZCBldmVudCAiJy5jb25jYXQoYywnIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiAnKSsndGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gIicuY29uY2F0KG0udG9IYW5kbGVyS2V5KGMpLCciIHByb3AuJykpO2Vsc2V7dmFyICQ9eFtjXTtpZihtLmlzRnVuY3Rpb24oJCkpe3ZhciBlZT0kKC4uLkkpO2VlfHxPKCdJbnZhbGlkIGV2ZW50IGFyZ3VtZW50czogZXZlbnQgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIGV2ZW50ICInLmNvbmNhdChjLCciLicpKX19fXZhciBJZT1JLGRlPWMuc3RhcnRzV2l0aCgidXBkYXRlOiIpLHVlPWRlJiZjLnNsaWNlKDcpO2lmKHVlJiZ1ZSBpbiBoKXt2YXIgSGU9IiIuY29uY2F0KHVlPT09Im1vZGVsVmFsdWUiPyJtb2RlbCI6dWUsIk1vZGlmaWVycyIpLHtudW1iZXI6WmUsdHJpbTp2dH09aFtIZV18fG0uRU1QVFlfT0JKO3Z0JiYoSWU9SS5tYXAobnQ9Pm0uaXNTdHJpbmcobnQpP250LnRyaW0oKTpudCkpLFplJiYoSWU9SS5tYXAobS5sb29zZVRvTnVtYmVyKSl9S28obyxjLEllKTt7dmFyIHl0PWMudG9Mb3dlckNhc2UoKTt5dCE9PWMmJmhbbS50b0hhbmRsZXJLZXkoeXQpXSYmTygnRXZlbnQgIicuY29uY2F0KHl0LCciIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICcpKyIiLmNvbmNhdChTYShvLG8udHlwZSksJyBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgIicpLmNvbmNhdChjLCciLiAnKSsiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2Ugdi1vbiB0byBsaXN0ZW4gdG8gY2FtZWxDYXNlIGV2ZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuICIrJ1lvdSBzaG91bGQgcHJvYmFibHkgdXNlICInLmNvbmNhdChtLmh5cGhlbmF0ZShjKSwnIiBpbnN0ZWFkIG9mICInKS5jb25jYXQoYywnIi4nKSl9dmFyIE5lLF9lPWhbTmU9bS50b0hhbmRsZXJLZXkoYyldfHxoW05lPW0udG9IYW5kbGVyS2V5KG0uY2FtZWxpemUoYykpXTshX2UmJmRlJiYoX2U9aFtOZT1tLnRvSGFuZGxlcktleShtLmh5cGhlbmF0ZShjKSldKSxfZSYmY24oX2Usbyw2LEllKTt2YXIgTWU9aFtOZSsiT25jZSJdO2lmKE1lKXtpZighby5lbWl0dGVkKW8uZW1pdHRlZD17fTtlbHNlIGlmKG8uZW1pdHRlZFtOZV0pcmV0dXJuO28uZW1pdHRlZFtOZV09ITAsY24oTWUsbyw2LEllKX19fWZ1bmN0aW9uIFpvKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89Yy5lbWl0c0NhY2hlLEk9Xy5nZXQobyk7aWYoSSE9PXZvaWQgMClyZXR1cm4gSTt2YXIgQT1vLmVtaXRzLHg9e30sej0hMTtpZighbS5pc0Z1bmN0aW9uKG8pKXt2YXIgJD1lZT0+e3ZhciBJZT1abyhlZSxjLCEwKTtJZSYmKHo9ITAsbS5leHRlbmQoeCxJZSkpfTshaCYmYy5taXhpbnMubGVuZ3RoJiZjLm1peGlucy5mb3JFYWNoKCQpLG8uZXh0ZW5kcyYmJChvLmV4dGVuZHMpLG8ubWl4aW5zJiZvLm1peGlucy5mb3JFYWNoKCQpfXJldHVybiFBJiYhej8obS5pc09iamVjdChvKSYmXy5zZXQobyxudWxsKSxudWxsKToobS5pc0FycmF5KEEpP0EuZm9yRWFjaChlZT0+eFtlZV09bnVsbCk6bS5leHRlbmQoeCxBKSxtLmlzT2JqZWN0KG8pJiZfLnNldChvLHgpLHgpfWZ1bmN0aW9uIEpyKG8sYyl7cmV0dXJuIW98fCFtLmlzT24oYyk/ITE6KGM9Yy5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIiIpLG0uaGFzT3duKG8sY1swXS50b0xvd2VyQ2FzZSgpK2Muc2xpY2UoMSkpfHxtLmhhc093bihvLG0uaHlwaGVuYXRlKGMpKXx8bS5oYXNPd24obyxjKSl9dmFyIE9uPW51bGwsRW49bnVsbDtmdW5jdGlvbiB1aShvKXt2YXIgYz1PbjtyZXR1cm4gT249byxFbj1vJiZvLnR5cGUuX19zY29wZUlkfHxudWxsLGN9ZnVuY3Rpb24gQm8obyl7RW49b31mdW5jdGlvbiBZYSgpe0VuPW51bGx9dmFyIEtuPW89PktyO2Z1bmN0aW9uIEtyKG8pe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpPbjtpZighY3x8by5fbilyZXR1cm4gbzt2YXIgaD1mdW5jdGlvbigpe2guX2QmJiRvKC0xKTt2YXIgXz11aShjKSxJO3RyeXtJPW8oLi4uYXJndW1lbnRzKX1maW5hbGx5e3VpKF8pLGguX2QmJiRvKDEpfXJldHVybiBybyhjKSxJfTtyZXR1cm4gaC5fbj0hMCxoLl9jPSEwLGguX2Q9ITAsaH12YXIgdXI9ITE7ZnVuY3Rpb24gRHQoKXt1cj0hMH1mdW5jdGlvbiBrZShvKXt2YXJ7dHlwZTpjLHZub2RlOmgscHJveHk6Xyx3aXRoUHJveHk6SSxwcm9wczpBLHByb3BzT3B0aW9uczpbeF0sc2xvdHM6eixhdHRyczokLGVtaXQ6ZWUscmVuZGVyOkllLHJlbmRlckNhY2hlOmRlLGRhdGE6dWUsc2V0dXBTdGF0ZTpIZSxjdHg6WmUsaW5oZXJpdEF0dHJzOnZ0fT1vLHl0LE5lLF9lPXVpKG8pO3VyPSExO3RyeXtpZihoLnNoYXBlRmxhZyY0KXt2YXIgTWU9SXx8Xzt5dD1LaShJZS5jYWxsKE1lLE1lLGRlLEEsSGUsdWUsWmUpKSxOZT0kfWVsc2V7dmFyIG50PWM7JD09PUEmJkR0KCkseXQ9S2kobnQubGVuZ3RoPjE/bnQoQSx7Z2V0IGF0dHJzKCl7cmV0dXJuIER0KCksJH0sc2xvdHM6eixlbWl0OmVlfSk6bnQoQSxudWxsKSksTmU9Yy5wcm9wcz8kOkVvKCQpfX1jYXRjaChOKXtXbi5sZW5ndGg9MCxJcihOLG8sMSkseXQ9R24oeHQpfXZhciBxZT15dCxhdD12b2lkIDA7aWYoeXQucGF0Y2hGbGFnPjAmJnl0LnBhdGNoRmxhZyYyMDQ4JiYoW3FlLGF0XT1ibyh5dCkpLE5lJiZ2dCE9PSExKXt2YXIgSXQ9T2JqZWN0LmtleXMoTmUpLHtzaGFwZUZsYWc6c3R9PXFlO2lmKEl0Lmxlbmd0aCl7aWYoc3QmKDF8NikpeCYmSXQuc29tZShtLmlzTW9kZWxMaXN0ZW5lcikmJihOZT1wYShOZSx4KSkscWU9cWkocWUsTmUpO2Vsc2UgaWYoIXVyJiZxZS50eXBlIT09eHQpe2Zvcih2YXIgaT1PYmplY3Qua2V5cygkKSxhPVtdLGY9W10scD0wLFM9aS5sZW5ndGg7cDxTO3ArKyl7dmFyIHc9aVtwXTttLmlzT24odyk/bS5pc01vZGVsTGlzdGVuZXIodyl8fGEucHVzaCh3WzJdLnRvTG93ZXJDYXNlKCkrdy5zbGljZSgzKSk6Zi5wdXNoKHcpfWYubGVuZ3RoJiZPKCJFeHRyYW5lb3VzIG5vbi1wcm9wcyBhdHRyaWJ1dGVzICgiKyIiLmNvbmNhdChmLmpvaW4oIiwgIiksIikgIikrIndlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiIpLGEubGVuZ3RoJiZPKCJFeHRyYW5lb3VzIG5vbi1lbWl0cyBldmVudCBsaXN0ZW5lcnMgKCIrIiIuY29uY2F0KGEuam9pbigiLCAiKSwiKSAiKSsnd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IHJvb3Qgbm9kZXMuIElmIHRoZSBsaXN0ZW5lciBpcyBpbnRlbmRlZCB0byBiZSBhIGNvbXBvbmVudCBjdXN0b20gZXZlbnQgbGlzdGVuZXIgb25seSwgZGVjbGFyZSBpdCB1c2luZyB0aGUgImVtaXRzIiBvcHRpb24uJyl9fX1yZXR1cm4gaC5kaXJzJiYoWG8ocWUpfHxPKCJSdW50aW1lIGRpcmVjdGl2ZSB1c2VkIG9uIGNvbXBvbmVudCB3aXRoIG5vbi1lbGVtZW50IHJvb3Qgbm9kZS4gVGhlIGRpcmVjdGl2ZXMgd2lsbCBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuIikscWU9cWkocWUpLHFlLmRpcnM9cWUuZGlycz9xZS5kaXJzLmNvbmNhdChoLmRpcnMpOmguZGlycyksaC50cmFuc2l0aW9uJiYoWG8ocWUpfHxPKCJDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC4iKSxxZS50cmFuc2l0aW9uPWgudHJhbnNpdGlvbiksYXQ/YXQocWUpOnl0PXFlLHVpKF9lKSx5dH12YXIgYm89bz0+e3ZhciBjPW8uY2hpbGRyZW4saD1vLmR5bmFtaWNDaGlsZHJlbixfPXlvKGMpO2lmKCFfKXJldHVybltvLHZvaWQgMF07dmFyIEk9Yy5pbmRleE9mKF8pLEE9aD9oLmluZGV4T2YoXyk6LTEseD16PT57Y1tJXT16LGgmJihBPi0xP2hbQV09ejp6LnBhdGNoRmxhZz4wJiYoby5keW5hbWljQ2hpbGRyZW49Wy4uLmgsel0pKX07cmV0dXJuW0tpKF8pLHhdfTtmdW5jdGlvbiB5byhvKXtmb3IodmFyIGMsaD0wO2g8by5sZW5ndGg7aCsrKXt2YXIgXz1vW2hdO2lmKG9hKF8pKXtpZihfLnR5cGUhPT14dHx8Xy5jaGlsZHJlbj09PSJ2LWlmIil7aWYoYylyZXR1cm47Yz1ffX1lbHNlIHJldHVybn1yZXR1cm4gY312YXIgRW89bz0+e3ZhciBjO2Zvcih2YXIgaCBpbiBvKShoPT09ImNsYXNzInx8aD09PSJzdHlsZSJ8fG0uaXNPbihoKSkmJigoY3x8KGM9e30pKVtoXT1vW2hdKTtyZXR1cm4gY30scGE9KG8sYyk9Pnt2YXIgaD17fTtmb3IodmFyIF8gaW4gbykoIW0uaXNNb2RlbExpc3RlbmVyKF8pfHwhKF8uc2xpY2UoOSlpbiBjKSkmJihoW19dPW9bX10pO3JldHVybiBofSxYbz1vPT5vLnNoYXBlRmxhZyYoNnwxKXx8by50eXBlPT09eHQ7ZnVuY3Rpb24gSGkobyxjLGgpe3Zhcntwcm9wczpfLGNoaWxkcmVuOkksY29tcG9uZW50OkF9PW8se3Byb3BzOngsY2hpbGRyZW46eixwYXRjaEZsYWc6JH09YyxlZT1BLmVtaXRzT3B0aW9ucztpZigoSXx8eikmJmtyfHxjLmRpcnN8fGMudHJhbnNpdGlvbilyZXR1cm4hMDtpZihoJiYkPj0wKXtpZigkJjEwMjQpcmV0dXJuITA7aWYoJCYxNilyZXR1cm4gXz93byhfLHgsZWUpOiEheDtpZigkJjgpZm9yKHZhciBJZT1jLmR5bmFtaWNQcm9wcyxkZT0wO2RlPEllLmxlbmd0aDtkZSsrKXt2YXIgdWU9SWVbZGVdO2lmKHhbdWVdIT09X1t1ZV0mJiFKcihlZSx1ZSkpcmV0dXJuITB9fWVsc2UgcmV0dXJuKEl8fHopJiYoIXp8fCF6LiRzdGFibGUpPyEwOl89PT14PyExOl8/eD93byhfLHgsZWUpOiEwOiEheDtyZXR1cm4hMX1mdW5jdGlvbiB3byhvLGMsaCl7dmFyIF89T2JqZWN0LmtleXMoYyk7aWYoXy5sZW5ndGghPT1PYmplY3Qua2V5cyhvKS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBJPTA7STxfLmxlbmd0aDtJKyspe3ZhciBBPV9bSV07aWYoY1tBXSE9PW9bQV0mJiFKcihoLEEpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFpyKG8sYyl7Zm9yKHZhcnt2bm9kZTpoLHBhcmVudDpffT1vO18mJl8uc3ViVHJlZT09PWg7KShoPV8udm5vZGUpLmVsPWMsXz1fLnBhcmVudH12YXIgZmk9bz0+by5fX2lzU3VzcGVuc2UsUW89e25hbWU6IlN1c3BlbnNlIixfX2lzU3VzcGVuc2U6ITAscHJvY2VzcyhvLGMsaCxfLEksQSx4LHosJCxlZSl7bz09bnVsbD9kaShjLGgsXyxJLEEseCx6LCQsZWUpOmdhKG8sYyxoLF8sSSx4LHosJCxlZSl9LGh5ZHJhdGU6ZnIsY3JlYXRlOkJyLG5vcm1hbGl6ZTplYX0sYW49UW87ZnVuY3Rpb24gU28obyxjKXt2YXIgaD1vLnByb3BzJiZvLnByb3BzW2NdO20uaXNGdW5jdGlvbihoKSYmaCgpfWZ1bmN0aW9uIGRpKG8sYyxoLF8sSSxBLHgseiwkKXt2YXJ7cDplZSxvOntjcmVhdGVFbGVtZW50OkllfX09JCxkZT1JZSgiZGl2IiksdWU9by5zdXNwZW5zZT1CcihvLEksXyxjLGRlLGgsQSx4LHosJCk7ZWUobnVsbCx1ZS5wZW5kaW5nQnJhbmNoPW8uc3NDb250ZW50LGRlLG51bGwsXyx1ZSxBLHgpLHVlLmRlcHM+MD8oU28obywib25QZW5kaW5nIiksU28obywib25GYWxsYmFjayIpLGVlKG51bGwsby5zc0ZhbGxiYWNrLGMsaCxfLG51bGwsQSx4KSxhbyh1ZSxvLnNzRmFsbGJhY2spKTp1ZS5yZXNvbHZlKCl9ZnVuY3Rpb24gZ2EobyxjLGgsXyxJLEEseCx6LCQpe3ZhcntwOmVlLHVtOkllLG86e2NyZWF0ZUVsZW1lbnQ6ZGV9fT0kLHVlPWMuc3VzcGVuc2U9by5zdXNwZW5zZTt1ZS52bm9kZT1jLGMuZWw9by5lbDt2YXIgSGU9Yy5zc0NvbnRlbnQsWmU9Yy5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6dnQscGVuZGluZ0JyYW5jaDp5dCxpc0luRmFsbGJhY2s6TmUsaXNIeWRyYXRpbmc6X2V9PXVlO2lmKHl0KXVlLnBlbmRpbmdCcmFuY2g9SGUsdnIoSGUseXQpPyhlZSh5dCxIZSx1ZS5oaWRkZW5Db250YWluZXIsbnVsbCxJLHVlLEEseCx6KSx1ZS5kZXBzPD0wP3VlLnJlc29sdmUoKTpOZSYmKGVlKHZ0LFplLGgsXyxJLG51bGwsQSx4LHopLGFvKHVlLFplKSkpOih1ZS5wZW5kaW5nSWQrKyxfZT8odWUuaXNIeWRyYXRpbmc9ITEsdWUuYWN0aXZlQnJhbmNoPXl0KTpJZSh5dCxJLHVlKSx1ZS5kZXBzPTAsdWUuZWZmZWN0cy5sZW5ndGg9MCx1ZS5oaWRkZW5Db250YWluZXI9ZGUoImRpdiIpLE5lPyhlZShudWxsLEhlLHVlLmhpZGRlbkNvbnRhaW5lcixudWxsLEksdWUsQSx4LHopLHVlLmRlcHM8PTA/dWUucmVzb2x2ZSgpOihlZSh2dCxaZSxoLF8sSSxudWxsLEEseCx6KSxhbyh1ZSxaZSkpKTp2dCYmdnIoSGUsdnQpPyhlZSh2dCxIZSxoLF8sSSx1ZSxBLHgseiksdWUucmVzb2x2ZSghMCkpOihlZShudWxsLEhlLHVlLmhpZGRlbkNvbnRhaW5lcixudWxsLEksdWUsQSx4LHopLHVlLmRlcHM8PTAmJnVlLnJlc29sdmUoKSkpO2Vsc2UgaWYodnQmJnZyKEhlLHZ0KSllZSh2dCxIZSxoLF8sSSx1ZSxBLHgseiksYW8odWUsSGUpO2Vsc2UgaWYoU28oYywib25QZW5kaW5nIiksdWUucGVuZGluZ0JyYW5jaD1IZSx1ZS5wZW5kaW5nSWQrKyxlZShudWxsLEhlLHVlLmhpZGRlbkNvbnRhaW5lcixudWxsLEksdWUsQSx4LHopLHVlLmRlcHM8PTApdWUucmVzb2x2ZSgpO2Vsc2V7dmFye3RpbWVvdXQ6TWUscGVuZGluZ0lkOm50fT11ZTtNZT4wP3NldFRpbWVvdXQoKCk9Pnt1ZS5wZW5kaW5nSWQ9PT1udCYmdWUuZmFsbGJhY2soWmUpfSxNZSk6TWU9PT0wJiZ1ZS5mYWxsYmFjayhaZSl9fXZhciBtbj0hMTtmdW5jdGlvbiBCcihvLGMsaCxfLEksQSx4LHosJCxlZSl7dmFyIEllPWFyZ3VtZW50cy5sZW5ndGg+MTAmJmFyZ3VtZW50c1sxMF0hPT12b2lkIDA/YXJndW1lbnRzWzEwXTohMTttbnx8KG1uPSEwLGNvbnNvbGVbY29uc29sZS5pbmZvPyJpbmZvIjoibG9nIl0oIjxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLiIpKTt2YXJ7cDpkZSxtOnVlLHVtOkhlLG46WmUsbzp7cGFyZW50Tm9kZTp2dCxyZW1vdmU6eXR9fT1lZSxOZT1vLnByb3BzP20udG9OdW1iZXIoby5wcm9wcy50aW1lb3V0KTp2b2lkIDA7RG4oTmUsIlN1c3BlbnNlIHRpbWVvdXQiKTt2YXIgX2U9e3Zub2RlOm8scGFyZW50OmMscGFyZW50Q29tcG9uZW50OmgsaXNTVkc6eCxjb250YWluZXI6XyxoaWRkZW5Db250YWluZXI6SSxhbmNob3I6QSxkZXBzOjAscGVuZGluZ0lkOjAsdGltZW91dDp0eXBlb2YgTmU9PSJudW1iZXIiP05lOi0xLGFjdGl2ZUJyYW5jaDpudWxsLHBlbmRpbmdCcmFuY2g6bnVsbCxpc0luRmFsbGJhY2s6ITAsaXNIeWRyYXRpbmc6SWUsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKCl7dmFyIE1lPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTt7aWYoIU1lJiYhX2UucGVuZGluZ0JyYW5jaCl0aHJvdyBuZXcgRXJyb3IoInN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgd2l0aG91dCBhIHBlbmRpbmcgYnJhbmNoLiIpO2lmKF9lLmlzVW5tb3VudGVkKXRocm93IG5ldyBFcnJvcigic3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS4iKX12YXJ7dm5vZGU6bnQsYWN0aXZlQnJhbmNoOnFlLHBlbmRpbmdCcmFuY2g6YXQscGVuZGluZ0lkOkl0LGVmZmVjdHM6c3QscGFyZW50Q29tcG9uZW50OmksY29udGFpbmVyOmF9PV9lO2lmKF9lLmlzSHlkcmF0aW5nKV9lLmlzSHlkcmF0aW5nPSExO2Vsc2UgaWYoIU1lKXt2YXIgZj1xZSYmYXQudHJhbnNpdGlvbiYmYXQudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7ZiYmKHFlLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT0oKT0+e0l0PT09X2UucGVuZGluZ0lkJiZ1ZShhdCxhLHAsMCl9KTt2YXJ7YW5jaG9yOnB9PV9lO3FlJiYocD1aZShxZSksSGUocWUsaSxfZSwhMCkpLGZ8fHVlKGF0LGEscCwwKX1hbyhfZSxhdCksX2UucGVuZGluZ0JyYW5jaD1udWxsLF9lLmlzSW5GYWxsYmFjaz0hMTtmb3IodmFyIFM9X2UucGFyZW50LHc9ITE7Uzspe2lmKFMucGVuZGluZ0JyYW5jaCl7Uy5lZmZlY3RzLnB1c2goLi4uc3QpLHc9ITA7YnJlYWt9Uz1TLnBhcmVudH13fHxVcihzdCksX2UuZWZmZWN0cz1bXSxTbyhudCwib25SZXNvbHZlIil9LGZhbGxiYWNrKE1lKXtpZighIV9lLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTpudCxhY3RpdmVCcmFuY2g6cWUscGFyZW50Q29tcG9uZW50OmF0LGNvbnRhaW5lcjpJdCxpc1NWRzpzdH09X2U7U28obnQsIm9uRmFsbGJhY2siKTt2YXIgaT1aZShxZSksYT0oKT0+eyFfZS5pc0luRmFsbGJhY2t8fChkZShudWxsLE1lLEl0LGksYXQsbnVsbCxzdCx6LCQpLGFvKF9lLE1lKSl9LGY9TWUudHJhbnNpdGlvbiYmTWUudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7ZiYmKHFlLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT1hKSxfZS5pc0luRmFsbGJhY2s9ITAsSGUocWUsYXQsbnVsbCwhMCksZnx8YSgpfX0sbW92ZShNZSxudCxxZSl7X2UuYWN0aXZlQnJhbmNoJiZ1ZShfZS5hY3RpdmVCcmFuY2gsTWUsbnQscWUpLF9lLmNvbnRhaW5lcj1NZX0sbmV4dCgpe3JldHVybiBfZS5hY3RpdmVCcmFuY2gmJlplKF9lLmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKE1lLG50KXt2YXIgcWU9ISFfZS5wZW5kaW5nQnJhbmNoO3FlJiZfZS5kZXBzKys7dmFyIGF0PU1lLnZub2RlLmVsO01lLmFzeW5jRGVwLmNhdGNoKEl0PT57SXIoSXQsTWUsMCl9KS50aGVuKEl0PT57aWYoIShNZS5pc1VubW91bnRlZHx8X2UuaXNVbm1vdW50ZWR8fF9lLnBlbmRpbmdJZCE9PU1lLnN1c3BlbnNlSWQpKXtNZS5hc3luY1Jlc29sdmVkPSEwO3Zhcnt2bm9kZTpzdH09TWU7ZW4oc3QpLGRsKE1lLEl0LCExKSxhdCYmKHN0LmVsPWF0KTt2YXIgaT0hYXQmJk1lLnN1YlRyZWUuZWw7bnQoTWUsc3QsdnQoYXR8fE1lLnN1YlRyZWUuZWwpLGF0P251bGw6WmUoTWUuc3ViVHJlZSksX2UseCwkKSxpJiZ5dChpKSxacihNZSxzdC5lbCksZ2UoKSxxZSYmLS1fZS5kZXBzPT09MCYmX2UucmVzb2x2ZSgpfX0pfSx1bm1vdW50KE1lLG50KXtfZS5pc1VubW91bnRlZD0hMCxfZS5hY3RpdmVCcmFuY2gmJkhlKF9lLmFjdGl2ZUJyYW5jaCxoLE1lLG50KSxfZS5wZW5kaW5nQnJhbmNoJiZIZShfZS5wZW5kaW5nQnJhbmNoLGgsTWUsbnQpfX07cmV0dXJuIF9lfWZ1bmN0aW9uIGZyKG8sYyxoLF8sSSxBLHgseiwkKXt2YXIgZWU9Yy5zdXNwZW5zZT1CcihjLF8saCxvLnBhcmVudE5vZGUsbC5jcmVhdGVFbGVtZW50KCJkaXYiKSxudWxsLEksQSx4LHosITApLEllPSQobyxlZS5wZW5kaW5nQnJhbmNoPWMuc3NDb250ZW50LGgsZWUsQSx4KTtyZXR1cm4gZWUuZGVwcz09PTAmJmVlLnJlc29sdmUoKSxJZX1mdW5jdGlvbiBlYShvKXt2YXJ7c2hhcGVGbGFnOmMsY2hpbGRyZW46aH09byxfPWMmMzI7by5zc0NvbnRlbnQ9UGEoXz9oLmRlZmF1bHQ6aCksby5zc0ZhbGxiYWNrPV8/UGEoaC5mYWxsYmFjayk6R24oeHQpfWZ1bmN0aW9uIFBhKG8pe3ZhciBjO2lmKG0uaXNGdW5jdGlvbihvKSl7dmFyIGg9a2kmJm8uX2M7aCYmKG8uX2Q9ITEsbnIoKSksbz1vKCksaCYmKG8uX2Q9ITAsYz1Nbix3YSgpKX1pZihtLmlzQXJyYXkobykpe3ZhciBfPXlvKG8pO198fE8oIjxTdXNwZW5zZT4gc2xvdHMgZXhwZWN0IGEgc2luZ2xlIHJvb3Qgbm9kZS4iKSxvPV99cmV0dXJuIG89S2kobyksYyYmIW8uZHluYW1pY0NoaWxkcmVuJiYoby5keW5hbWljQ2hpbGRyZW49Yy5maWx0ZXIoST0+SSE9PW8pKSxvfWZ1bmN0aW9uIHRhKG8sYyl7YyYmYy5wZW5kaW5nQnJhbmNoP20uaXNBcnJheShvKT9jLmVmZmVjdHMucHVzaCguLi5vKTpjLmVmZmVjdHMucHVzaChvKTpVcihvKX1mdW5jdGlvbiBhbyhvLGMpe28uYWN0aXZlQnJhbmNoPWM7dmFye3Zub2RlOmgscGFyZW50Q29tcG9uZW50Ol99PW8sST1oLmVsPWMuZWw7XyYmXy5zdWJUcmVlPT09aCYmKF8udm5vZGUuZWw9SSxacihfLEkpKX1mdW5jdGlvbiBabihvLGMpe2lmKCFCbilPKCJwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS4iKTtlbHNle3ZhciBoPUJuLnByb3ZpZGVzLF89Qm4ucGFyZW50JiZCbi5wYXJlbnQucHJvdmlkZXM7Xz09PWgmJihoPUJuLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUoXykpLGhbb109YyxCbi50eXBlLm1wVHlwZT09PSJhcHAiJiZCbi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKG8sYyl9fWZ1bmN0aW9uIG9yKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89Qm58fE9uO2lmKF8pe3ZhciBJPV8ucGFyZW50PT1udWxsP18udm5vZGUuYXBwQ29udGV4dCYmXy52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOl8ucGFyZW50LnByb3ZpZGVzO2lmKEkmJm8gaW4gSSlyZXR1cm4gSVtvXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGgmJm0uaXNGdW5jdGlvbihjKT9jLmNhbGwoXy5wcm94eSk6YztPKCdpbmplY3Rpb24gIicuY29uY2F0KFN0cmluZyhvKSwnIiBub3QgZm91bmQuJykpfWVsc2UgTygiaW5qZWN0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKSBvciBmdW5jdGlvbmFsIGNvbXBvbmVudHMuIil9ZnVuY3Rpb24gVm4obyxjKXtyZXR1cm4gQ2kobyxudWxsLGMpfWZ1bmN0aW9uIFhyKG8sYyl7cmV0dXJuIENpKG8sbnVsbCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2ZsdXNoOiJwb3N0In0pKX1mdW5jdGlvbiBoaShvLGMpe3JldHVybiBDaShvLG51bGwsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtmbHVzaDoic3luYyJ9KSl9dmFyIG5hPXt9O2Z1bmN0aW9uIFNpKG8sYyxoKXtyZXR1cm4gbS5pc0Z1bmN0aW9uKGMpfHxPKCJgd2F0Y2goZm4sIG9wdGlvbnM/KWAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBVc2UgYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylgIGluc3RlYWQuIGB3YXRjaGAgbm93IG9ubHkgc3VwcG9ydHMgYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuIiksQ2kobyxjLGgpfWZ1bmN0aW9uIENpKG8sYyl7dmFye2ltbWVkaWF0ZTpoLGRlZXA6XyxmbHVzaDpJLG9uVHJhY2s6QSxvblRyaWdnZXI6eH09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm0uRU1QVFlfT0JKO2N8fChoIT09dm9pZCAwJiZPKCd3YXRjaCgpICJpbW1lZGlhdGUiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLicpLF8hPT12b2lkIDAmJk8oJ3dhdGNoKCkgImRlZXAiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLicpKTt2YXIgej1hdD0+e08oIkludmFsaWQgd2F0Y2ggc291cmNlOiAiLGF0LCJBIHdhdGNoIHNvdXJjZSBjYW4gb25seSBiZSBhIGdldHRlci9lZmZlY3QgZnVuY3Rpb24sIGEgcmVmLCBhIHJlYWN0aXZlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgdGhlc2UgdHlwZXMuIil9LCQ9Ui5nZXRDdXJyZW50U2NvcGUoKT09PShCbj09bnVsbD92b2lkIDA6Qm4uc2NvcGUpP0JuOm51bGwsZWUsSWU9ITEsZGU9ITE7aWYoUi5pc1JlZihvKT8oZWU9KCk9Pm8udmFsdWUsSWU9Ui5pc1NoYWxsb3cobykpOlIuaXNSZWFjdGl2ZShvKT8oZWU9KCk9Pm8sXz0hMCk6bS5pc0FycmF5KG8pPyhkZT0hMCxJZT1vLnNvbWUoYXQ9PlIuaXNSZWFjdGl2ZShhdCl8fFIuaXNTaGFsbG93KGF0KSksZWU9KCk9Pm8ubWFwKGF0PT57aWYoUi5pc1JlZihhdCkpcmV0dXJuIGF0LnZhbHVlO2lmKFIuaXNSZWFjdGl2ZShhdCkpcmV0dXJuIE9pKGF0KTtpZihtLmlzRnVuY3Rpb24oYXQpKXJldHVybiBLdChhdCwkLDIpO3ooYXQpfSkpOm0uaXNGdW5jdGlvbihvKT9jP2VlPSgpPT5LdChvLCQsMik6ZWU9KCk9PntpZighKCQmJiQuaXNVbm1vdW50ZWQpKXJldHVybiBIZSYmSGUoKSxjbihvLCQsMyxbWmVdKX06KGVlPW0uTk9PUCx6KG8pKSxjJiZfKXt2YXIgdWU9ZWU7ZWU9KCk9Pk9pKHVlKCkpfXZhciBIZSxaZT1hdD0+e0hlPW50Lm9uU3RvcD0oKT0+e0t0KGF0LCQsNCl9fSx2dDtpZihkLmlzSW5TU1JDb21wb25lbnRTZXR1cClpZihaZT1tLk5PT1AsYz9oJiZjbihjLCQsMyxbZWUoKSxkZT9bXTp2b2lkIDAsWmVdKTplZSgpLEk9PT0ic3luYyIpe3ZhciB5dD12bCgpO3Z0PXl0Ll9fd2F0Y2hlckhhbmRsZXN8fCh5dC5fX3dhdGNoZXJIYW5kbGVzPVtdKX1lbHNlIHJldHVybiBtLk5PT1A7dmFyIE5lPWRlP25ldyBBcnJheShvLmxlbmd0aCkuZmlsbChuYSk6bmEsX2U9KCk9PntpZighIW50LmFjdGl2ZSlpZihjKXt2YXIgYXQ9bnQucnVuKCk7KF98fEllfHwoZGU/YXQuc29tZSgoSXQsc3QpPT5tLmhhc0NoYW5nZWQoSXQsTmVbc3RdKSk6bS5oYXNDaGFuZ2VkKGF0LE5lKSkpJiYoSGUmJkhlKCksY24oYywkLDMsW2F0LE5lPT09bmE/dm9pZCAwOmRlJiZOZVswXT09PW5hP1tdOk5lLFplXSksTmU9YXQpfWVsc2UgbnQucnVuKCl9O19lLmFsbG93UmVjdXJzZT0hIWM7dmFyIE1lO0k9PT0ic3luYyI/TWU9X2U6ST09PSJwb3N0Ij9NZT0oKT0+aHIoX2UsJCYmJC5zdXNwZW5zZSk6KF9lLnByZT0hMCwkJiYoX2UuaWQ9JC51aWQpLE1lPSgpPT5adChfZSkpO3ZhciBudD1uZXcgUi5SZWFjdGl2ZUVmZmVjdChlZSxNZSk7bnQub25UcmFjaz1BLG50Lm9uVHJpZ2dlcj14LGM/aD9fZSgpOk5lPW50LnJ1bigpOkk9PT0icG9zdCI/aHIobnQucnVuLmJpbmQobnQpLCQmJiQuc3VzcGVuc2UpOm50LnJ1bigpO3ZhciBxZT0oKT0+e250LnN0b3AoKSwkJiYkLnNjb3BlJiZtLnJlbW92ZSgkLnNjb3BlLmVmZmVjdHMsbnQpfTtyZXR1cm4gdnQmJnZ0LnB1c2gocWUpLHFlfWZ1bmN0aW9uIHNvKG8sYyxoKXt2YXIgXz10aGlzLnByb3h5LEk9bS5pc1N0cmluZyhvKT9vLmluY2x1ZGVzKCIuIik/dmEoXyxvKTooKT0+X1tvXTpvLmJpbmQoXyxfKSxBO20uaXNGdW5jdGlvbihjKT9BPWM6KEE9Yy5oYW5kbGVyLGg9Yyk7dmFyIHg9Qm47bWkodGhpcyk7dmFyIHo9Q2koSSxBLmJpbmQoXyksaCk7cmV0dXJuIHg/bWkoeCk6X2koKSx6fWZ1bmN0aW9uIHZhKG8sYyl7dmFyIGg9Yy5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBfPW8sST0wO0k8aC5sZW5ndGgmJl87SSsrKV89X1toW0ldXTtyZXR1cm4gX319ZnVuY3Rpb24gT2kobyxjKXtpZighbS5pc09iamVjdChvKXx8by5fX3Zfc2tpcHx8KGM9Y3x8bmV3IFNldCxjLmhhcyhvKSkpcmV0dXJuIG87aWYoYy5hZGQobyksUi5pc1JlZihvKSlPaShvLnZhbHVlLGMpO2Vsc2UgaWYobS5pc0FycmF5KG8pKWZvcih2YXIgaD0wO2g8by5sZW5ndGg7aCsrKU9pKG9baF0sYyk7ZWxzZSBpZihtLmlzU2V0KG8pfHxtLmlzTWFwKG8pKW8uZm9yRWFjaChJPT57T2koSSxjKX0pO2Vsc2UgaWYobS5pc1BsYWluT2JqZWN0KG8pKWZvcih2YXIgXyBpbiBvKU9pKG9bX10sYyk7cmV0dXJuIG99ZnVuY3Rpb24gamkoKXt2YXIgbz17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gdW8oKCk9PntvLmlzTW91bnRlZD0hMH0pLFFuKCgpPT57by5pc1VubW91bnRpbmc9ITB9KSxvfXZhciBkcj1bRnVuY3Rpb24sQXJyYXldLFNyPXttb2RlOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixwZXJzaXN0ZWQ6Qm9vbGVhbixvbkJlZm9yZUVudGVyOmRyLG9uRW50ZXI6ZHIsb25BZnRlckVudGVyOmRyLG9uRW50ZXJDYW5jZWxsZWQ6ZHIsb25CZWZvcmVMZWF2ZTpkcixvbkxlYXZlOmRyLG9uQWZ0ZXJMZWF2ZTpkcixvbkxlYXZlQ2FuY2VsbGVkOmRyLG9uQmVmb3JlQXBwZWFyOmRyLG9uQXBwZWFyOmRyLG9uQWZ0ZXJBcHBlYXI6ZHIsb25BcHBlYXJDYW5jZWxsZWQ6ZHJ9LGxvPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6U3Isc2V0dXAobyxjKXt2YXJ7c2xvdHM6aH09YyxfPVNuKCksST1qaSgpLEE7cmV0dXJuKCk9Pnt2YXIgeD1oLmRlZmF1bHQmJlooaC5kZWZhdWx0KCksITApO2lmKCEoIXh8fCF4Lmxlbmd0aCkpe3ZhciB6PXhbMF07aWYoeC5sZW5ndGg+MSl7dmFyICQ9ITE7Zm9yKHZhciBlZSBvZiB4KWlmKGVlLnR5cGUhPT14dCl7aWYoJCl7TygiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLiIpO2JyZWFrfXo9ZWUsJD0hMH19dmFyIEllPVIudG9SYXcobykse21vZGU6ZGV9PUllO2lmKGRlJiZkZSE9PSJpbi1vdXQiJiZkZSE9PSJvdXQtaW4iJiZkZSE9PSJkZWZhdWx0IiYmTygiaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogIi5jb25jYXQoZGUpKSxJLmlzTGVhdmluZylyZXR1cm4gcGkoeik7dmFyIHVlPURvKHopO2lmKCF1ZSlyZXR1cm4gcGkoeik7dmFyIEhlPUFpKHVlLEllLEksXyk7RCh1ZSxIZSk7dmFyIFplPV8uc3ViVHJlZSx2dD1aZSYmRG8oWmUpLHl0PSExLHtnZXRUcmFuc2l0aW9uS2V5Ok5lfT11ZS50eXBlO2lmKE5lKXt2YXIgX2U9TmUoKTtBPT09dm9pZCAwP0E9X2U6X2UhPT1BJiYoQT1fZSx5dD0hMCl9aWYodnQmJnZ0LnR5cGUhPT14dCYmKCF2cih1ZSx2dCl8fHl0KSl7dmFyIE1lPUFpKHZ0LEllLEksXyk7aWYoRCh2dCxNZSksZGU9PT0ib3V0LWluIilyZXR1cm4gSS5pc0xlYXZpbmc9ITAsTWUuYWZ0ZXJMZWF2ZT0oKT0+e0kuaXNMZWF2aW5nPSExLF8udXBkYXRlLmFjdGl2ZSE9PSExJiZfLnVwZGF0ZSgpfSxwaSh6KTtkZT09PSJpbi1vdXQiJiZ1ZS50eXBlIT09eHQmJihNZS5kZWxheUxlYXZlPShudCxxZSxhdCk9Pnt2YXIgSXQ9Q28oSSx2dCk7SXRbU3RyaW5nKHZ0LmtleSldPXZ0LG50Ll9sZWF2ZUNiPSgpPT57cWUoKSxudC5fbGVhdmVDYj12b2lkIDAsZGVsZXRlIEhlLmRlbGF5ZWRMZWF2ZX0sSGUuZGVsYXllZExlYXZlPWF0fSl9cmV0dXJuIHp9fX19LE1vPWxvO2Z1bmN0aW9uIENvKG8sYyl7dmFye2xlYXZpbmdWTm9kZXM6aH09byxfPWguZ2V0KGMudHlwZSk7cmV0dXJuIF98fChfPU9iamVjdC5jcmVhdGUobnVsbCksaC5zZXQoYy50eXBlLF8pKSxffWZ1bmN0aW9uIEFpKG8sYyxoLF8pe3ZhcnthcHBlYXI6SSxtb2RlOkEscGVyc2lzdGVkOng9ITEsb25CZWZvcmVFbnRlcjp6LG9uRW50ZXI6JCxvbkFmdGVyRW50ZXI6ZWUsb25FbnRlckNhbmNlbGxlZDpJZSxvbkJlZm9yZUxlYXZlOmRlLG9uTGVhdmU6dWUsb25BZnRlckxlYXZlOkhlLG9uTGVhdmVDYW5jZWxsZWQ6WmUsb25CZWZvcmVBcHBlYXI6dnQsb25BcHBlYXI6eXQsb25BZnRlckFwcGVhcjpOZSxvbkFwcGVhckNhbmNlbGxlZDpfZX09YyxNZT1TdHJpbmcoby5rZXkpLG50PUNvKGgsbykscWU9KHN0LGkpPT57c3QmJmNuKHN0LF8sOSxpKX0sYXQ9KHN0LGkpPT57dmFyIGE9aVsxXTtxZShzdCxpKSxtLmlzQXJyYXkoc3QpP3N0LmV2ZXJ5KGY9PmYubGVuZ3RoPD0xKSYmYSgpOnN0Lmxlbmd0aDw9MSYmYSgpfSxJdD17bW9kZTpBLHBlcnNpc3RlZDp4LGJlZm9yZUVudGVyKHN0KXt2YXIgaT16O2lmKCFoLmlzTW91bnRlZClpZihJKWk9dnR8fHo7ZWxzZSByZXR1cm47c3QuX2xlYXZlQ2ImJnN0Ll9sZWF2ZUNiKCEwKTt2YXIgYT1udFtNZV07YSYmdnIobyxhKSYmYS5lbC5fbGVhdmVDYiYmYS5lbC5fbGVhdmVDYigpLHFlKGksW3N0XSl9LGVudGVyKHN0KXt2YXIgaT0kLGE9ZWUsZj1JZTtpZighaC5pc01vdW50ZWQpaWYoSSlpPXl0fHwkLGE9TmV8fGVlLGY9X2V8fEllO2Vsc2UgcmV0dXJuO3ZhciBwPSExLFM9c3QuX2VudGVyQ2I9dz0+e3B8fChwPSEwLHc/cWUoZixbc3RdKTpxZShhLFtzdF0pLEl0LmRlbGF5ZWRMZWF2ZSYmSXQuZGVsYXllZExlYXZlKCksc3QuX2VudGVyQ2I9dm9pZCAwKX07aT9hdChpLFtzdCxTXSk6UygpfSxsZWF2ZShzdCxpKXt2YXIgYT1TdHJpbmcoby5rZXkpO2lmKHN0Ll9lbnRlckNiJiZzdC5fZW50ZXJDYighMCksaC5pc1VubW91bnRpbmcpcmV0dXJuIGkoKTtxZShkZSxbc3RdKTt2YXIgZj0hMSxwPXN0Ll9sZWF2ZUNiPVM9PntmfHwoZj0hMCxpKCksUz9xZShaZSxbc3RdKTpxZShIZSxbc3RdKSxzdC5fbGVhdmVDYj12b2lkIDAsbnRbYV09PT1vJiZkZWxldGUgbnRbYV0pfTtudFthXT1vLHVlP2F0KHVlLFtzdCxwXSk6cCgpfSxjbG9uZShzdCl7cmV0dXJuIEFpKHN0LGMsaCxfKX19O3JldHVybiBJdH1mdW5jdGlvbiBwaShvKXtpZihLKG8pKXJldHVybiBvPXFpKG8pLG8uY2hpbGRyZW49bnVsbCxvfWZ1bmN0aW9uIERvKG8pe3JldHVybiBLKG8pP28uY2hpbGRyZW4/by5jaGlsZHJlblswXTp2b2lkIDA6b31mdW5jdGlvbiBEKG8sYyl7by5zaGFwZUZsYWcmNiYmby5jb21wb25lbnQ/RChvLmNvbXBvbmVudC5zdWJUcmVlLGMpOm8uc2hhcGVGbGFnJjEyOD8oby5zc0NvbnRlbnQudHJhbnNpdGlvbj1jLmNsb25lKG8uc3NDb250ZW50KSxvLnNzRmFsbGJhY2sudHJhbnNpdGlvbj1jLmNsb25lKG8uc3NGYWxsYmFjaykpOm8udHJhbnNpdGlvbj1jfWZ1bmN0aW9uIFoobyl7Zm9yKHZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSxoPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLF89W10sST0wLEE9MDtBPG8ubGVuZ3RoO0ErKyl7dmFyIHg9b1tBXSx6PWg9PW51bGw/eC5rZXk6U3RyaW5nKGgpK1N0cmluZyh4LmtleSE9bnVsbD94LmtleTpBKTt4LnR5cGU9PT1ndD8oeC5wYXRjaEZsYWcmMTI4JiZJKyssXz1fLmNvbmNhdChaKHguY2hpbGRyZW4sYyx6KSkpOihjfHx4LnR5cGUhPT14dCkmJl8ucHVzaCh6IT1udWxsP3FpKHgse2tleTp6fSk6eCl9aWYoST4xKWZvcih2YXIgJD0wOyQ8Xy5sZW5ndGg7JCsrKV9bJF0ucGF0Y2hGbGFnPS0yO3JldHVybiBffWZ1bmN0aW9uIG1lKG8pe3JldHVybiBtLmlzRnVuY3Rpb24obyk/e3NldHVwOm8sbmFtZTpvLm5hbWV9Om99dmFyIGxlPW89PiEhby50eXBlLl9fYXN5bmNMb2FkZXI7ZnVuY3Rpb24gaGUobyl7bS5pc0Z1bmN0aW9uKG8pJiYobz17bG9hZGVyOm99KTt2YXJ7bG9hZGVyOmMsbG9hZGluZ0NvbXBvbmVudDpoLGVycm9yQ29tcG9uZW50Ol8sZGVsYXk6ST0yMDAsdGltZW91dDpBLHN1c3BlbnNpYmxlOng9ITAsb25FcnJvcjp6fT1vLCQ9bnVsbCxlZSxJZT0wLGRlPSgpPT4oSWUrKywkPW51bGwsdWUoKSksdWU9KCk9Pnt2YXIgSGU7cmV0dXJuICR8fChIZT0kPWMoKS5jYXRjaChaZT0+e2lmKFplPVplIGluc3RhbmNlb2YgRXJyb3I/WmU6bmV3IEVycm9yKFN0cmluZyhaZSkpLHopcmV0dXJuIG5ldyBQcm9taXNlKCh2dCx5dCk9Pnt2YXIgTmU9KCk9PnZ0KGRlKCkpLF9lPSgpPT55dChaZSk7eihaZSxOZSxfZSxJZSsxKX0pO3Rocm93IFplfSkudGhlbihaZT0+e2lmKEhlIT09JCYmJClyZXR1cm4gJDtpZihaZXx8TygiQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLiIpLFplJiYoWmUuX19lc01vZHVsZXx8WmVbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJNb2R1bGUiKSYmKFplPVplLmRlZmF1bHQpLFplJiYhbS5pc09iamVjdChaZSkmJiFtLmlzRnVuY3Rpb24oWmUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhc3luYyBjb21wb25lbnQgbG9hZCByZXN1bHQ6ICIuY29uY2F0KFplKSk7cmV0dXJuIGVlPVplLFplfSkpfTtyZXR1cm4gbWUoe25hbWU6IkFzeW5jQ29tcG9uZW50V3JhcHBlciIsX19hc3luY0xvYWRlcjp1ZSxnZXQgX19hc3luY1Jlc29sdmVkKCl7cmV0dXJuIGVlfSxzZXR1cCgpe3ZhciBIZT1CbjtpZihlZSlyZXR1cm4oKT0+T3QoZWUsSGUpO3ZhciBaZT1fZT0+eyQ9bnVsbCxJcihfZSxIZSwxMywhXyl9O2lmKHgmJkhlLnN1c3BlbnNlfHxkLmlzSW5TU1JDb21wb25lbnRTZXR1cClyZXR1cm4gdWUoKS50aGVuKF9lPT4oKT0+T3QoX2UsSGUpKS5jYXRjaChfZT0+KFplKF9lKSwoKT0+Xz9HbihfLHtlcnJvcjpfZX0pOm51bGwpKTt2YXIgdnQ9Ui5yZWYoITEpLHl0PVIucmVmKCksTmU9Ui5yZWYoISFJKTtyZXR1cm4gSSYmc2V0VGltZW91dCgoKT0+e05lLnZhbHVlPSExfSxJKSxBIT1udWxsJiZzZXRUaW1lb3V0KCgpPT57aWYoIXZ0LnZhbHVlJiYheXQudmFsdWUpe3ZhciBfZT1uZXcgRXJyb3IoIkFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgIi5jb25jYXQoQSwibXMuIikpO1plKF9lKSx5dC52YWx1ZT1fZX19LEEpLHVlKCkudGhlbigoKT0+e3Z0LnZhbHVlPSEwLEhlLnBhcmVudCYmSyhIZS5wYXJlbnQudm5vZGUpJiZadChIZS5wYXJlbnQudXBkYXRlKX0pLmNhdGNoKF9lPT57WmUoX2UpLHl0LnZhbHVlPV9lfSksKCk9PntpZih2dC52YWx1ZSYmZWUpcmV0dXJuIE90KGVlLEhlKTtpZih5dC52YWx1ZSYmXylyZXR1cm4gR24oXyx7ZXJyb3I6eXQudmFsdWV9KTtpZihoJiYhTmUudmFsdWUpcmV0dXJuIEduKGgpfX19KX1mdW5jdGlvbiBPdChvLGMpe3ZhcntyZWY6aCxwcm9wczpfLGNoaWxkcmVuOkksY2U6QX09Yy52bm9kZSx4PUduKG8sXyxJKTtyZXR1cm4geC5yZWY9aCx4LmNlPUEsZGVsZXRlIGMudm5vZGUuY2UseH12YXIgSz1vPT5vLnR5cGUuX19pc0tlZXBBbGl2ZSxZPXtuYW1lOiJLZWVwQWxpdmUiLF9faXNLZWVwQWxpdmU6ITAscHJvcHM6e2luY2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLGV4Y2x1ZGU6W1N0cmluZyxSZWdFeHAsQXJyYXldLG1heDpbU3RyaW5nLE51bWJlcl19LHNldHVwKG8sYyl7dmFye3Nsb3RzOmh9PWMsXz1TbigpLEk9Xy5jdHg7aWYoIUkucmVuZGVyZXIpcmV0dXJuKCk9Pnt2YXIgTWU9aC5kZWZhdWx0JiZoLmRlZmF1bHQoKTtyZXR1cm4gTWUmJk1lLmxlbmd0aD09PTE/TWVbMF06TWV9O3ZhciBBPW5ldyBNYXAseD1uZXcgU2V0LHo9bnVsbDtfLl9fdl9jYWNoZT1BO3ZhciAkPV8uc3VzcGVuc2Use3JlbmRlcmVyOntwOmVlLG06SWUsdW06ZGUsbzp7Y3JlYXRlRWxlbWVudDp1ZX19fT1JLEhlPXVlKCJkaXYiKTtJLmFjdGl2YXRlPShNZSxudCxxZSxhdCxJdCk9Pnt2YXIgc3Q9TWUuY29tcG9uZW50O0llKE1lLG50LHFlLDAsJCksZWUoc3Qudm5vZGUsTWUsbnQscWUsc3QsJCxhdCxNZS5zbG90U2NvcGVJZHMsSXQpLGhyKCgpPT57c3QuaXNEZWFjdGl2YXRlZD0hMSxzdC5hJiZtLmludm9rZUFycmF5Rm5zKHN0LmEpO3ZhciBpPU1lLnByb3BzJiZNZS5wcm9wcy5vblZub2RlTW91bnRlZDtpJiZGcihpLHN0LnBhcmVudCxNZSl9LCQpLHhvKHN0KX0sSS5kZWFjdGl2YXRlPU1lPT57dmFyIG50PU1lLmNvbXBvbmVudDtJZShNZSxIZSxudWxsLDEsJCksaHIoKCk9PntudC5kYSYmbS5pbnZva2VBcnJheUZucyhudC5kYSk7dmFyIHFlPU1lLnByb3BzJiZNZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO3FlJiZGcihxZSxudC5wYXJlbnQsTWUpLG50LmlzRGVhY3RpdmF0ZWQ9ITB9LCQpLHhvKG50KX07ZnVuY3Rpb24gWmUoTWUpe1FyKE1lKSxkZShNZSxfLCQsITApfWZ1bmN0aW9uIHZ0KE1lKXtBLmZvckVhY2goKG50LHFlKT0+e3ZhciBhdD10cyhudC50eXBlKTthdCYmKCFNZXx8IU1lKGF0KSkmJnl0KHFlKX0pfWZ1bmN0aW9uIHl0KE1lKXt2YXIgbnQ9QS5nZXQoTWUpOyF6fHwhdnIobnQseik/WmUobnQpOnomJlFyKHopLEEuZGVsZXRlKE1lKSx4LmRlbGV0ZShNZSl9U2koKCk9PltvLmluY2x1ZGUsby5leGNsdWRlXSxNZT0+e3ZhcltudCxxZV09TWU7bnQmJnZ0KGF0PT54ZShudCxhdCkpLHFlJiZ2dChhdD0+IXhlKHFlLGF0KSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciBOZT1udWxsLF9lPSgpPT57TmUhPW51bGwmJkEuc2V0KE5lLE1yKF8uc3ViVHJlZSkpfTtyZXR1cm4gdW8oX2UpLHJhKF9lKSxRbigoKT0+e0EuZm9yRWFjaChNZT0+e3ZhcntzdWJUcmVlOm50LHN1c3BlbnNlOnFlfT1fLGF0PU1yKG50KTtpZihNZS50eXBlPT09YXQudHlwZSYmTWUua2V5PT09YXQua2V5KXtRcihhdCk7dmFyIEl0PWF0LmNvbXBvbmVudC5kYTtJdCYmaHIoSXQscWUpO3JldHVybn1aZShNZSl9KX0pLCgpPT57aWYoTmU9bnVsbCwhaC5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBNZT1oLmRlZmF1bHQoKSxudD1NZVswXTtpZihNZS5sZW5ndGg+MSlyZXR1cm4gTygiS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC4iKSx6PW51bGwsTWU7aWYoIW9hKG50KXx8IShudC5zaGFwZUZsYWcmNCkmJiEobnQuc2hhcGVGbGFnJjEyOCkpcmV0dXJuIHo9bnVsbCxudDt2YXIgcWU9TXIobnQpLGF0PXFlLnR5cGUsSXQ9dHMobGUocWUpP3FlLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTphdCkse2luY2x1ZGU6c3QsZXhjbHVkZTppLG1heDphfT1vO2lmKHN0JiYoIUl0fHwheGUoc3QsSXQpKXx8aSYmSXQmJnhlKGksSXQpKXJldHVybiB6PXFlLG50O3ZhciBmPXFlLmtleT09bnVsbD9hdDpxZS5rZXkscD1BLmdldChmKTtyZXR1cm4gcWUuZWwmJihxZT1xaShxZSksbnQuc2hhcGVGbGFnJjEyOCYmKG50LnNzQ29udGVudD1xZSkpLE5lPWYscD8ocWUuZWw9cC5lbCxxZS5jb21wb25lbnQ9cC5jb21wb25lbnQscWUudHJhbnNpdGlvbiYmRChxZSxxZS50cmFuc2l0aW9uKSxxZS5zaGFwZUZsYWd8PTUxMix4LmRlbGV0ZShmKSx4LmFkZChmKSk6KHguYWRkKGYpLGEmJnguc2l6ZT5wYXJzZUludChhLDEwKSYmeXQoeC52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxxZS5zaGFwZUZsYWd8PTI1Nix6PXFlLGZpKG50LnR5cGUpP250OnFlfX19LGNlPVk7ZnVuY3Rpb24geGUobyxjKXtyZXR1cm4gbS5pc0FycmF5KG8pP28uc29tZShoPT54ZShoLGMpKTptLmlzU3RyaW5nKG8pP28uc3BsaXQoIiwiKS5pbmNsdWRlcyhjKTptLmlzUmVnRXhwKG8pP28udGVzdChjKTohMX1mdW5jdGlvbiBsdChvLGMpe0FuKG8sImEiLGMpfWZ1bmN0aW9uIHp0KG8sYyl7QW4obywiZGEiLGMpfWZ1bmN0aW9uIEFuKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOkJuLF89by5fX3dkY3x8KG8uX193ZGM9KCk9Pntmb3IodmFyIEE9aDtBOyl7aWYoQS5pc0RlYWN0aXZhdGVkKXJldHVybjtBPUEucGFyZW50fXJldHVybiBvKCl9KTtpZihjbyhjLF8saCksaClmb3IodmFyIEk9aC5wYXJlbnQ7SSYmSS5wYXJlbnQ7KUsoSS5wYXJlbnQudm5vZGUpJiZYbihfLGMsaCxJKSxJPUkucGFyZW50fWZ1bmN0aW9uIFhuKG8sYyxoLF8pe3ZhciBJPWNvKGMsbyxfLCEwKTtEcigoKT0+e20ucmVtb3ZlKF9bY10sSSl9LGgpfWZ1bmN0aW9uIFFyKG8pe28uc2hhcGVGbGFnJj1+MjU2LG8uc2hhcGVGbGFnJj1+NTEyfWZ1bmN0aW9uIE1yKG8pe3JldHVybiBvLnNoYXBlRmxhZyYxMjg/by5zc0NvbnRlbnQ6b31mdW5jdGlvbiBjbyhvLGMpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpCbixfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMTtpZihoKXtpZihXZS5pc1Jvb3RIb29rKG8pJiZoIT09aC5yb290JiYoaD1oLnJvb3QsV2UuaXNSb290SW1tZWRpYXRlSG9vayhvKSkpe3ZhciBJPWgucHJveHk7Y24oYy5iaW5kKEkpLGgsbyxXZS5PTl9MT0FEPT09bz9bSS4kcGFnZS5vcHRpb25zXTpbXSl9dmFyIEE9aFtvXXx8KGhbb109W10pLHg9Yy5fX3dlaHx8KGMuX193ZWg9ZnVuY3Rpb24oKXtpZighaC5pc1VubW91bnRlZCl7Ui5wYXVzZVRyYWNraW5nKCksbWkoaCk7Zm9yKHZhciAkPWFyZ3VtZW50cy5sZW5ndGgsZWU9bmV3IEFycmF5KCQpLEllPTA7SWU8JDtJZSsrKWVlW0llXT1hcmd1bWVudHNbSWVdO3ZhciBkZT1jbihjLGgsbyxlZSk7cmV0dXJuIF9pKCksUi5yZXNldFRyYWNraW5nKCksZGV9fSk7cmV0dXJuIF8/QS51bnNoaWZ0KHgpOkEucHVzaCh4KSx4fWVsc2V7dmFyIHo9bS50b0hhbmRsZXJLZXkoKGZuW29dfHxvLnJlcGxhY2UoL15vbi8sIiIpKS5yZXBsYWNlKC8gaG9vayQvLCIiKSk7TygiIi5jb25jYXQoeiwiIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgIikrImFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLiBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuIil9fXZhciBncj1vPT5mdW5jdGlvbihjKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06Qm47cmV0dXJuKCFkLmlzSW5TU1JDb21wb25lbnRTZXR1cHx8bz09PSJzcCIpJiZjbyhvLGZ1bmN0aW9uKCl7cmV0dXJuIGMoLi4uYXJndW1lbnRzKX0saCl9LGdpPWdyKCJibSIpLHVvPWdyKCJtIiksZm89Z3IoImJ1IikscmE9Z3IoInUiKSxRbj1ncigiYnVtIiksRHI9Z3IoInVtIikscWE9Z3IoInNwIiksTmE9Z3IoInJ0ZyIpLExyPWdyKCJydGMiKTtmdW5jdGlvbiBWcyhvKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06Qm47Y28oImVjIixvLGMpfWZ1bmN0aW9uIFVzKG8pe20uaXNCdWlsdEluRGlyZWN0aXZlKG8pJiZPKCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogIitvKX1mdW5jdGlvbiBpbChvLGMpe3ZhciBoPU9uO2lmKGg9PT1udWxsKXJldHVybiBPKCJ3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLiIpLG87Zm9yKHZhciBfPVBzKGgpfHxoLnByb3h5LEk9by5kaXJzfHwoby5kaXJzPVtdKSxBPTA7QTxjLmxlbmd0aDtBKyspe3Zhclt4LHosJCxlZT1tLkVNUFRZX09CSl09Y1tBXTt4JiYobS5pc0Z1bmN0aW9uKHgpJiYoeD17bW91bnRlZDp4LHVwZGF0ZWQ6eH0pLHguZGVlcCYmT2koeiksSS5wdXNoKHtkaXI6eCxpbnN0YW5jZTpfLHZhbHVlOnosb2xkVmFsdWU6dm9pZCAwLGFyZzokLG1vZGlmaWVyczplZX0pKX1yZXR1cm4gb31mdW5jdGlvbiBPbyhvLGMsaCxfKXtmb3IodmFyIEk9by5kaXJzLEE9YyYmYy5kaXJzLHg9MDt4PEkubGVuZ3RoO3grKyl7dmFyIHo9SVt4XTtBJiYoei5vbGRWYWx1ZT1BW3hdLnZhbHVlKTt2YXIgJD16LmRpcltfXTskJiYoUi5wYXVzZVRyYWNraW5nKCksY24oJCxoLDgsW28uZWwseixvLGNdKSxSLnJlc2V0VHJhY2tpbmcoKSl9fXZhciBUaT0iY29tcG9uZW50cyIsa2E9ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIE5sKG8sYyl7cmV0dXJuIGhvKFRpLG8sITAsYyl8fG99dmFyIHpuPVN5bWJvbCgpO2Z1bmN0aW9uIG1hKG8pe3JldHVybiBtLmlzU3RyaW5nKG8pP2hvKFRpLG8sITEpfHxvOm98fHpufWZ1bmN0aW9uIGdzKG8pe3JldHVybiBobyhrYSxvKX1mdW5jdGlvbiBobyhvLGMpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMCxfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxJPU9ufHxCbjtpZihJKXt2YXIgQT1JLnR5cGU7aWYobz09PVRpKXt2YXIgeD10cyhBLCExKTtpZih4JiYoeD09PWN8fHg9PT1tLmNhbWVsaXplKGMpfHx4PT09bS5jYXBpdGFsaXplKG0uY2FtZWxpemUoYykpKSlyZXR1cm4gQX12YXIgej1KYShJW29dfHxBW29dLGMpfHxKYShJLmFwcENvbnRleHRbb10sYyk7aWYoIXomJl8pcmV0dXJuIEE7aWYoaCYmIXope3ZhciAkPW89PT1UaT9gCklmIHRoaXMgaXMgYSBuYXRpdmUgY3VzdG9tIGVsZW1lbnQsIG1ha2Ugc3VyZSB0byBleGNsdWRlIGl0IGZyb20gY29tcG9uZW50IHJlc29sdXRpb24gdmlhIGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQuYDoiIjtPKCJGYWlsZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvLnNsaWNlKDAsLTEpLCI6ICIpLmNvbmNhdChjKS5jb25jYXQoJCkpfXJldHVybiB6fWVsc2UgTygicmVzb2x2ZSIuY29uY2F0KG0uY2FwaXRhbGl6ZShvLnNsaWNlKDAsLTEpKSwiICIpKyJjYW4gb25seSBiZSB1c2VkIGluIHJlbmRlcigpIG9yIHNldHVwKCkuIil9ZnVuY3Rpb24gSmEobyxjKXtyZXR1cm4gbyYmKG9bY118fG9bbS5jYW1lbGl6ZShjKV18fG9bbS5jYXBpdGFsaXplKG0uY2FtZWxpemUoYykpXSl9ZnVuY3Rpb24gb2wobyxjLGgsXyl7dmFyIEksQT1oJiZoW19dO2lmKG0uaXNBcnJheShvKXx8bS5pc1N0cmluZyhvKSl7ST1uZXcgQXJyYXkoby5sZW5ndGgpO2Zvcih2YXIgeD0wLHo9by5sZW5ndGg7eDx6O3grKylJW3hdPWMob1t4XSx4LHZvaWQgMCxBJiZBW3hdKX1lbHNlIGlmKHR5cGVvZiBvPT0ibnVtYmVyIil7TnVtYmVyLmlzSW50ZWdlcihvKXx8TygiVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgIi5jb25jYXQobywiLiIpKSxJPW5ldyBBcnJheShvKTtmb3IodmFyICQ9MDskPG87JCsrKUlbJF09YygkKzEsJCx2b2lkIDAsQSYmQVskXSl9ZWxzZSBpZihtLmlzT2JqZWN0KG8pKWlmKG9bU3ltYm9sLml0ZXJhdG9yXSlJPUFycmF5LmZyb20obywoSGUsWmUpPT5jKEhlLFplLHZvaWQgMCxBJiZBW1plXSkpO2Vsc2V7dmFyIGVlPU9iamVjdC5rZXlzKG8pO0k9bmV3IEFycmF5KGVlLmxlbmd0aCk7Zm9yKHZhciBJZT0wLGRlPWVlLmxlbmd0aDtJZTxkZTtJZSsrKXt2YXIgdWU9ZWVbSWVdO0lbSWVdPWMob1t1ZV0sdWUsSWUsQSYmQVtJZV0pfX1lbHNlIEk9W107cmV0dXJuIGgmJihoW19dPUkpLEl9ZnVuY3Rpb24gUmEobyxjKXtmb3IodmFyIGg9ZnVuY3Rpb24oSSl7dmFyIEE9Y1tJXTtpZihtLmlzQXJyYXkoQSkpZm9yKHZhciB4PTA7eDxBLmxlbmd0aDt4Kyspb1tBW3hdLm5hbWVdPUFbeF0uZm47ZWxzZSBBJiYob1tBLm5hbWVdPUEua2V5P2Z1bmN0aW9uKCl7dmFyIHo9QS5mbiguLi5hcmd1bWVudHMpO3JldHVybiB6JiYoei5rZXk9QS5rZXkpLHp9OkEuZm4pfSxfPTA7XzxjLmxlbmd0aDtfKyspaChfKTtyZXR1cm4gb31mdW5jdGlvbiBhbChvLGMpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxfPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwLEk9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDA7aWYoT24uaXNDRXx8T24ucGFyZW50JiZsZShPbi5wYXJlbnQpJiZPbi5wYXJlbnQuaXNDRSlyZXR1cm4gYyE9PSJkZWZhdWx0IiYmKGgubmFtZT1jKSxHbigic2xvdCIsaCxfJiZfKCkpO3ZhciBBPW9bY107QSYmQS5sZW5ndGg+MSYmKE8oIlNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuIiksQT0oKT0+W10pLEEmJkEuX2MmJihBLl9kPSExKSxucigpO3ZhciB4PUEmJl9hKEEoaCkpLHo9eGwoZ3Qse2tleTpoLmtleXx8eCYmeC5rZXl8fCJfIi5jb25jYXQoYyl9LHh8fChfP18oKTpbXSkseCYmby5fPT09MT82NDotMik7cmV0dXJuIUkmJnouc2NvcGVJZCYmKHouc2xvdFNjb3BlSWRzPVt6LnNjb3BlSWQrIi1zIl0pLEEmJkEuX2MmJihBLl9kPSEwKSx6fWZ1bmN0aW9uIF9hKG8pe3JldHVybiBvLnNvbWUoYz0+b2EoYyk/IShjLnR5cGU9PT14dHx8Yy50eXBlPT09Z3QmJiFfYShjLmNoaWxkcmVuKSk6ITApP286bnVsbH1mdW5jdGlvbiB2cyhvLGMpe3ZhciBoPXt9O2lmKCFtLmlzT2JqZWN0KG8pKXJldHVybiBPKCJ2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuIiksaDtmb3IodmFyIF8gaW4gbyloW2MmJi9bQS1aXS8udGVzdChfKT8ib246Ii5jb25jYXQoXyk6bS50b0hhbmRsZXJLZXkoXyldPW9bX107cmV0dXJuIGh9dmFyIG1zPW89Pm8/VWEobyk/UHMobyl8fG8ucHJveHk6bXMoby5wYXJlbnQpOm51bGwsemk9bS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDpvPT5vLCRlbDpvPT5vLnZub2RlLmVsLCRkYXRhOm89Pm8uZGF0YSwkcHJvcHM6bz0+Ui5zaGFsbG93UmVhZG9ubHkoby5wcm9wcyksJGF0dHJzOm89PlIuc2hhbGxvd1JlYWRvbmx5KG8uYXR0cnMpLCRzbG90czpvPT5SLnNoYWxsb3dSZWFkb25seShvLnNsb3RzKSwkcmVmczpvPT5SLnNoYWxsb3dSZWFkb25seShvLnJlZnMpLCRwYXJlbnQ6bz0+bXMoby5wYXJlbnQpLCRyb290Om89Pm1zKG8ucm9vdCksJGVtaXQ6bz0+by5lbWl0LCRvcHRpb25zOm89Pk0obyksJGZvcmNlVXBkYXRlOm89Pm8uZnx8KG8uZj0oKT0+WnQoby51cGRhdGUpKSwkbmV4dFRpY2s6bz0+by5ufHwoby5uPXRuLmJpbmQoby5wcm94eSkpLCR3YXRjaDpvPT5zby5iaW5kKG8pfSksQ3I9bz0+bz09PSJfInx8bz09PSIkIixiYT0obyxjKT0+byE9PW0uRU1QVFlfT0JKJiYhby5fX2lzU2NyaXB0U2V0dXAmJm0uaGFzT3duKG8sYyksTG89e2dldChvLGMpe3ZhcntfOmh9PW8se2N0eDpfLHNldHVwU3RhdGU6SSxkYXRhOkEscHJvcHM6eCxhY2Nlc3NDYWNoZTp6LHR5cGU6JCxhcHBDb250ZXh0OmVlfT1oO2lmKGM9PT0iX19pc1Z1ZSIpcmV0dXJuITA7dmFyIEllO2lmKGNbMF0hPT0iJCIpe3ZhciBkZT16W2NdO2lmKGRlIT09dm9pZCAwKXN3aXRjaChkZSl7Y2FzZSAxOnJldHVybiBJW2NdO2Nhc2UgMjpyZXR1cm4gQVtjXTtjYXNlIDQ6cmV0dXJuIF9bY107Y2FzZSAzOnJldHVybiB4W2NdfWVsc2V7aWYoYmEoSSxjKSlyZXR1cm4geltjXT0xLElbY107aWYoQSE9PW0uRU1QVFlfT0JKJiZtLmhhc093bihBLGMpKXJldHVybiB6W2NdPTIsQVtjXTtpZigoSWU9aC5wcm9wc09wdGlvbnNbMF0pJiZtLmhhc093bihJZSxjKSlyZXR1cm4geltjXT0zLHhbY107aWYoXyE9PW0uRU1QVFlfT0JKJiZtLmhhc093bihfLGMpKXJldHVybiB6W2NdPTQsX1tjXTtfcyYmKHpbY109MCl9fXZhciB1ZT16aVtjXSxIZSxaZTtpZih1ZSlyZXR1cm4gYz09PSIkYXR0cnMiJiYoUi50cmFjayhoLCJnZXQiLGMpLER0KCkpLHVlKGgpO2lmKChIZT0kLl9fY3NzTW9kdWxlcykmJihIZT1IZVtjXSkpcmV0dXJuIEhlO2lmKF8hPT1tLkVNUFRZX09CSiYmbS5oYXNPd24oXyxjKSlyZXR1cm4geltjXT00LF9bY107aWYoWmU9ZWUuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsbS5oYXNPd24oWmUsYykpcmV0dXJuIFplW2NdO09uJiYoIW0uaXNTdHJpbmcoYyl8fGMuaW5kZXhPZigiX192IikhPT0wKSYmKEEhPT1tLkVNUFRZX09CSiYmQ3IoY1swXSkmJm0uaGFzT3duKEEsYyk/TygiUHJvcGVydHkgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYyksIiBtdXN0IGJlIGFjY2Vzc2VkIHZpYSAkZGF0YSBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgIikrJ2NoYXJhY3RlciAoIiQiIG9yICJfIikgYW5kIGlzIG5vdCBwcm94aWVkIG9uIHRoZSByZW5kZXIgY29udGV4dC4nKTpoPT09T24mJk8oIlByb3BlcnR5ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGMpLCIgd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgIikrImJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS4iKSl9LHNldChvLGMsaCl7dmFye199PW8se2RhdGE6SSxzZXR1cFN0YXRlOkEsY3R4Onh9PV87cmV0dXJuIGJhKEEsYyk/KEFbY109aCwhMCk6QS5fX2lzU2NyaXB0U2V0dXAmJm0uaGFzT3duKEEsYyk/KE8oJ0Nhbm5vdCBtdXRhdGUgPHNjcmlwdCBzZXR1cD4gYmluZGluZyAiJy5jb25jYXQoYywnIiBmcm9tIE9wdGlvbnMgQVBJLicpKSwhMSk6SSE9PW0uRU1QVFlfT0JKJiZtLmhhc093bihJLGMpPyhJW2NdPWgsITApOm0uaGFzT3duKF8ucHJvcHMsYyk/KE8oJ0F0dGVtcHRpbmcgdG8gbXV0YXRlIHByb3AgIicuY29uY2F0KGMsJyIuIFByb3BzIGFyZSByZWFkb25seS4nKSksITEpOmNbMF09PT0iJCImJmMuc2xpY2UoMSlpbiBfPyhPKCdBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgIicuY29uY2F0KGMsJyIuICcpKyJQcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggJCBhcmUgcmVzZXJ2ZWQgYW5kIHJlYWRvbmx5LiIpLCExKTooYyBpbiBfLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5KHgsYyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsdmFsdWU6aH0pOnhbY109aCwhMCl9LGhhcyhvLGMpe3ZhcntfOntkYXRhOmgsc2V0dXBTdGF0ZTpfLGFjY2Vzc0NhY2hlOkksY3R4OkEsYXBwQ29udGV4dDp4LHByb3BzT3B0aW9uczp6fX09bywkO3JldHVybiEhSVtjXXx8aCE9PW0uRU1QVFlfT0JKJiZtLmhhc093bihoLGMpfHxiYShfLGMpfHwoJD16WzBdKSYmbS5oYXNPd24oJCxjKXx8bS5oYXNPd24oQSxjKXx8bS5oYXNPd24oemksYyl8fG0uaGFzT3duKHguY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsYyl9LGRlZmluZVByb3BlcnR5KG8sYyxoKXtyZXR1cm4gaC5nZXQhPW51bGw/by5fLmFjY2Vzc0NhY2hlW2NdPTA6bS5oYXNPd24oaCwidmFsdWUiKSYmdGhpcy5zZXQobyxjLGgudmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShvLGMsaCl9fTtMby5vd25LZXlzPW89PihPKCJBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuIiksUmVmbGVjdC5vd25LZXlzKG8pKTt2YXIgeGE9bS5leHRlbmQoe30sTG8se2dldChvLGMpe2lmKGMhPT1TeW1ib2wudW5zY29wYWJsZXMpcmV0dXJuIExvLmdldChvLGMsbyl9LGhhcyhvLGMpe3ZhciBoPWNbMF0hPT0iXyImJiFtLmlzR2xvYmFsbHlXaGl0ZWxpc3RlZChjKTtyZXR1cm4haCYmTG8uaGFzKG8sYykmJk8oIlByb3BlcnR5ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGMpLCIgc2hvdWxkIG5vdCBzdGFydCB3aXRoIF8gd2hpY2ggaXMgYSByZXNlcnZlZCBwcmVmaXggZm9yIFZ1ZSBpbnRlcm5hbHMuIikpLGh9fSk7ZnVuY3Rpb24gc2wobyl7dmFyIGM9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OigpPT5vfSksT2JqZWN0LmtleXMoemkpLmZvckVhY2goaD0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGgse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLGdldDooKT0+emlbaF0obyksc2V0Om0uTk9PUH0pfSksY31mdW5jdGlvbiAkcyhvKXt2YXJ7Y3R4OmMscHJvcHNPcHRpb25zOltoXX09bztoJiZPYmplY3Qua2V5cyhoKS5mb3JFYWNoKF89PntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxfLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9Pm8ucHJvcHNbX10sc2V0Om0uTk9PUH0pfSl9ZnVuY3Rpb24ga2wobyl7dmFye2N0eDpjLHNldHVwU3RhdGU6aH09bztPYmplY3Qua2V5cyhSLnRvUmF3KGgpKS5mb3JFYWNoKF89PntpZighaC5fX2lzU2NyaXB0U2V0dXApe2lmKENyKF9bMF0pKXtPKCJzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShfKSwnIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAiJCIgb3IgIl8iICcpKyJ3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuIik7cmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLF8se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+aFtfXSxzZXQ6bS5OT09QfSl9fSl9ZnVuY3Rpb24geWEoKXt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybihjLGgpPT57b1toXT9PKCIiLmNvbmNhdChjLCcgcHJvcGVydHkgIicpLmNvbmNhdChoLCciIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAnKS5jb25jYXQob1toXSwiLiIpKTpvW2hdPWN9fXZhciBfcz0hMDtmdW5jdGlvbiBIcyhvKXt2YXIgYz1NKG8pLGg9by5wcm94eSxfPW8uY3R4O19zPSExLGMuYmVmb3JlQ3JlYXRlJiZqcyhjLmJlZm9yZUNyZWF0ZSxvLCJiYyIpO3ZhcntkYXRhOkksY29tcHV0ZWQ6QSxtZXRob2RzOngsd2F0Y2g6eixwcm92aWRlOiQsaW5qZWN0OmVlLGNyZWF0ZWQ6SWUsYmVmb3JlTW91bnQ6ZGUsbW91bnRlZDp1ZSxiZWZvcmVVcGRhdGU6SGUsdXBkYXRlZDpaZSxhY3RpdmF0ZWQ6dnQsZGVhY3RpdmF0ZWQ6eXQsYmVmb3JlRGVzdHJveTpOZSxiZWZvcmVVbm1vdW50Ol9lLGRlc3Ryb3llZDpNZSx1bm1vdW50ZWQ6bnQscmVuZGVyOnFlLHJlbmRlclRyYWNrZWQ6YXQscmVuZGVyVHJpZ2dlcmVkOkl0LGVycm9yQ2FwdHVyZWQ6c3Qsc2VydmVyUHJlZmV0Y2g6aSxleHBvc2U6YSxpbmhlcml0QXR0cnM6Zixjb21wb25lbnRzOnAsZGlyZWN0aXZlczpTLGZpbHRlcnM6d309YyxOPXlhKCk7e3ZhcltWXT1vLnByb3BzT3B0aW9ucztpZihWKWZvcih2YXIgRiBpbiBWKU4oIlByb3BzIixGKX1pZihlZSYmbGwoZWUsXyxOLG8uYXBwQ29udGV4dC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYpLHgpZm9yKHZhciBxIGluIHgpe3ZhciBiZT14W3FdO20uaXNGdW5jdGlvbihiZSk/KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfLHEse3ZhbHVlOmJlLmJpbmQoaCksY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxOKCJNZXRob2RzIixxKSk6TygnTWV0aG9kICInLmNvbmNhdChxLCciIGhhcyB0eXBlICInKS5jb25jYXQodHlwZW9mIGJlLCciIGluIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi4gJykrIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/Iil9aWYoSSYmZnVuY3Rpb24oKXttLmlzRnVuY3Rpb24oSSl8fE8oIlRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiIpO3ZhciBzZT1JLmNhbGwoaCxoKTtpZihtLmlzUHJvbWlzZShzZSkmJk8oImRhdGEoKSByZXR1cm5lZCBhIFByb21pc2UgLSBub3RlIGRhdGEoKSBjYW5ub3QgYmUgYXN5bmM7IElmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybSBkYXRhIGZldGNoaW5nIGJlZm9yZSBjb21wb25lbnQgcmVuZGVycywgdXNlIGFzeW5jIHNldHVwKCkgKyA8U3VzcGVuc2U+LiIpLCFtLmlzT2JqZWN0KHNlKSlPKCJkYXRhKCkgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuIik7ZWxzZXtvLmRhdGE9Ui5yZWFjdGl2ZShzZSk7e3ZhciBFZT1mdW5jdGlvbihGZSl7TigiRGF0YSIsRmUpLENyKEZlWzBdKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KF8sRmUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDooKT0+c2VbRmVdLHNldDptLk5PT1B9KX07Zm9yKHZhciBMZSBpbiBzZSlFZShMZSl9fX0oKSxfcz0hMCxBKXt2YXIgYWU9ZnVuY3Rpb24oc2Upe3ZhciBFZT1BW3NlXSxMZT1tLmlzRnVuY3Rpb24oRWUpP0VlLmJpbmQoaCxoKTptLmlzRnVuY3Rpb24oRWUuZ2V0KT9FZS5nZXQuYmluZChoLGgpOm0uTk9PUDtMZT09PW0uTk9PUCYmTygnQ29tcHV0ZWQgcHJvcGVydHkgIicuY29uY2F0KHNlLCciIGhhcyBubyBnZXR0ZXIuJykpO3ZhciBGZT0hbS5pc0Z1bmN0aW9uKEVlKSYmbS5pc0Z1bmN0aW9uKEVlLnNldCk/RWUuc2V0LmJpbmQoaCk6KCk9PntPKCdXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCBwcm9wZXJ0eSAiJy5jb25jYXQoc2UsJyIgaXMgcmVhZG9ubHkuJykpfSxpdD1MbCh7Z2V0OkxlLHNldDpGZX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfLHNlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9Pml0LnZhbHVlLHNldDpUdD0+aXQudmFsdWU9VHR9KSxOKCJDb21wdXRlZCIsc2UpfTtmb3IodmFyIG5lIGluIEEpYWUobmUpfWlmKHopZm9yKHZhciBBZSBpbiB6KXkoeltBZV0sXyxoLEFlKTtpZigkKXt2YXIgRGU9bS5pc0Z1bmN0aW9uKCQpPyQuY2FsbChoKTokO1JlZmxlY3Qub3duS2V5cyhEZSkuZm9yRWFjaChzZT0+e1puKHNlLERlW3NlXSl9KX1JZSYmanMoSWUsbywiYyIpO2Z1bmN0aW9uIFhlKHNlLEVlKXttLmlzQXJyYXkoRWUpP0VlLmZvckVhY2goTGU9PnNlKExlLmJpbmQoaCkpKTpFZSYmc2UoRWUuYmluZChoKSl9aWYoWGUoZ2ksZGUpLFhlKHVvLHVlKSxYZShmbyxIZSksWGUocmEsWmUpLFhlKGx0LHZ0KSxYZSh6dCx5dCksWGUoVnMsc3QpLFhlKExyLGF0KSxYZShOYSxJdCksWGUoUW4sX2UpLFhlKERyLG50KSxYZShxYSxpKSxtLmlzQXJyYXkoYSkpaWYoYS5sZW5ndGgpe3ZhciBmdD1vLmV4cG9zZWR8fChvLmV4cG9zZWQ9e30pO2EuZm9yRWFjaChzZT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShmdCxzZSx7Z2V0OigpPT5oW3NlXSxzZXQ6RWU9Pmhbc2VdPUVlfSl9KX1lbHNlIG8uZXhwb3NlZHx8KG8uZXhwb3NlZD17fSk7cWUmJm8ucmVuZGVyPT09bS5OT09QJiYoby5yZW5kZXI9cWUpLGYhPW51bGwmJihvLmluaGVyaXRBdHRycz1mKSxwJiYoby5jb21wb25lbnRzPXApLFMmJihvLmRpcmVjdGl2ZXM9Uyk7dmFyIFRlPW8uYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcy4kYXBwbHlPcHRpb25zO1RlJiZUZShjLG8saCl9ZnVuY3Rpb24gbGwobyxjKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bS5OT09QLF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO20uaXNBcnJheShvKSYmKG89ZmUobykpO3ZhciBJPWZ1bmN0aW9uKHgpe3ZhciB6PW9beF0sJD12b2lkIDA7bS5pc09iamVjdCh6KT8iZGVmYXVsdCJpbiB6PyQ9b3Ioei5mcm9tfHx4LHouZGVmYXVsdCwhMCk6JD1vcih6LmZyb218fHgpOiQ9b3IoeiksUi5pc1JlZigkKT9fP09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLHgse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+JC52YWx1ZSxzZXQ6ZWU9PiQudmFsdWU9ZWV9KTooTygnaW5qZWN0ZWQgcHJvcGVydHkgIicuY29uY2F0KHgsJyIgaXMgYSByZWYgYW5kIHdpbGwgYmUgYXV0by11bndyYXBwZWQgJykrImFuZCBubyBsb25nZXIgbmVlZHMgYC52YWx1ZWAgaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4gVG8gb3B0LWluIHRvIHRoZSBuZXcgYmVoYXZpb3Igbm93LCBzZXQgYGFwcC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYgPSB0cnVlYCAodGhpcyBjb25maWcgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4pIiksY1t4XT0kKTpjW3hdPSQsaCgiSW5qZWN0Iix4KX07Zm9yKHZhciBBIGluIG8pSShBKX1mdW5jdGlvbiBqcyhvLGMsaCl7Y24obS5pc0FycmF5KG8pP28ubWFwKF89Pl8uYmluZChjLnByb3h5KSk6by5iaW5kKGMucHJveHkpLGMsaCl9ZnVuY3Rpb24geShvLGMsaCxfKXt2YXIgST1fLmluY2x1ZGVzKCIuIik/dmEoaCxfKTooKT0+aFtfXTtpZihtLmlzU3RyaW5nKG8pKXt2YXIgQT1jW29dO20uaXNGdW5jdGlvbihBKT9TaShJLEEpOk8oJ0ludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5ICInLmNvbmNhdChvLCciJyksQSl9ZWxzZSBpZihtLmlzRnVuY3Rpb24obykpU2koSSxvLmJpbmQoaCkpO2Vsc2UgaWYobS5pc09iamVjdChvKSlpZihtLmlzQXJyYXkobykpby5mb3JFYWNoKHo9PnkoeixjLGgsXykpO2Vsc2V7dmFyIHg9bS5pc0Z1bmN0aW9uKG8uaGFuZGxlcik/by5oYW5kbGVyLmJpbmQoaCk6Y1tvLmhhbmRsZXJdO20uaXNGdW5jdGlvbih4KT9TaShJLHgsbyk6TygnSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgIicuY29uY2F0KG8uaGFuZGxlciwnIicpLHgpfWVsc2UgTygnSW52YWxpZCB3YXRjaCBvcHRpb246ICInLmNvbmNhdChfLCciJyksbyl9ZnVuY3Rpb24gTShvKXt2YXIgYz1vLnR5cGUse21peGluczpoLGV4dGVuZHM6X309Yyx7bWl4aW5zOkksb3B0aW9uc0NhY2hlOkEsY29uZmlnOntvcHRpb25NZXJnZVN0cmF0ZWdpZXM6eH19PW8uYXBwQ29udGV4dCx6PUEuZ2V0KGMpLCQ7cmV0dXJuIHo/JD16OiFJLmxlbmd0aCYmIWgmJiFfPyQ9YzooJD17fSxJLmxlbmd0aCYmSS5mb3JFYWNoKGVlPT5XKCQsZWUseCwhMCkpLFcoJCxjLHgpKSxtLmlzT2JqZWN0KGMpJiZBLnNldChjLCQpLCR9ZnVuY3Rpb24gVyhvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHttaXhpbnM6SSxleHRlbmRzOkF9PWM7QSYmVyhvLEEsaCwhMCksSSYmSS5mb3JFYWNoKCQ9PlcobywkLGgsITApKTtmb3IodmFyIHggaW4gYylpZihfJiZ4PT09ImV4cG9zZSIpTygnImV4cG9zZSIgb3B0aW9uIGlzIGlnbm9yZWQgd2hlbiBkZWNsYXJlZCBpbiBtaXhpbnMgb3IgZXh0ZW5kcy4gSXQgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQgaW4gdGhlIGJhc2UgY29tcG9uZW50IGl0c2VsZi4nKTtlbHNle3ZhciB6PUhbeF18fGgmJmhbeF07b1t4XT16P3oob1t4XSxjW3hdKTpjW3hdfXJldHVybiBvfXZhciBIPXtkYXRhOlEscHJvcHM6Q2UsZW1pdHM6Q2UsbWV0aG9kczpDZSxjb21wdXRlZDpDZSxiZWZvcmVDcmVhdGU6cGUsY3JlYXRlZDpwZSxiZWZvcmVNb3VudDpwZSxtb3VudGVkOnBlLGJlZm9yZVVwZGF0ZTpwZSx1cGRhdGVkOnBlLGJlZm9yZURlc3Ryb3k6cGUsYmVmb3JlVW5tb3VudDpwZSxkZXN0cm95ZWQ6cGUsdW5tb3VudGVkOnBlLGFjdGl2YXRlZDpwZSxkZWFjdGl2YXRlZDpwZSxlcnJvckNhcHR1cmVkOnBlLHNlcnZlclByZWZldGNoOnBlLGNvbXBvbmVudHM6Q2UsZGlyZWN0aXZlczpDZSx3YXRjaDpCZSxwcm92aWRlOlEsaW5qZWN0OnRlfTtmdW5jdGlvbiBRKG8sYyl7cmV0dXJuIGM/bz9mdW5jdGlvbigpe3JldHVybiBtLmV4dGVuZChtLmlzRnVuY3Rpb24obyk/by5jYWxsKHRoaXMsdGhpcyk6byxtLmlzRnVuY3Rpb24oYyk/Yy5jYWxsKHRoaXMsdGhpcyk6Yyl9OmM6b31mdW5jdGlvbiB0ZShvLGMpe3JldHVybiBDZShmZShvKSxmZShjKSl9ZnVuY3Rpb24gZmUobyl7aWYobS5pc0FycmF5KG8pKXtmb3IodmFyIGM9e30saD0wO2g8by5sZW5ndGg7aCsrKWNbb1toXV09b1toXTtyZXR1cm4gY31yZXR1cm4gb31mdW5jdGlvbiBwZShvLGMpe3JldHVybiBvP1suLi5uZXcgU2V0KFtdLmNvbmNhdChvLGMpKV06Y31mdW5jdGlvbiBDZShvLGMpe3JldHVybiBvP20uZXh0ZW5kKG0uZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksbyksYyk6Y31mdW5jdGlvbiBCZShvLGMpe2lmKCFvKXJldHVybiBjO2lmKCFjKXJldHVybiBvO3ZhciBoPW0uZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksbyk7Zm9yKHZhciBfIGluIGMpaFtfXT1wZShvW19dLGNbX10pO3JldHVybiBofWZ1bmN0aW9uIFNlKG8sYyxoKXt2YXIgXz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsST17fSxBPXt9O20uZGVmKEEsT3MsMSksby5wcm9wc0RlZmF1bHRzPU9iamVjdC5jcmVhdGUobnVsbCksQ3QobyxjLEksQSk7Zm9yKHZhciB4IGluIG8ucHJvcHNPcHRpb25zWzBdKXggaW4gSXx8KElbeF09dm9pZCAwKTtBdChjfHx7fSxJLG8pLGg/by5wcm9wcz1fP0k6Ui5zaGFsbG93UmVhY3RpdmUoSSk6by50eXBlLnByb3BzP28ucHJvcHM9STpvLnByb3BzPUEsby5hdHRycz1BfWZ1bmN0aW9uIGplKG8pe2Zvcig7bzspe2lmKG8udHlwZS5fX2htcklkKXJldHVybiEwO289by5wYXJlbnR9fWZ1bmN0aW9uIGJ0KG8sYyxoLF8pe3Zhcntwcm9wczpJLGF0dHJzOkEsdm5vZGU6e3BhdGNoRmxhZzp4fX09byx6PVIudG9SYXcoSSksWyRdPW8ucHJvcHNPcHRpb25zLGVlPSExO2lmKCFqZShvKSYmKF98fHg+MCkmJiEoeCYxNikpe2lmKHgmOClmb3IodmFyIEllPW8udm5vZGUuZHluYW1pY1Byb3BzLGRlPTA7ZGU8SWUubGVuZ3RoO2RlKyspe3ZhciB1ZT1JZVtkZV07aWYoIUpyKG8uZW1pdHNPcHRpb25zLHVlKSl7dmFyIEhlPWNbdWVdO2lmKCQpaWYobS5oYXNPd24oQSx1ZSkpSGUhPT1BW3VlXSYmKEFbdWVdPUhlLGVlPSEwKTtlbHNle3ZhciBaZT1tLmNhbWVsaXplKHVlKTtJW1plXT1XdCgkLHosWmUsSGUsbywhMSl9ZWxzZSBIZSE9PUFbdWVdJiYoQVt1ZV09SGUsZWU9ITApfX19ZWxzZXtDdChvLGMsSSxBKSYmKGVlPSEwKTt2YXIgdnQ7Zm9yKHZhciB5dCBpbiB6KSghY3x8IW0uaGFzT3duKGMseXQpJiYoKHZ0PW0uaHlwaGVuYXRlKHl0KSk9PT15dHx8IW0uaGFzT3duKGMsdnQpKSkmJigkP2gmJihoW3l0XSE9PXZvaWQgMHx8aFt2dF0hPT12b2lkIDApJiYoSVt5dF09V3QoJCx6LHl0LHZvaWQgMCxvLCEwKSk6ZGVsZXRlIElbeXRdKTtpZihBIT09eilmb3IodmFyIE5lIGluIEEpKCFjfHwhbS5oYXNPd24oYyxOZSkmJiEwKSYmKGRlbGV0ZSBBW05lXSxlZT0hMCl9ZWUmJlIudHJpZ2dlcihvLCJzZXQiLCIkYXR0cnMiKSxBdChjfHx7fSxJLG8pfWZ1bmN0aW9uIEN0KG8sYyxoLF8pe3ZhcltJLEFdPW8ucHJvcHNPcHRpb25zLHg9ITEsejtpZihjKXtmb3IodmFyICQgaW4gYylpZighbS5pc1Jlc2VydmVkUHJvcCgkKSl7dmFyIGVlPWNbJF0sSWU9dm9pZCAwO0kmJm0uaGFzT3duKEksSWU9bS5jYW1lbGl6ZSgkKSk/IUF8fCFBLmluY2x1ZGVzKEllKT9oW0llXT1lZTooenx8KHo9e30pKVtJZV09ZWU6SnIoby5lbWl0c09wdGlvbnMsJCl8fCghKCQgaW4gXyl8fGVlIT09X1skXSkmJihfWyRdPWVlLHg9ITApfX1pZihBKWZvcih2YXIgZGU9Ui50b1JhdyhoKSx1ZT16fHxtLkVNUFRZX09CSixIZT0wO0hlPEEubGVuZ3RoO0hlKyspe3ZhciBaZT1BW0hlXTtoW1plXT1XdChJLGRlLFplLHVlW1plXSxvLCFtLmhhc093bih1ZSxaZSkpfXJldHVybiB4fWZ1bmN0aW9uIFd0KG8sYyxoLF8sSSxBKXt2YXIgeD1vW2hdO2lmKHghPW51bGwpe3ZhciB6PW0uaGFzT3duKHgsImRlZmF1bHQiKTtpZih6JiZfPT09dm9pZCAwKXt2YXIgJD14LmRlZmF1bHQ7aWYoeC50eXBlIT09RnVuY3Rpb24mJm0uaXNGdW5jdGlvbigkKSl7dmFye3Byb3BzRGVmYXVsdHM6ZWV9PUk7aCBpbiBlZT9fPWVlW2hdOihtaShJKSxfPWVlW2hdPSQuY2FsbChudWxsLGMpLF9pKCkpfWVsc2UgXz0kfXhbMF0mJihBJiYhej9fPSExOnhbMV0mJihfPT09IiJ8fF89PT1tLmh5cGhlbmF0ZShoKSkmJihfPSEwKSl9cmV0dXJuIF99ZnVuY3Rpb24gRXQobyxjKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsXz1jLnByb3BzQ2FjaGUsST1fLmdldChvKTtpZihJKXJldHVybiBJO3ZhciBBPW8ucHJvcHMseD17fSx6PVtdLCQ9ITE7aWYoIW0uaXNGdW5jdGlvbihvKSl7dmFyIGVlPU1lPT57JD0hMDt2YXJbbnQscWVdPUV0KE1lLGMsITApO20uZXh0ZW5kKHgsbnQpLHFlJiZ6LnB1c2goLi4ucWUpfTshaCYmYy5taXhpbnMubGVuZ3RoJiZjLm1peGlucy5mb3JFYWNoKGVlKSxvLmV4dGVuZHMmJmVlKG8uZXh0ZW5kcyksby5taXhpbnMmJm8ubWl4aW5zLmZvckVhY2goZWUpfWlmKCFBJiYhJClyZXR1cm4gbS5pc09iamVjdChvKSYmXy5zZXQobyxtLkVNUFRZX0FSUiksbS5FTVBUWV9BUlI7aWYobS5pc0FycmF5KEEpKWZvcih2YXIgSWU9MDtJZTxBLmxlbmd0aDtJZSsrKXttLmlzU3RyaW5nKEFbSWVdKXx8TygicHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LiIsQVtJZV0pO3ZhciBkZT1tLmNhbWVsaXplKEFbSWVdKTtLZShkZSkmJih4W2RlXT1tLkVNUFRZX09CSil9ZWxzZSBpZihBKXttLmlzT2JqZWN0KEEpfHxPKCJpbnZhbGlkIHByb3BzIG9wdGlvbnMiLEEpO2Zvcih2YXIgdWUgaW4gQSl7dmFyIEhlPW0uY2FtZWxpemUodWUpO2lmKEtlKEhlKSl7dmFyIFplPUFbdWVdLHZ0PXhbSGVdPW0uaXNBcnJheShaZSl8fG0uaXNGdW5jdGlvbihaZSk/e3R5cGU6WmV9Ok9iamVjdC5hc3NpZ24oe30sWmUpO2lmKHZ0KXt2YXIgeXQ9d24oQm9vbGVhbix2dC50eXBlKSxOZT13bihTdHJpbmcsdnQudHlwZSk7dnRbMF09eXQ+LTEsdnRbMV09TmU8MHx8eXQ8TmUsKHl0Pi0xfHxtLmhhc093bih2dCwiZGVmYXVsdCIpKSYmei5wdXNoKEhlKX19fX12YXIgX2U9W3gsel07cmV0dXJuIG0uaXNPYmplY3QobykmJl8uc2V0KG8sX2UpLF9lfWZ1bmN0aW9uIEtlKG8pe3JldHVybiBvWzBdIT09IiQiPyEwOihPKCdJbnZhbGlkIHByb3AgbmFtZTogIicuY29uY2F0KG8sJyIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS4nKSksITEpfWZ1bmN0aW9uIE10KG8pe3ZhciBjPW8mJm8udG9TdHJpbmcoKS5tYXRjaCgvXlxzKihmdW5jdGlvbnxjbGFzcykgKFx3KykvKTtyZXR1cm4gYz9jWzJdOm89PT1udWxsPyJudWxsIjoiIn1mdW5jdGlvbiBfbihvLGMpe3JldHVybiBNdChvKT09PU10KGMpfWZ1bmN0aW9uIHduKG8sYyl7cmV0dXJuIG0uaXNBcnJheShjKT9jLmZpbmRJbmRleChoPT5fbihoLG8pKTptLmlzRnVuY3Rpb24oYykmJl9uKGMsbyk/MDotMX1mdW5jdGlvbiBBdChvLGMsaCl7dmFyIF89Ui50b1JhdyhjKSxJPWgucHJvcHNPcHRpb25zWzBdO2Zvcih2YXIgQSBpbiBJKXt2YXIgeD1JW0FdO3ghPW51bGwmJm5uKEEsX1tBXSx4LCFtLmhhc093bihvLEEpJiYhbS5oYXNPd24obyxtLmh5cGhlbmF0ZShBKSkpfX1mdW5jdGlvbiBubihvLGMsaCxfKXt2YXJ7dHlwZTpJLHJlcXVpcmVkOkEsdmFsaWRhdG9yOnh9PWg7aWYoQSYmXyl7TygnTWlzc2luZyByZXF1aXJlZCBwcm9wOiAiJytvKyciJyk7cmV0dXJufWlmKCEoYz09bnVsbCYmIWgucmVxdWlyZWQpKXtpZihJIT1udWxsJiZJIT09ITApe2Zvcih2YXIgej0hMSwkPW0uaXNBcnJheShJKT9JOltJXSxlZT1bXSxJZT0wO0llPCQubGVuZ3RoJiYhejtJZSsrKXt2YXJ7dmFsaWQ6ZGUsZXhwZWN0ZWRUeXBlOnVlfT1KdChjLCRbSWVdKTtlZS5wdXNoKHVlfHwiIiksej1kZX1pZigheil7TyhHdChvLGMsZWUpKTtyZXR1cm59fXgmJiF4KGMpJiZPKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInK28rJyIuJyl9fXZhciBhcj1tLm1ha2VNYXAoIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50Iik7ZnVuY3Rpb24gSnQobyxjKXt2YXIgaCxfPU10KGMpO2lmKGFyKF8pKXt2YXIgST10eXBlb2YgbztoPUk9PT1fLnRvTG93ZXJDYXNlKCksIWgmJkk9PT0ib2JqZWN0IiYmKGg9byBpbnN0YW5jZW9mIGMpfWVsc2UgXz09PSJPYmplY3QiP2g9bS5pc09iamVjdChvKTpfPT09IkFycmF5Ij9oPW0uaXNBcnJheShvKTpfPT09Im51bGwiP2g9bz09PW51bGw6aD1vIGluc3RhbmNlb2YgYztyZXR1cm57dmFsaWQ6aCxleHBlY3RlZFR5cGU6X319ZnVuY3Rpb24gR3QobyxjLGgpe3ZhciBfPSdJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInLmNvbmNhdChvLCciLicpKyIgRXhwZWN0ZWQgIi5jb25jYXQoaC5tYXAobS5jYXBpdGFsaXplKS5qb2luKCIgfCAiKSksST1oWzBdLEE9bS50b1Jhd1R5cGUoYykseD1SbihjLEkpLHo9Um4oYyxBKTtyZXR1cm4gaC5sZW5ndGg9PT0xJiZlcihJKSYmIUJhKEksQSkmJihfKz0iIHdpdGggdmFsdWUgIi5jb25jYXQoeCkpLF8rPSIsIGdvdCAiLmNvbmNhdChBLCIgIiksZXIoQSkmJihfKz0id2l0aCB2YWx1ZSAiLmNvbmNhdCh6LCIuIikpLF99ZnVuY3Rpb24gUm4obyxjKXtyZXR1cm4gYz09PSJTdHJpbmciPyciJy5jb25jYXQobywnIicpOmM9PT0iTnVtYmVyIj8iIi5jb25jYXQoTnVtYmVyKG8pKToiIi5jb25jYXQobyl9ZnVuY3Rpb24gZXIobyl7dmFyIGM9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07cmV0dXJuIGMuc29tZShoPT5vLnRvTG93ZXJDYXNlKCk9PT1oKX1mdW5jdGlvbiBCYSgpe2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGM9bmV3IEFycmF5KG8pLGg9MDtoPG87aCsrKWNbaF09YXJndW1lbnRzW2hdO3JldHVybiBjLnNvbWUoXz0+Xy50b0xvd2VyQ2FzZSgpPT09ImJvb2xlYW4iKX12YXIgYnM9bz0+b1swXT09PSJfInx8bz09PSIkc3RhYmxlIixNYT1vPT5tLmlzQXJyYXkobyk/by5tYXAoS2kpOltLaShvKV0sQW89KG8sYyxoKT0+e2lmKGMuX24pcmV0dXJuIGM7dmFyIF89S3IoZnVuY3Rpb24oKXtyZXR1cm4gQm4mJk8oJ1Nsb3QgIicuY29uY2F0KG8sJyIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246ICcpKyJ0aGlzIHdpbGwgbm90IHRyYWNrIGRlcGVuZGVuY2llcyB1c2VkIGluIHRoZSBzbG90LiBJbnZva2UgdGhlIHNsb3QgZnVuY3Rpb24gaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC4iKSxNYShjKC4uLmFyZ3VtZW50cykpfSxoKTtyZXR1cm4gXy5fYz0hMSxffSx5cz0obyxjLGgpPT57dmFyIF89by5fY3R4O2Zvcih2YXIgSSBpbiBvKWlmKCFicyhJKSl7dmFyIEE9b1tJXTttLmlzRnVuY3Rpb24oQSk/Y1tJXT1BbyhJLEEsXyk6QSE9bnVsbCYmZnVuY3Rpb24oKXtPKCdOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgIicuY29uY2F0KEksJyIuICcpKyJQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4iKTt2YXIgeD1NYShBKTtjW0ldPSgpPT54fSgpfX0sZWk9KG8sYyk9PntLKG8udm5vZGUpfHxPKCJOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuIik7dmFyIGg9TWEoYyk7by5zbG90cy5kZWZhdWx0PSgpPT5ofSxEYT0obyxjKT0+e2lmKG8udm5vZGUuc2hhcGVGbGFnJjMyKXt2YXIgaD1jLl87aD8oby5zbG90cz1SLnRvUmF3KGMpLG0uZGVmKGMsIl8iLGgpKTp5cyhjLG8uc2xvdHM9e30pfWVsc2Ugby5zbG90cz17fSxjJiZlaShvLGMpO20uZGVmKG8uc2xvdHMsT3MsMSl9LGlhPShvLGMsaCk9Pnt2YXJ7dm5vZGU6XyxzbG90czpJfT1vLEE9ITAseD1tLkVNUFRZX09CSjtpZihfLnNoYXBlRmxhZyYzMil7dmFyIHo9Yy5fO3o/a3I/bS5leHRlbmQoSSxjKTpoJiZ6PT09MT9BPSExOihtLmV4dGVuZChJLGMpLCFoJiZ6PT09MSYmZGVsZXRlIEkuXyk6KEE9IWMuJHN0YWJsZSx5cyhjLEkpKSx4PWN9ZWxzZSBjJiYoZWkobyxjKSx4PXtkZWZhdWx0OjF9KTtpZihBKWZvcih2YXIgJCBpbiBJKSFicygkKSYmISgkIGluIHgpJiZkZWxldGUgSVskXX07ZnVuY3Rpb24gdHIoKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzptLk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBLYT0wO2Z1bmN0aW9uIGNsKG8sYyl7cmV0dXJuIGZ1bmN0aW9uKF8pe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO20uaXNGdW5jdGlvbihfKXx8KF89T2JqZWN0LmFzc2lnbih7fSxfKSksSSE9bnVsbCYmIW0uaXNPYmplY3QoSSkmJihPKCJyb290IHByb3BzIHBhc3NlZCB0byBhcHAubW91bnQoKSBtdXN0IGJlIGFuIG9iamVjdC4iKSxJPW51bGwpO3ZhciBBPXRyKCkseD1uZXcgU2V0LHo9ITEsJD1BLmFwcD17X3VpZDpLYSsrLF9jb21wb25lbnQ6XyxfcHJvcHM6SSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6QSxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOnpvLGdldCBjb25maWcoKXtyZXR1cm4gQS5jb25maWd9LHNldCBjb25maWcoZWUpe08oImFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuIil9LHVzZShlZSl7Zm9yKHZhciBJZT1hcmd1bWVudHMubGVuZ3RoLGRlPW5ldyBBcnJheShJZT4xP0llLTE6MCksdWU9MTt1ZTxJZTt1ZSsrKWRlW3VlLTFdPWFyZ3VtZW50c1t1ZV07cmV0dXJuIHguaGFzKGVlKT9PKCJQbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRhcmdldCBhcHAuIik6ZWUmJm0uaXNGdW5jdGlvbihlZS5pbnN0YWxsKT8oeC5hZGQoZWUpLGVlLmluc3RhbGwoJCwuLi5kZSkpOm0uaXNGdW5jdGlvbihlZSk/KHguYWRkKGVlKSxlZSgkLC4uLmRlKSk6TygnQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiAiaW5zdGFsbCIgZnVuY3Rpb24uJyksJH0sbWl4aW4oZWUpe3JldHVybiBBLm1peGlucy5pbmNsdWRlcyhlZSk/TygiTWl4aW4gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRhcmdldCBhcHAiKyhlZS5uYW1lPyI6ICIuY29uY2F0KGVlLm5hbWUpOiIiKSk6QS5taXhpbnMucHVzaChlZSksJH0sY29tcG9uZW50KGVlLEllKXtyZXR1cm4gZmwoZWUsQS5jb25maWcpLEllPyhBLmNvbXBvbmVudHNbZWVdJiZPKCdDb21wb25lbnQgIicuY29uY2F0KGVlLCciIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLicpKSxBLmNvbXBvbmVudHNbZWVdPUllLCQpOkEuY29tcG9uZW50c1tlZV19LGRpcmVjdGl2ZShlZSxJZSl7cmV0dXJuIFVzKGVlKSxJZT8oQS5kaXJlY3RpdmVzW2VlXSYmTygnRGlyZWN0aXZlICInLmNvbmNhdChlZSwnIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC4nKSksQS5kaXJlY3RpdmVzW2VlXT1JZSwkKTpBLmRpcmVjdGl2ZXNbZWVdfSxtb3VudChlZSxJZSxkZSl7aWYoeilPKCJBcHAgaGFzIGFscmVhZHkgYmVlbiBtb3VudGVkLlxuSWYgeW91IHdhbnQgdG8gcmVtb3VudCB0aGUgc2FtZSBhcHAsIG1vdmUgeW91ciBhcHAgY3JlYXRpb24gbG9naWMgaW50byBhIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGNyZWF0ZSBmcmVzaCBhcHAgaW5zdGFuY2VzIGZvciBlYWNoIG1vdW50IC0gZS5nLiBgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKWAiKTtlbHNle2VlLl9fdnVlX2FwcF9fJiZPKCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cbiBJZiB5b3Ugd2FudCB0byBtb3VudCBhbm90aGVyIGFwcCBvbiB0aGUgc2FtZSBob3N0IGNvbnRhaW5lciwgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgYGFwcC51bm1vdW50KClgIGZpcnN0LiIpO3ZhciB1ZT1HbihfLEkpO3JldHVybiB1ZS5hcHBDb250ZXh0PUEsQS5yZWxvYWQ9KCk9PntvKHFpKHVlKSxlZSxkZSl9LEllJiZjP2ModWUsZWUpOm8odWUsZWUsZGUpLHo9ITAsJC5fY29udGFpbmVyPWVlLGVlLl9fdnVlX2FwcF9fPSQsJC5faW5zdGFuY2U9dWUuY29tcG9uZW50LEpuKCQsem8pLFBzKHVlLmNvbXBvbmVudCl8fHVlLmNvbXBvbmVudC5wcm94eX19LHVubW91bnQoKXt6PyhvKG51bGwsJC5fY29udGFpbmVyKSwkLl9pbnN0YW5jZT1udWxsLEpvKCQpLGRlbGV0ZSAkLl9jb250YWluZXIuX192dWVfYXBwX18pOk8oIkNhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLiIpfSxwcm92aWRlKGVlLEllKXtyZXR1cm4gZWUgaW4gQS5wcm92aWRlcyYmTygnQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgIicuY29uY2F0KFN0cmluZyhlZSksJyIuICcpKyJJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS4iKSxBLnByb3ZpZGVzW2VlXT1JZSwkfX07cmV0dXJuICR9fWZ1bmN0aW9uIEZvKG8sYyxoLF8pe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihtLmlzQXJyYXkobykpe28uZm9yRWFjaCgodnQseXQpPT5Gbyh2dCxjJiYobS5pc0FycmF5KGMpP2NbeXRdOmMpLGgsXyxJKSk7cmV0dXJufWlmKCEobGUoXykmJiFJKSl7dmFyIEE9Xy5zaGFwZUZsYWcmND9QcyhfLmNvbXBvbmVudCl8fF8uY29tcG9uZW50LnByb3h5Ol8uZWwseD1JP251bGw6QSx7aTp6LHI6JH09bztpZigheil7TygiTWlzc2luZyByZWYgb3duZXIgY29udGV4dC4gcmVmIGNhbm5vdCBiZSB1c2VkIG9uIGhvaXN0ZWQgdm5vZGVzLiBBIHZub2RlIHdpdGggcmVmIG11c3QgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbi4iKTtyZXR1cm59dmFyIGVlPWMmJmMucixJZT16LnJlZnM9PT1tLkVNUFRZX09CSj96LnJlZnM9e306ei5yZWZzLGRlPXouc2V0dXBTdGF0ZTtpZihlZSE9bnVsbCYmZWUhPT0kJiYobS5pc1N0cmluZyhlZSk/KEllW2VlXT1udWxsLG0uaGFzT3duKGRlLGVlKSYmKGRlW2VlXT1udWxsKSk6Ui5pc1JlZihlZSkmJihlZS52YWx1ZT1udWxsKSksbS5pc0Z1bmN0aW9uKCQpKUt0KCQseiwxMixbeCxJZV0pO2Vsc2V7dmFyIHVlPW0uaXNTdHJpbmcoJCksSGU9Ui5pc1JlZigkKTtpZih1ZXx8SGUpe3ZhciBaZT0oKT0+e2lmKG8uZil7dmFyIHZ0PXVlP20uaGFzT3duKGRlLCQpP2RlWyRdOkllWyRdOiQudmFsdWU7ST9tLmlzQXJyYXkodnQpJiZtLnJlbW92ZSh2dCxBKTptLmlzQXJyYXkodnQpP3Z0LmluY2x1ZGVzKEEpfHx2dC5wdXNoKEEpOnVlPyhJZVskXT1bQV0sbS5oYXNPd24oZGUsJCkmJihkZVskXT1JZVskXSkpOigkLnZhbHVlPVtBXSxvLmsmJihJZVtvLmtdPSQudmFsdWUpKX1lbHNlIHVlPyhJZVskXT14LG0uaGFzT3duKGRlLCQpJiYoZGVbJF09eCkpOkhlPygkLnZhbHVlPXgsby5rJiYoSWVbby5rXT14KSk6TygiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZToiLCQsIigiLmNvbmNhdCh0eXBlb2YgJCwiKSIpKX07eD8oWmUuaWQ9LTEsaHIoWmUsaCkpOlplKCl9ZWxzZSBPKCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOiIsJCwiKCIuY29uY2F0KHR5cGVvZiAkLCIpIikpfX19dmFyIFdpPSExLFVuPW89Pi9zdmcvLnRlc3Qoby5uYW1lc3BhY2VVUkkpJiZvLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsR2k9bz0+by5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gdmkobyl7dmFye210OmMscDpoLG86e3BhdGNoUHJvcDpfLGNyZWF0ZVRleHQ6SSxuZXh0U2libGluZzpBLHBhcmVudE5vZGU6eCxyZW1vdmU6eixpbnNlcnQ6JCxjcmVhdGVDb21tZW50OmVlfX09byxJZT0oTmUsX2UpPT57aWYoIV9lLmhhc0NoaWxkTm9kZXMoKSl7TygiQXR0ZW1wdGluZyB0byBoeWRyYXRlIGV4aXN0aW5nIG1hcmt1cCBidXQgY29udGFpbmVyIGlzIGVtcHR5LiBQZXJmb3JtaW5nIGZ1bGwgbW91bnQgaW5zdGVhZC4iKSxoKG51bGwsTmUsX2UpLGxyKCksX2UuX3Zub2RlPU5lO3JldHVybn1XaT0hMSxkZShfZS5maXJzdENoaWxkLE5lLG51bGwsbnVsbCxudWxsKSxscigpLF9lLl92bm9kZT1OZSxXaSYmY29uc29sZS5lcnJvcigiSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy4iKX0sZGU9ZnVuY3Rpb24oTmUsX2UsTWUsbnQscWUpe3ZhciBhdD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITEsSXQ9R2koTmUpJiZOZS5kYXRhPT09IlsiLHN0PSgpPT52dChOZSxfZSxNZSxudCxxZSxJdCkse3R5cGU6aSxyZWY6YSxzaGFwZUZsYWc6ZixwYXRjaEZsYWc6cH09X2UsUz1OZS5ub2RlVHlwZTtfZS5lbD1OZSxwPT09LTImJihhdD0hMSxfZS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFyIHc9bnVsbDtzd2l0Y2goaSl7Y2FzZSB1dDpTIT09Mz9fZS5jaGlsZHJlbj09PSIiPygkKF9lLmVsPUkoIiIpLHgoTmUpLE5lKSx3PU5lKTp3PXN0KCk6KE5lLmRhdGEhPT1fZS5jaGlsZHJlbiYmKFdpPSEwLE8oIkh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoOiIrYAotIENsaWVudDogYC5jb25jYXQoSlNPTi5zdHJpbmdpZnkoTmUuZGF0YSkpK2AKLSBTZXJ2ZXI6IGAuY29uY2F0KEpTT04uc3RyaW5naWZ5KF9lLmNoaWxkcmVuKSkpLE5lLmRhdGE9X2UuY2hpbGRyZW4pLHc9QShOZSkpO2JyZWFrO2Nhc2UgeHQ6UyE9PTh8fEl0P3c9c3QoKTp3PUEoTmUpO2JyZWFrO2Nhc2UgWXQ6aWYoSXQmJihOZT1BKE5lKSxTPU5lLm5vZGVUeXBlKSxTPT09MXx8Uz09PTMpe3c9TmU7Zm9yKHZhciBOPSFfZS5jaGlsZHJlbi5sZW5ndGgsVj0wO1Y8X2Uuc3RhdGljQ291bnQ7VisrKU4mJihfZS5jaGlsZHJlbis9dy5ub2RlVHlwZT09PTE/dy5vdXRlckhUTUw6dy5kYXRhKSxWPT09X2Uuc3RhdGljQ291bnQtMSYmKF9lLmFuY2hvcj13KSx3PUEodyk7cmV0dXJuIEl0P0Eodyk6d31lbHNlIHN0KCk7YnJlYWs7Y2FzZSBndDpJdD93PVplKE5lLF9lLE1lLG50LHFlLGF0KTp3PXN0KCk7YnJlYWs7ZGVmYXVsdDppZihmJjEpUyE9PTF8fF9lLnR5cGUudG9Mb3dlckNhc2UoKSE9PU5lLnRhZ05hbWUudG9Mb3dlckNhc2UoKT93PXN0KCk6dz11ZShOZSxfZSxNZSxudCxxZSxhdCk7ZWxzZSBpZihmJjYpe19lLnNsb3RTY29wZUlkcz1xZTt2YXIgRj14KE5lKTtpZihjKF9lLEYsbnVsbCxNZSxudCxVbihGKSxhdCksdz1JdD95dChOZSk6QShOZSksdyYmR2kodykmJncuZGF0YT09PSJ0ZWxlcG9ydCBlbmQiJiYodz1BKHcpKSxsZShfZSkpe3ZhciBxO0l0PyhxPUduKGd0KSxxLmFuY2hvcj13P3cucHJldmlvdXNTaWJsaW5nOkYubGFzdENoaWxkKTpxPU5lLm5vZGVUeXBlPT09Mz9UcygiIik6R24oImRpdiIpLHEuZWw9TmUsX2UuY29tcG9uZW50LnN1YlRyZWU9cX19ZWxzZSBmJjY0P1MhPT04P3c9c3QoKTp3PV9lLnR5cGUuaHlkcmF0ZShOZSxfZSxNZSxudCxxZSxhdCxvLEhlKTpmJjEyOD93PV9lLnR5cGUuaHlkcmF0ZShOZSxfZSxNZSxudCxVbih4KE5lKSkscWUsYXQsbyxkZSk6TygiSW52YWxpZCBIb3N0Vk5vZGUgdHlwZToiLGksIigiLmNvbmNhdCh0eXBlb2YgaSwiKSIpKX1yZXR1cm4gYSE9bnVsbCYmRm8oYSxudWxsLG50LF9lKSx3fSx1ZT0oTmUsX2UsTWUsbnQscWUsYXQpPT57YXQ9YXR8fCEhX2UuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOkl0LHByb3BzOnN0LHBhdGNoRmxhZzppLHNoYXBlRmxhZzphLGRpcnM6Zn09X2UscD1JdD09PSJpbnB1dCImJmZ8fEl0PT09Im9wdGlvbiI7e2lmKGYmJk9vKF9lLG51bGwsTWUsImNyZWF0ZWQiKSxzdClpZihwfHwhYXR8fGkmKDE2fDMyKSlmb3IodmFyIFMgaW4gc3QpKHAmJlMuZW5kc1dpdGgoInZhbHVlIil8fG0uaXNPbihTKSYmIW0uaXNSZXNlcnZlZFByb3AoUykpJiZfKE5lLFMsbnVsbCxzdFtTXSwhMSx2b2lkIDAsTWUpO2Vsc2Ugc3Qub25DbGljayYmXyhOZSwib25DbGljayIsbnVsbCxzdC5vbkNsaWNrLCExLHZvaWQgMCxNZSk7dmFyIHc7aWYoKHc9c3QmJnN0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJkZyKHcsTWUsX2UpLGYmJk9vKF9lLG51bGwsTWUsImJlZm9yZU1vdW50IiksKCh3PXN0JiZzdC5vblZub2RlTW91bnRlZCl8fGYpJiZ0YSgoKT0+e3cmJkZyKHcsTWUsX2UpLGYmJk9vKF9lLG51bGwsTWUsIm1vdW50ZWQiKX0sbnQpLGEmMTYmJiEoc3QmJihzdC5pbm5lckhUTUx8fHN0LnRleHRDb250ZW50KSkpZm9yKHZhciBOPUhlKE5lLmZpcnN0Q2hpbGQsX2UsTmUsTWUsbnQscWUsYXQpLFY9ITE7Tjspe1dpPSEwLFZ8fChPKCJIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggaW4gPCIuY29uY2F0KF9lLnR5cGUsIj46ICIpKyJzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uIiksVj0hMCk7dmFyIEY9TjtOPU4ubmV4dFNpYmxpbmcseihGKX1lbHNlIGEmOCYmTmUudGV4dENvbnRlbnQhPT1fZS5jaGlsZHJlbiYmKFdpPSEwLE8oIkh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggaW4gPCIuY29uY2F0KF9lLnR5cGUsYD46CmApKyItIENsaWVudDogIi5jb25jYXQoTmUudGV4dENvbnRlbnQsYApgKSsiLSBTZXJ2ZXI6ICIuY29uY2F0KF9lLmNoaWxkcmVuKSksTmUudGV4dENvbnRlbnQ9X2UuY2hpbGRyZW4pfXJldHVybiBOZS5uZXh0U2libGluZ30sSGU9KE5lLF9lLE1lLG50LHFlLGF0LEl0KT0+e0l0PUl0fHwhIV9lLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIHN0PV9lLmNoaWxkcmVuLGk9c3QubGVuZ3RoLGE9ITEsZj0wO2Y8aTtmKyspe3ZhciBwPUl0P3N0W2ZdOnN0W2ZdPUtpKHN0W2ZdKTtpZihOZSlOZT1kZShOZSxwLG50LHFlLGF0LEl0KTtlbHNle2lmKHAudHlwZT09PXV0JiYhcC5jaGlsZHJlbiljb250aW51ZTtXaT0hMCxhfHwoTygiSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIGluIDwiLmNvbmNhdChNZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIj46ICIpKyJzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBmZXdlciBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLiIpLGE9ITApLGgobnVsbCxwLE1lLG51bGwsbnQscWUsVW4oTWUpLGF0KX19cmV0dXJuIE5lfSxaZT0oTmUsX2UsTWUsbnQscWUsYXQpPT57dmFye3Nsb3RTY29wZUlkczpJdH09X2U7SXQmJihxZT1xZT9xZS5jb25jYXQoSXQpOkl0KTt2YXIgc3Q9eChOZSksaT1IZShBKE5lKSxfZSxzdCxNZSxudCxxZSxhdCk7cmV0dXJuIGkmJkdpKGkpJiZpLmRhdGE9PT0iXSI/QShfZS5hbmNob3I9aSk6KFdpPSEwLCQoX2UuYW5jaG9yPWVlKCJdIiksc3QsaSksaSl9LHZ0PShOZSxfZSxNZSxudCxxZSxhdCk9PntpZihXaT0hMCxPKGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDoKLSBDbGllbnQgdm5vZGU6YCxfZS50eXBlLGAKLSBTZXJ2ZXIgcmVuZGVyZWQgRE9NOmAsTmUsTmUubm9kZVR5cGU9PT0zPyIodGV4dCkiOkdpKE5lKSYmTmUuZGF0YT09PSJbIj8iKHN0YXJ0IG9mIGZyYWdtZW50KSI6IiIpLF9lLmVsPW51bGwsYXQpZm9yKHZhciBJdD15dChOZSk7Oyl7dmFyIHN0PUEoTmUpO2lmKHN0JiZzdCE9PUl0KXooc3QpO2Vsc2UgYnJlYWt9dmFyIGk9QShOZSksYT14KE5lKTtyZXR1cm4geihOZSksaChudWxsLF9lLGEsaSxNZSxudCxVbihhKSxxZSksaX0seXQ9TmU9Pntmb3IodmFyIF9lPTA7TmU7KWlmKE5lPUEoTmUpLE5lJiZHaShOZSkmJihOZS5kYXRhPT09IlsiJiZfZSsrLE5lLmRhdGE9PT0iXSIpKXtpZihfZT09PTApcmV0dXJuIEEoTmUpO19lLS19cmV0dXJuIE5lfTtyZXR1cm5bSWUsZGVdfXZhciBJaSx0aTtmdW5jdGlvbiAkcihvLGMpe28uYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UmJlBpKCkmJnRpLm1hcmsoInZ1ZS0iLmNvbmNhdChjLCItIikuY29uY2F0KG8udWlkKSksRm4obyxjLFBpKCk/dGkubm93KCk6RGF0ZS5ub3coKSl9ZnVuY3Rpb24gT3IobyxjKXtpZihvLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlJiZQaSgpKXt2YXIgaD0idnVlLSIuY29uY2F0KGMsIi0iKS5jb25jYXQoby51aWQpLF89aCsiOmVuZCI7dGkubWFyayhfKSx0aS5tZWFzdXJlKCI8Ii5jb25jYXQoU2EobyxvLnR5cGUpLCI+ICIpLmNvbmNhdChjKSxoLF8pLHRpLmNsZWFyTWFya3MoaCksdGkuY2xlYXJNYXJrcyhfKX13cihvLGMsUGkoKT90aS5ub3coKTpEYXRlLm5vdygpKX1mdW5jdGlvbiBQaSgpe3JldHVybiBJaSE9PXZvaWQgMHx8KHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cucGVyZm9ybWFuY2U/KElpPSEwLHRpPXdpbmRvdy5wZXJmb3JtYW5jZSk6SWk9ITEpLElpfWZ1bmN0aW9uIEVzKCl7dmFyIG89W107aWYoby5sZW5ndGgpe3ZhciBjPW8ubGVuZ3RoPjE7Y29uc29sZS53YXJuKCJGZWF0dXJlIGZsYWciLmNvbmNhdChjPyJzIjoiIiwiICIpLmNvbmNhdChvLmpvaW4oIiwgIiksIiAiKS5jb25jYXQoYz8iYXJlIjoiaXMiLCIgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsICIpK2B3aGljaCBleHBlY3RzIHRoZXNlIGNvbXBpbGUtdGltZSBmZWF0dXJlIGZsYWdzIHRvIGJlIGdsb2JhbGx5IGluamVjdGVkIHZpYSB0aGUgYnVuZGxlciBjb25maWcgaW4gb3JkZXIgdG8gZ2V0IGJldHRlciB0cmVlLXNoYWtpbmcgaW4gdGhlIHByb2R1Y3Rpb24gYnVuZGxlLgoKRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gKX19dmFyIGhyPXRhO2Z1bmN0aW9uIEFyKG8pe3JldHVybiBuaShvKX1mdW5jdGlvbiB6cyhvKXtyZXR1cm4gbmkobyx2aSl9ZnVuY3Rpb24gbmkobyxjKXtFcygpO3ZhciBoPW0uZ2V0R2xvYmFsVGhpcygpO2guX19WVUVfXz0hMCxsaShoLl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18saCk7dmFye2luc2VydDpfLHJlbW92ZTpJLHBhdGNoUHJvcDpBLGZvcmNlUGF0Y2hQcm9wOngsY3JlYXRlRWxlbWVudDp6LGNyZWF0ZVRleHQ6JCxjcmVhdGVDb21tZW50OmVlLHNldFRleHQ6SWUsc2V0RWxlbWVudFRleHQ6ZGUscGFyZW50Tm9kZTp1ZSxuZXh0U2libGluZzpIZSxzZXRTY29wZUlkOlplPW0uTk9PUCxpbnNlcnRTdGF0aWNDb250ZW50OnZ0fT1vLHl0PWZ1bmN0aW9uKEIsaixpZSl7dmFyIHllPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHZlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpudWxsLGV0PWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxHZT1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106bnVsbCx0dD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06a3I/ITE6ISFqLmR5bmFtaWNDaGlsZHJlbjtpZihCIT09ail7QiYmIXZyKEIsaikmJih5ZT1MZShCKSxYZShCLG9lLHZlLCEwKSxCPW51bGwpLGoucGF0Y2hGbGFnPT09LTImJih0dD0hMSxqLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXJ7dHlwZTpWZSxyZWY6THQsc2hhcGVGbGFnOkJ0fT1qO3N3aXRjaChWZSl7Y2FzZSB1dDpOZShCLGosaWUseWUpO2JyZWFrO2Nhc2UgeHQ6X2UoQixqLGllLHllKTticmVhaztjYXNlIFl0OkI9PW51bGw/TWUoaixpZSx5ZSxldCk6bnQoQixqLGllLGV0KTticmVhaztjYXNlIGd0OncoQixqLGllLHllLG9lLHZlLGV0LEdlLHR0KTticmVhaztkZWZhdWx0OkJ0JjE/SXQoQixqLGllLHllLG9lLHZlLGV0LEdlLHR0KTpCdCY2P04oQixqLGllLHllLG9lLHZlLGV0LEdlLHR0KTpCdCY2NHx8QnQmMTI4P1ZlLnByb2Nlc3MoQixqLGllLHllLG9lLHZlLGV0LEdlLHR0LGl0KTpPKCJJbnZhbGlkIFZOb2RlIHR5cGU6IixWZSwiKCIuY29uY2F0KHR5cGVvZiBWZSwiKSIpKX1MdCE9bnVsbCYmb2UmJkZvKEx0LEImJkIucmVmLHZlLGp8fEIsIWopfX0sTmU9KEIsaixpZSx5ZSk9PntpZihCPT1udWxsKV8oai5lbD0kKGouY2hpbGRyZW4pLGllLHllKTtlbHNle3ZhciBvZT1qLmVsPUIuZWw7ai5jaGlsZHJlbiE9PUIuY2hpbGRyZW4mJkllKG9lLGouY2hpbGRyZW4pfX0sX2U9KEIsaixpZSx5ZSk9PntCPT1udWxsP18oai5lbD1lZShqLmNoaWxkcmVufHwiIiksaWUseWUpOmouZWw9Qi5lbH0sTWU9KEIsaixpZSx5ZSk9PntbQi5lbCxCLmFuY2hvcl09dnQoQi5jaGlsZHJlbixqLGllLHllLEIuZWwsQi5hbmNob3IpfSxudD0oQixqLGllLHllKT0+e2lmKGouY2hpbGRyZW4hPT1CLmNoaWxkcmVuKXt2YXIgb2U9SGUoQi5hbmNob3IpO2F0KEIpLFtqLmVsLGouYW5jaG9yXT12dChqLmNoaWxkcmVuLGllLG9lLHllKX1lbHNlIGouZWw9Qi5lbCxqLmFuY2hvcj1CLmFuY2hvcn0scWU9KEIsaixpZSk9Pntmb3IodmFye2VsOnllLGFuY2hvcjpvZX09Qix2ZTt5ZSYmeWUhPT1vZTspdmU9SGUoeWUpLF8oeWUsaixpZSkseWU9dmU7XyhvZSxqLGllKX0sYXQ9Qj0+e2Zvcih2YXJ7ZWw6aixhbmNob3I6aWV9PUIseWU7aiYmaiE9PWllOyl5ZT1IZShqKSxJKGopLGo9eWU7SShpZSl9LEl0PShCLGosaWUseWUsb2UsdmUsZXQsR2UsdHQpPT57ZXQ9ZXR8fGoudHlwZT09PSJzdmciLEI9PW51bGw/c3QoaixpZSx5ZSxvZSx2ZSxldCxHZSx0dCk6ZihCLGosb2UsdmUsZXQsR2UsdHQpfSxzdD0oQixqLGllLHllLG9lLHZlLGV0LEdlKT0+e3ZhciB0dCxWZSx7dHlwZTpMdCxwcm9wczpCdCxzaGFwZUZsYWc6VXQsdHJhbnNpdGlvbjp1bixkaXJzOllufT1CO2lmKHR0PUIuZWw9eihCLnR5cGUsdmUsQnQmJkJ0LmlzLEJ0KSxVdCY4P2RlKHR0LEIuY2hpbGRyZW4pOlV0JjE2JiZhKEIuY2hpbGRyZW4sdHQsbnVsbCx5ZSxvZSx2ZSYmTHQhPT0iZm9yZWlnbk9iamVjdCIsZXQsR2UpLFluJiZPbyhCLG51bGwseWUsImNyZWF0ZWQiKSxpKHR0LEIsQi5zY29wZUlkLGV0LHllKSxCdCl7Zm9yKHZhciBxdCBpbiBCdClxdCE9PSJ2YWx1ZSImJiFtLmlzUmVzZXJ2ZWRQcm9wKHF0KSYmQSh0dCxxdCxudWxsLEJ0W3F0XSx2ZSxCLmNoaWxkcmVuLHllLG9lLEVlLEIuaG9zdEluc3RhbmNlKTsidmFsdWUiaW4gQnQmJkEodHQsInZhbHVlIixudWxsLEJ0LnZhbHVlLCExLFtdLHllLG51bGwsdm9pZCAwLEIuaG9zdEluc3RhbmNlKSwoVmU9QnQub25Wbm9kZUJlZm9yZU1vdW50KSYmRnIoVmUseWUsQil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCJfX3Zub2RlIix7dmFsdWU6QixlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCJfX3Z1ZVBhcmVudENvbXBvbmVudCIse3ZhbHVlOnllLGVudW1lcmFibGU6ITF9KSxZbiYmT28oQixudWxsLHllLCJiZWZvcmVNb3VudCIpO3ZhciBibj0oIW9lfHxvZSYmIW9lLnBlbmRpbmdCcmFuY2gpJiZ1biYmIXVuLnBlcnNpc3RlZDtibiYmdW4uYmVmb3JlRW50ZXIodHQpLF8odHQsaixpZSksKChWZT1CdCYmQnQub25Wbm9kZU1vdW50ZWQpfHxibnx8WW4pJiZocigoKT0+e1ZlJiZGcihWZSx5ZSxCKSxibiYmdW4uZW50ZXIodHQpLFluJiZPbyhCLG51bGwseWUsIm1vdW50ZWQiKX0sb2UpfSxpPShCLGosaWUseWUsb2UpPT57aWYoaWUmJlplKEIsaWUpLHllKWZvcih2YXIgdmU9MDt2ZTx5ZS5sZW5ndGg7dmUrKylaZShCLHllW3ZlXSk7aWYob2Upe3ZhciBldD1vZS5zdWJUcmVlO2lmKGV0LnBhdGNoRmxhZz4wJiZldC5wYXRjaEZsYWcmMjA0OCYmKGV0PXlvKGV0LmNoaWxkcmVuKXx8ZXQpLGo9PT1ldCl7dmFyIEdlPW9lLnZub2RlO2koQixHZSxHZS5zY29wZUlkLEdlLnNsb3RTY29wZUlkcyxvZS5wYXJlbnQpfX19LGE9ZnVuY3Rpb24oQixqLGllLHllLG9lLHZlLGV0LEdlKXtmb3IodmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTowLFZlPXR0O1ZlPEIubGVuZ3RoO1ZlKyspe3ZhciBMdD1CW1ZlXT1HZT9tcihCW1ZlXSk6S2koQltWZV0pO3l0KG51bGwsTHQsaixpZSx5ZSxvZSx2ZSxldCxHZSl9fSxmPShCLGosaWUseWUsb2UsdmUsZXQpPT57dmFyIEdlPWouZWw9Qi5lbCx7cGF0Y2hGbGFnOnR0LGR5bmFtaWNDaGlsZHJlbjpWZSxkaXJzOkx0fT1qO3R0fD1CLnBhdGNoRmxhZyYxNjt2YXIgQnQ9Qi5wcm9wc3x8bS5FTVBUWV9PQkosVXQ9ai5wcm9wc3x8bS5FTVBUWV9PQkosdW47aWUmJlZvKGllLCExKSwodW49VXQub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJkZyKHVuLGllLGosQiksTHQmJk9vKGosQixpZSwiYmVmb3JlVXBkYXRlIiksaWUmJlZvKGllLCEwKSxrciYmKHR0PTAsZXQ9ITEsVmU9bnVsbCk7dmFyIFluPW9lJiZqLnR5cGUhPT0iZm9yZWlnbk9iamVjdCI7aWYoVmU/KHAoQi5keW5hbWljQ2hpbGRyZW4sVmUsR2UsaWUseWUsWW4sdmUpLGllJiZpZS50eXBlLl9faG1ySWQmJllpKEIsaikpOmV0fHxhZShCLGosR2UsbnVsbCxpZSx5ZSxZbix2ZSwhMSksdHQ+MCl7aWYodHQmMTYpUyhHZSxqLEJ0LFV0LGllLHllLG9lKTtlbHNlIGlmKHR0JjImJkJ0LmNsYXNzIT09VXQuY2xhc3MmJkEoR2UsImNsYXNzIixudWxsLFV0LmNsYXNzLG9lLFtdLGllLG51bGwsdm9pZCAwLGouaG9zdEluc3RhbmNlKSx0dCY0JiZBKEdlLCJzdHlsZSIsQnQuc3R5bGUsVXQuc3R5bGUsb2UsW10saWUsbnVsbCx2b2lkIDAsai5ob3N0SW5zdGFuY2UpLHR0JjgpZm9yKHZhciBxdD1qLmR5bmFtaWNQcm9wcyxibj0wO2JuPHF0Lmxlbmd0aDtibisrKXt2YXIgYmk9cXRbYm5dLHNuPUJ0W2JpXSxUbj1VdFtiaV07KFRuIT09c258fGJpPT09InZhbHVlInx8eCYmeChHZSxiaSkpJiZBKEdlLGJpLHNuLFRuLG9lLEIuY2hpbGRyZW4saWUseWUsRWUsai5ob3N0SW5zdGFuY2UpfXR0JjEmJkIuY2hpbGRyZW4hPT1qLmNoaWxkcmVuJiZkZShHZSxqLmNoaWxkcmVuKX1lbHNlIWV0JiZWZT09bnVsbCYmUyhHZSxqLEJ0LFV0LGllLHllLG9lKTsoKHVuPVV0Lm9uVm5vZGVVcGRhdGVkKXx8THQpJiZocigoKT0+e3VuJiZGcih1bixpZSxqLEIpLEx0JiZPbyhqLEIsaWUsInVwZGF0ZWQiKX0seWUpfSxwPShCLGosaWUseWUsb2UsdmUsZXQpPT57Zm9yKHZhciBHZT0wO0dlPGoubGVuZ3RoO0dlKyspe3ZhciB0dD1CW0dlXSxWZT1qW0dlXSxMdD10dC5lbCYmKHR0LnR5cGU9PT1ndHx8IXZyKHR0LFZlKXx8dHQuc2hhcGVGbGFnJig2fDY0KSk/dWUodHQuZWwpOmllO3l0KHR0LFZlLEx0LG51bGwseWUsb2UsdmUsZXQsITApfX0sUz0oQixqLGllLHllLG9lLHZlLGV0KT0+e2lmKGllIT09eWUpe2lmKGllIT09bS5FTVBUWV9PQkopZm9yKHZhciBHZSBpbiBpZSkhbS5pc1Jlc2VydmVkUHJvcChHZSkmJiEoR2UgaW4geWUpJiZBKEIsR2UsaWVbR2VdLG51bGwsZXQsai5jaGlsZHJlbixvZSx2ZSxFZSxqLmhvc3RJbnN0YW5jZSk7Zm9yKHZhciB0dCBpbiB5ZSlpZighbS5pc1Jlc2VydmVkUHJvcCh0dCkpe3ZhciBWZT15ZVt0dF0sTHQ9aWVbdHRdOyhWZSE9PUx0JiZ0dCE9PSJ2YWx1ZSJ8fHgmJngoQix0dCkpJiZBKEIsdHQsTHQsVmUsZXQsai5jaGlsZHJlbixvZSx2ZSxFZSxqLmhvc3RJbnN0YW5jZSl9InZhbHVlImluIHllJiZBKEIsInZhbHVlIixpZS52YWx1ZSx5ZS52YWx1ZSwhMSxbXSxvZSxudWxsLHZvaWQgMCxqLmhvc3RJbnN0YW5jZSl9fSx3PShCLGosaWUseWUsb2UsdmUsZXQsR2UsdHQpPT57dmFyIFZlPWouZWw9Qj9CLmVsOiQoIiIpLEx0PWouYW5jaG9yPUI/Qi5hbmNob3I6JCgiIikse3BhdGNoRmxhZzpCdCxkeW5hbWljQ2hpbGRyZW46VXQsc2xvdFNjb3BlSWRzOnVufT1qOyhrcnx8QnQmMjA0OCkmJihCdD0wLHR0PSExLFV0PW51bGwpLHVuJiYoR2U9R2U/R2UuY29uY2F0KHVuKTp1biksQj09bnVsbD8oXyhWZSxpZSx5ZSksXyhMdCxpZSx5ZSksYShqLmNoaWxkcmVuLGllLEx0LG9lLHZlLGV0LEdlLHR0KSk6QnQ+MCYmQnQmNjQmJlV0JiZCLmR5bmFtaWNDaGlsZHJlbj8ocChCLmR5bmFtaWNDaGlsZHJlbixVdCxpZSxvZSx2ZSxldCxHZSksb2UmJm9lLnR5cGUuX19obXJJZD9ZaShCLGopOihqLmtleSE9bnVsbHx8b2UmJmo9PT1vZS5zdWJUcmVlKSYmWWkoQixqLCEwKSk6YWUoQixqLGllLEx0LG9lLHZlLGV0LEdlLHR0KX0sTj0oQixqLGllLHllLG9lLHZlLGV0LEdlLHR0KT0+e2ouc2xvdFNjb3BlSWRzPUdlLEI9PW51bGw/ai5zaGFwZUZsYWcmNTEyP29lLmN0eC5hY3RpdmF0ZShqLGllLHllLGV0LHR0KTpWKGosaWUseWUsb2UsdmUsZXQsdHQpOkYoQixqLHR0KX0sVj0oQixqLGllLHllLG9lLHZlLGV0KT0+e3ZhciBHZT1CLmNvbXBvbmVudD11bChCLHllLG9lKTtpZihHZS50eXBlLl9faG1ySWQmJlVpKEdlKSxlbihCKSwkcihHZSwibW91bnQiKSxLKEIpJiYoR2UuY3R4LnJlbmRlcmVyPWl0KSwkcihHZSwiaW5pdCIpLFJpKEdlKSxPcihHZSwiaW5pdCIpLEdlLmFzeW5jRGVwKXtpZihvZSYmb2UucmVnaXN0ZXJEZXAoR2UscSksIUIuZWwpe3ZhciB0dD1HZS5zdWJUcmVlPUduKHh0KTtfZShudWxsLHR0LGosaWUpfXJldHVybn1xKEdlLEIsaixpZSxvZSx2ZSxldCksZ2UoKSxPcihHZSwibW91bnQiKX0sRj0oQixqLGllKT0+e3ZhciB5ZT1qLmNvbXBvbmVudD1CLmNvbXBvbmVudDtpZihIaShCLGosaWUpKWlmKHllLmFzeW5jRGVwJiYheWUuYXN5bmNSZXNvbHZlZCl7ZW4oaiksYmUoeWUsaixpZSksZ2UoKTtyZXR1cm59ZWxzZSB5ZS5uZXh0PWosTnIoeWUudXBkYXRlKSx5ZS51cGRhdGUoKTtlbHNlIGouZWw9Qi5lbCx5ZS52bm9kZT1qfSxxPShCLGosaWUseWUsb2UsdmUsZXQpPT57dmFyIEdlPSgpPT57aWYoQi5pc01vdW50ZWQpe3ZhcntuZXh0OmduLGJ1OlhpLHU6eWkscGFyZW50OnpyLHZub2RlOnVhfT1CLEc9Z24sWDtlbihnbnx8Qi52bm9kZSksVm8oQiwhMSksZ24/KGduLmVsPXVhLmVsLGJlKEIsZ24sZXQpKTpnbj11YSxYaSYmbS5pbnZva2VBcnJheUZucyhYaSksKFg9Z24ucHJvcHMmJmduLnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZGcihYLHpyLGduLHVhKSxWbyhCLCEwKSwkcihCLCJyZW5kZXIiKTt2YXIgd2U9a2UoQik7T3IoQiwicmVuZGVyIik7dmFyICRlPUIuc3ViVHJlZTtCLnN1YlRyZWU9d2UsJHIoQiwicGF0Y2giKSx5dCgkZSx3ZSx1ZSgkZS5lbCksTGUoJGUpLEIsb2UsdmUpLE9yKEIsInBhdGNoIiksZ24uZWw9d2UuZWwsRz09PW51bGwmJlpyKEIsd2UuZWwpLHlpJiZocih5aSxvZSksKFg9Z24ucHJvcHMmJmduLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYmaHIoKCk9PkZyKFgsenIsZ24sdWEpLG9lKSxybyhCKSxnZSgpfWVsc2V7dmFyIEx0LHtlbDpCdCxwcm9wczpVdH09aix7Ym06dW4sbTpZbixwYXJlbnQ6cXR9PUIsYm49bGUoaik7aWYoVm8oQiwhMSksdW4mJm0uaW52b2tlQXJyYXlGbnModW4pLCFibiYmKEx0PVV0JiZVdC5vblZub2RlQmVmb3JlTW91bnQpJiZGcihMdCxxdCxqKSxWbyhCLCEwKSxCdCYmUWUpe3ZhciBiaT0oKT0+eyRyKEIsInJlbmRlciIpLEIuc3ViVHJlZT1rZShCKSxPcihCLCJyZW5kZXIiKSwkcihCLCJoeWRyYXRlIiksUWUoQnQsQi5zdWJUcmVlLEIsb2UsbnVsbCksT3IoQiwiaHlkcmF0ZSIpfTtibj9qLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFCLmlzVW5tb3VudGVkJiZiaSgpKTpiaSgpfWVsc2V7JHIoQiwicmVuZGVyIik7dmFyIHNuPUIuc3ViVHJlZT1rZShCKTtPcihCLCJyZW5kZXIiKSwkcihCLCJwYXRjaCIpLHl0KG51bGwsc24saWUseWUsQixvZSx2ZSksT3IoQiwicGF0Y2giKSxqLmVsPXNuLmVsfWlmKFluJiZocihZbixvZSksIWJuJiYoTHQ9VXQmJlV0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIFRuPWo7aHIoKCk9PkZyKEx0LHF0LFRuKSxvZSl9KGouc2hhcGVGbGFnJjI1Nnx8cXQmJmxlKHF0LnZub2RlKSYmcXQudm5vZGUuc2hhcGVGbGFnJjI1NikmJkIuYSYmaHIoQi5hLG9lKSxCLmlzTW91bnRlZD0hMCx4byhCKSxqPWllPXllPW51bGx9fSx0dD1CLmVmZmVjdD1uZXcgUi5SZWFjdGl2ZUVmZmVjdChHZSwoKT0+WnQoVmUpLEIuc2NvcGUpLFZlPUIudXBkYXRlPSgpPT50dC5ydW4oKTtWZS5pZD1CLnVpZCxWbyhCLCEwKSx0dC5vblRyYWNrPUIucnRjP0x0PT5tLmludm9rZUFycmF5Rm5zKEIucnRjLEx0KTp2b2lkIDAsdHQub25UcmlnZ2VyPUIucnRnP0x0PT5tLmludm9rZUFycmF5Rm5zKEIucnRnLEx0KTp2b2lkIDAsVmUub3duZXJJbnN0YW5jZT1CLFZlKCl9LGJlPShCLGosaWUpPT57ai5jb21wb25lbnQ9Qjt2YXIgeWU9Qi52bm9kZS5wcm9wcztCLnZub2RlPWosQi5uZXh0PW51bGwsYnQoQixqLnByb3BzLHllLGllKSxpYShCLGouY2hpbGRyZW4saWUpLFIucGF1c2VUcmFja2luZygpLEZpKCksUi5yZXNldFRyYWNraW5nKCl9LGFlPWZ1bmN0aW9uKEIsaixpZSx5ZSxvZSx2ZSxldCxHZSl7dmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohMSxWZT1CJiZCLmNoaWxkcmVuLEx0PUI/Qi5zaGFwZUZsYWc6MCxCdD1qLmNoaWxkcmVuLHtwYXRjaEZsYWc6VXQsc2hhcGVGbGFnOnVufT1qO2lmKFV0PjApe2lmKFV0JjEyOCl7QWUoVmUsQnQsaWUseWUsb2UsdmUsZXQsR2UsdHQpO3JldHVybn1lbHNlIGlmKFV0JjI1Nil7bmUoVmUsQnQsaWUseWUsb2UsdmUsZXQsR2UsdHQpO3JldHVybn19dW4mOD8oTHQmMTYmJkVlKFZlLG9lLHZlKSxCdCE9PVZlJiZkZShpZSxCdCkpOkx0JjE2P3VuJjE2P0FlKFZlLEJ0LGllLHllLG9lLHZlLGV0LEdlLHR0KTpFZShWZSxvZSx2ZSwhMCk6KEx0JjgmJmRlKGllLCIiKSx1biYxNiYmYShCdCxpZSx5ZSxvZSx2ZSxldCxHZSx0dCkpfSxuZT0oQixqLGllLHllLG9lLHZlLGV0LEdlLHR0KT0+e0I9Qnx8bS5FTVBUWV9BUlIsaj1qfHxtLkVNUFRZX0FSUjt2YXIgVmU9Qi5sZW5ndGgsTHQ9ai5sZW5ndGgsQnQ9TWF0aC5taW4oVmUsTHQpLFV0O2ZvcihVdD0wO1V0PEJ0O1V0Kyspe3ZhciB1bj1qW1V0XT10dD9tcihqW1V0XSk6S2koaltVdF0pO3l0KEJbVXRdLHVuLGllLG51bGwsb2UsdmUsZXQsR2UsdHQpfVZlPkx0P0VlKEIsb2UsdmUsITAsITEsQnQpOmEoaixpZSx5ZSxvZSx2ZSxldCxHZSx0dCxCdCl9LEFlPShCLGosaWUseWUsb2UsdmUsZXQsR2UsdHQpPT57Zm9yKHZhciBWZT0wLEx0PWoubGVuZ3RoLEJ0PUIubGVuZ3RoLTEsVXQ9THQtMTtWZTw9QnQmJlZlPD1VdDspe3ZhciB1bj1CW1ZlXSxZbj1qW1ZlXT10dD9tcihqW1ZlXSk6S2koaltWZV0pO2lmKHZyKHVuLFluKSl5dCh1bixZbixpZSxudWxsLG9lLHZlLGV0LEdlLHR0KTtlbHNlIGJyZWFrO1ZlKyt9Zm9yKDtWZTw9QnQmJlZlPD1VdDspe3ZhciBxdD1CW0J0XSxibj1qW1V0XT10dD9tcihqW1V0XSk6S2koaltVdF0pO2lmKHZyKHF0LGJuKSl5dChxdCxibixpZSxudWxsLG9lLHZlLGV0LEdlLHR0KTtlbHNlIGJyZWFrO0J0LS0sVXQtLX1pZihWZT5CdCl7aWYoVmU8PVV0KWZvcih2YXIgYmk9VXQrMSxzbj1iaTxMdD9qW2JpXS5lbDp5ZTtWZTw9VXQ7KXl0KG51bGwsaltWZV09dHQ/bXIoaltWZV0pOktpKGpbVmVdKSxpZSxzbixvZSx2ZSxldCxHZSx0dCksVmUrK31lbHNlIGlmKFZlPlV0KWZvcig7VmU8PUJ0OylYZShCW1ZlXSxvZSx2ZSwhMCksVmUrKztlbHNle3ZhciBUbj1WZSxnbj1WZSxYaT1uZXcgTWFwO2ZvcihWZT1nbjtWZTw9VXQ7VmUrKyl7dmFyIHlpPWpbVmVdPXR0P21yKGpbVmVdKTpLaShqW1ZlXSk7eWkua2V5IT1udWxsJiYoWGkuaGFzKHlpLmtleSkmJk8oIkR1cGxpY2F0ZSBrZXlzIGZvdW5kIGR1cmluZyB1cGRhdGU6IixKU09OLnN0cmluZ2lmeSh5aS5rZXkpLCJNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLiIpLFhpLnNldCh5aS5rZXksVmUpKX12YXIgenIsdWE9MCxHPVV0LWduKzEsWD0hMSx3ZT0wLCRlPW5ldyBBcnJheShHKTtmb3IoVmU9MDtWZTxHO1ZlKyspJGVbVmVdPTA7Zm9yKFZlPVRuO1ZlPD1CdDtWZSsrKXt2YXIgemU9QltWZV07aWYodWE+PUcpe1hlKHplLG9lLHZlLCEwKTtjb250aW51ZX12YXIgcnQ9dm9pZCAwO2lmKHplLmtleSE9bnVsbClydD1YaS5nZXQoemUua2V5KTtlbHNlIGZvcih6cj1nbjt6cjw9VXQ7enIrKylpZigkZVt6ci1nbl09PT0wJiZ2cih6ZSxqW3pyXSkpe3J0PXpyO2JyZWFrfXJ0PT09dm9pZCAwP1hlKHplLG9lLHZlLCEwKTooJGVbcnQtZ25dPVZlKzEscnQ+PXdlP3dlPXJ0Olg9ITAseXQoemUsaltydF0saWUsbnVsbCxvZSx2ZSxldCxHZSx0dCksdWErKyl9dmFyIG10PVg/RWEoJGUpOm0uRU1QVFlfQVJSO2Zvcih6cj1tdC5sZW5ndGgtMSxWZT1HLTE7VmU+PTA7VmUtLSl7dmFyIG90PWduK1ZlLGN0PWpbb3RdLFllPW90KzE8THQ/altvdCsxXS5lbDp5ZTskZVtWZV09PT0wP3l0KG51bGwsY3QsaWUsWWUsb2UsdmUsZXQsR2UsdHQpOlgmJih6cjwwfHxWZSE9PW10W3pyXT9EZShjdCxpZSxZZSwyKTp6ci0tKX19fSxEZT1mdW5jdGlvbihCLGosaWUseWUpe3ZhciBvZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6dmUsdHlwZTpldCx0cmFuc2l0aW9uOkdlLGNoaWxkcmVuOnR0LHNoYXBlRmxhZzpWZX09QjtpZihWZSY2KXtEZShCLmNvbXBvbmVudC5zdWJUcmVlLGosaWUseWUpO3JldHVybn1pZihWZSYxMjgpe0Iuc3VzcGVuc2UubW92ZShqLGllLHllKTtyZXR1cm59aWYoVmUmNjQpe2V0Lm1vdmUoQixqLGllLGl0KTtyZXR1cm59aWYoZXQ9PT1ndCl7Xyh2ZSxqLGllKTtmb3IodmFyIEx0PTA7THQ8dHQubGVuZ3RoO0x0KyspRGUodHRbTHRdLGosaWUseWUpO18oQi5hbmNob3IsaixpZSk7cmV0dXJufWlmKGV0PT09WXQpe3FlKEIsaixpZSk7cmV0dXJufXZhciBCdD15ZSE9PTImJlZlJjEmJkdlO2lmKEJ0KWlmKHllPT09MClHZS5iZWZvcmVFbnRlcih2ZSksXyh2ZSxqLGllKSxocigoKT0+R2UuZW50ZXIodmUpLG9lKTtlbHNle3ZhcntsZWF2ZTpVdCxkZWxheUxlYXZlOnVuLGFmdGVyTGVhdmU6WW59PUdlLHF0PSgpPT5fKHZlLGosaWUpLGJuPSgpPT57VXQodmUsKCk9PntxdCgpLFluJiZZbigpfSl9O3VuP3VuKHZlLHF0LGJuKTpibigpfWVsc2UgXyh2ZSxqLGllKX0sWGU9ZnVuY3Rpb24oQixqLGllKXt2YXIgeWU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSx7dHlwZTp2ZSxwcm9wczpldCxyZWY6R2UsY2hpbGRyZW46dHQsZHluYW1pY0NoaWxkcmVuOlZlLHNoYXBlRmxhZzpMdCxwYXRjaEZsYWc6QnQsZGlyczpVdH09QjtpZihHZSE9bnVsbCYmRm8oR2UsbnVsbCxpZSxCLCEwKSxMdCYyNTYpe2ouY3R4LmRlYWN0aXZhdGUoQik7cmV0dXJufXZhciB1bj1MdCYxJiZVdCxZbj0hbGUoQikscXQ7aWYoWW4mJihxdD1ldCYmZXQub25Wbm9kZUJlZm9yZVVubW91bnQpJiZGcihxdCxqLEIpLEx0JjYpc2UoQi5jb21wb25lbnQsaWUseWUpO2Vsc2V7aWYoTHQmMTI4KXtCLnN1c3BlbnNlLnVubW91bnQoaWUseWUpO3JldHVybn11biYmT28oQixudWxsLGosImJlZm9yZVVubW91bnQiKSxMdCY2ND9CLnR5cGUucmVtb3ZlKEIsaixpZSxvZSxpdCx5ZSk6VmUmJih2ZSE9PWd0fHxCdD4wJiZCdCY2NCk/RWUoVmUsaixpZSwhMSwhMCk6KHZlPT09Z3QmJkJ0JigxMjh8MjU2KXx8IW9lJiZMdCYxNikmJkVlKHR0LGosaWUpLHllJiZmdChCKX0oWW4mJihxdD1ldCYmZXQub25Wbm9kZVVubW91bnRlZCl8fHVuKSYmaHIoKCk9PntxdCYmRnIocXQsaixCKSx1biYmT28oQixudWxsLGosInVubW91bnRlZCIpfSxpZSl9LGZ0PUI9Pnt2YXJ7dHlwZTpqLGVsOmllLGFuY2hvcjp5ZSx0cmFuc2l0aW9uOm9lfT1CO2lmKGo9PT1ndCl7Qi5wYXRjaEZsYWc+MCYmQi5wYXRjaEZsYWcmMjA0OCYmb2UmJiFvZS5wZXJzaXN0ZWQ/Qi5jaGlsZHJlbi5mb3JFYWNoKFZlPT57VmUudHlwZT09PXh0P0koVmUuZWwpOmZ0KFZlKX0pOlRlKGllLHllKTtyZXR1cm59aWYoaj09PVl0KXthdChCKTtyZXR1cm59dmFyIHZlPSgpPT57SShpZSksb2UmJiFvZS5wZXJzaXN0ZWQmJm9lLmFmdGVyTGVhdmUmJm9lLmFmdGVyTGVhdmUoKX07aWYoQi5zaGFwZUZsYWcmMSYmb2UmJiFvZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTpldCxkZWxheUxlYXZlOkdlfT1vZSx0dD0oKT0+ZXQoaWUsdmUpO0dlP0dlKEIuZWwsdmUsdHQpOnR0KCl9ZWxzZSB2ZSgpfSxUZT0oQixqKT0+e2Zvcih2YXIgaWU7QiE9PWo7KWllPUhlKEIpLEkoQiksQj1pZTtJKGopfSxzZT0oQixqLGllKT0+e0IudHlwZS5fX2htcklkJiZZcihCKTt2YXJ7YnVtOnllLHNjb3BlOm9lLHVwZGF0ZTp2ZSxzdWJUcmVlOmV0LHVtOkdlfT1CO3llJiZtLmludm9rZUFycmF5Rm5zKHllKSxvZS5zdG9wKCksdmUmJih2ZS5hY3RpdmU9ITEsWGUoZXQsQixqLGllKSksR2UmJmhyKEdlLGopLGhyKCgpPT57Qi5pc1VubW91bnRlZD0hMH0saiksaiYmai5wZW5kaW5nQnJhbmNoJiYhai5pc1VubW91bnRlZCYmQi5hc3luY0RlcCYmIUIuYXN5bmNSZXNvbHZlZCYmQi5zdXNwZW5zZUlkPT09ai5wZW5kaW5nSWQmJihqLmRlcHMtLSxqLmRlcHM9PT0wJiZqLnJlc29sdmUoKSkscXIoQil9LEVlPWZ1bmN0aW9uKEIsaixpZSl7Zm9yKHZhciB5ZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsb2U9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHZlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTowLGV0PXZlO2V0PEIubGVuZ3RoO2V0KyspWGUoQltldF0saixpZSx5ZSxvZSl9LExlPUI9PkIuc2hhcGVGbGFnJjY/TGUoQi5jb21wb25lbnQuc3ViVHJlZSk6Qi5zaGFwZUZsYWcmMTI4P0Iuc3VzcGVuc2UubmV4dCgpOkhlKEIuYW5jaG9yfHxCLmVsKSxGZT0oQixqLGllKT0+e0I9PW51bGw/ai5fdm5vZGUmJlhlKGouX3Zub2RlLG51bGwsbnVsbCwhMCk6eXQoai5fdm5vZGV8fG51bGwsQixqLG51bGwsbnVsbCxudWxsLGllKSxGaSgpLGxyKCksai5fdm5vZGU9Qn0saXQ9e3A6eXQsdW06WGUsbTpEZSxyOmZ0LG10OlYsbWM6YSxwYzphZSxwYmM6cCxuOkxlLG99LFR0LFFlO3JldHVybiBjJiYoW1R0LFFlXT1jKGl0KSkse3JlbmRlcjpGZSxoeWRyYXRlOlR0LGNyZWF0ZUFwcDpjbChGZSxUdCl9fWZ1bmN0aW9uIFZvKG8sYyl7dmFye2VmZmVjdDpoLHVwZGF0ZTpffT1vO2guYWxsb3dSZWN1cnNlPV8uYWxsb3dSZWN1cnNlPWN9ZnVuY3Rpb24gWWkobyxjKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsXz1vLmNoaWxkcmVuLEk9Yy5jaGlsZHJlbjtpZihtLmlzQXJyYXkoXykmJm0uaXNBcnJheShJKSlmb3IodmFyIEE9MDtBPF8ubGVuZ3RoO0ErKyl7dmFyIHg9X1tBXSx6PUlbQV07ei5zaGFwZUZsYWcmMSYmIXouZHluYW1pY0NoaWxkcmVuJiYoKHoucGF0Y2hGbGFnPD0wfHx6LnBhdGNoRmxhZz09PTMyKSYmKHo9SVtBXT1tcihJW0FdKSx6LmVsPXguZWwpLGh8fFlpKHgseikpLHoudHlwZT09PXV0JiYoei5lbD14LmVsKSx6LnR5cGU9PT14dCYmIXouZWwmJih6LmVsPXguZWwpfX1mdW5jdGlvbiBFYShvKXt2YXIgYz1vLnNsaWNlKCksaD1bMF0sXyxJLEEseCx6LCQ9by5sZW5ndGg7Zm9yKF89MDtfPCQ7XysrKXt2YXIgZWU9b1tfXTtpZihlZSE9PTApe2lmKEk9aFtoLmxlbmd0aC0xXSxvW0ldPGVlKXtjW19dPUksaC5wdXNoKF8pO2NvbnRpbnVlfWZvcihBPTAseD1oLmxlbmd0aC0xO0E8eDspej1BK3g+PjEsb1toW3pdXTxlZT9BPXorMTp4PXo7ZWU8b1toW0FdXSYmKEE+MCYmKGNbX109aFtBLTFdKSxoW0FdPV8pfX1mb3IoQT1oLmxlbmd0aCx4PWhbQS0xXTtBLS0gPjA7KWhbQV09eCx4PWNbeF07cmV0dXJuIGh9dmFyIExhPW89Pm8uX19pc1RlbGVwb3J0LHBvPW89Pm8mJihvLmRpc2FibGVkfHxvLmRpc2FibGVkPT09IiIpLE5pPW89PnR5cGVvZiBTVkdFbGVtZW50IT0idW5kZWZpbmVkIiYmbyBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsd3M9KG8sYyk9Pnt2YXIgaD1vJiZvLnRvO2lmKG0uaXNTdHJpbmcoaCkpaWYoYyl7dmFyIF89YyhoKTtyZXR1cm4gX3x8TygnRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciAiJy5jb25jYXQoaCwnIi4gJykrIk5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLiIpLF99ZWxzZSByZXR1cm4gTygiQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pIiksbnVsbDtlbHNlIHJldHVybiFoJiYhcG8obykmJk8oIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0OiAiLmNvbmNhdChoKSksaH0sVW89e19faXNUZWxlcG9ydDohMCxwcm9jZXNzKG8sYyxoLF8sSSxBLHgseiwkLGVlKXt2YXJ7bWM6SWUscGM6ZGUscGJjOnVlLG86e2luc2VydDpIZSxxdWVyeVNlbGVjdG9yOlplLGNyZWF0ZVRleHQ6dnQsY3JlYXRlQ29tbWVudDp5dH19PWVlLE5lPXBvKGMucHJvcHMpLHtzaGFwZUZsYWc6X2UsY2hpbGRyZW46TWUsZHluYW1pY0NoaWxkcmVuOm50fT1jO2lmKGtyJiYoJD0hMSxudD1udWxsKSxvPT1udWxsKXt2YXIgcWU9Yy5lbD15dCgidGVsZXBvcnQgc3RhcnQiKSxhdD1jLmFuY2hvcj15dCgidGVsZXBvcnQgZW5kIik7SGUocWUsaCxfKSxIZShhdCxoLF8pO3ZhciBJdD1jLnRhcmdldD13cyhjLnByb3BzLFplKSxzdD1jLnRhcmdldEFuY2hvcj12dCgiIik7SXQ/KEhlKHN0LEl0KSx4PXh8fE5pKEl0KSk6TmV8fE8oIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIG1vdW50OiIsSXQsIigiLmNvbmNhdCh0eXBlb2YgSXQsIikiKSk7dmFyIGk9KEYscSk9PntfZSYxNiYmSWUoTWUsRixxLEksQSx4LHosJCl9O05lP2koaCxhdCk6SXQmJmkoSXQsc3QpfWVsc2V7Yy5lbD1vLmVsO3ZhciBhPWMuYW5jaG9yPW8uYW5jaG9yLGY9Yy50YXJnZXQ9by50YXJnZXQscD1jLnRhcmdldEFuY2hvcj1vLnRhcmdldEFuY2hvcixTPXBvKG8ucHJvcHMpLHc9Uz9oOmYsTj1TP2E6cDtpZih4PXh8fE5pKGYpLG50Pyh1ZShvLmR5bmFtaWNDaGlsZHJlbixudCx3LEksQSx4LHopLFlpKG8sYywhMCkpOiR8fGRlKG8sYyx3LE4sSSxBLHgseiwhMSksTmUpU3x8U3MoYyxoLGEsZWUsMSk7ZWxzZSBpZigoYy5wcm9wcyYmYy5wcm9wcy50bykhPT0oby5wcm9wcyYmby5wcm9wcy50bykpe3ZhciBWPWMudGFyZ2V0PXdzKGMucHJvcHMsWmUpO1Y/U3MoYyxWLG51bGwsZWUsMCk6TygiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOiIsZiwiKCIuY29uY2F0KHR5cGVvZiBmLCIpIikpfWVsc2UgUyYmU3MoYyxmLHAsZWUsMSl9VWUoYyl9LHJlbW92ZShvLGMsaCxfLEksQSl7dmFye3VtOngsbzp7cmVtb3ZlOnp9fT1JLHtzaGFwZUZsYWc6JCxjaGlsZHJlbjplZSxhbmNob3I6SWUsdGFyZ2V0QW5jaG9yOmRlLHRhcmdldDp1ZSxwcm9wczpIZX09bztpZih1ZSYmeihkZSksKEF8fCFwbyhIZSkpJiYoeihJZSksJCYxNikpZm9yKHZhciBaZT0wO1plPGVlLmxlbmd0aDtaZSsrKXt2YXIgdnQ9ZWVbWmVdO3godnQsYyxoLCEwLCEhdnQuZHluYW1pY0NoaWxkcmVuKX19LG1vdmU6U3MsaHlkcmF0ZTpaYX07ZnVuY3Rpb24gU3MobyxjLGgsXyl7dmFye286e2luc2VydDpJfSxtOkF9PV8seD1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06Mjt4PT09MCYmSShvLnRhcmdldEFuY2hvcixjLGgpO3ZhcntlbDp6LGFuY2hvcjokLHNoYXBlRmxhZzplZSxjaGlsZHJlbjpJZSxwcm9wczpkZX09byx1ZT14PT09MjtpZih1ZSYmSSh6LGMsaCksKCF1ZXx8cG8oZGUpKSYmZWUmMTYpZm9yKHZhciBIZT0wO0hlPEllLmxlbmd0aDtIZSsrKUEoSWVbSGVdLGMsaCwyKTt1ZSYmSSgkLGMsaCl9ZnVuY3Rpb24gWmEobyxjLGgsXyxJLEEseCx6KXt2YXJ7bzp7bmV4dFNpYmxpbmc6JCxwYXJlbnROb2RlOmVlLHF1ZXJ5U2VsZWN0b3I6SWV9fT14LGRlPWMudGFyZ2V0PXdzKGMucHJvcHMsSWUpO2lmKGRlKXt2YXIgdWU9ZGUuX2xwYXx8ZGUuZmlyc3RDaGlsZDtpZihjLnNoYXBlRmxhZyYxNilpZihwbyhjLnByb3BzKSljLmFuY2hvcj16KCQobyksYyxlZShvKSxoLF8sSSxBKSxjLnRhcmdldEFuY2hvcj11ZTtlbHNle2MuYW5jaG9yPSQobyk7Zm9yKHZhciBIZT11ZTtIZTspaWYoSGU9JChIZSksSGUmJkhlLm5vZGVUeXBlPT09OCYmSGUuZGF0YT09PSJ0ZWxlcG9ydCBhbmNob3IiKXtjLnRhcmdldEFuY2hvcj1IZSxkZS5fbHBhPWMudGFyZ2V0QW5jaG9yJiYkKGMudGFyZ2V0QW5jaG9yKTticmVha316KHVlLGMsZGUsaCxfLEksQSl9VWUoYyl9cmV0dXJuIGMuYW5jaG9yJiYkKGMuYW5jaG9yKX12YXIgUmw9VW87ZnVuY3Rpb24gVWUobyl7dmFyIGM9by5jdHg7aWYoYyYmYy51dCl7Zm9yKHZhciBoPW8uY2hpbGRyZW5bMF0uZWw7aCE9PW8udGFyZ2V0QW5jaG9yOyloLm5vZGVUeXBlPT09MSYmaC5zZXRBdHRyaWJ1dGUoImRhdGEtdi1vd25lciIsYy51aWQpLGg9aC5uZXh0U2libGluZztjLnV0KCl9fXZhciBndD1TeW1ib2woIkZyYWdtZW50IiksdXQ9U3ltYm9sKCJUZXh0IikseHQ9U3ltYm9sKCJDb21tZW50IiksWXQ9U3ltYm9sKCJTdGF0aWMiKSxXbj1bXSxNbj1udWxsO2Z1bmN0aW9uIG5yKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO1duLnB1c2goTW49bz9udWxsOltdKX1mdW5jdGlvbiB3YSgpe1duLnBvcCgpLE1uPVduW1duLmxlbmd0aC0xXXx8bnVsbH12YXIga2k9MTtmdW5jdGlvbiAkbyhvKXtraSs9b31mdW5jdGlvbiBXcyhvKXtyZXR1cm4gby5keW5hbWljQ2hpbGRyZW49a2k+MD9Nbnx8bS5FTVBUWV9BUlI6bnVsbCx3YSgpLGtpPjAmJk1uJiZNbi5wdXNoKG8pLG99ZnVuY3Rpb24gYWMobyxjLGgsXyxJLEEpe3JldHVybiBXcyhGYShvLGMsaCxfLEksQSwhMCkpfWZ1bmN0aW9uIHhsKG8sYyxoLF8sSSl7cmV0dXJuIFdzKEduKG8sYyxoLF8sSSwhMCkpfWZ1bmN0aW9uIG9hKG8pe3JldHVybiBvP28uX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiB2cihvLGMpe3JldHVybiBjLnNoYXBlRmxhZyY2JiZSci5oYXMoYy50eXBlKT8oby5zaGFwZUZsYWcmPX4yNTYsYy5zaGFwZUZsYWcmPX41MTIsITEpOm8udHlwZT09PWMudHlwZSYmby5rZXk9PT1jLmtleX12YXIgcmk7ZnVuY3Rpb24gWGEobyl7cmk9b312YXIgQ3M9ZnVuY3Rpb24oKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxjPW5ldyBBcnJheShvKSxoPTA7aDxvO2grKyljW2hdPWFyZ3VtZW50c1toXTtyZXR1cm4gJG4oLi4ucmk/cmkoYyxPbik6Yyl9LE9zPSJfX3ZJbnRlcm5hbCIsQXM9bz0+e3ZhcntrZXk6Y309bztyZXR1cm4gYyE9bnVsbD9jOm51bGx9LEhvPW89Pnt2YXJ7cmVmOmMscmVmX2tleTpoLHJlZl9mb3I6X309bztyZXR1cm4gYyE9bnVsbD9tLmlzU3RyaW5nKGMpfHxSLmlzUmVmKGMpfHxtLmlzRnVuY3Rpb24oYyk/e2k6T24scjpjLGs6aCxmOiEhX306YzpudWxsfTtmdW5jdGlvbiBGYShvKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsST1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxBPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpvPT09Z3Q/MDoxLHg9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLHo9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOiExLCQ9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6byxwcm9wczpjLGtleTpjJiZBcyhjKSxyZWY6YyYmSG8oYyksc2NvcGVJZDpFbixzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpoLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRBbmNob3I6bnVsbCxzdGF0aWNDb3VudDowLHNoYXBlRmxhZzpBLHBhdGNoRmxhZzpfLGR5bmFtaWNQcm9wczpJLGR5bmFtaWNDaGlsZHJlbjpudWxsLGFwcENvbnRleHQ6bnVsbCxob3N0SW5zdGFuY2U6T24sY3R4Ok9ufTtyZXR1cm4gej8oSHIoJCxoKSxBJjEyOCYmby5ub3JtYWxpemUoJCkpOmgmJigkLnNoYXBlRmxhZ3w9bS5pc1N0cmluZyhoKT84OjE2KSwkLmtleSE9PSQua2V5JiZPKCJWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6IiwkLnR5cGUpLGtpPjAmJiF4JiZNbiYmKCQucGF0Y2hGbGFnPjB8fEEmNikmJiQucGF0Y2hGbGFnIT09MzImJk1uLnB1c2goJCksJH12YXIgR249Q3M7ZnVuY3Rpb24gJG4obyl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxfPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLEk9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsQT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITE7aWYoKCFvfHxvPT09em4pJiYob3x8TygiSW52YWxpZCB2bm9kZSB0eXBlIHdoZW4gY3JlYXRpbmcgdm5vZGU6ICIuY29uY2F0KG8sIi4iKSksbz14dCksb2Eobykpe3ZhciB4PXFpKG8sYywhMCk7cmV0dXJuIGgmJkhyKHgsaCksa2k+MCYmIUEmJk1uJiYoeC5zaGFwZUZsYWcmNj9NbltNbi5pbmRleE9mKG8pXT14Ok1uLnB1c2goeCkpLHgucGF0Y2hGbGFnfD0tMix4fWlmKGtzKG8pJiYobz1vLl9fdmNjT3B0cyksYyl7Yz1CbChjKTt2YXJ7Y2xhc3M6eixzdHlsZTokfT1jO3omJiFtLmlzU3RyaW5nKHopJiYoYy5jbGFzcz1tLm5vcm1hbGl6ZUNsYXNzKHopKSxtLmlzT2JqZWN0KCQpJiYoUi5pc1Byb3h5KCQpJiYhbS5pc0FycmF5KCQpJiYoJD1tLmV4dGVuZCh7fSwkKSksYy5zdHlsZT1tLm5vcm1hbGl6ZVN0eWxlKCQpKX12YXIgZWU9bS5pc1N0cmluZyhvKT8xOmZpKG8pPzEyODpMYShvKT82NDptLmlzT2JqZWN0KG8pPzQ6bS5pc0Z1bmN0aW9uKG8pPzI6MDtyZXR1cm4gZWUmNCYmUi5pc1Byb3h5KG8pJiYobz1SLnRvUmF3KG8pLE8oIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGJ5IG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIGBtYXJrUmF3YCBvciB1c2luZyBgc2hhbGxvd1JlZmAgaW5zdGVhZCBvZiBgcmVmYC4iLGAKQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgcmVhY3RpdmU6IGAsbykpLEZhKG8sYyxoLF8sSSxlZSxBLCEwKX1mdW5jdGlvbiBCbChvKXtyZXR1cm4gbz9SLmlzUHJveHkobyl8fE9zIGluIG8/bS5leHRlbmQoe30sbyk6bzpudWxsfWZ1bmN0aW9uIHFpKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHtwcm9wczpfLHJlZjpJLHBhdGNoRmxhZzpBLGNoaWxkcmVuOnh9PW8sej1jP1ZhKF98fHt9LGMpOl8sJD17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTpvLnR5cGUscHJvcHM6eixrZXk6eiYmQXMoeikscmVmOmMmJmMucmVmP2gmJkk/bS5pc0FycmF5KEkpP0kuY29uY2F0KEhvKGMpKTpbSSxIbyhjKV06SG8oYyk6SSxzY29wZUlkOm8uc2NvcGVJZCxzbG90U2NvcGVJZHM6by5zbG90U2NvcGVJZHMsY2hpbGRyZW46QT09PS0xJiZtLmlzQXJyYXkoeCk/eC5tYXAoSmkpOngsdGFyZ2V0Om8udGFyZ2V0LHRhcmdldEFuY2hvcjpvLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDpvLnN0YXRpY0NvdW50LHNoYXBlRmxhZzpvLnNoYXBlRmxhZyxwYXRjaEZsYWc6YyYmby50eXBlIT09Z3Q/QT09PS0xPzE2OkF8MTY6QSxkeW5hbWljUHJvcHM6by5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOm8uZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6by5hcHBDb250ZXh0LGhvc3RJbnN0YW5jZTpvLmhvc3RJbnN0YW5jZSxkaXJzOm8uZGlycyx0cmFuc2l0aW9uOm8udHJhbnNpdGlvbixjb21wb25lbnQ6by5jb21wb25lbnQsc3VzcGVuc2U6by5zdXNwZW5zZSxzc0NvbnRlbnQ6by5zc0NvbnRlbnQmJnFpKG8uc3NDb250ZW50KSxzc0ZhbGxiYWNrOm8uc3NGYWxsYmFjayYmcWkoby5zc0ZhbGxiYWNrKSxlbDpvLmVsLGFuY2hvcjpvLmFuY2hvcixjdHg6by5jdHgsY2U6by5jZX07cmV0dXJuICR9ZnVuY3Rpb24gSmkobyl7dmFyIGM9cWkobyk7cmV0dXJuIG0uaXNBcnJheShvLmNoaWxkcmVuKSYmKGMuY2hpbGRyZW49by5jaGlsZHJlbi5tYXAoSmkpKSxjfWZ1bmN0aW9uIFRzKCl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIgIixjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowO3JldHVybiBHbih1dCxudWxsLG8sYyl9ZnVuY3Rpb24gSXMobyxjKXt2YXIgaD1HbihZdCxudWxsLG8pO3JldHVybiBoLnN0YXRpY0NvdW50PWMsaH1mdW5jdGlvbiBqYygpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiIixjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYz8obnIoKSx4bCh4dCxudWxsLG8pKTpHbih4dCxudWxsLG8pfWZ1bmN0aW9uIEtpKG8pe3JldHVybiBvPT1udWxsfHx0eXBlb2Ygbz09ImJvb2xlYW4iP0duKHh0KTptLmlzQXJyYXkobyk/R24oZ3QsbnVsbCxvLnNsaWNlKCkpOnR5cGVvZiBvPT0ib2JqZWN0Ij9tcihvKTpHbih1dCxudWxsLFN0cmluZyhvKSl9ZnVuY3Rpb24gbXIobyl7cmV0dXJuIG8uZWw9PT1udWxsJiZvLnBhdGNoRmxhZyE9PS0xfHxvLm1lbW8/bzpxaShvKX1mdW5jdGlvbiBIcihvLGMpe3ZhciBoPTAse3NoYXBlRmxhZzpffT1vO2lmKGM9PW51bGwpYz1udWxsO2Vsc2UgaWYobS5pc0FycmF5KGMpKWg9MTY7ZWxzZSBpZih0eXBlb2YgYz09Im9iamVjdCIpaWYoXyYoMXw2NCkpe3ZhciBJPWMuZGVmYXVsdDtJJiYoSS5fYyYmKEkuX2Q9ITEpLEhyKG8sSSgpKSxJLl9jJiYoSS5fZD0hMCkpO3JldHVybn1lbHNle2g9MzI7dmFyIEE9Yy5fOyFBJiYhKE9zIGluIGMpP2MuX2N0eD1PbjpBPT09MyYmT24mJihPbi5zbG90cy5fPT09MT9jLl89MTooYy5fPTIsby5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIG0uaXNGdW5jdGlvbihjKT8oYz17ZGVmYXVsdDpjLF9jdHg6T259LGg9MzIpOihjPVN0cmluZyhjKSxfJjY0PyhoPTE2LGM9W1RzKGMpXSk6aD04KTtvLmNoaWxkcmVuPWMsby5zaGFwZUZsYWd8PWh9ZnVuY3Rpb24gVmEoKXtmb3IodmFyIG89e30sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBoPWM8MHx8YXJndW1lbnRzLmxlbmd0aDw9Yz92b2lkIDA6YXJndW1lbnRzW2NdO2Zvcih2YXIgXyBpbiBoKWlmKF89PT0iY2xhc3MiKW8uY2xhc3MhPT1oLmNsYXNzJiYoby5jbGFzcz1tLm5vcm1hbGl6ZUNsYXNzKFtvLmNsYXNzLGguY2xhc3NdKSk7ZWxzZSBpZihfPT09InN0eWxlIilvLnN0eWxlPW0ubm9ybWFsaXplU3R5bGUoW28uc3R5bGUsaC5zdHlsZV0pO2Vsc2UgaWYobS5pc09uKF8pKXt2YXIgST1vW19dLEE9aFtfXTtBJiZJIT09QSYmIShtLmlzQXJyYXkoSSkmJkkuaW5jbHVkZXMoQSkpJiYob1tfXT1JP1tdLmNvbmNhdChJLEEpOkEpfWVsc2UgXyE9PSIiJiYob1tfXT1oW19dKX1yZXR1cm4gb31mdW5jdGlvbiBGcihvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7Y24obyxjLDcsW2gsX10pfXZhciBqcj10cigpLE1sPTA7ZnVuY3Rpb24gdWwobyxjLGgpe3ZhciBfPW8udHlwZSxJPShjP2MuYXBwQ29udGV4dDpvLmFwcENvbnRleHQpfHxqcixBPXt1aWQ6TWwrKyx2bm9kZTpvLHR5cGU6XyxwYXJlbnQ6YyxhcHBDb250ZXh0Okkscm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IFIuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6Yz9jLnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoSS5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpFdChfLEkpLGVtaXRzT3B0aW9uczpabyhfLEkpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czptLkVNUFRZX09CSixpbmhlcml0QXR0cnM6Xy5pbmhlcml0QXR0cnMsY3R4Om0uRU1QVFlfT0JKLGRhdGE6bS5FTVBUWV9PQkoscHJvcHM6bS5FTVBUWV9PQkosYXR0cnM6bS5FTVBUWV9PQkosc2xvdHM6bS5FTVBUWV9PQkoscmVmczptLkVNUFRZX09CSixzZXR1cFN0YXRlOm0uRU1QVFlfT0JKLHNldHVwQ29udGV4dDpudWxsLHN1c3BlbnNlOmgsc3VzcGVuc2VJZDpoP2gucGVuZGluZ0lkOjAsYXN5bmNEZXA6bnVsbCxhc3luY1Jlc29sdmVkOiExLGlzTW91bnRlZDohMSxpc1VubW91bnRlZDohMSxpc0RlYWN0aXZhdGVkOiExLGJjOm51bGwsYzpudWxsLGJtOm51bGwsbTpudWxsLGJ1Om51bGwsdTpudWxsLHVtOm51bGwsYnVtOm51bGwsZGE6bnVsbCxhOm51bGwscnRnOm51bGwscnRjOm51bGwsZWM6bnVsbCxzcDpudWxsfTtyZXR1cm4gQS5jdHg9c2woQSksQS5yb290PWM/Yy5yb290OkEsQS5lbWl0PV9vLmJpbmQobnVsbCxBKSxvLmNlJiZvLmNlKEEpLEF9dmFyIEJuPW51bGwsU249KCk9PkJufHxPbixtaT1vPT57Qm49byxvLnNjb3BlLm9uKCl9LF9pPSgpPT57Qm4mJkJuLnNjb3BlLm9mZigpLEJuPW51bGx9LGFhPW0ubWFrZU1hcCgic2xvdCxjb21wb25lbnQiKTtmdW5jdGlvbiBmbChvLGMpe3ZhciBoPWMuaXNOYXRpdmVUYWd8fG0uTk87KGFhKG8pfHxoKG8pKSYmTygiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogIitvKX1mdW5jdGlvbiBVYShvKXtyZXR1cm4gby52bm9kZS5zaGFwZUZsYWcmNH1kLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiBSaShvKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7ZC5pc0luU1NSQ29tcG9uZW50U2V0dXA9Yzt2YXJ7cHJvcHM6aCxjaGlsZHJlbjpffT1vLnZub2RlLEk9VWEobyk7U2UobyxoLEksYyksRGEobyxfKTt2YXIgQT1JP2pvKG8sYyk6dm9pZCAwO3JldHVybiBkLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSxBfWZ1bmN0aW9uIGpvKG8sYyl7dmFyIGgsXz1vLnR5cGU7e2lmKF8ubmFtZSYmZmwoXy5uYW1lLG8uYXBwQ29udGV4dC5jb25maWcpLF8uY29tcG9uZW50cylmb3IodmFyIEk9T2JqZWN0LmtleXMoXy5jb21wb25lbnRzKSxBPTA7QTxJLmxlbmd0aDtBKyspZmwoSVtBXSxvLmFwcENvbnRleHQuY29uZmlnKTtpZihfLmRpcmVjdGl2ZXMpZm9yKHZhciB4PU9iamVjdC5rZXlzKF8uZGlyZWN0aXZlcyksej0wO3o8eC5sZW5ndGg7eisrKVVzKHhbel0pO18uY29tcGlsZXJPcHRpb25zJiZzYygpJiZPKCciY29tcGlsZXJPcHRpb25zIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC4nKX1vLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksby5wcm94eT1SLm1hcmtSYXcobmV3IFByb3h5KG8uY3R4LExvKSksJHMobyk7dmFye3NldHVwOiR9PV87aWYoJCl7dmFyIGVlPW8uc2V0dXBDb250ZXh0PSQubGVuZ3RoPjE/bGMobyk6bnVsbDttaShvKSxSLnBhdXNlVHJhY2tpbmcoKTt2YXIgSWU9S3QoJCxvLDAsW1Iuc2hhbGxvd1JlYWRvbmx5KG8ucHJvcHMpLGVlXSk7aWYoUi5yZXNldFRyYWNraW5nKCksX2koKSxtLmlzUHJvbWlzZShJZSkpe2lmKEllLnRoZW4oX2ksX2kpLGMpcmV0dXJuIEllLnRoZW4odWU9PntkbChvLHVlLGMpfSkuY2F0Y2godWU9PntJcih1ZSxvLDApfSk7aWYoby5hc3luY0RlcD1JZSwhby5zdXNwZW5zZSl7dmFyIGRlPShoPV8ubmFtZSkhPT1udWxsJiZoIT09dm9pZCAwP2g6IkFub255bW91cyI7TygiQ29tcG9uZW50IDwiLmNvbmNhdChkZSwiPjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gIikrIjxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuIil9fWVsc2UgZGwobyxJZSxjKX1lbHNlIHBsKG8sYyl9ZnVuY3Rpb24gZGwobyxjLGgpe20uaXNGdW5jdGlvbihjKT9vLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/by5zc3JSZW5kZXI9YzpvLnJlbmRlcj1jOm0uaXNPYmplY3QoYyk/KG9hKGMpJiZPKCJzZXR1cCgpIHNob3VsZCBub3QgcmV0dXJuIFZOb2RlcyBkaXJlY3RseSAtIHJldHVybiBhIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLiIpLG8uZGV2dG9vbHNSYXdTZXR1cFN0YXRlPWMsby5zZXR1cFN0YXRlPVIucHJveHlSZWZzKGMpLGtsKG8pKTpjIT09dm9pZCAwJiZPKCJzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogIi5jb25jYXQoYz09PW51bGw/Im51bGwiOnR5cGVvZiBjKSkscGwobyxoKX12YXIgUWEsZXM7ZnVuY3Rpb24gaGwobyl7UWE9byxlcz1jPT57Yy5yZW5kZXIuX3JjJiYoYy53aXRoUHJveHk9bmV3IFByb3h5KGMuY3R4LHhhKSl9fXZhciBzYz0oKT0+IVFhO2Z1bmN0aW9uIHBsKG8sYyxoKXt2YXIgXz1vLnR5cGU7aWYoIW8ucmVuZGVyKXtpZighYyYmUWEmJiFfLnJlbmRlcil7dmFyIEk9Xy50ZW1wbGF0ZXx8TShvKS50ZW1wbGF0ZTtpZihJKXskcihvLCJjb21waWxlIik7dmFye2lzQ3VzdG9tRWxlbWVudDpBLGNvbXBpbGVyT3B0aW9uczp4fT1vLmFwcENvbnRleHQuY29uZmlnLHtkZWxpbWl0ZXJzOnosY29tcGlsZXJPcHRpb25zOiR9PV8sZWU9bS5leHRlbmQobS5leHRlbmQoe2lzQ3VzdG9tRWxlbWVudDpBLGRlbGltaXRlcnM6en0seCksJCk7Xy5yZW5kZXI9UWEoSSxlZSksT3IobywiY29tcGlsZSIpfX1vLnJlbmRlcj1fLnJlbmRlcnx8bS5OT09QLGVzJiZlcyhvKX1taShvKSxSLnBhdXNlVHJhY2tpbmcoKSxIcyhvKSxSLnJlc2V0VHJhY2tpbmcoKSxfaSgpLCFfLnJlbmRlciYmby5yZW5kZXI9PT1tLk5PT1AmJiFjJiYoIVFhJiZfLnRlbXBsYXRlP08oJ0NvbXBvbmVudCBwcm92aWRlZCB0ZW1wbGF0ZSBvcHRpb24gYnV0IHJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS4gQ29uZmlndXJlIHlvdXIgYnVuZGxlciB0byBhbGlhcyAidnVlIiB0byAidnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzIi4nKTpPKCJDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24uIikpfWZ1bmN0aW9uIERsKG8pe3JldHVybiBuZXcgUHJveHkoby5hdHRycyx7Z2V0KGMsaCl7cmV0dXJuIER0KCksUi50cmFjayhvLCJnZXQiLCIkYXR0cnMiKSxjW2hdfSxzZXQoKXtyZXR1cm4gTygic2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LiIpLCExfSxkZWxldGVQcm9wZXJ0eSgpe3JldHVybiBPKCJzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuIiksITF9fSl9ZnVuY3Rpb24gbGMobyl7dmFyIGM9Xz0+e2lmKG8uZXhwb3NlZCYmTygiZXhwb3NlKCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldHVwKCkuIiksXyE9bnVsbCl7dmFyIEk9dHlwZW9mIF87ST09PSJvYmplY3QiJiYobS5pc0FycmF5KF8pP0k9ImFycmF5IjpSLmlzUmVmKF8pJiYoST0icmVmIikpLEkhPT0ib2JqZWN0IiYmTygiZXhwb3NlKCkgc2hvdWxkIGJlIHBhc3NlZCBhIHBsYWluIG9iamVjdCwgcmVjZWl2ZWQgIi5jb25jYXQoSSwiLiIpKX1vLmV4cG9zZWQ9X3x8e319LGg7cmV0dXJuIE9iamVjdC5mcmVlemUoe2dldCBhdHRycygpe3JldHVybiBofHwoaD1EbChvKSl9LGdldCBzbG90cygpe3JldHVybiBSLnNoYWxsb3dSZWFkb25seShvLnNsb3RzKX0sZ2V0IGVtaXQoKXtyZXR1cm4gZnVuY3Rpb24oXyl7Zm9yKHZhciBJPWFyZ3VtZW50cy5sZW5ndGgsQT1uZXcgQXJyYXkoST4xP0ktMTowKSx4PTE7eDxJO3grKylBW3gtMV09YXJndW1lbnRzW3hdO3JldHVybiBvLmVtaXQoXywuLi5BKX19LGV4cG9zZTpjfSl9ZnVuY3Rpb24gUHMobyl7aWYoby5leHBvc2VkKXJldHVybiBvLmV4cG9zZVByb3h5fHwoby5leHBvc2VQcm94eT1uZXcgUHJveHkoUi5wcm94eVJlZnMoUi5tYXJrUmF3KG8uZXhwb3NlZCkpLHtnZXQoYyxoKXtpZihoIGluIGMpcmV0dXJuIGNbaF07aWYoaCBpbiB6aSlyZXR1cm4gemlbaF0obyl9LGhhcyhjLGgpe3JldHVybiBoIGluIGN8fGggaW4geml9fSkpfXZhciBOcz0vKD86XnxbLV9dKShcdykvZyxjYz1vPT5vLnJlcGxhY2UoTnMsYz0+Yy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIiIpO2Z1bmN0aW9uIHRzKG8pe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gbS5pc0Z1bmN0aW9uKG8pP28uZGlzcGxheU5hbWV8fG8ubmFtZTpvLm5hbWV8fGMmJm8uX19uYW1lfWZ1bmN0aW9uIFNhKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLF89dHMoYyk7aWYoIV8mJmMuX19maWxlKXt2YXIgST1jLl9fZmlsZS5tYXRjaCgvKFteL1xcXSspXC5cdyskLyk7SSYmKF89SVsxXSl9aWYoIV8mJm8mJm8ucGFyZW50KXt2YXIgQT14PT57Zm9yKHZhciB6IGluIHgpaWYoeFt6XT09PWMpcmV0dXJuIHp9O189QShvLmNvbXBvbmVudHN8fG8ucGFyZW50LnR5cGUuY29tcG9uZW50cyl8fEEoby5hcHBDb250ZXh0LmNvbXBvbmVudHMpfXJldHVybiBfP2NjKF8pOmg/IkFwcCI6IkFub255bW91cyJ9ZnVuY3Rpb24ga3Mobyl7cmV0dXJuIG0uaXNGdW5jdGlvbihvKSYmIl9fdmNjT3B0cyJpbiBvfXZhciBMbD0obyxjKT0+Ui5jb21wdXRlZChvLGMsZC5pc0luU1NSQ29tcG9uZW50U2V0dXApLEdzPW89Pk8oIiIuY29uY2F0KG8sIigpIGlzIGEgY29tcGlsZXItaGludCBoZWxwZXIgdGhhdCBpcyBvbmx5IHVzYWJsZSBpbnNpZGUgIikrIjxzY3JpcHQgc2V0dXA+IG9mIGEgc2luZ2xlIGZpbGUgY29tcG9uZW50LiBJdHMgYXJndW1lbnRzIHNob3VsZCBiZSBjb21waWxlZCBhd2F5IGFuZCBwYXNzaW5nIGl0IGF0IHJ1bnRpbWUgaGFzIG5vIGVmZmVjdC4iKTtmdW5jdGlvbiBnbCgpe3JldHVybiBHcygiZGVmaW5lUHJvcHMiKSxudWxsfWZ1bmN0aW9uIHVjKCl7cmV0dXJuIEdzKCJkZWZpbmVFbWl0cyIpLG51bGx9ZnVuY3Rpb24gemMobyl7R3MoImRlZmluZUV4cG9zZSIpfWZ1bmN0aW9uIGZjKG8sYyl7cmV0dXJuIEdzKCJ3aXRoRGVmYXVsdHMiKSxudWxsfWZ1bmN0aW9uIFdjKCl7cmV0dXJuIGRjKCkuc2xvdHN9ZnVuY3Rpb24gR2MoKXtyZXR1cm4gZGMoKS5hdHRyc31mdW5jdGlvbiBkYygpe3ZhciBvPVNuKCk7cmV0dXJuIG98fE8oInVzZUNvbnRleHQoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuIiksby5zZXR1cENvbnRleHR8fChvLnNldHVwQ29udGV4dD1sYyhvKSl9ZnVuY3Rpb24gaGMobyxjKXt2YXIgaD1tLmlzQXJyYXkobyk/by5yZWR1Y2UoKEEseCk9PihBW3hdPXt9LEEpLHt9KTpvO2Zvcih2YXIgXyBpbiBjKXt2YXIgST1oW19dO0k/bS5pc0FycmF5KEkpfHxtLmlzRnVuY3Rpb24oSSk/aFtfXT17dHlwZTpJLGRlZmF1bHQ6Y1tfXX06SS5kZWZhdWx0PWNbX106ST09PW51bGw/aFtfXT17ZGVmYXVsdDpjW19dfTpPKCdwcm9wcyBkZWZhdWx0IGtleSAiJy5jb25jYXQoXywnIiBoYXMgbm8gY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbi4nKSl9cmV0dXJuIGh9ZnVuY3Rpb24gcGMobyxjKXt2YXIgaD17fSxfPWZ1bmN0aW9uKEEpe2MuaW5jbHVkZXMoQSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLEEse2VudW1lcmFibGU6ITAsZ2V0OigpPT5vW0FdfSl9O2Zvcih2YXIgSSBpbiBvKV8oSSk7cmV0dXJuIGh9ZnVuY3Rpb24gWWMobyl7dmFyIGM9U24oKTtjfHxPKCJ3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy4iKTt2YXIgaD1vKCk7cmV0dXJuIF9pKCksbS5pc1Byb21pc2UoaCkmJihoPWguY2F0Y2goXz0+e3Rocm93IG1pKGMpLF99KSksW2gsKCk9Pm1pKGMpXX1mdW5jdGlvbiBxYyhvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gXz09PTI/bS5pc09iamVjdChjKSYmIW0uaXNBcnJheShjKT9vYShjKT9HbihvLG51bGwsW2NdKTpHbihvLGMpOkduKG8sbnVsbCxjKTooXz4zP2g9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOl89PT0zJiZvYShoKSYmKGg9W2hdKSxHbihvLGMsaCkpfXZhciBGbD1TeW1ib2woInNzckNvbnRleHQiKSx2bD0oKT0+e3t2YXIgbz1vcihGbCk7cmV0dXJuIG98fE8oIlNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC4iKSxvfX07ZnVuY3Rpb24gUnMobyl7cmV0dXJuISEobyYmby5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBpaSgpe2lmKHR5cGVvZiB3aW5kb3c9PSJ1bmRlZmluZWQiKXJldHVybjt2YXIgbz17c3R5bGU6ImNvbG9yOiMzYmE3NzYifSxjPXtzdHlsZToiY29sb3I6IzBiMWJjOSJ9LGg9e3N0eWxlOiJjb2xvcjojYjYyZTI0In0sXz17c3R5bGU6ImNvbG9yOiM5ZDI4OGMifSxJPXtoZWFkZXIoZGUpe3JldHVybiBtLmlzT2JqZWN0KGRlKT9kZS5fX2lzVnVlP1siZGl2IixvLCJWdWVJbnN0YW5jZSJdOlIuaXNSZWYoZGUpP1siZGl2Iix7fSxbInNwYW4iLG8sSWUoZGUpXSwiPCIseihkZS52YWx1ZSksIj4iXTpSLmlzUmVhY3RpdmUoZGUpP1siZGl2Iix7fSxbInNwYW4iLG8sUnMoZGUpPyJTaGFsbG93UmVhY3RpdmUiOiJSZWFjdGl2ZSJdLCI8Iix6KGRlKSwiPiIuY29uY2F0KFIuaXNSZWFkb25seShkZSk/IiAocmVhZG9ubHkpIjoiIildOlIuaXNSZWFkb25seShkZSk/WyJkaXYiLHt9LFsic3BhbiIsbyxScyhkZSk/IlNoYWxsb3dSZWFkb25seSI6IlJlYWRvbmx5Il0sIjwiLHooZGUpLCI+Il06bnVsbDpudWxsfSxoYXNCb2R5KGRlKXtyZXR1cm4gZGUmJmRlLl9faXNWdWV9LGJvZHkoZGUpe2lmKGRlJiZkZS5fX2lzVnVlKXJldHVyblsiZGl2Iix7fSwuLi5BKGRlLiQpXX19O2Z1bmN0aW9uIEEoZGUpe3ZhciB1ZT1bXTtkZS50eXBlLnByb3BzJiZkZS5wcm9wcyYmdWUucHVzaCh4KCJwcm9wcyIsUi50b1JhdyhkZS5wcm9wcykpKSxkZS5zZXR1cFN0YXRlIT09bS5FTVBUWV9PQkomJnVlLnB1c2goeCgic2V0dXAiLGRlLnNldHVwU3RhdGUpKSxkZS5kYXRhIT09bS5FTVBUWV9PQkomJnVlLnB1c2goeCgiZGF0YSIsUi50b1JhdyhkZS5kYXRhKSkpO3ZhciBIZT0kKGRlLCJjb21wdXRlZCIpO0hlJiZ1ZS5wdXNoKHgoImNvbXB1dGVkIixIZSkpO3ZhciBaZT0kKGRlLCJpbmplY3QiKTtyZXR1cm4gWmUmJnVlLnB1c2goeCgiaW5qZWN0ZWQiLFplKSksdWUucHVzaChbImRpdiIse30sWyJzcGFuIix7c3R5bGU6Xy5zdHlsZSsiO29wYWNpdHk6MC42NiJ9LCIkIChpbnRlcm5hbCk6ICJdLFsib2JqZWN0Iix7b2JqZWN0OmRlfV1dKSx1ZX1mdW5jdGlvbiB4KGRlLHVlKXtyZXR1cm4gdWU9bS5leHRlbmQoe30sdWUpLE9iamVjdC5rZXlzKHVlKS5sZW5ndGg/WyJkaXYiLHtzdHlsZToibGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW0ifSxbImRpdiIse3N0eWxlOiJjb2xvcjojNDc2NTgyIn0sZGVdLFsiZGl2Iix7c3R5bGU6InBhZGRpbmctbGVmdDoxLjI1ZW0ifSwuLi5PYmplY3Qua2V5cyh1ZSkubWFwKEhlPT5bImRpdiIse30sWyJzcGFuIixfLEhlKyI6ICJdLHoodWVbSGVdLCExKV0pXV06WyJzcGFuIix7fV19ZnVuY3Rpb24geihkZSl7dmFyIHVlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gdHlwZW9mIGRlPT0ibnVtYmVyIj9bInNwYW4iLGMsZGVdOnR5cGVvZiBkZT09InN0cmluZyI/WyJzcGFuIixoLEpTT04uc3RyaW5naWZ5KGRlKV06dHlwZW9mIGRlPT0iYm9vbGVhbiI/WyJzcGFuIixfLGRlXTptLmlzT2JqZWN0KGRlKT9bIm9iamVjdCIse29iamVjdDp1ZT9SLnRvUmF3KGRlKTpkZX1dOlsic3BhbiIsaCxTdHJpbmcoZGUpXX1mdW5jdGlvbiAkKGRlLHVlKXt2YXIgSGU9ZGUudHlwZTtpZighbS5pc0Z1bmN0aW9uKEhlKSl7dmFyIFplPXt9O2Zvcih2YXIgdnQgaW4gZGUuY3R4KWVlKEhlLHZ0LHVlKSYmKFplW3Z0XT1kZS5jdHhbdnRdKTtyZXR1cm4gWmV9fWZ1bmN0aW9uIGVlKGRlLHVlLEhlKXt2YXIgWmU9ZGVbSGVdO2lmKG0uaXNBcnJheShaZSkmJlplLmluY2x1ZGVzKHVlKXx8bS5pc09iamVjdChaZSkmJnVlIGluIFplfHxkZS5leHRlbmRzJiZlZShkZS5leHRlbmRzLHVlLEhlKXx8ZGUubWl4aW5zJiZkZS5taXhpbnMuc29tZSh2dD0+ZWUodnQsdWUsSGUpKSlyZXR1cm4hMH1mdW5jdGlvbiBJZShkZSl7cmV0dXJuIFJzKGRlKT8iU2hhbGxvd1JlZiI6ZGUuZWZmZWN0PyJDb21wdXRlZFJlZiI6IlJlZiJ9d2luZG93LmRldnRvb2xzRm9ybWF0dGVycz93aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goSSk6d2luZG93LmRldnRvb2xzRm9ybWF0dGVycz1bSV19ZnVuY3Rpb24gVG8obyxjLGgsXyl7dmFyIEk9aFtfXTtpZihJJiZWbChJLG8pKXJldHVybiBJO3ZhciBBPWMoKTtyZXR1cm4gQS5tZW1vPW8uc2xpY2UoKSxoW19dPUF9ZnVuY3Rpb24gVmwobyxjKXt2YXIgaD1vLm1lbW87aWYoaC5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgXz0wO188aC5sZW5ndGg7XysrKWlmKG0uaGFzQ2hhbmdlZChoW19dLGNbX10pKXJldHVybiExO3JldHVybiBraT4wJiZNbiYmTW4ucHVzaChvKSwhMH12YXIgem89IjMuMi40NyIsbWw9bnVsbCxucz1udWxsLEpjPXtpbnNlcnQ6KG8sYyxoKT0+aD9jLmluc2VydEJlZm9yZShvLGgpOmMuYXBwZW5kQ2hpbGQobykscmVtb3ZlOm89Pnt2YXIgYz1vLnBhcmVudE5vZGU7YyYmYy5yZW1vdmVDaGlsZChvKX0sY3JlYXRlRWxlbWVudDpvPT5sLmNyZWF0ZUVsZW1lbnQobyksY3JlYXRlVGV4dDpvPT5sLmNyZWF0ZVRleHQobyksY3JlYXRlQ29tbWVudDpvPT5sLmNyZWF0ZUNvbW1lbnQobyksc2V0VGV4dDoobyxjKT0+e28uc2V0QXR0cigidmFsdWUiLGMpfSxzZXRFbGVtZW50VGV4dDoobyxjKT0+e28uc2V0QXR0cigidmFsdWUiLGMpfSxwYXJlbnROb2RlOm89Pm8ucGFyZW50Tm9kZSxuZXh0U2libGluZzpvPT5vLm5leHRTaWJsaW5nfTtmdW5jdGlvbiBZcyhvKXtyZXR1cm4gT2JqZWN0LmtleXMobyl9ZnVuY3Rpb24gc2Eobyl7dmFyIGM9e307cmV0dXJuIG0uaXNBcnJheShvKSYmby5mb3JFYWNoKGg9PntZcyhoKS5mb3JFYWNoKF89Pnt2YXIgST1oW19dLEE9Y1tfXXx8KGNbX109e30pO1lzKEkpLmZvckVhY2goeD0+e3ZhciB6PUlbeF0sJD1BW3hdfHwoQVt4XT17fSk7WXMoeikuZm9yRWFjaChlZT0+e2VlWzBdPT09IiEiPygkW2VlXT16W2VlXSxkZWxldGUgJFtlZS5zbGljZSgxKV0pOm0uaGFzT3duKCQsIiEiK2VlKXx8KCRbZWVdPXpbZWVdKX0pfSl9KX0pLGN9ZnVuY3Rpb24gcXMobyxjKXt2YXIgaD1jJiZjLmNsYXNzTGlzdDtyZXR1cm4gaCYmaC5pbmNsdWRlcyhvKX12YXIgV289L1srfj4gXSQvLEpzPSJwYXJlbnROb2RlIixaaT0icHJldmlvdXNTaWJsaW5nIjtmdW5jdGlvbiBnYyhvLGMpe2Zvcih2YXIgaD1vLnNwbGl0KCIuIiksXz1oLmxlbmd0aC0xO18+MDtfLS0pe3ZhciBJPWhbX10sQT1JW0kubGVuZ3RoLTFdLHg9SS5yZXBsYWNlKFdvLCIiKTtpZihBPT09In4ifHxBPT09IiAiKXtmb3IodmFyIHo9QT09PSJ+Ij9aaTpKcztjJiYoYz1jW3pdLCFxcyh4LGMpKTspO2lmKCFjKXJldHVybiExfWVsc2UgaWYoQT09PSI+Ij9jPWMmJmNbSnNdOkE9PT0iKyImJihjPWMmJmNbWmldKSwhcXMoeCxjKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgVWw9MWUzO2Z1bmN0aW9uIEtjKG8sYyxoKXt2YXJ7c3R5bGVzOl8sd2VpZ2h0czpJfT1vO1lzKGMpLmZvckVhY2goQT0+e2lmKCEoQSYmaCYmIWdjKEEsaCkpKXt2YXIgeD1BLnNwbGl0KCIuIikubGVuZ3RoLHo9Y1tBXTtZcyh6KS5mb3JFYWNoKCQ9Pnt2YXIgZWU9elskXSxJZT0kWzBdPT09IiEiO0llJiYoJD0kLnNsaWNlKDEpKTt2YXIgZGU9SVskXXx8MCx1ZT14KyhJZT9VbDowKTt1ZT49ZGUmJihJWyRdPXVlLF9bJF09ZWUpfSl9fSl9ZnVuY3Rpb24gdmMobyxjKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxfPXtzdHlsZXM6e30sd2VpZ2h0czp7fX07cmV0dXJuIG8uZm9yRWFjaChJPT57dmFyIEE9Y1tJXTtBJiZLYyhfLEEsaCl9KSxfLnN0eWxlc31mdW5jdGlvbiBLcyhvKXtyZXR1cm4gdmMoby5jbGFzc0xpc3Qsby5zdHlsZVNoZWV0LG8pfWZ1bmN0aW9uIG1jKG8sYyl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIHZjKG8sX2MoYyksaCl9ZnVuY3Rpb24gX2Mobyl7dmFye3R5cGU6YyxhcHBDb250ZXh0Omh9PW8sXz1jO2lmKCFfLl9fc3R5bGVzKWlmKGgmJm0uaXNBcnJheShoLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSYmKGgucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM9c2EoaC5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykpLF8ubXBUeXBlPT09InBhZ2UiJiZoKV8uX19zdHlsZXM9aC5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcztlbHNle3ZhciBJPVtdO2gmJkkucHVzaChoLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzKSxtLmlzQXJyYXkoXy5zdHlsZXMpJiZfLnN0eWxlcy5mb3JFYWNoKEE9PkkucHVzaChBKSksXy5fX3N0eWxlcz1zYShJKX1yZXR1cm4gXy5fX3N0eWxlc31mdW5jdGlvbiBiYyhvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7XyYmKFtjLGhdPSRhKG8sYyxoLF8pKSxvLnNldEF0dHIoYyxoKX12YXIgJGw9ImhvdmVyQ2xhc3MiLFpzPSJwbGFjZWhvbGRlckNsYXNzIix5Yz0icGxhY2Vob2xkZXJTdHlsZSIsWmM9ImluZGljYXRvckNsYXNzIixYYz0iaW5kaWNhdG9yU3R5bGUiLFFjPSJtYXNrQ2xhc3MiLEhsPSJtYXNrU3R5bGUiLF9sPXt2aWV3OntjbGFzczpbJGxdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlskbF0sc3R5bGU6W119LG5hdmlnYXRvcjp7Y2xhc3M6WyRsXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbWnNdLHN0eWxlOlt5Y119LCJ1LXRleHRhcmVhIjp7Y2xhc3M6W1pzXSxzdHlsZTpbeWNdfSwicGlja2VyLXZpZXciOntjbGFzczpbWmMsUWNdLHN0eWxlOltYYyxIbF19fTtmdW5jdGlvbiAkYShvLGMsaCxfKXtpZighaClyZXR1cm5bYyxoXTt2YXIgST1fbFtvLnR5cGVdO2lmKEkpe3ZhciBBPW0uY2FtZWxpemUoYyk7aWYoSS5jbGFzcy5pbmRleE9mKEEpPi0xKXJldHVybltBLG1jKFtoXSxfLG8pXTtpZihJLnN0eWxlLmluZGV4T2YoYyk+LTEpcmV0dXJuIG0uaXNTdHJpbmcoaCk/W0EsbS5wYXJzZVN0cmluZ1N0eWxlKGgpXTpbQSxtLm5vcm1hbGl6ZVN0eWxlKGgpXX1yZXR1cm5bYyxoXX1mdW5jdGlvbiBYcyhvLGMsaCl7dmFyIF89YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7aWYoISFfKXt2YXIgST1oP2guc3BsaXQoIiAiKTpbXTtvLnNldENsYXNzTGlzdChJKSxvLnNldFN0eWxlU2hlZXQoX2MoXykpfX1mdW5jdGlvbiBqbChvLGMsaCxfKXtvLmFkZEV2ZW50KGMsaCl9ZnVuY3Rpb24gRWMobyxjKXtvLnJlbW92ZUV2ZW50KGMpfWZ1bmN0aW9uIHBuKG8sYyxoLF8pe3ZhciBJPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLEE9by5fdmVpfHwoby5fdmVpPXt9KSx4PUFbY107aWYoXyYmeCl4LnZhbHVlPV87ZWxzZXt2YXJbeiwkXT13YyhjKTtpZihfKXt2YXIgZWU9QVtjXT1ibChfLEkpO2psKG8seixlZSl9ZWxzZSB4JiYoRWMobyx6KSxBW2NdPXZvaWQgMCl9fXZhciB4aT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gSW8obyl7cmV0dXJuIG89PT0ib24tcG9zdC1tZXNzYWdlIj8ib25Qb3N0TWVzc2FnZSI6b31mdW5jdGlvbiB3YyhvKXt2YXIgYztpZih4aS50ZXN0KG8pKXtjPXt9O2Zvcih2YXIgaDtoPW8ubWF0Y2goeGkpOylvPW8uc2xpY2UoMCxvLmxlbmd0aC1oWzBdLmxlbmd0aCksY1toWzBdLnRvTG93ZXJDYXNlKCldPSEwfXZhciBfPW9bMl09PT0iOiI/by5zbGljZSgzKTpvLnNsaWNlKDIpO3JldHVybltJbyhtLmh5cGhlbmF0ZShfKSksY119ZnVuY3Rpb24gYmwobyxjKXt2YXIgaD1JPT57Y24oaC52YWx1ZSxjLDUsW0ldKX07aC52YWx1ZT1vO3ZhciBfPW5ldyBTZXQ7cmV0dXJuIG0uaXNBcnJheShoLnZhbHVlKT9oLnZhbHVlLmZvckVhY2goST0+e0kubW9kaWZpZXJzJiZJLm1vZGlmaWVycy5mb3JFYWNoKEE9PntfLmFkZChBKX0pfSk6KGgudmFsdWUubW9kaWZpZXJzJiZoLnZhbHVlLm1vZGlmaWVycy5mb3JFYWNoKEk9PntfLmFkZChJKX0pLFFzKGgsYykpLGgubW9kaWZpZXJzPVsuLi5fXSxofWZ1bmN0aW9uIFFzKG8sYyl7aWYoISFjKXt2YXJ7JHd4c01vZHVsZXM6aH09YztpZighIWgpe3ZhciBfPW8udmFsdWUudG9TdHJpbmcoKTshaC5maW5kKEk9Pl8uaW5kZXhPZigiLiIrSSsiLiIpPi0xKXx8KG8ud3hzRXZlbnQ9by52YWx1ZSgpKX19fWZ1bmN0aW9uIHlsKG8sYyxoKXtpZighIWgpe20uaXNTdHJpbmcoaCkmJihoPW0ucGFyc2VTdHJpbmdTdHlsZShoKSk7dmFyIF89e30sST1jJiYhbS5pc1N0cmluZyhjKTtpZihJKXtmb3IodmFyIEEgaW4gYyloW0FdPT1udWxsJiYoX1ttLmNhbWVsaXplKEEpXT0iIik7Zm9yKHZhciB4IGluIGgpe3ZhciB6PWhbeF07eiE9PWNbeF0mJihfW20uY2FtZWxpemUoeCldPXopfX1lbHNlIGZvcih2YXIgJCBpbiBoKV9bbS5jYW1lbGl6ZSgkKV09aFskXTtvLnNldFN0eWxlcyhfKX19dmFyIFBvPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXSxsYT1mdW5jdGlvbihvLGMsaCxfKXt2YXIgST1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMCxBPWFyZ3VtZW50cy5sZW5ndGg+OT9hcmd1bWVudHNbOV06dm9pZCAwO2M9PT0iY2xhc3MiP1hzKG8saCxfLEF8fEkpOmM9PT0ic3R5bGUiP3lsKG8saCxfKTptLmlzT24oYyk/bS5pc01vZGVsTGlzdGVuZXIoYyl8fHBuKG8sYyxoLF8sSSk6Yz09PSJtb2RlbFZhbHVlIiYmUG8uaW5jbHVkZXMoby50eXBlKT9vLnNldEF0dHJzKHttb2RlbFZhbHVlOl8sdmFsdWU6X30pOmJjKG8sYyxfLEkpfTtmdW5jdGlvbiBIYSgpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiJHN0eWxlIjt7dmFyIGM9U24oKTtpZighYylyZXR1cm4gTygidXNlQ3NzTW9kdWxlIG11c3QgYmUgY2FsbGVkIGluc2lkZSBzZXR1cCgpIiksbS5FTVBUWV9PQko7dmFyIGg9Yy50eXBlLl9fY3NzTW9kdWxlcztpZighaClyZXR1cm4gTygiQ3VycmVudCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIENTUyBtb2R1bGVzIGluamVjdGVkLiIpLG0uRU1QVFlfT0JKO3ZhciBfPWhbb107cmV0dXJuIF98fChPKCdDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZSBuYW1lZCAiJy5jb25jYXQobywnIi4nKSksbS5FTVBUWV9PQkopfX1mdW5jdGlvbiBlbChvKXt2YXIgYz1TbigpO2lmKCFjKXtPKCJ1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS4iKTtyZXR1cm59dmFyIGg9KCk9PnByKGMuc3ViVHJlZSxvKGMucHJveHkpKTt1bygoKT0+Vm4oaCx7Zmx1c2g6InBvc3QifSkpLHJhKGgpfWZ1bmN0aW9uIHByKG8sYyl7aWYoby5zaGFwZUZsYWcmMTI4KXt2YXIgaD1vLnN1c3BlbnNlO289aC5hY3RpdmVCcmFuY2gsaC5wZW5kaW5nQnJhbmNoJiYhaC5pc0h5ZHJhdGluZyYmaC5lZmZlY3RzLnB1c2goKCk9PntwcihoLmFjdGl2ZUJyYW5jaCxjKX0pfWZvcig7by5jb21wb25lbnQ7KW89by5jb21wb25lbnQuc3ViVHJlZTtpZihvLnNoYXBlRmxhZyYxJiZvLmVsKXt2YXIgXz1vLmVsLnN0eWxlO2Zvcih2YXIgSSBpbiBjKV8uc2V0UHJvcGVydHkoIi0tIi5jb25jYXQoSSksY1tJXSl9ZWxzZSBvLnR5cGU9PT1ndCYmby5jaGlsZHJlbi5mb3JFYWNoKEE9PnByKEEsYykpfXZhciB4cz1bImN0cmwiLCJzaGlmdCIsImFsdCIsIm1ldGEiXSxqYT17c3RvcDpvPT5vLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6bz0+by5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6bz0+by50YXJnZXQhPT1vLmN1cnJlbnRUYXJnZXQsY3RybDpvPT4hby5jdHJsS2V5LHNoaWZ0Om89PiFvLnNoaWZ0S2V5LGFsdDpvPT4hby5hbHRLZXksbWV0YTpvPT4hby5tZXRhS2V5LGxlZnQ6bz0+ImJ1dHRvbiJpbiBvJiZvLmJ1dHRvbiE9PTAsbWlkZGxlOm89PiJidXR0b24iaW4gbyYmby5idXR0b24hPT0xLHJpZ2h0Om89PiJidXR0b24iaW4gbyYmby5idXR0b24hPT0yLGV4YWN0OihvLGMpPT54cy5zb21lKGg9Pm9bIiIuY29uY2F0KGgsIktleSIpXSYmIWMuaW5jbHVkZXMoaCkpfSxycz0obyxjKT0+ZnVuY3Rpb24oaCl7Zm9yKHZhciBfPTA7XzxjLmxlbmd0aDtfKyspe3ZhciBJPWphW2NbX11dO2lmKEkmJkkoaCxjKSlyZXR1cm59Zm9yKHZhciBBPWFyZ3VtZW50cy5sZW5ndGgseD1uZXcgQXJyYXkoQT4xP0EtMTowKSx6PTE7ejxBO3orKyl4W3otMV09YXJndW1lbnRzW3pdO3JldHVybiBvKGgsLi4ueCl9LFNjPShvLGMpPT5oPT57aWYoImtleSJpbiBoKXt2YXIgXz1tLmh5cGhlbmF0ZShoLmtleSk7aWYoYy5zb21lKEk9Pkk9PT1fKSlyZXR1cm4gbyhoKX19LENhPW0uZXh0ZW5kKHtwYXRjaFByb3A6bGF9LEpjKSxFbDtmdW5jdGlvbiBjYSgpe3JldHVybiBFbHx8KEVsPUFyKENhKSl9dmFyIHphPWZ1bmN0aW9uKCl7Y2EoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0sb2k9ZnVuY3Rpb24oKXt2YXIgbz1jYSgpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpLHttb3VudDpjfT1vO3JldHVybiBvLm1vdW50PWg9PmMoaCksb307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG0uY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImh5cGhlbmF0ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG0uaHlwaGVuYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIudG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBSLnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUi51bnJlZn19KSxkLkJhc2VUcmFuc2l0aW9uPU1vLGQuQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM9U3IsZC5Db21tZW50PXh0LGQuRnJhZ21lbnQ9Z3QsZC5LZWVwQWxpdmU9Y2UsZC5TdGF0aWM9WXQsZC5TdXNwZW5zZT1hbixkLlRlbGVwb3J0PVJsLGQuVGV4dD11dCxkLmFzc2VydE51bWJlcj1EbixkLmNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nPWNuLGQuY2FsbFdpdGhFcnJvckhhbmRsaW5nPUt0LGQuY2xvbmVWTm9kZT1xaSxkLmNvbXBhdFV0aWxzPW5zLGQuY29tcHV0ZWQ9TGwsZC5jcmVhdGVBcHA9b2ksZC5jcmVhdGVCbG9jaz14bCxkLmNyZWF0ZUNvbW1lbnRWTm9kZT1qYyxkLmNyZWF0ZUVsZW1lbnRCbG9jaz1hYyxkLmNyZWF0ZUVsZW1lbnRWTm9kZT1GYSxkLmNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyPXpzLGQuY3JlYXRlUHJvcHNSZXN0UHJveHk9cGMsZC5jcmVhdGVSZW5kZXJlcj1BcixkLmNyZWF0ZVNsb3RzPVJhLGQuY3JlYXRlU3RhdGljVk5vZGU9SXMsZC5jcmVhdGVUZXh0Vk5vZGU9VHMsZC5jcmVhdGVWTm9kZT1HbixkLmRlZmluZUFzeW5jQ29tcG9uZW50PWhlLGQuZGVmaW5lQ29tcG9uZW50PW1lLGQuZGVmaW5lRW1pdHM9dWMsZC5kZWZpbmVFeHBvc2U9emMsZC5kZWZpbmVQcm9wcz1nbCxkLmdldEN1cnJlbnRJbnN0YW5jZT1TbixkLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1aLGQuZ3VhcmRSZWFjdGl2ZVByb3BzPUJsLGQuaD1xYyxkLmhhbmRsZUVycm9yPUlyLGQuaW5pdEN1c3RvbUZvcm1hdHRlcj1paSxkLmluamVjdD1vcixkLmluamVjdEhvb2s9Y28sZC5pc01lbW9TYW1lPVZsLGQuaXNSdW50aW1lT25seT1zYyxkLmlzVk5vZGU9b2EsZC5tZXJnZURlZmF1bHRzPWhjLGQubWVyZ2VQcm9wcz1WYSxkLm5leHRUaWNrPXRuLGQub25BY3RpdmF0ZWQ9bHQsZC5vbkJlZm9yZU1vdW50PWdpLGQub25CZWZvcmVVbm1vdW50PVFuLGQub25CZWZvcmVVcGRhdGU9Zm8sZC5vbkRlYWN0aXZhdGVkPXp0LGQub25FcnJvckNhcHR1cmVkPVZzLGQub25Nb3VudGVkPXVvLGQub25SZW5kZXJUcmFja2VkPUxyLGQub25SZW5kZXJUcmlnZ2VyZWQ9TmEsZC5vblNlcnZlclByZWZldGNoPXFhLGQub25Vbm1vdW50ZWQ9RHIsZC5vblVwZGF0ZWQ9cmEsZC5vcGVuQmxvY2s9bnIsZC5wYXJzZUNsYXNzTGlzdD1tYyxkLnBhcnNlQ2xhc3NTdHlsZXM9S3MsZC5wb3BTY29wZUlkPVlhLGQucHJvdmlkZT1abixkLnB1c2hTY29wZUlkPUJvLGQucXVldWVQb3N0Rmx1c2hDYj1VcixkLnJlZ2lzdGVyUnVudGltZUNvbXBpbGVyPWhsLGQucmVuZGVyPXphLGQucmVuZGVyTGlzdD1vbCxkLnJlbmRlclNsb3Q9YWwsZC5yZXNvbHZlQ29tcG9uZW50PU5sLGQucmVzb2x2ZURpcmVjdGl2ZT1ncyxkLnJlc29sdmVEeW5hbWljQ29tcG9uZW50PW1hLGQucmVzb2x2ZUZpbHRlcj1tbCxkLnJlc29sdmVUcmFuc2l0aW9uSG9va3M9QWksZC5zZXRCbG9ja1RyYWNraW5nPSRvLGQuc2V0RGV2dG9vbHNIb29rPWxpLGQuc2V0VHJhbnNpdGlvbkhvb2tzPUQsZC5zc3JDb250ZXh0S2V5PUZsLGQudG9IYW5kbGVycz12cyxkLnRyYW5zZm9ybVZOb2RlQXJncz1YYSxkLnVzZUF0dHJzPUdjLGQudXNlQ3NzTW9kdWxlPUhhLGQudXNlQ3NzU3R5bGVzPXNhLGQudXNlQ3NzVmFycz1lbCxkLnVzZVNTUkNvbnRleHQ9dmwsZC51c2VTbG90cz1XYyxkLnVzZVRyYW5zaXRpb25TdGF0ZT1qaSxkLnZlcnNpb249em8sZC53YXJuPU8sZC53YXRjaD1TaSxkLndhdGNoRWZmZWN0PVZuLGQud2F0Y2hQb3N0RWZmZWN0PVhyLGQud2F0Y2hTeW5jRWZmZWN0PWhpLGQud2l0aEFzeW5jQ29udGV4dD1ZYyxkLndpdGhDdHg9S3IsZC53aXRoRGVmYXVsdHM9ZmMsZC53aXRoRGlyZWN0aXZlcz1pbCxkLndpdGhLZXlzPVNjLGQud2l0aE1lbW89VG8sZC53aXRoTW9kaWZpZXJzPXJzLGQud2l0aFNjb3BlSWQ9S24sT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGR9KHt9LFQsayxiKTtyZXR1cm4gQy5fX1RZUEVfXz0ibnZ1ZSIsQ312YXIgWGc9aFAoX1ApO3ZhciB3dT17fTtsUCh3dSx7RU1QVFlfQVJSOigpPT5SUCxFTVBUWV9PQko6KCk9PmtQLE5POigpPT5CUCxOT09QOigpPT54UCxjYW1lbGl6ZTooKT0+cVAsY2FwaXRhbGl6ZTooKT0+bGYsZGVmOigpPT5RUCxleHRlbmQ6KCk9PkRpLGdldEdsb2JhbFRoaXM6KCk9Pm5OLGhhc0NoYW5nZWQ6KCk9PlpQLGhhc093bjooKT0+WGwsaHlwaGVuYXRlOigpPT5jZCxpbnZva2VBcnJheUZuczooKT0+WFAsaXNBcnJheTooKT0+dG8saXNCdWlsdEluRGlyZWN0aXZlOigpPT5HUCxpc0Z1bmN0aW9uOigpPT5Ibixpc0dsb2JhbGx5V2hpdGVsaXN0ZWQ6KCk9PkVQLGlzSFRNTFRhZzooKT0+SVAsaXNJbnRlZ2VyS2V5OigpPT56UCxpc01hcDooKT0+dHYsaXNNb2RlbExpc3RlbmVyOigpPT5MUCxpc09iamVjdDooKT0+VmMsaXNPbjooKT0+RFAsaXNQbGFpbk9iamVjdDooKT0+VWMsaXNQcm9taXNlOigpPT5IUCxpc1JlZ0V4cDooKT0+VVAsaXNSZXNlcnZlZFByb3A6KCk9PldQLGlzU1ZHVGFnOigpPT5QUCxpc1NldDooKT0+bnYsaXNTdHJpbmc6KCk9PkxpLGlzU3ltYm9sOigpPT4kUCxsb29zZVRvTnVtYmVyOigpPT5lTixtYWtlTWFwOigpPT5GYyxub3JtYWxpemVDbGFzczooKT0+bGQsbm9ybWFsaXplUHJvcHM6KCk9Pk9QLG5vcm1hbGl6ZVN0eWxlOigpPT5zZCxwYXJzZVN0cmluZ1N0eWxlOigpPT5RZyxyZW1vdmU6KCk9PkZQLHRvRGlzcGxheVN0cmluZzooKT0+TlAsdG9IYW5kbGVyS2V5OigpPT5LUCx0b051bWJlcjooKT0+dE4sdG9SYXdUeXBlOigpPT5qUCx0b1R5cGVTdHJpbmc6KCk9PkxzfSk7ZnVuY3Rpb24gRmModixsKXtsZXQgYj1PYmplY3QuY3JlYXRlKG51bGwpLFQ9di5zcGxpdCgiLCIpO2ZvcihsZXQgaz0wO2s8VC5sZW5ndGg7aysrKWJbVFtrXV09ITA7cmV0dXJuIGw/az0+ISFiW2sudG9Mb3dlckNhc2UoKV06az0+ISFiW2tdfXZhciB5UD0iSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50IixFUD1GYyh5UCk7ZnVuY3Rpb24gc2Qodil7aWYodG8odikpe2xldCBsPXt9O2ZvcihsZXQgYj0wO2I8di5sZW5ndGg7YisrKXtsZXQgVD12W2JdLGs9TGkoVCk/UWcoVCk6c2QoVCk7aWYoaylmb3IobGV0IEMgaW4gaylsW0NdPWtbQ119cmV0dXJuIGx9ZWxzZXtpZihMaSh2KSlyZXR1cm4gdjtpZihWYyh2KSlyZXR1cm4gdn19dmFyIHdQPS87KD8hW14oXSpcKSkvZyxTUD0vOihbXl0rKS8sQ1A9L1wvXCouKj9cKlwvL2dzO2Z1bmN0aW9uIFFnKHYpe2xldCBsPXt9O3JldHVybiB2LnJlcGxhY2UoQ1AsIiIpLnNwbGl0KHdQKS5mb3JFYWNoKGI9PntpZihiKXtsZXQgVD1iLnNwbGl0KFNQKTtULmxlbmd0aD4xJiYobFtUWzBdLnRyaW0oKV09VFsxXS50cmltKCkpfX0pLGx9ZnVuY3Rpb24gbGQodil7bGV0IGw9IiI7aWYoTGkodikpbD12O2Vsc2UgaWYodG8odikpZm9yKGxldCBiPTA7Yjx2Lmxlbmd0aDtiKyspe2xldCBUPWxkKHZbYl0pO1QmJihsKz1UKyIgIil9ZWxzZSBpZihWYyh2KSlmb3IobGV0IGIgaW4gdil2W2JdJiYobCs9YisiICIpO3JldHVybiBsLnRyaW0oKX1mdW5jdGlvbiBPUCh2KXtpZighdilyZXR1cm4gbnVsbDtsZXR7Y2xhc3M6bCxzdHlsZTpifT12O3JldHVybiBsJiYhTGkobCkmJih2LmNsYXNzPWxkKGwpKSxiJiYodi5zdHlsZT1zZChiKSksdn12YXIgQVA9Imh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGhncm91cCxoMSxoMixoMyxoNCxoNSxoNixuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxzdW1tYXJ5LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IixUUD0ic3ZnLGFuaW1hdGUsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxjbGlwUGF0aCxjb2xvci1wcm9maWxlLGRlZnMsZGVzYyxkaXNjYXJkLGVsbGlwc2UsZmVCbGVuZCxmZUNvbG9yTWF0cml4LGZlQ29tcG9uZW50VHJhbnNmZXIsZmVDb21wb3NpdGUsZmVDb252b2x2ZU1hdHJpeCxmZURpZmZ1c2VMaWdodGluZyxmZURpc3BsYWNlbWVudE1hcCxmZURpc3RhbnRMaWdodCxmZURyb3BTaGFkb3csZmVGbG9vZCxmZUZ1bmNBLGZlRnVuY0IsZmVGdW5jRyxmZUZ1bmNSLGZlR2F1c3NpYW5CbHVyLGZlSW1hZ2UsZmVNZXJnZSxmZU1lcmdlTm9kZSxmZU1vcnBob2xvZ3ksZmVPZmZzZXQsZmVQb2ludExpZ2h0LGZlU3BlY3VsYXJMaWdodGluZyxmZVNwb3RMaWdodCxmZVRpbGUsZmVUdXJidWxlbmNlLGZpbHRlcixmb3JlaWduT2JqZWN0LGcsaGF0Y2gsaGF0Y2hwYXRoLGltYWdlLGxpbmUsbGluZWFyR3JhZGllbnQsbWFya2VyLG1hc2ssbWVzaCxtZXNoZ3JhZGllbnQsbWVzaHBhdGNoLG1lc2hyb3csbWV0YWRhdGEsbXBhdGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmFkaWFsR3JhZGllbnQscmVjdCxzZXQsc29saWRjb2xvcixzdG9wLHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0UGF0aCx0aXRsZSx0c3Bhbix1bmtub3duLHVzZSx2aWV3IixJUD1GYyhBUCksUFA9RmMoVFApLE5QPXY9PkxpKHYpP3Y6dj09bnVsbD8iIjp0byh2KXx8VmModikmJih2LnRvU3RyaW5nPT09cnZ8fCFIbih2LnRvU3RyaW5nKSk/SlNPTi5zdHJpbmdpZnkodixldiwyKTpTdHJpbmcodiksZXY9KHYsbCk9PmwmJmwuX192X2lzUmVmP2V2KHYsbC52YWx1ZSk6dHYobCk/e1tgTWFwKCR7bC5zaXplfSlgXTpbLi4ubC5lbnRyaWVzKCldLnJlZHVjZSgoYixbVCxrXSk9PihiW2Ake1R9ID0+YF09ayxiKSx7fSl9Om52KGwpP3tbYFNldCgke2wuc2l6ZX0pYF06Wy4uLmwudmFsdWVzKCldfTpWYyhsKSYmIXRvKGwpJiYhVWMobCk/U3RyaW5nKGwpOmwsa1A9e30sUlA9W10seFA9KCk9Pnt9LEJQPSgpPT4hMSxNUD0vXm9uW15hLXpdLyxEUD12PT5NUC50ZXN0KHYpLExQPXY9PnYuc3RhcnRzV2l0aCgib25VcGRhdGU6IiksRGk9T2JqZWN0LmFzc2lnbixGUD0odixsKT0+e2xldCBiPXYuaW5kZXhPZihsKTtiPi0xJiZ2LnNwbGljZShiLDEpfSxWUD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFhsPSh2LGwpPT5WUC5jYWxsKHYsbCksdG89QXJyYXkuaXNBcnJheSx0dj12PT5Mcyh2KT09PSJbb2JqZWN0IE1hcF0iLG52PXY9PkxzKHYpPT09IltvYmplY3QgU2V0XSIsVVA9dj0+THModik9PT0iW29iamVjdCBSZWdFeHBdIixIbj12PT50eXBlb2Ygdj09ImZ1bmN0aW9uIixMaT12PT50eXBlb2Ygdj09InN0cmluZyIsJFA9dj0+dHlwZW9mIHY9PSJzeW1ib2wiLFZjPXY9PnYhPT1udWxsJiZ0eXBlb2Ygdj09Im9iamVjdCIsSFA9dj0+VmModikmJkhuKHYudGhlbikmJkhuKHYuY2F0Y2gpLHJ2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsTHM9dj0+cnYuY2FsbCh2KSxqUD12PT5Mcyh2KS5zbGljZSg4LC0xKSxVYz12PT5Mcyh2KT09PSJbb2JqZWN0IE9iamVjdF0iLHpQPXY9PkxpKHYpJiZ2IT09Ik5hTiImJnZbMF0hPT0iLSImJiIiK3BhcnNlSW50KHYsMTApPT09dixXUD1GYygiLGtleSxyZWYscmVmX2ZvcixyZWZfa2V5LG9uVm5vZGVCZWZvcmVNb3VudCxvblZub2RlTW91bnRlZCxvblZub2RlQmVmb3JlVXBkYXRlLG9uVm5vZGVVcGRhdGVkLG9uVm5vZGVCZWZvcmVVbm1vdW50LG9uVm5vZGVVbm1vdW50ZWQiKSxHUD1GYygiYmluZCxjbG9hayxlbHNlLWlmLGVsc2UsZm9yLGh0bWwsaWYsbW9kZWwsb24sb25jZSxwcmUsc2hvdyxzbG90LHRleHQsbWVtbyIpLHNmPXY9PntsZXQgbD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBiPT5sW2JdfHwobFtiXT12KGIpKX0sWVA9Ly0oXHcpL2cscVA9c2Yodj0+di5yZXBsYWNlKFlQLChsLGIpPT5iP2IudG9VcHBlckNhc2UoKToiIikpLEpQPS9cQihbQS1aXSkvZyxjZD1zZih2PT52LnJlcGxhY2UoSlAsIi0kMSIpLnRvTG93ZXJDYXNlKCkpLGxmPXNmKHY9PnYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdi5zbGljZSgxKSksS1A9c2Yodj0+dj9gb24ke2xmKHYpfWA6IiIpLFpQPSh2LGwpPT4hT2JqZWN0LmlzKHYsbCksWFA9KHYsbCk9Pntmb3IobGV0IGI9MDtiPHYubGVuZ3RoO2IrKyl2W2JdKGwpfSxRUD0odixsLGIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHYsbCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6Yn0pfSxlTj12PT57bGV0IGw9cGFyc2VGbG9hdCh2KTtyZXR1cm4gaXNOYU4obCk/djpsfSx0Tj12PT57bGV0IGw9TGkodik/TnVtYmVyKHYpOk5hTjtyZXR1cm4gaXNOYU4obCk/djpsfSxpdixuTj0oKT0+aXZ8fChpdj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnt9KTtmdW5jdGlvbiBvdih2KXt2YXIgbD1mdW5jdGlvbihiLFQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBrKEQsLi4uWil7Y29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7RH1gLC4uLlopfWxldCBDO2NsYXNzIGR7Y29uc3RydWN0b3IoWj0hMSl7dGhpcy5kZXRhY2hlZD1aLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLmVmZmVjdHM9W10sdGhpcy5jbGVhbnVwcz1bXSx0aGlzLnBhcmVudD1DLCFaJiZDJiYodGhpcy5pbmRleD0oQy5zY29wZXN8fChDLnNjb3Blcz1bXSkpLnB1c2godGhpcyktMSl9Z2V0IGFjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmV9cnVuKFope2lmKHRoaXMuX2FjdGl2ZSl7bGV0IG1lPUM7dHJ5e3JldHVybiBDPXRoaXMsWigpfWZpbmFsbHl7Qz1tZX19fW9uKCl7Qz10aGlzfW9mZigpe0M9dGhpcy5wYXJlbnR9c3RvcChaKXtpZih0aGlzLl9hY3RpdmUpe2xldCBtZSxsZTtmb3IobWU9MCxsZT10aGlzLmVmZmVjdHMubGVuZ3RoO21lPGxlO21lKyspdGhpcy5lZmZlY3RzW21lXS5zdG9wKCk7Zm9yKG1lPTAsbGU9dGhpcy5jbGVhbnVwcy5sZW5ndGg7bWU8bGU7bWUrKyl0aGlzLmNsZWFudXBzW21lXSgpO2lmKHRoaXMuc2NvcGVzKWZvcihtZT0wLGxlPXRoaXMuc2NvcGVzLmxlbmd0aDttZTxsZTttZSsrKXRoaXMuc2NvcGVzW21lXS5zdG9wKCEwKTtpZighdGhpcy5kZXRhY2hlZCYmdGhpcy5wYXJlbnQmJiFaKXtsZXQgaGU9dGhpcy5wYXJlbnQuc2NvcGVzLnBvcCgpO2hlJiZoZSE9PXRoaXMmJih0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF09aGUsaGUuaW5kZXg9dGhpcy5pbmRleCl9dGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMuX2FjdGl2ZT0hMX19fWZ1bmN0aW9uIG0oRCl7cmV0dXJuIG5ldyBkKEQpfWZ1bmN0aW9uIFIoRCxaPUMpe1omJlouYWN0aXZlJiZaLmVmZmVjdHMucHVzaChEKX1mdW5jdGlvbiBXZSgpe3JldHVybiBDfWZ1bmN0aW9uIFB0KEQpe0MmJkMuY2xlYW51cHMucHVzaChEKX1sZXQgZW49RD0+e2xldCBaPW5ldyBTZXQoRCk7cmV0dXJuIFoudz0wLFoubj0wLFp9LGdlPUQ9PihELncmcmUpPjAsTz1EPT4oRC5uJnJlKT4wLE50PSh7ZGVwczpEfSk9PntpZihELmxlbmd0aClmb3IobGV0IFo9MDtaPEQubGVuZ3RoO1orKylEW1pdLnd8PXJlfSxqbj1EPT57bGV0e2RlcHM6Wn09RDtpZihaLmxlbmd0aCl7bGV0IG1lPTA7Zm9yKGxldCBsZT0wO2xlPFoubGVuZ3RoO2xlKyspe2xldCBoZT1aW2xlXTtnZShoZSkmJiFPKGhlKT9oZS5kZWxldGUoRCk6WlttZSsrXT1oZSxoZS53Jj1+cmUsaGUubiY9fnJlfVoubGVuZ3RoPW1lfX0sX3Q9bmV3IFdlYWtNYXAsSj0wLHJlPTEsRG49MzAsZm4sS3Q9U3ltYm9sKCIiKSxjbj1TeW1ib2woIiIpO2NsYXNzIElye2NvbnN0cnVjdG9yKFosbWU9bnVsbCxsZSl7dGhpcy5mbj1aLHRoaXMuc2NoZWR1bGVyPW1lLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGVwcz1bXSx0aGlzLnBhcmVudD12b2lkIDAsUih0aGlzLGxlKX1ydW4oKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuIHRoaXMuZm4oKTtsZXQgWj1mbixtZT1WdDtmb3IoO1o7KXtpZihaPT09dGhpcylyZXR1cm47Wj1aLnBhcmVudH10cnl7cmV0dXJuIHRoaXMucGFyZW50PWZuLGZuPXRoaXMsVnQ9ITAscmU9MTw8KytKLEo8PURuP050KHRoaXMpOndpKHRoaXMpLHRoaXMuZm4oKX1maW5hbGx5e0o8PURuJiZqbih0aGlzKSxyZT0xPDwtLUosZm49dGhpcy5wYXJlbnQsVnQ9bWUsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMuZGVmZXJTdG9wJiZ0aGlzLnN0b3AoKX19c3RvcCgpe2ZuPT09dGhpcz90aGlzLmRlZmVyU3RvcD0hMDp0aGlzLmFjdGl2ZSYmKHdpKHRoaXMpLHRoaXMub25TdG9wJiZ0aGlzLm9uU3RvcCgpLHRoaXMuYWN0aXZlPSExKX19ZnVuY3Rpb24gd2koRCl7bGV0e2RlcHM6Wn09RDtpZihaLmxlbmd0aCl7Zm9yKGxldCBtZT0wO21lPFoubGVuZ3RoO21lKyspWlttZV0uZGVsZXRlKEQpO1oubGVuZ3RoPTB9fWZ1bmN0aW9uIHFuKEQsWil7RC5lZmZlY3QmJihEPUQuZWZmZWN0LmZuKTtsZXQgbWU9bmV3IElyKEQpO1omJihULmV4dGVuZChtZSxaKSxaLnNjb3BlJiZSKG1lLFouc2NvcGUpKSwoIVp8fCFaLmxhenkpJiZtZS5ydW4oKTtsZXQgbGU9bWUucnVuLmJpbmQobWUpO3JldHVybiBsZS5lZmZlY3Q9bWUsbGV9ZnVuY3Rpb24gaG4oRCl7RC5lZmZlY3Quc3RvcCgpfWxldCBWdD0hMCxObj1bXTtmdW5jdGlvbiB5bigpe05uLnB1c2goVnQpLFZ0PSExfWZ1bmN0aW9uIHhuKCl7Tm4ucHVzaChWdCksVnQ9ITB9ZnVuY3Rpb24gUHIoKXtsZXQgRD1Obi5wb3AoKTtWdD1EPT09dm9pZCAwPyEwOkR9ZnVuY3Rpb24gSmUoRCxaLG1lKXtpZihWdCYmZm4pe2xldCBsZT1fdC5nZXQoRCk7bGV8fF90LnNldChELGxlPW5ldyBNYXApO2xldCBoZT1sZS5nZXQobWUpO2hlfHxsZS5zZXQobWUsaGU9ZW4oKSksZHQoaGUsdm9pZCAwKX19ZnVuY3Rpb24gZHQoRCxaKXtsZXQgbWU9ITE7Sjw9RG4/TyhEKXx8KEQubnw9cmUsbWU9IWdlKEQpKTptZT0hRC5oYXMoZm4pLG1lJiYoRC5hZGQoZm4pLGZuLmRlcHMucHVzaChEKSl9ZnVuY3Rpb24gU3QoRCxaLG1lLGxlLGhlLE90KXtsZXQgSz1fdC5nZXQoRCk7aWYoIUspcmV0dXJuO2xldCBZPVtdO2lmKFo9PT0iY2xlYXIiKVk9Wy4uLksudmFsdWVzKCldO2Vsc2UgaWYobWU9PT0ibGVuZ3RoIiYmVC5pc0FycmF5KEQpKXtsZXQgeGU9TnVtYmVyKGxlKTtLLmZvckVhY2goKGx0LHp0KT0+eyh6dD09PSJsZW5ndGgifHx6dD49eGUpJiZZLnB1c2gobHQpfSl9ZWxzZSBzd2l0Y2gobWUhPT12b2lkIDAmJlkucHVzaChLLmdldChtZSkpLFope2Nhc2UiYWRkIjpULmlzQXJyYXkoRCk/VC5pc0ludGVnZXJLZXkobWUpJiZZLnB1c2goSy5nZXQoImxlbmd0aCIpKTooWS5wdXNoKEsuZ2V0KEt0KSksVC5pc01hcChEKSYmWS5wdXNoKEsuZ2V0KGNuKSkpO2JyZWFrO2Nhc2UiZGVsZXRlIjpULmlzQXJyYXkoRCl8fChZLnB1c2goSy5nZXQoS3QpKSxULmlzTWFwKEQpJiZZLnB1c2goSy5nZXQoY24pKSk7YnJlYWs7Y2FzZSJzZXQiOlQuaXNNYXAoRCkmJlkucHVzaChLLmdldChLdCkpO2JyZWFrfWxldCBjZT12b2lkIDA7aWYoWS5sZW5ndGg9PT0xKVlbMF0mJnRuKFlbMF0pO2Vsc2V7bGV0IHhlPVtdO2ZvcihsZXQgbHQgb2YgWSlsdCYmeGUucHVzaCguLi5sdCk7dG4oZW4oeGUpKX19ZnVuY3Rpb24gdG4oRCxaKXtsZXQgbWU9VC5pc0FycmF5KEQpP0Q6Wy4uLkRdO2ZvcihsZXQgbGUgb2YgbWUpbGUuY29tcHV0ZWQmJmtuKGxlLFopO2ZvcihsZXQgbGUgb2YgbWUpbGUuY29tcHV0ZWR8fGtuKGxlLFopfWZ1bmN0aW9uIGtuKEQsWil7KEQhPT1mbnx8RC5hbGxvd1JlY3Vyc2UpJiYoRC5zY2hlZHVsZXI/RC5zY2hlZHVsZXIoKTpELnJ1bigpKX1mdW5jdGlvbiBadChELFope3ZhciBtZTtyZXR1cm4obWU9X3QuZ2V0KEQpKT09PW51bGx8fG1lPT09dm9pZCAwP3ZvaWQgMDptZS5nZXQoWil9bGV0IExuPVQubWFrZU1hcCgiX19wcm90b19fLF9fdl9pc1JlZixfX2lzVnVlIiksTnI9bmV3IFNldChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLmZpbHRlcihEPT5EIT09ImFyZ3VtZW50cyImJkQhPT0iY2FsbGVyIikubWFwKEQ9PlN5bWJvbFtEXSkuZmlsdGVyKFQuaXNTeW1ib2wpKSxVcj1rcigpLEZpPWtyKCExLCEwKSxscj1rcighMCksRXI9a3IoITAsITApLFZpPUdvKCk7ZnVuY3Rpb24gR28oKXtsZXQgRD17fTtyZXR1cm5bImluY2x1ZGVzIiwiaW5kZXhPZiIsImxhc3RJbmRleE9mIl0uZm9yRWFjaChaPT57RFtaXT1mdW5jdGlvbiguLi5tZSl7bGV0IGxlPWFuKHRoaXMpO2ZvcihsZXQgT3Q9MCxLPXRoaXMubGVuZ3RoO090PEs7T3QrKylKZShsZSwiZ2V0IixPdCsiIik7bGV0IGhlPWxlW1pdKC4uLm1lKTtyZXR1cm4gaGU9PT0tMXx8aGU9PT0hMT9sZVtaXSguLi5tZS5tYXAoYW4pKTpoZX19KSxbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiXS5mb3JFYWNoKFo9PntEW1pdPWZ1bmN0aW9uKC4uLm1lKXt5bigpO2xldCBsZT1hbih0aGlzKVtaXS5hcHBseSh0aGlzLG1lKTtyZXR1cm4gUHIoKSxsZX19KSxEfWZ1bmN0aW9uIFlvKEQpe2xldCBaPWFuKHRoaXMpO3JldHVybiBKZShaLCJoYXMiLEQpLFouaGFzT3duUHJvcGVydHkoRCl9ZnVuY3Rpb24ga3IoRD0hMSxaPSExKXtyZXR1cm4gZnVuY3Rpb24obGUsaGUsT3Qpe2lmKGhlPT09Il9fdl9pc1JlYWN0aXZlIilyZXR1cm4hRDtpZihoZT09PSJfX3ZfaXNSZWFkb25seSIpcmV0dXJuIEQ7aWYoaGU9PT0iX192X2lzU2hhbGxvdyIpcmV0dXJuIFo7aWYoaGU9PT0iX192X3JhdyImJk90PT09KEQ/Wj9EdDp1cjpaP0tyOktuKS5nZXQobGUpKXJldHVybiBsZTtsZXQgSz1ULmlzQXJyYXkobGUpO2lmKCFEKXtpZihLJiZULmhhc093bihWaSxoZSkpcmV0dXJuIFJlZmxlY3QuZ2V0KFZpLGhlLE90KTtpZihoZT09PSJoYXNPd25Qcm9wZXJ0eSIpcmV0dXJuIFlvfWxldCBZPVJlZmxlY3QuZ2V0KGxlLGhlLE90KTtyZXR1cm4oVC5pc1N5bWJvbChoZSk/TnIuaGFzKGhlKTpMbihoZSkpfHwoRHx8SmUobGUsImdldCIsaGUpLFopP1k6ZnIoWSk/SyYmVC5pc0ludGVnZXJLZXkoaGUpP1k6WS52YWx1ZTpULmlzT2JqZWN0KFkpP0Q/cGEoWSk6eW8oWSk6WX19bGV0IFJyPVVpKCkseHI9VWkoITApO2Z1bmN0aW9uIFVpKEQ9ITEpe3JldHVybiBmdW5jdGlvbihtZSxsZSxoZSxPdCl7bGV0IEs9bWVbbGVdO2lmKFpyKEspJiZmcihLKSYmIWZyKGhlKSlyZXR1cm4hMTtpZighRCYmKCFmaShoZSkmJiFacihoZSkmJihLPWFuKEspLGhlPWFuKGhlKSksIVQuaXNBcnJheShtZSkmJmZyKEspJiYhZnIoaGUpKSlyZXR1cm4gSy52YWx1ZT1oZSwhMDtsZXQgWT1ULmlzQXJyYXkobWUpJiZULmlzSW50ZWdlcktleShsZSk/TnVtYmVyKGxlKTxtZS5sZW5ndGg6VC5oYXNPd24obWUsbGUpLGNlPVJlZmxlY3Quc2V0KG1lLGxlLGhlLE90KTtyZXR1cm4gbWU9PT1hbihPdCkmJihZP1QuaGFzQ2hhbmdlZChoZSxLKSYmU3QobWUsInNldCIsbGUsaGUsSyk6U3QobWUsImFkZCIsbGUsaGUpKSxjZX19ZnVuY3Rpb24gWXIoRCxaKXtsZXQgbWU9VC5oYXNPd24oRCxaKSxsZT1EW1pdLGhlPVJlZmxlY3QuZGVsZXRlUHJvcGVydHkoRCxaKTtyZXR1cm4gaGUmJm1lJiZTdChELCJkZWxldGUiLFosdm9pZCAwLGxlKSxoZX1mdW5jdGlvbiBUYShELFope2xldCBtZT1SZWZsZWN0LmhhcyhELFopO3JldHVybighVC5pc1N5bWJvbChaKXx8IU5yLmhhcyhaKSkmJkplKEQsImhhcyIsWiksbWV9ZnVuY3Rpb24gJGkoRCl7cmV0dXJuIEplKEQsIml0ZXJhdGUiLFQuaXNBcnJheShEKT8ibGVuZ3RoIjpLdCksUmVmbGVjdC5vd25LZXlzKEQpfWxldCBtbz17Z2V0OlVyLHNldDpScixkZWxldGVQcm9wZXJ0eTpZcixoYXM6VGEsb3duS2V5czokaX0sSWE9e2dldDpscixzZXQoRCxaKXtyZXR1cm4hMH0sZGVsZXRlUHJvcGVydHkoRCxaKXtyZXR1cm4hMH19LG5vPVQuZXh0ZW5kKHt9LG1vLHtnZXQ6Rmksc2V0OnhyfSkscW89VC5leHRlbmQoe30sSWEse2dldDpFcn0pLHNpPUQ9PkQsUG49RD0+UmVmbGVjdC5nZXRQcm90b3R5cGVPZihEKTtmdW5jdGlvbiBjcihELFosbWU9ITEsbGU9ITEpe0Q9RC5fX3ZfcmF3O2xldCBoZT1hbihEKSxPdD1hbihaKTttZXx8KFohPT1PdCYmSmUoaGUsImdldCIsWiksSmUoaGUsImdldCIsT3QpKTtsZXR7aGFzOkt9PVBuKGhlKSxZPWxlP3NpOm1lP2dhOmRpO2lmKEsuY2FsbChoZSxaKSlyZXR1cm4gWShELmdldChaKSk7aWYoSy5jYWxsKGhlLE90KSlyZXR1cm4gWShELmdldChPdCkpO0QhPT1oZSYmRC5nZXQoWil9ZnVuY3Rpb24gbGkoRCxaPSExKXtsZXQgbWU9dGhpcy5fX3ZfcmF3LGxlPWFuKG1lKSxoZT1hbihEKTtyZXR1cm4gWnx8KEQhPT1oZSYmSmUobGUsImhhcyIsRCksSmUobGUsImhhcyIsaGUpKSxEPT09aGU/bWUuaGFzKEQpOm1lLmhhcyhEKXx8bWUuaGFzKGhlKX1mdW5jdGlvbiBKbihELFo9ITEpe3JldHVybiBEPUQuX192X3JhdywhWiYmSmUoYW4oRCksIml0ZXJhdGUiLEt0KSxSZWZsZWN0LmdldChELCJzaXplIixEKX1mdW5jdGlvbiBKbyhEKXtEPWFuKEQpO2xldCBaPWFuKHRoaXMpO3JldHVybiBQbihaKS5oYXMuY2FsbChaLEQpfHwoWi5hZGQoRCksU3QoWiwiYWRkIixELEQpKSx0aGlzfWZ1bmN0aW9uIHhvKEQsWil7Wj1hbihaKTtsZXQgbWU9YW4odGhpcykse2hhczpsZSxnZXQ6aGV9PVBuKG1lKSxPdD1sZS5jYWxsKG1lLEQpO090fHwoRD1hbihEKSxPdD1sZS5jYWxsKG1lLEQpKTtsZXQgSz1oZS5jYWxsKG1lLEQpO3JldHVybiBtZS5zZXQoRCxaKSxPdD9ULmhhc0NoYW5nZWQoWixLKSYmU3QobWUsInNldCIsRCxaLEspOlN0KG1lLCJhZGQiLEQsWiksdGhpc31mdW5jdGlvbiBybyhEKXtsZXQgWj1hbih0aGlzKSx7aGFzOm1lLGdldDpsZX09UG4oWiksaGU9bWUuY2FsbChaLEQpO2hlfHwoRD1hbihEKSxoZT1tZS5jYWxsKFosRCkpO2xldCBPdD1sZT9sZS5jYWxsKFosRCk6dm9pZCAwLEs9Wi5kZWxldGUoRCk7cmV0dXJuIGhlJiZTdChaLCJkZWxldGUiLEQsdm9pZCAwLE90KSxLfWZ1bmN0aW9uIGlvKCl7bGV0IEQ9YW4odGhpcyksWj1ELnNpemUhPT0wLG1lPXZvaWQgMCxsZT1ELmNsZWFyKCk7cmV0dXJuIFomJlN0KEQsImNsZWFyIix2b2lkIDAsdm9pZCAwLG1lKSxsZX1mdW5jdGlvbiBxcihELFope3JldHVybiBmdW5jdGlvbihsZSxoZSl7bGV0IE90PXRoaXMsSz1PdC5fX3ZfcmF3LFk9YW4oSyksY2U9Wj9zaTpEP2dhOmRpO3JldHVybiFEJiZKZShZLCJpdGVyYXRlIixLdCksSy5mb3JFYWNoKCh4ZSxsdCk9PmxlLmNhbGwoaGUsY2UoeGUpLGNlKGx0KSxPdCkpfX1mdW5jdGlvbiBvbyhELFosbWUpe3JldHVybiBmdW5jdGlvbiguLi5sZSl7bGV0IGhlPXRoaXMuX192X3JhdyxPdD1hbihoZSksSz1ULmlzTWFwKE90KSxZPUQ9PT0iZW50cmllcyJ8fEQ9PT1TeW1ib2wuaXRlcmF0b3ImJkssY2U9RD09PSJrZXlzIiYmSyx4ZT1oZVtEXSguLi5sZSksbHQ9bWU/c2k6Wj9nYTpkaTtyZXR1cm4hWiYmSmUoT3QsIml0ZXJhdGUiLGNlP2NuOkt0KSx7bmV4dCgpe2xldHt2YWx1ZTp6dCxkb25lOkFufT14ZS5uZXh0KCk7cmV0dXJuIEFuP3t2YWx1ZTp6dCxkb25lOkFufTp7dmFsdWU6WT9bbHQoenRbMF0pLGx0KHp0WzFdKV06bHQoenQpLGRvbmU6QW59fSxbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19fWZ1bmN0aW9uIEZuKEQpe3JldHVybiBmdW5jdGlvbiguLi5aKXtyZXR1cm4gRD09PSJkZWxldGUiPyExOnRoaXN9fWZ1bmN0aW9uIHdyKCl7bGV0IEQ9e2dldChPdCl7cmV0dXJuIGNyKHRoaXMsT3QpfSxnZXQgc2l6ZSgpe3JldHVybiBKbih0aGlzKX0saGFzOmxpLGFkZDpKbyxzZXQ6eG8sZGVsZXRlOnJvLGNsZWFyOmlvLGZvckVhY2g6cXIoITEsITEpfSxaPXtnZXQoT3Qpe3JldHVybiBjcih0aGlzLE90LCExLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gSm4odGhpcyl9LGhhczpsaSxhZGQ6Sm8sc2V0OnhvLGRlbGV0ZTpybyxjbGVhcjppbyxmb3JFYWNoOnFyKCExLCEwKX0sbWU9e2dldChPdCl7cmV0dXJuIGNyKHRoaXMsT3QsITApfSxnZXQgc2l6ZSgpe3JldHVybiBKbih0aGlzLCEwKX0saGFzKE90KXtyZXR1cm4gbGkuY2FsbCh0aGlzLE90LCEwKX0sYWRkOkZuKCJhZGQiKSxzZXQ6Rm4oInNldCIpLGRlbGV0ZTpGbigiZGVsZXRlIiksY2xlYXI6Rm4oImNsZWFyIiksZm9yRWFjaDpxcighMCwhMSl9LGxlPXtnZXQoT3Qpe3JldHVybiBjcih0aGlzLE90LCEwLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gSm4odGhpcywhMCl9LGhhcyhPdCl7cmV0dXJuIGxpLmNhbGwodGhpcyxPdCwhMCl9LGFkZDpGbigiYWRkIiksc2V0OkZuKCJzZXQiKSxkZWxldGU6Rm4oImRlbGV0ZSIpLGNsZWFyOkZuKCJjbGVhciIpLGZvckVhY2g6cXIoITAsITApfTtyZXR1cm5bImtleXMiLCJ2YWx1ZXMiLCJlbnRyaWVzIixTeW1ib2wuaXRlcmF0b3JdLmZvckVhY2goT3Q9PntEW090XT1vbyhPdCwhMSwhMSksbWVbT3RdPW9vKE90LCEwLCExKSxaW090XT1vbyhPdCwhMSwhMCksbGVbT3RdPW9vKE90LCEwLCEwKX0pLFtELG1lLFosbGVdfWxldFtjaSxLbyxfbyxab109d3IoKTtmdW5jdGlvbiBKcihELFope2xldCBtZT1aP0Q/Wm86X286RD9LbzpjaTtyZXR1cm4obGUsaGUsT3QpPT5oZT09PSJfX3ZfaXNSZWFjdGl2ZSI/IUQ6aGU9PT0iX192X2lzUmVhZG9ubHkiP0Q6aGU9PT0iX192X3JhdyI/bGU6UmVmbGVjdC5nZXQoVC5oYXNPd24obWUsaGUpJiZoZSBpbiBsZT9tZTpsZSxoZSxPdCl9bGV0IE9uPXtnZXQ6SnIoITEsITEpfSxFbj17Z2V0OkpyKCExLCEwKX0sdWk9e2dldDpKcighMCwhMSl9LEJvPXtnZXQ6SnIoITAsITApfTtmdW5jdGlvbiBZYShELFosbWUpe2xldCBsZT1hbihtZSk7aWYobGUhPT1tZSYmWi5jYWxsKEQsbGUpKXtsZXQgaGU9VC50b1Jhd1R5cGUoRCk7Y29uc29sZS53YXJuKGBSZWFjdGl2ZSAke2hlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7aGU9PT0iTWFwIj8iIGFzIGtleXMiOiIifSwgd2hpY2ggY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzLiBBdm9pZCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiBhbiBvYmplY3QgYW5kIG9ubHkgdXNlIHRoZSByZWFjdGl2ZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLmApfX1sZXQgS249bmV3IFdlYWtNYXAsS3I9bmV3IFdlYWtNYXAsdXI9bmV3IFdlYWtNYXAsRHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24ga2UoRCl7c3dpdGNoKEQpe2Nhc2UiT2JqZWN0IjpjYXNlIkFycmF5IjpyZXR1cm4gMTtjYXNlIk1hcCI6Y2FzZSJTZXQiOmNhc2UiV2Vha01hcCI6Y2FzZSJXZWFrU2V0IjpyZXR1cm4gMjtkZWZhdWx0OnJldHVybiAwfX1mdW5jdGlvbiBibyhEKXtyZXR1cm4gRC5fX3Zfc2tpcHx8IU9iamVjdC5pc0V4dGVuc2libGUoRCk/MDprZShULnRvUmF3VHlwZShEKSl9ZnVuY3Rpb24geW8oRCl7cmV0dXJuIFpyKEQpP0Q6SGkoRCwhMSxtbyxPbixLbil9ZnVuY3Rpb24gRW8oRCl7cmV0dXJuIEhpKEQsITEsbm8sRW4sS3IpfWZ1bmN0aW9uIHBhKEQpe3JldHVybiBIaShELCEwLElhLHVpLHVyKX1mdW5jdGlvbiBYbyhEKXtyZXR1cm4gSGkoRCwhMCxxbyxCbyxEdCl9ZnVuY3Rpb24gSGkoRCxaLG1lLGxlLGhlKXtpZighVC5pc09iamVjdChEKXx8RC5fX3ZfcmF3JiYhKFomJkQuX192X2lzUmVhY3RpdmUpKXJldHVybiBEO2xldCBPdD1oZS5nZXQoRCk7aWYoT3QpcmV0dXJuIE90O2xldCBLPWJvKEQpO2lmKEs9PT0wKXJldHVybiBEO2xldCBZPW5ldyBQcm94eShELEs9PT0yP2xlOm1lKTtyZXR1cm4gaGUuc2V0KEQsWSksWX1mdW5jdGlvbiB3byhEKXtyZXR1cm4gWnIoRCk/d28oRC5fX3ZfcmF3KTohIShEJiZELl9fdl9pc1JlYWN0aXZlKX1mdW5jdGlvbiBacihEKXtyZXR1cm4hIShEJiZELl9fdl9pc1JlYWRvbmx5KX1mdW5jdGlvbiBmaShEKXtyZXR1cm4hIShEJiZELl9fdl9pc1NoYWxsb3cpfWZ1bmN0aW9uIFFvKEQpe3JldHVybiB3byhEKXx8WnIoRCl9ZnVuY3Rpb24gYW4oRCl7bGV0IFo9RCYmRC5fX3ZfcmF3O3JldHVybiBaP2FuKFopOkR9ZnVuY3Rpb24gU28oRCl7cmV0dXJuIFQuZGVmKEQsIl9fdl9za2lwIiwhMCksRH1sZXQgZGk9RD0+VC5pc09iamVjdChEKT95byhEKTpELGdhPUQ9PlQuaXNPYmplY3QoRCk/cGEoRCk6RDtmdW5jdGlvbiBtbihEKXtWdCYmZm4mJihEPWFuKEQpLGR0KEQuZGVwfHwoRC5kZXA9ZW4oKSkpKX1mdW5jdGlvbiBCcihELFope0Q9YW4oRCk7bGV0IG1lPUQuZGVwO21lJiZ0bihtZSl9ZnVuY3Rpb24gZnIoRCl7cmV0dXJuISEoRCYmRC5fX3ZfaXNSZWY9PT0hMCl9ZnVuY3Rpb24gZWEoRCl7cmV0dXJuIHRhKEQsITEpfWZ1bmN0aW9uIFBhKEQpe3JldHVybiB0YShELCEwKX1mdW5jdGlvbiB0YShELFope3JldHVybiBmcihEKT9EOm5ldyBhbyhELFopfWNsYXNzIGFve2NvbnN0cnVjdG9yKFosbWUpe3RoaXMuX192X2lzU2hhbGxvdz1tZSx0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fcmF3VmFsdWU9bWU/WjphbihaKSx0aGlzLl92YWx1ZT1tZT9aOmRpKFopfWdldCB2YWx1ZSgpe3JldHVybiBtbih0aGlzKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoWil7bGV0IG1lPXRoaXMuX192X2lzU2hhbGxvd3x8ZmkoWil8fFpyKFopO1o9bWU/WjphbihaKSxULmhhc0NoYW5nZWQoWix0aGlzLl9yYXdWYWx1ZSkmJih0aGlzLl9yYXdWYWx1ZT1aLHRoaXMuX3ZhbHVlPW1lP1o6ZGkoWiksQnIodGhpcyxaKSl9fWZ1bmN0aW9uIFpuKEQpe0JyKEQsdm9pZCAwKX1mdW5jdGlvbiBvcihEKXtyZXR1cm4gZnIoRCk/RC52YWx1ZTpEfWxldCBWbj17Z2V0OihELFosbWUpPT5vcihSZWZsZWN0LmdldChELFosbWUpKSxzZXQ6KEQsWixtZSxsZSk9PntsZXQgaGU9RFtaXTtyZXR1cm4gZnIoaGUpJiYhZnIobWUpPyhoZS52YWx1ZT1tZSwhMCk6UmVmbGVjdC5zZXQoRCxaLG1lLGxlKX19O2Z1bmN0aW9uIFhyKEQpe3JldHVybiB3byhEKT9EOm5ldyBQcm94eShELFZuKX1jbGFzcyBoaXtjb25zdHJ1Y3RvcihaKXt0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITA7bGV0e2dldDptZSxzZXQ6bGV9PVooKCk9Pm1uKHRoaXMpLCgpPT5Ccih0aGlzKSk7dGhpcy5fZ2V0PW1lLHRoaXMuX3NldD1sZX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fZ2V0KCl9c2V0IHZhbHVlKFope3RoaXMuX3NldChaKX19ZnVuY3Rpb24gbmEoRCl7cmV0dXJuIG5ldyBoaShEKX1mdW5jdGlvbiBTaShEKXtsZXQgWj1ULmlzQXJyYXkoRCk/bmV3IEFycmF5KEQubGVuZ3RoKTp7fTtmb3IobGV0IG1lIGluIEQpWlttZV09c28oRCxtZSk7cmV0dXJuIFp9Y2xhc3MgQ2l7Y29uc3RydWN0b3IoWixtZSxsZSl7dGhpcy5fb2JqZWN0PVosdGhpcy5fa2V5PW1lLHRoaXMuX2RlZmF1bHRWYWx1ZT1sZSx0aGlzLl9fdl9pc1JlZj0hMH1nZXQgdmFsdWUoKXtsZXQgWj10aGlzLl9vYmplY3RbdGhpcy5fa2V5XTtyZXR1cm4gWj09PXZvaWQgMD90aGlzLl9kZWZhdWx0VmFsdWU6Wn1zZXQgdmFsdWUoWil7dGhpcy5fb2JqZWN0W3RoaXMuX2tleV09Wn1nZXQgZGVwKCl7cmV0dXJuIFp0KGFuKHRoaXMuX29iamVjdCksdGhpcy5fa2V5KX19ZnVuY3Rpb24gc28oRCxaLG1lKXtsZXQgbGU9RFtaXTtyZXR1cm4gZnIobGUpP2xlOm5ldyBDaShELFosbWUpfXZhciB2YTtjbGFzcyBPaXtjb25zdHJ1Y3RvcihaLG1lLGxlLGhlKXt0aGlzLl9zZXR0ZXI9bWUsdGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwLHRoaXNbdmFdPSExLHRoaXMuX2RpcnR5PSEwLHRoaXMuZWZmZWN0PW5ldyBJcihaLCgpPT57dGhpcy5fZGlydHl8fCh0aGlzLl9kaXJ0eT0hMCxCcih0aGlzKSl9KSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzLHRoaXMuZWZmZWN0LmFjdGl2ZT10aGlzLl9jYWNoZWFibGU9IWhlLHRoaXMuX192X2lzUmVhZG9ubHk9bGV9Z2V0IHZhbHVlKCl7bGV0IFo9YW4odGhpcyk7cmV0dXJuIG1uKFopLChaLl9kaXJ0eXx8IVouX2NhY2hlYWJsZSkmJihaLl9kaXJ0eT0hMSxaLl92YWx1ZT1aLmVmZmVjdC5ydW4oKSksWi5fdmFsdWV9c2V0IHZhbHVlKFope3RoaXMuX3NldHRlcihaKX19dmE9Il9fdl9pc1JlYWRvbmx5IjtmdW5jdGlvbiBqaShELFosbWU9ITEpe2xldCBsZSxoZSxPdD1ULmlzRnVuY3Rpb24oRCk7cmV0dXJuIE90PyhsZT1ELGhlPVQuTk9PUCk6KGxlPUQuZ2V0LGhlPUQuc2V0KSxuZXcgT2kobGUsaGUsT3R8fCFoZSxtZSl9dmFyIGRyO2xldCBTcj1Qcm9taXNlLnJlc29sdmUoKSxsbz1bXSxNbz0hMSxDbz1EPT57bG8ucHVzaChEKSxNb3x8KE1vPSEwLFNyLnRoZW4oQWkpKX0sQWk9KCk9Pntmb3IobGV0IEQ9MDtEPGxvLmxlbmd0aDtEKyspbG9bRF0oKTtsby5sZW5ndGg9MCxNbz0hMX07Y2xhc3MgcGl7Y29uc3RydWN0b3IoWil7dGhpcy5kZXA9dm9pZCAwLHRoaXMuX2RpcnR5PSEwLHRoaXMuX192X2lzUmVmPSEwLHRoaXNbZHJdPSEwO2xldCBtZSxsZT0hMSxoZT0hMTt0aGlzLmVmZmVjdD1uZXcgSXIoWixPdD0+e2lmKHRoaXMuZGVwKXtpZihPdCltZT10aGlzLl92YWx1ZSxsZT0hMDtlbHNlIGlmKCFoZSl7bGV0IEs9bGU/bWU6dGhpcy5fdmFsdWU7aGU9ITAsbGU9ITEsQ28oKCk9Pnt0aGlzLmVmZmVjdC5hY3RpdmUmJnRoaXMuX2dldCgpIT09SyYmQnIodGhpcyksaGU9ITF9KX1mb3IobGV0IEsgb2YgdGhpcy5kZXApSy5jb21wdXRlZCBpbnN0YW5jZW9mIHBpJiZLLnNjaGVkdWxlcighMCl9dGhpcy5fZGlydHk9ITB9KSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzfV9nZXQoKXtyZXR1cm4gdGhpcy5fZGlydHk/KHRoaXMuX2RpcnR5PSExLHRoaXMuX3ZhbHVlPXRoaXMuZWZmZWN0LnJ1bigpKTp0aGlzLl92YWx1ZX1nZXQgdmFsdWUoKXtyZXR1cm4gbW4odGhpcyksYW4odGhpcykuX2dldCgpfX1kcj0iX192X2lzUmVhZG9ubHkiO2Z1bmN0aW9uIERvKEQpe3JldHVybiBuZXcgcGkoRCl9cmV0dXJuIGIuRWZmZWN0U2NvcGU9ZCxiLklURVJBVEVfS0VZPUt0LGIuUmVhY3RpdmVFZmZlY3Q9SXIsYi5jb21wdXRlZD1qaSxiLmN1c3RvbVJlZj1uYSxiLmRlZmVycmVkQ29tcHV0ZWQ9RG8sYi5lZmZlY3Q9cW4sYi5lZmZlY3RTY29wZT1tLGIuZW5hYmxlVHJhY2tpbmc9eG4sYi5nZXRDdXJyZW50U2NvcGU9V2UsYi5pc1Byb3h5PVFvLGIuaXNSZWFjdGl2ZT13byxiLmlzUmVhZG9ubHk9WnIsYi5pc1JlZj1mcixiLmlzU2hhbGxvdz1maSxiLm1hcmtSYXc9U28sYi5vblNjb3BlRGlzcG9zZT1QdCxiLnBhdXNlVHJhY2tpbmc9eW4sYi5wcm94eVJlZnM9WHIsYi5yZWFjdGl2ZT15byxiLnJlYWRvbmx5PXBhLGIucmVmPWVhLGIucmVzZXRUcmFja2luZz1QcixiLnNoYWxsb3dSZWFjdGl2ZT1FbyxiLnNoYWxsb3dSZWFkb25seT1YbyxiLnNoYWxsb3dSZWY9UGEsYi5zdG9wPWhuLGIudG9SYXc9YW4sYi50b1JlZj1zbyxiLnRvUmVmcz1TaSxiLnRyYWNrPUplLGIudHJpZ2dlcj1TdCxiLnRyaWdnZXJSZWY9Wm4sYi51bnJlZj1vcixPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYn0oe30sdik7cmV0dXJuIGx9ZnVuY3Rpb24gYXYodil7dmFyIGw9ZnVuY3Rpb24oYil7InVzZSBzdHJpY3QiO2xldCBUPWAKYCxrPTQ0LEM9NTAsZD01MCxtPVsiJSIsIiUiXSxSPSIjMDA3YWZmIixXZT0vXihbYS16LV0rOik/XC9cLy9pLFB0PS9eZGF0YTouKiwuKi8sZW49IldFQl9JTlZPS0VfQVBQU0VSVklDRSIsZ2U9Ind4czovLyIsTz0ianNvbjovLyIsTnQ9Ind4c01vZHVsZXMiLGpuPSJyZW5kZXJqc01vZHVsZXMiLF90PSJvblNob3ciLEo9Im9uSGlkZSIscmU9Im9uTGF1bmNoIixEbj0ib25FcnJvciIsZm49Im9uVGhlbWVDaGFuZ2UiLEt0PSJvZmZUaGVtZUNoYW5nZSIsY249Im9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLElyPSJvblBhZ2VOb3RGb3VuZCIsd2k9Im9uVW5oYW5kbGVkUmVqZWN0aW9uIixxbj0ib25Mb2FkIixobj0ib25SZWFkeSIsVnQ9Im9uVW5sb2FkIixObj0ib25Jbml0Iix5bj0ib25TYXZlRXhpdFN0YXRlIix4bj0ib25SZXNpemUiLFByPSJvbkJhY2tQcmVzcyIsSmU9Im9uUGFnZVNjcm9sbCIsZHQ9Im9uVGFiSXRlbVRhcCIsU3Q9Im9uUmVhY2hCb3R0b20iLHRuPSJvblB1bGxEb3duUmVmcmVzaCIsa249Im9uU2hhcmVUaW1lbGluZSIsWnQ9Im9uQWRkVG9GYXZvcml0ZXMiLExuPSJvblNoYXJlQXBwTWVzc2FnZSIsTnI9Im9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsVXI9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsRmk9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsbHI9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIixFcj0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLFZpPSJvbkFwcEVudGVyRm9yZWdyb3VuZCIsR289Im9uQXBwRW50ZXJCYWNrZ3JvdW5kIixZbz0ib25XeHNJbnZva2VDYWxsTWV0aG9kIjtmdW5jdGlvbiBrcihLKXtyZXR1cm4hIUsuYXBwQ29udGV4dH1mdW5jdGlvbiBScihLKXtyZXR1cm4gSyYmKGtyKEspP0sucHJveHk6Syl9ZnVuY3Rpb24geHIoSyl7cmV0dXJuIEsubm9kZVR5cGU9PT0xfWZ1bmN0aW9uIFVpKEssWT0hMSl7bGV0e3Zub2RlOmNlfT1LO2lmKHhyKGNlLmVsKSlyZXR1cm4gWT9jZS5lbD9bY2UuZWxdOltdOmNlLmVsO2xldHtzdWJUcmVlOnhlfT1LO2lmKHhlLnNoYXBlRmxhZyYxNil7bGV0IGx0PXhlLmNoaWxkcmVuLmZpbHRlcih6dD0+enQuZWwmJnhyKHp0LmVsKSk7aWYobHQubGVuZ3RoPjApcmV0dXJuIFk/bHQubWFwKHp0PT56dC5lbCk6bHRbMF0uZWx9cmV0dXJuIFk/Y2UuZWw/W2NlLmVsXTpbXTpjZS5lbH1sZXQgWXI9MDtmdW5jdGlvbiBUYShLLC4uLlkpe2xldCBjZT1EYXRlLm5vdygpLHhlPVlyP2NlLVlyOjA7cmV0dXJuIFlyPWNlLGBbJHtjZX1dWyR7eGV9bXNdWyR7S31dXHVGRjFBJHtZLm1hcChsdD0+SlNPTi5zdHJpbmdpZnkobHQpKS5qb2luKCIgIil9YH1mdW5jdGlvbiAkaShLKXtsZXQgWT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBjZT0+WVtjZV18fChZW2NlXT1LKGNlKSl9ZnVuY3Rpb24gbW8oSyl7cmV0dXJuICRpKEspfWZ1bmN0aW9uIElhKEs9IiIpe3JldHVybigiIitLKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGh9ZnVuY3Rpb24gbm8oSyl7cmV0dXJuIEsuaW5kZXhPZigiLyIpPT09MH1mdW5jdGlvbiBxbyhLKXtyZXR1cm4gbm8oSyk/SzoiLyIrS31mdW5jdGlvbiBzaShLKXtyZXR1cm4gbm8oSyk/Sy5zbGljZSgxKTpLfWxldCBQbj0oSyxZKT0+e2xldCBjZTtmb3IobGV0IHhlPTA7eGU8Sy5sZW5ndGg7eGUrKyljZT1LW3hlXShZKTtyZXR1cm4gY2V9O2Z1bmN0aW9uIGNyKEssWT1udWxsKXtsZXQgY2U7cmV0dXJuKC4uLnhlKT0+KEsmJihjZT1LLmFwcGx5KFkseGUpLEs9bnVsbCksY2UpfWZ1bmN0aW9uIGxpKEssWSl7Sz1LfHx7fSxiLmlzU3RyaW5nKFkpJiYoWT17ZXJyTXNnOll9KSwvOm9rJC8udGVzdChZLmVyck1zZyk/Yi5pc0Z1bmN0aW9uKEsuc3VjY2VzcykmJksuc3VjY2VzcyhZKTpiLmlzRnVuY3Rpb24oSy5mYWlsKSYmSy5mYWlsKFkpLGIuaXNGdW5jdGlvbihLLmNvbXBsZXRlKSYmSy5jb21wbGV0ZShZKX1mdW5jdGlvbiBKbihLKXtsZXQgWT17fTtyZXR1cm4gYi5pc1BsYWluT2JqZWN0KEspJiZPYmplY3Qua2V5cyhLKS5zb3J0KCkuZm9yRWFjaChjZT0+e2xldCB4ZT1jZTtZW3hlXT1LW3hlXX0pLE9iamVjdC5rZXlzKFkpP1k6S31sZXQgSm89ZW5jb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIHhvKEssWT1Kbyl7bGV0IGNlPUs/T2JqZWN0LmtleXMoSykubWFwKHhlPT57bGV0IGx0PUtbeGVdO3JldHVybiB0eXBlb2YgbHQ9PT12b2lkIDB8fGx0PT09bnVsbD9sdD0iIjpiLmlzUGxhaW5PYmplY3QobHQpJiYobHQ9SlNPTi5zdHJpbmdpZnkobHQpKSxZKHhlKSsiPSIrWShsdCl9KS5maWx0ZXIoeGU9PnhlLmxlbmd0aD4wKS5qb2luKCImIik6bnVsbDtyZXR1cm4gY2U/YD8ke2NlfWA6IiJ9ZnVuY3Rpb24gcm8oSyl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoIiIrSyl9Y2F0Y2goWSl7fXJldHVybiIiK0t9bGV0IGlvPS9cKy9nO2Z1bmN0aW9uIHFyKEspe2xldCBZPXt9O2lmKEs9PT0iInx8Sz09PSI/IilyZXR1cm4gWTtsZXQgeGU9KEtbMF09PT0iPyI/Sy5zbGljZSgxKTpLKS5zcGxpdCgiJiIpO2ZvcihsZXQgbHQ9MDtsdDx4ZS5sZW5ndGg7KytsdCl7bGV0IHp0PXhlW2x0XS5yZXBsYWNlKGlvLCIgIiksQW49enQuaW5kZXhPZigiPSIpLFhuPXJvKEFuPDA/enQ6enQuc2xpY2UoMCxBbikpLFFyPUFuPDA/bnVsbDpybyh6dC5zbGljZShBbisxKSk7aWYoWG4gaW4gWSl7bGV0IE1yPVlbWG5dO2IuaXNBcnJheShNcil8fChNcj1ZW1huXT1bTXJdKSxNci5wdXNoKFFyKX1lbHNlIFlbWG5dPVFyfXJldHVybiBZfWZ1bmN0aW9uIG9vKEspe2xldFtZLGNlXT1LLnNwbGl0KCI/IiwyKTtyZXR1cm57cGF0aDpZLHF1ZXJ5OnFyKGNlfHwiIil9fWZ1bmN0aW9uIEZuKEspe2xldCBZPXt9O3JldHVybiBLJiZPYmplY3Qua2V5cyhLKS5mb3JFYWNoKGNlPT57Y2UuaW5kZXhPZigiZGF0YS0iKT09PTAmJihZW2NlLnJlcGxhY2UoImRhdGEtIiwiIildPUtbY2VdKX0pLFl9Y2xhc3Mgd3IgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihZKXtzdXBlcihZKTt0aGlzLm5hbWU9IkRPTUV4Y2VwdGlvbiJ9fWZ1bmN0aW9uIGNpKEssWSl7cmV0dXJuIFkmJihZLmNhcHR1cmUmJihLKz0iQ2FwdHVyZSIpLFkub25jZSYmKEsrPSJPbmNlIiksWS5wYXNzaXZlJiYoSys9IlBhc3NpdmUiKSksYG9uJHtiLmNhcGl0YWxpemUoYi5jYW1lbGl6ZShLKSl9YH1jbGFzcyBLb3tjb25zdHJ1Y3RvcihZLGNlKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKSx0aGlzLl9zdG9wPSExLHRoaXMuX2VuZD0hMSx0aGlzLnR5cGU9WSx0aGlzLmJ1YmJsZXM9ISFjZS5idWJibGVzLHRoaXMuY2FuY2VsYWJsZT0hIWNlLmNhbmNlbGFibGV9cHJldmVudERlZmF1bHQoKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl7dGhpcy5fZW5kPXRoaXMuX3N0b3A9ITB9c3RvcFByb3BhZ2F0aW9uKCl7dGhpcy5fc3RvcD0hMH19ZnVuY3Rpb24gX28oSyl7aWYoSyBpbnN0YW5jZW9mIEtvKXJldHVybiBLO2xldFtZXT1PbihLLnR5cGUpLGNlPW5ldyBLbyhZLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTtyZXR1cm4gYi5leHRlbmQoY2UsSyksY2V9Y2xhc3MgWm97Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1PYmplY3QuY3JlYXRlKG51bGwpfWRpc3BhdGNoRXZlbnQoWSl7bGV0IGNlPXRoaXMubGlzdGVuZXJzW1kudHlwZV07aWYoIWNlKXJldHVybiExO2xldCB4ZT1fbyhZKSxsdD1jZS5sZW5ndGg7Zm9yKGxldCB6dD0wO3p0PGx0JiYoY2VbenRdLmNhbGwodGhpcyx4ZSksIXhlLl9lbmQpO3p0KyspO3JldHVybiB4ZS5jYW5jZWxhYmxlJiZ4ZS5kZWZhdWx0UHJldmVudGVkfWFkZEV2ZW50TGlzdGVuZXIoWSxjZSx4ZSl7WT1jaShZLHhlKSwodGhpcy5saXN0ZW5lcnNbWV18fCh0aGlzLmxpc3RlbmVyc1tZXT1bXSkpLnB1c2goY2UpfXJlbW92ZUV2ZW50TGlzdGVuZXIoWSxjZSx4ZSl7WT1jaShZLHhlKTtsZXQgbHQ9dGhpcy5saXN0ZW5lcnNbWV07aWYoIWx0KXJldHVybjtsZXQgenQ9bHQuaW5kZXhPZihjZSk7enQ+LTEmJmx0LnNwbGljZSh6dCwxKX19bGV0IEpyPS8oPzpPbmNlfFBhc3NpdmV8Q2FwdHVyZSkkLztmdW5jdGlvbiBPbihLKXtsZXQgWTtpZihKci50ZXN0KEspKXtZPXt9O2xldCBjZTtmb3IoO2NlPUsubWF0Y2goSnIpOylLPUsuc2xpY2UoMCxLLmxlbmd0aC1jZVswXS5sZW5ndGgpLFlbY2VbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW2IuaHlwaGVuYXRlKEsuc2xpY2UoMikpLFldfWxldCBFbj0oKCk9Pih7c3RvcDoxLHByZXZlbnQ6MTw8MSxzZWxmOjE8PDJ9KSkoKTtmdW5jdGlvbiB1aShLKXtsZXQgWT0wO3JldHVybiBLLmluY2x1ZGVzKCJzdG9wIikmJihZfD1Fbi5zdG9wKSxLLmluY2x1ZGVzKCJwcmV2ZW50IikmJihZfD1Fbi5wcmV2ZW50KSxLLmluY2x1ZGVzKCJzZWxmIikmJihZfD1Fbi5zZWxmKSxZfWxldCBCbz0wLFlhPTEsS249MyxLcj04O2Z1bmN0aW9uIHVyKEssWSl7bGV0e3BhcmVudE5vZGU6Y2V9PUs7aWYoIWNlKXJldHVybiBudWxsO2xldHtjaGlsZE5vZGVzOnhlfT1jZTtyZXR1cm4geGVbeGUuaW5kZXhPZihLKSsoWT09PSJuIj8xOi0xKV18fG51bGx9ZnVuY3Rpb24gRHQoSyl7bGV0e3BhcmVudE5vZGU6WX09SztpZihZKXtsZXR7Y2hpbGROb2RlczpjZX09WSx4ZT1jZS5pbmRleE9mKEspO3hlPi0xJiYoSy5wYXJlbnROb2RlPW51bGwsY2Uuc3BsaWNlKHhlLDEpKX19ZnVuY3Rpb24ga2UoSyl7IUsubm9kZUlkJiZLLnBhZ2VOb2RlJiYoSy5ub2RlSWQ9Sy5wYWdlTm9kZS5nZW5JZCgpKX1jbGFzcyBibyBleHRlbmRzIFpve2NvbnN0cnVjdG9yKFksY2UseGUpe3N1cGVyKCk7aWYodGhpcy5wYWdlTm9kZT1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuX3RleHQ9bnVsbCx4ZSl7bGV0e3BhZ2VOb2RlOmx0fT14ZTtsdCYmKHRoaXMucGFnZU5vZGU9bHQsdGhpcy5ub2RlSWQ9bHQuZ2VuSWQoKSwhbHQuaXNVbm1vdW50ZWQmJmx0Lm9uQ3JlYXRlKHRoaXMsY2UpKX10aGlzLm5vZGVUeXBlPVksdGhpcy5ub2RlTmFtZT1jZSx0aGlzLmNoaWxkTm9kZXM9W119Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdfHxudWxsfWdldCBsYXN0Q2hpbGQoKXtsZXR7Y2hpbGROb2RlczpZfT10aGlzLGNlPVkubGVuZ3RoO3JldHVybiBjZT9ZW2NlLTFdOm51bGx9Z2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIHVyKHRoaXMsIm4iKX1nZXQgbm9kZVZhbHVlKCl7cmV0dXJuIG51bGx9c2V0IG5vZGVWYWx1ZShZKXt9Z2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuX3RleHR8fCIifXNldCB0ZXh0Q29udGVudChZKXt0aGlzLl90ZXh0PVksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25UZXh0Q29udGVudCh0aGlzLFkpfWdldCBwYXJlbnRFbGVtZW50KCl7bGV0e3BhcmVudE5vZGU6WX09dGhpcztyZXR1cm4gWSYmWS5ub2RlVHlwZT09PVlhP1k6bnVsbH1nZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHVyKHRoaXMsInAiKX1hcHBlbmRDaGlsZChZKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoWSxudWxsKX1jbG9uZU5vZGUoWSl7bGV0IGNlPWIuZXh0ZW5kKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSx0aGlzKSx7YXR0cmlidXRlczp4ZX09Y2U7cmV0dXJuIHhlJiYoY2UuYXR0cmlidXRlcz1iLmV4dGVuZCh7fSx4ZSkpLFkmJihjZS5jaGlsZE5vZGVzPWNlLmNoaWxkTm9kZXMubWFwKGx0PT5sdC5jbG9uZU5vZGUoITApKSksY2V9aW5zZXJ0QmVmb3JlKFksY2Upe0R0KFkpLFkucGFnZU5vZGU9dGhpcy5wYWdlTm9kZSxZLnBhcmVudE5vZGU9dGhpcyxrZShZKTtsZXR7Y2hpbGROb2Rlczp4ZX09dGhpcztpZihjZSl7bGV0IGx0PXhlLmluZGV4T2YoY2UpO2lmKGx0PT09LTEpdGhyb3cgbmV3IHdyKCJGYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSc6IFRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO3hlLnNwbGljZShsdCwwLFkpfWVsc2UgeGUucHVzaChZKTtyZXR1cm4gdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vbkluc2VydEJlZm9yZSh0aGlzLFksY2UpOll9cmVtb3ZlQ2hpbGQoWSl7bGV0e2NoaWxkTm9kZXM6Y2V9PXRoaXMseGU9Y2UuaW5kZXhPZihZKTtpZih4ZT09PS0xKXRocm93IG5ldyB3cigiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlbW92ZUNoaWxkJyBvbiAnTm9kZSc6IFRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO3JldHVybiBZLnBhcmVudE5vZGU9bnVsbCxjZS5zcGxpY2UoeGUsMSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vblJlbW92ZUNoaWxkKFkpOll9fWxldCB5bz0iY2xhc3MiLEVvPSJzdHlsZSIscGE9Ii52T3duZXJJZCIsWG89Ii52UmVuZGVyanMiO2NsYXNzIEhpIGV4dGVuZHMgYm97Y29uc3RydWN0b3IoWSxjZSx4ZSl7c3VwZXIoWSxjZSx4ZSk7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHlsZT1udWxsLHRoaXMudlNob3c9bnVsbCx0aGlzLl9odG1sPW51bGx9Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbeW9dfHwiIn1zZXQgY2xhc3NOYW1lKFkpe3RoaXMuc2V0QXR0cmlidXRlKHlvLFkpfWdldCBpbm5lckhUTUwoKXtyZXR1cm4iIn1zZXQgaW5uZXJIVE1MKFkpe3RoaXMuX2h0bWw9WX1hZGRFdmVudExpc3RlbmVyKFksY2UseGUpe3N1cGVyLmFkZEV2ZW50TGlzdGVuZXIoWSxjZSx4ZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJihjZS53eHNFdmVudD90aGlzLnBhZ2VOb2RlLm9uQWRkV3hzRXZlbnQodGhpcyxjaShZLHhlKSxjZS53eHNFdmVudCx1aShjZS5tb2RpZmllcnN8fFtdKSk6dGhpcy5wYWdlTm9kZS5vbkFkZEV2ZW50KHRoaXMsY2koWSx4ZSksdWkoY2UubW9kaWZpZXJzfHxbXSkpKX1yZW1vdmVFdmVudExpc3RlbmVyKFksY2UseGUpe3N1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxjZSx4ZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVFdmVudCh0aGlzLGNpKFkseGUpKX1nZXRBdHRyaWJ1dGUoWSl7cmV0dXJuIFk9PT1Fbz90aGlzLnN0eWxlOnRoaXMuYXR0cmlidXRlc1tZXX1yZW1vdmVBdHRyaWJ1dGUoWSl7WT09RW8/dGhpcy5zdHlsZT1udWxsOmRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbWV0sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVBdHRyaWJ1dGUodGhpcyxZKX1zZXRBdHRyaWJ1dGUoWSxjZSl7WT09PUVvP3RoaXMuc3R5bGU9Y2U6dGhpcy5hdHRyaWJ1dGVzW1ldPWNlLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uU2V0QXR0cmlidXRlKHRoaXMsWSxjZSl9dG9KU09OKHthdHRyOlksbm9ybWFsaXplOmNlfT17fSl7bGV0e2F0dHJpYnV0ZXM6eGUsc3R5bGU6bHQsbGlzdGVuZXJzOnp0LF90ZXh0OkFufT10aGlzLFhuPXt9O09iamVjdC5rZXlzKHhlKS5sZW5ndGgmJihYbi5hPWNlP2NlKHhlKTp4ZSk7bGV0IFFyPU9iamVjdC5rZXlzKHp0KTtpZihRci5sZW5ndGgpe2xldCBNcixjbz17fTtRci5mb3JFYWNoKGdyPT57bGV0IGdpPXp0W2dyXTtpZihnaS5sZW5ndGgpe2xldHt3eHNFdmVudDp1byxtb2RpZmllcnM6Zm99PWdpWzBdLHJhPXVpKGZvfHxbXSk7dW8/KE1yfHwoTXI9e30pLE1yW2dyXT1bY2U/Y2UodW8pOnVvLHJhXSk6Y29bZ3JdPXJhfX0pLFhuLmU9Y2U/Y2UoY28sITEpOmNvLE1yJiYoWG4udz1jZT9jZShNciwhMSk6TXIpfXJldHVybiBsdCE9PW51bGwmJihYbi5zPWNlP2NlKGx0KTpsdCksWXx8KFhuLmk9dGhpcy5ub2RlSWQsWG4ubj10aGlzLm5vZGVOYW1lKSxBbiE9PW51bGwmJihYbi50PWNlP2NlKEFuKTpBbiksWG59fWNsYXNzIHdvIGV4dGVuZHMgYm97Y29uc3RydWN0b3IoWSxjZSl7c3VwZXIoS3IsIiNjb21tZW50IixjZSk7dGhpcy5fdGV4dD0iIn10b0pTT04oWT17fSl7cmV0dXJuIFkuYXR0cj97fTp7aTp0aGlzLm5vZGVJZH19fWNsYXNzIFpyIGV4dGVuZHMgSGl7Y29uc3RydWN0b3IoWSxjZSl7c3VwZXIoWWEsWS50b1VwcGVyQ2FzZSgpLGNlKTt0aGlzLnRhZ05hbWU9dGhpcy5ub2RlTmFtZX19Y2xhc3MgZmkgZXh0ZW5kcyBacntnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInZhbHVlIil9c2V0IHZhbHVlKFkpe3RoaXMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsWSl9fWNsYXNzIFFvIGV4dGVuZHMgZml7fWNsYXNzIGFuIGV4dGVuZHMgSGl7Y29uc3RydWN0b3IoWSxjZSl7c3VwZXIoS24sIiN0ZXh0IixjZSk7dGhpcy5fdGV4dD1ZfWdldCBub2RlVmFsdWUoKXtyZXR1cm4gdGhpcy5fdGV4dHx8IiJ9c2V0IG5vZGVWYWx1ZShZKXt0aGlzLl90ZXh0PVksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25Ob2RlVmFsdWUodGhpcyxZKX19bGV0IFNvPXtBRDpbImRhdGEiXSwiQUQtRFJBVyI6WyJkYXRhIl0sIkxJVkUtUExBWUVSIjpbInBpY3R1cmUtaW4tcGljdHVyZS1tb2RlIl0sTUFQOlsibWFya2VycyIsInBvbHlsaW5lIiwiY2lyY2xlcyIsImNvbnRyb2xzIiwiaW5jbHVkZS1wb2ludHMiLCJwb2x5Z29ucyJdLFBJQ0tFUjpbInJhbmdlIiwidmFsdWUiXSwiUElDS0VSLVZJRVciOlsidmFsdWUiXSwiUklDSC1URVhUIjpbIm5vZGVzIl0sVklERU86WyJkYW5tdS1saXN0IiwiaGVhZGVyIl0sIldFQi1WSUVXIjpbIndlYnZpZXctc3R5bGVzIl19LGRpPVsiYW5pbWF0aW9uIl0sZ2E9KEssWSk9PntpZihkaS5pbmRleE9mKFkpPi0xKXJldHVybiEwO2xldCBjZT1Tb1tLLm5vZGVOYW1lXTtyZXR1cm4hIShjZSYmY2UuaW5kZXhPZihZKT4tMSl9LG1uPTEsQnI9Mixmcj0zLGVhPTQsUGE9NSx0YT02LGFvPTcsWm49OCxvcj05LFZuPTEwLFhyPTEyLGhpPTE1LG5hPTIwO2Z1bmN0aW9uIFNpKEssWSx7Y2xlYXJUaW1lb3V0OmNlLHNldFRpbWVvdXQ6eGV9KXtsZXQgbHQsenQ9ZnVuY3Rpb24oKXtjZShsdCksbHQ9eGUoKCk9PksuYXBwbHkodGhpcyxhcmd1bWVudHMpLFkpfTtyZXR1cm4genQuY2FuY2VsPWZ1bmN0aW9uKCl7Y2UobHQpfSx6dH1jbGFzcyBDaXtjb25zdHJ1Y3RvcihZLGNlKXt0aGlzLmlkPVksdGhpcy5saXN0ZW5lcj17fSx0aGlzLmVtaXRDYWNoZT1bXSxjZSYmT2JqZWN0LmtleXMoY2UpLmZvckVhY2goeGU9Pnt0aGlzLm9uKHhlLGNlW3hlXSl9KX1lbWl0KFksLi4uY2Upe2xldCB4ZT10aGlzLmxpc3RlbmVyW1ldO2lmKCF4ZSlyZXR1cm4gdGhpcy5lbWl0Q2FjaGUucHVzaCh7ZXZlbnROYW1lOlksYXJnczpjZX0pO3hlLmZvckVhY2gobHQ9PntsdC5mbi5hcHBseShsdC5mbixjZSl9KSx0aGlzLmxpc3RlbmVyW1ldPXhlLmZpbHRlcihsdD0+bHQudHlwZSE9PSJvbmNlIil9b24oWSxjZSl7dGhpcy5fYWRkTGlzdGVuZXIoWSwib24iLGNlKSx0aGlzLl9jbGVhckNhY2hlKFkpfW9uY2UoWSxjZSl7dGhpcy5fYWRkTGlzdGVuZXIoWSwib25jZSIsY2UpLHRoaXMuX2NsZWFyQ2FjaGUoWSl9b2ZmKFksY2Upe2xldCB4ZT10aGlzLmxpc3RlbmVyW1ldO2lmKCEheGUpaWYoY2UpZm9yKGxldCBsdD0wO2x0PHhlLmxlbmd0aDspeGVbbHRdLmZuPT09Y2UmJih4ZS5zcGxpY2UobHQsMSksbHQtLSksbHQrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW1ldfV9jbGVhckNhY2hlKFkpe2ZvcihsZXQgY2U9MDtjZTx0aGlzLmVtaXRDYWNoZS5sZW5ndGg7Y2UrKyl7bGV0IHhlPXRoaXMuZW1pdENhY2hlW2NlXSxsdD1ZP3hlLmV2ZW50TmFtZT09PVk/WTpudWxsOnhlLmV2ZW50TmFtZTtpZighbHQpY29udGludWU7aWYodHlwZW9mIHRoaXMuZW1pdC5hcHBseSh0aGlzLFtsdCwuLi54ZS5hcmdzXSk9PSJudW1iZXIiKXt0aGlzLmVtaXRDYWNoZS5wb3AoKTtjb250aW51ZX10aGlzLmVtaXRDYWNoZS5zcGxpY2UoY2UsMSksY2UtLX19X2FkZExpc3RlbmVyKFksY2UseGUpeyh0aGlzLmxpc3RlbmVyW1ldfHwodGhpcy5saXN0ZW5lcltZXT1bXSkpLnB1c2goe2ZuOnhlLHR5cGU6Y2V9KX19bGV0IHNvPVtObixxbixfdCxKLFZ0LFByLEplLGR0LFN0LHRuLGtuLExuLFp0LHluLE5yLFVyLEZpLGxyLEVyXSx2YT1bcW4sX3RdO2Z1bmN0aW9uIE9pKEspe3JldHVybiB2YS5pbmRleE9mKEspPi0xfWZ1bmN0aW9uIGppKEspe3JldHVybiBzby5pbmRleE9mKEspPi0xfWxldCBkcj1bX3QsSixyZSxEbixmbixJcix3aSxObixxbixobixWdCx4bixQcixKZSxkdCxTdCx0bixrbixadCxMbix5bixOcixVcixGaSxscixFcl07ZnVuY3Rpb24gU3IoSyxZLGNlPSEwKXtyZXR1cm4gY2UmJiFiLmlzRnVuY3Rpb24oWSk/ITE6ZHIuaW5kZXhPZihLKT4tMT8hMDpLLmluZGV4T2YoIm9uIik9PT0wfWxldCBsbyxNbz1bXTtmdW5jdGlvbiBDbyhLKXtpZihsbylyZXR1cm4gSyhsbyk7TW8ucHVzaChLKX1mdW5jdGlvbiBBaShLKXtsbz1LLE1vLmZvckVhY2goWT0+WShLKSl9bGV0IHBpPWNyKChLLFkpPT57aWYoYi5pc0Z1bmN0aW9uKEsuX2NvbXBvbmVudC5vbkVycm9yKSlyZXR1cm4gWShLKX0pLERvPWZ1bmN0aW9uKCl7fTtEby5wcm90b3R5cGU9e29uOmZ1bmN0aW9uKEssWSxjZSl7dmFyIHhlPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKHhlW0tdfHwoeGVbS109W10pKS5wdXNoKHtmbjpZLGN0eDpjZX0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24oSyxZLGNlKXt2YXIgeGU9dGhpcztmdW5jdGlvbiBsdCgpe3hlLm9mZihLLGx0KSxZLmFwcGx5KGNlLGFyZ3VtZW50cyl9cmV0dXJuIGx0Ll89WSx0aGlzLm9uKEssbHQsY2UpfSxlbWl0OmZ1bmN0aW9uKEspe3ZhciBZPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGNlPSgodGhpcy5lfHwodGhpcy5lPXt9KSlbS118fFtdKS5zbGljZSgpLHhlPTAsbHQ9Y2UubGVuZ3RoO2Zvcih4ZTt4ZTxsdDt4ZSsrKWNlW3hlXS5mbi5hcHBseShjZVt4ZV0uY3R4LFkpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oSyxZKXt2YXIgY2U9dGhpcy5lfHwodGhpcy5lPXt9KSx4ZT1jZVtLXSxsdD1bXTtpZih4ZSYmWSlmb3IodmFyIHp0PTAsQW49eGUubGVuZ3RoO3p0PEFuO3p0KyspeGVbenRdLmZuIT09WSYmeGVbenRdLmZuLl8hPT1ZJiZsdC5wdXNoKHhlW3p0XSk7cmV0dXJuIGx0Lmxlbmd0aD9jZVtLXT1sdDpkZWxldGUgY2VbS10sdGhpc319O3ZhciBEPURvO2xldCBaPXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn07ZnVuY3Rpb24gbWUoSyl7cmV0dXJuIEsmJksgaW4gWj9aW0tdOkt9ZnVuY3Rpb24gbGUoSyl7cmV0dXJuIEs9PT0iYmxhY2siPyIjMDAwMDAwIjoiI2ZmZmZmZiJ9ZnVuY3Rpb24gaGUoSyxZPXt9LGNlPSJsaWdodCIpe2xldCB4ZT1ZW2NlXSxsdD17fTtyZXR1cm4geGU/KE9iamVjdC5rZXlzKEspLmZvckVhY2goenQ9PntsZXQgQW49S1t6dF07bHRbenRdPSgoKT0+e2lmKGIuaXNQbGFpbk9iamVjdChBbikpcmV0dXJuIGhlKEFuLFksY2UpO2lmKGIuaXNBcnJheShBbikpcmV0dXJuIEFuLm1hcChYbj0+Yi5pc1BsYWluT2JqZWN0KFhuKT9oZShYbixZLGNlKTpYbik7aWYoYi5pc1N0cmluZyhBbikmJkFuLnN0YXJ0c1dpdGgoIkAiKSl7bGV0IFhuPUFuLnJlcGxhY2UoIkAiLCIiKSxRcj14ZVtYbl18fEFuO3N3aXRjaCh6dCl7Y2FzZSJ0aXRsZUNvbG9yIjpRcj1sZShRcik7YnJlYWs7Y2FzZSJib3JkZXJTdHlsZSI6UXI9bWUoUXIpO2JyZWFrfXJldHVybiBRcn1yZXR1cm4gQW59KSgpfSksbHQpOkt9dmFyIE90PXtpbnZva2VBcnJheUZuczpQbixpc1VuaUxpZmVjeWNsZUhvb2s6U3IsT05fTE9BRDpxbixPTl9TSE9XOl90LExJTkVGRUVEOlQsUkVOREVSSlNfTU9EVUxFUzpqbixmb3JtYXRMb2c6VGEsV1hTX1BST1RPQ09MOmdlLFdYU19NT0RVTEVTOk50LFVuaUxpZmVjeWNsZUhvb2tzOmRyLE9OX0VSUk9SOkRuLGludm9rZUNyZWF0ZUVycm9ySGFuZGxlcjpwaSxpbnZva2VDcmVhdGVWdWVBcHBIb29rOkFpLHBhcnNlTlZ1ZURhdGFzZXQ6Rm4sb25jZTpjcixJMThOX0pTT05fREVMSU1JVEVSUzptLEVtaXR0ZXI6RCxub3JtYWxpemVTdHlsZXM6aGUsYWRkTGVhZGluZ1NsYXNoOnFvLHJlc29sdmVDb21wb25lbnRJbnN0YW5jZTpScixyZW1vdmVMZWFkaW5nU2xhc2g6c2ksT05fUkVTSVpFOnhuLE9OX0FQUF9FTlRFUl9GT1JFR1JPVU5EOlZpLE9OX0FQUF9FTlRFUl9CQUNLR1JPVU5EOkdvLE9OX0hJREU6SixPTl9QQUdFX1NDUk9MTDpKZSxPTl9SRUFDSF9CT1RUT006U3QsU0NIRU1FX1JFOldlLERBVEFfUkU6UHQsY2FjaGVTdHJpbmdGdW5jdGlvbjptbyxwYXJzZVF1ZXJ5OnFyLGNhbGxPcHRpb25zOmxpLE9OX1VOSEFORExFX1JFSkVDVElPTjp3aSxPTl9QQUdFX05PVF9GT1VORDpJcixQUklNQVJZX0NPTE9SOlIsZ2V0TGVuOklhLE9OX1RIRU1FX0NIQU5HRTpmbixUQUJCQVJfSEVJR0hUOkMsTkFWQkFSX0hFSUdIVDprLHNvcnRPYmplY3Q6Sm4sT0ZGX1RIRU1FX0NIQU5HRTpLdCxPTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFOmNuLG5vcm1hbGl6ZVRhYkJhclN0eWxlczptZSxPTl9OQVZJR0FUSU9OX0JBUl9CVVRUT05fVEFQOk5yLHN0cmluZ2lmeVF1ZXJ5OnhvLGRlYm91bmNlOlNpLE9OX1BVTExfRE9XTl9SRUZSRVNIOnRuLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DSEFOR0VEOkZpLE9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DT05GSVJNRUQ6bHIsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NMSUNLRUQ6VXIsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0ZPQ1VTX0NIQU5HRUQ6RXIsT05fQkFDS19QUkVTUzpQcixVbmlOb2RlOmJvLE5PREVfVFlQRV9QQUdFOkJvLEFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFOm1uLEFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFRDpCcixBQ1RJT05fVFlQRV9QQUdFX1NDUk9MTDpoaSxBQ1RJT05fVFlQRV9JTlNFUlQ6ZWEsQUNUSU9OX1RZUEVfQ1JFQVRFOmZyLEFDVElPTl9UWVBFX1JFTU9WRTpQYSxBQ1RJT05fVFlQRV9BRERfRVZFTlQ6Wm4sQUNUSU9OX1RZUEVfQUREX1dYU19FVkVOVDpYcixBQ1RJT05fVFlQRV9SRU1PVkVfRVZFTlQ6b3IsQUNUSU9OX1RZUEVfU0VUX0FUVFJJQlVURTp0YSxBQ1RJT05fVFlQRV9SRU1PVkVfQVRUUklCVVRFOmFvLEFDVElPTl9UWVBFX1NFVF9URVhUOlZuLE9OX1JFQURZOmhuLE9OX1VOTE9BRDpWdCxFdmVudENoYW5uZWw6Q2ksT05fUkVBQ0hfQk9UVE9NX0RJU1RBTkNFOmQscGFyc2VVcmw6b28sb25DcmVhdGVWdWVBcHA6Q28sT05fVEFCX0lURU1fVEFQOmR0LE9OX0xBVU5DSDpyZSxBQ1RJT05fVFlQRV9FVkVOVDpuYSxjcmVhdGVVbmlFdmVudDpfbyxPTl9XWFNfSU5WT0tFX0NBTExfTUVUSE9EOllvLFdFQl9JTlZPS0VfQVBQU0VSVklDRTplbixpc1Jvb3RIb29rOmppLGlzUm9vdEltbWVkaWF0ZUhvb2s6T2ksVW5pSW5wdXRFbGVtZW50OmZpLFVuaVRleHRBcmVhRWxlbWVudDpRbyxVbmlFbGVtZW50OlpyLFVuaVRleHROb2RlOmFuLFVuaUNvbW1lbnROb2RlOndvLGZvcmNlUGF0Y2hQcm9wOmdhLEpTT05fUFJPVE9DT0w6TyxyZXNvbHZlT3duZXJFbDpVaSxBVFRSX1ZfT1dORVJfSUQ6cGEsQVRUUl9WX1JFTkRFUkpTOlhvfTtyZXR1cm4gT3R9KHYpO3JldHVybiBsfXZhciByTj0xO2Z1bmN0aW9uIHN2KCl7cmV0dXJuKHJOKyspLnRvU3RyaW5nKCl9dmFyIHVkPXY9PnYmJkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodikpfHx2O2Z1bmN0aW9uIFN1KHYpe2xldCBsPUxzKHYpO3JldHVybiBsLnN1YnN0cmluZyg4LGwubGVuZ3RoLTEpfWZ1bmN0aW9uIGZkKHYpe2lmKCFIbihidG9hKSlyZXR1cm4iIjtsZXQgbD1BcnJheS5wcm90b3R5cGUubWFwLmNhbGwobmV3IFVpbnQ4QXJyYXkodiksYj0+U3RyaW5nLmZyb21DaGFyQ29kZShiKSkuam9pbigiIik7cmV0dXJuIGJ0b2EobCl9ZnVuY3Rpb24gQ3Uodil7aWYoIXZ8fHR5cGVvZiB2IT0ib2JqZWN0IilyZXR1cm4hMDtmb3IobGV0IGwgaW4gdilpZihYbCh2LGwpKXJldHVybiExO3JldHVybiEwfXZhciBjZj1bIm9mZiIsImVycm9yIiwid2FybiIsImluZm8iLCJsb2ciLCJkZWJ1ZyJdLHVmPXt9O2Z1bmN0aW9uIGx2KCl7Y2YuZm9yRWFjaCh2PT57bGV0IGw9Y2YuaW5kZXhPZih2KTt1Zlt2XT17fSxjZi5mb3JFYWNoKGI9PntjZi5pbmRleE9mKGIpPD1sJiYodWZbdl1bYl09ITApfSl9KX1mdW5jdGlvbiBpcih2KXtsZXQgbD1nbG9iYWwuV1hFbnZpcm9ubWVudCYmZ2xvYmFsLldYRW52aXJvbm1lbnQubG9nTGV2ZWx8fCJsb2ciO3JldHVybiB1ZltsXSYmdWZbbF1bdl19ZnVuY3Rpb24gdm8odil7Z2xvYmFsLm5hdGl2ZUxvZygid3hJbnRlcmFjdGlvbkFuYWx5emVyOiBbanNmbV0iK3YsIl9fREVCVUciKX1mdW5jdGlvbiBjdih2LGwsYil7cmV0dXJuYCR7bH1AJHtifSMke3Z9YH12YXIgZmY9Y2xhc3N7Y29uc3RydWN0b3IobCl7dGhpcy5pbnN0YW5jZUlkPVN0cmluZyhsKSx0aGlzLmxhc3RDYWxsYmFja0lkPTAsdGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX1hZGQobCl7cmV0dXJuIHRoaXMubGFzdENhbGxiYWNrSWQrKyx0aGlzLmNhbGxiYWNrc1t0aGlzLmxhc3RDYWxsYmFja0lkXT1sLHRoaXMubGFzdENhbGxiYWNrSWR9cmVtb3ZlKGwpe2xldCBiPXRoaXMuY2FsbGJhY2tzW2xdO3JldHVybiBkZWxldGUgdGhpcy5jYWxsYmFja3NbbF0sYn1yZWdpc3Rlckhvb2sobCxiLFQsayl7bGV0IEM9Y3YobCxiLFQpO3RoaXMuaG9va3NbQ10mJmNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIiR7Q30iLmApLHRoaXMuaG9va3NbQ109a310cmlnZ2VySG9vayhsLGIsVCxrKXtsZXQgQz1jdihsLGIsVCksZD10aGlzLmhvb2tzW0NdO2lmKCFIbihkKSlyZXR1cm4gY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gSW52YWxpZCBob29rIGZ1bmN0aW9uIHR5cGUgKCR7dHlwZW9mIGR9KSBvbiAiJHtDfSIuYCksbnVsbDtsZXQgbT1udWxsO3RyeXttPWQuYXBwbHkobnVsbCxrfHxbXSl9Y2F0Y2goUil7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGhvb2sgZnVuY3Rpb24gb24gIiR7Q30iLmApLFJ9cmV0dXJuIG19Y29uc3VtZShsLGIsVCl7bGV0IGs9dGhpcy5jYWxsYmFja3NbbF07aWYoKHR5cGVvZiBUPT0idW5kZWZpbmVkInx8VD09PSExKSYmZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2xdLEhuKGspKXRyeXtyZXR1cm4gay5jYWxsKG51bGwsYixUKX1jYXRjaChDKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb246CiAke0MudG9TdHJpbmcoKX1gKSxDfXJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgY2FsbGJhY2sgaWQgIiR7bH0iYCl9Y2xvc2UoKXt0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmhvb2tzPXt9fX07dmFyIGRmPXt9O2Z1bmN0aW9uIHV2KHYsbCl7diYmKGRmW3ZdPWwpfWZ1bmN0aW9uIHJsKHYpe3JldHVybiBkZlt2XX1mdW5jdGlvbiBmdih2KXtkZWxldGUgZGZbdl19ZnVuY3Rpb24gR3Iodil7aWYodil7bGV0IGw9ZGZbdl07aWYobCYmbC50YXNrQ2VudGVyKXJldHVybiBsLnRhc2tDZW50ZXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaU4odil7di5jYWxjQ2xhc3NMaXN0JiZ2LmNhbGNDbGFzc0xpc3QoKX1mdW5jdGlvbiBkZCh2LGwsYil7bGV0e2RvY3VtZW50RWxlbWVudDpUfT12O2lmKFQucHVyZUNoaWxkcmVuLmxlbmd0aD4wfHxsLnBhcmVudE5vZGUpcmV0dXJuO2xldCBrPVQuY2hpbGRyZW4sQz1iP2suaW5kZXhPZihiKTotMTtDPDA/ay5wdXNoKGwpOmsuc3BsaWNlKEMsMCxsKSxsLm5vZGVUeXBlPT09MT8obC5yb2xlPT09ImJvZHkiPyhsLmRvY0lkPXYuaWQsbC5vd25lckRvY3VtZW50PXYsbC5wYXJlbnROb2RlPVQsUWwobCxUKSk6KGwuY2hpbGRyZW4uZm9yRWFjaChkPT57ZC5wYXJlbnROb2RlPWx9KSxoZCh2LGwpLFFsKGwsVCksZGVsZXRlIHYubm9kZU1hcFtsLm5vZGVJZF0pLFQucHVyZUNoaWxkcmVuLnB1c2gobCksb04odixsKSk6KGwucGFyZW50Tm9kZT1ULHYubm9kZU1hcFtsLnJlZl09bCl9ZnVuY3Rpb24gb04odixsKXtsZXQgYj1sLnRvSlNPTigpO3YmJnYudGFza0NlbnRlciYmSG4odi50YXNrQ2VudGVyLnNlbmQpJiZ2LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVCb2R5In0sW2JdKX1mdW5jdGlvbiBoZCh2LGwpe2wucm9sZT0iYm9keSIsbC5kZXB0aD0xLGRlbGV0ZSB2Lm5vZGVNYXBbbC5ub2RlSWRdLGwucmVmPSJfcm9vdCIsdi5ub2RlTWFwLl9yb290PWwsdi5ib2R5PWx9ZnVuY3Rpb24gUWwodixsKXt2LnBhcmVudE5vZGU9bCxpTih2KSxsLmRvY0lkJiYodi5kb2NJZD1sLmRvY0lkLHYub3duZXJEb2N1bWVudD1sLm93bmVyRG9jdW1lbnQsdi5vd25lckRvY3VtZW50Lm5vZGVNYXBbdi5ub2RlSWRdPXYsdi5kZXB0aD1sLmRlcHRoKzEpLHYuY2hpbGRyZW4uZm9yRWFjaChiPT57UWwoYix2KX0pfWZ1bmN0aW9uIHBkKHYpe2Zvcig7djspe2lmKHYubm9kZVR5cGU9PT0xKXJldHVybiB2O3Y9di5uZXh0U2libGluZ319ZnVuY3Rpb24gZ2Qodil7Zm9yKDt2Oyl7aWYodi5ub2RlVHlwZT09PTEpcmV0dXJuIHY7dj12LnByZXZpb3VzU2libGluZ319ZnVuY3Rpb24gZWModixsLGIsVD0hMSl7YjwwJiYoYj0wKTtsZXQgaz1sW2ItMV0sQz1sW2JdO3JldHVybiBsLnNwbGljZShiLDAsdiksVCYmKGsmJihrLm5leHRTaWJsaW5nPXYpLHYucHJldmlvdXNTaWJsaW5nPWssdi5uZXh0U2libGluZz1DLEMmJihDLnByZXZpb3VzU2libGluZz12KSksYn1mdW5jdGlvbiB0Yyh2LGwsYixUPSExKXtsZXQgaz1sLmluZGV4T2Yodik7aWYoazwwKXJldHVybi0xO2lmKFQpe2xldCBSPWxbay0xXSxXZT1sW2srMV07UiYmKFIubmV4dFNpYmxpbmc9V2UpLFdlJiYoV2UucHJldmlvdXNTaWJsaW5nPVIpfWwuc3BsaWNlKGssMSk7bGV0IEM9YjtrPD1iJiYoQz1iLTEpO2xldCBkPWxbQy0xXSxtPWxbQ107cmV0dXJuIGwuc3BsaWNlKEMsMCx2KSxUJiYoZCYmKGQubmV4dFNpYmxpbmc9diksdi5wcmV2aW91c1NpYmxpbmc9ZCx2Lm5leHRTaWJsaW5nPW0sbSYmKG0ucHJldmlvdXNTaWJsaW5nPXYpKSxrPT09Qz8tMTpifWZ1bmN0aW9uIHZkKHYsbCxiPSExKXtsZXQgVD1sLmluZGV4T2Yodik7aWYoIShUPDApKXtpZihiKXtsZXQgaz1sW1QtMV0sQz1sW1QrMV07ayYmKGsubmV4dFNpYmxpbmc9QyksQyYmKEMucHJldmlvdXNTaWJsaW5nPWspfWwuc3BsaWNlKFQsMSl9fXZhciBuYz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZGVwdGg9MDt0aGlzLm5vZGVJZD1zdigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9ZGVzdHJveSgpe2xldCBsPXJsKHRoaXMuZG9jSWQpO2wmJihkZWxldGUgdGhpcy5kb2NJZCxkZWxldGUgbC5ub2RlTWFwW3RoaXMubm9kZUlkXSksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGI9PntiLmRlc3Ryb3koKX0pfX07dmFyIGR2PXt9O2Z1bmN0aW9uIG1kKHYsbCl7aWYoIXRvKGwpfHwhbC5sZW5ndGgpcmV0dXJuO2NsYXNzIGIgZXh0ZW5kcyBSb3t9bC5mb3JFYWNoKFQ9PntiLnByb3RvdHlwZVtUXT1mdW5jdGlvbiguLi5rKXtsZXQgQz1Hcih0aGlzLmRvY0lkKTtpZihDKXJldHVybiBDLnNlbmQoImNvbXBvbmVudCIse3JlZjp0aGlzLnJlZixjb21wb25lbnQ6dixtZXRob2Q6VH0sayl9fSksZHZbdl09Yn1mdW5jdGlvbiBodih2KXtyZXR1cm4gZHZbdl19ZnVuY3Rpb24gVnIodixsLGIsVCxrKXtsZXQgQz17dHlwZToiZGVjbCIscHJvcDp2LHZhbHVlOmwudG9TdHJpbmcoKSxyYXdzOlQsc291cmNlOmt9O3JldHVybiBiJiYoQy5pbXBvcnRhbnQ9ITApLEN9dmFyIGFOPSJiYWNrZ3JvdW5kQ29sb3IiLHNOPSJiYWNrZ3JvdW5kSW1hZ2UiLGxOPXY9PntsZXR7dmFsdWU6bCxpbXBvcnRhbnQ6YixyYXdzOlQsc291cmNlOmt9PXY7cmV0dXJuL14jP1xTKyQvLnRlc3QobCl8fC9ecmdiYT8oLispJC8udGVzdChsKT9bVnIoYU4sbCxiLFQsayldOi9ebGluZWFyLWdyYWRpZW50KC4rKSQvLnRlc3QobCk/W1ZyKHNOLGwsYixULGspXTpbdl19LGNOPSJXaWR0aCIsdU49IlN0eWxlIixmTj0iQ29sb3IiLE91PXY9PntsZXR7cHJvcDpsLHZhbHVlOmIsaW1wb3J0YW50OlQscmF3czprLHNvdXJjZTpDfT12LGQ9Yi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksbT1bL15bXGRcLl0rXFMqJC8sL14oc29saWR8ZGFzaGVkfGRvdHRlZCkkLywvXFMrL10ubWFwKFI9PntsZXQgV2U9ZC5maW5kSW5kZXgoUHQ9PlIudGVzdChQdCkpO3JldHVybiBXZTwwP251bGw6ZC5zcGxpY2UoV2UsMSlbMF19KTtyZXR1cm4gZC5sZW5ndGg/W3ZdOltWcihsK2NOLChtWzBdfHwiMCIpLnRyaW0oKSxULGssQyksVnIobCt1TiwobVsxXXx8InNvbGlkIikudHJpbSgpLFQsayxDKSxWcihsK2ZOLChtWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxULGssQyldfSxkTj0iYm9yZGVyVG9wIixoTj0iYm9yZGVyUmlnaHQiLHBOPSJib3JkZXJCb3R0b20iLGdOPSJib3JkZXJMZWZ0IixfZD12PT57bGV0e3Byb3A6bCx2YWx1ZTpiLGltcG9ydGFudDpULHJhd3M6ayxzb3VyY2U6Q309dixkPWNkKGwpLnNwbGl0KCItIilbMV07ZD1sZihkKTtsZXQgbT1iLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKTtzd2l0Y2gobS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bdl07Y2FzZSAyOm0ucHVzaChtWzBdLG1bMV0pO2JyZWFrO2Nhc2UgMzptLnB1c2gobVsxXSk7YnJlYWt9cmV0dXJuW1ZyKGROK2QsbVswXSxULGssQyksVnIoaE4rZCxtWzFdLFQsayxDKSxWcihwTitkLG1bMl0sVCxrLEMpLFZyKGdOK2QsbVszXSxULGssQyldfSx2Tj0iYm9yZGVyVG9wTGVmdFJhZGl1cyIsbU49ImJvcmRlclRvcFJpZ2h0UmFkaXVzIixfTj0iYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGJOPSJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIix5Tj12PT57bGV0e3ZhbHVlOmwsaW1wb3J0YW50OmIscmF3czpULHNvdXJjZTprfT12LEM9bC5zcGxpdCgvXHMrLyk7aWYobC5pbmNsdWRlcygiLyIpKXJldHVyblt2XTtzd2l0Y2goQy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bdl07Y2FzZSAyOkMucHVzaChDWzBdLENbMV0pO2JyZWFrO2Nhc2UgMzpDLnB1c2goQ1sxXSk7YnJlYWt9cmV0dXJuW1ZyKHZOLENbMF0sYixULGspLFZyKG1OLENbMV0sYixULGspLFZyKF9OLENbMl0sYixULGspLFZyKGJOLENbM10sYixULGspXX0sRU49X2Qsd049X2QsU049ImZsZXhEaXJlY3Rpb24iLENOPSJmbGV4V3JhcCIsT049dj0+e2xldHt2YWx1ZTpsLGltcG9ydGFudDpiLHJhd3M6VCxzb3VyY2U6a309dixDPWwuc3BsaXQoL1xzKy8pLGQ9Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAobT0+e2xldCBSPUMuZmluZEluZGV4KFdlPT5tLnRlc3QoV2UpKTtyZXR1cm4gUjwwP251bGw6Qy5zcGxpY2UoUiwxKVswXX0pO3JldHVybiBDLmxlbmd0aD9bdl06W1ZyKFNOLGRbMF18fCJjb2x1bW4iLGIsVCxrKSxWcihDTixkWzFdfHwibm93cmFwIixiLFQsayldfSxBTj0iVG9wIixUTj0iUmlnaHQiLElOPSJCb3R0b20iLFBOPSJMZWZ0Iixwdj12PT5sPT57bGV0e3ZhbHVlOmIsaW1wb3J0YW50OlQscmF3czprLHNvdXJjZTpDfT1sLGQ9Yi5zcGxpdCgvXHMrLyk7c3dpdGNoKGQubGVuZ3RoKXtjYXNlIDE6ZC5wdXNoKGRbMF0sZFswXSxkWzBdKTticmVhaztjYXNlIDI6ZC5wdXNoKGRbMF0sZFsxXSk7YnJlYWs7Y2FzZSAzOmQucHVzaChkWzFdKTticmVha31yZXR1cm5bVnIoditBTixkWzBdLFQsayxDKSxWcih2K1ROLGRbMV0sVCxrLEMpLFZyKHYrSU4sZFsyXSxULGssQyksVnIoditQTixkWzNdLFQsayxDKV19LE5OPXB2KCJtYXJnaW4iKSxrTj1wdigicGFkZGluZyIpLFJOPSJ0cmFuc2l0aW9uUHJvcGVydHkiLHhOPSJ0cmFuc2l0aW9uRHVyYXRpb24iLEJOPSJ0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24iLE1OPSJ0cmFuc2l0aW9uRGVsYXkiLEROPXY9PntsZXQgbD0vXihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pP1xzKihcUyopP1xzKihcZCpcLj9cZCsoPzptc3xzKT8pPyQvLHt2YWx1ZTpiLGltcG9ydGFudDpULHJhd3M6ayxzb3VyY2U6Q309dixkPVtdLG09Yi5tYXRjaChsKTtyZXR1cm4gbSYmKG1bMV0mJmQucHVzaChWcihSTixtWzFdLFQsayxDKSksbVsyXSYmZC5wdXNoKFZyKHhOLG1bMl0sVCxrLEMpKSxtWzNdJiZkLnB1c2goVnIoQk4sbVszXSxULGssQykpLG1bNF0mJmQucHVzaChWcihNTixtWzRdLFQsayxDKSkpLGR9LGd2PXt0cmFuc2l0aW9uOkROLG1hcmdpbjpOTixwYWRkaW5nOmtOLGJvcmRlcjpPdSxiYWNrZ3JvdW5kOmxOfTtEaShndix7Ym9yZGVyVG9wOk91LGJvcmRlclJpZ2h0Ok91LGJvcmRlckJvdHRvbTpPdSxib3JkZXJMZWZ0Ok91LGJvcmRlclN0eWxlOkVOLGJvcmRlcldpZHRoOndOLGJvcmRlckNvbG9yOl9kLGJvcmRlclJhZGl1czp5TixmbGV4RmxvdzpPTn0pO3ZhciB2dj1TeW1ib2woImV4cGFuZGVkIiksbXY9e3Bvc3Rjc3NQbHVnaW46Im52dWU6ZXhwYW5kIixEZWNsYXJhdGlvbih2KXtpZih2W3Z2XSlyZXR1cm47bGV0IGw9Z3Zbdi5wcm9wXTtpZihsKXtsZXQgYj1sKHYpO2IubGVuZ3RoPT09MSYmYlswXT09PXZ8fHYucmVwbGFjZVdpdGgoYil9dlt2dl09ITB9fTt2YXIgTE49bXYuRGVjbGFyYXRpb247ZnVuY3Rpb24gYmQodixsKXtsZXQgYj1EaSh7cmVwbGFjZVdpdGgoayl7VD1rfX0sRk4odixsKSksVD1bYl07cmV0dXJuIExOKGIpLFR9ZnVuY3Rpb24gRk4odixsKXtsZXQgYj1sKyIiO3JldHVybiBiLmluY2x1ZGVzKCIhaW1wb3J0YW50Iik/e3Byb3A6dix2YWx1ZTpiLnJlcGxhY2UoL1xzKiFpbXBvcnRhbnQvLCIiKSxpbXBvcnRhbnQ6ITB9Ontwcm9wOnYsdmFsdWU6YixpbXBvcnRhbnQ6ITF9fXZhciBWTj0idmlldyIsVU49WyJjbGljayIsImxvbmdwcmVzcyIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCIsImhvcml6b250YWxwYW4iLCJ2ZXJ0aWNhbHBhbiIsInN3aXBlIl07ZnVuY3Rpb24geWQodixsKXtsZXQgYj1ybCh2KTtiLm5vZGVNYXBbbC5ub2RlSWRdPWx9dmFyIEVkO2Z1bmN0aW9uIF92KHYpe0VkfHwoRWQ9dil9dmFyIFJvPWNsYXNzIGV4dGVuZHMgbmN7Y29uc3RydWN0b3IobD1WTixiPXt9LFQpe3N1cGVyKCk7bGV0IGs9aHYobCk7aWYoayYmIVQpcmV0dXJuIG5ldyBrKGwsYiwhMCk7dGhpcy5ub2RlVHlwZT0xLHRoaXMudHlwZT1sLHRoaXMuYXR0cj1iLmF0dHJ8fHt9LHRoaXMuc3R5bGU9Yi5zdHlsZXx8e30sdGhpcy5jbGFzc1N0eWxlPWIuY2xhc3NTdHlsZXx8e30sdGhpcy5jbGFzc0xpc3Q9Yi5jbGFzc0xpc3R8fFtdLHRoaXMuc3R5bGVTaGVldD1iLnN0eWxlU2hlZXR8fHt9LHRoaXMuZXZlbnQ9e319YXBwZW5kQ2hpbGQobCl7aWYoIShsLnBhcmVudE5vZGUmJmwucGFyZW50Tm9kZSE9PXRoaXMpKXtpZihsLnBhcmVudE5vZGUpe2lmKGlyKCJkZWJ1ZyIpJiZ2byhgW2FwcGVuZENoaWxkXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgTW92ZSA8JHtsLnR5cGV9PiB0byAke3RoaXMuY2hpbGRyZW4ubGVuZ3RofSBvZiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLHRjKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksbC5ub2RlVHlwZT09PTEpe2xldCBiPXRjKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxUPUdyKHRoaXMuZG9jSWQpO2lmKFQmJmI+PTApcmV0dXJuIFQuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtsLnJlZix0aGlzLnJlZixiXSl9fWVsc2UgaWYoaXIoImRlYnVnIikmJnZvKGBbYXBwZW5kQ2hpbGRdKCR7dGhpcy5kb2NJZH0sJHtsLnR5cGV9LCR7bC5yZWZ9KSBBcHBlbmQgPCR7bC50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSxRbChsLHRoaXMpLGVjKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmeWQodGhpcy5kb2NJZCxsKSxsLm5vZGVUeXBlPT09MSl7ZWMobCx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpO2xldCBiPUdyKHRoaXMuZG9jSWQpO2lmKGIpcmV0dXJuIGIuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGwudG9KU09OKCksLTFdKX19fWluc2VydEJlZm9yZShsLGIpe2lmKCEobC5wYXJlbnROb2RlJiZsLnBhcmVudE5vZGUhPT10aGlzKSYmIShsPT09Ynx8bC5uZXh0U2libGluZyYmbC5uZXh0U2libGluZz09PWIpKXtpZihsLnBhcmVudE5vZGUpe2lmKHRjKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoYiksITApLGwubm9kZVR5cGU9PT0xKXtsZXQgVD1wZChiKSxrPXRjKGwsdGhpcy5wdXJlQ2hpbGRyZW4sVD90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKFQpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksQz1Hcih0aGlzLmRvY0lkKTtpZihDJiZrPj0wKXJldHVybiBDLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbbC5yZWYsdGhpcy5yZWYsa10pfX1lbHNlIGlmKGlyKCJkZWJ1ZyIpJiZ2byhgW2luc2VydEJlZm9yZV0oJHt0aGlzLmRvY0lkfSwke2wudHlwZX0sJHtsLnJlZn0pIEluc2VydCA8JHtsLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLCBiZWZvcmUgKCR7Yi5yZWZ9KS5gKSxRbChsLHRoaXMpLGVjKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoYiksITApLHRoaXMuZG9jSWQmJnlkKHRoaXMuZG9jSWQsbCksbC5ub2RlVHlwZT09PTEpe2xldCBUPXBkKGIpLGs9ZWMobCx0aGlzLnB1cmVDaGlsZHJlbixUP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoVCk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxDPUdyKHRoaXMuZG9jSWQpO2lmKEMpcmV0dXJuIEMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGwudG9KU09OKCksa10pfX19aW5zZXJ0QWZ0ZXIobCxiKXtpZighKGwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlIT09dGhpcykmJiEobD09PWJ8fGwucHJldmlvdXNTaWJsaW5nJiZsLnByZXZpb3VzU2libGluZz09PWIpKXtpZihsLnBhcmVudE5vZGUpe2lmKHRjKGwsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoYikrMSwhMCksbC5ub2RlVHlwZT09PTEpe2xldCBUPXRjKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihnZChiKSkrMSksaz1Hcih0aGlzLmRvY0lkKTtpZihrJiZUPj0wKXJldHVybiBrLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbbC5yZWYsdGhpcy5yZWYsVF0pfX1lbHNlIGlmKGlyKCJkZWJ1ZyIpJiZ2byhgW2luc2VydEFmdGVyXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgSW5zZXJ0IDwke2wudHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSksIGFmdGVyICgke2IucmVmfSkuYCksUWwobCx0aGlzKSxlYyhsLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKGIpKzEsITApLHRoaXMuZG9jSWQmJnlkKHRoaXMuZG9jSWQsbCksbC5ub2RlVHlwZT09PTEpe2xldCBUPWVjKGwsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihnZChiKSkrMSksaz1Hcih0aGlzLmRvY0lkKTtpZihrKXJldHVybiBrLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixsLnRvSlNPTigpLFRdKX19fXJlbW92ZUNoaWxkKGwsYil7aWYobC5wYXJlbnROb2RlJiYodmQobCx0aGlzLmNoaWxkcmVuLCEwKSxsLm5vZGVUeXBlPT09MSkpe2lyKCJkZWJ1ZyIpJiZ2byhgW3JlbW92ZUNoaWxkXSgke3RoaXMuZG9jSWR9LCR7bC50eXBlfSwke2wucmVmfSkgUmVtb3ZlIDwke2wudHlwZX0+IGZyb20gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSx2ZChsLHRoaXMucHVyZUNoaWxkcmVuKTtsZXQgVD1Hcih0aGlzLmRvY0lkKTtUJiZULnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtsLnJlZl0pfWJ8fGwuZGVzdHJveSgpfWNsZWFyKCl7bGV0IGw9R3IodGhpcy5kb2NJZCk7bCYmdGhpcy5wdXJlQ2hpbGRyZW4uZm9yRWFjaChiPT57bC5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbYi5yZWZdKX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChiPT57Yi5kZXN0cm95KCl9KSx0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aD0wfXNldEF0dHIobCxiLFQpe2lmKHRoaXMuYXR0cltsXT09PWImJlQhPT0hMSlyZXR1cm47dGhpcy5hdHRyW2xdPWI7bGV0IGs9R3IodGhpcy5kb2NJZCk7IVQmJmsmJmsuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZix7W2xdOmJ9XSl9c2V0QXR0cnMobCxiKXtpZihDdShsKSlyZXR1cm47bGV0IFQ9e307Zm9yKGxldCBrIGluIGwpdGhpcy5hdHRyW2tdIT09bFtrXSYmKHRoaXMuYXR0cltrXT1sW2tdLFRba109bFtrXSk7aWYoIUN1KFQpKXtsZXQgaz1Hcih0aGlzLmRvY0lkKTshYiYmayYmay5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZUF0dHJzIn0sW3RoaXMucmVmLFRdKX19c2V0U3R5bGUobCxiLFQpe2JkKGwsYikuZm9yRWFjaCgoe3Byb3A6ayx2YWx1ZTpDfSk9PntpZih0aGlzLnN0eWxlW2tdPT09QyYmVCE9PSExKXJldHVybjt0aGlzLnN0eWxlW2tdPUM7bGV0IGQ9R3IodGhpcy5kb2NJZCk7IVQmJmQmJmQuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix7W2tdOkM9PT0iIiYmayBpbiB0aGlzLmNsYXNzU3R5bGU/dGhpcy5jbGFzc1N0eWxlW2tdOkN9XSl9KX1zZXRTdHlsZXMobCxiKXtpZihDdShsKSlyZXR1cm47bGV0IFQ9e307Zm9yKGxldCBrIGluIGwpYmQoayxsW2tdKS5mb3JFYWNoKCh7cHJvcDpDLHZhbHVlOmR9KT0+e3RoaXMuc3R5bGVbQ10hPT1kJiYodGhpcy5zdHlsZVtDXT1kLFRbQ109ZD09PSIiJiZDIGluIHRoaXMuY2xhc3NTdHlsZT90aGlzLmNsYXNzU3R5bGVbQ106ZCl9KTtpZighQ3UoVCkpe2xldCBrPUdyKHRoaXMuZG9jSWQpOyFiJiZrJiZrLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYsVF0pfX1zZXRDbGFzc1N0eWxlKGwpe2ZvcihsZXQgVCBpbiB0aGlzLmNsYXNzU3R5bGUpdGhpcy5jbGFzc1N0eWxlW1RdPSIiO0RpKHRoaXMuY2xhc3NTdHlsZSxsKTtsZXQgYj1Hcih0aGlzLmRvY0lkKTtiJiZiLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYsdGhpcy50b1N0eWxlKCldKX1zZXRDbGFzc0xpc3QobCl7bC5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJmwuZmlsdGVyKGI9PiF0aGlzLmNsYXNzTGlzdC5pbmNsdWRlcyhiKSkubGVuZ3RoPT09MHx8KHRoaXMuY2xhc3NMaXN0PWwsdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNhbGNDbGFzc0xpc3QoKSl9Y2FsY0NsYXNzTGlzdCgpe3RoaXMuc2V0Q2xhc3NTdHlsZShFZCh0aGlzKSl9c2V0U3R5bGVTaGVldChsKXt0aGlzLnN0eWxlU2hlZXQ9bH1hZGRFdmVudChsLGIsVCl7aWYodGhpcy5ldmVudHx8KHRoaXMuZXZlbnQ9e30pLCF0aGlzLmV2ZW50W2xdKXtpcigiZGVidWciKSYmdm8oYFthZGRFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIEFkZCAiJHtsfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKSx0aGlzLmV2ZW50W2xdPXtoYW5kbGVyOmIscGFyYW1zOlR9O2xldCBrPUdyKHRoaXMuZG9jSWQpO2smJmsuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFdmVudCJ9LFt0aGlzLnJlZixsXSl9fXJlbW92ZUV2ZW50KGwpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbbF0pe2lyKCJkZWJ1ZyIpJiZ2byhgW3JlbW92ZUV2ZW50XSgke3RoaXMuZG9jSWR9LCR7dGhpcy50eXBlfSwke3RoaXMucmVmfSkgUmVtb3ZlICIke2x9IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLGRlbGV0ZSB0aGlzLmV2ZW50W2xdO2xldCBiPUdyKHRoaXMuZG9jSWQpO2ImJmIuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFdmVudCJ9LFt0aGlzLnJlZixsXSl9fWZpcmVFdmVudChsLGIsVCxrKXtsZXQgQz1udWxsLGQ9ITEsbT10aGlzLmV2ZW50W2xdO2lmKG0mJmIpe2lyKCJkZWJ1ZyIpJiZ2byhgW2ZpcmVFdmVudF0oJHt0aGlzLmRvY0lkfSwke3RoaXMudHlwZX0sJHt0aGlzLnJlZn0pIEZpcmUgIiR7bH0iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCk7bGV0IFI9bS5oYW5kbGVyO2Iuc3RvcFByb3BhZ2F0aW9uPSgpPT57ZD0hMH0sYi5wcmV2ZW50RGVmYXVsdD0oKT0+e307dHJ5e2smJmsucGFyYW1zP0M9Ui5jYWxsKHRoaXMsLi4uay5wYXJhbXMsYik6Qz1SLmNhbGwodGhpcyxiKX1jYXRjaChXZSl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJHtsfSIgb24gJHt0aGlzLnR5cGV9ICgke3RoaXMucmVmfSk6CiAke1dlLnRvU3RyaW5nKCl9YCksV2V9fXJldHVybiFkJiZUJiZVTi5pbmRleE9mKGwpIT09LTEmJnRoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudCYmKGIuY3VycmVudFRhcmdldD10aGlzLnBhcmVudE5vZGUsdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudChsLGIsVCkpLEN9dG9TdHlsZSgpe2xldCBsPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSxiPXRoaXMuc3R5bGU7Zm9yKGxldCBUIGluIGIpe2xldCBrPWJbVF07bFtUXT1rPT09IiImJlQgaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtUXTprfXJldHVybiBsfXRvSlNPTihsPSExKXtsZXQgYj17cmVmOnRoaXMucmVmLnRvU3RyaW5nKCksdHlwZTp0aGlzLnR5cGUsYXR0cjp0aGlzLmF0dHIsc3R5bGU6dGhpcy50b1N0eWxlKCl9LFQ9W107Zm9yKGxldCBrIGluIHRoaXMuZXZlbnQpe2xldHtwYXJhbXM6Q309dGhpcy5ldmVudFtrXTtDP1QucHVzaCh7dHlwZTprLHBhcmFtczpDfSk6VC5wdXNoKGspfXJldHVybiBULmxlbmd0aCYmKGIuZXZlbnQ9VCksIWwmJnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCYmKGIuY2hpbGRyZW49dGhpcy5wdXJlQ2hpbGRyZW4ubWFwKGs9PmsudG9KU09OKCkpKSxifXRvU3RyaW5nKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChsPT5sLnRvU3RyaW5nKCkpLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In19O2Z1bmN0aW9uIGJ2KHYpe2xldCBsPXYmJnYuX192X3JhdztyZXR1cm4gbD9idihsKTp2fWZ1bmN0aW9uIHl2KHYpe2xldCBsPVN1KHYpO3N3aXRjaChsKXtjYXNlIlVuZGVmaW5lZCI6Y2FzZSJOdWxsIjpyZXR1cm4iIjtjYXNlIlJlZ0V4cCI6cmV0dXJuIHYudG9TdHJpbmcoKTtjYXNlIkRhdGUiOnJldHVybiB2LnRvSVNPU3RyaW5nKCk7Y2FzZSJOdW1iZXIiOmNhc2UiU3RyaW5nIjpjYXNlIkJvb2xlYW4iOmNhc2UiQXJyYXkiOmNhc2UiT2JqZWN0IjpyZXR1cm4gYnYodik7Y2FzZSJBcnJheUJ1ZmZlciI6cmV0dXJueyJAdHlwZSI6ImJpbmFyeSIsZGF0YVR5cGU6bCxiYXNlNjQ6ZmQodil9O2Nhc2UiSW50OEFycmF5IjpjYXNlIlVpbnQ4QXJyYXkiOmNhc2UiVWludDhDbGFtcGVkQXJyYXkiOmNhc2UiSW50MTZBcnJheSI6Y2FzZSJVaW50MTZBcnJheSI6Y2FzZSJJbnQzMkFycmF5IjpjYXNlIlVpbnQzMkFycmF5IjpjYXNlIkZsb2F0MzJBcnJheSI6Y2FzZSJGbG9hdDY0QXJyYXkiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOmwsYmFzZTY0OmZkKHYuYnVmZmVyKX07ZGVmYXVsdDpyZXR1cm4gSlNPTi5zdHJpbmdpZnkodil9fXZhciBoZj1mdW5jdGlvbigpe30sJGM9Y2xhc3N7Y29uc3RydWN0b3IobCxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW5zdGFuY2VJZCIse2VudW1lcmFibGU6ITAsdmFsdWU6U3RyaW5nKGwpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhbGxiYWNrTWFuYWdlciIse2VudW1lcmFibGU6ITAsdmFsdWU6bmV3IGZmKGwpfSksaGY9Ynx8ZnVuY3Rpb24oKXt9fWNhbGxiYWNrKGwsYixUKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY29uc3VtZShsLGIsVCl9cmVnaXN0ZXJIb29rKGwsYixULGspe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5yZWdpc3Rlckhvb2sobCxiLFQsayl9dHJpZ2dlckhvb2sobCxiLFQsayl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLnRyaWdnZXJIb29rKGwsYixULGspfXVwZGF0ZURhdGEobCxiLFQpe3RoaXMuc2VuZCgibW9kdWxlIix7bW9kdWxlOiJkb20iLG1ldGhvZDoidXBkYXRlQ29tcG9uZW50RGF0YSJ9LFtsLGIsVF0pfWRlc3Ryb3lDYWxsYmFjaygpe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jbG9zZSgpfW5vcm1hbGl6ZShsLGI9ITEpe2xldCBUPVN1KGwpO2lmKGwmJmwgaW5zdGFuY2VvZiBSbylyZXR1cm4gbC5yZWY7aWYobCYmbC4kZWwgaW5zdGFuY2VvZiBSbylyZXR1cm4gbC4kZWwucmVmO2lmKFQ9PT0iRnVuY3Rpb24iKXJldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5hZGQobCkudG9TdHJpbmcoKTtpZihiKXtpZihUPT09Ik9iamVjdCIpe2xldCBrPXt9O2ZvcihsZXQgQyBpbiBsKWtbQ109dGhpcy5ub3JtYWxpemUobFtDXSwhMCk7cmV0dXJuIGt9aWYoVD09PSJBcnJheSIpcmV0dXJuIGwubWFwKGs9PnRoaXMubm9ybWFsaXplKGssITApKX1yZXR1cm4gbCYmbC5yZWYmJmxbIltbVmlydHVhbEVsZW1lbnRdXSJdP2wucmVmOnl2KGwpfXNlbmQobCxiLFQsayl7bGV0e2FjdGlvbjpDLGNvbXBvbmVudDpkLHJlZjptLG1vZHVsZTpSLG1ldGhvZDpXZX09Yjtzd2l0Y2goVD1ULm1hcChQdD0+dGhpcy5ub3JtYWxpemUoUHQsbCE9PSJtb2R1bGUiKSksU3Uoayk9PT0iT2JqZWN0IiYmKGs9dGhpcy5ub3JtYWxpemUoaywhMCkpLGwpe2Nhc2UiZG9tIjpyZXR1cm4gaXIoImRlYnVnIikmJnZvKGBbdGFza10oJHt0aGlzLmluc3RhbmNlSWR9LCR7bH0sJHtDfSkgJHtKU09OLnN0cmluZ2lmeShUKX1gKSx0aGlzW0NdKHRoaXMuaW5zdGFuY2VJZCxUKTtjYXNlImNvbXBvbmVudCI6cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsbSxXZSxULERpKHtjb21wb25lbnQ6ZH0saykpO2RlZmF1bHQ6cmV0dXJuIGlyKCJkZWJ1ZyIpJiZ2byhgW3Rhc2tdKCR7dGhpcy5pbnN0YW5jZUlkfSwke1J9LCR7V2V9KSAke0pTT04uc3RyaW5naWZ5KFQpfWApLHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsUixXZSxULGspfX1jYWxsRE9NKGwsYil7cmV0dXJuIHRoaXNbbF0odGhpcy5pbnN0YW5jZUlkLGIpfWNhbGxDb21wb25lbnQobCxiLFQsayl7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsbCxiLFQsayl9Y2FsbE1vZHVsZShsLGIsVCxrKXtyZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxsLGIsVCxrKX19O2Z1bmN0aW9uIEV2KCl7bGV0IHY9e2NyZWF0ZUZpbmlzaDpnbG9iYWwuY2FsbENyZWF0ZUZpbmlzaCx1cGRhdGVGaW5pc2g6Z2xvYmFsLmNhbGxVcGRhdGVGaW5pc2gscmVmcmVzaEZpbmlzaDpnbG9iYWwuY2FsbFJlZnJlc2hGaW5pc2gsY3JlYXRlQm9keTpnbG9iYWwuY2FsbENyZWF0ZUJvZHksYWRkRWxlbWVudDpnbG9iYWwuY2FsbEFkZEVsZW1lbnQscmVtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbFJlbW92ZUVsZW1lbnQsbW92ZUVsZW1lbnQ6Z2xvYmFsLmNhbGxNb3ZlRWxlbWVudCx1cGRhdGVBdHRyczpnbG9iYWwuY2FsbFVwZGF0ZUF0dHJzLHVwZGF0ZVN0eWxlOmdsb2JhbC5jYWxsVXBkYXRlU3R5bGUsYWRkRXZlbnQ6Z2xvYmFsLmNhbGxBZGRFdmVudCxyZW1vdmVFdmVudDpnbG9iYWwuY2FsbFJlbW92ZUV2ZW50LF9fdXBkYXRlQ29tcG9uZW50RGF0YTpnbG9iYWwuX191cGRhdGVDb21wb25lbnREYXRhfSxsPSRjLnByb3RvdHlwZTtmb3IobGV0IGIgaW4gdil7bGV0IFQ9dltiXTtsW2JdPVQ/KGssQyk9PlQoaywuLi5DKTooayxDKT0+aGYoayxbe21vZHVsZToiZG9tIixtZXRob2Q6YixhcmdzOkN9XSwiLTEiKX1sLmNvbXBvbmVudEhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVDb21wb25lbnR8fCgoYixULGssQyxkKT0+aGYoYixbe2NvbXBvbmVudDpkLmNvbXBvbmVudCxyZWY6VCxtZXRob2Q6ayxhcmdzOkN9XSkpLGwubW9kdWxlSGFuZGxlcj1nbG9iYWwuY2FsbE5hdGl2ZU1vZHVsZXx8KChiLFQsayxDKT0+aGYoYixbe21vZHVsZTpULG1ldGhvZDprLGFyZ3M6Q31dKSl9ZnVuY3Rpb24gJE4odixsLGIsVCxrLEMpe2xldCBkPXYuZ2V0UmVmKGwpO2lmKGQpcmV0dXJuIHYuZmlyZUV2ZW50KGQsYixULGssQyk7aWYoVClyZXR1cm4gVC5fbm9kZUlkPWwsdi5maXJlRXZlbnQodi5nZXRSZWYoIl9kb2N1bWVudEVsZW1lbnQiKSxiLFQsayxDKX1mdW5jdGlvbiBITih2LGwsYixUKXtyZXR1cm4gdi50YXNrQ2VudGVyLmNhbGxiYWNrKGwsYixUKX1mdW5jdGlvbiBqTih2LGwsYixULGspe2lmKCF2fHwhdi50YXNrQ2VudGVyKXJldHVybiBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBDYW4ndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLmApLG51bGw7bGV0IEM9bnVsbDt0cnl7Qz12LnRhc2tDZW50ZXIudHJpZ2dlckhvb2sobCxiLFQsayl9Y2F0Y2goZCl7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICIke2J9QCR7VH0iIGhvb2sgb24gJHtsfS5gKSxkfXJldHVybiBDfWZ1bmN0aW9uIHdkKHYsbCl7bGV0IGI9cmwodik7aWYoIWIpcmV0dXJuIG5ldyBFcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlY2VpdmVUYXNrcywgaW5zdGFuY2UgKCR7dn0pIGlzIG5vdCBhdmFpbGFibGUuYCk7aWYodG8obCkpcmV0dXJuIGwubWFwKFQ9Pntzd2l0Y2goVC5tZXRob2Qpe2Nhc2UiY2FsbGJhY2siOnJldHVybiBITihiLC4uLlQuYXJncyk7Y2FzZSJmaXJlRXZlbnRTeW5jIjpjYXNlImZpcmVFdmVudCI6cmV0dXJuICROKGIsLi4uVC5hcmdzKTtjYXNlImNvbXBvbmVudEhvb2siOnJldHVybiBqTihiLC4uLlQuYXJncyl9fSl9dmFyIFRsPXt9O2Z1bmN0aW9uIHd2KHY9e30pe2ZvcihsZXQgbCBpbiB2KVhsKFRsLGwpfHwoVGxbbF09e30pLCEhdG8odltsXSkmJnZbbF0uZm9yRWFjaChiPT57TGkoYik/VGxbbF1bYl09ITA6VWMoYikmJkxpKGIubmFtZSkmJihUbFtsXVtiLm5hbWVdPWIuYXJnc3x8W10pfSl9ZnVuY3Rpb24gcGYodixsKXtyZXR1cm4gTGkobCk/ISEoVGxbdl0mJlRsW3ZdW2xdKTohIVRsW3ZdfWZ1bmN0aW9uIFN2KHYpe3JldHVybiBUbFt2XX12YXIgU2Q9e307ZnVuY3Rpb24gQ3Yodil7IXRvKHYpfHx2LmZvckVhY2gobD0+eyFsfHwoTGkobCk/U2RbbF09ITA6VWMobCkmJkxpKGwudHlwZSkmJihTZFtsLnR5cGVdPWwsbWQobC50eXBlLGwubWV0aG9kcykpKX0pfWZ1bmN0aW9uIENkKHYpe3JldHVybiEhU2Rbdl19dmFyIElsPVtdO2Z1bmN0aW9uIGdmKHYsbCl7T2Qodik/Y29uc29sZS53YXJuKGBTZXJ2aWNlICIke3Z9IiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhYCk6KGw9RGkoe30sbCksSWwucHVzaCh7bmFtZTp2LG9wdGlvbnM6bH0pKX1mdW5jdGlvbiB2Zih2KXtJbC5zb21lKChsLGIpPT57aWYobC5uYW1lPT09dilyZXR1cm4gSWwuc3BsaWNlKGIsMSksITB9KX1mdW5jdGlvbiBPZCh2KXtyZXR1cm4gek4odik+PTB9ZnVuY3Rpb24gek4odil7cmV0dXJuIElsLm1hcChsPT5sLm5hbWUpLmluZGV4T2Yodil9ZnVuY3Rpb24gV04odil7cmV0dXJuIGw9PntsZXQgYj1vZih2LGwpLHtjcmVhdGVBcHA6VH09YjtiLmNyZWF0ZVZ1ZUFwcD1iLmNyZWF0ZUFwcD0oayxDKT0+VChrLEMpLnVzZShHTixsKSxsLlZ1ZT1ifX12YXIgR049e2luc3RhbGwodixsKXtZTih2LGwpLEV1KGwpLmluaXRBcHAodil9fTtmdW5jdGlvbiBZTih2LGwpe2xldHttb3VudDpifT12O3YubW91bnQ9VD0+e2xldCBrPWIoVCk7cmV0dXJuIFQ9PT0iI2FwcCImJmwuX19yZWdpc3RlckFwcChrKSxrfX1mdW5jdGlvbiBxTih2KXtsZXR7VW5pU2hhcmVkOmwsVnVlU2hhcmVkOmIsVnVlUmVhY3Rpdml0eTpUfT12O3ZhciBrPWZ1bmN0aW9uKEMsZCxtLFIpeyJ1c2Ugc3RyaWN0Ijt2YXIgV2U9W107ZnVuY3Rpb24gUHQoaSl7V2UucHVzaChpKX1mdW5jdGlvbiBlbigpe1dlLnBvcCgpfWZ1bmN0aW9uIGdlKGkpe20ucGF1c2VUcmFja2luZygpO2Zvcih2YXIgYT1XZS5sZW5ndGg/V2VbV2UubGVuZ3RoLTFdLmNvbXBvbmVudDpudWxsLGY9YSYmYS5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcixwPU8oKSxTPWFyZ3VtZW50cy5sZW5ndGgsdz1uZXcgQXJyYXkoUz4xP1MtMTowKSxOPTE7TjxTO04rKyl3W04tMV09YXJndW1lbnRzW05dO2lmKGYpZm4oZixhLDExLFtpK3cuam9pbigiIiksYSYmYS5wcm94eSxwLm1hcChGPT57dmFye3Zub2RlOnF9PUY7cmV0dXJuImF0IDwiLmNvbmNhdChrcyhhLHEudHlwZSksIj4iKX0pLmpvaW4oYApgKSxwXSk7ZWxzZXt2YXIgVj1bIltWdWUgd2Fybl06ICIuY29uY2F0KGkpLC4uLnddO3AubGVuZ3RoJiZWLnB1c2goYApgLC4uLk50KHApKSxjb25zb2xlLndhcm4oLi4uVil9bS5yZXNldFRyYWNraW5nKCl9ZnVuY3Rpb24gTygpe3ZhciBpPVdlW1dlLmxlbmd0aC0xXTtpZighaSlyZXR1cm5bXTtmb3IodmFyIGE9W107aTspe3ZhciBmPWFbMF07ZiYmZi52bm9kZT09PWk/Zi5yZWN1cnNlQ291bnQrKzphLnB1c2goe3Zub2RlOmkscmVjdXJzZUNvdW50OjB9KTt2YXIgcD1pLmNvbXBvbmVudCYmaS5jb21wb25lbnQucGFyZW50O2k9cCYmcC52bm9kZX1yZXR1cm4gYX1mdW5jdGlvbiBOdChpKXt2YXIgYT1bXTtyZXR1cm4gaS5mb3JFYWNoKChmLHApPT57YS5wdXNoKC4uLnA9PT0wP1tdOltgCmBdLC4uLmpuKGYpKX0pLGF9ZnVuY3Rpb24gam4oaSl7dmFye3Zub2RlOmEscmVjdXJzZUNvdW50OmZ9PWkscD1mPjA/Ii4uLiAoIi5jb25jYXQoZiwiIHJlY3Vyc2l2ZSBjYWxscykiKToiIixTPWEuY29tcG9uZW50P2EuY29tcG9uZW50LnBhcmVudD09bnVsbDohMSx3PSIgYXQgPCIuY29uY2F0KGtzKGEuY29tcG9uZW50LGEudHlwZSxTKSksTj0iPiIrcDtyZXR1cm4gYS5wcm9wcz9bdywuLi5fdChhLnByb3BzKSxOXTpbdytOXX1mdW5jdGlvbiBfdChpKXt2YXIgYT1bXSxmPU9iamVjdC5rZXlzKGkpO3JldHVybiBmLnNsaWNlKDAsMykuZm9yRWFjaChwPT57YS5wdXNoKC4uLkoocCxpW3BdKSl9KSxmLmxlbmd0aD4zJiZhLnB1c2goIiAuLi4iKSxhfWZ1bmN0aW9uIEooaSxhLGYpe3JldHVybiBkLmlzU3RyaW5nKGEpPyhhPUpTT04uc3RyaW5naWZ5KGEpLGY/YTpbIiIuY29uY2F0KGksIj0iKS5jb25jYXQoYSldKTp0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiJ8fGE9PW51bGw/Zj9hOlsiIi5jb25jYXQoaSwiPSIpLmNvbmNhdChhKV06bS5pc1JlZihhKT8oYT1KKGksbS50b1JhdyhhLnZhbHVlKSwhMCksZj9hOlsiIi5jb25jYXQoaSwiPVJlZjwiKSxhLCI+Il0pOmQuaXNGdW5jdGlvbihhKT9bIiIuY29uY2F0KGksIj1mbiIpLmNvbmNhdChhLm5hbWU/IjwiLmNvbmNhdChhLm5hbWUsIj4iKToiIildOihhPW0udG9SYXcoYSksZj9hOlsiIi5jb25jYXQoaSwiPSIpLGFdKX1mdW5jdGlvbiByZShpLGEpe2khPT12b2lkIDAmJih0eXBlb2YgaSE9Im51bWJlciI/Z2UoIiIuY29uY2F0KGEsIiBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSAiKSsiZ290ICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGkpLCIuIikpOmlzTmFOKGkpJiZnZSgiIi5jb25jYXQoYSwiIGlzIE5hTiAtICIpKyJ0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuIikpfXZhciBEbj17c3A6InNlcnZlclByZWZldGNoIGhvb2siLGJjOiJiZWZvcmVDcmVhdGUgaG9vayIsYzoiY3JlYXRlZCBob29rIixibToiYmVmb3JlTW91bnQgaG9vayIsbToibW91bnRlZCBob29rIixidToiYmVmb3JlVXBkYXRlIGhvb2siLHU6InVwZGF0ZWQiLGJ1bToiYmVmb3JlVW5tb3VudCBob29rIix1bToidW5tb3VudGVkIGhvb2siLGE6ImFjdGl2YXRlZCBob29rIixkYToiZGVhY3RpdmF0ZWQgaG9vayIsZWM6ImVycm9yQ2FwdHVyZWQgaG9vayIscnRjOiJyZW5kZXJUcmFja2VkIGhvb2siLHJ0ZzoicmVuZGVyVHJpZ2dlcmVkIGhvb2siLFswXToic2V0dXAgZnVuY3Rpb24iLFsxXToicmVuZGVyIGZ1bmN0aW9uIixbMl06IndhdGNoZXIgZ2V0dGVyIixbM106IndhdGNoZXIgY2FsbGJhY2siLFs0XToid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uIixbNV06Im5hdGl2ZSBldmVudCBoYW5kbGVyIixbNl06ImNvbXBvbmVudCBldmVudCBoYW5kbGVyIixbN106InZub2RlIGhvb2siLFs4XToiZGlyZWN0aXZlIGhvb2siLFs5XToidHJhbnNpdGlvbiBob29rIixbMTBdOiJhcHAgZXJyb3JIYW5kbGVyIixbMTFdOiJhcHAgd2FybkhhbmRsZXIiLFsxMl06InJlZiBmdW5jdGlvbiIsWzEzXToiYXN5bmMgY29tcG9uZW50IGxvYWRlciIsWzE0XToic2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL25ldy1pc3N1ZS52dWVqcy5vcmcvP3JlcG89dnVlanMvY29yZSJ9O2Z1bmN0aW9uIGZuKGksYSxmLHApe3ZhciBTO3RyeXtTPXA/aSguLi5wKTppKCl9Y2F0Y2godyl7Y24odyxhLGYpfXJldHVybiBTfWZ1bmN0aW9uIEt0KGksYSxmLHApe2lmKGQuaXNGdW5jdGlvbihpKSl7dmFyIFM9Zm4oaSxhLGYscCk7cmV0dXJuIFMmJmQuaXNQcm9taXNlKFMpJiZTLmNhdGNoKFY9PntjbihWLGEsZil9KSxTfWZvcih2YXIgdz1bXSxOPTA7TjxpLmxlbmd0aDtOKyspdy5wdXNoKEt0KGlbTl0sYSxmLHApKTtyZXR1cm4gd31mdW5jdGlvbiBjbihpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiEwLFM9YT9hLnZub2RlOm51bGw7aWYoYSl7Zm9yKHZhciB3PWEucGFyZW50LE49YS5wcm94eSxWPURuW2ZdfHxmO3c7KXt2YXIgRj13LmVjO2lmKEYpe2Zvcih2YXIgcT0wO3E8Ri5sZW5ndGg7cSsrKWlmKEZbcV0oaSxOLFYpPT09ITEpcmV0dXJufXc9dy5wYXJlbnR9dmFyIGJlPWEuYXBwQ29udGV4dC5jb25maWcuZXJyb3JIYW5kbGVyO2lmKGJlKXtmbihiZSxudWxsLDEwLFtpLE4sVl0pO3JldHVybn19SXIoaSxmLFMscCl9ZnVuY3Rpb24gSXIoaSxhLGYpe3ZhciBwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMDt7dmFyIFM9RG5bYV18fGE7ZiYmUHQoZiksZ2UoIlVuaGFuZGxlZCBlcnJvciIuY29uY2F0KFM/IiBkdXJpbmcgZXhlY3V0aW9uIG9mICIuY29uY2F0KFMpOiIiKSksZiYmZW4oKSxjb25zb2xlLmVycm9yKGkpfX12YXIgd2k9ITEscW49ITEsaG49W10sVnQ9MCxObj1bXSx5bj1udWxsLHhuPTAsUHI9e3RoZW4oaSl7c2V0VGltZW91dCgoKT0+aSgpLDApfX0sSmU9Qy5wbGF0Zm9ybT09PSJpT1MiLGR0PUplP1ByOlByb21pc2UucmVzb2x2ZSgpLFN0PW51bGwsdG49MTAwO2Z1bmN0aW9uIGtuKGkpe3ZhciBhPVN0fHxkdDtyZXR1cm4gaT9hLnRoZW4odGhpcz9pLmJpbmQodGhpcyk6aSk6YX1mdW5jdGlvbiBadChpKXtmb3IodmFyIGE9VnQrMSxmPWhuLmxlbmd0aDthPGY7KXt2YXIgcD1hK2Y+Pj4xLFM9VmkoaG5bcF0pO1M8aT9hPXArMTpmPXB9cmV0dXJuIGF9ZnVuY3Rpb24gTG4oaSl7KCFobi5sZW5ndGh8fCFobi5pbmNsdWRlcyhpLHdpJiZpLmFsbG93UmVjdXJzZT9WdCsxOlZ0KSkmJihpLmlkPT1udWxsP2huLnB1c2goaSk6aG4uc3BsaWNlKFp0KGkuaWQpLDAsaSksTnIoKSl9ZnVuY3Rpb24gTnIoKXshd2kmJiFxbiYmKHFuPSEwLFN0PWR0LnRoZW4oWW8pKX1mdW5jdGlvbiBVcihpKXt2YXIgYT1obi5pbmRleE9mKGkpO2E+VnQmJmhuLnNwbGljZShhLDEpfWZ1bmN0aW9uIEZpKGkpe2QuaXNBcnJheShpKT9Obi5wdXNoKC4uLmkpOigheW58fCF5bi5pbmNsdWRlcyhpLGkuYWxsb3dSZWN1cnNlP3huKzE6eG4pKSYmTm4ucHVzaChpKSxOcigpfWZ1bmN0aW9uIGxyKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp3aT9WdCsxOjA7Zm9yKGk9aXx8bmV3IE1hcDthPGhuLmxlbmd0aDthKyspe3ZhciBmPWhuW2FdO2lmKGYmJmYucHJlKXtpZihrcihpLGYpKWNvbnRpbnVlO2huLnNwbGljZShhLDEpLGEtLSxmKCl9fX1mdW5jdGlvbiBFcihpKXtpZihObi5sZW5ndGgpe3ZhciBhPVsuLi5uZXcgU2V0KE5uKV07aWYoTm4ubGVuZ3RoPTAseW4pe3luLnB1c2goLi4uYSk7cmV0dXJufWZvcih5bj1hLGk9aXx8bmV3IE1hcCx5bi5zb3J0KChmLHApPT5WaShmKS1WaShwKSkseG49MDt4bjx5bi5sZW5ndGg7eG4rKylrcihpLHluW3huXSl8fHluW3huXSgpO3luPW51bGwseG49MH19dmFyIFZpPWk9PmkuaWQ9PW51bGw/MS8wOmkuaWQsR289KGksYSk9Pnt2YXIgZj1WaShpKS1WaShhKTtpZihmPT09MCl7aWYoaS5wcmUmJiFhLnByZSlyZXR1cm4tMTtpZihhLnByZSYmIWkucHJlKXJldHVybiAxfXJldHVybiBmfTtmdW5jdGlvbiBZbyhpKXtxbj0hMSx3aT0hMCxpPWl8fG5ldyBNYXAsaG4uc29ydChHbyk7dmFyIGE9cD0+a3IoaSxwKTt0cnl7Zm9yKFZ0PTA7VnQ8aG4ubGVuZ3RoO1Z0Kyspe3ZhciBmPWhuW1Z0XTtpZihmJiZmLmFjdGl2ZSE9PSExKXtpZihhKGYpKWNvbnRpbnVlO2ZuKGYsbnVsbCwxNCl9fX1maW5hbGx5e1Z0PTAsaG4ubGVuZ3RoPTAsRXIoaSksd2k9ITEsU3Q9bnVsbCwoaG4ubGVuZ3RofHxObi5sZW5ndGgpJiZZbyhpKX19ZnVuY3Rpb24ga3IoaSxhKXtpZighaS5oYXMoYSkpaS5zZXQoYSwxKTtlbHNle3ZhciBmPWkuZ2V0KGEpO2lmKGY+dG4pe3ZhciBwPWEub3duZXJJbnN0YW5jZSxTPXAmJlNhKHAudHlwZSk7cmV0dXJuIGdlKCJNYXhpbXVtIHJlY3Vyc2l2ZSB1cGRhdGVzIGV4Y2VlZGVkIi5jb25jYXQoUz8iIGluIGNvbXBvbmVudCA8Ii5jb25jYXQoUywiPiIpOiIiLCIuICIpKyJUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLiIpLCEwfWVsc2UgaS5zZXQoYSxmKzEpfX12YXIgUnI9ITEseHI9bmV3IFNldDtkLmdldEdsb2JhbFRoaXMoKS5fX1ZVRV9ITVJfUlVOVElNRV9fPXtjcmVhdGVSZWNvcmQ6c2koJGkpLHJlcmVuZGVyOnNpKElhKSxyZWxvYWQ6c2kobm8pfTt2YXIgVWk9bmV3IE1hcDtmdW5jdGlvbiBZcihpKXt2YXIgYT1pLnR5cGUuX19obXJJZCxmPVVpLmdldChhKTtmfHwoJGkoYSxpLnR5cGUpLGY9VWkuZ2V0KGEpKSxmLmluc3RhbmNlcy5hZGQoaSl9ZnVuY3Rpb24gVGEoaSl7VWkuZ2V0KGkudHlwZS5fX2htcklkKS5pbnN0YW5jZXMuZGVsZXRlKGkpfWZ1bmN0aW9uICRpKGksYSl7cmV0dXJuIFVpLmhhcyhpKT8hMTooVWkuc2V0KGkse2luaXRpYWxEZWY6bW8oYSksaW5zdGFuY2VzOm5ldyBTZXR9KSwhMCl9ZnVuY3Rpb24gbW8oaSl7cmV0dXJuIExsKGkpP2kuX192Y2NPcHRzOml9ZnVuY3Rpb24gSWEoaSxhKXt2YXIgZj1VaS5nZXQoaSk7IWZ8fChmLmluaXRpYWxEZWYucmVuZGVyPWEsWy4uLmYuaW5zdGFuY2VzXS5mb3JFYWNoKHA9PnthJiYocC5yZW5kZXI9YSxtbyhwLnR5cGUpLnJlbmRlcj1hKSxwLnJlbmRlckNhY2hlPVtdLFJyPSEwLHAudXBkYXRlKCksUnI9ITF9KSl9ZnVuY3Rpb24gbm8oaSxhKXt2YXIgZj1VaS5nZXQoaSk7aWYoISFmKXthPW1vKGEpLHFvKGYuaW5pdGlhbERlZixhKTt2YXIgcD1bLi4uZi5pbnN0YW5jZXNdO2Zvcih2YXIgUyBvZiBwKXt2YXIgdz1tbyhTLnR5cGUpO3hyLmhhcyh3KXx8KHchPT1mLmluaXRpYWxEZWYmJnFvKHcsYSkseHIuYWRkKHcpKSxTLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShTLnR5cGUpLFMuY2VSZWxvYWQ/KHhyLmFkZCh3KSxTLmNlUmVsb2FkKGEuc3R5bGVzKSx4ci5kZWxldGUodykpOlMucGFyZW50P0xuKFMucGFyZW50LnVwZGF0ZSk6Uy5hcHBDb250ZXh0LnJlbG9hZD9TLmFwcENvbnRleHQucmVsb2FkKCk6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOmNvbnNvbGUud2FybigiW0hNUl0gUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC4iKX1GaSgoKT0+e2Zvcih2YXIgTiBvZiBwKXhyLmRlbGV0ZShtbyhOLnR5cGUpKX0pfX1mdW5jdGlvbiBxbyhpLGEpe2QuZXh0ZW5kKGksYSk7Zm9yKHZhciBmIGluIGkpZiE9PSJfX2ZpbGUiJiYhKGYgaW4gYSkmJmRlbGV0ZSBpW2ZdfWZ1bmN0aW9uIHNpKGkpe3JldHVybihhLGYpPT57dHJ5e3JldHVybiBpKGEsZil9Y2F0Y2gocCl7Y29uc29sZS5lcnJvcihwKSxjb25zb2xlLndhcm4oIltITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLiIpfX19Qy5kZXZ0b29scz12b2lkIDA7dmFyIFBuPVtdLGNyPSExO2Z1bmN0aW9uIGxpKGkpe2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoLGY9bmV3IEFycmF5KGE+MT9hLTE6MCkscD0xO3A8YTtwKyspZltwLTFdPWFyZ3VtZW50c1twXTtDLmRldnRvb2xzP0MuZGV2dG9vbHMuZW1pdChpLC4uLmYpOmNyfHxQbi5wdXNoKHtldmVudDppLGFyZ3M6Zn0pfWZ1bmN0aW9uIEpuKGksYSl7dmFyIGYscDtpZihDLmRldnRvb2xzPWksQy5kZXZ0b29scylDLmRldnRvb2xzLmVuYWJsZWQ9ITAsUG4uZm9yRWFjaCh3PT57dmFye2V2ZW50Ok4sYXJnczpWfT13O3JldHVybiBDLmRldnRvb2xzLmVtaXQoTiwuLi5WKX0pLFBuPVtdO2Vsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5IVE1MRWxlbWVudCYmISgocD0oZj13aW5kb3cubmF2aWdhdG9yKT09PW51bGx8fGY9PT12b2lkIDA/dm9pZCAwOmYudXNlckFnZW50KT09PW51bGx8fHA9PT12b2lkIDA/dm9pZCAwOnAuaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgUz1hLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189YS5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtTLnB1c2godz0+e0puKHcsYSl9KSxzZXRUaW1lb3V0KCgpPT57Qy5kZXZ0b29sc3x8KGEuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLGNyPSEwLFBuPVtdKX0sM2UzKX1lbHNlIGNyPSEwLFBuPVtdfWZ1bmN0aW9uIEpvKGksYSl7bGkoImFwcDppbml0IixpLGEse0ZyYWdtZW50OnV0LFRleHQ6eHQsQ29tbWVudDpZdCxTdGF0aWM6V259KX1mdW5jdGlvbiB4byhpKXtsaSgiYXBwOnVubW91bnQiLGkpfXZhciBybz1GbigiY29tcG9uZW50OmFkZGVkIiksaW89Rm4oImNvbXBvbmVudDp1cGRhdGVkIikscXI9Rm4oImNvbXBvbmVudDpyZW1vdmVkIiksb289aT0+e0MuZGV2dG9vbHMmJnR5cGVvZiBDLmRldnRvb2xzLmNsZWFudXBCdWZmZXI9PSJmdW5jdGlvbiImJiFDLmRldnRvb2xzLmNsZWFudXBCdWZmZXIoaSkmJnFyKGkpfTtmdW5jdGlvbiBGbihpKXtyZXR1cm4gYT0+e2xpKGksYS5hcHBDb250ZXh0LmFwcCxhLnVpZCxhLnBhcmVudD9hLnBhcmVudC51aWQ6dm9pZCAwLGEpfX12YXIgd3I9S28oInBlcmY6c3RhcnQiKSxjaT1LbygicGVyZjplbmQiKTtmdW5jdGlvbiBLbyhpKXtyZXR1cm4oYSxmLHApPT57bGkoaSxhLmFwcENvbnRleHQuYXBwLGEudWlkLGEsZixwKX19ZnVuY3Rpb24gX28oaSxhLGYpe2xpKCJjb21wb25lbnQ6ZW1pdCIsaS5hcHBDb250ZXh0LmFwcCxpLGEsZil9ZnVuY3Rpb24gWm8oaSxhKXtpZighaS5pc1VubW91bnRlZCl7Zm9yKHZhciBmPWkudm5vZGUucHJvcHN8fGQuRU1QVFlfT0JKLHA9YXJndW1lbnRzLmxlbmd0aCxTPW5ldyBBcnJheShwPjI/cC0yOjApLHc9Mjt3PHA7dysrKVNbdy0yXT1hcmd1bWVudHNbd107e3ZhcntlbWl0c09wdGlvbnM6Tixwcm9wc09wdGlvbnM6W1ZdfT1pO2lmKE4paWYoIShhIGluIE4pKSghVnx8IShkLnRvSGFuZGxlcktleShhKWluIFYpKSYmZ2UoJ0NvbXBvbmVudCBlbWl0dGVkIGV2ZW50ICInLmNvbmNhdChhLCciIGJ1dCBpdCBpcyBuZWl0aGVyIGRlY2xhcmVkIGluICcpKyd0aGUgZW1pdHMgb3B0aW9uIG5vciBhcyBhbiAiJy5jb25jYXQoZC50b0hhbmRsZXJLZXkoYSksJyIgcHJvcC4nKSk7ZWxzZXt2YXIgRj1OW2FdO2lmKGQuaXNGdW5jdGlvbihGKSl7dmFyIHE9RiguLi5TKTtxfHxnZSgnSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCAiJy5jb25jYXQoYSwnIi4nKSl9fX12YXIgYmU9UyxhZT1hLnN0YXJ0c1dpdGgoInVwZGF0ZToiKSxuZT1hZSYmYS5zbGljZSg3KTtpZihuZSYmbmUgaW4gZil7dmFyIEFlPSIiLmNvbmNhdChuZT09PSJtb2RlbFZhbHVlIj8ibW9kZWwiOm5lLCJNb2RpZmllcnMiKSx7bnVtYmVyOkRlLHRyaW06WGV9PWZbQWVdfHxkLkVNUFRZX09CSjtYZSYmKGJlPVMubWFwKExlPT5kLmlzU3RyaW5nKExlKT9MZS50cmltKCk6TGUpKSxEZSYmKGJlPVMubWFwKGQubG9vc2VUb051bWJlcikpfV9vKGksYSxiZSk7e3ZhciBmdD1hLnRvTG93ZXJDYXNlKCk7ZnQhPT1hJiZmW2QudG9IYW5kbGVyS2V5KGZ0KV0mJmdlKCdFdmVudCAiJy5jb25jYXQoZnQsJyIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgJykrIiIuY29uY2F0KGtzKGksaS50eXBlKSwnIGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciAiJykuY29uY2F0KGEsJyIuICcpKyJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSB2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIisnWW91IHNob3VsZCBwcm9iYWJseSB1c2UgIicuY29uY2F0KGQuaHlwaGVuYXRlKGEpLCciIGluc3RlYWQgb2YgIicpLmNvbmNhdChhLCciLicpKX12YXIgVGUsc2U9ZltUZT1kLnRvSGFuZGxlcktleShhKV18fGZbVGU9ZC50b0hhbmRsZXJLZXkoZC5jYW1lbGl6ZShhKSldOyFzZSYmYWUmJihzZT1mW1RlPWQudG9IYW5kbGVyS2V5KGQuaHlwaGVuYXRlKGEpKV0pLHNlJiZLdChzZSxpLDYsYmUpO3ZhciBFZT1mW1RlKyJPbmNlIl07aWYoRWUpe2lmKCFpLmVtaXR0ZWQpaS5lbWl0dGVkPXt9O2Vsc2UgaWYoaS5lbWl0dGVkW1RlXSlyZXR1cm47aS5lbWl0dGVkW1RlXT0hMCxLdChFZSxpLDYsYmUpfX19ZnVuY3Rpb24gSnIoaSxhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEscD1hLmVtaXRzQ2FjaGUsUz1wLmdldChpKTtpZihTIT09dm9pZCAwKXJldHVybiBTO3ZhciB3PWkuZW1pdHMsTj17fSxWPSExO2lmKCFkLmlzRnVuY3Rpb24oaSkpe3ZhciBGPXE9Pnt2YXIgYmU9SnIocSxhLCEwKTtiZSYmKFY9ITAsZC5leHRlbmQoTixiZSkpfTshZiYmYS5taXhpbnMubGVuZ3RoJiZhLm1peGlucy5mb3JFYWNoKEYpLGkuZXh0ZW5kcyYmRihpLmV4dGVuZHMpLGkubWl4aW5zJiZpLm1peGlucy5mb3JFYWNoKEYpfXJldHVybiF3JiYhVj8oZC5pc09iamVjdChpKSYmcC5zZXQoaSxudWxsKSxudWxsKTooZC5pc0FycmF5KHcpP3cuZm9yRWFjaChxPT5OW3FdPW51bGwpOmQuZXh0ZW5kKE4sdyksZC5pc09iamVjdChpKSYmcC5zZXQoaSxOKSxOKX1mdW5jdGlvbiBPbihpLGEpe3JldHVybiFpfHwhZC5pc09uKGEpPyExOihhPWEuc2xpY2UoMikucmVwbGFjZSgvT25jZSQvLCIiKSxkLmhhc093bihpLGFbMF0udG9Mb3dlckNhc2UoKSthLnNsaWNlKDEpKXx8ZC5oYXNPd24oaSxkLmh5cGhlbmF0ZShhKSl8fGQuaGFzT3duKGksYSkpfXZhciBFbj1udWxsLHVpPW51bGw7ZnVuY3Rpb24gQm8oaSl7dmFyIGE9RW47cmV0dXJuIEVuPWksdWk9aSYmaS50eXBlLl9fc2NvcGVJZHx8bnVsbCxhfWZ1bmN0aW9uIFlhKGkpe3VpPWl9ZnVuY3Rpb24gS24oKXt1aT1udWxsfXZhciBLcj1pPT51cjtmdW5jdGlvbiB1cihpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06RW47aWYoIWF8fGkuX24pcmV0dXJuIGk7dmFyIGY9ZnVuY3Rpb24oKXtmLl9kJiZXcygtMSk7dmFyIHA9Qm8oYSksUzt0cnl7Uz1pKC4uLmFyZ3VtZW50cyl9ZmluYWxseXtCbyhwKSxmLl9kJiZXcygxKX1yZXR1cm4gaW8oYSksU307cmV0dXJuIGYuX249ITAsZi5fYz0hMCxmLl9kPSEwLGZ9dmFyIER0PSExO2Z1bmN0aW9uIGtlKCl7RHQ9ITB9ZnVuY3Rpb24gYm8oaSl7dmFye3R5cGU6YSx2bm9kZTpmLHByb3h5OnAsd2l0aFByb3h5OlMscHJvcHM6dyxwcm9wc09wdGlvbnM6W05dLHNsb3RzOlYsYXR0cnM6RixlbWl0OnEscmVuZGVyOmJlLHJlbmRlckNhY2hlOmFlLGRhdGE6bmUsc2V0dXBTdGF0ZTpBZSxjdHg6RGUsaW5oZXJpdEF0dHJzOlhlfT1pLGZ0LFRlLHNlPUJvKGkpO0R0PSExO3RyeXtpZihmLnNoYXBlRmxhZyY0KXt2YXIgRWU9U3x8cDtmdD1tcihiZS5jYWxsKEVlLEVlLGFlLHcsQWUsbmUsRGUpKSxUZT1GfWVsc2V7dmFyIExlPWE7Rj09PXcmJmtlKCksZnQ9bXIoTGUubGVuZ3RoPjE/TGUodyx7Z2V0IGF0dHJzKCl7cmV0dXJuIGtlKCksRn0sc2xvdHM6VixlbWl0OnF9KTpMZSh3LG51bGwpKSxUZT1hLnByb3BzP0Y6cGEoRil9fWNhdGNoKGV0KXtNbi5sZW5ndGg9MCxjbihldCxpLDEpLGZ0PSRuKFl0KX12YXIgRmU9ZnQsaXQ9dm9pZCAwO2lmKGZ0LnBhdGNoRmxhZz4wJiZmdC5wYXRjaEZsYWcmMjA0OCYmKFtGZSxpdF09eW8oZnQpKSxUZSYmWGUhPT0hMSl7dmFyIFR0PU9iamVjdC5rZXlzKFRlKSx7c2hhcGVGbGFnOlFlfT1GZTtpZihUdC5sZW5ndGgpe2lmKFFlJigxfDYpKU4mJlR0LnNvbWUoZC5pc01vZGVsTGlzdGVuZXIpJiYoVGU9WG8oVGUsTikpLEZlPUppKEZlLFRlKTtlbHNlIGlmKCFEdCYmRmUudHlwZSE9PVl0KXtmb3IodmFyIEI9T2JqZWN0LmtleXMoRiksaj1bXSxpZT1bXSx5ZT0wLG9lPUIubGVuZ3RoO3llPG9lO3llKyspe3ZhciB2ZT1CW3llXTtkLmlzT24odmUpP2QuaXNNb2RlbExpc3RlbmVyKHZlKXx8ai5wdXNoKHZlWzJdLnRvTG93ZXJDYXNlKCkrdmUuc2xpY2UoMykpOmllLnB1c2godmUpfWllLmxlbmd0aCYmZ2UoIkV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCIrIiIuY29uY2F0KGllLmpvaW4oIiwgIiksIikgIikrIndlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiIpLGoubGVuZ3RoJiZnZSgiRXh0cmFuZW91cyBub24tZW1pdHMgZXZlbnQgbGlzdGVuZXJzICgiKyIiLmNvbmNhdChqLmpvaW4oIiwgIiksIikgIikrJ3dlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlICJlbWl0cyIgb3B0aW9uLicpfX19cmV0dXJuIGYuZGlycyYmKEhpKEZlKXx8Z2UoIlJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC4iKSxGZT1KaShGZSksRmUuZGlycz1GZS5kaXJzP0ZlLmRpcnMuY29uY2F0KGYuZGlycyk6Zi5kaXJzKSxmLnRyYW5zaXRpb24mJihIaShGZSl8fGdlKCJDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC4iKSxGZS50cmFuc2l0aW9uPWYudHJhbnNpdGlvbiksaXQ/aXQoRmUpOmZ0PUZlLEJvKHNlKSxmdH12YXIgeW89aT0+e3ZhciBhPWkuY2hpbGRyZW4sZj1pLmR5bmFtaWNDaGlsZHJlbixwPUVvKGEpO2lmKCFwKXJldHVybltpLHZvaWQgMF07dmFyIFM9YS5pbmRleE9mKHApLHc9Zj9mLmluZGV4T2YocCk6LTEsTj1WPT57YVtTXT1WLGYmJih3Pi0xP2Zbd109VjpWLnBhdGNoRmxhZz4wJiYoaS5keW5hbWljQ2hpbGRyZW49Wy4uLmYsVl0pKX07cmV0dXJuW21yKHApLE5dfTtmdW5jdGlvbiBFbyhpKXtmb3IodmFyIGEsZj0wO2Y8aS5sZW5ndGg7ZisrKXt2YXIgcD1pW2ZdO2lmKHZyKHApKXtpZihwLnR5cGUhPT1ZdHx8cC5jaGlsZHJlbj09PSJ2LWlmIil7aWYoYSlyZXR1cm47YT1wfX1lbHNlIHJldHVybn1yZXR1cm4gYX12YXIgcGE9aT0+e3ZhciBhO2Zvcih2YXIgZiBpbiBpKShmPT09ImNsYXNzInx8Zj09PSJzdHlsZSJ8fGQuaXNPbihmKSkmJigoYXx8KGE9e30pKVtmXT1pW2ZdKTtyZXR1cm4gYX0sWG89KGksYSk9Pnt2YXIgZj17fTtmb3IodmFyIHAgaW4gaSkoIWQuaXNNb2RlbExpc3RlbmVyKHApfHwhKHAuc2xpY2UoOSlpbiBhKSkmJihmW3BdPWlbcF0pO3JldHVybiBmfSxIaT1pPT5pLnNoYXBlRmxhZyYoNnwxKXx8aS50eXBlPT09WXQ7ZnVuY3Rpb24gd28oaSxhLGYpe3Zhcntwcm9wczpwLGNoaWxkcmVuOlMsY29tcG9uZW50Ond9PWkse3Byb3BzOk4sY2hpbGRyZW46VixwYXRjaEZsYWc6Rn09YSxxPXcuZW1pdHNPcHRpb25zO2lmKChTfHxWKSYmUnJ8fGEuZGlyc3x8YS50cmFuc2l0aW9uKXJldHVybiEwO2lmKGYmJkY+PTApe2lmKEYmMTAyNClyZXR1cm4hMDtpZihGJjE2KXJldHVybiBwP1pyKHAsTixxKTohIU47aWYoRiY4KWZvcih2YXIgYmU9YS5keW5hbWljUHJvcHMsYWU9MDthZTxiZS5sZW5ndGg7YWUrKyl7dmFyIG5lPWJlW2FlXTtpZihOW25lXSE9PXBbbmVdJiYhT24ocSxuZSkpcmV0dXJuITB9fWVsc2UgcmV0dXJuKFN8fFYpJiYoIVZ8fCFWLiRzdGFibGUpPyEwOnA9PT1OPyExOnA/Tj9acihwLE4scSk6ITA6ISFOO3JldHVybiExfWZ1bmN0aW9uIFpyKGksYSxmKXt2YXIgcD1PYmplY3Qua2V5cyhhKTtpZihwLmxlbmd0aCE9PU9iamVjdC5rZXlzKGkpLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIFM9MDtTPHAubGVuZ3RoO1MrKyl7dmFyIHc9cFtTXTtpZihhW3ddIT09aVt3XSYmIU9uKGYsdykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZmkoaSxhKXtmb3IodmFye3Zub2RlOmYscGFyZW50OnB9PWk7cCYmcC5zdWJUcmVlPT09ZjspKGY9cC52bm9kZSkuZWw9YSxwPXAucGFyZW50fXZhciBRbz1pPT5pLl9faXNTdXNwZW5zZSxhbj17bmFtZToiU3VzcGVuc2UiLF9faXNTdXNwZW5zZTohMCxwcm9jZXNzKGksYSxmLHAsUyx3LE4sVixGLHEpe2k9PW51bGw/Z2EoYSxmLHAsUyx3LE4sVixGLHEpOm1uKGksYSxmLHAsUyxOLFYsRixxKX0saHlkcmF0ZTplYSxjcmVhdGU6ZnIsbm9ybWFsaXplOlBhfSxTbz1hbjtmdW5jdGlvbiBkaShpLGEpe3ZhciBmPWkucHJvcHMmJmkucHJvcHNbYV07ZC5pc0Z1bmN0aW9uKGYpJiZmKCl9ZnVuY3Rpb24gZ2EoaSxhLGYscCxTLHcsTixWLEYpe3ZhcntwOnEsbzp7Y3JlYXRlRWxlbWVudDpiZX19PUYsYWU9YmUoImRpdiIsYSksbmU9aS5zdXNwZW5zZT1mcihpLFMscCxhLGFlLGYsdyxOLFYsRik7cShudWxsLG5lLnBlbmRpbmdCcmFuY2g9aS5zc0NvbnRlbnQsYWUsbnVsbCxwLG5lLHcsTiksbmUuZGVwcz4wPyhkaShpLCJvblBlbmRpbmciKSxkaShpLCJvbkZhbGxiYWNrIikscShudWxsLGkuc3NGYWxsYmFjayxhLGYscCxudWxsLHcsTiksWm4obmUsaS5zc0ZhbGxiYWNrKSk6bmUucmVzb2x2ZSgpfWZ1bmN0aW9uIG1uKGksYSxmLHAsUyx3LE4sVixGKXt2YXJ7cDpxLHVtOmJlLG86e2NyZWF0ZUVsZW1lbnQ6YWV9fT1GLG5lPWEuc3VzcGVuc2U9aS5zdXNwZW5zZTtuZS52bm9kZT1hLGEuZWw9aS5lbDt2YXIgQWU9YS5zc0NvbnRlbnQsRGU9YS5zc0ZhbGxiYWNrLHthY3RpdmVCcmFuY2g6WGUscGVuZGluZ0JyYW5jaDpmdCxpc0luRmFsbGJhY2s6VGUsaXNIeWRyYXRpbmc6c2V9PW5lO2lmKGZ0KW5lLnBlbmRpbmdCcmFuY2g9QWUscmkoQWUsZnQpPyhxKGZ0LEFlLG5lLmhpZGRlbkNvbnRhaW5lcixudWxsLFMsbmUsdyxOLFYpLG5lLmRlcHM8PTA/bmUucmVzb2x2ZSgpOlRlJiYocShYZSxEZSxmLHAsUyxudWxsLHcsTixWKSxabihuZSxEZSkpKToobmUucGVuZGluZ0lkKyssc2U/KG5lLmlzSHlkcmF0aW5nPSExLG5lLmFjdGl2ZUJyYW5jaD1mdCk6YmUoZnQsUyxuZSksbmUuZGVwcz0wLG5lLmVmZmVjdHMubGVuZ3RoPTAsbmUuaGlkZGVuQ29udGFpbmVyPWFlKCJkaXYiLGYpLFRlPyhxKG51bGwsQWUsbmUuaGlkZGVuQ29udGFpbmVyLG51bGwsUyxuZSx3LE4sViksbmUuZGVwczw9MD9uZS5yZXNvbHZlKCk6KHEoWGUsRGUsZixwLFMsbnVsbCx3LE4sViksWm4obmUsRGUpKSk6WGUmJnJpKEFlLFhlKT8ocShYZSxBZSxmLHAsUyxuZSx3LE4sViksbmUucmVzb2x2ZSghMCkpOihxKG51bGwsQWUsbmUuaGlkZGVuQ29udGFpbmVyLG51bGwsUyxuZSx3LE4sViksbmUuZGVwczw9MCYmbmUucmVzb2x2ZSgpKSk7ZWxzZSBpZihYZSYmcmkoQWUsWGUpKXEoWGUsQWUsZixwLFMsbmUsdyxOLFYpLFpuKG5lLEFlKTtlbHNlIGlmKGRpKGEsIm9uUGVuZGluZyIpLG5lLnBlbmRpbmdCcmFuY2g9QWUsbmUucGVuZGluZ0lkKysscShudWxsLEFlLG5lLmhpZGRlbkNvbnRhaW5lcixudWxsLFMsbmUsdyxOLFYpLG5lLmRlcHM8PTApbmUucmVzb2x2ZSgpO2Vsc2V7dmFye3RpbWVvdXQ6RWUscGVuZGluZ0lkOkxlfT1uZTtFZT4wP3NldFRpbWVvdXQoKCk9PntuZS5wZW5kaW5nSWQ9PT1MZSYmbmUuZmFsbGJhY2soRGUpfSxFZSk6RWU9PT0wJiZuZS5mYWxsYmFjayhEZSl9fXZhciBCcj0hMTtmdW5jdGlvbiBmcihpLGEsZixwLFMsdyxOLFYsRixxKXt2YXIgYmU9YXJndW1lbnRzLmxlbmd0aD4xMCYmYXJndW1lbnRzWzEwXSE9PXZvaWQgMD9hcmd1bWVudHNbMTBdOiExO0JyfHwoQnI9ITAsY29uc29sZVtjb25zb2xlLmluZm8/ImluZm8iOiJsb2ciXSgiPFN1c3BlbnNlPiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgaXRzIEFQSSB3aWxsIGxpa2VseSBjaGFuZ2UuIikpO3ZhcntwOmFlLG06bmUsdW06QWUsbjpEZSxvOntwYXJlbnROb2RlOlhlLHJlbW92ZTpmdH19PXEsVGU9aS5wcm9wcz9kLnRvTnVtYmVyKGkucHJvcHMudGltZW91dCk6dm9pZCAwO3JlKFRlLCJTdXNwZW5zZSB0aW1lb3V0Iik7dmFyIHNlPXt2bm9kZTppLHBhcmVudDphLHBhcmVudENvbXBvbmVudDpmLGlzU1ZHOk4sY29udGFpbmVyOnAsaGlkZGVuQ29udGFpbmVyOlMsYW5jaG9yOncsZGVwczowLHBlbmRpbmdJZDowLHRpbWVvdXQ6dHlwZW9mIFRlPT0ibnVtYmVyIj9UZTotMSxhY3RpdmVCcmFuY2g6bnVsbCxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiEwLGlzSHlkcmF0aW5nOmJlLGlzVW5tb3VudGVkOiExLGVmZmVjdHM6W10scmVzb2x2ZSgpe3ZhciBFZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITE7e2lmKCFFZSYmIXNlLnBlbmRpbmdCcmFuY2gpdGhyb3cgbmV3IEVycm9yKCJzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC4iKTtpZihzZS5pc1VubW91bnRlZCl0aHJvdyBuZXcgRXJyb3IoInN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgb24gYW4gYWxyZWFkeSB1bm1vdW50ZWQgc3VzcGVuc2UgYm91bmRhcnkuIil9dmFye3Zub2RlOkxlLGFjdGl2ZUJyYW5jaDpGZSxwZW5kaW5nQnJhbmNoOml0LHBlbmRpbmdJZDpUdCxlZmZlY3RzOlFlLHBhcmVudENvbXBvbmVudDpCLGNvbnRhaW5lcjpqfT1zZTtpZihzZS5pc0h5ZHJhdGluZylzZS5pc0h5ZHJhdGluZz0hMTtlbHNlIGlmKCFFZSl7dmFyIGllPUZlJiZpdC50cmFuc2l0aW9uJiZpdC50cmFuc2l0aW9uLm1vZGU9PT0ib3V0LWluIjtpZSYmKEZlLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZT0oKT0+e1R0PT09c2UucGVuZGluZ0lkJiZuZShpdCxqLHllLDApfSk7dmFye2FuY2hvcjp5ZX09c2U7RmUmJih5ZT1EZShGZSksQWUoRmUsQixzZSwhMCkpLGllfHxuZShpdCxqLHllLDApfVpuKHNlLGl0KSxzZS5wZW5kaW5nQnJhbmNoPW51bGwsc2UuaXNJbkZhbGxiYWNrPSExO2Zvcih2YXIgb2U9c2UucGFyZW50LHZlPSExO29lOyl7aWYob2UucGVuZGluZ0JyYW5jaCl7b2UuZWZmZWN0cy5wdXNoKC4uLlFlKSx2ZT0hMDticmVha31vZT1vZS5wYXJlbnR9dmV8fEZpKFFlKSxzZS5lZmZlY3RzPVtdLGRpKExlLCJvblJlc29sdmUiKX0sZmFsbGJhY2soRWUpe2lmKCEhc2UucGVuZGluZ0JyYW5jaCl7dmFye3Zub2RlOkxlLGFjdGl2ZUJyYW5jaDpGZSxwYXJlbnRDb21wb25lbnQ6aXQsY29udGFpbmVyOlR0LGlzU1ZHOlFlfT1zZTtkaShMZSwib25GYWxsYmFjayIpO3ZhciBCPURlKEZlKSxqPSgpPT57IXNlLmlzSW5GYWxsYmFja3x8KGFlKG51bGwsRWUsVHQsQixpdCxudWxsLFFlLFYsRiksWm4oc2UsRWUpKX0saWU9RWUudHJhbnNpdGlvbiYmRWUudHJhbnNpdGlvbi5tb2RlPT09Im91dC1pbiI7aWUmJihGZS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9aiksc2UuaXNJbkZhbGxiYWNrPSEwLEFlKEZlLGl0LG51bGwsITApLGllfHxqKCl9fSxtb3ZlKEVlLExlLEZlKXtzZS5hY3RpdmVCcmFuY2gmJm5lKHNlLmFjdGl2ZUJyYW5jaCxFZSxMZSxGZSksc2UuY29udGFpbmVyPUVlfSxuZXh0KCl7cmV0dXJuIHNlLmFjdGl2ZUJyYW5jaCYmRGUoc2UuYWN0aXZlQnJhbmNoKX0scmVnaXN0ZXJEZXAoRWUsTGUpe3ZhciBGZT0hIXNlLnBlbmRpbmdCcmFuY2g7RmUmJnNlLmRlcHMrKzt2YXIgaXQ9RWUudm5vZGUuZWw7RWUuYXN5bmNEZXAuY2F0Y2goVHQ9PntjbihUdCxFZSwwKX0pLnRoZW4oVHQ9PntpZighKEVlLmlzVW5tb3VudGVkfHxzZS5pc1VubW91bnRlZHx8c2UucGVuZGluZ0lkIT09RWUuc3VzcGVuc2VJZCkpe0VlLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOlFlfT1FZTtQdChRZSksUWEoRWUsVHQsITEpLGl0JiYoUWUuZWw9aXQpO3ZhciBCPSFpdCYmRWUuc3ViVHJlZS5lbDtMZShFZSxRZSxYZShpdHx8RWUuc3ViVHJlZS5lbCksaXQ/bnVsbDpEZShFZS5zdWJUcmVlKSxzZSxOLEYpLEImJmZ0KEIpLGZpKEVlLFFlLmVsKSxlbigpLEZlJiYtLXNlLmRlcHM9PT0wJiZzZS5yZXNvbHZlKCl9fSl9LHVubW91bnQoRWUsTGUpe3NlLmlzVW5tb3VudGVkPSEwLHNlLmFjdGl2ZUJyYW5jaCYmQWUoc2UuYWN0aXZlQnJhbmNoLGYsRWUsTGUpLHNlLnBlbmRpbmdCcmFuY2gmJkFlKHNlLnBlbmRpbmdCcmFuY2gsZixFZSxMZSl9fTtyZXR1cm4gc2V9ZnVuY3Rpb24gZWEoaSxhLGYscCxTLHcsTixWLEYpe3ZhciBxPWEuc3VzcGVuc2U9ZnIoYSxwLGYsaS5wYXJlbnROb2RlLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG51bGwsUyx3LE4sViwhMCksYmU9RihpLHEucGVuZGluZ0JyYW5jaD1hLnNzQ29udGVudCxmLHEsdyxOKTtyZXR1cm4gcS5kZXBzPT09MCYmcS5yZXNvbHZlKCksYmV9ZnVuY3Rpb24gUGEoaSl7dmFye3NoYXBlRmxhZzphLGNoaWxkcmVuOmZ9PWkscD1hJjMyO2kuc3NDb250ZW50PXRhKHA/Zi5kZWZhdWx0OmYpLGkuc3NGYWxsYmFjaz1wP3RhKGYuZmFsbGJhY2spOiRuKFl0KX1mdW5jdGlvbiB0YShpKXt2YXIgYTtpZihkLmlzRnVuY3Rpb24oaSkpe3ZhciBmPSRvJiZpLl9jO2YmJihpLl9kPSExLHdhKCkpLGk9aSgpLGYmJihpLl9kPSEwLGE9bnIsa2koKSl9aWYoZC5pc0FycmF5KGkpKXt2YXIgcD1FbyhpKTtwfHxnZSgiPFN1c3BlbnNlPiBzbG90cyBleHBlY3QgYSBzaW5nbGUgcm9vdCBub2RlLiIpLGk9cH1yZXR1cm4gaT1tcihpKSxhJiYhaS5keW5hbWljQ2hpbGRyZW4mJihpLmR5bmFtaWNDaGlsZHJlbj1hLmZpbHRlcihTPT5TIT09aSkpLGl9ZnVuY3Rpb24gYW8oaSxhKXthJiZhLnBlbmRpbmdCcmFuY2g/ZC5pc0FycmF5KGkpP2EuZWZmZWN0cy5wdXNoKC4uLmkpOmEuZWZmZWN0cy5wdXNoKGkpOkZpKGkpfWZ1bmN0aW9uIFpuKGksYSl7aS5hY3RpdmVCcmFuY2g9YTt2YXJ7dm5vZGU6ZixwYXJlbnRDb21wb25lbnQ6cH09aSxTPWYuZWw9YS5lbDtwJiZwLnN1YlRyZWU9PT1mJiYocC52bm9kZS5lbD1TLGZpKHAsUykpfWZ1bmN0aW9uIG9yKGksYSl7aWYoIVNuKWdlKCJwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS4iKTtlbHNle3ZhciBmPVNuLnByb3ZpZGVzLHA9U24ucGFyZW50JiZTbi5wYXJlbnQucHJvdmlkZXM7cD09PWYmJihmPVNuLnByb3ZpZGVzPU9iamVjdC5jcmVhdGUocCkpLGZbaV09YSxTbi50eXBlLm1wVHlwZT09PSJhcHAiJiZTbi5hcHBDb250ZXh0LmFwcC5wcm92aWRlKGksYSl9fWZ1bmN0aW9uIFZuKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9U258fEVuO2lmKHApe3ZhciBTPXAucGFyZW50PT1udWxsP3Audm5vZGUuYXBwQ29udGV4dCYmcC52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnAucGFyZW50LnByb3ZpZGVzO2lmKFMmJmkgaW4gUylyZXR1cm4gU1tpXTtpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIGYmJmQuaXNGdW5jdGlvbihhKT9hLmNhbGwocC5wcm94eSk6YTtnZSgnaW5qZWN0aW9uICInLmNvbmNhdChTdHJpbmcoaSksJyIgbm90IGZvdW5kLicpKX1lbHNlIGdlKCJpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy4iKX1mdW5jdGlvbiBYcihpLGEpe3JldHVybiBzbyhpLG51bGwsYSl9ZnVuY3Rpb24gaGkoaSxhKXtyZXR1cm4gc28oaSxudWxsLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Zmx1c2g6InBvc3QifSkpfWZ1bmN0aW9uIG5hKGksYSl7cmV0dXJuIHNvKGksbnVsbCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2ZsdXNoOiJzeW5jIn0pKX12YXIgU2k9e307ZnVuY3Rpb24gQ2koaSxhLGYpe3JldHVybiBkLmlzRnVuY3Rpb24oYSl8fGdlKCJgd2F0Y2goZm4sIG9wdGlvbnM/KWAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBVc2UgYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylgIGluc3RlYWQuIGB3YXRjaGAgbm93IG9ubHkgc3VwcG9ydHMgYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuIiksc28oaSxhLGYpfWZ1bmN0aW9uIHNvKGksYSl7dmFye2ltbWVkaWF0ZTpmLGRlZXA6cCxmbHVzaDpTLG9uVHJhY2s6dyxvblRyaWdnZXI6Tn09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOmQuRU1QVFlfT0JKO2F8fChmIT09dm9pZCAwJiZnZSgnd2F0Y2goKSAiaW1tZWRpYXRlIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS4nKSxwIT09dm9pZCAwJiZnZSgnd2F0Y2goKSAiZGVlcCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuJykpO3ZhciBWPWl0PT57Z2UoIkludmFsaWQgd2F0Y2ggc291cmNlOiAiLGl0LCJBIHdhdGNoIHNvdXJjZSBjYW4gb25seSBiZSBhIGdldHRlci9lZmZlY3QgZnVuY3Rpb24sIGEgcmVmLCBhIHJlYWN0aXZlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgdGhlc2UgdHlwZXMuIil9LEY9bS5nZXRDdXJyZW50U2NvcGUoKT09PShTbj09bnVsbD92b2lkIDA6U24uc2NvcGUpP1NuOm51bGwscSxiZT0hMSxhZT0hMTtpZihtLmlzUmVmKGkpPyhxPSgpPT5pLnZhbHVlLGJlPW0uaXNTaGFsbG93KGkpKTptLmlzUmVhY3RpdmUoaSk/KHE9KCk9PmkscD0hMCk6ZC5pc0FycmF5KGkpPyhhZT0hMCxiZT1pLnNvbWUoaXQ9Pm0uaXNSZWFjdGl2ZShpdCl8fG0uaXNTaGFsbG93KGl0KSkscT0oKT0+aS5tYXAoaXQ9PntpZihtLmlzUmVmKGl0KSlyZXR1cm4gaXQudmFsdWU7aWYobS5pc1JlYWN0aXZlKGl0KSlyZXR1cm4gamkoaXQpO2lmKGQuaXNGdW5jdGlvbihpdCkpcmV0dXJuIGZuKGl0LEYsMik7VihpdCl9KSk6ZC5pc0Z1bmN0aW9uKGkpP2E/cT0oKT0+Zm4oaSxGLDIpOnE9KCk9PntpZighKEYmJkYuaXNVbm1vdW50ZWQpKXJldHVybiBBZSYmQWUoKSxLdChpLEYsMyxbRGVdKX06KHE9ZC5OT09QLFYoaSkpLGEmJnApe3ZhciBuZT1xO3E9KCk9PmppKG5lKCkpfXZhciBBZSxEZT1pdD0+e0FlPUxlLm9uU3RvcD0oKT0+e2ZuKGl0LEYsNCl9fSxYZTtpZihDLmlzSW5TU1JDb21wb25lbnRTZXR1cClpZihEZT1kLk5PT1AsYT9mJiZLdChhLEYsMyxbcSgpLGFlP1tdOnZvaWQgMCxEZV0pOnEoKSxTPT09InN5bmMiKXt2YXIgZnQ9UnMoKTtYZT1mdC5fX3dhdGNoZXJIYW5kbGVzfHwoZnQuX193YXRjaGVySGFuZGxlcz1bXSl9ZWxzZSByZXR1cm4gZC5OT09QO3ZhciBUZT1hZT9uZXcgQXJyYXkoaS5sZW5ndGgpLmZpbGwoU2kpOlNpLHNlPSgpPT57aWYoISFMZS5hY3RpdmUpaWYoYSl7dmFyIGl0PUxlLnJ1bigpOyhwfHxiZXx8KGFlP2l0LnNvbWUoKFR0LFFlKT0+ZC5oYXNDaGFuZ2VkKFR0LFRlW1FlXSkpOmQuaGFzQ2hhbmdlZChpdCxUZSkpKSYmKEFlJiZBZSgpLEt0KGEsRiwzLFtpdCxUZT09PVNpP3ZvaWQgMDphZSYmVGVbMF09PT1TaT9bXTpUZSxEZV0pLFRlPWl0KX1lbHNlIExlLnJ1bigpfTtzZS5hbGxvd1JlY3Vyc2U9ISFhO3ZhciBFZTtTPT09InN5bmMiP0VlPXNlOlM9PT0icG9zdCI/RWU9KCk9PkFyKHNlLEYmJkYuc3VzcGVuc2UpOihzZS5wcmU9ITAsRiYmKHNlLmlkPUYudWlkKSxFZT0oKT0+TG4oc2UpKTt2YXIgTGU9bmV3IG0uUmVhY3RpdmVFZmZlY3QocSxFZSk7TGUub25UcmFjaz13LExlLm9uVHJpZ2dlcj1OLGE/Zj9zZSgpOlRlPUxlLnJ1bigpOlM9PT0icG9zdCI/QXIoTGUucnVuLmJpbmQoTGUpLEYmJkYuc3VzcGVuc2UpOkxlLnJ1bigpO3ZhciBGZT0oKT0+e0xlLnN0b3AoKSxGJiZGLnNjb3BlJiZkLnJlbW92ZShGLnNjb3BlLmVmZmVjdHMsTGUpfTtyZXR1cm4gWGUmJlhlLnB1c2goRmUpLEZlfWZ1bmN0aW9uIHZhKGksYSxmKXt2YXIgcD10aGlzLnByb3h5LFM9ZC5pc1N0cmluZyhpKT9pLmluY2x1ZGVzKCIuIik/T2kocCxpKTooKT0+cFtpXTppLmJpbmQocCxwKSx3O2QuaXNGdW5jdGlvbihhKT93PWE6KHc9YS5oYW5kbGVyLGY9YSk7dmFyIE49U247X2kodGhpcyk7dmFyIFY9c28oUyx3LmJpbmQocCksZik7cmV0dXJuIE4/X2koTik6YWEoKSxWfWZ1bmN0aW9uIE9pKGksYSl7dmFyIGY9YS5zcGxpdCgiLiIpO3JldHVybigpPT57Zm9yKHZhciBwPWksUz0wO1M8Zi5sZW5ndGgmJnA7UysrKXA9cFtmW1NdXTtyZXR1cm4gcH19ZnVuY3Rpb24gamkoaSxhKXtpZighZC5pc09iamVjdChpKXx8aS5fX3Zfc2tpcHx8KGE9YXx8bmV3IFNldCxhLmhhcyhpKSkpcmV0dXJuIGk7aWYoYS5hZGQoaSksbS5pc1JlZihpKSlqaShpLnZhbHVlLGEpO2Vsc2UgaWYoZC5pc0FycmF5KGkpKWZvcih2YXIgZj0wO2Y8aS5sZW5ndGg7ZisrKWppKGlbZl0sYSk7ZWxzZSBpZihkLmlzU2V0KGkpfHxkLmlzTWFwKGkpKWkuZm9yRWFjaChTPT57amkoUyxhKX0pO2Vsc2UgaWYoZC5pc1BsYWluT2JqZWN0KGkpKWZvcih2YXIgcCBpbiBpKWppKGlbcF0sYSk7cmV0dXJuIGl9ZnVuY3Rpb24gZHIoKXt2YXIgaT17aXNNb3VudGVkOiExLGlzTGVhdmluZzohMSxpc1VubW91bnRpbmc6ITEsbGVhdmluZ1ZOb2RlczpuZXcgTWFwfTtyZXR1cm4gZm8oKCk9PntpLmlzTW91bnRlZD0hMH0pLERyKCgpPT57aS5pc1VubW91bnRpbmc9ITB9KSxpfXZhciBTcj1bRnVuY3Rpb24sQXJyYXldLGxvPXttb2RlOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixwZXJzaXN0ZWQ6Qm9vbGVhbixvbkJlZm9yZUVudGVyOlNyLG9uRW50ZXI6U3Isb25BZnRlckVudGVyOlNyLG9uRW50ZXJDYW5jZWxsZWQ6U3Isb25CZWZvcmVMZWF2ZTpTcixvbkxlYXZlOlNyLG9uQWZ0ZXJMZWF2ZTpTcixvbkxlYXZlQ2FuY2VsbGVkOlNyLG9uQmVmb3JlQXBwZWFyOlNyLG9uQXBwZWFyOlNyLG9uQWZ0ZXJBcHBlYXI6U3Isb25BcHBlYXJDYW5jZWxsZWQ6U3J9LE1vPXtuYW1lOiJCYXNlVHJhbnNpdGlvbiIscHJvcHM6bG8sc2V0dXAoaSxhKXt2YXJ7c2xvdHM6Zn09YSxwPW1pKCksUz1kcigpLHc7cmV0dXJuKCk9Pnt2YXIgTj1mLmRlZmF1bHQmJm1lKGYuZGVmYXVsdCgpLCEwKTtpZighKCFOfHwhTi5sZW5ndGgpKXt2YXIgVj1OWzBdO2lmKE4ubGVuZ3RoPjEpe3ZhciBGPSExO2Zvcih2YXIgcSBvZiBOKWlmKHEudHlwZSE9PVl0KXtpZihGKXtnZSgiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLiIpO2JyZWFrfVY9cSxGPSEwfX12YXIgYmU9bS50b1JhdyhpKSx7bW9kZTphZX09YmU7aWYoYWUmJmFlIT09ImluLW91dCImJmFlIT09Im91dC1pbiImJmFlIT09ImRlZmF1bHQiJiZnZSgiaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogIi5jb25jYXQoYWUpKSxTLmlzTGVhdmluZylyZXR1cm4gRG8oVik7dmFyIG5lPUQoVik7aWYoIW5lKXJldHVybiBEbyhWKTt2YXIgQWU9cGkobmUsYmUsUyxwKTtaKG5lLEFlKTt2YXIgRGU9cC5zdWJUcmVlLFhlPURlJiZEKERlKSxmdD0hMSx7Z2V0VHJhbnNpdGlvbktleTpUZX09bmUudHlwZTtpZihUZSl7dmFyIHNlPVRlKCk7dz09PXZvaWQgMD93PXNlOnNlIT09dyYmKHc9c2UsZnQ9ITApfWlmKFhlJiZYZS50eXBlIT09WXQmJighcmkobmUsWGUpfHxmdCkpe3ZhciBFZT1waShYZSxiZSxTLHApO2lmKFooWGUsRWUpLGFlPT09Im91dC1pbiIpcmV0dXJuIFMuaXNMZWF2aW5nPSEwLEVlLmFmdGVyTGVhdmU9KCk9PntTLmlzTGVhdmluZz0hMSxwLnVwZGF0ZS5hY3RpdmUhPT0hMSYmcC51cGRhdGUoKX0sRG8oVik7YWU9PT0iaW4tb3V0IiYmbmUudHlwZSE9PVl0JiYoRWUuZGVsYXlMZWF2ZT0oTGUsRmUsaXQpPT57dmFyIFR0PUFpKFMsWGUpO1R0W1N0cmluZyhYZS5rZXkpXT1YZSxMZS5fbGVhdmVDYj0oKT0+e0ZlKCksTGUuX2xlYXZlQ2I9dm9pZCAwLGRlbGV0ZSBBZS5kZWxheWVkTGVhdmV9LEFlLmRlbGF5ZWRMZWF2ZT1pdH0pfXJldHVybiBWfX19fSxDbz1NbztmdW5jdGlvbiBBaShpLGEpe3ZhcntsZWF2aW5nVk5vZGVzOmZ9PWkscD1mLmdldChhLnR5cGUpO3JldHVybiBwfHwocD1PYmplY3QuY3JlYXRlKG51bGwpLGYuc2V0KGEudHlwZSxwKSkscH1mdW5jdGlvbiBwaShpLGEsZixwKXt2YXJ7YXBwZWFyOlMsbW9kZTp3LHBlcnNpc3RlZDpOPSExLG9uQmVmb3JlRW50ZXI6VixvbkVudGVyOkYsb25BZnRlckVudGVyOnEsb25FbnRlckNhbmNlbGxlZDpiZSxvbkJlZm9yZUxlYXZlOmFlLG9uTGVhdmU6bmUsb25BZnRlckxlYXZlOkFlLG9uTGVhdmVDYW5jZWxsZWQ6RGUsb25CZWZvcmVBcHBlYXI6WGUsb25BcHBlYXI6ZnQsb25BZnRlckFwcGVhcjpUZSxvbkFwcGVhckNhbmNlbGxlZDpzZX09YSxFZT1TdHJpbmcoaS5rZXkpLExlPUFpKGYsaSksRmU9KFFlLEIpPT57UWUmJkt0KFFlLHAsOSxCKX0saXQ9KFFlLEIpPT57dmFyIGo9QlsxXTtGZShRZSxCKSxkLmlzQXJyYXkoUWUpP1FlLmV2ZXJ5KGllPT5pZS5sZW5ndGg8PTEpJiZqKCk6UWUubGVuZ3RoPD0xJiZqKCl9LFR0PXttb2RlOncscGVyc2lzdGVkOk4sYmVmb3JlRW50ZXIoUWUpe3ZhciBCPVY7aWYoIWYuaXNNb3VudGVkKWlmKFMpQj1YZXx8VjtlbHNlIHJldHVybjtRZS5fbGVhdmVDYiYmUWUuX2xlYXZlQ2IoITApO3ZhciBqPUxlW0VlXTtqJiZyaShpLGopJiZqLmVsLl9sZWF2ZUNiJiZqLmVsLl9sZWF2ZUNiKCksRmUoQixbUWVdKX0sZW50ZXIoUWUpe3ZhciBCPUYsaj1xLGllPWJlO2lmKCFmLmlzTW91bnRlZClpZihTKUI9ZnR8fEYsaj1UZXx8cSxpZT1zZXx8YmU7ZWxzZSByZXR1cm47dmFyIHllPSExLG9lPVFlLl9lbnRlckNiPXZlPT57eWV8fCh5ZT0hMCx2ZT9GZShpZSxbUWVdKTpGZShqLFtRZV0pLFR0LmRlbGF5ZWRMZWF2ZSYmVHQuZGVsYXllZExlYXZlKCksUWUuX2VudGVyQ2I9dm9pZCAwKX07Qj9pdChCLFtRZSxvZV0pOm9lKCl9LGxlYXZlKFFlLEIpe3ZhciBqPVN0cmluZyhpLmtleSk7aWYoUWUuX2VudGVyQ2ImJlFlLl9lbnRlckNiKCEwKSxmLmlzVW5tb3VudGluZylyZXR1cm4gQigpO0ZlKGFlLFtRZV0pO3ZhciBpZT0hMSx5ZT1RZS5fbGVhdmVDYj1vZT0+e2llfHwoaWU9ITAsQigpLG9lP0ZlKERlLFtRZV0pOkZlKEFlLFtRZV0pLFFlLl9sZWF2ZUNiPXZvaWQgMCxMZVtqXT09PWkmJmRlbGV0ZSBMZVtqXSl9O0xlW2pdPWksbmU/aXQobmUsW1FlLHllXSk6eWUoKX0sY2xvbmUoUWUpe3JldHVybiBwaShRZSxhLGYscCl9fTtyZXR1cm4gVHR9ZnVuY3Rpb24gRG8oaSl7aWYoWShpKSlyZXR1cm4gaT1KaShpKSxpLmNoaWxkcmVuPW51bGwsaX1mdW5jdGlvbiBEKGkpe3JldHVybiBZKGkpP2kuY2hpbGRyZW4/aS5jaGlsZHJlblswXTp2b2lkIDA6aX1mdW5jdGlvbiBaKGksYSl7aS5zaGFwZUZsYWcmNiYmaS5jb21wb25lbnQ/WihpLmNvbXBvbmVudC5zdWJUcmVlLGEpOmkuc2hhcGVGbGFnJjEyOD8oaS5zc0NvbnRlbnQudHJhbnNpdGlvbj1hLmNsb25lKGkuc3NDb250ZW50KSxpLnNzRmFsbGJhY2sudHJhbnNpdGlvbj1hLmNsb25lKGkuc3NGYWxsYmFjaykpOmkudHJhbnNpdGlvbj1hfWZ1bmN0aW9uIG1lKGkpe2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITEsZj1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCxwPVtdLFM9MCx3PTA7dzxpLmxlbmd0aDt3Kyspe3ZhciBOPWlbd10sVj1mPT1udWxsP04ua2V5OlN0cmluZyhmKStTdHJpbmcoTi5rZXkhPW51bGw/Ti5rZXk6dyk7Ti50eXBlPT09dXQ/KE4ucGF0Y2hGbGFnJjEyOCYmUysrLHA9cC5jb25jYXQobWUoTi5jaGlsZHJlbixhLFYpKSk6KGF8fE4udHlwZSE9PVl0KSYmcC5wdXNoKFYhPW51bGw/SmkoTix7a2V5OlZ9KTpOKX1pZihTPjEpZm9yKHZhciBGPTA7RjxwLmxlbmd0aDtGKyspcFtGXS5wYXRjaEZsYWc9LTI7cmV0dXJuIHB9ZnVuY3Rpb24gbGUoaSl7cmV0dXJuIGQuaXNGdW5jdGlvbihpKT97c2V0dXA6aSxuYW1lOmkubmFtZX06aX12YXIgaGU9aT0+ISFpLnR5cGUuX19hc3luY0xvYWRlcjtmdW5jdGlvbiBPdChpKXtkLmlzRnVuY3Rpb24oaSkmJihpPXtsb2FkZXI6aX0pO3Zhcntsb2FkZXI6YSxsb2FkaW5nQ29tcG9uZW50OmYsZXJyb3JDb21wb25lbnQ6cCxkZWxheTpTPTIwMCx0aW1lb3V0Oncsc3VzcGVuc2libGU6Tj0hMCxvbkVycm9yOlZ9PWksRj1udWxsLHEsYmU9MCxhZT0oKT0+KGJlKyssRj1udWxsLG5lKCkpLG5lPSgpPT57dmFyIEFlO3JldHVybiBGfHwoQWU9Rj1hKCkuY2F0Y2goRGU9PntpZihEZT1EZSBpbnN0YW5jZW9mIEVycm9yP0RlOm5ldyBFcnJvcihTdHJpbmcoRGUpKSxWKXJldHVybiBuZXcgUHJvbWlzZSgoWGUsZnQpPT57dmFyIFRlPSgpPT5YZShhZSgpKSxzZT0oKT0+ZnQoRGUpO1YoRGUsVGUsc2UsYmUrMSl9KTt0aHJvdyBEZX0pLnRoZW4oRGU9PntpZihBZSE9PUYmJkYpcmV0dXJuIEY7aWYoRGV8fGdlKCJBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gSWYgeW91IGFyZSB1c2luZyByZXRyeSgpLCBtYWtlIHN1cmUgdG8gcmV0dXJuIGl0cyByZXR1cm4gdmFsdWUuIiksRGUmJihEZS5fX2VzTW9kdWxlfHxEZVtTeW1ib2wudG9TdHJpbmdUYWddPT09Ik1vZHVsZSIpJiYoRGU9RGUuZGVmYXVsdCksRGUmJiFkLmlzT2JqZWN0KERlKSYmIWQuaXNGdW5jdGlvbihEZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogIi5jb25jYXQoRGUpKTtyZXR1cm4gcT1EZSxEZX0pKX07cmV0dXJuIGxlKHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6bmUsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBxfSxzZXR1cCgpe3ZhciBBZT1TbjtpZihxKXJldHVybigpPT5LKHEsQWUpO3ZhciBEZT1zZT0+e0Y9bnVsbCxjbihzZSxBZSwxMywhcCl9O2lmKE4mJkFlLnN1c3BlbnNlfHxDLmlzSW5TU1JDb21wb25lbnRTZXR1cClyZXR1cm4gbmUoKS50aGVuKHNlPT4oKT0+SyhzZSxBZSkpLmNhdGNoKHNlPT4oRGUoc2UpLCgpPT5wPyRuKHAse2Vycm9yOnNlfSk6bnVsbCkpO3ZhciBYZT1tLnJlZighMSksZnQ9bS5yZWYoKSxUZT1tLnJlZighIVMpO3JldHVybiBTJiZzZXRUaW1lb3V0KCgpPT57VGUudmFsdWU9ITF9LFMpLHchPW51bGwmJnNldFRpbWVvdXQoKCk9PntpZighWGUudmFsdWUmJiFmdC52YWx1ZSl7dmFyIHNlPW5ldyBFcnJvcigiQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAiLmNvbmNhdCh3LCJtcy4iKSk7RGUoc2UpLGZ0LnZhbHVlPXNlfX0sdyksbmUoKS50aGVuKCgpPT57WGUudmFsdWU9ITAsQWUucGFyZW50JiZZKEFlLnBhcmVudC52bm9kZSkmJkxuKEFlLnBhcmVudC51cGRhdGUpfSkuY2F0Y2goc2U9PntEZShzZSksZnQudmFsdWU9c2V9KSwoKT0+e2lmKFhlLnZhbHVlJiZxKXJldHVybiBLKHEsQWUpO2lmKGZ0LnZhbHVlJiZwKXJldHVybiAkbihwLHtlcnJvcjpmdC52YWx1ZX0pO2lmKGYmJiFUZS52YWx1ZSlyZXR1cm4gJG4oZil9fX0pfWZ1bmN0aW9uIEsoaSxhKXt2YXJ7cmVmOmYscHJvcHM6cCxjaGlsZHJlbjpTLGNlOnd9PWEudm5vZGUsTj0kbihpLHAsUyk7cmV0dXJuIE4ucmVmPWYsTi5jZT13LGRlbGV0ZSBhLnZub2RlLmNlLE59dmFyIFk9aT0+aS50eXBlLl9faXNLZWVwQWxpdmUsY2U9e25hbWU6IktlZXBBbGl2ZSIsX19pc0tlZXBBbGl2ZTohMCxwcm9wczp7aW5jbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sZXhjbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sbWF4OltTdHJpbmcsTnVtYmVyXX0sc2V0dXAoaSxhKXt2YXJ7c2xvdHM6Zn09YSxwPW1pKCksUz1wLmN0eDtpZighUy5yZW5kZXJlcilyZXR1cm4oKT0+e3ZhciBFZT1mLmRlZmF1bHQmJmYuZGVmYXVsdCgpO3JldHVybiBFZSYmRWUubGVuZ3RoPT09MT9FZVswXTpFZX07dmFyIHc9bmV3IE1hcCxOPW5ldyBTZXQsVj1udWxsO3AuX192X2NhY2hlPXc7dmFyIEY9cC5zdXNwZW5zZSx7cmVuZGVyZXI6e3A6cSxtOmJlLHVtOmFlLG86e2NyZWF0ZUVsZW1lbnQ6bmV9fX09UyxBZT1uZSgiZGl2IixudWxsKTtTLmFjdGl2YXRlPShFZSxMZSxGZSxpdCxUdCk9Pnt2YXIgUWU9RWUuY29tcG9uZW50O2JlKEVlLExlLEZlLDAsRikscShRZS52bm9kZSxFZSxMZSxGZSxRZSxGLGl0LEVlLnNsb3RTY29wZUlkcyxUdCksQXIoKCk9PntRZS5pc0RlYWN0aXZhdGVkPSExLFFlLmEmJmQuaW52b2tlQXJyYXlGbnMoUWUuYSk7dmFyIEI9RWUucHJvcHMmJkVlLnByb3BzLm9uVm5vZGVNb3VudGVkO0ImJmpyKEIsUWUucGFyZW50LEVlKX0sRikscm8oUWUpfSxTLmRlYWN0aXZhdGU9RWU9Pnt2YXIgTGU9RWUuY29tcG9uZW50O2JlKEVlLEFlLG51bGwsMSxGKSxBcigoKT0+e0xlLmRhJiZkLmludm9rZUFycmF5Rm5zKExlLmRhKTt2YXIgRmU9RWUucHJvcHMmJkVlLnByb3BzLm9uVm5vZGVVbm1vdW50ZWQ7RmUmJmpyKEZlLExlLnBhcmVudCxFZSksTGUuaXNEZWFjdGl2YXRlZD0hMH0sRikscm8oTGUpfTtmdW5jdGlvbiBEZShFZSl7TXIoRWUpLGFlKEVlLHAsRiwhMCl9ZnVuY3Rpb24gWGUoRWUpe3cuZm9yRWFjaCgoTGUsRmUpPT57dmFyIGl0PVNhKExlLnR5cGUpO2l0JiYoIUVlfHwhRWUoaXQpKSYmZnQoRmUpfSl9ZnVuY3Rpb24gZnQoRWUpe3ZhciBMZT13LmdldChFZSk7IVZ8fCFyaShMZSxWKT9EZShMZSk6ViYmTXIoViksdy5kZWxldGUoRWUpLE4uZGVsZXRlKEVlKX1DaSgoKT0+W2kuaW5jbHVkZSxpLmV4Y2x1ZGVdLEVlPT57dmFyW0xlLEZlXT1FZTtMZSYmWGUoaXQ9Pmx0KExlLGl0KSksRmUmJlhlKGl0PT4hbHQoRmUsaXQpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIFRlPW51bGwsc2U9KCk9PntUZSE9bnVsbCYmdy5zZXQoVGUsY28ocC5zdWJUcmVlKSl9O3JldHVybiBmbyhzZSksUW4oc2UpLERyKCgpPT57dy5mb3JFYWNoKEVlPT57dmFye3N1YlRyZWU6TGUsc3VzcGVuc2U6RmV9PXAsaXQ9Y28oTGUpO2lmKEVlLnR5cGU9PT1pdC50eXBlJiZFZS5rZXk9PT1pdC5rZXkpe01yKGl0KTt2YXIgVHQ9aXQuY29tcG9uZW50LmRhO1R0JiZBcihUdCxGZSk7cmV0dXJufURlKEVlKX0pfSksKCk9PntpZihUZT1udWxsLCFmLmRlZmF1bHQpcmV0dXJuIG51bGw7dmFyIEVlPWYuZGVmYXVsdCgpLExlPUVlWzBdO2lmKEVlLmxlbmd0aD4xKXJldHVybiBnZSgiS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC4iKSxWPW51bGwsRWU7aWYoIXZyKExlKXx8IShMZS5zaGFwZUZsYWcmNCkmJiEoTGUuc2hhcGVGbGFnJjEyOCkpcmV0dXJuIFY9bnVsbCxMZTt2YXIgRmU9Y28oTGUpLGl0PUZlLnR5cGUsVHQ9U2EoaGUoRmUpP0ZlLnR5cGUuX19hc3luY1Jlc29sdmVkfHx7fTppdCkse2luY2x1ZGU6UWUsZXhjbHVkZTpCLG1heDpqfT1pO2lmKFFlJiYoIVR0fHwhbHQoUWUsVHQpKXx8QiYmVHQmJmx0KEIsVHQpKXJldHVybiBWPUZlLExlO3ZhciBpZT1GZS5rZXk9PW51bGw/aXQ6RmUua2V5LHllPXcuZ2V0KGllKTtyZXR1cm4gRmUuZWwmJihGZT1KaShGZSksTGUuc2hhcGVGbGFnJjEyOCYmKExlLnNzQ29udGVudD1GZSkpLFRlPWllLHllPyhGZS5lbD15ZS5lbCxGZS5jb21wb25lbnQ9eWUuY29tcG9uZW50LEZlLnRyYW5zaXRpb24mJlooRmUsRmUudHJhbnNpdGlvbiksRmUuc2hhcGVGbGFnfD01MTIsTi5kZWxldGUoaWUpLE4uYWRkKGllKSk6KE4uYWRkKGllKSxqJiZOLnNpemU+cGFyc2VJbnQoaiwxMCkmJmZ0KE4udmFsdWVzKCkubmV4dCgpLnZhbHVlKSksRmUuc2hhcGVGbGFnfD0yNTYsVj1GZSxRbyhMZS50eXBlKT9MZTpGZX19fSx4ZT1jZTtmdW5jdGlvbiBsdChpLGEpe3JldHVybiBkLmlzQXJyYXkoaSk/aS5zb21lKGY9Pmx0KGYsYSkpOmQuaXNTdHJpbmcoaSk/aS5zcGxpdCgiLCIpLmluY2x1ZGVzKGEpOmQuaXNSZWdFeHAoaSk/aS50ZXN0KGEpOiExfWZ1bmN0aW9uIHp0KGksYSl7WG4oaSwiYSIsYSl9ZnVuY3Rpb24gQW4oaSxhKXtYbihpLCJkYSIsYSl9ZnVuY3Rpb24gWG4oaSxhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06U24scD1pLl9fd2RjfHwoaS5fX3dkYz0oKT0+e2Zvcih2YXIgdz1mO3c7KXtpZih3LmlzRGVhY3RpdmF0ZWQpcmV0dXJuO3c9dy5wYXJlbnR9cmV0dXJuIGkoKX0pO2lmKGdyKGEscCxmKSxmKWZvcih2YXIgUz1mLnBhcmVudDtTJiZTLnBhcmVudDspWShTLnBhcmVudC52bm9kZSkmJlFyKHAsYSxmLFMpLFM9Uy5wYXJlbnR9ZnVuY3Rpb24gUXIoaSxhLGYscCl7dmFyIFM9Z3IoYSxpLHAsITApO3FhKCgpPT57ZC5yZW1vdmUocFthXSxTKX0sZil9ZnVuY3Rpb24gTXIoaSl7aS5zaGFwZUZsYWcmPX4yNTYsaS5zaGFwZUZsYWcmPX41MTJ9ZnVuY3Rpb24gY28oaSl7cmV0dXJuIGkuc2hhcGVGbGFnJjEyOD9pLnNzQ29udGVudDppfWZ1bmN0aW9uIGdyKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOlNuLHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKGYpe2lmKFIuaXNSb290SG9vayhpKSYmZiE9PWYucm9vdCYmKGY9Zi5yb290LFIuaXNSb290SW1tZWRpYXRlSG9vayhpKSkpe3ZhciBTPWYucHJveHk7S3QoYS5iaW5kKFMpLGYsaSxSLk9OX0xPQUQ9PT1pP1tTLiRwYWdlLm9wdGlvbnNdOltdKX12YXJ7X19wYWdlX2NvbnRhaW5lcl9fOnd9PWYucm9vdC52bm9kZTt3JiZ3Lm9uSW5qZWN0SG9vayhpKTt2YXIgTj1mW2ldfHwoZltpXT1bXSksVj1hLl9fd2VofHwoYS5fX3dlaD1mdW5jdGlvbigpe2lmKCFmLmlzVW5tb3VudGVkKXttLnBhdXNlVHJhY2tpbmcoKSxfaShmKTtmb3IodmFyIHE9YXJndW1lbnRzLmxlbmd0aCxiZT1uZXcgQXJyYXkocSksYWU9MDthZTxxO2FlKyspYmVbYWVdPWFyZ3VtZW50c1thZV07dmFyIG5lPUt0KGEsZixpLGJlKTtyZXR1cm4gYWEoKSxtLnJlc2V0VHJhY2tpbmcoKSxuZX19KTtyZXR1cm4gcD9OLnVuc2hpZnQoVik6Ti5wdXNoKFYpLFZ9ZWxzZXt2YXIgRj1kLnRvSGFuZGxlcktleSgoRG5baV18fGkucmVwbGFjZSgvXm9uLywiIikpLnJlcGxhY2UoLyBob29rJC8sIiIpKTtnZSgiIi5jb25jYXQoRiwiIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgIikrImFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLiBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuIil9fXZhciBnaT1pPT5mdW5jdGlvbihhKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06U247cmV0dXJuKCFDLmlzSW5TU1JDb21wb25lbnRTZXR1cHx8aT09PSJzcCIpJiZncihpLGZ1bmN0aW9uKCl7cmV0dXJuIGEoLi4uYXJndW1lbnRzKX0sZil9LHVvPWdpKCJibSIpLGZvPWdpKCJtIikscmE9Z2koImJ1IiksUW49Z2koInUiKSxEcj1naSgiYnVtIikscWE9Z2koInVtIiksTmE9Z2koInNwIiksTHI9Z2koInJ0ZyIpLFZzPWdpKCJydGMiKTtmdW5jdGlvbiBVcyhpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06U247Z3IoImVjIixpLGEpfWZ1bmN0aW9uIGlsKGkpe2QuaXNCdWlsdEluRGlyZWN0aXZlKGkpJiZnZSgiRG8gbm90IHVzZSBidWlsdC1pbiBkaXJlY3RpdmUgaWRzIGFzIGN1c3RvbSBkaXJlY3RpdmUgaWQ6ICIraSl9ZnVuY3Rpb24gT28oaSxhKXt2YXIgZj1FbjtpZihmPT09bnVsbClyZXR1cm4gZ2UoIndpdGhEaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHJlbmRlciBmdW5jdGlvbnMuIiksaTtmb3IodmFyIHA9TnMoZil8fGYucHJveHksUz1pLmRpcnN8fChpLmRpcnM9W10pLHc9MDt3PGEubGVuZ3RoO3crKyl7dmFyW04sVixGLHE9ZC5FTVBUWV9PQkpdPWFbd107TiYmKGQuaXNGdW5jdGlvbihOKSYmKE49e21vdW50ZWQ6Tix1cGRhdGVkOk59KSxOLmRlZXAmJmppKFYpLFMucHVzaCh7ZGlyOk4saW5zdGFuY2U6cCx2YWx1ZTpWLG9sZFZhbHVlOnZvaWQgMCxhcmc6Rixtb2RpZmllcnM6cX0pKX1yZXR1cm4gaX1mdW5jdGlvbiBUaShpLGEsZixwKXtmb3IodmFyIFM9aS5kaXJzLHc9YSYmYS5kaXJzLE49MDtOPFMubGVuZ3RoO04rKyl7dmFyIFY9U1tOXTt3JiYoVi5vbGRWYWx1ZT13W05dLnZhbHVlKTt2YXIgRj1WLmRpcltwXTtGJiYobS5wYXVzZVRyYWNraW5nKCksS3QoRixmLDgsW2kuZWwsVixpLGFdKSxtLnJlc2V0VHJhY2tpbmcoKSl9fXZhciBrYT0iY29tcG9uZW50cyIsTmw9ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIHpuKGksYSl7cmV0dXJuIEphKGthLGksITAsYSl8fGl9dmFyIG1hPVN5bWJvbCgpO2Z1bmN0aW9uIGdzKGkpe3JldHVybiBkLmlzU3RyaW5nKGkpP0phKGthLGksITEpfHxpOml8fG1hfWZ1bmN0aW9uIGhvKGkpe3JldHVybiBKYShObCxpKX1mdW5jdGlvbiBKYShpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxTPUVufHxTbjtpZihTKXt2YXIgdz1TLnR5cGU7aWYoaT09PWthKXt2YXIgTj1TYSh3LCExKTtpZihOJiYoTj09PWF8fE49PT1kLmNhbWVsaXplKGEpfHxOPT09ZC5jYXBpdGFsaXplKGQuY2FtZWxpemUoYSkpKSlyZXR1cm4gd312YXIgVj1vbChTW2ldfHx3W2ldLGEpfHxvbChTLmFwcENvbnRleHRbaV0sYSk7aWYoIVYmJnApcmV0dXJuIHc7aWYoZiYmIVYpe3ZhciBGPWk9PT1rYT9gCklmIHRoaXMgaXMgYSBuYXRpdmUgY3VzdG9tIGVsZW1lbnQsIG1ha2Ugc3VyZSB0byBleGNsdWRlIGl0IGZyb20gY29tcG9uZW50IHJlc29sdXRpb24gdmlhIGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQuYDoiIjtnZSgiRmFpbGVkIHRvIHJlc29sdmUgIi5jb25jYXQoaS5zbGljZSgwLC0xKSwiOiAiKS5jb25jYXQoYSkuY29uY2F0KEYpKX1yZXR1cm4gVn1lbHNlIGdlKCJyZXNvbHZlIi5jb25jYXQoZC5jYXBpdGFsaXplKGkuc2xpY2UoMCwtMSkpLCIgIikrImNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS4iKX1mdW5jdGlvbiBvbChpLGEpe3JldHVybiBpJiYoaVthXXx8aVtkLmNhbWVsaXplKGEpXXx8aVtkLmNhcGl0YWxpemUoZC5jYW1lbGl6ZShhKSldKX1mdW5jdGlvbiBSYShpLGEsZixwKXt2YXIgUyx3PWYmJmZbcF07aWYoZC5pc0FycmF5KGkpfHxkLmlzU3RyaW5nKGkpKXtTPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBOPTAsVj1pLmxlbmd0aDtOPFY7TisrKVNbTl09YShpW05dLE4sdm9pZCAwLHcmJndbTl0pfWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKXtOdW1iZXIuaXNJbnRlZ2VyKGkpfHxnZSgiVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgIi5jb25jYXQoaSwiLiIpKSxTPW5ldyBBcnJheShpKTtmb3IodmFyIEY9MDtGPGk7RisrKVNbRl09YShGKzEsRix2b2lkIDAsdyYmd1tGXSl9ZWxzZSBpZihkLmlzT2JqZWN0KGkpKWlmKGlbU3ltYm9sLml0ZXJhdG9yXSlTPUFycmF5LmZyb20oaSwoQWUsRGUpPT5hKEFlLERlLHZvaWQgMCx3JiZ3W0RlXSkpO2Vsc2V7dmFyIHE9T2JqZWN0LmtleXMoaSk7Uz1uZXcgQXJyYXkocS5sZW5ndGgpO2Zvcih2YXIgYmU9MCxhZT1xLmxlbmd0aDtiZTxhZTtiZSsrKXt2YXIgbmU9cVtiZV07U1tiZV09YShpW25lXSxuZSxiZSx3JiZ3W2JlXSl9fWVsc2UgUz1bXTtyZXR1cm4gZiYmKGZbcF09UyksU31mdW5jdGlvbiBhbChpLGEpe2Zvcih2YXIgZj1mdW5jdGlvbihTKXt2YXIgdz1hW1NdO2lmKGQuaXNBcnJheSh3KSlmb3IodmFyIE49MDtOPHcubGVuZ3RoO04rKylpW3dbTl0ubmFtZV09d1tOXS5mbjtlbHNlIHcmJihpW3cubmFtZV09dy5rZXk/ZnVuY3Rpb24oKXt2YXIgVj13LmZuKC4uLmFyZ3VtZW50cyk7cmV0dXJuIFYmJihWLmtleT13LmtleSksVn06dy5mbil9LHA9MDtwPGEubGVuZ3RoO3ArKylmKHApO3JldHVybiBpfWZ1bmN0aW9uIF9hKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LHA9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDAsUz1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOnZvaWQgMDtpZihFbi5pc0NFfHxFbi5wYXJlbnQmJmhlKEVuLnBhcmVudCkmJkVuLnBhcmVudC5pc0NFKXJldHVybiBhIT09ImRlZmF1bHQiJiYoZi5uYW1lPWEpLCRuKCJzbG90IixmLHAmJnAoKSk7dmFyIHc9aVthXTt3JiZ3Lmxlbmd0aD4xJiYoZ2UoIlNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuIiksdz0oKT0+W10pLHcmJncuX2MmJih3Ll9kPSExKSx3YSgpO3ZhciBOPXcmJnZzKHcoZikpLFY9b2EodXQse2tleTpmLmtleXx8TiYmTi5rZXl8fCJfIi5jb25jYXQoYSl9LE58fChwP3AoKTpbXSksTiYmaS5fPT09MT82NDotMik7cmV0dXJuIVMmJlYuc2NvcGVJZCYmKFYuc2xvdFNjb3BlSWRzPVtWLnNjb3BlSWQrIi1zIl0pLHcmJncuX2MmJih3Ll9kPSEwKSxWfWZ1bmN0aW9uIHZzKGkpe3JldHVybiBpLnNvbWUoYT0+dnIoYSk/IShhLnR5cGU9PT1ZdHx8YS50eXBlPT09dXQmJiF2cyhhLmNoaWxkcmVuKSk6ITApP2k6bnVsbH1mdW5jdGlvbiBtcyhpLGEpe3ZhciBmPXt9O2lmKCFkLmlzT2JqZWN0KGkpKXJldHVybiBnZSgidi1vbiB3aXRoIG5vIGFyZ3VtZW50IGV4cGVjdHMgYW4gb2JqZWN0IHZhbHVlLiIpLGY7Zm9yKHZhciBwIGluIGkpZlthJiYvW0EtWl0vLnRlc3QocCk/Im9uOiIuY29uY2F0KHApOmQudG9IYW5kbGVyS2V5KHApXT1pW3BdO3JldHVybiBmfXZhciB6aT1pPT5pP1JpKGkpP05zKGkpfHxpLnByb3h5OnppKGkucGFyZW50KTpudWxsLENyPWQuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6aT0+aSwkZWw6aT0+aS52bm9kZS5lbCwkZGF0YTppPT5pLmRhdGEsJHByb3BzOmk9Pm0uc2hhbGxvd1JlYWRvbmx5KGkucHJvcHMpLCRhdHRyczppPT5tLnNoYWxsb3dSZWFkb25seShpLmF0dHJzKSwkc2xvdHM6aT0+bS5zaGFsbG93UmVhZG9ubHkoaS5zbG90cyksJHJlZnM6aT0+bS5zaGFsbG93UmVhZG9ubHkoaS5yZWZzKSwkcGFyZW50Omk9PnppKGkucGFyZW50KSwkcm9vdDppPT56aShpLnJvb3QpLCRlbWl0Omk9PmkuZW1pdCwkb3B0aW9uczppPT5XKGkpLCRmb3JjZVVwZGF0ZTppPT5pLmZ8fChpLmY9KCk9PkxuKGkudXBkYXRlKSksJG5leHRUaWNrOmk9Pmkubnx8KGkubj1rbi5iaW5kKGkucHJveHkpKSwkd2F0Y2g6aT0+dmEuYmluZChpKX0pLGJhPWk9Pmk9PT0iXyJ8fGk9PT0iJCIsTG89KGksYSk9PmkhPT1kLkVNUFRZX09CSiYmIWkuX19pc1NjcmlwdFNldHVwJiZkLmhhc093bihpLGEpLHhhPXtnZXQoaSxhKXt2YXJ7XzpmfT1pLHtjdHg6cCxzZXR1cFN0YXRlOlMsZGF0YTp3LHByb3BzOk4sYWNjZXNzQ2FjaGU6Vix0eXBlOkYsYXBwQ29udGV4dDpxfT1mO2lmKGE9PT0iX19pc1Z1ZSIpcmV0dXJuITA7dmFyIGJlO2lmKGFbMF0hPT0iJCIpe3ZhciBhZT1WW2FdO2lmKGFlIT09dm9pZCAwKXN3aXRjaChhZSl7Y2FzZSAxOnJldHVybiBTW2FdO2Nhc2UgMjpyZXR1cm4gd1thXTtjYXNlIDQ6cmV0dXJuIHBbYV07Y2FzZSAzOnJldHVybiBOW2FdfWVsc2V7aWYoTG8oUyxhKSlyZXR1cm4gVlthXT0xLFNbYV07aWYodyE9PWQuRU1QVFlfT0JKJiZkLmhhc093bih3LGEpKXJldHVybiBWW2FdPTIsd1thXTtpZigoYmU9Zi5wcm9wc09wdGlvbnNbMF0pJiZkLmhhc093bihiZSxhKSlyZXR1cm4gVlthXT0zLE5bYV07aWYocCE9PWQuRU1QVFlfT0JKJiZkLmhhc093bihwLGEpKXJldHVybiBWW2FdPTQscFthXTtIcyYmKFZbYV09MCl9fXZhciBuZT1DclthXSxBZSxEZTtpZihuZSlyZXR1cm4gYT09PSIkYXR0cnMiJiYobS50cmFjayhmLCJnZXQiLGEpLGtlKCkpLG5lKGYpO2lmKChBZT1GLl9fY3NzTW9kdWxlcykmJihBZT1BZVthXSkpcmV0dXJuIEFlO2lmKHAhPT1kLkVNUFRZX09CSiYmZC5oYXNPd24ocCxhKSlyZXR1cm4gVlthXT00LHBbYV07aWYoRGU9cS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyxkLmhhc093bihEZSxhKSlyZXR1cm4gRGVbYV07RW4mJighZC5pc1N0cmluZyhhKXx8YS5pbmRleE9mKCJfX3YiKSE9PTApJiYodyE9PWQuRU1QVFlfT0JKJiZiYShhWzBdKSYmZC5oYXNPd24odyxhKT9nZSgiUHJvcGVydHkgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSksIiBtdXN0IGJlIGFjY2Vzc2VkIHZpYSAkZGF0YSBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgIikrJ2NoYXJhY3RlciAoIiQiIG9yICJfIikgYW5kIGlzIG5vdCBwcm94aWVkIG9uIHRoZSByZW5kZXIgY29udGV4dC4nKTpmPT09RW4mJmdlKCJQcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShhKSwiIHdhcyBhY2Nlc3NlZCBkdXJpbmcgcmVuZGVyICIpKyJidXQgaXMgbm90IGRlZmluZWQgb24gaW5zdGFuY2UuIikpfSxzZXQoaSxhLGYpe3ZhcntfOnB9PWkse2RhdGE6UyxzZXR1cFN0YXRlOncsY3R4Ok59PXA7cmV0dXJuIExvKHcsYSk/KHdbYV09ZiwhMCk6dy5fX2lzU2NyaXB0U2V0dXAmJmQuaGFzT3duKHcsYSk/KGdlKCdDYW5ub3QgbXV0YXRlIDxzY3JpcHQgc2V0dXA+IGJpbmRpbmcgIicuY29uY2F0KGEsJyIgZnJvbSBPcHRpb25zIEFQSS4nKSksITEpOlMhPT1kLkVNUFRZX09CSiYmZC5oYXNPd24oUyxhKT8oU1thXT1mLCEwKTpkLmhhc093bihwLnByb3BzLGEpPyhnZSgnQXR0ZW1wdGluZyB0byBtdXRhdGUgcHJvcCAiJy5jb25jYXQoYSwnIi4gUHJvcHMgYXJlIHJlYWRvbmx5LicpKSwhMSk6YVswXT09PSIkIiYmYS5zbGljZSgxKWluIHA/KGdlKCdBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgIicuY29uY2F0KGEsJyIuICcpKyJQcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggJCBhcmUgcmVzZXJ2ZWQgYW5kIHJlYWRvbmx5LiIpLCExKTooYSBpbiBwLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5KE4sYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsdmFsdWU6Zn0pOk5bYV09ZiwhMCl9LGhhcyhpLGEpe3ZhcntfOntkYXRhOmYsc2V0dXBTdGF0ZTpwLGFjY2Vzc0NhY2hlOlMsY3R4OncsYXBwQ29udGV4dDpOLHByb3BzT3B0aW9uczpWfX09aSxGO3JldHVybiEhU1thXXx8ZiE9PWQuRU1QVFlfT0JKJiZkLmhhc093bihmLGEpfHxMbyhwLGEpfHwoRj1WWzBdKSYmZC5oYXNPd24oRixhKXx8ZC5oYXNPd24odyxhKXx8ZC5oYXNPd24oQ3IsYSl8fGQuaGFzT3duKE4uY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsYSl9LGRlZmluZVByb3BlcnR5KGksYSxmKXtyZXR1cm4gZi5nZXQhPW51bGw/aS5fLmFjY2Vzc0NhY2hlW2FdPTA6ZC5oYXNPd24oZiwidmFsdWUiKSYmdGhpcy5zZXQoaSxhLGYudmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShpLGEsZil9fTt4YS5vd25LZXlzPWk9PihnZSgiQXZvaWQgYXBwIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIGVudW1lcmF0aW5nIGtleXMgb24gYSBjb21wb25lbnQgaW5zdGFuY2UuIFRoZSBrZXlzIHdpbGwgYmUgZW1wdHkgaW4gcHJvZHVjdGlvbiBtb2RlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLiIpLFJlZmxlY3Qub3duS2V5cyhpKSk7dmFyIHNsPWQuZXh0ZW5kKHt9LHhhLHtnZXQoaSxhKXtpZihhIT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiB4YS5nZXQoaSxhLGkpfSxoYXMoaSxhKXt2YXIgZj1hWzBdIT09Il8iJiYhZC5pc0dsb2JhbGx5V2hpdGVsaXN0ZWQoYSk7cmV0dXJuIWYmJnhhLmhhcyhpLGEpJiZnZSgiUHJvcGVydHkgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSksIiBzaG91bGQgbm90IHN0YXJ0IHdpdGggXyB3aGljaCBpcyBhIHJlc2VydmVkIHByZWZpeCBmb3IgVnVlIGludGVybmFscy4iKSksZn19KTtmdW5jdGlvbiAkcyhpKXt2YXIgYT17fTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl8iLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6KCk9Pml9KSxPYmplY3Qua2V5cyhDcikuZm9yRWFjaChmPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OigpPT5DcltmXShpKSxzZXQ6ZC5OT09QfSl9KSxhfWZ1bmN0aW9uIGtsKGkpe3ZhcntjdHg6YSxwcm9wc09wdGlvbnM6W2ZdfT1pO2YmJk9iamVjdC5rZXlzKGYpLmZvckVhY2gocD0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHAse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+aS5wcm9wc1twXSxzZXQ6ZC5OT09QfSl9KX1mdW5jdGlvbiB5YShpKXt2YXJ7Y3R4OmEsc2V0dXBTdGF0ZTpmfT1pO09iamVjdC5rZXlzKG0udG9SYXcoZikpLmZvckVhY2gocD0+e2lmKCFmLl9faXNTY3JpcHRTZXR1cCl7aWYoYmEocFswXSkpe2dlKCJzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAiLmNvbmNhdChKU09OLnN0cmluZ2lmeShwKSwnIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAiJCIgb3IgIl8iICcpKyJ3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuIik7cmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHAse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+ZltwXSxzZXQ6ZC5OT09QfSl9fSl9ZnVuY3Rpb24gX3MoKXt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybihhLGYpPT57aVtmXT9nZSgiIi5jb25jYXQoYSwnIHByb3BlcnR5ICInKS5jb25jYXQoZiwnIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gJykuY29uY2F0KGlbZl0sIi4iKSk6aVtmXT1hfX12YXIgSHM9ITA7ZnVuY3Rpb24gbGwoaSl7dmFyIGE9VyhpKSxmPWkucHJveHkscD1pLmN0eDtIcz0hMSxhLmJlZm9yZUNyZWF0ZSYmeShhLmJlZm9yZUNyZWF0ZSxpLCJiYyIpO3ZhcntkYXRhOlMsY29tcHV0ZWQ6dyxtZXRob2RzOk4sd2F0Y2g6Vixwcm92aWRlOkYsaW5qZWN0OnEsY3JlYXRlZDpiZSxiZWZvcmVNb3VudDphZSxtb3VudGVkOm5lLGJlZm9yZVVwZGF0ZTpBZSx1cGRhdGVkOkRlLGFjdGl2YXRlZDpYZSxkZWFjdGl2YXRlZDpmdCxiZWZvcmVEZXN0cm95OlRlLGJlZm9yZVVubW91bnQ6c2UsZGVzdHJveWVkOkVlLHVubW91bnRlZDpMZSxyZW5kZXI6RmUscmVuZGVyVHJhY2tlZDppdCxyZW5kZXJUcmlnZ2VyZWQ6VHQsZXJyb3JDYXB0dXJlZDpRZSxzZXJ2ZXJQcmVmZXRjaDpCLGV4cG9zZTpqLGluaGVyaXRBdHRyczppZSxjb21wb25lbnRzOnllLGRpcmVjdGl2ZXM6b2UsZmlsdGVyczp2ZX09YSxldD1fcygpO3t2YXJbR2VdPWkucHJvcHNPcHRpb25zO2lmKEdlKWZvcih2YXIgdHQgaW4gR2UpZXQoIlByb3BzIix0dCl9aWYocSYmanMocSxwLGV0LGkuYXBwQ29udGV4dC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYpLE4pZm9yKHZhciBWZSBpbiBOKXt2YXIgTHQ9TltWZV07ZC5pc0Z1bmN0aW9uKEx0KT8oT2JqZWN0LmRlZmluZVByb3BlcnR5KHAsVmUse3ZhbHVlOkx0LmJpbmQoZiksY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxldCgiTWV0aG9kcyIsVmUpKTpnZSgnTWV0aG9kICInLmNvbmNhdChWZSwnIiBoYXMgdHlwZSAiJykuY29uY2F0KHR5cGVvZiBMdCwnIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uICcpKyJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIpfWlmKFMmJmZ1bmN0aW9uKCl7ZC5pc0Z1bmN0aW9uKFMpfHxnZSgiVGhlIGRhdGEgb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbi4gUGxhaW4gb2JqZWN0IHVzYWdlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIik7dmFyIHNuPVMuY2FsbChmLGYpO2lmKGQuaXNQcm9taXNlKHNuKSYmZ2UoImRhdGEoKSByZXR1cm5lZCBhIFByb21pc2UgLSBub3RlIGRhdGEoKSBjYW5ub3QgYmUgYXN5bmM7IElmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybSBkYXRhIGZldGNoaW5nIGJlZm9yZSBjb21wb25lbnQgcmVuZGVycywgdXNlIGFzeW5jIHNldHVwKCkgKyA8U3VzcGVuc2U+LiIpLCFkLmlzT2JqZWN0KHNuKSlnZSgiZGF0YSgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiIpO2Vsc2V7aS5kYXRhPW0ucmVhY3RpdmUoc24pO3t2YXIgVG49ZnVuY3Rpb24oWGkpe2V0KCJEYXRhIixYaSksYmEoWGlbMF0pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkocCxYaSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OigpPT5zbltYaV0sc2V0OmQuTk9PUH0pfTtmb3IodmFyIGduIGluIHNuKVRuKGduKX19fSgpLEhzPSEwLHcpe3ZhciBCdD1mdW5jdGlvbihzbil7dmFyIFRuPXdbc25dLGduPWQuaXNGdW5jdGlvbihUbik/VG4uYmluZChmLGYpOmQuaXNGdW5jdGlvbihUbi5nZXQpP1RuLmdldC5iaW5kKGYsZik6ZC5OT09QO2duPT09ZC5OT09QJiZnZSgnQ29tcHV0ZWQgcHJvcGVydHkgIicuY29uY2F0KHNuLCciIGhhcyBubyBnZXR0ZXIuJykpO3ZhciBYaT0hZC5pc0Z1bmN0aW9uKFRuKSYmZC5pc0Z1bmN0aW9uKFRuLnNldCk/VG4uc2V0LmJpbmQoZik6KCk9PntnZSgnV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgcHJvcGVydHkgIicuY29uY2F0KHNuLCciIGlzIHJlYWRvbmx5LicpKX0seWk9R3Moe2dldDpnbixzZXQ6WGl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocCxzbix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT55aS52YWx1ZSxzZXQ6enI9PnlpLnZhbHVlPXpyfSksZXQoIkNvbXB1dGVkIixzbil9O2Zvcih2YXIgVXQgaW4gdylCdChVdCl9aWYoVilmb3IodmFyIHVuIGluIFYpTShWW3VuXSxwLGYsdW4pO2lmKEYpe3ZhciBZbj1kLmlzRnVuY3Rpb24oRik/Ri5jYWxsKGYpOkY7UmVmbGVjdC5vd25LZXlzKFluKS5mb3JFYWNoKHNuPT57b3Ioc24sWW5bc25dKX0pfWJlJiZ5KGJlLGksImMiKTtmdW5jdGlvbiBxdChzbixUbil7ZC5pc0FycmF5KFRuKT9Ubi5mb3JFYWNoKGduPT5zbihnbi5iaW5kKGYpKSk6VG4mJnNuKFRuLmJpbmQoZikpfWlmKHF0KHVvLGFlKSxxdChmbyxuZSkscXQocmEsQWUpLHF0KFFuLERlKSxxdCh6dCxYZSkscXQoQW4sZnQpLHF0KFVzLFFlKSxxdChWcyxpdCkscXQoTHIsVHQpLHF0KERyLHNlKSxxdChxYSxMZSkscXQoTmEsQiksZC5pc0FycmF5KGopKWlmKGoubGVuZ3RoKXt2YXIgYm49aS5leHBvc2VkfHwoaS5leHBvc2VkPXt9KTtqLmZvckVhY2goc249PntPYmplY3QuZGVmaW5lUHJvcGVydHkoYm4sc24se2dldDooKT0+Zltzbl0sc2V0OlRuPT5mW3NuXT1Ubn0pfSl9ZWxzZSBpLmV4cG9zZWR8fChpLmV4cG9zZWQ9e30pO0ZlJiZpLnJlbmRlcj09PWQuTk9PUCYmKGkucmVuZGVyPUZlKSxpZSE9bnVsbCYmKGkuaW5oZXJpdEF0dHJzPWllKSx5ZSYmKGkuY29tcG9uZW50cz15ZSksb2UmJihpLmRpcmVjdGl2ZXM9b2UpO3ZhciBiaT1pLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9ucztiaSYmYmkoYSxpLGYpfWZ1bmN0aW9uIGpzKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOmQuTk9PUCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMTtkLmlzQXJyYXkoaSkmJihpPXBlKGkpKTt2YXIgUz1mdW5jdGlvbihOKXt2YXIgVj1pW05dLEY9dm9pZCAwO2QuaXNPYmplY3QoVik/ImRlZmF1bHQiaW4gVj9GPVZuKFYuZnJvbXx8TixWLmRlZmF1bHQsITApOkY9Vm4oVi5mcm9tfHxOKTpGPVZuKFYpLG0uaXNSZWYoRik/cD9PYmplY3QuZGVmaW5lUHJvcGVydHkoYSxOLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PkYudmFsdWUsc2V0OnE9PkYudmFsdWU9cX0pOihnZSgnaW5qZWN0ZWQgcHJvcGVydHkgIicuY29uY2F0KE4sJyIgaXMgYSByZWYgYW5kIHdpbGwgYmUgYXV0by11bndyYXBwZWQgJykrImFuZCBubyBsb25nZXIgbmVlZHMgYC52YWx1ZWAgaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4gVG8gb3B0LWluIHRvIHRoZSBuZXcgYmVoYXZpb3Igbm93LCBzZXQgYGFwcC5jb25maWcudW53cmFwSW5qZWN0ZWRSZWYgPSB0cnVlYCAodGhpcyBjb25maWcgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZS4pIiksYVtOXT1GKTphW05dPUYsZigiSW5qZWN0IixOKX07Zm9yKHZhciB3IGluIGkpUyh3KX1mdW5jdGlvbiB5KGksYSxmKXtLdChkLmlzQXJyYXkoaSk/aS5tYXAocD0+cC5iaW5kKGEucHJveHkpKTppLmJpbmQoYS5wcm94eSksYSxmKX1mdW5jdGlvbiBNKGksYSxmLHApe3ZhciBTPXAuaW5jbHVkZXMoIi4iKT9PaShmLHApOigpPT5mW3BdO2lmKGQuaXNTdHJpbmcoaSkpe3ZhciB3PWFbaV07ZC5pc0Z1bmN0aW9uKHcpP0NpKFMsdyk6Z2UoJ0ludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5ICInLmNvbmNhdChpLCciJyksdyl9ZWxzZSBpZihkLmlzRnVuY3Rpb24oaSkpQ2koUyxpLmJpbmQoZikpO2Vsc2UgaWYoZC5pc09iamVjdChpKSlpZihkLmlzQXJyYXkoaSkpaS5mb3JFYWNoKFY9Pk0oVixhLGYscCkpO2Vsc2V7dmFyIE49ZC5pc0Z1bmN0aW9uKGkuaGFuZGxlcik/aS5oYW5kbGVyLmJpbmQoZik6YVtpLmhhbmRsZXJdO2QuaXNGdW5jdGlvbihOKT9DaShTLE4saSk6Z2UoJ0ludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5ICInLmNvbmNhdChpLmhhbmRsZXIsJyInKSxOKX1lbHNlIGdlKCdJbnZhbGlkIHdhdGNoIG9wdGlvbjogIicuY29uY2F0KHAsJyInKSxpKX1mdW5jdGlvbiBXKGkpe3ZhciBhPWkudHlwZSx7bWl4aW5zOmYsZXh0ZW5kczpwfT1hLHttaXhpbnM6UyxvcHRpb25zQ2FjaGU6dyxjb25maWc6e29wdGlvbk1lcmdlU3RyYXRlZ2llczpOfX09aS5hcHBDb250ZXh0LFY9dy5nZXQoYSksRjtyZXR1cm4gVj9GPVY6IVMubGVuZ3RoJiYhZiYmIXA/Rj1hOihGPXt9LFMubGVuZ3RoJiZTLmZvckVhY2gocT0+SChGLHEsTiwhMCkpLEgoRixhLE4pKSxkLmlzT2JqZWN0KGEpJiZ3LnNldChhLEYpLEZ9ZnVuY3Rpb24gSChpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHttaXhpbnM6UyxleHRlbmRzOnd9PWE7dyYmSChpLHcsZiwhMCksUyYmUy5mb3JFYWNoKEY9PkgoaSxGLGYsITApKTtmb3IodmFyIE4gaW4gYSlpZihwJiZOPT09ImV4cG9zZSIpZ2UoJyJleHBvc2UiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuJyk7ZWxzZXt2YXIgVj1RW05dfHxmJiZmW05dO2lbTl09Vj9WKGlbTl0sYVtOXSk6YVtOXX1yZXR1cm4gaX12YXIgUT17ZGF0YTp0ZSxwcm9wczpCZSxlbWl0czpCZSxtZXRob2RzOkJlLGNvbXB1dGVkOkJlLGJlZm9yZUNyZWF0ZTpDZSxjcmVhdGVkOkNlLGJlZm9yZU1vdW50OkNlLG1vdW50ZWQ6Q2UsYmVmb3JlVXBkYXRlOkNlLHVwZGF0ZWQ6Q2UsYmVmb3JlRGVzdHJveTpDZSxiZWZvcmVVbm1vdW50OkNlLGRlc3Ryb3llZDpDZSx1bm1vdW50ZWQ6Q2UsYWN0aXZhdGVkOkNlLGRlYWN0aXZhdGVkOkNlLGVycm9yQ2FwdHVyZWQ6Q2Usc2VydmVyUHJlZmV0Y2g6Q2UsY29tcG9uZW50czpCZSxkaXJlY3RpdmVzOkJlLHdhdGNoOlNlLHByb3ZpZGU6dGUsaW5qZWN0OmZlfTtmdW5jdGlvbiB0ZShpLGEpe3JldHVybiBhP2k/ZnVuY3Rpb24oKXtyZXR1cm4gZC5leHRlbmQoZC5pc0Z1bmN0aW9uKGkpP2kuY2FsbCh0aGlzLHRoaXMpOmksZC5pc0Z1bmN0aW9uKGEpP2EuY2FsbCh0aGlzLHRoaXMpOmEpfTphOml9ZnVuY3Rpb24gZmUoaSxhKXtyZXR1cm4gQmUocGUoaSkscGUoYSkpfWZ1bmN0aW9uIHBlKGkpe2lmKGQuaXNBcnJheShpKSl7Zm9yKHZhciBhPXt9LGY9MDtmPGkubGVuZ3RoO2YrKylhW2lbZl1dPWlbZl07cmV0dXJuIGF9cmV0dXJuIGl9ZnVuY3Rpb24gQ2UoaSxhKXtyZXR1cm4gaT9bLi4ubmV3IFNldChbXS5jb25jYXQoaSxhKSldOmF9ZnVuY3Rpb24gQmUoaSxhKXtyZXR1cm4gaT9kLmV4dGVuZChkLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpLGEpOmF9ZnVuY3Rpb24gU2UoaSxhKXtpZighaSlyZXR1cm4gYTtpZighYSlyZXR1cm4gaTt2YXIgZj1kLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpO2Zvcih2YXIgcCBpbiBhKWZbcF09Q2UoaVtwXSxhW3BdKTtyZXR1cm4gZn1mdW5jdGlvbiBqZShpLGEsZil7dmFyIHA9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLFM9e30sdz17fTtkLmRlZih3LEFzLDEpLGkucHJvcHNEZWZhdWx0cz1PYmplY3QuY3JlYXRlKG51bGwpLFd0KGksYSxTLHcpO2Zvcih2YXIgTiBpbiBpLnByb3BzT3B0aW9uc1swXSlOIGluIFN8fChTW05dPXZvaWQgMCk7bm4oYXx8e30sUyxpKSxmP2kucHJvcHM9cD9TOm0uc2hhbGxvd1JlYWN0aXZlKFMpOmkudHlwZS5wcm9wcz9pLnByb3BzPVM6aS5wcm9wcz13LGkuYXR0cnM9d31mdW5jdGlvbiBidChpKXtmb3IoO2k7KXtpZihpLnR5cGUuX19obXJJZClyZXR1cm4hMDtpPWkucGFyZW50fX1mdW5jdGlvbiBDdChpLGEsZixwKXt2YXJ7cHJvcHM6UyxhdHRyczp3LHZub2RlOntwYXRjaEZsYWc6Tn19PWksVj1tLnRvUmF3KFMpLFtGXT1pLnByb3BzT3B0aW9ucyxxPSExO2lmKCFidChpKSYmKHB8fE4+MCkmJiEoTiYxNikpe2lmKE4mOClmb3IodmFyIGJlPWkudm5vZGUuZHluYW1pY1Byb3BzLGFlPTA7YWU8YmUubGVuZ3RoO2FlKyspe3ZhciBuZT1iZVthZV07aWYoIU9uKGkuZW1pdHNPcHRpb25zLG5lKSl7dmFyIEFlPWFbbmVdO2lmKEYpaWYoZC5oYXNPd24odyxuZSkpQWUhPT13W25lXSYmKHdbbmVdPUFlLHE9ITApO2Vsc2V7dmFyIERlPWQuY2FtZWxpemUobmUpO1NbRGVdPUV0KEYsVixEZSxBZSxpLCExKX1lbHNlIEFlIT09d1tuZV0mJih3W25lXT1BZSxxPSEwKX19fWVsc2V7V3QoaSxhLFMsdykmJihxPSEwKTt2YXIgWGU7Zm9yKHZhciBmdCBpbiBWKSghYXx8IWQuaGFzT3duKGEsZnQpJiYoKFhlPWQuaHlwaGVuYXRlKGZ0KSk9PT1mdHx8IWQuaGFzT3duKGEsWGUpKSkmJihGP2YmJihmW2Z0XSE9PXZvaWQgMHx8ZltYZV0hPT12b2lkIDApJiYoU1tmdF09RXQoRixWLGZ0LHZvaWQgMCxpLCEwKSk6ZGVsZXRlIFNbZnRdKTtpZih3IT09Vilmb3IodmFyIFRlIGluIHcpKCFhfHwhZC5oYXNPd24oYSxUZSkmJiEwKSYmKGRlbGV0ZSB3W1RlXSxxPSEwKX1xJiZtLnRyaWdnZXIoaSwic2V0IiwiJGF0dHJzIiksbm4oYXx8e30sUyxpKX1mdW5jdGlvbiBXdChpLGEsZixwKXt2YXJbUyx3XT1pLnByb3BzT3B0aW9ucyxOPSExLFY7aWYoYSl7Zm9yKHZhciBGIGluIGEpaWYoIWQuaXNSZXNlcnZlZFByb3AoRikpe3ZhciBxPWFbRl0sYmU9dm9pZCAwO1MmJmQuaGFzT3duKFMsYmU9ZC5jYW1lbGl6ZShGKSk/IXd8fCF3LmluY2x1ZGVzKGJlKT9mW2JlXT1xOihWfHwoVj17fSkpW2JlXT1xOk9uKGkuZW1pdHNPcHRpb25zLEYpfHwoIShGIGluIHApfHxxIT09cFtGXSkmJihwW0ZdPXEsTj0hMCl9fWlmKHcpZm9yKHZhciBhZT1tLnRvUmF3KGYpLG5lPVZ8fGQuRU1QVFlfT0JKLEFlPTA7QWU8dy5sZW5ndGg7QWUrKyl7dmFyIERlPXdbQWVdO2ZbRGVdPUV0KFMsYWUsRGUsbmVbRGVdLGksIWQuaGFzT3duKG5lLERlKSl9cmV0dXJuIE59ZnVuY3Rpb24gRXQoaSxhLGYscCxTLHcpe3ZhciBOPWlbZl07aWYoTiE9bnVsbCl7dmFyIFY9ZC5oYXNPd24oTiwiZGVmYXVsdCIpO2lmKFYmJnA9PT12b2lkIDApe3ZhciBGPU4uZGVmYXVsdDtpZihOLnR5cGUhPT1GdW5jdGlvbiYmZC5pc0Z1bmN0aW9uKEYpKXt2YXJ7cHJvcHNEZWZhdWx0czpxfT1TO2YgaW4gcT9wPXFbZl06KF9pKFMpLHA9cVtmXT1GLmNhbGwobnVsbCxhKSxhYSgpKX1lbHNlIHA9Rn1OWzBdJiYodyYmIVY/cD0hMTpOWzFdJiYocD09PSIifHxwPT09ZC5oeXBoZW5hdGUoZikpJiYocD0hMCkpfXJldHVybiBwfWZ1bmN0aW9uIEtlKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9YS5wcm9wc0NhY2hlLFM9cC5nZXQoaSk7aWYoUylyZXR1cm4gUzt2YXIgdz1pLnByb3BzLE49e30sVj1bXSxGPSExO2lmKCFkLmlzRnVuY3Rpb24oaSkpe3ZhciBxPUVlPT57Rj0hMDt2YXJbTGUsRmVdPUtlKEVlLGEsITApO2QuZXh0ZW5kKE4sTGUpLEZlJiZWLnB1c2goLi4uRmUpfTshZiYmYS5taXhpbnMubGVuZ3RoJiZhLm1peGlucy5mb3JFYWNoKHEpLGkuZXh0ZW5kcyYmcShpLmV4dGVuZHMpLGkubWl4aW5zJiZpLm1peGlucy5mb3JFYWNoKHEpfWlmKCF3JiYhRilyZXR1cm4gZC5pc09iamVjdChpKSYmcC5zZXQoaSxkLkVNUFRZX0FSUiksZC5FTVBUWV9BUlI7aWYoZC5pc0FycmF5KHcpKWZvcih2YXIgYmU9MDtiZTx3Lmxlbmd0aDtiZSsrKXtkLmlzU3RyaW5nKHdbYmVdKXx8Z2UoInByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4iLHdbYmVdKTt2YXIgYWU9ZC5jYW1lbGl6ZSh3W2JlXSk7TXQoYWUpJiYoTlthZV09ZC5FTVBUWV9PQkopfWVsc2UgaWYodyl7ZC5pc09iamVjdCh3KXx8Z2UoImludmFsaWQgcHJvcHMgb3B0aW9ucyIsdyk7Zm9yKHZhciBuZSBpbiB3KXt2YXIgQWU9ZC5jYW1lbGl6ZShuZSk7aWYoTXQoQWUpKXt2YXIgRGU9d1tuZV0sWGU9TltBZV09ZC5pc0FycmF5KERlKXx8ZC5pc0Z1bmN0aW9uKERlKT97dHlwZTpEZX06T2JqZWN0LmFzc2lnbih7fSxEZSk7aWYoWGUpe3ZhciBmdD1BdChCb29sZWFuLFhlLnR5cGUpLFRlPUF0KFN0cmluZyxYZS50eXBlKTtYZVswXT1mdD4tMSxYZVsxXT1UZTwwfHxmdDxUZSwoZnQ+LTF8fGQuaGFzT3duKFhlLCJkZWZhdWx0IikpJiZWLnB1c2goQWUpfX19fXZhciBzZT1bTixWXTtyZXR1cm4gZC5pc09iamVjdChpKSYmcC5zZXQoaSxzZSksc2V9ZnVuY3Rpb24gTXQoaSl7cmV0dXJuIGlbMF0hPT0iJCI/ITA6KGdlKCdJbnZhbGlkIHByb3AgbmFtZTogIicuY29uY2F0KGksJyIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS4nKSksITEpfWZ1bmN0aW9uIF9uKGkpe3ZhciBhPWkmJmkudG9TdHJpbmcoKS5tYXRjaCgvXlxzKihmdW5jdGlvbnxjbGFzcykgKFx3KykvKTtyZXR1cm4gYT9hWzJdOmk9PT1udWxsPyJudWxsIjoiIn1mdW5jdGlvbiB3bihpLGEpe3JldHVybiBfbihpKT09PV9uKGEpfWZ1bmN0aW9uIEF0KGksYSl7cmV0dXJuIGQuaXNBcnJheShhKT9hLmZpbmRJbmRleChmPT53bihmLGkpKTpkLmlzRnVuY3Rpb24oYSkmJnduKGEsaSk/MDotMX1mdW5jdGlvbiBubihpLGEsZil7dmFyIHA9bS50b1JhdyhhKSxTPWYucHJvcHNPcHRpb25zWzBdO2Zvcih2YXIgdyBpbiBTKXt2YXIgTj1TW3ddO04hPW51bGwmJmFyKHcscFt3XSxOLCFkLmhhc093bihpLHcpJiYhZC5oYXNPd24oaSxkLmh5cGhlbmF0ZSh3KSkpfX1mdW5jdGlvbiBhcihpLGEsZixwKXt2YXJ7dHlwZTpTLHJlcXVpcmVkOncsdmFsaWRhdG9yOk59PWY7aWYodyYmcCl7Z2UoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicraSsnIicpO3JldHVybn1pZighKGE9PW51bGwmJiFmLnJlcXVpcmVkKSl7aWYoUyE9bnVsbCYmUyE9PSEwKXtmb3IodmFyIFY9ITEsRj1kLmlzQXJyYXkoUyk/UzpbU10scT1bXSxiZT0wO2JlPEYubGVuZ3RoJiYhVjtiZSsrKXt2YXJ7dmFsaWQ6YWUsZXhwZWN0ZWRUeXBlOm5lfT1HdChhLEZbYmVdKTtxLnB1c2gobmV8fCIiKSxWPWFlfWlmKCFWKXtnZShSbihpLGEscSkpO3JldHVybn19TiYmIU4oYSkmJmdlKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInK2krJyIuJyl9fXZhciBKdD1kLm1ha2VNYXAoIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50Iik7ZnVuY3Rpb24gR3QoaSxhKXt2YXIgZixwPV9uKGEpO2lmKEp0KHApKXt2YXIgUz10eXBlb2YgaTtmPVM9PT1wLnRvTG93ZXJDYXNlKCksIWYmJlM9PT0ib2JqZWN0IiYmKGY9aSBpbnN0YW5jZW9mIGEpfWVsc2UgcD09PSJPYmplY3QiP2Y9ZC5pc09iamVjdChpKTpwPT09IkFycmF5Ij9mPWQuaXNBcnJheShpKTpwPT09Im51bGwiP2Y9aT09PW51bGw6Zj1pIGluc3RhbmNlb2YgYTtyZXR1cm57dmFsaWQ6ZixleHBlY3RlZFR5cGU6cH19ZnVuY3Rpb24gUm4oaSxhLGYpe3ZhciBwPSdJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInLmNvbmNhdChpLCciLicpKyIgRXhwZWN0ZWQgIi5jb25jYXQoZi5tYXAoZC5jYXBpdGFsaXplKS5qb2luKCIgfCAiKSksUz1mWzBdLHc9ZC50b1Jhd1R5cGUoYSksTj1lcihhLFMpLFY9ZXIoYSx3KTtyZXR1cm4gZi5sZW5ndGg9PT0xJiZCYShTKSYmIWJzKFMsdykmJihwKz0iIHdpdGggdmFsdWUgIi5jb25jYXQoTikpLHArPSIsIGdvdCAiLmNvbmNhdCh3LCIgIiksQmEodykmJihwKz0id2l0aCB2YWx1ZSAiLmNvbmNhdChWLCIuIikpLHB9ZnVuY3Rpb24gZXIoaSxhKXtyZXR1cm4gYT09PSJTdHJpbmciPyciJy5jb25jYXQoaSwnIicpOmE9PT0iTnVtYmVyIj8iIi5jb25jYXQoTnVtYmVyKGkpKToiIi5jb25jYXQoaSl9ZnVuY3Rpb24gQmEoaSl7dmFyIGE9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07cmV0dXJuIGEuc29tZShmPT5pLnRvTG93ZXJDYXNlKCk9PT1mKX1mdW5jdGlvbiBicygpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGkpLGY9MDtmPGk7ZisrKWFbZl09YXJndW1lbnRzW2ZdO3JldHVybiBhLnNvbWUocD0+cC50b0xvd2VyQ2FzZSgpPT09ImJvb2xlYW4iKX12YXIgTWE9aT0+aVswXT09PSJfInx8aT09PSIkc3RhYmxlIixBbz1pPT5kLmlzQXJyYXkoaSk/aS5tYXAobXIpOlttcihpKV0seXM9KGksYSxmKT0+e2lmKGEuX24pcmV0dXJuIGE7dmFyIHA9dXIoZnVuY3Rpb24oKXtyZXR1cm4gU24mJmdlKCdTbG90ICInLmNvbmNhdChpLCciIGludm9rZWQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyIGZ1bmN0aW9uOiAnKSsidGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gSW52b2tlIHRoZSBzbG90IGZ1bmN0aW9uIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuIiksQW8oYSguLi5hcmd1bWVudHMpKX0sZik7cmV0dXJuIHAuX2M9ITEscH0sZWk9KGksYSxmKT0+e3ZhciBwPWkuX2N0eDtmb3IodmFyIFMgaW4gaSlpZighTWEoUykpe3ZhciB3PWlbU107ZC5pc0Z1bmN0aW9uKHcpP2FbU109eXMoUyx3LHApOnchPW51bGwmJmZ1bmN0aW9uKCl7Z2UoJ05vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCAiJy5jb25jYXQoUywnIi4gJykrIlByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLiIpO3ZhciBOPUFvKHcpO2FbU109KCk9Pk59KCl9fSxEYT0oaSxhKT0+e1koaS52bm9kZSl8fGdlKCJOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuIik7dmFyIGY9QW8oYSk7aS5zbG90cy5kZWZhdWx0PSgpPT5mfSxpYT0oaSxhKT0+e2lmKGkudm5vZGUuc2hhcGVGbGFnJjMyKXt2YXIgZj1hLl87Zj8oaS5zbG90cz1tLnRvUmF3KGEpLGQuZGVmKGEsIl8iLGYpKTplaShhLGkuc2xvdHM9e30pfWVsc2UgaS5zbG90cz17fSxhJiZEYShpLGEpO2QuZGVmKGkuc2xvdHMsQXMsMSl9LHRyPShpLGEsZik9Pnt2YXJ7dm5vZGU6cCxzbG90czpTfT1pLHc9ITAsTj1kLkVNUFRZX09CSjtpZihwLnNoYXBlRmxhZyYzMil7dmFyIFY9YS5fO1Y/UnI/ZC5leHRlbmQoUyxhKTpmJiZWPT09MT93PSExOihkLmV4dGVuZChTLGEpLCFmJiZWPT09MSYmZGVsZXRlIFMuXyk6KHc9IWEuJHN0YWJsZSxlaShhLFMpKSxOPWF9ZWxzZSBhJiYoRGEoaSxhKSxOPXtkZWZhdWx0OjF9KTtpZih3KWZvcih2YXIgRiBpbiBTKSFNYShGKSYmIShGIGluIE4pJiZkZWxldGUgU1tGXX07ZnVuY3Rpb24gS2EoKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzpkLk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBjbD0wO2Z1bmN0aW9uIEZvKGksYSl7cmV0dXJuIGZ1bmN0aW9uKHApe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO2QuaXNGdW5jdGlvbihwKXx8KHA9T2JqZWN0LmFzc2lnbih7fSxwKSksUyE9bnVsbCYmIWQuaXNPYmplY3QoUykmJihnZSgicm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuIiksUz1udWxsKTt2YXIgdz1LYSgpLE49bmV3IFNldCxWPSExLEY9dy5hcHA9e191aWQ6Y2wrKyxfY29tcG9uZW50OnAsX3Byb3BzOlMsX2NvbnRhaW5lcjpudWxsLF9jb250ZXh0OncsX2luc3RhbmNlOm51bGwsdmVyc2lvbjptbCxnZXQgY29uZmlnKCl7cmV0dXJuIHcuY29uZmlnfSxzZXQgY29uZmlnKHEpe2dlKCJhcHAuY29uZmlnIGNhbm5vdCBiZSByZXBsYWNlZC4gTW9kaWZ5IGluZGl2aWR1YWwgb3B0aW9ucyBpbnN0ZWFkLiIpfSx1c2UocSl7Zm9yKHZhciBiZT1hcmd1bWVudHMubGVuZ3RoLGFlPW5ldyBBcnJheShiZT4xP2JlLTE6MCksbmU9MTtuZTxiZTtuZSsrKWFlW25lLTFdPWFyZ3VtZW50c1tuZV07cmV0dXJuIE4uaGFzKHEpP2dlKCJQbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRhcmdldCBhcHAuIik6cSYmZC5pc0Z1bmN0aW9uKHEuaW5zdGFsbCk/KE4uYWRkKHEpLHEuaW5zdGFsbChGLC4uLmFlKSk6ZC5pc0Z1bmN0aW9uKHEpPyhOLmFkZChxKSxxKEYsLi4uYWUpKTpnZSgnQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiAiaW5zdGFsbCIgZnVuY3Rpb24uJyksRn0sbWl4aW4ocSl7cmV0dXJuIHcubWl4aW5zLmluY2x1ZGVzKHEpP2dlKCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcCIrKHEubmFtZT8iOiAiLmNvbmNhdChxLm5hbWUpOiIiKSk6dy5taXhpbnMucHVzaChxKSxGfSxjb21wb25lbnQocSxiZSl7cmV0dXJuIFVhKHEsdy5jb25maWcpLGJlPyh3LmNvbXBvbmVudHNbcV0mJmdlKCdDb21wb25lbnQgIicuY29uY2F0KHEsJyIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuJykpLHcuY29tcG9uZW50c1txXT1iZSxGKTp3LmNvbXBvbmVudHNbcV19LGRpcmVjdGl2ZShxLGJlKXtyZXR1cm4gaWwocSksYmU/KHcuZGlyZWN0aXZlc1txXSYmZ2UoJ0RpcmVjdGl2ZSAiJy5jb25jYXQocSwnIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC4nKSksdy5kaXJlY3RpdmVzW3FdPWJlLEYpOncuZGlyZWN0aXZlc1txXX0sbW91bnQocSxiZSxhZSl7aWYoVilnZSgiQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClgIik7ZWxzZXtxLl9fdnVlX2FwcF9fJiZnZSgiVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIGBhcHAudW5tb3VudCgpYCBmaXJzdC4iKTt2YXIgbmU9JG4ocCxTKTtyZXR1cm4gbmUuYXBwQ29udGV4dD13LHcucmVsb2FkPSgpPT57aShKaShuZSkscSxhZSl9LGJlJiZhP2EobmUscSk6aShuZSxxLGFlKSxWPSEwLEYuX2NvbnRhaW5lcj1xLHEuX192dWVfYXBwX189RixGLl9pbnN0YW5jZT1uZS5jb21wb25lbnQsSm8oRixtbCksTnMobmUuY29tcG9uZW50KXx8bmUuY29tcG9uZW50LnByb3h5fX0sdW5tb3VudCgpe1Y/KGkobnVsbCxGLl9jb250YWluZXIpLEYuX2luc3RhbmNlPW51bGwseG8oRiksZGVsZXRlIEYuX2NvbnRhaW5lci5fX3Z1ZV9hcHBfXyk6Z2UoIkNhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLiIpfSxwcm92aWRlKHEsYmUpe3JldHVybiBxIGluIHcucHJvdmlkZXMmJmdlKCdBcHAgYWxyZWFkeSBwcm92aWRlcyBwcm9wZXJ0eSB3aXRoIGtleSAiJy5jb25jYXQoU3RyaW5nKHEpLCciLiAnKSsiSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuIiksdy5wcm92aWRlc1txXT1iZSxGfX07cmV0dXJuIEZ9fWZ1bmN0aW9uIFdpKGksYSxmLHApe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihkLmlzQXJyYXkoaSkpe2kuZm9yRWFjaCgoWGUsZnQpPT5XaShYZSxhJiYoZC5pc0FycmF5KGEpP2FbZnRdOmEpLGYscCxTKSk7cmV0dXJufWlmKCEoaGUocCkmJiFTKSl7dmFyIHc9cC5zaGFwZUZsYWcmND9OcyhwLmNvbXBvbmVudCl8fHAuY29tcG9uZW50LnByb3h5OnAuZWwsTj1TP251bGw6dyx7aTpWLHI6Rn09aTtpZighVil7Z2UoIk1pc3NpbmcgcmVmIG93bmVyIGNvbnRleHQuIHJlZiBjYW5ub3QgYmUgdXNlZCBvbiBob2lzdGVkIHZub2Rlcy4gQSB2bm9kZSB3aXRoIHJlZiBtdXN0IGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24uIik7cmV0dXJufXZhciBxPWEmJmEucixiZT1WLnJlZnM9PT1kLkVNUFRZX09CSj9WLnJlZnM9e306Vi5yZWZzLGFlPVYuc2V0dXBTdGF0ZTtpZihxIT1udWxsJiZxIT09RiYmKGQuaXNTdHJpbmcocSk/KGJlW3FdPW51bGwsZC5oYXNPd24oYWUscSkmJihhZVtxXT1udWxsKSk6bS5pc1JlZihxKSYmKHEudmFsdWU9bnVsbCkpLGQuaXNGdW5jdGlvbihGKSlmbihGLFYsMTIsW04sYmVdKTtlbHNle3ZhciBuZT1kLmlzU3RyaW5nKEYpLEFlPW0uaXNSZWYoRik7aWYobmV8fEFlKXt2YXIgRGU9KCk9PntpZihpLmYpe3ZhciBYZT1uZT9kLmhhc093bihhZSxGKT9hZVtGXTpiZVtGXTpGLnZhbHVlO1M/ZC5pc0FycmF5KFhlKSYmZC5yZW1vdmUoWGUsdyk6ZC5pc0FycmF5KFhlKT9YZS5pbmNsdWRlcyh3KXx8WGUucHVzaCh3KTpuZT8oYmVbRl09W3ddLGQuaGFzT3duKGFlLEYpJiYoYWVbRl09YmVbRl0pKTooRi52YWx1ZT1bd10saS5rJiYoYmVbaS5rXT1GLnZhbHVlKSl9ZWxzZSBuZT8oYmVbRl09TixkLmhhc093bihhZSxGKSYmKGFlW0ZdPU4pKTpBZT8oRi52YWx1ZT1OLGkuayYmKGJlW2kua109TikpOmdlKCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOiIsRiwiKCIuY29uY2F0KHR5cGVvZiBGLCIpIikpfTtOPyhEZS5pZD0tMSxBcihEZSxmKSk6RGUoKX1lbHNlIGdlKCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOiIsRiwiKCIuY29uY2F0KHR5cGVvZiBGLCIpIikpfX19dmFyIFVuPSExLEdpPWk9Pi9zdmcvLnRlc3QoaS5uYW1lc3BhY2VVUkkpJiZpLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsdmk9aT0+aS5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gSWkoaSl7dmFye210OmEscDpmLG86e3BhdGNoUHJvcDpwLGNyZWF0ZVRleHQ6UyxuZXh0U2libGluZzp3LHBhcmVudE5vZGU6TixyZW1vdmU6VixpbnNlcnQ6RixjcmVhdGVDb21tZW50OnF9fT1pLGJlPShUZSxzZSk9PntpZighc2UuaGFzQ2hpbGROb2RlcygpKXtnZSgiQXR0ZW1wdGluZyB0byBoeWRyYXRlIGV4aXN0aW5nIG1hcmt1cCBidXQgY29udGFpbmVyIGlzIGVtcHR5LiBQZXJmb3JtaW5nIGZ1bGwgbW91bnQgaW5zdGVhZC4iKSxmKG51bGwsVGUsc2UpLEVyKCksc2UuX3Zub2RlPVRlO3JldHVybn1Vbj0hMSxhZShzZS5maXJzdENoaWxkLFRlLG51bGwsbnVsbCxudWxsKSxFcigpLHNlLl92bm9kZT1UZSxVbiYmY29uc29sZS5lcnJvcigiSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy4iKX0sYWU9ZnVuY3Rpb24oVGUsc2UsRWUsTGUsRmUpe3ZhciBpdD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITEsVHQ9dmkoVGUpJiZUZS5kYXRhPT09IlsiLFFlPSgpPT5YZShUZSxzZSxFZSxMZSxGZSxUdCkse3R5cGU6QixyZWY6aixzaGFwZUZsYWc6aWUscGF0Y2hGbGFnOnllfT1zZSxvZT1UZS5ub2RlVHlwZTtzZS5lbD1UZSx5ZT09PS0yJiYoaXQ9ITEsc2UuZHluYW1pY0NoaWxkcmVuPW51bGwpO3ZhciB2ZT1udWxsO3N3aXRjaChCKXtjYXNlIHh0Om9lIT09Mz9zZS5jaGlsZHJlbj09PSIiPyhGKHNlLmVsPVMoIiIsVGUucGFyZW50Tm9kZSksTihUZSksVGUpLHZlPVRlKTp2ZT1RZSgpOihUZS5kYXRhIT09c2UuY2hpbGRyZW4mJihVbj0hMCxnZSgiSHlkcmF0aW9uIHRleHQgbWlzbWF0Y2g6IitgCi0gQ2xpZW50OiBgLmNvbmNhdChKU09OLnN0cmluZ2lmeShUZS5kYXRhKSkrYAotIFNlcnZlcjogYC5jb25jYXQoSlNPTi5zdHJpbmdpZnkoc2UuY2hpbGRyZW4pKSksVGUuZGF0YT1zZS5jaGlsZHJlbiksdmU9dyhUZSkpO2JyZWFrO2Nhc2UgWXQ6b2UhPT04fHxUdD92ZT1RZSgpOnZlPXcoVGUpO2JyZWFrO2Nhc2UgV246aWYoVHQmJihUZT13KFRlKSxvZT1UZS5ub2RlVHlwZSksb2U9PT0xfHxvZT09PTMpe3ZlPVRlO2Zvcih2YXIgZXQ9IXNlLmNoaWxkcmVuLmxlbmd0aCxHZT0wO0dlPHNlLnN0YXRpY0NvdW50O0dlKyspZXQmJihzZS5jaGlsZHJlbis9dmUubm9kZVR5cGU9PT0xP3ZlLm91dGVySFRNTDp2ZS5kYXRhKSxHZT09PXNlLnN0YXRpY0NvdW50LTEmJihzZS5hbmNob3I9dmUpLHZlPXcodmUpO3JldHVybiBUdD93KHZlKTp2ZX1lbHNlIFFlKCk7YnJlYWs7Y2FzZSB1dDpUdD92ZT1EZShUZSxzZSxFZSxMZSxGZSxpdCk6dmU9UWUoKTticmVhaztkZWZhdWx0OmlmKGllJjEpb2UhPT0xfHxzZS50eXBlLnRvTG93ZXJDYXNlKCkhPT1UZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/dmU9UWUoKTp2ZT1uZShUZSxzZSxFZSxMZSxGZSxpdCk7ZWxzZSBpZihpZSY2KXtzZS5zbG90U2NvcGVJZHM9RmU7dmFyIHR0PU4oVGUpO2lmKGEoc2UsdHQsbnVsbCxFZSxMZSxHaSh0dCksaXQpLHZlPVR0P2Z0KFRlKTp3KFRlKSx2ZSYmdmkodmUpJiZ2ZS5kYXRhPT09InRlbGVwb3J0IGVuZCImJih2ZT13KHZlKSksaGUoc2UpKXt2YXIgVmU7VHQ/KFZlPSRuKHV0KSxWZS5hbmNob3I9dmU/dmUucHJldmlvdXNTaWJsaW5nOnR0Lmxhc3RDaGlsZCk6VmU9VGUubm9kZVR5cGU9PT0zP0lzKCIiKTokbigiZGl2IiksVmUuZWw9VGUsc2UuY29tcG9uZW50LnN1YlRyZWU9VmV9fWVsc2UgaWUmNjQ/b2UhPT04P3ZlPVFlKCk6dmU9c2UudHlwZS5oeWRyYXRlKFRlLHNlLEVlLExlLEZlLGl0LGksQWUpOmllJjEyOD92ZT1zZS50eXBlLmh5ZHJhdGUoVGUsc2UsRWUsTGUsR2koTihUZSkpLEZlLGl0LGksYWUpOmdlKCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOiIsQiwiKCIuY29uY2F0KHR5cGVvZiBCLCIpIikpfXJldHVybiBqIT1udWxsJiZXaShqLG51bGwsTGUsc2UpLHZlfSxuZT0oVGUsc2UsRWUsTGUsRmUsaXQpPT57aXQ9aXR8fCEhc2UuZHluYW1pY0NoaWxkcmVuO3Zhcnt0eXBlOlR0LHByb3BzOlFlLHBhdGNoRmxhZzpCLHNoYXBlRmxhZzpqLGRpcnM6aWV9PXNlLHllPVR0PT09ImlucHV0IiYmaWV8fFR0PT09Im9wdGlvbiI7e2lmKGllJiZUaShzZSxudWxsLEVlLCJjcmVhdGVkIiksUWUpaWYoeWV8fCFpdHx8QiYoMTZ8MzIpKWZvcih2YXIgb2UgaW4gUWUpKHllJiZvZS5lbmRzV2l0aCgidmFsdWUiKXx8ZC5pc09uKG9lKSYmIWQuaXNSZXNlcnZlZFByb3Aob2UpKSYmcChUZSxvZSxudWxsLFFlW29lXSwhMSx2b2lkIDAsRWUpO2Vsc2UgUWUub25DbGljayYmcChUZSwib25DbGljayIsbnVsbCxRZS5vbkNsaWNrLCExLHZvaWQgMCxFZSk7dmFyIHZlO2lmKCh2ZT1RZSYmUWUub25Wbm9kZUJlZm9yZU1vdW50KSYmanIodmUsRWUsc2UpLGllJiZUaShzZSxudWxsLEVlLCJiZWZvcmVNb3VudCIpLCgodmU9UWUmJlFlLm9uVm5vZGVNb3VudGVkKXx8aWUpJiZhbygoKT0+e3ZlJiZqcih2ZSxFZSxzZSksaWUmJlRpKHNlLG51bGwsRWUsIm1vdW50ZWQiKX0sTGUpLGomMTYmJiEoUWUmJihRZS5pbm5lckhUTUx8fFFlLnRleHRDb250ZW50KSkpZm9yKHZhciBldD1BZShUZS5maXJzdENoaWxkLHNlLFRlLEVlLExlLEZlLGl0KSxHZT0hMTtldDspe1VuPSEwLEdlfHwoZ2UoIkh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBpbiA8Ii5jb25jYXQoc2UudHlwZSwiPjogIikrInNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIG1vcmUgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS4iKSxHZT0hMCk7dmFyIHR0PWV0O2V0PWV0Lm5leHRTaWJsaW5nLFYodHQpfWVsc2UgaiY4JiZUZS50ZXh0Q29udGVudCE9PXNlLmNoaWxkcmVuJiYoVW49ITAsZ2UoIkh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggaW4gPCIuY29uY2F0KHNlLnR5cGUsYD46CmApKyItIENsaWVudDogIi5jb25jYXQoVGUudGV4dENvbnRlbnQsYApgKSsiLSBTZXJ2ZXI6ICIuY29uY2F0KHNlLmNoaWxkcmVuKSksVGUudGV4dENvbnRlbnQ9c2UuY2hpbGRyZW4pfXJldHVybiBUZS5uZXh0U2libGluZ30sQWU9KFRlLHNlLEVlLExlLEZlLGl0LFR0KT0+e1R0PVR0fHwhIXNlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIFFlPXNlLmNoaWxkcmVuLEI9UWUubGVuZ3RoLGo9ITEsaWU9MDtpZTxCO2llKyspe3ZhciB5ZT1UdD9RZVtpZV06UWVbaWVdPW1yKFFlW2llXSk7aWYoVGUpVGU9YWUoVGUseWUsTGUsRmUsaXQsVHQpO2Vsc2V7aWYoeWUudHlwZT09PXh0JiYheWUuY2hpbGRyZW4pY29udGludWU7VW49ITAsanx8KGdlKCJIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggaW4gPCIuY29uY2F0KEVlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwiPjogIikrInNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uIiksaj0hMCksZihudWxsLHllLEVlLG51bGwsTGUsRmUsR2koRWUpLGl0KX19cmV0dXJuIFRlfSxEZT0oVGUsc2UsRWUsTGUsRmUsaXQpPT57dmFye3Nsb3RTY29wZUlkczpUdH09c2U7VHQmJihGZT1GZT9GZS5jb25jYXQoVHQpOlR0KTt2YXIgUWU9TihUZSksQj1BZSh3KFRlKSxzZSxRZSxFZSxMZSxGZSxpdCk7cmV0dXJuIEImJnZpKEIpJiZCLmRhdGE9PT0iXSI/dyhzZS5hbmNob3I9Qik6KFVuPSEwLEYoc2UuYW5jaG9yPXEoIl0iLFFlKSxRZSxCKSxCKX0sWGU9KFRlLHNlLEVlLExlLEZlLGl0KT0+e2lmKFVuPSEwLGdlKGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDoKLSBDbGllbnQgdm5vZGU6YCxzZS50eXBlLGAKLSBTZXJ2ZXIgcmVuZGVyZWQgRE9NOmAsVGUsVGUubm9kZVR5cGU9PT0zPyIodGV4dCkiOnZpKFRlKSYmVGUuZGF0YT09PSJbIj8iKHN0YXJ0IG9mIGZyYWdtZW50KSI6IiIpLHNlLmVsPW51bGwsaXQpZm9yKHZhciBUdD1mdChUZSk7Oyl7dmFyIFFlPXcoVGUpO2lmKFFlJiZRZSE9PVR0KVYoUWUpO2Vsc2UgYnJlYWt9dmFyIEI9dyhUZSksaj1OKFRlKTtyZXR1cm4gVihUZSksZihudWxsLHNlLGosQixFZSxMZSxHaShqKSxGZSksQn0sZnQ9VGU9Pntmb3IodmFyIHNlPTA7VGU7KWlmKFRlPXcoVGUpLFRlJiZ2aShUZSkmJihUZS5kYXRhPT09IlsiJiZzZSsrLFRlLmRhdGE9PT0iXSIpKXtpZihzZT09PTApcmV0dXJuIHcoVGUpO3NlLS19cmV0dXJuIFRlfTtyZXR1cm5bYmUsYWVdfXZhciB0aSwkcjtmdW5jdGlvbiBPcihpLGEpe2kuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UmJkVzKCkmJiRyLm1hcmsoInZ1ZS0iLmNvbmNhdChhLCItIikuY29uY2F0KGkudWlkKSksd3IoaSxhLEVzKCk/JHIubm93KCk6RGF0ZS5ub3coKSl9ZnVuY3Rpb24gUGkoaSxhKXtpZihpLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlJiZFcygpKXt2YXIgZj0idnVlLSIuY29uY2F0KGEsIi0iKS5jb25jYXQoaS51aWQpLHA9ZisiOmVuZCI7JHIubWFyayhwKSwkci5tZWFzdXJlKCI8Ii5jb25jYXQoa3MoaSxpLnR5cGUpLCI+ICIpLmNvbmNhdChhKSxmLHApLCRyLmNsZWFyTWFya3MoZiksJHIuY2xlYXJNYXJrcyhwKX1jaShpLGEsRXMoKT8kci5ub3coKTpEYXRlLm5vdygpKX1mdW5jdGlvbiBFcygpe3JldHVybiB0aSE9PXZvaWQgMHx8KHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cucGVyZm9ybWFuY2U/KHRpPSEwLCRyPXdpbmRvdy5wZXJmb3JtYW5jZSk6dGk9ITEpLHRpfWZ1bmN0aW9uIGhyKCl7dmFyIGk9W107aWYoaS5sZW5ndGgpe3ZhciBhPWkubGVuZ3RoPjE7Y29uc29sZS53YXJuKCJGZWF0dXJlIGZsYWciLmNvbmNhdChhPyJzIjoiIiwiICIpLmNvbmNhdChpLmpvaW4oIiwgIiksIiAiKS5jb25jYXQoYT8iYXJlIjoiaXMiLCIgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsICIpK2B3aGljaCBleHBlY3RzIHRoZXNlIGNvbXBpbGUtdGltZSBmZWF0dXJlIGZsYWdzIHRvIGJlIGdsb2JhbGx5IGluamVjdGVkIHZpYSB0aGUgYnVuZGxlciBjb25maWcgaW4gb3JkZXIgdG8gZ2V0IGJldHRlciB0cmVlLXNoYWtpbmcgaW4gdGhlIHByb2R1Y3Rpb24gYnVuZGxlLgoKRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gKX19dmFyIEFyPWFvO2Z1bmN0aW9uIHpzKGkpe3JldHVybiBWbyhpKX1mdW5jdGlvbiBuaShpKXtyZXR1cm4gVm8oaSxJaSl9ZnVuY3Rpb24gVm8oaSxhKXtocigpO3ZhciBmPWQuZ2V0R2xvYmFsVGhpcygpO2YuX19WVUVfXz0hMCxKbihmLl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sZik7dmFye2luc2VydDpwLHJlbW92ZTpTLHBhdGNoUHJvcDp3LGZvcmNlUGF0Y2hQcm9wOk4sY3JlYXRlRWxlbWVudDpWLGNyZWF0ZVRleHQ6RixjcmVhdGVDb21tZW50OnEsc2V0VGV4dDpiZSxzZXRFbGVtZW50VGV4dDphZSxwYXJlbnROb2RlOm5lLG5leHRTaWJsaW5nOkFlLHNldFNjb3BlSWQ6RGU9ZC5OT09QLGluc2VydFN0YXRpY0NvbnRlbnQ6WGV9PWksZnQ9ZnVuY3Rpb24oRyxYLHdlKXt2YXIgJGU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGwsemU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwscnQ9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOm51bGwsbXQ9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLG90PWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTpudWxsLGN0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTpScj8hMTohIVguZHluYW1pY0NoaWxkcmVuO2lmKEchPT1YKXtHJiYhcmkoRyxYKSYmKCRlPWduKEcpLHF0KEcsemUscnQsITApLEc9bnVsbCksWC5wYXRjaEZsYWc9PT0tMiYmKGN0PSExLFguZHluYW1pY0NoaWxkcmVuPW51bGwpO3Zhcnt0eXBlOlllLHJlZjokdCxzaGFwZUZsYWc6RnR9PVg7c3dpdGNoKFllKXtjYXNlIHh0OlRlKEcsWCx3ZSwkZSk7YnJlYWs7Y2FzZSBZdDpzZShHLFgsd2UsJGUpO2JyZWFrO2Nhc2UgV246Rz09bnVsbD9FZShYLHdlLCRlLG10KTpMZShHLFgsd2UsbXQpO2JyZWFrO2Nhc2UgdXQ6dmUoRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KTticmVhaztkZWZhdWx0OkZ0JjE/VHQoRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KTpGdCY2P2V0KEcsWCx3ZSwkZSx6ZSxydCxtdCxvdCxjdCk6RnQmNjR8fEZ0JjEyOD9ZZS5wcm9jZXNzKEcsWCx3ZSwkZSx6ZSxydCxtdCxvdCxjdCx5aSk6Z2UoIkludmFsaWQgVk5vZGUgdHlwZToiLFllLCIoIi5jb25jYXQodHlwZW9mIFllLCIpIikpfSR0IT1udWxsJiZ6ZSYmV2koJHQsRyYmRy5yZWYscnQsWHx8RywhWCl9fSxUZT0oRyxYLHdlLCRlKT0+e2lmKEc9PW51bGwpcChYLmVsPUYoWC5jaGlsZHJlbix3ZSksd2UsJGUpO2Vsc2V7dmFyIHplPVguZWw9Ry5lbDtYLmNoaWxkcmVuIT09Ry5jaGlsZHJlbiYmYmUoemUsWC5jaGlsZHJlbil9fSxzZT0oRyxYLHdlLCRlKT0+e0c9PW51bGw/cChYLmVsPXEoWC5jaGlsZHJlbnx8IiIsd2UpLHdlLCRlKTpYLmVsPUcuZWx9LEVlPShHLFgsd2UsJGUpPT57W0cuZWwsRy5hbmNob3JdPVhlKEcuY2hpbGRyZW4sWCx3ZSwkZSxHLmVsLEcuYW5jaG9yKX0sTGU9KEcsWCx3ZSwkZSk9PntpZihYLmNoaWxkcmVuIT09Ry5jaGlsZHJlbil7dmFyIHplPUFlKEcuYW5jaG9yKTtpdChHKSxbWC5lbCxYLmFuY2hvcl09WGUoWC5jaGlsZHJlbix3ZSx6ZSwkZSl9ZWxzZSBYLmVsPUcuZWwsWC5hbmNob3I9Ry5hbmNob3J9LEZlPShHLFgsd2UpPT57Zm9yKHZhcntlbDokZSxhbmNob3I6emV9PUcscnQ7JGUmJiRlIT09emU7KXJ0PUFlKCRlKSxwKCRlLFgsd2UpLCRlPXJ0O3AoemUsWCx3ZSl9LGl0PUc9Pntmb3IodmFye2VsOlgsYW5jaG9yOndlfT1HLCRlO1gmJlghPT13ZTspJGU9QWUoWCksUyhYKSxYPSRlO1Mod2UpfSxUdD0oRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KT0+e210PW10fHxYLnR5cGU9PT0ic3ZnIixHPT1udWxsP1FlKFgsd2UsJGUsemUscnQsbXQsb3QsY3QpOmllKEcsWCx6ZSxydCxtdCxvdCxjdCl9LFFlPShHLFgsd2UsJGUsemUscnQsbXQsb3QpPT57dmFyIGN0LFllLHt0eXBlOiR0LHByb3BzOkZ0LHNoYXBlRmxhZzpIdCx0cmFuc2l0aW9uOkNuLGRpcnM6V3J9PUc7aWYoY3Q9Ry5lbD1WKEcudHlwZSxYKSxIdCY4P2FlKGN0LEcuY2hpbGRyZW4pOkh0JjE2JiZqKEcuY2hpbGRyZW4sY3QsbnVsbCwkZSx6ZSxydCYmJHQhPT0iZm9yZWlnbk9iamVjdCIsbXQsb3QpLFdyJiZUaShHLG51bGwsJGUsImNyZWF0ZWQiKSxCKGN0LEcsRy5zY29wZUlkLG10LCRlKSxGdCl7Zm9yKHZhciByciBpbiBGdClyciE9PSJ2YWx1ZSImJiFkLmlzUmVzZXJ2ZWRQcm9wKHJyKSYmdyhjdCxycixudWxsLEZ0W3JyXSxydCxHLmNoaWxkcmVuLCRlLHplLFRuKTsidmFsdWUiaW4gRnQmJncoY3QsInZhbHVlIixudWxsLEZ0LnZhbHVlKSwoWWU9RnQub25Wbm9kZUJlZm9yZU1vdW50KSYmanIoWWUsJGUsRyl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGN0LCJfX3Zub2RlIix7dmFsdWU6RyxlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0LCJfX3Z1ZVBhcmVudENvbXBvbmVudCIse3ZhbHVlOiRlLGVudW1lcmFibGU6ITF9KSxXciYmVGkoRyxudWxsLCRlLCJiZWZvcmVNb3VudCIpO3ZhciBFaT0oIXplfHx6ZSYmIXplLnBlbmRpbmdCcmFuY2gpJiZDbiYmIUNuLnBlcnNpc3RlZDtFaSYmQ24uYmVmb3JlRW50ZXIoY3QpLHAoY3QsWCx3ZSksKChZZT1GdCYmRnQub25Wbm9kZU1vdW50ZWQpfHxFaXx8V3IpJiZBcigoKT0+e1llJiZqcihZZSwkZSxHKSxFaSYmQ24uZW50ZXIoY3QpLFdyJiZUaShHLG51bGwsJGUsIm1vdW50ZWQiKX0semUpfSxCPShHLFgsd2UsJGUsemUpPT57aWYod2UmJkRlKEcsd2UpLCRlKWZvcih2YXIgcnQ9MDtydDwkZS5sZW5ndGg7cnQrKylEZShHLCRlW3J0XSk7aWYoemUpe3ZhciBtdD16ZS5zdWJUcmVlO2lmKG10LnBhdGNoRmxhZz4wJiZtdC5wYXRjaEZsYWcmMjA0OCYmKG10PUVvKG10LmNoaWxkcmVuKXx8bXQpLFg9PT1tdCl7dmFyIG90PXplLnZub2RlO0IoRyxvdCxvdC5zY29wZUlkLG90LnNsb3RTY29wZUlkcyx6ZS5wYXJlbnQpfX19LGo9ZnVuY3Rpb24oRyxYLHdlLCRlLHplLHJ0LG10LG90KXtmb3IodmFyIGN0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTowLFllPWN0O1llPEcubGVuZ3RoO1llKyspe3ZhciAkdD1HW1llXT1vdD9IcihHW1llXSk6bXIoR1tZZV0pO2Z0KG51bGwsJHQsWCx3ZSwkZSx6ZSxydCxtdCxvdCl9fSxpZT0oRyxYLHdlLCRlLHplLHJ0LG10KT0+e3ZhciBvdD1YLmVsPUcuZWwse3BhdGNoRmxhZzpjdCxkeW5hbWljQ2hpbGRyZW46WWUsZGlyczokdH09WDtjdHw9Ry5wYXRjaEZsYWcmMTY7dmFyIEZ0PUcucHJvcHN8fGQuRU1QVFlfT0JKLEh0PVgucHJvcHN8fGQuRU1QVFlfT0JKLENuO3dlJiZZaSh3ZSwhMSksKENuPUh0Lm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZqcihDbix3ZSxYLEcpLCR0JiZUaShYLEcsd2UsImJlZm9yZVVwZGF0ZSIpLHdlJiZZaSh3ZSwhMCksUnImJihjdD0wLG10PSExLFllPW51bGwpO3ZhciBXcj16ZSYmWC50eXBlIT09ImZvcmVpZ25PYmplY3QiO2lmKFllPyh5ZShHLmR5bmFtaWNDaGlsZHJlbixZZSxvdCx3ZSwkZSxXcixydCksd2UmJndlLnR5cGUuX19obXJJZCYmRWEoRyxYKSk6bXR8fEJ0KEcsWCxvdCxudWxsLHdlLCRlLFdyLHJ0LCExKSxjdD4wKXtpZihjdCYxNilvZShvdCxYLEZ0LEh0LHdlLCRlLHplKTtlbHNlIGlmKGN0JjImJkZ0LmNsYXNzIT09SHQuY2xhc3MmJncob3QsImNsYXNzIixudWxsLEh0LmNsYXNzLHplKSxjdCY0JiZ3KG90LCJzdHlsZSIsRnQuc3R5bGUsSHQuc3R5bGUsemUpLGN0JjgpZm9yKHZhciBycj1YLmR5bmFtaWNQcm9wcyxFaT0wO0VpPHJyLmxlbmd0aDtFaSsrKXt2YXIgZmE9cnJbRWldLEJzPUZ0W2ZhXSx0bD1IdFtmYV07KHRsIT09QnN8fGZhPT09InZhbHVlInx8TiYmTihvdCxmYSkpJiZ3KG90LGZhLEJzLHRsLHplLEcuY2hpbGRyZW4sd2UsJGUsVG4pfWN0JjEmJkcuY2hpbGRyZW4hPT1YLmNoaWxkcmVuJiZhZShvdCxYLmNoaWxkcmVuKX1lbHNlIW10JiZZZT09bnVsbCYmb2Uob3QsWCxGdCxIdCx3ZSwkZSx6ZSk7KChDbj1IdC5vblZub2RlVXBkYXRlZCl8fCR0KSYmQXIoKCk9PntDbiYmanIoQ24sd2UsWCxHKSwkdCYmVGkoWCxHLHdlLCJ1cGRhdGVkIil9LCRlKX0seWU9KEcsWCx3ZSwkZSx6ZSxydCxtdCk9Pntmb3IodmFyIG90PTA7b3Q8WC5sZW5ndGg7b3QrKyl7dmFyIGN0PUdbb3RdLFllPVhbb3RdLCR0PWN0LmVsJiYoY3QudHlwZT09PXV0fHwhcmkoY3QsWWUpfHxjdC5zaGFwZUZsYWcmKDZ8NjQpKT9uZShjdC5lbCk6d2U7ZnQoY3QsWWUsJHQsbnVsbCwkZSx6ZSxydCxtdCwhMCl9fSxvZT0oRyxYLHdlLCRlLHplLHJ0LG10KT0+e2lmKHdlIT09JGUpe2lmKHdlIT09ZC5FTVBUWV9PQkopZm9yKHZhciBvdCBpbiB3ZSkhZC5pc1Jlc2VydmVkUHJvcChvdCkmJiEob3QgaW4gJGUpJiZ3KEcsb3Qsd2Vbb3RdLG51bGwsbXQsWC5jaGlsZHJlbix6ZSxydCxUbik7Zm9yKHZhciBjdCBpbiAkZSlpZighZC5pc1Jlc2VydmVkUHJvcChjdCkpe3ZhciBZZT0kZVtjdF0sJHQ9d2VbY3RdOyhZZSE9PSR0JiZjdCE9PSJ2YWx1ZSJ8fE4mJk4oRyxjdCkpJiZ3KEcsY3QsJHQsWWUsbXQsWC5jaGlsZHJlbix6ZSxydCxUbil9InZhbHVlImluICRlJiZ3KEcsInZhbHVlIix3ZS52YWx1ZSwkZS52YWx1ZSl9fSx2ZT0oRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KT0+e3ZhciBZZT1YLmVsPUc/Ry5lbDpGKCIiLHdlKSwkdD1YLmFuY2hvcj1HP0cuYW5jaG9yOkYoIiIsd2UpLHtwYXRjaEZsYWc6RnQsZHluYW1pY0NoaWxkcmVuOkh0LHNsb3RTY29wZUlkczpDbn09WDsoUnJ8fEZ0JjIwNDgpJiYoRnQ9MCxjdD0hMSxIdD1udWxsKSxDbiYmKG90PW90P290LmNvbmNhdChDbik6Q24pLEc9PW51bGw/KHAoWWUsd2UsJGUpLHAoJHQsd2UsJGUpLGooWC5jaGlsZHJlbix3ZSwkdCx6ZSxydCxtdCxvdCxjdCkpOkZ0PjAmJkZ0JjY0JiZIdCYmRy5keW5hbWljQ2hpbGRyZW4/KHllKEcuZHluYW1pY0NoaWxkcmVuLEh0LHdlLHplLHJ0LG10LG90KSx6ZSYmemUudHlwZS5fX2htcklkP0VhKEcsWCk6KFgua2V5IT1udWxsfHx6ZSYmWD09PXplLnN1YlRyZWUpJiZFYShHLFgsITApKTpCdChHLFgsd2UsJHQsemUscnQsbXQsb3QsY3QpfSxldD0oRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KT0+e1guc2xvdFNjb3BlSWRzPW90LEc9PW51bGw/WC5zaGFwZUZsYWcmNTEyP3plLmN0eC5hY3RpdmF0ZShYLHdlLCRlLG10LGN0KTpHZShYLHdlLCRlLHplLHJ0LG10LGN0KTp0dChHLFgsY3QpfSxHZT0oRyxYLHdlLCRlLHplLHJ0LG10KT0+e3ZhciBvdD1HLmNvbXBvbmVudD1CbihHLCRlLHplKTtpZihvdC50eXBlLl9faG1ySWQmJllyKG90KSxQdChHKSxPcihvdCwibW91bnQiKSxZKEcpJiYob3QuY3R4LnJlbmRlcmVyPXlpKSxPcihvdCwiaW5pdCIpLGpvKG90KSxQaShvdCwiaW5pdCIpLG90LmFzeW5jRGVwKXtpZih6ZSYmemUucmVnaXN0ZXJEZXAob3QsVmUpLCFHLmVsKXt2YXIgY3Q9b3Quc3ViVHJlZT0kbihZdCk7c2UobnVsbCxjdCxYLHdlKX1yZXR1cm59aWYoVmUob3QsRyxYLHdlLHplLHJ0LG10KSxvdC4kd3hzTW9kdWxlcyl7dmFyIFllPVIucmVzb2x2ZU93bmVyRWwob3QsITApO1llLmxlbmd0aCYmWWUuZm9yRWFjaCgkdD0+eyR0LnNldEF0dHJpYnV0ZShSLkFUVFJfVl9PV05FUl9JRCxvdC51aWQpO3ZhcnskcmVuZGVyanNNb2R1bGVzOkZ0fT1vdC50eXBlO0Z0JiYkdC5zZXRBdHRyaWJ1dGUoUi5BVFRSX1ZfUkVOREVSSlMsRnQpfSl9ZW4oKSxQaShvdCwibW91bnQiKX0sdHQ9KEcsWCx3ZSk9Pnt2YXIgJGU9WC5jb21wb25lbnQ9Ry5jb21wb25lbnQ7aWYod28oRyxYLHdlKSlpZigkZS5hc3luY0RlcCYmISRlLmFzeW5jUmVzb2x2ZWQpe1B0KFgpLEx0KCRlLFgsd2UpLGVuKCk7cmV0dXJufWVsc2UgJGUubmV4dD1YLFVyKCRlLnVwZGF0ZSksJGUudXBkYXRlKCk7ZWxzZSBYLmVsPUcuZWwsJGUudm5vZGU9WH0sVmU9KEcsWCx3ZSwkZSx6ZSxydCxtdCk9Pnt2YXIgb3Q9KCk9PntpZihHLmlzTW91bnRlZCl7dmFye25leHQ6X3IsYnU6Tm8sdTppcyxwYXJlbnQ6a28sdm5vZGU6b3N9PUcsbmw9X3IsYXM7UHQoX3J8fEcudm5vZGUpLFlpKEcsITEpLF9yPyhfci5lbD1vcy5lbCxMdChHLF9yLG10KSk6X3I9b3MsTm8mJmQuaW52b2tlQXJyYXlGbnMoTm8pLChhcz1fci5wcm9wcyYmX3IucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkmJmpyKGFzLGtvLF9yLG9zKSxZaShHLCEwKSxPcihHLCJyZW5kZXIiKTt2YXIgTXM9Ym8oRyk7UGkoRywicmVuZGVyIik7dmFyIFdhPUcuc3ViVHJlZTtHLnN1YlRyZWU9TXMsT3IoRywicGF0Y2giKSxmdChXYSxNcyxuZShXYS5lbCksZ24oV2EpLEcsemUscnQpLFBpKEcsInBhdGNoIiksX3IuZWw9TXMuZWwsbmw9PT1udWxsJiZmaShHLE1zLmVsKSxpcyYmQXIoaXMsemUpLChhcz1fci5wcm9wcyYmX3IucHJvcHMub25Wbm9kZVVwZGF0ZWQpJiZBcigoKT0+anIoYXMsa28sX3Isb3MpLHplKSxpbyhHKSxlbigpfWVsc2V7dmFyICR0LHtlbDpGdCxwcm9wczpIdH09WCx7Ym06Q24sbTpXcixwYXJlbnQ6cnJ9PUcsRWk9aGUoWCk7aWYoWWkoRywhMSksQ24mJmQuaW52b2tlQXJyYXlGbnMoQ24pLCFFaSYmKCR0PUh0JiZIdC5vblZub2RlQmVmb3JlTW91bnQpJiZqcigkdCxycixYKSxZaShHLCEwKSxGdCYmdWEpe3ZhciBmYT0oKT0+e09yKEcsInJlbmRlciIpLEcuc3ViVHJlZT1ibyhHKSxQaShHLCJyZW5kZXIiKSxPcihHLCJoeWRyYXRlIiksdWEoRnQsRy5zdWJUcmVlLEcsemUsbnVsbCksUGkoRywiaHlkcmF0ZSIpfTtFaT9YLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFHLmlzVW5tb3VudGVkJiZmYSgpKTpmYSgpfWVsc2V7T3IoRywicmVuZGVyIik7dmFyIEJzPUcuc3ViVHJlZT1ibyhHKTtQaShHLCJyZW5kZXIiKSxPcihHLCJwYXRjaCIpLGZ0KG51bGwsQnMsd2UsJGUsRyx6ZSxydCksUGkoRywicGF0Y2giKSxYLmVsPUJzLmVsfWlmKFdyJiZBcihXcix6ZSksIUVpJiYoJHQ9SHQmJkh0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIHRsPVg7QXIoKCk9PmpyKCR0LHJyLHRsKSx6ZSl9KFguc2hhcGVGbGFnJjI1Nnx8cnImJmhlKHJyLnZub2RlKSYmcnIudm5vZGUuc2hhcGVGbGFnJjI1NikmJkcuYSYmQXIoRy5hLHplKSxHLmlzTW91bnRlZD0hMCxybyhHKSxYPXdlPSRlPW51bGx9fSxjdD1HLmVmZmVjdD1uZXcgbS5SZWFjdGl2ZUVmZmVjdChvdCwoKT0+TG4oWWUpLEcuc2NvcGUpLFllPUcudXBkYXRlPSgpPT5jdC5ydW4oKTtZZS5pZD1HLnVpZCxZaShHLCEwKSxjdC5vblRyYWNrPUcucnRjPyR0PT5kLmludm9rZUFycmF5Rm5zKEcucnRjLCR0KTp2b2lkIDAsY3Qub25UcmlnZ2VyPUcucnRnPyR0PT5kLmludm9rZUFycmF5Rm5zKEcucnRnLCR0KTp2b2lkIDAsWWUub3duZXJJbnN0YW5jZT1HLFllKCl9LEx0PShHLFgsd2UpPT57WC5jb21wb25lbnQ9Rzt2YXIgJGU9Ry52bm9kZS5wcm9wcztHLnZub2RlPVgsRy5uZXh0PW51bGwsQ3QoRyxYLnByb3BzLCRlLHdlKSx0cihHLFguY2hpbGRyZW4sd2UpLG0ucGF1c2VUcmFja2luZygpLGxyKCksbS5yZXNldFRyYWNraW5nKCl9LEJ0PWZ1bmN0aW9uKEcsWCx3ZSwkZSx6ZSxydCxtdCxvdCl7dmFyIGN0PWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohMSxZZT1HJiZHLmNoaWxkcmVuLCR0PUc/Ry5zaGFwZUZsYWc6MCxGdD1YLmNoaWxkcmVuLHtwYXRjaEZsYWc6SHQsc2hhcGVGbGFnOkNufT1YO2lmKEh0PjApe2lmKEh0JjEyOCl7dW4oWWUsRnQsd2UsJGUsemUscnQsbXQsb3QsY3QpO3JldHVybn1lbHNlIGlmKEh0JjI1Nil7VXQoWWUsRnQsd2UsJGUsemUscnQsbXQsb3QsY3QpO3JldHVybn19Q24mOD8oJHQmMTYmJlRuKFllLHplLHJ0KSxGdCE9PVllJiZhZSh3ZSxGdCkpOiR0JjE2P0NuJjE2P3VuKFllLEZ0LHdlLCRlLHplLHJ0LG10LG90LGN0KTpUbihZZSx6ZSxydCwhMCk6KCR0JjgmJmFlKHdlLCIiKSxDbiYxNiYmaihGdCx3ZSwkZSx6ZSxydCxtdCxvdCxjdCkpfSxVdD0oRyxYLHdlLCRlLHplLHJ0LG10LG90LGN0KT0+e0c9R3x8ZC5FTVBUWV9BUlIsWD1YfHxkLkVNUFRZX0FSUjt2YXIgWWU9Ry5sZW5ndGgsJHQ9WC5sZW5ndGgsRnQ9TWF0aC5taW4oWWUsJHQpLEh0O2ZvcihIdD0wO0h0PEZ0O0h0Kyspe3ZhciBDbj1YW0h0XT1jdD9IcihYW0h0XSk6bXIoWFtIdF0pO2Z0KEdbSHRdLENuLHdlLG51bGwsemUscnQsbXQsb3QsY3QpfVllPiR0P1RuKEcsemUscnQsITAsITEsRnQpOmooWCx3ZSwkZSx6ZSxydCxtdCxvdCxjdCxGdCl9LHVuPShHLFgsd2UsJGUsemUscnQsbXQsb3QsY3QpPT57Zm9yKHZhciBZZT0wLCR0PVgubGVuZ3RoLEZ0PUcubGVuZ3RoLTEsSHQ9JHQtMTtZZTw9RnQmJlllPD1IdDspe3ZhciBDbj1HW1llXSxXcj1YW1llXT1jdD9IcihYW1llXSk6bXIoWFtZZV0pO2lmKHJpKENuLFdyKSlmdChDbixXcix3ZSxudWxsLHplLHJ0LG10LG90LGN0KTtlbHNlIGJyZWFrO1llKyt9Zm9yKDtZZTw9RnQmJlllPD1IdDspe3ZhciBycj1HW0Z0XSxFaT1YW0h0XT1jdD9IcihYW0h0XSk6bXIoWFtIdF0pO2lmKHJpKHJyLEVpKSlmdChycixFaSx3ZSxudWxsLHplLHJ0LG10LG90LGN0KTtlbHNlIGJyZWFrO0Z0LS0sSHQtLX1pZihZZT5GdCl7aWYoWWU8PUh0KWZvcih2YXIgZmE9SHQrMSxCcz1mYTwkdD9YW2ZhXS5lbDokZTtZZTw9SHQ7KWZ0KG51bGwsWFtZZV09Y3Q/SHIoWFtZZV0pOm1yKFhbWWVdKSx3ZSxCcyx6ZSxydCxtdCxvdCxjdCksWWUrK31lbHNlIGlmKFllPkh0KWZvcig7WWU8PUZ0OylxdChHW1llXSx6ZSxydCwhMCksWWUrKztlbHNle3ZhciB0bD1ZZSxfcj1ZZSxObz1uZXcgTWFwO2ZvcihZZT1fcjtZZTw9SHQ7WWUrKyl7dmFyIGlzPVhbWWVdPWN0P0hyKFhbWWVdKTptcihYW1llXSk7aXMua2V5IT1udWxsJiYoTm8uaGFzKGlzLmtleSkmJmdlKCJEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOiIsSlNPTi5zdHJpbmdpZnkoaXMua2V5KSwiTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS4iKSxOby5zZXQoaXMua2V5LFllKSl9dmFyIGtvLG9zPTAsbmw9SHQtX3IrMSxhcz0hMSxNcz0wLFdhPW5ldyBBcnJheShubCk7Zm9yKFllPTA7WWU8bmw7WWUrKylXYVtZZV09MDtmb3IoWWU9dGw7WWU8PUZ0O1llKyspe3ZhciBzcz1HW1llXTtpZihvcz49bmwpe3F0KHNzLHplLHJ0LCEwKTtjb250aW51ZX12YXIgR2E9dm9pZCAwO2lmKHNzLmtleSE9bnVsbClHYT1Oby5nZXQoc3Mua2V5KTtlbHNlIGZvcihrbz1fcjtrbzw9SHQ7a28rKylpZihXYVtrby1fcl09PT0wJiZyaShzcyxYW2tvXSkpe0dhPWtvO2JyZWFrfUdhPT09dm9pZCAwP3F0KHNzLHplLHJ0LCEwKTooV2FbR2EtX3JdPVllKzEsR2E+PU1zP01zPUdhOmFzPSEwLGZ0KHNzLFhbR2FdLHdlLG51bGwsemUscnQsbXQsb3QsY3QpLG9zKyspfXZhciBldT1hcz9MYShXYSk6ZC5FTVBUWV9BUlI7Zm9yKGtvPWV1Lmxlbmd0aC0xLFllPW5sLTE7WWU+PTA7WWUtLSl7dmFyIENjPV9yK1llLHR1PVhbQ2NdLG51PUNjKzE8JHQ/WFtDYysxXS5lbDokZTtXYVtZZV09PT0wP2Z0KG51bGwsdHUsd2UsbnUsemUscnQsbXQsb3QsY3QpOmFzJiYoa288MHx8WWUhPT1ldVtrb10/WW4odHUsd2UsbnUsMik6a28tLSl9fX0sWW49ZnVuY3Rpb24oRyxYLHdlLCRlKXt2YXIgemU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwse2VsOnJ0LHR5cGU6bXQsdHJhbnNpdGlvbjpvdCxjaGlsZHJlbjpjdCxzaGFwZUZsYWc6WWV9PUc7aWYoWWUmNil7WW4oRy5jb21wb25lbnQuc3ViVHJlZSxYLHdlLCRlKTtyZXR1cm59aWYoWWUmMTI4KXtHLnN1c3BlbnNlLm1vdmUoWCx3ZSwkZSk7cmV0dXJufWlmKFllJjY0KXttdC5tb3ZlKEcsWCx3ZSx5aSk7cmV0dXJufWlmKG10PT09dXQpe3AocnQsWCx3ZSk7Zm9yKHZhciAkdD0wOyR0PGN0Lmxlbmd0aDskdCsrKVluKGN0WyR0XSxYLHdlLCRlKTtwKEcuYW5jaG9yLFgsd2UpO3JldHVybn1pZihtdD09PVduKXtGZShHLFgsd2UpO3JldHVybn12YXIgRnQ9JGUhPT0yJiZZZSYxJiZvdDtpZihGdClpZigkZT09PTApb3QuYmVmb3JlRW50ZXIocnQpLHAocnQsWCx3ZSksQXIoKCk9Pm90LmVudGVyKHJ0KSx6ZSk7ZWxzZXt2YXJ7bGVhdmU6SHQsZGVsYXlMZWF2ZTpDbixhZnRlckxlYXZlOldyfT1vdCxycj0oKT0+cChydCxYLHdlKSxFaT0oKT0+e0h0KHJ0LCgpPT57cnIoKSxXciYmV3IoKX0pfTtDbj9DbihydCxycixFaSk6RWkoKX1lbHNlIHAocnQsWCx3ZSl9LHF0PWZ1bmN0aW9uKEcsWCx3ZSl7dmFyICRlPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx6ZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEse3R5cGU6cnQscHJvcHM6bXQscmVmOm90LGNoaWxkcmVuOmN0LGR5bmFtaWNDaGlsZHJlbjpZZSxzaGFwZUZsYWc6JHQscGF0Y2hGbGFnOkZ0LGRpcnM6SHR9PUc7aWYob3QhPW51bGwmJldpKG90LG51bGwsd2UsRywhMCksJHQmMjU2KXtYLmN0eC5kZWFjdGl2YXRlKEcpO3JldHVybn12YXIgQ249JHQmMSYmSHQsV3I9IWhlKEcpLHJyO2lmKFdyJiYocnI9bXQmJm10Lm9uVm5vZGVCZWZvcmVVbm1vdW50KSYmanIocnIsWCxHKSwkdCY2KXNuKEcuY29tcG9uZW50LHdlLCRlKTtlbHNle2lmKCR0JjEyOCl7Ry5zdXNwZW5zZS51bm1vdW50KHdlLCRlKTtyZXR1cm59Q24mJlRpKEcsbnVsbCxYLCJiZWZvcmVVbm1vdW50IiksJHQmNjQ/Ry50eXBlLnJlbW92ZShHLFgsd2UsemUseWksJGUpOlllJiYocnQhPT11dHx8RnQ+MCYmRnQmNjQpP1RuKFllLFgsd2UsITEsITApOihydD09PXV0JiZGdCYoMTI4fDI1Nil8fCF6ZSYmJHQmMTYpJiZUbihjdCxYLHdlKSwkZSYmYm4oRyl9KFdyJiYocnI9bXQmJm10Lm9uVm5vZGVVbm1vdW50ZWQpfHxDbikmJkFyKCgpPT57cnImJmpyKHJyLFgsRyksQ24mJlRpKEcsbnVsbCxYLCJ1bm1vdW50ZWQiKX0sd2UpfSxibj1HPT57dmFye3R5cGU6WCxlbDp3ZSxhbmNob3I6JGUsdHJhbnNpdGlvbjp6ZX09RztpZihYPT09dXQpe0cucGF0Y2hGbGFnPjAmJkcucGF0Y2hGbGFnJjIwNDgmJnplJiYhemUucGVyc2lzdGVkP0cuY2hpbGRyZW4uZm9yRWFjaChZZT0+e1llLnR5cGU9PT1ZdD9TKFllLmVsKTpibihZZSl9KTpiaSh3ZSwkZSk7cmV0dXJufWlmKFg9PT1Xbil7aXQoRyk7cmV0dXJufXZhciBydD0oKT0+e1Mod2UpLHplJiYhemUucGVyc2lzdGVkJiZ6ZS5hZnRlckxlYXZlJiZ6ZS5hZnRlckxlYXZlKCl9O2lmKEcuc2hhcGVGbGFnJjEmJnplJiYhemUucGVyc2lzdGVkKXt2YXJ7bGVhdmU6bXQsZGVsYXlMZWF2ZTpvdH09emUsY3Q9KCk9Pm10KHdlLHJ0KTtvdD9vdChHLmVsLHJ0LGN0KTpjdCgpfWVsc2UgcnQoKX0sYmk9KEcsWCk9Pntmb3IodmFyIHdlO0chPT1YOyl3ZT1BZShHKSxTKEcpLEc9d2U7UyhYKX0sc249KEcsWCx3ZSk9PntHLnR5cGUuX19obXJJZCYmVGEoRyk7dmFye2J1bTokZSxzY29wZTp6ZSx1cGRhdGU6cnQsc3ViVHJlZTptdCx1bTpvdH09RzskZSYmZC5pbnZva2VBcnJheUZucygkZSksemUuc3RvcCgpLHJ0JiYocnQuYWN0aXZlPSExLHF0KG10LEcsWCx3ZSkpLG90JiZBcihvdCxYKSxBcigoKT0+e0cuaXNVbm1vdW50ZWQ9ITB9LFgpLFgmJlgucGVuZGluZ0JyYW5jaCYmIVguaXNVbm1vdW50ZWQmJkcuYXN5bmNEZXAmJiFHLmFzeW5jUmVzb2x2ZWQmJkcuc3VzcGVuc2VJZD09PVgucGVuZGluZ0lkJiYoWC5kZXBzLS0sWC5kZXBzPT09MCYmWC5yZXNvbHZlKCkpLG9vKEcpfSxUbj1mdW5jdGlvbihHLFgsd2Upe2Zvcih2YXIgJGU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHplPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSxydD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06MCxtdD1ydDttdDxHLmxlbmd0aDttdCsrKXF0KEdbbXRdLFgsd2UsJGUsemUpfSxnbj1HPT5HLnNoYXBlRmxhZyY2P2duKEcuY29tcG9uZW50LnN1YlRyZWUpOkcuc2hhcGVGbGFnJjEyOD9HLnN1c3BlbnNlLm5leHQoKTpBZShHLmFuY2hvcnx8Ry5lbCksWGk9KEcsWCx3ZSk9PntHPT1udWxsP1guX3Zub2RlJiZxdChYLl92bm9kZSxudWxsLG51bGwsITApOmZ0KFguX3Zub2RlfHxudWxsLEcsWCxudWxsLG51bGwsbnVsbCx3ZSksbHIoKSxFcigpLFguX3Zub2RlPUd9LHlpPXtwOmZ0LHVtOnF0LG06WW4scjpibixtdDpHZSxtYzpqLHBjOkJ0LHBiYzp5ZSxuOmduLG86aX0senIsdWE7cmV0dXJuIGEmJihbenIsdWFdPWEoeWkpKSx7cmVuZGVyOlhpLGh5ZHJhdGU6enIsY3JlYXRlQXBwOkZvKFhpLHpyKX19ZnVuY3Rpb24gWWkoaSxhKXt2YXJ7ZWZmZWN0OmYsdXBkYXRlOnB9PWk7Zi5hbGxvd1JlY3Vyc2U9cC5hbGxvd1JlY3Vyc2U9YX1mdW5jdGlvbiBFYShpLGEpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSxwPWkuY2hpbGRyZW4sUz1hLmNoaWxkcmVuO2lmKGQuaXNBcnJheShwKSYmZC5pc0FycmF5KFMpKWZvcih2YXIgdz0wO3c8cC5sZW5ndGg7dysrKXt2YXIgTj1wW3ddLFY9U1t3XTtWLnNoYXBlRmxhZyYxJiYhVi5keW5hbWljQ2hpbGRyZW4mJigoVi5wYXRjaEZsYWc8PTB8fFYucGF0Y2hGbGFnPT09MzIpJiYoVj1TW3ddPUhyKFNbd10pLFYuZWw9Ti5lbCksZnx8RWEoTixWKSksVi50eXBlPT09eHQmJihWLmVsPU4uZWwpLFYudHlwZT09PVl0JiYhVi5lbCYmKFYuZWw9Ti5lbCl9fWZ1bmN0aW9uIExhKGkpe3ZhciBhPWkuc2xpY2UoKSxmPVswXSxwLFMsdyxOLFYsRj1pLmxlbmd0aDtmb3IocD0wO3A8RjtwKyspe3ZhciBxPWlbcF07aWYocSE9PTApe2lmKFM9ZltmLmxlbmd0aC0xXSxpW1NdPHEpe2FbcF09UyxmLnB1c2gocCk7Y29udGludWV9Zm9yKHc9MCxOPWYubGVuZ3RoLTE7dzxOOylWPXcrTj4+MSxpW2ZbVl1dPHE/dz1WKzE6Tj1WO3E8aVtmW3ddXSYmKHc+MCYmKGFbcF09Zlt3LTFdKSxmW3ddPXApfX1mb3Iodz1mLmxlbmd0aCxOPWZbdy0xXTt3LS0gPjA7KWZbd109TixOPWFbTl07cmV0dXJuIGZ9dmFyIHBvPWk9PmkuX19pc1RlbGVwb3J0LE5pPWk9PmkmJihpLmRpc2FibGVkfHxpLmRpc2FibGVkPT09IiIpLHdzPWk9PnR5cGVvZiBTVkdFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQsVW89KGksYSk9Pnt2YXIgZj1pJiZpLnRvO2lmKGQuaXNTdHJpbmcoZikpaWYoYSl7dmFyIHA9YShmKTtyZXR1cm4gcHx8Z2UoJ0ZhaWxlZCB0byBsb2NhdGUgVGVsZXBvcnQgdGFyZ2V0IHdpdGggc2VsZWN0b3IgIicuY29uY2F0KGYsJyIuICcpKyJOb3RlIHRoZSB0YXJnZXQgZWxlbWVudCBtdXN0IGV4aXN0IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQgLSBpLmUuIHRoZSB0YXJnZXQgY2Fubm90IGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQgaXRzZWxmLCBhbmQgaWRlYWxseSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUgZW50aXJlIFZ1ZSBjb21wb25lbnQgdHJlZS4iKSxwfWVsc2UgcmV0dXJuIGdlKCJDdXJyZW50IHJlbmRlcmVyIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIHRhcmdldCBmb3IgVGVsZXBvcnRzLiAobWlzc2luZyBxdWVyeVNlbGVjdG9yIHJlbmRlcmVyIG9wdGlvbikiKSxudWxsO2Vsc2UgcmV0dXJuIWYmJiFOaShpKSYmZ2UoIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0OiAiLmNvbmNhdChmKSksZn0sU3M9e19faXNUZWxlcG9ydDohMCxwcm9jZXNzKGksYSxmLHAsUyx3LE4sVixGLHEpe3ZhcnttYzpiZSxwYzphZSxwYmM6bmUsbzp7aW5zZXJ0OkFlLHF1ZXJ5U2VsZWN0b3I6RGUsY3JlYXRlVGV4dDpYZSxjcmVhdGVDb21tZW50OmZ0fX09cSxUZT1OaShhLnByb3BzKSx7c2hhcGVGbGFnOnNlLGNoaWxkcmVuOkVlLGR5bmFtaWNDaGlsZHJlbjpMZX09YTtpZihSciYmKEY9ITEsTGU9bnVsbCksaT09bnVsbCl7dmFyIEZlPWEuZWw9ZnQoInRlbGVwb3J0IHN0YXJ0IixmKSxpdD1hLmFuY2hvcj1mdCgidGVsZXBvcnQgZW5kIixmKTtBZShGZSxmLHApLEFlKGl0LGYscCk7dmFyIFR0PWEudGFyZ2V0PVVvKGEucHJvcHMsRGUpLFFlPWEudGFyZ2V0QW5jaG9yPVhlKCIiLGYpO1R0PyhBZShRZSxUdCksTj1OfHx3cyhUdCkpOlRlfHxnZSgiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6IixUdCwiKCIuY29uY2F0KHR5cGVvZiBUdCwiKSIpKTt2YXIgQj0odHQsVmUpPT57c2UmMTYmJmJlKEVlLHR0LFZlLFMsdyxOLFYsRil9O1RlP0IoZixpdCk6VHQmJkIoVHQsUWUpfWVsc2V7YS5lbD1pLmVsO3ZhciBqPWEuYW5jaG9yPWkuYW5jaG9yLGllPWEudGFyZ2V0PWkudGFyZ2V0LHllPWEudGFyZ2V0QW5jaG9yPWkudGFyZ2V0QW5jaG9yLG9lPU5pKGkucHJvcHMpLHZlPW9lP2Y6aWUsZXQ9b2U/ajp5ZTtpZihOPU58fHdzKGllKSxMZT8obmUoaS5keW5hbWljQ2hpbGRyZW4sTGUsdmUsUyx3LE4sViksRWEoaSxhLCEwKSk6Rnx8YWUoaSxhLHZlLGV0LFMsdyxOLFYsITEpLFRlKW9lfHxaYShhLGYsaixxLDEpO2Vsc2UgaWYoKGEucHJvcHMmJmEucHJvcHMudG8pIT09KGkucHJvcHMmJmkucHJvcHMudG8pKXt2YXIgR2U9YS50YXJnZXQ9VW8oYS5wcm9wcyxEZSk7R2U/WmEoYSxHZSxudWxsLHEsMCk6Z2UoIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZToiLGllLCIoIi5jb25jYXQodHlwZW9mIGllLCIpIikpfWVsc2Ugb2UmJlphKGEsaWUseWUscSwxKX1ndChhKX0scmVtb3ZlKGksYSxmLHAsUyx3KXt2YXJ7dW06TixvOntyZW1vdmU6Vn19PVMse3NoYXBlRmxhZzpGLGNoaWxkcmVuOnEsYW5jaG9yOmJlLHRhcmdldEFuY2hvcjphZSx0YXJnZXQ6bmUscHJvcHM6QWV9PWk7aWYobmUmJlYoYWUpLCh3fHwhTmkoQWUpKSYmKFYoYmUpLEYmMTYpKWZvcih2YXIgRGU9MDtEZTxxLmxlbmd0aDtEZSsrKXt2YXIgWGU9cVtEZV07TihYZSxhLGYsITAsISFYZS5keW5hbWljQ2hpbGRyZW4pfX0sbW92ZTpaYSxoeWRyYXRlOlJsfTtmdW5jdGlvbiBaYShpLGEsZixwKXt2YXJ7bzp7aW5zZXJ0OlN9LG06d309cCxOPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XToyO049PT0wJiZTKGkudGFyZ2V0QW5jaG9yLGEsZik7dmFye2VsOlYsYW5jaG9yOkYsc2hhcGVGbGFnOnEsY2hpbGRyZW46YmUscHJvcHM6YWV9PWksbmU9Tj09PTI7aWYobmUmJlMoVixhLGYpLCghbmV8fE5pKGFlKSkmJnEmMTYpZm9yKHZhciBBZT0wO0FlPGJlLmxlbmd0aDtBZSsrKXcoYmVbQWVdLGEsZiwyKTtuZSYmUyhGLGEsZil9ZnVuY3Rpb24gUmwoaSxhLGYscCxTLHcsTixWKXt2YXJ7bzp7bmV4dFNpYmxpbmc6RixwYXJlbnROb2RlOnEscXVlcnlTZWxlY3RvcjpiZX19PU4sYWU9YS50YXJnZXQ9VW8oYS5wcm9wcyxiZSk7aWYoYWUpe3ZhciBuZT1hZS5fbHBhfHxhZS5maXJzdENoaWxkO2lmKGEuc2hhcGVGbGFnJjE2KWlmKE5pKGEucHJvcHMpKWEuYW5jaG9yPVYoRihpKSxhLHEoaSksZixwLFMsdyksYS50YXJnZXRBbmNob3I9bmU7ZWxzZXthLmFuY2hvcj1GKGkpO2Zvcih2YXIgQWU9bmU7QWU7KWlmKEFlPUYoQWUpLEFlJiZBZS5ub2RlVHlwZT09PTgmJkFlLmRhdGE9PT0idGVsZXBvcnQgYW5jaG9yIil7YS50YXJnZXRBbmNob3I9QWUsYWUuX2xwYT1hLnRhcmdldEFuY2hvciYmRihhLnRhcmdldEFuY2hvcik7YnJlYWt9VihuZSxhLGFlLGYscCxTLHcpfWd0KGEpfXJldHVybiBhLmFuY2hvciYmRihhLmFuY2hvcil9dmFyIFVlPVNzO2Z1bmN0aW9uIGd0KGkpe3ZhciBhPWkuY3R4O2lmKGEmJmEudXQpe2Zvcih2YXIgZj1pLmNoaWxkcmVuWzBdLmVsO2YhPT1pLnRhcmdldEFuY2hvcjspZi5ub2RlVHlwZT09PTEmJmYuc2V0QXR0cmlidXRlKCJkYXRhLXYtb3duZXIiLGEudWlkKSxmPWYubmV4dFNpYmxpbmc7YS51dCgpfX12YXIgdXQ9U3ltYm9sKCJGcmFnbWVudCIpLHh0PVN5bWJvbCgiVGV4dCIpLFl0PVN5bWJvbCgiQ29tbWVudCIpLFduPVN5bWJvbCgiU3RhdGljIiksTW49W10sbnI9bnVsbDtmdW5jdGlvbiB3YSgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMTtNbi5wdXNoKG5yPWk/bnVsbDpbXSl9ZnVuY3Rpb24ga2koKXtNbi5wb3AoKSxucj1NbltNbi5sZW5ndGgtMV18fG51bGx9dmFyICRvPTE7ZnVuY3Rpb24gV3MoaSl7JG8rPWl9ZnVuY3Rpb24gYWMoaSl7cmV0dXJuIGkuZHluYW1pY0NoaWxkcmVuPSRvPjA/bnJ8fGQuRU1QVFlfQVJSOm51bGwsa2koKSwkbz4wJiZuciYmbnIucHVzaChpKSxpfWZ1bmN0aW9uIHhsKGksYSxmLHAsUyx3KXtyZXR1cm4gYWMoR24oaSxhLGYscCxTLHcsITApKX1mdW5jdGlvbiBvYShpLGEsZixwLFMpe3JldHVybiBhYygkbihpLGEsZixwLFMsITApKX1mdW5jdGlvbiB2cihpKXtyZXR1cm4gaT9pLl9fdl9pc1ZOb2RlPT09ITA6ITF9ZnVuY3Rpb24gcmkoaSxhKXtyZXR1cm4gYS5zaGFwZUZsYWcmNiYmeHIuaGFzKGEudHlwZSk/KGkuc2hhcGVGbGFnJj1+MjU2LGEuc2hhcGVGbGFnJj1+NTEyLCExKTppLnR5cGU9PT1hLnR5cGUmJmkua2V5PT09YS5rZXl9dmFyIFhhO2Z1bmN0aW9uIENzKGkpe1hhPWl9dmFyIE9zPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkoaSksZj0wO2Y8aTtmKyspYVtmXT1hcmd1bWVudHNbZl07cmV0dXJuIEJsKC4uLlhhP1hhKGEsRW4pOmEpfSxBcz0iX192SW50ZXJuYWwiLEhvPWk9Pnt2YXJ7a2V5OmF9PWk7cmV0dXJuIGEhPW51bGw/YTpudWxsfSxGYT1pPT57dmFye3JlZjphLHJlZl9rZXk6ZixyZWZfZm9yOnB9PWk7cmV0dXJuIGEhPW51bGw/ZC5pc1N0cmluZyhhKXx8bS5pc1JlZihhKXx8ZC5pc0Z1bmN0aW9uKGEpP3tpOkVuLHI6YSxrOmYsZjohIXB9OmE6bnVsbH07ZnVuY3Rpb24gR24oaSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsZj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCxwPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLFM9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsdz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06aT09PXV0PzA6MSxOPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTohMSxWPWFyZ3VtZW50cy5sZW5ndGg+NyYmYXJndW1lbnRzWzddIT09dm9pZCAwP2FyZ3VtZW50c1s3XTohMSxGPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmkscHJvcHM6YSxrZXk6YSYmSG8oYSkscmVmOmEmJkZhKGEpLHNjb3BlSWQ6dWksc2xvdFNjb3BlSWRzOm51bGwsY2hpbGRyZW46Zixjb21wb25lbnQ6bnVsbCxzdXNwZW5zZTpudWxsLHNzQ29udGVudDpudWxsLHNzRmFsbGJhY2s6bnVsbCxkaXJzOm51bGwsdHJhbnNpdGlvbjpudWxsLGVsOm51bGwsYW5jaG9yOm51bGwsdGFyZ2V0Om51bGwsdGFyZ2V0QW5jaG9yOm51bGwsc3RhdGljQ291bnQ6MCxzaGFwZUZsYWc6dyxwYXRjaEZsYWc6cCxkeW5hbWljUHJvcHM6UyxkeW5hbWljQ2hpbGRyZW46bnVsbCxhcHBDb250ZXh0Om51bGwsY3R4OkVufTtyZXR1cm4gVj8oVmEoRixmKSx3JjEyOCYmaS5ub3JtYWxpemUoRikpOmYmJihGLnNoYXBlRmxhZ3w9ZC5pc1N0cmluZyhmKT84OjE2KSxGLmtleSE9PUYua2V5JiZnZSgiVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOiIsRi50eXBlKSwkbz4wJiYhTiYmbnImJihGLnBhdGNoRmxhZz4wfHx3JjYpJiZGLnBhdGNoRmxhZyE9PTMyJiZuci5wdXNoKEYpLEZ9dmFyICRuPU9zO2Z1bmN0aW9uIEJsKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwscD1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxTPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHc9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOiExO2lmKCghaXx8aT09PW1hKSYmKGl8fGdlKCJJbnZhbGlkIHZub2RlIHR5cGUgd2hlbiBjcmVhdGluZyB2bm9kZTogIi5jb25jYXQoaSwiLiIpKSxpPVl0KSx2cihpKSl7dmFyIE49SmkoaSxhLCEwKTtyZXR1cm4gZiYmVmEoTixmKSwkbz4wJiYhdyYmbnImJihOLnNoYXBlRmxhZyY2P25yW25yLmluZGV4T2YoaSldPU46bnIucHVzaChOKSksTi5wYXRjaEZsYWd8PS0yLE59aWYoTGwoaSkmJihpPWkuX192Y2NPcHRzKSxhKXthPXFpKGEpO3ZhcntjbGFzczpWLHN0eWxlOkZ9PWE7ViYmIWQuaXNTdHJpbmcoVikmJihhLmNsYXNzPWQubm9ybWFsaXplQ2xhc3MoVikpLGQuaXNPYmplY3QoRikmJihtLmlzUHJveHkoRikmJiFkLmlzQXJyYXkoRikmJihGPWQuZXh0ZW5kKHt9LEYpKSxhLnN0eWxlPWQubm9ybWFsaXplU3R5bGUoRikpfXZhciBxPWQuaXNTdHJpbmcoaSk/MTpRbyhpKT8xMjg6cG8oaSk/NjQ6ZC5pc09iamVjdChpKT80OmQuaXNGdW5jdGlvbihpKT8yOjA7cmV0dXJuIHEmNCYmbS5pc1Byb3h5KGkpJiYoaT1tLnRvUmF3KGkpLGdlKCJWdWUgcmVjZWl2ZWQgYSBDb21wb25lbnQgd2hpY2ggd2FzIG1hZGUgYSByZWFjdGl2ZSBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBgbWFya1Jhd2Agb3IgdXNpbmcgYHNoYWxsb3dSZWZgIGluc3RlYWQgb2YgYHJlZmAuIixgCkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLGkpKSxHbihpLGEsZixwLFMscSx3LCEwKX1mdW5jdGlvbiBxaShpKXtyZXR1cm4gaT9tLmlzUHJveHkoaSl8fEFzIGluIGk/ZC5leHRlbmQoe30saSk6aTpudWxsfWZ1bmN0aW9uIEppKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHtwcm9wczpwLHJlZjpTLHBhdGNoRmxhZzp3LGNoaWxkcmVuOk59PWksVj1hP0ZyKHB8fHt9LGEpOnAsRj17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTppLnR5cGUscHJvcHM6VixrZXk6ViYmSG8oVikscmVmOmEmJmEucmVmP2YmJlM/ZC5pc0FycmF5KFMpP1MuY29uY2F0KEZhKGEpKTpbUyxGYShhKV06RmEoYSk6UyxzY29wZUlkOmkuc2NvcGVJZCxzbG90U2NvcGVJZHM6aS5zbG90U2NvcGVJZHMsY2hpbGRyZW46dz09PS0xJiZkLmlzQXJyYXkoTik/Ti5tYXAoVHMpOk4sdGFyZ2V0OmkudGFyZ2V0LHRhcmdldEFuY2hvcjppLnRhcmdldEFuY2hvcixzdGF0aWNDb3VudDppLnN0YXRpY0NvdW50LHNoYXBlRmxhZzppLnNoYXBlRmxhZyxwYXRjaEZsYWc6YSYmaS50eXBlIT09dXQ/dz09PS0xPzE2Ond8MTY6dyxkeW5hbWljUHJvcHM6aS5keW5hbWljUHJvcHMsZHluYW1pY0NoaWxkcmVuOmkuZHluYW1pY0NoaWxkcmVuLGFwcENvbnRleHQ6aS5hcHBDb250ZXh0LGRpcnM6aS5kaXJzLHRyYW5zaXRpb246aS50cmFuc2l0aW9uLGNvbXBvbmVudDppLmNvbXBvbmVudCxzdXNwZW5zZTppLnN1c3BlbnNlLHNzQ29udGVudDppLnNzQ29udGVudCYmSmkoaS5zc0NvbnRlbnQpLHNzRmFsbGJhY2s6aS5zc0ZhbGxiYWNrJiZKaShpLnNzRmFsbGJhY2spLGVsOmkuZWwsYW5jaG9yOmkuYW5jaG9yLGN0eDppLmN0eCxjZTppLmNlfTtyZXR1cm4gRn1mdW5jdGlvbiBUcyhpKXt2YXIgYT1KaShpKTtyZXR1cm4gZC5pc0FycmF5KGkuY2hpbGRyZW4pJiYoYS5jaGlsZHJlbj1pLmNoaWxkcmVuLm1hcChUcykpLGF9ZnVuY3Rpb24gSXMoKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiAiLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjA7cmV0dXJuICRuKHh0LG51bGwsaSxhKX1mdW5jdGlvbiBqYyhpLGEpe3ZhciBmPSRuKFduLG51bGwsaSk7cmV0dXJuIGYuc3RhdGljQ291bnQ9YSxmfWZ1bmN0aW9uIEtpKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIiLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBhPyh3YSgpLG9hKFl0LG51bGwsaSkpOiRuKFl0LG51bGwsaSl9ZnVuY3Rpb24gbXIoaSl7cmV0dXJuIGk9PW51bGx8fHR5cGVvZiBpPT0iYm9vbGVhbiI/JG4oWXQpOmQuaXNBcnJheShpKT8kbih1dCxudWxsLGkuc2xpY2UoKSk6dHlwZW9mIGk9PSJvYmplY3QiP0hyKGkpOiRuKHh0LG51bGwsU3RyaW5nKGkpKX1mdW5jdGlvbiBIcihpKXtyZXR1cm4gaS5lbD09PW51bGwmJmkucGF0Y2hGbGFnIT09LTF8fGkubWVtbz9pOkppKGkpfWZ1bmN0aW9uIFZhKGksYSl7dmFyIGY9MCx7c2hhcGVGbGFnOnB9PWk7aWYoYT09bnVsbClhPW51bGw7ZWxzZSBpZihkLmlzQXJyYXkoYSkpZj0xNjtlbHNlIGlmKHR5cGVvZiBhPT0ib2JqZWN0IilpZihwJigxfDY0KSl7dmFyIFM9YS5kZWZhdWx0O1MmJihTLl9jJiYoUy5fZD0hMSksVmEoaSxTKCkpLFMuX2MmJihTLl9kPSEwKSk7cmV0dXJufWVsc2V7Zj0zMjt2YXIgdz1hLl87IXcmJiEoQXMgaW4gYSk/YS5fY3R4PUVuOnc9PT0zJiZFbiYmKEVuLnNsb3RzLl89PT0xP2EuXz0xOihhLl89MixpLnBhdGNoRmxhZ3w9MTAyNCkpfWVsc2UgZC5pc0Z1bmN0aW9uKGEpPyhhPXtkZWZhdWx0OmEsX2N0eDpFbn0sZj0zMik6KGE9U3RyaW5nKGEpLHAmNjQ/KGY9MTYsYT1bSXMoYSldKTpmPTgpO2kuY2hpbGRyZW49YSxpLnNoYXBlRmxhZ3w9Zn1mdW5jdGlvbiBGcigpe2Zvcih2YXIgaT17fSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl7dmFyIGY9YTwwfHxhcmd1bWVudHMubGVuZ3RoPD1hP3ZvaWQgMDphcmd1bWVudHNbYV07Zm9yKHZhciBwIGluIGYpaWYocD09PSJjbGFzcyIpaS5jbGFzcyE9PWYuY2xhc3MmJihpLmNsYXNzPWQubm9ybWFsaXplQ2xhc3MoW2kuY2xhc3MsZi5jbGFzc10pKTtlbHNlIGlmKHA9PT0ic3R5bGUiKWkuc3R5bGU9ZC5ub3JtYWxpemVTdHlsZShbaS5zdHlsZSxmLnN0eWxlXSk7ZWxzZSBpZihkLmlzT24ocCkpe3ZhciBTPWlbcF0sdz1mW3BdO3cmJlMhPT13JiYhKGQuaXNBcnJheShTKSYmUy5pbmNsdWRlcyh3KSkmJihpW3BdPVM/W10uY29uY2F0KFMsdyk6dyl9ZWxzZSBwIT09IiImJihpW3BdPWZbcF0pfXJldHVybiBpfWZ1bmN0aW9uIGpyKGksYSxmKXt2YXIgcD1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106bnVsbDtLdChpLGEsNyxbZixwXSl9dmFyIE1sPUthKCksdWw9MDtmdW5jdGlvbiBCbihpLGEsZil7dmFyIHA9aS50eXBlLFM9KGE/YS5hcHBDb250ZXh0OmkuYXBwQ29udGV4dCl8fE1sLHc9e3VpZDp1bCsrLHZub2RlOmksdHlwZTpwLHBhcmVudDphLGFwcENvbnRleHQ6Uyxyb290Om51bGwsbmV4dDpudWxsLHN1YlRyZWU6bnVsbCxlZmZlY3Q6bnVsbCx1cGRhdGU6bnVsbCxzY29wZTpuZXcgbS5FZmZlY3RTY29wZSghMCkscmVuZGVyOm51bGwscHJveHk6bnVsbCxleHBvc2VkOm51bGwsZXhwb3NlUHJveHk6bnVsbCx3aXRoUHJveHk6bnVsbCxwcm92aWRlczphP2EucHJvdmlkZXM6T2JqZWN0LmNyZWF0ZShTLnByb3ZpZGVzKSxhY2Nlc3NDYWNoZTpudWxsLHJlbmRlckNhY2hlOltdLGNvbXBvbmVudHM6bnVsbCxkaXJlY3RpdmVzOm51bGwscHJvcHNPcHRpb25zOktlKHAsUyksZW1pdHNPcHRpb25zOkpyKHAsUyksZW1pdDpudWxsLGVtaXR0ZWQ6bnVsbCxwcm9wc0RlZmF1bHRzOmQuRU1QVFlfT0JKLGluaGVyaXRBdHRyczpwLmluaGVyaXRBdHRycyxjdHg6ZC5FTVBUWV9PQkosZGF0YTpkLkVNUFRZX09CSixwcm9wczpkLkVNUFRZX09CSixhdHRyczpkLkVNUFRZX09CSixzbG90czpkLkVNUFRZX09CSixyZWZzOmQuRU1QVFlfT0JKLHNldHVwU3RhdGU6ZC5FTVBUWV9PQkosc2V0dXBDb250ZXh0Om51bGwsc3VzcGVuc2U6ZixzdXNwZW5zZUlkOmY/Zi5wZW5kaW5nSWQ6MCxhc3luY0RlcDpudWxsLGFzeW5jUmVzb2x2ZWQ6ITEsaXNNb3VudGVkOiExLGlzVW5tb3VudGVkOiExLGlzRGVhY3RpdmF0ZWQ6ITEsYmM6bnVsbCxjOm51bGwsYm06bnVsbCxtOm51bGwsYnU6bnVsbCx1Om51bGwsdW06bnVsbCxidW06bnVsbCxkYTpudWxsLGE6bnVsbCxydGc6bnVsbCxydGM6bnVsbCxlYzpudWxsLHNwOm51bGx9O3JldHVybiB3LmN0eD0kcyh3KSx3LnJvb3Q9YT9hLnJvb3Q6dyx3LmVtaXQ9Wm8uYmluZChudWxsLHcpLGkuY2UmJmkuY2Uodyksd312YXIgU249bnVsbCxtaT0oKT0+U258fEVuLF9pPWk9PntTbj1pLGkuc2NvcGUub24oKX0sYWE9KCk9PntTbiYmU24uc2NvcGUub2ZmKCksU249bnVsbH0sZmw9ZC5tYWtlTWFwKCJzbG90LGNvbXBvbmVudCIpO2Z1bmN0aW9uIFVhKGksYSl7dmFyIGY9YS5pc05hdGl2ZVRhZ3x8ZC5OTzsoZmwoaSl8fGYoaSkpJiZnZSgiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogIitpKX1mdW5jdGlvbiBSaShpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH1DLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiBqbyhpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7Qy5pc0luU1NSQ29tcG9uZW50U2V0dXA9YTt2YXJ7cHJvcHM6ZixjaGlsZHJlbjpwfT1pLnZub2RlLFM9UmkoaSk7amUoaSxmLFMsYSksaWEoaSxwKTt2YXIgdz1TP2RsKGksYSk6dm9pZCAwO3JldHVybiBDLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMSx3fWZ1bmN0aW9uIGRsKGksYSl7dmFyIGYscD1pLnR5cGU7e2lmKHAubmFtZSYmVWEocC5uYW1lLGkuYXBwQ29udGV4dC5jb25maWcpLHAuY29tcG9uZW50cylmb3IodmFyIFM9T2JqZWN0LmtleXMocC5jb21wb25lbnRzKSx3PTA7dzxTLmxlbmd0aDt3KyspVWEoU1t3XSxpLmFwcENvbnRleHQuY29uZmlnKTtpZihwLmRpcmVjdGl2ZXMpZm9yKHZhciBOPU9iamVjdC5rZXlzKHAuZGlyZWN0aXZlcyksVj0wO1Y8Ti5sZW5ndGg7VisrKWlsKE5bVl0pO3AuY29tcGlsZXJPcHRpb25zJiZwbCgpJiZnZSgnImNvbXBpbGVyT3B0aW9ucyIgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZSB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyLiBTaW5jZSB5b3UgYXJlIHVzaW5nIGEgcnVudGltZS1vbmx5IGJ1aWxkLCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHZpYSB5b3VyIGJ1aWxkIHRvb2wgY29uZmlnIGluc3RlYWQuJyl9aS5hY2Nlc3NDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLGkucHJveHk9bS5tYXJrUmF3KG5ldyBQcm94eShpLmN0eCx4YSkpLGtsKGkpO3ZhcntzZXR1cDpGfT1wO2lmKEYpe3ZhciBxPWkuc2V0dXBDb250ZXh0PUYubGVuZ3RoPjE/UHMoaSk6bnVsbDtfaShpKSxtLnBhdXNlVHJhY2tpbmcoKTt2YXIgYmU9Zm4oRixpLDAsW20uc2hhbGxvd1JlYWRvbmx5KGkucHJvcHMpLHFdKTtpZihtLnJlc2V0VHJhY2tpbmcoKSxhYSgpLGQuaXNQcm9taXNlKGJlKSl7aWYoYmUudGhlbihhYSxhYSksYSlyZXR1cm4gYmUudGhlbihuZT0+e1FhKGksbmUsYSl9KS5jYXRjaChuZT0+e2NuKG5lLGksMCl9KTtpZihpLmFzeW5jRGVwPWJlLCFpLnN1c3BlbnNlKXt2YXIgYWU9KGY9cC5uYW1lKSE9PW51bGwmJmYhPT12b2lkIDA/ZjoiQW5vbnltb3VzIjtnZSgiQ29tcG9uZW50IDwiLmNvbmNhdChhZSwiPjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gIikrIjxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuIil9fWVsc2UgUWEoaSxiZSxhKX1lbHNlIERsKGksYSl9ZnVuY3Rpb24gUWEoaSxhLGYpe2QuaXNGdW5jdGlvbihhKT9pLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/aS5zc3JSZW5kZXI9YTppLnJlbmRlcj1hOmQuaXNPYmplY3QoYSk/KHZyKGEpJiZnZSgic2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC4iKSxpLmRldnRvb2xzUmF3U2V0dXBTdGF0ZT1hLGkuc2V0dXBTdGF0ZT1tLnByb3h5UmVmcyhhKSx5YShpKSk6YSE9PXZvaWQgMCYmZ2UoInNldHVwKCkgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuIFJlY2VpdmVkOiAiLmNvbmNhdChhPT09bnVsbD8ibnVsbCI6dHlwZW9mIGEpKSxEbChpLGYpfXZhciBlcyxobDtmdW5jdGlvbiBzYyhpKXtlcz1pLGhsPWE9PnthLnJlbmRlci5fcmMmJihhLndpdGhQcm94eT1uZXcgUHJveHkoYS5jdHgsc2wpKX19dmFyIHBsPSgpPT4hZXM7ZnVuY3Rpb24gRGwoaSxhLGYpe3ZhciBwPWkudHlwZTtpZighaS5yZW5kZXIpe2lmKCFhJiZlcyYmIXAucmVuZGVyKXt2YXIgUz1wLnRlbXBsYXRlfHxXKGkpLnRlbXBsYXRlO2lmKFMpe09yKGksImNvbXBpbGUiKTt2YXJ7aXNDdXN0b21FbGVtZW50OncsY29tcGlsZXJPcHRpb25zOk59PWkuYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6Vixjb21waWxlck9wdGlvbnM6Rn09cCxxPWQuZXh0ZW5kKGQuZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6dyxkZWxpbWl0ZXJzOlZ9LE4pLEYpO3AucmVuZGVyPWVzKFMscSksUGkoaSwiY29tcGlsZSIpfX1pLnJlbmRlcj1wLnJlbmRlcnx8ZC5OT09QLGhsJiZobChpKX1faShpKSxtLnBhdXNlVHJhY2tpbmcoKSxsbChpKSxtLnJlc2V0VHJhY2tpbmcoKSxhYSgpLCFwLnJlbmRlciYmaS5yZW5kZXI9PT1kLk5PT1AmJiFhJiYoIWVzJiZwLnRlbXBsYXRlP2dlKCdDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgInZ1ZSIgdG8gInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qcyIuJyk6Z2UoIkNvbXBvbmVudCBpcyBtaXNzaW5nIHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbi4iKSl9ZnVuY3Rpb24gbGMoaSl7cmV0dXJuIG5ldyBQcm94eShpLmF0dHJzLHtnZXQoYSxmKXtyZXR1cm4ga2UoKSxtLnRyYWNrKGksImdldCIsIiRhdHRycyIpLGFbZl19LHNldCgpe3JldHVybiBnZSgic2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LiIpLCExfSxkZWxldGVQcm9wZXJ0eSgpe3JldHVybiBnZSgic2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LiIpLCExfX0pfWZ1bmN0aW9uIFBzKGkpe3ZhciBhPXA9PntpZihpLmV4cG9zZWQmJmdlKCJleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS4iKSxwIT1udWxsKXt2YXIgUz10eXBlb2YgcDtTPT09Im9iamVjdCImJihkLmlzQXJyYXkocCk/Uz0iYXJyYXkiOm0uaXNSZWYocCkmJihTPSJyZWYiKSksUyE9PSJvYmplY3QiJiZnZSgiZXhwb3NlKCkgc2hvdWxkIGJlIHBhc3NlZCBhIHBsYWluIG9iamVjdCwgcmVjZWl2ZWQgIi5jb25jYXQoUywiLiIpKX1pLmV4cG9zZWQ9cHx8e319LGY7cmV0dXJuIE9iamVjdC5mcmVlemUoe2dldCBhdHRycygpe3JldHVybiBmfHwoZj1sYyhpKSl9LGdldCBzbG90cygpe3JldHVybiBtLnNoYWxsb3dSZWFkb25seShpLnNsb3RzKX0sZ2V0IGVtaXQoKXtyZXR1cm4gZnVuY3Rpb24ocCl7Zm9yKHZhciBTPWFyZ3VtZW50cy5sZW5ndGgsdz1uZXcgQXJyYXkoUz4xP1MtMTowKSxOPTE7TjxTO04rKyl3W04tMV09YXJndW1lbnRzW05dO3JldHVybiBpLmVtaXQocCwuLi53KX19LGV4cG9zZTphfSl9ZnVuY3Rpb24gTnMoaSl7aWYoaS5leHBvc2VkKXJldHVybiBpLmV4cG9zZVByb3h5fHwoaS5leHBvc2VQcm94eT1uZXcgUHJveHkobS5wcm94eVJlZnMobS5tYXJrUmF3KGkuZXhwb3NlZCkpLHtnZXQoYSxmKXtpZihmIGluIGEpcmV0dXJuIGFbZl07aWYoZiBpbiBDcilyZXR1cm4gQ3JbZl0oaSl9LGhhcyhhLGYpe3JldHVybiBmIGluIGF8fGYgaW4gQ3J9fSkpfXZhciBjYz0vKD86XnxbLV9dKShcdykvZyx0cz1pPT5pLnJlcGxhY2UoY2MsYT0+YS50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIiIpO2Z1bmN0aW9uIFNhKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gZC5pc0Z1bmN0aW9uKGkpP2kuZGlzcGxheU5hbWV8fGkubmFtZTppLm5hbWV8fGEmJmkuX19uYW1lfWZ1bmN0aW9uIGtzKGksYSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHA9U2EoYSk7aWYoIXAmJmEuX19maWxlKXt2YXIgUz1hLl9fZmlsZS5tYXRjaCgvKFteL1xcXSspXC5cdyskLyk7UyYmKHA9U1sxXSl9aWYoIXAmJmkmJmkucGFyZW50KXt2YXIgdz1OPT57Zm9yKHZhciBWIGluIE4paWYoTltWXT09PWEpcmV0dXJuIFZ9O3A9dyhpLmNvbXBvbmVudHN8fGkucGFyZW50LnR5cGUuY29tcG9uZW50cyl8fHcoaS5hcHBDb250ZXh0LmNvbXBvbmVudHMpfXJldHVybiBwP3RzKHApOmY/IkFwcCI6IkFub255bW91cyJ9ZnVuY3Rpb24gTGwoaSl7cmV0dXJuIGQuaXNGdW5jdGlvbihpKSYmIl9fdmNjT3B0cyJpbiBpfXZhciBHcz0oaSxhKT0+bS5jb21wdXRlZChpLGEsQy5pc0luU1NSQ29tcG9uZW50U2V0dXApLGdsPWk9PmdlKCIiLmNvbmNhdChpLCIoKSBpcyBhIGNvbXBpbGVyLWhpbnQgaGVscGVyIHRoYXQgaXMgb25seSB1c2FibGUgaW5zaWRlICIpKyI8c2NyaXB0IHNldHVwPiBvZiBhIHNpbmdsZSBmaWxlIGNvbXBvbmVudC4gSXRzIGFyZ3VtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgYXdheSBhbmQgcGFzc2luZyBpdCBhdCBydW50aW1lIGhhcyBubyBlZmZlY3QuIik7ZnVuY3Rpb24gdWMoKXtyZXR1cm4gZ2woImRlZmluZVByb3BzIiksbnVsbH1mdW5jdGlvbiB6Yygpe3JldHVybiBnbCgiZGVmaW5lRW1pdHMiKSxudWxsfWZ1bmN0aW9uIGZjKGkpe2dsKCJkZWZpbmVFeHBvc2UiKX1mdW5jdGlvbiBXYyhpLGEpe3JldHVybiBnbCgid2l0aERlZmF1bHRzIiksbnVsbH1mdW5jdGlvbiBHYygpe3JldHVybiBoYygpLnNsb3RzfWZ1bmN0aW9uIGRjKCl7cmV0dXJuIGhjKCkuYXR0cnN9ZnVuY3Rpb24gaGMoKXt2YXIgaT1taSgpO3JldHVybiBpfHxnZSgidXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS4iKSxpLnNldHVwQ29udGV4dHx8KGkuc2V0dXBDb250ZXh0PVBzKGkpKX1mdW5jdGlvbiBwYyhpLGEpe3ZhciBmPWQuaXNBcnJheShpKT9pLnJlZHVjZSgodyxOKT0+KHdbTl09e30sdykse30pOmk7Zm9yKHZhciBwIGluIGEpe3ZhciBTPWZbcF07Uz9kLmlzQXJyYXkoUyl8fGQuaXNGdW5jdGlvbihTKT9mW3BdPXt0eXBlOlMsZGVmYXVsdDphW3BdfTpTLmRlZmF1bHQ9YVtwXTpTPT09bnVsbD9mW3BdPXtkZWZhdWx0OmFbcF19OmdlKCdwcm9wcyBkZWZhdWx0IGtleSAiJy5jb25jYXQocCwnIiBoYXMgbm8gY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbi4nKSl9cmV0dXJuIGZ9ZnVuY3Rpb24gWWMoaSxhKXt2YXIgZj17fSxwPWZ1bmN0aW9uKHcpe2EuaW5jbHVkZXModyl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLHcse2VudW1lcmFibGU6ITAsZ2V0OigpPT5pW3ddfSl9O2Zvcih2YXIgUyBpbiBpKXAoUyk7cmV0dXJuIGZ9ZnVuY3Rpb24gcWMoaSl7dmFyIGE9bWkoKTthfHxnZSgid2l0aEFzeW5jQ29udGV4dCBjYWxsZWQgd2l0aG91dCBhY3RpdmUgY3VycmVudCBpbnN0YW5jZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcuIik7dmFyIGY9aSgpO3JldHVybiBhYSgpLGQuaXNQcm9taXNlKGYpJiYoZj1mLmNhdGNoKHA9Pnt0aHJvdyBfaShhKSxwfSkpLFtmLCgpPT5faShhKV19ZnVuY3Rpb24gRmwoaSxhLGYpe3ZhciBwPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHA9PT0yP2QuaXNPYmplY3QoYSkmJiFkLmlzQXJyYXkoYSk/dnIoYSk/JG4oaSxudWxsLFthXSk6JG4oaSxhKTokbihpLG51bGwsYSk6KHA+Mz9mPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTpwPT09MyYmdnIoZikmJihmPVtmXSksJG4oaSxhLGYpKX12YXIgdmw9U3ltYm9sKCJzc3JDb250ZXh0IiksUnM9KCk9Pnt7dmFyIGk9Vm4odmwpO3JldHVybiBpfHxnZSgiU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLiIpLGl9fTtmdW5jdGlvbiBpaShpKXtyZXR1cm4hIShpJiZpLl9fdl9pc1NoYWxsb3cpfWZ1bmN0aW9uIFRvKCl7aWYodHlwZW9mIHdpbmRvdz09InVuZGVmaW5lZCIpcmV0dXJuO3ZhciBpPXtzdHlsZToiY29sb3I6IzNiYTc3NiJ9LGE9e3N0eWxlOiJjb2xvcjojMGIxYmM5In0sZj17c3R5bGU6ImNvbG9yOiNiNjJlMjQifSxwPXtzdHlsZToiY29sb3I6IzlkMjg4YyJ9LFM9e2hlYWRlcihhZSl7cmV0dXJuIGQuaXNPYmplY3QoYWUpP2FlLl9faXNWdWU/WyJkaXYiLGksIlZ1ZUluc3RhbmNlIl06bS5pc1JlZihhZSk/WyJkaXYiLHt9LFsic3BhbiIsaSxiZShhZSldLCI8IixWKGFlLnZhbHVlKSwiPiJdOm0uaXNSZWFjdGl2ZShhZSk/WyJkaXYiLHt9LFsic3BhbiIsaSxpaShhZSk/IlNoYWxsb3dSZWFjdGl2ZSI6IlJlYWN0aXZlIl0sIjwiLFYoYWUpLCI+Ii5jb25jYXQobS5pc1JlYWRvbmx5KGFlKT8iIChyZWFkb25seSkiOiIiKV06bS5pc1JlYWRvbmx5KGFlKT9bImRpdiIse30sWyJzcGFuIixpLGlpKGFlKT8iU2hhbGxvd1JlYWRvbmx5IjoiUmVhZG9ubHkiXSwiPCIsVihhZSksIj4iXTpudWxsOm51bGx9LGhhc0JvZHkoYWUpe3JldHVybiBhZSYmYWUuX19pc1Z1ZX0sYm9keShhZSl7aWYoYWUmJmFlLl9faXNWdWUpcmV0dXJuWyJkaXYiLHt9LC4uLncoYWUuJCldfX07ZnVuY3Rpb24gdyhhZSl7dmFyIG5lPVtdO2FlLnR5cGUucHJvcHMmJmFlLnByb3BzJiZuZS5wdXNoKE4oInByb3BzIixtLnRvUmF3KGFlLnByb3BzKSkpLGFlLnNldHVwU3RhdGUhPT1kLkVNUFRZX09CSiYmbmUucHVzaChOKCJzZXR1cCIsYWUuc2V0dXBTdGF0ZSkpLGFlLmRhdGEhPT1kLkVNUFRZX09CSiYmbmUucHVzaChOKCJkYXRhIixtLnRvUmF3KGFlLmRhdGEpKSk7dmFyIEFlPUYoYWUsImNvbXB1dGVkIik7QWUmJm5lLnB1c2goTigiY29tcHV0ZWQiLEFlKSk7dmFyIERlPUYoYWUsImluamVjdCIpO3JldHVybiBEZSYmbmUucHVzaChOKCJpbmplY3RlZCIsRGUpKSxuZS5wdXNoKFsiZGl2Iix7fSxbInNwYW4iLHtzdHlsZTpwLnN0eWxlKyI7b3BhY2l0eTowLjY2In0sIiQgKGludGVybmFsKTogIl0sWyJvYmplY3QiLHtvYmplY3Q6YWV9XV0pLG5lfWZ1bmN0aW9uIE4oYWUsbmUpe3JldHVybiBuZT1kLmV4dGVuZCh7fSxuZSksT2JqZWN0LmtleXMobmUpLmxlbmd0aD9bImRpdiIse3N0eWxlOiJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbSJ9LFsiZGl2Iix7c3R5bGU6ImNvbG9yOiM0NzY1ODIifSxhZV0sWyJkaXYiLHtzdHlsZToicGFkZGluZy1sZWZ0OjEuMjVlbSJ9LC4uLk9iamVjdC5rZXlzKG5lKS5tYXAoQWU9PlsiZGl2Iix7fSxbInNwYW4iLHAsQWUrIjogIl0sVihuZVtBZV0sITEpXSldXTpbInNwYW4iLHt9XX1mdW5jdGlvbiBWKGFlKXt2YXIgbmU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiB0eXBlb2YgYWU9PSJudW1iZXIiP1sic3BhbiIsYSxhZV06dHlwZW9mIGFlPT0ic3RyaW5nIj9bInNwYW4iLGYsSlNPTi5zdHJpbmdpZnkoYWUpXTp0eXBlb2YgYWU9PSJib29sZWFuIj9bInNwYW4iLHAsYWVdOmQuaXNPYmplY3QoYWUpP1sib2JqZWN0Iix7b2JqZWN0Om5lP20udG9SYXcoYWUpOmFlfV06WyJzcGFuIixmLFN0cmluZyhhZSldfWZ1bmN0aW9uIEYoYWUsbmUpe3ZhciBBZT1hZS50eXBlO2lmKCFkLmlzRnVuY3Rpb24oQWUpKXt2YXIgRGU9e307Zm9yKHZhciBYZSBpbiBhZS5jdHgpcShBZSxYZSxuZSkmJihEZVtYZV09YWUuY3R4W1hlXSk7cmV0dXJuIERlfX1mdW5jdGlvbiBxKGFlLG5lLEFlKXt2YXIgRGU9YWVbQWVdO2lmKGQuaXNBcnJheShEZSkmJkRlLmluY2x1ZGVzKG5lKXx8ZC5pc09iamVjdChEZSkmJm5lIGluIERlfHxhZS5leHRlbmRzJiZxKGFlLmV4dGVuZHMsbmUsQWUpfHxhZS5taXhpbnMmJmFlLm1peGlucy5zb21lKFhlPT5xKFhlLG5lLEFlKSkpcmV0dXJuITB9ZnVuY3Rpb24gYmUoYWUpe3JldHVybiBpaShhZSk/IlNoYWxsb3dSZWYiOmFlLmVmZmVjdD8iQ29tcHV0ZWRSZWYiOiJSZWYifXdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnM/d2luZG93LmRldnRvb2xzRm9ybWF0dGVycy5wdXNoKFMpOndpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnM9W1NdfWZ1bmN0aW9uIFZsKGksYSxmLHApe3ZhciBTPWZbcF07aWYoUyYmem8oUyxpKSlyZXR1cm4gUzt2YXIgdz1hKCk7cmV0dXJuIHcubWVtbz1pLnNsaWNlKCksZltwXT13fWZ1bmN0aW9uIHpvKGksYSl7dmFyIGY9aS5tZW1vO2lmKGYubGVuZ3RoIT1hLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHA9MDtwPGYubGVuZ3RoO3ArKylpZihkLmhhc0NoYW5nZWQoZltwXSxhW3BdKSlyZXR1cm4hMTtyZXR1cm4gJG8+MCYmbnImJm5yLnB1c2goaSksITB9dmFyIG1sPSIzLjIuNDciLG5zPXtjcmVhdGVDb21wb25lbnRJbnN0YW5jZTpCbixzZXR1cENvbXBvbmVudDpqbyxyZW5kZXJDb21wb25lbnRSb290OmJvLHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTpCbyxpc1ZOb2RlOnZyLG5vcm1hbGl6ZVZOb2RlOm1yfSxKYz1ucyxZcz1udWxsLHNhPW51bGw7ZnVuY3Rpb24gcXMoaSxhKXtyZXR1cm4gaT09PSJpbnB1dCI/bmV3IFIuVW5pSW5wdXRFbGVtZW50KGksYSk6aT09PSJ0ZXh0YXJlYSI/bmV3IFIuVW5pVGV4dEFyZWFFbGVtZW50KGksYSk6bmV3IFIuVW5pRWxlbWVudChpLGEpfWZ1bmN0aW9uIFdvKGksYSl7cmV0dXJuIG5ldyBSLlVuaVRleHROb2RlKGksYSl9ZnVuY3Rpb24gSnMoaSxhKXtyZXR1cm4gbmV3IFIuVW5pQ29tbWVudE5vZGUoaSxhKX12YXIgWmksZ2M9e2luc2VydDooaSxhLGYpPT57YS5pbnNlcnRCZWZvcmUoaSxmfHxudWxsKX0scmVtb3ZlOmk9Pnt2YXIgYT1pLnBhcmVudE5vZGU7YSYmYS5yZW1vdmVDaGlsZChpKX0sY3JlYXRlRWxlbWVudDooaSxhKT0+cXMoaSxhKSxjcmVhdGVUZXh0OihpLGEpPT5XbyhpLGEpLGNyZWF0ZUNvbW1lbnQ6KGksYSk9PkpzKGksYSksc2V0VGV4dDooaSxhKT0+e2kubm9kZVZhbHVlPWF9LHNldEVsZW1lbnRUZXh0OihpLGEpPT57aS50ZXh0Q29udGVudD1hfSxwYXJlbnROb2RlOmk9PmkucGFyZW50Tm9kZSxuZXh0U2libGluZzppPT5pLm5leHRTaWJsaW5nLHNldFNjb3BlSWQoaSxhKXtpLnNldEF0dHJpYnV0ZShhLCIiKX0sY2xvbmVOb2RlKGkpe3ZhciBhPWkuY2xvbmVOb2RlKCEwKTtyZXR1cm4iX3ZhbHVlImluIGkmJihhLl92YWx1ZT1pLl92YWx1ZSksYX0saW5zZXJ0U3RhdGljQ29udGVudChpLGEsZil7dmFyIHA9Wml8fChaaT1xcygiZGl2IikpO3AuaW5uZXJIVE1MPWk7Zm9yKHZhciBTPXAuZmlyc3RDaGlsZCx3PVMsTj13O3c7KU49dyxnYy5pbnNlcnQodyxhLGYpLHc9cC5maXJzdENoaWxkO3JldHVybltTLE5dfX07ZnVuY3Rpb24gVWwoaSxhKXthPT1udWxsJiYoYT0iIiksaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhKX1mdW5jdGlvbiBLYyhpLGEsZil7aWYoIWYpaS5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7ZWxzZSBpZihkLmlzU3RyaW5nKGYpKWEhPT1mJiZpLnNldEF0dHJpYnV0ZSgic3R5bGUiLGYpO2Vsc2V7dmFyIHA9e30sUz1hJiYhZC5pc1N0cmluZyhhKTtpZihTKXtmb3IodmFyIHcgaW4gYSlmW3ddPT1udWxsJiYocFt3XT0iIik7Zm9yKHZhciBOIGluIGYpe3ZhciBWPWZbTl07ViE9PWFbTl0mJihwW05dPVYpfX1lbHNlIGZvcih2YXIgRiBpbiBmKXBbRl09ZltGXTtPYmplY3Qua2V5cyhwKS5sZW5ndGgmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIscCl9fWZ1bmN0aW9uIHZjKGksYSxmKXtmPT1udWxsP2kucmVtb3ZlQXR0cmlidXRlKGEpOmkuc2V0QXR0cmlidXRlKGEsZil9ZnVuY3Rpb24gS3MoaSxhLGYscCl7aS5hZGRFdmVudExpc3RlbmVyKGEsZixwKX1mdW5jdGlvbiBtYyhpLGEsZixwKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxmLHApfWZ1bmN0aW9uIF9jKGksYSxmLHApe3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHc9aS5fdmVpfHwoaS5fdmVpPXt9KSxOPXdbYV07aWYocCYmTilOLnZhbHVlPXA7ZWxzZXt2YXJbVixGXT0kbChhKTtpZihwKXt2YXIgcT13W2FdPVpzKHAsUyk7S3MoaSxWLHEsRil9ZWxzZSBOJiYobWMoaSxWLE4sRiksd1thXT12b2lkIDApfX12YXIgYmM9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uICRsKGkpe3ZhciBhO2lmKGJjLnRlc3QoaSkpe2E9e307Zm9yKHZhciBmO2Y9aS5tYXRjaChiYyk7KWk9aS5zbGljZSgwLGkubGVuZ3RoLWZbMF0ubGVuZ3RoKSxhW2ZbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW2QuaHlwaGVuYXRlKGkuc2xpY2UoMikpLGFdfWZ1bmN0aW9uIFpzKGksYSl7dmFyIGY9Uz0+e0t0KGYudmFsdWUsYSw1LFtTXSl9O2YudmFsdWU9aTt2YXIgcD1uZXcgU2V0O3JldHVybiBkLmlzQXJyYXkoZi52YWx1ZSk/Zi52YWx1ZS5mb3JFYWNoKFM9PntTLm1vZGlmaWVycyYmUy5tb2RpZmllcnMuZm9yRWFjaCh3PT57cC5hZGQodyl9KX0pOihmLnZhbHVlLm1vZGlmaWVycyYmZi52YWx1ZS5tb2RpZmllcnMuZm9yRWFjaChTPT57cC5hZGQoUyl9KSx5YyhmLGEpKSxmLm1vZGlmaWVycz1bLi4ucF0sZn1mdW5jdGlvbiB5YyhpLGEpe2lmKCEhYSl7dmFyeyR3eHNNb2R1bGVzOmZ9PWE7aWYoISFmKXt2YXIgcD1pLnZhbHVlLnRvU3RyaW5nKCk7IWYuZmluZChTPT5wLmluZGV4T2YoIi4iK1MrIi4iKT4tMSl8fChpLnd4c0V2ZW50PWkudmFsdWUoKSl9fX12YXIgWmM9ZnVuY3Rpb24oaSxhLGYscCl7dmFyIFM9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDA7c3dpdGNoKGEpe2Nhc2UiY2xhc3MiOlVsKGkscCk7YnJlYWs7Y2FzZSJzdHlsZSI6S2MoaSxmLHApO2JyZWFrO2RlZmF1bHQ6aWYoZC5pc09uKGEpKWQuaXNNb2RlbExpc3RlbmVyKGEpfHxfYyhpLGEsZixwLFMpO2Vsc2V7aWYoZC5pc09iamVjdChwKSl7dmFyIHc9Zj09PXA7aWYocD1SLkpTT05fUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkocCksdyYmaS5nZXRBdHRyaWJ1dGUoYSk9PT1wKXJldHVybn1lbHNlIGlmKGY9PT1wKXJldHVybjt2YyhpLGEscCl9YnJlYWt9fTtmdW5jdGlvbiBYYygpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiJHN0eWxlIjt7dmFyIGE9bWkoKTtpZighYSlyZXR1cm4gZ2UoInVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKSIpLGQuRU1QVFlfT0JKO3ZhciBmPWEudHlwZS5fX2Nzc01vZHVsZXM7aWYoIWYpcmV0dXJuIGdlKCJDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuIiksZC5FTVBUWV9PQko7dmFyIHA9ZltpXTtyZXR1cm4gcHx8KGdlKCdDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZSBuYW1lZCAiJy5jb25jYXQoaSwnIi4nKSksZC5FTVBUWV9PQkopfX1mdW5jdGlvbiBRYyhpKXt2YXIgYT1taSgpO2lmKCFhKXtnZSgidXNlQ3NzVmFycyBpcyBjYWxsZWQgd2l0aG91dCBjdXJyZW50IGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UuIik7cmV0dXJufXZhciBmPSgpPT5IbChhLnN1YlRyZWUsaShhLnByb3h5KSk7Zm8oKCk9PlhyKGYse2ZsdXNoOiJwb3N0In0pKSxRbihmKX1mdW5jdGlvbiBIbChpLGEpe2lmKGkuc2hhcGVGbGFnJjEyOCl7dmFyIGY9aS5zdXNwZW5zZTtpPWYuYWN0aXZlQnJhbmNoLGYucGVuZGluZ0JyYW5jaCYmIWYuaXNIeWRyYXRpbmcmJmYuZWZmZWN0cy5wdXNoKCgpPT57SGwoZi5hY3RpdmVCcmFuY2gsYSl9KX1mb3IoO2kuY29tcG9uZW50OylpPWkuY29tcG9uZW50LnN1YlRyZWU7aWYoaS5zaGFwZUZsYWcmMSYmaS5lbClfbChpLmVsLGEpO2Vsc2UgaWYoaS50eXBlPT09dXQpaS5jaGlsZHJlbi5mb3JFYWNoKHc9PkhsKHcsYSkpO2Vsc2UgaWYoaS50eXBlPT09V24pZm9yKHZhcntlbDpwLGFuY2hvcjpTfT1pO3AmJihfbChwLGEpLHAhPT1TKTspcD1wLm5leHRTaWJsaW5nfWZ1bmN0aW9uIF9sKGksYSl7aWYoaS5ub2RlVHlwZT09PTEpZm9yKHZhciBmIGluIGEpaS5zZXRBdHRyaWJ1dGUoIi0tIi5jb25jYXQoZiksYVtmXSl9dmFyICRhPSJ0cmFuc2l0aW9uIixYcz0iYW5pbWF0aW9uIixqbD0oaSxhKT0+e3ZhcntzbG90czpmfT1hO3JldHVybiBGbChDbyx3YyhpKSxmKX07amwuZGlzcGxheU5hbWU9IlRyYW5zaXRpb24iO3ZhciBFYz17bmFtZTpTdHJpbmcsdHlwZTpTdHJpbmcsY3NzOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sZHVyYXRpb246W1N0cmluZyxOdW1iZXIsT2JqZWN0XSxlbnRlckZyb21DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxhcHBlYXJGcm9tQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxsZWF2ZUZyb21DbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZ30scG49amwucHJvcHM9ZC5leHRlbmQoe30sQ28ucHJvcHMsRWMpLHhpPWZ1bmN0aW9uKGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpbXTtkLmlzQXJyYXkoaSk/aS5mb3JFYWNoKGY9PmYoLi4uYSkpOmkmJmkoLi4uYSl9LElvPWk9Pmk/ZC5pc0FycmF5KGkpP2kuc29tZShhPT5hLmxlbmd0aD4xKTppLmxlbmd0aD4xOiExO2Z1bmN0aW9uIHdjKGkpe3ZhciBhPXt9O2Zvcih2YXIgZiBpbiBpKWYgaW4gRWN8fChhW2ZdPWlbZl0pO2lmKGkuY3NzPT09ITEpcmV0dXJuIGE7dmFye25hbWU6cD0idiIsdHlwZTpTLGR1cmF0aW9uOncsZW50ZXJGcm9tQ2xhc3M6Tj0iIi5jb25jYXQocCwiLWVudGVyLWZyb20iKSxlbnRlckFjdGl2ZUNsYXNzOlY9IiIuY29uY2F0KHAsIi1lbnRlci1hY3RpdmUiKSxlbnRlclRvQ2xhc3M6Rj0iIi5jb25jYXQocCwiLWVudGVyLXRvIiksYXBwZWFyRnJvbUNsYXNzOnE9TixhcHBlYXJBY3RpdmVDbGFzczpiZT1WLGFwcGVhclRvQ2xhc3M6YWU9RixsZWF2ZUZyb21DbGFzczpuZT0iIi5jb25jYXQocCwiLWxlYXZlLWZyb20iKSxsZWF2ZUFjdGl2ZUNsYXNzOkFlPSIiLmNvbmNhdChwLCItbGVhdmUtYWN0aXZlIiksbGVhdmVUb0NsYXNzOkRlPSIiLmNvbmNhdChwLCItbGVhdmUtdG8iKX09aSxYZT1ibCh3KSxmdD1YZSYmWGVbMF0sVGU9WGUmJlhlWzFdLHtvbkJlZm9yZUVudGVyOnNlLG9uRW50ZXI6RWUsb25FbnRlckNhbmNlbGxlZDpMZSxvbkxlYXZlOkZlLG9uTGVhdmVDYW5jZWxsZWQ6aXQsb25CZWZvcmVBcHBlYXI6VHQ9c2Usb25BcHBlYXI6UWU9RWUsb25BcHBlYXJDYW5jZWxsZWQ6Qj1MZX09YSxqPShvZSx2ZSxldCk9PntsYShvZSx2ZT9hZTpGKSxsYShvZSx2ZT9iZTpWKSxldCYmZXQoKX0saWU9KG9lLHZlKT0+e2xhKG9lLERlKSxsYShvZSxBZSksdmUmJnZlKCl9LHllPW9lPT4odmUsZXQpPT57dmFyIEdlPW9lP1FlOkVlLHR0PSgpPT5qKHZlLG9lLGV0KTt4aShHZSxbdmUsdHRdKSxIYSgoKT0+e2xhKHZlLG9lP3E6TiksUG8odmUsb2U/YWU6RiksSW8oR2UpfHxwcih2ZSxTLGZ0LHR0KX0pfTtyZXR1cm4gZC5leHRlbmQoYSx7b25CZWZvcmVFbnRlcihvZSl7eGkoc2UsW29lXSksUG8ob2UsTiksUG8ob2UsVil9LG9uQmVmb3JlQXBwZWFyKG9lKXt4aShUdCxbb2VdKSxQbyhvZSxxKSxQbyhvZSxiZSl9LG9uRW50ZXI6eWUoITEpLG9uQXBwZWFyOnllKCEwKSxvbkxlYXZlKG9lLHZlKXt2YXIgZXQ9KCk9PmllKG9lLHZlKTtQbyhvZSxuZSksU2MoKSxQbyhvZSxBZSksSGEoKCk9PntsYShvZSxuZSksUG8ob2UsRGUpLElvKEZlKXx8cHIob2UsUyxUZSxldCl9KSx4aShGZSxbb2UsZXRdKX0sb25FbnRlckNhbmNlbGxlZChvZSl7aihvZSwhMSkseGkoTGUsW29lXSl9LG9uQXBwZWFyQ2FuY2VsbGVkKG9lKXtqKG9lLCEwKSx4aShCLFtvZV0pfSxvbkxlYXZlQ2FuY2VsbGVkKG9lKXtpZShvZSkseGkoaXQsW29lXSl9fSl9ZnVuY3Rpb24gYmwoaSl7aWYoaT09bnVsbClyZXR1cm4gbnVsbDtpZihkLmlzT2JqZWN0KGkpKXJldHVybltRcyhpLmVudGVyKSxRcyhpLmxlYXZlKV07dmFyIGE9UXMoaSk7cmV0dXJuW2EsYV19ZnVuY3Rpb24gUXMoaSl7dmFyIGE9ZC50b051bWJlcihpKTtyZXR1cm4geWwoYSksYX1mdW5jdGlvbiB5bChpKXt0eXBlb2YgaSE9Im51bWJlciI/Z2UoIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBkdXJhdGlvbiBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSAiKyJnb3QgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSksIi4iKSk6aXNOYU4oaSkmJmdlKCI8dHJhbnNpdGlvbj4gZXhwbGljaXQgZHVyYXRpb24gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LiIpfWZ1bmN0aW9uIFBvKGksYSl7YS5zcGxpdCgvXHMrLykuZm9yRWFjaChmPT5mJiZpLmNsYXNzTGlzdC5hZGQoZikpLChpLl92dGN8fChpLl92dGM9bmV3IFNldCkpLmFkZChhKX1mdW5jdGlvbiBsYShpLGEpe2Euc3BsaXQoL1xzKy8pLmZvckVhY2gocD0+cCYmaS5jbGFzc0xpc3QucmVtb3ZlKHApKTt2YXJ7X3Z0YzpmfT1pO2YmJihmLmRlbGV0ZShhKSxmLnNpemV8fChpLl92dGM9dm9pZCAwKSl9ZnVuY3Rpb24gSGEoaSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpfSl9dmFyIGVsPTA7ZnVuY3Rpb24gcHIoaSxhLGYscCl7dmFyIFM9aS5fZW5kSWQ9KytlbCx3PSgpPT57Uz09PWkuX2VuZElkJiZwKCl9O2lmKGYpcmV0dXJuIHNldFRpbWVvdXQodyxmKTt2YXJ7dHlwZTpOLHRpbWVvdXQ6Vixwcm9wQ291bnQ6Rn09eHMoaSxhKTtpZighTilyZXR1cm4gcCgpO3ZhciBxPU4rImVuZCIsYmU9MCxhZT0oKT0+e2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihxLG5lKSx3KCl9LG5lPUFlPT57QWUudGFyZ2V0PT09aSYmKytiZT49RiYmYWUoKX07c2V0VGltZW91dCgoKT0+e2JlPEYmJmFlKCl9LFYrMSksaS5hZGRFdmVudExpc3RlbmVyKHEsbmUpfWZ1bmN0aW9uIHhzKGksYSl7dmFyIGY9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkscD1EZT0+KGZbRGVdfHwiIikuc3BsaXQoIiwgIiksUz1wKCRhKyJEZWxheSIpLHc9cCgkYSsiRHVyYXRpb24iKSxOPWphKFMsdyksVj1wKFhzKyJEZWxheSIpLEY9cChYcysiRHVyYXRpb24iKSxxPWphKFYsRiksYmU9bnVsbCxhZT0wLG5lPTA7YT09PSRhP04+MCYmKGJlPSRhLGFlPU4sbmU9dy5sZW5ndGgpOmE9PT1Ycz9xPjAmJihiZT1YcyxhZT1xLG5lPUYubGVuZ3RoKTooYWU9TWF0aC5tYXgoTixxKSxiZT1hZT4wP04+cT8kYTpYczpudWxsLG5lPWJlP2JlPT09JGE/dy5sZW5ndGg6Ri5sZW5ndGg6MCk7dmFyIEFlPWJlPT09JGEmJi9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KGZbJGErIlByb3BlcnR5Il0pO3JldHVybnt0eXBlOmJlLHRpbWVvdXQ6YWUscHJvcENvdW50Om5lLGhhc1RyYW5zZm9ybTpBZX19ZnVuY3Rpb24gamEoaSxhKXtmb3IoO2kubGVuZ3RoPGEubGVuZ3RoOylpPWkuY29uY2F0KGkpO3JldHVybiBNYXRoLm1heCguLi5hLm1hcCgoZixwKT0+cnMoZikrcnMoaVtwXSkpKX1mdW5jdGlvbiBycyhpKXtyZXR1cm4gTnVtYmVyKGkuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSkqMWUzfWZ1bmN0aW9uIFNjKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXZhciBDYT1uZXcgV2Vha01hcCxFbD1uZXcgV2Vha01hcCxjYT17bmFtZToiVHJhbnNpdGlvbkdyb3VwIixwcm9wczpkLmV4dGVuZCh7fSxwbix7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoaSxhKXt2YXJ7c2xvdHM6Zn09YSxwPW1pKCksUz1kcigpLHcsTjtyZXR1cm4gUW4oKCk9PntpZighIXcubGVuZ3RoKXt2YXIgVj1pLm1vdmVDbGFzc3x8IiIuY29uY2F0KGkubmFtZXx8InYiLCItbW92ZSIpO2lmKCEhXyh3WzBdLmVsLHAudm5vZGUuZWwsVikpe3cuZm9yRWFjaChvKSx3LmZvckVhY2goYyk7dmFyIEY9dy5maWx0ZXIoaCk7U2MoKSxGLmZvckVhY2gocT0+e3ZhciBiZT1xLmVsLGFlPWJlLnN0eWxlO1BvKGJlLFYpLGFlLnRyYW5zZm9ybT1hZS53ZWJraXRUcmFuc2Zvcm09YWUudHJhbnNpdGlvbkR1cmF0aW9uPSIiO3ZhciBuZT1iZS5fbW92ZUNiPUFlPT57QWUmJkFlLnRhcmdldCE9PWJlfHwoIUFlfHwvdHJhbnNmb3JtJC8udGVzdChBZS5wcm9wZXJ0eU5hbWUpKSYmKGJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLG5lKSxiZS5fbW92ZUNiPW51bGwsbGEoYmUsVikpfTtiZS5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixuZSl9KX19fSksKCk9Pnt2YXIgVj1tLnRvUmF3KGkpLEY9d2MoVikscT1WLnRhZ3x8dXQ7dz1OLE49Zi5kZWZhdWx0P21lKGYuZGVmYXVsdCgpKTpbXTtmb3IodmFyIGJlPTA7YmU8Ti5sZW5ndGg7YmUrKyl7dmFyIGFlPU5bYmVdO2FlLmtleSE9bnVsbD9aKGFlLHBpKGFlLEYsUyxwKSk6Z2UoIjxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuIil9aWYodylmb3IodmFyIG5lPTA7bmU8dy5sZW5ndGg7bmUrKyl7dmFyIEFlPXdbbmVdO1ooQWUscGkoQWUsRixTLHApKSxDYS5zZXQoQWUsQWUuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfXJldHVybiAkbihxLG51bGwsTil9fX0semE9aT0+ZGVsZXRlIGkubW9kZTtjYS5wcm9wczt2YXIgb2k9Y2E7ZnVuY3Rpb24gbyhpKXt2YXIgYT1pLmVsO2EuX21vdmVDYiYmYS5fbW92ZUNiKCksYS5fZW50ZXJDYiYmYS5fZW50ZXJDYigpfWZ1bmN0aW9uIGMoaSl7RWwuc2V0KGksaS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9ZnVuY3Rpb24gaChpKXt2YXIgYT1DYS5nZXQoaSksZj1FbC5nZXQoaSkscD1hLmxlZnQtZi5sZWZ0LFM9YS50b3AtZi50b3A7aWYocHx8Uyl7dmFyIHc9aS5lbC5zdHlsZTtyZXR1cm4gdy50cmFuc2Zvcm09dy53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiLmNvbmNhdChwLCJweCwiKS5jb25jYXQoUywicHgpIiksdy50cmFuc2l0aW9uRHVyYXRpb249IjBzIixpfX1mdW5jdGlvbiBfKGksYSxmKXt2YXIgcD1pLmNsb25lTm9kZSgpO2kuX3Z0YyYmaS5fdnRjLmZvckVhY2goTj0+e04uc3BsaXQoL1xzKy8pLmZvckVhY2goVj0+ViYmcC5jbGFzc0xpc3QucmVtb3ZlKFYpKX0pLGYuc3BsaXQoL1xzKy8pLmZvckVhY2goTj0+TiYmcC5jbGFzc0xpc3QuYWRkKE4pKSxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBTPWEubm9kZVR5cGU9PT0xP2E6YS5wYXJlbnROb2RlO1MuYXBwZW5kQ2hpbGQocCk7dmFye2hhc1RyYW5zZm9ybTp3fT14cyhwKTtyZXR1cm4gUy5yZW1vdmVDaGlsZChwKSx3fXZhciBJPWk9Pnt2YXIgYT1pLnByb3BzWyJvblVwZGF0ZTptb2RlbFZhbHVlIl07cmV0dXJuIGQuaXNBcnJheShhKT9mPT5kLmludm9rZUFycmF5Rm5zKGEsZik6YX0sQT17Y3JlYXRlZChpLGEsZil7dmFye3ZhbHVlOnAsbW9kaWZpZXJzOnt0cmltOlMsbnVtYmVyOnd9fT1hO2kudmFsdWU9cD09bnVsbD8iIjpwLGkuX2Fzc2lnbj1JKGYpLEtzKGksImlucHV0IixOPT57dmFyIFY9Ti5kZXRhaWwudmFsdWUsRj1pLnBhZ2VOb2RlO2kucGFnZU5vZGU9bnVsbCxpLnZhbHVlPVYsaS5wYWdlTm9kZT1GLFM/Vj1WLnRyaW0oKTp3JiYoVj1kLnRvTnVtYmVyKFYpKSxpLl9hc3NpZ24oVil9KX0sYmVmb3JlVXBkYXRlKGksYSxmKXt2YXJ7dmFsdWU6cH09YTtpLl9hc3NpZ249SShmKTt2YXIgUz1wPT1udWxsPyIiOnA7aS52YWx1ZSE9PVMmJihpLnZhbHVlPVMpfX0seD1BLHo9WyJjdHJsIiwic2hpZnQiLCJhbHQiLCJtZXRhIl0sJD17c3RvcDppPT5pLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6aT0+aS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6aT0+aS50YXJnZXQhPT1pLmN1cnJlbnRUYXJnZXQsY3RybDppPT4haS5jdHJsS2V5LHNoaWZ0Omk9PiFpLnNoaWZ0S2V5LGFsdDppPT4haS5hbHRLZXksbWV0YTppPT4haS5tZXRhS2V5LGxlZnQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTAsbWlkZGxlOmk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0xLHJpZ2h0Omk9PiJidXR0b24iaW4gaSYmaS5idXR0b24hPT0yLGV4YWN0OihpLGEpPT56LnNvbWUoZj0+aVsiIi5jb25jYXQoZiwiS2V5IildJiYhYS5pbmNsdWRlcyhmKSl9LGVlPShpLGEpPT57dmFyIGY9ZnVuY3Rpb24ocCl7Zm9yKHZhciBTPTA7UzxhLmxlbmd0aDtTKyspe3ZhciB3PSRbYVtTXV07aWYodyYmdyhwLGEpKXJldHVybn1mb3IodmFyIE49YXJndW1lbnRzLmxlbmd0aCxWPW5ldyBBcnJheShOPjE/Ti0xOjApLEY9MTtGPE47RisrKVZbRi0xXT1hcmd1bWVudHNbRl07cmV0dXJuIGkocCwuLi5WKX07cmV0dXJuIGYubW9kaWZpZXJzPWEsZn0sSWU9e2VzYzoiZXNjYXBlIixzcGFjZToiICIsdXA6ImFycm93LXVwIixsZWZ0OiJhcnJvdy1sZWZ0IixyaWdodDoiYXJyb3ctcmlnaHQiLGRvd246ImFycm93LWRvd24iLGRlbGV0ZToiYmFja3NwYWNlIn0sZGU9KGksYSk9PmY9PntpZigia2V5ImluIGYpe3ZhciBwPWQuaHlwaGVuYXRlKGYua2V5KTtpZihhLnNvbWUoUz0+Uz09PXB8fEllW1NdPT09cCkpcmV0dXJuIGkoZil9fSx1ZT17YmVmb3JlTW91bnQoaSxhKXt2YXJ7dmFsdWU6Zn09YTtIZShpLGYpfSx1cGRhdGVkKGksYSl7dmFye3ZhbHVlOmYsb2xkVmFsdWU6cH09YTshZiE9IXAmJkhlKGksZil9LGJlZm9yZVVubW91bnQoaSxhKXt2YXJ7dmFsdWU6Zn09YTtIZShpLGYpfX07ZnVuY3Rpb24gSGUoaSxhKXtpLnNldEF0dHJpYnV0ZSgiLnZTaG93IiwhIWEpfXZhciBaZT1kLmV4dGVuZCh7cGF0Y2hQcm9wOlpjLGZvcmNlUGF0Y2hQcm9wOlIuZm9yY2VQYXRjaFByb3B9LGdjKSx2dDtmdW5jdGlvbiB5dCgpe3JldHVybiB2dHx8KHZ0PXpzKFplKSl9dmFyIE5lPWZ1bmN0aW9uKCl7eXQoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0sX2U9ZnVuY3Rpb24oKXt2YXIgaT15dCgpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpO250KGkpO3Zhcnttb3VudDphfT1pO3JldHVybiBpLm1vdW50PWY9PihkLmlzU3RyaW5nKGYpJiYoZj09PSIjYXBwIiYmSm8oaSxtbCksZj1KcyhmKSksZiYmYShmLCExLCExKSksaX0sTWU9X2U7ZnVuY3Rpb24gbnQoaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkuY29uZmlnLCJpc05hdGl2ZVRhZyIse3ZhbHVlOmE9PmQuaXNIVE1MVGFnKGEpfHxkLmlzU1ZHVGFnKGEpLHdyaXRhYmxlOiExfSl9ZnVuY3Rpb24gcWUoKXt9ZnVuY3Rpb24gYXQoKXt9ZnVuY3Rpb24gSXQoaSl7cmV0dXJuIGQuaXNPYmplY3QoaSk/Ui5KU09OX1BST1RPQ09MK0pTT04uc3RyaW5naWZ5KGkpOml9dmFyIHN0PWk9Pkl0KGkpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiY2FtZWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBkLmNhbWVsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJjYXBpdGFsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYXBpdGFsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGQubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBkLm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBkLnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG0uc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG0udG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtLnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbS51bnJlZn19KSxDLkJhc2VUcmFuc2l0aW9uPUNvLEMuQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM9bG8sQy5Db21tZW50PVl0LEMuRnJhZ21lbnQ9dXQsQy5LZWVwQWxpdmU9eGUsQy5TdGF0aWM9V24sQy5TdXNwZW5zZT1TbyxDLlRlbGVwb3J0PVVlLEMuVGV4dD14dCxDLlRyYW5zaXRpb249amwsQy5UcmFuc2l0aW9uR3JvdXA9b2ksQy5hc3NlcnROdW1iZXI9cmUsQy5jYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZz1LdCxDLmNhbGxXaXRoRXJyb3JIYW5kbGluZz1mbixDLmNsb25lVk5vZGU9SmksQy5jb21wYXRVdGlscz1zYSxDLmNvbXB1dGVkPUdzLEMuY3JlYXRlQXBwPV9lLEMuY3JlYXRlQmxvY2s9b2EsQy5jcmVhdGVDb21tZW50PUpzLEMuY3JlYXRlQ29tbWVudFZOb2RlPUtpLEMuY3JlYXRlRWxlbWVudD1xcyxDLmNyZWF0ZUVsZW1lbnRCbG9jaz14bCxDLmNyZWF0ZUVsZW1lbnRWTm9kZT1HbixDLmNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyPW5pLEMuY3JlYXRlUHJvcHNSZXN0UHJveHk9WWMsQy5jcmVhdGVSZW5kZXJlcj16cyxDLmNyZWF0ZVNTUkFwcD1NZSxDLmNyZWF0ZVNsb3RzPWFsLEMuY3JlYXRlU3RhdGljVk5vZGU9amMsQy5jcmVhdGVUZXh0Tm9kZT1XbyxDLmNyZWF0ZVRleHRWTm9kZT1JcyxDLmNyZWF0ZVZOb2RlPSRuLEMuY3JlYXRlVnVlQXBwPV9lLEMuZGVmaW5lQXN5bmNDb21wb25lbnQ9T3QsQy5kZWZpbmVDb21wb25lbnQ9bGUsQy5kZWZpbmVFbWl0cz16YyxDLmRlZmluZUV4cG9zZT1mYyxDLmRlZmluZVByb3BzPXVjLEMuZ2V0Q3VycmVudEluc3RhbmNlPW1pLEMuZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuPW1lLEMuZ3VhcmRSZWFjdGl2ZVByb3BzPXFpLEMuaD1GbCxDLmhhbmRsZUVycm9yPWNuLEMuaW5pdEN1c3RvbUZvcm1hdHRlcj1UbyxDLmluamVjdD1WbixDLmluamVjdEhvb2s9Z3IsQy5pc01lbW9TYW1lPXpvLEMuaXNSdW50aW1lT25seT1wbCxDLmlzVk5vZGU9dnIsQy5tZXJnZURlZmF1bHRzPXBjLEMubWVyZ2VQcm9wcz1GcixDLm5leHRUaWNrPWtuLEMub25BY3RpdmF0ZWQ9enQsQy5vbkJlZm9yZUFjdGl2YXRlPXFlLEMub25CZWZvcmVEZWFjdGl2YXRlPWF0LEMub25CZWZvcmVNb3VudD11byxDLm9uQmVmb3JlVW5tb3VudD1EcixDLm9uQmVmb3JlVXBkYXRlPXJhLEMub25EZWFjdGl2YXRlZD1BbixDLm9uRXJyb3JDYXB0dXJlZD1VcyxDLm9uTW91bnRlZD1mbyxDLm9uUmVuZGVyVHJhY2tlZD1WcyxDLm9uUmVuZGVyVHJpZ2dlcmVkPUxyLEMub25TZXJ2ZXJQcmVmZXRjaD1OYSxDLm9uVW5tb3VudGVkPXFhLEMub25VcGRhdGVkPVFuLEMub3BlbkJsb2NrPXdhLEMucG9wU2NvcGVJZD1LbixDLnByb3ZpZGU9b3IsQy5wdXNoU2NvcGVJZD1ZYSxDLnF1ZXVlUG9zdEZsdXNoQ2I9RmksQy5yZWdpc3RlclJ1bnRpbWVDb21waWxlcj1zYyxDLnJlbmRlcj1OZSxDLnJlbmRlckxpc3Q9UmEsQy5yZW5kZXJTbG90PV9hLEMucmVzb2x2ZUNvbXBvbmVudD16bixDLnJlc29sdmVEaXJlY3RpdmU9aG8sQy5yZXNvbHZlRHluYW1pY0NvbXBvbmVudD1ncyxDLnJlc29sdmVGaWx0ZXI9WXMsQy5yZXNvbHZlVHJhbnNpdGlvbkhvb2tzPXBpLEMuc2V0QmxvY2tUcmFja2luZz1XcyxDLnNldERldnRvb2xzSG9vaz1KbixDLnNldFRyYW5zaXRpb25Ib29rcz1aLEMuc3NyQ29udGV4dEtleT12bCxDLnNzclV0aWxzPUpjLEMudG9IYW5kbGVycz1tcyxDLnRyYW5zZm9ybVZOb2RlQXJncz1DcyxDLnVzZUF0dHJzPWRjLEMudXNlQ3NzTW9kdWxlPVhjLEMudXNlQ3NzVmFycz1RYyxDLnVzZVNTUkNvbnRleHQ9UnMsQy51c2VTbG90cz1HYyxDLnVzZVRyYW5zaXRpb25TdGF0ZT1kcixDLnZNb2RlbER5bmFtaWM9eCxDLnZNb2RlbFRleHQ9QSxDLnZTaG93PXVlLEMudmVyc2lvbj1tbCxDLndhcm49Z2UsQy53YXRjaD1DaSxDLndhdGNoRWZmZWN0PVhyLEMud2F0Y2hQb3N0RWZmZWN0PWhpLEMud2F0Y2hTeW5jRWZmZWN0PW5hLEMud2l0aEFzeW5jQ29udGV4dD1xYyxDLndpdGhDdHg9dXIsQy53aXRoRGVmYXVsdHM9V2MsQy53aXRoRGlyZWN0aXZlcz1PbyxDLndpdGhLZXlzPWRlLEMud2l0aE1lbW89VmwsQy53aXRoTW9kaWZpZXJzPWVlLEMud2l0aFNjb3BlSWQ9S3IsQy53cD1zdCxPYmplY3QuZGVmaW5lUHJvcGVydHkoQywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQ30oe30sYixULGwpO3JldHVybiBrLl9fVFlQRV9fPSJ2dWUiLGt9ZnVuY3Rpb24gT3YodixsLGIpe2xldCBUPWIuVnVlLGs9Yi5zZXRUaW1lb3V0LEM9Yi5jbGVhclRpbWVvdXQsZD1iLnNldEludGVydmFsLG09Yi5jbGVhckludGVydmFsLFI9Yi5fX3VuaUNvbmZpZyxXZT1iLl9fdW5pUm91dGVzLFB0PWIuVnVlU2hhcmVkLGVuPWIuVW5pU2hhcmVkO3ZhciBnZT1mdW5jdGlvbihKLHJlLERuKXsidXNlIHN0cmljdCI7dmFyIGZuPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixLdD1mdW5jdGlvbigpe2xldCBlPW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKHZhciB0PTA7dDxmbi5sZW5ndGg7dCsrKWVbZm4uY2hhckNvZGVBdCh0KV09dDtyZXR1cm4gZX0oKTtmdW5jdGlvbiBjbihlKXt2YXIgdD1uZXcgVWludDhBcnJheShlKSxuLHI9dC5sZW5ndGgscz0iIjtmb3Iobj0wO248cjtuKz0zKXMrPWZuW3Rbbl0+PjJdLHMrPWZuWyh0W25dJjMpPDw0fHRbbisxXT4+NF0scys9Zm5bKHRbbisxXSYxNSk8PDJ8dFtuKzJdPj42XSxzKz1mblt0W24rMl0mNjNdO3JldHVybiByJTM9PT0yP3M9cy5zdWJzdHJpbmcoMCxzLmxlbmd0aC0xKSsiPSI6ciUzPT09MSYmKHM9cy5zdWJzdHJpbmcoMCxzLmxlbmd0aC0yKSsiPT0iKSxzfWZ1bmN0aW9uIElyKGUpe3ZhciB0PWUubGVuZ3RoKi43NSxuPWUubGVuZ3RoLHIscz0wLHUsZyxFLFU7ZVtlLmxlbmd0aC0xXT09PSI9IiYmKHQtLSxlW2UubGVuZ3RoLTJdPT09Ij0iJiZ0LS0pO3ZhciBQPW5ldyBBcnJheUJ1ZmZlcih0KSxMPW5ldyBVaW50OEFycmF5KFApO2ZvcihyPTA7cjxuO3IrPTQpdT1LdFtlLmNoYXJDb2RlQXQocildLGc9S3RbZS5jaGFyQ29kZUF0KHIrMSldLEU9S3RbZS5jaGFyQ29kZUF0KHIrMildLFU9S3RbZS5jaGFyQ29kZUF0KHIrMyldLExbcysrXT11PDwyfGc+PjQsTFtzKytdPShnJjE1KTw8NHxFPj4yLExbcysrXT0oRSYzKTw8NnxVJjYzO3JldHVybiBQfWxldCB3aT1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLHFuPVsiYWxidW0iLCJjYW1lcmEiXSxobj1bIkdFVCIsIk9QVElPTlMiLCJIRUFEIiwiUE9TVCIsIlBVVCIsIkRFTEVURSIsIlRSQUNFIiwiQ09OTkVDVCIsIlBBVENIIl07ZnVuY3Rpb24gVnQoZSx0KXtyZXR1cm4hZXx8dC5pbmRleE9mKGUpPT09LTE/dFswXTplfWZ1bmN0aW9uIE5uKGUsdCl7cmV0dXJuIUouaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wfHxlLmZpbmQobj0+dC5pbmRleE9mKG4pPT09LTEpP3Q6ZX1mdW5jdGlvbiB5bihlLHQpe2NvbnNvbGUud2FybihgJHtlfTogJHt0fWApfWZ1bmN0aW9uIHhuKGUsdCxuLHIpe3J8fChyPXluKTtmb3IobGV0IHMgaW4gbil7bGV0IHU9SmUocyx0W3NdLG5bc10sIUouaGFzT3duKHQscykpO0ouaXNTdHJpbmcodSkmJnIoZSx1KX19ZnVuY3Rpb24gUHIoZSx0LG4scil7aWYoIW4pcmV0dXJuO2lmKCFKLmlzQXJyYXkobikpcmV0dXJuIHhuKGUsdFswXXx8T2JqZWN0LmNyZWF0ZShudWxsKSxuLHIpO2xldCBzPW4ubGVuZ3RoLHU9dC5sZW5ndGg7Zm9yKGxldCBnPTA7ZzxzO2crKyl7bGV0IEU9bltnXSxVPU9iamVjdC5jcmVhdGUobnVsbCk7dT5nJiYoVVtFLm5hbWVdPXRbZ10pLHhuKGUsVSx7W0UubmFtZV06RX0scil9fWZ1bmN0aW9uIEplKGUsdCxuLHIpe0ouaXNQbGFpbk9iamVjdChuKXx8KG49e3R5cGU6bn0pO2xldHt0eXBlOnMscmVxdWlyZWQ6dSx2YWxpZGF0b3I6Z309bjtpZih1JiZyKXJldHVybidNaXNzaW5nIHJlcXVpcmVkIGFyZ3M6ICInK2UrJyInO2lmKCEodD09bnVsbCYmIXUpKXtpZihzIT1udWxsKXtsZXQgRT0hMSxVPUouaXNBcnJheShzKT9zOltzXSxQPVtdO2ZvcihsZXQgTD0wO0w8VS5sZW5ndGgmJiFFO0wrKyl7bGV0e3ZhbGlkOk9lLGV4cGVjdGVkVHlwZTpQZX09U3QodCxVW0xdKTtQLnB1c2goUGV8fCIiKSxFPU9lfWlmKCFFKXJldHVybiB0bihlLHQsUCl9aWYoZylyZXR1cm4gZyh0KX19bGV0IGR0PUoubWFrZU1hcCgiU3RyaW5nLE51bWJlcixCb29sZWFuLEZ1bmN0aW9uLFN5bWJvbCIpO2Z1bmN0aW9uIFN0KGUsdCl7bGV0IG4scj1rbih0KTtpZihkdChyKSl7bGV0IHM9dHlwZW9mIGU7bj1zPT09ci50b0xvd2VyQ2FzZSgpLCFuJiZzPT09Im9iamVjdCImJihuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIHI9PT0iT2JqZWN0Ij9uPUouaXNPYmplY3QoZSk6cj09PSJBcnJheSI/bj1KLmlzQXJyYXkoZSk6bj1lIGluc3RhbmNlb2YgdHx8Si50b1Jhd1R5cGUoZSk9PT1rbih0KTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gdG4oZSx0LG4pe2xldCByPWBJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICIke2V9Ii4gRXhwZWN0ZWQgJHtuLm1hcChKLmNhcGl0YWxpemUpLmpvaW4oIiwgIil9YCxzPW5bMF0sdT1KLnRvUmF3VHlwZSh0KSxnPVp0KHQscyksRT1adCh0LHUpO3JldHVybiBuLmxlbmd0aD09PTEmJkxuKHMpJiYhTnIocyx1KSYmKHIrPWAgd2l0aCB2YWx1ZSAke2d9YCkscis9YCwgZ290ICR7dX0gYCxMbih1KSYmKHIrPWB3aXRoIHZhbHVlICR7RX0uYCkscn1mdW5jdGlvbiBrbihlKXtsZXQgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gWnQoZSx0KXtyZXR1cm4gdD09PSJTdHJpbmciP2AiJHtlfSJgOnQ9PT0iTnVtYmVyIj9gJHtOdW1iZXIoZSl9YDpgJHtlfWB9ZnVuY3Rpb24gTG4oZSl7cmV0dXJuWyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl0uc29tZShuPT5lLnRvTG93ZXJDYXNlKCk9PT1uKX1mdW5jdGlvbiBOciguLi5lKXtyZXR1cm4gZS5zb21lKHQ9PnQudG9Mb3dlckNhc2UoKT09PSJib29sZWFuIil9ZnVuY3Rpb24gVXIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfX19bGV0IEZpPTEsbHI9e307ZnVuY3Rpb24gRXIoZSx0LG4scj0hMSl7cmV0dXJuIGxyW2VdPXtuYW1lOnQsa2VlcEFsaXZlOnIsY2FsbGJhY2s6bn0sZX1mdW5jdGlvbiBWaShlLHQsbil7aWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgcj1scltlXTtpZihyKXJldHVybiByLmtlZXBBbGl2ZXx8ZGVsZXRlIGxyW2VdLHIuY2FsbGJhY2sodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBHbyhlKXtmb3IobGV0IHQgaW4gbHIpaWYobHJbdF0ubmFtZT09PWUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWW8oZSx0KXtmb3IobGV0IG4gaW4gbHIpe2xldCByPWxyW25dO3IuY2FsbGJhY2s9PT10JiZyLm5hbWU9PT1lJiZkZWxldGUgbHJbbl19fWZ1bmN0aW9uIGtyKGUpe190Lm9mZigiYXBpLiIrZSl9ZnVuY3Rpb24gUnIoZSl7X3Qub24oImFwaS4iK2UsdD0+e2ZvcihsZXQgbiBpbiBscil7bGV0IHI9bHJbbl07ci5uYW1lPT09ZSYmci5jYWxsYmFjayh0KX19KX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBFcihGaSsrLGUsdCwhMCl9bGV0IFVpPSJzdWNjZXNzIixZcj0iZmFpbCIsVGE9ImNvbXBsZXRlIjtmdW5jdGlvbiAkaShlKXtsZXQgdD17fTtmb3IobGV0IG4gaW4gZSl7bGV0IHI9ZVtuXTtKLmlzRnVuY3Rpb24ocikmJih0W25dPVVyKHIpLGRlbGV0ZSBlW25dKX1yZXR1cm4gdH1mdW5jdGlvbiBtbyhlLHQpe3JldHVybiFlfHxlLmluZGV4T2YoIjpmYWlsIik9PT0tMT90KyI6b2siOnQrZS5zdWJzdHJpbmcoZS5pbmRleE9mKCI6ZmFpbCIpKX1mdW5jdGlvbiBJYShlLHQ9e30se2JlZm9yZUFsbDpuLGJlZm9yZVN1Y2Nlc3M6cn09e30pe0ouaXNQbGFpbk9iamVjdCh0KXx8KHQ9e30pO2xldHtzdWNjZXNzOnMsZmFpbDp1LGNvbXBsZXRlOmd9PSRpKHQpLEU9Si5pc0Z1bmN0aW9uKHMpLFU9Si5pc0Z1bmN0aW9uKHUpLFA9Si5pc0Z1bmN0aW9uKGcpLEw9RmkrKztyZXR1cm4gRXIoTCxlLE9lPT57T2U9T2V8fHt9LE9lLmVyck1zZz1tbyhPZS5lcnJNc2csZSksSi5pc0Z1bmN0aW9uKG4pJiZuKE9lKSxPZS5lcnJNc2c9PT1lKyI6b2siPyhKLmlzRnVuY3Rpb24ocikmJnIoT2UsdCksRSYmcyhPZSkpOlUmJnUoT2UpLFAmJmcoT2UpfSksTH1sZXQgbm89InN1Y2Nlc3MiLHFvPSJmYWlsIixzaT0iY29tcGxldGUiLFBuPXt9LGNyPXt9O2Z1bmN0aW9uIGxpKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlKG4sdCl8fG59fWZ1bmN0aW9uIEpuKGUsdCxuKXtsZXQgcj0hMTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7bGV0IHU9ZVtzXTtpZihyKXI9UHJvbWlzZS5yZXNvbHZlKGxpKHUsbikpO2Vsc2V7bGV0IGc9dSh0LG4pO2lmKEouaXNQcm9taXNlKGcpJiYocj1Qcm9taXNlLnJlc29sdmUoZykpLGc9PT0hMSlyZXR1cm57dGhlbigpe30sY2F0Y2goKXt9fX19cmV0dXJuIHJ8fHt0aGVuKHMpe3JldHVybiBzKHQpfSxjYXRjaCgpe319fWZ1bmN0aW9uIEpvKGUsdD17fSl7cmV0dXJuW25vLHFvLHNpXS5mb3JFYWNoKG49PntsZXQgcj1lW25dO2lmKCFKLmlzQXJyYXkocikpcmV0dXJuO2xldCBzPXRbbl07dFtuXT1mdW5jdGlvbihnKXtKbihyLGcsdCkudGhlbihFPT5KLmlzRnVuY3Rpb24ocykmJnMoRSl8fEUpfX0pLHR9ZnVuY3Rpb24geG8oZSx0KXtsZXQgbj1bXTtKLmlzQXJyYXkoUG4ucmV0dXJuVmFsdWUpJiZuLnB1c2goLi4uUG4ucmV0dXJuVmFsdWUpO2xldCByPWNyW2VdO3JldHVybiByJiZKLmlzQXJyYXkoci5yZXR1cm5WYWx1ZSkmJm4ucHVzaCguLi5yLnJldHVyblZhbHVlKSxuLmZvckVhY2gocz0+e3Q9cyh0KXx8dH0pLHR9ZnVuY3Rpb24gcm8oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3Qua2V5cyhQbikuZm9yRWFjaChyPT57ciE9PSJyZXR1cm5WYWx1ZSImJih0W3JdPVBuW3JdLnNsaWNlKCkpfSk7bGV0IG49Y3JbZV07cmV0dXJuIG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2gocj0+e3IhPT0icmV0dXJuVmFsdWUiJiYodFtyXT0odFtyXXx8W10pLmNvbmNhdChuW3JdKSl9KSx0fWZ1bmN0aW9uIGlvKGUsdCxuLHIpe2xldCBzPXJvKGUpO3JldHVybiBzJiZPYmplY3Qua2V5cyhzKS5sZW5ndGg/Si5pc0FycmF5KHMuaW52b2tlKT9KbihzLmludm9rZSxuKS50aGVuKGc9PnQoSm8ocm8oZSksZyksLi4ucikpOnQoSm8ocyxuKSwuLi5yKTp0KG4sLi4ucil9ZnVuY3Rpb24gcXIoZSl7cmV0dXJuISEoSi5pc1BsYWluT2JqZWN0KGUpJiZbVWksWXIsVGFdLmZpbmQodD0+Si5pc0Z1bmN0aW9uKGVbdF0pKSl9ZnVuY3Rpb24gb28oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gRm4oZSx0KXtyZXR1cm4obj17fSwuLi5yKT0+cXIobik/eG8oZSxpbyhlLHQsbixyKSk6eG8oZSxuZXcgUHJvbWlzZSgocyx1KT0+e2lvKGUsdCxKLmV4dGVuZChuLHtzdWNjZXNzOnMsZmFpbDp1fSkscil9KSl9ZnVuY3Rpb24gd3IoZSx0KXtsZXQgbj1lWzBdO2lmKCF0fHwhSi5pc1BsYWluT2JqZWN0KHQuZm9ybWF0QXJncykmJkouaXNQbGFpbk9iamVjdChuKSlyZXR1cm47bGV0IHI9dC5mb3JtYXRBcmdzLHM9T2JqZWN0LmtleXMocik7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kyspe2xldCBnPXNbdV0sRT1yW2ddO2lmKEouaXNGdW5jdGlvbihFKSl7bGV0IFU9RShlWzBdW2ddLG4pO2lmKEouaXNTdHJpbmcoVSkpcmV0dXJuIFV9ZWxzZSBKLmhhc093bihuLGcpfHwobltnXT1FKX19ZnVuY3Rpb24gY2koZSx0LG4pe3JldHVybiBWaShlLEouZXh0ZW5kKG58fHt9LHtlcnJNc2c6dCsiOm9rIn0pKX1mdW5jdGlvbiBLbyhlLHQsbixyKXtyZXR1cm4gVmkoZSxKLmV4dGVuZCh7ZXJyTXNnOnQrIjpmYWlsIisobj8iICIrbjoiIil9LHIpKX1mdW5jdGlvbiBfbyhlLHQsbixyKXtpZihyJiZyLmJlZm9yZUludm9rZSl7bGV0IHU9ci5iZWZvcmVJbnZva2UodCk7aWYoSi5pc1N0cmluZyh1KSlyZXR1cm4gdX1sZXQgcz13cih0LHIpO2lmKHMpcmV0dXJuIHN9ZnVuY3Rpb24gWm8oZSl7aWYoIUouaXNGdW5jdGlvbihlKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJnczogdHlwZSBjaGVjayBmYWlsZWQgZm9yIGFyZ3MgImNhbGxiYWNrIi4gRXhwZWN0ZWQgRnVuY3Rpb24nKX1mdW5jdGlvbiBKcihlLHQsbil7cmV0dXJuIHI9PntabyhyKTtsZXQgcz1fbyhlLFtyXSx2b2lkIDAsbik7aWYocyl0aHJvdyBuZXcgRXJyb3Iocyk7bGV0IHU9IUdvKGUpO3hyKGUsciksdSYmKFJyKGUpLHQoKSl9fWZ1bmN0aW9uIE9uKGUsdCxuKXtyZXR1cm4gcj0+e1pvKHIpO2xldCBzPV9vKGUsW3JdLHZvaWQgMCxuKTtpZihzKXRocm93IG5ldyBFcnJvcihzKTtlPWUucmVwbGFjZSgib2ZmIiwib24iKSxZbyhlLHIpLEdvKGUpfHwoa3IoZSksdCgpKX19ZnVuY3Rpb24gRW4oZSl7cmV0dXJuIWV8fEouaXNTdHJpbmcoZSk/ZTplLnN0YWNrPyhjb25zb2xlLmVycm9yKGUubWVzc2FnZStyZS5MSU5FRkVFRCtlLnN0YWNrKSxlLm1lc3NhZ2UpOmV9ZnVuY3Rpb24gdWkoZSx0LG4scil7cmV0dXJuIHM9PntsZXQgdT1JYShlLHMsciksZz1fbyhlLFtzXSxuLHIpO3JldHVybiBnP0tvKHUsZSxnKTp0KHMse3Jlc29sdmU6RT0+Y2kodSxlLEUpLHJlamVjdDooRSxVKT0+S28odSxlLEVuKEUpLFUpfSl9fWZ1bmN0aW9uIEJvKGUsdCxuLHIpe3JldHVybiguLi5zKT0+e2xldCB1PV9vKGUscyxuLHIpO2lmKHUpdGhyb3cgbmV3IEVycm9yKHUpO3JldHVybiB0LmFwcGx5KG51bGwscyl9fWZ1bmN0aW9uIFlhKGUsdCxuLHIpe3JldHVybiB1aShlLHQsbixyKX1mdW5jdGlvbiBLbihlLHQsbil7cmV0dXJuIEpyKGUsdCxuKX1mdW5jdGlvbiBLcihlLHQsbil7cmV0dXJuIE9uKGUsdCxuKX1mdW5jdGlvbiB1cihlLHQsbixyKXtyZXR1cm4gRm4oZSx1aShlLHQsdm9pZCAwLHIpKX1mdW5jdGlvbiBEdChlLHQsbixyKXtyZXR1cm4gQm8oZSx0LHZvaWQgMCxyKX1mdW5jdGlvbiBrZShlLHQsbixyKXtyZXR1cm4gRm4oZSxZYShlLHQsdm9pZCAwLHIpKX1sZXQgYm89ImJhc2U2NFRvQXJyYXlCdWZmZXIiLHlvPVt7bmFtZToiYmFzZTY0Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEVvPSJhcnJheUJ1ZmZlclRvQmFzZTY0IixwYT1be25hbWU6ImFycmF5QnVmZmVyIix0eXBlOltBcnJheUJ1ZmZlcixVaW50OEFycmF5XSxyZXF1aXJlZDohMH1dLFhvPUR0KGJvLGU9PklyKGUpLHlvKSxIaT1EdChFbyxlPT5jbihlKSxwYSk7ZnVuY3Rpb24gd28oKXtpZih0eXBlb2YgX19TWVNURU1fSU5GT19fIT0idW5kZWZpbmVkIilyZXR1cm4gd2luZG93Ll9fU1lTVEVNX0lORk9fXztsZXR7cmVzb2x1dGlvbldpZHRoOmV9PWwuc2NyZWVuLmdldEN1cnJlbnRTaXplKCl8fHtyZXNvbHV0aW9uV2lkdGg6MH07cmV0dXJue3BsYXRmb3JtOihsLm9zLm5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpLHBpeGVsUmF0aW86bC5zY3JlZW4uc2NhbGUsd2luZG93V2lkdGg6TWF0aC5yb3VuZChlKX19ZnVuY3Rpb24gWnIoZSx0LG4pe2UuJHBhZ2UubWV0YS5pc05WdWU/UW8oZSx0LG4pOmZpKGUsdCxuKX1mdW5jdGlvbiBmaShlLHQsbil7X3QuaW52b2tlVmlld01ldGhvZCgicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFzOnQubWFwKHI9PihyLmNvbXBvbmVudCYmKHIuY29tcG9uZW50PXIuY29tcG9uZW50LiRlbC5ub2RlSWQpLHIpKX0sZS4kcGFnZS5pZCxuKX1mdW5jdGlvbiBRbyhlLHQsbil7bGV0IHI9YW4odCkscz1uZXcgQXJyYXkoci5sZW5ndGgpO1NvKHIsZS4kZWwscyksZGkoZS4kcmVxdWlyZU5hdGl2ZVBsdWdpbigiZG9tIikscywwLFtdLHU9PntuKHUpfSl9ZnVuY3Rpb24gYW4oZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0uc2VsZWN0b3I7ci5pbmRleE9mKCIjIik9PT0wJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fWZ1bmN0aW9uIFNvKGUsdCxuKXtsZXQgcj10LmNoaWxkcmVuO2lmKCFKLmlzQXJyYXkocikpcmV0dXJuITE7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspe2xldCB1PXJbc107aWYodS5hdHRyKXtsZXQgZz1lLmluZGV4T2YodS5hdHRyLmlkKTtpZihnPj0wJiYobltnXT17aWQ6ZVtnXSxyZWY6dS5yZWYsZGF0YXNldDpyZS5wYXJzZU5WdWVEYXRhc2V0KHUuYXR0cil9LGUubGVuZ3RoPT09MSkpYnJlYWt9dS5jaGlsZHJlbiYmU28oZSx1LG4pfX1mdW5jdGlvbiBkaShlLHQsbixyLHMpe2xldCB1PXRbbl07ZS5nZXRDb21wb25lbnRSZWN0KHUucmVmLGc9PntnLnNpemUuaWQ9dS5pZCxnLnNpemUuZGF0YXNldD11LmRhdGFzZXQsci5wdXNoKGcuc2l6ZSksbis9MSxuPHQubGVuZ3RoP2RpKGUsdCxuLHIscyk6cyhyKX0pfWZ1bmN0aW9uIGdhKGUsdCl7X3QuaW52b2tlVmlld01ldGhvZCgic2V0UGFnZU1ldGEiLHQsZS4kcGFnZS5pZCl9bGV0IG1uPWU9PmUhPT1udWxsJiZ0eXBlb2YgZT09Im9iamVjdCIsQnI9WyJ7IiwifSJdO2NsYXNzIGZye2NvbnN0cnVjdG9yKCl7dGhpcy5fY2FjaGVzPU9iamVjdC5jcmVhdGUobnVsbCl9aW50ZXJwb2xhdGUodCxuLHI9QnIpe2lmKCFuKXJldHVyblt0XTtsZXQgcz10aGlzLl9jYWNoZXNbdF07cmV0dXJuIHN8fChzPXRhKHQsciksdGhpcy5fY2FjaGVzW3RdPXMpLGFvKHMsbil9fWxldCBlYT0vXig/OlxkKSsvLFBhPS9eKD86XHcpKy87ZnVuY3Rpb24gdGEoZSxbdCxuXSl7bGV0IHI9W10scz0wLHU9IiI7Zm9yKDtzPGUubGVuZ3RoOyl7bGV0IGc9ZVtzKytdO2lmKGc9PT10KXt1JiZyLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOnV9KSx1PSIiO2xldCBFPSIiO2ZvcihnPWVbcysrXTtnIT09dm9pZCAwJiZnIT09bjspRSs9ZyxnPWVbcysrXTtsZXQgVT1nPT09bixQPWVhLnRlc3QoRSk/Imxpc3QiOlUmJlBhLnRlc3QoRSk/Im5hbWVkIjoidW5rbm93biI7ci5wdXNoKHt2YWx1ZTpFLHR5cGU6UH0pfWVsc2UgdSs9Z31yZXR1cm4gdSYmci5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTp1fSkscn1mdW5jdGlvbiBhbyhlLHQpe2xldCBuPVtdLHI9MCxzPUFycmF5LmlzQXJyYXkodCk/Imxpc3QiOm1uKHQpPyJuYW1lZCI6InVua25vd24iO2lmKHM9PT0idW5rbm93biIpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7bGV0IHU9ZVtyXTtzd2l0Y2godS50eXBlKXtjYXNlInRleHQiOm4ucHVzaCh1LnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KHUudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6cz09PSJuYW1lZCImJm4ucHVzaCh0W3UudmFsdWVdKTticmVhaztjYXNlInVua25vd24iOmJyZWFrfXIrK31yZXR1cm4gbn1sZXQgWm49InpoLUhhbnMiLG9yPSJ6aC1IYW50IixWbj0iZW4iLFhyPSJmciIsaGk9ImVzIixuYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFNpPShlLHQpPT5uYS5jYWxsKGUsdCksQ2k9bmV3IGZyO2Z1bmN0aW9uIHNvKGUsdCl7cmV0dXJuISF0LmZpbmQobj0+ZS5pbmRleE9mKG4pIT09LTEpfWZ1bmN0aW9uIHZhKGUsdCl7cmV0dXJuIHQuZmluZChuPT5lLmluZGV4T2Yobik9PT0wKX1mdW5jdGlvbiBPaShlLHQpe2lmKCFlKXJldHVybjtpZihlPWUudHJpbSgpLnJlcGxhY2UoL18vZywiLSIpLHQmJnRbZV0pcmV0dXJuIGU7aWYoZT1lLnRvTG93ZXJDYXNlKCksZT09PSJjaGluZXNlIilyZXR1cm4gWm47aWYoZS5pbmRleE9mKCJ6aCIpPT09MClyZXR1cm4gZS5pbmRleE9mKCItaGFucyIpPi0xP1puOmUuaW5kZXhPZigiLWhhbnQiKT4tMXx8c28oZSxbIi10dyIsIi1oayIsIi1tbyIsIi1jaHQiXSk/b3I6Wm47bGV0IG49W1ZuLFhyLGhpXTt0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGg+MCYmKG49T2JqZWN0LmtleXModCkpO2xldCByPXZhKGUsbik7aWYocilyZXR1cm4gcn1jbGFzcyBqaXtjb25zdHJ1Y3Rvcih7bG9jYWxlOnQsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczpyLHdhdGNoZXI6cyxmb3JtYXRlcjp1fSl7dGhpcy5sb2NhbGU9Vm4sdGhpcy5mYWxsYmFja0xvY2FsZT1Wbix0aGlzLm1lc3NhZ2U9e30sdGhpcy5tZXNzYWdlcz17fSx0aGlzLndhdGNoZXJzPVtdLG4mJih0aGlzLmZhbGxiYWNrTG9jYWxlPW4pLHRoaXMuZm9ybWF0ZXI9dXx8Q2ksdGhpcy5tZXNzYWdlcz1yfHx7fSx0aGlzLnNldExvY2FsZSh0fHxWbikscyYmdGhpcy53YXRjaExvY2FsZShzKX1zZXRMb2NhbGUodCl7bGV0IG49dGhpcy5sb2NhbGU7dGhpcy5sb2NhbGU9T2kodCx0aGlzLm1lc3NhZ2VzKXx8dGhpcy5mYWxsYmFja0xvY2FsZSx0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXXx8KHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdPXt9KSx0aGlzLm1lc3NhZ2U9dGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV0sbiE9PXRoaXMubG9jYWxlJiZ0aGlzLndhdGNoZXJzLmZvckVhY2gocj0+e3IodGhpcy5sb2NhbGUsbil9KX1nZXRMb2NhbGUoKXtyZXR1cm4gdGhpcy5sb2NhbGV9d2F0Y2hMb2NhbGUodCl7bGV0IG49dGhpcy53YXRjaGVycy5wdXNoKHQpLTE7cmV0dXJuKCk9Pnt0aGlzLndhdGNoZXJzLnNwbGljZShuLDEpfX1hZGQodCxuLHI9ITApe2xldCBzPXRoaXMubWVzc2FnZXNbdF07cz9yP09iamVjdC5hc3NpZ24ocyxuKTpPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHU9PntTaShzLHUpfHwoc1t1XT1uW3VdKX0pOnRoaXMubWVzc2FnZXNbdF09bn1mKHQsbixyKXtyZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZSh0LG4scikuam9pbigiIil9dCh0LG4scil7bGV0IHM9dGhpcy5tZXNzYWdlO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyI/KG49T2kobix0aGlzLm1lc3NhZ2VzKSxuJiYocz10aGlzLm1lc3NhZ2VzW25dKSk6cj1uLFNpKHMsdCk/dGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShzW3RdLHIpLmpvaW4oIiIpOihjb25zb2xlLndhcm4oYENhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggJHt0fS4gVXNlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoIGFzIGRlZmF1bHQuYCksdCl9fWZ1bmN0aW9uIGRyKGUsdCl7ZS4kd2F0Y2hMb2NhbGU/ZS4kd2F0Y2hMb2NhbGUobj0+e3Quc2V0TG9jYWxlKG4pfSk6ZS4kd2F0Y2goKCk9PmUuJGxvY2FsZSxuPT57dC5zZXRMb2NhbGUobil9KX1mdW5jdGlvbiBTcigpe3JldHVybiB0eXBlb2YgTyE9InVuZGVmaW5lZCImJk8uZ2V0TG9jYWxlP08uZ2V0TG9jYWxlKCk6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCImJmdsb2JhbC5nZXRMb2NhbGU/Z2xvYmFsLmdldExvY2FsZSgpOlZufWZ1bmN0aW9uIGxvKGUsdD17fSxuLHIpe3R5cGVvZiBlIT0ic3RyaW5nIiYmKFtlLHRdPVt0LGVdKSx0eXBlb2YgZSE9InN0cmluZyImJihlPVNyKCkpLHR5cGVvZiBuIT0ic3RyaW5nIiYmKG49dHlwZW9mIFIhPSJ1bmRlZmluZWQiJiZSLmZhbGxiYWNrTG9jYWxlfHxWbik7bGV0IHM9bmV3IGppKHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSksdT0oZyxFKT0+e2lmKHR5cGVvZiBOdCE9ImZ1bmN0aW9uIil1PWZ1bmN0aW9uKFUsUCl7cmV0dXJuIHMudChVLFApfTtlbHNle2xldCBVPSExO3U9ZnVuY3Rpb24oUCxMKXtsZXQgT2U9TnQoKS4kdm07cmV0dXJuIE9lJiYoT2UuJGxvY2FsZSxVfHwoVT0hMCxkcihPZSxzKSkpLHMudChQLEwpfX1yZXR1cm4gdShnLEUpfTtyZXR1cm57aTE4bjpzLGYoZyxFLFUpe3JldHVybiBzLmYoZyxFLFUpfSx0KGcsRSl7cmV0dXJuIHUoZyxFKX0sYWRkKGcsRSxVPSEwKXtyZXR1cm4gcy5hZGQoZyxFLFUpfSx3YXRjaChnKXtyZXR1cm4gcy53YXRjaExvY2FsZShnKX0sZ2V0TG9jYWxlKCl7cmV0dXJuIHMuZ2V0TG9jYWxlKCl9LHNldExvY2FsZShnKXtyZXR1cm4gcy5zZXRMb2NhbGUoZyl9fX1mdW5jdGlvbiBNbyhlLHQpe3JldHVybiBlLmluZGV4T2YodFswXSk+LTF9bGV0IENvPXJlLm9uY2UoKCk9PnR5cGVvZiBSIT0idW5kZWZpbmVkIiYmUi5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKFIubG9jYWxlcykubGVuZ3RoKSxBaTtmdW5jdGlvbiBwaSgpe2xldCBlPU8uZ2V0TG9jYWxlKCksdD1SLmxvY2FsZXM7cmV0dXJuIHRbZV18fHRbUi5mYWxsYmFja0xvY2FsZV18fHQuZW58fHt9fWZ1bmN0aW9uIERvKGUpe3JldHVybiBNbyhlLHJlLkkxOE5fSlNPTl9ERUxJTUlURVJTKT9sZSgpLmYoZSxwaSgpLHJlLkkxOE5fSlNPTl9ERUxJTUlURVJTKTplfWZ1bmN0aW9uIEQoZSx0KXtpZih0Lmxlbmd0aD09PTEpe2lmKGUpe2xldCByPUU9PkouaXNTdHJpbmcoRSkmJk1vKEUscmUuSTE4Tl9KU09OX0RFTElNSVRFUlMpLHM9dFswXSx1PVtdO2lmKEouaXNBcnJheShlKSYmKHU9ZS5maWx0ZXIoRT0+cihFW3NdKSkpLmxlbmd0aClyZXR1cm4gdTtsZXQgZz1lW3RbMF1dO2lmKHIoZykpcmV0dXJuIGV9cmV0dXJufWxldCBuPXQuc2hpZnQoKTtyZXR1cm4gRChlJiZlW25dLHQpfWZ1bmN0aW9uIFooZSx0KXtyZXR1cm4gdC5tYXAobj0+bWUoZSxuKSl9ZnVuY3Rpb24gbWUoZSx0KXtsZXQgbj1EKGUsdCk7aWYoIW4pcmV0dXJuITE7bGV0IHI9dFt0Lmxlbmd0aC0xXTtpZihKLmlzQXJyYXkobikpbi5mb3JFYWNoKHM9Pm1lKHMsW3JdKSk7ZWxzZXtsZXQgcz1uW3JdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2dldCgpe3JldHVybiBEbyhzKX0sc2V0KHUpe3M9dX19KX1yZXR1cm4hMH1mdW5jdGlvbiBsZSgpe2lmKCFBaSl7bGV0IGU7aWYodHlwZW9mIE50PT0iZnVuY3Rpb24iP2U9di5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKTplPWwud2Vidmlldy5jdXJyZW50V2VidmlldygpLmdldFN0eWxlKCkubG9jYWxlLEFpPWxvKGUpLENvKCkpe2xldCB0PU9iamVjdC5rZXlzKFIubG9jYWxlc3x8e30pO3QubGVuZ3RoJiZ0LmZvckVhY2gobj0+QWkuYWRkKG4sUi5sb2NhbGVzW25dKSksQWkuc2V0TG9jYWxlKGUpfX1yZXR1cm4gQWl9ZnVuY3Rpb24gaGUoZSx0LG4pe3JldHVybiB0LnJlZHVjZSgocixzLHUpPT4ocltlK3NdPW5bdV0scikse30pfWxldCBPdD1yZS5vbmNlKCgpPT57bGV0IGU9InVuaS5hcHAuIix0PVsicXVpdCJdO2xlKCkuYWRkKFZuLGhlKGUsdCxbIlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiXSksITEpLGxlKCkuYWRkKGhpLGhlKGUsdCxbIlB1bHNlIG90cmEgdmV6IHBhcmEgc2FsaXIiXSksITEpLGxlKCkuYWRkKFhyLGhlKGUsdCxbIkFwcHV5ZXogXHhFMCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIl0pLCExKSxsZSgpLmFkZChabixoZShlLHQsWyJcdTUxOERcdTYzMDlcdTRFMDBcdTZCMjFcdTkwMDBcdTUxRkFcdTVFOTRcdTc1MjgiXSksITEpLGxlKCkuYWRkKG9yLGhlKGUsdCxbIlx1NTE4RFx1NjMwOVx1NEUwMFx1NkIyMVx1OTAwMFx1NTFGQVx1NjFDOVx1NzUyOCJdKSwhMSl9KSxLPXJlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dBY3Rpb25TaGVldC4iLHQ9WyJjYW5jZWwiXTtsZSgpLmFkZChWbixoZShlLHQsWyJDYW5jZWwiXSksITEpLGxlKCkuYWRkKGhpLGhlKGUsdCxbIkNhbmNlbGFyIl0pLCExKSxsZSgpLmFkZChYcixoZShlLHQsWyJBbm51bGVyIl0pLCExKSxsZSgpLmFkZChabixoZShlLHQsWyJcdTUzRDZcdTZEODgiXSksITEpLGxlKCkuYWRkKG9yLGhlKGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSl9KSxZPXJlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dNb2RhbC4iLHQ9WyJjYW5jZWwiLCJjb25maXJtIl07bGUoKS5hZGQoVm4saGUoZSx0LFsiQ2FuY2VsIiwiT0siXSksITEpLGxlKCkuYWRkKGhpLGhlKGUsdCxbIkNhbmNlbGFyIiwiT0siXSksITEpLGxlKCkuYWRkKFhyLGhlKGUsdCxbIkFubnVsZXIiLCJPSyJdKSwhMSksbGUoKS5hZGQoWm4saGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU3ODZFXHU1QjlBIl0pLCExKSxsZSgpLmFkZChvcixoZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTc4QkFcdTVCOUEiXSksITEpfSksY2U9cmUub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlSW1hZ2UuIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07bGUoKS5hZGQoVm4saGUoZSx0LFsiQ2FuY2VsIiwiQWxidW0iLCJDYW1lcmEiXSksITEpLGxlKCkuYWRkKGhpLGhlKGUsdCxbIkNhbmNlbGFyIiwiXHhDMWxidW0iLCJDXHhFMW1hcmEiXSksITEpLGxlKCkuYWRkKFhyLGhlKGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksbGUoKS5hZGQoWm4saGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RUNFXHU3NkY4XHU1MThDXHU5MDA5XHU2MkU5IiwiXHU2MkNEXHU2NDQ0Il0pLCExKSxsZSgpLmFkZChvcixoZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTVGOUVcdTc2RjhcdTUxOEFcdTkwNzhcdTY0QzciLCJcdTYyQ0RcdTY1MUQiXSksITEpfSkseGU9cmUub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlVmlkZW8uIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07bGUoKS5hZGQoVm4saGUoZSx0LFsiQ2FuY2VsIiwiQWxidW0iLCJDYW1lcmEiXSksITEpLGxlKCkuYWRkKGhpLGhlKGUsdCxbIkNhbmNlbGFyIiwiXHhDMWxidW0iLCJDXHhFMW1hcmEiXSksITEpLGxlKCkuYWRkKFhyLGhlKGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksbGUoKS5hZGQoWm4saGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RUNFXHU3NkY4XHU1MThDXHU5MDA5XHU2MkU5IiwiXHU2MkNEXHU2NDQ0Il0pLCExKSxsZSgpLmFkZChvcixoZShlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTVGOUVcdTc2RjhcdTUxOEFcdTkwNzhcdTY0QzciLCJcdTYyQ0RcdTY1MUQiXSksITEpfSksbHQ9cmUub25jZSgoKT0+e2xldCBlPSJ1bmkucHJldmlld0ltYWdlLiIsdD1bImNhbmNlbCIsImJ1dHRvbi5zYXZlIiwic2F2ZS5zdWNjZXNzIiwic2F2ZS5mYWlsIl07bGUoKS5hZGQoVm4saGUoZSx0LFsiQ2FuY2VsIiwiU2F2ZSBJbWFnZSIsIlNhdmVkIHN1Y2Nlc3NmdWxseSIsIlNhdmUgZmFpbGVkIl0pLCExKSxsZSgpLmFkZChoaSxoZShlLHQsWyJDYW5jZWxhciIsIkd1YXJkYXIgaW1hZ2VuIiwiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwiRXJyb3IgYWwgZ3VhcmRhciJdKSwhMSksbGUoKS5hZGQoWHIsaGUoZSx0LFsiQW5udWxlciIsIkd1YXJkYXIgaW1hZ2VuIiwiRW5yZWdpc3RyXHhFOSBhdmVjIHN1Y2NceEU4cyIsIlx4QzljaGVjIGRlIGxhIHNhdXZlZ2FyZGUiXSksITEpLGxlKCkuYWRkKFpuLGhlKGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NjIxMFx1NTI5RiIsIlx1NEZERFx1NUI1OFx1NTZGRVx1NTBDRlx1NTIzMFx1NzZGOFx1NTE4Q1x1NTkzMVx1OEQyNSJdKSwhMSksbGUoKS5hZGQob3IsaGUoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU2MjEwXHU1MjlGIiwiXHU0RkREXHU1QjU4XHU1NzE2XHU1MENGXHU1MjMwXHU3NkY4XHU1MThBXHU1OTMxXHU2NTU3Il0pLCExKX0pLHp0PXJlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNldENsaXBib2FyZERhdGEuIix0PVsic3VjY2VzcyIsImZhaWwiXTtsZSgpLmFkZChWbixoZShlLHQsWyJDb250ZW50IGNvcGllZCIsIkNvcHkgZmFpbGVkLCBwbGVhc2UgY29weSBtYW51YWxseSJdKSwhMSksbGUoKS5hZGQoaGksaGUoZSx0LFsiQ29udGVuaWRvIGNvcGlhZG8iLCJFcnJvciBhbCBjb3BpYXIsIGNvcGllIG1hbnVhbG1lbnRlIl0pLCExKSxsZSgpLmFkZChYcixoZShlLHQsWyJDb250ZW51IGNvcGlceEU5IiwiXHhDOWNoZWMgZGUgbGEgY29waWUsIGNvcGlleiBtYW51ZWxsZW1lbnQiXSksITEpLGxlKCkuYWRkKFpuLGhlKGUsdCxbIlx1NTE4NVx1NUJCOVx1NURGMlx1NTkwRFx1NTIzNiIsIlx1NTkwRFx1NTIzNlx1NTkzMVx1OEQyNVx1RkYwQ1x1OEJGN1x1NjI0Qlx1NTJBOFx1NTkwRFx1NTIzNiJdKSwhMSksbGUoKS5hZGQob3IsaGUoZSx0LFsiXHU1MTY3XHU1QkI5XHU1REYyXHU1RkE5XHU1MjM2IiwiXHU1RkE5XHU1MjM2XHU1OTMxXHU2NTU3XHVGRjBDXHU4QUNCXHU2MjRCXHU1MkQ1XHU1RkE5XHU4OEZEIl0pLCExKX0pLEFuPXJlLm9uY2UoKCk9PntsZXQgZT0idW5pLnNjYW5Db2RlLiIsdD1bInRpdGxlIiwiYWxidW0iLCJmYWlsIiwiZmxhc2gub24iLCJmbGFzaC5vZmYiXTtsZSgpLmFkZChWbixoZShlLHQsWyJTY2FuIGNvZGUiLCJBbGJ1bSIsIlJlY29nbml0aW9uIGZhaWx1cmUiLCJUYXAgdG8gdHVybiBsaWdodCBvbiIsIlRhcCB0byB0dXJuIGxpZ2h0IG9mZiJdKSwhMSksbGUoKS5hZGQoaGksaGUoZSx0LFsiQ1x4RjNkaWdvIGRlIGVzY2FuZW8iLCJceEMxbGJ1bSIsIlx4QzljaGVjIGRlIGxhIHJlY29ubmFpc3NhbmNlIiwiVG9xdWUgcGFyYSBlbmNlbmRlciBsYSBsdXoiLCJUb3F1ZSBwYXJhIGFwYWdhciBsYSBsdXoiXSksITEpLGxlKCkuYWRkKFhyLGhlKGUsdCxbIkNvZGUgZFx1MjAxOWFuYWx5c2UiLCJBbGJ1bSIsIkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCdceEU5Y2xhaXJhZ2UiLCJBcHB1eWV6IHBvdXIgZFx4RTlzYWN0aXZlciBsJ1x4RTljbGFpcmFnZSJdKSwhMSksbGUoKS5hZGQoWm4saGUoZSx0LFsiXHU2MjZCXHU3ODAxIiwiXHU3NkY4XHU1MThDIiwiXHU4QkM2XHU1MjJCXHU1OTMxXHU4RDI1IiwiXHU4RjdCXHU4OUU2XHU3MTY3XHU0RUFFIiwiXHU4RjdCXHU4OUU2XHU1MTczXHU5NUVEIl0pLCExKSxsZSgpLmFkZChvcixoZShlLHQsWyJcdTYzODNcdTc4QkMiLCJcdTc2RjhcdTUxOEEiLCJcdThCNThcdTUyMjVcdTU5MzFcdTY1NTciLCJcdThGMTVcdTg5RjhcdTcxNjdcdTRFQUUiLCJcdThGMTVcdTg5RjhcdTk1RENcdTk1ODkiXSksITEpfSksWG49cmUub25jZSgoKT0+e2xldCBlPSJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLiIsdD1bImF1dGhDb250ZW50Iiwid2FpdGluZ0NvbnRlbnQiXTtsZSgpLmFkZChWbixoZShlLHQsWyJGaW5nZXJwcmludCByZWNvZ25pdGlvbiIsIlVucmVjb2duaXphYmxlIl0pLCExKSxsZSgpLmFkZChoaSxoZShlLHQsWyJSZWNvbm9jaW1pZW50byBkZSBodWVsbGFzIGRhY3RpbGFyZXMiLCJJcnJlY29ub2NpYmxlIl0pLCExKSxsZSgpLmFkZChYcixoZShlLHQsWyJSZWNvbm5haXNzYW5jZSBkZSBsJ2VtcHJlaW50ZSBkaWdpdGFsZSIsIk1ceEU5Y29ubmFpc3NhYmxlIl0pLCExKSxsZSgpLmFkZChabixoZShlLHQsWyJcdTYzMDdcdTdFQjlcdThCQzZcdTUyMkJcdTRFMkQuLi4iLCJcdTY1RTBcdTZDRDVcdThCQzZcdTUyMkIiXSksITEpLGxlKCkuYWRkKG9yLGhlKGUsdCxbIlx1NjMwN1x1N0QwQlx1OEI1OFx1NTIyNVx1NEUyRC4uLiIsIlx1NzEyMVx1NkNENVx1OEI1OFx1NTIyNSJdKSwhMSl9KTtmdW5jdGlvbiBRcihlKXtpZihDbygpKXJldHVybiBaKGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9ZnVuY3Rpb24gTXIoZSl7aWYoQ28oKSl7bGV0IHQ9ImNhcHRpb24iO3JldHVybiBaKGUsW1siY29udGVudGRvd24iLHRdLFsiY29udGVudG92ZXIiLHRdLFsiY29udGVudHJlZnJlc2giLHRdXSl9fWZ1bmN0aW9uIGNvKGUpe2xldCB0PW5ldyByZS5FbWl0dGVyO3JldHVybntvbihuLHIpe3JldHVybiB0Lm9uKG4scil9LG9uY2UobixyKXtyZXR1cm4gdC5vbmNlKG4scil9LG9mZihuLHIpe3JldHVybiB0Lm9mZihuLHIpfSxlbWl0KG4sLi4ucil7cmV0dXJuIHQuZW1pdChuLC4uLnIpfSxzdWJzY3JpYmUobixyLHM9ITEpe3Rbcz8ib25jZSI6Im9uIl0oYCR7ZX0uJHtufWAscil9LHVuc3Vic2NyaWJlKG4scil7dC5vZmYoYCR7ZX0uJHtufWAscil9LHN1YnNjcmliZUhhbmRsZXIobixyLHMpe3QuZW1pdChgJHtlfS4ke259YCxyLHMpfX19bGV0IGdyPSJpbnZva2VWaWV3QXBpIixnaT0iaW52b2tlU2VydmljZUFwaSI7ZnVuY3Rpb24gdW8oZSl7cmV0dXJuIGU9ZSsiIixlLmluZGV4T2YoInJweCIpIT09LTF8fGUuaW5kZXhPZigidXB4IikhPT0tMX1mdW5jdGlvbiBmbyhlLHQ9ITEpe2lmKHQpcmV0dXJuIHJhKGUpO2lmKEouaXNTdHJpbmcoZSkpe2xldCBuPXBhcnNlSW50KGUpfHwwO3JldHVybiB1byhlKT9PLnVweDJweChuKTpufXJldHVybiBlfWZ1bmN0aW9uIHJhKGUpe3JldHVybiB1byhlKT9lLnJlcGxhY2UoLyhcZCsoXC5cZCspPylbcnVdcHgvZywodCxuKT0+Ty51cHgycHgocGFyc2VGbG9hdChuKSkrInB4Iik6ZX1mdW5jdGlvbiBRbihlKXtsZXQgdD1yZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSk7aWYodC4kcGFnZSlyZXR1cm4gdC4kcGFnZS5pZDtpZighdC4kKXJldHVybjtsZXQgbj10LiQucm9vdC5wcm94eTtpZihuJiZuLiRwYWdlKXJldHVybiBuLiRwYWdlLmlkfWZ1bmN0aW9uIERyKCl7bGV0IGU9am4oKSx0PWUubGVuZ3RoO2lmKHQpcmV0dXJuIGVbdC0xXX1mdW5jdGlvbiBxYSgpe2xldCBlPURyKCk7aWYoZSlyZXR1cm4gZS4kcGFnZS5tZXRhfWZ1bmN0aW9uIE5hKCl7bGV0IGU9cWEoKTtyZXR1cm4gZT9lLmlkOi0xfWZ1bmN0aW9uIExyKCl7bGV0IGU9RHIoKTtpZihlKXJldHVybiBlLiR2bX1sZXQgVnM9WyJuYXZpZ2F0aW9uQmFyIiwicHVsbFRvUmVmcmVzaCJdO2Z1bmN0aW9uIFVzKCl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoUi5nbG9iYWxTdHlsZXx8e30pKX1mdW5jdGlvbiBpbChlLHQpe2xldCBuPVVzKCkscj1KLmV4dGVuZCh7aWQ6dH0sbixlKTtWcy5mb3JFYWNoKHU9PntyW3VdPUouZXh0ZW5kKHt9LG5bdV0sZVt1XSl9KTtsZXR7bmF2aWdhdGlvbkJhcjpzfT1yO3JldHVybiBzLnRpdGxlVGV4dCYmcy50aXRsZUltYWdlJiYocy50aXRsZVRleHQ9IiIpLHJ9ZnVuY3Rpb24gT28oZSl7cmV0dXJuIEpTT04ucGFyc2UoZm8oSlNPTi5zdHJpbmdpZnkoZSksITApKX1mdW5jdGlvbiBUaShlKXtyZXR1cm4gZS5vZmZzZXQmJihlLm9mZnNldD1mbyhlLm9mZnNldCkpLGUuaGVpZ2h0JiYoZS5oZWlnaHQ9Zm8oZS5oZWlnaHQpKSxlLnJhbmdlJiYoZS5yYW5nZT1mbyhlLnJhbmdlKSksZX1mdW5jdGlvbiBrYShlLHQsbixyLHMsdSl7bGV0e2lkOmcscm91dGU6RX09cixVPXJlLm5vcm1hbGl6ZVN0eWxlcyhyLm5hdmlnYXRpb25CYXIsUi50aGVtZUNvbmZpZyx1KS50aXRsZUNvbG9yO3JldHVybntpZDpnLHBhdGg6cmUuYWRkTGVhZGluZ1NsYXNoKEUpLHJvdXRlOkUsZnVsbFBhdGg6dCxvcHRpb25zOm4sbWV0YTpyLG9wZW5UeXBlOmUsZXZlbnRDaGFubmVsOnMsc3RhdHVzQmFyU3R5bGU6VT09PSIjZmZmZmZmIj8ibGlnaHQiOiJkYXJrIn19ZnVuY3Rpb24gTmwoZSx0LG4pe2xldCByPWUuJFt0XTshSi5pc0FycmF5KHIpfHxuLl9fd2VoJiZKLnJlbW92ZShyLG4uX193ZWgpfWZ1bmN0aW9uIHpuKGUsdCxuKXtpZihKLmlzU3RyaW5nKGUpKW49dCx0PWUsZT1McigpO2Vsc2UgaWYodHlwZW9mIGU9PSJudW1iZXIiKXtsZXQgcz1qbigpLmZpbmQodT0+dS4kcGFnZS5pZD09PWUpO3M/ZT1zLiR2bTplPUxyKCl9aWYoIWUpcmV0dXJuO2lmKGUuX19jYWxsX2hvb2spcmV0dXJuIGUuX19jYWxsX2hvb2sodCxuKTtsZXQgcj1lLiRbdF07cmV0dXJuIHImJnJlLmludm9rZUFycmF5Rm5zKHIsbil9ZnVuY3Rpb24gbWEoZSl7aWYoZS5pbmRleE9mKCIvIik9PT0wKXJldHVybiBlO2xldCB0PSIiLG49am4oKTtyZXR1cm4gbi5sZW5ndGgmJih0PW5bbi5sZW5ndGgtMV0uJHBhZ2Uucm91dGUpLGdzKHQsZSl9ZnVuY3Rpb24gZ3MoZSx0KXtpZih0LmluZGV4T2YoIi8iKT09PTApcmV0dXJuIHQ7aWYodC5pbmRleE9mKCIuLyIpPT09MClyZXR1cm4gZ3MoZSx0LnNsaWNlKDIpKTtsZXQgbj10LnNwbGl0KCIvIikscj1uLmxlbmd0aCxzPTA7Zm9yKDtzPHImJm5bc109PT0iLi4iO3MrKyk7bi5zcGxpY2UoMCxzKSx0PW4uam9pbigiLyIpO2xldCB1PWUubGVuZ3RoPjA/ZS5zcGxpdCgiLyIpOltdO3JldHVybiB1LnNwbGljZSh1Lmxlbmd0aC1zLTEscysxKSxyZS5hZGRMZWFkaW5nU2xhc2godS5jb25jYXQobikuam9pbigiLyIpKX1mdW5jdGlvbiBobyhlLHQ9ITEpe3JldHVybiB0P1dlLmZpbmQobj0+bi5wYXRoPT09ZXx8bi5hbGlhcz09PWUpOldlLmZpbmQobj0+bi5wYXRoPT09ZSl9ZnVuY3Rpb24gSmEoZSl7bGV0IHQ9aG8oZSk7aWYodClyZXR1cm4gdC5tZXRhfWZ1bmN0aW9uIG9sKGUsdCxuKXtsZXQgcj1obyhyZS5hZGRMZWFkaW5nU2xhc2godCkpO2lmKHIpe2xldHttZXRhOnV9PXI7ZGVsZXRlIHUudGFiQmFySW5kZXgsdS5pc1F1aXQ9dS5pc1RhYkJhcj0hMX1sZXQgcz1obyhyZS5hZGRMZWFkaW5nU2xhc2gobikpO2lmKHMpe2xldHttZXRhOnV9PXM7dS50YWJCYXJJbmRleD1lLHUuaXNRdWl0PXUuaXNUYWJCYXI9ITA7bGV0IGc9Ui50YWJCYXI7ZyYmZy5saXN0JiZnLmxpc3RbZV0mJihnLmxpc3RbZV0ucGFnZVBhdGg9cmUucmVtb3ZlTGVhZGluZ1NsYXNoKG4pKX19bGV0IFJhLGFsLF9hO2Z1bmN0aW9uIHZzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0Ij8id2VidmlldyI6InY4In1mdW5jdGlvbiBtcygpe3JldHVybiBSYS53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9bGV0IHppLENyLGJhPXt9O2Z1bmN0aW9uIExvKGUpe2xldCB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZighdHx8IXQuX19wYWdlKXJldHVybjtsZXQgbj10Ll9fcGFnZSxyPWJhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgYmFbbl19ZnVuY3Rpb24geGEoZSx0KXt2cygpPT09InY4Ij9fYT8oemkmJnppLmNsb3NlKCksemk9bmV3IF9hKG1zKCkpLHppLm9ubWVzc2FnZT1Mbyk6Q3J8fChDcj1hbC5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLENyLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixMbykpOndpbmRvdy5fX3BsdXNNZXNzYWdlPUxvLGJhW2VdPXR9Y2xhc3Mgc2x7Y29uc3RydWN0b3IodCl7dGhpcy53ZWJ2aWV3PXR9c2VuZE1lc3NhZ2UodCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOnR9fSkpLHI9dGhpcy53ZWJ2aWV3LmlkO19hP25ldyBfYShyKS5wb3N0TWVzc2FnZShuKTpSYS53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyYmUmEud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcobixyKX1jbG9zZSgpe3RoaXMud2Vidmlldy5jbG9zZSgpfX1mdW5jdGlvbiAkcyh7Y29udGV4dDplPXt9LHVybDp0LGRhdGE6bj17fSxzdHlsZTpyPXt9LG9uTWVzc2FnZTpzLG9uQ2xvc2U6dX0pe2xldCBnPVIuZGFya21vZGU7UmE9ZS5wbHVzfHxsLGFsPWUud2VleHx8KHR5cGVvZiB2PT0ib2JqZWN0Ij92Om51bGwpLF9hPWUuQnJvYWRjYXN0Q2hhbm5lbHx8KHR5cGVvZiBCcm9hZGNhc3RDaGFubmVsPT0ib2JqZWN0Ij9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO2xldCBFPXthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxVPWBwYWdlJHtEYXRlLm5vdygpfWA7cj1KLmV4dGVuZCh7fSxyKSxyLnRpdGxlTlZpZXchPT0hMSYmci50aXRsZU5WaWV3IT09Im5vbmUiJiYoci50aXRsZU5WaWV3PUouZXh0ZW5kKEUsci50aXRsZU5WaWV3KSk7bGV0IFA9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDpgLyR7dH0uanNgLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpSYS5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07cj1KLmV4dGVuZChQLHIpO2xldCBMPVJhLndlYnZpZXcuY3JlYXRlKCIiLFUscix7ZXh0cmFzOntmcm9tOm1zKCkscnVudGltZTp2cygpLGRhdGE6Si5leHRlbmQoe30sbix7ZGFya21vZGU6Z30pLHVzZUdsb2JhbEV2ZW50OiFfYX19KTtyZXR1cm4gTC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsdSkseGEoVSxPZT0+e0ouaXNGdW5jdGlvbihzKSYmcyhPZS5kYXRhKSxPZS5rZWVwfHxMLmNsb3NlKCJhdXRvIil9KSxMLnNob3coci5hbmltYXRpb25UeXBlLHIuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBzbChMKX1sZXQga2w9KGUsdCk9Pl90LmVtaXQoImFwaS4iK2UsdCkseWE9MTtmdW5jdGlvbiBfcyhlKXtyZXR1cm4oZXx8TmEoKSkrIi4iK2dyfWxldCBIcz0oZSx0LG4scik9PntsZXR7c3Vic2NyaWJlOnMscHVibGlzaEhhbmRsZXI6dX09X3QsZz1yP3lhKys6MDtyJiZzKGdyKyIuIitnLHIsITApLHUoX3Mobikse2lkOmcsbmFtZTplLGFyZ3M6dH0sbil9LGxsPShlLHQsbixyKT0+e2xldHtzdWJzY3JpYmU6cyx1bnN1YnNjcmliZTp1LHB1Ymxpc2hIYW5kbGVyOmd9PV90LEU9eWErKyxVPWdyKyIuIitFO3JldHVybiBzKFUsbiksZyhfcyhyKSx7aWQ6RSxuYW1lOmUsYXJnczp0fSxyKSwoKT0+e3UoVSl9fSxqcz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHkoKXtfdC5zdWJzY3JpYmUoZ2ksVyl9ZnVuY3Rpb24gTShlLHQpe2pzW2VdfHwoanNbZV09dCl9ZnVuY3Rpb24gVyh7aWQ6ZSxuYW1lOnQsYXJnczpufSxyKXtsZXQgcz1nPT57ZSYmX3QucHVibGlzaEhhbmRsZXIoZ2krIi4iK2UsZyxyKX0sdT1qc1t0XTt1P3UobixzKTpzKHt9KX1sZXQgSD1KLmV4dGVuZChjbygidmlldyIpLHtpbnZva2VPbkNhbGxiYWNrOmtsLGludm9rZVZpZXdNZXRob2Q6SHMsaW52b2tlVmlld01ldGhvZEtlZXBBbGl2ZTpsbH0pO2Z1bmN0aW9uIFEoKXtsZXR7b246ZX09X3Q7ZShyZS5PTl9SRVNJWkUsdGUpLGUocmUuT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQsZmUpLGUocmUuT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQscGUpfWZ1bmN0aW9uIHRlKGUpe3puKERyKCkscmUuT05fUkVTSVpFLGUpLF90Lmludm9rZU9uQ2FsbGJhY2soIm9uV2luZG93UmVzaXplIixlKX1mdW5jdGlvbiBmZShlKXtsZXQgdD1EcigpO3puKE50KCkscmUuT05fU0hPVyxlKSx6bih0LHJlLk9OX1NIT1cpfWZ1bmN0aW9uIHBlKCl7em4oTnQoKSxyZS5PTl9ISURFKSx6bihEcigpLHJlLk9OX0hJREUpfWxldCBDZT1bcmUuT05fUEFHRV9TQ1JPTEwscmUuT05fUkVBQ0hfQk9UVE9NXTtmdW5jdGlvbiBCZSgpe0NlLmZvckVhY2goZT0+X3Quc3Vic2NyaWJlKGUsU2UoZSkpKX1mdW5jdGlvbiBTZShlKXtyZXR1cm4odCxuKT0+e3puKHBhcnNlSW50KG4pLGUsdCl9fWZ1bmN0aW9uIGplKCl7USgpLEJlKCl9ZnVuY3Rpb24gYnQoZSl7ZS4kdm09ZSxlLiRtcFR5cGU9ImFwcCI7bGV0IHQ9RG4ucmVmKGxlKCkuZ2V0TG9jYWxlKCkpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCIkbG9jYWxlIix7Z2V0KCl7cmV0dXJuIHQudmFsdWV9LHNldChuKXt0LnZhbHVlPW59fSl9ZnVuY3Rpb24gQ3QoZSx0KXtlLnJvdXRlPXQucm91dGUsZS4kdm09ZSxlLiRwYWdlPXQsZS4kbXBUeXBlPSJwYWdlIix0Lm1ldGEuaXNUYWJCYXImJihlLiQuX19pc1RhYkJhcj0hMCxlLiQuX19pc0FjdGl2ZT0hMCl9ZnVuY3Rpb24gV3QoKXtyZXR1cm57cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX19ZnVuY3Rpb24gRXQoZSx0KXtsZXQgbj1lLiRvcHRpb25zfHx7fTtuLmdsb2JhbERhdGE9Si5leHRlbmQobi5nbG9iYWxEYXRhfHx7fSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZ2xvYmFsRGF0YSIse2dldCgpe3JldHVybiBuLmdsb2JhbERhdGF9LHNldChyKXtuLmdsb2JhbERhdGE9cn19KX1mdW5jdGlvbiBLZShlKXtpZihlLmluZGV4T2YoIi8vIik9PT0wKXJldHVybiJodHRwczoiK2U7aWYocmUuU0NIRU1FX1JFLnRlc3QoZSl8fHJlLkRBVEFfUkUudGVzdChlKSlyZXR1cm4gZTtpZihfbihlKSlyZXR1cm4iZmlsZTovLyIrTXQoZSk7bGV0IHQ9ImZpbGU6Ly8iK010KCJfd3d3Iik7aWYoZS5pbmRleE9mKCIvIik9PT0wKXJldHVybiBlLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6dCtlO2lmKGUuaW5kZXhPZigiLi4vIik9PT0wfHxlLmluZGV4T2YoIi4vIik9PT0wKXtpZih0eXBlb2YgX19pZF9fPT0ic3RyaW5nIilyZXR1cm4gdCtncyhyZS5hZGRMZWFkaW5nU2xhc2goX19pZF9fKSxlKTt7bGV0IG49RHIoKTtpZihuKXJldHVybiB0K2dzKHJlLmFkZExlYWRpbmdTbGFzaChuLnJvdXRlKSxlKX19cmV0dXJuIGV9bGV0IE10PXJlLmNhY2hlU3RyaW5nRnVuY3Rpb24oZT0+bC5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpKTtmdW5jdGlvbiBfbihlKXtyZXR1cm4gZS5pbmRleE9mKCJfd3d3Iik9PT0wfHxlLmluZGV4T2YoIl9kb2MiKT09PTB8fGUuaW5kZXhPZigiX2RvY3VtZW50cyIpPT09MHx8ZS5pbmRleE9mKCJfZG93bmxvYWRzIik9PT0wfWxldCB3bj0ic3VjY2VzcyIsQXQ9ImZhaWwiLGFyPVt3bixBdCwiY29tcGxldGUiXTtmdW5jdGlvbiBKdChlLHQsbixyKXtpZighZSlyZXR1cm47aWYodHlwZW9mIG49PSJ1bmRlZmluZWQiKXJldHVybiBlW3RdKCk7bGV0WyxzXT1CYShuLHIpO3JldHVybiBPYmplY3Qua2V5cyhzKS5sZW5ndGg/ZVt0XShicyh0LHMpKTplW3RdKCl9ZnVuY3Rpb24gR3QoZSx0LG4scil7aWYoIWUpcmV0dXJuO2xldFtzLHVdPUJhKG4scik7cmV0dXJuIE9iamVjdC5rZXlzKHUpLmxlbmd0aD9lW3RdKHMsYnModCx1KSk6ZVt0XShzKX1mdW5jdGlvbiBSbihlLHQpe2xldCBuPWVyKGUsdC4kZWwpO3JldHVybiBufHxjb25zb2xlLmVycm9yKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfWZ1bmN0aW9uIGVyKGUsdCl7aWYoIWV8fCF0KXJldHVybjtpZih0LmF0dHImJnQuYXR0ci5pZD09PWUpcmV0dXJuIHQ7bGV0IG49dC5jaGlsZHJlbjtpZighIW4pZm9yKGxldCByPTAscz1uLmxlbmd0aDtyPHM7cisrKXtsZXQgdT1lcihlLG5bcl0pO2lmKHUpcmV0dXJuIHV9fWZ1bmN0aW9uIEJhKGU9e30sdCl7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWZ1bmN0aW9uKHUpe2xldCBnPWVbdV07Si5pc0Z1bmN0aW9uKGcpJiYoblt1XT1nLGRlbGV0ZSBlW3VdKX07cmV0dXJuIGFyLmZvckVhY2gociksdCYmdC5mb3JFYWNoKHIpLFtlLG5dfWZ1bmN0aW9uIGJzKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2xldCBzPXIudHlwZTtkZWxldGUgci50eXBlO2xldCB1PXRbc107aWYocz09PXduP3IuZXJyTXNnPWAke2V9Om9rYDpzPT09QXQmJihyLmVyck1zZz1lKyI6ZmFpbCAiKyhyLm1zZz8iICIrci5tc2c6IiIpKSxkZWxldGUgci5jb2RlLGRlbGV0ZSByLm1zZyxKLmlzRnVuY3Rpb24odSkmJnUocikscz09PXdufHxzPT09QXQpe2xldCBnPXQuY29tcGxldGU7Si5pc0Z1bmN0aW9uKGcpJiZnKHIpfX19bGV0IE1hO2Z1bmN0aW9uIEFvKCl7cmV0dXJuIE1hfWZ1bmN0aW9uIHlzKGUpe2xldCB0PWUuJDtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5jdHgsIiRjaGlsZHJlbiIse2dldCgpe3JldHVybiB0cigpLm1hcChyPT5yLiR2bSl9fSk7bGV0IG49dC5hcHBDb250ZXh0O01hPUouZXh0ZW5kKG4uYXBwLHttb3VudFBhZ2UocixzLHUpe2xldCBnPURuLmNyZWF0ZVZOb2RlKHIscyk7Zy5hcHBDb250ZXh0PW4sZy5fX3BhZ2VfY29udGFpbmVyX189dSxEbi5yZW5kZXIoZyx1KTtsZXQgRT1nLmNvbXBvbmVudC5wcm94eTtyZXR1cm4gRS5fX3BhZ2VfY29udGFpbmVyX189dSxFfSx1bm1vdW50UGFnZTpyPT57bGV0e19fcGFnZV9jb250YWluZXJfXzpzfT1yO3MmJihzLmlzVW5tb3VudGVkPSEwLERuLnJlbmRlcihudWxsLHMpKX19KX1sZXQgZWk9W107ZnVuY3Rpb24gRGEoZSl7aWYoIWUuJHBhZ2UubWV0YS5pc05WdWUpcmV0dXJuIGVpLnB1c2goZSk7bGV0IG49ZWkuZmluZEluZGV4KHI9PnIuJHBhZ2UuaWQ9PT1lLiRwYWdlLmlkKTtuPi0xP2VpLnNwbGljZShuLDEsZSk6ZWkucHVzaChlKX1mdW5jdGlvbiBpYShlKXtyZXR1cm4gZWkuZmluZCh0PT50LiRwYWdlLmlkPT09ZSl9ZnVuY3Rpb24gdHIoKXtyZXR1cm4gZWl9ZnVuY3Rpb24gS2EoKXtsZXQgZT1bXTtyZXR1cm4gZWkuZm9yRWFjaCh0PT57dC4kLl9faXNUYWJCYXI/dC4kLl9faXNBY3RpdmUmJmUucHVzaCh0KTplLnB1c2godCl9KSxlfWZ1bmN0aW9uIGNsKCl7bGV0IGU9RHIoKTshZXx8Rm8oZSl9ZnVuY3Rpb24gRm8oZSl7bGV0IHQ9ZWkuZmluZEluZGV4KG49Pm49PT1lKTt0IT09LTEmJihlLiRwYWdlLm1ldGEuaXNOVnVlfHxBbygpLnVubW91bnRQYWdlKGUpLGVpLnNwbGljZSh0LDEpKX1sZXQgV2k9e3BsYXkoZSl7cmV0dXJuIEp0KGUsInBsYXkiKX0scGF1c2UoZSl7cmV0dXJuIEp0KGUsInBhdXNlIil9LHNlZWsoZSx0KXtyZXR1cm4gR3QoZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3AoZSl7cmV0dXJuIEp0KGUsInN0b3AiKX0sc2VuZERhbm11KGUsdCl7cmV0dXJuIEd0KGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZShlLHQpe3JldHVybiBHdChlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuKGUsdD17fSl7cmV0dXJuIEd0KGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW4oZSl7cmV0dXJuIEp0KGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXIoZSl7cmV0dXJuIEp0KGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcihlKXtyZXR1cm4gSnQoZSwiaGlkZVN0YXR1c0JhciIpfX07ZnVuY3Rpb24gVW4oZSx0LG4scil7bGV0IHM9aWEodCk7aWYocz09bnVsbD92b2lkIDA6cy4kcGFnZS5tZXRhLmlzTlZ1ZSl7bGV0IHU9cy4kdm07cmV0dXJuIFdpW25dKFJuKGUsdSkscil9X3QuaW52b2tlVmlld01ldGhvZCgidmlkZW8uIitlLHt2aWRlb0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9bGV0IEdpPXtnZXRDZW50ZXJMb2NhdGlvbihlLHQpe3JldHVybiBKdChlLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9LG1vdmVUb0xvY2F0aW9uKGUsdCl7cmV0dXJuIEd0KGUsIm1vdmVUb0xvY2F0aW9uIix0KX0sdHJhbnNsYXRlTWFya2VyKGUsdCl7cmV0dXJuIEd0KGUsInRyYW5zbGF0ZU1hcmtlciIsdCxbImFuaW1hdGlvbkVuZCJdKX0saW5jbHVkZVBvaW50cyhlLHQpe3JldHVybiBHdChlLCJpbmNsdWRlUG9pbnRzIix0KX0sZ2V0UmVnaW9uKGUsdCl7cmV0dXJuIEp0KGUsImdldFJlZ2lvbiIsdCl9LGdldFNjYWxlKGUsdCl7cmV0dXJuIEp0KGUsImdldFNjYWxlIix0KX0sYWRkQ3VzdG9tTGF5ZXIoZSx0KXtyZXR1cm4gR3QoZSwiYWRkQ3VzdG9tTGF5ZXIiLHQpfSxyZW1vdmVDdXN0b21MYXllcihlLHQpe3JldHVybiBHdChlLCJyZW1vdmVDdXN0b21MYXllciIsdCl9LGFkZEdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gR3QoZSwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9LHJlbW92ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gR3QoZSwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9LHVwZGF0ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4gR3QoZSwidXBkYXRlR3JvdW5kT3ZlcmxheSIsdCl9LGluaXRNYXJrZXJDbHVzdGVyKGUsdCl7cmV0dXJuIEd0KGUsImluaXRNYXJrZXJDbHVzdGVyIix0KX0sYWRkTWFya2VycyhlLHQpe3JldHVybiBHdChlLCJhZGRNYXJrZXJzIix0KX0scmVtb3ZlTWFya2VycyhlLHQpe3JldHVybiBHdChlLCJyZW1vdmVNYXJrZXJzIix0KX0sbW92ZUFsb25nKGUsdCl7cmV0dXJuIEd0KGUsIm1vdmVBbG9uZyIsdCl9LHNldExvY01hcmtlckljb24oZSx0KXtyZXR1cm4gR3QoZSwic2V0TG9jTWFya2VySWNvbiIsdCl9LG9wZW5NYXBBcHAoZSx0KXtyZXR1cm4gR3QoZSwib3Blbk1hcEFwcCIsdCl9LG9uKGUsdCl7cmV0dXJuIGUub24odC5uYW1lLHQuY2FsbGJhY2spfX07ZnVuY3Rpb24gdmkoZSx0LG4scixzKXtsZXQgdT1pYSh0KTtpZih1PT1udWxsP3ZvaWQgMDp1LiRwYWdlLm1ldGEuaXNOVnVlKXtsZXQgZz11LiR2bTtyZXR1cm4gR2lbbl0oUm4oZSxnKSxyKX1fdC5pbnZva2VWaWV3TWV0aG9kKCJtYXAuIitlLHt0eXBlOm4sZGF0YTpyfSx0LHMpfWZ1bmN0aW9uIElpKGUpe3JldHVybmBJbnRlcnNlY3Rpb25PYnNlcnZlci4ke2V9YH1mdW5jdGlvbiB0aSh7cmVxSWQ6ZSxjb21wb25lbnQ6dCxvcHRpb25zOm4sY2FsbGJhY2s6cn0scyl7bGV0IHU9SWkoZSk7X3QuaW52b2tlVmlld01ldGhvZCgiYWRkSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTp1fSxzKSxfdC5zdWJzY3JpYmUodSxyKX1mdW5jdGlvbiAkcih7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7X3QuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWR9LG4pLF90LnVuc3Vic2NyaWJlKElpKGUpKX1mdW5jdGlvbiBPcihlKXtyZXR1cm5gTWVkaWFRdWVyeU9ic2VydmVyLiR7ZX1gfWZ1bmN0aW9uIFBpKHtyZXFJZDplLGNvbXBvbmVudDp0LG9wdGlvbnM6bixjYWxsYmFjazpyfSxzKXtsZXQgdT1PcihlKTtfdC5pbnZva2VWaWV3TWV0aG9kKCJhZGRNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTp1fSxzKSxfdC5zdWJzY3JpYmUodSxyKX1mdW5jdGlvbiBFcyh7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7X3QuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlTWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkfSxuKSxfdC51bnN1YnNjcmliZShPcihlKSl9bGV0IGhyPTIwMCxBcj1bInVua25vd24iLCJub25lIiwiZXRoZXJuZXQiLCJ3aWZpIiwiMmciLCIzZyIsIjRnIiwiNWciXSx6cz0iX2RvYy91bmlhcHBfdGVtcCIsbmk9YCR7enN9XyR7RGF0ZS5ub3coKX1gO2Z1bmN0aW9uIFZvKGUpe2xldCB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBZaShlKXtsZXQgdD1lLnNwbGl0KCIuIik7cmV0dXJuIHQubGVuZ3RoPjE/Ii4iK3RbdC5sZW5ndGgtMV06IiJ9bGV0IEVhPSJiYWNrYnV0dG9uIjtmdW5jdGlvbiBMYSgpe08ubmF2aWdhdGVCYWNrKHtmcm9tOiJiYWNrYnV0dG9uIixzdWNjZXNzKCl7fX0pfWxldCBwbz1XdCgpLE5pPVd0KCk7ZnVuY3Rpb24gd3MoKXtyZXR1cm4gSi5leHRlbmQoe30sTmkpfWZ1bmN0aW9uIFVvKCl7cmV0dXJuIEouZXh0ZW5kKHt9LHBvKX1mdW5jdGlvbiBTcyh7cGF0aDplLHF1ZXJ5OnQscmVmZXJyZXJJbmZvOm59KXtKLmV4dGVuZChwbyx7cGF0aDplLHF1ZXJ5OnQ/cmUucGFyc2VRdWVyeSh0KTp7fSxyZWZlcnJlckluZm86bnx8e319KX1mdW5jdGlvbiBaYSh7cGF0aDplLHF1ZXJ5OnQscmVmZXJyZXJJbmZvOm59KXtyZXR1cm4gSi5leHRlbmQoTmkse3BhdGg6ZSxxdWVyeTp0P3JlLnBhcnNlUXVlcnkodCk6e30scmVmZXJyZXJJbmZvOm58fHt9LGNoYW5uZWw6bC5ydW50aW1lLmNoYW5uZWwsbGF1bmNoZXI6bC5ydW50aW1lLmxhdW5jaGVyfSksSi5leHRlbmQocG8sTmkpLEouZXh0ZW5kKHt9LE5pKX1mdW5jdGlvbiBSbCgpe2xldCBlPXYucmVxdWlyZU1vZHVsZSgicGx1cyIpO2lmKGUuZ2V0UmVkaXJlY3RJbmZvKXtsZXR7cGF0aDp0LHF1ZXJ5Om4sZXh0cmFEYXRhOnIsdXNlckFjdGlvbjpzLGZyb21BcHBpZDp1fT1lLmdldFJlZGlyZWN0SW5mbygpfHx7fSxnPXthcHBJZDp1LGV4dHJhRGF0YTp7fX07cmV0dXJuIHImJihnLmV4dHJhRGF0YT1yKSx7cGF0aDp0fHwiIixxdWVyeTpuPyI/IituOiIiLHJlZmVycmVySW5mbzpnLHVzZXJBY3Rpb246c319fXZhciBVZT17fTsoZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFVpbnQ4QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgVWludDE2QXJyYXkhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgSW50MzJBcnJheSE9InVuZGVmaW5lZCI7ZnVuY3Rpb24gbih1LGcpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSxnKX1lLmFzc2lnbj1mdW5jdGlvbih1KXtmb3IodmFyIGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2cubGVuZ3RoOyl7dmFyIEU9Zy5zaGlmdCgpO2lmKCEhRSl7aWYodHlwZW9mIEUhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoRSsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBVIGluIEUpbihFLFUpJiYodVtVXT1FW1VdKX19cmV0dXJuIHV9LGUuc2hyaW5rQnVmPWZ1bmN0aW9uKHUsZyl7cmV0dXJuIHUubGVuZ3RoPT09Zz91OnUuc3ViYXJyYXk/dS5zdWJhcnJheSgwLGcpOih1Lmxlbmd0aD1nLHUpfTt2YXIgcj17YXJyYXlTZXQ6ZnVuY3Rpb24odSxnLEUsVSxQKXtpZihnLnN1YmFycmF5JiZ1LnN1YmFycmF5KXt1LnNldChnLnN1YmFycmF5KEUsRStVKSxQKTtyZXR1cm59Zm9yKHZhciBMPTA7TDxVO0wrKyl1W1ArTF09Z1tFK0xdfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKHUpe3ZhciBnLEUsVSxQLEwsT2U7Zm9yKFU9MCxnPTAsRT11Lmxlbmd0aDtnPEU7ZysrKVUrPXVbZ10ubGVuZ3RoO2ZvcihPZT1uZXcgVWludDhBcnJheShVKSxQPTAsZz0wLEU9dS5sZW5ndGg7ZzxFO2crKylMPXVbZ10sT2Uuc2V0KEwsUCksUCs9TC5sZW5ndGg7cmV0dXJuIE9lfX0scz17YXJyYXlTZXQ6ZnVuY3Rpb24odSxnLEUsVSxQKXtmb3IodmFyIEw9MDtMPFU7TCsrKXVbUCtMXT1nW0UrTF19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24odSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLHUpfX07ZS5zZXRUeXBlZD1mdW5jdGlvbih1KXt1PyhlLkJ1Zjg9VWludDhBcnJheSxlLkJ1ZjE2PVVpbnQxNkFycmF5LGUuQnVmMzI9SW50MzJBcnJheSxlLmFzc2lnbihlLHIpKTooZS5CdWY4PUFycmF5LGUuQnVmMTY9QXJyYXksZS5CdWYzMj1BcnJheSxlLmFzc2lnbihlLHMpKX0sZS5zZXRUeXBlZCh0KX0pKFVlKTt2YXIgZ3Q9e30sdXQ9e30seHQ9e30sWXQ9VWUsV249NCxNbj0wLG5yPTEsd2E9MjtmdW5jdGlvbiBraShlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7LS10Pj0wOyllW3RdPTB9dmFyICRvPTAsV3M9MSxhYz0yLHhsPTMsb2E9MjU4LHZyPTI5LHJpPTI1NixYYT1yaSsxK3ZyLENzPTMwLE9zPTE5LEFzPTIqWGErMSxIbz0xNSxGYT0xNixHbj03LCRuPTI1NixCbD0xNixxaT0xNyxKaT0xOCxUcz1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxJcz1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10samM9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddLEtpPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxtcj01MTIsSHI9bmV3IEFycmF5KChYYSsyKSoyKTtraShIcik7dmFyIFZhPW5ldyBBcnJheShDcyoyKTtraShWYSk7dmFyIEZyPW5ldyBBcnJheShtcik7a2koRnIpO3ZhciBqcj1uZXcgQXJyYXkob2EteGwrMSk7a2koanIpO3ZhciBNbD1uZXcgQXJyYXkodnIpO2tpKE1sKTt2YXIgdWw9bmV3IEFycmF5KENzKTtraSh1bCk7ZnVuY3Rpb24gQm4oZSx0LG4scixzKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1zLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofXZhciBTbixtaSxfaTtmdW5jdGlvbiBhYShlLHQpe3RoaXMuZHluX3RyZWU9ZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9dH1mdW5jdGlvbiBmbChlKXtyZXR1cm4gZTwyNTY/RnJbZV06RnJbMjU2KyhlPj4+NyldfWZ1bmN0aW9uIFVhKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1fWZ1bmN0aW9uIFJpKGUsdCxuKXtlLmJpX3ZhbGlkPkZhLW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LFVhKGUsZS5iaV9idWYpLGUuYmlfYnVmPXQ+PkZhLWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9bi1GYSk6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfWZ1bmN0aW9uIGpvKGUsdCxuKXtSaShlLG5bdCoyXSxuW3QqMisxXSl9ZnVuY3Rpb24gZGwoZSx0KXt2YXIgbj0wO2RvIG58PWUmMSxlPj4+PTEsbjw8PTE7d2hpbGUoLS10PjApO3JldHVybiBuPj4+MX1mdW5jdGlvbiBRYShlKXtlLmJpX3ZhbGlkPT09MTY/KFVhKGUsZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wKTplLmJpX3ZhbGlkPj04JiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYmMjU1LGUuYmlfYnVmPj49OCxlLmJpX3ZhbGlkLT04KX1mdW5jdGlvbiBlcyhlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10Lm1heF9jb2RlLHM9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsdT10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZz10LnN0YXRfZGVzYy5leHRyYV9iaXRzLEU9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxVPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsUCxMLE9lLFBlLFJlLGh0LHB0PTA7Zm9yKFBlPTA7UGU8PUhvO1BlKyspZS5ibF9jb3VudFtQZV09MDtmb3IobltlLmhlYXBbZS5oZWFwX21heF0qMisxXT0wLFA9ZS5oZWFwX21heCsxO1A8QXM7UCsrKUw9ZS5oZWFwW1BdLFBlPW5bbltMKjIrMV0qMisxXSsxLFBlPlUmJihQZT1VLHB0KyspLG5bTCoyKzFdPVBlLCEoTD5yKSYmKGUuYmxfY291bnRbUGVdKyssUmU9MCxMPj1FJiYoUmU9Z1tMLUVdKSxodD1uW0wqMl0sZS5vcHRfbGVuKz1odCooUGUrUmUpLHUmJihlLnN0YXRpY19sZW4rPWh0KihzW0wqMisxXStSZSkpKTtpZihwdCE9PTApe2Rve2ZvcihQZT1VLTE7ZS5ibF9jb3VudFtQZV09PT0wOylQZS0tO2UuYmxfY291bnRbUGVdLS0sZS5ibF9jb3VudFtQZSsxXSs9MixlLmJsX2NvdW50W1VdLS0scHQtPTJ9d2hpbGUocHQ+MCk7Zm9yKFBlPVU7UGUhPT0wO1BlLS0pZm9yKEw9ZS5ibF9jb3VudFtQZV07TCE9PTA7KU9lPWUuaGVhcFstLVBdLCEoT2U+cikmJihuW09lKjIrMV0hPT1QZSYmKGUub3B0X2xlbis9KFBlLW5bT2UqMisxXSkqbltPZSoyXSxuW09lKjIrMV09UGUpLEwtLSl9fWZ1bmN0aW9uIGhsKGUsdCxuKXt2YXIgcj1uZXcgQXJyYXkoSG8rMSkscz0wLHUsZztmb3IodT0xO3U8PUhvO3UrKylyW3VdPXM9cytuW3UtMV08PDE7Zm9yKGc9MDtnPD10O2crKyl7dmFyIEU9ZVtnKjIrMV07RSE9PTAmJihlW2cqMl09ZGwocltFXSsrLEUpKX19ZnVuY3Rpb24gc2MoKXt2YXIgZSx0LG4scixzLHU9bmV3IEFycmF5KEhvKzEpO2ZvcihuPTAscj0wO3I8dnItMTtyKyspZm9yKE1sW3JdPW4sZT0wO2U8MTw8VHNbcl07ZSsrKWpyW24rK109cjtmb3IoanJbbi0xXT1yLHM9MCxyPTA7cjwxNjtyKyspZm9yKHVsW3JdPXMsZT0wO2U8MTw8SXNbcl07ZSsrKUZyW3MrK109cjtmb3Iocz4+PTc7cjxDcztyKyspZm9yKHVsW3JdPXM8PDcsZT0wO2U8MTw8SXNbcl0tNztlKyspRnJbMjU2K3MrK109cjtmb3IodD0wO3Q8PUhvO3QrKyl1W3RdPTA7Zm9yKGU9MDtlPD0xNDM7KUhyW2UqMisxXT04LGUrKyx1WzhdKys7Zm9yKDtlPD0yNTU7KUhyW2UqMisxXT05LGUrKyx1WzldKys7Zm9yKDtlPD0yNzk7KUhyW2UqMisxXT03LGUrKyx1WzddKys7Zm9yKDtlPD0yODc7KUhyW2UqMisxXT04LGUrKyx1WzhdKys7Zm9yKGhsKEhyLFhhKzEsdSksZT0wO2U8Q3M7ZSsrKVZhW2UqMisxXT01LFZhW2UqMl09ZGwoZSw1KTtTbj1uZXcgQm4oSHIsVHMscmkrMSxYYSxIbyksbWk9bmV3IEJuKFZhLElzLDAsQ3MsSG8pLF9pPW5ldyBCbihuZXcgQXJyYXkoMCksamMsMCxPcyxHbil9ZnVuY3Rpb24gcGwoZSl7dmFyIHQ7Zm9yKHQ9MDt0PFhhO3QrKyllLmR5bl9sdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PENzO3QrKyllLmR5bl9kdHJlZVt0KjJdPTA7Zm9yKHQ9MDt0PE9zO3QrKyllLmJsX3RyZWVbdCoyXT0wO2UuZHluX2x0cmVlWyRuKjJdPTEsZS5vcHRfbGVuPWUuc3RhdGljX2xlbj0wLGUubGFzdF9saXQ9ZS5tYXRjaGVzPTB9ZnVuY3Rpb24gRGwoZSl7ZS5iaV92YWxpZD44P1VhKGUsZS5iaV9idWYpOmUuYmlfdmFsaWQ+MCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH1mdW5jdGlvbiBsYyhlLHQsbixyKXtEbChlKSxyJiYoVWEoZSxuKSxVYShlLH5uKSksWXQuYXJyYXlTZXQoZS5wZW5kaW5nX2J1ZixlLndpbmRvdyx0LG4sZS5wZW5kaW5nKSxlLnBlbmRpbmcrPW59ZnVuY3Rpb24gUHMoZSx0LG4scil7dmFyIHM9dCoyLHU9bioyO3JldHVybiBlW3NdPGVbdV18fGVbc109PT1lW3VdJiZyW3RdPD1yW25dfWZ1bmN0aW9uIE5zKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLHM9bjw8MTtzPD1lLmhlYXBfbGVuJiYoczxlLmhlYXBfbGVuJiZQcyh0LGUuaGVhcFtzKzFdLGUuaGVhcFtzXSxlLmRlcHRoKSYmcysrLCFQcyh0LHIsZS5oZWFwW3NdLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFtzXSxuPXMsczw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24gY2MoZSx0LG4pe3ZhciByLHMsdT0wLGcsRTtpZihlLmxhc3RfbGl0IT09MClkbyByPWUucGVuZGluZ19idWZbZS5kX2J1Zit1KjJdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1Zit1KjIrMV0scz1lLnBlbmRpbmdfYnVmW2UubF9idWYrdV0sdSsrLHI9PT0wP2pvKGUscyx0KTooZz1qcltzXSxqbyhlLGcrcmkrMSx0KSxFPVRzW2ddLEUhPT0wJiYocy09TWxbZ10sUmkoZSxzLEUpKSxyLS0sZz1mbChyKSxqbyhlLGcsbiksRT1Jc1tnXSxFIT09MCYmKHItPXVsW2ddLFJpKGUscixFKSkpO3doaWxlKHU8ZS5sYXN0X2xpdCk7am8oZSwkbix0KX1mdW5jdGlvbiB0cyhlLHQpe3ZhciBuPXQuZHluX3RyZWUscj10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxzPXQuc3RhdF9kZXNjLmhhc19zdHJlZSx1PXQuc3RhdF9kZXNjLmVsZW1zLGcsRSxVPS0xLFA7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PUFzLGc9MDtnPHU7ZysrKW5bZyoyXSE9PTA/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPVU9ZyxlLmRlcHRoW2ddPTApOm5bZyoyKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KVA9ZS5oZWFwWysrZS5oZWFwX2xlbl09VTwyPysrVTowLG5bUCoyXT0xLGUuZGVwdGhbUF09MCxlLm9wdF9sZW4tLSxzJiYoZS5zdGF0aWNfbGVuLT1yW1AqMisxXSk7Zm9yKHQubWF4X2NvZGU9VSxnPWUuaGVhcF9sZW4+PjE7Zz49MTtnLS0pTnMoZSxuLGcpO1A9dTtkbyBnPWUuaGVhcFsxXSxlLmhlYXBbMV09ZS5oZWFwW2UuaGVhcF9sZW4tLV0sTnMoZSxuLDEpLEU9ZS5oZWFwWzFdLGUuaGVhcFstLWUuaGVhcF9tYXhdPWcsZS5oZWFwWy0tZS5oZWFwX21heF09RSxuW1AqMl09bltnKjJdK25bRSoyXSxlLmRlcHRoW1BdPShlLmRlcHRoW2ddPj1lLmRlcHRoW0VdP2UuZGVwdGhbZ106ZS5kZXB0aFtFXSkrMSxuW2cqMisxXT1uW0UqMisxXT1QLGUuaGVhcFsxXT1QKyssTnMoZSxuLDEpO3doaWxlKGUuaGVhcF9sZW4+PTIpO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxlcyhlLHQpLGhsKG4sVSxlLmJsX2NvdW50KX1mdW5jdGlvbiBTYShlLHQsbil7dmFyIHIscz0tMSx1LGc9dFswKjIrMV0sRT0wLFU9NyxQPTQ7Zm9yKGc9PT0wJiYoVT0xMzgsUD0zKSx0WyhuKzEpKjIrMV09NjU1MzUscj0wO3I8PW47cisrKXU9ZyxnPXRbKHIrMSkqMisxXSwhKCsrRTxVJiZ1PT09ZykmJihFPFA/ZS5ibF90cmVlW3UqMl0rPUU6dSE9PTA/KHUhPT1zJiZlLmJsX3RyZWVbdSoyXSsrLGUuYmxfdHJlZVtCbCoyXSsrKTpFPD0xMD9lLmJsX3RyZWVbcWkqMl0rKzplLmJsX3RyZWVbSmkqMl0rKyxFPTAscz11LGc9PT0wPyhVPTEzOCxQPTMpOnU9PT1nPyhVPTYsUD0zKTooVT03LFA9NCkpfWZ1bmN0aW9uIGtzKGUsdCxuKXt2YXIgcixzPS0xLHUsZz10WzAqMisxXSxFPTAsVT03LFA9NDtmb3IoZz09PTAmJihVPTEzOCxQPTMpLHI9MDtyPD1uO3IrKylpZih1PWcsZz10WyhyKzEpKjIrMV0sISgrK0U8VSYmdT09PWcpKXtpZihFPFApZG8gam8oZSx1LGUuYmxfdHJlZSk7d2hpbGUoLS1FIT09MCk7ZWxzZSB1IT09MD8odSE9PXMmJihqbyhlLHUsZS5ibF90cmVlKSxFLS0pLGpvKGUsQmwsZS5ibF90cmVlKSxSaShlLEUtMywyKSk6RTw9MTA/KGpvKGUscWksZS5ibF90cmVlKSxSaShlLEUtMywzKSk6KGpvKGUsSmksZS5ibF90cmVlKSxSaShlLEUtMTEsNykpO0U9MCxzPXUsZz09PTA/KFU9MTM4LFA9Myk6dT09PWc/KFU9NixQPTMpOihVPTcsUD00KX19ZnVuY3Rpb24gTGwoZSl7dmFyIHQ7Zm9yKFNhKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLFNhKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLHRzKGUsZS5ibF9kZXNjKSx0PU9zLTE7dD49MyYmZS5ibF90cmVlW0tpW3RdKjIrMV09PT0wO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fWZ1bmN0aW9uIEdzKGUsdCxuLHIpe3ZhciBzO2ZvcihSaShlLHQtMjU3LDUpLFJpKGUsbi0xLDUpLFJpKGUsci00LDQpLHM9MDtzPHI7cysrKVJpKGUsZS5ibF90cmVlW0tpW3NdKjIrMV0sMyk7a3MoZSxlLmR5bl9sdHJlZSx0LTEpLGtzKGUsZS5keW5fZHRyZWUsbi0xKX1mdW5jdGlvbiBnbChlKXt2YXIgdD00MDkzNjI0NDQ3LG47Zm9yKG49MDtuPD0zMTtuKyssdD4+Pj0xKWlmKHQmMSYmZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIE1uO2lmKGUuZHluX2x0cmVlWzkqMl0hPT0wfHxlLmR5bl9sdHJlZVsxMCoyXSE9PTB8fGUuZHluX2x0cmVlWzEzKjJdIT09MClyZXR1cm4gbnI7Zm9yKG49MzI7bjxyaTtuKyspaWYoZS5keW5fbHRyZWVbbioyXSE9PTApcmV0dXJuIG5yO3JldHVybiBNbn12YXIgdWM9ITE7ZnVuY3Rpb24gemMoZSl7dWN8fChzYygpLHVjPSEwKSxlLmxfZGVzYz1uZXcgYWEoZS5keW5fbHRyZWUsU24pLGUuZF9kZXNjPW5ldyBhYShlLmR5bl9kdHJlZSxtaSksZS5ibF9kZXNjPW5ldyBhYShlLmJsX3RyZWUsX2kpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLHBsKGUpfWZ1bmN0aW9uIGZjKGUsdCxuLHIpe1JpKGUsKCRvPDwxKSsocj8xOjApLDMpLGxjKGUsdCxuLCEwKX1mdW5jdGlvbiBXYyhlKXtSaShlLFdzPDwxLDMpLGpvKGUsJG4sSHIpLFFhKGUpfWZ1bmN0aW9uIEdjKGUsdCxuLHIpe3ZhciBzLHUsZz0wO2UubGV2ZWw+MD8oZS5zdHJtLmRhdGFfdHlwZT09PXdhJiYoZS5zdHJtLmRhdGFfdHlwZT1nbChlKSksdHMoZSxlLmxfZGVzYyksdHMoZSxlLmRfZGVzYyksZz1MbChlKSxzPWUub3B0X2xlbiszKzc+Pj4zLHU9ZS5zdGF0aWNfbGVuKzMrNz4+PjMsdTw9cyYmKHM9dSkpOnM9dT1uKzUsbis0PD1zJiZ0IT09LTE/ZmMoZSx0LG4scik6ZS5zdHJhdGVneT09PVdufHx1PT09cz8oUmkoZSwoV3M8PDEpKyhyPzE6MCksMyksY2MoZSxIcixWYSkpOihSaShlLChhYzw8MSkrKHI/MTowKSwzKSxHcyhlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxnKzEpLGNjKGUsZS5keW5fbHRyZWUsZS5keW5fZHRyZWUpKSxwbChlKSxyJiZEbChlKX1mdW5jdGlvbiBkYyhlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjJdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrZS5sYXN0X2xpdCoyKzFdPXQmMjU1LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT1uJjI1NSxlLmxhc3RfbGl0KyssdD09PTA/ZS5keW5fbHRyZWVbbioyXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbKGpyW25dK3JpKzEpKjJdKyssZS5keW5fZHRyZWVbZmwodCkqMl0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX14dC5fdHJfaW5pdD16Yyx4dC5fdHJfc3RvcmVkX2Jsb2NrPWZjLHh0Ll90cl9mbHVzaF9ibG9jaz1HYyx4dC5fdHJfdGFsbHk9ZGMseHQuX3RyX2FsaWduPVdjO2Z1bmN0aW9uIGhjKGUsdCxuLHIpe2Zvcih2YXIgcz1lJjY1NTM1fDAsdT1lPj4+MTYmNjU1MzV8MCxnPTA7biE9PTA7KXtnPW4+MmUzPzJlMzpuLG4tPWc7ZG8gcz1zK3RbcisrXXwwLHU9dStzfDA7d2hpbGUoLS1nKTtzJT02NTUyMSx1JT02NTUyMX1yZXR1cm4gc3x1PDwxNnwwfXZhciBwYz1oYztmdW5jdGlvbiBZYygpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9ZSYxPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fXZhciBxYz1ZYygpO2Z1bmN0aW9uIEZsKGUsdCxuLHIpe3ZhciBzPXFjLHU9cituO2VePS0xO2Zvcih2YXIgZz1yO2c8dTtnKyspZT1lPj4+OF5zWyhlXnRbZ10pJjI1NV07cmV0dXJuIGVeLTF9dmFyIHZsPUZsLFJzPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0saWk9VWUsVG89eHQsVmw9cGMsem89dmwsbWw9UnMsbnM9MCxKYz0xLFlzPTMsc2E9NCxxcz01LFdvPTAsSnM9MSxaaT0tMixnYz0tMyxVbD0tNSxLYz0tMSx2Yz0xLEtzPTIsbWM9MyxfYz00LGJjPTAsJGw9Mixacz04LHljPTksWmM9MTUsWGM9OCxRYz0yOSxIbD0yNTYsX2w9SGwrMStRYywkYT0zMCxYcz0xOSxqbD0yKl9sKzEsRWM9MTUscG49Myx4aT0yNTgsSW89eGkrcG4rMSx3Yz0zMixibD00MixRcz02OSx5bD03MyxQbz05MSxsYT0xMDMsSGE9MTEzLGVsPTY2Nixwcj0xLHhzPTIsamE9Myxycz00LFNjPTM7ZnVuY3Rpb24gQ2EoZSx0KXtyZXR1cm4gZS5tc2c9bWxbdF0sdH1mdW5jdGlvbiBFbChlKXtyZXR1cm4oZTw8MSktKGU+ND85OjApfWZ1bmN0aW9uIGNhKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH1mdW5jdGlvbiB6YShlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSxuIT09MCYmKGlpLmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxuLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPW4sdC5wZW5kaW5nX291dCs9bixlLnRvdGFsX291dCs9bixlLmF2YWlsX291dC09bix0LnBlbmRpbmctPW4sdC5wZW5kaW5nPT09MCYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIG9pKGUsdCl7VG8uX3RyX2ZsdXNoX2Jsb2NrKGUsZS5ibG9ja19zdGFydD49MD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsemEoZS5zdHJtKX1mdW5jdGlvbiBvKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dH1mdW5jdGlvbiBjKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQmMjU1fWZ1bmN0aW9uIGgoZSx0LG4scil7dmFyIHM9ZS5hdmFpbF9pbjtyZXR1cm4gcz5yJiYocz1yKSxzPT09MD8wOihlLmF2YWlsX2luLT1zLGlpLmFycmF5U2V0KHQsZS5pbnB1dCxlLm5leHRfaW4scyxuKSxlLnN0YXRlLndyYXA9PT0xP2UuYWRsZXI9VmwoZS5hZGxlcix0LHMsbik6ZS5zdGF0ZS53cmFwPT09MiYmKGUuYWRsZXI9em8oZS5hZGxlcix0LHMsbikpLGUubmV4dF9pbis9cyxlLnRvdGFsX2luKz1zLHMpfWZ1bmN0aW9uIF8oZSx0KXt2YXIgbj1lLm1heF9jaGFpbl9sZW5ndGgscj1lLnN0cnN0YXJ0LHMsdSxnPWUucHJldl9sZW5ndGgsRT1lLm5pY2VfbWF0Y2gsVT1lLnN0cnN0YXJ0PmUud19zaXplLUlvP2Uuc3Ryc3RhcnQtKGUud19zaXplLUlvKTowLFA9ZS53aW5kb3csTD1lLndfbWFzayxPZT1lLnByZXYsUGU9ZS5zdHJzdGFydCt4aSxSZT1QW3IrZy0xXSxodD1QW3IrZ107ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYobj4+PTIpLEU+ZS5sb29rYWhlYWQmJihFPWUubG9va2FoZWFkKTtkbyBpZihzPXQsIShQW3MrZ10hPT1odHx8UFtzK2ctMV0hPT1SZXx8UFtzXSE9PVBbcl18fFBbKytzXSE9PVBbcisxXSkpe3IrPTIscysrO2RvO3doaWxlKFBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZyPFBlKTtpZih1PXhpLShQZS1yKSxyPVBlLXhpLHU+Zyl7aWYoZS5tYXRjaF9zdGFydD10LGc9dSx1Pj1FKWJyZWFrO1JlPVBbcitnLTFdLGh0PVBbcitnXX19d2hpbGUoKHQ9T2VbdCZMXSk+VSYmLS1uIT09MCk7cmV0dXJuIGc8PWUubG9va2FoZWFkP2c6ZS5sb29rYWhlYWR9ZnVuY3Rpb24gSShlKXt2YXIgdD1lLndfc2l6ZSxuLHIscyx1LGc7ZG97aWYodT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49dCsodC1Jbykpe2lpLmFycmF5U2V0KGUud2luZG93LGUud2luZG93LHQsdCwwKSxlLm1hdGNoX3N0YXJ0LT10LGUuc3Ryc3RhcnQtPXQsZS5ibG9ja19zdGFydC09dCxyPWUuaGFzaF9zaXplLG49cjtkbyBzPWUuaGVhZFstLW5dLGUuaGVhZFtuXT1zPj10P3MtdDowO3doaWxlKC0tcik7cj10LG49cjtkbyBzPWUucHJldlstLW5dLGUucHJldltuXT1zPj10P3MtdDowO3doaWxlKC0tcik7dSs9dH1pZihlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHI9aChlLnN0cm0sZS53aW5kb3csZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1KSxlLmxvb2thaGVhZCs9cixlLmxvb2thaGVhZCtlLmluc2VydD49cG4pZm9yKGc9ZS5zdHJzdGFydC1lLmluc2VydCxlLmluc19oPWUud2luZG93W2ddLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tnKzFdKSZlLmhhc2hfbWFzaztlLmluc2VydCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tnK3BuLTFdKSZlLmhhc2hfbWFzayxlLnByZXZbZyZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1nLGcrKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8cG4pKTspO313aGlsZShlLmxvb2thaGVhZDxJbyYmZS5zdHJtLmF2YWlsX2luIT09MCl9ZnVuY3Rpb24gQShlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKEkoZSksZS5sb29rYWhlYWQ9PT0wJiZ0PT09bnMpcmV0dXJuIHByO2lmKGUubG9va2FoZWFkPT09MClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciByPWUuYmxvY2tfc3RhcnQrbjtpZigoZS5zdHJzdGFydD09PTB8fGUuc3Ryc3RhcnQ+PXIpJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1yLGUuc3Ryc3RhcnQ9cixvaShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCl8fGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydD49ZS53X3NpemUtSW8mJihvaShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHByfXJldHVybiBlLmluc2VydD0wLHQ9PT1zYT8ob2koZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/amE6cnMpOihlLnN0cnN0YXJ0PmUuYmxvY2tfc3RhcnQmJihvaShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkscHIpfWZ1bmN0aW9uIHgoZSx0KXtmb3IodmFyIG4scjs7KXtpZihlLmxvb2thaGVhZDxJbyl7aWYoSShlKSxlLmxvb2thaGVhZDxJbyYmdD09PW5zKXJldHVybiBwcjtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1wbiYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K3BuLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLG4hPT0wJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUlvJiYoZS5tYXRjaF9sZW5ndGg9XyhlLG4pKSxlLm1hdGNoX2xlbmd0aD49cG4paWYocj1Uby5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtcG4pLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PXBuKXtlLm1hdGNoX2xlbmd0aC0tO2RvIGUuc3Ryc3RhcnQrKyxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtwbi0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0O3doaWxlKC0tZS5tYXRjaF9sZW5ndGghPT0wKTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrMV0pJmUuaGFzaF9tYXNrO2Vsc2Ugcj1Uby5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKztpZihyJiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwcn1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDxwbi0xP2Uuc3Ryc3RhcnQ6cG4tMSx0PT09c2E/KG9pKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP2phOnJzKTplLmxhc3RfbGl0JiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3ByOnhzfWZ1bmN0aW9uIHooZSx0KXtmb3IodmFyIG4scixzOzspe2lmKGUubG9va2FoZWFkPElvKXtpZihJKGUpLGUubG9va2FoZWFkPElvJiZ0PT09bnMpcmV0dXJuIHByO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PXBuJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrcG4tMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD1wbi0xLG4hPT0wJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtSW8mJihlLm1hdGNoX2xlbmd0aD1fKGUsbiksZS5tYXRjaF9sZW5ndGg8PTUmJihlLnN0cmF0ZWd5PT09dmN8fGUubWF0Y2hfbGVuZ3RoPT09cG4mJmUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydD40MDk2KSYmKGUubWF0Y2hfbGVuZ3RoPXBuLTEpKSxlLnByZXZfbGVuZ3RoPj1wbiYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe3M9ZS5zdHJzdGFydCtlLmxvb2thaGVhZC1wbixyPVRvLl90cl90YWxseShlLGUuc3Ryc3RhcnQtMS1lLnByZXZfbWF0Y2gsZS5wcmV2X2xlbmd0aC1wbiksZS5sb29rYWhlYWQtPWUucHJldl9sZW5ndGgtMSxlLnByZXZfbGVuZ3RoLT0yO2RvKytlLnN0cnN0YXJ0PD1zJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrcG4tMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCk7d2hpbGUoLS1lLnByZXZfbGVuZ3RoIT09MCk7aWYoZS5tYXRjaF9hdmFpbGFibGU9MCxlLm1hdGNoX2xlbmd0aD1wbi0xLGUuc3Ryc3RhcnQrKyxyJiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwcn1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZihyPVRvLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksciYmb2koZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sZS5zdHJtLmF2YWlsX291dD09PTApcmV0dXJuIHByfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPVRvLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxwbi0xP2Uuc3Ryc3RhcnQ6cG4tMSx0PT09c2E/KG9pKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP2phOnJzKTplLmxhc3RfbGl0JiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3ByOnhzfWZ1bmN0aW9uICQoZSx0KXtmb3IodmFyIG4scixzLHUsZz1lLndpbmRvdzs7KXtpZihlLmxvb2thaGVhZDw9eGkpe2lmKEkoZSksZS5sb29rYWhlYWQ8PXhpJiZ0PT09bnMpcmV0dXJuIHByO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1wbiYmZS5zdHJzdGFydD4wJiYocz1lLnN0cnN0YXJ0LTEscj1nW3NdLHI9PT1nWysrc10mJnI9PT1nWysrc10mJnI9PT1nWysrc10pKXt1PWUuc3Ryc3RhcnQreGk7ZG87d2hpbGUocj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmcj09PWdbKytzXSYmczx1KTtlLm1hdGNoX2xlbmd0aD14aS0odS1zKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49cG4/KG49VG8uX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1wbiksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPVRvLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBwcn1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09c2E/KG9pKGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP2phOnJzKTplLmxhc3RfbGl0JiYob2koZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP3ByOnhzfWZ1bmN0aW9uIGVlKGUsdCl7Zm9yKHZhciBuOzspe2lmKGUubG9va2FoZWFkPT09MCYmKEkoZSksZS5sb29rYWhlYWQ9PT0wKSl7aWYodD09PW5zKXJldHVybiBwcjticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49VG8uX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssbiYmKG9pKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gcHJ9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PXNhPyhvaShlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9qYTpycyk6ZS5sYXN0X2xpdCYmKG9pKGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9wcjp4c31mdW5jdGlvbiBJZShlLHQsbixyLHMpe3RoaXMuZ29vZF9sZW5ndGg9ZSx0aGlzLm1heF9sYXp5PXQsdGhpcy5uaWNlX2xlbmd0aD1uLHRoaXMubWF4X2NoYWluPXIsdGhpcy5mdW5jPXN9dmFyIGRlO2RlPVtuZXcgSWUoMCwwLDAsMCxBKSxuZXcgSWUoNCw0LDgsNCx4KSxuZXcgSWUoNCw1LDE2LDgseCksbmV3IEllKDQsNiwzMiwzMix4KSxuZXcgSWUoNCw0LDE2LDE2LHopLG5ldyBJZSg4LDE2LDMyLDMyLHopLG5ldyBJZSg4LDE2LDEyOCwxMjgseiksbmV3IEllKDgsMzIsMTI4LDI1Nix6KSxuZXcgSWUoMzIsMTI4LDI1OCwxMDI0LHopLG5ldyBJZSgzMiwyNTgsMjU4LDQwOTYseildO2Z1bmN0aW9uIHVlKGUpe2Uud2luZG93X3NpemU9MiplLndfc2l6ZSxjYShlLmhlYWQpLGUubWF4X2xhenlfbWF0Y2g9ZGVbZS5sZXZlbF0ubWF4X2xhenksZS5nb29kX21hdGNoPWRlW2UubGV2ZWxdLmdvb2RfbGVuZ3RoLGUubmljZV9tYXRjaD1kZVtlLmxldmVsXS5uaWNlX2xlbmd0aCxlLm1heF9jaGFpbl9sZW5ndGg9ZGVbZS5sZXZlbF0ubWF4X2NoYWluLGUuc3Ryc3RhcnQ9MCxlLmJsb2NrX3N0YXJ0PTAsZS5sb29rYWhlYWQ9MCxlLmluc2VydD0wLGUubWF0Y2hfbGVuZ3RoPWUucHJldl9sZW5ndGg9cG4tMSxlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MH1mdW5jdGlvbiBIZSgpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPVpzLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBpaS5CdWYxNihqbCoyKSx0aGlzLmR5bl9kdHJlZT1uZXcgaWkuQnVmMTYoKDIqJGErMSkqMiksdGhpcy5ibF90cmVlPW5ldyBpaS5CdWYxNigoMipYcysxKSoyKSxjYSh0aGlzLmR5bl9sdHJlZSksY2EodGhpcy5keW5fZHRyZWUpLGNhKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IGlpLkJ1ZjE2KEVjKzEpLHRoaXMuaGVhcD1uZXcgaWkuQnVmMTYoMipfbCsxKSxjYSh0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgaWkuQnVmMTYoMipfbCsxKSxjYSh0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBaZShlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/Q2EoZSxaaSk6KGUudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT0kbCx0PWUuc3RhdGUsdC5wZW5kaW5nPTAsdC5wZW5kaW5nX291dD0wLHQud3JhcDwwJiYodC53cmFwPS10LndyYXApLHQuc3RhdHVzPXQud3JhcD9ibDpIYSxlLmFkbGVyPXQud3JhcD09PTI/MDoxLHQubGFzdF9mbHVzaD1ucyxUby5fdHJfaW5pdCh0KSxXbyl9ZnVuY3Rpb24gdnQoZSl7dmFyIHQ9WmUoZSk7cmV0dXJuIHQ9PT1XbyYmdWUoZS5zdGF0ZSksdH1mdW5jdGlvbiB5dChlLHQpe3JldHVybiFlfHwhZS5zdGF0ZXx8ZS5zdGF0ZS53cmFwIT09Mj9aaTooZS5zdGF0ZS5nemhlYWQ9dCxXbyl9ZnVuY3Rpb24gTmUoZSx0LG4scixzLHUpe2lmKCFlKXJldHVybiBaaTt2YXIgZz0xO2lmKHQ9PT1LYyYmKHQ9NikscjwwPyhnPTAscj0tcik6cj4xNSYmKGc9MixyLT0xNiksczwxfHxzPnljfHxuIT09WnN8fHI8OHx8cj4xNXx8dDwwfHx0Pjl8fHU8MHx8dT5fYylyZXR1cm4gQ2EoZSxaaSk7cj09PTgmJihyPTkpO3ZhciBFPW5ldyBIZTtyZXR1cm4gZS5zdGF0ZT1FLEUuc3RybT1lLEUud3JhcD1nLEUuZ3poZWFkPW51bGwsRS53X2JpdHM9cixFLndfc2l6ZT0xPDxFLndfYml0cyxFLndfbWFzaz1FLndfc2l6ZS0xLEUuaGFzaF9iaXRzPXMrNyxFLmhhc2hfc2l6ZT0xPDxFLmhhc2hfYml0cyxFLmhhc2hfbWFzaz1FLmhhc2hfc2l6ZS0xLEUuaGFzaF9zaGlmdD1+figoRS5oYXNoX2JpdHMrcG4tMSkvcG4pLEUud2luZG93PW5ldyBpaS5CdWY4KEUud19zaXplKjIpLEUuaGVhZD1uZXcgaWkuQnVmMTYoRS5oYXNoX3NpemUpLEUucHJldj1uZXcgaWkuQnVmMTYoRS53X3NpemUpLEUubGl0X2J1ZnNpemU9MTw8cys2LEUucGVuZGluZ19idWZfc2l6ZT1FLmxpdF9idWZzaXplKjQsRS5wZW5kaW5nX2J1Zj1uZXcgaWkuQnVmOChFLnBlbmRpbmdfYnVmX3NpemUpLEUuZF9idWY9MSpFLmxpdF9idWZzaXplLEUubF9idWY9KDErMikqRS5saXRfYnVmc2l6ZSxFLmxldmVsPXQsRS5zdHJhdGVneT11LEUubWV0aG9kPW4sdnQoZSl9ZnVuY3Rpb24gX2UoZSx0KXtyZXR1cm4gTmUoZSx0LFpzLFpjLFhjLGJjKX1mdW5jdGlvbiBNZShlLHQpe3ZhciBuLHIscyx1O2lmKCFlfHwhZS5zdGF0ZXx8dD5xc3x8dDwwKXJldHVybiBlP0NhKGUsWmkpOlppO2lmKHI9ZS5zdGF0ZSwhZS5vdXRwdXR8fCFlLmlucHV0JiZlLmF2YWlsX2luIT09MHx8ci5zdGF0dXM9PT1lbCYmdCE9PXNhKXJldHVybiBDYShlLGUuYXZhaWxfb3V0PT09MD9VbDpaaSk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1ibClpZihyLndyYXA9PT0yKWUuYWRsZXI9MCxvKHIsMzEpLG8ociwxMzkpLG8ociw4KSxyLmd6aGVhZD8obyhyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxvKHIsci5nemhlYWQudGltZSYyNTUpLG8ocixyLmd6aGVhZC50aW1lPj44JjI1NSksbyhyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksbyhyLHIuZ3poZWFkLnRpbWU+PjI0JjI1NSksbyhyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49S3N8fHIubGV2ZWw8Mj80OjApLG8ocixyLmd6aGVhZC5vcyYyNTUpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihvKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoJjI1NSksbyhyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxyLmd6aGVhZC5oY3JjJiYoZS5hZGxlcj16byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLDApKSxyLmd6aW5kZXg9MCxyLnN0YXR1cz1Rcyk6KG8ociwwKSxvKHIsMCksbyhyLDApLG8ociwwKSxvKHIsMCksbyhyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49S3N8fHIubGV2ZWw8Mj80OjApLG8ocixTYyksci5zdGF0dXM9SGEpO2Vsc2V7dmFyIGc9WnMrKHIud19iaXRzLTg8PDQpPDw4LEU9LTE7ci5zdHJhdGVneT49S3N8fHIubGV2ZWw8Mj9FPTA6ci5sZXZlbDw2P0U9MTpyLmxldmVsPT09Nj9FPTI6RT0zLGd8PUU8PDYsci5zdHJzdGFydCE9PTAmJihnfD13YyksZys9MzEtZyUzMSxyLnN0YXR1cz1IYSxjKHIsZyksci5zdHJzdGFydCE9PTAmJihjKHIsZS5hZGxlcj4+PjE2KSxjKHIsZS5hZGxlciY2NTUzNSkpLGUuYWRsZXI9MX1pZihyLnN0YXR1cz09PVFzKWlmKHIuZ3poZWFkLmV4dHJhKXtmb3Iocz1yLnBlbmRpbmc7ci5nemluZGV4PChyLmd6aGVhZC5leHRyYS5sZW5ndGgmNjU1MzUpJiYhKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj16byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLHphKGUpLHM9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpOylvKHIsci5nemhlYWQuZXh0cmFbci5nemluZGV4XSYyNTUpLHIuZ3ppbmRleCsrO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj16byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLHIuZ3ppbmRleD09PXIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPXlsKX1lbHNlIHIuc3RhdHVzPXlsO2lmKHIuc3RhdHVzPT09eWwpaWYoci5nemhlYWQubmFtZSl7cz1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPXpvKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksemEoZSkscz1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7dT0xO2JyZWFrfXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD91PXIuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChyLmd6aW5kZXgrKykmMjU1OnU9MCxvKHIsdSl9d2hpbGUodSE9PTApO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj16byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLHU9PT0wJiYoci5nemluZGV4PTAsci5zdGF0dXM9UG8pfWVsc2Ugci5zdGF0dXM9UG87aWYoci5zdGF0dXM9PT1QbylpZihyLmd6aGVhZC5jb21tZW50KXtzPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+cyYmKGUuYWRsZXI9em8oZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1zLHMpKSx6YShlKSxzPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXt1PTE7YnJlYWt9ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoP3U9ci5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKSYyNTU6dT0wLG8ocix1KX13aGlsZSh1IT09MCk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPXpvKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksdT09PTAmJihyLnN0YXR1cz1sYSl9ZWxzZSByLnN0YXR1cz1sYTtpZihyLnN0YXR1cz09PWxhJiYoci5nemhlYWQuaGNyYz8oci5wZW5kaW5nKzI+ci5wZW5kaW5nX2J1Zl9zaXplJiZ6YShlKSxyLnBlbmRpbmcrMjw9ci5wZW5kaW5nX2J1Zl9zaXplJiYobyhyLGUuYWRsZXImMjU1KSxvKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz1IYSkpOnIuc3RhdHVzPUhhKSxyLnBlbmRpbmchPT0wKXtpZih6YShlKSxlLmF2YWlsX291dD09PTApcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxXb31lbHNlIGlmKGUuYXZhaWxfaW49PT0wJiZFbCh0KTw9RWwobikmJnQhPT1zYSlyZXR1cm4gQ2EoZSxVbCk7aWYoci5zdGF0dXM9PT1lbCYmZS5hdmFpbF9pbiE9PTApcmV0dXJuIENhKGUsVWwpO2lmKGUuYXZhaWxfaW4hPT0wfHxyLmxvb2thaGVhZCE9PTB8fHQhPT1ucyYmci5zdGF0dXMhPT1lbCl7dmFyIFU9ci5zdHJhdGVneT09PUtzP2VlKHIsdCk6ci5zdHJhdGVneT09PW1jPyQocix0KTpkZVtyLmxldmVsXS5mdW5jKHIsdCk7aWYoKFU9PT1qYXx8VT09PXJzKSYmKHIuc3RhdHVzPWVsKSxVPT09cHJ8fFU9PT1qYSlyZXR1cm4gZS5hdmFpbF9vdXQ9PT0wJiYoci5sYXN0X2ZsdXNoPS0xKSxXbztpZihVPT09eHMmJih0PT09SmM/VG8uX3RyX2FsaWduKHIpOnQhPT1xcyYmKFRvLl90cl9zdG9yZWRfYmxvY2sociwwLDAsITEpLHQ9PT1ZcyYmKGNhKHIuaGVhZCksci5sb29rYWhlYWQ9PT0wJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLHphKGUpLGUuYXZhaWxfb3V0PT09MCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxXb31yZXR1cm4gdCE9PXNhP1dvOnIud3JhcDw9MD9Kczooci53cmFwPT09Mj8obyhyLGUuYWRsZXImMjU1KSxvKHIsZS5hZGxlcj4+OCYyNTUpLG8ocixlLmFkbGVyPj4xNiYyNTUpLG8ocixlLmFkbGVyPj4yNCYyNTUpLG8ocixlLnRvdGFsX2luJjI1NSksbyhyLGUudG90YWxfaW4+PjgmMjU1KSxvKHIsZS50b3RhbF9pbj4+MTYmMjU1KSxvKHIsZS50b3RhbF9pbj4+MjQmMjU1KSk6KGMocixlLmFkbGVyPj4+MTYpLGMocixlLmFkbGVyJjY1NTM1KSksemEoZSksci53cmFwPjAmJihyLndyYXA9LXIud3JhcCksci5wZW5kaW5nIT09MD9XbzpKcyl9ZnVuY3Rpb24gbnQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP1ppOih0PWUuc3RhdGUuc3RhdHVzLHQhPT1ibCYmdCE9PVFzJiZ0IT09eWwmJnQhPT1QbyYmdCE9PWxhJiZ0IT09SGEmJnQhPT1lbD9DYShlLFppKTooZS5zdGF0ZT1udWxsLHQ9PT1IYT9DYShlLGdjKTpXbykpfWZ1bmN0aW9uIHFlKGUsdCl7dmFyIG49dC5sZW5ndGgscixzLHUsZyxFLFUsUCxMO2lmKCFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSxnPXIud3JhcCxnPT09Mnx8Zz09PTEmJnIuc3RhdHVzIT09Ymx8fHIubG9va2FoZWFkKSlyZXR1cm4gWmk7Zm9yKGc9PT0xJiYoZS5hZGxlcj1WbChlLmFkbGVyLHQsbiwwKSksci53cmFwPTAsbj49ci53X3NpemUmJihnPT09MCYmKGNhKHIuaGVhZCksci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSxMPW5ldyBpaS5CdWY4KHIud19zaXplKSxpaS5hcnJheVNldChMLHQsbi1yLndfc2l6ZSxyLndfc2l6ZSwwKSx0PUwsbj1yLndfc2l6ZSksRT1lLmF2YWlsX2luLFU9ZS5uZXh0X2luLFA9ZS5pbnB1dCxlLmF2YWlsX2luPW4sZS5uZXh0X2luPTAsZS5pbnB1dD10LEkocik7ci5sb29rYWhlYWQ+PXBuOyl7cz1yLnN0cnN0YXJ0LHU9ci5sb29rYWhlYWQtKHBuLTEpO2RvIHIuaW5zX2g9KHIuaW5zX2g8PHIuaGFzaF9zaGlmdF5yLndpbmRvd1tzK3BuLTFdKSZyLmhhc2hfbWFzayxyLnByZXZbcyZyLndfbWFza109ci5oZWFkW3IuaW5zX2hdLHIuaGVhZFtyLmluc19oXT1zLHMrKzt3aGlsZSgtLXUpO3Iuc3Ryc3RhcnQ9cyxyLmxvb2thaGVhZD1wbi0xLEkocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9cG4tMSxyLm1hdGNoX2F2YWlsYWJsZT0wLGUubmV4dF9pbj1VLGUuaW5wdXQ9UCxlLmF2YWlsX2luPUUsci53cmFwPWcsV299dXQuZGVmbGF0ZUluaXQ9X2UsdXQuZGVmbGF0ZUluaXQyPU5lLHV0LmRlZmxhdGVSZXNldD12dCx1dC5kZWZsYXRlUmVzZXRLZWVwPVplLHV0LmRlZmxhdGVTZXRIZWFkZXI9eXQsdXQuZGVmbGF0ZT1NZSx1dC5kZWZsYXRlRW5kPW50LHV0LmRlZmxhdGVTZXREaWN0aW9uYXJ5PXFlLHV0LmRlZmxhdGVJbmZvPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIjt2YXIgYXQ9e30sSXQ9VWUsc3Q9ITAsaT0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7c3Q9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7aT0hMX1mb3IodmFyIGE9bmV3IEl0LkJ1ZjgoMjU2KSxmPTA7ZjwyNTY7ZisrKWFbZl09Zj49MjUyPzY6Zj49MjQ4PzU6Zj49MjQwPzQ6Zj49MjI0PzM6Zj49MTkyPzI6MTthWzI1NF09YVsyNTRdPTEsYXQuc3RyaW5nMmJ1Zj1mdW5jdGlvbihlKXt2YXIgdCxuLHIscyx1LGc9ZS5sZW5ndGgsRT0wO2ZvcihzPTA7czxnO3MrKyluPWUuY2hhckNvZGVBdChzKSwobiY2NDUxMik9PT01NTI5NiYmcysxPGcmJihyPWUuY2hhckNvZGVBdChzKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxzKyspKSxFKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBJdC5CdWY4KEUpLHU9MCxzPTA7dTxFO3MrKyluPWUuY2hhckNvZGVBdChzKSwobiY2NDUxMik9PT01NTI5NiYmcysxPGcmJihyPWUuY2hhckNvZGVBdChzKzEpLChyJjY0NTEyKT09PTU2MzIwJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxzKyspKSxuPDEyOD90W3UrK109bjpuPDIwNDg/KHRbdSsrXT0xOTJ8bj4+PjYsdFt1KytdPTEyOHxuJjYzKTpuPDY1NTM2Pyh0W3UrK109MjI0fG4+Pj4xMix0W3UrK109MTI4fG4+Pj42JjYzLHRbdSsrXT0xMjh8biY2Myk6KHRbdSsrXT0yNDB8bj4+PjE4LHRbdSsrXT0xMjh8bj4+PjEyJjYzLHRbdSsrXT0xMjh8bj4+PjYmNjMsdFt1KytdPTEyOHxuJjYzKTtyZXR1cm4gdH07ZnVuY3Rpb24gcChlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZpfHwhZS5zdWJhcnJheSYmc3QpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsSXQuc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgbj0iIixyPTA7cjx0O3IrKyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBufWF0LmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSxlLmxlbmd0aCl9LGF0LmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyBJdC5CdWY4KGUubGVuZ3RoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fSxhdC5idWYyc3RyaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLHUsZz10fHxlLmxlbmd0aCxFPW5ldyBBcnJheShnKjIpO2ZvcihyPTAsbj0wO248Zzspe2lmKHM9ZVtuKytdLHM8MTI4KXtFW3IrK109cztjb250aW51ZX1pZih1PWFbc10sdT40KXtFW3IrK109NjU1MzMsbis9dS0xO2NvbnRpbnVlfWZvcihzJj11PT09Mj8zMTp1PT09Mz8xNTo3O3U+MSYmbjxnOylzPXM8PDZ8ZVtuKytdJjYzLHUtLTtpZih1PjEpe0VbcisrXT02NTUzMztjb250aW51ZX1zPDY1NTM2P0VbcisrXT1zOihzLT02NTUzNixFW3IrK109NTUyOTZ8cz4+MTAmMTAyMyxFW3IrK109NTYzMjB8cyYxMDIzKX1yZXR1cm4gcChFLHIpfSxhdC51dGY4Ym9yZGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHQ9dHx8ZS5sZW5ndGgsdD5lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLG49dC0xO24+PTAmJihlW25dJjE5Mik9PT0xMjg7KW4tLTtyZXR1cm4gbjwwfHxuPT09MD90Om4rYVtlW25dXT50P246dH07ZnVuY3Rpb24gUygpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9dmFyIHc9UyxOPXV0LFY9VWUsRj1hdCxxPVJzLGJlPXcsYWU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuZT0wLEFlPTQsRGU9MCxYZT0xLGZ0PTIsVGU9LTEsc2U9MCxFZT04O2Z1bmN0aW9uIExlKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIExlKSlyZXR1cm4gbmV3IExlKGUpO3RoaXMub3B0aW9ucz1WLmFzc2lnbih7bGV2ZWw6VGUsbWV0aG9kOkVlLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6c2UsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJnQud2luZG93Qml0cz4wP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmdC53aW5kb3dCaXRzPjAmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IGJlLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj1OLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09RGUpdGhyb3cgbmV3IEVycm9yKHFbbl0pO2lmKHQuaGVhZGVyJiZOLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHR5cGVvZiB0LmRpY3Rpb25hcnk9PSJzdHJpbmciP3I9Ri5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6YWUuY2FsbCh0LmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9yPW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSk6cj10LmRpY3Rpb25hcnksbj1OLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxyKSxuIT09RGUpdGhyb3cgbmV3IEVycm9yKHFbbl0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1MZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemUscyx1O2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7dT10PT09fn50P3Q6dD09PSEwP0FlOm5lLHR5cGVvZiBlPT0ic3RyaW5nIj9uLmlucHV0PUYuc3RyaW5nMmJ1ZihlKTphZS5jYWxsKGUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOm4uaW5wdXQ9ZSxuLm5leHRfaW49MCxuLmF2YWlsX2luPW4uaW5wdXQubGVuZ3RoO2Rve2lmKG4uYXZhaWxfb3V0PT09MCYmKG4ub3V0cHV0PW5ldyBWLkJ1Zjgociksbi5uZXh0X291dD0wLG4uYXZhaWxfb3V0PXIpLHM9Ti5kZWZsYXRlKG4sdSkscyE9PVhlJiZzIT09RGUpcmV0dXJuIHRoaXMub25FbmQocyksdGhpcy5lbmRlZD0hMCwhMTsobi5hdmFpbF9vdXQ9PT0wfHxuLmF2YWlsX2luPT09MCYmKHU9PT1BZXx8dT09PWZ0KSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLm9uRGF0YShGLmJ1ZjJiaW5zdHJpbmcoVi5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShWLnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJnMhPT1YZSk7cmV0dXJuIHU9PT1BZT8ocz1OLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKHMpLHRoaXMuZW5kZWQ9ITAscz09PURlKToodT09PWZ0JiYodGhpcy5vbkVuZChEZSksbi5hdmFpbF9vdXQ9MCksITApfSxMZS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LExlLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09RGUmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1WLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O2Z1bmN0aW9uIEZlKGUsdCl7dmFyIG49bmV3IExlKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8cVtuLmVycl07cmV0dXJuIG4ucmVzdWx0fWZ1bmN0aW9uIGl0KGUsdCl7cmV0dXJuIHQ9dHx8e30sdC5yYXc9ITAsRmUoZSx0KX1mdW5jdGlvbiBUdChlLHQpe3JldHVybiB0PXR8fHt9LHQuZ3ppcD0hMCxGZShlLHQpfWd0LkRlZmxhdGU9TGUsZ3QuZGVmbGF0ZT1GZSxndC5kZWZsYXRlUmF3PWl0LGd0Lmd6aXA9VHQ7dmFyIFFlPXt9LEI9e30saj0zMCxpZT0xMix5ZT1mdW5jdGlvbih0LG4pe3ZhciByLHMsdSxnLEUsVSxQLEwsT2UsUGUsUmUsaHQscHQsa3QsUnQsZG4sbG4sanQsd3Qsdm4sb24sWHQsSW4seXIsUXQ7cj10LnN0YXRlLHM9dC5uZXh0X2luLHlyPXQuaW5wdXQsdT1zKyh0LmF2YWlsX2luLTUpLGc9dC5uZXh0X291dCxRdD10Lm91dHB1dCxFPWctKG4tdC5hdmFpbF9vdXQpLFU9ZysodC5hdmFpbF9vdXQtMjU3KSxQPXIuZG1heCxMPXIud3NpemUsT2U9ci53aGF2ZSxQZT1yLnduZXh0LFJlPXIud2luZG93LGh0PXIuaG9sZCxwdD1yLmJpdHMsa3Q9ci5sZW5jb2RlLFJ0PXIuZGlzdGNvZGUsZG49KDE8PHIubGVuYml0cyktMSxsbj0oMTw8ci5kaXN0Yml0cyktMTtlOmRve3B0PDE1JiYoaHQrPXlyW3MrK108PHB0LHB0Kz04LGh0Kz15cltzKytdPDxwdCxwdCs9OCksanQ9a3RbaHQmZG5dO3Q6Zm9yKDs7KXtpZih3dD1qdD4+PjI0LGh0Pj4+PXd0LHB0LT13dCx3dD1qdD4+PjE2JjI1NSx3dD09PTApUXRbZysrXT1qdCY2NTUzNTtlbHNlIGlmKHd0JjE2KXt2bj1qdCY2NTUzNSx3dCY9MTUsd3QmJihwdDx3dCYmKGh0Kz15cltzKytdPDxwdCxwdCs9OCksdm4rPWh0JigxPDx3dCktMSxodD4+Pj13dCxwdC09d3QpLHB0PDE1JiYoaHQrPXlyW3MrK108PHB0LHB0Kz04LGh0Kz15cltzKytdPDxwdCxwdCs9OCksanQ9UnRbaHQmbG5dO246Zm9yKDs7KXtpZih3dD1qdD4+PjI0LGh0Pj4+PXd0LHB0LT13dCx3dD1qdD4+PjE2JjI1NSx3dCYxNil7aWYob249anQmNjU1MzUsd3QmPTE1LHB0PHd0JiYoaHQrPXlyW3MrK108PHB0LHB0Kz04LHB0PHd0JiYoaHQrPXlyW3MrK108PHB0LHB0Kz04KSksb24rPWh0JigxPDx3dCktMSxvbj5QKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT1qO2JyZWFrIGV9aWYoaHQ+Pj49d3QscHQtPXd0LHd0PWctRSxvbj53dCl7aWYod3Q9b24td3Qsd3Q+T2UmJnIuc2FuZSl7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixyLm1vZGU9ajticmVhayBlfWlmKFh0PTAsSW49UmUsUGU9PT0wKXtpZihYdCs9TC13dCx3dDx2bil7dm4tPXd0O2RvIFF0W2crK109UmVbWHQrK107d2hpbGUoLS13dCk7WHQ9Zy1vbixJbj1RdH19ZWxzZSBpZihQZTx3dCl7aWYoWHQrPUwrUGUtd3Qsd3QtPVBlLHd0PHZuKXt2bi09d3Q7ZG8gUXRbZysrXT1SZVtYdCsrXTt3aGlsZSgtLXd0KTtpZihYdD0wLFBlPHZuKXt3dD1QZSx2bi09d3Q7ZG8gUXRbZysrXT1SZVtYdCsrXTt3aGlsZSgtLXd0KTtYdD1nLW9uLEluPVF0fX19ZWxzZSBpZihYdCs9UGUtd3Qsd3Q8dm4pe3ZuLT13dDtkbyBRdFtnKytdPVJlW1h0KytdO3doaWxlKC0td3QpO1h0PWctb24sSW49UXR9Zm9yKDt2bj4yOylRdFtnKytdPUluW1h0KytdLFF0W2crK109SW5bWHQrK10sUXRbZysrXT1JbltYdCsrXSx2bi09Mzt2biYmKFF0W2crK109SW5bWHQrK10sdm4+MSYmKFF0W2crK109SW5bWHQrK10pKX1lbHNle1h0PWctb247ZG8gUXRbZysrXT1RdFtYdCsrXSxRdFtnKytdPVF0W1h0KytdLFF0W2crK109UXRbWHQrK10sdm4tPTM7d2hpbGUodm4+Mik7dm4mJihRdFtnKytdPVF0W1h0KytdLHZuPjEmJihRdFtnKytdPVF0W1h0KytdKSl9fWVsc2UgaWYoKHd0JjY0KT09PTApe2p0PVJ0WyhqdCY2NTUzNSkrKGh0JigxPDx3dCktMSldO2NvbnRpbnVlIG59ZWxzZXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixyLm1vZGU9ajticmVhayBlfWJyZWFrfX1lbHNlIGlmKCh3dCY2NCk9PT0wKXtqdD1rdFsoanQmNjU1MzUpKyhodCYoMTw8d3QpLTEpXTtjb250aW51ZSB0fWVsc2UgaWYod3QmMzIpe3IubW9kZT1pZTticmVhayBlfWVsc2V7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsci5tb2RlPWo7YnJlYWsgZX1icmVha319d2hpbGUoczx1JiZnPFUpO3ZuPXB0Pj4zLHMtPXZuLHB0LT12bjw8MyxodCY9KDE8PHB0KS0xLHQubmV4dF9pbj1zLHQubmV4dF9vdXQ9Zyx0LmF2YWlsX2luPXM8dT81Kyh1LXMpOjUtKHMtdSksdC5hdmFpbF9vdXQ9ZzxVPzI1NysoVS1nKToyNTctKGctVSksci5ob2xkPWh0LHIuYml0cz1wdH0sb2U9VWUsdmU9MTUsZXQ9ODUyLEdlPTU5Mix0dD0wLFZlPTEsTHQ9MixCdD1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLFV0PVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sdW49WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLFluPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0scXQ9ZnVuY3Rpb24odCxuLHIscyx1LGcsRSxVKXt2YXIgUD1VLmJpdHMsTD0wLE9lPTAsUGU9MCxSZT0wLGh0PTAscHQ9MCxrdD0wLFJ0PTAsZG49MCxsbj0wLGp0LHd0LHZuLG9uLFh0LEluPW51bGwseXI9MCxRdCxocz1uZXcgb2UuQnVmMTYodmUrMSksZWY9bmV3IG9lLkJ1ZjE2KHZlKzEpLHRmPW51bGwsV2c9MCxHZyxuZixyZjtmb3IoTD0wO0w8PXZlO0wrKyloc1tMXT0wO2ZvcihPZT0wO09lPHM7T2UrKyloc1tuW3IrT2VdXSsrO2ZvcihodD1QLFJlPXZlO1JlPj0xJiZoc1tSZV09PT0wO1JlLS0pO2lmKGh0PlJlJiYoaHQ9UmUpLFJlPT09MClyZXR1cm4gdVtnKytdPTE8PDI0fDY0PDwxNnwwLHVbZysrXT0xPDwyNHw2NDw8MTZ8MCxVLmJpdHM9MSwwO2ZvcihQZT0xO1BlPFJlJiZoc1tQZV09PT0wO1BlKyspO2ZvcihodDxQZSYmKGh0PVBlKSxSdD0xLEw9MTtMPD12ZTtMKyspaWYoUnQ8PD0xLFJ0LT1oc1tMXSxSdDwwKXJldHVybi0xO2lmKFJ0PjAmJih0PT09dHR8fFJlIT09MSkpcmV0dXJuLTE7Zm9yKGVmWzFdPTAsTD0xO0w8dmU7TCsrKWVmW0wrMV09ZWZbTF0raHNbTF07Zm9yKE9lPTA7T2U8cztPZSsrKW5bcitPZV0hPT0wJiYoRVtlZltuW3IrT2VdXSsrXT1PZSk7aWYodD09PXR0PyhJbj10Zj1FLFF0PTE5KTp0PT09VmU/KEluPUJ0LHlyLT0yNTcsdGY9VXQsV2ctPTI1NyxRdD0yNTYpOihJbj11bix0Zj1ZbixRdD0tMSksbG49MCxPZT0wLEw9UGUsWHQ9ZyxwdD1odCxrdD0wLHZuPS0xLGRuPTE8PGh0LG9uPWRuLTEsdD09PVZlJiZkbj5ldHx8dD09PUx0JiZkbj5HZSlyZXR1cm4gMTtmb3IoOzspe0dnPUwta3QsRVtPZV08UXQ/KG5mPTAscmY9RVtPZV0pOkVbT2VdPlF0PyhuZj10ZltXZytFW09lXV0scmY9SW5beXIrRVtPZV1dKToobmY9MzIrNjQscmY9MCksanQ9MTw8TC1rdCx3dD0xPDxwdCxQZT13dDtkbyB3dC09anQsdVtYdCsobG4+Pmt0KSt3dF09R2c8PDI0fG5mPDwxNnxyZnwwO3doaWxlKHd0IT09MCk7Zm9yKGp0PTE8PEwtMTtsbiZqdDspanQ+Pj0xO2lmKGp0IT09MD8obG4mPWp0LTEsbG4rPWp0KTpsbj0wLE9lKyssLS1oc1tMXT09PTApe2lmKEw9PT1SZSlicmVhaztMPW5bcitFW09lXV19aWYoTD5odCYmKGxuJm9uKSE9PXZuKXtmb3Ioa3Q9PT0wJiYoa3Q9aHQpLFh0Kz1QZSxwdD1MLWt0LFJ0PTE8PHB0O3B0K2t0PFJlJiYoUnQtPWhzW3B0K2t0XSwhKFJ0PD0wKSk7KXB0KyssUnQ8PD0xO2lmKGRuKz0xPDxwdCx0PT09VmUmJmRuPmV0fHx0PT09THQmJmRuPkdlKXJldHVybiAxO3ZuPWxuJm9uLHVbdm5dPWh0PDwyNHxwdDw8MTZ8WHQtZ3wwfX1yZXR1cm4gbG4hPT0wJiYodVtYdCtsbl09TC1rdDw8MjR8NjQ8PDE2fDApLFUuYml0cz1odCwwfSxibj1VZSxiaT1wYyxzbj12bCxUbj15ZSxnbj1xdCxYaT0wLHlpPTEsenI9Mix1YT00LEc9NSxYPTYsd2U9MCwkZT0xLHplPTIscnQ9LTIsbXQ9LTMsb3Q9LTQsY3Q9LTUsWWU9OCwkdD0xLEZ0PTIsSHQ9MyxDbj00LFdyPTUscnI9NixFaT03LGZhPTgsQnM9OSx0bD0xMCxfcj0xMSxObz0xMixpcz0xMyxrbz0xNCxvcz0xNSxubD0xNixhcz0xNyxNcz0xOCxXYT0xOSxzcz0yMCxHYT0yMSxldT0yMixDYz0yMyx0dT0yNCxudT0yNSxMZD0yNix5Zj0yNyxGZD0yOCxWZD0yOSxUcj0zMCxVZD0zMSxubT0zMixybT04NTIsaW09NTkyLG9tPTE1LGFtPW9tO2Z1bmN0aW9uICRkKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoZSY2NTI4MCk8PDgpKygoZSYyNTUpPDwyNCl9ZnVuY3Rpb24gc20oKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IGJuLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBibi5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBIZChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/cnQ6KHQ9ZS5zdGF0ZSxlLnRvdGFsX2luPWUudG90YWxfb3V0PXQudG90YWw9MCxlLm1zZz0iIix0LndyYXAmJihlLmFkbGVyPXQud3JhcCYxKSx0Lm1vZGU9JHQsdC5sYXN0PTAsdC5oYXZlZGljdD0wLHQuZG1heD0zMjc2OCx0LmhlYWQ9bnVsbCx0LmhvbGQ9MCx0LmJpdHM9MCx0LmxlbmNvZGU9dC5sZW5keW49bmV3IGJuLkJ1ZjMyKHJtKSx0LmRpc3Rjb2RlPXQuZGlzdGR5bj1uZXcgYm4uQnVmMzIoaW0pLHQuc2FuZT0xLHQuYmFjaz0tMSx3ZSl9ZnVuY3Rpb24gamQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP3J0Oih0PWUuc3RhdGUsdC53c2l6ZT0wLHQud2hhdmU9MCx0LnduZXh0PTAsSGQoZSkpfWZ1bmN0aW9uIHpkKGUsdCl7dmFyIG4scjtyZXR1cm4hZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsdDwwPyhuPTAsdD0tdCk6KG49KHQ+PjQpKzEsdDw0OCYmKHQmPTE1KSksdCYmKHQ8OHx8dD4xNSkpP3J0OihyLndpbmRvdyE9PW51bGwmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LGpkKGUpKX1mdW5jdGlvbiBXZChlLHQpe3ZhciBuLHI7cmV0dXJuIGU/KHI9bmV3IHNtLGUuc3RhdGU9cixyLndpbmRvdz1udWxsLG49emQoZSx0KSxuIT09d2UmJihlLnN0YXRlPW51bGwpLG4pOnJ0fWZ1bmN0aW9uIGxtKGUpe3JldHVybiBXZChlLGFtKX12YXIgR2Q9ITAsRWYsd2Y7ZnVuY3Rpb24gY20oZSl7aWYoR2Qpe3ZhciB0O2ZvcihFZj1uZXcgYm4uQnVmMzIoNTEyKSx3Zj1uZXcgYm4uQnVmMzIoMzIpLHQ9MDt0PDE0NDspZS5sZW5zW3QrK109ODtmb3IoO3Q8MjU2OyllLmxlbnNbdCsrXT05O2Zvcig7dDwyODA7KWUubGVuc1t0KytdPTc7Zm9yKDt0PDI4ODspZS5sZW5zW3QrK109ODtmb3IoZ24oeWksZS5sZW5zLDAsMjg4LEVmLDAsZS53b3JrLHtiaXRzOjl9KSx0PTA7dDwzMjspZS5sZW5zW3QrK109NTtnbih6cixlLmxlbnMsMCwzMix3ZiwwLGUud29yayx7Yml0czo1fSksR2Q9ITF9ZS5sZW5jb2RlPUVmLGUubGVuYml0cz05LGUuZGlzdGNvZGU9d2YsZS5kaXN0Yml0cz01fWZ1bmN0aW9uIFlkKGUsdCxuLHIpe3ZhciBzLHU9ZS5zdGF0ZTtyZXR1cm4gdS53aW5kb3c9PT1udWxsJiYodS53c2l6ZT0xPDx1LndiaXRzLHUud25leHQ9MCx1LndoYXZlPTAsdS53aW5kb3c9bmV3IGJuLkJ1ZjgodS53c2l6ZSkpLHI+PXUud3NpemU/KGJuLmFycmF5U2V0KHUud2luZG93LHQsbi11LndzaXplLHUud3NpemUsMCksdS53bmV4dD0wLHUud2hhdmU9dS53c2l6ZSk6KHM9dS53c2l6ZS11LnduZXh0LHM+ciYmKHM9ciksYm4uYXJyYXlTZXQodS53aW5kb3csdCxuLXIscyx1LnduZXh0KSxyLT1zLHI/KGJuLmFycmF5U2V0KHUud2luZG93LHQsbi1yLHIsMCksdS53bmV4dD1yLHUud2hhdmU9dS53c2l6ZSk6KHUud25leHQrPXMsdS53bmV4dD09PXUud3NpemUmJih1LnduZXh0PTApLHUud2hhdmU8dS53c2l6ZSYmKHUud2hhdmUrPXMpKSksMH1mdW5jdGlvbiB1bShlLHQpe3ZhciBuLHIscyx1LGcsRSxVLFAsTCxPZSxQZSxSZSxodCxwdCxrdD0wLFJ0LGRuLGxuLGp0LHd0LHZuLG9uLFh0LEluPW5ldyBibi5CdWY4KDQpLHlyLFF0LGhzPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighZXx8IWUuc3RhdGV8fCFlLm91dHB1dHx8IWUuaW5wdXQmJmUuYXZhaWxfaW4hPT0wKXJldHVybiBydDtuPWUuc3RhdGUsbi5tb2RlPT09Tm8mJihuLm1vZGU9aXMpLGc9ZS5uZXh0X291dCxzPWUub3V0cHV0LFU9ZS5hdmFpbF9vdXQsdT1lLm5leHRfaW4scj1lLmlucHV0LEU9ZS5hdmFpbF9pbixQPW4uaG9sZCxMPW4uYml0cyxPZT1FLFBlPVUsWHQ9d2U7ZTpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSAkdDppZihuLndyYXA9PT0wKXtuLm1vZGU9aXM7YnJlYWt9Zm9yKDtMPDE2Oyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9aWYobi53cmFwJjImJlA9PT0zNTYxNSl7bi5jaGVjaz0wLEluWzBdPVAmMjU1LEluWzFdPVA+Pj44JjI1NSxuLmNoZWNrPXNuKG4uY2hlY2ssSW4sMiwwKSxQPTAsTD0wLG4ubW9kZT1GdDticmVha31pZihuLmZsYWdzPTAsbi5oZWFkJiYobi5oZWFkLmRvbmU9ITEpLCEobi53cmFwJjEpfHwoKChQJjI1NSk8PDgpKyhQPj44KSklMzEpe2UubXNnPSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIixuLm1vZGU9VHI7YnJlYWt9aWYoKFAmMTUpIT09WWUpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPVRyO2JyZWFrfWlmKFA+Pj49NCxMLT00LG9uPShQJjE1KSs4LG4ud2JpdHM9PT0wKW4ud2JpdHM9b247ZWxzZSBpZihvbj5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPVRyO2JyZWFrfW4uZG1heD0xPDxvbixlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9UCY1MTI/dGw6Tm8sUD0wLEw9MDticmVhaztjYXNlIEZ0OmZvcig7TDwxNjspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fWlmKG4uZmxhZ3M9UCwobi5mbGFncyYyNTUpIT09WWUpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPVRyO2JyZWFrfWlmKG4uZmxhZ3MmNTczNDQpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT1UcjticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD1QPj44JjEpLG4uZmxhZ3MmNTEyJiYoSW5bMF09UCYyNTUsSW5bMV09UD4+PjgmMjU1LG4uY2hlY2s9c24obi5jaGVjayxJbiwyLDApKSxQPTAsTD0wLG4ubW9kZT1IdDtjYXNlIEh0OmZvcig7TDwzMjspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fW4uaGVhZCYmKG4uaGVhZC50aW1lPVApLG4uZmxhZ3MmNTEyJiYoSW5bMF09UCYyNTUsSW5bMV09UD4+PjgmMjU1LEluWzJdPVA+Pj4xNiYyNTUsSW5bM109UD4+PjI0JjI1NSxuLmNoZWNrPXNuKG4uY2hlY2ssSW4sNCwwKSksUD0wLEw9MCxuLm1vZGU9Q247Y2FzZSBDbjpmb3IoO0w8MTY7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1uLmhlYWQmJihuLmhlYWQueGZsYWdzPVAmMjU1LG4uaGVhZC5vcz1QPj44KSxuLmZsYWdzJjUxMiYmKEluWzBdPVAmMjU1LEluWzFdPVA+Pj44JjI1NSxuLmNoZWNrPXNuKG4uY2hlY2ssSW4sMiwwKSksUD0wLEw9MCxuLm1vZGU9V3I7Y2FzZSBXcjppZihuLmZsYWdzJjEwMjQpe2Zvcig7TDwxNjspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fW4ubGVuZ3RoPVAsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj1QKSxuLmZsYWdzJjUxMiYmKEluWzBdPVAmMjU1LEluWzFdPVA+Pj44JjI1NSxuLmNoZWNrPXNuKG4uY2hlY2ssSW4sMiwwKSksUD0wLEw9MH1lbHNlIG4uaGVhZCYmKG4uaGVhZC5leHRyYT1udWxsKTtuLm1vZGU9cnI7Y2FzZSBycjppZihuLmZsYWdzJjEwMjQmJihSZT1uLmxlbmd0aCxSZT5FJiYoUmU9RSksUmUmJihuLmhlYWQmJihvbj1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgQXJyYXkobi5oZWFkLmV4dHJhX2xlbikpLGJuLmFycmF5U2V0KG4uaGVhZC5leHRyYSxyLHUsUmUsb24pKSxuLmZsYWdzJjUxMiYmKG4uY2hlY2s9c24obi5jaGVjayxyLFJlLHUpKSxFLT1SZSx1Kz1SZSxuLmxlbmd0aC09UmUpLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPUVpO2Nhc2UgRWk6aWYobi5mbGFncyYyMDQ4KXtpZihFPT09MClicmVhayBlO1JlPTA7ZG8gb249clt1K1JlKytdLG4uaGVhZCYmb24mJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLm5hbWUrPVN0cmluZy5mcm9tQ2hhckNvZGUob24pKTt3aGlsZShvbiYmUmU8RSk7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXNuKG4uY2hlY2sscixSZSx1KSksRS09UmUsdSs9UmUsb24pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5uYW1lPW51bGwpO24ubGVuZ3RoPTAsbi5tb2RlPWZhO2Nhc2UgZmE6aWYobi5mbGFncyY0MDk2KXtpZihFPT09MClicmVhayBlO1JlPTA7ZG8gb249clt1K1JlKytdLG4uaGVhZCYmb24mJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUob24pKTt3aGlsZShvbiYmUmU8RSk7aWYobi5mbGFncyY1MTImJihuLmNoZWNrPXNuKG4uY2hlY2sscixSZSx1KSksRS09UmUsdSs9UmUsb24pYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT1CcztjYXNlIEJzOmlmKG4uZmxhZ3MmNTEyKXtmb3IoO0w8MTY7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1pZihQIT09KG4uY2hlY2smNjU1MzUpKXtlLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPVRyO2JyZWFrfVA9MCxMPTB9bi5oZWFkJiYobi5oZWFkLmhjcmM9bi5mbGFncz4+OSYxLG4uaGVhZC5kb25lPSEwKSxlLmFkbGVyPW4uY2hlY2s9MCxuLm1vZGU9Tm87YnJlYWs7Y2FzZSB0bDpmb3IoO0w8MzI7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1lLmFkbGVyPW4uY2hlY2s9JGQoUCksUD0wLEw9MCxuLm1vZGU9X3I7Y2FzZSBfcjppZihuLmhhdmVkaWN0PT09MClyZXR1cm4gZS5uZXh0X291dD1nLGUuYXZhaWxfb3V0PVUsZS5uZXh0X2luPXUsZS5hdmFpbF9pbj1FLG4uaG9sZD1QLG4uYml0cz1MLHplO2UuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1ObztjYXNlIE5vOmlmKHQ9PT1HfHx0PT09WClicmVhayBlO2Nhc2UgaXM6aWYobi5sYXN0KXtQPj4+PUwmNyxMLT1MJjcsbi5tb2RlPXlmO2JyZWFrfWZvcig7TDwzOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9c3dpdGNoKG4ubGFzdD1QJjEsUD4+Pj0xLEwtPTEsUCYzKXtjYXNlIDA6bi5tb2RlPWtvO2JyZWFrO2Nhc2UgMTppZihjbShuKSxuLm1vZGU9c3MsdD09PVgpe1A+Pj49MixMLT0yO2JyZWFrIGV9YnJlYWs7Y2FzZSAyOm4ubW9kZT1hczticmVhaztjYXNlIDM6ZS5tc2c9ImludmFsaWQgYmxvY2sgdHlwZSIsbi5tb2RlPVRyfVA+Pj49MixMLT0yO2JyZWFrO2Nhc2Uga286Zm9yKFA+Pj49TCY3LEwtPUwmNztMPDMyOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9aWYoKFAmNjU1MzUpIT09KFA+Pj4xNl42NTUzNSkpe2UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9VHI7YnJlYWt9aWYobi5sZW5ndGg9UCY2NTUzNSxQPTAsTD0wLG4ubW9kZT1vcyx0PT09WClicmVhayBlO2Nhc2Ugb3M6bi5tb2RlPW5sO2Nhc2Ugbmw6aWYoUmU9bi5sZW5ndGgsUmUpe2lmKFJlPkUmJihSZT1FKSxSZT5VJiYoUmU9VSksUmU9PT0wKWJyZWFrIGU7Ym4uYXJyYXlTZXQocyxyLHUsUmUsZyksRS09UmUsdSs9UmUsVS09UmUsZys9UmUsbi5sZW5ndGgtPVJlO2JyZWFrfW4ubW9kZT1ObzticmVhaztjYXNlIGFzOmZvcig7TDwxNDspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fWlmKG4ubmxlbj0oUCYzMSkrMjU3LFA+Pj49NSxMLT01LG4ubmRpc3Q9KFAmMzEpKzEsUD4+Pj01LEwtPTUsbi5uY29kZT0oUCYxNSkrNCxQPj4+PTQsTC09NCxuLm5sZW4+Mjg2fHxuLm5kaXN0PjMwKXtlLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLG4ubW9kZT1UcjticmVha31uLmhhdmU9MCxuLm1vZGU9TXM7Y2FzZSBNczpmb3IoO24uaGF2ZTxuLm5jb2RlOyl7Zm9yKDtMPDM7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1uLmxlbnNbaHNbbi5oYXZlKytdXT1QJjcsUD4+Pj0zLEwtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1toc1tuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LHlyPXtiaXRzOm4ubGVuYml0c30sWHQ9Z24oWGksbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLHlyKSxuLmxlbmJpdHM9eXIuYml0cyxYdCl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPVRyO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT1XYTtjYXNlIFdhOmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDtrdD1uLmxlbmNvZGVbUCYoMTw8bi5sZW5iaXRzKS0xXSxSdD1rdD4+PjI0LGRuPWt0Pj4+MTYmMjU1LGxuPWt0JjY1NTM1LCEoUnQ8PUwpOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9aWYobG48MTYpUD4+Pj1SdCxMLT1SdCxuLmxlbnNbbi5oYXZlKytdPWxuO2Vsc2V7aWYobG49PT0xNil7Zm9yKFF0PVJ0KzI7TDxRdDspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fWlmKFA+Pj49UnQsTC09UnQsbi5oYXZlPT09MCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1UcjticmVha31vbj1uLmxlbnNbbi5oYXZlLTFdLFJlPTMrKFAmMyksUD4+Pj0yLEwtPTJ9ZWxzZSBpZihsbj09PTE3KXtmb3IoUXQ9UnQrMztMPFF0Oyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9UD4+Pj1SdCxMLT1SdCxvbj0wLFJlPTMrKFAmNyksUD4+Pj0zLEwtPTN9ZWxzZXtmb3IoUXQ9UnQrNztMPFF0Oyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9UD4+Pj1SdCxMLT1SdCxvbj0wLFJlPTExKyhQJjEyNyksUD4+Pj03LEwtPTd9aWYobi5oYXZlK1JlPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPVRyO2JyZWFrfWZvcig7UmUtLTspbi5sZW5zW24uaGF2ZSsrXT1vbn19aWYobi5tb2RlPT09VHIpYnJlYWs7aWYobi5sZW5zWzI1Nl09PT0wKXtlLm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9VHI7YnJlYWt9aWYobi5sZW5iaXRzPTkseXI9e2JpdHM6bi5sZW5iaXRzfSxYdD1nbih5aSxuLmxlbnMsMCxuLm5sZW4sbi5sZW5jb2RlLDAsbi53b3JrLHlyKSxuLmxlbmJpdHM9eXIuYml0cyxYdCl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsbi5tb2RlPVRyO2JyZWFrfWlmKG4uZGlzdGJpdHM9NixuLmRpc3Rjb2RlPW4uZGlzdGR5bix5cj17Yml0czpuLmRpc3RiaXRzfSxYdD1nbih6cixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayx5ciksbi5kaXN0Yml0cz15ci5iaXRzLFh0KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9VHI7YnJlYWt9aWYobi5tb2RlPXNzLHQ9PT1YKWJyZWFrIGU7Y2FzZSBzczpuLm1vZGU9R2E7Y2FzZSBHYTppZihFPj02JiZVPj0yNTgpe2UubmV4dF9vdXQ9ZyxlLmF2YWlsX291dD1VLGUubmV4dF9pbj11LGUuYXZhaWxfaW49RSxuLmhvbGQ9UCxuLmJpdHM9TCxUbihlLFBlKSxnPWUubmV4dF9vdXQscz1lLm91dHB1dCxVPWUuYXZhaWxfb3V0LHU9ZS5uZXh0X2luLHI9ZS5pbnB1dCxFPWUuYXZhaWxfaW4sUD1uLmhvbGQsTD1uLmJpdHMsbi5tb2RlPT09Tm8mJihuLmJhY2s9LTEpO2JyZWFrfWZvcihuLmJhY2s9MDtrdD1uLmxlbmNvZGVbUCYoMTw8bi5sZW5iaXRzKS0xXSxSdD1rdD4+PjI0LGRuPWt0Pj4+MTYmMjU1LGxuPWt0JjY1NTM1LCEoUnQ8PUwpOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9aWYoZG4mJihkbiYyNDApPT09MCl7Zm9yKGp0PVJ0LHd0PWRuLHZuPWxuO2t0PW4ubGVuY29kZVt2bisoKFAmKDE8PGp0K3d0KS0xKT4+anQpXSxSdD1rdD4+PjI0LGRuPWt0Pj4+MTYmMjU1LGxuPWt0JjY1NTM1LCEoanQrUnQ8PUwpOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUCs9clt1KytdPDxMLEwrPTh9UD4+Pj1qdCxMLT1qdCxuLmJhY2srPWp0fWlmKFA+Pj49UnQsTC09UnQsbi5iYWNrKz1SdCxuLmxlbmd0aD1sbixkbj09PTApe24ubW9kZT1MZDticmVha31pZihkbiYzMil7bi5iYWNrPS0xLG4ubW9kZT1ObzticmVha31pZihkbiY2NCl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPVRyO2JyZWFrfW4uZXh0cmE9ZG4mMTUsbi5tb2RlPWV1O2Nhc2UgZXU6aWYobi5leHRyYSl7Zm9yKFF0PW4uZXh0cmE7TDxRdDspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fW4ubGVuZ3RoKz1QJigxPDxuLmV4dHJhKS0xLFA+Pj49bi5leHRyYSxMLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9Q2M7Y2FzZSBDYzpmb3IoO2t0PW4uZGlzdGNvZGVbUCYoMTw8bi5kaXN0Yml0cyktMV0sUnQ9a3Q+Pj4yNCxkbj1rdD4+PjE2JjI1NSxsbj1rdCY2NTUzNSwhKFJ0PD1MKTspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fWlmKChkbiYyNDApPT09MCl7Zm9yKGp0PVJ0LHd0PWRuLHZuPWxuO2t0PW4uZGlzdGNvZGVbdm4rKChQJigxPDxqdCt3dCktMSk+Pmp0KV0sUnQ9a3Q+Pj4yNCxkbj1rdD4+PjE2JjI1NSxsbj1rdCY2NTUzNSwhKGp0K1J0PD1MKTspe2lmKEU9PT0wKWJyZWFrIGU7RS0tLFArPXJbdSsrXTw8TCxMKz04fVA+Pj49anQsTC09anQsbi5iYWNrKz1qdH1pZihQPj4+PVJ0LEwtPVJ0LG4uYmFjays9UnQsZG4mNjQpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT1UcjticmVha31uLm9mZnNldD1sbixuLmV4dHJhPWRuJjE1LG4ubW9kZT10dTtjYXNlIHR1OmlmKG4uZXh0cmEpe2ZvcihRdD1uLmV4dHJhO0w8UXQ7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1uLm9mZnNldCs9UCYoMTw8bi5leHRyYSktMSxQPj4+PW4uZXh0cmEsTC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1UcjticmVha31uLm1vZGU9bnU7Y2FzZSBudTppZihVPT09MClicmVhayBlO2lmKFJlPVBlLVUsbi5vZmZzZXQ+UmUpe2lmKFJlPW4ub2Zmc2V0LVJlLFJlPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9VHI7YnJlYWt9UmU+bi53bmV4dD8oUmUtPW4ud25leHQsaHQ9bi53c2l6ZS1SZSk6aHQ9bi53bmV4dC1SZSxSZT5uLmxlbmd0aCYmKFJlPW4ubGVuZ3RoKSxwdD1uLndpbmRvd31lbHNlIHB0PXMsaHQ9Zy1uLm9mZnNldCxSZT1uLmxlbmd0aDtSZT5VJiYoUmU9VSksVS09UmUsbi5sZW5ndGgtPVJlO2RvIHNbZysrXT1wdFtodCsrXTt3aGlsZSgtLVJlKTtuLmxlbmd0aD09PTAmJihuLm1vZGU9R2EpO2JyZWFrO2Nhc2UgTGQ6aWYoVT09PTApYnJlYWsgZTtzW2crK109bi5sZW5ndGgsVS0tLG4ubW9kZT1HYTticmVhaztjYXNlIHlmOmlmKG4ud3JhcCl7Zm9yKDtMPDMyOyl7aWYoRT09PTApYnJlYWsgZTtFLS0sUHw9clt1KytdPDxMLEwrPTh9aWYoUGUtPVUsZS50b3RhbF9vdXQrPVBlLG4udG90YWwrPVBlLFBlJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/c24obi5jaGVjayxzLFBlLGctUGUpOmJpKG4uY2hlY2sscyxQZSxnLVBlKSksUGU9VSwobi5mbGFncz9QOiRkKFApKSE9PW4uY2hlY2spe2UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsbi5tb2RlPVRyO2JyZWFrfVA9MCxMPTB9bi5tb2RlPUZkO2Nhc2UgRmQ6aWYobi53cmFwJiZuLmZsYWdzKXtmb3IoO0w8MzI7KXtpZihFPT09MClicmVhayBlO0UtLSxQKz1yW3UrK108PEwsTCs9OH1pZihQIT09KG4udG90YWwmNDI5NDk2NzI5NSkpe2UubXNnPSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIixuLm1vZGU9VHI7YnJlYWt9UD0wLEw9MH1uLm1vZGU9VmQ7Y2FzZSBWZDpYdD0kZTticmVhayBlO2Nhc2UgVHI6WHQ9bXQ7YnJlYWsgZTtjYXNlIFVkOnJldHVybiBvdDtjYXNlIG5tOmRlZmF1bHQ6cmV0dXJuIHJ0fXJldHVybiBlLm5leHRfb3V0PWcsZS5hdmFpbF9vdXQ9VSxlLm5leHRfaW49dSxlLmF2YWlsX2luPUUsbi5ob2xkPVAsbi5iaXRzPUwsKG4ud3NpemV8fFBlIT09ZS5hdmFpbF9vdXQmJm4ubW9kZTxUciYmKG4ubW9kZTx5Znx8dCE9PXVhKSkmJllkKGUsZS5vdXRwdXQsZS5uZXh0X291dCxQZS1lLmF2YWlsX291dCksT2UtPWUuYXZhaWxfaW4sUGUtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPU9lLGUudG90YWxfb3V0Kz1QZSxuLnRvdGFsKz1QZSxuLndyYXAmJlBlJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/c24obi5jaGVjayxzLFBlLGUubmV4dF9vdXQtUGUpOmJpKG4uY2hlY2sscyxQZSxlLm5leHRfb3V0LVBlKSksZS5kYXRhX3R5cGU9bi5iaXRzKyhuLmxhc3Q/NjQ6MCkrKG4ubW9kZT09PU5vPzEyODowKSsobi5tb2RlPT09c3N8fG4ubW9kZT09PW9zPzI1NjowKSwoT2U9PT0wJiZQZT09PTB8fHQ9PT11YSkmJlh0PT09d2UmJihYdD1jdCksWHR9ZnVuY3Rpb24gZm0oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBydDt2YXIgdD1lLnN0YXRlO3JldHVybiB0LndpbmRvdyYmKHQud2luZG93PW51bGwpLGUuc3RhdGU9bnVsbCx3ZX1mdW5jdGlvbiBkbShlLHQpe3ZhciBuO3JldHVybiFlfHwhZS5zdGF0ZXx8KG49ZS5zdGF0ZSwobi53cmFwJjIpPT09MCk/cnQ6KG4uaGVhZD10LHQuZG9uZT0hMSx3ZSl9ZnVuY3Rpb24gaG0oZSx0KXt2YXIgbj10Lmxlbmd0aCxyLHMsdTtyZXR1cm4hZXx8IWUuc3RhdGV8fChyPWUuc3RhdGUsci53cmFwIT09MCYmci5tb2RlIT09X3IpP3J0OnIubW9kZT09PV9yJiYocz0xLHM9Ymkocyx0LG4sMCkscyE9PXIuY2hlY2spP210Oih1PVlkKGUsdCxuLG4pLHU/KHIubW9kZT1VZCxvdCk6KHIuaGF2ZWRpY3Q9MSx3ZSkpfUIuaW5mbGF0ZVJlc2V0PWpkLEIuaW5mbGF0ZVJlc2V0Mj16ZCxCLmluZmxhdGVSZXNldEtlZXA9SGQsQi5pbmZsYXRlSW5pdD1sbSxCLmluZmxhdGVJbml0Mj1XZCxCLmluZmxhdGU9dW0sQi5pbmZsYXRlRW5kPWZtLEIuaW5mbGF0ZUdldEhlYWRlcj1kbSxCLmluZmxhdGVTZXREaWN0aW9uYXJ5PWhtLEIuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBxZD17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fTtmdW5jdGlvbiBwbSgpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfXZhciBnbT1wbSxPYz1CLHJ1PVVlLFB1PWF0LGFpPXFkLFNmPVJzLHZtPXcsbW09Z20sSmQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB6bChlKXtpZighKHRoaXMgaW5zdGFuY2VvZiB6bCkpcmV0dXJuIG5ldyB6bChlKTt0aGlzLm9wdGlvbnM9cnUuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiZ0LndpbmRvd0JpdHM+PTAmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cz0tdC53aW5kb3dCaXRzLHQud2luZG93Qml0cz09PTAmJih0LndpbmRvd0JpdHM9LTE1KSksdC53aW5kb3dCaXRzPj0wJiZ0LndpbmRvd0JpdHM8MTYmJiEoZSYmZS53aW5kb3dCaXRzKSYmKHQud2luZG93Qml0cys9MzIpLHQud2luZG93Qml0cz4xNSYmdC53aW5kb3dCaXRzPDQ4JiYodC53aW5kb3dCaXRzJjE1KT09PTAmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB2bSx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49T2MuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1haS5aX09LKXRocm93IG5ldyBFcnJvcihTZltuXSk7aWYodGhpcy5oZWFkZXI9bmV3IG1tLE9jLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSx0LmRpY3Rpb25hcnkmJih0eXBlb2YgdC5kaWN0aW9uYXJ5PT0ic3RyaW5nIj90LmRpY3Rpb25hcnk9UHUuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOkpkLmNhbGwodC5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSImJih0LmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KSksdC5yYXcmJihuPU9jLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0LmRpY3Rpb25hcnkpLG4hPT1haS5aX09LKSkpdGhyb3cgbmV3IEVycm9yKFNmW25dKX16bC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemUscz10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSx1LGcsRSxVLFAsTD0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO2c9dD09PX5+dD90OnQ9PT0hMD9haS5aX0ZJTklTSDphaS5aX05PX0ZMVVNILHR5cGVvZiBlPT0ic3RyaW5nIj9uLmlucHV0PVB1LmJpbnN0cmluZzJidWYoZSk6SmQuY2FsbChlKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bi5pbnB1dD1uZXcgVWludDhBcnJheShlKTpuLmlucHV0PWUsbi5uZXh0X2luPTAsbi5hdmFpbF9pbj1uLmlucHV0Lmxlbmd0aDtkb3tpZihuLmF2YWlsX291dD09PTAmJihuLm91dHB1dD1uZXcgcnUuQnVmOChyKSxuLm5leHRfb3V0PTAsbi5hdmFpbF9vdXQ9ciksdT1PYy5pbmZsYXRlKG4sYWkuWl9OT19GTFVTSCksdT09PWFpLlpfTkVFRF9ESUNUJiZzJiYodT1PYy5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0scykpLHU9PT1haS5aX0JVRl9FUlJPUiYmTD09PSEwJiYodT1haS5aX09LLEw9ITEpLHUhPT1haS5aX1NUUkVBTV9FTkQmJnUhPT1haS5aX09LKXJldHVybiB0aGlzLm9uRW5kKHUpLHRoaXMuZW5kZWQ9ITAsITE7bi5uZXh0X291dCYmKG4uYXZhaWxfb3V0PT09MHx8dT09PWFpLlpfU1RSRUFNX0VORHx8bi5hdmFpbF9pbj09PTAmJihnPT09YWkuWl9GSU5JU0h8fGc9PT1haS5aX1NZTkNfRkxVU0gpKSYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciPyhFPVB1LnV0Zjhib3JkZXIobi5vdXRwdXQsbi5uZXh0X291dCksVT1uLm5leHRfb3V0LUUsUD1QdS5idWYyc3RyaW5nKG4ub3V0cHV0LEUpLG4ubmV4dF9vdXQ9VSxuLmF2YWlsX291dD1yLVUsVSYmcnUuYXJyYXlTZXQobi5vdXRwdXQsbi5vdXRwdXQsRSxVLDApLHRoaXMub25EYXRhKFApKTp0aGlzLm9uRGF0YShydS5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKSxuLmF2YWlsX2luPT09MCYmbi5hdmFpbF9vdXQ9PT0wJiYoTD0hMCl9d2hpbGUoKG4uYXZhaWxfaW4+MHx8bi5hdmFpbF9vdXQ9PT0wKSYmdSE9PWFpLlpfU1RSRUFNX0VORCk7cmV0dXJuIHU9PT1haS5aX1NUUkVBTV9FTkQmJihnPWFpLlpfRklOSVNIKSxnPT09YWkuWl9GSU5JU0g/KHU9T2MuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQodSksdGhpcy5lbmRlZD0hMCx1PT09YWkuWl9PSyk6KGc9PT1haS5aX1NZTkNfRkxVU0gmJih0aGlzLm9uRW5kKGFpLlpfT0spLG4uYXZhaWxfb3V0PTApLCEwKX0semwucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSx6bC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWFpLlpfT0smJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1ydS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTtmdW5jdGlvbiBDZihlLHQpe3ZhciBuPW5ldyB6bCh0KTtpZihuLnB1c2goZSwhMCksbi5lcnIpdGhyb3cgbi5tc2d8fFNmW24uZXJyXTtyZXR1cm4gbi5yZXN1bHR9ZnVuY3Rpb24gX20oZSx0KXtyZXR1cm4gdD10fHx7fSx0LnJhdz0hMCxDZihlLHQpfVFlLkluZmxhdGU9emwsUWUuaW5mbGF0ZT1DZixRZS5pbmZsYXRlUmF3PV9tLFFlLnVuZ3ppcD1DZjt2YXIgYm09VWUuYXNzaWduLHltPWd0LEVtPVFlLHdtPXFkLEtkPXt9O2JtKEtkLHltLEVtLHdtKTt2YXIgWmQ9S2Q7bGV0IFNtPSJ1cHgycHgiLENtPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLE9tPTFlLTQsQW09NzUwLFhkPSExLE9mPTAsUWQ9MCxlaD05NjAsdGg9Mzc1LG5oPTc1MDtmdW5jdGlvbiBUbSgpe2xldHtwbGF0Zm9ybTplLHBpeGVsUmF0aW86dCx3aW5kb3dXaWR0aDpufT13bygpO09mPW4sUWQ9dCxYZD1lPT09ImlvcyJ9ZnVuY3Rpb24gQWYoZSx0KXtsZXQgbj1OdW1iZXIoZSk7cmV0dXJuIGlzTmFOKG4pP3Q6bn1mdW5jdGlvbiBJbSgpe2xldCBlPVIuZ2xvYmFsU3R5bGV8fHt9O2VoPUFmKGUucnB4Q2FsY01heERldmljZVdpZHRoLDk2MCksdGg9QWYoZS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDM3NSksbmg9QWYoZS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDc1MCl9bGV0IFBtPUR0KFNtLChlLHQpPT57aWYoT2Y9PT0wJiYoVG0oKSxJbSgpKSxlPU51bWJlcihlKSxlPT09MClyZXR1cm4gMDtsZXQgbj10fHxPZjtuPWU9PT1uaHx8bjw9ZWg/bjp0aDtsZXQgcj1lL0FtKm47cmV0dXJuIHI8MCYmKHI9LXIpLHI9TWF0aC5mbG9vcihyK09tKSxyPT09MCYmKFFkPT09MXx8IVhkP3I9MTpyPS41KSxlPDA/LXI6cn0sQ20pLE5tPSJhZGRJbnRlcmNlcHRvciIsa209InJlbW92ZUludGVyY2VwdG9yIixyaD1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSxSbT1yaDtmdW5jdGlvbiBpaChlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e0ouaXNGdW5jdGlvbih0W25dKSYmKGVbbl09eG0oZVtuXSx0W25dKSl9KX1mdW5jdGlvbiBvaChlLHQpeyFlfHwhdHx8T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57bGV0IHI9ZVtuXSxzPXRbbl07Si5pc0FycmF5KHIpJiZKLmlzRnVuY3Rpb24ocykmJkoucmVtb3ZlKHIscyl9KX1mdW5jdGlvbiB4bShlLHQpe2xldCBuPXQ/ZT9lLmNvbmNhdCh0KTpKLmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbiYmQm0obil9ZnVuY3Rpb24gQm0oZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5pbmRleE9mKGVbbl0pPT09LTEmJnQucHVzaChlW25dKTtyZXR1cm4gdH1sZXQgTW09RHQoTm0sKGUsdCk9PntKLmlzU3RyaW5nKGUpJiZKLmlzUGxhaW5PYmplY3QodCk/aWgoY3JbZV18fChjcltlXT17fSksdCk6Si5pc1BsYWluT2JqZWN0KGUpJiZpaChQbixlKX0scmgpLERtPUR0KGttLChlLHQpPT57Si5pc1N0cmluZyhlKT9KLmlzUGxhaW5PYmplY3QodCk/b2goY3JbZV0sdCk6ZGVsZXRlIGNyW2VdOkouaXNQbGFpbk9iamVjdChlKSYmb2goUG4sZSl9LFJtKSxMbT17fSxGbT0iJG9uIixhaD1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sVm09IiRvbmNlIixVbT1haCwkbT0iJG9mZiIsSG09W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sam09IiRlbWl0Iix6bT1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLFdsPW5ldyByZS5FbWl0dGVyLFdtPUR0KEZtLChlLHQpPT4oV2wub24oZSx0KSwoKT0+V2wub2ZmKGUsdCkpLGFoKSxHbT1EdChWbSwoZSx0KT0+KFdsLm9uY2UoZSx0KSwoKT0+V2wub2ZmKGUsdCkpLFVtKSxZbT1EdCgkbSwoZSx0KT0+e2lmKCFlKXtXbC5lPXt9O3JldHVybn1KLmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKG49PldsLm9mZihuLHQpKX0sSG0pLHFtPUR0KGptLChlLC4uLnQpPT57V2wuZW1pdChlLC4uLnQpfSx6bSksc2g9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxKbT0iY3JlYXRlVmlkZW9Db250ZXh0IixLbT0iY3JlYXRlTWFwQ29udGV4dCIsWm09c2gsWG09ImNyZWF0ZUNhbnZhc0NvbnRleHQiLFFtPVt7bmFtZToiY2FudmFzSWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fV0sZV89ImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0Iix0Xz0iY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiLG5fPXNoLmNvbmNhdCh7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fSkscl89Wy41LC44LDEsMS4yNSwxLjUsMl07Y2xhc3MgVGZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1wbGF5KCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfXBhdXNlKCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX1zdG9wKCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNlZWsodCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOnR9KX1zZW5kRGFubXUodCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VuZERhbm11Iix0KX1wbGF5YmFja1JhdGUodCl7fnJfLmluZGV4T2YodCl8fCh0PTEpLFVuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXliYWNrUmF0ZSIse3JhdGU6dH0pfXJlcXVlc3RGdWxsU2NyZWVuKHQ9e30pe1VuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlcXVlc3RGdWxsU2NyZWVuIix0KX1leGl0RnVsbFNjcmVlbigpe1VuKHRoaXMuaWQsdGhpcy5wYWdlSWQsImV4aXRGdWxsU2NyZWVuIil9c2hvd1N0YXR1c0Jhcigpe1VuKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNob3dTdGF0dXNCYXIiKX1oaWRlU3RhdHVzQmFyKCl7VW4odGhpcy5pZCx0aGlzLnBhZ2VJZCwiaGlkZVN0YXR1c0JhciIpfX1sZXQgaV89RHQoSm0sKGUsdCk9PnQ/bmV3IFRmKGUsUW4odCkpOm5ldyBUZihlLFFuKExyKCkpKSksb189KGUsdCk9PntsZXQgbj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KG4pP2UuZmFpbCYmZS5mYWlsKHQpOmUuc3VjY2VzcyYmZS5zdWNjZXNzKHQpLGUuY29tcGxldGUmJmUuY29tcGxldGUodCl9LFFpPShlLHQsbixyKT0+e3ZpKGUsdCxuLHIscz0+e3ImJm9fKHIscyl9KX07Y2xhc3MgSWZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1nZXRDZW50ZXJMb2NhdGlvbih0KXtRaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9bW92ZVRvTG9jYXRpb24odCl7UWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwibW92ZVRvTG9jYXRpb24iLHQpfWdldFNjYWxlKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFNjYWxlIix0KX1nZXRSZWdpb24odCl7UWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0UmVnaW9uIix0KX1pbmNsdWRlUG9pbnRzKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluY2x1ZGVQb2ludHMiLHQpfXRyYW5zbGF0ZU1hcmtlcih0KXtRaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJ0cmFuc2xhdGVNYXJrZXIiLHQpfSRnZXRBcHBNYXAoKXtyZXR1cm4gbC5tYXBzLmdldE1hcEJ5SWQodGhpcy5wYWdlSWQrIi1tYXAtIit0aGlzLmlkKX1hZGRDdXN0b21MYXllcih0KXtRaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRDdXN0b21MYXllciIsdCl9cmVtb3ZlQ3VzdG9tTGF5ZXIodCl7UWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfWFkZEdyb3VuZE92ZXJsYXkodCl7UWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9cmVtb3ZlR3JvdW5kT3ZlcmxheSh0KXtRaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX11cGRhdGVHcm91bmRPdmVybGF5KHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfWluaXRNYXJrZXJDbHVzdGVyKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluaXRNYXJrZXJDbHVzdGVyIix0KX1hZGRNYXJrZXJzKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZE1hcmtlcnMiLHQpfXJlbW92ZU1hcmtlcnModCl7UWkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlTWFya2VycyIsdCl9bW92ZUFsb25nKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVBbG9uZyIsdCl9c2V0TG9jTWFya2VySWNvbih0KXtRaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZXRMb2NNYXJrZXJJY29uIix0KX1vcGVuTWFwQXBwKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm9wZW5NYXBBcHAiLHQpfW9uKHQpe1FpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm9uIix0KX19bGV0IGFfPUR0KEttLChlLHQpPT50P25ldyBJZihlLFFuKHQpKTpuZXcgSWYoZSxRbihMcigpKSksWm0pO2Z1bmN0aW9uIHdsKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7bj9yW2VdPU1hdGgucm91bmQobik6dHlwZW9mIHQhPSJ1bmRlZmluZWQiJiYocltlXT10KX19bGV0IGxoPXdsKCJ3aWR0aCIpLGNoPXdsKCJoZWlnaHQiKSxzXz0iY2FudmFzR2V0SW1hZ2VEYXRhIix1aD17Zm9ybWF0QXJnczp7eDp3bCgieCIpLHk6d2woInkiKSx3aWR0aDpsaCxoZWlnaHQ6Y2h9fSxmaD17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0saGVpZ2h0Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH19LGxfPSJjYW52YXNQdXRJbWFnZURhdGEiLGNfPXVoLHVfPUouZXh0ZW5kKHtkYXRhOnt0eXBlOlVpbnQ4Q2xhbXBlZEFycmF5LHJlcXVpcmVkOiEwfX0sZmgse2hlaWdodDp7dHlwZTpOdW1iZXJ9fSksZGg9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sZl89ImNhbnZhc1RvVGVtcEZpbGVQYXRoIixkXz17Zm9ybWF0QXJnczp7eDp3bCgieCIsMCkseTp3bCgieSIsMCksd2lkdGg6bGgsaGVpZ2h0OmNoLGRlc3RXaWR0aDp3bCgiZGVzdFdpZHRoIiksZGVzdEhlaWdodDp3bCgiZGVzdEhlaWdodCIpLGZpbGVUeXBlKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCk7bGV0IG49ZGhbZV07bnx8KG49ZGguUE5HKSx0LmZpbGVUeXBlPW59LHF1YWxpdHkoZSx0KXt0LnF1YWxpdHk9ZSYmZT4wJiZlPDE/ZToxfX19LGhfPXt4Ok51bWJlcix5Ok51bWJlcix3aWR0aDpOdW1iZXIsaGVpZ2h0Ok51bWJlcixkZXN0V2lkdGg6TnVtYmVyLGRlc3RIZWlnaHQ6TnVtYmVyLGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6U3RyaW5nLHF1YWxpdHk6TnVtYmVyfTtmdW5jdGlvbiBOdShlLHQsbixyLHMpe190Lmludm9rZVZpZXdNZXRob2QoYGNhbnZhcy4ke2V9YCx7dHlwZTpuLGRhdGE6cn0sdCx1PT57cyYmcyh1KX0pfXZhciBwXz1bInNjYWxlIiwicm90YXRlIiwidHJhbnNsYXRlIiwic2V0VHJhbnNmb3JtIiwidHJhbnNmb3JtIl0sZ189WyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0sdl89WyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXTtmdW5jdGlvbiBtXyhlLHQpe2xldCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIHIuZm9udD10LHIubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9bGV0IGhoPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiIsdHJhbnNwYXJlbnQ6IiMwMDAwMDAwMCJ9O2Z1bmN0aW9uIFBmKGUpe2U9ZXx8IiMwMDAwMDAiO3ZhciB0PW51bGw7aWYoKHQ9L14jKFswLTl8QS1GfGEtZl17Nn0pJC8uZXhlYyhlKSkhPW51bGwpe2xldCByPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHU9cGFyc2VJbnQodFsxXS5zbGljZSg0KSwxNik7cmV0dXJuW3Iscyx1LDI1NV19aWYoKHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkhPW51bGwpe2xldCByPXRbMV0uc2xpY2UoMCwxKSxzPXRbMV0uc2xpY2UoMSwyKSx1PXRbMV0uc2xpY2UoMiwzKTtyZXR1cm4gcj1wYXJzZUludChyK3IsMTYpLHM9cGFyc2VJbnQocytzLDE2KSx1PXBhcnNlSW50KHUrdSwxNiksW3Iscyx1LDI1NV19aWYoKHQ9L15yZ2JcKCguKylcKSQvLmV4ZWMoZSkpIT1udWxsKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLm1pbigyNTUscGFyc2VJbnQoci50cmltKCkpKX0pLmNvbmNhdCgyNTUpO2lmKCh0PS9ecmdiYVwoKC4rKVwpJC8uZXhlYyhlKSkhPW51bGwpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocixzKXtyZXR1cm4gcz09PTM/TWF0aC5mbG9vcigyNTUqcGFyc2VGbG9hdChyLnRyaW0oKSkpOk1hdGgubWluKDI1NSxwYXJzZUludChyLnRyaW0oKSkpfSk7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2lmKEouaGFzT3duKGhoLG4pKXt0PS9eIyhbMC05fEEtRnxhLWZdezYsOH0pJC8uZXhlYyhoaFtuXSk7bGV0IHI9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxzPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksdT1wYXJzZUludCh0WzFdLnNsaWNlKDQsNiksMTYpLGc9cGFyc2VJbnQodFsxXS5zbGljZSg2LDgpLDE2KTtyZXR1cm4gZz1nPj0wP2c6MjU1LFtyLHMsdSxnXX1yZXR1cm4gY29uc29sZS5lcnJvcigidW5zdXBwb3J0ZWQgY29sb3I6IitlKSxbMCwwLDAsMjU1XX1jbGFzcyBwaHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHlwZT10LHRoaXMuZGF0YT1uLHRoaXMuY29sb3JTdG9wPVtdfWFkZENvbG9yU3RvcCh0LG4pe3RoaXMuY29sb3JTdG9wLnB1c2goW3QsUGYobildKX19Y2xhc3MgX197Y29uc3RydWN0b3IodCxuKXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT10LHRoaXMuY29sb3JTdG9wPW59fWNsYXNzIGJfe2NvbnN0cnVjdG9yKHQpe3RoaXMud2lkdGg9dH19Y2xhc3MgaXV7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bix0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmRyYXdpbmdTdGF0ZT1bXSx0aGlzLnN0YXRlPXtsaW5lRGFzaDpbMCwwXSxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLHNoYWRvd0JsdXI6MCxzaGFkb3dDb2xvcjpbMCwwLDAsMF0sZm9udDoiMTBweCBzYW5zLXNlcmlmIixmb250U2l6ZToxMCxmb250V2VpZ2h0OiJub3JtYWwiLGZvbnRTdHlsZToibm9ybWFsIixmb250RmFtaWx5OiJzYW5zLXNlcmlmIn19ZHJhdyh0PSExLG4pe3ZhciByPVsuLi50aGlzLmFjdGlvbnNdO3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sTnUodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTp0fSxuKX1jcmVhdGVMaW5lYXJHcmFkaWVudCh0LG4scixzKXtyZXR1cm4gbmV3IHBoKCJsaW5lYXIiLFt0LG4scixzXSl9Y3JlYXRlQ2lyY3VsYXJHcmFkaWVudCh0LG4scil7cmV0dXJuIG5ldyBwaCgicmFkaWFsIixbdCxuLHJdKX1jcmVhdGVQYXR0ZXJuKHQsbil7aWYobj09PXZvaWQgMCljb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnY3JlYXRlUGF0dGVybicgb24gJ0NhbnZhc0NvbnRleHQnOiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMSBwcmVzZW50LiIpO2Vsc2UgaWYoWyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Il0uaW5kZXhPZihuKTwwKWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIituKyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKTtlbHNlIHJldHVybiBuZXcgX18odCxuKX1tZWFzdXJlVGV4dCh0KXtsZXQgbj10aGlzLnN0YXRlLmZvbnQscj0wO3tsZXQgcz1sLndlYnZpZXcuYWxsKCkuZmluZCh1PT51LmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKSk7cyYmKHI9TnVtYmVyKHMuZXZhbEpTU3luYyhgKCR7bV8udG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkodCl9LCR7SlNPTi5zdHJpbmdpZnkobil9KWApKSl9cmV0dXJuIG5ldyBiXyhyKX1zYXZlKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2F2ZSIsZGF0YTpbXX0pLHRoaXMuZHJhd2luZ1N0YXRlLnB1c2godGhpcy5zdGF0ZSl9cmVzdG9yZSgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fWJlZ2luUGF0aCgpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9bW92ZVRvKHQsbil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoibW92ZVRvIixkYXRhOlt0LG5dfSksdGhpcy5zdWJwYXRoPVtbdCxuXV19bGluZVRvKHQsbil7dGhpcy5wYXRoLmxlbmd0aD09PTAmJnRoaXMuc3VicGF0aC5sZW5ndGg9PT0wP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbdCxuXX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbdCxuXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt0LG5dKX1xdWFkcmF0aWNDdXJ2ZVRvKHQsbixyLHMpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W3QsbixyLHNdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isc10pfWJlemllckN1cnZlVG8odCxuLHIscyx1LGcpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImJlemllckN1cnZlVG8iLGRhdGE6W3QsbixyLHMsdSxnXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt1LGddKX1hcmModCxuLHIscyx1LGc9ITEpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyYyIsZGF0YTpbdCxuLHIscyx1LGddfSksdGhpcy5zdWJwYXRoLnB1c2goW3Qsbl0pfXJlY3QodCxuLHIscyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbdCxuLHIsc119KSx0aGlzLnN1YnBhdGg9W1t0LG5dXX1hcmNUbyh0LG4scixzLHUpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOlt0LG4scixzLHVdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isc10pfWNsaXAoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJjbGlwIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9Y2xvc2VQYXRoKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX1jbGVhckFjdGlvbnMoKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX1nZXRBY3Rpb25zKCl7dmFyIHQ9Wy4uLnRoaXMuYWN0aW9uc107cmV0dXJuIHRoaXMuY2xlYXJBY3Rpb25zKCksdH1zZXQgbGluZURhc2hPZmZzZXQodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W3RdfSl9c2V0IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W3RdfSl9c2V0IHNoYWRvd0JsdXIodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Qmx1ciIsZGF0YTpbdF19KX1zZXQgc2hhZG93Q29sb3IodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd09mZnNldFgodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbdF19KX1zZXQgc2hhZG93T2Zmc2V0WSh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dPZmZzZXRZIixkYXRhOlt0XX0pfXNldCBmb250KHQpe3ZhciBuPXRoaXM7dGhpcy5zdGF0ZS5mb250PXQ7dmFyIHI9dC5tYXRjaCgvXigoW1x3XC1dK1xzKSopKFxkK3I/cHgpKFwvKFxkK1wuP1xkKihyP3B4KT8pKT9ccysoLiopLyk7aWYocil7dmFyIHM9clsxXS50cmltKCkuc3BsaXQoL1xzLyksdT1wYXJzZUZsb2F0KHJbM10pLGc9cls3XSxFPVtdO3MuZm9yRWFjaChmdW5jdGlvbihQLEwpe1siaXRhbGljIiwib2JsaXF1ZSIsIm5vcm1hbCJdLmluZGV4T2YoUCk+LTE/KEUucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6W1BdfSksbi5zdGF0ZS5mb250U3R5bGU9UCk6WyJib2xkIiwibm9ybWFsIl0uaW5kZXhPZihQKT4tMT8oRS5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6W1BdfSksbi5zdGF0ZS5mb250V2VpZ2h0PVApOkw9PT0wPyhFLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRTdHlsZT0ibm9ybWFsIik6TD09PTEmJlUoKX0pLHMubGVuZ3RoPT09MSYmVSgpLHM9RS5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFAuZGF0YVswXX0pLmpvaW4oIiAiKSx0aGlzLnN0YXRlLmZvbnRTaXplPXUsdGhpcy5zdGF0ZS5mb250RmFtaWx5PWcsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0Rm9udCIsZGF0YTpbYCR7c30gJHt1fXB4ICR7Z31gXX0pfWVsc2UgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gc2V0ICdmb250JyBvbiAnQ2FudmFzQ29udGV4dCc6IGludmFsaWQgZm9ybWF0LiIpO2Z1bmN0aW9uIFUoKXtFLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250V2VpZ2h0PSJub3JtYWwifX1nZXQgZm9udCgpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9c2V0IGZpbGxTdHlsZSh0KXt0aGlzLnNldEZpbGxTdHlsZSh0KX1zZXQgc3Ryb2tlU3R5bGUodCl7dGhpcy5zZXRTdHJva2VTdHlsZSh0KX1zZXQgZ2xvYmFsQWxwaGEodCl7dD1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHQpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbdF19KX1zZXQgdGV4dEFsaWduKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbdF19KX1zZXQgbGluZUNhcCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lQ2FwIixkYXRhOlt0XX0pfXNldCBsaW5lSm9pbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbdF19KX1zZXQgbGluZVdpZHRoKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbdF19KX1zZXQgbWl0ZXJMaW1pdCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRNaXRlckxpbWl0IixkYXRhOlt0XX0pfXNldCB0ZXh0QmFzZWxpbmUodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOlt0XX0pfX1sZXQgeV89cmUub25jZSgoKT0+e1suLi5wXywuLi5nX10uZm9yRWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3N3aXRjaChuKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4rIlBhdGgiLGRhdGE6Wy4uLnRoaXMucGF0aF19KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LGcpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltyLHMsdSxnXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LGcpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W3Iscyx1LGddfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24ocixzLHUsZyl7dmFyIEU9W3IudG9TdHJpbmcoKSxzLHVdO3R5cGVvZiBnPT0ibnVtYmVyIiYmRS5wdXNoKGcpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOkV9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihyLHMsdSxnLEUsVSxQLEwsT2Upe09lPT09dm9pZCAwJiYoVT1zLFA9dSxMPWcsT2U9RSxzPXZvaWQgMCx1PXZvaWQgMCxnPXZvaWQgMCxFPXZvaWQgMCk7dmFyIFBlO2Z1bmN0aW9uIFJlKGh0KXtyZXR1cm4gdHlwZW9mIGh0PT0ibnVtYmVyIn1QZT1SZShzKSYmUmUodSkmJlJlKGcpJiZSZShFKT9bcixVLFAsTCxPZSxzLHUsZyxFXTpSZShMKSYmUmUoT2UpP1tyLFUsUCxMLE9lXTpbcixVLFBdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOlBlfSl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKC4uLnIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOnJ9KX19fWl1LnByb3RvdHlwZVtlXT10KGUpfSksdl8uZm9yRWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3N3aXRjaChuKXtjYXNlInNldEZpbGxTdHlsZSI6Y2FzZSJzZXRTdHJva2VTdHlsZSI6cmV0dXJuIGZ1bmN0aW9uKHIpe3R5cGVvZiByIT0ib2JqZWN0Ij90aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbIm5vcm1hbCIsUGYocildfSk6dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3IudHlwZSxyLmRhdGEsci5jb2xvclN0b3BdfSl9O2Nhc2Uic2V0R2xvYmFsQWxwaGEiOnJldHVybiBmdW5jdGlvbihyKXtyPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQocikpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyXX0pfTtjYXNlInNldFNoYWRvdyI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LGcpe2c9UGYoZyksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3Iscyx1LGddfSksdGhpcy5zdGF0ZS5zaGFkb3dCbHVyPXUsdGhpcy5zdGF0ZS5zaGFkb3dDb2xvcj1nLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WD1yLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WT1zfTtjYXNlInNldExpbmVEYXNoIjpyZXR1cm4gZnVuY3Rpb24ocixzKXtyPXJ8fFswLDBdLHM9c3x8MCx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcixzXX0pLHRoaXMuc3RhdGUubGluZURhc2g9cn07Y2FzZSJzZXRGb250U2l6ZSI6cmV0dXJuIGZ1bmN0aW9uKHIpe3RoaXMuc3RhdGUuZm9udD10aGlzLnN0YXRlLmZvbnQucmVwbGFjZSgvXGQrXC4/XGQqcHgvLHIrInB4IiksdGhpcy5zdGF0ZS5mb250U2l6ZT1yLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyXX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbiguLi5yKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpyfSl9fX1pdS5wcm90b3R5cGVbZV09dChlKX0pfSksRV89RHQoWG0sKGUsdCk9PntpZih5XygpLHQpcmV0dXJuIG5ldyBpdShlLFFuKHQpKTtsZXQgbj1RbihMcigpKTtpZihuKXJldHVybiBuZXcgaXUoZSxuKTtfdC5lbWl0KHJlLk9OX0VSUk9SLCJjcmVhdGVDYW52YXNDb250ZXh0OmZhaWwiKX0sUW0pLHdfPWtlKHNfLCh7Y2FudmFzSWQ6ZSx4OnQseTpuLHdpZHRoOnIsaGVpZ2h0OnN9LHtyZXNvbHZlOnUscmVqZWN0Omd9KT0+e2xldCBFPVFuKExyKCkpO2lmKCFFKXtnKCk7cmV0dXJufWZ1bmN0aW9uIFUoUCl7aWYoUC5lcnJNc2cmJlAuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtnKCIiLFApO3JldHVybn1sZXQgTD1QLmRhdGE7TCYmTC5sZW5ndGgmJihQLmNvbXByZXNzZWQmJihMPVpkLmluZmxhdGVSYXcoTCkpLFAuZGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoTCkpLGRlbGV0ZSBQLmNvbXByZXNzZWQsdShQKX1OdShlLEUsImdldEltYWdlRGF0YSIse3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6c30sVSl9LGZoLHVoKSxTXz1rZShsXywoe2NhbnZhc0lkOmUsZGF0YTp0LHg6bix5OnIsd2lkdGg6cyxoZWlnaHQ6dX0se3Jlc29sdmU6ZyxyZWplY3Q6RX0pPT57dmFyIFU9UW4oTHIoKSk7aWYoIVUpe0UoKTtyZXR1cm59bGV0IFAsTD0oKT0+e051KGUsVSwicHV0SW1hZ2VEYXRhIix7ZGF0YTp0LHg6bix5OnIsd2lkdGg6cyxoZWlnaHQ6dSxjb21wcmVzc2VkOlB9LE9lPT57aWYoT2UuZXJyTXNnJiZPZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpe0UoKTtyZXR1cm59ZyhPZSl9KX07bC5vcy5uYW1lIT09ImlPUyJ8fHR5cGVvZiBfX1dFRVhfREVWVE9PTF9fPT0iYm9vbGVhbiI/KHQ9WmQuZGVmbGF0ZVJhdyh0LHt0bzoic3RyaW5nIn0pLFA9ITApOnQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCksTCgpfSx1XyxjXyksQ189a2UoZl8sKHt4OmU9MCx5OnQ9MCx3aWR0aDpuLGhlaWdodDpyLGRlc3RXaWR0aDpzLGRlc3RIZWlnaHQ6dSxjYW52YXNJZDpnLGZpbGVUeXBlOkUscXVhbGl0eTpVfSx7cmVzb2x2ZTpQLHJlamVjdDpMfSk9Pnt2YXIgT2U9UW4oTHIoKSk7aWYoIU9lKXtMKCk7cmV0dXJufWxldCBQZT1gJHtuaX0vY2FudmFzYDtOdShnLE9lLCJ0b1RlbXBGaWxlUGF0aCIse3g6ZSx5OnQsd2lkdGg6bixoZWlnaHQ6cixkZXN0V2lkdGg6cyxkZXN0SGVpZ2h0OnUsZmlsZVR5cGU6RSxxdWFsaXR5OlUsZGlybmFtZTpQZX0sUmU9PntpZihSZS5lcnJNc2cmJlJlLmVyck1zZy5pbmRleE9mKCJmYWlsIikhPT0tMSl7TCgiIixSZSk7cmV0dXJufVAoUmUpfSl9LGhfLGRfKSxnaD1bIm9uQ2FucGxheSIsIm9uUGxheSIsIm9uUGF1c2UiLCJvblN0b3AiLCJvbkVuZGVkIiwib25UaW1lVXBkYXRlIiwib25FcnJvciIsIm9uV2FpdGluZyIsIm9uU2Vla2luZyIsIm9uU2Vla2VkIl0sT189WyJvZmZDYW5wbGF5Iiwib2ZmUGxheSIsIm9mZlBhdXNlIiwib2ZmU3RvcCIsIm9mZkVuZGVkIiwib2ZmVGltZVVwZGF0ZSIsIm9mZkVycm9yIiwib2ZmV2FpdGluZyIsIm9mZlNlZWtpbmciLCJvZmZTZWVrZWQiXSxBXz17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0sVF89WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSxJXz0xO2Z1bmN0aW9uIHZoKGU9e30pe3JldHVybiBUXy5tYXAodD0+YCR7TnVtYmVyKGVbdF0pfHwwfXB4YCkuam9pbigiICIpfWNsYXNzIG1oe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5fcGFnZUlkPVFuKHQpLHRoaXMuX2NvbXBvbmVudD10LHRoaXMuX29wdGlvbnM9Si5leHRlbmQoe30sQV8sbil9cmVsYXRpdmVUbyh0LG4pe3JldHVybiB0aGlzLl9vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj10LHRoaXMuX29wdGlvbnMucm9vdE1hcmdpbj12aChuKSx0aGlzfXJlbGF0aXZlVG9WaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9dm9pZCAwLHRoaXMuX29wdGlvbnMucm9vdE1hcmdpbj12aCh0KSx0aGlzfW9ic2VydmUodCxuKXshSi5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fb3B0aW9ucy5zZWxlY3Rvcj10LHRoaXMuX3JlcUlkPUlfKyssdGkoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnQsb3B0aW9uczp0aGlzLl9vcHRpb25zLGNhbGxiYWNrOm59LHRoaXMuX3BhZ2VJZCkpfWRpc2Nvbm5lY3QoKXt0aGlzLl9yZXFJZCYmJHIoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnR9LHRoaXMuX3BhZ2VJZCl9fWxldCBQXz1EdCgiY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLChlLHQpPT4oZT1yZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIVFuKGUpJiYodD1lLGU9bnVsbCksZT9uZXcgbWgoZSx0KTpuZXcgbWgoTHIoKSx0KSkpLE5fPTE7Y2xhc3MgX2h7Y29uc3RydWN0b3IodCl7dGhpcy5fcGFnZUlkPXQuJHBhZ2UmJnQuJHBhZ2UuaWQsdGhpcy5fY29tcG9uZW50PXR9b2JzZXJ2ZSh0LG4peyFKLmlzRnVuY3Rpb24obil8fCh0aGlzLl9yZXFJZD1OXysrLFBpKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50LG9wdGlvbnM6dCxjYWxsYmFjazpufSx0aGlzLl9wYWdlSWQpKX1kaXNjb25uZWN0KCl7dGhpcy5fcmVxSWQmJkVzKHtyZXFJZDp0aGlzLl9yZXFJZCxjb21wb25lbnQ6dGhpcy5fY29tcG9uZW50fSx0aGlzLl9wYWdlSWQpfX1sZXQga189RHQoImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsZT0+KGU9cmUucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKGUpLGUmJiFRbihlKSYmKGU9bnVsbCksZT9uZXcgX2goZSk6bmV3IF9oKExyKCkpKSksUl89MCxOZj17fTtmdW5jdGlvbiB4XyhlLHQsbixyKXtsZXQgcz17b3B0aW9uczpyfSx1PXImJigic3VjY2VzcyJpbiByfHwiZmFpbCJpbiByfHwiY29tcGxldGUiaW4gcik7aWYodSl7bGV0IGc9U3RyaW5nKFJfKyspO3MuY2FsbGJhY2tJZD1nLE5mW2ddPXJ9X3QuaW52b2tlVmlld01ldGhvZChgZWRpdG9yLiR7ZX1gLHt0eXBlOm4sZGF0YTpzfSx0LCh7Y2FsbGJhY2tJZDpnLGRhdGE6RX0pPT57dSYmKHJlLmNhbGxPcHRpb25zKE5mW2ddLEUpLGRlbGV0ZSBOZltnXSl9KX1jbGFzcyBCX3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLnBhZ2VJZD1ufWZvcm1hdCh0LG4pe3RoaXMuX2V4ZWMoImZvcm1hdCIse25hbWU6dCx2YWx1ZTpufSl9aW5zZXJ0RGl2aWRlcigpe3RoaXMuX2V4ZWMoImluc2VydERpdmlkZXIiKX1pbnNlcnRJbWFnZSh0KXt0aGlzLl9leGVjKCJpbnNlcnRJbWFnZSIsdCl9aW5zZXJ0VGV4dCh0KXt0aGlzLl9leGVjKCJpbnNlcnRUZXh0Iix0KX1zZXRDb250ZW50cyh0KXt0aGlzLl9leGVjKCJzZXRDb250ZW50cyIsdCl9Z2V0Q29udGVudHModCl7dGhpcy5fZXhlYygiZ2V0Q29udGVudHMiLHQpfWNsZWFyKHQpe3RoaXMuX2V4ZWMoImNsZWFyIix0KX1yZW1vdmVGb3JtYXQodCl7dGhpcy5fZXhlYygicmVtb3ZlRm9ybWF0Iix0KX11bmRvKHQpe3RoaXMuX2V4ZWMoInVuZG8iLHQpfXJlZG8odCl7dGhpcy5fZXhlYygicmVkbyIsdCl9Ymx1cih0KXt0aGlzLl9leGVjKCJibHVyIix0KX1nZXRTZWxlY3Rpb25UZXh0KHQpe3RoaXMuX2V4ZWMoImdldFNlbGVjdGlvblRleHQiLHQpfXNjcm9sbEludG9WaWV3KHQpe3RoaXMuX2V4ZWMoInNjcm9sbEludG9WaWV3Iix0KX1fZXhlYyh0LG4pe3hfKHRoaXMuaWQsdGhpcy5wYWdlSWQsdCxuKX19bGV0IE1fPXtjYW52YXM6aXUsbWFwOklmLHZpZGVvOlRmLGVkaXRvcjpCX307ZnVuY3Rpb24gYmgoZSl7aWYoZSYmZS5jb250ZXh0SW5mbyl7bGV0e2lkOnQsdHlwZTpuLHBhZ2U6cn09ZS5jb250ZXh0SW5mbyxzPU1fW25dO2UuY29udGV4dD1uZXcgcyh0LHIpLGRlbGV0ZSBlLmNvbnRleHRJbmZvfX1jbGFzcyBrZntjb25zdHJ1Y3Rvcih0LG4scixzKXt0aGlzLl9zZWxlY3RvclF1ZXJ5PXQsdGhpcy5fY29tcG9uZW50PW4sdGhpcy5fc2VsZWN0b3I9cix0aGlzLl9zaW5nbGU9c31ib3VuZGluZ0NsaWVudFJlY3QodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxyZWN0OiEwLHNpemU6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9ZmllbGRzKHQsbil7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx0LG4pLHRoaXMuX3NlbGVjdG9yUXVlcnl9c2Nyb2xsT2Zmc2V0KHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAsc2Nyb2xsT2Zmc2V0OiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fWNvbnRleHQodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7Y29udGV4dDohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1ub2RlKHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5fX1jbGFzcyBEX3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jb21wb25lbnQ9dm9pZCAwLHRoaXMuX3BhZ2U9dCx0aGlzLl9xdWV1ZT1bXSx0aGlzLl9xdWV1ZUNiPVtdfWV4ZWModCl7cmV0dXJuIFpyKHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsbj0+e2xldCByPXRoaXMuX3F1ZXVlQ2I7bi5mb3JFYWNoKChzLHUpPT57Si5pc0FycmF5KHMpP3MuZm9yRWFjaChiaCk6Ymgocyk7bGV0IGc9clt1XTtKLmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLHMpfSksSi5pc0Z1bmN0aW9uKHQpJiZ0LmNhbGwodGhpcyxuKX0pLHRoaXMuX25vZGVzUmVmfWluKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnQ9cmUucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKHQpLHRoaXN9c2VsZWN0KHQpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcga2YodGhpcyx0aGlzLl9jb21wb25lbnQsdCwhMCl9c2VsZWN0QWxsKHQpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcga2YodGhpcyx0aGlzLl9jb21wb25lbnQsdCwhMSl9c2VsZWN0Vmlld3BvcnQoKXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IGtmKHRoaXMsbnVsbCwiIiwhMCl9X3B1c2godCxuLHIscyx1KXt0aGlzLl9xdWV1ZS5wdXNoKHtjb21wb25lbnQ6bixzZWxlY3Rvcjp0LHNpbmdsZTpyLGZpZWxkczpzfSksdGhpcy5fcXVldWVDYi5wdXNoKHUpfX1sZXQgTF89RHQoImNyZWF0ZVNlbGVjdG9yUXVlcnkiLGU9PihlPXJlLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhUW4oZSkmJihlPW51bGwpLG5ldyBEXyhlfHxMcigpKSkpLEZfPSJjcmVhdGVBbmltYXRpb24iLFZfPXtmb3JtYXRBcmdzOnt9fSxVXz17ZHVyYXRpb246TnVtYmVyLHRpbWluZ0Z1bmN0aW9uOlN0cmluZyxkZWxheTpOdW1iZXIsdHJhbnNmb3JtT3JpZ2luOlN0cmluZ30sJF89e2R1cmF0aW9uOjQwMCx0aW1pbmdGdW5jdGlvbjoibGluZWFyIixkZWxheTowLHRyYW5zZm9ybU9yaWdpbjoiNTAlIDUwJSAwIn07Y2xhc3MgeWh7Y29uc3RydWN0b3IodCl7dGhpcy5hY3Rpb25zPVtdLHRoaXMuY3VycmVudFRyYW5zZm9ybT17fSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpcy5vcHRpb249Si5leHRlbmQoe30sJF8sdCl9X2dldE9wdGlvbih0KXtsZXQgbj17dHJhbnNpdGlvbjpKLmV4dGVuZCh7fSx0aGlzLm9wdGlvbix0KSx0cmFuc2Zvcm1PcmlnaW46IiJ9O3JldHVybiBuLnRyYW5zZm9ybU9yaWdpbj1uLnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLGRlbGV0ZSBuLnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLG59X3B1c2hBbmltYXRlcyh0LG4pe3RoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5wdXNoKHt0eXBlOnQsYXJnczpufSl9X2NvbnZlclR5cGUodCl7cmV0dXJuIHQucmVwbGFjZSgvW0EtWl0vZyxuPT5gLSR7bi50b0xvd2VyQ2FzZSgpfWApfV9nZXRWYWx1ZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP2Ake3R9cHhgOnR9ZXhwb3J0KCl7bGV0IHQ9dGhpcy5hY3Rpb25zO3JldHVybiB0aGlzLmFjdGlvbnM9W10se2FjdGlvbnM6dH19c3RlcCh0KXtyZXR1cm4gdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLmZvckVhY2gobj0+e24udHlwZSE9PSJzdHlsZSI/dGhpcy5jdXJyZW50VHJhbnNmb3JtW24udHlwZV09bjp0aGlzLmN1cnJlbnRUcmFuc2Zvcm1bYCR7bi50eXBlfS4ke24uYXJnc1swXX1gXT1ufSksdGhpcy5hY3Rpb25zLnB1c2goe2FuaW1hdGVzOk9iamVjdC52YWx1ZXModGhpcy5jdXJyZW50VHJhbnNmb3JtKSxvcHRpb246dGhpcy5fZ2V0T3B0aW9uKHQpfSksdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXN9fWxldCBIXz1yZS5vbmNlKCgpPT57bGV0IGU9WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLHQ9WyJvcGFjaXR5IiwiYmFja2dyb3VuZENvbG9yIl0sbj1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07ZS5jb25jYXQodCxuKS5mb3JFYWNoKHI9Pnt5aC5wcm90b3R5cGVbcl09ZnVuY3Rpb24oLi4ucyl7cmV0dXJuIHQuY29uY2F0KG4pLmluY2x1ZGVzKHIpP3RoaXMuX3B1c2hBbmltYXRlcygic3R5bGUiLFt0aGlzLl9jb252ZXJUeXBlKHIpLG4uaW5jbHVkZXMocik/dGhpcy5fZ2V0VmFsdWUoc1swXSk6c1swXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhyLHMpLHRoaXN9fSl9KSxqXz1EdChGXyxlPT4oSF8oKSxuZXcgeWgoZSkpLFVfLFZfKSxFaD0ib25UYWJCYXJNaWRCdXR0b25UYXAiLHpfPUtuKEVoLCgpPT57fSksV189Im9uV2luZG93UmVzaXplIixHXz0ib2ZmV2luZG93UmVzaXplIixZXz1LbihXXywoKT0+e30pLHFfPUtyKEdfLCgpPT57fSksd2g9InNldExvY2FsZSIsSl89ImdldExvY2FsZSIsU2g9Im9uTG9jYWxlQ2hhbmdlIixvdT1EdChKXywoKT0+e2xldCBlPU50KHthbGxvd0RlZmF1bHQ6ITB9KTtyZXR1cm4gZSYmZS4kdm0/ZS4kdm0uJGxvY2FsZTpsZSgpLmdldExvY2FsZSgpfSksS189S24oU2gsKCk9Pnt9KSxaXz1EdCh3aCxlPT57bGV0IHQ9TnQoKTtyZXR1cm4gdCYmdC4kdm0uJGxvY2FsZSE9PWU/KHQuJHZtLiRsb2NhbGU9ZSxqbigpLmZvckVhY2gocz0+e190LnB1Ymxpc2hIYW5kbGVyKHdoLGUscy4kcGFnZS5pZCl9KSx2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZShlKSxfdC5pbnZva2VPbkNhbGxiYWNrKFNoLHtsb2NhbGU6ZX0pLCEwKTohMX0pLFhfPWtlKCJzZXRQYWdlTWV0YSIsKGUse3Jlc29sdmU6dH0pPT57dChnYShMcigpLGUpKX0pLENoPSJnZXRTZWxlY3RlZFRleHRSYW5nZSIsUV89a2UoQ2gsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57X3QuaW52b2tlVmlld01ldGhvZChDaCx7fSxOYSgpLHI9Pnt0eXBlb2Ygci5lbmQ9PSJ1bmRlZmluZWQiJiZ0eXBlb2Ygci5zdGFydD09InVuZGVmaW5lZCI/bigibm8gZm9jdXNlZCIpOnQocil9KX0pLGt1PXtbcmUuT05fVU5IQU5ETEVfUkVKRUNUSU9OXTpbXSxbcmUuT05fUEFHRV9OT1RfRk9VTkRdOltdLFtyZS5PTl9FUlJPUl06W10sW3JlLk9OX1NIT1ddOltdLFtyZS5PTl9ISURFXTpbXX07ZnVuY3Rpb24gYXUoZSx0KXtsZXQgbj1OdCh7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIERuLmluamVjdEhvb2soZSx0LG4uJHZtLiQpO2t1W2VdLnB1c2godCl9ZnVuY3Rpb24gZWIoZSl7T2JqZWN0LmtleXMoa3UpLmZvckVhY2godD0+e2t1W3RdLmZvckVhY2gobj0+e0RuLmluamVjdEhvb2sodCxuLGUpfSl9KX1mdW5jdGlvbiBzdShlLHQpe2xldCBuPU50KHthbGxvd0RlZmF1bHQ6ITB9KTtpZihuJiZuLiR2bSlyZXR1cm4gTmwobi4kdm0sZSx0KTtKLnJlbW92ZShrdVtlXSx0KX1mdW5jdGlvbiB0YihlKXthdShyZS5PTl9VTkhBTkRMRV9SRUpFQ1RJT04sZSl9ZnVuY3Rpb24gbmIoZSl7c3UocmUuT05fVU5IQU5ETEVfUkVKRUNUSU9OLGUpfWZ1bmN0aW9uIHJiKGUpe2F1KHJlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIGliKGUpe3N1KHJlLk9OX1BBR0VfTk9UX0ZPVU5ELGUpfWZ1bmN0aW9uIG9iKGUpe2F1KHJlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIGFiKGUpe3N1KHJlLk9OX0VSUk9SLGUpfWZ1bmN0aW9uIHNiKGUpe2F1KHJlLk9OX1NIT1csZSl9ZnVuY3Rpb24gbGIoZSl7c3UocmUuT05fU0hPVyxlKX1mdW5jdGlvbiBjYihlKXthdShyZS5PTl9ISURFLGUpfWZ1bmN0aW9uIHViKGUpe3N1KHJlLk9OX0hJREUsZSl9bGV0IGZiPUR0KCJnZXRFbnRlck9wdGlvbnNTeW5jIiwoKT0+VW8oKSksZGI9RHQoImdldExhdW5jaE9wdGlvbnNTeW5jIiwoKT0+d3MoKSksbHUsUmYseGYsT2g7ZnVuY3Rpb24gQWgoZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBCZihlKXtpZihlLnR5cGU9PT0iZW5hYmxlZCIpeGY9ITAsT2g9ZS5vZmZsaW5lO2Vsc2UgaWYoZS50eXBlPT09ImNsaWVudElkIilsdT1lLmNpZCxSZj1lLmVyck1zZyxUaChsdSxlLmVyck1zZyk7ZWxzZSBpZihlLnR5cGU9PT0icHVzaE1zZyIpe2xldCB0PXt0eXBlOiJyZWNlaXZlIixkYXRhOkFoKGUubWVzc2FnZSl9O2ZvcihsZXQgbj0wO248U2wubGVuZ3RoJiYoU2xbbl0odCksIXQuc3RvcHBlZCk7bisrKTt9ZWxzZSBlLnR5cGU9PT0iY2xpY2siJiZTbC5mb3JFYWNoKHQ9Pnt0KHt0eXBlOiJjbGljayIsZGF0YTpBaChlLm1lc3NhZ2UpfSl9KX1sZXQgTWY9W107ZnVuY3Rpb24gVGgoZSx0KXtNZi5mb3JFYWNoKG49PntuKGUsdCl9KSxNZi5sZW5ndGg9MH1sZXQgaGI9a2UoImdldFB1c2hDbGllbnRJZCIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57aWYoT2gpe2wucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMocj0+e3Qoe2NpZDpyLmNsaWVudGlkfSl9LHI9PntuKHIuY29kZSsiOiAiK3IubWVzc2FnZSl9KTtyZXR1cm59UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3R5cGVvZiB4Zj09InVuZGVmaW5lZCImJih4Zj0hMSxsdT0iIixSZj0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLE1mLnB1c2goKHIscyk9PntyP3Qoe2NpZDpyfSk6bihzKX0pLHR5cGVvZiBsdSE9InVuZGVmaW5lZCImJlRoKGx1LFJmKX0pfSksU2w9W10sSWg9ITEscGI9ZT0+e1NsLmluZGV4T2YoZSk9PT0tMSYmU2wucHVzaChlKSxJaHx8KEloPSEwLGwucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdD0+e0JmKHt0eXBlOiJjbGljayIsbWVzc2FnZTp0fSl9KSxsLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsdD0+e0JmKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOnR9KX0pKX0sZ2I9ZT0+e2lmKCFlKVNsLmxlbmd0aD0wO2Vsc2V7bGV0IHQ9U2wuaW5kZXhPZihlKTt0Pi0xJiZTbC5zcGxpY2UodCwxKX19LHZiPSJjYW5JVXNlIixtYj1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxfYj0iZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsYmI9Im1ha2VQaG9uZUNhbGwiLHliPXtwaG9uZU51bWJlcjpTdHJpbmd9LEViPSJhZGRQaG9uZUNvbnRhY3QiLHdiPXtmb3JtYXRBcmdzOntmaXJzdE5hbWUoZSl7aWYoIWUpcmV0dXJuImFkZFBob25lQ29udGFjdDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmZpcnN0TmFtZSBzaG91bGQgbm90IGJlIGVtcHR5OyJ9fX0sU2I9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHBob3RvRmlsZVBhdGg6U3RyaW5nLG5pY2tOYW1lOlN0cmluZyxsYXN0TmFtZTpTdHJpbmcsbWlkZGxlTmFtZTpTdHJpbmcscmVtYXJrOlN0cmluZyxtb2JpbGVQaG9uZU51bWJlcjpTdHJpbmcsd2VDaGF0TnVtYmVyOlN0cmluZyxhZGRyZXNzQ291bnRyeTpTdHJpbmcsYWRkcmVzc1N0YXRlOlN0cmluZyxhZGRyZXNzQ2l0eTpTdHJpbmcsYWRkcmVzc1N0cmVldDpTdHJpbmcsYWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLG9yZ2FuaXphdGlvbjpTdHJpbmcsdGl0bGU6U3RyaW5nLHdvcmtGYXhOdW1iZXI6U3RyaW5nLHdvcmtQaG9uZU51bWJlcjpTdHJpbmcsaG9zdE51bWJlcjpTdHJpbmcsZW1haWw6U3RyaW5nLHVybDpTdHJpbmcsd29ya0FkZHJlc3NDb3VudHJ5OlN0cmluZyx3b3JrQWRkcmVzc1N0YXRlOlN0cmluZyx3b3JrQWRkcmVzc0NpdHk6U3RyaW5nLHdvcmtBZGRyZXNzU3RyZWV0OlN0cmluZyx3b3JrQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nLGhvbWVGYXhOdW1iZXI6U3RyaW5nLGhvbWVQaG9uZU51bWJlcjpTdHJpbmcsaG9tZUFkZHJlc3NDb3VudHJ5OlN0cmluZyxob21lQWRkcmVzc1N0YXRlOlN0cmluZyxob21lQWRkcmVzc0NpdHk6U3RyaW5nLGhvbWVBZGRyZXNzU3RyZWV0OlN0cmluZyxob21lQWRkcmVzc1Bvc3RhbENvZGU6U3RyaW5nfSxDYj0iZ2V0Q2xpcGJvYXJkRGF0YSIsT2I9InNldENsaXBib2FyZERhdGEiLEFiPXtmb3JtYXRBcmdzOntzaG93VG9hc3Q6ITB9LGJlZm9yZUludm9rZSgpe3p0KCl9LGJlZm9yZVN1Y2Nlc3MoZSx0KXtpZighdC5zaG93VG9hc3QpcmV0dXJuO2xldHt0Om59PWxlKCkscj1uKCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7ciYmTy5zaG93VG9hc3Qoe3RpdGxlOnIsaWNvbjoic3VjY2VzcyIsbWFzazohMX0pfX0sVGI9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbn19LFBoPSJvbkFjY2VsZXJvbWV0ZXIiLEliPSJvZmZBY2NlbGVyb21ldGVyIixQYj0ic3RhcnRBY2NlbGVyb21ldGVyIixOYj0ic3RvcEFjY2VsZXJvbWV0ZXIiLE5oPSJvbkNvbXBhc3MiLGtiPSJvZmZDb21wYXNzIixSYj0ic3RhcnRDb21wYXNzIix4Yj0ic3RvcENvbXBhc3MiLEJiPSJ2aWJyYXRlU2hvcnQiLE1iPSJ2aWJyYXRlTG9uZyIsa2g9Im9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLFJoPSJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIseGg9Im9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIixCaD0ib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixEYj0ic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixMYj17c2VydmljZXM6QXJyYXksYWxsb3dEdXBsaWNhdGVzS2V5OkJvb2xlYW4saW50ZXJ2YWw6TnVtYmVyfSxGYj0iZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsVmI9e3NlcnZpY2VzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sVWI9ImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCRiPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxIYj0iY2xvc2VCTEVDb25uZWN0aW9uIixqYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0semI9ImdldEJMRURldmljZVNlcnZpY2VzIixXYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sR2I9ImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsWWI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHFiPSJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIixKYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc3RhdGU6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMH19LEtiPSJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsWmI9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxYYj0id3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIixRYj17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzZXJ2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxjaGFyYWN0ZXJpc3RpY0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sdmFsdWU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxleT0ic2V0QkxFTVRVIix0eT17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxtdHU6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sbnk9ImdldEJMRURldmljZVJTU0kiLHJ5PXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxNaD0ib25CZWFjb25VcGRhdGUiLERoPSJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLGl5PSJnZXRCZWFjb25zIixveT0ic3RhcnRCZWFjb25EaXNjb3ZlcnkiLGF5PXt1dWlkczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LHN5PSJzdG9wQmVhY29uRGlzY292ZXJ5IixseT0iZ2V0U2NyZWVuQnJpZ2h0bmVzcyIsY3k9InNldFNjcmVlbkJyaWdodG5lc3MiLHV5PSJzZXRLZWVwU2NyZWVuT24iLGZ5PSJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb24iLGR5PSJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlIixoeT1bImZpbmdlclByaW50IiwiZmFjaWFsIiwic3BlZWNoIl0scHk9e2Zvcm1hdEFyZ3M6e2NoZWNrQXV0aE1vZGUoZSx0KXtpZighZXx8IWh5LmluY2x1ZGVzKGUpKXJldHVybiJjaGVja0F1dGhNb2RlIFx1NTg2Qlx1NTE5OVx1OTUxOVx1OEJFRiJ9fX0sZ3k9e2NoZWNrQXV0aE1vZGU6U3RyaW5nfSx2eT0ic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uIixteT17Zm9ybWF0QXJnczp7cmVxdWVzdEF1dGhNb2RlcyhlLHQpe2lmKCFlLmluY2x1ZGVzKCJmaW5nZXJQcmludCIpJiYhZS5pbmNsdWRlcygiZmFjaWFsIikpcmV0dXJuInJlcXVlc3RBdXRoTW9kZXMgXHU1ODZCXHU1MTk5XHU5NTE5XHU4QkVGIn19fSxfeT17cmVxdWVzdEF1dGhNb2Rlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY2hhbGxlbmdlOlN0cmluZyxhdXRoQ29udGVudDpTdHJpbmd9LGJ5PSJzY2FuQ29kZSIseXk9e29ubHlGcm9tQ2FtZXJhOkJvb2xlYW4sc2NhblR5cGU6QXJyYXksYXV0b0RlY29kZUNoYXJTZXQ6Qm9vbGVhbixzb3VuZDpTdHJpbmcsYXV0b1pvb206Qm9vbGVhbn0sRXk9WyJkZWZhdWx0Iiwibm9uZSJdLHd5PXtmb3JtYXRBcmdzOntzb3VuZChlLHQpe0V5LmluY2x1ZGVzKGUpfHwodC5zb3VuZD0ibm9uZSIpfSxhdXRvWm9vbShlLHQpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKHQuYXV0b1pvb209ITApfX19LFN5PSJnZXRTeXN0ZW1TZXR0aW5nIixDeT0iZ2V0QXBwQXV0aG9yaXplU2V0dGluZyIsT3k9Im9wZW5BcHBBdXRob3JpemVTZXR0aW5nIixBeT0iZ2V0U3RvcmFnZSIsTGg9e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxUeT0iZ2V0U3RvcmFnZVN5bmMiLEZoPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEl5PSJzZXRTdG9yYWdlIixQeT17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxOeT0ic2V0U3RvcmFnZVN5bmMiLGt5PVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0sVmg9InJlbW92ZVN0b3JhZ2UiLFJ5PUxoLHh5PUZoLEJ5PSJzYXZlRmlsZSIsTXk9e2Zvcm1hdEFyZ3M6e3RlbXBGaWxlUGF0aChlLHQpe3QudGVtcEZpbGVQYXRoPUtlKGUpfX19LER5PXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sTHk9ImdldFNhdmVkRmlsZUxpc3QiLEZ5PSJyZW1vdmVTYXZlZEZpbGUiLFZ5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9S2UoZSl9fX0sVXk9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LCR5PSJnZXRGaWxlSW5mbyIsSHk9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1LZShlKX19fSxqeT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0senk9ImdldFNhdmVkRmlsZUluZm8iLFd5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9S2UoZSl9fX0sR3k9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFl5PSJvcGVuRG9jdW1lbnQiLHF5PXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9S2UoZSl9fX0sSnk9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6U3RyaW5nfSxLeT0iaGlkZUtleWJvYXJkIixaeT0ic2hvd0tleWJvYXJkIixYeT0iY2hvb3NlTG9jYXRpb24iLFF5PXtrZXl3b3JkOlN0cmluZyxsYXRpdHVkZTpOdW1iZXIsbG9uZ2l0dWRlOk51bWJlcn0sZTA9ImdldExvY2F0aW9uIixVaD1bIndnczg0IiwiZ2NqMDIiXSx0MD17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLFVoLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9VWhbMF06dC50eXBlPWV9LGFsdGl0dWRlKGUsdCl7dC5hbHRpdHVkZT1lfHwhMX19fSxuMD17dHlwZTpTdHJpbmcsYWx0aXR1ZGU6Qm9vbGVhbn0scjA9Im9wZW5Mb2NhdGlvbiIsJGg9KGUsdCk9PntpZih0PT09dm9pZCAwKXJldHVybmAke2V9IHNob3VsZCBub3QgYmUgZW1wdHkuYDtpZih0eXBlb2YgdCE9Im51bWJlciIpe2xldCBuPXR5cGVvZiB0O3JldHVybiBuPW5bMF0udG9VcHBlckNhc2UoKStuLnN1YnN0cmluZygxKSxgRXhwZWN0ZWQgTnVtYmVyLCBnb3QgJHtufSB3aXRoIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodCl9LmB9fSxpMD17Zm9ybWF0QXJnczp7bGF0aXR1ZGUoZSx0KXtsZXQgbj0kaCgibGF0aXR1ZGUiLGUpO2lmKG4pcmV0dXJuIG47dC5sYXRpdHVkZT1lfSxsb25naXR1ZGUoZSx0KXtsZXQgbj0kaCgibG9uZ2l0dWRlIixlKTtpZihuKXJldHVybiBuO3QubG9uZ2l0dWRlPWV9LHNjYWxlKGUsdCl7ZT1NYXRoLmZsb29yKGUpLHQuc2NhbGU9ZT49NSYmZTw9MTg/ZToxOH19fSxvMD17bGF0aXR1ZGU6TnVtYmVyLGxvbmdpdHVkZTpOdW1iZXIsc2NhbGU6TnVtYmVyLG5hbWU6U3RyaW5nLGFkZHJlc3M6U3RyaW5nfSxhMD0iY2hvb3NlSW1hZ2UiLHMwPXtmb3JtYXRBcmdzOntjb3VudChlLHQpeyghZXx8ZTw9MCkmJih0LmNvdW50PTkpfSxzaXplVHlwZShlLHQpe3Quc2l6ZVR5cGU9Tm4oZSx3aSl9LHNvdXJjZVR5cGUoZSx0KXt0LnNvdXJjZVR5cGU9Tm4oZSxxbil9LGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sbDA9e2NvdW50Ok51bWJlcixzaXplVHlwZTpbQXJyYXksU3RyaW5nXSxzb3VyY2VUeXBlOkFycmF5LGV4dGVuc2lvbjpBcnJheX0sYzA9ImNob29zZVZpZGVvIix1MD17Zm9ybWF0QXJnczp7c291cmNlVHlwZShlLHQpe3Quc291cmNlVHlwZT1ObihlLHFuKX0sY29tcHJlc3NlZDohMCxtYXhEdXJhdGlvbjo2MCxjYW1lcmE6ImJhY2siLGV4dGVuc2lvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiBBcnJheSYmZS5sZW5ndGg9PT0wKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2V8fCh0LmV4dGVuc2lvbj1bIioiXSl9fX0sZjA9e3NvdXJjZVR5cGU6QXJyYXksY29tcHJlc3NlZDpCb29sZWFuLG1heER1cmF0aW9uOk51bWJlcixjYW1lcmE6U3RyaW5nLGV4dGVuc2lvbjpBcnJheX0sZDA9ImdldEltYWdlSW5mbyIsaDA9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPUtlKGUpfX19LHAwPXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sZzA9InByZXZpZXdJbWFnZSIsdjA9e2Zvcm1hdEFyZ3M6e3VybHMoZSx0KXt0LnVybHM9ZS5tYXAobj0+Si5pc1N0cmluZyhuKSYmbj9LZShuKToiIil9LGN1cnJlbnQoZSx0KXt0eXBlb2YgZT09Im51bWJlciI/dC5jdXJyZW50PWU+MCYmZTx0LnVybHMubGVuZ3RoP2U6MDpKLmlzU3RyaW5nKGUpJiZlJiYodC5jdXJyZW50PUtlKGUpKX19fSxtMD17dXJsczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ119fSxfMD0iY2xvc2VQcmV2aWV3SW1hZ2UiLGIwPSJnZXRWaWRlb0luZm8iLHkwPXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1LZShlKX19fSxFMD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHcwPSJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIixTMD17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPUtlKGUpfX19LEMwPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxPMD0ic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bSIsQTA9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1LZShlKX19fSxUMD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sSTA9ImdldFJlY29yZGVyTWFuYWdlciIsUDA9ImNvbXByZXNzSW1hZ2UiLE4wPXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1LZShlKX19fSxrMD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFIwPSJjb21wcmVzc1ZpZGVvIix4MD17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9S2UoZSl9fX0sQjA9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHF1YWxpdHk6U3RyaW5nLGJpdHJhdGU6TnVtYmVyLGZwczpOdW1iZXIscmVzb2x1dGlvbjpOdW1iZXJ9LE0wPSJyZXF1ZXN0IixEMD17SlNPTjoianNvbiJ9LEwwPVsidGV4dCIsImFycmF5YnVmZmVyIl0sRjA9InRleHQiLEhoPWVuY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBWMChlLHQpe2xldCBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiO249blswXS5zcGxpdCgiPyIpO2xldCBzPW5bMV18fCIiO2U9blswXTtsZXQgdT1zLnNwbGl0KCImIikuZmlsdGVyKEU9PkUpLGc9e307dS5mb3JFYWNoKEU9PntsZXQgVT1FLnNwbGl0KCI9Iik7Z1tVWzBdXT1VWzFdfSk7Zm9yKGxldCBFIGluIHQpaWYoSi5oYXNPd24odCxFKSl7bGV0IFU9dFtFXTt0eXBlb2YgVT09InVuZGVmaW5lZCJ8fFU9PT1udWxsP1U9IiI6Si5pc1BsYWluT2JqZWN0KFUpJiYoVT1KU09OLnN0cmluZ2lmeShVKSksZ1tIaChFKV09SGgoVSl9cmV0dXJuIHM9T2JqZWN0LmtleXMoZykubWFwKEU9PmAke0V9PSR7Z1tFXX1gKS5qb2luKCImIiksZSsocz8iPyIrczoiIikrKHI/IiMiK3I6IiIpfWxldCBVMD17bWV0aG9kOlN0cmluZyxkYXRhOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6T2JqZWN0LGRhdGFUeXBlOlN0cmluZyxyZXNwb25zZVR5cGU6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFufSwkMD17Zm9ybWF0QXJnczp7bWV0aG9kKGUsdCl7dC5tZXRob2Q9VnQoKGV8fCIiKS50b1VwcGVyQ2FzZSgpLGhuKX0sZGF0YShlLHQpe3QuZGF0YT1lfHwiIn0sdXJsKGUsdCl7dC5tZXRob2Q9PT1oblswXSYmSi5pc1BsYWluT2JqZWN0KHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9VjAoZSx0LmRhdGEpKX0saGVhZGVyKGUsdCl7bGV0IG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1oblswXSYmKE9iamVjdC5rZXlzKG4pLmZpbmQocj0+ci50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSIpfHwoblsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSl9LGRhdGFUeXBlKGUsdCl7dC5kYXRhVHlwZT0oZXx8RDAuSlNPTikudG9Mb3dlckNhc2UoKX0scmVzcG9uc2VUeXBlKGUsdCl7dC5yZXNwb25zZVR5cGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLEwwLmluZGV4T2YodC5yZXNwb25zZVR5cGUpPT09LTEmJih0LnJlc3BvbnNlVHlwZT1GMCl9fX0sSDA9ImNvbmZpZ01UTFMiLGowPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSx6MD17Zm9ybWF0QXJnczp7Y2VydGlmaWNhdGVzKGUpe2lmKGUuc29tZSh0PT5KLnRvUmF3VHlwZSh0Lmhvc3QpIT09IlN0cmluZyIpKXJldHVybiJcdTUzQzJcdTY1NzBcdTkxNERcdTdGNkVcdTk1MTlcdThCRUZcdUZGMENcdThCRjdcdTc4NkVcdThCQTRcdTU0MEVcdTkxQ0RcdThCRDUifX19LFcwPSJkb3dubG9hZEZpbGUiLEcwPXtmb3JtYXRBcmdzOntoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX19fSxZMD17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOk9iamVjdCx0aW1lb3V0Ok51bWJlcn0scTA9InVwbG9hZEZpbGUiLEowPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe2UmJih0LmZpbGVQYXRoPUtlKGUpKX0saGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319LGZvcm1EYXRhKGUsdCl7dC5mb3JtRGF0YT1lfHx7fX19fSxLMD17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6QXJyYXksZmlsZVBhdGg6U3RyaW5nLG5hbWU6U3RyaW5nLGhlYWRlcjpPYmplY3QsZm9ybURhdGE6T2JqZWN0LHRpbWVvdXQ6TnVtYmVyfSxaMD0iY29ubmVjdFNvY2tldCIsWDA9e2Zvcm1hdEFyZ3M6e2hlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fSxtZXRob2QoZSx0KXt0Lm1ldGhvZD1WdCgoZXx8IiIpLnRvVXBwZXJDYXNlKCksaG4pfSxwcm90b2NvbHMoZSx0KXtKLmlzU3RyaW5nKGUpJiYodC5wcm90b2NvbHM9W2VdKX19fSxRMD17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdH0sbWV0aG9kOlN0cmluZyxwcm90b2NvbHM6W0FycmF5LFN0cmluZ119LGVFPSJzZW5kU29ja2V0TWVzc2FnZSIsdEU9e2RhdGE6W1N0cmluZyxBcnJheUJ1ZmZlcl19LG5FPSJjbG9zZVNvY2tldCIsckU9e2NvZGU6TnVtYmVyLHJlYXNvbjpTdHJpbmd9LGlFPSJzdGFydExvY2F0aW9uVXBkYXRlIixqaD0ib25Mb2NhdGlvbkNoYW5nZSIsb0U9InN0b3BMb2NhdGlvblVwZGF0ZSIsYUU9Im9mZkxvY2F0aW9uQ2hhbmdlIixzRT0ib2ZmTG9jYXRpb25DaGFuZ2VFcnJvciIsemg9Im9uTG9jYXRpb25DaGFuZ2VFcnJvciIsV2g9WyJ3Z3M4NCIsImdjajAyIl0sbEU9e3R5cGU6U3RyaW5nfSxjRT17Zm9ybWF0QXJnczp7dHlwZShlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLFdoLmluZGV4T2YoZSk9PT0tMT90LnR5cGU9V2hbMV06dC50eXBlPWV9fX07ZnVuY3Rpb24gdUUoZSl7aWYoIUouaXNTdHJpbmcoZSkpcmV0dXJuIGU7bGV0IHQ9ZS5pbmRleE9mKCI/Iik7aWYodD09PS0xKXJldHVybiBlO2xldCBuPWUuc2xpY2UodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnNsaWNlKDAsdCk7bGV0IHI9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKHM9PntsZXQgdT1zLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLGc9dS5zaGlmdCgpLEU9dS5sZW5ndGg+MD91LmpvaW4oIj0iKToiIjtyLnB1c2goZysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KEUpKX0pLHIubGVuZ3RoP2UrIj8iK3Iuam9pbigiJiIpOmV9bGV0IGZFPVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxkRT1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLEFjPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sRGY9Im5hdmlnYXRlVG8iLExmPSJyZWRpcmVjdFRvIixHaD0icmVMYXVuY2giLFJ1PSJzd2l0Y2hUYWIiLGhFPSJuYXZpZ2F0ZUJhY2siLEZmPSJwcmVsb2FkUGFnZSIsWWg9InVuUHJlbG9hZFBhZ2UiLHBFPUouZXh0ZW5kKHt9LEFjLHFoKGZFKSksZ0U9Si5leHRlbmQoe2RlbHRhOnt0eXBlOk51bWJlcn19LHFoKGRFKSksdkU9QWMsbUU9QWMsX0U9QWMsYkU9QWMseUU9QWMsRUU9QnUoRGYpLHdFPUJ1KExmKSxTRT1CdShHaCksQ0U9QnUoUnUpLE9FPXtmb3JtYXRBcmdzOntkZWx0YShlLHQpe2U9cGFyc2VJbnQoZSsiIil8fDEsdC5kZWx0YT1NYXRoLm1pbihqbigpLmxlbmd0aC0xLGUpfX19O2Z1bmN0aW9uIHFoKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IHh1O2Z1bmN0aW9uIEFFKCl7eHU9IiJ9ZnVuY3Rpb24gQnUoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDpURShlKX0sYmVmb3JlQWxsOkFFfX1mdW5jdGlvbiBURShlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj1tYShuKTtsZXQgcz1uLnNwbGl0KCI/IilbMF0sdT1obyhzLCEwKTtpZighdSlyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PURmfHxlPT09TGYpe2lmKHUubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PVJ1JiYhdS5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1SdXx8ZT09PUZmKSYmdS5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPXMpLHUubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UodS5hbGlhcywiLyIpKSxyLnVybD11RShuKSxlIT09WWgpe2lmKGU9PT1GZil7aWYoIXUubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYodS5tZXRhLmlzVGFiQmFyKXtsZXQgZz1qbigpLEU9dS5wYXRoLnNsaWNlKDEpO2lmKGcuZmluZChVPT5VLnJvdXRlPT09RSkpcmV0dXJuInRhYkJhciBwYWdlIGAiK0UrImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZih4dT09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHt4dX0gbG9ja2VkYDtSLnJlYWR5JiYoeHU9bil9fX1sZXQgSUU9ImhpZGVMb2FkaW5nIixQRT0iaGlkZVRvYXN0IixKaD0ibG9hZEZvbnRGYWNlIixORT17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LGtFPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxSRT0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIix4RT17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sQkU9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZihrRS5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0sTUU9InNldE5hdmlnYXRpb25CYXJUaXRsZSIsREU9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LExFPSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLEZFPSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLEtoPSJwYWdlU2Nyb2xsVG8iLFZFPXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LFVFPXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSwkRT0ic2hvd0FjdGlvblNoZWV0IixIRT17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxqRT17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LHpFPSJzaG93TG9hZGluZyIsV0U9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LEdFPXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sWUU9InNob3dNb2RhbCIscUU9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSxKRT17YmVmb3JlSW52b2tlKCl7WSgpfSxmb3JtYXRBcmdzOnt0aXRsZToiIixjb250ZW50OiIiLHBsYWNlaG9sZGVyVGV4dDoiIixzaG93Q2FuY2VsOiEwLGVkaXRhYmxlOiExLGNhbmNlbFRleHQoZSx0KXtpZighSi5oYXNPd24odCwiY2FuY2VsVGV4dCIpKXtsZXR7dDpufT1sZSgpO3QuY2FuY2VsVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6IiMwMDAiLGNvbmZpcm1UZXh0KGUsdCl7aWYoIUouaGFzT3duKHQsImNvbmZpcm1UZXh0Iikpe2xldHt0Om59PWxlKCk7dC5jb25maXJtVGV4dD1uKCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iKX19LGNvbmZpcm1Db2xvcjpyZS5QUklNQVJZX0NPTE9SfX0sS0U9InNob3dUb2FzdCIsWkU9WyJzdWNjZXNzIiwibG9hZGluZyIsIm5vbmUiLCJlcnJvciJdLFhFPXt0aXRsZTpTdHJpbmcsaWNvbjpTdHJpbmcsaW1hZ2U6U3RyaW5nLGR1cmF0aW9uOk51bWJlcixtYXNrOkJvb2xlYW59LFFFPXtmb3JtYXRBcmdzOnt0aXRsZToiIixpY29uKGUsdCl7dC5pY29uPVZ0KGUsWkUpfSxpbWFnZShlLHQpe2U/dC5pbWFnZT1LZShlKTp0LmltYWdlPSIifSxkdXJhdGlvbjoxNTAwLG1hc2s6ITF9fSxldz0ic3RhcnRQdWxsRG93blJlZnJlc2giLHR3PSJzdG9wUHVsbERvd25SZWZyZXNoIixjdT17aW5kZXg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sQ2w9e2JlZm9yZUludm9rZSgpe2xldCBlPXFhKCk7aWYoZSYmIWUuaXNUYWJCYXIpcmV0dXJuIm5vdCBUYWJCYXIgcGFnZSJ9LGZvcm1hdEFyZ3M6e2luZGV4KGUpe2lmKCFSLnRhYkJhci5saXN0W2VdKXJldHVybiJ0YWJiYXIgaXRlbSBub3QgZm91bmQifX19LG53PSJzZXRUYWJCYXJJdGVtIixydz1KLmV4dGVuZCh7dGV4dDpTdHJpbmcsaWNvblBhdGg6U3RyaW5nLHNlbGVjdGVkSWNvblBhdGg6U3RyaW5nLHBhZ2VQYXRoOlN0cmluZ30sY3UpLGl3PXtiZWZvcmVJbnZva2U6Q2wuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6Si5leHRlbmQoe3BhZ2VQYXRoKGUsdCl7ZSYmKHQucGFnZVBhdGg9cmUucmVtb3ZlTGVhZGluZ1NsYXNoKGUpKX19LENsLmZvcm1hdEFyZ3MpfSxvdz0ic2V0VGFiQmFyU3R5bGUiLGF3PXtjb2xvcjpTdHJpbmcsc2VsZWN0ZWRDb2xvcjpTdHJpbmcsYmFja2dyb3VuZENvbG9yOlN0cmluZyxiYWNrZ3JvdW5kSW1hZ2U6U3RyaW5nLGJhY2tncm91bmRSZXBlYXQ6U3RyaW5nLGJvcmRlclN0eWxlOlN0cmluZ30sc3c9L14obGluZWFyfHJhZGlhbCktZ3JhZGllbnRcKC4rP1wpOz8kLyxsdz17YmVmb3JlSW52b2tlOkNsLmJlZm9yZUludm9rZSxmb3JtYXRBcmdzOntiYWNrZ3JvdW5kSW1hZ2UoZSx0KXtlJiYhc3cudGVzdChlKSYmKHQuYmFja2dyb3VuZEltYWdlPUtlKGUpKX0sYm9yZGVyU3R5bGUoZSx0KXtlJiYodC5ib3JkZXJTdHlsZT1lPT09IndoaXRlIj8id2hpdGUiOiJibGFjayIpfX19LGN3PSJoaWRlVGFiQmFyIixaaD17YW5pbWF0aW9uOkJvb2xlYW59LHV3PSJzaG93VGFiQmFyIixmdz1aaCxkdz0iaGlkZVRhYkJhclJlZERvdCIsaHc9Y3UscHc9Q2wsZ3c9InNob3dUYWJCYXJSZWREb3QiLHZ3PWN1LG13PUNsLF93PSJyZW1vdmVUYWJCYXJCYWRnZSIsYnc9Y3UseXc9Q2wsRXc9InNldFRhYkJhckJhZGdlIix3dz1KLmV4dGVuZCh7dGV4dDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxjdSksU3c9e2JlZm9yZUludm9rZTpDbC5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczpKLmV4dGVuZCh7dGV4dChlLHQpe3JlLmdldExlbihlKT49NCYmKHQudGV4dD0iLi4uIil9fSxDbC5mb3JtYXRBcmdzKX0sQ3c9ImdldFByb3ZpZGVyIixPdz17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxBdz0ibG9naW4iLFR3PXtwcm92aWRlcjpTdHJpbmcsc2NvcGVzOltTdHJpbmcsQXJyYXldLHRpbWVvdXQ6TnVtYmVyLHVuaXZlcmlmeVN0eWxlOk9iamVjdCxvbmx5QXV0aG9yaXplOkJvb2xlYW59LEl3PSJnZXRVc2VySW5mbyIsUHc9e3Byb3ZpZGVyOlN0cmluZyx3aXRoQ3JlZGVudGlhbHM6Qm9vbGVhbix0aW1lb3V0Ok51bWJlcixsYW5nOlN0cmluZ30sTnc9ImdnZXRVc2VyUHJvZmlsZWdldFVzZXJQcm9maWxlIixrdz17cHJvdmlkZXI6U3RyaW5nLHdpdGhDcmVkZW50aWFsczpCb29sZWFuLHRpbWVvdXQ6TnVtYmVyLGxhbmc6U3RyaW5nfSxSdz0icHJlTG9naW4iLHh3PXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LEJ3PXtmb3JtYXRBcmdzOntwcm92aWRlcihlLHQpe2lmKE9iamVjdC52YWx1ZXMoeHcpLmluZGV4T2YoU3RyaW5nKGUpKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sTXc9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LER3PSJjbG9zZUF1dGhWaWV3IixMdz0iZ2V0Q2hlY2tCb3hTdGF0ZSIsRnc9ImdldFVuaXZlcmlmeU1hbmFnZXIiLFZ3PSJzaGFyZSIsWGg9WyJXWFNjZW5lU2Vzc2lvbiIsIldYU2NlbmVUaW1lbGluZSIsIldYU2NlbmVGYXZvcml0ZSJdLFV3PXtmb3JtYXRBcmdzOntzY2VuZShlLHQpe2xldHtwcm92aWRlcjpuLG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OnJ9PXQ7aWYobj09PSJ3ZWl4aW4iJiYhciYmKCFlfHwhWGguaW5jbHVkZXMoZSkpKXJldHVybmBcdTUyMDZcdTRFQUJcdTUyMzBcdTVGQUVcdTRGRTFcdTY1RjZcdUZGMENzY2VuZVx1NUZDNVx1OTg3Qlx1NEUzQVx1NEVFNVx1NEUwQlx1NTE3Nlx1NEUyRFx1NEUwMFx1NEUyQVx1RkYxQSR7WGguam9pbigiXHUzMDAxIil9YH0sc3VtbWFyeShlLHQpe2lmKHQudHlwZT09PTEmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTdFQUZcdTY1ODdcdTY3MkNcdTY1RjZcdUZGMENzdW1tYXJ5XHU1RkM1XHU1ODZCIn0saHJlZihlLHQpe2lmKHQudHlwZT09PTAmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTU2RkVcdTY1ODdcdTY1RjZcdUZGMENocmVmXHU1RkM1XHU1ODZCIn0saW1hZ2VVcmwoZSx0KXtpZihbMCwyLDVdLmluY2x1ZGVzKE51bWJlcih0LnR5cGUpKSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTZGRVx1NjU4N1x1MzAwMVx1N0VBRlx1NTZGRVx1NzI0N1x1MzAwMVx1NUMwRlx1N0EwQlx1NUU4Rlx1NjVGNlx1RkYwQ2ltYWdlVXJsXHU1RkM1XHU1ODZCXHVGRjBDXHU2M0E4XHU4MzUwXHU0RjdGXHU3NTI4XHU1QzBGXHU0RThFMjBLYlx1NzY4NFx1NTZGRVx1NzI0NyJ9LG1lZGlhVXJsKGUsdCl7aWYoWzMsNF0uaW5jbHVkZXMoTnVtYmVyKHQudHlwZSkpJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU5N0YzXHU0RTUwXHUzMDAxXHU4OUM2XHU5ODkxXHU2NUY2XHVGRjBDbWVkaWFVcmxcdTVGQzVcdTU4NkIifSxtaW5pUHJvZ3JhbShlLHQpe2lmKHQudHlwZT09PTUmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTVDMEZcdTdBMEJcdTVFOEZcdTY1RjZcdUZGMENtaW5pUHJvZ3JhbVx1NUZDNVx1NTg2QiJ9LGNvcnBpZChlLHQpe2lmKHQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQmJiFlKXJldHVybiJcdTRGN0ZcdTc1MjhcdTYyNTNcdTVGMDBcdTVCQTJcdTY3MERcdTUyOUZcdTgwRkRcdTY1RjYgY29ycGlkIFx1NUZDNVx1NTg2QiJ9LGN1c3RvbWVyVXJsKGUsdCl7aWYodC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdCYmIWUpcmV0dXJuIlx1NEY3Rlx1NzUyOFx1NjI1M1x1NUYwMFx1NUJBMlx1NjcwRFx1NTI5Rlx1ODBGRFx1NjVGNiBjdXN0b21lclVybCBcdTVGQzVcdTU4NkIifX19LCR3PXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHR5cGU6TnVtYmVyLHRpdGxlOlN0cmluZyxzY2VuZTpTdHJpbmcsc3VtbWFyeTpTdHJpbmcsaHJlZjpTdHJpbmcsaW1hZ2VVcmw6U3RyaW5nLG1lZGlhVXJsOlN0cmluZyxtaW5pUHJvZ3JhbTpPYmplY3R9LEh3PSJzaGFyZVdpdGhTeXN0ZW0iLFFoPVsidGV4dCIsImltYWdlIl0sanc9e2Zvcm1hdEFyZ3M6e3R5cGUoZSx0KXtpZihlJiYhUWguaW5jbHVkZXMoZSkpcmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RVx1MzAwMlx1NTNFQVx1NjUyRlx1NjMwMXRleHRcdTMwMDFpbWFnZSI7dC50eXBlPVZ0KGUsUWgpfX19LHp3PXt0eXBlOlN0cmluZyxzdW1tYXJ5OlN0cmluZyxocmVmOlN0cmluZyxpbWFnZVVybDpTdHJpbmd9LFd3PSJyZXF1ZXN0UGF5bWVudCIsR3c9e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sb3JkZXJJbmZvOnt0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH0sdGltZVN0YW1wOlN0cmluZyxub25jZVN0cjpTdHJpbmcscGFja2FnZTpTdHJpbmcsc2lnblR5cGU6U3RyaW5nLHBheVNpZ246U3RyaW5nfSxZdz0iY3JlYXRlUHVzaE1lc3NhZ2UiLHF3PXtmb3JtYXRBcmdzOntjb250ZW50KGUpe2lmKCFlKXJldHVybiJjb250ZW50IGlzIHJlcXVpcmVkIn19fSxKdz0iY3JlYXRlUmV3YXJkZWRWaWRlb0FkIixLdz17Zm9ybWF0QXJnczp7YWRwaWQ6IiIsYWRVbml0SWQ6IiJ9fSxadz17YWRwaWQ6U3RyaW5nLGFkVW5pdElkOlN0cmluZ30sWHc9ImNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkIixRdz17Zm9ybWF0QXJnczp7YWRwaWQ6IiJ9fSxlUz17YWRwaWQ6U3RyaW5nfSx0Uz0iY3JlYXRlSW50ZXJzdGl0aWFsQWQiLG5TPXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LHJTPXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxpUz0iY3JlYXRlSW50ZXJhY3RpdmVBZCIsb1M9e2Zvcm1hdEFyZ3M6e2FkcGlkKGUsdCl7aWYoIWUpcmV0dXJuImFkcGlkIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlJiYodC5hZHBpZD1lKX0scHJvdmlkZXIoZSx0KXtpZighZSlyZXR1cm4icHJvdmlkZXIgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LnByb3ZpZGVyPWUpfX19LGFTPXthZHBpZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHByb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19O2Z1bmN0aW9uIEdsKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2RlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSxKLmlzRnVuY3Rpb24odCkmJihyPXQocikpLGUocil9fWZ1bmN0aW9uIGJyKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3I9cnx8e30sdD1yLm1lc3NhZ2V8fHR8fCIiLGRlbGV0ZSByLm1lc3NhZ2UsZSh0LEouZXh0ZW5kKHtjb2RlOjB9LHIpKX19ZnVuY3Rpb24gVGMoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlKCkoZnVuY3Rpb24ocil7ciYmKGRlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSksX3QuaW52b2tlT25DYWxsYmFjayh0LHIpfSl9fWZ1bmN0aW9uIEJpKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocix7cmVzb2x2ZTpzLHJlamVjdDp1fSl7ZSgpKEouZXh0ZW5kKHt9LEouaXNGdW5jdGlvbih0KT90KHIpOnIse3N1Y2Nlc3M6R2wocyxuKSxmYWlsOmJyKHUpfSkpfX1mdW5jdGlvbiB1dShlPSIiKXtpZighKFIudGFiQmFyJiZKLmlzQXJyYXkoUi50YWJCYXIubGlzdCkpKXJldHVybiExO3RyeXtpZighZSl7bGV0IG49am4oKTtpZighbi5sZW5ndGgpcmV0dXJuITE7bGV0IHI9bltuLmxlbmd0aC0xXTtyZXR1cm4gcj9yLiRwYWdlLm1ldGEuaXNUYWJCYXI6ITF9L15cLy8udGVzdChlKXx8KGU9cmUuYWRkTGVhZGluZ1NsYXNoKGUpKTtsZXQgdD1obyhlKTtyZXR1cm4gdCYmdC5tZXRhLmlzVGFiQmFyfWNhdGNoKHQpe31yZXR1cm4hMX1sZXQgbHM9Il9fVFlQRSIsc1M9InVuaS1zdG9yYWdlLWtleXMiO2Z1bmN0aW9uIFZmKGUpe2xldCB0PVsib2JqZWN0Iiwic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiIsInVuZGVmaW5lZCJdO3RyeXtsZXQgbj1KLmlzU3RyaW5nKGUpP0pTT04ucGFyc2UoZSk6ZSxyPW4udHlwZTtpZih0LmluZGV4T2Yocik+PTApe2xldCBzPU9iamVjdC5rZXlzKG4pO2lmKHMubGVuZ3RoPT09MiYmImRhdGEiaW4gbil7aWYodHlwZW9mIG4uZGF0YT09PXIpcmV0dXJuIG4uZGF0YTtpZihyPT09Im9iamVjdCImJi9eXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn1cOlxkezJ9XDpcZHsyfVwuXGR7M31aJC8udGVzdChuLmRhdGEpKXJldHVybiBuZXcgRGF0ZShuLmRhdGEpfWVsc2UgaWYocy5sZW5ndGg9PT0xKXJldHVybiIifX1jYXRjaChuKXt9fWxldCBsUz1EdChOeSwoZSx0KT0+e2xldCBuPXR5cGVvZiB0LHI9bj09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7bj09PSJzdHJpbmciJiZWZihyKSE9PXZvaWQgMD9sLnN0b3JhZ2Uuc2V0SXRlbShlK2xzLG4pOmwuc3RvcmFnZS5yZW1vdmVJdGVtKGUrbHMpLGwuc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2gocyl7fX0sa3kpLGNTPWtlKEl5LCh7a2V5OmUsZGF0YTp0fSx7cmVzb2x2ZTpuLHJlamVjdDpyfSk9PntsZXQgcz10eXBlb2YgdCx1PXM9PT0ic3RyaW5nIj90OkpTT04uc3RyaW5naWZ5KHt0eXBlOnMsZGF0YTp0fSk7dHJ5e2xldCBnPWwuc3RvcmFnZTtzPT09InN0cmluZyImJlZmKHUpIT09dm9pZCAwP2cuc2V0SXRlbUFzeW5jKGUrbHMscywoKT0+e30pOmcucmVtb3ZlSXRlbUFzeW5jKGUrbHMsKCk9Pnt9KSxnLnNldEl0ZW1Bc3luYyhlLHUsbixicihyKSl9Y2F0Y2goZyl7cihnLm1lc3NhZ2UpfX0sUHkpO2Z1bmN0aW9uIFVmKGUsdCl7bGV0IG49dDtpZihlIT09InN0cmluZyJ8fGU9PT0ic3RyaW5nIiYmdD09PSd7InR5cGUiOiJ1bmRlZmluZWQifScpdHJ5e2xldCByPUpTT04ucGFyc2UodCkscz1WZihyKTtpZihzIT09dm9pZCAwKW49cztlbHNlIGlmKGUmJihuPXIsSi5pc1N0cmluZyhyKSkpe3I9SlNPTi5wYXJzZShyKTtsZXQgdT10eXBlb2Ygcjt1PT09Im51bWJlciImJmU9PT0iZGF0ZSI/bj1uZXcgRGF0ZShyKTp1PT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2gocil7fXJldHVybiBufWxldCB1Uz1EdChUeSxlPT57bGV0IHQ9bC5zdG9yYWdlLmdldEl0ZW0oZSkscj0obC5zdG9yYWdlLmdldEl0ZW0oZStscyl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiBKLmlzU3RyaW5nKHQpP1VmKHIsdCk6IiJ9LEZoKSxmUz1rZShBeSwoe2tleTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1sLnN0b3JhZ2U7ci5nZXRJdGVtQXN5bmMoZSxmdW5jdGlvbihzKXtyLmdldEl0ZW1Bc3luYyhlK2xzLGZ1bmN0aW9uKHUpe2xldCBFPSh1LmRhdGF8fCIiKS50b0xvd2VyQ2FzZSgpO3Qoe2RhdGE6VWYoRSxzLmRhdGEpfSl9LGZ1bmN0aW9uKCl7dCh7ZGF0YTpVZigiIixzLmRhdGEpfSl9KX0sYnIobikpfSxMaCksZFM9RHQoVmgsZT0+e2wuc3RvcmFnZS5yZW1vdmVJdGVtKGUrbHMpLGwuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSx4eSksaFM9a2UoVmgsKHtrZXk6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bC5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlK2xzLCgpPT57fSksbC5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlLHQsYnIobikpfSxSeSkscFM9RHQoImNsZWFyU3RvcmFnZVN5bmMiLCgpPT57bC5zdG9yYWdlLmNsZWFyKCl9KSxnUz1rZSgiY2xlYXJTdG9yYWdlIiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLnN0b3JhZ2UuY2xlYXJBc3luYyh0LGJyKG4pKX0pLGVwPUR0KCJnZXRTdG9yYWdlSW5mb1N5bmMiLCgpPT57bGV0IGU9bC5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBzPWwuc3RvcmFnZS5rZXkocik7aWYocyE9PXNTJiYocy5pbmRleE9mKGxzKTwwfHxzLmluZGV4T2YobHMpK2xzLmxlbmd0aCE9PXMubGVuZ3RoKSl7bGV0IHU9bC5zdG9yYWdlLmdldEl0ZW0ocyk7bis9cy5sZW5ndGgrdS5sZW5ndGgsdC5wdXNoKHMpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbChuKjIvMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUV9fSksdlM9a2UoImdldFN0b3JhZ2VJbmZvIiwoZSx7cmVzb2x2ZTp0fSk9Pnt0KGVwKCkpfSksbVM9a2UoJHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bC5pby5nZXRGaWxlSW5mbyhKLmV4dGVuZChlLHtzdWNjZXNzOkdsKHQpLGZhaWw6YnIobil9KSl9LGp5LEh5KSxfUz0wLHRwPSJ1bmlhcHBfc2F2ZSIsYlM9YF9kb2MvJHt0cH1gO2Z1bmN0aW9uIHlTKGUsdCl7dD10fHxmdW5jdGlvbigpe30sbC5pby5yZXF1ZXN0RmlsZVN5c3RlbShsLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KHRwLHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBFUz1rZShCeSwoe3RlbXBGaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1icihuKSxzPWAke0RhdGUubm93KCl9JHtfUysrfSR7WWkoZSl9YDtsLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSx1PT57eVMoZz0+e3UuY29weVRvKGcscywoKT0+e2xldCBFPWJTKyIvIitzO3Qoe3NhdmVkRmlsZVBhdGg6RX0pfSxyKX0scil9LHIpfSxEeSxNeSksd1M9InVuaWFwcF9zYXZlIjtmdW5jdGlvbiBTUyhlLHQpe3Q9dHx8ZnVuY3Rpb24oKXt9LGwuaW8ucmVxdWVzdEZpbGVTeXN0ZW0obC5pby5QUklWQVRFX0RPQyxuPT57bi5yb290LmdldERpcmVjdG9yeSh3Uyx7Y3JlYXRlOiEwfSxlLHQpfSx0KX1sZXQgQ1M9a2UoTHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YnIobik7U1Mocz0+e3ZhciB1PXMuY3JlYXRlUmVhZGVyKCksZz1bXTt1LnJlYWRFbnRyaWVzKEU9PntFJiZFLmxlbmd0aD9FLmZvckVhY2goVT0+e1UuZ2V0TWV0YWRhdGEoUD0+e2cucHVzaCh7ZmlsZVBhdGg6bC5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKFUuZnVsbFBhdGgpLGNyZWF0ZVRpbWU6UC5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOlAuc2l6ZX0pLGcubGVuZ3RoPT09RS5sZW5ndGgmJnQoe2ZpbGVMaXN0Omd9KX0sciwhMSl9KTp0KHtmaWxlTGlzdDpnfSl9LHIpfSxyKX0pLE9TPWtlKHp5LCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YnIobik7bC5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUscz0+e3MuZ2V0TWV0YWRhdGEodT0+e3Qoe2NyZWF0ZVRpbWU6dS5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOnUuc2l6ZX0pfSxyLCExKX0scil9LEd5LFd5KSxBUz1rZShGeSwoe2ZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWJyKG4pO2wuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLHM9PntzLnJlbW92ZSgoKT0+e3QoKX0scil9LHIpfSxVeSxWeSksVFM9a2UoWXksKHtmaWxlUGF0aDplLGZpbGVUeXBlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBzPWJyKHIpO2wucnVudGltZS5vcGVuRG9jdW1lbnQoS2UoZSksdm9pZCAwLG4scyl9LEp5LHF5KSxJUz1EdCh2YixlPT4hIUouaGFzT3duKE8sZSksbWIpLGZ1LG5wPWwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIFBTKGUpe25wPWV9ZnVuY3Rpb24gcnAoZSl7ZnU9ZSxucChlKX1sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1ycDtmdW5jdGlvbiBEcyhlKXtpZighZSl7bGV0IHQ9RHIoKTtpZighdHx8KGU9dC4kcGFnZS5zdGF0dXNCYXJTdHlsZSwhZXx8ZT09PWZ1KSlyZXR1cm59ZSE9PWZ1JiYoZnU9ZSxsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24gaXAoZSl7X3Qub24ocmUuT05fVEhFTUVfQ0hBTkdFLGUpfWZ1bmN0aW9uIE5TKGUpe190Lm9mZihyZS5PTl9USEVNRV9DSEFOR0UsZSl9ZnVuY3Rpb24ga1MoKXtyZXR1cm4gb3AoKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIn1mdW5jdGlvbiBvcCgpe3JldHVybiBsLm5hdmlnYXRvci5nZXRVSVN0eWxlKCl9ZnVuY3Rpb24gUlMoKXtpZihSLmRhcmttb2RlKXtsZXQgZT1rUygpO0RzKGUpLHRyKCkuZm9yRWFjaChuPT57bi4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lfSl9fWZ1bmN0aW9uICRmKGUpe2lmKFIuZGFya21vZGUpe2xldCB0PXt9LG49bC5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHI9aHUoKTtyZXR1cm4gciYmci5ob3N0VGhlbWUmJihuPXIuaG9zdFRoZW1lKSx0PXJlLm5vcm1hbGl6ZVN0eWxlcyhlLFIudGhlbWVDb25maWcsbiksdH1yZXR1cm4gZX1mdW5jdGlvbiB4UyhlLHQpe2lmKFIuZGFya21vZGUpe2xldCBuPSgpPT57bGV0e2xpc3Q6cj1bXSxjb2xvcjpzLHNlbGVjdGVkQ29sb3I6dSxiYWNrZ3JvdW5kQ29sb3I6Zyxib3JkZXJTdHlsZTpFfT0kZih0KTtlJiZlLnNldFRhYkJhclN0eWxlKHtjb2xvcjpzLHNlbGVjdGVkQ29sb3I6dSxiYWNrZ3JvdW5kQ29sb3I6Zyxib3JkZXJTdHlsZTpFfSksZSYmZS5zZXRUYWJCYXJJdGVtcyh7bGlzdDpyLm1hcChVPT4oe2ljb25QYXRoOlUuaWNvblBhdGgsc2VsZWN0ZWRJY29uUGF0aDpVLnNlbGVjdGVkSWNvblBhdGgsdmlzaWJsZTpVLnZpc2libGV9KSl9KX07bigpLGlwKG4pfX1mdW5jdGlvbiBhcChlLHQpe2lmKFIuZGFya21vZGUpe2xldCBuPSgpPT57bGV0IHI9dCgpO3IuYW5pbWF0aW9uQWxwaGFCR0NvbG9yLHIuYmFja2dyb3VuZCxyLmJhY2tncm91bmRDb2xvckJvdHRvbSxyLmJhY2tncm91bmRDb2xvclRvcDt2YXIgcz1yLnRpdGxlTlZpZXc7dHlwZW9mIHMhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygcz09Im9iamVjdCImJihzLmJhY2tncm91bmRDb2xvcixzLnRpdGxlQ29sb3IpLGUmJmUuc2V0U3R5bGUocil9O2lwKG4pLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT5OUyhuKSl9fWxldCBkdSxIZj0hMCxzcjtmdW5jdGlvbiBCUyhlLHQsbil7IXNyfHwoZT09PSJub25lIj8oc3IuaGlkZVRhYkJhclJlZERvdCh7aW5kZXg6dH0pLHNyLnJlbW92ZVRhYkJhckJhZGdlKHtpbmRleDp0fSkpOmU9PT0idGV4dCI/c3Iuc2V0VGFiQmFyQmFkZ2Uoe2luZGV4OnQsdGV4dDpufSk6ZT09PSJyZWREb3QiJiZzci5zaG93VGFiQmFyUmVkRG90KHtpbmRleDp0fSkpfWZ1bmN0aW9uIE1TKGUpe3NyJiZzci5zZXRUYWJCYXJJdGVtcyhlKX1mdW5jdGlvbiBEUyhlLHQsbixyLHMsdSl7bGV0IGc9e2luZGV4OmV9O2lmKHQhPT12b2lkIDAmJihnLnRleHQ9dCksbiYmKGcuaWNvblBhdGg9S2UobikpLHImJihnLnNlbGVjdGVkSWNvblBhdGg9S2UocikpLHUhPT12b2lkIDAmJihnLmljb25mb250PXUpLHMhPT12b2lkIDApe2cudmlzaWJsZT1kdS5saXN0W2VdLnZpc2libGU9cyxkZWxldGUgZy5pbmRleDtsZXQgRT1kdS5saXN0Lm1hcChVPT4oe3Zpc2libGU6VS52aXNpYmxlfSkpO0VbZV09ZyxNUyh7bGlzdDpFfSl9ZWxzZSBzciYmc3Iuc2V0VGFiQmFySXRlbShnKX1mdW5jdGlvbiBMUyhlKXtzciYmc3Iuc2V0VGFiQmFyU3R5bGUoZSl9ZnVuY3Rpb24gRlMoZSl7SGY9ITEsc3ImJnNyLmhpZGVUYWJCYXIoe2FuaW1hdGlvbjplfSl9ZnVuY3Rpb24gVlMoZSl7SGY9ITAsc3ImJnNyLnNob3dUYWJCYXIoe2FuaW1hdGlvbjplfSl9bGV0IE11PVtdO3ZhciBNaT17aWQ6IjAiLGluaXQoZSx0KXtlJiZlLmxpc3QubGVuZ3RoJiYoZHU9ZSk7dHJ5e3NyPXYucmVxdWlyZU1vZHVsZSgidW5pLXRhYnZpZXciKX1jYXRjaChuKXtjb25zb2xlLmxvZyhgdW5pLnJlcXVpcmVOYXRpdmVQbHVnaW4oInVuaS10YWJ2aWV3IikgZXJyb3IgJHtufWApfXNyLm9uTWFza0NsaWNrKCgpPT57TXUuZm9yRWFjaChuPT57bigpfSl9KSxzciYmc3Iub25DbGljaygoe2luZGV4Om59KT0+e3QoZHUubGlzdFtuXSxuKX0pLHNyJiZzci5vbk1pZEJ1dHRvbkNsaWNrKCgpPT5fdC5pbnZva2VPbkNhbGxiYWNrKEVoKSkseFMoc3IsZSl9LGluZGV4T2YoZSl7bGV0IHQ9dGhpcy5jb25maWcsbj10JiZ0Lmxpc3QmJnQubGlzdC5sZW5ndGg7aWYobil7Zm9yKGxldCByPTA7cjxuO3IrKylpZih0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lfHx0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1gJHtlfS5odG1sYClyZXR1cm4gcn1yZXR1cm4tMX0sc3dpdGNoVGFiKGUpe2xldCB0PXRoaXMuaW5kZXhPZihlKTtyZXR1cm4gdD49MD8oc3ImJnNyLnN3aXRjaFNlbGVjdCh7aW5kZXg6dH0pLCEwKTohMX0sc2V0VGFiQmFyQmFkZ2U6QlMsc2V0VGFiQmFySXRlbTpEUyxzZXRUYWJCYXJTdHlsZTpMUyxoaWRlVGFiQmFyOkZTLHNob3dUYWJCYXI6VlMsYXBwZW5kKGUpe3NyJiZzci5hcHBlbmQoe2lkOmUuaWR9LCh7Y29kZTp0fSk9Pnt0IT09MCYmaygoKT0+e3RoaXMuYXBwZW5kKGUpfSwyMCl9KX0sZ2V0IGNvbmZpZygpe3JldHVybiBkdXx8Ui50YWJCYXJ9LGdldCB2aXNpYmxlKCl7cmV0dXJuIEhmfSxnZXQgaGVpZ2h0KCl7bGV0IGU9dGhpcy5jb25maWc7cmV0dXJuKGUmJmUuaGVpZ2h0P3BhcnNlRmxvYXQoZS5oZWlnaHQpOnJlLlRBQkJBUl9IRUlHSFQpK2wubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCkuZGV2aWNlQm90dG9tfSxnZXQgY292ZXIoKXtsZXQgZT10aGlzLmNvbmZpZztyZXR1cm4gZSYmWyJleHRyYWxpZ2h0IiwibGlnaHQiLCJkYXJrIl0uaW5kZXhPZihlLmJsdXJFZmZlY3QpPj0wfSxzZXRTdHlsZSh7bWFzazplfSl7c3Iuc2V0TWFzayh7Y29sb3I6ZX0pfSxhZGRFdmVudExpc3RlbmVyKGUsdCl7TXUucHVzaCh0KX0scmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpe2xldCBuPU11LmluZGV4T2YodCk7TXUuc3BsaWNlKG4sMSl9fTtmdW5jdGlvbiBEdSgpe2xldCBlPURyKCk7cmV0dXJuIGU/ZS4kZ2V0QXBwV2VidmlldygpOm51bGx9ZnVuY3Rpb24gc3AoZSl7cmV0dXJuIGU/ZS4kZ2V0QXBwV2VidmlldygpOkR1KCl9bGV0IGxwPW51bGw7ZnVuY3Rpb24gY3AoKXtyZXR1cm4gbHB9ZnVuY3Rpb24gamYoZSl7bHA9ZX1mdW5jdGlvbiB6Zigpe3JldHVybiBsLm5hdmlnYXRvci5pc0ltbWVyc2VkU3RhdHVzYmFyKCk/TWF0aC5yb3VuZChsLm9zLm5hbWU9PT0iaU9TIj9sLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLnRvcDpsLm5hdmlnYXRvci5nZXRTdGF0dXNiYXJIZWlnaHQoKSk6MH1mdW5jdGlvbiB1cCgpe2xldCBlPWwubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCk7cmV0dXJuIGU9PT0iVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQifHxlPT09IlVJU3RhdHVzQmFyU3R5bGVCbGFja09wYXF1ZSJ8fGU9PT0ibnVsbCI/ZT0ibGlnaHQiOmU9PT0iVUlTdGF0dXNCYXJTdHlsZURlZmF1bHQiJiYoZT0iZGFyayIpLGV9ZnVuY3Rpb24gVVMoKXtsZXR7cmVzb2x1dGlvbldpZHRoOmUscmVzb2x1dGlvbkhlaWdodDp0fT1sLnNjcmVlbi5nZXRDdXJyZW50U2l6ZSgpfHx7cmVzb2x1dGlvbldpZHRoOjAscmVzb2x1dGlvbkhlaWdodDowfTtyZXR1cm57c2NyZWVuV2lkdGg6TWF0aC5yb3VuZChlKSxzY3JlZW5IZWlnaHQ6TWF0aC5yb3VuZCh0KX19bGV0IGZwPUR0KCJnZXRXaW5kb3dJbmZvIiwoKT0+e2xldCBlPWwub3MubmFtZS50b0xvd2VyQ2FzZSgpPT09ImlvcyIse3NjcmVlbldpZHRoOnQsc2NyZWVuSGVpZ2h0Om59PVVTKCkscj16ZigpLHMsdT17aGVpZ2h0OjAsY292ZXI6ITF9LGc9RHUoKTtpZihnKXtsZXQgaHQ9Zy5nZXRTdHlsZSgpLHB0PWh0JiZodC50aXRsZU5WaWV3O3B0JiZwdC50eXBlJiZwdC50eXBlIT09Im5vbmUiJiYodS5oZWlnaHQ9cHQudHlwZT09PSJ0cmFuc3BhcmVudCI/MDpyK3JlLk5BVkJBUl9IRUlHSFQsdS5jb3Zlcj1wdC50eXBlPT09InRyYW5zcGFyZW50Inx8cHQudHlwZT09PSJmbG9hdCIpLHM9Zy5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugcz1sLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpO2xldCBFPXtoZWlnaHQ6MCxjb3ZlcjohMX07dXUoKSYmKEUuaGVpZ2h0PU1pLnZpc2libGU/TWkuaGVpZ2h0OjAsRS5jb3Zlcj1NaS5jb3Zlcik7bGV0IFU9dS5jb3Zlcj91LmhlaWdodDowLFA9RS5jb3Zlcj9FLmhlaWdodDowLEw9bi11LmhlaWdodC1FLmhlaWdodCxPZT1uLSh1LmNvdmVyPzA6dS5oZWlnaHQpLShFLmNvdmVyPzA6RS5oZWlnaHQpLFBlPXQ7KCFFLmhlaWdodHx8RS5jb3ZlcikmJiFzLmJvdHRvbSYmcy5kZXZpY2VCb3R0b20mJihMLT1zLmRldmljZUJvdHRvbSxPZS09cy5kZXZpY2VCb3R0b20pLHM9ZT9zOntsZWZ0OjAscmlnaHQ6MCx0b3A6dS5oZWlnaHQmJiF1LmNvdmVyPzA6cixib3R0b206MH07bGV0IFJlPXtsZWZ0OnMubGVmdCxyaWdodDpQZS1zLnJpZ2h0LHRvcDpzLnRvcCxib3R0b206T2Utcy5ib3R0b20sd2lkdGg6UGUtcy5sZWZ0LXMucmlnaHQsaGVpZ2h0Ok9lLXMudG9wLXMuYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpsLnNjcmVlbi5zY2FsZSxzY3JlZW5XaWR0aDp0LHNjcmVlbkhlaWdodDpuLHdpbmRvd1dpZHRoOlBlLHdpbmRvd0hlaWdodDpMLHN0YXR1c0JhckhlaWdodDpyLHNhZmVBcmVhOlJlLHNhZmVBcmVhSW5zZXRzOnt0b3A6cy50b3AscmlnaHQ6cy5yaWdodCxib3R0b206cy5ib3R0b20sbGVmdDpzLmxlZnR9LHdpbmRvd1RvcDpVLHdpbmRvd0JvdHRvbTpQLHNjcmVlblRvcDpuLUx9fSksY3MsTHU9ITA7ZnVuY3Rpb24gaHUoKXtpZighTHUpcmV0dXJuO2xldHtnZXRTeXN0ZW1JbmZvU3luYzplfT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihjcz1lKCksSi5pc1N0cmluZyhjcykpdHJ5e2NzPUpTT04ucGFyc2UoY3MpfWNhdGNoKHQpe31yZXR1cm4gY3N9bGV0IGRwPUR0KCJnZXREZXZpY2VJbmZvIiwoKT0+e2h1KCk7bGV0e2RldmljZUJyYW5kOmU9IiIsZGV2aWNlTW9kZWw6dCxvc05hbWU6bixvc1ZlcnNpb246cixkZXZpY2VPcmllbnRhdGlvbjpzLGRldmljZVR5cGU6dSxkZXZpY2VJZDpnfT1jcyxFPWUudG9Mb3dlckNhc2UoKSxVPW4udG9Mb3dlckNhc2UoKTtyZXR1cm57YnJhbmQ6RSxkZXZpY2VCcmFuZDpFLGRldmljZU1vZGVsOnQsZGV2aWNlUGl4ZWxSYXRpbzpsLnNjcmVlbi5zY2FsZSxkZXZpY2VJZDpnLGRldmljZU9yaWVudGF0aW9uOnMsZGV2aWNlVHlwZTp1LG1vZGVsOnQscGxhdGZvcm06VSxzeXN0ZW06YCR7VT09PSJpb3MiPyJpT1MiOiJBbmRyb2lkIn0gJHtyfWB9fSksaHA9RHQoImdldEFwcEJhc2VJbmZvIiwoKT0+e2h1KCk7bGV0e2hvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixvc0xhbmd1YWdlOnMsaG9zdFRoZW1lOnUsYXBwSWQ6ZyxhcHBOYW1lOkUsYXBwVmVyc2lvbjpVLGFwcFZlcnNpb25Db2RlOlAsYXBwV2d0VmVyc2lvbjpMfT1jcztyZXR1cm57YXBwSWQ6ZyxhcHBOYW1lOkUsYXBwVmVyc2lvbjpVLGFwcFZlcnNpb25Db2RlOlAsYXBwV2d0VmVyc2lvbjpMLGFwcExhbmd1YWdlOm91P291KCk6cyxlbmFibGVEZWJ1ZzohMSxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOm4saG9zdExhbmd1YWdlOnIsaG9zdFRoZW1lOnUsaG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsaG9zdFNES1ZlcnNpb246dm9pZCAwLGxhbmd1YWdlOnMsU0RLVmVyc2lvbjoiIix0aGVtZTpvcCgpLHZlcnNpb246bC5ydW50aW1lLmlubmVyVmVyc2lvbn19KSxwcD1EdCgiZ2V0U3lzdGVtSW5mb1N5bmMiLCgpPT57THU9ITAsaHUoKSxMdT0hMTtsZXQgZT1mcCgpLHQ9ZHAoKSxuPWhwKCk7THU9ITA7bGV0IHI9e2ZvbnRTaXplU2V0dGluZzpuLmhvc3RGb250U2l6ZVNldHRpbmcsb3NOYW1lOmNzLm9zTmFtZS50b0xvd2VyQ2FzZSgpfTtjcy5ob3N0TmFtZSYmKHIuaG9zdFNES1ZlcnNpb249Y3MudW5pUnVudGltZVZlcnNpb24pO2xldCBzPUouZXh0ZW5kKGNzLGUsdCxuLHIpO3JldHVybiBkZWxldGUgcy5zY3JlZW5Ub3AsZGVsZXRlIHMuZW5hYmxlRGVidWcsUi5kYXJrbW9kZXx8ZGVsZXRlIHMudGhlbWUscmUuc29ydE9iamVjdChzKX0pLCRTPWtlKCJnZXRTeXN0ZW1JbmZvIiwoZSx7cmVzb2x2ZTp0fSk9PnQocHAoKSkpLEljPW51bGwsSFM9S24oTmgsKCk9PntncCgpfSksalM9S3Ioa2IsKCk9Pnt2cCgpfSksZ3A9a2UoUmIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57SWN8fChJYz1sLm9yaWVudGF0aW9uLndhdGNoT3JpZW50YXRpb24ocj0+e190Lmludm9rZU9uQ2FsbGJhY2soTmgse2RpcmVjdGlvbjpyLm1hZ25ldGljSGVhZGluZ30pfSxyPT57bihyLm1lc3NhZ2UpLEljPW51bGx9LHtmcmVxdWVuY3k6aHJ9KSksayh0LGhyKX0pLHZwPWtlKHhiLChlLHtyZXNvbHZlOnR9KT0+e0ljJiYobC5vcmllbnRhdGlvbi5jbGVhcldhdGNoKEljKSxJYz1udWxsKSx0KCl9KSx6Uz1rZShCYiwoZSx7cmVzb2x2ZTp0fSk9PntsLmRldmljZS52aWJyYXRlKDE1KSx0KCl9KSxXUz1rZShNYiwoZSx7cmVzb2x2ZTp0fSk9PntsLmRldmljZS52aWJyYXRlKDQwMCksdCgpfSksUGM9bnVsbCxHUz1LbihQaCwoKT0+e21wKCl9KSxZUz1LcihJYiwoKT0+e19wKCl9KSxtcD1rZShQYiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntQY3x8KFBjPWwuYWNjZWxlcm9tZXRlci53YXRjaEFjY2VsZXJhdGlvbihyPT57X3QuaW52b2tlT25DYWxsYmFjayhQaCx7eDpyJiZyLnhBeGlzfHwwLHk6ciYmci55QXhpc3x8MCx6OnImJnIuekF4aXN8fDB9KX0scj0+e1BjPW51bGwsbihgc3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgJHtyLm1lc3NhZ2V9YCl9LHtmcmVxdWVuY3k6aHJ9KSksayh0LGhyKX0pLF9wPWtlKE5iLChlLHtyZXNvbHZlOnR9KT0+e1BjJiYobC5hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2goUGMpLFBjPW51bGwpLHQoKX0pLHFTPUtuKGtoLFRjKCgpPT5sLmJsdWV0b290aC5vbkJsdWV0b290aERldmljZUZvdW5kLmJpbmQobC5ibHVldG9vdGgpLGtoKSksSlM9S24oUmgsVGMoKCk9PmwuYmx1ZXRvb3RoLm9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlLmJpbmQobC5ibHVldG9vdGgpLFJoKSksS1M9S24oeGgsVGMoKCk9PmwuYmx1ZXRvb3RoLm9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQobC5ibHVldG9vdGgpLHhoKSksWlM9S24oQmgsVGMoKCk9PmwuYmx1ZXRvb3RoLm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZS5iaW5kKGwuYmx1ZXRvb3RoKSxCaCkpLFhTPWtlKCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIsQmkoKCk9PmwuYmx1ZXRvb3RoLm9wZW5CbHVldG9vdGhBZGFwdGVyLmJpbmQobC5ibHVldG9vdGgpKSksUVM9a2UoImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIsQmkoKCk9PmwuYmx1ZXRvb3RoLmNsb3NlQmx1ZXRvb3RoQWRhcHRlci5iaW5kKGwuYmx1ZXRvb3RoKSkpLGVDPWtlKCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiLEJpKCgpPT5sLmJsdWV0b290aC5nZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUuYmluZChsLmJsdWV0b290aCkpKSx0Qz1rZShEYixCaSgoKT0+bC5ibHVldG9vdGguc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5LmJpbmQobC5ibHVldG9vdGgpKSxMYiksbkM9a2UoInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixCaSgoKT0+bC5ibHVldG9vdGguc3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkuYmluZChsLmJsdWV0b290aCkpKSxyQz1rZSgiZ2V0Qmx1ZXRvb3RoRGV2aWNlcyIsQmkoKCk9PmwuYmx1ZXRvb3RoLmdldEJsdWV0b290aERldmljZXMuYmluZChsLmJsdWV0b290aCkpKSxpQz1rZShGYixCaSgoKT0+bC5ibHVldG9vdGguZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcy5iaW5kKGwuYmx1ZXRvb3RoKSksVmIpLG9DPWtlKFViLEJpKCgpPT5sLmJsdWV0b290aC5jcmVhdGVCTEVDb25uZWN0aW9uLmJpbmQobC5ibHVldG9vdGgpKSwkYiksYUM9a2UoSGIsQmkoKCk9PmwuYmx1ZXRvb3RoLmNsb3NlQkxFQ29ubmVjdGlvbi5iaW5kKGwuYmx1ZXRvb3RoKSksamIpLHNDPWtlKHpiLEJpKCgpPT5sLmJsdWV0b290aC5nZXRCTEVEZXZpY2VTZXJ2aWNlcy5iaW5kKGwuYmx1ZXRvb3RoKSksV2IpLGxDPWtlKEdiLEJpKCgpPT5sLmJsdWV0b290aC5nZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MuYmluZChsLmJsdWV0b290aCkpLFliKSxjQz1rZShxYixCaSgoKT0+bC5ibHVldG9vdGgubm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZS5iaW5kKGwuYmx1ZXRvb3RoKSksSmIpLHVDPWtlKEtiLEJpKCgpPT5sLmJsdWV0b290aC5yZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZS5iaW5kKGwuYmx1ZXRvb3RoKSksWmIpLGZDPWtlKFhiLEJpKCgpPT5sLmJsdWV0b290aC53cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUuYmluZChsLmJsdWV0b290aCkpLFFiKSxkQz1rZShleSxCaSgoKT0+bC5ibHVldG9vdGguc2V0QkxFTVRVLmJpbmQobC5ibHVldG9vdGgpKSx0eSksaEM9a2UobnksQmkoKCk9PmwuYmx1ZXRvb3RoLmdldEJMRURldmljZVJTU0kuYmluZChsLmJsdWV0b290aCkpLHJ5KSxwQz1LbihNaCxUYygoKT0+bC5pYmVhY29uLm9uQmVhY29uVXBkYXRlLmJpbmQobC5pYmVhY29uKSxNaCkpLGdDPUtuKERoLFRjKCgpPT5sLmliZWFjb24ub25CZWFjb25TZXJ2aWNlQ2hhbmdlLmJpbmQobC5pYmVhY29uKSxEaCkpLHZDPWtlKGl5LEJpKCgpPT5sLmliZWFjb24uZ2V0QmVhY29ucy5iaW5kKGwuaWJlYWNvbikpKSxtQz1rZShveSxCaSgoKT0+bC5pYmVhY29uLnN0YXJ0QmVhY29uRGlzY292ZXJ5LmJpbmQobC5pYmVhY29uKSksYXkpLF9DPWtlKHN5LEJpKCgpPT5sLmliZWFjb24uc3RvcEJlYWNvbkRpc2NvdmVyeS5iaW5kKGwuaWJlYWNvbikpKSxiQz1rZShiYiwoe3Bob25lTnVtYmVyOmV9LHtyZXNvbHZlOnR9KT0+KGwuZGV2aWNlLmRpYWwoZSksdCgpKSx5YikseUM9e25hbWU6e2dpdmVuTmFtZToiZmlyc3ROYW1lIixtaWRkbGVOYW1lOiJtaWRkbGVOYW1lIixmYW1pbHlOYW1lOiJsYXN0TmFtZSJ9LG5pY2tuYW1lOiJuaWNrTmFtZSIscGhvdG9zOnt0eXBlOiJ1cmwiLHZhbHVlOiJwaG90b0ZpbGVQYXRoIn0sbm90ZToicmVtYXJrIixwaG9uZU51bWJlcnM6W3t0eXBlOiJtb2JpbGUiLHZhbHVlOiJtb2JpbGVQaG9uZU51bWJlciJ9LHt0eXBlOiJ3b3JrIix2YWx1ZToid29ya1Bob25lTnVtYmVyIn0se3R5cGU6ImNvbXBhbnkiLHZhbHVlOiJob3N0TnVtYmVyIn0se3R5cGU6ImhvbWUgZmF4Iix2YWx1ZToiaG9tZUZheE51bWJlciJ9LHt0eXBlOiJ3b3JrIGZheCIsdmFsdWU6IndvcmtGYXhOdW1iZXIifV0sZW1haWxzOlt7dHlwZToiaG9tZSIsdmFsdWU6ImVtYWlsIn1dLHVybHM6W3t0eXBlOiJvdGhlciIsdmFsdWU6InVybCJ9XSxvcmdhbml6YXRpb25zOlt7dHlwZToiY29tcGFueSIsbmFtZToib3JnYW5pemF0aW9uIix0aXRsZToidGl0bGUifV0saW1zOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ3ZUNoYXROdW1iZXIifV0sYWRkcmVzc2VzOlt7dHlwZToib3RoZXIiLHByZWZlcnJlZDohMCxjb3VudHJ5OiJhZGRyZXNzQ291bnRyeSIscmVnaW9uOiJhZGRyZXNzU3RhdGUiLGxvY2FsaXR5OiJhZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiYWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiYWRkcmVzc1Bvc3RhbENvZGUifSx7dHlwZToiaG9tZSIsY291bnRyeToiaG9tZUFkZHJlc3NDb3VudHJ5IixyZWdpb246ImhvbWVBZGRyZXNzU3RhdGUiLGxvY2FsaXR5OiJob21lQWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImhvbWVBZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJob21lQWRkcmVzc1Bvc3RhbENvZGUifSx7dHlwZToiY29tcGFueSIsY291bnRyeToid29ya0FkZHJlc3NDb3VudHJ5IixyZWdpb246IndvcmtBZGRyZXNzU3RhdGUiLGxvY2FsaXR5OiJ3b3JrQWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6IndvcmtBZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJ3b3JrQWRkcmVzc1Bvc3RhbENvZGUifV19LEVDPVsidHlwZSIsInByZWZlcnJlZCJdO2Z1bmN0aW9uIFdmKGUsdCxuKXtsZXQgcj0wO3JldHVybiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHM9PntsZXQgdT1uW3NdO3R5cGVvZiB1IT09Im9iamVjdCI/RUMuaW5kZXhPZihzKSE9PS0xP2Vbc109bltzXTp0eXBlb2YgdFt1XSE9InVuZGVmaW5lZCI/KHIrKyxlW3NdPXRbdV0pOmRlbGV0ZSBlW3NdOnUgaW5zdGFuY2VvZiBBcnJheT8oZVtzXT1bXSx1LmZvckVhY2goRT0+e2xldCBVPXt9O1dmKFUsdCxFKSYmZVtzXS5wdXNoKFUpfSksZVtzXS5sZW5ndGg/cisrOmRlbGV0ZSBlW3NdKTooZVtzXT17fSxXZihlW3NdLHQsdSk/cisrOmRlbGV0ZSBlW3NdKX0pLHJ9bGV0IHdDPWtlKEViLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+eyFlLnBob3RvRmlsZVBhdGgmJihlLnBob3RvRmlsZVBhdGg9IiIpLGwuY29udGFjdHMuZ2V0QWRkcmVzc0Jvb2sobC5jb250YWN0cy5BRERSRVNTQk9PS19QSE9ORSxyPT57bGV0IHM9ci5jcmVhdGUoKTtXZihzLGUseUMpLHMuc2F2ZSgoKT0+dCgpLHU9Pm4oKSl9LHI9Pm4oKSl9LFNiLHdiKTtmdW5jdGlvbiBPYShlKXtyZXR1cm4gdHlwZW9mIHYhPSJ1bmRlZmluZWQiP3YucmVxdWlyZU1vZHVsZShlKTpfX3JlcXVpcmVOYXRpdmVQbHVnaW5fXyhlKX1mdW5jdGlvbiBicChlLHQsbil7cmV0dXJuIE9hKCJwbHVzIikuc2VuZE5hdGl2ZUV2ZW50KGUsdCxuKX1sZXQgU0M9a2UoQ2IsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57T2EoImNsaXBib2FyZCIpLmdldFN0cmluZyhzPT57cy5yZXN1bHQ9PT0ic3VjY2VzcyI/dCh7ZGF0YTpzLmRhdGF9KTpuKCJnZXRDbGlwYm9hcmREYXRhOmZhaWwiKX0pfSksQ0M9a2UoT2IsKGUse3Jlc29sdmU6dH0pPT57T2EoImNsaXBib2FyZCIpLnNldFN0cmluZyhlLmRhdGEpLHQoKX0sVGIsQWIpLHlwPSJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiO2Z1bmN0aW9uIEVwKCl7d3AoKS50aGVuKCh7bmV0d29ya1R5cGU6ZX0pPT57X3QuaW52b2tlT25DYWxsYmFjayh5cCx7aXNDb25uZWN0ZWQ6ZSE9PSJub25lIixuZXR3b3JrVHlwZTplfSl9KX1sZXQgT0M9S24oeXAsKCk9PntsLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsRXApfSksQUM9S3IoIm9mZk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCgpPT57bC5nbG9iYWxFdmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJuZXRjaGFuZ2UiLEVwKX0pLHdwPWtlKCJnZXROZXR3b3JrVHlwZSIsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49QXJbbC5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO3JldHVybiB0KHtuZXR3b3JrVHlwZTpufSl9KTtmdW5jdGlvbiBTcCgpe2lmKGwub3MubmFtZS50b0xvd2VyQ2FzZSgpIT09ImlvcyIpcmV0dXJuITE7bGV0IHQ9T2EoImZhY2VJRCIpO3JldHVybiEhKHQmJnQuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIENwKCl7cmV0dXJuISEobC5maW5nZXJwcmludCYmbC5maW5nZXJwcmludC5pc1N1cHBvcnQoKSl9bGV0IE9wPWU9PntsZXQgdD1bXTtyZXR1cm4gQ3AoKSYmdC5wdXNoKCJmaW5nZXJQcmludCIpLFNwKCkmJnQucHVzaCgiZmFjaWFsIiksZSYmZSh7c3VwcG9ydE1vZGU6dH0pLHtzdXBwb3J0TW9kZTp0LGVyck1zZzoiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn19LFRDPWtlKGZ5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e09wKHQpfSksQXA9KHtjaGVja0F1dGhNb2RlOmUscmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj0odSxnKT0+biYmbih1LGcpLHM9dT0+dCYmdCh1KTtpZihlPT09ImZpbmdlclByaW50Iil7aWYoQ3AoKSl7bGV0IHU9bC5maW5nZXJwcmludC5pc0tleWd1YXJkU2VjdXJlKCkmJmwuZmluZ2VycHJpbnQuaXNFbnJvbGxlZEZpbmdlcnByaW50cygpO3JldHVybiBzKHtpc0Vucm9sbGVkOnV9KSx7aXNFbnJvbGxlZDp1LGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybiByKCJub3Qgc3VwcG9ydCIse2lzRW5yb2xsZWQ6ITF9KSx7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fWVsc2UgaWYoZT09PSJmYWNpYWwiKXtpZihTcCgpKXtsZXQgdT1PYSgiZmFjZUlEIiksZz11JiZ1LmlzS2V5Z3VhcmRTZWN1cmUoKSYmdS5pc0Vucm9sbGVkRmFjZUlEKCk7cmV0dXJuIHMoe2lzRW5yb2xsZWQ6Z30pLHtpc0Vucm9sbGVkOmcsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOm9rIn19cmV0dXJuIHIoIm5vdCBzdXBwb3J0Iix7aXNFbnJvbGxlZDohMX0pLHtpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19cmV0dXJuIHIoIm5vdCBzdXBwb3J0Iix7aXNFbnJvbGxlZDohMX0pLHtpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19LElDPWtlKGR5LCh7Y2hlY2tBdXRoTW9kZTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntBcCh7Y2hlY2tBdXRoTW9kZTplLHJlc29sdmU6dCxyZWplY3Q6bn0pfSxneSxweSksUEM9a2UodnksKHtyZXF1ZXN0QXV0aE1vZGVzOmUsY2hhbGxlbmdlOnQ9ITEsYXV0aENvbnRlbnQ6bn0se3Jlc29sdmU6cixyZWplY3Q6c30pPT57WG4oKTtsZXR7dDp1fT1sZSgpLHtzdXBwb3J0TW9kZTpnfT1PcCgpO2lmKCFnLmxlbmd0aClyZXR1cm4gcygibm90IHN1cHBvcnQiLHthdXRoTW9kZToiZmluZ2VyUHJpbnQiLGVyckNvZGU6OTAwMDF9KTtsZXQgRT1bXTtpZihlLmZvckVhY2goaHQ9PntnLmluZGV4T2YoaHQpPi0xJiZFLnB1c2goaHQpfSksIUUubGVuZ3RoKXJldHVybiBzKCJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyBjb3JyZXNwb25kaW5nIG1vZGUiLHthdXRoTW9kZToiZmluZ2VyUHJpbnQiLGVyckNvZGU6OTAwMDN9KTtsZXQgVT1bXTtpZihFLmZvckVhY2goaHQ9PntBcCh7Y2hlY2tBdXRoTW9kZTpodH0pLmlzRW5yb2xsZWQmJlUucHVzaChodCl9KSwhVS5sZW5ndGgpcmV0dXJuIHMoYHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vICR7RVswXX0gZW5yb2xsZWRgLHthdXRoTW9kZTpFWzBdLGVyckNvZGU6OTAwMTF9KTtsZXQgUD1VWzBdLEw9bnVsbCxPZSxQZT1ufHx1KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IiksUmU9aHQ9PntsZXR7Y29kZTpwdH09aHQsa3Q9e2F1dGhNb2RlOlB9LFJ0PXs0OigpPT57TD8oQyhPZSksTC5zZXRUaXRsZSh1KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IikpLE9lPWsoKCk9PntMJiZMLnNldFRpdGxlKFBlKX0sMWUzKSk6cygiIixKLmV4dGVuZChrdCx7ZXJyQ29kZTo5MDAwOX0pKX0sNTooKT0+e2wubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkscygiYXV0aGVudGljYXRlIGZyZWV6ZS4gcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsSi5leHRlbmQoa3Qse2VyckNvZGU6OTAwMTB9KSl9LDY6KCk9PntsLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHMoImNhbmNlbCIsSi5leHRlbmQoa3Qse2VyckNvZGU6OTAwMDh9KSl9fTtwdCYmUnRbcHRdP1J0W3B0XSgpOihsLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHMoIiIsSi5leHRlbmQoa3Qse2VyckNvZGU6OTAwMDd9KSkpfTtQPT09ImZpbmdlclByaW50Ij8obC5vcy5uYW1lLnRvTG93ZXJDYXNlKCk9PT0iYW5kcm9pZCImJihMPWwubmF0aXZlVUkuc2hvd1dhaXRpbmcoUGUpLEwub25jbG9zZT1mdW5jdGlvbigpe2wuZmluZ2VycHJpbnQuY2FuY2VsKCl9KSxsLmZpbmdlcnByaW50LmF1dGhlbnRpY2F0ZSgoKT0+e2wubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkscih7YXV0aE1vZGU6UCxlcnJDb2RlOjB9KX0sUmUse21lc3NhZ2U6UGV9KSk6UD09PSJmYWNpYWwiJiZPYSgiZmFjZUlEIikuYXV0aGVudGljYXRlKHttZXNzYWdlOlBlfSxwdD0+e3B0LnR5cGU9PT0ic3VjY2VzcyImJnB0LmNvZGU9PT0wP3Ioe2F1dGhNb2RlOlAsZXJyQ29kZTowfSk6UmUocHQpfSl9LF95LG15KSxOQz1rZShieSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntBbigpO2xldHt0OnJ9PWxlKCksdT11cCgpIT09ImxpZ2h0IixnLEU9ITEsVT0kcyh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDpyKCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9uIiksImZsYXNoLm9mZiI6cigidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8cigidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxyKCJ1bmkuc2NhbkNvZGUuYWxidW0iKSxmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6KCk9PntVLnNlbmRNZXNzYWdlKHt0eXBlOiJnYWxsZXJ5In0pfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja2dyb3VuZDoiIzAwMDAwMCIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uTWVzc2FnZSh7ZXZlbnQ6UCxkZXRhaWw6TH0pe2c9TCxFPVA9PT0ibWFya2VkIn0sb25DbG9zZSgpe3UmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksZz9FPyhkZWxldGUgZy5tZXNzYWdlLHQoZykpOm4oZy5tZXNzYWdlKTpuKCJjYW5jZWwiKX19KTt1JiYobC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksVS53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpQLHJlc3VsdDpMfSk9PntQPT09InN0YXJ0Ij9sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOlA9PT0iZW5kIiYmIUwmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSx5eSx3eSksVHA9ZT0+e190Lmludm9rZU9uQ2FsbGJhY2socmUuT05fVEhFTUVfQ0hBTkdFLGUpfSxrQz1LbihyZS5PTl9USEVNRV9DSEFOR0UsKCk9PntfdC5vbihyZS5PTl9USEVNRV9DSEFOR0UsVHApfSksUkM9S3IocmUuT0ZGX1RIRU1FX0NIQU5HRSwoKT0+e190Lm9mZihyZS5PTl9USEVNRV9DSEFOR0UsVHApfSkseEM9a2UobHksKGUse3Jlc29sdmU6dH0pPT57bGV0IG49bC5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSk7dCh7dmFsdWU6bn0pfSksQkM9a2UoY3ksKGUse3Jlc29sdmU6dH0pPT57bC5zY3JlZW4uc2V0QnJpZ2h0bmVzcyhlLnZhbHVlLCExKSx0KCl9KSxNQz1rZSh1eSwoZSx7cmVzb2x2ZTp0fSk9PntsLmRldmljZS5zZXRXYWtlbG9jayghIWUua2VlcFNjcmVlbk9uKSx0KCl9KSxEQz1EdChTeSwoKT0+e2xldHtnZXRTeXN0ZW1TZXR0aW5nOmV9PXYucmVxdWlyZU1vZHVsZSgicGx1cyIpLHQ9ZSgpO3RyeXt0eXBlb2YgdD09InN0cmluZyImJih0PUpTT04ucGFyc2UodCkpfWNhdGNoKG4pe31yZXR1cm4gdH0pLElwPUR0KEN5LCgpPT57bGV0e2dldEFwcEF1dGhvcml6ZVNldHRpbmc6ZX09di5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fWZvcihsZXQgbiBpbiB0KUouaGFzT3duKHQsbikmJnRbbl09PT0idW5kZWZpbmVkIiYmKHRbbl09dm9pZCAwKTtyZXR1cm4gdH0pLExDPWtlKE95LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpyfT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyKHU9Pnt1LnR5cGU9PT0ic3VjY2VzcyI/dCgpOm4oKX0pfSksRkM9a2UoZDAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9bmkrIi9kb3dubG9hZC8iO2wuaW8uZ2V0SW1hZ2VJbmZvKEouZXh0ZW5kKGUse3NhdmVQYXRoOnIsZmlsZW5hbWU6cixzdWNjZXNzOkdsKHQpLGZhaWw6YnIobil9KSl9LHAwLGgwKSxWQz1rZShiMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6ZS5zcmMsc3VjY2VzczpyPT57dCh7b3JpZW50YXRpb246ci5vcmllbnRhdGlvbix0eXBlOnIudHlwZSxkdXJhdGlvbjpyLmR1cmF0aW9uLHNpemU6ci5zaXplLGhlaWdodDpyLmhlaWdodCx3aWR0aDpyLndpZHRoLGZwczpyLmZwc3x8MzAsYml0cmF0ZTpyLmJpdHJhdGV9KX0sZmFpbDpicihuKX0pfSxFMCx5MCksVUM9a2UoZzAsKHtjdXJyZW50OmU9MCxpbmRpY2F0b3I6dD0ibnVtYmVyIixsb29wOm49ITEsdXJsczpyLGxvbmdQcmVzc0FjdGlvbnM6c30se3Jlc29sdmU6dSxyZWplY3Q6Z30pPT57bHQoKTtsZXR7dDpFfT1sZSgpO3I9ci5tYXAoUD0+S2UoUCkpO2xldCBVPU51bWJlcihlKTtpc05hTihVKT8oZT1yLmluZGV4T2YoS2UoZSkpLGU9ZTwwPzA6ZSk6ZT1VLGwubmF0aXZlVUkucHJldmlld0ltYWdlKHIse2N1cnJlbnQ6ZSxpbmRpY2F0b3I6dCxsb29wOm4sb25Mb25nUHJlc3M6ZnVuY3Rpb24oUCl7bGV0IEw9W10sT2U9IiIsUGU9cyYmSi5pc1BsYWluT2JqZWN0KHMpO1BlPyhMPXMuaXRlbUxpc3Q/cy5pdGVtTGlzdDpbXSxPZT1zLml0ZW1Db2xvcj9zLml0ZW1Db2xvcjoiIzAwMDAwMCIpOihMPVtFKCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLE9lPSIjMDAwMDAwIik7bGV0IFJlPXtidXR0b25zOkwubWFwKGh0PT4oe3RpdGxlOmh0LGNvbG9yOk9lfSkpLGNhbmNlbDpFKCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtsLm5hdGl2ZVVJLmFjdGlvblNoZWV0KFJlLGh0PT57aWYoaHQuaW5kZXg+MCl7aWYoUGUpe0ouaXNGdW5jdGlvbihzLnN1Y2Nlc3MpJiZzLnN1Y2Nlc3Moe3RhcEluZGV4Omh0LmluZGV4LTEsaW5kZXg6UC5pbmRleH0pO3JldHVybn1sLmdhbGxlcnkuc2F2ZShQLnVybCwoKT0+e2wubmF0aXZlVUkudG9hc3QoRSgidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7bC5uYXRpdmVVSS50b2FzdChFKCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2UgUGUmJkouaXNGdW5jdGlvbihzLmZhaWwpJiZzLmZhaWwoe2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSksdSgpfSxtMCx2MCksJEM9a2UoXzAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57dHJ5e2wubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx0KCl9Y2F0Y2gocil7bigpfX0pLEdmLE5jPSExLFlmLGtjPShlLHQ9e30pPT57SEMoSi5leHRlbmQoe3N0YXRlOmV9LHQpKX0scHU9e3N0YXJ0KHtkdXJhdGlvbjplPTZlNCxzYW1wbGVSYXRlOnQsbnVtYmVyT2ZDaGFubmVsczpuLGVuY29kZUJpdFJhdGU6cixmb3JtYXQ6cz0ibXAzIixmcmFtZVNpemU6dX09e30pe2lmKE5jKXJldHVybiBrYygic3RhcnQiKTtHZj1sLmF1ZGlvLmdldFJlY29yZGVyKCksR2YucmVjb3JkKHtmb3JtYXQ6cyxzYW1wbGVyYXRlOnQ/U3RyaW5nKHQpOnZvaWQgMCxmaWxlbmFtZTpuaSsiL3JlY29yZGVyLyJ9LGc9PmtjKCJzdG9wIix7dGVtcEZpbGVQYXRoOmd9KSxnPT5rYygiZXJyb3IiLHtlcnJNc2c6Zy5tZXNzYWdlfSkpLFlmPWsoKCk9PntwdS5zdG9wKCl9LGUpLGtjKCJzdGFydCIpLE5jPSEwfSxzdG9wKCl7TmMmJihHZi5zdG9wKCksTmM9ITEsWWYmJkMoWWYpKX0scGF1c2UoKXtOYyYma2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWUoKXtOYyYma2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19LFlsPXtwYXVzZTpudWxsLHJlc3VtZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLGVycm9yOm51bGx9O2Z1bmN0aW9uIEhDKGUpe2xldCB0PWUuc3RhdGU7ZGVsZXRlIGUuc3RhdGUsZGVsZXRlIGUuZXJyTXNnLHQmJkouaXNGdW5jdGlvbihZbFt0XSkmJllsW3RdKGUpfWNsYXNzIGpDe2NvbnN0cnVjdG9yKCl7fW9uRXJyb3IodCl7WWwuZXJyb3I9dH1vbkZyYW1lUmVjb3JkZWQodCl7fW9uSW50ZXJydXB0aW9uQmVnaW4odCl7fW9uSW50ZXJydXB0aW9uRW5kKHQpe31vblBhdXNlKHQpe1lsLnBhdXNlPXR9b25SZXN1bWUodCl7WWwucmVzdW1lPXR9b25TdGFydCh0KXtZbC5zdGFydD10fW9uU3RvcCh0KXtZbC5zdG9wPXR9cGF1c2UoKXtwdS5wYXVzZSgpfXJlc3VtZSgpe3B1LnJlc3VtZSgpfXN0YXJ0KHQ9e30pe3B1LnN0YXJ0KHQpfXN0b3AoKXtwdS5zdG9wKCl9fWxldCBQcCx6Qz1EdChJMCwoKT0+UHB8fChQcD1uZXcgakMpKSxXQz1rZShPMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsLmdhbGxlcnkuc2F2ZShlLmZpbGVQYXRoLEdsKHQpLGJyKG4pKX0sVDAsQTApLEdDPWtlKHcwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2wuZ2FsbGVyeS5zYXZlKGUuZmlsZVBhdGgsR2wodCksYnIobikpfSxDMCxTMCksWUM9a2UoUDAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9YCR7bml9L2NvbXByZXNzZWQvJHtEYXRlLm5vdygpfV8ke1ZvKGUuc3JjKX1gLHtjb21wcmVzc2VkV2lkdGg6cyxjb21wcmVzc2VkSGVpZ2h0OnV9PWU7dHlwZW9mIHM9PSJudW1iZXIiJiYoZS53aWR0aD1zKyJweCIpLHR5cGVvZiB1PT0ibnVtYmVyIiYmKGUuaGVpZ2h0PXUrInB4IiksbC56aXAuY29tcHJlc3NJbWFnZShKLmV4dGVuZCh7fSxlLHtkc3Q6cn0pLCgpPT57dCh7dGVtcEZpbGVQYXRoOnJ9KX0sbil9LGswLE4wKSxxQz1rZShSMCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1gJHtuaX0vY29tcHJlc3NlZC8ke0RhdGUubm93KCl9XyR7Vm8oZS5zcmMpfWA7bC56aXAuY29tcHJlc3NWaWRlbyhKLmV4dGVuZCh7fSxlLHtmaWxlbmFtZTpyfSkscz0+e3Qoe3RlbXBGaWxlUGF0aDpyLHNpemU6cy5zaXplfSl9LG4pfSxCMCx4MCk7ZnVuY3Rpb24gSkMoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57bC5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUsZnVuY3Rpb24ocil7ci5nZXRNZXRhZGF0YSh0LG4sITEpfSxuKX0pfWxldCBLQz1rZShhMCwoe2NvdW50OmUsc2l6ZVR5cGU6dCxzb3VyY2VUeXBlOm4sY3JvcDpyfT17fSx7cmVzb2x2ZTpzLHJlamVjdDp1fSk9PntjZSgpO2xldHt0Omd9PWxlKCksRT1icih1KTtmdW5jdGlvbiBVKE9lKXtsZXQgUGU9W10sUmU9W107UHJvbWlzZS5hbGwoT2UubWFwKGh0PT5KQyhodCkpKS50aGVuKGh0PT57aHQuZm9yRWFjaCgocHQsa3QpPT57bGV0IFJ0PU9lW2t0XTtSZS5wdXNoKFJ0KSxQZS5wdXNoKHtwYXRoOlJ0LHNpemU6cHQuc2l6ZX0pfSkscyh7dGVtcEZpbGVQYXRoczpSZSx0ZW1wRmlsZXM6UGV9KX0pLmNhdGNoKEUpfWZ1bmN0aW9uIFAoKXtsLmNhbWVyYS5nZXRDYW1lcmEoKS5jYXB0dXJlSW1hZ2UoUGU9PlUoW1BlXSksRSx7ZmlsZW5hbWU6bmkrIi9jYW1lcmEvIixyZXNvbHV0aW9uOiJoaWdoIixjcm9wOnIsc2l6ZVR5cGU6dH0pfWZ1bmN0aW9uIEwoKXtsLmdhbGxlcnkucGljaygoe2ZpbGVzOk9lfSk9PlUoT2UpLEUse21heGltdW06ZSxtdWx0aXBsZTohMCxzeXN0ZW06ITEsZmlsZW5hbWU6bmkrIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwLGNyb3A6cixzaXplVHlwZTp0fSl9aWYobi5sZW5ndGg9PT0xKXtpZihuLmluY2x1ZGVzKCJhbGJ1bSIpKXtMKCk7cmV0dXJufWVsc2UgaWYobi5pbmNsdWRlcygiY2FtZXJhIikpe1AoKTtyZXR1cm59fWwubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDpnKCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmcoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6ZygidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxPZT0+e3N3aXRjaChPZS5pbmRleCl7Y2FzZSAxOlAoKTticmVhaztjYXNlIDI6TCgpO2JyZWFrO2RlZmF1bHQ6RSgpO2JyZWFrfX0pfSxsMCxzMCksWkM9a2UoYzAsKHtzb3VyY2VUeXBlOmUsY29tcHJlc3NlZDp0LG1heER1cmF0aW9uOm4sY2FtZXJhOnJ9LHtyZXNvbHZlOnMscmVqZWN0OnV9KT0+e3hlKCk7bGV0e3Q6Z309bGUoKSxFPWJyKHUpO2Z1bmN0aW9uIFUoT2Upe2wuaW8uZ2V0VmlkZW9JbmZvKHtmaWxlUGF0aDpPZSxzdWNjZXNzKFBlKXtsZXQgUmU9e2Vyck1zZzoiY2hvb3NlVmlkZW86b2siLHRlbXBGaWxlUGF0aDpPZSxzaXplOlBlLnNpemUsZHVyYXRpb246UGUuZHVyYXRpb24sd2lkdGg6UGUud2lkdGgsaGVpZ2h0OlBlLmhlaWdodH07cyhSZSl9LGZhaWw6RX0pfWZ1bmN0aW9uIFAoKXtsLmdhbGxlcnkucGljaygoe2ZpbGVzOk9lfSk9PlUoT2VbMF0pLEUse2ZpbHRlcjoidmlkZW8iLHN5c3RlbTohMSxtdWx0aXBsZTohMCxtYXhpbXVtOjEsZmlsZW5hbWU6bmkrIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwLHZpZGVvQ29tcHJlc3M6dH0pfWZ1bmN0aW9uIEwoKXtsLmNhbWVyYS5nZXRDYW1lcmEoKS5zdGFydFZpZGVvQ2FwdHVyZShVLEUse2luZGV4OnI9PT0iZnJvbnQiPyIyIjoiMSIsdmlkZW9NYXhpbXVtRHVyYXRpb246bixmaWxlbmFtZTpuaSsiL2NhbWVyYS8iLHZpZGVvQ29tcHJlc3M6dH0pfWlmKGUubGVuZ3RoPT09MSl7aWYoZS5pbmNsdWRlcygiYWxidW0iKSl7UCgpO3JldHVybn1lbHNlIGlmKGUuaW5jbHVkZXMoImNhbWVyYSIpKXtMKCk7cmV0dXJufX1sLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHtjYW5jZWw6ZygidW5pLmNob29zZVZpZGVvLmNhbmNlbCIpLGJ1dHRvbnM6W3t0aXRsZTpnKCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOmcoInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIil9XX0sT2U9Pntzd2l0Y2goT2UuaW5kZXgpe2Nhc2UgMTpMKCk7YnJlYWs7Y2FzZSAyOlAoKTticmVhaztkZWZhdWx0OkUoKTticmVha319KX0sZjAsdTApLFhDPWtlKFp5LChlLHtyZXNvbHZlOnR9KT0+e2wua2V5LnNob3dTb2Z0S2V5Ym9yZCgpLHQoKX0pLFFDPWtlKEt5LChlLHtyZXNvbHZlOnR9KT0+e2wua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHQoKX0pO2Z1bmN0aW9uIE5wKGUpe190Lmludm9rZU9uQ2FsbGJhY2socmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxlKX1sZXQgZU89S24ocmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSwoKT0+e190Lm9uKHJlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsTnApfSksdE89S3IocmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSwoKT0+e190Lm9mZihyZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLE5wKX0pO2NsYXNzIG5Pe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLl9kb3dubG9hZGVyPXQsdC5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLChuLHIpPT57bi5kb3dubG9hZGVkU2l6ZSYmbi50b3RhbFNpemUmJnRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKHM9PntzKHtwcm9ncmVzczpNYXRoLnJvdW5kKG4uZG93bmxvYWRlZFNpemUvbi50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjpuLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6bi50b3RhbFNpemV9KX0pfSl9YWJvcnQoKXt0aGlzLl9kb3dubG9hZGVyLmFib3J0KCl9b25Qcm9ncmVzc1VwZGF0ZSh0KXshSi5pc0Z1bmN0aW9uKHQpfHx0aGlzLl9jYWxsYmFja3MucHVzaCh0KX1vZmZQcm9ncmVzc1VwZGF0ZSh0KXtsZXQgbj10aGlzLl9jYWxsYmFja3MuaW5kZXhPZih0KTtuPj0wJiZ0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9b25IZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfW9mZkhlYWRlcnNSZWNlaXZlZCh0KXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fWxldCByTz11cihXMCwoe3VybDplLGhlYWRlcjp0LHRpbWVvdXQ6bn0se3Jlc29sdmU6cixyZWplY3Q6c30pPT57bj0obnx8Ui5uZXR3b3JrVGltZW91dCYmUi5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2MCoxZTMpLzFlMztsZXQgdT1sLmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQoZSx7dGltZW91dDpuLGZpbGVuYW1lOm5pKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKEUsVSk9PntVP3Ioe3RlbXBGaWxlUGF0aDpFLmZpbGVuYW1lLHN0YXR1c0NvZGU6VX0pOnMoYHN0YXR1c0NvZGU6ICR7VX1gKX0pLGc9bmV3IG5PKHUpO2ZvcihsZXQgRSBpbiB0KUouaGFzT3duKHQsRSkmJnUuc2V0UmVxdWVzdEhlYWRlcihFLHRbRV0pO3JldHVybiB1LnN0YXJ0KCksZ30sWTAsRzApLGlPPWU9PntsZXQgdD1lWyJTZXQtQ29va2llIl18fGVbInNldC1jb29raWUiXSxuPVtdO2lmKCF0KXJldHVybltdO3RbMF09PT0iWyImJnRbdC5sZW5ndGgtMV09PT0iXSImJih0PXQuc2xpY2UoMSwtMSkpO2xldCByPXQuc3BsaXQoIjsiKTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrKylyW3NdLmluZGV4T2YoIkV4cGlyZXM9IikhPT0tMXx8cltzXS5pbmRleE9mKCJleHBpcmVzPSIpIT09LTE/bi5wdXNoKHJbc10ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltzXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKSxufTtmdW5jdGlvbiBvTyhlLHQpe2lmKEouaXNTdHJpbmcoZS5kYXRhKSYmZS5kYXRhLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKGUuZGF0YT1lLmRhdGEuc2xpY2UoMSkpLGUuc3RhdHVzQ29kZT1wYXJzZUludChTdHJpbmcoZS5zdGF0dXNDb2RlKSwxMCksSi5pc1BsYWluT2JqZWN0KGUuaGVhZGVyKSYmKGUuaGVhZGVyPU9iamVjdC5rZXlzKGUuaGVhZGVyKS5yZWR1Y2UoZnVuY3Rpb24obixyKXtsZXQgcz1lLmhlYWRlcltyXTtyZXR1cm4gSi5pc0FycmF5KHMpP25bcl09cy5qb2luKCIsIik6Si5pc1N0cmluZyhzKSYmKG5bcl09cyksbn0se30pKSx0LmRhdGFUeXBlJiZ0LmRhdGFUeXBlLnRvTG93ZXJDYXNlKCk9PT0ianNvbiIpdHJ5e2UuZGF0YT1KU09OLnBhcnNlKGUuZGF0YSl9Y2F0Y2gobil7fXJldHVybiBlfWNsYXNzIGFPe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3JlcXVlc3RUYXNrPXR9YWJvcnQoKXt0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCgpfW9mZkhlYWRlcnNSZWNlaXZlZCgpe31vbkhlYWRlcnNSZWNlaXZlZCgpe319bGV0IHNPPXVyKE0wLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldHtoZWFkZXI6cixtZXRob2Q6cyxkYXRhOnUsdGltZW91dDpnLHVybDpFLHJlc3BvbnNlVHlwZTpVLHNzbFZlcmlmeTpQLGZpcnN0SXB2NDpMLHRsczpPZX09ZSxQZTtmb3IobGV0IHd0IGluIHIpaWYod3QudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXtQZT1yW3d0XTticmVha31zIT09IkdFVCImJlBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT09PTAmJkouaXNQbGFpbk9iamVjdCh1KSYmKHU9SlNPTi5zdHJpbmdpZnkodSkpO2xldCBSZT1PYSgic3RyZWFtIiksaHQ9e30scHQsa3QsUnQ9ITE7Zm9yKGxldCB3dCBpbiByKWlmKCFSdCYmd3QudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXtpZihSdD0hMCxodFsiQ29udGVudC1UeXBlIl09clt3dF0scyE9PSJHRVQiJiZyW3d0XS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJiFKLmlzU3RyaW5nKHUpJiYhKHUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpe2xldCB2bj1bXTtmb3IobGV0IG9uIGluIHUpSi5oYXNPd24odSxvbikmJnZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KG9uKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHVbb25dKSk7dT12bi5qb2luKCImIil9fWVsc2UgaHRbd3RdPXJbd3RdOyFSdCYmcz09PSJQT1NUIiYmKGh0WyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IiksZyYmKHB0PWsoKCk9PntrdD0hMCxuKCJ0aW1lb3V0Iil9LGcrMjAwKSk7bGV0IGRuPXttZXRob2Q6cyx1cmw6RS50cmltKCksaGVhZGVyczpodCx0eXBlOlU9PT0iYXJyYXlidWZmZXIiPyJiYXNlNjQiOiJ0ZXh0Iix0aW1lb3V0Omd8fDZlNSxzc2xWZXJpZnk6IVAsZmlyc3RJcHY0OkwsdGxzOk9lfSxsbj0hMTtzIT09IkdFVCImJih0b1N0cmluZy5jYWxsKHUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9sbj0hMDpkbi5ib2R5PUouaXNTdHJpbmcodSk/dTpKU09OLnN0cmluZ2lmeSh1KSk7bGV0IGp0PSh7b2s6d3Qsc3RhdHVzOnZuLGRhdGE6b24saGVhZGVyczpYdCxlcnJvck1zZzpJbn0pPT57aWYoa3QpcmV0dXJuO3B0JiZDKHB0KTtsZXQgeXI9dm47aWYoeXI+MCl0KG9PKHtkYXRhOnd0JiZVPT09ImFycmF5YnVmZmVyIj9Ybyhvbik6b24sc3RhdHVzQ29kZTp5cixoZWFkZXI6WHQsY29va2llczppTyhYdCl9LGUpKTtlbHNle2xldCBRdD0iYWJvcnQgc3RhdHVzQ29kZToiK3lyO0luJiYoUXQ9UXQrIiAiK0luKSxuKFF0KX19O3JldHVybiBsbj9SZS5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6SGkodSl9LGRuLGp0KTpSZS5mZXRjaChkbixqdCksbmV3IGFPKHthYm9ydCgpe2t0PSEwLHB0JiZDKHB0KSxuKCJhYm9ydCIpfX0pfSxVMCwkMCksbE89a2UoSDAsKHtjZXJ0aWZpY2F0ZXM6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57T2EoInN0cmVhbSIpLmNvbmZpZ01UTFMoZSwoe3R5cGU6cyxjb2RlOnUsbWVzc2FnZTpnfSk9Pntzd2l0Y2gocyl7Y2FzZSJzdWNjZXNzIjp0KHtjb2RlOnV9KTticmVhaztjYXNlImZhaWwiOm4oZyx7Y29kZTp1fSk7YnJlYWt9fSl9LGowLHowKSxSYz1bXSx4Yz17fSxxZj17b3BlbjoiIixjbG9zZToiIixlcnJvcjoiIixtZXNzYWdlOiIifSxndTtmdW5jdGlvbiBjTyhlKXtsZXQgdD1TdHJpbmcoRGF0ZS5ub3coKSksbjt0cnl7Z3V8fChndT1PYSgidW5pLXdlYlNvY2tldCIpLHVPKGd1KSksZ3UuV2ViU29ja2V0KHtpZDp0LHVybDplLnVybCxwcm90b2NvbDpKLmlzQXJyYXkoZS5wcm90b2NvbHMpP2UucHJvdG9jb2xzLmpvaW4oIiwiKTplLnByb3RvY29scyxoZWFkZXI6ZS5oZWFkZXJ9KX1jYXRjaChyKXtuPXJ9cmV0dXJue3NvY2tldDpndSxzb2NrZXRJZDp0LGVyck1zZzpufX1mdW5jdGlvbiB1TyhlKXtlLm9ub3Blbih0PT57bGV0IG49eGNbdC5pZF07IW58fG4uX3NvY2tldE9uT3BlbigpfSksZS5vbm1lc3NhZ2UodD0+e2xldCBuPXhjW3QuaWRdOyFufHxuLl9zb2NrZXRPbk1lc3NhZ2UodCl9KSxlLm9uZXJyb3IodD0+e2xldCBuPXhjW3QuaWRdOyFufHxuLl9zb2NrZXRPbkVycm9yKCl9KSxlLm9uY2xvc2UodD0+e2xldHtpZDpuLGNvZGU6cixyZWFzb246c309dCx1PXhjW25dOyF1fHx1Ll9zb2NrZXRPbkNsb3NlKHtjb2RlOnIscmVhc29uOnN9KX0pfWNsYXNzIGZPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD1uLHRoaXMuX3NvY2tldD10LHRoaXMuX2NhbGxiYWNrcz17b3BlbjpbXSxjbG9zZTpbXSxlcnJvcjpbXSxtZXNzYWdlOltdfSx0aGlzLkNMT1NFRD0zLHRoaXMuQ0xPU0lORz0yLHRoaXMuQ09OTkVDVElORz0wLHRoaXMuT1BFTj0xLHRoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NFRCwhIXRoaXMuX3NvY2tldH1fc29ja2V0T25PcGVuKCl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuT1BFTix0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJvcGVuIil9X3NvY2tldE9uTWVzc2FnZSh0KXt0aGlzLnNvY2tldFN0YXRlQ2hhbmdlKCJtZXNzYWdlIix7ZGF0YTp0eXBlb2YgdC5kYXRhPT0ib2JqZWN0Ij9Ybyh0LmRhdGEuYmFzZTY0KTp0LmRhdGF9KX1fc29ja2V0T25FcnJvcigpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoImVycm9yIiksdGhpcy5vbkVycm9yT3JDbG9zZSgpfV9zb2NrZXRPbkNsb3NlKHQpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoImNsb3NlIix0KSx0aGlzLm9uRXJyb3JPckNsb3NlKCl9b25FcnJvck9yQ2xvc2UoKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TRUQsZGVsZXRlIHhjW3RoaXMuaWRdO2xldCB0PVJjLmluZGV4T2YodGhpcyk7dD49MCYmUmMuc3BsaWNlKHQsMSl9c29ja2V0U3RhdGVDaGFuZ2UodCxuPXt9KXtsZXR7Y29kZTpyLHJlYXNvbjpzfT1uLHU9dD09PSJtZXNzYWdlIj97ZGF0YTpuLmRhdGF9OnQ9PT0iY2xvc2UiP3tjb2RlOnIscmVhc29uOnN9Ont9O3RoaXM9PT1SY1swXSYmcWZbdF0mJl90Lmludm9rZU9uQ2FsbGJhY2socWZbdF0sdSksdGhpcy5fY2FsbGJhY2tzW3RdLmZvckVhY2goZz0+e0ouaXNGdW5jdGlvbihnKSYmZyh1KX0pfXNlbmQodCxuPSEwKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnJlLmNhbGxPcHRpb25zKHQsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt0cnl7dGhpcy5fc29ja2V0LnNlbmQoe2lkOnRoaXMuaWQsZGF0YTp0eXBlb2YgdC5kYXRhPT0ib2JqZWN0Ij97IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6SGkodC5kYXRhKX06dC5kYXRhfSksbiYmcmUuY2FsbE9wdGlvbnModCwic2VuZFNvY2tldE1lc3NhZ2U6b2siKX1jYXRjaChyKXtuJiZyZS5jYWxsT3B0aW9ucyh0LGBzZW5kU29ja2V0TWVzc2FnZTpmYWlsICR7cn1gKX19Y2xvc2UodCxuPSEwKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TSU5HO3RyeXt0aGlzLl9zb2NrZXQuY2xvc2UoSi5leHRlbmQoe2lkOnRoaXMuaWQsYXJnczp0fSkpLG4mJnJlLmNhbGxPcHRpb25zKHQsImNsb3NlU29ja2V0Om9rIil9Y2F0Y2gocil7biYmcmUuY2FsbE9wdGlvbnModCxgY2xvc2VTb2NrZXQ6ZmFpbCAke3J9YCl9fW9uT3Blbih0KXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKHQpfW9uQ2xvc2UodCl7dGhpcy5fY2FsbGJhY2tzLmNsb3NlLnB1c2godCl9b25FcnJvcih0KXt0aGlzLl9jYWxsYmFja3MuZXJyb3IucHVzaCh0KX1vbk1lc3NhZ2UodCl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaCh0KX19bGV0IGRPPXVyKFowLCh7dXJsOmUscHJvdG9jb2xzOnQsaGVhZGVyOm4sbWV0aG9kOnJ9LHtyZXNvbHZlOnMscmVqZWN0OnV9KT0+e2xldHtzb2NrZXQ6Zyxzb2NrZXRJZDpFLGVyck1zZzpVfT1jTyh7dXJsOmUscHJvdG9jb2xzOnQsaGVhZGVyOm4sbWV0aG9kOnJ9KSxQPW5ldyBmTyhnLEUpO3JldHVybiBVP2soKCk9Pnt1KFUpfSwwKTooUmMucHVzaChQKSx4Y1tFXT1QKSxrKCgpPT57cygpfSwwKSxQfSxRMCxYMCksaE89a2UoZUUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9UmNbMF07aWYoIXJ8fHIucmVhZHlTdGF0ZSE9PXIuT1BFTil7bigiV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTtyZXR1cm59ci5zZW5kKHtkYXRhOmUuZGF0YX0sITEpLHQoKX0sdEUpLHBPPWtlKG5FLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVJjWzBdO2lmKCFyKXtuKCJXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3JldHVybn1yLnJlYWR5U3RhdGU9ci5DTE9TSU5HLHIuY2xvc2UoZSwhMSksdCgpfSxyRSk7ZnVuY3Rpb24gRnUoZSl7bGV0IHQ9YG9uU29ja2V0JHtKLmNhcGl0YWxpemUoZSl9YDtyZXR1cm4gS24odCwoKT0+e3FmW2VdPXR9KX1sZXQgZ089RnUoIm9wZW4iKSx2Tz1GdSgiZXJyb3IiKSxtTz1GdSgibWVzc2FnZSIpLF9PPUZ1KCJjbG9zZSIpO2NsYXNzIGJPe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLl91cGxvYWRlcj10LHQuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIiwobixyKT0+e24udXBsb2FkZWRTaXplJiZuLnRvdGFsU2l6ZSYmdGhpcy5fY2FsbGJhY2tzLmZvckVhY2gocz0+e3Moe3Byb2dyZXNzOnBhcnNlSW50KFN0cmluZyhuLnVwbG9hZGVkU2l6ZS9uLnRvdGFsU2l6ZSoxMDApKSx0b3RhbEJ5dGVzU2VudDpuLnVwbG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6bi50b3RhbFNpemV9KX0pfSl9YWJvcnQoKXt0aGlzLl91cGxvYWRlci5hYm9ydCgpfW9uUHJvZ3Jlc3NVcGRhdGUodCl7IUouaXNGdW5jdGlvbih0KXx8dGhpcy5fY2FsbGJhY2tzLnB1c2godCl9b25IZWFkZXJzUmVjZWl2ZWQoKXt9b2ZmUHJvZ3Jlc3NVcGRhdGUodCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YodCk7bj49MCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZShuLDEpfW9mZkhlYWRlcnNSZWNlaXZlZCgpe319bGV0IHlPPXVyKHEwLCh7dXJsOmUsdGltZW91dDp0LGhlYWRlcjpuLGZvcm1EYXRhOnIsZmlsZXM6cyxmaWxlUGF0aDp1LG5hbWU6Z30se3Jlc29sdmU6RSxyZWplY3Q6VX0pPT57dD0odHx8Ui5uZXR3b3JrVGltZW91dCYmUi5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlfHw2MCoxZTMpLzFlMztsZXQgUD1sLnVwbG9hZGVyLmNyZWF0ZVVwbG9hZChlLHt0aW1lb3V0OnQscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LChPZSxQZSk9PntQZT9FKHtkYXRhOk9lLnJlc3BvbnNlVGV4dCxzdGF0dXNDb2RlOlBlfSk6VShgc3RhdHVzQ29kZTogJHtQZX1gKX0pO2ZvcihsZXQgT2UgaW4gbilKLmhhc093bihuLE9lKSYmUC5zZXRSZXF1ZXN0SGVhZGVyKE9lLFN0cmluZyhuW09lXSkpO2ZvcihsZXQgT2UgaW4gcilKLmhhc093bihyLE9lKSYmUC5hZGREYXRhKE9lLFN0cmluZyhyW09lXSkpO3MmJnMubGVuZ3RoP3MuZm9yRWFjaChPZT0+e1AuYWRkRmlsZShLZShPZS51cmkpLHtrZXk6T2UubmFtZXx8ImZpbGUifSl9KTpQLmFkZEZpbGUoS2UodSkse2tleTpnfSk7bGV0IEw9bmV3IGJPKFApO3JldHVybiBQLnN0YXJ0KCksTH0sSzAsSjApLE9sPXt9LEVPPVsicGxheSIsImNhbnBsYXkiLCJlbmRlZCIsInN0b3AiLCJ3YWl0aW5nIiwic2Vla2luZyIsInNlZWtlZCIsInBhdXNlIl0sa3A9InBsYXliYWNrIix3Tz0yMDAsU089ZT0+e2xldCB0PU9sW2VdOyF0fHx0LmluaXRTdGF0ZUNoYWdlfHwodC5pbml0U3RhdGVDaGFnZT0hMCx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixuPT57UnAoe3N0YXRlOiJlcnJvciIsYXVkaW9JZDplLGVyck1zZzoiTWVkaWFFcnJvciIsZXJyQ29kZTpuLmNvZGV9KX0pLEVPLmZvckVhY2gobj0+e3QuYWRkRXZlbnRMaXN0ZW5lcihuLCgpPT57bj09PSJwbGF5Ij90LmlzU3RvcHBlZD0hMTpuPT09InN0b3AiJiYodC5pc1N0b3BwZWQ9ITApLFJwKHtzdGF0ZTpuLGF1ZGlvSWQ6ZX0pfSl9KSl9O2Z1bmN0aW9uIENPKCl7bGV0IGU9YCR7RGF0ZS5ub3coKX0ke01hdGgucmFuZG9tKCl9YCx0PU9sW2VdPWwuYXVkaW8uY3JlYXRlUGxheWVyKCIiKTtyZXR1cm4gdC5zcmM9IiIsdC52b2x1bWU9MSx0LnN0YXJ0VGltZT0wLHQuc2V0U2Vzc2lvbkNhdGVnb3J5KGtwKSx7ZXJyTXNnOiJjcmVhdGVBdWRpb0luc3RhbmNlOm9rIixhdWRpb0lkOmV9fWZ1bmN0aW9uIE9PKHthdWRpb0lkOmUsc3JjOnQsc3RhcnRUaW1lOm4sYXV0b3BsYXk6cj0hMSxsb29wOnM9ITEsb2JleU11dGVTd2l0Y2g6dSx2b2x1bWU6ZyxzZXNzaW9uQ2F0ZWdvcnk6RT1rcCxwbGF5YmFja1JhdGU6VX0pe2xldCBQPU9sW2VdO2lmKFApe2xldCBMPXtsb29wOnMsYXV0b3BsYXk6cn07aWYodCl7bGV0IE9lPUtlKHQpO1Auc3JjIT09T2UmJihQLnNyYz1MLnNyYz1PZSl9biYmKFAuc3RhcnRUaW1lPUwuc3RhcnRUaW1lPW4pLHR5cGVvZiBnPT0ibnVtYmVyIiYmKFAudm9sdW1lPUwudm9sdW1lPWcpLFAuc2V0U3R5bGVzKEwpLEUmJlAuc2V0U2Vzc2lvbkNhdGVnb3J5KEUpLFUmJlAucGxheWJhY2tSYXRlJiZQLnBsYXliYWNrUmF0ZShVKSxTTyhlKX1yZXR1cm57ZXJyTXNnOiJzZXRBdWRpb1N0YXRlOm9rIn19ZnVuY3Rpb24gQU8oe2F1ZGlvSWQ6ZX0pe2xldCB0PU9sW2VdO2lmKCF0KXJldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6ZmFpbCJ9O2xldHtzcmM6bixzdGFydFRpbWU6cix2b2x1bWU6c309dDtyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOm9rIixkdXJhdGlvbjoxZTMqKHQuZ2V0RHVyYXRpb24oKXx8MCksY3VycmVudFRpbWU6dC5pc1N0b3BwZWQ/MDoxZTMqdC5nZXRQb3NpdGlvbigpLHBhdXNlZDp0LmlzUGF1c2VkKCksc3JjOm4sdm9sdW1lOnMsc3RhcnRUaW1lOjFlMypyLGJ1ZmZlcmVkOjFlMyp0LmdldEJ1ZmZlcmVkKCl9fWZ1bmN0aW9uIFRPKHtvcGVyYXRpb25UeXBlOmUsYXVkaW9JZDp0LGN1cnJlbnRUaW1lOm59KXtsZXQgcj1PbFt0XTtzd2l0Y2goZSl7Y2FzZSJwbGF5IjpjYXNlInBhdXNlIjpjYXNlInN0b3AiOnJbZT09PSJwbGF5IiYmci5pc1BhdXNlZCgpPyJyZXN1bWUiOmVdKCk7YnJlYWs7Y2FzZSJzZWVrIjp0eXBlb2YgbiE9InVuZGVmaW5lZCImJnIuc2Vla1RvKG4vMWUzKTticmVha31yZXR1cm57ZXJyTXNnOiJvcGVyYXRlQXVkaW86b2sifX1sZXQgSmY9T2JqZWN0LmNyZWF0ZShudWxsKSxScD0oe3N0YXRlOmUsYXVkaW9JZDp0LGVyck1zZzpuLGVyckNvZGU6cn0pPT57bGV0IHM9SmZbdF07aWYocylpZihaZihzLGUsbixyKSxlPT09InBsYXkiKXtsZXQgdT1zLmN1cnJlbnRUaW1lO1pmKHMsInRpbWVVcGRhdGUiKSxzLl9fdGltaW5nPWQoKCk9PntzLmN1cnJlbnRUaW1lIT09dSYmWmYocywidGltZVVwZGF0ZSIpfSx3Tyl9ZWxzZShlPT09InBhdXNlInx8ZT09PSJzdG9wInx8ZT09PSJlcnJvciIpJiZtKHMuX190aW1pbmcpfSxJTz1be25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImF1dG9wbGF5IixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToibG9vcCIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Im9iZXlNdXRlU3dpdGNoIixkZWZhdWx0OiEwLHJlYWRvbmx5OiEwLGNhY2hlOiEwfSx7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InZvbHVtZSJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGNhY2hlOiEwfV07Y2xhc3MgS2Z7Y29uc3RydWN0b3IodCl7dGhpcy5pZD10LHRoaXMuX2NhbGxiYWNrcz17fSx0aGlzLl9vcHRpb25zPXt9LGdoLmZvckVhY2gobj0+e3RoaXMuX2NhbGxiYWNrc1tuXT1bXX0pLElPLmZvckVhY2gobj0+e2xldCByPW4ubmFtZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxyLHtnZXQ6KCk9PntsZXQgcz1uLmNhY2hlP3RoaXMuX29wdGlvbnM6QU8oe2F1ZGlvSWQ6dGhpcy5pZH0pLHU9ciBpbiBzP3Nbcl06bi5kZWZhdWx0O3JldHVybiB0eXBlb2YgdT09Im51bWJlciImJnIhPT0idm9sdW1lIj91LzFlMzp1fSxzZXQ6bi5yZWFkb25seT92b2lkIDA6cz0+e3RoaXMuX29wdGlvbnNbcl09cyxPTyhKLmV4dGVuZCh7fSx0aGlzLl9vcHRpb25zLHthdWRpb0lkOnRoaXMuaWR9KSl9fSl9KSxQTygpfXBsYXkoKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9cGF1c2UoKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfXN0b3AoKXt0aGlzLl9vcGVyYXRlKCJzdG9wIil9c2Vlayh0KXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6dCoxZTN9KX1kZXN0cm95KCl7bSh0aGlzLl9fdGltaW5nKSxPbFt0aGlzLmlkXSYmKE9sW3RoaXMuaWRdLmNsb3NlKCksZGVsZXRlIE9sW3RoaXMuaWRdKSxkZWxldGUgSmZbdGhpcy5pZF19X29wZXJhdGUodCxuKXtUTyhKLmV4dGVuZCh7fSxuLHthdWRpb0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZTp0fSkpfX1sZXQgUE89cmUub25jZSgoKT0+e2doLmZvckVhY2goZT0+e0tmLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0KXtKLmlzRnVuY3Rpb24odCkmJnRoaXMuX2NhbGxiYWNrc1tlXS5wdXNoKHQpfX0pLE9fLmZvckVhY2goZT0+e0tmLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0KXtsZXQgbj10aGlzLl9jYWxsYmFja3NbZV0scj1uLmluZGV4T2YodCk7cj49MCYmbi5zcGxpY2UociwxKX19KX0pO2Z1bmN0aW9uIFpmKGUsdCxuLHIpe2xldCBzPWBvbiR7Si5jYXBpdGFsaXplKHQpfWA7ZS5fY2FsbGJhY2tzW3NdLmZvckVhY2godT0+e0ouaXNGdW5jdGlvbih1KSYmdSh0PT09ImVycm9yIj97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1sZXQgTk89RHQoZV8sKCk9PntsZXR7YXVkaW9JZDplfT1DTygpLHQ9bmV3IEtmKGUpO3JldHVybiBKZltlXT10LHR9KSxrTz1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSx4cD17Y2FucGxheTpbXSxwbGF5OltdLHBhdXNlOltdLHN0b3A6W10sZW5kZWQ6W10sdGltZVVwZGF0ZTpbXSxwcmV2OltdLG5leHQ6W10sZXJyb3I6W10sd2FpdGluZzpbXX0scm4sWGY9bnVsbCxSTz0yNTAseE89WyJwbGF5IiwicGF1c2UiLCJlbmRlZCIsInN0b3AiLCJjYW5wbGF5Il07ZnVuY3Rpb24gQk8oKXtWdSgpLHFsKHtzdGF0ZToidGltZVVwZGF0ZSJ9KSxYZj1kKCgpPT57cWwoe3N0YXRlOiJ0aW1lVXBkYXRlIn0pfSxSTyl9ZnVuY3Rpb24gVnUoKXtYZiE9PW51bGwmJm0oWGYpfWZ1bmN0aW9uIE1PKCl7aWYocm4pcmV0dXJuO2xldCBlPV90Lmludm9rZU9uQ2FsbGJhY2s7cm49bC5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSkscm4uc3JjPXJuLnRpdGxlPXJuLmVwbmFtZT1ybi5zaW5nZXI9cm4uY292ZXJJbWdVcmw9cm4ud2ViVXJsPSIiLHJuLnN0YXJ0VGltZT0wLHhPLmZvckVhY2godD0+e3JuLmFkZEV2ZW50TGlzdGVuZXIodCwoKT0+e3Q9PT0icGxheSI/KHJuLmlzU3RvcHBlZD0hMSxCTygpKTp0PT09InN0b3AiJiYocm4uaXNTdG9wcGVkPSEwKSwodD09PSJwYXVzZSJ8fHQ9PT0iZW5kZWQifHx0PT09InN0b3AiKSYmVnUoKTtsZXQgbj1gb25NdXNpYyR7dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9YDtlKG4se2RhdGFVcmw6cm4uc3JjLGVyck1zZzpgJHtufTpva2B9KSxxbCh7c3RhdGU6dCxkYXRhVXJsOnJuLnNyY30pfSl9KSxybi5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIiwoKT0+e1Z1KCkscWwoe3N0YXRlOiJ3YWl0aW5nIixkYXRhVXJsOnJuLnNyY30pfSkscm4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHQ9PntWdSgpLGUoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6cm4uc3JjLGVyck1zZzoiRXJyb3I6Iit0Lm1lc3NhZ2V9KSxxbCh7c3RhdGU6ImVycm9yIixkYXRhVXJsOnJuLnNyYyxlcnJNc2c6dC5tZXNzYWdlLGVyckNvZGU6dC5jb2RlfSl9KSxybi5hZGRFdmVudExpc3RlbmVyKCJwcmV2IiwoKT0+e3FsKHtzdGF0ZToicHJldiJ9KX0pLHJuLmFkZEV2ZW50TGlzdGVuZXIoIm5leHQiLCgpPT57cWwoe3N0YXRlOiJuZXh0In0pfSl9ZnVuY3Rpb24gRE8oKXtsZXQgZT17ZHVyYXRpb246MCxjdXJyZW50VGltZTowLHBhdXNlZDohMSxzcmM6IiIsYnVmZmVyZWQ6MCx0aXRsZToiIixlcG5hbWU6IiIsc2luZ2VyOiIiLGNvdmVySW1nVXJsOiIiLHdlYlVybDoiIixzdGFydFRpbWU6MCxlcnJNc2c6ImdldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn07aWYocm4pe2xldCB0PXtkdXJhdGlvbjpybi5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOnJuLmlzU3RvcHBlZD8wOnJuLmdldFBvc2l0aW9uKCkscGF1c2VkOnJuLmlzUGF1c2VkKCksc3JjOnJuLnNyYyxidWZmZXJlZDpybi5nZXRCdWZmZXJlZCgpLHRpdGxlOnJuLnRpdGxlLGVwbmFtZTpybi5lcG5hbWUsc2luZ2VyOnJuLnNpbmdlcixjb3ZlckltZ1VybDpybi5jb3ZlckltZ1VybCx3ZWJVcmw6cm4ud2ViVXJsLHN0YXJ0VGltZTpybi5zdGFydFRpbWV9O2U9Si5leHRlbmQoZSx0KX1yZXR1cm4gZX1mdW5jdGlvbiBCcChlLHQpe01PKCk7bGV0IG49WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYodD09PSJwbGF5YmFja1JhdGUiKXtsZXQgcz1lW3RdO3JuLnBsYXliYWNrUmF0ZSYmcm4ucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQocykpO3JldHVybn1sZXQgcj17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHM9PntpZihuLmluZGV4T2Yocyk+PTApe2xldCB1PWVbc107cz09PW5bMF0mJnUmJih1PUtlKHUpKSxybltzXT1yW3NdPXV9fSkscm4uc2V0U3R5bGVzKHIpfWZ1bmN0aW9uIExPKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQscG9zaXRpb246bixhcGk6cj0ib3BlcmF0ZU11c2ljUGxheWVyIix0aXRsZTpzLGNvdmVySW1nVXJsOnV9KXt2YXIgZz1bInJlc3VtZSIsInBhdXNlIiwic3RvcCJdO3JldHVybiBnLmluZGV4T2YoZSk+MD9ybiYmcm5bZV0oKTplPT09InBsYXkiPyhCcCh7c3JjOnQsc3RhcnRUaW1lOm4sdGl0bGU6cyxjb3ZlckltZ1VybDp1fSkscm4ucGxheSgpKTplPT09InNlZWsiJiZybiYmcm4uc2Vla1RvKG4pLHtlcnJNc2c6YCR7cn06b2tgfX1mdW5jdGlvbiBGTyh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHN0YXJ0VGltZTpuLGN1cnJlbnRUaW1lOnJ9KXtyZXR1cm4gTE8oe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxwb3NpdGlvbjpufHxyfHwwLGFwaToib3BlcmF0ZUJhY2tncm91bmRBdWRpbyJ9KX1mdW5jdGlvbiBxbCh7c3RhdGU6ZSxlcnJNc2c6dCxlcnJDb2RlOm4sZGF0YVVybDpyfSl7eHBbZV0uZm9yRWFjaChzPT57Si5pc0Z1bmN0aW9uKHMpJiZzKGU9PT0iZXJyb3IiP3tlcnJNc2c6dCxlcnJDb2RlOm59Ont9KX0pfWxldCBWTz1yZS5vbmNlKCgpPT57a08uZm9yRWFjaChlPT57TXAucHJvdG90eXBlW2BvbiR7Si5jYXBpdGFsaXplKGUpfWBdPWZ1bmN0aW9uKHQpe3hwW2VdLnB1c2godCl9fSl9KSxVTz1be25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ0aXRsZSIsY2FjaGU6ITB9LHtuYW1lOiJlcG5hbWUiLGNhY2hlOiEwfSx7bmFtZToic2luZ2VyIixjYWNoZTohMH0se25hbWU6ImNvdmVySW1nVXJsIixjYWNoZTohMH0se25hbWU6IndlYlVybCIsY2FjaGU6ITB9LHtuYW1lOiJwcm90b2NvbCIscmVhZG9ubHk6ITAsZGVmYXVsdDoiaHR0cCJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGRlZmF1bHQ6MSxjYWNoZTohMH1dO2NsYXNzIE1we2NvbnN0cnVjdG9yKCl7dGhpcy5fb3B0aW9ucz17fSxVTy5mb3JFYWNoKHQ9PntsZXQgbj10Lm5hbWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsbix7Z2V0OigpPT57bGV0IHI9dC5jYWNoZT90aGlzLl9vcHRpb25zOkRPKCk7cmV0dXJuIG4gaW4gcj9yW25dOnQuZGVmYXVsdH0sc2V0OnQucmVhZG9ubHk/dm9pZCAwOnI9Pnt0aGlzLl9vcHRpb25zW25dPXIsQnAodGhpcy5fb3B0aW9ucyxuKX19KX0pLFZPKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0fSl9X29wZXJhdGUodCxuKXtGTyhKLmV4dGVuZCh7fSxuLHtvcGVyYXRpb25UeXBlOnR9KSl9fWxldCBEcCwkTz1EdChfYiwoKT0+RHB8fChEcD1uZXcgTXApKTtjbGFzcyBIT3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaWQ9dCx0aGlzLmN0eD1ufXN0YXJ0KHQpe3JldHVybiBKdCh0aGlzLmN0eCwic3RhcnQiLHQpfXN0b3AodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzdG9wIix0KX1wYXVzZSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInBhdXNlIix0KX1yZXN1bWUodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJyZXN1bWUiLHQpfXN3aXRjaENhbWVyYSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInN3aXRjaENhbWVyYSIsdCl9c25hcHNob3QodCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzbmFwc2hvdCIsdCl9dG9nZ2xlVG9yY2godCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsdCl9cGxheUJHTSh0KXtyZXR1cm4gR3QodGhpcy5jdHgsInBsYXlCR00iLHQpfXN0b3BCR00odCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJzdG9wQkdNIix0KX1wYXVzZUJHTSh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInBhdXNlQkdNIix0KX1yZXN1bWVCR00odCl7cmV0dXJuIEp0KHRoaXMuY3R4LCJyZXN1bWVCR00iLHQpfXNldEJHTVZvbHVtZSh0KXtyZXR1cm4gR3QodGhpcy5jdHgsInNldEJHTVZvbHVtZSIsdCl9c3RhcnRQcmV2aWV3KHQpe3JldHVybiBKdCh0aGlzLmN0eCwic3RhcnRQcmV2aWV3Iix0KX1zdG9wUHJldmlldyh0KXtyZXR1cm4gSnQodGhpcy5jdHgsInN0b3BQcmV2aWV3Iix0KX19ZnVuY3Rpb24gQWwoZSx0LG4scil7X3QuaW52b2tlVmlld01ldGhvZCgibGl2ZXB1c2hlci4iK2Use2xpdmVQdXNoZXJJZDplLHR5cGU6bixkYXRhOnJ9LHQpfWNsYXNzIGpPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59c3RhcnQoKXtBbCh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdGFydCIpfXN0b3AoKXtBbCh0aGlzLmlkLHRoaXMucGFnZUlkLCJzdG9wIil9cGF1c2UoKXtBbCh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfXJlc3VtZSgpe0FsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlc3VtZSIpfXN3aXRjaENhbWVyYSgpe0FsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN3aXRjaENhbWVyYSIpfXN0YXJ0UHJldmlldygpe0FsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInByZXZpZXciKX1zdG9wUHJldmlldygpe0FsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1zbmFwc2hvdCgpe0FsKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNuYXBzaG90Iil9fWxldCB6Tz1EdCh0XywoZSx0KT0+e2lmKHQuJHBhZ2UubWV0YS5pc05WdWUpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO2xldCBuPVJuKGUsdCk7cmV0dXJuIG4/bmV3IEhPKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfXJldHVybiBuZXcgak8oZSx0LiRwYWdlLmlkKX0sbl8pLGVvPTMuMTQxNTkyNjUzNTg5NzkzLFV1PTYzNzgyNDUsJHU9LjAwNjY5MzQyMTYyMjk2NTk0MztmdW5jdGlvbiBXTyhlLHQpe2lmKHQ9K3QsZT0rZSxMcChlLHQpKXJldHVybltlLHRdO2xldCBuPUZwKGUtMTA1LHQtMzUpLHI9VnAoZS0xMDUsdC0zNSkscz10LzE4MCplbyx1PU1hdGguc2luKHMpO3U9MS0kdSp1KnU7bGV0IGc9TWF0aC5zcXJ0KHUpO249bioxODAvKFV1KigxLSR1KS8odSpnKSplbykscj1yKjE4MC8oVXUvZypNYXRoLmNvcyhzKSplbyk7bGV0IEU9dCtuLFU9ZStyO3JldHVybltlKjItVSx0KjItRV19ZnVuY3Rpb24gR08oZSx0KXtpZih0PSt0LGU9K2UsTHAoZSx0KSlyZXR1cm5bZSx0XTtsZXQgbj1GcChlLTEwNSx0LTM1KSxyPVZwKGUtMTA1LHQtMzUpLHM9dC8xODAqZW8sdT1NYXRoLnNpbihzKTt1PTEtJHUqdSp1O2xldCBnPU1hdGguc3FydCh1KTtuPW4qMTgwLyhVdSooMS0kdSkvKHUqZykqZW8pLHI9cioxODAvKFV1L2cqTWF0aC5jb3MocykqZW8pO2xldCBFPXQrbjtyZXR1cm5bZStyLEVdfWxldCBMcD1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8ZT4xMzcuODM0N3x8dDwuODI5M3x8dD41NS44MjcxfHwhMX0sRnA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0tMTAwKzIqZSszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKmVvKSsyMCpNYXRoLnNpbigyKmUqZW8pKSoyLzMsbis9KDIwKk1hdGguc2luKHQqZW8pKzQwKk1hdGguc2luKHQvMyplbykpKjIvMyxuKz0oMTYwKk1hdGguc2luKHQvMTIqZW8pKzMyMCpNYXRoLnNpbih0KmVvLzMwKSkqMi8zLG59LFZwPWZ1bmN0aW9uKGUsdCl7bGV0IG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9KDIwKk1hdGguc2luKDYqZSplbykrMjAqTWF0aC5zaW4oMiplKmVvKSkqMi8zLG4rPSgyMCpNYXRoLnNpbihlKmVvKSs0MCpNYXRoLnNpbihlLzMqZW8pKSoyLzMsbis9KDE1MCpNYXRoLnNpbihlLzEyKmVvKSszMDAqTWF0aC5zaW4oZS8zMCplbykpKjIvMyxufTtmdW5jdGlvbiBVcChlLHQsbil7bGV0IHI9dC5jb29yZHM7aWYoZSE9PXQuY29vcmRzVHlwZSl7bGV0IHM7ZT09PSJ3Z3M4NCI/cz1XTyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKTplPT09ImdjajAyIiYmKHM9R08oci5sb25naXR1ZGUsci5sYXRpdHVkZSkpLHMmJihyLmxvbmdpdHVkZT1zWzBdLHIubGF0aXR1ZGU9c1sxXSl9bih7dHlwZTplLGFsdGl0dWRlOnIuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6ci5sYXRpdHVkZSxsb25naXR1ZGU6ci5sb25naXR1ZGUsc3BlZWQ6ci5zcGVlZCxhY2N1cmFjeTpyLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9bGV0IFlPPWtlKGUwLCh7dHlwZTplPSJ3Z3M4NCIsZ2VvY29kZTp0PSExLGFsdGl0dWRlOm49ITEsaGlnaEFjY3VyYWN5RXhwaXJlVGltZTpyLGlzSGlnaEFjY3VyYWN5OnM9ITF9LHtyZXNvbHZlOnUscmVqZWN0Omd9KT0+e2wuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKEU9PntVcChlLEUsdSl9LEU9PntpZihFLmNvZGU9PT0xNTAxKXtVcChlLEUsdSk7cmV0dXJufWcoImdldExvY2F0aW9uOmZhaWwgIitFLm1lc3NhZ2UpfSx7Z2VvY29kZTp0LGVuYWJsZUhpZ2hBY2N1cmFjeTpzfHxuLHRpbWVvdXQ6cixjb29yZHNUeXBlOmV9KX0sbjAsdDApLHFPPWtlKFh5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCBzPXVwKCkhPT0ibGlnaHQiLHUsZz0kcyh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOkouZXh0ZW5kKHt9LGUse2xvY2FsZTpvdSgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2Uoe2V2ZW50OkUsZGV0YWlsOlV9KXtFPT09InNlbGVjdGVkIiYmKHU9VSl9LG9uQ2xvc2UoKXtzJiZsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU/dCh1KTpuKCJjYW5jZWwiKX19KTtzJiYobC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IiksZy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLCh7dHlwZTpFLHJlc3VsdDpVfSk9PntFPT09InN0YXJ0Ij9sLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOkU9PT0iZW5kIiYmIVUmJmwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfSxReSksSk89a2UocjAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT4oJHMoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6Si5leHRlbmQoe30sZSx7bG9jYWxlOm91KCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2UoKXtuKCJjYW5jZWwiKX19KSx0KCkpLG8wLGkwKSxIdT0hMSx2dT0wLEtPPWtlKGlFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3Z1PXZ1fHxsLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24ocj0+e0h1PSEwLF90Lmludm9rZU9uQ2FsbGJhY2soamgsci5jb29yZHMpfSxyPT57SHV8fChuKHIubWVzc2FnZSksSHU9ITApLF90Lmludm9rZU9uQ2FsbGJhY2soemgse2Vyck1zZzpgb25Mb2NhdGlvbkNoYW5nZTpmYWlsICR7ci5tZXNzYWdlfWB9KX0se2Nvb3Jkc1R5cGU6ZT09bnVsbD92b2lkIDA6ZS50eXBlfSksayh0LDEwMCl9LGxFLGNFKSxaTz1rZShvRSwoZSx7cmVzb2x2ZTp0fSk9Pnt2dSYmKGwuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh2dSksSHU9ITEsdnU9MCksdCgpfSksWE89S24oamgsKCk9Pnt9KSxRTz1LcihhRSwoKT0+e30pLGVBPUtuKHpoLCgpPT57fSksdEE9S3Ioc0UsKCk9Pnt9KSxuQT1rZShZRSwoe3RpdGxlOmU9IiIsY29udGVudDp0PSIiLHNob3dDYW5jZWw6bj0hMCxjYW5jZWxUZXh0OnIsY2FuY2VsQ29sb3I6cyxjb25maXJtVGV4dDp1LGNvbmZpcm1Db2xvcjpnLGVkaXRhYmxlOkU9ITEscGxhY2Vob2xkZXJUZXh0OlU9IiJ9PXt9LHtyZXNvbHZlOlB9KT0+e2xldCBMPW4/W3IsdV06W3VdLE9lPUU/VTpMO3Q9dHx8IiAiLGwubmF0aXZlVUlbRT8icHJvbXB0IjoiY29uZmlybSJdKHQsUGU9PntpZihuKXtsZXQgUmU9UGUuaW5kZXg9PT0xLGh0PXtjb25maXJtOlJlLGNhbmNlbDpQZS5pbmRleD09PTB8fFBlLmluZGV4PT09LTF9O1JlJiZFJiYoaHQuY29udGVudD1QZS52YWx1ZSksUChodCl9ZWxzZXtsZXQgUmU9e2NvbmZpcm06UGUuaW5kZXg9PT0wLGNhbmNlbDohMX07RSYmKFJlLmNvbnRlbnQ9UGUudmFsdWUpLFAoUmUpfX0sZSxPZSxMKX0scUUsSkUpLHJBPXtsaWdodDp7aXRlbUNvbG9yOiIjMDAwMDAwIn0sZGFyazp7aXRlbUNvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCkifX0saUE9a2UoJEUsKHtpdGVtTGlzdDplPVtdLGl0ZW1Db2xvcjp0LHRpdGxlOm49IiIscG9wb3ZlcjpyfSx7cmVzb2x2ZTpzLHJlamVjdDp1fSk9Pnt0PT09IiMwMDAiJiZSLmRhcmttb2RlJiYodD1yQVtsLm5hdmlnYXRvci5nZXRVSVN0eWxlKCldLml0ZW1Db2xvciksSygpO2xldHt0Omd9PWxlKCksRT17dGl0bGU6bixjYW5jZWw6ZygidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiKSxidXR0b25zOmUubWFwKFU9Pih7dGl0bGU6VSxjb2xvcjp0fSkpfTtsLm5hdGl2ZVVJLmFjdGlvblNoZWV0KEouZXh0ZW5kKEUse3BvcG92ZXI6cn0pLFU9PntVLmluZGV4PjA/cyh7dGFwSW5kZXg6VS5pbmRleC0xfSk6dSgic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIil9KX0sSEUsakUpLG11LFFmPSExLGp1PSIiLHp1LG9BPWtlKHpFLChlLHQpPT4kcChKLmV4dGVuZCh7fSxlLHt0eXBlOiJsb2FkaW5nIixpY29uOiJsb2FkaW5nIn0pLHQpLFdFLEdFKSwkcD0oe3RpdGxlOmU9IiIsaWNvbjp0PSJzdWNjZXNzIixpbWFnZTpuPSIiLGR1cmF0aW9uOnI9MTUwMCxtYXNrOnM9ITEscG9zaXRpb246dSx0eXBlOmc9InRvYXN0IixzdHlsZTpFfSx7cmVzb2x2ZTpVLHJlamVjdDpQfSk9PntpZihXdSgiIiksanU9ZyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKFN0cmluZyh1KSkpbC5uYXRpdmVVSS50b2FzdChlLHt2ZXJ0aWNhbEFsaWduOnV9KSxRZj0hMDtlbHNle3QmJiF+WyJzdWNjZXNzIiwibG9hZGluZyIsImVycm9yIiwibm9uZSJdLmluZGV4T2YodCkmJih0PSJzdWNjZXNzIik7bGV0IEw9e21vZGFsOnMsYmFjazoidHJhbnNtaXQiLHBhZGRpbmc6IjEwcHgiLHNpemU6IjE2cHgifTshbiYmKCF0fHx0PT09Im5vbmUiKT9MLmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifTooTC53aWR0aD0iMTQwcHgiLEwuaGVpZ2h0PSIxMTJweCIpLG4/TC5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOm4saW50ZXJ2YWw6cn06WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKHQpIT09LTEmJihMLmxvYWRpbmc9e2Rpc3BsYXk6ImJsb2NrIixoZWlnaHQ6IjU1cHgiLGljb246dD09PSJzdWNjZXNzIj8iX191bmlhcHBzdWNjZXNzLnBuZyI6Il9fdW5pYXBwZXJyb3IucG5nIixpbnRlcnZhbDpyfSk7dHJ5e211PWwubmF0aXZlVUkuc2hvd1dhaXRpbmcoZSxKLmV4dGVuZChMLEUpKX1jYXRjaChPZSl7UChgJHtPZX1gKX19cmV0dXJuIGp1PT09InRvYXN0IiYmKHp1PWsoKCk9PntXdSgiIil9LHIpKSxVKCl9LGFBPWtlKEtFLCRwLFhFLFFFKSxzQT1rZShQRSwoZSx0KT0+V3UoInRvYXN0Iix0KSksbEE9a2UoSUUsKGUsdCk9Pld1KCJsb2FkaW5nIix0KSk7ZnVuY3Rpb24gV3UoZT0idG9hc3QiLHQpe3JldHVybiBlJiZlIT09anV8fCh6dSYmKEMoenUpLHp1PW51bGwpLFFmP2wubmF0aXZlVUkuY2xvc2VUb2FzdCgpOm11JiZtdS5jbG9zZSYmbXUuY2xvc2UoKSxtdT1udWxsLFFmPSExLGp1PSIiKSx0JiZ0LnJlc29sdmUoKX1sZXQgY0E9a2UoZXcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9Y3AoKTtpZihyJiZyLmVuZFB1bGxUb1JlZnJlc2goKSxyPUR1KCksIXIpcmV0dXJuIG4oKTtyLmJlZ2luUHVsbFRvUmVmcmVzaCgpLGpmKHIpLHQoKX0pLHVBPWtlKHR3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWNwKCl8fER1KCk7aWYoIXIpcmV0dXJuIG4oKTtyLmVuZFB1bGxUb1JlZnJlc2goKSxqZihudWxsKSx0KCl9KSxmQT1rZShKaCwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1RbihMcigpKTtfdC5pbnZva2VWaWV3TWV0aG9kKEpoLGUscixzPT57cz9uKHMpOnQoKX0pfSxORSksZEE9a2UoS2gsKGUse3Jlc29sdmU6dH0pPT57bGV0IG49UW4oTHIoKSk7X3QuaW52b2tlVmlld01ldGhvZChLaCxlLG4sdCl9LFZFLFVFKSxoQT1rZShNRSwoe19fcGFnZV9fOmUsdGl0bGU6dH0se3Jlc29sdmU6bixyZWplY3Q6cn0pPT57bGV0IHM9c3AoZSk7aWYocyl7bGV0IHU9cy5nZXRTdHlsZSgpO3UmJnUudGl0bGVOVmlldyYmcy5zZXRTdHlsZSh7dGl0bGVOVmlldzp7dGl0bGVUZXh0OnR9fSksbigpfWVsc2UgcigpfSxERSkscEE9a2UoTEUsKGUse3Jlc29sdmU6dH0pPT57bC5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx0KCl9KSxnQT1rZShGRSwoZSx7cmVzb2x2ZTp0fSk9PntsLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHQoKX0pO2Z1bmN0aW9uIHZBKGUpe2xldCB0PWpuKCk7IXQubGVuZ3RofHwodFt0Lmxlbmd0aC0xXS4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lKX1sZXQgbUE9a2UoUkUsKHtfX3BhZ2VfXzplLGZyb250Q29sb3I6dCxiYWNrZ3JvdW5kQ29sb3I6bn0se3Jlc29sdmU6cixyZWplY3Q6c30pPT57bGV0IHU9c3AoZSk7aWYodSl7bGV0IGc9e307dCYmKGcudGl0bGVDb2xvcj10KSxuJiYoZy5iYWNrZ3JvdW5kQ29sb3I9bik7bGV0IEU9dD09PSIjMDAwMDAwIj8iZGFyayI6ImxpZ2h0IjtsLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShFKSx2QShFKTtsZXQgVT11LmdldFN0eWxlKCk7VSYmVS50aXRsZU5WaWV3JiYoVS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYoZy5iYWNrQnV0dG9uPWcuYmFja0J1dHRvbnx8e30sZy5iYWNrQnV0dG9uLmNvbG9yPXQpLHUuc2V0U3R5bGUoe3RpdGxlTlZpZXc6Z30pKSxyKCl9ZWxzZSBzKCl9LEJFLHhFKSxfQT1rZShFdywoe2luZGV4OmUsdGV4dDp0fSx7cmVzb2x2ZTpuLHJlamVjdDpyfSk9PntNaS5zZXRUYWJCYXJCYWRnZSgidGV4dCIsZSx0KSxuKCl9LHd3LFN3KSxiQT1rZShudywoe2luZGV4OmUsdGV4dDp0LGljb25QYXRoOm4sc2VsZWN0ZWRJY29uUGF0aDpyLHBhZ2VQYXRoOnMsdmlzaWJsZTp1LGljb25mb250Omd9LHtyZXNvbHZlOkV9KT0+e2lmKE1pLnNldFRhYkJhckl0ZW0oZSx0LG4scix1LGcpLHMpe2xldCBVPVIudGFiQmFyLmxpc3RbZV07aWYoVSl7bGV0IFA9VS5wYWdlUGF0aCxMPXJlLnJlbW92ZUxlYWRpbmdTbGFzaChzKTtMIT09UCYmb2woZSxQLEwpfX1FKCl9LHJ3LGl3KSx5QT1rZShvdywoZT17fSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntpZighdXUoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7ZS5ib3JkZXJTdHlsZT1yZS5ub3JtYWxpemVUYWJCYXJTdHlsZXMoZS5ib3JkZXJTdHlsZSksTWkuc2V0VGFiQmFyU3R5bGUoZSksdCgpfSxhdyxsdyksRUE9a2UoY3csKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIXV1KCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO01pLmhpZGVUYWJCYXIoQm9vbGVhbihyKSksdCgpfSxaaCksd0E9a2UodXcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZSYmZS5hbmltYXRpb247aWYoIXV1KCkpcmV0dXJuIG4oIm5vdCBUYWJCYXIgcGFnZSIpO01pLnNob3dUYWJCYXIoQm9vbGVhbihyKSksdCgpfSxmdyksU0E9a2UoZ3csKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntNaS5zZXRUYWJCYXJCYWRnZSgicmVkRG90IixlKSx0KCl9LHZ3LG13KSxIcD1lPT5NaS5zZXRUYWJCYXJCYWRnZSgibm9uZSIsZSksQ0E9a2UoX3csKHtpbmRleDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntIcChlKSx0KCl9LGJ3LHl3KSxPQT1rZShkdywoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e0hwKGUpLHQoKX0saHcscHcpLGpwPSJ2ZFN5bmMiLEFBPSJfX3VuaWFwcF9fc2VydmljZSIsQmM9Im9uV2Vidmlld1JlYWR5IixUQT0wLElBPSJ3ZWJ2aWV3SW5zZXJ0ZWQiLFBBPSJ3ZWJ2aWV3UmVtb3ZlZCIsenA9IlVuaUFwcFN1Yk5WdWUiO2NsYXNzIE5Be2NvbnN0cnVjdG9yKHQsbil7dGhpcy5jYWxsYmFja3M9W107bGV0IHI9dGhpcy53ZWJ2aWV3PWwud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KTtpZih0aGlzLmlzU3ViPW58fCExLHIuX191bmlhcHBfbWFza19pZCl7bGV0IHM9dGhpcy5tYXNrV2Vidmlldz1yLl9fdW5pYXBwX21hc2tfaWQ9PT0iMCI/e3NldFN0eWxlKHttYXNrOmd9KXtPYSgidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjpnfSl9fTpsLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoci5fX3VuaWFwcF9tYXNrX2lkKSx1PWZ1bmN0aW9uKCl7cy5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KX07ci5hZGRFdmVudExpc3RlbmVyKCJoaWRlIix1KSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIix1KX19c2hvdyguLi50KXtpZih0aGlzLm1hc2tXZWJ2aWV3KXtsZXQgbj10aGlzLndlYnZpZXcuX191bmlhcHBfbWFzazt0aGlzLm1hc2tXZWJ2aWV3LnNldFN0eWxlKHttYXNrOm59KX10aGlzLndlYnZpZXcuc2hvdyguLi50KX1oaWRlKC4uLnQpe3RoaXMud2Vidmlldy5oaWRlKC4uLnQpfXNldFN0eWxlKHQpe3RoaXMud2Vidmlldy5zZXRTdHlsZSh0KX1pbml0TWVzc2FnZSgpe2lmKHRoaXMubWVzc2FnZVJlYWR5KXJldHVybjt0aGlzLm1lc3NhZ2VSZWFkeT0hMDtsZXQgdD1yPT57aWYoci5kYXRhJiZyLmRhdGEudHlwZT09PXpwKXtsZXQgcz1yLmRhdGEudGFyZ2V0O3MuaWQ9PT10aGlzLndlYnZpZXcuaWQmJnMuaXNTdWI9PT10aGlzLmlzU3ViJiZ0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKHU9Pnt1KHtvcmlnaW46dGhpcy53ZWJ2aWV3Ll9fdW5pYXBwX2hvc3QsZGF0YTpyLmRhdGEuZGF0YX0pfSl9fTtPYSgiZ2xvYmFsRXZlbnQiKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsdCksdGhpcy53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoKT0+e3RoaXMuY2FsbGJhY2tzLmxlbmd0aD0wfSl9cG9zdE1lc3NhZ2UodCl7bC53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZTp6cCxkYXRhOnQsdGFyZ2V0OntpZDp0aGlzLndlYnZpZXcuaWQsaXNTdWI6IXRoaXMuaXNTdWJ9fSxBQSl9b25NZXNzYWdlKHQpe3RoaXMuaW5pdE1lc3NhZ2UoKSx0aGlzLmNhbGxiYWNrcy5wdXNoKHQpfX1sZXQga0E9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IE5BKGUsdCl9O2Z1bmN0aW9uIFJBKGUsdCxuLHIscyx1LGcpe2whPT1uJiYoVD1Ebj1lLHY9dCxsPW4sUFMobC5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUpLGwubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPXJwLGs9cixDPXMsZD11LG09ZyksUi5zZXJ2aWNlUmVhZHk9ITB9ZnVuY3Rpb24geEEoKXtsZXQgZT1bIkFycmF5QnVmZmVyIiwiSW50OEFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiSW50MTZBcnJheSIsIlVpbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiQmlnSW50NjRBcnJheSIsIkJpZ1VpbnQ2NEFycmF5Il0sdD17fTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXTt0W3JdPWdsb2JhbFtyXX1yZXR1cm4gdH1mdW5jdGlvbiBCQShlKXtKLmV4dGVuZChnbG9iYWwsZSl9bGV0IFdwPXtvYXV0aChlKXtsLm9hdXRoLmdldFNlcnZpY2VzKHQ9Pnt0PXQ7bGV0IG49W107dC5mb3JFYWNoKCh7aWQ6cn0pPT57bi5wdXNoKHIpfSksZShudWxsLG4sdCl9LHQ9Pnt0PXQsZSh0KX0pfSxzaGFyZShlKXtsLnNoYXJlLmdldFNlcnZpY2VzKHQ9Pnt0PXQ7bGV0IG49W107dC5mb3JFYWNoKCh7aWQ6cn0pPT57bi5wdXNoKHIpfSksZShudWxsLG4sdCl9LHQ9PntlKHQpfSl9LHBheW1lbnQoZSl7bC5wYXltZW50LmdldENoYW5uZWxzKHQ9PntsZXQgbj1bXTt0LmZvckVhY2goKHtpZDpyfSk9PntuLnB1c2gocil9KSxlKG51bGwsbix0KX0sdD0+e2UodCl9KX0scHVzaChlKXtpZih0eXBlb2YgdiE9InVuZGVmaW5lZCJ8fHR5cGVvZiBsIT0idW5kZWZpbmVkIil7bGV0IHQ9bC5wdXNoLmdldENsaWVudEluZm8oKTtlKG51bGwsW3QuaWRdLFt0XSl9ZWxzZSBlKG51bGwsW10pfX0sTUE9a2UoQ3csKHtzZXJ2aWNlOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1dwW2VdP1dwW2VdKChyLHM9W10sdT1bXSk9PntyP24oci5tZXNzYWdlKTp0KHtzZXJ2aWNlOmUscHJvdmlkZXI6cyxwcm92aWRlcnM6dS5tYXAoZz0+KHR5cGVvZiBnLnNlcnZpY2VSZWFkeT09ImJvb2xlYW4iJiYoZy5pc0FwcEV4aXN0PWcuc2VydmljZVJlYWR5KSx0eXBlb2YgZy5uYXRpdmVDbGllbnQ9PSJib29sZWFuIiYmKGcuaXNBcHBFeGlzdD1nLm5hdGl2ZUNsaWVudCksZykpfSl9KTpuKCJzZXJ2aWNlIG5vdCBmb3VuZCIpfSxPdyksR3U7ZnVuY3Rpb24gX3UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57bC5vYXV0aC5nZXRTZXJ2aWNlcyhyPT57bGV0IHM9ci5maW5kKCh7aWQ6dX0pPT51PT09ZSk7cz90KHMpOm4obmV3IEVycm9yKCJwcm92aWRlciBub3QgZmluZCIpKX0sbil9KX1sZXQgR3A9a2UoQXcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZS5wcm92aWRlcnx8IndlaXhpbiIscz1icihuKSx1PXI9PT0iYXBwbGUiLGc9dT97c2NvcGU6ImVtYWlsIn06ZS51bml2ZXJpZnlTdHlsZT97dW5pdmVyaWZ5U3R5bGU6RkEoZS51bml2ZXJpZnlTdHlsZSxzKX06e307X3UocikudGhlbihFPT57ZnVuY3Rpb24gVSgpe2lmKGUub25seUF1dGhvcml6ZSYmcj09PSJ3ZWl4aW4iKXtFLmF1dGhvcml6ZSgoe2NvZGU6UH0pPT57dCh7Y29kZTpQLGF1dGhSZXN1bHQ6IiJ9KX0scyk7cmV0dXJufUUubG9naW4oUD0+e2xldCBMPVAudGFyZ2V0LmF1dGhSZXN1bHQsT2U9UC50YXJnZXQuYXBwbGVJbmZvO3Qoe2NvZGU6TC5jb2RlLGF1dGhSZXN1bHQ6TCxhcHBsZUluZm86T2V9KX0scyxnKX11fHxyPT09InVuaXZlcmlmeSI/VSgpOkUubG9nb3V0KFUsVSl9KS5jYXRjaChzKX0sVHcpLFlwPShlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUucHJvdmlkZXJ8fCJ3ZWl4aW4iLHM9YnIobik7X3UocikudGhlbih1PT57dS5nZXRVc2VySW5mbyhnPT57bGV0IEU9e25pY2tOYW1lOiIifTtpZihyPT09IndlaXhpbiIpe2xldCBQPXUudXNlckluZm87UCYmKEU9e29wZW5JZDpQLm9wZW5pZCxuaWNrTmFtZTpQLm5pY2tuYW1lLGdlbmRlcjpQLnNleCxjaXR5OlAuY2l0eSxwcm92aW5jZTpQLnByb3ZpbmNlLGNvdW50cnk6UC5jb3VudHJ5LGF2YXRhclVybDpQLmhlYWRpbWd1cmwsdW5pb25JZDpQLnVuaW9uaWR9KX1lbHNlIGlmKHI9PT0iYXBwbGUiKXtsZXQgUD11LmFwcGxlSW5mbztQJiYoRT17b3BlbklkOlAudXNlcixmdWxsTmFtZTpQLmZ1bGxOYW1lLGVtYWlsOlAuZW1haWwsYXV0aG9yaXphdGlvbkNvZGU6UC5hdXRob3JpemF0aW9uQ29kZSxpZGVudGl0eVRva2VuOlAuaWRlbnRpdHlUb2tlbixyZWFsVXNlclN0YXR1czpQLnJlYWxVc2VyU3RhdHVzfSl9ZWxzZSBFPXUudXNlckluZm8sRSYmKEUub3BlbklkPUUub3BlbklkfHxFLm9wZW5pZHx8dS5hdXRoUmVzdWx0Lm9wZW5pZCxFLm5pY2tOYW1lPUUubmlja05hbWV8fEUubmlja25hbWUsRS5hdmF0YXJVcmw9RS5hdmF0YXJVcmx8fEUuaGVhZGltZ3VybCk7bGV0IFU9e307ZS5kYXRhJiZlLmRhdGEuYXBpX25hbWU9PT0id2ViYXBpX2dldHVzZXJpbmZvIj9VLmRhdGE9e2RhdGE6SlNPTi5zdHJpbmdpZnkoRSkscmF3RGF0YToiIixzaWduYXR1cmU6IiIsZW5jcnlwdGVkRGF0YToiIixpdjoiIn06VS51c2VySW5mbz1FLHQoVSl9LHMpfSkuY2F0Y2goKCk9PntuKCJcdThCRjdcdTUxNDhcdThDMDNcdTc1MjggdW5pLmxvZ2luIil9KX0sREE9a2UoSXcsWXAsUHcpLExBPWtlKE53LFlwLGt3KSxxcD1rZShSdywoe3Byb3ZpZGVyOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPUdsKHQpLHM9YnIobik7X3UoZSkudGhlbih1PT51LnByZUxvZ2luKHIscykpLmNhdGNoKHMpfSxNdyxCdyksSnA9KCk9Pl91KCJ1bml2ZXJpZnkiKS50aGVuKGU9PmUuY2xvc2VBdXRoVmlldygpKSxLcD1EdChEdyxKcCksWnA9a2UoTHcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9R2wodCkscz1icihuKTt0cnl7X3UoInVuaXZlcmlmeSIpLnRoZW4odT0+e2xldCBnPXUuZ2V0Q2hlY2tCb3hTdGF0ZSgpO3Ioe3N0YXRlOmd9KX0pfWNhdGNoKHUpe3ModSl9fSk7ZnVuY3Rpb24gRkEoZSx0KXtyZXR1cm4gSi5pc1BsYWluT2JqZWN0KGUpJiZKLmlzUGxhaW5PYmplY3QoZS5idXR0b25zKSYmSi50b1R5cGVTdHJpbmcoZS5idXR0b25zLmxpc3QpPT09IltvYmplY3QgQXJyYXldIiYmZS5idXR0b25zLmxpc3QuZm9yRWFjaCgobixyKT0+e2UuYnV0dG9ucy5saXN0W3JdLm9uY2xpY2s9ZnVuY3Rpb24oKXtsZXQgcz17Y29kZToiMzAwMDgiLG1lc3NhZ2U6Ilx1NzUyOFx1NjIzN1x1NzBCOVx1NTFGQlx1NEU4Nlx1ODFFQVx1NUI5QVx1NEU0OVx1NjMwOVx1OTRBRSIsaW5kZXg6cixwcm92aWRlcjpuLnByb3ZpZGVyfTtKLmlzUGxhaW5PYmplY3QoR3UpP0d1Ll90cmlnZ2VyVW5pdmVyaWZ5QnV0dG9uc0NsaWNrKHMpOkpwKCkudGhlbigoKT0+e3Qocyl9KX19KSxlfWNsYXNzIFZBe2NvbnN0cnVjdG9yKCl7dGhpcy5wcm92aWRlcj0idW5pdmVyaWZ5Iix0aGlzLmV2ZW50TmFtZT0iYXBpLnVuaXZlcmlmeUJ1dHRvbnNDbGljayJ9Y2xvc2UoKXtyZXR1cm4gS3AoKX1sb2dpbih0KXtyZXR1cm4gR3AodGhpcy5fZ2V0T3B0aW9ucyh0KSl9Z2V0Q2hlY2tCb3hTdGF0ZSh0KXtyZXR1cm4gWnAodCl9cHJlTG9naW4odCl7cmV0dXJuIHFwKHRoaXMuX2dldE9wdGlvbnModCkpfW9uQnV0dG9uc0NsaWNrKHQpe190Lm9uKHRoaXMuZXZlbnROYW1lLHQpfW9mZkJ1dHRvbnNDbGljayh0KXtfdC5vZmYodGhpcy5ldmVudE5hbWUsdCl9X3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2sodCl7X3QuZW1pdCh0aGlzLmV2ZW50TmFtZSx0KX1fZ2V0T3B0aW9ucyh0PXt9KXtyZXR1cm4gSi5leHRlbmQoe30sdCx7cHJvdmlkZXI6dGhpcy5wcm92aWRlcn0pfX1sZXQgVUE9RHQoRncsKCk9Pkd1fHwoR3U9bmV3IFZBKSksJEE9a2UoWXcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9SXAoKTtpZihyLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQhPT0iYXV0aG9yaXplZCIpcmV0dXJuIG4oIm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQ6ICIrci5ub3RpZmljYXRpb25BdXRob3JpemVkKTtsZXQgcz1KLmV4dGVuZCh7fSxlKTtkZWxldGUgcy5jb250ZW50LGRlbGV0ZSBzLnBheWxvYWQsbC5wdXNoLmNyZWF0ZU1lc3NhZ2UoZS5jb250ZW50LGUucGF5bG9hZCxzKSx0KCl9LHZvaWQgMCxxdyksSEE9RHQoInJlZ2lzdGVyUnVudGltZSIsZT0+e0ouZXh0ZW5kKGpzUnVudGltZSxlKX0pLGpBPXswOntuYW1lOiJ3ZWIiLHRpdGxlOiJcdTU2RkVcdTY1ODcifSwxOntuYW1lOiJ0ZXh0Iix0aXRsZToiXHU3RUFGXHU2NTg3XHU1QjU3In0sMjp7bmFtZToiaW1hZ2UiLHRpdGxlOiJcdTdFQUZcdTU2RkVcdTcyNDcifSwzOntuYW1lOiJtdXNpYyIsdGl0bGU6Ilx1OTdGM1x1NEU1MCJ9LDQ6e25hbWU6InZpZGVvIix0aXRsZToiXHU4OUM2XHU5ODkxIn0sNTp7bmFtZToibWluaVByb2dyYW0iLHRpdGxlOiJcdTVDMEZcdTdBMEJcdTVFOEYifX0sekE9ZT0+e2UudHlwZT1lLnR5cGV8fDA7bGV0e3Byb3ZpZGVyOnQsdHlwZTpuLHRpdGxlOnIsc3VtbWFyeTpzLGhyZWY6dSxpbWFnZVVybDpnLG1lZGlhVXJsOkUsc2NlbmU6VSxtaW5pUHJvZ3JhbTpQLG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OkwsY29ycGlkOk9lLGN1c3RvbWVyVXJsOlBlfT1lO0ouaXNTdHJpbmcoZykmJmcmJihnPUtlKGcpKTtsZXQgUmU9akFbbl07aWYoUmUpe2xldCBodD17cHJvdmlkZXI6dCx0eXBlOlJlLm5hbWUsdGl0bGU6cixjb250ZW50OnMsaHJlZjp1LHBpY3R1cmVzOltnXSx0aHVtYnM6Zz9bZ106dm9pZCAwLG1lZGlhOkUsbWluaVByb2dyYW06UCxleHRyYTp7c2NlbmU6VX0sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6TCxjb3JwaWQ6T2UsdXJsOlBlfTtyZXR1cm4gdD09PSJ3ZWl4aW4iJiYobj09PTF8fG49PT0yKSYmZGVsZXRlIGh0LnRodW1icyxodH1yZXR1cm4iXHU1MjA2XHU0RUFCXHU1M0MyXHU2NTcwIHR5cGUgXHU0RTBEXHU2QjYzXHU3ODZFIn0sWHA9ZnVuY3Rpb24oZSx0LG4scixzPSJzaGFyZSIpe2xldCB1PWJyKHIpLGc9dC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdD8ib3BlbkN1c3RvbWVyU2VydmljZUNoYXQiOiJzZW5kIjt0cnl7ZVtnXSh0LCgpPT57bigpfSx1KX1jYXRjaChFKXt1KHttZXNzYWdlOmAke3QucHJvdmlkZXJ9ICR7Z30gXHU2NUI5XHU2Q0Q1XHU4QzAzXHU3NTI4XHU1OTMxXHU4RDI1YH0pfX0sV0E9a2UoVncsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ekEoZSkscz1icihuKTtpZihKLmlzU3RyaW5nKHIpKXJldHVybiBuKHIpO2wuc2hhcmUuZ2V0U2VydmljZXModT0+e2xldCBnPXUuZmluZCgoe2lkOkV9KT0+RT09PXIucHJvdmlkZXIpO2c/Zy5hdXRoZW50aWNhdGVkP1hwKGcscix0LG4pOmcuYXV0aG9yaXplKCgpPT5YcChnLHIsdCxuKSxzKTpuKCJzZXJ2aWNlIG5vdCBmb3VuZCIpfSxzKX0sJHcsVXcpLEdBPWtlKEh3LCh7dHlwZTplLGltYWdlVXJsOnQsc3VtbWFyeTpuLGhyZWY6cn0se3Jlc29sdmU6cyxyZWplY3Q6dX0pPT57bGV0IGc9YnIodSk7Si5pc1N0cmluZyh0KSYmdCYmKHQ9S2UodCkpLGwuc2hhcmUuc2VuZFdpdGhTeXN0ZW0oe3R5cGU6ZSxwaWN0dXJlczp0P1t0XTp2b2lkIDAsY29udGVudDpuLGhyZWY6cn0sKCk9PnMoKSxnKX0sencsancpLFlBPWtlKFd3LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWUucHJvdmlkZXIscz1icihuKTtsLnBheW1lbnQuZ2V0Q2hhbm5lbHModT0+e2xldCBnPXUuZmluZCgoe2lkOkV9KT0+RT09PXIpO2c/bC5wYXltZW50LnJlcXVlc3QoZyxlLm9yZGVySW5mbyxFPT57dChFKX0scyk6bigic2VydmljZSBub3QgZm91bmQiKX0scyl9LEd3KSxRcD1icCxxQT1rZSgibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntRcCgibmF2aWdhdGVUb1VuaU1QIixlLHI9PntpZihyLmVyck1zZyYmci5lcnJNc2cuaW5kZXhPZigiOm9rIik9PT0tMSlyZXR1cm4gbihyLmVyck1zZy5zcGxpdCgiICIpWzFdKTt0KCl9KX0pLGVnPVtdO2Z1bmN0aW9uIHRnKGUpe2VnLnB1c2goZSl9bGV0IEpBPXRnO2Z1bmN0aW9uIEtBKGUsdCl7ZWcuZm9yRWFjaChuPT5uKGUsdCkpfWZ1bmN0aW9uIFpBKGUsdCwuLi5uKXtsZXQgcj1lVChlLHQsbik7ciYmY29uc29sZVtlXShyKX1mdW5jdGlvbiBYQSgpe3JldHVybiB0eXBlb2YgX19jaGFubmVsSWRfXz09InN0cmluZyImJl9fY2hhbm5lbElkX199ZnVuY3Rpb24gUUEoZSx0KXtzd2l0Y2goSi50b1Jhd1R5cGUodCkpe2Nhc2UiRnVuY3Rpb24iOnJldHVybiJmdW5jdGlvbigpIHsgW25hdGl2ZSBjb2RlXSB9IjtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBlVChlLHQsbil7cmV0dXJuIFhBKCk/KG4ucHVzaCh0LnJlcGxhY2UoImF0ICIsInVuaS1hcHA6Ly8vIikpLGNvbnNvbGVbZV0uYXBwbHkoY29uc29sZSxuKSk6bi5tYXAoZnVuY3Rpb24ocyl7bGV0IHU9Si50b1R5cGVTdHJpbmcocykudG9Mb3dlckNhc2UoKTtpZihbIltvYmplY3Qgb2JqZWN0XSIsIltvYmplY3QgYXJyYXldIiwiW29iamVjdCBtb2R1bGVdIl0uaW5kZXhPZih1KSE9PS0xKXRyeXtzPSItLS1CRUdJTjpKU09OLS0tIitKU09OLnN0cmluZ2lmeShzLFFBKSsiLS0tRU5EOkpTT04tLS0ifWNhdGNoKGcpe3M9dX1lbHNlIGlmKHM9PT1udWxsKXM9Ii0tLU5VTEwtLS0iO2Vsc2UgaWYocz09PXZvaWQgMClzPSItLS1VTkRFRklORUQtLS0iO2Vsc2V7bGV0IGc9Si50b1Jhd1R5cGUocykudG9VcHBlckNhc2UoKTtnPT09Ik5VTUJFUiJ8fGc9PT0iQk9PTEVBTiI/cz0iLS0tQkVHSU46IitnKyItLS0iK3MrIi0tLUVORDoiK2crIi0tLSI6cz1TdHJpbmcocyl9cmV0dXJuIHN9KS5qb2luKCItLS1DT01NQS0tLSIpKyIgIit0fWxldCB0VD0xLGVkLGJ1PXt9O2Z1bmN0aW9uIG5nKGUpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXtsZXQgdD1PYmplY3Qua2V5cyhidSkuZmluZChyPT5idVtyXT09PWUpLG49dD9wYXJzZUludCh0KTp0VCsrO3JldHVybiBidVtuXT1lLG59ZWxzZSBKLmlzUGxhaW5PYmplY3QoZSkmJk9iamVjdC5rZXlzKGUpLmZvckVhY2godD0+e2VbdF09bmcoZVt0XSl9KTtyZXR1cm4gZX1mdW5jdGlvbiBuVChlLHQsbixyKXtyZXR1cm4gbmQoZSx0LG4scil9ZnVuY3Rpb24gdGQoKXtyZXR1cm4gZWR8fChlZD1PLnJlcXVpcmVOYXRpdmVQbHVnaW4oIlVUUy1Qcm94eSIpKSxlZH1mdW5jdGlvbiByZyhlLHQsbixyLHMpe2lmKCF0KXRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSk7aWYoSi5pc1N0cmluZyh0KSl0cnl7dD1KU09OLnBhcnNlKHQpfWNhdGNoKHUpe3Rocm93IG5ldyBFcnJvcihgSlNPTi5wYXJzZSgke3R9KTogYCt1KX1pZih0LmVyck1zZyl0aHJvdyBuZXcgRXJyb3IodC5lcnJNc2cpO2lmKG4mJm4udHlwZT09PSJpbnRlcmZhY2UiJiZ0eXBlb2YgdC5wYXJhbXM9PSJudW1iZXIiKXtpZighdC5wYXJhbXMpcmV0dXJuIG51bGw7aWYodC5wYXJhbXM9PT1yJiZzKXJldHVybiBzO2lmKHJkW24ub3B0aW9uc10pe2xldCB1PWxnKEouZXh0ZW5kKHtpbnN0YW5jZUlkOnQucGFyYW1zfSxyZFtuLm9wdGlvbnNdKSk7cmV0dXJuIG5ldyB1fX1yZXR1cm4gdC5wYXJhbXN9ZnVuY3Rpb24gaWcoZSl7aWYoZS5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKGUuZXJyTXNnKTtyZXR1cm4gZGVsZXRlIGUuZXJyTXNnLHJnKGUsdGQoKS5pbnZva2VTeW5jKGUsKCk9Pnt9KSl9ZnVuY3Rpb24gbmQoZSx7bW9kdWxlTmFtZTp0LG1vZHVsZVR5cGU6bixwYWNrYWdlOnIsY2xhc3M6cyxuYW1lOnUsbWV0aG9kOmcsY29tcGFuaW9uOkUscGFyYW1zOlUscmV0dXJuOlAsZXJyTXNnOkx9LE9lLFBlKXtsZXQgUmU9KHtpZDpwdCxuYW1lOmt0LHBhcmFtczpSdCxrZWVwQWxpdmU6ZG59KT0+e2xldCBsbj1idVtwdF07bG4/KGxuKC4uLlJ0KSxkbnx8ZGVsZXRlIGJ1W3B0XSk6Y29uc29sZS5lcnJvcihgJHtyfSR7c30uJHt1fSAke2t0fSBpcyBub3QgZm91bmRgKX0saHQ9T2U/e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4saWQ6T2UsbmFtZTp1LG1ldGhvZDpVfTp7bW9kdWxlTmFtZTp0LG1vZHVsZVR5cGU6bixwYWNrYWdlOnIsY2xhc3M6cyxuYW1lOmd8fHUsY29tcGFuaW9uOkUsbWV0aG9kOlV9O3JldHVybiguLi5wdCk9PntpZihMKXRocm93IG5ldyBFcnJvcihMKTtsZXQga3Q9Si5leHRlbmQoe30saHQse3BhcmFtczpwdC5tYXAoUnQ9Pm5nKFJ0KSl9KTtyZXR1cm4gZT9uZXcgUHJvbWlzZSgoUnQsZG4pPT57dGQoKS5pbnZva2VBc3luYyhrdCxsbj0+e2xuLnR5cGUhPT0icmV0dXJuIj9SZShsbik6bG4uZXJyTXNnP2RuKGxuLmVyck1zZyk6UnQobG4ucGFyYW1zKX0pfSk6cmcoa3QsdGQoKS5pbnZva2VTeW5jKGt0LFJlKSxQLE9lLFBlKX19ZnVuY3Rpb24gb2coZSx0KXtyZXR1cm4gdC5tYWluJiYhdC5tZXRob2QmJnR5cGVvZiBsIT0idW5kZWZpbmVkIiYmbC5vcy5uYW1lPT09ImlPUyImJih0Lm1ldGhvZD0ic18iK3QubmFtZSksbmQoZSx0LDApfWxldCByVD1vZztmdW5jdGlvbiBhZyhlLHQpe3JldHVybiBKLmhhc093bih0LGUrIkJ5SnMiKT9lKyJCeUpzIjplfWZ1bmN0aW9uIHNnKGUpe3JldHVybiB0eXBlb2YgZT09InVuZGVmaW5lZCJ9ZnVuY3Rpb24gaVQoZSl7cmV0dXJuIXNnKGUuaW5zdGFuY2VJZCl9ZnVuY3Rpb24gbGcoZSl7bGV0e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOnMsbWV0aG9kczp1LHByb3BzOmcsZXJyTXNnOkV9PWUsVT17bW9kdWxlTmFtZTp0LG1vZHVsZVR5cGU6bixwYWNrYWdlOnIsY2xhc3M6cyxlcnJNc2c6RX0sUCxMPVtdLE9lPXt9LFBlPVtdO2lUKGUpP1A9ZS5pbnN0YW5jZUlkOihMPWUuY29uc3RydWN0b3IucGFyYW1zLE9lPWUuc3RhdGljTWV0aG9kcyxQZT1lLnN0YXRpY1Byb3BzKSx0eXBlb2YgbCE9InVuZGVmaW5lZCImJmwub3MubmFtZT09PSJpT1MiJiZMLmZpbmQocHQ9PnB0LnR5cGU9PT0iVVRTQ2FsbGJhY2sifHxwdC50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKT4wKSYmTC5wdXNoKHtuYW1lOiJfYnlKcyIsdHlwZToiYm9vbGVhbiJ9KTtsZXQgUmU9Y2xhc3N7Y29uc3RydWN0b3IoLi4ua3Qpe2lmKEUpdGhyb3cgbmV3IEVycm9yKEUpO2xldCBSdD17fTtpZihzZyhQKSYmKFA9bmQoITEsSi5leHRlbmQoe25hbWU6ImNvbnN0cnVjdG9yIixwYXJhbXM6TH0sVSksMCkuYXBwbHkobnVsbCxrdCkpLCFQKXRocm93IG5ldyBFcnJvcihgbmV3ICR7c30gaXMgZmFpbGVkYCk7bGV0IGRuPW5ldyBQcm94eSh0aGlzLHtnZXQobG4sanQpe2lmKCFSdFtqdF0pe2lmKGp0PWFnKGp0LHUpLEouaGFzT3duKHUsanQpKXtsZXR7YXN5bmM6d3QscGFyYW1zOnZuLHJldHVybjpvbn09dVtqdF07UnRbanRdPW5UKCEhd3QsSi5leHRlbmQoe25hbWU6anQscGFyYW1zOnZuLHJldHVybjpvbn0sVSksUCxkbil9ZWxzZSBpZihnLmluY2x1ZGVzKGp0KSlyZXR1cm4gaWcoe21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4saWQ6UCxuYW1lOmp0LGVyck1zZzpFfSl9cmV0dXJuIFJ0W2p0XX19KTtyZXR1cm4gZG59fSxodD17fTtyZXR1cm4gbmV3IFByb3h5KFJlLHtnZXQocHQsa3QsUnQpe2lmKGt0PWFnKGt0LE9lKSxKLmhhc093bihPZSxrdCkpe2lmKCFodFtrdF0pe2xldHthc3luYzpkbixwYXJhbXM6bG4scmV0dXJuOmp0fT1PZVtrdF07aHRba3RdPW9nKCEhZG4sSi5leHRlbmQoe25hbWU6a3QsY29tcGFuaW9uOiEwLHBhcmFtczpsbixyZXR1cm46anR9LFUpKX1yZXR1cm4gaHRba3RdfXJldHVybiBQZS5pbmNsdWRlcyhrdCk/aWcoSi5leHRlbmQoe25hbWU6a3QsY29tcGFuaW9uOiEwfSxVKSk6UmVmbGVjdC5nZXQocHQsa3QsUnQpfX0pfWZ1bmN0aW9uIG9UKGUsdCl7cmV0dXJuIHR5cGVvZiBsIT0idW5kZWZpbmVkIiYmbC5vcy5uYW1lPT09IkFuZHJvaWQiPyJ1dHMuc2RrLiIrKHQ/Im1vZHVsZXMuIjoiIikrZToiIn1mdW5jdGlvbiBhVChlLHQpe3JldHVybiB0eXBlb2YgbD09InVuZGVmaW5lZCI/IiI6Y2coZSxsLm9zLm5hbWU9PT0iaU9TIj8iSW5kZXhTd2lmdCI6IkluZGV4S3QiLHQpfWZ1bmN0aW9uIGNnKGUsdCxuKXtyZXR1cm4gdHlwZW9mIGw9PSJ1bmRlZmluZWQiPyIiOmwub3MubmFtZT09PSJBbmRyb2lkIj90Omwub3MubmFtZT09PSJpT1MiPyJVVFNTREsiKyhuPyJNb2R1bGVzIjoiIikrSi5jYXBpdGFsaXplKGUpK0ouY2FwaXRhbGl6ZSh0KToiIn1sZXQgcmQ9e307ZnVuY3Rpb24gc1QoZSx0KXtyZFtlXT10fWxldCB1Zz17fTtmdW5jdGlvbiBsVChlLHQpe3VnW2VdPXR9ZnVuY3Rpb24gY1QoZSl7bGV0IHQ9dWdbZV07cmV0dXJuIHR8fGNvbnNvbGUuZXJyb3IoYCR7ZX0gaXMgbm90IGZvdW5kYCksdH1sZXQgZGE9e2xvYWQ6ImxvYWQiLGNsb3NlOiJjbG9zZSIsZXJyb3I6ImVycm9yIixhZENsaWNrZWQ6ImFkQ2xpY2tlZCJ9O2NsYXNzIGZne2NvbnN0cnVjdG9yKCl7dGhpcy5fY2FsbGJhY2tzPXt9fW9uTG9hZCh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKGRhLmxvYWQsdCl9b25DbG9zZSh0KXt0aGlzLl9hZGRFdmVudExpc3RlbmVyKGRhLmNsb3NlLHQpfW9uRXJyb3IodCl7dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihkYS5lcnJvcix0KX1vZmZMb2FkKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoZGEubG9hZCx0KX1vZmZDbG9zZSh0KXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKGRhLmNsb3NlLHQpfW9mZkVycm9yKHQpe3RoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXIoZGEuZXJyb3IsdCl9X2FkZEV2ZW50TGlzdGVuZXIodCxuKXshSi5pc0Z1bmN0aW9uKG4pfHwodGhpcy5fY2FsbGJhY2tzW3RdfHwodGhpcy5fY2FsbGJhY2tzW3RdPVtdKSx0aGlzLl9jYWxsYmFja3NbdF0ucHVzaChuKSl9X3JlbW92ZUV2ZW50TGlzdGVuZXIodCxuKXtsZXQgcj10aGlzLl9jYWxsYmFja3NbdF0scz1yLmluZGV4T2Yobik7cz4tMSYmci5zcGxpY2UocywxKX1fZGlzcGF0Y2hFdmVudCh0LG4pe3RoaXMuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKHI9PntyKG58fHt9KX0pfX1jbGFzcyBpZCBleHRlbmRzIGZne2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKTt0aGlzLnByZWxvYWQ9ITAsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCx0aGlzLnByZWxvYWQ9bi5wcmVsb2FkIT09dm9pZCAwP24ucHJlbG9hZDohMTtsZXQgcj10aGlzLl9hZEluc3RhbmNlPXQ7ci5vbkxvYWQoKCk9Pnt0aGlzLl9pc0xvYWRlZD0hMCx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlKCksdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dBZCgpKSx0aGlzLl9kaXNwYXRjaEV2ZW50KGRhLmxvYWQse30pfSksci5vbkNsb3NlKHM9Pnt0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fZGlzcGF0Y2hFdmVudChkYS5jbG9zZSxzKSx0aGlzLnByZWxvYWQ9PT0hMCYmdGhpcy5fbG9hZEFkKCl9KSxyLm9uRXJyb3Iocz0+e3RoaXMuX2lzTG9hZGluZz0hMTtsZXQgdT17Y29kZTpzLmNvZGUsZXJyTXNnOnMubWVzc2FnZX07dGhpcy5fZGlzcGF0Y2hFdmVudChkYS5lcnJvcix1KTtsZXQgZz1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodSkpO3RoaXMuX2xvYWRQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fbG9hZFByb21pc2VSZWplY3QoZyksdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdChnKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLHIub25BZENsaWNrZWQmJnIub25BZENsaWNrZWQoKCk9Pnt0aGlzLl9kaXNwYXRjaEV2ZW50KGRhLmFkQ2xpY2tlZCx7fSl9KX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLl9hZEluc3RhbmNlLmdldFByb3ZpZGVyKCl9bG9hZCgpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT10LHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyYmKHRoaXMuX2lzTG9hZGVkP3QoIiIpOnRoaXMuX2xvYWRBZCgpKX0pfXNob3coKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9dCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcmJih0aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpKX0pfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koKX1fbG9hZEFkKCl7dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZCgpfV9zaG93QWQoKXt0aGlzLl9hZEluc3RhbmNlLnNob3coKX19Y2xhc3MgdVQgZXh0ZW5kcyBpZHtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh0KSx0KTt0aGlzLl9sb2FkQWQoKX19bGV0IGZUPUR0KEp3LGU9Pm5ldyB1VChlKSxadyxLdyk7Y2xhc3MgZFQgZXh0ZW5kcyBpZHtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkKHQpLHQpO3RoaXMucHJlbG9hZD0hMX19bGV0IGhUPUR0KFh3LGU9Pm5ldyBkVChlKSxlUyxRdyk7Y2xhc3MgcFQgZXh0ZW5kcyBpZHtjb25zdHJ1Y3Rvcih0KXtzdXBlcihsLmFkLmNyZWF0ZUludGVyc3RpdGlhbEFkKHQpLHQpO3RoaXMucHJlbG9hZD0hMSx0aGlzLl9sb2FkQWQoKX19bGV0IGdUPUR0KHRTLGU9Pm5ldyBwVChlKSxyUyxuUyksdXM9e30sSmw9e307ZnVuY3Rpb24gdlQoZSl7bGV0IHQ9ZS5wcm92aWRlcjtpZih1c1t0XXx8KHVzW3RdPXt9KSx0eXBlb2YgdXNbdF0ucGx1Z2luPT0ib2JqZWN0Iil7ZS5zdWNjZXNzKHVzW3RdLnBsdWdpbik7cmV0dXJufWlmKEpsW3RdfHwoSmxbdF09W10pLEpsW3RdLnB1c2goZSksdXNbdF0uc3RhdHVzPT09ITApe2UuX19wbHVnaW49dXNbdF0ucGx1Z2luO3JldHVybn11c1t0XS5zdGF0dXM9ITA7bGV0IG49T2EodCk7aWYoIW58fCFuLmluaXRTREspe0psW3RdLmZvckVhY2gocj0+e3IuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIit0KyJdIGludmFsaWQifSl9KSxKbFt0XS5sZW5ndGg9MCx1c1t0XS5zdGF0dXM9ITE7cmV0dXJufXVzW3RdLnBsdWdpbj1uLGUuX19wbHVnaW49bixuLmluaXRTREsocj0+e2xldCBzPXIuY29kZT09PTF8fHIuY29kZT09PSIxIjtzP3VzW3RdLnBsdWdpbj1uOnVzW3RdLnN0YXR1cz0hMSxKbFt0XS5mb3JFYWNoKHU9PntzP3Uuc3VjY2Vzcyh1Ll9fcGx1Z2luKTp1LmZhaWwocil9KSxKbFt0XS5sZW5ndGg9MH0pfWNsYXNzIG1UIGV4dGVuZHMgZmd7Y29uc3RydWN0b3IodCl7c3VwZXIoKTt0aGlzLl9hZHBpZD0iIix0aGlzLl9wcm92aWRlcj0iIix0aGlzLl91c2VyRGF0YT1udWxsLHRoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fYWRJbnN0YW5jZT1udWxsLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fYWRwaWQ9dC5hZHBpZCx0aGlzLl9wcm92aWRlcj10LnByb3ZpZGVyLHRoaXMuX3VzZXJEYXRhPXQudXNlckRhdGEsaygoKT0+e3RoaXMuX2luaXQoKX0pfV9pbml0KCl7dGhpcy5fYWRFcnJvcj0iIix2VCh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2Vzczp0PT57dGhpcy5fYWRJbnN0YW5jZT10LHRoaXMuX3VzZXJEYXRhJiZ0aGlzLmJpbmRVc2VyRGF0YSh0aGlzLl91c2VyRGF0YSksdGhpcy5fbG9hZEFkKCl9LGZhaWw6dD0+e3RoaXMuX2FkRXJyb3I9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KGRhLmVycm9yLHQpfX0pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfWxvYWQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcpe2lmKHRoaXMuX2FkRXJyb3Ipe3RoaXMuX2luaXQoKTtyZXR1cm59dGhpcy5faXNMb2FkZWQ/dCgiIik6dGhpcy5fbG9hZEFkKCl9fSl9c2hvdygpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2lmKHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT10LHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW4sIXRoaXMuX2lzTG9hZGluZyl7aWYodGhpcy5fYWRFcnJvcil7dGhpcy5faW5pdCgpO3JldHVybn10aGlzLl9pc0xvYWRlZD8odGhpcy5fc2hvd0FkKCksdCgiIikpOnRoaXMuX2xvYWRBZCgpfX0pfXJlcG9ydEV4cG9zdXJlKCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UucmVwb3J0RXhwb3N1cmUoKX1iaW5kVXNlckRhdGEodCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UuYmluZFVzZXJEYXRhKHQpfWRlc3Ryb3koKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5fYWRJbnN0YW5jZS5kZXN0cm95JiZ0aGlzLl9hZEluc3RhbmNlLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9X2xvYWRBZCgpe2lmKHRoaXMuX2FkSW5zdGFuY2UhPT1udWxsKXtpZih0aGlzLl9pc0xvYWRpbmc9PT0hMClyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkSW5zdGFuY2UubG9hZERhdGEoe2FkcGlkOnRoaXMuX2FkcGlkfSx0PT57dGhpcy5faXNMb2FkZWQ9ITAsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUoKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93QWQoKSksdGhpcy5fZGlzcGF0Y2hFdmVudChkYS5sb2FkLHQpfSx0PT57dGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoZGEuZXJyb3IsdCl9KX19X3Nob3dBZCgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9pc0xvYWRlZD09PSEwJiZ0aGlzLl9hZEluc3RhbmNlLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSwoKT0+e3RoaXMuX2lzTG9hZGVkPSExfSx0PT57dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5fc2hvd1Byb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudChkYS5lcnJvcix0KX0pfV9jcmVhdGVFcnJvcih0KXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHQpKX19bGV0IF9UPUR0KGlTLGU9Pm5ldyBtVChlKSxhUyxvUyksZGc9bC5vcy5uYW1lPT09IkFuZHJvaWQiJiZwYXJzZUludChsLm9zLnZlcnNpb24pPDYsYlQ9ZGc/InNsaWRlLWluLXJpZ2h0IjoicG9wLWluIixZdT0zMDAsaGc9ZGc/InNsaWRlLW91dC1yaWdodCI6InBvcC1vdXQiLHlUPSJfd3d3L19fdW5pYXBwdmlldy5odG1sIixFVD0id2Vidmlld0lkIix3VD0idW5pTVBOYXRpdmVFdmVudCI7ZnVuY3Rpb24gU1QoZSx0LG4pe24mJnQuaXNOVnVlJiYoZS51bmlOVmlldz17cGF0aDpuLGRlZmF1bHRGb250U2l6ZTpSLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpSLnZpZXdwb3J0fSl9bGV0IENUPS9eI1thLXowLTldezZ9JC9pO2Z1bmN0aW9uIE9UKGUpe3JldHVybiBlJiYoQ1QudGVzdChlKXx8ZT09PSJ0cmFuc3BhcmVudCIpfWZ1bmN0aW9uIEFUKGUsdCl7bGV0e2JhY2tncm91bmRDb2xvcjpufT10OyFufHwhT1Qobil8fChlLmJhY2tncm91bmQ/bj1lLmJhY2tncm91bmQ6ZS5iYWNrZ3JvdW5kPW4sZS5iYWNrZ3JvdW5kQ29sb3JUb3B8fChlLmJhY2tncm91bmRDb2xvclRvcD1uKSxlLmJhY2tncm91bmRDb2xvckJvdHRvbXx8KGUuYmFja2dyb3VuZENvbG9yQm90dG9tPW4pLGUuYW5pbWF0aW9uQWxwaGFCR0NvbG9yfHwoZS5hbmltYXRpb25BbHBoYUJHQ29sb3I9biksdHlwZW9mIGUud2Vidmlld0JHVHJhbnNwYXJlbnQ9PSJ1bmRlZmluZWQiJiYoZS53ZWJ2aWV3QkdUcmFuc3BhcmVudD0hMCkpfWZ1bmN0aW9uIFRUKGUsdCl7ZS5wb3BHZXN0dXJlPT09ImhpZGUiJiZkZWxldGUgZS5wb3BHZXN0dXJlLHQuaXNRdWl0JiYoZS5wb3BHZXN0dXJlPWwub3MubmFtZT09PSJpT1MiPyJhcHBiYWNrIjoibm9uZSIpfWZ1bmN0aW9uIElUKGUsdCl7aWYoIXQuZW5hYmxlUHVsbERvd25SZWZyZXNoKXJldHVybjtsZXQgbj1UaShKLmV4dGVuZCh7fSxsLm9zLm5hbWU9PT0iQW5kcm9pZCI/TlQ6a1QsdC5wdWxsVG9SZWZyZXNoKSk7ZS5wdWxsVG9SZWZyZXNoPVBUKG4sdCl9ZnVuY3Rpb24gUFQoZSx0KXtsZXQgbj1NcihlKTtpZighbilyZXR1cm4gZTtsZXRbcixzLHVdPW47cmV0dXJuKHJ8fHN8fHUpJiZPLm9uTG9jYWxlQ2hhbmdlKCgpPT57bGV0IGc9bC53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuaWQrIiIpO2lmKCFnKXJldHVybjtsZXQgRT17c3VwcG9ydDohMH07ciYmKEUuY29udGVudGRvd249e2NhcHRpb246ZS5jb250ZW50ZG93bi5jYXB0aW9ufSkscyYmKEUuY29udGVudG92ZXI9e2NhcHRpb246ZS5jb250ZW50b3Zlci5jYXB0aW9ufSksdSYmKEUuY29udGVudHJlZnJlc2g9e2NhcHRpb246ZS5jb250ZW50cmVmcmVzaC5jYXB0aW9ufSksZy5zZXRTdHlsZSh7cHVsbFRvUmVmcmVzaDpFfSl9KSxlfWxldCBOVD17c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0sa1Q9e3N1cHBvcnQ6ITAsc3R5bGU6ImRlZmF1bHQiLGhlaWdodDoiNTBweCIscmFuZ2U6IjIwMHB4Iixjb250ZW50ZG93bjp7Y2FwdGlvbjoiIn0sY29udGVudG92ZXI6e2NhcHRpb246IiJ9LGNvbnRlbnRyZWZyZXNoOntjYXB0aW9uOiIifX07ZnVuY3Rpb24gUlQoZSx0KXtsZXR7bmF2aWdhdGlvbkJhcjpufT10O2lmKG4uc3R5bGU9PT0iY3VzdG9tIilyZXR1cm4hMTtsZXQgcj0hMDt0LmlzUXVpdCYmKHI9ITEpO2xldCBzPXthdXRvQmFja0J1dHRvbjpyfTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHU9PntsZXQgZz1uW3VdO3U9PT0idGl0bGVJbWFnZSImJmc/cy50YWdzPUJUKGcpOnU9PT0iYnV0dG9ucyImJkouaXNBcnJheShnKT9zLmJ1dHRvbnM9Zy5tYXAoKEUsVSk9PihFLm9uY2xpY2s9TVQoVSksRSkpOnNbdV09Z30pLGUudGl0bGVOVmlldz14VChzLHQpfWZ1bmN0aW9uIHhUKGUsdCl7bGV0IG49UXIoZSk7aWYoIW4pcmV0dXJuIGU7bGV0W3Isc109bjtyZXR1cm4ocnx8cykmJk8ub25Mb2NhbGVDaGFuZ2UoKCk9PntsZXQgdT1sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5pZCsiIik7aWYoIXUpcmV0dXJuO2xldCBnPXt9O3ImJihnLnRpdGxlVGV4dD1lLnRpdGxlVGV4dCkscyYmKGcuc2VhcmNoSW5wdXQ9e3BsYWNlaG9sZGVyOmUuc2VhcmNoSW5wdXQucGxhY2Vob2xkZXJ9KSx1LnNldFN0eWxlKHt0aXRsZU5WaWV3Omd9KX0pLGV9ZnVuY3Rpb24gQlQoZSl7cmV0dXJuW3t0YWc6ImltZyIsc3JjOmUscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19ZnVuY3Rpb24gTVQoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW5kZXg9ZSx6bihyZS5PTl9OQVZJR0FUSU9OX0JBUl9CVVRUT05fVEFQLG4pfX1mdW5jdGlvbiBwZyhlLHQsbil7bGV0IHI9e2JvdW5jZToidmVydGljYWwifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChzPT57RFQuaW5kZXhPZihzKT09PS0xJiYocltzXT10W3NdKX0pLG4uaWQhPT0iMSImJlNUKHIsdCxlKSxUVChyLHQpLEFUKHIsdCksUlQocix0KSxJVChyLHQpLHJ9bGV0IERUPVsiaWQiLCJyb3V0ZSIsImlzTlZ1ZSIsImlzUXVpdCIsImlzRW50cnkiLCJpc1RhYkJhciIsInRhYkJhckluZGV4Iiwid2luZG93VG9wIiwidG9wV2luZG93IiwibGVmdFdpbmRvdyIsInJpZ2h0V2luZG93IiwibWF4V2lkdGgiLCJ1c2luZ0NvbXBvbmVudHMiLCJkaXNhYmxlU2Nyb2xsIiwiZW5hYmxlUHVsbERvd25SZWZyZXNoIiwibmF2aWdhdGlvbkJhciIsInB1bGxUb1JlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJwYWdlT3JpZW50YXRpb24iLCJiYWNrZ3JvdW5kQ29sb3IiXSxnZz0yO2Z1bmN0aW9uIHZnKCl7cmV0dXJuIGdnfWZ1bmN0aW9uIG1nKCl7cmV0dXJuIGdnKyt9ZnVuY3Rpb24gX2coZSl7cmV0dXJuIGV9ZnVuY3Rpb24gYmcoZSx0KXtsZXQgbj10P3JlLnN0cmluZ2lmeVF1ZXJ5KHQsX2cpOiIiO3JldHVybntwYXRoOmUuc2xpY2UoMSkscXVlcnk6biYmbi5zbGljZSgxKX19ZnVuY3Rpb24gTFQoZSx0LG4pe2xldCByPW4/cmUuc3RyaW5naWZ5UXVlcnkobixfZyk6IiI7cmV0dXJue2lzVGFiOmUsYXJndW1lbnRzOkpTT04uc3RyaW5naWZ5KHtwYXRoOnQuc2xpY2UoMSkscXVlcnk6ciYmci5zbGljZSgxKX0pfX1mdW5jdGlvbiBGVCh7cGF0aDplLHF1ZXJ5OnQscm91dGVPcHRpb25zOm4sd2Vidmlld0V4dHJhczpyfSl7bGV0IHM9KCk9PnBnKGUsJGYobi5tZXRhKSx7aWQ6dSsiIn0pLHU9bWcoKSxnPXMoKTtnLnVuaVBhZ2VVcmw9YmcoZSx0KSxnLmlzVGFiPSEhbi5tZXRhLmlzVGFiQmFyO2xldCBFPWwud2Vidmlldy5jcmVhdGUoIiIsU3RyaW5nKHUpLGcsSi5leHRlbmQoe252dWU6ITAsX19wYXRoX186ZSxfX3F1ZXJ5X186SlNPTi5zdHJpbmdpZnkodCl9LHIpKTtyZXR1cm4gYXAoRSxzKSxFfWxldCBnbztmdW5jdGlvbiB5ZyhlKXtnbz1lfWZ1bmN0aW9uIFZUKCl7cmV0dXJuIGdvfWZ1bmN0aW9uIFVUKCl7cmV0dXJuKCFnb3x8Z28uX191bmlhcHBfcm91dGUpJiYoZ289bC53ZWJ2aWV3LmNyZWF0ZSh5VCxTdHJpbmcobWcoKSkse2NvbnRlbnRBZGp1c3Q6ITF9KSksZ299ZnVuY3Rpb24gJFQoZSl7bGV0e3BvcHVwU3ViTlZ1ZVdlYnZpZXdzOnR9PWU7IXR8fGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT57T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57dFtuXS5jbG9zZSgibm9uZSIpfSl9KX1mdW5jdGlvbiBFZyhlKXtyZXR1cm4gUi5yZWFsRW50cnlQYWdlUGF0aCYmZS4kcGFnZS5yb3V0ZT09PVIuZW50cnlQYWdlUGF0aH1mdW5jdGlvbiB3Zygpe1IuZW50cnlQYWdlUGF0aD1SLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBSLnJlYWxFbnRyeVBhZ2VQYXRoLE8ucmVMYXVuY2goe3VybDpyZS5hZGRMZWFkaW5nU2xhc2goUi5lbnRyeVBhZ2VQYXRoKX0pfWZ1bmN0aW9uIEhUKGUpe2xldCB0O2UuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsbj0+e2lmKG4udHlwZT09PSJzdGFydCIpe2xldCByPWpuKCkscz1yW3IubGVuZ3RoLTJdO3Q9ZnU7bGV0IHU9cyYmcy4kcGFnZS5zdGF0dXNCYXJTdHlsZTt1JiZEcyh1KX1lbHNlIGlmKG4udHlwZT09PSJlbmQiJiYhbi5yZXN1bHQpRHModCk7ZWxzZSBpZihuLnR5cGU9PT0iZW5kIiYmbi5yZXN1bHQpe2xldCByPWpuKCkubGVuZ3RoLHM9RHIoKTtjbCgpLERzKCkscyYmcj09PTEmJkVnKHMpP3dnKCk6em4ocmUuT05fU0hPVyl9fSl9ZnVuY3Rpb24galQoZSl7aWYoZS5udnVlKXJldHVybjtsZXQgdD1lLmlkLHtzdWJzY3JpYmU6bix1bnN1YnNjcmliZTpyfT1fdCxzPSh1LGcpPT57aWYodCE9PWcpcmV0dXJuO3IoQmMscyk7bGV0IEU9aWEocGFyc2VJbnQoZykpO0UmJkUuX19wYWdlX2NvbnRhaW5lcl9fLnJlc3RvcmUoKX07ZS5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsKCk9PntuKEJjLHMpfSl9ZnVuY3Rpb24gelQoZSl7bGV0e2VtaXQ6dH09X3Qsbj1mdW5jdGlvbih7d2lkdGg6cixoZWlnaHQ6c30pe2xldCBnPXtkZXZpY2VPcmllbnRhdGlvbjpNYXRoLmFicyhsLm5hdmlnYXRvci5nZXRPcmllbnRhdGlvbigpKT09PTkwPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHIpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwocyl9fTt0KHJlLk9OX1JFU0laRSxnLHBhcnNlSW50KGUuaWQpKX07ZS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHJlLmRlYm91bmNlKG4sNTAse3NldFRpbWVvdXQ6ayxjbGVhclRpbWVvdXQ6Q30pKX1sZXQgU2c9e3B1bGxUb1JlZnJlc2g6cmUuT05fUFVMTF9ET1dOX1JFRlJFU0gsdGl0bGVOVmlld1NlYXJjaElucHV0Q2hhbmdlZDpyZS5PTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0hBTkdFRCx0aXRsZU5WaWV3U2VhcmNoSW5wdXRDb25maXJtZWQ6cmUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NPTkZJUk1FRCx0aXRsZU5WaWV3U2VhcmNoSW5wdXRDbGlja2VkOnJlLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DTElDS0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZDpyZS5PTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfRk9DVVNfQ0hBTkdFRH07ZnVuY3Rpb24gV1QoZSl7bGV0IHQ9cGFyc2VJbnQoZS5pZCk7T2JqZWN0LmtleXMoU2cpLmZvckVhY2gobj0+e2xldCByPVNnW25dO2UuYWRkRXZlbnRMaXN0ZW5lcihuLHM9PntyPT09cmUuT05fUFVMTF9ET1dOX1JFRlJFU0gmJmpmKGUpLHpuKHQscixzKX0pfSksJFQoZSkselQoZSksbC5vcy5uYW1lPT09ImlPUyImJihqVChlKSxIVChlKSl9ZnVuY3Rpb24gR1QoZSx0LG4scil7bGV0IHM9KCk9PnBnKHQsJGYociksZSksdT1zKCk7dS51bmlQYWdlVXJsPWJnKHQsbik7bGV0IGc9ISFyLmlzVGFiQmFyO3IuaXNOVnVlP3UuaXNUYWI9Zzp1LmRlYnVnUmVmcmVzaD1MVChnLHQsbiksdS5sb2NhbGU9di5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxhcChlLHMpLGUuc2V0U3R5bGUodSl9ZnVuY3Rpb24gWVQoZSx0LG4peyhuLnN1Yk5WdWVzfHxbXSkuZm9yRWFjaChzPT57aWYoIXMucGF0aClyZXR1cm47bGV0IHU9T28ocy5zdHlsZXx8e30pLGc9cy50eXBlPT09Im5hdmlnYXRpb25CYXIiLEU9cy50eXBlPT09InBvcHVwIjt1LnVuaU5WaWV3PXtwYXRoOnMucGF0aC5yZXBsYWNlKCIubnZ1ZSIsIi5qcyIpLGRlZmF1bHRGb250U2l6ZTpSLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpSLnZpZXdwb3J0fTtsZXQgVT17X191bmlhcHBfaG9zdDp0LF9fdW5pYXBwX29yaWdpbjp1LnVuaU5WaWV3LnBhdGguc3BsaXQoIj8iKVswXS5yZXBsYWNlKCIuanMiLCIiKSxfX3VuaWFwcF9vcmlnaW5faWQ6ZS5pZCxfX3VuaWFwcF9vcmlnaW5fdHlwZTplLl9fdW5pYXBwX3R5cGV9LFA7Zz8odS5wb3NpdGlvbj0iZG9jayIsdS5kb2NrPSJ0b3AiLHUudG9wPSIwIix1LndpZHRoPSIxMDAlIix1LmhlaWdodD1TdHJpbmcocmUuTkFWQkFSX0hFSUdIVCt6ZigpKSxkZWxldGUgdS5sZWZ0LGRlbGV0ZSB1LnJpZ2h0LGRlbGV0ZSB1LmJvdHRvbSxkZWxldGUgdS5tYXJnaW4pOkUmJih1LnBvc2l0aW9uPSJhYnNvbHV0ZSIsdXUodCk/UD1NaTpQPWUsVS5fX3VuaWFwcF9tYXNrPXUubWFza3x8InJnYmEoMCwwLDAsMC41KSIsVS5fX3VuaWFwcF9tYXNrX2lkPVAuaWQpLGRlbGV0ZSB1Lm1hc2s7bGV0IEw9bC53ZWJ2aWV3LmNyZWF0ZSgiIixzLmlkLHUsVSk7aWYoRSl7UC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KFAucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLFAucG9wdXBTdWJOVnVlV2Vidmlld3NbTC5pZF09TDtsZXQgT2U9ZnVuY3Rpb24oKXtQLnNldFN0eWxlKHttYXNrOiJub25lIn0pLEwuaGlkZSgiYXV0byIpfTtQLmFkZEV2ZW50TGlzdGVuZXIoIm1hc2tDbGljayIsT2UpO2xldCBQZT0hMTtMLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLCgpPT57UGV8fChsLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixMYSksbC5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsT2UpLFBlPSEwKX0pLEwuYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsKCk9PntQZSYmKGwua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLE9lKSxsLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixMYSksUGU9ITEpfSksTC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntkZWxldGUgUC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tMLmlkXSxQZSYmKGwua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLE9lKSxsLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixMYSksUGU9ITEpfSl9ZWxzZSBlLmFwcGVuZChMKX0pfWZ1bmN0aW9uIHFUKGUsdCxuLHIpeyhlLmlkPT09IjEifHwhci5pc05WdWUpJiZHVChlLHQsbixyKSxZVChlLHQsciksV1QoZSl9ZnVuY3Rpb24gQ2coZSl7cmV0dXJuIGUucm91dGVPcHRpb25zLm1ldGEuaXNOVnVlP0ZUKGUpOnZnKCk9PT0yP2wud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCk6VlQoKX1mdW5jdGlvbiBPZyhlLHQpe190Lm9uY2UoQmMrIi4iK2UsdCl9bGV0IGZzPSExO2Z1bmN0aW9uIEFnKGUsdCxuKXtmcz17cGF0aDplLG52dWU6SmEoZSkuaXNOVnVlLGNhbGxiYWNrOnR9fWZ1bmN0aW9uIFRnKGUsdCxuKXtGbyhlKSxLbChlLiRnZXRBcHBXZWJ2aWV3KCksdCxuKX1mdW5jdGlvbiBxdShlLHQsbj0hMSl7aWYoIW4mJmZzKXJldHVybiBjb25zb2xlLmVycm9yKGBXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAke2ZzLnBhdGh9LCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICR7ZX0uYCk7aWYoUi5yZW5kZXJlcj09PSJuYXRpdmUiKXJldHVybiBqbigpLmxlbmd0aD09PTA/QWcoZSx0LCJ3YWl0Rm9yUmVhZHkiKTp0KCk7bGV0IHI9IWdvfHxnbyYmZ28uX191bmlhcHBfcm91dGUscz1nbyYmIWdvLmxvYWRlZDtyfHxzP0FnKGUsdCxyPyJ3YWl0Rm9yQ3JlYXRlIjoid2FpdEZvclJlYWR5Iik6dCgpLHMmJk9nKGdvLmlkLEp1KX1mdW5jdGlvbiBKdSgpe2lmKCFmcylyZXR1cm47bGV0e2NhbGxiYWNrOmV9PWZzO3JldHVybiBmcz0hMSxlKCl9ZnVuY3Rpb24gSWcoKXtpZihSLnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIGZzJiZmcy5udnVlP0p1KCk6dm9pZCAwO2xldCBlPVVUKCk7aWYoISFmcyl7aWYoZnMubnZ1ZSlyZXR1cm4gSnUoKTtlLmxvYWRlZD9mcy5jYWxsYmFjaygpOk9nKGUuaWQsSnUpfX1mdW5jdGlvbiBLbChlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIEt1KGUsdCxuLHIscyl7dHlwZW9mIHM9PSJ1bmRlZmluZWQiJiYocz1lLm52dWU/MDoxMDApO2xldCB1PWZ1bmN0aW9uKCl7dS5fY2FsbGVkfHwodS5fY2FsbGVkPSEwLHImJnIoKSxJZygpKX07dS5fY2FsbGVkPSExLGsoKCk9PntsZXQgZz1rKCgpPT57dSgpfSxuKzE1MCk7ZS5zaG93KHQsbiwoKT0+e3UuX2NhbGxlZHx8QyhnKSx1KCl9KX0scyl9ZnVuY3Rpb24gSlQoZSx0KXtsZXQgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO2xldCByPW4uZmluZChzPT5zLmlkLmluZGV4T2YoRVQpPT09MCl8fG5bMF07ci5jYW5CYWNrKCh7Y2FuQmFjazpzfSk9PntzP3IuYmFjaygpOnQoKX0pfWxldCBLVD1rZShoRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1EcigpO2lmKCFyKXJldHVybiBuKCJnZXRDdXJyZW50UGFnZXMgaXMgZW1wdHkiKTtpZih6bihyLHJlLk9OX0JBQ0tfUFJFU1Mse2Zyb206ZS5mcm9tfHwibmF2aWdhdGVCYWNrIn0pKXJldHVybiB0KCk7aWYoTy5oaWRlVG9hc3QoKSxPLmhpZGVMb2FkaW5nKCksci4kcGFnZS5tZXRhLmlzUXVpdClaVCgpO2Vsc2UgaWYoRWcocikpd2coKTtlbHNle2xldHtkZWx0YTpzLGFuaW1hdGlvblR5cGU6dSxhbmltYXRpb25EdXJhdGlvbjpnfT1lO1hUKHMsdSxnKX1yZXR1cm4gdCgpfSxnRSxPRSksWnU9MDtmdW5jdGlvbiBaVCgpe090KCksWnU/RGF0ZS5ub3coKS1adTwyZTMmJmwucnVudGltZS5xdWl0KCk6KFp1PURhdGUubm93KCksbC5uYXRpdmVVSS50b2FzdChsZSgpLnQoInVuaS5hcHAucXVpdCIpKSxrKCgpPT57WnU9MH0sMmUzKSl9ZnVuY3Rpb24gWFQoZSx0LG4pe2xldCByPWpuKCkscz1yLmxlbmd0aCx1PXJbcy0xXTtlPjEmJnIuc2xpY2Uocy1lLHMtMSkucmV2ZXJzZSgpLmZvckVhY2goVT0+e0tsKGwud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChVLiRwYWdlLmlkKyIiKSwibm9uZSIsMCl9KTtsZXQgZz1mdW5jdGlvbihVKXt0P0tsKFUsdCxufHxZdSk6dS4kcGFnZS5vcGVuVHlwZT09PSJyZWRpcmVjdFRvIj9LbChVLGhnLFl1KTpLbChVLCJhdXRvIiksci5zbGljZShzLWUscykuZm9yRWFjaChQPT5GbyhQKSksRHMoKSx6bihyZS5PTl9TSE9XKX0sRT1sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodS4kcGFnZS5pZCsiIik7aWYoIXUuX191bmlhcHBfd2VidmlldylyZXR1cm4gZyhFKTtKVChFLCgpPT57ZyhFKX0pfWNsYXNzIFFUIGV4dGVuZHMgcmUuVW5pTm9kZXtjb25zdHJ1Y3Rvcih0LG4scj0hMSl7c3VwZXIocmUuTk9ERV9UWVBFX1BBR0UsIiNwYWdlIixudWxsKTt0aGlzLl9pZD0xLHRoaXMuX2NyZWF0ZWQ9ITEsdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fY3JlYXRlQWN0aW9uTWFwPW5ldyBNYXAsdGhpcy51cGRhdGVBY3Rpb25zPVtdLHRoaXMuZGljdHM9W10sdGhpcy5ub2RlSWQ9MCx0aGlzLnBhZ2VJZD10LHRoaXMucGFnZU5vZGU9dGhpcyx0aGlzLm9wdGlvbnM9bix0aGlzLmlzVW5tb3VudGVkPSExLHRoaXMuY3JlYXRlQWN0aW9uPVtyZS5BQ1RJT05fVFlQRV9QQUdFX0NSRUFURSxuXSx0aGlzLmNyZWF0ZWRBY3Rpb249W3JlLkFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFRF0sdGhpcy5ub3JtYWxpemVEaWN0PXRoaXMuX25vcm1hbGl6ZURpY3QuYmluZCh0aGlzKSx0aGlzLl91cGRhdGU9dGhpcy51cGRhdGUuYmluZCh0aGlzKSxyJiZ0aGlzLnNldHVwKCl9X25vcm1hbGl6ZURpY3QodCxuPSEwKXtpZighSi5pc1BsYWluT2JqZWN0KHQpKXJldHVybiB0aGlzLmFkZERpY3QodCk7bGV0IHI9W107cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gocz0+e2xldCB1PVt0aGlzLmFkZERpY3QocyldLGc9dFtzXTtuP3UucHVzaCh0aGlzLmFkZERpY3QoZykpOnUucHVzaChnKSxyLnB1c2godSl9KSxyfWFkZERpY3QodCl7bGV0e2RpY3RzOm59PXRoaXMscj1uLmluZGV4T2YodCk7cmV0dXJuIHI+LTE/cjpuLnB1c2godCktMX1vbkluamVjdEhvb2sodCl7KHQ9PT1yZS5PTl9QQUdFX1NDUk9MTHx8dD09PXJlLk9OX1JFQUNIX0JPVFRPTSkmJiF0aGlzLnNjcm9sbEFjdGlvbiYmKHRoaXMuc2Nyb2xsQWN0aW9uPVtyZS5BQ1RJT05fVFlQRV9QQUdFX1NDUk9MTCx0aGlzLm9wdGlvbnMub25SZWFjaEJvdHRvbURpc3RhbmNlXSx0aGlzLnB1c2godGhpcy5zY3JvbGxBY3Rpb24pKX1vbkNyZWF0ZSh0LG4pe3JldHVybiBuSSh0aGlzLHQubm9kZUlkLG4pLHR9b25JbnNlcnRCZWZvcmUodCxuLHIpe3JldHVybiBySSh0aGlzLG4sdC5ub2RlSWQsciYmci5ub2RlSWR8fC0xKSxufW9uUmVtb3ZlQ2hpbGQodCl7cmV0dXJuIGlJKHRoaXMsdC5ub2RlSWQpLHR9b25BZGRFdmVudCh0LG4scil7dC5wYXJlbnROb2RlJiZvSSh0aGlzLHQubm9kZUlkLG4scil9b25BZGRXeHNFdmVudCh0LG4scixzKXt0LnBhcmVudE5vZGUmJmFJKHRoaXMsdC5ub2RlSWQsbixyLHMpfW9uUmVtb3ZlRXZlbnQodCxuKXt0LnBhcmVudE5vZGUmJnNJKHRoaXMsdC5ub2RlSWQsbil9b25TZXRBdHRyaWJ1dGUodCxuLHIpe3QucGFyZW50Tm9kZSYmY0kodGhpcyx0Lm5vZGVJZCxuLHIpfW9uUmVtb3ZlQXR0cmlidXRlKHQsbil7dC5wYXJlbnROb2RlJiZ1SSh0aGlzLHQubm9kZUlkLG4pfW9uVGV4dENvbnRlbnQodCxuKXt0LnBhcmVudE5vZGUmJk5nKHRoaXMsdC5ub2RlSWQsbil9b25Ob2RlVmFsdWUodCxuKXt0LnBhcmVudE5vZGUmJk5nKHRoaXMsdC5ub2RlSWQsbil9Z2VuSWQoKXtyZXR1cm4gdGhpcy5faWQrK31wdXNoKHQsbil7aWYoIXRoaXMuaXNVbm1vdW50ZWQpe3N3aXRjaCh0WzBdKXtjYXNlIHJlLkFDVElPTl9UWVBFX0NSRUFURTp0aGlzLl9jcmVhdGVBY3Rpb25NYXAuc2V0KHRbMV0sdCk7YnJlYWs7Y2FzZSByZS5BQ1RJT05fVFlQRV9JTlNFUlQ6bGV0IHI9dGhpcy5fY3JlYXRlQWN0aW9uTWFwLmdldCh0WzFdKTtyPyhyWzNdPXRbMl0scls0XT10WzNdLG4mJihyWzVdPW4pKToobiYmKHRbNF09biksdGhpcy51cGRhdGVBY3Rpb25zLnB1c2godCkpO2JyZWFrfXRbMF0hPT1yZS5BQ1RJT05fVFlQRV9JTlNFUlQmJnRoaXMudXBkYXRlQWN0aW9ucy5wdXNoKHQpLHRoaXMuX3VwZGF0aW5nfHwodGhpcy5fdXBkYXRpbmc9ITAsRG4ucXVldWVQb3N0Rmx1c2hDYih0aGlzLl91cGRhdGUpKX19cmVzdG9yZSgpe3RoaXMuY2xlYXIoKSx0aGlzLnNldHVwKCksdGhpcy5zY3JvbGxBY3Rpb24mJnRoaXMucHVzaCh0aGlzLnNjcm9sbEFjdGlvbik7bGV0IHQ9bj0+e3RoaXMub25DcmVhdGUobixuLm5vZGVOYW1lKSx0aGlzLm9uSW5zZXJ0QmVmb3JlKG4ucGFyZW50Tm9kZSxuLG51bGwpLG4uY2hpbGROb2Rlcy5mb3JFYWNoKHI9Pnt0KHIpfSl9O3RoaXMuY2hpbGROb2Rlcy5mb3JFYWNoKG49PnQobikpLHRoaXMucHVzaCh0aGlzLmNyZWF0ZWRBY3Rpb24pfXNldHVwKCl7dGhpcy5zZW5kKFt0aGlzLmNyZWF0ZUFjdGlvbl0pfXVwZGF0ZSgpe2xldHtkaWN0czp0LHVwZGF0ZUFjdGlvbnM6bixfY3JlYXRlQWN0aW9uTWFwOnJ9PXRoaXM7dGhpcy5fY3JlYXRlZHx8KHRoaXMuX2NyZWF0ZWQ9ITAsbi5wdXNoKHRoaXMuY3JlYXRlZEFjdGlvbikpLG4ubGVuZ3RoJiYodC5sZW5ndGgmJm4udW5zaGlmdChbVEEsdF0pLHRoaXMuc2VuZChuKSksdGhpcy5jbGVhcigpfWNsZWFyKCl7dGhpcy5kaWN0cy5sZW5ndGg9MCx0aGlzLnVwZGF0ZUFjdGlvbnMubGVuZ3RoPTAsdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fY3JlYXRlQWN0aW9uTWFwLmNsZWFyKCl9c2VuZCh0KXtfdC5wdWJsaXNoSGFuZGxlcihqcCx0LHRoaXMucGFnZUlkKX1maXJlRXZlbnQodCxuKXtsZXQgcj1QZyh0LHRoaXMpO3ImJnIuZGlzcGF0Y2hFdmVudChuKX19ZnVuY3Rpb24gZUkoZSl7bGV0IHQ9aWEoZSk7cmV0dXJuIHQ/dC5fX3BhZ2VfY29udGFpbmVyX186bnVsbH1mdW5jdGlvbiBvZChlLHQsbil7aWYodHlwZW9mIG49PSJudW1iZXIiJiYobj1lSShuKSksbltlXT09PXQpcmV0dXJuIG47bGV0e2NoaWxkTm9kZXM6cn09bjtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrKyl7bGV0IHU9b2QoZSx0LHJbc10pO2lmKHUpcmV0dXJuIHV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gUGcoZSx0KXtyZXR1cm4gb2QoIm5vZGVJZCIsZSx0KX1mdW5jdGlvbiB0SShlLHQpe3JldHVybiBvZCgibm9kZU5hbWUiLGUudG9VcHBlckNhc2UoKSx0KX1mdW5jdGlvbiBuSShlLHQsbil7ZS5wdXNoKFtyZS5BQ1RJT05fVFlQRV9DUkVBVEUsdCxlLmFkZERpY3QobiksLTEsLTFdKX1mdW5jdGlvbiBySShlLHQsbixyKXtsZXQgcz10LnRvSlNPTih7YXR0cjohMCxub3JtYWxpemU6ZS5ub3JtYWxpemVEaWN0fSk7ZS5wdXNoKFtyZS5BQ1RJT05fVFlQRV9JTlNFUlQsdC5ub2RlSWQsbixyXSxPYmplY3Qua2V5cyhzKS5sZW5ndGg/czp2b2lkIDApfWZ1bmN0aW9uIGlJKGUsdCl7ZS5wdXNoKFtyZS5BQ1RJT05fVFlQRV9SRU1PVkUsdF0pfWZ1bmN0aW9uIG9JKGUsdCxuLHIpe2UucHVzaChbcmUuQUNUSU9OX1RZUEVfQUREX0VWRU5ULHQsZS5hZGREaWN0KG4pLHJdKX1mdW5jdGlvbiBhSShlLHQsbixyLHMpe2UucHVzaChbcmUuQUNUSU9OX1RZUEVfQUREX1dYU19FVkVOVCx0LGUuYWRkRGljdChuKSxlLmFkZERpY3Qociksc10pfWZ1bmN0aW9uIHNJKGUsdCxuKXtlLnB1c2goW3JlLkFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVCx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIGxJKGUsdCxuKXtyZXR1cm4gdD09PSJzdHlsZSImJkouaXNQbGFpbk9iamVjdChuKT9lLm5vcm1hbGl6ZURpY3Qobik6ZS5hZGREaWN0KG4pfWZ1bmN0aW9uIGNJKGUsdCxuLHIpe2UucHVzaChbcmUuQUNUSU9OX1RZUEVfU0VUX0FUVFJJQlVURSx0LGUuYWRkRGljdChuKSxsSShlLG4scildKX1mdW5jdGlvbiB1SShlLHQsbil7ZS5wdXNoKFtyZS5BQ1RJT05fVFlQRV9SRU1PVkVfQVRUUklCVVRFLHQsZS5hZGREaWN0KG4pXSl9ZnVuY3Rpb24gTmcoZSx0LG4pe2UucHVzaChbcmUuQUNUSU9OX1RZUEVfU0VUX1RFWFQsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBmSShlLHQsbil7cmV0dXJuIG5ldyBRVChlLHQsbil9ZnVuY3Rpb24ga2coZSl7bGV0IHQ9ZS5zZXR1cDtyZXR1cm4gZS5pbmhlcml0QXR0cnM9ITEsZS5zZXR1cD0obixyKT0+e2xldHthdHRyczp7X19wYWdlSWQ6cyxfX3BhZ2VQYXRoOnUsX19wYWdlUXVlcnk6ZyxfX3BhZ2VJbnN0YW5jZTpFfX09cixQPURuLmdldEN1cnJlbnRJbnN0YW5jZSgpLnByb3h5O2lmKEN0KFAsRSksRGEoUmcocyxQLEUpKSxEbi5vbk1vdW50ZWQoKCk9PntEbi5uZXh0VGljaygoKT0+e3puKFAscmUuT05fUkVBRFkpfSl9KSxEbi5vbkJlZm9yZVVubW91bnQoKCk9Pnt6bihQLHJlLk9OX1VOTE9BRCl9KSx0KXJldHVybiB0KGcscil9LGV9ZnVuY3Rpb24gUmcoZSx0LG4pe2xldCByPSgpPT5sLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSsiIik7cmV0dXJuIHQuJGdldEFwcFdlYnZpZXc9cix0LiQuY3R4LiRzY29wZT17JGdldEFwcFdlYnZpZXc6cn0sdC5nZXRPcGVuZXJFdmVudENoYW5uZWw9KCk9PihuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyByZS5FdmVudENoYW5uZWwoZSkpLG4uZXZlbnRDaGFubmVsKSx0fWZ1bmN0aW9uIGRJKGUpe3JldHVybiBKLmlzRnVuY3Rpb24oZSl9bGV0IHhnPW5ldyBNYXA7ZnVuY3Rpb24gaEkoZSx0KXt4Zy5zZXQoZSxyZS5vbmNlKGdJKHQpKSl9ZnVuY3Rpb24gcEkoZSx0LG4scixzKXtsZXQgdT1mSShlLHMsITApLGc9QW8oKSxFPXhnLmdldCh0KSgpLFU9UD0+Zy5tb3VudFBhZ2UoUCx7X19wYWdlSWQ6ZSxfX3BhZ2VQYXRoOnQsX19wYWdlUXVlcnk6bixfX3BhZ2VJbnN0YW5jZTpyfSx1KTtyZXR1cm4gSi5pc1Byb21pc2UoRSk/RS50aGVuKFA9PlUoUCkpOlUoRSl9ZnVuY3Rpb24gZ0koZSl7cmV0dXJuKCk9PmRJKGUpP2UoKS50aGVuKHQ9PmtnKHQpKTprZyhlKX1sZXQgQmc9ITE7ZnVuY3Rpb24gTWcoKXtpZihCZylyZXR1cm47Qmc9ITA7bGV0IGUsdDtpZih2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOnUscXVlcnk6ZyxyZWZlcnJlckluZm86RX09UmwoKTt1JiYoZT11LHQ9ZyksUi5yZWZlcnJlckluZm89RX1lbHNle2xldCB1PWwucnVudGltZS5hcmd1bWVudHM7aWYoIXUpcmV0dXJuO3RyeXtsZXQgZz1KU09OLnBhcnNlKHUpO2U9Zy5wYXRofHxnLnBhdGhOYW1lLHQ9Zy5xdWVyeT8iPyIrZy5xdWVyeToiIn1jYXRjaChnKXt9fWlmKCFlfHxlPT09Ui5lbnRyeVBhZ2VQYXRoKXt0JiYoUi5lbnRyeVBhZ2VRdWVyeT10KTtyZXR1cm59bGV0IHI9cmUuYWRkTGVhZGluZ1NsYXNoKGUpLHM9aG8ocik7IXN8fChzLm1ldGEuaXNUYWJCYXJ8fChSLnJlYWxFbnRyeVBhZ2VQYXRoPVIucmVhbEVudHJ5UGFnZVBhdGh8fFIuZW50cnlQYWdlUGF0aCksUi5lbnRyeVBhZ2VQYXRoPWUsUi5lbnRyeVBhZ2VRdWVyeT10KX1mdW5jdGlvbiBYdShlLHQpe2xldCBuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaG8oZSkpKTtyZXR1cm4gbi5tZXRhPWlsKG4ubWV0YSksdCE9PSJwcmVsb2FkUGFnZSImJiFSLnJlYWxFbnRyeVBhZ2VQYXRoJiYodD09PSJyZUxhdW5jaCJ8fGpuKCkubGVuZ3RoPT09MCk/bi5tZXRhLmlzUXVpdD0hMDpuLm1ldGEuaXNUYWJCYXJ8fChuLm1ldGEuaXNRdWl0PSExKSxufWxldCBkcz17fTtmdW5jdGlvbiB2SShlKXtsZXQgdD1PYmplY3Qua2V5cyhkcykuZmluZChuPT5kc1tuXS5pZD09PWUuaWQpO3QmJmRlbGV0ZSBkc1t0XX1mdW5jdGlvbiBtSSh7dXJsOmV9KXtsZXQgdD1kc1tlXTtyZXR1cm4gdCYmKHQuX19wYWdlX18mJmpuKCkuZmluZChuPT5uPT09dC5fX3BhZ2VfXyk/dC5fX3ByZWxvYWRfXz0hMTp0LmNsb3NlKCJub25lIiksZGVsZXRlIGRzW2VdKSx0fWZ1bmN0aW9uIF9JKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe2lmKCFkc1tlXSl7bGV0IHI9WHUodCwicHJlbG9hZFBhZ2UiKTtkc1tlXT1DZyh7cGF0aDp0LHJvdXRlT3B0aW9uczpyLHF1ZXJ5Om4sd2Vidmlld0V4dHJhczp7X19wcmVsb2FkX186ITB9fSl9cmV0dXJuIGRzW2VdfWZ1bmN0aW9uIHl1KHt1cmw6ZSxwYXRoOnQscXVlcnk6bixvcGVuVHlwZTpyLHdlYnZpZXc6cyxudnVlUGFnZVZtOnUsZXZlbnRDaGFubmVsOmd9KXtpZihzJiZNZygpLGRzW2VdKXtzPWRzW2VdO2xldCBQZT1zO2lmKFBlLl9fcGFnZV9fKWlmKGpuKCkuZmluZChSZT0+UmU9PT1QZS5fX3BhZ2VfXykpcz12b2lkIDA7ZWxzZSByZXR1cm4gZyYmKFBlLl9fcGFnZV9fLiRwYWdlLmV2ZW50Q2hhbm5lbD1nKSxyPT09ImxhdW5jaCI/YkkoZSx0LG4sUGUsdSxnKTpEYShQZS5fX3BhZ2VfXyksUGV9bGV0IEU9WHUodCxyKTtzPyhzPWwud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChzLmlkKSxzLm52dWU9RS5tZXRhLmlzTlZ1ZSk6cz1DZyh7cGF0aDp0LHJvdXRlT3B0aW9uczpFLHF1ZXJ5Om59KSxFLm1ldGEuaWQ9cGFyc2VJbnQocy5pZCksISFFLm1ldGEuaXNUYWJCYXImJk1pLmFwcGVuZChzKSxxVChzLHQsbixFLm1ldGEpO2xldCBQPXQuc2xpY2UoMSk7cy5fX3VuaWFwcF9yb3V0ZT1QO2xldCBMPWthKHIsZSxuLEUubWV0YSxnLFIuZGFya21vZGU/bC5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpLE9lPXBhcnNlSW50KHMuaWQpO3JldHVybiBzLm52dWU/dT9FSShPZSx1LEwpOkRnKE9lLHMsTCk6cEkoT2UsUCxuLEwseUkoRSkpLHN9ZnVuY3Rpb24gYkkoZSx0LG4scixzLHUpe2xldCBnPVh1KHQsInByZWxvYWRQYWdlIik7Zy5tZXRhLmlkPXBhcnNlSW50KHIuaWQpO2xldCBFPWthKCJwcmVsb2FkUGFnZSIsZSxuLGcubWV0YSx1LFIuZGFya21vZGU/bC5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpO0N0KHMsRSksci5fX3BhZ2VfXz1zfWZ1bmN0aW9uIHlJKHttZXRhOmV9KXtsZXQgdD16ZigpLHtwbGF0Zm9ybTpuLHBpeGVsUmF0aW86cix3aW5kb3dXaWR0aDpzfT13bygpO3JldHVybntjc3M6ITAscm91dGU6ZS5yb3V0ZSx2ZXJzaW9uOjEsbG9jYWxlOiIiLHBsYXRmb3JtOm4scGl4ZWxSYXRpbzpyLHdpbmRvd1dpZHRoOnMsZGlzYWJsZVNjcm9sbDplLmRpc2FibGVTY3JvbGw9PT0hMCxvblBhZ2VTY3JvbGw6ITEsb25QYWdlUmVhY2hCb3R0b206ITEsb25SZWFjaEJvdHRvbURpc3RhbmNlOkouaGFzT3duKGUsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP2Uub25SZWFjaEJvdHRvbURpc3RhbmNlOnJlLk9OX1JFQUNIX0JPVFRPTV9ESVNUQU5DRSxzdGF0dXNiYXJIZWlnaHQ6dCx3aW5kb3dUb3A6ZS5uYXZpZ2F0aW9uQmFyLnR5cGU9PT0iZmxvYXQiP3QrcmUuTkFWQkFSX0hFSUdIVDowLHdpbmRvd0JvdHRvbTpNaS5pbmRleE9mKGUucm91dGUpPj0wJiZNaS5jb3Zlcj9NaS5oZWlnaHQ6MH19ZnVuY3Rpb24gRUkoZSx0LG4pe0N0KHQsbiksRGEoUmcoZSx0LG4pKSxlPT09MSYmKFIuc3BsYXNoc2NyZWVuJiZSLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiFSLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZsLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLFIub25SZWFkeShmdW5jdGlvbigpe0lnKCl9KSl9ZnVuY3Rpb24gRGcoZSx0LG4pe2xldCByPXskOnt9LCRnZXRBcHBXZWJ2aWV3KCl7cmV0dXJuIHR9LGdldE9wZW5lckV2ZW50Q2hhbm5lbCgpe3JldHVybiBuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyByZS5FdmVudENoYW5uZWwoZSkpLG4uZXZlbnRDaGFubmVsfSxfX3NldHVwKHMsdSl7cy4kZ2V0QXBwV2Vidmlldz0oKT0+dCxzLmdldE9wZW5lckV2ZW50Q2hhbm5lbD11LmdldE9wZW5lckV2ZW50Q2hhbm5lbCxDdChzLG4pLHQuX19wcmVsb2FkX18mJih0Ll9fcGFnZV9fPXMpO2xldCBnPXRyKCksRT1nLmZpbmRJbmRleChVPT5VPT09dSk7RT4tMSYmZy5zcGxpY2UoRSwxLHMpfX07Q3QocixuKSx0Ll9fcHJlbG9hZF9fPyh0Ll9fcGFnZV9fPXIsdC5hZGRFdmVudExpc3RlbmVyKCJzaG93IiwoKT0+e3puKHQuX19wYWdlX18scmUuT05fU0hPVyl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLCgpPT57em4odC5fX3BhZ2VfXyxyZS5PTl9ISURFKX0pKTpEYShyKX1sZXQgTGc9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyLGV2ZW50czpzLGFuaW1hdGlvblR5cGU6dSxhbmltYXRpb25EdXJhdGlvbjpnfT1lLHtwYXRoOkUscXVlcnk6VX09cmUucGFyc2VVcmwociksW1AsTF09Q0koRSx1LGcpO3F1KEUsKCk9PntTSSh7dXJsOnIscGF0aDpFLHF1ZXJ5OlUsZXZlbnRzOnMsYW5pVHlwZTpQLGFuaUR1cmF0aW9uOkx9KS50aGVuKHQpLmNhdGNoKG4pfSxlLm9wZW5UeXBlPT09ImFwcExhdW5jaCIpfSx3ST1rZShEZixMZyxwRSxFRSk7ZnVuY3Rpb24gU0koe3VybDplLHBhdGg6dCxxdWVyeTpuLGV2ZW50czpyLGFuaVR5cGU6cyxhbmlEdXJhdGlvbjp1fSl7em4ocmUuT05fSElERSk7bGV0IGc9bmV3IHJlLkV2ZW50Q2hhbm5lbCh2ZygpKzEscik7cmV0dXJuIG5ldyBQcm9taXNlKEU9PntLdSh5dSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6Im5hdmlnYXRlVG8iLGV2ZW50Q2hhbm5lbDpnfSkscyx1LCgpPT57RSh7ZXZlbnRDaGFubmVsOmd9KX0pLERzKCl9KX1mdW5jdGlvbiBDSShlLHQsbil7bGV0e2dsb2JhbFN0eWxlOnJ9PVIscz1KYShlKTtyZXR1cm5bdHx8cy5hbmltYXRpb25UeXBlfHxyLmFuaW1hdGlvblR5cGV8fGJULG58fHMuYW5pbWF0aW9uRHVyYXRpb258fHIuYW5pbWF0aW9uRHVyYXRpb258fFl1XX1sZXQgT0k9a2UoTGYsKHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTpzfT1yZS5wYXJzZVVybChlKTtxdShyLCgpPT57QUkoe3VybDplLHBhdGg6cixxdWVyeTpzfSkudGhlbih0KS5jYXRjaChuKX0pfSx2RSx3RSk7ZnVuY3Rpb24gQUkoe3VybDplLHBhdGg6dCxxdWVyeTpufSl7bGV0IHI9RHIoKTtyZXR1cm4gciYmRm8ociksbmV3IFByb21pc2Uocz0+e0t1KHl1KHt1cmw6ZSxwYXRoOnQscXVlcnk6bixvcGVuVHlwZToicmVkaXJlY3RUbyJ9KSwibm9uZSIsMCwoKT0+e2lmKHIpe2xldCB1PXIuJGdldEFwcFdlYnZpZXcoKTt1Ll9fcHJlbG9hZF9fJiZ2SSh1KSx1LmNsb3NlKCJub25lIil9cyh2b2lkIDApfSksRHMoKX0pfWxldCBUST0oe3VybDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXR7cGF0aDpyLHF1ZXJ5OnN9PXJlLnBhcnNlVXJsKGUpO3F1KHIsKCk9PntJSSh7dXJsOmUscGF0aDpyLHF1ZXJ5OnN9KS50aGVuKHQpLmNhdGNoKG4pfSl9O2Z1bmN0aW9uIElJKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe3JldHVybiBuZXcgUHJvbWlzZShyPT57bGV0IHM9dHIoKS5zbGljZSgwKTtXZS5maW5kKGc9PmcucGF0aD09PXQpLm1ldGEuaXNUYWJCYXImJk1pLnN3aXRjaFRhYih0LnNsaWNlKDEpKSxLdSh5dSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLCgpPT57cy5mb3JFYWNoKGc9PlRnKGcsIm5vbmUiKSkscih2b2lkIDApfSksRHMoKX0pfWxldCBQST1rZShHaCxUSSxtRSxTRSksRmc9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyfT1lLHtwYXRoOnMscXVlcnk6dX09cmUucGFyc2VVcmwocik7cXUocywoKT0+e2tJKHt1cmw6cixwYXRoOnMscXVlcnk6dX0pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LE5JPWtlKFJ1LEZnLF9FLENFKTtmdW5jdGlvbiBrSSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtNaS5zd2l0Y2hUYWIodC5zbGljZSgxKSk7bGV0IHI9am4oKSxzPXIubGVuZ3RoLHU9ITEsZz0hMSxFO3M+PTEmJihFPXJbcy0xXSxFJiYhRS4kLl9faXNUYWJCYXI/KGc9ITAsci5yZXZlcnNlKCkuZm9yRWFjaChQPT57IVAuJC5fX2lzVGFiQmFyJiZQIT09RSYmVGcoUCwibm9uZSIpfSksRm8oRSksaygoKT0+e0UuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/S2woRS4kZ2V0QXBwV2VidmlldygpLGhnLFl1KTpLbChFLiRnZXRBcHBXZWJ2aWV3KCksImF1dG8iKX0sMTAwKSk6dT0hMCk7bGV0IFU7cmV0dXJuIHRyKCkuZm9yRWFjaChQPT57cmUuYWRkTGVhZGluZ1NsYXNoKFAucm91dGUpPT09dD8oUC4kLl9faXNBY3RpdmV8fChnPSEwKSxQLiQuX19pc0FjdGl2ZT0hMCxVPVApOlAuJC5fX2lzVGFiQmFyJiYoUC4kLl9faXNBY3RpdmU9ITEpfSksRT09PVUmJih1PSExKSxFJiZ1JiZ6bihFLHJlLk9OX0hJREUpLG5ldyBQcm9taXNlKFA9PntpZihVKXtsZXQgTD1VLiRnZXRBcHBXZWJ2aWV3KCk7TC5zaG93KCJub25lIiksZyYmIUwuX19wcmVsb2FkX18mJnpuKFUscmUuT05fU0hPVyksRHMoKSxQKHZvaWQgMCl9ZWxzZSBLdSh5dSh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InN3aXRjaFRhYiJ9KSwibm9uZSIsMCwoKT0+e0RzKCksUCh2b2lkIDApfSw3MCl9KX1sZXQgUkk9RHQoWWgsKHt1cmw6ZX0pPT57bGV0IHQ9bUkoe3VybDplfSk7cmV0dXJuIHQ/e2lkOnQuaWQsdXJsOmUsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDplLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSx5RSkseEk9a2UoRmYsKHt1cmw6ZX0se3Jlc29sdmU6dH0pPT57aWYoZHNbZV0pcmV0dXJuO2xldCBuPWUuc3BsaXQoIj8iKSxyPW5bMF0scz1yZS5wYXJzZVF1ZXJ5KG5bMV18fCIiKSx1PV9JKHt1cmw6ZSxwYXRoOnIscXVlcnk6c30pLGc9WHUociwicHJlbG9hZFBhZ2UiKTtnLm1ldGEuaWQ9cGFyc2VJbnQodS5pZCk7bGV0IEU9a2EoInByZWxvYWRQYWdlIixlLHMsZy5tZXRhLHZvaWQgMCxSLmRhcmttb2RlP2wubmF2aWdhdG9yLmdldFVJU3R5bGUoKToibGlnaHQiKTtEZyhwYXJzZUludCh1LmlkKSx1LEUpLHQoe2lkOnUuaWQsdXJsOmUsZXJyTXNnOiJwcmVsb2FkUGFnZTpvayJ9KX0sYkUpO3ZhciBCST17X19wcm90b19fOm51bGwsJGVtaXQ6cW0sJG9mZjpZbSwkb246V20sJG9uY2U6R20sX19sb2dfXzpaQSxhZGRJbnRlcmNlcHRvcjpNbSxhZGRQaG9uZUNvbnRhY3Q6d0MsYXJyYXlCdWZmZXJUb0Jhc2U2NDpIaSxiYXNlNjRUb0FycmF5QnVmZmVyOlhvLGNhbklVc2U6SVMsY2FudmFzR2V0SW1hZ2VEYXRhOndfLGNhbnZhc1B1dEltYWdlRGF0YTpTXyxjYW52YXNUb1RlbXBGaWxlUGF0aDpDXyxjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOklDLGNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpUQyxjaG9vc2VJbWFnZTpLQyxjaG9vc2VMb2NhdGlvbjpxTyxjaG9vc2VWaWRlbzpaQyxjbGVhclN0b3JhZ2U6Z1MsY2xlYXJTdG9yYWdlU3luYzpwUyxjbG9zZUF1dGhWaWV3OktwLGNsb3NlQkxFQ29ubmVjdGlvbjphQyxjbG9zZUJsdWV0b290aEFkYXB0ZXI6UVMsY2xvc2VQcmV2aWV3SW1hZ2U6JEMsY2xvc2VTb2NrZXQ6cE8sY29tcHJlc3NJbWFnZTpZQyxjb21wcmVzc1ZpZGVvOnFDLGNvbmZpZ01UTFM6bE8sY29ubmVjdFNvY2tldDpkTyxjcmVhdGVBbmltYXRpb246al8sY3JlYXRlQkxFQ29ubmVjdGlvbjpvQyxjcmVhdGVDYW52YXNDb250ZXh0OkVfLGNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkOmhULGNyZWF0ZUlubmVyQXVkaW9Db250ZXh0Ok5PLGNyZWF0ZUludGVyYWN0aXZlQWQ6X1QsY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6UF8sY3JlYXRlSW50ZXJzdGl0aWFsQWQ6Z1QsY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6ek8sY3JlYXRlTWFwQ29udGV4dDphXyxjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI6a18sY3JlYXRlUHVzaE1lc3NhZ2U6JEEsY3JlYXRlUmV3YXJkZWRWaWRlb0FkOmZULGNyZWF0ZVNlbGVjdG9yUXVlcnk6TF8sY3JlYXRlVmlkZW9Db250ZXh0OmlfLGRvd25sb2FkRmlsZTpyTyxnZXRBcHBBdXRob3JpemVTZXR0aW5nOklwLGdldEFwcEJhc2VJbmZvOmhwLGdldEJMRURldmljZUNoYXJhY3RlcmlzdGljczpsQyxnZXRCTEVEZXZpY2VSU1NJOmhDLGdldEJMRURldmljZVNlcnZpY2VzOnNDLGdldEJhY2tncm91bmRBdWRpb01hbmFnZXI6JE8sZ2V0QmVhY29uczp2QyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6ZUMsZ2V0Qmx1ZXRvb3RoRGV2aWNlczpyQyxnZXRDaGVja0JveFN0YXRlOlpwLGdldENsaXBib2FyZERhdGE6U0MsZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczppQyxnZXREZXZpY2VJbmZvOmRwLGdldEVudGVyT3B0aW9uc1N5bmM6ZmIsZ2V0RmlsZUluZm86bVMsZ2V0SW1hZ2VJbmZvOkZDLGdldExhdW5jaE9wdGlvbnNTeW5jOmRiLGdldExvY2FsZTpvdSxnZXRMb2NhdGlvbjpZTyxnZXROZXR3b3JrVHlwZTp3cCxnZXRQcm92aWRlcjpNQSxnZXRQdXNoQ2xpZW50SWQ6aGIsZ2V0UmVjb3JkZXJNYW5hZ2VyOnpDLGdldFNhdmVkRmlsZUluZm86T1MsZ2V0U2F2ZWRGaWxlTGlzdDpDUyxnZXRTY3JlZW5CcmlnaHRuZXNzOnhDLGdldFNlbGVjdGVkVGV4dFJhbmdlOlFfLGdldFN0b3JhZ2U6ZlMsZ2V0U3RvcmFnZUluZm86dlMsZ2V0U3RvcmFnZUluZm9TeW5jOmVwLGdldFN0b3JhZ2VTeW5jOnVTLGdldFN1Yk5WdWVCeUlkOmtBLGdldFN5c3RlbUluZm86JFMsZ2V0U3lzdGVtSW5mb1N5bmM6cHAsZ2V0U3lzdGVtU2V0dGluZzpEQyxnZXRVbml2ZXJpZnlNYW5hZ2VyOlVBLGdldFVzZXJJbmZvOkRBLGdldFVzZXJQcm9maWxlOkxBLGdldFZpZGVvSW5mbzpWQyxnZXRXaW5kb3dJbmZvOmZwLGhpZGVLZXlib2FyZDpRQyxoaWRlTG9hZGluZzpsQSxoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmc6Z0EsaGlkZVRhYkJhcjpFQSxoaWRlVGFiQmFyUmVkRG90Ok9BLGhpZGVUb2FzdDpzQSxpbml0VVRTQ2xhc3NOYW1lOmNnLGluaXRVVFNJbmRleENsYXNzTmFtZTphVCxpbml0VVRTUGFja2FnZU5hbWU6b1QsaW5pdFVUU1Byb3h5Q2xhc3M6bGcsaW5pdFVUU1Byb3h5RnVuY3Rpb246clQsaW50ZXJjZXB0b3JzOkxtLGludm9rZVB1c2hDYWxsYmFjazpCZixsb2FkRm9udEZhY2U6ZkEsbG9naW46R3AsbWFrZVBob25lQ2FsbDpiQyxuYXZpZ2F0ZUJhY2s6S1QsbmF2aWdhdGVUbzp3SSxuYXZpZ2F0ZVRvTWluaVByb2dyYW06cUEsbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpjQyxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOllTLG9mZkFwcEhpZGU6dWIsb2ZmQXBwU2hvdzpsYixvZmZDb21wYXNzQ2hhbmdlOmpTLG9mZkVycm9yOmFiLG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOnRPLG9mZkxvY2F0aW9uQ2hhbmdlOlFPLG9mZkxvY2F0aW9uQ2hhbmdlRXJyb3I6dEEsb2ZmTmV0d29ya1N0YXR1c0NoYW5nZTpBQyxvZmZQYWdlTm90Rm91bmQ6aWIsb2ZmUHVzaE1lc3NhZ2U6Z2Isb2ZmVGhlbWVDaGFuZ2U6UkMsb2ZmVW5oYW5kbGVkUmVqZWN0aW9uOm5iLG9mZldpbmRvd1Jlc2l6ZTpxXyxvbkFjY2VsZXJvbWV0ZXJDaGFuZ2U6R1Msb25BcHBIaWRlOmNiLG9uQXBwU2hvdzpzYixvbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2U6WlMsb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6S1Msb25CZWFjb25TZXJ2aWNlQ2hhbmdlOmdDLG9uQmVhY29uVXBkYXRlOnBDLG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlOkpTLG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6cVMsb25Db21wYXNzQ2hhbmdlOkhTLG9uQ3JlYXRlVnVlQXBwOnJlLm9uQ3JlYXRlVnVlQXBwLG9uRXJyb3I6b2Isb25Ib3N0RXZlbnRSZWNlaXZlOnRnLG9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6ZU8sb25Mb2NhbGVDaGFuZ2U6S18sb25Mb2NhdGlvbkNoYW5nZTpYTyxvbkxvY2F0aW9uQ2hhbmdlRXJyb3I6ZUEsb25OYXRpdmVFdmVudFJlY2VpdmU6SkEsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOk9DLG9uUGFnZU5vdEZvdW5kOnJiLG9uUHVzaE1lc3NhZ2U6cGIsb25Tb2NrZXRDbG9zZTpfTyxvblNvY2tldEVycm9yOnZPLG9uU29ja2V0TWVzc2FnZTptTyxvblNvY2tldE9wZW46Z08sb25UYWJCYXJNaWRCdXR0b25UYXA6el8sb25UaGVtZUNoYW5nZTprQyxvblVuaGFuZGxlZFJlamVjdGlvbjp0YixvbldpbmRvd1Jlc2l6ZTpZXyxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpMQyxvcGVuQmx1ZXRvb3RoQWRhcHRlcjpYUyxvcGVuRG9jdW1lbnQ6VFMsb3BlbkxvY2F0aW9uOkpPLHBhZ2VTY3JvbGxUbzpkQSxwcmVMb2dpbjpxcCxwcmVsb2FkUGFnZTp4SSxwcmV2aWV3SW1hZ2U6VUMscmVMYXVuY2g6UEkscmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWU6dUMscmVkaXJlY3RUbzpPSSxyZWdpc3RlclJ1bnRpbWU6SEEscmVnaXN0ZXJVVFNJbnRlcmZhY2U6c1QscmVnaXN0ZXJVVFNQbHVnaW46bFQscmVtb3ZlSW50ZXJjZXB0b3I6RG0scmVtb3ZlU2F2ZWRGaWxlOkFTLHJlbW92ZVN0b3JhZ2U6aFMscmVtb3ZlU3RvcmFnZVN5bmM6ZFMscmVtb3ZlVGFiQmFyQmFkZ2U6Q0EscmVxdWVzdDpzTyxyZXF1ZXN0UGF5bWVudDpZQSxyZXF1aXJlR2xvYmFsOnhBLHJlcXVpcmVOYXRpdmVQbHVnaW46T2EscmVxdWlyZVVUU1BsdWdpbjpjVCxyZXN0b3JlR2xvYmFsOlJBLHNhdmVGaWxlOkVTLHNhdmVJbWFnZVRvUGhvdG9zQWxidW06R0Msc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpXQyxzY2FuQ29kZTpOQyxzZW5kSG9zdEV2ZW50OlFwLHNlbmROYXRpdmVFdmVudDpicCxzZW5kU29ja2V0TWVzc2FnZTpoTyxzZXRCTEVNVFU6ZEMsc2V0Q2xpcGJvYXJkRGF0YTpDQyxzZXRLZWVwU2NyZWVuT246TUMsc2V0TG9jYWxlOlpfLHNldE5hdmlnYXRpb25CYXJDb2xvcjptQSxzZXROYXZpZ2F0aW9uQmFyVGl0bGU6aEEsc2V0UGFnZU1ldGE6WF8sc2V0U2NyZWVuQnJpZ2h0bmVzczpCQyxzZXRTdG9yYWdlOmNTLHNldFN0b3JhZ2VTeW5jOmxTLHNldFRhYkJhckJhZGdlOl9BLHNldFRhYkJhckl0ZW06YkEsc2V0VGFiQmFyU3R5bGU6eUEsc2hhcmU6V0Esc2hhcmVXaXRoU3lzdGVtOkdBLHNob3dBY3Rpb25TaGVldDppQSxzaG93S2V5Ym9hcmQ6WEMsc2hvd0xvYWRpbmc6b0Esc2hvd01vZGFsOm5BLHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpwQSxzaG93VGFiQmFyOndBLHNob3dUYWJCYXJSZWREb3Q6U0Esc2hvd1RvYXN0OmFBLHN0YXJ0QWNjZWxlcm9tZXRlcjptcCxzdGFydEJlYWNvbkRpc2NvdmVyeTptQyxzdGFydEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6dEMsc3RhcnRDb21wYXNzOmdwLHN0YXJ0TG9jYXRpb25VcGRhdGU6S08sc3RhcnRQdWxsRG93blJlZnJlc2g6Y0Esc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOlBDLHN0b3BBY2NlbGVyb21ldGVyOl9wLHN0b3BCZWFjb25EaXNjb3Zlcnk6X0Msc3RvcEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6bkMsc3RvcENvbXBhc3M6dnAsc3RvcExvY2F0aW9uVXBkYXRlOlpPLHN0b3BQdWxsRG93blJlZnJlc2g6dUEsc3dpdGNoVGFiOk5JLHN5bmNEYXRhVG9HbG9iYWw6QkEsdW5QcmVsb2FkUGFnZTpSSSx1cGxvYWRGaWxlOnlPLHVweDJweDpQbSx2aWJyYXRlTG9uZzpXUyx2aWJyYXRlU2hvcnQ6elMsd2VleEdldFN5c3RlbUluZm9TeW5jOmh1LHdyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpmQ307bGV0IE1JPUouZXh0ZW5kKEgse3B1Ymxpc2hIYW5kbGVyOkRJfSk7ZnVuY3Rpb24gREkoZSx0LG4pe3Q9SlNPTi5zdHJpbmdpZnkodCksSi5pc0FycmF5KG4pfHwobj1bbl0pO2xldCByPWB0eXBlb2YgVW5pVmlld0pTQnJpZGdlICE9PSAndW5kZWZpbmVkJyAmJiBVbmlWaWV3SlNCcmlkZ2Uuc3Vic2NyaWJlSGFuZGxlcigiJHtlfSIsJHt0fSxfX1BBR0VfSURfXylgO24uZm9yRWFjaChzPT57bGV0IHU9U3RyaW5nKHMpLGc9bC53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHUpO2cmJmcuZXZhbEpTKHIucmVwbGFjZSgiX19QQUdFX0lEX18iLHUpKX0pfWZ1bmN0aW9uIExJKCl7bGV0e3RhYkJhcjplfT1SO2lmKCEoZSYmZS5saXN0JiZlLmxpc3QubGVuZ3RoKSlyZXR1cm47bGV0e2VudHJ5UGFnZVBhdGg6bn09UjtlLnNlbGVjdGVkSW5kZXg9MDtsZXQgcj1lLmxpc3QuZmluZEluZGV4KHM9PnMucGFnZVBhdGg9PT1uKTtNaS5pbml0KGUsKHMsdSk9PntPLnN3aXRjaFRhYih7dXJsOnJlLmFkZExlYWRpbmdTbGFzaChzLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXt6bihyZS5PTl9UQUJfSVRFTV9UQVAse2luZGV4OnUsdGV4dDpzLnRleHQscGFnZVBhdGg6cy5wYWdlUGF0aH0pfX0pfSksciE9PS0xJiYoZS5zZWxlY3RlZEluZGV4PXIsciE9PTAmJk1pLnN3aXRjaFRhYihuKSl9ZnVuY3Rpb24gRkkoKXtsZXQgZT1sLmdsb2JhbEV2ZW50LHQ9di5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLHtlbWl0Om4scHVibGlzaEhhbmRsZXI6cn09X3Q7di5jb25maWcucHJlbG9hZD9sLmtleS5hZGRFdmVudExpc3RlbmVyKEVhLExhKTplLmFkZEV2ZW50TGlzdGVuZXIoInNwbGFzaGNsb3NlZCIsKCk9PntsLmtleS5hZGRFdmVudExpc3RlbmVyKEVhLExhKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicGF1c2UiLCgpPT57bihyZS5PTl9BUFBfRU5URVJfQkFDS0dST1VORCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInJlc3VtZSIsKCk9PntsZXQgdT1SbCgpO3UmJnUudXNlckFjdGlvbiYmU3ModSksbihyZS5PTl9BUFBfRU5URVJfRk9SRUdST1VORCxVbygpKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidWlzdHlsZWNoYW5nZSIsZnVuY3Rpb24odSl7bGV0IGc9e3RoZW1lOnUudWlzdHlsZX07bihyZS5PTl9USEVNRV9DSEFOR0UsZykscihyZS5PTl9USEVNRV9DSEFOR0UsZyxOYSgpKSxSUygpfSk7bGV0IHM9MDtlLmFkZEV2ZW50TGlzdGVuZXIoIktleWJvYXJkSGVpZ2h0Q2hhbmdlIixmdW5jdGlvbih1KXtzIT09dS5oZWlnaHQmJihzPXUuaGVpZ2h0LG4ocmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx7aGVpZ2h0OnN9KSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIod1QsZnVuY3Rpb24odSl7dSYmdS5ldmVudCYmS0EodS5ldmVudCx1LmRhdGEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsVmcpLGUuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixWZyl9ZnVuY3Rpb24gVmcoe2RhdGE6ZX0pe2UmJmUudHlwZSYmX3Quc3Vic2NyaWJlSGFuZGxlcigicGx1c01lc3NhZ2UuIitlLnR5cGUsZS5hcmdzKX1mdW5jdGlvbiBVZyhlLHQsbj0hMSl7X3Quc3Vic2NyaWJlKCJwbHVzTWVzc2FnZS4iK2UsdCxuKX1mdW5jdGlvbiBWSShlKXtlYihlLiQpO2xldHtlbnRyeVBhZ2VQYXRoOnQsZW50cnlQYWdlUXVlcnk6bixyZWZlcnJlckluZm86cn09UixzPVphKHtwYXRoOnQscXVlcnk6bixyZWZlcnJlckluZm86cn0pO3puKGUscmUuT05fTEFVTkNILHMpLHpuKGUscmUuT05fU0hPVyxzKTtsZXQgdT12LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBTdGF0ZTsodSYmTnVtYmVyKHUoKSkpPT09MiYmem4oZSxyZS5PTl9ISURFLHMpfWZ1bmN0aW9uICRnKGUpe3JldHVybiBlPWUucmVwbGFjZSgvXC8kLywiIiksZS5pbmRleE9mKCJfIik9PT0wP2wuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfWZ1bmN0aW9uIFVJKCl7bGV0IGU9JGcoenMpLHQ9JGcobmkpLG49dC5zcGxpdCgiLyIpO24ucG9wKCk7bGV0IHI9bi5qb2luKCIvIik7bC5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGwuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxzPT57cy5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihnKXtsZXQgRT1nO0UmJkUubGVuZ3RoJiZFLmZvckVhY2goZnVuY3Rpb24oVSl7VS5pc0RpcmVjdG9yeSYmVS5mdWxsUGF0aC5pbmRleE9mKGUpPT09MCYmVS5mdWxsUGF0aC5pbmRleE9mKHQpIT09MCYmVS5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWxldCBIZz0wLE1jPTAsUXU9bnVsbCxabD1udWxsO2Z1bmN0aW9uICRJKGUsdCl7aWYoUXU9bnVsbCxabCYmKEMoWmwpLFpsPW51bGwpLGUudHlwZT09PSJvbkZvY3VzIilpZihNYz4wKWUuZGV0YWlsLmhlaWdodD1NYztlbHNle1psPWsoZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9TWMsdChlKX0sSGcpLFF1PWZ1bmN0aW9uKCl7WmwmJihDKFpsKSxabD1udWxsKSxlLmRldGFpbC5oZWlnaHQ9TWMsdChlKX07cmV0dXJufXQoZSl9ZnVuY3Rpb24gSEkoKXtIZz1sLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIj8zMDA6NzAwLF90Lm9uKHJlLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsdD0+e2lmKE1jPXQuaGVpZ2h0LE1jPjApe2xldCBuPVF1O1F1PW51bGwsbiYmbigpfX0pfWZ1bmN0aW9uIGpJKGUsdCxuKXtsZXQgcj10LnR5cGU7cj09PSJvbkZvY3VzInx8cj09PSJvbkJsdXIiPyRJKHQscz0+e24uZmlyZUV2ZW50KGUscyl9KTpuLmZpcmVFdmVudChlLHQpfWZ1bmN0aW9uIHpJKGUsdCl7bGV0IG49aWEocGFyc2VJbnQodCkpO2lmKCFuKXJldHVybjtsZXQgcj1uLl9fcGFnZV9jb250YWluZXJfXztlLmZvckVhY2gocz0+e3N3aXRjaChzWzBdKXtjYXNlIHJlLkFDVElPTl9UWVBFX0VWRU5UOmpJKHNbMV0sc1syXSxyKTticmVha319KX1sZXQgamc9e307ZnVuY3Rpb24gV0koZSx0LG4pe2xldHthZHBpZDpyLHdpZHRoOnN9PWUsdT1yKyItIitzLGc9amdbdV07aWYoZyYmZy5sZW5ndGg+MCl7dChnLnNwbGljZSgwLDEpWzBdKTtyZXR1cm59bC5hZC5nZXRBZHMoZSxFPT57bGV0IFU9RS5hZHM7dChVLnNwbGljZSgwLDEpWzBdKSxqZ1t1XT1nP2cuY29uY2F0KFUpOlV9LEU9PntuKHtlcnJDb2RlOkUuY29kZSxlcnJNc2c6RS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBHSSgpe00oImdldEFkRGF0YSIsKGUsdCk9PntXSShlLG49Pnt0KHtjb2RlOjAsZGF0YTpufSl9LG49Pnt0KHtjb2RlOjEsbWVzc2FnZTpufSl9KX0pfWxldCBZST1bInN3aXRjaFRhYiIsInJlTGF1bmNoIiwicmVkaXJlY3RUbyIsIm5hdmlnYXRlVG8iLCJuYXZpZ2F0ZUJhY2siXTtmdW5jdGlvbiBxSSgpe1lJLmZvckVhY2goZT0+e00oZSx0PT57T1tlXShKLmV4dGVuZCh0LHtmYWlsKG4pe2NvbnNvbGUuZXJyb3Iobi5lcnJNc2cpfX0pKX0pfSl9bGV0IHpnPSExO2Z1bmN0aW9uIEpJKGUsdCl7bGV0IG49dD09PSIxIjtpZighKG4mJnpnKSl7aWYobj8oemc9ITAseWcobC53ZWJ2aWV3LmdldExhdW5jaFdlYnZpZXcoKSkpOmdvfHx5ZyhsLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLCFnby5sb2FkZWQpe2lmKGdvLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcihgd2Vidmlld1JlYWR5WyR7Z28uaWR9XVske3R9XSBub3QgbWF0Y2hgKTtnby5sb2FkZWQ9ITB9X3QuZW1pdChCYysiLiIrdCksbiYmS0koKX19ZnVuY3Rpb24gS0koKXtsZXR7YXV0b2Nsb3NlOmUsYWx3YXlzU2hvd0JlZm9yZVJlbmRlcjp0fT1SLnNwbGFzaHNjcmVlbjtlJiYhdCYmbC5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKTtsZXQgbj1yZS5hZGRMZWFkaW5nU2xhc2goUi5lbnRyeVBhZ2VQYXRoKSxyPWhvKG4pO2lmKCFyLm1ldGEuaXNOVnVlKXtsZXQgcz17dXJsOm4rKFIuZW50cnlQYWdlUXVlcnl8fCIiKSxvcGVuVHlwZToiYXBwTGF1bmNoIn0sdT17cmVzb2x2ZSgpe30scmVqZWN0KCl7fX07cmV0dXJuIHIubWV0YS5pc1RhYkJhcj9GZyhzLHUpOkxnKHMsdSl9fWZ1bmN0aW9uIFpJKGUsdCl7bGV0IG49aWEocGFyc2VJbnQodCkpO24mJihuLl9fdW5pYXBwX3dlYnZpZXc9ITApfWZ1bmN0aW9uIFhJKGUsdCl7bGV0IG49aWEocGFyc2VJbnQodCkpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9bGV0IFFJPSh7bmFtZTplLGFyZzp0fSxuKT0+e2U9PT0icG9zdE1lc3NhZ2UiP2VQKG5bMF0sdCk6T1tlXShKLmV4dGVuZCh0LHtmYWlsKHIpe2NvbnNvbGUuZXJyb3Ioci5lcnJNc2cpfX0pKX07ZnVuY3Rpb24gZVAoZSx0KXtsZXQgbj10SSgid2ViLXZpZXciLHBhcnNlSW50KGUpKTtuJiZuLmRpc3BhdGNoRXZlbnQocmUuY3JlYXRlVW5pRXZlbnQoe3R5cGU6Im9uTWVzc2FnZSIsdGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksY3VycmVudFRhcmdldDpPYmplY3QuY3JlYXRlKG51bGwpLGRldGFpbDp7ZGF0YTpbdF19fSkpfWZ1bmN0aW9uIHRQKHtub2RlSWQ6ZSxvd25lcklkOnQsbWV0aG9kOm4sYXJnczpyfSxzKXtsZXQgdT1QZyhlLHBhcnNlSW50KHMpKTtpZighdSlyZXR1cm47bGV0IGc9blAodCx1Ll9fdnVlUGFyZW50Q29tcG9uZW50KTshZ3x8IWdbbl18fGdbbl0ocil9ZnVuY3Rpb24gblAoZSx0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LnVpZD09PWUpcmV0dXJuIHQucHJveHk7bGV0IG49dC5wYXJlbnQ7Zm9yKDtuOyl7aWYobi51aWQ9PT1lKXJldHVybiBuLnByb3h5O249bi5wYXJlbnR9cmV0dXJuIHQucHJveHl9ZnVuY3Rpb24gclAoKXtsZXR7c3Vic2NyaWJlOmUsc3Vic2NyaWJlSGFuZGxlcjp0LHB1Ymxpc2hIYW5kbGVyOm59PV90O2lmKFVnKCJzdWJzY3JpYmVIYW5kbGVyIiwoe3R5cGU6cixkYXRhOnMscGFnZUlkOnV9KT0+e3QocixzLHUpfSksVWcocmUuV0VCX0lOVk9LRV9BUFBTRVJWSUNFLCh7ZGF0YTpyLHdlYnZpZXdJZHM6c30pPT57UUkocixzKX0pLFIucmVuZGVyZXIhPT0ibmF0aXZlIil7ZShCYyxKSSksZShqcCx6SSkseSgpLEdJKCkscUkoKSxlKElBLFpJKSxlKFBBLFhJKSxlKHJlLk9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0QsdFApO2xldCByPWhvKHJlLmFkZExlYWRpbmdTbGFzaChSLmVudHJ5UGFnZVBhdGgpKTtyJiYhci5tZXRhLmlzTlZ1ZSYmbihCYyx7fSwxKX19bGV0IERjLGFkPXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBpUCh7YWxsb3dEZWZhdWx0OmU9ITF9PXt9KXtpZihEYylyZXR1cm4gRGM7aWYoZSlyZXR1cm4gYWQ7Y29uc29sZS5lcnJvcigiW3dhcm5dOiBnZXRBcHAoKSBmYWlsZWQuIExlYXJuIG1vcmU6IGh0dHBzOi8vdW5pYXBwLmRjbG91ZC5pby9jb2xsb2NhdGlvbi9mcmFtZS93aW5kb3c/aWQ9Z2V0YXBwLiIpfWZ1bmN0aW9uIG9QKGUpe2lmKE8uVnVleCYmZS4kc3RvcmUpe2xldHt1c2VTdG9yZTp0fT1PLlZ1ZXg7Ty5WdWV4LnVzZVN0b3JlPW49Pm4/dChuKTplLiRzdG9yZX15cyhlKSxEYz1lLGJ0KERjKSxKLmV4dGVuZChEYyxhZCksRXQoRGMsYWQuZ2xvYmFsRGF0YSksamUoKSxNZygpLExJKCksRkkoKSxISSgpLHJQKCksVkkoZSksayhVSSwxZTQpLFIucmVhZHk9ITB9dmFyIGFQPXt1bmk6QkksZ2V0QXBwOmlQLGdldEN1cnJlbnRQYWdlczpLYSxfX2RlZmluZVBhZ2U6aEksX19yZWdpc3RlckFwcDpvUCxfX3JlZ2lzdGVyUGFnZTp5dSxVbmlTZXJ2aWNlSlNCcmlkZ2U6TUl9O3JldHVybiBhUH0oUHQsZW4sVCk7Z2U9Z2UuZGVmYXVsdHx8Z2U7bGV0IE89Z2UudW5pLE50PWdlLmdldEFwcCxqbj1nZS5nZXRDdXJyZW50UGFnZXMsX3Q9Z2UuVW5pU2VydmljZUpTQnJpZGdlO3JldHVybiBnZX12YXIgQXY9V04ocU4pO3ZhciBUdj12PT57bGV0e3JlZ2lzdGVyVVRTSW50ZXJmYWNlOmwsaW5pdFVUU1Byb3h5Q2xhc3M6Yixpbml0VVRTUHJveHlGdW5jdGlvbjpULGluaXRVVFNQYWNrYWdlTmFtZTprLGluaXRVVFNJbmRleENsYXNzTmFtZTpDLGluaXRVVFNDbGFzc05hbWU6ZH09dixtPSJEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSIsUj0iRmFjaWFsUmVjb2duaXRpb25WZXJpZnkoXHU1QjlFXHU0RUJBXHU4QkE0XHU4QkMxKSIsV2U9ImJ1aWx0LWluIixQdD0iIixlbj0hMCxnZT1rKG0sZW4pLE89QyhtLGVuKTt2LnN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnk9VCghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6V2UsZXJyTXNnOlB0LG1haW46ITAscGFja2FnZTpnZSxjbGFzczpPLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSx2LmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89VCghMSx7bW9kdWxlTmFtZTpSLG1vZHVsZVR5cGU6V2UsZXJyTXNnOlB0LG1haW46ITAscGFja2FnZTpnZSxjbGFzczpPLG5hbWU6ImdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm9CeUpzIixwYXJhbXM6W10scmV0dXJuOiIifSl9O3ZhciBJdj12PT57fTt2YXIgUHY9dj0+e307dmFyIE52PXY9Pnt9O3ZhciBrdj12PT57fTt2YXIgUnY9dj0+e307dmFyIHh2PXY9Pnt9O3ZhciBCdj12PT57fTt2YXIgTXY9dj0+e307ZnVuY3Rpb24gRHYodil7VHYodiksSXYodiksUHYodiksTnYodiksa3YodiksUnYodikseHYodiksQnYodiksTXYodil9dmFyIEFkLFRkLElkLEZzLFBkLE5kLGtkO2Z1bmN0aW9uIEx2KCl7cmV0dXJuIEZzP3tfX2RlZmluZVBhZ2U6QWQsX19yZWdpc3RlckFwcDpUZCxfX3JlZ2lzdGVyUGFnZTpJZCx1bmk6RnMsd3g6RnMsZ2V0QXBwOlBkLGdldEN1cnJlbnRQYWdlczpOZCxVbmlTZXJ2aWNlSlNCcmlkZ2U6a2R9Ont9fWZ1bmN0aW9uIEZ2KHYpe2xldHt3ZWV4OmwscGx1czpiLFZ1ZVNoYXJlZDpUfT12O3JldHVybiBGc3x8KHtfX2RlZmluZVBhZ2U6QWQsX19yZWdpc3RlckFwcDpUZCxfX3JlZ2lzdGVyUGFnZTpJZCx1bmk6RnMsZ2V0QXBwOlBkLGdldEN1cnJlbnRQYWdlczpOZCxVbmlTZXJ2aWNlSlNCcmlkZ2U6a2R9PU92KGwsYix2KSxGcy5WdWVTaGFyZWQ9VCxEdihGcykscWcoRnMpKSx7X19kZWZpbmVQYWdlOkFkLF9fcmVnaXN0ZXJBcHA6VGQsX19yZWdpc3RlclBhZ2U6SWQscGx1czpiLHVuaTpGcyx3eDpGcyxnZXRBcHA6UGQsZ2V0Q3VycmVudFBhZ2VzOk5kLFVuaVNlcnZpY2VKU0JyaWRnZTprZH19ZnVuY3Rpb24gVnYodixsKXtsZXR7X191bmlDb25maWc6Yn09bDtpZighYilyZXR1cm47bGV0IFQ9bC53ZWV4O1QuZG9jdW1lbnQuX18kYXV0b21hdG9yX189ISFiLmF1dG9tYXRvcjtsZXQgaz1iLnJlbmRlcmVyIT09Im5hdGl2ZSImJlQuY29uZmlnLmJ1bmRsZVVybC5pbmRleE9mKCJhcHAtc2VydmljZS5qcyIpIT09LTE7aWYoRGkobCxMdigpKSxrP0F2KGwpOihYZyh2LGwpLF92KGwuVnVlLnBhcnNlQ2xhc3NTdHlsZXMpKSxEaShsLEZ2KGwpKSxULmNvbmZpZy5wbHVzX3dlYl9pZD09PSIxIil7bGV0IFI9VC5yZXF1aXJlTW9kdWxlKCJwbHVzIik7Ui5zZXREZWZhdWx0Rm9udFNpemUmJlIuc2V0RGVmYXVsdEZvbnRTaXplKE1hdGgucm91bmQobC5wbHVzLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGgvMjApKX1sZXR7c2NhbGU6QyxkZXZpY2VXaWR0aDpkLHBsYXRmb3JtOm19PWdsb2JhbC5XWEVudmlyb25tZW50O2lmKG0udG9Mb3dlckNhc2UoKT09PSJpb3MiKXtsZXQgUj1NYXRoLmNlaWwoZC9DKTtULnJlcXVpcmVNb2R1bGUoIm1ldGEiKS5zZXRWaWV3cG9ydCh7d2lkdGg6Uixyb3VuZE9mZkRldmlhdGlvbjohMX0pfX12YXIgcmM9Y2xhc3MgZXh0ZW5kcyBuY3tjb25zdHJ1Y3RvcihsKXtzdXBlcigpO3RoaXMubm9kZVR5cGU9ODt0aGlzLnR5cGU9ImNvbW1lbnQiO3RoaXMudmFsdWU9IiI7dGhpcy52YWx1ZT1sfXRvU3RyaW5nKCl7cmV0dXJuIjwhLS0gIit0aGlzLnZhbHVlKyIgLS0+In19O2Z1bmN0aW9uIGhhKHYsbD1bXSl7cmV0dXJue21vZHVsZToiZG9tIixtZXRob2Q6dixhcmdzOmx9fXZhciBIYz1jbGFzc3tjb25zdHJ1Y3RvcihsLGIpe3RoaXMuaWQ9bCx0aGlzLmJhdGNoZWQ9ITEsdGhpcy51cGRhdGVzPVtdLEhuKGIpP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoYW5kbGVyIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Yn0pOmNvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBpbnZhbGlkIHBhcmFtZXRlciwgaGFuZGxlciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1jcmVhdGVGaW5pc2gobCl7cmV0dXJuIHRoaXMuaGFuZGxlcihbaGEoImNyZWF0ZUZpbmlzaCIpXSxsKX11cGRhdGVGaW5pc2gobCl7cmV0dXJuIHRoaXMuaGFuZGxlcihbaGEoInVwZGF0ZUZpbmlzaCIpXSxsKX1yZWZyZXNoRmluaXNoKGwpe3JldHVybiB0aGlzLmhhbmRsZXIoW2hhKCJyZWZyZXNoRmluaXNoIildLGwpfWNyZWF0ZUJvZHkobCl7bGV0IGI9bC50b0pTT04oKSxUPWIuY2hpbGRyZW47ZGVsZXRlIGIuY2hpbGRyZW47bGV0IGs9W2hhKCJjcmVhdGVCb2R5IixbYl0pXTtyZXR1cm4gVCYmay5wdXNoLmFwcGx5KGssVC5tYXAoQz0+aGEoImFkZEVsZW1lbnQiLFtiLnJlZixDLC0xXSkpKSx0aGlzLmFkZEFjdGlvbnMoayl9YWRkRWxlbWVudChsLGIsVCl7cmV0dXJuIFQ+PTB8fChUPS0xKSx0aGlzLmFkZEFjdGlvbnMoaGEoImFkZEVsZW1lbnQiLFtiLGwudG9KU09OKCksVF0pKX1yZW1vdmVFbGVtZW50KGwpe2lmKHRvKGwpKXtsZXQgYj1sLm1hcChUPT5oYSgicmVtb3ZlRWxlbWVudCIsW1RdKSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhiKX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGhhKCJyZW1vdmVFbGVtZW50IixbbF0pKX1tb3ZlRWxlbWVudChsLGIsVCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhoYSgibW92ZUVsZW1lbnQiLFtsLGIsVF0pKX1zZXRBdHRyKGwsYixUKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGhhKCJ1cGRhdGVBdHRycyIsW2wse1tiXTpUfV0pKX1zZXRTdHlsZShsLGIsVCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhoYSgidXBkYXRlU3R5bGUiLFtsLHtbYl06VH1dKSl9c2V0U3R5bGVzKGwsYil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhoYSgidXBkYXRlU3R5bGUiLFtsLGJdKSl9YWRkRXZlbnQobCxiKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGhhKCJhZGRFdmVudCIsW2wsYl0pKX1yZW1vdmVFdmVudChsLGIpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoaGEoInJlbW92ZUV2ZW50IixbbCxiXSkpfWhhbmRsZXIobCxiKXtyZXR1cm4gYiYmYigpfWFkZEFjdGlvbnMobCl7bGV0IGI9dGhpcy51cGRhdGVzLFQ9dGhpcy5oYW5kbGVyO2lmKHRvKGwpfHwobD1bbF0pLHRoaXMuYmF0Y2hlZCliLnB1c2guYXBwbHkoYixsKTtlbHNlIHJldHVybiBUKGwpfX07dmFyIFJkPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gVXYodixsKXtsZXQgYj1sfHxnbG9iYWwuY2FsbE5hdGl2ZTtyZXR1cm4gSG4oYil8fGNvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBubyBkZWZhdWx0IGhhbmRsZXIiKSxmdW5jdGlvbihrKXt0byhrKXx8KGs9W2tdKTtmb3IobGV0IEM9MDtDPGsubGVuZ3RoO0MrKyl7bGV0IGQ9S04odixrW0NdLGIpO2lmKGQ9PT0tMSlyZXR1cm4gZH19fWZ1bmN0aW9uIEpOKHYsbCl7cmV0dXJuIHY9PT0iZG9tIiYmUmRbbF0mJkhuKGdsb2JhbFtSZFtsXV0pfWZ1bmN0aW9uIEtOKHYsbCxiKXtsZXR7bW9kdWxlOlQsbWV0aG9kOmssYXJnczpDfT1sO3JldHVybiBKTihULGspP2dsb2JhbFtSZFtrXV0odiwuLi5DLCItMSIpOmIodixbbF0sIi0xIil9dmFyIG1mPWNsYXNzIGV4dGVuZHMgUm97Y29uc3RydWN0b3IobCl7c3VwZXIoKTt0aGlzLnZhbHVlPWwsdGhpcy5ub2RlVHlwZT0zLHRoaXMudHlwZT0idGV4dCIsdGhpcy52YWx1ZT0iIn10b1N0cmluZygpe3JldHVybiIiK3RoaXMudmFsdWV9fTt2YXIgJHY9e3NsaWRlcjp7Y2hhbmdlOmZ1bmN0aW9uKHYpe3JldHVybntpbmRleDp2LmluZGV4LHNvdXJjZTp2LnNvdXJjZX19LHNjcm9sbDpmdW5jdGlvbih2KXtyZXR1cm57b2Zmc2V0WFJhdGlvOnYub2Zmc2V0WFJhdGlvLG9mZnNldFlSYXRpbzp2Lm9mZnNldFlSYXRpbyxkcmFnOnYuZHJhZ319fSwic2Nyb2xsLXZpZXciOntzY3JvbGxlbmQ6ZnVuY3Rpb24odil7cmV0dXJue2NvbnRlbnRPZmZzZXQ6di5jb250ZW50T2Zmc2V0fX19fTtmdW5jdGlvbiBIdih2KXtsZXR7YXR0cjpsLG9mZnNldExlZnQ6YixvZmZzZXRUb3A6VH09dixrPXt9O3JldHVybiBsJiZPYmplY3Qua2V5cyhsKS5mb3JFYWNoKEM9PntDLmluZGV4T2YoImRhdGEtIik9PT0wJiYoa1tDLnJlcGxhY2UoImRhdGEtIiwiIildPWxbQ10pfSkse2lkOmwmJmwuaWR8fCIiLGRhdGFzZXQ6ayxvZmZzZXRMZWZ0OmJ8fDAsb2Zmc2V0VG9wOlR8fDB9fXZhciBaTj1bImEiLCJkaXYiLCJsaXN0IiwiY2VsbCIsImxvYWRpbmciLCJyZWZyZXNoIiwicmVjeWNsZS1saXN0Iiwic2Nyb2xsZXIiLCJpbmRpY2F0b3IiLCJ3YXRlcmZhbGwiLCJ3ZWIiLCJyaWNodGV4dCJdLFhOPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiXSxRTj17bWFya2VydGFwOlsibWFya2VySWQiXSxjb250cm9sdGFwOlsiY29udHJvbElkIl0scmVnaW9uY2hhbmdlOlsiY2F1c2VkQnkiXSxlbmQ6WyJjYXVzZWRCeSJdLGFwcGVhcjpbImRpcmVjdGlvbiJdLGRpc2FwcGVhcjpbImRpcmVjdGlvbiJdfTtmdW5jdGlvbiBqdih2LGwpe2xldCBiPXYudHlwZTtpZihYTi5pbmRleE9mKGIpIT09LTEpcmV0dXJuIHY7bGV0IFQ9di5jdXJyZW50VGFyZ2V0LGs9VC50eXBlLnJlcGxhY2UoInUtIiwiIik7aWYoWk4uaW5kZXhPZihrKSE9PS0xKXJldHVybiB2O2xldHt0aW1lc3RhbXA6Qyx0YXJnZXQ6ZH09djtpZighbCl7bGV0IFdlPSR2W2tdO1dlP0huKFdlW2JdKT9sPVdlW2JdKHYpOmw9di5kZXRhaWx8fHt9Omw9di5kZXRhaWx8fHt9fWxldCBtPXt0eXBlOmIsdGltZVN0YW1wOkMsdGFyZ2V0Okh2KGQpLGN1cnJlbnRUYXJnZXQ6SHYoVCksZGV0YWlsOmwsdG91Y2hlczpiPT09InRvdWNoZW5kInx8Yj09PSJwYW5lbmQiP1tdOnYuY2hhbmdlZFRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6di5jaGFuZ2VkVG91Y2hlc307di5jb21wb25lbnRJZCYmKG0uY29tcG9uZW50SWQ9di5jb21wb25lbnRJZCk7bGV0IFI9UU5bYl07cmV0dXJuIFImJlIuZm9yRWFjaChXZT0+e1hsKHYsV2UpJiYobVtXZV09dltXZV0pfSksbX1mdW5jdGlvbiBlMSh2LGwpe2xldCBiPWwuYXR0cnN8fHt9O2ZvcihsZXQgayBpbiBiKXYuc2V0QXR0cihrLGJba10sITApO2xldCBUPWwuc3R5bGV8fHt9O2ZvcihsZXQgayBpbiBUKXYuc2V0U3R5bGUoayxUW2tdLCEwKX12YXIgQWE9Y2xhc3N7Y29uc3RydWN0b3IobCxiPSIiLFQpe2w9bD9sLnRvU3RyaW5nKCk6IiIsdGhpcy5pZD1sLHRoaXMuVVJMPWIsdXYobCx0aGlzKSx0aGlzLm5vZGVNYXA9e307bGV0IGs9QWEuTGlzdGVuZXJ8fEhjO3RoaXMubGlzdGVuZXI9bmV3IGsobCxUfHxVdihsLEFhLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3ICRjKGwsVD8oQyxkKT0+VChkKTpBYS5oYW5kbGVyKSx0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpfWdldFJlZihsKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2xdfW9wZW4oKXt0aGlzLmxpc3RlbmVyLmJhdGNoZWQ9ITF9Y2xvc2UoKXt0aGlzLmxpc3RlbmVyLmJhdGNoZWQ9ITB9Y3JlYXRlRG9jdW1lbnRFbGVtZW50KCl7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXtsZXQgbD1uZXcgUm8oImRvY3VtZW50Iik7bC5kb2NJZD10aGlzLmlkLGwub3duZXJEb2N1bWVudD10aGlzLGwucm9sZT0iZG9jdW1lbnRFbGVtZW50IixsLnJlZj0iX2RvY3VtZW50RWxlbWVudCIsdGhpcy5ub2RlTWFwLl9kb2N1bWVudEVsZW1lbnQ9bCx0aGlzLmRvY3VtZW50RWxlbWVudD1sLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLCJhcHBlbmRDaGlsZCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmI9PntkZCh0aGlzLGIpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTooYixUKT0+e2RkKHRoaXMsYixUKX19KSxpcigiZGVidWciKSYmdm8oYENyZWF0ZSBkb2N1bWVudCBlbGVtZW50IChpZDogIiR7bC5kb2NJZH0iLCByZWY6ICIke2wucmVmfSIpYCl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fWNyZWF0ZUJvZHkobCxiKXtpZighdGhpcy5ib2R5KXtsZXQgVD1uZXcgUm8obCxiKTtoZCh0aGlzLFQpLGlyKCJkZWJ1ZyIpJiZ2byhgW2NyZWF0ZUJvZHldKCR7dGhpcy5pZH0sJHtULnR5cGV9LCR7VC5yZWZ9KSAoJHtKU09OLnN0cmluZ2lmeShULnRvSlNPTighMCkpfSkuYCl9cmV0dXJuIHRoaXMuYm9keX1jcmVhdGVFbGVtZW50KGwsYil7bGV0IFQ9bmV3IFJvKGwsYik7cmV0dXJuIGlyKCJkZWJ1ZyIpJiZ2byhgW2NyZWF0ZUVsZW1lbnRdKCR7dGhpcy5pZH0sJHtULnR5cGV9LCR7VC5yZWZ9KSAoJHtKU09OLnN0cmluZ2lmeShULnRvSlNPTighMCkpfSkuYCksVH1jcmVhdGVDb21tZW50KGwpe3JldHVybiBuZXcgcmMobCl9Y3JlYXRlVGV4dChsKXtyZXR1cm4gbmV3IG1mKGwpfWZpcmVFdmVudChsLGIsVCxrLEMpe2lmKCFsKXJldHVybjtUPVR8fHt9LFQudHlwZT1ULnR5cGV8fGIsVC50YXJnZXQ9bCxULmN1cnJlbnRUYXJnZXQ9bCxULnRpbWVzdGFtcD1EYXRlLm5vdygpLGsmJmUxKGwsayk7bGV0IGQ9ITAsbT10aGlzLmdldFJlZigiX3Jvb3QiKTtpZihtJiZtLmF0dHIpe2xldCBSPW0uYXR0ci5idWJibGU7ZD1SPT09InRydWUifHxSPT09ITB8fGQmJlI9PT12b2lkIDB9cmV0dXJuIFQ9anYoVCksbC5maXJlRXZlbnQoYixULGQsQyl9ZGVzdHJveSgpe2lyKCJkZWJ1ZyIpJiZ2byhgW2Rlc3Ryb3ldKCR7dGhpcy5pZH0sZG9jdW1lbnQpIERlc3Ryb3kgZG9jdW1lbnQgKGlkOiAiJHt0aGlzLmlkfSIsIFVSTDogIiR7dGhpcy5VUkx9IilgKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLGZ2KHRoaXMuaWQpfX07QWEuaGFuZGxlcj1udWxsO3ZhciB6dj17SW5wdXRFbGVtZW50RGl2OiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixJbnB1dEVsZW1lbnRSZWdFeHA6IjxXaGl0ZVNwYWNlPnw8TGluZVRlcm1pbmF0b3I+fDxSZXNlcnZlZFdvcmQ+fDxJZGVudGlmaWVyPnw8TnVtZXJpY0xpdGVyYWw+fDxQdW5jdHVhdG9yPnw8U3RyaW5nTGl0ZXJhbD4iLFJlc2VydmVkV29yZDoiPEtleXdvcmQ+fDxOdWxsTGl0ZXJhbD58PEJvb2xlYW5MaXRlcmFsPiIsV2hpdGVTcGFjZTovW1x0XHZcZlx1MDAyMFx1MDBBMFx1MTY4MFx1MTgwRVx1MjAwMC1cdTIwMEFcdTIwMkZcdTIwNWZcdTMwMDBcdUZFRkZdLyxMaW5lVGVybWluYXRvcjovW1xuXHJcdTIwMjhcdTIwMjldLyxLZXl3b3JkOi9uZXcoPyFbXyRhLXpBLVowLTldKXx2b2lkKD8hW18kYS16QS1aMC05XSl8ZGVsZXRlKD8hW18kYS16QS1aMC05XSl8aW4oPyFbXyRhLXpBLVowLTldKXxpbnN0YW5jZW9mKD8hW18kYS16QS1aMC05XSl8dHlwZW9mKD8hW18kYS16QS1aMC05XSkvLE51bGxMaXRlcmFsOi9udWxsKD8hW18kYS16QS1aMC05XSkvLEJvb2xlYW5MaXRlcmFsOi8oPzp0cnVlfGZhbHNlKSg/IVtfJGEtekEtWjAtOV0pLyxJZGVudGlmaWVyOi9bXyRhLXpBLVpdW18kYS16QS1aMC05XSovLFB1bmN0dWF0b3I6L1wvfD0+fFwqXCp8Pj4+PXw+Pj18PDw9fD09PXwhPT18Pj4+fDw8fCU9fFwqPXwtPXxcKz18PD18Pj18PT18IT18XF49fFx8PXxcfFx8fCYmfCY9fD4+fFwrXCt8LS18XDp8fXxcKnwmfFx8fFxefCF8fnwtfFwrfFw/fCV8PXw+fDx8LHw7fFwuKD8hWzAtOV0pfFxdfFxbfFwpfFwofHsvLERpdlB1bmN0dWF0b3I6L1wvPXxcLy8sTnVtZXJpY0xpdGVyYWw6Lyg/OjBbeFhdWzAtOWEtZkEtRl0qfFwuWzAtOV0rfCg/OlsxLTldK1swLTldKnwwKSg/OlwuWzAtOV0qfFwuKT8pKD86W2VFXVsrLV17MCwxfVswLTldKyk/KD8hW18kYS16QS1aMC05XSkvLFN0cmluZ0xpdGVyYWw6LyIoPzpbXiJcblxcXHJcdTIwMjhcdTIwMjldfFxcKD86WyciXFxiZm5ydHZcblxyXHUyMDI4XHUyMDI5XXxcclxuKXxcXHhbMC05YS1mQS1GXXsyfXxcXHVbMC05YS1mQS1GXXs0fXxcXFteMC05dXgnIlxcYmZucnR2XG5cXFxyXHUyMDI4XHUyMDI5XSkqInwnKD86W14nXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKicvLFJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbDovXC8oPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXipcL1xcXG5cclx1MjAyOFx1MjAyOV18XFxbXlxuXHJcdTIwMjhcdTIwMjldKSg/OlxbKD86XFxbXHNcU118W15cXV0pKlxdfFteXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkqXC9bMC05YS16QS1aXSovfTtmdW5jdGlvbiBXdih2LGwsYil7dmFyIFQ9W2xdO2Z1bmN0aW9uIGsoZCl7dmFyIG09bmV3IFJlZ0V4cDtyZXR1cm4gbS5jb21waWxlKGQucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oUixXZSl7cmV0dXJuIHZbV2VdPyhULnB1c2goV2UpLHZbV2VdaW5zdGFuY2VvZiBSZWdFeHA/IigiK3ZbV2VdLnNvdXJjZSsiKSI6IigiK2sodltXZV0pLnNvdXJjZSsiKSIpOiIifSksYiksbX12YXIgQz1rKHZbbF0pO3RoaXMuZXhlYz1mdW5jdGlvbihkKXt2YXIgbT1DLmV4ZWMoZCk7aWYobT09bnVsbClyZXR1cm4gbnVsbDtmb3IodmFyIFI9bmV3IFN0cmluZyhtWzBdKSxXZT0wO1dlPFQubGVuZ3RoO1dlKyspbVtXZV0mJihSW1RbV2VdXT1tW1dlXSk7cmV0dXJuIFJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXN0SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy5sYXN0SW5kZXh9LHNldDpmdW5jdGlvbihkKXtDLmxhc3RJbmRleD1kfX0pfWZ1bmN0aW9uIHQxKCl7dmFyIHY9bmV3IFd2KHp2LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksbD1uZXcgV3YoenYsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKSxiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzb3VyY2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sc2V0OmZ1bmN0aW9uKFQpe2I9VCx2Lmxhc3RJbmRleD0wLGwubGFzdEluZGV4PTB9fSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3YubGFzdEluZGV4PTAsbC5sYXN0SW5kZXg9MH0sdGhpcy5nZXROZXh0VG9rZW49ZnVuY3Rpb24oVCl7dmFyIGs9di5sYXN0SW5kZXgsQztUP0M9djpDPWw7dmFyIGQ9Qy5leGVjKGIpO2lmKGQmJkMubGFzdEluZGV4LWs+ZC5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIHRva2VuIElMTEVHQUwiKTtyZXR1cm4gdi5sYXN0SW5kZXg9Qy5sYXN0SW5kZXgsbC5sYXN0SW5kZXg9Qy5sYXN0SW5kZXgsZH19dmFyIEd2PXtJZGVudGlmaWVyTmFtZTpbWyJJZGVudGlmaWVyIl1dLExpdGVyYWw6W1siTnVsbExpdGVyYWwiXSxbIkJvb2xlYW5MaXRlcmFsIl0sWyJOdW1lcmljTGl0ZXJhbCJdLFsiU3RyaW5nTGl0ZXJhbCJdLFsiUmVndWxhckV4cHJlc3Npb25MaXRlcmFsIl1dLFByaW1hcnlFeHByZXNzaW9uOltbIklkZW50aWZpZXIiXSxbIkxpdGVyYWwiXSxbIigiLCJFeHByZXNzaW9uIiwiKSJdXSxDYWxsRXhwcmVzc2lvbjpbWyJQcmltYXJ5RXhwcmVzc2lvbiIsIkFyZ3VtZW50cyJdLFsiQ2FsbEV4cHJlc3Npb24iLCJBcmd1bWVudHMiXV0sQXJndW1lbnRzOltbIigiLCIpIl0sWyIoIiwiQXJndW1lbnRMaXN0IiwiKSJdXSxBcmd1bWVudExpc3Q6W1siQ29uZGl0aW9uYWxFeHByZXNzaW9uIl0sWyJBcmd1bWVudExpc3QiLCIsIiwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIl1dLExlZnRIYW5kU2lkZUV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iXSxbIkNhbGxFeHByZXNzaW9uIl1dLFVuYXJ5RXhwcmVzc2lvbjpbWyJMZWZ0SGFuZFNpZGVFeHByZXNzaW9uIl0sWyJ2b2lkIiwiVW5hcnlFeHByZXNzaW9uIl0sWyIrIiwiVW5hcnlFeHByZXNzaW9uIl0sWyItIiwiVW5hcnlFeHByZXNzaW9uIl0sWyJ+IiwiVW5hcnlFeHByZXNzaW9uIl0sWyIhIiwiVW5hcnlFeHByZXNzaW9uIl1dLEV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbjpbWyJVbmFyeUV4cHJlc3Npb24iXSxbIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiIsIioqIiwiVW5hcnlFeHByZXNzaW9uIl1dLE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIvIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIioiLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIiUiLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXV0sQWRkaXRpdmVFeHByZXNzaW9uOltbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdLFsiQWRkaXRpdmVFeHByZXNzaW9uIiwiKyIsIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdLFsiQWRkaXRpdmVFeHByZXNzaW9uIiwiLSIsIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdXSxTaGlmdEV4cHJlc3Npb246W1siQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI8PCIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+PiIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdXSxSZWxhdGlvbmFsRXhwcmVzc2lvbjpbWyJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPCIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjw9IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIj49IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluc3RhbmNlb2YiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiaW4iLCJTaGlmdEV4cHJlc3Npb24iXV0sRXF1YWxpdHlFeHByZXNzaW9uOltbIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCI9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCIhPSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCI9PT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXV0sQml0d2lzZUFOREV4cHJlc3Npb246W1siRXF1YWxpdHlFeHByZXNzaW9uIl0sWyJCaXR3aXNlQU5ERXhwcmVzc2lvbiIsIiYiLCJFcXVhbGl0eUV4cHJlc3Npb24iXV0sQml0d2lzZVhPUkV4cHJlc3Npb246W1siQml0d2lzZUFOREV4cHJlc3Npb24iXSxbIkJpdHdpc2VYT1JFeHByZXNzaW9uIiwiXiIsIkJpdHdpc2VBTkRFeHByZXNzaW9uIl1dLEJpdHdpc2VPUkV4cHJlc3Npb246W1siQml0d2lzZVhPUkV4cHJlc3Npb24iXSxbIkJpdHdpc2VPUkV4cHJlc3Npb24iLCJ8IiwiQml0d2lzZVhPUkV4cHJlc3Npb24iXV0sTG9naWNhbEFOREV4cHJlc3Npb246W1siQml0d2lzZU9SRXhwcmVzc2lvbiJdLFsiTG9naWNhbEFOREV4cHJlc3Npb24iLCImJiIsIkJpdHdpc2VPUkV4cHJlc3Npb24iXV0sTG9naWNhbE9SRXhwcmVzc2lvbjpbWyJMb2dpY2FsQU5ERXhwcmVzc2lvbiJdLFsiTG9naWNhbE9SRXhwcmVzc2lvbiIsInx8IiwiTG9naWNhbEFOREV4cHJlc3Npb24iXV0sQ29uZGl0aW9uYWxFeHByZXNzaW9uOltbIkxvZ2ljYWxPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI/IiwiTG9naWNhbE9SRXhwcmVzc2lvbiIsIjoiLCJMb2dpY2FsT1JFeHByZXNzaW9uIl1dLEV4cHJlc3Npb246W1siQ29uZGl0aW9uYWxFeHByZXNzaW9uIl0sWyJFeHByZXNzaW9uIiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxQcm9ncmFtOltbIkV4cHJlc3Npb24iXV19O2Z1bmN0aW9uIEF1KHYsbCl7dGhpcy5uYW1lPXYsdGhpcy50b2tlbj1sLHRoaXMuY2hpbGROb2Rlcz1bXSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKGIpe2lmKGJ8fChiPSIiKSx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoPT0xKXJldHVybiB0aGlzLmNoaWxkTm9kZXNbMF0udG9TdHJpbmcoYik7Zm9yKHZhciBUPWIrdGhpcy5uYW1lKyh0aGlzLnRva2VuIT1udWxsJiZ0aGlzLm5hbWUhPXRoaXMudG9rZW4/IjoiK3RoaXMudG9rZW46IiIpK2AKYCxrPTA7azx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO2srKylUKz10aGlzLmNoaWxkTm9kZXNba10udG9TdHJpbmcoYisiICAgICIpO3JldHVybiBUfX1mdW5jdGlvbiBuMSgpe3ZhciB2LGw9e1Byb2dyYW06IiQifSxiPXt9O2Z1bmN0aW9uIFQobSl7YltKU09OLnN0cmluZ2lmeShtKV09bTtmb3IodmFyIFI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobSk7Ui5sZW5ndGg7KXt2YXIgV2U9Ui5zaGlmdCgpOyFHdltXZV18fEd2W1dlXS5mb3JFYWNoKGZ1bmN0aW9uKGVuKXttW2VuWzBdXXx8Ui5wdXNoKGVuWzBdKTt2YXIgZ2U9bSxPPW51bGw7ZW4uZm9yRWFjaChmdW5jdGlvbihOdCl7Z2VbTnRdfHwoZ2VbTnRdPXt9KSxPPWdlLGdlPWdlW050XX0pLG1bV2VdLiRkaXYmJihnZS4kZGl2PSEwKSxnZS4kcmVkdWNlPVdlLGdlLiRjb3VudD1lbi5sZW5ndGh9KX1mb3IodmFyIFB0IGluIG0pdHlwZW9mIG1bUHRdIT0ib2JqZWN0Inx8UHQuY2hhckF0KDApPT0iJCJ8fG1bUHRdLiRjbG9zdXJlfHwoYltKU09OLnN0cmluZ2lmeShtW1B0XSldP21bUHRdPWJbSlNPTi5zdHJpbmdpZnkobVtQdF0pXTpUKG1bUHRdKSk7bS4kY2xvc3VyZT0hMH1UKGwpO3ZhciBrPVtdLEM9W2xdLGQ9bDt0aGlzLmluc2VydFN5bWJvbD1mdW5jdGlvbihSLFdlKXtmb3IoOyFkW1IubmFtZV0mJmQuJHJlZHVjZTspe2Zvcih2YXIgUHQ9ZC4kY291bnQsZW49bmV3IEF1KGQuJHJlZHVjZSk7UHQtLTspZW4uY2hpbGROb2Rlcy5wdXNoKGsucG9wKCkpLEMucG9wKCk7ZD1DW0MubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKGVuKX1pZihkPWRbUi5uYW1lXSxrLnB1c2goUiksQy5wdXNoKGQpLCFkKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZC4kZGl2fSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7ZD1sLGs9W10sQz1bbF19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO2QuJHJlZHVjZTspe2Zvcih2YXIgbT1kLiRjb3VudCxSPW5ldyBBdShkLiRyZWR1Y2UpO20tLTspUi5jaGlsZE5vZGVzLnB1c2goay5wb3AoKSksQy5wb3AoKTtkPUNbQy5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2woUil9aWYoay5sZW5ndGg+MCYmZFsiOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgQXUoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoay5sZW5ndGghPTF8fGtbMF0ubmFtZSE9IlByb2dyYW0iKXRocm93IG5ldyBFcnJvcn1jYXRjaChXZSl7dGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpfXJldHVybiBrWzBdfX0pfWZ1bmN0aW9uIHIxKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyB0MSx0aGlzLnN5bnRhY3RpY2FsUGFyc2VyPW5ldyBuMTt2YXIgdj1bIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiLCJJZGVudGlmaWVyIiwiKioiLCI9PiIsInsiLCJ9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCI7IiwiLCIsIjwiLCI+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCI9PT0iLCIhPT0iLCIrIiwiLSIsIioiLCIlIiwiKysiLCItLSIsIjw8IiwiPj4iLCI+Pj4iLCImIiwifCIsIl4iLCIhIiwifiIsIiYmIiwifHwiLCI/IiwiOiIsIj0iLCIrPSIsIi09IiwiKj0iLCIlPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsInw9IiwiXj0iLCIvIiwiLz0iLCJpbnN0YW5jZW9mIiwidHlwZW9mIiwibmV3Iiwidm9pZCIsImRlYnVnZ2VyIiwidGhpcyIsImRlbGV0ZSIsImluIl0sbD17fTt2LmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsYix7fSl9KSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5sZXhpY2FsUGFyc2VyLnJlc2V0KCksdGhpcy5zeW50YWN0aWNhbFBhcnNlci5yZXNldCgpfSx0aGlzLnBhcnNlPWZ1bmN0aW9uKGIsVCl7dmFyIGssQz0hMTt0aGlzLmxleGljYWxQYXJzZXIuc291cmNlPWI7Zm9yKHZhciBkPSExO2s9dGhpcy5sZXhpY2FsUGFyc2VyLmdldE5leHRUb2tlbihkKTspe1QmJlQoayk7dHJ5e2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGspLnNvbWUobT0+bC5oYXNPd25Qcm9wZXJ0eShtKT8oZD10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgQXUobSxrKSxDKSxDPSExLCEwKTohMSkpY29udGludWU7KGsuS2V5d29yZHx8ay5QdW5jdHVhdG9yfHxrLkRpdlB1bmN0dWF0b3IpJiZsLmhhc093blByb3BlcnR5KGsudG9TdHJpbmcoKSkmJihkPXRoaXMuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBBdShrLnRvU3RyaW5nKCksayksQykpfWNhdGNoKG0pe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK2spfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIFl2PW5ldyByMTtmdW5jdGlvbiBpMSh2KXtZdi5yZXNldCgpLHRoaXMudHJlZT1Zdi5wYXJzZSh2KSx0aGlzLnBhdGhzPVtdO3ZhciBsPU9iamVjdC5jcmVhdGUobnVsbCksYj10aGlzLFQ9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmlzU2ltcGxlLHRoaXMuaXNDb25zdCxDKHRoaXMudHJlZSksayh0aGlzLnRyZWUpLHRoaXMucGF0aHMubGVuZ3RoPT09MCYmKHRoaXMuaXNDb25zdD0hMCksdGhpcy5zZXR0ZXI9ZnVuY3Rpb24oUil7Zm9yKHZhciBXZT1sLFB0PTA7UHQ8Ui5sZW5ndGgtMTtQdCsrKVdlW1JbUHRdXXx8KFdlW1JbUHRdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxXZT1XZVtSW1B0XV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlbiBpbiBUKWlmKCFUW2VuXSlyZXR1cm4hMTtyZXR1cm4hMH0sc2V0OmZ1bmN0aW9uKGVuKXtpZihUW1Iuam9pbigiLiIpXXx8KFRbUi5qb2luKCIuIildPSEwKSxXZVtSW1B0XV09ZW4sdGhpcy5pc0NvbXBsZXRlZCgpKXJldHVybiBiLmV4ZWMoKX19fSx0aGlzLnZhbHVlT2Y9dGhpcy5leGVjPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBmdW5jdGlvbigpe3JldHVybigwLGV2YWwpKHYpfS5jYWxsKGwpfWNhdGNoKFIpe319O2Z1bmN0aW9uIGsoUil7Zm9yKHZhciBXZT1SO1dlLmNoaWxkTm9kZXMubGVuZ3RoPD0xJiZXZS5uYW1lIT09Ik1lbWJlckV4cHJlc3Npb24iOylXZT1XZS5jaGlsZE5vZGVzWzBdO1dlLm5hbWU9PT0iTWVtYmVyRXhwcmVzc2lvbiI/Yi5pc1NpbXBsZT0hMDpiLmlzU2ltcGxlPSExfWZ1bmN0aW9uIEMoUil7aWYoUi5uYW1lPT09IkNhbGxFeHByZXNzaW9uIiYmUi5jaGlsZE5vZGVzW1IuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSE9PSJDYWxsRXhwcmVzc2lvbiIpe3ZhciBXZT1kKFIuY2hpbGROb2Rlc1sxXSk7QyhSLmNoaWxkTm9kZXNbMF0pfWVsc2UgaWYoUi5uYW1lPT09Ik5ld0V4cHJlc3Npb24iJiZSLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgV2U9ZChSLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoUi5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iJiZSLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgV2U9ZChSKTtlbHNlIGZvcih2YXIgUHQ9MDtQdDxSLmNoaWxkTm9kZXMubGVuZ3RoO1B0KyspQyhSLmNoaWxkTm9kZXNbUHRdKX1mdW5jdGlvbiBkKFIpe2lmKFIuY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXJOYW1lIil7dmFyIFdlPWQoUi5jaGlsZE5vZGVzWzJdKTtyZXR1cm4gV2UmJihXZT1XZS5jb25jYXQoUi5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLG0oV2UpLFdlfWVsc2UgaWYoUi5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iUHJpbWFyeUV4cHJlc3Npb24iKWlmKFIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iSWRlbnRpZmllciIpe3ZhciBXZT1bUi5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKV07cmV0dXJuIG0oV2UpLFdlfWVsc2UgcmV0dXJuIG51bGw7ZWxzZXtpZihSLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJdIilyZXR1cm4gZChSLmNoaWxkTm9kZXNbM10pLEMoUi5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKFIuY2hpbGROb2Rlc1swXS5uYW1lPT09IkFyZ3VtZW50cyIpcmV0dXJuIEMoUi5jaGlsZE5vZGVzWzBdKSxDKFIuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIFB0PTA7UHQ8Ui5jaGlsZE5vZGVzLmxlbmd0aDtQdCsrKUMoUi5jaGlsZE5vZGVzW1B0XSl9fWZ1bmN0aW9uIG0oUil7Zm9yKHZhciBXZT1sLFB0PTA7UHQ8Ui5sZW5ndGgtMTtQdCsrKVdlW1JbUHRdXXx8KFdlW1JbUHRdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxXZT1XZVtSW1B0XV07Yi5wYXRocy5wdXNoKFIpLFRbUi5qb2luKCIuIildPSExfX1mdW5jdGlvbiBpYyh2KXt2YXIgbD12LmNoaWxkTm9kZXMuc2xpY2UoKS5yZXZlcnNlKCksYj1sLmZpbHRlcihSPT4hUi50b2tlbnx8IVIudG9rZW4uUHVuY3R1YXRvcik7aWYodi5uYW1lPT09IlVuYXJ5RXhwcmVzc2lvbiImJmwubGVuZ3RoPT09MiYmbFswXS5uYW1lPT09Ii0iJiZiLmxlbmd0aD09PTEpe3ZhciBUPWljKGJbMF0pO3JldHVybiBULnZhbHVlPS1ULnZhbHVlLFR9aWYodi5uYW1lPT09IkFyZ3VtZW50cyIpe2Zvcih2YXIgaz1bXSxDPWJbMF07QzspQy5jaGlsZE5vZGVzLmxlbmd0aD09PTMmJihrLnVuc2hpZnQoQy5jaGlsZE5vZGVzWzBdKSxDPUMuY2hpbGROb2Rlc1syXSksQy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJihrLnVuc2hpZnQoQy5jaGlsZE5vZGVzWzBdKSxDPW51bGwpO3JldHVybnt0eXBlOiJBcmd1bWVudHMiLGNoaWxkcmVuOmsubWFwKFI9PmljKFIpKX19aWYoYiYmYi5sZW5ndGg9PT0xKXt2YXIgVD1pYyhiWzBdKTtyZXR1cm4gVH1pZih2LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShSPT52LnRva2VuW1JdKSl7dmFyIGQ9T2JqZWN0LmtleXModi50b2tlbikuZmlsdGVyKFI9PlIubWF0Y2goL0xpdGVyYWwvKXx8Ui5tYXRjaCgvSWRlbnRpZmllci8pKVswXSxtPXtOdWxsTGl0ZXJhbDpudWxsLEJvb2xlYW5MaXRlcmFsOkJvb2xlYW4odi50b2tlbiksTnVtZXJpY0xpdGVyYWw6TnVtYmVyKHYudG9rZW4pLFN0cmluZ0xpdGVyYWw6di50b2tlbixJZGVudGlmaWVyOnYudG9rZW59W2RdO3JldHVybnt0eXBlOmQsdmFsdWU6bX19cmV0dXJuIHYubmFtZT09PSJDYWxsRXhwcmVzc2lvbiI/e3R5cGU6IkNhbGxFeHByZXNzaW9uIixjaGlsZHJlbjpbaWMobFswXSksaWMobFsxXSldfTp7dHlwZTpsLmZpbHRlcihSPT5SLnRva2VuJiZSLnRva2VuLlB1bmN0dWF0b3IpWzBdLm5hbWUsY2hpbGRyZW46bC5maWx0ZXIoUj0+IVIudG9rZW58fCFSLnRva2VuLlB1bmN0dWF0b3IpLm1hcChSPT5pYyhSKSl9fWZ1bmN0aW9uIHF2KHYpe3ZhciBsPW5ldyBpMSh2KTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaWMobC50cmVlKSxudWxsKX1mdW5jdGlvbiBvMSh2LGwpe3JldHVybiBsPT09ImJpbmQiJiYodj09PSJiaW5kaW5neCJ8fHY9PT0iYmluZGluZyIpfWZ1bmN0aW9uIEp2KHYpe2lmKCF2KXJldHVybjt0cnl7dj1KU09OLnBhcnNlKHYpfWNhdGNoKGIpe31sZXQgbD17fTtpZihMaSh2KT9sLm9yaWdpbj12OnYmJihsLm9yaWdpbj12Lm9yaWdpbixsLnRyYW5zZm9ybWVkPXYudHJhbnNmb3JtZWQpLCEoIWwudHJhbnNmb3JtZWQmJiFsLm9yaWdpbikpcmV0dXJuIGwudHJhbnNmb3JtZWQ9bC50cmFuc2Zvcm1lZHx8cXYobC5vcmlnaW4pLGx9ZnVuY3Rpb24gYTEodil7cmV0dXJuIHYmJih2LmV4aXRFeHByZXNzaW9uPUp2KHYuZXhpdEV4cHJlc3Npb24pLHYucHJvcHMmJnYucHJvcHMuZm9yRWFjaChsPT57bC5leHByZXNzaW9uPUp2KGwuZXhwcmVzc2lvbil9KSx2KX1mdW5jdGlvbiBzMSh2KXtyZXR1cm4gZnVuY3Rpb24obD17fSl7aWYoSG4odikpcmV0dXJuIHYoe3N0YXRlOmwuc3RhdGU9PT0iZW5kIj8iZXhpdCI6bC5zdGF0ZSx0OmwudCE9PXZvaWQgMD9sLnQ6bC5kZWx0YVR9KX19ZnVuY3Rpb24gS3YodixsLGIpe3JldHVybiBiJiYobzEodixsKT9mdW5jdGlvbihULGs9ZnVuY3Rpb24oKXt9KXtpZighVCl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gYTEoVCksYihULFQmJlQuZXZlbnRUeXBlPT09InRpbWluZyI/czEoayk6ayl9OmIpfWZ1bmN0aW9uIGwxKHYsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYsIltbQ3VycmVudEluc3RhbmNlSWRdXSIse3ZhbHVlOmx9KX1mdW5jdGlvbiBadih2KXtyZXR1cm4gdlsiW1tDdXJyZW50SW5zdGFuY2VJZF1dIl19ZnVuY3Rpb24gYzEodixsLGIpe2xldCBUPUdyKHYpO3JldHVybiFUfHwhSG4oVC5zZW5kKT8oY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoJHt2fSkuYCksbnVsbCk6KC4uLmspPT5ULnNlbmQoIm1vZHVsZSIse21vZHVsZTpsLG1ldGhvZDpifSxrKX1mdW5jdGlvbiB1MSh2LGwsYixUKXtsZXQgaz1Hcih2KTtyZXR1cm4ha3x8IUhuKGsuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7dn0pLmApLG51bGwpOkhuKFQpP0M9Pmsuc2VuZCgibW9kdWxlIix7bW9kdWxlOmwsbWV0aG9kOmJ9LFtDXSk6KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdICR7bH0uJHtifSBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uYCksbnVsbCl9dmFyIF9mPWNsYXNze2NvbnN0cnVjdG9yKGwsYil7bDEodGhpcyxTdHJpbmcobCkpLHRoaXMuY29uZmlnPWJ8fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IEFhKGwsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1wZix0aGlzLmlzUmVnaXN0ZXJlZENvbXBvbmVudD1DZH1yZXF1aXJlTW9kdWxlKGwpe2xldCBiPVp2KHRoaXMpO2lmKCEoYiYmdGhpcy5kb2N1bWVudCYmdGhpcy5kb2N1bWVudC50YXNrQ2VudGVyKSl7Y29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlcXVpcmVNb2R1bGUoIiR7bH0iKSwgaW5zdGFuY2UgKCR7Yn0pIGRvZXNuJ3QgZXhpc3QgYW55bW9yZS5gKTtyZXR1cm59aWYoIXBmKGwpKXtjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIFx1NUY1M1x1NTI0RFx1OEZEMFx1ODg0Q1x1NzY4NFx1NTdGQVx1NUVBN1x1NEUwRFx1NTMwNVx1NTQyQlx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlske2x9XVx1RkYwQ1x1OEJGN1x1NTcyOG1hbmlmZXN0XHU0RTJEXHU5MTREXHU3RjZFXHU4QkU1XHU2M0QyXHU0RUY2XHVGRjBDXHU5MUNEXHU2NUIwXHU1MjM2XHU0RjVDXHU1MzA1XHU2MkVDXHU4QkU1XHU1MzlGXHU3NTFGXHU2M0QyXHU0RUY2XHU3Njg0XHU4MUVBXHU1QjlBXHU0RTQ5XHU4RkQwXHU4ODRDXHU1N0ZBXHU1RUE3YCk7cmV0dXJufWxldCBUPXt9LGs9U3YobCk7Zm9yKGxldCBDIGluIGspT2JqZWN0LmRlZmluZVByb3BlcnR5KFQsQyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5LdihsLEMsYzEoYixsLEMpKSxzZXQ6ZD0+dTEoYixsLEMsZCl9KTtyZXR1cm4gVH1zdXBwb3J0cyhsKXtpZighTGkobCkpcmV0dXJuIG51bGw7bGV0IGI9bC5tYXRjaCgvXkAoXHcrKVwvKFtcdy1dKykoXC4oXHcrKSk/JC9pKTtpZihiKXtsZXQgVD1iWzFdLGs9YlsyXSxDPWJbNF07c3dpdGNoKFQpe2Nhc2UibW9kdWxlIjpyZXR1cm4gcGYoayxDKTtjYXNlImNvbXBvbmVudCI6cmV0dXJuIENkKGspfX1yZXR1cm4gbnVsbH1pbXBvcnRTY3JpcHQobCxiPXt9KXtsZXQgVD1adih0aGlzKSxrPUdyKFQpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihDLGQpe2lmKCFrfHwhSG4oay5zZW5kKSlyZXR1cm4gZChuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbXBvcnQgc2NyaXB0ICIke2x9Iiwgbm8gdGFza0NlbnRlciAoJHtUfSkgbWF0Y2hlZC5gKSk7dHJ5e2suc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2wsYl0se2NhbGxiYWNrOlttPT5DKG0pLG09PmQobSldfSl9Y2F0Y2gobSl7ZChtKX19KX19O2Z1bmN0aW9uIGYxKHYsbCl7bGV0IGI9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYi5zZXJ2aWNlPU9iamVjdC5jcmVhdGUobnVsbCksSWwuZm9yRWFjaCgoe25hbWU6VCxvcHRpb25zOmt9KT0+e2xldCBDPWsuY3JlYXRlO2lmKEMpdHJ5e2xldCBkPUModixsKTtEaShiLnNlcnZpY2UsZCksRGkoYixkLmluc3RhbmNlKX1jYXRjaChkKXtjb25zb2xlLmVycm9yKGBbSlMgUnVudGltZV0gRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlICR7VH0uYCl9fSksZGVsZXRlIGIuc2VydmljZS5pbnN0YW5jZSxwcyhiLnNlcnZpY2UpLGJ9dmFyIGQxPXt1aWQ6MH0saDE9YXYod3UpLHAxPW92KHd1KTtmdW5jdGlvbiBYdih2LGwsYil7bGV0IFQ9bmV3IF9mKHYsbCksaz0iVnVlIixDPWYxKHYse3dlZXg6VCxudnVlOlQsY29uZmlnOmwsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazprfSk7cHMoQyk7bGV0IGQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gRGkoZCxFMShUKSksRGkoZCxDLHtTaGFyZWRPYmplY3Q6ZDEsd2VleDpULG52dWU6VCxyZXF1aXJlTW9kdWxlOm09PlQucmVxdWlyZU1vZHVsZShtKSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186d2Qsc2VydmljZXM6Q30pLGQucGx1cz1uZXcgZC5XZWV4UGx1cyhUKSxkLlZ1ZVNoYXJlZD13dSxkLlVuaVNoYXJlZD1oMSxkLlZ1ZVJlYWN0aXZpdHk9cDEsVnYodixkKSxwcyhkKSxkfWZ1bmN0aW9uIGcxKHYsbCxiPXt9KXtsZXQgVD0iVnVlIjtiPXVkKGIpLGIuZW52PXVkKGdsb2JhbC5XWEVudmlyb25tZW50fHx7fSksYi5idW5kbGVUeXBlPVQ7bGV0IGs9WHYodixiKTt2MShsLGspfWZ1bmN0aW9uIHYxKHYsbCl7bGV0IGI9W10sVD1bXTtmb3IobGV0IGQgaW4gbCliLnB1c2goZCksVC5wdXNoKGxbZF0pO2xldCBDPSIoZnVuY3Rpb24gKGdsb2JhbCkgeyAiK2AKZ2xvYmFsID0gKGZ1bmN0aW9uICgpIHsKICB2YXIgZwogIC8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlCiAgZyA9IChmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpcwogIH0pKCkKICB0cnkgewogICAgLy8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApCiAgICBnID0gZyB8fCBuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKQogIH0gY2F0Y2ggKGUpIHsKICAgIC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlCiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIpIGcgPSB3aW5kb3cKICB9CiAgcmV0dXJuIGcKfSkoKSB8fCBnbG9iYWw7CmArdisiIH0pKE9iamVjdC5jcmVhdGUodGhpcykpIjtyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmIsQykoLi4uVCl9ZnVuY3Rpb24gbTEodil7bGV0IGw9cmwodik7dHJ5e2lmKGwmJmwuYm9keSlyZXR1cm4gbC5ib2R5LnRvSlNPTigpfWNhdGNoKGIpe2NvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBnZXQgdGhlIHZpcnR1YWwgZG9tIHRyZWUuIik7cmV0dXJufX1mdW5jdGlvbiBfMSh2KXtLZyh2KSxJbC5mb3JFYWNoKGw9PntsZXQgYj1sLm9wdGlvbnMuZGVzdHJveTtiJiZiKHYpfSl9ZnVuY3Rpb24gYjEodil7WmcodiksSWwuZm9yRWFjaChsPT57bGV0IGI9bC5vcHRpb25zLnJlZnJlc2g7YiYmYih2KX0pfXZhciB5MT17Y3JlYXRlSW5zdGFuY2U6ZzEsY3JlYXRlSW5zdGFuY2VDb250ZXh0Olh2LGdldFJvb3Q6bTEsZ2V0RG9jdW1lbnQ6cmwscmVnaXN0ZXJTZXJ2aWNlOmdmLHVucmVnaXN0ZXJTZXJ2aWNlOnZmLGNhbGxKUyh2LGwpe3JldHVybiB3ZCh2LGwpfSxyZWdpc3RlckNvbXBvbmVudHM6Q3YscmVnaXN0ZXJNb2R1bGVzOnd2LGRlc3Ryb3lJbnN0YW5jZTpfMSxyZWZyZXNoSW5zdGFuY2U6YjF9O2Z1bmN0aW9uIHhkKCl7cmV0dXJuIEV2KCkseTF9ZnVuY3Rpb24gRTEodil7aWYoZ2xvYmFsLnNldFRpbWVvdXQmJmdsb2JhbC5zZXRJbnRlcnZhbClyZXR1cm57c2V0VGltZW91dDpnbG9iYWwuc2V0VGltZW91dCxzZXRJbnRlcnZhbDpnbG9iYWwuc2V0SW50ZXJ2YWwsY2xlYXJUaW1lb3V0Omdsb2JhbC5jbGVhclRpbWVvdXQsY2xlYXJJbnRlcnZhbDpnbG9iYWwuY2xlYXJJbnRlcnZhbH07bGV0IGw9di5yZXF1aXJlTW9kdWxlKCJ0aW1lciIpO3JldHVybntzZXRUaW1lb3V0OiguLi5UKT0+e2xldCBrPWZ1bmN0aW9uKCl7VFswXSguLi5ULnNsaWNlKDIpKX07cmV0dXJuIGwuc2V0VGltZW91dChrLFRbMV0pLHYuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKX0sc2V0SW50ZXJ2YWw6KC4uLlQpPT57bGV0IGs9ZnVuY3Rpb24oKXtUWzBdKC4uLlQuc2xpY2UoMikpfTtyZXR1cm4gbC5zZXRJbnRlcnZhbChrLFRbMV0pLHYuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKX0sY2xlYXJUaW1lb3V0OlQ9PntsLmNsZWFyVGltZW91dChUKX0sY2xlYXJJbnRlcnZhbDpUPT57bC5jbGVhckludGVydmFsKFQpfX19dmFyIFF2PXtEb2N1bWVudDpBYSxFbGVtZW50OlJvLENvbW1lbnQ6cmMsTGlzdGVuZXI6SGMsVGFza0NlbnRlcjokYyxzZW5kVGFza3MoLi4udil7cmV0dXJuIEhuKGNhbGxOYXRpdmUpP2NhbGxOYXRpdmUoLi4udik6KGdsb2JhbC5jYWxsTmF0aXZlfHwoKCk9Pnt9KSkoLi4udil9fTtBYS5oYW5kbGVyPVF2LnNlbmRUYXNrczt2YXIgb2M9UXY7ZnVuY3Rpb24gdzEoKXtwcyhvYy5Db21tZW50KSxwcyhvYy5MaXN0ZW5lcikscHMob2MuRG9jdW1lbnQucHJvdG90eXBlKSxwcyhvYy5Db21tZW50LnByb3RvdHlwZSkscHMob2MuTGlzdGVuZXIucHJvdG90eXBlKX12YXIgYmY9e3NlcnZpY2U6e3JlZ2lzdGVyOmdmLHVucmVnaXN0ZXI6dmYsaGFzOk9kfSxmcmVlemVQcm90b3R5cGU6dzEsaW5pdDp4ZCxjb25maWc6b2N9O3ZhciBCZD1jbGFzc3tjb25zdHJ1Y3RvcihsLGI9e30pe3RoaXMudHlwZT1sfHwibWVzc2FnZSIsdGhpcy5kYXRhPWIuZGF0YXx8bnVsbCx0aGlzLm9yaWdpbj1iLm9yaWdpbnx8IiIsdGhpcy5zb3VyY2U9Yi5zb3VyY2V8fG51bGwsdGhpcy5wb3J0cz1iLnBvcnRzfHxbXSx0aGlzLnRhcmdldD1udWxsLHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9fTt2YXIgUGw9e30sVHU9e307ZnVuY3Rpb24gTWQoKXt9TWQucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2Nsb3NlZCl0aHJvdyBuZXcgRXJyb3IoYEJyb2FkY2FzdENoYW5uZWwgIiR7dGhpcy5uYW1lfSIgaXMgY2xvc2VkLmApO2xldCBsPVBsW3RoaXMubmFtZV07aWYobCYmbC5sZW5ndGgpZm9yKGxldCBiPTA7YjxsLmxlbmd0aDsrK2Ipe2xldCBUPWxbYl07VC5fY2xvc2VkfHxUPT09dGhpc3x8SG4oVC5vbm1lc3NhZ2UpJiZULm9ubWVzc2FnZShuZXcgQmQoIm1lc3NhZ2UiLHtkYXRhOnZ9KSl9fTtNZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5fY2xvc2VkJiYodGhpcy5fY2xvc2VkPSEwLFBsW3RoaXMubmFtZV0pKXtsZXQgdj1QbFt0aGlzLm5hbWVdLmZpbHRlcihsPT5sIT09dGhpcyk7di5sZW5ndGg/UGxbdGhpcy5uYW1lXT12OmRlbGV0ZSBQbFt0aGlzLm5hbWVdfX07dmFyIGVtPXtjcmVhdGU6dj0+e2lmKFR1W3ZdPVtdLEhuKGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKSlyZXR1cm57fTtsZXQgbD17QnJvYWRjYXN0Q2hhbm5lbDpmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOlN0cmluZyhiKX0pLHRoaXMuX2Nsb3NlZD0hMSx0aGlzLm9ubWVzc2FnZT1udWxsLFBsW3RoaXMubmFtZV18fChQbFt0aGlzLm5hbWVdPVtdKSxQbFt0aGlzLm5hbWVdLnB1c2godGhpcyksVHVbdl0ucHVzaCh0aGlzKX19O3JldHVybiBsLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPU1kLnByb3RvdHlwZSx7aW5zdGFuY2U6bH19LGRlc3Ryb3k6dj0+e1R1W3ZdJiYoVHVbdl0uZm9yRWFjaChsPT5sLmNsb3NlKCkpLGRlbGV0ZSBUdVt2XSl9fTtmdW5jdGlvbiBEZCgpe2xldHtpbml0OnZ9PWJmO2JmLnNlcnZpY2UucmVnaXN0ZXIoIkJyb2FkY2FzdENoYW5uZWwiLGVtKSxiZi5mcmVlemVQcm90b3R5cGUoKTtsZXQgbD12KCk7Zm9yKGxldCBiIGluIGwpZ2xvYmFsW2JdPSguLi5UKT0+e2xldCBrPWxbYl0oLi4uVCk7cmV0dXJuIGsgaW5zdGFuY2VvZiBFcnJvciYmY29uc29sZS5lcnJvcihrLnRvU3RyaW5nKCkpLGt9fXZhciB4eD1nbG9iYWwuY29uc29sZTtmdW5jdGlvbiB0bSgpe2lmKGx2KCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtIT09IldlYiIpZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOiguLi52KT0+e2lyKCJkZWJ1ZyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLkl1KHYpLCJfX0RFQlVHIil9LGxvZzooLi4udik9PntpcigibG9nIikmJmdsb2JhbC5uYXRpdmVMb2coLi4uSXUodiksIl9fTE9HIil9LGluZm86KC4uLnYpPT57aXIoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5JdSh2KSwiX19JTkZPIil9LHdhcm46KC4uLnYpPT57aXIoIndhcm4iKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5JdSh2KSwiX19XQVJOIil9LGVycm9yOiguLi52KT0+e2lyKCJlcnJvciIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLkl1KHYpLCJfX0VSUk9SIil9fTtlbHNle2xldHtkZWJ1Zzp2LGxvZzpsLGluZm86Yix3YXJuOlQsZXJyb3I6a309Y29uc29sZTtjb25zb2xlLl9fb3JpX189e2RlYnVnOnYsbG9nOmwsaW5mbzpiLHdhcm46VCxlcnJvcjprfSxjb25zb2xlLmRlYnVnPSguLi5DKT0+e2lyKCJkZWJ1ZyIpJiZjb25zb2xlLl9fb3JpX18uZGVidWcuYXBwbHkoY29uc29sZSxDKX0sY29uc29sZS5sb2c9KC4uLkMpPT57aXIoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsQyl9LGNvbnNvbGUuaW5mbz0oLi4uQyk9PntpcigiaW5mbyIpJiZjb25zb2xlLl9fb3JpX18uaW5mby5hcHBseShjb25zb2xlLEMpfSxjb25zb2xlLndhcm49KC4uLkMpPT57aXIoIndhcm4iKSYmY29uc29sZS5fX29yaV9fLndhcm4uYXBwbHkoY29uc29sZSxDKX0sY29uc29sZS5lcnJvcj0oLi4uQyk9PntpcigiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsQyl9fX1mdW5jdGlvbiBJdSh2KXtyZXR1cm4gdi5tYXAobD0+e2lmKExzKGwpLnRvTG93ZXJDYXNlKCk9PT0iW29iamVjdCBvYmplY3RdIil0cnl7bD1KU09OLnN0cmluZ2lmeShsKX1jYXRjaChUKXtsPSJbb2JqZWN0IG9iamVjdF0ifWVsc2UgbD1TdHJpbmcobCk7cmV0dXJuIGx9KX10bSgpO0RkKCk7fSkoKTsK