# tru_tags v3.0 # 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 MCI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1 OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf dGFncyI7czo0OiJoZWxwIjtzOjU2ODoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3Ry dXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj51c2FnZSBpbnN0cnVjdGlvbnM8L2E+LjwvcD4K Cgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1 Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0 byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uPC9wPiI7 czo0OiJjb2RlIjtzOjMzNDAxOiIKI0NvcHlyaWdodCAyMDA3IE5hdGhhbiBBcnRodXIKI1Jl 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 CSR1cmxzdWZmaXggPSAkbGlua3BhdGh0YWlsOwoJCX0gZWxzZSB7CgkJCWlmICgkdHJ1X3Rh Z3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSB7CgkJCQkkdXJscHJlZml4ID0gaHUgLiAk dHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCQkJfSBlbHNlIHsK CQkJCSR1cmxwcmVmaXggPSBodSAuICc/cz0nIC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNU SU9OXS0+dmFsdWUgLiAnJmFtcDt0PSc7CgkJCX0KCQkJJHVybHN1ZmZpeCA9ICgkdHJ1X3Rh Z3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlID8gJy8nIDogJycpOwoJCX0KCgkJaWYgKCR1 c2VyZWx0YWcpIHsKCQkJaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkJJHVybHN1ZmZpeCAuPSAn IiByZWw9InRhZyBub2ZvbGxvdyc7CgkJCX0gZWxzZSB7CgkJCQkkdXJsc3VmZml4IC49ICci IHJlbD0idGFnJzsKCQkJfQoJCX0gZWxzZSBpZiAoJHVzZW5vZm9sbG93KSB7CgkJCSR1cmxz dWZmaXggLj0gJyIgcmVsPSJub2ZvbGxvdyc7CgkJfQoJfQoKCWlmIChjb3VudCgkdGFnc193 ZWlnaHQpID4gMCkgewoJCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsKCQkkbWluID0gbWlu KCR0YWdzX3dlaWdodCk7Cgl9IGVsc2UgewoJCSRtYXggPSAkbWluID0gMDsKCX0KCSRzdGVw dmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBlcmNlbnQgLSAkbWlucGVyY2Vu dCkgLyAoJG1heCAtICRtaW4pOwoKCSR0YWdzX2h0bWwgPSBhcnJheSgpOwoJJHRhZ19zZWFy Y2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBoeXBoZW5zJyA9 PiAnMScpKTsKCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygiaHRtbHNwZWNp YWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0YWdfc2VhcmNo X3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsKCWZvcmVhY2gg KCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkkdGFnX3dlaWdodCA9IGZs b29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFsdWUpOwoKCQkk c3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5bGUgPSAnIHN0eWxlPSJmb250 LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkkdGFnX2NsYXNzID0gJyc7CgkJ aWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSInOwoJCQlpZiAo JHdlaWdodCA9PSAkbWluKSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3Qi OwoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1heCkgewoJCQkJJHRhZ19jbGFzcyAuPSAi dGFnU2l6ZUxhcmdlc3QiOwoJCQl9IGVsc2UgewoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6 ZU1lZGl1bSI7CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQg KyAxIC0gJG1pbik7CgkJCWlmICgkdGFnID09ICR0YWdfc2VhcmNoX3RhZykgewoJCQkJJHRh Z19jbGFzcyAuPSAnICcgLiAkYWN0aXZlY2xhc3M7CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAn Iic7CgkJfQoKCQkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6 Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4 NzUKCQkkdGl0bGVjb3VudCA9ICcnOwoJCWlmICgkdGl0bGUpCgkJCSR0aXRsZWNvdW50ID0g JyB0aXRsZT0iJyAuICR0aXRsZSAuICciJzsKCQkkZGlzcGxheWNvdW50PSAnJzsKCQkkY291 bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9 OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRzID09ICdib3Ro JykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJGNvdW50IC4gJyIn OwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQoJCQkkZGlz cGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2Nh cGl0YWxpemUnKSB7CgkJCSR0YWcgPSB1Y3dvcmRzKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRl eHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsKCQkJJHRhZyA9IHN0cnRvdXBwZXIoJHRh Zyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnbG93ZXJjYXNlJykgewoJCQkk dGFnID0gc3RydG9sb3dlcigkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09 ICdjYXBmaXJzdCcpIHsKCQkJJHRhZyA9IHVjZmlyc3QoJHRhZyk7CgkJfQoKCQlpZiAoJGdl bmVyYXRlbGlua3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHVybGVu Y29kZShzdHJfcmVwbGFjZSgnICcsICctJywgJHRhZykpIC4gJHVybHN1ZmZpeCAuICciJzsK CQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9JyAuICR3aG9sZXVybCAuICR0YWdfY2xhc3Mg LiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykg LiAnPC9hPicgLiAkZGlzcGxheWNvdW50OwoJCX0gZWxzZSBpZiAoJHRhZ19jbGFzcyB8fCAk c3R5bGUgfHwgJHRpdGxlY291bnQpIHsKCQkJJHRhZ3NfaHRtbFtdID0gJzxzcGFuJyAuICR0 YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuIGh0bWxzcGVjaWFsY2hh cnMoJHRhZykgLiAnPC9zcGFuPicgLiAkZGlzcGxheWNvdW50OwoJCX0gZWxzZSB7CgkJCSR0 YWdzX2h0bWxbXSA9IGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAkZGlzcGxheWNvdW50OwoJ CX0KCX0KCXJldHVybiB0cnVfdGFnc19kb193cmFwKCR0YWdzX2h0bWwsICR3cmFwdGFnLCAk YnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwp9CgoKIyMjIENMRUFOIFVSTCBGVU5DVElP TlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKCR0cnVfdGFnc19wcmVm c1tDTEVBTl9VUkxTXS0+dmFsdWUgPT0gJ2NsZWFuJykgewoJcmVnaXN0ZXJfY2FsbGJhY2so J3RydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyJywgJ3ByZXRleHQnKTsKfQoKZnVuY3Rpb24g dHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgewoJZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKCSRzdWJwYXRoID0gcHJlZ19yZXBsYWNlKCIvaHR0cHM/OlwvXC8u KihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRz dWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgiL14kcmVnc2FmZXN1YnBhdGgv aSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkkcXMgPSBzdHJwb3MoJHJlcSwg Jz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRyZXEsICRxcyArIDEpIDogJycp OwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAkcXMpOwoKCSRwYXJ0cyA9IGFy cmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoc3BsaXQoJy8nLCAkcmVxKSkpOwoJaWYgKGNvdW50 KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNU SU9OXS0+dmFsdWUpIHsKCQkkdGFnID0gJHBhcnRzWzFdOwoJCSRfU0VSVkVSWydRVUVSWV9T VFJJTkcnXSA9ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JyAuICR0 YWcgLiAkcWF0dHM7CgkJJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSAkc3VicGF0aCAuICR0 cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8/JyAuICRfU0VSVkVSWydR VUVSWV9TVFJJTkcnXTsKCQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsKCQkJJF9QT1NUWydz ZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZTsKCQkJJF9Q T1NUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOwoJCX0gZWxz ZSB7CgkJCSRfR0VUWydzZWN0aW9uJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05d LT52YWx1ZTsKCQkJJF9HRVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9 ICR0YWc7CgkJfQoJfQp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05TICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7 CglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOwoJcmVnaXN0ZXJfdGFiKCdleHRlbnNp b25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7CglyZWdpc3Rlcl9jYWxsYmFjaygndHJ1 X3RhZ3NfYWRtaW5fdGFiJywgJ3RydV90YWdzJyk7CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tU QUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7CgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90 YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyJywgJ2FydGljbGUnKTsKCX0KfQoKCmZ1bmN0 aW9uIHRydV90YWdzX2FkbWluX3RhYigkZXZlbnQsICRzdGVwKSB7CglyZXF1aXJlX3ByaXZz KCd0cnVfdGFncycpOwoKCSRyZXN1bHRzID0gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9p bnB1dCgpOwoKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJy YXkoKSwgZmFsc2UsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5 KCRhdHRzKTsKCSRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90 YWdzLCAkYWxsX3RhZ3MpOwoKCSRyZWRpcmVjdHMgPSB0cnVfdGFnc19sb2FkX3JlZGlyZWN0 cygpOwoKCXRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNsb3Vk LCAkcmVkaXJlY3RzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJf cGFnZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKSB7CglnbG9iYWwgJGV2ZW50OwoJ cGFnZXRvcCgndHJ1X3RhZ3MnLCAnJyk7CgoJaW5jbHVkZSh0eHBhdGggLiAnL2luY2x1ZGUv dHhwX3ByZWZzLnBocCcpOwoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCgllY2hvIHN0YXJ0 VGFibGUoJ2xheW91dCcsICcnLCAnJywgJzEwcHgnKS4nPHRyPjx0ZCByb3dzcGFuPSI0IiBz dHlsZT0iYm9yZGVyLXJpZ2h0OjJweCBzb2xpZCBncmF5Ij4nLiAgIyBJIGtub3csIEkga25v dy4uLgoJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4KCQkJdHIo aENlbGwoZ1R4dCgnQ3VycmVudCB0YWdzJykpKS4KCQkJdHIodGQoJGNsb3VkKSkuCgkJZW5k VGFibGUoKS4KCSc8L3RkPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3Jh eTt3aWR0aDo0MDBweCI+JzsKCgkJaWYgKCRyZXN1bHRzKSB7CgkJCWVjaG8gc3RhcnRUYWJs ZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuCgkJCQl0cihoQ2VsbChnVHh0KCdSZXN1 bHRzJykpKS4KCQkJCXRyKHRkYSgkcmVzdWx0cyksICcgc3R5bGU9ImNvbG9yOnJlZCInKS4K CQkJZW5kVGFibGUoKTsKCQkJZWNobyAnPC90ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRl ci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7CgkJfQoKCgkJZWNobyBzdGFydFRhYmxlKCds aXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ0FydGljbGUgVGFn IE1haW50ZW5hbmNlJykuJyAoJy5nVHh0KCdDYXNlIFNlbnNpdGl2ZScpLichKScsICd0aCcs ICcgY29sc3Bhbj0iNSInKSkuCgkJCXRyKAoJCQkJZm9ybSgKCQkJCQl0ZGEoZ1R4dCgnUmVu YW1lJykuJzogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk KHRleHRfaW5wdXQoJ21hdGNodGFnJywgJycsICcxNScpKS4KCQkJCQl0ZGEoZ1R4dCgndG8n KS4nOicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0 X2lucHV0KCdyZXBsYWNldGFnJywgJycsICcxNScpKS4KCQkJCQl0ZChmSW5wdXQoJ3N1Ym1p dCcsICdyZXBsYWNlJywgZ1R4dCgnUnVuJyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFn cycpKSwKCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAn XCcpIicKCQkJCSkKCQkJKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShnVHh0KCdEZWxl dGUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo dGV4dF9pbnB1dCgnZGVsZXRldGFnJywgJycsICcxNScpKS4KCQkJCQl0ZGNzKCcnLCAyKS4K CQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcsICdkZWxldGUnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxp c2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0 KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCWVuZFRhYmxlKCk7CgoJ ZWNobyAnPC90ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlk IGdyYXkiPic7CgoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAl JykuCgkJCXRyKHRhZyhnVHh0KCdSZWRpcmVjdGlvbnMnKSwgJ3RoJywgJyBjb2xzcGFuPSI0 IicpKTsKCQkJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmlnaHR0YWcp IHsKCQkJCWVjaG8gdHIoCgkJCQkJdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xpbmtp ZnlfdGFnKCRsZWZ0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4KCQkJ CQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu dGVyIicpLgoJCQkJCXRkYShocmVmKCRyaWdodHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWco JHJpZ2h0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4KCQkJCQl0ZCgn PGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVkaXJlY3Q9 Jy51cmxlbmNvZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5KFwnJy5n VHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykKCQkJCSk7CgkJCX0KCQkJ ZWNobyB0cigKCQkJCSc8Zm9ybSBuYW1lPSJyZWRpcmVjdCIgaWQ9InJlZGlyZWN0IiBtZXRo b2Q9InBvc3QiIGFjdGlvbj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzIiBvbnN1Ym1pdD0i cmV0dXJuIHZlcmlmeShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSI+Jy4KCQkJCQl0 ZGEodGV4dF9pbnB1dCgnbGVmdHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4dC1hbGln bjpjZW50ZXIiJykuCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEo dGV4dF9pbnB1dCgncmlnaHR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246 Y2VudGVyIicpLgoJCQkJCXRkYSgnPGEgaHJlZj0iIyIgb25jbGljaz0iaWYgKHZlcmlmeShc JycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo XCdyZWRpcmVjdFwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+QWRkIG5ldzwvYT4nLCAn IHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJZklucHV0KCdoaWRkZW4n LCAncmVkaXJlY3QnLCAnMScpLgoJCQkJJzwvZm9ybT4nCgoJCQkpLgoJCWVuZFRhYmxlKCk7 CgoJZWNobyAnPC90ZD48L3RyPjx0cj48dGQ+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0 JykuCgkJCXRyKHRhZyhnVHh0KCdQcmVmZXJlbmNlcycpLCAndGgnLCAnIGNvbHNwYW49IjIi JykpLgoJCQlmb3JtKAoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1VzZSBjbGVhbiBVUkxzJyku JzogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHJhZGlv X2xpc3QoQ0xFQU5fVVJMUywKCQkJCQkJCWFycmF5KCdjbGVhbic9PmdUeHQoJ2NsZWFuJyks ICdtZXNzeSc9PmdUeHQoJ21lc3N5JykpLAoJCQkJCQkJJHRydV90YWdzX3ByZWZzW0NMRUFO X1VSTFNdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1RhZyBzZWN0 aW9uIG5hbWUnKS4nIChkZWZhdWx0IGlzICInLiR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElP Tl0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk bGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZz W1RBR19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShn VHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4k dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5 bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KFBBUk1f TkFNRSwgJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlLCAnMTUnKSkKCQkJCSku CgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnUHV0IHRhZ3MgaW50byBSU1MvQXRvbSBmZWVkcywg aW4gIkNhdGVnb3J5IiBlbGVtZW50cycpLgoJCQkJCQknOiA8YnI+KHlvdSBwcm9iYWJseSB3 YW50IHRoaXMpJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk KHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICR0cnVfdGFnc19wcmVmc1tU QUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0 ZGEoJ0FwcGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhlIGJvZHkgb2YgUlNTL0F0b20gZmVlZHMs ICcuCgkJCQkJCSd3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRhZyI6PGJyPklmIHRoaXMg aXMgdHVybmVkIG9uLCcuCgkJCQkJCSd5b3UgY2FuIGRlZmluZSBhICJtaXNjIiBmb3JtIG5h bWVkIHRydV90YWdzX2ZlZWRfdGFncyAnLgoJCQkJCQkndGhhdCB3aWxsIGJlIHVzZWQgdG8g cmVuZGVyIHRoZSB0YWdzIGluIHRoZSBmZWVkLicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZ LCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkpCgkJCQkpLgoJ CQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9u IHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiAnLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln bjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX1dSSVRFX1RBQiwgJHRy dV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRy KAoJCQkJCXRkKCcnKS4KCQkJCQl0ZGEoZklucHV0KCdzdWJtaXQnLCAncHJlZnMnLCBnVHh0 KCdTYXZlJyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpLCAnIHN0eWxlPSJ0ZXh0 LWFsaWduOnJpZ2h0IicpCgkJCQkpLAoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2Fy ZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3Rk PjwvdHI+Jy5lbmRUYWJsZSgpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hh bmRsZV9pbnB1dCgpIHsKCWlmIChncHMoJ3ByZWZzJykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3Nf YWRtaW5fdXBkYXRlX3ByZWZzKCk7Cgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsKCQly ZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZyhncHMoJ2RlbGV0ZXRhZycpKTsKCX0g ZWxzZSBpZiAoZ3BzKCdyZXBsYWNlJykpIHsKCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5f cmVwbGFjZV90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2Up OwoJCXJldHVybiAkcmVzdWx0IC4gJzxicj4nIC4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3Rf dGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJykpOwoJfSBlbHNlIGlmIChn cHMoJ3JlZGlyZWN0JykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFn KGdwcygnbGVmdHRhZycpLCBncHMoJ3JpZ2h0dGFnJykpOwoJfSBlbHNlIGlmIChncHMoJ2Rl bGV0ZV9yZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRp cmVjdChncHMoJ2RlbGV0ZV9yZWRpcmVjdCcpKTsKCX0gZWxzZSB7CgkJcmV0dXJuICcnOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgewoJZ2xvYmFs ICR0cnVfdGFnc19wcmVmczsKCSRyZXN1bHRzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0cnVf dGFnc19wcmVmcyBhcyAkcHJlZikgewoJCSR2YWxpZF92YWx1ZSA9ICRwcmVmLT52YWxpZGF0 ZV92YWx1ZShncHMoJHByZWYtPm5hbWUpKTsKCQlpZiAoJHZhbGlkX3ZhbHVlICYmICR2YWxp ZF92YWx1ZSA8PiBncHMoJHByZWYtPm5hbWUpKSB7CgkJCXJldHVybiAkdmFsaWRfdmFsdWU7 ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3Jy eSA7KQoJCX0KCQlpZiAoJHZhbGlkX3ZhbHVlIDw+ICRwcmVmLT52YWx1ZSkgewoJCQlpZiAo JHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7CgkJCQkkcmVzdWx0ID0g dHJ1X3RhZ3NfZGVsZXRlX3ByZWYoJHByZWYtPm5hbWUpOwoJCQl9IGVsc2UgewoJCQkJJHJl c3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRfdmFsdWUp OwoJCQl9CgkJCWlmICgkcmVzdWx0KSB7CgkJCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQgJyAu ICRwcmVmLT5uYW1lOwoJCQkJJHByZWYtPnZhbHVlID0gJHZhbGlkX3ZhbHVlOwoJCQl9IGVs c2UgewoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4gJHByZWYtPm5hbWU7 CgkJCX0KCQl9Cgl9CglpZiAoY291bnQoJHJlc3VsdHMpID09IDApIHsKCQlyZXR1cm4gJ05v IHJlY29yZHMgbmVlZCB1cGRhdGluZyc7Cgl9IGVsc2UgewoJCXJldHVybiBqb2luKCc8YnI+ JywgJHJlc3VsdHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5h bWUsICR2YWx1ZSkgewoJaWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4 aXN0cyAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykuCgkJJyAobmFtZSB2YXJjaGFy KDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCkn KSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhlICcg LiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSAuICcgdGFibGUuJzsKCX0KCglyZXR1cm4g c2FmZV91cHNlcnQoJ3RydV90YWdzX3ByZWZzJywgJ3ZhbHVlPSInLiR2YWx1ZS4nIicsICdu YW1lPSInLiRuYW1lLiciJyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19kZWxldGVfcHJlZigk bmFtZSkgewoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRu YW1lLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcHJlZnMnLCAnMScpID09 IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19w cmVmcycpKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSBlbHNl IHsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxl dGVfdGFnKCRkZWxldGV0YWcpIHsKCWlmICh0cmltKCRkZWxldGV0YWcpKSB7CgkJcmV0dXJu IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRkZWxldGV0YWcsICcnLCB0cnVlKTsKCX0g ZWxzZSB7CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7Cgl9Cn0KCgpmdW5jdGlv biB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkbWF0Y2h0YWcsICRyZXBsYWNldGFnLCAk YWxsb3dfYmxhbmtfcmVwbGFjZXRhZykgewoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0YWcp OwoJJHJlcGxhY2V0YWcgPSB0cmltKCRyZXBsYWNldGFnKTsKCWlmICgkbWF0Y2h0YWcgJiYg KCRhbGxvd19ibGFua19yZXBsYWNldGFnIHx8ICRyZXBsYWNldGFnKSkgewoJCWlmIChzYWZl X3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90aCBcJyxc JyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAiLCIpLCBj b25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwgXCcsJy5h ZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7CgkJCXJldHVybiAnVXBk YXRlZCAnLm15c3FsX2FmZmVjdGVkX3Jvd3MoKS4nIHJvd3MgKCInLmh0bWxzcGVjaWFsY2hh cnMoJG1hdGNodGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygkcmVwbGFjZXRhZykuJyIp JzsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJ0Vycm9yOiAnIC4gbXlzcWxfZXJyb3IoKTsKCQl9 Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVs ZHMnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKCRsZWZ0 dGFnLCAkcmlnaHR0YWcpIHsKCSRsZWZ0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0 b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7CgkkcmlnaHR0YWcgPSBhZGRzbGFzaGVzKHRydV90 YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7CglpZiAoISRsZWZ0dGFnIHx8ICEk cmlnaHR0YWcpIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmll bGRzJzsKCX0KCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3Rz ICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykuCgkJJyAobGVmdHRhZyB2YXJj aGFyKDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3JpZ2h0dGFnIHZhcmNoYXIoMjU1KSBub3Qg bnVsbCknKSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUg dGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykgLiAnIHRhYmxlLic7Cgl9 CgoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy4k bGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyInKSkgewoJCXJldHVybiAnUmVk aXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1s c3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsKCX0gZWxz ZSB7CgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0gZG9lcyBpdCBhbHJlYWR5IGV4 aXN0Pyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3Qo JGxlZnR0YWcpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xl ZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkgewoJCWlmIChzYWZlX2NvdW50 KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3Ag dGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsKCQkJcmV0dXJu ICdSZWRpcmVjdCBkZWxldGVkLCBidXQgdW5hYmxlIHRvIGRyb3AgdGFibGUgJyAuIHNhZmVf cGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKTsKCQl9CgkJcmV0dXJuICdSZWRpcmVjdCBkZWxl dGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOwoJfSBlbHNlIHsKCQly ZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCSRjbG91ZCA9 IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRh cmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlKSkpOwoJc29ydCgkY2xvdWQpOwoK CSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1sn SUQnXSk7CgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1X3Rh Z3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtzID0gYXJyYXkoKTsKCWZv cmVhY2ggKCRjbG91ZCBhcyAkdGFnKSB7CgkJJHN0eWxlID0gKGluX2FycmF5KCR0YWcsICRh cnRpY2xlX3RhZ3MpID8gJyBjbGFzcz0idGFnX2Nob3NlbiInIDogJycpOwoJCSRsaW5rc1td ID0gJzxhIGhyZWY9IiNhZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRoaXMuc2V0QXR0 cmlidXRlKFxcXCdjbGFzc1xcXCcsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNs YXNoZXMoJHRhZykpLidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0 bWxzcGVjaWFsY2hhcnMoJHRhZykpIC4gJzxcL2E+JzsKCX0KCSR0b19pbnNlcnQgPSBqb2lu KCcsICcsICRsaW5rcyk7CgkkdG9faW5zZXJ0ID0gIjxzdHlsZT5hLnRhZ19jaG9zZW57YmFj a2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNrO308L3N0eWxlPiIgLiAkdG9faW5z ZXJ0OwoKCSRqcyA9IDw8PEVPRgoJCXZhciBrZXl3b3Jkc0ZpZWxkID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoJ2tleXdvcmRzJyk7CgkJdmFyIHBhcmVudCA9IGtleXdvcmRzRmllbGQu cGFyZW50Tm9kZTsKCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVu dCgnYnInKSk7CgkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3Bhbicp OwoJCWNsb3VkLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndHJ1X3RhZ3NfYWRtaW5fdGFncycp OwoJCWNsb3VkLmlubmVySFRNTCA9ICd7JHRvX2luc2VydH0nOwoJCXBhcmVudC5hcHBlbmRD aGlsZChjbG91ZCk7CgoJCWZ1bmN0aW9uIHRvZ2dsZVRhZyh0YWdOYW1lKSB7CgkJCXZhciBy ZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtcXFxcXF5cXCQqK1tcXF0/e30uPSE6KHwp XSkvZywiXFxcXCQxIik7CgkJCXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnwsKVxc XHMqKSIgKyByZWdleFRhZyArICJcXFxzKigsXFxccyp8JCkiKTsKCQkJdmFyIHRleHRhcmVh ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleXdvcmRzJyk7CgkJCXZhciBjdXJ2YWwg PSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7CgkJCWlmICgnJyA9PSBj dXJ2YWwpIHsKCQkJCXRleHRhcmVhLnZhbHVlID0gdGFnTmFtZTsKCQkJfSBlbHNlIGlmIChj dXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5y ZXBsYWNlKHRhZ1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7CgkJCQlyZXR1 cm4gJyc7CgkJCX0gZWxzZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFsLmxlbmd0 aCAtIDEpKSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdOYW1lOwoJCQl9IGVs c2UgewoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7CgkJCX0KCQkJcmV0 dXJuICd0YWdfY2hvc2VuJzsKCQl9CkVPRjsKCgllY2hvIHNjcmlwdF9qcygkanMpOwp9CgoK IyMjIEFUT00vUlNTIEZFRUQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCgpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYXRvbV9oYW5kbGVyJywg J2F0b21fZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwg JHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQpyZWdpc3Rl cl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7CmZ1bmN0 aW9uIHRydV90YWdzX3Jzc19oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90 YWdzX2ZlZWRfaGFuZGxlcihmYWxzZSk7IH0KCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFu ZGxlcigkYXRvbSkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRydV90YWdzX3ByZWZzOwoJ ZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9y X2FydGljbGUoJHRoaXNpZCk7CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURf Qk9EWV0tPnZhbHVlKSB7CgkJJGV4dHJhYm9keSA9ICcnOwoJCSRGT1JNX05BTUUgPSAndHJ1 X3RhZ3NfZmVlZF90YWdzJzsKCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFt ZScsICRGT1JNX05BTUUpKSB7CgkJCSRmb3JtID0gZmV0Y2hfZm9ybSgkRk9STV9OQU1FKTsK CQkJJGV4dHJhYm9keSA9IHRyaW0ocGFyc2UoJGZvcm0pKTsKCQl9IGVsc2UgewoJCQkkYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCB0 cnVlKTsKCQkJJGV4dHJhYm9keSA9ICc8cD50YWdzOiAnIC4gdHJ1X3RhZ3NfcmVuZGVyX2Ns b3VkKCRhdHRzLCAkdGFncywgJHRhZ3MpIC4gJzwvcD4nOwoJCX0KCQlnbG9iYWwgJHRoaXNh cnRpY2xlOwoJCWlmICh0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKSkgewoJCQkkdGhp c2FydGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4u JGV4dHJhYm9keS5uOwoJCX0KCQkkdGhpc2FydGljbGVbJ2JvZHknXSA9IHRyaW0oJHRoaXNh cnRpY2xlWydib2R5J10pLm4uJGV4dHJhYm9keS5uOwoJfQoKCWlmICgkdHJ1X3RhZ3NfcHJl ZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkgewoJCSRvdXRwdXQgPSBhcnJh eSgpOwoJCWZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKCQkJaWYgKCRhdG9tKSB7CgkJCQkk b3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcp IC4gJyIgLz4nOwoJCQl9IGVsc2UgewoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeT4nIC4g aHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2NhdGVnb3J5Pic7CgkJCX0KCQl9CgkJcmV0 dXJuIG4uam9pbihuLCAkb3V0cHV0KS5uOwoJfQp9CgoKIyMjIFBSRUZTIEZVTkNUSU9OUyAv IENMQVNTRVMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKY2xhc3Mg dHJ1X3RhZ3NfcHJlZiB7CglmdW5jdGlvbiB0cnVfdGFnc19wcmVmKCRuYW1lLCAkZGVmYXVs dF92YWx1ZSwgJHR5cGUpIHsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT52YWx1 ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJCSR0aGlzLT5kZWZhdWx0X3ZhbHVlID0gJGRlZmF1bHRf dmFsdWU7CgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsKCX0KCglmdW5jdGlvbiB2YWxpZGF0ZV92 YWx1ZSgkdmFsdWUpIHsKCQlpZiAoJHZhbHVlKSB7CgkJCXJldHVybiAkdmFsdWU7CgkJfSBl bHNlIGlmICgkdGhpcy0+dHlwZSA9PSAnYm9vbGVhbicpIHsKCQkJcmV0dXJuICcwJzsKCQl9 IGVsc2UgewoJCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGZvciAnIC4gJHRoaXMt Pm5hbWU7CgkJfQoJfQp9CgpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3ByZWZzKCkgewoJJHBy ZWZzID0gYXJyYXkoKTsKCglnbG9iYWwgJHBlcm1saW5rX21vZGU7CgkkcHJlZnNbQ0xFQU5f VVJMU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihDTEVBTl9VUkxTLCAoJHBlcm1saW5rX21vZGUg IT0gJ21lc3N5JyA/ICdjbGVhbicgOiAnbWVzc3knKSwgJ3N0cmluZycpOwoJJHByZWZzW1RB R19TRUNUSU9OXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR19TRUNUSU9OLCAndGFnJywgJ3N0 cmluZycpOwoJJHByZWZzW1BBUk1fTkFNRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihQQVJNX05B TUUsICd0JywgJ3N0cmluZycpOwoJJHByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXSA9 IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAnMScsICdib29s ZWFuJyk7CgkkcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldID0gbmV3IHRydV90YWdzX3ByZWYo VEFHU19JTl9GRUVEX0JPRFksICcwJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdTX0lOX1dS SVRFX1RBQl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX1dSSVRFX1RBQiwgJzEnLCAn Ym9vbGVhbicpOwoKCWlmIChteXNxbF9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVf dGFnc19wcmVmcyIpKSB7CgkJJHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3ByZWZz JywgJzEnKTsKCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJCQkkcHJlZnNbJHJvd1snbmFt ZSddXS0+dmFsdWUgPSAkcm93Wyd2YWx1ZSddOwoJCX0KCX0KCglyZXR1cm4gJHByZWZzOwp9 CgoKIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQoJHRh Z19wYXJhbWV0ZXIpIHsKCSRyZWRpcmVjdHMgPSB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygp OwoJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmlnaHR0YWcpIHsKCQlp ZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJGxlZnR0YWcgPT0gc3RyX3JlcGxh Y2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgewoJCQl0cnVfdGFnc19yZWRpcmVjdCgk cmlnaHR0YWcsIGZhbHNlKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoKCXJldHVybiBmYWxz ZTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCkgewoJJHJlZGlyZWN0 cyA9IGFycmF5KCk7CglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1 X3RhZ3NfcmVkaXJlY3RzIikpIHsKCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3Nf cmVkaXJlY3RzJywgJzEgb3JkZXIgYnkgbGVmdHRhZycpOwoJCWZvcmVhY2ggKCRycyBhcyAk cm93KSB7CgkJCSRyZWRpcmVjdHNbJHJvd1snbGVmdHRhZyddXSA9ICRyb3dbJ3JpZ2h0dGFn J107CgkJfQoJfQoJcmV0dXJuICRyZWRpcmVjdHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19y ZWRpcmVjdCgkZGVzdGluYXRpb24sICRpc19mdWxsX3VybCkgewoJZ2xvYmFsICR0cnVfdGFn c19wcmVmczsKCWlmICgkaXNfZnVsbF91cmwpIHsKCQkkdXJsID0gJGRlc3RpbmF0aW9uOwoJ CSRtZXNzYWdlID0gJ1RoZSByZXNvdXJjZSB5b3UgcmVxdWVzdGVkIGhhcyBtb3ZlZCB0byAn IC4gJGRlc3RpbmF0aW9uOwoJfSBlbHNlIHsKCQkkdXJsID0gdHJ1X3RhZ3NfbGlua2lmeV90 YWcoJGRlc3RpbmF0aW9uKTsKCQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMg YmVlbiByZXBsYWNlZCBieSAnIC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRp b246ICcgLiAkdXJsKTsKCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9u IHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7 CglpZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkgewoJCSR1cmxwcmVm aXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOwoJ fSBlbHNlIHsKCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tU QUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7dD0nOwoJfQoJJHVybHN1ZmZpeCA9ICgkdHJ1 X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlID8gJy8nIDogJycpOwoJcmV0dXJuICR1 cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScsICR0YWcpKSAuICR1 cmxzdWZmaXg7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk YXJ0aWNsZUlEKSB7CgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJJHJzID0gc2Fm ZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5E ICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3MgPSBhcnJheSgpOwoJaWYgKGFycmF5 X2tleV9leGlzdHMoJHRhZ3NfZmllbGQsICRycykpIHsKCQkkYWxsX3RhZ3MgPSBleHBsb2Rl KCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7Cgl9 CgoJcmV0dXJuIHRydV90YWdzX3RyaW1fdGFncygkYWxsX3RhZ3MpOwp9CgoKIyBmaXhlcyBi dWcgd2l0aCA0LjAuNCdzIHZlcnNpb24gb2YgZG9XcmFwIHRoYXQgY2F1c2VkIHNwYWNlcyB0 byBzaG93IHVwIGJlZm9yZSB0aGUgY29tbWFzCmZ1bmN0aW9uIHRydV90YWdzX2RvX3dyYXAo JGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpIHsKCWlmICgh JHdyYXB0YWcgJiYgIXByZWdfbWF0Y2goJy9eXHcrJC8nLCAkYnJlYWspKSB7CgkJcmV0dXJu IGpvaW4oJGJyZWFrLm4sICRsaXN0KTsKCX0gZWxzZSB7CgkJcmV0dXJuIGRvV3JhcCgkbGlz dCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cgl9Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc190cmltX3RhZ3MoJHRhZ19hcnJheSkgewoJJHRyaW1tZWQgPSBhcnJh eSgpOwoJZm9yZWFjaCAoJHRhZ19hcnJheSBhcyAkdGFnKSB7CgkJaWYgKCIiICE9IHRyaW0o JHRhZykpIHsKCQkJJHRyaW1tZWRbXSA9IHRyaW0oJHRhZyk7CgkJfQoJfQoJcmV0dXJuICR0 cmltbWVkOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywg JHRhZ19wYXJhbWV0ZXIpIHsKCSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCAkdGFnX3BhcmFt ZXRlcik7Cglmb3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsKCQlpZiAoc3RycG9z KCRrZXl3b3JkLCAnLScpICE9PSBmYWxzZSkgewoJCQkka2V5d29yZHNbXSA9IHN0cl9yZXBs YWNlKCctJywgJyAnLCAka2V5d29yZCk7CgkJfQoJfQoJJGF0dHNbJ2tleXdvcmRzJ10gPSBp bXBsb2RlKCcsJywgJGtleXdvcmRzKTsKCglpZiAoaXNzZXQoJGF0dHNbJ3NlY3Rpb24nXSkg JiYgc3RycG9zKCRhdHRzWydzZWN0aW9uJ10sICcsJykgIT09IGZhbHNlKSB7CgkJJGF0dHNb J3NlY3Rpb24nXSA9ICcnOwoJfQoKCWlmIChpc3NldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24n XSkpIHsKCQl1bnNldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24nXSk7Cgl9CgoJaWYgKGlzc2V0 KCRhdHRzWydub2FydGljbGVzJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSk7 Cgl9CgoJaWYgKCFpc3NldCgkYXR0c1snbGltaXQnXSkpIHsKCQkkYXR0c1snbGltaXQnXSA9 ICcxMDAwJzsKCX0KCglpZiAoIWlzc2V0KCRhdHRzWydhbGxvd292ZXJyaWRlJ10pKSB7CgkJ JGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7Cgl9CgoJcmV0dXJuICRhdHRzOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7CglpZiAoZnVuY3Rpb25fZXhp c3RzKCJtYl9zdHJ0b2xvd2VyIikpIHsKCQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCAi VVRGLTgiKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHN0cnRvbG93ZXIoJHN0cik7Cgl9Cn0KCgov L3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3Vy ZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdz KCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZykgewoJZ2xv YmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0 cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFn c193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRzb3J0X2J5X2NvdW50OwoJ JHRydV90YWdzX3NvcnRfYXNjZW5kaW5nID0gJHNvcnRfYXNjZW5kaW5nOwoKCSR0ZW1wX2Fy cmF5ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJdXNvcnQoJHRlbXBfYXJyYXksICJ0 cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwoKCSRzb3J0ZWRfYXJyYXkgPSBhcnJh eSgpOwoJZm9yZWFjaCAoJHRlbXBfYXJyYXkgYXMgJHRhZykgewoJCSRzb3J0ZWRfYXJyYXlb JHRhZ10gPSAkdGFnc193ZWlnaHRbJHRhZ107Cgl9CgoJcmV0dXJuICRzb3J0ZWRfYXJyYXk7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJp Z2h0KSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9i eV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCWlmICgkdHJ1X3RhZ3Nfc29y dF9ieV9jb3VudCkgewoJCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFsk bGVmdF07CgkJJHJpZ2h0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskcmlnaHRd OwoJCWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkgewoJCQlyZXR1cm4gc3Ry bmF0Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCQl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0 X2FzY2VuZGluZykgewoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsK CQl9IGVsc2UgewoJCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsKCQl9 Cgl9IGVsc2UgewoJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0LCAkcmlnaHQpOwoJfQp9 CgoKCiMjIyBCQVNUQVJEIEZVTkNUSU9OUyBUSEFUIFNIT1VMRE4nVCBIQVZFIFRPIEVYSVNU ICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7 CgkkdGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsCgkJCQknY2F0 ZWdvcnknICA9PiAnJywKCQkJCSdzZWN0aW9uJyAgID0+ICcnLAoJCQkJJ2V4Y2VycHRlZCcg PT4gJycsCgkJCQknYXV0aG9yJyAgICA9PiAnJywKCQkJCSdzb3J0YnknICAgID0+ICdQb3N0 ZWQnLAoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCQkJJ21vbnRoJyAgICAgPT4gJycs CgkJCQkna2V5d29yZHMnICA9PiAnJywKCQkJCSdmcm9udHBhZ2UnID0+ICcnLAoJCQkJJ2lk JyAgICAgICAgPT4gJycsCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsCgkJCQknc3RhdHVz JyAgICA9PiAnNCcsCgkJCQknb2Zmc2V0JyAgICA9PiAwCgkJCSksJGF0dHMsIDApOwoJZXh0 cmFjdCgkdGhlQXR0cyk7CgoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0cwoJJGZyb250cGFnZSA9 ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7CgkkY2F0ZWdvcnkgID0g KCEkY2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9JyIuZG9zbGFzaCgkY2F0 ZWdvcnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICI7 Cgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICci LmRvc2xhc2goJHNlY3Rpb24pLiInIjsKCSRleGNlcnB0ZWQgPSAoJGV4Y2VycHRlZD09J3kn KSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CgkkYXV0aG9yICAgID0gKCEkYXV0aG9y KSAgICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5kb3NsYXNoKCRhdXRob3IpLiInIjsK CSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAn Ii5kb1NsYXNoKCRtb250aCkuIiUnIjsKCSRpZCAgICAgICAgPSAoISRpZCkgICAgICAgID8g JycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsKCXN3aXRjaCAoJHRpbWUpIHsK CQljYXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQljYXNlICdmdXR1cmUnOgoJ CQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJ JHRpbWUgPSAiIGFuZCBQb3N0ZWQgPCBub3coKSI7Cgl9CglpZiAoIWlzX251bWVyaWMoJHN0 YXR1cykpCgkJJHN0YXR1cyA9IGdldFN0YXR1c051bSgkc3RhdHVzKTsKCgkkY3VzdG9tID0g Jyc7CgkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgkkY3VzdG9tRmllbGRzID0gZ2V0 Q3VzdG9tRmllbGRzKCk7CglpZiAoJGN1c3RvbUZpZWxkcykgewoJCWZvcmVhY2goJGN1c3Rv bUZpZWxkcyBhcyAkY0ZpZWxkKSB7CgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJ CQkkY3VzdG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsKCQl9CgkJaWYoIWVt cHR5KCRjdXN0b21QYWlycykpCgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3Rv bUZpZWxkcywkY3VzdG9tUGFpcnMpOwoJCWVsc2UKCQkJJGN1c3RvbSA9ICcnOwoJfQoKCS8v QWxsb3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1v ZGUsIHlvdSBrbm93CglpZiAoJGtleXdvcmRzKSB7CgkJJGtleXMgPSBkb1NsYXNoKGFycmF5 X21hcCgndHJpbScsIHNwbGl0KCcsJywgJGtleXdvcmRzKSkpOwoJCWZvcmVhY2ggKCRrZXlz IGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiRklORF9JTl9TRVQoJyIuJGtleS4iJyxL ZXl3b3JkcykiOwoJCX0KCQkka2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRr ZXlwYXJ0cykgLiAiKSI7Cgl9CgoJaWYgKCRpZCkKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1 cyA+PSAnNCciOwoJZWxzZQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2go JHN0YXR1cykuIiciOwoKCSR3aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4KCQkkaWQg LiAkY2F0ZWdvcnkgLiAkc2VjdGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9y IC4gJGtleXdvcmRzIC4gJGN1c3RvbSAuICRmcm9udHBhZ2U7CgoJCSRwZ29mZnNldCA9ICRv ZmZzZXQgLiAnLCAnOwoKCSRycyA9IHNhZmVfcm93c19zdGFydCgiKiwgdW5peF90aW1lc3Rh bXAoUG9zdGVkKSBhcyB1UG9zdGVkIiwgJ3RleHRwYXR0ZXJuJywKCQkkd2hlcmUuICcgb3Jk ZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1NsYXNoKCRzb3J0ZGlyKSAu ICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0KSk7CgoJcmV0dXJuICRyczsKfQoKCiI7czo4 OiJoZWxwX3JhdyI7czo0OTg6IlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNr IG91dCB0aGUgImludHJvZHVjdG9yeSBhcnRpY2xlIjovYmxvZy80OTMvdHJ1dGFncy1hLXRh Z2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiwgInJlbGVhc2VzIHBhZ2UiOmh0dHA6Ly93 d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzLCAiZmVhdHVy ZSBsaXN0IjpodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZl YXR1cmUtbGlzdCwgYW5kICJ1c2FnZSBpbnN0cnVjdGlvbnMiOmh0dHA6Ly93d3cudHJ1aXN0 LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zLgoKSSd2ZSB0 YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVz LiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmlu ZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLiI7czozOiJtZDUiO3M6MzI6IjQwZDI3 NTc5MjVmNTQ4MzMyMzJjZTNlMTcwM2Y4ZWEwIjt9