LyoNCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQogKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqDQogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQogKg0KICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogKi8NCg0KcGFja2FnZSBvcGVubmxwLnRvb2xzLnNpbWlsYXJpdHkuYXBwczsNCg0KaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsNCmltcG9ydCBqYXZhLm5ldC5VUkw7DQppbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5NYXA7DQppbXBvcnQgamF2YS51dGlsLlNldDsNCg0KaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOw0KDQpwdWJsaWMgY2xhc3MgV2ViU2VhcmNoRW5naW5lUmVzdWx0c1NjcmFwZXIgew0KICBwdWJsaWMgV2ViU2VhcmNoRW5naW5lUmVzdWx0c1NjcmFwZXIoKXsNCiAgICBidWlsZENhY2hlKCk7DQogIH0NCg0KICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmZXRjaFBhZ2VTZWFyY2hFbmdpbmUoU3RyaW5nIHVybCkgew0KICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmV0Y2ggdXJsICIgKyB1cmwpOw0KICAgIFN0cmluZyBwYWdlQ29udGVudCA9IG51bGw7DQogICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAgICB0cnkgew0KICAgICAgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTCh1cmwpLm9wZW5Db25uZWN0aW9uKCk7DQogICAgICBjb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KDUwMDAwKTsNCiAgICAgIGNvbm5lY3Rpb24NCiAgICAgICAgICAuc2V0UmVxdWVzdFByb3BlcnR5KA0KICAgICAgICAgICAgICAiVXNlci1BZ2VudCIsDQogICAgICAgICAgICAgICJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA2LjA7IGVuLUdCOyBydjoxLjkuMC4zKSBHZWNrby8yMDA4MDkyNDE3IEZpcmVmb3gvMy4wLjMiKTsNCiAgICAgIFN0cmluZyBsaW5lOw0KICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsNCiAgICAgIHRyeSB7DQogICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoDQogICAgICAgICAgICBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpKTsNCiAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQogICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIGNvbXBsZXRlIHNlYXJjaCBlbmdpbmUgcmVxdWVzdCAiK3VybCk7DQogICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgIH0NCg0KICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCiAgICAgICAgYnVmLmFwcGVuZChsaW5lKTsNCiAgICAgIH0NCg0KICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQogICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOw0KICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJlcnJvciBmZXRjaGluZyB1cmwgIiArIHVybCk7DQogICAgfQ0KDQogICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KICB9DQoNCiAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGV4dHJhY3RVUkxzRnJvbVBhZ2UoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBkb21haW4pIHsNCiAgICBMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KICAgIGlmIChjb250ZW50ID09IG51bGwpDQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICBjb250ZW50ID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmV0d2Vlbihjb250ZW50LCAiPkFkdmFuY2VkPC9hPjwvZGl2PiIsDQogICAgICAgICI8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT0iKTsNCiAgICBpZiAoY29udGVudCA9PSBudWxsKQ0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgU3RyaW5nW10gdXJscyA9IGNvbnRlbnQuc3BsaXQoIjxjaXRlPiIpOw0KICAgIGlmICh1cmxzID09IG51bGwpDQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICBmb3IgKFN0cmluZyB1IDogdXJscykgew0KICAgICAgaW50IGVuZFBvcyA9IHUuaW5kZXhPZigiPC9jaXRlPiIpOw0KDQogICAgICBpZiAoZW5kUG9zID4gMCkgew0KICAgICAgICB1ID0gdS5zdWJzdHJpbmcoMCwgZW5kUG9zKS5yZXBsYWNlKCI8L3N0cm9uZz4iLCAiIikNCiAgICAgICAgICAgIC5yZXBsYWNlKCI8c3Ryb25nPiIsICIiKTsNCiAgICAgICAgaWYgKCF1LmVxdWFscyhkb21haW4pKQ0KICAgICAgICAgIHJlc3VsdHMuYWRkKHUpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxIaXRCYXNlPiBleHRyYWN0U2VhcmNoUmVzdWx0RnJvbVBhZ2UoU3RyaW5nIGNvbnRlbnQpIHsNCiAgICBMaXN0PEhpdEJhc2U+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PEhpdEJhc2U+KCk7DQogICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkNCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIGNvbnRlbnQgPSBTdHJpbmdVdGlscy5zdWJzdHJpbmdCZXR3ZWVuKGNvbnRlbnQsICI8ZGl2IGlkPVwicmVzdWx0cyIsDQogICAgICAgICJjbGFzcz1cInBhZ2luYXRpb24iKTsNCiAgICBpZiAoY29udGVudCA9PSBudWxsKQ0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgU3RyaW5nW10gc3JjaFJlc0FyZWEgPSBjb250ZW50LnNwbGl0KCI8L3A+Iik7DQogICAgaWYgKHNyY2hSZXNBcmVhID09IG51bGwpDQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICBmb3IgKFN0cmluZyB1IDogc3JjaFJlc0FyZWEpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIHUgPSB1LnN1YnN0cmluZyg1KTsNCiAgICAgICAgSGl0QmFzZSBoaXQgPSBuZXcgSGl0QmFzZSgpOw0KICAgICAgICBTdHJpbmcgdXJsID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmV0d2Vlbih1LCAiY2xhc3M9XCJ1cmwiLCAiPC9zcGFuPiIpOw0KICAgICAgICBpZiAodXJsIT1udWxsKQ0KICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygyKTsNCiAgICAgICAgU3RyaW5nIHRpdGxlID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmV0d2Vlbih1LCAiXCI+IiwgIjwvYT48YnIgLz4iKTsNCiAgICAgICAgdGl0bGUgPSB0aXRsZS5zdWJzdHJpbmcodGl0bGUuaW5kZXhPZigiXCI+IikrMik7DQogICAgICAgIFN0cmluZyBhYnN0ciA9IFN0cmluZ1V0aWxzLnN1YnN0cmluZ0JldHdlZW4odSwgIlwiYm9keVwiPiIsICI8L3NwYW4+PGJyIC8iKTsNCiAgICAgICAgaGl0LnNldFVybCh1cmwpOw0KICAgICAgICBoaXQuc2V0QWJzdHJhY3RUZXh0KGFic3RyKTsNCiAgICAgICAgaGl0LnNldFRpdGxlKHRpdGxlKTsNCiAgICAgICAgcmVzdWx0cy5hZGQoaGl0KTsNCiAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQogICAgICAgIC8vcHJvYmxlbSBwYXJzaW5nIFNFUlAgcGFnZTsgc291cmNlIC0gc3BlY2lmaWMgcHJvYmxlbSBzbyB3ZSBzd2FsbG93IGV4Y2VwdGlvbnMgaGVyZQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIA0KICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybVJlcXVlc3RVUkwoU3RyaW5nIHF1ZXJ5KSB7DQogICAgU3RyaW5nIHJlcXVlc3RVcmwgPSAiaHR0cDovL3d3dy5oYWtpYS5jb20vc2VhcmNoL3dlYj9xPSIgKyBxdWVyeS5yZXBsYWNlKCcgJywnKycpOw0KICAgIHJldHVybiByZXF1ZXN0VXJsOw0KICB9DQogIA0KICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybVJlcXVlc3RVUkxBbHQoU3RyaW5nIHF1ZXJ5KSB7DQogICAgU3RyaW5nIHJlcXVlc3RVcmwgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT0iICsgcXVlcnkucmVwbGFjZSgnICcsJysnKTsNCiAgICByZXR1cm4gcmVxdWVzdFVybDsNCiAgfQ0KDQogIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VVJMc0ZvcldlYkRvbWFpbihTdHJpbmcgZG9tYWluKSB7DQogICAgcmV0dXJuIGV4dHJhY3RVUkxzRnJvbVBhZ2UoZmV0Y2hQYWdlU2VhcmNoRW5naW5lKGZvcm1SZXF1ZXN0VVJMKGRvbWFpbikpLCBkb21haW4pOw0KICB9DQoNCiAgcHVibGljIFNldDxTdHJpbmc+IGdldFVSTHNGb3JXZWJEb21haW5JdGVyYXRpb25zKFN0cmluZyBkb21haW4pIHsNCiAgICBMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KICAgIExpc3Q8U3RyaW5nPiByZXMgPSBleHRyYWN0VVJMc0Zyb21QYWdlKA0KICAgICAgICBmZXRjaFBhZ2VTZWFyY2hFbmdpbmUoZm9ybVJlcXVlc3RVUkwoZG9tYWluKSksIGRvbWFpbik7DQogICAgZm9yIChTdHJpbmcgciA6IHJlcykNCiAgICAgIHJlc3VsdHMuYWRkQWxsKGV4dHJhY3RVUkxzRnJvbVBhZ2UoZmV0Y2hQYWdlU2VhcmNoRW5naW5lKGZvcm1SZXF1ZXN0VVJMKHIpKSwgcikpOw0KDQogICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4ocmVzdWx0cyk7DQogIH0NCiAgDQogIHB1YmxpYyBMaXN0PEhpdEJhc2U+IHJ1blNlYXJjaChTdHJpbmcgcXVlcnkpIHsNCiAgICBMaXN0PEhpdEJhc2U+IGhpdHMgPSBuZXcgQXJyYXlMaXN0PEhpdEJhc2U+KCk7DQogICAgLyogIEFjdHVhbCBleHRlcm5hbCB3ZWIgc2VhcmNoIGlzIGNvbW1lbnRlZCBvdXQNCiAgICB0cnkgew0KICAgICAgU3RyaW5nIHNlcnAgPSBmZXRjaFBhZ2VTZWFyY2hFbmdpbmUoZm9ybVJlcXVlc3RVUkwocXVlcnkpKTsNCiAgICAgIGhpdHMgPSBleHRyYWN0U2VhcmNoUmVzdWx0RnJvbVBhZ2Uoc2VycCk7DQoNCiAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KICAgIA0KICAgIH0gKi8NCiAgICAvLyBpZiB0aGVyZSBpcyBhIHByb2JsZW0sIHdlIHVzZSBjYWNoZWQgc2VhcmNoIHJlc3VsdHMNCiAgICBpZiAoaGl0cy5zaXplKCk8MSkgew0KICAgICAgU3RyaW5nW11bXSBjYWNoZWRIaXRzID0gY2FjaGVkU2VhcmNoRW5naW5lRGF0YS5nZXQocXVlcnkucmVwbGFjZSgnICcsJysnKSk7DQogICAgICBpZiAoY2FjaGVkSGl0cz09bnVsbCl7IC8vIG5vdCBmb3VuZCBpbiBjYWNoZQ0KICAgICAgICByZXR1cm4gaGl0czsNCiAgICAgIH0NCiAgICAgIGZvcihTdHJpbmdbXSBoIDogY2FjaGVkSGl0cyl7DQogICAgICAgIEhpdEJhc2UgaGIgPSBuZXcgSGl0QmFzZSgpOw0KICAgICAgICBoYi5zZXRUaXRsZShoWzBdKTsNCiAgICAgICAgaGIuc2V0QWJzdHJhY3RUZXh0KGhbMV0pOw0KICAgICAgICBoaXRzLmFkZChoYik7DQogICAgICB9DQogICAgfQ0KLy8gICAgaGl0cyA9IEhpdEJhc2UucmVtb3ZlRHVwbGljYXRlcyhoaXRzKTsNCiAgICByZXR1cm4gaGl0czsNCiAgICANCiAgfQ0KDQogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCiAgICBXZWJTZWFyY2hFbmdpbmVSZXN1bHRzU2NyYXBlciBzY3JhcGVyID0gbmV3IFdlYlNlYXJjaEVuZ2luZVJlc3VsdHNTY3JhcGVyKCk7DQogICAgU3lzdGVtLm91dC5wcmludGxuKHNjcmFwZXIucnVuU2VhcmNoKCJsYWR5IGdhZ2EgaW4gc2FuIGZyYW5jaXNjbyIpKTsgICAgICAgIA0KICB9DQogIA0KICBNYXA8U3RyaW5nLCBTdHJpbmdbXVtdPiBjYWNoZWRTZWFyY2hFbmdpbmVEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXVtdPigpOw0KICANCiAgDQogIHByaXZhdGUgdm9pZCBidWlsZENhY2hlKCl7DQogICAgY2FjaGVkU2VhcmNoRW5naW5lRGF0YS5wdXQoInJlbWVtYmVyK3RvK2J1eSttaWxrK3RvbW9ycm93K2ZvcitkZXRhaWxzIiwgbmV3IFN0cmluZ1tdW117DQogICAgICAgIHsiUmVtZW1iZXIgVGhlIE1pbGsgLSBTZXJ2aWNlcyAvIFJlbWVtYmVyIFRoZSBNaWxrIGZvciBFbWFpbCIsICJ0byBSZW1lbWJlciBUaGUgTWlsayBqdXN0IGJ5IHNlbmRpbmcgYW4gZW1haWwgdG8gYSBzcGVjaWFsIGFkZHJlc3MuIFJlYWQgdGhpcyBwYWdlIHRvIGxlYXJuIGFsbCB0aGUgZGV0YWlscywgYW5kIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgcnVuIGludG8gYW55IC4uLi4gZW1haWwgYWRkcmVzc10gQnV5IGJpcnRoZGF5IHByZXNlbnQgZm9yIE1pa2UgdG9kYXkgUGF5IHRoZSBwaG9uZSBiaWxsIHRvbW9ycm93IE1ha2UifSwNCiAgICAgICAgeyJTZXJ2aWNlcyAvIFJlbWVtYmVyIFRoZSBNaWxrIGZvciBBbmRyb2lkIC8gRmVhdHVyZXMiLCAiU3luYyB3aXRoIFJlbWVtYmVyIFRoZSBNaWxrIG9ubGluZSAobGltaXQgb25jZSBldmVyeSAyNCBob3VycykuIC4uLiBpbmNsdWRlIGV4dHJhIGRldGFpbHMgYWJvdXQgdGFza3MgaW4gdGhlICdBZGQgdGFzaycgYmFyIChlLmcuLCBQaWNrIHVwIHRoZSBtaWxrIHRvbW9ycm93KS4gLi4uIERldGVjdCB5b3VyIGN1cnJlbnQgbG9jYXRpb24gdG8gc2VlIG5lYXJieSB0YXNrczsgcGxhbiB0aGUgYmVzdCB3YXkgdG8gZ2V0IHRoaW5ncyBkb25lLiJ9LA0KICAgICAgICB7IlJlbWVtYmVyIFRoZSBNaWxrIC0gR2V0dGluZyBTdGFydGVkIiwgIlRoaXMgZ3VpZGUgaXMgaW50ZW5kZWQgYXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gdXNpbmcgUmVtZW1iZXIgVGhlIE1pbGsuIC4uLiB5b3UgY2FuIHNlbGVjdCBpdCBpbiB0aGUgbGlzdCBiZWxvdyBhbmQgdXNlIHRoZSB0YXNrIGRldGFpbHMgYm94IG9uIHRoZSByaWdodC4gLi4uIFRoZSBvdmVydmlldyBzY3JlZW4gaXMgYSBoYW5keSB3YXkgdG8gc2VlIHdoYXQncyBkdWUgdG9kYXkgYW5kIHRvbW9ycm93LCBhbmQgdGhlIn0sDQogICAgICAgIHsiUmVtZW1iZXIgVGhlIE1pbGsgLSBTZXJ2aWNlcyAvIFJlbWVtYmVyIFRoZSBNaWxrIGZvciBpUGFkIC8gRkFRIiwgIkhvdyBkbyBJIGdldCByaWQgb2Ygc29tZSBjYXJkcz8gSWYgeW91J3JlIGZpbmlzaGVkIHZpZXdpbmcgYSB0YXNrLiBDYW4gSSBzaGFyZSBsaXN0cyB3aXRoIG90aGVyIFJlbWVtYmVyIFRoZSBNaWxrIHVzZXJzPyBXaGlsZSB0aGUgYXBwIGRvZXNuJ3QgY3VycmVudGx5IC4uLiJ9LA0KICAgICAgICB7IkdldCBPcmdhbml6ZWQgd2l0aCBSZW1lbWJlciB0aGUgTWlsayIsICJMZXQncyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgUmVtZW1iZXIgdGhlIE1pbGsncyBiYXNpYyBhbmQgbW9yZSAuLi4gdGFicyBiYXNlZCBvbiB3aGVuIHRoZXkncmUgZHVlOiB0b2RheSwgdG9tb3Jyb3csIGFuZCBvdmVyZHVlLiBPbmNlIHlvdSBkbywgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgYSB0YXNrIGJveCB3aWxsIGNvbnRhaW4gZWRpdGFibGUgZGV0YWlscyBhYm91dCB0aGF0IHRhc2suIn0sDQogICAgfSk7DQogICAgY2FjaGVkU2VhcmNoRW5naW5lRGF0YS5wdXQoInJlbWVtYmVyK3RvK2J1eSttaWxrK3RvbW9ycm93K2Zyb20rdHJhZGVyK2pvZXMiLCBuZXcgU3RyaW5nW11bXXsNCiAgICAgICAgeyJXaGF0IEkgYnV5IGF0IFRyYWRlciBKb2UncyAtIDEwMCBEYXlzIG9mIFJlYWwgRm9vZCIsICIgRmlyc3Qgb2YgYWxsLCBJIGRvbid0IGRvIGFsbCBteSBzaG9wcGluZyBhdCBUcmFkZXIgSm9lJ3MgKEkgZ2V0IHByb2R1Y2UsIGRhaXJ5LCBhbmQgb3RoZXIgaXRlbXMgYXQgLi4uLiBJIHVzZSB0aGUgb2xpdmUgb2lsLCBJIGJ1eSBteSBtaWxrIGFuZCBlZ2dzIGZyb20gdGhlbS4gLi4uIFJlbWVtYmVyIEknbSB0YWxraW5nIHJhdyBub24taG9tb2dlbml6ZWQgd2hpY2ggaXMgZXZlbiBtb3JlIGRlbGljYXRlLiJ9LA0KICAgICAgICB7IlRyYWRlciBKb2UncyBMaXN0OiBHbHV0ZW4gRnJlZSBMaXN0IiwgIlRoYXQncyBvbmUgd2F5IHRvIHJlbWVtYmVyIGl0LiAuLi4gSSd2ZSBiZWVuIGdldHRpbmcgcmVhY3Rpb25zIHRvIG11Y2ggb2Ygd2hhdCBJIGJ1eSBhdCBUcmFkZXIgSm9lJ3MuIC4uLiBUaGUgcmljZSBtaWxrIGlzIG1hZGUgYnkgdGhlIHNhbWUgY29tcGFueSB0aGF0IG1ha2VzIFJpY2UgRHJlYW0gYW5kIFJpY2UgRHJlYW0gdXNlcyBiYXJsZXkgZ2x1dGVuIGluIHRoZSBwcm9jZXNzLCB0aGFuIGNsYWltcyBpdCBpcyB0YWtlbiAuLi4ifSwNCiAgICAgICAgeyJCUEEtRnJlZSBWZXJzaW9ucyBvZiBQb3B1bGFyIEZvb2RzIHwgTWFyaydzIERhaWx5IEFwcGxlIiwgIkhlcmUncyBhIGxpc3Qgb2YgQlBBLWZyZWUgY29jb251dCBtaWxrLCBmaXNoLCBwdW1wa2luLCBhbmQgdG9tYXRvZXMuIC4uLiBhbmQgc29tZSAobGlrZSBUcmFkZXIgSm9lJ3MpIGRvbid0IGV2ZW4gcHV0IHRoZSBsYWJlbCBvbiB0aGVpciBwcm9kdWN0cy4gLi4uLiBidXQganVzdCByZW1lbWJlciB0byBjaGVjayB3aXRoIHRoZSBzdXBwbGllciBiZWZvcmUgbWFraW5nIHlvdXIgcHVyY2hhc2UuIC4uLi4uIFBvbGxzIGdvIHVwIHRvbW9ycm93ISBodHRwOi8vdC5jby9hT2EyQnNmNSAyIGRheXMgYWdvOyBDb250ZXN0IFBvbGw6IDIwMTIgUHJpbWFsIn0sDQogICAgICAgIHsiVHJhZGVyIEpvZXMgT3BlbnMgaW4gUGxhbm8gVFggVG9tb3Jyb3ciLCAiSSBsb3ZlIHRoZWlyIHVuc3dlZXRlbmVkIHZhbmlsbGEgYWxtb25kIG1pbGshIC4uLi4gSSBsb3ZlIFRyYWRlciBKb2VzLCBhbmQgd2lsbCBnbyBvdXQgb2YgbXkgd2F5IHRvIHN0b3AgYXQgdGhlIG9uZSBpbiBTYW50YSBGZSwgTk0gZXZlcnkgdGltZSBJIGdvIn0sDQogICAgICAgIHsiTXkgRmF2b3JpdGUgVHJhZGVyIEpvZSdzIFBhbnRyeSBJdGVtcyIsICJCZWNhdXNlIEknbSBzb21ld2hhdCBvYnNlc3NlZCB3aXRoIHNob3BwaW5nIGF0IFRyYWRlciBKb2UncywgcGVvcGxlIGFsd2F5cyAuLi4uLiBTZWUgeW91IHRvbW9ycm93IG5pZ2h0ISAuLi4uIEkgYmFrZSB3aXRoIHRoZSBhbG1vbmQgbWVhbCBvZnRlbiBhbmQgYnV5IHRoZSBmcmVzaCBhbG1vbmQgbWlsayAoYmx1ZSBjb250YWluZXIpLCAuLi4uIEkgcmVtZW1iZXIgSSB1c2VkIHRvIGdldCBleGNpdGVkIHRvIGdvIHNob3BwaW5nIGF0IHRoZSBtYWxsLCBub3cgSSBoYXZlIHRob3NlIHNhbWUgZmVlbGluZ3MgdG93YXJkcyBUSidzLiJ9LA0KICAgIH0pOw0KICAgIGNhY2hlZFNlYXJjaEVuZ2luZURhdGEucHV0KCJyZW1lbWJlcit0bytidXkrbWlsayt0b21vcnJvdytmcm9tKzMrdG8ram9uZXMiLCBuZXcgU3RyaW5nW11bXXsNCiAgICAgICAgeyJNeSBtb20gd2FudHMgbWUgdG8gZ2V0IHNvbWUgZ3JvY2VyaWVzLi4uIC0gUGFnZSAzIC0gU29jaWFsIEFueGlldHkiLCAiV2hlbiB5b3UgZ28gdGhlIHRoZSBzdG9yZSBhbmQgYnV5IHNvbWUgbWlsayB5b3Ugc2hvdWxkIHRlbGwgZXZlcnlvbmUgaW4gbGluZSB3aG8gZGFyZXMgdG8gbG9vayBhdCB5b3UgZnVubnkgeWVhaCB0aGF0J3MgcmlnaHQgSSdtIGJ1eWluZyBtaWxrLiJ9LA0KICAgICAgICB7Ik1lbiBpbiBCbGFjayAzIFF1b3RlcyAtICdJcyB0aGVyZSBhbnlib2R5IGhlcmUgd2hvIGlzIG5vdCBhbiBhbGllbj8nIiwgIk1lbiBpbiBCbGFjayAzIHF1b3RlcyBhcmUgYSBtaXhlZCBiYWcgYnV0IGl0IGhhcyBhIHNlcmllcyBvZiBva2F5IGdhZ3Mgd2l0aCAuLi4gd2l0aCBoaXMgZGVhZC1vbiBpbXByZXNzaW9uIG9mIFRvbW15IExlZSBKb25lcyBhcyB5b3VuZyBBZ2VudCBLLiBUaGUgYmVzdCAuLi4uLiBbYXMgbm8gb25lIHNlZW1zIHRvIHJlbWVtYmVyIEsgYXQgTUlCIGhlYWRxdWFydGVycywgSiB0aGlua3MgZXZlcnlib2R5IGlzIC4uLiBbdGhlIGFnZW50IHRoYXQgaGFkIGdvbmUgdG8gZ2V0IEogc29tZSBjaG9jb2xhdGUgbWlsayBjb21lcyB1cCB0byBKIHdpdGggdGhlIG1pbGtdIn0sDQogICAgICAgIHsiSG93IHRvIGdldCB3ZWVkIG91dCBvZiB5b3VyIHN5c3RlbSBGYXN0IiwgIk9uY2UgeW91IGdldCBob21lIHlvdSBhcmUgZ29pbmcgdG8gaW1taWRpYXRseSBzdGFydCBkcmlua2luZyB0aGUgLi4uLiBmb3IgZm91ciBob3Vycy4uLiByZW1lbWJlciBubyB0b3hpbnMgNDggaG91cnMgYmVmb3JlIGFuZCBubyBhbGNvaG9sIC4uLi4gUm9iZXJ0IEpvbmVzIDIgeWVhcnMgYWdvIC4uLiB0aGlzIG1vbnRoLiB3aGF0IGFyZSBteSBjaGFuY2VzIG9mIHBhc3NpbmcgbXkgdGVzdCB0b21vcnJvdz8gLi4uLi4gSSBjYW4ndCBkcmluayBtaWxrIG5vciBhbnkganVpY2VzIGJlY2F1c2Ugb2YgbXkgaHlwZXJhY2lkaXR5IChHRVJEKS4ifSwNCiAgICAgICAgeyJEb3VibGVKb25lcyBCbG9nIC0gdGlkYml0cyBvZiBsb3ZlLCBsaWZlLCBsYXVnaHRlciwgYW5kIGZvb2QiLCAiSXQncyBzb21ldGltZXMgaGFyZCB0byBmdW5jdGlvbiBhbmQgaGFyZCB0byB3YW50IHRvIGdldCBvdXQgb2YgYmVkIC4uLiBQb3N0ZWQgaW4gYmFieSBhbWVsaWEgfCAzIENvbW1lbnRzILsgLi4uIEkgcmVhbGl6ZWQgdGhhdCB0aW1lIGhhcyBnb3R0ZW4gYXdheSBmcm9tIG1lLCBmb3IgdG9tb3Jyb3cgQW1lbGlhIHdvdWxkIGhhdmUgYmVlbiBmb3VyIHdlZWtzIG9sZC4gLi4uIGJ5IG5vdywgYW5kIGhvcGVmdWxseSwgaGFkIGJlY29tZSBhbiBhY2NvbXBsaXNoZWQgbWlsay1jb3cuIC4uLi4gQW5kIHRoZW4gSSByZW1lbWJlcmVkLiJ9LA0KICAgICAgICB7Ikplcm1haW5lIEpvbmVzIC0gTWlsayBDaG9jb2xhdGUgU2hpdGNhbm5lZCB8IFZvdGUgZm9yIHRoZSBXb3JzdCIsICJKSm9uZXNBSTExLiBndWVzcyBpIGFtIHRoZSBqZW5uaWZlciBodWRzb24gb2YgdGhlIG5ldyBhbWVyaWNhbiBpZG9sLi4uLiA6KSBpbGwgdGFrZSBpdCAhISEhISAifSwNCiAgICB9KTsNCiAgICBjYWNoZWRTZWFyY2hFbmdpbmVEYXRhLnB1dCgicmVtZW1iZXIrdG8rYnV5K21pbGsrdG9tb3Jyb3crZnJvbSt0aGlyZCt0bytqb25lcyIsIG5ldyBTdHJpbmdbXVtdew0KICAgICAgICB7Ik15IG1vbSB3YW50cyBtZSB0byBnZXQgc29tZSBncm9jZXJpZXMuLi4gLSBQYWdlIDMgLSBTb2NpYWwgQW54aWV0eSIsICJXaGVuIHlvdSBnbyB0aGUgdGhlIHN0b3JlIGFuZCBidXkgc29tZSBtaWxrIHlvdSBzaG91bGQgdGVsbCBldmVyeW9uZSBpbiBsaW5lIHdobyBkYXJlcyB0byBsb29rIGF0IHlvdSBmdW5ueSB5ZWFoIHRoYXQncyByaWdodCBJJ20gYnV5aW5nIG1pbGsuIn0sDQogICAgICAgIHsiTWVuIGluIEJsYWNrIDMgUXVvdGVzIC0gJ0lzIHRoZXJlIGFueWJvZHkgaGVyZSB3aG8gaXMgbm90IGFuIGFsaWVuPyciLCAiTWVuIGluIEJsYWNrIDMgcXVvdGVzIGFyZSBhIG1peGVkIGJhZyBidXQgaXQgaGFzIGEgc2VyaWVzIG9mIG9rYXkgZ2FncyB3aXRoIC4uLiB3aXRoIGhpcyBkZWFkLW9uIGltcHJlc3Npb24gb2YgVG9tbXkgTGVlIEpvbmVzIGFzIHlvdW5nIEFnZW50IEsuIFRoZSBiZXN0IC4uLi4uIFthcyBubyBvbmUgc2VlbXMgdG8gcmVtZW1iZXIgSyBhdCBNSUIgaGVhZHF1YXJ0ZXJzLCBKIHRoaW5rcyBldmVyeWJvZHkgaXMgLi4uIFt0aGUgYWdlbnQgdGhhdCBoYWQgZ29uZSB0byBnZXQgSiBzb21lIGNob2NvbGF0ZSBtaWxrIGNvbWVzIHVwIHRvIEogd2l0aCB0aGUgbWlsa10ifSwNCiAgICAgICAgeyJIb3cgdG8gZ2V0IHdlZWQgb3V0IG9mIHlvdXIgc3lzdGVtIEZhc3QiLCAiT25jZSB5b3UgZ2V0IGhvbWUgeW91IGFyZSBnb2luZyB0byBpbW1pZGlhdGx5IHN0YXJ0IGRyaW5raW5nIHRoZSAuLi4uIGZvciBmb3VyIGhvdXJzLi4uIHJlbWVtYmVyIG5vIHRveGlucyA0OCBob3VycyBiZWZvcmUgYW5kIG5vIGFsY29ob2wgLi4uLiBSb2JlcnQgSm9uZXMgMiB5ZWFycyBhZ28gLi4uIHRoaXMgbW9udGguIHdoYXQgYXJlIG15IGNoYW5jZXMgb2YgcGFzc2luZyBteSB0ZXN0IHRvbW9ycm93PyAuLi4uLiBJIGNhbid0IGRyaW5rIG1pbGsgbm9yIGFueSBqdWljZXMgYmVjYXVzZSBvZiBteSBoeXBlcmFjaWRpdHkgKEdFUkQpLiJ9LA0KICAgICAgICB7IkRvdWJsZUpvbmVzIEJsb2cgLSB0aWRiaXRzIG9mIGxvdmUsIGxpZmUsIGxhdWdodGVyLCBhbmQgZm9vZCIsICJJdCdzIHNvbWV0aW1lcyBoYXJkIHRvIGZ1bmN0aW9uIGFuZCBoYXJkIHRvIHdhbnQgdG8gZ2V0IG91dCBvZiBiZWQgLi4uIFBvc3RlZCBpbiBiYWJ5IGFtZWxpYSB8IDMgQ29tbWVudHMguyAuLi4gSSByZWFsaXplZCB0aGF0IHRpbWUgaGFzIGdvdHRlbiBhd2F5IGZyb20gbWUsIGZvciB0b21vcnJvdyBBbWVsaWEgd291bGQgaGF2ZSBiZWVuIGZvdXIgd2Vla3Mgb2xkLiAuLi4gYnkgbm93LCBhbmQgaG9wZWZ1bGx5LCBoYWQgYmVjb21lIGFuIGFjY29tcGxpc2hlZCBtaWxrLWNvdy4gLi4uLiBBbmQgdGhlbiBJIHJlbWVtYmVyZWQuIn0sDQogICAgICAgIHsiSmVybWFpbmUgSm9uZXMgLSBNaWxrIENob2NvbGF0ZSBTaGl0Y2FubmVkIHwgVm90ZSBmb3IgdGhlIFdvcnN0IiwgIkpKb25lc0FJMTEuIGd1ZXNzIGkgYW0gdGhlIGplbm5pZmVyIGh1ZHNvbiBvZiB0aGUgbmV3IGFtZXJpY2FuIGlkb2wuLi4uIDopIGlsbCB0YWtlIGl0ICEhISEhICJ9LA0KICAgIH0pOw0KICAgIGNhY2hlZFNlYXJjaEVuZ2luZURhdGEucHV0KCJyZW1lbWJlcit0bytidXkrbWlsayt0b21vcnJvdytmb3IrZm9yK2RldGFpbHMiLCBuZXcgU3RyaW5nW11bXXsNCiAgICAgICAgeyJSZW1lbWJlciBUaGUgTWlsayAtIFNlcnZpY2VzIC8gUmVtZW1iZXIgVGhlIE1pbGsgZm9yIEVtYWlsIiwgInRvIFJlbWVtYmVyIFRoZSBNaWxrIGp1c3QgYnkgc2VuZGluZyBhbiBlbWFpbCB0byBhIHNwZWNpYWwgYWRkcmVzcy4gUmVhZCB0aGlzIHBhZ2UgdG8gbGVhcm4gYWxsIHRoZSBkZXRhaWxzLCBhbmQgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBydW4gaW50byBhbnkgLi4uLiBlbWFpbCBhZGRyZXNzXSBCdXkgYmlydGhkYXkgcHJlc2VudCBmb3IgTWlrZSB0b2RheSBQYXkgdGhlIHBob25lIGJpbGwgdG9tb3Jyb3cgTWFrZSJ9LA0KICAgICAgICB7IlNlcnZpY2VzIC8gUmVtZW1iZXIgVGhlIE1pbGsgZm9yIEFuZHJvaWQgLyBGZWF0dXJlcyIsICJTeW5jIHdpdGggUmVtZW1iZXIgVGhlIE1pbGsgb25saW5lIChsaW1pdCBvbmNlIGV2ZXJ5IDI0IGhvdXJzKS4gLi4uIGluY2x1ZGUgZXh0cmEgZGV0YWlscyBhYm91dCB0YXNrcyBpbiB0aGUgJ0FkZCB0YXNrJyBiYXIgKGUuZy4sIFBpY2sgdXAgdGhlIG1pbGsgdG9tb3Jyb3cpLiAuLi4gRGV0ZWN0IHlvdXIgY3VycmVudCBsb2NhdGlvbiB0byBzZWUgbmVhcmJ5IHRhc2tzOyBwbGFuIHRoZSBiZXN0IHdheSB0byBnZXQgdGhpbmdzIGRvbmUuIn0sDQogICAgICAgIHsiUmVtZW1iZXIgVGhlIE1pbGsgLSBHZXR0aW5nIFN0YXJ0ZWQiLCAiVGhpcyBndWlkZSBpcyBpbnRlbmRlZCBhcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byB1c2luZyBSZW1lbWJlciBUaGUgTWlsay4gLi4uIHlvdSBjYW4gc2VsZWN0IGl0IGluIHRoZSBsaXN0IGJlbG93IGFuZCB1c2UgdGhlIHRhc2sgZGV0YWlscyBib3ggb24gdGhlIHJpZ2h0LiAuLi4gVGhlIG92ZXJ2aWV3IHNjcmVlbiBpcyBhIGhhbmR5IHdheSB0byBzZWUgd2hhdCdzIGR1ZSB0b2RheSBhbmQgdG9tb3Jyb3csIGFuZCB0aGUifSwNCiAgICAgICAgeyJSZW1lbWJlciBUaGUgTWlsayAtIFNlcnZpY2VzIC8gUmVtZW1iZXIgVGhlIE1pbGsgZm9yIGlQYWQgLyBGQVEiLCAiSG93IGRvIEkgZ2V0IHJpZCBvZiBzb21lIGNhcmRzPyBJZiB5b3UncmUgZmluaXNoZWQgdmlld2luZyBhIHRhc2suIENhbiBJIHNoYXJlIGxpc3RzIHdpdGggb3RoZXIgUmVtZW1iZXIgVGhlIE1pbGsgdXNlcnM/IFdoaWxlIHRoZSBhcHAgZG9lc24ndCBjdXJyZW50bHkgLi4uIn0sDQogICAgICAgIHsiR2V0IE9yZ2FuaXplZCB3aXRoIFJlbWVtYmVyIHRoZSBNaWxrIiwgIkxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCBSZW1lbWJlciB0aGUgTWlsaydzIGJhc2ljIGFuZCBtb3JlIC4uLiB0YWJzIGJhc2VkIG9uIHdoZW4gdGhleSdyZSBkdWU6IHRvZGF5LCB0b21vcnJvdywgYW5kIG92ZXJkdWUuIE9uY2UgeW91IGRvLCBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBhIHRhc2sgYm94IHdpbGwgY29udGFpbiBlZGl0YWJsZSBkZXRhaWxzIGFib3V0IHRoYXQgdGFzay4ifSwNCiAgICB9KTsNCiAgICBjYWNoZWRTZWFyY2hFbmdpbmVEYXRhLnB1dCgicmVtZW1iZXIrdG8rYnV5K21pbGsrdG9tb3Jyb3crZnJvbSt0aGlyZCt0bytqb2VzIiwgbmV3IFN0cmluZ1tdW117DQogICAgICAgIHsiUmVtZW1iZXIgVGhlIE1pbGsgLSBTZXJ2aWNlcyAvIFJlbWVtYmVyIFRoZSBNaWxrIGZvciBFbWFpbCIsICJ0byBSZW1lbWJlciBUaGUgTWlsayBqdXN0IGJ5IHNlbmRpbmcgYW4gZW1haWwgdG8gYSBzcGVjaWFsIGFkZHJlc3MuIFJlYWQgdGhpcyBwYWdlIHRvIGxlYXJuIGFsbCB0aGUgZGV0YWlscywgYW5kIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgcnVuIGludG8gYW55IC4uLi4gZW1haWwgYWRkcmVzc10gQnV5IGJpcnRoZGF5IHByZXNlbnQgZm9yIE1pa2UgdG9kYXkgUGF5IHRoZSBwaG9uZSBiaWxsIHRvbW9ycm93IE1ha2UifSwNCiAgICAgICAgeyJCUEEtRnJlZSBWZXJzaW9ucyBvZiBQb3B1bGFyIEZvb2RzIHwgTWFyaydzIERhaWx5IEFwcGxlIiwgIkhlcmUncyBhIGxpc3Qgb2YgQlBBLWZyZWUgY29jb251dCBtaWxrLCBmaXNoLCBwdW1wa2luLCBhbmQgdG9tYXRvZXMuIC4uLiBhbmQgc29tZSAobGlrZSBUcmFkZXIgSm9lJ3MpIGRvbid0IGV2ZW4gcHV0IHRoZSBsYWJlbCBvbiB0aGVpciBwcm9kdWN0cy4gLi4uLiBidXQganVzdCByZW1lbWJlciB0byBjaGVjayB3aXRoIHRoZSBzdXBwbGllciBiZWZvcmUgbWFraW5nIHlvdXIgcHVyY2hhc2UuIC4uLi4uIFBvbGxzIGdvIHVwIHRvbW9ycm93ISBodHRwOi8vdC5jby9hT2EyQnNmNSAyIGRheXMgYWdvOyBDb250ZXN0IFBvbGw6IDIwMTIgUHJpbWFsIn0sDQogICAgICAgIHsiMjAgQmVzdCBPbmxpbmUgVG8gRG8gTGlzdCBBcHBzIGZvciBGcmVlbGFuY2VycyIsICJSZW1lbWJlciB0aGUgTWlsayBpcyBhIHdlYiBhcHBsaWNhdGlvbiB3aXRoIG51bWVyb3VzIG1vYmlsZSBhcHAgLi4uIGNvbXBsZXRlIHRvZGF5IHdpbGwgYXV0b21hdGljYWxseSBnZXQgbW92ZWQgdG8gdGhlIHRvbW9ycm93IGNvbHVtbi4ifSwNCiAgICAgICAgeyJIYXJ2ZXkgTWlsayAtIFdpa2lwZWRpYSwgdGhlIGZyZWUgZW5jeWNsb3BlZGlhIiwgIkEgYmxhY2sgYW5kIHdoaXRlIHBob3RvZ3JhcGggb2YgSGFydmV5IE1pbGsgc2l0dGluZyBhdCB0aGUgbWF5b3IncyBkZXNrIC4uLi4gSW4gMTk1NiwgaGUgbWV0IEpvZSBDYW1wYmVsbCwgYXQgdGhlIEphY29iIFJpaXMgUGFyayBiZWFjaCwgYSBwb3B1bGFyIGxvY2F0aW9uIGZvciAuLi4uIGJ1dCByZW1lbWJlcmVkIE1pbGsncyBhdHRpdHVkZTogSSB0aGluayBoZSB3YXMgaGFwcGllciB0aGFuIGF0IGFueSB0aW1lIEkgaGFkIGV2ZXIgLi4uLiBIZSBvZnRlbiByZXBlYXRlZCBoaXMgcGhpbG9zb3BoeSB0aGF0IGdheXMgc2hvdWxkIGJ1eSBmcm9tIGdheSBidXNpbmVzc2VzLiJ9LA0KICAgICAgICB7IlRlc3QgVXR0ZXJhbmNlcyAtIE1JVCIsICJyZW1lbWJlciB0byBwaWNrIHVwIG1pbGsgYXQgc2V2ZW4gKHNtc3RlMDAwMDYpIGdldCBzb21lIGNsZWFuaW5nIHN1cHBsaWVzIGF0IC4uLiB0b21vcnJvdyAoc21zdGUwMDAyNSkgY2FuIHdlIGhhdmUgYSBxdWljayBkaW5uZXIgdGhpcyB3ZWVrIChzbXN0ZTAwMDI2KSAuLi4uLiAoc21zdGUwMDIxNykgcmVtaW5kIG1lIHRvIGNhbGwgZXN0ZWZhbmErMSBvbiB0aGUgdHdlbnR5IHRoaXJkIChzbXN0ZTAwMjE4KSAuLi4gb2Ygam9lJ3MrMiBjb2ZmZWUrMiBzaG9wKzIgdGhlbiB3ZSdsbCBnbyB0b2dldGhlciAoc21zdGUwMDIyMCkgY2FuIHdlIGhhdmUgYSJ9LA0KICAgIH0pOw0KICAgIGNhY2hlZFNlYXJjaEVuZ2luZURhdGEucHV0KCJyZW1lbWJlcit0bytidXkrbWlsayt0b21vcnJvdytmcm9tK2ZvcitkK2pvbmVzIiwgbmV3IFN0cmluZ1tdW117DQogICAgICAgIHsiZGpvbmVzIC0gUm9jayBJc2xhbmQvTWlsYW4gU2Nob29sIERpc3RyaWN0ICM0MSIsICJJdGVtIDM2MSAtIDM4MCCWIFByb2ZpbGUgcGljdHVyZSBvZiBkam9uZXMuIGRqb25lcy4gQGRqb25lcyBhY3RpdmUgNiBtb250aHMsIDMgd2Vla3MgYWdvIC4uLiBUaGVyZSBhcmUgbWFueSBidXkgb25lLCBnZXQgb25lIGZyZWUgb2ZmZXJzIGZvciBhcmVhIHJlc3RhdXJhbnRzLCBtdXNldW1zLCB6b28sIHNwb3J0aW5nIGV2ZW50cywgZXRjLiAuLi4gVmlja2kgVG9kZCB3cm90ZSBhIG5ldyBibG9nIHBvc3Q6IFBMRUFTRSBSRU1FTUJFUoUgLi4uIE5PVEU6IGFsdGhvdWdoIHdlIGNvbGxlY3QgU3dpc3MgVmFsbGV5IG1pbGsgY2FwcyBhbmQgQ2FtcGJlbGwncyJ9LA0KICAgICAgICB7IkQtSm9uZXMgKGRjb21wbGV4MTIpIG9uIFR3aXR0ZXIiLCAiRC1Kb25lcy4gQGRjb21wbGV4MTIuIEp1c3QgdHJ5bmEgdGFrZSBvdmVyIHRoZSBXb3JsZC4uLk5vdGhpbmcgTWFqb3IuICNUZWFtR05BVElPTiBTQUxVVEUhISEgQ1NULSBTdGFtZm9yZCC3IGh0dHA6Ly9Xd3cuZmFjZWJvb2suY29tL2Rjb21wbGV4MTIgIn0sDQogICAgICAgIHsiVGFnZ2VkIC0gRGFtYXlhIExhZHkgRCBKb25lcydzIFByb2ZpbGUiLCAiSm9pbiBUYWdnZWQgYW5kIGJlIGZyaWVuZHMgd2l0aCBEYW1heWEgTGFkeSBEIEpvbmVzIC0gaXQncyBmcmVlISAuLi4gUHVycG9zZSBEcml2ZW4gTGlmZSBieSBSaWNrIFdhcnJlbiwgTWlsayBJbiBNeSBDb2ZmZWUgYnkgRXJpYyBKZXJvbWUgRGlja2V5LCAuLi4gSSBrbm93IHRvbW9ycm93IGlzIG5vdCBwcm9taXNlZCBzbyBJIGFsd2F5cyB0cnkgdG8gcmVtZW1iZXIgdG8gY2hlcmlzaCBMSUZFIGJlY2F1c2UifSwNCiAgICB9KTsNCiAgICANCiAgICBjYWNoZWRTZWFyY2hFbmdpbmVEYXRhLnB1dCgiSG93K2NhbitJK3BheSt0YXgrb24rbXkraW5jb21lK2Ficm9hZCIsIG5ldyBTdHJpbmdbXVtdew0KICAgICAgICB7IkFzayBTdGFjeTogRG8gSSBIYXZlIHRvIFBheSBUYXhlcyBJZiBJJ20gTm90IGluIHRoZSBVUz8iLCAiWW91J2QgdGhpbmsgdGhhdCBpZiB5b3UncmUgbGl2aW5nIGFicm9hZCBhbmQgZWFybmluZyBhbGwgeW91ciBtb25leSBmcm9tIGEgZm9yZWlnbiAuLi4gTXkgc29uIGhhcyBiZWVuIGxpdmluZyBvdXQgb2YgdGhlIGNvdW50cnkgZm9yIHRoZSBsYXN0IGZpdmUgeWVhcnMgYnV0IGlzIG1vdmluZyBiYWNrIC4uLiBDb3VsZCBoZSBiZSByZXNwb25zaWJsZSB0byBwYXkgd2hlbiB0aGVyZSdzIG5vIGluY29tZT8ifSwNCiAgICAgICAgeyJEbyBJIGhhdmUgdG8gcGF5IFVTIHRheGVzIHdoZW4gSSB3b3JrIGFicm9hZD8iLCAiRXZlbiBpZiB5b3UgYXZvaWQgVS5TLiBpbmNvbWUgdGF4LCB5b3Ugd2lsbCBsaWtlbHkgcGF5IHNvbWUgZm9ybSBvZiBpbmNvbWUgdGF4IHRvIHRoZSAuLi4gTXkgc29uIGlzIHdvcmtpbmcgb3ZlcnNlYXMgYW5kIHBheXMgYWxsIHRheGVzIGFuZCBoZWFsdGggaW5zdXJhbmNlIHRoZXJlLiJ9LA0KICAgICAgICB7IkJpZyBQYXljaGVja3MsIFRpbnkgVGF4IEJ1cmRlbnM6IEhvdyAyMSwwMDAgV2VhbHRoeSBBbWVyaWNhbnMiLCAiJDIuOCBiaWxsaW9uLCBidXQgc2hlIGRpZCBub3QgcGF5IGEgZGltZSBpbiBzdGF0ZSBpbmNvbWUgdGF4IGluIDIwMTAsIHRoZSAuLi4gaW52ZXN0aW5nIGluIGxvY2FsIGFuZCBzdGF0ZSBnb3Zlcm5tZW50cywgZWFybmluZyBtb25leSBvdmVyc2VhcyBhbmQgLi4uIEkgd2FudCBteSB0YXggZG9sbGFycyB0byBnbyB0byBteSBjaGlsZHJlbidzIHNjaG9vbHMsIG5vdCB0aGUgcHJlc2lkZW50IG9mIEdFIn0sDQogICAgICAgIHsiVS5TLiBDaXRpemVucyBMaXZpbmcgQWJyb2FkIFRheGVzOiBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyIsIkZvciB0aGUgVW5pdGVkIFN0YXRlcyBpbmNvbWUgdGF4IHJldHVybiwgeW91IHdpbGwgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgYXZhaWxhYmxlIHRvIHlvdSByZWdhcmRpbmcgY2xhaW1pbmcgYSAuLi4uIE15IGVtcGxveWVyIHdpdGhoZWxkIHRoZSB0YXhlcyBmcm9tIG15IHBheS4ifSwNCiAgICAgICAgeyJHb2luZyB0byBXb3JrIEFicm9hZCAtIFJldmVudWUgQ29tbWlzc2lvbmVycyIsICJBIGd1aWRlIHRvIElyaXNoIGluY29tZSB0YXggYW5kIGNhcGl0YWwgZ2FpbnMgdGF4IGxpYWJpbGl0eSBiYXNlZCBvbiBzb21lIGNvbW1vbmx5IC4uLiBJbiBnZW5lcmFsLCB0YXggaXMgZGVkdWN0ZWQgZnJvbSB5b3VyIHNhbGFyeSB0aHJvdWdoIHdoYXQgaXMga25vd24gYXMgdGhlIFBheSBBcyBZb3UgRWFybiAoUEFZRSkgLi4uLi4gV2hhdCBoYXBwZW5zIGlmIG15IGluY29tZSBpcyBhbHNvIHRheGFibGUgYWJyb2FkPyJ9LA0KICAgICAgICB7IlRheCBvbiBvdmVyc2VhcyBpbmNvbWUgOiBEaXJlY3Rnb3YgLSBNb25leSwgdGF4IGFuZCBiZW5lZml0cyIsICJJZiB5b3UgbGl2ZSBpbiB0aGUgVUsgcGVybWFuZW50bHkgeW91J2xsIHBheSB0YXggb24gb3ZlcnNlYXMgaW5jb21lLiBJZiB5b3UgbGl2ZSBoZXJlIHRlbXBvcmFyaWx5LCB5b3UnbGwgbm9ybWFsbHkgcGF5IHRheCBvbmx5IG9uIG92ZXJzZWFzIGluY29tZSB5b3UgYnJpbmcgaW50byJ9LA0KICAgICAgICB7IkZBUXMgLSBBQVJPIC0gQXNzb2NpYXRpb24gb2YgQW1lcmljYW5zIFJlc2lkZW50IE92ZXJzZWFzIiwgIkFsbCBteSBpbmNvbWUgY29tZXMgZnJvbSBteSBob3N0IGNvdW50cnkgYW5kIEkgcGF5IHBsZW50eSBvZiB0YXhlcyB0aGVyZSEgLi4uIGlzIHRoYXQgZWFybmVkIGluY29tZSBmcm9tIG92ZXJzZWFzIGNhbiBiZSBleGVtcHRlZCBmcm9tIFVTIGluY29tZSB0YXggKGJ1dCBvbmx5IC4uIn0sDQogICAgfSk7DQogICAgY2FjaGVkU2VhcmNoRW5naW5lRGF0YS5wdXQoIkNhbitJK2VzdGltYXRlK3doYXQrbXkraW5jb21lK3RheCt3b3VsZCtiZStieSt1c2luZytteStsYXN0K3BheSIsIG5ldyBTdHJpbmdbXVtdew0KICAgICAgICB7IkhvdyBkbyBJIGVzdGltYXRlIG15IHRheCByZXR1cm4gd2l0aCBteSBsYXN0IHBheSBzdHViIiwgIkhvdyBkbyBJIGVzdGltYXRlIG15IHRheCByZXR1cm4gd2l0aCBteSBsYXN0IHBheSBzdHViPyAuLi4gbm8gZGVwZW5kZW50cywgeW91ciBub24gdGF4YWJsZSBpbmNvbWUgaXMgJDkzNTAsIGFueSBleGNlc3Mgb2YgdGhhdCB3aWxsIGJlIHRheGVkIGF0IC4uLiBVc2luZyBteSBwYXkgc3R1YiBmb3IgdGF4ZXMgZmlsZSBteSB0YXhlcywgaXMgSC5SLmJsb2NrLiAgQ2FuIEkgdXNlIG9ubHkgbXkgbGFzdCBwYXlzdHViIHRvIGRvIG15IHRheGVzICJ9LA0KICAgICAgICB7IklSUyBXaXRoaG9sZGluZyBDYWxjdWxhdG9yIiwgIllvdSBjYW4gdXNlIHlvdXIgcmVzdWx0cyBmcm9tIHRoZSBjYWxjdWxhdG9yIHRvIGhlbHAgZmlsbCBvdXQgdGhlIGZvcm0uIFdobyBDYW4gQmVuZWZpdCBGcm9tIFRoZSAuLi4gYW5kIGRlZHVjdGlvbnMsIHdobyB3b3VsZCBwcmVmZXIgdG8gaGF2ZSB0YXggb24gdGhhdCBpbmNvbWUgd2l0aGhlbGQgZnJvbSB0aGVpciBwYXljaGVja3MgcmF0aGVyIHRoYW4gbWFrZSBwZXJpb2RpYyBzZXBhcmF0ZSBwYXltZW50cyB0aHJvdWdoIHRoZSBlc3RpbWF0ZWQgdGF4IHByb2NlZHVyZXMifSwNCiAgICAgICAgeyJUYXggRm91bmRhdGlvbidzIFRheCBQb2xpY3kgQ2FsY3VsYXRvciIsICJUaGUgZ29hbCB3aXRoIHRoaXMgY2FsY3VsYXRvciBpcyB0byBzaG93IHRoZSBlZmZlY3RzIG9mIHRoZSBCdXNoIGFuZCBPYmFtYSB0YXggY3V0cyAuLi4gQ2FsY3VsYXRlIE15IEluY29tZSBUYXggLi4uIFRoZSBjYWxjdWxhdG9yIHdpbGwgbm90IGRpc3BsYXkgY29ycmVjdGx5IGlmIG1vcmUgdGhhbiBmb3VyIHNjZW5hcmlvcyBhcmUifSwNCiAgICAgICAgeyJVc2UgVGF4IFF1ZXN0aW9ucyBhbmQgQW5zd2VycyIsIlRoaXMgc2VyaWVzIG9mIHF1ZXN0aW9ucyBhbmQgYW5zd2VycyByZWZlcnMgc3BlY2lmaWNhbGx5IHRvIHRoZSB1c2UgdGF4IGluY3VycmVkIG9uIC4uLiBGb3IgdGF4cGF5ZXJzIHdobyBkbyBub3QgaGF2ZSByZWNvcmRzIHRvIGRvY3VtZW50IHRoZWlyIHVzZSB0YXggbGlhYmlsaXR5LCB0aGUgZGVwYXJ0bWVudCB3aWxsIGVzdGltYXRlIGxpYWJpbGl0eS4gLi4uIEluZGl2aWR1YWwgSW5jb21lIFRheCBSZXR1cm4sIG9uIG9yIGJlZm9yZSBBcHJpbCAxNSBvZiB0aGUgZm9sbG93aW5nIHllYXIgKGZvciB0YXggLi4uIENhbiBJIGZpbGUgYW5kIHBheSBteSB1c2UgdGF4IGVsZWN0cm9uaWNhbGx5PyJ9LA0KICAgICAgICB7IldlYiBQYXkgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyB8IENhbGlmb3JuaWEgRnJhbmNoaXNlIFRheCIsICJXaGF0IHdpbGwgaGFwcGVuIHRvIG15IGluZm9ybWF0aW9uIGlmIEkgbG9nIG91dCBiZWZvcmUgSSBzdWJtaXQgbXkgcmVxdWVzdD8gLi4uIENhbiBJIHVzZSBXZWIgUGF5IGlmIG15IGxhc3QgbmFtZSBjaGFuZ2VkIGluIDIwMTE/IC4uLiBhbiBlbGVjdHJvbmljIHBheW1lbnQgZnJvbSB5b3VyIGJhbmsgYWNjb3VudCB0byBwYXkgeW91ciBwZXJzb25hbCBhbmQgYnVzaW5lc3MgaW5jb21lIHRheGVzLiAuLi4gRXN0aW1hdGVkIHRheDsgVGF4IHJldHVybjsgQmlsbGluZyBub3RpY2U7IEV4dGVuc2lvbjsgTm90aWNlIG9mIFByb3Bvc2VkIEFzc2Vzc21lbnQ7IFRheCAifSwNCiAgICAgICAgeyJDYW4gSSB1c2UgdHVyYm8gdGF4IHRvIGZpbGUgdXNpbmcgbXkgbGFzdCBwYXlzdHViLCBub3QgbXkgdy0yIiwgIkNhbiBJIHVzZSB0dXJibyB0YXggdG8gZmlsZSB1c2luZyBteSBsYXN0IHBheXN0dWIsIG5vdCBteSB3LTIuIC4uLiBpZiB5b3UgdXNlIHlvdXIgbGFzdCBwYXkgc3R1YiBpdCBkb2VzIG5vdCBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24geW91IG5lZWQsIHVzdWFsbHkgdGhlcmUgLi4uIEkgaG9wZSB5b3UgYXJlIG9ubHkgdHJ5aW5nIHRvIGRvIHNvbWUgaW5pdGlhbCBlc3RpbWF0aW5nIGJ1dCB3aWxsIHdhaXQgdG8gcmVjZWl2ZSB5b3VyIC4uLiBwbGFuLCBubyBpbmNvbWUgd2hpY2ggbWF5IGJlIHJlY2hhcmFjdGVyaXplZCwgbm8gcGVuc2lvbiBwbGFuLCBldGMuIn0sDQogICAgICAgIHsiQ2FuIEkgRmluZCBPdXQgSG93IE11Y2ggSSBXaWxsIEdldCBCYWNrIG9uIE15IFRheGVzIFdpdGhvdXQgTXkgVyIsICJXaGlsZSB5b3Ugd2lsbCBuZWVkIHlvdXIgVy0yIG9yIGEgc3Vic3RpdHV0ZSwgeW91IGNhbiBmaWd1cmUgb3V0IHlvdXIgdGF4IG9ibGlnYXRpb24gLi4uIGZpbmFsIHBheSBzdHViIGZvciBhIGpvYiAoaWYgeW91IGFyZSBubyBsb25nZXIgZW1wbG95ZWQpIG9yIHRoZSBsYXN0IHBheSBzdHViIGZvciB0aGUgeWVhciAuLi4gdGhlIHllYXIsIHlvdSBjYW4gZXN0aW1hdGUgeW91ciBpbmNvbWUgYW5kIHRheGVzIGZyb20gYSBzaW5nbGUgcGF5IHN0dWIuIC4uLiBIb3dldmVyLCBpZiB5b3Ugd29ya2VkIGF0IHRoZSBzYW1lIGpvYiB0aGUgcHJldmlvdXMgeWVhciwgeW91IGNhbiB1c2UgdGhlIC4uLiJ9LA0KICAgIH0pOw0KICB9DQoNCn0NCg==