UEsDBBQACAAIANudzzoAAAAAAAAAAAAAAAAUAAQATUVUQS1JTkYvTUFOSUZFU1QuTUb+ygAAdVFNa8JAEL0H8h+C0EMhWaJtoUQ8tCWXokUq9NLTuI5xdbMbd2cl6a/vJpGohbKn2TfvY2YWoMQWLSVfaKzQKovGLA2DvK60oWQJ/AAFZpE2BUMuRWWRFSCFRM3I02wYfOLRCYPJq1Mb+aeVa4PMOEWixLgF9k4Jmq671uTUW85G3w8sDKJnlsaPLGXp/Si+FgFFnVD3CRXwXfd309NmULpmldeZsD2YymiO1moTBn0wP6DaaJNFdzf1AL9wEicgn2eppeBNFkn4afwmeodk7qsVgaEsIuNw4L1JsHYJtMsiH4wf5tBoR22EmF15X5br39H5FW4FXtw/oMRLtLYaoMX5QoPGZIBWTbluw/bsf280tUIVEsmTZzfZz6fb5DVy146eq5MwWpWo/Jjvk1WejNlTGITBL1BLBwh1MQfjNgEAACcCAABQSwMECgAAAAAATgzKOjfroa4IBwAACAcAABsAAABnYWxpbGVvX3Byb3BlcnRpZXMuc2hzb3VyY2UjIS91c3IvYmluL2VudiBiYXNoDQoNCiMgY29tbW9uIHZhcmlhYmxlcyB1c2VkIGluIHV0aWxpdHkgc2NyaXB0cw0KIyAobm90ZTogYXQgdGhpcyBwb2ludCwgbm90IGFsbCBhcmUgbmVjZXNzYXJpbHkgdXNlZCkNCg0KIyB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSwgdGhhdCBzaG91bGQgImNvbnRhaW4iIGFsbCBlbHNlIGludm9sdmVkIHdpdGggYnVpbGQsIGNvbnRyb2wgYW5kIG91dHB1dA0KZXhwb3J0IEJVSUxEX0hPTUU9L3NoYXJlZC9nYWxpbGVvL2J1Y2t5QnVpbGQNCiMgYSBjb21tb24gdmFyaWF0aW9uIGZvciBzb21lb25lIGRvaW5nIGEgbG9jYWwgYnVpbGQgb24gdGhlaXIgb3duIG1hY2hpbmUNCiNleHBvcnQgQlVJTERfSE9NRT0ke0hPTUV9L2J1Y2t5QnVpbGQNCg0KDQpSRUxFTkdfVE9PTFM9b3JnLmVjbGlwc2UuZ2FsaWxlby50b29scw0KUkVMRU5HX1RFU1RTPW9yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMNCg0KIyBwbGF0Zm9ybSBpbnN0YWxsLiBPbmUgbGV2ZWwgYWJvdmUgd2hhdCB3aWxsIGNvbnRhaW4gdGhlICdlY2xpcHNlJyBkaXJlY3RvcnkuDQpleHBvcnQgRUNMSVBTRV9JTlNUQUxMPSR7QlVJTERfSE9NRX0vcHJlcmVxcw0KZXhwb3J0IEVDTElQU0VfSE9NRT0ke0VDTElQU0VfSU5TVEFMTH0vZWNsaXBzZQ0KZXhwb3J0IEVDTElQU0VfSU5TVEFMTF9URVNUPSR7QlVJTERfSE9NRX0vdGVzdHMNCmV4cG9ydCBFQ0xJUFNFX0hPTUVfVEVTVD0ke0VDTElQU0VfSU5TVEFMTF9URVNUfS9lY2xpcHNlDQoNCiMgY29tbW9uIGxvY2F0aW9uIHRvIHN0b3JlIHByZS1yZXFzIHRvIGF2b2lkIHJlLWRvd25sb2FkaW5nIFBsYXRmb3JtcywgZXRjLg0KZXhwb3J0IFBSRVJFUVNfQ0FDSEU9JHtCVUlMRF9IT01FfS9wcmVyZXFzQ2FjaGUNCg0KDQpleHBvcnQgQU5UX0hPTUU9L3NoYXJlZC9jb21tb24vYXBhY2hlLWFudC0xLjcuMQ0KDQpleHBvcnQgSkFWQV81X0hPTUU9L3NoYXJlZC9jb21tb24vaWJtLWphdmEyLXBwYy01MA0KZXhwb3J0IEpBVkFfNl9IT01FPS9zaGFyZWQvY29tbW9uL2libS1qYXZhLXBwYy02MA0KDQpleHBvcnQgSkFWQV9IT01FPSR7SkFWQV81X0hPTUV9DQoNCmV4cG9ydCBKQVZBX0VYRUNfRElSPSR7SkFWQV9IT01FfS9qcmUvYmluLw0KDQpzdGFnaW5nRGlyZWN0b3J5PS9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvc3RhZ2luZw0KcmVsZWFzZURpcmVjdG9yeT0vaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL2dhbGlsZW8NCg0KIyBIb2xkcyBhIGxpc3Qgb2YgZGF0ZWQgZGlyZWN0b3JpZXMsIGVhY2ggd2l0aCBhIGJ1aWxkIHJlc3VsdA0KQlVJTERfUkVTVUxUUz0ke0JVSUxEX0hPTUV9L2J1aWxkcmVzdWx0cw0KDQojTm90ZTogdGhpcyBkaXJlY3Rvcnkgb24gYnVpbGQuZWNsaXBzZS5vcmcgaGFzIGFuIGFsaWFzIHNvIHRoYXQNCiNpdCBpcyBhY2Nlc3NpYmxlIGFzIGEgcHNldWRvIHVwZGF0ZSBzaXRlIHZpYSB0aGlzIFVSTDogDQojaHR0cDovL2J1aWxkLmVjbGlwc2Uub3JnL2dhbGlsZW8vc3RhZ2luZy8NCg0KI0l0IGNhbiBub3QgcmVhbGx5IGJlIHVzZWQgYXMgYW4gdXBkYXRlIHNpdGUNCiNhcyBhbiB1cGRhdGUgc2l0ZSwgc2luY2UgdGhlIG1pcnJvciBVUkxzIGluIHRoZSANCiNhcnRpZmFjdHMuamFyIGFuZCBjb250ZW50LmphciBhcmUgc2V0IHRvIHRoZSANCiNldmVudHVhbCAvcmVsZWFzZXMvZ2FsaWxlby4gDQojSXQgY2FuIGJlIHVzZWQsIGhvd2V2ZXIsIHRvIG1ha2Ugc3VyZSBjYXRlZ29yaWVzIGFyZSANCiNzaG93aW5nIHVwIGNvcnJlY3RseS4gDQpQSwMECgAAAAAA6ZjPOhqnRhnRCAAA0QgAABMAAABjaGVja0xheW91dC5qYXJkZXNjPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV0lORE9XUy0xMjUyIiBzdGFuZGFsb25lPSJubyI/Pg0KPGphcmRlc2M+DQogICAgPGphciBwYXRoPSJvcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL2NoZWNrTGF5b3V0LmphciIvPg0KICAgIDxvcHRpb25zIGJ1aWxkSWZOZWVkZWQ9InRydWUiIGNvbXByZXNzPSJmYWxzZSIgZGVzY3JpcHRpb25Mb2NhdGlvbj0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvY2hlY2tMYXlvdXQuamFyZGVzYyIgZXhwb3J0RXJyb3JzPSJ0cnVlIiBleHBvcnRXYXJuaW5ncz0idHJ1ZSIgaW5jbHVkZURpcmVjdG9yeUVudHJpZXM9ImZhbHNlIiBvdmVyd3JpdGU9InRydWUiIHNhdmVEZXNjcmlwdGlvbj0idHJ1ZSIgc3RvcmVSZWZhY3RvcmluZ3M9ImZhbHNlIiB1c2VTb3VyY2VGb2xkZXJzPSJmYWxzZSIvPg0KICAgIDxzdG9yZWRSZWZhY3RvcmluZ3MgZGVwcmVjYXRpb25JbmZvPSJ0cnVlIiBzdHJ1Y3R1cmFsT25seT0iZmFsc2UiLz4NCiAgICA8c2VsZWN0ZWRQcm9qZWN0cy8+DQogICAgPG1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIiBtYW5pZmVzdExvY2F0aW9uPSIvb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9InRydWUiIHVzZXNNYW5pZmVzdD0idHJ1ZSI+DQogICAgICAgIDxzZWFsaW5nIHNlYWxKYXI9ImZhbHNlIj4NCiAgICAgICAgICAgIDxwYWNrYWdlc1RvU2VhbC8+DQogICAgICAgICAgICA8cGFja2FnZXNUb1VuU2VhbC8+DQogICAgICAgIDwvc2VhbGluZz4NCiAgICA8L21hbmlmZXN0Pg0KICAgIDxzZWxlY3RlZEVsZW1lbnRzIGV4cG9ydENsYXNzRmlsZXM9ImZhbHNlIiBleHBvcnRKYXZhRmlsZXM9InRydWUiIGV4cG9ydE91dHB1dEZvbGRlcj0idHJ1ZSI+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL2dhbGlsZW9fcHJvcGVydGllcy5zaHNvdXJjZSIvPg0KICAgICAgICA8ZmlsZSBwYXRoPSIvb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy9jaGVja0xheW91dC5qYXJkZXNjIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL2NsZWFudXBCdWlsZFJlc3VsdHMuc2giLz4NCiAgICAgICAgPGZpbGUgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvcGx1Z2luLnhtbCIvPg0KICAgICAgICA8ZmlsZSBwYXRoPSIvb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy9pbnZva2VBbnRSdW5uZXIueG1sIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL3J1blRlc3RzLnhtbCIvPg0KICAgICAgICA8Zm9sZGVyIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL01FVEEtSU5GIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL2dldFJlbGVuZ1Rlc3RzLnNoIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL3ZlcmlmeS5zaCIvPg0KICAgICAgICA8amF2YUVsZW1lbnQgaGFuZGxlSWRlbnRpZmllcj0iPW9yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvc3JjIi8+DQogICAgICAgIDxmb2xkZXIgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvT1NHSS1JTkYiLz4NCiAgICAgICAgPGZpbGUgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvLnByb2plY3QiLz4NCiAgICAgICAgPGZpbGUgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvdmVyaWZ5ZGlyLnNoIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL3J1bkVjbGlwc2VBbnRSdW5uZXIuc2giLz4NCiAgICAgICAgPGZpbGUgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvLmNsYXNzcGF0aCIvPg0KICAgICAgICA8ZmlsZSBwYXRoPSIvb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy9jaGVja0xheW91dE1hbmlmZXN0Lm1mIi8+DQogICAgICAgIDxmaWxlIHBhdGg9Ii9vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzL2dhbGlsZW8ucHJvcGVydGllcyIvPg0KICAgICAgICA8ZmlsZSBwYXRoPSIvb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy9hbnQuc2giLz4NCiAgICAgICAgPGZpbGUgcGF0aD0iL29yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHMvYWJvdXQuaHRtbCIvPg0KICAgIDwvc2VsZWN0ZWRFbGVtZW50cz4NCjwvamFyZGVzYz4NClBLAwQKAAAAAACrvJM6ykg5t30FAAB9BQAAFgAAAGNsZWFudXBCdWlsZFJlc3VsdHMuc2gjIS91c3IvYmluL2VudiBiYXNoDQoNCiMgc21hbGwgdXRpbGl0eSB0byByZW1vdmUgb2xkICh0ZW1wb3JhcnkpIGJ1aWxkcyBmcm9tIHdvcmsgYXJlYQ0KDQojIGZpbmRzIGZpbGUgb24gdXNlcnMgcGF0aCwgYmVmb3JlIGN1cnJlbnQgZGlyZWN0b3J5DQojIGhlbmNlLCBub24tcHJvZHVjdGlvbiB1c2VycyBjYW4gc2V0IHRoZWlyIG93biB2YWx1ZXMgZm9yIHRlc3QgbWFjaGluZXMNCnNvdXJjZSBnYWxpbGVvX3Byb3BlcnRpZXMuc2hzb3VyY2UNCg0KIyByZW1vdmUgYXJ0aWZhY3RzIG92ZXIgbiBkYXlzIG9sZA0KIyAod2hlcmUgaG91cnMgPSAyNCArIChuICogMjQpLCBiYXNpY2FsbHksIHNvIHRoYXQNCiMgZXZlbiBuPTAgbWVhbnMgIjEgZGF5IikNCg0KIyBzZXQgYXQgMTAgZGF5cywgdW5kZXIgYXNzdW1wdGlvbiB0aGF0IGJlZm9yZSB0aGF0IHRpbWUsDQojIGFydGlmYWN0cyB3aWxsIGJlICJzYXZlZCIgZWxzZXdoZXJlLCBpZiBuZWVkZWQuDQojIGlmIG1vcmUgY2xlYW51cCBpcyBuZWVkZWQsIHdlIHNob3VsZCB0YWtlIHRpbWUsIGFuZA0KIyBleGlzdGVuY2Ugb2YgbW9yZSByZWNlbnQgYnVpbGRzIGludG8gYWNjb3VudCwgc28gd2UgbmV2ZXINCiMgZGVsZXRlIHRoZSBsYXN0IGV4aXN0aW5nIGJ1aWxkIChldmVuIGlmICJvbGQiKS4NCg0KbmRheXM9MTsNCmFydGlmYWN0c0Rpcj0ke0JVSUxEX1JFU1VMVFN9Ow0KDQplY2hvOw0KZWNobyAiICAgIFJlbW92aW5nIGFydGlmYWN0IGRpcmVjdG9yaWVzIG9sZGVyIHRoYW4gJHtuZGF5c30gZGF5cyI7DQplY2hvICIgICAgICAgIChmcm9tICR7YXJ0aWZhY3RzRGlyfSkiOw0KYmVmb3JlPWBmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMSB8IHdjIC1sYDsNCmVjaG8gIiAgICAgICAgICAgIG51bWJlciBvZiBkaXJlY3RvcmllcyBiZWZvcmUgY2xlYW5pbmc6ICR7YmVmb3JlfSI7DQoNCiMgZW1wdHkgZGlyZWN0b3JpZXMgb2Z0ZW4gcmVzdWx0IGZyb20gImJhZCBidWlsZHMiLiBXZSByZW1vdmUgdGhvc2Ugbm8gbWF0dGVyIGhvdyBvbGQNCmZpbmQgJHthcnRpZmFjdHNEaXJ9IC1taW5kZXB0aCAxIC1tYXhkZXB0aCAyIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtIC1mciAne30nIFw7DQojIG5vdyByZW1vdmUgb2xkIG9uZXMNCmZpbmQgJHthcnRpZmFjdHNEaXJ9IC1taW5kZXB0aCAxIC1tYXhkZXB0aCAxIC10eXBlIGQgLWN0aW1lICskbmRheXMgLWV4ZWNkaXIgJHtCVUlMRF9IT01FfSR7UkVMRU5HX1RPT0xTfS9yZW1vdmVJZi5zaCAne30nIFw7DQoNCmFmdGVyPWBmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMSB8IHdjIC1sYDsNCmVjaG8gIiAgICAgICAgICAgIG51bWJlciBvZiBkaXJlY3RvcmllcyBhZnRlciBjbGVhbmluZzogJHthZnRlcn0iOw0KZWNobw0KUEsDBAoAAAAAAJYLyjqx3G6SSwEAAEsBAAAKAAAAcGx1Z2luLnhtbDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQo8P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+DQo8cGx1Z2luPg0KICAgPGV4dGVuc2lvbg0KICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4NCiAgICAgICAgIDxhbnRUYXNrDQogICAgICAgICBsaWJyYXJ5PSJjaGVja0xheW91dC5qYXIiDQogICAgICAgICBuYW1lPSJ0ZXN0TGF5b3V0dGFzayINCiAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzLlRlc3RMYXlvdXRUYXNrIiAvPg0KICAgICAgICAgDQogICA8L2V4dGVuc2lvbj4NCg0KPC9wbHVnaW4+DQpQSwMECgAAAAAANQLIOv1zlmAJAgAACQIAABMAAABpbnZva2VBbnRSdW5uZXIueG1sPHByb2plY3QgbmFtZT0iZ2FsaWxlb0FudFJ1bm5lciIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaW52b2tlQW50Ij4NCgkgICAgPHByb3BlcnR5DQoJICAgICAgICBlbnZpcm9ubWVudD0iZW52IiAvPg0KCSAgICAgICAgCQ0KCTx0YXJnZXQgbmFtZT0iaW52b2tlQW50Ij4NCg0KCQk8ZWNobyBtZXNzYWdlPSJpbnZva2UgYW50IHJ1bm5lciwgZnJvbSBhbnQiIC8+DQoJCTxleGVjIGV4ZWN1dGFibGU9IiR7ZW52LkVDTElQU0VfSE9NRX0vZWNsaXBzZSIgDQoJCQlmYWlsb25lcnJvcj0iZmFsc2UiIA0KCQkJYXBwZW5kPSJ0cnVlIj4NCgkJCTxhcmcgbGluZT0iLWNvbnNvbGVsb2cgLWRhdGEgLi9ydW5FY2xpcHNlV29ya3NwYWNlIC1kZWJ1ZyAtbm9zcGxhc2ggLS1sYXVuY2hlci5zdXBwcmVzc0Vycm9ycyAtdm0gJHtlbnYuSkFWQV9FWEVDX0RJUn0gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lciAtZiBydW5UZXN0cy54bWwiIC8+DQoJCTwvZXhlYz4NCgk8L3RhcmdldD4NCjwvcHJvamVjdD5QSwMECgAAAAAAuxbPOhvlkLtPAwAATwMAAAwAAABydW5UZXN0cy54bWw8cHJvamVjdCBuYW1lPSJnYWxpbGVvVGVzdHMiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InJ1bnRlc3RzIj4NCg0KCTwhLS0NCiAgICAgICA8dGFza2RlZiBuYW1lPSJ0ZXN0TGF5b3V0dGFzayIgDQogICAgICAgCWNsYXNzbmFtZT0ib3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0cy5UZXN0TGF5b3V0VGFzayINCiAgICAgICAJY2xhc3NwYXRoPSIuL2NoZWNrTGF5b3V0LmphciI+DQogICAgICAgPC90YXNrZGVmPg0KICAgICAgIC0tPg0KCTx0YXJnZXQgbmFtZT0icnVudGVzdHMiPg0KCQk8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIHRlc3RzIiAvPg0KDQoJCTx0ZXN0TGF5b3V0dGFzayANCgkJCXRlbXBXb3JraW5nRGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iIA0KCQkJZGlyZWN0b3J5VG9DaGVjaz0iL2hvbWUvZGF0YS9odHRwZC9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL3VwZGF0ZXMvMy41bWlsZXN0b25lcy9TLTMuNVJDNC0yMDA5MDYwNTE0NDQvIiANCgkJCWZhaWx1cmVzb2NjdXJyZWQ9ImZhaWx1cmVzb2NjdXJyZWQiIC8+DQoNCgkJPHRlc3RMYXlvdXR0YXNrIA0KCQkgICAgICAgdGVtcFdvcmtpbmdEaXI9Ii90bXAvdGVtcFdvcmtpbmdMb2NhdGlvbiIgDQoJCQlkaXJlY3RvcnlUb0NoZWNrPSIvaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL3N0YWdpbmcvYWdncmVnYXRlLyIgDQoJCQlmYWlsdXJlc29jY3VycmVkPSJmYWlsdXJlc29jY3VycmVkIiAvPg0KDQoJCTxkZWxldGUgZGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iIC8+DQoNCgkJPGZhaWwgaWY9ImZhaWx1cmVzb2NjdXJyZWQiIC8+DQoJPC90YXJnZXQ+DQo8L3Byb2plY3Q+UEsDBAoAAAAAAPG7zTpHf2GqIwgAACMIAAARAAAAZ2V0UmVsZW5nVGVzdHMuc2gjIS91c3IvYmluL2VudiBiYXNoDQoNCiMgaXQgaXMgYXNzdW1lZCB3ZSBhcmUgZXhlY3V0aW5nIHRoaXMgaW4gUkVMRU5HX1RFU1RTIG9yIHRoZSBwYXJlbnQgb2YgUkVMRU5HX1RFU1RTDQoNCiMgZmluZHMgZmlsZSBvbiB1c2VycyBwYXRoLCBiZWZvcmUgY3VycmVudCBkaXJlY3RvcnkNCiMgaGVuY2UsIG5vbi1wcm9kdWN0aW9uIHVzZXJzIGNhbiBzZXQgdGhlaXIgb3duIHZhbHVlcyBmb3IgdGVzdCBtYWNoaW5lcw0Kc291cmNlIGdhbGlsZW9fcHJvcGVydGllcy5zaHNvdXJjZQ0KICANCiMgVGhpcyBzY3JpcHQgZmlsZSBpcyB0byBoZWxwIGdldCBidWlsZHMgc3RhcnRlZCAiZnJlc2giLCB3aGVuDQojIHRoZSAke1JFTEVOR19URVNUU30gZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIG9uIGxvY2FsIGZpbGUgc3lzdGVtLg0KIyBXaGlsZSBpdCBpcyBpbiB0aGUgY3ZzIHJlcG9zaXRvcnkgaW4gJHtSRUxFTkdfVEVTVFN9LCBpdCBpcw0KIyBtZWFudCB0byBiZSBleGVjdXRlZCBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3J5DQojIG9mICR7UkVMRU5HX1RFU1RTfSBvbiB0aGUgZmlsZSBzeXN0ZW0uDQoNCiMgZXhwb3J0IGlzIHVzZWQsIGluc3RlYWQgb2YgY2hlY2tvdXQsIGp1c3QgdG8gYXZvaWQgdGhlIENWUyBkaXJlY3RvcmllcyBhbmQgc2luY2UgdGhpcyBjb2RlDQojIGZvciBhIGxvY2FsIGJ1aWxkLCB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgYSBuZWVkIHRvIGNoZWNrIGl0IGJhY2sgaW4gdG8gQ1ZTLg0KDQojIElmIHRoZXJlIGlzIG5vIHN1YmRpcmVjdG9yeSwgdHJ5IGdvaW5nIHVwIG9uZSBkaXJlY3RvcnkgYW5kIGxvb2tpbmcgYWdhaW4gKGluIGNhc2Ugd2UgYXJlIGluIGl0KS4NCmlmIFsgISAtZSAke1JFTEVOR19URVNUU30gXQ0KdGhlbg0KCWNkIC4uDQoJaWYgWyAhIC1lICR7UkVMRU5HX1RFU1RTfSBdDQoJdGhlbgkNCiAgICBlY2hvICIke1JFTEVOR19URVNUU30gZG9lcyBub3QgZXhpc3QgYXMgc3ViIGRpcmVjdG9yeSI7DQoJZXhpdCAxOw0KCWZpDQpmaQ0KDQoNCiMgbWFrZSBzdXJlIFJFTEVOR19URVNUUyBoYXMgYmVlbiBkZWZpbmVkIGFuZCBpcyBubyB6ZXJvIGxlbmd0aCwgb3IgDQojIGVsc2UgZm9sbG93aW5nIHdpbGwgZXZhbCB0byAicm0gLWZyIC8qIiAuLi4gcG90ZW50aWFsbHkgY2F0YXN0cm9waGljDQppZiBbIC16ICIke1JFTEVOR19URVNUU30iIF0NCnRoZW4NCiAgIGVjaG8gIlRoZSB2YXJpYWJsZSBSRUxFTkdfVEVTVFMgbXVzdCBiZSBkZWZpbmVkIHRvIHJ1biB0aGlzIHNjcmlwdCINCiAgIGV4aXQgMTsNCmZpDQplY2hvICIgICAgcmVtb3ZpbmcgYWxsIG9mICR7UkVMRU5HX1RFU1RTfSAuLi4iDQpybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvKg0Kcm0gLWZyICIke1JFTEVOR19URVNUU30iLy5wcm9qZWN0DQpybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvLnNldHRpbmdzDQpybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvLmNsYXNzcGF0aA0KbWtkaXIgLXAgIiR7UkVMRU5HX1RFU1RTfSINCg0KI2NvbnRyb2x0YWc9ZGF2aWRfd2lsbGlhbXNfdGVtcEJyYW5jaDMNCmNvbnRyb2x0YWc9SEVBRA0KZWNobyAiICAgIGNoZWNraW5nIG91dCAkY29udHJvbHRhZyBvZiAke1JFTEVOR19URVNUU30gZnJvbSBjdnMgLi4uIg0KY3ZzIC1RIC1mIC1kIDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvY2FsbGlzdG8gIGV4cG9ydCAtZCAke1JFTEVOR19URVNUU30gLXIgJGNvbnRyb2x0YWcgJHtSRUxFTkdfVEVTVFN9DQoNCg0KDQplY2hvICIgICAgbWFraW5nIHN1cmUgcmVsZW5nIGNvbnRyb2wgZmlsZXMgYXJlIGV4ZWN1dGFibGUgYW5kIGhhdmUgcHJvcGVyIEVPTCAuLi4iDQpkb3MydW5peCAke1JFTEVOR19URVNUU30vKi5zaCogJHtSRUxFTkdfVEVTVFN9LyoucHJvcGVydGllcyAke1JFTEVOR19URVNUU30vKi54bWwgPi9kZXYvbnVsbCAyPj4vZGV2L251bGwNCmNobW9kICt4ICR7UkVMRU5HX1RFU1RTfS8qLnNoID4gL2Rldi9udWxsDQplY2hvDQoNCnJtIC1mciAuLi90ZXN0cy9lY2xpcHNlL2Ryb3BpbnMvJHtSRUxFTkdfVEVTVFN9DQpjcCAtciAke1JFTEVOR19URVNUU30gdGVzdHMvZWNsaXBzZS9kcm9waW5zLw0KUEsDBAoAAAAAADUCyDrlawCKOgcAADoHAAAJAAAAdmVyaWZ5LnNoIyBlY2hvIA0KIyBlY2hvICQoYmFzZW5hbWUgJDENCmZpbGVuYW1lPSIkezF9Ig0KamFybmFtZT0kKGJhc2VuYW1lICIke2ZpbGVuYW1lfSIpDQoNCmV4cG9ydCBKQVZBX0hPTUU9L3NoYXJlZC9jb21tb24vaWJtLWphdmEyLXBwYy01MA0KI0pBVkFfSE9NRT0vc2hhcmVkL2NvbW1vbi9pYm0tamF2YS1wcGMtNjA0DQojSkFWQV9IT01FPS9zaGFyZWQvY29tbW9uL2libS1qYXZhLWpkay1wcGMtNjANCg0KaWYgW1sgLXogJFZFUklGWU9VVERJUiBdXSANCnRoZW4NCiAgICBWRVJJRllPVVRESVI9IiR7SE9NRX0iL3ZlcmlmeW91dHB1dA0KZmkNCg0KaWYgW1sgIiRqYXJuYW1lIiA9fiAiKC4qKS5wYWNrLmd6JCIgXV0NCnRoZW4gDQogICAgYmFzZWphcm5hbWU9JHtCQVNIX1JFTUFUQ0hbMV19DQogICAgI2VjaG8gLWUgIlxuIGJhc2VqYXJuYW1lOiAiICRiYXNlamFybmFtZSAiXG4iDQogICAgJEpBVkFfSE9NRS9qcmUvYmluL3VucGFjazIwMCAkZmlsZW5hbWUgL3RtcC8kYmFzZWphcm5hbWUNCiAgICAjdW5wYWNrMjAwICRmaWxlbmFtZSAvdG1wLyRiYXNlamFybmFtZQ0KICAgIHZyZXN1bHQ9YCRKQVZBX0hPTUUvYmluL2phcnNpZ25lciAtdmVyaWZ5IC90bXAvJGJhc2VqYXJuYW1lYA0KICAgIGV4aXRjb2RlPSQ/DQogICAgcm0gL3RtcC8kYmFzZWphcm5hbWUNCmVsc2UNCiAgICAjZWNobyAtZSAiXG4gZmlsZW5hbWU6ICIgJGZpbGVuYW1lICJcbiINCiAgICB2cmVzdWx0PWAkSkFWQV9IT01FL2Jpbi9qYXJzaWduZXIgLXZlcmlmeSAkZmlsZW5hbWVgDQogICAgZXhpdGNvZGU9JD8NCmZpDQoNCmlmIFtbICIke3ZyZXN1bHR9IiA9fiAiXmphciB2ZXJpZmllZC4qIiBdXQ0KdGhlbg0KICAgIHByaW50ZiAnJS0xMDBzIFx0XHQnICIgICAke2phcm5hbWV9OiAiID4+ICIke1ZFUklGWU9VVERJUn0iL3ZlcmlmaWVkLnR4dCANCiAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiID4+ICIke1ZFUklGWU9VVERJUn0iL3ZlcmlmaWVkLnR4dA0KZWxpZiBbWyAiJHt2cmVzdWx0fSIgPX4gIl5qYXIgaXMgdW5zaWduZWQuKiIgXV0NCnRoZW4NCg0KIyBwdXJwb3NlbHkgbm8gbGluZSBkZWxpbWl0ZXIsIHNvIG91dHB1dCBvZiBqYXJzaWduZXIgaXMgb24gc2FtZSBsaW5lDQogICAgcHJpbnRmICclLTEwMHMgXHRcdCcgIiAgICR7amFybmFtZX06ICIgID4+ICIke1ZFUklGWU9VVERJUn0iL3Vuc2lnbmVkLnR4dCANCiAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiICA+PiAiJHtWRVJJRllPVVRESVJ9Ii91bnNpZ25lZC50eHQgDQplbGlmIFtbICIke3ZyZXN1bHR9IiA9fiAiXm5vIG1hbmlmZXN0LioiIF1dDQp0aGVuDQoNCiMgcHVycG9zZWx5IG5vIGxpbmUgZGVsaW1pdGVyLCBzbyBvdXRwdXQgb2YgamFyc2lnbmVyIGlzIG9uIHNhbWUgbGluZQ0KICAgIHByaW50ZiAnJS0xMDBzIFx0XHQnICIgICAke2phcm5hbWV9OiAiICA+PiAiJHtWRVJJRllPVVRESVJ9Ii9ub21hbmlmZXN0LnR4dCANCiAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiICA+PiAiJHtWRVJJRllPVVRESVJ9Ii9ub21hbmlmZXN0LnR4dCANCg0KZWxzZSANCiAgICBwcmludGYgJyUtMTAwcyBcdFx0JyAiICAgJHtqYXJuYW1lfTogIiAgPj4gIiR7VkVSSUZZT1VURElSfSIvZXJyb3IudHh0IA0KICAgIHByaW50ZiAnJXNcbicgIiAke3ZyZXN1bHR9ICIgID4+ICIke1ZFUklGWU9VVERJUn0iL2Vycm9yLnR4dCANCmZpDQogDQppZiBbWyAkZXhpdGNvZGUgLWd0IDAgXV0NCnRoZW4NCg0KICAgIGVjaG8gLWUgIlxuIGV4aXRjb2RlOiAiICRleGl0Y29kZTogJChiYXNlbmFtZSAkZmlsZW5hbWUpIiBcbiIgID4+ICIke1ZFUklGWU9VVERJUn0iL2Vycm9yZXhpdC50eHQgIA0KZmkNCg0KDQpQSwMECgAAAAAAMwnPOhwYnabwCAAA8AgAAC0AAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUYXNrLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHM7DQoNCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOw0KDQpwdWJsaWMgY2xhc3MgVGVzdExheW91dFRhc2sgZXh0ZW5kcyBUYXNrIHsNCg0KCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7DQoJcHJpdmF0ZSBTdHJpbmcgdGVtcFdvcmtpbmdEaXI7DQoJcHJpdmF0ZSBib29sZWFuIGZhaWx1cmVzT2NjdXJyZWQgPSBmYWxzZTsNCglwcml2YXRlIGJvb2xlYW4gZmVhdHVyZUZhaWx1cmVzID0gZmFsc2U7DQoJcHJpdmF0ZSBib29sZWFuIGJ1bmRsZUZhaWx1cmVzID0gZmFsc2U7DQoNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsNCgkJDQoJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgQlJFRSBSdWxlIFRlc3QiKTsNCgkJQlJFRVRlc3QgYnJlZVRlc3QgPSBuZXcgQlJFRVRlc3QoKTsNCgkJYnJlZVRlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOw0KCQlicmVlVGVzdC5zZXRUZW1wV29ya2luZ0RpcihnZXRUZW1wV29ya2luZ0RpcigpKTsNCgkJYnVuZGxlRmFpbHVyZXMgPSBicmVlVGVzdC50ZXN0QlJFRVNldHRpbmdSdWxlKCk7DQoJCWlmIChidW5kbGVGYWlsdXJlcykgew0KCQkJc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsNCgkJfQ0KCQkNCgkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBWZXJzaW9uIEZvcm0gVGVzdCIpOw0KCQlQYWNrMjAwVGVzdCBwYWNrVGVzdCA9IG5ldyBQYWNrMjAwVGVzdCgpOw0KCQlwYWNrVGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7DQoJCWJ1bmRsZUZhaWx1cmVzID0gcGFja1Rlc3QudGVzdEJ1bmRsZVBhY2soKTsNCgkJaWYgKGJ1bmRsZUZhaWx1cmVzKSB7DQoJCQlzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOw0KCQl9DQoJCQ0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIFZlcnNpb24gRm9ybSBUZXN0Iik7DQoJCVZlcnNpb25UZXN0IHZlcnNpb25UZXN0ID0gbmV3IFZlcnNpb25UZXN0KCk7DQoJCXZlcnNpb25UZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsNCgkJZmVhdHVyZUZhaWx1cmVzID0gdmVyc2lvblRlc3QudGVzdEZlYXR1cmVWZXJzaW9ucygpOw0KCQlidW5kbGVGYWlsdXJlcyA9IHZlcnNpb25UZXN0LnRlc3RCdW5kbGVWZXJzaW9ucygpOw0KCQlpZiAoZmVhdHVyZUZhaWx1cmVzIHx8IGJ1bmRsZUZhaWx1cmVzKSB7DQoJCQlzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOw0KCQl9DQoJCQ0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIFRlc3RMYXlvdXRUYXNrIik7DQoJCVRlc3RMYXlvdXRUZXN0IHRlc3QgPSBuZXcgVGVzdExheW91dFRlc3QoKTsNCgkJdGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7DQoJCXRlc3Quc2V0VGVtcFdvcmtpbmdEaXIoZ2V0VGVtcFdvcmtpbmdEaXIoKSk7DQoJCWZlYXR1cmVGYWlsdXJlcyA9IHRlc3QudGVzdEZlYXR1cmVMYXlvdXQoKTsNCgkJYnVuZGxlRmFpbHVyZXMgPSB0ZXN0LnRlc3RCdW5kbGVMYXlvdXQoKTsNCgkJaWYgKGZlYXR1cmVGYWlsdXJlcyB8fCBidW5kbGVGYWlsdXJlcykgew0KCQkJc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsNCgkJfQ0KCX0NCg0KCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsNCgkJcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgew0KCQl0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOw0KCX0NCg0KCXB1YmxpYyBTdHJpbmcgZ2V0VGVtcFdvcmtpbmdEaXIoKSB7DQoJCXJldHVybiB0ZW1wV29ya2luZ0RpcjsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsNCgkJdGhpcy50ZW1wV29ya2luZ0RpciA9IHRlbXBXb3JraW5nRGlyOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIGlzRmFpbHVyZXNPY2N1cnJlZCgpIHsNCgkJcmV0dXJuIGZhaWx1cmVzT2NjdXJyZWQ7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0RmFpbHVyZXNPY2N1cnJlZChib29sZWFuIGZhaWx1cmVzT2NjdXJyZWQpIHsNCgkJdGhpcy5mYWlsdXJlc09jY3VycmVkID0gZmFpbHVyZXNPY2N1cnJlZDsNCgl9DQoNCn0NClBLAwQKAAAAAAC6uc06qpKUE14ZAABeGQAAKgAAAG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvVmVyc2lvblRlc3QuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMNCiAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YNCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcw0KICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQogKiANCiAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiBUaGlzIGZpbGUgb3JpZ2luYWxseSBjYW1lIGZyb20gJ0VjbGlwc2UgT3JiaXQnIHByb2plY3QgdGhlbiBhZGFwdGVkIHRvIHVzZSANCiAqIGluIFdUUCBhbmQgaW1wcm92ZWQgdG8gdXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIA0KICogaXQgYXMgYSBwcm9wZXJ0aWVzIGZpbGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KcGFja2FnZSBvcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzOw0KDQppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsNCmltcG9ydCBqYXZhLmlvLkZpbGU7DQppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQppbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5NYXA7DQppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQppbXBvcnQgamF2YS51dGlsLlNldDsNCmltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7DQppbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOw0KaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQppbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOw0KDQppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7DQppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCg0KaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KDQppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7DQppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsNCmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCmltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsNCmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0Ow0KaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCg0KLyoqDQogKiBAc2luY2UgMy4zDQogKi8NCnB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCg0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSkFSID0gIi5qYXIiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUEFDRUtEX0pBUiA9ICIuamFyLnBhY2suZ3oiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fWklQID0gIi56aXAiOw0KCUZ1bGxKYXJOYW1lUGFyc2VyIG5hbWVQYXJzZXIgPSBuZXcgRnVsbEphck5hbWVQYXJzZXIoKTsNCglwcml2YXRlIFN0cmluZyBCQUNLU0xBU0ggPSAiXFwiOw0KCXByaXZhdGUgU3RyaW5nIExJVEVSQUxfUEVSSU9EID0gQkFDS1NMQVNIICsgIi4iOw0KCXByaXZhdGUgU3RyaW5nIEFOWSA9ICIuKiI7DQoJcHJpdmF0ZSBQYXR0ZXJuIHRocmVlZG90cyA9IFBhdHRlcm4uY29tcGlsZShBTlkgKyBMSVRFUkFMX1BFUklPRCArIEFOWSArIExJVEVSQUxfUEVSSU9EICsgQU5ZICsgTElURVJBTF9QRVJJT0QgKyBBTlkpOw0KDQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KCQlTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0IFRlc3RMYXlvdXRUZXN0IG1haW4iKTsNCgkJVmVyc2lvblRlc3QgdGVzdGxheW91dCA9IG5ldyBWZXJzaW9uVGVzdCgpOw0KCQl0ZXN0bGF5b3V0LnNldERpcmVjdG9yeVRvQ2hlY2soIkQ6XFx0ZW1wdGVzdCIpOw0KCQl0ZXN0bGF5b3V0LnRlc3RGZWF0dXJlVmVyc2lvbnMoKTsNCgkJdGVzdGxheW91dC50ZXN0QnVuZGxlVmVyc2lvbnMoKTsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCgkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmVyc2lvblRlc3QuY2xhc3MpOw0KCX0NCg0KCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7DQoNCg0KCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsNCgkJcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgew0KCQl0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIHRlc3RCdW5kbGVWZXJzaW9ucygpIHsNCg0KCQlTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7DQoJCWFzc2VydE5vdE51bGwoIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIsIHByb3BlcnR5KTsNCgkJU3RyaW5nIGJ1bmRsZURpcmVjdG9yeSA9IG51bGw7DQoJCWlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7DQoJCQlidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJwbHVnaW5zIjsNCgkJfQ0KCQllbHNlIHsNCgkJCWJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9wbHVnaW5zIjsNCgkJfQ0KCQlGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoYnVuZGxlRGlyZWN0b3J5KTsNCgkJYXNzZXJ0VHJ1ZSgiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGJ1bmRsZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIsIGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpOw0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBUZXN0IEJ1bmRsZSBWZXJzaW9ucyIpOw0KCQlib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNWZXJzaW9ucyhpbnB1dGRpcik7DQoJCXJldHVybiBmYWlsdXJlc09jY3VyZWQ7DQoJfQ0KDQoJcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZXNWZXJzaW9ucyhGaWxlIGlucHV0ZGlyKSB7DQoJCS8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzDQoJCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOw0KCQlib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOw0KCQlGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMoKTsNCgkJaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsNCgkJaW50IGNoZWNrZWQgPSAwOw0KCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQoJCQlGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07DQoJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5hbWUoKTsNCgkJCS8vIGFzc3VtZSBkaXJlY3RvcnkgaWYgbm90IGZpbGUNCgkJCWlmIChjaGlsZC5pc0ZpbGUoKSkgew0KCQkJCWlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9QQUNFS0RfSkFSKSkgew0KCQkJCQluYW1lID0gZ2V0QmFzaWNOYW1lKG5hbWUsIEVYVEVOU0lPTl9QQUNFS0RfSkFSKTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAobmFtZS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgew0KCQkJCQluYW1lID0gZ2V0QmFzaWNOYW1lKG5hbWUsIEVYVEVOU0lPTl9KQVIpOw0KCQkJCX0NCgkJCQllbHNlIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKSB7DQoJCQkJCW5hbWUgPSBnZXRCYXNpY05hbWUobmFtZSwgRVhURU5TSU9OX1pJUCk7DQoJCQkJfQ0KCQkJfQ0KCQkJY2hlY2tlZCsrOw0KCQkJYm9vbGVhbiB2YWxpZCA9IG5hbWVQYXJzZXIucGFyc2UobmFtZSk7DQoJCQlpZiAoIXZhbGlkKSB7DQoJCQkJZXJyb3JzLmFkZChuYW1lICsgIiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkiKTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCVN0cmluZyB2ZXJzaW9uID0gbmFtZVBhcnNlci5nZXRWZXJzaW9uU3RyaW5nKCk7DQoJCQkJTWF0Y2hlciBtYXRjaGVyID0gdGhyZWVkb3RzLm1hdGNoZXIodmVyc2lvbik7DQoNCgkJCQlpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7DQoJCQkJCWVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgY29udGFpbiA0IHBhcnRzIik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIuIik7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRXJyb3JzIGZvdW5kOiAiICsgZXJyb3JzLnNpemUoKSk7DQoNCgkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7DQoJCQlDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7DQoJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQoJCQkJU3lzdGVtLm91dC5wcmludGxuKGl0ZXIubmV4dCgpKTsNCgkJCX0NCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3JzIGluIHZlcnNpb25zLiBDaGVjayBlcnJvciBsb2cgZm9yIGRldGFpbHMuIik7DQoJCQlmYWlsdXJlc09jY3VyZWQgPSB0cnVlOw0KCQl9DQoJCXJldHVybiBmYWlsdXJlc09jY3VyZWQ7DQoJfQ0KDQoJcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNOYW1lKFN0cmluZyBmdWxsbmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgew0KCQlTdHJpbmcgcmVzdWx0ID0gZnVsbG5hbWU7DQoJCWludCBwb3MgPSBmdWxsbmFtZS5sYXN0SW5kZXhPZihleHRlbnNpb24pOw0KCQlpZiAocG9zID49IDApIHsNCgkJCXJlc3VsdCA9IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBwb3MpOw0KCQl9DQoJCXJldHVybiByZXN1bHQ7DQoJfQ0KDQoJcHVibGljIGJvb2xlYW4gdGVzdEZlYXR1cmVWZXJzaW9ucygpIHsNCg0KCQlTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7DQoJCWFzc2VydE5vdE51bGwoIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIsIHByb3BlcnR5KTsNCgkJU3RyaW5nIGZlYXR1cmVEaXJlY3RvcnkgPSBudWxsOw0KCQlpZiAocHJvcGVydHkuZW5kc1dpdGgoIi8iKSkgew0KCQkJZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImZlYXR1cmVzIjsNCgkJfQ0KCQllbHNlIHsNCgkJCWZlYXR1cmVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvZmVhdHVyZXMiOw0KCQl9DQoJCUZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsNCgkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBkaXJlY290cnkgKCIgKyBmZWF0dXJlRGlyZWN0b3J5ICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiwgaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSk7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRlc3QgRmVhdHVyZSBWZXJzaW9ucyIpOw0KCQlGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMoKTsNCgkJYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0ZpbGVzVmVyc2lvbnMoaW5wdXRkaXIpOw0KCQlyZXR1cm4gZmFpbHVyZXNPY2N1cmVkOw0KDQoJfQ0KfQ0KUEsDBAoAAAAAALAEzjowZcilRBsAAEQbAAAqAAAAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9QYWNrMjAwVGVzdC5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcw0KICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZg0KICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzDQogKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCiAqIA0KICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSAnRWNsaXBzZSBPcmJpdCcgcHJvamVjdCB0aGVuIGFkYXB0ZWQgdG8gdXNlIA0KICogaW4gV1RQIGFuZCBpbXByb3ZlZCB0byB1c2UgJ01hbmlmZXN0JyB0byByZWFkIG1hbmlmZXN0Lm1mLCBpbnN0ZWFkIG9mIHJlYWRpbmcgDQogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHM7DQoNCmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KaW1wb3J0IGphdmEuaW8uRmlsZTsNCmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7DQppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7DQppbXBvcnQgamF2YS51dGlsLk1hcDsNCmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCmltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQppbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7DQppbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsNCg0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsNCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQoNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCg0KaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50Ow0KaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247DQppbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQppbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCmltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7DQppbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsNCmltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCmltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQoNCi8qKg0KICogQHNpbmNlIDMuMw0KICovDQpwdWJsaWMgY2xhc3MgUGFjazIwMFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQoNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiA9ICIuamFyIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLmphci5wYWNrLmd6IjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1pJUCA9ICIuemlwIjsNCglwcml2YXRlIEZ1bGxKYXJOYW1lUGFyc2VyIG5hbWVQYXJzZXIgPSBuZXcgRnVsbEphck5hbWVQYXJzZXIoKTsNCglwcml2YXRlIFN0cmluZyBCQUNLU0xBU0ggPSAiXFwiOw0KCXByaXZhdGUgU3RyaW5nIExJVEVSQUxfUEVSSU9EID0gQkFDS1NMQVNIICsgIi4iOw0KCXByaXZhdGUgU3RyaW5nIEFOWSA9ICIuKiI7DQoNCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQgUGFjazIwMFRlc3QgbWFpbiIpOw0KCQlQYWNrMjAwVGVzdCB0ZXN0bGF5b3V0ID0gbmV3IFBhY2syMDBUZXN0KCk7DQoJCXRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXB0ZXN0Iik7DQoJCXRlc3RsYXlvdXQudGVzdEJ1bmRsZVBhY2soKTsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCgkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGFjazIwMFRlc3QuY2xhc3MpOw0KCX0NCg0KCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7DQoNCg0KCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsNCgkJcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgew0KCQl0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIHRlc3RCdW5kbGVQYWNrKCkgew0KDQoJCVN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsNCgkJYXNzZXJ0Tm90TnVsbCgiTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuIiwgcHJvcGVydHkpOw0KCQlTdHJpbmcgYnVuZGxlRGlyZWN0b3J5ID0gbnVsbDsNCgkJaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsNCgkJCWJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgInBsdWdpbnMiOw0KCQl9DQoJCWVsc2Ugew0KCQkJYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL3BsdWdpbnMiOw0KCQl9DQoJCUZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShidW5kbGVEaXJlY3RvcnkpOw0KCQlhc3NlcnRUcnVlKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgYnVuZGxlRGlyZWN0b3J5ICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiwgaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSk7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiIExpc3QgQnVuZGxlcyBub3QgcGFja2VkLiIpOw0KCQlib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNQYWNrZWQoaW5wdXRkaXIpOw0KCQlyZXR1cm4gZmFpbHVyZXNPY2N1cmVkOw0KCX0NCg0KCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVzUGFja2VkKEZpbGUgaW5wdXRkaXIpIHsNCgkJLy8gcmVzZXQvaW5pdGlhbGl6ZSBlcnJvcnMNCgkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7DQoJCWJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7DQoJCUZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcygpOw0KCQlpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOw0KCQlpbnQgY2hlY2tlZCA9IDA7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxzaXplOyBpKyspIHsNCgkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsNCgkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOw0KCQkJLy8gYXNzdW1lIGRpcmVjdG9yeSBpZiBub3QgZmlsZQ0KCQkJaWYgKGNoaWxkLmlzRmlsZSgpKSB7DQoJCQkJY2hlY2tlZCsrOw0KCQkJCWlmICghbmFtZS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUikpIHsNCgkJCQkJU3RyaW5nIGJhc2ljTmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fSkFSKTsNCgkJCQkJYm9vbGVhbiB2YWxpZCA9IG5hbWVQYXJzZXIucGFyc2UoYmFzaWNOYW1lKTsNCgkJCQkJU3RyaW5nIGJ1bmRsZW5hbWUgPSBiYXNpY05hbWU7DQoJCQkJCWlmICghdmFsaWQpIHsNCgkJCQkJCWVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb24gKGl0IGlzIHVucGFyc2FibGUpIik7DQoJCQkJCX0NCgkJCQkJZWxzZSB7DQoJCQkJCQlpZiAoY29udGFpbnNKYXZhKGNoaWxkKSkgew0KCQkJCQkJCWJ1bmRsZW5hbWUgPSBuYW1lUGFyc2VyLmdldFByb2plY3RTdHJpbmcoKTsNCgkJCQkJCQllcnJvcnMuYWRkKG5hbWUgKyAiIGlzIG5vdCBwYWNrZWQiKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQl9DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIuIik7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRXJyb3JzIGZvdW5kOiAiICsgZXJyb3JzLnNpemUoKSk7DQoNCgkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7DQoJCQlDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7DQoJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQoJCQkJU3lzdGVtLm91dC5wcmludGxuKGl0ZXIubmV4dCgpKTsNCgkJCX0NCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3JzIGluIHBhY2syMDAgcnVsZS4gQ2hlY2sgZXJyb3IgbG9nIGZvciBkZXRhaWxzLiIpOw0KCQkJZmFpbHVyZXNPY2N1cmVkID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gZmFpbHVyZXNPY2N1cmVkOw0KCX0NCg0KCXByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoRmlsZSBqYXJmaWxlKSB7DQoJCS8vIFdlIGFzc3VtZSB0aGUgZmlsZSBpcyBhICdqYXInIGZpbGUuDQoJCWJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7DQoJCUphckZpbGUgamFyID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7DQoJCQlFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphci5lbnRyaWVzKCk7DQoJCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KCQkJCUphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7DQoJCQkJCWNvbnRhaW5zSmF2YSA9IHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQllbHNlIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgew0KCQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7DQoJCQkJCWlmIChjb250YWluc0phdmEoaW5wdXQpKSB7DQoJCQkJCQljb250YWluc0phdmEgPSB0cnVlOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJfQ0KCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmIChqYXIgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlqYXIuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQl9DQoJCXJldHVybiBjb250YWluc0phdmE7DQoJfQ0KDQoJcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShJbnB1dFN0cmVhbSBpbnB1dCkgew0KCQkvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLg0KCQlib29sZWFuIGNvbnRhaW5zSmF2YSA9IGZhbHNlOw0KDQoJCXRyeSB7DQoJCQlKYXJJbnB1dFN0cmVhbSBqYXJJbnB1dFN0cmVhbSA9IG5ldyBKYXJJbnB1dFN0cmVhbShpbnB1dCk7DQoJCQl3aGlsZSAoamFySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7DQoJCQkJWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsNCgkJCQlpZiAoZW50cnkgIT0gbnVsbCkgew0KCQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgew0KCQkJCQkJY29udGFpbnNKYXZhID0gdHJ1ZTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQlpZiAoaW5wdXQgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlpbnB1dC5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUNCgkJCQl9DQoJCX0NCgkJcmV0dXJuIGNvbnRhaW5zSmF2YTsNCgl9DQoNCglwcml2YXRlIFN0cmluZyBnZXRCYXNpY05hbWUoU3RyaW5nIGZ1bGxuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7DQoJCVN0cmluZyByZXN1bHQgPSBmdWxsbmFtZTsNCgkJaW50IHBvcyA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKGV4dGVuc2lvbik7DQoJCWlmIChwb3MgPj0gMCkgew0KCQkJcmVzdWx0ID0gZnVsbG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7DQoJCX0NCgkJcmV0dXJuIHJlc3VsdDsNCgl9DQp9DQpQSwMECgAAAAAAJq7NOiY95s/WUQAA1lEAAC0AAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUZXN0LmphdmEvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzDQogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMNCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KICogDQogKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgDQogKiBpbiBXVFAgYW5kIGltcHJvdmVkIHRvIHVzZSAnTWFuaWZlc3QnIHRvIHJlYWQgbWFuaWZlc3QubWYsIGluc3RlYWQgb2YgcmVhZGluZyANCiAqIGl0IGFzIGEgcHJvcGVydGllcyBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0czsNCg0KaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQppbXBvcnQgamF2YS5pby5GaWxlOw0KaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuTWFwOw0KaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KaW1wb3J0IGphdmEudXRpbC5TZXQ7DQppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5Ow0KaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsNCg0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsNCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQoNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCg0KaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50Ow0KaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247DQppbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQppbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCmltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7DQppbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsNCmltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCmltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQoNCi8qKg0KICogQHNpbmNlIDMuMw0KICovDQpwdWJsaWMgY2xhc3MgVGVzdExheW91dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQoNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiA9ICIuamFyIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLnBhY2suZ3oiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fWklQID0gIi56aXAiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CVU5ETEVfSUQgPSAiQnVuZGxlLVN5bWJvbGljTmFtZSI7DQoJcHJpdmF0ZSBTdHJpbmcgY29uZmlnRmlsZW5hbWUgPSAiY29uZmlnLnByb3BlcnRpZXMiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREZUX0JJTl9KQVIgPSAiZGVmYXVsdC5iaW5hcnkuamFyIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RGVF9TUkNfSkFSID0gImRlZmF1bHQuc291cmNlLmphciI7DQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERlRfQklOX1pJUCA9ICJkZWZhdWx0LmJpbmFyeS56aXAiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREZUX1NSQ19aSVAgPSAiZGVmYXVsdC5zb3VyY2UuemlwIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RGVF9GRUFUVVJFID0gImRlZmF1bHQuZmVhdHVyZSI7DQoJcHJpdmF0ZSBQcm9wZXJ0aWVzIGNvbmZpZzsNCglwcml2YXRlIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOw0KCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7DQoJcHJpdmF0ZSBTdHJpbmcgdGVtcFdvcmtpbmdEaXI7DQoNCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQgVGVzdExheW91dFRlc3QgbWFpbiIpOw0KCQlUZXN0TGF5b3V0VGVzdCB0ZXN0bGF5b3V0ID0gbmV3IFRlc3RMYXlvdXRUZXN0KCk7DQoJCXRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXB0ZXN0Iik7DQoJCXRlc3RsYXlvdXQuc2V0VGVtcFdvcmtpbmdEaXIoIkQ6L3RlbXAiKTsNCgkJdGVzdGxheW91dC50ZXN0RmVhdHVyZUxheW91dCgpOw0KCQl0ZXN0bGF5b3V0LnRlc3RCdW5kbGVMYXlvdXQoKTsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCgkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdExheW91dFRlc3QuY2xhc3MpOw0KCX0NCg0KCXByaXZhdGUgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSkgew0KCQllcnJvcnMuYWRkKG1lc3NhZ2UpOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIHRlc3RCdW5kbGVMYXlvdXQoKSB7DQoNCgkJZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOw0KCQlib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOw0KCQlTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7DQoJCWFzc2VydE5vdE51bGwoIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIsIHByb3BlcnR5KTsNCgkJU3RyaW5nIGJ1bmRsZURpcmVjdG9yeSA9IG51bGw7DQoJCWlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7DQoJCQlidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJwbHVnaW5zIjsNCgkJfQ0KCQllbHNlIHsNCgkJCWJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9wbHVnaW5zIjsNCgkJfQ0KCQlGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoYnVuZGxlRGlyZWN0b3J5KTsNCgkJYXNzZXJ0VHJ1ZSgiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGJ1bmRsZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIsIGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpOw0KCQlGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMoKTsNCgkJaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsNCgkJaW50IGNoZWNrZWQgPSAwOw0KCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQoJCQlGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07DQoJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpKSB7DQoJCQkJY2hpbGQgPSBnZXRGaWxlRnJvbVBBQ0tFREpBUihjaGlsZCk7DQoJCQl9DQoJCQlpZiAoY2hpbGQgIT0gbnVsbCkgew0KCQkJCVN0cmluZyBpZCA9IGdldEJ1bmRsZUlkKGNoaWxkKTsNCgkJCQlpZiAoaWQgIT0gbnVsbCkgew0KCQkJCQlpZiAoaWQuZW5kc1dpdGgoIi5zb3VyY2UiKSB8fCBpZC5lbmRzV2l0aCgiLmluZm9wb3AiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy51c2VyIikgfHwgaWQuZW5kc1dpdGgoIi5kb2MiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5pc3YiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5kZXYiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5hcGkiKSB8fCBpZC5lbmRzV2l0aCgic3RhbmRhcmQuc2NoZW1hcyIpIHx8IGlkLmVuZHNXaXRoKCIuYnJhbmRpbmciKSkgew0KCQkJCQkJcHJvY2Vzc0J1bmRsZShjaGlsZCwgZ2V0RXhwZWN0ZWQoaWQsIHRydWUsIGNoaWxkLmdldE5hbWUoKS5lbmRzV2l0aChFWFRFTlNJT05fWklQKSkpOw0KCQkJCQkJY2hlY2tlZCsrOw0KCQkJCQl9DQoJCQkJCWVsc2Ugew0KCQkJCQkJcHJvY2Vzc0J1bmRsZShjaGlsZCwgZ2V0RXhwZWN0ZWQoaWQsIGZhbHNlLCBjaGlsZC5nZXROYW1lKCkuZW5kc1dpdGgoRVhURU5TSU9OX1pJUCkpKTsNCgkJCQkJCWNoZWNrZWQrKzsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOw0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOw0KCQkNCgkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7DQoJCQlDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7DQoJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQoJCQkJU3lzdGVtLm91dC5wcmludGxuKGl0ZXIubmV4dCgpKTsNCgkJCX0NCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3JzIGluIGJ1bmRsZSBsYXlvdXQuIENoZWNrIGVycm9yIGxvZyBmb3IgZGV0YWlscy4iKTsNCgkJCWZhaWx1cmVzT2NjdXJlZCA9IHRydWU7DQoJCX0NCgkJcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsNCgl9DQoNCgkvKg0KCSAqIENoZWNrIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHJldHVybiBhIHNldCBvZiByZWd1bGFyIGV4cHJlc3Npb25zDQoJICogd2hpY2ggbWF0Y2ggdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGJ1bmRsZS4NCgkgKi8NCglwcml2YXRlIFNldCBnZXRFeHBlY3RlZChTdHJpbmcgaWQsIGJvb2xlYW4gc291cmNlLCBib29sZWFuIHppcCkgew0KCQkvLyBpcyB0aGUgY29uZmlnIGNhY2hlZD8NCgkJaWYgKGNvbmZpZyA9PSBudWxsKSB7DQoJCQlnZXRDb25maWcoKTsNCgkJfQ0KCQlTdHJpbmcgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShpZCk7DQoJCWlmIChsaW5lID09IG51bGwpIHsNCgkJCWlmIChzb3VyY2UpDQoJCQkJbGluZSA9IHppcCA/IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX1NSQ19aSVApIDogY29uZmlnLmdldFByb3BlcnR5KEtFWV9ERlRfU1JDX0pBUik7DQoJCQllbHNlDQoJCQkJbGluZSA9IHppcCA/IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX0JJTl9aSVApIDogY29uZmlnLmdldFByb3BlcnR5KEtFWV9ERlRfQklOX0pBUik7DQoJCX0NCgkJaWYgKGxpbmUgPT0gbnVsbCkNCgkJCWZhaWwoIlVuYWJsZSB0byBsb2FkIHNldHRpbmdzIGZvcjogIiArIGlkKTsNCgkJU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7DQoJCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspDQoJCQlyZXN1bHQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOw0KCQlyZXR1cm4gcmVzdWx0Ow0KCX0NCg0KCXByaXZhdGUgU2V0IGdldEZlYXR1cmVFeHBlY3RlZChTdHJpbmcgaWQsIGJvb2xlYW4gc291cmNlLCBib29sZWFuIHppcCkgew0KCQkvLyBpcyB0aGUgY29uZmlnIGNhY2hlZD8NCgkJaWYgKGNvbmZpZyA9PSBudWxsKSB7DQoJCQlnZXRDb25maWcoKTsNCgkJfQ0KCQlTdHJpbmcgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShpZCk7DQoJCWlmIChsaW5lID09IG51bGwpIHsNCgkJCWxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoS0VZX0RGVF9GRUFUVVJFKTsNCgkJfQ0KCQlpZiAobGluZSA9PSBudWxsKQ0KCQkJZmFpbCgiVW5hYmxlIHRvIGxvYWQgc2V0dGluZ3MgZm9yOiAiICsgaWQpOw0KCQlTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsNCgkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykNCgkJCXJlc3VsdC5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKSk7DQoJCXJldHVybiByZXN1bHQ7DQoJfQ0KDQoJcHJpdmF0ZSB2b2lkIGdldENvbmZpZygpIHsNCgkJY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsNCgkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOw0KCQl0cnkgew0KCQkJLy8gaWYgd2UgY2FuIHJlYWQgdGhpcyBmaWxlLCBpdCdzIGJlZW4gc2V0IGJ5IGNhbGxlcg0KCQkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoZ2V0Q29uZmlnRmlsZW5hbWUoKSk7DQoJCQlpZiAoY29uZmlnRmlsZS5leGlzdHMoKSkgew0KCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIGVsc2UsIHVzZSB0aGUgZGVmYXVsdCB3ZSAic2hpcCINCgkJCQlpbnB1dCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGdldENvbmZpZ0ZpbGVuYW1lKCkpOw0KCQkJfQ0KDQoJCQlhc3NlcnROb3ROdWxsKCJVbmFibGUgdG8gbG9hZCBjb25maWd1cmF0aW9uIGZpbGUuIiwgaW5wdXQpOw0KCQkJY29uZmlnLmxvYWQoaW5wdXQpOw0KCQl9DQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQl0cnkgew0KCQkJCWlmIChpbnB1dCAhPSBudWxsKQ0KCQkJCQlpbnB1dC5jbG9zZSgpOw0KCQkJfQ0KCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkvLyBpZ25vcmUNCgkJCX0NCgkJfQ0KCX0NCg0KCS8qDQoJICogUHJvY2VzcyB0aGUgYnVuZGxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggdGhlIGdpdmVuIHNldCBvZg0KCSAqIGV4cGVjdGVkIHJlc3VsdHMuDQoJICovDQoJcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdW5kbGUoRmlsZSBmaWxlLCBTZXQgZXhwZWN0ZWQpIHsNCgkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgew0KCQkJU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKTsNCgkJCXByb2Nlc3NEaXIoIiIsIGZpbGUsIGFycmF5KTsNCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspDQoJCQkJaWYgKGFycmF5W2ldICE9IG51bGwpDQoJCQkJCWFkZEVycm9yKCJNaXNzaW5nIHBhdHRlcm46ICIgKyBhcnJheVtpXSArICIgaW4gZGlyOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCX0NCgkJZWxzZQ0KCQkJcHJvY2Vzc0FyY2hpdmUoZmlsZSwgKFN0cmluZ1tdKSBleHBlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZXhwZWN0ZWQuc2l6ZSgpXSkpOw0KCX0NCg0KCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShGaWxlIGZpbGUsIFNldCBleHBlY3RlZCkgew0KCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQoJCQlTdHJpbmdbXSBhcnJheSA9IChTdHJpbmdbXSkgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nW2V4cGVjdGVkLnNpemUoKV0pOw0KCQkJcHJvY2Vzc0RpcigiIiwgZmlsZSwgYXJyYXkpOw0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykNCgkJCQlpZiAoYXJyYXlbaV0gIT0gbnVsbCkNCgkJCQkJYWRkRXJyb3IoIk1pc3NpbmcgcGF0dGVybjogIiArIGFycmF5W2ldICsgIiBpbiBkaXI6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsNCgkJfQ0KCQllbHNlDQoJCQlwcm9jZXNzQXJjaGl2ZShmaWxlLCAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKSk7DQoJfQ0KDQoJLyoNCgkgKiBUaGUgYnVuZGxlIGlzIGFuIGFyY2hpdmUuIE1ha2Ugc3VyZSBpdCBoYXMgdGhlIHJpZ2h0IGNvbnRlbnRzLg0KCSAqLw0KCXByaXZhdGUgdm9pZCBwcm9jZXNzQXJjaGl2ZShGaWxlIGZpbGUsIFN0cmluZ1tdIGV4cGVjdGVkKSB7DQoJCVppcEZpbGUgemlwID0gbnVsbDsNCgkJdHJ5IHsNCgkJCXppcCA9IG5ldyBaaXBGaWxlKGZpbGUsIFppcEZpbGUuT1BFTl9SRUFEKTsNCgkJCWZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7DQoJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsNCgkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsNCgkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7DQoJCQkJCVN0cmluZyBwYXR0ZXJuID0gZXhwZWN0ZWRbaV07DQoJCQkJCWlmIChwYXR0ZXJuID09IG51bGwpDQoJCQkJCQljb250aW51ZTsNCgkJCQkJdHJ5IHsNCgkJCQkJCWlmIChuYW1lLm1hdGNoZXMocGF0dGVybikpDQoJCQkJCQkJZXhwZWN0ZWRbaV0gPSBudWxsOw0KCQkJCQl9DQoJCQkJCWNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGV4KSB7DQoJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsNCgkJCQkJCWZhaWwoZXguZ2V0TWVzc2FnZSgpKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsNCgkJCQlpZiAoZXhwZWN0ZWRbaV0gIT0gbnVsbCkNCgkJCQkJYWRkRXJyb3IoIk1pc3NpbmcgcGF0dGVybjogIiArIGV4cGVjdGVkW2ldICsgIiBpbiBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCQl9DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmICh6aXAgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQl6aXAuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQl9DQoJfQ0KDQoNCgkvKg0KCSAqIFRoZSBidW5kbGUgaXMgaW4gYSBkaXJlY3RvcnkuDQoJICovDQoJcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXIoU3RyaW5nIHJvb3QsIEZpbGUgZGlyLCBTdHJpbmdbXSBleHBlY3RlZCkgew0KCQlGaWxlW10gY2hpbGRyZW4gPSBkaXIubGlzdEZpbGVzKCk7DQoJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsNCgkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07DQoJCQlTdHJpbmcgbmFtZSA9IHJvb3QubGVuZ3RoKCkgPT0gMCA/IGNoaWxkLmdldE5hbWUoKSA6IHJvb3QgKyAnLycgKyBjaGlsZC5nZXROYW1lKCk7DQoJCQlpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgew0KCQkJCXByb2Nlc3NEaXIobmFtZSwgY2hpbGQsIGV4cGVjdGVkKTsNCgkJCQljb250aW51ZTsNCgkJCX0NCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsNCgkJCQlTdHJpbmcgcGF0dGVybiA9IGV4cGVjdGVkW2ldOw0KCQkJCWlmIChwYXR0ZXJuID09IG51bGwpDQoJCQkJCWNvbnRpbnVlOw0KCQkJCXRyeSB7DQoJCQkJCWlmIChuYW1lLm1hdGNoZXMocGF0dGVybikpDQoJCQkJCQlleHBlY3RlZFtpXSA9IG51bGw7DQoJCQkJfQ0KCQkJCWNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGV4KSB7DQoJCQkJCS8vIGV4LnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCQlhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOw0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCgkvKg0KCSAqIFJldHVybiB0aGUgYnVuZGxlIGlkIGZyb20gdGhlIG1hbmlmZXN0IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGlucHV0DQoJICogc3RyZWFtLg0KCSAqLw0KCXByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkRnJvbU1hbmlmZXN0KElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgcGF0aCkgew0KCQlTdHJpbmcgaWQgPSBudWxsOw0KCQl0cnkgew0KCQkJTWFwIGF0dHJpYnV0ZXMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VCdW5kbGVNYW5pZmVzdChpbnB1dCwgbnVsbCk7DQoJCQlpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0JVTkRMRV9JRCk7DQoJCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7DQoJCQkJYWRkRXJyb3IoIkJ1bmRsZVN5bWJvbGljTmFtZSBoZWFkZXIgbm90IHNldCBpbiBtYW5pZmVzdCBmb3IgYnVuZGxlOiAiICsgcGF0aCk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBpZGVudGlmaWVyIGNhbiBiZSBmb2xsb3dlZCBieSBhdHRyaWJ1dGVzIHN1Y2ggYXMNCgkJCQkvLyAnc2luZ2xldG9uJw0KCQkJCWludCBwb3MgPSBpZC5pbmRleE9mKCc7Jyk7DQoJCQkJaWYgKHBvcyA+IDApIHsNCgkJCQkJaWQgPSBpZC5zdWJzdHJpbmcoMCwgcG9zKTsNCgkJCQl9DQoJCQl9DQoNCgkJfQ0KCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsNCgkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQlpZiAoaW5wdXQgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlpbnB1dC5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUNCgkJCQl9DQoJCX0NCg0KCQlyZXR1cm4gaWQ7DQoJfQ0KDQoJLyoNCgkgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZGVudGlmaWVyIGZvciB0aGUgYnVuZGxlIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4NCgkgKiBhcmNoaXZlL2RpcmVjdG9yeS4NCgkgKi8NCglwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZChGaWxlIGZpbGUpIHsNCgkJU3RyaW5nIGlkID0gbnVsbDsNCgkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkNCgkJCWlkID0gZ2V0QnVuZGxlSWRGcm9tRGlyKGZpbGUpOw0KCQllbHNlIGlmIChmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKQ0KCQkJaWQgPSBnZXRCdW5kbGVJZEZyb21aSVAoZmlsZSk7DQoJCWVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX0pBUikpDQoJCQlpZCA9IGdldEJ1bmRsZUlkRnJvbUpBUihmaWxlKTsNCgkJcmV0dXJuIGlkOw0KCX0NCg0KCXByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkRnJvbVpJUChGaWxlIGZpbGUpIHsNCgkJWmlwRmlsZSB6aXAgPSBudWxsOw0KCQl0cnkgew0KCQkJemlwID0gbmV3IFppcEZpbGUoZmlsZSk7DQoJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB6aXAuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgew0KCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7DQoJCQkJaWYgKGVudHJ5LmdldE5hbWUoKS5tYXRjaGVzKCJeLiovIiArIEphckZpbGUuTUFOSUZFU1RfTkFNRSkpIHsNCgkJCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSB6aXAuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KCQkJCQl0cnkgew0KCQkJCQkJcmV0dXJuIGdldEJ1bmRsZUlkRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsNCgkJCQkJfQ0KCQkJCQlmaW5hbGx5IHsNCgkJCQkJCXRyeSB7DQoJCQkJCQkJaW5wdXQuY2xvc2UoKTsNCgkJCQkJCX0NCgkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KCQkJCQkJCS8vIGlnbm9yZQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KCQkJLy8gZXgucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOw0KCQl9DQoJCWZpbmFsbHkgew0KCQkJdHJ5IHsNCgkJCQl6aXAuY2xvc2UoKTsNCgkJCX0NCgkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KCQkJCS8vIGlnbm9yZQ0KCQkJfQ0KCQl9DQoJCWFkZEVycm9yKCJCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgaW4gYnVuZGxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qDQoJICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGFuIGV4cGFuZGVkIGJ1bmRsZSBvbiBkaXNjLiBMb29rIGludG8gdGhlDQoJICogYnVuZGxlIG1hbmlmZXN0IGZpbGUgdG8gZmluZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIuDQoJICovDQoJcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlSWRGcm9tRGlyKEZpbGUgZGlyKSB7DQoJCVN0cmluZyBpZCA9IG51bGw7DQoJCUZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoZGlyLCBKYXJGaWxlLk1BTklGRVNUX05BTUUpOw0KCQlpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSB8fCAhbWFuaWZlc3RGaWxlLmlzRmlsZSgpKSB7DQoJCQlhZGRFcnJvcigiQnVuZGxlIG1hbmlmZXN0IChNQU5JRkVTVC5NRikgbm90IGZvdW5kIGF0OiAiICsgbWFuaWZlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsNCgkJfQ0KCQllbHNlIHsNCgkJCXRyeSB7DQoJCQkJaWQgPSBnZXRCdW5kbGVJZEZyb21NYW5pZmVzdChuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSksIG1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCQl9DQoJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCgkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCWFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gaWQ7DQoJfQ0KDQoJLyoNCgkgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bw0KCSAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4NCgkgKi8NCglwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21QQUNLRURKQVIoRmlsZSBmaWxlKSB7DQoJCVN0cmluZyBpZCA9IG51bGw7DQoJCUphckZpbGUgamFyID0gbnVsbDsNCgkJRmlsZSB0bXBqYXIgPSBudWxsOw0KCQl0cnkgew0KCQkJSmFyUHJvY2Vzc29yIGphcnByb2Nlc3NvciA9IEphclByb2Nlc3Nvci5nZXRVbnBhY2tQcm9jZXNzb3IobnVsbCk7DQoJCQlqYXJwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShnZXRUZW1wV29ya2luZ0RpcigpKTsNCgkJCXRtcGphciA9IGphcnByb2Nlc3Nvci5wcm9jZXNzSmFyKGZpbGUpOw0KCQl9DQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQlhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCQl0bXBqYXIgPSBudWxsOw0KCQl9DQoJCXJldHVybiB0bXBqYXI7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgew0KCQlyZXR1cm4gZGlyZWN0b3J5VG9DaGVjazsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlUb0NoZWNrKFN0cmluZyBidW5kbGVEaXJUb0NoZWNrKSB7DQoJCXRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlbmFtZSgpIHsNCgkJcmV0dXJuIGNvbmZpZ0ZpbGVuYW1lOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGVuYW1lKFN0cmluZyBjb25maWdGaWxlbmFtZSkgew0KCQl0aGlzLmNvbmZpZ0ZpbGVuYW1lID0gY29uZmlnRmlsZW5hbWU7DQoJfQ0KDQoJLyoNCgkgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bw0KCSAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4NCgkgKi8NCglwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21KQVIoRmlsZSBmaWxlKSB7DQoJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsNCgkJSmFyRmlsZSBqYXIgPSBudWxsOw0KCQl0cnkgew0KCQkJamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsNCgkJCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KEphckZpbGUuTUFOSUZFU1RfTkFNRSk7DQoJCQlpZiAoZW50cnkgPT0gbnVsbCkgew0KCQkJCWFkZEVycm9yKCJCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsNCgkJCQlyZXR1cm4gbnVsbDsNCgkJCX0NCgkJCWlucHV0ID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCgkJCXJldHVybiBnZXRCdW5kbGVJZEZyb21NYW5pZmVzdChpbnB1dCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmIChpbnB1dCAhPSBudWxsKQ0KCQkJCXRyeSB7DQoJCQkJCWlucHV0LmNsb3NlKCk7DQoJCQkJfQ0KCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCS8vIGlnbm9yZQ0KCQkJCX0NCgkJCWlmIChqYXIgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlqYXIuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQl9DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRUZW1wV29ya2luZ0RpcigpIHsNCgkJcmV0dXJuIHRlbXBXb3JraW5nRGlyOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldFRlbXBXb3JraW5nRGlyKFN0cmluZyB0ZW1wV29ya2luZ0Rpcikgew0KCQl0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7DQoJfQ0KDQoJcHVibGljIGJvb2xlYW4gdGVzdEZlYXR1cmVMYXlvdXQoKSB7DQoJCQ0KCQllcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7DQoJCWJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCA9IGZhbHNlOw0KCQlTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7DQoJCWFzc2VydE5vdE51bGwoIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIsIHByb3BlcnR5KTsNCgkJU3RyaW5nIGZlYXR1cmVEaXJlY3RvcnkgPSBudWxsOw0KCQlpZiAocHJvcGVydHkuZW5kc1dpdGgoIi8iKSkgew0KCQkJZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImZlYXR1cmVzIjsNCgkJfQ0KCQllbHNlIHsNCgkJCWZlYXR1cmVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvZmVhdHVyZXMiOw0KCQl9DQoJCUZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsNCgkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBkaXJlY290cnkgKCIgKyBmZWF0dXJlRGlyZWN0b3J5ICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiwgaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSk7DQoJCUZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcygpOw0KCQlpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOw0KCQlpbnQgY2hlY2tlZCA9IDA7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCgkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsNCgkJCWlmIChjaGlsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUikpIHsNCgkJCQljaGlsZCA9IGdldEZpbGVGcm9tUEFDS0VESkFSKGNoaWxkKTsNCgkJCX0NCgkJCWlmIChjaGlsZCAhPSBudWxsKSB7DQoJCQkJU3RyaW5nIGlkID0gZ2V0RmVhdHVyZUlkKGNoaWxkKTsNCgkJCQlpZiAoaWQgIT0gbnVsbCkgew0KCQkJCQlwcm9jZXNzRmVhdHVyZShjaGlsZCwgZ2V0RmVhdHVyZUV4cGVjdGVkKGlkLCB0cnVlLCBjaGlsZC5nZXROYW1lKCkuZW5kc1dpdGgoRVhURU5TSU9OX1pJUCkpKTsNCgkJCQkJY2hlY2tlZCsrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOw0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOw0KCQlpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsNCgkJCUNvbGxlY3Rpb25zLnNvcnQoZXJyb3JzKTsNCgkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaXRlci5uZXh0KCkpOw0KCQkJfQ0KCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcnMgaW4gZmVhdHVyZSBsYXlvdXQuIENoZWNrIGVycm9yIGxvZyBmb3IgZGV0YWlscy4iKTsNCgkJCWZhaWx1cmVzT2NjdXJyZWQgPSB0cnVlOw0KCQl9DQoJCXJldHVybiBmYWlsdXJlc09jY3VycmVkOw0KDQoJfQ0KDQoJcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkKEZpbGUgZmlsZSkgew0KCQlTdHJpbmcgaWQgPSBudWxsOw0KCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQoJCQlpZCA9IGdldEZlYXR1cmVJZEZyb21EaXIoZmlsZSk7DQoJCX0NCgkJZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgew0KCQkJaWQgPSBnZXRGZWF0dXJlSWRGcm9tSkFSKGZpbGUpOw0KCQl9DQoJCXJldHVybiBpZDsNCgl9DQoNCglwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlSWRGcm9tSkFSKEZpbGUgZmlsZSkgew0KCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7DQoJCUphckZpbGUgamFyID0gbnVsbDsNCgkJU3RyaW5nIGlkID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWphciA9IG5ldyBKYXJGaWxlKGZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7DQoJCQlKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeSgiZmVhdHVyZS54bWwiKTsNCgkJCWlmIChlbnRyeSA9PSBudWxsKSB7DQoJCQkJYWRkRXJyb3IoIkZlYXR1cmUgamFyIGRvZXMgbm90IGNvbnRhaW4gYSBmZWF0dXJlLnhtbCBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCQl9DQoJCQlpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7DQoJCQlpZCA9IGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChpbnB1dCk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQlhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCX0NCgkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KCQkJYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOw0KCQl9DQoJCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KCQkJYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOw0KCQl9DQoJCWZpbmFsbHkgew0KCQkJaWYgKGlucHV0ICE9IG51bGwpDQoJCQkJdHJ5IHsNCgkJCQkJaW5wdXQuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQkJaWYgKGphciAhPSBudWxsKQ0KCQkJCXRyeSB7DQoJCQkJCWphci5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUNCgkJCQl9DQoJCX0NCgkJcmV0dXJuIGlkOw0KCX0NCg0KCXByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21EaXIoRmlsZSBkaXIpIHsNCgkJU3RyaW5nIGlkID0gbnVsbDsNCgkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKGRpciwgImZlYXR1cmUueG1sIik7DQoJCWlmICghZmVhdHVyZUZpbGUuZXhpc3RzKCkgfHwgIWZlYXR1cmVGaWxlLmlzRmlsZSgpKSB7DQoJCQlhZGRFcnJvcigiRmVhdHVyZS54bWwgbm90IGZvdW5kIGF0OiAiICsgZmVhdHVyZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KCQl9DQoJCWVsc2Ugew0KCQkJaWQgPSBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoZmVhdHVyZUZpbGUpOw0KCQl9DQoJCXJldHVybiBpZDsNCgl9DQoNCglwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoRmlsZSBmaWxlKSB7DQoJCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RE9NKGZpbGUpOw0KCQlyZXR1cm4gZ2V0RmVhdHVyZUlkRnJvbURPTShkb2N1bWVudCk7DQoJfQ0KDQoJcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkRnJvbURPTShEb2N1bWVudCBkb2N1bWVudCkgew0KCQlTdHJpbmcgaWQgPSBudWxsOw0KCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgew0KCQkJTm9kZUxpc3QgZmVhdHVyZUVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZlYXR1cmUiKTsNCgkJCUVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBudWxsOw0KCQkJaWYgKGZlYXR1cmVFbGVtZW50cy5nZXRMZW5ndGgoKSA+IDApIHsNCgkJCQlOb2RlIGZlYXR1cmVOb2RlID0gZmVhdHVyZUVsZW1lbnRzLml0ZW0oMCk7DQoJCQkJaWYgKGZlYXR1cmVOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgew0KCQkJCQlmZWF0dXJlRWxlbWVudCA9IChFbGVtZW50KSBmZWF0dXJlTm9kZTsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoZmVhdHVyZUVsZW1lbnQgIT0gbnVsbCkgew0KCQkJCU5hbWVkTm9kZU1hcCBhTmFtZWROb2RlTWFwID0gZmVhdHVyZUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOw0KCQkJCU5vZGUgaWRBdHRyaWJ1dGUgPSBhTmFtZWROb2RlTWFwLmdldE5hbWVkSXRlbSgiaWQiKTsNCgkJCQlpZCA9IGlkQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBpZDsNCgl9DQoNCglwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQoJCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RE9NKHN0cmVhbSk7DQoJCXJldHVybiBnZXRGZWF0dXJlSWRGcm9tRE9NKGRvY3VtZW50KTsNCgl9DQoNCglwcml2YXRlIERvY3VtZW50IGdldERPTShGaWxlIGZpbGUpIHsNCg0KCQlEb2N1bWVudCBhRG9jdW1lbnQgPSBudWxsOw0KCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOw0KCQl0cnkgew0KCQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsNCgkJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7DQoJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQoJCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQoJCQlhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsNCgkJfQ0KCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmIChyZWFkZXIgIT0gbnVsbCkgew0KCQkJCXRyeSB7DQoJCQkJCXJlYWRlci5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUgdGhpcyBvbmUNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZiAoYURvY3VtZW50ID09IG51bGwpIHsNCgkJCVN0cmluZyBtc2cgPSAiRXJyb3I6IGNvdWxkIG5vdCBwYXJzZSB4bWwgaW4gY2xhc3NwYXRoIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpOw0KCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7DQoJCX0NCgkJcmV0dXJuIGFEb2N1bWVudDsNCg0KCX0NCg0KCXByaXZhdGUgRG9jdW1lbnQgZ2V0RE9NKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KDQoJCURvY3VtZW50IGFEb2N1bWVudCA9IG51bGw7DQoJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQoJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCgkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOw0KCQlhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsNCg0KCQlyZXR1cm4gYURvY3VtZW50Ow0KDQoJfQ0KfQ0KUEsDBAoAAAAAANeozToSpPbABQkAAAUJAAAwAAAAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9GdWxsSmFyTmFtZVBhcnNlci5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQogKiANCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgICANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQpwYWNrYWdlIG9yZy5lY2xpcHNlLmdhbGlsZW8udGVzdHM7DQoNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsNCmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCg0KY2xhc3MgRnVsbEphck5hbWVQYXJzZXIgew0KDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOw0KCS8vIHNpbXBsaWZpZWQgcGF0dGVybjogKElEKSAnXycgKE4gJy4nIE0gJy4nIE8gJy4nIFMpICcuamFyJw0KCXByaXZhdGUgU3RyaW5nIFNUQVJUX0dST1VQID0gIigiOw0KCXByaXZhdGUgU3RyaW5nIEVORF9HUk9VUCA9ICIpIjsNCglwcml2YXRlIFN0cmluZyBVTkRFUlNDT1JFID0gIl8iOw0KCXByaXZhdGUgU3RyaW5nIEJBQ0tTTEFTSCA9ICJcXCI7DQoJcHJpdmF0ZSBTdHJpbmcgTElURVJBTF9QRVJJT0QgPSBCQUNLU0xBU0ggKyAiLiI7DQoJcHJpdmF0ZSBTdHJpbmcgQU5ZRElHSVRTID0gQkFDS1NMQVNIICsgImQiICsgIioiOw0KCXByaXZhdGUgU3RyaW5nIEFOWSA9ICIuKiI7DQoJcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoU1RBUlRfR1JPVVAgKyBBTlkgKyBFTkRfR1JPVVAgKyBVTkRFUlNDT1JFICsgU1RBUlRfR1JPVVAgKyBTVEFSVF9HUk9VUCArIEFOWURJR0lUUyArIEVORF9HUk9VUCArIExJVEVSQUxfUEVSSU9EICsgU1RBUlRfR1JPVVAgKyBBTllESUdJVFMgKyBFTkRfR1JPVVAgKyBMSVRFUkFMX1BFUklPRCArIFNUQVJUX0dST1VQICsgQU5ZRElHSVRTICsgRU5EX0dST1VQICsgU1RBUlRfR1JPVVAgKyBMSVRFUkFMX1BFUklPRCArIEFOWSArIEVORF9HUk9VUCArICI/IiArIEVORF9HUk9VUCk7DQoNCglwcml2YXRlIFN0cmluZyBwcm9qZWN0U3RyaW5nOw0KCXByaXZhdGUgU3RyaW5nIHZlcnNpb25TdHJpbmc7DQoNCg0KDQoJcHVibGljIEZ1bGxKYXJOYW1lUGFyc2VyKCkgew0KCQlzdXBlcigpOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIHBhcnNlKFN0cmluZyBsaW5lKSB7DQoJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQoJCXByb2plY3RTdHJpbmcgPSAiIjsNCgkJdmVyc2lvblN0cmluZyA9ICIiOw0KCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7DQoNCgkJaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgew0KCQkJcmVzdWx0ID0gZmFsc2U7DQoJCQlpZiAoREVCVUcpIHsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0dGhlIGxpbmUgZGlkIG5vdCBtYXRjaCBwYXJzZSBydWxlOiAiKTsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGxpbmUpOw0KCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJcHJvamVjdFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMSk7DQoJCQl2ZXJzaW9uU3RyaW5nID0gbWF0Y2hlci5ncm91cCgyKTsNCgkJCXJlc3VsdCA9IHRydWU7DQoJCQlpZiAoREVCVUcpIHsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvamVjdFN0cmluZyk7DQoJCQkJU3lzdGVtLm91dC5wcmludGxuKHZlcnNpb25TdHJpbmcpOw0KCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiByZXN1bHQ7DQoJfQ0KDQoNCglwdWJsaWMgU3RyaW5nIGdldFByb2plY3RTdHJpbmcoKSB7DQoJCXJldHVybiBwcm9qZWN0U3RyaW5nOw0KCX0NCg0KDQoNCglwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7DQoJCXJldHVybiB2ZXJzaW9uU3RyaW5nOw0KCX0NCn1QSwMECgAAAAAAe5zPOimNVz6tLwAArS8AACcAAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0JSRUVUZXN0LmphdmEvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzDQogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mDQogKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMNCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KICogDQogKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgDQogKiBpbiBXVFAgYW5kIGltcHJvdmVkIHRvIHVzZSAnTWFuaWZlc3QnIHRvIHJlYWQgbWFuaWZlc3QubWYsIGluc3RlYWQgb2YgcmVhZGluZyANCiAqIGl0IGFzIGEgcHJvcGVydGllcyBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2UuZ2FsaWxlby50ZXN0czsNCg0KaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQppbXBvcnQgamF2YS5pby5GaWxlOw0KaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuTWFwOw0KaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KaW1wb3J0IGphdmEudXRpbC5TZXQ7DQppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5Ow0KaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsNCmltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOw0KaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQppbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOw0KDQppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7DQppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCg0KaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KDQppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7DQppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsNCmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCmltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsNCmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0Ow0KaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCg0KLyoqDQogKiBAc2luY2UgMy4zDQogKi8NCnB1YmxpYyBjbGFzcyBCUkVFVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCg0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSkFSID0gIi5qYXIiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUEFDRUtEX0pBUiA9ICIuamFyLnBhY2suZ3oiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fWklQID0gIi56aXAiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBQUk9QRVJUWV9CVU5ETEVfUkVRVUlSRURfRVhFQ1VUSU9OX0VOVklST05NRU5UID0gIkJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBGdWxsSmFyTmFtZVBhcnNlciBuYW1lUGFyc2VyID0gbmV3IEZ1bGxKYXJOYW1lUGFyc2VyKCk7DQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tTTEFTSCA9ICJcXCI7DQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJVEVSQUxfUEVSSU9EID0gQkFDS1NMQVNIICsgIi4iOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTlkgPSAiLioiOw0KDQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KCQlTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0IEJSRUUgQ2hlY2tzIG1haW4iKTsNCgkJQlJFRVRlc3QgdGVzdGxheW91dCA9IG5ldyBCUkVFVGVzdCgpOw0KCQl0ZXN0bGF5b3V0LnNldERpcmVjdG9yeVRvQ2hlY2soIkQ6XFx0ZW1wdGVzdCIpOw0KCQl0ZXN0bGF5b3V0LnRlc3RCUkVFU2V0dGluZ1J1bGUoKTsNCg0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCgkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQlJFRVRlc3QuY2xhc3MpOw0KCX0NCg0KCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7DQoJcHJpdmF0ZSBTdHJpbmcgdGVtcFdvcmtpbmdEaXI7DQoNCg0KCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsNCgkJcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgew0KCQl0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOw0KCX0NCg0KCXB1YmxpYyBib29sZWFuIHRlc3RCUkVFU2V0dGluZ1J1bGUoKSB7DQoNCgkJU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOw0KCQlhc3NlcnROb3ROdWxsKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iLCBwcm9wZXJ0eSk7DQoJCVN0cmluZyBidW5kbGVEaXJlY3RvcnkgPSBudWxsOw0KCQlpZiAocHJvcGVydHkuZW5kc1dpdGgoIi8iKSkgew0KCQkJYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAicGx1Z2lucyI7DQoJCX0NCgkJZWxzZSB7DQoJCQlidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvcGx1Z2lucyI7DQoJCX0NCgkJRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGJ1bmRsZURpcmVjdG9yeSk7DQoJCWFzc2VydFRydWUoImJ1bmRsZSBkaXJlY290cnkgKCIgKyBidW5kbGVEaXJlY3RvcnkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iLCBpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKTsNCg0KCQlib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrQnVuZGxlQlJFRShpbnB1dGRpcik7DQoJCXJldHVybiBmYWlsdXJlc09jY3VyZWQ7DQoJfQ0KDQoJcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlQlJFRShGaWxlIGlucHV0ZGlyKSB7DQoJCS8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzDQoJCUlucHV0U3RyZWFtIHByb3BlcnR5U3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImV4Y2VwdGlvbnMucHJvcGVydGllcyIpOw0KCQlQcm9wZXJ0aWVzIGJyZWVFeGNlcHRpb25Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsNCgkJU3RyaW5nIGJyZWVFeGNlcHRpb25zID0gIiI7DQoJCXRyeSB7DQoJCQlicmVlRXhjZXB0aW9uUHJvcGVydGllcy5sb2FkKHByb3BlcnR5U3RyZWFtKTsNCgkJCWJyZWVFeGNlcHRpb25zID0gYnJlZUV4Y2VwdGlvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImJyZWVFeGNlcHRpb25zIik7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQlpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkgew0KCQkJCXRyeSB7DQoJCQkJCXByb3BlcnR5U3RyZWFtLmNsb3NlKCk7DQoJCQkJfQ0KCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCS8vIHdvdWxkIGJlIHVudXN1YWwgdG8gZ2V0IGhlcmU/DQoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOw0KCQlNYXAgamF2YVdpdGhCcmVlID0gbmV3IEhhc2hNYXAoKTsNCgkJTGlzdCBub25qYXZhV2l0aEJyZWUgPSBuZXcgQXJyYXlMaXN0KCk7DQoJCUxpc3QgamF2YVdpdGhvdXRCcmVlID0gbmV3IEFycmF5TGlzdCgpOw0KCQlpbnQgbm9uSmF2YU5vQlJFRSA9IDA7DQoJCWJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7DQoJCUZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcygpOw0KCQlpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOw0KCQlpbnQgY2hlY2tlZCA9IDA7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxzaXplOyBpKyspIHsNCgkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsNCgkJCVN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOw0KCQkJaWYgKGNoaWxkLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEVYVEVOU0lPTl9QQUNFS0RfSkFSKSkgew0KCQkJCWNoaWxkID0gZ2V0RmlsZUZyb21QQUNLRURKQVIoY2hpbGQpOw0KCQkJfQ0KCQkJaWYgKGNoaWxkICE9IG51bGwpIHsNCgkJCQlTdHJpbmcgYnVuZGxlTmFtZSA9IGdldEJ1bmRsZU5hbWUoY2hpbGQuZ2V0TmFtZSgpKTsNCgkJCQlpZiAoYnVuZGxlTmFtZSAhPSBudWxsICYmICFicmVlRXhjZXB0aW9ucy5jb250YWlucyhidW5kbGVOYW1lKSkgew0KCQkJCQljaGVja2VkKys7DQoJCQkJCVN0cmluZyBicmVlID0gZ2V0QlJFRUZyb21KQVIoY2hpbGQpOw0KCQkJCQlpZiAoYnJlZSAhPSBudWxsICYmIGJyZWUubGVuZ3RoKCkgPiAwKSB7DQoJCQkJCQkvLyBoYXMgQlJFRSwgY29uZmlybSBpcyBqYXZhIGZpbGUNCgkJCQkJCWlmIChjb250YWluc0phdmEoY2hpbGQpKSB7DQoJCQkJCQkJaW5jcmVtZW50Q291bnRzKGphdmFXaXRoQnJlZSwgYnJlZSk7DQoJCQkJCQl9DQoJCQkJCQllbHNlIHsNCgkJCQkJCQl0cmFja0ZhbHNlSW5jbHVzaW9ucyhub25qYXZhV2l0aEJyZWUsIGNoaWxkKTsNCgkJCQkJCQlmYWlsdXJlc09jY3VyZWQgPSB0cnVlOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2Ugew0KCQkJCQkJLy8gbm8gQlJFRSwgY29uZmlybSBpcyBub24tamF2YQ0KCQkJCQkJaWYgKGNvbnRhaW5zSmF2YShjaGlsZCkpIHsNCgkJCQkJCQl0cmFja09taXNzaW9ucyhqYXZhV2l0aG91dEJyZWUsIGNoaWxkKTsNCgkJCQkJCQlmYWlsdXJlc09jY3VyZWQgPSB0cnVlOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSB7DQoJCQkJCQkJbm9uSmF2YU5vQlJFRSsrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIuIik7DQoNCgkJU3lzdGVtLm91dC5wcmludGxuKCIgIEJ1bmRsZXMgd2l0aCBjb3JyZWN0IEJSRUU6Iik7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgSmF2YSB3aXRoIEJSRUU6ICIgKyB0b3RhbENvdW50KGphdmFXaXRoQnJlZSkpOw0KCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIE5vbiBKYXZhIHdpdGhvdXQgQlJFRToiICsgbm9uSmF2YU5vQlJFRSk7DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIERpc3RyaWJ1dGlvbiBvZiBCUkVFczogIik7DQoJCVNldCBhbGxCUkVFcyA9IGphdmFXaXRoQnJlZS5rZXlTZXQoKTsNCgkJZm9yIChPYmplY3Qgb2JqZWN0IDogYWxsQlJFRXMpIHsNCgkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgamF2YVdpdGhCcmVlLmdldChvYmplY3QpOw0KCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiICsgY291bnQuaW50VmFsdWUoKSArICIgICIgKyBvYmplY3QpOw0KCQl9DQoNCgkJU3lzdGVtLm91dC5wcmludGxuKCIgIEJ1bmRsZXMgd2l0aCBpbmNvcnJlY3QgQlJFRToiKTsNCgkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgSmF2YSBCdW5kbGVzIHdpdGhvdXQgQlJFRTogIiArIGphdmFXaXRob3V0QnJlZS5zaXplKCkpOw0KCQlDb2xsZWN0aW9ucy5zb3J0KGphdmFXaXRob3V0QnJlZSk7DQoJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBqYXZhV2l0aG91dEJyZWUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KCQkJT2JqZWN0IG9iamVjdCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsNCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICIgKyBvYmplY3QpOw0KCQl9DQoJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIE5vbiBKYXZhIEJ1bmRsZXMgd2l0aCBCUkVFOiAiICsgbm9uamF2YVdpdGhCcmVlLnNpemUoKSk7DQoJCUNvbGxlY3Rpb25zLnNvcnQobm9uamF2YVdpdGhCcmVlKTsNCgkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vbmphdmFXaXRoQnJlZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQoJCQlPYmplY3Qgb2JqZWN0ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOw0KCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIiArIG9iamVjdCk7DQoJCX0NCg0KCQlyZXR1cm4gZmFpbHVyZXNPY2N1cmVkOw0KCX0NCg0KCXByaXZhdGUgaW50IHRvdGFsQ291bnQoTWFwIGphdmFXaXRoQnJlZSkgew0KDQoJCUNvbGxlY3Rpb24gYWxsQ291bnRzID0gamF2YVdpdGhCcmVlLnZhbHVlcygpOw0KCQlpbnQgdG90YWwgPSAwOw0KCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQ291bnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCgkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOw0KCQkJdG90YWwgPSB0b3RhbCArIGNvdW50LmludFZhbHVlKCk7DQoJCX0NCgkJcmV0dXJuIHRvdGFsOw0KCX0NCg0KCXByaXZhdGUgdm9pZCB0cmFja09taXNzaW9ucyhMaXN0IGphdmFXaXRob3V0QnJlZSwgRmlsZSBjaGlsZCkgew0KCQlqYXZhV2l0aG91dEJyZWUuYWRkKGNoaWxkLmdldE5hbWUoKSk7DQoNCgl9DQoNCglwcml2YXRlIHZvaWQgdHJhY2tGYWxzZUluY2x1c2lvbnMoTGlzdCBsaXN0LCBGaWxlIGNoaWxkKSB7DQoJCWxpc3QuYWRkKGNoaWxkLmdldE5hbWUoKSk7DQoNCgl9DQoNCglwcml2YXRlIHZvaWQgaW5jcmVtZW50Q291bnRzKE1hcCBicmVlTWFwLCBTdHJpbmcgYnJlZSkgew0KCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIGJyZWVNYXAuZ2V0KGJyZWUpOw0KCQlpZiAoY291bnQgPT0gbnVsbCkgew0KCQkJYnJlZU1hcC5wdXQoYnJlZSwgbmV3IEludGVnZXIoMSkpOw0KCQl9DQoJCWVsc2Ugew0KCQkJYnJlZU1hcC5wdXQoYnJlZSwgaW5jcmVtZW50KGNvdW50KSk7DQoJCX0NCg0KCX0NCg0KCXByaXZhdGUgSW50ZWdlciBpbmNyZW1lbnQoSW50ZWdlciBjb3VudCkgew0KCQlyZXR1cm4gbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpOw0KCX0NCg0KCXByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoRmlsZSBqYXJmaWxlKSB7DQoJCS8vIFdlIGFzc3VtZSB0aGUgZmlsZSBpcyBhICdqYXInIGZpbGUuDQoJCWJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7DQoJCUphckZpbGUgamFyID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7DQoJCQlFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphci5lbnRyaWVzKCk7DQoJCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KCQkJCUphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7DQoJCQkJCWNvbnRhaW5zSmF2YSA9IHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQllbHNlIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgew0KCQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7DQoJCQkJCWlmIChjb250YWluc0phdmEoaW5wdXQpKSB7DQoJCQkJCQljb250YWluc0phdmEgPSB0cnVlOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJfQ0KCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmIChqYXIgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlqYXIuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQl9DQoJCXJldHVybiBjb250YWluc0phdmE7DQoJfQ0KDQoJcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShJbnB1dFN0cmVhbSBpbnB1dCkgew0KCQkvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLg0KCQlib29sZWFuIGNvbnRhaW5zSmF2YSA9IGZhbHNlOw0KDQoJCXRyeSB7DQoJCQlKYXJJbnB1dFN0cmVhbSBqYXJJbnB1dFN0cmVhbSA9IG5ldyBKYXJJbnB1dFN0cmVhbShpbnB1dCk7DQoJCQl3aGlsZSAoamFySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7DQoJCQkJWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsNCgkJCQlpZiAoZW50cnkgIT0gbnVsbCkgew0KCQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgew0KCQkJCQkJY29udGFpbnNKYXZhID0gdHJ1ZTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQlpZiAoaW5wdXQgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlpbnB1dC5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUNCgkJCQl9DQoJCX0NCgkJcmV0dXJuIGNvbnRhaW5zSmF2YTsNCgl9DQoNCglwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVOYW1lKFN0cmluZyBmdWxsbmFtZSkgew0KCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCgkJYm9vbGVhbiBwYXJzYWJsZSA9IG5hbWVQYXJzZXIucGFyc2UoZnVsbG5hbWUpOw0KCQlpZiAocGFyc2FibGUpIHsNCgkJCXJlc3VsdCA9IG5hbWVQYXJzZXIuZ2V0UHJvamVjdFN0cmluZygpOw0KCQl9DQoJCXJldHVybiByZXN1bHQ7DQoJfQ0KDQoJLyoNCgkgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dA0KCSAqIHN0cmVhbS4NCgkgKi8NCglwcml2YXRlIFN0cmluZyBnZXRCUkVFRnJvbU1hbmlmZXN0KElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgcGF0aCkgew0KCQlTdHJpbmcgYnJlZSA9IG51bGw7DQoJCXRyeSB7DQoJCQlNYXAgYXR0cmlidXRlcyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KGlucHV0LCBudWxsKTsNCgkJCWJyZWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChQUk9QRVJUWV9CVU5ETEVfUkVRVUlSRURfRVhFQ1VUSU9OX0VOVklST05NRU5UKTsNCgkJfQ0KCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkJZmluYWxseSB7DQoJCQlpZiAoaW5wdXQgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlpbnB1dC5jbG9zZSgpOw0KCQkJCX0NCgkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQkvLyBpZ25vcmUNCgkJCQl9DQoJCX0NCg0KCQlyZXR1cm4gYnJlZTsNCgl9DQoNCgkvKg0KCSAqIFRoZSBnaXZlbiBmaWxlIHBvaW50cyB0byBhIGJ1bmRsZSBjb250YWluZWQgaW4gYW4gYXJjaGl2ZS4gTG9vayBpbnRvDQoJICogdGhlIGJ1bmRsZSBtYW5pZmVzdCBmaWxlIHRvIGZpbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyLg0KCSAqLw0KCXByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVBBQ0tFREpBUihGaWxlIGZpbGUpIHsNCgkJU3RyaW5nIGlkID0gbnVsbDsNCgkJSmFyRmlsZSBqYXIgPSBudWxsOw0KCQlGaWxlIHRtcGphciA9IG51bGw7DQoJCXRyeSB7DQoJCQlKYXJQcm9jZXNzb3IgamFycHJvY2Vzc29yID0gSmFyUHJvY2Vzc29yLmdldFVucGFja1Byb2Nlc3NvcihudWxsKTsNCgkJCWphcnByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KGdldFRlbXBXb3JraW5nRGlyKCkpOw0KCQkJdG1wamFyID0gamFycHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZSk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQl0bXBqYXIgPSBudWxsOw0KCQl9DQoJCXJldHVybiB0bXBqYXI7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRUZW1wV29ya2luZ0RpcigpIHsNCgkJcmV0dXJuIHRlbXBXb3JraW5nRGlyOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldFRlbXBXb3JraW5nRGlyKFN0cmluZyB0ZW1wV29ya2luZ0Rpcikgew0KCQl0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7DQoJfQ0KDQoJLyoNCgkgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bw0KCSAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4NCgkgKi8NCglwcml2YXRlIFN0cmluZyBnZXRCUkVFRnJvbUpBUihGaWxlIGZpbGUpIHsNCgkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOw0KCQlKYXJGaWxlIGphciA9IG51bGw7DQoJCXRyeSB7DQoJCQlqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOw0KCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsNCgkJCWlmIChlbnRyeSA9PSBudWxsKSB7DQoJCQkJLy8gYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArDQoJCQkJLy8gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCQkJcmV0dXJuIG51bGw7DQoJCQl9DQoJCQlpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7DQoJCQlyZXR1cm4gZ2V0QlJFRUZyb21NYW5pZmVzdChpbnB1dCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQoJCX0NCgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7DQoJCQkvLyBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7DQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQlmaW5hbGx5IHsNCgkJCWlmIChpbnB1dCAhPSBudWxsKQ0KCQkJCXRyeSB7DQoJCQkJCWlucHV0LmNsb3NlKCk7DQoJCQkJfQ0KCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCS8vIGlnbm9yZQ0KCQkJCX0NCgkJCWlmIChqYXIgIT0gbnVsbCkNCgkJCQl0cnkgew0KCQkJCQlqYXIuY2xvc2UoKTsNCgkJCQl9DQoJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJLy8gaWdub3JlDQoJCQkJfQ0KCQl9DQoJfQ0KfQ0KUEsDBAoAAAAAAPCzyToSrLRJCgQAAAoEAAArAAAAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9jb25maWcucHJvcGVydGllcyMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwNCiMgYWJvdXQgZmlsZSwgcGx1Z2luLnhtbCBhbmQgcGx1Z2luLnByb3BlcnRpZXMgZm9yIHRyYW5zbGF0aW9uLA0KIyBhcyB3ZWxsIGFzIGEgemlwIGZpbGUgd2l0aCBzb3VyY2UgYW5kIGFuIGFib3V0Lg0KZGVmYXVsdC5zb3VyY2UuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcDQoJCWFib3V0XC5odG1sDQoNCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgDQojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVINCmRlZmF1bHQuYmluYXJ5LmphciA9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXA0KCQlhYm91dFwuaHRtbA0KDQojIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsDQojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwNCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4gTm90ZSB0aGUNCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcNCmRlZmF1bHQuc291cmNlLnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJXi4qL2Fib3V0XC5odG1sDQoNCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgDQojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVIuIE5vdGUgdGhlDQojIGV4dHJhIGRpcmVjdG9yeSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nDQpkZWZhdWx0LmJpbmFyeS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcDQoJCV4uKi9hYm91dFwuaHRtbA0KDQoNCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgZmVhdHVyZQ0KZGVmYXVsdC5mZWF0dXJlID0gbGljZW5zZVwuaHRtbCwgXA0KCQllcGwtdjEwXC5odG1sUEsDBAoAAAAAADUCyDoF81mRqgcAAKoHAAAvAAAAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9jb25maWdIT0xELnByb3BlcnRpZXMjIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsDQojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwNCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4NCmRlZmF1bHQuc291cmNlLmphciA9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXA0KCQlhYm91dFwuaHRtbCwgXA0KCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcw0KDQojIGRlZmF1bHQgbGF5b3V0IGZvciBhIGJpbmFyeSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsIA0KIyBhYm91dCBmaWxlLCBhbmQgYXQgbGVhc3Qgb25lIGNsYXNzIGZpbGUgb3IgSkFSDQpkZWZhdWx0LmJpbmFyeS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJYWJvdXRcLmh0bWwsIFwNCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMsIFwNCgkJLipcLihjbGFzc3xqYXIpJA0KDQojIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsDQojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwNCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4gTm90ZSB0aGUNCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcNCmRlZmF1bHQuc291cmNlLnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJXi4qL2Fib3V0XC5odG1sLCBcDQoJCV4uKi8ocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMNCg0KIyBkZWZhdWx0IGxheW91dCBmb3IgYSBiaW5hcnkgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LCANCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUi4gTm90ZSB0aGUNCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcNCmRlZmF1bHQuYmluYXJ5LnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJXi4qL2Fib3V0XC5odG1sLCBcDQoJCV4uKi8ocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMsIFwNCgkJLipcLihjbGFzc3xqYXIpJA0KDQojIHNwZWNpYWwgY2FzZSBvZiBhIGNvZGUgYnVuZGxlIG5vdCBjb250YWluaW5nIGNvZGUgPw0Kb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbj0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcDQoJCWFib3V0XC5odG1sLCBcDQoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIA0KCQkNCiMgc3BlY2lhbCBjYXNlIHdpdGggbm8gY29kZTogYnJhbmRpbmcgYnVuZGxlDQpvcmcuZWNsaXBzZS53c3QueHNsPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJYWJvdXRcLmh0bWwsIFwNCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgDQoJCQ0KIyBzcGVjaWFsIGNhc2Ugd2l0aCBubyBjb2RlOiBicmFuZGluZyBidW5kbGUJDQpvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkaz0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcDQoJCWFib3V0XC5odG1sLCBcDQoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAkNCg0KIyBzcGVjaWFsIGNhc2Ugd2l0aCBubyBjb2RlOiBicmFuZGluZyBidW5kbGUJCQkNCm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnByb2ouZW5hYmxlbWVudC5qZHQuc2RrPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJYWJvdXRcLmh0bWwsIFwNCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCQ0KCQkNCiMgc3BlY2lhbCBjYXNlIG9mIGEgYnVuZGxlIHdpdGggbm8gY29kZQkJDQpvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwNCgkJYWJvdXRcLmh0bWwsIFwNCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCQ0KCQkJCQlQSwMECgAAAAAA053POqrBUgDzAwAA8wMAAC8AAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL2V4Y2VwdGlvbnMucHJvcGVydGllc2JyZWVFeGNlcHRpb25zPW9yZy5lY2xpcHNlLnN3dCwgXA0KIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLCBcDQogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcywgXA0KIG9yZy5lY2xpcHNlLnNkay5leGFtcGxlcywgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLCBcDQogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cywgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMsIFwNCiBvcmcuZWNsaXBzZS50ZWFtLmV4YW1wbGVzLmZpbGVzeXN0ZW0sIFwNCiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qYXZhZWRpdG9yLCBcDQogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwsIFwNCiBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLCBcDQogb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLCBcDQogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MsIFwNCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciwgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scywgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciwgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLCBcDQogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiwgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludCwgXA0KIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcywgXA0KIG9yZy5lY2xpcHNlLnRlYW0uZXhhbXBsZXMuZmlsZXN5c3RlbSwgXA0KIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmphdmFlZGl0b3IsIFwNClBLAwQKAAAAAAChCso6KyBZcJEAAACRAAAAHwAAAE9TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMjUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzDQpCdW5kbGUtTmFtZSA9IFJlbGVuZyBUZXN0cyBmb3IgR2FsaWxlbyBSZWxlYXNlDQpCdW5kbGUtVmVuZG9yID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gUmVsZW5nUEsDBAoAAAAAAJQKyjpdg6LnrgIAAK4CAAAIAAAALnByb2plY3Q8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KPHByb2plY3REZXNjcmlwdGlvbj4NCgk8bmFtZT5vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzPC9uYW1lPg0KCTxjb21tZW50PjwvY29tbWVudD4NCgk8cHJvamVjdHM+DQoJPC9wcm9qZWN0cz4NCgk8YnVpbGRTcGVjPg0KCQk8YnVpbGRDb21tYW5kPg0KCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQoJCQk8YXJndW1lbnRzPg0KCQkJPC9hcmd1bWVudHM+DQoJCTwvYnVpbGRDb21tYW5kPg0KCQk8YnVpbGRDb21tYW5kPg0KCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCgkJCTxhcmd1bWVudHM+DQoJCQk8L2FyZ3VtZW50cz4NCgkJPC9idWlsZENvbW1hbmQ+DQoJCTxidWlsZENvbW1hbmQ+DQoJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCgkJCTxhcmd1bWVudHM+DQoJCQk8L2FyZ3VtZW50cz4NCgkJPC9idWlsZENvbW1hbmQ+DQoJPC9idWlsZFNwZWM+DQoJPG5hdHVyZXM+DQoJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCgk8L25hdHVyZXM+DQo8L3Byb2plY3REZXNjcmlwdGlvbj4NClBLAwQKAAAAAAA1Asg6ONSgBAYDAAAGAwAADAAAAHZlcmlmeWRpci5zaA0KaWYgWyAteiAkMSBdDQp0aGVuDQogICAgbG9jPS4vDQplbHNlDQogICAgbG9jPSR7MX0NCmZpDQppZiBbIC16ICQyIF0NCnRoZW4NCiAgICBwYXQ9Ii4qXChcLmphciRcfFwuamFyXC5wYWNrXC5neiRcKSINCmVsc2UNCiAgICBwYXQ9IiR7Mn0iDQpmaQ0KDQojIFZFUklGWU9VVERJUiBpcyB1c2VkIGluICd2ZXJpZnkuc2gnIGFuZCBtdXN0IGJlIGNsZWFuIGJlZm9yZQ0KIyBiZWdpbm5pbmcNCmV4cG9ydCBWRVJJRllPVVRESVI9IiR7SE9NRX0iL3ZlcmlmeW91dGRpcg0KDQojIG1ha2UsIGluIGNhc2UgZG9lc24ndCBleGlzdA0KbWtkaXIgLXAgIiR7VkVSSUZZT1VURElSfSINCg0KIyBldmVuIHRob3VnaCB3ZSBqdXN0IHNldCBpdCBhYm92ZSwgaW5jbHVkZSB0aGUgaWYgY2hlY2sgDQojIGhlcmUgdG8gZ2F1cmQgYWdhaW5zdCBmdXR1cmUgZXJyb3JzLCBzaW5jZSBpZiAndmVyZml5b3V0ZGlyJyBpcyANCiMgbm90IGRlZmluZWQsIHRoZSByZW1vdmUgaWYgZm9yIHRoZSByb290IGRpcmVjdG9yeSEgDQppZiBbWyAtbiAiJHtWRVJJRllPVVRESVJ9IiBdXQ0KdGhlbiANCiAgICAgICBybSAtZnIgIiR7VkVSSUZZT1VURElSfSIvKg0KZmkNCg0KZWNobyAiICAgdmVyaWZ5IGRpcmVjdG9yeTogJHtsb2N9IjsNCmVjaG8gIiAgICAgIGZvciBwYXR0ZXJuOiAgICAke3BhdH0iOw0KZWNobyAiICAgb3V0cHV0IGZpbGVzIGluICIgIiR7VkVSSUZZT1VURElSfSIgDQoNCmZpbmQgIiR7bG9jfSIgLXJlZ2V4ICIke3BhdH0iIC1leGVjIHZlcmlmeS5zaCAne30nIFw7DQoNClBLAwQKAAAAAACnDso6Y3PMwHYBAAB2AQAACgAAAC5jbGFzc3BhdGg8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KPGNsYXNzcGF0aD4NCgk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCgk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQoJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQoJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQo8L2NsYXNzcGF0aD4NClBLAwQKAAAAAAAVEco60eAxI/0AAAD9AAAAFgAAAHJ1bkVjbGlwc2VBbnRSdW5uZXIuc2gjIS91c3IvYmluL2VudiBiYXNoDQoNCnNvdXJjZSBnYWxpbGVvX3Byb3BlcnRpZXMuc2hzb3VyY2UNCg0KIiR7RUNMSVBTRV9IT01FX1RFU1R9Ii9lY2xpcHNlIC1jb25zb2xlbG9nIC1kYXRhIC4vcnVuRWNsaXBzZVRlc3RzIC1ub3NwbGFzaCAtLWxhdW5jaGVyLnN1cHByZXNzRXJyb3JzIC12bSAiJHtKQVZBX0VYRUNfRElSfSIgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lciAtZiBydW5UZXN0cy54bWwgIiRAIg0KUEsDBAoAAAAAADUCyDqyfwLuGQAAABkAAAAWAAAAY2hlY2tMYXlvdXRNYW5pZmVzdC5tZk1hbmlmZXN0LVZlcnNpb246IDEuMA0KDQpQSwMECgAAAAAAYAzKOqOz+fwbCwAAGwsAABIAAABnYWxpbGVvLnByb3BlcnRpZXMjIS91c3IvYmluL2VudiBiYXNoDQoNCiMgY29tbW9uIHZhcmlhYmxlcyB1c2VkIGluIHV0aWxpdHkgc2NyaXB0cw0KIyAobm90ZTogYXQgdGhpcyBwb2ludCwgbm90IGFsbCBhcmUgbmVjZXNzYXJpbHkgdXNlZCkNCg0KIyBJdCBpcyByZXF1aXJlZCB0byBzcGVjaWZ5IGEgdG9wIGxldmVsIGRpcmVjdG9yeSwgdGhhdCB3aWxsIGNvbnRhaW4gYWxsIGVsc2UgaW52b2x2ZWQgd2l0aCBidWlsZCwgY29udHJvbCBhbmQgb3V0cHV0DQpCVUlMRF9IT01FPS9zaGFyZWQvZ2FsaWxlby9idWNreUJ1aWxkDQojIGEgY29tbW9uIHZhcmlhdGlvbiBmb3Igc29tZW9uZSBkb2luZyBhIGxvY2FsIGJ1aWxkIG9uIHRoZWlyIG93biBtYWNoaW5lDQojQlVJTERfSE9NRT1KOi9nYnVpbGQvYnVja3lCdWlsZA0KDQojIG9uIGFueSBub24tcHJvZHVjdGlvbiBtYWNoaW5lcyBpdCBpcyBpbXBvcnRhbnQgdG8gX25vdF8gdXNlIGVjbGlwc2UucDIubWlycm9ycz1mYWxzZQ0KIyBzbyBzdXBwbHkgQlVJTERFUl9WTV9BUkdTIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBpdA0KI0JVSUxERVJfVk1fQVJHUz0tdm1hcmdzIC1YbXgyNTZtIA0KDQojIG9uIGEgbm9uLXByb2R1Y3Rpb24gbWFjaGluZSwgd2lsbCBzb21ldGltZXMgd2FudCB0byB0d2VhayB0aGUgQlVJTERFUl9BUFBfQVJHUyB0byBkbyBsZXNzLCBhbmQgZmluaXNoIGZhc3RlciwgDQojIHN1Y2ggYXMgdXNlIC12ZXJpZnlPbmx5IG9yIC11cGRhdGVPbmx5DQojIGFzIHdlbGwgYXMgYXZvaWQgdGhlIC1wcm9kdWN0aW9uIGZsYWchIA0KIyBhbmQgcG9zc2libHkgc2V0dXAgbW9ja0VtYWlsDQojQlVJTERFUl9BUFBfQVJHUz0tbm9CcmFuZGluZ0J1aWxkIC12ZXJpZnlPbmx5IC11cGRhdGVPbmx5IC1idWlsZE1vZGVsICR7QlVJTERfSE9NRX0vb3JnLmVjbGlwc2UuZ2FsaWxlby5idWlsZC9nYWxpbGVvLmJ1aWxkIC1idWlsZFJvb3QgJHtCVUlMRF9SRVNVTFRTfSAtcGFja2VkU3RyYXRlZ3kgY29weSAtYnJhbmRpbmdDb250cmlidXRpb24gR2FsaWxlbyAtdHJ1c3RlZENvbnRyaWJ1dGlvbnMgRWNsaXBzZSAtbG9nTGV2ZWwgREVCVUcNCg0KIyBTS0lQX01PREVMX1JFVFJJRVZFIHNob3VsZCBuZXZlciBiZSBzZXQgKG5vdCBldmVuIHRvIGZhbHNlKSBvbiBwcm9kdWN0aW9uIG1hY2hpbmUuIA0KIyBZb3UgY2FuIHNldCB3aGVuIHRlc3RpbmcgbG9jYWwgdmVyc2lvbnMgeW91IGRvbid0IHdhbnQgdGhlbSBvdmVyd3JpdHRlbiBieSBIRUFEIHZlcnNpb24uICANCiMgU0tJUF9NT0RFTF9SRVRSSUVWRT10cnVlDQoNCg0KIyBBbnQgYW5kIEphdmEgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgcGVyIG1hY2hpbmUsIHNvIHRoaXMgdmFyaWFibGUgcG9pbnQgdG8gdmFsaWQgaW5zdGFsbHMNCkFOVF9IT01FPS9zaGFyZWQvY29tbW9uL2FwYWNoZS1hbnQtMS43LjENCiNBTlRfSE9NRT1KOi93b3JrL2FwYWNoZS1hbnQtMS43LjANCg0KSkFWQV81X0hPTUU9L3NoYXJlZC9jb21tb24vaWJtLWphdmEyLXBwYy01MA0KSkFWQV82X0hPTUU9L3NoYXJlZC9jb21tb24vaWJtLWphdmEtcHBjLTYwNA0KI0pBVkFfNV9IT01FPUo6L0pES3MvaWJtLWphdmEyLXNkay01MC13aW4taTM4Ng0KI0pBVkFfNl9IT01FPUo6L0pES3MvaWJtLWpkay02LXNyMw0KDQoNCg0KIyB0eXBpY2FsbHkgdGhlIGZvbGxvd2luZyB3b3VsZCBub3QgaGF2ZSB0byBiZSBjaGFuZ2VkIG9uIGEgbG9jYWwsIG5vbi1wcm9kdWN0aW9uIG1hY2hpbmUNCg0KSkFWQV9IT01FPSR7SkFWQV81X0hPTUV9DQpKQVZBX0VYRUNfRElSPSR7SkFWQV9IT01FfS9qcmUvYmluLw0KUkVMRU5HX1RPT0xTPW9yZy5lY2xpcHNlLmdhbGlsZW8udG9vbHMNClJFTEVOR19URVNUUz1vcmcuZWNsaXBzZS5nYWxpbGVvLnRlc3RzDQoNCiMgcGxhdGZvcm0gaW5zdGFsbC4gT25lIGxldmVsIGFib3ZlIHdoYXQgd2lsbCBjb250YWluIHRoZSAnZWNsaXBzZScgZGlyZWN0b3J5Lg0KRUNMSVBTRV9JTlNUQUxMPSR7QlVJTERfSE9NRX0vcHJlcmVxcw0KIyB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGVjbGlwc2UgZXhlY3V0YWJsZQ0KRUNMSVBTRV9IT01FPSR7RUNMSVBTRV9JTlNUQUxMfS9lY2xpcHNlDQoNCiMgSG9sZHMgdGhlIGJ1aWxkIHJlc3VsdHMNCkJVSUxEX1JFU1VMVFM9JHtCVUlMRF9IT01FfS9idWlsZHJlc3VsdHMNCg0KDQojIGNvbW1vbiBsb2NhdGlvbiB0byBzdG9yZSBwcmUtcmVxcyB0byBhdm9pZCByZS1kb3dubG9hZGluZyBQbGF0Zm9ybXMsIGV0Yy4NClBSRVJFUVNfQ0FDSEU9JHtCVUlMRF9IT01FfS9wcmVyZXFzQ2FjaGUNCg0Kc3RhZ2luZ0RpcmVjdG9yeT0vaG9tZS9kYXRhL2h0dHBkL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL3N0YWdpbmcNCnJlbGVhc2VEaXJlY3Rvcnk9L2hvbWUvZGF0YS9odHRwZC9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy9nYWxpbGVvDQoNCiNOb3RlOiB0aGlzIGRpcmVjdG9yeSBvbiBidWlsZC5lY2xpcHNlLm9yZyBoYXMgYW4gYWxpYXMgc28gdGhhdA0KI2l0IGlzIGFjY2Vzc2libGUgYXMgYSBwc2V1ZG8gdXBkYXRlIHNpdGUgdmlhIHRoaXMgVVJMOiANCiNodHRwOi8vYnVpbGQuZWNsaXBzZS5vcmcvZ2FsaWxlby9zdGFnaW5nLw0KDQojSXQgY2FuIG5vdCByZWFsbHkgYmUgdXNlZCBhcyBhbiB1cGRhdGUgc2l0ZQ0KI2FzIGFuIHVwZGF0ZSBzaXRlLCBzaW5jZSB0aGUgbWlycm9yIFVSTHMgaW4gdGhlIA0KI2FydGlmYWN0cy5qYXIgYW5kIGNvbnRlbnQuamFyIGFyZSBzZXQgdG8gdGhlIA0KI2V2ZW50dWFsIC9yZWxlYXNlcy9nYWxpbGVvLiANCiNJdCBjYW4gYmUgdXNlZCwgaG93ZXZlciwgdG8gbWFrZSBzdXJlIGNhdGVnb3JpZXMgYXJlIA0KI3Nob3dpbmcgdXAgY29ycmVjdGx5LiANClBLAwQKAAAAAAA1Asg6BKsUKWwAAABsAAAABgAAAGFudC5zaCMhL2Jpbi9zaA0KDQpzb3VyY2UgZ2FsaWxlb19wcm9wZXJ0aWVzLnNoc291cmNlDQoNCkFOVF9DTUQ9IiR7QU5UX0hPTUV9L2Jpbi9hbnQiDQoke0FOVF9IT01FfS9iaW4vYW50ICIkQCINClBLAwQKAAAAAAA1Asg68Y9tCLEFAACxBQAACgAAAGFib3V0Lmh0bWw8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPg0KPHRpdGxlPkFib3V0PC90aXRsZT4NCjwvaGVhZD4NCjxib2R5IGxhbmc9IkVOLVVTIj4NCjxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KIA0KPFA+SnVuZSwgMjAwODwvUD4JDQo8aDM+TGljZW5zZTwvaDM+DQoNCjxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSANCmF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQpGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KDQo8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIA0KcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQppbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudA0KYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCg0KPC9ib2R5Pg0KPC9odG1sPlBLAwQKAAAAAAB7nM86+eVmdj0sAAA9LAAAKAAAAG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvQlJFRVRlc3QuY2xhc3PK/rq+AAAAMQHtBwACAQAib3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9CUkVFVGVzdAcABAEAGGp1bml0L2ZyYW1ld29yay9UZXN0Q2FzZQEADUVYVEVOU0lPTl9KQVIBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQAELmphcgEAFEVYVEVOU0lPTl9QQUNFS0RfSkFSCAAMAQAMLmphci5wYWNrLmd6AQANRVhURU5TSU9OX1pJUAgADwEABC56aXABAC5QUk9QRVJUWV9CVU5ETEVfUkVRVUlSRURfRVhFQ1VUSU9OX0VOVklST05NRU5UAQASTGphdmEvbGFuZy9PYmplY3Q7AQAKbmFtZVBhcnNlcgEALUxvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0Z1bGxKYXJOYW1lUGFyc2VyOwEACUJBQ0tTTEFTSAgAFgEAAVwBAA5MSVRFUkFMX1BFUklPRAgAGQEAAlwuAQADQU5ZCAAcAQACLioBABBkaXJlY3RvcnlUb0NoZWNrAQAOdGVtcFdvcmtpbmdEaXIBAAg8Y2xpbml0PgEAAygpVgEABENvZGUIACMBACNCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudAkAAQAlDAAQABEHACcBACtvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0Z1bGxKYXJOYW1lUGFyc2VyCgAmACkMACoAIAEABjxpbml0PgkAAQAsDAASABMBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAKQEABHRoaXMBACRMb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9CUkVFVGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgkANQA3BwA2AQAQamF2YS9sYW5nL1N5c3RlbQwAOAA5AQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CAA7AQAWc3RhcnQgQlJFRSBDaGVja3MgbWFpbgoAPQA/BwA+AQATamF2YS9pby9QcmludFN0cmVhbQwAQABBAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQApCABEAQALRDpcdGVtcHRlc3QKAAEARgwARwBBAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQBJDABKAEsBABN0ZXN0QlJFRVNldHRpbmdSdWxlAQADKClaAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsHAFIBABlqdW5pdC9mcmFtZXdvcmsvVGVzdFN1aXRlCgBRAFQMACoAVQEAFChMamF2YS9sYW5nL0NsYXNzOylWAQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABAFkMAB0ABgEAEGJ1bmRsZURpclRvQ2hlY2sKAAEAXAwAVgBXCABeAQAtTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuCgABAGAMAGEAYgEADWFzc2VydE5vdE51bGwBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7KVYIAGQBAAEvCgBmAGgHAGcBABBqYXZhL2xhbmcvU3RyaW5nDABpAGoBAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWgcAbAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgBmAG4MAG8AcAEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAawByDAAqAEEIAHQBAAdwbHVnaW5zCgBrAHYMAHcAeAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAawB6DAB7AFcBAAh0b1N0cmluZwgAfQEACC9wbHVnaW5zBwB/AQAMamF2YS9pby9GaWxlCgB+AHIIAIIBABJidW5kbGUgZGlyZWNvdHJ5ICgIAIQBACApIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgoAfgCGDACHAEsBAAZleGlzdHMKAH4AiQwAigBLAQALaXNEaXJlY3RvcnkKAAEAjAwAjQCOAQAKYXNzZXJ0VHJ1ZQEAFihMamF2YS9sYW5nL1N0cmluZztaKVYKAAEAkAwAkQCSAQAPY2hlY2tCdW5kbGVCUkVFAQARKExqYXZhL2lvL0ZpbGU7KVoBAAhwcm9wZXJ0eQEAD2J1bmRsZURpcmVjdG9yeQEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAA9mYWlsdXJlc09jY3VyZWQBAAFaCgCaAJwHAJsBABBqYXZhL2xhbmcvT2JqZWN0DACdAJ4BAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsIAKABABVleGNlcHRpb25zLnByb3BlcnRpZXMKAKIApAcAowEAD2phdmEvbGFuZy9DbGFzcwwApQCmAQATZ2V0UmVzb3VyY2VBc1N0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07BwCoAQAUamF2YS91dGlsL1Byb3BlcnRpZXMKAKcAKQgAqwEAAAoApwCtDACuAK8BAARsb2FkAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCACxAQAOYnJlZUV4Y2VwdGlvbnMKAKcAswwAtAC1AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAtwC5BwC4AQATamF2YS9pby9JT0V4Y2VwdGlvbgwAugAgAQAPcHJpbnRTdGFja1RyYWNlCgC8AL4HAL0BABNqYXZhL2lvL0lucHV0U3RyZWFtDAC/ACABAAVjbG9zZQcAwQEAE2phdmEvdXRpbC9BcnJheUxpc3QKAMAAKQcAxAEAEWphdmEvdXRpbC9IYXNoTWFwCgDDACkKAH4AxwwAyADJAQAJbGlzdEZpbGVzAQARKClbTGphdmEvaW8vRmlsZTsKAH4AywwAzABXAQAHZ2V0TmFtZQoAZgDODADPAFcBAAt0b0xvd2VyQ2FzZQoAAQDRDADSANMBABRnZXRGaWxlRnJvbVBBQ0tFREpBUgEAHihMamF2YS9pby9GaWxlOylMamF2YS9pby9GaWxlOwoAAQDVDADWALUBAA1nZXRCdW5kbGVOYW1lCgBmANgMANkA2gEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABANwMAN0A3gEADmdldEJSRUVGcm9tSkFSAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwoAZgDgDADhAOIBAAZsZW5ndGgBAAMoKUkKAAEA5AwA5QCSAQAMY29udGFpbnNKYXZhCgABAOcMAOgA6QEAD2luY3JlbWVudENvdW50cwEAJChMamF2YS91dGlsL01hcDtMamF2YS9sYW5nL1N0cmluZzspVgoAAQDrDADsAO0BABR0cmFja0ZhbHNlSW5jbHVzaW9ucwEAIShMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTspVgoAAQDvDADwAO0BAA50cmFja09taXNzaW9ucwgA8gEACyAgIENoZWNrZWQgCgBrAPQMAHcA9QEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAPcBAAQgb2YgCAD5AQABLggA+wEAHCAgQnVuZGxlcyB3aXRoIGNvcnJlY3QgQlJFRToIAP0BABMgICBKYXZhIHdpdGggQlJFRTogCgABAP8MAQABAQEACnRvdGFsQ291bnQBABIoTGphdmEvdXRpbC9NYXA7KUkIAQMBABkgICBOb24gSmF2YSB3aXRob3V0IEJSRUU6CAEFAQAbICAgIERpc3RyaWJ1dGlvbiBvZiBCUkVFczogCwEHAQkHAQgBAA1qYXZhL3V0aWwvTWFwDAEKAQsBAAZrZXlTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsBDQEPBwEOAQANamF2YS91dGlsL1NldAwBEAERAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwETARUHARQBABJqYXZhL3V0aWwvSXRlcmF0b3IMARYBFwEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwsBBwEZDAEaARsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwcBHQEAEWphdmEvbGFuZy9JbnRlZ2VyCAEfAQADICAgCgEcASEMASIA4gEACGludFZhbHVlCAEkAQACICAKAGsBJgwAdwEnAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CwETASkMASoASwEAB2hhc05leHQIASwBAB4gIEJ1bmRsZXMgd2l0aCBpbmNvcnJlY3QgQlJFRToIAS4BAB8gICAgSmF2YSBCdW5kbGVzIHdpdGhvdXQgQlJFRTogCwEwATIHATEBAA5qYXZhL3V0aWwvTGlzdAwBMwDiAQAEc2l6ZQoBNQE3BwE2AQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDAE4ATkBAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgsBMAEPCAE8AQAHICAgICAgIAgBPgEAICAgICBOb24gSmF2YSBCdW5kbGVzIHdpdGggQlJFRTogAQAOcHJvcGVydHlTdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABdicmVlRXhjZXB0aW9uUHJvcGVydGllcwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAGZXJyb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEADGphdmFXaXRoQnJlZQEAD0xqYXZhL3V0aWwvTWFwOwEAD25vbmphdmFXaXRoQnJlZQEAD2phdmFXaXRob3V0QnJlZQEADW5vbkphdmFOb0JSRUUBAAFJAQAIY2hpbGRyZW4BAA9bTGphdmEvaW8vRmlsZTsBAAl0b3RhbHNpemUBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEACmJ1bmRsZU5hbWUBAARicmVlAQAIYWxsQlJFRXMBAA9MamF2YS91dGlsL1NldDsBAAZvYmplY3QBAAVjb3VudAEAE0xqYXZhL2xhbmcvSW50ZWdlcjsBABRMamF2YS91dGlsL0l0ZXJhdG9yOwsBBwFdDAFeAV8BAAZ2YWx1ZXMBABgoKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjsLAWEBDwcBYgEAFGphdmEvdXRpbC9Db2xsZWN0aW9uAQAJYWxsQ291bnRzAQAWTGphdmEvdXRpbC9Db2xsZWN0aW9uOwEABXRvdGFsCwEwAWcMAWgBaQEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEABGxpc3QKARwBbAwAKgFtAQAEKEkpVgsBBwFvDAFwAXEBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFzDAF0AXUBAAlpbmNyZW1lbnQBACgoTGphdmEvbGFuZy9JbnRlZ2VyOylMamF2YS9sYW5nL0ludGVnZXI7AQAHYnJlZU1hcAcBeAEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoBdwF6DAAqAXsBABMoTGphdmEvaW8vRmlsZTtaSSlWCgF3AX0MAX4BfwEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwGBAYMHAYIBABVqYXZhL3V0aWwvRW51bWVyYXRpb24MAYQBFwEAC25leHRFbGVtZW50BwGGAQAWamF2YS91dGlsL2phci9KYXJFbnRyeQoBhQDLCAGJAQAGLmNsYXNzCgF3AYsMAYwBjQEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEBjwwA5QGQAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylaCwGBAZIMAZMASwEAD2hhc01vcmVFbGVtZW50cwoAtwGVDAGWAFcBAApnZXRNZXNzYWdlCgF3AL4BAAdqYXJmaWxlAQADamFyAQAXTGphdmEvdXRpbC9qYXIvSmFyRmlsZTsBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEABWVudHJ5AQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7AQAFaW5wdXQBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAxTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS91dGlsL2phci9KYXJFbnRyeTs+OwcBogEAHGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW0KAaEBpAwAKgCvCgGhAaYMAacBqAEADGdldE5leHRFbnRyeQEAGigpTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgGqAMsHAasBABZqYXZhL3V0aWwvemlwL1ppcEVudHJ5CgGhAa0MAa4A4gEACWF2YWlsYWJsZQEADmphcklucHV0U3RyZWFtAQAeTGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW07AQAYTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgAmAbMMAbQAagEABXBhcnNlCgAmAbYMAbcAVwEAEGdldFByb2plY3RTdHJpbmcBAAhmdWxsbmFtZQEABnJlc3VsdAEACHBhcnNhYmxlAQATZ2V0QlJFRUZyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgG+AcAHAb8BACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAHBAcIBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsKAcQAuQcBxQEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24BAARwYXRoAQAKYXR0cmlidXRlcwEAJExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlRXhjZXB0aW9uOwoBygHMBwHLAQBFb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yDAHNAc4BABJnZXRVbnBhY2tQcm9jZXNzb3IBAF8oTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOylMb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yOwoAAQHQDAHRAFcBABFnZXRUZW1wV29ya2luZ0RpcgoBygHTDAHUAEEBABNzZXRXb3JraW5nRGlyZWN0b3J5CgHKAdYMAdcA0wEACnByb2Nlc3NKYXIBAARmaWxlAQACaWQBAAZ0bXBqYXIBAAxqYXJwcm9jZXNzb3IBAEdMb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vz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bnRWYWx1ZQMAAAAAAQALU1RBUlRfR1JPVVABABJMamF2YS9sYW5nL1N0cmluZzsBAAlFTkRfR1JPVVABAApVTkRFUlNDT1JFAQAJQkFDS1NMQVNIAQAOTElURVJBTF9QRVJJT0QBAAlBTllESUdJVFMBAANBTlkBAAdwYXR0ZXJuAQAZTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwEADXByb2plY3RTdHJpbmcBAA12ZXJzaW9uU3RyaW5nAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAZDAAVABYIABsBAAEoCQABAB0MAAkACggAHwEAASkJAAEAIQwACwAKCAAjAQABXwkAAQAlDAAMAAoIACcBAAFcCQABACkMAA0ACgcAKwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgAtAC8HAC4BABBqYXZhL2xhbmcvU3RyaW5nDAAwADEBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKACoAMwwAFQA0AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCAA2AQABLgoAKgA4DAA5ADoBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKACoAPAwAPQA+AQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQBADAAOAAoIAEIBAAFkCABEAQABKgkAAQBGDAAPAAoIAEgBAAIuKgkAAQBKDAAQAAoIAEwBAAE/CgBOAFAHAE8BABdqYXZhL3V0aWwvcmVnZXgvUGF0dGVybgwAUQBSAQAHY29tcGlsZQEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwkAAQBUDAARABIBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAtTG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvRnVsbEphck5hbWVQYXJzZXI7AQAFcGFyc2UBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAFwBAAAJAAEAXgwAEwAKCQABAGAMABQACgoATgBiDABjAGQBAAdtYXRjaGVyAQAzKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7CgBmAGgHAGcBABdqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcgwAaQBqAQAHbWF0Y2hlcwEAAygpWgoAZgBsDABtAG4BAAVncm91cAEAFShJKUxqYXZhL2xhbmcvU3RyaW5nOwEABGxpbmUBAAZyZXN1bHQBABlMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7AQAQZ2V0UHJvamVjdFN0cmluZwEAEGdldFZlcnNpb25TdHJpbmcBAApTb3VyY2VGaWxlAQAWRnVsbEphck5hbWVQYXJzZXIuamF2YQAgAAEAAwAAAAsAGgAFAAYAAQAHAAAAAgAIAAIACQAKAAAAAgALAAoAAAACAAwACgAAAAIADQAKAAAAAgAOAAoAAAACAA8ACgAAAAIAEAAKAAAAAgARABIAAAACABMACgAAAAIAFAAKAAAABAABABUAFgABABcAAAFTAAQAAQAAAQUqtwAYKhIatQAcKhIetQAgKhIitQAkKhImtQAoKrsAKlkqtAAouAAstwAyEjW2ADe2ADu1AD8quwAqWSq0ACi4ACy3ADISQbYANxJDtgA3tgA7tQBFKhJHtQBJKrsAKlkqtAAcuAAstwAyKrQASbYANyq0ACC2ADcqtAAktgA3KrQAHLYANyq0ABy2ADcqtABFtgA3KrQAILYANyq0AD+2ADcqtAActgA3KrQARbYANyq0ACC2ADcqtAA/tgA3KrQAHLYANyq0AEW2ADcqtAAgtgA3KrQAHLYANyq0AD+2ADcqtABJtgA3KrQAILYANxJLtgA3KrQAILYAN7YAO7gATbUAU7EAAAACAFUAAAAqAAoAAAAlAAQAFgAKABcAEAAYABYAGQAcABoANgAbAFUAHABbAB0BBAAmAFYAAAAMAAEAAAEFAFcAWAAAAAEAWQBaAAEAFwAAAKUAAwAEAAAAOQM9KhJbtQBdKhJbtQBfKrQAUyu2AGFOLbYAZZoACAM9pwAXKi0EtgBrtQBdKi0FtgBrtQBfBD0crAAAAAIAVQAAACoACgAAACkAAgAqAAgAKwAOACwAFwAuAB4ALwAjADgALAA5ADUAOgA3AEEAVgAAACoABAAAADkAVwBYAAAAAAA5AG8ACgABAAIANwBwAAYAAgAXACIAYwBxAAMAAQByAD4AAQAXAAAALwABAAEAAAAFKrQAXbAAAAACAFUAAAAGAAEAAABGAFYAAAAMAAEAAAAFAFcAWAAAAAEAcwA+AAEAFwAAAC8AAQABAAAABSq0AF+wAAAAAgBVAAAABgABAAAATABWAAAADAABAAAABQBXAFgAAAABAHQAAAACAHVQSwMECgAAAAAAM7jOOkhnWM9gGAAAYBgAACsAAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1BhY2syMDBUZXN0LmNsYXNzyv66vgAAADEBRQcAAgEAJW9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvUGFjazIwMFRlc3QHAAQBABhqdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UBAA1FWFRFTlNJT05fSkFSAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEABC5qYXIBABRFWFRFTlNJT05fUEFDRUtEX0pBUggADAEADC5qYXIucGFjay5negEADUVYVEVOU0lPTl9aSVAIAA8BAAQuemlwAQAKbmFtZVBhcnNlcgEALUxvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0Z1bGxKYXJOYW1lUGFyc2VyOwEACUJBQ0tTTEFTSAEADkxJVEVSQUxfUEVSSU9EAQADQU5ZAQAQZGlyZWN0b3J5VG9DaGVjawEABjxpbml0PgEAAygpVgEABENvZGUKAAMAGgwAFgAXBwAcAQArb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9GdWxsSmFyTmFtZVBhcnNlcgoAGwAaCQABAB8MABAAEQgAIQEAAVwJAAEAIwwAEgAGBwAlAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKACcAKQcAKAEAEGphdmEvbGFuZy9TdHJpbmcMACoAKwEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAJAAtDAAWAC4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIADABAAEuCgAkADIMADMANAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAJAA2DAA3ADgBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABADoMABMABggAPAEAAi4qCQABAD4MABQABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACdMb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9QYWNrMjAwVGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgkARgBIBwBHAQAQamF2YS9sYW5nL1N5c3RlbQwASQBKAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CABMAQAWc3RhcnQgUGFjazIwMFRlc3QgbWFpbgoATgBQBwBPAQATamF2YS9pby9QcmludFN0cmVhbQwAUQAuAQAHcHJpbnRsbgoAAQAaCABUAQALRDpcdGVtcHRlc3QKAAEAVgwAVwAuAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQBZDABaAFsBAA50ZXN0QnVuZGxlUGFjawEAAygpWgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7BwBiAQAZanVuaXQvZnJhbWV3b3JrL1Rlc3RTdWl0ZQoAYQBkDAAWAGUBABQoTGphdmEvbGFuZy9DbGFzczspVgEAE2dldERpcmVjdG9yeVRvQ2hlY2sJAAEAaAwAFQAGAQAQYnVuZGxlRGlyVG9DaGVjawoAAQBrDABmADgIAG0BAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAAEAbwwAcABxAQANYXNzZXJ0Tm90TnVsbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVggAcwEAAS8KACcAdQwAdgB3AQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAHkBAAdwbHVnaW5zCAB7AQAIL3BsdWdpbnMHAH0BAAxqYXZhL2lvL0ZpbGUKAHwALQgAgAEAEmJ1bmRsZSBkaXJlY290cnkgKAgAggEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgB8AIQMAIUAWwEABmV4aXN0cwoAfACHDACIAFsBAAtpc0RpcmVjdG9yeQoAAQCKDACLAIwBAAphc3NlcnRUcnVlAQAWKExqYXZhL2xhbmcvU3RyaW5nO1opVggAjgEAGSBMaXN0IEJ1bmRsZXMgbm90IHBhY2tlZC4KAAEAkAwAkQCSAQAQY2hlY2tGaWxlc1BhY2tlZAEAEShMamF2YS9pby9GaWxlOylaAQAIcHJvcGVydHkBAA9idW5kbGVEaXJlY3RvcnkBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgcAmgEAE2phdmEvdXRpbC9BcnJheUxpc3QKAJkAGgoAfACdDACeAJ8BAAlsaXN0RmlsZXMBABEoKVtMamF2YS9pby9GaWxlOwoAfAChDACiADgBAAdnZXROYW1lCgB8AKQMAKUAWwEABmlzRmlsZQoAAQCnDACoAKkBAAxnZXRCYXNpY05hbWUBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAGwCrDACsAHcBAAVwYXJzZQgArgEAMSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkLALAAsgcAsQEADmphdmEvdXRpbC9MaXN0DACzALQBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAAEAtgwAtwCSAQAMY29udGFpbnNKYXZhCgAbALkMALoAOAEAEGdldFByb2plY3RTdHJpbmcIALwBAA4gaXMgbm90IHBhY2tlZAgAvgEACyAgIENoZWNrZWQgCgAkAMAMADMAwQEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAMMBAAQgb2YgCADFAQARICAgRXJyb3JzIGZvdW5kOiALALAAxwwAyADJAQAEc2l6ZQEAAygpSQoAywDNBwDMAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDADOAM8BAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgsAsADRDADSANMBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLANUA1wcA1gEAEmphdmEvdXRpbC9JdGVyYXRvcgwA2ADZAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CgBOANsMAFEA3AEAFShMamF2YS9sYW5nL09iamVjdDspVgsA1QDeDADfAFsBAAdoYXNOZXh0CADhAQA0RXJyb3JzIGluIHBhY2syMDAgcnVsZS4gQ2hlY2sgZXJyb3IgbG9nIGZvciBkZXRhaWxzLgEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEACWJhc2ljTmFtZQEABXZhbGlkAQAKYnVuZGxlbmFtZQEABGl0ZXIBABRMamF2YS91dGlsL0l0ZXJhdG9yOwcA8gEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoA8QD0DAAWAPUBABMoTGphdmEvaW8vRmlsZTtaSSlWCgDxAPcMAPgA+QEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwD7AP0HAPwBABVqYXZhL3V0aWwvRW51bWVyYXRpb24MAP4A2QEAC25leHRFbGVtZW50BwEAAQAWamF2YS91dGlsL2phci9KYXJFbnRyeQoA/wChCAEDAQAGLmNsYXNzCgDxAQUMAQYBBwEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEBCQwAtwEKAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylaCwD7AQwMAQ0AWwEAD2hhc01vcmVFbGVtZW50cwoBDwERBwEQAQATamF2YS9pby9JT0V4Y2VwdGlvbgwBEgAXAQAPcHJpbnRTdGFja1RyYWNlCgDxARQMARUAFwEABWNsb3NlAQAHamFyZmlsZQEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVlbnRyeQEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwEABWlucHV0AQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBADFMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3V0aWwvamFyL0phckVudHJ5Oz47BwEjAQAcamF2YS91dGlsL2phci9KYXJJbnB1dFN0cmVhbQoBIgElDAAWASYBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYKASIBKAwBKQEqAQAMZ2V0TmV4dEVudHJ5AQAaKClMamF2YS91dGlsL3ppcC9aaXBFbnRyeTsKASwAoQcBLQEAFmphdmEvdXRpbC96aXAvWmlwRW50cnkKASIBLwwBMADJAQAJYXZhaWxhYmxlCgEyARQHATMBABNqYXZhL2lvL0lucHV0U3RyZWFtAQAOamFySW5wdXRTdHJlYW0BAB5MamF2YS91dGlsL2phci9KYXJJbnB1dFN0cmVhbTsBABhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTsKACcBOAwBOQE6AQALbGFzdEluZGV4T2YBABUoTGphdmEvbGFuZy9TdHJpbmc7KUkKACcBPAwBPQE+AQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwEACGZ1bGxuYW1lAQAJZXh0ZW5zaW9uAQAGcmVzdWx0AQADcG9zAQAKU291cmNlRmlsZQEAEFBhY2syMDBUZXN0LmphdmEAIQABAAMAAAAIABoABQAGAAEABwAAAAIACAAaAAoABgABAAcAAAACAAsAGgANAAYAAQAHAAAAAgAOAAIAEAARAAAAAgASAAYAAAACABMABgAAAAIAFAAGAAAAAgAVAAYAAAAKAAEAFgAXAAEAGAAAAHQABAABAAAANiq3ABkquwAbWbcAHbUAHioSILUAIiq7ACRZKrQAIrgAJrcALBIvtgAxtgA1tQA5KhI7tQA9sQAAAAIAPwAAABoABgAAAD8ABABEAA8ARQAVAEYALwBHADUAPwBAAAAADAABAAAANgBBAEIAAAAJAEMARAABABgAAABgAAIAAgAAAByyAEUSS7YATbsAAVm3AFJMKxJTtgBVK7YAWFexAAAAAgA/AAAAFgAFAAAASgAIAEsAEABMABYATQAbAE8AQAAAABYAAgAAABwAXABdAAAAEAAMAF4AQgABAAkAXwBgAAEAGAAAACoAAwAAAAAACrsAYVkSAbcAY7AAAAACAD8AAAAGAAEAAABSAEAAAAACAAAAAQBmADgAAQAYAAAALwABAAEAAAAFKrQAZ7AAAAACAD8AAAAGAAEAAABZAEAAAAAMAAEAAAAFAEEAQgAAAAEAVwAuAAEAGAAAAD4AAgACAAAABiortQBnsQAAAAIAPwAAAAoAAgAAAF0ABQBeAEAAAAAWAAIAAAAGAEEAQgAAAAAABgBpAAYAAQABAFoAWwABABgAAAEBAAMABQAAAIcqtgBqTBJsK7gAbgFNKxJytgB0mQAauwAkWSu4ACa3ACwSeLYAMbYANU2nABe7ACRZK7gAJrcALBJ6tgAxtgA1TbsAfFkstwB+TrsAJFkSf7cALCy2ADESgbYAMbYANS22AIOZAA4ttgCGmQAHBKcABAO4AImyAEUSjbYATSottwCPNgQVBKwAAAACAD8AAAAuAAsAAABiAAUAYwALAGQADQBlABYAZgAtAGkAQQBrAEoAbAB1AG0AfQBuAIQAbwBAAAAANAAFAAAAhwBBAEIAAAAFAIIAkwAGAAEADQB6AJQABgACAEoAPQCVAJYAAwCEAAMAlwCYAAQAAgCRAJIAAQAYAAACUAAEAA0AAAEwuwCZWbcAm00DPiu2AJw6BBkEvjYFAzYGAzYHpwCSGQQVBzI6CBkItgCgOgkZCLYAo5kAeYQGARkJEgu2AHSaAGwqGQkSCLcApjoKKrQAHhkKtgCqNgsZCjoMFQuaACEsuwAkWRkJuAAmtwAsEq22ADG2ADW5AK8CAFenADAqGQi3ALWZACcqtAAetgC4OgwsuwAkWRkJuAAmtwAsEru2ADG2ADW5AK8CAFeEBwEVBxUFof9tsgBFuwAkWRK9twAsFQa2AL8SwrYAMRUFtgC/Ei+2ADG2ADW2AE2yAEW7ACRZEsS3ACwsuQDGAQC2AL+2ADW2AE0suQDGAQCeADMsuADKLLkA0AEAOgenABCyAEUZB7kA1AEAtgDaGQe5AN0BAJr/7LIARRLgtgBNBD4drAAAAAIAPwAAAHoAHgAAAHQACAB1AAoAdgAQAHcAFQB4ABgAeQAeAHoAJQB7ACwAfQA0AH4ANwB/AEEAgABLAIEAVgCCAFoAgwBfAIQAfQCHAIYAiACPAIkAqgB5ALQAkADaAJEA9QCTAP4AlAECAJUBDQCWARoAlQEkAJgBLACZAS4AmwBAAAAAjgAOAAABMABBAEIAAAAAATAAlQCWAAEACAEoAOIA4wACAAoBJgCXAJgAAwAQASAA5ADlAAQAFQEbAOYA5wAFABgBGADoAOcABgAbAJkA6QDnAAcAJQCFAOoAlgAIACwAfgDrAAYACQBLAF8A7AAGAAoAVgBUAO0AmAALAFoAUADuAAYADAEKABoA7wDwAAcAAgC3AJIAAQAYAAABuQAFAAkAAACfAz0BTrsA8VkrAwS3APNOLbYA9joEpwBFGQS5APoBAMAA/zoFGQW2AQETAQK2AHSZAAgEPacAXBkFtgEBEgi2AHSZABktGQW2AQQ6BioZBrcBCJkACAQ9pwA5GQS5AQsBAJr/t6cALDoEGQS2AQ4txgAuLbYBE6cAJzoIpwAiOgctxgAMLbYBE6cABToIGQe/LcYADC22AROnAAU6CBysAAUABABkAGcBDwByAHYAeQEPAAQAbgB+AAAAhACIAIsBDwCUAJgAmwEPAAMAPwAAAHYAHQAAAKAAAgChAAQAowAPAKQAFQClABgApgAkAKcAMgCoADQAqQA3AKsARACsAEwArQBVAK4AVwCvAFoApQBnALUAaQC2AG4AuQByALsAeQC9AH4AuACAALkAhAC7AIsAvQCNAMAAkAC5AJQAuwCbAL0AnQDBAEAAAABSAAgAAACfAEEAQgAAAAAAnwEWAJYAAQACAJ0AtwCYAAIABACbARcBGAADABUAUgD4ARkABAAkADYBGgEbAAUATAAOARwBHQAGAGkABQEeAR8ABAEgAAAADAABABUAUgD4ASEABAACALcBCgABABgAAAFIAAMABwAAAGwDPbsBIlkrtwEkTqcAIS22ASc6BBkExgAWGQS2ASsTAQK2AHSZAAgEPacANC22AS6d/96nACpOLbYBDivGAC4rtgExpwAnOganACI6BSvGAAwrtgExpwAFOgYZBb8rxgAMK7YBMacABToGHKwABQACADMANgEPAD8AQwBGAQ8AAgA7AEsAAABRAFUAWAEPAGEAZQBoAQ8AAgA/AAAAXgAXAAAAxgACAMkACwDKAA4AywAUAMwAGQDNACcAzgApAM8ALADKADYA1QA3ANYAOwDZAD8A2wBGAN0ASwDYAE0A2QBRANsAWADdAFoA4ABdANkAYQDbAGgA3QBqAOEAQAAAAD4ABgAAAGwAQQBCAAAAAABsARwBHQABAAIAagC3AJgAAgALACsBNAE1AAMAFAAYARoBNgAEADcABAEeAR8AAwACAKgAqQABABgAAAB6AAMABQAAABgrTisstgE3NgQVBJsACysDFQS2ATtOLbAAAAACAD8AAAAWAAUAAADlAAIA5gAJAOcADgDoABYA6gBAAAAANAAFAAAAGABBAEIAAAAAABgBPwAGAAEAAAAYAUAABgACAAIAFgFBAAYAAwAJAA8BQgDnAAQAAQFDAAAAAgFEUEsDBAoAAAAAADMJzzoedch67gkAAO4JAAAuAAAAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9UZXN0TGF5b3V0VGFzay5jbGFzc8r+ur4AAAAxAHUHAAIBAChvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUYXNrBwAEAQAZb3JnL2FwYWNoZS90b29scy9hbnQvVGFzawEAEGRpcmVjdG9yeVRvQ2hlY2sBABJMamF2YS9sYW5nL1N0cmluZzsBAA50ZW1wV29ya2luZ0RpcgEAEGZhaWx1cmVzT2NjdXJyZWQBAAFaAQAPZmVhdHVyZUZhaWx1cmVzAQAOYnVuZGxlRmFpbHVyZXMBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABAMAAwADQkAAQASDAAIAAkJAAEAFAwACgAJCQABABYMAAsACQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACpMb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9UZXN0TGF5b3V0VGFzazsBAAdleGVjdXRlAQAKRXhjZXB0aW9ucwcAHgEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uCQAgACIHACEBABBqYXZhL2xhbmcvU3lzdGVtDAAjACQBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIACYBABdTdGFydGluZyBCUkVFIFJ1bGUgVGVzdAoAKAAqBwApAQATamF2YS9pby9QcmludFN0cmVhbQwAKwAsAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgcALgEAIm9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvQlJFRVRlc3QKAC0AEAoAAQAxDAAyADMBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsKAC0ANQwANgAsAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQA4DAA5ADMBABFnZXRUZW1wV29ya2luZ0RpcgoALQA7DAA8ACwBABFzZXRUZW1wV29ya2luZ0RpcgoALQA+DAA/AEABABN0ZXN0QlJFRVNldHRpbmdSdWxlAQADKClaCgABAEIMAEMARAEAE3NldEZhaWx1cmVzT2NjdXJyZWQBAAQoWilWCABGAQAaU3RhcnRpbmcgVmVyc2lvbiBGb3JtIFRlc3QHAEgBACVvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1BhY2syMDBUZXN0CgBHABAKAEcANQoARwBMDABNAEABAA50ZXN0QnVuZGxlUGFjawcATwEAJW9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvVmVyc2lvblRlc3QKAE4AEAoATgA1CgBOAFMMAFQAQAEAE3Rlc3RGZWF0dXJlVmVyc2lvbnMKAE4AVgwAVwBAAQASdGVzdEJ1bmRsZVZlcnNpb25zCABZAQAXU3RhcnRpbmcgVGVzdExheW91dFRhc2sHAFsBAChvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUZXN0CgBaABAKAFoANQoAWgA7CgBaAGAMAGEAQAEAEXRlc3RGZWF0dXJlTGF5b3V0CgBaAGMMAGQAQAEAEHRlc3RCdW5kbGVMYXlvdXQBAAhicmVlVGVzdAEAJExvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0JSRUVUZXN0OwEACHBhY2tUZXN0AQAnTG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvUGFjazIwMFRlc3Q7AQALdmVyc2lvblRlc3QBACdMb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9WZXJzaW9uVGVzdDsBAAR0ZXN0AQAqTG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvVGVzdExheW91dFRlc3Q7CQABAG4MAAUABgEAEGJ1bmRsZURpclRvQ2hlY2sJAAEAcQwABwAGAQASaXNGYWlsdXJlc09jY3VycmVkAQAKU291cmNlRmlsZQEAE1Rlc3RMYXlvdXRUYXNrLmphdmEAIQABAAMAAAAFAAIABQAGAAAAAgAHAAYAAAACAAgACQAAAAIACgAJAAAAAgALAAkAAAAIAAEADAANAAEADgAAAE4AAgABAAAAFCq3AA8qA7UAESoDtQATKgO1ABWxAAAAAgAXAAAAFgAFAAAABgAEAAoACQALAA4ADAATAAYAGAAAAAwAAQAAABQAGQAaAAAAAQAbAA0AAgAcAAAABAABAB0ADgAAAaYAAgAFAAAA5LIAHxIltgAnuwAtWbcAL0wrKrYAMLYANCsqtgA3tgA6Kiu2AD21ABUqtAAVmQAIKgS2AEGyAB8SRbYAJ7sAR1m3AElNLCq2ADC2AEoqLLYAS7UAFSq0ABWZAAgqBLYAQbIAHxJFtgAnuwBOWbcAUE4tKrYAMLYAUSottgBStQATKi22AFW1ABUqtAATmgAKKrQAFZkACCoEtgBBsgAfEli2ACe7AFpZtwBcOgQZBCq2ADC2AF0ZBCq2ADe2AF4qGQS2AF+1ABMqGQS2AGK1ABUqtAATmgAKKrQAFZkACCoEtgBBsQAAAAIAFwAAAHYAHQAAABEACAASABAAEwAYABQAIAAVACgAFgAvABcANAAaADwAGwBEABwATAAdAFQAHgBbAB8AYAAiAGgAIwBwACQAeAAlAIAAJgCIACcAlgAoAJsAKwCjACwArAAtALUALgC+AC8AxwAwANAAMQDeADIA4wA0ABgAAAA0AAUAAADkABkAGgAAABAA1ABlAGYAAQBEAKAAZwBoAAIAcAB0AGkAagADAKwAOABrAGwABAABADIAMwABAA4AAAAvAAEAAQAAAAUqtABtsAAAAAIAFwAAAAYAAQAAADcAGAAAAAwAAQAAAAUAGQAaAAAAAQA2ACwAAQAOAAAAPgACAAIAAAAGKiu1AG2xAAAAAgAXAAAACgACAAAAOwAFADwAGAAAABYAAgAAAAYAGQAaAAAAAAAGAG8ABgABAAEAOQAzAAEADgAAAC8AAQABAAAABSq0AHCwAAAAAgAXAAAABgABAAAAPwAYAAAADAABAAAABQAZABoAAAABADwALAABAA4AAAA+AAIAAgAAAAYqK7UAcLEAAAACABcAAAAKAAIAAABDAAUARAAYAAAAFgACAAAABgAZABoAAAAAAAYABwAGAAEAAQByAEAAAQAOAAAALwABAAEAAAAFKrQAEawAAAACABcAAAAGAAEAAABHABgAAAAMAAEAAAAFABkAGgAAAAEAQwBEAAEADgAAAD4AAgACAAAABiobtQARsQAAAAIAFwAAAAoAAgAAAEsABQBMABgAAAAWAAIAAAAGABkAGgAAAAAABgAIAAkAAQABAHMAAAACAHRQSwMECgAAAAAAM7jOOq1JZOpTRwAAU0cAAC4AAABvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUZXN0LmNsYXNzyv66vgAAADECsgcAAgEAKG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvVGVzdExheW91dFRlc3QHAAQBABhqdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UBAA1FWFRFTlNJT05fSkFSAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEABC5qYXIBABRFWFRFTlNJT05fUEFDRUtEX0pBUggADAEACC5wYWNrLmd6AQANRVhURU5TSU9OX1pJUAgADwEABC56aXABABJQUk9QRVJUWV9CVU5ETEVfSUQIABIBABNCdW5kbGUtU3ltYm9saWNOYW1lAQAOY29uZmlnRmlsZW5hbWUBAA9LRVlfREZUX0JJTl9KQVIIABYBABJkZWZhdWx0LmJpbmFyeS5qYXIBAA9LRVlfREZUX1NSQ19KQVIIABkBABJkZWZhdWx0LnNvdXJjZS5qYXIBAA9LRVlfREZUX0JJTl9aSVAIABwBABJkZWZhdWx0LmJpbmFyeS56aXABAA9LRVlfREZUX1NSQ19aSVAIAB8BABJkZWZhdWx0LnNvdXJjZS56aXABAA9LRVlfREZUX0ZFQVRVUkUIACIBAA9kZWZhdWx0LmZlYXR1cmUBAAZjb25maWcBABZMamF2YS91dGlsL1Byb3BlcnRpZXM7AQAGZXJyb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEAEGRpcmVjdG9yeVRvQ2hlY2sBAA50ZW1wV29ya2luZ0RpcgEABjxpbml0PgEAAygpVgEABENvZGUKAAMALQwAKQAqCAAvAQARY29uZmlnLnByb3BlcnRpZXMJAAEAMQwAEwAGBwAzAQATamF2YS91dGlsL0FycmF5TGlzdAoAMgAtCQABADYMACUAJgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACpMb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9UZXN0TGF5b3V0VGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgkAPgBABwA/AQAQamF2YS9sYW5nL1N5c3RlbQwAQQBCAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CABEAQAZc3RhcnQgVGVzdExheW91dFRlc3QgbWFpbgoARgBIBwBHAQATamF2YS9pby9QcmludFN0cmVhbQwASQBKAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAtCABNAQALRDpcdGVtcHRlc3QKAAEATwwAUABKAQATc2V0RGlyZWN0b3J5VG9DaGVjawgAUgEAB0Q6L3RlbXAKAAEAVAwAVQBKAQARc2V0VGVtcFdvcmtpbmdEaXIKAAEAVwwAWABZAQARdGVzdEZlYXR1cmVMYXlvdXQBAAMoKVoKAAEAWwwAXABZAQAQdGVzdEJ1bmRsZUxheW91dAEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7BwBjAQAZanVuaXQvZnJhbWV3b3JrL1Rlc3RTdWl0ZQoAYgBlDAApAGYBABQoTGphdmEvbGFuZy9DbGFzczspVgEACGFkZEVycm9yCwBpAGsHAGoBAA5qYXZhL3V0aWwvTGlzdAwAbABtAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQAHbWVzc2FnZQoAAQBwDABxAHIBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsIAHQBAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAAEAdgwAdwB4AQANYXNzZXJ0Tm90TnVsbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVggAegEAAS8KAHwAfgcAfQEAEGphdmEvbGFuZy9TdHJpbmcMAH8AgAEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaBwCCAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAHwAhAwAhQCGAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgCBAIgMACkASggAigEAB3BsdWdpbnMKAIEAjAwAjQCOAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgCBAJAMAJEAcgEACHRvU3RyaW5nCACTAQAIL3BsdWdpbnMHAJUBAAxqYXZhL2lvL0ZpbGUKAJQAiAgAmAEAEmJ1bmRsZSBkaXJlY290cnkgKAgAmgEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgCUAJwMAJ0AWQEABmV4aXN0cwoAlACfDACgAFkBAAtpc0RpcmVjdG9yeQoAAQCiDACjAKQBAAphc3NlcnRUcnVlAQAWKExqYXZhL2xhbmcvU3RyaW5nO1opVgoAlACmDACnAKgBAAlsaXN0RmlsZXMBABEoKVtMamF2YS9pby9GaWxlOwoAlACqDACrAHIBAAdnZXROYW1lCgB8AK0MAK4AcgEAC3RvTG93ZXJDYXNlCgABALAMALEAsgEAFGdldEZpbGVGcm9tUEFDS0VESkFSAQAeKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2lvL0ZpbGU7CgABALQMALUAtgEAC2dldEJ1bmRsZUlkAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwgAuAEABy5zb3VyY2UIALoBAAguaW5mb3BvcAgAvAEACS5kb2MudXNlcggAvgEABC5kb2MIAMABAAguZG9jLmlzdggAwgEACC5kb2MuZGV2CADEAQAILmRvYy5hcGkIAMYBABBzdGFuZGFyZC5zY2hlbWFzCADIAQAJLmJyYW5kaW5nCgABAMoMAMsAzAEAC2dldEV4cGVjdGVkAQAlKExqYXZhL2xhbmcvU3RyaW5nO1paKUxqYXZhL3V0aWwvU2V0OwoAAQDODADPANABAA1wcm9jZXNzQnVuZGxlAQAgKExqYXZhL2lvL0ZpbGU7TGphdmEvdXRpbC9TZXQ7KVYIANIBAAsgICBDaGVja2VkIAoAgQDUDACNANUBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADXAQAEIG9mIAgA2QEAAS4IANsBABEgICBFcnJvcnMgZm91bmQ6IAsAaQDdDADeAN8BAARzaXplAQADKClJCgDhAOMHAOIBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAOQA5QEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCwBpAOcMAOgA6QEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsA6wDtBwDsAQASamF2YS91dGlsL0l0ZXJhdG9yDADuAO8BAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsKAEYA8QwASQDyAQAVKExqYXZhL2xhbmcvT2JqZWN0OylWCwDrAPQMAPUAWQEAB2hhc05leHQIAPcBADVFcnJvcnMgaW4gYnVuZGxlIGxheW91dC4gQ2hlY2sgZXJyb3IgbG9nIGZvciBkZXRhaWxzLgEAD2ZhaWx1cmVzT2NjdXJlZAEAAVoBAAhwcm9wZXJ0eQEAD2J1bmRsZURpcmVjdG9yeQEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQACaWQBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsJAAEBCQwAIwAkCgABAQsMAQwAKgEACWdldENvbmZpZwoBDgEQBwEPAQAUamF2YS91dGlsL1Byb3BlcnRpZXMMAREBEgEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsIARQBAB1VbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6IAoAAQEWDAEXAEoBAARmYWlsBwEZAQARamF2YS91dGlsL0hhc2hTZXQKARgALQcBHAEAGWphdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXIIAR4BAAEsCgEbASAMACkBIQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoBGwEjDAEkAHIBAAluZXh0VG9rZW4KAHwBJgwBJwByAQAEdHJpbQsBKQBrBwEqAQANamF2YS91dGlsL1NldAoBGwEsDAEtAFkBAA1oYXNNb3JlVG9rZW5zAQAGc291cmNlAQADemlwAQAEbGluZQEABnJlc3VsdAEAD0xqYXZhL3V0aWwvU2V0OwEACXRva2VuaXplcgEAG0xqYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyOwEAEmdldEZlYXR1cmVFeHBlY3RlZAoBDgAtCgABATgMATkAcgEAEWdldENvbmZpZ0ZpbGVuYW1lBwE7AQAXamF2YS9pby9GaWxlSW5wdXRTdHJlYW0KAToBPQwAKQE+AQARKExqYXZhL2lvL0ZpbGU7KVYKAUABQgcBQQEAEGphdmEvbGFuZy9PYmplY3QMAUMBRAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoBRgFIBwFHAQAPamF2YS9sYW5nL0NsYXNzDAFJAUoBABNnZXRSZXNvdXJjZUFzU3RyZWFtAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9pby9JbnB1dFN0cmVhbTsIAUwBACJVbmFibGUgdG8gbG9hZCBjb25maWd1cmF0aW9uIGZpbGUuCgEOAU4MAU8BUAEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYKAVIBVAcBUwEAE2phdmEvaW8vSU9FeGNlcHRpb24MAVUAKgEAD3ByaW50U3RhY2tUcmFjZQoBUgFXDAFYAHIBAApnZXRNZXNzYWdlCgFaAVwHAVsBABNqYXZhL2lvL0lucHV0U3RyZWFtDAFdACoBAAVjbG9zZQEABWlucHV0AQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAKY29uZmlnRmlsZQEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsLASkA3QsBKQFlDAFmAWcBAAd0b0FycmF5AQAoKFtMamF2YS9sYW5nL09iamVjdDspW0xqYXZhL2xhbmcvT2JqZWN0OwcAXggBagEAAAoAAQFsDAFtAW4BAApwcm9jZXNzRGlyAQA2KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2lvL0ZpbGU7W0xqYXZhL2xhbmcvU3RyaW5nOylWCAFwAQARTWlzc2luZyBwYXR0ZXJuOiAIAXIBAAkgaW4gZGlyOiAKAJQBdAwBdQByAQAPZ2V0QWJzb2x1dGVQYXRoCgABAXcMAGcASgoAAQF5DAF6AXsBAA5wcm9jZXNzQXJjaGl2ZQEAJChMamF2YS9pby9GaWxlO1tMamF2YS9sYW5nL1N0cmluZzspVgEABGZpbGUBAAhleHBlY3RlZAEABWFycmF5AQAOcHJvY2Vzc0ZlYXR1cmUHAYEBABVqYXZhL3V0aWwvemlwL1ppcEZpbGUKAYABgwwAKQGEAQASKExqYXZhL2lvL0ZpbGU7SSlWCgGAAYYMAYcBiAEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwGKAYwHAYsBABVqYXZhL3V0aWwvRW51bWVyYXRpb24MAY0A7wEAC25leHRFbGVtZW50BwGPAQAWamF2YS91dGlsL3ppcC9aaXBFbnRyeQoBjgCqCgB8AZIMAZMAgAEAB21hdGNoZXMKAZUBVAcBlgEAJmphdmEvdXRpbC9yZWdleC9QYXR0ZXJuU3ludGF4RXhjZXB0aW9uCgGVAVcLAYoBmQwBmgBZAQAPaGFzTW9yZUVsZW1lbnRzCAGcAQAKIGluIGZpbGU6IAoBgAFcAQAXTGphdmEvdXRpbC96aXAvWmlwRmlsZTsBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEABWVudHJ5AQAYTGphdmEvdXRpbC96aXAvWmlwRW50cnk7AQAEbmFtZQEAB3BhdHRlcm4BAAJleAEAKExqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKAHwBpwwBqADfAQAGbGVuZ3RoCgCBAaoMAI0BqwEAHChDKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAARyb290AQADZGlyAQAFaW5kZXgBABdnZXRCdW5kbGVJZEZyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgGyAbQHAbMBACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAG1AbYBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsLAbgBugcBuQEADWphdmEvdXRpbC9NYXAMAbsBvAEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CAG+AQA6QnVuZGxlU3ltYm9saWNOYW1lIGhlYWRlciBub3Qgc2V0IGluIG1hbmlmZXN0IGZvciBidW5kbGU6IAoAfAHADAHBAcIBAAdpbmRleE9mAQAEKEkpSQoAfAHEDAHFAcYBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7CgHIAVcHAckBACJvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlRXhjZXB0aW9uAQAEcGF0aAEACmF0dHJpYnV0ZXMBAA9MamF2YS91dGlsL01hcDsBAANwb3MBACRMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUV4Y2VwdGlvbjsKAAEB0AwB0QC2AQASZ2V0QnVuZGxlSWRGcm9tRGlyCgABAdMMAdQAtgEAEmdldEJ1bmRsZUlkRnJvbVpJUAoAAQHWDAHXALYBABJnZXRCdW5kbGVJZEZyb21KQVIKAYABPQgB2gEAGF4uKi9NRVRBLUlORi9NQU5JRkVTVC5NRgoBgAHcDAHdAd4BAA5nZXRJbnB1dFN0cmVhbQEALyhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTspTGphdmEvaW8vSW5wdXRTdHJlYW07CgABAeAMAa8BsAgB4gEAM0J1bmRsZSBtYW5pZmVzdCAoTUFOSUZFU1QuTUYpIG5vdCBmb3VuZCBpbiBidW5kbGU6IAgB5AEAFE1FVEEtSU5GL01BTklGRVNULk1GCgCUAeYMACkB5wEAIyhMamF2YS9pby9GaWxlO0xqYXZhL2xhbmcvU3RyaW5nOylWCgCUAekMAeoAWQEABmlzRmlsZQgB7AEALEJ1bmRsZSBtYW5pZmVzdCAoTUFOSUZFU1QuTUYpIG5vdCBmb3VuZCBhdDogCgHuAVcHAe8BAB1qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbgEADG1hbmlmZXN0RmlsZQEAH0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKAfMB9QcB9AEARW9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcgwB9gH3AQASZ2V0VW5wYWNrUHJvY2Vzc29yAQBfKExqYXZhL3V0aWwvUHJvcGVydGllczspTG9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcjsKAAEB+QwB+gByAQARZ2V0VGVtcFdvcmtpbmdEaXIKAfMB/AwB/QBKAQATc2V0V29ya2luZ0RpcmVjdG9yeQoB8wH/DAIAALIBAApwcm9jZXNzSmFyAQADamFyAQAXTGphdmEvdXRpbC9qYXIvSmFyRmlsZTsBAAZ0bXBqYXIBAAxqYXJwcm9jZXNzb3IBAEdMb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yOwkAAQIHDAAnAAYBABBidW5kbGVEaXJUb0NoZWNrAQARc2V0Q29uZmlnRmlsZW5hbWUHAgsBABVqYXZhL3V0aWwvamFyL0phckZpbGUKAgoCDQwAKQIOAQATKExqYXZhL2lvL0ZpbGU7WkkpVgoCCgIQDAIRAhIBAAtnZXRKYXJFbnRyeQEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7CAIUAQAsQnVuZGxlIGRvZXMgbm90IGNvbnRhaW4gYSBNQU5JRkVTVC5NRiBmaWxlOiAKAgoBXAoCCgHcAQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7CQABAhkMACgABggCGwEACGZlYXR1cmVzCAIdAQAJL2ZlYXR1cmVzCAIfAQATZmVhdHVyZSBkaXJlY290cnkgKAoAAQIhDAIiALYBAAxnZXRGZWF0dXJlSWQKAAECJAwBNQDMCgABAiYMAX8A0AgCKAEANkVycm9ycyBpbiBmZWF0dXJlIGxheW91dC4gQ2hlY2sgZXJyb3IgbG9nIGZvciBkZXRhaWxzLgEAEGZhaWx1cmVzT2NjdXJyZWQBABBmZWF0dXJlRGlyZWN0b3J5CgABAiwMAi0AtgEAE2dldEZlYXR1cmVJZEZyb21EaXIKAAECLwwCMAC2AQATZ2V0RmVhdHVyZUlkRnJvbUpBUggCMgEAC2ZlYXR1cmUueG1sCAI0AQAxRmVhdHVyZSBqYXIgZG9lcyBub3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGU6IAoAAQI2DAI3AjgBABhnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwBACkoTGphdmEvaW8vSW5wdXRTdHJlYW07KUxqYXZhL2xhbmcvU3RyaW5nOwoCOgFXBwI7AQAuamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgoCPQFXBwI+AQAYb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uAQAwTGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247AQAaTG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsIAkIBABpGZWF0dXJlLnhtbCBub3QgZm91bmQgYXQ6IAoAAQJEDAI3ALYBAAtmZWF0dXJlRmlsZQoAAQJHDAJIAkkBAAZnZXRET00BACYoTGphdmEvaW8vRmlsZTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwoAAQJLDAJMAk0BABNnZXRGZWF0dXJlSWRGcm9tRE9NAQAqKExvcmcvdzNjL2RvbS9Eb2N1bWVudDspTGphdmEvbGFuZy9TdHJpbmc7AQAIZG9jdW1lbnQBABZMb3JnL3czYy9kb20vRG9jdW1lbnQ7CAJRAQAHZmVhdHVyZQsCUwJVBwJUAQAUb3JnL3czYy9kb20vRG9jdW1lbnQMAlYCVwEAFGdldEVsZW1lbnRzQnlUYWdOYW1lAQAqKExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL3czYy9kb20vTm9kZUxpc3Q7CwJZAlsHAloBABRvcmcvdzNjL2RvbS9Ob2RlTGlzdAwCXADfAQAJZ2V0TGVuZ3RoCwJZAl4MAl8CYAEABGl0ZW0BABUoSSlMb3JnL3czYy9kb20vTm9kZTsHAmIBABNvcmcvdzNjL2RvbS9FbGVtZW50CwJhAmQMAmUCZgEADWdldEF0dHJpYnV0ZXMBABwoKUxvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXA7CAEFCwJpAmsHAmoBABhvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXAMAmwCbQEADGdldE5hbWVkSXRlbQEAJihMamF2YS9sYW5nL1N0cmluZzspTG9yZy93M2MvZG9tL05vZGU7CwJvAnEHAnABABBvcmcvdzNjL2RvbS9Ob2RlDAJyAHIBAAxnZXROb2RlVmFsdWUBAA9mZWF0dXJlRWxlbWVudHMBABZMb3JnL3czYy9kb20vTm9kZUxpc3Q7AQAOZmVhdHVyZUVsZW1lbnQBABVMb3JnL3czYy9kb20vRWxlbWVudDsBAAtmZWF0dXJlTm9kZQEAEkxvcmcvdzNjL2RvbS9Ob2RlOwEADWFOYW1lZE5vZGVNYXABABpMb3JnL3czYy9kb20vTmFtZWROb2RlTWFwOwEAC2lkQXR0cmlidXRlAQAKRXhjZXB0aW9ucwoAAQJ+DAJIAn8BAC0oTGphdmEvaW8vSW5wdXRTdHJlYW07KUxvcmcvdzNjL2RvbS9Eb2N1bWVudDsBAAZzdHJlYW0HAoIBABZqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyBwKEAQASamF2YS9pby9GaWxlUmVhZGVyCgKDAT0KAoEChwwAKQKIAQATKExqYXZhL2lvL1JlYWRlcjspVgcCigEAF29yZy94bWwvc2F4L0lucHV0U291cmNlCgKJAocKAo0CjwcCjgEAKGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3RvcnkMApACkQEAC25ld0luc3RhbmNlAQAsKClMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKAo0CkwwClAKVAQASbmV3RG9jdW1lbnRCdWlsZGVyAQAlKClMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyOwoClwKZBwKYAQAhamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyDAKaApsBAAVwYXJzZQEAMShMb3JnL3htbC9zYXgvSW5wdXRTb3VyY2U7KUxvcmcvdzNjL2RvbS9Eb2N1bWVudDsKAj0BVAoCgQFcCgI6AVQIAqABAC5FcnJvcjogY291bGQgbm90IHBhcnNlIHhtbCBpbiBjbGFzc3BhdGggZmlsZTogBwKiAQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24KAqEAiAEACWFEb2N1bWVudAEABnJlYWRlcgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyOwEAC2lucHV0U291cmNlAQAZTG9yZy94bWwvc2F4L0lucHV0U291cmNlOwEA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ZXN0cy9GdWxsSmFyTmFtZVBhcnNlcgoAHQAcCQABACEMABAAEQgAIwEAAVwJAAEAJQwAEgAGBwAnAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKACkAKwcAKgEAEGphdmEvbGFuZy9TdHJpbmcMACwALQEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAJgAvDAAYADABABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIADIBAAEuCgAmADQMADUANgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAJgA4DAA5ADoBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABADwMABMABggAPgEAAi4qCQABAEAMABQABgoAQgBEBwBDAQAXamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4MAEUARgEAB2NvbXBpbGUBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVybjsJAAEASAwAFQAWAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAJ0xvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1ZlcnNpb25UZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCQBQAFIHAFEBABBqYXZhL2xhbmcvU3lzdGVtDABTAFQBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIAFYBABlzdGFydCBUZXN0TGF5b3V0VGVzdCBtYWluCgBYAFoHAFkBABNqYXZhL2lvL1ByaW50U3RyZWFtDABbADABAAdwcmludGxuCgABABwIAF4BAAtEOlx0ZW1wdGVzdAoAAQBgDABhADABABNzZXREaXJlY3RvcnlUb0NoZWNrCgABAGMMAGQAZQEAE3Rlc3RGZWF0dXJlVmVyc2lvbnMBAAMoKVoKAAEAZwwAaABlAQASdGVzdEJ1bmRsZVZlcnNpb25zAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsHAG8BABlqdW5pdC9mcmFtZXdvcmsvVGVzdFN1aXRlCgBuAHEMABgAcgEAFChMamF2YS9sYW5nL0NsYXNzOylWAQATZ2V0RGlyZWN0b3J5VG9DaGVjawkAAQB1DAAXAAYBABBidW5kbGVEaXJUb0NoZWNrCgABAHgMAHMAOggAegEALU5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LgoAAQB8DAB9AH4BAA1hc3NlcnROb3ROdWxsAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWCACAAQABLwoAKQCCDACDAIQBAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWggAhgEAB3BsdWdpbnMIAIgBAAgvcGx1Z2lucwcAigEADGphdmEvaW8vRmlsZQoAiQAvCACNAQASYnVuZGxlIGRpcmVjb3RyeSAoCACPAQAgKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4KAIkAkQwAkgBlAQAGZXhpc3RzCgCJAJQMAJUAZQEAC2lzRGlyZWN0b3J5CgABAJcMAJgAmQEACmFzc2VydFRydWUBABYoTGphdmEvbGFuZy9TdHJpbmc7WilWCACbAQAVIFRlc3QgQnVuZGxlIFZlcnNpb25zCgABAJ0MAJ4AnwEAEmNoZWNrRmlsZXNWZXJzaW9ucwEAEShMamF2YS9pby9GaWxlOylaAQAIcHJvcGVydHkBAA9idW5kbGVEaXJlY3RvcnkBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgcApwEAE2phdmEvdXRpbC9BcnJheUxpc3QKAKYAHAoAiQCqDACrAKwBAAlsaXN0RmlsZXMBABEoKVtMamF2YS9pby9GaWxlOwoAiQCuDACvADoBAAdnZXROYW1lCgCJALEMALIAZQEABmlzRmlsZQoAAQC0DAC1ALYBAAxnZXRCYXNpY05hbWUBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAHQC4DAC5AIQBAAVwYXJzZQgAuwEAMSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkLAL0AvwcAvgEADmphdmEvdXRpbC9MaXN0DADAAMEBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAB0AwwwAxAA6AQAQZ2V0VmVyc2lvblN0cmluZwoAQgDGDADHAMgBAAdtYXRjaGVyAQAzKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7CgDKAMwHAMsBABdqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcgwAzQBlAQAHbWF0Y2hlcwgAzwEAGSBkb2VzIG5vdCBjb250YWluIDQgcGFydHMIANEBAAsgICBDaGVja2VkIAoAJgDTDAA1ANQBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADWAQAEIG9mIAgA2AEAESAgIEVycm9ycyBmb3VuZDogCwC9ANoMANsA3AEABHNpemUBAAMoKUkKAN4A4AcA3wEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA4QDiAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAL0A5AwA5QDmAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwDoAOoHAOkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAOsA7AEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoAWADuDABbAO8BABUoTGphdmEvbGFuZy9PYmplY3Q7KVYLAOgA8QwA8gBlAQAHaGFzTmV4dAgA9AEAMEVycm9ycyBpbiB2ZXJzaW9ucy4gQ2hlY2sgZXJyb3IgbG9nIGZvciBkZXRhaWxzLgEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEABXZhbGlkAQAHdmVyc2lvbgEAGUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsKACkBBQwBBgEHAQALbGFzdEluZGV4T2YBABUoTGphdmEvbGFuZy9TdHJpbmc7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cy5wcm9wZXJ0aWVzUEsBAgoACgAAAAAAoQrKOisgWXCRAAAAkQAAAB8AAAAAAAAAAAAAAAAApggBAE9TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXNQSwECCgAKAAAAAACUCso6XYOi564CAACuAgAACAAAAAAAAAAAAAAAAAB0CQEALnByb2plY3RQSwECCgAKAAAAAAA1Asg6ONSgBAYDAAAGAwAADAAAAAAAAAAAAAAAAABIDAEAdmVyaWZ5ZGlyLnNoUEsBAgoACgAAAAAApw7KOmNzzMB2AQAAdgEAAAoAAAAAAAAAAAAAAAAAeA8BAC5jbGFzc3BhdGhQSwECCgAKAAAAAAAVEco60eAxI/0AAAD9AAAAFgAAAAAAAAAAAAAAAAAWEQEAcnVuRWNsaXBzZUFudFJ1bm5lci5zaFBLAQIKAAoAAAAAADUCyDqyfwLuGQAAABkAAAAWAAAAAAAAAAAAAAAAAEcSAQBjaGVja0xheW91dE1hbmlmZXN0Lm1mUEsBAgoACgAAAAAAYAzKOqOz+fwbCwAAGwsAABIAAAAAAAAAAAAAAAAAlBIBAGdhbGlsZW8ucHJvcGVydGllc1BLAQIKAAoAAAAAADUCyDoEqxQpbAAAAGwAAAAGAAAAAAAAAAAAAAAAAN8dAQBhbnQuc2hQSwECCgAKAAAAAAA1Asg68Y9tCLEFAACxBQAACgAAAAAAAAAAAAAAAABvHgEAYWJvdXQuaHRtbFBLAQIKAAoAAAAAAHuczzr55WZ2PSwAAD0sAAAoAAAAAAAAAAAAAAAAAEgkAQBvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL0JSRUVUZXN0LmNsYXNzUEsBAgoACgAAAAAAM7jOOu5zv1P0BwAA9AcAADEAAAAAAAAAAAAAAAAAy1ABAG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvRnVsbEphck5hbWVQYXJzZXIuY2xhc3NQSwECCgAKAAAAAAAzuM46SGdYz2AYAABgGAAAKwAAAAAAAAAAAAAAAAAOWQEAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9QYWNrMjAwVGVzdC5jbGFzc1BLAQIKAAoAAAAAADMJzzoedch67gkAAO4JAAAuAAAAAAAAAAAAAAAAALdxAQBvcmcvZWNsaXBzZS9nYWxpbGVvL3Rlc3RzL1Rlc3RMYXlvdXRUYXNrLmNsYXNzUEsBAgoACgAAAAAAM7jOOq1JZOpTRwAAU0cAAC4AAAAAAAAAAAAAAAAA8XsBAG9yZy9lY2xpcHNlL2dhbGlsZW8vdGVzdHMvVGVzdExheW91dFRlc3QuY2xhc3NQSwECCgAKAAAAAAAzuM46V8onuOoUAADqFAAAKwAAAAAAAAAAAAAAAACQwwEAb3JnL2VjbGlwc2UvZ2FsaWxlby90ZXN0cy9WZXJzaW9uVGVzdC5jbGFzc1BLBQYAAAAAIQAhALEJAADD2AEAAAA=