# tru_tags v2.3 # 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: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjIu MyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1 OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf dGFncyI7czo0OiJoZWxwIjtzOjU2ODoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3Ry dXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj51c2FnZSBpbnN0cnVjdGlvbnM8L2E+LjwvcD4K Cgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1 Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0 byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uPC9wPiI7 czo0OiJjb2RlIjtzOjIwNjUzOiIKI0NvcHlyaWdodCAyMDA3IE5hdGhhbiBBcnRodXIKI1Jl bGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9w ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlscwojVGhp cyB3b3JrIGlzIGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5h bGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4 dHBhdHRlcm4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj CgojU2VlIGh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNh Z2UtaW5zdHJ1Y3Rpb25zIGZvciBpbnN0cnVjdGlvbnMKCiMgU3dpdGNoIHRoaXMgdG8gJzEn IHRvIGdldCBjbGVhbiB1cmwgc3VwcG9ydCBvciAnMCcgdG8gdHVybiBpdCBvZmYuCiMgSXQg d2lsbCBwcm9iYWJseSBmaWd1cmUgaXQgb3V0LCB0aG91Z2gsIHNvIHlvdSBzaG91bGRuJ3Qg aGF2ZSB0byBjaGFuZ2UgaXQuCmdsb2JhbCAkcGVybWxpbmtfbW9kZTsKZGVmaW5lKCdUUlVf VEFHU19VU0VfQ0xFQU5fVVJMUycsICRwZXJtbGlua19tb2RlICE9ICdtZXNzeScpOwoKIyBU aGlzIHRlbGxzIHRydV90YWdzIHdoaWNoIHNlY3Rpb24gdG8gdXNlIGZvciB0YWdzLgpkZWZp bmUoJ1RSVV9UQUdTX1NFQ1RJT04nLCAndGFnJyk7CgojIFRoaXMgdGVsbHMgdHJ1X3RhZ3Mg d2hhdCBhdHRyaWJ1dGUgbmFtZSB0byB1c2UgZm9yIHRhZyBzZWFyY2hlcy4KZGVmaW5lKCdU UlVfVEFHU19UQUdfUEFSQU1FVEVSX05BTUUnLCAndCcpOwoKIyBUaGlzIHRlbGxzIHRydV90 YWdzIHRvIHB1dCB0YWdzIGludG8gdGhlIFJTUyBhbmQgQXRvbSBmZWVkcywgaW4gJ0NhdGVn b3J5JyBlbGVtZW50cy4KIyBZb3UgcHJvYmFibHkgd2FudCB0aGlzLgpkZWZpbmUoJ1RSVV9U QUdTX0FERF9UQUdTX1RPX0ZFRURfWE1MJywgMSk7CgojIEJ5IGRlZmF1bHQsIHRoaXMgd2ls bCBhcHBlbmQgYSB0YWcgbGlzdCBsaWtlICJ0YWdzOiB0cmVlcywgZmxvd2VycywgYW5pbWFs cywgZXRjIgojICh3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRhZyIpIHRvIHRoZSBib2R5 IG9mIFJTUy9BdG9tIGZlZWRzLiBJZiB5b3UgZGVmaW5lIGEKIyAnbWlzYycgZm9ybSBuYW1l ZCB0cnVfdGFnc19mZWVkX3RhZ3MsIHRydV90YWdzIHdpbGwgdXNlIHRoYXQgZm9ybSB0byBy ZW5kZXIgdGhlIHRhZ3MKIyBmb3IgdGhlIGZlZWQsIGluc3RlYWQuCmRlZmluZSgnVFJVX1RB R1NfQUREX1RBR1NfVE9fRkVFRF9CT0RZJywgMCk7CgojIFRoaXMgc2hvd3MgYSBsaXN0IG9m IGNsaWNrYWJsZSB0YWdzIGluIHRoZSBhZG1pbiBzaWRlIG9uIHRoZSAnV3JpdGUnIHBhZ2UK ZGVmaW5lKCdUUlVfVEFHU19TSE9XX1RBR1NfSU5fQURNSU4nLCAxKTsKCiMgQ2hhbmdpbmcg dGhpcyB3b24ndCBkbyBhbnkgZ29vZC4gIEl0J3MganVzdCBoZXJlIGFzIGEgY29udmVuaWVu Y2UgZm9yIGRldmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRz Jyk7CgoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdf cGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7Cglp ZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCSRhdHRzID0gdHJ1X3RhZ3NfZml4dXBf cXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCXJldHVybiBkb0FydGljbGVz KCRhdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfSBlbHNlIHsKCQlyZXR1 cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xv dWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFy ZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3Vk X2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3Vk X3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAk YWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGlj bGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNs ZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNp ZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywg ZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAo JGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5k ZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFs ICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9 IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBh dHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJu IHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19p Zl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3Rh Z3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CgkkY29uZGl0aW9uID0gKCFlbXB0 eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOwoJcmV0dXJuIHBhcnNlKEV2YWxF bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkKewoJZXh0cmFjdChsQXR0cyhhcnJh eSgnc3RyaXBoeXBoZW5zJyA9PiAwLCAndXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7 CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoVFJVX1RBR1NfVEFHX1BBUkFN RVRFUl9OQU1FKSkpOwoJJHBhcm0gPSAoJHN0cmlwaHlwaGVucyA/IHN0cl9yZXBsYWNlKCct JywgJyAnLCAkcGFybSkgOiAkcGFybSk7CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0g dXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0g aHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdw cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFy cmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7CgkgICAgICAg ICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsK CgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFn X3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVl cnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsK CQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xv d2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRh bGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0K CgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFy YW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlm ICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVy KSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFs c2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRf YXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90 YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9y X3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQ T1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVu Y3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3Qs ICRpc0FydGljbGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xp c3QgPyAndWwnIDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAn KSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rp b24nCT0+ICcnLAoJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9 PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291 bnRzJwk9PiAnJywKCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFn Jwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcx JywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAn LAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5v Zm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNv dW50cycJPT4gJycsCgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcx JyksCgkJCSd0aXRsZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAn CQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNm b3JtJwk9PiAnbm9uZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwn CT0+ICcnLAoJCQknZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9 PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJwoJCSksJGF0dHMsIDApOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0 dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJ JGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5 KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIici OwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5 cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNs dWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1 X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgk ZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJJGFsbF90YWdzID0gYXJy YXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAi JHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5k IFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgkcnMgYXMg JHJvdykgewoJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3Ry dG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsKCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJn ZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOwoJfQoKCXJl dHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMo JGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVz ZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAk c2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgk c2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdz X2Zvcl93ZWlnaHQpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5 X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nf d2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFs bF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAg IHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFn c193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNv cnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRz b3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRf dGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoK CWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0 KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdl c3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3Rh Z3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2Vl cCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4g JHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0 KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0 X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtl ZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdz X3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1 dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt IDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFj dCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGlt aXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0 ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJ CQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5l d193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJ CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNv cnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5k ZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3Jl YWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJy YXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRh Z10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3Bh dGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5r cGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7 CgkJCQkkdXJscHJlZml4ID0gaHUgLiBUUlVfVEFHU19TRUNUSU9OIC4gJy8nOwoJCQl9IGVs c2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiBUUlVfVEFHU19TRUNUSU9OIC4g JyZhbXA7dD0nOwoJCQl9CgkJCSR1cmxzdWZmaXggPSAoVFJVX1RBR1NfVVNFX0NMRUFOX1VS TFMgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5v Zm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJ fSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNl IGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93 JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1h eCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7 CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8g MCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRh Z3NfaHRtbCA9IGFycmF5KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFy YW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOwoJZm9yZWFjaCAoJHRhZ3Nf d2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1p bnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9 ICcnOwoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTog JyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3MgPSAnJzsKCQlpZiAoJHNl dGNsYXNzZXMpIHsKCQkJJHRhZ19jbGFzcyA9ICcgY2xhc3M9Iic7CgkJCWlmICgkd2VpZ2h0 ID09ICRtaW4pIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJCX0g ZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXpl TGFyZ2VzdCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVt IjsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAk bWluKTsKCQkJaWYgKCR0YWcgPT0gJHRhZ19zZWFyY2hfdGFnKSB7CgkJCQkkdGFnX2NsYXNz IC49ICcgJyAuICRhY3RpdmVjbGFzczsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9 CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVt LnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0 aXRsZWNvdW50ID0gJyc7CgkJaWYgKCR0aXRsZSkKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxl PSInIC4gJHRpdGxlIC4gJyInOwoJCSRkaXNwbGF5Y291bnQ9ICcnOwoJCSRjb3VudCA9ICRj b3VudHdyYXBjaGFyc3swfSAuICR3ZWlnaHQgLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYg KCRzaG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkk dGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7CgkJaWYg KCRzaG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291 bnQgPSAnICcgLiAkY291bnQ7CgoJCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6 ZScpIHsKCQkJJHRhZyA9IHVjd29yZHMoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5z Zm9ybSA9PSAndXBwZXJjYXNlJykgewoJCQkkdGFnID0gc3RydG91cHBlcigkdGFnKTsKCQl9 IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dlcmNhc2UnKSB7CgkJCSR0YWcgPSBz dHJ0b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZp cnN0JykgewoJCQkkdGFnID0gdWNmaXJzdCgkdGFnKTsKCQl9CgoJCWlmICgkZ2VuZXJhdGVs aW5rcykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0 cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOwoJCQkkdGFn c19odG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJsIC4gJHRhZ19jbGFzcyAuICRzdHls ZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2E+ JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8 fCAkdGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFz cyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gJHRhZyAuICc8L3NwYW4+JyAuICRk aXNwbGF5Y291bnQ7CgkJfSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtdID0gJHRhZyAuICRkaXNw bGF5Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRtbCwg JHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xFQU4g VVJMIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoVFJV X1RBR1NfVVNFX0NMRUFOX1VSTFMpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19j bGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2Ns ZWFuX3VybF9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCSRzdWJwYXRoID0gcHJlZ19yZXBs YWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBh dGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgi L14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkk cXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRy ZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAk cXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoc3BsaXQoJy8nLCAk cmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0gVFJVX1RB R1NfU0VDVElPTikgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FVRVJZX1NU UklORyddID0gVFJVX1RBR1NfVEFHX1BBUkFNRVRFUl9OQU1FIC4gJz0nIC4gJHRhZyAuICRx YXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRoIC4gVFJVX1RBR1Nf U0VDVElPTiAuICcvPycgLiAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50 KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsnc2VjdGlvbiddID0gVFJVX1RBR1NfU0VDVElP TjsKCQkJJF9QT1NUW1RSVV9UQUdTX1RBR19QQVJBTUVURVJfTkFNRV0gPSAkdGFnOwoJCX0g ZWxzZSB7CgkJCSRfR0VUWydzZWN0aW9uJ10gPSBUUlVfVEFHU19TRUNUSU9OOwoJCQkkX0dF VFtUUlVfVEFHU19UQUdfUEFSQU1FVEVSX05BTUVdID0gJHRhZzsKCQl9Cgl9Cn0KCgojIyMg QURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK CmlmIChUUlVfVEFHU19TSE9XX1RBR1NfSU5fQURNSU4pCglyZWdpc3Rlcl9jYWxsYmFjaygn dHJ1X3RhZ3NfYWRtaW5faGFuZGxlcicsICdhcnRpY2xlJyk7CgpmdW5jdGlvbiB0cnVfdGFn c19hZG1pbl9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCSRjbG91ZCA9IGFycmF5X3VuaXF1 ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0 cyhhcnJheSgpLCB0cnVlLCB0cnVlKSkpOwoJc29ydCgkY2xvdWQpOwoKCSRpZCA9IChlbXB0 eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1snSUQnXSk7CgkkYXJ0 aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3Nf Zm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRjbG91 ZCBhcyAkdGFnKSB7CgkJJHN0eWxlID0gKGluX2FycmF5KCR0YWcsICRhcnRpY2xlX3RhZ3Mp ID8gJyBjbGFzcz0idGFnX2Nob3NlbiInIDogJycpOwoJCSRsaW5rc1tdID0gJzxhIGhyZWY9 IiNhZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRoaXMuc2V0QXR0cmlidXRlKFxcXCdj bGFzc1xcXCcsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoJHRhZykp LidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hh cnMoJHRhZykpIC4gJzxcL2E+JzsKCX0KCSR0b19pbnNlcnQgPSBqb2luKCcsICcsICRsaW5r cyk7CgkkdG9faW5zZXJ0ID0gIjxzdHlsZT5hLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xv cjogI0ZFQjsgY29sb3I6IGJsYWNrO308L3N0eWxlPiIgLiAkdG9faW5zZXJ0OwoKCSRqcyA9 IDw8PEVPRgp2YXIga2V5d29yZHNGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdr ZXl3b3JkcycpOwp2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwpwYXJl bnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7CnZhciBjbG91 ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKY2xvdWQuc2V0QXR0cmlidXRl KCdjbGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CmNsb3VkLmlubmVySFRNTCA9ICd7 JHRvX2luc2VydH0nOwpwYXJlbnQuYXBwZW5kQ2hpbGQoY2xvdWQpOwoKZnVuY3Rpb24gdG9n Z2xlVGFnKHRhZ05hbWUpIHsKCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtc XFxcXF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7Cgl2YXIgdGFnUmVnZXgg PSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMq fCQpIik7Cgl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29y ZHMnKTsKCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xzKyQvLCAn Jyk7CglpZiAoJycgPT0gY3VydmFsKSB7CgkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJ fSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7CgkJdGV4dGFyZWEudmFsdWUg PSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycp OwoJCXJldHVybiAnJzsKCX0gZWxzZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFs Lmxlbmd0aCAtIDEpKSB7CgkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsKCX0g ZWxzZSB7CgkJdGV4dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7Cgl9CglyZXR1cm4g J3RhZ19jaG9zZW4nOwp9CkVPRjsKCgllY2hvIHNjcmlwdF9qcygkanMpOwp9CgoKIyMjIEFU T00vUlNTIEZFRUQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCgpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYXRvbV9oYW5kbGVyJywgJ2F0b21f ZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwgJHN0ZXAp IHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQpyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7CmZ1bmN0aW9uIHRy dV90YWdzX3Jzc19oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2Zl ZWRfaGFuZGxlcihmYWxzZSk7IH0KCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigk YXRvbSkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsK CgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOwoKCWlm IChUUlVfVEFHU19BRERfVEFHU19UT19GRUVEX0JPRFkpIHsKCQkkZXh0cmFib2R5ID0gJyc7 CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9y bScsICd0eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRj aF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkp OwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0 dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcg LiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7 CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydl eGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2Fy dGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsn Ym9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9 CgoJaWYgKFRSVV9UQUdTX0FERF9UQUdTX1RPX0ZFRURfWE1MKSB7CgkJJG91dHB1dCA9IGFy cmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJ CSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRh ZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5Picg LiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQly ZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBG VU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9u IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKCSR0YWdzX2Zp ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRl eHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsK CSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJHJz WyR0YWdzX2ZpZWxkXSkpKTsKCglyZXR1cm4gdHJ1X3RhZ3NfdHJpbV90YWdzKCRhbGxfdGFn cyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBkb1dyYXAgdGhh dCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBjb21tYXMKZnVuY3Rpb24g dHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJl YWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRjaCgnL15cdyskLycsICRi cmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3QpOwoJfSBlbHNlIHsKCQly ZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2Ns YXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFncygkdGFnX2FycmF5KSB7 CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2FycmF5IGFzICR0YWcpIHsK CQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtdID0gdHJpbSgkdGFnKTsK CQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maXh1cF9x dWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtleXdvcmRzID0gZXhwbG9k ZSgnLCcsIHF1b3RlbWV0YSgkdGFnX3BhcmFtZXRlcikpOwoJZm9yZWFjaCAoJGtleXdvcmRz IGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2Up IHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJ CX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJ aWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbidd LCAnLCcpICE9PSBmYWxzZSkKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7CgoJaWYgKGlzc2V0 KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydleGNsdWRlc2Vj dGlvbiddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRzWydsaW1pdCddKSkKCQkkYXR0c1snbGlt aXQnXSA9ICcxMDAwJzsKCgkkYXR0c1snYWxsb3dvdmVycmlkZSddID0gdHJ1ZTsKCglyZXR1 cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b2xvd2VyKCRzdHIpIHsKCWlm IChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkgewoJLy9pZiAodmVyc2lvbl9j b21wYXJlKHBocHZlcnNpb24oKSwgIjQuMy4wIiwgIj49IikpIHsKCQlyZXR1cm4gbWJfc3Ry dG9sb3dlcigkc3RyLCAiVVRGLTgiKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHN0cnRvbG93ZXIo JHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1 dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1 X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2Fz Y2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3Nv cnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCgkkdHJ1X3RhZ3NfdGFn c193ZWlnaHQgPSAkdGFnc193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRz b3J0X2J5X2NvdW50OwoJJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nID0gJHNvcnRfYXNjZW5k aW5nOwoKCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJdXNvcnQo JHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwoKCSRzb3J0 ZWRfYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHRlbXBfYXJyYXkgYXMgJHRhZykgewoJ CSRzb3J0ZWRfYXJyYXlbJHRhZ10gPSAkdGFnc193ZWlnaHRbJHRhZ107Cgl9CgoJcmV0dXJu ICRzb3J0ZWRfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFy YXRvcigkbGVmdCwgJHJpZ2h0KSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAk dHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCWlm ICgkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCkgewoJCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFn c190YWdzX3dlaWdodFskbGVmdF07CgkJJHJpZ2h0X3dlaWdodCA9ICR0cnVfdGFnc190YWdz X3dlaWdodFskcmlnaHRdOwoJCWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkg ewoJCQlyZXR1cm4gc3RybmF0Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCQl9IGVsc2UgaWYg KCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgewoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0g JHJpZ2h0X3dlaWdodDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRs ZWZ0X3dlaWdodDsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0 LCAkcmlnaHQpOwoJfQp9CgoKCiMjIyBCQVNUQVJEIEZVTkNUSU9OUyBUSEFUIFNIT1VMRE4n VCBIQVZFIFRPIEVYSVNUICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVf c2VhcmNoKCRhdHRzKSB7CgkkdGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+ IDEwMDAsCgkJCQknY2F0ZWdvcnknICA9PiAnJywKCQkJCSdzZWN0aW9uJyAgID0+ICcnLAoJ CQkJJ2V4Y2VycHRlZCcgPT4gJycsCgkJCQknYXV0aG9yJyAgICA9PiAnJywKCQkJCSdzb3J0 YnknICAgID0+ICdQb3N0ZWQnLAoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCQkJJ21v bnRoJyAgICAgPT4gJycsCgkJCQkna2V5d29yZHMnICA9PiAnJywKCQkJCSdmcm9udHBhZ2Un ID0+ICcnLAoJCQkJJ2lkJyAgICAgICAgPT4gJycsCgkJCQkndGltZScgICAgICA9PiAncGFz dCcsCgkJCQknc3RhdHVzJyAgICA9PiAnNCcsCgkJCQknb2Zmc2V0JyAgICA9PiAwCgkJCSks JGF0dHMsIDApOwoJZXh0cmFjdCgkdGhlQXR0cyk7CgoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0 cwoJJGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7 CgkkY2F0ZWdvcnkgID0gKCEkY2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9 JyIuZG9zbGFzaCgkY2F0ZWdvcnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNh dGVnb3J5KS4iJykpICI7Cgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBh bmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsKCSRleGNlcnB0ZWQgPSAo JGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CgkkYXV0aG9y ICAgID0gKCEkYXV0aG9yKSAgICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5kb3NsYXNo KCRhdXRob3IpLiInIjsKCSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFu ZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsKCSRpZCAgICAgICAgPSAo ISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsKCXN3 aXRjaCAoJHRpbWUpIHsKCQljYXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQlj YXNlICdmdXR1cmUnOgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7 CgkJZGVmYXVsdDoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPCBub3coKSI7Cgl9CglpZiAo IWlzX251bWVyaWMoJHN0YXR1cykpCgkJJHN0YXR1cyA9IGdldFN0YXR1c051bSgkc3RhdHVz KTsKCgkkY3VzdG9tID0gJyc7CgkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgkkY3Vz dG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7CglpZiAoJGN1c3RvbUZpZWxkcykgewoJ CWZvcmVhY2goJGN1c3RvbUZpZWxkcyBhcyAkY0ZpZWxkKSB7CgkJCWlmIChpc3NldCgkYXR0 c1skY0ZpZWxkXSkpCgkJCQkkY3VzdG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxk XTsKCQl9CgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykpCgkJCSRjdXN0b20gPSAgYnVpbGRD dXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9tUGFpcnMpOwoJCWVsc2UKCQkJJGN1c3Rv bSA9ICcnOwoJfQoKCS8vQWxsb3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4g VGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93CglpZiAoJGtleXdvcmRzKSB7CgkJJGtleXMg PSBzcGxpdCgnLCcsJGtleXdvcmRzKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJ CSRrZXlwYXJ0c1tdID0gIiBLZXl3b3JkcyBsaWtlICclIi5kb1NsYXNoKHRyaW0oJGtleSkp LiIlJyI7CgkJfQoJCSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBh cnRzKSAuICIpIjsKCX0KCglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49 ICc0JyI7CgllbHNlCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3Rh dHVzKS4iJyI7CgoJJHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRj YXRlZ29yeSAuICRzZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAk a2V5d29yZHMgLiAkY3VzdG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNl dCAuICcsICc7CgoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQ b3N0ZWQpIGFzIHVQb3N0ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBi eSAnIC4gZG9zbGFzaCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBs aW1pdCAnIC4gZG9TbGFzaCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6Imhl bHBfcmF3IjtzOjQ5ODoiVG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0 IHRoZSAiaW50cm9kdWN0b3J5IGFydGljbGUiOi9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2lu Zy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0cDovL3d3dy50 cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMsICJmZWF0dXJlIGxp c3QiOmh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVy ZS1saXN0LCBhbmQgInVzYWdlIGluc3RydWN0aW9ucyI6aHR0cDovL3d3dy50cnVpc3QuY29t L3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMuCgpJJ3ZlIHRha2Vu IHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJ dCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9u IG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uIjtzOjM6Im1kNSI7czozMjoiNTc0NGQ2Yzli NDQ0NzU4MGY3NWNlZTcxNzRmNjYzNmUiO30=