# gg_linkxfn 1.0 # Add XFN supported links # Girish Gangadharan # http://morethan2cents.com # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTA6ImdnX2xpbmt4Zm4iO3M6NjoiYXV0aG9yIjtzOjE4OiJHaXJpc2ggR2FuZ2FkaGFyYW4iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly9tb3JldGhhbjJjZW50cy5jb20iO3M6NzoidmVyc2lvbiI7czozOiIxLjAiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjIzOiJBZGQgWEZOIHN1cHBvcnRlZCBsaW5rcyI7czo0OiJoZWxwIjtzOjA6IiI7czo0OiJjb2RlIjtzOjExMzEzOiIJLy8gQWRkIGEgbmV3IHRhYiB0byB0aGUgQ29udGVudCBhcmVhLg0KCS8vICJhZGQgeGZuIGxpbmtzIiBpcyB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBldmVudDsgImxpbmt4Zm4iIGlzIHRoZSBkaXNwbGF5ZWQgdGl0bGUNCglpZiAoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7DQoJCS8vIEFkZCBhIG5ldyB0YWIgdW5kZXIgJ2NvbnRlbnQnIGNhbGxlZCAnbGlua3hmbicsIGZvciB0aGUgJ2FkZCB4Zm4gbGluaycgZXZlbnQNCgkJcmVnaXN0ZXJfdGFiKCJjb250ZW50IiwgImxpbmt4Zm4iLCAibGlua3hmbiIpOw0KDQoJCS8vICdsaW5reGZuJyB3aWxsIGJlIGNhbGxlZCB0byBoYW5kbGUgdGhlICdhZGQgeGZuIGxpbmsnIGV2ZW50DQoJCXJlZ2lzdGVyX2NhbGxiYWNrKCJsaW5reGZuIiwgImxpbmt4Zm4iKTsNCgl9DQoNCglmdW5jdGlvbiBsaW5reGZuKCRldmVudCwgJHN0ZXApIHsNCiAgICAgICAgJHF1ZXJ5ID0gbXlzcWxfcXVlcnkoIlNIT1cgQ09MVU1OUyBGUk9NICIuUEZYLiJ0eHBfbGluayBMSUtFICd4Zm4nIikgb3IgZGllKG15c3FsX2Vycm9yKCkpOw0KDQogICAgICAgIGlmIChteXNxbF9udW1fcm93cygkcXVlcnkpID09IDApIHsNCiAgICAgICAgICAgJGFkZHF1ZXJ5ID0gbXlzcWxfcXVlcnkoIkFMVEVSIFRBQkxFICIuUEZYLiJ0eHBfbGluayBBREQgeGZuIFZBUkNIQVIoMjU1KSBOVUxMIikgICAgICBvciBkaWUobXlzcWxfZXJyb3IoKSk7DQogICAgICAgIH0NCiAgICAgIA0KICAgICAgICBnbG9iYWwgJHZhcnM7DQoJJHZhcnMgPSBhcnJheSgnY2F0ZWdvcnknLCAndXJsJywgJ2xpbmtuYW1lJywgJ2xpbmtzb3J0JywgJ2Rlc2NyaXB0aW9uJywgJ3hmbicsICdpZCcpOw0KICAgICAgICBpZiAoJGV2ZW50ID09ICdsaW5reGZuJykgewkNCgkJcmVxdWlyZV9wcml2cygnbGlua3hmbicpOwkJCQ0KCQlpZighJHN0ZXAgb3IgIWZ1bmN0aW9uX2V4aXN0cygkc3RlcCkgb3IgIWluX2FycmF5KCRzdGVwLCBhcnJheSgnbGlua3hmbl9saXN0JywnbGlua3hmbl9lZGl0JywnbGlua3hmbl9wb3N0JywnbGlua3hmbl9zYXZlJywnbGlua3hmbl9kZWxldGUnLCdsaW5reGZuX2NoYW5nZV9wYWdlYnknLCdsaW5reGZuX211bHRpX2VkaXQnKSkpew0KCQkJbGlua3hmbl9lZGl0KCk7DQoJCX0gZWxzZSAkc3RlcCgpOw0KCX0NCn0NCiAgICAgIAkNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBsaW5reGZuX2xpc3QoJG1lc3NhZ2U9IiIpIA0KCXsNCgkJZ2xvYmFsICRzdGVwLCRsaW5reGZuX2xpc3RfcGFnZWJ5Ow0KCQkNCgkJZXh0cmFjdChnZXRfcHJlZnMoKSk7DQoJCQ0KCQkkcGFnZSA9IGdwcygncGFnZScpOw0KICAgICAgICAgICAgICAgIGVjaG8gJHBhZ2U7DQoJCSR0b3RhbCA9IGdldENvdW50KCd0eHBfbGluaycsIjEiKTsgIA0KCQkkbGltaXQgPSBtYXgoQCRsaW5rX2xpc3RfcGFnZWJ5LCAyNSk7DQoJCSRudW1QYWdlcyA9IGNlaWwoJHRvdGFsLyRsaW1pdCk7ICANCgkJJHBhZ2UgPSAoISRwYWdlKSA/IDEgOiAkcGFnZTsNCgkJJG9mZnNldCA9ICgkcGFnZSAtIDEpICogJGxpbWl0Ow0KDQoJCSRzb3J0ID0gZ3BzKCdzb3J0Jyk7DQoJCSRkaXIgPSBncHMoJ2RpcicpOw0KDQoJCSRzb3J0ID0gKCRzb3J0KSA/ICRzb3J0IDogJ2xpbmtzb3J0JzsNCgkJJGRpciA9ICgkZGlyKSA/ICRkaXIgOiAnYXNjJzsNCgkJaWYgKCRkaXIgPT0gImRlc2MiKSB7ICRkaXIgPSAiYXNjIjsgfSBlbHNlIHsgJGRpciA9ICJkZXNjIjsgfQ0KDQoJCSRuYXZbXSA9ICgkcGFnZSA+IDEpDQoJCT8JUHJldk5leHRMaW5rKCJsaW5reGZuIiwkcGFnZS0xLGdUeHQoJ3ByZXYnKSwncHJldicpIDogJyc7DQoNCgkJJG5hdltdID0gc3Auc21hbGwoJHBhZ2UuICcvJy4kbnVtUGFnZXMpLnNwOw0KDQoJCSRuYXZbXSA9ICgkcGFnZSAhPSAkbnVtUGFnZXMpIA0KCQk/CVByZXZOZXh0TGluaygibGlua3hmbiIsJHBhZ2UrMSxnVHh0KCduZXh0JyksJ25leHQnKSA6ICcnOw0KDQoJCSRycyA9IHNhZmVfcm93c19zdGFydCgNCgkJCSIqIiwgDQoJCQkidHhwX2xpbmsiLCANCgkJCSIxIG9yZGVyIGJ5ICRzb3J0ICRkaXIgbGltaXQgJG9mZnNldCwgJGxpbWl0Ig0KCQkpOw0KDQoNCgkJaWYgKCRycykgew0KCQkJZWNobyAnPGZvcm0gYWN0aW9uPSJpbmRleC5waHAiIG1ldGhvZD0icG9zdCIgbmFtZT0ibG9uZ2Zvcm0iIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLA0KCQkJc3RhcnRUYWJsZSgnbGlzdCcpLA0KDQoJCQl0cigNCgkJCQljb2x1bW5faGVhZCgnbGlua19uYW1lJywnbGlua3NvcnQnLCdsaW5reGZuJywxLCRkaXIpLg0KCQkJCWNvbHVtbl9oZWFkKCdkZXNjcmlwdGlvbicsJ2Rlc2NyaXB0aW9uJywnbGlua3hmbicsMSwkZGlyKS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX2hlYWQoJ3hmbicsJ3hmbicsJ2xpbmt4Zm4nLDEsJGRpcikuDQoJCQkJY29sdW1uX2hlYWQoJ2xpbmtfY2F0ZWdvcnknLCdjYXRlZ29yeScsJ2xpbmt4Zm4nLDEsJGRpcikuDQoJCQkJdGQoKQ0KCQkJCSk7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQlleHRyYWN0KCRhKTsJCQkJDQoJCQkJJGVsaW5rID0gZUxpbmsoJ2xpbmt4Zm4nLCdsaW5reGZuX2VkaXQnLCdpZCcsJGlkLCRsaW5rbmFtZSk7DQoJCQkJJGNib3ggPSBmSW5wdXQoJ2NoZWNrYm94Jywnc2VsZWN0ZWRbXScsJGlkKTsNCgkJCQkJDQoJCQkJZWNobyB0cigNCgkJCQkJCXRkKCRlbGluaykuDQoJCQkJCQl0ZCgkZGVzY3JpcHRpb24pLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQoJHhmbikuDQoJCQkJCQl0ZCgkY2F0ZWdvcnkpLg0KCQkJCQkJdGQoJGNib3gpDQoJCQkJCSk7DQoJCQl9DQoJCQllY2hvIA0KCQkJdHIoDQoJCQkJdGRhKHNlbGVjdF9idXR0b25zKCkubGlua3hmbl9tdWx0aWVkaXRfZm9ybSgpLCAnIGNvbHNwYW49IjQiIHN0eWxlPSJib3JkZXI6MHB4O3RleHQtYWxpZ246cmlnaHQiJykNCgkJCSk7DQoJCQllY2hvIGVuZFRhYmxlKCksJzwvZm9ybT4nOw0KCQkJZWNobyBwYWdlYnlfZm9ybSgnbGluaycsJGxpbmt4Zm5fbGlzdF9wYWdlYnkpOw0KCQkJZWNobyBncmFmKGpvaW4oJycsJG5hdiksJyBhbGlnbj0iY2VudGVyIicpOw0KCQl9DQoJfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gbGlua3hmbl9lZGl0KCRtZXNzYWdlPSIiKQ0KCXsNCgkJZ2xvYmFsICR2YXJzLCRzdGVwOw0KCQlleHRyYWN0KGdwc2EoJHZhcnMpKTsNCg0KCQlwYWdldG9wKGdUeHQoJ2VkaXRfbGlua3MnLCRtZXNzYWdlKSk7DQoNCgkJJGlkID0gZ3BzKCdpZCcpOw0KCQlpZigkaWQgJiYgJHN0ZXA9PSdsaW5reGZuX2VkaXQnKSB7DQoJCQlleHRyYWN0KHNhZmVfcm93KCIqIiwgInR4cF9saW5rIiwgImlkID0gJGlkIikpOw0KCQl9DQoJCQ0KCQlpZiAoJHN0ZXA9PSdsaW5reGZuX3NhdmUnIG9yICRzdGVwPT0nbGlua3hmbl9wb3N0Jyl7DQoJCQlmb3JlYWNoKCR2YXJzIGFzICR2YXIpIHsNCgkJCQkkJHZhciA9ICcnOw0KCQkJfQ0KCQl9DQogICAgICAgICAgICAgICAgJHhmbj0gJzx0ZXh0YXJlYSBuYW1lPSJ4Zm4iIGNvbHM9IjQwIiByb3dzPSIzIiB0YWJpbmRleD0iNSI+Jy4NCgkJCSR4Zm4uJzwvdGV4dGFyZWE+JzsNCgkJJHRleHRhcmVhID0gJzx0ZXh0YXJlYSBuYW1lPSJkZXNjcmlwdGlvbiIgY29scz0iNDAiIHJvd3M9IjciIHRhYmluZGV4PSI0Ij4nLg0KCQkJJGRlc2NyaXB0aW9uLic8L3RleHRhcmVhPic7DQoJCSRzZWxlY3RzID0gbGlua3hmbmNhdGVnb3J5X3BvcHVwKCRjYXRlZ29yeSk7DQoJCSRlZGl0bGluayA9ICcgWycuZUxpbmsoJ2NhdGVnb3J5JywnbGlzdCcsJycsJycsZ1R4dCgnZWRpdCcpKS4nXSc7DQoNCgkJJG91dCA9IA0KCQkJc3RhcnRUYWJsZSggJ2VkaXQnICkgLg0KCQkJDQoJCQkJdHIoIGZMYWJlbENlbGwoICd0aXRsZScgKSAuIGZJbnB1dENlbGwoICdsaW5rbmFtZScsICRsaW5rbmFtZSwgMSwgMzAgKSkgLg0KCQkJCQkNCgkJCQl0ciggZkxhYmVsQ2VsbCggJ3NvcnRfdmFsdWUnKSAuZklucHV0Q2VsbCggJ2xpbmtzb3J0JywgJGxpbmtzb3J0LCAyLCAxNSApKSAuDQoJCQkJCQ0KCQkJCXRyKCBmTGFiZWxDZWxsKCAndXJsJywndXJsJykgLiBmSW5wdXRDZWxsKCAndXJsJywgJHVybCwgMywgMzApICkgLg0KCQkJCQkNCgkJCQl0ciggZkxhYmVsQ2VsbCggJ2xpbmtfY2F0ZWdvcnknLCAnY2F0ZWdvcnknICkgLiB0ZCggJHNlbGVjdHMgLiAkZWRpdGxpbmsgKSApIC4NCgkJCQkJDQoJCQkJdHIoIGZMYWJlbENlbGwoICdkZXNjcmlwdGlvbicsICdsaW5rX2Rlc2NyaXB0aW9uJyApIC4gdGRhKCAkdGV4dGFyZWEsICcgdmFsaWduPSJ0b3AiJyApICkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnRnJpZW5kc2hpcCcpIC4gdGQoZklucHV0KCdyYWRpbycsJ2ZyaWVuZHNoaXAnLCdjb250YWN0JykgLiAnIENvbnRhY3QgJyAuIGZJbnB1dCgncmFkaW8nLCdmcmllbmRzaGlwJywnYWNxdWFpbnRhbmNlJykuICcgQWNxdWFpbnRhbmNlICcgLiBmSW5wdXQoJ3JhZGlvJywnZnJpZW5kc2hpcCcsJ2ZyaWVuZCcpLiAnIEZyaWVuZCAnIC4gZklucHV0KCdyYWRpbycsJ2ZyaWVuZHNoaXAnLCdub25lJykuICcgTm9uZSAnKSkgLg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIoIGZMYWJlbENlbGwoICdQaHlzaWNhbCcpIC4gdGQoZklucHV0KCdjaGVja2JveCcsJ21ldCcsJ21ldCcpIC4gJyBNZXQgJykpIC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ciggZkxhYmVsQ2VsbCggJ1Byb2Zlc3Npb25hbCcpIC4gdGQoZklucHV0KCdjaGVja2JveCcsJ2NvLXdvcmtlcicsJ2NvLXdvcmtlcicpIC4gJyBDby13b3JrZXIgJyAuIGZJbnB1dCgnY2hlY2tib3gnLCdjb2xsZWFndWUnLCdjb2xsZWFndWUnKSAuICcgQ29sbGVhZ3VlJykpIC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ciggZkxhYmVsQ2VsbCggJ0dlb2dyYXBoaWNhbCcpIC4gdGQoZklucHV0KCdyYWRpbycsJ2dlb2dyYXBoaWNhbCcsJ2NvLXJlc2lkZW50JykgLiAnIENvLXJlc2lkZW50ICcgLiBmSW5wdXQoJ3JhZGlvJywnZ2VvZ3JhcGhpY2FsJywnbmVpZ2hib3InKS4gJyBOZWlnaGJvciAnIC4gZklucHV0KCdyYWRpbycsJ2dlb2dyYXBoaWNhbCcsJ25vbmUnKS4gJyBOb25lICcpKSAuDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIoIGZMYWJlbENlbGwoICdGYW1pbHknKSAuIHRkKGZJbnB1dCgncmFkaW8nLCdmYW1pbHknLCdjaGlsZCcpIC4gJyBDaGlsZCAnIC4gZklucHV0KCdyYWRpbycsJ2ZhbWlseScsJ3BhcmVudCcpLiAnIFBhcmVudCAnIC4gZklucHV0KCdyYWRpbycsJ2ZhbWlseScsJ3NpYmxpbmcnKS4gJyBTaWJsaW5nJyAuIGZJbnB1dCgncmFkaW8nLCdmYW1pbHknLCdzcG91c2UnKS4gJyBTcG91c2UgJyAuIGZJbnB1dCgncmFkaW8nLCdmYW1pbHknLCdraW4nKS4gJyBLaW4gJyAuIGZJbnB1dCgncmFkaW8nLCdmYW1pbHknLCdub25lJykuICcgTm9uZSAnKSkgLg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIoIGZMYWJlbENlbGwoICdSb21hbnRpYycpIC4gdGQoZklucHV0KCdjaGVja2JveCcsJ211c2UnLCdtdXNlJykgLiAnIE11c2UgJyAuIGZJbnB1dCgnY2hlY2tib3gnLCdjcnVzaCcsJ2NydXNoJykgLiAnIENydXNoICcgLiBmSW5wdXQoJ2NoZWNrYm94JywnZGF0ZScsJ2RhdGUnKSAuICcgRGF0ZSAnIC4gZklucHV0KCdjaGVja2JveCcsJ3N3ZWV0aGVhcnQnLCdzd2VldGhlYXJ0JykgLiAnIFN3ZWV0aGVhcnQgJykpIC4NCg0KCQkJCXRyKCB0ZCgpIC4gdGQoIGZJbnB1dCgiYnV0dG9uIiwgJ2J1aWxkcmVsYXRpb250YWcnLCAnQnVpbGQgcmVsYXRpb24gdGFnJywgInB1Ymxpc2giICwiQnVpbGQgcmVsYXRpb24gdGFnIiwgImphdmFzY3JpcHQ6YnVpbGRyZWxhdGlvbigpIikgLiBmSW5wdXQoImJ1dHRvbiIsICdyZXNldCcsICdSZXNldCcsICJwdWJsaXNoIiAsIlJlbGF0aW9uIiwgImphdmFzY3JpcHQ6cmVzZXRmaWVsZHMoKSIpKSkgLg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyKCB0ZCgpLiB0ZCgnPHNjcmlwdCB0eXBlPScgLicidGV4dC9qYXZhc2NyaXB0Ij4nIC4gJw0KZnVuY3Rpb24gYnVpbGRyZWxhdGlvbigpDQp7DQp2YXIgY2I7DQp2YXIgcmVsdmFsdWUgPSAiIjsNCmZvciAoaT0wO2k8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImZyaWVuZHNoaXAiKS5sZW5ndGg7aSsrKXsNCmNiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImZyaWVuZHNoaXAiKVtpXTsNCmlmIChjYi5jaGVja2VkPT10cnVlICYmIGNiLnZhbHVlICE9ICJub25lIikgew0KcmVsdmFsdWUgPSBjYi52YWx1ZSArICIgIjsNCn0NCn0NCg0KY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWV0IilbMF07DQppZiAoY2IuY2hlY2tlZD09dHJ1ZSkgew0KcmVsdmFsdWUgPSByZWx2YWx1ZSArICBjYi52YWx1ZSArICIgIjsNCn0NCg0KY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgiY28td29ya2VyIilbMF07DQppZiAoY2IuY2hlY2tlZD09dHJ1ZSkgew0KcmVsdmFsdWUgID0gcmVsdmFsdWUgKyAgY2IudmFsdWUgKyAiICI7DQp9DQoNCmNiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImNvbGxlYWd1ZSIpWzBdOw0KaWYgKGNiLmNoZWNrZWQ9PXRydWUpIHsNCnJlbHZhbHVlICA9IHJlbHZhbHVlICsgIGNiLnZhbHVlICsgIiAiOw0KfQ0KDQpmb3IgKGk9MDtpPGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJnZW9ncmFwaGljYWwiKS5sZW5ndGg7aSsrKXsNCmNiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImdlb2dyYXBoaWNhbCIpW2ldOw0KaWYgKGNiLmNoZWNrZWQ9PXRydWUgJiYgY2IudmFsdWUgIT0gIm5vbmUiKSB7DQpyZWx2YWx1ZSAgPSByZWx2YWx1ZSArIGNiLnZhbHVlICsgIiAiOw0KfQ0KfQ0KDQpmb3IgKGk9MDtpPGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJmYW1pbHkiKS5sZW5ndGg7aSsrKXsNCmNiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImZhbWlseSIpW2ldOw0KaWYgKGNiLmNoZWNrZWQ9PXRydWUgJiYgY2IudmFsdWUgIT0gIm5vbmUiKSB7DQpyZWx2YWx1ZSAgPSByZWx2YWx1ZSArIGNiLnZhbHVlICsgIiAiOw0KfQ0KfQ0KDQpjYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJtdXNlIilbMF07DQppZiAoY2IuY2hlY2tlZD09dHJ1ZSkgew0KcmVsdmFsdWUgID0gcmVsdmFsdWUgKyBjYi52YWx1ZSArICIgIjsNCn0NCg0KY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgiY3J1c2giKVswXTsNCmlmIChjYi5jaGVja2VkPT10cnVlKSB7DQpyZWx2YWx1ZSAgPSByZWx2YWx1ZSArIGNiLnZhbHVlICsgIiAiOw0KfQ0KDQpjYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJkYXRlIilbMF07DQppZiAoY2IuY2hlY2tlZD09dHJ1ZSkgew0KcmVsdmFsdWUgID0gcmVsdmFsdWUgKyBjYi52YWx1ZSArICIgIjsNCn0NCg0KY2IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgic3dlZXRoZWFydCIpWzBdOw0KaWYgKGNiLmNoZWNrZWQ9PXRydWUpIHsNCnJlbHZhbHVlICA9IHJlbHZhbHVlICsgY2IudmFsdWUgKyAiICI7DQp9DQoNCndoaWxlIChyZWx2YWx1ZSAuc3Vic3RyaW5nKHJlbHZhbHVlLmxlbmd0aC0xLCByZWx2YWx1ZS5sZW5ndGgpID09ICIgIikNCnsNCnJlbHZhbHVlID0gcmVsdmFsdWUuc3Vic3RyaW5nKDAscmVsdmFsdWUubGVuZ3RoLTEpOw0KfQ0KDQpkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgieGZuIilbMF0udmFsdWUgPSByZWx2YWx1ZTsNCn0NCg0KZnVuY3Rpb24gcmVzZXRmaWVsZHMoKSB7DQpkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgieGZuIilbMF0udmFsdWUgPSAiIjsNCn0NCg0KPC9zY3JpcHQ+JykpIC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ciggZkxhYmVsQ2VsbCggJ3hmbicsICd4Zm4nICkgLiB0ZGEoICR4Zm4sICcgdmFsaWduPSJ0b3AiJyApICkgLg0KDQoJCQkJdHIoIHRkKCkgLiB0ZCggZklucHV0KCAic3VibWl0IiwgJycsICdzYXZlJywgInB1Ymxpc2giICkgKSApIC4NCgkJCQkNCgkJCWVuZFRhYmxlKCkgLg0KCQkJDQoJCQllSW5wdXQoICdsaW5reGZuJyApIC4gc0lucHV0KCAoICRzdGVwPT0nbGlua3hmbl9lZGl0JyApID8gJ2xpbmt4Zm5fc2F2ZScgOiAnbGlua3hmbl9wb3N0JyApIC4NCgkJCWhJbnB1dCggJ2lkJywgJGlkICk7DQoNCgkJZWNobyBmb3JtKCAkb3V0ICk7DQoJCWVjaG8gbGlua3hmbl9saXN0KCk7DQoJfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gbGlua3hmbmNhdGVnb3J5X3BvcHVwKCRjYXQ9IiIpIA0KCXsNCgkJcmV0dXJuIGV2ZW50X2NhdGVnb3J5X3BvcHVwKCJsaW5rIiwgJGNhdCk7CQkNCgl9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBsaW5reGZuX3Bvc3QoKQ0KCXsNCgkJZ2xvYmFsICR0eHBjZmcsJHByZWZzLCR2YXJzOw0KCQkkdmFycmF5ID0gZ3BzYSgkdmFycyk7DQoNCgkJaWYoJHByZWZzWyd0ZXh0aWxlX2xpbmtzJ10pIHsNCg0KCQkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL2xpYi9jbGFzc1RleHRpbGUucGhwJzsNCgkJCSR0ZXh0aWxlID0gbmV3IFRleHRpbGUoKTsNCgkJDQoJCQkkdmFycmF5WydsaW5rbmFtZSddID0gJHRleHRpbGUtPlRleHRpbGVUaGlzKCR2YXJyYXlbJ2xpbmtuYW1lJ10sJycsMSk7DQoJCQkkdmFycmF5WydkZXNjcmlwdGlvbiddID0gJHRleHRpbGUtPlRleHRpbGVUaGlzKCR2YXJyYXlbJ2Rlc2NyaXB0aW9uJ10sMSk7DQoJDQoJCX0NCgkNCgkJZXh0cmFjdChkb1NsYXNoKCR2YXJyYXkpKTsNCg0KCQlpZiAoISRsaW5rc29ydCkgJGxpbmtzb3J0ID0gJGxpbmtuYW1lOw0KDQoJCSRxID0gc2FmZV9pbnNlcnQoInR4cF9saW5rIiwNCgkJICAgImNhdGVnb3J5ICAgID0gJyRjYXRlZ29yeScsDQoJCQlkYXRlICAgICAgICA9IG5vdygpLA0KCQkJdXJsICAgICAgICAgPSAnIi50cmltKCR1cmwpLiInLA0KCQkJbGlua25hbWUgICAgPSAnJGxpbmtuYW1lJywNCgkJCWxpbmtzb3J0ICAgID0gJyRsaW5rc29ydCcsDQoJCQlkZXNjcmlwdGlvbiA9ICckZGVzY3JpcHRpb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGZuPSAnJHhmbiciDQoJCSk7DQoNCgkJaWYgKCRxKSB7DQoJCQkvL3VwZGF0ZSBsYXN0bW9kIGR1ZSB0byBsaW5rIGZlZWRzDQoJCQlzYWZlX3VwZGF0ZSgidHhwX3ByZWZzIiwgInZhbCA9IG5vdygpIiwgIm5hbWUgPSAnbGFzdG1vZCciKTsNCgkJCQ0KCQkJbGlua3hmbl9lZGl0KG1lc3NlbmdlcignbGlua3hmbicsJGxpbmtuYW1lLCdjcmVhdGVkJykpOwkJCQ0KCQl9DQoJfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJZnVuY3Rpb24gbGlua3hmbl9zYXZlKCkgDQoJew0KCQlnbG9iYWwgJHR4cGNmZywkcHJlZnMsJHZhcnM7DQoJCSR2YXJyYXkgPSBncHNhKCR2YXJzKTsNCg0KCQlpZigkcHJlZnNbJ3RleHRpbGVfbGlua3MnXSkgew0KDQoJCQlpbmNsdWRlX29uY2UgdHhwYXRoLicvbGliL2NsYXNzVGV4dGlsZS5waHAnOw0KCQkJJHRleHRpbGUgPSBuZXcgVGV4dGlsZSgpOw0KCQkJDQoJCQkkdmFycmF5WydsaW5rbmFtZSddID0gJHRleHRpbGUtPlRleHRpbGVUaGlzKCR2YXJyYXlbJ2xpbmtuYW1lJ10sJycsMSk7DQoJCQkkdmFycmF5WydkZXNjcmlwdGlvbiddID0gJHRleHRpbGUtPlRleHRpbGVUaGlzKCR2YXJyYXlbJ2Rlc2NyaXB0aW9uJ10sMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAkdmFycmF5Wyd4Zm4nXSA9ICR0ZXh0aWxlLT5UZXh0aWxlVGhpcygkdmFycmF5Wyd4Zm4nXSwxKTsNCgkJDQoJCX0NCgkJDQoJCWV4dHJhY3QoZG9TbGFzaCgkdmFycmF5KSk7DQoJCQ0KCQlpZiAoISRsaW5rc29ydCkgJGxpbmtzb3J0ID0gJGxpbmtuYW1lOw0KDQoJCSRycyA9IHNhZmVfdXBkYXRlKCJ0eHBfbGluayIsDQoJCSAgICJjYXRlZ29yeSAgICA9ICckY2F0ZWdvcnknLA0KCQkJdXJsICAgICAgICAgPSAnIi50cmltKCR1cmwpLiInLA0KCQkJbGlua25hbWUgICAgPSAnJGxpbmtuYW1lJywNCgkJCWxpbmtzb3J0ICAgID0gJyRsaW5rc29ydCcsDQoJCQlkZXNjcmlwdGlvbiA9ICckZGVzY3JpcHRpb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGZuIAkgICAgPSAnJHhmbiciLA0KCQkgICAiaWQgPSAnJGlkJyINCgkJKTsNCiAgICAgICAgICAgICAgIA0KCQlpZiAoJHJzKSBsaW5reGZuX2VkaXQoIG1lc3NlbmdlciggJ2xpbmt4Zm4nLCBkb1N0cmlwKCRsaW5rbmFtZSksICdzYXZlZCcgKSApOw0KCX0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KCWZ1bmN0aW9uIGxpbmt4Zm5fZGVsZXRlKCkgDQoJew0KCQkkaWQgPSBwcygnaWQnKTsNCgkJJHJzID0gc2FmZV9kZWxldGUoInR4cF9saW5rIiwgImlkPSRpZCIpOw0KCQlpZiAoJHJzKSBsaW5reGZuX2VkaXQobWVzc2VuZ2VyKCdsaW5reGZuJywgJycsICdkZWxldGVkJykpOw0KCX0NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBsaW5reGZuX2NoYW5nZV9wYWdlYnkoKSANCgl7DQoJCWV2ZW50X2NoYW5nZV9wYWdlYnkoJ3hmbicpOw0KCQlsaW5reGZuX2VkaXQoKTsNCgl9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBsaW5reGZuX211bHRpZWRpdF9mb3JtKCkgDQoJew0KCQlyZXR1cm4gZXZlbnRfbXVsdGllZGl0X2Zvcm0oJ2xpbmt4Zm4nKTsNCgl9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCglmdW5jdGlvbiBsaW5reGZuX211bHRpX2VkaXQoKSANCgl7DQoJCSRkZWxldGVkID0gZXZlbnRfbXVsdGlfZWRpdCgndHhwX2xpbmsnLCdpZCcpOw0KCQlpZighZW1wdHkoJGRlbGV0ZWQpKSByZXR1cm4gbGlua3hmbl9lZGl0KG1lc3NlbmdlcignbGlua3hmbicsJGRlbGV0ZWQsJ2RlbGV0ZWQnKSk7DQoJCXJldHVybiBsaW5reGZuX2VkaXQoKTsNCgl9DQoiO3M6NDoidHlwZSI7czoxOiIxIjtzOjM6Im1kNSI7czozMjoiODMyNjc1Nzk3MjU1ZWQyNWQ3ZDMzMTI2NjY5MjVmMmMiO30=