ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmJkNWYKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzgxZWMKLS0tIC9kZXYvbnVsbAorKysgYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwzIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3NyYy9tYWluL2phdmE9VVRGLTgKK2VuY29kaW5nLy9zcmMvdGVzdC9qYXZhPVVURi04CmRpZmYgLS1naXQgYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxMDVjMQotLS0gL2Rldi9udWxsCisrKyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDUgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjYKZGlmZiAtLWdpdCBhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOWRmMzAKLS0tIC9kZXYvbnVsbAorKysgYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNSBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Y29tLmdvb2dsZTtjb207anVuaXQ7bmV0O29yZztqYXZhO2phdmF4Oworb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTk5OQorb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTk5OQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3BvbS54bWwgYi9naXRpbGVzLXNlcnZsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM3NjkzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3BvbS54bWwKQEAgLTAsMCArMSwxMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdpdGlsZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Z2l0aWxlcy1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5naXRpbGVzLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkdpdGlsZXMgLSBTZXJ2bGV0PC9uYW1lPgorCisgIDxkZXNjcmlwdGlvbj4KKyAgICBHaXRpbGVzIHNlcnZsZXQgaW1wbGVtZW50YXRpb24KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS50ZW1wbGF0ZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNveTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qb2RhLXRpbWU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qb2RhLXRpbWU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQWJzdHJhY3RIdHRwRmlsdGVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQWJzdHJhY3RIdHRwRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZTEyZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9BYnN0cmFjdEh0dHBGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0SHR0cEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBkb0ZpbHRlcigoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXEsIChIdHRwU2VydmxldFJlc3BvbnNlKSByZXMsIGNoYWluKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8gQWxsb3cgc3ViY2xhc3NlcyB0byB0aHJvdyBTZXJ2bGV0RXhjZXB0aW9uLgorICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICB9CisKKyAgLyoqIEBzZWUgI2RvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UsIEZpbHRlckNoYWluKSAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkb0ZpbHRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmFzZVNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CYXNlU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZGMxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmFzZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5JbnN0YW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBCYXNlIHNlcnZsZXQgY2xhc3MgZm9yIEdpdGlsZXMgc2VydmxldHMgdGhhdCBzZXJ2ZSBTb3kgdGVtcGxhdGVzLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BVFRSSUJVVEUgPSBCYXNlU2VydmxldC5jbGFzcy5nZXROYW1lKCkgKyAiL0RhdGEiOworCisgIHN0YXRpYyB2b2lkIHNldE5vdENhY2hlYWJsZShIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgIHJlcy5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ0FDSEVfQ09OVFJPTCwgIm5vLWNhY2hlLCBuby1zdG9yZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICByZXMuc2V0SGVhZGVyKEh0dHBIZWFkZXJzLlBSQUdNQSwgIm5vLWNhY2hlIik7CisgICAgcmVzLnNldEhlYWRlcihIdHRwSGVhZGVycy5FWFBJUkVTLCAiRnJpLCAwMSBKYW4gMTk5MCAwMDowMDowMCBHTVQiKTsKKyAgICByZXMuc2V0RGF0ZUhlYWRlcihIdHRwSGVhZGVycy5EQVRFLCBuZXcgSW5zdGFudCgpLmdldE1pbGxpcygpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQmFzZVNlcnZsZXQgbm90Rm91bmRTZXJ2bGV0KCkgeworICAgIHJldHVybiBuZXcgQmFzZVNlcnZsZXQobnVsbCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbnVFbnRyeShTdHJpbmcgdGV4dCwgU3RyaW5nIHVybCkgeworICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQsICJ1cmwiLCB1cmwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldERhdGEoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSByZXEuZ2V0QXR0cmlidXRlKERBVEFfQVRUUklCVVRFKTsKKyAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICBkYXRhID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICByZXEuc2V0QXR0cmlidXRlKERBVEFfQVRUUklCVVRFLCBkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBwcm90ZWN0ZWQgZmluYWwgUmVuZGVyZXIgcmVuZGVyZXI7CisKKyAgcHJvdGVjdGVkIEJhc2VTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyKSB7CisgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOworICB9CisKKyAgLyoqCisgICAqIFB1dCBhIHZhbHVlIGludG8gYSByZXF1ZXN0J3MgU295IGRhdGEgbWFwLgorICAgKiA8cD4KKyAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCBhIGNvbXBvc2l0aW9uIHBhdHRlcm4gd2hlcmVieSBhCisgICAqIHtAbGluayBCYXNlU2VydmxldH0gaXMgd3JhcHBlZCBpbiBhIGRpZmZlcmVudCB7QGxpbmsgSHR0cFNlcnZsZXR9IHRoYXQgY2FuCisgICAqIHVwZGF0ZSBpdHMgZGF0YSBtYXAuCisgICAqCisgICAqIEBwYXJhbSByZXEgaW4tcHJvZ3Jlc3MgcmVxdWVzdC4KKyAgICogQHBhcmFtIGtleSBrZXkuCisgICAqIEBwYXJhbSB2YWx1ZSBTb3kgZGF0YSB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICBnZXREYXRhKHJlcSkucHV0KGtleSwgdmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lLAorICAgICAgTWFwPFN0cmluZywgPz4gc295RGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmVzLnNldENvbnRlbnRUeXBlKEZvcm1hdFR5cGUuSFRNTC5nZXRNaW1lVHlwZSgpKTsKKyAgICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZyhDaGFyc2V0cy5VVEZfOC5uYW1lKCkpOworICAgICAgc2V0Q2FjaGVIZWFkZXJzKHJlcSwgcmVzKTsKKworICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhbGxEYXRhID0gZ2V0RGF0YShyZXEpOworICAgICAgYWxsRGF0YS5wdXRBbGwoc295RGF0YSk7CisgICAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgICBpZiAoIWFsbERhdGEuY29udGFpbnNLZXkoInJlcG9zaXRvcnlOYW1lIikgJiYgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgYWxsRGF0YS5wdXQoInJlcG9zaXRvcnlOYW1lIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmICghYWxsRGF0YS5jb250YWluc0tleSgiYnJlYWRjcnVtYnMiKSkgeworICAgICAgICBhbGxEYXRhLnB1dCgiYnJlYWRjcnVtYnMiLCB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICAgICAgfQorCisgICAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworICAgICAgcmVuZGVyZXIucmVuZGVyKHJlcywgdGVtcGxhdGVOYW1lLCBhbGxEYXRhKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVxLnJlbW92ZUF0dHJpYnV0ZShEQVRBX0FUVFJJQlVURSk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0Q2FjaGVIZWFkZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CbG9iU295RGF0YS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jsb2JTb3lEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1N2NiYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CbG9iU295RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0NPTU1JVDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5SYXdUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkxhcmdlT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdExvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqIFNveSBkYXRhIGNvbnZlcnRlciBmb3IgZ2l0IGJsb2JzLiAqLworcHVibGljIGNsYXNzIEJsb2JTb3lEYXRhIHsKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGxvYWQgZnJvbSBhIHN1cHBvc2VkIHRleHQgZmlsZSBmb3IgZGlzcGxheS4KKyAgICogRmlsZXMgbGFyZ2VyIHRoYW4gdGhpcyB3aWxsIGJlIGRpc3BsYXllZCBhcyBiaW5hcnkgZmlsZXMsIGV2ZW4gaWYgdGhlCisgICAqIGNvbnRlbnRzIHdhcyB0ZXh0LiBGb3IgZXhhbXBsZSByZWFsbHkgYmlnIFhNTCBmaWxlcyBtYXkgYmUgYWJvdmUgdGhpcyBsaW1pdAorICAgKiBhbmQgd2lsbCBnZXQgZGlzcGxheWVkIGFzIGJpbmFyeS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRklMRV9TSVpFID0gMTAgPDwgMjA7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzVmlldyB2aWV3OworICBwcml2YXRlIGZpbmFsIFJldldhbGsgd2FsazsKKworICBwdWJsaWMgQmxvYlNveURhdGEoUmV2V2FsayB3YWxrLCBHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgdGhpcy52aWV3ID0gdmlldzsKKyAgICB0aGlzLndhbGsgPSB3YWxrOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKE9iamVjdElkIGJsb2JJZCkKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRvU295RGF0YShudWxsLCBibG9iSWQpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKFN0cmluZyBwYXRoLCBPYmplY3RJZCBibG9iSWQpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoNCk7CisgICAgZGF0YS5wdXQoInNoYSIsIE9iamVjdElkLnRvU3RyaW5nKGJsb2JJZCkpOworCisgICAgT2JqZWN0TG9hZGVyIGxvYWRlciA9IHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihibG9iSWQsIENvbnN0YW50cy5PQkpfQkxPQik7CisgICAgU3RyaW5nIGNvbnRlbnQ7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSByYXcgPSBsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoTUFYX0ZJTEVfU0laRSk7CisgICAgICBjb250ZW50ID0gIVJhd1RleHQuaXNCaW5hcnkocmF3KSA/IFJhd1BhcnNlVXRpbHMuZGVjb2RlKHJhdykgOiBudWxsOworICAgIH0gY2F0Y2ggKExhcmdlT2JqZWN0RXhjZXB0aW9uLk91dE9mTWVtb3J5IGUpIHsKKyAgICAgIHRocm93IGU7CisgICAgfSBjYXRjaCAoTGFyZ2VPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgY29udGVudCA9IG51bGw7CisgICAgfQorCisgICAgZGF0YS5wdXQoImRhdGEiLCBjb250ZW50KTsKKyAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CisgICAgICBkYXRhLnB1dCgibGFuZyIsIGd1ZXNzUHJldHRpZnlMYW5nKHBhdGgsIGNvbnRlbnQpKTsKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgZGF0YS5wdXQoInNpemUiLCBMb25nLnRvU3RyaW5nKGxvYWRlci5nZXRTaXplKCkpKTsKKyAgICB9CisgICAgaWYgKHBhdGggIT0gbnVsbCAmJiB2aWV3LmdldFJldmlzaW9uKCkuZ2V0UGVlbGVkVHlwZSgpID09IE9CSl9DT01NSVQpIHsKKyAgICAgIGRhdGEucHV0KCJsb2dVcmwiLCBHaXRpbGVzVmlldy5sb2coKS5jb3B5RnJvbSh2aWV3KS50b1VybCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NQcmV0dGlmeUxhbmcoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB7CisgICAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgiIyEvYmluL3NoIikgfHwgY29udGVudC5zdGFydHNXaXRoKCIjIS9iaW4vYmFzaCIpKSB7CisgICAgICByZXR1cm4gInNoIjsKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgiIyEvdXNyL2Jpbi9wZXJsIikpIHsKKyAgICAgIHJldHVybiAicGVybCI7CisgICAgfSBlbHNlIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoIiMhL3Vzci9iaW4vcHl0aG9uIikpIHsKKyAgICAgIHJldHVybiAicHkiOworICAgIH0gZWxzZSBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgaW50IGRvdCA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICBTdHJpbmcgbGFuZyA9ICgoMCA8IGRvdCkgJiYgKHNsYXNoIDwgZG90KSkgPyBwYXRoLnN1YnN0cmluZyhkb3QgKyAxKSA6IG51bGw7CisgICAgaWYgKCJ0eHQiLmVxdWFsc0lnbm9yZUNhc2UobGFuZykpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSBpZiAoIm1rIi5lcXVhbHNJZ25vcmVDYXNlKGxhbmcpKSB7CisgICAgICByZXR1cm4gInNoIjsKKyAgICB9IGVsc2UgaWYgKCJNYWtlZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShwYXRoKQorICAgICAgICB8fCAoKDAgPCBzbGFzaCkgJiYgIk1ha2VmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHBhdGguc3Vic3RyaW5nKHNsYXNoICsgMSkpKSkgeworICAgICAgcmV0dXJuICJzaCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBsYW5nOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbW1pdFNveURhdGEuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db21taXRTb3lEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4YTk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db21taXRTb3lEYXRhLmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LmRhdGEucmVzdHJpY3RlZC5OdWxsRGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeS5DaGFuZ2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkFic3RyYWN0VHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQ2Fub25pY2FsVHJlZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkVtcHR5VHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5HaXREYXRlRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5HaXREYXRlRm9ybWF0dGVyLkZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmVsYXRpdmVEYXRlRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5OdWxsT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogU295IGRhdGEgY29udmVydGVyIGZvciBnaXQgY29tbWl0cy4gKi8KK3B1YmxpYyBjbGFzcyBDb21taXRTb3lEYXRhIHsKKyAgLyoqIFZhbGlkIHNldHMgb2Yga2V5cyB0byBpbmNsdWRlIGluIFNveSBkYXRhIGZvciBjb21taXRzLiAqLworICBwdWJsaWMgc3RhdGljIGVudW0gS2V5U2V0IHsKKyAgICBERVRBSUwoImF1dGhvciIsICJjb21taXR0ZXIiLCAic2hhIiwgInRyZWUiLCAidHJlZVVybCIsICJwYXJlbnRzIiwgIm1lc3NhZ2UiLCAibG9nVXJsIiksCisgICAgREVUQUlMX0RJRkZfVFJFRShERVRBSUwsICJkaWZmVHJlZSIpLAorICAgIFNIT1JUTE9HKCJhYmJyZXZTaGEiLCAidXJsIiwgInNob3J0TWVzc2FnZSIsICJhdXRob3IiLCAiYnJhbmNoZXMiLCAidGFncyIpLAorICAgIERFRkFVTFQoREVUQUlMKTsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4ga2V5czsKKworICAgIHByaXZhdGUgS2V5U2V0KFN0cmluZy4uLiBrZXlzKSB7CisgICAgICB0aGlzLmtleXMgPSBJbW11dGFibGVTZXQuY29weU9mKGtleXMpOworICAgIH0KKworICAgIHByaXZhdGUgS2V5U2V0KEtleVNldCBvdGhlciwgU3RyaW5nLi4uIGtleXMpIHsKKyAgICAgIHRoaXMua2V5cyA9IEltbXV0YWJsZVNldC48U3RyaW5nPiBidWlsZGVyKCkuYWRkQWxsKG90aGVyLmtleXMpLmFkZChrZXlzKS5idWlsZCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgTGlua2lmaWVyIGxpbmtpZmllcjsKKyAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxOworICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgcmVwbzsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGs7CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc1ZpZXcgdmlldzsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8QW55T2JqZWN0SWQsIFNldDxSZWY+PiByZWZzQnlJZDsKKyAgcHJpdmF0ZSBmaW5hbCBHaXREYXRlRm9ybWF0dGVyIGRhdGVGb3JtYXR0ZXI7CisKKyAgLy8gVE9ETyhkYm9yb3dpdHopOiBUaGlzIGNvbnN0cnVjdG9yIGlzIGdldHRpbmcgYSBiaXQgcmlkaWN1bG91cy4KKyAgcHVibGljIENvbW1pdFNveURhdGEoQE51bGxhYmxlIExpbmtpZmllciBsaW5raWZpZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlcG9zaXRvcnkgcmVwbywKKyAgICAgIFJldldhbGsgd2FsaywgR2l0aWxlc1ZpZXcgdmlldykgeworICAgIHRoaXMobGlua2lmaWVyLCByZXEsIHJlcG8sIHdhbGssIHZpZXcsIG51bGwpOworICB9CisKKyAgcHVibGljIENvbW1pdFNveURhdGEoQE51bGxhYmxlIExpbmtpZmllciBsaW5raWZpZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlcG9zaXRvcnkgcmVwbywKKyAgICAgIFJldldhbGsgd2FsaywgR2l0aWxlc1ZpZXcgdmlldywgQE51bGxhYmxlIE1hcDxBbnlPYmplY3RJZCwgU2V0PFJlZj4+IHJlZnNCeUlkKSB7CisgICAgdGhpcy5saW5raWZpZXIgPSBsaW5raWZpZXI7CisgICAgdGhpcy5yZXEgPSByZXE7CisgICAgdGhpcy5yZXBvID0gcmVwbzsKKyAgICB0aGlzLndhbGsgPSB3YWxrOworICAgIHRoaXMudmlldyA9IHZpZXc7CisgICAgdGhpcy5yZWZzQnlJZCA9IHJlZnNCeUlkOworICAgIHRoaXMuZGF0ZUZvcm1hdHRlciA9IG5ldyBHaXREYXRlRm9ybWF0dGVyKEZvcm1hdC5ERUZBVUxUKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShSZXZDb21taXQgY29tbWl0LCBLZXlTZXQga2V5cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKEtleVNldC5ERUZBVUxULmtleXMuc2l6ZSgpKTsKKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJhdXRob3IiKSkgeworICAgICAgZGF0YS5wdXQoImF1dGhvciIsIHRvU295RGF0YShjb21taXQuZ2V0QXV0aG9ySWRlbnQoKSwgZGF0ZUZvcm1hdHRlcikpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJjb21taXR0ZXIiKSkgeworICAgICAgZGF0YS5wdXQoImNvbW1pdHRlciIsIHRvU295RGF0YShjb21taXQuZ2V0Q29tbWl0dGVySWRlbnQoKSwgZGF0ZUZvcm1hdHRlcikpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJzaGEiKSkgeworICAgICAgZGF0YS5wdXQoInNoYSIsIE9iamVjdElkLnRvU3RyaW5nKGNvbW1pdCkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJhYmJyZXZTaGEiKSkgeworICAgICAgT2JqZWN0UmVhZGVyIHJlYWRlciA9IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5uZXdSZWFkZXIoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGEucHV0KCJhYmJyZXZTaGEiLCByZWFkZXIuYWJicmV2aWF0ZShjb21taXQpLm5hbWUoKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICByZWFkZXIucmVsZWFzZSgpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJ1cmwiKSkgeworICAgICAgZGF0YS5wdXQoInVybCIsIEdpdGlsZXNWaWV3LnJldmlzaW9uKCkKKyAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAuc2V0UmV2aXNpb24oY29tbWl0KQorICAgICAgICAgIC50b1VybCgpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygibG9nVXJsIikpIHsKKyAgICAgIFJldmlzaW9uIHJldiA9IHZpZXcuZ2V0UmV2aXNpb24oKTsKKyAgICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgbG9nVmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgLnNldFJldmlzaW9uKHJldi5nZXRJZCgpLmVxdWFscyhjb21taXQpID8gcmV2LmdldE5hbWUoKSA6IGNvbW1pdC5uYW1lKCksIGNvbW1pdCkKKyAgICAgICAgICAuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24uTlVMTCkKKyAgICAgICAgICAuc2V0VHJlZVBhdGgobnVsbCk7CisgICAgICBkYXRhLnB1dCgibG9nVXJsIiwgbG9nVmlldy50b1VybCgpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygidHJlZSIpKSB7CisgICAgICBkYXRhLnB1dCgidHJlZSIsIE9iamVjdElkLnRvU3RyaW5nKGNvbW1pdC5nZXRUcmVlKCkpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygidHJlZVVybCIpKSB7CisgICAgICBkYXRhLnB1dCgidHJlZVVybCIsIEdpdGlsZXNWaWV3LnBhdGgoKS5jb3B5RnJvbSh2aWV3KS5zZXRUcmVlUGF0aCgiLyIpLnRvVXJsKCkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJwYXJlbnRzIikpIHsKKyAgICAgIGRhdGEucHV0KCJwYXJlbnRzIiwgdG9Tb3lEYXRhKHZpZXcsIGNvbW1pdC5nZXRQYXJlbnRzKCkpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygic2hvcnRNZXNzYWdlIikpIHsKKyAgICAgIGRhdGEucHV0KCJzaG9ydE1lc3NhZ2UiLCBjb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJicmFuY2hlcyIpKSB7CisgICAgICBkYXRhLnB1dCgiYnJhbmNoZXMiLCBnZXRSZWZzQnlJZChjb21taXQsIENvbnN0YW50cy5SX0hFQURTKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInRhZ3MiKSkgeworICAgICAgZGF0YS5wdXQoInRhZ3MiLCBnZXRSZWZzQnlJZChjb21taXQsIENvbnN0YW50cy5SX1RBR1MpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygibWVzc2FnZSIpKSB7CisgICAgICBpZiAobGlua2lmaWVyICE9IG51bGwpIHsKKyAgICAgICAgZGF0YS5wdXQoIm1lc3NhZ2UiLCBsaW5raWZpZXIubGlua2lmeShyZXEsIGNvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhLnB1dCgibWVzc2FnZSIsIGNvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygiZGlmZlRyZWUiKSkgeworICAgICAgZGF0YS5wdXQoImRpZmZUcmVlIiwgY29tcHV0ZURpZmZUcmVlKGNvbW1pdCkpOworICAgIH0KKyAgICBjaGVja1N0YXRlKGtleXMua2V5cy5zaXplKCkgPT0gZGF0YS5zaXplKCksICJiYWQgY29tbWl0IGRhdGEga2V5czogJXMgIT0gJXMiLCBrZXlzLmtleXMsCisgICAgICAgIGRhdGEua2V5U2V0KCkpOworICAgIHJldHVybiBJbW11dGFibGVNYXAuY29weU9mKGRhdGEpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKFJldkNvbW1pdCBjb21taXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRvU295RGF0YShjb21taXQsIEtleVNldC5ERUZBVUxUKTsKKyAgfQorCisgIC8vIFRPRE8oZGJvcm93aXR6KTogRXh0cmFjdCB0aGlzLgorICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB0b1NveURhdGEoUGVyc29uSWRlbnQgaWRlbnQsIEdpdERhdGVGb3JtYXR0ZXIgZGF0ZUZvcm1hdHRlcikgeworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJuYW1lIiwgaWRlbnQuZ2V0TmFtZSgpLAorICAgICAgICAiZW1haWwiLCBpZGVudC5nZXRFbWFpbEFkZHJlc3MoKSwKKyAgICAgICAgInRpbWUiLCBkYXRlRm9ybWF0dGVyLmZvcm1hdERhdGUoaWRlbnQpLAorICAgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IFN3aXRjaCBmcm9tIHJlbGF0aXZlIHRvIGFic29sdXRlIGF0IHNvbWUgdGhyZXNob2xkLgorICAgICAgICAicmVsYXRpdmVUaW1lIiwgUmVsYXRpdmVEYXRlRm9ybWF0dGVyLmZvcm1hdChpZGVudC5nZXRXaGVuKCkpKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiB0b1NveURhdGEoR2l0aWxlc1ZpZXcgdmlldywgUmV2Q29tbWl0W10gcGFyZW50cykgeworICAgIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHBhcmVudHMubGVuZ3RoKTsKKyAgICBpbnQgaSA9IDE7CisgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBSZW5kZXIgc29tZXRoaW5nIHNsaWdodGx5IGRpZmZlcmVudCB3aGVuIHdlJ3JlIGFjdGl2ZWx5CisgICAgLy8gdmlld2luZyBhIGRpZmYgYWdhaW5zdCBvbmUgb2YgdGhlIHBhcmVudHMuCisgICAgZm9yIChSZXZDb21taXQgcGFyZW50IDogcGFyZW50cykgeworICAgICAgU3RyaW5nIG5hbWUgPSBwYXJlbnQubmFtZSgpOworICAgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciBkaWZmID0gR2l0aWxlc1ZpZXcuZGlmZigpLmNvcHlGcm9tKHZpZXcpLnNldFRyZWVQYXRoKCIiKTsKKyAgICAgIFN0cmluZyBwYXJlbnROYW1lOworICAgICAgaWYgKHBhcmVudHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgcGFyZW50TmFtZSA9IHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkgKyAiXiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJlbnROYW1lID0gdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSArICJeIiArIChpKyspOworICAgICAgfQorICAgICAgcmVzdWx0LmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgInNoYSIsIG5hbWUsCisgICAgICAgICAgInVybCIsIEdpdGlsZXNWaWV3LnJldmlzaW9uKCkKKyAgICAgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgICAgIC5zZXRSZXZpc2lvbihwYXJlbnROYW1lLCBwYXJlbnQpCisgICAgICAgICAgICAgIC50b1VybCgpLAorICAgICAgICAgICJkaWZmVXJsIiwgZGlmZi5zZXRPbGRSZXZpc2lvbihwYXJlbnROYW1lLCBwYXJlbnQpLnRvVXJsKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZ2V0VHJlZUl0ZXJhdG9yKFJldldhbGsgd2FsaywgUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBDYW5vbmljYWxUcmVlUGFyc2VyIHAgPSBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcigpOworICAgIHAucmVzZXQod2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgd2Fsay5wYXJzZVRyZWUod2Fsay5wYXJzZUNvbW1pdChjb21taXQpLmdldFRyZWUoKSkpOworICAgIHJldHVybiBwOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgY29tcHV0ZURpZmZUcmVlKFJldkNvbW1pdCBjb21taXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb2xkVHJlZTsKKyAgICBHaXRpbGVzVmlldy5CdWlsZGVyIGRpZmZVcmwgPSBHaXRpbGVzVmlldy5kaWZmKCkuY29weUZyb20odmlldykKKyAgICAgICAgLnNldFRyZWVQYXRoKCIiKTsKKyAgICBzd2l0Y2ggKGNvbW1pdC5nZXRQYXJlbnRDb3VudCgpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIG9sZFRyZWUgPSBuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKTsKKyAgICAgICAgZGlmZlVybC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi5OVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIG9sZFRyZWUgPSBnZXRUcmVlSXRlcmF0b3Iod2FsaywgY29tbWl0LmdldFBhcmVudCgwKSk7CisgICAgICAgIGRpZmZVcmwuc2V0T2xkUmV2aXNpb24odmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSArICJeIiwgY29tbWl0LmdldFBhcmVudCgwKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBoYW5kbGUgbWVyZ2VzCisgICAgICAgIHJldHVybiBOdWxsRGF0YS5JTlNUQU5DRTsKKyAgICB9CisgICAgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbmV3VHJlZSA9IGdldFRyZWVJdGVyYXRvcih3YWxrLCBjb21taXQpOworCisgICAgRGlmZkZvcm1hdHRlciBkaWZmID0gbmV3IERpZmZGb3JtYXR0ZXIoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSk7CisgICAgdHJ5IHsKKyAgICAgIGRpZmYuc2V0UmVwb3NpdG9yeShyZXBvKTsKKyAgICAgIGRpZmYuc2V0RGV0ZWN0UmVuYW1lcyh0cnVlKTsKKworICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChEaWZmRW50cnkgZSA6IGRpZmYuc2NhbihvbGRUcmVlLCBuZXdUcmVlKSkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSg1KTsKKyAgICAgICAgZW50cnkucHV0KCJwYXRoIiwgZS5nZXROZXdQYXRoKCkpOworICAgICAgICBlbnRyeS5wdXQoInVybCIsIEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgICAuc2V0VHJlZVBhdGgoZS5nZXROZXdQYXRoKCkpCisgICAgICAgICAgICAudG9VcmwoKSk7CisgICAgICAgIGVudHJ5LnB1dCgiZGlmZlVybCIsIGRpZmZVcmwuc2V0QW5jaG9yKCJGIiArIHJlc3VsdC5zaXplKCkpLnRvVXJsKCkpOworICAgICAgICBlbnRyeS5wdXQoImNoYW5nZVR5cGUiLCBlLmdldENoYW5nZVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGUuZ2V0Q2hhbmdlVHlwZSgpID09IENoYW5nZVR5cGUuQ09QWSB8fCBlLmdldENoYW5nZVR5cGUoKSA9PSBDaGFuZ2VUeXBlLlJFTkFNRSkgeworICAgICAgICAgIGVudHJ5LnB1dCgib2xkUGF0aCIsIGUuZ2V0T2xkUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRpZmYucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8TWFwPFN0cmluZywgU3RyaW5nPj4gTkFNRV9DT01QQVJBVE9SID0KKyAgICAgIG5ldyBDb21wYXJhdG9yPE1hcDxTdHJpbmcsIFN0cmluZz4+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1hcDxTdHJpbmcsIFN0cmluZz4gbzEsIE1hcDxTdHJpbmcsIFN0cmluZz4gbzIpIHsKKyAgICAgICAgICByZXR1cm4gbzEuZ2V0KCJuYW1lIikuY29tcGFyZVRvKG8yLmdldCgibmFtZSIpKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICBwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0UmVmc0J5SWQoT2JqZWN0SWQgaWQsIFN0cmluZyBwcmVmaXgpIHsKKyAgICBjaGVja05vdE51bGwocmVmc0J5SWQsICJtdXN0IHBhc3MgaW4gSUQgdG8gcmVmIG1hcCB0byBsb29rIHVwIHJlZnMgYnkgSUQiKTsKKyAgICBTZXQ8UmVmPiByZWZzID0gcmVmc0J5SWQuZ2V0KGlkKTsKKyAgICBpZiAocmVmcyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZigpOworICAgIH0KKyAgICBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyZWZzLnNpemUoKSk7CisgICAgZm9yIChSZWYgcmVmIDogcmVmcykgeworICAgICAgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7CisgICAgICAgIHJlc3VsdC5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJuYW1lIiwgcmVmLmdldE5hbWUoKS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKSwKKyAgICAgICAgICAidXJsIiwgR2l0aWxlc1ZpZXcucmV2aXNpb24oKQorICAgICAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKHJlZi5nZXROYW1lKCksIHJlZi5nZXRPYmplY3RJZCgpKSkKKyAgICAgICAgICAgICAgLnRvVXJsKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIE5BTUVfQ09NUEFSQVRPUik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWwuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4NzMzYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmpvZGEudGltZS5EdXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKiogVXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGgge0BsaW5rIENvbmZpZ30gb2JqZWN0cy4gKi8KK3B1YmxpYyBjbGFzcyBDb25maWdVdGlsIHsKKyAgLyoqCisgICAqIFJlYWQgYSBkdXJhdGlvbiB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgorICAgKiA8cD4KKyAgICogRHVyYXRpb25zIGNhbiBiZSB3cml0dGVuIGFzIGV4cHJlc3Npb25zLCBmb3IgZXhhbXBsZSB7QGNvZGUgIjEgcyJ9IG9yCisgICAqIHtAY29kZSAiNSBkYXlzIn0uIElmIHVuaXRzIGFyZSBub3Qgc3BlY2lmaWVkLCBtaWxsaXNlY29uZHMgYXJlIGFzc3VtZWQuCisgICAqCisgICAqIEBwYXJhbSBjb25maWcgSkdpdCBjb25maWcgb2JqZWN0LgorICAgKiBAcGFyYW0gc2VjdGlvbiBzZWN0aW9uIHRvIHJlYWQsIGUuZy4gImdvb2dsZSIKKyAgICogQHBhcmFtIHN1YnNlY3Rpb24gc3Vic2VjdGlvbiB0byByZWFkLCBlLmcuICJiaWd0YWJsZSIKKyAgICogQHBhcmFtIG5hbWUgdmFyaWFibGUgdG8gcmVhZCwgZS5nLiAiZGVhZGxpbmUiLgorICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgYXNzaWduZWQuCisgICAqIEByZXR1cm4gYSBzdGFuZGFyZCBkdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIHRpbWUgcmVhZCwgb3IgZGVmYXVsdFZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBnZXREdXJhdGlvbihDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sIFN0cmluZyBuYW1lLAorICAgICAgRHVyYXRpb24gZGVmYXVsdFZhbHVlKSB7CisgICAgU3RyaW5nIHZhbFN0ciA9IGNvbmZpZy5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisgICAgaWYgKHZhbFN0ciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgdmFsU3RyID0gdmFsU3RyLnRyaW0oKTsKKyAgICBpZiAodmFsU3RyLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICBNYXRjaGVyIG0gPSBtYXRjaGVyKCJeKFsxLTldWzAtOV0qKD86XFwuWzAtOV0qKT8pXFxzKiguKikkIiwgdmFsU3RyKTsKKyAgICBpZiAoIW0ubWF0Y2hlcygpKSB7CisgICAgICBTdHJpbmcga2V5ID0gc2VjdGlvbiArIChzdWJzZWN0aW9uICE9IG51bGwgPyAiLiIgKyBzdWJzZWN0aW9uIDogIiIpICsgIi4iICsgbmFtZTsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCB0aW1lIHVuaXQ6ICIgKyBrZXkgKyAiID0gIiArIHZhbFN0cik7CisgICAgfQorCisgICAgU3RyaW5nIGRpZ2l0cyA9IG0uZ3JvdXAoMSk7CisgICAgU3RyaW5nIHVuaXROYW1lID0gbS5ncm91cCgyKS50cmltKCk7CisKKyAgICBUaW1lVW5pdCB1bml0OworICAgIGlmICgiIi5lcXVhbHModW5pdE5hbWUpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworICAgIH0gZWxzZSBpZiAoYW55T2YodW5pdE5hbWUsICJtcyIsICJtaWxsaXMiLCAibWlsbGlzZWNvbmQiLCAibWlsbGlzZWNvbmRzIikpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7CisgICAgfSBlbHNlIGlmIChhbnlPZih1bml0TmFtZSwgInMiLCAic2VjIiwgInNlY29uZCIsICJzZWNvbmRzIikpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIH0gZWxzZSBpZiAoYW55T2YodW5pdE5hbWUsICJtIiwgIm1pbiIsICJtaW51dGUiLCAibWludXRlcyIpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuTUlOVVRFUzsKKyAgICB9IGVsc2UgaWYgKGFueU9mKHVuaXROYW1lLCAiaCIsICJociIsICJob3VyIiwgImhvdXJzIikpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5IT1VSUzsKKyAgICB9IGVsc2UgaWYgKGFueU9mKHVuaXROYW1lLCAiZCIsICJkYXkiLCAiZGF5cyIpKSB7CisgICAgICB1bml0ID0gVGltZVVuaXQuREFZUzsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIGtleSA9IHNlY3Rpb24gKyAoc3Vic2VjdGlvbiAhPSBudWxsID8gIi4iICsgc3Vic2VjdGlvbiA6ICIiKSArICIuIiArIG5hbWU7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgdGltZSB1bml0OiAiICsga2V5ICsgIiA9ICIgKyB2YWxTdHIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAoZGlnaXRzLmluZGV4T2YoJy4nKSA9PSAtMSkgeworICAgICAgICBsb25nIHZhbCA9IExvbmcucGFyc2VMb25nKGRpZ2l0cyk7CisgICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24odmFsICogVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMSwgdW5pdCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG91YmxlIHZhbCA9IERvdWJsZS5wYXJzZURvdWJsZShkaWdpdHMpOworICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uKChsb25nKSAodmFsICogVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMSwgdW5pdCkpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICBTdHJpbmcga2V5ID0gc2VjdGlvbiArIChzdWJzZWN0aW9uICE9IG51bGwgPyAiLiIgKyBzdWJzZWN0aW9uIDogIiIpICsgIi4iICsgbmFtZTsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCB0aW1lIHVuaXQ6ICIgKyBrZXkgKyAiID0gIiArIHZhbFN0ciwgbmZlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IGEge0BsaW5rIENhY2hlQnVpbGRlcn0gZnJvbSBhIGNvbmZpZy4KKyAgICoKKyAgICogQHBhcmFtIGNvbmZpZyBKR2l0IGNvbmZpZyBvYmplY3QuCisgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGNhY2hlIHN1YnNlY3Rpb24gdW5kZXIgdGhlICJjYWNoZSIgc2VjdGlvbi4KKyAgICogQHJldHVybiBhIG5ldyBjYWNoZSBidWlsZGVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBDYWNoZUJ1aWxkZXI8T2JqZWN0LCBPYmplY3Q+IGdldENhY2hlQnVpbGRlcihDb25maWcgY29uZmlnLCBTdHJpbmcgbmFtZSkgeworICAgIENhY2hlQnVpbGRlcjxPYmplY3QsIE9iamVjdD4gYiA9IENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChjb25maWcuZ2V0U3RyaW5nKCJjYWNoZSIsIG5hbWUsICJtYXhpbXVtV2VpZ2h0IikgIT0gbnVsbCkgeworICAgICAgICBiLm1heGltdW1XZWlnaHQoY29uZmlnLmdldExvbmcoImNhY2hlIiwgbmFtZSwgIm1heGltdW1XZWlnaHQiLCAyMCA8PCAyMCkpOworICAgICAgfQorICAgICAgaWYgKGNvbmZpZy5nZXRTdHJpbmcoImNhY2hlIiwgbmFtZSwgIm1heGltdW1TaXplIikgIT0gbnVsbCkgeworICAgICAgICBiLm1heGltdW1TaXplKGNvbmZpZy5nZXRMb25nKCJjYWNoZSIsIG5hbWUsICJtYXhpbXVtU2l6ZSIsIDE2Mzg0KSk7CisgICAgICB9CisgICAgICBEdXJhdGlvbiBleHBpcmVBZnRlcldyaXRlID0gZ2V0RHVyYXRpb24oY29uZmlnLCAiY2FjaGUiLCBuYW1lLCAiZXhwaXJlQWZ0ZXJXcml0ZSIsIG51bGwpOworICAgICAgaWYgKGV4cGlyZUFmdGVyV3JpdGUgIT0gbnVsbCkgeworICAgICAgICBiLmV4cGlyZUFmdGVyV3JpdGUoZXhwaXJlQWZ0ZXJXcml0ZS5nZXRNaWxsaXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgIH0KKyAgICAgIER1cmF0aW9uIGV4cGlyZUFmdGVyQWNjZXNzID0gZ2V0RHVyYXRpb24oY29uZmlnLCAiY2FjaGUiLCBuYW1lLCAiZXhwaXJlQWZ0ZXJBY2Nlc3MiLCBudWxsKTsKKyAgICAgIGlmIChleHBpcmVBZnRlckFjY2VzcyAhPSBudWxsKSB7CisgICAgICAgIGIuZXhwaXJlQWZ0ZXJBY2Nlc3MoZXhwaXJlQWZ0ZXJBY2Nlc3MuZ2V0TWlsbGlzKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICB9CisgICAgICAvLyBBZGQgb3RoZXIgbWV0aG9kcyBhcyBuZWVkZWQuCisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgQ2FjaGVCdWlsZGVyIGZvciAiICsgbmFtZSwgZSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgQ2FjaGVCdWlsZGVyIGZvciAiICsgbmFtZSwgZSk7CisgICAgfQorICAgIHJldHVybiBiOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWF0Y2hlciBtYXRjaGVyKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgdmFsU3RyKSB7CisgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pLm1hdGNoZXIodmFsU3RyKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYW55T2YoU3RyaW5nIGEsIFN0cmluZy4uLiBjYXNlcykgeworICAgIHJldHVybiBJdGVyYWJsZXMuYW55KEltbXV0YWJsZUxpc3QuY29weU9mKGNhc2VzKSwKKyAgICAgICAgUHJlZGljYXRlcy5lcXVhbFRvKGEudG9Mb3dlckNhc2UoKSkpOworICB9CisKKyAgcHJpdmF0ZSBDb25maWdVdGlsKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVidWdSZW5kZXJlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlYnVnUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY1MThhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlYnVnUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kuU295RmlsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS50b2Z1LlNveVRvZnU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqIFJlbmRlcmVyIHRoYXQgcmVsb2FkcyBTb3kgdGVtcGxhdGVzIGZyb20gdGhlIGZpbGVzeXN0ZW0gb24gZXZlcnkgcmVxdWVzdC4gKi8KK3B1YmxpYyBjbGFzcyBEZWJ1Z1JlbmRlcmVyIGV4dGVuZHMgUmVuZGVyZXIgeworICBwdWJsaWMgRGVidWdSZW5kZXJlcihTdHJpbmcgc3RhdGljUHJlZml4LCBTdHJpbmcgY3VzdG9tVGVtcGxhdGVzRmlsZW5hbWUsCisgICAgICBmaW5hbCBTdHJpbmcgc295VGVtcGxhdGVzUm9vdCkgeworICAgIHN1cGVyKAorICAgICAgICBuZXcgRnVuY3Rpb248U3RyaW5nLCBVUkw+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBVUkwgYXBwbHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0ZpbGVVUkwoc295VGVtcGxhdGVzUm9vdCArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBJbW11dGFibGVNYXAuPFN0cmluZywgU3RyaW5nPiBvZigpLCBzdGF0aWNQcmVmaXgsCisgICAgICAgIHRvRmlsZVVSTChjdXN0b21UZW1wbGF0ZXNGaWxlbmFtZSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTb3lUb2Z1IGdldFRvZnUoKSB7CisgICAgU295RmlsZVNldC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU295RmlsZVNldC5CdWlsZGVyKCkKKyAgICAgICAgLnNldENvbXBpbGVUaW1lR2xvYmFscyhnbG9iYWxzKTsKKyAgICBmb3IgKFVSTCB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2hlY2tTdGF0ZShuZXcgRmlsZSh0ZW1wbGF0ZS50b1VSSSgpKS5leGlzdHMoKSwgIk1pc3NpbmcgU295IHRlbXBsYXRlICVzIiwgdGVtcGxhdGUpOworICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICAgIGJ1aWxkZXIuYWRkKHRlbXBsYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5jb21waWxlVG9Ub2Z1KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0QWNjZXNzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdEFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdEFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5RdWV1ZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuRmlsZVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEdpdGlsZXNBY2Nlc3N9IHdpdGggbG9jYWwgcmVwb3NpdG9yaWVzLgorICogPHA+CisgKiBSZXBvc2l0b3JpZXMgYXJlIHNjYW5uZWQgb24tZGVtYW5kIHVuZGVyIHRoZSBnaXZlbiBwYXRoLCBjb25maWd1cmVkIGJ5CisgKiBkZWZhdWx0IGZyb20ge0Bjb2RlIGdpdGlsZXMuYmFzZVBhdGh9LiBUaGVyZSBpcyBubyBhY2Nlc3MgY29udHJvbCBiZXlvbmQgd2hhdAorICogdXNlciB0aGUgSlZNIGlzIHJ1bm5pbmcgdW5kZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0QWNjZXNzIGltcGxlbWVudHMgR2l0aWxlc0FjY2VzcyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk9OWU1PVVNfVVNFUl9LRVkgPSAiYW5vbnltb3VzIHVzZXIiOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSB7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGJhc2VQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbEJhc2VQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJhc2VHaXRVcmw7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcjsKKworICAgIEZhY3RvcnkoRmlsZSBiYXNlUGF0aCwgU3RyaW5nIGJhc2VHaXRVcmwsIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcy5iYXNlUGF0aCA9IGNoZWNrTm90TnVsbChiYXNlUGF0aCwgImJhc2VQYXRoIik7CisgICAgICB0aGlzLmJhc2VHaXRVcmwgPSBjaGVja05vdE51bGwoYmFzZUdpdFVybCwgImJhc2VHaXRVcmwiKTsKKyAgICAgIHRoaXMucmVzb2x2ZXIgPSBjaGVja05vdE51bGwocmVzb2x2ZXIsICJyZXNvbHZlciIpOworICAgICAgdGhpcy5jYW5vbmljYWxCYXNlUGF0aCA9IGJhc2VQYXRoLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR2l0aWxlc0FjY2VzcyBmb3JSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgIFN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgICBTdHJpbmcgcmVwb3NpdG9yeVBhdGg7CisgICAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT0gIi8iKSB7CisgICAgICAgIHJlcG9zaXRvcnlQYXRoID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzbGFzaFBsdXMgPSBwYXRoLmluZGV4T2YoIi8rLyIpOworICAgICAgICBpZiAoc2xhc2hQbHVzID49IDApIHsKKyAgICAgICAgICByZXBvc2l0b3J5UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHNsYXNoUGx1cyk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0aC5lbmRzV2l0aCgiLysiKSkgeworICAgICAgICAgIHJlcG9zaXRvcnlQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlcG9zaXRvcnlQYXRoID0gcGF0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5ld0FjY2VzcyhiYXNlUGF0aCwgY2Fub25pY2FsQmFzZVBhdGgsIGJhc2VHaXRVcmwsIHJlc29sdmVyLCByZXEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBEZWZhdWx0QWNjZXNzIG5ld0FjY2VzcyhGaWxlIGJhc2VQYXRoLCBTdHJpbmcgY2Fub25pY2FsQmFzZVBhdGgsIFN0cmluZyBiYXNlR2l0VXJsLAorICAgICAgICBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0QWNjZXNzKGJhc2VQYXRoLCBjYW5vbmljYWxCYXNlUGF0aCwgYmFzZUdpdFVybCwgcmVzb2x2ZXIsIHJlcSk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGZpbmFsIEZpbGUgYmFzZVBhdGg7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgY2Fub25pY2FsQmFzZVBhdGg7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYmFzZUdpdFVybDsKKyAgcHJvdGVjdGVkIGZpbmFsIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyOworICBwcm90ZWN0ZWQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKKworICBwcm90ZWN0ZWQgRGVmYXVsdEFjY2VzcyhGaWxlIGJhc2VQYXRoLCBTdHJpbmcgY2Fub25pY2FsQmFzZVBhdGgsIFN0cmluZyBiYXNlR2l0VXJsLAorICAgICAgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICB0aGlzLmJhc2VQYXRoID0gY2hlY2tOb3ROdWxsKGJhc2VQYXRoLCAiYmFzZVBhdGgiKTsKKyAgICB0aGlzLmNhbm9uaWNhbEJhc2VQYXRoID0gY2hlY2tOb3ROdWxsKGNhbm9uaWNhbEJhc2VQYXRoLCAiY2Fub25pY2FsQmFzZVBhdGgiKTsKKyAgICB0aGlzLmJhc2VHaXRVcmwgPSBjaGVja05vdE51bGwoYmFzZUdpdFVybCwgImJhc2VHaXRVcmwiKTsKKyAgICB0aGlzLnJlc29sdmVyID0gY2hlY2tOb3ROdWxsKHJlc29sdmVyLCAicmVzb2x2ZXIiKTsKKyAgICB0aGlzLnJlcSA9IGNoZWNrTm90TnVsbChyZXEsICJyZXEiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBsaXN0UmVwb3NpdG9yaWVzKFNldDxTdHJpbmc+IGJyYW5jaGVzKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IHJlcG9zID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgZm9yIChSZXBvc2l0b3J5IHJlcG8gOiBzY2FuUmVwb3NpdG9yaWVzKGJhc2VQYXRoLCByZXEpKSB7CisgICAgICByZXBvcy5wdXQoZ2V0UmVwb3NpdG9yeU5hbWUocmVwbyksIGJ1aWxkRGVzY3JpcHRpb24ocmVwbywgYnJhbmNoZXMpKTsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcG9zOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZ2V0VXNlcktleSgpIHsKKyAgICAvLyBBbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFub255bW91cyB1c2VyIGtleSAoZWZmZWN0aXZlbHkgcnVubmluZyB3aXRoIHRoZQorICAgIC8vIHNhbWUgdXNlciBwZXJtaXNzaW9ucyBhcyB0aGUgSlZNKS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvci4KKyAgICByZXR1cm4gQU5PTllNT1VTX1VTRVJfS0VZOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKSB7CisgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlOYW1lKFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZ2V0UmVwb3NpdG9yeURlc2NyaXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYnVpbGREZXNjcmlwdGlvbihTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpLCBDb2xsZWN0aW9ucy48U3RyaW5nPiBlbXB0eVNldCgpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKFJlcG9zaXRvcnkgcmVwbykgeworICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcG8pOworICAgIGlmIChyZXBvLmlzQmFyZSgpICYmIHBhdGguZW5kc1dpdGgoIi5naXQiKSkgeworICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKKyAgICB9CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoUmVwb3NpdG9yeSByZXBvKSB7CisgICAgU3RyaW5nIHBhdGggPSByZXBvLmlzQmFyZSgpID8gcmVwby5nZXREaXJlY3RvcnkoKS5nZXRQYXRoKCkgOiByZXBvLmdldERpcmVjdG9yeSgpLmdldFBhcmVudCgpOworICAgIGlmIChyZXBvLmlzQmFyZSgpKSB7CisgICAgICBwYXRoID0gcmVwby5nZXREaXJlY3RvcnkoKS5nZXRQYXRoKCk7CisgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLmdpdCIpKSB7CisgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBhdGggPSByZXBvLmdldERpcmVjdG9yeSgpLmdldFBhcmVudCgpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKHBhdGgpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgU3RyaW5nIGJhc2UgPSBiYXNlUGF0aC5nZXRQYXRoKCk7CisgICAgaWYgKHBhdGguc3RhcnRzV2l0aChiYXNlKSkgeworICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKGJhc2UubGVuZ3RoKCkgKyAxKTsKKyAgICB9CisgICAgaWYgKHBhdGguc3RhcnRzV2l0aChjYW5vbmljYWxCYXNlUGF0aCkpIHsKKyAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhjYW5vbmljYWxCYXNlUGF0aC5sZW5ndGgoKSArIDEpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIlJlcG9zaXRvcnkgcGF0aCAlcyBpcyBvdXRzaWRlIGJhc2UgcGF0aCAlcyIsIHBhdGgsIGJhc2UpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGxvYWREZXNjcmlwdGlvblRleHQoUmVwb3NpdG9yeSByZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBkZXNjID0gbnVsbDsKKyAgICBTdG9yZWRDb25maWcgY29uZmlnID0gcmVwby5nZXRDb25maWcoKTsKKyAgICBJT0V4Y2VwdGlvbiBjb25maWdFcnJvciA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGNvbmZpZy5sb2FkKCk7CisgICAgICBkZXNjID0gY29uZmlnLmdldFN0cmluZygiZ2l0d2ViIiwgbnVsbCwgImRlc2NyaXB0aW9uIik7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICBjb25maWdFcnJvciA9IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgaWYgKGRlc2MgPT0gbnVsbCkgeworICAgICAgRmlsZSBkZXNjRmlsZSA9IG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksICJkZXNjcmlwdGlvbiIpOworICAgICAgaWYgKGRlc2NGaWxlLmV4aXN0cygpKSB7CisgICAgICAgIGRlc2MgPSBuZXcgU3RyaW5nKElPLnJlYWRGdWxseShkZXNjRmlsZSkpOworICAgICAgfSBlbHNlIGlmIChjb25maWdFcnJvciAhPSBudWxsKSB7CisgICAgICAgIHRocm93IGNvbmZpZ0Vycm9yOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzYzsKKyAgfQorCisgIHByaXZhdGUgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGJ1aWxkRGVzY3JpcHRpb24oUmVwb3NpdG9yeSByZXBvLCBTZXQ8U3RyaW5nPiBicmFuY2hlcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeURlc2NyaXB0aW9uIGRlc2MgPSBuZXcgUmVwb3NpdG9yeURlc2NyaXB0aW9uKCk7CisgICAgZGVzYy5uYW1lID0gZ2V0UmVwb3NpdG9yeU5hbWUocmVwbyk7CisgICAgZGVzYy5jbG9uZVVybCA9IGJhc2VHaXRVcmwgKyBnZXRSZWxhdGl2ZVBhdGgocmVwbyk7CisgICAgZGVzYy5kZXNjcmlwdGlvbiA9IGxvYWREZXNjcmlwdGlvblRleHQocmVwbyk7CisgICAgaWYgKCFicmFuY2hlcy5pc0VtcHR5KCkpIHsKKyAgICAgIGRlc2MuYnJhbmNoZXMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBicmFuY2hlcykgeworICAgICAgICBSZWYgcmVmID0gcmVwby5nZXRSZWYobm9ybWFsaXplUmVmTmFtZShuYW1lKSk7CisgICAgICAgIGlmICgocmVmICE9IG51bGwpICYmIChyZWYuZ2V0T2JqZWN0SWQoKSAhPSBudWxsKSkgeworICAgICAgICAgIGRlc2MuYnJhbmNoZXMucHV0KG5hbWUsIHJlZi5nZXRPYmplY3RJZCgpLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc2M7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplUmVmTmFtZShTdHJpbmcgbmFtZSkgeworICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInJlZnMvIikpIHsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICByZXR1cm4gInJlZnMvaGVhZHMvIiArIG5hbWU7CisgIH0KKworICBwcml2YXRlIENvbGxlY3Rpb248UmVwb3NpdG9yeT4gc2NhblJlcG9zaXRvcmllcyhmaW5hbCBGaWxlIGJhc2VQYXRoLCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8UmVwb3NpdG9yeT4gcmVwb3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBRdWV1ZTxGaWxlPiB0b2RvID0gUXVldWVzLm5ld0FycmF5RGVxdWUoKTsKKyAgICBGaWxlW10gYmFzZUZpbGVzID0gYmFzZVBhdGgubGlzdEZpbGVzKCk7CisgICAgaWYgKGJhc2VGaWxlcyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImJhc2UgcGF0aCBpcyBub3QgYSBkaXJlY3Rvcnk6ICIgKyBiYXNlUGF0aC5nZXRQYXRoKCkpOworICAgIH0KKyAgICB0b2RvLmFkZEFsbChBcnJheXMuYXNMaXN0KGJhc2VGaWxlcykpOworICAgIHdoaWxlICghdG9kby5pc0VtcHR5KCkpIHsKKyAgICAgIEZpbGUgZmlsZSA9IHRvZG8ucmVtb3ZlKCk7CisgICAgICB0cnkgeworICAgICAgICByZXBvcy5hZGQocmVzb2x2ZXIub3BlbihyZXEsIGdldFJlbGF0aXZlUGF0aChmaWxlLmdldFBhdGgoKSkpKTsKKyAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisgICAgICAgICAgdG9kby5hZGRBbGwoQXJyYXlzLmFzTGlzdChjaGlsZHJlbikpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlcG9zOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFJlbmRlcmVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiZDFmYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0UmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uUmVzb3VyY2VzOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LlNveUZpbGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kudG9mdS5Tb3lUb2Z1OworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKiBSZW5kZXJlciB0aGF0IHByZWNvbXBpbGVzIFNveSBhbmQgdXNlcyBzdGF0aWMgcHJlY29tcGlsZWQgQ1NTLiAqLworcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBTb3lUb2Z1IHRvZnU7CisKKyAgRGVmYXVsdFJlbmRlcmVyKCkgeworICAgIHRoaXMoIiIsIG51bGwpOworICB9CisKKyAgcHVibGljIERlZmF1bHRSZW5kZXJlcihTdHJpbmcgc3RhdGljUHJlZml4LCBVUkwgY3VzdG9tVGVtcGxhdGVzKSB7CisgICAgdGhpcyhJbW11dGFibGVNYXAuPFN0cmluZywgU3RyaW5nPiBvZigpLCBzdGF0aWNQcmVmaXgsIGN1c3RvbVRlbXBsYXRlcyk7CisgIH0KKworICBwdWJsaWMgRGVmYXVsdFJlbmRlcmVyKE1hcDxTdHJpbmcsIFN0cmluZz4gZ2xvYmFscywgU3RyaW5nIHN0YXRpY1ByZWZpeCwgVVJMIGN1c3RvbVRlbXBsYXRlcykgeworICAgIHN1cGVyKAorICAgICAgICBuZXcgRnVuY3Rpb248U3RyaW5nLCBVUkw+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBVUkwgYXBwbHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMuZ2V0UmVzb3VyY2UoUmVuZGVyZXIuY2xhc3MsICJ0ZW1wbGF0ZXMvIiArIG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgZ2xvYmFscywgc3RhdGljUHJlZml4LCBjdXN0b21UZW1wbGF0ZXMpOworICAgIFNveUZpbGVTZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IFNveUZpbGVTZXQuQnVpbGRlcigpCisgICAgICAgIC5zZXRDb21waWxlVGltZUdsb2JhbHModGhpcy5nbG9iYWxzKTsKKyAgICBmb3IgKFVSTCB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykgeworICAgICAgYnVpbGRlci5hZGQodGVtcGxhdGUpOworICAgIH0KKyAgICB0b2Z1ID0gYnVpbGRlci5idWlsZCgpLmNvbXBpbGVUb1RvZnUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU295VG9mdSBnZXRUb2Z1KCkgeworICAgIHJldHVybiB0b2Z1OworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFVybHMuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0VXJscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVmYXVsdFVybHMuamF2YQpAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEdpdGlsZXNVcmxzfS4KKyAqIDxwPgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHN0YXRpY2FsbHktY29uZmlndXJlZCBkZWZhdWx0cywgYW5kIHRodXMgYXNzdW1lcworICogdGhhdCB0aGUgc2VydmxldCBpcyBydW5uaW5nIGEgc2luZ2xlIHZpcnR1YWwgaG9zdC4KKyAqLworY2xhc3MgRGVmYXVsdFVybHMgaW1wbGVtZW50cyBHaXRpbGVzVXJscyB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbEhvc3ROYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlR2l0VXJsOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlR2Vycml0VXJsOworCisgIERlZmF1bHRVcmxzKFN0cmluZyBjYW5vbmljYWxIb3N0TmFtZSwgU3RyaW5nIGJhc2VHaXRVcmwsIFN0cmluZyBiYXNlR2Vycml0VXJsKQorICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICBpZiAoY2Fub25pY2FsSG9zdE5hbWUgIT0gbnVsbCkgeworICAgICAgdGhpcy5jYW5vbmljYWxIb3N0TmFtZSA9IGNhbm9uaWNhbEhvc3ROYW1lOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmNhbm9uaWNhbEhvc3ROYW1lID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKTsKKyAgICB9CisgICAgdGhpcy5iYXNlR2l0VXJsID0gY2hlY2tOb3ROdWxsKGJhc2VHaXRVcmwsICJiYXNlR2l0VXJsIik7CisgICAgdGhpcy5iYXNlR2Vycml0VXJsID0gY2hlY2tOb3ROdWxsKGJhc2VHZXJyaXRVcmwsICJiYXNlR2Vycml0VXJsIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIGNhbm9uaWNhbEhvc3ROYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIGJhc2VHaXRVcmw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2Vycml0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gYmFzZUdlcnJpdFVybDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RpZmZTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGlmZlNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA4Y2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RpZmZTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5DYW5vbmljYWxUcmVlUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRW1wdHlUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyBhbiBIVE1MIHBhZ2Ugd2l0aCBhbGwgdGhlIGRpZmZzIGZvciBhIGNvbW1pdC4gKi8KK3B1YmxpYyBjbGFzcyBEaWZmU2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQUNFSE9MREVSID0gImlkPVwiRElGRl9PVVRQVVRfQkxPQ0tcIiI7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaW5raWZpZXIgbGlua2lmaWVyOworCisgIHB1YmxpYyBEaWZmU2VydmxldChSZW5kZXJlciByZW5kZXJlciwgTGlua2lmaWVyIGxpbmtpZmllcikgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgICB0aGlzLmxpbmtpZmllciA9IGNoZWNrTm90TnVsbChsaW5raWZpZXIsICJsaW5raWZpZXIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgUmVwb3NpdG9yeSByZXBvID0gU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKTsKKworICAgIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pOworICAgIHRyeSB7CisgICAgICBib29sZWFuIHNob3dDb21taXQ7CisgICAgICBBYnN0cmFjdFRyZWVJdGVyYXRvciBvbGRUcmVlOworICAgICAgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbmV3VHJlZTsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIElmIHdlIGFyZSB2aWV3aW5nIHRoZSBkaWZmIGJldHdlZW4gYSBjb21taXQgYW5kIG9uZSBvZiBpdHMgcGFyZW50cywKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgY29tbWl0IGRldGFpbCBpbiB0aGUgcmVuZGVyZWQgcGFnZS4KKyAgICAgICAgc2hvd0NvbW1pdCA9IGlzUGFyZW50T2Yod2Fsaywgdmlldy5nZXRPbGRSZXZpc2lvbigpLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgICAgICBvbGRUcmVlID0gZ2V0VHJlZUl0ZXJhdG9yKHdhbGssIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICAgICAgbmV3VHJlZSA9IGdldFRyZWVJdGVyYXRvcih3YWxrLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgICB9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IGdldERhdGEocmVxKTsKKyAgICAgIGRhdGEucHV0KCJ0aXRsZSIsICJEaWZmIC0gIiArIHZpZXcuZ2V0UmV2aXNpb25SYW5nZSgpKTsKKyAgICAgIGlmIChzaG93Q29tbWl0KSB7CisgICAgICAgIGRhdGEucHV0KCJjb21taXQiLCBuZXcgQ29tbWl0U295RGF0YShsaW5raWZpZXIsIHJlcSwgcmVwbywgd2FsaywgdmlldykKKyAgICAgICAgICAgIC50b1NveURhdGEod2Fsay5wYXJzZUNvbW1pdCh2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSkpKTsKKyAgICAgIH0KKyAgICAgIGlmICghZGF0YS5jb250YWluc0tleSgicmVwb3NpdG9yeU5hbWUiKSAmJiAodmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpICE9IG51bGwpKSB7CisgICAgICAgIGRhdGEucHV0KCJyZXBvc2l0b3J5TmFtZSIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgICB9CisgICAgICBpZiAoIWRhdGEuY29udGFpbnNLZXkoImJyZWFkY3J1bWJzIikpIHsKKyAgICAgICAgZGF0YS5wdXQoImJyZWFkY3J1bWJzIiwgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nW10gaHRtbCA9IHJlbmRlckFuZFNwbGl0KGRhdGEpOworICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKKyAgICAgIHJlcy5zZXRDb250ZW50VHlwZShGb3JtYXRUeXBlLkhUTUwuZ2V0TWltZVR5cGUoKSk7CisgICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoQ2hhcnNldHMuVVRGXzgubmFtZSgpKTsKKyAgICAgIHNldENhY2hlSGVhZGVycyhyZXEsIHJlcyk7CisKKyAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICB0cnkgeworICAgICAgICBvdXQud3JpdGUoaHRtbFswXS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICBmb3JtYXRIdG1sRGlmZihvdXQsIHJlcG8sIHdhbGssIG9sZFRyZWUsIG5ld1RyZWUsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgICAgIG91dC53cml0ZShodG1sWzFdLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgd2Fsay5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmVudE9mKFJldldhbGsgd2FsaywgUmV2aXNpb24gb2xkUmV2aXNpb24sIFJldmlzaW9uIG5ld1JldmlzaW9uKQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbmV3Q29tbWl0ID0gd2Fsay5wYXJzZUNvbW1pdChuZXdSZXZpc2lvbi5nZXRJZCgpKTsKKyAgICBpZiAobmV3Q29tbWl0LmdldFBhcmVudENvdW50KCkgPiAwKSB7CisgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXdDb21taXQuZ2V0UGFyZW50cygpKS5jb250YWlucyhvbGRSZXZpc2lvbi5nZXRJZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG9sZFJldmlzaW9uID09IFJldmlzaW9uLk5VTEw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSByZW5kZXJBbmRTcGxpdChNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEpIHsKKyAgICBTdHJpbmcgaHRtbCA9IHJlbmRlcmVyLm5ld1JlbmRlcmVyKCJnaXRpbGVzLmRpZmZEZXRhaWwiKQorICAgICAgICAuc2V0RGF0YShkYXRhKQorICAgICAgICAucmVuZGVyKCk7CisgICAgaW50IGlkID0gaHRtbC5pbmRleE9mKFBMQUNFSE9MREVSKTsKKyAgICBpZiAoaWQgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUZW1wbGF0ZSBtdXN0IGNvbnRhaW4gIiArIFBMQUNFSE9MREVSKTsKKyAgICB9CisKKyAgICBpbnQgbHQgPSBodG1sLmxhc3RJbmRleE9mKCc8JywgaWQpOworICAgIGludCBndCA9IGh0bWwuaW5kZXhPZignPicsIGlkICsgUExBQ0VIT0xERVIubGVuZ3RoKCkpOworICAgIHJldHVybiBuZXcgU3RyaW5nW10ge2h0bWwuc3Vic3RyaW5nKDAsIGx0KSwgaHRtbC5zdWJzdHJpbmcoZ3QgKyAxKX07CisgIH0KKworICBwcml2YXRlIHZvaWQgZm9ybWF0SHRtbERpZmYoT3V0cHV0U3RyZWFtIG91dCwKKyAgICAgIFJlcG9zaXRvcnkgcmVwbywgUmV2V2FsayB3YWxrLAorICAgICAgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb2xkVHJlZSwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbmV3VHJlZSwKKyAgICAgIFN0cmluZyBwYXRoKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBEaWZmRm9ybWF0dGVyIGRpZmYgPSBuZXcgSHRtbERpZmZGb3JtYXR0ZXIocmVuZGVyZXIsIG91dCk7CisgICAgdHJ5IHsKKyAgICAgIGlmICghcGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgIGRpZmYuc2V0UGF0aEZpbHRlcihQYXRoRmlsdGVyLmNyZWF0ZShwYXRoKSk7CisgICAgICB9CisgICAgICBkaWZmLnNldFJlcG9zaXRvcnkocmVwbyk7CisgICAgICBkaWZmLnNldERldGVjdFJlbmFtZXModHJ1ZSk7CisgICAgICBkaWZmLmZvcm1hdChvbGRUcmVlLCBuZXdUcmVlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGlmZi5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZ2V0VHJlZUl0ZXJhdG9yKFJldldhbGsgd2FsaywgT2JqZWN0SWQgaWQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICghaWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkgeworICAgICAgQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKKyAgICAgIHAucmVzZXQod2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgd2Fsay5wYXJzZVRyZWUoaWQpKTsKKyAgICAgIHJldHVybiBwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRm9ybWF0VHlwZS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zvcm1hdFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE3YTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zvcm1hdFR5cGUuamF2YQpAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogVHlwZSBvZiBmb3JtYXR0aW5nIHRvIHVzZSBpbiB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gKi8KK3B1YmxpYyBlbnVtIEZvcm1hdFR5cGUgeworICBIVE1MKCJ0ZXh0L2h0bWwiKSwKKyAgVEVYVCgidGV4dC9wbGFpbiIpLAorICBKU09OKCJhcHBsaWNhdGlvbi9qc29uIiksCisgIERFRkFVTFQoIiovKiIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfVFlQRV9BVFRSSUJVVEUgPSBGb3JtYXRUeXBlLmNsYXNzLmdldE5hbWUoKTsKKworICBwdWJsaWMgc3RhdGljIEZvcm1hdFR5cGUgZ2V0Rm9ybWF0VHlwZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgRm9ybWF0VHlwZSByZXN1bHQgPSAoRm9ybWF0VHlwZSkgcmVxLmdldEF0dHJpYnV0ZShGT1JNQVRfVFlQRV9BVFRSSUJVVEUpOworICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBTdHJpbmcgZm9ybWF0ID0gcmVxLmdldFBhcmFtZXRlcigiZm9ybWF0Iik7CisgICAgaWYgKGZvcm1hdCAhPSBudWxsKSB7CisgICAgICBmb3IgKEZvcm1hdFR5cGUgdHlwZSA6IEZvcm1hdFR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKGZvcm1hdC5lcXVhbHNJZ25vcmVDYXNlKHR5cGUubmFtZSgpKSkgeworICAgICAgICAgIHJldHVybiBzZXQocmVxLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmb3JtYXQgIiArIGZvcm1hdCk7CisgICAgfQorCisgICAgU3RyaW5nIGFjY2VwdCA9IHJlcS5nZXRIZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUKTsKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGFjY2VwdCkpIHsKKyAgICAgIHJldHVybiBzZXQocmVxLCBERUZBVUxUKTsKKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyBwIDogYWNjZXB0LnNwbGl0KCJbICw7XVsgLDtdKiIpKSB7CisgICAgICBmb3IgKEZvcm1hdFR5cGUgdHlwZSA6IEZvcm1hdFR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKHAuZXF1YWxzKHR5cGUubWltZVR5cGUpKSB7CisgICAgICAgICAgcmV0dXJuIHNldChyZXEsIHR5cGUgIT0gSFRNTCA/IHR5cGUgOiBERUZBVUxUKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2V0KHJlcSwgREVGQVVMVCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBGb3JtYXRUeXBlIHNldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBGb3JtYXRUeXBlIGZvcm1hdCkgeworICAgIHJlcS5zZXRBdHRyaWJ1dGUoRk9STUFUX1RZUEVfQVRUUklCVVRFLCBmb3JtYXQpOworICAgIHJldHVybiBmb3JtYXQ7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBtaW1lVHlwZTsKKworICBwcml2YXRlIEZvcm1hdFR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICByZXR1cm4gbWltZVR5cGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzQWNjZXNzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0FjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGQ3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0FjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogR2l0IHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBHaXRpbGVzLgorICogPHA+CisgKiBFYWNoIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBlbmQtdXNlciByZXF1ZXN0LCB3aGljaCBpbXBsaWNpdGx5CisgKiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdCBhbmQgcmVwb3NpdG9yeS4KKyAqLworcHVibGljIGludGVyZmFjZSBHaXRpbGVzQWNjZXNzIHsKKyAgLyoqIEZhY3RvcnkgZm9yIHBlci1yZXF1ZXN0IGFjY2Vzcy4gKi8KKyAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBwdWJsaWMgR2l0aWxlc0FjY2VzcyBmb3JSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpOworICB9CisKKyAgLyoqCisgICAqIExpc3QgcmVwb3NpdG9yaWVzIG9uIHRoZSBob3N0LgorICAgKgorICAgKiBAcGFyYW0gYnJhbmNoZXMgYnJhbmNoZXMgdG8gbGlzdCBhbG9uZyB3aXRoIGVhY2ggcmVwb3NpdG9yeS4KKyAgICogQHJldHVybiBtYXAgb2YgcmVwb3NpdG9yeSBuYW1lcyB0byBkZXNjcmlwdGlvbnMuCisgICAqIEB0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24gdG8gdHJpZ2dlciBhbiBIVFRQIDQwMyBGb3JiaWRkZW4KKyAgICogICAgIChtYXRjaGluZyBiZWhhdmlvciBpbiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5SZXBvc2l0b3J5RmlsdGVyfSkuCisgICAqIEB0aHJvd3MgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gdG8gdHJpZ2dlciBhbiBIVFRQIDQwMSBVbmF1dGhvcml6ZWQKKyAgICogICAgIChtYXRjaGluZyBiZWhhdmlvciBpbiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5SZXBvc2l0b3J5RmlsdGVyfSkuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBsaXN0UmVwb3NpdG9yaWVzKFNldDxTdHJpbmc+IGJyYW5jaGVzKQorICAgICAgdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEByZXR1cm4gYW4gb3BhcXVlIG9iamVjdCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGVuZC11c2VyIG1ha2luZyB0aGUKKyAgICogICAgIHJlcXVlc3QsIGFuZCBzdXBwb3J0cyB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBhbmQge0BsaW5rICNoYXNoQ29kZSgpfS4KKyAgICogICAgIE5ldmVyIG51bGwuCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldFVzZXJLZXkoKTsKKworICAvKiogQHJldHVybiB0aGUgcmVwb3NpdG9yeSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4gKi8KKyAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byB0aGUgcmVwb3NpdG9yeSBvZiB0aGlzIHJlcXVlc3QuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZyb20KKyAgICogICAgICAgICB0aGUgcmVwb3NpdG9yeS4KKyAgICovCisgIHB1YmxpYyBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZ2V0UmVwb3NpdG9yeURlc2NyaXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjZjllYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyLmphdmEKQEAgLTAsMCArMSwzNjIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1NlcnZsZXQuU1RBVElDX1BSRUZJWDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlZpZXdGaWx0ZXIuZ2V0UmVnZXhHcm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuUmVwb3NpdG9yeUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuTWV0YUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlQmFzZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLkZpbGVSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5SZXBvc2l0b3J5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIE1ldGFGaWx0ZXIgdG8gc2VydmUgR2l0aWxlcy4KKyAqIDxwPgorICogRG8gbm90IHVzZSBkaXJlY3RseTsgdXNlIHtAbGluayBHaXRpbGVzU2VydmxldH0uCisgKi8KK2NsYXNzIEdpdGlsZXNGaWx0ZXIgZXh0ZW5kcyBNZXRhRmlsdGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19QQVRIX1BBUkFNID0gImNvbmZpZ1BhdGgiOworCisgIC8vIFRoZSBmb2xsb3dpbmcgcmVnZXhlcyBoYXZlIHRoZSBmb2xsb3dpbmcgY2FwdHVyZSBncm91cHM6CisgIC8vIDEuIFRoZSB3aG9sZSBzdHJpbmcsIHdoaWNoIGNhdXNlcyBSZWdleFBpcGVsaW5lIHRvIHNldCBSRUdFWF9HUk9VUFMgYnV0CisgIC8vICAgIG5vdCBvdGhlcndpc2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCByZXF1ZXN0LgorICAvLyAyLiBUaGUgcmVwb3NpdG9yeSBuYW1lIHBhcnQsIGJlZm9yZSAvPENNRD4uCisgIC8vIDMuIFRoZSBjb21tYW5kLCA8Q01EPiwgd2l0aCBubyBzbGFzaGVzIGFuZCBiZWdpbm5pbmcgd2l0aCArLiBDb21tYW5kcyBoYXZlCisgIC8vICAgIG5hbWVzIGFuYWxvZ291cyB0byAoYnV0IG5vdCBleGFjdGx5IHRoZSBzYW1lIGFzKSBnaXQgY29tbWFuZCBuYW1lcywgc3VjaAorICAvLyAgICBhcyAiK2xvZyIgYW5kICIrc2hvdyIuIFRoZSBiYXJlIGNvbW1hbmQgIisiIG1hcHMgdG8gb25lIG9mIHRoZSBvdGhlcgorICAvLyAgICBjb21tYW5kcyBiYXNlZCBvbiB0aGUgcmV2aXNpb24vcGF0aCwgYW5kIG1heSBjaGFuZ2Ugb3ZlciB0aW1lLgorICAvLyA0LiBUaGUgcmV2aXNpb24vcGF0aCBwYXJ0LCBhZnRlciAvPENNRD4gKGNhbGxlZCBqdXN0ICJwYXRoIiBiZWxvdykuIFRoaXMgaXMKKyAgLy8gICAgc3BsaXQgaW50byBhIHJldmlzaW9uIGFuZCBhIHBhdGggYnkgUmV2aXNpb25QYXJzZXIuCisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRCA9ICJcXCtbYS16MC05LV0qIjsKKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIGZpbmFsIFBhdHRlcm4gUk9PVF9SRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgiIgorICAgICAgKyAiXiggICAgICAiIC8vIDEuIEV2ZXJ5dGhpbmcKKyAgICAgICsgIiAgLyogICAgIiAvLyBFeGNlc3Mgc2xhc2hlcworICAgICAgKyAiICAoLykgICAiIC8vIDIuIFJlcG8gbmFtZSAoanVzdCBzbGFzaCkKKyAgICAgICsgIiAgKCkgICAgIiAvLyAzLiBDb21tYW5kCisgICAgICArICIgICgpICAgICIgLy8gNC4gUGF0aAorICAgICAgKyAiKSQgICAgICAiLAorICAgICAgUGF0dGVybi5DT01NRU5UUyk7CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFUE9fUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoIiIKKyAgICAgICsgIl4oICAgICAgICAgICAgICAgICAgICAgIiAvLyAxLiBFdmVyeXRoaW5nCisgICAgICArICIgIC8qICAgICAgICAgICAgICAgICAgICIgLy8gRXhjZXNzIHNsYXNoZXMKKyAgICAgICsgIiAgKCAgICAgICAgICAgICAgICAgICAgIiAvLyAyLiBSZXBvIG5hbWUKKyAgICAgICsgIiAgIC8gICAgICAgICAgICAgICAgICAgIiAvLyBMZWFkaW5nIHNsYXNoCisgICAgICArICIgICAoPzouKD8hICAgICAgICAgICAgICIgLy8gQW55dGhpbmcsIGFzIGxvbmcgYXMgaXQncyBub3QgZm9sbG93ZWQgYnkuLi4KKyAgICAgICsgIiAgICAgICAgLyIgKyBDTUQgKyAiLyAgIiAvLyB0aGUgc3BlY2lhbCAiLzxDTUQ+LyIgc2VwYXJhdG9yLAorICAgICAgKyAiICAgICAgICB8LyIgKyBDTUQgKyAiJCAiIC8vIG9yICIvPENNRD4iIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgKyAiICAgICAgICApKSo/ICAgICAgICAgICAiCisgICAgICArICIgICkgICAgICAgICAgICAgICAgICAgICIKKyAgICAgICsgIiAgLyogICAgICAgICAgICAgICAgICAgIiAvLyBUcmFpbGluZyBzbGFzaGVzCisgICAgICArICIgICgpICAgICAgICAgICAgICAgICAgICIgLy8gMy4gQ29tbWFuZAorICAgICAgKyAiICAoKSAgICAgICAgICAgICAgICAgICAiIC8vIDQuIFBhdGgKKyAgICAgICsgIikkICAgICAgICAgICAgICAgICAgICAgIiwKKyAgICAgIFBhdHRlcm4uQ09NTUVOVFMpOworCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgZmluYWwgUGF0dGVybiBSRVBPX1BBVEhfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoIiIKKyAgICAgICsgIl4oICAgICAgICAgICAgICAiIC8vIDEuIEV2ZXJ5dGhpbmcKKyAgICAgICsgIiAgLyogICAgICAgICAgICAiIC8vIEV4Y2VzcyBzbGFzaGVzCisgICAgICArICIgICggICAgICAgICAgICAgIiAvLyAyLiBSZXBvIG5hbWUKKyAgICAgICsgIiAgIC8gICAgICAgICAgICAiIC8vIExlYWRpbmcgc2xhc2gKKyAgICAgICsgIiAgIC4qPyAgICAgICAgICAiIC8vIEFueXRoaW5nLCBub24tZ3JlZWR5CisgICAgICArICIgICkgICAgICAgICAgICAgIgorICAgICAgKyAiICAvKCIgKyBDTUQgKyAiKSIgLy8gMy4gQ29tbWFuZAorICAgICAgKyAiICAoICAgICAgICAgICAgICIgLy8gNC4gUGF0aAorICAgICAgKyAiICAgKD86Ly4qKT8gICAgICIgLy8gU2xhc2ggcGF0aCwgb3Igbm90aGluZy4KKyAgICAgICsgIiAgKSAgICAgICAgICAgICAiCisgICAgICArICIpJCAgICAgICAgICAgICAgIiwKKyAgICAgIFBhdHRlcm4uQ09NTUVOVFMpOworCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpc3BhdGNoRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RIdHRwRmlsdGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxHaXRpbGVzVmlldy5UeXBlLCBGaWx0ZXI+IGZpbHRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8R2l0aWxlc1ZpZXcuVHlwZSwgSHR0cFNlcnZsZXQ+IHNlcnZsZXRzOworCisgICAgcHJpdmF0ZSBEaXNwYXRjaEZpbHRlcihMaXN0TXVsdGltYXA8R2l0aWxlc1ZpZXcuVHlwZSwgRmlsdGVyPiBmaWx0ZXJzLAorICAgICAgICBNYXA8R2l0aWxlc1ZpZXcuVHlwZSwgSHR0cFNlcnZsZXQ+IHNlcnZsZXRzKSB7CisgICAgICB0aGlzLmZpbHRlcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKGZpbHRlcnMpOworICAgICAgdGhpcy5zZXJ2bGV0cyA9IEltbXV0YWJsZU1hcC5jb3B5T2Yoc2VydmxldHMpOworICAgICAgZm9yIChHaXRpbGVzVmlldy5UeXBlIHR5cGUgOiBHaXRpbGVzVmlldy5UeXBlLnZhbHVlcygpKSB7CisgICAgICAgIGNoZWNrU3RhdGUoc2VydmxldHMuY29udGFpbnNLZXkodHlwZSksICJNaXNzaW5nIGhhbmRsZXIgZm9yIHZpZXcgJXMiLCB0eXBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICBHaXRpbGVzVmlldyB2aWV3ID0gY2hlY2tOb3ROdWxsKFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpKTsKKyAgICAgIGZpbmFsIEl0ZXJhdG9yPEZpbHRlcj4gaXRyID0gZmlsdGVycy5nZXQodmlldy5nZXRUeXBlKCkpLml0ZXJhdG9yKCk7CisgICAgICBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0ID0gc2VydmxldHMuZ2V0KHZpZXcuZ2V0VHlwZSgpKTsKKyAgICAgIG5ldyBGaWx0ZXJDaGFpbigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcSwgU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGl0ci5uZXh0KCkuZG9GaWx0ZXIocmVxLCByZXMsIHRoaXMpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXJ2bGV0LnNlcnZpY2UocmVxLCByZXMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfS5kb0ZpbHRlcihyZXEsIHJlcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8R2l0aWxlc1ZpZXcuVHlwZSwgRmlsdGVyPiBmaWx0ZXJzID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICBwcml2YXRlIGZpbmFsIE1hcDxHaXRpbGVzVmlldy5UeXBlLCBIdHRwU2VydmxldD4gc2VydmxldHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBwcml2YXRlIFJlbmRlcmVyIHJlbmRlcmVyOworICBwcml2YXRlIEdpdGlsZXNVcmxzIHVybHM7CisgIHByaXZhdGUgTGlua2lmaWVyIGxpbmtpZmllcjsKKyAgcHJpdmF0ZSBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeTsKKyAgcHJpdmF0ZSBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcjsKKyAgcHJpdmF0ZSBWaXNpYmlsaXR5Q2FjaGUgdmlzaWJpbGl0eUNhY2hlOworICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CisKKyAgR2l0aWxlc0ZpbHRlcigpIHsKKyAgfQorCisgIEdpdGlsZXNGaWx0ZXIoCisgICAgICBSZW5kZXJlciByZW5kZXJlciwKKyAgICAgIEdpdGlsZXNVcmxzIHVybHMsCisgICAgICBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeSwKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyLAorICAgICAgVmlzaWJpbGl0eUNhY2hlIHZpc2liaWxpdHlDYWNoZSkgeworICAgIHRoaXMucmVuZGVyZXIgPSBjaGVja05vdE51bGwocmVuZGVyZXIsICJyZW5kZXJlciIpOworICAgIHRoaXMudXJscyA9IGNoZWNrTm90TnVsbCh1cmxzLCAidXJscyIpOworICAgIHRoaXMuYWNjZXNzRmFjdG9yeSA9IGNoZWNrTm90TnVsbChhY2Nlc3NGYWN0b3J5LCAiYWNjZXNzRmFjdG9yeSIpOworICAgIHRoaXMudmlzaWJpbGl0eUNhY2hlID0gY2hlY2tOb3ROdWxsKHZpc2liaWxpdHlDYWNoZSwgInZpc2liaWxpdHlDYWNoZSIpOworICAgIHRoaXMubGlua2lmaWVyID0gbmV3IExpbmtpZmllcih1cmxzKTsKKyAgICB0aGlzLnJlc29sdmVyID0gd3JhcFJlc29sdmVyKHJlc29sdmVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdChjb25maWcpOworICAgIHNldERlZmF1bHRGaWVsZHMoY29uZmlnKTsKKworICAgIGZvciAoR2l0aWxlc1ZpZXcuVHlwZSB0eXBlIDogR2l0aWxlc1ZpZXcuVHlwZS52YWx1ZXMoKSkgeworICAgICAgaWYgKCFzZXJ2bGV0cy5jb250YWluc0tleSh0eXBlKSkgeworICAgICAgICBzZXJ2bGV0cy5wdXQodHlwZSwgZ2V0RGVmYXVsdEhhbmRsZXIodHlwZSkpOworICAgICAgfQorICAgIH0KKworICAgIEZpbHRlciByZXBvc2l0b3J5RmlsdGVyID0gbmV3IFJlcG9zaXRvcnlGaWx0ZXIocmVzb2x2ZXIpOworICAgIEZpbHRlciB2aWV3RmlsdGVyID0gbmV3IFZpZXdGaWx0ZXIoYWNjZXNzRmFjdG9yeSwgdXJscywgdmlzaWJpbGl0eUNhY2hlKTsKKyAgICBGaWx0ZXIgZGlzcGF0Y2hGaWx0ZXIgPSBuZXcgRGlzcGF0Y2hGaWx0ZXIoZmlsdGVycywgc2VydmxldHMpOworICAgIFN0cmluZyBicm93c2VyQ3NzTmFtZTsKKyAgICBTdHJpbmcgcHJldHRpZnlDc3NOYW1lOworICAgIFN0cmluZyBwcmV0dGlmeUpzTmFtZTsKKworICAgIHNlcnZlUmVnZXgoUk9PVF9SRUdFWCkKKyAgICAgICAgLnRocm91Z2godmlld0ZpbHRlcikKKyAgICAgICAgLnRocm91Z2goZGlzcGF0Y2hGaWx0ZXIpOworCisgICAgc2VydmVSZWdleChSRVBPX1JFR0VYKQorICAgICAgICAudGhyb3VnaChyZXBvc2l0b3J5RmlsdGVyKQorICAgICAgICAudGhyb3VnaCh2aWV3RmlsdGVyKQorICAgICAgICAudGhyb3VnaChkaXNwYXRjaEZpbHRlcik7CisKKyAgICBzZXJ2ZVJlZ2V4KFJFUE9fUEFUSF9SRUdFWCkKKyAgICAgICAgLnRocm91Z2gocmVwb3NpdG9yeUZpbHRlcikKKyAgICAgICAgLnRocm91Z2godmlld0ZpbHRlcikKKyAgICAgICAgLnRocm91Z2goZGlzcGF0Y2hGaWx0ZXIpOworCisgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBCYXNlU2VydmxldCBnZXREZWZhdWx0SGFuZGxlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcpIHsKKyAgICBjaGVja05vdEluaXRpYWxpemVkKCk7CisgICAgc3dpdGNoICh2aWV3KSB7CisgICAgICBjYXNlIEhPU1RfSU5ERVg6CisgICAgICAgIHJldHVybiBuZXcgSG9zdEluZGV4U2VydmxldChyZW5kZXJlciwgdXJscywgYWNjZXNzRmFjdG9yeSk7CisgICAgICBjYXNlIFJFUE9TSVRPUllfSU5ERVg6CisgICAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeUluZGV4U2VydmxldChyZW5kZXJlciwgYWNjZXNzRmFjdG9yeSk7CisgICAgICBjYXNlIFJFVklTSU9OOgorICAgICAgICByZXR1cm4gbmV3IFJldmlzaW9uU2VydmxldChyZW5kZXJlciwgbGlua2lmaWVyKTsKKyAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgcmV0dXJuIG5ldyBQYXRoU2VydmxldChyZW5kZXJlcik7CisgICAgICBjYXNlIERJRkY6CisgICAgICAgIHJldHVybiBuZXcgRGlmZlNlcnZsZXQocmVuZGVyZXIsIGxpbmtpZmllcik7CisgICAgICBjYXNlIExPRzoKKyAgICAgICAgcmV0dXJuIG5ldyBMb2dTZXJ2bGV0KHJlbmRlcmVyLCBsaW5raWZpZXIpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB2aWV3IHR5cGU6ICIgKyB2aWV3KTsKKyAgICB9CisgIH0KKworICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGaWx0ZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3LCBGaWx0ZXIgZmlsdGVyKSB7CisgICAgY2hlY2tOb3RJbml0aWFsaXplZCgpOworICAgIGZpbHRlcnMucHV0KGNoZWNrTm90TnVsbCh2aWV3LCAidmlldyIpLCBjaGVja05vdE51bGwoZmlsdGVyLCAiZmlsdGVyIGZvciAlcyIsIHZpZXcpKTsKKyAgfQorCisgIHN5bmNocm9uaXplZCB2b2lkIHNldEhhbmRsZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3LCBIdHRwU2VydmxldCBoYW5kbGVyKSB7CisgICAgY2hlY2tOb3RJbml0aWFsaXplZCgpOworICAgIHNlcnZsZXRzLnB1dChjaGVja05vdE51bGwodmlldywgInZpZXciKSwKKyAgICAgICAgY2hlY2tOb3ROdWxsKGhhbmRsZXIsICJoYW5kbGVyIGZvciAlcyIsIHZpZXcpKTsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tOb3RJbml0aWFsaXplZCgpIHsKKyAgICBjaGVja1N0YXRlKCFpbml0aWFsaXplZCwgIkdpdGlsZXMgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gd3JhcFJlc29sdmVyKAorICAgICAgZmluYWwgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIpIHsKKyAgICBjaGVja05vdE51bGwocmVzb2x2ZXIsICJyZXNvbHZlciIpOworICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24sCisgICAgICAgICAgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sIFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXNvbHZlci5vcGVuKHJlcSwgVmlld0ZpbHRlci50cmltTGVhZGluZ1NsYXNoKGdldFJlZ2V4R3JvdXAocmVxLCAxKSkpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdEZpZWxkcyhGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgaWYgKHJlbmRlcmVyICE9IG51bGwgJiYgdXJscyAhPSBudWxsICYmIGFjY2Vzc0ZhY3RvcnkgIT0gbnVsbCAmJiByZXNvbHZlciAhPSBudWxsCisgICAgICAgICYmIHZpc2liaWxpdHlDYWNoZSAhPSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmluZyBjb25maWdQYXRoID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoQ09ORklHX1BBVEhfUEFSQU0pOworICAgIGlmIChjb25maWdQYXRoID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAiICsgY29uZmlnUGF0aCk7CisgICAgfQorICAgIEZpbGVCYXNlZENvbmZpZyBqZ2l0Q29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhuZXcgRmlsZShjb25maWdQYXRoKSwgRlMuREVURUNURUQpOworICAgIHRyeSB7CisgICAgICBqZ2l0Q29uZmlnLmxvYWQoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIGlmIChyZW5kZXJlciA9PSBudWxsKSB7CisgICAgICBTdHJpbmcgc3RhdGljUHJlZml4ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0Q29udGV4dFBhdGgoKSArIFNUQVRJQ19QUkVGSVg7CisgICAgICBTdHJpbmcgY3VzdG9tVGVtcGxhdGVzID0gamdpdENvbmZpZy5nZXRTdHJpbmcoImdpdGlsZXMiLCBudWxsLCAiY3VzdG9tVGVtcGxhdGVzIik7CisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IEF1dG9tYXRpY2FsbHkgc2V0IHRvIHRydWUgd2hlbiBydW4gd2l0aCBtdm4gamV0dHk6cnVuLgorICAgICAgaWYgKGpnaXRDb25maWcuZ2V0Qm9vbGVhbigiZ2l0aWxlcyIsIG51bGwsICJyZWxvYWRUZW1wbGF0ZXMiLCBmYWxzZSkpIHsKKyAgICAgICAgcmVuZGVyZXIgPSBuZXcgRGVidWdSZW5kZXJlcihzdGF0aWNQcmVmaXgsIGN1c3RvbVRlbXBsYXRlcywKKyAgICAgICAgICAgIEpvaW5lci5vbihGaWxlLnNlcGFyYXRvckNoYXIpLmpvaW4oU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLAorICAgICAgICAgICAgICAgICJnaXRpbGVzLXNlcnZsZXQiLCAic3JjIiwgIm1haW4iLCAicmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAiY29tIiwgImdvb2dsZSIsICJnaXRpbGVzIiwgInRlbXBsYXRlcyIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlcmVyID0gbmV3IERlZmF1bHRSZW5kZXJlcihzdGF0aWNQcmVmaXgsIFJlbmRlcmVyLnRvRmlsZVVSTChjdXN0b21UZW1wbGF0ZXMpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHVybHMgPT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdXJscyA9IG5ldyBEZWZhdWx0VXJscygKKyAgICAgICAgICAgIGpnaXRDb25maWcuZ2V0U3RyaW5nKCJnaXRpbGVzIiwgbnVsbCwgImNhbm9uaWNhbEhvc3ROYW1lIiksCisgICAgICAgICAgICBnZXRCYXNlR2l0VXJsKGpnaXRDb25maWcpLAorICAgICAgICAgICAgZ2V0R2Vycml0VXJsKGpnaXRDb25maWcpKTsKKyAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICAgIGxpbmtpZmllciA9IG5ldyBMaW5raWZpZXIodXJscyk7CisgICAgaWYgKGFjY2Vzc0ZhY3RvcnkgPT0gbnVsbCB8fCByZXNvbHZlciA9PSBudWxsKSB7CisgICAgICBTdHJpbmcgYmFzZVBhdGggPSBqZ2l0Q29uZmlnLmdldFN0cmluZygiZ2l0aWxlcyIsIG51bGwsICJiYXNlUGF0aCIpOworICAgICAgaWYgKGJhc2VQYXRoID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oImdpdGlsZXMuYmFzZVBhdGggbm90IHNldCIpOworICAgICAgfQorICAgICAgYm9vbGVhbiBleHBvcnRBbGwgPSBqZ2l0Q29uZmlnLmdldEJvb2xlYW4oImdpdGlsZXMiLCBudWxsLCAiZXhwb3J0QWxsIiwgZmFsc2UpOworCisgICAgICBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiBmaWxlUmVzb2x2ZXI7CisgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCkgeworICAgICAgICBmaWxlUmVzb2x2ZXIgPSBuZXcgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4obmV3IEZpbGUoYmFzZVBhdGgpLCBleHBvcnRBbGwpOworICAgICAgICByZXNvbHZlciA9IHdyYXBSZXNvbHZlcihmaWxlUmVzb2x2ZXIpOworICAgICAgfSBlbHNlIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIEZpbGVSZXNvbHZlcikgeworICAgICAgICBmaWxlUmVzb2x2ZXIgPSAoRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4pIHJlc29sdmVyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZVJlc29sdmVyID0gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChhY2Nlc3NGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgY2hlY2tTdGF0ZShmaWxlUmVzb2x2ZXIgIT0gbnVsbCwgIm5lZWQgYSBGaWxlUmVzb2x2ZXIgd2hlbiBHaXRpbGVzQWNjZXNzLkZhY3Rvcnkgbm90IHNldCIpOworICAgICAgICB0cnkgeworICAgICAgICBhY2Nlc3NGYWN0b3J5ID0gbmV3IERlZmF1bHRBY2Nlc3MuRmFjdG9yeSgKKyAgICAgICAgICAgIG5ldyBGaWxlKGJhc2VQYXRoKSwKKyAgICAgICAgICAgIGdldEJhc2VHaXRVcmwoamdpdENvbmZpZyksCisgICAgICAgICAgICBmaWxlUmVzb2x2ZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHZpc2liaWxpdHlDYWNoZSA9PSBudWxsKSB7CisgICAgICBpZiAoamdpdENvbmZpZy5nZXRTdWJzZWN0aW9ucygiY2FjaGUiKS5jb250YWlucygidmlzaWJpbGl0eSIpKSB7CisgICAgICAgIHZpc2liaWxpdHlDYWNoZSA9CisgICAgICAgICAgICBuZXcgVmlzaWJpbGl0eUNhY2hlKGZhbHNlLCBDb25maWdVdGlsLmdldENhY2hlQnVpbGRlcihqZ2l0Q29uZmlnLCAidmlzaWJpbGl0eSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpc2liaWxpdHlDYWNoZSA9IG5ldyBWaXNpYmlsaXR5Q2FjaGUoZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCYXNlR2l0VXJsKENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgYmFzZUdpdFVybCA9IGNvbmZpZy5nZXRTdHJpbmcoImdpdGlsZXMiLCBudWxsLCAiYmFzZUdpdFVybCIpOworICAgIGlmIChiYXNlR2l0VXJsID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJnaXRpbGVzLmJhc2VHaXRVcmwgbm90IHNldCIpOworICAgIH0KKyAgICByZXR1cm4gYmFzZUdpdFVybDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHZXJyaXRVcmwoQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIFN0cmluZyBnZXJyaXRVcmwgPSBjb25maWcuZ2V0U3RyaW5nKCJnaXRpbGVzIiwgbnVsbCwgImdlcnJpdFVybCIpOworICAgIGlmIChnZXJyaXRVcmwgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oImdpdGlsZXMuZ2Vycml0VXJsIG5vdCBzZXQiKTsKKyAgICB9CisgICAgcmV0dXJuIGdlcnJpdFVybDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2RiYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLk1ldGFTZXJ2bGV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlJlcG9zaXRvcnlSZXNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBTZXJ2bGV0IHRvIHNlcnZlIEdpdGlsZXMuCisgKiA8cD4KKyAqIFRoaXMgc2VydmxldCBjYW4gZWl0aGVyIGJlIGNvbnN0cnVjdGVkIG1hbnVhbGx5IHdpdGggaXRzIGRlcGVuZGVuY2llcywgb3IKKyAqIGNvbmZpZ3VyZWQgdG8gdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgR2l0aWxlcyBpbnRlcmZhY2VzLiBUbworICogY29uZmlndXJlIHRoZSBkZWZhdWx0cywgeW91IG11c3QgcHJvdmlkZSBhIHNpbmdsZSBpbml0IHBhcmFtZXRlcgorICogImNvbmZpZ1BhdGgiLCB3aGljaCBpcyB0aGUgcGF0aCB0byBhIGdpdCBjb25maWcgZmlsZSBjb250YWluaW5nIGFkZGl0aW9uYWwKKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBHaXRpbGVzU2VydmxldCBleHRlbmRzIE1ldGFTZXJ2bGV0IHsKKyAgLyoqIFRoZSBwcmVmaXggZnJvbSB3aGljaCBzdGF0aWMgcmVzb3VyY2VzIGFyZSBzZXJ2ZWQuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19QUkVGSVggPSAiLytzdGF0aWMvIjsKKworICBwdWJsaWMgR2l0aWxlc1NlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsCisgICAgICBHaXRpbGVzVXJscyB1cmxzLAorICAgICAgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3RvcnksCisgICAgICBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlciwKKyAgICAgIFZpc2liaWxpdHlDYWNoZSB2aXNpYmlsaXR5Q2FjaGUpIHsKKyAgICBzdXBlcihuZXcgR2l0aWxlc0ZpbHRlcihyZW5kZXJlciwgdXJscywgYWNjZXNzRmFjdG9yeSwgcmVzb2x2ZXIsIHZpc2liaWxpdHlDYWNoZSkpOworICB9CisKKyAgcHVibGljIEdpdGlsZXNTZXJ2bGV0KCkgeworICAgIHN1cGVyKG5ldyBHaXRpbGVzRmlsdGVyKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBHaXRpbGVzRmlsdGVyIGdldERlbGVnYXRlRmlsdGVyKCkgeworICAgIHJldHVybiAoR2l0aWxlc0ZpbHRlcikgc3VwZXIuZ2V0RGVsZWdhdGVGaWx0ZXIoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0KGZpbmFsIFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgZ2V0RGVsZWdhdGVGaWx0ZXIoKS5pbml0KG5ldyBGaWx0ZXJDb25maWcoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlRmlsdGVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKKyAgICAgIH0KKworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIC8qKgorICAgKiBBZGQgYSBjdXN0b20gZmlsdGVyIGZvciBhIHZpZXcuCisgICAqIDxwPgorICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBzZXJ2bGV0LgorICAgKgorICAgKiBAcGFyYW0gdmlldyB2aWV3IHR5cGUuCisgICAqIEBwYXJhbSBmaWx0ZXIgZmlsdGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkRmlsdGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldywgRmlsdGVyIGZpbHRlcikgeworICAgIGdldERlbGVnYXRlRmlsdGVyKCkuYWRkRmlsdGVyKHZpZXcsIGZpbHRlcik7CisgIH0KKworICAvKioKKyAgICogU2V0IGEgY3VzdG9tIGhhbmRsZXIgZm9yIGEgdmlldy4KKyAgICogPHA+CisgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIHNlcnZsZXQuCisgICAqCisgICAqIEBwYXJhbSB2aWV3IHZpZXcgdHlwZS4KKyAgICogQHBhcmFtIGhhbmRsZXIgaGFuZGxlci4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3LCBIdHRwU2VydmxldCBoYW5kbGVyKSB7CisgICAgZ2V0RGVsZWdhdGVGaWx0ZXIoKS5zZXRIYW5kbGVyKHZpZXcsIGhhbmRsZXIpOworICB9CisKKyAgcHVibGljIEJhc2VTZXJ2bGV0IGdldERlZmF1bHRIYW5kbGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldykgeworICAgIHJldHVybiBnZXREZWxlZ2F0ZUZpbHRlcigpLmdldERlZmF1bHRIYW5kbGVyKHZpZXcpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHMuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiN2ZmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHMuamF2YQpAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIEludGVyZmFjZSBmb3IgVVJMcyBkaXNwbGF5ZWQgb24gc291cmNlIGJyb3dzaW5nIHBhZ2VzLiAqLworcHVibGljIGludGVyZmFjZSBHaXRpbGVzVXJscyB7CisgIC8qKgorICAgKiBFc2NhcGVzIHJlcG9zaXRvcnkgb3IgcGF0aCBuYW1lcyB0byBiZSBzYWZlbHkgZW1iZWRkZWQgaW50byBhIFVSTC4KKyAgICogPHA+CisgICAqIFRoaXMgZXNjYXBlIGltcGxlbWVudGF0aW9uIGVzY2FwZXMgYSByZXBvc2l0b3J5IG9yIHBhdGggbmFtZSBzdWNoIGFzCisgICAqICJmb28vYmFyPC9jaGlsZCIgdG8gYXBwZWFyIGFzICJmb28vYmFyJTNDL2NoaWxkIi4gU3BhY2VzIGFyZSBlc2NhcGVkIGFzCisgICAqICIlMjAiLiBJdHMgcHVycG9zZSBpcyB0byBlc2NhcGUgYSByZXBvc2l0b3J5IG5hbWUgdG8gYmUgc2FmZSBmb3IgaW5jbHVzaW9uCisgICAqIGluIHRoZSBwYXRoIGNvbXBvbmVudCBvZiB0aGUgVVJMLCB3aGVyZSAiLyIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgdGhhdAorICAgKiBzaG91bGQgbm90IGJlIGVuY29kZWQsIHdoaWxlIGFsbW9zdCBhbnkgb3RoZXIgbm9uLWFscGhhLCBub24tbnVtZXJpYworICAgKiBjaGFyYWN0ZXIgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIFVSTCBzdHlsZSBlbmNvZGluZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+IE5BTUVfRVNDQVBFUiA9IG5ldyBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIFVSTEVuY29kZXIuZW5jb2RlKHMsIENoYXJzZXRzLlVURl84Lm5hbWUoKSkKKyAgICAgICAgICAgIC5yZXBsYWNlKCIlMkYiLCAiLyIpCisgICAgICAgICAgICAucmVwbGFjZSgiJTJmIiwgIi8iKQorICAgICAgICAgICAgLnJlcGxhY2UoIisiLCAiJTIwIikKKyAgICAgICAgICAgIC5yZXBsYWNlKCIlMkIiLCAiKyIpCisgICAgICAgICAgICAucmVwbGFjZSgiJTJiIiwgIisiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBob3N0IGZyb20gdGhlIHJlcXVlc3QuCisgICAqCisgICAqIFVzZWQgaW4gdmFyaW91cyB1c2VyLXZpc2libGUgdGV4dCwgbGlrZSAiTXlIb3N0IEdpdCBSZXBvc2l0b3JpZXMiLgorICAgKgorICAgKiBAcGFyYW0gcmVxIHJlcXVlc3QuCisgICAqIEByZXR1cm4gaG9zdCBuYW1lOyBtYXkgYmUgbnVsbC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgYmFzZSBVUkwgZm9yIGdpdCByZXBvc2l0b3JpZXMgb24gdGhpcyBob3N0LgorICAgKgorICAgKiBAcGFyYW0gcmVxIHJlcXVlc3QuCisgICAqIEByZXR1cm4gYmFzZSBVUkwgZm9yIGdpdCByZXBvc2l0b3JpZXMuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSk7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgYmFzZSBVUkwgZm9yIEdlcnJpdCBwcm9qZWN0cyBvbiB0aGlzIGhvc3QuCisgICAqCisgICAqIEBwYXJhbSByZXEgcmVxdWVzdC4KKyAgICogQHJldHVybiBiYXNlIFVSTCBmb3IgR2Vycml0IENvZGUgUmV2aWV3LCBvciBudWxsIGlmIEdlcnJpdCBpcyBub3QKKyAgICogICAgIGNvbmZpZ3VyZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHZXJyaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSk7Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXcuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjg1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzVXJscy5OQU1FX0VTQ0FQRVI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldk9iamVjdDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgdmlldyBpbiBHaXRpbGVzLgorICogPHA+CisgKiBWaWV3cyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBhIHR5cGUsIGFuZCBkaXNwYXRjaGVkIHRvIHNlcnZsZXQgdHlwZXMgYnkKKyAqIHtAbGluayBHaXRpbGVzU2VydmxldH0uIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGxpc3Qgb2YgYWxsIHR5cGVzLCBhcworICogd2VsbCBhcyBzb21lIG1ldGhvZHMgY29udGFpbmluZyBiYXNpYyBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSB0aGUgVVJMLgorICogQ29uc3RydWN0aW9uIGhhcHBlbnMgaW4ge0BsaW5rIFZpZXdGaWx0ZXJ9LgorICovCitwdWJsaWMgY2xhc3MgR2l0aWxlc1ZpZXcgeworICAvKiogQWxsIHRoZSBwb3NzaWJsZSB2aWV3IHR5cGVzIHN1cHBvcnRlZCBpbiB0aGUgYXBwbGljYXRpb24uICovCisgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKKyAgICBIT1NUX0lOREVYLAorICAgIFJFUE9TSVRPUllfSU5ERVgsCisgICAgUkVWSVNJT04sCisgICAgUEFUSCwKKyAgICBESUZGLAorICAgIExPRzsKKyAgfQorCisgIC8qKiBCdWlsZGVyIGZvciB2aWV3cy4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3NpdG9yeU5hbWU7CisgICAgcHJpdmF0ZSBSZXZpc2lvbiByZXZpc2lvbiA9IFJldmlzaW9uLk5VTEw7CisgICAgcHJpdmF0ZSBSZXZpc2lvbiBvbGRSZXZpc2lvbiA9IFJldmlzaW9uLk5VTEw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBhbmNob3I7CisKKyAgICBwcml2YXRlIEJ1aWxkZXIoVHlwZSB0eXBlKSB7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGNvcHlGcm9tKEdpdGlsZXNWaWV3IG90aGVyKSB7CisgICAgICBob3N0TmFtZSA9IG90aGVyLmhvc3ROYW1lOworICAgICAgc2VydmxldFBhdGggPSBvdGhlci5zZXJ2bGV0UGF0aDsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgY2FzZSBESUZGOgorICAgICAgICAgIG9sZFJldmlzaW9uID0gb3RoZXIub2xkUmV2aXNpb247CisgICAgICAgICAgLy8gRmFsbHRocm91Z2guCisgICAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgICBwYXRoID0gb3RoZXIucGF0aDsKKyAgICAgICAgICAvLyBGYWxsdGhyb3VnaC4KKyAgICAgICAgY2FzZSBSRVZJU0lPTjoKKyAgICAgICAgICByZXZpc2lvbiA9IG90aGVyLnJldmlzaW9uOworICAgICAgICAgIC8vIEZhbGx0aHJvdWdoLgorICAgICAgICBjYXNlIFJFUE9TSVRPUllfSU5ERVg6CisgICAgICAgICAgcmVwb3NpdG9yeU5hbWUgPSBvdGhlci5yZXBvc2l0b3J5TmFtZTsKKyAgICAgIH0KKyAgICAgIC8vIERvbid0IGNvcHkgcGFyYW1zLgorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgY29weUZyb20oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgcmV0dXJuIGNvcHlGcm9tKFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRIb3N0TmFtZShTdHJpbmcgaG9zdE5hbWUpIHsKKyAgICAgIHRoaXMuaG9zdE5hbWUgPSBjaGVja05vdE51bGwoaG9zdE5hbWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKyAgICAgIHJldHVybiBob3N0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXJ2bGV0UGF0aChTdHJpbmcgc2VydmxldFBhdGgpIHsKKyAgICAgIHRoaXMuc2VydmxldFBhdGggPSBjaGVja05vdE51bGwoc2VydmxldFBhdGgpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgIHJldHVybiBzZXJ2bGV0UGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXBvc2l0b3J5TmFtZShTdHJpbmcgcmVwb3NpdG9yeU5hbWUpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEhPU1RfSU5ERVg6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiY2Fubm90IHNldCByZXBvc2l0b3J5IG5hbWUgb24gJXMgdmlldyIsIHR5cGUpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aGlzLnJlcG9zaXRvcnlOYW1lID0gY2hlY2tOb3ROdWxsKHJlcG9zaXRvcnlOYW1lKTsKKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCkgeworICAgICAgcmV0dXJuIHJlcG9zaXRvcnlOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJldmlzaW9uKFJldmlzaW9uIHJldmlzaW9uKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBIT1NUX0lOREVYOgorICAgICAgICBjYXNlIFJFUE9TSVRPUllfSU5ERVg6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJjYW5ub3Qgc2V0IHJldmlzaW9uIG9uICVzIHZpZXciLCB0eXBlKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhpcy5yZXZpc2lvbiA9IGNoZWNrTm90TnVsbChyZXZpc2lvbik7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmV2aXNpb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiBzZXRSZXZpc2lvbihSZXZpc2lvbi5uYW1lZChuYW1lKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmV2aXNpb24oUmV2T2JqZWN0IG9iaikgeworICAgICAgcmV0dXJuIHNldFJldmlzaW9uKFJldmlzaW9uLnBlZWxlZChvYmoubmFtZSgpLCBvYmopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXZpc2lvbihTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IG9iaikgeworICAgICAgcmV0dXJuIHNldFJldmlzaW9uKFJldmlzaW9uLnBlZWxlZChuYW1lLCBvYmopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmV2aXNpb24gZ2V0UmV2aXNpb24oKSB7CisgICAgICByZXR1cm4gcmV2aXNpb247CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0T2xkUmV2aXNpb24oUmV2aXNpb24gcmV2aXNpb24pIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIERJRkY6CisgICAgICAgIGNhc2UgTE9HOgorICAgICAgICAgIHRoaXMub2xkUmV2aXNpb24gPSBjaGVja05vdE51bGwocmV2aXNpb24pOworICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImNhbm5vdCBzZXQgb2xkIHJldmlzaW9uIG9uICVzIHZpZXciLCB0eXBlKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0T2xkUmV2aXNpb24oUmV2T2JqZWN0IG9iaikgeworICAgICAgcmV0dXJuIHNldE9sZFJldmlzaW9uKFJldmlzaW9uLnBlZWxlZChvYmoubmFtZSgpLCBvYmopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRPbGRSZXZpc2lvbihTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IG9iaikgeworICAgICAgcmV0dXJuIHNldE9sZFJldmlzaW9uKFJldmlzaW9uLnBlZWxlZChuYW1lLCBvYmopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmV2aXNpb24gZ2V0T2xkUmV2aXNpb24oKSB7CisgICAgICByZXR1cm4gcmV2aXNpb247CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0VHJlZVBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFBBVEg6CisgICAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgICB0aGlzLnBhdGggPSBtYXliZVRyaW1MZWFkaW5nQW5kVHJhaWxpbmdTbGFzaChjaGVja05vdE51bGwocGF0aCkpOworICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoICE9IG51bGwgPyBtYXliZVRyaW1MZWFkaW5nQW5kVHJhaWxpbmdTbGFzaChwYXRoKSA6IG51bGw7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJjYW5ub3Qgc2V0IHBhdGggb24gJXMgdmlldyIsIHR5cGUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVQYXRoKCkgeworICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgcHV0UGFyYW0oU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBwYXJhbXMucHV0KGtleSwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgcmVwbGFjZVBhcmFtKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgcGFyYW1zLnJlcGxhY2VWYWx1ZXMoa2V5LCBJbW11dGFibGVMaXN0Lm9mKHZhbHVlKSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBwdXRBbGxQYXJhbXMoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcykgeworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmdbXT4gZSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHYgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICB0aGlzLnBhcmFtcy5wdXQoZS5nZXRLZXkoKSwgdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtcygpIHsKKyAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0QW5jaG9yKFN0cmluZyBhbmNob3IpIHsKKyAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBbmNob3IoKSB7CisgICAgICByZXR1cm4gYW5jaG9yOworICAgIH0KKworICAgIHB1YmxpYyBHaXRpbGVzVmlldyBidWlsZCgpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEhPU1RfSU5ERVg6CisgICAgICAgICAgY2hlY2tIb3N0SW5kZXgoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVBPU0lUT1JZX0lOREVYOgorICAgICAgICAgIGNoZWNrUmVwb3NpdG9yeUluZGV4KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWSVNJT046CisgICAgICAgICAgY2hlY2tSZXZpc2lvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBBVEg6CisgICAgICAgICAgY2hlY2tQYXRoKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgICBjaGVja0RpZmYoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgICAgY2hlY2tMb2coKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgR2l0aWxlc1ZpZXcodHlwZSwgaG9zdE5hbWUsIHNlcnZsZXRQYXRoLCByZXBvc2l0b3J5TmFtZSwgcmV2aXNpb24sCisgICAgICAgICAgb2xkUmV2aXNpb24sIHBhdGgsIHBhcmFtcywgYW5jaG9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvVXJsKCkgeworICAgICAgcmV0dXJuIGJ1aWxkKCkudG9VcmwoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tIb3N0SW5kZXgoKSB7CisgICAgICBjaGVja1N0YXRlKGhvc3ROYW1lICE9IG51bGwsICJtaXNzaW5nIGhvc3ROYW1lIG9uICVzIHZpZXciLCB0eXBlKTsKKyAgICAgIGNoZWNrU3RhdGUoc2VydmxldFBhdGggIT0gbnVsbCwgIm1pc3NpbmcgaG9zdE5hbWUgb24gJXMgdmlldyIsIHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcG9zaXRvcnlJbmRleCgpIHsKKyAgICAgIGNoZWNrU3RhdGUocmVwb3NpdG9yeU5hbWUgIT0gbnVsbCwgIm1pc3NpbmcgcmVwb3NpdG9yeSBuYW1lIG9uICVzIHZpZXciLCB0eXBlKTsKKyAgICAgIGNoZWNrSG9zdEluZGV4KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmV2aXNpb24oKSB7CisgICAgICBjaGVja1N0YXRlKHJldmlzaW9uICE9IFJldmlzaW9uLk5VTEwsICJtaXNzaW5nIHJldmlzaW9uIG9uICVzIHZpZXciLCB0eXBlKTsKKyAgICAgIGNoZWNrUmVwb3NpdG9yeUluZGV4KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGlmZigpIHsKKyAgICAgIGNoZWNrUGF0aCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0xvZygpIHsKKyAgICAgIGNoZWNrUmV2aXNpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXRoKCkgeworICAgICAgY2hlY2tTdGF0ZShwYXRoICE9IG51bGwsICJtaXNzaW5nIHBhdGggb24gJXMgdmlldyIsIHR5cGUpOworICAgICAgY2hlY2tSZXZpc2lvbigpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBob3N0SW5kZXgoKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuSE9TVF9JTkRFWCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgcmVwb3NpdG9yeUluZGV4KCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLlJFUE9TSVRPUllfSU5ERVgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIHJldmlzaW9uKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLlJFVklTSU9OKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBwYXRoKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLlBBVEgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGRpZmYoKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuRElGRik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbG9nKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcihUeXBlLkxPRyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWF5YmVUcmltTGVhZGluZ0FuZFRyYWlsaW5nU2xhc2goU3RyaW5nIHN0cikgeworICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDEpOworICAgIH0KKyAgICByZXR1cm4gIXN0ci5pc0VtcHR5KCkgJiYgc3RyLmVuZHNXaXRoKCIvIikgPyBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKSAtIDEpIDogc3RyOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3ROYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZXJ2bGV0UGF0aDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwb3NpdG9yeU5hbWU7CisgIHByaXZhdGUgZmluYWwgUmV2aXNpb24gcmV2aXNpb247CisgIHByaXZhdGUgZmluYWwgUmV2aXNpb24gb2xkUmV2aXNpb247CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFuY2hvcjsKKworICBwcml2YXRlIEdpdGlsZXNWaWV3KFR5cGUgdHlwZSwKKyAgICAgIFN0cmluZyBob3N0TmFtZSwKKyAgICAgIFN0cmluZyBzZXJ2bGV0UGF0aCwKKyAgICAgIFN0cmluZyByZXBvc2l0b3J5TmFtZSwKKyAgICAgIFJldmlzaW9uIHJldmlzaW9uLAorICAgICAgUmV2aXNpb24gb2xkUmV2aXNpb24sCisgICAgICBTdHJpbmcgcGF0aCwKKyAgICAgIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zLAorICAgICAgU3RyaW5nIGFuY2hvcikgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOworICAgIHRoaXMuc2VydmxldFBhdGggPSBzZXJ2bGV0UGF0aDsKKyAgICB0aGlzLnJlcG9zaXRvcnlOYW1lID0gcmVwb3NpdG9yeU5hbWU7CisgICAgdGhpcy5yZXZpc2lvbiA9IE9iamVjdHMuZmlyc3ROb25OdWxsKHJldmlzaW9uLCBSZXZpc2lvbi5OVUxMKTsKKyAgICB0aGlzLm9sZFJldmlzaW9uID0gT2JqZWN0cy5maXJzdE5vbk51bGwob2xkUmV2aXNpb24sIFJldmlzaW9uLk5VTEwpOworICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgdGhpcy5wYXJhbXMgPSBNdWx0aW1hcHMudW5tb2RpZmlhYmxlTGlzdE11bHRpbWFwKHBhcmFtcyk7CisgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKCkgeworICAgIHJldHVybiBob3N0TmFtZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisgICAgcmV0dXJuIHNlcnZsZXRQYXRoOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZSgpIHsKKyAgICByZXR1cm4gcmVwb3NpdG9yeU5hbWU7CisgIH0KKworICBwdWJsaWMgUmV2aXNpb24gZ2V0UmV2aXNpb24oKSB7CisgICAgcmV0dXJuIHJldmlzaW9uOworICB9CisKKyAgcHVibGljIFJldmlzaW9uIGdldE9sZFJldmlzaW9uKCkgeworICAgIHJldHVybiBvbGRSZXZpc2lvbjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmV2aXNpb25SYW5nZSgpIHsKKyAgICBpZiAob2xkUmV2aXNpb24gPT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTE9HOgorICAgICAgICBjYXNlIERJRkY6CisgICAgICAgICAgLy8gRm9yIHR5cGVzIHRoYXQgcmVxdWlyZSB0d28gcmV2aXNpb25zLCBOVUxMIGluZGljYXRlcyB0aGUgZW1wdHkKKyAgICAgICAgICAvLyB0cmVlL2NvbW1pdC4KKyAgICAgICAgICByZXR1cm4gcmV2aXNpb24uZ2V0TmFtZSgpICsgIl4hIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBGb3IgZXZlcnl0aGluZyBlbHNlIE5VTEwgaW5kaWNhdGVzIGl0IGlzIG5vdCBhIHJhbmdlLCBqdXN0IGEgc2luZ2xlCisgICAgICAgICAgLy8gcmV2aXNpb24uCisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGUuRElGRiAmJiBpc0ZpcnN0UGFyZW50KHJldmlzaW9uLCBvbGRSZXZpc2lvbikpIHsKKyAgICAgIHJldHVybiByZXZpc2lvbi5nZXROYW1lKCkgKyAiXiEiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gb2xkUmV2aXNpb24uZ2V0TmFtZSgpICsgIi4uIiArIHJldmlzaW9uLmdldE5hbWUoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFRyZWVQYXRoKCkgeworICAgIHJldHVybiBwYXRoOworICB9CisKKyAgcHVibGljIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gcGFyYW1zOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRBbmNob3IoKSB7CisgICAgcmV0dXJuIGFuY2hvcjsKKyAgfQorCisgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICAvKiogQHJldHVybiBhbiBlc2NhcGVkLCByZWxhdGl2ZSBVUkwgcmVwcmVzZW50aW5nIHRoaXMgdmlldy4gKi8KKyAgcHVibGljIFN0cmluZyB0b1VybCgpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHVybCA9IG5ldyBTdHJpbmdCdWlsZGVyKHNlcnZsZXRQYXRoKS5hcHBlbmQoJy8nKTsKKyAgICBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IHRoaXMucGFyYW1zOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBIT1NUX0lOREVYOgorICAgICAgICBwYXJhbXMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICAgIGlmICghdGhpcy5wYXJhbXMuY29udGFpbnNLZXkoImZvcm1hdCIpKSB7CisgICAgICAgICAgcGFyYW1zLnB1dCgiZm9ybWF0IiwgRm9ybWF0VHlwZS5IVE1MLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5wdXRBbGwodGhpcy5wYXJhbXMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVQT1NJVE9SWV9JTkRFWDoKKyAgICAgICAgdXJsLmFwcGVuZChyZXBvc2l0b3J5TmFtZSkuYXBwZW5kKCcvJyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVZJU0lPTjoKKyAgICAgICAgdXJsLmFwcGVuZChyZXBvc2l0b3J5TmFtZSkuYXBwZW5kKCIvKyIpOworICAgICAgICBpZiAoIWdldFJldmlzaW9uKCkubmFtZUlzSWQoKSkgeworICAgICAgICAgIHVybC5hcHBlbmQoInNob3ciKTsgLy8gRGVmYXVsdCBmb3IgLysvbWFzdGVyIGlzICtsb2cuCisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZCgnLycpLmFwcGVuZChyZXZpc2lvbi5nZXROYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgdXJsLmFwcGVuZChyZXBvc2l0b3J5TmFtZSkuYXBwZW5kKCIvKy8iKS5hcHBlbmQocmV2aXNpb24uZ2V0TmFtZSgpKS5hcHBlbmQoJy8nKQorICAgICAgICAgICAgLmFwcGVuZChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERJRkY6CisgICAgICAgIHVybC5hcHBlbmQocmVwb3NpdG9yeU5hbWUpLmFwcGVuZCgiLysvIik7CisgICAgICAgIGlmIChpc0ZpcnN0UGFyZW50KHJldmlzaW9uLCBvbGRSZXZpc2lvbikpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKHJldmlzaW9uLmdldE5hbWUoKSkuYXBwZW5kKCJeISIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVybC5hcHBlbmQob2xkUmV2aXNpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIi4uIikuYXBwZW5kKHJldmlzaW9uLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZCgnLycpLmFwcGVuZChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPRzoKKyAgICAgICAgdXJsLmFwcGVuZChyZXBvc2l0b3J5TmFtZSkuYXBwZW5kKCIvKyIpOworICAgICAgICBpZiAoZ2V0UmV2aXNpb24oKS5uYW1lSXNJZCgpIHx8IG9sZFJldmlzaW9uICE9IFJldmlzaW9uLk5VTEwgfHwgcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAvLyBEZWZhdWx0IGZvciAvKy9jMGZmZWUvKC4uLikgaXMgK3Nob3cuCisgICAgICAgICAvLyBEZWZhdWx0IGZvciAvKy9jMGZmZWUuLmRlYWRiZWVmKC8uLi4pIGlzICtkaWZmLgorICAgICAgICAgIHVybC5hcHBlbmQoImxvZyIpOworICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQoJy8nKTsKKyAgICAgICAgaWYgKG9sZFJldmlzaW9uICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKG9sZFJldmlzaW9uLmdldE5hbWUoKSkuYXBwZW5kKCIuLiIpOworICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQocmV2aXNpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgIHVybC5hcHBlbmQoJy8nKS5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHR5cGUpOworICAgIH0KKyAgICBTdHJpbmcgYmFzZVVybCA9IE5BTUVfRVNDQVBFUi5hcHBseSh1cmwudG9TdHJpbmcoKSk7CisgICAgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBpZiAoIXBhcmFtcy5pc0VtcHR5KCkpIHsKKyAgICAgIHVybC5hcHBlbmQoJz8nKS5hcHBlbmQocGFyYW1zVG9TdHJpbmcocGFyYW1zKSk7CisgICAgfQorICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGFuY2hvcikpIHsKKyAgICAgIHVybC5hcHBlbmQoJyMnKS5hcHBlbmQoTkFNRV9FU0NBUEVSLmFwcGx5KGFuY2hvcikpOworICAgIH0KKyAgICByZXR1cm4gYmFzZVVybCArIHVybC50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0QnJlYWRjcnVtYnMoKSB7CisgICAgU3RyaW5nIHBhdGggPSB0aGlzLnBhdGg7CisgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPE1hcDxTdHJpbmcsIFN0cmluZz4+IGJyZWFkY3J1bWJzID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CisgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIoaG9zdE5hbWUsIGhvc3RJbmRleCgpLmNvcHlGcm9tKHRoaXMpKSk7CisgICAgaWYgKHJlcG9zaXRvcnlOYW1lICE9IG51bGwpIHsKKyAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKHJlcG9zaXRvcnlOYW1lLCByZXBvc2l0b3J5SW5kZXgoKS5jb3B5RnJvbSh0aGlzKSkpOworICAgIH0KKyAgICBpZiAodHlwZSA9PSBUeXBlLkRJRkYpIHsKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogVHdlYWsgdGhlIGJyZWFkY3J1bWJzIHRlbXBsYXRlIHRvIGFsbG93IHVzIHRvIHJlbmRlcgorICAgICAgLy8gc2VwYXJhdGUgbGlua3MgaW4gIm9sZC4ubmV3Ii4KKyAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKGdldFJldmlzaW9uUmFuZ2UoKSwgZGlmZigpLmNvcHlGcm9tKHRoaXMpLnNldFRyZWVQYXRoKCIiKSkpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlLkxPRykgeworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBBZGQgc29tZXRoaW5nIGluIHRoZSBuYXZpZ2F0aW9uIGFyZWEgKHByb2JhYmx5IG5vdAorICAgICAgLy8gYSBicmVhZGNydW1iKSB0byBhbGxvdyBzd2l0Y2hpbmcgYmV0d2VlbiAvK2xvZy8gYW5kIC8rLy4KKyAgICAgIGlmIChvbGRSZXZpc2lvbiA9PSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKHJldmlzaW9uLmdldE5hbWUoKSwgbG9nKCkuY29weUZyb20odGhpcykuc2V0VHJlZVBhdGgobnVsbCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKGdldFJldmlzaW9uUmFuZ2UoKSwgbG9nKCkuY29weUZyb20odGhpcykuc2V0VHJlZVBhdGgobnVsbCkpKTsKKyAgICAgIH0KKyAgICAgIHBhdGggPSBTdHJpbmdzLmVtcHR5VG9OdWxsKHBhdGgpOworICAgIH0gZWxzZSBpZiAocmV2aXNpb24gIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIocmV2aXNpb24uZ2V0TmFtZSgpLCByZXZpc2lvbigpLmNvcHlGcm9tKHRoaXMpKSk7CisgICAgfQorICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgIGlmICh0eXBlICE9IFR5cGUuTE9HKSB7IC8vIFRoZSAiLiIgYnJlYWRjcnVtYiB3b3VsZCBiZSBubyBkaWZmZXJlbnQgZm9yIExPRy4KKyAgICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIoIi4iLCBjb3B5V2l0aFBhdGgoKS5zZXRUcmVlUGF0aCgiIikpKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZ0J1aWxkZXIgY3VyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChTdHJpbmcgcGFydCA6IFJldmlzaW9uUGFyc2VyLlBBVEhfU1BMSVRURVIub21pdEVtcHR5U3RyaW5ncygpLnNwbGl0KHBhdGgpKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBjdXIuYXBwZW5kKCcvJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjdXIuYXBwZW5kKHBhcnQpOworICAgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihwYXJ0LCBjb3B5V2l0aFBhdGgoKS5zZXRUcmVlUGF0aChjdXIudG9TdHJpbmcoKSkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJyZWFkY3J1bWJzLmJ1aWxkKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJyZWFkY3J1bWIoU3RyaW5nIHRleHQsIEJ1aWxkZXIgdXJsKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQsICJ1cmwiLCB1cmwudG9VcmwoKSk7CisgIH0KKworICBwcml2YXRlIEJ1aWxkZXIgY29weVdpdGhQYXRoKCkgeworICAgIEJ1aWxkZXIgY29weTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgY29weSA9IGRpZmYoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExPRzoKKyAgICAgICAgY29weSA9IGxvZygpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNvcHkgPSBwYXRoKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY29weS5jb3B5RnJvbSh0aGlzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaXJzdFBhcmVudChSZXZpc2lvbiByZXYxLCBSZXZpc2lvbiByZXYyKSB7CisgICAgcmV0dXJuIHJldjIgPT0gUmV2aXNpb24uTlVMTAorICAgICAgICB8fCByZXYyLmdldE5hbWUoKS5lcXVhbHMocmV2MS5nZXROYW1lKCkgKyAiXiIpCisgICAgICAgIHx8IHJldjIuZ2V0TmFtZSgpLmVxdWFscyhyZXYxLmdldE5hbWUoKSArICJ+MSIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcmFtc1RvU3RyaW5nKExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CisgICAgdHJ5IHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHBhcmFtcy5lbnRyaWVzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgc2IuYXBwZW5kKCcmJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfQorICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGUuZ2V0S2V5KCksIENoYXJzZXRzLlVURl84Lm5hbWUoKSkpOworICAgICAgaWYgKCEiIi5lcXVhbHMoZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICBzYi5hcHBlbmQoJz0nKQorICAgICAgICAgICAgLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShlLmdldFZhbHVlKCksIENoYXJzZXRzLlVURl84Lm5hbWUoKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSG9zdEluZGV4U2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0hvc3RJbmRleFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjlmZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0hvc3RJbmRleFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkZvcm1hdFR5cGUuSlNPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkZvcm1hdFR5cGUuVEVYVDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5IdHRwSGVhZGVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uRmllbGROYW1pbmdQb2xpY3k7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS5kYXRhLlNveUxpc3REYXRhOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LmRhdGEuU295TWFwRGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgdGhlIHRvcCBsZXZlbCBpbmRleCBwYWdlIGZvciBhIEdpdGlsZXMgaG9zdC4gKi8KK3B1YmxpYyBjbGFzcyBIb3N0SW5kZXhTZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSG9zdEluZGV4U2VydmxldC5jbGFzcyk7CisKKyAgcHJvdGVjdGVkIGZpbmFsIEdpdGlsZXNVcmxzIHVybHM7CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3Rvcnk7CisKKyAgcHVibGljIEhvc3RJbmRleFNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIEdpdGlsZXNVcmxzIHVybHMsCisgICAgICBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeSkgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgICB0aGlzLnVybHMgPSBjaGVja05vdE51bGwodXJscywgInVybHMiKTsKKyAgICB0aGlzLmFjY2Vzc0ZhY3RvcnkgPSBjaGVja05vdE51bGwoYWNjZXNzRmFjdG9yeSwgImFjY2Vzc0ZhY3RvcnkiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGb3JtYXRUeXBlIGZvcm1hdDsKKyAgICB0cnkgeworICAgICAgZm9ybWF0ID0gRm9ybWF0VHlwZS5nZXRGb3JtYXRUeXBlKHJlcSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGVycikgeworICAgICAgcmVzLnNlbmRFcnJvcihTQ19CQURfUkVRVUVTVCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2V0PFN0cmluZz4gYnJhbmNoZXMgPSBwYXJzZVNob3dCcmFuY2gocmVxKTsKKyAgICBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGRlc2NzOworICAgIHRyeSB7CisgICAgICBkZXNjcyA9IGFjY2Vzc0ZhY3RvcnkuZm9yUmVxdWVzdChyZXEpLmxpc3RSZXBvc2l0b3JpZXMoYnJhbmNoZXMpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXMuc2VuZEVycm9yKFNDX05PVF9GT1VORCk7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24gZSkgeworICAgICAgcmVzLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVEKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgeworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBTaG93IHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyLgorICAgICAgcmVzLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgeworICAgICAgU3RyaW5nIG5hbWUgPSB1cmxzLmdldEhvc3ROYW1lKHJlcSk7CisgICAgICBsb2cud2FybigiQ2Fubm90IHNjYW4gcmVwb3NpdG9yaWVzIiArIChuYW1lICE9IG51bGwgPyAiZm9yICIgKyBuYW1lIDogIiIpLCBlcnIpOworICAgICAgcmVzLnNlbmRFcnJvcihTQ19TRVJWSUNFX1VOQVZBSUxBQkxFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgY2FzZSBIVE1MOgorICAgICAgY2FzZSBERUZBVUxUOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGlzcGxheUh0bWwocmVxLCByZXMsIGRlc2NzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVEVYVDoKKyAgICAgICAgZGlzcGxheVRleHQocmVxLCByZXMsIGJyYW5jaGVzLCBkZXNjcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEpTT046CisgICAgICAgIGRpc3BsYXlKc29uKHJlcSwgcmVzLCBkZXNjcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU295TWFwRGF0YSB0b1NveU1hcERhdGEoUmVwb3NpdG9yeURlc2NyaXB0aW9uIGRlc2MsIEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICByZXR1cm4gbmV3IFNveU1hcERhdGEoCisgICAgICAgICJuYW1lIiwgZGVzYy5uYW1lLAorICAgICAgICAiZGVzY3JpcHRpb24iLCBTdHJpbmdzLm51bGxUb0VtcHR5KGRlc2MuZGVzY3JpcHRpb24pLAorICAgICAgICAidXJsIiwgR2l0aWxlc1ZpZXcucmVwb3NpdG9yeUluZGV4KCkKKyAgICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKGRlc2MubmFtZSkKKyAgICAgICAgICAgIC50b1VybCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkaXNwbGF5SHRtbChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gZGVzY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU295TGlzdERhdGEgcmVwb3MgPSBuZXcgU295TGlzdERhdGEoKTsKKyAgICBmb3IgKFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBkZXNjIDogZGVzY3MudmFsdWVzKCkpIHsKKyAgICAgIHJlcG9zLmFkZCh0b1NveU1hcERhdGEoZGVzYywgVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkpKTsKKyAgICB9CisKKyAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLmhvc3RJbmRleCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgImhvc3ROYW1lIiwgdXJscy5nZXRIb3N0TmFtZShyZXEpLAorICAgICAgICAiYmFzZVVybCIsIHVybHMuZ2V0QmFzZUdpdFVybChyZXEpLAorICAgICAgICAicmVwb3NpdG9yaWVzIiwgcmVwb3MpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkaXNwbGF5VGV4dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIFNldDxTdHJpbmc+IGJyYW5jaGVzLCBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGRlc2NzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlcy5zZXRDb250ZW50VHlwZShURVhULmdldE1pbWVUeXBlKCkpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICByZXMuc2V0SGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfRElTUE9TSVRJT04sICJhdHRhY2htZW50Iik7CisgICAgc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CisKKyAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXMuZ2V0V3JpdGVyKCk7CisgICAgZm9yIChSZXBvc2l0b3J5RGVzY3JpcHRpb24gcmVwbyA6IGRlc2NzLnZhbHVlcygpKSB7CisgICAgICBmb3IgKFN0cmluZyBuYW1lIDogYnJhbmNoZXMpIHsKKyAgICAgICAgU3RyaW5nIHJlZiA9IHJlcG8uYnJhbmNoZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVmID09IG51bGwpIHsKKyAgICAgICAgICAvLyBQcmludCBzdHViIChmb3J0eSAnLScgc3ltYm9scykKKyAgICAgICAgICByZWYgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50KHJlZik7CisgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgfQorICAgICAgd3JpdGVyLnByaW50KEdpdGlsZXNVcmxzLk5BTUVfRVNDQVBFUi5hcHBseShyZXBvLm5hbWUpKTsKKyAgICAgIHdyaXRlci5wcmludCgnXG4nKTsKKyAgICB9CisgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgd3JpdGVyLmNsb3NlKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGlzcGxheUpzb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGRlc2NzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlcy5zZXRDb250ZW50VHlwZShKU09OLmdldE1pbWVUeXBlKCkpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICByZXMuc2V0SGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfRElTUE9TSVRJT04sICJhdHRhY2htZW50Iik7CisgICAgc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CisKKyAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXMuZ2V0V3JpdGVyKCk7CisgICAgbmV3IEdzb25CdWlsZGVyKCkKKyAgICAgICAgLnNldEZpZWxkTmFtaW5nUG9saWN5KEZpZWxkTmFtaW5nUG9saWN5LkxPV0VSX0NBU0VfV0lUSF9VTkRFUlNDT1JFUykKKyAgICAgICAgLnNldFByZXR0eVByaW50aW5nKCkKKyAgICAgICAgLmdlbmVyYXRlTm9uRXhlY3V0YWJsZUpzb24oKQorICAgICAgICAuY3JlYXRlKCkKKyAgICAgICAgLnRvSnNvbihkZXNjcywKKyAgICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4+KCkge30uZ2V0VHlwZSgpLAorICAgICAgICAgIHdyaXRlcik7CisgICAgd3JpdGVyLnByaW50KCdcbicpOworICAgIHdyaXRlci5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gcGFyc2VTaG93QnJhbmNoKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAvLyBSb3VnaGx5IG1hdGNoIEdlcnJpdCBDb2RlIFJldmlldydzIC9wcm9qZWN0cy8gQVBJIGJ5IHN1cHBvcnRpbmcKKyAgICAvLyBib3RoIHNob3ctYnJhbmNoIGFuZCBiIGFzIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgU2V0PFN0cmluZz4gYnJhbmNoZXMgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgICBTdHJpbmdbXSB2YWx1ZXMgPSByZXEuZ2V0UGFyYW1ldGVyVmFsdWVzKCJzaG93LWJyYW5jaCIpOworICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgYnJhbmNoZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisgICAgfQorICAgIHZhbHVlcyA9IHJlcS5nZXRQYXJhbWV0ZXJWYWx1ZXMoImIiKTsKKyAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKKyAgICAgIGJyYW5jaGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlcykpOworICAgIH0KKyAgICByZXR1cm4gYnJhbmNoZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9IdG1sRGlmZkZvcm1hdHRlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0h0bWxEaWZmRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiMWViOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9IdG1sRGlmZkZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdFc2NhcGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5SYXdUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGF0Y2guRmlsZUhlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLkZpbGVIZWFkZXIuUGF0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIEZvcm1hdHMgYSB1bmlmaWVkIGZvcm1hdCBwYXRjaCBhcyBVVEYtOCBlbmNvZGVkIEhUTUwuICovCitmaW5hbCBjbGFzcyBIdG1sRGlmZkZvcm1hdHRlciBleHRlbmRzIERpZmZGb3JtYXR0ZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRElGRl9CRUdJTiA9ICI8cHJlIGNsYXNzPVwiZGlmZi11bmlmaWVkXCI+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBESUZGX0VORCA9ICI8L3ByZT4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gSFVOS19CRUdJTiA9ICI8c3BhbiBjbGFzcz1cImhcIj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEhVTktfRU5EID0gIjwvc3Bhbj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTElORV9JTlNFUlRfQkVHSU4gPSAiPHNwYW4gY2xhc3M9XCJpXCI+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMSU5FX0RFTEVURV9CRUdJTiA9ICI8c3BhbiBjbGFzcz1cImRcIj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExJTkVfQ0hBTkdFX0JFR0lOID0gIjxzcGFuIGNsYXNzPVwiY1wiPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTElORV9FTkQgPSAiPC9zcGFuPlxuIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisKKyAgcHJpdmF0ZSBmaW5hbCBSZW5kZXJlciByZW5kZXJlcjsKKyAgcHJpdmF0ZSBpbnQgZmlsZUluZGV4OworCisgIEh0bWxEaWZmRm9ybWF0dGVyKFJlbmRlcmVyIHJlbmRlcmVyLCBPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgc3VwZXIob3V0KTsKKyAgICB0aGlzLnJlbmRlcmVyID0gY2hlY2tOb3ROdWxsKHJlbmRlcmVyLCAicmVuZGVyZXIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmb3JtYXQoTGlzdDw/IGV4dGVuZHMgRGlmZkVudHJ5PiBlbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoZmlsZUluZGV4ID0gMDsgZmlsZUluZGV4IDwgZW50cmllcy5zaXplKCk7IGZpbGVJbmRleCsrKSB7CisgICAgICBmb3JtYXQoZW50cmllcy5nZXQoZmlsZUluZGV4KSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZvcm1hdChGaWxlSGVhZGVyIGhkciwgUmF3VGV4dCBhLCBSYXdUZXh0IGIpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBzdGFydCA9IGhkci5nZXRTdGFydE9mZnNldCgpOworICAgIGludCBlbmQgPSBoZHIuZ2V0RW5kT2Zmc2V0KCk7CisgICAgaWYgKCFoZHIuZ2V0SHVua3MoKS5pc0VtcHR5KCkpIHsKKyAgICAgIGVuZCA9IGhkci5nZXRIdW5rcygpLmdldCgwKS5nZXRTdGFydE9mZnNldCgpOworICAgIH0KKyAgICByZW5kZXJIZWFkZXIoUmF3UGFyc2VVdGlscy5kZWNvZGUoaGRyLmdldEJ1ZmZlcigpLCBzdGFydCwgZW5kKSk7CisKKyAgICBpZiAoaGRyLmdldFBhdGNoVHlwZSgpID09IFBhdGNoVHlwZS5VTklGSUVEKSB7CisgICAgICBnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShESUZGX0JFR0lOKTsKKyAgICAgIGZvcm1hdChoZHIudG9FZGl0TGlzdCgpLCBhLCBiKTsKKyAgICAgIGdldE91dHB1dFN0cmVhbSgpLndyaXRlKERJRkZfRU5EKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVuZGVySGVhZGVyKFN0cmluZyBoZWFkZXIpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBsZiA9IGhlYWRlci5pbmRleE9mKCdcbicpOworICAgIFN0cmluZyBmaXJzdDsKKyAgICBTdHJpbmcgcmVzdDsKKyAgICBpZiAoMCA8PSBsZikgeworICAgICAgZmlyc3QgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGxmKTsKKyAgICAgIHJlc3QgPSBoZWFkZXIuc3Vic3RyaW5nKGxmICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpcnN0ID0gaGVhZGVyOworICAgICAgcmVzdCA9ICIiOworICAgIH0KKyAgICBnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShyZW5kZXJlci5uZXdSZW5kZXJlcigiZ2l0aWxlcy5kaWZmSGVhZGVyIikKKyAgICAgICAgLnNldERhdGEoSW1tdXRhYmxlTWFwLm9mKCJmaXJzdCIsIGZpcnN0LCAicmVzdCIsIHJlc3QsICJmaWxlSW5kZXgiLCBmaWxlSW5kZXgpKQorICAgICAgICAucmVuZGVyKCkKKyAgICAgICAgLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgd3JpdGVIdW5rSGVhZGVyKGludCBhU3RhcnRMaW5lLCBpbnQgYUVuZExpbmUsCisgICAgICBpbnQgYlN0YXJ0TGluZSwgaW50IGJFbmRMaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGdldE91dHB1dFN0cmVhbSgpLndyaXRlKEhVTktfQkVHSU4pOworICAgIC8vIFRPRE8oc29wKTogSWYgaHVuayBoZWFkZXIgc3RhcnRzIGluY2x1ZGluZyBtZXRob2QgbmFtZXMsIGVzY2FwZSBpdC4KKyAgICBzdXBlci53cml0ZUh1bmtIZWFkZXIoYVN0YXJ0TGluZSwgYUVuZExpbmUsIGJTdGFydExpbmUsIGJFbmRMaW5lKTsKKyAgICBnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShIVU5LX0VORCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMaW5lKGNoYXIgcHJlZml4LCBSYXdUZXh0IHRleHQsIGludCBjdXIpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIE1hbnVhbGx5IHJlbmRlciBlYWNoIGxpbmUsIHJhdGhlciB0aGFuIGludm9rZSBhIFNveSB0ZW1wbGF0ZS4gVGhpcyBtZXRob2QKKyAgICAvLyBjYW4gYmUgY2FsbGVkIHRob3VzYW5kcyBvZiB0aW1lcyBpbiBhIHNpbmdsZSByZXF1ZXN0LiBBdm9pZCB1bm5lY2Vzc2FyeQorICAgIC8vIG92ZXJoZWFkcyBieSBmb3JtYXR0aW5nIGFzLWlzLgorICAgIE91dHB1dFN0cmVhbSBvdXQgPSBnZXRPdXRwdXRTdHJlYW0oKTsKKyAgICBzd2l0Y2ggKHByZWZpeCkgeworICAgICAgY2FzZSAnKyc6CisgICAgICAgIG91dC53cml0ZShMSU5FX0lOU0VSVF9CRUdJTik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLSc6CisgICAgICAgIG91dC53cml0ZShMSU5FX0RFTEVURV9CRUdJTik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnICc6CisgICAgICBkZWZhdWx0OgorICAgICAgICBvdXQud3JpdGUoTElORV9DSEFOR0VfQkVHSU4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgb3V0LndyaXRlKFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUh0bWw0KHRleHQuZ2V0U3RyaW5nKGN1cikpLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgb3V0LndyaXRlKExJTkVfRU5EKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWU2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIExpbmtpZmllciBmb3IgYmxvY2tzIG9mIHRleHQgc3VjaCBhcyBjb21taXQgbWVzc2FnZSBkZXNjcmlwdGlvbnMuICovCitwdWJsaWMgY2xhc3MgTGlua2lmaWVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBMSU5LX1BBVFRFUk47CisKKyAgc3RhdGljIHsKKyAgICAvLyBIVFRQIFVSTCByZWdleCBhZGFwdGVkIGZyb20gY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWwuCisgICAgU3RyaW5nIHBhcnQgPSAiW2EtekEtWjAtOSRfLishKicsJTs6QD0/Iy9+PD4tXSI7CisgICAgU3RyaW5nIGh0dHBVcmwgPSAiaHR0cHM/Oi8vIiArCisgICAgICAgIHBhcnQgKyAiezIsfSIgKworICAgICAgICAiKD86WyhdIiArIHBhcnQgKyAiKiIgKyAiWyldKSoiICsKKyAgICAgICAgcGFydCArICIqIjsKKyAgICBTdHJpbmcgY2hhbmdlSWQgPSAiXFxiSVswLTlhLWZdezgsNDB9XFxiIjsKKyAgICBMSU5LX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoSm9pbmVyLm9uKCJ8Iikuam9pbigKKyAgICAgICAgIigiICsgaHR0cFVybCArICIpIiwKKyAgICAgICAgIigiICsgY2hhbmdlSWQgKyAiKSIpKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgR2l0aWxlc1VybHMgdXJsczsKKworICBwdWJsaWMgTGlua2lmaWVyKEdpdGlsZXNVcmxzIHVybHMpIHsKKyAgICB0aGlzLnVybHMgPSBjaGVja05vdE51bGwodXJscywgInVybHMiKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGxpbmtpZnkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBTdHJpbmcgYmFzZUdlcnJpdFVybCA9IHVybHMuZ2V0QmFzZUdlcnJpdFVybChyZXEpOworICAgIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gcGFyc2VkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTWF0Y2hlciBtID0gTElOS19QQVRURVJOLm1hdGNoZXIobWVzc2FnZSk7CisgICAgaW50IGxhc3QgPSAwOworICAgIHdoaWxlIChtLmZpbmQoKSkgeworICAgICAgYWRkVGV4dChwYXJzZWQsIG1lc3NhZ2Uuc3Vic3RyaW5nKGxhc3QsIG0uc3RhcnQoKSkpOworICAgICAgaWYgKG0uZ3JvdXAoMSkgIT0gbnVsbCkgeworICAgICAgICAvLyBCYXJlIFVSTC4KKyAgICAgICAgcGFyc2VkLmFkZChsaW5rKG0uZ3JvdXAoMSksIG0uZ3JvdXAoMSkpKTsKKyAgICAgIH0gZWxzZSBpZiAobS5ncm91cCgyKSAhPSBudWxsKSB7CisgICAgICAgIGlmIChiYXNlR2Vycml0VXJsICE9IG51bGwpIHsKKyAgICAgICAgICAvLyBHZXJyaXQgQ2hhbmdlLUlkLgorICAgICAgICAgIHBhcnNlZC5hZGQobGluayhtLmdyb3VwKDIpLCBiYXNlR2Vycml0VXJsICsgIiMvcS8iICsgbS5ncm91cCgyKSArICIsbix6IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZFRleHQocGFyc2VkLCBtLmdyb3VwKDIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdCA9IG0uZW5kKCk7CisgICAgfQorICAgIGFkZFRleHQocGFyc2VkLCBtZXNzYWdlLnN1YnN0cmluZyhsYXN0KSk7CisgICAgcmV0dXJuIHBhcnNlZDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbGluayhTdHJpbmcgdGV4dCwgU3RyaW5nIHVybCkgeworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0LCAidXJsIiwgdXJsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVGV4dChMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHBhcnRzLCBTdHJpbmcgdGV4dCkgeworICAgIGlmICh0ZXh0LmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocGFydHMuaXNFbXB0eSgpKSB7CisgICAgICBwYXJ0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCkpOworICAgIH0gZWxzZSB7CisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZCA9IHBhcnRzLmdldChwYXJ0cy5zaXplKCkgLSAxKTsKKyAgICAgIGlmICghb2xkLmNvbnRhaW5zS2V5KCJ1cmwiKSkgeworICAgICAgICBwYXJ0cy5zZXQocGFydHMuc2l6ZSgpIC0gMSwgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0Iiwgb2xkLmdldCgidGV4dCIpICsgdGV4dCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFydHMuYWRkKEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Mb2dTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTG9nU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTc3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTG9nU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuQ29tbWl0U295RGF0YS5LZXlTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmV2V2Fsa0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9sbG93RmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldk9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgYW4gSFRNTCBwYWdlIHdpdGggYSBzaG9ydGxvZyBmb3IgY29tbWl0cyBhbmQgcGF0aHMuICovCitwdWJsaWMgY2xhc3MgTG9nU2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvZ1NlcnZsZXQuY2xhc3MpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9QQVJBTSA9ICJzIjsKKworICBwcml2YXRlIGZpbmFsIExpbmtpZmllciBsaW5raWZpZXI7CisgIHByaXZhdGUgZmluYWwgaW50IGxpbWl0OworCisgIHB1YmxpYyBMb2dTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBMaW5raWZpZXIgbGlua2lmaWVyKSB7CisgICAgdGhpcyhyZW5kZXJlciwgbGlua2lmaWVyLCAxMDApOworICB9CisKKyAgcHJpdmF0ZSBMb2dTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBMaW5raWZpZXIgbGlua2lmaWVyLCBpbnQgbGltaXQpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgICAgdGhpcy5saW5raWZpZXIgPSBjaGVja05vdE51bGwobGlua2lmaWVyLCAibGlua2lmaWVyIik7CisgICAgY2hlY2tBcmd1bWVudChsaW1pdCA+PSAwLCAibGltaXQgbXVzdCBiZSBwb3NpdGl2ZTogJXMiLCBsaW1pdCk7CisgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpOworICAgIFJldldhbGsgd2FsayA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdhbGsgPSBuZXdXYWxrKHJlcG8sIHZpZXcpOworICAgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBPcHRpb25hbDxPYmplY3RJZD4gc3RhcnQgPSBnZXRTdGFydCh2aWV3LmdldFBhcmFtZXRlcnMoKSwgd2Fsay5nZXRPYmplY3RSZWFkZXIoKSk7CisgICAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeworICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSg1KTsKKworICAgICAgaWYgKCF2aWV3LmdldFJldmlzaW9uKCkubmFtZUlzSWQoKSkgeworICAgICAgICBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHRhZ3MgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoRXhwZWN0ZWRTaXplKDEpOworICAgICAgICBmb3IgKFJldk9iamVjdCBvIDogUmV2aXNpb25TZXJ2bGV0Lmxpc3RPYmplY3RzKHdhbGssIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKSkgeworICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUmV2VGFnKSB7CisgICAgICAgICAgICB0YWdzLmFkZChuZXcgVGFnU295RGF0YShsaW5raWZpZXIsIHJlcSkudG9Tb3lEYXRhKChSZXZUYWcpIG8pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0YWdzLmlzRW1wdHkoKSkgeworICAgICAgICAgIGRhdGEucHV0KCJ0YWdzIiwgdGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgUGFnaW5hdG9yIHBhZ2luYXRvciA9IG5ldyBQYWdpbmF0b3Iod2FsaywgbGltaXQsIHN0YXJ0Lm9yTnVsbCgpKTsKKyAgICAgIE1hcDxBbnlPYmplY3RJZCwgU2V0PFJlZj4+IHJlZnNCeUlkID0gcmVwby5nZXRBbGxSZWZzQnlQZWVsZWRPYmplY3RJZCgpOworICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGxpbWl0KTsKKyAgICAgIGZvciAoUmV2Q29tbWl0IGMgOiBwYWdpbmF0b3IpIHsKKyAgICAgICAgZW50cmllcy5hZGQobmV3IENvbW1pdFNveURhdGEobnVsbCwgcmVxLCByZXBvLCB3YWxrLCB2aWV3LCByZWZzQnlJZCkKKyAgICAgICAgICAgIC50b1NveURhdGEoYywgS2V5U2V0LlNIT1JUTE9HKSk7CisgICAgICB9CisKKyAgICAgIFN0cmluZyB0aXRsZSA9ICJMb2cgLSAiOworICAgICAgaWYgKHZpZXcuZ2V0T2xkUmV2aXNpb24oKSAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICAgIHRpdGxlICs9IHZpZXcuZ2V0UmV2aXNpb25SYW5nZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGl0bGUgKz0gdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKTsKKyAgICAgIH0KKworICAgICAgZGF0YS5wdXQoInRpdGxlIiwgdGl0bGUpOworICAgICAgZGF0YS5wdXQoImVudHJpZXMiLCBlbnRyaWVzKTsKKyAgICAgIE9iamVjdElkIG5leHQgPSBwYWdpbmF0b3IuZ2V0TmV4dFN0YXJ0KCk7CisgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgIGRhdGEucHV0KCJuZXh0VXJsIiwgY29weUFuZENhbm9uaWNhbGl6ZSh2aWV3KQorICAgICAgICAgICAgLnJlcGxhY2VQYXJhbShTVEFSVF9QQVJBTSwgbmV4dC5uYW1lKCkpCisgICAgICAgICAgICAudG9VcmwoKSk7CisgICAgICB9CisgICAgICBPYmplY3RJZCBwcmV2ID0gcGFnaW5hdG9yLmdldFByZXZpb3VzU3RhcnQoKTsKKyAgICAgIGlmIChwcmV2ICE9IG51bGwpIHsKKyAgICAgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciBwcmV2VmlldyA9IGNvcHlBbmRDYW5vbmljYWxpemUodmlldyk7CisgICAgICAgIGlmICghcHJldlZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpLmVxdWFscyhwcmV2KSkgeworICAgICAgICAgIHByZXZWaWV3LnJlcGxhY2VQYXJhbShTVEFSVF9QQVJBTSwgcHJldi5uYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGRhdGEucHV0KCJwcmV2aW91c1VybCIsIHByZXZWaWV3LnRvVXJsKCkpOworICAgICAgfQorCisgICAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLmxvZ0RldGFpbCIsIGRhdGEpOworICAgIH0gY2F0Y2ggKFJldldhbGtFeGNlcHRpb24gZSkgeworICAgICAgbG9nLndhcm4oIkVycm9yIGluIHJldiB3YWxrIiwgZSk7CisgICAgICByZXMuc2V0U3RhdHVzKFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICByZXR1cm47CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmICh3YWxrICE9IG51bGwpIHsKKyAgICAgICAgd2Fsay5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgR2l0aWxlc1ZpZXcuQnVpbGRlciBjb3B5QW5kQ2Fub25pY2FsaXplKEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICAvLyBDYW5vbmljYWxpemUgdGhlIHZpZXcgYnkgdXNpbmcgZnVsbCBTSEFzLgorICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgY29weSA9IEdpdGlsZXNWaWV3LmxvZygpLmNvcHlGcm9tKHZpZXcpCisgICAgICAgIC5zZXRSZXZpc2lvbih2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGlmICh2aWV3LmdldE9sZFJldmlzaW9uKCkgIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgY29weS5zZXRPbGRSZXZpc2lvbih2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIH0KKyAgICByZXR1cm4gY29weTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPE9iamVjdElkPiBnZXRTdGFydChMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgIE9iamVjdFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHBhcmFtcy5nZXQoU1RBUlRfUEFSQU0pOworICAgIHN3aXRjaCAodmFsdWVzLnNpemUoKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gT3B0aW9uYWwuYWJzZW50KCk7CisgICAgICBjYXNlIDE6CisgICAgICAgIENvbGxlY3Rpb248T2JqZWN0SWQ+IGlkcyA9IHJlYWRlci5yZXNvbHZlKEFiYnJldmlhdGVkT2JqZWN0SWQuZnJvbVN0cmluZyh2YWx1ZXMuZ2V0KDApKSk7CisgICAgICAgIGlmIChpZHMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KGlkcykpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmV2V2FsayBuZXdXYWxrKFJlcG9zaXRvcnkgcmVwbywgR2l0aWxlc1ZpZXcgdmlldykKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgd2Fsay5tYXJrU3RhcnQod2Fsay5wYXJzZUNvbW1pdCh2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSkpOworICAgIGlmICh2aWV3LmdldE9sZFJldmlzaW9uKCkgIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgd2Fsay5tYXJrVW5pbnRlcmVzdGluZyh3YWxrLnBhcnNlQ29tbWl0KHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKSk7CisgICAgfQorICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHZpZXcuZ2V0VHJlZVBhdGgoKSkpIHsKKyAgICAgIHdhbGsuc2V0VHJlZUZpbHRlcihGb2xsb3dGaWx0ZXIuY3JlYXRlKHZpZXcuZ2V0VHJlZVBhdGgoKSkpOworICAgIH0KKyAgICByZXR1cm4gd2FsazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTQ1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXZXYWxrRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIHtAbGluayBSZXZXYWxrfSB0aGF0IHBhZ2luYXRlcyBmb3IgR2l0aWxlcy4KKyAqCisgKiBBIHNpbmdsZSBwYWdlIG9mIGEgc2hvcnRsb2cgaXMgZGVmaW5lZCBieSBhIHJldmlzaW9uIHJhbmdlLCBzdWNoIGFzICJtYXN0ZXIiCisgKiBvciAibWFzdGVyLi5uZXh0IiwgYSBwYWdlIHNpemUsIGFuZCBhIHN0YXJ0IGNvbW1pdCwgc3VjaCBhcyAiYzBmZmVlIi4gVGhlCisgKiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBjb21taXQgaW4gdGhlIHdhbGsgKCJuZXh0IikgYW5kIHRoZSBmaXJzdCBjb21taXQKKyAqIGluIHRoZSBwYWdlIG1heSBiZSBhcmJpdHJhcmlseSBsb25nLCBidXQgaW4gb3JkZXIgdG8gcHJlc2VudCB0aGUgY29tbWl0IGxpc3QKKyAqIGluIGEgc3RhYmxlIHdheSwgd2UgbXVzdCBhbHdheXMgc3RhcnQgZnJvbSB0aGUgZmlyc3QgY29tbWl0IGluIHRoZSB3YWxrLiBUaGlzCisgKiBpcyBiZWNhdXNlIHRoZXJlIG1heSBiZSBhcmJpdHJhcnkgbWVyZ2UgY29tbWl0cyBiZXR3ZWVuICJjMGZmZWUiIGFuZCAibmV4dCIKKyAqIHRoYXQgZWZmZWN0aXZlbHkgaW5zZXJ0IGFyYml0cmFyeSBjb21taXRzIGludG8gdGhlIGhpc3Rvcnkgc3RhcnRpbmcgZnJvbQorICogImMwZmZlZSIuCisgKi8KK2NsYXNzIFBhZ2luYXRvciBpbXBsZW1lbnRzIEl0ZXJhYmxlPFJldkNvbW1pdD4geworICBwcml2YXRlIGZpbmFsIFJldldhbGsgd2FsazsKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJZCBzdGFydDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbGltaXQ7CisgIHByaXZhdGUgZmluYWwgRGVxdWU8T2JqZWN0SWQ+IHByZXZCdWZmZXI7CisKKyAgcHJpdmF0ZSBib29sZWFuIGRvbmU7CisgIHByaXZhdGUgaW50IGk7CisgIHByaXZhdGUgaW50IG47CisgIHByaXZhdGUgaW50IGZvdW5kSW5kZXg7CisgIHByaXZhdGUgT2JqZWN0SWQgbmV4dFN0YXJ0OworCisgIC8qKgorICAgKiBAcGFyYW0gd2FsayByZXZpc2lvbiB3YWxrLgorICAgKiBAcGFyYW0gbGltaXQgcGFnZSBzaXplLgorICAgKiBAcGFyYW0gc3RhcnQgY29tbWl0IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSB3YWxrLCBvciBudWxsIHRvIHN0YXJ0IGF0IHRoZQorICAgKiAgICAgYmVnaW5uaW5nLgorICAgKi8KKyAgUGFnaW5hdG9yKFJldldhbGsgd2FsaywgaW50IGxpbWl0LCBATnVsbGFibGUgT2JqZWN0SWQgc3RhcnQpIHsKKyAgICB0aGlzLndhbGsgPSBjaGVja05vdE51bGwod2FsaywgIndhbGsiKTsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgY2hlY2tBcmd1bWVudChsaW1pdCA+IDAsICJsaW1pdCBtdXN0IGJlIHBvc2l0aXZlOiAlcyIsIGxpbWl0KTsKKyAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgcHJldkJ1ZmZlciA9IG5ldyBBcnJheURlcXVlPE9iamVjdElkPihzdGFydCAhPSBudWxsID8gbGltaXQgOiAwKTsKKyAgICBpID0gLTE7CisgICAgZm91bmRJbmRleCA9IC0xOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoaXMgcGFnZSBvZiB0aGUgd2Fsay4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50LCBvciBudWxsIGlmIHRoZSB3YWxrIGlzIGZpbmlzaGVkLgorICAgKgorICAgKiBAdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24gU2VlIHtAbGluayBSZXZXYWxrI25leHQoKX0uCisgICAqIEB0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBTZWUge0BsaW5rIFJldldhbGsjbmV4dCgpfS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTZWUge0BsaW5rIFJldldhbGsjbmV4dCgpfS4KKyAgICovCisgIHB1YmxpYyBSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAorICAgICAgSU9FeGNlcHRpb24geworICAgIFJldkNvbW1pdCBjb21taXQ7CisgICAgaWYgKGZvdW5kSW5kZXggPCAwKSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBjb21taXQgPSB3YWxrLm5leHQoKTsKKyAgICAgICAgaWYgKGNvbW1pdCA9PSBudWxsKSB7CisgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydC5lcXVhbHMoY29tbWl0KSkgeworICAgICAgICAgIGZvdW5kSW5kZXggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwcmV2QnVmZmVyLnNpemUoKSA9PSBsaW1pdCkgeworICAgICAgICAgIHByZXZCdWZmZXIucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJldkJ1ZmZlci5hZGQoY29tbWl0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29tbWl0ID0gd2Fsay5uZXh0KCk7CisgICAgfQorCisgICAgaWYgKCsrbiA9PSBsaW1pdCkgeworICAgICAgZG9uZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChuID09IGxpbWl0ICsgMSB8fCBjb21taXQgPT0gbnVsbCkgeworICAgICAgbmV4dFN0YXJ0ID0gY29tbWl0OworICAgICAgZG9uZSA9IHRydWU7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIGNvbW1pdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBJRCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhZ2Ugb2YgcmVzdWx0cyBwcmVjZWRpbmcgdGhpcyBvbmUsIG9yCisgICAqICAgICBudWxsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UuCisgICAqLworICBwdWJsaWMgT2JqZWN0SWQgZ2V0UHJldmlvdXNTdGFydCgpIHsKKyAgICBjaGVja1N0YXRlKGRvbmUsICJnZXRQcmV2aW91c1N0YXJ0KCkgaW52YWxpZCBiZWZvcmUgd2FsayBkb25lIik7CisgICAgcmV0dXJuIHByZXZCdWZmZXIucG9sbEZpcnN0KCk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgSUQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYWdlIG9mIHJlc3VsdHMgYWZ0ZXIgdGhpcyBvbmUsIG9yIG51bGwKKyAgICogICAgIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGFnZS4KKyAgICovCisgIHB1YmxpYyBPYmplY3RJZCBnZXROZXh0U3RhcnQoKSB7CisgICAgY2hlY2tTdGF0ZShkb25lLCAiZ2V0TmV4dFN0YXJ0KCkgaW52YWxpZCBiZWZvcmUgd2FsayBkb25lIik7CisgICAgcmV0dXJuIG5leHRTdGFydDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbW1pdHMgaW4gdGhpcyB3YWxrLgorICAgKiBAdGhyb3dzIFJldldhbGtFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQsIHdyYXBwaW5nIHRoZSBjaGVja2VkCisgICAqICAgICBleGNlcHRpb24gZnJvbSB7QGxpbmsgI25leHQoKX0uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEl0ZXJhdG9yPFJldkNvbW1pdD4gaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxSZXZDb21taXQ+KCkgeworICAgICAgUmV2Q29tbWl0IG5leHQgPSBuZXh0VW5jaGVja2VkKCk7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUmV2Q29tbWl0IG5leHQoKSB7CisgICAgICAgIFJldkNvbW1pdCByID0gbmV4dDsKKyAgICAgICAgbmV4dCA9IG5leHRVbmNoZWNrZWQoKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBSZXZDb21taXQgbmV4dFVuY2hlY2tlZCgpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5leHQoKTsKKyAgICB9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXZXYWxrRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJldldhbGtFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJldldhbGtFeGNlcHRpb24oZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGF0aFNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYXRoU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjgyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGF0aFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlRyZWVTb3lEYXRhLnJlc29sdmVUYXJnZXRVcmw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX1RSRUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkxhcmdlT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdExvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldk9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZS5TdWJtb2R1bGVXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgYW4gSFRNTCBwYWdlIHdpdGggZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoIHdpdGhpbiBhIHRyZWUuICovCisvLyBUT0RPKGRib3Jvd2l0eik6IEhhbmRsZSBub24tVVRGLTggbmFtZXMuCitwdWJsaWMgY2xhc3MgUGF0aFNlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYXRoU2VydmxldC5jbGFzcyk7CisKKyAgLyoqCisgICAqIFN1Ym1vZHVsZSBVUkxzIHdoZXJlIHdlIGtub3cgdGhlcmUgaXMgYSB3ZWIgcGFnZSBpZiB0aGUgdXNlciB2aXNpdHMgdGhlCisgICAqIHJlcG9zaXRvcnkgVVJMIHZlcmJhdGltIGluIGEgd2ViIGJyb3dzZXIuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFZFUkJBVElNX1NVQk1PRFVMRV9VUkxfUEFUVEVSTiA9CisgICAgICBQYXR0ZXJuLmNvbXBpbGUoIl4oIiArIEpvaW5lci5vbignfCcpLmpvaW4oCisgICAgICAgICAgImh0dHBzPzovL1teLl0rLmdvb2dsZXNvdXJjZS5jb20vLioiLAorICAgICAgICAgICJodHRwcz86Ly9bXi5dKy5nb29nbGVjb2RlLmNvbS8uKiIsCisgICAgICAgICAgImh0dHBzPzovL2NvZGUuZ29vZ2xlLmNvbS9wLy4qIiwKKyAgICAgICAgICAiaHR0cHM/Oi8vZ2l0aHViLmNvbS8uKiIpICsgIikkIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKKworICBzdGF0aWMgZW51bSBGaWxlVHlwZSB7CisgICAgVFJFRShGaWxlTW9kZS5UUkVFKSwKKyAgICBTWU1MSU5LKEZpbGVNb2RlLlNZTUxJTkspLAorICAgIFJFR1VMQVJfRklMRShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpLAorICAgIEVYRUNVVEFCTEVfRklMRShGaWxlTW9kZS5FWEVDVVRBQkxFX0ZJTEUpLAorICAgIEdJVExJTksoRmlsZU1vZGUuR0lUTElOSyk7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVNb2RlIG1vZGU7CisKKyAgICBwcml2YXRlIEZpbGVUeXBlKEZpbGVNb2RlIG1vZGUpIHsKKyAgICAgIHRoaXMubW9kZSA9IG1vZGU7CisgICAgfQorCisgICAgc3RhdGljIEZpbGVUeXBlIGZvckVudHJ5KFRyZWVXYWxrIHR3KSB7CisgICAgICBpbnQgbW9kZSA9IHR3LmdldFJhd01vZGUoMCk7CisgICAgICBmb3IgKEZpbGVUeXBlIHR5cGUgOiB2YWx1ZXMoKSkgeworICAgICAgICBpZiAodHlwZS5tb2RlLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUGF0aFNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIFJlcG9zaXRvcnkgcmVwbyA9IFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSk7CisKKyAgICBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgdHJ5IHsKKyAgICAgIFJldk9iamVjdCBvYmogPSBydy5wZWVsKHJ3LnBhcnNlQW55KHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKSk7CisgICAgICBSZXZUcmVlIHJvb3Q7CisKKyAgICAgIHN3aXRjaCAob2JqLmdldFR5cGUoKSkgeworICAgICAgICBjYXNlIE9CSl9DT01NSVQ6CisgICAgICAgICAgcm9vdCA9ICgoUmV2Q29tbWl0KSBvYmopLmdldFRyZWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPQkpfVFJFRToKKyAgICAgICAgICByb290ID0gKFJldlRyZWUpIG9iajsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBUcmVlV2FsayB0dzsKKyAgICAgIEZpbGVUeXBlIHR5cGU7CisgICAgICBTdHJpbmcgcGF0aCA9IHZpZXcuZ2V0VHJlZVBhdGgoKTsKKyAgICAgIGlmIChwYXRoLmlzRW1wdHkoKSkgeworICAgICAgICB0dyA9IG5ldyBUcmVlV2Fsayhydy5nZXRPYmplY3RSZWFkZXIoKSk7CisgICAgICAgIHR3LmFkZFRyZWUocm9vdCk7CisgICAgICAgIHR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CisgICAgICAgIHR5cGUgPSBGaWxlVHlwZS5UUkVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHcgPSBUcmVlV2Fsay5mb3JQYXRoKHJ3LmdldE9iamVjdFJlYWRlcigpLCBwYXRoLCByb290KTsKKyAgICAgICAgaWYgKHR3ID09IG51bGwpIHsKKyAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHR5cGUgPSBGaWxlVHlwZS5mb3JFbnRyeSh0dyk7CisgICAgICAgIGlmICh0eXBlID09IEZpbGVUeXBlLlRSRUUpIHsKKyAgICAgICAgICB0dy5lbnRlclN1YnRyZWUoKTsKKyAgICAgICAgICB0dy5zZXRSZWN1cnNpdmUoZmFsc2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFRSRUU6CisgICAgICAgICAgc2hvd1RyZWUocmVxLCByZXMsIHJ3LCB0dywgb2JqKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTWU1MSU5LOgorICAgICAgICAgIHNob3dTeW1saW5rKHJlcSwgcmVzLCBydywgdHcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR1VMQVJfRklMRToKKyAgICAgICAgY2FzZSBFWEVDVVRBQkxFX0ZJTEU6CisgICAgICAgICAgc2hvd0ZpbGUocmVxLCByZXMsIHJ3LCB0dyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0lUTElOSzoKKyAgICAgICAgICBzaG93R2l0bGluayhyZXEsIHJlcywgcncsIHR3LCByb290KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBsb2cuZXJyb3IoIkJhZCBmaWxlIHR5cGU6ICVzIiwgdHlwZSk7CisgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKExhcmdlT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcy5zZXRTdGF0dXMoU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcncucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzaG93VHJlZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgUmV2V2FsayBydywgVHJlZVdhbGsgdHcsCisgICAgICBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgLy8gVE9ETyhzb3ApOiBBbGxvdyBjYWNoaW5nIHRyZWVzIGJ5IFNIQS0xIHdoZW4gbm8gUyBjb29raWUgaXMgc2VudC4KKyAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnBhdGhEZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJ0aXRsZSIsICF2aWV3LmdldFRyZWVQYXRoKCkuaXNFbXB0eSgpID8gdmlldy5nZXRUcmVlUGF0aCgpIDogIi8iLAorICAgICAgICAidHlwZSIsIEZpbGVUeXBlLlRSRUUudG9TdHJpbmcoKSwKKyAgICAgICAgImRhdGEiLCBuZXcgVHJlZVNveURhdGEocncsIHZpZXcpLnRvU295RGF0YShpZCwgdHcpKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2hvd0ZpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFJldldhbGsgcncsIFRyZWVXYWxrIHR3KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgLy8gVE9ETyhzb3ApOiBBbGxvdyBjYWNoaW5nIGZpbGVzIGJ5IFNIQS0xIHdoZW4gbm8gUyBjb29raWUgaXMgc2VudC4KKyAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnBhdGhEZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJ0aXRsZSIsIFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpLmdldFRyZWVQYXRoKCksCisgICAgICAgICJ0eXBlIiwgRmlsZVR5cGUuZm9yRW50cnkodHcpLnRvU3RyaW5nKCksCisgICAgICAgICJkYXRhIiwgbmV3IEJsb2JTb3lEYXRhKHJ3LCB2aWV3KS50b1NveURhdGEodHcuZ2V0UGF0aFN0cmluZygpLCB0dy5nZXRPYmplY3RJZCgwKSkpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzaG93U3ltbGluayhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgUmV2V2FsayBydywKKyAgICAgIFRyZWVXYWxrIHR3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBPYmplY3RJZCBpZCA9IHR3LmdldE9iamVjdElkKDApOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgICAgT2JqZWN0TG9hZGVyIGxvYWRlciA9IHJ3LmdldE9iamVjdFJlYWRlcigpLm9wZW4oaWQsIE9CSl9CTE9CKTsKKyAgICBTdHJpbmcgdGFyZ2V0OworICAgIHRyeSB7CisgICAgICB0YXJnZXQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoVHJlZVNveURhdGEuTUFYX1NZTUxJTktfU0laRSkpOworICAgIH0gY2F0Y2ggKExhcmdlT2JqZWN0RXhjZXB0aW9uLk91dE9mTWVtb3J5IGUpIHsKKyAgICAgIHRocm93IGU7CisgICAgfSBjYXRjaCAoTGFyZ2VPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgZGF0YS5wdXQoInNoYSIsIE9iamVjdElkLnRvU3RyaW5nKGlkKSk7CisgICAgICBkYXRhLnB1dCgiZGF0YSIsIG51bGwpOworICAgICAgZGF0YS5wdXQoInNpemUiLCBMb25nLnRvU3RyaW5nKGxvYWRlci5nZXRTaXplKCkpKTsKKyAgICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucGF0aERldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAidGl0bGUiLCBWaWV3RmlsdGVyLmdldFZpZXcocmVxKS5nZXRUcmVlUGF0aCgpLAorICAgICAgICAgICJ0eXBlIiwgRmlsZVR5cGUuUkVHVUxBUl9GSUxFLnRvU3RyaW5nKCksCisgICAgICAgICAgImRhdGEiLCBkYXRhKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIHVybCA9IHJlc29sdmVUYXJnZXRVcmwoCisgICAgICAgIEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgICAuc2V0VHJlZVBhdGgoZGlybmFtZSh2aWV3LmdldFRyZWVQYXRoKCkpKQorICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgIHRhcmdldCk7CisgICAgZGF0YS5wdXQoInRpdGxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBkYXRhLnB1dCgidGFyZ2V0IiwgdGFyZ2V0KTsKKyAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgIGRhdGEucHV0KCJ0YXJnZXRVcmwiLCB1cmwpOworICAgIH0KKworICAgIC8vIFRPRE8oc29wKTogQWxsb3cgY2FjaGluZyBmaWxlcyBieSBTSEEtMSB3aGVuIG5vIFMgY29va2llIGlzIHNlbnQuCisgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5wYXRoRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAidGl0bGUiLCBWaWV3RmlsdGVyLmdldFZpZXcocmVxKS5nZXRUcmVlUGF0aCgpLAorICAgICAgICAidHlwZSIsIEZpbGVUeXBlLlNZTUxJTksudG9TdHJpbmcoKSwKKyAgICAgICAgImRhdGEiLCBkYXRhKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlybmFtZShTdHJpbmcgcGF0aCkgeworICAgIHdoaWxlIChwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCgpIC0gMSkgPT0gJy8nKSB7CisgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOworICAgIH0KKyAgICBpbnQgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgIGlmIChsYXN0U2xhc2ggPiAwKSB7CisgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoIC0gMSk7CisgICAgfSBlbHNlIGlmIChsYXN0U2xhc2ggPT0gMCkgeworICAgICAgcmV0dXJuICIvIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIuIjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2hvd0dpdGxpbmsoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFJldldhbGsgcncsCisgICAgICBUcmVlV2FsayB0dywgUmV2VHJlZSByb290KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBTdWJtb2R1bGVXYWxrIHN3ID0gU3VibW9kdWxlV2Fsay5mb3JQYXRoKFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSksIHJvb3QsCisgICAgICAgIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICBTdHJpbmcgcmVtb3RlVXJsOworICAgIHRyeSB7CisgICAgICByZW1vdGVVcmwgPSBzdy5nZXRSZW1vdGVVcmwoKTsKKyAgICB9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc3cucmVsZWFzZSgpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGRhdGEucHV0KCJzaGEiLCBPYmplY3RJZC50b1N0cmluZyh0dy5nZXRPYmplY3RJZCgwKSkpOworICAgIGRhdGEucHV0KCJyZW1vdGVVcmwiLCByZW1vdGVVcmwpOworCisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IEd1ZXNzIHdoZW4gd2UgY2FuIHB1dCBjb21taXQgU0hBcyBpbiB0aGUgVVJMLgorICAgICAgU3RyaW5nIGh0dHBVcmwgPSByZXNvbHZlSHR0cFVybChyZW1vdGVVcmwpOworICAgICAgaWYgKGh0dHBVcmwgIT0gbnVsbCkgeworICAgICAgICBkYXRhLnB1dCgiaHR0cFVybCIsIGh0dHBVcmwpOworICAgICAgfQorCisgICAgICAvLyBUT0RPKHNvcCk6IEFsbG93IGNhY2hpbmcgbGlua3MgYnkgU0hBLTEgd2hlbiBubyBTIGNvb2tpZSBpcyBzZW50LgorICAgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5wYXRoRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJ0aXRsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSwKKyAgICAgICAgICAidHlwZSIsIEZpbGVUeXBlLkdJVExJTksudG9TdHJpbmcoKSwKKyAgICAgICAgICAiZGF0YSIsIGRhdGEpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXNvbHZlSHR0cFVybChTdHJpbmcgcmVtb3RlVXJsKSB7CisgICAgcmV0dXJuIFZFUkJBVElNX1NVQk1PRFVMRV9VUkxfUEFUVEVSTi5tYXRjaGVyKHJlbW90ZVVybCkubWF0Y2hlcygpID8gcmVtb3RlVXJsIDogbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlbmRlcmVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmNlNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LnRvZnUuU295VG9mdTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogUmVuZGVyZXIgZm9yIFNveSB0ZW1wbGF0ZXMgdXNlZCBieSBHaXRpbGVzLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbmRlcmVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFNPWV9GSUxFTkFNRVMgPSBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgIkNvbW1vbi5zb3kiLAorICAgICAgIkRpZmZEZXRhaWwuc295IiwKKyAgICAgICJIb3N0SW5kZXguc295IiwKKyAgICAgICJMb2dEZXRhaWwuc295IiwKKyAgICAgICJPYmplY3REZXRhaWwuc295IiwKKyAgICAgICJQYXRoRGV0YWlsLnNveSIsCisgICAgICAiUmV2aXNpb25EZXRhaWwuc295IiwKKyAgICAgICJSZXBvc2l0b3J5SW5kZXguc295Iik7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IFNUQVRJQ19VUkxfR0xPQkFMUyA9IEltbXV0YWJsZU1hcC5vZigKKyAgICAgICJnaXRpbGVzLkNTU19VUkwiLCAiZ2l0aWxlcy5jc3MiLAorICAgICAgImdpdGlsZXMuUFJFVFRJRllfQ1NTX1VSTCIsICJwcmV0dGlmeS9wcmV0dGlmeS5jc3MiLAorICAgICAgImdpdGlsZXMuUFJFVFRJRllfSlNfVVJMIiwgInByZXR0aWZ5L3ByZXR0aWZ5LmpzIik7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkwgdG9GaWxlVVJMKFN0cmluZyBmaWxlbmFtZSkgeworICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlbmFtZSkudG9VUkkoKS50b1VSTCgpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBJbW11dGFibGVMaXN0PFVSTD4gdGVtcGxhdGVzOworICBwcm90ZWN0ZWQgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBnbG9iYWxzOworCisgIHByb3RlY3RlZCBSZW5kZXJlcihGdW5jdGlvbjxTdHJpbmcsIFVSTD4gcmVzb3VyY2VNYXBwZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2xvYmFscywKKyAgICAgIFN0cmluZyBzdGF0aWNQcmVmaXgsIFVSTCBjdXN0b21UZW1wbGF0ZXMpIHsKKyAgICBjaGVja05vdE51bGwoc3RhdGljUHJlZml4LCAic3RhdGljUHJlZml4Iik7CisgICAgTGlzdDxVUkw+IGFsbFRlbXBsYXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShTT1lfRklMRU5BTUVTLnNpemUoKSArIDEpOworICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogU09ZX0ZJTEVOQU1FUykgeworICAgICAgYWxsVGVtcGxhdGVzLmFkZChyZXNvdXJjZU1hcHBlci5hcHBseShmaWxlbmFtZSkpOworICAgIH0KKyAgICBpZiAoY3VzdG9tVGVtcGxhdGVzICE9IG51bGwpIHsKKyAgICAgIGFsbFRlbXBsYXRlcy5hZGQoY3VzdG9tVGVtcGxhdGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgYWxsVGVtcGxhdGVzLmFkZChyZXNvdXJjZU1hcHBlci5hcHBseSgiRGVmYXVsdEN1c3RvbVRlbXBsYXRlcy5zb3kiKSk7CisgICAgfQorICAgIHRlbXBsYXRlcyA9IEltbXV0YWJsZUxpc3QuY29weU9mKGFsbFRlbXBsYXRlcyk7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbEdsb2JhbHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IFNUQVRJQ19VUkxfR0xPQkFMUy5lbnRyeVNldCgpKSB7CisgICAgICBhbGxHbG9iYWxzLnB1dChlLmdldEtleSgpLCBzdGF0aWNQcmVmaXggKyBlLmdldFZhbHVlKCkpOworICAgIH0KKyAgICBhbGxHbG9iYWxzLnB1dEFsbChnbG9iYWxzKTsKKyAgICB0aGlzLmdsb2JhbHMgPSBJbW11dGFibGVNYXAuY29weU9mKGFsbEdsb2JhbHMpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVuZGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlbmRlcihyZXMsIHRlbXBsYXRlTmFtZSwgSW1tdXRhYmxlTWFwLjxTdHJpbmcsIE9iamVjdD4gb2YoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZW5kZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIE1hcDxTdHJpbmcsID8+IHNveURhdGEpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOworICAgIGJ5dGVbXSBkYXRhID0gbmV3UmVuZGVyZXIodGVtcGxhdGVOYW1lKS5zZXREYXRhKHNveURhdGEpLnJlbmRlcigpLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgICByZXMuc2V0Q29udGVudExlbmd0aChkYXRhLmxlbmd0aCk7CisgICAgcmVzLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKGRhdGEpOworICB9CisKKyAgU295VG9mdS5SZW5kZXJlciBuZXdSZW5kZXJlcihTdHJpbmcgdGVtcGxhdGVOYW1lKSB7CisgICAgcmV0dXJuIGdldFRvZnUoKS5uZXdSZW5kZXJlcih0ZW1wbGF0ZU5hbWUpOworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IFNveVRvZnUgZ2V0VG9mdSgpOworfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlEZXNjcmlwdGlvbi5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZWU0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeURlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKiogRGVzY3JpYmVzIGEgcmVwb3NpdG9yeSBpbiB0aGUge0BsaW5rIEhvc3RJbmRleFNlcnZsZXR9IEpTT04gb3V0cHV0LiAqLworcHVibGljIGNsYXNzIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiB7CisgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgcHVibGljIFN0cmluZyBjbG9uZVVybDsKKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnJhbmNoZXM7Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjUwNjhhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIHRoZSBpbmRleCBwYWdlIGZvciBhIHJlcG9zaXRvcnksIGlmIGFjY2Vzc2VkIGRpcmVjdGx5IGJ5IGEgYnJvd3Nlci4gKi8KK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5OworCisgIHB1YmxpYyBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeSkgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgICB0aGlzLmFjY2Vzc0ZhY3RvcnkgPSBjaGVja05vdE51bGwoYWNjZXNzRmFjdG9yeSwgImFjY2Vzc0ZhY3RvcnkiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnJlcG9zaXRvcnlJbmRleCIsIGJ1aWxkRGF0YShyZXEpKTsKKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBNYXA8U3RyaW5nLCA/PiBidWlsZERhdGEoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZGVzYyA9IGFjY2Vzc0ZhY3RvcnkuZm9yUmVxdWVzdChyZXEpLmdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpOworICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJjbG9uZVVybCIsIGRlc2MuY2xvbmVVcmwsCisgICAgICAgICJkZXNjcmlwdGlvbiIsIFN0cmluZ3MubnVsbFRvRW1wdHkoZGVzYy5kZXNjcmlwdGlvbiksCisgICAgICAgICJicmFuY2hlcyIsIGdldFJlZnMocmVxLCBDb25zdGFudHMuUl9IRUFEUyksCisgICAgICAgICJ0YWdzIiwgZ2V0UmVmcyhyZXEsIENvbnN0YW50cy5SX1RBR1MpKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBnZXRSZWZzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFN0cmluZyBwcmVmaXgpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlZkRhdGFiYXNlIHJlZmRiID0gU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKS5nZXRSZWZEYXRhYmFzZSgpOworICAgIFN0cmluZyByZXBvTmFtZSA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpLmdldFJlcG9zaXRvcnlOYW1lKCk7CisgICAgQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSBSZWZDb21wYXJhdG9yLnNvcnQocmVmZGIuZ2V0UmVmcyhwcmVmaXgpLnZhbHVlcygpKTsKKyAgICBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyZWZzLnNpemUoKSk7CisKKyAgICBmb3IgKFJlZiByZWYgOiByZWZzKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IHJlZi5nZXROYW1lKCkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7CisgICAgICBib29sZWFuIG5lZWRQcmVmaXggPSAhcmVmLmdldE5hbWUoKS5lcXVhbHMocmVmZGIuZ2V0UmVmKG5hbWUpLmdldE5hbWUoKSk7CisgICAgICByZXN1bHQuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAidXJsIiwgR2l0aWxlc1ZpZXcubG9nKCkuY29weUZyb20ocmVxKS5zZXRSZXZpc2lvbigKKyAgICAgICAgICAgICAgUmV2aXNpb24udW5wZWVsZWQobmVlZFByZWZpeCA/IHJlZi5nZXROYW1lKCkgOiBuYW1lLCByZWYuZ2V0T2JqZWN0SWQoKSkpLnRvVXJsKCksCisgICAgICAgICAgIm5hbWUiLCBuYW1lKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTc3OGUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JBRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9UQUc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldk9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogT2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgcmV2aXNpb24gYXMgc2VlbiBieSBHaXRpbGVzLgorICogPHA+CisgKiBBIHNpbmdsZSByZXZpc2lvbiBjb25zaXN0cyBvZiBhIG5hbWUsIGFuIElELCBhbmQgYSB0eXBlLiBOYW1lIHBhcnNpbmcgaXMgZG9uZQorICogb25jZSBwZXIgcmVxdWVzdCBieSB7QGxpbmsgUmV2aXNpb25QYXJzZXJ9LgorICovCitwdWJsaWMgY2xhc3MgUmV2aXNpb24geworICAvKiogU2VudGluZWwgaW5kaWNhdGluZyBhIG1pc3Npbmcgb3IgZW1wdHkgcmV2aXNpb24uICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2aXNpb24gTlVMTCA9IHBlZWxlZCgiIiwgT2JqZWN0SWQuemVyb0lkKCksIE9CSl9CQUQpOworCisgIC8qKiBDb21tb24gZGVmYXVsdCBicmFuY2ggZ2l2ZW4gdG8gY2xpZW50cy4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZpc2lvbiBIRUFEID0gbmFtZWQoIkhFQUQiKTsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICBwcml2YXRlIGZpbmFsIE9iamVjdElkIGlkOworICBwcml2YXRlIGZpbmFsIGludCB0eXBlOworICBwcml2YXRlIGZpbmFsIE9iamVjdElkIHBlZWxlZElkOworICBwcml2YXRlIGZpbmFsIGludCBwZWVsZWRUeXBlOworCisgIHB1YmxpYyBzdGF0aWMgUmV2aXNpb24gcGVlbGVkKFN0cmluZyBuYW1lLCBSZXZPYmplY3Qgb2JqKSB7CisgICAgcmV0dXJuIHBlZWxlZChuYW1lLCBvYmosIG9iai5nZXRUeXBlKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXZpc2lvbiB1bnBlZWxlZChTdHJpbmcgbmFtZSwgT2JqZWN0SWQgaWQpIHsKKyAgICByZXR1cm4gcGVlbGVkKG5hbWUsIGlkLCBPQkpfQkFEKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUmV2aXNpb24gbmFtZWQoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gcGVlbGVkKG5hbWUsIG51bGwsIE9CSl9CQUQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXZpc2lvbiBwZWVsKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCwgUmV2V2FsayB3YWxrKQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXZPYmplY3Qgb2JqID0gd2Fsay5wYXJzZUFueShpZCk7CisgICAgUmV2T2JqZWN0IHBlZWxlZCA9IHdhbGsucGVlbChvYmopOworICAgIHJldHVybiBuZXcgUmV2aXNpb24obmFtZSwgb2JqLCBvYmouZ2V0VHlwZSgpLCBwZWVsZWQsIHBlZWxlZC5nZXRUeXBlKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmV2aXNpb24gcGVlbGVkKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCwgaW50IHR5cGUpIHsKKyAgICBjaGVja0FyZ3VtZW50KHR5cGUgIT0gT0JKX1RBRywgImV4cGVjdGVkIG5vbi10YWcgZm9yICVzLyVzIiwgbmFtZSwgaWQpOworICAgIHJldHVybiBuZXcgUmV2aXNpb24obmFtZSwgaWQsIHR5cGUsIGlkLCB0eXBlKTsKKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBSZXZpc2lvbihTdHJpbmcgbmFtZSwgT2JqZWN0SWQgaWQsIGludCB0eXBlLCBPYmplY3RJZCBwZWVsZWRJZCwgaW50IHBlZWxlZFR5cGUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuaWQgPSBpZDsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMucGVlbGVkSWQgPSBwZWVsZWRJZDsKKyAgICB0aGlzLnBlZWxlZFR5cGUgPSBwZWVsZWRUeXBlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgIHJldHVybiB0eXBlOworICB9CisKKyAgcHVibGljIE9iamVjdElkIGdldElkKCkgeworICAgIHJldHVybiBpZDsKKyAgfQorCisgIHB1YmxpYyBPYmplY3RJZCBnZXRQZWVsZWRJZCgpIHsKKyAgICByZXR1cm4gcGVlbGVkSWQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldFBlZWxlZFR5cGUoKSB7CisgICAgcmV0dXJuIHBlZWxlZFR5cGU7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBuYW1lSXNJZCgpIHsKKyAgICByZXR1cm4gQWJicmV2aWF0ZWRPYmplY3RJZC5pc0lkKG5hbWUpCisgICAgICAgICYmIChBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcobmFtZSkucHJlZml4Q29tcGFyZShpZCkgPT0gMCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXZpc2lvbikgeworICAgICAgUmV2aXNpb24gciA9IChSZXZpc2lvbikgbzsKKyAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKG5hbWUsIHIubmFtZSkKKyAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKGlkLCByLmlkKQorICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwodHlwZSwgci50eXBlKQorICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwocGVlbGVkSWQsIHIucGVlbGVkSWQpCisgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChwZWVsZWRUeXBlLCByLnBlZWxlZFR5cGUpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShuYW1lLCBpZCwgdHlwZSwgcGVlbGVkSWQsIHBlZWxlZFR5cGUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLm9taXROdWxsVmFsdWVzKCkKKyAgICAgICAgLmFkZCgibmFtZSIsIG5hbWUpCisgICAgICAgIC5hZGQoImlkIiwgaWQpCisgICAgICAgIC5hZGQoInR5cGUiLCB0eXBlKQorICAgICAgICAuYWRkKCJwZWVsZWRJZCIsIHBlZWxlZElkKQorICAgICAgICAuYWRkKCJwZWVsZWRUeXBlIiwgcGVlbGVkVHlwZSkKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyTWF0Y2hlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqIE9iamVjdCB0byBwYXJzZSByZXZpc2lvbnMgb3V0IG9mIEdpdGlsZXMgcGF0aHMuICovCitjbGFzcyBSZXZpc2lvblBhcnNlciB7CisgIHN0YXRpYyBmaW5hbCBTcGxpdHRlciBQQVRIX1NQTElUVEVSID0gU3BsaXR0ZXIub24oJy8nKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BsaXR0ZXIgT1BFUkFUT1JfU1BMSVRURVIgPSBTcGxpdHRlci5vbihDaGFyTWF0Y2hlci5hbnlPZigiXn4iKSk7CisKKyAgc3RhdGljIGNsYXNzIFJlc3VsdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvbiByZXZpc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIFJldmlzaW9uIG9sZFJldmlzaW9uOworICAgIHByaXZhdGUgZmluYWwgaW50IHBhdGhTdGFydDsKKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIFJlc3VsdChSZXZpc2lvbiByZXZpc2lvbikgeworICAgICAgdGhpcyhyZXZpc2lvbiwgbnVsbCwgcmV2aXNpb24uZ2V0TmFtZSgpLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBSZXN1bHQoUmV2aXNpb24gcmV2aXNpb24sIFJldmlzaW9uIG9sZFJldmlzaW9uLCBpbnQgcGF0aFN0YXJ0KSB7CisgICAgICB0aGlzLnJldmlzaW9uID0gcmV2aXNpb247CisgICAgICB0aGlzLm9sZFJldmlzaW9uID0gb2xkUmV2aXNpb247CisgICAgICB0aGlzLnBhdGhTdGFydCA9IHBhdGhTdGFydDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmV2aXNpb24gZ2V0UmV2aXNpb24oKSB7CisgICAgICByZXR1cm4gcmV2aXNpb247CisgICAgfQorCisgICAgcHVibGljIFJldmlzaW9uIGdldE9sZFJldmlzaW9uKCkgeworICAgICAgcmV0dXJuIG9sZFJldmlzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXN1bHQpIHsKKyAgICAgICAgUmVzdWx0IHIgPSAoUmVzdWx0KSBvOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbChyZXZpc2lvbiwgci5yZXZpc2lvbikKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwob2xkUmV2aXNpb24sIHIub2xkUmV2aXNpb24pCisgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHBhdGhTdGFydCwgci5wYXRoU3RhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShyZXZpc2lvbiwgb2xkUmV2aXNpb24sIHBhdGhTdGFydCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgICAgLm9taXROdWxsVmFsdWVzKCkKKyAgICAgICAgICAuYWRkKCJyZXZpc2lvbiIsIHJldmlzaW9uKQorICAgICAgICAgIC5hZGQoIm9sZFJldmlzaW9uIiwgb2xkUmV2aXNpb24pCisgICAgICAgICAgLmFkZCgicGF0aFN0YXJ0IiwgcGF0aFN0YXJ0KQorICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KKworICAgIGludCBnZXRQYXRoU3RhcnQoKSB7CisgICAgICByZXR1cm4gcGF0aFN0YXJ0OworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNBY2Nlc3MgYWNjZXNzOworICBwcml2YXRlIGZpbmFsIFZpc2liaWxpdHlDYWNoZSBjYWNoZTsKKworICBSZXZpc2lvblBhcnNlcihSZXBvc2l0b3J5IHJlcG8sIEdpdGlsZXNBY2Nlc3MgYWNjZXNzLCBWaXNpYmlsaXR5Q2FjaGUgY2FjaGUpIHsKKyAgICB0aGlzLnJlcG8gPSBjaGVja05vdE51bGwocmVwbywgInJlcG8iKTsKKyAgICB0aGlzLmFjY2VzcyA9IGNoZWNrTm90TnVsbChhY2Nlc3MsICJhY2Nlc3MiKTsKKyAgICB0aGlzLmNhY2hlID0gY2hlY2tOb3ROdWxsKGNhY2hlLCAiY2FjaGUiKTsKKyAgfQorCisgIFJlc3VsdCBwYXJzZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICB0cnkgeworICAgICAgUmV2aXNpb24gb2xkUmV2aXNpb24gPSBudWxsOworCisgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogUEFUSF9TUExJVFRFUi5zcGxpdChwYXRoKSkgeworICAgICAgICBpZiAocGFydC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gdmFsaWQgcmV2aXNpb24gY29udGFpbnMgZW1wdHkgc2VnbWVudHMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIGIuYXBwZW5kKCcvJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2xkUmV2aXNpb24gPT0gbnVsbCkgeworICAgICAgICAgIGludCBkb3RzID0gcGFydC5pbmRleE9mKCIuLiIpOworICAgICAgICAgIGludCBmaXJzdFBhcmVudCA9IHBhcnQuaW5kZXhPZigiXiEiKTsKKyAgICAgICAgICBpZiAoZG90cyA9PSAwIHx8IGZpcnN0UGFyZW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0gZWxzZSBpZiAoZG90cyA+IDApIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKHBhcnQuc3Vic3RyaW5nKDAsIGRvdHMpKTsKKyAgICAgICAgICAgIFN0cmluZyBvbGROYW1lID0gYi50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUmV2aXNpb24ob2xkTmFtZSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBPYmplY3RJZCBvbGQgPSByZXBvLnJlc29sdmUob2xkTmFtZSk7CisgICAgICAgICAgICAgIGlmIChvbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG9sZFJldmlzaW9uID0gUmV2aXNpb24ucGVlbChvbGROYW1lLCBvbGQsIHdhbGspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydCA9IHBhcnQuc3Vic3RyaW5nKGRvdHMgKyAyKTsKKyAgICAgICAgICAgIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RQYXJlbnQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZmlyc3RQYXJlbnQgIT0gcGFydC5sZW5ndGgoKSAtIDIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiLmFwcGVuZChwYXJ0LnN1YnN0cmluZygwLCBwYXJ0Lmxlbmd0aCgpIC0gMikpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRSZXZpc2lvbihuYW1lKSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdElkIGlkID0gcmVwby5yZXNvbHZlKG5hbWUpOworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXZDb21taXQgYzsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGMgPSB3YWxrLnBhcnNlQ29tbWl0KGlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGEgY29tbWl0LCBeISBpcyBpbnZhbGlkLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMuZ2V0UGFyZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgb2xkUmV2aXNpb24gPSBSZXZpc2lvbi5wZWVsZWQobmFtZSArICJeIiwgYy5nZXRQYXJlbnQoMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgb2xkUmV2aXNpb24gPSBSZXZpc2lvbi5OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKG5hbWUsIGMpLCBvbGRSZXZpc2lvbiwgbmFtZS5sZW5ndGgoKSArIDIpOworICAgICAgICAgICAgcmV0dXJuIGlzVmlzaWJsZSh3YWxrLCByZXN1bHQpID8gcmVzdWx0IDogbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYi5hcHBlbmQocGFydCk7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBiLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICghaXNWYWxpZFJldmlzaW9uKG5hbWUpKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0SWQgaWQgPSByZXBvLnJlc29sdmUobmFtZSk7CisgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgaW50IHBhdGhTdGFydDsKKyAgICAgICAgICBpZiAob2xkUmV2aXNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcGF0aFN0YXJ0ID0gbmFtZS5sZW5ndGgoKTsgLy8gZm9vCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZvby4uYmFyIChmb28gbWF5IGJlIGVtcHR5KQorICAgICAgICAgICAgcGF0aFN0YXJ0ID0gb2xkUmV2aXNpb24uZ2V0TmFtZSgpLmxlbmd0aCgpICsgMiArIG5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgfQorICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWwobmFtZSwgaWQsIHdhbGspLCBvbGRSZXZpc2lvbiwgcGF0aFN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlKHdhbGssIHJlc3VsdCkgPyByZXN1bHQgOiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgd2Fsay5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmV2aXNpb24oU3RyaW5nIHJldmlzaW9uKSB7CisgICAgLy8gRGlzYWxsb3cgc29tZSB1bmNvbW1vbiBidXQgdmFsaWQgcmV2aXNpb24gZXhwcmVzc2lvbnMgdGhhdCBlaXRoZXIgd2UKKyAgICAvLyBkb24ndCBzdXBwb3J0IG9yIHdlIHJlcHJlc2VudCBkaWZmZXJlbnRseSBpbiBvdXIgVVJMcy4KKyAgICByZXR1cm4gcmV2aXNpb24uaW5kZXhPZignOicpIDwgMAorICAgICAgICAmJiByZXZpc2lvbi5pbmRleE9mKCJeeyIpIDwgMAorICAgICAgICAmJiByZXZpc2lvbi5pbmRleE9mKCdAJykgPCAwOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZShSZXZXYWxrIHdhbGssIFJlc3VsdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIG1heWJlUmVmID0gT1BFUkFUT1JfU1BMSVRURVIuc3BsaXQocmVzdWx0LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICBpZiAocmVwby5nZXRSZWYobWF5YmVSZWYpICE9IG51bGwpIHsKKyAgICAgIC8vIE5hbWUgY29udGFpbnMgYSB2aXNpYmxlIHJlZjsgc2tpcCBleHBlbnNpdmUgcmVhY2hhYmlsaXR5IGNoZWNrLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghY2FjaGUuaXNWaXNpYmxlKHJlcG8sIHdhbGssIGFjY2VzcywgcmVzdWx0LmdldFJldmlzaW9uKCkuZ2V0SWQoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpICE9IG51bGwgJiYgcmVzdWx0LmdldE9sZFJldmlzaW9uKCkgIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgcmV0dXJuIGNhY2hlLmlzVmlzaWJsZShyZXBvLCB3YWxrLCBhY2Nlc3MsIHJlc3VsdC5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE3MDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfVEFHOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX1RSRUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5Db21taXRTb3lEYXRhLktleVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyBhbiBIVE1MIHBhZ2Ugd2l0aCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHJlZi4gKi8KK3B1YmxpYyBjbGFzcyBSZXZpc2lvblNlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXZpc2lvblNlcnZsZXQuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgTGlua2lmaWVyIGxpbmtpZmllcjsKKworICBwdWJsaWMgUmV2aXNpb25TZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBMaW5raWZpZXIgbGlua2lmaWVyKSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICAgIHRoaXMubGlua2lmaWVyID0gY2hlY2tOb3ROdWxsKGxpbmtpZmllciwgImxpbmtpZmllciIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpOworCisgICAgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgdHJ5IHsKKyAgICAgIExpc3Q8UmV2T2JqZWN0PiBvYmplY3RzID0gbGlzdE9iamVjdHMod2Fsaywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgICAgTGlzdDxNYXA8U3RyaW5nLCA/Pj4gc295T2JqZWN0cyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShvYmplY3RzLnNpemUoKSk7CisgICAgICBib29sZWFuIGhhc0Jsb2IgPSBmYWxzZTsKKworICAgICAgLy8gVE9ETyhzb3ApOiBBbGxvdyBjYWNoaW5nIGNvbW1pdHMgYnkgU0hBLTEgd2hlbiBubyBTIGNvb2tpZSBpcyBzZW50LgorICAgICAgZm9yIChSZXZPYmplY3Qgb2JqIDogb2JqZWN0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgIHN3aXRjaCAob2JqLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBPQkpfQ09NTUlUOgorICAgICAgICAgICAgICBzb3lPYmplY3RzLmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgICAgICAgICAidHlwZSIsIENvbnN0YW50cy5UWVBFX0NPTU1JVCwKKyAgICAgICAgICAgICAgICAgICJkYXRhIiwgbmV3IENvbW1pdFNveURhdGEobGlua2lmaWVyLCByZXEsIHJlcG8sIHdhbGssIHZpZXcpCisgICAgICAgICAgICAgICAgICAgICAgLnRvU295RGF0YSgoUmV2Q29tbWl0KSBvYmosIEtleVNldC5ERVRBSUxfRElGRl9UUkVFKSkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKX1RSRUU6CisgICAgICAgICAgICAgIHNveU9iamVjdHMuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgQ29uc3RhbnRzLlRZUEVfVFJFRSwKKyAgICAgICAgICAgICAgICAgICJkYXRhIiwgbmV3IFRyZWVTb3lEYXRhKHdhbGssIHZpZXcpLnRvU295RGF0YShvYmopKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpfQkxPQjoKKyAgICAgICAgICAgICAgc295T2JqZWN0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICAgICAgICAgInR5cGUiLCBDb25zdGFudHMuVFlQRV9CTE9CLAorICAgICAgICAgICAgICAgICAgImRhdGEiLCBuZXcgQmxvYlNveURhdGEod2FsaywgdmlldykudG9Tb3lEYXRhKG9iaikpKTsKKyAgICAgICAgICAgICAgaGFzQmxvYiA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpfVEFHOgorICAgICAgICAgICAgICBzb3lPYmplY3RzLmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgICAgICAgICAidHlwZSIsIENvbnN0YW50cy5UWVBFX1RBRywKKyAgICAgICAgICAgICAgICAgICJkYXRhIiwgbmV3IFRhZ1NveURhdGEobGlua2lmaWVyLCByZXEpLnRvU295RGF0YSgoUmV2VGFnKSBvYmopKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgbG9nLndhcm4oIkJhZCBvYmplY3QgdHlwZSBmb3IgJXM6ICVzIiwgT2JqZWN0SWQudG9TdHJpbmcob2JqLmdldElkKCkpLCBvYmouZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBsb2cud2FybigiTWlzc2luZyBvYmplY3QgIiArIE9iamVjdElkLnRvU3RyaW5nKG9iai5nZXRJZCgpKSwgZSk7CisgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLndhcm4oIkluY29ycmVjdCBvYmplY3QgdHlwZSBmb3IgIiArIE9iamVjdElkLnRvU3RyaW5nKG9iai5nZXRJZCgpKSwgZSk7CisgICAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnJldmlzaW9uRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJ0aXRsZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCksCisgICAgICAgICAgIm9iamVjdHMiLCBzb3lPYmplY3RzLAorICAgICAgICAgICJoYXNCbG9iIiwgaGFzQmxvYikpOworICAgIH0gZmluYWxseSB7CisgICAgICB3YWxrLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICAvLyBUT0RPKGRib3Jvd2l0eik6IEV4dHJhY3QgdGhpcy4KKyAgc3RhdGljIExpc3Q8UmV2T2JqZWN0PiBsaXN0T2JqZWN0cyhSZXZXYWxrIHdhbGssIE9iamVjdElkIGlkKQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldk9iamVjdD4gb2JqZWN0cyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhFeHBlY3RlZFNpemUoMSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFJldk9iamVjdCBjdXIgPSB3YWxrLnBhcnNlQW55KGlkKTsKKyAgICAgIG9iamVjdHMuYWRkKGN1cik7CisgICAgICBpZiAoY3VyLmdldFR5cGUoKSA9PSBDb25zdGFudHMuT0JKX1RBRykgeworICAgICAgICBpZCA9ICgoUmV2VGFnKSBjdXIpLmdldE9iamVjdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBvYmplY3RzOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGFnU295RGF0YS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RhZ1NveURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRmMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RhZ1NveURhdGEuamF2YQpAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkdpdERhdGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkdpdERhdGVGb3JtYXR0ZXIuRm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBTb3kgZGF0YSBjb252ZXJ0ZXIgZm9yIGdpdCB0YWdzLiAqLworcHVibGljIGNsYXNzIFRhZ1NveURhdGEgeworICBwcml2YXRlIGZpbmFsIExpbmtpZmllciBsaW5raWZpZXI7CisgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKKyAgcHJpdmF0ZSBmaW5hbCBHaXREYXRlRm9ybWF0dGVyIGRhdGVGb3JtYXR0ZXI7CisKKyAgcHVibGljIFRhZ1NveURhdGEoTGlua2lmaWVyIGxpbmtpZmllciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHRoaXMubGlua2lmaWVyID0gbGlua2lmaWVyOworICAgIHRoaXMucmVxID0gcmVxOworICAgIHRoaXMuZGF0ZUZvcm1hdHRlciA9IG5ldyBHaXREYXRlRm9ybWF0dGVyKEZvcm1hdC5ERUZBVUxUKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShSZXZUYWcgdGFnKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSg0KTsKKyAgICBkYXRhLnB1dCgic2hhIiwgT2JqZWN0SWQudG9TdHJpbmcodGFnKSk7CisgICAgaWYgKHRhZy5nZXRUYWdnZXJJZGVudCgpICE9IG51bGwpIHsKKyAgICAgIGRhdGEucHV0KCJ0YWdnZXIiLCBDb21taXRTb3lEYXRhLnRvU295RGF0YSh0YWcuZ2V0VGFnZ2VySWRlbnQoKSwgZGF0ZUZvcm1hdHRlcikpOworICAgIH0KKyAgICBkYXRhLnB1dCgib2JqZWN0IiwgT2JqZWN0SWQudG9TdHJpbmcodGFnLmdldE9iamVjdCgpKSk7CisgICAgZGF0YS5wdXQoIm1lc3NhZ2UiLCBsaW5raWZpZXIubGlua2lmeShyZXEsIHRhZy5nZXRGdWxsTWVzc2FnZSgpKSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuUmV2aXNpb25QYXJzZXIuUEFUSF9TUExJVFRFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5QYXRoU2VydmxldC5GaWxlVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKiogU295IGRhdGEgY29udmVydGVyIGZvciBnaXQgdHJlZXMuICovCitwdWJsaWMgY2xhc3MgVHJlZVNveURhdGEgeworICAvKioKKyAgICogTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gZGlzcGxheSBmb3IgYSBzeW1saW5rIHRhcmdldC4gVGFyZ2V0cyBsb25nZXIgdGhhbgorICAgKiB0aGlzIGFyZSBhYmJyZXZpYXRlZCBmb3IgZGlzcGxheSBpbiBhIHRyZWUgbGlzdGluZy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1lNTElOS19UQVJHRVRfTEVOR1RIID0gNzI7CisKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGxvYWQgZnJvbSBhIGJsb2IgdGhhdCBjbGFpbXMgdG8gYmUgYSBzeW1saW5rLiBJZgorICAgKiB0aGUgYmxvYiBpcyBsYXJnZXIgdGhhbiB0aGlzIGJ5dGUgbGltaXQgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSBiaW5hcnkKKyAgICogZmlsZSBpbnN0ZWFkIG9mIGFzIGEgc3ltbGluay4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NZTUxJTktfU0laRSA9IDE2IDw8IDEwOworCisgIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVRhcmdldFVybChHaXRpbGVzVmlldyB2aWV3LCBTdHJpbmcgdGFyZ2V0KSB7CisgICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIHNpbXBsaWZ5UGF0aCgpIG5vcm1hbGl6ZXMgImEvLi4vLi4vIiB0byAiYSIsIHNvIG1hbnVhbGx5IGNoZWNrIHdoZXRoZXIKKyAgICAvLyB0aGUgcGF0aCBsZWFkcyBhYm92ZSB0aGUgZ2l0IHJvb3QuCisgICAgaW50IGRlcHRoID0gbmV3IFN0cmluZ1Rva2VuaXplcih2aWV3LmdldFRyZWVQYXRoKCksICIvIikuY291bnRUb2tlbnMoKTsKKyAgICBmb3IgKFN0cmluZyBwYXJ0IDogUEFUSF9TUExJVFRFUi5zcGxpdCh0YXJnZXQpKSB7CisgICAgICBpZiAocGFydC5lcXVhbHMoIi4uIikpIHsKKyAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFwYXJ0LmlzRW1wdHkoKSAmJiAhcGFydC5lcXVhbHMoIi4iKSkgeworICAgICAgICBkZXB0aCsrOworICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBwYXRoID0gRmlsZXMuc2ltcGxpZnlQYXRoKHZpZXcuZ2V0VHJlZVBhdGgoKSArICIvIiArIHRhcmdldCk7CisgICAgcmV0dXJuIEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgLnNldFRyZWVQYXRoKCFwYXRoLmVxdWFscygiLiIpID8gcGF0aCA6ICIiKQorICAgICAgICAudG9VcmwoKTsKKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgU3RyaW5nIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZyB0YXJnZXQpIHsKKyAgICBpZiAodGFyZ2V0Lmxlbmd0aCgpIDw9IE1BWF9TWU1MSU5LX1RBUkdFVF9MRU5HVEgpIHsKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsYXN0U2xhc2ggPSB0YXJnZXQubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogRG9lc24ndCBhYmJyZXZpYXRlIGEgbG9uZyBsYXN0IHBhdGggY29tcG9uZW50LgorICAgICAgcmV0dXJuIGxhc3RTbGFzaCA+PSAwID8gIi4uLiIgKyB0YXJnZXQuc3Vic3RyaW5nKGxhc3RTbGFzaCkgOiB0YXJnZXQ7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHJ3OworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgcHVibGljIFRyZWVTb3lEYXRhKFJldldhbGsgcncsIEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICB0aGlzLnJ3ID0gcnc7CisgICAgdGhpcy52aWV3ID0gdmlldzsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvU295RGF0YShPYmplY3RJZCB0cmVlSWQsIFRyZWVXYWxrIHR3KSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKyAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PE9iamVjdD4gZW50cmllcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgdXJsQnVpbGRlciA9IEdpdGlsZXNWaWV3LnBhdGgoKS5jb3B5RnJvbSh2aWV3KTsKKyAgICB3aGlsZSAodHcubmV4dCgpKSB7CisgICAgICBGaWxlVHlwZSB0eXBlID0gRmlsZVR5cGUuZm9yRW50cnkodHcpOworICAgICAgU3RyaW5nIG5hbWUgPSB0dy5nZXROYW1lU3RyaW5nKCk7CisKKyAgICAgIHN3aXRjaCAodmlldy5nZXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQQVRIOgorICAgICAgICAgIHVybEJ1aWxkZXIuc2V0VHJlZVBhdGgodmlldy5nZXRUcmVlUGF0aCgpICsgIi8iICsgbmFtZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWSVNJT046CisgICAgICAgICAgLy8gR290IGhlcmUgZnJvbSBhIHRhZyBwb2ludGluZyBhdCBhIHRyZWUuCisgICAgICAgICAgdXJsQnVpbGRlci5zZXRUcmVlUGF0aChuYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJDYW5ub3QgcmVuZGVyIFRyZWVTb3lEYXRhIGZyb20gJXMgdmlldyIsIHZpZXcuZ2V0VHlwZSgpKSk7CisgICAgICB9CisKKyAgICAgIFN0cmluZyB1cmwgPSB1cmxCdWlsZGVyLnRvVXJsKCk7CisgICAgICBpZiAodHlwZSA9PSBGaWxlVHlwZS5UUkVFKSB7CisgICAgICAgIG5hbWUgKz0gIi8iOworICAgICAgICB1cmwgKz0gIi8iOworICAgICAgfQorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoNCk7CisgICAgICBlbnRyeS5wdXQoInR5cGUiLCB0eXBlLnRvU3RyaW5nKCkpOworICAgICAgZW50cnkucHV0KCJuYW1lIiwgbmFtZSk7CisgICAgICBlbnRyeS5wdXQoInVybCIsIHVybCk7CisgICAgICBpZiAodHlwZSA9PSBGaWxlVHlwZS5TWU1MSU5LKSB7CisgICAgICAgIFN0cmluZyB0YXJnZXQgPSBuZXcgU3RyaW5nKAorICAgICAgICAgICAgcncuZ2V0T2JqZWN0UmVhZGVyKCkub3Blbih0dy5nZXRPYmplY3RJZCgwKSkuZ2V0Q2FjaGVkQnl0ZXMoKSwKKyAgICAgICAgICAgIENoYXJzZXRzLlVURl84KTsKKyAgICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBNZXJnZSBTaGF3bidzIGNoYW5nZXMgYmVmb3JlIGNvcHlpbmcgdGhlc2UgbWV0aG9kcworICAgICAgICAvLyBpbi4KKyAgICAgICAgZW50cnkucHV0KCJ0YXJnZXROYW1lIiwgZ2V0VGFyZ2V0RGlzcGxheU5hbWUodGFyZ2V0KSk7CisgICAgICAgIFN0cmluZyB0YXJnZXRVcmwgPSByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsIHRhcmdldCk7CisgICAgICAgIGlmICh0YXJnZXRVcmwgIT0gbnVsbCkgeworICAgICAgICAgIGVudHJ5LnB1dCgidGFyZ2V0VXJsIiwgdGFyZ2V0VXJsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZW50cmllcy5hZGQoZW50cnkpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoMyk7CisgICAgZGF0YS5wdXQoInNoYSIsIHRyZWVJZC5uYW1lKCkpOworICAgIGRhdGEucHV0KCJlbnRyaWVzIiwgZW50cmllcyk7CisKKyAgICBpZiAodmlldy5nZXRUeXBlKCkgPT0gR2l0aWxlc1ZpZXcuVHlwZS5QQVRICisgICAgICAgICYmIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRQZWVsZWRUeXBlKCkgPT0gT0JKX0NPTU1JVCkgeworICAgICAgZGF0YS5wdXQoImxvZ1VybCIsIEdpdGlsZXNWaWV3LmxvZygpLmNvcHlGcm9tKHZpZXcpLnRvVXJsKCkpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKE9iamVjdElkIHRyZWVJZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2Fsayhydy5nZXRPYmplY3RSZWFkZXIoKSk7CisgICAgdHcuYWRkVHJlZSh0cmVlSWQpOworICAgIHR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CisgICAgcmV0dXJuIHRvU295RGF0YSh0cmVlSWQsIHR3KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NGIxZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuV3JhcHBlZFJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIEZpbHRlciB0byBwYXJzZSBVUkxzIGFuZCBjb252ZXJ0IHRoZW0gdG8ge0BsaW5rIEdpdGlsZXNWaWV3fXMuICovCitwdWJsaWMgY2xhc3MgVmlld0ZpbHRlciBleHRlbmRzIEFic3RyYWN0SHR0cEZpbHRlciB7CisgIC8vIFRPRE8oZGJvcm93aXR6KTogTWFrZSB0aGlzIHB1YmxpYyBpbiBKR2l0IChvciBpbXBsZW1lbnQgZ2V0UmVnZXhHcm91cAorICAvLyB1cHN0cmVhbSkuCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9HUk9VUFNfQVRUUklCVVRFID0KKyAgICAgICJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuTWV0YVNlcnZsZXQuc2VydmVSZWdleCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfQVRUSVJCVVRFID0gVmlld0ZpbHRlci5jbGFzcy5nZXROYW1lKCkgKyAiL1ZpZXciOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfQVVUTyA9ICIrIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRF9ESUZGID0gIitkaWZmIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRF9MT0cgPSAiK2xvZyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTURfU0hPVyA9ICIrc2hvdyI7CisKKyAgcHVibGljIHN0YXRpYyBHaXRpbGVzVmlldyBnZXRWaWV3KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gKEdpdGlsZXNWaWV3KSByZXEuZ2V0QXR0cmlidXRlKFZJRVdfQVRUSVJCVVRFKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmcgZ2V0UmVnZXhHcm91cChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBpbnQgZ3JvdXBJZCkgeworICAgIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzID0gKFdyYXBwZWRSZXF1ZXN0W10pIHJlcS5nZXRBdHRyaWJ1dGUoUkVHRVhfR1JPVVBTX0FUVFJJQlVURSk7CisgICAgcmV0dXJuIGNoZWNrTm90TnVsbChncm91cHMpW2dyb3VwSWRdLmdldFBhdGhJbmZvKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXRWaWV3KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICByZXEuc2V0QXR0cmlidXRlKFZJRVdfQVRUSVJCVVRFLCB2aWV3KTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmcgdHJpbUxlYWRpbmdTbGFzaChTdHJpbmcgc3RyKSB7CisgICAgY2hlY2tBcmd1bWVudChzdHIuc3RhcnRzV2l0aCgiLyIpLCAiZXhwZWN0ZWQgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYSBzbGFzaDogJXMiLCBzdHIpOworICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzVXJscyB1cmxzOworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFZpc2liaWxpdHlDYWNoZSB2aXNpYmlsaXR5Q2FjaGU7CisKKyAgcHVibGljIFZpZXdGaWx0ZXIoR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3RvcnksIEdpdGlsZXNVcmxzIHVybHMsCisgICAgICBWaXNpYmlsaXR5Q2FjaGUgdmlzaWJpbGl0eUNhY2hlKSB7CisgICAgdGhpcy51cmxzID0gY2hlY2tOb3ROdWxsKHVybHMsICJ1cmxzIik7CisgICAgdGhpcy5hY2Nlc3NGYWN0b3J5ID0gY2hlY2tOb3ROdWxsKGFjY2Vzc0ZhY3RvcnksICJhY2Nlc3NGYWN0b3J5Iik7CisgICAgdGhpcy52aXNpYmlsaXR5Q2FjaGUgPSBjaGVja05vdE51bGwodmlzaWJpbGl0eUNhY2hlLCAidmlzaWJpbGl0eUNhY2hlIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9GaWx0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldy5CdWlsZGVyIHZpZXcgPSBwYXJzZShyZXEpOworICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtcyA9IHJlcS5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICB2aWV3LnNldEhvc3ROYW1lKHVybHMuZ2V0SG9zdE5hbWUocmVxKSkKKyAgICAgICAgLnNldFNlcnZsZXRQYXRoKHJlcS5nZXRDb250ZXh0UGF0aCgpICsgcmVxLmdldFNlcnZsZXRQYXRoKCkpCisgICAgICAgIC5wdXRBbGxQYXJhbXMocGFyYW1zKTsKKyAgICBzZXRWaWV3KHJlcSwgdmlldy5idWlsZCgpKTsKKyAgICB0cnkgeworICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxLCByZXMpOworICAgIH0gZmluYWxseSB7CisgICAgICByZXEucmVtb3ZlQXR0cmlidXRlKFZJRVdfQVRUSVJCVVRFKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEdpdGlsZXNWaWV3LkJ1aWxkZXIgcGFyc2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcmVwb05hbWUgPSB0cmltTGVhZGluZ1NsYXNoKGdldFJlZ2V4R3JvdXAocmVxLCAxKSk7CisgICAgU3RyaW5nIGNvbW1hbmQgPSBnZXRSZWdleEdyb3VwKHJlcSwgMik7CisgICAgU3RyaW5nIHBhdGggPSBnZXRSZWdleEdyb3VwKHJlcSwgMyk7CisKKyAgICAvLyBOb24tcGF0aCBjYXNlcy4KKyAgICBpZiAocmVwb05hbWUuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCk7CisgICAgfSBlbHNlIGlmIChjb21tYW5kLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEdpdGlsZXNWaWV3LnJlcG9zaXRvcnlJbmRleCgpLnNldFJlcG9zaXRvcnlOYW1lKHJlcG9OYW1lKTsKKyAgICB9IGVsc2UgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnVsbDsgLy8gQ29tbWFuZCBidXQgbm8gcGF0aC4KKyAgICB9CisKKyAgICBwYXRoID0gdHJpbUxlYWRpbmdTbGFzaChwYXRoKTsKKyAgICBSZXZpc2lvblBhcnNlciByZXZQYXJzZXIgPSBuZXcgUmV2aXNpb25QYXJzZXIoCisgICAgICAgIFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSksIGFjY2Vzc0ZhY3RvcnkuZm9yUmVxdWVzdChyZXEpLCB2aXNpYmlsaXR5Q2FjaGUpOworICAgIFJldmlzaW9uUGFyc2VyLlJlc3VsdCByZXN1bHQgPSByZXZQYXJzZXIucGFyc2UocGF0aCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHJlc3VsdC5nZXRQYXRoU3RhcnQoKSk7CisKKyAgICBjb21tYW5kID0gZ2V0Q29tbWFuZChjb21tYW5kLCByZXN1bHQsIHBhdGgpOworICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgdmlldzsKKyAgICBpZiAoQ01EX0xPRy5lcXVhbHMoY29tbWFuZCkpIHsKKyAgICAgIHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKS5zZXRUcmVlUGF0aChwYXRoKTsKKyAgICB9IGVsc2UgaWYgKENNRF9TSE9XLmVxdWFscyhjb21tYW5kKSkgeworICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSBHaXRpbGVzVmlldy5yZXZpc2lvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlldyA9IEdpdGlsZXNWaWV3LnBhdGgoKS5zZXRUcmVlUGF0aChwYXRoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENNRF9ESUZGLmVxdWFscyhjb21tYW5kKSkgeworICAgICAgdmlldyA9IEdpdGlsZXNWaWV3LmRpZmYoKS5zZXRUcmVlUGF0aChwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7IC8vIEJhZCBjb21tYW5kLgorICAgIH0KKyAgICBpZiAocmVzdWx0LmdldE9sZFJldmlzaW9uKCkgIT0gbnVsbCkgeyAvLyBNYXkgYmUgTlVMTC4KKyAgICAgIHZpZXcuc2V0T2xkUmV2aXNpb24ocmVzdWx0LmdldE9sZFJldmlzaW9uKCkpOworICAgIH0KKyAgICB2aWV3LnNldFJlcG9zaXRvcnlOYW1lKHJlcG9OYW1lKQorICAgICAgICAuc2V0UmV2aXNpb24ocmVzdWx0LmdldFJldmlzaW9uKCkpOworICAgIHJldHVybiB2aWV3OworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZCwgUmV2aXNpb25QYXJzZXIuUmVzdWx0IHJlc3VsdCwgU3RyaW5nIHBhdGgpIHsKKyAgICAvLyBOb3RlOiBpZiB5b3UgY2hhbmdlIHRoZSBtYXBwaW5nIGZvciArLCBtYWtlIHN1cmUgdG8gY2hhbmdlCisgICAgLy8gR2l0aWxlc1ZpZXcudG9VcmwoKSBjb3JyZXNwb25kaW5nbHkuCisgICAgaWYgKCFDTURfQVVUTy5lcXVhbHMoY29tbWFuZCkpIHsKKyAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0gZWxzZSBpZiAocmVzdWx0LmdldE9sZFJldmlzaW9uKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIENNRF9ESUZGOworICAgIH0KKyAgICBSZXZpc2lvbiByZXYgPSByZXN1bHQuZ2V0UmV2aXNpb24oKTsKKyAgICBpZiAocmV2LmdldFBlZWxlZFR5cGUoKSAhPSBDb25zdGFudHMuT0JKX0NPTU1JVAorICAgICAgICB8fCAhcGF0aC5pc0VtcHR5KCkKKyAgICAgICAgfHwgcmVzdWx0LmdldFJldmlzaW9uKCkubmFtZUlzSWQoKSkgeworICAgICAgcmV0dXJuIENNRF9TSE9XOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ01EX0xPRzsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaXNpYmlsaXR5Q2FjaGUuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaXNpYmlsaXR5Q2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk2OWQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Zpc2liaWxpdHlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMubm90OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMi5maWx0ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlQnVpbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2U29ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKiogQ2FjaGUgb2YgcGVyLXVzZXIgb2JqZWN0IHZpc2liaWxpdHkuICovCitwdWJsaWMgY2xhc3MgVmlzaWJpbGl0eUNhY2hlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5IHsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCB1c2VyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0SWQgb2JqZWN0SWQ7CisKKyAgICBwcml2YXRlIEtleShPYmplY3QgdXNlciwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lLCBPYmplY3RJZCBvYmplY3RJZCkgeworICAgICAgdGhpcy51c2VyID0gY2hlY2tOb3ROdWxsKHVzZXIsICJ1c2VyIik7CisgICAgICB0aGlzLnJlcG9zaXRvcnlOYW1lID0gY2hlY2tOb3ROdWxsKHJlcG9zaXRvcnlOYW1lLCAicmVwb3NpdG9yeU5hbWUiKTsKKyAgICAgIHRoaXMub2JqZWN0SWQgPSBjaGVja05vdE51bGwob2JqZWN0SWQsICJvYmplY3RJZCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBLZXkpIHsKKyAgICAgICAgS2V5IGsgPSAoS2V5KSBvOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbCh1c2VyLCBrLnVzZXIpCisgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHJlcG9zaXRvcnlOYW1lLCBrLnJlcG9zaXRvcnlOYW1lKQorICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChvYmplY3RJZCwgay5vYmplY3RJZCk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKHVzZXIsIHJlcG9zaXRvcnlOYW1lLCBvYmplY3RJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoInVzZXIiLCB1c2VyKQorICAgICAgICAuYWRkKCJyZXBvc2l0b3J5TmFtZSIsIHJlcG9zaXRvcnlOYW1lKQorICAgICAgICAuYWRkKCJvYmplY3RJZCIsIG9iamVjdElkKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIENhY2hlPEtleSwgQm9vbGVhbj4gY2FjaGU7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB0b3BvU29ydDsKKworICBwdWJsaWMgc3RhdGljIENhY2hlQnVpbGRlcjxPYmplY3QsIE9iamVjdD4gbmV3QnVpbGRlcigpIHsKKyAgICByZXR1cm4gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAubWF4aW11bVNpemUoMSA8PCAxMCkKKyAgICAgICAgLmV4cGlyZUFmdGVyV3JpdGUoMzAsIFRpbWVVbml0Lk1JTlVURVMpOworICB9CisKKyAgcHVibGljIFZpc2liaWxpdHlDYWNoZShib29sZWFuIHRvcG9Tb3J0KSB7CisgICAgdGhpcyh0b3BvU29ydCwgbmV3QnVpbGRlcigpKTsKKyAgfQorCisgIHB1YmxpYyBWaXNpYmlsaXR5Q2FjaGUoYm9vbGVhbiB0b3BvU29ydCwgQ2FjaGVCdWlsZGVyPE9iamVjdCwgT2JqZWN0PiBidWlsZGVyKSB7CisgICAgdGhpcy5jYWNoZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB0aGlzLnRvcG9Tb3J0ID0gdG9wb1NvcnQ7CisgIH0KKworICBwdWJsaWMgQ2FjaGU8PywgQm9vbGVhbj4gZ2V0Q2FjaGUoKSB7CisgICAgcmV0dXJuIGNhY2hlOworICB9CisKKyAgYm9vbGVhbiBpc1Zpc2libGUoZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBSZXZXYWxrIHdhbGssIEdpdGlsZXNBY2Nlc3MgYWNjZXNzLAorICAgICAgZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBjYWNoZS5nZXQoCisgICAgICAgICAgbmV3IEtleShhY2Nlc3MuZ2V0VXNlcktleSgpLCBhY2Nlc3MuZ2V0UmVwb3NpdG9yeU5hbWUoKSwgaWQpLAorICAgICAgICAgIG5ldyBDYWxsYWJsZTxCb29sZWFuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gY2FsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGUocmVwbywgd2FsaywgaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmSW5zdGFuY2VPZihlLmdldENhdXNlKCksIElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNWaXNpYmxlKFJlcG9zaXRvcnkgcmVwbywgUmV2V2FsayB3YWxrLCBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgY29tbWl0OworICAgIHRyeSB7CisgICAgICBjb21taXQgPSB3YWxrLnBhcnNlQ29tbWl0KGlkKTsKKyAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBhbnkgcmVmZXJlbmNlIGRpcmVjdGx5IHBvaW50cyBhdCB0aGUgcmVxdWVzdGVkIG9iamVjdCwgcGVybWl0IGRpc3BsYXkuCisgICAgLy8gQ29tbW9uIGZvciBkaXNwbGF5cyBvZiBwZW5kaW5nIHBhdGNoIHNldHMgaW4gR2Vycml0IENvZGUgUmV2aWV3LCBvcgorICAgIC8vIGJvb2ttYXJrcyB0byB0aGUgY29tbWl0IGEgdGFnIHBvaW50cyBhdC4KKyAgICBDb2xsZWN0aW9uPFJlZj4gYWxsUmVmcyA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisgICAgZm9yIChSZWYgcmVmIDogYWxsUmVmcykgeworICAgICAgcmVmID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKKyAgICAgIGlmIChpZC5lcXVhbHMocmVmLmdldE9iamVjdElkKCkpIHx8IGlkLmVxdWFscyhyZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaGVhZHMgZmlyc3QgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBtb3N0IHJlcXVlc3RzIGFyZSBmb3IgcmVmcworICAgIC8vIGNsb3NlIHRvIGEgaGVhZC4gVGFncyB0ZW5kIHRvIGJlIG11Y2ggZnVydGhlciBiYWNrIGluIGhpc3RvcnkgYW5kIGp1c3QKKyAgICAvLyBjbHV0dGVyIHVwIHRoZSBwcmlvcml0eSBxdWV1ZSBpbiB0aGUgY29tbW9uIGNhc2UuCisgICAgcmV0dXJuIGlzUmVhY2hhYmxlRnJvbSh3YWxrLCBjb21taXQsIGZpbHRlcihhbGxSZWZzLCByZWZTdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkpCisgICAgICAgIHx8IGlzUmVhY2hhYmxlRnJvbSh3YWxrLCBjb21taXQsIGZpbHRlcihhbGxSZWZzLCByZWZTdGFydHNXaXRoKENvbnN0YW50cy5SX1RBR1MpKSkKKyAgICAgICAgfHwgaXNSZWFjaGFibGVGcm9tKHdhbGssIGNvbW1pdCwgZmlsdGVyKGFsbFJlZnMsIG5vdChyZWZTdGFydHNXaXRoKCJyZWZzL2NoYW5nZXMvIikpKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBQcmVkaWNhdGU8UmVmPiByZWZTdGFydHNXaXRoKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKyAgICByZXR1cm4gbmV3IFByZWRpY2F0ZTxSZWY+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShSZWYgcmVmKSB7CisgICAgICAgIHJldHVybiByZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzUmVhY2hhYmxlRnJvbShSZXZXYWxrIHdhbGssIFJldkNvbW1pdCBjb21taXQsIENvbGxlY3Rpb248UmVmPiByZWZzKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3YWxrLnJlc2V0KCk7CisgICAgaWYgKHRvcG9Tb3J0KSB7CisgICAgICB3YWxrLnNvcnQoUmV2U29ydC5UT1BPKTsKKyAgICB9CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0KTsKKyAgICBmb3IgKFJlZiByZWYgOiByZWZzKSB7CisgICAgICBpZiAocmVmLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkgeworICAgICAgICBtYXJrVW5pbnRlcmVzdGluZyh3YWxrLCByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXJrVW5pbnRlcmVzdGluZyh3YWxrLCByZWYuZ2V0T2JqZWN0SWQoKSk7CisgICAgICB9CisgICAgfQorICAgIC8vIElmIHRoZSBjb21taXQgaXMgcmVhY2hhYmxlIGZyb20gYW55IGJyYW5jaCBoZWFkLCBpdCB3aWxsIGFwcGVhciB0byBiZQorICAgIC8vIHVuaW50ZXJlc3RpbmcgdG8gdGhlIFJldldhbGsgYW5kIG5vIG91dHB1dCB3aWxsIGJlIHByb2R1Y2VkLgorICAgIHJldHVybiB3YWxrLm5leHQoKSA9PSBudWxsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhSZXZXYWxrIHdhbGssIE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHRyeSB7CisgICAgICB3YWxrLm1hcmtVbmludGVyZXN0aW5nKHdhbGsucGFyc2VDb21taXQoaWQpKTsKKyAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIERvIG5vdGhpbmcsIGRvZXNuJ3QgYWZmZWN0IHJlYWNoYWJpbGl0eS4KKyAgICB9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIERvIG5vdGhpbmcsIGRvZXNuJ3QgYWZmZWN0IHJlYWNoYWJpbGl0eS4KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9naXRpbGVzLmNzcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9naXRpbGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU3NTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL2dpdGlsZXMuY3NzCkBAIC0wLDAgKzEsMzE5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogQ29tbW9uIHN0eWxlcyBhbmQgZGVmaW5pdGlvbnMuICovCisKK2gxIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDA7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKy5tZW51IHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDA7CisgIHJpZ2h0OiAwOworICBmb250LXNpemU6IDEwcHQ7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICBtYXJnaW4tdG9wOiA1cHg7CisgIG1hcmdpbi1yaWdodDogNXB4OworfQorLm1lbnUgLmVudHJ5IHsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBibGFjazsKKyAgbWFyZ2luLXJpZ2h0OiAwOworfQoraDIgeworICBtYXJnaW4tdG9wOiAzZW07Cit9CisuYnJlYWRjcnVtYnMgeworICBtYXJnaW4tdG9wOiAzZW07CisgIGZvbnQtc2l6ZTogMTUwJTsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworfQordGFibGUubGlzdCB7CisgIG1hcmdpbi10b3A6IDFlbTsKKyAgd2lkdGg6IDkwJTsKK30KK3RhYmxlLmxpc3QgdHIubm8taG92ZXI6aG92ZXIgeworICBiYWNrZ3JvdW5kOiAjZmZmOworfQordGFibGUubGlzdCB0cjpob3Zlciwgb2wubGlzdCBsaTpob3ZlciwgcHJlLnByZXR0eXByaW50IGxpOmhvdmVyIHsKKyAgYmFja2dyb3VuZDogI2VlZTsgLyogSE9WRVJfQkFDS0dST1VORCAqLworfQordGFibGUubGlzdCB0ZCB7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIHBhZGRpbmctdG9wOiAwLjI1ZW07CisgIHBhZGRpbmctYm90dG9tOiAwLjI1ZW07Cit9CisubG9nLWxpbmsgeworICBtYXJnaW4tbGVmdDogMC41ZW0KK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSBob3N0IGluZGV4IHBhZ2UuICovCisKKy5pbnN0cnVjdGlvbnMgeworICB3aWR0aDogNDVlbTsKKyAgbWFyZ2luLWxlZnQ6IDFlbTsKKyAgbWFyZ2luLXJpZ2h0OiAxZW07CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNTU1OworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTsKKyAgY29sb3I6ICM1NTU7Cit9CisuaW5zdHJ1Y3Rpb25zIHByZSB7CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW4tbGVmdDogMWVtOworICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNjA7CisgIHBhZGRpbmctbGVmdDogMWVtOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorLmZvb3RlciB7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICBiYWNrZ3JvdW5kOiAjZWVlOworICBwYWRkaW5nLXJpZ2h0OiAxZW07CisgIHdpZHRoOiA5MCU7Cit9CisuZm9vdGVyIGEgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXNpemU6IDcwJTsKK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSByZXBvc2l0b3J5IGluZGV4IHBhZ2UuICovCisKKy5yZXBvc2l0b3J5LWRlc2NyaXB0aW9uIHsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBwYWRkaW5nLWJvdHRvbTogNXB4OyAvKiBWUEFERElORyAqLworfQorLnJlcG9zaXRvcnktcmVmcyB7CisgIHdpZHRoOiA0NTBweDsKK30KKy5yZXBvc2l0b3J5LWJyYW5jaGVzIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAyMDBweDsKK30KKy5yZXBvc2l0b3J5LXRhZ3MgeworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiAyNTBweDsKK30KKy5jbG9uZS1saW5lIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZWNmOTsgLyogQk9YX0JBQ0tHUk9VTkQgKi8KKyAgYm9yZGVyOiBub25lOworICBtYXJnaW46IDVweCAvKiBWUEFERElORyAqLyAwIDAgMDsKKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworICBmb250LXNpemU6IDlwdDsKK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSBvYmplY3QgZGV0YWlsIHRlbXBsYXRlcy4gKi8KKworLnNoYTEgeworICBjb2xvcjogIzY2NjsKKyAgZm9udC1zaXplOiA5cHQ7Cit9CitkaXYuc2hhMSB7CisgIHBhZGRpbmctdG9wOiA1cHg7IC8qIFZQQURESU5HICovCit9CisKKy5naXQtY29tbWl0LCAuZ2l0LXRhZyB7CisgIGZvbnQtc2l6ZTogOXB0OworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KK30KKy5naXQtY29tbWl0IHRhYmxlLCAuZ2l0LXRhZyB0YWJsZSB7CisgIG1hcmdpbjogMDsKK30KKy5naXQtY29tbWl0IHRhYmxlIHRoLCAuZ2l0LXRhZyB0YWJsZSB0aCB7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorcHJlLmNvbW1pdC1tZXNzYWdlLCBwcmUudGFnLW1lc3NhZ2UgeworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KKyAgY29sb3I6ICMwMDA7CisgIGZvbnQtc2l6ZTogOXB0OworICBtYXJnaW46IDA7Cit9CisKK3VsLmRpZmYtdHJlZSB7CisgIGZvbnQtc2l6ZTogOXB0OworICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworfQordWwuZGlmZi10cmVlIC5hZGQgeworICBjb2xvcjogIzA2MDsKK30KK3VsLmRpZmYtdHJlZSAuZGVsZXRlIHsKKyAgY29sb3I6ICM2MDA7Cit9Cit1bC5kaWZmLXRyZWUgLnJlbmFtZSwgdWwuZGlmZi10cmVlIC5jb3B5IHsKKyAgY29sb3I6ICMwMDY7Cit9CitzcGFuLmRpZmYtbGluaywgdWwuZGlmZi10cmVlIC5hZGQsIHVsLmRpZmYtdHJlZSAubW9kaWZ5LCB1bC5kaWZmLXRyZWUgLmRlbGV0ZSwKKyAgICB1bC5kaWZmLXRyZWUgLnJlbmFtZSwgdWwuZGlmZi10cmVlIC5jb3B5IHsKKyAgbWFyZ2luLWxlZnQ6IDAuNWVtOworfQorLmRpZmYtc3VtbWFyeSB7CisgIGZvbnQtc2l6ZTogOXB0OworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworfQorCitvbC5maWxlcyB7CisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgbWFyZ2luLWxlZnQ6IDFlbTsKKyAgZm9udC1zaXplOiAxMHB0OworICBsaW5lLWhlaWdodDogbm9ybWFsOworfQorCisvKiBUcmVlIGljb25zIGFyZSB0YWtlbiBmcm9tIHRoZSBwdWJsaWMgZG9tYWluIEFwYWNoZSBzdGFuZGFyZCBpY29uczoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pY29ucy8gKi8KK29sLmZpbGVzIGxpLmdpdC10cmVleworICAvKiBzbWFsbC9mb2xkZXIucG5nICovCisgIGxpc3Qtc3R5bGUtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQm1KTFIwUUFBQUFBQUFENVE3dC9BQUFBQ1hCSVdYTUFBQUJJQUFBQVNBQkd5V3MrQUFBQUNYWndRV2NBQUFBUUFBQUFFQUJjeHEzREFBQUEra2xFUVZRNHk2M1RNV3ZDUUJqRzhmOHIrUm91UlNlN09OY2h1Q1RRc1pTNkZOTEJTUXJkaTFQbUZoY25od3BPVWpvSzNpSXZSV2NkblAwcTE2RmNTT1NpamZTWmpodCtQTnk5cjZncUFHRVlXZ0JWRlNwRUFOdHExbmw3VFFDSWs1UThkQTRPQVBabXhIWDBBc0J5T2l3MFdrNkhSSjAyMHZCREFsaDcrTW91SE9RYXVVU2RObWE5SlU3U0FoSWNWOXFia1JjeTY2MzNEUUpLVWdiOUdUaUc1T291ZTU5OGF1Y0FBUE85QStEamMzVVpjQ3IvQS9TZTM3T2FsUUZWbGZsaVE1eWtGMEUxK0oydUt0Q2cvMmpkdWZDTitmbWZMelk4M043d2ROOHRSY2FUbVhqbndBZVZSZHc2bjRwYkxJQldzdzdBZURJVGdCL09USEVmRjNHNm9BQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KK29sLmZpbGVzIGxpLnN5bWxpbmt7CisgIC8qIHNtYWxsL2ZvcndhcmQucG5nICovCisgIGxpc3Qtc3R5bGUtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQW1KTFIwUUFBS3FOSXpJQUFBQUpjRWhaY3dBQUFFZ0FBQUJJQUViSmF6NEFBQUFKZG5CQlp3QUFBQkFBQUFBUUFGekdyY01BQUFDdFNVUkJWQ2pQZlpHeEVZTXdERVdmZk5Uc3dBcGNHcytSWTRLVXREU1pnSWJXSlJOd1dTSG5qaWJIQ3RraEN5aUZEWVlFK0tyay8wL1M5eGRQUXE0ZjRRZlp1dWtwRkM2eUkzanBJejRVZXhQdXlpRk1yc01KRGViSk9jd2J4NVdTTWw0UVRzeVhxVmtCTkZpZzVBYWd3VSsxZFRFQ0k0NDZ1bkJNMmdhN25YSlFWajBlUFBXcHhFQWxIZmJRaGZnbGcwRW54aFZsYVNVSzVxaGcvcFVtMGh0QmtrRlBKYXNWLzBqQmZ3SHNka285a1VDb013QUFBQUJKUlU1RXJrSmdnZz09KTsKK30KK29sLmZpbGVzIGxpLnJlZ3VsYXItZmlsZXsKKyAgLyogc21hbGwvdGV4dC5wbmcgKi8KKyAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFBbUpMUjBRQUFLcU5JeklBQUFBSmNFaFpjd0FBQUVnQUFBQklBRWJKYXo0QUFBQUpkbkJCWndBQUFCQUFBQUFRQUZ6R3JjTUFBQUNEU1VSQlZDalBZenpBZ0I4d29RdWMrWS9LWnp6MzN4Q0plNTVCa21FcGd3a2pIaE1rR0tKUlRNRlFjSjdoT1lNSkkwSUpDd01EQTRNVlhQb1loUDJmZ2NFRVdjRTZKQk9PTVJ4a1pHQllqV3BDRUpJMEE0UDkveGRJR3RCTWVNSEF3Q0RCSUlHdUlJZ0JGUnpEYlFJbW9KY0p4L0NaOElteDkvOTlET0Z6REtGUUZnQmo2eUd3aHRFek93QUFBQUJKUlU1RXJrSmdnZz09KQorfQorb2wuZmlsZXMgbGkuZXhlY3V0YWJsZS1maWxleworICAvKiBzbWFsbC9wYXRjaC5wbmcgKi8KKyAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQUVnQUFBQklBRWJKYXo0QUFBQUpkbkJCWndBQUFCQUFBQUFRQUZ6R3JjTUFBQUNEU1VSQlZDalBsWSt4RFlNd0VFVy9JNGFnWllSUXNnb2prQzRaQXpwMm9qTWp1UFFZandKRWN2Z1NLVit5enJLZW52OUovMmJrOGhENVRDUmprZHZWVUtzM2xnSllsZlVLYnlSRTdnYm9qcmtFdHdPQUpBMTgvVUtDN0hXWWpyTVhMWUJKU1ErbEV5bUFwK3gwREhZNmhrYXpHc2ZnckFud2MwMmJxZzBqcWZTZXR3Mmo3bGNoN1RadmZRQUFBQ1IwUlZoMFkyOXRiV1Z1ZEFCaWVTQk5ZWEowYVc0dVMzSmhaVzFsY2tCTlkyZ3VVMDVKTGtSbGFDUEY2UUFBQUFCSlJVNUVya0pnZ2c9PSk7Cit9CitvbC5maWxlcyBsaS5naXRsaW5reworICAvKiBzbWFsbC9jb250aW51ZWQucG5nICovCisgIGxpc3Qtc3R5bGUtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFBbUpMUjBRQUFLcU5JeklBQUFBSmNFaFpjd0FBQUVnQUFBQklBRWJKYXo0QUFBQUpkbkJCWndBQUFCQUFBQUFRQUZ6R3JjTUFBQUNQU1VSQlZDalB6ZEN4YmNOQUZJUGg3d1F2a1RJakJFamoxaXNjWEdVU1RaREdMalZDS3VGV0NLNUxjL0FLR29VcHBOcTFXZjE4SUI0SWx1NjVKaThTbURPeTJ6bnpRZU9naVRtTFpvUTFWYldHa1dZeGgybWsrdkJkR2g2K1hEelFMTjVVSXljMmQ5dngrQWQvNEJkTnBUdEh6cm1sdTBVY3RGKzcwckhtM1dlQk5WekxYbkp6TGZiQUt5ejVUUC9yZWtHSzVQclpmZ0FBQUFCSlJVNUVya0pnZ2c9PSk7Cit9CisKKworLyogU3R5bGVzIGZvciB0aGUgcGF0aCBkZXRhaWwgcGFnZS4gKi8KKworLnN5bWxpbmstZGV0YWlsLCAuZ2l0bGluay1kZXRhaWwgeworICBtYXJnaW4tbGVmdDogMWVtOworICBjb2xvcjogIzY2NjsKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBmb250LXNpemU6IDEwcHQ7Cit9CisKKworLyogU3R5bGVzIGZvciB0aGUgbG9nIGRldGFpbCBwYWdlLiAqLworCitvbC5zaG9ydGxvZyB7CisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCit9CitvbC5zaG9ydGxvZyBsaSB7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgcGFkZGluZy10b3A6IDJweDsKKyAgcGFkZGluZy1ib3R0b206IDJweDsKK30KK29sLnNob3J0bG9nIGxpLmZpcnN0IHsKKyAgYm9yZGVyLXRvcDogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworfQorb2wuc2hvcnRsb2cgbGk6aG92ZXIgeworICBiYWNrZ3JvdW5kOiAjZWVlOyAvKiBIT1ZFUl9CQUNLR1JPVU5EICovCit9CitvbC5zaG9ydGxvZyAuc2hhMSB7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisubG9nLW5hdiB7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorLmF1dGhvciB7CisgIHBhZGRpbmctbGVmdDogM3B4OworfQorLnRpbWUgeworICBmb250LXNpemU6IDlwdDsgLyogU0hPUlRMT0dfU01BTExfRk9OVF9TSVpFICovCisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5icmFuY2gtbGFiZWwsIC50YWctbGFiZWwgeworICBmb250LXNpemU6IDlwdDsgLyogU0hPUlRMT0dfU01BTExfRk9OVF9TSVpFICovCisgIG1hcmdpbi1sZWZ0OiAzcHg7Cit9CithLmJyYW5jaC1sYWJlbCB7CisgIGNvbG9yOiAjZGQ0YjM5OworfQorYS50YWctbGFiZWwgeworICBjb2xvcjogIzAwOTkzMzsKK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSBkaWZmIGRldGFpbCB0ZW1wbGF0ZS4gKi8KKworLmRpZmYtaGVhZGVyIHsKK30KKy5kaWZmLWdpdCB7CisgIGNvbG9yOiAjNDQ0OworICBmb250LXdlaWdodDogYm9sZDsKK30KK2EuZGlmZi1naXQ6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisuZGlmZi1oZWFkZXIsIC5kaWZmLXVuaWZpZWQgeworICBjb2xvcjogIzAwMDsKKyAgZm9udC1zaXplOiA5cHQ7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZy1sZWZ0OiAyZW07Cit9CisuZGlmZi11bmlmaWVkIHsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworfQorLmRpZmYtdW5pZmllZCAuaCB7CisgIGNvbG9yOiBkYXJrYmx1ZTsKK30KKy5kaWZmLXVuaWZpZWQgLmQgeworICBjb2xvcjogZGFya3JlZDsKK30KKy5kaWZmLXVuaWZpZWQgLmkgeworICBjb2xvcjogZGFya2dyZWVuOworfQorCisKKy8qIE92ZXJyaWRlIHNvbWUgc3R5bGVzIGZyb20gdGhlIGRlZmF1bHQgcHJldHRpZnkuY3NzLiAqLworCisvKiBMaW5lIG51bWJlcnMgb24gYWxsIGxpbmVzLiAqLworbGkuTDAsIGxpLkwxLCBsaS5MMiwgbGkuTDMsIGxpLkw0LCBsaS5MNSwgbGkuTDYsIGxpLkw3LCBsaS5MOCwgbGkuTDkgeworICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Cit9CisKKy8qIERpc2FibGUgYWx0ZXJuYXRpbmcgbGluZSBiYWNrZ3JvdW5kIGNvbG9yLiAqLworbGkuTDAsIGxpLkwxLCBsaS5MMiwgbGkuTDMsIGxpLkw0LCBsaS5MNSwgbGkuTDYsIGxpLkw3LCBsaS5MOCwgbGkuTDkgeworICBiYWNrZ3JvdW5kOiAjZmZmOworfQorCitwcmUuZ2l0LWJsb2IgeworICBib3JkZXItdG9wOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgcGFkZGluZy1sZWZ0OiAxZW07CisgIHBhZGRpbmctYm90dG9tOiA1cHg7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgIGZvbnQtc2l6ZTogOHB0OworfQorcHJlLnByZXR0eXByaW50IG9sIHsKKyAgY29sb3I6IGdyZXk7Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvQ09QWUlORyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTQxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvQ09QWUlORwpAQCAtMCwwICsxLDIxNCBAQAorZ29vZ2xlLWNvZGUtcHJldHRpZnkgZG93bmxvYWRlZCBmcm9tOgoraHR0cDovL2dvb2dsZS1jb2RlLXByZXR0aWZ5Lmdvb2dsZWNvZGUuY29tL2ZpbGVzL3ByZXR0aWZ5LXNtYWxsLTEtSnVuLTIwMTEudGFyLmJ6MgorCitBbGwgZmlsZXMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCB3aXRoIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0czoKK3ByZXR0aWZ5LmpzOiBDb3B5cmlnaHQgKEMpIDIwMDYgR29vZ2xlIEluYy4KK2xhbmctYXBvbGxvLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDkgT25ubyBIb21tZXMuCitsYW5nLWNsai5qczogKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KK2xhbmctY3NzLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KK2xhbmctZ28uanM6IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorbGFuZy1ocy5qczogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCitsYW5nLWxpc3AuanM6IENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgorbGFuZy1sdWEuanM6IENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgorbGFuZy1tbC5qczogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCitsYW5nLW4uanM6IENvcHlyaWdodCAoQykgMjAxMSBaaW1pbiBBLlYuCitsYW5nLXByb3RvLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDYgR29vZ2xlIEluYy4KK2xhbmctc2NhbGEuanM6IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorbGFuZy1zcWwuanM6IENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgorbGFuZy10ZXguanM6IENvcHlyaWdodCAoQykgMjAxMSBNYXJ0aW4gUy4KK2xhbmctdmIuanM6IENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorbGFuZy13aWtpLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KK2xhbmcteHEuanM6IENvcHlyaWdodCAoQykgMjAxMSBQYXRyaWNrIFdpZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQ29weXJpZ2h0IDIwMTEgTWlrZSBTYW11ZWwgZXQgYWwKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWFwb2xsby5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWFwb2xsby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDk4YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctYXBvbGxvLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJjb20iLC9eI1teXG5ccl0qLyxudWxsLCIjIl0sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLG51bGwsJyInXV0sW1sia3dkIiwvXig/OkFEU3xBRHxBVUd8QlpGfEJaTUZ8Q0FFfENBRnxDQXxDQ1N8Q09NfENTfERBU3xEQ0F8RENPTXxEQ1N8RERPVUJMfERJTXxET1VCTEV8RFRDQnxEVENGfERWfERYQ0h8RURSVVBUfEVYVEVORHxJTkNSfElOREVYfE5EWHxJTkhJTlR8TFhDSHxNQVNLfE1TS3xNUHxNU1V8Tk9PUHxPVlNLfFFYQ0h8UkFORHxSRUFEfFJFTElOVHxSRVNVTUV8UkVUVVJOfFJPUnxSWE9SfFNRVUFSRXxTVXxUQ1J8VENBQXxPVlNLfFRDRnxUQ3xUU3xXQU5EfFdPUnxXUklURXxYQ0h8WExRfFhYQUxRfFpMfFpRfEFERHxBRFp8U1VCfFNVWnxNUFl8TVBSfE1QWnxEVlB8Q09NfEFCU3xDTEF8Q0xafExEUXxTVE98U1RRfEFMU3xMTFN8TFJTfFRSQXxUU1F8VE1JfFRPVnxBWFR8VElYfERMWXxJTlB8T1VUKVxzLywKK251bGxdLFsidHlwIiwvXig/Oi0/R0VOQURSfD1NSU5VU3wyQkNBRFJ8Vk58Qk9GfE1NfC0/MkNBRFJ8LT9bMS02XUROQURSfEFEUkVTfEJCQ09OfFtFU10/QkFOSz0/fEJMT0NLfEJOS1NVTXxFP0NBRFJ8Q09VTlRcKj98Mj9ERUNcKj98LT9ETkNIQU58LT9ETlBUUnxFUVVBTFN8RVJBU0V8TUVNT1JZfDI/T0NUfFJFTUFEUnxTRVRMT0N8U1VCUk98T1JHfEJTU3xCRVN8U1lOfEVRVXxERUZJTkV8RU5EKVxzLyxudWxsXSxbImxpdCIsL14nKD86LSooPzpcd3xcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPyk/L10sWyJwbG4iLC9eLSooPzpbIS16XXxcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPy9dLFsicHVuIiwvXlteXHdcdFxuXHIgIictKTtcXFx4YTBdKy9dXSksWyJhcG9sbG8iLCJhZ2MiLCJhZWEiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jbGouanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jbGouanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyYTIyMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNsai5qcwpAQCAtMCwwICsxLDE4IEBACisvKgorIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorCisgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLwordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sib3BuIiwvXlsoW3tdKy8sYSwiKFt7Il0sWyJjbG8iLC9eWylcXX1dKy8sYSwiKV19Il0sWyJjb20iLC9eO1teXG5ccl0qLyxhLCI7Il0sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLGEsIlx0XG5cciBceGEwIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sYSwnIiddXSxbWyJrd2QiLC9eKD86ZGVmfGlmfGRvfGxldHxxdW90ZXx2YXJ8Zm58bG9vcHxyZWN1cnx0aHJvd3x0cnl8bW9uaXRvci1lbnRlcnxtb25pdG9yLWV4aXR8ZGVmbWFjcm98ZGVmbnxkZWZuLXxtYWNyb2V4cGFuZHxtYWNyb2V4cGFuZC0xfGZvcnxkb3NlcXxkb3N5bmN8ZG90aW1lc3xhbmR8b3J8d2hlbnxub3R8YXNzZXJ0fGRvdG98cHJveHl8ZGVmc3RydWN0fGZpcnN0fHJlc3R8Y29uc3xkZWZwcm90b2NvbHxkZWZ0eXBlfGRlZnJlY29yZHxyZWlmeXxkZWZtdWx0aXxkZWZtZXRob2R8bWV0YXx3aXRoLW1ldGF8bnN8aW4tbnN8Y3JlYXRlLW5zfGltcG9ydHxpbnRlcm58cmVmZXJ8YWxpYXN8bmFtZXNwYWNlfHJlc29sdmV8cmVmfGRlcmVmfHJlZnNldHxuZXd8c2V0IXxtZW1mbnx0by1hcnJheXxpbnRvLWFycmF5fGFzZXR8Z2VuLWNsYXNzfHJlZHVjZXxtYXB8ZmlsdGVyfGZpbmR8bmlsP3xlbXB0eT98aGFzaC1tYXB8aGFzaC1zZXR8dmVjfHZlY3RvcnxzZXF8ZmxhdHRlbnxyZXZlcnNlfGFzc29jfGRpc3NvY3xsaXN0fGxpc3Q/fGRpc2p8Z2V0fHVuaW9ufGRpZmZlcmVuY2V8aW50ZXJzZWN0aW9ufGV4dGVuZHxleHRlbmQtdHlwZXxleHRlbmQtcHJvdG9jb2x8cHJuKVxiLyxhXSwKK1sidHlwIiwvXjpbXGRBLVphLXotXSsvXV0pLFsiY2xqIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY3NzLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY3NzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jc3MuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxmXHIgXSsvLG51bGwsIiBcdFxyXG4MIl1dLFtbInN0ciIsL14iKD86W15cblxmXHIiXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSoiLyxudWxsXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSonLyxudWxsXSxbImxhbmctY3NzLXN0ciIsL151cmxcKChbXiInKV0qKVwpL2ldLFsia3dkIiwvXig/OnVybHxyZ2J8IWltcG9ydGFudHxAaW1wb3J0fEBwYWdlfEBtZWRpYXxAY2hhcnNldHxpbmhlcml0KSg/PVteXHctXXwkKS9pLG51bGxdLFsibGFuZy1jc3Mta3ciLC9eKC0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqKVxzKjovaV0sWyJjb20iLC9eXC9cKlteKl0qXCorKD86W14qL11bXipdKlwqKykqXC8vXSxbImNvbSIsCisvXig/OjxcIS0tfC0tXD4pL10sWyJsaXQiLC9eKD86XGQrfFxkKlwuXGQrKSg/OiV8W2Etel0rKT8vaV0sWyJsaXQiLC9eI1tcZGEtZl17Myw2fS9pXSxbInBsbiIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXSxbInB1biIsL15bXlxzXHciJ10rL11dKSxbImNzcyJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbImt3ZCIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXV0pLFsiY3NzLWt3Il0pO1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1sic3RyIiwvXlteIicpXSsvXV0pLFsiY3NzLXN0ciJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWdvLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctZ28uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxOGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWdvLmpzCkBAIC0wLDAgKzEgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInBsbiIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKyg/Oid8JCl8YFteYF0qKD86YHwkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86XC9cL1teXG5ccl0qfFwvXCpbXFNcc10qP1wqXC8pL10sWyJwbG4iLC9eKD86W14iJy9gXXxcLyg/IVsqL10pKSsvXV0pLFsiZ28iXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1ocy5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWhzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzdiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1ocy5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdC1cciBdKy8sbnVsbCwiXHRcbgsMXHIgIl0sWyJzdHIiLC9eIig/OlteXG5cZlxyIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sbnVsbCwnIiddLFsic3RyIiwvXicoPzpbXlxuXGZccidcXF18XFxbXiZdKSc/LyxudWxsLCInIl0sWyJsaXQiLC9eKD86MG9bMC03XSt8MHhbXGRhLWZdK3xcZCsoPzpcLlxkKyk/KD86ZVsrLV0/XGQrKT8pL2ksbnVsbCwiMDEyMzQ1Njc4OSJdXSxbWyJjb20iLC9eKD86LS0rW15cblxmXHJdKnx7LSg/OlteLV18LStbXn0tXSkqLX0pL10sWyJrd2QiLC9eKD86Y2FzZXxjbGFzc3xkYXRhfGRlZmF1bHR8ZGVyaXZpbmd8ZG98ZWxzZXxpZnxpbXBvcnR8aW58aW5maXh8aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bW9kdWxlfG5ld3R5cGV8b2Z8dGhlbnx0eXBlfHdoZXJlfF8pKD89W15cZCdBLVphLXpdfCQpLywKK251bGxdLFsicGxuIiwvXig/OltBLVpdW1x3J10qXC4pKltBLVphLXpdW1x3J10qL10sWyJwdW4iLC9eW15cZFx0LVxyICInQS1aYS16XSsvXV0pLFsiaHMiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1saXNwLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbGlzcC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmEzMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbGlzcC5qcwpAQCAtMCwwICsxLDMgQEAKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbIm9wbiIsL15cKCsvLGEsIigiXSxbImNsbyIsL15cKSsvLGEsIikiXSxbImNvbSIsL147W15cblxyXSovLGEsIjsiXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sYSwiXHRcblxyIFx4YTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxhLCciJ11dLFtbImt3ZCIsL14oPzpibG9ja3xjW2FkXStyfGNhdGNofGNvbltkc118ZGVmKD86aW5lfHVuKXxkb3xlcXxlcWx8ZXF1YWx8ZXF1YWxwfGV2YWwtd2hlbnxmbGV0fGZvcm1hdHxnb3xpZnxsYWJlbHN8bGFtYmRhfGxldHxsb2FkLXRpbWUtdmFsdWV8bG9jYWxseXxtYWNyb2xldHxtdWx0aXBsZS12YWx1ZS1jYWxsfG5pbHxwcm9nbnxwcm9ndnxxdW90ZXxyZXF1aXJlfHJldHVybi1mcm9tfHNldHF8c3ltYm9sLW1hY3JvbGV0fHR8dGFnYm9keXx0aGV8dGhyb3d8dW53aW5kKVxiLyxhXSwKK1sibGl0IiwvXlsrLV0/KD86WyMwXXhbXGRhLWZdK3xcZCtcL1xkK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OltkZV1bKy1dP1xkKyk/KS9pXSxbImxpdCIsL14nKD86LSooPzpcd3xcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPyk/L10sWyJwbG4iLC9eLSooPzpbX2Etel18XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8vaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJy0pO1xcXHhhMF0rL11dKSxbImNsIiwiZWwiLCJsaXNwIiwic2NtIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbHVhLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbHVhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2EzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1sdWEuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14tLSg/OlxbKD0qKVxbW1xTXHNdKj8oPzpdXDFdfCQpfFteXG5ccl0qKS9dLFsic3RyIiwvXlxbKD0qKVxbW1xTXHNdKj8oPzpdXDFdfCQpL10sWyJrd2QiLC9eKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sbnVsbF0sWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLAorWyJwbG4iLC9eW19hLXpdXHcqL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgXHhhMF1bXlx3XHRcblxyICInKz1ceGEwLV0qL11dKSxbImx1YSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW1sLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmMDJkNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW1sLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsiY29tIiwvXiMoPzppZltcdFxuXHIgXHhhMF0rKD86WyRfYS16XVtcdyddKnxgYFteXHRcblxyYF0qKD86YGB8JCkpfGVsc2V8ZW5kaWZ8bGlnaHQpL2ksbnVsbCwiIyJdLFsic3RyIiwvXig/OiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkoPzonfCQpKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14oPzpcL1wvW15cblxyXSp8XChcKltcU1xzXSo/XCpcKSkvXSxbImt3ZCIsL14oPzphYnN0cmFjdHxhbmR8YXN8YXNzZXJ0fGJlZ2lufGNsYXNzfGRlZmF1bHR8ZGVsZWdhdGV8ZG98ZG9uZXxkb3duY2FzdHxkb3dudG98ZWxpZnxlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJufGZhbHNlfGZpbmFsbHl8Zm9yfGZ1bnxmdW5jdGlvbnxpZnxpbnxpbmhlcml0fGlubGluZXxpbnRlcmZhY2V8aW50ZXJuYWx8bGF6eXxsZXR8bWF0Y2h8bWVtYmVyfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bnVsbHxvZnxvcGVufG9yfG92ZXJyaWRlfHByaXZhdGV8cHVibGljfHJlY3xyZXR1cm58c3RhdGljfHN0cnVjdHx0aGVufHRvfHRydWV8dHJ5fHR5cGV8dXBjYXN0fHVzZXx2YWx8dm9pZHx3aGVufHdoaWxlfHdpdGh8eWllbGR8YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2R8c2lnfGF0b21pY3xicmVha3xjaGVja2VkfGNvbXBvbmVudHxjb25zdHxjb25zdHJhaW50fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGVhZ2VyfGV2ZW50fGV4dGVybmFsfGZpeGVkfGZ1bmN0b3J8Z2xvYmFsfGluY2x1ZGV8bWV0aG9kfG1peGlufG9iamVjdHxwYXJhbGxlbHxwcm9jZXNzfHByb3RlY3RlZHxwdXJlfHNlYWxlZHx0cmFpdHx2aXJ0dWFsfHZvbGF0aWxlKVxiL10sCitbImxpdCIsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWystXT9cZCspPykvaV0sWyJwbG4iLC9eKD86W19hLXpdW1x3J10qWyEjP10/fGBgW15cdFxuXHJgXSooPzpgYHwkKSkvaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1x4YTBdKy9dXSksWyJmcyIsIm1sIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbi5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZTg1YgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLW4uanMKQEAgLTAsMCArMSw0IEBACit2YXIgYT1udWxsOworUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJzdHIiLC9eKD86Jyg/OlteXG5ccidcXF18XFwuKSonfCIoPzpbXlxuXHIiXFxdfFxcLikqKD86InwkKSkvLGEsJyInXSxbImNvbSIsL14jKD86KD86ZGVmaW5lfGVsaWZ8ZWxzZXxlbmRpZnxlcnJvcnxpZmRlZnxpbmNsdWRlfGlmbmRlZnxsaW5lfHByYWdtYXx1bmRlZnx3YXJuaW5nKVxifFteXG5ccl0qKS8sYSwiIyJdLFsicGxuIiwvXlxzKy8sYSwiIFxyXG5cdFx4YTAiXV0sW1sic3RyIiwvXkAiKD86W14iXXwiIikqKD86InwkKS8sYV0sWyJzdHIiLC9ePCNbXiM+XSooPzojPnwkKS8sYV0sWyJzdHIiLC9ePCg/Oig/Oig/OlwuXC5cLykqfFwvPykoPzpbXHctXSsoPzpcL1tcdy1dKykrKT9bXHctXStcLmh8W2Etel1cdyopPi8sYV0sWyJjb20iLC9eXC9cL1teXG5ccl0qLyxhXSxbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLywKK2FdLFsia3dkIiwvXig/OmFic3RyYWN0fGFuZHxhc3xiYXNlfGNhdGNofGNsYXNzfGRlZnxkZWxlZ2F0ZXxlbnVtfGV2ZW50fGV4dGVybnxmYWxzZXxmaW5hbGx5fGZ1bnxpbXBsZW1lbnRzfGludGVyZmFjZXxpbnRlcm5hbHxpc3xtYWNyb3xtYXRjaHxtYXRjaGVzfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bnVsbHxvdXR8b3ZlcnJpZGV8cGFyYW1zfHBhcnRpYWx8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZnxzZWFsZWR8c3RhdGljfHN0cnVjdHxzeW50YXh8dGhpc3x0aHJvd3x0cnVlfHRyeXx0eXBlfHR5cGVvZnx1c2luZ3x2YXJpYW50fHZpcnR1YWx8dm9sYXRpbGV8d2hlbnx3aGVyZXx3aXRofGFzc2VydHxhc3NlcnQyfGFzeW5jfGJyZWFrfGNoZWNrZWR8Y29udGludWV8ZG98ZWxzZXxlbnN1cmVzfGZvcnxmb3JlYWNofGlmfGxhdGV8bG9ja3xuZXd8bm9sYXRlfG90aGVyd2lzZXxyZWdleHB8cmVwZWF0fHJlcXVpcmVzfHJldHVybnxzdXJyb3VuZHdpdGh8dW5jaGVja2VkfHVubGVzc3x1c2luZ3x3aGlsZXx5aWVsZClcYi8sCithXSxbInR5cCIsL14oPzphcnJheXxib29sfGJ5dGV8Y2hhcnxkZWNpbWFsfGRvdWJsZXxmbG9hdHxpbnR8bGlzdHxsb25nfG9iamVjdHxzYnl0ZXxzaG9ydHxzdHJpbmd8dWxvbmd8dWludHx1ZmxvYXR8dWxvbmd8dXNob3J0fHZvaWQpXGIvLGFdLFsibGl0IiwvXkBbJF9hLXpdW1x3JEBdKi9pLGFdLFsidHlwIiwvXkBbQS1aXStbYS16XVtcdyRAXSovLGFdLFsicGxuIiwvXic/WyRfYS16XVtcdyRAXSovaSxhXSxbImxpdCIsL14oPzoweFtcZGEtZl0rfCg/OlxkKD86X1xkKykqXGQqKD86XC5cZCopP3xcLlxkXCspKD86ZVsrLV0/XGQrKT8pW2Etel0qL2ksYSwiMDEyMzQ1Njc4OSJdLFsicHVuIiwvXi5bXlxzXHciLSQnLi9AYF0qLyxhXV0pLFsibiIsIm5lbWVybGUiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1wcm90by5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXByb3RvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDZhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1wcm90by5qcwpAQCAtMCwwICsxIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLnNvdXJjZURlY29yYXRvcih7a2V5d29yZHM6ImJ5dGVzLGRlZmF1bHQsZG91YmxlLGVudW0sZXh0ZW5kLGV4dGVuc2lvbnMsZmFsc2UsZ3JvdXAsaW1wb3J0LG1heCxtZXNzYWdlLG9wdGlvbixvcHRpb25hbCxwYWNrYWdlLHJlcGVhdGVkLHJlcXVpcmVkLHJldHVybnMscnBjLHNlcnZpY2Usc3ludGF4LHRvLHRydWUiLHR5cGVzOi9eKGJvb2x8KGRvdWJsZXxzP2ZpeGVkfFtzdV0/aW50KSgzMnw2NCl8ZmxvYXR8c3RyaW5nKVxiLyxjU3R5bGVDb21tZW50czohMH0pLFsicHJvdG8iXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zY2FsYS5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNjYWxhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDAzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zY2FsYS5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14iKD86IiIoPzoiIj8oPyEiKXxbXiJcXF18XFwuKSoiezAsM318KD86W15cblxyIlxcXXxcXC4pKiI/KS8sbnVsbCwnIiddLFsibGl0IiwvXmAoPzpbXlxuXHJcXGBdfFxcLikqYD8vLG51bGwsImAiXSxbInB1biIsL15bISMlJigtLTotQFstXnstfl0rLyxudWxsLCIhIyUmKCkqKywtOjs8PT4/QFtcXF1ee3x9fiJdXSxbWyJzdHIiLC9eJyg/OlteXG5ccidcXF18XFwoPzonfFteXG5cciddKykpJy9dLFsibGl0IiwvXidbJEEtWl9hLXpdW1x3JF0qKD8hW1x3JCddKS9dLFsia3dkIiwvXig/OmFic3RyYWN0fGNhc2V8Y2F0Y2h8Y2xhc3N8ZGVmfGRvfGVsc2V8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZvcnxmb3JTb21lfGlmfGltcGxpY2l0fGltcG9ydHxsYXp5fG1hdGNofG5ld3xvYmplY3R8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxyZXF1aXJlc3xyZXR1cm58c2VhbGVkfHN1cGVyfHRocm93fHRyYWl0fHRyeXx0eXBlfHZhbHx2YXJ8d2hpbGV8d2l0aHx5aWVsZClcYi9dLAorWyJsaXQiLC9eKD86dHJ1ZXxmYWxzZXxudWxsfHRoaXMpXGIvXSxbImxpdCIsL14oPzowKD86WzAtN10rfHhbXGRhLWZdKylsP3woPzowfFsxLTldXGQqKSg/Oig/OlwuXGQrKT8oPzplWystXT9cZCspP2Y/fGw/KXxcXC5cZCsoPzplWystXT9cZCspP2Y/KS9pXSxbInR5cCIsL15bJF9dKltBLVpdW1xkJEEtWl9dKlthLXpdW1x3JF0qL10sWyJwbG4iLC9eWyRBLVpfYS16XVtcdyRdKi9dLFsiY29tIiwvXlwvKD86XC8uKnxcKig/OlwvfFwqKlteKi9dKSooPzpcKitcLz8pPykvXSxbInB1biIsL14oPzpcLit8XC8pL11dKSxbInNjYWxhIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc3FsLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc3FsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzA1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zcWwuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXC4pKiJ8Jyg/OlteJ1xcXXxcXC4pKicpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/Oi0tW15cblxyXSp8XC9cKltcU1xzXSo/KD86XCpcL3wkKSkvXSxbImt3ZCIsL14oPzphZGR8YWxsfGFsdGVyfGFuZHxhbnl8YXN8YXNjfGF1dGhvcml6YXRpb258YmFja3VwfGJlZ2lufGJldHdlZW58YnJlYWt8YnJvd3NlfGJ1bGt8Ynl8Y2FzY2FkZXxjYXNlfGNoZWNrfGNoZWNrcG9pbnR8Y2xvc2V8Y2x1c3RlcmVkfGNvYWxlc2NlfGNvbGxhdGV8Y29sdW1ufGNvbW1pdHxjb21wdXRlfGNvbnN0cmFpbnR8Y29udGFpbnN8Y29udGFpbnN0YWJsZXxjb250aW51ZXxjb252ZXJ0fGNyZWF0ZXxjcm9zc3xjdXJyZW50fGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8Y3VycmVudF91c2VyfGN1cnNvcnxkYXRhYmFzZXxkYmNjfGRlYWxsb2NhdGV8ZGVjbGFyZXxkZWZhdWx0fGRlbGV0ZXxkZW55fGRlc2N8ZGlza3xkaXN0aW5jdHxkaXN0cmlidXRlZHxkb3VibGV8ZHJvcHxkdW1teXxkdW1wfGVsc2V8ZW5kfGVycmx2bHxlc2NhcGV8ZXhjZXB0fGV4ZWN8ZXhlY3V0ZXxleGlzdHN8ZXhpdHxmZXRjaHxmaWxlfGZpbGxmYWN0b3J8Zm9yfGZvcmVpZ258ZnJlZXRleHR8ZnJlZXRleHR0YWJsZXxmcm9tfGZ1bGx8ZnVuY3Rpb258Z290b3xncmFudHxncm91cHxoYXZpbmd8aG9sZGxvY2t8aWRlbnRpdHl8aWRlbnRpdHljb2x8aWRlbnRpdHlfaW5zZXJ0fGlmfGlufGluZGV4fGlubmVyfGluc2VydHxpbnRlcnNlY3R8aW50b3xpc3xqb2lufGtleXxraWxsfGxlZnR8bGlrZXxsaW5lbm98bG9hZHxtYXRjaHxtZXJnZXxuYXRpb25hbHxub2NoZWNrfG5vbmNsdXN0ZXJlZHxub3R8bnVsbHxudWxsaWZ8b2Z8b2ZmfG9mZnNldHN8b258b3BlbnxvcGVuZGF0YXNvdXJjZXxvcGVucXVlcnl8b3BlbnJvd3NldHxvcGVueG1sfG9wdGlvbnxvcnxvcmRlcnxvdXRlcnxvdmVyfHBlcmNlbnR8cGxhbnxwcmVjaXNpb258cHJpbWFyeXxwcmludHxwcm9jfHByb2NlZHVyZXxwdWJsaWN8cmFpc2Vycm9yfHJlYWR8cmVhZHRleHR8cmVjb25maWd1cmV8cmVmZXJlbmNlc3xyZXBsaWNhdGlvbnxyZXN0b3JlfHJlc3RyaWN0fHJldHVybnxyZXZva2V8cmlnaHR8cm9sbGJhY2t8cm93Y291bnR8cm93Z3VpZGNvbHxydWxlfHNhdmV8c2NoZW1hfHNlbGVjdHxzZXNzaW9uX3VzZXJ8c2V0fHNldHVzZXJ8c2h1dGRvd258c29tZXxzdGF0aXN0aWNzfHN5c3RlbV91c2VyfHRhYmxlfHRleHRzaXplfHRoZW58dG98dG9wfHRyYW58dHJhbnNhY3Rpb258dHJpZ2dlcnx0cnVuY2F0ZXx0c2VxdWFsfHVuaW9ufHVuaXF1ZXx1cGRhdGV8dXBkYXRldGV4dHx1c2V8dXNlcnx1c2luZ3x2YWx1ZXN8dmFyeWluZ3x2aWV3fHdhaXRmb3J8d2hlbnx3aGVyZXx3aGlsZXx3aXRofHdyaXRldGV4dCkoPz1bXlx3LV18JCkvaSwKK251bGxdLFsibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSxbInBsbiIsL15bX2Etel1bXHctXSovaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1x4YTBdW15cd1x0XG5cciAiJytceGEwLV0qL11dKSxbInNxbCJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXRleC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXRleC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk2ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdGV4LmpzCkBAIC0wLDAgKzEgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbImNvbSIsL14lW15cblxyXSovLG51bGwsIiUiXV0sW1sia3dkIiwvXlxcW0AtWmEtel0rL10sWyJrd2QiLC9eXFwuL10sWyJ0eXAiLC9eWyQmXS9dLFsibGl0IiwvWystXT8oPzpcLlxkK3xcZCsoPzpcLlxkKik/KShjbXxlbXxleHxpbnxwY3xwdHxicHxtbSkvaV0sWyJwdW4iLC9eWygpPVtcXXt9XSsvXV0pLFsibGF0ZXgiLCJ0ZXgiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12Yi5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZiLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTA2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12Yi5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMFx1MjAyOFx1MjAyOV0rLyxudWxsLCJcdFxuXHIgwlx4YTDigKjigKkiXSxbInN0ciIsL14oPzpbIlx1MjAxY1x1MjAxZF0oPzpbXiJcdTIwMWNcdTIwMWRdfFsiXHUyMDFjXHUyMDFkXXsyfSkoPzpbIlx1MjAxY1x1MjAxZF1jfCQpfFsiXHUyMDFjXHUyMDFkXSg/OlteIlx1MjAxY1x1MjAxZF18WyJcdTIwMWNcdTIwMWRdezJ9KSooPzpbIlx1MjAxY1x1MjAxZF18JCkpL2ksbnVsbCwnIuKAnOKAnSddLFsiY29tIiwvXlsnXHUyMDE4XHUyMDE5XS4qLyxudWxsLCIn4oCY4oCZIl1dLFtbImt3ZCIsL14oPzphZGRoYW5kbGVyfGFkZHJlc3NvZnxhbGlhc3xhbmR8YW5kYWxzb3xhbnNpfGFzfGFzc2VtYmx5fGF1dG98Ym9vbGVhbnxieXJlZnxieXRlfGJ5dmFsfGNhbGx8Y2FzZXxjYXRjaHxjYm9vbHxjYnl0ZXxjY2hhcnxjZGF0ZXxjZGJsfGNkZWN8Y2hhcnxjaW50fGNsYXNzfGNsbmd8Y29ianxjb25zdHxjc2hvcnR8Y3NuZ3xjc3RyfGN0eXBlfGRhdGV8ZGVjaW1hbHxkZWNsYXJlfGRlZmF1bHR8ZGVsZWdhdGV8ZGltfGRpcmVjdGNhc3R8ZG98ZG91YmxlfGVhY2h8ZWxzZXxlbHNlaWZ8ZW5kfGVuZGlmfGVudW18ZXJhc2V8ZXJyb3J8ZXZlbnR8ZXhpdHxmaW5hbGx5fGZvcnxmcmllbmR8ZnVuY3Rpb258Z2V0fGdldHR5cGV8Z29zdWJ8Z290b3xoYW5kbGVzfGlmfGltcGxlbWVudHN8aW1wb3J0c3xpbnxpbmhlcml0c3xpbnRlZ2VyfGludGVyZmFjZXxpc3xsZXR8bGlifGxpa2V8bG9uZ3xsb29wfG1lfG1vZHxtb2R1bGV8bXVzdGluaGVyaXR8bXVzdG92ZXJyaWRlfG15YmFzZXxteWNsYXNzfG5hbWVzcGFjZXxuZXd8bmV4dHxub3R8bm90aW5oZXJpdGFibGV8bm90b3ZlcnJpZGFibGV8b2JqZWN0fG9ufG9wdGlvbnxvcHRpb25hbHxvcnxvcmVsc2V8b3ZlcmxvYWRzfG92ZXJyaWRhYmxlfG92ZXJyaWRlc3xwYXJhbWFycmF5fHByZXNlcnZlfHByaXZhdGV8cHJvcGVydHl8cHJvdGVjdGVkfHB1YmxpY3xyYWlzZWV2ZW50fHJlYWRvbmx5fHJlZGltfHJlbW92ZWhhbmRsZXJ8cmVzdW1lfHJldHVybnxzZWxlY3R8c2V0fHNoYWRvd3N8c2hhcmVkfHNob3J0fHNpbmdsZXxzdGF0aWN8c3RlcHxzdG9wfHN0cmluZ3xzdHJ1Y3R1cmV8c3VifHN5bmNsb2NrfHRoZW58dGhyb3d8dG98dHJ5fHR5cGVvZnx1bmljb2RlfHVudGlsfHZhcmlhbnR8d2VuZHx3aGVufHdoaWxlfHdpdGh8d2l0aGV2ZW50c3x3cml0ZW9ubHl8eG9yfGVuZGlmfGdvc3VifGxldHx2YXJpYW50fHdlbmQpXGIvaSwKK251bGxdLFsiY29tIiwvXnJlbS4qL2ldLFsibGl0IiwvXig/OnRydWVcYnxmYWxzZVxifG5vdGhpbmdcYnxcZCsoPzplWystXT9cZCtbZGZyXT98W2RmaWxyc10pP3woPzomaFtcZGEtZl0rfCZvWzAtN10rKVtpbHNdP3xcZCpcLlxkKyg/OmVbKy1dP1xkKyk/W2Rmcl0/fCNccysoPzpcZCtbLy1dXGQrWy8tXVxkKyg/OlxzK1xkKzpcZCsoPzo6XGQrKT8oXHMqKD86YW18cG0pKT8pP3xcZCs6XGQrKD86OlxkKyk/KFxzKig/OmFtfHBtKSk/KVxzKyMpL2ldLFsicGxuIiwvXig/Oig/OlthLXpdfF9cdylcdyp8XFsoPzpbYS16XXxfXHcpXHcqXSkvaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1tcXVx4YTBcdTIwMThcdTIwMTlcdTIwMWNcdTIwMWRcdTIwMjhcdTIwMjldKy9dLFsicHVuIiwvXig/OlxbfF0pL11dKSxbInZiIiwidmJzIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmhkbC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZoZGwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YjViNgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZoZGwuanMKQEAgLTAsMCArMSwzIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl1dLFtbInN0ciIsL14oPzpbYm94XT8iKD86W14iXXwiIikqInwnLicpL2ldLFsiY29tIiwvXi0tW15cblxyXSovXSxbImt3ZCIsL14oPzphYnN8YWNjZXNzfGFmdGVyfGFsaWFzfGFsbHxhbmR8YXJjaGl0ZWN0dXJlfGFycmF5fGFzc2VydHxhdHRyaWJ1dGV8YmVnaW58YmxvY2t8Ym9keXxidWZmZXJ8YnVzfGNhc2V8Y29tcG9uZW50fGNvbmZpZ3VyYXRpb258Y29uc3RhbnR8ZGlzY29ubmVjdHxkb3dudG98ZWxzZXxlbHNpZnxlbmR8ZW50aXR5fGV4aXR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2VuZXJhdGV8Z2VuZXJpY3xncm91cHxndWFyZGVkfGlmfGltcHVyZXxpbnxpbmVydGlhbHxpbm91dHxpc3xsYWJlbHxsaWJyYXJ5fGxpbmthZ2V8bGl0ZXJhbHxsb29wfG1hcHxtb2R8bmFuZHxuZXd8bmV4dHxub3J8bm90fG51bGx8b2Z8b258b3BlbnxvcnxvdGhlcnN8b3V0fHBhY2thZ2V8cG9ydHxwb3N0cG9uZWR8cHJvY2VkdXJlfHByb2Nlc3N8cHVyZXxyYW5nZXxyZWNvcmR8cmVnaXN0ZXJ8cmVqZWN0fHJlbXxyZXBvcnR8cmV0dXJufHJvbHxyb3J8c2VsZWN0fHNldmVyaXR5fHNoYXJlZHxzaWduYWx8c2xhfHNsbHxzcmF8c3JsfHN1YnR5cGV8dGhlbnx0b3x0cmFuc3BvcnR8dHlwZXx1bmFmZmVjdGVkfHVuaXRzfHVudGlsfHVzZXx2YXJpYWJsZXx3YWl0fHdoZW58d2hpbGV8d2l0aHx4bm9yfHhvcikoPz1bXlx3LV18JCkvaSwKK251bGxdLFsidHlwIiwvXig/OmJpdHxiaXRfdmVjdG9yfGNoYXJhY3Rlcnxib29sZWFufGludGVnZXJ8cmVhbHx0aW1lfHN0cmluZ3xzZXZlcml0eV9sZXZlbHxwb3NpdGl2ZXxuYXR1cmFsfHNpZ25lZHx1bnNpZ25lZHxsaW5lfHRleHR8c3RkX3U/bG9naWMoPzpfdmVjdG9yKT8pKD89W15cdy1dfCQpL2ksbnVsbF0sWyJ0eXAiLC9eJyg/OmFjdGl2ZXxhc2NlbmRpbmd8YmFzZXxkZWxheWVkfGRyaXZpbmd8ZHJpdmluZ192YWx1ZXxldmVudHxoaWdofGltYWdlfGluc3RhbmNlX25hbWV8bGFzdF9hY3RpdmV8bGFzdF9ldmVudHxsYXN0X3ZhbHVlfGxlZnR8bGVmdG9mfGxlbmd0aHxsb3d8cGF0aF9uYW1lfHBvc3xwcmVkfHF1aWV0fHJhbmdlfHJldmVyc2VfcmFuZ2V8cmlnaHR8cmlnaHRvZnxzaW1wbGVfbmFtZXxzdGFibGV8c3VjY3x0cmFuc2FjdGlvbnx2YWx8dmFsdWUpKD89W15cdy1dfCQpL2ksbnVsbF0sWyJsaXQiLC9eXGQrKD86X1xkKykqKD86I1tcdy5cXF0rIyg/OlsrLV0/XGQrKD86X1xkKykqKT98KD86XC5cZCsoPzpfXGQrKSopPyg/OmVbKy1dP1xkKyg/Ol9cZCspKik/KS9pXSwKK1sicGxuIiwvXig/OlthLXpdXHcqfFxcW15cXF0qXFwpL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXVteXHdcdFxuXHIgIidceGEwLV0qL11dKSxbInZoZGwiLCJ2aGQiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy13aWtpLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctd2lraS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBiNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctd2lraS5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcZFx0IGEtZ2ktelx4YTBdKy8sbnVsbCwiXHQgwlx4YTBhYmNkZWZnaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSJdLFsicHVuIiwvXlsqPVtcXV5+XSsvLG51bGwsIj0qfl5bXSJdXSxbWyJsYW5nLXdpa2kubWV0YSIsLyg/Ol5efFxyXG4/fFxuKSgjW2Etel0rKVxiL10sWyJsaXQiLC9eW0EtWl1bYS16XVtcZGEtel0rW0EtWl1bYS16XVteXFdfXStcYi9dLFsibGFuZy0iLC9ee3t7KFtcU1xzXSs/KX19fS9dLFsibGFuZy0iLC9eYChbXlxuXHJgXSspYC9dLFsic3RyIiwvXmh0dHBzPzpcL1wvW15ccyMvP10qKD86XC9bXlxzIz9dKik/KD86XD9bXlxzI10qKT8oPzojXFMqKT8vaV0sWyJwbG4iLC9eKD86XHJcbnxbXFNcc10pW15cblxyIyo9QS1bXmBoe35dKi9dXSksWyJ3aWtpIl0pOworUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJrd2QiLC9eI1thLXpdKy9pLG51bGwsIiMiXV0sW10pLFsid2lraS5tZXRhIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteHEuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy14cS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIzYWUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteHEuanMKQEAgLTAsMCArMSwzIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInZhciBwbG4iLC9eXCRbXHctXSsvLG51bGwsIiQiXV0sW1sicGxuIiwvXltccz1dWzw+XVtccz1dL10sWyJsaXQiLC9eQFtcdy1dKy9dLFsidGFnIiwvXjxcLz9bYS16XSg/Oltcdy0uOl0qXHcpP3xcLz8+JC9pXSxbImNvbSIsL15cKDpbXFNcc10qPzpcKS9dLFsicGxuIiwvXlsoKSwvO1tcXXt9XSQvXSxbInN0ciIsL14oPzoiKD86W14iXFx7XXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFx7XXxcXFtcU1xzXSkqKD86J3wkKSkvLG51bGwsIlwiJyJdLFsia3dkIiwvXig/OnhxdWVyeXx3aGVyZXx2ZXJzaW9ufHZhcmlhYmxlfHVuaW9ufHR5cGVzd2l0Y2h8dHJlYXR8dG98dGhlbnx0ZXh0fHN0YWJsZXxzb3J0Ynl8c29tZXxzZWxmfHNjaGVtYXxzYXRpc2ZpZXN8cmV0dXJuc3xyZXR1cm58cmVmfHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb258cHJlY2VkaW5nLXNpYmxpbmd8cHJlY2VkaW5nfHByZWNlZGVzfHBhcmVudHxvbmx5fG9mfG5vZGV8bmFtZXNwYWNlfG1vZHVsZXxsZXR8aXRlbXxpbnRlcnNlY3R8aW5zdGFuY2V8aW58aW1wb3J0fGlmfGZ1bmN0aW9ufGZvcnxmb2xsb3dzfGZvbGxvd2luZy1zaWJsaW5nfGZvbGxvd2luZ3xleHRlcm5hbHxleGNlcHR8ZXZlcnl8ZWxzZXxlbGVtZW50fGRlc2NlbmRpbmd8ZGVzY2VuZGFudC1vci1zZWxmfGRlc2NlbmRhbnR8ZGVmaW5lfGRlZmF1bHR8ZGVjbGFyZXxjb21tZW50fGNoaWxkfGNhc3R8Y2FzZXxiZWZvcmV8YXR0cmlidXRlfGFzc2VydHxhc2NlbmRpbmd8YXN8YW5jZXN0b3Itb3Itc2VsZnxhbmNlc3RvcnxhZnRlcnxlcXxvcmRlcnxieXxvcnxhbmR8c2NoZW1hLWVsZW1lbnR8ZG9jdW1lbnQtbm9kZXxub2RlfGF0KVxiL10sCitbInR5cCIsL14oPzp4czp5ZWFyTW9udGhEdXJhdGlvbnx4czp1bnNpZ25lZExvbmd8eHM6dGltZXx4czpzdHJpbmd8eHM6c2hvcnR8eHM6UU5hbWV8eHM6TmFtZXx4czpsb25nfHhzOmludGVnZXJ8eHM6aW50fHhzOmdZZWFyTW9udGh8eHM6Z1llYXJ8eHM6Z01vbnRoRGF5fHhzOmdEYXl8eHM6ZmxvYXR8eHM6ZHVyYXRpb258eHM6ZG91YmxlfHhzOmRlY2ltYWx8eHM6ZGF5VGltZUR1cmF0aW9ufHhzOmRhdGVUaW1lfHhzOmRhdGV8eHM6Ynl0ZXx4czpib29sZWFufHhzOmFueVVSSXx4Zjp5ZWFyTW9udGhEdXJhdGlvbilcYi8sbnVsbF0sWyJmdW4gcGxuIiwvXig/OnhwOmRlcmVmZXJlbmNlfHhpbmM6bm9kZS1leHBhbmR8eGluYzpsaW5rLXJlZmVyZW5jZXN8eGluYzpsaW5rLWV4cGFuZHx4aHRtbDpyZXN0cnVjdHVyZXx4aHRtbDpjbGVhbnx4aHRtbDphZGQtbGlzdHN8eGRtcDp6aXAtbWFuaWZlc3R8eGRtcDp6aXAtZ2V0fHhkbXA6emlwLWNyZWF0ZXx4ZG1wOnhxdWVyeS12ZXJzaW9ufHhkbXA6d29yZC1jb252ZXJ0fHhkbXA6d2l0aC1uYW1lc3BhY2VzfHhkbXA6dmVyc2lvbnx4ZG1wOnZhbHVlfHhkbXA6dXNlci1yb2xlc3x4ZG1wOnVzZXItbGFzdC1sb2dpbnx4ZG1wOnVzZXJ8eGRtcDp1cmwtZW5jb2RlfHhkbXA6dXJsLWRlY29kZXx4ZG1wOnVyaS1pcy1maWxlfHhkbXA6dXJpLWZvcm1hdHx4ZG1wOnVyaS1jb250ZW50LXR5cGV8eGRtcDp1bnF1b3RlfHhkbXA6dW5wYXRofHhkbXA6dHJpZ2dlcnMtZGF0YWJhc2V8eGRtcDp0cmFjZXx4ZG1wOnRvLWpzb258eGRtcDp0aWR5fHhkbXA6c3ViYmluYXJ5fHhkbXA6c3RyZnRpbWV8eGRtcDpzcGF3bi1pbnx4ZG1wOnNwYXdufHhkbXA6c2xlZXB8eGRtcDpzaHV0ZG93bnx4ZG1wOnNldC1zZXNzaW9uLWZpZWxkfHhkbXA6c2V0LXJlc3BvbnNlLWVuY29kaW5nfHhkbXA6c2V0LXJlc3BvbnNlLWNvbnRlbnQtdHlwZXx4ZG1wOnNldC1yZXNwb25zZS1jb2RlfHhkbXA6c2V0LXJlcXVlc3QtdGltZS1saW1pdHx4ZG1wOnNldHx4ZG1wOnNlcnZlcnN8eGRtcDpzZXJ2ZXItc3RhdHVzfHhkbXA6c2VydmVyLW5hbWV8eGRtcDpzZXJ2ZXJ8eGRtcDpzZWN1cml0eS1kYXRhYmFzZXx4ZG1wOnNlY3VyaXR5LWFzc2VydHx4ZG1wOnNjaGVtYS1kYXRhYmFzZXx4ZG1wOnNhdmV8eGRtcDpyb2xlLXJvbGVzfHhkbXA6cm9sZXx4ZG1wOnJldGhyb3d8eGRtcDpyZXN0YXJ0fHhkbXA6cmVxdWVzdC10aW1lc3RhbXB8eGRtcDpyZXF1ZXN0LXN0YXR1c3x4ZG1wOnJlcXVlc3QtY2FuY2VsfHhkbXA6cmVxdWVzdHx4ZG1wOnJlZGlyZWN0LXJlc3BvbnNlfHhkbXA6cmFuZG9tfHhkbXA6cXVvdGV8eGRtcDpxdWVyeS10cmFjZXx4ZG1wOnF1ZXJ5LW1ldGVyc3x4ZG1wOnByb2R1Y3QtZWRpdGlvbnx4ZG1wOnByaXZpbGVnZS1yb2xlc3x4ZG1wOnByaXZpbGVnZXx4ZG1wOnByZXR0eS1wcmludHx4ZG1wOnBvd2VycG9pbnQtY29udmVydHx4ZG1wOnBsYXRmb3JtfHhkbXA6cGVybWlzc2lvbnx4ZG1wOnBkZi1jb252ZXJ0fHhkbXA6cGF0aHx4ZG1wOm9jdGFsLXRvLWludGVnZXJ8eGRtcDpub2RlLXVyaXx4ZG1wOm5vZGUtcmVwbGFjZXx4ZG1wOm5vZGUta2luZHx4ZG1wOm5vZGUtaW5zZXJ0LWNoaWxkfHhkbXA6bm9kZS1pbnNlcnQtYmVmb3JlfHhkbXA6bm9kZS1pbnNlcnQtYWZ0ZXJ8eGRtcDpub2RlLWRlbGV0ZXx4ZG1wOm5vZGUtZGF0YWJhc2V8eGRtcDptdWw2NHx4ZG1wOm1vZHVsZXMtcm9vdHx4ZG1wOm1vZHVsZXMtZGF0YWJhc2V8eGRtcDptZXJnaW5nfHhkbXA6bWVyZ2UtY2FuY2VsfHhkbXA6bWVyZ2V8eGRtcDptZDV8eGRtcDpsb2dvdXR8eGRtcDpsb2dpbnx4ZG1wOmxvZy1sZXZlbHx4ZG1wOmxvZ3x4ZG1wOmxvY2stcmVsZWFzZXx4ZG1wOmxvY2stYWNxdWlyZXx4ZG1wOmxvYWR8eGRtcDppbnZva2UtaW58eGRtcDppbnZva2V8eGRtcDppbnRlZ2VyLXRvLW9jdGFsfHhkbXA6aW50ZWdlci10by1oZXh8eGRtcDpodHRwLXB1dHx4ZG1wOmh0dHAtcG9zdHx4ZG1wOmh0dHAtb3B0aW9uc3x4ZG1wOmh0dHAtaGVhZHx4ZG1wOmh0dHAtZ2V0fHhkbXA6aHR0cC1kZWxldGV8eGRtcDpob3N0c3x4ZG1wOmhvc3Qtc3RhdHVzfHhkbXA6aG9zdC1uYW1lfHhkbXA6aG9zdHx4ZG1wOmhleC10by1pbnRlZ2VyfHhkbXA6aGFzaDY0fHhkbXA6aGFzaDMyfHhkbXA6aGFzLXByaXZpbGVnZXx4ZG1wOmdyb3Vwc3x4ZG1wOmdyb3VwLXNlcnZlc3x4ZG1wOmdyb3VwLXNlcnZlcnN8eGRtcDpncm91cC1uYW1lfHhkbXA6Z3JvdXAtaG9zdHN8eGRtcDpncm91cHx4ZG1wOmdldC1zZXNzaW9uLWZpZWxkLW5hbWVzfHhkbXA6Z2V0LXNlc3Npb24tZmllbGR8eGRtcDpnZXQtcmVzcG9uc2UtZW5jb2Rpbmd8eGRtcDpnZXQtcmVzcG9uc2UtY29kZXx4ZG1wOmdldC1yZXF1ZXN0LXVzZXJuYW1lfHhkbXA6Z2V0LXJlcXVlc3QtdXNlcnx4ZG1wOmdldC1yZXF1ZXN0LXVybHx4ZG1wOmdldC1yZXF1ZXN0LXByb3RvY29sfHhkbXA6Z2V0LXJlcXVlc3QtcGF0aHx4ZG1wOmdldC1yZXF1ZXN0LW1ldGhvZHx4ZG1wOmdldC1yZXF1ZXN0LWhlYWRlci1uYW1lc3x4ZG1wOmdldC1yZXF1ZXN0LWhlYWRlcnx4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkLW5hbWVzfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGQtZmlsZW5hbWV8eGRtcDpnZXQtcmVxdWVzdC1maWVsZC1jb250ZW50LXR5cGV8eGRtcDpnZXQtcmVxdWVzdC1maWVsZHx4ZG1wOmdldC1yZXF1ZXN0LWNsaWVudC1jZXJ0aWZpY2F0ZXx4ZG1wOmdldC1yZXF1ZXN0LWNsaWVudC1hZGRyZXNzfHhkbXA6Z2V0LXJlcXVlc3QtYm9keXx4ZG1wOmdldC1jdXJyZW50LXVzZXJ8eGRtcDpnZXQtY3VycmVudC1yb2xlc3x4ZG1wOmdldHx4ZG1wOmZ1bmN0aW9uLW5hbWV8eGRtcDpmdW5jdGlvbi1tb2R1bGV8eGRtcDpmdW5jdGlvbnx4ZG1wOmZyb20tanNvbnx4ZG1wOmZvcmVzdHN8eGRtcDpmb3Jlc3Qtc3RhdHVzfHhkbXA6Zm9yZXN0LXJlc3RvcmV8eGRtcDpmb3Jlc3QtcmVzdGFydHx4ZG1wOmZvcmVzdC1uYW1lfHhkbXA6Zm9yZXN0LWRlbGV0ZXx4ZG1wOmZvcmVzdC1kYXRhYmFzZXN8eGRtcDpmb3Jlc3QtY291bnRzfHhkbXA6Zm9yZXN0LWNsZWFyfHhkbXA6Zm9yZXN0LWJhY2t1cHx4ZG1wOmZvcmVzdHx4ZG1wOmZpbGVzeXN0ZW0tZmlsZXx4ZG1wOmZpbGVzeXN0ZW0tZGlyZWN0b3J5fHhkbXA6ZXhpc3RzfHhkbXA6ZXhjZWwtY29udmVydHx4ZG1wOmV2YWwtaW58eGRtcDpldmFsfHhkbXA6ZXN0aW1hdGV8eGRtcDplbWFpbHx4ZG1wOmVsZW1lbnQtY29udGVudC10eXBlfHhkbXA6ZWxhcHNlZC10aW1lfHhkbXA6ZG9jdW1lbnQtc2V0LXF1YWxpdHl8eGRtcDpkb2N1bWVudC1zZXQtcHJvcGVydHl8eGRtcDpkb2N1bWVudC1zZXQtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LXNldC1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LXNldC1jb2xsZWN0aW9uc3x4ZG1wOmRvY3VtZW50LXJlbW92ZS1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtcmVtb3ZlLXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtcmVtb3ZlLWNvbGxlY3Rpb25zfHhkbXA6ZG9jdW1lbnQtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LWxvY2tzfHhkbXA6ZG9jdW1lbnQtbG9hZHx4ZG1wOmRvY3VtZW50LWluc2VydHx4ZG1wOmRvY3VtZW50LWdldC1xdWFsaXR5fHhkbXA6ZG9jdW1lbnQtZ2V0LXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1nZXQtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1nZXQtY29sbGVjdGlvbnN8eGRtcDpkb2N1bWVudC1nZXR8eGRtcDpkb2N1bWVudC1mb3Jlc3R8eGRtcDpkb2N1bWVudC1kZWxldGV8eGRtcDpkb2N1bWVudC1hZGQtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LWFkZC1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LWFkZC1jb2xsZWN0aW9uc3x4ZG1wOmRpcmVjdG9yeS1wcm9wZXJ0aWVzfHhkbXA6ZGlyZWN0b3J5LWxvY2tzfHhkbXA6ZGlyZWN0b3J5LWRlbGV0ZXx4ZG1wOmRpcmVjdG9yeS1jcmVhdGV8eGRtcDpkaXJlY3Rvcnl8eGRtcDpkaWFjcml0aWMtbGVzc3x4ZG1wOmRlc2NyaWJlfHhkbXA6ZGVmYXVsdC1wZXJtaXNzaW9uc3x4ZG1wOmRlZmF1bHQtY29sbGVjdGlvbnN8eGRtcDpkYXRhYmFzZXN8eGRtcDpkYXRhYmFzZS1yZXN0b3JlLXZhbGlkYXRlfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZS1zdGF0dXN8eGRtcDpkYXRhYmFzZS1yZXN0b3JlLWNhbmNlbHx4ZG1wOmRhdGFiYXNlLXJlc3RvcmV8eGRtcDpkYXRhYmFzZS1uYW1lfHhkbXA6ZGF0YWJhc2UtZm9yZXN0c3x4ZG1wOmRhdGFiYXNlLWJhY2t1cC12YWxpZGF0ZXx4ZG1wOmRhdGFiYXNlLWJhY2t1cC1zdGF0dXN8eGRtcDpkYXRhYmFzZS1iYWNrdXAtcHVyZ2V8eGRtcDpkYXRhYmFzZS1iYWNrdXAtY2FuY2VsfHhkbXA6ZGF0YWJhc2UtYmFja3VwfHhkbXA6ZGF0YWJhc2V8eGRtcDpjb2xsZWN0aW9uLXByb3BlcnRpZXN8eGRtcDpjb2xsZWN0aW9uLWxvY2tzfHhkbXA6Y29sbGVjdGlvbi1kZWxldGV8eGRtcDpjb2xsYXRpb24tY2Fub25pY2FsLXVyaXx4ZG1wOmNhc3RhYmxlLWFzfHhkbXA6Y2FuLWdyYW50LXJvbGVzfHhkbXA6YmFzZTY0LWVuY29kZXx4ZG1wOmJhc2U2NC1kZWNvZGV8eGRtcDphcmNoaXRlY3R1cmV8eGRtcDphcHBseXx4ZG1wOmFtcC1yb2xlc3x4ZG1wOmFtcHx4ZG1wOmFkZDY0fHhkbXA6YWRkLXJlc3BvbnNlLWhlYWRlcnx4ZG1wOmFjY2Vzc3x0cmdyOnRyaWdnZXItc2V0LXJlY3Vyc2l2ZXx0cmdyOnRyaWdnZXItc2V0LXBlcm1pc3Npb25zfHRyZ3I6dHJpZ2dlci1zZXQtbmFtZXx0cmdyOnRyaWdnZXItc2V0LW1vZHVsZXx0cmdyOnRyaWdnZXItc2V0LWV2ZW50fHRyZ3I6dHJpZ2dlci1zZXQtZGVzY3JpcHRpb258dHJncjp0cmlnZ2VyLXJlbW92ZS1wZXJtaXNzaW9uc3x0cmdyOnRyaWdnZXItbW9kdWxlfHRyZ3I6dHJpZ2dlci1nZXQtcGVybWlzc2lvbnN8dHJncjp0cmlnZ2VyLWVuYWJsZXx0cmdyOnRyaWdnZXItZGlzYWJsZXx0cmdyOnRyaWdnZXItZGF0YWJhc2Utb25saW5lLWV2ZW50fHRyZ3I6dHJpZ2dlci1kYXRhLWV2ZW50fHRyZ3I6dHJpZ2dlci1hZGQtcGVybWlzc2lvbnN8dHJncjpyZW1vdmUtdHJpZ2dlcnx0cmdyOnByb3BlcnR5LWNvbnRlbnR8dHJncjpwcmUtY29tbWl0fHRyZ3I6cG9zdC1jb21taXR8dHJncjpnZXQtdHJpZ2dlci1ieS1pZHx0cmdyOmdldC10cmlnZ2VyfHRyZ3I6ZG9jdW1lbnQtc2NvcGV8dHJncjpkb2N1bWVudC1jb250ZW50fHRyZ3I6ZGlyZWN0b3J5LXNjb3BlfHRyZ3I6Y3JlYXRlLXRyaWdnZXJ8dHJncjpjb2xsZWN0aW9uLXNjb3BlfHRyZ3I6YW55LXByb3BlcnR5LWNvbnRlbnR8dGhzcjpzZXQtZW50cnl8dGhzcjpyZW1vdmUtdGVybXx0aHNyOnJlbW92ZS1zeW5vbnltfHRoc3I6cmVtb3ZlLWVudHJ5fHRoc3I6cXVlcnktbG9va3VwfHRoc3I6bG9va3VwfHRoc3I6bG9hZHx0aHNyOmluc2VydHx0aHNyOmV4cGFuZHx0aHNyOmFkZC1zeW5vbnltfHNwZWxsOnN1Z2dlc3QtZGV0YWlsZWR8c3BlbGw6c3VnZ2VzdHxzcGVsbDpyZW1vdmUtd29yZHxzcGVsbDptYWtlLWRpY3Rpb25hcnl8c3BlbGw6bG9hZHxzcGVsbDpsZXZlbnNodGVpbi1kaXN0YW5jZXxzcGVsbDppcy1jb3JyZWN0fHNwZWxsOmluc2VydHxzcGVsbDpkb3VibGUtbWV0YXBob25lfHNwZWxsOmFkZC13b3JkfHNlYzp1c2Vycy1jb2xsZWN0aW9ufHNlYzp1c2VyLXNldC1yb2xlc3xzZWM6dXNlci1zZXQtcGFzc3dvcmR8c2VjOnVzZXItc2V0LW5hbWV8c2VjOnVzZXItc2V0LWRlc2NyaXB0aW9ufHNlYzp1c2VyLXNldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzp1c2VyLXNldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzp1c2VyLXJlbW92ZS1yb2xlc3xzZWM6dXNlci1wcml2aWxlZ2VzfHNlYzp1c2VyLWdldC1yb2xlc3xzZWM6dXNlci1nZXQtZGVzY3JpcHRpb258c2VjOnVzZXItZ2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnVzZXItZ2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnVzZXItZG9jLXBlcm1pc3Npb25zfHNlYzp1c2VyLWRvYy1jb2xsZWN0aW9uc3xzZWM6dXNlci1hZGQtcm9sZXN8c2VjOnVucHJvdGVjdC1jb2xsZWN0aW9ufHNlYzp1aWQtZm9yLW5hbWV8c2VjOnNldC1yZWFsbXxzZWM6c2VjdXJpdHktdmVyc2lvbnxzZWM6c2VjdXJpdHktbmFtZXNwYWNlfHNlYzpzZWN1cml0eS1pbnN0YWxsZWR8c2VjOnNlY3VyaXR5LWNvbGxlY3Rpb258c2VjOnJvbGVzLWNvbGxlY3Rpb258c2VjOnJvbGUtc2V0LXJvbGVzfHNlYzpyb2xlLXNldC1uYW1lfHNlYzpyb2xlLXNldC1kZXNjcmlwdGlvbnxzZWM6cm9sZS1zZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6cm9sZS1zZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6cm9sZS1yZW1vdmUtcm9sZXN8c2VjOnJvbGUtcHJpdmlsZWdlc3xzZWM6cm9sZS1nZXQtcm9sZXN8c2VjOnJvbGUtZ2V0LWRlc2NyaXB0aW9ufHNlYzpyb2xlLWdldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzpyb2xlLWdldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzpyb2xlLWRvYy1wZXJtaXNzaW9uc3xzZWM6cm9sZS1kb2MtY29sbGVjdGlvbnN8c2VjOnJvbGUtYWRkLXJvbGVzfHNlYzpyZW1vdmUtdXNlcnxzZWM6cmVtb3ZlLXJvbGUtZnJvbS11c2Vyc3xzZWM6cmVtb3ZlLXJvbGUtZnJvbS1yb2xlfHNlYzpyZW1vdmUtcm9sZS1mcm9tLXByaXZpbGVnZXN8c2VjOnJlbW92ZS1yb2xlLWZyb20tYW1wc3xzZWM6cmVtb3ZlLXJvbGV8c2VjOnJlbW92ZS1wcml2aWxlZ2V8c2VjOnJlbW92ZS1hbXB8c2VjOnByb3RlY3QtY29sbGVjdGlvbnxzZWM6cHJpdmlsZWdlcy1jb2xsZWN0aW9ufHNlYzpwcml2aWxlZ2Utc2V0LXJvbGVzfHNlYzpwcml2aWxlZ2Utc2V0LW5hbWV8c2VjOnByaXZpbGVnZS1yZW1vdmUtcm9sZXN8c2VjOnByaXZpbGVnZS1nZXQtcm9sZXN8c2VjOnByaXZpbGVnZS1hZGQtcm9sZXN8c2VjOnByaXYtZG9jLXBlcm1pc3Npb25zfHNlYzpwcml2LWRvYy1jb2xsZWN0aW9uc3xzZWM6Z2V0LXVzZXItbmFtZXN8c2VjOmdldC11bmlxdWUtZWxlbS1pZHxzZWM6Z2V0LXJvbGUtbmFtZXN8c2VjOmdldC1yb2xlLWlkc3xzZWM6Z2V0LXByaXZpbGVnZXxzZWM6Z2V0LWRpc3RpbmN0LXBlcm1pc3Npb25zfHNlYzpnZXQtY29sbGVjdGlvbnxzZWM6Z2V0LWFtcHxzZWM6Y3JlYXRlLXVzZXItd2l0aC1yb2xlfHNlYzpjcmVhdGUtdXNlcnxzZWM6Y3JlYXRlLXJvbGV8c2VjOmNyZWF0ZS1wcml2aWxlZ2V8c2VjOmNyZWF0ZS1hbXB8c2VjOmNvbGxlY3Rpb25zLWNvbGxlY3Rpb258c2VjOmNvbGxlY3Rpb24tc2V0LXBlcm1pc3Npb25zfHNlYzpjb2xsZWN0aW9uLXJlbW92ZS1wZXJtaXNzaW9uc3xzZWM6Y29sbGVjdGlvbi1nZXQtcGVybWlzc2lvbnN8c2VjOmNvbGxlY3Rpb24tYWRkLXBlcm1pc3Npb25zfHNlYzpjaGVjay1hZG1pbnxzZWM6YW1wcy1jb2xsZWN0aW9ufHNlYzphbXAtc2V0LXJvbGVzfHNlYzphbXAtcmVtb3ZlLXJvbGVzfHNlYzphbXAtZ2V0LXJvbGVzfHNlYzphbXAtZG9jLXBlcm1pc3Npb25zfHNlYzphbXAtZG9jLWNvbGxlY3Rpb25zfHNlYzphbXAtYWRkLXJvbGVzfHNlYXJjaDp1bnBhcnNlfHNlYXJjaDpzdWdnZXN0fHNlYXJjaDpzbmlwcGV0fHNlYXJjaDpzZWFyY2h8c2VhcmNoOnJlc29sdmUtbm9kZXN8c2VhcmNoOnJlc29sdmV8c2VhcmNoOnJlbW92ZS1jb25zdHJhaW50fHNlYXJjaDpwYXJzZXxzZWFyY2g6Z2V0LWRlZmF1bHQtb3B0aW9uc3xzZWFyY2g6ZXN0aW1hdGV8c2VhcmNoOmNoZWNrLW9wdGlvbnN8cHJvZjp2YWx1ZXxwcm9mOnJlc2V0fHByb2Y6cmVwb3J0fHByb2Y6aW52b2tlfHByb2Y6ZXZhbHxwcm9mOmVuYWJsZXxwcm9mOmRpc2FibGV8cHJvZjphbGxvd2VkfHBwdDpjbGVhbnxwa2k6dGVtcGxhdGUtc2V0LXJlcXVlc3R8cGtpOnRlbXBsYXRlLXNldC1uYW1lfHBraTp0ZW1wbGF0ZS1zZXQta2V5LXR5cGV8cGtpOnRlbXBsYXRlLXNldC1rZXktb3B0aW9uc3xwa2k6dGVtcGxhdGUtc2V0LWRlc2NyaXB0aW9ufHBraTp0ZW1wbGF0ZS1pbi11c2V8cGtpOnRlbXBsYXRlLWdldC12ZXJzaW9ufHBraTp0ZW1wbGF0ZS1nZXQtcmVxdWVzdHxwa2k6dGVtcGxhdGUtZ2V0LW5hbWV8cGtpOnRlbXBsYXRlLWdldC1rZXktdHlwZXxwa2k6dGVtcGxhdGUtZ2V0LWtleS1vcHRpb25zfHBraTp0ZW1wbGF0ZS1nZXQtaWR8cGtpOnRlbXBsYXRlLWdldC1kZXNjcmlwdGlvbnxwa2k6bmVlZC1jZXJ0aWZpY2F0ZXxwa2k6aXMtdGVtcG9yYXJ5fHBraTppbnNlcnQtdHJ1c3RlZC1jZXJ0aWZpY2F0ZXN8cGtpOmluc2VydC10ZW1wbGF0ZXxwa2k6aW5zZXJ0LXNpZ25lZC1jZXJ0aWZpY2F0ZXN8cGtpOmluc2VydC1jZXJ0aWZpY2F0ZS1yZXZvY2F0aW9uLWxpc3R8cGtpOmdldC10cnVzdGVkLWNlcnRpZmljYXRlLWlkc3xwa2k6Z2V0LXRlbXBsYXRlLWlkc3xwa2k6Z2V0LXRlbXBsYXRlLWNlcnRpZmljYXRlLWF1dGhvcml0eXxwa2k6Z2V0LXRlbXBsYXRlLWJ5LW5hbWV8cGtpOmdldC10ZW1wbGF0ZXxwa2k6Z2V0LXBlbmRpbmctY2VydGlmaWNhdGUtcmVxdWVzdHMteG1sfHBraTpnZXQtcGVuZGluZy1jZXJ0aWZpY2F0ZS1yZXF1ZXN0cy1wZW18cGtpOmdldC1wZW5kaW5nLWNlcnRpZmljYXRlLXJlcXVlc3R8cGtpOmdldC1jZXJ0aWZpY2F0ZXMtZm9yLXRlbXBsYXRlLXhtbHxwa2k6Z2V0LWNlcnRpZmljYXRlcy1mb3ItdGVtcGxhdGV8cGtpOmdldC1jZXJ0aWZpY2F0ZXN8cGtpOmdldC1jZXJ0aWZpY2F0ZS14bWx8cGtpOmdldC1jZXJ0aWZpY2F0ZS1wZW18cGtpOmdldC1jZXJ0aWZpY2F0ZXxwa2k6Z2VuZXJhdGUtdGVtcG9yYXJ5LWNlcnRpZmljYXRlLWlmLW5lY2Vzc2FyeXxwa2k6Z2VuZXJhdGUtdGVtcG9yYXJ5LWNlcnRpZmljYXRlfHBraTpnZW5lcmF0ZS10ZW1wbGF0ZS1jZXJ0aWZpY2F0ZS1hdXRob3JpdHl8cGtpOmdlbmVyYXRlLWNlcnRpZmljYXRlLXJlcXVlc3R8cGtpOmRlbGV0ZS10ZW1wbGF0ZXxwa2k6ZGVsZXRlLWNlcnRpZmljYXRlfHBraTpjcmVhdGUtdGVtcGxhdGV8cGRmOm1ha2UtdG9jfHBkZjppbnNlcnQtdG9jLWhlYWRlcnN8cGRmOmdldC10b2N8cGRmOmNsZWFufHA6c3RhdHVzLXRyYW5zaXRpb258cDpzdGF0ZS10cmFuc2l0aW9ufHA6cmVtb3ZlfHA6cGlwZWxpbmVzfHA6aW5zZXJ0fHA6Z2V0LWJ5LWlkfHA6Z2V0fHA6ZXhlY3V0ZXxwOmNyZWF0ZXxwOmNvbmRpdGlvbnxwOmNvbGxlY3Rpb258cDphY3Rpb258b294bWw6cnVucy1tZXJnZXxvb3htbDpwYWNrYWdlLXVyaXN8b294bWw6cGFja2FnZS1wYXJ0cy1pbnNlcnR8b294bWw6cGFja2FnZS1wYXJ0c3xtc3dvcmQ6Y2xlYW58bWNnbTpwb2x5Z29ufG1jZ206cG9pbnR8bWNnbTpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8bWNnbTpnZW9zcGF0aWFsLXF1ZXJ5fG1jZ206Y2lyY2xlfG1hdGg6dGFuaHxtYXRoOnRhbnxtYXRoOnNxcnR8bWF0aDpzaW5ofG1hdGg6c2lufG1hdGg6cG93fG1hdGg6bW9kZnxtYXRoOmxvZzEwfG1hdGg6bG9nfG1hdGg6bGRleHB8bWF0aDpmcmV4cHxtYXRoOmZtb2R8bWF0aDpmbG9vcnxtYXRoOmZhYnN8bWF0aDpleHB8bWF0aDpjb3NofG1hdGg6Y29zfG1hdGg6Y2VpbHxtYXRoOmF0YW4yfG1hdGg6YXRhbnxtYXRoOmFzaW58bWF0aDphY29zfG1hcDpwdXR8bWFwOm1hcHxtYXA6a2V5c3xtYXA6Z2V0fG1hcDpkZWxldGV8bWFwOmNvdW50fG1hcDpjbGVhcnxsbms6dG98bG5rOnJlbW92ZXxsbms6aW5zZXJ0fGxuazpnZXR8bG5rOmZyb218bG5rOmNyZWF0ZXxrbWw6cG9seWdvbnxrbWw6cG9pbnR8a21sOmludGVyaW9yLXBvbHlnb258a21sOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xrbWw6Z2Vvc3BhdGlhbC1xdWVyeXxrbWw6Y2lyY2xlfGttbDpib3h8Z21sOnBvbHlnb258Z21sOnBvaW50fGdtbDppbnRlcmlvci1wb2x5Z29ufGdtbDpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8Z21sOmdlb3NwYXRpYWwtcXVlcnl8Z21sOmNpcmNsZXxnbWw6Ym94fGdlb3Jzczpwb2ludHxnZW9yc3M6Z2Vvc3BhdGlhbC1xdWVyeXxnZW9yc3M6Y2lyY2xlfGdlbzpwb2x5Z29ufGdlbzpwb2ludHxnZW86aW50ZXJpb3ItcG9seWdvbnxnZW86Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfGdlbzpnZW9zcGF0aWFsLXF1ZXJ5fGdlbzpjaXJjbGV8Z2VvOmJveHxmbjp6ZXJvLW9yLW9uZXxmbjp5ZWFycy1mcm9tLWR1cmF0aW9ufGZuOnllYXItZnJvbS1kYXRlVGltZXxmbjp5ZWFyLWZyb20tZGF0ZXxmbjp1cHBlci1jYXNlfGZuOnVub3JkZXJlZHxmbjp0cnVlfGZuOnRyYW5zbGF0ZXxmbjp0cmFjZXxmbjp0b2tlbml6ZXxmbjp0aW1lem9uZS1mcm9tLXRpbWV8Zm46dGltZXpvbmUtZnJvbS1kYXRlVGltZXxmbjp0aW1lem9uZS1mcm9tLWRhdGV8Zm46c3VtfGZuOnN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy15ZWFyTW9udGhEdXJhdGlvbnxmbjpzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmctZGF5VGltZUR1cmF0aW9ufGZuOnN1YnN0cmluZy1iZWZvcmV8Zm46c3Vic3RyaW5nLWFmdGVyfGZuOnN1YnN0cmluZ3xmbjpzdWJzZXF1ZW5jZXxmbjpzdHJpbmctdG8tY29kZXBvaW50c3xmbjpzdHJpbmctcGFkfGZuOnN0cmluZy1sZW5ndGh8Zm46c3RyaW5nLWpvaW58Zm46c3RyaW5nfGZuOnN0YXRpYy1iYXNlLXVyaXxmbjpzdGFydHMtd2l0aHxmbjpzZWNvbmRzLWZyb20tdGltZXxmbjpzZWNvbmRzLWZyb20tZHVyYXRpb258Zm46c2Vjb25kcy1mcm9tLWRhdGVUaW1lfGZuOnJvdW5kLWhhbGYtdG8tZXZlbnxmbjpyb3VuZHxmbjpyb290fGZuOnJldmVyc2V8Zm46cmVzb2x2ZS11cml8Zm46cmVzb2x2ZS1RTmFtZXxmbjpyZXBsYWNlfGZuOnJlbW92ZXxmbjpRTmFtZXxmbjpwcmVmaXgtZnJvbS1RTmFtZXxmbjpwb3NpdGlvbnxmbjpvbmUtb3ItbW9yZXxmbjpudW1iZXJ8Zm46bm90fGZuOm5vcm1hbGl6ZS11bmljb2RlfGZuOm5vcm1hbGl6ZS1zcGFjZXxmbjpub2RlLW5hbWV8Zm46bm9kZS1raW5kfGZuOm5pbGxlZHxmbjpuYW1lc3BhY2UtdXJpLWZyb20tUU5hbWV8Zm46bmFtZXNwYWNlLXVyaS1mb3ItcHJlZml4fGZuOm5hbWVzcGFjZS11cml8Zm46bmFtZXxmbjptb250aHMtZnJvbS1kdXJhdGlvbnxmbjptb250aC1mcm9tLWRhdGVUaW1lfGZuOm1vbnRoLWZyb20tZGF0ZXxmbjptaW51dGVzLWZyb20tdGltZXxmbjptaW51dGVzLWZyb20tZHVyYXRpb258Zm46bWludXRlcy1mcm9tLWRhdGVUaW1lfGZuOm1pbnxmbjptYXh8Zm46bWF0Y2hlc3xmbjpsb3dlci1jYXNlfGZuOmxvY2FsLW5hbWUtZnJvbS1RTmFtZXxmbjpsb2NhbC1uYW1lfGZuOmxhc3R8Zm46bGFuZ3xmbjppcmktdG8tdXJpfGZuOmluc2VydC1iZWZvcmV8Zm46aW5kZXgtb2Z8Zm46aW4tc2NvcGUtcHJlZml4ZXN8Zm46aW1wbGljaXQtdGltZXpvbmV8Zm46aWRyZWZ8Zm46aWR8Zm46aG91cnMtZnJvbS10aW1lfGZuOmhvdXJzLWZyb20tZHVyYXRpb258Zm46aG91cnMtZnJvbS1kYXRlVGltZXxmbjpmbG9vcnxmbjpmYWxzZXxmbjpleHBhbmRlZC1RTmFtZXxmbjpleGlzdHN8Zm46ZXhhY3RseS1vbmV8Zm46ZXNjYXBlLXVyaXxmbjplc2NhcGUtaHRtbC11cml8Zm46ZXJyb3J8Zm46ZW5kcy13aXRofGZuOmVuY29kZS1mb3ItdXJpfGZuOmVtcHR5fGZuOmRvY3VtZW50LXVyaXxmbjpkb2MtYXZhaWxhYmxlfGZuOmRvY3xmbjpkaXN0aW5jdC12YWx1ZXN8Zm46ZGlzdGluY3Qtbm9kZXN8Zm46ZGVmYXVsdC1jb2xsYXRpb258Zm46ZGVlcC1lcXVhbHxmbjpkYXlzLWZyb20tZHVyYXRpb258Zm46ZGF5LWZyb20tZGF0ZVRpbWV8Zm46ZGF5LWZyb20tZGF0ZXxmbjpkYXRhfGZuOmN1cnJlbnQtdGltZXxmbjpjdXJyZW50LWRhdGVUaW1lfGZuOmN1cnJlbnQtZGF0ZXxmbjpjb3VudHxmbjpjb250YWluc3xmbjpjb25jYXR8Zm46Y29tcGFyZXxmbjpjb2xsZWN0aW9ufGZuOmNvZGVwb2ludHMtdG8tc3RyaW5nfGZuOmNvZGVwb2ludC1lcXVhbHxmbjpjZWlsaW5nfGZuOmJvb2xlYW58Zm46YmFzZS11cml8Zm46YXZnfGZuOmFkanVzdC10aW1lLXRvLXRpbWV6b25lfGZuOmFkanVzdC1kYXRlVGltZS10by10aW1lem9uZXxmbjphZGp1c3QtZGF0ZS10by10aW1lem9uZXxmbjphYnN8ZmVlZDp1bnN1YnNjcmliZXxmZWVkOnN1YnNjcmlwdGlvbnxmZWVkOnN1YnNjcmliZXxmZWVkOnJlcXVlc3R8ZmVlZDppdGVtfGZlZWQ6ZGVzY3JpcHRpb258ZXhjZWw6Y2xlYW58ZW50aXR5OmVucmljaHxkb206c2V0LXBpcGVsaW5lc3xkb206c2V0LXBlcm1pc3Npb25zfGRvbTpzZXQtbmFtZXxkb206c2V0LWV2YWx1YXRpb24tY29udGV4dHxkb206c2V0LWRvbWFpbi1zY29wZXxkb206c2V0LWRlc2NyaXB0aW9ufGRvbTpyZW1vdmUtcGlwZWxpbmV8ZG9tOnJlbW92ZS1wZXJtaXNzaW9uc3xkb206cmVtb3ZlfGRvbTpnZXR8ZG9tOmV2YWx1YXRpb24tY29udGV4dHxkb206ZG9tYWluc3xkb206ZG9tYWluLXNjb3BlfGRvbTpjcmVhdGV8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LXJlc3RhcnQtdXNlcnxkb206Y29uZmlndXJhdGlvbi1zZXQtcGVybWlzc2lvbnN8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LWV2YWx1YXRpb24tY29udGV4dHxkb206Y29uZmlndXJhdGlvbi1zZXQtZGVmYXVsdC1kb21haW58ZG9tOmNvbmZpZ3VyYXRpb24tZ2V0fGRvbTpjb25maWd1cmF0aW9uLWNyZWF0ZXxkb206Y29sbGVjdGlvbnxkb206YWRkLXBpcGVsaW5lfGRvbTphZGQtcGVybWlzc2lvbnN8ZGxzOnJldGVudGlvbi1ydWxlc3xkbHM6cmV0ZW50aW9uLXJ1bGUtcmVtb3ZlfGRsczpyZXRlbnRpb24tcnVsZS1pbnNlcnR8ZGxzOnJldGVudGlvbi1ydWxlfGRsczpwdXJnZXxkbHM6bm9kZS1leHBhbmR8ZGxzOmxpbmstcmVmZXJlbmNlc3xkbHM6bGluay1leHBhbmR8ZGxzOmRvY3VtZW50cy1xdWVyeXxkbHM6ZG9jdW1lbnQtdmVyc2lvbnMtcXVlcnl8ZGxzOmRvY3VtZW50LXZlcnNpb24tdXJpfGRsczpkb2N1bWVudC12ZXJzaW9uLXF1ZXJ5fGRsczpkb2N1bWVudC12ZXJzaW9uLWRlbGV0ZXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi1hcy1vZnxkbHM6ZG9jdW1lbnQtdmVyc2lvbnxkbHM6ZG9jdW1lbnQtdXBkYXRlfGRsczpkb2N1bWVudC11bm1hbmFnZXxkbHM6ZG9jdW1lbnQtc2V0LXF1YWxpdHl8ZGxzOmRvY3VtZW50LXNldC1wcm9wZXJ0eXxkbHM6ZG9jdW1lbnQtc2V0LXByb3BlcnRpZXN8ZGxzOmRvY3VtZW50LXNldC1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtc2V0LWNvbGxlY3Rpb25zfGRsczpkb2N1bWVudC1yZXRlbnRpb24tcnVsZXN8ZGxzOmRvY3VtZW50LXJlbW92ZS1wcm9wZXJ0aWVzfGRsczpkb2N1bWVudC1yZW1vdmUtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LXJlbW92ZS1jb2xsZWN0aW9uc3xkbHM6ZG9jdW1lbnQtcHVyZ2V8ZGxzOmRvY3VtZW50LW1hbmFnZXxkbHM6ZG9jdW1lbnQtaXMtbWFuYWdlZHxkbHM6ZG9jdW1lbnQtaW5zZXJ0LWFuZC1tYW5hZ2V8ZGxzOmRvY3VtZW50LWluY2x1ZGUtcXVlcnl8ZGxzOmRvY3VtZW50LWhpc3Rvcnl8ZGxzOmRvY3VtZW50LWdldC1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtZXh0cmFjdC1wYXJ0fGRsczpkb2N1bWVudC1kZWxldGV8ZGxzOmRvY3VtZW50LWNoZWNrb3V0LXN0YXR1c3xkbHM6ZG9jdW1lbnQtY2hlY2tvdXR8ZGxzOmRvY3VtZW50LWNoZWNraW58ZGxzOmRvY3VtZW50LWFkZC1wcm9wZXJ0aWVzfGRsczpkb2N1bWVudC1hZGQtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LWFkZC1jb2xsZWN0aW9uc3xkbHM6YnJlYWstY2hlY2tvdXR8ZGxzOmF1dGhvci1xdWVyeXxkbHM6YXMtb2YtcXVlcnl8ZGJrOmNvbnZlcnR8ZGJnOndhaXR8ZGJnOnZhbHVlfGRiZzpzdG9wcGVkfGRiZzpzdG9wfGRiZzpzdGVwfGRiZzpzdGF0dXN8ZGJnOnN0YWNrfGRiZzpvdXR8ZGJnOm5leHR8ZGJnOmxpbmV8ZGJnOmludm9rZXxkYmc6ZnVuY3Rpb258ZGJnOmZpbmlzaHxkYmc6ZXhwcnxkYmc6ZXZhbHxkYmc6ZGlzY29ubmVjdHxkYmc6ZGV0YWNofGRiZzpjb250aW51ZXxkYmc6Y29ubmVjdHxkYmc6Y2xlYXJ8ZGJnOmJyZWFrcG9pbnRzfGRiZzpicmVha3xkYmc6YXR0YWNoZWR8ZGJnOmF0dGFjaHxjdnQ6c2F2ZS1jb252ZXJ0ZWQtZG9jdW1lbnRzfGN2dDpwYXJ0LXVyaXxjdnQ6ZGVzdGluYXRpb24tdXJpfGN2dDpiYXNlcGF0aHxjdnQ6YmFzZW5hbWV8Y3RzOndvcmRzfGN0czp3b3JkLXF1ZXJ5LXdlaWdodHxjdHM6d29yZC1xdWVyeS10ZXh0fGN0czp3b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOndvcmQtcXVlcnl8Y3RzOndvcmQtbWF0Y2h8Y3RzOndhbGt8Y3RzOnVyaXN8Y3RzOnVyaS1tYXRjaHxjdHM6dHJhaW58Y3RzOnRva2VuaXplfGN0czp0aHJlc2hvbGRzfGN0czpzdGVtfGN0czpzaW1pbGFyLXF1ZXJ5LXdlaWdodHxjdHM6c2ltaWxhci1xdWVyeS1ub2Rlc3xjdHM6c2ltaWxhci1xdWVyeXxjdHM6c2hvcnRlc3QtZGlzdGFuY2V8Y3RzOnNlYXJjaHxjdHM6c2NvcmV8Y3RzOnJldmVyc2UtcXVlcnktd2VpZ2h0fGN0czpyZXZlcnNlLXF1ZXJ5LW5vZGVzfGN0czpyZXZlcnNlLXF1ZXJ5fGN0czpyZW1haW5kZXJ8Y3RzOnJlZ2lzdGVyZWQtcXVlcnktd2VpZ2h0fGN0czpyZWdpc3RlcmVkLXF1ZXJ5LW9wdGlvbnN8Y3RzOnJlZ2lzdGVyZWQtcXVlcnktaWRzfGN0czpyZWdpc3RlcmVkLXF1ZXJ5fGN0czpyZWdpc3RlcnxjdHM6cXVlcnl8Y3RzOnF1YWxpdHl8Y3RzOnByb3BlcnRpZXMtcXVlcnktcXVlcnl8Y3RzOnByb3BlcnRpZXMtcXVlcnl8Y3RzOnBvbHlnb24tdmVydGljZXN8Y3RzOnBvbHlnb258Y3RzOnBvaW50LWxvbmdpdHVkZXxjdHM6cG9pbnQtbGF0aXR1ZGV8Y3RzOnBvaW50fGN0czpvci1xdWVyeS1xdWVyaWVzfGN0czpvci1xdWVyeXxjdHM6bm90LXF1ZXJ5LXdlaWdodHxjdHM6bm90LXF1ZXJ5LXF1ZXJ5fGN0czpub3QtcXVlcnl8Y3RzOm5lYXItcXVlcnktd2VpZ2h0fGN0czpuZWFyLXF1ZXJ5LXF1ZXJpZXN8Y3RzOm5lYXItcXVlcnktb3B0aW9uc3xjdHM6bmVhci1xdWVyeS1kaXN0YW5jZXxjdHM6bmVhci1xdWVyeXxjdHM6aGlnaGxpZ2h0fGN0czpnZW9zcGF0aWFsLWNvLW9jY3VycmVuY2VzfGN0czpmcmVxdWVuY3l8Y3RzOmZpdG5lc3N8Y3RzOmZpZWxkLXdvcmRzfGN0czpmaWVsZC13b3JkLXF1ZXJ5LXdlaWdodHxjdHM6ZmllbGQtd29yZC1xdWVyeS10ZXh0fGN0czpmaWVsZC13b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOmZpZWxkLXdvcmQtcXVlcnktZmllbGQtbmFtZXxjdHM6ZmllbGQtd29yZC1xdWVyeXxjdHM6ZmllbGQtd29yZC1tYXRjaHxjdHM6ZW50aXR5LWhpZ2hsaWdodHxjdHM6ZWxlbWVudC13b3Jkc3xjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LXRleHR8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXdvcmQtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXdvcmQtcXVlcnl8Y3RzOmVsZW1lbnQtd29yZC1tYXRjaHxjdHM6ZWxlbWVudC12YWx1ZXN8Y3RzOmVsZW1lbnQtdmFsdWUtcmFuZ2VzfGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS10ZXh0fGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5fGN0czplbGVtZW50LXZhbHVlLW1hdGNofGN0czplbGVtZW50LXZhbHVlLWdlb3NwYXRpYWwtY28tb2NjdXJyZW5jZXN8Y3RzOmVsZW1lbnQtdmFsdWUtY28tb2NjdXJyZW5jZXN8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LXZhbHVlfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktb3BlcmF0b3J8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5fGN0czplbGVtZW50LXF1ZXJ5LXF1ZXJ5fGN0czplbGVtZW50LXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1xdWVyeXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxvbmdpdHVkZS1uYW1lfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sYXRpdHVkZS1uYW1lfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5fGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5fGN0czplbGVtZW50LWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1jaGlsZC1uYW1lfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZHN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LXRleHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktYXR0cmlidXRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtbWF0Y2h8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcmFuZ2VzfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LXRleHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktYXR0cmlidXRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtZ2Vvc3BhdGlhbC1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtY28tb2NjdXJyZW5jZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktdmFsdWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LW9wZXJhdG9yfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LWF0dHJpYnV0ZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxvbmdpdHVkZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbGF0aXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmRvY3VtZW50LXF1ZXJ5LXVyaXN8Y3RzOmRvY3VtZW50LXF1ZXJ5fGN0czpkaXN0YW5jZXxjdHM6ZGlyZWN0b3J5LXF1ZXJ5LXVyaXN8Y3RzOmRpcmVjdG9yeS1xdWVyeS1kZXB0aHxjdHM6ZGlyZWN0b3J5LXF1ZXJ5fGN0czpkZXN0aW5hdGlvbnxjdHM6ZGVyZWdpc3RlcnxjdHM6Y29udGFpbnN8Y3RzOmNvbmZpZGVuY2V8Y3RzOmNvbGxlY3Rpb25zfGN0czpjb2xsZWN0aW9uLXF1ZXJ5LXVyaXN8Y3RzOmNvbGxlY3Rpb24tcXVlcnl8Y3RzOmNvbGxlY3Rpb24tbWF0Y2h8Y3RzOmNsYXNzaWZ5fGN0czpjaXJjbGUtcmFkaXVzfGN0czpjaXJjbGUtY2VudGVyfGN0czpjaXJjbGV8Y3RzOmJveC13ZXN0fGN0czpib3gtc291dGh8Y3RzOmJveC1ub3J0aHxjdHM6Ym94LWVhc3R8Y3RzOmJveHxjdHM6YmVhcmluZ3xjdHM6YXJjLWludGVyc2VjdGlvbnxjdHM6YW5kLXF1ZXJ5LXF1ZXJpZXN8Y3RzOmFuZC1xdWVyeS1vcHRpb25zfGN0czphbmQtcXVlcnl8Y3RzOmFuZC1ub3QtcXVlcnktcG9zaXRpdmUtcXVlcnl8Y3RzOmFuZC1ub3QtcXVlcnktbmVnYXRpdmUtcXVlcnl8Y3RzOmFuZC1ub3QtcXVlcnl8Y3NzOmdldHxjc3M6Y29udmVydHxjcGY6c3VjY2Vzc3xjcGY6ZmFpbHVyZXxjcGY6ZG9jdW1lbnQtc2V0LXN0YXRlfGNwZjpkb2N1bWVudC1zZXQtcHJvY2Vzc2luZy1zdGF0dXN8Y3BmOmRvY3VtZW50LXNldC1sYXN0LXVwZGF0ZWR8Y3BmOmRvY3VtZW50LXNldC1lcnJvcnxjcGY6ZG9jdW1lbnQtZ2V0LXN0YXRlfGNwZjpkb2N1bWVudC1nZXQtcHJvY2Vzc2luZy1zdGF0dXN8Y3BmOmRvY3VtZW50LWdldC1sYXN0LXVwZGF0ZWR8Y3BmOmRvY3VtZW50LWdldC1lcnJvcnxjcGY6Y2hlY2stdHJhbnNpdGlvbnxhbGVydDpzcGF3bi1tYXRjaGluZy1hY3Rpb25zfGFsZXJ0OnJ1bGUtdXNlci1pZC1xdWVyeXxhbGVydDpydWxlLXNldC11c2VyLWlkfGFsZXJ0OnJ1bGUtc2V0LXF1ZXJ5fGFsZXJ0OnJ1bGUtc2V0LW9wdGlvbnN8YWxlcnQ6cnVsZS1zZXQtbmFtZXxhbGVydDpydWxlLXNldC1kZXNjcmlwdGlvbnxhbGVydDpydWxlLXNldC1hY3Rpb258YWxlcnQ6cnVsZS1yZW1vdmV8YWxlcnQ6cnVsZS1uYW1lLXF1ZXJ5fGFsZXJ0OnJ1bGUtaW5zZXJ0fGFsZXJ0OnJ1bGUtaWQtcXVlcnl8YWxlcnQ6cnVsZS1nZXQtdXNlci1pZHxhbGVydDpydWxlLWdldC1xdWVyeXxhbGVydDpydWxlLWdldC1vcHRpb25zfGFsZXJ0OnJ1bGUtZ2V0LW5hbWV8YWxlcnQ6cnVsZS1nZXQtaWR8YWxlcnQ6cnVsZS1nZXQtZGVzY3JpcHRpb258YWxlcnQ6cnVsZS1nZXQtYWN0aW9ufGFsZXJ0OnJ1bGUtYWN0aW9uLXF1ZXJ5fGFsZXJ0OnJlbW92ZS10cmlnZ2Vyc3xhbGVydDptYWtlLXJ1bGV8YWxlcnQ6bWFrZS1sb2ctYWN0aW9ufGFsZXJ0Om1ha2UtY29uZmlnfGFsZXJ0Om1ha2UtYWN0aW9ufGFsZXJ0Omludm9rZS1tYXRjaGluZy1hY3Rpb25zfGFsZXJ0OmdldC1teS1ydWxlc3xhbGVydDpnZXQtYWxsLXJ1bGVzfGFsZXJ0OmdldC1hY3Rpb25zfGFsZXJ0OmZpbmQtbWF0Y2hpbmctcnVsZXN8YWxlcnQ6Y3JlYXRlLXRyaWdnZXJzfGFsZXJ0OmNvbmZpZy1zZXQtdXJpfGFsZXJ0OmNvbmZpZy1zZXQtdHJpZ2dlci1pZHN8YWxlcnQ6Y29uZmlnLXNldC1vcHRpb25zfGFsZXJ0OmNvbmZpZy1zZXQtbmFtZXxhbGVydDpjb25maWctc2V0LWRlc2NyaXB0aW9ufGFsZXJ0OmNvbmZpZy1zZXQtY3BmLWRvbWFpbi1uYW1lc3xhbGVydDpjb25maWctc2V0LWNwZi1kb21haW4taWRzfGFsZXJ0OmNvbmZpZy1pbnNlcnR8YWxlcnQ6Y29uZmlnLWdldC11cml8YWxlcnQ6Y29uZmlnLWdldC10cmlnZ2VyLWlkc3xhbGVydDpjb25maWctZ2V0LW9wdGlvbnN8YWxlcnQ6Y29uZmlnLWdldC1uYW1lfGFsZXJ0OmNvbmZpZy1nZXQtaWR8YWxlcnQ6Y29uZmlnLWdldC1kZXNjcmlwdGlvbnxhbGVydDpjb25maWctZ2V0LWNwZi1kb21haW4tbmFtZXN8YWxlcnQ6Y29uZmlnLWdldC1jcGYtZG9tYWluLWlkc3xhbGVydDpjb25maWctZ2V0fGFsZXJ0OmNvbmZpZy1kZWxldGV8YWxlcnQ6YWN0aW9uLXNldC1vcHRpb25zfGFsZXJ0OmFjdGlvbi1zZXQtbmFtZXxhbGVydDphY3Rpb24tc2V0LW1vZHVsZS1yb290fGFsZXJ0OmFjdGlvbi1zZXQtbW9kdWxlLWRifGFsZXJ0OmFjdGlvbi1zZXQtbW9kdWxlfGFsZXJ0OmFjdGlvbi1zZXQtZGVzY3JpcHRpb258YWxlcnQ6YWN0aW9uLXJlbW92ZXxhbGVydDphY3Rpb24taW5zZXJ0fGFsZXJ0OmFjdGlvbi1nZXQtb3B0aW9uc3xhbGVydDphY3Rpb24tZ2V0LW5hbWV8YWxlcnQ6YWN0aW9uLWdldC1tb2R1bGUtcm9vdHxhbGVydDphY3Rpb24tZ2V0LW1vZHVsZS1kYnxhbGVydDphY3Rpb24tZ2V0LW1vZHVsZXxhbGVydDphY3Rpb24tZ2V0LWRlc2NyaXB0aW9ufHplcm8tb3Itb25lfHllYXJzLWZyb20tZHVyYXRpb258eWVhci1mcm9tLWRhdGVUaW1lfHllYXItZnJvbS1kYXRlfHVwcGVyLWNhc2V8dW5vcmRlcmVkfHRydWV8dHJhbnNsYXRlfHRyYWNlfHRva2VuaXplfHRpbWV6b25lLWZyb20tdGltZXx0aW1lem9uZS1mcm9tLWRhdGVUaW1lfHRpbWV6b25lLWZyb20tZGF0ZXxzdW18c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLXllYXJNb250aER1cmF0aW9ufHN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy1kYXlUaW1lRHVyYXRpb258c3Vic3RyaW5nLWJlZm9yZXxzdWJzdHJpbmctYWZ0ZXJ8c3Vic3RyaW5nfHN1YnNlcXVlbmNlfHN0cmluZy10by1jb2RlcG9pbnRzfHN0cmluZy1wYWR8c3RyaW5nLWxlbmd0aHxzdHJpbmctam9pbnxzdHJpbmd8c3RhdGljLWJhc2UtdXJpfHN0YXJ0cy13aXRofHNlY29uZHMtZnJvbS10aW1lfHNlY29uZHMtZnJvbS1kdXJhdGlvbnxzZWNvbmRzLWZyb20tZGF0ZVRpbWV8cm91bmQtaGFsZi10by1ldmVufHJvdW5kfHJvb3R8cmV2ZXJzZXxyZXNvbHZlLXVyaXxyZXNvbHZlLVFOYW1lfHJlcGxhY2V8cmVtb3ZlfFFOYW1lfHByZWZpeC1mcm9tLVFOYW1lfHBvc2l0aW9ufG9uZS1vci1tb3JlfG51bWJlcnxub3R8bm9ybWFsaXplLXVuaWNvZGV8bm9ybWFsaXplLXNwYWNlfG5vZGUtbmFtZXxub2RlLWtpbmR8bmlsbGVkfG5hbWVzcGFjZS11cmktZnJvbS1RTmFtZXxuYW1lc3BhY2UtdXJpLWZvci1wcmVmaXh8bmFtZXNwYWNlLXVyaXxuYW1lfG1vbnRocy1mcm9tLWR1cmF0aW9ufG1vbnRoLWZyb20tZGF0ZVRpbWV8bW9udGgtZnJvbS1kYXRlfG1pbnV0ZXMtZnJvbS10aW1lfG1pbnV0ZXMtZnJvbS1kdXJhdGlvbnxtaW51dGVzLWZyb20tZGF0ZVRpbWV8bWlufG1heHxtYXRjaGVzfGxvd2VyLWNhc2V8bG9jYWwtbmFtZS1mcm9tLVFOYW1lfGxvY2FsLW5hbWV8bGFzdHxsYW5nfGlyaS10by11cml8aW5zZXJ0LWJlZm9yZXxpbmRleC1vZnxpbi1zY29wZS1wcmVmaXhlc3xpbXBsaWNpdC10aW1lem9uZXxpZHJlZnxpZHxob3Vycy1mcm9tLXRpbWV8aG91cnMtZnJvbS1kdXJhdGlvbnxob3Vycy1mcm9tLWRhdGVUaW1lfGZsb29yfGZhbHNlfGV4cGFuZGVkLVFOYW1lfGV4aXN0c3xleGFjdGx5LW9uZXxlc2NhcGUtdXJpfGVzY2FwZS1odG1sLXVyaXxlcnJvcnxlbmRzLXdpdGh8ZW5jb2RlLWZvci11cml8ZW1wdHl8ZG9jdW1lbnQtdXJpfGRvYy1hdmFpbGFibGV8ZG9jfGRpc3RpbmN0LXZhbHVlc3xkaXN0aW5jdC1ub2Rlc3xkZWZhdWx0LWNvbGxhdGlvbnxkZWVwLWVxdWFsfGRheXMtZnJvbS1kdXJhdGlvbnxkYXktZnJvbS1kYXRlVGltZXxkYXktZnJvbS1kYXRlfGRhdGF8Y3VycmVudC10aW1lfGN1cnJlbnQtZGF0ZVRpbWV8Y3VycmVudC1kYXRlfGNvdW50fGNvbnRhaW5zfGNvbmNhdHxjb21wYXJlfGNvbGxlY3Rpb258Y29kZXBvaW50cy10by1zdHJpbmd8Y29kZXBvaW50LWVxdWFsfGNlaWxpbmd8Ym9vbGVhbnxiYXNlLXVyaXxhdmd8YWRqdXN0LXRpbWUtdG8tdGltZXpvbmV8YWRqdXN0LWRhdGVUaW1lLXRvLXRpbWV6b25lfGFkanVzdC1kYXRlLXRvLXRpbWV6b25lfGFicylcYi9dLAorWyJwbG4iLC9eW1x3Oi1dKy9dLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rL11dKSxbInhxIiwieHF1ZXJ5Il0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteWFtbC5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXlhbWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NzI5YgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXlhbWwuanMKQEAgLTAsMCArMSwyIEBACit2YXIgYT1udWxsOworUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwdW4iLC9eWzo+P3xdKy8sYSwiOnw+PyJdLFsiZGVjIiwvXiUoPzpZQU1MfFRBRylbXlxuXHIjXSsvLGEsIiUiXSxbInR5cCIsL14mXFMrLyxhLCImIl0sWyJ0eXAiLC9eIVxTKi8sYSwiISJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFwuKSooPzoifCQpLyxhLCciJ10sWyJzdHIiLC9eJyg/OlteJ118JycpKig/Oid8JCkvLGEsIiciXSxbImNvbSIsL14jW15cblxyXSovLGEsIiMiXSxbInBsbiIsL15ccysvLGEsIiBcdFxyXG4iXV0sW1siZGVjIiwvXig/Oi0tLXxcLlwuXC4pKD86W1xuXHJdfCQpL10sWyJwdW4iLC9eLS9dLFsia3dkIiwvXlx3KzpbXG5cciBdL10sWyJwbG4iLC9eXHcrL11dKSxbInlhbWwiLCJ5bWwiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuY3NzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDRiM2EyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmNzcwpAQCAtMCwwICsxIEBACisucGxue2NvbG9yOiMwMDB9QG1lZGlhIHNjcmVlbnsuc3Rye2NvbG9yOiMwODB9Lmt3ZHtjb2xvcjojMDA4fS5jb217Y29sb3I6IzgwMH0udHlwe2NvbG9yOiM2MDZ9LmxpdHtjb2xvcjojMDY2fS5wdW4sLm9wbiwuY2xve2NvbG9yOiM2NjB9LnRhZ3tjb2xvcjojMDA4fS5hdG57Y29sb3I6IzYwNn0uYXR2e2NvbG9yOiMwODB9LmRlYywudmFye2NvbG9yOiM2MDZ9LmZ1bntjb2xvcjpyZWR9fUBtZWRpYSBwcmludCxwcm9qZWN0aW9uey5zdHJ7Y29sb3I6IzA2MH0ua3dke2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uY29te2NvbG9yOiM2MDA7Zm9udC1zdHlsZTppdGFsaWN9LnR5cHtjb2xvcjojNDA0O2ZvbnQtd2VpZ2h0OmJvbGR9LmxpdHtjb2xvcjojMDQ0fS5wdW4sLm9wbiwuY2xve2NvbG9yOiM0NDB9LnRhZ3tjb2xvcjojMDA2O2ZvbnQtd2VpZ2h0OmJvbGR9LmF0bntjb2xvcjojNDA0fS5hdHZ7Y29sb3I6IzA2MH19cHJlLnByZXR0eXByaW50e3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgIzg4OH1vbC5saW5lbnVtc3ttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowfWxpLkwwLGxpLkwxLGxpLkwyLGxpLkwzLGxpLkw1LGxpLkw2LGxpLkw3LGxpLkw4e2xpc3Qtc3R5bGUtdHlwZTpub25lfWxpLkwxLGxpLkwzLGxpLkw1LGxpLkw3LGxpLkw5e2JhY2tncm91bmQ6I2VlZX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5qcwpAQCAtMCwwICsxLDI4IEBACit2YXIgcT1udWxsO3dpbmRvdy5QUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTj0hMDsKKyhmdW5jdGlvbigpe2Z1bmN0aW9uIEwoYSl7ZnVuY3Rpb24gbShhKXt2YXIgZj1hLmNoYXJDb2RlQXQoMCk7aWYoZiE9PTkyKXJldHVybiBmO3ZhciBiPWEuY2hhckF0KDEpO3JldHVybihmPXJbYl0pP2Y6IjAiPD1iJiZiPD0iNyI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksOCk6Yj09PSJ1Inx8Yj09PSJ4Ij9wYXJzZUludChhLnN1YnN0cmluZygyKSwxNik6YS5jaGFyQ29kZUF0KDEpfWZ1bmN0aW9uIGUoYSl7aWYoYTwzMilyZXR1cm4oYTwxNj8iXFx4MCI6IlxceCIpK2EudG9TdHJpbmcoMTYpO2E9U3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZihhPT09IlxcInx8YT09PSItInx8YT09PSJbInx8YT09PSJdIilhPSJcXCIrYTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe2Zvcih2YXIgZj1hLnN1YnN0cmluZygxLGEubGVuZ3RoLTEpLm1hdGNoKC9cXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxbMC0zXVswLTddezAsMn18XFxbMC03XXsxLDJ9fFxcW1xTXHNdfFteXFxdL2cpLGE9CitbXSxiPVtdLG89ZlswXT09PSJeIixjPW8/MTowLGk9Zi5sZW5ndGg7YzxpOysrYyl7dmFyIGo9ZltjXTtpZigvXFxbYmRzd10vaS50ZXN0KGopKWEucHVzaChqKTtlbHNle3ZhciBqPW0oaiksZDtjKzI8aSYmIi0iPT09ZltjKzFdPyhkPW0oZltjKzJdKSxjKz0yKTpkPWo7Yi5wdXNoKFtqLGRdKTtkPDY1fHxqPjEyMnx8KGQ8NjV8fGo+OTB8fGIucHVzaChbTWF0aC5tYXgoNjUsail8MzIsTWF0aC5taW4oZCw5MCl8MzJdKSxkPDk3fHxqPjEyMnx8Yi5wdXNoKFtNYXRoLm1heCg5NyxqKSYtMzMsTWF0aC5taW4oZCwxMjIpJi0zM10pKX19Yi5zb3J0KGZ1bmN0aW9uKGEsZil7cmV0dXJuIGFbMF0tZlswXXx8ZlsxXS1hWzFdfSk7Zj1bXTtqPVtOYU4sTmFOXTtmb3IoYz0wO2M8Yi5sZW5ndGg7KytjKWk9YltjXSxpWzBdPD1qWzFdKzE/alsxXT1NYXRoLm1heChqWzFdLGlbMV0pOmYucHVzaChqPWkpO2I9WyJbIl07byYmYi5wdXNoKCJeIik7Yi5wdXNoLmFwcGx5KGIsYSk7Zm9yKGM9MDtjPAorZi5sZW5ndGg7KytjKWk9ZltjXSxiLnB1c2goZShpWzBdKSksaVsxXT5pWzBdJiYoaVsxXSsxPmlbMF0mJmIucHVzaCgiLSIpLGIucHVzaChlKGlbMV0pKSk7Yi5wdXNoKCJdIik7cmV0dXJuIGIuam9pbigiIil9ZnVuY3Rpb24geShhKXtmb3IodmFyIGY9YS5zb3VyY2UubWF0Y2goL1xbKD86W15cXFxdXXxcXFtcU1xzXSkqXXxcXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxcZCt8XFxbXlxkdXhdfFwoXD9bITo9XXxbKCleXXxbXigpW1xcXl0rL2cpLGI9Zi5sZW5ndGgsZD1bXSxjPTAsaT0wO2M8YjsrK2Mpe3ZhciBqPWZbY107aj09PSIoIj8rK2k6IlxcIj09PWouY2hhckF0KDApJiYoaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZFtqXT0tMSl9Zm9yKGM9MTtjPGQubGVuZ3RoOysrYyktMT09PWRbY10mJihkW2NdPSsrdCk7Zm9yKGk9Yz0wO2M8YjsrK2Mpaj1mW2NdLGo9PT0iKCI/KCsraSxkW2ldPT09dm9pZCAwJiYoZltjXT0iKD86IikpOiJcXCI9PT1qLmNoYXJBdCgwKSYmCisoaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZltjXT0iXFwiK2RbaV0pO2ZvcihpPWM9MDtjPGI7KytjKSJeIj09PWZbY10mJiJeIiE9PWZbYysxXSYmKGZbY109IiIpO2lmKGEuaWdub3JlQ2FzZSYmcylmb3IoYz0wO2M8YjsrK2Mpaj1mW2NdLGE9ai5jaGFyQXQoMCksai5sZW5ndGg+PTImJmE9PT0iWyI/ZltjXT1oKGopOmEhPT0iXFwiJiYoZltjXT1qLnJlcGxhY2UoL1tBLVphLXpdL2csZnVuY3Rpb24oYSl7YT1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIlsiK1N0cmluZy5mcm9tQ2hhckNvZGUoYSYtMzMsYXwzMikrIl0ifSkpO3JldHVybiBmLmpvaW4oIiIpfWZvcih2YXIgdD0wLHM9ITEsbD0hMSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXt2YXIgZz1hW3BdO2lmKGcuaWdub3JlQ2FzZSlsPSEwO2Vsc2UgaWYoL1thLXpdL2kudGVzdChnLnNvdXJjZS5yZXBsYWNlKC9cXHVbXGRhLWZdezR9fFxceFtcZGEtZl17Mn18XFxbXlVYdXhdL2dpLCIiKSkpe3M9ITA7bD0hMTticmVha319Zm9yKHZhciByPQore2I6OCx0OjksbjoxMCx2OjExLGY6MTIscjoxM30sbj1bXSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXtnPWFbcF07aWYoZy5nbG9iYWx8fGcubXVsdGlsaW5lKXRocm93IEVycm9yKCIiK2cpO24ucHVzaCgiKD86Iit5KGcpKyIpIil9cmV0dXJuIFJlZ0V4cChuLmpvaW4oInwiKSxsPyJnaSI6ImciKX1mdW5jdGlvbiBNKGEpe2Z1bmN0aW9uIG0oYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTppZihlLnRlc3QoYS5jbGFzc05hbWUpKWJyZWFrO2Zvcih2YXIgZz1hLmZpcnN0Q2hpbGQ7ZztnPWcubmV4dFNpYmxpbmcpbShnKTtnPWEubm9kZU5hbWU7aWYoIkJSIj09PWd8fCJMSSI9PT1nKWhbc109IlxuIix0W3M8PDFdPXkrKyx0W3MrKzw8MXwxXT1hO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6Zz1hLm5vZGVWYWx1ZSxnLmxlbmd0aCYmKGc9cD9nLnJlcGxhY2UoL1xyXG4/L2csIlxuIik6Zy5yZXBsYWNlKC9bXHRcblxyIF0rL2csIiAiKSxoW3NdPWcsdFtzPDwxXT15LHkrPWcubGVuZ3RoLAordFtzKys8PDF8MV09YSl9fXZhciBlPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyxoPVtdLHk9MCx0PVtdLHM9MCxsO2EuY3VycmVudFN0eWxlP2w9YS5jdXJyZW50U3R5bGUud2hpdGVTcGFjZTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTttKGEpO3JldHVybnthOmguam9pbigiIikucmVwbGFjZSgvXG4kLywiIiksYzp0fX1mdW5jdGlvbiBCKGEsbSxlLGgpe20mJihhPXthOm0sZDphfSxlKGEpLGgucHVzaC5hcHBseShoLGEuZSkpfWZ1bmN0aW9uIHgoYSxtKXtmdW5jdGlvbiBlKGEpe2Zvcih2YXIgbD1hLmQscD1bbCwicGxuIl0sZD0wLGc9YS5hLm1hdGNoKHkpfHxbXSxyPXt9LG49MCx6PWcubGVuZ3RoO248ejsrK24pe3ZhciBmPWdbbl0sYj1yW2ZdLG89dm9pZCAwLGM7aWYodHlwZW9mIGI9PT0KKyJzdHJpbmciKWM9ITE7ZWxzZXt2YXIgaT1oW2YuY2hhckF0KDApXTtpZihpKW89Zi5tYXRjaChpWzFdKSxiPWlbMF07ZWxzZXtmb3IoYz0wO2M8dDsrK2MpaWYoaT1tW2NdLG89Zi5tYXRjaChpWzFdKSl7Yj1pWzBdO2JyZWFrfW98fChiPSJwbG4iKX1pZigoYz1iLmxlbmd0aD49NSYmImxhbmctIj09PWIuc3Vic3RyaW5nKDAsNSkpJiYhKG8mJnR5cGVvZiBvWzFdPT09InN0cmluZyIpKWM9ITEsYj0ic3JjIjtjfHwocltmXT1iKX1pPWQ7ZCs9Zi5sZW5ndGg7aWYoYyl7Yz1vWzFdO3ZhciBqPWYuaW5kZXhPZihjKSxrPWorYy5sZW5ndGg7b1syXSYmKGs9Zi5sZW5ndGgtb1syXS5sZW5ndGgsaj1rLWMubGVuZ3RoKTtiPWIuc3Vic3RyaW5nKDUpO0IobCtpLGYuc3Vic3RyaW5nKDAsaiksZSxwKTtCKGwraStqLGMsQyhiLGMpLHApO0IobCtpK2ssZi5zdWJzdHJpbmcoayksZSxwKX1lbHNlIHAucHVzaChsK2ksYil9YS5lPXB9dmFyIGg9e30seTsoZnVuY3Rpb24oKXtmb3IodmFyIGU9YS5jb25jYXQobSksCitsPVtdLHA9e30sZD0wLGc9ZS5sZW5ndGg7ZDxnOysrZCl7dmFyIHI9ZVtkXSxuPXJbM107aWYobilmb3IodmFyIGs9bi5sZW5ndGg7LS1rPj0wOyloW24uY2hhckF0KGspXT1yO3I9clsxXTtuPSIiK3I7cC5oYXNPd25Qcm9wZXJ0eShuKXx8KGwucHVzaChyKSxwW25dPXEpfWwucHVzaCgvW1xTXHNdLyk7eT1MKGwpfSkoKTt2YXIgdD1tLmxlbmd0aDtyZXR1cm4gZX1mdW5jdGlvbiB1KGEpe3ZhciBtPVtdLGU9W107YS50cmlwbGVRdW90ZWRTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonJycoPzpbXidcXF18XFxbXFNcc118Jyc/KD89W14nXSkpKig/OicnJ3wkKXwiIiIoPzpbXiJcXF18XFxbXFNcc118IiI/KD89W14iXSkpKig/OiIiInwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkpLyxxLCInXCIiXSk6YS5tdWx0aUxpbmVTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8YCg/OlteXFxgXXxcXFtcU1xzXSkqKD86YHwkKSkvLAorcSwiJ1wiYCJdKTptLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteXG5ccidcXF18XFwuKSooPzonfCQpfCIoPzpbXlxuXHIiXFxdfFxcLikqKD86InwkKSkvLHEsIlwiJyJdKTthLnZlcmJhdGltU3RyaW5ncyYmZS5wdXNoKFsic3RyIiwvXkAiKD86W14iXXwiIikqKD86InwkKS8scV0pO3ZhciBoPWEuaGFzaENvbW1lbnRzO2gmJihhLmNTdHlsZUNvbW1lbnRzPyhoPjE/bS5wdXNoKFsiY29tIiwvXiMoPzojIyg/OlteI118Iyg/ISMjKSkqKD86IyMjfCQpfC4qKS8scSwiIyJdKTptLnB1c2goWyJjb20iLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLHEsIiMiXSksZS5wdXNoKFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLHFdKSk6bS5wdXNoKFsiY29tIiwvXiNbXlxuXHJdKi8sCitxLCIjIl0pKTthLmNTdHlsZUNvbW1lbnRzJiYoZS5wdXNoKFsiY29tIiwvXlwvXC9bXlxuXHJdKi8scV0pLGUucHVzaChbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLyxxXSkpO2EucmVnZXhMaXRlcmFscyYmZS5wdXNoKFsibGFuZy1yZWdleCIsL14oPzpeXlwuP3xbISstXXwhPXwhPT18I3wlfCU9fCZ8JiZ8JiY9fCY9fFwofFwqfFwqPXxcKz18LHwtPXwtPnxcL3xcLz18Onw6Onw7fDx8PDx8PDw9fDw9fD18PT18PT09fD58Pj18Pj58Pj49fD4+Pnw+Pj49fFs/QFteXXxcXj18XF5cXnxcXlxePXx7fFx8fFx8PXxcfFx8fFx8XHw9fH58YnJlYWt8Y2FzZXxjb250aW51ZXxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2YpXHMqKFwvKD89W14qL10pKD86W14vW1xcXXxcXFtcU1xzXXxcWyg/OlteXFxcXV18XFxbXFNcc10pKig/Ol18JCkpK1wvKS9dKTsoaD1hLnR5cGVzKSYmZS5wdXNoKFsidHlwIixoXSk7YT0oIiIrYS5rZXl3b3JkcykucmVwbGFjZSgvXiB8ICQvZywKKyIiKTthLmxlbmd0aCYmZS5wdXNoKFsia3dkIixSZWdFeHAoIl4oPzoiK2EucmVwbGFjZSgvW1xzLF0rL2csInwiKSsiKVxcYiIpLHFdKTttLnB1c2goWyJwbG4iLC9eXHMrLyxxLCIgXHJcblx0XHhhMCJdKTtlLnB1c2goWyJsaXQiLC9eQFskX2Etel1bXHckQF0qL2kscV0sWyJ0eXAiLC9eKD86W0BfXT9bQS1aXStbYS16XVtcdyRAXSp8XHcrX3RcYikvLHFdLFsicGxuIiwvXlskX2Etel1bXHckQF0qL2kscV0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLHEsIjAxMjM0NTY3ODkiXSxbInBsbiIsL15cXFtcU1xzXT8vLHFdLFsicHVuIiwvXi5bXlxzXHciLSQnLi9AXFxgXSovLHFdKTtyZXR1cm4geChtLGUpfWZ1bmN0aW9uIEQoYSxtKXtmdW5jdGlvbiBlKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoay50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztpZigiQlIiPT09YS5ub2RlTmFtZSloKGEpLAorYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7ZWxzZSBmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZShhKTticmVhaztjYXNlIDM6Y2FzZSA0OmlmKHApe3ZhciBiPWEubm9kZVZhbHVlLGQ9Yi5tYXRjaCh0KTtpZihkKXt2YXIgYz1iLnN1YnN0cmluZygwLGQuaW5kZXgpO2Eubm9kZVZhbHVlPWM7KGI9Yi5zdWJzdHJpbmcoZC5pbmRleCtkWzBdLmxlbmd0aCkpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMuY3JlYXRlVGV4dE5vZGUoYiksYS5uZXh0U2libGluZyk7aChhKTtjfHxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9fX19ZnVuY3Rpb24gaChhKXtmdW5jdGlvbiBiKGEsZCl7dmFyIGU9ZD9hLmNsb25lTm9kZSghMSk6YSxmPWEucGFyZW50Tm9kZTtpZihmKXt2YXIgZj1iKGYsMSksZz1hLm5leHRTaWJsaW5nO2YuYXBwZW5kQ2hpbGQoZSk7Zm9yKHZhciBoPWc7aDtoPWcpZz1oLm5leHRTaWJsaW5nLGYuYXBwZW5kQ2hpbGQoaCl9cmV0dXJuIGV9Citmb3IoOyFhLm5leHRTaWJsaW5nOylpZihhPWEucGFyZW50Tm9kZSwhYSlyZXR1cm47Zm9yKHZhciBhPWIoYS5uZXh0U2libGluZywwKSxlOyhlPWEucGFyZW50Tm9kZSkmJmUubm9kZVR5cGU9PT0xOylhPWU7ZC5wdXNoKGEpfXZhciBrPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyx0PS9cclxuP3xcbi8scz1hLm93bmVyRG9jdW1lbnQsbDthLmN1cnJlbnRTdHlsZT9sPWEuY3VycmVudFN0eWxlLndoaXRlU3BhY2U6d2luZG93LmdldENvbXB1dGVkU3R5bGUmJihsPXMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTtmb3IobD1zLmNyZWF0ZUVsZW1lbnQoIkxJIik7YS5maXJzdENoaWxkOylsLmFwcGVuZENoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKHZhciBkPVtsXSxnPTA7ZzxkLmxlbmd0aDsrK2cpZShkW2ddKTttPT09KG18MCkmJmRbMF0uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsCittKTt2YXIgcj1zLmNyZWF0ZUVsZW1lbnQoIk9MIik7ci5jbGFzc05hbWU9ImxpbmVudW1zIjtmb3IodmFyIG49TWF0aC5tYXgoMCxtLTF8MCl8fDAsZz0wLHo9ZC5sZW5ndGg7Zzx6OysrZylsPWRbZ10sbC5jbGFzc05hbWU9IkwiKyhnK24pJTEwLGwuZmlyc3RDaGlsZHx8bC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJceGEwIikpLHIuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChyKX1mdW5jdGlvbiBrKGEsbSl7Zm9yKHZhciBlPW0ubGVuZ3RoOy0tZT49MDspe3ZhciBoPW1bZV07QS5oYXNPd25Qcm9wZXJ0eShoKT93aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuKCJjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcyIsaCk6QVtoXT1hfX1mdW5jdGlvbiBDKGEsbSl7aWYoIWF8fCFBLmhhc093blByb3BlcnR5KGEpKWE9L15ccyo8Ly50ZXN0KG0pPyJkZWZhdWx0LW1hcmt1cCI6ImRlZmF1bHQtY29kZSI7cmV0dXJuIEFbYV19ZnVuY3Rpb24gRShhKXt2YXIgbT0KK2EuZzt0cnl7dmFyIGU9TShhLmgpLGg9ZS5hO2EuYT1oO2EuYz1lLmM7YS5kPTA7QyhtLGgpKGEpO3ZhciBrPS9cYk1TSUVcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxtPS9cbi9nLHQ9YS5hLHM9dC5sZW5ndGgsZT0wLGw9YS5jLHA9bC5sZW5ndGgsaD0wLGQ9YS5lLGc9ZC5sZW5ndGgsYT0wO2RbZ109czt2YXIgcixuO2ZvcihuPXI9MDtuPGc7KWRbbl0hPT1kW24rMl0/KGRbcisrXT1kW24rK10sZFtyKytdPWRbbisrXSk6bis9MjtnPXI7Zm9yKG49cj0wO248Zzspe2Zvcih2YXIgej1kW25dLGY9ZFtuKzFdLGI9bisyO2IrMjw9ZyYmZFtiKzFdPT09ZjspYis9MjtkW3IrK109ejtkW3IrK109ZjtuPWJ9Zm9yKGQubGVuZ3RoPXI7aDxwOyl7dmFyIG89bFtoKzJdfHxzLGM9ZFthKzJdfHxzLGI9TWF0aC5taW4obyxjKSxpPWxbaCsxXSxqO2lmKGkubm9kZVR5cGUhPT0xJiYoaj10LnN1YnN0cmluZyhlLGIpKSl7ayYmKGo9ai5yZXBsYWNlKG0sIlxyIikpO2kubm9kZVZhbHVlPQorajt2YXIgdT1pLm93bmVyRG9jdW1lbnQsdj11LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTt2LmNsYXNzTmFtZT1kW2ErMV07dmFyIHg9aS5wYXJlbnROb2RlO3gucmVwbGFjZUNoaWxkKHYsaSk7di5hcHBlbmRDaGlsZChpKTtlPG8mJihsW2grMV09aT11LmNyZWF0ZVRleHROb2RlKHQuc3Vic3RyaW5nKGIsbykpLHguaW5zZXJ0QmVmb3JlKGksdi5uZXh0U2libGluZykpfWU9YjtlPj1vJiYoaCs9Mik7ZT49YyYmKGErPTIpfX1jYXRjaCh3KXsiY29uc29sZSJpbiB3aW5kb3cmJmNvbnNvbGUubG9nKHcmJncuc3RhY2s/dy5zdGFjazp3KX19dmFyIHY9WyJicmVhayxjb250aW51ZSxkbyxlbHNlLGZvcixpZixyZXR1cm4sd2hpbGUiXSx3PVtbdiwiYXV0byxjYXNlLGNoYXIsY29uc3QsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlcm4sZmxvYXQsZ290byxpbnQsbG9uZyxyZWdpc3RlcixzaG9ydCxzaWduZWQsc2l6ZW9mLHN0YXRpYyxzdHJ1Y3Qsc3dpdGNoLHR5cGVkZWYsdW5pb24sdW5zaWduZWQsdm9pZCx2b2xhdGlsZSJdLAorImNhdGNoLGNsYXNzLGRlbGV0ZSxmYWxzZSxpbXBvcnQsbmV3LG9wZXJhdG9yLHByaXZhdGUscHJvdGVjdGVkLHB1YmxpYyx0aGlzLHRocm93LHRydWUsdHJ5LHR5cGVvZiJdLEY9W3csImFsaWdub2YsYWxpZ25fdW5pb24sYXNtLGF4aW9tLGJvb2wsY29uY2VwdCxjb25jZXB0X21hcCxjb25zdF9jYXN0LGNvbnN0ZXhwcixkZWNsdHlwZSxkeW5hbWljX2Nhc3QsZXhwbGljaXQsZXhwb3J0LGZyaWVuZCxpbmxpbmUsbGF0ZV9jaGVjayxtdXRhYmxlLG5hbWVzcGFjZSxudWxscHRyLHJlaW50ZXJwcmV0X2Nhc3Qsc3RhdGljX2Fzc2VydCxzdGF0aWNfY2FzdCx0ZW1wbGF0ZSx0eXBlaWQsdHlwZW5hbWUsdXNpbmcsdmlydHVhbCx3aGVyZSJdLEc9W3csImFic3RyYWN0LGJvb2xlYW4sYnl0ZSxleHRlbmRzLGZpbmFsLGZpbmFsbHksaW1wbGVtZW50cyxpbXBvcnQsaW5zdGFuY2VvZixudWxsLG5hdGl2ZSxwYWNrYWdlLHN0cmljdGZwLHN1cGVyLHN5bmNocm9uaXplZCx0aHJvd3MsdHJhbnNpZW50Il0sCitIPVtHLCJhcyxiYXNlLGJ5LGNoZWNrZWQsZGVjaW1hbCxkZWxlZ2F0ZSxkZXNjZW5kaW5nLGR5bmFtaWMsZXZlbnQsZml4ZWQsZm9yZWFjaCxmcm9tLGdyb3VwLGltcGxpY2l0LGluLGludGVyZmFjZSxpbnRlcm5hbCxpbnRvLGlzLGxvY2ssb2JqZWN0LG91dCxvdmVycmlkZSxvcmRlcmJ5LHBhcmFtcyxwYXJ0aWFsLHJlYWRvbmx5LHJlZixzYnl0ZSxzZWFsZWQsc3RhY2thbGxvYyxzdHJpbmcsc2VsZWN0LHVpbnQsdWxvbmcsdW5jaGVja2VkLHVuc2FmZSx1c2hvcnQsdmFyIl0sdz1bdywiZGVidWdnZXIsZXZhbCxleHBvcnQsZnVuY3Rpb24sZ2V0LG51bGwsc2V0LHVuZGVmaW5lZCx2YXIsd2l0aCxJbmZpbml0eSxOYU4iXSxJPVt2LCJhbmQsYXMsYXNzZXJ0LGNsYXNzLGRlZixkZWwsZWxpZixleGNlcHQsZXhlYyxmaW5hbGx5LGZyb20sZ2xvYmFsLGltcG9ydCxpbixpcyxsYW1iZGEsbm9ubG9jYWwsbm90LG9yLHBhc3MscHJpbnQscmFpc2UsdHJ5LHdpdGgseWllbGQsRmFsc2UsVHJ1ZSxOb25lIl0sCitKPVt2LCJhbGlhcyxhbmQsYmVnaW4sY2FzZSxjbGFzcyxkZWYsZGVmaW5lZCxlbHNpZixlbmQsZW5zdXJlLGZhbHNlLGluLG1vZHVsZSxuZXh0LG5pbCxub3Qsb3IscmVkbyxyZXNjdWUscmV0cnksc2VsZixzdXBlcix0aGVuLHRydWUsdW5kZWYsdW5sZXNzLHVudGlsLHdoZW4seWllbGQsQkVHSU4sRU5EIl0sdj1bdiwiY2FzZSxkb25lLGVsaWYsZXNhYyxldmFsLGZpLGZ1bmN0aW9uLGluLGxvY2FsLHNldCx0aGVuLHVudGlsIl0sSz0vXihESVJ8RklMRXx2ZWN0b3J8KGRlfHByaW9yaXR5Xyk/cXVldWV8bGlzdHxzdGFja3woY29uc3RfKT9pdGVyYXRvcnwobXVsdGkpPyhzZXR8bWFwKXxiaXRzZXR8dT8oaW50fGZsb2F0KVxkKikvLE49L1xTLyxPPXUoe2tleXdvcmRzOltGLEgsdywiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIisKK0ksSix2XSxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksQT17fTtrKE8sWyJkZWZhdWx0LWNvZGUiXSk7ayh4KFtdLFtbInBsbiIsL15bXjw/XSsvXSxbImRlYyIsL148IVx3W14+XSooPzo+fCQpL10sWyJjb20iLC9ePFwhLS1bXFNcc10qPyg/Oi0tXD58JCkvXSxbImxhbmctIiwvXjxcPyhbXFNcc10rPykoPzpcPz58JCkvXSxbImxhbmctIiwvXjwlKFtcU1xzXSs/KSg/OiU+fCQpL10sWyJwdW4iLC9eKD86PFslP118WyU/XT4pL10sWyJsYW5nLSIsL148eG1wXGJbXj5dKj4oW1xTXHNdKz8pPFwveG1wXGJbXj5dKj4vaV0sWyJsYW5nLWpzIiwvXjxzY3JpcHRcYltePl0qPihbXFNcc10qPykoPFwvc2NyaXB0XGJbXj5dKj4pL2ldLFsibGFuZy1jc3MiLC9ePHN0eWxlXGJbXj5dKj4oW1xTXHNdKj8pKDxcL3N0eWxlXGJbXj5dKj4pL2ldLFsibGFuZy1pbi50YWciLC9eKDxcLz9bYS16XVtePD5dKj4pL2ldXSksCitbImRlZmF1bHQtbWFya3VwIiwiaHRtIiwiaHRtbCIsIm14bWwiLCJ4aHRtbCIsInhtbCIsInhzbCJdKTtrKHgoW1sicGxuIiwvXlxzKy8scSwiIFx0XHJcbiJdLFsiYXR2IiwvXig/OiJbXiJdKiI/fCdbXiddKic/KS8scSwiXCInIl1dLFtbInRhZyIsL15ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiYXRuIiwvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSxbImxhbmctdXEudmFsIiwvXj1ccyooW15ccyInPl0qKD86W15ccyInLz5dfFwvKD89XHMpKSkvXSxbInB1biIsL15bLzwtPl0rL10sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqJyhbXiddKyknL2ldLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyooW15ccyInPl0rKS9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctY3NzIiwKKy9ec3R5bGVccyo9XHMqKFteXHMiJz5dKykvaV1dKSxbImluLnRhZyJdKTtrKHgoW10sW1siYXR2IiwvXltcU1xzXSsvXV0pLFsidXEudmFsIl0pO2sodSh7a2V5d29yZHM6RixoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdHlwZXM6S30pLFsiYyIsImNjIiwiY3BwIiwiY3h4IiwiY3ljIiwibSJdKTtrKHUoe2tleXdvcmRzOiJudWxsLHRydWUsZmFsc2UifSksWyJqc29uIl0pO2sodSh7a2V5d29yZHM6SCxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdmVyYmF0aW1TdHJpbmdzOiEwLHR5cGVzOkt9KSxbImNzIl0pO2sodSh7a2V5d29yZHM6RyxjU3R5bGVDb21tZW50czohMH0pLFsiamF2YSJdKTtrKHUoe2tleXdvcmRzOnYsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITB9KSxbImJzaCIsImNzaCIsInNoIl0pO2sodSh7a2V5d29yZHM6SSxoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCx0cmlwbGVRdW90ZWRTdHJpbmdzOiEwfSksCitbImN2IiwicHkiXSk7ayh1KHtrZXl3b3JkczoiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJwZXJsIiwicGwiLCJwbSJdKTtrKHUoe2tleXdvcmRzOkosaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsicmIiXSk7ayh1KHtrZXl3b3Jkczp3LGNTdHlsZUNvbW1lbnRzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbImpzIl0pO2sodSh7a2V5d29yZHM6ImFsbCxhbmQsYnksY2F0Y2gsY2xhc3MsZWxzZSxleHRlbmRzLGZhbHNlLGZpbmFsbHksZm9yLGlmLGluLGlzLGlzbnQsbG9vcCxuZXcsbm8sbm90LG51bGwsb2Ysb2ZmLG9uLG9yLHJldHVybixzdXBlcix0aGVuLHRydWUsdHJ5LHVubGVzcyx1bnRpbCx3aGVuLHdoaWxlLHllcyIsCitoYXNoQ29tbWVudHM6MyxjU3R5bGVDb21tZW50czohMCxtdWx0aWxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsiY29mZmVlIl0pO2soeChbXSxbWyJzdHIiLC9eW1xTXHNdKy9dXSksWyJyZWdleCJdKTt3aW5kb3cucHJldHR5UHJpbnRPbmU9ZnVuY3Rpb24oYSxtLGUpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlBSRSIpO2guaW5uZXJIVE1MPWE7ZSYmRChoLGUpO0Uoe2c6bSxpOmUsaDpofSk7cmV0dXJuIGguaW5uZXJIVE1MfTt3aW5kb3cucHJldHR5UHJpbnQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbSgpe2Zvcih2YXIgZT13aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT04/bC5ub3coKSsyNTA6SW5maW5pdHk7cDxoLmxlbmd0aCYmbC5ub3coKTxlO3ArKyl7dmFyIG49aFtwXSxrPW4uY2xhc3NOYW1lO2lmKGsuaW5kZXhPZigicHJldHR5cHJpbnQiKT49MCl7dmFyIGs9ay5tYXRjaChnKSxmLGI7aWYoYj0KKyFrKXtiPW47Zm9yKHZhciBvPXZvaWQgMCxjPWIuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZyl2YXIgaT1jLm5vZGVUeXBlLG89aT09PTE/bz9iOmM6aT09PTM/Ti50ZXN0KGMubm9kZVZhbHVlKT9iOm86bztiPShmPW89PT1iP3ZvaWQgMDpvKSYmIkNPREUiPT09Zi50YWdOYW1lfWImJihrPWYuY2xhc3NOYW1lLm1hdGNoKGcpKTtrJiYoaz1rWzFdKTtiPSExO2ZvcihvPW4ucGFyZW50Tm9kZTtvO289by5wYXJlbnROb2RlKWlmKChvLnRhZ05hbWU9PT0icHJlInx8by50YWdOYW1lPT09ImNvZGUifHxvLnRhZ05hbWU9PT0ieG1wIikmJm8uY2xhc3NOYW1lJiZvLmNsYXNzTmFtZS5pbmRleE9mKCJwcmV0dHlwcmludCIpPj0wKXtiPSEwO2JyZWFrfWJ8fCgoYj0oYj1uLmNsYXNzTmFtZS5tYXRjaCgvXGJsaW5lbnVtc1xiKD86OihcZCspKT8vKSk/YlsxXSYmYlsxXS5sZW5ndGg/K2JbMV06ITA6ITEpJiZEKG4sYiksZD17ZzprLGg6bixpOmJ9LEUoZCkpfX1wPGgubGVuZ3RoP3NldFRpbWVvdXQobSwKKzI1MCk6YSYmYSgpfWZvcih2YXIgZT1bZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb2RlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInhtcCIpXSxoPVtdLGs9MDtrPGUubGVuZ3RoOysraylmb3IodmFyIHQ9MCxzPWVba10ubGVuZ3RoO3Q8czsrK3QpaC5wdXNoKGVba11bdF0pO3ZhciBlPXEsbD1EYXRlO2wubm93fHwobD17bm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfX0pO3ZhciBwPTAsZCxnPS9cYmxhbmcoPzp1YWdlKT8tKFtcdy5dKykoPyFcUykvO20oKX07d2luZG93LlBSPXtjcmVhdGVTaW1wbGVMZXhlcjp4LHJlZ2lzdGVyTGFuZ0hhbmRsZXI6ayxzb3VyY2VEZWNvcmF0b3I6dSxQUl9BVFRSSUJfTkFNRToiYXRuIixQUl9BVFRSSUJfVkFMVUU6ImF0diIsUFJfQ09NTUVOVDoiY29tIixQUl9ERUNMQVJBVElPTjoiZGVjIixQUl9LRVlXT1JEOiJrd2QiLFBSX0xJVEVSQUw6ImxpdCIsCitQUl9OT0NPREU6Im5vY29kZSIsUFJfUExBSU46InBsbiIsUFJfUFVOQ1RVQVRJT046InB1biIsUFJfU09VUkNFOiJzcmMiLFBSX1NUUklORzoic3RyIixQUl9UQUc6InRhZyIsUFJfVFlQRToidHlwIn19KSgpOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0NvbW1vbi5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvQ29tbW9uLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0NvbW1vbi5zb3kKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBDb21tb24gaGVhZGVyIGZvciBHaXRpbGVzLgorICoKKyAqIEBwYXJhbSB0aXRsZSB0aXRsZSBmb3IgdGhpcyBwYWdlLiBBbHdheXMgc3VmZml4ZWQgd2l0aCByZXBvc2l0b3J5IG5hbWUgYW5kIGEKKyAqICAgICBzaXRld2lkZSB0aXRsZS4KKyAqIEBwYXJhbT8gcmVwb3NpdG9yeU5hbWUgcmVwb3NpdG9yeSBuYW1lIGZvciB0aGlzIHBhZ2UsIGlmIGFwcGxpY2FibGUuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG9wdGlvbmFsIGxpc3Qgb2YgbWVudSBlbnRyaWVzIHdpdGggInRleHQiIGFuZCBvcHRpb25hbAorICogICAgICJ1cmwiIGtleXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgbmF2aWdhdGlvbiBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtPyBjc3Mgb3B0aW9uYWwgbGlzdCBvZiBDU1MgVVJMcyB0byBpbmNsdWRlLgorICogQHBhcmFtPyBqcyBvcHRpb25hbCBsaXN0IG9mIEphdmFzY3JpcHQgVVJMcyB0byBpbmNsdWRlLgorICogQHBhcmFtPyBvbkxvYWQgb3B0aW9uYWwgSmF2YXNjcmlwdCB0byBleGVjdXRlIGluIHRoZSBib2R5J3Mgb25Mb2FkIGhhbmRsZXIuCisgKiAgICAgV2FybmluZzogbm90IGF1dG9lc2NhcGVkLgorICovCit7dGVtcGxhdGUgLmhlYWRlcn0KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPgorICAgIHskdGl0bGV9CisgICAge2lmICRyZXBvc2l0b3J5TmFtZX0KKyAgICAgIHtzcH0tIHskcmVwb3NpdG9yeU5hbWV9CisgICAgey9pZn0KKyAgICB7c3B9LSB7bXNnIGRlc2M9Im5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIn1HaXQgYXQgR29vZ2xley9tc2d9CisgIDwvdGl0bGU+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii8vd3d3Lmdvb2dsZS5jb20vY3NzL2dvLmNzcyIgLz4KKworICB7aWYgJGNzcyBhbmQgbGVuZ3RoKCRjc3MpfQorICAgIHtmb3JlYWNoICR1cmwgaW4gJGNzc30KKyAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskdXJsfSIgLz4KKyAgICB7L2ZvcmVhY2h9CisgIHsvaWZ9CisgIC8vIEluY2x1ZGUgZGVmYXVsdCBDU1MgYWZ0ZXIgY3VzdG9tIENTUyBzbyBpdCBjYW4gb3ZlcnJpZGUgZGVmYXVsdHMgaW4gdGhpcmQtCisgIC8vIHBhcnR5IHN0eWxlc2hlZXRzIChlLmcuIHByZXR0aWZ5KS4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ie2dpdGlsZXMuQ1NTX1VSTH0iIC8+CisKKyAge2lmICRqcyBhbmQgbGVuZ3RoKCRqcyl9CisgICAge2ZvcmVhY2ggJHVybCBpbiAkanN9CisgICAgICA8c2NyaXB0IHNyYz0ieyR1cmx9IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgIHsvZm9yZWFjaH0KKyAgey9pZn0KKzwvaGVhZD4KKzxib2R5IHtpZiAkb25Mb2FkfW9ubG9hZD0ieyRvbkxvYWR8aWR9InsvaWZ9PgorICB7Y2FsbCAuY3VzdG9tSGVhZGVyIC99CisKKyAge2lmICRtZW51RW50cmllcyBhbmQgbGVuZ3RoKCRtZW51RW50cmllcyl9CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAge2ZvcmVhY2ggJGVudHJ5IGluICRtZW51RW50cmllc30KKyAgICAgIHtzcH0KKyAgICAgIHtpZiAkZW50cnkudXJsfQorICAgICAgICA8YSBocmVmPSJ7JGVudHJ5LnVybH0ie2lmIG5vdCBpc0xhc3QoJGVudHJ5KX0gY2xhc3M9ImVudHJ5InsvaWZ9PnskZW50cnkudGV4dH08L2E+CisgICAgICB7ZWxzZX0KKyAgICAgICAgPHNwYW57aWYgbm90IGlzTGFzdCgkZW50cnkpfSBjbGFzcz0iZW50cnkiey9pZn0+eyRlbnRyeS50ZXh0fTwvc3Bhbj4KKyAgICAgIHsvaWZ9CisgICAgey9mb3JlYWNofQorICAgIHtzcH0KKyAgICA8L2Rpdj4KKyAgey9pZn0KKworICB7aWYgJGJyZWFkY3J1bWJzIGFuZCBsZW5ndGgoJGJyZWFkY3J1bWJzKX0KKyAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyI+CisgICAgICB7Zm9yZWFjaCAkZW50cnkgaW4gJGJyZWFkY3J1bWJzfQorICAgICAgICB7aWYgbm90IGlzRmlyc3QoJGVudHJ5KX17c3B9L3tzcH17L2lmfQorICAgICAgICB7aWYgbm90IGlzTGFzdCgkZW50cnkpfQorICAgICAgICAgIDxhIGhyZWY9InskZW50cnkudXJsfSI+eyRlbnRyeS50ZXh0fTwvYT4KKyAgICAgICAge2Vsc2V9CisgICAgICAgICAgeyRlbnRyeS50ZXh0fQorICAgICAgICB7L2lmfQorICAgICAgey9mb3JlYWNofQorICAgIDwvZGl2PgorICB7L2lmfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBTdGFuZGFyZCBmb290ZXIuCisgKi8KK3t0ZW1wbGF0ZSAuZm9vdGVyfQorPC9ib2R5PgorPC9odG1sPgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EZWZhdWx0Q3VzdG9tVGVtcGxhdGVzLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EZWZhdWx0Q3VzdG9tVGVtcGxhdGVzLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY1ZDllCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RlZmF1bHRDdXN0b21UZW1wbGF0ZXMuc295CkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGVmYXVsdCBjdXN0b20gaGVhZGVyIGltcGxlbWVudGF0aW9uIGZvciBHaXRpbGVzLgorICovCit7dGVtcGxhdGUgLmN1c3RvbUhlYWRlcn0KKzxoMT57bXNnIGRlc2M9InNob3J0IG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIn1HaXRpbGVzey9tc2d9PC9oMT4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGlmZkRldGFpbC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGlmZkRldGFpbC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkOGFmMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EaWZmRGV0YWlsLnNveQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERldGFpbCBwYWdlIHNob3dpbmcgZGlmZnMgZm9yIGEgc2luZ2xlIGNvbW1pdC4KKyAqCisgKiBAcGFyYW0gdGl0bGUgaHVtYW4tcmVhZGFibGUgcmV2aXNpb24gbmFtZS4KKyAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBuYW1lIG9mIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0/IGNvbW1pdCBvcHRpb25hbCBjb21taXQgZm9yIHdoaWNoIGRpZmZzIGFyZSBkaXNwbGF5ZWQsIHdpdGgga2V5cworICogICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdGlsZXMuY29tbWl0RGV0YWlsIHRlbXBsYXRlIChtaW51cyAiZGlmZlRyZWUiKS4KKyAqLwore3RlbXBsYXRlIC5kaWZmRGV0YWlsfQore2NhbGwgLmhlYWRlciBkYXRhPSJhbGwiIC99CisKK3tpZiAkY29tbWl0fQorICB7Y2FsbCAuY29tbWl0RGV0YWlsIGRhdGE9IiRjb21taXQiIC99Cit7L2lmfQorPGRpdiBpZD0iRElGRl9PVVRQVVRfQkxPQ0siIC8+CisKK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CisKKy8qKgorICogRmlsZSBoZWFkZXIgZm9yIGEgc2luZ2xlIHVuaWZpZWQgZGlmZiBwYXRjaC4KKyAqCisgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGhlYWRlciwgd2l0aCBubyB0cmFpbGluZyBMRi4KKyAqIEBwYXJhbSByZXN0IHJlbWFpbmluZyBsaW5lcyBvZiB0aGUgaGVhZGVyLCBpZiBhbnkuCisgKiBAcGFyYW0gZmlsZUluZGV4IHBvc2l0aW9uIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUgZGlmZmVyZW5jZS4KKyAqLwore3RlbXBsYXRlIC5kaWZmSGVhZGVyfQorPHByZSBjbGFzcz0iZGlmZi1oZWFkZXIiPgorPGEgbmFtZT0iRnskZmlsZUluZGV4fSIgY2xhc3M9ImRpZmYtZ2l0Ij57JGZpcnN0fTwvYT57XG59Cit7JHJlc3R9Cis8L3ByZT4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvSG9zdEluZGV4LnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Ib3N0SW5kZXguc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTk2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvSG9zdEluZGV4LnNveQpAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIEhUTUwgcGFnZSBmb3IgLy4KKyAqCisgKiBAcGFyYW0gaG9zdE5hbWUgaG9zdCBuYW1lLgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYmFzZVVybCBiYXNlIFVSTCBmb3IgcmVwb3NpdG9yaWVzLgorICogQHBhcmFtIHJlcG9zaXRvcmllcyBsaXN0IG9mIHJlcG9zaXRvcnkgZGVzY3JpcHRpb24gbWFwcyB3aXRoIG5hbWUsIGNsb25lVXJsLAorICogICAgIGFuZCBvcHRpb25hbCBkZXNjcmlwdGlvbiB2YWx1ZXMuCisgKi8KK3t0ZW1wbGF0ZSAuaG9zdEluZGV4fQore2NhbGwgLmhlYWRlcn0KKyAge3BhcmFtIHRpdGxlOiAkaG9zdE5hbWUgPyAkaG9zdE5hbWUgKyAnIEdpdCByZXBvc2l0b3JpZXMnIDogJ0dpdCByZXBvc2l0b3JpZXMnIC99CisgIHtwYXJhbSBtZW51RW50cmllczogJG1lbnVFbnRyaWVzIC99CisgIHtwYXJhbSBicmVhZGNydW1iczogbnVsbCAvfQorey9jYWxsfQorCit7aWYgbGVuZ3RoKCRyZXBvc2l0b3JpZXMpfQorCisgIDxoMj4KKyAgICB7bXNnIGRlc2M9IkdpdCByZXBvc2l0b3JpZXMgYXZhaWxhYmxlIG9uIHRoZSBob3N0In0KKyAgICAgIHskaG9zdE5hbWV9IEdpdCByZXBvc2l0b3JpZXMKKyAgICB7L21zZ30KKyAgPC9oMj4KKworICA8ZGl2IGNsYXNzPSJpbnN0cnVjdGlvbnMiPgorICAgIHttc2cgZGVzYz0iZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSB0aGlzIHJlcG9zaXRvcnkifQorICAgIFRvIGNsb25lIG9uZSBvZiB0aGVzZSByZXBvc2l0b3JpZXMsIGluc3RhbGx7c3B9CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5naXQtc2NtLmNvbS8iPmdpdDwvYT4sIGFuZCBydW46CisgICAgPHByZT5naXQgY2xvbmUgeyRiYXNlVXJsfTxlbT5uYW1lPC9lbT48L3ByZT4KKyAgICB7L21zZ30KKyAgPC9kaXY+CisKKyAgPHRhYmxlIGNsYXNzPSJsaXN0Ij4KKyAgICA8dHIgY2xhc3M9Im5vLWhvdmVyIj4KKyAgICAgIDx0aCB3aWR0aD0iMjUlIj4KKyAgICAgICAge21zZyBkZXNjPSJjb2x1bW4gaGVhZGVyIGZvciByZXBvc2l0b3J5IG5hbWUifQorICAgICAgICAgIE5hbWUKKyAgICAgICAgey9tc2d9CisgICAgICA8L3RoPgorICAgICAgPHRoPgorICAgICAgICB7bXNnIGRlc2M9ImNvbHVtbiBoZWFkZXIgZm9yIHJlcG9zaXRvcnkgZGVzY3JpcHRpb24ifQorICAgICAgICAgIERlc2NyaXB0aW9uCisgICAgICAgIHsvbXNnfQorICAgICAgPC90aD4KKyAgICA8L3RyPgorICAgIHtmb3JlYWNoICRyZXBvIGluICRyZXBvc2l0b3JpZXN9CisgICAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8YSBocmVmPSJ7JHJlcG8udXJsfSI+eyRyZXBvLm5hbWV9PC9hPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+eyRyZXBvLmRlc2NyaXB0aW9ufTwvdGQ+CisgICAgICA8L3RyPgorICAgIHsvZm9yZWFjaH0KKyAgPC90YWJsZT4KKyAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KKyAgICA8YSBocmVmPSI/Zm9ybWF0PVRFWFQiPnttc2cgZGVzYz0idGV4dCBmb3JtYXQifVRYVHsvbXNnfTwvYT4KKyAgICB7c3B9CisgICAgPGEgaHJlZj0iP2Zvcm1hdD1KU09OIj57bXNnIGRlc2M9IkpTT04gZm9ybWF0In1KU09Oey9tc2d9PC9hPgorICA8L2Rpdj4KK3svaWZ9Cit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0xvZ0RldGFpbC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvTG9nRGV0YWlsLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFlOWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0xvZ0RldGFpbC5zb3kKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZXRhaWwgcGFnZSBzaG93aW5nIGEgc2hvcnRsb2cgZm9yIGEgY29tbWl0LgorICoKKyAqIEBwYXJhbSB0aXRsZSBodW1hbi1yZWFkYWJsZSByZXZpc2lvbiBuYW1lLgorICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIG5hbWUgb2YgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbT8gdGFncyBvcHRpb25hbCBsaXN0IG9mIHRhZ3MgZW5jb3VudGVyZWQgd2hlbiBwZWVsaW5nIHRoaXMgb2JqZWN0LCB3aXRoCisgKiAgICAga2V5cyBjb3JyZXNwb25kaW5nIHRvIGdpdGlsZXMudGFnRGV0YWlsLgorICogQHBhcmFtIGVudHJpZXMgbGlzdCBvZiBsb2cgZW50cmllczsgc2VlIC5sb2dFbnRyeS4KKyAqIEBwYXJhbT8gbmV4dFVybCBVUkwgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgcmVzdWx0cy4KKyAqIEBwYXJhbT8gcHJldmlvdXNVcmwgVVJMIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiByZXN1bHRzLgorICovCit7dGVtcGxhdGUgLmxvZ0RldGFpbH0KK3tjYWxsIC5oZWFkZXIgZGF0YT0iYWxsIiAvfQorCit7aWYgJHRhZ3N9CisgIHtmb3JlYWNoICR0YWcgaW4gJHRhZ3N9CisgICAge2NhbGwgZ2l0aWxlcy50YWdEZXRhaWwgZGF0YT0iJHRhZyIgL30KKyAgey9mb3JlYWNofQorey9pZn0KKwore2lmICRwcmV2aW91c1VybH0KKyAgPGRpdiBjbGFzcz0ibG9nLW5hdiI+CisgICAgPGEgaHJlZj0ieyRwcmV2aW91c1VybH0iPnttc2cgZGVzYz0idGV4dCBmb3IgcHJldmlvdXMgVVJMIn0mbGFxdW87IFByZXZpb3Vzey9tc2d9PC9hPgorICA8L2Rpdj4KK3svaWZ9CisKK3tpZiBsZW5ndGgoJGVudHJpZXMpfQorICA8b2wgY2xhc3M9InNob3J0bG9nIj4KKyAgICB7Zm9yZWFjaCAkZW50cnkgaW4gJGVudHJpZXN9CisgICAgICA8bGl7aWYgJHByZXZpb3VzVXJsIGFuZCBpc0ZpcnN0KCRlbnRyeSl9IGNsYXNzPSJmaXJzdCJ7L2lmfT4KKyAgICAgICAge2NhbGwgLmxvZ0VudHJ5IGRhdGE9IiRlbnRyeSIgL30KKyAgICAgIDwvbGk+CisgICAgey9mb3JlYWNofQorICA8L29sPgore2Vsc2V9CisgIDxwPnttc2cgZGVzYz0iaW5mb3JtYXRpb25hbCB0ZXh0IGZvciB3aGVuIHRoZSBsb2cgaXMgZW1wdHkifU5vIGNvbW1pdHMuey9tc2d9PC9wPgorey9pZn0KKwore2lmICRuZXh0VXJsfQorICA8ZGl2IGNsYXNzPSJsb2ctbmF2Ij4KKyAgICA8YSBocmVmPSJ7JG5leHRVcmx9Ij57bXNnIGRlc2M9InRleHQgZm9yIG5leHQgVVJMIn1OZXh0ICZyYXF1bzt7L21zZ308L2E+CisgIDwvZGl2Pgorey9pZn0KKwore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBTaW5nbGUgc2hvcnRsb2cgZW50cnkuCisgKgorICogQHBhcmFtIGFiYnJldlNoYSBhYmJyZXZpYXRlZCBTSEEtMS4KKyAqIEBwYXJhbSB1cmwgVVJMIHRvIGNvbW1pdCBkZXRhaWwgcGFnZS4KKyAqIEBwYXJhbSBzaG9ydE1lc3NhZ2Ugc2hvcnQgY29tbWl0IG1lc3NhZ2UuCisgKiBAcGFyYW0gYXV0aG9yIGF1dGhvciBpbmZvcm1hdGlvbiB3aXRoIGF0IGxlYXN0ICJuYW1lIiBhbmQgInJlbGF0aXZlVGltZSIga2V5cy4KKyAqIEBwYXJhbSBicmFuY2hlcyBsaXN0IG9mIGJyYW5jaGVzIGZvciB0aGlzIGVudHJ5LCB3aXRoICJuYW1lIiBhbmQgInVybCIga2V5cy4KKyAqIEBwYXJhbSB0YWdzIGxpc3Qgb2YgdGFncyBmb3IgdGhpcyBlbnRyeSwgd2l0aCAibmFtZSIgYW5kICJ1cmwiIGtleXMuCisgKi8KK3t0ZW1wbGF0ZSAubG9nRW50cnl9Cis8YSBocmVmPSJ7JHVybH0iPgorICA8c3BhbiBjbGFzcz0ic2hhMSI+eyRhYmJyZXZTaGF9PC9zcGFuPgorICAvLyBuYnNwIGluc3RhZCBvZiBDU1MgcGFkZGluZy9tYXJnaW4gYmVjYXVzZSB0aG9zZSBjYXVzZSBhIGJyZWFrIGluIHRoZQorICAvLyB1bmRlcmxpbmUuCisgICZuYnNwOworICB7c3B9PHNwYW4gY2xhc3M9ImNvbW1pdC1tZXNzYWdlIj57JHNob3J0TWVzc2FnZX08L3NwYW4+Cis8L2E+Cit7c3B9PHNwYW4gY2xhc3M9ImF1dGhvciI+e21zZyBkZXNjPSJjb21taXQgYXV0aG9yIG5hbWUifWJ5IHskYXV0aG9yLm5hbWV9ey9tc2d9PC9zcGFuPgore3NwfTxzcGFuIGNsYXNzPSJ0aW1lIj4tIHskYXV0aG9yLnJlbGF0aXZlVGltZX08L3NwYW4+Cit7aWYgbGVuZ3RoKCRicmFuY2hlcyl9CisgIHtmb3JlYWNoICRicmFuY2ggaW4gJGJyYW5jaGVzfQorICAgIHtzcH08YSBocmVmPSJ7JGJyYW5jaC51cmx9IiBjbGFzcz0iYnJhbmNoLWxhYmVsIj57JGJyYW5jaC5uYW1lfTwvYT4KKyAgey9mb3JlYWNofQorey9pZn0KK3tpZiBsZW5ndGgoJHRhZ3MpfQorICB7Zm9yZWFjaCAkdGFnIGluICR0YWdzfQorICAgIHtzcH08YSBocmVmPSJ7JHRhZy51cmx9IiBjbGFzcz0idGFnLWxhYmVsIj57JHRhZy5uYW1lfTwvYT4KKyAgey9mb3JlYWNofQorey9pZn0KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvT2JqZWN0RGV0YWlsLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9PYmplY3REZXRhaWwuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZGY0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvT2JqZWN0RGV0YWlsLnNveQpAQCAtMCwwICsxLDI5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZXRhaWxlZCBsaXN0aW5nIG9mIGEgY29tbWl0LgorICoKKyAqIEBwYXJhbSBhdXRob3IgbWFwIHdpdGggIm5hbWUiLCAiZW1haWwiLCBhbmQgInRpbWUiIGtleXMgZm9yIHRoZSBjb21taXQgYXV0aG9yLgorICogQHBhcmFtIGNvbW1pdHRlciBtYXAgd2l0aCAibmFtZSIsICJlbWFpbCIsIGFuZCAidGltZSIga2V5cyBmb3IgdGhlIGNvbW1pdHRlci4KKyAqIEBwYXJhbSBzaGEgY29tbWl0IFNIQS0xLgorICogQHBhcmFtIHRyZWUgdHJlZSBTSEEtMS4KKyAqIEBwYXJhbSB0cmVlVXJsIHRyZWUgVVJMLgorICogQHBhcmFtIHBhcmVudHMgbGlzdCBvZiBwYXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAqICAgICBzaGE6IFNIQS0xLgorICogICAgIHVybDogVVJMIHRvIHZpZXcgdGhlIHBhcmVudCBjb21taXQuCisgKiAgICAgZGlmZlVybDogVVJMIHRvIGRpc3BsYXkgZGlmZnMgcmVsYXRpdmUgdG8gdGhpcyBwYXJlbnQuCisgKiBAcGFyYW0gbWVzc2FnZSBsaXN0IG9mIGNvbW1pdCBtZXNzYWdlIHBhcnRzLCB3aGVyZSBlYWNoIHBhcnQgY29udGFpbnM6CisgKiAgICAgdGV4dDogcmF3IHRleHQgb2YgdGhlIHBhcnQuCisgKiAgICAgdXJsOiBvcHRpb25hbCBVUkwgdGhhdCBzaG91bGQgYmUgbGlua2VkIHRvIGZyb20gdGhlIHBhcnQuCisgKiBAcGFyYW0gZGlmZlRyZWUgbGlzdCBvZiBjaGFuZ2VkIHRyZWUgZW50cmllcyB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAqICAgICBjaGFuZ2VUeXBlOiBzdHJpbmcgbWF0Y2hpbmcgYW4gb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeS5DaGFuZ2VUeXBlCisgKiAgICAgICAgIGNvbnN0YW50LgorICogICAgIHBhdGg6IChuZXcpIHBhdGggb2YgdGhlIHRyZWUgZW50cnkuCisgKiAgICAgb2xkUGF0aDogb2xkIHBhdGgsIG9ubHkgZm9yIHJlbmFtZXMgYW5kIGNvcGllcy4KKyAqICAgICB1cmw6IFVSTCB0byBhIGRldGFpbCBwYWdlIGZvciB0aGUgdHJlZSBlbnRyeS4KKyAqICAgICBkaWZmVXJsOiBVUkwgdG8gYSBkaWZmIHBhZ2UgZm9yIHRoZSB0cmVlIGVudHJ5J3MgZGlmZiBpbiB0aGlzIGNvbW1pdC4KKyAqIEBwYXJhbSBsb2dVcmwgVVJMIHRvIGEgbG9nIHBhZ2Ugc3RhcnRpbmcgYXQgdGhpcyBjb21taXQuCisgKi8KK3t0ZW1wbGF0ZSAuY29tbWl0RGV0YWlsfQorPGRpdiBjbGFzcz0iZ2l0LWNvbW1pdCI+CisgIDx0YWJsZT4KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIGNvbW1pdCBTSEEgZW50cnkifWNvbW1pdHsvbXNnfTwvdGg+CisgICAgICA8dGQgY2xhc3M9InNoYSI+CisgICAgICAgIHskc2hhfQorICAgICAgICA8c3BhbiBjbGFzcz0ibG9nLWxpbmsiPgorICAgICAgICAgIFs8YSBocmVmPSJ7JGxvZ1VybH0iPnttc2cgZGVzYz0idGV4dCBmb3IgdGhlIGxvZyBsaW5rIn1sb2d7L21zZ308L2E+XQorICAgICAgICA8L3NwYW4+CisgICAgICA8L3RkPgorICAgICAgPHRkPntzcH08L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciBjb21taXQgYXV0aG9yIn1hdXRob3J7L21zZ308L3RoPgorICAgICAgPHRkPntjYWxsIC5wZXJzb25fIGRhdGE9IiRhdXRob3IiIC99PC90ZD4KKyAgICAgIDx0ZD57JGF1dGhvci50aW1lfTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIGNvbW1pdHRlciJ9Y29tbWl0dGVyey9tc2d9PC90aD4KKyAgICAgIDx0ZD57Y2FsbCAucGVyc29uXyBkYXRhPSIkY29tbWl0dGVyIiAvfTwvdGQ+CisgICAgICA8dGQ+eyRjb21taXR0ZXIudGltZX08L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciB0cmVlIFNIQSBlbnRyeSJ9dHJlZXsvbXNnfTwvdGg+CisgICAgICA8dGQgY2xhc3M9InNoYSI+PGEgaHJlZj0ieyR0cmVlVXJsfSI+eyR0cmVlfTwvYT48L3RkPgorICAgIDwvdHI+CisgICAge2ZvcmVhY2ggJHBhcmVudCBpbiAkcGFyZW50c30KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciBwYXJlbnQgU0hBIn1wYXJlbnR7L21zZ308L3RoPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGEgaHJlZj0ieyRwYXJlbnQudXJsfSI+eyRwYXJlbnQuc2hhfTwvYT4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1saW5rIj4KKyAgICAgICAgICAgIFs8YSBocmVmPSJ7JHBhcmVudC5kaWZmVXJsfSI+e21zZyBkZXNjPSJ0ZXh0IGZvciB0aGUgcGFyZW50IGRpZmYgbGluayJ9ZGlmZnsvbXNnfTwvYT5dCisgICAgICAgICAgPC9zcGFuPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICB7L2ZvcmVhY2h9CisgIDwvdGFibGU+Cis8L2Rpdj4KK3tjYWxsIC5tZXNzYWdlX30KKyAge3BhcmFtIGNsYXNzTmFtZTogJ2NvbW1pdC1tZXNzYWdlJyAvfQorICB7cGFyYW0gbWVzc2FnZTogJG1lc3NhZ2UgL30KK3svY2FsbH0KKwore2lmICRkaWZmVHJlZSBhbmQgbGVuZ3RoKCRkaWZmVHJlZSl9CisgIDx1bCBjbGFzcz0iZGlmZi10cmVlIj4KKyAgICB7Zm9yZWFjaCAkZW50cnkgaW4gJGRpZmZUcmVlfQorICAgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7JGVudHJ5LnVybH0iPnskZW50cnkucGF0aH08L2E+CisgICAgICAgIHtzd2l0Y2ggJGVudHJ5LmNoYW5nZVR5cGV9CisgICAgICAgICAge2Nhc2UgJ0FERCd9CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWRkIj4KKyAgICAgICAgICAgICAge21zZyBkZXNjPSJUZXh0IGZvciBhIG5ldyB0cmVlIGVudHJ5In0KKyAgICAgICAgICAgICAgICBbQWRkZWQgLSA8YSBocmVmPSJ7JGVudHJ5LmRpZmZVcmx9Ij5kaWZmPC9hPl0KKyAgICAgICAgICAgICAgey9tc2d9CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAge2Nhc2UgJ01PRElGWSd9CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibW9kaWZ5Ij4KKyAgICAgICAgICAgICAge21zZyBkZXNjPSJUZXh0IGZvciBhIG1vZGlmaWVkIHRyZWUgZW50cnkifQorICAgICAgICAgICAgICAgIFs8YSBocmVmPSJ7JGVudHJ5LmRpZmZVcmx9Ij5kaWZmPC9hPl0KKyAgICAgICAgICAgICAgey9tc2d9CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAge2Nhc2UgJ0RFTEVURSd9CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVsZXRlIj4KKyAgICAgICAgICAgICAge21zZyBkZXNjPSJUZXh0IGZvciBhIGRlbGV0ZWQgdHJlZSBlbnRyeSJ9CisgICAgICAgICAgICAgICAgW0RlbGV0ZWQgLSA8YSBocmVmPSJ7JGVudHJ5LmRpZmZVcmx9Ij5kaWZmPC9hPl0KKyAgICAgICAgICAgICAgey9tc2d9CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAge2Nhc2UgJ1JFTkFNRSd9CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0icmVuYW1lIj4KKyAgICAgICAgICAgICAge21zZyBkZXNjPSJUZXh0IGZvciBhIHJlbmFtZWQgdHJlZSBlbnRyeSJ9CisgICAgICAgICAgICAgICAgW1JlbmFtZWQgZnJvbSB7JGVudHJ5Lm9sZFBhdGh9IC0gPGEgaHJlZj0ieyRlbnRyeS5kaWZmVXJsfSI+ZGlmZjwvYT5dCisgICAgICAgICAgICAgIHsvbXNnfQorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIHtjYXNlICdDT1BZJ30KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3B5Ij4KKyAgICAgICAgICAgICAge21zZyBkZXNjPSJUZXh0IGZvciBhIGNvcGllZCB0cmVlIGVudHJ5In0KKyAgICAgICAgICAgICAgICBbQ29waWVkIGZyb20geyRlbnRyeS5vbGRQYXRofSAtIDxhIGhyZWY9InskZW50cnkuZGlmZlVybH0iPmRpZmY8L2E+XQorICAgICAgICAgICAgICB7L21zZ30KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICB7ZGVmYXVsdH0KKyAgICAgICAgey9zd2l0Y2h9CisgICAgICA8L2xpPgorICAgIHsvZm9yZWFjaH0KKyAgPC91bD4KKyAgPGRpdiBjbGFzcz0iZGlmZi1zdW1tYXJ5Ij4KKyAgICB7aWYgbGVuZ3RoKCRkaWZmVHJlZSkgPT0gMX0KKyAgICAgIHttc2cgZGVzYz0iMSBmaWxlIGNoYW5nZWQifTEgZmlsZSBjaGFuZ2Vkey9tc2d9CisgICAge2Vsc2V9CisgICAgICB7bXNnIGRlc2M9Im51bWJlciBvZiBmaWxlcyBjaGFuZ2VkIn17bGVuZ3RoKCRkaWZmVHJlZSl9IGZpbGVzIGNoYW5nZWR7L21zZ30KKyAgICB7L2lmfQorICA8L2Rpdj4KK3svaWZ9CisKK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsZWQgbGlzdGluZyBvZiBhIHRyZWUuCisgKgorICogQHBhcmFtIHNoYSBTSEEgb2YgdGhpcyBwYXRoJ3MgdHJlZS4KKyAqIEBwYXJhbT8gbG9nVXJsIG9wdGlvbmFsIFVSTCB0byBhIGxvZyBmb3IgdGhpcyBwYXRoLgorICogQHBhcmFtIGVudHJpZXMgbGlzdCBvZiBlbnRyaWVzIHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgorICogICAgIHR5cGU6IGVudHJ5IHR5cGUsIG1hdGNoaW5nIG9uZSBvZiB0aGUgY29uc3RhbnQgbmFtZXMgZGVmaW5lZCBpbgorICogICAgICAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZS4KKyAqICAgICBuYW1lOiB0cmVlIGVudHJ5IG5hbWUuCisgKiAgICAgdXJsOiBVUkwgdG8gbGluayB0by4KKyAqICAgICB0YXJnZXROYW1lOiBuYW1lIG9mIGEgc3ltbGluayB0YXJnZXQsIHJlcXVpcmVkIG9ubHkgaWYgdHlwZSA9PSAnU1lNTElOSycuCisgKiAgICAgdGFyZ2V0VXJsOiBvcHRpb25hbCB1cmwgb2YgYSBzeW1saW5rIHRhcmdldCwgcmVxdWlyZWQgb25seSBpZgorICogICAgICAgICB0eXBlID09ICdTWU1MSU5LJy4KKyAqLwore3RlbXBsYXRlIC50cmVlRGV0YWlsfQorPGRpdiBjbGFzcz0ic2hhMSI+CisgIHttc2cgZGVzYz0iU0hBLTEgZm9yIHRoZSBwYXRoJ3MgdHJlZSJ9dHJlZTogeyRzaGF9ey9tc2d9CisgIHtpZiAkbG9nVXJsfXtzcH1bPGEgaHJlZj0ieyRsb2dVcmx9Ij57bXNnIGRlc2M9Imhpc3RvcnkgZm9yIGEgcGF0aCJ9cGF0aCBoaXN0b3J5ey9tc2d9PC9hPl17L2lmfQorPC9kaXY+CisKK3tpZiBsZW5ndGgoJGVudHJpZXMpfQorICA8b2wgY2xhc3M9Imxpc3QgZmlsZXMiPgorICAgIHtmb3JlYWNoICRlbnRyeSBpbiAkZW50cmllc30KKyAgICAgIDxsaSBjbGFzcz0iCisgICAgICAgICAgICB7c3dpdGNoICRlbnRyeS50eXBlfQorICAgICAgICAgICAgICB7Y2FzZSAnVFJFRSd9Z2l0LXRyZWUKKyAgICAgICAgICAgICAge2Nhc2UgJ1NZTUxJTksnfXN5bWxpbmsKKyAgICAgICAgICAgICAge2Nhc2UgJ1JFR1VMQVJfRklMRSd9cmVndWxhci1maWxlCisgICAgICAgICAgICAgIHtjYXNlICdFWEVDVVRBQkxFX0ZJTEUnfWV4ZWN1dGFibGUtZmlsZQorICAgICAgICAgICAgICB7Y2FzZSAnR0lUTElOSyd9Z2l0bGluaworICAgICAgICAgICAgICB7ZGVmYXVsdH1yZWd1bGFyLWZpbGUKKyAgICAgICAgICAgIHsvc3dpdGNofQorICAgICAgICAgICAgIiB0aXRsZT0iCisgICAgICAgICAgICB7c3dpdGNoICRlbnRyeS50eXBlfQorICAgICAgICAgICAgICB7Y2FzZSAnVFJFRSd9e21zZyBkZXNjPSJBbHQgdGV4dCBmb3IgdHJlZSBpY29uIn1UcmVley9tc2d9CisgICAgICAgICAgICAgIHtjYXNlICdTWU1MSU5LJ317bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciBzeW1saW5rIGljb24ifVN5bWxpbmt7L21zZ30KKyAgICAgICAgICAgICAge2Nhc2UgJ1JFR1VMQVJfRklMRSd9e21zZyBkZXNjPSJBbHQgdGV4dCBmb3IgcmVndWxhciBmaWxlIGljb24ifVJlZ3VsYXIgZmlsZXsvbXNnfQorICAgICAgICAgICAgICB7Y2FzZSAnRVhFQ1VUQUJMRV9GSUxFJ30KKyAgICAgICAgICAgICAgICB7bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciBleGVjdXRhYmxlIGZpbGUgaWNvbiJ9RXhlY3V0YWJsZSBmaWxley9tc2d9CisgICAgICAgICAgICAgIHtjYXNlICdHSVRMSU5LJ30KKyAgICAgICAgICAgICAgICB7bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciBnaXQgc3VibW9kdWxlIGxpbmsgaWNvbiJ9R2l0IHN1Ym1vZHVsZSBsaW5rey9tc2d9CisgICAgICAgICAgICAgIHtkZWZhdWx0fXttc2cgZGVzYz0iQWx0IHRleHQgZm9yIG90aGVyIGZpbGUgaWNvbiJ9T3RoZXJ7L21zZ30KKyAgICAgICAgICAgIHsvc3dpdGNofQorICAgICAgICAgICAgLSB7JGVudHJ5Lm5hbWV9Ij4KKyAgICAgICAgPGEgaHJlZj0ieyRlbnRyeS51cmx9Ij57JGVudHJ5Lm5hbWV9PC9hPgorICAgICAgICB7aWYgJGVudHJ5LnR5cGUgPT0gJ1NZTUxJTksnfQorICAgICAgICAgIHtzcH0mI3gyMWU4O3tzcH0KKyAgICAgICAgICB7aWYgJGVudHJ5LnRhcmdldFVybH0KKyAgICAgICAgICAgIDxhIGhyZWY9InskZW50cnkudGFyZ2V0VXJsfSI+eyRlbnRyeS50YXJnZXROYW1lfTwvYT4KKyAgICAgICAgICB7ZWxzZX0KKyAgICAgICAgICAgIHskZW50cnkudGFyZ2V0TmFtZX0KKyAgICAgICAgICB7L2lmfQorICAgICAgICB7L2lmfQorICAgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IFNvbWV0aGluZyByZWFzb25hYmxlIGZvciBnaXRsaW5rcy4KKyAgICAgIDwvbGk+CisgICAgey9mb3JlYWNofQorICA8L3RhYmxlPgore2Vsc2V9CisgIDxwPnttc2cgZGVzYz0iSW5mb3JtYXRpb25hbCB0ZXh0IGZvciB3aGVuIGEgdHJlZSBpcyBlbXB0eSJ9VGhpcyB0cmVlIGlzIGVtcHR5LnsvbXNnfTwvcD4KK3svaWZ9Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbGVkIGxpc3Rpbmcgb2YgYSBibG9iLgorICoKKyAqIEBwYXJhbSBzaGEgU0hBIG9mIHRoaXMgZmlsZSdzIGJsb2IuCisgKiBAcGFyYW0/IGxvZ1VybCBvcHRpb25hbCBVUkwgdG8gYSBsb2cgZm9yIHRoaXMgZmlsZS4KKyAqIEBwYXJhbSBkYXRhIGZpbGUgZGF0YSAobWF5IGJlIGVtcHR5KSwgb3IgbnVsbCBmb3IgYSBiaW5hcnkgZmlsZS4KKyAqIEBwYXJhbT8gbGFuZyBwcmV0dHlwcmludCBsYW5ndWFnZSBleHRlbnNpb24gZm9yIHRleHQgZmlsZS4KKyAqIEBwYXJhbT8gc2l6ZSBmb3IgYmluYXJ5IGZpbGVzIG9ubHksIHNpemUgaW4gYnl0ZXMuCisgKi8KK3t0ZW1wbGF0ZSAuYmxvYkRldGFpbH0KKzxkaXYgY2xhc3M9InNoYTEiPgorICB7bXNnIGRlc2M9IlNIQS0xIGZvciB0aGUgZmlsZSdzIGJsb2IifWJsb2I6IHskc2hhfXsvbXNnfQorICB7aWYgJGxvZ1VybH17c3B9WzxhIGhyZWY9InskbG9nVXJsfSI+e21zZyBkZXNjPSJoaXN0b3J5IGZvciBhIGZpbGUifWZpbGUgaGlzdG9yeXsvbXNnfTwvYT5dey9pZn0KKzwvZGl2PgorCit7aWYgJGRhdGEgIT0gbnVsbH0KKyAge2lmICRkYXRhfQorICAgIHtpZiAkbGFuZyAhPSBudWxsfQorICAgICAgPHByZSBjbGFzcz0iZ2l0LWJsb2IgcHJldHR5cHJpbnQgbGluZW51bXMgbGFuZy17JGxhbmd9Ij57JGRhdGF9PC9wcmU+CisgICAge2Vsc2V9CisgICAgICA8cHJlIGNsYXNzPSJnaXQtYmxvYiI+eyRkYXRhfTwvcHJlPgorICAgIHsvaWZ9CisgIHtlbHNlfQorICAgIDxkaXYgY2xhc3M9ImZpbGUtZW1wdHkiPkVtcHR5IGZpbGU8L2Rpdj4KKyAgey9pZn0KK3tlbHNlfQorICA8ZGl2IGNsYXNzPSJmaWxlLWJpbmFyeSI+CisgICAge21zZyBkZXNjPSJzaXplIG9mIGJpbmFyeSBmaWxlIGluIGJ5dGVzIn17JHNpemV9LWJ5dGUgYmluYXJ5IGZpbGV7L21zZ30KKyAgPC9kaXY+Cit7L2lmfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWxlZCBsaXN0aW5nIG9mIGFuIGFubm90YXRlZCB0YWcuCisgKgorICogQHBhcmFtIHNoYSBTSEEgb2YgdGhpcyB0YWcuCisgKiBAcGFyYW0/IHRhZ2dlciBvcHRpb25hbCBtYXAgd2l0aCAibmFtZSIsICJlbWFpbCIsIGFuZCAidGltZSIga2V5cyBmb3IgdGhlCisgKiAgICAgdGFnZ2VyLgorICogQHBhcmFtIG9iamVjdCBTSEEgb2YgdGhlIG9iamVjdCB0aGlzIHRhZyBwb2ludHMgdG8uCisgKiBAcGFyYW0gbWVzc2FnZSB0YWcgbWVzc2FnZS4KKyAqLwore3RlbXBsYXRlIC50YWdEZXRhaWx9Cis8ZGl2IGNsYXNzPSJnaXQtdGFnIj4KKyAgPHRhYmxlPgorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgdGFnIFNIQSBlbnRyeSJ9dGFney9tc2d9PC90aD4KKyAgICAgIDx0ZCBjbGFzcz0ic2hhIj57JHNoYX08L3RkPgorICAgICAgPHRkPntzcH08L3RkPgorICAgIDwvdHI+CisgICAge2lmICR0YWdnZXJ9CisgICAgICA8dHI+CisgICAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgdGFnZ2VyIn10YWdnZXJ7L21zZ308L3RoPgorICAgICAgICA8dGQ+e2NhbGwgLnBlcnNvbl8gZGF0YT0iJHRhZ2dlciIgL308L3RkPgorICAgICAgICA8dGQ+eyR0YWdnZXIudGltZX08L3RkPgorICAgICAgPC90cj4KKyAgICB7L2lmfQorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgdGFnZ2VkIG9iamVjdCBTSEEifW9iamVjdHsvbXNnfTwvdGg+CisgICAgICA8dGQgY2xhc3M9InNoYSI+eyRvYmplY3R9PC90ZD4KKyAgICAgIDx0ZD57c3B9PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorPC9kaXY+Cit7aWYgJG1lc3NhZ2UgYW5kIGxlbmd0aCgkbWVzc2FnZSl9CisgIHtjYWxsIC5tZXNzYWdlX30KKyAgICB7cGFyYW0gY2xhc3NOYW1lOiAndGFnLW1lc3NhZ2UnIC99CisgICAge3BhcmFtIG1lc3NhZ2U6ICRtZXNzYWdlIC99CisgIHsvY2FsbH0KK3svaWZ9Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIExpbmUgYWJvdXQgYSBnaXQgcGVyc29uIGlkZW50aXR5LgorICoKKyAqIEBwYXJhbSBuYW1lIG5hbWUuCisgKiBAcGFyYW0gZW1haWwgZW1haWwuCisgKi8KK3t0ZW1wbGF0ZSAucGVyc29uXyBwcml2YXRlPSJ0cnVlIn0KK3skbmFtZX17aWYgJGVtYWlsfSAmbHQ7eyRlbWFpbH0mZ3Q7ey9pZn0KK3svdGVtcGxhdGV9CisKKy8qKgorICogUHJlZm9ybWF0dGVkIG1lc3NhZ2UsIHBvc3NpYmx5IGNvbnRhaW5pbmcgaHlwZXJsaW5rcy4KKyAqCisgKiBAcGFyYW0gY2xhc3NOYW1lIENTUyBjbGFzcyBuYW1lIGZvciA8cHJlPiBibG9jay4KKyAqIEBwYXJhbSBtZXNzYWdlIGxpc3Qgb2YgbWVzc2FnZSBwYXJ0cywgd2hlcmUgZWFjaCBwYXJ0IGNvbnRhaW5zOgorICogICAgIHRleHQ6IHJhdyB0ZXh0IG9mIHRoZSBwYXJ0LgorICogICAgIHVybDogb3B0aW9uYWwgVVJMIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCB0byBmcm9tIHRoZSBwYXJ0LgorICovCit7dGVtcGxhdGUgLm1lc3NhZ2VfIHByaXZhdGU9InRydWUifQorPHByZSBjbGFzcz0ieyRjbGFzc05hbWV8aWR9Ij4KKyAge2ZvcmVhY2ggJHBhcnQgaW4gJG1lc3NhZ2V9CisgICAge2lmICRwYXJ0LnVybH08YSBocmVmPSJ7JHBhcnQudXJsfSI+eyRwYXJ0LnRleHR9PC9hPntlbHNlfXskcGFydC50ZXh0fXsvaWZ9CisgIHsvZm9yZWFjaH0KKzwvcHJlPgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9QYXRoRGV0YWlsLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9QYXRoRGV0YWlsLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2QzOGEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1BhdGhEZXRhaWwuc295CkBAIC0wLDAgKzEsODQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGV0YWlsIHBhZ2UgZm9yIGEgcGF0aCB3aXRoaW4gYSB0cmVlLgorICoKKyAqIEBwYXJhbSB0aXRsZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoaXMgcGF0aC4KKyAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBuYW1lIG9mIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0gdHlwZSBwYXRoIHR5cGUsIG1hdGNoaW5nIG9uZSBvZiB0aGUgY29uc3RhbnQgbmFtZXMgZGVmaW5lZCBpbgorICogICAgICAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZS4KKyAqIEBwYXJhbSBkYXRhIHBhdGggZGF0YSwgbWF0Y2hpbmcgdGhlIHBhcmFtcyBmb3Igb25lIG9mIC50cmVlRGV0YWlsLAorICogICAgIC5ibG9iRGV0YWlsLCAuc3ltbGlua0RldGFpbCwgb3IgLmdpdGxpbmtEZXRhaWwgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3t0ZW1wbGF0ZSAucGF0aERldGFpbH0KK3tpZiAkdHlwZSA9PSAnUkVHVUxBUl9GSUxFJyBvciAkdHlwZSA9PSAnRVhFQ1VUQUJMRV9GSUxFJ30KKyAge2NhbGwgLmhlYWRlcn0KKyAgICB7cGFyYW0gdGl0bGU6ICR0aXRsZSAvfQorICAgIHtwYXJhbSByZXBvc2l0b3J5TmFtZTogJHJlcG9zaXRvcnlOYW1lIC99CisgICAge3BhcmFtIG1lbnVFbnRyaWVzOiAkbWVudUVudHJpZXMgL30KKyAgICB7cGFyYW0gYnJlYWRjcnVtYnM6ICRicmVhZGNydW1icyAvfQorICAgIHtwYXJhbSBjc3M6IFtnaXRpbGVzLlBSRVRUSUZZX0NTU19VUkxdIC99CisgICAge3BhcmFtIGpzOiBbZ2l0aWxlcy5QUkVUVElGWV9KU19VUkxdIC99CisgICAge3BhcmFtIG9uTG9hZDogJ3ByZXR0eVByaW50KCknIC99CisgIHsvY2FsbH0KK3tlbHNlfQorICB7Y2FsbCAuaGVhZGVyIGRhdGE9ImFsbCIgL30KK3svaWZ9CisKK3tzd2l0Y2ggJHR5cGV9CisgIHtjYXNlICdUUkVFJ317Y2FsbCAudHJlZURldGFpbCBkYXRhPSIkZGF0YSIgL30KKyAge2Nhc2UgJ1NZTUxJTksnfXtjYWxsIC5zeW1saW5rRGV0YWlsIGRhdGE9IiRkYXRhIiAvfQorICB7Y2FzZSAnUkVHVUxBUl9GSUxFJ317Y2FsbCAuYmxvYkRldGFpbCBkYXRhPSIkZGF0YSIgL30KKyAge2Nhc2UgJ0VYRUNVVEFCTEVfRklMRSd9e2NhbGwgLmJsb2JEZXRhaWwgZGF0YT0iJGRhdGEiIC99CisgIHtjYXNlICdHSVRMSU5LJ317Y2FsbCAuZ2l0bGlua0RldGFpbCBkYXRhPSIkZGF0YSIgL30KKyAge2RlZmF1bHR9CisgICAgPGRpdiBjbGFzcz0iZXJyb3IiPgorICAgICAge21zZyBkZXNjPSJFcnJvciBtZXNzYWdlIGZvciBhbiB1bmtub3duIG9iamVjdCB0eXBlIn1PYmplY3QgaGFzIHVua25vd24gdHlwZS57L21zZ30KKyAgICA8L2Rpdj4KK3svc3dpdGNofQorCit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbCBmb3IgYSBzeW1ib2xpYyBsaW5rLgorICoKKyAqIEBwYXJhbSB0YXJnZXQgdGFyZ2V0IG9mIHRoaXMgc3ltbGluay4KKyAqIEBwYXJhbT8gdGFyZ2V0VXJsIG9wdGlvbmFsIFVSTCBmb3IgdGhlIHRhcmdldCwgaWYgaXQgaXMgd2l0aGluIHRoaXMgcmVwby4KKyAqLwore3RlbXBsYXRlIC5zeW1saW5rRGV0YWlsfQorPGRpdiBjbGFzcz0ic3ltbGluay1kZXRhaWwiPgorICB7bXNnIGRlc2M9IkxlYWQtaW4gdGV4dCBmb3IgdGhlIHN5bWJvbGljIGxpbmsgdGFyZ2V0LiJ9U3ltYm9saWMgbGluayB0b3svbXNnfQorICB7c3B9e2lmICR0YXJnZXRVcmx9PGEgaHJlZj0ieyR0YXJnZXRVcmx9Ij57JHRhcmdldH08L2E+e2Vsc2V9eyR0YXJnZXR9ey9pZn0KKzwvZGl2Pgorey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWwgZm9yIGEgZ2l0IHN1Ym1vZHVsZSBsaW5rLgorICoKKyAqIEBwYXJhbSBzaGEgc3VibW9kdWxlIGNvbW1pdCBTSEEuCisgKiBAcGFyYW0gcmVtb3RlVXJsIFVSTCBvZiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IGh0dHBVcmwgb3B0aW9uYWwgSFRUUCBVUkwgcG9pbnRpbmcgdG8gYSB3ZWItYnJvd3Nlci1jb21wYXRpYmxlIFVSTCBvZgorICogICAgIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKyAqLwore3RlbXBsYXRlIC5naXRsaW5rRGV0YWlsfQorPGRpdiBjbGFzcz0iZ2l0bGluay1kZXRhaWwiPgorICB7bXNnIGRlc2M9IkxlYWQtaW4gdGV4dCBmb3IgdGhlIGdpdCBsaW5rIFVSTCJ9U3VibW9kdWxlIGxpbmsgdG8geyRzaGF9IG9mey9tc2d9CisgIHtzcH17aWYgJGh0dHBVcmx9PGEgaHJlZj0ieyRodHRwVXJsfSI+eyRyZW1vdGVVcmx9PC9hPntlbHNlfXskcmVtb3RlVXJsfXsvaWZ9Cis8L2Rpdj4KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmVwb3NpdG9yeUluZGV4LnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXBvc2l0b3J5SW5kZXguc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmI0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmVwb3NpdG9yeUluZGV4LnNveQpAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIEluZGV4IHBhZ2UgZm9yIGEgcmVwb3NpdG9yeS4KKyAqCisgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgbmFtZSBvZiB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtIGNsb25lVXJsIGNsb25lIFVSTCBmb3IgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIHRleHQgb2YgdGhlIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IGJyYW5jaGVzIGxpc3Qgb2YgYnJhbmNoIG9iamVjdHMgd2l0aCB1cmwgYW5kIG5hbWUga2V5cy4KKyAqIEBwYXJhbT8gdGFncyBsaXN0IG9mIHRhZyBvYmplY3RzIHdpdGggdXJsIGFuZCBuYW1lIGtleXMuCisgKi8KK3t0ZW1wbGF0ZSAucmVwb3NpdG9yeUluZGV4fQore2NhbGwgLmhlYWRlcn0KKyAge3BhcmFtIHRpdGxlOiAkcmVwb3NpdG9yeU5hbWUgL30KKyAge3BhcmFtIHJlcG9zaXRvcnlOYW1lOiBudWxsIC99CisgIHtwYXJhbSBtZW51RW50cmllczogJG1lbnVFbnRyaWVzIC99CisgIHtwYXJhbSBicmVhZGNydW1iczogJGJyZWFkY3J1bWJzIC99Cit7L2NhbGx9CisKK3tpZiAkZGVzY3JpcHRpb259CisgIDxkaXYgY2xhc3M9InJlcG9zaXRvcnktZGVzY3JpcHRpb24iPnskZGVzY3JpcHRpb259PC9kaXY+Cit7L2lmfQorCis8dGV4dGFyZWEgcm93cz0iMSIgY29scz0iMTUwIiBjbGFzcz0iY2xvbmUtbGluZSIKKyAgb25jbGljaz0idGhpcy5mb2N1cygpO3RoaXMuc2VsZWN0KCk7IgorICByZWFkb25seT0icmVhZG9ubHkiPgorICAgIGdpdCBjbG9uZSB7JGNsb25lVXJsfQorPC90ZXh0YXJlYT4KKworPGRpdiBjbGFzcz0icmVwb3NpdG9yeS1yZWZzIj4KKyAge2lmICRicmFuY2hlcyBhbmQgbGVuZ3RoKCRicmFuY2hlcyl9CisgICAgPGRpdiBjbGFzcz0icmVwb3NpdG9yeS1icmFuY2hlcyI+CisgICAgICA8aDM+QnJhbmNoZXM8L2gzPgorICAgICAgPHVsIGNsYXNzPSJicmFuY2gtbGlzdCI+CisgICAgICB7Zm9yZWFjaCAkYnJhbmNoIGluICRicmFuY2hlc30KKyAgICAgICAge2NhbGwgLnJlZl8gZGF0YT0iJGJyYW5jaCIgL30KKyAgICAgIHsvZm9yZWFjaH0KKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgIHsvaWZ9CisKKyAge2lmICR0YWdzIGFuZCBsZW5ndGgoJHRhZ3MpfQorICAgIDxkaXYgY2xhc3M9InJlcG9zaXRvcnktdGFncyI+CisgICAgICA8aDM+VGFnczwvaDM+CisgICAgICA8dWwgY2xhc3M9ImJyYW5jaC1saXN0Ij4KKyAgICAgIHtmb3JlYWNoICR0YWcgaW4gJHRhZ3N9CisgICAgICAgIHtjYWxsIC5yZWZfIGRhdGE9IiR0YWciIC99CisgICAgICB7L2ZvcmVhY2h9CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICB7L2lmfQorPC9kaXY+Cit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbCBmb3IgYSBzaW5nbGUgcmVmLgorICoKKyAqIEBwYXJhbSB1cmwgVVJMIGZvciByZWYgZGV0YWlsIHBhZ2UuCisgKiBAcGFyYW0gbmFtZSByZWYgbmFtZS4KKyAqLwore3RlbXBsYXRlIC5yZWZffQorPGxpPjxhIGhyZWY9InskdXJsfSI+eyRuYW1lfTwvYT48L2xpPgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXZpc2lvbkRldGFpbC5zb3kgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmV2aXNpb25EZXRhaWwuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYmVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUmV2aXNpb25EZXRhaWwuc295CkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGV0YWlsIHBhZ2UgYWJvdXQgYSBzaW5nbGUgcmV2aXNpb24uCisgKgorICogQHBhcmFtIHRpdGxlIGh1bWFuLXJlYWRhYmxlIHJldmlzaW9uIG5hbWUuCisgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgbmFtZSBvZiB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtPyBoYXNCbG9iIHNldCB0byB0cnVlIGlmIHRoZSByZXZpc2lvbiBvciBpdHMgcGVlbGVkIHZhbHVlIGlzIGEgYmxvYi4KKyAqIEBwYXJhbSBvYmplY3RzIGxpc3Qgb2Ygb2JqZWN0cyBlbmNvdW50ZXJlZCB3aGVuIHBlZWxpbmcgdGhpcyBvYmplY3QuIEVhY2gKKyAqICAgICBvYmplY3QgaGFzIGEgInR5cGUiIGtleSB3aXRoIG9uZSBvZiB0aGUKKyAqICAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db250YW50cy5UWVBFXyogY29uc3RhbnQgc3RyaW5ncywgYW5kIGEgImRhdGEiIGtleQorICogICAgIHdpdGggYW4gb2JqZWN0IHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0IGRldGFpbAorICogICAgIHRlbXBsYXRlIGZyb20gT2JqZWN0RGV0YWlsLnNveS4KKyAqLwore3RlbXBsYXRlIC5yZXZpc2lvbkRldGFpbH0KK3tpZiAkaGFzQmxvYn0KKyAge2NhbGwgLmhlYWRlcn0KKyAgICB7cGFyYW0gdGl0bGU6ICR0aXRsZSAvfQorICAgIHtwYXJhbSByZXBvc2l0b3J5TmFtZTogJHJlcG9zaXRvcnlOYW1lIC99CisgICAge3BhcmFtIG1lbnVFbnRyaWVzOiAkbWVudUVudHJpZXMgL30KKyAgICB7cGFyYW0gYnJlYWRjcnVtYnM6ICRicmVhZGNydW1icyAvfQorICAgIHtwYXJhbSBjc3M6IFtnaXRpbGVzLlBSRVRUSUZZX0NTU19VUkxdIC99CisgICAge3BhcmFtIGpzOiBbZ2l0aWxlcy5QUkVUVElGWV9KU19VUkxdIC99CisgICAge3BhcmFtIG9uTG9hZDogJ3ByZXR0eVByaW50KCknIC99CisgIHsvY2FsbH0KK3tlbHNlfQorICB7Y2FsbCAuaGVhZGVyIGRhdGE9ImFsbCIgL30KK3svaWZ9CisKK3tmb3JlYWNoICRvYmplY3QgaW4gJG9iamVjdHN9CisgIHtzd2l0Y2ggJG9iamVjdC50eXBlfQorICAgIHtjYXNlICdjb21taXQnfQorICAgICAge2NhbGwgLmNvbW1pdERldGFpbCBkYXRhPSIkb2JqZWN0LmRhdGEiIC99CisgICAge2Nhc2UgJ3RyZWUnfQorICAgICAge2NhbGwgLnRyZWVEZXRhaWwgZGF0YT0iJG9iamVjdC5kYXRhIiAvfQorICAgIHtjYXNlICdibG9iJ30KKyAgICAgIHtjYWxsIC5ibG9iRGV0YWlsIGRhdGE9IiRvYmplY3QuZGF0YSIgL30KKyAgICB7Y2FzZSAndGFnJ30KKyAgICAgIHtjYWxsIC50YWdEZXRhaWwgZGF0YT0iJG9iamVjdC5kYXRhIiAvfQorICAgIHtkZWZhdWx0fQorICAgICAgPGRpdiBjbGFzcz0iZXJyb3IiPgorICAgICAgICB7bXNnIGRlc2M9IkVycm9yIG1lc3NhZ2UgZm9yIGFuIHVua25vd24gb2JqZWN0IHR5cGUifU9iamVjdCBoYXMgdW5rbm93biB0eXBlLnsvbXNnfQorICAgICAgPC9kaXY+CisgIHsvc3dpdGNofQorey9mb3JlYWNofQorCit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWxUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQzOWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWxUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkNvbmZpZ1V0aWwuZ2V0RHVyYXRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmpvZGEudGltZS5EdXJhdGlvbjsKKworLyoqIFRlc3RzIGZvciBjb25maWd1cmF0aW9uIHV0aWxpdGllcy4gKi8KK3B1YmxpYyBjbGFzcyBDb25maWdVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEdldER1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRHVyYXRpb24gZGVmID0gRHVyYXRpb24uc3RhbmRhcmRTZWNvbmRzKDIpOworICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKCk7CisgICAgRHVyYXRpb24gdDsKKworICAgIGNvbmZpZy5zZXRTdHJpbmcoImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCAiNTAwIG1zIik7CisgICAgdCA9IGdldER1cmF0aW9uKGNvbmZpZywgImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCBkZWYpOworICAgIGFzc2VydEVxdWFscyg1MDAsIHQuZ2V0TWlsbGlzKCkpOworCisgICAgY29uZmlnLnNldFN0cmluZygiY29yZSIsICJkaHQiLCAidGltZW91dCIsICI1LjIgc2VjIik7CisgICAgdCA9IGdldER1cmF0aW9uKGNvbmZpZywgImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCBkZWYpOworICAgIGFzc2VydEVxdWFscyg1MjAwLCB0LmdldE1pbGxpcygpKTsKKworICAgIGNvbmZpZy5zZXRTdHJpbmcoImNvcmUiLCAiZGh0IiwgInRpbWVvdXQiLCAiMSBtaW4iKTsKKyAgICB0ID0gZ2V0RHVyYXRpb24oY29uZmlnLCAiY29yZSIsICJkaHQiLCAidGltZW91dCIsIGRlZik7CisgICAgYXNzZXJ0RXF1YWxzKDYwMDAwLCB0LmdldE1pbGxpcygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlcXVlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhZmE3NAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwzODkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVGVzdEdpdGlsZXNVcmxzLlVSTFM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKKy8qKiBTaW1wbGUgZmFrZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fS4gKi8KK3B1YmxpYyBjbGFzcyBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0IGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXF1ZXN0IHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9QQVRIID0gIi9iIjsKKworICBwdWJsaWMgc3RhdGljIEZha2VIdHRwU2VydmxldFJlcXVlc3QgbmV3UmVxdWVzdCgpIHsKKyAgICByZXR1cm4gbmV3IEZha2VIdHRwU2VydmxldFJlcXVlc3QoCisgICAgICAgIFVSTFMuZ2V0SG9zdE5hbWUobnVsbCksCisgICAgICAgIDgwLAorICAgICAgICAiIiwKKyAgICAgICAgU0VSVkxFVF9QQVRILAorICAgICAgICAiIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEZha2VIdHRwU2VydmxldFJlcXVlc3QgbmV3UmVxdWVzdChEZnNSZXBvc2l0b3J5IHJlcG8pIHsKKyAgICBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IG5ld1JlcXVlc3QoKTsKKyAgICByZXEuc2V0QXR0cmlidXRlKFNlcnZsZXRVdGlscy5BVFRSSUJVVEVfUkVQT1NJVE9SWSwgcmVwbyk7CisgICAgcmV0dXJuIHJlcTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBhdHRyaWJ1dGVzOworICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKKworICBwcml2YXRlIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKKyAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWU7CisgIHByaXZhdGUgaW50IHBvcnQ7CisgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0UGF0aDsKKyAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICBwcml2YXRlIEZha2VIdHRwU2VydmxldFJlcXVlc3QoU3RyaW5nIGhvc3ROYW1lLCBpbnQgcG9ydCwgU3RyaW5nIGNvbnRleHRQYXRoLCBTdHJpbmcgc2VydmxldFBhdGgsCisgICAgICBTdHJpbmcgcGF0aCkgeworICAgIHRoaXMuaG9zdE5hbWUgPSBjaGVja05vdE51bGwoaG9zdE5hbWUsICJob3N0TmFtZSIpOworICAgIGNoZWNrQXJndW1lbnQocG9ydCA+IDApOworICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNoZWNrTm90TnVsbChjb250ZXh0UGF0aCwgImNvbnRleHRQYXRoIik7CisgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IGNoZWNrTm90TnVsbChzZXJ2bGV0UGF0aCwgInNlcnZsZXRQYXRoIik7CisgICAgYXR0cmlidXRlcyA9IE1hcHMubmV3Q29uY3VycmVudE1hcCgpOworICAgIHBhcmFtZXRlcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgaGVhZGVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlcy5rZXlTZXQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICByZXR1cm4gVVRGXzgubmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCkgeworICAgIHJldHVybiAiMS4yLjMuNCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgcmV0dXJuIGhvc3ROYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgeworICAgIHJldHVybiBwb3J0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgIHJldHVybiBMb2NhbGUuVVM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEVudW1lcmF0aW9uPExvY2FsZT4gZ2V0TG9jYWxlcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKExvY2FsZS5VUykpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5nZXRGaXJzdChwYXJhbWV0ZXJzLmdldChuYW1lKSwgbnVsbCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxDb2xsZWN0aW9uPFN0cmluZz4sIFN0cmluZ1tdPiBTVFJJTkdfQ09MTEVDVElPTl9UT19BUlJBWSA9CisgICAgICBuZXcgRnVuY3Rpb248Q29sbGVjdGlvbjxTdHJpbmc+LCBTdHJpbmdbXT4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gYXBwbHkoQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgIHJldHVybiB2YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBnZXRQYXJhbWV0ZXJNYXAoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgKKyAgICAgICAgTWFwcy50cmFuc2Zvcm1WYWx1ZXMocGFyYW1ldGVycy5hc01hcCgpLCBTVFJJTkdfQ09MTEVDVElPTl9UT19BUlJBWSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihwYXJhbWV0ZXJzLmtleVNldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIFNUUklOR19DT0xMRUNUSU9OX1RPX0FSUkFZLmFwcGx5KHBhcmFtZXRlcnMuZ2V0KG5hbWUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxcykgeworICAgIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgIGZvciAoU3RyaW5nIGVudHJ5IDogU3BsaXR0ZXIub24oJyYnKS5zcGxpdChxcykpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBrdiA9IEltbXV0YWJsZUxpc3QuY29weU9mKFNwbGl0dGVyLm9uKCc9JykubGltaXQoMikuc3BsaXQoZW50cnkpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHBhcmFtcy5wdXQoVVJMRGVjb2Rlci5kZWNvZGUoa3YuZ2V0KDApLCBVVEZfOC5uYW1lKCkpLAorICAgICAgICAgICAga3Yuc2l6ZSgpID09IDIgPyBVUkxEZWNvZGVyLmRlY29kZShrdi5nZXQoMSksIFVURl84Lm5hbWUoKSkgOiAiIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcGFyYW1ldGVycyA9IHBhcmFtczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgIHJldHVybiAiSFRUUC8xLjEiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCdWZmZXJlZFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsKKyAgICByZXR1cm4gIjUuNi43LjgiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKyAgICByZXR1cm4gInJlbW90ZWhvc3QiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKKyAgICByZXR1cm4gMTIzNDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKyAgICByZXR1cm4gcG9ydCA9PSA0NDMgPyAiaHR0cHMiIDogImh0dHAiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKyAgICByZXR1cm4gaG9zdE5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgIHJldHVybiBwb3J0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgIHJldHVybiBwb3J0ID09IDQ0MzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICBhdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgIGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW52KSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICByZXR1cm4gY29udGV4dFBhdGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7CisgICAgcmV0dXJuIG5ldyBDb29raWVbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5nZXRGaXJzdChoZWFkZXJzLmdldChuYW1lKSwgbnVsbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0SGVhZGVyTmFtZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGhlYWRlcnMua2V5U2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oaGVhZGVycy5nZXQobmFtZSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0SGVhZGVyKG5hbWUpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKyAgICByZXR1cm4gIkdFVCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhdGhJbmZvKFN0cmluZyBwYXRoKSB7CisgICAgdGhpcy5wYXRoID0gY2hlY2tOb3ROdWxsKHBhdGgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgeworICAgIHJldHVybiBzZXJ2bGV0UGF0aDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihib29sZWFuIGNyZWF0ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTAwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0cy5VVEZfODsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2ltcGxlIGZha2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9LiAqLworcHVibGljIGNsYXNzIEZha2VIdHRwU2VydmxldFJlc3BvbnNlIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3RhdHVzOworCisgIHB1YmxpYyBGYWtlSHR0cFNlcnZsZXRSZXNwb25zZSgpIHsKKyAgICBzdGF0dXMgPSAyMDA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgcmV0dXJuIFVURl84Lm5hbWUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgIHJldHVybiBMb2NhbGUuVVM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHN6KSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVcmwoU3RyaW5nIHVybCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyB1cmwpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBARGVwcmVjYXRlZAorICBwdWJsaWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgdXJsKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykgeworICAgIHN0YXR1cyA9IHNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHsKKyAgICBzdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIG1zZykgeworICAgIHN0YXR1cyA9IFNDX0ZPVU5EOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworICAgIHN0YXR1cyA9IHNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBtc2cpIHsKKyAgICBzdGF0dXMgPSBzYzsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzMmRkNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5SRVBPX1BBVEhfUkVHRVg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJFUE9fUkVHRVg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJPT1RfUkVHRVg7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKKworLyoqIFRlc3RzIGZvciB0aGUgR2l0aWxlcyBmaWx0ZXIuICovCitwdWJsaWMgY2xhc3MgR2l0aWxlc0ZpbHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSb290VXJscygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8gIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vKyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLysiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8gLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLysvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vKy9iYXIiKS5tYXRjaGVzKCkpOworICAgIE1hdGNoZXIgbTsKKworICAgIG0gPSBST09UX1JFR0VYLm1hdGNoZXIoIi8iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi8iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJPT1RfUkVHRVgubWF0Y2hlcigiLy8iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi8vIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiLyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBvVXJscygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEZhbHNlKFJFUE9fUkVHRVgubWF0Y2hlcigiIikubWF0Y2hlcygpKTsKKworICAgIC8vIFRoZXNlIG1hdGNoIHRoZSByZWdleCBidXQgYXJlIHNlcnZlZCBieSB0aGUgcm9vdCByZWdleCBiaW5kZXIsIHdoaWNoIGlzCisgICAgLy8gbWF0Y2hlZCBmaXJzdC4KKyAgICBhc3NlcnRUcnVlKFJFUE9fUkVHRVgubWF0Y2hlcigiLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0VHJ1ZShSRVBPX1JFR0VYLm1hdGNoZXIoIi8vIikubWF0Y2hlcygpKTsKKworICAgIGFzc2VydEZhbHNlKFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby8rIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyLysiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIvKy8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIvKy9iYXoiKS5tYXRjaGVzKCkpOworICAgIE1hdGNoZXIgbTsKKworICAgIG0gPSBSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby8iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vL2JhciIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vYmFyIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIrYmF6Iik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vL2JhcitiYXoiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vL2JhcitiYXoiLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwb1BhdGhVcmxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIiIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLyAiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLyAvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8gL2JhciIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vYmFyIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIrYmF6IikubWF0Y2hlcygpKTsKKyAgICBNYXRjaGVyIG07CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKy8iKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKy8iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKy9iYXIvYmF6Iik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysvYmFyL2JheiIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9iYXIvYmF6IiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKy9iYXIvYmF6LyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rL2Jhci9iYXovIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiL2Jhci9iYXovIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKy9iYXIgYmF6Iik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysvYmFyIGJheiIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9iYXIgYmF6IiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vKy9iYXIvKy9iYXoiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKy9iYXIvKy9iYXoiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvYmFyLysvYmF6IiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vK2Jhci9iYXoiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vK2Jhci9iYXoiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrYmFyIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvYmF6IiwgbS5ncm91cCg0KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJsc1Rlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzJmZjhiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzVXJscy5OQU1FX0VTQ0FQRVI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgR2l0aWxlc1VybHN9LiAqLworcHVibGljIGNsYXNzIEdpdGlsZXNVcmxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdE5hbWVFc2NhcGVyRXNjYXBlc0FwcHJvcHJpYXRlU3BlY2lhbENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoImZvb19iYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvb19iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28tYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28tYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTI1YmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28lYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTI2YmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28mYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTI4YmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28oYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTI5YmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28pYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTNBYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb286YmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTNCYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb287YmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTNEYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb289YmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTNGYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28/YmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTVCYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb29bYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTVEYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb29dYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTdCYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb297YmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTdEYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb299YmFyIikpOworICB9CisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lRXNjYXBlckRvZXNOb3RFc2NhcGVTbGFzaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28vYmFyIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5hbWVFc2NhcGVyRXNjYXBlc1NwYWNlc1dpdGhQZXJjZW50SW5zdGVhZE9mUGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygiZm9vK2JhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vK2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyMGJhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vIGJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyUyNTIwYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28lMjBiYXIiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlld1Rlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlld1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE1YzRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTA0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1ZpZXcuVHlwZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworCisvKiogVGVzdHMgZm9yIEdpdGlsZXMgdmlld3MuICovCitwdWJsaWMgY2xhc3MgR2l0aWxlc1ZpZXdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHaXRpbGVzVmlldyBIT1NUID0gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCkKKyAgICAgIC5zZXRTZXJ2bGV0UGF0aCgiL2IiKQorICAgICAgLnNldEhvc3ROYW1lKCJob3N0IikKKyAgICAgIC5idWlsZCgpOworCisgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVNlcnZsZXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpCisgICAgICAgIC5zZXRTZXJ2bGV0UGF0aCgiIikKKyAgICAgICAgLnNldEhvc3ROYW1lKCJob3N0IikKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvP2Zvcm1hdD1IVE1MIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiaG9zdCIsICJ1cmwiLCAiLz9mb3JtYXQ9SFRNTCIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIb3N0SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgSE9TVC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCBIT1NULmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0IiwgSE9TVC5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnROdWxsKEhPU1QuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIEhPU1QuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbChIT1NULmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvP2Zvcm1hdD1IVE1MIiwgSE9TVC50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiaG9zdCIsICJ1cmwiLCAiL2IvP2Zvcm1hdD1IVE1MIikpLAorICAgICAgICBIT1NULmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5wdXRQYXJhbSgiZm9vIiwgImZvb3ZhbHVlIikKKyAgICAgICAgLnB1dFBhcmFtKCJiYXIiLCAiYmFydmFsdWUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0TXVsdGltYXAub2YoCisgICAgICAgICAgICAiZm9vIiwgImZvb3ZhbHVlIiwKKyAgICAgICAgICAgICJiYXIiLCAiYmFydmFsdWUiKSwKKyAgICAgICAgdmlldy5nZXRQYXJhbWV0ZXJzKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi8/Zm9ybWF0PUhUTUwmZm9vPWZvb3ZhbHVlJmJhcj1iYXJ2YWx1ZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImhvc3QiLCAidXJsIiwgIi9iLz9mb3JtYXQ9SFRNTCIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtc05vdENvcGllZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKS5jb3B5RnJvbShIT1NUKQorICAgICAgICAucHV0UGFyYW0oImZvbyIsICJmb292YWx1ZSIpCisgICAgICAgIC5wdXRQYXJhbSgiYmFyIiwgImJhcnZhbHVlIikKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgR2l0aWxlc1ZpZXcgY29weSA9IEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpLmNvcHlGcm9tKHZpZXcpLmJ1aWxkKCk7CisgICAgYXNzZXJ0RmFsc2Uodmlldy5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRUcnVlKGNvcHkuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnJlcG9zaXRvcnlJbmRleCgpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFUE9TSVRPUllfSU5ERVgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8iLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlZldpdGhSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5yZXZpc2lvbigpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvK3Nob3cvbWFzdGVyIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvK3Nob3cvbWFzdGVyIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5vUGF0aENvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3Rlci8iLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rc2hvdy9tYXN0ZXIiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL21hc3Rlci8iKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T25lUGF0aENvbXBvbmVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLytzaG93L21hc3RlciIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvbWFzdGVyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLysvbWFzdGVyL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQYXRoQ29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3Rlci9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLytzaG93L21hc3RlciIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvbWFzdGVyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLysvbWFzdGVyL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLysvbWFzdGVyL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLysvbWFzdGVyL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERpZmZBZ2FpbnN0Rmlyc3RQYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBPYmplY3RJZCBwYXJlbnQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmRpZmYoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyXiEiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REaWZmQWdhaW5zdEVtcHR5UmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuZGlmZigpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXJeISIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERpZmZBZ2FpbnN0T3RoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBPYmplY3RJZCBvdGhlciA9IE9iamVjdElkLmZyb21TdHJpbmcoImVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzgiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuZGlmZigpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJlZmFiNTY3OCIsIG90aGVyKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImVmYWI1Njc4Iiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImVmYWI1Njc4Li5tYXN0ZXIiLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCcmFuY2hMb2dXaXRob3V0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3RlciIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLysvbWFzdGVyIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdElkTG9nV2l0aG91dFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgiYWJjZDEyMzQiLCBpZCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiYWJjZDEyMzQiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLytsb2cvYWJjZDEyMzQiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhYmNkMTIzNCIsICIvYi9mb28vYmFyLytsb2cvYWJjZDEyMzQiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TG9nV2l0aG91dE9sZFJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rbG9nL21hc3Rlci9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLysvbWFzdGVyIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rbG9nL21hc3Rlci9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TG9nV2l0aE9sZFJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgT2JqZWN0SWQgcGFyZW50ID0gT2JqZWN0SWQuZnJvbVN0cmluZygiZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3Rlci9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3Rlcl4uLm1hc3RlciIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3Rlci9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3Rlci9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVzY2FwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgT2JqZWN0SWQgcGFyZW50ID0gT2JqZWN0SWQuZnJvbVN0cmluZygiZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OCIpOworICAgIC8vIFNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBub3QgdmFsaWQgZm9yIEdpdCwgYnV0IGNoZWNrIHRoZW0gYW55d2F5LgorICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28/YmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJiYS9kI25hbWUiLCBpZCkpCisgICAgICAgIC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgib3RoZXJcIm5hL21lIiwgcGFyZW50KSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCJ3ZSBpcmQvcGEndGgvbmFtZSIpCisgICAgICAgIC5wdXRQYXJhbSgiayBlIHkiLCAidmFsL3VlIikKKyAgICAgICAgLnNldEFuY2hvcigiYW5jI2hvciIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgLy8gRmllbGRzIHJldHVybmVkIGJ5IGdldHRlcnMgYXJlIG5vdCBlc2NhcGVkLgorICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28/YmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImJhL2QjbmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm90aGVyXCJuYS9tZSIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygid2UgaXJkL3BhJ3RoL25hbWUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0TXVsdGltYXAuPFN0cmluZywgU3RyaW5nPiBvZigiayBlIHkiLCAidmFsL3VlIiksCisgICAgICAgIHZpZXcuZ2V0UGFyYW1ldGVycygpKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgIi9iL2ZvbyUzRmJhci8rbG9nL290aGVyJTIybmEvbWUuLmJhL2QlMjNuYW1lL3dlJTIwaXJkL3BhJTI3dGgvbmFtZSIKKyAgICAgICAgKyAiP2srZSt5PXZhbCUyRnVlI2FuYyUyM2hvciIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgLy8gTmFtZXMgYXJlIG5vdCBlc2NhcGVkIChhdXRvLWVzY2FwZWQgYnkgU295KSBidXQgdmFsdWVzIGFyZS4KKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28/YmFyIiwgIi9iL2ZvbyUzRmJhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm90aGVyXCJuYS9tZS4uYmEvZCNuYW1lIiwgIi9iL2ZvbyUzRmJhci8rbG9nL290aGVyJTIybmEvbWUuLmJhL2QlMjNuYW1lIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ3ZSBpcmQiLCAiL2IvZm9vJTNGYmFyLytsb2cvb3RoZXIlMjJuYS9tZS4uYmEvZCUyM25hbWUvd2UlMjBpcmQiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhJ3RoIiwgIi9iL2ZvbyUzRmJhci8rbG9nL290aGVyJTIybmEvbWUuLmJhL2QlMjNuYW1lL3dlJTIwaXJkL3BhJTI3dGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm5hbWUiLAorICAgICAgICAgICAgICAiL2IvZm9vJTNGYmFyLytsb2cvb3RoZXIlMjJuYS9tZS4uYmEvZCUyM25hbWUvd2UlMjBpcmQvcGElMjd0aC9uYW1lIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBicmVhZGNydW1iKFN0cmluZyB0ZXh0LCBTdHJpbmcgdXJsKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQsICJ1cmwiLCB1cmwpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjZjYWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xpbmtpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogVGVzdHMgZm9yIHtAbGluayBMaW5raWZpZXJ9LiAqLworcHVibGljIGNsYXNzIExpbmtpZmllclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCBSRVEgPSBGYWtlSHR0cFNlcnZsZXRSZXF1ZXN0Lm5ld1JlcXVlc3QoKTsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RsaW5raWZ5TWVzc2FnZU5vTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaW5raWZpZXIgbCA9IG5ldyBMaW5raWZpZXIoVGVzdEdpdGlsZXNVcmxzLlVSTFMpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJzb21lIG1lc3NhZ2UgdGV4dCIpKSwKKyAgICAgICAgbC5saW5raWZ5KEZha2VIdHRwU2VydmxldFJlcXVlc3QubmV3UmVxdWVzdCgpLCAic29tZSBtZXNzYWdlIHRleHQiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0bGlua2lmeU1lc3NhZ2VVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaW5raWZpZXIgbCA9IG5ldyBMaW5raWZpZXIoVGVzdEdpdGlsZXNVcmxzLlVSTFMpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cDovL215L3VybCIsICJ1cmwiLCAiaHR0cDovL215L3VybCIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgImh0dHA6Ly9teS91cmwiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwczovL215L3VybCIsICJ1cmwiLCAiaHR0cHM6Ly9teS91cmwiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJodHRwczovL215L3VybCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImZvbyAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHA6Ly9teS91cmwiLCAidXJsIiwgImh0dHA6Ly9teS91cmwiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIiBiYXIiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJmb28gaHR0cDovL215L3VybCBiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJmb28gIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwOi8vbXkvdXJsIiwgInVybCIsICJodHRwOi8vbXkvdXJsIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICIgYmFyICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cDovL215L290aGVyL3VybCIsICJ1cmwiLCAiaHR0cDovL215L290aGVyL3VybCIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiIGJheiIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgImZvbyBodHRwOi8vbXkvdXJsIGJhciBodHRwOi8vbXkvb3RoZXIvdXJsIGJheiIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RsaW5raWZ5TWVzc2FnZUNoYW5nZUlkTm9HZXJyaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaW5raWZpZXIgbCA9IG5ldyBMaW5raWZpZXIobmV3IEdpdGlsZXNVcmxzKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHZXJyaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRCYXNlR2l0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkkwMTIzNDU2Nzg5IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiSTAxMjM0NTY3ODkiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IGRvZXMgbm90IGV4aXN0IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSBkb2VzIG5vdCBleGlzdCIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RsaW5raWZ5TWVzc2FnZUNoYW5nZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlua2lmaWVyIGwgPSBuZXcgTGlua2lmaWVyKFRlc3RHaXRpbGVzVXJscy5VUkxTKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkkwMTIzNDU2Nzg5IiwKKyAgICAgICAgICAidXJsIiwgImh0dHA6Ly90ZXN0LWhvc3QtcmV2aWV3L2Zvby8jL3EvSTAxMjM0NTY3ODksbix6IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiSTAxMjM0NTY3ODkiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJDaGFuZ2UtSWQ6ICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiSTAxMjM0NTY3ODkiLAorICAgICAgICAgICJ1cmwiLCAiaHR0cDovL3Rlc3QtaG9zdC1yZXZpZXcvZm9vLyMvcS9JMDEyMzQ1Njc4OSxuLHoiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiQ2hhbmdlLUlkOiAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkkwMTIzNDU2Nzg5IiwKKyAgICAgICAgICAidXJsIiwgImh0dHA6Ly90ZXN0LWhvc3QtcmV2aWV3L2Zvby8jL3EvSTAxMjM0NTY3ODksbix6IiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICIgZXhpc3RzIikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSBleGlzdHMiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0bGlua2lmeU1lc3NhZ2VVcmxBbmRDaGFuZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpbmtpZmllciBsID0gbmV3IExpbmtpZmllcihUZXN0R2l0aWxlc1VybHMuVVJMUyk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwOi8vbXkvdXJsL0kwMTIzNDU2Nzg5IiwgInVybCIsICJodHRwOi8vbXkvdXJsL0kwMTIzNDU2Nzg5IiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICIgaXMgbm90IGNoYW5nZSAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkkwMTIzNDU2Nzg5IiwKKyAgICAgICAgICAidXJsIiwgImh0dHA6Ly90ZXN0LWhvc3QtcmV2aWV3L2Zvby8jL3EvSTAxMjM0NTY3ODksbix6IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiaHR0cDovL215L3VybC9JMDEyMzQ1Njc4OSBpcyBub3QgY2hhbmdlIEkwMTIzNDU2Nzg5IikpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhZ2luYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBMb2dTZXJ2bGV0fS4gKi8KK3B1YmxpYyBjbGFzcyBQYWdpbmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+IHJlcG87CisgIHByaXZhdGUgUmV2V2FsayB3YWxrOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8gPSBuZXcgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4oCisgICAgICAgIG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkobmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpKSk7CisgICAgd2FsayA9IG5ldyBSZXZXYWxrKHJlcG8uZ2V0UmVwb3NpdG9yeSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHdhbGsucmVsZWFzZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCg5KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDgpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNykpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0TnVsbChwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDYpLCBwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb1N0YXJ0Q29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIG51bGwpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDkpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoOCksCisgICAgICAgICAgICBjb21taXRzLmdldCg3KSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnROdWxsKHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNiksIHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExlc3NUaGFuT25lUGFnZUluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIGNvbW1pdHMuZ2V0KDgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCg4KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDcpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNikpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDkpLCBwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDUpLCBwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBdExlYXN0T25lUGFnZUluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDMsIGNvbW1pdHMuZ2V0KDcpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCg3KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDYpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNSkpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDkpLCBwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDQpLCBwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgY29tbWl0cy5nZXQoMikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDIpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMSksCisgICAgICAgICAgICBjb21taXRzLmdldCgwKSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNSksIHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnROdWxsKHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZVBhc3RFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgY29tbWl0cy5nZXQoMSkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDEpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMCkpLAorICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbW1pdHMuZ2V0KDQpLCBwLmdldFByZXZpb3VzU3RhcnQoKSk7CisgICAgYXNzZXJ0TnVsbChwLmdldE5leHRTdGFydCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNYW55UGFzdEVuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCA1LCBjb21taXRzLmdldCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMSksCisgICAgICAgICAgICBjb21taXRzLmdldCgwKSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNiksIHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnROdWxsKHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFJldkNvbW1pdD4gbGluZWFyQ29tbWl0cyhpbnQgbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgY2hlY2tBcmd1bWVudChuID4gMCk7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBjb21taXRzLmFkZChyZXBvLmNvbW1pdCgpLmNyZWF0ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDEwOyBpKyspIHsKKyAgICAgIGNvbW1pdHMuYWRkKHJlcG8uY29tbWl0KCkucGFyZW50KGNvbW1pdHMuZ2V0KGNvbW1pdHMuc2l6ZSgpIC0gMSkpLmNyZWF0ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbW1pdHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0VGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3MWY3MAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVGVzdEdpdGlsZXNVcmxzLlVSTFM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFJlcG9zaXRvcnlJbmRleFNlcnZsZXR9LiAqLworcHVibGljIGNsYXNzIFJlcG9zaXRvcnlJbmRleFNlcnZsZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+IHJlcG87CisgIHByaXZhdGUgUmVwb3NpdG9yeUluZGV4U2VydmxldCBzZXJ2bGV0OworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8gPSBuZXcgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4oCisgICAgICAgIG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkobmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpKSk7CisgICAgc2VydmxldCA9IG5ldyBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0KAorICAgICAgICBuZXcgRGVmYXVsdFJlbmRlcmVyKCksCisgICAgICAgIG5ldyBUZXN0R2l0aWxlc0FjY2VzcyhyZXBvLmdldFJlcG9zaXRvcnkoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgPz4gZGF0YSA9IGJ1aWxkRGF0YSgpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKCksIGRhdGEuZ2V0KCJicmFuY2hlcyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigpLCBkYXRhLmdldCgidGFncyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCcmFuY2hlc0FuZFRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9iYXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy90YWdzL2JheiIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL25vcGUvcXV1eCIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIE1hcDxTdHJpbmcsID8+IGRhdGEgPSBidWlsZERhdGEoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2JhciIsICJiYXIiKSwKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2ZvbyIsICJmb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJicmFuY2hlcyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9iYXoiLCAiYmF6IikpLAorICAgICAgICBkYXRhLmdldCgidGFncyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNCcmFuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9iYXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy90YWdzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIE1hcDxTdHJpbmcsID8+IGRhdGEgPSBidWlsZERhdGEoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2JhciIsICJiYXIiKSwKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL3JlZnMvaGVhZHMvZm9vIiwgImZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoImJyYW5jaGVzIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIC8vIHJlZnMvdGFncy8gaXMgc2VhcmNoZWQgYmVmb3JlIHJlZnMvaGVhZHMvLCBzbyB0aGlzIGRvZXMgbm90CisgICAgICAgICAgICAvLyBhcHBlYXIgYW1iaWd1b3VzLgorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvZm9vIiwgImZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoInRhZ3MiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzUmVsYXRpdmVUb05vbkJyYW5jaE9yVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwby5icmFuY2goInJlZnMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvdGFncy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBNYXA8U3RyaW5nLCA/PiBkYXRhID0gYnVpbGREYXRhKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9yZWZzL2hlYWRzL2ZvbyIsICJmb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJicmFuY2hlcyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9yZWZzL3RhZ3MvZm9vIiwgImZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoInRhZ3MiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmc0hlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvaGVhZHMvcmVmcy9oZWFkcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBNYXA8U3RyaW5nLCA/PiBkYXRhID0gYnVpbGREYXRhKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9mb28iLCAiZm9vIiksCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9yZWZzL2hlYWRzL3JlZnMvaGVhZHMvZm9vIiwgInJlZnMvaGVhZHMvZm9vIikpLAorICAgICAgICBkYXRhLmdldCgiYnJhbmNoZXMiKSk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsID8+IGJ1aWxkRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IEZha2VIdHRwU2VydmxldFJlcXVlc3QubmV3UmVxdWVzdChyZXBvLmdldFJlcG9zaXRvcnkoKSk7CisgICAgVmlld0ZpbHRlci5zZXRWaWV3KHJlcSwgR2l0aWxlc1ZpZXcucmVwb3NpdG9yeUluZGV4KCkKKyAgICAgICAgLnNldEhvc3ROYW1lKFVSTFMuZ2V0SG9zdE5hbWUocmVxKSkKKyAgICAgICAgLnNldFNlcnZsZXRQYXRoKHJlcS5nZXRTZXJ2bGV0UGF0aCgpKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoInRlc3QiKQorICAgICAgICAuYnVpbGQoKSk7CisgICAgcmV0dXJuIHNlcnZsZXQuYnVpbGREYXRhKHJlcSk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVmKFN0cmluZyB1cmwsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidXJsIiwgdXJsLCAibmFtZSIsIG5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXJUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwMzNlMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CTE9COworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0NPTU1JVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9UQUc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLlJldmlzaW9uUGFyc2VyLlJlc3VsdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkJsb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKKworLyoqIFRlc3RzIGZvciB0aGUgcmV2aXNpb24gcGFyc2VyLiAqLworcHVibGljIGNsYXNzIFJldmlzaW9uUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PiByZXBvOworICBwcml2YXRlIFJldmlzaW9uUGFyc2VyIHBhcnNlcjsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvID0gbmV3IFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+KAorICAgICAgICBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKSkpOworICAgIHBhcnNlciA9IG5ldyBSZXZpc2lvblBhcnNlcigKKyAgICAgICAgcmVwby5nZXRSZXBvc2l0b3J5KCksCisgICAgICAgIG5ldyBUZXN0R2l0aWxlc0FjY2VzcyhyZXBvLmdldFJlcG9zaXRvcnkoKSkuZm9yUmVxdWVzdChudWxsKSwKKyAgICAgICAgbmV3IFZpc2liaWxpdHlDYWNoZShmYWxzZSwgQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKS5tYXhpbXVtU2l6ZSgwKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgbWFzdGVyKSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgicmVmcy9oZWFkcy9tYXN0ZXIiLCBtYXN0ZXIpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKyAgICBhc3NlcnROdWxsKHBhcnNlci5wYXJzZSgicmVmcy8vaGVhZHMvL21hc3RlciIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVJlZlBhcmVudEV4cHJlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcm9vdCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IHBhcmVudDEgPSByZXBvLmNvbW1pdCgpLnBhcmVudChyb290KS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgcGFyZW50MiA9IHJlcG8uY29tbWl0KCkucGFyZW50KHJvb3QpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtZXJnZSA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKQorICAgICAgICAucGFyZW50KHBhcmVudDEpCisgICAgICAgIC5wYXJlbnQocGFyZW50MikKKyAgICAgICAgLmNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgbWVyZ2UpKSwgcGFyc2VyLnBhcnNlKCJtYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50MSkpLCBwYXJzZXIucGFyc2UoIm1hc3Rlcl4iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJ+MSIsIHBhcmVudDEpKSwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJ+MSIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4yIiwgcGFyZW50MikpLCBwYXJzZXIucGFyc2UoIm1hc3Rlcl4yIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyfjIiLCByb290KSksIHBhcnNlci5wYXJzZSgibWFzdGVyfjIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21taXRTaGFWaXNpYmxlRnJvbUhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChjb21taXQubmFtZSgpLCBjb21taXQpKSwgcGFyc2VyLnBhcnNlKGNvbW1pdC5uYW1lKCkpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQocGFyZW50Lm5hbWUoKSwgcGFyZW50KSksIHBhcnNlci5wYXJzZShwYXJlbnQubmFtZSgpKSk7CisKKyAgICBTdHJpbmcgYWJicmV2ID0gY29tbWl0Lm5hbWUoKS5zdWJzdHJpbmcoMCwgNik7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKGFiYnJldiwgY29tbWl0KSksIHBhcnNlci5wYXJzZShhYmJyZXYpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbW1pdFNoYVZpc2libGVGcm9tVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgcmVwby50YWcoInRhZyIsIGNvbW1pdCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKGNvbW1pdC5uYW1lKCksIGNvbW1pdCkpLCBwYXJzZXIucGFyc2UoY29tbWl0Lm5hbWUoKSkpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChwYXJlbnQubmFtZSgpLCBwYXJlbnQpKSwgcGFyc2VyLnBhcnNlKHBhcmVudC5uYW1lKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbW1pdFNoYVZpc2libGVGcm9tT3RoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby51cGRhdGUoInJlZnMvdGFncy90YWciLCByZXBvLnRhZygidGFnIiwgcmVwby5jb21taXQoKS5jcmVhdGUoKSkpOworICAgIHJlcG8udXBkYXRlKCJyZWZzL21ldGEvY29uZmlnIiwgY29tbWl0KTsKKworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChjb21taXQubmFtZSgpLCBjb21taXQpKSwgcGFyc2VyLnBhcnNlKGNvbW1pdC5uYW1lKCkpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQocGFyZW50Lm5hbWUoKSwgcGFyZW50KSksIHBhcnNlci5wYXJzZShwYXJlbnQubmFtZSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21taXRTaGFWaXNpYmxlRnJvbUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLnVwZGF0ZSgicmVmcy9jaGFuZ2VzLzAxLzAwMDEiLCBjb21taXQpOworCisgICAgLy8gTWF0Y2hlcyBleGFjdGx5LgorICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChjb21taXQubmFtZSgpLCBjb21taXQpKSwgcGFyc2VyLnBhcnNlKGNvbW1pdC5uYW1lKCkpKTsKKyAgICAvLyByZWZzL2NoYW5nZXMvKiBpcyBleGNsdWRlZCBmcm9tIGFuY2VzdHJ5IHNlYXJjaC4KKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKHBhcmVudC5uYW1lKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU5vblZpc2libGVDb21taXRTaGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgb3RoZXIgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZShvdGhlci5uYW1lKCkpKTsKKworICAgIHJlcG8uYnJhbmNoKCJvdGhlciIpLnVwZGF0ZShvdGhlcik7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKG90aGVyLm5hbWUoKSwgb3RoZXIpKSwgcGFyc2VyLnBhcnNlKG90aGVyLm5hbWUoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGlmZlJldmlzaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG90aGVyID0gcmVwby5icmFuY2goIm90aGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgMTUpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl4uLm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgMTUpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl4uLm1hc3Rlci8iKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDE1KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeLi5tYXN0ZXIvcGF0aC90by9hL2ZpbGUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDE1KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeLi5tYXN0ZXIvcGF0aC90by9hLy4uZmlsZSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoInJlZnMvaGVhZHMvbWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgicmVmcy9oZWFkcy9tYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDM3KSwKKyAgICAgIHBhcnNlci5wYXJzZSgicmVmcy9oZWFkcy9tYXN0ZXJeLi5yZWZzL2hlYWRzL21hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcn4xIiwgcGFyZW50KSwKKyAgICAgICAgICAgIDE2KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJ+MS4ubWFzdGVyIikpOworICAgIC8vIFRPRE8oZGJvcm93aXR6KTogMmEyMzYyZmJiIGluIEpHaXQgY2F1c2VzIG1hc3Rlcn4yIHRvIHJlc29sdmUgdG8gbWFzdGVyCisgICAgLy8gcmF0aGVyIHRoYW4gbnVsbC4gVW5jb21tZW50IHdoZW4gdXBzdHJlYW0gcmVncmVzc2lvbiBpcyBmaXhlZC4KKyAgICAvL2Fzc2VydE51bGwocGFyc2VyLnBhcnNlKCJtYXN0ZXJ+Mi4ubWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgib3RoZXIiLCBvdGhlciksCisgICAgICAgICAgICAxMyksCisgICAgICAgIHBhcnNlci5wYXJzZSgib3RoZXIuLm1hc3RlciIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUZpcnN0UGFyZW50RXhwcmVzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgOCksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXiEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIFJldmlzaW9uLk5VTEwsCisgICAgICAgICAgICA5KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeXiEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKHBhcmVudC5uYW1lKCksIHBhcmVudCksCisgICAgICAgICAgICBSZXZpc2lvbi5OVUxMLAorICAgICAgICAgICAgNDIpLAorICAgICAgICBwYXJzZXIucGFyc2UocGFyZW50Lm5hbWUoKSArICJeISIpKTsKKworICAgIFJldlRhZyB0YWcgPSByZXBvLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHJlcG8udGFnKCJ0YWciLCBjb21taXQpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoInRhZyIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoInRhZ14iLCBwYXJlbnQpLAorICAgICAgICAgICAgNSksCisgICAgICAgIHBhcnNlci5wYXJzZSgidGFnXiEiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJ0YWdeIiwgcGFyZW50KSwKKyAgICAgICAgICAgIFJldmlzaW9uLk5VTEwsCisgICAgICAgICAgICA2KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJ0YWdeXiEiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVmlzaWJsZURpZmZTaGFzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG90aGVyID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm90aGVyLi5tYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgibWFzdGVyLi5vdGhlciIpKTsKKworICAgIHJlcG8uYnJhbmNoKCJvdGhlciIpLnVwZGF0ZShvdGhlcik7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBtYXN0ZXIpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJvdGhlciIsIG90aGVyKSwKKyAgICAgICAgICAgIDEzKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJvdGhlci4ubWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgib3RoZXIiLCBvdGhlciksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIG1hc3RlciksCisgICAgICAgICAgICAxMyksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyLi5vdGhlciIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2VGFnIG1hc3RlclRhZyA9IHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvbWFzdGVyLXRhZyIsIHJlcG8udGFnKCJtYXN0ZXItdGFnIiwgbWFzdGVyKSk7CisgICAgUmV2VGFnIG1hc3RlclRhZ1RhZyA9IHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvbWFzdGVyLXRhZy10YWciLAorICAgICAgICByZXBvLnRhZygibWFzdGVyLXRhZy10YWciLCBtYXN0ZXIpKTsKKworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KAorICAgICAgICAgICAgbmV3IFJldmlzaW9uKCJtYXN0ZXItdGFnIiwgbWFzdGVyVGFnLCBPQkpfVEFHLCBtYXN0ZXIsIE9CSl9DT01NSVQpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXItdGFnIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KAorICAgICAgICAgICAgbmV3IFJldmlzaW9uKCJtYXN0ZXItdGFnLXRhZyIsIG1hc3RlclRhZ1RhZywgT0JKX1RBRywgbWFzdGVyLCBPQkpfQ09NTUlUKSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyLXRhZy10YWciKSk7CisKKyAgICBSZXZCbG9iIGJsb2IgPSByZXBvLnVwZGF0ZSgicmVmcy90YWdzL2Jsb2IiLCByZXBvLmJsb2IoImJsb2IiKSk7CisgICAgUmV2VGFnIGJsb2JUYWcgPSByZXBvLnVwZGF0ZSgicmVmcy90YWdzL2Jsb2ItdGFnIiwgcmVwby50YWcoImJsb2ItdGFnIiwgYmxvYikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgiYmxvYiIsIGJsb2IpKSwgcGFyc2VyLnBhcnNlKCJibG9iIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KG5ldyBSZXZpc2lvbigiYmxvYi10YWciLCBibG9iVGFnLCBPQkpfVEFHLCBibG9iLCBPQkpfQkxPQikpLAorICAgICAgICBwYXJzZXIucGFyc2UoImJsb2ItdGFnIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5zdXBwb3J0ZWRSZXZpc2lvbkV4cHJlc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2QmxvYiBibG9iID0gcmVwby5ibG9iKCJibG9iIGNvbnRlbnRzIik7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5hZGQoImJsb2IiLCBibG9iKS5jcmVhdGUoKTsKKworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHJlcG8uZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoIm1hc3Rlcl57fSIpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJee30iKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCByZXBvLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJtYXN0ZXJee2NvbW1pdH0iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgibWFzdGVyXntjb21taXR9IikpOworCisgICAgYXNzZXJ0RXF1YWxzKGJsb2IsIHJlcG8uZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoIm1hc3RlcjpibG9iIikpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm1hc3RlcjpibG9iIikpOworCisgICAgLy8gVGVzdFJlcG9zaXRvcnkgaGFzIG5vIHNpbXBsZSB3YXkgb2Ygc2V0dGluZyB0aGUgcmVmbG9nLgorICAgIC8vYXNzZXJ0RXF1YWxzKG51bGwsIHJlcG8uZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoIm1hc3RlckB7MH0iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgibWFzdGVyQHswfSIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzQWNjZXNzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMxZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzQWNjZXNzLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBHaXRpbGVzIGFjY2VzcyBmb3IgdGVzdGluZy4gKi8KK3B1YmxpYyBjbGFzcyBUZXN0R2l0aWxlc0FjY2VzcyBpbXBsZW1lbnRzIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSB7CisgIHByaXZhdGUgZmluYWwgRGZzUmVwb3NpdG9yeSByZXBvOworCisgIHB1YmxpYyBUZXN0R2l0aWxlc0FjY2VzcyhEZnNSZXBvc2l0b3J5IHJlcG8pIHsKKyAgICB0aGlzLnJlcG8gPSBjaGVja05vdE51bGwocmVwbyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdpdGlsZXNBY2Nlc3MgZm9yUmVxdWVzdChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIG5ldyBHaXRpbGVzQWNjZXNzKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBsaXN0UmVwb3NpdG9yaWVzKFNldDxTdHJpbmc+IGJyYW5jaGVzKSB7CisgICAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogSW1wbGVtZW50IHRoaXMsIHVzaW5nIHRoZSBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb25zIHRvCisgICAgICAgIC8vIGdldCB0aGUgcmVwb3NpdG9yeSBuYW1lcy4KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE9iamVjdCBnZXRVc2VyS2V5KCkgeworICAgICAgICByZXR1cm4gImEgdXNlciI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcG8uZ2V0RGVzY3JpcHRpb24oKS5nZXRSZXBvc2l0b3J5TmFtZSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZ2V0UmVwb3NpdG9yeURlc2NyaXB0aW9uKCkgeworICAgICAgICBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZCA9IG5ldyBSZXBvc2l0b3J5RGVzY3JpcHRpb24oKTsKKyAgICAgICAgZC5uYW1lID0gZ2V0UmVwb3NpdG9yeU5hbWUoKTsKKyAgICAgICAgZC5kZXNjcmlwdGlvbiA9ICJhIHRlc3QgZGF0YSBzZXQiOworICAgICAgICBkLmNsb25lVXJsID0gVGVzdEdpdGlsZXNVcmxzLlVSTFMuZ2V0QmFzZUdpdFVybChyZXEpICsgIi8iICsgZC5uYW1lOworICAgICAgICByZXR1cm4gZDsKKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNVcmxzLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNVcmxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhMDg4MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc1VybHMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiB7QGxpbmsgR2l0aWxlc1VybHN9IGZvciB0ZXN0aW5nLiAqLworcHVibGljIGNsYXNzIFRlc3RHaXRpbGVzVXJscyBpbXBsZW1lbnRzIEdpdGlsZXNVcmxzIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBHaXRpbGVzVXJscyBVUkxTID0gbmV3IFRlc3RHaXRpbGVzVXJscygpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gInRlc3QtaG9zdCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2l0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gImdpdDovL3Rlc3QtaG9zdC9mb28iOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdlcnJpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuICJodHRwOi8vdGVzdC1ob3N0LXJldmlldy9mb28vIjsKKyAgfQorCisgIHByaXZhdGUgVGVzdEdpdGlsZXNVcmxzKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGFUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0MjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YVRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVHJlZVNveURhdGEuZ2V0VGFyZ2V0RGlzcGxheU5hbWU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5UcmVlU295RGF0YS5yZXNvbHZlVGFyZ2V0VXJsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFRyZWVTb3lEYXRhfS4gKi8KK3B1YmxpYyBjbGFzcyBUcmVlU295RGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXREaXNwbGF5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygiZm9vIiwgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoImZvbyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCBnZXRUYXJnZXREaXNwbGF5TmFtZSgiZm9vL2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImEvYS9hL2EvYS9hL2EvYS9hL2EvYmFyIiwKKyAgICAgICAgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5ncy5yZXBlYXQoImEvIiwgMTApICsgImJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImEvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYmFyIiwKKyAgICAgICAgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5ncy5yZXBlYXQoImEvIiwgMzQpICsgImJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi4uLi9iYXIiLCBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmdzLnJlcGVhdCgiYS8iLCAzNSkgKyAiYmFyIikpOworICAgIGFzc2VydEVxdWFscygiLi4uL2JhciIsIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZ3MucmVwZWF0KCJhLyIsIDEwMCkgKyAiYmFyIikpOworICAgIGFzc2VydEVxdWFscygiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLAorICAgICAgICBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmdzLnJlcGVhdCgiYSIsIDgwKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUYXJnZXRVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgIC5zZXRTZXJ2bGV0UGF0aCgiL3giKQorICAgICAgICAuc2V0SG9zdE5hbWUoImhvc3QiKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoInJlcG8iKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm0iLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiYS9iL2MiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBhc3NlcnROdWxsKHJlc29sdmVUYXJnZXRVcmwodmlldywgIi9mb28iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYSIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4vLi4vIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYSIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy8uLi8iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hL2QiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi9kIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vLi4iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hL2QvZSIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uL2QvZSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EvYiIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uL2QvLi4vZS8uLi8iKSk7CisgICAgYXNzZXJ0TnVsbChyZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi8uLi8uLi8iKSk7CisgICAgYXNzZXJ0TnVsbChyZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi9hLy4uLy4uLy4uIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlclRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjdiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDM0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkZha2VIdHRwU2VydmxldFJlcXVlc3QubmV3UmVxdWVzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUkVQT19QQVRIX1JFR0VYOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5SRVBPX1JFR0VYOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5ST09UX1JFR0VYOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BdG9taWNzOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzVmlldy5UeXBlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLk1ldGFGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlLk1ldGFTZXJ2bGV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBUZXN0cyBmb3IgdGhlIHZpZXcgZmlsdGVyLiAqLworcHVibGljIGNsYXNzIFZpZXdGaWx0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+IHJlcG87CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwbyA9IG5ldyBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PigKKyAgICAgICAgbmV3IEluTWVtb3J5UmVwb3NpdG9yeShuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0IikpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb0NvbW1hbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCBnZXRWaWV3KCIvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVBPU0lUT1JZX0lOREVYLCBnZXRWaWV3KCIvcmVwbyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rIikpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKy8iKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0NvbW1hbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgU3RyaW5nIGhleCA9IG1hc3Rlci5uYW1lKCk7CisgICAgU3RyaW5nIGhleEJyYW5jaCA9IGhleC5zdWJzdHJpbmcoMCwgMTApOworICAgIFJldkNvbW1pdCBoZXhDb21taXQgPSByZXBvLmJyYW5jaChoZXhCcmFuY2gpLmNvbW1pdCgpLmNyZWF0ZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCBnZXRWaWV3KCIvcmVwby8rL21hc3RlciIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCBnZXRWaWV3KCIvcmVwby8rLyIgKyBoZXhCcmFuY2gpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIGdldFZpZXcoIi9yZXBvLysvIiArIGhleCkuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgZ2V0VmlldygiL3JlcG8vKy8iICsgaGV4LnN1YnN0cmluZygwLCA3KSkuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCBnZXRWaWV3KCIvcmVwby8rL21hc3Rlci8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIGdldFZpZXcoIi9yZXBvLysvIiArIGhleCArICIvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCBnZXRWaWV3KCIvcmVwby8rL21hc3Rlcl4uLm1hc3RlciIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgZ2V0VmlldygiL3JlcG8vKy9tYXN0ZXJeLi5tYXN0ZXIvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCBnZXRWaWV3KCIvcmVwby8rLyIgKyBwYXJlbnQubmFtZSgpICsgIi4uIiArIGhleCArICIvIikuZ2V0VHlwZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIb3N0SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gZ2V0VmlldygiLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRlc3QtaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gZ2V0VmlldygiL3JlcG8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVBPU0lUT1JZX0lOREVYLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZXBvIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IHN0YWJsZSA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL3N0YWJsZSIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvaGVhZHMvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhlYWRzL21hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvcmVmcy9oZWFkcy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L3N0YWJsZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJzdGFibGUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoc3RhYmxlLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c0JyYW5jaEFuZFRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBicmFuY2ggPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9uYW1lIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IHRhZyA9IHJlcG8uYnJhbmNoKCJyZWZzL3RhZ3MvbmFtZSIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbmFtZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9oZWFkcy9uYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhlYWRzL25hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnJhbmNoLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L3JlZnMvaGVhZHMvbmFtZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL25hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnJhbmNoLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L3RhZ3MvbmFtZSIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0YWdzL25hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHModGFnLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L3JlZnMvdGFncy9uYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvdGFncy9uYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbWFzdGVyLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L21hc3Rlci9mb28iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9tYXN0ZXIvZm9vLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L21hc3Rlci9mb28vYmFyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2xhc2hlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgZ2V0VmlldygiLy8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFUE9TSVRPUllfSU5ERVgsIGdldFZpZXcoIi8vcmVwbyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCwgZ2V0VmlldygiLy9yZXBvLy8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKy8vbWFzdGVyIikpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKy9yZWZzLy9oZWFkcy8vbWFzdGVyIikpOworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vKy8vbWFzdGVyLy8iKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rLy9tYXN0ZXIvZm9vLy9iYXIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGlmZigpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3OworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytkaWZmL21hc3Rlcl4uLm1hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytkaWZmL21hc3Rlcl4uLm1hc3Rlci8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rZGlmZi9tYXN0ZXJeLi5tYXN0ZXIvZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2RpZmYvcmVmcy9oZWFkcy9tYXN0ZXJeLi5yZWZzL2hlYWRzL21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REaWZmQWdhaW5zdEVtcHR5Q29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rZGlmZi9tYXN0ZXJeISIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLytsb2ciKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rbG9nLyIpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3Rlci8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXIvZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyXi4ubWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3Rlcl4uLm1hc3Rlci8iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyXi4ubWFzdGVyL2ZvbyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9yZWZzL2hlYWRzL21hc3Rlcl4uLnJlZnMvaGVhZHMvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwcml2YXRlIEdpdGlsZXNWaWV3IGdldFZpZXcoU3RyaW5nIHBhdGhBbmRRdWVyeSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8R2l0aWxlc1ZpZXc+IHZpZXcgPSBBdG9taWNzLm5ld1JlZmVyZW5jZSgpOworICAgIEh0dHBTZXJ2bGV0IHRlc3RTZXJ2bGV0ID0gbmV3IEh0dHBTZXJ2bGV0KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICB2aWV3LnNldChWaWV3RmlsdGVyLmdldFZpZXcocmVxKSk7CisgICAgICB9CisgICAgfTsKKworICAgIFZpZXdGaWx0ZXIgdmYgPSBuZXcgVmlld0ZpbHRlcigKKyAgICAgICAgbmV3IFRlc3RHaXRpbGVzQWNjZXNzKHJlcG8uZ2V0UmVwb3NpdG9yeSgpKSwKKyAgICAgICAgVGVzdEdpdGlsZXNVcmxzLlVSTFMsCisgICAgICAgIG5ldyBWaXNpYmlsaXR5Q2FjaGUoZmFsc2UpKTsKKyAgICBNZXRhRmlsdGVyIG1mID0gbmV3IE1ldGFGaWx0ZXIoKTsKKworICAgIGZvciAoUGF0dGVybiBwIDogSW1tdXRhYmxlTGlzdC5vZihST09UX1JFR0VYLCBSRVBPX1JFR0VYLCBSRVBPX1BBVEhfUkVHRVgpKSB7CisgICAgICBtZi5zZXJ2ZVJlZ2V4KHApCisgICAgICAgICAgLnRocm91Z2godmYpCisgICAgICAgICAgLndpdGgodGVzdFNlcnZsZXQpOworICAgIH0KKworICAgIEZha2VIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gbmV3UmVxdWVzdChyZXBvLmdldFJlcG9zaXRvcnkoKSk7CisgICAgaW50IHEgPSBwYXRoQW5kUXVlcnkuaW5kZXhPZignPycpOworICAgIGlmIChxID4gMCkgeworICAgICAgcmVxLnNldFBhdGhJbmZvKHBhdGhBbmRRdWVyeS5zdWJzdHJpbmcoMCwgcSkpOworICAgICAgcmVxLnNldFF1ZXJ5U3RyaW5nKHBhdGhBbmRRdWVyeS5zdWJzdHJpbmcocSArIDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVxLnNldFBhdGhJbmZvKHBhdGhBbmRRdWVyeSk7CisgICAgfQorICAgIG5ldyBNZXRhU2VydmxldChtZil7fS5zZXJ2aWNlKHJlcSwgbmV3IEZha2VIdHRwU2VydmxldFJlc3BvbnNlKCkpOworCisgICAgcmV0dXJuIHZpZXcuZ2V0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtd2FyL3BvbS54bWwgYi9naXRpbGVzLXdhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDIxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXdhci9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdpdGlsZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Z2l0aWxlcy1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5naXRpbGVzLXdhcjwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+R2l0aWxlcyAtIFdBUjwvbmFtZT4KKworICA8ZGVzY3JpcHRpb24+CisgICAgR2l0aWxlcyBwYWNrYWdlZCBhcyBhIHN0YW5kYXJkIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2l0aWxlczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdpdGlsZXMtc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5VmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8d2ViUmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYzwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4rc3RhdGljPC90YXJnZXRQYXRoPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICA8L3dlYlJlc291cmNlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2dpdGlsZXMtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZDU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiA+Cis8IS0tCisgIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwPgorICA8ZGlzcGxheS1uYW1lPkdpdGlsZXM8L2Rpc3BsYXktbmFtZT4KKworICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPmdpdGlsZXM8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5jb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5jb25maWdQYXRoPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPmdpdGlsZXMuY29uZmlnPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvc2VydmxldD4KKworICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+Z2l0aWxlczwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy13YXIvd2ViZGVmYXVsdC54bWwgYi9naXRpbGVzLXdhci93ZWJkZWZhdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFkZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy13YXIvd2ViZGVmYXVsdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiA+Cis8IS0tCisgIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx3ZWItYXBwPgorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPmRlZmF1bHQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LkRlZmF1bHRTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICA8L3NlcnZsZXQ+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5kZWZhdWx0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi8rc3RhdGljLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGJhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMjA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPmNvbS5nb29nbGUuZ2l0aWxlczwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Z2l0aWxlcy1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKworICA8bmFtZT5HaXRpbGVzIC0gUGFyZW50PC9uYW1lPgorICA8dXJsPmh0dHBzOi8vZ2Vycml0Lmdvb2dsZXNvdXJjZS5jb20vZ2l0aWxlczwvdXJsPgorCisgIDxkZXNjcmlwdGlvbj4KKyAgICBHaXRpbGVzIC0gU2ltcGxlIEdpdCBSZXBvc2l0b3J5IEJyb3dzZXIKKyAgPC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydGllcz4KKyAgICA8IS0tIFNob3VsZCB0cmFjayBHZXJyaXQncyBqZ2l0VmVyc2lvbiBmYWlybHkgY2xvc2VseS4gLS0+CisgICAgPGpnaXRWZXJzaW9uPjIuMC4wLjIwMTIwNjEzMDkwMC1yLjEyOS1nZTYzZjFjOTwvamdpdFZlcnNpb24+CisgICAgPGpldHR5VmVyc2lvbj43LjUuMi52MjAxMTEwMDY8L2pldHR5VmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+Z2l0aWxlcy1zZXJ2bGV0PC9tb2R1bGU+CisgICAgPG1vZHVsZT5naXRpbGVzLXdhcjwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKyAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEzLjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLnRlbXBsYXRlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zb3k8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIwMTEtMjItMTI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2pnaXRWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amdpdFZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtqZ2l0VmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj42LjAuMjk8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNi4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+am9kYS10aW1lPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qb2RhLXRpbWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amV0dHlWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICA8cGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjIuMy4yPC92ZXJzaW9uPgorICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+CisgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1UaXRsZT5HaXRpbGVzIC0gJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9JbXBsZW1lbnRhdGlvbi1UaXRsZT4KKyAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+CisgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlbmRvcj5HaXRpbGVzPC9JbXBsZW1lbnRhdGlvbi1WZW5kb3I+CisgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlbmRvci1JZD5jb20uZ29vZ2xlLmdpdGlsZXM8L0ltcGxlbWVudGF0aW9uLVZlbmRvci1JZD4KKyAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yLVVSTD5odHRwczovL2dlcnJpdC5nb29nbGVzb3VyY2UuY29tL2dpdGlsZXMvPC9JbXBsZW1lbnRhdGlvbi1WZW5kb3ItVVJMPgorICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi4xLjE8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi4xLjI8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgICAgPC9wbHVnaW5zPgorICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKworICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtqZXR0eVZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8d2ViQXBwPgorICAgICAgICAgICAgPGRlZmF1bHRzRGVzY3JpcHRvcj5naXRpbGVzLXdhci93ZWJkZWZhdWx0LnhtbDwvZGVmYXVsdHNEZXNjcmlwdG9yPgorICAgICAgICAgIDwvd2ViQXBwPgorICAgICAgICAgIDx3YXI+Z2l0aWxlcy13YXIvdGFyZ2V0L2dpdGlsZXMtd2FyLSR7cHJvamVjdC52ZXJzaW9ufS53YXI8L3dhcj4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8IS0tIFRPRE8oZGJvcm93aXR6KTogU2VwYXJhdGUgZXhlY3V0aW9uIHdpdGggcmVsb2FkYWJsZSBzdGF0aWMKKyAgICAgICAgICByZXNvdXJjZXMgYW5kIHRlbXBsYXRlcy4gLS0+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPHJlcG9zaXRvcmllcz4KKyAgICA8IS0tIEZvciBKR2l0IGFuZCBTb3kgc25hcHNob3RzLiAtLT4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5nZXJyaXQtbWF2ZW48L2lkPgorICAgICAgPHVybD5odHRwczovL2dlcnJpdC1tYXZlbi5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbTwvdXJsPgorICAgIDwvcmVwb3NpdG9yeT4KKworICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmpnaXQtcmVwb3NpdG9yeTwvaWQ+CisgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9qZ2l0L21hdmVuPC91cmw+CisgICAgPC9yZXBvc2l0b3J5PgorCisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+amF2YS5uZXQtcmVwb3NpdG9yeTwvaWQ+CisgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8yLzwvdXJsPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9yZXBvc2l0b3JpZXM+Cis8L3Byb2plY3Q+Cg==