# tru_tags v3.9 # 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 OSI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6 MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy dV90YWdzIjtzOjQ6ImhlbHAiO3M6MTAxNjoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1 X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20v YmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+aW50 cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNv bS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzIj5yZWxlYXNlcyBwYWdlPC9hPiwg PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdz LWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5y YWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIj5yb2FkbWFwPC9h PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcv dHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9w PgoKCTxwPllvdSBjYW4gYWxzbyBmaW5kIHRoZSBzb3VyY2UgY29kZSBhdCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzIj5naXRodWIuY29tL3RydWlzdC90 cnUtdGFnczwvYT4uPC9wPgoKCTxwPkkmIzgyMTc7dmUgdGFrZW4gdGhlIGRldGFpbGVkIGhl bHAgb3V0IG9mIHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFu ZCB0b28gZGlmZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4g dGhlIHBsdWdpbi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93ZXZlciwgdGhlIHNv dXJjZSA8c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gb2YgdGhlIHVzYWdlIGluc3Ry dWN0aW9ucyBpcyBhdmFpbGFibGUgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiPmdp dGh1YiByZXBvPC9hPjwvcD4iO3M6NDoiY29kZSI7czo0NTA4ODoiCiMgQ29weXJpZ2h0IDIw MTcgTmF0aGFuIEFydGh1cgojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vu c2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNl LnBocCBmb3IgZGV0YWlscwojCiMgVGhpcyB3b3JrIHdhcyBvcmlnaW5hbGx5IGluc3BpcmVk IGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6 Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4KIyBKYXZhc2Ny aXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAtIGh0dHA6Ly92aWN0 b3J1cy5uZXQKIyBKYXZhc2NyaXB0IGNvZGUgZm9yIHRoZSB0YWcgYXV0by1jb21wbGV0ZSBm ZWF0dXJlIHdhcyBwcm92aWRlZCBieSBKaW0gQmlhbmNvbG8gLSBodHRwOi8vd3d3LmJpYW5j b2xvLmNvbS8KIyBGaXhlcyBmb3IgVGV4dHBhdHRlcm4gNC42IHByb3ZpZGVkIGJ5OgojICAg LSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMta3VkZWxpcwojICAg LSBqb29scy1yOyBodHRwczovL2dpdGh1Yi5jb20vam9vbHMtcgojICAgLSBTaW1vbiBGaW5j aDsgaHR0cHM6Ly9naXRodWIuY29tL3NwaWZmaW4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMK IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFRVUk4gQkFDSyEgIENvbmZpZ3VyYXRpb24gaXMg bm8gbG9uZ2VyIGhhbmRsZWQgYnkgZWRpdGluZyB0aGUgcGx1Z2luLgojIENoZWNrIG91dCB0 aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRlcm4gYWRtaW4gOikKCgojIENo YW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAgVGhleSdyZSBqdXN0IGhlcmUgYXMg YSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuCmRlZmluZSgnVFJVX1RBR1NfRklFTEQn LCAnS2V5d29yZHMnKTsKZGVmaW5lKCdFTkNPRElORycsICd1dGYtOCcpOwoKZGVmaW5lKCdD TEVBTl9VUkxTJywgJ2NsZWFuX3VybHMnKTsKZGVmaW5lKCdUQUdfU0VDVElPTicsICd0YWdf c2VjdGlvbicpOwpkZWZpbmUoJ1BBUk1fTkFNRScsICdwYXJtJyk7CmRlZmluZSgnVEFHU19J Tl9GRUVEX0NBVEVHT1JJRVMnLCAndGFnc19pbl9mZWVkX2NhdGVnb3JpZXMnKTsKZGVmaW5l KCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOwpkZWZpbmUoJ1RB R1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3NfaW5fd3JpdGVfdGFiJyk7CmRlZmluZSgnQVVUT0NP TVBMRVRFX0lOX1dSSVRFX1RBQicsICdhdXRvY29tcGxldGVfaW5fd3JpdGVfdGFiJyk7CmRl ZmluZSgnVVRGXzhfQ0FTRScsICd1dGZfOF9jYXNlJyk7CgpnbG9iYWwgJHRydV90YWdzX3By ZWZzOwokdHJ1X3RhZ3NfcHJlZnMgPSB0cnVfdGFnc19sb2FkX3ByZWZzKCk7CgoKIyMjIFRB RyBSRUdJU1RSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKVHhwOjpnZXQo J1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0cnknKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfaGFu ZGxlcicpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19pZl9oYXNfdGFncycpCgktPnJlZ2lzdGVy KCd0cnVfdGFnc19mcm9tX2FydGljbGUnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY2xvdWQn KQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfbGlzdCcpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19p Zl90YWdfc2VhcmNoJykKCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3RhZ19wYXJhbWV0ZXInKQoJ LT5yZWdpc3RlcigndHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0JykKCS0+cmVnaXN0 ZXIoJ3RydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXInKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3Nf cmVsYXRlZF90YWdzX2Zyb21fc2VhcmNoJykKCS0+cmVnaXN0ZXIoJ3RydV90YWdzX2FyY2hp dmUnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZycpOwoKIyMj IFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVy ID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglpZiAoIWVtcHR5 KCR0YWdfcGFyYW1ldGVyKSkgewoJCWlmICh0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQo JHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJGNsZWFuX2F0dHMgPSB0 cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7CgkJJHJl c3VsdCA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0aW9uIGluIFRY UCBjb2RlCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsKCQkJaWYgKGlzc2V0KCRhdHRz Wydub2FydGljbGVzJ10pKSB7CgkJCQl0cnVfdGFnc19yZWRpcmVjdCgkYXR0c1snbm9hcnRp Y2xlcyddLCB0cnVlKTsKCQkJfSBlbHNlIGlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJlY3Qn XSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7CgkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJ fSBlbHNlIHsKCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7CgkJ CX0KCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9Cgl9IGVsc2UgewoJCXJldHVy biB0cnVfdGFnc19jbG91ZCgkYXR0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hcmNo aXZlKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7Cgkk dGFncyA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRf c3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKSkpOwoJbmF0Y2FzZXNv cnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCSR0cnVfdGFnc19jdXJy ZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVw X3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRj bGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfQoJcmV0dXJuIGpv aW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hp dmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7 CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAnMCcpLCAgJGF0dHMsIDApKTsKCWlm ICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAuIHRydV90YWdzX2xpbmtpZnlfdGFn KCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAuICciPicgLiAkdHJ1X3RhZ3NfY3Vy cmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxzZSB7CgkJcmV0dXJuICR0cnVfdGFn c19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWQo JGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdz X2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0 dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1 ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxs X3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUo JGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7 CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7 CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFs c2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAoJGF0 dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1 X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5kZXJf Y2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFsICR0 aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9IFRS VV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRl cm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBh cnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90 YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZycg PT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19w YXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsKCSRjb25kaXRp b24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVlIDogZmFsc2U7CglpZiAoJGNv bmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1l dGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRp dGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNh ZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QobEF0 dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAndXJsZW5jb2RlJyA9PiAwKSwgICRh dHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90YWdz X3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYgKCdsb29rdXAnID09ICRzdHJpcGh5 cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFy cmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0ID0gYXJyYXlfdW5pcXVlKHRydV90 YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFjaCAoJHRhZ19saXN0IGFzICRjbG91 ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkY2xvdWRf dGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9 IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFybSA9IHN0cl9yZXBsYWNlKCctJywg JyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0gdXJsZW5jb2Rl KCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0gaHRtbHNwZWNp YWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKSB7CglnbG9iYWwgJHByZXRleHQ7CgoJ JHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNl KTsKCWlmICh0cmltKCR0YWdfcGFyYW1ldGVyKSAhPSAnJykgewoJCSRxID0gJHByZXRleHRb J3EnXTsKCQkkcHJldGV4dFsncSddID0gJHRhZ19wYXJhbWV0ZXI7CgkJJHJlc3VsdCA9IHNl YXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7CgkJJHByZXRleHRbJ3EnXSA9ICRxOwoJfSBl bHNlIHsKCQkkcmVzdWx0ID0gc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKTsKCX0KCXJl dHVybiAkcmVzdWx0Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigp IHsKCXRyaWdnZXJfZXJyb3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VSX05PVElD RSk7CglyZXR1cm4gc3RyaXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0g dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglleHRyYWN0KGxBdHRz KGFycmF5KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkp OwoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKICAgICAgICAkdGFnc19maWVsZCA9 IFRSVV9UQUdTX0ZJRUxEOwoJCSRhbGxfdGFncyA9IGFycmF5KCk7CgoJCSRxdWVyeV9hdHRz ID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJ CSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOwoJCWlm ICgkcnMpIHsKCQkJd2hpbGUgKCRhID0gbmV4dFJvdygkcnMpKSB7CgkJCQkkYXJ0aWNsZV90 YWdzID0gYXJyYXkoKTsKCQkJCWlmIChpc3NldCgkYVskdGFnc19maWVsZF0pKSB7CgkJCQkJ JGFydGljbGVfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIo JGFbJHRhZ3NfZmllbGRdKSkpOwoJCQkJfQoJCQkJIyBmYXN0ZXIgaW1wbGVtZW50YXRpb24g b2YgYXJyYXlfbWVyZ2UoKSwgdGhhbmtzIHRvIHdob2NhcmV6CgkJCQkjIChodHRwOi8vZm9y dW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTIzODM3MyNwMjM4MzczKQoJ CQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykgYXMgJGkpIHsk YWxsX3RhZ3NbXSA9ICRpO30KCQkJfQoJCX0KCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3Ry X3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3Rh Z3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8 ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtl eV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9j bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0 ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7 CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3Vk X2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0 cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVy biAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk X2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNl KSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0ID8gJ3VsJyA6 ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyksCgkJCSdjbGFz cycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCSdzZWN0aW9uJwk9PiAnJywK CQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4cGVyY2VudCcJPT4gKCRpc0xpc3Qg fHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJCQknc2hvd2NvdW50cycJPT4gJycs CgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJJ3VzZXJlbHRhZycJPT4gKCRpc0Fy dGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScsCgkJCSdtaW50 YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywKCQkJJ3NldHNp emVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd1c2Vub2ZvbGxvdycJPT4g JycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3VzZW92ZXJhbGxjb3VudHMnCT0+ICcn LAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScpLAoJCQkndGl0 bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycsCgkJCSdrZWVwJwkJPT4gJ2xhcmdl c3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkndGV4dHRyYW5zZm9ybScJPT4gJ25v bmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlua3BhdGh0YWlsJwk9PiAnJywKCQkJ J2ZpbHRlcnNlYXJjaCcJPT4gKCRzaG93QWxsID8gMCA6ICcxJyksCgkJCSdleGNsdWRlc2Vj dGlvbic9PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJywKCQkJJ3RpbWUn CQk9PiAoJHNob3dBbGwgPyAnYW55JyA6ICdwYXN0JykKCQkpLCRhdHRzLCAwKTsKfQoKCmZ1 bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSB7CglleHRyYWN0KCRhdHRzKTsK Cgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsKCWlmICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlz ID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7 CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJ CX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFy dHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNsdWRl X29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1X3Rh Z3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgkZmls dGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJc3dpdGNoICgkdGltZSkgewoJ CWNhc2UgJ2FueSc6CgkJCSR0aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJ CSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkk dGltZSA9ICIgYW5kIFBvc3RlZCA8PSBub3coKSI7Cgl9CglnbG9iYWwgJHByZWZzOwoJZXh0 cmFjdCgkcHJlZnMpOwoJaWYgKCEkcHVibGlzaF9leHBpcmVkX2FydGljbGVzKSB7CgkJJHRp bWUgLj0gIiBhbmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyBJUyBOVUxMKSI7Cgl9 CgoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQi LCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNl IC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCciIC4gJHRpbWUpOwoJZm9yZWFjaCAo JHJzIGFzICRyb3cpIHsKCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRy b3dbJHRhZ3NfZmllbGRdKSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmlt KHRydV90YWdzX3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSMgZmFz dGVyIGltcGxlbWVudGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJl egoJCSMgKGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9 MjM4MzczI3AyMzgzNzMpCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBfYXJy YXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24p IHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAkZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRl cnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rpb25zIGFzICRzZWN0aW9uKSB7CgkJJGZp bHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9 CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Jl bmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJ Z2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdo dCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFj aCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXko JHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdj b3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1 bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChz dHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAo c3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90 YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2Nl bmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRh Z3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAg PT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFn c19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJ CWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFz ICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgw LCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVf dGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxz ZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9r ZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJ CX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxp c3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZl IGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8 ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdo dFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dl aWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2Vp Z2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXgg PCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9 CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0 X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBd OwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlm ICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193 ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlm ICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZp eCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKHRydV90YWdzX2NsZWFuX3Vy bHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNU SU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7CgkJCQkkdXJscHJlZml4ID0gaHUgLiAn P3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7JyAu ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJs c3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlm ICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9mb2xsb3cpIHsKCQkJCSR1cmxzdWZmaXgg Lj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAu PSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkk dXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cnOwoJCX0KCX0KCglpZiAoY291bnQoJHRh Z3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9 IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsKCQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkk c3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAwIDogKCRtYXhwZXJjZW50IC0gJG1pbnBl cmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFnc19odG1sID0gYXJyYXkoKTsKCSR0YWdf c2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVu cycgPT4gJ2xvb2t1cCcpKTsKCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygi aHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0 YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsK CWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkkdGFnX3dl aWdodCA9IGZsb29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFs dWUpOwoKCQkkc3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5bGUgPSAnIHN0 eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkkdGFnX2NsYXNz ID0gJyc7CgkJaWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSIn OwoJCQlpZiAoJHdlaWdodCA9PSAkbWluKSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXpl U21hbGxlc3QiOwoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1heCkgewoJCQkJJHRhZ19j bGFzcyAuPSAidGFnU2l6ZUxhcmdlc3QiOwoJCQl9IGVsc2UgewoJCQkJJHRhZ19jbGFzcyAu PSAidGFnU2l6ZU1lZGl1bSI7CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4g KCR3ZWlnaHQgKyAxIC0gJG1pbik7CgkJCWlmICgkdGFnID09ICR0YWdfc2VhcmNoX3RhZykg ewoJCQkJJHRhZ19jbGFzcyAuPSAnICcgLiAkYWN0aXZlY2xhc3M7CgkJCX0KCQkJJHRhZ19j bGFzcyAuPSAnIic7CgkJfQoKCQkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywg c2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAy ODc1I3AxMDI4NzUKCQkkdGl0bGVjb3VudCA9ICcnOwoJCWlmICgkdGl0bGUpCgkJCSR0aXRs ZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICciJzsKCQkkZGlzcGxheWNvdW50PSAn JzsKCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3Jh cGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRz ID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJGNv dW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUn KQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJHRleHR0cmFuc2Zv cm0gPT0gJ2NhcGl0YWxpemUnKSB7CgkJCSR0YWcgPSB0cnVfdGFnc191Y3dvcmRzKCR0YWcp OwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsKCQkJJHRh ZyA9IHRydV90YWdzX3N0cnRvdXBwZXIoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5z Zm9ybSA9PSAnbG93ZXJjYXNlJykgewoJCQkkdGFnID0gdHJ1X3RhZ3Nfc3RydG9sb3dlcigk dGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsKCQkJ JHRhZyA9IHRydV90YWdzX3VjZmlyc3QoJHRhZyk7CgkJfQoKCQlpZiAoJGdlbmVyYXRlbGlu a3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFn KSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVs c2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJCSR0YWdz X2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQg LiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRpc3BsYXlj b3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0 YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgk dGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoK CiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4q KFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVvdGUoJHN1 YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3VicGF0aC9p IiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygkcmVxLCAn PycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkgOiAnJyk7 CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRzID0gYXJy YXlfdmFsdWVzKGFycmF5X2ZpbHRlcihleHBsb2RlKCcvJywgJHJlcSkpKTsKCWlmIChjb3Vu dCgkcGFydHMpID09IDIgJiYgJHBhcnRzWzBdID09ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlKSB7CgkJJHRhZyA9ICRwYXJ0c1sxXTsKCQkkX1NFUlZFUlsnUVVFUllf U1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAk dGFnIC4gJHFhdHRzOwoJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJHN1YnBhdGggLiAk dHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvPycgLiAkX1NFUlZFUlsn UVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsn c2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7CgkJCSRf UE9TVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsKCQl9IGVs c2UgewoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O XS0+dmFsdWU7CgkJCSRfR0VUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0g PSAkdGFnOwoJCX0KCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybHMoKSB7Cgln bG9iYWwgJHRydV90YWdzX3ByZWZzOwoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19w cmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpOwp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05T ICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoQHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKSB7CglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOwoJcmVnaXN0ZXJf dGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7CglyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fdGFiJywgJ3RydV90YWdzJyk7CgoJaWYgKCR0cnVf dGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFnc19wcmVm c1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZV91aScs ICdrZXl3b3JkcycpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVu dCwgJHN0ZXApIHsKCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0 cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19n ZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJ JGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1 X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJl ZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5f dGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQs ICRyZWRpcmVjdHMpIHsKCWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcn KTsKCglpbmNsdWRlX29uY2UodHhwYXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsK CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAn JywgJycsICcxMHB4JykuJzx0cj48dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQg Z3JheSI+Jy4gICMgSSBrbm93LCBJIGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAn JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBz b2xpZCBncmF5Ij4nLgoJCQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4 JykuCgkJCQl0cihoQ2VsbChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNs b3VkKSkuCgkJCWVuZFRhYmxlKCkuCgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQo J3RydV90YWdzIFJlZmVyZW5jZScpKSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3 dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9u cyI+VXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9m b3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFn ZXM8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVm ZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJ Jzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3Ry dV90YWdzLXJvYWRtYXAiPlJlbGVhc2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVm PSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVy ZS1saXN0Ij5GZWF0dXJlIGxpc3Q8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhw Ij50cnVfdGFncyBzb3VyY2UgY29kZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzL2Jsb2IvbWFzdGVyL3RydV90YWdzLWRvY3Mu aHRtbCI+U291cmNlIEhUTUwgZm9yIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJ CSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3Ry dXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwg YnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9h PicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZvcm0gYWN0aW9u PSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3Qi PjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz48 aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9p L2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1ha2UgYSBkb25h dGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJo dHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEi IGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNyeXB0ZWQiIHZh bHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFjRW9JSUhRREND Qnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJn TlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFL RXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0Ex VUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVq YjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRFUWkwd0tIY2RH dWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9PN3MrQjJvUTc2 elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdMWHlWNitVTlZF T3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFrR0JTc09Bd0lh QlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpybHJaZlptQWdh aWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFxNzNKb1A1M2ta eThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lPcHBINStkeDJZ cUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdiOGw0Q25ucmJt d2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZkSkxzZ0cxNXhv VlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVG QURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3 MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVH QTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJn a3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpFek1UQXhNekUx V2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJB Z1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RR WVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4 UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3 Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhSTXhMWEp5TzJT bVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NUUzRzWm9TMWZL Y2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6RFRpcXFOcEpl QnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZzRkFnTUJBQUdq Z2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyTUlHN0Jn TlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lHVXBJR1JNSUdP TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRX NTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFM RkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJ YjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBH Q1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldGU0UrUTRGcVJP dmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZiK3MyVFdiUVlE d2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZnSEZYd3JFQmIz ZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFFd2daUXdnWTR4 Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJu UmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNV Q214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2 Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFDZ1hUQVlCZ2tx aGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpCVEVQRncwd09E QTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpMZS9FNFF3Ymli MjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0WTNlRFdLRE8x NnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1Y2RuVmk0QU5R d01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5U3BQR1pCQTNN VHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0tLS1FTkQgUEtD UzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3Rk PjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0 JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBz b2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBz dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdU eHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6 cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHls ZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0 aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEp JywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShn VHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJyku CgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShn VHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJ CXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1 dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQo J3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1 cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdU eHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4K CQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3Mo JycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicp LCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwn JyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFi bGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToy cHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAn JywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNv bHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRy aWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3Rh Z3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVy IicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFs aWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5r aWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJ CQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9y ZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJp ZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsK CQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJl Y3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9u c3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4n LgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0 ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJ CQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4 dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3 PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQo J2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5k VGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFi bGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29s c3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFu IFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJl ZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJ CQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScp KSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4K CQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBp cyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTog JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5w dXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAn MTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3Ig dGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFN RV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPjxlbT4oeW91IHNob3VsZG5c J3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9p bmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1 ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy PjxlbT4oeW91IHByb2JhYmx5IHdhbnQgdGhpcyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRF R09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1 ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRo ZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdp dGggcmVsPSJ0YWciOicuCgkJCQkJCSc8YnI+PGVtPihpZiB0aGlzIGlzIHR1cm5lZCBvbiwn LgoJCQkJCQkneW91IGNhbiBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19m ZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFn cyBpbiB0aGUgZmVlZCk8L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3Rh Z3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJ CQkJdGRhKGdUeHQoJ1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3Jp dGUiIHBhZ2UnKS4nOiAnLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUi JykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX1dSSVRFX1RBQiwgJHRydV90YWdzX3By ZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRk YShnVHh0KCdBdXRvY29tcGxldGUgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogPGJy PicuCgkJCQkJCSc8ZW0+KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNz aXN0YW5jZS5kZS9qcXVlcnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8i PmpRdWVyeSBBdXRvY29tcGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQg PGNvZGU+Lm1pbi5qczwvY29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5q czwvY29kZT4iIGZvbGRlciBvbiB5b3VyIHNpdGUpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2 ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhBVVRPQ09NUExF VEVfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRF X1RBQl0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnQ29udmVydCB0 YWdzIHRvIGxvd2VyY2FzZSBieSBkZWZhdWx0JykuJzogPGJyPicuCgkJCQkJCSc8ZW0+KHlv dSBwcm9iYWJseSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3 aXRoIHV0Zi04IGNoYXJhY3RlcnMpPC9lbT4nLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1h bGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhVVEZfOF9DQVNFLCAkdHJ1X3Rh Z3NfcHJlZnNbVVRGXzhfQ0FTRV0tPnZhbHVlKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgn JykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAn cHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdo dCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUn KSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxlKCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxl KCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5kVGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJ cmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMo J2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdk ZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdwcygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9 IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBs YWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdz X2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycp KTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVjdCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2Fk bWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0g ZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19h ZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2Ug ewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9w cmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7 Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMgYXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUg PSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxp ZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4gZ3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1 cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMgaXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2 YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJaWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+ dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkg ewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJ fSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVfdGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFt ZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlpZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNb XSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFtZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxp ZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcg JyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJfQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAw KSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5lZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQly ZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdz X3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUpIHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRl IHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJ CScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFy KDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUg dG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxl Lic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0i Jy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJl ZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdz X3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZl X3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1 cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVsZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRl dGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFn LCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUn OwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFn LCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9 IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7Cglp ZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRh ZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3RleHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQu Jz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBsYWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1Nf RklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwgXCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4n XCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygkcmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkg ewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbGlfYWZmZWN0ZWRfcm93cygpLicgcm93cyAo IicuaHRtbHNwZWNpYWxjaGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJz KCRyZXBsYWNldGFnKS4nIiknOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnRXJyb3I6ICcgLiBt eXNxbGlfZXJyb3IoKTsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEg dmFsdWUgaW4gYm90aCBmaWVsZHMnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5f cmVkaXJlY3RfdGFnKCRsZWZ0dGFnLCAkcmlnaHR0YWcpIHsKCSRsZWZ0dGFnID0gYWRkc2xh c2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7CgkkcmlnaHR0YWcg PSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7Cglp ZiAoISRsZWZ0dGFnIHx8ICEkcmlnaHR0YWcpIHsKCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBh IHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0 YWJsZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJyku CgkJJyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcuCgkJJ3JpZ2h0dGFn IHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgewoJCXJldHVybiAnU2VyaW91cyBlcnJvciAt IHVuYWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3Rz JykgLiAnIHRhYmxlLic7Cgl9CgoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVj dHMnLCAnbGVmdHRhZz0iJy4kbGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyIn KSkgewoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxl ZnR0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNl IHRlc3QgaXQhJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0g ZG9lcyBpdCBhbHJlYWR5IGV4aXN0Pyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1p bl9kZWxldGVfcmVkaXJlY3QoJGxlZnR0YWcpIHsKCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3Rh Z3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkg ewoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYg IXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVj dHMnKSkpIHsKCQkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkLCBidXQgdW5hYmxlIHRvIGRy b3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKTsKCQl9CgkJcmV0 dXJuICdSZWRpcmVjdCBkZWxldGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4n IiknOwoJfSBlbHNlIHsKCQlyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsKCX0K fQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyKCRldmVudCwg JHN0ZXAsICRkYXRhKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJJGF0dHMgPSB0cnVf dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlLCB0cnVl KTsKCSRjbG91ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykp OwoJbmF0Y2FzZXNvcnQoJGNsb3VkKTsKCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lEJ10p ID8gZ3BzKCdJRCcpIDogJEdMT0JBTFNbJ0lEJ10pOwoJJGFydGljbGVfdGFncyA9IChlbXB0 eSgkaWQpID8gYXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkp OwoKCSRsaW5rcyA9IGFycmF5KCk7CgkkcmF3X2Nsb3VkID0gJyc7Cglmb3JlYWNoICgkY2xv dWQgYXMgJHRhZykgewoJCSRzdHlsZSA9IChpbl9hcnJheSgkdGFnLCAkYXJ0aWNsZV90YWdz KSA/ICcgY2xhc3M9InRhZ19jaG9zZW4iJyA6ICcnKTsKCQkkbGlua3NbXSA9ICc8YSBocmVm PSIjYWR2YW5jZWQiJy4kc3R5bGUuJyBvbmNsaWNrPSJ0b2dnbGVDbGFzcyh0aGlzLCB0b2dn bGVUYWcoXFxcJycuYWRkc2xhc2hlcyhhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRh ZykpKS4nXFxcJykpOyByZXR1cm4gZmFsc2U7Ij4nIC4gYWRkc2xhc2hlcyhodG1sc3BlY2lh bGNoYXJzKCR0YWcpKSAuICc8XC9hPic7CgkJJHJhd19jbG91ZCAuPSAnIicgLiBhZGRTbGFz aGVzKCR0YWcpIC4gJyIsJzsKCX0KCSRyYXdfY2xvdWQgPSBzdWJzdHIoJHJhd19jbG91ZCwg MCwgc3RybGVuKCRyYXdfY2xvdWQpIC0gMSk7CgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAk bGlua3MpOwoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1 ZSkgewoJCSRqcyA9IDw8PEVPRgoJCQl2YXIga2V5d29yZHNGaWVsZCA9IGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJCQlrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGUu YXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7CgkJCXZhciBjbG91 ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKCQkJa2V5d29yZHNGaWVsZC5w YXJlbnROb2RlLmFwcGVuZENoaWxkKGNsb3VkKTsKCQkJY2xvdWQuc2V0QXR0cmlidXRlKCdj bGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJCWNsb3VkLmlubmVySFRNTCA9ICd7 JHRvX2luc2VydH0nOwoKCQkJdmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoJ3N0eWxlJyk7CgkJCXN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAi dGV4dC9jc3MiKTsKCQkJdmFyIHN0eWxlVGV4dCA9ICdhLnRhZ19jaG9zZW57YmFja2dyb3Vu ZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNrO30nOwoJCQlpZiAoc3R5bGVFbGVtZW50LnN0 eWxlU2hlZXQpIHsgLy9JRQoJCQkJc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9 IHN0eWxlVGV4dDsKCQkJfSBlbHNlIHsKCQkJCXZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNy ZWF0ZVRleHROb2RlKHN0eWxlVGV4dCk7CgkJCQlzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQo dGV4dE5vZGUpOwoJCQl9CgkJCXZhciBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1l bnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CgkJCWhlYWRFbGVtZW50LmFwcGVuZENoaWxkKHN0 eWxlRWxlbWVudCk7CgoJCQlmdW5jdGlvbiB0b2dnbGVUYWcodGFnTmFtZSkgewoJCQkJdmFy IHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNlKC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToo fCldKS9nLCJcXFxcJDEiKTsKCQkJCXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnws KVxcXHMqKSIgKyByZWdleFRhZyArICJcXFxzKigsXFxccyp8JCkiKTsKCQkJCXZhciB0ZXh0 YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOwoJCQkJdmFyIGN1 cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCWlmICgn JyA9PSBjdXJ2YWwpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSA9IHRhZ05hbWU7CgkJCQl9IGVs c2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSA9 IGN1cnZhbC5yZXBsYWNlKHRhZ1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7 CgkJCQkJcmV0dXJuICcnOwoJCQkJfSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChj dXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdO YW1lOwoJCQkJfSBlbHNlIHsKCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFt ZTsKCQkJCX0KCQkJCXJldHVybiAndGFnX2Nob3Nlbic7CgkJCX0KCgkJCWZ1bmN0aW9uIHRv Z2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkgewoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1 dGUoJ2NsYXNzJywgY2xhc3NOYW1lKTsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFz c05hbWUnLCBjbGFzc05hbWUpOyAvKiBmb3IgSUUgKi8KCQkJfQpFT0Y7CgkJcmV0dXJuICRk YXRhIC4gc2NyaXB0X2pzKCRqcyk7Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tBVVRPQ09N UExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQllY2hvIDw8PEVPRgoJCQk8bGluayBy ZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9qcy9qcXVlcnkuYXV0 b2NvbXBsZXRlLmNzcyIgbWVkaWE9InByb2plY3Rpb24sIHNjcmVlbiIgLz4KCQkJPHNjcmlw dCBzcmM9Ii4uL2pzL2pxdWVyeS5hdXRvY29tcGxldGUubWluLmpzIiB0eXBlPSJ0ZXh0L2ph dmFzY3JpcHQiPjwvc2NyaXB0PgoJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0 eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0KCQkJCSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0 aW9uKCl7IHZhciB0YWdzID0gbmV3IEFycmF5KHskcmF3X2Nsb3VkfSk7CgkJCQkJJCgiI2tl eXdvcmRzIikuYXV0b2NvbXBsZXRlKHRhZ3MsIHsgbXVsdGlwbGU6IHRydWUsIG11c3RNYXRj aDogZmFsc2UsIGF1dG9GaWxsOiBmYWxzZSB9KTsKCQkJCX0pOwoJCQkvLy0tPjwvc2NyaXB0 PgpFT0Y7Cgl9Cgp9CgoKIyMjIEFUT00vUlNTIEZFRUQgRlVOQ1RJT05TICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3Nf YXRvbV9oYW5kbGVyJywgJ2F0b21fZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfYXRvbV9o YW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcih0 cnVlKTsgfQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNz X2VudHJ5Jyk7CmZ1bmN0aW9uIHRydV90YWdzX3Jzc19oYW5kbGVyKCRldmVudCwgJHN0ZXAp IHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcihmYWxzZSk7IH0KCmZ1bmN0aW9uIHRy dV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRy dV90YWdzX3ByZWZzOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzID0gdHJ1X3Rh Z3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7CgoJaWYgKCR0cnVfdGFnc19wcmVm c1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSB7CgkJJGV4dHJhYm9keSA9ICcnOwoJCSRG T1JNX05BTUUgPSAndHJ1X3RhZ3NfZmVlZF90YWdzJzsKCQlpZiAoZmV0Y2goJ2Zvcm0nLCAn dHhwX2Zvcm0nLCAnbmFtZScsICRGT1JNX05BTUUpKSB7CgkJCSRmb3JtID0gZmV0Y2hfZm9y bSgkRk9STV9OQU1FKTsKCQkJJGV4dHJhYm9keSA9IHRyaW0ocGFyc2UoJGZvcm0pKTsKCQl9 IGVsc2UgewoJCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFy cmF5KCksIGZhbHNlLCB0cnVlKTsKCQkJJGV4dHJhYm9keSA9ICc8cD50YWdzOiAnIC4gdHJ1 X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkdGFncywgJHRhZ3MpIC4gJzwvcD4nOwoJCX0K CQlnbG9iYWwgJHRoaXNhcnRpY2xlOwoJCWlmICh0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJw dCddKSkgewoJCQkkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xl WydleGNlcnB0J10pLm4uJGV4dHJhYm9keS5uOwoJCX0KCQkkdGhpc2FydGljbGVbJ2JvZHkn XSA9IHRyaW0oJHRoaXNhcnRpY2xlWydib2R5J10pLm4uJGV4dHJhYm9keS5uOwoJfQoKCWlm ICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkgewoJ CSRvdXRwdXQgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKCQkJaWYg KCRhdG9tKSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3Bl Y2lhbGNoYXJzKCR0YWcpIC4gJyIgLz4nOwoJCQl9IGVsc2UgewoJCQkJJG91dHB1dFtdID0g JzxjYXRlZ29yeT4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2NhdGVnb3J5Pic7 CgkJCX0KCQl9CgkJcmV0dXJuIG4uam9pbihuLCAkb3V0cHV0KS5uOwoJfQp9CgoKIyMjIFBS RUZTIEZVTkNUSU9OUyAvIENMQVNTRVMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIwoKY2xhc3MgdHJ1X3RhZ3NfcHJlZiB7CglmdW5jdGlvbiBfX2NvbnN0cnVjdCgk bmFtZSwgJGRlZmF1bHRfdmFsdWUsICR0eXBlKSB7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsK CQkkdGhpcy0+dmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+ZGVmYXVsdF92YWx1 ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7Cgl9CgoJZnVuY3Rp b24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7CgkJaWYgKCR2YWx1ZSkgewoJCQlyZXR1cm4g JHZhbHVlOwoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkJCXJl dHVybiAnMCc7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBm b3IgJyAuICR0aGlzLT5uYW1lOwoJCX0KCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9w cmVmcygpIHsKCSRwcmVmcyA9IGFycmF5KCk7CgoJZ2xvYmFsICRwZXJtbGlua19tb2RlOwoJ JHByZWZzW0NMRUFOX1VSTFNdID0gbmV3IHRydV90YWdzX3ByZWYoQ0xFQU5fVVJMUywgKCRw ZXJtbGlua19tb2RlICE9ICdtZXNzeScgPyAnY2xlYW4nIDogJ21lc3N5JyksICdzdHJpbmcn KTsKCSRwcmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElP TiwgJ3RhZycsICdzdHJpbmcnKTsKCSRwcmVmc1tQQVJNX05BTUVdID0gbmV3IHRydV90YWdz X3ByZWYoUEFSTV9OQU1FLCAndCcsICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURf Q0FURUdPUklFU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FURUdPUklF UywgJzEnLCAnYm9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0 cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7CgkkcHJl ZnNbVEFHU19JTl9XUklURV9UQUJdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19JTl9XUklU RV9UQUIsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVf VEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICcw JywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tVVEZfOF9DQVNFXSA9IG5ldyB0cnVfdGFnc19wcmVm KFVURl84X0NBU0UsICcxJywgJ2Jvb2xlYW4nKTsKCglpZiAoc2FmZV9xdWVyeSgiZGVzY3Jp YmUgIiAuIFBGWCAuICJ0cnVfdGFnc19wcmVmcyIpKSB7CgkJJHJzID0gc2FmZV9yb3dzKCcq JywgJ3RydV90YWdzX3ByZWZzJywgJzEnKTsKCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgewoJ CQkkcHJlZnNbJHJvd1snbmFtZSddXS0+dmFsdWUgPSAkcm93Wyd2YWx1ZSddOwoJCX0KCX0K CglyZXR1cm4gJHByZWZzOwp9CgoKIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIwoj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRp cmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpIHsKCSRyZWRpcmVjdHMgPSB0cnVfdGFn c19sb2FkX3JlZGlyZWN0cygpOwoJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9 PiAkcmlnaHR0YWcpIHsKCQlpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJGxl ZnR0YWcgPT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgewoJCQl0 cnVfdGFnc19yZWRpcmVjdCgkcmlnaHR0YWcsIGZhbHNlKTsKCQkJcmV0dXJuIHRydWU7CgkJ fQoJfQoKCXJldHVybiBmYWxzZTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcmVkaXJl Y3RzKCkgewoJJHJlZGlyZWN0cyA9IGFycmF5KCk7CglpZiAoc2FmZV9xdWVyeSgiZGVzY3Jp YmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRycyA9IHNhZmVfcm93 cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBsZWZ0dGFnJyk7CgkJ Zm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11d ID0gJHJvd1sncmlnaHR0YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1 bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7 CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3VybCkgewoJCSR1cmwg PSAkZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0 ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2UgewoJCSR1cmwgPSB0 cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRpb24sIGZhbHNlKTsKCQkkbWVzc2FnZSA9 ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMgYmVlbiByZXBsYWNlZCBieSAnIC4gJGRlc3RpbmF0 aW9uOwoJfQoKCWhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsKCXR4cF9kaWUoJG1lc3Nh Z2UsICczMDEnKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1 c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWlmICh0cnVfdGFn c19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNb VEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVybHByZWZpeCA9IGh1 IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICgkdXNl X2FtcCA/ICcmYW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZh bHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVhbl91cmxzKCkgPyAn LycgOiAnJyk7CglyZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFnKSAuICR1cmxz dWZmaXg7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkYXJ0 aWNsZUlEKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglpZiAo aXNzZXQoJHRoaXNhcnRpY2xlKSkgewoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCX0KCSRr ZXl3b3JkcyA9ICcnOwoJaWYgKGlzc2V0KCR0aGlzaWQpICYmICR0aGlzaWQgPT0gJGFydGlj bGVJRCkgewoJCWlmIChpc3NldCgkdGhpc2FydGljbGVbJ2tleXdvcmRzJ10pKSB7CgkJCSRr ZXl3b3JkcyA9ICR0aGlzYXJ0aWNsZVsna2V5d29yZHMnXTsKCQl9Cgl9IGVsc2UgewoJCSR0 YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmll bGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2ZpZWxkIDw+ ICcnIik7CgkJaWYgKGlzc2V0KCRyc1skdGFnc19maWVsZF0pKSB7CgkJCSRrZXl3b3JkcyA9 ICRyc1skdGFnc19maWVsZF07CgkJfQoJfQoJJGFsbF90YWdzID0gYXJyYXkoKTsKCSRhbGxf dGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJGtleXdvcmRz KSkpOwoKCXJldHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKfQoKCiMgZml4 ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFj ZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcwpmdW5jdGlvbiB0cnVfdGFnc19kb193 cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKSB7Cglp ZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcvXlx3KyQvJywgJGJyZWFrKSkgewoJCXJl dHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9IGVsc2UgewoJCXJldHVybiBkb1dyYXAo JGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwoJfQp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0YWdfYXJyYXkpIHsKCSR0cmltbWVkID0g YXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgewoJCWlmICgiIiAhPSB0 cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0cmltKCR0YWcpOwoJCX0KCX0KCXJldHVy biAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0 dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29yZHMgPSBleHBsb2RlKCcsJywgJHRhZ19w YXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0 cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsKCQkJJGtleXdvcmRzW10gPSBzdHJf cmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJCX0KCX0KCSRhdHRzWydrZXl3b3Jkcydd ID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9u J10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgewoJCSRh dHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0 aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pOwoJfQoKCWlmIChp c3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCXVuc2V0KCRhdHRzWydub2FydGljbGVz J10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7CgkJJGF0dHNbJ2xpbWl0 J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgkYXR0c1snYWxsb3dvdmVycmlkZSddKSkg ewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOwoJfQoKCWlmIChpc3NldCgkYXR0 c1snc2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0dHNbJ2xpc3Rmb3JtJ10pKSB7CgkJJGF0 dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNoZm9ybSddOwoJfQoKCWlmIChpc3NldCgk YXR0c1snc2hvd2NvdW50cyddKSkgewoJCXVuc2V0KCRhdHRzWydzaG93Y291bnRzJ10pOwoJ fQoKCWlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJlY3QnXSkpIHsKCQl1bnNldCgkYXR0c1sn NDA0cmVkaXJlY3QnXSk7Cgl9CgoJcmV0dXJuICRhdHRzOwp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3Nfc3RydG9sb3dlcigkc3RyKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCR0 cnVfdGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpIHsKCQlpZiAoZnVuY3Rpb25fZXhp c3RzKCdtYl9zdHJ0b2xvd2VyJykpIHsKCQkJcmV0dXJuIG1iX3N0cnRvbG93ZXIoJHN0ciwg RU5DT0RJTkcpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHIpOwoJCX0K CX0gZWxzZSB7CgkJcmV0dXJuICRzdHI7Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRv dXBwZXIoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG91cHBlcicpKSB7 CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIoJHN0ciwgRU5DT0RJTkcpOwoJfSBlbHNlIHsKCQly ZXR1cm4gc3RydG91cHBlcigkc3RyKTsKCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfdWNmaXJz dCgkc3RyKSB7CglpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSAmJiBmdW5jdGlv bl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxl bicpICYmIG1iX3N0cmxlbigkc3RyLCBFTkNPRElORykgPiAxKSB7CgkJcmV0dXJuIG1iX3N0 cnRvdXBwZXIobWJfc3Vic3RyKCRzdHIsIDAsIDEsIEVOQ09ESU5HKSwgRU5DT0RJTkcpIC4g bWJfc3Vic3RyKCRzdHIsIDEsIG1iX3N0cmxlbigkc3RyLCBFTkNPRElORyksIEVOQ09ESU5H KTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVjZmlyc3QoJHN0cik7Cgl9Cn0KCmZ1bmN0aW9uIHRy dV90YWdzX3Vjd29yZHMoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVy dF9jYXNlJykpIHsKCQlyZXR1cm4gbWJfY29udmVydF9jYXNlKCRzdHIsIE1CX0NBU0VfVElU TEUsIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVjd29yZHMoJHN0cik7Cgl9Cn0K CgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZp Z3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90 YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZykgewoJ Z2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5n OwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKCSR0cnVfdGFnc19z b3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsKCgkkdGVtcF9hcnJheSA9IGFycmF5 X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCWlmICgkc29ydF9ieV9jb3VudCkgewoJCXVzb3J0KCR0 ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IiKTsKCX0gZWxzZSB7 CgkJbmF0Y2FzZXNvcnQoJHRlbXBfYXJyYXkpOwoJCSR0ZW1wX2FycmF5ID0gYXJyYXlfdmFs dWVzKCR0ZW1wX2FycmF5KTsKCX0KCgkkc29ydGVkX2FycmF5ID0gYXJyYXkoKTsKCWZvcmVh Y2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsKCQkkc29ydGVkX2FycmF5WyR0YWddID0gJHRh Z3Nfd2VpZ2h0WyR0YWddOwoJfQoKCXJldHVybiAkc29ydGVkX2FycmF5Owp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IoJGxlZnQsICRyaWdodCkgewoJZ2xv YmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoK CSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskbGVmdF07CgkkcmlnaHRf d2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07CglpZiAoJGxlZnRfd2Vp Z2h0ID09ICRyaWdodF93ZWlnaHQpIHsKCQkkdGVtcF9hcnJheSA9IGFycmF5KCRsZWZ0LCAk cmlnaHQpOwoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsKCQkkdGVtcF9hcnJheSA9IGFy cmF5X3ZhbHVlcygkdGVtcF9hcnJheSk7CgkJcmV0dXJuICgkdGVtcF9hcnJheVswXSA9PSAk bGVmdCA/IC0xIDogMSk7Cgl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykg ewoJCXJldHVybiAkbGVmdF93ZWlnaHQgLSAkcmlnaHRfd2VpZ2h0OwoJfSBlbHNlIHsKCQly ZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsKCX0KfQoKCgojIyMgQkFTVEFS RCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rp b24gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkYXR0cykgewoJJHRoZUF0dHMgPSBs QXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAwLAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycs CgkJCQknc2VjdGlvbicgICA9PiAnJywKCQkJCSdleGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1 dGhvcicgICAgPT4gJycsCgkJCQknc29ydGJ5JyAgICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0 ZGlyJyAgID0+ICdkZXNjJywKCQkJCSdtb250aCcgICAgID0+ICcnLAoJCQkJJ2tleXdvcmRz JyAgPT4gJycsCgkJCQknZnJvbnRwYWdlJyA9PiAnJywKCQkJCSdpZCcgICAgICAgID0+ICcn LAoJCQkJJ3RpbWUnICAgICAgPT4gJ3Bhc3QnLAoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJ CQkJJ29mZnNldCcgICAgPT4gMAoJCQkpLCRhdHRzLCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMp OwoKCS8vQnVpbGRpbmcgcXVlcnkgcGFydHMKCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkg PyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOwoJJGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAg PyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSciLmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3Ig KENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRlZ29yeSkuIicpKSAiOwoJJHNlY3Rpb24gICA9 ICghJHNlY3Rpb24pICAgPyAnJyA6ICIgYW5kIFNlY3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0 aW9uKS4iJyI7CgkkZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhj ZXJwdCAhPScnIiA6ICcnOwoJJGF1dGhvciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIg YW5kIEF1dGhvcklEID0gJyIuZG9zbGFzaCgkYXV0aG9yKS4iJyI7CgkkbW9udGggICAgID0g KCEkbW9udGgpICAgICA/ICcnIDogIiBhbmQgUG9zdGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9u dGgpLiIlJyI7CgkkaWQgICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQg PSAnIi5pbnR2YWwoJGlkKS4iJyI7Cglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoK CQkJJHRpbWUgPSAiIjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFu ZCBQb3N0ZWQgPiBub3coKSI7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQg UG9zdGVkIDwgbm93KCkiOwoJfQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQoJCSRzdGF0 dXMgPSBnZXRTdGF0dXNOdW0oJHN0YXR1cyk7CgoJJGN1c3RvbSA9ICcnOwoJLy8gdHJ5aW5n IGN1c3RvbSBmaWVsZHMgaGVyZQoJJGN1c3RvbUZpZWxkcyA9IGdldEN1c3RvbUZpZWxkcygp OwoJaWYgKCRjdXN0b21GaWVsZHMpIHsKCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNG aWVsZCkgewoJCQlpZiAoaXNzZXQoJGF0dHNbJGNGaWVsZF0pKQoJCQkJJGN1c3RvbVBhaXJz WyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07CgkJfQoJCWlmKCFlbXB0eSgkY3VzdG9tUGFp cnMpKQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3Rv bVBhaXJzKTsKCQllbHNlCgkJCSRjdXN0b20gPSAnJzsKCX0KCgkvL0FsbG93IGtleXdvcmRz IGZvciBuby1jdXN0b20gYXJ0aWNsZXMuIFRoYXQgdGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJ aWYgKCRrZXl3b3JkcykgewoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3RyaW0nLCBl eHBsb2RlKCcsJywgJGtleXdvcmRzKSkpOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsK CQkJJGtleXBhcnRzW10gPSAiRklORF9JTl9TRVQoJyIuJGtleS4iJyxLZXl3b3JkcykiOwoJ CX0KCQkka2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRrZXlwYXJ0cykgLiAi KSI7Cgl9CgoJaWYgKCRpZCkKCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cyA+PSAnNCciOwoJ ZWxzZQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2goJHN0YXR1cykuIici OwoKCSR3aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4KCQkkaWQgLiAkY2F0ZWdvcnkg LiAkc2VjdGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9yIC4gJGtleXdvcmRz IC4gJGN1c3RvbSAuICRmcm9udHBhZ2U7CgoJCSRwZ29mZnNldCA9ICRvZmZzZXQgLiAnLCAn OwoKCSRycyA9IHNhZmVfcm93c19zdGFydCgiKiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBh cyB1UG9zdGVkIiwgJ3RleHRwYXR0ZXJuJywKCQkkd2hlcmUuICcgb3JkZXIgYnkgJyAuIGRv c2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1NsYXNoKCRzb3J0ZGlyKSAuICcgbGltaXQgJyAu IGRvU2xhc2goJGxpbWl0KSk7CgoJcmV0dXJuICRyczsKfQoKCiI7czo4OiJoZWxwX3JhdyI7 czo4NzY6IlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNrIG91dCB0aGUgImlu dHJvZHVjdG9yeSBhcnRpY2xlIjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9ibG9nLzQ5My90 cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFn ZSI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxl YXNlcywgImZlYXR1cmUgbGlzdCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNl LzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCwgInJvYWRtYXAiOmh0dHA6Ly93d3cucmFpbnNr aXQuY29tL3JlZmVyZW5jZS81NTQvdHJ1X3RhZ3Mtcm9hZG1hcCwgYW5kICJ1c2FnZSBpbnN0 cnVjdGlvbnMiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFn cy11c2FnZS1pbnN0cnVjdGlvbnMuCgpZb3UgY2FuIGFsc28gZmluZCB0aGUgc291cmNlIGNv ZGUgYXQgImdpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzIjpodHRwczovL2dpdGh1Yi5jb20v dHJ1aXN0L3RydS10YWdzLgoKSSd2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2Yg dGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZm aWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2lu LiAgSWYsIG15IHNpdGUgaXMgZXZlciBkb3duLCBob3dldmVyLCB0aGUgc291cmNlIEhUTUwg b2YgdGhlIHVzYWdlIGluc3RydWN0aW9ucyBpcyBhdmFpbGFibGUgZnJvbSB0aGUgImdpdGh1 YiByZXBvIjpodHRwczovL2dpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzL2Jsb2IvbWFzdGVy L3RydV90YWdzLWRvY3MuaHRtbCI7czozOiJtZDUiO3M6MzI6ImU4MDRmMDU3MTEwM2RjYmVm MDI5NDY1MjZhMDQzYTllIjt9