# Name: phq_subscribe v0.1.3 # Type: Admin/Client side plugin # Comment subscription by email # Author: Peter Hultqvist # URL: http://notes.endnode.se/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjEzOiJwaHFfc3Vic2NyaWJlIjtzOjY6ImF1dGhvciI7czox NToiUGV0ZXIgSHVsdHF2aXN0IjtzOjEwOiJhdXRob3JfdXJpIjtzOjI0OiJodHRwOi8vbm90 ZXMuZW5kbm9kZS5zZS8iO3M6NzoidmVyc2lvbiI7czo1OiIwLjEuMyI7czoxMToiZGVzY3Jp cHRpb24iO3M6Mjk6IkNvbW1lbnQgc3Vic2NyaXB0aW9uIGJ5IGVtYWlsIjtzOjQ6ImNvZGUi O3M6MTAxNDE6IgpyZWdpc3Rlcl9jYWxsYmFjaygncGhxX3N1YnNjcmliZV9mb3JtJywnY29t bWVudC5mb3JtJyk7CmZ1bmN0aW9uIHBocV9zdWJzY3JpYmVfZm9ybSgpCnsKCWdsb2JhbCAk cHJldGV4dDsKCXJldHVybiBwaHFfc3Vic2NyaWJlX2Zvcm1fY29tbW9uKCRwcmV0ZXh0Wydp ZCddKTsKfQoKZnVuY3Rpb24gcGhxX3N1YnNjcmliZV9mb3JtX2NvbW1vbigkYXJ0aWNsZSkK ewoJLy8gY3JlYXRlIHRoZSB0YWJsZSBpZiBub3QgYXZhaWxhYmxlIGFscmVhZHkKCXBocV9z dWJzY3JpYmVfY3JlYXRldGFibGUoKTsKCgkvL1N1YnNjcmliZS91bnN1YnNjcmliZSBjb2Rl Cgkkc3ViX2NvZGUgPSBncHMoJ2NvZGUnKTsKCgkvLyBVbnN1YnNjcmliZSAvIGRlbGV0ZSBy ZWNvcmQKCSR1bnN1YiA9IGdwcygndW5zdWJzY3JpYmUnKTsKCWlmKCR1bnN1YiA8PiAnJykK CXsKCQlpZihzYWZlX2RlbGV0ZSgicGhxX3N1YnNjcmliZSIsCgkJCSJgYXJ0aWNsZWAgPSAi LmludHZhbCgkYXJ0aWNsZSkuIiAiLgoJCQkiIEFORCBgZW1haWxgID0gJyIubXlzcWxfcmVh bF9lc2NhcGVfc3RyaW5nKCR1bnN1YikuIicgIi4KCQkJIiBBTkQgYGNvZGVgID0gJyIubXlz cWxfcmVhbF9lc2NhcGVfc3RyaW5nKCRzdWJfY29kZSkuIiciCgkJKSkKCQkJcGhxX3N1YnNj cmliZV9tYWlsKCR1bnN1YiwgIlVuc3Vic2NyaWJlIGNvbmZpcm1hdGlvbiIsICJZb3UgaGF2 ZSBub3cgYmVlbiB1bnN1YnNjcmliZWQgZnJvbSAiLnBlcm1saW5rdXJsX2lkKCRhcnRpY2xl KSk7Cgl9CgoJLy8gU3Vic2NyaWJlL3ZlcmlmeSBlbWFpbAoJJHN1Yl9lbWFpbCA9IGdwcygn c3Vic2NyaWJlJyk7CglpZigkc3ViX2VtYWlsIDw+ICcnICYmICRzdWJfY29kZSA8PiAnJykK CXsKCQlpZihzYWZlX3VwZGF0ZSgicGhxX3N1YnNjcmliZSIsICdgc3Vic2NyaWJlZGAgPSB0 cnVlICcsCgkJCSJgYXJ0aWNsZWAgPSAnIi5pbnR2YWwoJGFydGljbGUpLiInICIuCgkJCSIg QU5EIGBlbWFpbGAgPSAnIi5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHN1Yl9lbWFpbCku IicgIi4KCQkJIiBBTkQgYGNvZGVgID0gJyIubXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCRz dWJfY29kZSkuIiciCgkJKSkKCQkJcGhxX3N1YnNjcmliZV9tYWlsKCRzdWJfZW1haWwsICJT dWJzY3JpYmUgY29uZmlybWF0aW9uIiwgIllvdSBoYXZlIG5vdyBiZWVuIHN1YnNjcmliZWQg dG8gIi5wZXJtbGlua3VybF9pZCgkYXJ0aWNsZSkpOwoJfQoKCXJldHVybjsKfQoKcmVnaXN0 ZXJfY2FsbGJhY2soJ3BocV9zdWJzY3JpYmVfc2F2ZScsJ2NvbW1lbnQuc2F2ZScpOwpmdW5j dGlvbiBwaHFfc3Vic2NyaWJlX3NhdmUoKQp7CglnbG9iYWwgJHNpdGVuYW1lOwoKCSRjb21t ZW50ID0gZ2V0Q29tbWVudCgpOwoJJGFydGljbGUgPSBzYWZlX3JvdygiQXV0aG9ySUQsIFRp dGxlIiwgInRleHRwYXR0ZXJuIiwgIklEID0gIi5pbnR2YWwoJGNvbW1lbnRbJ3BhcmVudGlk J10pKTsKCgkvL1NlbmQgbm90aWZpY2F0aW9uIHRvIGVhY2ggc3Vic2NyaWJlcgoJJHN1YnNj cmliZXJzID0gYXJyYXlfdW5pcXVlKHNhZmVfcm93cygnZW1haWwsIGNvZGUnLCAncGhxX3N1 YnNjcmliZScsICdgYXJ0aWNsZWAgPSAnLmludHZhbCgkY29tbWVudFsncGFyZW50aWQnXSku JyBBTkQgYHN1YnNjcmliZWRgID0gdHJ1ZScpKTsKCWlmKGlzX2FycmF5KCRzdWJzY3JpYmVy cykpCgl7CgkJJHN1YmplY3QgPSAnWycuJHNpdGVuYW1lLiddIE5ldyBjb21tZW50IG9uIGFy dGljbGUgJy4kYXJ0aWNsZVsnVGl0bGUnXTsKCQkkbWFpbGZvcm0gPSBwaHFfc3Vic2NyaWJl X2dldG1haWxmb3JtKCdjb21tZW50Jyk7CgoJCWZvcmVhY2goJHN1YnNjcmliZXJzIGFzICRz dWJzY3JpYmVyKQoJCXsKCQkJJGJvZHkgPSBwYXJzZShwaHFfc3Vic2NyaWJlcl9wYXJzZSgk bWFpbGZvcm0sICRjb21tZW50WydwYXJlbnRpZCddLCAkc3Vic2NyaWJlclsnZW1haWwnXSwg JHN1YnNjcmliZXJbJ2NvZGUnXSkpOwoJCQkvL0Rvbid0IHVzZSBwaHFfc3Vic2NyaWJlX21h aWwgaGVyZSBzaW5jZSB0aGF0IHdvdWxkIHJldmVhbCB0aGUgSVAgYWRkcmVzcyBvZiBvdGhl ciBjb21tZW50IHBvc3RlcnMKCQkJbWFpbCgkc3Vic2NyaWJlclsnZW1haWwnXSwgJHN1Ympl Y3QsICRib2R5LCAiRnJvbTogIi4kcHJlZnNbJ3NtdHBfZnJvbSddKTsKCQl9OwoJfTsKCgkv L1NlbmQgc3Vic2NyaWJlIGludml0ZSB0byBjb21tZW50IGF1dGhvcgoJaWYoZW1haWxjaGVj aygkY29tbWVudFsnZW1haWwnXSkgPT0gdHJ1ZSkKCXsKCQkkY29kZSA9IG10X3JhbmQoKTsK CQkkcmV0ID0gc2FmZV9pbnNlcnQoJ3BocV9zdWJzY3JpYmUnLCAnCgkJCWBhcnRpY2xlYCA9 ICcuaW50dmFsKCRjb21tZW50WydwYXJlbnRpZCddKS4nLAoJCQlgZW1haWxgID0gXCcnLm15 c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkY29tbWVudFsnZW1haWwnXSkuJ1wnLAoJCQlgc3Vi c2NyaWJlZGAgPSBmYWxzZSwKCQkJYGNvZGVgID0gXCcnLm15c3FsX3JlYWxfZXNjYXBlX3N0 cmluZygkY29kZSkuJ1wnJwoJCSk7CgoJCWlmKCRyZXQpCgkJewoJCQkkYXJ0aWNsZSA9IHNh ZmVfcm93KCJBdXRob3JJRCwgVGl0bGUiLCAidGV4dHBhdHRlcm4iLCAiSUQgPSAiLmludHZh bCgkY29tbWVudFsncGFyZW50aWQnXSkpOwoJCQkkYXV0aG9yID0gc2FmZV9yb3coIlJlYWxO YW1lLCBlbWFpbCIsICJ0eHBfdXNlcnMiLCAibmFtZSA9ICciLm15c3FsX3JlYWxfZXNjYXBl X3N0cmluZygkYXJ0aWNsZVsnJEF1dGhvcklEJ10pLiInIik7CgkJCSRzdWJqZWN0ID0gJ1sn LiRzaXRlbmFtZS4nXSBTdWJzY3JpYmUgdG8gYXJ0aWNsZSAnLiRhcnRpY2xlWydUaXRsZSdd OwoJCQkkbWFpbGZvcm0gPSBwaHFfc3Vic2NyaWJlX2dldG1haWxmb3JtKCduZXcnKTsKCQkJ JGJvZHkgPSBwYXJzZShwaHFfc3Vic2NyaWJlcl9wYXJzZSgkbWFpbGZvcm0sICRjb21tZW50 WydwYXJlbnRpZCddLCAkY29tbWVudFsnZW1haWwnXSwgJGNvZGUpKTsKCQkJcGhxX3N1YnNj cmliZV9tYWlsKCRjb21tZW50WydlbWFpbCddLCAkc3ViamVjdCwgJGJvZHkpOwoJCX0KCX07 CgoKfQoKZnVuY3Rpb24gcGhxX3N1YnNjcmliZV9nZXRtYWlsZm9ybSgkbmFtZSkKewoJc3dp dGNoKCRuYW1lKQoJewoJY2FzZSAnY29tbWVudCc6CgkJJGZvcm0gPSAiSGkgdGhlcmUsXG5c biIuCgkJCSJUaGVyZSBpcyBhIG5ldyBjb21tZW50IG9uIDx0eHA6c2l0ZW5hbWUvPiBmb3Ig dGhlICBcIjx0eHA6dGl0bGUgLz5cIi5cbiIuCgkJCSJZb3UgY2FuIHJlYWQgaXQgb24gPHR4 cDpwZXJtbGluayAvPi5cblxuIi4KCQkJIlVuc3Vic2NyaWJlIGJ5IGZvbGxvd2luZyB0aGlz IHVybDogPHR4cDpwaHFfdW5zdWJzY3JpYmVfdXJsIC8+IjsKCQlicmVhazsKCWNhc2UgJ25l dyc6CgkJJGZvcm0gPSAiRm9sbG93IHRoaXMgbGluayB0byBzdWJzY3JpYmUgdG8gdGhlIGFy dGljbGUgXCI8dHhwOnRpdGxlIC8+XCJcbiIuCgkJCQkiPHR4cDpwaHFfc3Vic2NyaWJlX3Vy bCAvPlxuXG4iLgoJCQkJIllvdSBjYW4gcmVhZCB0aGUgYXJ0aWNsZSBvbiA8dHhwOnBlcm1s aW5rIC8+LiI7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAnJzsKCX0KCgkkZm9ybV9y b3cgPSBzYWZlX3JvdygiRm9ybSIsICJ0eHBfZm9ybSIsICJuYW1lPSdwaHFfc3Vic2NyaWJl XyRuYW1lJyBsaW1pdCAxIik7CglpZighJGZvcm1fcm93KQoJCXNhZmVfaW5zZXJ0KCJ0eHBf Zm9ybSIsICJuYW1lPSdwaHFfc3Vic2NyaWJlXyRuYW1lJywgdHlwZT0nbWlzYycsIEZvcm09 JyIubXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCRmb3JtKS4iJyIpOwoKCWlmKCRmb3JtX3Jv dykKCQlyZXR1cm4gJGZvcm1fcm93WydGb3JtJ107CgllbHNlCgkJcmV0dXJuICRmb3JtOwp9 CgpmdW5jdGlvbiBwaHFfc3Vic2NyaWJlX21haWwoJGVtYWlsLCAkc3ViamVjdCwgJGJvZHkp CnsKCWdsb2JhbCAkcHJlZnM7CglyZXR1cm4gbWFpbCgkZW1haWwsICRzdWJqZWN0LCAkYm9k eSwKCQkiRnJvbTogIi4kcHJlZnNbJ3NtdHBfZnJvbSddLiJcbiIuCgkJJ1gtUmVtb3RlLUlQ OiAnLiRfU0VSVkVSWydSRU1PVEVfQUREUiddCgkpOwp9CgpmdW5jdGlvbiBwaHFfc3Vic2Ny aWJlX2NyZWF0ZXRhYmxlKCl7CgoJJHNxbCA9ICdTRUxFQ1QgKiBGUk9NIGAnLnNhZmVfcGZ4 KCdwaHFfc3Vic2NyaWJlJykuJ2AgTElNSVQgMSc7CglpZihzYWZlX3F1ZXJ5KCRzcWwpID09 IGZhbHNlKXsKCgkJc2FmZV9xdWVyeSgnUkVOQU1FIFRBQkxFIGAnLnNhZmVfcGZ4KCdwaHFf c3Vic2NyaWJlJykuJ2AgVE8gYCcuc2FmZV9wZngoJ3BocV9zdWJzY3JpYmUnKS4nYCA7Jyk7 CgkJc2FmZV9xdWVyeSgnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYCcuc2FmZV9wZngo J3BocV9zdWJzY3JpYmUnKS4nYCAoCgkJCQkJYGFydGljbGVgIGludCgxMSkgdW5zaWduZWQg Tk9UIE5VTEwsCgkJCQkJYGVtYWlsYCB2YXJjaGFyKDEyNykgTk9UIE5VTEwsCgkJCQkJYHN1 YnNjcmliZWRgIHRpbnlpbnQoMSkgTk9UIE5VTEwsCgkJCQkJYGNvZGVgIHZhcmNoYXIoMTI3 KSBOT1QgTlVMTCwKCQkJCQlVTklRVUUgS0VZIGBhcnRpY2xlYCAoYGFydGljbGVgLGBlbWFp bGApCgkJCQkJKTsnCgkJKTsKCgl9OwoJcmV0dXJuOwp9CgovLyBSZXBsYWNlIHNvbWUgdGFn cyB3aXRoIHVuL3N1YnNjcmliZSBsaW5rcwovLyBUaGlzIGNhbm5vdCBiZSBkb25lIHVzaW5n IHRoZSB0ZXh0cGF0dGVybiBwYXJzZXIgYmVjYXVzZSBvZiB0aGUKLy8gZXh0cmEgcGFyYW1l dGVycyB0aGF0IHZhcmllcyBmb3IgZWFjaCByZWNpcGllbnQuCmZ1bmN0aW9uIHBocV9zdWJz Y3JpYmVyX3BhcnNlKCRjb250ZW50LCAkYXJ0aWNsZSwgJGVtYWlsLCAkY29kZSkKewoJJHVy bCA9IHBlcm1saW5rdXJsX2lkKCRhcnRpY2xlKTsKCSR1cmwgLj0gKHN0cnN0cigkdXJsLCAn PycpKSA/ICImIiA6ICI/IjsKCgkkc3ViX3VybAkJPSAkdXJsLiJzdWJzY3JpYmU9Ii51cmxl bmNvZGUoJGVtYWlsKS4nJmNvZGU9Jy51cmxlbmNvZGUoJGNvZGUpOwoJJHVuc3ViX3VybAk9 ICR1cmwuInVuc3Vic2NyaWJlPSIudXJsZW5jb2RlKCRlbWFpbCkuJyZjb2RlPScudXJsZW5j b2RlKCRjb2RlKTsKCgkkY29udGVudCA9IGVyZWdfcmVwbGFjZSgiPHR4cDpwaHFfc3Vic2Ny aWJlX3VybCAqLz4iLCAkc3ViX3VybCwgJGNvbnRlbnQpOwoJJGNvbnRlbnQgPSBlcmVnX3Jl cGxhY2UoIjx0eHA6cGhxX3Vuc3Vic2NyaWJlX3VybCAqLz4iLCAkdW5zdWJfdXJsLCAkY29u dGVudCk7CgoJcmV0dXJuICRjb250ZW50Owp9CgppZighZnVuY3Rpb25fZXhpc3RzKCdlbWFp bGNoZWNrJykpewoJZnVuY3Rpb24gZW1haWxjaGVjaygkZWFkZHI9IiIpewoJCS8qKgoJCSAq IEB2YXIgc3RyaW5nIFJlZ2V4cCBmP3IgbWF0Y2hpbmcgYXVmIHZhbGlkZSBFbWFpbHN5bnRh eAoJCSAqLwoJCSRwYXR0ZXJuID0gIi9eKFthLXpBLVowLTldKSsoW1wuYS16QS1aMC05Xy1d KSpAKFthLXpBLVowLTlfLV0pKyhcLlthLXpBLVowLTlfLV0rKSsvIjsKCQlpZiAoZW1wdHko JGVhZGRyKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlaWYgKCFwcmVnX21hdGNoKCRw YXR0ZXJuLCAkZWFkZHIpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQkkbGFk ZHIgPSAiIjsKCQkJJGxhZGRyID0gJGVhZGRyOwoJCQkkbGFkZHIgPSBwcmVnX3JlcGxhY2Uo Jy9eLio8LycsJycsICRsYWRkcik7CgkJCSRsYWRkciA9IHByZWdfcmVwbGFjZSgnLz4uKiQv JywnJywkbGFkZHIpOwoJCQlpZiAocHJlZ19tYXRjaCgnL15cQC4qOi8nLCRsYWRkcikpewoJ CQkJbGlzdCgkZG9tYWluLCRhZGRyX3NwZWMpID0gcHJlZ19zcGxpdCgnLzovJywkbGFkZHIp OwoJCQkJJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnL15cQC8nLCcnLCRkb21haW4pOwoJCQkJ aWYgKCFpc19kb21haW4oJGRvbWFpbikpIHtyZXR1cm4gZmFsc2U7fQoJCQkJJGxhZGRyID0g JGFkZHJfc3BlYzsKCQkJfTsKCQkJcmV0dXJuKGlzX2FkZHJfc3BlYygkbGFkZHIpKTsKCQl9 OwoJfQoJLyoqI0ArCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzaW5jZSAxLjAuMSAoMjYu MDMuMjAwNCkKCSAqIEB2ZXJzaW9uIDEuMC4xCgkgKi8KCWZ1bmN0aW9uIGlzX2FkZHJfc3Bl YyAoJGVhZGRyID0gIiIpewoJCWxpc3QoJGxvY2FsX3BhcnQsJGRvbWFpbikgPSBwcmVnX3Nw bGl0KCcvXEAvJywkZWFkZHIpOwoJCWlmICghaXNfbG9jYWxfcGFydCgkbG9jYWxfcGFydCkg fHwgIWlzX2RvbWFpbigkZG9tYWluKSl7CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJCXJldHVy biB0cnVlOwoJfQoJZnVuY3Rpb24gaXNfbG9jYWxfcGFydCAoJGxvY2FsX3BhcnQgPSAiIil7 CgkJaWYgKGVtcHR5KCRsb2NhbF9wYXJ0KSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfTsKCQkk Yml0X2FycmF5ID0gcHJlZ19zcGxpdCgnL1wuLycsJGxvY2FsX3BhcnQpOwoJCXdoaWxlIChs aXN0KCwkYml0KSA9IGVhY2goJGJpdF9hcnJheSkpewoJCQlpZiAoIWlzX3dvcmQoJGJpdCkp IHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfTsKCQl9OwoJCXJldHVybiB0cnVlOwoJfQoJZnVu Y3Rpb24gaXNfd29yZCgkd29yZCA9ICIiKXsKCQlpZiAocHJlZ19tYXRjaCgnL14iLioiJC9p Jywkd29yZCkpewoJCQlyZXR1cm4oaXNfcXVvdGVkX3N0cmluZygkd29yZCkpOwoJCX07CgkJ cmV0dXJuKGlzX2F0b20oJHdvcmQpKTsKCX0KCWZ1bmN0aW9uIGlzX3F1b3RlZF9zdHJpbmco JHdvcmQgPSAiIil7CgkJJHdvcmQgPSBwcmVnX3JlcGxhY2UoJy9eIi8nLCcnLCR3b3JkKTsK CQkkd29yZCA9IHByZWdfcmVwbGFjZSgnLyIkLycsJycsJHdvcmQpOwoJCSR3b3JkID0gcHJl Z19yZXBsYWNlKCcvXFwrLycsJycsJHdvcmQpOwoJCWlmIChwcmVnX21hdGNoKCcvXCJcXFxy LycsJHdvcmQpKXsKCQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJcmV0dXJuIHRydWU7Cgl9Cglm dW5jdGlvbiBpc19hdG9tKCRhdG9tID0gIiIpewoJCWlmICgocHJlZ19tYXRjaCgnL1tcKFwp XDxcPlxAXCxcO1w6XFxcIlwuXFtcXV0vJywkYXRvbSkpIHx8IChwcmVnX21hdGNoKCcvXDA0 MC8nLCRhdG9tKSkgfHwgKHByZWdfbWF0Y2goJy9bXHgwMC1ceDFGXS8nLCRhdG9tKSkpIHsK CQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJcmV0dXJuIHRydWU7Cgl9CglmdW5jdGlvbiBpc19k b21haW4oJGRvbWFpbiA9ICIiKXsKCQlpZiAoZW1wdHkoJGRvbWFpbikpIHsKCQkJcmV0dXJu IGZhbHNlOwoJCX07CgkJaWYgKCFwcmVnX21hdGNoKCcvXC4vJywkZG9tYWluKSkgewoJCQly ZXR1cm4gZmFsc2U7CgkJfTsKCQkkZGJpdF9hcnJheSA9IHByZWdfc3BsaXQoJy8uLycsJGRv bWFpbik7CgkJd2hpbGUgKGxpc3QoLCRkYml0KSA9IGVhY2goJGRiaXRfYXJyYXkpKXsKCQkJ aWYgKCFpc19zdWJfZG9tYWluKCRkYml0KSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJ CX07CgkJcmV0dXJuIHRydWU7Cgl9CglmdW5jdGlvbiBpc19zdWJfZG9tYWluKCRzdWJkID0g IiIpewoJCWlmIChwcmVnX21hdGNoKCcvXlxbLipcXSQvJywkc3ViZCkpewoJCQlyZXR1cm4o aXNfZG9tYWluX2xpdGVyYWwoJHN1YmQpKTsKCQl9OwoJCXJldHVybihpc19hdG9tKCRzdWJk KSk7Cgl9CglmdW5jdGlvbiBpc19kb21haW5fbGl0ZXJhbCgkZG9tID0gIiIpewoJCSRkb20g PSBwcmVnX3JlcGxhY2UoJy9cXCsvJywnJywkZG9tKTsKCQlpZiAocHJlZ19tYXRjaCgnL1tc W1xdXFxccl0vJywkZG9tKSl7CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJCXJldHVybiB0cnVl OwoJfQoJLyoqI0AtKi8KCn0KCi8vU3Vic2NyaWJlIHRhYiB1bmRlciBDb250ZW50IGluIHRo ZSBhZG1pbiBhcmVhCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpCnsKCWdsb2JhbCAk cGhxX3N1YnNjcmliZV9hZG1pbmV2ZW50OwoJJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudCA9 ICdzdWJzY3JpYmVfYWRtaW4nOwoJJG15dGFiID0gJ1N1YnNjcmlidGlvbnMnOwoKCS8vIFNl dCB0aGUgcHJpdmlsZWdlIGxldmVscyBmb3Igb3VyIG5ldyBldmVudAoJYWRkX3ByaXZzKCRw aHFfc3Vic2NyaWJlX2FkbWluZXZlbnQsICcxLDIsMycpOwoKCS8vIEFkZCBhIG5ldyB0YWIg dW5kZXIgJ2V4dGVuc2lvbnMnIGFzc29jaWF0ZWQgd2l0aCBvdXIgZXZlbnQKCXJlZ2lzdGVy X3RhYigiY29udGVudCIsICRwaHFfc3Vic2NyaWJlX2FkbWluZXZlbnQsICRteXRhYik7CgoJ Ly8gJ3plbV9hZG1pbl90ZXN0JyB3aWxsIGJlIGNhbGxlZCB0byBoYW5kbGUgdGhlIG5ldyBl dmVudAoJcmVnaXN0ZXJfY2FsbGJhY2soInBocV9zdWJzY3JpYmVfYWRtaW4iLCAkcGhxX3N1 YnNjcmliZV9hZG1pbmV2ZW50KTsKCglmdW5jdGlvbiBwaHFfc3Vic2NyaWJlX2FkbWluX3N1 Yl91cmwoJGFydGljbGUsICRlbWFpbCwgJGNvZGUpCgl7CgkJZ2xvYmFsICRwaHFfc3Vic2Ny aWJlX2FkbWluZXZlbnQ7CgkJcmV0dXJuCgkJCSc/ZXZlbnQ9Jy4kcGhxX3N1YnNjcmliZV9h ZG1pbmV2ZW50LgoJCQknJmFydGljbGU9Jy51cmxlbmNvZGUoJGFydGljbGUpLgoJCQknJnN1 YnNjcmliZT0nLnVybGVuY29kZSgkZW1haWwpLgoJCQknJmNvZGU9Jy51cmxlbmNvZGUoJGNv ZGUpOwoJfQoKCWZ1bmN0aW9uIHBocV9zdWJzY3JpYmVfYWRtaW5fdW5zdWJfdXJsKCRhcnRp Y2xlLCAkZW1haWwsICRjb2RlKQoJewoJCWdsb2JhbCAkcGhxX3N1YnNjcmliZV9hZG1pbmV2 ZW50OwoJCXJldHVybgoJCQknP2V2ZW50PScuJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudC4K CQkJJyZhcnRpY2xlPScudXJsZW5jb2RlKCRhcnRpY2xlKS4KCQkJJyZ1bnN1YnNjcmliZT0n LnVybGVuY29kZSgkZW1haWwpLgoJCQknJmNvZGU9Jy51cmxlbmNvZGUoJGNvZGUpOwoJfQoK CWZ1bmN0aW9uIHBocV9zdWJzY3JpYmVfYWRtaW4oJGV2ZW50LCAkc3RlcCkKCXsKCQkvLyBX ZSBuZWVkIHRoZSBwZXJtbGlua3VybF9pZCgpIGZ1bmN0aW9uCgkJQGluY2x1ZGVfb25jZSgn cHVibGlzaC90YWdoYW5kbGVycy5waHAnKTsKCgkJLy9Gb3Igc29tZSByZWFzb24gdGhpcyBp cyBuZWVkZWQgb24gdGhlIHRvcCBwYWdlIG9mIHRoZSBhZG1pbiB0YWIuCgkJcGFnZXRvcCgi Q29tbWVudCBTdWJzY3JpcHRpb25zIiwgIiIpOwoKCQlwaHFfc3Vic2NyaWJlX2Zvcm1fY29t bW9uKGdwcygnYXJ0aWNsZScpKTsKCgkJJHN1YnNjcmliZXJzID0gc2FmZV9yb3dzKCdhcnRp Y2xlLCBlbWFpbCwgY29kZScsICdwaHFfc3Vic2NyaWJlJywgJ2BzdWJzY3JpYmVkYCA9IHRy dWUnKTsKCQllY2hvICc8aDE+U3Vic2NyaWJlZDwvaDE+PHRhYmxlPjx0cj48dGg+QXJ0aWNs ZTwvdGg+PHRoPkVtYWlsPC90aD48dGg+VW5zdWJzY3JpYmUvUmVtb3ZlPC90aD48L3RyPic7 CgkJZm9yZWFjaCgkc3Vic2NyaWJlcnMgYXMgJHN1YikKCQkJZWNobyAnPHRyPgoJCQkJPHRk PicuaHRtbGVudGl0aWVzKCRzdWJbJ2FydGljbGUnXSkuJzwvdGQ+CgkJCQk8dGQ+Jy5odG1s ZW50aXRpZXMoJHN1YlsnZW1haWwnXSkuJzwvdGQ+CgkJCQk8dGQ+PGEgaHJlZj0iJy5waHFf c3Vic2NyaWJlX2FkbWluX3Vuc3ViX3VybCgkc3ViWydhcnRpY2xlJ10sICRzdWJbJ2VtYWls J10sICRzdWJbJ2NvZGUnXSkuJyI+VW5zdWJzY3JpYmU8L2E+PC90ZD4KCQkJCTwvdHI+JzsK CQllY2hvICc8L3RhYmxlPic7CgoJCSRzdWJzY3JpYmVycyA9IHNhZmVfcm93cygnYXJ0aWNs ZSwgZW1haWwsIGNvZGUnLCAncGhxX3N1YnNjcmliZScsICdgc3Vic2NyaWJlZGAgPSBmYWxz ZScpOwoJCWVjaG8gJzxoMT5Ob3QgY29uZmlybWVkIHN1YnNjcmlwdGlvbnM8L2gxPjx0YWJs ZT48dHI+PHRoPkFydGljbGU8L3RoPjx0aD5FbWFpbDwvdGg+PHRoPlN1YnNjcmliZTwvdGg+ PHRoPlJlbW92ZTwvdGg+PC90cj4nOwoJCWZvcmVhY2goJHN1YnNjcmliZXJzIGFzICRzdWIp CgkJCWVjaG8gJzx0cj4KCQkJCTx0ZD4nLmh0bWxlbnRpdGllcygkc3ViWydhcnRpY2xlJ10p Lic8L3RkPgoJCQkJPHRkPicuaHRtbGVudGl0aWVzKCRzdWJbJ2VtYWlsJ10pLic8L3RkPgoJ CQkJPHRkPjxhIGhyZWY9IicucGhxX3N1YnNjcmliZV9hZG1pbl9zdWJfdXJsKCRzdWJbJ2Fy dGljbGUnXSwgJHN1YlsnZW1haWwnXSwgJHN1YlsnY29kZSddKS4nIj5TdWJzY3JpYmU8L2E+ PC90ZD4KCQkJCTx0ZD48YSBocmVmPSInLnBocV9zdWJzY3JpYmVfYWRtaW5fdW5zdWJfdXJs KCRzdWJbJ2FydGljbGUnXSwgJHN1YlsnZW1haWwnXSwgJHN1YlsnY29kZSddKS4nIj5VbnN1 YnNjcmliZTwvYT48L3RkPgoJCQkJPC90cj4nOwoJCWVjaG8gJzwvdGFibGU+JzsKCX0KfQoi O3M6NDoidHlwZSI7czoxOiIxIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6NDoiaGVscCI7czoy MzA5OiI8aDE+U3Vic2NyaWJlIHRvIGNvbW1lbnRzIHZpYSBlbWFpbDwvaDE+CgoJPGgyPklu c3RhbGxhdGlvbjwvaDI+CgoJPHA+Rm9yIGJhc2ljIGZ1bmN0aW9uYWxpdHkgYWxsIHlvdSBu ZWVkIHRvIGRvIGlzIGVuYWJsZSB0aGUgcGx1Z2luIGluIHRoZSBhZG1pbi1wbHVnaW4gYXJl YS48L3A+CgoJPGgyPkJhc2ljIHVzYWdlPC9oMj4KCgk8cD5XaGVuIHlvdSB3cml0ZSBhIGNv bW1lbnQgYW5kIHNwZWNpZnkgeW91ciBlbWFpbCBhZGRyZXNzIHlvdSB3aWxsIGRpcmVjdGx5 IHJlY2VpdmUgYW4gZW1haWwgd2l0aCBhIGNvbmZpcm1hdGlvbiBhbmQgYW4gaW52aXRhdGlv biB0byBzdWJzY3JpYmUgdG8gdGhlIGFydGljbGUgY29tbWVudHMuPC9wPgoKCTxwPlRoaXMg c3Vic2NyaXB0aW9ucyBpcyBkb25lL2NvbmZpcm1lZCBieSBmb2xsb3dpbmcgdGhlIGxpbmsg aW4gdGhlIGVtYWlsLjwvcD4KCgk8cD5BZnRlciB0aGlzIHRoZSB1c2VyIHdpbGwgcmVjZWl2 ZSBhIG5ldyBub3RpZmljYXRpb24gd2hlbmV2ZXIgYSBuZXcgY29tbWVudCBpcyBwb3N0ZWQu PC9wPgoKCTxwPkFsbCB0aGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aXRob3V0IGludGVy dmVudGlvbiBmcm9tIHRoZSBzaXRlIG93bmVyIG9uY2UgdGhlIHBsdWdpbiBpcyBpbnN0YWxs ZWQgYW5kIGVuYWJsZWQuPC9wPgoKCTxoMj5VbnN1YnNjcmliZTwvaDI+CgoJPHA+RWFjaCBt YWlsIHlvdSByZWNlaXZlIGNvbnRhaW4gYW4gdW5zdWJzY3JpYmUgbGluaywgZm9sbG93IGl0 IGFuZCB5b3UmIzgyMTc7cmUgZG9uZS48L3A+CgoJPHA+VGhlc2UgbWFpbHMgY2FuIGJlIGN1 c3RvbWl6ZWQoc2VlIGJlbG93KSBidXQgaXQgaXMgaGlnaGx5IGVuY291cmFnZWQgdG8gYXQg bGVhc3Qga2VlcCB0aGlzIGxpbmsuPC9wPgoKCTxoMj5NdWx0aXBsZSBjb21tZW50czwvaDI+ CgoJPHA+T25seSB0aGUgZmlyc3QgdGltZSB5b3Ugd3JpdGUgYSBjb21tZW50IHlvdSB3aWxs IGdldCB0aGUgZ3JlZXRpbmcgYW5kIG9mZmVyIHRvIHN1YnNjcmliZS48YnIgLz4KVGhlIGVt YWlsIGlzIHJlY29yZGVkIHRvIHRoYXQgc3BlY2lmaWMgYXJ0aWNsZSBzbyBpZiB5b3Ugd3Jp dGUgYSBjb21tZW50IHRvIGFub3RoZXIgYXJ0aWNsZSB5b3Ugd2lsbCBvbmNlIGFnYWluIHJl Y2VpdmUgYSBjb25maXJtYXRpb24uIFRoaXMgaXMgd2hldGVyIG9yIG5vdCB5b3UgY2hvb3Nl IHRvIHN1YnNjcmliZS48YnIgLz4KSWYgeW91IGNob29zZSBub3QgdG8gc3Vic2NyaWJlIHRo ZXJlIHdpbGwgYmUgYSByZWNvcmQgc3RhdGluZyB0aGF0LiBJZiB5b3UgY2hvb3NlIGFjdGl2 ZWx5IHRvIHVuc3Vic2NyaWJlIHRoZSByZWNvcmQgd2lsbCBiZSByZW1vdmVkLjwvcD4KCgk8 cD5JZiB5b3Ugb3IgdGhlIGFkbWluaXN0cmF0b3IgY2hvb3NlcyB0byB1bnN1YnNjcmliZSBh bnkgZnV0dXJlIGNvbW1lbnRzIHdpbGwgYWdhaW4gYmUgdHJlYXRlZCBhcyB0aGUgZmlyc3Qg b25lIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZ3JlZXRpbmcgZW1haWwuPC9wPgoKCTxoMj5I b3cgdG8gYWRtaW5pc3RyYXRlPC9oMj4KCgk8cD5BcyBhbiBhZG1pbmlzdHJhdG9yLCB0b3Ag dGhyZWUgbGV2ZWxzKGNvbW1lbnRzKSwgeW91IGNhbiBzdWJzY3JpYmUgYW5kIHVuc3Vic2Ny aWJlIGVtYWlscyB1c2luZyB0aGUgJiM4MjIwO1N1YnNjcmlidGlvbnMmIzgyMjE7IHRhYiB1 bmRlciAmIzgyMjA7Q29udGVudCYjODIyMTsgaW4gdGhlIGFkbWluIGFyZWEuPC9wPgoKCTxo Mj5Ib3cgdG8gY3VzdG9taXplPC9oMj4KCgk8cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZW1h aWxzIHRoYXQgYXJlIHNlbnQgb24gZmlyc3QgY29tbWVudCBhbmQgb24gc3Vic2NyaXB0aW9u IG5vdGlmaWNhdGlvbnMgYnkgZWRpdCB0aGUgJiM4MjIwO3BocV9zdWJzY3JpYmVfY29tbWVu dCYjODIyMTsgYW5kICYjODIyMDtwaHFfc3Vic2NyaWJlX25ldyYjODIyMTsgbWlzYyBGb3Jt IHVuZGVyIFByZXNlbnRhdGlvbi48L3A+CgoJPHA+QWZ0ZXIgaW5zdGFsbGF0aW9uIHRoZXNl IHRlbXBsYXRlcyBhcmUgbm90IHRvIGJlIGZvdW5kIHRoZXJlIHVudGlsIHRoZSBmaXJzdCBt YWlsIHMgc2VudCBmb3IgZWFjaCB0eXBlIG9mIG1lc3NhZ2UsIHRoZXJlZm9yZSB5b3UgbXVz dCB3cml0ZSBvbmUgY29tbWVudCBzdWJzY3JpYmUgdG8gaXQsIGFuZCB0aGVuIHdyaXRlIGFu b3RoZXIgb25lLjxiciAvPgpZb3UgY2FuIGFsc28gY3JlYXRlIHRoZSBmb3JtcyB5b3Vyc2Vs ZiB1c2luZyA8dHhwOnBocV91bnN1YnNjcmliZV91cmwgLz4gYW5kIDx0eHA6cGhxX3N1YnNj cmliZV91cmwgLz4gdG8gaW5zZXJ0IHRoZSByZXNwZWN0aXZlIHVybHMuPC9wPiI7czozOiJt ZDUiO3M6MzI6ImM0MTVlMjFlYjVjMTRjZWExZGZkYTc2N2YxZjFlMWE1Ijt9