# phq_subscribe v0.1.3 # Comment subscription by email # Peter Hultqvist # http://notes.endnode.se/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NToiMC4xLjMiO3M6NjoiYXV0aG9yIjtzOjE1OiJQZXRl ciBIdWx0cXZpc3QiO3M6MTA6ImF1dGhvcl91cmkiO3M6MjQ6Imh0dHA6Ly9ub3Rlcy5lbmRu b2RlLnNlLyI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjk6IkNvbW1lbnQgc3Vic2NyaXB0aW9u IGJ5IGVtYWlsIjtzOjQ6InR5cGUiO2k6MTtzOjQ6Im5hbWUiO3M6MTM6InBocV9zdWJzY3Jp YmUiO3M6NDoiaGVscCI7czoyMzEyOiIJPGgxPlN1YnNjcmliZSB0byBjb21tZW50cyB2aWEg ZW1haWw8L2gxPgoKCTxoMj5JbnN0YWxsYXRpb248L2gyPgoKCTxwPkZvciBiYXNpYyBmdW5j dGlvbmFsaXR5IGFsbCB5b3UgbmVlZCB0byBkbyBpcyBlbmFibGUgdGhlIHBsdWdpbiBpbiB0 aGUgYWRtaW4tcGx1Z2luIGFyZWEuPC9wPgoKCTxoMj5CYXNpYyB1c2FnZTwvaDI+CgoJPHA+ V2hlbiB5b3Ugd3JpdGUgYSBjb21tZW50IGFuZCBzcGVjaWZ5IHlvdXIgZW1haWwgYWRkcmVz cyB5b3Ugd2lsbCBkaXJlY3RseSByZWNlaXZlIGFuIGVtYWlsIHdpdGggYSBjb25maXJtYXRp b24gYW5kIGFuIGludml0YXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBhcnRpY2xlIGNvbW1l bnRzLjwvcD4KCgk8cD5UaGlzIHN1YnNjcmlwdGlvbnMgaXMgZG9uZS9jb25maXJtZWQgYnkg Zm9sbG93aW5nIHRoZSBsaW5rIGluIHRoZSBlbWFpbC48L3A+CgoJPHA+QWZ0ZXIgdGhpcyB0 aGUgdXNlciB3aWxsIHJlY2VpdmUgYSBuZXcgbm90aWZpY2F0aW9uIHdoZW5ldmVyIGEgbmV3 IGNvbW1lbnQgaXMgcG9zdGVkLjwvcD4KCgk8cD5BbGwgdGhpcyBpcyBkb25lIGF1dG9tYXRp Y2FsbHkgd2l0aG91dCBpbnRlcnZlbnRpb24gZnJvbSB0aGUgc2l0ZSBvd25lciBvbmNlIHRo ZSBwbHVnaW4gaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkLjwvcD4KCgk8aDI+VW5zdWJzY3Jp YmU8L2gyPgoKCTxwPkVhY2ggbWFpbCB5b3UgcmVjZWl2ZSBjb250YWluIGFuIHVuc3Vic2Ny aWJlIGxpbmssIGZvbGxvdyBpdCBhbmQgeW91JiM4MjE3O3JlIGRvbmUuPC9wPgoKCTxwPlRo ZXNlIG1haWxzIGNhbiBiZSBjdXN0b21pemVkKHNlZSBiZWxvdykgYnV0IGl0IGlzIGhpZ2hs eSBlbmNvdXJhZ2VkIHRvIGF0IGxlYXN0IGtlZXAgdGhpcyBsaW5rLjwvcD4KCgk8aDI+TXVs dGlwbGUgY29tbWVudHM8L2gyPgoKCTxwPk9ubHkgdGhlIGZpcnN0IHRpbWUgeW91IHdyaXRl IGEgY29tbWVudCB5b3Ugd2lsbCBnZXQgdGhlIGdyZWV0aW5nIGFuZCBvZmZlciB0byBzdWJz Y3JpYmUuPGJyIC8+ClRoZSBlbWFpbCBpcyByZWNvcmRlZCB0byB0aGF0IHNwZWNpZmljIGFy dGljbGUgc28gaWYgeW91IHdyaXRlIGEgY29tbWVudCB0byBhbm90aGVyIGFydGljbGUgeW91 IHdpbGwgb25jZSBhZ2FpbiByZWNlaXZlIGEgY29uZmlybWF0aW9uLiBUaGlzIGlzIHdoZXRl ciBvciBub3QgeW91IGNob29zZSB0byBzdWJzY3JpYmUuPGJyIC8+CklmIHlvdSBjaG9vc2Ug bm90IHRvIHN1YnNjcmliZSB0aGVyZSB3aWxsIGJlIGEgcmVjb3JkIHN0YXRpbmcgdGhhdC4g SWYgeW91IGNob29zZSBhY3RpdmVseSB0byB1bnN1YnNjcmliZSB0aGUgcmVjb3JkIHdpbGwg YmUgcmVtb3ZlZC48L3A+CgoJPHA+SWYgeW91IG9yIHRoZSBhZG1pbmlzdHJhdG9yIGNob29z ZXMgdG8gdW5zdWJzY3JpYmUgYW55IGZ1dHVyZSBjb21tZW50cyB3aWxsIGFnYWluIGJlIHRy ZWF0ZWQgYXMgdGhlIGZpcnN0IG9uZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGdyZWV0aW5n IGVtYWlsLjwvcD4KCgk8aDI+SG93IHRvIGFkbWluaXN0cmF0ZTwvaDI+CgoJPHA+QXMgYW4g YWRtaW5pc3RyYXRvciwgdG9wIHRocmVlIGxldmVscyhjb21tZW50cyksIHlvdSBjYW4gc3Vi c2NyaWJlIGFuZCB1bnN1YnNjcmliZSBlbWFpbHMgdXNpbmcgdGhlICYjODIyMDtTdWJzY3Jp YnRpb25zJiM4MjIxOyB0YWIgdW5kZXIgJiM4MjIwO0NvbnRlbnQmIzgyMjE7IGluIHRoZSBh ZG1pbiBhcmVhLjwvcD4KCgk8aDI+SG93IHRvIGN1c3RvbWl6ZTwvaDI+CgoJPHA+WW91IGNh biBjdXN0b21pemUgdGhlIGVtYWlscyB0aGF0IGFyZSBzZW50IG9uIGZpcnN0IGNvbW1lbnQg YW5kIG9uIHN1YnNjcmlwdGlvbiBub3RpZmljYXRpb25zIGJ5IGVkaXQgdGhlICYjODIyMDtw aHFfc3Vic2NyaWJlX2NvbW1lbnQmIzgyMjE7IGFuZCAmIzgyMjA7cGhxX3N1YnNjcmliZV9u ZXcmIzgyMjE7IG1pc2MgRm9ybSB1bmRlciBQcmVzZW50YXRpb24uPC9wPgoKCTxwPkFmdGVy IGluc3RhbGxhdGlvbiB0aGVzZSB0ZW1wbGF0ZXMgYXJlIG5vdCB0byBiZSBmb3VuZCB0aGVy ZSB1bnRpbCB0aGUgZmlyc3QgbWFpbCBzIHNlbnQgZm9yIGVhY2ggdHlwZSBvZiBtZXNzYWdl LCB0aGVyZWZvcmUgeW91IG11c3Qgd3JpdGUgb25lIGNvbW1lbnQgc3Vic2NyaWJlIHRvIGl0 LCBhbmQgdGhlbiB3cml0ZSBhbm90aGVyIG9uZS48YnIgLz4KWW91IGNhbiBhbHNvIGNyZWF0 ZSB0aGUgZm9ybXMgeW91cnNlbGYgdXNpbmcgPHR4cDpwaHFfdW5zdWJzY3JpYmVfdXJsIC8+ IGFuZCA8dHhwOnBocV9zdWJzY3JpYmVfdXJsIC8+IHRvIGluc2VydCB0aGUgcmVzcGVjdGl2 ZSB1cmxzLjwvcD4KCiI7czo0OiJjb2RlIjtzOjEwMTQxOiIKcmVnaXN0ZXJfY2FsbGJhY2so J3BocV9zdWJzY3JpYmVfZm9ybScsJ2NvbW1lbnQuZm9ybScpOwpmdW5jdGlvbiBwaHFfc3Vi c2NyaWJlX2Zvcm0oKQp7CglnbG9iYWwgJHByZXRleHQ7CglyZXR1cm4gcGhxX3N1YnNjcmli ZV9mb3JtX2NvbW1vbigkcHJldGV4dFsnaWQnXSk7Cn0KCmZ1bmN0aW9uIHBocV9zdWJzY3Jp YmVfZm9ybV9jb21tb24oJGFydGljbGUpCnsKCS8vIGNyZWF0ZSB0aGUgdGFibGUgaWYgbm90 IGF2YWlsYWJsZSBhbHJlYWR5CglwaHFfc3Vic2NyaWJlX2NyZWF0ZXRhYmxlKCk7CgoJLy9T dWJzY3JpYmUvdW5zdWJzY3JpYmUgY29kZQoJJHN1Yl9jb2RlID0gZ3BzKCdjb2RlJyk7CgoJ Ly8gVW5zdWJzY3JpYmUgLyBkZWxldGUgcmVjb3JkCgkkdW5zdWIgPSBncHMoJ3Vuc3Vic2Ny aWJlJyk7CglpZigkdW5zdWIgPD4gJycpCgl7CgkJaWYoc2FmZV9kZWxldGUoInBocV9zdWJz Y3JpYmUiLAoJCQkiYGFydGljbGVgID0gIi5pbnR2YWwoJGFydGljbGUpLiIgIi4KCQkJIiBB TkQgYGVtYWlsYCA9ICciLm15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdW5zdWIpLiInICIu CgkJCSIgQU5EIGBjb2RlYCA9ICciLm15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkc3ViX2Nv ZGUpLiInIgoJCSkpCgkJCXBocV9zdWJzY3JpYmVfbWFpbCgkdW5zdWIsICJVbnN1YnNjcmli ZSBjb25maXJtYXRpb24iLCAiWW91IGhhdmUgbm93IGJlZW4gdW5zdWJzY3JpYmVkIGZyb20g Ii5wZXJtbGlua3VybF9pZCgkYXJ0aWNsZSkpOwoJfQoKCS8vIFN1YnNjcmliZS92ZXJpZnkg ZW1haWwKCSRzdWJfZW1haWwgPSBncHMoJ3N1YnNjcmliZScpOwoJaWYoJHN1Yl9lbWFpbCA8 PiAnJyAmJiAkc3ViX2NvZGUgPD4gJycpCgl7CgkJaWYoc2FmZV91cGRhdGUoInBocV9zdWJz Y3JpYmUiLCAnYHN1YnNjcmliZWRgID0gdHJ1ZSAnLAoJCQkiYGFydGljbGVgID0gJyIuaW50 dmFsKCRhcnRpY2xlKS4iJyAiLgoJCQkiIEFORCBgZW1haWxgID0gJyIubXlzcWxfcmVhbF9l c2NhcGVfc3RyaW5nKCRzdWJfZW1haWwpLiInICIuCgkJCSIgQU5EIGBjb2RlYCA9ICciLm15 c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkc3ViX2NvZGUpLiInIgoJCSkpCgkJCXBocV9zdWJz Y3JpYmVfbWFpbCgkc3ViX2VtYWlsLCAiU3Vic2NyaWJlIGNvbmZpcm1hdGlvbiIsICJZb3Ug aGF2ZSBub3cgYmVlbiBzdWJzY3JpYmVkIHRvICIucGVybWxpbmt1cmxfaWQoJGFydGljbGUp KTsKCX0KCglyZXR1cm47Cn0KCnJlZ2lzdGVyX2NhbGxiYWNrKCdwaHFfc3Vic2NyaWJlX3Nh dmUnLCdjb21tZW50LnNhdmUnKTsKZnVuY3Rpb24gcGhxX3N1YnNjcmliZV9zYXZlKCkKewoJ Z2xvYmFsICRzaXRlbmFtZTsKCgkkY29tbWVudCA9IGdldENvbW1lbnQoKTsKCSRhcnRpY2xl ID0gc2FmZV9yb3coIkF1dGhvcklELCBUaXRsZSIsICJ0ZXh0cGF0dGVybiIsICJJRCA9ICIu aW50dmFsKCRjb21tZW50WydwYXJlbnRpZCddKSk7CgoJLy9TZW5kIG5vdGlmaWNhdGlvbiB0 byBlYWNoIHN1YnNjcmliZXIKCSRzdWJzY3JpYmVycyA9IGFycmF5X3VuaXF1ZShzYWZlX3Jv d3MoJ2VtYWlsLCBjb2RlJywgJ3BocV9zdWJzY3JpYmUnLCAnYGFydGljbGVgID0gJy5pbnR2 YWwoJGNvbW1lbnRbJ3BhcmVudGlkJ10pLicgQU5EIGBzdWJzY3JpYmVkYCA9IHRydWUnKSk7 CglpZihpc19hcnJheSgkc3Vic2NyaWJlcnMpKQoJewoJCSRzdWJqZWN0ID0gJ1snLiRzaXRl bmFtZS4nXSBOZXcgY29tbWVudCBvbiBhcnRpY2xlICcuJGFydGljbGVbJ1RpdGxlJ107CgkJ JG1haWxmb3JtID0gcGhxX3N1YnNjcmliZV9nZXRtYWlsZm9ybSgnY29tbWVudCcpOwoKCQlm b3JlYWNoKCRzdWJzY3JpYmVycyBhcyAkc3Vic2NyaWJlcikKCQl7CgkJCSRib2R5ID0gcGFy c2UocGhxX3N1YnNjcmliZXJfcGFyc2UoJG1haWxmb3JtLCAkY29tbWVudFsncGFyZW50aWQn XSwgJHN1YnNjcmliZXJbJ2VtYWlsJ10sICRzdWJzY3JpYmVyWydjb2RlJ10pKTsKCQkJLy9E b24ndCB1c2UgcGhxX3N1YnNjcmliZV9tYWlsIGhlcmUgc2luY2UgdGhhdCB3b3VsZCByZXZl YWwgdGhlIElQIGFkZHJlc3Mgb2Ygb3RoZXIgY29tbWVudCBwb3N0ZXJzCgkJCW1haWwoJHN1 YnNjcmliZXJbJ2VtYWlsJ10sICRzdWJqZWN0LCAkYm9keSwgIkZyb206ICIuJHByZWZzWydz bXRwX2Zyb20nXSk7CgkJfTsKCX07CgoJLy9TZW5kIHN1YnNjcmliZSBpbnZpdGUgdG8gY29t bWVudCBhdXRob3IKCWlmKGVtYWlsY2hlY2soJGNvbW1lbnRbJ2VtYWlsJ10pID09IHRydWUp Cgl7CgkJJGNvZGUgPSBtdF9yYW5kKCk7CgkJJHJldCA9IHNhZmVfaW5zZXJ0KCdwaHFfc3Vi c2NyaWJlJywgJwoJCQlgYXJ0aWNsZWAgPSAnLmludHZhbCgkY29tbWVudFsncGFyZW50aWQn XSkuJywKCQkJYGVtYWlsYCA9IFwnJy5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbW1l bnRbJ2VtYWlsJ10pLidcJywKCQkJYHN1YnNjcmliZWRgID0gZmFsc2UsCgkJCWBjb2RlYCA9 IFwnJy5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvZGUpLidcJycKCQkpOwoKCQlpZigk cmV0KQoJCXsKCQkJJGFydGljbGUgPSBzYWZlX3JvdygiQXV0aG9ySUQsIFRpdGxlIiwgInRl eHRwYXR0ZXJuIiwgIklEID0gIi5pbnR2YWwoJGNvbW1lbnRbJ3BhcmVudGlkJ10pKTsKCQkJ JGF1dGhvciA9IHNhZmVfcm93KCJSZWFsTmFtZSwgZW1haWwiLCAidHhwX3VzZXJzIiwgIm5h bWUgPSAnIi5teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJGFydGljbGVbJyRBdXRob3JJRCdd KS4iJyIpOwoJCQkkc3ViamVjdCA9ICdbJy4kc2l0ZW5hbWUuJ10gU3Vic2NyaWJlIHRvIGFy dGljbGUgJy4kYXJ0aWNsZVsnVGl0bGUnXTsKCQkJJG1haWxmb3JtID0gcGhxX3N1YnNjcmli ZV9nZXRtYWlsZm9ybSgnbmV3Jyk7CgkJCSRib2R5ID0gcGFyc2UocGhxX3N1YnNjcmliZXJf cGFyc2UoJG1haWxmb3JtLCAkY29tbWVudFsncGFyZW50aWQnXSwgJGNvbW1lbnRbJ2VtYWls J10sICRjb2RlKSk7CgkJCXBocV9zdWJzY3JpYmVfbWFpbCgkY29tbWVudFsnZW1haWwnXSwg JHN1YmplY3QsICRib2R5KTsKCQl9Cgl9OwoKCn0KCmZ1bmN0aW9uIHBocV9zdWJzY3JpYmVf Z2V0bWFpbGZvcm0oJG5hbWUpCnsKCXN3aXRjaCgkbmFtZSkKCXsKCWNhc2UgJ2NvbW1lbnQn OgoJCSRmb3JtID0gIkhpIHRoZXJlLFxuXG4iLgoJCQkiVGhlcmUgaXMgYSBuZXcgY29tbWVu dCBvbiA8dHhwOnNpdGVuYW1lLz4gZm9yIHRoZSAgXCI8dHhwOnRpdGxlIC8+XCIuXG4iLgoJ CQkiWW91IGNhbiByZWFkIGl0IG9uIDx0eHA6cGVybWxpbmsgLz4uXG5cbiIuCgkJCSJVbnN1 YnNjcmliZSBieSBmb2xsb3dpbmcgdGhpcyB1cmw6IDx0eHA6cGhxX3Vuc3Vic2NyaWJlX3Vy bCAvPiI7CgkJYnJlYWs7CgljYXNlICduZXcnOgoJCSRmb3JtID0gIkZvbGxvdyB0aGlzIGxp bmsgdG8gc3Vic2NyaWJlIHRvIHRoZSBhcnRpY2xlIFwiPHR4cDp0aXRsZSAvPlwiXG4iLgoJ CQkJIjx0eHA6cGhxX3N1YnNjcmliZV91cmwgLz5cblxuIi4KCQkJCSJZb3UgY2FuIHJlYWQg dGhlIGFydGljbGUgb24gPHR4cDpwZXJtbGluayAvPi4iOwoJCWJyZWFrOwoJZGVmYXVsdDoK CQlyZXR1cm4gJyc7Cgl9CgoJJGZvcm1fcm93ID0gc2FmZV9yb3coIkZvcm0iLCAidHhwX2Zv cm0iLCAibmFtZT0ncGhxX3N1YnNjcmliZV8kbmFtZScgbGltaXQgMSIpOwoJaWYoISRmb3Jt X3JvdykKCQlzYWZlX2luc2VydCgidHhwX2Zvcm0iLCAibmFtZT0ncGhxX3N1YnNjcmliZV8k bmFtZScsIHR5cGU9J21pc2MnLCBGb3JtPSciLm15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygk Zm9ybSkuIiciKTsKCglpZigkZm9ybV9yb3cpCgkJcmV0dXJuICRmb3JtX3Jvd1snRm9ybSdd OwoJZWxzZQoJCXJldHVybiAkZm9ybTsKfQoKZnVuY3Rpb24gcGhxX3N1YnNjcmliZV9tYWls KCRlbWFpbCwgJHN1YmplY3QsICRib2R5KQp7CglnbG9iYWwgJHByZWZzOwoJcmV0dXJuIG1h aWwoJGVtYWlsLCAkc3ViamVjdCwgJGJvZHksCgkJIkZyb206ICIuJHByZWZzWydzbXRwX2Zy b20nXS4iXG4iLgoJCSdYLVJlbW90ZS1JUDogJy4kX1NFUlZFUlsnUkVNT1RFX0FERFInXQoJ KTsKfQoKZnVuY3Rpb24gcGhxX3N1YnNjcmliZV9jcmVhdGV0YWJsZSgpewoKCSRzcWwgPSAn U0VMRUNUICogRlJPTSBgJy5zYWZlX3BmeCgncGhxX3N1YnNjcmliZScpLidgIExJTUlUIDEn OwoJaWYoc2FmZV9xdWVyeSgkc3FsKSA9PSBmYWxzZSl7CgoJCXNhZmVfcXVlcnkoJ1JFTkFN RSBUQUJMRSBgJy5zYWZlX3BmeCgncGhxX3N1YnNjcmliZScpLidgIFRPIGAnLnNhZmVfcGZ4 KCdwaHFfc3Vic2NyaWJlJykuJ2AgOycpOwoJCXNhZmVfcXVlcnkoJ0NSRUFURSBUQUJMRSBJ RiBOT1QgRVhJU1RTIGAnLnNhZmVfcGZ4KCdwaHFfc3Vic2NyaWJlJykuJ2AgKAoJCQkJCWBh cnRpY2xlYCBpbnQoMTEpIHVuc2lnbmVkIE5PVCBOVUxMLAoJCQkJCWBlbWFpbGAgdmFyY2hh cigxMjcpIE5PVCBOVUxMLAoJCQkJCWBzdWJzY3JpYmVkYCB0aW55aW50KDEpIE5PVCBOVUxM LAoJCQkJCWBjb2RlYCB2YXJjaGFyKDEyNykgTk9UIE5VTEwsCgkJCQkJVU5JUVVFIEtFWSBg YXJ0aWNsZWAgKGBhcnRpY2xlYCxgZW1haWxgKQoJCQkJCSk7JwoJCSk7CgoJfTsKCXJldHVy bjsKfQoKLy8gUmVwbGFjZSBzb21lIHRhZ3Mgd2l0aCB1bi9zdWJzY3JpYmUgbGlua3MKLy8g VGhpcyBjYW5ub3QgYmUgZG9uZSB1c2luZyB0aGUgdGV4dHBhdHRlcm4gcGFyc2VyIGJlY2F1 c2Ugb2YgdGhlCi8vIGV4dHJhIHBhcmFtZXRlcnMgdGhhdCB2YXJpZXMgZm9yIGVhY2ggcmVj aXBpZW50LgpmdW5jdGlvbiBwaHFfc3Vic2NyaWJlcl9wYXJzZSgkY29udGVudCwgJGFydGlj bGUsICRlbWFpbCwgJGNvZGUpCnsKCSR1cmwgPSBwZXJtbGlua3VybF9pZCgkYXJ0aWNsZSk7 CgkkdXJsIC49IChzdHJzdHIoJHVybCwgJz8nKSkgPyAiJiIgOiAiPyI7CgoJJHN1Yl91cmwJ CT0gJHVybC4ic3Vic2NyaWJlPSIudXJsZW5jb2RlKCRlbWFpbCkuJyZjb2RlPScudXJsZW5j b2RlKCRjb2RlKTsKCSR1bnN1Yl91cmwJPSAkdXJsLiJ1bnN1YnNjcmliZT0iLnVybGVuY29k ZSgkZW1haWwpLicmY29kZT0nLnVybGVuY29kZSgkY29kZSk7CgoJJGNvbnRlbnQgPSBlcmVn X3JlcGxhY2UoIjx0eHA6cGhxX3N1YnNjcmliZV91cmwgKi8+IiwgJHN1Yl91cmwsICRjb250 ZW50KTsKCSRjb250ZW50ID0gZXJlZ19yZXBsYWNlKCI8dHhwOnBocV91bnN1YnNjcmliZV91 cmwgKi8+IiwgJHVuc3ViX3VybCwgJGNvbnRlbnQpOwoKCXJldHVybiAkY29udGVudDsKfQoK aWYoIWZ1bmN0aW9uX2V4aXN0cygnZW1haWxjaGVjaycpKXsKCWZ1bmN0aW9uIGVtYWlsY2hl Y2soJGVhZGRyPSIiKXsKCQkvKioKCQkgKiBAdmFyIHN0cmluZyBSZWdleHAgZj9yIG1hdGNo aW5nIGF1ZiB2YWxpZGUgRW1haWxzeW50YXgKCQkgKi8KCQkkcGF0dGVybiA9ICIvXihbYS16 QS1aMC05XSkrKFtcLmEtekEtWjAtOV8tXSkqQChbYS16QS1aMC05Xy1dKSsoXC5bYS16QS1a MC05Xy1dKykrLyI7CgkJaWYgKGVtcHR5KCRlYWRkcikpIHsKCQkJcmV0dXJuIGZhbHNlOwoJ CX0gZWxzZWlmICghcHJlZ19tYXRjaCgkcGF0dGVybiwgJGVhZGRyKSkgewoJCQlyZXR1cm4g ZmFsc2U7CgkJfSBlbHNlIHsKCQkJJGxhZGRyID0gIiI7CgkJCSRsYWRkciA9ICRlYWRkcjsK CQkJJGxhZGRyID0gcHJlZ19yZXBsYWNlKCcvXi4qPC8nLCcnLCAkbGFkZHIpOwoJCQkkbGFk ZHIgPSBwcmVnX3JlcGxhY2UoJy8+LiokLycsJycsJGxhZGRyKTsKCQkJaWYgKHByZWdfbWF0 Y2goJy9eXEAuKjovJywkbGFkZHIpKXsKCQkJCWxpc3QoJGRvbWFpbiwkYWRkcl9zcGVjKSA9 IHByZWdfc3BsaXQoJy86LycsJGxhZGRyKTsKCQkJCSRkb21haW4gPSBwcmVnX3JlcGxhY2Uo Jy9eXEAvJywnJywkZG9tYWluKTsKCQkJCWlmICghaXNfZG9tYWluKCRkb21haW4pKSB7cmV0 dXJuIGZhbHNlO30KCQkJCSRsYWRkciA9ICRhZGRyX3NwZWM7CgkJCX07CgkJCXJldHVybihp c19hZGRyX3NwZWMoJGxhZGRyKSk7CgkJfTsKCX0KCS8qKiNAKwoJICogQGFjY2VzcyBwcml2 YXRlCgkgKiBAc2luY2UgMS4wLjEgKDI2LjAzLjIwMDQpCgkgKiBAdmVyc2lvbiAxLjAuMQoJ ICovCglmdW5jdGlvbiBpc19hZGRyX3NwZWMgKCRlYWRkciA9ICIiKXsKCQlsaXN0KCRsb2Nh bF9wYXJ0LCRkb21haW4pID0gcHJlZ19zcGxpdCgnL1xALycsJGVhZGRyKTsKCQlpZiAoIWlz X2xvY2FsX3BhcnQoJGxvY2FsX3BhcnQpIHx8ICFpc19kb21haW4oJGRvbWFpbikpewoJCQly ZXR1cm4gZmFsc2U7CgkJfTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWZ1bmN0aW9uIGlzX2xvY2Fs X3BhcnQgKCRsb2NhbF9wYXJ0ID0gIiIpewoJCWlmIChlbXB0eSgkbG9jYWxfcGFydCkpIHsK CQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJJGJpdF9hcnJheSA9IHByZWdfc3BsaXQoJy9cLi8n LCRsb2NhbF9wYXJ0KTsKCQl3aGlsZSAobGlzdCgsJGJpdCkgPSBlYWNoKCRiaXRfYXJyYXkp KXsKCQkJaWYgKCFpc193b3JkKCRiaXQpKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX07CgkJ fTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWZ1bmN0aW9uIGlzX3dvcmQoJHdvcmQgPSAiIil7CgkJ aWYgKHByZWdfbWF0Y2goJy9eIi4qIiQvaScsJHdvcmQpKXsKCQkJcmV0dXJuKGlzX3F1b3Rl ZF9zdHJpbmcoJHdvcmQpKTsKCQl9OwoJCXJldHVybihpc19hdG9tKCR3b3JkKSk7Cgl9Cglm dW5jdGlvbiBpc19xdW90ZWRfc3RyaW5nKCR3b3JkID0gIiIpewoJCSR3b3JkID0gcHJlZ19y ZXBsYWNlKCcvXiIvJywnJywkd29yZCk7CgkJJHdvcmQgPSBwcmVnX3JlcGxhY2UoJy8iJC8n LCcnLCR3b3JkKTsKCQkkd29yZCA9IHByZWdfcmVwbGFjZSgnL1xcKy8nLCcnLCR3b3JkKTsK CQlpZiAocHJlZ19tYXRjaCgnL1wiXFxcci8nLCR3b3JkKSl7CgkJCXJldHVybiBmYWxzZTsK CQl9OwoJCXJldHVybiB0cnVlOwoJfQoJZnVuY3Rpb24gaXNfYXRvbSgkYXRvbSA9ICIiKXsK CQlpZiAoKHByZWdfbWF0Y2goJy9bXChcKVw8XD5cQFwsXDtcOlxcXCJcLlxbXF1dLycsJGF0 b20pKSB8fCAocHJlZ19tYXRjaCgnL1wwNDAvJywkYXRvbSkpIHx8IChwcmVnX21hdGNoKCcv W1x4MDAtXHgxRl0vJywkYXRvbSkpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJCXJldHVy biB0cnVlOwoJfQoJZnVuY3Rpb24gaXNfZG9tYWluKCRkb21haW4gPSAiIil7CgkJaWYgKGVt cHR5KCRkb21haW4pKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJCWlmICghcHJlZ19tYXRj aCgnL1wuLycsJGRvbWFpbikpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX07CgkJJGRiaXRfYXJy YXkgPSBwcmVnX3NwbGl0KCcvLi8nLCRkb21haW4pOwoJCXdoaWxlIChsaXN0KCwkZGJpdCkg PSBlYWNoKCRkYml0X2FycmF5KSl7CgkJCWlmICghaXNfc3ViX2RvbWFpbigkZGJpdCkpIHsK CQkJCXJldHVybiBmYWxzZTsKCQkJfTsKCQl9OwoJCXJldHVybiB0cnVlOwoJfQoJZnVuY3Rp b24gaXNfc3ViX2RvbWFpbigkc3ViZCA9ICIiKXsKCQlpZiAocHJlZ19tYXRjaCgnL15cWy4q XF0kLycsJHN1YmQpKXsKCQkJcmV0dXJuKGlzX2RvbWFpbl9saXRlcmFsKCRzdWJkKSk7CgkJ fTsKCQlyZXR1cm4oaXNfYXRvbSgkc3ViZCkpOwoJfQoJZnVuY3Rpb24gaXNfZG9tYWluX2xp dGVyYWwoJGRvbSA9ICIiKXsKCQkkZG9tID0gcHJlZ19yZXBsYWNlKCcvXFwrLycsJycsJGRv bSk7CgkJaWYgKHByZWdfbWF0Y2goJy9bXFtcXVxcXHJdLycsJGRvbSkpewoJCQlyZXR1cm4g ZmFsc2U7CgkJfTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCS8qKiNALSovCgp9CgovL1N1YnNjcmli ZSB0YWIgdW5kZXIgQ29udGVudCBpbiB0aGUgYWRtaW4gYXJlYQppZiAoQHR4cGludGVyZmFj ZSA9PSAnYWRtaW4nKQp7CglnbG9iYWwgJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudDsKCSRw aHFfc3Vic2NyaWJlX2FkbWluZXZlbnQgPSAnc3Vic2NyaWJlX2FkbWluJzsKCSRteXRhYiA9 ICdTdWJzY3JpYnRpb25zJzsKCgkvLyBTZXQgdGhlIHByaXZpbGVnZSBsZXZlbHMgZm9yIG91 ciBuZXcgZXZlbnQKCWFkZF9wcml2cygkcGhxX3N1YnNjcmliZV9hZG1pbmV2ZW50LCAnMSwy LDMnKTsKCgkvLyBBZGQgYSBuZXcgdGFiIHVuZGVyICdleHRlbnNpb25zJyBhc3NvY2lhdGVk IHdpdGggb3VyIGV2ZW50CglyZWdpc3Rlcl90YWIoImNvbnRlbnQiLCAkcGhxX3N1YnNjcmli ZV9hZG1pbmV2ZW50LCAkbXl0YWIpOwoKCS8vICd6ZW1fYWRtaW5fdGVzdCcgd2lsbCBiZSBj YWxsZWQgdG8gaGFuZGxlIHRoZSBuZXcgZXZlbnQKCXJlZ2lzdGVyX2NhbGxiYWNrKCJwaHFf c3Vic2NyaWJlX2FkbWluIiwgJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudCk7CgoJZnVuY3Rp b24gcGhxX3N1YnNjcmliZV9hZG1pbl9zdWJfdXJsKCRhcnRpY2xlLCAkZW1haWwsICRjb2Rl KQoJewoJCWdsb2JhbCAkcGhxX3N1YnNjcmliZV9hZG1pbmV2ZW50OwoJCXJldHVybgoJCQkn P2V2ZW50PScuJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudC4KCQkJJyZhcnRpY2xlPScudXJs ZW5jb2RlKCRhcnRpY2xlKS4KCQkJJyZzdWJzY3JpYmU9Jy51cmxlbmNvZGUoJGVtYWlsKS4K CQkJJyZjb2RlPScudXJsZW5jb2RlKCRjb2RlKTsKCX0KCglmdW5jdGlvbiBwaHFfc3Vic2Ny aWJlX2FkbWluX3Vuc3ViX3VybCgkYXJ0aWNsZSwgJGVtYWlsLCAkY29kZSkKCXsKCQlnbG9i YWwgJHBocV9zdWJzY3JpYmVfYWRtaW5ldmVudDsKCQlyZXR1cm4KCQkJJz9ldmVudD0nLiRw aHFfc3Vic2NyaWJlX2FkbWluZXZlbnQuCgkJCScmYXJ0aWNsZT0nLnVybGVuY29kZSgkYXJ0 aWNsZSkuCgkJCScmdW5zdWJzY3JpYmU9Jy51cmxlbmNvZGUoJGVtYWlsKS4KCQkJJyZjb2Rl PScudXJsZW5jb2RlKCRjb2RlKTsKCX0KCglmdW5jdGlvbiBwaHFfc3Vic2NyaWJlX2FkbWlu KCRldmVudCwgJHN0ZXApCgl7CgkJLy8gV2UgbmVlZCB0aGUgcGVybWxpbmt1cmxfaWQoKSBm dW5jdGlvbgoJCUBpbmNsdWRlX29uY2UoJ3B1Ymxpc2gvdGFnaGFuZGxlcnMucGhwJyk7CgoJ CS8vRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbmVlZGVkIG9uIHRoZSB0b3AgcGFnZSBvZiB0 aGUgYWRtaW4gdGFiLgoJCXBhZ2V0b3AoIkNvbW1lbnQgU3Vic2NyaXB0aW9ucyIsICIiKTsK CgkJcGhxX3N1YnNjcmliZV9mb3JtX2NvbW1vbihncHMoJ2FydGljbGUnKSk7CgoJCSRzdWJz Y3JpYmVycyA9IHNhZmVfcm93cygnYXJ0aWNsZSwgZW1haWwsIGNvZGUnLCAncGhxX3N1YnNj cmliZScsICdgc3Vic2NyaWJlZGAgPSB0cnVlJyk7CgkJZWNobyAnPGgxPlN1YnNjcmliZWQ8 L2gxPjx0YWJsZT48dHI+PHRoPkFydGljbGU8L3RoPjx0aD5FbWFpbDwvdGg+PHRoPlVuc3Vi c2NyaWJlL1JlbW92ZTwvdGg+PC90cj4nOwoJCWZvcmVhY2goJHN1YnNjcmliZXJzIGFzICRz dWIpCgkJCWVjaG8gJzx0cj4KCQkJCTx0ZD4nLmh0bWxlbnRpdGllcygkc3ViWydhcnRpY2xl J10pLic8L3RkPgoJCQkJPHRkPicuaHRtbGVudGl0aWVzKCRzdWJbJ2VtYWlsJ10pLic8L3Rk PgoJCQkJPHRkPjxhIGhyZWY9IicucGhxX3N1YnNjcmliZV9hZG1pbl91bnN1Yl91cmwoJHN1 YlsnYXJ0aWNsZSddLCAkc3ViWydlbWFpbCddLCAkc3ViWydjb2RlJ10pLiciPlVuc3Vic2Ny aWJlPC9hPjwvdGQ+CgkJCQk8L3RyPic7CgkJZWNobyAnPC90YWJsZT4nOwoKCQkkc3Vic2Ny aWJlcnMgPSBzYWZlX3Jvd3MoJ2FydGljbGUsIGVtYWlsLCBjb2RlJywgJ3BocV9zdWJzY3Jp YmUnLCAnYHN1YnNjcmliZWRgID0gZmFsc2UnKTsKCQllY2hvICc8aDE+Tm90IGNvbmZpcm1l ZCBzdWJzY3JpcHRpb25zPC9oMT48dGFibGU+PHRyPjx0aD5BcnRpY2xlPC90aD48dGg+RW1h aWw8L3RoPjx0aD5TdWJzY3JpYmU8L3RoPjx0aD5SZW1vdmU8L3RoPjwvdHI+JzsKCQlmb3Jl YWNoKCRzdWJzY3JpYmVycyBhcyAkc3ViKQoJCQllY2hvICc8dHI+CgkJCQk8dGQ+Jy5odG1s ZW50aXRpZXMoJHN1YlsnYXJ0aWNsZSddKS4nPC90ZD4KCQkJCTx0ZD4nLmh0bWxlbnRpdGll cygkc3ViWydlbWFpbCddKS4nPC90ZD4KCQkJCTx0ZD48YSBocmVmPSInLnBocV9zdWJzY3Jp YmVfYWRtaW5fc3ViX3VybCgkc3ViWydhcnRpY2xlJ10sICRzdWJbJ2VtYWlsJ10sICRzdWJb J2NvZGUnXSkuJyI+U3Vic2NyaWJlPC9hPjwvdGQ+CgkJCQk8dGQ+PGEgaHJlZj0iJy5waHFf c3Vic2NyaWJlX2FkbWluX3Vuc3ViX3VybCgkc3ViWydhcnRpY2xlJ10sICRzdWJbJ2VtYWls J10sICRzdWJbJ2NvZGUnXSkuJyI+VW5zdWJzY3JpYmU8L2E+PC90ZD4KCQkJCTwvdHI+JzsK CQllY2hvICc8L3RhYmxlPic7Cgl9Cn0KIjtzOjM6Im1kNSI7czozMjoiYzQxNWUyMWViNWMx NGNlYTFkZmRhNzY3ZjFmMWUxYTUiO30=