Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_海角123@base64://Ly8gPT1Vc2VyU2NyaXB0PT0NCi8vIEBuYW1lICAgICAgICAgICAgICDmtbfop5LnpL7ljLoNCi8vIEBob21lcGFnZSAgICAgICAgICBodHRwczovL2hlbmFubXUuY29tDQovLyBAdmVyc2lvbiAgICAgICAgICAgMi43LjQNCi8vIEB1cGRhdGVEZXNjICAgICAgICDkv67lpI3pg6jliIbnm5fniYjop4bpopHml6Dms5Xmkq3mlL7pl67popgNCi8vIEBkZXNjcmlwdGlvbiAgICAgICDwn5Sl5YWN6LS555yL5LuY6LS56KeG6aKR77yM5LiL6L296KeG6aKR77yM5aSN5Yi25pKt5pS+6ZO+5o6l77yM5L+d5a2Y6LSm5Y+35a+G56CB5YWN6L6T5YWl77yM5biW5a2Q5piv5ZCm5pyJ6KeG6aKR5Zu+54mH5o+Q56S6KOagh+mimOWJjee8gCnvvIzoh6rliqjlsZXlvIDluJblrZDvvIzljrvlub/lkYrvvIx2aXDmoIfor4YNCi8vIEBpY29uICAgICAgICAgICAgICBodHRwczovL2Nkbi5oZW5hbm11LmNvbS9pbWFnZS9oYWlqaWFvLnBuZw0KLy8gQG5hbWVzcGFjZSAgICAgICAgIOa1t+inkuekvuWMug0KLy8gQGF1dGhvciAgICAgICAgICAgIGpzeGwNCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vaGoqLiovKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouaGoqLiovKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouaGFpKi4qLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9oYWkqLiovKgovLyBAaW5jbHVkZSAgICAgIAkgICo6Ly9oaiovKgovLyBAaW5jbHVkZSAgICAgIAkgICo6Ly8qLmhqKi8qDQovLyBAaW5jbHVkZSAgICAgIAkgICo6Ly9wYWlkYWEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAJICAqOi8vKi5wYWlkYWEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICovcG9zdC9kZXRhaWxzLyoKLy8gQGluY2x1ZGUJCQkgICo6Ly9ibG9nLmx1Y2tseS1tancuY24vKgovLyBAaW5jbHVkZQkJICAgICAgKjovL3Rvb2xzLnRoYXR3aW5kLmNvbS8qCi8vIEBpbmNsdWRlCQkJICAqOi8vdG9vbHMuYnVnc2NhbmVyLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi9wb3N0L2RldGFpbHMqDQovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzMuNi4wL2pxdWVyeS5taW4uanMNCi8vIEByZXF1aXJlCQkJICBodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9obHMuanMvMS41LjgvaGxzLm1pbi5qcw0KLy8gQHJlcXVpcmUJCQkgIGh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2RwbGF5ZXIvMS4yNy4xL0RQbGF5ZXIubWluLmpzDQovLyBAcnVuLWF0IAkJCSAgZG9jdW1lbnQtc3RhcnQNCi8vIEBncmFudCAgICAgICAgICAgICB1bnNhZmVXaW5kb3cNCi8vIEBncmFudCAgICAgICAgICAgICBHTV9hZGRTdHlsZQ0KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlDQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUNCi8vIEBncmFudCAJCQkgIEdNX2dldFJlc291cmNlVGV4dA0KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0DQovLyBAY2hhcnNldAkJICAgICAgVVRGLTgNCi8vIEBhbnRpZmVhdHVyZSAgICAgICBwYXltZW50DQovLyBAdXBkYXRlVVJMCQkgIGh0dHBzOi8vY2RuLmhlbmFubXUuY29tL2pzL3JlbGVhc2UvaGFpamlhby51c2VyLmpzDQovLyBAZG93bmxvYWRVUkwJCSAgaHR0cHM6Ly9jZG4uaGVuYW5tdS5jb20vanMvcmVsZWFzZS9oYWlqaWFvLnVzZXIuanMNCi8vIEBsaWNlbnNlICAgICAgICAgICBNSVQNCi8vID09L1VzZXJTY3JpcHQ9PQoKY29uc3QgZGVjb2RlID0gZnVuY3Rpb24ocywgcGx1cykgew0KCWNvbnN0IG9iaiA9IHt9OwoJY29uc3Qgc2ZzY2MgPSAnd3QnICsgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApOwoJaWYgKCFzdXBlclZpcC5fQ09ORklHXy51c2VyIHx8ICFzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuKSB7DQoJCXV0aWwuc2hvd1RpcHMoew0KCQkJdGl0bGU6ICfor7fpgIDlh7rohJrmnKznmbvlvZXlkI7ph43mlrDnmbvlvZXohJrmnKzvvIx1c2VyfHRva2VuIG5vdF9leGlzdHMnLA0KCQkJc3VjY2VzczogKHJlcyk9PnsNCgkJCQlpZihyZXMpew0KCQkJCQl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQoJCQkJfQ0KCQkJfQ0KCQl9KQoJCXJldHVybjsKCX0KCW9ialtzZnNjY10gPSBlc2NhcGU7CglyZXR1cm4gcGx1cyA/IGRlY29kZVVSSUNvbXBvbmVudChvYmpbc2ZzY2NdKGVjLnNmd2VjY2F0KGVjLnNmd2VjY2F0KHMpLCBmYWxzZSkpKSA6CgkJZGVjb2RlVVJJQ29tcG9uZW50KGVjLnNmd2VjY2F0KGVjLnNmd2VjY2F0KHMpLCBmYWxzZSkpOwp9Cgpjb25zdCBlbmNvZGUgPSBmdW5jdGlvbihzLCBwbHVzKSB7DQoJY29uc3QgY3NyZGZkID0gdW5lc2NhcGU7Cgljb25zdCBjZnNlZCA9IGVuY29kZVVSSUNvbXBvbmVudDsKCXJldHVybiBwbHVzID8gZWMuc3dhcWJ0KGVjLnN3YXFidChjc3JkZmQoY2ZzZWQocykpKSwgZmFsc2UpIDogZWMuc3dhcWJ0KGVjLnN3YXFidChzKSwgZmFsc2UpOwp9Cgpjb25zdCBtZDV4ID0gZnVuY3Rpb24ocywgdHlwZSkgewoJdHJ5IHsKCQlpZiAoIXR5cGUpIHsKCQkJY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkuc2V0SG91cnMoMCwgMCwgMCwgMCkgKyAnJzsKCQkJY29uc3QgZGF5ID0gbmV3IERhdGUoKS5nZXREYXRlKCk7CgkJCWNvbnN0IGNvZGUgPSBkYXRlLnN1YnN0cmluZyg0LCA4KSAqIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICsgJyc7CgkJCXJldHVybiBlYy5zd2FxYnQoSlNPTi5zdHJpbmdpZnkoewoJCQkJZGF0ZTogZGF0ZSwKCQkJCWNvZGU6IGNvZGUsCgkJCQlkYXk6IGRheQoJCQl9KSk7CgkJfSBlbHNlIHsKCQkJY29uc3QgdG9rZW4gPSBKU09OLnBhcnNlKGVjLnNmd2VjY2F0KHMpKTsKCQkJaWYgKChuZXcgRGF0ZShOdW1iZXIodG9rZW4uZGF0ZSkpLmdldFRpbWUoKSArIDg2NDAwMDAwKSA8IERhdGUubm93KCkpIHsKCQkJCXRocm93IEVycm9yKCdtZDV4IGV4cGlyZScpOwoJCQl9CgkJCWlmICh0b2tlbi5kYXkgIT0gbmV3IERhdGUoTnVtYmVyKHRva2VuLmRhdGUpKS5nZXREYXRlKCkpIHsKCQkJCXRocm93IEVycm9yKCdtZDV4IGVycicpOwoJCQl9CgkJCWNvbnN0IGNvZGUgPSAobmV3IERhdGUoTnVtYmVyKHRva2VuLmRhdGUpKS5zZXRIb3VycygwLCAwLCAwLCAwKSArICcnKS5zdWJzdHJpbmcoNCwgOCkgKiB0b2tlbi5kYXk7CgkJCWlmIChjb2RlICE9IHRva2VuLmNvZGUpIHsKCQkJCXRocm93IEVycm9yKCdtZDV4IGVycjInKTsKCQkJfQoJCQlyZXR1cm4gdG9rZW47CgkJfQoJfSBjYXRjaCAoZSkgewoJCXJldHVybiAnJzsKCX0KfQ0KDQpjb25zdCBzZXJpYWxpemVWaWRlbyA9IChzdHIpID0+IHsNCglpZiAoIXN0cikgewoJCXJldHVybiAnJzsKCX0KCXRyeSB7CgkJY29uc3QgaXRlbSA9IGVjLmNza3VlY2VkZShzdHIucmVwbGFjZSgnOUpTWEwnLCAnJykpOw0KCQlpZiAodHlwZW9mKGl0ZW0pICE9ICdvYmplY3QnKSB7CgkJCXJldHVybiAnJzsKCQl9DQoJCWxldCBkdXJhdGlvbiA9ICcxLjI1MDAwMCc7CgkJY29uc3QgY291bnROdW0gPSBpdGVtLnN0cl9lbmQuc3BsaXQoJy0nKVsxXSAtIGl0ZW0uc3RyX2VuZC5zcGxpdCgnLScpWzBdOwoJCXRyeSB7CgkJCWlmIChpdGVtLmR1cmF0aW9uICYmIGl0ZW0uZHVyYXRpb24gPiA0MCkgewoJCQkJZHVyYXRpb24gPSAoaXRlbS5kdXJhdGlvbiAvIChjb3VudE51bSArIDEpKS50b0ZpeGVkKDYpOwoJCQkJaWYgKGR1cmF0aW9uID4gMiB8fCBkdXJhdGlvbiA8IDAuNSkgewoJCQkJCWR1cmF0aW9uID0gJzEuMjUwMDAwJzsKCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKGUpIHt9DQoJCQ0KCQlpZihzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5rZXkgJiYgKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmtleSAhPSBpdGVtLmtleVVybCkpew0KCQkJY29uc3Qga2V5UmVnID0gL1wvKGVuY18uKykvLmV4ZWMoaXRlbS5rZXlVcmwpDQoJCQlpZihrZXlSZWcgJiYga2V5UmVnLmxlbmd0aCA+IDEpew0KCQkJCWl0ZW0ua2V5VXJsID0gc3VwZXJWaXAuX0NPTkZJR18udmlkZW9Vcmwua2V5ICsga2V5UmVnWzFdDQoJCQl9DQoJCX0KCQlsZXQgbTN1OENvbnRlbnQgPSAnI0VYVE0zVScgKyAnXHJcbic7CgkJbTN1OENvbnRlbnQgKz0gJyNFWFQtWC1WRVJTSU9OOjMnICsgJ1xyXG4nOwoJCW0zdThDb250ZW50ICs9ICcjRVhULVgtVEFSR0VURFVSQVRJT046MicgKyAnXHJcbic7CgkJbTN1OENvbnRlbnQgKz0gJyNFWFQtWC1NRURJQS1TRVFVRU5DRTowJyArICdcclxuJzsKCQltM3U4Q29udGVudCArPSAnI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9IicgKyBpdGVtLmtleVVybCArIChpdGVtLnNpZ24/aXRlbS5zaWduOiAnJykgKyAnIixJVj0nICsgaXRlbS5pdiArICdcclxuJzsKCQlmb3IgKGxldCBpID0gTnVtYmVyKGl0ZW0uc3RyX2VuZC5zcGxpdCgnLScpWzBdKTsgaSA8PSBjb3VudE51bTsgaSsrKSB7CgkJCW0zdThDb250ZW50ICs9ICcjRVhUSU5GOicgKyBkdXJhdGlvbiArICcsJyArICdcclxuJzsKCQkJbTN1OENvbnRlbnQgKz0gaXRlbS5zdGFydF91cmwgKyBpICsgJy50cycgKyAoaXRlbS5zaWduP2l0ZW0uc2lnbjogJycpICsgJ1xyXG4nOwoJCX0KCQltM3U4Q29udGVudCArPSAnI0VYVC1YLUVORExJU1QnOwoJCWNvbnN0IGZpbGUgPSBuZXcgQmxvYihbbTN1OENvbnRlbnRdLCB7CgkJCXR5cGU6ICd0ZXh0L3BsYWluJwoJCX0pDQoJCXJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpOwoJfSBjYXRjaCAoZSkgew0KCQlyZXR1cm4gJycKCX0KfQ0KDQpjb25zdCBnZXRfbTN1OF91cmxfaGFpamlhbyA9IGFzeW5jIGZ1bmN0aW9uKCkgewoJaWYgKCFzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuKSB7CgkJcmV0dXJuICdub3RfbG9naW5fanN4bCc7Cgl9CglpZiAoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsKSB7CgkJaWYgKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVybC5zdGFydHNXaXRoKCdibG9iOmh0dHAnKSkgewoJCQlyZXR1cm4gc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsOwoJCX0KCQlpZiAoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCcubTN1OCcpICYmICFzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwuaW5jbHVkZXMoCgkJCQkncHJldmlldycpKSB7CQkJCgkJCXJldHVybiBzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmw7CgkJfQoJfQoJdHJ5IHsKCQlpZiAoIXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVybCB8fCBzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwuaW5jbHVkZXMoJ2VycicpKSB7CgkJCWlmIChzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5vcmlnaW5hbCkgewoJCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsID0gc3VwZXJWaXAuX0NPTkZJR18udmlkZW9Vcmwub3JpZ2luYWw7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gJ3ZpZGVvVXJsLnVybCBudWxsOicgKyBzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmw7CgkJCX0KCQl9CgkJaWYgKCFzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwuc3RhcnRzV2l0aCgnaHR0cCcpICYmICFzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwuc3RhcnRzV2l0aCgKCQkJCScvYXBpJykpIHsKCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsID0gc3VwZXJWaXAuX0NPTkZJR18udmlkZW9Vcmwub3JpZ2luYWw7CgkJfQoJCWlmICghc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwuaW5pdEFlcykgewoJCQlmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykgewoJCQkJYXdhaXQgdXRpbC5zbGVlcCgxMDAwKTsKCQkJCWlmIChzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5pbml0QWVzKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9DQoJCWlmIChzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5hZXMpIHsNCgkJCWNvbnN0IHVybCA9IHNlcmlhbGl6ZVZpZGVvKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmFlcy5yZXBsYWNlKHN1cGVyVmlwLl9DT05GSUdfCgkJCQkudmlkZW9VcmwuYWVzLnN1YnN0cmluZyhzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5hZXMubGVuZ3RoIC0gNSksICcnKSk7CgkJCWlmICh1cmwpIHJldHVybiB1cmw7CgkJfQ0KCQl0cnkgewoJCQljb25zdCBjaGVja1ZpZGVvUmVzID0gYXdhaXQgdXRpbC5hc3luY0h0dHAoJ2h0dHBzOi8vYXBpLmhlbmFubXUuY29tL2hhaWppYW9TZXJ2aWNlJyArIChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKSArIDEpICsgJzAwL2NoZWNrVmlkZW9JbmZvP3NpZ249JyArIGVjCgkJCQkua254a2J4ZW4oc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwucGlkKSArICcmb3JpZ2luPScgKyAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPyAxIDoKCQkJCQkyKSArICcmdGltZXN0YW1wPScgKyBlYy5rbnhrYnhlbihEYXRlLm5vdygpKSwgMTUwMDApOwkJCgkJCWlmIChjaGVja1ZpZGVvUmVzLmVyck1zZyA9PSAnc3VjY2VzcycpIHsKCQkJCWNvbnN0IHJlcyA9IEpTT04ucGFyc2UoY2hlY2tWaWRlb1Jlcy5yZXNwb25zZVRleHQpOwoJCQkJaWYgKHJlcy5lcnJDb2RlID09IDApIHsKCQkJCQl1dGlsLnNob3dBbmRIaWRUaXBzKCd3dF9wbGF5ZXJfaGFpamlhbycpOwoJCQkJCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmRvd25sb2FkVXJsID0gcmVzLmRvd25sb2FkVXJsOwoJCQkJCWlmKHJlcy5uZXdUb2tlbiB8fCByZXMubmV3Um9sZSl7CgkJCQkJCWlmKHJlcy5uZXdUb2tlbikgc3VwZXJWaXAuX0NPTkZJR18udXNlci50b2tlbiA9IHJlcy5uZXdUb2tlbjsKCQkJCQkJaWYocmVzLm5ld1JvbGUgJiYgcmVzLm5ld1JvbGUuZXhwaXJlZF9kYXRlKSBzdXBlclZpcC5fQ09ORklHXy51c2VyLnJvbGUuZXhwaXJlZF9kYXRlID0gcmVzLm5ld1JvbGUuZXhwaXJlZF9kYXRlOwoJCQkJCQlHTV9zZXRWYWx1ZSgnanN4bF91c2VyJywgc3VwZXJWaXAuX0NPTkZJR18udXNlcikKCQkJCQl9CgkJCQkJY29uc3QgdXJsID0gc2VyaWFsaXplVmlkZW8ocmVzLmRhdGEucmVwbGFjZShyZXMuZGF0YS5zdWJzdHJpbmcocmVzLmRhdGEubGVuZ3RoIC0gNSksICcnKSk7CgkJCQkJaWYgKHVybCkgcmV0dXJuIHVybDsKCQkJCX0gZWxzZSB7DQoJCQkJCWlmKHJlcy5lcnJNc2cgIT0gJ25vdCBleGlzdHMnKXsNCgkJCQkJCXJldHVybiByZXMuZXJyTXNnIHx8IHJlcy5lcnJvci5tZXNzYWdlOw0KCQkJCQl9CgkJCQl9CgkJCX1lbHNlew0KCQkJCXJldHVybiBjaGVja1ZpZGVvUmVzLmVyck1zZyB8fCAn6K+35rGC5aSx6LSl77yM6K+35Yi35paw6aG16Z2i5YaN6K+VJzsNCgkJCX0KCQl9IGNhdGNoIChlKSB7CgkJCXJldHVybiBlOwoJCX0KCQlpZiAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQpIHsKCQkJbGV0IHJlcyA9ICcnDQoJCQl0cnkgew0KCQkJCWNvbnN0IHJlZyA9IC8uK1wvKG1wNHx2aWRlbylcLy8uZXhlYyhzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwpOw0KCQkJCWlmIChyZWcgJiYgcmVnLmxlbmd0aCA+IDEpIHsNCgkJCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9Vcmwua2V5ID0gcmVnWzBdOw0KCQkJCX0NCgkJCQlyZXMgPSBhd2FpdCB1dGlsLmFzeW5jSHR0cChzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC51cmwsIDE1MDAwLCBmYWxzZSk7DQoJCQkNCgkJCX0gY2F0Y2ggKGUpIHsNCgkJCQlyZXR1cm4gJ3Jlcy5yZXNwb25zZVRleHQgbnVsbDoyIGVycm9yJzsNCgkJCX0NCgkJCWlmICghcmVzLnJlc3BvbnNlVGV4dCkgew0KCQkJCXJldHVybiAncmVzLnJlc3BvbnNlVGV4dCBudWxsIGVycm9yOicgKyByZXM7DQoJCQl9DQoJCQlpZiAoY2hlY2tEdXJhdGlvbihyZXMucmVzcG9uc2VUZXh0KSA+IDM1KSB7DQoJCQkJcmV0dXJuIGdldFVybEJ5TTN1Q29udGVudChyZXMucmVzcG9uc2VUZXh0KTsNCgkJCX0gZWxzZSB7DQoJCQkJcmV0dXJuIGF3YWl0IGF1dG9TdW0ocmVzLnJlc3BvbnNlVGV4dCk7DQoJCQl9CgoJCX0gZWxzZSB7CgkJCWNvbnN0IHJlcyA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKGxvY2F0aW9uLm9yaWdpbiArIHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVybCwgMTUwMDApOwoJCQlpZiAocmVzLmVyck1zZyAhPSAnc3VjY2VzcycgfHwgcmVzLnJlc3BvbnNlVGV4dC5sZW5ndGggPCAzMCkgewoJCQkJcmV0dXJuICdlcnInOwoJCQl9CgkJCWNvbnN0IGxpbmVzID0gcmVzLnJlc3BvbnNlVGV4dC5zcGxpdCgnXG4nKTsKCQkJbGV0IGNvbW1vblVybCA9IHV0aWwuZmluZENvbW1vblN0YXJ0KGxpbmVzWzZdLCBsaW5lc1s4XSk7CgkJCWlmICghY29tbW9uVXJsKSB7CgkJCQlyZXR1cm4gJ2Vycic7CgkJCX0KCQkJY29uc3QgbTN1OFJlcyA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKCdodHRwczovL2FwaS5oZW5hbm11LmNvbS9oYWlqaWFvU2VydmljZScgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMikgKyAxKSArICcwMC9mb3JtYXRWaWRlb0luZm8/c2lnbj0nICsgZWMKCQkJCS5rbnhrYnhlbihjb21tb25VcmwpICsgJyZwaWQ9JyArIGVjLmtueGtieGVuKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnBpZCkgKwoJCQkJJyZ1aWQ9JyArIGVjLmtueGtieGVuKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVpZCkgKyAnJmR1cmF0aW9uPScgKyBlYy5rbnhrYnhlbihzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5kdXJhdGlvbikgKyAnJnJlbGVhc2VfZGF0ZT0nICsgc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwucmVsZWFzZV9kYXRlICsgJyZ0aW1lc3RhbXA9JyArIGVjLmtueGtieGVuKERhdGUubm93KCkpICsgJyZvcmlnaW49JyArIGxvY2F0aW9uLm9yaWdpbiwKCQkJCTE1MDAwKTsKCQkJaWYgKG0zdThSZXMuZXJyTXNnICE9ICdzdWNjZXNzJykgewoJCQkJcmV0dXJuICdlcnInOwoJCQl9CgkJCWNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UobTN1OFJlcy5yZXNwb25zZVRleHQpOwoJCQlpZiAocmVzdWx0LmVyckNvZGUgIT0gMCkgewoJCQkJcmV0dXJuIHJlc3VsdC5lcnJNc2c7CgkJCX0KCQkJdXRpbC5zaG93QW5kSGlkVGlwcygnd3RfcGxheWVyX2hhaWppYW8nKTsKCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwuYWVzID0gcmVzdWx0LmRhdGE7CgkJCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmRvd25sb2FkVXJsID0gcmVzdWx0LmRvd25sb2FkVXJsOwoJCQlpZihyZXN1bHQubmV3VG9rZW4gfHwgcmVzdWx0Lm5ld1JvbGUpewoJCQkJaWYocmVzdWx0Lm5ld1Rva2VuKSBzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuID0gcmVzdWx0Lm5ld1Rva2VuOwoJCQkJaWYocmVzdWx0Lm5ld1JvbGUgJiYgcmVzdWx0Lm5ld1JvbGUuZXhwaXJlZF9kYXRlKSBzdXBlclZpcC5fQ09ORklHXy51c2VyLnJvbGUuZXhwaXJlZF9kYXRlID0gcmVzdWx0Lm5ld1JvbGUuZXhwaXJlZF9kYXRlOwoJCQkJR01fc2V0VmFsdWUoJ2pzeGxfdXNlcicsIHN1cGVyVmlwLl9DT05GSUdfLnVzZXIpCgkJCX0KCQkJcmV0dXJuIHNlcmlhbGl6ZVZpZGVvKHJlc3VsdC5kYXRhLnJlcGxhY2UocmVzdWx0LmRhdGEuc3Vic3RyaW5nKHJlc3VsdC5kYXRhLmxlbmd0aCAtIDUpLAoJCQkJJycpKTsKCQl9Cgl9IGNhdGNoIChlKSB7CgkJYWxlcnQoSlNPTi5zdHJpbmdpZnkoZSkpOwoJCXJldHVybiAnZXJyJwoJfQp9DQoNCmNvbnN0IGNoZWNrRHVyYXRpb24gPSBmdW5jdGlvbihtM3U4Q29udGVudCkgew0KCWxldCBzdW1EdXJhdGlvbiA9IDA7CglsZXQgRHVyYXRpb25SZWcgPSBuZXcgUmVnRXhwKCcjRVhUSU5GOiguKyksJywgJ2cnKQoJbGV0IHJlZyA9ICcnCgl3aGlsZSAoKHJlZyA9IER1cmF0aW9uUmVnLmV4ZWMobTN1OENvbnRlbnQpKSAhPT0gbnVsbCkgewoJCXN1bUR1cmF0aW9uICs9IE51bWJlcihyZWdbMV0pOwoJfQoJcmV0dXJuIHN1bUR1cmF0aW9uCn0NCg0KY29uc3QgZ2V0VXJsQnlNM3VDb250ZW50ID0gZnVuY3Rpb24obTN1OENvbnRlbnQpIHsKCWxldCBmaWxlID0gbmV3IEZpbGUoW20zdThDb250ZW50XSwgJ2Rvd25sb2FkLm0zdTgnLCB7CgkJdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCcKCX0pOwoJcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkKfQ0KDQpjb25zdCBhdXRvU3VtID0gYXN5bmMgZnVuY3Rpb24obTN1OENvbnRlbnQpIHsKCWNvbnN0IHBhcmFtcyA9IHsKCQl1aWQ6IHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVpZCwKCQlwaWQ6IHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnBpZCwKCQlvcmlnaW46IGxvY2F0aW9uLm9yaWdpbiwKCQlyZWxlYXNlX2RhdGU6IHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnJlbGVhc2VfZGF0ZQoJfQ0KCW0zdThDb250ZW50ID0gbTN1OENvbnRlbnQucmVwbGFjZSgnI0VYVC1YLUVORExJU1QnLCAnJykucmVwbGFjZSgnI0VYVC1YLVRBUkdFVERVUkFUSU9OOjEnLAoJCScjRVhULVgtVEFSR0VURFVSQVRJT046MicpOwoJY29uc3QgbGluZSA9IG0zdThDb250ZW50LnNwbGl0KCdcbicpOwoJcGFyYW1zLml2ID0gL0lWPSguKykvLmV4ZWMobGluZVs0XSlbMV07CglwYXJhbXMuc3RhcnRfdXJsID0gdXRpbC5maW5kQ29tbW9uU3RhcnQobGluZVs2XSwgbGluZVs4XSk7Cgljb25zdCBlbmRTdHJzID0gbGluZVs2XS5yZXBsYWNlKHBhcmFtcy5zdGFydF91cmwsICcnKS5zcGxpdCgnLicpOwoJcGFyYW1zLnN0cl9lbmQgPSBlbmRTdHJzWzBdICsgJy0nOwoKCWZ1bmN0aW9uIHVybFJlcGxhY2VOdW0oTnVtKSB7CgkJcmV0dXJuIHBhcmFtcy5zdGFydF91cmwgKyBOdW0gKyAoJy4nICsgZW5kU3Ryc1sxXSkKCX07CglsZXQgdHNQYXRoID0gbGluZVtsaW5lLmxlbmd0aCAtIDJdOwoJY29uc3QgZW5kVHNOdW0gPSBOdW1iZXIodHNQYXRoLnJlcGxhY2UocGFyYW1zLnN0YXJ0X3VybCwgJycpLnNwbGl0KCcuJylbMF0pCglwYXJhbXMuZHVyYXRpb24gPSBzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5kdXJhdGlvbj9OdW1iZXIoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwuZHVyYXRpb24pIDogMjAwCgljb25zdCBjb3VudFRzTnVtID0gcGFyc2VJbnQocGFyYW1zLmR1cmF0aW9uICAvIDEuMjUpDQoJbGV0IHRzTnVtID0gMDsKCWxldCB0c051bVJlZyA9IG5ldyBSZWdFeHAoJy50cycsICdnJyk7Cgl3aGlsZSAoKHJlZyA9IHRzTnVtUmVnLmV4ZWMobTN1OENvbnRlbnQpKSAhPT0gbnVsbCkgewoJCXRzTnVtICs9IDE7Cgl9DQoJbGV0IGN1cnJUc051bSA9IGVuZFRzTnVtOw0KCWxldCBjdXJyVGVzdE51bSA9IGN1cnJUc051bSArIChOdW1iZXIoY291bnRUc051bSAtIHRzTnVtKSkNCglsZXQgcmVzdWx0ID0gJyc7DQoJbGV0IHJlcyA9ICcnOwoJdHJ5IHsKCQlyZXN1bHQgPSBhd2FpdCB1dGlsLmFzeW5jSHR0cCh1cmxSZXBsYWNlTnVtKGN1cnJUZXN0TnVtKSwgMTAwMDAsIGZhbHNlKTsKCX0gY2F0Y2ggKGUpIHt9CglpZihyZXN1bHQuZXJyTXNnID09ICdzdWNjZXNzJyl7DQoJCXdoaWxlIChyZXN1bHQuZXJyTXNnID09ICdzdWNjZXNzJykgew0KCQkJY3VyclRlc3ROdW0gKz0gMzA7DQoJCQl0cnkgew0KCQkJCXJlc3VsdCA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKHVybFJlcGxhY2VOdW0oY3VyclRlc3ROdW0pLCAxMDAwMCwgZmFsc2UpOw0KCQkJfSBjYXRjaCAoZSkgew0KCQkJCXJlc3VsdCA9ICcnOw0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3IgKGxldCBpID0gY3VyclRlc3ROdW0gLSAxOyBjdXJyVGVzdE51bSA+IGN1cnJUc051bTsgaS0tKSB7DQoJCQl0cnkgew0KCQkJCXJlcyA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKHVybFJlcGxhY2VOdW0oaSksIDEwMDAwLCBmYWxzZSk7DQoJCQl9IGNhdGNoIChlKSB7fQ0KCQkJaWYgKHJlcy5lcnJNc2cgPT0gJ3N1Y2Nlc3MnKSB7DQoJCQkJY3VyclRlc3ROdW0gPSBpOw0KCQkJCXBhcmFtcy5zdHJfZW5kICs9IGN1cnJUZXN0TnVtOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfWVsc2V7DQoJCXdoaWxlIChyZXN1bHQuZXJyTXNnICE9ICdzdWNjZXNzJyAmJiBjdXJyVGVzdE51bSA+IGN1cnJUc051bSkgew0KCQkJY3VyclRlc3ROdW0gLT0gMzA7DQoJCQl0cnkgew0KCQkJCXJlc3VsdCA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKHVybFJlcGxhY2VOdW0oY3VyclRlc3ROdW0pLCAxMDAwMCwgZmFsc2UpOw0KCQkJfSBjYXRjaCAoZSkgew0KCQkJCXJlc3VsdCA9ICcnOw0KCQkJfQ0KCQl9DQoJCWZvciAobGV0IGkgPSBjdXJyVGVzdE51bSArIDE7IHRydWU7IGkrKykgew0KCQkJdHJ5IHsNCgkJCQlyZXMgPSBhd2FpdCB1dGlsLmFzeW5jSHR0cCh1cmxSZXBsYWNlTnVtKGkpLCAxMDAwMCwgZmFsc2UpOw0KCQkJfSBjYXRjaCAoZSkgew0KCQkJCXJlcy5lcnJNc2cgPSAnJw0KCQkJfQ0KCQkJaWYgKHJlcy5lcnJNc2cgIT0gJ3N1Y2Nlc3MnKSB7DQoJCQkJY3VyclRlc3ROdW0gPSBpIC0gMTsNCgkJCQlwYXJhbXMuc3RyX2VuZCArPSBjdXJyVGVzdE51bTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCX0KCWNvbnN0IGFkZFRzQ291bnQgPSBjdXJyVGVzdE51bSAtIGN1cnJUc051bTsNCglsZXQgZHVyYXRpb24gPSAnMS4yNTAwMDAnOw0KCWNvbnN0IGNvdW50TnVtID0gcGFyYW1zLnN0cl9lbmQuc3BsaXQoJy0nKVsxXSAtIHBhcmFtcy5zdHJfZW5kLnNwbGl0KCctJylbMF07DQoJdHJ5IHsNCgkJaWYgKHBhcmFtcy5kdXJhdGlvbiA+IDQwKSB7DQoJCQlkdXJhdGlvbiA9IChwYXJhbXMuZHVyYXRpb24gLyAoY291bnROdW0gKyAxKSkudG9GaXhlZCg2KTsNCgkJCWlmIChkdXJhdGlvbiA+IDIgfHwgZHVyYXRpb24gPCAwLjUpIHsNCgkJCQlkdXJhdGlvbiA9ICcxLjI1MDAwMCc7DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChlKSB7fQ0KCWZvciAobGV0IGkgPSAoKGN1cnJUc051bSkgKyAxKTsgaSA8PSBjdXJyVGVzdE51bTsgaSsrKSB7CgkJbTN1OENvbnRlbnQgKz0gJyNFWFRJTkY6JyArIGR1cmF0aW9uICsgJywnICsgJ1xyXG4nOwoJCW0zdThDb250ZW50ICs9ICh1cmxSZXBsYWNlTnVtKGkpICsgJ1xyXG4nKTsKCX0NCgoJbTN1OENvbnRlbnQgKz0gJyNFWFQtWC1FTkRMSVNUJzsKCWNvbnN0IHRzUmVnID0gLyguKylcLy4rXC50cy8uZXhlYyhsaW5lWzZdKTsKCWlmICh0c1JlZy5sZW5ndGggPCAyKSByZXR1cm4gJ3RzUmVnLmxlbmd0aCBlcnI6JyArIHRzUmVnOwoJY29uc3QgZW5ja2V5UmVnID0gL1VSST0iKC4rKSIvLmV4ZWMobTN1OENvbnRlbnQuc3BsaXQoJ1xuJylbNF0pOwoJaWYgKGVuY2tleVJlZy5sZW5ndGggPCAyKSByZXR1cm4gJ2VuY2tleVJlZy5sZW5ndGggZXJyOicgKyBlbmNrZXlSZWc7CglpZiAoIWVuY2tleVJlZ1sxXS5zdGFydHNXaXRoKCdodHRwJykpIHsKCQltM3U4Q29udGVudCA9IG0zdThDb250ZW50LnJlcGxhY2UoZW5ja2V5UmVnWzFdLCAoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9Vcmwua2V5ID8gc3VwZXJWaXAuX0NPTkZJR18KCQkJLnZpZGVvVXJsLmtleSA6ICdodHRwczovL2hhaWppYW8uc3RvcmUvaGsvc3ViMTJkL21wNC8nKSArIGVuY2tleVJlZ1sxXSkKCQlwYXJhbXMua2V5VXJsID0gKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmtleSA/IHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmtleSA6CgkJCSdodHRwczovL2hhaWppYW8uc3RvcmUvaGsvc3ViMTJkL21wNC8nKSArIGVuY2tleVJlZ1sxXTsKCX0KCWNvbnN0IGZpbGUgPSBuZXcgQmxvYihbbTN1OENvbnRlbnRdLCB7CgkJdHlwZTogJ3RleHQvcGxhaW4nCgl9KQoJaWYgKHBhcmFtcy5kdXJhdGlvbiA+IDM1KSB7CgkJJC5nZXQoewoJCQl1cmw6ICdodHRwczovL2FwaS5oZW5hbm11LmNvbS9oYWlqaWFvU2VydmljZScgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMikgKyAxKSArICcwMC9mb3JtYXRGYWtlclZpZGVvSW5mbycsCgkJCWRhdGE6IHsKCQkJCWNvZGU6ICdKU1hMJyArIGVjLmtueGtieGVuKHBhcmFtcykgKyAnNkpTWEwnLAoJCQkJdGltZXN0YW1wOiBlYy5rbnhrYnhlbihEYXRlLm5vdygpKQoJCQl9LA0KCQkJaGVhZGVyczogew0KCQkJCSdKc3hsVG9rZW4nOiBzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuDQoJCQl9LAoJCQlzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKCQkJCWlmIChyZXMuZXJyQ29kZSA9PSAwKSB7CgkJCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwuZG93bmxvYWRVcmwgPSByZXMuZG93bmxvYWRVcmw7CgkJCQkJaWYocmVzLm5ld1Rva2VuIHx8IHJlcy5uZXdSb2xlKXsKCQkJCQkJaWYocmVzLm5ld1Rva2VuKSBzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuID0gcmVzLm5ld1Rva2VuOwoJCQkJCQlpZihyZXMubmV3Um9sZSAmJiByZXMubmV3Um9sZS5leHBpcmVkX2RhdGUpIHN1cGVyVmlwLl9DT05GSUdfLnVzZXIucm9sZS5leHBpcmVkX2RhdGUgPSByZXMubmV3Um9sZS5leHBpcmVkX2RhdGU7CgkJCQkJCUdNX3NldFZhbHVlKCdqc3hsX3VzZXInLCBzdXBlclZpcC5fQ09ORklHXy51c2VyKQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pCgkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwuanN4bCA9IHRydWUKCX0KCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmFlcyA9ICdKU1hMJyArIGVjLmtueGtieGVuKHBhcmFtcykgKyAnNkpTWEwnOwoJdXRpbC5zaG93QW5kSGlkVGlwcygnd3RfcGxheWVyX2hhaWppYW8nKTsKCXJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpOwp9DQoNCmNvbnN0IGVjID0gewoJYjY0OiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLAoJYjY0cmU6IC9eKD86W0EtWmEtelxkK1wvXXs0fSkqPyg/OltBLVphLXpcZCtcL117Mn0oPzo9PSk/fFtBLVphLXpcZCtcL117M309Pyk/JC8sCglzd2FxYnQ6IChzdHJpbmcsIGZsYWcgPSB0cnVlKSA9PiB7CgkJc3RyaW5nID0gU3RyaW5nKHN0cmluZyk7CgkJdmFyIGJpdG1hcCwgYSwgYiwgYywgcmVzdWx0ID0gIiIsCgkJCWkgPSAwLAoJCQlyZXN0ID0gc3RyaW5nLmxlbmd0aCAlIDM7CgkJZm9yICg7IGkgPCBzdHJpbmcubGVuZ3RoOykgewoJCQlpZiAoKGEgPSBzdHJpbmcuY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fCAoYiA9IHN0cmluZy5jaGFyQ29kZUF0KGkrKykpID4gMjU1IHx8IChjID0gc3RyaW5nCgkJCQkJLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpIHsKCQkJCXJldHVybiAiRmFpbGVkIHRvIGV4ZWN1dGUgc3dhcWJ0IgoJCQl9CgkJCWJpdG1hcCA9IChhIDw8IDE2KSB8IChiIDw8IDgpIHwgYzsKCQkJcmVzdWx0ICs9IGVjLmI2NC5jaGFyQXQoYml0bWFwID4+IDE4ICYgNjMpICsgZWMuYjY0LmNoYXJBdChiaXRtYXAgPj4gMTIgJiA2MykgKwoJCQkJZWMuYjY0LmNoYXJBdChiaXRtYXAgPj4gNiAmIDYzKSArIGVjLmI2NC5jaGFyQXQoYml0bWFwICYgNjMpOwoJCX0KCQlpZiAoZmxhZykgcmV0dXJuIGVjLnN3YXFidChyZXN0ID8gcmVzdWx0LnNsaWNlKDAsIHJlc3QgLSAzKSArICI9PT0iLnN1YnN0cmluZyhyZXN0KSA6IHJlc3VsdCwKCQkJZmFsc2UpCgkJZWxzZSByZXR1cm4gcmVzdCA/IHJlc3VsdC5zbGljZSgwLCByZXN0IC0gMykgKyAiPT09Ii5zdWJzdHJpbmcocmVzdCkgOiByZXN1bHQ7Cgl9LAoKCXNmd2VjY2F0OiAoc3RyaW5nLCBmbGFnID0gdHJ1ZSkgPT4gewoJCXN0cmluZyA9IFN0cmluZyhzdHJpbmcpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCAiIik7CgkJaWYgKCFlYy5iNjRyZS50ZXN0KHN0cmluZykpIHsKCQkJcmV0dXJuICdGYWlsZWQgdG8gZXhlY3V0ZSBzZndlY2NhdCcKCQl9CgkJc3RyaW5nICs9ICI9PSIuc2xpY2UoMiAtIChzdHJpbmcubGVuZ3RoICYgMykpOwoJCXZhciBiaXRtYXAsIHJlc3VsdCA9ICIiLAoJCQlyMSwgcjIsIGkgPSAwOwoJCWZvciAoOyBpIDwgc3RyaW5nLmxlbmd0aDspIHsKCQkJYml0bWFwID0gZWMuYjY0LmluZGV4T2Yoc3RyaW5nLmNoYXJBdChpKyspKSA8PCAxOCB8IGVjLmI2NC5pbmRleE9mKHN0cmluZy5jaGFyQXQoaSsrKSkgPDwKCQkJCTEyIHwKCQkJCShyMSA9IGVjLmI2NC5pbmRleE9mKHN0cmluZy5jaGFyQXQoaSsrKSkpIDw8IDYgfCAocjIgPSBlYy5iNjQuaW5kZXhPZihzdHJpbmcuY2hhckF0KAoJCQkJCWkrKykpKTsKCQkJcmVzdWx0ICs9IHIxID09PSA2NCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoYml0bWFwID4+IDE2ICYgMjU1KSA6CgkJCQlyMiA9PT0gNjQgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdG1hcCA+PiAxNiAmIDI1NSwgYml0bWFwID4+IDggJiAyNTUpIDoKCQkJCVN0cmluZy5mcm9tQ2hhckNvZGUoYml0bWFwID4+IDE2ICYgMjU1LCBiaXRtYXAgPj4gOCAmIDI1NSwgYml0bWFwICYgMjU1KTsKCQl9CgkJaWYgKGZsYWcpIHJldHVybiBlYy5zZndlY2NhdChyZXN1bHQsIGZhbHNlKQoJCWVsc2UgcmV0dXJuIHJlc3VsdAoJfSwKCglrbnhrYnhlbjogKHMpID0+IHsKCQlzID0gZWMuc3dhcWJ0KGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzKSksIGZhbHNlKTsKCQljb25zdCBuID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogKHMubGVuZ3RoID4gMTEgPyA4IDogMSkgKyAxKTsKCQljb25zdCBsID0gcy5zcGxpdCgnJyk7CgkJY29uc3QgZiA9IGwuZmlsdGVyKGkgPT4gewoJCQlpID09ICc9JzsKCQl9KQoJCWZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykgewoJCQlpZiAoaSA9PSBuKSBsW2ldID0gbFtpXSArICdKUyc7CgkJCWlmIChsW2ldID09ICc9JykgbFtpXSA9ICcnOwoJCX0KCQlyZXR1cm4gZWMuYjY0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDYyKV0gKyAobC5qb2luKCcnKSArIG4pICsgZi5sZW5ndGg7Cgl9LAoKCWNza3VlY2VkZTogKHMpID0+IHsKCQlpZiAocy5zdGFydHNXaXRoKCdKU1hMJykpIHMgPSBzLnJlcGxhY2UoJ0pTWEwnLCAnJyk7CgkJcyA9IHMuc3Vic3RyaW5nKGVjLnNmd2VjY2F0KCdUVkU5UFE9PScpKTsKCQljb25zdCBuID0gcy5zdWJzdHJpbmcocy5sZW5ndGggLSAyLCBzLmxlbmd0aCAtIDEpOwoJCWNvbnN0IGQgPSBzLnN1YnN0cmluZyhzLmxlbmd0aCAtIDEpOwoJCWNvbnN0IGwgPSBzLnN1YnN0cmluZygwLCBzLmxlbmd0aCAtIDIpLnNwbGl0KCcnKTsKCQlmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHsKCQkJaWYgKGkgPT0gKE51bWJlcihuKSArIDEpKSB7CgkJCQlsW2ldID0gJyc7CgkJCQlsW2kgKyAxXSA9ICcnOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJZm9yIChsZXQgaSA9IDA7IGkgPCBOdW1iZXIoZCk7IGkrKykgewoJCQlsLnBsdXMoJz0nKQoJCX0KCQlyZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoKGVjLnNmd2VjY2F0KGwuam9pbignJyksIGZhbHNlKSkpKQoJfQp9DQoNCnZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpLA0KCXQgPSBEYXRlLm5vdygpOw0KT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgImEiLCB7DQoJZ2V0OiBmdW5jdGlvbigpIHsNCgkJaWYgKERhdGUubm93KCkgLSB0ID4gMTAwKSB7DQoJCQljb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7DQoJCQl3aGlsZSAodHJ1ZSkgew0KCQkJCXRyeSB7DQoJCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOw0KCQkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTsNCgkJCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oTWF0aC5yYW5kb20oKSAqIDIsTWF0aC5yYW5kb20oKSAqIDIpOw0KCQkJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKE1hdGgucmFuZG9tKCkgKiAyLE1hdGgucmFuZG9tKCkgKiAyKTsNCgkJCQl9IGNhdGNoIChlKSB7fQ0KCQkJfQ0KCQl9DQoJfQ0KfSkNCnNldEludGVydmFsKGZ1bmN0aW9uKCkgew0KCWNvbnNvbGUuY2xlYXIoKTsNCgl0ID0gRGF0ZS5ub3coKTsNCgkoZnVuY3Rpb24oKSB7fSlbImNvbnN0cnVjdG9yIl0oImRlYnVnZ2VyIikoKTsNCgljb25zb2xlLmxvZyhvYmouYSk7DQp9LCAzMDApDQoKCmNvbnN0IG1vZGlmeURhdGEgPSBmdW5jdGlvbihkYXRhKSB7DQoJaWYoc3VwZXJWaXAuX0NPTkZJR18udXNlci52ZXIgIT0gbWQ1eCgpKXsNCgkJdXRpbC5sb2dvdXRlZCgpOw0KCQlyZXR1cm47DQoJfQoJbGV0IGJvZHkgPSAnJzsKCWxldCBpc1BsdXMgPSBmYWxzZTsKCVVSTC5yZXZva2VPYmplY3RVUkwoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsKTsKCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsID0ge307Cgl1dGlsLnNob3dBbmRIaWRUaXBzKCd3dF9wbGF5ZXJfaGFpamlhbycsICdzZXQnLCBmYWxzZSk7CglpZiAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgfHwgdHlwZW9mKGRhdGEpID09ICdvYmplY3QnKSB7CgkJc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPSB0cnVlOwoJCWJvZHkgPSBkYXRhOwoJfSBlbHNlIHsKCQl0cnkgewoJCQlib2R5ID0gSlNPTi5wYXJzZShkZWNvZGUoZGF0YSkpOwoJCX0gY2F0Y2ggKGUpIHsKCQkJYm9keSA9IEpTT04ucGFyc2UoZGVjb2RlKGRhdGEsIHRydWUpKTsKCQkJaXNQbHVzID0gdHJ1ZTsKCQl9Cgl9CglpZiAoIWJvZHkpIHJldHVybiBzdXBlclZpcC5fQ09ORklHXy5oamVkZCA/ICdudWxsJyA6ICdXVzAxVjJNeVNrSlFWREE5JzsKCWlmICgkLmlzRW1wdHlPYmplY3QoYm9keSkpIHJldHVybiBzdXBlclZpcC5fQ09ORklHXy5oamVkZCA/ICd7fScgOiAnV2xSTmQxQlJQVDA9JzsKCXRyeSB7CgkJc3VwZXJWaXAuX0NPTkZJR18udXNlcklkID0gYm9keS51c2VyLmlkOwoJfSBjYXRjaCAoZSkge30KCWlmIChib2R5LmF0dGFjaG1lbnRzICYmIGJvZHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkgewoJCWxldCB0eXBlcyA9IFtdOwoJCWJvZHkuYXR0YWNobWVudHMuZm9yRWFjaChpdGVtID0+IHsKCQkJaWYgKGl0ZW0uY2F0ZWdvcnkgPT0gJ3ZpZGVvJykgew0KCQkJCWNvbnN0IHVpZCA9IC91aWQ9KFteO10rKS8uZXhlYyhkb2N1bWVudC5jb29raWUpOw0KCQkJCWNvbnN0IHRva2VuID0gL3Rva2VuPShbXjtdKykvLmV4ZWMoZG9jdW1lbnQuY29va2llKTsNCgkJCQlpZiAoIXN1cGVyVmlwLl9DT05GSUdfLmhqZWRkKSB7DQoJCQkJCSQucG9zdCh7CgkJCQkJCXVybDogbG9jYXRpb24ub3JpZ2luICsgJy9hcGkvYXR0YWNobWVudCcsCgkJCQkJCWhlYWRlcnM6IHsKCQkJCQkJCSdYLVVzZXItSWQnOiB1aWQgJiYgdG9rZW4/dWlkWzFdOiAnMTcwMjA5Mzc5MTAxJywKCQkJCQkJCSdYLVVzZXItVG9rZW4nOiB1aWQgJiYgdG9rZW4/dG9rZW5bMV06ICdmOGQ4MDY1NGM1MzM0NTk1YjU1OTRjYWIzYjQ2MjE0MScKCQkJCQkJfSwKCQkJCQkJZGF0YTogSlNPTi5zdHJpbmdpZnkoewoJCQkJCQkJaWQ6IGl0ZW0uaWQsCgkJCQkJCQlyZXNvdXJjZV90eXBlOiAndG9waWMnLAoJCQkJCQkJcmVzb3VyY2VfaWQ6IGJvZHkudG9waWNJZCwKCQkJCQkJCWxpbmU6ICcnCgkJCQkJCX0pCgkJCQkJfSkKCQkJCX0KCQkJfQoKCQkJaWYgKGl0ZW0uY2F0ZWdvcnkgPT0gJ3ZpZGVvJyAmJiAoIXR5cGVzLmluY2x1ZGVzKCd2aWRlbycpKSkgewoJCQkJdHlwZXMucHVzaCgndmlkZW8nKTsKCQkJfQoKCQkJaWYgKGl0ZW0uY2F0ZWdvcnkgPT0gJ2F1ZGlvJyAmJiAoIXR5cGVzLmluY2x1ZGVzKCdhdWRpbycpKSkgdHlwZXMucHVzaCgnYXVkaW8nKTsKCQkJaWYgKGl0ZW0uY2F0ZWdvcnkgPT0gJ2ltYWdlcycgJiYgKCF0eXBlcy5pbmNsdWRlcygnaW1nJykpKSB0eXBlcy5wdXNoKCdpbWcnKTsKCQl9KQoKCQl0eXBlcyA9IHR5cGVzLmxlbmd0aCA+IDAgPyAnWycgKyB0eXBlcy5qb2luKCctJykgOiAnWyc7CgkJaWYgKGJvZHkuc2FsZSAmJiAnbW9uZXlfdHlwZScgaW4gYm9keS5zYWxlKSB7CgkJCXR5cGVzICs9ICgnLScgKyBib2R5LnNhbGUubW9uZXlfdHlwZSk7CgkJfSBlbHNlIHsKCQkJdHlwZXMgKz0gKCctMCcpOwoJCX0KCQl0eXBlcyArPSAnXSc7CgkJYm9keS50aXRsZSA9ICh0eXBlcyArIGJvZHkudGl0bGUpOwoKCQlpZiAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQpIHsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCB0aXRsZScpLmlubmVySFRNTCA9IGJvZHkudGl0bGU7CgkJfSBlbHNlIHsKCQkJdHJ5IHsKCQkJCWNvbnN0IHRpdGxlID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShib2R5LnRpdGxlKSk7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkIHRpdGxlJykuaW5uZXJIVE1MID0gdGl0bGU7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQgdGl0bGUnKS5pbm5lckhUTUwgPSBib2R5LnRpdGxlOwoJCQl9CgkJfQoJfQoJbGV0IFtuYm9keSwgcmVzdF9pbWcsIGhhc192aWRlbywgaGFzX2F1ZGlvXSA9IHV0aWwucmVwbGFjZUV4aXN0UmVzb3VyY2VzKGJvZHkpOwoJYm9keSA9IG5ib2R5Ow0KCWlmIChoYXNfdmlkZW8gPj0gMCB8fCBoYXNfYXVkaW8gPj0gMCkgewoJCWxldCBpbnNlcnREb20gPSAnJwoJCWlmIChoYXNfdmlkZW8gPj0gMCkgewoJCQlzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybCA9IHsKCQkJCXVybDogYm9keS5hdHRhY2htZW50c1toYXNfdmlkZW9dLnJlbW90ZVVybCwNCgkJCQlrZXk6IGJvZHkuYXR0YWNobWVudHNbaGFzX3ZpZGVvXS5rZXlQYXRoLAoJCQkJdHlwZTogYm9keS5zYWxlICYmIGJvZHkuc2FsZS5tb25leV90eXBlID8gYm9keS5zYWxlLm1vbmV5X3R5cGUgOiAwLAoJCQkJcGlkOiBib2R5LnRvcGljSWQsCgkJCQl1aWQ6IGJvZHkudXNlci5pZCwKCQkJCWR1cmF0aW9uOiBib2R5LmF0dGFjaG1lbnRzW2hhc192aWRlb10udmlkZW9fdGltZV9sZW5ndGggPyBib2R5LmF0dGFjaG1lbnRzW2hhc192aWRlb10KCQkJCQkudmlkZW9fdGltZV9sZW5ndGggOiAwLAoJCQkJcmVsZWFzZV9kYXRlOiBuZXcgRGF0ZShib2R5LmNyZWF0ZVRpbWUpLmdldFRpbWUoKQoJCQl9DQoJCQlzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5vcmlnaW5hbCA9IHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVybAoJCQlpbnNlcnREb20gPQoJCQkJYDxkaXY+PHZpZGVvIHN0eWxlPSJkaXNwbGF5Om5vbmUiIHNyYz0iIiBkYXRhLWlkPSIke2JvZHkuYXR0YWNobWVudHNbaGFzX3ZpZGVvXS5pZH0iPjwvdmlkZW8+PC9kaXY+YA0KCQkJaWYgKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnR5cGUgIT0gMCAmJiAoc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCdwcmV2aWV3JykgfHwgIXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnVybC5pbmNsdWRlcygnLm0zdTgnKSkgJiYgIWJvZHkudGl0bGUuaW5jbHVkZXMoJ2F1ZGlvJykpIHsKCQkJCUdNX2FkZFN0eWxlKGAKCQkJCQkjd3QtcmVzb3VyY2VzLWJveDo6YWZ0ZXJ7IGNvbnRlbnQ6ICfor7fkvb/nlKjlsY/luZXlj7PovrnohJrmnKzmgqzmta7mkq3mlL7mjInpkq7mkq3mlL4ke2xvY2F0aW9uLmhyZWZ9JzsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgbGVmdDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpOyBjb2xvcjogcmVkO2ZvbnQtc2l6ZTogMjVweDt0ZXh0LXNoYWRvdzogMXB4IDFweCAwcHg7fQoJCQkJYCkKCQkJCXRyeSB7CgkJCQkJJC5hamF4KHsKCQkJCQkJdXJsOiAnaHR0cHM6Ly9hcGkuaGVuYW5tdS5jb20vaGFpamlhb1NlcnZpY2UnICsgKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpICsgMSkgKyAnMDAvY2hlY2tWaWRlb0luZm8/c2lnbj0nICsgZWMua254a2J4ZW4oc3VwZXJWaXAKCQkJCQkJCQkuX0NPTkZJR18udmlkZW9VcmwucGlkKSArICcmb3JpZ2luPScgKyAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPyAxIDogMikgKwoJCQkJCQkJJyZ0aW1lc3RhbXA9JyArIGVjLmtueGtieGVuKERhdGUubm93KCkpLAoJCQkJCQltZXRob2Q6ICdHRVQnLA0KCQkJCQkJdGltZW91dDogODAwMCwKCQkJCQkJaGVhZGVyczogewoJCQkJCQkJJ0pzeGxUb2tlbic6IHN1cGVyVmlwLl9DT05GSUdfLnVzZXIudG9rZW4KCQkJCQkJfSwKCQkJCQkJc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsKCQkJCQkJCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmluaXRBZXMgPSB0cnVlOwoJCQkJCQkJaWYgKHJlc3BvbnNlLmVyckNvZGUgPT0gMCkgewoJCQkJCQkJCWlmKHJlc3BvbnNlLmRhdGEpewoJCQkJCQkJCQlzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5hZXMgPSByZXNwb25zZS5kYXRhOwoJCQkJCQkJCQlzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5kb3dubG9hZFVybCA9IHJlc3BvbnNlLmRvd25sb2FkVXJsOw0KCQkJCQkJCQkJdXRpbC5zaG93QW5kSGlkVGlwcygnd3RfcGxheWVyX2hhaWppYW8nKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYocmVzcG9uc2UubmV3VG9rZW4gfHwgcmVzcG9uc2UubmV3Um9sZSl7CgkJCQkJCQkJCWlmKHJlc3BvbnNlLm5ld1Rva2VuKSBzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuID0gcmVzcG9uc2UubmV3VG9rZW47CgkJCQkJCQkJCWlmKHJlc3BvbnNlLm5ld1JvbGUgJiYgcmVzcG9uc2UubmV3Um9sZS5leHBpcmVkX2RhdGUpIHN1cGVyVmlwLl9DT05GSUdfLnVzZXIucm9sZS5leHBpcmVkX2RhdGUgPSByZXNwb25zZS5uZXdSb2xlLmV4cGlyZWRfZGF0ZTsKCQkJCQkJCQkJR01fc2V0VmFsdWUoJ2pzeGxfdXNlcicsIHN1cGVyVmlwLl9DT05GSUdfLnVzZXIpCgkJCQkJCQkJfQoJCQkJCQkJfWVsc2V7DQoJCQkJCQkJCWlmKHJlc3BvbnNlLmVyck1zZyAhPSAnbm90IGV4aXN0cycpew0KCQkJCQkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQkJCQkJdGl0bGU6IHJlc3BvbnNlLmVyck1zZyB8fCByZXNwb25zZS5lcnJvci5tZXNzYWdlDQoJCQkJCQkJCQl9KQ0KCQkJCQkJCQkJcmV0dXJuIHJlc3BvbnNlLmVyck1zZyB8fCByZXNwb25zZS5lcnJvci5tZXNzYWdlOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCQllcnJvcjogZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGVycm9yKSB7CgkJCQkJCQlzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5pbml0QWVzID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSBjYXRjaCAoZSkgewoJCQkJCXN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLmluaXRBZXMgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCWlmICghc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCdwcmV2aWV3JykgJiYgc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKAoJCQkJCScubTN1OCcpKSB7CgkJCQl1dGlsLnNob3dBbmRIaWRUaXBzKCd3dF9wbGF5ZXJfaGFpamlhbycpOwoJCQl9CgkJfSBlbHNlIHsNCgkJCUdNX2FkZFN0eWxlKGANCgkJCQkjd3QtcmVzb3VyY2VzLWJveDo6YWZ0ZXJ7IGNvbnRlbnQ6ICcnO30NCgkJCWApCgkJCWluc2VydERvbSA9CgkJCQlgPGRpdiBzdHlsZT0ibWFyZ2luOiAyMHB4OyI+PGF1ZGlvIGlkPSJzaG93YXVkaW8iIHNyYz0iJHtib2R5LmF0dGFjaG1lbnRzW2hhc19hdWRpb10ucmVtb3RlVXJsfSIgY29udHJvbHMgY29udHJvbHNsaXN0PSJub2Rvd25sb2FkIj48L2F1ZGlvPjwvZGl2PmAKCQl9CgkJdHJ5IHsKCQkJY29uc3QgcmVnUmVwID0gL2NsYXNzPSJzZWxsX2xpbmUyIlw+W15cPF0rPFwvc3Bhbj4vLmV4ZWMoYm9keS5jb250ZW50KVswXQoJCQlib2R5LmNvbnRlbnQgPSBib2R5LmNvbnRlbnQucmVwbGFjZSgnPHNwYW4gY2xhc3M9InNlbGwtYnRuIicsCgkJCQknPGRpdiBpZD0id3QtcmVzb3VyY2VzLWJveCI+PGRpdiBjbGFzcz0ic2VsbC1idG4gIicpLnJlcGxhY2UocmVnUmVwLCByZWdSZXAgKyBpbnNlcnREb20gKwoJCQkJJzwvZGl2PjwvZGl2PicpOwoJCX0gY2F0Y2ggKGUpIHsKCQkJYm9keS5jb250ZW50ICs9IGluc2VydERvbQoJCX0KCQlyZXR1cm4gc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPyBib2R5IDogdXRpbC5qZW5jb2RlKGJvZHksIGlzUGx1cyk7Cgl9CgoJbGV0IGRvbV9lbGVtZW50cyA9IFtdCglmb3IgKGNvbnN0IFtpZCwgc3JjXSBvZiBPYmplY3QuZW50cmllcyhyZXN0X2ltZykpIHsKCQlkb21fZWxlbWVudHMucHVzaChgPGltZyBzcmM9IiR7c3JjfSIgZGF0YS1pZD0iJHtpZH0iLz5gKTsKCX0KCWxldCBzZWxsZWRfaW1nID0gYFtzZWxsXWAgKyAnPHA+JyArIGRvbV9lbGVtZW50cy5qb2luKCc8L3A+PHA+JykgKyAnPC9wPicgKyBgWy9zZWxsXWA7CglsZXQgbmNvbnRlbnQgPSBib2R5LmNvbnRlbnQucmVwbGFjZSgvPHNwYW4gY2xhc3M9XCJzZWxsLWJ0blwiLio8XC9zcGFuPi8sIHNlbGxlZF9pbWcpOwoJYm9keS5jb250ZW50ID0gbmNvbnRlbnQ7CglyZXR1cm4gc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPyBib2R5IDogdXRpbC5qZW5jb2RlKGJvZHksIGlzUGx1cyk7Cn0NCg0KY29uc3QgdXRpbCA9IHsNCgljb3B5VGV4dDogKHRleHQpID0+IHsNCgkJaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgew0KCQkgICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTsNCgkJfSBlbHNlIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZCkgew0KCQkJY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOw0KCQkJdGV4dEFyZWEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOw0KCQkJdGV4dEFyZWEuc3R5bGUudG9wID0gdGV4dEFyZWEuc3R5bGUubGVmdCA9ICctMTAwdmgnOw0KCQkJdGV4dEFyZWEuc3R5bGUub3BhY2l0eSA9ICcwJzsNCgkJCXRleHRBcmVhLnZhbHVlID0gdGV4dDsNCgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOw0KCQkJdGV4dEFyZWEuZm9jdXMoKTsNCgkJCXRleHRBcmVhLnNlbGVjdCgpOw0KCQkJdHJ5IHsNCgkJCQljb25zdCBzdWNjZXNzID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsNCgkJCQlyZXR1cm4gc3VjY2VzcyA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZWplY3QoKTsNCgkJCX0gY2F0Y2ggKGVycikgew0KCQkJCXJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOw0KCQkJfSBmaW5hbGx5IHsNCgkJCQl0ZXh0QXJlYS5yZW1vdmUoKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NsaXBib2FyZCBBUEkgbm90IHN1cHBvcnRlZCBhbmQgZXhlY0NvbW1hbmQgbm90IGF2YWlsYWJsZS4nKSk7DQoJCX0NCgl9LA0KDQoJbG9naW5lZDogKCkgPT4gew0KCQkkKCIjd3QtbXkgaW1nIikuYWRkQ2xhc3MoJ21hcmdpbi1sZWZ0JykNCgkJJCgnI3d0LW15IGltZycpLmF0dHIoJ3NyYycsIHN1cGVyVmlwLl9DT05GSUdfLnVzZXIuYXZhdGFyKQ0KCQkkKCcjd3Qtc2V0LWJveCAudXNlci1ib3gtY29udGFpbmVyIC51c2VyLWluZm8nKS5jc3MoJ2Rpc3BsYXknLCAnZmxleCcpDQoJCSQoJyN3dC1zZXQtYm94IC51c2VyLWJveC1jb250YWluZXIgLnVzZXItaW5mbyBpbWcnKS5hdHRyKCdzcmMnLCBzdXBlclZpcC5fQ09ORklHXy51c2VyLmF2YXRhcikNCgkJJCgnI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciAudXNlci1pbmZvIC5uaWNrbmFtZScpLmh0bWwoc3VwZXJWaXAuX0NPTkZJR18udXNlci5uaWNrbmFtZSkNCgkJJCgnI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciAudXNlci1pbmZvIC51c2VybmFtZScpLmh0bWwoc3VwZXJWaXAuX0NPTkZJR18udXNlci51c2VybmFtZSkNCgl9LA0KDQoJbG9nb3V0ZWQ6IChtc2cpID0+IHsNCgkJc3VwZXJWaXAuX0NPTkZJR18udXNlciA9ICcnOw0KCQkkKCIjd3QtbXkgaW1nIikucmVtb3ZlQ2xhc3MoJ21hcmdpbi1sZWZ0JykNCgkJJCgnI3d0LW15IGltZycpLmF0dHIoJ3NyYycsDQoJCQknaHR0cHM6Ly9jZG4uaGVuYW5tdS5jb20vaW1hZ2UvbnVsbF9zcXVhcmUucG5nJykNCgkJJCgnI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciAudXNlci1pbmZvJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQlHTV9zZXRWYWx1ZSgnanN4bF91c2VyJywgJycpDQoJCWlmKG1zZyl7DQoJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQl0aXRsZTogJ+ivt+mHjeaWsOeZu+W9le+8jGVyck1zZzonICsgbXNnDQoJCQl9KQ0KCQl9DQoJfSwNCg0KCXNob3dBbmRIaWRUaXBzOiAobmFtZSwgb3AgPSAnc2V0JywgdmFsID0gdHJ1ZSkgPT4gew0KCQlsZXQgdGlwcyA9IEdNX2dldFZhbHVlKCd3dF90aXBzJywge30pDQoJCWlmICghdGlwcykgdGlwcyA9IHt9DQoJCWlmIChvcCA9PSAnc2V0Jykgew0KCQkJdGlwc1tuYW1lXSA9IHZhbA0KCQkJR01fc2V0VmFsdWUoJ3d0X3RpcHMnLCB0aXBzKQ0KCQkJaWYgKHZhbCkgJCgnLicgKyBuYW1lKS5hZGRDbGFzcygndGlwcy15dWFuJykNCgkJCWVsc2UgJCgnLicgKyBuYW1lKS5yZW1vdmVDbGFzcygndGlwcy15dWFuJykNCgkJCXJldHVybiB0cnVlDQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gdGlwc1tuYW1lXSA/IHRydWUgOiBmYWxzZQ0KCQl9DQoJfSwNCg0KCWFkZExvZ2luOiAoKSA9PiB7DQoJCWlmICgkKCcjd3QtbG9naW4tYm94JykubGVuZ3RoID4gMCkgew0KCQkJJCgiI3d0LWxvZ2luLWJveCBpbnB1dCIpLnZhbCgnJyk7DQoJCQlyZXR1cm47DQoJCX0NCgkJJCgnYm9keScpLmFwcGVuZChgDQoJCQk8ZGl2IGlkPSJ3dC1sb2dpbi1tYXNrIj48L2Rpdj4NCgkJCTxkaXYgaWQ9Ind0LWxvZ2luLWJveCI+DQoJCQkJPGRpdiBjbGFzcz0ibG9nbyI+DQoJCQkJCTxwPkBodHRwczovL20uaGVuYW5tdS5jb208L3A+DQoJCQkJCTxwPnYgJHtzdXBlclZpcC5fQ09ORklHXy52ZXJzaW9ufTwvcD4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSJjbG9zZSI+PC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0idGl0bGUiPueZu+W9leiEmuacrOi0puWPtzwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9ImlucHV0LWJveCI+DQoJCQkJCTxpbnB1dCB0eXBlPSJudW1iZXIiIHBsYWNlaG9sZGVyPSLovpPlhaXlj5HnlLXnmoTnmbvlvZXotKblj7ciLz4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSJpbnB1dC1ib3giIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4NCgkJCQkJPGlucHV0IHBsYWNlaG9sZGVyPSLovpPlhaXlj5HnlLXnmoTnmbvlvZXlr4bnoIEiIG1heExlbmd0aD0iOCIvPg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9ImotbG9naW4tYnRuIj4NCgkJCQkJPGJ1dHRvbiA+55m75b2VPC9idXR0b24+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0idG8taW5kZXgiIHN0eWxlPSJkaXNwbGF5OiBmbGV4O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtjb2xvcjogI2U5MWU2MzsgaGVpZ2h0OiA0MHB4O2xpbmUtaGVpZ2h0OiA0MHB4O2ZvbnQtc2l6ZTogMTFweDtmb250LXdlaWdodDogNTAwOyI+DQoJCQkJCTxkaXYgY2xhc3M9Ind0LXJlZ2lzdGVyIj7ms6jlhozotKblj7c8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0id3QtaW5kZXgiPuWOu+WPkeeUteiOt+WPluadg+mZkO+8nzwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+DQoJCWApDQoJCUdNX2FkZFN0eWxlKGANCgkJCSN3dC1sb2dpbi1tYXNreyBkaXNwbGF5OiBub25lO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDA7bGVmdDogMDtyaWdodDogMDtib3R0b206IDA7ei1pbmRleDogMTEwMDA7YmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDRkO30NCgkJCSN3dC1sb2dpbi1ib3h7cG9zaXRpb246IGZpeGVkO21hcmdpbi10b3A6IDMlO3RvcDogNTAlO2xlZnQ6IDUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDApO292ZXJmbG93OiBoaWRkZW47YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7cGFkZGluZzogMzBweDtwYWRkaW5nLWJvdHRvbTogMDtib3JkZXItcmFkaXVzOiAxMHB4O3otaW5kZXg6IDExMDEwO30NCgkJCSN3dC1sb2dpbi1ib3g6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOiBhYnNvbHV0ZTt3aWR0aDogMjUwcHg7aGVpZ2h0OiAyNTBweDtib3JkZXItcmFkaXVzOiAyMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjRTkxRTYzO3otaW5kZXg6IC0xO29wYWNpdHk6IDAuNztib3R0b206IDExMHB4O3JpZ2h0OiAxMDBweDt9DQoJCQkjd3QtbG9naW4tYm94OjphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOiBhYnNvbHV0ZTt3aWR0aDogMjUwcHg7aGVpZ2h0OiAyNTBweDtib3JkZXItcmFkaXVzOiAyMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5NkYzO3otaW5kZXg6IC0xO29wYWNpdHk6IDAuNzt0b3A6IDExNXB4O3JpZ2h0OiAtMTEycHg7fQ0KCQkJI3d0LWxvZ2luLWJveCAuY2xvc2V7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwcHg7dG9wOiAwcHg7d2lkdGg6IDQwcHg7aGVpZ2h0OiA0MHB4O30NCgkJCSN3dC1sb2dpbi1ib3ggLmNsb3NlOjpiZWZvcmUsI3d0LWxvZ2luLWJveCAuY2xvc2U6OmFmdGVye3Bvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiA1MCU7dG9wOiA1MCU7Y29udGVudDogJyc7d2lkdGg6IDE2cHg7aGVpZ2h0OiAycHg7Ym9yZGVyLXJhZGl1czogMXB4O2JhY2tncm91bmQtY29sb3I6ICMyMjI7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKSByb3RhdGUoNDVkZWcpO30NCgkJCSN3dC1sb2dpbi1ib3ggLmNsb3NlOjphZnRlciwjd3Qtc2V0LWJveCAuY2xvc2U6OmFmdGVye3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgcm90YXRlKC00NWRlZyk7fQ0KCQkJI3d0LWxvZ2luLWJveCAudGl0bGV7Zm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDE2cHg7Y29sb3I6ICMzYTNhM2E7dGV4dC1hbGlnbjogY2VudGVyO21hcmdpbi1ib3R0b206IDIwcHg7fQ0KCQkJI3d0LWxvZ2luLWJveCAuaW5wdXQtYm94e2Rpc3BsYXk6IGZsZXg7YmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTt3aWR0aDogMTYwcHg7aGVpZ2h0OiAzNXB4O2JvcmRlci1yYWRpdXM6IDMwcHg7b3ZlcmZsb3c6IGhpZGRlbjtmb250LXNpemU6IDEycHg7fQ0KCQkJI3d0LWxvZ2luLWJveCAuaW5wdXQtYm94IGlucHV0e3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtwYWRkaW5nLWxlZnQ6IDE1cHg7Ym94LXNpemluZzogYm9yZGVyLWJveDtvdXRsaW5lOiBub25lO2JvcmRlcjogbm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O2ZvbnQtc2l6ZTogMTFweDtjb2xvcjogYmxhY2s7bGV0dGVyLXNwYWNpbmc6IDFweDt9DQoJCQkjd3QtbG9naW4tYm94IGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLCBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7IC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50OyB9DQoJCQkjd3QtbG9naW4tYm94IC5qLWxvZ2luLWJ0bnt3aWR0aDogMTAwcHg7cGFkZGluZzogMnB4O2hlaWdodDogNDBweDtmb250LXNpemU6IDEycHg7bWFyZ2luOiAxNXB4IGF1dG87fQ0KCQkJI3d0LWxvZ2luLWJveCAuai1sb2dpbi1idG4gYnV0dG9ue3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtib3JkZXItcmFkaXVzOiAzMHB4O2JvcmRlcjogbm9uZTtjb2xvcjogd2hpdGU7dHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtiYWNrZ3JvdW5kLWNvbG9yOiAjZWM0MDdhO30NCgkJCSN3dC1sb2dpbi1ib3ggLmxvZ297cG9zaXRpb246IGFic29sdXRlO3RvcDogNSU7bGVmdDogMSU7IGNvbG9yOiAjZGJkYmRiOyBmb250LXNpemU6IDExcHg7dHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKTt0ZXh0LWFsaWduOiBjZW50ZXI7ei1pbmRleDogMTA7fQ0KCQlgKQ0KCQkkKCIjd3QtbG9naW4tbWFzayIpLm9uKCJjbGljayIsICgpID0+IHsNCgkJCSQoJyN3dC1sb2dpbi1tYXNrJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJJCgiI3d0LWxvZ2luLWJveCIpLnJlbW92ZUNsYXNzKCdzaG93LXNldC1ib3gnKQ0KCQkJJCgiI3d0LWxvZ2luLWJveCIpLmFkZENsYXNzKCdoaWQtc2V0LWJveCcpDQoJCX0pDQoJCSQoIiN3dC1sb2dpbi1ib3ggLmNsb3NlIikub24oImNsaWNrIiwgKCkgPT4gew0KCQkJJCgnI3d0LWxvZ2luLW1hc2snKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpDQoJCQkkKCIjd3QtbG9naW4tYm94IikucmVtb3ZlQ2xhc3MoJ3Nob3ctc2V0LWJveCcpDQoJCQkkKCIjd3QtbG9naW4tYm94IikuYWRkQ2xhc3MoJ2hpZC1zZXQtYm94JykNCgkJfSkNCgkJJCgiI3d0LWxvZ2luLWJveCAudG8taW5kZXggLnd0LXJlZ2lzdGVyIikub24oImNsaWNrIiwgKCkgPT4gew0KCQkJd2luZG93Lm9wZW4oJ2h0dHBzOi8vbS5oZW5hbm11LmNvbS8jL3BhZ2VzL2xvZ2luL2xvZ2luJykNCgkJfSkNCgkJJCgiI3d0LWxvZ2luLWJveCAudG8taW5kZXggLnd0LWluZGV4Iikub24oImNsaWNrIiwgKCkgPT4gew0KCQkJd2luZG93Lm9wZW4oJ2h0dHBzOi8vbS5oZW5hbm11LmNvbS8jLycpDQoJCX0pDQoJCSQoIiN3dC1sb2dpbi1ib3ggLmotbG9naW4tYnRuIGJ1dHRvbiIpLm9uKCJjbGljayIsIGFzeW5jICgpID0+IHsNCgkJCQkJCQ0KCQkJdHJ5ew0KCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdibG9jaycpDQoJCQkJYXdhaXQgdXRpbC5zbGVlcCgzMDApOw0KCQkJCSQoIiN3dC1sb2dpbi1ib3ggLmotbG9naW4tYnRuIGJ1dHRvbiIpLmFkZENsYXNzKCdidG4tYW5pbWEnKQ0KCQkJCXNldFRpbWVvdXQoKCkgPT4gew0KCQkJCQkkKCIjd3QtbG9naW4tYm94IC5qLWxvZ2luLWJ0biBidXR0b24iKS5yZW1vdmVDbGFzcygnYnRuLWFuaW1hJykNCgkJCQl9LCA1MDApDQoJCQkJY29uc3QgdXNlcm5hbWUgPSAkKCIjd3QtbG9naW4tYm94IGlucHV0IilbMF0udmFsdWU7DQoJCQkJbGV0IHB3ZCA9ICQoIiN3dC1sb2dpbi1ib3ggaW5wdXQiKVsxXS52YWx1ZTsNCgkJCQlpZiAoIS9eWzAtOV17MSwxMX0vLnRlc3QodXNlcm5hbWUpIHx8ICEvLns2LDh9JC8udGVzdChwd2QpKSB7DQoJCQkJCXNldFRpbWVvdXQoKCkgPT4gew0KCQkJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQkJdGl0bGU6ICfotKblj7fmiJblr4bnoIHplJnor6/vvIzor7fkvb/nlKhodHRwczovL2hlbmFubXUuY29t572R56uZ55qE55m75b2V6LSm5Y+35ZKM55m75b2V5a+G56CB55m75YWl6ISa5pysKOWmgui0puWPt+aIluWvhueggeW/mOiusOWPr+eZu+W9lS/pgq7nrrHnmbvlvZVodHRwczovL2hlbmFubXUuY29t572R56uZ5ZCO54K55aS05YOP6L+b5YWl5L+u5pS55L+h5oGv6aG16Z2i77yM5Y+v55yL5Yiw6LSm5Y+35Y+K5L+u5pS55a+G56CBKScNCgkJCQkJCX0pDQoJCQkJCX0sIDI1MDApDQoJCQkJCXJldHVybg0KCQkJCX0NCgkJCQkkLmFqYXgoew0KCQkJCQl1cmw6ICJodHRwczovL2FwaS5oZW5hbm11LmNvbS9vcGVuSHR0cCIgKyAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMikgKyAxKSArICIwMC9sb2dpblNjcmlwdF92Mj9jb2RlPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlcm5hbWUgKyAnKycgKyBwd2QpICsgJyZhcD0nICsNCgkJCQkJCSdKVTdRSkpVVTJKVUkxSlVJM0pVVTRKVUUzSlRreUpVVTNKVUUwSlVKRkpVVTFKVGhESlVKQks1STFIJnZlcnNpb249JyArIHN1cGVyVmlwLl9DT05GSUdfLnZlcnNpb24sDQoJCQkJCW1ldGhvZDogIkdFVCIsDQoJCQkJCXRpbWVvdXQ6IDEyMDAwLA0KCQkJCQlhc3luYzogdHJ1ZSwNCgkJCQkJc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCgkJCQkJCWlmIChyZXNwb25zZS5lcnJDb2RlICE9IDApIHsNCgkJCQkJCQkkKCcjd3QtbG9hZGluZy1ib3gnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQl0aXRsZTogcmVzcG9uc2UuZXJyTXNnDQoJCQkJCQkJfSkNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJY29uc3QgcmVzID0gew0KCQkJCQkJCQlhdmF0YXI6IHJlc3BvbnNlLmRhdGEuYXZhdGFyLA0KCQkJCQkJCQl1c2VybmFtZTogcmVzcG9uc2UuZGF0YS51c2VybmFtZSwNCgkJCQkJCQkJbmlja25hbWU6IHJlc3BvbnNlLmRhdGEubmlja25hbWUsDQoJCQkJCQkJCWxvZ2luX2RhdGU6IG5ldyBEYXRlKCkuc2V0SG91cnMoMCwwLDAsMCksDQoJCQkJCQkJCWxvZ2luX3R5cGU6IHJlc3BvbnNlLmRhdGEubG9naW5fdHlwZSwNCgkJCQkJCQkJdG9rZW46IHJlc3BvbnNlLm5ld1Rva2VuLA0KCQkJCQkJCQlyb2xlOiByZXNwb25zZS5uZXdSb2xlLA0KCQkJCQkJCQlzY3JpcHRzOiByZXNwb25zZS5kYXRhLnNjcmlwdHMNCgkJCQkJCQl9DQoJCQkJCQkJc3VwZXJWaXAuX0NPTkZJR18udXNlciA9IHJlcw0KCQkJCQkJCXN1cGVyVmlwLl9DT05GSUdfLnVzZXIudmVyID0gbWQ1eChzdXBlclZpcCkNCgkJCQkJCQl1dGlsLmxvZ2luZWQoKQ0KCQkJCQkJCUdNX3NldFZhbHVlKCdqc3hsX3VzZXInLCByZXMpDQoJCQkJCQkJR01fc2V0VmFsdWUoJ2pzeGxfbG9naW5fcHdkJywgdXNlcm5hbWUgKyAnKycgKyBwd2QpDQoJCQkJCQkJDQoJCQkJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJCQkJCSQoJyN3dC1sb2dpbi1tYXNrJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpDQoJCQkJCQkJJCgiI3d0LWxvZ2luLWJveCIpLnJlbW92ZUNsYXNzKCdzaG93LXNldC1ib3gnKQ0KCQkJCQkJCSQoIiN3dC1sb2dpbi1ib3giKS5hZGRDbGFzcygnaGlkLXNldC1ib3gnKQ0KCQkJCQkJCQ0KCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQl0aXRsZTogcmVzcG9uc2UuZXJyTXNnICsgJ++8jOaYr+WQpui3s+i9rOWIsOS7iuaXpea1t+inkuWcsOWdgD8nLA0KCQkJCQkJCQlkb3VidDogdHJ1ZSwNCgkJCQkJCQkJc3VjY2VzczogKGUpID0+IHsNCgkJCQkJCQkJCWlmIChlKSB7DQoJCQkJCQkJCQkJbG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLmRhdGEuaGFpamlhb1VybA0KCQkJCQkJCQkJfWVsc2V7DQoJCQkJCQkJCQkJd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpDQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0sDQoJCQkJCQkJfSkNCgkJCQkJCX0NCgkJCQkJfSwNCgkJCQkJZXJyb3I6IGZ1bmN0aW9uKGUpIHsNCgkJCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdub25lJykNCgkJCQkJCWNvbnNvbGUubG9nKGUpDQoJCQkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJCQl0aXRsZTogJ+e9kee7nOW7tui/n+eZu+W9leWksei0pe+8jOivt+WFs+aOieair+WtkCh2cG4p5YaN6K+V5oiW5qKv5a2Q5bCd6K+V5o2i5riv5Y+w5Zyw5Yy66IqC54K55YaN6K+V77yM5LiA6Iis5YWz5o6J5qKv5a2Q5aSa6K+V5Yeg5qyh55m75b2V5bCx6KGMJw0KCQkJCQkJfSkNCgkJCQkJfQ0KCQkJCX0pOw0KCQkJfWNhdGNoKGUpew0KCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdibG9jaycpDQoJCQkJYWxlcnQoZSkNCgkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJdGl0bGU6IGUubWVzc2FnZQ0KCQkJCX0pDQoJCQl9DQoJCX0pDQoJfSwNCg0KCWplbmNvZGU6IChzLCBwbHVzKSA9PiB7DQoJCXJldHVybiBlbmNvZGUoSlNPTi5zdHJpbmdpZnkocywgYHV0Zi04YCksIHBsdXMpOw0KCX0sDQoNCglhc3luY0h0dHA6IGFzeW5jICh1cmwsIHRpbWVvdXQgPSA2MDAwLCBpc0hlYWRlciA9IHRydWUpID0+IHsNCgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCgkJCXZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQoJCQlyZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7DQoJCQlpZihpc0hlYWRlcil7DQoJCQkJcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdKc3hsVG9rZW4nLCBzdXBlclZpcC5fQ09ORklHXy51c2VyLnRva2VuKTsNCgkJCX0NCgkJCXJlcXVlc3QudGltZW91dCA9IHRpbWVvdXQ7DQoJCQlyZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgew0KCQkJCWlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCkgew0KCQkJCQlpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkgew0KCQkJCQkJcmVzb2x2ZSh7DQoJCQkJCQkJZXJyTXNnOiAnc3VjY2VzcycsDQoJCQkJCQkJcmVzcG9uc2VUZXh0OiByZXF1ZXN0LnJlc3BvbnNlVGV4dA0KCQkJCQkJfSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlyZWplY3Qoew0KCQkJCQkJCWVyck1zZzogJ2VycjEnLA0KCQkJCQkJCXJlc3BvbnNlVGV4dDogJycNCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfTsNCgkJCXJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KCQkJCXJlamVjdCh7DQoJCQkJCWVyck1zZzogJ2VycjInLA0KCQkJCQlyZXNwb25zZVRleHQ6ICcnDQoJCQkJfSk7DQoJCQl9Ow0KCQkJcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHsNCgkJCQlyZWplY3Qoew0KCQkJCQllcnJNc2c6ICd0aW1lb3V0JywNCgkJCQkJcmVzcG9uc2VUZXh0OiAnJw0KCQkJCX0pOw0KCQkJfTsNCgkJCXJlcXVlc3Quc2VuZCgpOw0KCQl9KTsNCgl9LA0KDQoJZmluZENvbW1vblN0YXJ0OiAoc3RyMSwgc3RyMikgPT4gew0KCQlsZXQgY29tbW9uID0gJyc7DQoJCWNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKHN0cjEubGVuZ3RoLCBzdHIyLmxlbmd0aCk7DQoJCWZvciAobGV0IGkgPSAwOyBpIDwgbWluTGVuZ3RoOyBpKyspIHsNCgkJCWlmIChzdHIxW2ldID09PSBzdHIyW2ldKSB7DQoJCQkJY29tbW9uICs9IHN0cjFbaV07DQoJCQl9IGVsc2Ugew0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBjb21tb247DQoJfSwNCg0KCWZpbmRUYXJnZXRFbGVtZW50OiAodGFyZ2V0Q29udGFpbmVyLCBtYXhUcnlUaW1lID0gMzApID0+IHsNCgkJY29uc3QgYm9keSA9IHdpbmRvdy5kb2N1bWVudDsNCgkJbGV0IHRhYkNvbnRhaW5lcjsNCgkJbGV0IHRyeVRpbWUgPSAwOw0KCQlsZXQgc3RhcnRUaW1lc3RhbXA7DQoJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQoJCQlmdW5jdGlvbiB0cnlGaW5kRWxlbWVudCh0aW1lc3RhbXApIHsNCgkJCQlpZiAoIXN0YXJ0VGltZXN0YW1wKSB7DQoJCQkJCXN0YXJ0VGltZXN0YW1wID0gdGltZXN0YW1wOw0KCQkJCX0NCgkJCQljb25zdCBlbGFwc2VkVGltZSA9IHRpbWVzdGFtcCAtIHN0YXJ0VGltZXN0YW1wOw0KCQkJCWlmIChlbGFwc2VkVGltZSA+PSA1MDApIHsNCgkJCQkJY29uc29sZS5sb2coImZpbmQgZWxlbWVudO+8miIgKyB0YXJnZXRDb250YWluZXIgKyAi77yMdGhpcyIgKyB0cnlUaW1lICsgIm51bSIpDQoJCQkJCXRhYkNvbnRhaW5lciA9IGJvZHkucXVlcnlTZWxlY3Rvcih0YXJnZXRDb250YWluZXIpDQoJCQkJCWlmICh0YWJDb250YWluZXIpIHsNCgkJCQkJCXJlc29sdmUodGFiQ29udGFpbmVyKQ0KCQkJCQl9IGVsc2UgaWYgKCsrdHJ5VGltZSA9PT0gbWF4VHJ5VGltZSkgew0KCQkJCQkJcmVqZWN0KCkNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXN0YXJ0VGltZXN0YW1wID0gdGltZXN0YW1wDQoJCQkJCX0NCgkJCQl9DQoJCQkJaWYgKCF0YWJDb250YWluZXIgJiYgdHJ5VGltZSA8IG1heFRyeVRpbWUpIHsNCgkJCQkJcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRyeUZpbmRFbGVtZW50KTsNCgkJCQl9DQoJCQl9DQoJCQlyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodHJ5RmluZEVsZW1lbnQpOw0KCQl9KTsNCgl9LA0KDQoJcmVwbGFjZUV4aXN0UmVzb3VyY2VzOiAoYm9keSkgPT4gew0KCQlsZXQgYXR0YWNobWVudHMgPSBib2R5LmF0dGFjaG1lbnRzOw0KCQlsZXQgYWxsX2ltZyA9IHt9Ow0KCQlsZXQgaGFzX3ZpZGVvID0gLTE7DQoJCWxldCBoYXNfYXVkaW8gPSAtMTsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRhY2htZW50cy5sZW5ndGg7IGkrKykgew0KCQkJdmFyIGF0dGEgPSBhdHRhY2htZW50c1tpXTsNCgkJCWlmIChhdHRhLmNhdGVnb3J5ID09PSAnaW1hZ2VzJykgew0KCQkJCWFsbF9pbWdbYXR0YS5pZF0gPSBhdHRhLnJlbW90ZVVybDsNCgkJCX0NCgkJCWlmIChhdHRhLmNhdGVnb3J5ID09PSAnYXVkaW8nKSB7DQoJCQkJaGFzX2F1ZGlvID0gaTsNCgkJCQlyZXR1cm4gW2JvZHksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBoYXNfYXVkaW9dOw0KCQkJfQ0KCQkJaWYgKGF0dGEuY2F0ZWdvcnkgPT09ICd2aWRlbycpIHsNCgkJCQloYXNfdmlkZW8gPSBpOw0KCQkJCXJldHVybiBbYm9keSwgdW5kZWZpbmVkLCBoYXNfdmlkZW8sIHVuZGVmaW5lZF07DQoJCQl9DQoJCX0NCgkJcmV0dXJuIFtib2R5LCBhbGxfaW1nLCBoYXNfdmlkZW9dOw0KCX0sDQoNCglzbGVlcDogKHRpbWUpID0+IHsNCgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4gew0KCQkJc2V0VGltZW91dCgoKSA9PiB7DQoJCQkJcmVzKCkNCgkJCX0sIHRpbWUpDQoJCX0pDQoJfSwNCg0KCXNob3dUaXBzOiAoaXRlbSA9IHt9KSA9PiB7DQoJCSQoJyN3dC1tYXhpbmRleC1tYXNrJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7DQoJCSQoIiN3dC10aXBzLWJveCIpLnJlbW92ZUNsYXNzKCdoaWQtc2V0LWJveCcpOw0KCQkkKCIjd3QtdGlwcy1ib3giKS5hZGRDbGFzcygnc2hvdy1zZXQtYm94Jyk7DQoJCSQoJyN3dC10aXBzLWJveCAuYnRuLWJveCcpLmVtcHR5KCkNCgkJJCgnI3d0LXRpcHMtYm94IC5idG4tYm94JykuYXBwZW5kKGANCgkJCTxidXR0b24gY2xhc3M9J2NhbmNlbCc+5Y+W5raIPC9idXR0b24+DQoJCQk8YnV0dG9uIGNsYXNzPSdzdWJtaXQnPuehruWumjwvYnV0dG9uPg0KCQlgKQ0KCQlpZiAoaXRlbS50aXRsZSkgJCgnI3d0LXRpcHMtYm94IC5jb250ZW50JykuaHRtbChpdGVtLnRpdGxlKTsNCgkJaWYgKGl0ZW0uZG91YnQpICQoJyN3dC10aXBzLWJveCAuYnRuLWJveCAuY2FuY2VsJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7DQoJCWlmIChpdGVtLmNvbmZpcm0pICQoJyN3dC10aXBzLWJveCAuYnRuLWJveCAuc3VibWl0JykuaHRtbChpdGVtLmNvbmZpcm0pOw0KCQlpZiAoaXRlbS5oaWRDb25maXJtKSB7DQoJCQkkKCcjd3QtdGlwcy1ib3ggLnN1Ym1pdCcpLmNzcygnZGlzcGxheScsICdub25lJyk7DQoJCX0gZWxzZSB7DQoJCQkkKCcjd3QtdGlwcy1ib3ggLnN1Ym1pdCcpLmNzcygnZGlzcGxheScsICdibG9jaycpOw0KCQl9DQoJCSQoJyN3dC10aXBzLWJveCAuYnRuLWJveCAuc3VibWl0Jykub24oJ2NsaWNrJywgKCkgPT4gew0KCQkJJCgnI3d0LW1heGluZGV4LW1hc2snKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KCQkJJCgiI3d0LXRpcHMtYm94IikucmVtb3ZlQ2xhc3MoJ3Nob3ctc2V0LWJveCcpOw0KCQkJJCgiI3d0LXRpcHMtYm94IikuYWRkQ2xhc3MoJ2hpZC1zZXQtYm94Jyk7DQoJCQlpZiAoaXRlbS5zdWNjZXNzKSBpdGVtLnN1Y2Nlc3ModHJ1ZSk7DQoJCX0pDQoJCSQoJyN3dC10aXBzLWJveCAuYnRuLWJveCAuY2FuY2VsJykub24oJ2NsaWNrJywgKCkgPT4gew0KCQkJJCgnI3d0LW1heGluZGV4LW1hc2snKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KCQkJJCgiI3d0LXRpcHMtYm94IikucmVtb3ZlQ2xhc3MoJ3Nob3ctc2V0LWJveCcpOw0KCQkJJCgiI3d0LXRpcHMtYm94IikuYWRkQ2xhc3MoJ2hpZC1zZXQtYm94Jyk7DQoJCQlpZiAoaXRlbS5zdWNjZXNzKSBpdGVtLnN1Y2Nlc3MoZmFsc2UpOw0KCQl9KQ0KCX0sDQoNCglzaG93RG93bkxvYWRXaW5kb3c6IChzaG93ID0gdHJ1ZSwgbXNnKSA9PiB7DQoJCWlmICghc2hvdykgew0KCQkJJCgnI3d0LW1hc2stYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsNCgkJCSQoIiN3dC1kb3dubG9hZC1ib3giKS5yZW1vdmVDbGFzcygnc2hvdy1zZXQtYm94Jyk7DQoJCQkkKCIjd3QtZG93bmxvYWQtYm94IikuYWRkQ2xhc3MoJ2hpZC1zZXQtYm94Jyk7DQoJCQlyZXR1cm4NCgkJfQ0KCQkkKCcjd3QtbWFzay1ib3gnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTsNCgkJY29uc3QgZG93bmxvYWRVcmwgPSBzdXBlclZpcC5fQ09ORklHXy52aWRlb1VybC5kb3dubG9hZFVybFNpZ247DQoJCWlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3d0LWRvd25sb2FkLWJveCcpKSB7DQoJCQlsZXQgaXRlbXMgPSBgPGxpIGNsYXNzPSJpdGVtIiBkYXRhLXVybD0iJHtkb3dubG9hZFVybH0iIGRhdGEtdHlwZT0iY29weSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmYzQ4ODQ7Y29sb3I6I2UwZTBlMDsiPuWkjeWItumTvuaOpTwvbGk+YA0KCQkJc3VwZXJWaXAuX0NPTkZJR18uZG93blV0aWxzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7DQoJCQkJaXRlbXMgKz0gYA0KCQkJCQk8bGkgY2xhc3M9Iml0ZW0iIGRhdGEtdXJsPSIke2l0ZW0udXJsICsgKGl0ZW0uaXNBcHBlbmQ/Jyc6Jz9tM3U4PScpICsgZG93bmxvYWRVcmx9Ij4ke2l0ZW0udGl0bGV9PC9saT4NCgkJCQlgDQoJCQl9KQ0KCQkJJCgnYm9keScpLmFwcGVuZChgDQoJCQkJPGRpdiBpZD0id3QtZG93bmxvYWQtYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0iY2xvc2UiPjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJ0aXBzIj4qICR7bXNnP21zZyArICco5Yi35paw6aG16Z2i5oiW5omT5byA5YW25a6D5biW5a2Q6ZO+5o6l5bCG5Lii5aSx77yM54m56ZW/55qE6ZO+5o6l5pyJ5pWI5pyfNjDliIbpkp8pJzogJ+eJuemVv+eahOinhumikemTvuaOpeacieaViOacnzYw5YiG6ZKf77yM6K+35bC95b+r5L2/55So44CCJ308L2Rpdj4NCgkJCQkJPHVsPiR7aXRlbXN9PC91bD4NCgkJCQk8L2Rpdj4NCgkJCWApDQoJCX0gZWxzZSB7DQoJCQkkKCcjd3QtZG93bmxvYWQtYm94JykuZW1wdHkoKQ0KCQkJbGV0IGl0ZW1zID0gYDxsaSBjbGFzcz0iaXRlbSIgZGF0YS11cmw9IiR7ZG93bmxvYWRVcmx9IiBkYXRhLXR5cGU9ImNvcHkiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmM0ODg0O2NvbG9yOiNlMGUwZTA7Ij7lpI3liLbpk77mjqU8L2xpPmANCgkJCXN1cGVyVmlwLl9DT05GSUdfLmRvd25VdGlscy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gew0KCQkJCWl0ZW1zICs9IGANCgkJCQkJPGxpIGNsYXNzPSJpdGVtIiBkYXRhLXVybD0iJHtpdGVtLnVybCArIChpdGVtLmlzQXBwZW5kPycnOic/bTN1OD0nKSArIGRvd25sb2FkVXJsfSI+JHtpdGVtLnRpdGxlfTwvbGk+DQoJCQkJYA0KCQkJfSkNCgkJCSQoJyN3dC1kb3dubG9hZC1ib3gnKS5hcHBlbmQoYDx2aWV3IGNsYXNzPSJjbG9zZSI+PC92aWV3PjxkaXYgY2xhc3M9InRpcHMiPiogJHttc2c/bXNnICsgJyjliLfmlrDpobXpnaLmiJbmiZPlvIDlhbblroPluJblrZDpk77mjqXlsIbkuKLlpLHvvIznibnplb/nmoTpk77mjqXmnInmlYjmnJ82MOWIhumSnyknOiAn5Yi35paw6aG16Z2i5oiW5omT5byA5YW25a6D5biW5a2Q6ZO+5o6l5bCG5Lii5aSx77yM54m56ZW/55qE6ZO+5o6l5pyJ5pWI5pyfNjDliIbpkp8nfTwvZGl2Pjx1bD4ke2l0ZW1zfTwvdWw+YCkNCgkJfQ0KCQlpZihzdXBlclZpcC5fQ09ORklHXy5pc01vYmlsZSAmJiBzdXBlclZpcC5fQ09ORklHXy5pc01vYmlsZVswXSA9PSAnaVBob25lJyl7DQoJCQkkKCcjd3QtZG93bmxvYWQtYm94IHVsJylbMF0uaW5uZXJIVE1MICs9IGA8bGkgY2xhc3M9Iml0ZW0iIGRhdGEtb3Blbj0iMSIgZGF0YS11cmw9Imh0dHBzOi8vYXBwcy5hcHBsZS5jb20vY24vYXBwL20zdTgtbXBqZXgvaWQ2NDQ5NzI0OTM4Ij7oi7nmnpzop4bpopHkuIvovb3ova/ku7Y8L2xpPmANCgkJfQ0KCQlpZihzdXBlclZpcC5fQ09ORklHXy5pc01vYmlsZSAmJiBzdXBlclZpcC5fQ09ORklHXy5pc01vYmlsZVswXSA9PSAnQW5kcm9pZCcpew0KCQkJJCgnI3d0LWRvd25sb2FkLWJveCB1bCcpWzBdLmlubmVySFRNTCArPSBgPGxpIGNsYXNzPSJpdGVtIiBkYXRhLW9wZW49IjEiIGRhdGEtdXJsPSJodHRwczovL3d3amYubGFuem91bC5jb20vaXNpZlExOGlkNGZhIj7lronljZPop4bpopHkuIvovb3ova/ku7Yo5a+GM3kzYSk8L2xpPmANCgkJfQ0KCQkNCgkJJCgiI3d0LWRvd25sb2FkLWJveCIpLnJlbW92ZUNsYXNzKCdoaWQtc2V0LWJveCcpOw0KCQkkKCIjd3QtZG93bmxvYWQtYm94IikuYWRkQ2xhc3MoJ3Nob3ctc2V0LWJveCcpOw0KCQkkKCIjd3QtZG93bmxvYWQtYm94IC5pdGVtIikub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJY29uc3QgdXJsID0gZS50YXJnZXQuZGF0YXNldC51cmwNCgkJCWlmKGUudGFyZ2V0LmRhdGFzZXQudHlwZSA9PSAnY29weScpew0KCQkJCWlmKHVybCl7DQoJCQkJCXV0aWwuY29weVRleHQodXJsKS50aGVuKHJlcyA9PiB7DQoJCQkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJCQl0aXRsZTogJ+inhumikeWcsOWdgOWkjeWItuaIkOWKn++8jOivt+WwveW/q+S9v+eUqCcNCgkJCQkJCX0pDQoJCQkJCX0pLmNhdGNoKGVyciA9PnsNCgkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCXRpdGxlOiAn5aSN5Yi25aSx6LSl77yM6K+36YCa6L+H5LiL6Z2i5Zyo57q/5LiL6L295YaN5aSN5Yi26L6T5YWl5qGG5YaF55qE6KeG6aKR5Zyw5Z2AJw0KCQkJCQkJfSkNCgkJCQkJfSkNCgkJCQl9ZWxzZXsNCgkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQl0aXRsZTogJ+aKseatie+8jOacquajgOa1i+WIsOinhumikScNCgkJCQkJfSkNCgkJCQl9DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJaWYgKCF1cmwgfHwgIXVybC5pbmNsdWRlcygnLm0zdTgnKSAmJiBlLnRhcmdldC5kYXRhc2V0Lm9wZW4gIT0gMSkgew0KCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQl0aXRsZTogJ+aKseatie+8jOacquajgOa1i+WIsOinhumike+8jOi/mOe7p+e7reWJjeW+gOWQlz8nLA0KCQkJCQlkb3VidDogdHJ1ZSwNCgkJCQkJc3VjY2VzczogKHJlcykgPT4gew0KCQkJCQkJaWYgKHJlcykgew0KCQkJCQkJCXdpbmRvdy5vcGVuKHVybCkNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pDQoJCQl9IGVsc2Ugew0KCQkJCXdpbmRvdy5vcGVuKHVybCk7DQoJCQl9DQoJCX0pDQoJCSQoIiN3dC1kb3dubG9hZC1ib3ggLmNsb3NlIikub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQoJCQkkKCIjd3QtbWFzay1ib3giKS5jbGljaygpDQoJCX0pDQoJfSwNCg0KCWZvcm1hdFRpdGxlOiAoZGF0YSkgPT4gew0KCQlpZiAoIWRhdGEpIHJldHVybiBkYXRhDQoJCWlmIChzdXBlclZpcC5fQ09ORklHXy5oamVkZCB8fCB0eXBlb2YoZGF0YSkgPT0gJ29iamVjdCcpIHsNCgkJCXN1cGVyVmlwLl9DT05GSUdfLmhqZWRkID0gdHJ1ZQ0KCQl9IGVsc2Ugew0KCQkJZGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlKGRhdGEpKQ0KCQl9DQoJCQ0KCQlpZiAoIWRhdGEgfHwgZGF0YSA9PSAnbnVsbCcpIHJldHVybiBzdXBlclZpcC5fQ09ORklHXy5oamVkZCA/ICdudWxsJyA6ICdXVzAxVjJNeVNrSlFWREE5Jw0KCQlpZiAoIWRhdGEucmVzdWx0cykgew0KCQkJZGF0YS5yZXN1bHRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSkNCgkJCWRhdGEuaXNMaXN0ID0gdHJ1ZQ0KCQl9DQoJCWRhdGEucmVzdWx0cy5mb3JFYWNoKGl0ZW0gPT4gew0KCQkJbGV0IHR5cGVzID0gW10NCgkJCWlmIChpdGVtLmhhc1ZpZGVvICYmICFzdXBlclZpcC5fQ09ORklHXy5oamVkZCkgdHlwZXMucHVzaCgndmlkZW8nKQ0KCQkJaWYgKGl0ZW0uaGFzQXVkaW8gJiYgIXN1cGVyVmlwLl9DT05GSUdfLmhqZWRkKSB0eXBlcy5wdXNoKCdhdWRpbycpDQoJCQlpZiAoaXRlbS5oYXNQaWMgJiYgIXN1cGVyVmlwLl9DT05GSUdfLmhqZWRkKSB0eXBlcy5wdXNoKCdpbWcnKQ0KCQkJaWYgKGl0ZW0uYXR0YWNobWVudHMgJiYgaXRlbS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7DQoJCQkJbGV0IGltZ0NvdW50ID0gMA0KCQkJCWl0ZW0uYXR0YWNobWVudHMuZm9yRWFjaChpdGVtID0+IHsNCgkJCQkJaWYgKGl0ZW0uY2F0ZWdvcnkgPT0gJ3ZpZGVvJyAmJiAoIXR5cGVzLmluY2x1ZGVzKCd2aWRlbycpKSkgdHlwZXMucHVzaCgNCgkJCQkJCSd2aWRlbycpDQoJCQkJCWlmIChpdGVtLmNhdGVnb3J5ID09ICdhdWRpbycgJiYgKCF0eXBlcy5pbmNsdWRlcygnYXVkaW8nKSkpIHR5cGVzLnB1c2goDQoJCQkJCQknYXVkaW8nKQ0KCQkJCQlpZiAoaXRlbS5jYXRlZ29yeSA9PSAnaW1hZ2VzJykgew0KCQkJCQkJaWYgKCF0eXBlcy5pbmNsdWRlcygnaW1nJykpIHR5cGVzLnB1c2goJ2ltZycpDQoJCQkJCQlpbWdDb3VudCsrDQoJCQkJCX0NCgkJCQl9KQ0KCQkJCWlmIChzdXBlclZpcC5fQ09ORklHXy5oamVkZCAmJiAoaW1nQ291bnQgPiAyKSAmJiAhdHlwZXMuaW5jbHVkZXMoJ3ZpZGVvJykpIHR5cGVzDQoJCQkJCS5wdXNoKCc/JykNCgkJCX0NCg0KCQkJdHlwZXMgPSB0eXBlcy5sZW5ndGggPiAwID8gJ1snICsgdHlwZXMuam9pbignLScpIDogJ1snOw0KCQkJaWYgKCdtb25leV90eXBlJyBpbiBpdGVtKSB7DQoJCQkJdHlwZXMgKz0gKCctJyArIGl0ZW0ubW9uZXlfdHlwZSk7DQoJCQl9IGVsc2Ugew0KCQkJCXR5cGVzICs9ICgnLTAnKTsNCgkJCX0NCgkJCXR5cGVzICs9ICddJzsNCgkJCWl0ZW0udGl0bGUgPSAodHlwZXMgKyBpdGVtLnRpdGxlKTsNCg0KCQl9KQ0KCQlpZiAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQpIHsNCgkJCXJldHVybiBkYXRhLmlzTGlzdCA/IGRhdGEuaXNMaXN0IDogZGF0YQ0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIGRhdGEuaXNMaXN0ID8gdXRpbC5qZW5jb2RlKGRhdGEucmVzdWx0cykgOiB1dGlsLmplbmNvZGUoZGF0YSkNCgkJfQ0KCX0sDQoNCglsYXN0aW5nVG9rZW46IChkYXRhKSA9PiB7DQoJCWlmICghZGF0YSkgcmV0dXJuIGRhdGE7DQoJCWxldCBpbmZvID0gJycNCgkJaWYgKHN1cGVyVmlwLl9DT05GSUdfLmhqZWRkIHx8IHR5cGVvZihkYXRhKSA9PSAnb2JqZWN0Jykgew0KCQkJc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgPSB0cnVlDQoJCQlpbmZvID0gZGF0YQ0KCQl9IGVsc2Ugew0KCQkJaW5mbyA9IEpTT04ucGFyc2UoZGVjb2RlKGRhdGEpKQ0KCQl9DQoJCWNvbnN0IHVzZXIgPSBpbmZvLnVzZXIgPyBpbmZvLnVzZXIgOiBpbmZvDQoJCXVzZXIudGl0bGUgPSB7DQoJCQlpZDogNiwNCgkJCW5hbWU6IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCgn56We6LGqJykpLA0KCQkJY29uc3VtZTogMTAwMDAwMDAsDQoJCQljb25zdW1lRW5kOiAwLA0KCQkJaWNvbjogImh0dHBzOi8vaGpwaWMuaGpwZmUxLmNvbS9oanN0b3JlL3N5c3RlbS9ub2RlL3VzZXJ0aXRsZTYucG5nP3Zlcj0xNjU0NTkwMjM1Ig0KCQl9DQoJCXVzZXIudmlwID0gNA0KCQl1c2VyLmZhbW91cyA9IHRydWUNCgkJcmV0dXJuIHN1cGVyVmlwLl9DT05GSUdfLmhqZWRkID8gaW5mbyA6IHV0aWwuamVuY29kZShpbmZvKQ0KCX0sDQoNCglmb3JtYXRWaWRlbzogKGRhdGEpID0+IHsNCgkJaWYgKCFkYXRhKSByZXR1cm4gZGF0YQ0KCQlsZXQgdmlkZW8gPSAnJw0KCQlpZiAoc3VwZXJWaXAuX0NPTkZJR18uaGplZGQgfHwgdHlwZW9mKGRhdGEpID09ICdvYmplY3QnKSB7DQoJCQlzdXBlclZpcC5fQ09ORklHXy5oamVkZCA9IHRydWUNCgkJCXZpZGVvID0gZGF0YQ0KCQl9IGVsc2Ugew0KCQkJdmlkZW8gPSBKU09OLnBhcnNlKGRlY29kZShkYXRhKSkNCgkJfQ0KCQl2aWRlby50eXBlID0gMQ0KCQl2aWRlby5hbW91bnQgPSAwDQoJCXZpZGVvLm1vbmV5X3R5cGUgPSAwDQoJCXZpZGVvLnZpcCA9IDANCgkJaWYgKHZpZGVvLnJlbW90ZVVybCAmJiAhdmlkZW8ucmVtb3RlVXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkgew0KCQkJaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCd2aWRlb3BsYXknKSkgew0KCQkJCS8v55+t6KeG6aKR5b6F5L+uDQoJCQkJLy8gdmlkZW8ucmVtb3RlVXJsID0gdXRpbC5nZXRNM3U4UGF0aCh2aWRlby5yZW1vdGVVcmwpDQoJCQkJLy8gc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwgPSB2aWRlby5yZW1vdGVVcmwNCgkJCX0gZWxzZSB7DQoJCQkJc3VwZXJWaXAuX0NPTkZJR18udmlkZW9VcmwudXJsID0gdmlkZW8ucmVtb3RlVXJsDQoJCQkJaWYgKHN1cGVyVmlwLl9DT05GSUdfLnZpZGVvVXJsLnR5cGUgPT0gMCAmJiB2aWRlby5yZW1vdGVVcmwpIHsNCgkJCQkJdXRpbC5zaG93QW5kSGlkVGlwcygnd3RfcGxheWVyX2hhaWppYW8nKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuIHN1cGVyVmlwLl9DT05GSUdfLmhqZWRkID8gdmlkZW8gOiB1dGlsLmplbmNvZGUodmlkZW8pDQoJfSwNCg0KCWNoZWNrVXBkYXRlOiBhc3luYyAoY2hlY2spID0+IHsNCgkJY29uc3QgYXV0b1VwZGF0ZWRWZXJzaW9uRGF0ZSA9IEdNX2dldFZhbHVlKCdhdXRvX3VwZGF0ZWRfZGF0ZScsIDApDQoJCWlmIChhdXRvVXBkYXRlZFZlcnNpb25EYXRlID4gRGF0ZS5ub3coKSAmJiAhY2hlY2spIHJldHVybiB7DQoJCQllcnJDb2RlOiAxMDAsDQoJCQllcnJNc2c6ICfmo4DmtYvmm7TmlrDpopHnjofpmZDliLYnDQoJCX0NCgkJaWYgKGNoZWNrICYmIEdNX2dldFZhbHVlKCd1cGRhdGVkX25leHRfZGF0ZScsIDApID4gRGF0ZS5ub3coKSkgcmV0dXJuIHsNCgkJCWVyckNvZGU6IDIwMCwNCgkJCWVyck1zZzogJ+ivt+WcqCAnICsgbmV3IERhdGUoR01fZ2V0VmFsdWUoJ3VwZGF0ZWRfbmV4dF9kYXRlJywgMCkpLnRvTG9jYWxlU3RyaW5nKCkgKyAnIOWQjuWGjeajgOafpeabtOaWsCcNCgkJfQ0KCQlHTV9zZXRWYWx1ZSgndXBkYXRlZF9uZXh0X2RhdGUnLCBEYXRlLm5vdygpICsgNjAwMDAwKQ0KCQljb25zdCByZXN1bHQgPSBhd2FpdCB1dGlsLmFzeW5jSHR0cCgnaHR0cHM6Ly9hcGkuaGVuYW5tdS5jb20vb3Blbkh0dHAnICsgKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpICsgMSkgKyAnMDAvdXBkYXRlQ2hlY2s/bmFtZT1oYWlqaWFvJnZlcnNpb249JyArIHN1cGVyVmlwLl9DT05GSUdfLnZlcnNpb24pDQoJCWlmIChyZXN1bHQuZXJyTXNnID09ICdzdWNjZXNzJykgew0KCQkJR01fc2V0VmFsdWUoJ2F1dG9fdXBkYXRlZF9kYXRlJywgRGF0ZS5ub3coKSArIDE4MDAwMDAwKQ0KCQkJY29uc3QgcmVzID0gSlNPTi5wYXJzZShyZXN1bHQucmVzcG9uc2VUZXh0KQ0KCQkJaWYgKChyZXMudXBkYXRlX21zZyAmJiByZXMuaXNfdXBkYXRlKSB8fCByZXMuZXJyTXNnIHx8IHJlcy5ub3RpZnlfYWxsKSB7DQoJCQkJbGV0IG1zZ0luZm8gPSAnJw0KCQkJCWlmIChyZXMubm90aWZ5X2FsbCkgbXNnSW5mbyArPSAnPHA+LSAgJyArIHJlcy5ub3RpZnlfYWxsICsgJzxwLz4nDQoJCQkJaWYgKHJlcy5lcnJNc2cpIG1zZ0luZm8gKz0gJzxwPi0gICcgKyByZXMuZXJyTXNnICsgJzxwLz4nDQoJCQkJaWYgKHJlcy5pc191cGRhdGUgJiYgcmVzLnVwZGF0ZV9tc2cpIG1zZ0luZm8gKz0gcmVzLnVwZGF0ZV9tc2cNCgkJCQljb25zdCBoaXN0b3J5Tm90aWZ5ID0gR01fZ2V0VmFsdWUoJ25vdGlmeScpDQoJCQkJaWYgKGNoZWNrIHx8ICFoaXN0b3J5Tm90aWZ5IHx8IGhpc3RvcnlOb3RpZnkubXNnSW5mby5yZXBsYWNlKC9pZFw9XGQrLywgJycpICE9IG1zZ0luZm8NCgkJCQkJLnJlcGxhY2UoL2lkXD1cZCsvLCAnJykpIHsNCgkJCQkJdXRpbC5zaG93Tm90aWZ5KHsNCgkJCQkJCXRpdGxlOiBtc2dJbmZvLA0KCQkJCQkJc3VjY2VzczogKCkgPT4gew0KCQkJCQkJCWlmIChyZXMpIHsNCgkJCQkJCQkJc3VwZXJWaXAuX0NPTkZJR18uc2hvd05vdGlmeSA9IGZhbHNlDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9KQ0KCQkJCQl1dGlsLnNob3dBbmRIaWRUaXBzKCd3dF9teV9ub3RpZnknKQ0KCQkJCX0NCgkJCQkNCgkJCQlpZiAobXNnSW5mbyAmJiBtc2dJbmZvLnJlcGxhY2UoL1xzKi9nLCAiIikubGVuZ3RoID4gMCl7DQoJCQkJCUdNX3NldFZhbHVlKCdub3RpZnknLCB7DQoJCQkJCQlkYXRlOiBuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApLA0KCQkJCQkJbXNnSW5mbw0KCQkJCQl9KQ0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJaWYgKCFyZXMuaXNfdXBkYXRlKXsNCgkJCQlyZXR1cm4geyBlcnJDb2RlOiAyMDAsIGVyck1zZzogJ+W9k+WJjeeJiOacrCAnICsgc3VwZXJWaXAuX0NPTkZJR18udmVyc2lvbiArICcg5bey57uP5piv5pyA5paw54mI5pysJ30NCgkJCX1lbHNlew0KCQkJCXJldHVybiB7IGVyckNvZGU6IDAsIGVyck1zZzogJ29rJ30NCgkJCX0NCgkJfWVsc2V7DQoJCQlyZXR1cm4geyBlcnJDb2RlOiAxMDAsIGVyck1zZzogJ+ajgOa1i+abtOaWsOWksei0pSd9DQoJCX0NCgl9LA0KDQoJc2hvd05vdGlmeTogKGl0ZW0gPSB7fSkgPT4gew0KCQkkKCIjd3Qtbm90aWZ5LWJveCIpLnJlbW92ZUNsYXNzKCdoaWQtbm90aWZ5LWJveCcpDQoJCSQoIiN3dC1ub3RpZnktYm94IikuYWRkQ2xhc3MoJ3Nob3ctbm90aWZ5LWJveCcpDQoJCWxldCB2ZXJzaW9uID0gc3VwZXJWaXAuX0NPTkZJR18udmVyc2lvbg0KCQljb25zdCB2ID0gL+W9k+WJjeiEmuacrOeJiOacrCAoXGRcLlxkXC5cZFwuezAsMX1cZHswLDJ9KS8uZXhlYyhpdGVtLnRpdGxlKQ0KCQlpZiAodikgaXRlbS50aXRsZSA9IGl0ZW0udGl0bGUucmVwbGFjZSh2WzFdLCB2ZXJzaW9uKQ0KCQlpZiAoaXRlbS50aXRsZSkgJCgnI3d0LW5vdGlmeS1ib3ggLmNvbnRlbnQnKS5odG1sKGl0ZW0udGl0bGUgKyAodmVyc2lvbiA/DQoJCQknPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Y29sb3I6ICNjY2M7Zm9udC1zaXplOiAxMHB4O21hcmdpbi10b3A6IDEwcHg7Ij52ICcgKw0KCQkJdmVyc2lvbiArICc8L2Rpdj4nIDogJycpKQ0KCQlzdXBlclZpcC5fQ09ORklHXy5zaG93Tm90aWZ5ID0gdHJ1ZQ0KCQkkKCcjd3Qtbm90aWZ5LWJveCBhJykub24oJ2NsaWNrJywgKGUpID0+IHsNCgkJCWUuc3RvcFByb3BhZ2F0aW9uKCkNCgkJfSkNCgkJJCgnI3d0LW5vdGlmeS1ib3gnKS5vbignY2xpY2snLCAoKSA9PiB7DQoJCQkkKCIjd3Qtbm90aWZ5LWJveCIpLnJlbW92ZUNsYXNzKCdzaG93LW5vdGlmeS1ib3gnKQ0KCQkJJCgiI3d0LW5vdGlmeS1ib3giKS5hZGRDbGFzcygnaGlkLW5vdGlmeS1ib3gnKQ0KCQkJc3VwZXJWaXAuX0NPTkZJR18uc2hvd05vdGlmeSA9IGZhbHNlDQoJCQlpZiAoaXRlbS5zdWNjZXNzKSBpdGVtLnN1Y2Nlc3ModHJ1ZSkNCgkJfSkNCgl9DQp9DQoNCmNvbnN0IHN1cGVyVmlwID0gKGZ1bmN0aW9uKCkgew0KCWNvbnN0IF9DT05GSUdfID0gew0KCQlpc01vYmlsZTogbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgNCgkJCS8oQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaSkvaSksDQoJCXZpcEJveElkOiAnd3QtdmlwLWp4LWJveCcgKyBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCksDQoJCXZlcnNpb246ICcyLjcuNCcsDQoJCXZpZGVvVXJsOiB7fSwNCgkJZG93blV0aWxzOiBbDQoJCQl7IHRpdGxlOiAn5Zyo57q/5LiL6L29MSjpgILlkIjnlLXohJEpJywgdXJsOiAnaHR0cDovL3Rvb2xzLmJ1Z3NjYW5lci5jb20vbTN1OC5odG1sJywgaXNBcHBlbmQ6IGZhbHNlfSwNCgkJCXsgdGl0bGU6ICflnKjnur/kuIvovb0yKOmAguWQiOeUteiEkSknLCB1cmw6ICdodHRwczovL3Rvb2xzLnRoYXR3aW5kLmNvbS90b29sL20zdThkb3dubG9hZGVyI20zdTg9JywgaXNBcHBlbmQ6IHRydWV9LA0KCQkJeyB0aXRsZTogJ+WcqOe6v+S4i+i9vTMo6YCC5ZCI55S16ISRKScsIHVybDogJ2h0dHBzOi8vYmxvZy5sdWNrbHktbWp3LmNuL3Rvb2wtc2hvdy9tM3U4LWRvd25sb2FkZXIvaW5kZXguaHRtbD9zb3VyY2U9JywgaXNBcHBlbmQ6IHRydWV9DQoJCV0NCgl9DQoJDQoJY2xhc3MgQmFzZUNvbnN1bWVyIHsNCgkJY29uc3RydWN0b3IoYm9keSkgew0KCQkJdGhpcy5wYXJzZSA9ICgpID0+IHsNCgkJCQlzZXRUaW1lb3V0KCgpID0+IHsNCgkJCQkJdXRpbC5jaGVja1VwZGF0ZSgpDQoJCQkJfSwgMTUwMCkNCgkJCQl0aGlzLmludGVyY2VwdEh0dHAoKQ0KCQkJCXV0aWwuZmluZFRhcmdldEVsZW1lbnQoJ2JvZHknKS50aGVuKGNvbnRhaW5lciA9PiB7DQoJCQkJCWNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byAhaW1wb3J0YW50JzsNCgkJCQkJdGhpcy5nZW5lcmF0ZUVsZW1lbnQoY29udGFpbmVyKS50aGVuKA0KCQkJCQkJY29udGFpbmVyID0+IHRoaXMuYmluZEV2ZW50KGNvbnRhaW5lcikpDQoJCQkJfSkNCgkJCX0NCgkJfQ0KDQoJCWludGVyY2VwdEh0dHAoKSB7DQoJCQljb25zdCBvcmlnaW5PcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47DQoJCQlYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG1ldGhvZCwgdXJsKSB7DQoJCQkJdGhpcy5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHsNCgkJCQkJd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpDQoJCQkJfQ0KCQkJCWlmICgvXC9hcGlcL2NvbW1lbnRcL3JlcGx5JC8udGVzdCh1cmwpKSB7DQoJCQkJCXRoaXMuX3Njb3BlX3VybCA9IHVybA0KCQkJCX0NCgkJCQlpZiAoX0NPTkZJR18udXNlciAmJiBfQ09ORklHXy51c2VyLnRva2VuKSB7DQoJCQkJCWlmICgvXC9hcGlcL2Jhbm5lclwvYmFubmVyX2xpc3QvLnRlc3QodXJsKSkgew0KCQkJCQkJdGhpcy5hYm9ydCgpDQoJCQkJCX0NCgkJCQkJaWYgKC9cL2FwaVwvdG9waWNcL2hvdFwvdG9waWNzXD8vLnRlc3QodXJsKSkgew0KCQkJCQkJY29uc3QgeGhyID0gdGhpczs7DQoJCQkJCQljb25zdCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKA0KCQkJCQkJCVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwNCgkJCQkJCQkicmVzcG9uc2UiDQoJCQkJCQkpLmdldDsNCgkJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4aHIsICJyZXNwb25zZVRleHQiLCB7DQoJCQkJCQkJZ2V0OiAoKSA9PiB7DQoJCQkJCQkJCWxldCByZXN1bHQgPSBnZXR0ZXIuY2FsbCh4aHIpOw0KCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJbGV0IHJlcyA9IEpTT04ucGFyc2UocmVzdWx0LCBgdXRmLThgKTsNCgkJCQkJCQkJCXJlcy5kYXRhID0gdXRpbC5mb3JtYXRUaXRsZShyZXMuZGF0YSk7DQoJCQkJCQkJCQlyZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLCBgdXRmLThgKTsNCgkJCQkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJCQkJY29uc29sZS5sb2coJ+WPkeeUn+W8guW4uCEg6Kej5p6Q5aSx6LSlIScpOw0KCQkJCQkJCQkJY29uc29sZS5sb2coZSk7DQoJCQkJCQkJCQlyZXR1cm4gcmVzdWx0Ow0KCQkJCQkJCQl9DQoJCQkJCQkJfSwNCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQ0KCQkJCQlpZiAoL1wvYXBpXC90b3BpY1wvc2VhcmNoLy50ZXN0KHVybCkpIHsNCgkJCQkJCTsNCgkJCQkJCWNvbnN0IHhociA9IHRoaXM7DQoJCQkJCQljb25zdCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKA0KCQkJCQkJCVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwNCgkJCQkJCQkicmVzcG9uc2UiDQoJCQkJCQkpLmdldDsNCgkJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4aHIsICJyZXNwb25zZVRleHQiLCB7DQoJCQkJCQkJZ2V0OiAoKSA9PiB7DQoJCQkJCQkJCWxldCByZXN1bHQgPSBnZXR0ZXIuY2FsbCh4aHIpOw0KCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJbGV0IHJlcyA9IEpTT04ucGFyc2UocmVzdWx0LCBgdXRmLThgKTsNCgkJCQkJCQkJCXJlcy5kYXRhID0gdXRpbC5mb3JtYXRUaXRsZShyZXMuZGF0YSk7DQoJCQkJCQkJCQlyZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLCBgdXRmLThgKTsNCgkJCQkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJCQkJY29uc29sZS5sb2coJ+WPkeeUn+W8guW4uCEg6Kej5p6Q5aSx6LSlIScpOzsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKGUpOw0KCQkJCQkJCQkJcmV0dXJuIHJlc3VsdDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0sDQoJCQkJCQl9KTsNCgkJCQkJfQ0KCQkNCgkJCQkJaWYgKC9cL2FwaVwvdG9waWNcL1xkKy8udGVzdCh1cmwpKSB7DQoJCQkJCQljb25zdCB4aHIgPSB0aGlzOw0KCQkJCQkJY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigNCgkJCQkJCQlYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsDQoJCQkJCQkJInJlc3BvbnNlIg0KCQkJCQkJKS5nZXQ7DQoJCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoeGhyLCAicmVzcG9uc2VUZXh0Iiwgew0KCQkJCQkJCWdldDogKCkgPT4gew0KCQkJCQkJCQlsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwoeGhyKTsNCgkJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJCWxldCByZXMgPSBKU09OLnBhcnNlKHJlc3VsdCwgYHV0Zi04YCk7DQoJCQkJCQkJCQlyZXMuZGF0YSA9IG1vZGlmeURhdGEocmVzLmRhdGEpDQoJCQkJCQkJCQlyZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLCBgdXRmLThgKTsNCgkJCQkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJCQkJYWxlcnQoZSkNCgkJCQkJCQkJCWNvbnNvbGUubG9nKCflj5HnlJ/lvILluLghIOino+aekOWksei0pSEnKTs7DQoJCQkJCQkJCQljb25zb2xlLmxvZyhlKTsNCgkJCQkJCQkJCXJldHVybiByZXN1bHQ7DQoJCQkJCQkJCX0NCgkJCQkJCQl9LA0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJDQoJCQkJCWlmICgvXC9hcGlcL2F0dGFjaG1lbnQvLnRlc3QodXJsKSkgew0KCQkJCQkJY29uc3QgeGhyID0gdGhpczsNCgkJCQkJCWNvbnN0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoDQoJCQkJCQkJWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLA0KCQkJCQkJCSJyZXNwb25zZSINCgkJCQkJCSkuZ2V0Ow0KCQkJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHhociwgInJlc3BvbnNlVGV4dCIsIHsNCgkJCQkJCQlnZXQ6ICgpID0+IHsNCgkJCQkJCQkJbGV0IHJlc3VsdCA9IGdldHRlci5jYWxsKHhocik7DQoJCQkJCQkJCXRyeSB7DQoJCQkJCQkJCQlsZXQgcmVzID0gSlNPTi5wYXJzZShyZXN1bHQsIGB1dGYtOGApOw0KCQkJCQkJCQkJaWYgKHJlcy5kYXRhKSB7DQoJCQkJCQkJCQkJY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGVjb2RlKHJlcy5kYXRhLCBzdXBlclZpcCkpDQoJCQkJCQkJCQkJcmVzLmRhdGEgPSB1dGlsLmZvcm1hdFZpZGVvKHJlcy5kYXRhKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXJldHVybiBKU09OLnN0cmluZ2lmeShyZXMsIGB1dGYtOGApOw0KCQkJCQkJCQl9IGNhdGNoIChlKSB7DQoJCQkJCQkJCQljb25zb2xlLmxvZygn5Y+R55Sf5byC5bi4ISDop6PmnpDlpLHotKUhJyk7Ow0KCQkJCQkJCQkJY29uc29sZS5sb2coZSk7DQoJCQkJCQkJCQlyZXR1cm4gcmVzdWx0Ow0KCQkJCQkJCQl9DQoJCQkJCQkJfSwNCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQ0KCQkJCQlpZiAoL1wvYXBpXC90b3BpY1wvKG5vZGVcLyh0b3BpY3N8bmV3cyl8aWRvbF9saXN0KS8udGVzdCh1cmwpKSB7DQoJCQkJCQljb25zdCB4aHIgPSB0aGlzOw0KCQkJCQkJY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigNCgkJCQkJCQlYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsDQoJCQkJCQkJInJlc3BvbnNlIg0KCQkJCQkJKS5nZXQ7DQoJCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoeGhyLCAicmVzcG9uc2VUZXh0Iiwgew0KCQkJCQkJCWdldDogKCkgPT4gew0KCQkJCQkJCQlsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwoeGhyKTsNCgkJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJCWxldCByZXMgPSBKU09OLnBhcnNlKHJlc3VsdCwgYHV0Zi04YCk7DQoJCQkJCQkJCQlyZXMuZGF0YSA9IHV0aWwuZm9ybWF0VGl0bGUocmVzLmRhdGEpDQoJCQkJCQkJCQlyZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLCBgdXRmLThgKTsNCgkJCQkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJCQkJY29uc29sZS5sb2coJ+WPkeeUn+W8guW4uCEg6Kej5p6Q5aSx6LSlIScpOw0KCQkJCQkJCQkJY29uc29sZS5sb2coZSk7DQoJCQkJCQkJCQlyZXR1cm4gcmVzdWx0Ow0KCQkJCQkJCQl9DQoJCQkJCQkJfSwNCgkJCQkJCX0pOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlpZiAoL1wvYXBpXC91c2VyXC8oaW5mb1wvKFxkKykpfGN1cnJlbnQvLmV4ZWModXJsKSkgew0KCQkJCQkJY29uc3QgeGhyID0gdGhpczsNCgkJCQkJCWNvbnN0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoDQoJCQkJCQkJWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLA0KCQkJCQkJCSJyZXNwb25zZSINCgkJCQkJCSkuZ2V0Ow0KCQkJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KHhociwgInJlc3BvbnNlVGV4dCIsIHsNCgkJCQkJCQlnZXQ6ICgpID0+IHsNCgkJCQkJCQkJbGV0IHJlc3VsdCA9IGdldHRlci5jYWxsKHhocik7DQoJCQkJCQkJCXRyeSB7DQoJCQkJCQkJCQlsZXQgcmVzID0gSlNPTi5wYXJzZShyZXN1bHQsIGB1dGYtOGApOw0KCQkJCQkJCQkJY29uc3QgcmVnUmVzID0gL1wvYXBpXC91c2VyXC8oaW5mb1wvKFxkKykpfGN1cnJlbnQvDQoJCQkJCQkJCQkJLmV4ZWMoDQoJCQkJCQkJCQkJCXVybCk7DQoJCQkJCQkJCQljb25zdCB1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1aWQnKTsNCgkJCQkJCQkJCWlmIChyZWdSZXMubGVuZ3RoID4gMiAmJiAocmVnUmVzWzJdICYmIHJlZ1Jlc1syXSAhPSB1aWQpICYmIHJlcy5tZXNzYWdlLmluY2x1ZGVzKCfnpoEnKSkgew0KCQkJCQkJCQkJCWNvbnN0IHVzZXIgPSAgewoJCQkJCQkJCQkJCSdpc0Zhdm9yaXRlJzogZmFsc2UsCgkJCQkJCQkJCQkJJ2xpa2VDb3VudCc6IDEyLAoJCQkJCQkJCQkJCSd1c2VyJzogewoJCQkJCQkJCQkJCQknaWQnOiBwYXJzZUludChyZWdSZXNbMl0pLAoJCQkJCQkJCQkJCQknbmlja25hbWUnOiAn6KKr5bCB56aB6LSm5Y+3JywKCQkJCQkJCQkJCQkJJ2F2YXRhcic6ICcwJywKCQkJCQkJCQkJCQkJJ2Rlc2NyaXB0aW9uJzogYOivpei0puWPt+W3suiiq+WwgeemgWAsCgkJCQkJCQkJCQkJCSd0b3BpY0NvdW50JzogMTAwLAoJCQkJCQkJCQkJCQkndmlkZW9Db3VudCc6IDAsCgkJCQkJCQkJCQkJCSdjb21tZW50Q291bnQnOiAzMDMsCgkJCQkJCQkJCQkJCSdmYW5zQ291bnQnOiA1NywKCQkJCQkJCQkJCQkJJ2Zhdm9yaXRlQ291bnQnOiAzOSwKCQkJCQkJCQkJCQkJJ3N0YXR1cyc6IDAsCgkJCQkJCQkJCQkJCSdzZXgnOiAxLAoJCQkJCQkJCQkJCQkndmlwJzogMCwKCQkJCQkJCQkJCQkJJ3ZpcEV4cGlyZXNUaW1lJzogJzAwMDEtMDEtMDEgMDA6MDA6MDAnLAoJCQkJCQkJCQkJCQknY2VydGlmaWVkJzogZmFsc2UsCgkJCQkJCQkJCQkJCSdjZXJ0VmlkZW8nOiBmYWxzZSwKCQkJCQkJCQkJCQkJJ2NlcnRQcm9mZXNzb3InOiBmYWxzZSwKCQkJCQkJCQkJCQkJJ2ZhbW91cyc6IGZhbHNlLAoJCQkJCQkJCQkJCQknZm9yYmlkZGVuJzogZmFsc2UsCgkJCQkJCQkJCQkJCSd0YWdzJzogbnVsbCwKCQkJCQkJCQkJCQkJJ3JvbGUnOiAwLAoJCQkJCQkJCQkJCQkncG9wdWxhcml0eSc6IDEwLAoJCQkJCQkJCQkJCQknZGlhbW9uZENvbnN1bWUnOiAwLAoJCQkJCQkJCQkJCQkndGl0bGUnOiB7CgkJCQkJCQkJCQkJCQknaWQnOiAwLAoJCQkJCQkJCQkJCQkJJ25hbWUnOiAnJywKCQkJCQkJCQkJCQkJCSdjb25zdW1lJzogMCwKCQkJCQkJCQkJCQkJCSdjb25zdW1lRW5kJzogMCwKCQkJCQkJCQkJCQkJCSdpY29uJzogImh0dHBzOi8vaGpwaWMuaGpwZmUxLmNvbS9oanN0b3JlL3N5c3RlbS9ub2RlL3VzZXJ0aXRsZTIucG5nP3Zlcj0xNjU0NTkwOTE3IgoJCQkJCQkJCQkJCQl9LAoJCQkJCQkJCQkJCQknZnJpZW5kU3RhdHVzJzogZmFsc2UsCgkJCQkJCQkJCQkJCSd2b2ljZVN0YXR1cyc6IGZhbHNlLAoJCQkJCQkJCQkJCQkndmlkZW9TdGF0dXMnOiBmYWxzZSwKCQkJCQkJCQkJCQkJJ3ZvaWNlTW9uZXlUeXBlJzogMCwKCQkJCQkJCQkJCQkJJ3ZvaWNlQW1vdW50JzogMCwKCQkJCQkJCQkJCQkJJ3ZpZGVvTW9uZXlUeXBlJzogMCwKCQkJCQkJCQkJCQkJJ3ZpZGVvQW1vdW50JzogMCwKCQkJCQkJCQkJCQkJJ2RlcG9zaXRNb25leSc6IDAKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJcmVzLmlzRW5jcnlwdGVkID0gdHJ1ZTsNCgkJCQkJCQkJCQlyZXMuZXJyb3JDb2RlID0gMDsNCgkJCQkJCQkJCQlyZXMuc3VjY2VzcyA9IHRydWU7DQoJCQkJCQkJCQkJcmVzLm1lc3NhZ2UgPSAiIjsNCgkJCQkJCQkJCQlyZXMuZGF0YSA9IHV0aWwuamVuY29kZSh1c2VyLCAncGx1cycpOw0KCQkJCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQkJCQl0aXRsZTogJ+atpOWNmuS4u+W3suiiq+a1t+inkuWumOaWueWwgeemge+8jOaYr+WQpuWJjeW+gOebl+eJiOa1t+inkuafpeeci+atpOWwgeemgeWNmuS4u+W4luWtkD8nLA0KCQkJCQkJCQkJCQlkb3VidDogdHJ1ZSwNCgkJCQkJCQkJCQkJc3VjY2VzczogKHJlcyk9PnsNCgkJCQkJCQkJCQkJCWlmKHJlcyl7DQoJCQkJCQkJCQkJCQkJd2luZG93Lm9wZW4obG9jYXRpb24uaHJlZi5yZXBsYWNlKC86XC9cLyhbXi9dKykvLmV4ZWMobG9jYXRpb24uaHJlZilbMV0sJ2hqcXE0LnRvcCcpKTsNCgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0pDQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlpZihyZWdSZXNbMl0gPT0gdWlkIHx8IGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy91c2VyL215aW5mbycpKXsNCgkJCQkJCQkJCQlyZXMuZGF0YSA9IHV0aWwubGFzdGluZ1Rva2VuKHJlcy5kYXRhKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXJldHVybiBKU09OLnN0cmluZ2lmeShyZXMsIGB1dGYtOGApOw0KCQkJCQkJCQl9IGNhdGNoIChlKSB7DQoJCQkJCQkJCQljb25zb2xlLmxvZygn5Y+R55Sf5byC5bi4ISDop6PmnpDlpLHotKUhJyk7DQoJCQkJCQkJCQljb25zb2xlLmxvZyhlKTsNCgkJCQkJCQkJCXJldHVybiByZXN1bHQ7DQoJCQkJCQkJCX0NCgkJCQkJCQl9LA0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJDQoJCQkJCWlmICgvYXBpXC9sb2dpblwvc2lnbmluLy50ZXN0KHVybCkpIHsNCgkJCQkJCWNvbnN0IHhociA9IHRoaXM7DQoJCQkJCQljb25zdCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKA0KCQkJCQkJCVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwNCgkJCQkJCQkicmVzcG9uc2UiDQoJCQkJCQkpLmdldDsNCgkJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4aHIsICJyZXNwb25zZVRleHQiLCB7DQoJCQkJCQkJZ2V0OiAoKSA9PiB7DQoJCQkJCQkJCWxldCByZXN1bHQgPSBnZXR0ZXIuY2FsbCh4aHIpOw0KCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJbGV0IHJlcyA9IEpTT04ucGFyc2UocmVzdWx0LCBgdXRmLThgKTsNCgkJCQkJCQkJCWlmIChyZXMuc3VjY2Vzcykgew0KCQkJCQkJCQkJCWNvbnN0IHVzZXJuYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigNCgkJCQkJCQkJCQkJJ2lucHV0W3BsYWNlaG9sZGVyPSLor7fovpPlhaXnlKjmiLflkI0v6YKu566xIl0saW5wdXRbcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+WQjSJdJw0KCQkJCQkJCQkJCQkpLnZhbHVlDQoJCQkJCQkJCQkJY29uc3QgcHdkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigNCgkJCQkJCQkJCQkJJ2lucHV0W3R5cGU9InBhc3N3b3JkIl0nKS52YWx1ZQ0KCQkJCQkJCQkJCWlmICh1c2VybmFtZSAmJiBwd2QpIHsNCgkJCQkJCQkJCQkJR01fc2V0VmFsdWUoJ2hhaWppYW9fdXNlcnB3ZCcsIHsNCgkJCQkJCQkJCQkJCXVzZXJuYW1lLA0KCQkJCQkJCQkJCQkJcHdkDQoJCQkJCQkJCQkJCX0pDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCXV0aWwuZmluZFRhcmdldEVsZW1lbnQoDQoJCQkJCQkJCQkJCQknLnZhbi1kaWFsb2dfX2NhbmNlbCwuZWwtYnV0dG9uLS1zbWFsbCcsIDcpDQoJCQkJCQkJCQkJCS50aGVuKHJlcyA9PiB7DQoJCQkJCQkJCQkJCQlyZXMuY2xpY2soKQ0KCQkJCQkJCQkJCQl9KQ0KCQkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJCQkJCQkJdGl0bGU6IHJlcy5tZXNzYWdlDQoJCQkJCQkJCQkJfSkNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXJlcy5kYXRhID0gdXRpbC5sYXN0aW5nVG9rZW4ocmVzLmRhdGEpOw0KCQkJCQkJCQkJcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcywgYHV0Zi04YCk7DQoJCQkJCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKCflj5HnlJ/lvILluLghIOino+aekOWksei0pSEnKTsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKGUpOw0KCQkJCQkJCQkJcmV0dXJuIHJlc3VsdDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0sDQoJCQkJCQl9KTsNCgkJCQkJfQ0KCQkNCgkJCQkJaWYgKC9hcGlcL3ZpZGVvXC9jaGVja1ZpZGVvQ2FuUGxheS8udGVzdCh1cmwpKSB7DQoJCQkJCQljb25zdCB4aHIgPSB0aGlzOw0KCQkJCQkJY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigNCgkJCQkJCQlYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsDQoJCQkJCQkJInJlc3BvbnNlIg0KCQkJCQkJKS5nZXQ7DQoJCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoeGhyLCAicmVzcG9uc2VUZXh0Iiwgew0KCQkJCQkJCWdldDogKCkgPT4gew0KCQkJCQkJCQlsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwoeGhyKTsNCgkJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJCWxldCByZXMgPSBKU09OLnBhcnNlKHJlc3VsdCwgYHV0Zi04YCk7DQoJCQkJCQkJCQlyZXMuZGF0YSA9IHV0aWwuZm9ybWF0VmlkZW8ocmVzLmRhdGEpOw0KCQkJCQkJCQkJcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcywgYHV0Zi04YCk7DQoJCQkJCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKCflj5HnlJ/lvILluLghIOino+aekOWksei0pSEnKTsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKGUpOw0KCQkJCQkJCQkJcmV0dXJuIHJlc3VsdDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0sDQoJCQkJCQl9KQ0KCQkJCQl9DQoJCQ0KCQkJCQlpZiAoL2FwaVwvbG9naW5cL3NpZ251cC8udGVzdCh1cmwpKSB7DQoJCQkJCQljb25zdCB4aHIgPSB0aGlzOw0KCQkJCQkJY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigNCgkJCQkJCQlYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsDQoJCQkJCQkJInJlc3BvbnNlIg0KCQkJCQkJKS5nZXQ7DQoJCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoeGhyLCAicmVzcG9uc2VUZXh0Iiwgew0KCQkJCQkJCWdldDogKCkgPT4gew0KCQkJCQkJCQlsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwoeGhyKTsNCgkJCQkJCQkJdHJ5IHsNCgkJCQkJCQkJCWxldCByZXMgPSBKU09OLnBhcnNlKHJlc3VsdCwgYHV0Zi04YCk7DQoJCQkJCQkJCQlpZiAoIXJlcy5zdWNjZXNzKSB7DQoJCQkJCQkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQkJCQkJCXRpdGxlOiByZXMubWVzc2FnZQ0KCQkJCQkJCQkJCX0pDQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlyZXR1cm4gcmVzdWx0DQoJCQkJCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKCflj5HnlJ/lvILluLghIOino+aekOWksei0pSEnKTsNCgkJCQkJCQkJCWNvbnNvbGUubG9nKGUpOw0KCQkJCQkJCQkJcmV0dXJuIHJlc3VsdDsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0sDQoJCQkJCQl9KQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCW9yaWdpbk9wZW4uY2FsbCh0aGlzLCBtZXRob2QsIHVybCk7DQoJCQl9Ow0KCQkNCgkJCWNvbnN0IG9sZFNlbmQgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUuc2VuZDsNCgkJCVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oLi4uYXJncykgew0KCQkJCWlmICh0aGlzLl9zY29wZV91cmwgJiYgYXJncy5sZW5ndGggPiAwKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQlhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKGFyZ3NbMF0ubWF0Y2goLyJjb250ZW50IjoiPHA+KC4rKTxcL3A+IiwvKVsxXSwgdXRpbA0KCQkJCQkJCS5kZWNvYXQoDQoJCQkJCQkJCSdKVVUySlRnMEpUbEdKVVU0SlVJd0pVRXlKVVUxSlRoRUpUbEJKVVUwSlVJNEpVSkNKVVUxSlRnNEpUZzJKVVUwSlVKQkpVRkNKVVZHSlVKREpUaERKVVUxSlVFMUpVSXpKVVUwSlVJNEpVSkNKVVUzSlRsREpUbEdKVVUySlRrNEpVRkdKVVUySlRsRkpUZ3hKVVUxSlRrekpUZ3hKVVUxSlVJd0pVRTBKVVUzSlRnNUpVRTVKVVZHSlVKREpUaERKVVUySlRsREpUbENKVVUxSlRoRUpUbEJKVVUwSlVJNEpVSkNKVVUySlRoREpUZ3hKVVUzSlVKQ0pVRkVKVVUySlRsQ0pVSTBKVVUySlRrMkpVSXcnDQoJCQkJCQkJCSkpDQoJCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJCWNvbnNvbGUubG9nKGUpDQoJCQkJCX0NCgkJCQl9DQoJCQkJcmV0dXJuIG9sZFNlbmQuY2FsbCh0aGlzLCAuLi5hcmdzKQ0KCQkJfTsNCgkJfQ0KDQoJCWdlbmVyYXRlRWxlbWVudChjb250YWluZXIpIHsNCgkJCUdNX2FkZFN0eWxlKGANCgkJCQlAZm9udC1mYWNlIHsNCgkJCQkgIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnOyAgLyogUHJvamVjdCBpZCAzOTEzNTYxICovDQoJCQkJICBzcmM6IHVybCgnLy9hdC5hbGljZG4uY29tL3QvYy9mb250XzM5MTM1NjFfY3BlMTNmd2NhOC53b2ZmMj90PTE2OTYyMTA0OTM2NzInKSBmb3JtYXQoJ3dvZmYyJyksDQoJCQkJICAgICAgIHVybCgnLy9hdC5hbGljZG4uY29tL3QvYy9mb250XzM5MTM1NjFfY3BlMTNmd2NhOC53b2ZmP3Q9MTY5NjIxMDQ5MzY3MicpIGZvcm1hdCgnd29mZicpLA0KCQkJCSAgICAgICB1cmwoJy8vYXQuYWxpY2RuLmNvbS90L2MvZm9udF8zOTEzNTYxX2NwZTEzZndjYTgudHRmP3Q9MTY5NjIxMDQ5MzY3MicpIGZvcm1hdCgndHJ1ZXR5cGUnKTsNCgkJCQl9DQoJCQkJLmljb25mb250IHsNCgkJCQkgICAgZm9udC1mYW1pbHk6ICJpY29uZm9udCIgIWltcG9ydGFudDsNCgkJCQkgICAgZm9udC1zaXplOiAxNnB4Ow0KCQkJCSAgICBmb250LXN0eWxlOiBub3JtYWw7DQoJCSAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDsNCgkJCQkgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7DQoJCQkJICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7DQoJCQkJfQ0KCQkJCUBrZXlmcmFtZXMgc2hvd1NldEJveCB7DQoJCQkJCTAlIHsNCgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMCk7DQoJCQkJCX0NCgkJCQkJODAlIHsNCgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMS4xKTsNCgkJCQkJfQ0KCQkJCQkxMDAlIHsNCgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJQGtleWZyYW1lcyBoaWRTZXRCb3ggew0KCQkJCQkwJSB7DQoJCQkJCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDEpOw0KCQkJCQl9DQoJCQkJCTgwJSB7DQoJCQkJCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDEuMSk7DQoJCQkJCX0NCgkJCQkJMTAwJSB7DQoJCQkJCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCUBrZXlmcmFtZXMgY29sb3JBbmltYSB7DQoJCQkJCTAlew0KCQkJCQkJYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCgkJCQkJCWNvbG9yOiAjNWQ1ZDVkOw0KCQkJCQkJdHJhbnNmb3JtOiBzY2FsZSgxKTsNCgkJCQkJfQ0KCQkJCQk1MCV7DQoJCQkJCQl0cmFuc2Zvcm06IHNjYWxlKDEuMSk7DQoJCQkJCX0NCgkJCQkJMTAwJXsNCgkJCQkJCWJhY2tncm91bmQtY29sb3I6ICNmZjYwMjI7Ow0KCQkJCQkJY29sb3I6IHdoaXRlOw0KCQkJCQkJdHJhbnNmb3JtOiBzY2FsZSgxKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlAa2V5ZnJhbWVzIHNob3dOb3RpZnlCb3ggew0KCQkJCQkwJSB7DQoJCQkJCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC0xMDAlKSBzY2FsZSgwKTsNCgkJCQkJfQ0KCQkJCQk4MCUgew0KCQkJCQkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwzNXB4KSBzY2FsZSgxLjEpOw0KCQkJCQl9DQoJCQkJCTEwMCUgew0KCQkJCQkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwzNXB4KSBzY2FsZSgxKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlAa2V5ZnJhbWVzIGhpZE5vdGlmeUJveCB7DQoJCQkJCTAlIHsNCgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsMzVweCkgc2NhbGUoMS4xKTsNCgkJCQkJfQ0KCQkJCQk4MCUgew0KCQkJCQkJdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwzNXB4KSBzY2FsZSgxKTsNCgkJCQkJfQ0KCQkJCQkxMDAlIHsNCgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTEwMCUpIHNjYWxlKDApOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCUBrZXlmcmFtZXMgc2NhbGUgew0KCQkJCQkwJXsNCgkJCQkJCXRyYW5zZm9ybTogc2NhbGUoMSk7DQoJCQkJCX0NCgkJCQkJNTAlew0KCQkJCQkJdHJhbnNmb3JtOiBzY2FsZSgxLjEpOw0KCQkJCQl9DQoJCQkJCTEwMCV7DQoJCQkJCQl0cmFuc2Zvcm06IHNjYWxlKDEpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCUBrZXlmcmFtZXMgY2lyY2xldG9rTGVmdCB7DQoJCQkJICAgIDAlLDEwMCUgew0KCQkJCSAgICAgICAgbGVmdDogMHB4Ow0KCQkJCSAgICAgICAgd2lkdGg6IDEycHg7DQoJCQkJICAgICAgICBoZWlnaHQ6IDEycHg7DQoJCQkJICAgICAgICB6LWluZGV4OiAwOw0KCQkJCSAgICB9DQoJCQkJICAgIDI1JSB7DQoJCQkJICAgICAgICBoZWlnaHQ6IDE1cHg7DQoJCQkJICAgICAgICB3aWR0aDogMTVweDsNCgkJCQkgICAgICAgIHotaW5kZXg6IDE7DQoJCQkJICAgICAgICBsZWZ0OiA4cHg7DQoJCQkJICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpDQoJCQkJICAgIH0NCgkJCQkgICAgNTAlIHsNCgkJCQkgICAgICAgIHdpZHRoOiAxMnB4Ow0KCQkJCSAgICAgICAgaGVpZ2h0OiAxMnB4Ow0KCQkJCSAgICAgICAgbGVmdDogMjJweDsNCgkJCQkgICAgfQ0KCQkJCSAgICA3NSUgew0KCQkJCSAgICAgICAgd2lkdGg6IDEwcHg7DQoJCQkJICAgICAgICBoZWlnaHQ6IDEwcHg7DQoJCQkJICAgICAgICBsZWZ0OiA4cHg7DQoJCQkJICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpDQoJCQkJICAgIH0NCgkJCQl9DQoJCQkJQGtleWZyYW1lcyBjaXJjbGV0b2tSaWdodCB7DQoJCQkJICAgIDAlLDEwMCUgew0KCQkJCSAgICAgICAgdG9wOiAzcHg7DQoJCQkJICAgICAgICBsZWZ0OiAyMnB4Ow0KCQkJCSAgICAgICAgd2lkdGg6IDEycHg7DQoJCQkJICAgICAgICBoZWlnaHQ6IDEycHg7DQoJCQkJICAgICAgICB6LWluZGV4OiAwDQoJCQkJICAgIH0NCgkJCQkgICAgMjUlIHsNCgkJCQkgICAgICAgIGhlaWdodDogMTVweDsNCgkJCQkgICAgICAgIHdpZHRoOiAxNXB4Ow0KCQkJCSAgICAgICAgei1pbmRleDogMTsNCgkJCQkgICAgICAgIGxlZnQ6IDI0cHg7DQoJCQkJICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpDQoJCQkJICAgIH0NCgkJCQkgICAgNTAlIHsNCgkJCQkgICAgICAgIHdpZHRoOiAxMnB4Ow0KCQkJCSAgICAgICAgaGVpZ2h0OiAxMnB4Ow0KCQkJCSAgICAgICAgbGVmdDogMHB4Ow0KCQkJCSAgICB9DQoJCQkJICAgIDc1JSB7DQoJCQkJICAgICAgICB3aWR0aDogMTBweDsNCgkJCQkgICAgICAgIGhlaWdodDogMTBweDsNCgkJCQkgICAgICAgIGxlZnQ6IDI0cHg7DQoJCQkJICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpDQoJCQkJICAgIH0NCgkJCQl9DQoJCQkJLmNvbG9yLWFuaW1hew0KCQkJCQlhbmltYXRpb246IGNvbG9yQW5pbWEgLjNzIGVhc2UgMSBmb3J3YXJkczsNCgkJCQl9DQoJCQkJLmJ0bi1hbmltYXsNCgkJCQkJYW5pbWF0aW9uOiBzY2FsZSAuM3MgZWFzZSAxIGZvcndhcmRzOw0KCQkJCX0NCgkJCQkubG9naW4tYnRuOjphZnRlciwubG9naW4tZm9ybS1idXR0b246OmFmdGVye2NvbnRlbnQ6JyjlpoLngrnnmbvlvZXlkI7msqHlj43lupTvvIzor7flhbPpl63ohJrmnKzlho3or5UpJztjb2xvcjojZTkxZTYzO21hcmdpbi1sZWZ0OjVweDtmb250LXNpemU6IDEwcHg7fQ0KCQkJCS5lbC1tZXNzYWdlLWJveCwudmFuLXRvYXN0LC5lbC1tZXNzYWdlLC52LW1vZGFsLC5wdWJsaWNDb250YWluZXIsLmNvbnRhaW5lcmFkdmVydGlzaW5nLCNob21lIC5idG5ib3gsI2hvbWUgLmFkZGJveCwudG9wYmFubWVyLC5iYW5uZXJsaXN0c3R5bGUsLmlzaGlkZSwjanN4bC1ib3gsI2pzeGwtbWFza3tkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt6LWluZGV4Oi05OTk5OSAhaW1wb3J0YW50O29wYWNpdHk6IDAhaW1wb3J0YW50O3dpZHRoIDowICFpbXBvcnRhbnQ7fQ0KCQkJCSN3dC1yZXNvdXJjZXMtYm94e3Bvc2l0aW9uOiByZWxhdGl2ZTsgYm9yZGVyOiAxcHggZGFzaGVkICNlYzgxODE7YmFja2dyb3VuZDogI2ZmZjRmNDt9DQoJCQkJLnNlbGwtYnRue2JvcmRlcjpub25lICFpbXBvcnRhbnQ7bWFyZ2luLXRvcDoyMHB4O30NCgkJCQkubWFyZ2luLWxlZnR7IG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7fQ0KCQkJCS5zaG93LXNldC1ib3h7IGFuaW1hdGlvbjogc2hvd1NldEJveCAwLjNzIGVhc2UgMSBmb3J3YXJkczt9DQoJCQkJLmhpZC1zZXQtYm94eyBhbmltYXRpb246IGhpZFNldEJveCAwLjNzIGVhc2UgMSBmb3J3YXJkczt9DQoJCQkJLnNob3ctbm90aWZ5LWJveHsgYW5pbWF0aW9uOiBzaG93Tm90aWZ5Qm94IDAuM3MgZWFzZSAxIGZvcndhcmRzO30NCgkJCQkuaGlkLW5vdGlmeS1ib3h7IGFuaW1hdGlvbjogaGlkTm90aWZ5Qm94IDAuM3MgZWFzZSAxIGZvcndhcmRzO30NCgkJCQkjd3QtbG9hZGluZy1ib3h7ZGlzcGxheTogbm9uZTtwb3NpdGlvbjogZml4ZWQ7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO3otaW5kZXg6IDEwMDAwMDtiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwNGQ7fQ0KCQkJCSN3dC1sb2FkaW5nLWJveCAubG9hZGluZ3twb3NpdGlvbjogYWJzb2x1dGU7d2lkdGg6IDM1cHg7aGVpZ2h0OiAxN3B4O3RvcDogNTAlO2xlZnQ6IDUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpO30NCgkJCQkjd3QtbG9hZGluZy1ib3ggLmxvYWRpbmc6OmJlZm9yZSwNCgkJCQkjd3QtbG9hZGluZy1ib3ggLmxvYWRpbmc6OmFmdGVye3Bvc2l0aW9uOiBhYnNvbHV0ZTtjb250ZW50OiAiIjt0b3A6IDNweDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlNjBmO3dpZHRoOiAxNHB4O2hlaWdodDogMTRweDtib3JkZXItcmFkaXVzOiAyMHB4O21peC1ibGVuZC1tb2RlOiBtdWx0aXBseTthbmltYXRpb246IGNpcmNsZXRva0xlZnQgMS4ycyBsaW5lYXIgaW5maW5pdGU7fQ0KCQkJCSN3dC1sb2FkaW5nLWJveCAubG9hZGluZzo6YWZ0ZXJ7YW5pbWF0aW9uOiBjaXJjbGV0b2tSaWdodCAxLjJzIGxpbmVhciBpbmZpbml0ZTtiYWNrZ3JvdW5kLWNvbG9yOiAjNGRlOGY0O30NCgkJCQkjd3QtbGVmdC1zaG93eyBwb3NpdGlvbjogZml4ZWQ7bGVmdDogMjBweDt0b3A6IDUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7ei1pbmRleDogOTk5OTt0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO30NCgkJCQkjd3QtbGVmdC1zaG93IGkge2NvbG9yOiAjNWY1YjViO2ZvbnQtc2l6ZTogMjRweDtjb2xvcjogI0U5MUU2Mzt0ZXh0LXNoYWRvdzogI0U5MUU2MyAycHggMnB4IDEycHg7Zm9udC1zaXplOiAyNXB4O21hcmdpbi1sZWZ0OiAtMXB4O30NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH17DQoJCQkJCXBvc2l0aW9uOiBmaXhlZDsNCgkJCQkJdG9wOiA1MCU7DQoJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC01MCUpOw0KCQkJCQlyaWdodDogMTBweDsNCgkJCQkJd2lkdGg6IDQ2cHg7DQoJCQkJCWJvcmRlci1yYWRpdXM6IDMwcHg7DQoJCQkJCWJhY2tncm91bmQ6IHJnYig2NCA2NCA2NCAvIDgxJSk7DQoJCQkJCWJveC1zaGFkb3c6IDFweCAxcHggOHB4IDFweCByZ2IoOTggOTkgOTkgLyAzNCUpOw0KCQkJCQl6LWluZGV4OiA5OTk5Ow0KCQkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOw0KCQkJCX0NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH0gLml0ZW17cG9zaXRpb246IHJlbGF0aXZlO2hlaWdodDogNjBweDt9DQoJCQkJLnRpcHMteXVhbjo6YmVmb3JleyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICcnO3RvcDogMTJweDsgcmlnaHQ6IDZweDt3aWR0aDogOHB4O2hlaWdodDogOHB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWVmNDY0O30NCgkJCQkudGlwcy15dWFuLWVycjo6YmVmb3JleyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICcnO3RvcDogMTJweDsgcmlnaHQ6IDZweDt3aWR0aDogOHB4O2hlaWdodDogOHB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjgzZjMyO30NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH0gLml0ZW06bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXJ7cG9zaXRpb246IGFic29sdXRlO2JvdHRvbTogMDtsZWZ0OiAyMi41JTtjb250ZW50OiAnJzt3aWR0aDogNTUlO2hlaWdodDogMnB4O2JhY2tncm91bmQtY29sb3I6ICNmZmY7fQ0KCQkJCSN3dC0ke19DT05GSUdfLnZpcEJveElkfSAuaXRlbSAuaWNvbmZvbnQsI3d0LSR7X0NPTkZJR18udmlwQm94SWR9IC5pdGVtIGltZ3twb3NpdGlvbjogYWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpfQ0KCQkJCSN3dC1sb2dpbi1ib3ggLmNsb3NlLCN3dC1zZXQtYm94IC5jbG9zZSwjd3Qtbm90aWZ5LWJveCAuY2xvc2V7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwcHg7dG9wOiAwcHg7d2lkdGg6IDQwcHg7aGVpZ2h0OiA0MHB4O30NCgkJCQkjd3QtbG9naW4tYm94IC5jbG9zZTo6YmVmb3JlLCN3dC1sb2dpbi1ib3ggLmNsb3NlOjphZnRlciwjd3Qtc2V0LWJveCAuY2xvc2U6OmJlZm9yZSwjd3Qtc2V0LWJveCAuY2xvc2U6OmFmdGVyLCN3dC1ub3RpZnktYm94IC5jbG9zZTo6YmVmb3JlLCN3dC1ub3RpZnktYm94IC5jbG9zZTo6YWZ0ZXJ7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDUwJTt0b3A6IDUwJTtjb250ZW50OiAnJzt3aWR0aDogMTJweDtoZWlnaHQ6IDJweDtib3JkZXItcmFkaXVzOiAxcHg7YmFja2dyb3VuZC1jb2xvcjogIzZhNmE2YTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHJvdGF0ZSg0NWRlZyk7dmlzaWJpbGl0eTogdmlzaWJsZTt9DQoJCQkJI3d0LWxvZ2luLWJveCAuY2xvc2U6OmFmdGVyLCN3dC1zZXQtYm94IC5jbG9zZTo6YWZ0ZXIsI3d0LW5vdGlmeS1ib3ggLmNsb3NlOjphZnRlcnt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHJvdGF0ZSgtNDVkZWcpO30NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH0gLmFic29sdXRlLWNlbnRlcnsgcG9zaXRpb246IGFic29sdXRlO3RvcDogNTAlO2xlZnQ6IDUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTt9DQoJCQkJI3d0LSR7X0NPTkZJR18udmlwQm94SWR9ICN3dC1teSBpbWd7IHdpZHRoOiAyOHB4O2hlaWdodDogMjhweDtib3JkZXItcmFkaXVzOiAzMHB4O21hcmdpbi1sZWZ0OiAycHg7dHJhbnN0aW9uOiBhbGwgMC4zcyBlYXNlO30NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH0gI3d0LW15LXNldCBpIHtjb2xvcjogd2hpdGU7Zm9udC1zaXplOiAyNHB4O3RleHQtc2hhZG93OiAycHggMnB4IDE0cHggI2ZmZmZmZjtmb250LWZhbWlseTogJ2ljb25mb250Jzt9DQoJCQkJI3d0LSR7X0NPTkZJR18udmlwQm94SWR9ICN3dC1teS1kb3duIGkge2NvbG9yOiB3aGl0ZTtmb250LXNpemU6IDI0cHg7dGV4dC1zaGFkb3c6IDJweCAycHggMTVweCAjZmZmZmZmO2ZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO30NCgkJCQkjd3QtJHtfQ09ORklHXy52aXBCb3hJZH0gI3d0LW15LW5vdGlmeSBpIHtjb2xvcjogd2hpdGU7Zm9udC1zaXplOiAyM3B4O3BhZGRpbmc6IDEwcHggMXB4O3RleHQtc2hhZG93OiAycHggMnB4IDEycHggI2ZmZmZmZjt9DQoJCQkJI3d0LSR7X0NPTkZJR18udmlwQm94SWR9ICN3dC1oaWQtYm94IGkge2NvbG9yOiB3aGl0ZTtmb250LXNpemU6IDI0cHg7dGV4dC1zaGFkb3c6IDJweCAycHggMTJweCAjZmZmZmZmO2ZvbnQtc2l6ZTogMjVweDttYXJnaW4tbGVmdDogLTFweDt9DQoJCQkJLnd0LXBsYXllci1idG4tYm94IC5wbGF5ZXItYnRueyBwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDIlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDogMjAlfQ0KCQkJCS53dC1wbGF5ZXItYnRuLWJveCAudGlwc3sgcG9zaXRpb246IGFic29sdXRlO2JvdHRvbTogMjBweDtsZWZ0OjUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Y29sb3I6ICNGRkMxMDc7d2lkdGg6IDgwJTt0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAxNXB4O2ZvbnQtd2VpZ2h0OiA1MDA7fQ0KCQkJCSN3dC1tYXNrLWJveCwjd3QtbWF4aW5kZXgtbWFza3tkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgYm90dG9tOiAwOyB6LWluZGV4OiAxMDAwMDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDU3O30NCgkJCQkjd3QtbWF4aW5kZXgtbWFza3t6LWluZGV4OiA5MDAwMDtkaXNwbGF5Om5vbmU7fQ0KCQkJCSN3dC1zZXQtYm94eyBwb3NpdGlvbjpmaXhlZDsgdG9wOjUwJTtsZWZ0OjUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKSBzY2FsZSgwKTtvdmVyZmxvdzogaGlkZGVuO2JhY2tncm91bmQtY29sb3I6IHdoaXRlO2JveC1zaGFkb3c6IDAgMTVweCAzMHB4IHJnYmEoMCwgMCwgMCwgLjE1KTtib3JkZXItcmFkaXVzOiAxMnB4O3otaW5kZXg6IDEwMDEwO3BhZGRpbmc6IDEwcHggMTVweDtwYWRkaW5nLXJpZ2h0OiA1cHg7Ym94LXNpemluZzogYm9yZGVyLWJveDt9DQoJCQkJI3d0LXNldC1ib3g6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOiBhYnNvbHV0ZTt3aWR0aDogMTUwcHg7aGVpZ2h0OiAxNTBweDtib3JkZXItcmFkaXVzOiAxMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjMjE5NkYzO3otaW5kZXg6IC0xO29wYWNpdHk6IDAuNztib3R0b206IDA7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTQwJSw1OCUpO30NCgkJCQkjd3Qtc2V0LWJveDo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjogYWJzb2x1dGU7d2lkdGg6IDE1MHB4O2hlaWdodDogMTUwcHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI0ZGQzEwNzt6LWluZGV4OiAtMTtvcGFjaXR5OiAwLjc7dG9wOiAwO3JpZ2h0OiAwO3RyYW5zZm9ybTogdHJhbnNsYXRlKDIyJSwtNTMlKTt9DQoJCQkJI3d0LXNldC1ib3ggLnNlbGVjdGVkLWJveCAuc2VsZWN0ZWR7IGJhY2tncm91bmQtY29sb3I6ICNmZjYwMjI7Y29sb3I6IHdoaXRlO30NCgkJCQkjd3Qtc2V0LWJveCAudXNlci1ib3gtY29udGFpbmVye2Rpc3BsYXk6IG5vbmU7bGV0dGVyLXNwYWNpbmc6IDFweDt9DQoJCQkJI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciAudXBkYXRle2Rpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCAxMHB4OyBoZWlnaHQ6IDI4cHg7bGluZS1oZWlnaHQ6IDI4cHg7YmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtjb2xvcjogIzU0NTQ1NDsgYm9yZGVyLXJhZGl1czogMzBweDtib3JkZXI6IG5vbmU7Zm9udC1zaXplOiAxMHB4O2Zsb2F0OiByaWdodDttYXJnaW4tcmlnaHQ6IDVweDt9DQoJCQkJI3d0LXNldC1ib3ggLmluZm8tYm94e2Rpc3BsYXk6ZmxleDtoZWlnaHQ6IDUwcHg7YWxpZ24taXRlbXM6IGNlbnRlcjt9DQoJCQkJI3d0LXNldC1ib3ggLmluZm8tYm94IC5hdmF0YXItYm94e3Bvc2l0aW9uOiByZWxhdGl2ZTtoZWlnaHQ6IDM2cHg7d2lkdGg6IDM2cHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ym9yZGVyLXJhZGl1czogN3B4O2JveC1zaGFkb3c6IHJnYigxNjYgMTY2IDE2NiAvIDIwJSkgMHB4IDFweCAyMHB4IDBweDt9DQoJCQkJI3d0LXNldC1ib3ggLnVzZXItYm94IC50aXRsZXt0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDE2cHg7Y29sb3I6ICMzYTNhM2E7fQ0KCQkJCSN3dC1zZXQtYm94IC51c2VyLWJveCAuZGVzY3tmbGV4OiA4O2ZvbnQtc2l6ZTogMTBweDtjb2xvcjogIzVkNWQ1ZDttYXJnaW46IDAgMTBweDt9DQoJCQkJI3d0LXNldC1ib3ggLnVzZXItYm94IC5hdmF0YXJ7cG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMzZweDtoZWlnaHQ6MzZweDtib3JkZXItcmFkaXVzOiAzMHB4O2JvcmRlci1yYWRpdXM6IDdweDtmb250LXNpemU6IDA7fQ0KCQkJCSN3dC1zZXQtYm94IC51c2VyLWJveCAudXNlci1pbmZveyBwb3NpdGlvbjogcmVsYXRpdmU7IGxlZnQ6IC01cHg7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjttYXJnaW4tYm90dG9tOiA0cHg7YmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtib3JkZXItcmFkaXVzOiAxMXB4O3BhZGRpbmc6IDdweDt9DQoJCQkJI3d0LXNldC1ib3ggLnVzZXItYm94IC51c2VyLWluZm8gLmluZm97bWFyZ2luLWxlZnQ6IDEwcHg7fQ0KCQkJCSN3dC1zZXQtYm94IC51c2VyLWJveCAudXNlci1pbmZvIC5pbmZvIC5uaWNrbmFtZXtjb2xvcjogIzY3Njc2Nztmb250LXNpemU6IDEycHg7fQ0KCQkJCSN3dC1zZXQtYm94IC51c2VyLWJveCAudXNlci1pbmZvIC5pbmZvIC51c2VybmFtZXtjb2xvcjogI2I5YjliOTtmb250LXNpemU6IDEwcHg7bWFyZ2luLXRvcDogMnB4O30NCgkJCQkjd3Qtc2V0LWJveCAudXNlci1ib3ggLnVzZXItaW5mbyAubG9nb3V0e3Bvc2l0aW9uOiBhYnNvbHV0ZTtmb250LXNpemU6IDA7cmlnaHQ6IDEycHg7fQ0KCQkJCSN3dC1zZXQtYm94IC51c2VyLWJveCAudXNlci1pbmZvIC5sb2dvdXQgYnV0dG9ue3BhZGRpbmc6IDAgMTBweDtoZWlnaHQ6IDI4cHg7YmFja2dyb3VuZC1jb2xvcjogIzYxNWI1Yjtib3JkZXItcmFkaXVzOiAzMHB4O2NvbG9yOiB3aGl0ZTtib3JkZXI6IG5vbmU7Zm9udC1zaXplOiAxMHB4O30NCgkJCQkjd3Qtc2V0LWJveCAudXNlci1ib3ggLmFwcHMtY29udGFpbmVyeyBoZWlnaHQ6IDMzMHB4OyBvdmVyZmxvdzogYXV0bzsgbWFyZ2luLWJvdHRvbTogMTBweDt9DQoJCQkJI3d0LXRpcHMtYm94LCN3dC1kb3dubG9hZC1ib3h7IHBvc2l0aW9uOmZpeGVkO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDApO292ZXJmbG93OiBoaWRkZW47d2lkdGg6IDI0MHB4O21pbi1oZWlnaHQ6MTMwcHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ym9yZGVyLXJhZGl1czoxMnB4O3otaW5kZXg6IDk1MDAwO3BhZGRpbmc6MTBweCAxNXB4O30NCgkJCQkjd3QtdGlwcy1ib3gsI3d0LWRvd25sb2FkLWJveCAudGlwc3sgZm9udC1zaXplOiAxMHB4O21hcmdpbi10b3A6IDMwcHg7Y29sb3I6ICNFOTFFNjM7bGV0dGVyLXNwYWNpbmc6IDFweDt9DQoJCQkJI3d0LXRpcHMtYm94IC50aXRsZXtmb250LXNpemU6IDE2cHg7dGV4dC1hbGlnbjogY2VudGVyO2ZvbnQtd2VpZ2h0OiA2MDA7fQ0KCQkJCSN3dC10aXBzLWJveCAuY29udGVudHt0ZXh0LWFsaWduOiBjZW50ZXI7bWFyZ2luOiAxNHB4IDA7Zm9udC1zaXplOiAxMnB4O2NvbG9yOiAjMmEyYTJhO2ZvbnQtd2VpZ2h0OiA1MDA7d29yZC1icmVhazogYnJlYWstd29yZDt9DQoJCQkJI3d0LXRpcHMtYm94IC5jb250ZW50IHB7Y29sb3I6ICNmZjQ3NTc7dGV4dC1hbGlnbjogbGVmdDt9DQoJCQkJI3d0LXRpcHMtYm94IC5idG4tYm94e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDt9DQoJCQkJI3d0LXRpcHMtYm94IC5idG4tYm94IGJ1dHRvbnttaW4td2lkdGg6IDYwcHg7aGVpZ2h0OiAyOHB4O2JhY2tncm91bmQtY29sb3I6ICNlYzQwN2E7Ym9yZGVyLXJhZGl1czogMzBweDtjb2xvcjogd2hpdGU7Ym9yZGVyOiBub25lO2ZvbnQtc2l6ZTogMTJweDt9DQoJCQkJI3d0LXRpcHMtYm94IC5idG4tYm94IC5jYW5jZWx7ZGlzcGxheTogbm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO2NvbG9yOiMyYTJhMmF9DQoJCQkJI3d0LXRpcHMtYm94IC5sb2dve3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDklO2xlZnQ6IDElOyBjb2xvcjogI2RiZGJkYjsgZm9udC1zaXplOiAxMXB4O3RyYW5zZm9ybTogcm90YXRlKC0xNWRlZyk7dGV4dC1hbGlnbjogY2VudGVyO30NCgkJCQkjd3QtdGlwcy1ib3ggLnZlcnNpb257cG9zaXRpb246IGFic29sdXRlO3RvcDogOSU7IHJpZ2h0OiAxMCU7dHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKTtjb2xvcjogI2RiZGJkYjt9DQoJCQkJI3d0LW5vdGlmeS1ib3gge3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDIlO2xlZnQ6IDUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTEwMCUpIHNjYWxlKDApO292ZXJmbG93OiBoaWRkZW47d2lkdGg6IDgwJTttaW4taGVpZ2h0OiA3NXB4O2xldHRlci1zcGFjaW5nOiAxcHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Y29sb3I6IzJhMmEyYTtib3JkZXItcmFkaXVzOiAxNXB4O2JveC1zaGFkb3c6IDAgMTVweCAzMHB4IHJnYmEoMCwgMCwgMCwgLjE1KTt6LWluZGV4OiA5NTAwMDt9DQoJCQkJI3d0LW5vdGlmeS1ib3g6OmFmdGVyeyBjb250ZW50OicnO3Bvc2l0aW9uOiBhYnNvbHV0ZTt3aWR0aDogMjUwcHg7aGVpZ2h0OiAyNTBweDtib3JkZXItcmFkaXVzOiAyMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjMDNBOUY0O3otaW5kZXg6IC0xO29wYWNpdHk6IDAuNztib3R0b206IDA7bGVmdDogMDt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLDg1JSk7fQ0KCQkJCSN3dC1ub3RpZnktYm94IC50aXRsZXsgdGV4dC1hbGlnbjogY2VudGVyO2hlaWdodDogMzVweDsgbGluZS1oZWlnaHQ6IDM1cHg7Zm9udC1zaXplOiAxNXB4O2ZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjRTkxRTYzO30NCgkJCQkjd3Qtbm90aWZ5LWJveCAuY29udGVudHsgY29sb3I6ICMzYTNhM2E7cGFkZGluZzogMTBweCAxNXB4O2ZvbnQtc2l6ZTogMTJweDt9DQoJCQkJI3d0LW5vdGlmeS1ib3ggLmNvbnRlbnQgYXtjb2xvcjogIzFFODhFNTt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9DQoJCQkJI3d0LW5vdGlmeS1ib3ggLmNvbnRlbnQgcHttYXJnaW4tYm90dG9tOiA1cHg7fQ0KCQkJCS53dC1wbGF5ZXItYnRuLWJveHsgcG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7ei1pbmRleDogOTk5ODtiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwNGQ7fQ0KCQkJCSN3dC12aWRlby1jb250YWluZXJ7ZGlzcGxheTogbm9uZTsgcG9zaXRpb246Zml4ZWQ7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwOyB6LWluZGV4OiA5OTk4O2JhY2tncm91bmQtY29sb3I6IGJsYWNrO30NCgkJCQkjd3QtdmlkZW8tY29udGFpbmVyIC53dC12aWRlb3sgcG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt3aWR0aDoxMDAlO3RyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtoZWlnaHQ6IDI0MHB4OyB6LWluZGV4OiA5OTk5O30NCgkJCQkjd3QtdmlkZW8tY29udGFpbmVyIC53dC12aWRlbyB2aWRlb3t3aWR0aDoxMDAlO2hlaWdodDogMTAwJTt9DQoJCQkJI3d0LXZpZGVvLWNvbnRhaW5lciAucGxheWVyLXRpcHN7cG9zaXRpb246IGZpeGVkIDtib3R0b206IDEwJSA7bGVmdDo1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtmb250LXNpemU6IDE2cHg7bGV0dGVyLXNwYWNpbmc6IDJweDt3aGl0ZS1zcGFjZTogbm93cmFwO3BhZGRpbmc6IDEwcHg7dGV4dC13cmFwOiB3cmFwO3dpZHRoOiA4MCU7Y29sb3I6ICMwNGIyMGI7fQ0KCQkJCS5kcGxheWVyLWNvbnRyb2xsZXJ7Ym90dG9tOiAzMHB4ICFpbXBvcnRhbnQ7fQ0KCQkJCS5tYWluLXBsYXllcntoZWlnaHQ6IDMwMHB4O30NCgkJCQkuZHBsYXllci5kcGxheWVyLWhpZGUtY29udHJvbGxlciAuZHBsYXllci1jb250cm9sbGVyeyBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7dHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwMCUpICFpbXBvcnRhbnQ7fQ0KCQkJCS53dC1jbG9zZS1idG57IGZvbnQtc2l6ZTogMTVweDtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiA0MHB4O2xlZnQ6IDI1cHg7Y29sb3I6IHdoaXRlO30NCgkJCQkjd3QtZG93bmxvYWQtYm94eyB6LWluZGV4OiAxMDAxMDt9DQoJCQkJI3d0LWRvd25sb2FkLWJveCAuY2xvc2V7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwcHg7dG9wOiAwcHg7d2lkdGg6IDQwcHg7aGVpZ2h0OiA0MHB4O30NCgkJCQkjd3QtZG93bmxvYWQtYm94IC5jbG9zZTo6YmVmb3JlLCN3dC1kb3dubG9hZC1ib3ggLmNsb3NlOjphZnRlcntwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogNTAlO3RvcDogNTAlO2NvbnRlbnQ6ICcnO3dpZHRoOiAxNHB4O2hlaWdodDogMnB4O2JvcmRlci1yYWRpdXM6IDFweDtiYWNrZ3JvdW5kLWNvbG9yOiAjYWRhZGFkO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSkgcm90YXRlKDQ1ZGVnKTt9DQoJCQkJI3d0LWRvd25sb2FkLWJveCAuY2xvc2U6OmFmdGVyLCN3dC1kb3dubG9hZC1ib3ggLmNsb3NlOjphZnRlcnt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLC01MCUpIHJvdGF0ZSgtNDVkZWcpO30NCgkJCQkjd3QtZG93bmxvYWQtYm94OjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjogYWJzb2x1dGU7d2lkdGg6IDE1MHB4O2hlaWdodDogMTUwcHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI2U5MWU2Mzt6LWluZGV4OiAtMTtvcGFjaXR5OiAwLjc7dG9wOiAwO2xlZnQ6IDA7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTM4JSwtNDAlKTt9DQoJCQkJI3d0LWRvd25sb2FkLWJveDo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjogYWJzb2x1dGU7d2lkdGg6IDE1MHB4O2hlaWdodDogMTUwcHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI0ZGQzEwNzt6LWluZGV4OiAtMTtvcGFjaXR5OiAwLjc7Ym90dG9tOiAwO3JpZ2h0OiAwO3RyYW5zZm9ybTogdHJhbnNsYXRlKDYyJSwzMCUpO30NCgkJCQkjd3QtZG93bmxvYWQtYm94IHVsIGxpeyBoZWlnaHQ6IDM4cHg7bGluZS1oZWlnaHQ6IDM4cHg7Zm9udC1zaXplOiAxMXB4O3RleHQtYWxpZ246IGNlbnRlcjtjb2xvcjojOTA5MDkwO2ZvbnQtd2VpZ2h0OiA1MDA7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ym94LXNoYWRvdzogcmdiKDE2NiAxNjYgMTY2IC8gMjAlKSAwcHggMXB4IDVweCAxcHg7bWFyZ2luOiAxOHB4IDMwcHg7Ym9yZGVyLXJhZGl1czogNDBweDt9DQoJCQkJYCkNCgkJCWlmIChfQ09ORklHXy5pc01vYmlsZSkgew0KCQkJCUdNX2FkZFN0eWxlKGANCgkJICAgICAgICAgICAgI3d0LXNldC1ib3gge3dpZHRoOjcyJTt9DQoJCSAgICAgICAgYCk7DQoJCQl9DQoJCQlsZXQgc2NyaXB0cyA9ICcnOw0KCQkJaWYoX0NPTkZJR18udXNlciAmJiBfQ09ORklHXy51c2VyLnNjcmlwdHMpew0KCQkJCV9DT05GSUdfLnVzZXIuc2NyaXB0cy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gew0KCQkJCQlzY3JpcHRzICs9IGANCgkJCQkJCTxkaXYgY2xhc3M9ImluZm8tYm94IiBkYXRhLWluZGV4PSIke2luZGV4fSI+DQoJCQkJCQkJPGRpdiBjbGFzcz0iYXZhdGFyLWJveCI+DQoJCQkJCQkJCTxpbWcgY2xhc3M9ImF2YXRhciIgc3JjPSIke2l0ZW0uaWNvbn0iLz4NCgkJCQkJCQk8L2Rpdj4NCgkJCQkJCQk8ZGl2IGNsYXNzPSJkZXNjIj4NCgkJCQkJCQkJPHRleHQ+JHtpdGVtLmRlc2N9PC90ZXh0Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJPC9kaXY+DQoJCQkJCWA7DQoJCQkJfSkNCgkJCX0NCgkJCSQoY29udGFpbmVyKS5hcHBlbmQoYA0KCQkgICAgICAgIDxkaXYgaWQ9Ind0LSR7X0NPTkZJR18udmlwQm94SWR9Ij4NCgkJCQkgICAgPGRpdiBpZD0id3QtbXkiIGNsYXNzPSJpdGVtIHd0X215X2hhaWppYW8iPg0KCQkJCQkJPGltZyBzcmM9Imh0dHBzOi8vY2RuLmhlbmFubXUuY29tL2ltYWdlL251bGxfc3F1YXJlLnBuZyI+PC9pbWc+DQoJCQkJICAgIDwvZGl2Pg0KCQkJCSAgICA8ZGl2IGlkPSJ3dC1teS1zZXQiIGNsYXNzPSJpdGVtIHd0X3BsYXllcl9oYWlqaWFvIj4NCgkJCQkJICAgIDxpIGNsYXNzPSJpY29uZm9udCI+JiN4ZWMwNTs8L2k+DQoJCQkJICAgIDwvZGl2Pg0KCQkJCQk8ZGl2IGlkPSJ3dC1teS1kb3duIiBjbGFzcz0iaXRlbSB3dF9teV9kb3duX2hhaWppYW8iPg0KCQkJCQkgICAgPGkgY2xhc3M9Imljb25mb250Ij4mI3hlYzA5OzwvaT4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgaWQ9Ind0LW15LW5vdGlmeSIgY2xhc3M9Iml0ZW0gd3RfbXlfbm90aWZ5IiBzdHlsZT0icGFkZGluZzogMCAxMXB4OyI+DQoJCQkJCSAgICA8aSBjbGFzcz0iaWNvbmZvbnQiPiYjeGVjMDg7PC9pPg0KCQkJCQk8L2Rpdj4NCgkJCQkgICAgPGRpdiBpZD0id3QtaGlkLWJveCIgY2xhc3M9Iml0ZW0iPg0KCQkJCQkgICAgPGkgY2xhc3M9Imljb25mb250Ij4mI3hlYzA2OzwvaT4NCgkJCQkgICAgPC9kaXY+DQoJCQkgICAgPC9kaXY+DQoJCQkgICAgPGRpdiBpZD0id3QtbGVmdC1zaG93IiBzdHlsZT0idHJhbnNmb3JtOiB0cmFuc2xhdGUoLTYwcHgsLTUwJSk7cGFkZGluZzogMTBweDsiPg0KCQkJCQk8aSBjbGFzcz0iaWNvbmZvbnQiPiYjeGU3MDQ7PC9pPg0KCQkJICAgIDwvZGl2Pg0KCQkJCTxkaXYgaWQ9Ind0LW1hc2stYm94Ij48L2Rpdj4NCgkJCQk8ZGl2IGlkPSJ3dC1zZXQtYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0iY2xvc2UiPjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJsaW5lLWJveCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+DQoJCQkJCTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJ1c2VyLWJveC1jb250YWluZXIiPg0KCQkJCQkJPGRpdiBjbGFzcz0idXNlci1ib3giPg0KCQkJCQkJCTxkaXYgY2xhc3M9InRpdGxlIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweCI+5Y+K5pe26KGM5LmQ5o+S5Lu25bqTPC9kaXY+DQoJCQkJCQkJPGRpdiBjbGFzcz0idXNlci1pbmZvIj4NCgkJCQkJCQkJPGRpdiBjbGFzcz0iYXZhdGFyIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyI+DQoJCQkJCQkJCQk8aW1nIHNyYz0iaHR0cHM6Ly9jZG4uaGVuYW5tdS5jb20vaW1hZ2UvbnVsbF9zcXVhcmUucG5nIiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO2JvcmRlci1yYWRpdXM6IDhweDsiPjwvaW1nPg0KCQkJCQkJCQk8L2Rpdj4NCgkJCQkJCQkJPGRpdiBjbGFzcz0iaW5mbyI+DQoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJuaWNrbmFtZSI+6K+355m75b2VPC9kaXY+DQoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJ1c2VybmFtZSI+eHh4eHh4eHh4eDwvZGl2Pg0KCQkJCQkJCQk8L2Rpdj4NCgkJCQkJCQkJPGRpdiBjbGFzcz0ibG9nb3V0Ij4NCgkJCQkJCQkJCTxidXR0b24+6YCA5Ye655m75b2VPC9idXR0b24+DQoJCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxkaXYgY2xhc3M9ImFwcHMtY29udGFpbmVyIj4gJHtzY3JpcHRzfTwvZGl2Pg0KCQkJCQkJCTxib3V0dG9uIGNsYXNzPSJ1cGRhdGUiPuajgOafpeabtOaWsDwvYm91dHRvbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGlkPSJ3dC1sb2FkaW5nLWJveCI+DQoJCQkJCTxkaXYgY2xhc3M9ImxvYWRpbmciPjwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgaWQ9Ind0LW1heGluZGV4LW1hc2siPjwvZGl2Pg0KCQkJCTxkaXYgaWQ9Ind0LXRpcHMtYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0idGl0bGUiPuaPkOekujwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJjb250ZW50Ij48L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0iYnRuLWJveCI+DQoJCQkJCQk8YnV0dG9uIGNsYXNzPSdjYW5jZWwnPuWPlua2iDwvYnV0dG9uPg0KCQkJCQkJPGJ1dHRvbiBjbGFzcz0nc3VibWl0Jz7noa7lrpo8L2J1dHRvbj4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9ImxvZ28iPjxwPkBodHRwczovL20uaGVuYW5tdS5jb208L3A+PC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9InZlcnNpb24iPjxwPnYgJHtzdXBlclZpcC5fQ09ORklHXy52ZXJzaW9ufTwvcD48L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGlkPSJ3dC1ub3RpZnktYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0iY2xvc2UiPjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+6YCa55+lPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9ImNvbnRlbnQiPjwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgaWQ9Ind0LXZpZGVvLWNvbnRhaW5lciI+DQoJCQkJCTxkaXYgY2xhc3M9Ind0LWNsb3NlLWJ0biI+DQoJCQkJCQk8aSBjbGFzcz0idmFuLWljb24gdmFuLWljb24tY2xvc2UiPjwvaT4NCgkJCQkJCTxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+6YCA5Ye65pKt5pS+PC9zcGFuPg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0id3QtdmlkZW8iPg0KCQkJCQkJPHZpZGVvIGlkPSJ3dC12aWRlbyIgY29udHJvbHM+PC92aWRlbz4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9InBsYXllci10aXBzIj7lpoLljaHpob/mnIDlpb3lvIDmoq/lrZDov5vooYzmkq3mlL7vvIznkIborrrkuIrkvJrmtYHnlYXkupso5qKv5a2Q5Lmf5YiG5LiJ5YWt5Lmd562J77yM5LiA6Iis6LS155qE55CG6K665LiK572R6YCf5pu05aW9Ke+8jOWNoemhv+S5n+WPr+S4i+i9veWQjuWGjeaSreaUvjwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkgICAgYCkNCgkJCWlmIChfQ09ORklHXy51c2VyICYmIF9DT05GSUdfLnVzZXIuYXZhdGFyKSB7DQoJCQkJdXRpbC5sb2dpbmVkKCkNCgkJCX0NCgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKGNvbnRhaW5lcikpOw0KCQl9DQoNCgkJYmluZEV2ZW50KGNvbnRhaW5lcikgew0KCQkJY29uc3QgdmlwQm94ID0gJChgI3d0LSR7X0NPTkZJR18udmlwQm94SWR9YCkNCgkJCWlmIChHTV9nZXRWYWx1ZSgnaGFpamlhb19oaWRfY29udHJvbGxlcicsIG51bGwpKSB7DQoJCQkJdmlwQm94LmNzcygidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgxMjUlLCAtNTAlKSIpDQoJCQkJJCgnI3d0LWxlZnQtc2hvdycpLmNzcygidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLCAtNTAlKSIpDQoJCQl9DQoNCgkJCXZpcEJveC5maW5kKCIjd3QtbXkiKS5vbigiY2xpY2siLCAoKSA9PiB7DQoJCQkJaWYgKF9DT05GSUdfLnVzZXIpIHsNCgkJCQkJJCgnI3d0LW1hc2stYm94JykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykNCgkJCQkJJCgiI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciIpLmNzcygnZGlzcGxheScsICdibG9jaycpDQoJCQkJCSQoIiN3dC1zZXQtYm94IikucmVtb3ZlQ2xhc3MoJ2hpZC1zZXQtYm94JykNCgkJCQkJJCgiI3d0LXNldC1ib3giKS5hZGRDbGFzcygnc2hvdy1zZXQtYm94JykNCgkJCQkJJCgnI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciAubmlja25hbWUnKS5odG1sKF9DT05GSUdfLnVzZXIubmlja25hbWUpDQoJCQkJfSBlbHNlIHsNCgkJCQkJdXRpbC5hZGRMb2dpbigpDQoJCQkJCSQoJyN3dC1sb2dpbi1tYXNrJykuY3NzKCdkaXNwbGF5JywnYmxvY2snKQ0KCQkJCQkkKCIjd3QtbG9naW4tYm94IikucmVtb3ZlQ2xhc3MoJ2hpZC1zZXQtYm94JykNCgkJCQkJJCgiI3d0LWxvZ2luLWJveCIpLmFkZENsYXNzKCdzaG93LXNldC1ib3gnKQ0KCQkJCQljb25zdCBqc3hsX2xvZ2luX3B3ZCA9IEdNX2dldFZhbHVlKCdqc3hsX2xvZ2luX3B3ZCcsJycpDQoJCQkJCWlmKGpzeGxfbG9naW5fcHdkKXsNCgkJCQkJCWNvbnN0IHVzZXJuYW1lID0ganN4bF9sb2dpbl9wd2Quc3Vic3RyaW5nKDAsanN4bF9sb2dpbl9wd2QuaW5kZXhPZignKycpKTsNCgkJCQkJCWxldCBwd2QgPSBqc3hsX2xvZ2luX3B3ZC5zdWJzdHJpbmcoanN4bF9sb2dpbl9wd2QuaW5kZXhPZignKycpICsgMSwganN4bF9sb2dpbl9wd2QubGVuZ3RoKS5zdWJzdHJpbmcoMCw4KTsNCgkJCQkJCSQoIiN3dC1sb2dpbi1ib3ggaW5wdXQiKVswXS52YWx1ZSA9IHVzZXJuYW1lOw0KCQkJCQkJJCgiI3d0LWxvZ2luLWJveCBpbnB1dCIpWzFdLnZhbHVlID0gcHdkOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSkNCg0KCQkJdmlwQm94LmZpbmQoIiN3dC1teS1zZXQiKS5vbigiY2xpY2siLCBhc3luYyAoKSA9PiB7DQoJCQkJaWYgKCFfQ09ORklHXy51c2VyKSB7DQoJCQkJCSQoIiN3dC1teSIpLmNsaWNrKCkNCgkJCQkJcmV0dXJuDQoJCQkJfQ0KCQkJCWlmICghX0NPTkZJR18udmlkZW9VcmwudXJsKSB7DQoJCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdibG9jaycpDQoJCQkJCWZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7DQoJCQkJCQlhd2FpdCB1dGlsLnNsZWVwKDEwMDApDQoJCQkJCQlpZiAoX0NPTkZJR18udmlkZW9VcmwudXJsKSB7DQoJCQkJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJCQkJCWJyZWFrDQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJCX0NCgkJCQlpZiAoX0NPTkZJR18udmlkZW9VcmwudXJsKSB7DQoJCQkJCSQoJyN3dC12aWRlby1jb250YWluZXInKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKQ0KCQkJCQkkKCIjd3QtaGlkLWJveCIpLmNsaWNrKCkNCgkJCQkJaWYgKF9DT05GSUdfLnZpZGVvVXJsLnR5cGUgIT0gMCkgew0KCQkJCQkJaWYgKCFfQ09ORklHXy52aWRlb1VybC51cmwgfHwgIV9DT05GSUdfLnZpZGVvVXJsLnVybC5zdGFydHNXaXRoKCdibG9iOmh0dHAnKSkgew0KCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQl0aXRsZTogbG9jYXRpb24uaHJlZiArICc8L2JyPuatpOinhumikeWPr+iDvei/mOacquiiq+ino+aekO+8jOato+WcqOino+aekOS4reivt+WLv+aTjeS9nOOAguOAguOAgjwvYnI+5aaC6Kej5p6Q5pe26ZW/5aSn5LqOMeWIhumSn+ivt+iAg+iZkeW8gOair+WtkOWGjeivlTwvYnI+5Y+K5pe26KGM5LmQ6ISa5pys5ZSv5LiA572R56uZaHR0cHM6Ly9oZW5hbm11LmNvbScsDQoJCQkJCQkJCWhpZENvbmZpcm06IHRydWUNCgkJCQkJCQl9KQ0KCQkJCQkJCWF3YWl0IHV0aWwuc2xlZXAoNTAwKQ0KCQkJCQkJfQ0KCQkJCQkJX0NPTkZJR18udmlkZW9VcmwudXJsID0gYXdhaXQgZ2V0X20zdThfdXJsX2hhaWppYW8oKQ0KCQkJCQkJaWYgKCFfQ09ORklHXy52aWRlb1VybC51cmwgfHwgIV9DT05GSUdfLnZpZGVvVXJsLnVybC5pbmNsdWRlcygnaHR0cCcpKSB7DQoJCQkJCQkJaWYgKF9DT05GSUdfLnZpZGVvVXJsLnVybC5pbmNsdWRlcygn6YCa55+lOicpIHx8IF9DT05GSUdfLnZpZGVvVXJsLnVybA0KCQkJCQkJCQkuaW5jbHVkZXMoJ+acgOaWsOeJiOacrCcpKSB7DQoJCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQkJdGl0bGU6IF9DT05GSUdfLnZpZGVvVXJsLnVybA0KCQkJCQkJCQl9KQ0KCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQkJdGl0bGU6IF9DT05GSUdfLnZpZGVvVXJsLnVybCArICc8L2JyPicgKyBsb2NhdGlvbg0KCQkJCQkJCQkJCS5ocmVmICsgJzwvYnI+5oqx5q2J77yM6Kej5p6Q5aSx6LSl77yM5aaC5pyJ6Zeu6aKY5oiW6ZyA5qKv5a2Q5o6o6I2Q6K+36IGU57O75Y+R55S1572R56uZaHR0cHM6Ly9oZW5hbm11LmNvbeS4reWUruWQjuiBlOezu+aWueW8jycNCgkJCQkJCQkJfSkNCgkJCQkJCQl9DQoJCQkJCQkJcmV0dXJuOw0KCQkJCQkJfQ0KCQkJCQkJJCgnI3d0LXRpcHMtYm94IC5idG4tYm94IC5zdWJtaXQnKS5jbGljaygpDQoJCQkJCX0NCgkJCQkJaWYgKF9DT05GSUdfLmlzTW9iaWxlICYmIF9DT05GSUdfLmlzTW9iaWxlWzBdID09ICdpUGhvbmUnKSB7DQoJCQkJCQkkKCcud3QtdmlkZW8nKS5lbXB0eSgpDQoJCQkJCQkkKCcud3QtdmlkZW8nKS5hcHBlbmQoYA0KCQkJCQkJCTx2aWRlbyBjb250cm9scyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4NCgkJCQkJCQkgICAgPHNvdXJjZSBzcmM9IiR7X0NPTkZJR18udmlkZW9VcmwudXJsfSIgdHlwZT0iYXBwbGljYXRpb24veC1tcGVnVVJMIj4NCgkJCQkJCQk8L3ZpZGVvPg0KCQkJCQkJYCkNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWNvbnN0IHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnd0LXZpZGVvICN3dC12aWRlbycpDQoJCQkJCQlfQ09ORklHXy5obHNfZHAgPSBuZXcgSGxzKCkNCgkJCQkJCV9DT05GSUdfLmhsc19kcC5sb2FkU291cmNlKF9DT05GSUdfLnZpZGVvVXJsLnVybCkNCgkJCQkJCV9DT05GSUdfLmhsc19kcC5hdHRhY2hNZWRpYSh2aWRlbykNCgkJCQkJCV9DT05GSUdfLmhsc19kcC5vbihIbHMuRXZlbnRzLk1BTklGRVNUX1BBUlNFRCwgZnVuY3Rpb24oKSB7DQoJCQkJCQkJdmlkZW8ucGxheSgpDQoJCQkJCQl9KQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCWlmICghX0NPTkZJR18udmlkZW9VcmwudXJsKSB7DQoJCQkJCWlmKF9DT05GSUdfLnZpZGVvVXJsLnR5cGUgPT0gMCl7DQoJCQkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJCQl0aXRsZTogbG9jYXRpb24uaHJlZiArDQoJCQkJCQkJCSc8L2JyPuatpOW4luWtkOS8vOS5juaYr+WFjei0ueinhumike+8jOivt+eZu+W9lea1t+inkui0puWPt+WQjuS9v+eUqOa1t+inkuiHquW4pueahOi/m+ihjOaSreaUvicNCgkJCQkJCX0pDQoJCQkJCX1lbHNlew0KCQkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQkJdGl0bGU6IGxvY2F0aW9uLmhyZWYgKw0KCQkJCQkJCQknPC9icj7mirHmrYnmnKrmo4DmtYvliLDluJblrZDop4bpopHvvIzor7flhbPmjonlhbblroPohJrmnKzlho3or5XvvIzmiJboi7nmnpznlKhGb2N1c+a1j+iniOWZqO+8jOWuieWNk+eUqFZpYea1j+iniOWZqOWGjeivlScNCgkJCQkJCX0pDQoJCQkJCX0NCgkJCQl9DQoJCQl9KQ0KDQoJCQkkKCcjd3QtdmlkZW8tY29udGFpbmVyIGRpdicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCgkJCQllLnN0b3BQcm9wYWdhdGlvbigpDQoJCQl9KQ0KDQoJCQkkKCcud3QtY2xvc2UtYnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQoJCQkJJCgnI3d0LXZpZGVvLWNvbnRhaW5lcicpLmNzcygnZGlzcGxheScsICdub25lJykNCgkJCQl2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsNCgkJCQl2aWRlb3MuZm9yRWFjaChmdW5jdGlvbih2aWRlbykgew0KCQkJCQkvLyB2aWRlby52b2x1bWUgPSAwLjANCgkJCQkJdmlkZW8ucGF1c2UoKTsNCgkJCQl9KTsNCgkJCQlpZiAoX0NPTkZJR18uaGxzX2RwKSBfQ09ORklHXy5obHNfZHAuZGVzdHJveSgpDQoJCQkJJCgiI3d0LWxlZnQtc2hvdyIpLmNsaWNrKCk7DQoJCQl9KQ0KDQoJCQl2aXBCb3guZmluZCgiI3d0LW15LWRvd24iKS5vbigiY2xpY2siLCAoKSA9PiB7DQoJCQkJaWYgKCFfQ09ORklHXy51c2VyKSB7DQoJCQkJCSQoIiN3dC1teSIpLmNsaWNrKCkNCgkJCQkJcmV0dXJuDQoJCQkJfQ0KCQkJCWlmKF9DT05GSUdfLnVzZXIubG9naW5fdHlwZSAhPSAndXNlcm5hbWVfcHdkJyl7DQoJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJdGl0bGU6ICfmirHmrYnvvIznmbvlvZXnoIHnmbvlhaXmsqHmnInkuIvovb3mnYPpmZDvvIzor7flnKhoZW5hbm11LmNvbee9keermeWPkeeUteWQjuS9v+eUqOi0puWPtyvlr4bnoIHnmbvlhaUnDQoJCQkJCX0pDQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQkJaWYoX0NPTkZJR18udmlkZW9VcmwuZG93bmxvYWRVcmxTaWduKXsNCgkJCQkJdXRpbC5zaG93RG93bkxvYWRXaW5kb3coKTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCgkJCQlpZiAoX0NPTkZJR18udmlkZW9VcmwudXJsKSB7DQoJCQkJCWlmKF9DT05GSUdfLnVzZXIgJiYgX0NPTkZJR18udXNlci5zdG9wRG93bmxvYWQgfHwgKF9DT05GSUdfLnVzZXIucm9sZS51c2VEb3dubG9hZE51bSA9PSBfQ09ORklHXy51c2VyLnJvbGUubWF4RG93bmxvYWROdW0pICl7DQoJCQkJCQl1dGlsLnNob3dUaXBzKHsNCgkJCQkJCQl0aXRsZTogJ+aKseatie+8jOS7iuaXpeS4i+i9veasoeaVsCcgKyBfQ09ORklHXy51c2VyLnJvbGUubWF4RG93bmxvYWROdW0gKyAn5qyh5bey57uP55So5a6M77yM6K+35piO5pel5YaN5LiL6L29PC9icj4o6K+lanN4bOi0puWPt+WFtuWug+eZu+W9leeggeWFseS6q+asoeaVsCknDQoJCQkJCQl9KQ0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoJCQkJCWlmIChfQ09ORklHXy52aWRlb1VybC50eXBlID09IDAgfHwgKF9DT05GSUdfLnZpZGVvVXJsLnVybC5lbmRzV2l0aCgnLm0zdTgnKSAmJiAhDQoJCQkJCQkJX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCdwcmV2aWV3JykpIHx8IF9DT05GSUdfLnZpZGVvVXJsDQoJCQkJCQkuZG93bmxvYWRVcmwpIHsNCgkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCXRpdGxlOiAn5Li65LqG6ISa5pys55qE56iz5a6a546w5bey5pel6ZmQ5LiL6L29PC9icj4o5b2T5YmN6LSm5Y+35pel6ZmQJyArIF9DT05GSUdfLnVzZXIucm9sZS5tYXhEb3dubG9hZE51bSArJ+asoe+8jOW3suS9v+eUqCcgKyBfQ09ORklHXy51c2VyLnJvbGUudXNlRG93bmxvYWROdW0gKyfmrKHvvIzmsLjkuYXkvJrlkZjmr5TpnZ7msLjkuYXmrKHmlbDlpJop77yMPC9icj7mgqjnoa7lrpropoHmtojogJfkuIDmrKHmrKHmlbDmnaXojrflj5bop4bpopHpk77mjqXlkJco5aaC5aSx6LSl5LiN6K6h5pWwKT8nLA0KCQkJCQkJCWRvdWJ0OiB0cnVlLA0KCQkJCQkJCXN1Y2Nlc3M6IGFzeW5jIChjb25maXJtKSA9PiB7DQoJCQkJCQkJCWlmIChjb25maXJtKSB7DQoJCQkJCQkJCQl0cnkgew0KCQkJCQkJCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdibG9jaycpDQoJCQkJCQkJCQkJYXdhaXQgdXRpbC5zbGVlcCgzMDApOw0KCQkJCQkJCQkJCWNvbnN0IHJlcyA9IGF3YWl0IHV0aWwuYXN5bmNIdHRwKA0KCQkJCQkJCQkJCQknaHR0cHM6Ly9hcGkuaGVuYW5tdS5jb20vb3BlbkRvd25sb2FkJyArIChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSArIDEpICsgJzAwL3NpZ25Eb3dubG9hZD9kb3dubG9hZFVybD0nICsNCgkJCQkJCQkJCQkJKF9DT05GSUdfLnZpZGVvVXJsLmRvd25sb2FkVXJsID8NCgkJCQkJCQkJCQkJCV9DT05GSUdfLnZpZGVvVXJsLmRvd25sb2FkVXJsIDoNCgkJCQkJCQkJCQkJCV9DT05GSUdfLnZpZGVvVXJsLnVybCkgKw0KCQkJCQkJCQkJCQknJmlzRG93bmxvYWQ9JyArIChfQ09ORklHXy52aWRlb1VybA0KCQkJCQkJCQkJCQkJLmRvd25sb2FkVXJsID8gMSA6IDApICsNCgkJCQkJCQkJCQkJJyZ2aWRlb1R5cGU9JyArIF9DT05GSUdfLnZpZGVvVXJsLnR5cGUgKw0KCQkJCQkJCQkJCQknJmhqZWRkPScgKyAoX0NPTkZJR18uaGplZGQgPyAxIDogMCkgKw0KCQkJCQkJCQkJCQknJm9yaWdpbj0nICsgbG9jYXRpb24ub3JpZ2luICsgJyZhcHA95rW36KeS56S+5Yy6JykNCgkJCQkJCQkJCQkkKCcjd3QtbG9hZGluZy1ib3gnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpDQoJCQkJCQkJCQkJaWYgKHJlcy5lcnJNc2cgPT0gJ3N1Y2Nlc3MnKSB7DQoJCQkJCQkJCQkJCWNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UocmVzLnJlc3BvbnNlVGV4dCkNCgkJCQkJCQkJCQkJaWYgKHJlc3VsdC5lcnJDb2RlICE9IDApIHsNCgkJCQkJCQkJCQkJCXRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyTXNnKQ0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCWlmKHJlc3VsdC5uZXdUb2tlbikgX0NPTkZJR18udXNlci50b2tlbiA9IHJlc3VsdC5uZXdUb2tlbjsNCgkJCQkJCQkJCQkJaWYocmVzdWx0Lm5ld1JvbGUgJiYgcmVzdWx0Lm5ld1JvbGUuZXhwaXJlZF9kYXRlKSBfQ09ORklHXy51c2VyLnJvbGUuZXhwaXJlZF9kYXRlID0gcmVzdWx0Lm5ld1JvbGUuZXhwaXJlZF9kYXRlOw0KCQkJCQkJCQkJCQlfQ09ORklHXy51c2VyLnJvbGUudXNlRG93bmxvYWROdW0gPSByZXN1bHQudXNlRG93bmxvYWROdW0NCgkJCQkJCQkJCQkJX0NPTkZJR18udmlkZW9VcmwuZG93bmxvYWRVcmxTaWduID0gcmVzdWx0LmRhdGENCgkJCQkJCQkJCQkJdXRpbC5zaG93RG93bkxvYWRXaW5kb3codHJ1ZSwgcmVzdWx0LmVyck1zZyk7DQoJCQkJCQkJCQkJCUdNX3NldFZhbHVlKCdqc3hsX3VzZXInLCBfQ09ORklHXy51c2VyKTsNCgkJCQkJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCQkJCQkkKCcjd3QtbG9hZGluZy1ib3gnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpDQoJCQkJCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQkJCQkJdGl0bGU6IF9DT05GSUdfLnZpZGVvVXJsLnVybCArDQoJCQkJCQkJCQkJCQkJJzwvYnI+JyArIGxvY2F0aW9uLmhyZWYgKw0KCQkJCQkJCQkJCQkJCSc8L2JyPicgKyByZXMuZXJyTXNnDQoJCQkJCQkJCQkJCX0pDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQkJCQkJCWNvbnNvbGUubG9nKGUpDQoJCQkJCQkJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKQ0KCQkJCQkJCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQkJCQkJCQl0aXRsZTogZS5tZXNzYWdlICsNCgkJCQkJCQkJCQkJCSc8L2JyPicgKyBsb2NhdGlvbi5ocmVmICsNCgkJCQkJCQkJCQkJCSc8L2JyPuiOt+WPluS4i+i9vemTvuaOpeWksei0pScNCgkJCQkJCQkJCQl9KQ0KCQkJCQkJCQkJCWlmKGUubWVzc2FnZS5pbmNsdWRlcygn5piO5pel5YaN5LiL6L29Jykpew0KCQkJCQkJCQkJCQlfQ09ORklHXy51c2VyLnN0b3BEb3dubG9hZCA9IHRydWUNCgkJCQkJCQkJCQkJX0NPTkZJR18udXNlci5yb2xlLnVzZURvd25sb2FkTnVtID0gX0NPTkZJR18udXNlci5yb2xlLm1heERvd25sb2FkTnVtDQoJCQkJCQkJCQkJCUdNX3NldFZhbHVlKCdqc3hsX3VzZXInLCBfQ09ORklHXy51c2VyKTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9KQ0KCQkJCQkJcmV0dXJuOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKF9DT05GSUdfLnZpZGVvVXJsLnVybCAmJiBfQ09ORklHXy52aWRlb1VybC50eXBlID09IDApIHsNCgkJCQkJX0NPTkZJR18udmlkZW9VcmwudXJsID0gbG9jYXRpb24ub3JpZ2luICsgX0NPTkZJR18udmlkZW9VcmwudXJsICsgKF9DT05GSUdfDQoJCQkJCQkudmlkZW9VcmwudXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPycpICsgJ3R5cGU9Lm0zdTgnOw0KCQkJCX0NCgkJCQlpZiAoKF9DT05GSUdfLnZpZGVvVXJsLnVybCAmJiBfQ09ORklHXy52aWRlb1VybC51cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSAmJiAhX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCdwcmV2aWV3JykgJiYgX0NPTkZJR18udmlkZW9VcmwudXJsLmluY2x1ZGVzKCcubTN1JykgfHwgX0NPTkZJR18NCgkJCQkJLnZpZGVvVXJsLmRvd25sb2FkVXJsKSB7DQoJCQkJCXV0aWwuc2hvd0Rvd25Mb2FkV2luZG93KCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCQl0aXRsZTogX0NPTkZJR18udmlkZW9VcmwudXJsICsgJzwvYnI+JyArIGxvY2F0aW9uLmhyZWYgKw0KCQkJCQkJCSc8L2JyPumcgOimgeaSreaUvuaMiemSruacieWwj+e7v+eCueaIluaaguS4jeaUr+aMgeS4i+i9ve+8jOivt+etieW+heS/ruWkjScNCgkJCQkJfSkNCgkJCQl9DQoJCQl9KQ0KDQoJCQl2aXBCb3guZmluZCgiI3d0LWhpZC1ib3giKS5vbigiY2xpY2siLCAoKSA9PiB7DQoJCQkJdmlwQm94LmNzcygidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgxMjUlLCAtNTAlKSIpOw0KCQkJCSQoJyN3dC1sZWZ0LXNob3cnKS5jc3MoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwgLTUwJSkiKQ0KCQkJCUdNX3NldFZhbHVlKCdoYWlqaWFvX2hpZF9jb250cm9sbGVyJywgMSkNCgkJCX0pDQoNCgkJCSQoJyN3dC1sZWZ0LXNob3cnKS5vbignY2xpY2snLCAoKSA9PiB7DQoJCQkJJCgnI3d0LWxlZnQtc2hvdycpLmNzcygidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgtNjBweCwgLTUwJSkiKTsNCgkJCQl2aXBCb3guY3NzKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKDAsIC01MCUpIikNCgkJCQlHTV9zZXRWYWx1ZSgnaGFpamlhb19oaWRfY29udHJvbGxlcicsICcnKQ0KCQkJfSkNCg0KCQkJJCgnI3d0LW1hc2stYm94Jykub24oJ2NsaWNrJywgKCkgPT4gew0KCQkJCSQoJyN3dC1tYXNrLWJveCcpLmNzcygnZGlzcGxheScsICdub25lJykNCgkJCQkkKCIjd3Qtc2V0LWJveCIpLnJlbW92ZUNsYXNzKCdzaG93LXNldC1ib3gnKTsNCgkJCQkkKCIjd3Qtc2V0LWJveCIpLmFkZENsYXNzKCdoaWQtc2V0LWJveCcpDQoJCQkJJCgiI3d0LWRvd25sb2FkLWJveCIpLnJlbW92ZUNsYXNzKCdzaG93LXNldC1ib3gnKTsNCgkJCQkkKCIjd3QtZG93bmxvYWQtYm94IikuYWRkQ2xhc3MoJ2hpZC1zZXQtYm94JykNCgkJCQlzZXRUaW1lb3V0KCgpID0+IHsNCgkJCQkJJCgiI3d0LXNldC1ib3ggLmxpbmUtYm94IikuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsNCgkJCQkJJCgiI3d0LXNldC1ib3ggLnVzZXItYm94LWNvbnRhaW5lciIpLmNzcygnZGlzcGxheScsICdub25lJykNCgkJCQl9LCA1MDApDQoJCQl9KQ0KDQoJCQkkKCcjd3Qtc2V0LWJveCAudXNlci1ib3gtY29udGFpbmVyIC51c2VyLWJveCAuaW5mby1ib3gnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7DQoJCQkJbGV0IGluZGV4ID0gJycNCgkJCQl0cnkgew0KCQkJCQlpbmRleCA9IE51bWJlcihlLmN1cnJlbnRUYXJnZXQuYXR0cmlidXRlc1snZGF0YS1pbmRleCddLnZhbHVlKQ0KCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJaW5kZXggID0gX0NPTkZJR18udXNlci5zY3JpcHRzLmxlbmd0aCAtIDENCgkJCQl9DQoJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhdG9iKGF0b2IoYXRvYihfQ09ORklHXy51c2VyLnNjcmlwdHNbaW5kZXhdLnVybCkpKQ0KCQkJfSkNCgkJCQ0KCQkJJCgiLnVzZXItYm94LWNvbnRhaW5lciAudXBkYXRlIikub24oImNsaWNrIiwgYXN5bmMoKSA9PiB7DQoJCQkJJCgnI3d0LWxvYWRpbmctYm94JykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykNCgkJCQlhd2FpdCB1dGlsLnNsZWVwKDMwMCk7DQoJCQkJY29uc3QgcmVzID0gYXdhaXQgdXRpbC5jaGVja1VwZGF0ZSh0cnVlKQ0KCQkJCSQoJyN3dC1sb2FkaW5nLWJveCcpLmNzcygnZGlzcGxheScsICdub25lJykNCgkJCQlpZiAocmVzLmVyckNvZGUgIT0gMCkgew0KCQkJCQl1dGlsLnNob3dUaXBzKHsgdGl0bGU6IHJlcy5lcnJNc2d9KQ0KCQkJCX0NCgkJCX0pDQoNCgkJCSQoIiN3dC1zZXQtYm94IC5jbG9zZSIpLm9uKCJjbGljayIsICgpID0+IHsNCgkJCQkkKCcjd3QtbWFzay1ib3gnKS5jbGljaygpDQoJCQl9KQ0KDQoJCQl2aXBCb3guZmluZCgiI3d0LW15LW5vdGlmeSIpLm9uKCJjbGljayIsICgpID0+IHsNCgkJCQlpZiAoX0NPTkZJR18uc2hvd05vdGlmeSkgew0KCQkJCQkkKCcjd3Qtbm90aWZ5LWJveCcpLmNsaWNrKCkNCgkJCQl9IGVsc2Ugew0KCQkJCQljb25zdCBub3RpZnkgPSBHTV9nZXRWYWx1ZSgnbm90aWZ5JywgJycpOw0KCQkJCQlpZiAobm90aWZ5ICYmIChub3RpZnkuZGF0ZSA9PSBuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApKSkgew0KCQkJCQkJdXRpbC5zaG93Tm90aWZ5KHsNCgkJCQkJCQl0aXRsZTogbm90aWZ5Lm1zZ0luZm8NCgkJCQkJCX0pDQoJCQkJCX0gZWxzZSB7DQoJCQkJCQl1dGlsLnNob3dOb3RpZnkoew0KCQkJCQkJCXRpdGxlOiAn6L+Y5rKh5pyJ6YCa55+l5L+h5oGvJw0KCQkJCQkJfSkNCgkJCQkJfTsNCgkJCQkJdXRpbC5zaG93QW5kSGlkVGlwcygnd3RfbXlfbm90aWZ5JywgJ3NldCcsIGZhbHNlKQ0KCQkJCX0NCgkJCX0pDQoNCgkJCSQoIiN3dC1zZXQtYm94IC51c2VyLWJveCAudXNlci1pbmZvIikub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQoJCQkJdXRpbC5zaG93VGlwcyh7DQoJCQkJCXRpdGxlOiAn5ZCO6Z2i5Lya5YGa5LyY5YyW5pi+56S65p2D6ZmQ562J5L+h5oGvJw0KCQkJCX0pDQoJCQl9KQ0KDQoJCQkkKCcjd3Qtc2V0LWJveCAubG9nb3V0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KCQkJCXV0aWwuc2hvd1RpcHMoew0KCQkJCQl0aXRsZTogJ+aCqOehruWumuimgemAgOWHuueZu+W9leWQlz8nLA0KCQkJCQlkb3VidDogdHJ1ZSwNCgkJCQkJc3VjY2VzczogKHJlcykgPT4gew0KCQkJCQkJaWYgKHJlcykgew0KCQkJCQkJCXV0aWwubG9nb3V0ZWQoKQ0KCQkJCQkJCSQoJyN3dC1tYXNrLWJveCcpLmNsaWNrKCkNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pDQoJCQkJZS5zdG9wUHJvcGFnYXRpb24oKQ0KCQkJfSkNCg0KCQkJaWYgKCFfQ09ORklHXy51c2VyKSB7DQoJCQkJdXRpbC5hZGRMb2dpbigpDQoJCQkJdXRpbC5maW5kVGFyZ2V0RWxlbWVudCgnI3d0LW15JykudGhlbihyZXMgPT4gew0KCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsNCgkJCQkJCXJlcy5jbGljaygpDQoJCQkJCX0sIDI1MDApDQoJCQkJfSkNCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiB7DQoJCXN0YXJ0OiAoKSA9PiB7DQoJCQlfQ09ORklHXy51c2VyID0gR01fZ2V0VmFsdWUoJ2pzeGxfdXNlcicsICcnKQ0KCQkJaWYgKF9DT05GSUdfLnVzZXIpIHsNCgkJCQlpZiAoX0NPTkZJR18udXNlci5sb2dpbl9kYXRlICYmIChfQ09ORklHXy51c2VyLmxvZ2luX2RhdGUgIT0gbmV3IERhdGUoKS5zZXRIb3VycygwLCAwLCAwLA0KCQkJCQkJMCkpKSB7DQoJCQkJCV9DT05GSUdfLnVzZXIgPSAnJw0KCQkJCQlHTV9zZXRWYWx1ZSgnanN4bF91c2VyJywgJycpDQoJCQkJfQ0KCQkJfQ0KCQkJbmV3IEJhc2VDb25zdW1lcigpLnBhcnNlKCkNCgkJfSwNCgkJX0NPTkZJR18NCgl9DQp9KSgpOw0KDQooZnVuY3Rpb24oKSB7DQoJaWYodW5zYWZlV2luZG93Lnd0X2hhaWppYW9fc2NyaXB0IHx8IGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ3AyLmhhaWoybWInKSB8fCBsb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdoYWlqLmNjJykgfHwgbG9jYXRpb24uaHJlZi5pbmNsdWRlcygnaGFpamlhby5vbmUnKSl7DQoJCXJldHVybjsNCgl9DQoJdW5zYWZlV2luZG93Lnd0X2hhaWppYW9fc2NyaXB0ID0gdHJ1ZTsNCgkNCglpZiAobG9jYXRpb24uaHJlZi5pbmNsdWRlcygndG9vbHMuYnVnc2NhbmVyLmNvbScpKSB7DQoJCXV0aWwuZmluZFRhcmdldEVsZW1lbnQoJy5pbnB1dC1ncm91cCBpbnB1dCcpLnRoZW4ocmVzID0+IHsNCgkJCWNvbnN0IHVybCA9IGxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKCc/bTN1OD0nLCAnJykucmVwbGFjZSgvXHMqL2csICIiKQ0KCQkJaWYgKHVybCAmJiB1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7DQoJCQkJJChyZXMpLnZhbCh1cmwpDQoJCQl9DQoJCX0pDQoJCXJldHVybg0KCX0NCglpZiAobG9jYXRpb24uaHJlZi5pbmNsdWRlcygndG9vbHMudGhhdHdpbmQuY29tJykpIHsNCgkJR01fYWRkU3R5bGUoYC50b3AtYWR7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O31gKQ0KCQl1dGlsLmZpbmRUYXJnZXRFbGVtZW50KCcuYngtLXRleHQtaW5wdXRfX2ZpZWxkLW91dGVyLXdyYXBwZXIgaW5wdXQnLCAxMCkudGhlbihyZXMgPT4gew0KCQkJJChyZXMpLnZhbChEYXRlLm5vdygpKQ0KCQkJcmVzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJpbnB1dCIpKQ0KCQl9KQ0KCQlyZXR1cm4NCgl9DQoJaWYgKGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2Jsb2cubHVja2x5LW1qdy5jbicpKSB7DQoJCUdNX2FkZFN0eWxlKGANCgkJCSNtLWFwcCBhLC5tLXAtdGVtcC11cmwsLm0tcC1jcm9zcywubS1wLWlucHV0LWNvbnRhaW5lciBkaXY6bnRoLW9mLXR5cGUoMSl7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30NCgkJCS5tLXAtaW5wdXQtY29udGFpbmVyeyBkaXNwbGF5OiBibG9jazt9DQoJCQkubS1wLWlucHV0LWNvbnRhaW5lciBpbnB1dHsgd2lkdGg6IDEwMCU7Zm9udC1zaXplOiAxMnB4O21hcmdpbi1ib3R0b206IDVweDt9DQoJCQkubS1wLWlucHV0LWNvbnRhaW5lciBkaXZ7IGhlaWdodDogNDVweDtsaW5lLWhlaWdodDogNDVweDtmb250LXNpemU6IDE1cHg7bWFyZ2luLXRvcDogM3B4O30NCgkJCS5tLXAtc3RyZWFte2xpbmUtaGVpZ2h0OiBub3JtYWw7Zm9udC1zaXplOiAxMnB4O30NCgkJYCkNCgkJcmV0dXJuDQoJfQ0KDQoJY29uc3Qgb2xkYWRkID0gRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXINCglFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGFzeW5jIGZ1bmN0aW9uKC4uLmFyZ3MpIHsNCgkJaWYgKGFyZ3NbMF0gPT0gJ2NsaWNrJykgew0KCQkJaWYgKHRoaXMuY2xhc3NOYW1lID09ICdsb2dpbi1idG4nIHx8IHRoaXMuY2xhc3NOYW1lID09DQoJCQkJJ2VsLWJ1dHRvbiBsb2dpbi1mb3JtLWJ1dHRvbiBlbC1idXR0b24tLXByaW1hcnknKSB7DQoJCQkJY29uc3QgdXNlciA9IEdNX2dldFZhbHVlKCdoYWlqaWFvX3VzZXJwd2QnLCAnJykNCgkJCQlpZiAodXNlcikgew0KCQkJCQljb25zdCBlID0gbmV3IEV2ZW50KCJpbnB1dCIpDQoJCQkJCXV0aWwuZmluZFRhcmdldEVsZW1lbnQoJ2lucHV0W3BsYWNlaG9sZGVyPSLor7fovpPlhaXnlKjmiLflkI0v6YKu566xIl0saW5wdXRbcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+WQjSJdJykNCgkJCQkJCS50aGVuKHJlcyA9PiB7DQoJCQkJCQkJJChyZXMpLnZhbCh1c2VyLnVzZXJuYW1lKQ0KCQkJCQkJCXJlcy5kaXNwYXRjaEV2ZW50KGUpDQoJCQkJCQkJdXRpbC5maW5kVGFyZ2V0RWxlbWVudCgnaW5wdXRbdHlwZT0icGFzc3dvcmQiXScpLnRoZW4ocmVzID0+IHsNCgkJCQkJCQkJJChyZXMpLnZhbCh1c2VyLnB3ZCkNCgkJCQkJCQkJcmVzLmRpc3BhdGNoRXZlbnQoZSkNCgkJCQkJCQl9KQ0KCQkJCQkJfSkNCgkJCQl9DQoJCQl9DQoJCX0NCgkJb2xkYWRkLmNhbGwodGhpcywgLi4uYXJncykNCgl9DQoJc3VwZXJWaXAuc3RhcnQoKTsNCn0pKCk7
Add Comment
Please, Sign In to add comment