cGFja2FnZSBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQubWF0Y2hpbmc7DQoNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KDQppbXBvcnQgb3Blbm5scC50b29scy5wYXJzZV90aGlja2V0LlBhcnNlVGhpY2tldDsNCmltcG9ydCBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQuV29yZFdvcmRJbnRlclNlbnRlbmNlUmVsYXRpb25BcmM7DQppbXBvcnQgb3Blbm5scC50b29scy50ZXh0c2ltaWxhcml0eS5QYXJzZVRyZWVDaHVuazsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQoNCnB1YmxpYyBjbGFzcyBQVE1hdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KCU1hdGNoZXIgbSA9IG5ldyBNYXRjaGVyKCk7DQoJDQoJcHVibGljIHZvaWQgdGVzdE1hdGNoVHdvUGFyYVRlc3RSZWR1Y2VkKCl7DQoJCVN0cmluZyBxID0gIkkgYW0gYSBVUyBjaXRpemVuIGxpdmluZyBhYnJvYWQsIGFuZCBjb25jZXJuZWQgYWJvdXQgdGhlIGhlYWx0aCByZWZvcm0gcmVndWxhdGlvbiBvZiAyMDE0LiBJIGRvIG5vdCB3YW50IHRvIHdhaXQgdGlsbCBJIGFtIHNpY2sgdG8gYnV5IGhlYWx0aCBpbnN1cmFuY2UuIEkgYW0gYWZyYWlkIEkgd2lsbCBlbmQgdXAgcGF5aW5nIHRoZSB0YXguIjsNCgkJU3RyaW5nIGEgPSAiUGVvcGxlIGFyZSB3b3JyaWVkIGFib3V0IGhhdmluZyB0byBwYXkgYSBmaW5lIGZvciBub3QgY2FycnlpbmcgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZSBnb3QgbW9yZSBndWlkYW5jZSB0aGlzIHdlZWsgd2l0aCBzb21lIG5ldyBmZWRlcmFsIHJlZ3VsYXRpb25zLiAiKw0KCQkJCSJIYXJkbHkgYW55b25lIHdpbGwgZW5kIHVwIHBheWluZyB0aGUgdGF4IHdoZW4gdGhlIGhlYWx0aCByZWZvcm0gbGF3IHRha2VzIGZ1bGwgZWZmZWN0IGluIDIwMTQuICIrDQoJCQkJIlRoZSBpbmRpdmlkdWFsIG1hbmRhdGUgbWFrZXMgc3VyZSB0aGF0IHBlb3BsZSBkb26SdCB3YWl0IHVudGlsIHRoZXkgYXJlIHNpY2sgdG8gYnV5IGhlYWx0aCBpbnN1cmFuY2UuICIrDQoJCQkJIlBlb3BsZSBhcmUgZXhlbXB0IGZyb20gaGVhbHRoIGluc3VyYW5jZSBmaW5lIGlmIHRoZXkgbWFrZSB0b28gbGl0dGxlIG1vbmV5IHRvIGZpbGUgYW4gaW5jb21lIHRheCByZXR1cm4sIG9yIFVTIGNpdGl6ZW5zIGxpdmluZyBhYnJvYWQuIjsgDQoJCUxpc3Q8TGlzdDxQYXJzZVRyZWVDaHVuaz4+IHJlcyA9IG0uYXNzZXNzUmVsZXZhbmNlKHEsIGEpOw0KCQlTeXN0ZW0ub3V0LnByaW50KHJlcyk7DQoJCWFzc2VydFRydWUocmVzIT1udWxsKTsNCgkJYXNzZXJ0VHJ1ZShyZXMuc2l6ZSgpPjApOw0KCQlhc3NlcnRFcXVhbHMocmVzLnRvU3RyaW5nKCksICJbWyBbTk5QLXVzIE5OLWNpdGl6ZW4gVkJHLWxpdmluZyBSQi1hYnJvYWQgXSwgIFssLSwgQ0MtKiBdLCAgW0RULWEgTk5QLSogXSwgIFtEVC10aGUgTk4tKiBOTi1oZWFsdGggTk4tcmVmb3JtIE5OLSogQ0QtMjAxNCBdLCAgW05OLSogSU4tKiBDRC0yMDE0IF0sICBbTk4taGVhbHRoIE5OLSogTk4tKiBJTi0qIF0sICBbTk4tcmVndWxhdGlvbiBdLCAiICsNCgkJCQkiIFtEVC10aGUgTk4taGVhbHRoIE5OLXJlZm9ybSBOTi0qIF0sICBbQ0QtMjAxNCBdLCAgW05OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtEVC10aGUgTk4tdGF4IF0sICBbTk4tdGF4IF1dLCBbIFtWQlAtKiBEVC1hIE5OUC0qIE5OLWhlYWx0aCBOTi0qIE5OLSogTk4tcmVndWxhdGlvbiBdLCAgW05OLWhlYWx0aCBOTi0qIE5OLSogTk4tcmVndWxhdGlvbiBdLCAgW05OLXJlZ3VsYXRpb24gXSwgIiArDQoJCQkJIiBbRFQtdGhlIE5OLSogTk4taGVhbHRoIE5OLXJlZm9ybSBOTi0qIENELTIwMTQgXSwgIFtOTi0qIElOLSogQ0QtMjAxNCBdLCAgW0lOLSogTk4taGVhbHRoIE5OLSogXSwgIFtOTlAtdXMgTk4tY2l0aXplbiBWQkctbGl2aW5nIFJCLWFicm9hZCBdLCAgWywtLCBDQy0qIF0sICBbTk4taGVhbHRoIE5OLSogTk4tKiBJTi0qIF0sICIgKw0KCQkJCSIgW0lOLWFib3V0IE5OLWhlYWx0aCBOTi0qIE5OLSogTk4tcmVndWxhdGlvbiBdLCAgW1ZCRy1saXZpbmcgUkItYWJyb2FkIF0sICBbVE8tdG8gVkItKiBWQi13YWl0IElOLSogUFJQLSogVkJQLSogSkotc2ljayBUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1RPLXRvIFZCLSogSkotc2ljayBUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgIiArDQoJCQkJIltUTy10byBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1ZCLSogVE8tdG8gVkItKiBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi0qIFZCLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1JCLW5vdCBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQkctcGF5aW5nIERULSogTk4tKiBdLCAgIiArDQoJCQkJIltNRC13aWxsIFZCLWVuZCBSUC11cCBWQkctcGF5aW5nIERULXRoZSBOTi10YXggXSwgIFtWQi1lbmQgUlAtdXAgVkJHLXBheWluZyBEVC10aGUgTk4tdGF4IF0sICBbVkJHLXBheWluZyBEVC10aGUgTk4tdGF4IF0sICBbVkJQLWRvIFJCLSogVkItKiBUTy0qIFRPLXRvIFZCLSogXSwgIFtWQi0qIFZCLXdhaXQgSU4tKiBQUlAtKiBWQlAtKiBKSi1zaWNrIFRPLXRvIFZCLWJ1eSBOTi1oZWFsdGggTk4taW5zdXJhbmNlIF0sICIgKw0KCQkJCSIgW1ZCLXdhaXQgSU4tKiBQUlAtKiBWQlAtKiBKSi1zaWNrIFRPLXRvIFZCLWJ1eSBOTi1oZWFsdGggTk4taW5zdXJhbmNlIF0sICBbVkJQLSogSkotc2ljayBUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1RPLXRvIFZCLSogVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW05OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tdGF4IF0sICAiICsNCgkJCQkiW1RPLXRvIFZCLSogTk4tdGF4IF0sICBbTk4tdGF4IF0sICBbVkItKiBUTy10byBWQi0qIFZCLXdhaXQgSU4tKiBQUlAtKiBWQlAtKiBKSi1zaWNrIFRPLXRvIFZCLWJ1eSBOTi1oZWFsdGggTk4taW5zdXJhbmNlIF0sICBbVkItKiBUTy10byBWQi0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi0qIFZCRy1wYXlpbmcgRFQtKiBOTi0qIF1dXSIpOw0KCQ0KCX0NCg0KCXB1YmxpYyB2b2lkIHRlc3RNYXRjaFR3b1BhcmFUZXN0MSgpew0KCQlMaXN0PExpc3Q8UGFyc2VUcmVlQ2h1bms+PiByZXMgPSBtLmFzc2Vzc1JlbGV2YW5jZSgiSXJhbiByZWZ1c2VzIHRvIGFjY2VwdCB0aGUgVU4gcHJvcG9zYWwgdG8gZW5kIGl0cyBkaXNwdXRlIG92ZXIgaXRzIHdvcmsgb24gbnVjbGVhciB3ZWFwb25zLiIrDQoJCQkJIlVOIG51Y2xlYXIgd2F0Y2hkb2cgcGFzc2VzIGEgcmVzb2x1dGlvbiBjb25kZW1uaW5nIElyYW4gZm9yIGRldmVsb3BpbmcgaXRzIHNlY29uZCB1cmFuaXVtIGVucmljaG1lbnQgc2l0ZSBpbiBzZWNyZXQuICIgKw0KCQkJCSJBIHJlY2VudCBJQUVBIHJlcG9ydCBwcmVzZW50ZWQgZGlhZ3JhbXMgdGhhdCBzdWdnZXN0ZWQgSXJhbiB3YXMgc2VjcmV0bHkgd29ya2luZyBvbiBudWNsZWFyIHdlYXBvbnMuICIgKw0KCQkJCSJJcmFuIGVudm95IHNheXMgaXRzIG51Y2xlYXIgZGV2ZWxvcG1lbnQgaXMgZm9yIHBlYWNlZnVsIHB1cnBvc2UsIGFuZCB0aGUgbWF0ZXJpYWwgZXZpZGVuY2UgYWdhaW5zdCBpdCBoYXMgYmVlbiBmYWJyaWNhdGVkIGJ5IHRoZSBVUy4gIg0KDQoJCQksICJJcmFuIHJlZnVzZXMgdGhlIFVOIG9mZmVyIHRvIGVuZCBhIGNvbmZsaWN0IG92ZXIgaXRzIG51Y2xlYXIgd2VhcG9ucy4iKw0KCQkJCQkiVU4gcGFzc2VzIGEgcmVzb2x1dGlvbiBwcm9oaWJpdGluZyBJcmFuIGZyb20gZGV2ZWxvcGluZyBpdHMgdXJhbml1bSBlbnJpY2htZW50IHNpdGUuICIgKw0KCQkJCQkiQSByZWNlbnQgVU4gcmVwb3J0IHByZXNlbnRlZCBjaGFydHMgc2F5aW5nIElyYW4gd2FzIHdvcmtpbmcgb24gbnVjbGVhciB3ZWFwb25zLiAiICsNCgkJCQkiSXJhbiBlbnZveSB0byBVTiBzdGF0ZXMgaXRzIG51Y2xlYXIgZGV2ZWxvcG1lbnQgaXMgZm9yIHBlYWNlZnVsIHB1cnBvc2UsIGFuZCB0aGUgZXZpZGVuY2UgYWdhaW5zdCBpdHMgY2xhaW0gaXMgZmFicmljYXRlZCBieSB0aGUgVVMuICIpOw0KCQlTeXN0ZW0ub3V0LnByaW50KHJlcyk7DQoJCWFzc2VydFRydWUocmVzIT1udWxsKTsNCgkJYXNzZXJ0VHJ1ZShyZXMuc2l6ZSgpPjApOw0KCQlhc3NlcnRFcXVhbHMocmVzLnRvU3RyaW5nKCksICJbWyBbRFQtdGhlIE5OUC11biBOTi0qIF0sICBbUFJQJC1pdHMgSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW05OLXdvcmsgSU4tb24gSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW1BSUCQtaXRzIE5OLSogSkotbnVjbGVhciBOTlMtKiBdLCAgW1BSUCQtaXRzIEpKLW51Y2xlYXIgTk5TLSogXSwgIFtEVC1hIE5OLSogUFJQJC1pdHMgSkotKiBOTi0qIF0sICBbRFQtYSBOTi1yZXNvbHV0aW9uIFZCRy0qIE5OUC1pcmFuIElOLSogVkJHLWRldmVsb3BpbmcgUFJQJC1pdHMgTk4tdXJhbml1bSBOTi1lbnJpY2htZW50IE5OLXNpdGUgXSwgIFtOTi0qIFZCRy0qIE5OUC1pcmFuIF0sICBbRFQtYSBOTi1yZXNvbHV0aW9uIFZCRy0qIE5OUC0qIE5OUC1pcmFuIF0sICBbRFQtYSBOTi1yZXNvbHV0aW9uIE5OUC1pcmFuIF0sICBbRFQtYSBOTlAtaXJhbiBdLCAgW0RULWEgUFJQJC1pdHMgXSwgIFtOTlAtaXJhbiBJTi0qIFZCRy1kZXZlbG9waW5nIFBSUCQtaXRzIE5OLXVyYW5pdW0gTk4tZW5yaWNobWVudCBOTi1zaXRlIF0sICBbSU4tZm9yIF0sICBbVkJHLSogUFJQJC1pdHMgSkotKiBOTi0qIF0sICBbUFJQJC1pdHMgTk4tdXJhbml1bSBOTi1lbnJpY2htZW50IE5OLXNpdGUgXSwgIFtQUlAkLWl0cyBKSi0qIE5OLSogXSwgIFtWQkQtKiBOTlAtaXJhbiBWQkQtd2FzIFZCRy13b3JraW5nIElOLW9uIEpKLW51Y2xlYXIgTk5TLXdlYXBvbnMgXSwgIFtWQkctKiBKSi1udWNsZWFyIE5OUy0qIF0sICBbSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW0pKLW51Y2xlYXIgTk5TLSogXSwgIFtOTlAtaXJhbiBOTi1lbnZveSBdLCAgW05OLSogSU4tKiBQUlAtaXQgXSwgIFtOTi0qIFBSUC1pdCBdLCAgW0RULXRoZSBOTi0qIE5OLWV2aWRlbmNlIElOLWFnYWluc3QgUFJQLWl0IF0sICBbRFQtdGhlIE5OLSogTk4tKiBdLCAgW1BSUC1pdCBdLCAgW0RULXRoZSBOTlAtdXMgXSwgIFtEVC10aGUgTk5QLSogXSwgIFtEVC1hIE5OLXJlc29sdXRpb24gRFQtYSBKSi1yZWNlbnQgTk5QLSogTk4tcmVwb3J0IF0sICBbRFQtYSBKSi1yZWNlbnQgTk5QLSogTk4tcmVwb3J0IF0sICBbTk4tKiBQUlAkLWl0cyBKSi1udWNsZWFyIE5OLSogXSwgIFtQUlAkLWl0cyBKSi1udWNsZWFyIE5OLSogXSwgIFtWQlotKiBQUlAkLWl0cyBdLCAgW05OLWRldmVsb3BtZW50IF0sICBbUFJQJC1pdHMgSkotbnVjbGVhciBOTi1kZXZlbG9wbWVudCBdLCAgW0pKLXBlYWNlZnVsIE5OLXB1cnBvc2UgXSwgIFtOTi0qIFZCWi1zYXlzIF0sICBbTk5QLXVuIEpKLW51Y2xlYXIgTk4tKiBWQlotKiBdLCAgW05OLSogVkJaLSogUFJQJC1pdHMgSkotbnVjbGVhciBOTi1kZXZlbG9wbWVudCBWQlotaXMgSU4tZm9yIEpKLXBlYWNlZnVsIE5OLXB1cnBvc2UgXSwgIFtKSi1udWNsZWFyIE5OLSogVkJaLSogTk4tZGV2ZWxvcG1lbnQgVkJaLWlzIElOLWZvciBKSi1wZWFjZWZ1bCBOTi1wdXJwb3NlIF0sICBbTk5QLXVuIE5OLSogUFJQJC1pdHMgXV0sIFsgW1ZCWi1yZWZ1c2VzIFRPLXRvIFZCLSogRFQtKiBOTlAtKiBdLCAgW1ZCLSogRFQtdGhlIE5OUC11biBOTi0qIFRPLXRvIFZCLWVuZCBQUlAkLWl0cyBdLCAgW05OUC11biBdLCAgW05OUC0qIE5OLSogVE8tdG8gXSwgIFtUTy10byBWQi1lbmQgUFJQJC1pdHMgXSwgIFtWQlotKiBEVC1hIE5OLSogUFJQJC1pdHMgSkotKiBOTi0qIF0sICBbVkJaLXBhc3NlcyBEVC1hIE5OLXJlc29sdXRpb24gVkJHLSogTk5QLWlyYW4gSU4tKiBWQkctZGV2ZWxvcGluZyBQUlAkLWl0cyBOTi11cmFuaXVtIE5OLWVucmljaG1lbnQgTk4tc2l0ZSBdLCAgW05OLSogVkJHLSogTk5QLWlyYW4gXSwgIFtWQkctKiBOTlAtaXJhbiBJTi0qIFZCRy1kZXZlbG9waW5nIFBSUCQtaXRzIE5OLXVyYW5pdW0gTk4tZW5yaWNobWVudCBOTi1zaXRlIF0sICBbSU4tZm9yIF0sICBbUFJQJC1pdHMgSkotKiBOTi0qIF0sICBbVkJHLWRldmVsb3BpbmcgUFJQJC1pdHMgTk4tdXJhbml1bSBOTi1lbnJpY2htZW50IE5OLXNpdGUgXSwgIFtWQkctKiBQUlAkLWl0cyBKSi0qIE5OLSogXSwgIFtWQkQtcHJlc2VudGVkIE5OUy0qIE5OUC1pcmFuIFZCRC13YXMgVkJHLXdvcmtpbmcgSU4tb24gSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW1ZCRC0qIE5OUC1pcmFuIFZCRC13YXMgVkJHLXdvcmtpbmcgSU4tb24gSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW05OUC1pcmFuIF0sICBbVkJELXdhcyBWQkctd29ya2luZyBJTi1vbiBKSi1udWNsZWFyIE5OUy13ZWFwb25zIF0sICBbSkotbnVjbGVhciBOTlMtd2VhcG9ucyBdLCAgW1ZCRy0qIEpKLW51Y2xlYXIgTk5TLSogXSwgIFtWQkctd29ya2luZyBJTi1vbiBKSi1udWNsZWFyIE5OUy13ZWFwb25zIF0sICBbUFJQJC1pdHMgSkotbnVjbGVhciBOTi0qIF0sICBbTk4tZGV2ZWxvcG1lbnQgXSwgIFtWQlotc2F5cyBKSi1udWNsZWFyIE5OLSogXSwgIFtWQlotKiBQUlAkLWl0cyBKSi1udWNsZWFyIE5OLWRldmVsb3BtZW50IFZCWi1pcyBJTi1mb3IgSkotcGVhY2VmdWwgTk4tcHVycG9zZSBdLCAgW1ZCWi0qIEpKLW51Y2xlYXIgTk4tKiBdLCAgW1ZCWi1pcyBJTi1mb3IgSkotcGVhY2VmdWwgTk4tcHVycG9zZSBdLCAgW1ZCTi0qIFZCTi1mYWJyaWNhdGVkIElOLWJ5IERULXRoZSBOTlAtdXMgXSwgIFtWQk4tZmFicmljYXRlZCBJTi1ieSBEVC10aGUgTk5QLXVzIF0sICBbVE8tdG8gVkItKiBEVC0qIE5OUC0qIFZCLWVuZCBQUlAkLWl0cyBdLCAgW1ZCLWVuZCBQUlAkLWl0cyBdLCAgW05OLSogSU4tb3ZlciBQUlAkLWl0cyBdLCAgW1BSUCQtaXRzIEpKLW51Y2xlYXIgTk5TLXdlYXBvbnMgXSwgIFtEVC1hIF0sICBbVE8tKiBWQi0qIFBSUCQtaXRzIE5OLSogXSwgIFtWQi0qIFBSUCQtaXRzIE5OLSogXSwgIFtWQi0qIFBSUCQtaXRzIEpKLW51Y2xlYXIgTk5TLSogXSwgIFtEVC10aGUgTk5QLSogXSwgIFtUTy10byBOTlAtdW4gXSwgIFtOTi13b3JrIElOLW9uIEpKLW51Y2xlYXIgTk5TLXdlYXBvbnMgXV1dIik7DQoJfQ0KDQoJcHVibGljIHZvaWQgdGVzdE1hdGNoVHdvUGFyYVRlc3QyKCl7DQoJCUxpc3Q8TGlzdDxQYXJzZVRyZWVDaHVuaz4+IHJlcyA9IG0uYXNzZXNzUmVsZXZhbmNlKCJJIGFtIGEgVVMgY2l0aXplbiBsaXZpbmcgYWJyb2FkLCBhbmQgY29uY2VybmVkIGFib3V0IHRoZSBoZWFsdGggcmVmb3JtIHJlZ3VsYXRpb24gb2YgMjAxNC4gIisNCgkJCQkiSSBkbyBub3Qgd2FudCB0byB3YWl0IHRpbGwgSSBhbSBzaWNrIHRvIGJ1eSBoZWFsdGggaW5zdXJhbmNlLiAiKw0KCQkJCSJJIGFtIGFmcmFpZCBJIHdpbGwgZW5kIHVwIHBheWluZyB0aGUgdGF4LiAiKw0KCQkJCSJJIGFtIHdvcnJpZWQgYWJvdXQgaGF2aW5nIHRvIHBheSBhIGZpbmUgZm9yIG5vdCBoYXZpbmcgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZS4gIg0KCQkJCSwgDQoJCQkJIlBlb3BsZSBhcmUgd29ycmllZCBhYm91dCBoYXZpbmcgdG8gcGF5IGEgZmluZSBmb3Igbm90IGNhcnJ5aW5nIGhlYWx0aCBpbnN1cmFuY2UgY292ZXJhZ2UgZ290IG1vcmUgZ3VpZGFuY2UgdGhpcyB3ZWVrIHdpdGggc29tZSBuZXcgZmVkZXJhbCByZWd1bGF0aW9ucy4gIisNCgkJCQkJCSJIYXJkbHkgYW55b25lIHdpbGwgZW5kIHVwIHBheWluZyB0aGUgdGF4IHdoZW4gdGhlIGhlYWx0aCByZWZvcm0gbGF3IHRha2VzIGZ1bGwgZWZmZWN0IGluIDIwMTQuICIrDQoJCQkJCQkiVGhlIGluZGl2aWR1YWwgbWFuZGF0ZSBtYWtlcyBzdXJlIHRoYXQgcGVvcGxlIGRvbpJ0IHdhaXQgdW50aWwgdGhleSBhcmUgc2ljayB0byBidXkgaGVhbHRoIGluc3VyYW5jZS4gIisNCgkJCQkiUGVvcGxlIGFyZSBleGVtcHQgZnJvbSBoZWFsdGggaW5zdXJhbmNlIGZpbmUgaWYgdGhleSBtYWtlIHRvbyBsaXR0bGUgbW9uZXkgdG8gZmlsZSBhbiBpbmNvbWUgdGF4IHJldHVybiwgb3IgVVMgY2l0aXplbnMgbGl2aW5nIGFicm9hZC4iKTsNCgkJU3lzdGVtLm91dC5wcmludChyZXMpOw0KCQlhc3NlcnRUcnVlKHJlcyE9bnVsbCk7DQoJCWFzc2VydFRydWUocmVzLnNpemUoKT4wKTsNCgkJYXNzZXJ0RXF1YWxzKHJlcy50b1N0cmluZygpLCAiW1sgW05OUC11cyBOTi1jaXRpemVuIFZCRy1saXZpbmcgUkItYWJyb2FkIF0sICBbLC0sIENDLSogXSwgIFtEVC1hIE5OUC0qIF0sICBbRFQtdGhlIE5OLSogTk4taGVhbHRoIE5OLXJlZm9ybSBOTi0qIENELTIwMTQgXSwgICIgKw0KCQkJCSJbTk4tKiBJTi0qIENELTIwMTQgXSwgIFtOTi1oZWFsdGggTk4tKiBOTi0qIElOLSogXSwgIFtOTi1yZWd1bGF0aW9uIF0sICBbRFQtdGhlIE5OLWhlYWx0aCBOTi1yZWZvcm0gTk4tKiBdLCAgW0NELTIwMTQgXSwgIFtEVC10aGUgTk4tdGF4IF0sICBbTk4tdGF4IF0sICIgKw0KCQkJCSIgW0RULWEgTk4tZmluZSBdLCAgW05OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtUTy10byBWQi0qIERULSogTk4tKiBdLCAgW05OLWZpbmUgSU4tKiBdLCAgW05OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tKiBdXSwgIiArDQoJCQkJIlsgW1ZCUC0qIERULWEgTk5QLSogTk4taGVhbHRoIE5OLSogTk4tKiBOTi1yZWd1bGF0aW9uIF0sICBbTk4taGVhbHRoIE5OLSogTk4tKiBOTi1yZWd1bGF0aW9uIF0sICBbTk4tcmVndWxhdGlvbiBdLCAgW0RULXRoZSBOTi0qIE5OLWhlYWx0aCBOTi1yZWZvcm0gTk4tKiBDRC0yMDE0IF0sICIgKw0KCQkJCSIgW05OLSogSU4tKiBDRC0yMDE0IF0sICBbSU4tKiBOTi1oZWFsdGggTk4tKiBdLCAgW05OUC11cyBOTi1jaXRpemVuIFZCRy1saXZpbmcgUkItYWJyb2FkIF0sICBbLC0sIENDLSogXSwgIFtOTi1oZWFsdGggTk4tKiBOTi0qIElOLSogXSwgIFtJTi1hYm91dCBOTi1oZWFsdGggTk4tKiBOTi0qIE5OLXJlZ3VsYXRpb24gXSwgIFtWQkctbGl2aW5nIFJCLWFicm9hZCBdLCAgW1RPLXRvIFZCLSogVkItd2FpdCBJTi0qIFBSUC0qIFZCUC0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1ZCRy0qIFZCLXBheSBEVC0qIE5OLSogTk4taGVhbHRoIE5OLSogTk4tKiBdLCAgW1ZCLXBheSBEVC0qIE5OLSogTk4taGVhbHRoIE5OLSogTk4tKiBdLCAgW1JCLW5vdCBWQkctKiBOTi1oZWFsdGggTk4taW5zdXJhbmNlIE5OLWNvdmVyYWdlIF0sICBbVkJHLWhhdmluZyBOTi1oZWFsdGggTk4taW5zdXJhbmNlIE5OLWNvdmVyYWdlIF0sICBbTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi10YXggXSwgIFtUTy10byBWQi0qIE5OLXRheCBdLCAgW1ZCLSogVE8tdG8gVkItKiBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi0qIFZCLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1RPLXRvIFZCLSogVkItcGF5IERULWEgTk4tZmluZSBJTi1mb3IgUkItbm90IFZCRy0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtWQi1wYXkgRFQtYSBOTi1maW5lIElOLWZvciBSQi1ub3QgVkJHLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi1jb3ZlcmFnZSBdLCAgW1JCLW5vdCBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtWQlAtZG8gUkItKiBWQi0qIFRPLSogVE8tdG8gVkItKiBdLCAgW1ZCLSogVkItd2FpdCBJTi0qIFBSUC0qIFZCUC0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi13YWl0IElOLSogUFJQLSogVkJQLSogSkotc2ljayBUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1ZCUC0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtUTy10byBWQi0qIFZCLWJ1eSBOTi1oZWFsdGggTk4taW5zdXJhbmNlIF0sICBbVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi0qIFRPLXRvIFZCLSogVkItd2FpdCBJTi0qIFBSUC0qIFZCUC0qIEpKLXNpY2sgVE8tdG8gVkItYnV5IE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtWQi0qIFRPLXRvIFZCLSogSkotc2ljayBUTy10byBWQi1idXkgTk4taGVhbHRoIE5OLWluc3VyYW5jZSBdLCAgW1ZCLSogVE8tdG8gVkItKiBWQi1wYXkgRFQtYSBOTi1maW5lIElOLWZvciBSQi1ub3QgVkJHLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi1jb3ZlcmFnZSBdLCAgW1ZCLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi1jb3ZlcmFnZSBdLCAgW1ZCRy1oYXZpbmcgVE8tdG8gVkItcGF5IERULWEgTk4tZmluZSBJTi1mb3IgUkItbm90IFZCRy0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtUTy10byBWQi1wYXkgRFQtYSBOTi1maW5lIElOLWZvciBSQi1ub3QgVkJHLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi1jb3ZlcmFnZSBdLCAgW1ZCRy1wYXlpbmcgRFQtKiBOTi0qIERULWEgTk4tZmluZSBJTi1mb3IgUkItbm90IFZCRy0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtWQkctKiBOTi1oZWFsdGggTk4taW5zdXJhbmNlIE5OLWNvdmVyYWdlIF0sICBbTUQtd2lsbCBWQi1lbmQgUlAtdXAgVkJHLXBheWluZyBEVC10aGUgTk4tdGF4IF0sICBbVkItZW5kIFJQLXVwIFZCRy1wYXlpbmcgRFQtdGhlIE5OLXRheCBOTi1oZWFsdGggTk4tKiBOTi0qIF0sICBbVkJHLXBheWluZyBEVC10aGUgTk4tdGF4IE5OLWhlYWx0aCBOTi0qIE5OLSogXSwgIFtUTy10byBWQi0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgXSwgIFtOTi1maW5lIElOLSogXSwgIFtOTi1oZWFsdGggTk4taW5zdXJhbmNlIE5OLSogXSwgIFtUTy10byBWQi0qIERULSogTk4tKiBdLCAgW05OLXRheCBdLCAgW1ZCUC0qIFZCTi13b3JyaWVkIElOLWFib3V0IFZCRy1oYXZpbmcgVE8tdG8gVkItcGF5IERULWEgTk4tZmluZSBJTi1mb3IgUkItbm90IFZCRy0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIFtWQi0qIFZCRy1wYXlpbmcgRFQtKiBOTi0qIERULWEgTk4tZmluZSBJTi1mb3IgUkItbm90IFZCRy0qIE5OLWhlYWx0aCBOTi1pbnN1cmFuY2UgTk4tY292ZXJhZ2UgXSwgIiArDQoJCQkJIiBbVkJOLXdvcnJpZWQgSU4tYWJvdXQgVkJHLWhhdmluZyBUTy10byBWQi1wYXkgRFQtYSBOTi1maW5lIElOLWZvciBSQi1ub3QgVkJHLSogTk4taGVhbHRoIE5OLWluc3VyYW5jZSBOTi1jb3ZlcmFnZSBdXV0iKTsNCgl9DQoNCg0KCXB1YmxpYyB2b2lkIHRlc3RNYXRjaFR3b1BhcmFUZXN0Q0EoKXsNCgkJTGlzdDxMaXN0PFBhcnNlVHJlZUNodW5rPj4gcmVzID0gbS5hc3Nlc3NSZWxldmFuY2UoIkFzIGEgVVMgY2l0aXplbiBsaXZpbmcgYWJyb2FkLCBJIGFtIGNvbmNlcm5lZCBhYm91dCB0aGUgaGVhbHRoIHJlZm9ybSByZWd1bGF0aW9uIG9mIDIwMTQuICIrDQoJCQkJIkkgZG8gbm90IHdhbnQgdG8gd2FpdCB0aWxsIEkgYW0gc2ljayB0byBidXkgaGVhbHRoIGluc3VyYW5jZS4gIisNCgkJCQkiWWV0IEkgYW0gYWZyYWlkIEkgd2lsbCBlbmQgdXAgcGF5aW5nIHRoZSB0YXguICIrDQoJCQkJIkFsdGhvdWdoIEkgbGl2ZSBhYnJvYWQsIEkgYW0gd29ycmllZCBhYm91dCBoYXZpbmcgdG8gcGF5IGEgZmluZSBmb3IgYmVpbmcgcmVwb3J0ZWQgYXMgbm90IGhhdmluZyBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlLiAiDQoJCQkJLCANCgkJCQkiUGVvcGxlIGFyZSB3b3JyaWVkIGFib3V0IHBheWluZyBhIGZpbmUgZm9yIG5vdCBjYXJyeWluZyBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlLCBoYXZpbmcgYmVlbiBpbmZvcm1lZCBieSBJUlMgYWJvdXQgbmV3IHJlZ3VsYXRpb25zLiAiKw0KCQkJCQkJIllldCBoYXJkbHkgYW55b25lIGlzIGV4cGVjdGVkIHRvIHBheSB0aGUgdGF4LCB3aGVuIHRoZSBoZWFsdGggcmVmb3JtIGxhdyB0YWtlcyBmdWxsIGVmZmVjdCBpbiAyMDE0LiAiKw0KCQkJCQkJIlRoZSBpbmRpdmlkdWFsIG1hbmRhdGUgY29uZmlybXMgdGhhdCBwZW9wbGUgZG9uknQgd2FpdCB1bnRpbCB0aGV5IGFyZSBzaWNrIHRvIGJ1eSBoZWFsdGggaW5zdXJhbmNlLiAiKw0KCQkJCSJQZW9wbGUgYXJlIGV4ZW1wdCBmcm9tIGhlYWx0aCBpbnN1cmFuY2UgZmluZSBpZiB0aGV5IHJlcG9ydCB0aGV5IG1ha2UgdG9vIGxpdHRsZSBtb25leSwgb3IgVVMgY2l0aXplbnMgbGl2aW5nIGFicm9hZC4iKTsNCgkJU3lzdGVtLm91dC5wcmludChyZXMpOw0KCQlhc3NlcnRUcnVlKHJlcyE9bnVsbCk7DQoJCWFzc2VydFRydWUocmVzLnNpemUoKT4wKTsNCgl9DQoNCglwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hUd29QYXJhVGVzdENBMSgpew0KCQlTdHJpbmcgdGV4dDEgPSAiQXMgYSBVUyBjaXRpemVuIGxpdmluZyBhYnJvYWQsIEkgYW0gY29uY2VybmVkIGFib3V0IHRoZSBoZWFsdGggcmVmb3JtIHJlZ3VsYXRpb24gb2YgMjAxNC4gIisNCgkJCQkiSSBkbyBub3Qgd2FudCB0byB3YWl0IHRpbGwgSSBhbSBzaWNrIHRvIGJ1eSBoZWFsdGggaW5zdXJhbmNlLiAiKw0KCQkJCSJZZXQgSSBhbSBhZnJhaWQgSSB3aWxsIGVuZCB1cCBiZWluZyByZXF1ZXN0ZWQgdG8gcGF5IHRoZSB0YXguICIrDQoJCQkJIkFsdGhvdWdoIEkgbGl2ZSBhYnJvYWQsIEkgYW0gd29ycmllZCBhYm91dCBoYXZpbmcgdG8gcGF5IGEgZmluZSBmb3IgYmVpbmcgcmVwb3J0ZWQgYXMgbm90IGhhdmluZyBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlLiAiOw0KDQoJCVN0cmluZyB0ZXh0MiA9CSJQZW9wbGUgYXJlIHdvcnJpZWQgYWJvdXQgcGF5aW5nIGEgZmluZSBmb3Igbm90IGNhcnJ5aW5nIGhlYWx0aCBpbnN1cmFuY2UgY292ZXJhZ2UsIGhhdmluZyBiZWVuIGluZm9ybWVkIGJ5IElSUyBhYm91dCBuZXcgcmVndWxhdGlvbnMuICIrDQoJCQkJIllldCBoYXJkbHkgYW55b25lIGlzIGV4cGVjdGVkIHRvIHBheSB0aGUgdGF4LCB3aGVuIHRoZSBoZWFsdGggcmVmb3JtIGxhdyB0YWtlcyBmdWxsIGVmZmVjdCBpbiAyMDE0LiAiKw0KCQkJCSJUaGUgaW5kaXZpZHVhbCBtYW5kYXRlIGNvbmZpcm1zIHRoYXQgcGVvcGxlIGRvbpJ0IHdhaXQgdW50aWwgdGhleSBhcmUgc2ljayB0byBidXkgaGVhbHRoIGluc3VyYW5jZS4gIisNCgkJCQkiUGVvcGxlIGFyZSBleGVtcHQgZnJvbSBoZWFsdGggaW5zdXJhbmNlIGZpbmUgaWYgdGhleSByZXBvcnQgdGhleSBtYWtlIHRvbyBsaXR0bGUgbW9uZXksIG9yIFVTIGNpdGl6ZW5zIGxpdmluZyBhYnJvYWQuIjsNCgkJTGlzdDxMaXN0PFBhcnNlVHJlZUNodW5rPj4gcmVzID0gbS5hc3Nlc3NSZWxldmFuY2UodGV4dDEsIHRleHQyKTsNCgkJU3lzdGVtLm91dC5wcmludChyZXMpOw0KCQlhc3NlcnRUcnVlKHJlcyE9bnVsbCk7DQoJCWFzc2VydFRydWUocmVzLnNpemUoKT4wKTsNCgl9DQoNCn0NCg0KDQo=