ZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvQW5ub3VuY2VtZW50Q29udHJvbGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Bbm5vdW5jZW1lbnRDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1MWYwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvQW5ub3VuY2VtZW50Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LkFOTk9VTkNFTUVOVDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLkFubm91bmNlbWVudE1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuUmVzdWx0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi4qOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvYW5ub3VuY2VtZW50IikKK3B1YmxpYyBjbGFzcyBBbm5vdW5jZW1lbnRDb250cm9sbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQW5ub3VuY2VtZW50TWFwcGVyIGFubm91bmNlbWVudE1hcHBlcjsKKworICAgIHB1YmxpYyBBbm5vdW5jZW1lbnRDb250cm9sbGVyKEFubm91bmNlbWVudE1hcHBlciBhbm5vdW5jZW1lbnRNYXBwZXIpIHsKKyAgICAgICAgdGhpcy5hbm5vdW5jZW1lbnRNYXBwZXIgPSBhbm5vdW5jZW1lbnRNYXBwZXI7CisgICAgfQorCisgICAgLy8g6I635Y+W5omA5pyJ5YWs5ZGKCisgICAgQEdldE1hcHBpbmcoIi9saXN0IikKKyAgICBwdWJsaWMgUmVzdWx0IGxpc3RBbGwoKSB7CisgICAgICAgIExpc3Q8QU5OT1VOQ0VNRU5UPiBhbm5vdW5jZW1lbnRzID0gYW5ub3VuY2VtZW50TWFwcGVyLnNlbGVjdEFsbCgpOworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgiYW5ub3VuY2VtZW50cyIsIGFubm91bmNlbWVudHMpOworICAgIH0KKworICAgIC8vIOiOt+WPluacgOaWsDXmnaHlhazlkYrvvIjnlKjkuo7pppbpobXlsZXnpLrvvIkKKyAgICBAR2V0TWFwcGluZygiL2xhdGVzdCIpCisgICAgcHVibGljIFJlc3VsdCBsaXN0TGF0ZXN0KCkgeworICAgICAgICBMaXN0PEFOTk9VTkNFTUVOVD4gYW5ub3VuY2VtZW50cyA9IGFubm91bmNlbWVudE1hcHBlci5zZWxlY3RMYXRlc3QoNSk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJhbm5vdW5jZW1lbnRzIiwgYW5ub3VuY2VtZW50cyk7CisgICAgfQorCisgICAgLy8g6I635Y+W5YWs5ZGK6K+m5oOFCisgICAgQEdldE1hcHBpbmcoIi97aWR9IikKKyAgICBwdWJsaWMgUmVzdWx0IGdldERldGFpbChAUGF0aFZhcmlhYmxlIEludGVnZXIgaWQpIHsKKyAgICAgICAgQU5OT1VOQ0VNRU5UIGFubm91bmNlbWVudCA9IGFubm91bmNlbWVudE1hcHBlci5zZWxlY3RCeUlkKGlkKTsKKyAgICAgICAgaWYgKGFubm91bmNlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkubWVzc2FnZSgi5YWs5ZGK5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLmRhdGEoImFubm91bmNlbWVudCIsIGFubm91bmNlbWVudCk7CisgICAgfQorCisgICAgLy8g5paw5aKe5YWs5ZGKCisgICAgQFBvc3RNYXBwaW5nKCIvY3JlYXRlIikKKyAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZUFubm91bmNlbWVudChAUmVxdWVzdFBhcmFtIFN0cmluZyB0aXRsZSwgQFJlcXVlc3RQYXJhbSBTdHJpbmcgY29udGVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQU5OT1VOQ0VNRU5UIGFubm91bmNlbWVudCA9IG5ldyBBTk5PVU5DRU1FTlQoKTsKKyAgICAgICAgICAgIGFubm91bmNlbWVudC5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgICAgICBhbm5vdW5jZW1lbnQuc2V0Q29udGVudChjb250ZW50KTsKKyAgICAgICAgICAgIGFubm91bmNlbWVudC5zZXRDcmVhdGVUaW1lKExvY2FsRGF0ZVRpbWUubm93KCkpOworCisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gYW5ub3VuY2VtZW50TWFwcGVyLmluc2VydChhbm5vdW5jZW1lbnQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkubWVzc2FnZSgi5YWs5ZGK5Y+R5biD5oiQ5YqfIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIOa3u+WKoOmUmeivr+eggeWPguaVsO+8iOWmgjUwMOihqOekuuacjeWKoeWZqOmUmeivr++8iQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNTAwKS5tZXNzYWdlKCLlhazlkYrlj5HluIPlpLHotKUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIOa3u+WKoOmUmeivr+eggeWPguaVsO+8iOWmgjUwMOihqOekuuacjeWKoeWZqOmUmeivr++8iQorICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig1MDApLm1lc3NhZ2UoIuacjeWKoeWZqOmUmeivrzogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9SZXF1ZXN0Q29tbWVudENvbnRyb2xsZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvUmVxdWVzdENvbW1lbnRDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjN2FjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvUmVxdWVzdENvbW1lbnRDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5jb25kaXRpb25zLnF1ZXJ5LlF1ZXJ5V3JhcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlJlcXVlc3RDb21tZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLlJlcXVlc3RDb21tZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5SZXF1ZXN0UG9zdFNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsKK2ltcG9ydCBsb21ib2suQWxsQXJnc0NvbnN0cnVjdG9yOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIubXVsdGlwYXJ0Lk11bHRpcGFydEZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9yZXF1ZXN0L2NvbW1lbnRzIikKK0BBbGxBcmdzQ29uc3RydWN0b3IKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0Q29tbWVudENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbW1lbnRTZXJ2aWNlIGNvbW1lbnRTZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFBvc3RTZXJ2aWNlIHBvc3RTZXJ2aWNlOworCisgICAgQFBvc3RNYXBwaW5nKCIve2NvbW1lbnRJZH0vbGlrZSIpCisgICAgcHVibGljIFJlc3VsdCBsaWtlKEBQYXRoVmFyaWFibGUgaW50IGNvbW1lbnRJZCkgeworICAgICAgICBjb21tZW50U2VydmljZS5pbmNyZW1lbnRMaWtlKGNvbW1lbnRJZCk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soKTsKKyAgICB9CisKKyAgICAvLyDojrflj5bor4TorrrnmoTlm57lpI0KKyAgICBAR2V0TWFwcGluZygiL3tjb21tZW50SWR9L3JlcGxpZXMiKQorICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVwbGllcyhAUGF0aFZhcmlhYmxlIGludCBjb21tZW50SWQpIHsKKyAgICAgICAgTGlzdDxSZXF1ZXN0Q29tbWVudD4gcmVwbGllcyA9IGNvbW1lbnRTZXJ2aWNlLmdldFJlcGxpZXMoY29tbWVudElkKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLmRhdGEoInJlcGxpZXMiLCByZXBsaWVzKTsKKyAgICB9CisKKyAgICBAUG9zdE1hcHBpbmcodmFsdWUgPSAiL3tjb21tZW50SWR9L3JlcGxpZXMiLCBjb25zdW1lcyA9IE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1ZBTFVFKQorICAgIHB1YmxpYyBSZXN1bHQgYWRkUmVwbHkoQFBhdGhWYXJpYWJsZSBpbnQgY29tbWVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSgiYXV0aG9ySWQiKSBTdHJpbmcgYXV0aG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKCJjb250ZW50IikgU3RyaW5nIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKHZhbHVlID0gImltYWdlIiwgcmVxdWlyZWQgPSBmYWxzZSkgTXVsdGlwYXJ0RmlsZSBpbWFnZSkgeworICAgICAgICAvLyDmoKHpqozniLbor4TorrrmmK/lkKblrZjlnKgKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgcGFyZW50Q29tbWVudCA9IGNvbW1lbnRTZXJ2aWNlLmdldEJ5SWQoY29tbWVudElkKTsKKyAgICAgICAgaWYgKHBhcmVudENvbW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLnNldE1lc3NhZ2UoIuiiq+WbnuWkjeeahOivhOiuuuS4jeWtmOWcqCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8g5p6E6YCg5Zue5aSN6K+E6K665a+56LGhCisgICAgICAgIFJlcXVlc3RDb21tZW50IHJlcGx5ID0gbmV3IFJlcXVlc3RDb21tZW50KCk7CisgICAgICAgIHJlcGx5LnNldFBvc3RJZChwYXJlbnRDb21tZW50LmdldFBvc3RJZCgpKTsKKyAgICAgICAgcmVwbHkuc2V0UGFyZW50SWQoY29tbWVudElkKTsKKyAgICAgICAgcmVwbHkuc2V0QXV0aG9ySWQoYXV0aG9ySWQpOyAgICAgICAgICAgICAgLy8gU3RyaW5nIOexu+WeiworICAgICAgICByZXBseS5zZXRSZXBseVRvKHBhcmVudENvbW1lbnQuZ2V0QXV0aG9ySWQoKSk7CisgICAgICAgIHJlcGx5LnNldENvbnRlbnQoY29udGVudCk7CisgICAgICAgIHJlcGx5LnNldENyZWF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7CisgICAgICAgIHJlcGx5LnNldExpa2VDb3VudCgwKTsKKworICAgICAgICAvLyDlj6/pgInvvJrlpITnkIblm77niYfkuIrkvKAKKyAgICAgICAgaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUV4dCA9IGltYWdlLmdldE9yaWdpbmFsRmlsZW5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhpbWFnZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCkubGFzdEluZGV4T2YoJy4nKSArIDEpOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IFVVSUQucmFuZG9tVVVJRCgpICsgIi4iICsgZmlsZUV4dDsKKworICAgICAgICAgICAgICAgIFN0cmluZyB1cGxvYWREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBGaWxlLnNlcGFyYXRvciArICJ1cGxvYWRzIjsKKyAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHVwbG9hZERpcik7CisgICAgICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIGRpci5ta2RpcnMoKTsKKworICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IG5ldyBGaWxlKGRpciwgZmlsZU5hbWUpOworICAgICAgICAgICAgICAgIGltYWdlLnRyYW5zZmVyVG8oZGVzdCk7CisKKyAgICAgICAgICAgICAgICAvLyDkv53lrZjnm7jlr7norr/pl67ot6/lvoQKKyAgICAgICAgICAgICAgICByZXBseS5zZXRJbWFnZVVybCgiL3VwbG9hZHMvIiArIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi5Zu+54mH5LiK5Lyg5aSx6LSl77yaIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIOS/neWtmOWIsOaVsOaNruW6kworICAgICAgICBjb21tZW50U2VydmljZS5zYXZlKHJlcGx5KTsKKworICAgICAgICAvLyDmm7TmlrDluJblrZDor4TorrrmlbAKKyAgICAgICAgcG9zdFNlcnZpY2UuaW5jcmVtZW50UmVwbHlDb3VudChwYXJlbnRDb21tZW50LmdldFBvc3RJZCgpKTsKKworICAgICAgICAvLyDov5Tlm57mlrDlm57lpI3lj4rlhbbniLbor4TorrogSUQKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpCisgICAgICAgICAgICAgICAgLmRhdGEoInJlcGx5IiwgcmVwbHkpCisgICAgICAgICAgICAgICAgLmRhdGEoInBhcmVudENvbW1lbnRJZCIsIGNvbW1lbnRJZCk7CisgICAgfQorCisKKyAgICAvLyDliKDpmaTor4TorroKKyAgICBARGVsZXRlTWFwcGluZygiL3tjb21tZW50SWR9IikKKyAgICBwdWJsaWMgUmVzdWx0IGRlbGV0ZUNvbW1lbnQoCisgICAgICAgICAgICBAUGF0aFZhcmlhYmxlIGludCBjb21tZW50SWQsCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtIFN0cmluZyBhdXRob3JJZCkgeworCisgICAgICAgIC8vIDEuIOiOt+WPluimgeWIoOmZpOeahOivhOiuugorICAgICAgICBSZXF1ZXN0Q29tbWVudCBjb21tZW50ID0gY29tbWVudFNlcnZpY2UuZ2V0QnlJZChjb21tZW50SWQpOworICAgICAgICBpZiAoY29tbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi6K+E6K665LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiDpqozor4HlvZPliY3nlKjmiLfmmK/lkKbmnInmnYPpmZDliKDpmaTvvIjmr5Tlr7lhdXRob3JJZO+8iQorICAgICAgICBpZiAoIWNvbW1lbnQuZ2V0QXV0aG9ySWQoKS5lcXVhbHMoYXV0aG9ySWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwMykuc2V0TWVzc2FnZSgi5peg5p2D5Yig6Zmk5q2k6K+E6K66Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyAzLiDpgJLlvZLliKDpmaTmiYDmnInlrZDlm57lpI0KKyAgICAgICAgZGVsZXRlUmVwbGllc1JlY3Vyc2l2ZWx5KGNvbW1lbnRJZCk7CisKKyAgICAgICAgLy8gNC4g5Yig6Zmk5Li76K+E6K66CisgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGNvbW1lbnRTZXJ2aWNlLnJlbW92ZUJ5SWQoY29tbWVudElkKTsKKworLy8gICAgICAgICAgICAvLyA1LiDmm7TmlrDluJblrZDlm57lpI3mlbDvvIjlpoLmnpzpnIDopoHvvIkKKy8vICAgICAgICAgICAgaWYgKHJlbW92ZWQgJiYgY29tbWVudC5nZXRQYXJlbnRJZCgpID09IDApIHsKKy8vICAgICAgICAgICAgICAgIHBvc3RTZXJ2aWNlLmRlY3JlbWVudFJlcGx5Q291bnQoY29tbWVudC5nZXRQb3N0SWQoKSk7CisvLyAgICAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVtb3ZlZCA/IFJlc3VsdC5vaygpIDogUmVzdWx0LmVycm9yKDUwMCkuc2V0TWVzc2FnZSgi5Yig6Zmk6K+E6K665aSx6LSlIik7CisgICAgfQorICAgIC8vIOmAkuW9kuWIoOmZpOaJgOacieWbnuWkjQorICAgIHByaXZhdGUgdm9pZCBkZWxldGVSZXBsaWVzUmVjdXJzaXZlbHkoaW50IHBhcmVudENvbW1lbnRJZCkgeworICAgICAgICAvLyDmt7vliqDkv53miqTmjqrmlr3pmLLmraLml6DpmZDpgJLlvZIKKyAgICAgICAgaWYgKHBhcmVudENvbW1lbnRJZCA8PSAwKSByZXR1cm47CisKKyAgICAgICAgLy8g5p+l5om+5omA5pyJ55u05o6l5Zue5aSNCisgICAgICAgIExpc3Q8UmVxdWVzdENvbW1lbnQ+IHJlcGxpZXMgPSBjb21tZW50U2VydmljZS5saXN0KAorICAgICAgICAgICAgICAgIG5ldyBRdWVyeVdyYXBwZXI8UmVxdWVzdENvbW1lbnQ+KCkuZXEoInBhcmVudF9pZCIsIHBhcmVudENvbW1lbnRJZCkKKyAgICAgICAgKTsKKworICAgICAgICAvLyDpgJLlvZLliKDpmaTmr4/kuKrlm57lpI3lj4rlhbblrZDlm57lpI0KKyAgICAgICAgZm9yIChSZXF1ZXN0Q29tbWVudCByZXBseSA6IHJlcGxpZXMpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlcGxpZXNSZWN1cnNpdmVseShyZXBseS5nZXRJZCgpKTsKKyAgICAgICAgICAgIGNvbW1lbnRTZXJ2aWNlLnJlbW92ZUJ5SWQocmVwbHkuZ2V0SWQoKSk7CisKKy8vICAgICAgICAgICAgICAgIC8vIOWmguaenOaYr+S4u+ivhOiuuu+8iHBhcmVudF9pZD0w77yJ77yM5pu05paw5biW5a2Q5Zue5aSN5pWwCisvLyAgICAgICAgICAgICAgICBpZiAocmVwbHkuZ2V0UGFyZW50SWQoKSA9PSAwKSB7CisvLyAgICAgICAgICAgICAgICAgICAgcG9zdFNlcnZpY2UuZGVjcmVtZW50UmVwbHlDb3VudChyZXBseS5nZXRQb3N0SWQoKSk7CisvLyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvUmVxdWVzdFBvc3RDb250cm9sbGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1JlcXVlc3RQb3N0Q29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTE4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1JlcXVlc3RQb3N0Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACitwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5jb250cm9sbGVyOworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy5xdWVyeS5RdWVyeVdyYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0Q29tbWVudDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlJlcXVlc3RQb3N0OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLlJlcXVlc3RDb21tZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5SZXF1ZXN0UG9zdFNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuTm90aWZpY2F0aW9uU2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuUmVzdWx0OworaW1wb3J0IGxvbWJvay5BbGxBcmdzQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLk1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uKjsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5tZXRhZGF0YS5JUGFnZTsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnBsdWdpbnMucGFnaW5hdGlvbi5QYWdlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvcmVxdWVzdC9wb3N0cyIpCitAQWxsQXJnc0NvbnN0cnVjdG9yCitwdWJsaWMgY2xhc3MgUmVxdWVzdFBvc3RDb250cm9sbGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RQb3N0U2VydmljZSBwb3N0U2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RDb21tZW50U2VydmljZSBjb21tZW50U2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIE5vdGlmaWNhdGlvblNlcnZpY2Ugbm90aWZpY2F0aW9uU2VydmljZTsKKworICAgIC8vIOS/ruaUueWIm+W7uuW4luWtkOeahOaWueazle+8jOaUr+aMgeWbvueJh+S4iuS8oAorICAgIEBQb3N0TWFwcGluZyhjb25zdW1lcyA9IE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1ZBTFVFLCBwcm9kdWNlcyA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1ZBTFVFKQorICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlUG9zdCgKKworICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSgidGl0bGUiKSBTdHJpbmcgdGl0bGUsCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKCJjb250ZW50IikgU3RyaW5nIGNvbnRlbnQsCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKCJhdXRob3JJZCIpIFN0cmluZyBhdXRob3JJZCwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0odmFsdWUgPSAiaW1hZ2UiLCByZXF1aXJlZCA9IGZhbHNlKSBNdWx0aXBhcnRGaWxlIGltYWdlKSB7CisKKyAgICAgICAgUmVxdWVzdFBvc3QgcG9zdCA9IG5ldyBSZXF1ZXN0UG9zdCgpOworICAgICAgICBwb3N0LnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgcG9zdC5zZXRDb250ZW50KGNvbnRlbnQpOworICAgICAgICBwb3N0LnNldEF1dGhvcklkKGF1dGhvcklkKTsKKyAgICAgICAgcG9zdC5zZXRDcmVhdGVUaW1lKExvY2FsRGF0ZVRpbWUubm93KCkpOworICAgICAgICBwb3N0LnNldExpa2VDb3VudCgwKTsKKyAgICAgICAgcG9zdC5zZXRSZXBseUNvdW50KDApOworICAgICAgICBwb3N0LnNldEltYWdlVXJsKG51bGwpOworLy8gICAgICAgIHBvc3Quc2V0SXNTb2x2ZWQoZmFsc2UpOworCisgICAgICAgIC8vIOWkhOeQhuWbvueJh+S4iuS8oAorICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbEZpbGVuYW1lID0gaW1hZ2UuZ2V0T3JpZ2luYWxGaWxlbmFtZSgpOworICAgICAgICAgICAgICAgIGlmKG9yaWdpbmFsRmlsZW5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUV4dCA9IG9yaWdpbmFsRmlsZW5hbWUuc3Vic3RyaW5nKGltYWdlLmdldE9yaWdpbmFsRmlsZW5hbWUoKS5sYXN0SW5kZXhPZignLicpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IFVVSUQucmFuZG9tVVVJRCgpICsgIi4iICsgZmlsZUV4dDsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXBsb2FkRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgRmlsZS5zZXBhcmF0b3IgKyAidXBsb2FkcyI7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUodXBsb2FkRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIGRpci5ta2RpcnMoKTsKKworICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UudHJhbnNmZXJUbyhkZXN0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjnm7jlr7norr/pl67ot6/lvoQKKyAgICAgICAgICAgICAgICAgICAgcG9zdC5zZXRJbWFnZVVybCgiL3VwbG9hZHMvIiArIGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLnNldE1lc3NhZ2UoIuWbvueJh+S4iuS8oOWksei0pe+8miIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3N0LnNldEltYWdlVXJsKG51bGwpOworICAgICAgICB9CisgICAgICAgIHBvc3RTZXJ2aWNlLnNhdmUocG9zdCk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJwb3N0IiwgcG9zdCk7CisgICAgfQorCisgICAgLy8g5YiX6KGo5YiG6aG1CisgICAgQEdldE1hcHBpbmcKKyAgICBwdWJsaWMgUmVzdWx0IGxpc3RQb3N0cyhAUmVxdWVzdFBhcmFtKGRlZmF1bHRWYWx1ZSA9ICIxIikgaW50IHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbShkZWZhdWx0VmFsdWUgPSAiNSIpIGludCBzaXplKSB7CisgICAgICAgIElQYWdlPFJlcXVlc3RQb3N0PiBpcGFnZSA9IHBvc3RTZXJ2aWNlLnBhZ2UoCisgICAgICAgICAgICAgICAgbmV3IFBhZ2U8PihwYWdlLCBzaXplKSwKKyAgICAgICAgICAgICAgICBuZXcgUXVlcnlXcmFwcGVyPFJlcXVlc3RQb3N0PigpLm9yZGVyQnlEZXNjKCJjcmVhdGVfdGltZSIpCisgICAgICAgICk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soKQorICAgICAgICAgICAgICAgIC5kYXRhKCJyZWNvcmRzIiwgaXBhZ2UuZ2V0UmVjb3JkcygpKQorICAgICAgICAgICAgICAgIC5kYXRhKCJ0b3RhbCIsIGlwYWdlLmdldFRvdGFsKCkpOworICAgIH0KKworICAgIEBHZXRNYXBwaW5nKCIvc2VhcmNoIikKKyAgICBwdWJsaWMgUmVzdWx0IHNlYXJjaFBvc3RzKAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSBTdHJpbmcga2V5d29yZCwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oZGVmYXVsdFZhbHVlID0gIjEiKSBpbnQgcGFnZSwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oZGVmYXVsdFZhbHVlID0gIjUiKSBpbnQgc2l6ZSkgeworCisgICAgICAgIC8vIDEuIOaKiuaQnOe0ouivjeaLhuWIhuaIkOWNleivje+8iOS4reiLseaWh+a3t+WQiOaLhuWIhu+8iQorICAgICAgICBMaXN0PFN0cmluZz4ga2V5d29yZHMgPSBzcGxpdEtleXdvcmRzKGtleXdvcmQpOyAvLyDkvovlpoIgIuS9oOWlvWhlbGxvIiDihpIgWyLkvaAiLCAi5aW9IiwgImhlbGxvIl0KKworICAgICAgICAvLyAyLiDmnoTlu7rliqjmgIHmn6Xor6LmnaHku7bvvIjmr4/kuKrlhbPplK7or43nlKggT1Ig6L+e5o6l77yJCisgICAgICAgIFF1ZXJ5V3JhcHBlcjxSZXF1ZXN0UG9zdD4gcXVlcnlXcmFwcGVyID0gbmV3IFF1ZXJ5V3JhcHBlcjw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBrZXl3b3JkcykgeworICAgICAgICAgICAgcXVlcnlXcmFwcGVyLmFuZCh3cmFwcGVyIC0+CisgICAgICAgICAgICAgICAgICAgIC8vIOS9v+eUqExPV0VS5Ye95pWw5L2/5pCc57Si5LiN5Yy65YiG5aSn5bCP5YaZCisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwbHkoIkxPV0VSKHRpdGxlKSBMSUtFIExPV0VSKHswfSkiLCAiJSIgKyB3b3JkICsgIiUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5KCJMT1dFUihjb250ZW50KSBMSUtFIExPV0VSKHswfSkiLCAiJSIgKyB3b3JkICsgIiUiKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBxdWVyeVdyYXBwZXIub3JkZXJCeURlc2MoImNyZWF0ZV90aW1lIik7CisKKyAgICAgICAgLy8gMy4g5omn6KGM5YiG6aG15p+l6K+iCisgICAgICAgIElQYWdlPFJlcXVlc3RQb3N0PiBpcGFnZSA9IHBvc3RTZXJ2aWNlLnBhZ2UobmV3IFBhZ2U8PihwYWdlLCBzaXplKSwgcXVlcnlXcmFwcGVyKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpCisgICAgICAgICAgICAgICAgLmRhdGEoInJlY29yZHMiLCBpcGFnZS5nZXRSZWNvcmRzKCkpCisgICAgICAgICAgICAgICAgLmRhdGEoInRvdGFsIiwgaXBhZ2UuZ2V0VG90YWwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5ouG5YiG5YWz6ZSu6K+N77yI5pSv5oyB5Lit6Iux5paH5re35ZCI77yJCisgICAgICog5L6L5aaC77yaIuS9oOWlvWhlbGxvIOS4lueVjCIg4oaSIFsi5L2gIiwgIuWlvSIsICJoZWxsbyIsICLkuJYiLCAi55WMIl0KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzcGxpdEtleXdvcmRzKFN0cmluZyBrZXl3b3JkKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBrZXl3b3JkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIC8vIOeUqOato+WImeWMuemFjeS4reaWh+Wtl+espuWSjOiLseaWh+WNleivjQorICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihbXFx1NGUwMC1cXHU5ZmE1XSl8KFthLXpBLVowLTldKykiKTsKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGtleXdvcmQpOworCisgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1hdGNoZWQgPSBtYXRjaGVyLmdyb3VwKCk7CisgICAgICAgICAgICBrZXl3b3Jkcy5hZGQobWF0Y2hlZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ga2V5d29yZHM7CisgICAgfQorCisgICAgQEdldE1hcHBpbmcoIi97SWR9IikKKyAgICBwdWJsaWMgUmVzdWx0IGdldFBvc3QoQFBhdGhWYXJpYWJsZSBpbnQgSWQpIHsKKyAgICAgICAgUmVxdWVzdFBvc3QgcG9zdCA9IHBvc3RTZXJ2aWNlLmdldEJ5SWQoSWQpOworICAgICAgICBpZiAocG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi5biW5a2Q5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworICAgICAgICAvLyDojrflj5bmiYDmnInor4TorrrvvIjmjInliJvlu7rml7bpl7TmjpLluo/vvIkKKyAgICAgICAgTGlzdDxSZXF1ZXN0Q29tbWVudD4gYWxsQ29tbWVudHMgPSBjb21tZW50U2VydmljZS5saXN0KAorICAgICAgICAgICAgICAgIG5ldyBRdWVyeVdyYXBwZXI8UmVxdWVzdENvbW1lbnQ+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lcSgicG9zdF9pZCIsIElkKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9yZGVyQnlBc2MoImNyZWF0ZV90aW1lIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyDojrflj5blrp7ml7bor4TorrrmgLvmlbDvvIjljIXmi6zmiYDmnInlsYLnuqfvvIkKKyAgICAgICAgaW50IHRvdGFsQ29tbWVudHMgPSBhbGxDb21tZW50cy5zaXplKCk7IC8vIOebtOaOpeS9v+eUqOWIl+ihqOWkp+WwjworICAgICAgICBwb3N0LnNldFJlcGx5Q291bnQodG90YWxDb21tZW50cyk7IC8vIOabtOaWsOiuoeaVsAorCisgICAgICAgIC8vIOaehOW7uuivhOiuuuagkeW9oue7k+aehAorICAgICAgICBMaXN0PFJlcXVlc3RDb21tZW50PiByb290Q29tbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTWFwPEludGVnZXIsIFJlcXVlc3RDb21tZW50PiBjb21tZW50TWFwID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIC8vIOesrOS4gOmBje+8muWIneWni+WMluaJgOacieivhOiuuuWIsG1hcOS4rQorICAgICAgICBmb3IgKFJlcXVlc3RDb21tZW50IGNvbW1lbnQgOiBhbGxDb21tZW50cykgeworICAgICAgICAgICAgY29tbWVudC5zZXRSZXBsaWVzKG5ldyBBcnJheUxpc3Q8PigpKTsgLy8g5Yid5aeL5YyWcmVwbGllc+WIl+ihqAorICAgICAgICAgICAgY29tbWVudE1hcC5wdXQoY29tbWVudC5nZXRJZCgpLCBjb21tZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOesrOS6jOmBje+8muaehOW7uueItuWtkOWFs+ezuworICAgICAgICBmb3IgKFJlcXVlc3RDb21tZW50IGNvbW1lbnQgOiBhbGxDb21tZW50cykgeworICAgICAgICAgICAgaWYgKGNvbW1lbnQuZ2V0UGFyZW50SWQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcm9vdENvbW1lbnRzLmFkZChjb21tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUmVxdWVzdENvbW1lbnQgcGFyZW50ID0gY29tbWVudE1hcC5nZXQoY29tbWVudC5nZXRQYXJlbnRJZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldFJlcGxpZXMoKS5hZGQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpCisgICAgICAgICAgICAgICAgLmRhdGEoInBvc3QiLCBwb3N0KQorICAgICAgICAgICAgICAgIC5kYXRhKCJjb21tZW50cyIsIHJvb3RDb21tZW50cyk7CisgICAgfQorCisgICAgLy8g54K56LWe5biW5a2QCisgICAgQFBvc3RNYXBwaW5nKCIve0lkfS9saWtlIikKKyAgICBwdWJsaWMgUmVzdWx0IGxpa2VQb3N0KAorICAgICAgICAgICAgQFBhdGhWYXJpYWJsZSgiSWQiKSBpbnQgSWQsCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKCJsaWtlcklkIikgU3RyaW5nIGxpa2VySWQKKyAgICApIHsKKyAgICAgICAgLy8g6LCD55SoIFNlcnZpY2VJbXBsLmxpa2VQb3N0KC4uLinvvIzoh6rliqjmm7TmlrAgbGlrZV9jb3VudCDlubbmj5LlhaXpgJrnn6UKKyAgICAgICAgcG9zdFNlcnZpY2UubGlrZVBvc3QoSWQsIGxpa2VySWQpOworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkubWVzc2FnZSgi54K56LWe5oiQ5YqfIik7CisgICAgfQorCisgICAgLy8g6K+E6K665biW5a2QCisgICAgQFBvc3RNYXBwaW5nKHZhbHVlID0gIi97SWR9L2NvbW1lbnRzIiwgY29uc3VtZXMgPSBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9WQUxVRSkKKyAgICBwdWJsaWMgUmVzdWx0IGNvbW1lbnRPblBvc3QoCisgICAgICAgICAgICBAUGF0aFZhcmlhYmxlKCJJZCIpIGludCBJZCwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oImF1dGhvcklkIikgU3RyaW5nIGF1dGhvcklkLAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSgiY29udGVudCIpIFN0cmluZyBjb250ZW50LAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSh2YWx1ZSA9ICJpbWFnZSIsIHJlcXVpcmVkID0gZmFsc2UpIE11bHRpcGFydEZpbGUgaW1hZ2UKKyAgICApIHsKKyAgICAgICAgLy8gMS4g5p6E6YCgIEhlbHBDb21tZW50IOWvueixoQorICAgICAgICBSZXF1ZXN0Q29tbWVudCBjb21tZW50ID0gbmV3IFJlcXVlc3RDb21tZW50KCk7CisgICAgICAgIGNvbW1lbnQuc2V0UG9zdElkKElkKTsKKyAgICAgICAgY29tbWVudC5zZXRBdXRob3JJZChhdXRob3JJZCk7CisgICAgICAgIGNvbW1lbnQuc2V0Q29udGVudChjb250ZW50KTsKKyAgICAgICAgY29tbWVudC5zZXRDcmVhdGVUaW1lKExvY2FsRGF0ZVRpbWUubm93KCkpOworICAgICAgICBjb21tZW50LnNldExpa2VDb3VudCgwKTsKKyAgICAgICAgY29tbWVudC5zZXRQYXJlbnRJZCgwKTsgICAgICAgLy8g6L+Z6YeM5piv5a+55biW5a2Q55qE5LiA57qn6K+E6K66CisgICAgICAgIGNvbW1lbnQuc2V0SW1hZ2VVcmwobnVsbCk7ICAgIC8vIOm7mOiupOaXoOWbvueJhworCisgICAgICAgIC8vIDIuIOWkhOeQhuWPr+mAieeahOWbvueJh+S4iuS8oOmAu+i+kQorICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlRXh0ID0gaW1hZ2UuZ2V0T3JpZ2luYWxGaWxlbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGltYWdlLmdldE9yaWdpbmFsRmlsZW5hbWUoKS5sYXN0SW5kZXhPZignLicpICsgMSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSArICIuIiArIGZpbGVFeHQ7CisKKyAgICAgICAgICAgICAgICAvLyDkuIrkvKDliLDpobnnm67moLnnm67lvZXnmoQgdXBsb2FkcyDmlofku7blpLkKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXBsb2FkRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpCisgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInVwbG9hZHMiOworICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUodXBsb2FkRGlyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgZGlyLm1rZGlycygpOworCisgICAgICAgICAgICAgICAgRmlsZSBkZXN0ID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaW1hZ2UudHJhbnNmZXJUbyhkZXN0KTsKKworICAgICAgICAgICAgICAgIGNvbW1lbnQuc2V0SW1hZ2VVcmwoIi91cGxvYWRzLyIgKyBmaWxlTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig1MDApLm1lc3NhZ2UoIuWbvueJh+S4iuS8oOWksei0pe+8miIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAzLiDpgJrov4cgU2VydmljZUltcGwg5a6M5oiQ4oCc5L+d5a2Y6K+E6K66ICsg5pu05pawIHJlcGx5X2NvdW50ICsg5Y+R6YCa55+l57uZ5biW5a2Q5L2c6ICF4oCdCisgICAgICAgIGNvbW1lbnRTZXJ2aWNlLmNvbW1lbnRPblJlcXVlc3RQb3N0KGNvbW1lbnQpOworCisgICAgICAgIC8vIDQuIOaehOmAoOi/lOWbnuWAvO+8muaKiuWImuWImuS/neWtmOeahOivhOiuuu+8iOS7juaVsOaNruW6k+S4reafpeWHuuadpeeahOWujOaVtOWvueixoe+8ieWSjOW4luWtkOacgOaWsOeahCByZXBseUNvdW50IOmDvei/lOWbngorICAgICAgICAvLyAgICDms6jmhI/vvJpjb21tZW50Lmluc2VydCguLi4pIOWQju+8jGNvbW1lbnQuZ2V0SWQoKSDlsIbmnIkgREIg6Ieq5Yqo55Sf5oiQ55qE5Li76ZSuCisgICAgICAgIFJlcXVlc3RDb21tZW50IG5ld0NvbW1lbnQgPSBjb21tZW50U2VydmljZS5nZXRCeUlkKGNvbW1lbnQuZ2V0SWQoKSk7CisgICAgICAgIGludCB1cGRhdGVkUmVwbHlDb3VudCA9IHBvc3RTZXJ2aWNlLmdldEJ5SWQoSWQpLmdldFJlcGx5Q291bnQoKTsKKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgiY29tbWVudCIsIG5ld0NvbW1lbnQpCisgICAgICAgICAgICAgICAgLmRhdGEoIm5ld1JlcGx5Q291bnQiLCB1cGRhdGVkUmVwbHlDb3VudCk7CisgICAgfQorCisgICAgLy8g5Yig6Zmk5biW5a2QCisgICAgQERlbGV0ZU1hcHBpbmcoIi97cG9zdElkfSIpCisgICAgcHVibGljIFJlc3VsdCBkZWxldGVQb3N0KEBQYXRoVmFyaWFibGUgaW50IHBvc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSBTdHJpbmcgYXV0aG9ySWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIDEuIOmqjOivgeW9k+WJjeeUqOaIt+aYr+WQpuacieadg+mZkOWIoOmZpO+8iOavlOWvuWF1dGhvcklk77yJCisgICAgICAgICAgICBSZXF1ZXN0UG9zdCBwb3N0ID0gcG9zdFNlcnZpY2UuZ2V0QnlJZChwb3N0SWQpOworICAgICAgICAgICAgaWYgKHBvc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5zZXRNZXNzYWdlKCLluJblrZDkuI3lrZjlnKgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcG9zdC5nZXRBdXRob3JJZCgpLmVxdWFscyhhdXRob3JJZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwMykuc2V0TWVzc2FnZSgi5peg5p2D5Yig6Zmk5q2k5biW5a2QIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDIuIOWIoOmZpOW4luWtkOWPiuWFs+iBlOivhOiuugorICAgICAgICAgICAgY29tbWVudFNlcnZpY2UucmVtb3ZlKG5ldyBRdWVyeVdyYXBwZXI8UmVxdWVzdENvbW1lbnQ+KCkuZXEoInBvc3RfaWQiLCBwb3N0SWQpKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IHBvc3RTZXJ2aWNlLnJlbW92ZUJ5SWQocG9zdElkKTsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVkID8gUmVzdWx0Lm9rKCkgOiBSZXN1bHQuZXJyb3IoNDA0KS5zZXRNZXNzYWdlKCLliKDpmaTor4TorrrlpLHotKUiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNTAwKS5zZXRNZXNzYWdlKCLmnI3liqHlmajplJnor686ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlci5qYXZhCmluZGV4IGU2OWM3MGUuLmZhMGY5MmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1RvcnJlbnRDb250cm9sbGVyLmphdmEKQEAgLTIzLDYgKzIzLDggQEAKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uKjsKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnBsdWdpbnMucGFnaW5hdGlvbi5QYWdlOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTY3LDYgKzY5LDcgQEAKIAogICAgIHByaXZhdGUgVHJhY2tlclNlcnZpY2UgdHJhY2tlcnNlcnZpY2UgPSBuZXcgVHJhY2tlclNlcnZpY2UobmV3IE9iamVjdE1hcHBlcigpKTsKICAgICBwcml2YXRlIENsaWVudFNlcnZpY2UgY2xpZW50c2VydmljZSA9IG5ldyBDbGllbnRTZXJ2aWNlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvcnJlbnRDb250cm9sbGVyLmNsYXNzKTsKIAogICAgIEBHZXRNYXBwaW5nCiAgICAgcHVibGljIFJlc3VsdCBsaXN0UG9zdHMoCkBAIC0zMTYsNiArMzE5LDcgQEAKICAgICAgICAgICAgIHRvcnJlbnQuc2V0RmlsZVBhdGgodXBsb2FkZWRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIHRvcnJlbnQuc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm5vdygpKTsKICAgICAgICAgICAgIHRvcnJlbnRNYXBwZXIuaW5zZXJ0VG9ycmVudCh0b3JyZW50KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVkIElEOiAiICsgdG9ycmVudC5nZXRJZCgpKTsKIAogICAgICAgICAgICAgVHJhY2tlZFBlZXIgdHAgPSBjcmVhdGVUcmFja2VkUGVlcihyZXF1ZXN0LCB0dCwgdG9ycmVudC5nZXRJZCgpKTsKICAgICAgICAgICAgIHRwLnVwZGF0ZShUcmFja2VkUGVlci5QZWVyU3RhdGUuQ09NUExFVEVELCBmaWxlU2l6ZSwgMCwgMCk7CkBAIC0zNjcsMjcgKzM3MSw0MSBAQAogICAgIC8vIOiDveaIkOWKn+iOt+WPluWIsOaVsOaNrgogICAgIC8vIOiDveWkn+agueaNruatpOWAvO+8jOWujOaIkOWvueebuOWFs+aVsOaNrueahOS/ruaUuQogICAgIEBHZXRNYXBwaW5nKCIvZG93bmxvYWRUb3JyZW50IikKLSAgICBwdWJsaWMgUmVzdWx0IGdldFRvcnJlbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIGludCBpZCwgU3RyaW5nIGRvd25sb2FkUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIFJlc3VsdCBnZXRUb3JyZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUmVxdWVzdFBhcmFtIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSBTdHJpbmcgZG93bmxvYWRQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gMS4g6I635Y+W56eN5a2Q5ZKM55So5oi35L+h5oGvCiAgICAgICAgIFRPUlJFTlQgdG9ycmVudCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0QnlJRChpZCk7CisgICAgICAgIGlmICh0b3JyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigi5bCd6K+V5LiL6L295LiN5a2Y5Zyo55qE56eN5a2Q77yMSUQ6IHt9IiwgaWQpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLm1lc3NhZ2UoIuenjeWtkOS4jeWtmOWcqCIpOworICAgICAgICB9CiAgICAgICAgIFVTRVIgdXNlckRvd25sb2FkID0gdXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgVVNFUiB1c2VyVXBsb2FkID0gdXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKHRvcnJlbnQuZ2V0VXNlcm5hbWUoKSk7CiAKLSAgICAgICAgLy/mo4Dmn6XliIbkuqvnjofmmK/lkKblhYHorrjkuIvovb0KKyAgICAgICAgLy8gMi4g6K6w5b2V5LiL6L295pel5b+XCisgICAgICAgIGxvZ2dlci5pbmZvKCLnlKjmiLcge30g5bCd6K+V5LiL6L2956eN5a2QIHt9ICjkuIrkvKDogIU6IHt9KSIsCisgICAgICAgICAgICAgICAgdXNlckRvd25sb2FkLmdldFVzZXJuYW1lKCksIGlkLCB1c2VyVXBsb2FkLmdldFVzZXJuYW1lKCkpOwogCi0gICAgICAgIGlmKCF1c2VyRG93bmxvYWQuYWxsb3dEb3dubG9hZCh0b3JyZW50LmdldFNpemUoKSkpeworICAgICAgICAvLyAzLiDmo4Dmn6XliIbkuqvnjofvvIjlpoLmnpzmmK/oh6rlt7HnmoTnp43lrZDliJnot7Pov4fmo4Dmn6XvvIkKKyAgICAgICAgaWYgKCF1c2VyRG93bmxvYWQuZ2V0VXNlcm5hbWUoKS5lcXVhbHModXNlclVwbG9hZC5nZXRVc2VybmFtZSgpKSAmJgorICAgICAgICAgICAgICAgICF1c2VyRG93bmxvYWQuYWxsb3dEb3dubG9hZCh0b3JyZW50LmdldFNpemUoKSkpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCLnlKjmiLcge30g5YiG5Lqr546H5LiN6Laz77yM5peg5rOV5LiL6L2956eN5a2QIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgdXNlckRvd25sb2FkLmdldFVzZXJuYW1lKCksIGlkKTsKICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA5KS5tZXNzYWdlKCLliIbkuqvnjofkuI3otrPkuIvovb3mraTotYTmupAiKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIOS4i+i9veWujOaIkAotICAgICAgICAvLyDkvKDlhaXlj5jph4/vvJrkuIvovb3np43lrZDnmoRpZCDkuIvovb3liLDmlofku7bnmoTot6/lvoQKLSAgICAgICAgY2xpZW50c2VydmljZS5kb3dubG9hZFRvcnJlbnQodG9ycmVudC5nZXRGaWxlUGF0aCgpLCBkb3dubG9hZFBhdGgsIHVzZXJEb3dubG9hZC5nZXRVc2VybmFtZSgpKTsKKyAgICAgICAgLy8gNC4g5omn6KGM5LiL6L29CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyA0LjEg6LCD55So5a6i5oi356uv5pyN5Yqh5LiL6L29CiAKLSAgICAgICAgVHJhY2tlZFRvcnJlbnQgdHQgPSB0cmFja2Vyc2VydmljZS5nZXRUcmFja2VkVG9ycmVudCh0b3JyZW50LmdldEhhc2goKSk7Ci0gICAgICAgIFRyYWNrZWRQZWVyIHRwID0gY3JlYXRlVHJhY2tlZFBlZXIocmVxdWVzdCwgdHQsIHRvcnJlbnQuZ2V0SWQoKSk7Ci0gICAgICAgIHRwLnVwZGF0ZShUcmFja2VkUGVlci5QZWVyU3RhdGUuQ09NUExFVEVELCAwLCAwLCB0b3JyZW50LmdldFNpemUoKSk7Ci0gICAgICAgIHR0LmFkZFBlZXIodHApOwotCi0gICAgICAgIHRyYWNrZXJzZXJ2aWNlLnNlclRyYWNrZXIoKTsKKyAgICAgICAgICAgIGNsaWVudHNlcnZpY2UuZG93bmxvYWRUb3JyZW50KHRvcnJlbnQuZ2V0RmlsZVBhdGgoKSwgZG93bmxvYWRQYXRoLCB1c2VyRG93bmxvYWQuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgICAgICAvLyA0LjIg5pu05pawVHJhY2tlcuS/oeaBrworICAgICAgICAgICAgVHJhY2tlZFRvcnJlbnQgdHQgPSB0cmFja2Vyc2VydmljZS5nZXRUcmFja2VkVG9ycmVudCh0b3JyZW50LmdldEhhc2goKSk7CisgICAgICAgICAgICBUcmFja2VkUGVlciB0cCA9IGNyZWF0ZVRyYWNrZWRQZWVyKHJlcXVlc3QsIHR0LCB0b3JyZW50LmdldElkKCkpOworICAgICAgICAgICAgdHAudXBkYXRlKFRyYWNrZWRQZWVyLlBlZXJTdGF0ZS5DT01QTEVURUQsIDAsIDAsIHRvcnJlbnQuZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIHR0LmFkZFBlZXIodHApOworICAgICAgICAgICAgdHJhY2tlcnNlcnZpY2Uuc2VyVHJhY2tlcigpOwogCiAgICAgICAgIC8vIOmAmuefpeS4i+i9veWujOaIkAogICAgICAgICBOb3RpZmljYXRpb24gZG93bmxvYWRDb21wbGV0ZU5vdGljZSA9IG5ldyBOb3RpZmljYXRpb24oKTsKQEAgLTQwMywxNiArNDIxLDI0IEBACiAgICAgICAgIGRvd25sb2FkQ29tcGxldGVOb3RpY2Uuc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm5vdygpKTsKICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zYXZlTm90aWZpY2F0aW9uKGRvd25sb2FkQ29tcGxldGVOb3RpY2UpOwogCi0gICAgICAgIC8v5pu05paw5LiK5Lyg6YeP5ZKM5LiL6L296YePCi0gICAgICAgIHVzZXJEb3dubG9hZC51cGRhdGVEb3dubG9hZChTaXplQ2FsY3VsYXRpb24uZ2V0RG93bmxvYWQodG9ycmVudC5nZXRTaXplKCksIGRpc2NvdW50TWFwcGVyLCB0b3JyZW50LmdldENyZWF0ZVRpbWUoKSkpOwotICAgICAgICB1c2VyVXBsb2FkLnVwZGF0ZVVwbG9hZChTaXplQ2FsY3VsYXRpb24uZ2V0VXBsb2FkKHRvcnJlbnQuZ2V0U2l6ZSgpLCBkaXNjb3VudE1hcHBlciwgdG9ycmVudC5nZXRDcmVhdGVUaW1lKCkpKTsKLSAgICAgICAgdXNlck1hcHBlci51cGRhdGVVc2VyKHVzZXJVcGxvYWQpOwotICAgICAgICB1c2VyTWFwcGVyLnVwZGF0ZVVzZXIodXNlckRvd25sb2FkKTsKLSAgICAgICAgRE9XTkxPQURfVE9SUkVOVCBkdCA9IG5ldyBET1dOTE9BRF9UT1JSRU5UKHVzZXJEb3dubG9hZC5nZXRVc2VybmFtZSgpLCB0b3JyZW50LmdldElkKCksIHRvcnJlbnQuZ2V0U2l6ZSgpKTsKLSAgICAgICAgZG93bmxvYWRUb3JyZW50TWFwcGVyLmluc2VydERvd25sb2FkVG9ycmVudChkdCk7CisgICAgICAgICAgICAvLyA0LjMg5pu05paw55So5oi35pWw5o2u77yI5Y+q5pyJ5LiL6L295LuW5Lq656eN5a2Q5pe25omN5pu05paw77yJCisgICAgICAgICAgICBpZiAoIXVzZXJEb3dubG9hZC5nZXRVc2VybmFtZSgpLmVxdWFscyh1c2VyVXBsb2FkLmdldFVzZXJuYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdXNlckRvd25sb2FkLnVwZGF0ZURvd25sb2FkKFNpemVDYWxjdWxhdGlvbi5nZXREb3dubG9hZCh0b3JyZW50LmdldFNpemUoKSwgZGlzY291bnRNYXBwZXIsIHRvcnJlbnQuZ2V0Q3JlYXRlVGltZSgpKSk7CisgICAgICAgICAgICAgICAgdXNlclVwbG9hZC51cGRhdGVVcGxvYWQoU2l6ZUNhbGN1bGF0aW9uLmdldFVwbG9hZCh0b3JyZW50LmdldFNpemUoKSwgZGlzY291bnRNYXBwZXIsIHRvcnJlbnQuZ2V0Q3JlYXRlVGltZSgpKSk7CisgICAgICAgICAgICAgICAgdXNlck1hcHBlci51cGRhdGVVc2VyKHVzZXJVcGxvYWQpOworICAgICAgICAgICAgICAgIHVzZXJNYXBwZXIudXBkYXRlVXNlcih1c2VyRG93bmxvYWQpOwogCi0gICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJmaWxlTmFtZSIsIHRvcnJlbnQuZ2V0VG9ycmVudE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuZGF0YSgidGFza0lkIiwgdG9ycmVudC5nZXRIYXNoKCkpOworICAgICAgICAgICAgICAgIERPV05MT0FEX1RPUlJFTlQgZHQgPSBuZXcgRE9XTkxPQURfVE9SUkVOVCh1c2VyRG93bmxvYWQuZ2V0VXNlcm5hbWUoKSwgdG9ycmVudC5nZXRJZCgpLCB0b3JyZW50LmdldFNpemUoKSk7CisgICAgICAgICAgICAgICAgZG93bmxvYWRUb3JyZW50TWFwcGVyLmluc2VydERvd25sb2FkVG9ycmVudChkdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCLnlKjmiLcge30g5oiQ5Yqf5LiL6L2956eN5a2QIHt9IiwgdXNlckRvd25sb2FkLmdldFVzZXJuYW1lKCksIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJmaWxlTmFtZSIsIHRvcnJlbnQuZ2V0VG9ycmVudE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmRhdGEoInRhc2tJZCIsIHRvcnJlbnQuZ2V0SGFzaCgpKTsKKyAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCLkuIvovb3np43lrZDlpLHotKUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNTAwKS5tZXNzYWdlKCLkuIvovb3lpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAR2V0TWFwcGluZygiL2dldFByb2dyZXNzIikKQEAgLTQyNCwxNCArNDUwLDE1IEBACiAKICAgICAgICAgZm9yIChTdHJpbmdbXSB0YXNrIDogdGFza3MpIHsKICAgICAgICAgICAgIGlmICh0YXNrWzBdLmVxdWFscyh1c2VybmFtZSkpIHsKLSAgICAgICAgICAgICAgICBEb3VibGUgcHJvZ3Jlc3MgPSAwLjA7ICAvLyDpu5jorqTov5vluqbkuLowLjAKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IGNsaWVudHNlcnZpY2UuZ2V0RG93bmxvYWRQcm9ncmVzcyh0YXNrWzFdKTsgIC8vIOiOt+WPluS4i+i9vei/m+W6pgotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOWPkeeUn+W8guW4uO+8jOWImei/m+W6puS/neaMgeS4ujAuMO+8jOW5tue7p+e7reWkhOeQhuS4i+S4gOS4quS7u+WKoQotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IDAuMDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHByb2dyZXNzID0gY2xpZW50c2VydmljZS5nZXREb3dubG9hZFByb2dyZXNzKHRhc2tbMV0pOworICAgICAgICAgICAgICAgICAgICAvLyDnoa7kv53ov5vluqblnKgwLTHkuYvpl7QKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwcm9ncmVzcykpOworICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc2VzLnB1dCh0YXNrWzFdLCBwcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5Ye6546w5byC5bi477yM5YGH6K6+5LiL6L295bey5a6M5oiQCisgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzZXMucHV0KHRhc2tbMV0sIDEuMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb2dyZXNzZXMucHV0KHRhc2tbMV0sIHByb2dyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgicHJvZ3Jlc3NlcyIsIHByb2dyZXNzZXMpOwpAQCAtNDQwLDI0ICs0NjcsMzggQEAKICAgICAvL+agueaNrmlk5Yig6ZmkCiAgICAgQERlbGV0ZU1hcHBpbmcoIi9kZWxldGVUb3JyZW50L3tpZH0iKQogICAgIHB1YmxpYyBSZXN1bHQgZGVsZXRlVG9ycmVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQFBhdGhWYXJpYWJsZSgiaWQiKSBpbnQgaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyAxLiDpqozor4HnlKjmiLfmnYPpmZAKKyAgICAgICAgVVNFUiBjdXJyZW50VXNlciA9IHVzZXJDb250cm9sbGVyLmdldFVzZXJJblJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgIFRPUlJFTlQgdG9ycmVudCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0QnlJRChpZCk7CiAKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gdG9ycmVudC5nZXRGaWxlUGF0aCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25piv5ZCm5a2Y5ZyoCi0gICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKFBhdGhzLmdldChmaWxlUGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZXMuZGVsZXRlKFBhdGhzLmdldChmaWxlUGF0aCkpOyAgLy8g5Yig6Zmk5paH5Lu2Ci0gICAgICAgICAgICAgICAgdG9ycmVudE1hcHBlci5kZWxldGVUb3JyZW50KGlkKTsKKyAgICAgICAgaWYgKHRvcnJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLnNldE1lc3NhZ2UoIuenjeWtkOS4jeWtmOWcqCIpOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkubWVzc2FnZSgi56eN5a2Q5paH5Lu25Yig6Zmk5oiQ5YqfIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmlsZSBub3QgZm91bmQ6ICIgKyBmaWxlUGF0aCk7CisgICAgICAgIC8vIDMuIOWIoOmZpOWFs+iBlOiusOW9le+8iOWIhuatpemqpO+8iQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gMy4xIOWFiOWIoOmZpOS4i+i9veiusOW9lQorICAgICAgICAgICAgZG93bmxvYWRUb3JyZW50TWFwcGVyLmRlbGV0ZUJ5VG9ycmVudElkKGlkKTsKKworICAgICAgICAgICAgLy8gMy4yIOWIoOmZpOenjeWtkOaWh+S7tgorICAgICAgICAgICAgaWYgKEZpbGVzLmV4aXN0cyhQYXRocy5nZXQodG9ycmVudC5nZXRGaWxlUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICBGaWxlcy5kZWxldGUoUGF0aHMuZ2V0KHRvcnJlbnQuZ2V0RmlsZVBhdGgoKSkpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAzLjMg5pyA5ZCO5Yig6Zmk56eN5a2Q6K6w5b2VCisgICAgICAgICAgICBpbnQgZGVsZXRlQ291bnQgPSB0b3JyZW50TWFwcGVyLmRlbGV0ZVRvcnJlbnQoaWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi56eN5a2Q5Yig6Zmk5aSx6LSl77yM5Y+v6IO95bey6KKr5Yig6ZmkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5tZXNzYWdlKCLnp43lrZDliKDpmaTmiJDlip8iKTsKKwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyDlvILluLjlpITnkIYKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAvLyDov5Tlm57lpLHotKXnu5PmnpzmiJblhbbku5blpITnkIbpgLvovpEKLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5zZXRNZXNzYWdlKCLnp43lrZDmlofku7bliKDpmaTlpLHotKUiKTsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigi5paH5Lu25Yig6Zmk5aSx6LSlIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDUwMCkuc2V0TWVzc2FnZSgi5paH5Lu25Yig6Zmk5aSx6LSlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCLnp43lrZDliKDpmaTlpLHotKUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNTAwKS5zZXRNZXNzYWdlKCLnp43lrZDliKDpmaTlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9BTk5PVU5DRU1FTlQuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9BTk5PVU5DRU1FTlQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIyMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L0FOTk9VTkNFTUVOVC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eTsKKworaW1wb3J0IGxvbWJvay5EYXRhOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCitARGF0YQorcHVibGljIGNsYXNzIEFOTk9VTkNFTUVOVCB7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnQ7CisgICAgcHJpdmF0ZSBMb2NhbERhdGVUaW1lIGNyZWF0ZVRpbWU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1JlcXVlc3RDb21tZW50LmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvUmVxdWVzdENvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDMyNjNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1JlcXVlc3RDb21tZW50LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5OworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uSWRUeXBlOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLlRhYmxlRmllbGQ7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uVGFibGVJZDsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZU5hbWU7CitpbXBvcnQgbG9tYm9rLkRhdGE7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQERhdGEKK0BUYWJsZU5hbWUoInJlcXVlc3RfY29tbWVudHMiKQorcHVibGljIGNsYXNzIFJlcXVlc3RDb21tZW50IHsKKyAgICBAVGFibGVJZCh2YWx1ZSA9ICJpZCIsIHR5cGUgPSBJZFR5cGUuQVVUTykKKyAgICBwcml2YXRlIEludGVnZXIgaWQ7ICAgICAgICAvLyDkvb/nlKjljIXoo4Xnsbvlnovku6XmlK/mjIEgbnVsbAorICAgIHByaXZhdGUgSW50ZWdlciBwb3N0SWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9ySWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudDsKKyAgICBwcml2YXRlIEludGVnZXIgbGlrZUNvdW50OworICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworICAgIHByaXZhdGUgSW50ZWdlciBwYXJlbnRJZDsgIC8vIOaWsOWinuWtl+aute+8jOeUqOS6juWbnuWkjeWKn+iDve+8jDDooajnpLrkuLvor4TorrrvvIzpnZ4w6KGo56S65Zue5aSN5p+Q5p2h6K+E6K66CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbHlUbzsKKyAgICBwcml2YXRlIFN0cmluZyBJbWFnZVVybDsKKworICAgIEBUYWJsZUZpZWxkKGV4aXN0ID0gZmFsc2UpCisgICAgcHJpdmF0ZSBMaXN0PFJlcXVlc3RDb21tZW50PiByZXBsaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7IC8vIOW/hemhu+WIneWni+WMlgorCisgICAgLy8g56Gu5L+d5pyJZ2V0dGVy5ZKMc2V0dGVyCisgICAgcHVibGljIExpc3Q8UmVxdWVzdENvbW1lbnQ+IGdldFJlcGxpZXMoKSB7CisgICAgICAgIHJldHVybiByZXBsaWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxpZXMoTGlzdDxSZXF1ZXN0Q29tbWVudD4gcmVwbGllcykgeworICAgICAgICB0aGlzLnJlcGxpZXMgPSByZXBsaWVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9SZXF1ZXN0UG9zdC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1JlcXVlc3RQb3N0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZmI0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9SZXF1ZXN0UG9zdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eTsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLklkVHlwZTsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUlkOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLlRhYmxlTmFtZTsKK2ltcG9ydCBsb21ib2suRGF0YTsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKKworQERhdGEKK0BUYWJsZU5hbWUodmFsdWUgPSAicmVxdWVzdF9wb3N0cyIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFBvc3QgeworICAgIEBUYWJsZUlkKHZhbHVlID0gImlkIiwgdHlwZSA9IElkVHlwZS5BVVRPKQorICAgIHByaXZhdGUgSW50ZWdlciBpZDsgICAgICAgIC8vIOS9v+eUqOWMheijheexu+Wei+S7peaUr+aMgSBudWxsCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9ySWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudDsKKyAgICBwcml2YXRlIFN0cmluZyBpbWFnZVVybDsKKyAgICBwcml2YXRlIEludGVnZXIgbGlrZUNvdW50OworICAgIHByaXZhdGUgSW50ZWdlciByZXBseUNvdW50OworICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9UT1JSRU5ULmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvVE9SUkVOVC5qYXZhCmluZGV4IGNlMDZlMjIuLmI4MDk4NmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9UT1JSRU5ULmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1RPUlJFTlQuamF2YQpAQCAtMTEsNiArMTEsOCBAQAogaW1wb3J0IGpha2FydGEucGVyc2lzdGVuY2UuR2VuZXJhdGlvblR5cGU7DQogaW1wb3J0IGpha2FydGEucGVyc2lzdGVuY2UuSWQ7DQogaW1wb3J0IGxvbWJvay5EYXRhOw0KK2ltcG9ydCBsb21ib2suU2V0dGVyOw0KKw0KIGltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsNCiBpbXBvcnQgamF2YS51dGlsLkRhdGU7DQogDQpAQCAtMTgsNiArMjAsNyBAQAogQFRhYmxlTmFtZSgidG9ycmVudCIpIC8vIOS9v+eUqE15QmF0aXMtUGx1c+eahOazqOino+aMh+WumuihqOWQjQ0KIHB1YmxpYyBjbGFzcyBUT1JSRU5UIHsNCiANCisgICAgQFNldHRlcg0KICAgICBwcml2YXRlIEludGVnZXIgaWQ7DQogDQogICAgIHByaXZhdGUgU3RyaW5nIHRvcnJlbnROYW1lOyAvLyDmlofku7blkI0NCkBAIC02OSw3ICs3Miw3IEBACiAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsNCiAgICAgICAgIHJldHVybiB0aGlzLnNpemU7DQogICAgIH0NCi0gICAgcHVibGljIGludCBnZXRJZCgpew0KKyAgICBwdWJsaWMgSW50ZWdlciBnZXRJZCgpew0KICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7DQogICAgIH0NCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1VTRVIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9VU0VSLmphdmEKaW5kZXggMzc5ODY5Ni4uM2M5M2M3NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1VTRVIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvVVNFUi5qYXZhCkBAIC0xODMsNyArMTgzLDE4IEBACiAgICAgICAgIGlmICh0aGlzLnVwbG9hZCAvIChmaWxlU2l6ZSArIHRoaXMuZG93bmxvYWQpIDwgMC41KSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8g6YG/5YWN6Zmk5Lul6Zu2CisgICAgICAgIGlmIChkb3dubG9hZCA9PSAwKSByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyDorqHnrpflvZPliY3liIbkuqvnjocKKyAgICAgICAgZG91YmxlIGN1cnJlbnRSYXRpbyA9IChkb3VibGUpdXBsb2FkIC8gZG93bmxvYWQ7CisKKyAgICAgICAgLy8g6K6h566X5LiL6L295ZCO55qE5YiG5Lqr546HCisgICAgICAgIGRvdWJsZSBuZXdSYXRpbyA9IChkb3VibGUpdXBsb2FkIC8gKGRvd25sb2FkICsgZmlsZVNpemUpOworCisgICAgICAgIC8vIOiuvue9rumYiOWAvO+8jOS+i+WmgjAuNQorICAgICAgICByZXR1cm4gbmV3UmF0aW8gPj0gMC41OwogCiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvQW5ub3VuY2VtZW50TWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvQW5ub3VuY2VtZW50TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjM2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Bbm5vdW5jZW1lbnRNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXI7CisKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LkFOTk9VTkNFTUVOVDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy4qOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BNYXBwZXIKK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3VuY2VtZW50TWFwcGVyIHsKKyAgICAvLyDkvb/nlKjms6jop6PmlrnlvI/lrp7njrAKKyAgICAvLyDmj5LlhaXmlrDlhazlkYrvvIjov5Tlm57oh6rlop5JRO+8iQorICAgIEBJbnNlcnQoIklOU0VSVCBJTlRPIGFubm91bmNlbWVudCAodGl0bGUsIGNvbnRlbnQsIGNyZWF0ZV90aW1lKSAiICsKKyAgICAgICAgICAgICJWQUxVRVMgKCN7dGl0bGV9LCAje2NvbnRlbnR9LCAje2NyZWF0ZVRpbWV9KSIpCisgICAgQE9wdGlvbnModXNlR2VuZXJhdGVkS2V5cyA9IHRydWUsIGtleVByb3BlcnR5ID0gImlkIikgLy8g6I635Y+W6Ieq5aKeSUQKKyAgICBpbnQgaW5zZXJ0KEFOTk9VTkNFTUVOVCBhbm5vdW5jZW1lbnQpOworCisgICAgQFNlbGVjdCgiU0VMRUNUIGlkLCB0aXRsZSwgY29udGVudCwgY3JlYXRlX3RpbWUgRlJPTSBhbm5vdW5jZW1lbnQgV0hFUkUgaWQgPSAje2lkfSIpCisgICAgQFJlc3VsdHMoeworICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJpZCIsIGNvbHVtbiA9ICJpZCIpLAorICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJ0aXRsZSIsIGNvbHVtbiA9ICJ0aXRsZSIpLAorICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJjb250ZW50IiwgY29sdW1uID0gImNvbnRlbnQiKSwKKyAgICAgICAgICAgIEBSZXN1bHQocHJvcGVydHkgPSAiY3JlYXRlVGltZSIsIGNvbHVtbiA9ICJjcmVhdGVfdGltZSIpCisgICAgfSkKKyAgICBBTk5PVU5DRU1FTlQgc2VsZWN0QnlJZChJbnRlZ2VyIGlkKTsKKworICAgIEBTZWxlY3QoIlNFTEVDVCBpZCwgdGl0bGUsIGNvbnRlbnQsIGNyZWF0ZV90aW1lIEZST00gYW5ub3VuY2VtZW50IE9SREVSIEJZIGNyZWF0ZV90aW1lIERFU0MgTElNSVQgI3tsaW1pdH0iKQorICAgIEBSZXN1bHRzKHsKKyAgICAgICAgICAgIEBSZXN1bHQocHJvcGVydHkgPSAiaWQiLCBjb2x1bW4gPSAiaWQiKSwKKyAgICAgICAgICAgIEBSZXN1bHQocHJvcGVydHkgPSAidGl0bGUiLCBjb2x1bW4gPSAidGl0bGUiKSwKKyAgICAgICAgICAgIEBSZXN1bHQocHJvcGVydHkgPSAiY29udGVudCIsIGNvbHVtbiA9ICJjb250ZW50IiksCisgICAgICAgICAgICBAUmVzdWx0KHByb3BlcnR5ID0gImNyZWF0ZVRpbWUiLCBjb2x1bW4gPSAiY3JlYXRlX3RpbWUiKQorICAgIH0pCisgICAgTGlzdDxBTk5PVU5DRU1FTlQ+IHNlbGVjdExhdGVzdChpbnQgbGltaXQpOworCisgICAgQFNlbGVjdCgiU0VMRUNUIGlkLCB0aXRsZSwgY29udGVudCwgY3JlYXRlX3RpbWUgRlJPTSBhbm5vdW5jZW1lbnQgT1JERVIgQlkgY3JlYXRlX3RpbWUgREVTQyIpCisgICAgQFJlc3VsdHMoeworICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJpZCIsIGNvbHVtbiA9ICJpZCIpLAorICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJ0aXRsZSIsIGNvbHVtbiA9ICJ0aXRsZSIpLAorICAgICAgICAgICAgQFJlc3VsdChwcm9wZXJ0eSA9ICJjb250ZW50IiwgY29sdW1uID0gImNvbnRlbnQiKSwKKyAgICAgICAgICAgIEBSZXN1bHQocHJvcGVydHkgPSAiY3JlYXRlVGltZSIsIGNvbHVtbiA9ICJjcmVhdGVfdGltZSIpCisgICAgfSkKKyAgICBMaXN0PEFOTk9VTkNFTUVOVD4gc2VsZWN0QWxsKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL0Rvd25sb2FkVG9ycmVudE1hcHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL0Rvd25sb2FkVG9ycmVudE1hcHBlci5qYXZhCmluZGV4IDIyZmYyMDMuLmI0ODhiN2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Eb3dubG9hZFRvcnJlbnRNYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvRG93bmxvYWRUb3JyZW50TWFwcGVyLmphdmEKQEAgLTUsNiArNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuKjsKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5tYXBwZXIuQmFzZU1hcHBlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLio7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMzQsNCArMzUsOCBAQAogCiAgICAgQFNlbGVjdCgiU0VMRUNUIERJU1RJTkNUIHVzZXJuYW1lIEZST00gZG93bmxvYWRfdG9ycmVudCBXSEVSRSB0b3JyZW50aWQgPSAje3RvcnJlbnRJZH0iKQogICAgIExpc3Q8U3RyaW5nPiBmaW5kVXNlcnNCeVRvcnJlbnRJZChAUGFyYW0oInRvcnJlbnRJZCIpIEludGVnZXIgdG9ycmVudElkKTsKKyAgICAvLyDmt7vliqDliKDpmaTmlrnms5UKKyAgICBARGVsZXRlKCJERUxFVEUgRlJPTSBkb3dubG9hZF90b3JyZW50IFdIRVJFIHRvcnJlbnRpZCA9ICN7dG9ycmVudElkfSIpCisgICAgaW50IGRlbGV0ZUJ5VG9ycmVudElkKEBQYXJhbSgidG9ycmVudElkIikgaW50IHRvcnJlbnRJZCk7CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9SZXF1ZXN0Q29tbWVudE1hcHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL1JlcXVlc3RDb21tZW50TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1NjZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9SZXF1ZXN0Q29tbWVudE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyOworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUubWFwcGVyLkJhc2VNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0Q29tbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5NYXBwZXI7CisKK0BNYXBwZXIKK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdENvbW1lbnRNYXBwZXIgZXh0ZW5kcyBCYXNlTWFwcGVyPFJlcXVlc3RDb21tZW50PiB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9SZXF1ZXN0UG9zdE1hcHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL1JlcXVlc3RQb3N0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NjE3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9SZXF1ZXN0UG9zdE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyOworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUubWFwcGVyLkJhc2VNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0UG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5NYXBwZXI7CisKK0BNYXBwZXIKK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdFBvc3RNYXBwZXIgZXh0ZW5kcyBCYXNlTWFwcGVyPFJlcXVlc3RQb3N0PiB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvVG9ycmVudE1hcHBlci5qYXZhCmluZGV4IGRlYjQzZmMuLmJkYjVkNmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL1RvcnJlbnRNYXBwZXIuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogICAgIGludCBjb3VudEJ5VXNlcm5hbWUoQFBhcmFtKCJ1c2VybmFtZSIpIFN0cmluZyB1c2VybmFtZSk7CiAKICAgICAvLyDmj5LlhaVUb3JyZW50CisgICAgQE9wdGlvbnModXNlR2VuZXJhdGVkS2V5cyA9IHRydWUsIGtleVByb3BlcnR5ID0gImlkIikKICAgICBASW5zZXJ0KCJJTlNFUlQgSU5UTyB0b3JyZW50ICh0b3JyZW50X25hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yeSwgcmVnaW9uLCByZXNvbHV0aW9uLCBzdWJ0aXRsZSwgc2l6ZSwgaGFzaCwgdXNlcm5hbWUsIGNyZWF0ZV90aW1lLCBmaWxlX3BhdGgpICIgKwogICAgICAgICAgICAgIlZBTFVFUyAoI3t0b3JyZW50TmFtZX0sICN7ZGVzY3JpcHRpb259LCAje2NhdGVnb3J5fSwgI3tyZWdpb259LCAje3Jlc29sdXRpb259LCAje3N1YnRpdGxlfSwgI3tzaXplfSwgI3toYXNofSwgI3t1c2VybmFtZX0sICN7Y3JlYXRlVGltZX0sICN7ZmlsZVBhdGh9KSIpCiAgICAgaW50IGluc2VydFRvcnJlbnQoVE9SUkVOVCB0b3JyZW50KTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvQ2xpZW50U2VydmljZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9DbGllbnRTZXJ2aWNlLmphdmEKaW5kZXggZGFhNDU0NC4uODQ4YjEzMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9DbGllbnRTZXJ2aWNlLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9DbGllbnRTZXJ2aWNlLmphdmEKQEAgLTM2LDEyICszNiwxOSBAQAogCiAgICAgLy8g5L+u5pS55ZCO55qE6I635Y+W5LiL6L296L+b5bqm5pa55rOVCiAgICAgcHVibGljIGRvdWJsZSBnZXREb3dubG9hZFByb2dyZXNzKFN0cmluZyB0b3JyZW50RmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUb3JyZW50U3RhdGlzdGljIHN0YXRzID0gY2xpZW50LmdldFN0YXRpc3RpY3ModG9ycmVudEZpbGVQYXRoKTsKLSAgICAgICAgaWYgKHN0YXRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwLjA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUb3JyZW50U3RhdGlzdGljIHN0YXRzID0gY2xpZW50LmdldFN0YXRpc3RpY3ModG9ycmVudEZpbGVQYXRoKTsKKyAgICAgICAgICAgIGlmIChzdGF0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8g5aaC5p6c57uf6K6h5L+h5oGv5Li656m677yM5Y+v6IO95LiL6L295bey5a6M5oiQCisgICAgICAgICAgICAgICAgcmV0dXJuIDEuMDsgLy8g6L+U5ZueMTAwJeihqOekuuW3suWujOaIkAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIHByb2dyZXNzID0gc3RhdHMuZ2V0UGVyY2VudGFnZURvd25sb2FkZWQoKTsKKyAgICAgICAgICAgIC8vIOehruS/nei/m+W6puWcqDAtMeS5i+mXtAorICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHByb2dyZXNzKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyDlpoLmnpzlh7rnjrDlvILluLjvvIzlj6/og73kuIvovb3lt7LlrozmiJAKKyAgICAgICAgICAgIHJldHVybiAxLjA7CiAgICAgICAgIH0KLSAgICAgICAgLy8g55u05o6l5L2/55So57G75Lit5bey5pyJ55qE55m+5YiG5q+U6K6h566X5pa55rOVCi0gICAgICAgIHJldHVybiBzdGF0cy5nZXRQZXJjZW50YWdlRG93bmxvYWRlZCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PFN0cmluZ1tdPiBnZXRUYXNrcygpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvUmVxdWVzdENvbW1lbnRTZXJ2aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1JlcXVlc3RDb21tZW50U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjEyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1JlcXVlc3RDb21tZW50U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2U7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnNlcnZpY2UuSVNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0Q29tbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RDb21tZW50U2VydmljZSBleHRlbmRzIElTZXJ2aWNlPFJlcXVlc3RDb21tZW50PiB7CisgICAgdm9pZCBpbmNyZW1lbnRMaWtlKGludCBjb21tZW50SWQpOworICAgIExpc3Q8UmVxdWVzdENvbW1lbnQ+IGdldFJlcGxpZXMoaW50IHBhcmVudElkKTsKKyAgICAvLyDmlrDlop7vvJrojrflj5bluJblrZDnm7TmjqXor4TorrrmlbAKKyAgICBsb25nIGNvdW50QnlQb3N0SWQoSW50ZWdlciBwb3N0SWQpOy8vIOaWsOWinuaWueazlQorICAgIHZvaWQgY29tbWVudE9uUmVxdWVzdFBvc3QoUmVxdWVzdENvbW1lbnQgY29tbWVudCk7CisgICAgdm9pZCByZXBseUNvbW1lbnQoUmVxdWVzdENvbW1lbnQgcmVwbHkpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvUmVxdWVzdFBvc3RTZXJ2aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1JlcXVlc3RQb3N0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzAzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1JlcXVlc3RQb3N0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2U7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnNlcnZpY2UuSVNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0Q29tbWVudDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlJlcXVlc3RQb3N0OworCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RQb3N0U2VydmljZSBleHRlbmRzIElTZXJ2aWNlPFJlcXVlc3RQb3N0PiB7CisgICAgdm9pZCBpbmNyZW1lbnRMaWtlKEludGVnZXIgcG9zdElkKTsKKyAgICB2b2lkIGluY3JlbWVudFJlcGx5Q291bnQoSW50ZWdlciBwb3N0SWQpOworICAgIHZvaWQgbGlrZVBvc3QoSW50ZWdlciBwb3N0SWQsIFN0cmluZyBsaWtlcklkKTsvL+eCuei1nu+8jOW5tumAmuefpeivpeW4luWtkOeahOS9nOiAheOAggorICAgIHZvaWQgY29tbWVudE9uUmVxdWVzdFBvc3QoUmVxdWVzdENvbW1lbnQgY29tbWVudCk7IC8v5Zyo5biW5a2Q5LiL5Y+R6KGo5LiA5p2h5paw6K+E6K6677yM5bm26YCa55+l6K+l5biW5a2Q55qE5L2c6ICF44CCCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9pbXBsL1JlcXVlc3RDb21tZW50U2VydmljZUltcGwuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9SZXF1ZXN0Q29tbWVudFNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9SZXF1ZXN0Q29tbWVudFNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmNvbmRpdGlvbnMucXVlcnkuUXVlcnlXcmFwcGVyOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5leHRlbnNpb24uc2VydmljZS5pbXBsLlNlcnZpY2VJbXBsOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuUmVxdWVzdENvbW1lbnQ7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0UG9zdDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlJlcXVlc3RDb21tZW50TWFwcGVyOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuUmVxdWVzdFBvc3RNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuUmVxdWVzdENvbW1lbnRTZXJ2aWNlOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLk5vdGlmaWNhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudHJhbnNhY3Rpb24uYW5ub3RhdGlvbi5UcmFuc2FjdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAU2VydmljZQorcHVibGljIGNsYXNzIFJlcXVlc3RDb21tZW50U2VydmljZUltcGwKKyAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlSW1wbDxSZXF1ZXN0Q29tbWVudE1hcHBlciwgUmVxdWVzdENvbW1lbnQ+CisgICAgICAgIGltcGxlbWVudHMgUmVxdWVzdENvbW1lbnRTZXJ2aWNlIHsKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29tbWVudE1hcHBlciByZXF1ZXN0Q29tbWVudE1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJlcXVlc3RQb3N0TWFwcGVyIHJlcXVlc3RQb3N0TWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgTm90aWZpY2F0aW9uU2VydmljZSBub3RpZmljYXRpb25TZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwKKyAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRMaWtlKGludCBjb21tZW50SWQpIHsKKyAgICAgICAgdGhpcy51cGRhdGUobnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy51cGRhdGUuVXBkYXRlV3JhcHBlcjxSZXF1ZXN0Q29tbWVudD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJpZCIsIGNvbW1lbnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTcWwoImxpa2VfY291bnQgPSBsaWtlX2NvdW50ICsgMSIpCisgICAgICAgICk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwocmVhZE9ubHkgPSB0cnVlKQorICAgIHB1YmxpYyBMaXN0PFJlcXVlc3RDb21tZW50PiBnZXRSZXBsaWVzKGludCBwYXJlbnRJZCkgeworICAgICAgICByZXR1cm4gdGhpcy5iYXNlTWFwcGVyLnNlbGVjdExpc3QoCisgICAgICAgICAgICAgICAgbmV3IFF1ZXJ5V3JhcHBlcjxSZXF1ZXN0Q29tbWVudD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJwYXJlbnRfaWQiLCBwYXJlbnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5QXNjKCJjcmVhdGVfdGltZSIpCisgICAgICAgICk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGNvdW50QnlQb3N0SWQoSW50ZWdlciBwb3N0SWQpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50KG5ldyBRdWVyeVdyYXBwZXI8UmVxdWVzdENvbW1lbnQ+KCkKKyAgICAgICAgICAgICAgICAuZXEoInBvc3RfaWQiLCBwb3N0SWQpKTsgLy8g5Y+q5oyJcG9zdF9pZOe7n+iuoQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbW1lbnRPblJlcXVlc3RQb3N0KFJlcXVlc3RDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgLy8gMS4g5L+d5a2Y6K+E6K66CisgICAgICAgIHJlcXVlc3RDb21tZW50TWFwcGVyLmluc2VydChjb21tZW50KTsKKworICAgICAgICAvLyAyLiDpgJrnn6XluJblrZDkvZzogIUKKyAgICAgICAgUmVxdWVzdFBvc3QgcG9zdCA9IHJlcXVlc3RQb3N0TWFwcGVyLnNlbGVjdEJ5SWQoY29tbWVudC5nZXRQb3N0SWQoKSk7CisgICAgICAgIGlmIChwb3N0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhcG9zdC5nZXRBdXRob3JJZCgpLmVxdWFscyhjb21tZW50LmdldEF1dGhvcklkKCkpKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIG4uc2V0VXNlcklkKHBvc3QuZ2V0QXV0aG9ySWQoKSk7CisgICAgICAgICAgICBuLnNldFR5cGUoIlBPU1RfUkVQTFkiKTsKKyAgICAgICAgICAgIG4uc2V0VGl0bGUoIuaCqOeahOW4luWtkOacieS6huaWsOWbnuWkjSIpOworICAgICAgICAgICAgbi5zZXRDb250ZW50KCLnlKjmiLcgIgorICAgICAgICAgICAgICAgICAgICArIGNvbW1lbnQuZ2V0QXV0aG9ySWQoKQorICAgICAgICAgICAgICAgICAgICArICIg6K+E6K665LqG5oKo55qE5biW5a2QOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21tZW50LmdldENvbnRlbnQoKQorICAgICAgICAgICAgICAgICAgICArICJcIiIpOworICAgICAgICAgICAgbi5zZXRUYXJnZXRJZChwb3N0LmdldElkKCkpOworICAgICAgICAgICAgbi5zZXRUYXJnZXRUeXBlKCJIZWxwUG9zdCIpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zYXZlTm90aWZpY2F0aW9uKG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog55So5oi35Zue5aSN5bey5pyJ6K+E6K66CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbHlDb21tZW50KFJlcXVlc3RDb21tZW50IHJlcGx5KSB7CisgICAgICAgIC8vIDEuIOS/neWtmOWtkOivhOiuugorICAgICAgICByZXF1ZXN0Q29tbWVudE1hcHBlci5pbnNlcnQocmVwbHkpOworCisgICAgICAgIC8vIDIuIOmAmuefpeeItuivhOiuuuS9nOiAhQorICAgICAgICBSZXF1ZXN0Q29tbWVudCBwYXJlbnQgPSByZXF1ZXN0Q29tbWVudE1hcHBlci5zZWxlY3RCeUlkKHJlcGx5LmdldFBhcmVudElkKCkpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhcGFyZW50LmdldEF1dGhvcklkKCkuZXF1YWxzKHJlcGx5LmdldEF1dGhvcklkKCkpKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIG4uc2V0VXNlcklkKHBhcmVudC5nZXRBdXRob3JJZCgpKTsKKyAgICAgICAgICAgIG4uc2V0VHlwZSgiQ09NTUVOVF9SRVBMWSIpOworICAgICAgICAgICAgbi5zZXRUaXRsZSgi5oKo55qE6K+E6K665pyJ5LqG5paw5Zue5aSNIik7CisgICAgICAgICAgICBuLnNldENvbnRlbnQoIueUqOaItyAiCisgICAgICAgICAgICAgICAgICAgICsgcmVwbHkuZ2V0QXV0aG9ySWQoKQorICAgICAgICAgICAgICAgICAgICArICIg5Zue5aSN5LqG5oKo55qE6K+E6K66OiBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyByZXBseS5nZXRDb250ZW50KCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIiKTsKKyAgICAgICAgICAgIG4uc2V0VGFyZ2V0SWQocGFyZW50LmdldElkKCkpOworICAgICAgICAgICAgbi5zZXRUYXJnZXRUeXBlKCJSZXF1ZXN0Q29tbWVudCIpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zYXZlTm90aWZpY2F0aW9uKG4pOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9SZXF1ZXN0UG9zdFNlcnZpY2VJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL2ltcGwvUmVxdWVzdFBvc3RTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjU3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL2ltcGwvUmVxdWVzdFBvc3RTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5jb25kaXRpb25zLnVwZGF0ZS5VcGRhdGVXcmFwcGVyOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5leHRlbnNpb24uc2VydmljZS5pbXBsLlNlcnZpY2VJbXBsOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuUmVxdWVzdENvbW1lbnQ7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5SZXF1ZXN0UG9zdDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlJlcXVlc3RDb21tZW50TWFwcGVyOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuUmVxdWVzdFBvc3RNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuUmVxdWVzdFBvc3RTZXJ2aWNlOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLk5vdGlmaWNhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudHJhbnNhY3Rpb24uYW5ub3RhdGlvbi5UcmFuc2FjdGlvbmFsOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgUmVxdWVzdFBvc3RTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsPFJlcXVlc3RQb3N0TWFwcGVyLCBSZXF1ZXN0UG9zdD4gaW1wbGVtZW50cyBSZXF1ZXN0UG9zdFNlcnZpY2UgeworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJlcXVlc3RQb3N0TWFwcGVyIHJlcXVlc3RQb3N0TWFwcGVyOworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJlcXVlc3RDb21tZW50TWFwcGVyIHJlcXVlc3RDb21tZW50TWFwcGVyOworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvblNlcnZpY2Ugbm90aWZpY2F0aW9uU2VydmljZTsKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIGxpa2VQb3N0KEludGVnZXIgcG9zdElkLCBTdHJpbmcgbGlrZXJJZCkgeworICAgICAgICAvLyAxLiDmn6Xor6LluJblrZDmnKzouqvvvIzojrflj5YgYXV0aG9ySWQg5ZKMIHRpdGxlCisgICAgICAgIFJlcXVlc3RQb3N0IHBvc3QgPSByZXF1ZXN0UG9zdE1hcHBlci5zZWxlY3RCeUlkKHBvc3RJZCk7CisgICAgICAgIGlmIChwb3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCLluJblrZDkuI3lrZjlnKjvvIxJRD0iICsgcG9zdElkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDIuIOabtOaWsCBsaWtlX2NvdW50IOWtl+autQorICAgICAgICByZXF1ZXN0UG9zdE1hcHBlci51cGRhdGUoCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgVXBkYXRlV3JhcHBlcjxSZXF1ZXN0UG9zdD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJpZCIsIHBvc3RJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTcWwoImxpa2VfY291bnQgPSBsaWtlX2NvdW50ICsgMSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gMy4g57uZ5biW5a2Q5L2c6ICF5Y+R6YCa55+l77yI5o6S6Zmk6Ieq5bex57uZ6Ieq5bex54K56LWe55qE5oOF5Ya177yJCisgICAgICAgIFN0cmluZyBhdXRob3JJZCA9IHBvc3QuZ2V0QXV0aG9ySWQoKTsKKyAgICAgICAgaWYgKCFhdXRob3JJZC5lcXVhbHMobGlrZXJJZCkpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgbi5zZXRVc2VySWQoYXV0aG9ySWQpOyAgICAgICAgICAgICAgIC8vIOmAmuefpeaOpeaUtuaWuSA9IOW4luWtkOS9nOiAhQorICAgICAgICAgICAgbi5zZXRUeXBlKCJQT1NUX0xJS0UiKTsgICAgICAgICAgICAgIC8vIOmAmuefpeexu+Wei++8jOWPr+WJjeerr+e6puWumgorICAgICAgICAgICAgbi5zZXRUaXRsZSgi5oKo55qE5biW5a2Q6KKr54K56LWeIik7ICAgICAgICAvLyDpgJrnn6XmoIfpopgKKyAgICAgICAgICAgIG4uc2V0Q29udGVudCgi55So5oi3ICIKKyAgICAgICAgICAgICAgICAgICAgKyBsaWtlcklkCisgICAgICAgICAgICAgICAgICAgICsgIiDngrnotZ7kuobmgqjnmoTluJblrZA6IFwiIgorICAgICAgICAgICAgICAgICAgICArIHBvc3QuZ2V0VGl0bGUoKQorICAgICAgICAgICAgICAgICAgICArICJcIiIpOworICAgICAgICAgICAgbi5zZXRUYXJnZXRJZChwb3N0SWQpOyAgICAgICAgICAgICAgIC8vIOmAmuefpei3s+i9rOaXtuWPr+aMh+WQkeivpeW4luWtkAorICAgICAgICAgICAgbi5zZXRUYXJnZXRUeXBlKCJIZWxwUG9zdCIpOyAgICAgICAgIC8vIOWJjeerr+WPr+agueaNruatpOWAvOWGs+Wumui3s+i9rOmAu+i+kQorICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zYXZlTm90aWZpY2F0aW9uKG4pOworICAgICAgICB9CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIHZvaWQgaW5jcmVtZW50TGlrZShJbnRlZ2VyIHBvc3RJZCkgeworICAgICAgICB0aGlzLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBVcGRhdGVXcmFwcGVyPFJlcXVlc3RQb3N0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXEoImlkIiwgcG9zdElkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNxbCgibGlrZV9jb3VudCA9IGxpa2VfY291bnQgKyAxIikKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIGluY3JlbWVudFJlcGx5Q291bnQoSW50ZWdlciBwb3N0SWQpIHsKKyAgICAgICAgdGhpcy51cGRhdGUoCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgVXBkYXRlV3JhcHBlcjxSZXF1ZXN0UG9zdD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJpZCIsIHBvc3RJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTcWwoInJlcGx5X2NvdW50ID0gcmVwbHlfY291bnQgKyAxIikKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIGNvbW1lbnRPblJlcXVlc3RQb3N0KFJlcXVlc3RDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgLy8gMS4g5bCG5paw55qEIEhlbHBDb21tZW50IOaPkuWFpeaVsOaNruW6kworICAgICAgICAvLyAgICDlpoLmnpwgcGFyZW50SWQgIT0gMO+8jOWImeivtOaYjui/meaYr+S4gOadoeWvueWtkOivhOiuuueahOWbnuWkje+8m+WmguaenCBwYXJlbnRJZCA9IDDvvIzliJnov5nlsLHmmK/lr7nluJblrZDnmoTkuIDnuqfor4TorrrjgIIKKyAgICAgICAgcmVxdWVzdENvbW1lbnRNYXBwZXIuaW5zZXJ0KGNvbW1lbnQpOworCisgICAgICAgIC8vIDIuIOW4luWtkOWbnuWkjeaVsCArMe+8iHJlcGx5X2NvdW50IOWtl+aute+8iQorICAgICAgICBJbnRlZ2VyIHBvc3RJZCA9IGNvbW1lbnQuZ2V0UG9zdElkKCk7CisgICAgICAgIHJlcXVlc3RQb3N0TWFwcGVyLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBVcGRhdGVXcmFwcGVyPFJlcXVlc3RQb3N0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXEoImlkIiwgcG9zdElkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNxbCgicmVwbHlfY291bnQgPSByZXBseV9jb3VudCArIDEiKQorICAgICAgICApOworCisgICAgICAgIC8vIDMuIOe7meW4luWtkOS9nOiAheWPkeS4gOadoemAmuefpe+8iOWmguaenOivhOiuuuS6uuS4jeaYr+S9nOiAheiHquW3se+8iQorICAgICAgICBSZXF1ZXN0UG9zdCBwb3N0ID0gcmVxdWVzdFBvc3RNYXBwZXIuc2VsZWN0QnlJZChwb3N0SWQpOworICAgICAgICBpZiAocG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgYXV0aG9ySWQgPSBwb3N0LmdldEF1dGhvcklkKCk7ICAgICAgICAgICAgLy8g5biW5a2Q5L2c6ICF55qEIElECisgICAgICAgICAgICBTdHJpbmcgY29tbWVudGVySWQgPSBjb21tZW50LmdldEF1dGhvcklkKCk7ICAgICAgLy8g5b2T5YmN5Y+R6KGo6K+E6K6655qE55So5oi3IElECisgICAgICAgICAgICBpZiAoIWF1dGhvcklkLmVxdWFscyhjb21tZW50ZXJJZCkpIHsKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICBuLnNldFVzZXJJZChhdXRob3JJZCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIOmAmuefpeaOpeaUtuS6uiA9IOW4luWtkOS9nOiAhQorICAgICAgICAgICAgICAgIG4uc2V0VHlwZSgiUE9TVF9SRVBMWSIpOyAgICAgICAgICAgICAgICAgICAgLy8g6YCa55+l57G75Z6L77yM5Y+v5LiO5YmN56uv57qm5a6aCisgICAgICAgICAgICAgICAgbi5zZXRUaXRsZSgi5oKo55qE5biW5a2Q5pyJ5LqG5paw5Zue5aSNIik7ICAgICAgICAgICAgIC8vIOmAmuefpeagh+mimAorICAgICAgICAgICAgICAgIC8vIOmAmuefpeWGheWuueekuuS+i++8miDnlKjmiLcgPGNvbW1lbnRlcklkPiDor4TorrrkuobmgqjnmoTluJblrZA6ICLor4TorrrlhoXlrrkiCisgICAgICAgICAgICAgICAgbi5zZXRDb250ZW50KCLnlKjmiLcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb21tZW50ZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIOivhOiuuuS6huaCqOeahOW4luWtkDogXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1lbnQuZ2V0Q29udGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIpOworICAgICAgICAgICAgICAgIG4uc2V0VGFyZ2V0SWQocG9zdElkKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0SWQg5Y+v5oyH5ZCR6K+l5biW5a2QCisgICAgICAgICAgICAgICAgbi5zZXRUYXJnZXRUeXBlKCJIZWxwUG9zdCIpOyAgICAgICAgICAgICAgICAvLyB0YXJnZXRUeXBlID0gIkhlbHBQb3N0IgorICAgICAgICAgICAgICAgIG4uc2V0SXNSZWFkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBuLnNldENyZWF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7CisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zYXZlTm90aWZpY2F0aW9uKG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9Ub3JyZW50U2VydmljZUltcGwuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9Ub3JyZW50U2VydmljZUltcGwuamF2YQppbmRleCAzMjgxZDgzLi45NjgyOWU3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL2ltcGwvVG9ycmVudFNlcnZpY2VJbXBsLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9pbXBsL1RvcnJlbnRTZXJ2aWNlSW1wbC5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiBwdWJsaWMgY2xhc3MgVG9ycmVudFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGw8VG9ycmVudE1hcHBlciwgVE9SUkVOVD4gaW1wbGVtZW50cyBUb3JyZW50U2VydmljZSB7CiAKICAgICBAT3ZlcnJpZGUKKwogICAgIHB1YmxpYyBUT1JSRU5UIGdldFRvcnJlbnRCeUlkKEludGVnZXIgaWQpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlJZChpZCk7IC8vIOebtOaOpeiwg+eUqCBNeUJhdGlzLVBsdXMg5o+Q5L6b55qEIGdldEJ5SWQg5pa55rOVCiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvSnd0VXRpbHMuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL0p3dFV0aWxzLmphdmEKaW5kZXggMmVkOTA2OC4uNTcwNmI1ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvSnd0VXRpbHMuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS91dGlscy9Kd3RVdGlscy5qYXZhCkBAIC02LDcgKzYsOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiAKKwogcHVibGljIGNsYXNzIEp3dFV0aWxzIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZXhwaXJlID0gMzYwMDA7CiAgICAgLy8g5L2/55So6Laz5aSf6ZW/55qE5a+G6ZKl77yI6Iez5bCRNjTlrZfnrKbvvIkKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VjcmV0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2wiOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Bbm5vdW5jZW1lbnRDb250cm9sbGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Bbm5vdW5jZW1lbnRDb250cm9sbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNWQ1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL0Fubm91bmNlbWVudENvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LkFOTk9VTkNFTUVOVDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLkFubm91bmNlbWVudE1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50Q2FwdG9yOworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy4qOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitjbGFzcyBBbm5vdW5jZW1lbnRDb250cm9sbGVyVGVzdCB7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgQW5ub3VuY2VtZW50TWFwcGVyIGFubm91bmNlbWVudE1hcHBlcjsKKworICAgIEBJbmplY3RNb2NrcworICAgIHByaXZhdGUgQW5ub3VuY2VtZW50Q29udHJvbGxlciBhbm5vdW5jZW1lbnRDb250cm9sbGVyOworCisgICAgcHJpdmF0ZSBBTk5PVU5DRU1FTlQgbW9ja0Fubm91bmNlbWVudDsKKyAgICBwcml2YXRlIGZpbmFsIExvY2FsRGF0ZVRpbWUgbm93ID0gTG9jYWxEYXRlVGltZS5ub3coKTsKKworICAgIEBCZWZvcmVFYWNoCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLm9wZW5Nb2Nrcyh0aGlzKTsKKworICAgICAgICAvLyDliJ3lp4vljJbmtYvor5XmlbDmja4KKyAgICAgICAgbW9ja0Fubm91bmNlbWVudCA9IG5ldyBBTk5PVU5DRU1FTlQoKTsKKyAgICAgICAgbW9ja0Fubm91bmNlbWVudC5zZXRJZCgxKTsKKyAgICAgICAgbW9ja0Fubm91bmNlbWVudC5zZXRUaXRsZSgi5rWL6K+V5YWs5ZGKIik7CisgICAgICAgIG1vY2tBbm5vdW5jZW1lbnQuc2V0Q29udGVudCgi6L+Z5piv5rWL6K+V5YWs5ZGK5YaF5a65Iik7CisgICAgICAgIG1vY2tBbm5vdW5jZW1lbnQuc2V0Q3JlYXRlVGltZShub3cpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBsaXN0QWxsX1Nob3VsZFJldHVybkFsbEFubm91bmNlbWVudHMoKSB7CisgICAgICAgIC8vIOWHhuWkh+a1i+ivleaVsOaNrgorICAgICAgICBBTk5PVU5DRU1FTlQgYTIgPSBuZXcgQU5OT1VOQ0VNRU5UKCk7CisgICAgICAgIGEyLnNldElkKDIpOworICAgICAgICBhMi5zZXRUaXRsZSgi5Y+m5LiA5Liq5YWs5ZGKIik7CisKKyAgICAgICAgTGlzdDxBTk5PVU5DRU1FTlQ+IGFubm91bmNlbWVudHMgPSBBcnJheXMuYXNMaXN0KG1vY2tBbm5vdW5jZW1lbnQsIGEyKTsKKworICAgICAgICAvLyDmqKHmi59NYXBwZXLooYzkuLoKKyAgICAgICAgd2hlbihhbm5vdW5jZW1lbnRNYXBwZXIuc2VsZWN0QWxsKCkpLnRoZW5SZXR1cm4oYW5ub3VuY2VtZW50cyk7CisKKyAgICAgICAgLy8g6LCD55So5o6n5Yi25Zmo5pa55rOVCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBhbm5vdW5jZW1lbnRDb250cm9sbGVyLmxpc3RBbGwoKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhbm5vdW5jZW1lbnRzLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgiYW5ub3VuY2VtZW50cyIpKTsKKworICAgICAgICAvLyDpqozor4FNYXBwZXLosIPnlKgKKyAgICAgICAgdmVyaWZ5KGFubm91bmNlbWVudE1hcHBlciwgdGltZXMoMSkpLnNlbGVjdEFsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBsaXN0TGF0ZXN0X1Nob3VsZFJldHVybkxhdGVzdDVBbm5vdW5jZW1lbnRzKCkgeworICAgICAgICAvLyDlh4blpIfmtYvor5XmlbDmja4KKyAgICAgICAgTGlzdDxBTk5PVU5DRU1FTlQ+IGxhdGVzdEFubm91bmNlbWVudHMgPSBBcnJheXMuYXNMaXN0KG1vY2tBbm5vdW5jZW1lbnQpOworCisgICAgICAgIC8vIOaooeaLn01hcHBlcuihjOS4ugorICAgICAgICB3aGVuKGFubm91bmNlbWVudE1hcHBlci5zZWxlY3RMYXRlc3QoNSkpLnRoZW5SZXR1cm4obGF0ZXN0QW5ub3VuY2VtZW50cyk7CisKKyAgICAgICAgLy8g6LCD55So5o6n5Yi25Zmo5pa55rOVCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBhbm5vdW5jZW1lbnRDb250cm9sbGVyLmxpc3RMYXRlc3QoKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsYXRlc3RBbm5vdW5jZW1lbnRzLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgiYW5ub3VuY2VtZW50cyIpKTsKKworICAgICAgICAvLyDpqozor4FNYXBwZXLosIPnlKgKKyAgICAgICAgdmVyaWZ5KGFubm91bmNlbWVudE1hcHBlciwgdGltZXMoMSkpLnNlbGVjdExhdGVzdCg1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgZ2V0RGV0YWlsX1Nob3VsZFJldHVybkFubm91bmNlbWVudF9XaGVuRXhpc3RzKCkgeworICAgICAgICAvLyDmqKHmi59NYXBwZXLooYzkuLoKKyAgICAgICAgd2hlbihhbm5vdW5jZW1lbnRNYXBwZXIuc2VsZWN0QnlJZCgxKSkudGhlblJldHVybihtb2NrQW5ub3VuY2VtZW50KTsKKworICAgICAgICAvLyDosIPnlKjmjqfliLblmajmlrnms5UKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IGFubm91bmNlbWVudENvbnRyb2xsZXIuZ2V0RGV0YWlsKDEpOworCisgICAgICAgIC8vIOmqjOivgee7k+aenAorICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tBbm5vdW5jZW1lbnQsIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJhbm5vdW5jZW1lbnQiKSk7CisKKyAgICAgICAgLy8g6aqM6K+BTWFwcGVy6LCD55SoCisgICAgICAgIHZlcmlmeShhbm5vdW5jZW1lbnRNYXBwZXIsIHRpbWVzKDEpKS5zZWxlY3RCeUlkKDEpOworICAgIH0KKworCisKKyAgICBAVGVzdAorICAgIHZvaWQgY3JlYXRlQW5ub3VuY2VtZW50X1Nob3VsZFJldHVyblN1Y2Nlc3NfV2hlblZhbGlkSW5wdXQoKSB7CisgICAgICAgIC8vIOaooeaLn01hcHBlcuihjOS4ugorICAgICAgICB3aGVuKGFubm91bmNlbWVudE1hcHBlci5pbnNlcnQoYW55KEFOTk9VTkNFTUVOVC5jbGFzcykpKS50aGVuUmV0dXJuKDEpOworCisgICAgICAgIC8vIOiwg+eUqOaOp+WItuWZqOaWueazlQorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gYW5ub3VuY2VtZW50Q29udHJvbGxlci5jcmVhdGVBbm5vdW5jZW1lbnQoIua1i+ivleagh+mimCIsICLmtYvor5XlhoXlrrkiKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi5YWs5ZGK5Y+R5biD5oiQ5YqfIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgLy8g6aqM6K+BTWFwcGVy6LCD55SoCisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPEFOTk9VTkNFTUVOVD4gY2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoQU5OT1VOQ0VNRU5ULmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KGFubm91bmNlbWVudE1hcHBlciwgdGltZXMoMSkpLmluc2VydChjYXB0b3IuY2FwdHVyZSgpKTsKKworICAgICAgICBBTk5PVU5DRU1FTlQgc2F2ZWQgPSBjYXB0b3IuZ2V0VmFsdWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCLmtYvor5XmoIfpopgiLCBzYXZlZC5nZXRUaXRsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCLmtYvor5XlhoXlrrkiLCBzYXZlZC5nZXRDb250ZW50KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNhdmVkLmdldENyZWF0ZVRpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGNyZWF0ZUFubm91bmNlbWVudF9TaG91bGRSZXR1cm5FcnJvcl9XaGVuSW5zZXJ0RmFpbHMoKSB7CisgICAgICAgIC8vIOaooeaLn01hcHBlcuihjOS4ugorICAgICAgICB3aGVuKGFubm91bmNlbWVudE1hcHBlci5pbnNlcnQoYW55KEFOTk9VTkNFTUVOVC5jbGFzcykpKS50aGVuUmV0dXJuKDApOworCisgICAgICAgIC8vIOiwg+eUqOaOp+WItuWZqOaWueazlQorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gYW5ub3VuY2VtZW50Q29udHJvbGxlci5jcmVhdGVBbm5vdW5jZW1lbnQoIua1i+ivleagh+mimCIsICLmtYvor5XlhoXlrrkiKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi5YWs5ZGK5Y+R5biD5aSx6LSlIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgLy8g6aqM6K+BTWFwcGVy6LCD55SoCisgICAgICAgIHZlcmlmeShhbm5vdW5jZW1lbnRNYXBwZXIsIHRpbWVzKDEpKS5pbnNlcnQoYW55KEFOTk9VTkNFTUVOVC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBjcmVhdGVBbm5vdW5jZW1lbnRfU2hvdWxkUmV0dXJuRXJyb3JfV2hlbkV4Y2VwdGlvbk9jY3VycygpIHsKKyAgICAgICAgLy8g5qih5oufTWFwcGVy5oqb5Ye65byC5bi4CisgICAgICAgIHdoZW4oYW5ub3VuY2VtZW50TWFwcGVyLmluc2VydChhbnkoQU5OT1VOQ0VNRU5ULmNsYXNzKSkpCisgICAgICAgICAgICAgICAgLnRoZW5UaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbigi5pWw5o2u5bqT6ZSZ6K+vIikpOworCisgICAgICAgIC8vIOiwg+eUqOaOp+WItuWZqOaWueazlQorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gYW5ub3VuY2VtZW50Q29udHJvbGxlci5jcmVhdGVBbm5vdW5jZW1lbnQoIua1i+ivleagh+mimCIsICLmtYvor5XlhoXlrrkiKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldE1lc3NhZ2UoKS5jb250YWlucygi5pyN5Yqh5Zmo6ZSZ6K+vIikpOworCisgICAgICAgIC8vIOmqjOivgU1hcHBlcuiwg+eUqAorICAgICAgICB2ZXJpZnkoYW5ub3VuY2VtZW50TWFwcGVyLCB0aW1lcygxKSkuaW5zZXJ0KGFueShBTk5PVU5DRU1FTlQuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1JlcXVlc3RDb21tZW50Q29udHJvbGxlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvUmVxdWVzdENvbW1lbnRDb250cm9sbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWEzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1JlcXVlc3RDb21tZW50Q29udHJvbGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uY29udHJvbGxlcjsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmNvbmRpdGlvbnMuV3JhcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlJlcXVlc3RDb21tZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLlJlcXVlc3RDb21tZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5SZXF1ZXN0UG9zdFNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5JbmplY3RNb2NrczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tNdWx0aXBhcnRGaWxlOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy4qOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitjbGFzcyBSZXF1ZXN0Q29tbWVudENvbnRyb2xsZXJUZXN0IHsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29tbWVudFNlcnZpY2UgY29tbWVudFNlcnZpY2U7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgUmVxdWVzdFBvc3RTZXJ2aWNlIHBvc3RTZXJ2aWNlOworCisgICAgQEluamVjdE1vY2tzCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29tbWVudENvbnRyb2xsZXIgY29tbWVudENvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhdXRob3JJZCA9ICJ1c2VyMTIzIjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvdGhlckF1dGhvcklkID0gInVzZXI0NTYiOworCisgICAgQEJlZm9yZUVhY2gKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMub3Blbk1vY2tzKHRoaXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBsaWtlQ29tbWVudF9TaG91bGRSZXR1cm5TdWNjZXNzKCkgeworICAgICAgICBpbnQgY29tbWVudElkID0gMTsKKyAgICAgICAgZG9Ob3RoaW5nKCkud2hlbihjb21tZW50U2VydmljZSkuaW5jcmVtZW50TGlrZShjb21tZW50SWQpOworCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBjb21tZW50Q29udHJvbGxlci5saWtlKGNvbW1lbnRJZCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi5oiQ5YqfIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHZlcmlmeShjb21tZW50U2VydmljZSwgdGltZXMoMSkpLmluY3JlbWVudExpa2UoY29tbWVudElkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgZ2V0UmVwbGllc19TaG91bGRSZXR1cm5SZXBsaWVzKCkgeworICAgICAgICBpbnQgY29tbWVudElkID0gMTsKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgcjEgPSBuZXcgUmVxdWVzdENvbW1lbnQoKTsKKyAgICAgICAgcjEuc2V0SWQoMik7IHIxLnNldFBvc3RJZCgxKTsgcjEuc2V0UGFyZW50SWQoY29tbWVudElkKTsKKyAgICAgICAgcjEuc2V0QXV0aG9ySWQoInVzZXIyIik7IHIxLnNldENvbnRlbnQoIlJlcGx5IDEiKTsKKyAgICAgICAgcjEuc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm5vdygpKTsgcjEuc2V0TGlrZUNvdW50KDApOworICAgICAgICByMS5zZXRSZXBseVRvKCJ1c2VyMSIpOworCisgICAgICAgIFJlcXVlc3RDb21tZW50IHIyID0gbmV3IFJlcXVlc3RDb21tZW50KCk7CisgICAgICAgIHIyLnNldElkKDMpOyByMi5zZXRQb3N0SWQoMSk7IHIyLnNldFBhcmVudElkKGNvbW1lbnRJZCk7CisgICAgICAgIHIyLnNldEF1dGhvcklkKCJ1c2VyMyIpOyByMi5zZXRDb250ZW50KCJSZXBseSAyIik7CisgICAgICAgIHIyLnNldENyZWF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7IHIyLnNldExpa2VDb3VudCgwKTsKKyAgICAgICAgcjIuc2V0UmVwbHlUbygidXNlcjEiKTsKKworICAgICAgICBMaXN0PFJlcXVlc3RDb21tZW50PiBtb2NrUmVwbGllcyA9IEFycmF5cy5hc0xpc3QocjEsIHIyKTsKKyAgICAgICAgd2hlbihjb21tZW50U2VydmljZS5nZXRSZXBsaWVzKGNvbW1lbnRJZCkpLnRoZW5SZXR1cm4obW9ja1JlcGxpZXMpOworCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBjb21tZW50Q29udHJvbGxlci5nZXRSZXBsaWVzKGNvbW1lbnRJZCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBMaXN0PFJlcXVlc3RDb21tZW50PiByZXQgPSAoTGlzdDxSZXF1ZXN0Q29tbWVudD4pIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJyZXBsaWVzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtb2NrUmVwbGllcywgcmV0KTsKKyAgICAgICAgdmVyaWZ5KGNvbW1lbnRTZXJ2aWNlLCB0aW1lcygxKSkuZ2V0UmVwbGllcyhjb21tZW50SWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBhZGRSZXBseVdpdGhvdXRJbWFnZV9TaG91bGRSZXR1cm5TdWNjZXNzKCkgeworICAgICAgICBpbnQgY29tbWVudElkID0gNTsKKyAgICAgICAgU3RyaW5nIGF1dGhvcklkID0gInVzZXJYIjsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAibm8gaW1hZ2UgcmVwbHkiOworCisgICAgICAgIFJlcXVlc3RDb21tZW50IHBhcmVudCA9IG5ldyBSZXF1ZXN0Q29tbWVudCgpOworICAgICAgICBwYXJlbnQuc2V0SWQoY29tbWVudElkKTsKKyAgICAgICAgcGFyZW50LnNldEF1dGhvcklkKCJ1c2VyUGFyZW50Iik7CisgICAgICAgIHBhcmVudC5zZXRQb3N0SWQoMTApOworICAgICAgICB3aGVuKGNvbW1lbnRTZXJ2aWNlLmdldEJ5SWQoY29tbWVudElkKSkudGhlblJldHVybihwYXJlbnQpOworCisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2Uuc2F2ZShhbnkoUmVxdWVzdENvbW1lbnQuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsKKworICAgICAgICBSZXN1bHQgcmVzdWx0ID0gY29tbWVudENvbnRyb2xsZXIuYWRkUmVwbHkoY29tbWVudElkLCBhdXRob3JJZCwgY29udGVudCwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIFJlcXVlc3RDb21tZW50IHJlcGx5ID0gKFJlcXVlc3RDb21tZW50KSByZXN1bHQuZ2V0RGF0YSgpLmdldCgicmVwbHkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBseSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhdXRob3JJZCwgcmVwbHkuZ2V0QXV0aG9ySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50LCByZXBseS5nZXRDb250ZW50KCkpOworICAgICAgICBhc3NlcnROdWxsKHJlcGx5LmdldEltYWdlVXJsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29tbWVudElkLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgicGFyZW50Q29tbWVudElkIikpOworICAgICAgICB2ZXJpZnkoY29tbWVudFNlcnZpY2UsIHRpbWVzKDEpKS5zYXZlKGFueShSZXF1ZXN0Q29tbWVudC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBhZGRSZXBseVdpdGhJbWFnZV9TaG91bGRSZXR1cm5TdWNjZXNzKCkgeworICAgICAgICBpbnQgY29tbWVudElkID0gODsKKyAgICAgICAgU3RyaW5nIGF1dGhvcklkID0gInVzZXJZIjsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAid2l0aCBpbWFnZSByZXBseSI7CisKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgcGFyZW50ID0gbmV3IFJlcXVlc3RDb21tZW50KCk7CisgICAgICAgIHBhcmVudC5zZXRJZChjb21tZW50SWQpOworICAgICAgICBwYXJlbnQuc2V0QXV0aG9ySWQoInVzZXJQYXJlbnQiKTsKKyAgICAgICAgcGFyZW50LnNldFBvc3RJZCgyMCk7CisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UuZ2V0QnlJZChjb21tZW50SWQpKS50aGVuUmV0dXJuKHBhcmVudCk7CisKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB7MHgxLCAweDJ9OworICAgICAgICBNb2NrTXVsdGlwYXJ0RmlsZSBpbWFnZSA9IG5ldyBNb2NrTXVsdGlwYXJ0RmlsZSgKKyAgICAgICAgICAgICAgICAiaW1hZ2UiLCAidGVzdC5wbmciLCAiaW1hZ2UvcG5nIiwgZGF0YQorICAgICAgICApOworCisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2Uuc2F2ZShhbnkoUmVxdWVzdENvbW1lbnQuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsKKworICAgICAgICBSZXN1bHQgcmVzdWx0ID0gY29tbWVudENvbnRyb2xsZXIuYWRkUmVwbHkoY29tbWVudElkLCBhdXRob3JJZCwgY29udGVudCwgaW1hZ2UpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICBSZXF1ZXN0Q29tbWVudCByZXBseSA9IChSZXF1ZXN0Q29tbWVudCkgcmVzdWx0LmdldERhdGEoKS5nZXQoInJlcGx5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVwbHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXV0aG9ySWQsIHJlcGx5LmdldEF1dGhvcklkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudCwgcmVwbHkuZ2V0Q29udGVudCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBseS5nZXRJbWFnZVVybCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXBseS5nZXRJbWFnZVVybCgpLnN0YXJ0c1dpdGgoIi91cGxvYWRzLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbW1lbnRJZCwgcmVzdWx0LmdldERhdGEoKS5nZXQoInBhcmVudENvbW1lbnRJZCIpKTsKKyAgICAgICAgdmVyaWZ5KGNvbW1lbnRTZXJ2aWNlLCB0aW1lcygxKSkuc2F2ZShhbnkoUmVxdWVzdENvbW1lbnQuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgYWRkUmVwbHlfU2hvdWxkUmV0dXJuRXJyb3JfV2hlblBhcmVudE5vdEV4aXN0KCkgeworICAgICAgICBpbnQgY29tbWVudElkID0gOTk7CisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UuZ2V0QnlJZChjb21tZW50SWQpKS50aGVuUmV0dXJuKG51bGwpOworCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBjb21tZW50Q29udHJvbGxlci5hZGRSZXBseShjb21tZW50SWQsICJhbnkiLCAiY29udGVudCIsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIuiiq+WbnuWkjeeahOivhOiuuuS4jeWtmOWcqCIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOworICAgICAgICB2ZXJpZnkoY29tbWVudFNlcnZpY2UsIG5ldmVyKCkpLnNhdmUoYW55KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBkZWxldGVDb21tZW50X1Nob3VsZFJldHVyblN1Y2Nlc3NfV2hlbkF1dGhvck1hdGNoZXMoKSB7CisgICAgICAgIC8vIOWHhuWkh+a1i+ivleaVsOaNrgorICAgICAgICBpbnQgY29tbWVudElkID0gMTsKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgY29tbWVudCA9IG5ldyBSZXF1ZXN0Q29tbWVudCgpOworICAgICAgICBjb21tZW50LnNldElkKGNvbW1lbnRJZCk7CisgICAgICAgIGNvbW1lbnQuc2V0QXV0aG9ySWQoYXV0aG9ySWQpOworICAgICAgICBjb21tZW50LnNldFBvc3RJZCgxMCk7CisKKyAgICAgICAgd2hlbihjb21tZW50U2VydmljZS5nZXRCeUlkKGNvbW1lbnRJZCkpLnRoZW5SZXR1cm4oY29tbWVudCk7CisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UucmVtb3ZlQnlJZChjb21tZW50SWQpKS50aGVuUmV0dXJuKHRydWUpOworCisgICAgICAgIC8vIOiwg+eUqOaWueazlQorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gY29tbWVudENvbnRyb2xsZXIuZGVsZXRlQ29tbWVudChjb21tZW50SWQsIGF1dGhvcklkKTsKKworICAgICAgICAvLyDpqozor4Hnu5PmnpwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisKKyAgICAgICAgLy8g6aqM6K+B5pyN5Yqh6LCD55SoCisgICAgICAgIHZlcmlmeShjb21tZW50U2VydmljZSkucmVtb3ZlQnlJZChjb21tZW50SWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9SZXF1ZXN0UG9zdENvbnRyb2xsZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1JlcXVlc3RQb3N0Q29udHJvbGxlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I4OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9SZXF1ZXN0UG9zdENvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5jb25kaXRpb25zLldyYXBwZXI7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmV4dGVuc2lvbi5wbHVnaW5zLnBhZ2luYXRpb24uUGFnZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlJlcXVlc3RDb21tZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuUmVxdWVzdFBvc3Q7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5Ob3RpZmljYXRpb247CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLm1hcHBlci5SZXF1ZXN0UG9zdE1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5SZXF1ZXN0Q29tbWVudFNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuUmVxdWVzdFBvc3RTZXJ2aWNlOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLk5vdGlmaWNhdGlvblNlcnZpY2U7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKK2ltcG9ydCBvcmcubW9ja2l0by5JbmplY3RNb2NrczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1vY2sud2ViLk1vY2tNdWx0aXBhcnRGaWxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy4qOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKKworY2xhc3MgUmVxdWVzdFBvc3RDb250cm9sbGVyVGVzdCB7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgUmVxdWVzdFBvc3RTZXJ2aWNlIHBvc3RTZXJ2aWNlOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIFJlcXVlc3RDb21tZW50U2VydmljZSBjb21tZW50U2VydmljZTsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25TZXJ2aWNlIG5vdGlmaWNhdGlvblNlcnZpY2U7CisKKyAgICBASW5qZWN0TW9ja3MKKyAgICBwcml2YXRlIFJlcXVlc3RQb3N0Q29udHJvbGxlciBwb3N0Q29udHJvbGxlcjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGF1dGhvcklkID0gInVzZXIxMjMiOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG90aGVyQXV0aG9ySWQgPSAidXNlcjQ1NiI7CisKKyAgICBAQmVmb3JlRWFjaAorICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5vcGVuTW9ja3ModGhpcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGNyZWF0ZVBvc3RfU2hvdWxkUmV0dXJuU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyDlh4blpIfmtYvor5XmlbDmja4KKyAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlc3QgVGl0bGUiOworICAgICAgICBTdHJpbmcgY29udGVudCA9ICJUZXN0IENvbnRlbnQiOworICAgICAgICBNb2NrTXVsdGlwYXJ0RmlsZSBpbWFnZSA9IG5ldyBNb2NrTXVsdGlwYXJ0RmlsZSgKKyAgICAgICAgICAgICAgICAiaW1hZ2UiLCAidGVzdC5qcGciLCAiaW1hZ2UvanBlZyIsICJ0ZXN0IGltYWdlIi5nZXRCeXRlcygpKTsKKworICAgICAgICAvLyDosIPnlKjmlrnms5UKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHBvc3RDb250cm9sbGVyLmNyZWF0ZVBvc3QodGl0bGUsIGNvbnRlbnQsIGF1dGhvcklkLCBpbWFnZSk7CisKKyAgICAgICAgLy8g6aqM6K+B57uT5p6cCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICBSZXF1ZXN0UG9zdCBjcmVhdGVkUG9zdCA9IChSZXF1ZXN0UG9zdCkgcmVzdWx0LmdldERhdGEoKS5nZXQoInBvc3QiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjcmVhdGVkUG9zdC5nZXRJbWFnZVVybCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjcmVhdGVkUG9zdC5nZXRJbWFnZVVybCgpLnN0YXJ0c1dpdGgoIi91cGxvYWRzLyIpKTsKKworICAgICAgICAvLyDpqozor4HmnI3liqHosIPnlKgKKyAgICAgICAgdmVyaWZ5KHBvc3RTZXJ2aWNlKS5zYXZlKGFueShSZXF1ZXN0UG9zdC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBnZXRQb3N0X1Nob3VsZFJldHVyblBvc3RXaXRoQ29tbWVudHNfV2hlblBvc3RFeGlzdHMoKSB7CisgICAgICAgIGludCBwb3N0SWQgPSAxOworICAgICAgICBSZXF1ZXN0UG9zdCBwb3N0ID0gbmV3IFJlcXVlc3RQb3N0KCk7CisgICAgICAgIHBvc3Quc2V0SWQocG9zdElkKTsKKyAgICAgICAgcG9zdC5zZXRUaXRsZSgiVGVzdCBQb3N0Iik7CisgICAgICAgIHBvc3Quc2V0Q29udGVudCgiVGVzdCBDb250ZW50Iik7CisgICAgICAgIHBvc3Quc2V0QXV0aG9ySWQoInVzZXIxIik7CisgICAgICAgIHBvc3Quc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm5vdygpKTsKKworICAgICAgICBSZXF1ZXN0Q29tbWVudCBjMSA9IG5ldyBSZXF1ZXN0Q29tbWVudCgpOworICAgICAgICBjMS5zZXRJZCgxKTsgYzEuc2V0UG9zdElkKHBvc3RJZCk7IGMxLnNldFBhcmVudElkKDApOworICAgICAgICBjMS5zZXRBdXRob3JJZCgidXNlcjIiKTsgYzEuc2V0Q29udGVudCgiQ29tbWVudCAxIik7CisgICAgICAgIGMxLnNldENyZWF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7CisKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgYzIgPSBuZXcgUmVxdWVzdENvbW1lbnQoKTsKKyAgICAgICAgYzIuc2V0SWQoMik7IGMyLnNldFBvc3RJZChwb3N0SWQpOyBjMi5zZXRQYXJlbnRJZCgwKTsKKyAgICAgICAgYzIuc2V0QXV0aG9ySWQoInVzZXIzIik7IGMyLnNldENvbnRlbnQoIkNvbW1lbnQgMiIpOworICAgICAgICBjMi5zZXRDcmVhdGVUaW1lKExvY2FsRGF0ZVRpbWUubm93KCkpOworCisgICAgICAgIExpc3Q8UmVxdWVzdENvbW1lbnQ+IGNvbW1lbnRzID0gQXJyYXlzLmFzTGlzdChjMSwgYzIpOworCisgICAgICAgIHdoZW4ocG9zdFNlcnZpY2UuZ2V0QnlJZChwb3N0SWQpKS50aGVuUmV0dXJuKHBvc3QpOworICAgICAgICAvLyDpgb/lhY3ph43ovb3kuozkuYnmgKfvvIzmmI7noa4gc3R1YiBsaXN0KFdyYXBwZXIpCisgICAgICAgIGRvUmV0dXJuKGNvbW1lbnRzKQorICAgICAgICAgICAgICAgIC53aGVuKGNvbW1lbnRTZXJ2aWNlKQorICAgICAgICAgICAgICAgIC5saXN0KGFueShXcmFwcGVyLmNsYXNzKSk7CisKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHBvc3RDb250cm9sbGVyLmdldFBvc3QocG9zdElkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvc3QsIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJwb3N0IikpOworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgTGlzdDxSZXF1ZXN0Q29tbWVudD4gcmV0ID0gKExpc3Q8UmVxdWVzdENvbW1lbnQ+KSByZXN1bHQuZ2V0RGF0YSgpLmdldCgiY29tbWVudHMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJldC5zaXplKCkpOworCisgICAgICAgIHZlcmlmeShwb3N0U2VydmljZSwgdGltZXMoMSkpLmdldEJ5SWQocG9zdElkKTsKKyAgICAgICAgdmVyaWZ5KGNvbW1lbnRTZXJ2aWNlLCB0aW1lcygxKSkubGlzdChhbnkoV3JhcHBlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCBsaXN0UG9zdHNfU2hvdWxkUmV0dXJuUGFnaW5hdGVkUG9zdHMoKSB7CisgICAgICAgIGludCBwYWdlID0gMSwgc2l6ZSA9IDU7CisgICAgICAgIFJlcXVlc3RQb3N0IHAxID0gbmV3IFJlcXVlc3RQb3N0KCk7IHAxLnNldElkKDEpOyBwMS5zZXRBdXRob3JJZCgidTEiKTsKKyAgICAgICAgUmVxdWVzdFBvc3QgcDIgPSBuZXcgUmVxdWVzdFBvc3QoKTsgcDIuc2V0SWQoMik7IHAyLnNldEF1dGhvcklkKCJ1MiIpOworICAgICAgICBMaXN0PFJlcXVlc3RQb3N0PiBwb3N0cyA9IEFycmF5cy5hc0xpc3QocDEsIHAyKTsKKworICAgICAgICBQYWdlPFJlcXVlc3RQb3N0PiBwYWdlUmVzdWx0ID0gbmV3IFBhZ2U8PihwYWdlLCBzaXplKTsKKyAgICAgICAgcGFnZVJlc3VsdC5zZXRSZWNvcmRzKHBvc3RzKS5zZXRUb3RhbChwb3N0cy5zaXplKCkpOworCisgICAgICAgIHdoZW4ocG9zdFNlcnZpY2UucGFnZShhbnkoUGFnZS5jbGFzcyksIGFueSgpKSkudGhlblJldHVybihwYWdlUmVzdWx0KTsKKworICAgICAgICBSZXN1bHQgcmVzdWx0ID0gcG9zdENvbnRyb2xsZXIubGlzdFBvc3RzKHBhZ2UsIHNpemUpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocG9zdHMsIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJyZWNvcmRzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpIHBvc3RzLnNpemUoKSwgcmVzdWx0LmdldERhdGEoKS5nZXQoInRvdGFsIikpOworCisgICAgICAgIHZlcmlmeShwb3N0U2VydmljZSwgdGltZXMoMSkpLnBhZ2UoYW55KFBhZ2UuY2xhc3MpLCBhbnkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGdldFBvc3RfU2hvdWxkUmV0dXJuRXJyb3JfV2hlblBvc3ROb3RFeGlzdHMoKSB7CisgICAgICAgIGludCBwb3N0SWQgPSAxOworICAgICAgICB3aGVuKHBvc3RTZXJ2aWNlLmdldEJ5SWQocG9zdElkKSkudGhlblJldHVybihudWxsKTsKKworICAgICAgICBSZXN1bHQgcmVzdWx0ID0gcG9zdENvbnRyb2xsZXIuZ2V0UG9zdChwb3N0SWQpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIuW4luWtkOS4jeWtmOWcqCIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIHZlcmlmeShwb3N0U2VydmljZSwgdGltZXMoMSkpLmdldEJ5SWQocG9zdElkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgbGlrZVBvc3RfU2hvdWxkUmV0dXJuU3VjY2VzcygpIHsKKyAgICAgICAgaW50IHBvc3RJZCA9IDE7CisgICAgICAgIFN0cmluZyBsaWtlcklkID0gImFsaWNlMTIzIjsKKyAgICAgICAgLy8g5a+55bqUIFNlcnZpY2VJbXBsIOS4reeahCBsaWtlUG9zdChwb3N0SWQsIGxpa2VySWQpCisgICAgICAgIGRvTm90aGluZygpLndoZW4ocG9zdFNlcnZpY2UpLmxpa2VQb3N0KHBvc3RJZCwgbGlrZXJJZCk7CisKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHBvc3RDb250cm9sbGVyLmxpa2VQb3N0KHBvc3RJZCwgbGlrZXJJZCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi54K56LWe5oiQ5YqfIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHZlcmlmeShwb3N0U2VydmljZSwgdGltZXMoMSkpLmxpa2VQb3N0KHBvc3RJZCwgbGlrZXJJZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGRlbGV0ZVBvc3RfU2hvdWxkUmV0dXJuU3VjY2Vzc19XaGVuQXV0aG9yTWF0Y2hlcygpIHsKKyAgICAgICAgaW50IHBvc3RJZCA9IDQyOworICAgICAgICBSZXF1ZXN0UG9zdCBtb2NrUG9zdCA9IG5ldyBSZXF1ZXN0UG9zdCgpOworICAgICAgICBtb2NrUG9zdC5zZXRBdXRob3JJZChhdXRob3JJZCk7CisgICAgICAgIC8vIHJlbW92ZSDov5Tlm54gYm9vbGVhbu+8jOiAjOmdniB2b2lkCisgICAgICAgIHdoZW4ocG9zdFNlcnZpY2UuZ2V0QnlJZChwb3N0SWQpKS50aGVuUmV0dXJuKG1vY2tQb3N0KTsKKyAgICAgICAgd2hlbihjb21tZW50U2VydmljZS5yZW1vdmUoYW55KFdyYXBwZXIuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihwb3N0U2VydmljZS5yZW1vdmVCeUlkKHBvc3RJZCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHBvc3RDb250cm9sbGVyLmRlbGV0ZVBvc3QocG9zdElkLCBhdXRob3JJZCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIHZlcmlmeShjb21tZW50U2VydmljZSwgdGltZXMoMSkpLnJlbW92ZShhbnkoV3JhcHBlci5jbGFzcykpOworICAgICAgICB2ZXJpZnkocG9zdFNlcnZpY2UsIHRpbWVzKDEpKS5yZW1vdmVCeUlkKHBvc3RJZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGFkZENvbW1lbnRXaXRob3V0SW1hZ2VfU2hvdWxkUmV0dXJuU3VjY2VzcygpIHsKKyAgICAgICAgaW50IHBvc3RJZCAgICA9IDc7CisgICAgICAgIFN0cmluZyBhdXRob3IgPSAidXNlcjIiOworICAgICAgICBTdHJpbmcgY29udGVudD0gIkhlbGxvIjsKKworICAgICAgICAvLyDmnoTpgKDigJzkv53lrZjlkI7igJ3ov5Tlm57nu5nliY3nq6/nmoQgUmVxdWVzdENvbW1lbnQg5a+56LGhCisgICAgICAgIFJlcXVlc3RDb21tZW50IHNhdmVkID0gbmV3IFJlcXVlc3RDb21tZW50KCk7CisgICAgICAgIHNhdmVkLnNldElkKDk5KTsKKyAgICAgICAgc2F2ZWQuc2V0UG9zdElkKHBvc3RJZCk7CisgICAgICAgIHNhdmVkLnNldEF1dGhvcklkKGF1dGhvcik7CisgICAgICAgIHNhdmVkLnNldENvbnRlbnQoY29udGVudCk7CisgICAgICAgIHNhdmVkLnNldEltYWdlVXJsKG51bGwpOworCisgICAgICAgIC8vIDEpIOW9kyBjb21tZW50U2VydmljZS5jb21tZW50T25SZXF1ZXN0UG9zdCguLi4pIOiiq+iwg+eUqOaXtu+8jAorICAgICAgICAvLyAgICDmiJHku6zlnKggZG9BbnN3ZXIg5Lit57uZ5a6D5Lyg5YWl55qEIEhlbHBDb21tZW50IOWvueixoeiuvue9riBJRCA9IDk5CisgICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4geworICAgICAgICAgICAgUmVxdWVzdENvbW1lbnQgYXJnID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudCgwKTsKKyAgICAgICAgICAgIGFyZy5zZXRJZChzYXZlZC5nZXRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBjb21tZW50T25SZXF1ZXN0UG9zdCDov5Tlm54gdm9pZAorICAgICAgICB9KS53aGVuKGNvbW1lbnRTZXJ2aWNlKS5jb21tZW50T25SZXF1ZXN0UG9zdChhbnkoUmVxdWVzdENvbW1lbnQuY2xhc3MpKTsKKworICAgICAgICAvLyAyKSDlkI7pnaIgY29tbWVudFNlcnZpY2UuZ2V0QnlJZCg5OSkg6L+U5Zue5oiR5Lus5LiK6Z2i5p6E6YCg55qEIHNhdmVkCisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UuZ2V0QnlJZChzYXZlZC5nZXRJZCgpKSkudGhlblJldHVybihzYXZlZCk7CisKKyAgICAgICAgLy8g5qih5ouf77yaY29tbWVudE9uSGVscFBvc3QoKSDlhoXpg6jkvJrosIPnlKggcG9zdFNlcnZpY2UuaW5jcmVtZW50UmVwbHlDb3VudChwb3N0SWQpCisgICAgICAgIC8vIOS9huaOp+WItuWZqOacrOi6q+W5tuS4jeebtOaOpeiwg+eUqCBpbmNyZW1lbnRSZXBseUNvdW5077yM5omA5Lul5rWL6K+V6YeM5LiN5YaNIHZlcmlmeSDov5nkuIDooYzjgIIKKyAgICAgICAgLy8g5Y+q6KaB5L+d6K+BIHBvc3RTZXJ2aWNlLmdldEJ5SWQocG9zdElkKSDog73ov5Tlm57kuIDkuKrluKbmnIkgcmVwbHlDb3VudCDnmoQgUmVxdWVzdFBvc3Qg5Y2z5Y+v77yaCisgICAgICAgIFJlcXVlc3RQb3N0IHN0dWJQb3N0ID0gbmV3IFJlcXVlc3RQb3N0KCk7CisgICAgICAgIHN0dWJQb3N0LnNldFJlcGx5Q291bnQoNSk7CisgICAgICAgIHdoZW4ocG9zdFNlcnZpY2UuZ2V0QnlJZChwb3N0SWQpKS50aGVuUmV0dXJuKHN0dWJQb3N0KTsKKworICAgICAgICAvLyDosIPnlKjmjqfliLblmajnmoQgY29tbWVudE9uUG9zdCguLi4pIOaWueazle+8jOesrOWbm+S4quWPguaVsOS8oCBudWxs77yI5LiN5bim5Zu+54mH77yJCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBwb3N0Q29udHJvbGxlci5jb21tZW50T25Qb3N0KHBvc3RJZCwgYXV0aG9yLCBjb250ZW50LCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNhdmVkLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgiY29tbWVudCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsICAgICByZXN1bHQuZ2V0RGF0YSgpLmdldCgibmV3UmVwbHlDb3VudCIpKTsKKworICAgICAgICAvLyDnoa7kv50gY29tbWVudFNlcnZpY2UuY29tbWVudE9uSGVscFBvc3QoLi4uKSDooqvosIPnlKjkuIDmrKEKKyAgICAgICAgdmVyaWZ5KGNvbW1lbnRTZXJ2aWNlLCB0aW1lcygxKSkuY29tbWVudE9uUmVxdWVzdFBvc3QoYW55KFJlcXVlc3RDb21tZW50LmNsYXNzKSk7CisgICAgICAgIC8vIHBvc3RTZXJ2aWNlLmluY3JlbWVudFJlcGx5Q291bnQoLi4uKSDnlLEgY29tbWVudE9uUmVxdWVzdFBvc3Qg5YaF6YOo6LCD55So77yM5Zug5q2k5rWL6K+V6YeM5peg6ZyAIHZlcmlmeQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICB2b2lkIGFkZENvbW1lbnRXaXRoSW1hZ2VfU2hvdWxkUmV0dXJuU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgcG9zdElkICAgID0gODsKKyAgICAgICAgU3RyaW5nIGF1dGhvciA9ICJ1c2VyMyI7CisgICAgICAgIFN0cmluZyBjb250ZW50PSAiV2l0aCBJbWFnZSI7CisKKyAgICAgICAgLy8g5YeG5aSH5LiA5LiqIOKAnOaooeaLn+S4iuS8oOaWh+S7tuKAnQorICAgICAgICBNb2NrTXVsdGlwYXJ0RmlsZSBtb2NrRmlsZSA9IG5ldyBNb2NrTXVsdGlwYXJ0RmlsZSgKKyAgICAgICAgICAgICAgICAiaW1hZ2UiLCAidGVzdC5qcGciLCAiaW1hZ2UvanBlZyIsIG5ldyBieXRlW117MSwyLDN9CisgICAgICAgICk7CisKKyAgICAgICAgLy8g5p6E6YCg4oCc5L+d5a2Y5ZCO4oCd6L+U5Zue57uZ5YmN56uv55qEIFJlcXVlc3RDb21tZW50IOWvueixoQorICAgICAgICBSZXF1ZXN0Q29tbWVudCBzYXZlZCA9IG5ldyBSZXF1ZXN0Q29tbWVudCgpOworICAgICAgICBzYXZlZC5zZXRJZCgxMDApOworICAgICAgICBzYXZlZC5zZXRQb3N0SWQocG9zdElkKTsKKyAgICAgICAgc2F2ZWQuc2V0QXV0aG9ySWQoYXV0aG9yKTsKKyAgICAgICAgc2F2ZWQuc2V0Q29udGVudChjb250ZW50KTsKKyAgICAgICAgc2F2ZWQuc2V0SW1hZ2VVcmwoIi91cGxvYWRzL3doYXRldmVyLmpwZyIpOworCisgICAgICAgIC8vIOW9kyBjb21tZW50U2VydmljZS5jb21tZW50T25SZXF1ZXN0UG9zdCguLi4pIOiiq+iwg+eUqOaXtu+8jOe7meS8oOWFpeeahOWvueixoeiuvue9riBJRCDkuI4gaW1hZ2VVcmwKKyAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICBSZXF1ZXN0Q29tbWVudCBhcmcgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50KDApOworICAgICAgICAgICAgYXJnLnNldElkKHNhdmVkLmdldElkKCkpOworICAgICAgICAgICAgYXJnLnNldEltYWdlVXJsKHNhdmVkLmdldEltYWdlVXJsKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGNvbW1lbnRPblJlcXVlc3RQb3N0IOi/lOWbniB2b2lkCisgICAgICAgIH0pLndoZW4oY29tbWVudFNlcnZpY2UpLmNvbW1lbnRPblJlcXVlc3RQb3N0KGFueShSZXF1ZXN0Q29tbWVudC5jbGFzcykpOworCisgICAgICAgIC8vIOWQjumdoiBjb21tZW50U2VydmljZS5nZXRCeUlkKDEwMCkg6L+U5Zue5oiR5Lus5p6E6YCg55qEIHNhdmVkCisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UuZ2V0QnlJZChzYXZlZC5nZXRJZCgpKSkudGhlblJldHVybihzYXZlZCk7CisKKyAgICAgICAgLy8g5ZCM5qC377yMcG9zdFNlcnZpY2UuZ2V0QnlJZChwb3N0SWQpIOi/lOWbnuS4gOS4quW4piByZXBseUNvdW50PTEwIOeahCBIZWxwUG9zdAorICAgICAgICBSZXF1ZXN0UG9zdCBzdHViUG9zdCA9IG5ldyBSZXF1ZXN0UG9zdCgpOworICAgICAgICBzdHViUG9zdC5zZXRSZXBseUNvdW50KDEwKTsKKyAgICAgICAgd2hlbihwb3N0U2VydmljZS5nZXRCeUlkKHBvc3RJZCkpLnRoZW5SZXR1cm4oc3R1YlBvc3QpOworCisgICAgICAgIC8vIOiwg+eUqCBjb21tZW50T25Qb3N077yM56ys5Zub5Liq5Y+C5pWw5LygIG1vY2tGaWxl77yI5qih5ouf5pyJ5Zu+54mH5LiK5Lyg77yJCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBwb3N0Q29udHJvbGxlci5jb21tZW50T25Qb3N0KHBvc3RJZCwgYXV0aG9yLCBjb250ZW50LCBtb2NrRmlsZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzYXZlZCwgcmVzdWx0LmdldERhdGEoKS5nZXQoImNvbW1lbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgICAgcmVzdWx0LmdldERhdGEoKS5nZXQoIm5ld1JlcGx5Q291bnQiKSk7CisKKyAgICAgICAgLy8g6aqM6K+B55yf5q2j5Lyg57uZIGNvbW1lbnRTZXJ2aWNlLmNvbW1lbnRPblJlcXVlc3RQb3N0KC4uLikg55qEIEhlbHBDb21tZW50IOWvueixoeS4re+8jAorICAgICAgICAvLyBpbWFnZVVybCDlt7Lnu4/ooqvorr7nva7miJAgIi91cGxvYWRzL3doYXRldmVyLmpwZyIKKyAgICAgICAgQXJndW1lbnRDYXB0b3I8UmVxdWVzdENvbW1lbnQ+IGNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFJlcXVlc3RDb21tZW50LmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KGNvbW1lbnRTZXJ2aWNlKS5jb21tZW50T25SZXF1ZXN0UG9zdChjYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgUmVxdWVzdENvbW1lbnQgdG9TYXZlID0gY2FwdG9yLmdldFZhbHVlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzYXZlZC5nZXRJbWFnZVVybCgpLCB0b1NhdmUuZ2V0SW1hZ2VVcmwoKSk7CisKKyAgICAgICAgLy8g5ZCM5qC35peg6ZyAIHZlcmlmeSBwb3N0U2VydmljZS5pbmNyZW1lbnRSZXBseUNvdW50KC4uLinvvIzlm6DkuLror6XosIPnlKjlnKggY29tbWVudE9uSGVscFBvc3Qg5YaF6YOo5a6M5oiQCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9ycmVudHMvMTc0ODUzOTE5ODY2OV8zMmU5OTVkYjJhYjgzM2FlNmExMmEzYjFkNTIxZTViLmpwZy50b3JyZW50IGIvdG9ycmVudHMvMTc0ODUzOTE5ODY2OV8zMmU5OTVkYjJhYjgzM2FlNmExMmEzYjFkNTIxZTViLmpwZy50b3JyZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTdkY2MKLS0tIC9kZXYvbnVsbAorKysgYi90b3JyZW50cy8xNzQ4NTM5MTk4NjY5XzMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnLnRvcnJlbnQKQEAgLTAsMCArMSBAQAorZDg6YW5ub3VuY2UzMDpodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UxMDpjcmVhdGVkIGJ5MjE6cUJpdHRvcnJlbnQgdjQuNS4zLjEwMTM6Y3JlYXRpb24gZGF0ZWkxNzQ4NTIwMjQ2ZTQ6aW5mb2Q2Omxlbmd0aGk1MzQ1OGU0Om5hbWUzNTozMmU5OTVkYjJhYjgzM2FlNmExMmEzYjFkNTIxZTViLmpwZzEyOnBpZWNlIGxlbmd0aGkxNjM4NGU2OnBpZWNlczgwOjY8Tdk+v4A/75n/IXZgmfdGmYCXpHpqhCbik/6NU7kTkrJq+WuTNTDVt8FJ85kEtkm7rhgE/qbEYs8kOuJtqyW7riP0fuUnNQxcfjSoVS4qZWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b3JyZW50cy8xNzQ4NTM5MzMxMDI3XzMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnLnRvcnJlbnQgYi90b3JyZW50cy8xNzQ4NTM5MzMxMDI3XzMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnLnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1N2RjYwotLS0gL2Rldi9udWxsCisrKyBiL3RvcnJlbnRzLzE3NDg1MzkzMzEwMjdfMzJlOTk1ZGIyYWI4MzNhZTZhMTJhM2IxZDUyMWU1Yi5qcGcudG9ycmVudApAQCAtMCwwICsxIEBACitkODphbm5vdW5jZTMwOmh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZTEwOmNyZWF0ZWQgYnkyMTpxQml0dG9ycmVudCB2NC41LjMuMTAxMzpjcmVhdGlvbiBkYXRlaTE3NDg1MjAyNDZlNDppbmZvZDY6bGVuZ3RoaTUzNDU4ZTQ6bmFtZTM1OjMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnMTI6cGllY2UgbGVuZ3RoaTE2Mzg0ZTY6cGllY2VzODA6NjxN2T6/gD/vmf8hdmCZ90aZgJekemqEJuKT/o1TuROSsmr5a5M1MNW3wUnzmQS2SbuuGAT+psRizyQ64m2rJbuuI/R+5Sc1DFx+NKhVLiplZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RvcnJlbnRzLzE3NDg1ODE2MTI2MTRfMzJlOTk1ZGIyYWI4MzNhZTZhMTJhM2IxZDUyMWU1Yi5qcGcudG9ycmVudCBiL3RvcnJlbnRzLzE3NDg1ODE2MTI2MTRfMzJlOTk1ZGIyYWI4MzNhZTZhMTJhM2IxZDUyMWU1Yi5qcGcudG9ycmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU3ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvdG9ycmVudHMvMTc0ODU4MTYxMjYxNF8zMmU5OTVkYjJhYjgzM2FlNmExMmEzYjFkNTIxZTViLmpwZy50b3JyZW50CkBAIC0wLDAgKzEgQEAKK2Q4OmFubm91bmNlMzA6aHR0cDovL2xvY2FsaG9zdDo2OTY5L2Fubm91bmNlMTA6Y3JlYXRlZCBieTIxOnFCaXR0b3JyZW50IHY0LjUuMy4xMDEzOmNyZWF0aW9uIGRhdGVpMTc0ODUyMDI0NmU0OmluZm9kNjpsZW5ndGhpNTM0NThlNDpuYW1lMzU6MzJlOTk1ZGIyYWI4MzNhZTZhMTJhM2IxZDUyMWU1Yi5qcGcxMjpwaWVjZSBsZW5ndGhpMTYzODRlNjpwaWVjZXM4MDo2PE3ZPr+AP++Z/yF2YJn3RpmAl6R6aoQm4pP+jVO5E5KyavlrkzUw1bfBSfOZBLZJu64YBP6mxGLPJDribaslu64j9H7lJzUMXH40qFUuKmVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9ycmVudHMvMzJlOTk1ZGIyYWI4MzNhZTZhMTJhM2IxZDUyMWU1Yi5qcGcudG9ycmVudCBiL3RvcnJlbnRzLzMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnLnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1N2RjYwotLS0gL2Rldi9udWxsCisrKyBiL3RvcnJlbnRzLzMyZTk5NWRiMmFiODMzYWU2YTEyYTNiMWQ1MjFlNWIuanBnLnRvcnJlbnQKQEAgLTAsMCArMSBAQAorZDg6YW5ub3VuY2UzMDpodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UxMDpjcmVhdGVkIGJ5MjE6cUJpdHRvcnJlbnQgdjQuNS4zLjEwMTM6Y3JlYXRpb24gZGF0ZWkxNzQ4NTIwMjQ2ZTQ6aW5mb2Q2Omxlbmd0aGk1MzQ1OGU0Om5hbWUzNTozMmU5OTVkYjJhYjgzM2FlNmExMmEzYjFkNTIxZTViLmpwZzEyOnBpZWNlIGxlbmd0aGkxNjM4NGU2OnBpZWNlczgwOjY8Tdk+v4A/75n/IXZgmfdGmYCXpHpqhCbik/6NU7kTkrJq+WuTNTDVt8FJ85kEtkm7rhgE/qbEYs8kOuJtqyW7riP0fuUnNQxcfjSoVS4qZWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cmFja2VyLmpzb24gYi90cmFja2VyLmpzb24KaW5kZXggNTQ3NWQyNC4uYjYzMmJlNyAxMDA2NDQKLS0tIGEvdHJhY2tlci5qc29uCisrKyBiL3RyYWNrZXIuanNvbgpAQCAtMSArMSBAQAoteyJhbm5vdW5jZVVybCI6Imh0dHA6Ly8xMC42MC4xMi45NDo2OTY5L2Fubm91bmNlIiwiYW5ub3VuY2VVUkkiOiJodHRwOi8vMTAuNjAuMTIuOTQ6Njk2OS9hbm5vdW5jZSIsInRyYWNrZWRUb3JyZW50cyI6W3siYW5ub3VuY2VJbnRlcnZhbCI6MTAsInBlZXJzIjp7IlBlZXJVSUR7YWRkcmVzcz0vMTAuNjAuMTIuOTQ6Njg4MSwgdG9ycmVudCBoYXNoPSdFNUZENTAxQTVFNkYwN0ZBMDI3Nzc4MDlDODNFQjJCODE1QTJDM0VBJ30iOnsiYWRkcmVzcyI6IjEwLjYwLjEyLjk0OjY4ODEiLCJwZWVySWQiOiJNemczWkdNeFlUZ3RNelU0WXkwMFpETXlMV0ZoT1RjdE56UTJNemRoTW1NeVpEZzEiLCJoZXhQZWVySWQiOiIzMzM4Mzc2NDYzMzE2MTM4MkQzMzM1Mzg2MzJEMzQ2NDMzMzIyRDYxNjEzOTM3MkQzNzM0MzYzMzM3NjEzMjYzMzI2NDM4MzUiLCJoZXhJbmZvSGFzaCI6bnVsbCwidXBsb2FkZWQiOjAsImRvd25sb2FkZWQiOjAsImxlZnQiOjMwNjM5NjMsImNvbXBsZXRlZCI6dHJ1ZSwicG9ydCI6Njg4MSwic2hvcnRIZXhQZWVySWQiOiIuLjY0MzgzNSIsInN0cmluZ1BlZXJJZCI6IjM4N2RjMWE4LTM1OGMtNGQzMi1hYTk3LTc0NjM3YTJjMmQ4NSIsImhvc3RJZGVudGlmaWVyIjoiLzEwLjYwLjEyLjk0OjY4ODEiLCJpcCI6IjEwLjYwLjEyLjk0IiwicGVlcklkQXJyYXkiOiJNemczWkdNeFlUZ3RNelU0WXkwMFpETXlMV0ZoT1RjdE56UTJNemRoTW1NeVpEZzEiLCJyYXdJcCI6IkNqd01YZz09In0sIlBlZXJVSUR7YWRkcmVzcz0vMTAuNjAuMTIuOTQ6Njg4MywgdG9ycmVudCBoYXNoPSdFNUZENTAxQTVFNkYwN0ZBMDI3Nzc4MDlDODNFQjJCODE1QTJDM0VBJ30iOnsiYWRkcmVzcyI6IjEwLjYwLjEyLjk0OjY4ODMiLCJwZWVySWQiOiJMVlJQTURBME1pMHdZakk1TURRd1pERTNNV1E9IiwiaGV4UGVlcklkIjoiMkQ1NDRGMzAzMDM0MzIyRDMwNjIzMjM5MzAzNDMwNjQzMTM3MzE2NCIsImhleEluZm9IYXNoIjpudWxsLCJ1cGxvYWRlZCI6MCwiZG93bmxvYWRlZCI6MCwibGVmdCI6MzA2Mzk2MywiY29tcGxldGVkIjpmYWxzZSwicG9ydCI6Njg4Mywic2hvcnRIZXhQZWVySWQiOiIuLjM3MzE2NCIsInN0cmluZ1BlZXJJZCI6Ii1UTzAwNDItMGIyOTA0MGQxNzFkIiwiaG9zdElkZW50aWZpZXIiOiIvMTAuNjAuMTIuOTQ6Njg4MyIsImlwIjoiMTAuNjAuMTIuOTQiLCJwZWVySWRBcnJheSI6IkxWUlBNREEwTWkwd1lqSTVNRFF3WkRFM01XUT0iLCJyYXdJcCI6IkNqd01YZz09In0sIlBlZXJVSUR7YWRkcmVzcz0vMTAuNjAuMTIuOTQ6Njg4MiwgdG9ycmVudCBoYXNoPSdFNUZENTAxQTVFNkYwN0ZBMDI3Nzc4MDlDODNFQjJCODE1QTJDM0VBJ30iOnsiYWRkcmVzcyI6IjEwLjYwLjEyLjk0OjY4ODIiLCJwZWVySWQiOiJMVlJQTURBME1pMHhOV0kzTjJFd1pXVmlaV1k9IiwiaGV4UGVlcklkIjoiMkQ1NDRGMzAzMDM0MzIyRDMxMzU2MjM3Mzc2MTMwNjU2NTYyNjU2NiIsImhleEluZm9IYXNoIjpudWxsLCJ1cGxvYWRlZCI6MCwiZG93bmxvYWRlZCI6MCwibGVmdCI6MzA2Mzk2MywiY29tcGxldGVkIjpmYWxzZSwicG9ydCI6Njg4Miwic2hvcnRIZXhQZWVySWQiOiIuLjYyNjU2NiIsInN0cmluZ1BlZXJJZCI6Ii1UTzAwNDItMTViNzdhMGVlYmVmIiwiaG9zdElkZW50aWZpZXIiOiIvMTAuNjAuMTIuOTQ6Njg4MiIsImlwIjoiMTAuNjAuMTIuOTQiLCJwZWVySWRBcnJheSI6IkxWUlBNREEwTWkweE5XSTNOMkV3WldWaVpXWT0iLCJyYXdJcCI6IkNqd01YZz09In19LCJoZXhJbmZvSGFzaCI6IkU1RkQ1MDFBNUU2RjA3RkEwMjc3NzgwOUM4M0VCMkI4MTVBMkMzRUEiLCJpbmZvSGFzaCI6IjVmMVFHbDV2Qi9vQ2QzZ0p5RDZ5dUJXaXcrbz0ifSx7ImFubm91bmNlSW50ZXJ2YWwiOjEwLCJwZWVycyI6eyJQZWVyVUlEe2FkZHJlc3M9LzEwLjYwLjEyLjk0OjY4ODIsIHRvcnJlbnQgaGFzaD0nMzREOTRGMTg0QzBEQzQ1MzcyRjUyREQwRkJBRUI3OUFGNEJENzU4RSd9Ijp7ImFkZHJlc3MiOiIxMC42MC4xMi45NDo2ODgyIiwicGVlcklkIjoiTFZSUE1EQTBNaTB4TldJM04yRXdaV1ZpWldZPSIsImhleFBlZXJJZCI6IjJENTQ0RjMwMzAzNDMyMkQzMTM1NjIzNzM3NjEzMDY1NjU2MjY1NjYiLCJoZXhJbmZvSGFzaCI6bnVsbCwidXBsb2FkZWQiOjAsImRvd25sb2FkZWQiOjAsImxlZnQiOjE2MDk1Njg5NzUsImNvbXBsZXRlZCI6ZmFsc2UsInBvcnQiOjY4ODIsInNob3J0SGV4UGVlcklkIjoiLi42MjY1NjYiLCJzdHJpbmdQZWVySWQiOiItVE8wMDQyLTE1Yjc3YTBlZWJlZiIsImhvc3RJZGVudGlmaWVyIjoiLzEwLjYwLjEyLjk0OjY4ODIiLCJpcCI6IjEwLjYwLjEyLjk0IiwicGVlcklkQXJyYXkiOiJMVlJQTURBME1pMHhOV0kzTjJFd1pXVmlaV1k9IiwicmF3SXAiOiJDandNWGc9PSJ9LCJQZWVyVUlEe2FkZHJlc3M9LzEwLjYwLjEyLjk0OjY4ODEsIHRvcnJlbnQgaGFzaD0nMzREOTRGMTg0QzBEQzQ1MzcyRjUyREQwRkJBRUI3OUFGNEJENzU4RSd9Ijp7ImFkZHJlc3MiOiIxMC42MC4xMi45NDo2ODgxIiwicGVlcklkIjoiWW1JMFl6SmtZVGd0TVdSaU15MDBPRFJpTFRnMFpEZ3ROamhrTWpBd016VmlOemhrIiwiaGV4UGVlcklkIjoiNjI2MjM0NjMzMjY0NjEzODJEMzE2NDYyMzMyRDM0MzgzNDYyMkQzODM0NjQzODJEMzYzODY0MzIzMDMwMzMzNTYyMzczODY0IiwiaGV4SW5mb0hhc2giOm51bGwsInVwbG9hZGVkIjowLCJkb3dubG9hZGVkIjowLCJsZWZ0IjoxNjA5NTY4OTc1LCJjb21wbGV0ZWQiOmZhbHNlLCJwb3J0Ijo2ODgxLCJzaG9ydEhleFBlZXJJZCI6Ii4uMzczODY0Iiwic3RyaW5nUGVlcklkIjoiYmI0YzJkYTgtMWRiMy00ODRiLTg0ZDgtNjhkMjAwMzViNzhkIiwiaG9zdElkZW50aWZpZXIiOiIvMTAuNjAuMTIuOTQ6Njg4MSIsImlwIjoiMTAuNjAuMTIuOTQiLCJwZWVySWRBcnJheSI6IlltSTBZekprWVRndE1XUmlNeTAwT0RSaUxUZzBaRGd0Tmpoa01qQXdNelZpTnpoayIsInJhd0lwIjoiQ2p3TVhnPT0ifX0sImhleEluZm9IYXNoIjoiMzREOTRGMTg0QzBEQzQ1MzcyRjUyREQwRkJBRUI3OUFGNEJENzU4RSIsImluZm9IYXNoIjoiTk5sUEdFd054Rk55OVMzUSs2NjNtdlM5ZFk0PSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit7InRyYWNrZWRUb3JyZW50cyI6W3siYW5ub3VuY2VJbnRlcnZhbCI6MTAsInBlZXJzIjp7IlBlZXJVSUR7YWRkcmVzcz0vMTAuNjEuNTEuMjM4OjY4ODEsIHRvcnJlbnQgaGFzaD0nNTM0NzVBNjE2NDVBQTVCMTE0MTgwNzM2N0Q3QUEyNTgwMTZFMTIxNSd9Ijp7ImFkZHJlc3MiOiIxMC42MS41MS4yMzg6Njg4MSIsInBlZXJJZCI6Ik5qRTVaRGs1TlRFdE4yRXhPUzAwTURSbExXSXpPVGt0WXpRNVlXVTRZVEpoTlRKaiIsImhleFBlZXJJZCI6IjM2MzEzOTY0MzkzOTM1MzEyRDM3NjEzMTM5MkQzNDMwMzQ2NTJENjIzMzM5MzkyRDYzMzQzOTYxNjUzODYxMzI2MTM1MzI2MyIsImhleEluZm9IYXNoIjpudWxsLCJ1cGxvYWRlZCI6MCwiZG93bmxvYWRlZCI6MCwibGVmdCI6NTM0NTgsImNvbXBsZXRlZCI6dHJ1ZSwicG9ydCI6Njg4MSwiaXAiOiIxMC42MS41MS4yMzgiLCJyYXdJcCI6IkNqMHo3Zz09IiwicGVlcklkQXJyYXkiOiJOakU1WkRrNU5URXROMkV4T1MwME1EUmxMV0l6T1RrdFl6UTVZV1U0WVRKaE5USmoiLCJob3N0SWRlbnRpZmllciI6Ii8xMC42MS41MS4yMzg6Njg4MSIsInN0cmluZ1BlZXJJZCI6IjYxOWQ5OTUxLTdhMTktNDA0ZS1iMzk5LWM0OWFlOGEyYTUyYyIsInNob3J0SGV4UGVlcklkIjoiLi4zNTMyNjMifSwiUGVlclVJRHthZGRyZXNzPS8xMjcuMC4wLjE6NjIxMjgsIHRvcnJlbnQgaGFzaD0nNTM0NzVBNjE2NDVBQTVCMTE0MTgwNzM2N0Q3QUEyNTgwMTZFMTIxNSd9Ijp7ImFkZHJlc3MiOiIxMjcuMC4wLjE6NjIxMjgiLCJwZWVySWQiOiJMWEZDTkRVelFTMVdURWRMT0RJNFMxbExSVWM9IiwiaGV4UGVlcklkIjoiMkQ3MTQyMzQzNTMzNDEyRDU2NEM0NzRCMzgzMjM4NEI1OTRCNDU0NyIsImhleEluZm9IYXNoIjpudWxsLCJ1cGxvYWRlZCI6MzIwNzQ4LCJkb3dubG9hZGVkIjowLCJsZWZ0IjowLCJjb21wbGV0ZWQiOnRydWUsInBvcnQiOjYyMTI4LCJpcCI6IjEyNy4wLjAuMSIsInJhd0lwIjoiZndBQUFRPT0iLCJwZWVySWRBcnJheSI6IkxYRkNORFV6UVMxV1RFZExPREk0UzFsTFJVYz0iLCJob3N0SWRlbnRpZmllciI6Ii8xMjcuMC4wLjE6NjIxMjgiLCJzdHJpbmdQZWVySWQiOiItcUI0NTNBLVZMR0s4MjhLWUtFRyIsInNob3J0SGV4UGVlcklkIjoiLi40QjQ1NDcifSwiUGVlclVJRHthZGRyZXNzPS9bMDowOjA6MDowOjA6MDoxXTo2MjEyOCwgdG9ycmVudCBoYXNoPSc1MzQ3NUE2MTY0NUFBNUIxMTQxODA3MzY3RDdBQTI1ODAxNkUxMjE1J30iOnsiYWRkcmVzcyI6IlswOjA6MDowOjA6MDowOjFdOjYyMTI4IiwicGVlcklkIjoiTFhGQ05EVXpRUzFXVEVkTE9ESTRTMWxMUlVjPSIsImhleFBlZXJJZCI6IjJENzE0MjM0MzUzMzQxMkQ1NjRDNDc0QjM4MzIzODRCNTk0QjQ1NDciLCJoZXhJbmZvSGFzaCI6bnVsbCwidXBsb2FkZWQiOjMyMDc0OCwiZG93bmxvYWRlZCI6MCwibGVmdCI6MCwiY29tcGxldGVkIjp0cnVlLCJwb3J0Ijo2MjEyOCwiaXAiOiIwOjA6MDowOjA6MDowOjEiLCJyYXdJcCI6IkFBQUFBQUFBQUFBQUFBQUFBQUFBQVE9PSIsInBlZXJJZEFycmF5IjoiTFhGQ05EVXpRUzFXVEVkTE9ESTRTMWxMUlVjPSIsImhvc3RJZGVudGlmaWVyIjoiLzA6MDowOjA6MDowOjA6MTo2MjEyOCIsInN0cmluZ1BlZXJJZCI6Ii1xQjQ1M0EtVkxHSzgyOEtZS0VHIiwic2hvcnRIZXhQZWVySWQiOiIuLjRCNDU0NyJ9fSwiaGV4SW5mb0hhc2giOiI1MzQ3NUE2MTY0NUFBNUIxMTQxODA3MzY3RDdBQTI1ODAxNkUxMjE1IiwiaW5mb0hhc2giOiJVMGRhWVdSYXBiRVVHQWMyZlhxaVdBRnVFaFU9In1dLCJhbm5vdW5jZVVybCI6Imh0dHA6Ly9MQVBUT1AtQzNRN01ISEQ6Njk2OS9hbm5vdW5jZSIsImFubm91bmNlVVJJIjoiaHR0cDovL0xBUFRPUC1DM1E3TUhIRDo2OTY5L2Fubm91bmNlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzLzExMTBhNmRjLWI2YjYtNDQwOC1iMzNmLTk3YWZhY2RlZDk0NS5qcGcgYi91cGxvYWRzLzExMTBhNmRjLWI2YjYtNDQwOC1iMzNmLTk3YWZhY2RlZDk0NS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy8xMTEwYTZkYy1iNmI2LTQ0MDgtYjMzZi05N2FmYWNkZWQ5NDUuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy8xNWIxMWZmOS0yMzQ0LTRkM2YtYjRiYy00OTczNGExZTcxNTYucG5nIGIvdXBsb2Fkcy8xNWIxMWZmOS0yMzQ0LTRkM2YtYjRiYy00OTczNGExZTcxNTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJkNjNlLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvMTViMTFmZjktMjM0NC00ZDNmLWI0YmMtNDk3MzRhMWU3MTU2LnBuZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQECClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy8xZWQ2ZTg2Yi05NTVjLTQ0MjYtYjE3MC03M2JjNzU1OGVjYTUucG5nIGIvdXBsb2Fkcy8xZWQ2ZTg2Yi05NTVjLTQ0MjYtYjE3MC03M2JjNzU1OGVjYTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJkNjNlLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvMWVkNmU4NmItOTU1Yy00NDI2LWIxNzAtNzNiYzc1NThlY2E1LnBuZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQECClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy8zOGVlODFjNS1lZTg0LTQzNzEtOTRiZC01NWZmMTk3ODRlOTcucG5nIGIvdXBsb2Fkcy8zOGVlODFjNS1lZTg0LTQzNzEtOTRiZC01NWZmMTk3ODRlOTcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA4MTgzLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvMzhlZTgxYzUtZWU4NC00MzcxLTk0YmQtNTVmZjE5Nzg0ZTk3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwbG9hZHMvM2ZhYThjOTItNzE1Zi00OWIxLTlmYjQtM2Y4ZmVhMTJjYmQ4LnBuZyBiL3VwbG9hZHMvM2ZhYThjOTItNzE1Zi00OWIxLTlmYjQtM2Y4ZmVhMTJjYmQ4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlM2UzNS4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzNmYWE4YzkyLTcxNWYtNDliMS05ZmI0LTNmOGZlYTEyY2JkOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGxvYWRzLzQ3OTgzNjY0LTk4MGQtNDgzMS05NzlkLTIyZWVlODUzYzIyYi5qcGcgYi91cGxvYWRzLzQ3OTgzNjY0LTk4MGQtNDgzMS05NzlkLTIyZWVlODUzYzIyYi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDdmMzguLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy80Nzk4MzY2NC05ODBkLTQ4MzEtOTc5ZC0yMmVlZTg1M2MyMmIuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdCBpbWFnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwbG9hZHMvNDg3NmQ2MTYtMzQ5NC00YWVkLTg5NmUtMDFlZGY0ZTBmNmE2LmpwZyBiL3VwbG9hZHMvNDg3NmQ2MTYtMzQ5NC00YWVkLTg5NmUtMDFlZGY0ZTBmNmE2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjk3My4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzQ4NzZkNjE2LTM0OTQtNGFlZC04OTZlLTAxZWRmNGUwZjZhNi5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzLzQ5ZDFhMmRiLTU0ODItNGQyMS05YTIyLTAwNzFiZDRjZjVlNS5qcGcgYi91cGxvYWRzLzQ5ZDFhMmRiLTU0ODItNGQyMS05YTIyLTAwNzFiZDRjZjVlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDdmMzguLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy80OWQxYTJkYi01NDgyLTRkMjEtOWEyMi0wMDcxYmQ0Y2Y1ZTUuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdCBpbWFnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwbG9hZHMvNGVkNTZiNzYtYzM2Ny00NWRiLTk4ZTEtZDBmMzY1MDhkOGYxLmpwZyBiL3VwbG9hZHMvNGVkNTZiNzYtYzM2Ny00NWRiLTk4ZTEtZDBmMzY1MDhkOGYxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjk3My4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzRlZDU2Yjc2LWMzNjctNDVkYi05OGUxLWQwZjM2NTA4ZDhmMS5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzLzVlYTcwZDZlLTUwZDUtNDRlYy1iMzVlLWU5ZTcxMDFlZTI0Zi5wbmcgYi91cGxvYWRzLzVlYTcwZDZlLTUwZDUtNDRlYy1iMzVlLWU5ZTcxMDFlZTI0Zi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDRjYWIuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy81ZWE3MGQ2ZS01MGQ1LTQ0ZWMtYjM1ZS1lOWU3MTAxZWUyNGYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy81ZmI1MGExYi1jNGQ3LTQyY2YtODJjNS05MjQzOGQ5NGIxYzEucG5nIGIvdXBsb2Fkcy81ZmI1MGExYi1jNGQ3LTQyY2YtODJjNS05MjQzOGQ5NGIxYzEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJkNjNlLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvNWZiNTBhMWItYzRkNy00MmNmLTgyYzUtOTI0MzhkOTRiMWMxLnBuZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQECClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy82NjVhMDJkYi01YjYwLTQwYWUtOTJkZC1jNDZiMzE2MzczNzIuanBnIGIvdXBsb2Fkcy82NjVhMDJkYi01YjYwLTQwYWUtOTJkZC1jNDZiMzE2MzczNzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3ZjM4Li4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvNjY1YTAyZGItNWI2MC00MGFlLTkyZGQtYzQ2YjMxNjM3MzcyLmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRlc3QgaW1hZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzLzY5OTI1ZmFlLTNjNjItNDYwYy1hNWMxLWVlOTY5NWJjOGFlMi5qcGcgYi91cGxvYWRzLzY5OTI1ZmFlLTNjNjItNDYwYy1hNWMxLWVlOTY5NWJjOGFlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy82OTkyNWZhZS0zYzYyLTQ2MGMtYTVjMS1lZTk2OTViYzhhZTIuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy82OWM3MDZjNy02YWU0LTRlMmMtOWMyMi02ZDBlODg3NGIyMjguanBnIGIvdXBsb2Fkcy82OWM3MDZjNy02YWU0LTRlMmMtOWMyMi02ZDBlODg3NGIyMjguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQyOTczLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvNjljNzA2YzctNmFlNC00ZTJjLTljMjItNmQwZTg4NzRiMjI4LmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQECAwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwbG9hZHMvNzJkYjhlYjYtNDBmOC00NDVjLWE4MzMtNDNlYzZmZWNlYmRkLnBuZyBiL3VwbG9hZHMvNzJkYjhlYjYtNDBmOC00NDVjLWE4MzMtNDNlYzZmZWNlYmRkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiZDYzZS4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzcyZGI4ZWI2LTQwZjgtNDQ1Yy1hODMzLTQzZWM2ZmVjZWJkZC5wbmcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwbG9hZHMvNzcwMzJkYTktYjE5Yi00YmFkLWE1ZjQtOTdiYjY1NmFkNDYyLmpwZyBiL3VwbG9hZHMvNzcwMzJkYTktYjE5Yi00YmFkLWE1ZjQtOTdiYjY1NmFkNDYyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjk3My4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzc3MDMyZGE5LWIxOWItNGJhZC1hNWY0LTk3YmI2NTZhZDQ2Mi5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzLzgxM2VhMGVlLWJkZGYtNDJmYi05M2VhLTNlOTZiZTEwYTYzYS5qcGcgYi91cGxvYWRzLzgxM2VhMGVlLWJkZGYtNDJmYi05M2VhLTNlOTZiZTEwYTYzYS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy84MTNlYTBlZS1iZGRmLTQyZmItOTNlYS0zZTk2YmUxMGE2M2EuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy84MmQzOWZiNC03YTFlLTQ5MWYtOGE2Mi1lMTRmNzk2NjI5ZmUuanBnIGIvdXBsb2Fkcy84MmQzOWZiNC03YTFlLTQ5MWYtOGE2Mi1lMTRmNzk2NjI5ZmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdhNmUyLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvODJkMzlmYjQtN2ExZS00OTFmLThhNjItZTE0Zjc5NjYyOWZlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwbG9hZHMvOGRjZGRjMWMtZWM5My00ZmZiLTg4MWQtMTUzMWEzYjNmM2UwLnBuZyBiL3VwbG9hZHMvOGRjZGRjMWMtZWM5My00ZmZiLTg4MWQtMTUzMWEzYjNmM2UwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiZDYzZS4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzhkY2RkYzFjLWVjOTMtNGZmYi04ODFkLTE1MzFhM2IzZjNlMC5wbmcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwbG9hZHMvOWY5OWFjNzctNDhkMC00NTM1LTlmMmYtNWZlN2M4MDRhNTU5LnBuZyBiL3VwbG9hZHMvOWY5OWFjNzctNDhkMC00NTM1LTlmMmYtNWZlN2M4MDRhNTU5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyOWEwNS4uMDAwMDAwMAotLS0gYS91cGxvYWRzLzlmOTlhYzc3LTQ4ZDAtNDUzNS05ZjJmLTVmZTdjODA0YTU1OS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGxvYWRzL2FjNDZlMGVjLTg5MWItNGNmYi1iZWNlLTc5OWYzMGNiYjFmOS5qcGcgYi91cGxvYWRzL2FjNDZlMGVjLTg5MWItNGNmYi1iZWNlLTc5OWYzMGNiYjFmOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy9hYzQ2ZTBlYy04OTFiLTRjZmItYmVjZS03OTlmMzBjYmIxZjkuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy9iYWQxOTZmMi1kMmE3LTRmMjQtOGNmOS02ZDQ1MGY4MmRhZjEuanBnIGIvdXBsb2Fkcy9iYWQxOTZmMi1kMmE3LTRmMjQtOGNmOS02ZDQ1MGY4MmRhZjEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdhNmUyLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvYmFkMTk2ZjItZDJhNy00ZjI0LThjZjktNmQ0NTBmODJkYWYxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwbG9hZHMvYmFlZjBlNjktMjI1YS00YzcwLTkyZTItZjhiMTMwMWM5ZGJjLmpwZyBiL3VwbG9hZHMvYmFlZjBlNjktMjI1YS00YzcwLTkyZTItZjhiMTMwMWM5ZGJjLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjk3My4uMDAwMDAwMAotLS0gYS91cGxvYWRzL2JhZWYwZTY5LTIyNWEtNGM3MC05MmUyLWY4YjEzMDFjOWRiYy5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzL2MxZGVlZGNkLWI2NmMtNGQ5MS1iMGVmLWJhZWQzZWRiZGQxNy5wbmcgYi91cGxvYWRzL2MxZGVlZGNkLWI2NmMtNGQ5MS1iMGVmLWJhZWQzZWRiZGQxNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmQ2M2UuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy9jMWRlZWRjZC1iNjZjLTRkOTEtYjBlZi1iYWVkM2VkYmRkMTcucG5nCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzL2Q5NjdmZGVjLTc5ZTctNDYzMy05MDE1LTczYzhhZWUxNjVlNy5qcGcgYi91cGxvYWRzL2Q5NjdmZGVjLTc5ZTctNDYzMy05MDE1LTczYzhhZWUxNjVlNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy9kOTY3ZmRlYy03OWU3LTQ2MzMtOTAxNS03M2M4YWVlMTY1ZTcuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy9kZjcxNWQ1NS1jY2ZmLTQ2ZmYtODAwOS05YTA5NzIzNDQ3NDIucG5nIGIvdXBsb2Fkcy9kZjcxNWQ1NS1jY2ZmLTQ2ZmYtODAwOS05YTA5NzIzNDQ3NDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI5ZjBkLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvZGY3MTVkNTUtY2NmZi00NmZmLTgwMDktOWEwOTcyMzQ0NzQyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwbG9hZHMvZTIyNTUxODYtZTRjNy00OWMzLWI2NzMtMjI5YzVhMTZhNmQ2LmpwZyBiL3VwbG9hZHMvZTIyNTUxODYtZTRjNy00OWMzLWI2NzMtMjI5YzVhMTZhNmQ2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkN2YzOC4uMDAwMDAwMAotLS0gYS91cGxvYWRzL2UyMjU1MTg2LWU0YzctNDljMy1iNjczLTIyOWM1YTE2YTZkNi5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10ZXN0IGltYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy9lY2JlNDk5Yy0zMzQyLTRlOGUtYmYyMy1lMmY3N2EwYWQ0MGIucG5nIGIvdXBsb2Fkcy9lY2JlNDk5Yy0zMzQyLTRlOGUtYmYyMy1lMmY3N2EwYWQ0MGIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI5ZjBkLi4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvZWNiZTQ5OWMtMzM0Mi00ZThlLWJmMjMtZTJmNzdhMGFkNDBiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwbG9hZHMvZWYxN2QwMjItOWM4MC00MzZiLTg3Y2QtMjI3ZDc4M2JhYWRmLmpwZyBiL3VwbG9hZHMvZWYxN2QwMjItOWM4MC00MzZiLTg3Y2QtMjI3ZDc4M2JhYWRmLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjk3My4uMDAwMDAwMAotLS0gYS91cGxvYWRzL2VmMTdkMDIyLTljODAtNDM2Yi04N2NkLTIyN2Q3ODNiYWFkZi5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0BAgMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGxvYWRzL2YyZTM1ZjZkLTJkN2ItNDU2YS04YmY0LTI3NTI2ZTIwYzViNS5qcGcgYi91cGxvYWRzL2YyZTM1ZjZkLTJkN2ItNDU2YS04YmY0LTI3NTI2ZTIwYzViNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI5NzMuLjAwMDAwMDAKLS0tIGEvdXBsb2Fkcy9mMmUzNWY2ZC0yZDdiLTQ1NmEtOGJmNC0yNzUyNmUyMGM1YjUuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotAQIDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBsb2Fkcy9mZGFmMjBkMy1mYWE2LTQ0MDktOTZjYi0yMTU4Njk5NDhlYmYuanBnIGIvdXBsb2Fkcy9mZGFmMjBkMy1mYWE2LTQ0MDktOTZjYi0yMTU4Njk5NDhlYmYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3ZjM4Li4wMDAwMDAwCi0tLSBhL3VwbG9hZHMvZmRhZjIwZDMtZmFhNi00NDA5LTk2Y2ItMjE1ODY5OTQ4ZWJmLmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRlc3QgaW1hZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==