$(echo PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBYaWFvZXIgQUkgUHVibGlzaCBBUEkKICogRGVzY3JpcHRpb246IOS4uuWklumDqCBBSSDlhpnkvZzlt6XkvZzmtYHmj5DkvpvluKYgU0VPIOWtl+auteeahOaWh+eroOWPkeW4g+aOpeWPo++8iHhpYW9lci92Me+8ieOAggogKiBWZXJzaW9uOiAxLjAuMAogKi8KCmRlZmluZWQoJ0FCU1BBVEgnKSB8fCBleGl0OwoKZGVmaW5lKCdYSUFPRVJfUFVCX0tFWV9GSUxFJywgJy93d3cvc2VydmVyL3hpYW9lci1zZXR0aW5ncy9wdWJsaXNoLWtleS5waHAnKTsKZGVmaW5lKCdYSUFPRVJfUFVCX0xPRycsIFdQX0NPTlRFTlRfRElSIC4gJy8ueGlhb2VyLXB1Ymxpc2gubG9nJyk7CmRlZmluZSgnWElBT0VSX1BVQl9TRUVOJywgJ3hpYW9lcl9wdWJfc2VlbicpOwpkZWZpbmUoJ1hJQU9FUl9QVUJfQ0FDSEVfRElSJywgJy93d3cvc2VydmVyL2Zhc3RjZ2lfY2FjaGUnKTsKZGVmaW5lKCdYSUFPRVJfUFVCX0JSQU5EJywgJ+Wwj+S6jOmhueebrue9kScpOwpkZWZpbmUoJ1hJQU9FUl9QVUJfQ0ROX0hPU1QnLCAnY2RuLnhpYW9lcnByby5jb20nKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqIOWfuuehgOiuvuaWvQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmZ1bmN0aW9uIHhpYW9lcl9wdWJfa2V5KCkKewogICAgc3RhdGljICRrZXkgPSBudWxsOwogICAgaWYgKCRrZXkgIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gJGtleTsKICAgIH0KICAgICRrZXkgPSAnJzsKICAgIGlmIChpc19yZWFkYWJsZShYSUFPRVJfUFVCX0tFWV9GSUxFKSkgewogICAgICAgICRkYXRhID0gaW5jbHVkZSBYSUFPRVJfUFVCX0tFWV9GSUxFOwogICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkgJiYgIWVtcHR5KCRkYXRhWydrZXknXSkgJiYgaXNfc3RyaW5nKCRkYXRhWydrZXknXSkpIHsKICAgICAgICAgICAgJGtleSA9ICRkYXRhWydrZXknXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJGtleTsKfQoKZnVuY3Rpb24geGlhb2VyX3B1Yl9sb2coJG1zZykKewogICAgaWYgKCFpc19zdHJpbmcoJG1zZykpIHsKICAgICAgICAkbXNnID0gd3BfanNvbl9lbmNvZGUoJG1zZyk7CiAgICB9CiAgICBAZmlsZV9wdXRfY29udGVudHMoWElBT0VSX1BVQl9MT0csIGRhdGUoJ1ktbS1kIEg6aTpzJykgLiAnICcgLiAkbXNnIC4gIlxuIiwgRklMRV9BUFBFTkQpOwogICAgaWYgKEBmaWxlc2l6ZShYSUFPRVJfUFVCX0xPRykgPiAxMDQ4NTc2KSB7CiAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKFhJQU9FUl9QVUJfTE9HLCAnJyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHhpYW9lcl9wdWJfYXV0aCgkcmVxdWVzdCkKewogICAgaWYgKHhpYW9lcl9wdWJfa2V5KCkgPT09ICcnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX25vX2tleScsICfmnI3liqHnq6/mnKrphY3nva7lj5HluIPlr4bpkqUnLCBhcnJheSgnc3RhdHVzJyA9PiA1MDMpKTsKICAgIH0KCiAgICAkZ2l2ZW4gPSAoc3RyaW5nKSAkcmVxdWVzdC0+Z2V0X2hlYWRlcigneF94aWFvZXJfa2V5Jyk7CiAgICBpZiAoJGdpdmVuID09PSAnJykgewogICAgICAgICRhdXRoID0gKHN0cmluZykgJHJlcXVlc3QtPmdldF9oZWFkZXIoJ2F1dGhvcml6YXRpb24nKTsKICAgICAgICBpZiAoJGF1dGggIT09ICcnICYmIHN0cmlwb3MoJGF1dGgsICdiZWFyZXIgJykgPT09IDApIHsKICAgICAgICAgICAgJGdpdmVuID0gdHJpbShzdWJzdHIoJGF1dGgsIDcpKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRnaXZlbiA9PT0gJycgfHwgIWhhc2hfZXF1YWxzKHhpYW9lcl9wdWJfa2V5KCksICRnaXZlbikpIHsKICAgICAgICB4aWFvZXJfcHViX2xvZygnYXV0aF9mYWlsIGlwPScgLiAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJz8nKSk7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX2ZvcmJpZGRlbicsICflr4bpkqXml6DmlYgnLCBhcnJheSgnc3RhdHVzJyA9PiA0MDEpKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiDot6/nlLEKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24gKCkgewogICAgJHBlcm0gPSAneGlhb2VyX3B1Yl9hdXRoJzsKCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCd4aWFvZXIvdjEnLCAnL2hlYWx0aCcsIGFycmF5KAogICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnR0VUJywKICAgICAgICAncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJHBlcm0sCiAgICAgICAgJ2NhbGxiYWNrJyAgICAgICAgICAgID0+IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ29rJyAgICAgID0+IHRydWUsCiAgICAgICAgICAgICAgICAnc2l0ZScgICAgPT4gaG9tZV91cmwoJy8nKSwKICAgICAgICAgICAgICAgICdicmFuZCcgICA9PiBYSUFPRVJfUFVCX0JSQU5ELAogICAgICAgICAgICAgICAgJ3RpbWUnICAgID0+IGN1cnJlbnRfdGltZSgnbXlzcWwnKSwKICAgICAgICAgICAgICAgICd2ZXJzaW9uJyA9PiAnMS4wLjAnLAogICAgICAgICAgICApOwogICAgICAgIH0sCiAgICApKTsKCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCd4aWFvZXIvdjEnLCAnL2NvbnRleHQnLCBhcnJheSgKICAgICAgICAnbWV0aG9kcycgICAgICAgICAgICAgPT4gJ0dFVCcsCiAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICRwZXJtLAogICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiAneGlhb2VyX3B1Yl9jb250ZXh0JywKICAgICkpOwoKICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3hpYW9lci92MScsICcvcHVibGlzaCcsIGFycmF5KAogICAgICAgICdtZXRob2RzJyAgICAgICAgICAgICA9PiAnUE9TVCcsCiAgICAgICAgJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+ICRwZXJtLAogICAgICAgICdjYWxsYmFjaycgICAgICAgICAgICA9PiAneGlhb2VyX3B1Yl9wdWJsaXNoJywKICAgICkpOwp9KTsKCmZ1bmN0aW9uIHhpYW9lcl9wdWJfY29udGV4dCgpCnsKICAgICRjYXRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKGdldF9jYXRlZ29yaWVzKGFycmF5KCdoaWRlX2VtcHR5JyA9PiBmYWxzZSkpIGFzICRjKSB7CiAgICAgICAgJGNhdHNbXSA9IGFycmF5KAogICAgICAgICAgICAnaWQnICAgID0+IChpbnQpICRjLT50ZXJtX2lkLAogICAgICAgICAgICAnbmFtZScgID0+ICRjLT5uYW1lLAogICAgICAgICAgICAnc2x1ZycgID0+ICRjLT5zbHVnLAogICAgICAgICAgICAnY291bnQnID0+IChpbnQpICRjLT5jb3VudCwKICAgICAgICApOwogICAgfQoKICAgICRyZWNlbnQgPSBhcnJheSgpOwogICAgJHEgICAgICA9IG5ldyBXUF9RdWVyeShhcnJheSgKICAgICAgICAncG9zdF90eXBlJyAgICAgICAgICAgPT4gJ3Bvc3QnLAogICAgICAgICdwb3N0X3N0YXR1cycgICAgICAgICA9PiAncHVibGlzaCcsCiAgICAgICAgJ3Bvc3RzX3Blcl9wYWdlJyAgICAgID0+IDQwLAogICAgICAgICdpZ25vcmVfc3RpY2t5X3Bvc3RzJyA9PiB0cnVlLAogICAgICAgICdub19mb3VuZF9yb3dzJyAgICAgICA9PiB0cnVlLAogICAgKSk7CiAgICBmb3JlYWNoICgkcS0+cG9zdHMgYXMgJHApIHsKICAgICAgICAkcmVjZW50W10gPSBhcnJheSgKICAgICAgICAgICAgJ2lkJyAgICA9PiAoaW50KSAkcC0+SUQsCiAgICAgICAgICAgICd0aXRsZScgPT4gZ2V0X3RoZV90aXRsZSgkcCksCiAgICAgICAgICAgICdkYXRlJyAgPT4gJHAtPnBvc3RfZGF0ZSwKICAgICAgICAgICAgJ2xpbmsnICA9PiBnZXRfcGVybWFsaW5rKCRwKSwKICAgICAgICApOwogICAgfQogICAgd3BfcmVzZXRfcG9zdGRhdGEoKTsKCiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ29rJyAgICAgICAgID0+IHRydWUsCiAgICAgICAgJ3NpdGUnICAgICAgID0+IGFycmF5KCduYW1lJyA9PiBnZXRfYmxvZ2luZm8oJ25hbWUnKSwgJ3VybCcgPT4gaG9tZV91cmwoJy8nKSksCiAgICAgICAgJ2JyYW5kJyAgICAgID0+IFhJQU9FUl9QVUJfQlJBTkQsCiAgICAgICAgJ2NhdGVnb3JpZXMnID0+ICRjYXRzLAogICAgICAgICdyZWNlbnQnICAgICA9PiAkcmVjZW50LAogICAgICAgICdydWxlcycgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgJ3Nlb190aXRsZV9tYXgnID0+IDQ1LAogICAgICAgICAgICAnc2VvX2Rlc2NfbWluJyAgPT4gNzAsCiAgICAgICAgICAgICdzZW9fZGVzY19tYXgnICA9PiAxMTAsCiAgICAgICAgICAgICdib2R5X21pbl9jaGFycycgPT4gOTAwLAogICAgICAgICksCiAgICApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiDlhoXlrrnlpITnkIYKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jdGlvbiB4aWFvZXJfcHViX2NsZWFuX2h0bWwoJGh0bWwpCnsKICAgICRodG1sID0gKHN0cmluZykgJGh0bWw7CiAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgnIzwoc2NyaXB0fHN0eWxlfGlmcmFtZXxvYmplY3R8ZW1iZWR8Zm9ybXxsaW5rfG1ldGEpXGJbXj5dKj4uKj88L1wxPiNpcycsICcnLCAkaHRtbCk7CiAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgnIzwoc2NyaXB0fHN0eWxlfGlmcmFtZXxvYmplY3R8ZW1iZWR8Zm9ybXxsaW5rfG1ldGEpXGJbXj5dKi8/PiNpcycsICcnLCAkaHRtbCk7CiAgICAkaHRtbCA9IHdwX2tzZXNfcG9zdCgkaHRtbCk7CiAgICAkaHRtbCA9IHByZWdfcmVwbGFjZSgnIzxwPlxzKigmbmJzcDt8XHMpKjwvcD4jaXUnLCAnJywgJGh0bWwpOwogICAgcmV0dXJuIHRyaW0oJGh0bWwpOwp9CgpmdW5jdGlvbiB4aWFvZXJfcHViX3RleHRfbGVuKCRodG1sKQp7CiAgICAkdGV4dCA9IHdwX3N0cmlwX2FsbF90YWdzKChzdHJpbmcpICRodG1sKTsKICAgICR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvXHMrL3UnLCAnJywgJHRleHQpOwogICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgPyBtYl9zdHJsZW4oJHRleHQsICdVVEYtOCcpIDogc3RybGVuKCR0ZXh0KTsKfQoKZnVuY3Rpb24geGlhb2VyX3B1Yl9ub3JtX3RpdGxlKCR0aXRsZSkKewogICAgJHQgPSB3cF9zdHJpcF9hbGxfdGFncygoc3RyaW5nKSAkdGl0bGUpOwogICAgJHQgPSBwcmVnX3JlcGxhY2UoJy9bXHNceHszMDAwfV0rL3UnLCAnJywgJHQpOwogICAgJHQgPSBwcmVnX3JlcGxhY2UoJy9bXHB7UH1ccHtTfV0rL3UnLCAnJywgJHQpOwogICAgcmV0dXJuIG1iX3N0cnRvbG93ZXIodHJpbSgkdCksICdVVEYtOCcpOwp9CgpmdW5jdGlvbiB4aWFvZXJfcHViX3Jlc29sdmVfY2F0ZWdvcnkoJGFyZ3MpCnsKICAgIGlmICghZW1wdHkoJGFyZ3NbJ2NhdGVnb3J5X2lkJ10pKSB7CiAgICAgICAgJHRlcm0gPSBnZXRfdGVybSgoaW50KSAkYXJnc1snY2F0ZWdvcnlfaWQnXSwgJ2NhdGVnb3J5Jyk7CiAgICAgICAgaWYgKCR0ZXJtICYmICFpc193cF9lcnJvcigkdGVybSkpIHsKICAgICAgICAgICAgcmV0dXJuIChpbnQpICR0ZXJtLT50ZXJtX2lkOwogICAgICAgIH0KICAgIH0KICAgIGlmICghZW1wdHkoJGFyZ3NbJ2NhdGVnb3J5J10pKSB7CiAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpICRhcmdzWydjYXRlZ29yeSddKTsKICAgICAgICAkdGVybSA9IGdldF90ZXJtX2J5KCduYW1lJywgJG5hbWUsICdjYXRlZ29yeScpOwogICAgICAgIGlmICghJHRlcm0pIHsKICAgICAgICAgICAgJHRlcm0gPSBnZXRfdGVybV9ieSgnc2x1ZycsIHNhbml0aXplX3RpdGxlKCRuYW1lKSwgJ2NhdGVnb3J5Jyk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGVybSAmJiAhaXNfd3BfZXJyb3IoJHRlcm0pKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAkdGVybS0+dGVybV9pZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX2JhZF9jYXRlZ29yeScsICfliIbnsbvkuI3lrZjlnKjvvJonIC4gJG5hbWUsIGFycmF5KCdzdGF0dXMnID0+IDQwMCkpOwogICAgfQogICAgcmV0dXJuIChpbnQpIGdldF9vcHRpb24oJ2RlZmF1bHRfY2F0ZWdvcnknKTsKfQoKZnVuY3Rpb24geGlhb2VyX3B1Yl9jZG5fdXJsKCR1cmwpCnsKICAgICR1cmwgPSB0cmltKChzdHJpbmcpICR1cmwpOwogICAgaWYgKCR1cmwgPT09ICcnIHx8IHN0cmlwb3MoJHVybCwgJ2h0dHAnKSAhPT0gMCkgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgICRob3N0ID0gc3RydG9sb3dlcigoc3RyaW5nKSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKSk7CiAgICBpZiAoaW5fYXJyYXkoJGhvc3QsIGFycmF5KCd4aWFvZXJwcm8uY29tJywgJ3d3dy54aWFvZXJwcm8uY29tJyksIHRydWUpKSB7CiAgICAgICAgJHVybCA9IHByZWdfcmVwbGFjZSgnI15odHRwcz86Ly8od3d3XC4pP3hpYW9lcnByb1wuY29tI2knLCAnaHR0cHM6Ly8nIC4gWElBT0VSX1BVQl9DRE5fSE9TVCwgJHVybCk7CiAgICB9CiAgICByZXR1cm4gZXNjX3VybF9yYXcoJHVybCk7Cn0KCmZ1bmN0aW9uIHhpYW9lcl9wdWJfd3JpdGVfbWV0YSgkcG9zdF9pZCwgJGFycikKewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnemliX3VwZGF0ZV9vcHRpb25fbWV0YScpKSB7CiAgICAgICAgZm9yZWFjaCAoJGFyciBhcyAkayA9PiAkdikgewogICAgICAgICAgICBpZiAoJHYgIT09ICcnKSB7CiAgICAgICAgICAgICAgICB6aWJfdXBkYXRlX29wdGlvbl9tZXRhKCdwb3N0X21ldGEnLCAkaywgJHYsICRwb3N0X2lkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJ3ppYic7CiAgICB9CiAgICAkZGF0YSA9IGdldF9wb3N0X21ldGEoJHBvc3RfaWQsICd6aWJfb3RoZXJfZGF0YScsIHRydWUpOwogICAgJGRhdGEgPSBpc19hcnJheSgkZGF0YSkgPyAkZGF0YSA6IGFycmF5KCk7CiAgICBmb3JlYWNoICgkYXJyIGFzICRrID0+ICR2KSB7CiAgICAgICAgaWYgKCR2ICE9PSAnJykgewogICAgICAgICAgICAkZGF0YVska10gPSAkdjsKICAgICAgICB9CiAgICB9CiAgICB1cGRhdGVfcG9zdF9tZXRhKCRwb3N0X2lkLCAnemliX290aGVyX2RhdGEnLCAkZGF0YSk7CiAgICByZXR1cm4gJ2ZhbGxiYWNrJzsKfQoKZnVuY3Rpb24geGlhb2VyX3B1Yl9wdXJnZV9jYWNoZSgpCnsKICAgICRkaXIgPSBYSUFPRVJfUFVCX0NBQ0hFX0RJUjsKICAgIGlmICghaXNfZGlyKCRkaXIpIHx8ICFpc193cml0YWJsZSgkZGlyKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgICRuID0gMDsKICAgIGZvcmVhY2ggKChhcnJheSkgZ2xvYigkZGlyIC4gJy8qJywgR0xPQl9PTkxZRElSKSBhcyAkbDEpIHsKICAgICAgICBmb3JlYWNoICgoYXJyYXkpIGdsb2IoJGwxIC4gJy8qJywgR0xPQl9PTkxZRElSKSBhcyAkbDIpIHsKICAgICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSBnbG9iKCRsMiAuICcvKicpIGFzICRmKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZikgJiYgQHVubGluaygkZikpIHsKICAgICAgICAgICAgICAgICAgICAkbisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRuOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiDlj5HluIMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jdGlvbiB4aWFvZXJfcHViX3B1Ymxpc2goJHJlcXVlc3QpCnsKICAgICRwID0gJHJlcXVlc3QtPmdldF9qc29uX3BhcmFtcygpOwogICAgaWYgKCFpc19hcnJheSgkcCkgfHwgZW1wdHkoJHApKSB7CiAgICAgICAgJHAgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtcygpOwogICAgfQoKICAgICR0aXRsZSA9IGlzc2V0KCRwWyd0aXRsZSddKSA/IHRyaW0od3Bfc3RyaXBfYWxsX3RhZ3MoKHN0cmluZykgJHBbJ3RpdGxlJ10pKSA6ICcnOwogICAgJGh0bWwgID0gaXNzZXQoJHBbJ2h0bWwnXSkgPyAoc3RyaW5nKSAkcFsnaHRtbCddIDogKGlzc2V0KCRwWydjb250ZW50J10pID8gKHN0cmluZykgJHBbJ2NvbnRlbnQnXSA6ICcnKTsKCiAgICBpZiAoJHRpdGxlID09PSAnJyB8fCAkaHRtbCA9PT0gJycpIHsKICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKCd4aWFvZXJfYmFkX3JlcXVlc3QnLCAndGl0bGUg5ZKMIGh0bWwg5b+F5aGrJywgYXJyYXkoJ3N0YXR1cycgPT4gNDAwKSk7CiAgICB9CiAgICBpZiAobWJfc3RybGVuKCR0aXRsZSwgJ1VURi04JykgPiAxMjApIHsKICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKCd4aWFvZXJfYmFkX3RpdGxlJywgJ3RpdGxlIOi2hei/hyAxMjAg5a2XJywgYXJyYXkoJ3N0YXR1cycgPT4gNDAwKSk7CiAgICB9CgogICAgJGh0bWwgPSB4aWFvZXJfcHViX2NsZWFuX2h0bWwoJGh0bWwpOwogICAgJGxlbiAgPSB4aWFvZXJfcHViX3RleHRfbGVuKCRodG1sKTsKICAgIGlmICgkbGVuIDwgNjAwKSB7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX3Nob3J0JywgJ+ato+aWh+i/h+efre+8iCcgLiAkbGVuIC4gJyDlrZfvvInvvIzoh7PlsJEgNjAwIOWtlycsIGFycmF5KCdzdGF0dXMnID0+IDQwMCkpOwogICAgfQoKICAgIC8vIOmikeeOh+mZkOWItu+8muavj+Wwj+aXtuacgOWkmiAyMCDnr4cKICAgICRidWNrZXQgPSAneGlhb2VyX3B1Yl8nIC4gZGF0ZSgnWW1kSCcpOwogICAgJGNvdW50ICA9IChpbnQpIGdldF90cmFuc2llbnQoJGJ1Y2tldCk7CiAgICBpZiAoJGNvdW50ID49IDIwKSB7CiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX3JhdGUnLCAn5pys5bCP5pe25Y+R5biD5pWw5bey6L6+5LiK6ZmQIDIwJywgYXJyYXkoJ3N0YXR1cycgPT4gNDI5KSk7CiAgICB9CgogICAgLy8g6YCJ6aKY5Y676YeNCiAgICAkdG9waWNfa2V5ID0gaXNzZXQoJHBbJ3RvcGljX2tleSddKSA/IHNhbml0aXplX3RleHRfZmllbGQoKHN0cmluZykgJHBbJ3RvcGljX2tleSddKSA6ICcnOwogICAgaWYgKCR0b3BpY19rZXkgIT09ICcnKSB7CiAgICAgICAgJHNlZW4gPSAoYXJyYXkpIGdldF9vcHRpb24oWElBT0VSX1BVQl9TRUVOLCBhcnJheSgpKTsKICAgICAgICBpZiAoaXNzZXQoJHNlZW5bJHRvcGljX2tleV0pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV1BfRXJyb3IoJ3hpYW9lcl9kdXBfdG9waWMnLCAn6YCJ6aKY5bey5YaZ6L+H77yaJyAuICR0b3BpY19rZXksIGFycmF5KAogICAgICAgICAgICAgICAgJ3N0YXR1cycgPT4gNDA5LAogICAgICAgICAgICAgICAgJ2V4aXN0aW5nX3Bvc3QnID0+IChpbnQpICRzZWVuWyR0b3BpY19rZXldLAogICAgICAgICAgICApKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g5qCH6aKY5Y676YeNCiAgICAkbm9ybSAgICAgPSB4aWFvZXJfcHViX25vcm1fdGl0bGUoJHRpdGxlKTsKICAgICRleGlzdGluZyA9IGdldF9wYWdlX2J5X3RpdGxlKCR0aXRsZSwgT0JKRUNULCAncG9zdCcpOwogICAgaWYgKCRleGlzdGluZyAmJiB4aWFvZXJfcHViX25vcm1fdGl0bGUoJGV4aXN0aW5nLT5wb3N0X3RpdGxlKSA9PT0gJG5vcm0pIHsKICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKCd4aWFvZXJfZHVwX3RpdGxlJywgJ+WQjOWQjeaWh+eroOW3suWtmOWcqCcsIGFycmF5KAogICAgICAgICAgICAnc3RhdHVzJyAgID0+IDQwOSwKICAgICAgICAgICAgJ2V4aXN0aW5nX3Bvc3QnID0+IChpbnQpICRleGlzdGluZy0+SUQsCiAgICAgICAgICAgICdleGlzdGluZ19saW5rJyA9PiBnZXRfcGVybWFsaW5rKCRleGlzdGluZyksCiAgICAgICAgKSk7CiAgICB9CgogICAgJGNhdCA9IHhpYW9lcl9wdWJfcmVzb2x2ZV9jYXRlZ29yeSgkcCk7CiAgICBpZiAoaXNfd3BfZXJyb3IoJGNhdCkpIHsKICAgICAgICByZXR1cm4gJGNhdDsKICAgIH0KCiAgICAkc3RhdHVzID0gaXNzZXQoJHBbJ3N0YXR1cyddKSA/IHN0cnRvbG93ZXIoKHN0cmluZykgJHBbJ3N0YXR1cyddKSA6ICdkcmFmdCc7CiAgICBpZiAoIWluX2FycmF5KCRzdGF0dXMsIGFycmF5KCdkcmFmdCcsICdwdWJsaXNoJywgJ2Z1dHVyZScsICdwZW5kaW5nJyksIHRydWUpKSB7CiAgICAgICAgJHN0YXR1cyA9ICdkcmFmdCc7CiAgICB9CgogICAgJHBvc3RfZGF0ZSAgICAgPSAnJzsKICAgICRwb3N0X2RhdGVfZ210ID0gJyc7CiAgICBpZiAoJHN0YXR1cyA9PT0gJ2Z1dHVyZScpIHsKICAgICAgICAkYXQgPSBpc3NldCgkcFsncHVibGlzaF9hdCddKSA/IHRyaW0oKHN0cmluZykgJHBbJ3B1Ymxpc2hfYXQnXSkgOiAnJzsKICAgICAgICAkdHMgPSAkYXQgPyBzdHJ0b3RpbWUoJGF0KSA6IGZhbHNlOwogICAgICAgIGlmICghJHRzIHx8ICR0cyA8PSB0aW1lKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigneGlhb2VyX2JhZF9kYXRlJywgJ2Z1dHVyZSDnirbmgIHpnIDopoHlkIjms5XnmoQgcHVibGlzaF9hdO+8iOacquadpeaXtumXtO+8jOagvOW8jyBZWVlZLU1NLUREIEhIOk1NOlNT77yJJywgYXJyYXkoJ3N0YXR1cycgPT4gNDAwKSk7CiAgICAgICAgfQogICAgICAgICRwb3N0X2RhdGUgICAgID0gZGF0ZSgnWS1tLWQgSDppOnMnLCAkdHMpOwogICAgICAgICRwb3N0X2RhdGVfZ210ID0gZ21kYXRlKCdZLW0tZCBIOmk6cycsICR0cyk7CiAgICB9CgogICAgJGF1dGhvcl9pZCA9IGlzc2V0KCRwWydhdXRob3JfaWQnXSkgPyAoaW50KSAkcFsnYXV0aG9yX2lkJ10gOiAxOwogICAgaWYgKCFnZXRfdXNlcmRhdGEoJGF1dGhvcl9pZCkpIHsKICAgICAgICAkYXV0aG9yX2lkID0gMTsKICAgIH0KCiAgICAkZGVzYyA9IGlzc2V0KCRwWydzZW9fZGVzY3JpcHRpb24nXSkgPyB0cmltKHdwX3N0cmlwX2FsbF90YWdzKChzdHJpbmcpICRwWydzZW9fZGVzY3JpcHRpb24nXSkpIDogJyc7CiAgICBpZiAoJGRlc2MgPT09ICcnKSB7CiAgICAgICAgJGRlc2MgPSB3cF90cmltX3dvcmRzKHdwX3N0cmlwX2FsbF90YWdzKCRodG1sKSwgNjAsICfigKYnKTsKICAgIH0KICAgICRkZXNjID0gbWJfc3Vic3RyKHByZWdfcmVwbGFjZSgnL1xzKy91JywgJyAnLCAkZGVzYyksIDAsIDE2MCwgJ1VURi04Jyk7CgogICAgJHBvc3RhcnIgPSBhcnJheSgKICAgICAgICAncG9zdF90aXRsZScgICAgPT4gJHRpdGxlLAogICAgICAgICdwb3N0X2NvbnRlbnQnICA9PiAkaHRtbCwKICAgICAgICAncG9zdF9zdGF0dXMnICAgPT4gJHN0YXR1cywKICAgICAgICAncG9zdF90eXBlJyAgICAgPT4gJ3Bvc3QnLAogICAgICAgICdwb3N0X2F1dGhvcicgICA9PiAkYXV0aG9yX2lkLAogICAgICAgICdwb3N0X2NhdGVnb3J5JyA9PiBhcnJheSgkY2F0KSwKICAgICAgICAncG9zdF9leGNlcnB0JyAgPT4gJGRlc2MsCiAgICApOwogICAgaWYgKCRwb3N0X2RhdGUgIT09ICcnKSB7CiAgICAgICAgJHBvc3RhcnJbJ3Bvc3RfZGF0ZSddICAgICA9ICRwb3N0X2RhdGU7CiAgICAgICAgJHBvc3RhcnJbJ3Bvc3RfZGF0ZV9nbXQnXSA9ICRwb3N0X2RhdGVfZ210OwogICAgfQoKICAgICRwb3N0X2lkID0gd3BfaW5zZXJ0X3Bvc3QoJHBvc3RhcnIsIHRydWUpOwogICAgaWYgKGlzX3dwX2Vycm9yKCRwb3N0X2lkKSkgewogICAgICAgIHhpYW9lcl9wdWJfbG9nKCdpbnNlcnRfZmFpbCAnIC4gJHBvc3RfaWQtPmdldF9lcnJvcl9tZXNzYWdlKCkpOwogICAgICAgIHJldHVybiBuZXcgV1BfRXJyb3IoJ3hpYW9lcl9pbnNlcnQnLCAn5YaZ5YWl5aSx6LSl77yaJyAuICRwb3N0X2lkLT5nZXRfZXJyb3JfbWVzc2FnZSgpLCBhcnJheSgnc3RhdHVzJyA9PiA1MDApKTsKICAgIH0KCiAgICAvLyDmoIfnrb4KICAgICR0YWdzID0gYXJyYXkoKTsKICAgIGlmICghZW1wdHkoJHBbJ3RhZ3MnXSkpIHsKICAgICAgICAkdGFncyA9IGlzX2FycmF5KCRwWyd0YWdzJ10pID8gJHBbJ3RhZ3MnXSA6IHByZWdfc3BsaXQoJy9bLO+8jOOAgVxzXSsvdScsIChzdHJpbmcpICRwWyd0YWdzJ10pOwogICAgICAgICR0YWdzID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ3RyaW0nLCAkdGFncykpKTsKICAgICAgICAkdGFncyA9IGFycmF5X3NsaWNlKCR0YWdzLCAwLCA2KTsKICAgICAgICBpZiAoJHRhZ3MpIHsKICAgICAgICAgICAgd3Bfc2V0X3Bvc3RfdGFncygkcG9zdF9pZCwgJHRhZ3MsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gU0VPIOWtl+autQogICAgJHNlb190aXRsZSA9IGlzc2V0KCRwWydzZW9fdGl0bGUnXSkgPyB0cmltKHdwX3N0cmlwX2FsbF90YWdzKChzdHJpbmcpICRwWydzZW9fdGl0bGUnXSkpIDogJyc7CiAgICBpZiAoJHNlb190aXRsZSA9PT0gJycpIHsKICAgICAgICAkc2VvX3RpdGxlID0gJHRpdGxlIC4gJyAtICcgLiBYSUFPRVJfUFVCX0JSQU5EOwogICAgfQogICAgaWYgKG1iX3N0cnBvcygkc2VvX3RpdGxlLCBYSUFPRVJfUFVCX0JSQU5EKSA9PT0gZmFsc2UpIHsKICAgICAgICAkc2VvX3RpdGxlIC49ICcgLSAnIC4gWElBT0VSX1BVQl9CUkFORDsKICAgIH0KICAgICRzZW9fdGl0bGUgPSBtYl9zdWJzdHIoJHNlb190aXRsZSwgMCwgNjAsICdVVEYtOCcpOwoKICAgICRrZXl3b3JkcyA9IGlzc2V0KCRwWydzZW9fa2V5d29yZHMnXSkgPyB0cmltKHdwX3N0cmlwX2FsbF90YWdzKChzdHJpbmcpICRwWydzZW9fa2V5d29yZHMnXSkpIDogJyc7CiAgICBpZiAoJGtleXdvcmRzID09PSAnJyAmJiAkdGFncykgewogICAgICAgICRrZXl3b3JkcyA9IGltcGxvZGUoJywnLCAkdGFncyk7CiAgICB9CgogICAgJGNvdmVyID0geGlhb2VyX3B1Yl9jZG5fdXJsKCRwWydjb3Zlcl91cmwnXSA/PyAnJyk7CiAgICAkbWV0YV93cml0dGVuID0geGlhb2VyX3B1Yl93cml0ZV9tZXRhKCRwb3N0X2lkLCBhcnJheSgKICAgICAgICAndGl0bGUnICAgICAgICAgPT4gJHNlb190aXRsZSwKICAgICAgICAnZGVzY3JpcHRpb24nICAgPT4gJGRlc2MsCiAgICAgICAgJ2tleXdvcmRzJyAgICAgID0+ICRrZXl3b3JkcywKICAgICAgICAnY292ZXJfaW1hZ2UnICAgPT4gJGNvdmVyLAogICAgICAgICd0aHVtYm5haWxfdXJsJyA9PiAkY292ZXIsCiAgICApKTsKCiAgICAvLyDnibnoibLlm77vvIjlj6/pgInvvIzlpLHotKXkuI3lvbHlk43lj5HluIPvvIkKICAgICR0aHVtYiAgICAgICAgICA9IDA7CiAgICAkdGh1bWJfZXJyb3IgICAgPSAnJzsKICAgIGlmICgkY292ZXIgIT09ICcnKSB7CiAgICAgICAgcmVxdWlyZV9vbmNlIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvZmlsZS5waHAnOwogICAgICAgIHJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL21lZGlhLnBocCc7CiAgICAgICAgcmVxdWlyZV9vbmNlIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvaW1hZ2UucGhwJzsKICAgICAgICAkYXR0ID0gbWVkaWFfc2lkZWxvYWRfaW1hZ2UoJGNvdmVyLCAkcG9zdF9pZCwgJHRpdGxlLCAnaWQnKTsKICAgICAgICBpZiAoaXNfd3BfZXJyb3IoJGF0dCkpIHsKICAgICAgICAgICAgJHRodW1iX2Vycm9yID0gJGF0dC0+Z2V0X2Vycm9yX21lc3NhZ2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRfcG9zdF90aHVtYm5haWwoJHBvc3RfaWQsIChpbnQpICRhdHQpOwogICAgICAgICAgICAkdGh1bWIgPSAoaW50KSAkYXR0OwogICAgICAgIH0KICAgIH0KCiAgICAvLyDnvJPlrZgKICAgICRwdXJnZWQgPSAwOwogICAgaWYgKCFpc3NldCgkcFsncHVyZ2VfY2FjaGUnXSkgfHwgJHBbJ3B1cmdlX2NhY2hlJ10pIHsKICAgICAgICAkcHVyZ2VkID0geGlhb2VyX3B1Yl9wdXJnZV9jYWNoZSgpOwogICAgICAgIHdwX2NhY2hlX2ZsdXNoKCk7CiAgICB9CgogICAgaWYgKCR0b3BpY19rZXkgIT09ICcnKSB7CiAgICAgICAgJHNlZW4gPSAoYXJyYXkpIGdldF9vcHRpb24oWElBT0VSX1BVQl9TRUVOLCBhcnJheSgpKTsKICAgICAgICAkc2VlblskdG9waWNfa2V5XSA9IChpbnQpICRwb3N0X2lkOwogICAgICAgIGlmIChjb3VudCgkc2VlbikgPiA4MDApIHsKICAgICAgICAgICAgJHNlZW4gPSBhcnJheV9zbGljZSgkc2VlbiwgLTgwMCwgODAwLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlX29wdGlvbihYSUFPRVJfUFVCX1NFRU4sICRzZWVuLCBmYWxzZSk7CiAgICB9CgogICAgc2V0X3RyYW5zaWVudCgkYnVja2V0LCAkY291bnQgKyAxLCBIT1VSX0lOX1NFQ09ORFMpOwoKICAgICRsaW5rID0gJHN0YXR1cyA9PT0gJ3B1Ymxpc2gnID8gZ2V0X3Blcm1hbGluaygkcG9zdF9pZCkgOiBnZXRfcHJldmlld19wb3N0X2xpbmsoJHBvc3RfaWQpOwogICAgeGlhb2VyX3B1Yl9sb2coc3ByaW50ZigKICAgICAgICAncHVibGlzaCBpZD0lZCBzdGF0dXM9JXMgY2F0PSVkIGxlbj0lZCBjaGFycyB0aXRsZT0lcyBpcD0lcycsCiAgICAgICAgJHBvc3RfaWQsICRzdGF0dXMsICRjYXQsICRsZW4sICR0aXRsZSwgJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJz8nCiAgICApKTsKCiAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoCiAgICAgICAgJ29rJyAgICAgICAgICA9PiB0cnVlLAogICAgICAgICdpZCcgICAgICAgICAgPT4gKGludCkgJHBvc3RfaWQsCiAgICAgICAgJ3N0YXR1cycgICAgICA9PiAkc3RhdHVzLAogICAgICAgICdsaW5rJyAgICAgICAgPT4gJGxpbmssCiAgICAgICAgJ2NhdGVnb3J5JyAgICA9PiBhcnJheSgnaWQnID0+ICRjYXQsICduYW1lJyA9PiBnZXRfY2F0X25hbWUoJGNhdCkpLAogICAgICAgICdjaGFycycgICAgICAgPT4gJGxlbiwKICAgICAgICAnc2VvJyAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAndGl0bGUnICAgICAgID0+ICRzZW9fdGl0bGUsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJGRlc2MsCiAgICAgICAgICAgICdrZXl3b3JkcycgICAgPT4gJGtleXdvcmRzLAogICAgICAgICAgICAnY292ZXInICAgICAgID0+ICRjb3ZlciwKICAgICAgICApLAogICAgICAgICd0aHVtYm5haWxfaWQnID0+ICR0aHVtYiwKICAgICAgICAnbWV0YV93cml0ZXInICA9PiAkbWV0YV93cml0dGVuLAogICAgICAgICdjYWNoZV9wdXJnZWQnID0+ICRwdXJnZWQsCiAgICAgICAgJ3dhcm5pbmdzJyAgICAgPT4gJHRodW1iX2Vycm9yID8gYXJyYXkoJ2ZlYXR1cmVkX2ltYWdlOiAnIC4gJHRodW1iX2Vycm9yKSA6IGFycmF5KCksCiAgICApLCAyMDEpOwp9Cg== | base64 -d)
