# tru_tags v3.2 # Article tagging # Nathan Arthur # http://www.rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjMu MiI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1 OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf dGFncyI7czo0OiJoZWxwIjtzOjY0NDoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h PiwgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81NTQvdHJ1X3Rh Z3Mtcm9hZG1hcCI+cm9hZG1hcDwvYT4sIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlz dC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+dXNhZ2Ug aW5zdHJ1Y3Rpb25zPC9hPi48L3A+CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWls ZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBi aWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFu ZCBpbiB0aGUgcGx1Z2luLjwvcD4iO3M6NDoiY29kZSI7czozOTE4MjoiCiNDb3B5cmlnaHQg MjAwOCBOYXRoYW4gQXJ0aHVyCiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNl bnNlLCBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5z ZS5waHAgZm9yIGRldGFpbHMKI1RoaXMgd29yayBpcyBpbnNwaXJlZCBieSByYW5fdGFncyBi eSBSYW4gQXJvdXNzaSwgb3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20v YXJ0aWNsZS80NS90YWdnaW5nLXRleHRwYXR0ZXJuCgoKIyMjIENPTkZJR1VSQVRJT04gIyMj CiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBUVVJOIEJBQ0shICBDb25maWd1cmF0aW9uIGlz IG5vIGxvbmdlciBoYW5kbGVkIGJ5IGVkaXRpbmcgdGhlIHBsdWdpbi4KIyBDaGVjayBvdXQg dGhlICdFeHRlbnNpb25zJyB0YWIgaW4gdGhlIFRleHRwYXR0ZXJuIGFkbWluIDopCgoKIyBD aGFuZ2luZyB0aGVzZSB3b24ndCBkbyBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFz IGEgY29udmVuaWVuY2UgZm9yIGRldmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxE JywgJ0tleXdvcmRzJyk7CmRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7CmRl ZmluZSgnVEFHX1NFQ1RJT04nLCAndGFnX3NlY3Rpb24nKTsKZGVmaW5lKCdQQVJNX05BTUUn LCAncGFybScpOwpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5f ZmVlZF9jYXRlZ29yaWVzJyk7CmRlZmluZSgnVEFHU19JTl9GRUVEX0JPRFknLCAndGFnc19p bl9mZWVkX2JvZHknKTsKZGVmaW5lKCdUQUdTX0lOX1dSSVRFX1RBQicsICd0YWdzX2luX3dy aXRlX3RhYicpOwoKZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKJHRydV90YWdzX3ByZWZzID0g dHJ1X3RhZ3NfbG9hZF9wcmVmcygpOwoKCiMjIyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMj CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5k bGVyKCRhdHRzKSB7CgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIo YXJyYXkoKSwgZmFsc2UpOwoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKCQlpZiAo dHJ1X3RhZ3NfcmVkaXJlY3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgewoJCQlyZXR1 cm4gJyc7CgkJfQoJCSRjbGVhbl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygk YXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9h dHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJCWlmICh0cmltKCRyZXN1bHQp ID09ICcnKSB7CgkJCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCQkJdHJ1 X3RhZ3NfcmVkaXJlY3QoJGF0dHNbJ25vYXJ0aWNsZXMnXSwgdHJ1ZSk7CgkJCX0gZWxzZSB7 CgkJCQl0eHBfZGllKGdUeHQoJzQwNF9ub3RfZm91bmQnKSwgJzQwNCcpOwoJCQl9CgkJfSBl bHNlIHsKCQkJcmV0dXJuICRyZXN1bHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gdHJ1X3Rh Z3NfY2xvdWQoJGF0dHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYXJjaGl2ZSgkYXR0 cykgewoJZ2xvYmFsICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJJHRhZ3MgPSBh cnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSkpKTsKCXNvcnQoJHRhZ3MpOwoJZm9y ZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFn ID0gJHRhZzsKCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0 dHMsICR0YWcpOwoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVl KTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkcmVzdWx0 cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRzKSB7 CglnbG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7CglleHRyYWN0KGxBdHRz KGFycmF5KCdsaW5rJyA9PiAnMCcpLCAgJGF0dHMsIDApKTsKCWlmICgkbGluaykgewoJCXJl dHVybiAnPGEgaHJlZj0iJyAuIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJy ZW50X2FyY2hpdmVfdGFnKSAuICciPicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3Rh ZyAuICc8L2E+JzsKCX0gZWxzZSB7CgkJcmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hp dmVfdGFnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVy biB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRz LCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsK CSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUs IGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCgly ZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFn cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCWdsb2Jh bCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJGFsbF90YWdzID0g dHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7CgoJJGF0dHMgPSB0cnVf dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFs bF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxj b3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVl cnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRh bGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf aWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4 dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoK CSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlz aWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0 aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRz LCAkdGhpbmcpIHsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMs IDApKTsKCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXko J3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0 YWdfcGFyYW1ldGVyKSkgPyB0cnVlIDogZmFsc2U7CglpZiAoJGNvbmRpdGlvbiAmJiAhZW1w dHkoJHRhZykpIHsKCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0YWcpOwoJ fQoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkg ewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3N0cmlw aHlwaGVucycgPT4gJzAnLCAndXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBh cm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFN RV0tPnZhbHVlKSkpOwoJaWYgKCdsb29rdXAnID09ICRzdHJpcGh5cGhlbnMpIHsKCQkkYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBm YWxzZSk7CgkJJHRhZ19saXN0ID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5 KCRhdHRzKSk7CgkJZm9yZWFjaCAoJHRhZ19saXN0IGFzICRjbG91ZF90YWcpIHsKCQkJaWYg KCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCQkJJHBh cm0gPSAkY2xvdWRfdGFnOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKCRzdHJp cGh5cGhlbnMpIHsKCQkkcGFybSA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSk7Cgl9 CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVs c2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7 Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFt ZXRlcigpIHsKCXRyaWdnZXJfZXJyb3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VS X05PVElDRSk7CglyZXR1cm4gc3RyaXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1l dGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglpZiAoIWVt cHR5KCR0YWdfcGFyYW1ldGVyKSkgewogICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1Nf RklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFn c19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1 X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJaWYgKCRycykgewoJ CQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xlX3RhZ3MgPSBhcnJh eSgpOwoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRhKSkgewoJCQkJ CSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2Vy KCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCX0KCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdl KCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJ CX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdf cGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJ CWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1l dGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRf YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwg ZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xv dWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0 ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRy dV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3Nf Zm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBT VVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoK ZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xp c3QsICRpc0FydGljbGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRp c0xpc3QgPyAndWwnIDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAn LCAnKSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3Nl Y3Rpb24nCT0+ICcnLAoJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50 Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93 Y291bnRzJwk9PiAnJywKCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVs dGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ ICcxJywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEw MDAnLAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3Vz ZW5vZm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFs bGNvdW50cycJPT4gJycsCgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6 ICcxJyksCgkJCSd0aXRsZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tl ZXAnCQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJh bnNmb3JtJwk9PiAnbm9uZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRh aWwnCT0+ICcnLAoJCQknZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlv bic9PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJwoJCSksJGF0dHMsIDAp Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3Qo JGF0dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7 CgkJJGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAk a2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4g IiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAk a2V5cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7Cglp bmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0g dHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49 ICgkZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJJGFsbF90YWdzID0g YXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4i LCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIg YW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgkcnMg YXMgJHJvdykgewoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoYXJyYXlfa2V5X2V4 aXN0cygkdGFnc19maWVsZCwgJHJvdykpIHsKCQkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIs IiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCX0K CQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFn cygkdGVtcF9hcnJheSkpOwoJfQoKCXJldHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMg PSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsK CWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5k IFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkc2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4o JyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0 dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsKCWdsb2JhbCAkdHJ1X3Rh Z3NfcHJlZnM7CglleHRyYWN0KCRhdHRzKTsKCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3Vu dF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwoKCWZvcmVhY2ggKCR0YWdzX3dlaWdo dCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQlpZiAoIWluX2FycmF5KCR0YWcsICRhbGxfdGFn cykKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQKCQkgICB8fCAk dGFnc193ZWlnaHRbJHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCQkJdW5zZXQoJHRhZ3Nfd2Vp Z2h0WyR0YWddKTsKCQl9Cgl9CgoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAn Y291bnQnKSAhPT0gZmFsc2UpOwoJJHNvcnRfYXNjZW5kaW5nID0gKHN0cnBvcygkc29ydCwg J2FzYycpICE9PSBmYWxzZSk7CgkkdGFnc193ZWlnaHQgPSB0cnVfdGFnc19zb3J0X3RhZ3Mo JHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKTsKCglpZiAo JGxpc3RsaW1pdCA+IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50KCR0YWdzX3dlaWdodCkpIHsK CQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7CgkJaWYgKCRrZWVwID09ICdsYXJnZXN0Jykg ewoJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCR0 YWdzX3dlaWdodCwgdHJ1ZSwgZmFsc2UpKTsKCQl9IGVsc2UgewoJCQlpZiAoJGtlZXAgPT0g J3JhbmRvbScpIHsKCQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWln aHQpIHsKCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQoMCwgJHdlaWdodCk7CgkJ CQl9CgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdz KCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkpOwoJCQl9IGVsc2UgaWYgKCRrZWVwID09 ICdhbHBoYScpIHsKCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygkdGFnc193ZWln aHQpOwoJCQkJbmF0Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3MpOwoJCQl9CgkJCSRjdXRvZmYg PSAnZXhhY3QnOwoJCX0KCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJ CWlmICgkY3V0b2ZmID09ICdjaHVuaycpIHsgLy9hbHRlcm5hdGl2ZSBpcyAnZXhhY3QnCgkJ CSRsYXN0X3dlaWdodCA9IC0xOwoJCQlmb3IgKCRpID0gMDsgJGkgPCAkbGlzdGxpbWl0ICsg MTsgJGkrKykgewoJCQkJJG5ld193ZWlnaHQgPSAkdGFnc193ZWlnaHRbJHJlc29ydGVkX3Rh Z3NbJGldXTsKCQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93ZWlnaHQpIHsKCQkJCQkk bGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOwoJCQkJCSRsYXN0X3dlaWdodCA9ICRuZXdfd2Vp Z2h0OwoJCQkJfQoJCQl9CgkJCWlmICgkbGFzdF9nb29kX2luZGV4IDwgMCkgewoJCQkJJGxh c3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCQl9CgkJfQoKCQkkcmVzb3J0ZWRf dGFncyA9IGFycmF5X2NodW5rKCRyZXNvcnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsg MSk7CgkJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0ZWRfdGFnc1swXTsKCgkJZm9yZWFjaCAo JHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQlpZiAoIWluX2FycmF5KCR0 YWcsICRyZXNvcnRlZF90YWdzKSkgewoJCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsK CQkJfQoJCX0KCX0KCglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlpZiAoJGxpbmtwYXRoKSB7 CgkJCSR1cmxwcmVmaXggPSAkbGlua3BhdGg7CgkJCSR1cmxzdWZmaXggPSAkbGlua3BhdGh0 YWlsOwoJCX0gZWxzZSB7CgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkJCSR1 cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4g Jy8nOwoJCQl9IGVsc2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3Rh Z3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJl ZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7CgkJCX0KCQkJJHVybHN1ZmZpeCA9ICh0cnVf dGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykg ewoJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFn IG5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcn OwoJCQl9CgkJfSBlbHNlIGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAn IiByZWw9Im5vZm9sbG93JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAw KSB7CgkJJG1heCA9IG1heCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2Vp Z2h0KTsKCX0gZWxzZSB7CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgk bWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4 IC0gJG1pbik7CgoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0 cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOwoJ JHRhZ19zZWFyY2hfdGFnID0gZnVuY3Rpb25fZXhpc3RzKCJodG1sc3BlY2lhbGNoYXJzX2Rl Y29kZSIpID8gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKSA6IGh0 bWxfZW50aXR5X2RlY29kZSgkdGFnX3NlYXJjaF90YWcpOwoJZm9yZWFjaCAoJHRhZ3Nfd2Vp Z2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBl cmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9ICcn OwoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAu ICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3MgPSAnJzsKCQlpZiAoJHNldGNs YXNzZXMpIHsKCQkJJHRhZ19jbGFzcyA9ICcgY2xhc3M9Iic7CgkJCWlmICgkd2VpZ2h0ID09 ICRtaW4pIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJCX0gZWxz ZSBpZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFy Z2VzdCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVtIjsK CQkJfQoJCQkkdGFnX2NsYXNzIC49ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAkbWlu KTsKCQkJaWYgKCR0YWcgPT0gJHRhZ19zZWFyY2hfdGFnKSB7CgkJCQkkdGFnX2NsYXNzIC49 ICcgJyAuICRhY3RpdmVjbGFzczsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9CgoJ CS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRl eHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRs ZWNvdW50ID0gJyc7CgkJaWYgKCR0aXRsZSkKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSIn IC4gJHRpdGxlIC4gJyInOwoJCSRkaXNwbGF5Y291bnQ9ICcnOwoJCSRjb3VudCA9ICRjb3Vu dHdyYXBjaGFyc3swfSAuICR3ZWlnaHQgLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYgKCRz aG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkkdGl0 bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7CgkJaWYgKCRz aG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291bnQg PSAnICcgLiAkY291bnQ7CgoJCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScp IHsKCQkJJHRhZyA9IHVjd29yZHMoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9y bSA9PSAndXBwZXJjYXNlJykgewoJCQkkdGFnID0gc3RydG91cHBlcigkdGFnKTsKCQl9IGVs c2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dlcmNhc2UnKSB7CgkJCSR0YWcgPSBzdHJ0 b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZpcnN0 JykgewoJCQkkdGFnID0gdWNmaXJzdCgkdGFnKTsKCQl9CgoJCWlmICgkZ2VuZXJhdGVsaW5r cykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9y ZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOwoJCQkkdGFnc19o dG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJsIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAu ICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2E+JyAu ICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAk dGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAu ICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAu ICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtd ID0gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICRkaXNwbGF5Y291bnQ7CgkJfQoJfQoJcmV0 dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNs YXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMKIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAodHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7 CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXInLCAncHJl dGV4dCcpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50 LCAkc3RlcCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCSRzdWJwYXRoID0gcHJlZ19y ZXBsYWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1 YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFj ZSgiL14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsK CgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3Ry KCRyZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAw LCAkcXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoc3BsaXQoJy8n LCAkcmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0gJHRy dV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUpIHsKCQkkdGFnID0gJHBhcnRzWzFd OwoJCSRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSA9ICR0cnVfdGFnc19wcmVmc1tQQVJNX05B TUVdLT52YWx1ZSAuICc9JyAuICR0YWcgLiAkcWF0dHM7CgkJJF9TRVJWRVJbJ1JFUVVFU1Rf VVJJJ10gPSAkc3VicGF0aCAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVl IC4gJy8/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsKCQlpZiAoY291bnQoJF9QT1NU KSA+IDApIHsKCQkJJF9QT1NUWydzZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NF Q1RJT05dLT52YWx1ZTsKCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52 YWx1ZV0gPSAkdGFnOwoJCX0gZWxzZSB7CgkJCSRfR0VUWydzZWN0aW9uJ10gPSAkdHJ1X3Rh Z3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9HRVRbJHRydV90YWdzX3ByZWZz W1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJfQoJfQp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfY2xlYW5fdXJscygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglyZXR1cm4gKCdj bGVhbicgPT0gJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSk7Cn0KCgojIyMg QURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK CmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsKCWFkZF9wcml2cygndHJ1X3RhZ3Mn LCAnMSwyJyk7CglyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAndHJ1X3RhZ3MnLCAndHJ1 X3RhZ3MnKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1 X3RhZ3MnKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFs dWUpIHsKCQlyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hh bmRsZXInLCAnYXJ0aWNsZScpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFi KCRldmVudCwgJHN0ZXApIHsKCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3Vs dHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVf dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UpOwoJ JGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1 X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJl ZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5f dGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQs ICRyZWRpcmVjdHMpIHsKCWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcn KTsKCglpbmNsdWRlKHR4cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7CglnbG9i YWwgJHRydV90YWdzX3ByZWZzOwoKCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcn LCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXki PicuICAjIEkga25vdywgSSBrbm93Li4uCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcn LCAnJywgJzEwcHgnKS4nPHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQg Z3JheSI+Jy4KCQkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICczMDBweCcpLgoJ CQkJdHIoaENlbGwoZ1R4dCgnQ3VycmVudCB0YWdzJykpKS4KCQkJCXRyKHRkKCRjbG91ZCkp LgoJCQllbmRUYWJsZSgpLgoJCSc8L3RkPjwvdHI+PHRyPjx0ZD4nLgoJCQlzdGFydFRhYmxl KCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0KCd0cnVf dGFncyBSZWZlcmVuY2UnKSkpLgoJCQkJdHIodGQoJzxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1 aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj5Vc2Fn ZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRl eHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE1MDg0Ij5Gb3J1bSBwYWdlczwvYT4n LgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzUz Ny90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBo cmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2Fk bWFwIj5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3 dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3QiPkZlYXR1 cmUgbGlzdDwvYT4nLgoJCQkJJzxicj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3Qu Y29tL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4i PnRydV90YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tLyI+TmF0 aGFuIEFydGh1cjwvYT4nLgoJCQkJJzxicj48YnI+Jy4KCQkJCSc8ZGl2IGlkPSJwYXlwYWwi Pjxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIg bWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJf cy14Y2xpY2siIC8+PGlucHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBh bC5jb20vZW5fVVMvaS9idG4veC1jbGljay1idXQwNC5naWYiIG5hbWU9InN1Ym1pdCIgYWx0 PSJNYWtlIGEgZG9uYXRpb24gdG8gTmF0aGFuIEFydGh1ciIgLz48aW1nIGFsdD0iIiBib3Jk ZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL3Njci9waXhlbC5n aWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0i ZW5jcnlwdGVkIiB2YWx1ZT0iLS0tLS1CRUdJTiBQS0NTNy0tLS0tTUlJSHNRWUpLb1pJaHZj TkFRY0VvSUlIb2pDQ0I1NENBUUV4Z2dFd01JSUJMQUlCQURDQmxEQ0JqakVMTUFrR0ExVUVC aE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdW M01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpa WEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhK bFFIQmhlWEJoYkM1amIyMENBUUF3RFFZSktvWklodmNOQVFFQkJRQUVnWUNIaHRiZENtU3ZF ZlY2alpkM3R2eWRqRDRaUGZBK0JLLzdnSXMycmlKazhuVlhua1dKNnhIVmFwU0ltdVordDFx L0Izd0NobldOOTQweTUxbXU0S3pyZWFOQ1EyNmtjYitQaVltcHZhNVVwQnlBWVNSbXRKRGpX RU94c3BqSTR4MUtkTEczYk5QYlduczBZL1pQS2RlUXY1c09XU2hOR1BlOGV5RC9kTzg2S2pF TE1Ba0dCU3NPQXdJYUJRQXdnZ0V0QmdrcWhraUc5dzBCQndFd0ZBWUlLb1pJaHZjTkF3Y0VD REZhU0dZZ3pmYzRnSUlCQ000Y0hQMmdhcU02MGhYM21ZZTA1MUZpT3ZLc1lmOStzclQvbEps dUJ3b0RaL2RWY2VVZUczc09rN21BWGxUbVRqN0dFZDhQSzJwYkVqWEdSMHgwT1BaRytoam0v S0U3dUtBUUN4UjM4V0J3THZYT2lyN3RFNFV0WjFJSGtTcWE0U2s2TEZZSDVWZnRXcWpUUHh4 OUF3NTh4YUttMDBTZVRFOSt2dmowUEJjenliN0pZeU5SWmYrOCs2SWdTK2VlTkNFVXo0eFdF Vkd1SmJ1SExHV1JSbVpTaCtUS1VsVXdFc0lqeDNaVUR4KzAzdUNkeTVuQmRXSDRYaHorTTZK NXJ6WVA5bUpjMVkreFJTdjE3NmVMUEFCZzZLSnFqZnRNV3J3dUV5WjE5VHBseWVhNDI5WUVB RTVkWnhXVTJ1MjVjbVFjWTFLelppdGlCZDZDL1lSWkdnM1F2TDBnbTR1S1k2Q0NBNGN3Z2dP RE1JSUM3S0FEQWdFQ0FnRUFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR09NUXN3Q1FZRFZRUUdF d0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhj eEZEQVNCZ05WQkFvVEMxQmhlVkJoYkNCSmJtTXVNUk13RVFZRFZRUUxGQXBzYVhabFgyTmxj blJ6TVJFd0R3WURWUVFERkFoc2FYWmxYMkZ3YVRFY01Cb0dDU3FHU0liM0RRRUpBUllOY21W QWNHRjVjR0ZzTG1OdmJUQWVGdzB3TkRBeU1UTXhNREV6TVRWYUZ3MHpOVEF5TVRNeE1ERXpN VFZhTUlHT01Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFj VERVMXZkVzUwWVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdF UVlEVlFRTEZBcHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJv R0NTcUdTSWIzRFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJB UUVGQUFPQmpRQXdnWWtDZ1lFQXdVZE8zZnhFekV0Y25JN1pLWkw0MTJYdlpQdWdvbmk3aTdE N3ByQ2UwQXRhSFRjOTdDWWdtN05zQXRKeXhOTGl4bWhMVjhweUlFYWlIWFdBaDhmUEtXK1Iw MTcrRW1YcnI5RWFxdVBtc1Z2VHl3QUFFMVBNTk9LcW8ya2w0R3hpejl6WnFJYWpPbTFmWkdX Y0dTMGY1SlEya0JxTmJ2YmcyL1phK0dKL3F3VUNBd0VBQWFPQjdqQ0I2ekFkQmdOVkhRNEVG Z1FVbHA5OHU4WnZGNzFaUDFMWENodnNFTlprbEdzd2dic0dBMVVkSXdTQnN6Q0JzSUFVbHA5 OHU4WnZGNzFaUDFMWENodnNFTlprbEd1aGdaU2tnWkV3Z1k0eEN6QUpCZ05WQkFZVEFsVlRN UXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxkekVVTUJJ R0ExVUVDaE1MVUdGNVVHRnNJRWx1WXk0eEV6QVJCZ05WQkFzVUNteHBkbVZmWTJWeWRITXhF VEFQQmdOVkJBTVVDR3hwZG1WZllYQnBNUnd3R2dZSktvWklodmNOQVFrQkZnMXlaVUJ3WVhs d1lXd3VZMjl0Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURn WUVBZ1Y4NlZwcUFXdVh2WDZPcm80cUoxdFlWSVQ1RGdXcEU2OTJBZzQyMkg3eVJJci85ai9p S0c0VGhpYS9PZmx4NFRkTCtJRkpCQXlQSzl2NnpaTlp0QmdQQnluWGIwNDhoc1AxNmwydmkw azVRMkpLaVBEc0VmQmhHSStIbnhMWEVhVVdBY1ZmQ3NRRnZkMkExc3hScjY3aXA1eTJ3d0Jl bFVlY1AzQWpKK1ljeGdnR2FNSUlCbGdJQkFUQ0JsRENCampFTE1Ba0dBMVVFQmhNQ1ZWTXhD ekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZ RFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJN QThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhC aGJDNWpiMjBDQVFBd0NRWUZLdzREQWhvRkFLQmRNQmdHQ1NxR1NJYjNEUUVKQXpFTEJna3Fo a2lHOXcwQkJ3RXdIQVlKS29aSWh2Y05BUWtGTVE4WERUQTNNREV5TkRFM016a3hNVm93SXdZ SktvWklodmNOQVFrRU1SWUVGQytUbHY0dmxySVFFTUVFWUwyYk1VbzdvdVhJTUEwR0NTcUdT SWIzRFFFQkFRVUFCSUdBZjh6V0tqeFZHcExJOVJZczVtbWl0WGxqcW9xWmRVTEQrcjY1OHcy OFFEbUlhOXZNZkRoVjBBZWtXV1RDK1hpMHZxTlh4bncxOTBGRjZJUVE2OXlVN0pLYk5hMGRP SjVyWW9UNTFKcmFLRFY0UzU0c0MwdUFYRnZUdVUrSVExSjlJT1ZaaWxjeld6MWdSeTVONlJz WWhUZmdjYXZiUzlNcWVLaHpLMmhWS2ZZPS0tLS0tRU5EIFBLQ1M3LS0tLS0iIC8+PC9mb3Jt PjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJs ZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBw eCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5O3dpZHRo OjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBzdGFydFRhYmxlKCdsaXN0 JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkp LgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6cmVkIicpLgoJCQllbmRU YWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRv bToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAn JywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRl bmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xz cGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4n OiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9p bnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShnVHh0KCd0bycpLic6Jywg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQo J3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3Jl cGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJ CQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJ CQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6 ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lu cHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3MoJycsIDIpLgoJCQkJCXRk KGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJ bnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95 b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8 L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+ JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJ dHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49IjQiJykpOwoJ CQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCQkJ ZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWco JGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkYSho dG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJyku CgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygkcmlnaHR0 YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRkKCc8YSBocmVm PSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVu Y29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2Fy ZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsKCQkJfQoJCQllY2hvIHRy KAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJlY3QiIG1ldGhvZD0icG9z dCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4g dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0 X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRl ciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idmVydGlj YWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lu cHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIi JykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0 KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ3JlZGly ZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRp cmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hv ICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJ dHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJ CWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMnKS4nICgnLmdU eHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10t PmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn KS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJCQlhcnJheSgnY2xlYW4n PT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVf dGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRk YShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3Nf cHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTogJywgJyBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoVEFHX1NFQ1RJT04s ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJ CQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3IgdGFnIHNlYXJjaCcpLicg KGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFs dWUuJyIpOiAnLgoJCQkJCQknPGJyPih5b3Ugc2hvdWxkblwndCBjaGFuZ2UgdGhpcyB1bmxl c3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyknLCAnIHN0eWxlPSJ2ZXJ0 aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dChQQVJNX05BTUUsICR0 cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIo CgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8gUlNTL0F0b20gZmVlZHMsIGluICJDYXRl Z29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJyPih5b3UgcHJvYmFibHkgd2FudCB0aGlz KScsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1Jh ZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9G RUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBl bmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJ CQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0YWciOjxicj5JZiB0aGlzIGlzIHR1cm5l ZCBvbiwnLgoJCQkJCQkneW91IGNhbiBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVf dGFnc19mZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0 aGUgdGFncyBpbiB0aGUgZmVlZC4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX0ZFRURfQk9EWSwgJHRydV90 YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJ CQkJCXRkYShnVHh0KCdTaG93IGEgY2xpY2thYmxlIGxpc3Qgb2YgdGFncyBvbiB0aGUgIldy aXRlIiBwYWdlJykuJzogJywKCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxl IicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9XUklURV9UQUIsICR0cnVfdGFnc19w cmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0 ZCgnJykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScp LCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpy aWdodCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1 cmUnKSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxlKCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRh YmxlKCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRy dV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7 CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChn cHMoJ2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3Bz KCdkZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdwcygncmVwbGFjZScpKSB7CgkJJHJlc3Vs dCA9IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdy ZXBsYWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90 YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRh ZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdz X2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsK CX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFn c19hZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVs c2UgewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3VwZGF0 ZV9wcmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5 KCk7Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMgYXMgJHByZWYpIHsKCQkkdmFsaWRfdmFs dWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2 YWxpZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJCQly ZXR1cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIGhhbmRs ZSB2YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJl Zi0+dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1 ZSkgewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsK CQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+ bmFtZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlpZiAoJHJlc3VsdCkgewoJCQkJJHJlc3Vs dHNbXSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFtZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2 YWxpZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRp bmcgJyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJfQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9 PSAwKSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsK CQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90 YWdzX3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUpIHsKCWlmICghc2FmZV9xdWVyeSgnY3Jl YXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycp LgoJCScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJj aGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFi bGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRh YmxlLic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1 ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3Nf cHJlZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3RydV90 YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBz YWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQly ZXR1cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVsZXRldGFnKSB7CglpZiAodHJpbSgkZGVs ZXRldGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRl dGFnLCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFs dWUnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJG1hdGNo dGFnLCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRh ZyA9IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7 CglpZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFj ZXRhZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywgVFJVX1RBR1NfRklF TEQuJz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBsYWNlKGNvbmNhdCgiLCIsICcuVFJVX1RB R1NfRklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwgXCcnLmFkZHNsYXNoZXMoJG1hdGNodGFn KS4nXCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygkcmVwbGFjZXRhZykuJyxcJykpJywgJzEn KSkgewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbF9hZmZlY3RlZF9yb3dzKCkuJyByb3dz ICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9PiInLmh0bWxzcGVjaWFsY2hh cnMoJHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdFcnJvcjogJyAu IG15c3FsX2Vycm9yKCk7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBh IHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWlu X3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNs YXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmltKCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFn ID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJ aWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIg YSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9CgoJaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUg dGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycp LgoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSdyaWdodHRh ZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3Ig LSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0 cycpIC4gJyB0YWJsZS4nOwoJfQoKCWlmIChzYWZlX2luc2VydCgndHJ1X3RhZ3NfcmVkaXJl Y3RzJywgJ2xlZnR0YWc9IicuJGxlZnR0YWcuJyIscmlnaHR0YWc9IicuJHJpZ2h0dGFnLici JykpIHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRs ZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFz ZSB0ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJldHVybiAnRXJyb3IgYWRkaW5nIHJlY29yZCAt IGRvZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRt aW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90 YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLmFkZHNsYXNoZXMoJGxlZnR0YWcpLiciJykp IHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYm ICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJl Y3RzJykpKSB7CgkJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBk cm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJl dHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZyku JyIpJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJvciBkZWxldGluZyByZWRpcmVjdCc7Cgl9 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQs ICRzdGVwKSB7CgkkY2xvdWQgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnko dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgdHJ1ZSwgdHJ1ZSkp KTsKCXNvcnQoJGNsb3VkKTsKCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lEJ10pID8gZ3Bz KCdJRCcpIDogJEdMT0JBTFNbJ0lEJ10pOwoJJGFydGljbGVfdGFncyA9IChlbXB0eSgkaWQp ID8gYXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkpOwoKCSRs aW5rcyA9IGFycmF5KCk7Cglmb3JlYWNoICgkY2xvdWQgYXMgJHRhZykgewoJCSRzdHlsZSA9 IChpbl9hcnJheSgkdGFnLCAkYXJ0aWNsZV90YWdzKSA/ICcgY2xhc3M9InRhZ19jaG9zZW4i JyA6ICcnKTsKCQkkbGlua3NbXSA9ICc8YSBocmVmPSIjYWR2YW5jZWQiJy4kc3R5bGUuJyBv bmNsaWNrPSJ0aGlzLnNldEF0dHJpYnV0ZShcXFwnY2xhc3NcXFwnLCB0b2dnbGVUYWcoXFxc JycuYWRkc2xhc2hlcyhhZGRzbGFzaGVzKCR0YWcpKS4nXFxcJykpOyByZXR1cm4gZmFsc2U7 Ij4nIC4gYWRkc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKCR0YWcpKSAuICc8XC9hPic7Cgl9 CgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAkbGlua3MpOwoJJHRvX2luc2VydCA9ICI8c3R5 bGU+YS50YWdfY2hvc2Vue2JhY2tncm91bmQtY29sb3I6ICNGRUI7IGNvbG9yOiBibGFjazt9 PC9zdHlsZT4iIC4gJHRvX2luc2VydDsKCgkkanMgPSA8PDxFT0YKCQl2YXIga2V5d29yZHNG aWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJCXZhciBwYXJl bnQgPSBrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGU7CgkJcGFyZW50LmFwcGVuZENoaWxkKGRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOwoJCXZhciBjbG91ZCA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKCQljbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3Ry dV90YWdzX2FkbWluX3RhZ3MnKTsKCQljbG91ZC5pbm5lckhUTUwgPSAneyR0b19pbnNlcnR9 JzsKCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY2xvdWQpOwoKCQlmdW5jdGlvbiB0b2dnbGVUYWco dGFnTmFtZSkgewoJCQl2YXIgcmVnZXhUYWcgPSB0YWdOYW1lLnJlcGxhY2UoLyhbXFxcXFxe XFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxcXFwkMSIpOwoJCQl2YXIgdGFnUmVnZXggPSBu ZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMqfCQp Iik7CgkJCXZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3Jk cycpOwoJCQl2YXIgY3VydmFsID0gdGV4dGFyZWEudmFsdWUucmVwbGFjZSgvLD9ccyskLywg JycpOwoJCQlpZiAoJycgPT0gY3VydmFsKSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSA9IHRhZ05h bWU7CgkJCX0gZWxzZSBpZiAoY3VydmFsLm1hdGNoKHRhZ1JlZ2V4KSkgewoJCQkJdGV4dGFy ZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVwbGFjZSgvLD9c cyskLywgJycpOwoJCQkJcmV0dXJuICcnOwoJCQl9IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwu Y2hhckF0KGN1cnZhbC5sZW5ndGggLSAxKSkgewoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJyAn ICsgdGFnTmFtZTsKCQkJfSBlbHNlIHsKCQkJCXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0 YWdOYW1lOwoJCQl9CgkJCXJldHVybiAndGFnX2Nob3Nlbic7CgkJfQpFT0Y7CgoJZWNobyBz Y3JpcHRfanMoJGpzKTsKfQoKCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAjIyMKIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90 YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7CmZ1bmN0aW9uIHRydV90YWdzX2F0 b21faGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRs ZXIodHJ1ZSk7IH0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX3Jzc19oYW5kbGVyJywg J3Jzc19lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxlcigkZXZlbnQsICRz dGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2UpOyB9CgpmdW5jdGlv biB0cnVfdGFnc19mZWVkX2hhbmRsZXIoJGF0b20pIHsKCWdsb2JhbCAkdGhpc2FydGljbGUs ICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFncyA9IHRy dV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOwoKCWlmICgkdHJ1X3RhZ3Nf cHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkgewoJCSRleHRyYWJvZHkgPSAnJzsK CQkkRk9STV9OQU1FID0gJ3RydV90YWdzX2ZlZWRfdGFncyc7CgkJaWYgKGZldGNoKCdmb3Jt JywgJ3R4cF9mb3JtJywgJ25hbWUnLCAkRk9STV9OQU1FKSkgewoJCQkkZm9ybSA9IGZldGNo X2Zvcm0oJEZPUk1fTkFNRSk7CgkJCSRleHRyYWJvZHkgPSB0cmltKHBhcnNlKCRmb3JtKSk7 CgkJfSBlbHNlIHsKCQkJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0 cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7CgkJCSRleHRyYWJvZHkgPSAnPHA+dGFnczogJyAu IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJHRhZ3MsICR0YWdzKSAuICc8L3A+JzsK CQl9CgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCQlpZiAodHJpbSgkdGhpc2FydGljbGVbJ2V4 Y2VycHQnXSkpIHsKCQkJJHRoaXNhcnRpY2xlWydleGNlcnB0J10gPSB0cmltKCR0aGlzYXJ0 aWNsZVsnZXhjZXJwdCddKS5uLiRleHRyYWJvZHkubjsKCQl9CgkJJHRoaXNhcnRpY2xlWydi b2R5J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnYm9keSddKS5uLiRleHRyYWJvZHkubjsKCX0K CglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXS0+dmFsdWUp IHsKCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CgkJ CWlmICgkYXRvbSkgewoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeSB0ZXJtPSInIC4gaHRt bHNwZWNpYWxjaGFycygkdGFnKSAuICciIC8+JzsKCQkJfSBlbHNlIHsKCQkJCSRvdXRwdXRb XSA9ICc8Y2F0ZWdvcnk+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9jYXRlZ29y eT4nOwoJCQl9CgkJfQoJCXJldHVybiBuLmpvaW4obiwgJG91dHB1dCkubjsKCX0KfQoKCiMj IyBQUkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKCmNsYXNzIHRydV90YWdzX3ByZWYgewoJZnVuY3Rpb24gdHJ1X3RhZ3Nf cHJlZigkbmFtZSwgJGRlZmF1bHRfdmFsdWUsICR0eXBlKSB7CgkJJHRoaXMtPm5hbWUgPSAk bmFtZTsKCQkkdGhpcy0+dmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+ZGVmYXVs dF92YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7Cgl9CgoJ ZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7CgkJaWYgKCR2YWx1ZSkgewoJCQly ZXR1cm4gJHZhbHVlOwoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUgPT0gJ2Jvb2xlYW4nKSB7 CgkJCXJldHVybiAnMCc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2 YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOwoJCX0KCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3Nf bG9hZF9wcmVmcygpIHsKCSRwcmVmcyA9IGFycmF5KCk7CgoJZ2xvYmFsICRwZXJtbGlua19t b2RlOwoJJHByZWZzW0NMRUFOX1VSTFNdID0gbmV3IHRydV90YWdzX3ByZWYoQ0xFQU5fVVJM UywgKCRwZXJtbGlua19tb2RlICE9ICdtZXNzeScgPyAnY2xlYW4nIDogJ21lc3N5JyksICdz dHJpbmcnKTsKCSRwcmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdf U0VDVElPTiwgJ3RhZycsICdzdHJpbmcnKTsKCSRwcmVmc1tQQVJNX05BTUVdID0gbmV3IHRy dV90YWdzX3ByZWYoUEFSTV9OQU1FLCAndCcsICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdTX0lO X0ZFRURfQ0FURUdPUklFU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FU RUdPUklFUywgJzEnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9 IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7 CgkkcHJlZnNbVEFHU19JTl9XUklURV9UQUJdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19J Tl9XUklURV9UQUIsICcxJywgJ2Jvb2xlYW4nKTsKCglpZiAobXlzcWxfcXVlcnkoImRlc2Ny aWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcHJlZnMiKSkgewoJCSRycyA9IHNhZmVfcm93cygn KicsICd0cnVfdGFnc19wcmVmcycsICcxJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsK CQkJJHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsKCQl9Cgl9 CgoJcmV0dXJuICRwcmVmczsKfQoKCiMjIyBPVEhFUiBTVVBQT1JUIEZVTkNUSU9OUyAjIyMK IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVk aXJlY3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1ldGVyKSB7CgkkcmVkaXJlY3RzID0gdHJ1X3Rh Z3NfbG9hZF9yZWRpcmVjdHMoKTsKCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcg PT4gJHJpZ2h0dGFnKSB7CgkJaWYgKCRsZWZ0dGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICRs ZWZ0dGFnID09IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcikpIHsKCQkJ dHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxzZSk7CgkJCXJldHVybiB0cnVlOwoJ CX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3JlZGly ZWN0cygpIHsKCSRyZWRpcmVjdHMgPSBhcnJheSgpOwoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNj cmliZSAiIC4gUEZYIC4gInRydV90YWdzX3JlZGlyZWN0cyIpKSB7CgkJJHJzID0gc2FmZV9y b3dzKCcqJywgJ3RydV90YWdzX3JlZGlyZWN0cycsICcxIG9yZGVyIGJ5IGxlZnR0YWcnKTsK CQlmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCQkkcmVkaXJlY3RzWyRyb3dbJ2xlZnR0YWcn XV0gPSAkcm93WydyaWdodHRhZyddOwoJCX0KCX0KCXJldHVybiAkcmVkaXJlY3RzOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3QoJGRlc3RpbmF0aW9uLCAkaXNfZnVsbF91cmwp IHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglpZiAoJGlzX2Z1bGxfdXJsKSB7CgkJJHVy bCA9ICRkZXN0aW5hdGlvbjsKCQkkbWVzc2FnZSA9ICdUaGUgcmVzb3VyY2UgeW91IHJlcXVl c3RlZCBoYXMgbW92ZWQgdG8gJyAuICRkZXN0aW5hdGlvbjsKCX0gZWxzZSB7CgkJJHVybCA9 IHRydV90YWdzX2xpbmtpZnlfdGFnKCRkZXN0aW5hdGlvbiwgZmFsc2UpOwoJCSRtZXNzYWdl ID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGlu YXRpb247Cgl9CgoJaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOwoJdHhwX2RpZSgkbWVz c2FnZSwgJzMwMScpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJHRhZywg JHVzZV9hbXAgPSB0cnVlKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKHRydV90 YWdzX2NsZWFuX3VybHMoKSkgewoJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVm c1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJfSBlbHNlIHsKCQkkdXJscHJlZml4ID0g aHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gKCR1 c2VfYW1wID8gJyZhbXA7JyA6ICcmJykgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ dmFsdWUgLiAnPSc7Cgl9CgkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ ICcvJyA6ICcnKTsKCXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNl KCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf Z2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgewoJJHRhZ3NfZmllbGQgPSBUUlVf VEFHU19GSUVMRDsKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4i LCAiSUQ9JyRhcnRpY2xlSUQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJJGFsbF90YWdz ID0gYXJyYXkoKTsKCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkcnMpKSB7 CgkJJGFsbF90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigk cnNbJHRhZ3NfZmllbGRdKSkpOwoJfQoKCXJldHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFs bF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3Jh cCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcwpmdW5j dGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3Ms ICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcvXlx3KyQv JywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9IGVsc2Ug ewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJy ZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0YWdfYXJy YXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRh ZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0cmltKCR0 YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zp eHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29yZHMgPSBl eHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRr ZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsKCQkJ JGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJCX0KCX0K CSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJaWYgKGlz c2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcp ICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAoaXNzZXQo JGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0 aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCXVuc2V0 KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10p KSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgkYXR0c1sn YWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOwoJ fQoKCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0dHNbJ2xp c3Rmb3JtJ10pKSB7CgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNoZm9ybSdd OwoJfQoKCXJldHVybiAkYXR0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIo JHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygibWJfc3RydG9sb3dlciIpKSB7CgkJcmV0 dXJuIG1iX3N0cnRvbG93ZXIoJHN0ciwgIlVURi04Iik7Cgl9IGVsc2UgewoJCXJldHVybiBz dHJ0b2xvd2VyKCRzdHIpOwoJfQp9CgoKLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJl IGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0CmZ1 bmN0aW9uIHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50 LCAkc29ydF9hc2NlbmRpbmcpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0 cnVfdGFnc19zb3J0X2J5X2NvdW50LCAkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgoJJHRy dV90YWdzX3RhZ3Nfd2VpZ2h0ID0gJHRhZ3Nfd2VpZ2h0OwoJJHRydV90YWdzX3NvcnRfYnlf Y291bnQgPSAkc29ydF9ieV9jb3VudDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRz b3J0X2FzY2VuZGluZzsKCgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0 KTsKCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3Ii KTsKCgkkc29ydGVkX2FycmF5ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFz ICR0YWcpIHsKCQkkc29ydGVkX2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWddOwoJ fQoKCXJldHVybiAkc29ydGVkX2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90 YWdzX2NvbXBhcmF0b3IoJGxlZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190YWdz X3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2Vu ZGluZzsKCglpZiAoJHRydV90YWdzX3NvcnRfYnlfY291bnQpIHsKCQkkbGVmdF93ZWlnaHQg PSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJGxlZnRdOwoJCSRyaWdodF93ZWlnaHQgPSAkdHJ1 X3RhZ3NfdGFnc193ZWlnaHRbJHJpZ2h0XTsKCQlpZiAoJGxlZnRfd2VpZ2h0ID09ICRyaWdo dF93ZWlnaHQpIHsKCQkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7CgkJ fSBlbHNlIGlmICgkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsKCQkJcmV0dXJuICRsZWZ0 X3dlaWdodCAtICRyaWdodF93ZWlnaHQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyaWdodF93 ZWlnaHQgLSAkbGVmdF93ZWlnaHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gc3RybmF0Y2Fz ZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMgVEhB VCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVk b19hcnRpY2xlX3NlYXJjaCgkYXR0cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGlt aXQnICAgICA9PiAxMDAwLAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlvbicg ICA9PiAnJywKCQkJCSdleGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4gJycs CgkJCQknc29ydGJ5JyAgICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNj JywKCQkJCSdtb250aCcgICAgID0+ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJCQkn ZnJvbnRwYWdlJyA9PiAnJywKCQkJCSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUnICAg ICAgPT4gJ3Bhc3QnLAoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcgICAg PT4gMAoJCQkpLCRhdHRzLCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRpbmcg cXVlcnkgcGFydHMKCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBh Z2UoKSA6ICcnOwoJJGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgo Q2F0ZWdvcnkxPSciLmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5k b1NsYXNoKCRjYXRlZ29yeSkuIicpKSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24pICAg PyAnJyA6ICIgYW5kIFNlY3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7CgkkZXhj ZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcn OwoJJGF1dGhvciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0g JyIuZG9zbGFzaCgkYXV0aG9yKS4iJyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAgICA/ ICcnIDogIiBhbmQgUG9zdGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7CgkkaWQg ICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlk KS4iJyI7Cglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsg YnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3co KSI7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCki OwoJfQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQoJCSRzdGF0dXMgPSBnZXRTdGF0dXNO dW0oJHN0YXR1cyk7CgoJJGN1c3RvbSA9ICcnOwoJLy8gdHJ5aW5nIGN1c3RvbSBmaWVsZHMg aGVyZQoJJGN1c3RvbUZpZWxkcyA9IGdldEN1c3RvbUZpZWxkcygpOwoJaWYgKCRjdXN0b21G aWVsZHMpIHsKCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkgewoJCQlpZiAo aXNzZXQoJGF0dHNbJGNGaWVsZF0pKQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0 dHNbJGNGaWVsZF07CgkJfQoJCWlmKCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQkkY3VzdG9t ID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsKCQllbHNl CgkJCSRjdXN0b20gPSAnJzsKCX0KCgkvL0FsbG93IGtleXdvcmRzIGZvciBuby1jdXN0b20g YXJ0aWNsZXMuIFRoYXQgdGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJaWYgKCRrZXl3b3Jkcykg ewoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3RyaW0nLCBzcGxpdCgnLCcsICRrZXl3 b3JkcykpKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0g IkZJTkRfSU5fU0VUKCciLiRrZXkuIicsS2V5d29yZHMpIjsKCQl9CgkJJGtleXdvcmRzID0g IiBhbmQgKCIgLiBqb2luKCcgb3IgJywka2V5cGFydHMpIC4gIikiOwoJfQoKCWlmICgkaWQp CgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXMgPj0gJzQnIjsKCWVsc2UKCQkkc3RhdHVzcSA9 ICIgYW5kIFN0YXR1cz0nIi5kb1NsYXNoKCRzdGF0dXMpLiInIjsKCgkkd2hlcmUgPSAiMSIg LiAkc3RhdHVzcS4gJHRpbWUuCgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhj ZXJwdGVkIC4gJG1vbnRoIC4gJGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJv bnRwYWdlOwoKCQkkcGdvZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCgkkcnMgPSBzYWZlX3Jv d3Nfc3RhcnQoIiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0 cGF0dGVybicsCgkJJHdoZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0YnkpIC4g JyAnIC4gZG9TbGFzaCgkc29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1pdCkp OwoKCXJldHVybiAkcnM7Cn0KCgoiO3M6ODoiaGVscF9yYXciO3M6NTYyOiJUbyBsZWFybiBt b3JlIGFib3V0IHRydV90YWdzLCBjaGVjayBvdXQgdGhlICJpbnRyb2R1Y3RvcnkgYXJ0aWNs ZSI6L2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4s ICJyZWxlYXNlcyBwYWdlIjpodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzUzNy90 cnVfdGFncy1yZWxlYXNlcywgImZlYXR1cmUgbGlzdCI6aHR0cDovL3d3dy50cnVpc3QuY29t L3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3QsICJyb2FkbWFwIjpodHRwOi8v d3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwLCBhbmQgInVz YWdlIGluc3RydWN0aW9ucyI6aHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTcv dHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMuCgpJJ3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBo ZWxwIG91dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBh bmQgdG9vIGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGlu IHRoZSBwbHVnaW4uIjtzOjM6Im1kNSI7czozMjoiOGYxMTFkNzFhYjAwNTk1NGY5MzU4ZDU4 ZjhhODc1NTciO30=