ZGlmZiAtLWdpdCBhL2dlcm9uaW1vLXRyYW5zYWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9nZXJvbmltby90cmFuc2FjdGlvbi9tYW5hZ2VyL1RyYW5zYWN0aW9uSW1wbC5qYXZhIGIvZ2Vyb25pbW8tdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL3RyYW5zYWN0aW9uL21hbmFnZXIvVHJhbnNhY3Rpb25JbXBsLmphdmEKaW5kZXggYjU5OGRiNC4uNWQyZTBlYyAxMDA2NDQKLS0tIGEvZ2Vyb25pbW8tdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL3RyYW5zYWN0aW9uL21hbmFnZXIvVHJhbnNhY3Rpb25JbXBsLmphdmEKKysrIGIvZ2Vyb25pbW8tdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dlcm9uaW1vL3RyYW5zYWN0aW9uL21hbmFnZXIvVHJhbnNhY3Rpb25JbXBsLmphdmEKQEAgLTIxMSw2ICsyMTEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFhBRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gZW5saXN0IFhBUmVzb3VyY2UgIiArIHhhUmVzICsgIiwgZXJyb3JDb2RlOiAiICsgZS5lcnJvckNvZGUsIGUpOworICAgICAgICAgICAgLy8gbWFyayBzdGF0dXMgYXMgcm9sbGJhY2sgb25seSBiZWNhdXNlIGVubGlzdCByZXNvdXJjZSBmYWlsZWQKKyAgICAgICAgICAgIHNldFJvbGxiYWNrT25seSgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjk5LDM1ICszMDEsMTggQEAKICAgICAgICAgICAgIC8vIG9uZS1waGFzZQogICAgICAgICAgICAgaWYgKHJlc291cmNlTWFuYWdlcnMuc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkJyYW5jaCBtYW5hZ2VyID0gKFRyYW5zYWN0aW9uQnJhbmNoKSByZXNvdXJjZU1hbmFnZXJzLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb21taXR0ZXIoKS5jb21taXQobWFuYWdlci5nZXRCcmFuY2hJZCgpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuU1RBVFVTX0NPTU1JVFRFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoWEFFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1cy5TVEFUVVNfUk9MTEVEQkFDSzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX0hFVVJSQikgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb21taXR0ZXIoKS5mb3JnZXQobWFuYWdlci5nZXRCcmFuY2hJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChIZXVyaXN0aWNSb2xsYmFja0V4Y2VwdGlvbikgbmV3IEhldXJpc3RpY1JvbGxiYWNrRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgb25lLXBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQV9IRVVSTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmZvcmdldChtYW5hZ2VyLmdldEJyYW5jaElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEhldXJpc3RpY01peGVkRXhjZXB0aW9uKSBuZXcgSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24oIkVycm9yIGR1cmluZyBvbmUtcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX0hFVVJDT00pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gYXMgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlRyYW5zYWN0aW9uIGhhcyBiZWVuIGhldXJpc3RpY2FsbHkgY29tbWl0dGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmZvcmdldChtYW5hZ2VyLmdldEJyYW5jaElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJvbGxiYWNrRXhjZXB0aW9uKSBuZXcgUm9sbGJhY2tFeGNlcHRpb24oIkVycm9yIGR1cmluZyBvbmUtcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tbWl0UmVzb3VyY2UobWFuYWdlcik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHR3by1waGFzZQotICAgICAgICAgICAgYm9vbGVhbiB3aWxsQ29tbWl0ID0gaW50ZXJuYWxQcmVwYXJlKCk7CisgICAgICAgICAgICBib29sZWFuIHdpbGxDb21taXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gdHdvLXBoYXNlCisgICAgICAgICAgICAgICAgd2lsbENvbW1pdCA9IGludGVybmFsUHJlcGFyZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU3lzdGVtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByb2xsYmFja1Jlc291cmNlcyhyZXNvdXJjZU1hbmFnZXJzKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCiAKICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgUk1zCiAgICAgICAgICAgICBpZiAod2lsbENvbW1pdCkgewpAQCAtMzM3LDggKzMyMiw2IEBACiAgICAgICAgICAgICAgICAgLy8gWEFFeGNlcHRpb24gZHVyaW5nIHRoZSBhYm92ZSBpbnRlcm5hbFByZXBhcmUKICAgICAgICAgICAgICAgICByb2xsYmFja1Jlc291cmNlc0R1cmluZ0NvbW1pdChyZXNvdXJjZU1hbmFnZXJzLCB0cnVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWEFFeGNlcHRpb24gZSkgewotICAgICAgICAgICB0aHJvdyAoU3lzdGVtRXhjZXB0aW9uKSBuZXcgU3lzdGVtRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgY29tbWl0IikuaW5pdENhdXNlKGUpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgYWZ0ZXJDb21wbGV0aW9uKCk7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTQzNyw2ICs0MjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgcm1zLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKFhBRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFFUl9STUVSUiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBRVJfUFJPVE8KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBRVJfSU5WQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFN5c3RlbUV4Y2VwdGlvbikgbmV3IFN5c3RlbUV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHByZXBhcmU7IHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjayIpLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1cy5TVEFUVVNfTUFSS0VEX1JPTExCQUNLOwogICAgICAgICAgICAgICAgICAgICAvKiBQZXIgSlRBIHNwZWMsICBJZiB0aGUgcmVzb3VyY2UgbWFuYWdlciB3YW50cyB0byByb2xsIGJhY2sgdGhlIHRyYW5zYWN0aW9uLCAKQEAgLTQ0Niw3ICs0MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBhbnkga25vd2xlZGdlIGFib3V0IHRoZSB0cmFuc2FjdGlvbiAod2hpY2ggbWlnaHQgaGFwcGVuIGFmdGVyIGEgY3Jhc2gpLiBJZiB0aGlzIAogICAgICAgICAgICAgICAgICAgICByZXNwb25zZSBpcyByZXR1cm5lZCwgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgcm9sbGVkIGJhY2suIEZ1cnRoZXJtb3JlLCB0aGUgVHJhbnNhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgaXMgbm90IHJlcXVpcmVkIHRvIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbiB0aGlzIHJlc291cmNlLiovCi0gICAgICAgICAgICAgICAgICAgIHJtcy5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9ybXMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTYwNyw2ICs1OTUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCBzZXQgdGhlIGNhdXNlIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUcmFuc2FjdGlvbiBoYXMgYmVlbiBoZXVyaXN0aWNhbGx5IHJvbGxlZCBiYWNrICIgKyBtYW5hZ2VyLmdldENvbW1pdHRlcigpICsgIjsgY29udGludWluZyB3aXRoIHJvbGxiYWNrIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmZvcmdldChtYW5hZ2VyLmdldEJyYW5jaElkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX1JCUk9MTEJBQ0sgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFFUl9STUVSUiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX05PVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX1JNRkFJTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3Mgbm90IHNldCB0aGUgY2F1c2UgaGVyZSBiZWNhdXNlIHdlIGV4cGVjdCB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgcm9sbGVkIGJhY2sgZXZlbnR1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIFJNRkFJTCwgaXQgbWVhbnMgcmVzb3VyY2UgdW5hdmFpbGFibGUgdGVtcG9yYXJpbHkuICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIG5lZWQga2VlcCBzZW5kaW5nIHJlcXVlc3QgdG8gcmVzb3VyY2UgdG8gbWFrZSBzdXJlIHRoZSByb2xsIGJhY2sgY29tcGxldGVzPwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlID0gbmV3IFN5c3RlbUV4Y2VwdGlvbihlLmVycm9yQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY1MSw2ICs2NDYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVHJhbnNhY3Rpb24gaGFzIGJlZW4gaGV1cmlzdGljYWxseSBjb21taXR0ZWQgIiArIG1hbmFnZXIuZ2V0Q29tbWl0dGVyKCkgKyAiOyBjb250aW51aW5nIHdpdGggcm9sbGJhY2siLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29tbWl0dGVyKCkuZm9yZ2V0KG1hbmFnZXIuZ2V0QnJhbmNoSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFfUkJST0xMQkFDSyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX1JNRVJSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFFUl9OT1RBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFFUl9STUZBSUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhBRXhjZXB0aW9uLlhBX1JCUk9MTEJBQ0sgZHVyaW5nIGNvbW1pdC9yb2xsYmFjaywgdGh1cyBSb2xsYmFja0V4Y2VwdGlvbiBpcyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gWEFFeGNlcHRpb24uWEFFUl9STUVSUiBtZWFucyB0cmFuc2FjdGlvbiBicmFuY2ggZXJyb3IgYW5kIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHJvbGxlZCBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBub3Qgc2V0IHRoZSBjYXVzZSBoZXJlIGJlY2F1c2Ugd2UgZXhwZWN0IHRoZSB0cmFuc2FjdGlvbiB0byBiZSByb2xsZWQgYmFjayBldmVudHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgUk1GQUlMLCBpdCBtZWFucyByZXNvdXJjZSB1bmF2YWlsYWJsZSB0ZW1wb3JhcmlseS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgbmVlZCBrZWVwIHNlbmRpbmcgcmVxdWVzdCB0byByZXNvdXJjZSB0byBtYWtlIHN1cmUgdGhlIHJvbGwgYmFjayBjb21wbGV0ZXM/CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NzcsNiArNjgxLDcxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNvbW1pdFJlc291cmNlKFRyYW5zYWN0aW9uQnJhbmNoIG1hbmFnZXIpIHRocm93cyBSb2xsYmFja0V4Y2VwdGlvbiwgSGV1cmlzdGljUm9sbGJhY2tFeGNlcHRpb24sIEhldXJpc3RpY01peGVkRXhjZXB0aW9uLCBTeXN0ZW1FeGNlcHRpb257CisgICAgICAgIFhBRXhjZXB0aW9uIGNhdXNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmNvbW1pdChtYW5hZ2VyLmdldEJyYW5jaElkKCksIHRydWUpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuU1RBVFVTX0NPTU1JVFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoWEFFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuU1RBVFVTX1JPTExFREJBQ0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQV9IRVVSUkIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBlOworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmZvcmdldChtYW5hZ2VyLmdldEJyYW5jaElkKCkpOworICAgICAgICAgICAgICAgICAgICAvL3Rocm93IChIZXVyaXN0aWNSb2xsYmFja0V4Y2VwdGlvbikgbmV3IEhldXJpc3RpY1JvbGxiYWNrRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgb25lLXBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX0hFVVJNSVgpIHsKKyAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBlOworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbW1pdHRlcigpLmZvcmdldChtYW5hZ2VyLmdldEJyYW5jaElkKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24pIG5ldyBIZXVyaXN0aWNNaXhlZEV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG9uZS1waGFzZSBjb21taXQiKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQV9IRVVSQ09NKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gYXMgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZAorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiVHJhbnNhY3Rpb24gaGFzIGJlZW4gaGV1cmlzdGljYWxseSBjb21taXR0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb21taXR0ZXIoKS5mb3JnZXQobWFuYWdlci5nZXRCcmFuY2hJZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX1JCUk9MTEJBQ0sgCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX1JNRVJSIAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFFUl9OT1RBKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBlciBYQSBzcGVjLCBYQUV4Y2VwdGlvbi5YQUVSX1JNRVJSIGZyb20gY29tbWl0IG1lYW5zIEFuIGVycm9yIG9jY3VycmVkIGluIAorICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0aW5nIHRoZSB3b3JrIHBlcmZvcm1lZCBvbiBiZWhhbGYgb2YgdGhlIHRyYW5zYWN0aW9uIGJyYW5jaCAKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBicmFuY2jVcyB3b3JrIGhhcyBiZWVuIHJvbGxlZCBiYWNrLiAKKyAgICAgICAgICAgICAgICAgICAgLy8gWEFFeGNlcHRpb24uWEFFUl9OT1RBOiAgc3N1bWUgdGhlIERCIHRvb2sgYSB1bmlsYXRlcmFsIHJvbGxiYWNrIGRlY2lzaW9uIGFuZCBmb3Jnb3QgdGhlIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUcmFuc2FjdGlvbiBoYXMgYmVlbiByb2xsZWQgYmFjayIpOworICAgICAgICAgICAgICAgICAgICBjYXVzZSA9IGU7CisgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IChSb2xsYmFja0V4Y2VwdGlvbikgbmV3IFJvbGxiYWNrRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgb25lLXBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShlKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYXVzZSA9IGU7CisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgKFN5c3RlbUV4Y2VwdGlvbikgbmV3IFN5c3RlbUV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIG9uZS1waGFzZSBjb21taXQiKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFhBRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX05PVEEpIHsKKyAgICAgICAgICAgICAgICAvLyBOT1RBIGluIHJlc3BvbnNlIHRvIGZvcmdldCwgbWVhbnMgdGhlIHJlc291cmNlIGFscmVhZHkgZm9yZ290IHRoZSB0cmFuc2FjdGlvbgorICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoU3lzdGVtRXhjZXB0aW9uKSBuZXcgU3lzdGVtRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgb25lIHBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjYXVzZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFfSEVVUlJCKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEhldXJpc3RpY1JvbGxiYWNrRXhjZXB0aW9uKSBuZXcgSGV1cmlzdGljUm9sbGJhY2tFeGNlcHRpb24oIkVycm9yIGR1cmluZyB0d28gcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX0hFVVJNSVgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24pIG5ldyBIZXVyaXN0aWNNaXhlZEV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHR3byBwaGFzZSBjb21taXQiKS5pbml0Q2F1c2UoY2F1c2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYXVzZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFfUkJST0xMQkFDSyAKKyAgICAgICAgICAgICAgICAgICAgfHwgY2F1c2UuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBRVJfUk1FUlIgCisgICAgICAgICAgICAgICAgICAgIHx8IGNhdXNlLmVycm9yQ29kZSA9PSBYQUV4Y2VwdGlvbi5YQUVSX05PVEEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUm9sbGJhY2tFeGNlcHRpb24pIG5ldyBSb2xsYmFja0V4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHR3byBwaGFzZSBjb21taXQiKS5pbml0Q2F1c2UoY2F1c2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoU3lzdGVtRXhjZXB0aW9uKSBuZXcgU3lzdGVtRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgdHdvIHBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShjYXVzZSk7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBjb21taXRSZXNvdXJjZXMoTGlzdCBybXMpIHRocm93cyBIZXVyaXN0aWNSb2xsYmFja0V4Y2VwdGlvbiwgSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24sIFN5c3RlbUV4Y2VwdGlvbiB7CiAgICAgICAgIFhBRXhjZXB0aW9uIGNhdXNlID0gbnVsbDsKQEAgLTcxMyw3ICs3ODIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFhBRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChTeXN0ZW1FeGNlcHRpb24pIG5ldyBTeXN0ZW1FeGNlcHRpb24oIkVycm9yIGR1cmluZyB0d28gcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgaWYgKGUuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBRVJfTk9UQSkgeworICAgICAgICAgICAgICAgIC8vIE5PVEEgaW4gcmVzcG9uc2UgdG8gZm9yZ2V0LCBtZWFucyB0aGUgcmVzb3VyY2UgYWxyZWFkeSBmb3Jnb3QgdGhlIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IChTeXN0ZW1FeGNlcHRpb24pIG5ldyBTeXN0ZW1FeGNlcHRpb24oIkVycm9yIGR1cmluZyB0d28gcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vaWYgYWxsIHJlc291cmNlcyB3ZXJlIHJlYWQgb25seSwgd2UgZGlkbid0IHdyaXRlIGEgcHJlcGFyZSByZWNvcmQuCiAgICAgICAgIGlmICghcm1zLmlzRW1wdHkoKSkgewpAQCAtNzM0LDggKzgwOCw2IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgKEhldXJpc3RpY01peGVkRXhjZXB0aW9uKSBuZXcgSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24oIkVycm9yIGR1cmluZyB0d28gcGhhc2UgY29tbWl0IikuaW5pdENhdXNlKGNhdXNlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UuZXJyb3JDb2RlID09IFhBRXhjZXB0aW9uLlhBX0hFVVJNSVgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyAoSGV1cmlzdGljTWl4ZWRFeGNlcHRpb24pIG5ldyBIZXVyaXN0aWNNaXhlZEV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHR3byBwaGFzZSBjb21taXQiKS5pbml0Q2F1c2UoY2F1c2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjYXVzZS5lcnJvckNvZGUgPT0gWEFFeGNlcHRpb24uWEFfSEVVUkNPTSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkb24ndCBuZWVkIHRvIGluZm9ybSB0aGUgdHggb3JpZ2luYXRvcgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyAoU3lzdGVtRXhjZXB0aW9uKSBuZXcgU3lzdGVtRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgdHdvIHBoYXNlIGNvbW1pdCIpLmluaXRDYXVzZShjYXVzZSk7CiAgICAgICAgICAgICB9IAo=