# tru_tags v3.1 # 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 MSI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1 OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf dGFncyI7czo0OiJoZWxwIjtzOjU2ODoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3Ry dXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj51c2FnZSBpbnN0cnVjdGlvbnM8L2E+LjwvcD4K Cgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1 Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0 byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uPC9wPiI7 czo0OiJjb2RlIjtzOjMzNjgxOiIKI0NvcHlyaWdodCAyMDA3IE5hdGhhbiBBcnRodXIKI1Jl bGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9w ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlscwojVGhp cyB3b3JrIGlzIGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5h bGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4 dHBhdHRlcm4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj CgojIFRVUk4gQkFDSyEgIENvbmZpZ3VyYXRpb24gaXMgbm8gbG9uZ2VyIGhhbmRsZWQgYnkg ZWRpdGluZyB0aGUgcGx1Z2luLgojIENoZWNrIG91dCB0aGUgJ0V4dGVuc2lvbnMnIHRhYiBp biB0aGUgVGV4dHBhdHRlcm4gYWRtaW4gOikKCgojIENoYW5naW5nIHRoZXNlIHdvbid0IGRv IGFueSBnb29kLiAgVGhleSdyZSBqdXN0IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmb3IgZGV2 ZWxvcG1lbnQuCmRlZmluZSgnVFJVX1RBR1NfRklFTEQnLCAnS2V5d29yZHMnKTsKZGVmaW5l KCdDTEVBTl9VUkxTJywgJ2NsZWFuX3VybHMnKTsKZGVmaW5lKCdUQUdfU0VDVElPTicsICd0 YWdfc2VjdGlvbicpOwpkZWZpbmUoJ1BBUk1fTkFNRScsICdwYXJtJyk7CmRlZmluZSgnVEFH U19JTl9GRUVEX0NBVEVHT1JJRVMnLCAndGFnc19pbl9mZWVkX2NhdGVnb3JpZXMnKTsKZGVm aW5lKCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOwpkZWZpbmUo J1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3NfaW5fd3JpdGVfdGFiJyk7CgpnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwokdHJ1X3RhZ3NfcHJlZnMgPSB0cnVfdGFnc19sb2FkX3ByZWZzKCk7 CgoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdfcGFy YW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglpZiAo IWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCWlmICh0cnVfdGFnc19yZWRpcmVjdF9pZl9u ZWVkZWQoJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJGNsZWFuX2F0 dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7 CgkJJHJlc3VsdCA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0aW9u IGluIFRYUCBjb2RlCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsKCQkJaWYgKGlzc2V0 KCRhdHRzWydub2FydGljbGVzJ10pKSB7CgkJCQl0cnVfdGFnc19yZWRpcmVjdCgkYXR0c1sn bm9hcnRpY2xlcyddLCB0cnVlKTsKCQkJfSBlbHNlIHsKCQkJCXR4cF9kaWUoZ1R4dCgnNDA0 X25vdF9mb3VuZCcpLCAnNDA0Jyk7CgkJCX0KCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJlc3Vs dDsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7Cgl9Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgewoJcmV0dXJuIHRydV90YWdzX2xp c3QodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxz ZSkpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0cykgewoJJGF0dHMgPSB0cnVf dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgdHJ1ZSwgZmFsc2UpOwoJJGFs bF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoKCXJldHVybiB0cnVfdGFn c19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsKfQoKCmZ1bmN0 aW9uIHRydV90YWdzX2Zyb21fYXJ0aWNsZSgkYXR0cykgewoJZ2xvYmFsICR0aGlzYXJ0aWNs ZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19nZXRf dGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFu ZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgdHJ1ZSk7CgkkYWxsX3RhZ3NfZm9yX3dl aWdodCA9ICRhbGxfdGFnczsKCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJ JGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7Cgl9 CgoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxs X3RhZ3NfZm9yX3dlaWdodCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygk YXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlOwoJZXh0cmFjdCgkdGhpc2Fy dGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgoJJHJzID0gc2FmZV9y b3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdz X2ZpZWxkIDw+ICcnIik7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkcnMpKTsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX3RhZ19zZWFyY2goJGF0dHMsICR0aGluZykgewoJ JHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNl KTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVlIDogZmFs c2U7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzLCAkc2FmZWh0bWwgPSB0cnVl KSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJZXh0cmFjdChsQXR0cyhhcnJheSgnc3Ry aXBoeXBoZW5zJyA9PiAwLCAndXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBh cm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFN RV0tPnZhbHVlKSkpOwoJJHBhcm0gPSAoJHN0cmlwaHlwaGVucyA/IHN0cl9yZXBsYWNlKCct JywgJyAnLCAkcGFybSkgOiAkcGFybSk7CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0g dXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0g aHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXJldHVybiBzdHJpcF90YWdzKGdw cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFy cmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7CgkgICAgICAg ICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsK CgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFn X3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVl cnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsK CQkJCSRhcnRpY2xlX3RhZ3MgPSBhcnJheSgpOwoJCQkJaWYgKGFycmF5X2tleV9leGlzdHMo JHRhZ3NfZmllbGQsICRhKSkgewoJCQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwg dHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCX0KCQkJ CSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdz KCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3Ry X3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3Rh Z3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8 ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtl eV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0 ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7 CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3Vk X2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0 cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVy biAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUpIHsKCXJldHVybiBsQXR0 cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDogJycpLAoJCQknYnJlYWsn CQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJCSdi cmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQknbWlucGVyY2VudCcJ PT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8g JzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJJ2NvdW50d3JhcGNo YXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcn KSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcs CgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNBcnRp Y2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5vZm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQnCQk9 PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycsCgkJCSdzZXRjbGFzc2Vz Jwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd0aXRsZScJCT0+ICcnLAoJCQkn bGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAnCQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRvZmYn CT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNmb3JtJwk9PiAnbm9uZScsCgkJCSdsaW5rcGF0 aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLAoJCQknZmlsdGVyc2VhcmNoJwk9 PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAn dGFnQWN0aXZlJwoJCSksJGF0dHMsIDApOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRf cXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcn OwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9u KTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0 aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAi IEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9z ZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNs dWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgkZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNo KCkgOiAnJyk7CgoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRh Z3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rp b25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8 IG5vdygpIik7Cglmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCSR0ZW1wX2FycmF5ID0gYXJy YXkoKTsKCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJvdykpIHsKCQkJ JHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRy b3dbJHRhZ3NfZmllbGRdKSkpOwoJCX0KCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxs X3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOwoJfQoKCXJldHVybiAk YWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1 ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzZWN0aW9u KTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2VjdGlv bikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkc2VjdGlv bikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93 ZWlnaHQpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCRhdHRzKTsKCgkk dGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQp OwoKCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQlpZiAo IWluX2FycmF5KCR0YWcsICRhbGxfdGFncykKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10g PCAkbWludGFnY291bnQKCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10gPiAkbWF4dGFnY291 bnQpIHsKCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQl9Cgl9CgoJJHNvcnRfYnlf Y291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQnKSAhPT0gZmFsc2UpOwoJJHNvcnRfYXNj ZW5kaW5nID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBmYWxzZSk7CgkkdGFnc193ZWln aHQgPSB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwg JHNvcnRfYXNjZW5kaW5nKTsKCglpZiAoJGxpc3RsaW1pdCA+IDAgJiYgJGxpc3RsaW1pdCA8 IGNvdW50KCR0YWdzX3dlaWdodCkpIHsKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7CgkJ aWYgKCRrZWVwID09ICdsYXJnZXN0JykgewoJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tl eXModHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgdHJ1ZSwgZmFsc2UpKTsKCQl9 IGVsc2UgewoJCQlpZiAoJGtlZXAgPT0gJ3JhbmRvbScpIHsKCQkJCWZvcmVhY2ggKCR0YWdz X3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFn XSA9IHJhbmQoMCwgJHdlaWdodCk7CgkJCQl9CgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5 X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkp OwoJCQl9IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsKCQkJCSRyZXNvcnRlZF90YWdz ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJCQkJbmF0Y2FzZXNvcnQoJHJlc29ydGVk X3RhZ3MpOwoJCQl9CgkJCSRjdXRvZmYgPSAnZXhhY3QnOwoJCX0KCgkJJGxhc3RfZ29vZF9p bmRleCA9ICRsaXN0bGltaXQgLSAxOwoJCWlmICgkY3V0b2ZmID09ICdjaHVuaycpIHsgLy9h bHRlcm5hdGl2ZSBpcyAnZXhhY3QnCgkJCSRsYXN0X3dlaWdodCA9IC0xOwoJCQlmb3IgKCRp ID0gMDsgJGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgewoJCQkJJG5ld193ZWlnaHQgPSAk dGFnc193ZWlnaHRbJHJlc29ydGVkX3RhZ3NbJGldXTsKCQkJCWlmICgkbmV3X3dlaWdodCAh PSAkbGFzdF93ZWlnaHQpIHsKCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOwoJCQkJ CSRsYXN0X3dlaWdodCA9ICRuZXdfd2VpZ2h0OwoJCQkJfQoJCQl9CgkJCWlmICgkbGFzdF9n b29kX2luZGV4IDwgMCkgewoJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAx OwoJCQl9CgkJfQoKCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNvcnRlZF90 YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7CgkJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0 ZWRfdGFnc1swXTsKCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdo dCkgewoJCQlpZiAoIWluX2FycmF5KCR0YWcsICRyZXNvcnRlZF90YWdzKSkgewoJCQkJdW5z ZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQkJfQoJCX0KCX0KCglpZiAoJGdlbmVyYXRlbGlu a3MpIHsKCQlpZiAoJGxpbmtwYXRoKSB7CgkJCSR1cmxwcmVmaXggPSAkbGlua3BhdGg7CgkJ CSR1cmxzdWZmaXggPSAkbGlua3BhdGh0YWlsOwoJCX0gZWxzZSB7CgkJCWlmICh0cnVfdGFn c19jbGVhbl91cmxzKCkpIHsKCQkJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVm c1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJCQl9IGVsc2UgewoJCQkJJHVybHByZWZp eCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAu ICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7CgkJ CX0KCQkJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7 CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkk dXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1 cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNlIGlmICgkdXNlbm9mb2xs b3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93JzsKCQl9Cgl9CgoJaWYg KGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1heCgkdGFnc193ZWlnaHQp OwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7CgkJJG1heCA9ICRtaW4g PSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2Vu dCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRhZ3NfaHRtbCA9IGFycmF5 KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdz dHJpcGh5cGhlbnMnID0+ICcxJykpOwoJJHRhZ19zZWFyY2hfdGFnID0gZnVuY3Rpb25fZXhp c3RzKCJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpID8gaHRtbHNwZWNpYWxjaGFyc19kZWNv ZGUoJHRhZ19zZWFyY2hfdGFnKSA6IGh0bWxfZW50aXR5X2RlY29kZSgkdGFnX3NlYXJjaF90 YWcpOwoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCSR0 YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0 ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9ICcnOwoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9 ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdf Y2xhc3MgPSAnJzsKCQlpZiAoJHNldGNsYXNzZXMpIHsKCQkJJHRhZ19jbGFzcyA9ICcgY2xh c3M9Iic7CgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRh Z1NpemVTbWFsbGVzdCI7CgkJCX0gZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJCQkk dGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFnX2Ns YXNzIC49ICJ0YWdTaXplTWVkaXVtIjsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICcgdGFnU2l6 ZScgLiAoJHdlaWdodCArIDEgLSAkbWluKTsKCQkJaWYgKCR0YWcgPT0gJHRhZ19zZWFyY2hf dGFnKSB7CgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3RpdmVjbGFzczsKCQkJfQoJCQkk dGFnX2NsYXNzIC49ICciJzsKCQl9CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9p YW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp ZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJaWYgKCR0aXRsZSkKCQkJ JHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJyInOwoJCSRkaXNwbGF5Y291 bnQ9ICcnOwoJCSRjb3VudCA9ICRjb3VudHdyYXBjaGFyc3swfSAuICR3ZWlnaHQgLiAkY291 bnR3cmFwY2hhcnN7MX07CgkJaWYgKCRzaG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3dj b3VudHMgPT0gJ2JvdGgnKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUg LiAkY291bnQgLiAnIic7CgkJaWYgKCRzaG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0 aXRsZScpCgkJCSRkaXNwbGF5Y291bnQgPSAnICcgLiAkY291bnQ7CgoJCWlmICgkdGV4dHRy YW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScpIHsKCQkJJHRhZyA9IHVjd29yZHMoJHRhZyk7CgkJ fSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgewoJCQkkdGFnID0g c3RydG91cHBlcigkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dl cmNhc2UnKSB7CgkJCSR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRl eHR0cmFuc2Zvcm0gPT0gJ2NhcGZpcnN0JykgewoJCQkkdGFnID0gdWNmaXJzdCgkdGFnKTsK CQl9CgoJCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJs cHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJs c3VmZml4IC4gJyInOwoJCQkkdGFnc19odG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJs IC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNp YWxjaGFycygkdGFnKSAuICc8L2E+JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgk dGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10g PSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4g aHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJ fSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICRk aXNwbGF5Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRt bCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xF QU4gVVJMIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAo dHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3Nf Y2xlYW5fdXJsX2hhbmRsZXInLCAncHJldGV4dCcpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf Y2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJZ2xvYmFsICR0cnVfdGFnc19w cmVmczsKCSRzdWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9V aSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAn LycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRf U0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRx YXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRx cykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVl cyhhcnJheV9maWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykg PT0gMiAmJiAkcGFydHNbMF0gPT0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFs dWUpIHsKCQkkdGFnID0gJHBhcnRzWzFdOwoJCSRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSA9 ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JyAuICR0YWcgLiAkcWF0 dHM7CgkJJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSAkc3VicGF0aCAuICR0cnVfdGFnc19w cmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJ TkcnXTsKCQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCQkJJF9QT1NUWydzZWN0aW9uJ10g PSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9QT1NUWyR0cnVf dGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOwoJCX0gZWxzZSB7CgkJCSRf R0VUWydzZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsK CQkJJF9HRVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJ fQoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJscygpIHsKCWdsb2JhbCAkdHJ1 X3RhZ3NfcHJlZnM7CglyZXR1cm4gKCdjbGVhbicgPT0gJHRydV90YWdzX3ByZWZzW0NMRUFO X1VSTFNdLT52YWx1ZSk7Cn0KCgojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicp IHsKCWFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7CglyZWdpc3Rlcl90YWIoJ2V4dGVu c2lvbnMnLCAndHJ1X3RhZ3MnLCAndHJ1X3RhZ3MnKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0 cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsKCglpZiAoJHRydV90YWdzX3ByZWZz W1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxsYmFjaygndHJ1 X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOwoJfQp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVudCwgJHN0ZXApIHsKCXJlcXVpcmVfcHJp dnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxl X2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhh cnJheSgpLCBmYWxzZSwgZmFsc2UpOwoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVl cnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxs X3RhZ3MsICRhbGxfdGFncyk7CgoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJl Y3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xv dWQsICRyZWRpcmVjdHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRl cl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsKCWdsb2JhbCAkZXZlbnQ7 CglwYWdldG9wKCd0cnVfdGFncycsICcnKTsKCglpbmNsdWRlKHR4cGF0aCAuICcvaW5jbHVk ZS90eHBfcHJlZnMucGhwJyk7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoKCWVjaG8gc3Rh cnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHJvd3NwYW49IjQi IHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywgSSBr bm93Li4uCgkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICczMDBweCcpLgoJCQl0 cihoQ2VsbChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQl0cih0ZCgkY2xvdWQpKS4KCQll bmRUYWJsZSgpLgoJJzwvdGQ+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBn cmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBzdGFydFRh YmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jl c3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6cmVkIicp LgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9y ZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0VGFibGUo J2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0aWNsZSBU YWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEpJywgJ3Ro JywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShnVHh0KCdS ZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJ dGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShnVHh0KCd0 bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRl eHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1dCgnc3Vi bWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90 YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAu ICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdUeHQoJ0Rl bGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0 ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3MoJycsIDIp LgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVi bGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdU eHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFibGUoKTsK CgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29s aWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEw MCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49 IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRh ZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlu a2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJ CQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBj ZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3Rh ZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJCQkJCXRk KCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVj dD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcn LmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsKCQkJfQoJ CQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJlY3QiIG1l dGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9uc3VibWl0 PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoJCQkJ CXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFs aWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHls ZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJCQkJCXRk YSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4dC1hbGln bjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAodmVyaWZ5 KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3PC9hPics ICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQoJ2hpZGRl bicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5kVGFibGUo KTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFibGUoJ2xp c3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0i MiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMn KS4nICgnLmdUeHQoJ2RlZmF1bHQgaXMnKS4nICcuJHRydV90YWdzX3ByZWZzW0NMRUFOX1VS TFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk bGUiJykuCgkJCQkJdGQocmFkaW9fbGlzdChDTEVBTl9VUkxTLAoJCQkJCQkJYXJyYXkoJ2Ns ZWFuJz0+Z1R4dCgnY2xlYW4nKSwgJ21lc3N5Jz0+Z1R4dCgnbWVzc3knKSksCgkJCQkJCQkk dHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJ CQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24gbmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90 YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KFRBR19TRUNU SU9OLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSwgJzE1JykpCgkJCQkp LgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1VSTCBwYXJhbWV0ZXIgZm9yIHRhZyBzZWFyY2gn KS4nIChkZWZhdWx0IGlzICInLiR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT5kZWZhdWx0 X3ZhbHVlLiciKTogJy4KCQkJCQkJJzxicj4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMg dW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpJywgJyBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5wdXQoUEFSTV9OQU1F LCAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUsICcxNScpKQoJCQkJKS4KCQkJ CXRyKAoJCQkJCXRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJTUy9BdG9tIGZlZWRzLCBpbiAi Q2F0ZWdvcnkiIGVsZW1lbnRzJykuCgkJCQkJCSc6IDxicj4oeW91IHByb2JhYmx5IHdhbnQg dGhpcyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVz bm9SYWRpbyhUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJHRydV90YWdzX3ByZWZzW1RBR1Nf SU5fRkVFRF9DQVRFR09SSUVTXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYSgn QXBwZW5kIHRoZSB0YWcgbGlzdCB0byB0aGUgYm9keSBvZiBSU1MvQXRvbSBmZWVkcywgJy4K CQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFnIjo8YnI+SWYgdGhpcyBpcyB0 dXJuZWQgb24sJy4KCQkJCQkJJ3lvdSBjYW4gZGVmaW5lIGEgIm1pc2MiIGZvcm0gbmFtZWQg dHJ1X3RhZ3NfZmVlZF90YWdzICcuCgkJCQkJCSd0aGF0IHdpbGwgYmUgdXNlZCB0byByZW5k ZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQuJywKCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxp Z246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0JPRFksICR0 cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0 cigKCQkJCQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBsaXN0IG9mIHRhZ3Mgb24gdGhl ICJXcml0ZSIgcGFnZScpLic6ICcsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3Rh Z3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJ CQkJdGQoJycpLgoJCQkJCXRkYShmSW5wdXQoJ3N1Ym1pdCcsICdwcmVmcycsIGdUeHQoJ1Nh dmUnKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyksICcgc3R5bGU9InRleHQtYWxp Z246cmlnaHQiJykKCQkJCSksCgkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lv dV9zdXJlJykgLiAnXCcpIicKCQkJKS4KCQllbmRUYWJsZSgpOwoKCWVjaG8gJzwvdGQ+PC90 cj4nLmVuZFRhYmxlKCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxl X2lucHV0KCkgewoJaWYgKGdwcygncHJlZnMnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1p bl91cGRhdGVfcHJlZnMoKTsKCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGUnKSkgewoJCXJldHVy biB0cnVfdGFnc19hZG1pbl9kZWxldGVfdGFnKGdwcygnZGVsZXRldGFnJykpOwoJfSBlbHNl IGlmIChncHMoJ3JlcGxhY2UnKSkgewoJCSRyZXN1bHQgPSB0cnVfdGFnc19hZG1pbl9yZXBs YWNlX3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpLCBmYWxzZSk7CgkJ cmV0dXJuICRyZXN1bHQgLiAnPGJyPicgLiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWco Z3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSk7Cgl9IGVsc2UgaWYgKGdwcygn cmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoZ3Bz KCdsZWZ0dGFnJyksIGdwcygncmlnaHR0YWcnKSk7Cgl9IGVsc2UgaWYgKGdwcygnZGVsZXRl X3JlZGlyZWN0JykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0 KGdwcygnZGVsZXRlX3JlZGlyZWN0JykpOwoJfSBlbHNlIHsKCQlyZXR1cm4gJyc7Cgl9Cn0K CgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKSB7CglnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwoJJHJlc3VsdHMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHRydV90YWdz X3ByZWZzIGFzICRwcmVmKSB7CgkJJHZhbGlkX3ZhbHVlID0gJHByZWYtPnZhbGlkYXRlX3Zh bHVlKGdwcygkcHJlZi0+bmFtZSkpOwoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZhbGlkX3Zh bHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsKCQkJcmV0dXJuICR2YWxpZF92YWx1ZTsgICMj IyB0aGlzIGlzIGEgc25lYWt5IHdheSB0byBoYW5kbGUgdmFsaWRhdGlvbiAtIHNvcnJ5IDsp CgkJfQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7CgkJCWlmICgkdmFs aWRfdmFsdWUgPT0gJHByZWYtPmRlZmF1bHRfdmFsdWUpIHsKCQkJCSRyZXN1bHQgPSB0cnVf dGFnc19kZWxldGVfcHJlZigkcHJlZi0+bmFtZSk7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0 ID0gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJHByZWYtPm5hbWUsICR2YWxpZF92YWx1ZSk7CgkJ CX0KCQkJaWYgKCRyZXN1bHQpIHsKCQkJCSRyZXN1bHRzW10gPSAnVXBkYXRlZCAnIC4gJHBy ZWYtPm5hbWU7CgkJCQkkcHJlZi0+dmFsdWUgPSAkdmFsaWRfdmFsdWU7CgkJCX0gZWxzZSB7 CgkJCQkkcmVzdWx0c1tdID0gJ0Vycm9yIHVwZGF0aW5nICcgLiAkcHJlZi0+bmFtZTsKCQkJ fQoJCX0KCX0KCWlmIChjb3VudCgkcmVzdWx0cykgPT0gMCkgewoJCXJldHVybiAnTm8gcmVj b3JkcyBuZWVkIHVwZGF0aW5nJzsKCX0gZWxzZSB7CgkJcmV0dXJuIGpvaW4oJzxicj4nLCAk cmVzdWx0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc191cHNlcnRfcHJlZigkbmFtZSwg JHZhbHVlKSB7CglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3Rz ICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKS4KCQknIChuYW1lIHZhcmNoYXIoMjU1 KSBwcmltYXJ5IGtleSwgJy4KCQkndmFsdWUgdmFyY2hhcigyNTUpIG5vdCBudWxsKScpKSB7 CgkJcmV0dXJuICdTZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0aGUgJyAuIHNh ZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpIC4gJyB0YWJsZS4nOwoJfQoKCXJldHVybiBzYWZl X3Vwc2VydCgndHJ1X3RhZ3NfcHJlZnMnLCAndmFsdWU9IicuJHZhbHVlLiciJywgJ25hbWU9 IicuJG5hbWUuJyInKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1l KSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3ByZWZzJywgJ25hbWU9IicuJG5hbWUu JyInKSkgewoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19wcmVmcycsICcxJykgPT0gMCAm JiAhc2FmZV9xdWVyeSgnZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZz JykpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9IGVsc2UgewoJ CXJldHVybiBmYWxzZTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90 YWcoJGRlbGV0ZXRhZykgewoJaWYgKHRyaW0oJGRlbGV0ZXRhZykpIHsKCQlyZXR1cm4gdHJ1 X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJGRlbGV0ZXRhZywgJycsIHRydWUpOwoJfSBlbHNl IHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlJzsKCX0KfQoKCmZ1bmN0aW9uIHRy dV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0YWcsICRhbGxv d19ibGFua19yZXBsYWNldGFnKSB7CgkkbWF0Y2h0YWcgPSB0cmltKCRtYXRjaHRhZyk7Cgkk cmVwbGFjZXRhZyA9IHRyaW0oJHJlcGxhY2V0YWcpOwoJaWYgKCRtYXRjaHRhZyAmJiAoJGFs bG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7CgkJaWYgKHNhZmVfdXBk YXRlKCd0ZXh0cGF0dGVybicsIFRSVV9UQUdTX0ZJRUxELic9dHJpbShib3RoIFwnLFwnIGZy b20gcmVwbGFjZShjb25jYXQoIiwiLCAnLlRSVV9UQUdTX0ZJRUxELicsICIsIiksIGNvbmNh dCgiLCIsIFwnJy5hZGRzbGFzaGVzKCRtYXRjaHRhZykuJ1wnLCAiLCIpLCBcJywnLmFkZHNs YXNoZXMoJHJlcGxhY2V0YWcpLicsXCcpKScsICcxJykpIHsKCQkJcmV0dXJuICdVcGRhdGVk ICcubXlzcWxfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicuaHRtbHNwZWNpYWxjaGFycygk bWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyZXBsYWNldGFnKS4nIiknOwoJ CX0gZWxzZSB7CgkJCXJldHVybiAnRXJyb3I6ICcgLiBteXNxbF9lcnJvcigpOwoJCX0KCX0g ZWxzZSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7 Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoJGxlZnR0YWcs ICRyaWdodHRhZykgewoJJGxlZnR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93 ZXIodHJpbSgkbGVmdHRhZykpKTsKCSRyaWdodHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nf c3RydG9sb3dlcih0cmltKCRyaWdodHRhZykpKTsKCWlmICghJGxlZnR0YWcgfHwgISRyaWdo dHRhZykgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMn OwoJfQoKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAu IHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKS4KCQknIChsZWZ0dGFnIHZhcmNoYXIo MjU1KSBwcmltYXJ5IGtleSwgJy4KCQkncmlnaHR0YWcgdmFyY2hhcigyNTUpIG5vdCBudWxs KScpKSB7CgkJcmV0dXJuICdTZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0aGUg JyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSAuICcgdGFibGUuJzsKCX0KCglp ZiAoc2FmZV9pbnNlcnQoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLiRsZWZ0 dGFnLiciLHJpZ2h0dGFnPSInLiRyaWdodHRhZy4nIicpKSB7CgkJcmV0dXJuICdSZWRpcmVj dCBhZGRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyI9PiInLmh0bWxzcGVj aWFsY2hhcnMoJHJpZ2h0dGFnKS4nIikgLSBwbGVhc2UgdGVzdCBpdCEnOwoJfSBlbHNlIHsK CQlyZXR1cm4gJ0Vycm9yIGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVhZHkgZXhpc3Q/ JzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRpcmVjdCgkbGVm dHRhZykgewoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRh Zz0iJy5hZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3Ry dV90YWdzX3JlZGlyZWN0cycsICcxJykgPT0gMCAmJiAhc2FmZV9xdWVyeSgnZHJvcCB0YWJs ZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpKSkgewoJCQlyZXR1cm4gJ1Jl ZGlyZWN0IGRlbGV0ZWQsIGJ1dCB1bmFibGUgdG8gZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngo J3RydV90YWdzX3JlZGlyZWN0cycpOwoJCX0KCQlyZXR1cm4gJ1JlZGlyZWN0IGRlbGV0ZWQg KCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciKSc7Cgl9IGVsc2UgewoJCXJldHVy biAnRXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf YWRtaW5fd3JpdGVfdGFiX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJJGNsb3VkID0gYXJy YXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUpKSk7Cglzb3J0KCRjbG91ZCk7CgoJJGlk ID0gKGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJRCdd KTsKCSRhcnRpY2xlX3RhZ3MgPSAoZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19n ZXRfdGFnc19mb3JfYXJ0aWNsZSgkaWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJZm9yZWFj aCAoJGNsb3VkIGFzICR0YWcpIHsKCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGlj bGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7CgkJJGxpbmtzW10gPSAn PGEgaHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25jbGljaz0idGhpcy5zZXRBdHRyaWJ1 dGUoXFxcJ2NsYXNzXFxcJywgdG9nZ2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hl cygkdGFnKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNw ZWNpYWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOwoJfQoJJHRvX2luc2VydCA9IGpvaW4oJywg JywgJGxpbmtzKTsKCSR0b19pbnNlcnQgPSAiPHN0eWxlPmEudGFnX2Nob3NlbntiYWNrZ3Jv dW5kLWNvbG9yOiAjRkVCOyBjb2xvcjogYmxhY2s7fTwvc3R5bGU+IiAuICR0b19pbnNlcnQ7 CgoJJGpzID0gPDw8RU9GCgkJdmFyIGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZCgna2V5d29yZHMnKTsKCQl2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJl bnROb2RlOwoJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdi cicpKTsKCQl2YXIgY2xvdWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJ Y2xvdWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJ Y2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7CgkJcGFyZW50LmFwcGVuZENoaWxk KGNsb3VkKTsKCgkJZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJdmFyIHJlZ2V4 VGFnID0gdGFnTmFtZS5yZXBsYWNlKC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9n LCJcXFxcJDEiKTsKCQkJdmFyIHRhZ1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyop IiArIHJlZ2V4VGFnICsgIlxcXHMqKCxcXFxzKnwkKSIpOwoJCQl2YXIgdGV4dGFyZWEgPSBk b2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsKCQkJdmFyIGN1cnZhbCA9IHRl eHRhcmVhLnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJaWYgKCcnID09IGN1cnZh bCkgewoJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJCQl9IGVsc2UgaWYgKGN1cnZh bC5tYXRjaCh0YWdSZWdleCkpIHsKCQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxh Y2UodGFnUmVnZXgsICckMScpLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCXJldHVybiAn JzsKCQkJfSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0g MSkpIHsKCQkJCXRleHRhcmVhLnZhbHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCX0gZWxzZSB7 CgkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFtZTsKCQkJfQoJCQlyZXR1cm4g J3RhZ19jaG9zZW4nOwoJCX0KRU9GOwoKCWVjaG8gc2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMg QVRPTS9SU1MgRkVFRCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRv bV9lbnRyeScpOwpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3Rl cCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2Nh bGxiYWNrKCd0cnVfdGFnc19yc3NfaGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24g dHJ1X3RhZ3NfcnNzX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf ZmVlZF9oYW5kbGVyKGZhbHNlKTsgfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVy KCRhdG9tKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRy YWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0 aWNsZSgkdGhpc2lkKTsKCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZ XS0+dmFsdWUpIHsKCQkkZXh0cmFib2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFn c19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywg JEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkk ZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0g dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUp OwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQo JGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGlj bGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0 aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0 cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGlj bGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tU QUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7 CgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRw dXRbXSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAn IiAvPic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1s c3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4g bi5qb2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xB U1NFUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVf dGFnc19wcmVmIHsKCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3Zh bHVlLCAkdHlwZSkgewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0g JGRlZmF1bHRfdmFsdWU7CgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1 ZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVl KCR2YWx1ZSkgewoJCWlmICgkdmFsdWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2Ug aWYgKCR0aGlzLT50eXBlID09ICdib29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxz ZSB7CgkJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFt ZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMg PSBhcnJheSgpOwoKCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxT XSA9IG5ldyB0cnVfdGFnc19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAn bWVzc3knID8gJ2NsZWFuJyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NF Q1RJT05dID0gbmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5n Jyk7CgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwg J3QnLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3 IHRydV90YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4n KTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdT X0lOX0ZFRURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVf VEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29s ZWFuJyk7CgoJaWYgKG15c3FsX3F1ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdz X3ByZWZzIikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAn MScpOwoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJCSRwcmVmc1skcm93WyduYW1lJ11d LT52YWx1ZSA9ICRyb3dbJ3ZhbHVlJ107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7Cn0KCgoj IyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3Bh cmFtZXRlcikgewoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7Cglm b3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCWlmICgk bGVmdHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVwbGFjZSgn LScsICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdo dHRhZywgZmFsc2UpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJlY3RzID0g YXJyYXkoKTsKCWlmIChteXNxbF9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFn c19yZWRpcmVjdHMiKSkgewoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRp cmVjdHMnLCAnMSBvcmRlciBieSBsZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cp IHsKCQkJJHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsK CQl9Cgl9CglyZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGly ZWN0KCRkZXN0aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3By ZWZzOwoJaWYgKCRpc19mdWxsX3VybCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1l c3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAk ZGVzdGluYXRpb247Cgl9IGVsc2UgewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygk ZGVzdGluYXRpb24pOwoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBiZWVu IHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247Cgl9CgoJaGVhZGVyKCdMb2NhdGlvbjog JyAuICR1cmwpOwoJdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOwp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfbGlua2lmeV90YWcoJHRhZykgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWlm ICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3Rh Z3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVybHBy ZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1 ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7 Cgl9CgkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsK CXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAk dGFnKSkgLiAkdXJsc3VmZml4Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9y X2FydGljbGUoJGFydGljbGVJRCkgewoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsK CSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRp Y2xlSUQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJJGFsbF90YWdzID0gYXJyYXkoKTsK CWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkcnMpKSB7CgkJJGFsbF90YWdz ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkcnNbJHRhZ3NfZmll bGRdKSkpOwoJfQoKCXJldHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKfQoK CiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNl ZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcwpmdW5jdGlvbiB0cnVfdGFn c19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNz KSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcvXlx3KyQvJywgJGJyZWFrKSkg ewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9IGVsc2UgewoJCXJldHVybiBk b1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0YWdfYXJyYXkpIHsKCSR0cmlt bWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgewoJCWlmICgi IiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0cmltKCR0YWcpOwoJCX0KCX0K CXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0 dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29yZHMgPSBleHBsb2RlKCcsJywg JHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJ aWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsKCQkJJGtleXdvcmRzW10g PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJCX0KCX0KCSRhdHRzWydrZXl3 b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJaWYgKGlzc2V0KCRhdHRzWydz ZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkg ewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ2V4Y2x1 ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pOwoJfQoK CWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCXVuc2V0KCRhdHRzWydub2Fy dGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7CgkJJGF0dHNb J2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgkYXR0c1snYWxsb3dvdmVycmlk ZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOwoJfQoKCXJldHVybiAk YXR0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIoJHN0cikgewoJaWYgKGZ1 bmN0aW9uX2V4aXN0cygibWJfc3RydG9sb3dlciIpKSB7CgkJcmV0dXJuIG1iX3N0cnRvbG93 ZXIoJHN0ciwgIlVURi04Iik7Cgl9IGVsc2UgewoJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHIp OwoJfQp9CgoKLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIGdyb3NzLCBidXQgSSBj YW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0CmZ1bmN0aW9uIHRydV90YWdz X3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRp bmcpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2J5 X2NvdW50LCAkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmc7CgoJJHRydV90YWdzX3RhZ3Nfd2Vp Z2h0ID0gJHRhZ3Nfd2VpZ2h0OwoJJHRydV90YWdzX3NvcnRfYnlfY291bnQgPSAkc29ydF9i eV9jb3VudDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsK CgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCXVzb3J0KCR0ZW1w X2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IiKTsKCgkkc29ydGVkX2Fy cmF5ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsKCQkkc29y dGVkX2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWddOwoJfQoKCXJldHVybiAkc29y dGVkX2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3Io JGxlZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90 YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCglpZiAoJHRy dV90YWdzX3NvcnRfYnlfY291bnQpIHsKCQkkbGVmdF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFn c193ZWlnaHRbJGxlZnRdOwoJCSRyaWdodF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWln aHRbJHJpZ2h0XTsKCQlpZiAoJGxlZnRfd2VpZ2h0ID09ICRyaWdodF93ZWlnaHQpIHsKCQkJ cmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7CgkJfSBlbHNlIGlmICgkdHJ1 X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsKCQkJcmV0dXJuICRsZWZ0X3dlaWdodCAtICRyaWdo dF93ZWlnaHQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyaWdodF93ZWlnaHQgLSAkbGVmdF93 ZWlnaHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gc3RybmF0Y2FzZWNtcCgkbGVmdCwgJHJp Z2h0KTsKCX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFW RSBUTyBFWElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJj aCgkYXR0cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAw LAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlvbicgICA9PiAnJywKCQkJCSdl eGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4gJycsCgkJCQknc29ydGJ5JyAg ICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywKCQkJCSdtb250aCcg ICAgID0+ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJCQknZnJvbnRwYWdlJyA9PiAn JywKCQkJCSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUnICAgICAgPT4gJ3Bhc3QnLAoJ CQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcgICAgPT4gMAoJCQkpLCRhdHRz LCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRpbmcgcXVlcnkgcGFydHMKCSRm cm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOwoJJGNh dGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSciLmRv c2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRlZ29y eSkuIicpKSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24pICAgPyAnJyA6ICIgYW5kIFNl Y3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7CgkkZXhjZXJwdGVkID0gKCRleGNl cnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOwoJJGF1dGhvciAgICA9 ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0gJyIuZG9zbGFzaCgkYXV0 aG9yKS4iJyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAgICA/ICcnIDogIiBhbmQgUG9z dGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7CgkkaWQgICAgICAgID0gKCEkaWQp ICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4iJyI7Cglzd2l0Y2gg KCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJlYWs7CgkJY2FzZSAn ZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3coKSI7IGJyZWFrOwoJCWRl ZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCkiOwoJfQoJaWYgKCFpc19u dW1lcmljKCRzdGF0dXMpKQoJCSRzdGF0dXMgPSBnZXRTdGF0dXNOdW0oJHN0YXR1cyk7CgoJ JGN1c3RvbSA9ICcnOwoJLy8gdHJ5aW5nIGN1c3RvbSBmaWVsZHMgaGVyZQoJJGN1c3RvbUZp ZWxkcyA9IGdldEN1c3RvbUZpZWxkcygpOwoJaWYgKCRjdXN0b21GaWVsZHMpIHsKCQlmb3Jl YWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkgewoJCQlpZiAoaXNzZXQoJGF0dHNbJGNG aWVsZF0pKQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07CgkJ fQoJCWlmKCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9t U3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsKCQllbHNlCgkJCSRjdXN0b20gPSAn JzsKCX0KCgkvL0FsbG93IGtleXdvcmRzIGZvciBuby1jdXN0b20gYXJ0aWNsZXMuIFRoYXQg dGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJaWYgKCRrZXl3b3JkcykgewoJCSRrZXlzID0gZG9T bGFzaChhcnJheV9tYXAoJ3RyaW0nLCBzcGxpdCgnLCcsICRrZXl3b3JkcykpKTsKCQlmb3Jl YWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIkZJTkRfSU5fU0VUKCci LiRrZXkuIicsS2V5d29yZHMpIjsKCQl9CgkJJGtleXdvcmRzID0gIiBhbmQgKCIgLiBqb2lu KCcgb3IgJywka2V5cGFydHMpIC4gIikiOwoJfQoKCWlmICgkaWQpCgkJJHN0YXR1c3EgPSAi IGFuZCBTdGF0dXMgPj0gJzQnIjsKCWVsc2UKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cz0n Ii5kb1NsYXNoKCRzdGF0dXMpLiInIjsKCgkkd2hlcmUgPSAiMSIgLiAkc3RhdHVzcS4gJHRp bWUuCgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhjZXJwdGVkIC4gJG1vbnRo IC4gJGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJvbnRwYWdlOwoKCQkkcGdv ZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoIiosIHVu aXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVybicsCgkJJHdo ZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0YnkpIC4gJyAnIC4gZG9TbGFzaCgk c29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1pdCkpOwoKCXJldHVybiAkcnM7 Cn0KCgoiO3M6ODoiaGVscF9yYXciO3M6NDk4OiJUbyBsZWFybiBtb3JlIGFib3V0IHRydV90 YWdzLCBjaGVjayBvdXQgdGhlICJpbnRyb2R1Y3RvcnkgYXJ0aWNsZSI6L2Jsb2cvNDkzL3Ry dXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4sICJyZWxlYXNlcyBwYWdl IjpodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNl cywgImZlYXR1cmUgbGlzdCI6aHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTUv dHJ1dGFncy1mZWF0dXJlLWxpc3QsIGFuZCAidXNhZ2UgaW5zdHJ1Y3Rpb25zIjpodHRwOi8v d3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9u cy4KCkkndmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9mIHRoZSBwbHVnaW47IG15 IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlmZmljdWx0IHRvIGtlZXAg bWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4iO3M6MzoibWQ1Ijtz OjMyOiIyMDAzZjJjODY4Yjc0YzdlOTY5ZTAxNzA3YjE4MzBhZiI7fQ==