ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDM1MzBmOTMuLmZhZjM3YTAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw0ICsxLDUgQEAKLQorIyBoZGZzCisvc29sci9leGFtcGxlL2hkZnMKICouamFyCiAKICMgLgpkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmluZGV4IGVhYzI2ZGIuLjc4NTFiN2QgMTAwNjQ0Ci0tLSBhL2J1aWxkLnhtbAorKysgYi9idWlsZC54bWwKQEAgLTkwLDYgKzkwLDcgQEAKIAkKICAgPHRhcmdldCBuYW1lPSJyYXQtc291cmNlcyIgZGVzY3JpcHRpb249IlJ1bnMgcmF0IGFjcm9zcyBhbGwgc291cmNlcyBhbmQgdGVzdHMiPgogICAgIDxzdWJhbnQgdGFyZ2V0PSJyYXQtc291cmNlcyIgaW5oZXJpdGFsbD0iZmFsc2UiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImV4dHJhLXRhcmdldHMueG1sIiAvPjwhLS0gcnVuIHJhdC1zb3VyY2VzIGFsc28gZm9yIHJvb3QgZGlyZWN0b3J5IC0tPgogICAgICAgPGZpbGVzZXQgZGlyPSJsdWNlbmUiIGluY2x1ZGVzPSJidWlsZC54bWwiIC8+CiAgICAgICA8ZmlsZXNldCBkaXI9InNvbHIiIGluY2x1ZGVzPSJidWlsZC54bWwiIC8+CiAgICAgPC9zdWJhbnQ+CkBAIC0xMzAsNyArMTMxLDcgQEAKICAgCiAgIDx0YXJnZXQgbmFtZT0iZ2V0LW1hdmVuLXBvbXMiCiAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgTWF2ZW4gUE9NcyBmcm9tIGRldi10b29scy9tYXZlbi8gdG8gbWF2ZW4tYnVpbGQvIj4KLSAgICA8Y29weSB0b2Rpcj0iJHttYXZlbi1idWlsZC1kaXJ9IiBvdmVyd3JpdGU9InRydWUiPgorICAgIDxjb3B5IHRvZGlyPSIke21hdmVuLWJ1aWxkLWRpcn0iIG92ZXJ3cml0ZT0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9kZXYtdG9vbHMvbWF2ZW4iLz4KICAgICAgIDxmaWx0ZXJzZXQgYmVnaW50b2tlbj0iQCIgZW5kdG9rZW49IkAiPgogICAgICAgICA8ZmlsdGVyIHRva2VuPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgpAQCAtMTg1LDcgKzE4NiwxMiBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImVjbGlwc2UiIGRlcGVuZHM9InJlc29sdmUiIGRlc2NyaXB0aW9uPSJTZXR1cCBFY2xpcHNlIGNvbmZpZ3VyYXRpb24iPgotICAgIDxjb3B5IGZpbGU9ImRldi10b29scy9lY2xpcHNlL2RvdC5wcm9qZWN0IiB0b2ZpbGU9Ii5wcm9qZWN0IiBvdmVyd3JpdGU9ImZhbHNlIi8+CisgICAgPGJhc2VuYW1lIGZpbGU9IiR7YmFzZWRpcn0iIHByb3BlcnR5PSJlY2xpcHNlcHJvamVjdG5hbWUiLz4KKyAgICAgIDxjb3B5IGZpbGU9ImRldi10b29scy9lY2xpcHNlL2RvdC5wcm9qZWN0IiB0b2ZpbGU9Ii5wcm9qZWN0IiBvdmVyd3JpdGU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgPGZpbHRlcnNldD4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iRUNMSVBTRVBST0pFQ1ROQU1FIiB2YWx1ZT0iJHtlY2xpcHNlcHJvamVjdG5hbWV9Ii8+CisgICAgICA8L2ZpbHRlcnNldD4KKyAgICA8L2NvcHk+CiAgICAgPG1rZGlyIGRpcj0iLnNldHRpbmdzIi8+CiAgICAgPGNvcHkgdG9kaXI9Ii5zZXR0aW5ncy8iIG92ZXJ3cml0ZT0idHJ1ZSI+CiAgICAgICA8ZmlsZXNldCBkaXI9ImRldi10b29scy9lY2xpcHNlL2RvdC5zZXR0aW5ncyIgaW5jbHVkZXM9IioucHJlZnMiIC8+CkBAIC0xOTksNyArMjA1LDcgQEAKICAgICA8IS0tIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGV4Y2x1ZGUgZHVwbGljYXRlIEpBUiBmaWxlcyAmIGZpeCB0aGUgc2VydmxldC1hcGkgbWVzcyEgLS0+CiAgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJlY2xpcHNlLmZpbGVzZXQubGlicyIgcGF0aHNlcD0ifCIgZGlyc2VwPSIvIj4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9sdWNlbmUiIGluY2x1ZGVzPSIqKi9saWIvKi5qYXIiIGV4Y2x1ZGVzPSIqKi8qc2VydmxldC1hcGkqLmphciwgYW5hbHlzaXMvdWltYS8qKiwgdG9vbHMvKiosIGJ1aWxkLyoqIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vc29sciIgaW5jbHVkZXM9IioqL2xpYi8qLmphciIgZXhjbHVkZXM9ImNvcmUvbGliLypzZXJ2bGV0LWFwaSouamFyLCBjb250cmliL2FuYWx5c2lzLWV4dHJhcy8qKiwgdGVzdC1mcmFtZXdvcmsvKiosIGJ1aWxkLyoqLCBkaXN0LyoqLCBwYWNrYWdlLyoqIiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NvbHIiIGluY2x1ZGVzPSIqKi9saWIvKi5qYXIiIGV4Y2x1ZGVzPSJjb3JlL2xpYi8qc2VydmxldC1hcGkqLmphciwgY29udHJpYi9hbmFseXNpcy1leHRyYXMvKiosIHRlc3QtZnJhbWV3b3JrL2xpYi9qdW5pdCosIHRlc3QtZnJhbWV3b3JrL2xpYi9hbnQqLCB0ZXN0LWZyYW1ld29yay9saWIvcmFuZG9taXplZHRlc3RpbmcqLCBidWlsZC8qKiwgZGlzdC8qKiwgcGFja2FnZS8qKiIgLz4KICAgICAgIDxtYXAgZnJvbT0iJHtiYXNlZGlyfS8iIHRvPSIiLz4KICAgICA8L3BhdGhjb252ZXJ0PgogICAgIDx4c2x0IGluPSIke2FudC5maWxlfSIgb3V0PSIuY2xhc3NwYXRoIiBzdHlsZT0iZGV2LXRvb2xzL2VjbGlwc2UvZG90LmNsYXNzcGF0aC54c2wiIGZvcmNlPSJ0cnVlIj4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9lY2xpcHNlL2RvdC5wcm9qZWN0IGIvZGV2LXRvb2xzL2VjbGlwc2UvZG90LnByb2plY3QKaW5kZXggZTEwMzQzZC4uZGNkNzk3MCAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL2VjbGlwc2UvZG90LnByb2plY3QKKysrIGIvZGV2LXRvb2xzL2VjbGlwc2UvZG90LnByb2plY3QKQEAgLTEsNiArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5sdWNlbmVfc29scl90cnVuazwvbmFtZT4KKwk8bmFtZT5ARUNMSVBTRVBST0pFQ1ROQU1FQDwvbmFtZT4KIAk8Y29tbWVudD48L2NvbW1lbnQ+CiAJPHByb2plY3RzPgogCTwvcHJvamVjdHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvaWRlYS8uaWRlYS9saWJyYXJpZXMvU29scl90ZXN0X2ZyYW1ld29ya19saWJyYXJ5LnhtbCBiL2Rldi10b29scy9pZGVhLy5pZGVhL2xpYnJhcmllcy9Tb2xyX3Rlc3RfZnJhbWV3b3JrX2xpYnJhcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDRjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kZXYtdG9vbHMvaWRlYS8uaWRlYS9saWJyYXJpZXMvU29scl90ZXN0X2ZyYW1ld29ya19saWJyYXJ5LnhtbApAQCAtMCwwICsxLDEwIEBACis8Y29tcG9uZW50IG5hbWU9ImxpYnJhcnlUYWJsZSI+CisgIDxsaWJyYXJ5IG5hbWU9IlNvbHIgdGVzdCBmcmFtZXdvcmsgbGlicmFyeSI+CisgICAgPENMQVNTRVM+CisgICAgICA8cm9vdCB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NvbHIvdGVzdC1mcmFtZXdvcmsvbGliIiAvPgorICAgIDwvQ0xBU1NFUz4KKyAgICA8SkFWQURPQyAvPgorICAgIDxTT1VSQ0VTIC8+CisgICAgPGphckRpcmVjdG9yeSB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL3NvbHIvdGVzdC1mcmFtZXdvcmsvbGliIiByZWN1cnNpdmU9ImZhbHNlIiAvPgorICA8L2xpYnJhcnk+Cis8L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvaWRlYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvc29sci1jb3JlLXRlc3RzLmltbCBiL2Rldi10b29scy9pZGVhL3NvbHIvY29yZS9zcmMvdGVzdC9zb2xyLWNvcmUtdGVzdHMuaW1sCmluZGV4IDZhNDdkOTMuLjBhNDkyMTUgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9pZGVhL3NvbHIvY29yZS9zcmMvdGVzdC9zb2xyLWNvcmUtdGVzdHMuaW1sCisrKyBiL2Rldi10b29scy9pZGVhL3NvbHIvY29yZS9zcmMvdGVzdC9zb2xyLWNvcmUtdGVzdHMuaW1sCkBAIC0xMyw2ICsxMyw3IEBACiAgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9IlNvbHIgY29yZSBsaWJyYXJ5IiBsZXZlbD0icHJvamVjdCIgLz4KICAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iU29scmogbGlicmFyeSIgbGV2ZWw9InByb2plY3QiIC8+CiAgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9IlNvbHIgZXhhbXBsZSBsaWJyYXJ5IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iU29sciB0ZXN0IGZyYW1ld29yayBsaWJyYXJ5IiBsZXZlbD0icHJvamVjdCIgLz4KICAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUiIHNjb3BlPSJURVNUIiBtb2R1bGUtbmFtZT0ibHVjZW5lLXRlc3QtZnJhbWV3b3JrIiAvPgogICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgc2NvcGU9IlRFU1QiIG1vZHVsZS1uYW1lPSJzb2xyLXRlc3QtZnJhbWV3b3JrIiAvPgogICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgc2NvcGU9IlRFU1QiIG1vZHVsZS1uYW1lPSJzb2xyLWNvcmUtdGVzdC1maWxlcyIgLz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvYW5hbHlzaXMvc3RlbXBlbC9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9hbmFseXNpcy9zdGVtcGVsL3BvbS54bWwudGVtcGxhdGUKaW5kZXggMzFjOTMxZC4uODljNzdjNiAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9hbmFseXNpcy9zdGVtcGVsL3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9hbmFseXNpcy9zdGVtcGVsL3BvbS54bWwudGVtcGxhdGUKQEAgLTk2LDYgKzk2LDcgQEAKICAgICAgICAgICAgICAgPC9idW5kbGVkU2lnbmF0dXJlcz4KICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2V4ZWN1dG9ycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgorICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvY2hhcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8Z29hbHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL2JlbmNobWFyay9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9iZW5jaG1hcmsvcG9tLnhtbC50ZW1wbGF0ZQppbmRleCAwNTI3NzYyLi5lYzNlYWNlIDEwMDc1NQotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL2JlbmNobWFyay9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvYmVuY2htYXJrL3BvbS54bWwudGVtcGxhdGUKQEAgLTE0Miw2ICsxNDIsNyBAQAogICAgICAgICAgICAgICA8L2J1bmRsZWRTaWduYXR1cmVzPgogICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvY29yZS9zcmMvamF2YS9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUKaW5kZXggNzAwMjU3Zi4uZDFhZjkwNiAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUKQEAgLTg3LDYgKzg3LDcgQEAKICAgICAgICAgICAgICAgPC9idW5kbGVkU2lnbmF0dXJlcz4KICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2V4ZWN1dG9ycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgorICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvY2hhcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8Z29hbHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL2RlbW8vcG9tLnhtbC50ZW1wbGF0ZSBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvZGVtby9wb20ueG1sLnRlbXBsYXRlCmluZGV4IGE2YWVmNTkuLmI0NjY5OGEgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvZGVtby9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvZGVtby9wb20ueG1sLnRlbXBsYXRlCkBAIC0xMTMsNiArMTEzLDcgQEAKICAgICAgICAgICAgICAgPC9idW5kbGVkU2lnbmF0dXJlcz4KICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2V4ZWN1dG9ycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgorICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvY2hhcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8Z29hbHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL2ZhY2V0L3BvbS54bWwudGVtcGxhdGUgYi9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL2ZhY2V0L3BvbS54bWwudGVtcGxhdGUKaW5kZXggMzkxZWM5Ni4uNmZjODg3MiAxMDA3NTUKLS0tIGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9mYWNldC9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvZmFjZXQvcG9tLnhtbC50ZW1wbGF0ZQpAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgICA8L2J1bmRsZWRTaWduYXR1cmVzPgogICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvbWlzYy9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9taXNjL3BvbS54bWwudGVtcGxhdGUKaW5kZXggNDEyNWVhMC4uYjgxNmE3YyAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9taXNjL3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9taXNjL3BvbS54bWwudGVtcGxhdGUKQEAgLTg2LDYgKzg2LDcgQEAKICAgICAgICAgICAgICAgPC9idW5kbGVkU2lnbmF0dXJlcz4KICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2V4ZWN1dG9ycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgorICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvY2hhcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8Z29hbHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL3BvbS54bWwudGVtcGxhdGUgYi9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL3BvbS54bWwudGVtcGxhdGUKaW5kZXggN2I2NjE4ZC4uY2JkYmYwNyAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvcG9tLnhtbC50ZW1wbGF0ZQpAQCAtNzgsNiArNzgsNyBAQAogICAgICAgICAgICAgICA8L2J1bmRsZWRTaWduYXR1cmVzPgogICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KQEAgLTk2LDYgKzk3LDcgQEAKICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL3Rlc3RzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KKyAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGdvYWxzPgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9xdWVyeXBhcnNlci9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS9xdWVyeXBhcnNlci9wb20ueG1sLnRlbXBsYXRlCmluZGV4IGQzOTUzOTYuLmJmOTEwOTAgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvcXVlcnlwYXJzZXIvcG9tLnhtbC50ZW1wbGF0ZQorKysgYi9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL3F1ZXJ5cGFyc2VyL3BvbS54bWwudGVtcGxhdGUKQEAgLTEwMSw2ICsxMDEsNyBAQAogICAgICAgICAgICAgICA8L2J1bmRsZWRTaWduYXR1cmVzPgogICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvcG9tLnhtbC50ZW1wbGF0ZSBiL2Rldi10b29scy9tYXZlbi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvcG9tLnhtbC50ZW1wbGF0ZQppbmRleCA4ODFkMTk0Li5mMzFjNzI4IDEwMDY0NAotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9wb20ueG1sLnRlbXBsYXRlCkBAIC0xMDYsNiArMTA2LDcgQEAKICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL3Rlc3RzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KKyAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGdvYWxzPgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL21hdmVuL3BvbS54bWwudGVtcGxhdGUgYi9kZXYtdG9vbHMvbWF2ZW4vcG9tLnhtbC50ZW1wbGF0ZQppbmRleCA1N2FjNmRhLi44OTk2ZDczIDEwMDY0NAotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vcG9tLnhtbC50ZW1wbGF0ZQorKysgYi9kZXYtdG9vbHMvbWF2ZW4vcG9tLnhtbC50ZW1wbGF0ZQpAQCAtNDcsMTAgKzQ3LDExIEBACiAgICAgPGpldHR5LnZlcnNpb24+OC4xLjEwLnYyMDEzMDMxMjwvamV0dHkudmVyc2lvbj4KICAgICA8c2xmNGoudmVyc2lvbj4xLjYuNjwvc2xmNGoudmVyc2lvbj4KICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTY8L2xvZzRqLnZlcnNpb24+Ci0gICAgPHRpa2EudmVyc2lvbj4xLjM8L3Rpa2EudmVyc2lvbj4KKyAgICA8dGlrYS52ZXJzaW9uPjEuNDwvdGlrYS52ZXJzaW9uPgogICAgIDxodHRwY29tcG9uZW50cy52ZXJzaW9uPjQuMi4zPC9odHRwY29tcG9uZW50cy52ZXJzaW9uPgogICAgIDxjb21tb25zLWlvLnZlcnNpb24+Mi4xPC9jb21tb25zLWlvLnZlcnNpb24+CiAgICAgPHJlc3RsZXQudmVyc2lvbj4yLjEuMTwvcmVzdGxldC52ZXJzaW9uPgorICAgIDxoYWRvb3AudmVyc2lvbj4yLjAuNS1hbHBoYTwvaGFkb29wLnZlcnNpb24+CiAKICAgICA8IS0tIFJhbmRvbWl6ZWRUZXN0aW5nIGxpYnJhcnkgc3lzdGVtIHByb3BlcnRpZXMgLS0+CiAgICAgPHRlc3RzLml0ZXJzPjE8L3Rlc3RzLml0ZXJzPgpAQCAtMTgzLDYgKzE4NCwxMSBAQAogICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMtaW8udmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+am9kYS10aW1lPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qb2RhLXRpbWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4ke2h0dHBjb21wb25lbnRzLnZlcnNpb259PC92ZXJzaW9uPgpAQCAtMjA0LDYgKzIxMCwxNiBAQAogICAgICAgICA8dmVyc2lvbj4wLjU8L3ZlcnNpb24+CiAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuY29uY3VycmVudGxpbmtlZGhhc2htYXA8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbmN1cnJlbnRsaW5rZWRoYXNobWFwLWxydTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xNjwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KICAgICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgpAQCAtMjgxLDYgKzI5NywzOCBAQAogICAgICAgICA8dmVyc2lvbj4xMC45LjEuMDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2hhZG9vcC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWF1dGg8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7aGFkb29wLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2hhZG9vcC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtoYWRvb3AudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtaGRmczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtoYWRvb3AudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5oYWRvb3A8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmhhZG9vcC1oZGZzPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2hhZG9vcC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aWthPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD50aWthLWNvcmU8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPiR7dGlrYS52ZXJzaW9ufTwvdmVyc2lvbj4KQEAgLTMwNyw4ICszNTUsOCBAQAogICAgICAgICAgICAgPGFydGlmYWN0SWQ+dm9yYmlzLWphdmEtY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+YXNtPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc20tZGVidWctYWxsPC9hcnRpZmFjdElkPgogICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXNwZWN0ajwvZ3JvdXBJZD4KQEAgLTM2NCw3ICs0MTIsNyBAQAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5jYXJyb3QyPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tb3Jmb2xvZ2lrLXBvbGlzaDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjU8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjEuNi4wPC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KQEAgLTM5OCw2ICs0NDYsMTYgQEAKICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjYuMS4yNjwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Ni4xLjI2PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5yZXN0bGV0LmplZTwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLnJlc3RsZXQ8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPiR7cmVzdGxldC52ZXJzaW9ufTwvdmVyc2lvbj4KQEAgLTUxMCw3ICs1NjgsNyBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxzb3VyY2U+JHtqYXZhLmNvbXBhdC52ZXJzaW9ufTwvc291cmNlPgogICAgICAgICAgICAgPHRhcmdldD4ke2phdmEuY29tcGF0LnZlcnNpb259PC90YXJnZXQ+CkBAIC01MTksNyArNTc3LDcgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjIuODwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgpAQCAtNTI5LDcgKzU4Nyw3IEBACiAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CkBAIC01NjUsNyArNjIzLDcgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjIuOS4xPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CkBAIC01NzQsOCArNjMyLDEzIEBACiAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4zLjM8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4xMzwvdmVyc2lvbj4KKyAgICAgICAgICA8dmVyc2lvbj4yLjE1PC92ZXJzaW9uPgogICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPHJ1bk9yZGVyPnJhbmRvbTwvcnVuT3JkZXI+CiAgICAgICAgICAgICA8cmVwb3J0Rm9ybWF0PnBsYWluPC9yZXBvcnRGb3JtYXQ+CkBAIC02NDAsNyArNzAzLDcgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KKyAgICAgICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgpAQCAtNzM5LDcgKzgwMiw3IEBACiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjMuNzwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CiAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+Kjstc3BsaXQtcGFja2FnZTo9bWVyZ2UtZmlyc3Q8L0V4cG9ydC1QYWNrYWdlPgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL21hdmVuL3NvbHIvY29yZS9zcmMvamF2YS9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvY29yZS9zcmMvamF2YS9wb20ueG1sLnRlbXBsYXRlCmluZGV4IDBiYjcxOWIuLmRlZTQ4YzcgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9tYXZlbi9zb2xyL2NvcmUvc3JjL2phdmEvcG9tLnhtbC50ZW1wbGF0ZQorKysgYi9kZXYtdG9vbHMvbWF2ZW4vc29sci9jb3JlL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUKQEAgLTEyNSw2ICsxMjUsMTAgQEAKICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5jb25jdXJyZW50bGlua2VkaGFzaG1hcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbmN1cnJlbnRsaW5rZWRoYXNobWFwLWxydTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CkBAIC0xMzcsNiArMTQxLDE0NiBAQAogICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1maWxldXBsb2FkPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmpvZGEtdGltZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpvZGEtdGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhZG9vcC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhZG9vcC1hdXRoPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW1hdGg8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPnhtbGVuYzwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxlbmM8L2FydGlmYWN0SWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8L2V4Y2x1c2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1uZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1uZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+dG9tY2F0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphc3Blci1jb21waWxlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+dG9tY2F0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphc3Blci1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWVsPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm5ldC5qYXZhLmRldi5qZXRzM3Q8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+amV0czN0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWRpZ2VzdGVyPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtYmVhbnV0aWxzPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtYmVhbnV0aWxzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbWFwcGVyLWFzbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hdnJvPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmF2cm88L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm5ldC5zZi5rb3Ntb3NmczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5rZnM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5qY3JhZnQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+anNjaDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5oYWRvb3A8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtaGRmczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmUtYXNsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLW1hcHBlci1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXNwZXItcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+eG1sZW5jPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnhtbGVuYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kYWVtb248L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kYWVtb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5yZXN0bGV0LmplZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5yZXN0bGV0PC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHtyZXN0bGV0LnZlcnNpb259PC92ZXJzaW9uPgpAQCAtMjQ5LDYgKzM5Myw3IEBACiAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL3NlcnZsZXQtYXBpLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9zb2xyL2NvcmUvc3JjL3Rlc3QvcG9tLnhtbC50ZW1wbGF0ZSBiL2Rldi10b29scy9tYXZlbi9zb2xyL2NvcmUvc3JjL3Rlc3QvcG9tLnhtbC50ZW1wbGF0ZQppbmRleCBhOTY0N2RiLi41ZTA5MTc0IDEwMDY0NAotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vc29sci9jb3JlL3NyYy90ZXN0L3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvY29yZS9zcmMvdGVzdC9wb20ueG1sLnRlbXBsYXRlCkBAIC0xMzgsNiArMTM4LDcgQEAKICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL3NlcnZsZXQtYXBpLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KKyAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGdvYWxzPgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL21hdmVuL3NvbHIvcG9tLnhtbC50ZW1wbGF0ZSBiL2Rldi10b29scy9tYXZlbi9zb2xyL3BvbS54bWwudGVtcGxhdGUKaW5kZXggYTQ0ZTdmMS4uNTFiYmFiMCAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL21hdmVuL3NvbHIvcG9tLnhtbC50ZW1wbGF0ZQorKysgYi9kZXYtdG9vbHMvbWF2ZW4vc29sci9wb20ueG1sLnRlbXBsYXRlCkBAIC0zNCw3ICszNCw2IEBACiAgIDxtb2R1bGVzPgogICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgogICAgIDxtb2R1bGU+c29scmo8L21vZHVsZT4KLSAgICA8bW9kdWxlPndlYmFwcDwvbW9kdWxlPgogICAgIDxtb2R1bGU+dGVzdC1mcmFtZXdvcms8L21vZHVsZT4KICAgICA8bW9kdWxlPmNvbnRyaWI8L21vZHVsZT4KICAgPC9tb2R1bGVzPgpAQCAtMTQ5LDYgKzE0OCw3IEBACiAgICAgICAgICAgICAgIDwvYnVuZGxlZFNpZ25hdHVyZXM+CiAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KKyAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGdvYWxzPgpAQCAtMTY5LDYgKzE2OSw3IEBACiAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy90ZXN0cy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9zb2xyL3NvbHJqL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUgYi9kZXYtdG9vbHMvbWF2ZW4vc29sci9zb2xyai9zcmMvamF2YS9wb20ueG1sLnRlbXBsYXRlCmluZGV4IDg0MDUzMjguLjU5OTJkNjAgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9tYXZlbi9zb2xyL3NvbHJqL3NyYy9qYXZhL3BvbS54bWwudGVtcGxhdGUKKysrIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvc29scmovc3JjL2phdmEvcG9tLnhtbC50ZW1wbGF0ZQpAQCAtMTU1LDYgKzE1NSw3IEBACiAgICAgICAgICAgICAgIDwvYnVuZGxlZFNpZ25hdHVyZXM+CiAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KKyAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgICAgPCEtLSBTb2xyLUogZG9lcyBOT1QgZGVwZW5kIG9uIHNlcnZsZXQtYXBpIC0tPgogICAgICAgICAgICAgICAgIDwhLS0gPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9zZXJ2bGV0LWFwaS50eHQ8L3NpZ25hdHVyZXNGaWxlPiAtLT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vc29sci9zb2xyai9zcmMvdGVzdC9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvc29scmovc3JjL3Rlc3QvcG9tLnhtbC50ZW1wbGF0ZQppbmRleCAyYjhkNjUyLi5mMGQwZWJmIDEwMDY0NAotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vc29sci9zb2xyai9zcmMvdGVzdC9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9zb2xyL3NvbHJqL3NyYy90ZXN0L3BvbS54bWwudGVtcGxhdGUKQEAgLTE0Miw2ICsxNDIsNyBAQAogICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGVzPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvdGVzdHMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2V4ZWN1dG9ycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgorICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvY2hhcnMudHh0PC9zaWduYXR1cmVzRmlsZT4KICAgICAgICAgICAgICAgPC9zaWduYXR1cmVzRmlsZXM+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8Z29hbHM+CmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvbWF2ZW4vc29sci90ZXN0LWZyYW1ld29yay9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvdGVzdC1mcmFtZXdvcmsvcG9tLnhtbC50ZW1wbGF0ZQppbmRleCBlYjliYzAwLi41ZTNiNTM3IDEwMDY0NAotLS0gYS9kZXYtdG9vbHMvbWF2ZW4vc29sci90ZXN0LWZyYW1ld29yay9wb20ueG1sLnRlbXBsYXRlCisrKyBiL2Rldi10b29scy9tYXZlbi9zb2xyL3Rlc3QtZnJhbWV3b3JrL3BvbS54bWwudGVtcGxhdGUKQEAgLTY1LDYgKzY1LDEyOCBAQAogICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5oYWRvb3A8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1tYXRoPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD54bWxlbmM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sZW5jPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLW5ldDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW5ldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXNwZXItY29tcGlsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXNwZXItcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1lbDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWVsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5uZXQuamF2YS5kZXYuamV0czN0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpldHMzdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWRpZ2VzdGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmUtYXNsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLW1hcHBlci1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXZybzwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5hdnJvPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5uZXQuc2Yua29zbW9zZnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+a2ZzPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uamNyYWZ0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpzY2g8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtYmVhbnV0aWxzPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtYmVhbnV0aWxzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWhkZnM8L2FydGlmYWN0SWQ+CisgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbWFwcGVyLWFzbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+dG9tY2F0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphc3Blci1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD54bWxlbmM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sZW5jPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWRhZW1vbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWRhZW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KQEAgLTcyLDYgKzE5NCwyMyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS11dGlsPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gSmV0dHkgNiByZXF1aXJlZCBmb3IgSGFkb29wIERmc01pbmlDbHVzdGVyIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCiAgICAgPCEtLSBJZiB5b3VyIHRlc3RzIGRvbid0IHVzZSBCYXNlRGlzdHJpYnV0ZWRTZWFyY2hUZXN0Q2FzZSBvciBTb2xySmV0dHlUZXN0QmFzZSwKICAgICAgICAgIHlvdSBjYW4gZXhjbHVkZSB0aGUgdHdvIEpldHR5IGRlcGVuZGVuY2llcyBiZWxvdy4gLS0+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC0xMzAsNiArMjY5LDcgQEAKICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlc0ZpbGU+JHt0b3AtbGV2ZWx9L2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL3NlcnZsZXQtYXBpLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CiAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy90ZXN0cy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICAgIDxzaWduYXR1cmVzRmlsZT4ke3RvcC1sZXZlbH0vbHVjZW5lL3Rvb2xzL2ZvcmJpZGRlbkFwaXMvZXhlY3V0b3JzLnR4dDwvc2lnbmF0dXJlc0ZpbGU+CisgICAgICAgICAgICAgICAgPHNpZ25hdHVyZXNGaWxlPiR7dG9wLWxldmVsfS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQ8L3NpZ25hdHVyZXNGaWxlPgogICAgICAgICAgICAgICA8L3NpZ25hdHVyZXNGaWxlcz4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KZGlmZiAtLWdpdCBhL2Rldi10b29scy9tYXZlbi9zb2xyL3dlYmFwcC9wb20ueG1sLnRlbXBsYXRlIGIvZGV2LXRvb2xzL21hdmVuL3NvbHIvd2ViYXBwL3BvbS54bWwudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NmE1NGEuLjAwMDAwMDAKLS0tIGEvZGV2LXRvb2xzL21hdmVuL3NvbHIvd2ViYXBwL3BvbS54bWwudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuc29scjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5zb2xyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj5AdmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNvbHI8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnNvbHI8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBTb2xyIFNlYXJjaCBTZXJ2ZXI8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj5BcGFjaGUgU29sciBTZWFyY2ggU2VydmVyPC9kZXNjcmlwdGlvbj4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPG1vZHVsZS1kaXJlY3Rvcnk+c29sci93ZWJhcHA8L21vZHVsZS1kaXJlY3Rvcnk+Ci0gICAgPHJlbGF0aXZlLXRvcC1sZXZlbD4uLi8uLi8uLjwvcmVsYXRpdmUtdG9wLWxldmVsPgotICAgIDxtb2R1bGUtcGF0aD4ke3JlbGF0aXZlLXRvcC1sZXZlbH0vJHttb2R1bGUtZGlyZWN0b3J5fTwvbW9kdWxlLXBhdGg+Ci0gIDwvcHJvcGVydGllcz4KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOiR7dmMtYW5vbnltb3VzLWJhc2UtdXJsfS8ke21vZHVsZS1kaXJlY3Rvcnl9PC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46JHt2Yy1kZXYtYmFzZS11cmx9LyR7bW9kdWxlLWRpcmVjdG9yeX08L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD4ke3ZjLWJyb3dzZS1iYXNlLXVybH0vJHttb2R1bGUtZGlyZWN0b3J5fTwvdXJsPgotICA8L3NjbT4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNvbHItY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zb2xyLXNvbHJqPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5Lm9yYml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxkaXJlY3Rvcnk+JHtidWlsZC1kaXJlY3Rvcnl9PC9kaXJlY3Rvcnk+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPiA8IS0tIFRoZXJlIGFyZSBubyBwdWJsaWMgb3IgcHJvdGVjdGVkIGNsYXNzZXMgLS0+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8IS0tIFRoZXJlIGFyZSBubyBzb3VyY2VzIGZvciB0aGUgU29sciBXQVIsIGJ1dCAgICAtLT4KLSAgICAgICAgICA8IS0tIHRoZSBtYXZlbi1zb3VyY2UtcGx1Z2luIGhhcyBubyAic2tpcCIgb3B0aW9uLiAtLT4KLSAgICAgICAgICA8IS0tIFNldHRpbmcgYXR0YWNoPWZhbHNlIHByZXZlbnRzIHRoZSBidWlsdCBqYXIgICAtLT4KLSAgICAgICAgICA8IS0tIGZyb20gYmVpbmcgaW5zdGFsbGVkIG9yIGRlcGxveWVkLiAgICAgICAgICAgICAtLT4KLSAgICAgICAgICA8YXR0YWNoPmZhbHNlPC9hdHRhY2g+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8d2FyU291cmNlRGlyZWN0b3J5PiR7bW9kdWxlLXBhdGh9L3dlYjwvd2FyU291cmNlRGlyZWN0b3J5PgotICAgICAgICAgIDx3ZWJYbWw+JHttb2R1bGUtcGF0aH0vd2ViL1dFQi1JTkYvd2ViLnhtbDwvd2ViWG1sPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDwhLS0gaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvSmV0dHkvRmVhdHVyZS9KZXR0eV9NYXZlbl9QbHVnaW4gLS0+Ci0gICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgIDx3ZWJBcHBDb25maWc+Ci0gICAgICAgICAgICA8Y29udGV4dFBhdGg+L3NvbHI8L2NvbnRleHRQYXRoPgotICAgICAgICAgIDwvd2ViQXBwQ29uZmlnPgotICAgICAgICAgIDx3ZWJBcHBTb3VyY2VEaXJlY3Rvcnk+JHttb2R1bGUtcGF0aH0vd2ViPC93ZWJBcHBTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxuYW1lPnNvbHIuc29sci5ob21lPC9uYW1lPgotICAgICAgICAgICAgICA8dmFsdWU+JHt0b3AtbGV2ZWx9L3NvbHIvZXhhbXBsZS9zb2xyPC92YWx1ZT4KLSAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPmRlLnRoZXRhcGhpPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5mb3JiaWRkZW5hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNvbHItc2hhcmVkLWNoZWNrLWZvcmJpZGRlbi1hcGlzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4gPCEtLSBCbG9jayBpbmhlcml0ZWQgZXhlY3V0aW9uIC0tPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+c29sci1zaGFyZWQtdGVzdC1jaGVjay1mb3JiaWRkZW4tYXBpczwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+bm9uZTwvcGhhc2U+IDwhLS0gQmxvY2sgaW5oZXJpdGVkIGV4ZWN1dGlvbiAtLT4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL3NjcmlwdHMvYnVpbGRBbmRQdXNoUmVsZWFzZS5weSBiL2Rldi10b29scy9zY3JpcHRzL2J1aWxkQW5kUHVzaFJlbGVhc2UucHkKaW5kZXggODJiMDQ2ZC4uYWY0ZDdiOSAxMDA2NDQKLS0tIGEvZGV2LXRvb2xzL3NjcmlwdHMvYnVpbGRBbmRQdXNoUmVsZWFzZS5weQorKysgYi9kZXYtdG9vbHMvc2NyaXB0cy9idWlsZEFuZFB1c2hSZWxlYXNlLnB5CkBAIC00Niw5ICs0NiwxMCBAQAogICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihtc2cpCiAKIGRlZiBydW5BbmRTZW5kR1BHUGFzc3dvcmQoY29tbWFuZCwgcGFzc3dvcmQpOgotICBwID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT0wLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKICAgZiA9IG9wZW4oTE9HLCAnYWInKQogICB3aGlsZSBUcnVlOgorICAgIHAuc3Rkb3V0LmZsdXNoKCkKICAgICBsaW5lID0gcC5zdGRvdXQucmVhZGxpbmUoKQogICAgIGlmIGxlbihsaW5lKSA9PSAwOgogICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2Rldi10b29scy9zY3JpcHRzL3Ntb2tlVGVzdFJlbGVhc2UucHkgYi9kZXYtdG9vbHMvc2NyaXB0cy9zbW9rZVRlc3RSZWxlYXNlLnB5CmluZGV4IGYxY2U5YzguLmI0NzQwMGMgMTAwNjQ0Ci0tLSBhL2Rldi10b29scy9zY3JpcHRzL3Ntb2tlVGVzdFJlbGVhc2UucHkKKysrIGIvZGV2LXRvb2xzL3NjcmlwdHMvc21va2VUZXN0UmVsZWFzZS5weQpAQCAtOTcwLDEwICs5NzAsNiBAQAogICAgIHByaW50KCcgICAgdW5wYWNrICVzLi4uJyAlIGRpc3RyaWJ1dGlvbikKICAgICB1bnBhY2tMb2dGaWxlID0gJyVzL3VucGFjay0lcy1tYXZlbi1jaGVja3MubG9nJyAlICh0bXBEaXIsIGRpc3RyaWJ1dGlvbikKICAgICBydW4oJ3RhciB4emYgJXMvJXMnICUgKHRtcERpciwgZGlzdHJpYnV0aW9uKSwgdW5wYWNrTG9nRmlsZSkKLSAgICBpZiBwcm9qZWN0ID09ICdzb2xyJzogIyB1bnBhY2sgdGhlIFNvbHIgd2FyCi0gICAgICB1bnBhY2tMb2dGaWxlID0gJyVzL3VucGFjay1zb2xyLXdhci1tYXZlbi1jaGVja3MubG9nJyAlIHRtcERpcgotICAgICAgcHJpbnQoJyAgICAgICAgdW5wYWNrIFNvbHIgd2FyLi4uJykKLSAgICAgIHJ1bignamFyIHh2ZiAqL2Rpc3QvKi53YXInLCB1bnBhY2tMb2dGaWxlKQogICAgIGRpc3RyaWJ1dGlvbkZpbGVzW3Byb2plY3RdID0gW10KICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkZXN0RGlyKToKICAgICAgIGRpc3RyaWJ1dGlvbkZpbGVzW3Byb2plY3RdLmV4dGVuZChbb3MucGF0aC5qb2luKHJvb3QsIGZpbGUpIGZvciBmaWxlIGluIGZpbGVzXSkKQEAgLTEzMDksNyArMTMwNSw3IEBACiAKICAgaWYgbGVuKHN5cy5hcmd2KSA8IDU6CiAgICAgcHJpbnQoKQotICAgIHByaW50KCdVc2FnZSBweXRob24gLXUgJXMgQmFzZVVSTCBTdm5SZXZpc2lvbiB2ZXJzaW9uIHRtcERpciBbIGlzU2lnbmVkIF0gWyAtdGVzdEFyZ3MgIi1Ed2hhdD1ldmVyIFsgLi4uIF0iIF0nCisgICAgcHJpbnQoJ1VzYWdlIHB5dGhvbiAtdSAlcyBCYXNlVVJMIFN2blJldmlzaW9uIHZlcnNpb24gdG1wRGlyIFsgaXNTaWduZWQoVHJ1ZXxGYWxzZSkgXSBbIC10ZXN0QXJncyAiLUR3aGF0PWV2ZXIgWyAuLi4gXSIgXScKICAgICAgICAgICAlIHN5cy5hcmd2WzBdKQogICAgIHByaW50KCkKICAgICBwcmludCgnICBleGFtcGxlOiBweXRob24zLjIgLXUgZGV2LXRvb2xzL3NjcmlwdHMvc21va2VUZXN0UmVsZWFzZS5weSBodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvfndob2V2ZXIvc3RhZ2luZ19hcmVhL2x1Y2VuZS1zb2xyLTQuMy4wLVJDMS1yZXYxNDY5MzQwIDE0NjkzNDAgNC4zLjAgL3BhdGgvdG8vYS90bXAvZGlyJykKZGlmZiAtLWdpdCBhL2x1Y2VuZS9DSEFOR0VTLnR4dCBiL2x1Y2VuZS9DSEFOR0VTLnR4dAppbmRleCBlOTBlNTY3Li4xZTdjMTFjIDEwMDY0NAotLS0gYS9sdWNlbmUvQ0hBTkdFUy50eHQKKysrIGIvbHVjZW5lL0NIQU5HRVMudHh0CkBAIC0yMywxMSArMjMsMTkgQEAKICAgbm90IHBvc2l0aW9uZWQuIFRoaXMgY2hhbmdlIGFmZmVjdHMgYWxsIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20KICAgRG9jSWRTZXRJdGVyYXRvciwgaW5jbHVkaW5nIERvY3NFbnVtIGFuZCBEb2NzQW5kUG9zaXRpb25zRW51bS4gKEFkcmllbiBHcmFuZCkKIAorKiBMVUNFTkUtNTA4OTogVXBkYXRlIHRvIE1vcmZvbG9naWsgMS42LjAuIE1vcmZvbG9naWtBbmFseXplciBhbmQgTW9yZm9sb2dpa0ZpbHRlciAKKyAgbm8gbG9uZ2VyIHN1cHBvcnQgbXVsdGlwbGUgImRpY3Rpb25hcmllcyIgYXMgdGhlcmUgaXMgb25seSBvbmUgZGljdGlvbmFyeSBhdmFpbGFibGUuCisgIChEYXdpZCBXZWlzcykKKwogTmV3IEZlYXR1cmVzCiAKICogTFVDRU5FLTQ3NDc6IE1vdmUgdG8gSmF2YSA3IGFzIG1pbmltdW0gSmF2YSB2ZXJzaW9uLgogICAoUm9iZXJ0IE11aXIsIFV3ZSBTY2hpbmRsZXIpCiAKKyogTFVDRU5FLTUwODk6IFVwZGF0ZSB0byBNb3Jmb2xvZ2lrIDEuNi4wLiBNb3Jmb2xvZ2lrQW5hbHl6ZXIgYW5kIE1vcmZvbG9naWtGaWx0ZXIgCisgIG5vIGxvbmdlciBzdXBwb3J0IG11bHRpcGxlICJkaWN0aW9uYXJpZXMiIGFzIHRoZXJlIGlzIG9ubHkgb25lIGRpY3Rpb25hcnkgYXZhaWxhYmxlLgorICAoRGF3aWQgV2Vpc3MpCisKIE9wdGltaXphdGlvbnMKIAogKiBMVUNFTkUtNDg0ODogVXNlIEphdmEgNyBOSU8yLUZpbGVDaGFubmVsIGluc3RlYWQgb2YgUmFuZG9tQWNjZXNzRmlsZQpAQCAtMzksNiArNDcsOSBAQAogCiBDaGFuZ2VzIGluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHBvbGljeQogCisqIExVQ0VORS01MDg1OiBNb3Jmb2xvZ2lrRmlsdGVyIHdpbGwgbm8gbG9uZ2VyIHN0ZW0gd29yZHMgbWFya2VkIGFzIGtleXdvcmRzCisgIChEYXdpZCBXZWlzcywgR3J6ZWdvcnogU29iY3p5aykKKwogKiBMVUNFTkUtNDk1NTogTkdyYW1Ub2tlbkZpbHRlciBub3cgZW1pdHMgYWxsIG4tZ3JhbXMgZm9yIHRoZSBzYW1lIHRva2VuIGF0IHRoZQogICBzYW1lIHBvc2l0aW9uIGFuZCBwcmVzZXJ2ZXMgdGhlIHBvc2l0aW9uIGxlbmd0aCBhbmQgdGhlIG9mZnNldHMgb2YgdGhlCiAgIG9yaWdpbmFsIHRva2VuLiAoU2ltb24gV2lsbG5hdWVyLCBBZHJpZW4gR3JhbmQpCkBAIC00Nyw2ICs1OCwxMCBAQAogICAoYSwgYWIsIGIsIGJjLCBjKSBpbnN0ZWFkIG9mIChhLCBiLCBjLCBhYiwgYmMpIGFuZCBkb2Vzbid0IHRyaW0gdHJhaWxpbmcKICAgd2hpdGVzcGFjZXMuIChBZHJpZW4gR3JhbmQpCiAKKyogTFVDRU5FLTUwNDI6IFRoZSBuLWdyYW0gYW5kIGVkZ2Ugbi1ncmFtIHRva2VuaXplcnMgYW5kIGZpbHRlcnMgbm93IGNvcnJlY3RseQorICBoYW5kbGUgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzLCBhbmQgdGhlIHRva2VuaXplcnMgaGF2ZSB0aGUgYWJpbGl0eSB0bworICBwcmUtdG9rZW5pemUgdGhlIGlucHV0IHN0cmVhbSBzaW1pbGFybHkgdG8gQ2hhclRva2VuaXplci4gKEFkcmllbiBHcmFuZCkKKwogKiBMVUNFTkUtNDk2NzogTlJUTWFuYWdlciBpcyByZXBsYWNlZCBieQogICBDb250cm9sbGVkUmVhbFRpbWVSZW9wZW5UaHJlYWQsIGZvciBjb250cm9sbGluZyB3aGljaCByZXF1ZXN0cyBtdXN0CiAgIHNlZSB3aGljaCBpbmRleGluZyBjaGFuZ2VzLCBzbyB0aGF0IGl0IGNhbiB3b3JrIHdpdGggYW55CkBAIC05MCw4ICsxMDUsMzEgQEAKICAgY2F0ZWdvcmllcy4gWW91IHNob3VsZCBzZXQgVGFrbWlTYW1wbGVGaXhlciBvbiBTYW1wbGluZ1BhcmFtcyBpZiByZXF1aXJlZCAoYnV0IAogICBub3RpY2UgdGhhdCB0aGlzIG1lYW5zIHNsb3dlciBzZWFyY2gpLiAoUm9iIEF1ZGVuYWVyZGUsIEdpbGFkIEJhcmthaSwgU2hhaSBFcmVyYSkKIAorKiBMVUNFTkUtNDkzMzogUmVwbGFjZSBFeGFjdFNpbVNjb3Jlci9TbG9wcHlTaW1TY29yZXIgd2l0aCBqdXN0IFNpbVNjb3Jlci4gUHJldmlvdXNseQorICB0aGVyZSB3ZXJlIDIgaW1wbGVtZW50YXRpb25zIGFzIGEgcGVyZm9ybWFuY2UgaGFjayB0byBzdXBwb3J0IHRhYmxlaXphdGlvbiBvZgorICBzcXJ0KCksIGJ1dCB0aGlzIGNhY2hpbmcgaXMgcmVtb3ZlZCwgYXMgc3FydCBpcyBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSB3aXRoIG1vZGVybiAKKyAganZtcyBhbmQgaXRzIGZhc3RlciBub3QgdG8gY2FjaGUuICAoUm9iZXJ0IE11aXIpCisKKyogTFVDRU5FLTUwMzg6IE1lcmdlUG9saWN5IG5vdyBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB1c2VDb21wb3VuZEZpbGUgYmFzZWQKKyAgb24gc2VnbWVudCBzaXplIGFuZCBub0NGU1JhdGlvLiBUaGUgZGVmYXVsdCBpbXBsZW1hbnRpb24gd2FzIHB1bGxlZCB1cCBmcm9tCisgIFRpZXJlZE1lcmdlUG9saWN5LiAoU2ltb24gV2lsbG5hdWVyKQorCisqIExVQ0VORS01MDYzOiBGaWVsZENhY2hlLmdldChCeXRlc3xTaG9ydHMpLCBTb3J0RmllbGQuVHlwZS4oQllURXxTSE9SVCkgYW5kCisgIEZpZWxkQ2FjaGUuREVGQVVMVF8oQllURXxTSE9SVHxJTlR8TE9OR3xGTE9BVHxET1VCTEUpX1BBUlNFUiBhcmUgbm93CisgIGRlcHJlY2F0ZWQuIFRoZXNlIG1ldGhvZHMvdHlwZXMgYXNzdW1lIHRoYXQgZGF0YSBpcyBzdG9yZWQgYXMgc3RyaW5ncyBhbHRob3VnaAorICBMdWNlbmUgaGFzIG11Y2ggYmV0dGVyIHN1cHBvcnQgZm9yIG51bWVyaWMgZGF0YSB0aHJvdWdoIChJbnR8TG9uZylGaWVsZCwKKyAgTnVtZXJpY1JhbmdlUXVlcnkgYW5kIEZpZWxkQ2FjaGUuZ2V0KEludHxMb25nKXMuIChBZHJpZW4gR3JhbmQpCisKKyogTFVDRU5FLTUwNzg6IFRmSURGU2ltaWxhcml0eSBsZXRzIHlvdSBlbmNvZGUgdGhlIG5vcm0gdmFsdWUgYXMgYW55IGFyYml0cmFyeSBsb25nLgorICBBcyBhIHJlc3VsdCwgZW5jb2RlL2RlY29kZU5vcm1WYWx1ZSB3ZXJlIG1hZGUgYWJzdHJhY3Qgd2l0aCB0aGVpciBzaWduYXR1cmVzIGNoYW5nZWQuCisgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdhcyBtb3ZlZCB0byBEZWZhdWx0U2ltaWxhcml0eSwgd2hpY2ggZW5jb2RlcyB0aGUgbm9ybSBhcworICBhIHNpbmdsZS1ieXRlIHZhbHVlLiAoU2hhaSBFcmVyYSkKKwogQnVnIEZpeGVzCiAKKyogTFVDRU5FLTQ4OTA6IFF1ZXJ5VHJlZUJ1aWxkZXIuZ2V0QnVpbGRlcigpIG9ubHkgZmluZHMgaW50ZXJmYWNlcyBvbiB0aGUgCisgIG1vc3QgZGVyaXZlZCBjbGFzcy4gKEFkcmlhbm8gQ3Jlc3RhbmkpCisKICogTFVDRU5FLTQ5OTc6IEludGVybmFsIHRlc3QgZnJhbWV3b3JrJ3MgdGVzdHMgYXJlIHNlbnNpdGl2ZSB0byBwcmV2aW91cyAKICAgdGVzdCBmYWlsdXJlcyBhbmQgdGVzdHMuZmFpbGZhc3QuIChEYXdpZCBXZWlzcywgU2hhaSBFcmVyYSkKIApAQCAtMTIzLDYgKzE2MSw0OCBAQAogICBzb21lIHJlYWRlcnMgZGlkIG5vdCBoYXZlIHRoZSByZXF1ZXN0ZWQgbnVtZXJpYyBEViBmaWVsZC4KICAgKFJvYiBBdWRlbmFlcmRlLCBTaGFpIEVyZXJhKQogCisqIExVQ0VORS01MDI4OiBSZW1vdmUgcG9pbnRsZXNzIGFuZCBjb25mdXNpbmcgZG9TaGFyZSBvcHRpb24gaW4gRlNUJ3MKKyAgUG9zaXRpdmVJbnRPdXRwdXRzIChIYW4gSmlhbmcgdmlhIE1pa2UgTWNDYW5kbGVzcykKKworKiBMVUNFTkUtNTAzMjogRml4IEluZGV4T3V0T2ZCb3VuZHNFeGMgaW4gUG9zdGluZ3NIaWdobGlnaHRlciB3aGVuCisgIG11bHRpLXZhbHVlZCBmaWVsZHMgZXhjZWVkIG1heExlbmd0aCAoVG9tw6FzIEZlcm7DoW5kZXogTMO2YmJlCisgIHZpYSBNaWtlIE1jQ2FuZGxlc3MpCisKKyogTFVDRU5FLTQ5MzM6IFN3ZWV0U3BvdFNpbWlsYXJpdHkgZGlkbid0IGFwcGx5IGl0cyB0ZiBmdW5jdGlvbiB0byBzb21lCisgIHF1ZXJpZXMgKFNsb3BweVBocmFzZVF1ZXJ5LCBTcGFuUXVlcmllcykuICAoUm9iZXJ0IE11aXIpCisKKyogTFVDRU5FLTUwMzM6IFNsb3dGdXp6eVF1ZXJ5IHdhcyBhY2NlcHRpbmcgdG9vIG1hbnkgdGVybXMgKGRvY3VtZW50cykgd2hlbgorICBwcm92aWRlZCBtaW5TaW1pbGFyaXR5IGlzIGFuIGludCA+IDEgKFRpbSBBbGxpc29uIHZpYSBNaWtlIE1jQ2FuZGxlc3MpCisKKyogTFVDRU5FLTUwNDU6IERyaWxsU2lkZXdheXMuc2VhcmNoIGRpZCBub3Qgd29yayBvbiBhbiBlbXB0eSBpbmRleC4gKFNoYWkgRXJlcmEpCisKKyogTFVDRU5FLTQ5OTU6IENvbXByZXNzaW5nU3RvcmVkRmllbGRzUmVhZGVyIG5vdyBvbmx5IHJldXNlcyBhbiBpbnRlcm5hbCBidWZmZXIKKyAgd2hlbiB0aGVyZSBpcyBubyBtb3JlIHRoYW4gMzJrYiB0byBkZWNvbXByZXNzLiBUaGlzIHByZXZlbnRzIGZyb20gcnVubmluZworICBpbnRvIG91dC1vZi1tZW1vcnkgZXJyb3JzIHdoZW4gd29ya2luZyB3aXRoIGxhcmdlIHN0b3JlZCBmaWVsZHMuCisgIChBZHJpZW4gR3JhbmQpCisKKyogTFVDRU5FLTUwNDg6IENhdGVnb3J5UGF0aCB3aXRoIGEgbG9uZyBwYXRoIGNvdWxkIHJlc3VsdCBpbiBoaXR0aW5nIAorICBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiwgY2F0ZWdvcmllcyBiZWluZyBhZGRlZCBtdWx0aXBsZSB0aW1lcyB0byB0aGUgCisgIHRheG9ub215IG9yIGRyaWxsLWRvd24gdGVybXMgc2lsZW50bHkgZGlzY2FyZGVkIGJ5IHRoZSBpbmRleGVyLiBDYXRlZ29yeVBhdGggCisgIGlzIG5vdyBsaW1pdGVkIHRvIE1BWF9DQVRFR09SWV9QQVRIX0xFTkdUSCBjaGFyYWN0ZXJzLgorICAoQ29sdG9uIEphbWllc29uLCBNaWtlIE1jQ2FuZGxlc3MsIFNoYWkgRXJlcmEpCisKKyogTFVDRU5FLTUwNjI6IElmIHRoZSBzcGF0aWFsIGRhdGEgZm9yIGEgZG9jdW1lbnQgd2FzIGNvbXByaXNlZCBvZiBtdWx0aXBsZQorICBvdmVybGFwcGluZyBvciBhZGphY2VudCBwYXJ0cyB0aGVuIGEgQ09OVEFJTlMgcHJlZGljYXRlIHF1ZXJ5IG1pZ2h0IG5vdCBtYXRjaAorICB3aGVuIHRoZSBzdW0gb2YgdGhvc2Ugc2hhcGVzIGNvbnRhaW4gdGhlIHF1ZXJ5IHNoYXBlIGJ1dCBub25lIGRvIGluZGl2aWR1YWxseS4KKyAgQSBmbGFnIHdhcyBhZGRlZCB0byB1c2UgdGhlIG9yaWdpbmFsIGZhc3RlciBhbGdvcml0aG0uIChEYXZpZCBTbWlsZXkpCisKKyogTFVDRU5FLTQ5NzE6IEZpeGVkIE5QRSBpbiBBbmFseXppbmdTdWdnZXN0ZXIgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkKKyAgZ3JhcGggZXhwYW5zaW9ucy4gIChBbGV4ZXkgS3VkaW5vdiB2aWEgTWlrZSBNY0NhbmRsZXNzKQorCisqIExVQ0VORS01MDgwOiBDb21iaW5lZCBzZXRNYXhNZXJnZUNvdW50IGFuZCBzZXRNYXhUaHJlYWRDb3VudCBpbnRvIG9uZQorICBzZXR0ZXIgaW4gQ29uY3VycmVudE1lcmdlUG9saWN5OiBzZXRNYXhNZXJnZXNBbmRUaHJlYWRzLiAgUHJldmlvdXNseSB0aGVzZQorICBzZXR0ZXJzIHdvdWxkIG5vdCB3b3JrIHVubGVzcyB5b3UgaW52b2tlZCB0aGVtIHZlcnkgY2FyZWZ1bGx5LgorICAoUm9iZXJ0IE11aXIsIFNoYWkgRXJlcmEpCisgIAorKiBMVUNFTkUtNTA2ODogUXVlcnlQYXJzZXJVdGlsLmVzY2FwZSgpIGRvZXMgbm90IGVzY2FwZSBmb3J3YXJkIHNsYXNoLgorICAoTWF0aWFzIEhvbHRlIHZpYSBTdGV2ZSBSb3dlKQorCiBPcHRpbWl6YXRpb25zCiAKICogTFVDRU5FLTQ5MzY6IEltcHJvdmUgbnVtZXJpYyBkb2MgdmFsdWVzIGNvbXByZXNzaW9uIGluIGNhc2UgYWxsIHZhbHVlcyBzaGFyZQpAQCAtMTM3LDggKzIxNywyMyBAQAogICBzaW5nbGUgc25hcHNob3RzX04gZmlsZSwgYW5kIG5vIGxvbmdlciByZXF1aXJlcyBjbG9zaW5nIChNaWtlCiAgIE1jQ2FuZGxlc3MsIFNoYWkgRXJlcmEpCiAKKyogTFVDRU5FLTUwMzU6IENvbXByZXNzIGFkZHJlc3NlcyBpbiBGaWVsZENhY2hlSW1wbC5Tb3J0ZWREb2NWYWx1ZXNJbXBsIG1vcmUKKyAgZWZmaWNpZW50bHkuIChBZHJpZW4gR3JhbmQsIFJvYmVydCBNdWlyKQorCisqIExVQ0VORS00OTQxOiBTb3J0ICJmcm9tIiB0ZXJtcyBvbmx5IG9uY2Ugd2hlbiB1c2luZyBKb2luVXRpbC4KKyAgKE1hcnRpam4gdmFuIEdyb25pbmdlbikKKworKiBMVUNFTkUtNTA1MDogQ2xvc2UgdGhlIHN0b3JlZCBmaWVsZHMgYW5kIHRlcm0gdmVjdG9ycyBpbmRleCBmaWxlcyBhcyBzb29uIGFzCisgIHRoZSBpbmRleCBoYXMgYmVlbiBsb2FkZWQgaW50byBtZW1vcnkgdG8gc2F2ZSBmaWxlIGRlc2NyaXB0b3JzLiAoQWRyaWVuIEdyYW5kKQorCiBOZXcgRmVhdHVyZXMKIAorKiBMVUNFTkUtNTA4NTogTW9yZm9sb2dpa0ZpbHRlciB3aWxsIG5vIGxvbmdlciBzdGVtIHdvcmRzIG1hcmtlZCBhcyBrZXl3b3JkcworICAoRGF3aWQgV2Vpc3MsIEdyemVnb3J6IFNvYmN6eWspCisKKyogTFVDRU5FLTUwNjQ6IEFkZGVkIFBhZ2VkTXV0YWJsZSAoaW50ZXJuYWwpLCBhIHBhZ2VkIGV4dGVuc2lvbiBvZgorICBQYWNrZWRJbnRzLk11dGFibGUgd2hpY2ggYWxsb3dzIGZvciBzdG9yaW5nIG1vcmUgdGhhbiAyQiB2YWx1ZXMuIChBZHJpZW4gR3JhbmQpCisKICogTFVDRU5FLTQ3NjY6IEFkZGVkIGEgUGF0dGVybkNhcHR1cmVHcm91cFRva2VuRmlsdGVyIHRoYXQgdXNlcyBKYXZhIHJlZ2V4ZXMgdG8gCiAgIGVtaXQgbXVsdGlwbGUgdG9rZW5zIG9uZSBmb3IgZWFjaCBjYXB0dXJlIGdyb3VwIGluIG9uZSBvciBtb3JlIHBhdHRlcm5zLgogICAoU2ltb24gV2lsbG5hdWVyLCBDbGludG9uIEdvcm1sZXkpCkBAIC0xNjksNiArMjY0LDM3IEBACiAqIExVQ0VORS01MDIyOiBBZGRlZCBGYWNldFJlc3VsdC5tZXJnZUhpZXJhcmNoaWVzIHRvIG1lcmdlIG11bHRpcGxlCiAgIEZhY2V0UmVzdWx0IG9mIHRoZSBzYW1lIGRpbWVuc2lvbiBpbnRvIGEgc2luZ2xlIG9uZSB3aXRoIHRoZSByZWNvbnN0cnVjdGVkCiAgIGhpZXJhcmNoeS4gKFNoYWkgRXJlcmEpCisKKyogTFVDRU5FLTUwMjY6IEFkZGVkIFBhZ2VkR3Jvd2FibGVXcml0ZXIsIGEgbmV3IGludGVybmFsIHBhY2tlZC1pbnRzIHN0cnVjdHVyZQorICB0aGF0IGdyb3dzIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgdmFsdWUgb24gZGVtYW5kLCBjYW4gc3RvcmUgbW9yZSB0aGFuIDJCCisgIHZhbHVlcyBhbmQgc3VwcG9ydHMgcmFuZG9tIHdyaXRlIGFuZCByZWFkIGFjY2Vzcy4gKEFkcmllbiBHcmFuZCkKKworKiBMVUNFTkUtNTAyNTogRlNUJ3MgQnVpbGRlciBjYW4gbm93IGhhbmRsZSBtb3JlIHRoYW4gMi4xIGJpbGxpb24KKyAgInRhaWwgbm9kZXMiIHdoaWxlIGJ1aWxkaW5nIGEgbWluaW1hbCBGU1QuICAoQWFyb24gQmlubnMsIEFkcmllbgorICBHcmFuZCwgTWlrZSBNY0NhbmRsZXNzKQorCisqIExVQ0VORS01MDYzOiBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0KEludHN8TG9uZ3MpIG5vdyB1c2VzIGJpdC1wYWNraW5nIHRvIHNhdmUKKyAgbWVtb3J5LiAoQWRyaWVuIEdyYW5kKQorCisqIExVQ0VORS01MDc5OiBJbmRleFdyaXRlci5oYXNVbmNvbW1pdHRlZENoYW5nZXMoKSByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlCisgIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGNvbW1pdHRlZC4gKHlvbmlrLCBNaWtlIE1jQ2FuZGxlc3MsIFV3ZSBTY2hpbmRsZXIpCisKKyogU09MUi00NTY1OiBFeHRlbmQgTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyIGFuZCBOb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlciAKKyAgdG8gaGFuZGxlICJueW5vcnNrIiAoRXJsZW5kIEdhcsOlc2VuLCBqYW5ob3kgdmlhIFJvYmVydCBNdWlyKQorCisqIExVQ0VORS01MDg3OiBBZGQgZ2V0TXVsdGlWYWx1ZWRTZXBhcmF0b3IgdG8gUG9zdGluZ3NIaWdobGlnaHRlciwgZm9yIGNhc2VzCisgIHdoZXJlIHlvdSB3YW50IGEgZGlmZmVyZW50IGxvZ2ljYWwgc2VwYXJhdG9yIGJldHdlZW4gZmllbGQgdmFsdWVzLiBUaGlzIGNhbgorICBiZSBzZXQgdG8gZS5nLiBVKzIwMjkgUEFSQUdSQVBIIFNFUEFSQVRPUiBpZiB5b3UgbmV2ZXIgd2FudCBwYXNzZXMgdG8gc3BhbgorICB2YWx1ZXMuIChNaWtlIE1jQ2FuZGxlc3MsIFJvYmVydCBNdWlyKQorCisqIExVQ0VORS01MDEzOiBBZGRlZCBTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeSBhbmQKKyAgU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkgKEthcmwgV2V0dGluIHZpYSBqYW5ob3kpCisKK0FQSSBDaGFuZ2VzCisKKyogTFVDRU5FLTUwNzc6IE1ha2UgaXQgZWFzaWVyIHRvIHVzZSBjb21wcmVzc2VkIG5vcm1zLiBMdWNlbmU0Mk5vcm1zRm9ybWF0IHRha2VzCisgIGFuIG92ZXJoZWFkIHBhcmFtZXRlciwgc28geW91IGNhbiBlYXNpbHkgcGFzcyBhIGRpZmZlcmVudCB2YWx1ZSBvdGhlciB0aGFuCisgIFBhY2tlZEludHMuRkFTVEVTVCBmcm9tIHlvdXIgb3duIGNvZGVjLiAgKFJvYmVydCBNdWlyKQogICAKIEJ1aWxkCiAKQEAgLTE3NiwxMiArMzAyLDMxIEBACiAgIFRlc3QgZnJhbWV3b3JrIG1heSBmYWlsIGludGVybmFsbHkgZHVlIHRvIG92ZXJseSBhZ2dyZXNpdmUgSjkgb3B0aW1pemF0aW9ucy4gCiAgIChEYXdpZCBXZWlzcywgU2hhaSBFcmVyYSkKIAorKiBMVUNFTkUtNTA0MzogVGhlIGVjbGlwc2UgdGFyZ2V0IG5vdyB1c2VzIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeSBmb3IgdGhlCisgIHByb2plY3QgbmFtZS4gIFRoaXMgYWxzbyBlbmZvcmNlcyBVVEYtOCBlbmNvZGluZyB3aGVuIGZpbGVzIGFyZSBjb3BpZWQgd2l0aAorICBmaWx0ZXJpbmcuCisKKyogTFVDRU5FLTUwNTU6ICJyYXQtc291cmNlcyIgdGFyZ2V0IG5vdyBjaGVja3MgYWxzbyBidWlsZC54bWwsIGl2eS54bWwsCisgIGZvcmJpZGRlbi1hcGkgc2lnbmF0dXJlcywgYW5kIHBhcnRzIG9mIHJlc291cmNlcyBmb2xkZXJzLiAgKFJ5YW4gRXJuc3QsCisgIFV3ZSBTY2hpbmRsZXIpCisKKyogTFVDRU5FLTUwNzI6IEF1dG9tYXRpY2FsbHkgcGF0Y2ggamF2YWRvY3MgZ2VuZXJhdGVkIGJ5IEpESyB2ZXJzaW9ucworICBiZWZvcmUgN3UyNSB0byB3b3JrIGFyb3VuZCB0aGUgZnJhbWUgaW5qZWN0aW9uIHZ1bG5lcmFiaWxpdHkgKENWRS0yMDEzLTE1NzEsCisgIFZVIzIyNTY1NykuICAoVXdlIFNjaGluZGxlcikKKwogVGVzdHMKIAogKiBMVUNFTkUtNDkwMTogVGVzdEluZGV4V3JpdGVyT25KUkVDcmFzaCBzaG91bGQgd29yayBvbiBhbnkgCiAgIEpSRSB2ZW5kb3IgdmlhIFJ1bnRpbWUuaGFsdCgpLgogICAoTWlrZSBNY0NhbmRsZXNzLCBSb2JlcnQgTXVpciwgVXdlIFNjaGluZGxlciwgUm9kcmlnbyBUcnVqaWxsbywgRGF3aWQgV2Vpc3MpCiAKK0NoYW5nZXMgaW4gcnVudGltZSBiZWhhdmlvcgorCisqIExVQ0VORS01MDM4OiBOZXcgc2VnbWVudHMgd3JpdHRlbiBieSBJbmRleFdyaXRlciBhcmUgbm93IHdyYXBwZWQgaW50byBDRlMKKyAgYnkgZGVmYXVsdC4gRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkIGRvZXNuJ3QgY29uc3VsdCBNZXJnZVBvbGljeSBhbnltb3JlIAorICB0byBkZWNpZGUgaWYgYSBDRlMgbXVzdCBiZSB3cml0dGVuLCBpbnN0ZWFkIEluZGV4V3JpdGVyQ29uZmlnIG5vdyBoYXMgYQorICBwcm9wZXJ0eSB0byBlbmFibGUgLyBkaXNhYmxlIENGUyBmb3IgbmV3bHkgY3JlYXRlZCBzZWdtZW50cy4gKFNpbW9uIFdpbGxuYXVlcikKKwogPT09PT09PT09PT09PT09PT09PT09PT0gTHVjZW5lIDQuMy4xID09PT09PT09PT09PT09PT09PT09PT09CiAKIEJ1ZyBGaXhlcwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9idWlsZC54bWwgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL2J1aWxkLnhtbAppbmRleCBkOWY0ODg5Li43NWRlMGU3IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL2J1aWxkLnhtbAorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL2J1aWxkLnhtbApAQCAtMjUsNiArMjUsNyBAQAogCiAgIDwhLS0gc29tZSBmaWxlcyBmb3IgdGVzdGluZyB0aGF0IGRvIG5vdCBoYXZlIGxpY2Vuc2UgaGVhZGVycyAtLT4KICAgPHByb3BlcnR5IG5hbWU9InJhdC5leGNsdWRlcyIgdmFsdWU9IioqLyouYWZmLCoqLyouZGljLCoqLyoudHh0LCoqL2NoYXJmaWx0ZXIvKi5odG0qLCoqLypMdWNlbmVSZXNvdXJjZXNXaWtpUGFnZS5odG1sIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyYXQuYWRkaXRpb25hbC1pbmNsdWRlcyIgdmFsdWU9InNyYy90b29scy8qKiIvPgogCiAgIDxpbXBvcnQgZmlsZT0iLi4vYW5hbHlzaXMtbW9kdWxlLWJ1aWxkLnhtbCIvPgogCQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9lbC9HcmVla0xvd2VyQ2FzZUZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9lbC9HcmVla0xvd2VyQ2FzZUZpbHRlci5qYXZhCmluZGV4IDAxYzUzN2IuLmJhMGEyMGEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvZWwvR3JlZWtMb3dlckNhc2VGaWx0ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2VsL0dyZWVrTG93ZXJDYXNlRmlsdGVyLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgIGludCBjaExlbiA9IHRlcm1BdHQubGVuZ3RoKCk7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoTGVuOykgewogICAgICAgICBpICs9IENoYXJhY3Rlci50b0NoYXJzKAotICAgICAgICAgICAgbG93ZXJDYXNlKGNoYXJVdGlscy5jb2RlUG9pbnRBdChjaEFycmF5LCBpKSksIGNoQXJyYXksIGkpOworICAgICAgICAgICAgbG93ZXJDYXNlKGNoYXJVdGlscy5jb2RlUG9pbnRBdChjaEFycmF5LCBpLCBjaExlbikpLCBjaEFycmF5LCBpKTsKICAgICAgICB9CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC9IdW5zcGVsbERpY3Rpb25hcnkuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvSHVuc3BlbGxEaWN0aW9uYXJ5LmphdmEKaW5kZXggN2FiZjFiMC4uY2NiNTNmNSAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC9IdW5zcGVsbERpY3Rpb25hcnkuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2h1bnNwZWxsL0h1bnNwZWxsRGljdGlvbmFyeS5qYXZhCkBAIC0zNzgsMTcgKzM3OCwxNCBAQAogICAgICAgICB3b3JkRm9ybSA9IG5ldyBIdW5zcGVsbFdvcmQoZmxhZ1BhcnNpbmdTdHJhdGVneS5wYXJzZUZsYWdzKGZsYWdQYXJ0KSk7CiAgICAgICAgIEFycmF5cy5zb3J0KHdvcmRGb3JtLmdldEZsYWdzKCkpOwogICAgICAgICBlbnRyeSA9IGxpbmUuc3Vic3RyaW5nKDAsIGZsYWdTZXApOwotICAgICAgICBpZihpZ25vcmVDYXNlKSB7Ci0gICAgICAgICAgZW50cnkgPSBlbnRyeS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7Ci0gICAgICAgIH0KICAgICAgIH0KLSAgICAgIAotICAgICAgTGlzdDxIdW5zcGVsbFdvcmQ+IGVudHJpZXMgPSB3b3Jkcy5nZXQoZW50cnkpOwotICAgICAgaWYgKGVudHJpZXMgPT0gbnVsbCkgewotICAgICAgICBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxIdW5zcGVsbFdvcmQ+KCk7Ci0gICAgICAgIHdvcmRzLnB1dChlbnRyeSwgZW50cmllcyk7CisgICAgICBpZihpZ25vcmVDYXNlKSB7CisgICAgICAgIGVudHJ5ID0gZW50cnkudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOwogICAgICAgfQorCisgICAgICBMaXN0PEh1bnNwZWxsV29yZD4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SHVuc3BlbGxXb3JkPigpOwogICAgICAgZW50cmllcy5hZGQod29yZEZvcm0pOworICAgICAgd29yZHMucHV0KGVudHJ5LCBlbnRyaWVzKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1NjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNWY1YQotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91czsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuQ2hhclRlcm1BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5TdGVtbWVyVXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhpcyBmaWx0ZXIgZm9sZHMgU2NhbmRpbmF2aWFuIGNoYXJhY3RlcnMgw6XDhcOkw6bDhMOGLT5hIGFuZCDDtsOWw7jDmC0+by4KKyAqIEl0IGFsc28gZGlzY3JpbWluYXRlIGFnYWluc3QgdXNlIG9mIGRvdWJsZSB2b3dlbHMgYWEsIGFlLCBhbywgb2UgYW5kIG9vLCBsZWF2aW5nIGp1c3QgdGhlIGZpcnN0IG9uZS4KKyAqIDxwLz4KKyAqIEl0J3MgaXMgYSBzZW1hbnRpY2FsbHkgbW9yZSBkZXN0cnVjdGl2ZSBzb2x1dGlvbiB0aGFuIHtAbGluayBTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyfSBidXQKKyAqIGNhbiBpbiBhZGRpdGlvbiBoZWxwIHdpdGggbWF0Y2hpbmcgcmFrc21vcmdhcyBhcyByw6Rrc23DtnJnw6VzLgorICogPHAvPgorICogYmzDpWLDpnJzeWx0ZXTDuGogPT0gYmzDpWLDpHJzeWx0ZXTDtmogPT0gYmxhYWJhYXJzeWx0ZXRvZWogPT0gYmxhYmFyc3lsdGV0b2oKKyAqIHLDpGtzbcO2cmfDpXMgPT0gcsOma3Ntw7hyZ8OlcyA9PSByw6Zrc23DtnJnYW9zID09IHJhZWtzbW9lcmdhYXMgPT0gcmFrc21vcmdhcworICogPHAvPgorICogQmFja2dyb3VuZDoKKyAqIFN3ZWRpc2ggw6XDpMO2IGFyZSBpbiBmYWN0IHRoZSBzYW1lIGxldHRlcnMgYXMgTm9yd2VnaWFuIGFuZCBEYW5pc2ggw6XDpsO4IGFuZCB0aHVzIGludGVyY2hhbmdlYWJsZQorICogd2hlbiB1c2VkIGJldHdlZW4gdGhlc2UgbGFuZ3VhZ2VzLiBUaGV5IGFyZSBob3dldmVyIGZvbGRlZCBkaWZmZXJlbnRseSB3aGVuIHBlb3BsZSB0eXBlCisgKiB0aGVtIG9uIGEga2V5Ym9hcmQgbGFja2luZyB0aGVzZSBjaGFyYWN0ZXJzLgorICogPHAvPgorICogSW4gdGhhdCBzaXR1YXRpb24gYWxtb3N0IGFsbCBTd2VkaXNoIHBlb3BsZSB1c2UgYSwgYSwgbyBpbnN0ZWFkIG9mIMOlLCDDpCwgw7YuCisgKiA8cC8+CisgKiBOb3J3ZWdpYW5zIGFuZCBEYW5lcyBvbiB0aGUgb3RoZXIgaGFuZCB1c3VhbGx5IHR5cGUgYWEsIGFlIGFuZCBvZSBpbnN0ZWFkIG9mIMOlLCDDpiBhbmQgw7guCisgKiBTb21lIGRvIGhvd2V2ZXIgdXNlIGEsIGEsIG8sIG9vLCBhbyBhbmQgc29tZXRpbWVzIHBlcm11dGF0aW9ucyBvZiBldmVyeXRoaW5nIGFib3ZlLgorICogPHAvPgorICogVGhpcyBmaWx0ZXIgc29sdmVzIHRoYXQgbWlzbWF0Y2ggcHJvYmxlbSwgYnV0IG1pZ2h0IGFsc28gY2F1c2UgbmV3LgorICogPHAvPgorICogQHNlZSBTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyIGV4dGVuZHMgVG9rZW5GaWx0ZXIgeworCisgIHB1YmxpYyBTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgc3VwZXIoaW5wdXQpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBDaGFyVGVybUF0dHJpYnV0ZSBjaGFyVGVybUF0dHJpYnV0ZSA9IGFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBQSA9ICdcdTAwQzUnOyAvLyDDhQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGFhID0gJ1x1MDBFNSc7IC8vIMOlCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQUUgPSAnXHUwMEM2JzsgLy8gw4YKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBhZSA9ICdcdTAwRTYnOyAvLyDDpgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFFX3NlID0gJ1x1MDBDNCc7IC8vIMOECisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgYWVfc2UgPSAnXHUwMEU0JzsgLy8gw6QKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBPRSA9ICdcdTAwRDgnOyAvLyDDmAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIG9lID0gJ1x1MDBGOCc7IC8vIMO4CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0Vfc2UgPSAnXHUwMEQ2JzsgLy8gw5YKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBvZV9zZSA9ICdcdTAwRjYnOyAvL8O2CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaW5jcmVtZW50VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICghaW5wdXQuaW5jcmVtZW50VG9rZW4oKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNoYXJbXSBidWZmZXIgPSBjaGFyVGVybUF0dHJpYnV0ZS5idWZmZXIoKTsKKyAgICBpbnQgbGVuZ3RoID0gY2hhclRlcm1BdHRyaWJ1dGUubGVuZ3RoKCk7CisKKworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCisgICAgICBpZiAoYnVmZmVyW2ldID09IGFhCisgICAgICAgICAgfHwgYnVmZmVyW2ldID09IGFlX3NlCisgICAgICAgICAgfHwgYnVmZmVyW2ldID09IGFlKSB7CisKKyAgICAgICAgYnVmZmVyW2ldID0gJ2EnOworCisgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSBBQQorICAgICAgICAgIHx8IGJ1ZmZlcltpXSA9PSBBRV9zZQorICAgICAgICAgIHx8IGJ1ZmZlcltpXSA9PSBBRSkgeworCisgICAgICAgIGJ1ZmZlcltpXSA9ICdBJzsKKworICAgICAgfSBlbHNlIGlmIChidWZmZXJbaV0gPT0gb2UKKyAgICAgICAgICB8fCBidWZmZXJbaV0gPT0gb2Vfc2UpIHsKKworICAgICAgICBidWZmZXJbaV0gPSAnbyc7CisKKyAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW2ldID09IE9FCisgICAgICAgICAgfHwgYnVmZmVyW2ldID09IE9FX3NlKSB7CisKKyAgICAgICAgYnVmZmVyW2ldID0gJ08nOworCisgICAgICB9IGVsc2UgaWYgKGxlbmd0aCAtIDEgPiBpKSB7CisKKyAgICAgICAgaWYgKChidWZmZXJbaV0gPT0gJ2EnIHx8IGJ1ZmZlcltpXSA9PSAnQScpCisgICAgICAgICAgICAmJiAoYnVmZmVyW2kgKyAxXSA9PSAnYScKKyAgICAgICAgICAgIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ0EnCisgICAgICAgICAgICB8fCBidWZmZXJbaSArIDFdID09ICdlJworICAgICAgICAgICAgfHwgYnVmZmVyW2kgKyAxXSA9PSAnRScKKyAgICAgICAgICAgIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ28nCisgICAgICAgICAgICB8fCBidWZmZXJbaSArIDFdID09ICdPJykKKyAgICAgICAgICAgICkgeworCisgICAgICAgICAgbGVuZ3RoID0gU3RlbW1lclV0aWwuZGVsZXRlKGJ1ZmZlciwgaSArIDEsIGxlbmd0aCk7CisKKyAgICAgICAgfSBlbHNlIGlmICgoYnVmZmVyW2ldID09ICdvJyB8fCBidWZmZXJbaV0gPT0gJ08nKQorICAgICAgICAgICAgJiYgKGJ1ZmZlcltpICsgMV0gPT0gJ2UnCisgICAgICAgICAgICB8fCBidWZmZXJbaSArIDFdID09ICdFJworICAgICAgICAgICAgfHwgYnVmZmVyW2kgKyAxXSA9PSAnbycKKyAgICAgICAgICAgIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ08nKQorICAgICAgICAgICAgKSB7CisKKyAgICAgICAgICBsZW5ndGggPSBTdGVtbWVyVXRpbC5kZWxldGUoYnVmZmVyLCBpICsgMSwgbGVuZ3RoKTsKKworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY2hhclRlcm1BdHRyaWJ1dGUuc2V0TGVuZ3RoKGxlbmd0aCk7CisKKworICAgIHJldHVybiB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1NjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkZTI0NgotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91czsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLlRva2VuRmlsdGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRmFjdG9yeSBmb3Ige0BsaW5rIFNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJ9LgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2ZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3NjYW5kZm9sZCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIiZndDsKKyAqICAgJmx0O2FuYWx5emVyJmd0OworICogICAgICZsdDt0b2tlbml6ZXIgY2xhc3M9InNvbHIuV2hpdGVzcGFjZVRva2VuaXplckZhY3RvcnkiLyZndDsKKyAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLlNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJGYWN0b3J5Ii8mZ3Q7CisgKiAgICZsdDsvYW5hbHl6ZXImZ3Q7CisgKiAmbHQ7L2ZpZWxkVHlwZSZndDs8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIFNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJGYWN0b3J5IGV4dGVuZHMgVG9rZW5GaWx0ZXJGYWN0b3J5IHsKKworICBwdWJsaWMgU2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlckZhY3RvcnkoTWFwPFN0cmluZyxTdHJpbmc+IGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBpZiAoIWFyZ3MuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBhcmFtZXRlcnM6ICIgKyBhcmdzKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXIgY3JlYXRlKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgcmV0dXJuIG5ldyBTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyKGlucHV0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1NjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMDAzNAotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91czsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuQ2hhclRlcm1BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5TdGVtbWVyVXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhpcyBmaWx0ZXIgbm9ybWFsaXplIHVzZSBvZiB0aGUgaW50ZXJjaGFuZ2VhYmxlIFNjYW5kaW5hdmlhbiBjaGFyYWN0ZXJzIMOmw4bDpMOEw7bDlsO4w5gKKyAqIGFuZCBmb2xkZWQgdmFyaWFudHMgKGFhLCBhbywgYWUsIG9lIGFuZCBvbykgYnkgdHJhbnNmb3JtaW5nIHRoZW0gdG8gw6XDhcOmw4bDuMOYLgorICogPHAvPgorICogSXQncyBhIHNlbWFudGljYWxseSBsZXNzIGRlc3RydWN0aXZlIHNvbHV0aW9uIHRoYW4ge0BsaW5rIFNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJ9LAorICogbW9zdCB1c2VmdWwgd2hlbiBhIHBlcnNvbiB3aXRoIGEgTm9yd2VnaWFuIG9yIERhbmlzaCBrZXlib2FyZCBxdWVyaWVzIGEgU3dlZGlzaCBpbmRleAorICogYW5kIHZpY2UgdmVyc2EuIFRoaXMgZmlsdGVyIGRvZXMgPGI+bm90PC9iPiAgdGhlIGNvbW1vbiBTd2VkaXNoIGZvbGRzIG9mIMOlIGFuZCDDpCB0byBhIG5vciDDtiB0byBvLgorICogPHAvPgorICogYmzDpWLDpnJzeWx0ZXTDuGogPT0gYmzDpWLDpHJzeWx0ZXTDtmogPT0gYmxhYWJhYXJzeWx0ZXRvZWogYnV0IG5vdCBibGFiYXJzeWx0ZXRvagorICogcsOka3Ntw7ZyZ8OlcyA9PSByw6Zrc23DuHJnw6VzID09IHLDpmtzbcO2cmdhb3MgPT0gcmFla3Ntb2VyZ2FhcyBidXQgbm90IHJha3Ntb3JnYXMKKyAqIDxwLz4KKyAqIEBzZWUgU2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlciBleHRlbmRzIFRva2VuRmlsdGVyIHsKKworICBwdWJsaWMgU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgIHN1cGVyKGlucHV0KTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgY2hhclRlcm1BdHRyaWJ1dGUgPSBhZGRBdHRyaWJ1dGUoQ2hhclRlcm1BdHRyaWJ1dGUuY2xhc3MpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQUEgPSAnXHUwMEM1JzsgLy8gw4UKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBhYSA9ICdcdTAwRTUnOyAvLyDDpQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFFID0gJ1x1MDBDNic7IC8vIMOGCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgYWUgPSAnXHUwMEU2JzsgLy8gw6YKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBRV9zZSA9ICdcdTAwQzQnOyAvLyDDhAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGFlX3NlID0gJ1x1MDBFNCc7IC8vIMOkCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0UgPSAnXHUwMEQ4JzsgLy8gw5gKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBvZSA9ICdcdTAwRjgnOyAvLyDDuAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9FX3NlID0gJ1x1MDBENic7IC8vIMOWCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgb2Vfc2UgPSAnXHUwMEY2JzsgLy/DtgorCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGluY3JlbWVudFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIWlucHV0LmluY3JlbWVudFRva2VuKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjaGFyW10gYnVmZmVyID0gY2hhclRlcm1BdHRyaWJ1dGUuYnVmZmVyKCk7CisgICAgaW50IGxlbmd0aCA9IGNoYXJUZXJtQXR0cmlidXRlLmxlbmd0aCgpOworCisKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKworICAgICAgaWYgKGJ1ZmZlcltpXSA9PSBhZV9zZSkgeworICAgICAgICBidWZmZXJbaV0gPSBhZTsKKworICAgICAgfSBlbHNlIGlmIChidWZmZXJbaV0gPT0gQUVfc2UpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gQUU7CisKKyAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW2ldID09IG9lX3NlKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9IG9lOworCisgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSBPRV9zZSkgeworICAgICAgICBidWZmZXJbaV0gPSBPRTsKKworICAgICAgfSBlbHNlIGlmIChsZW5ndGggLSAxID4gaSkgeworCisgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJ2EnICYmIChidWZmZXJbaSArIDFdID09ICdhJyB8fCBidWZmZXJbaSArIDFdID09ICdvJyB8fCBidWZmZXJbaSArIDFdID09ICdBJyB8fCBidWZmZXJbaSArIDFdID09ICdPJykpIHsKKyAgICAgICAgICBsZW5ndGggPSBTdGVtbWVyVXRpbC5kZWxldGUoYnVmZmVyLCBpICsgMSwgbGVuZ3RoKTsKKyAgICAgICAgICBidWZmZXJbaV0gPSBhYTsKKworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSAnQScgJiYgKGJ1ZmZlcltpICsgMV0gPT0gJ2EnIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ0EnIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ28nIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ08nKSkgeworICAgICAgICAgIGxlbmd0aCA9IFN0ZW1tZXJVdGlsLmRlbGV0ZShidWZmZXIsIGkgKyAxLCBsZW5ndGgpOworICAgICAgICAgIGJ1ZmZlcltpXSA9IEFBOworCisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW2ldID09ICdhJyAmJiAoYnVmZmVyW2kgKyAxXSA9PSAnZScgfHwgYnVmZmVyW2kgKyAxXSA9PSAnRScpKSB7CisgICAgICAgICAgbGVuZ3RoID0gU3RlbW1lclV0aWwuZGVsZXRlKGJ1ZmZlciwgaSArIDEsIGxlbmd0aCk7CisgICAgICAgICAgYnVmZmVyW2ldID0gYWU7CisKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXJbaV0gPT0gJ0EnICYmIChidWZmZXJbaSArIDFdID09ICdlJyB8fCBidWZmZXJbaSArIDFdID09ICdFJykpIHsKKyAgICAgICAgICBsZW5ndGggPSBTdGVtbWVyVXRpbC5kZWxldGUoYnVmZmVyLCBpICsgMSwgbGVuZ3RoKTsKKyAgICAgICAgICBidWZmZXJbaV0gPSBBRTsKKworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSAnbycgJiYgKGJ1ZmZlcltpICsgMV0gPT0gJ2UnIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ0UnIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ28nIHx8IGJ1ZmZlcltpICsgMV0gPT0gJ08nKSkgeworICAgICAgICAgIGxlbmd0aCA9IFN0ZW1tZXJVdGlsLmRlbGV0ZShidWZmZXIsIGkgKyAxLCBsZW5ndGgpOworICAgICAgICAgIGJ1ZmZlcltpXSA9IG9lOworCisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW2ldID09ICdPJyAmJiAoYnVmZmVyW2kgKyAxXSA9PSAnZScgfHwgYnVmZmVyW2kgKyAxXSA9PSAnRScgfHwgYnVmZmVyW2kgKyAxXSA9PSAnbycgfHwgYnVmZmVyW2kgKyAxXSA9PSAnTycpKSB7CisgICAgICAgICAgbGVuZ3RoID0gU3RlbW1lclV0aWwuZGVsZXRlKGJ1ZmZlciwgaSArIDEsIGxlbmd0aCk7CisgICAgICAgICAgYnVmZmVyW2ldID0gT0U7CisKKyAgICAgICAgfQorCisgICAgICB9CisgICAgfQorCisgICAgY2hhclRlcm1BdHRyaWJ1dGUuc2V0TGVuZ3RoKGxlbmd0aCk7CisKKworICAgIHJldHVybiB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1NjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZjllMgotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9TY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91czsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLlRva2VuRmlsdGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRmFjdG9yeSBmb3Ige0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm1pc2NlbGxhbmVvdXMuU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlcn0uCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7ZmllbGRUeXBlIG5hbWU9InRleHRfc2NhbmRub3JtIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiJmd0OworICogICAmbHQ7YW5hbHl6ZXImZ3Q7CisgKiAgICAgJmx0O3Rva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvJmd0OworICogICAgICZsdDtmaWx0ZXIgY2xhc3M9InNvbHIuU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLyZndDsKKyAqICAgJmx0Oy9hbmFseXplciZndDsKKyAqICZsdDsvZmllbGRUeXBlJmd0OzwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkgZXh0ZW5kcyBUb2tlbkZpbHRlckZhY3RvcnkgeworCisgIHB1YmxpYyBTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeShNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBpZiAoIWFyZ3MuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBhcmFtZXRlcnM6ICIgKyBhcmdzKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXIgY3JlYXRlKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgcmV0dXJuIG5ldyBTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyKGlucHV0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9FZGdlTkdyYW1Ub2tlbkZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9FZGdlTkdyYW1Ub2tlbkZpbHRlci5qYXZhCmluZGV4IDdlZjgyYWQuLmM1MDEzYzUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5GaWx0ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL0VkZ2VOR3JhbVRva2VuRmlsdGVyLmphdmEKQEAgLTI1LDIxICsyNSwyNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5PZmZzZXRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLlBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5Qb3NpdGlvbkxlbmd0aEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkNoYXJhY3RlclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuVmVyc2lvbjsKIAogLyoqCiAgKiBUb2tlbml6ZXMgdGhlIGdpdmVuIHRva2VuIGludG8gbi1ncmFtcyBvZiBnaXZlbiBzaXplKHMpLgogICogPHA+CiAgKiBUaGlzIHtAbGluayBUb2tlbkZpbHRlcn0gY3JlYXRlIG4tZ3JhbXMgZnJvbSB0aGUgYmVnaW5uaW5nIGVkZ2Ugb2YgYSBpbnB1dCB0b2tlbi4KKyAqIDxwPjxhIG5hbWU9Im1hdGNoX3ZlcnNpb24iIC8+QXMgb2YgTHVjZW5lIDQuNCwgdGhpcyBmaWx0ZXIgaGFuZGxlcyBjb3JyZWN0bHkKKyAqIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycy4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEVkZ2VOR3JhbVRva2VuRmlsdGVyIGV4dGVuZHMgVG9rZW5GaWx0ZXIgewogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9HUkFNX1NJWkUgPSAxOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01JTl9HUkFNX1NJWkUgPSAxOwogCisgIHByaXZhdGUgZmluYWwgQ2hhcmFjdGVyVXRpbHMgY2hhclV0aWxzOwogICBwcml2YXRlIGZpbmFsIGludCBtaW5HcmFtOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhHcmFtOwogICBwcml2YXRlIGNoYXJbXSBjdXJUZXJtQnVmZmVyOwogICBwcml2YXRlIGludCBjdXJUZXJtTGVuZ3RoOworICBwcml2YXRlIGludCBjdXJDb2RlUG9pbnRDb3VudDsKICAgcHJpdmF0ZSBpbnQgY3VyR3JhbVNpemU7CiAgIHByaXZhdGUgaW50IHRva1N0YXJ0OwogICBwcml2YXRlIGludCB0b2tFbmQ7IC8vIG9ubHkgdXNlZCBpZiB0aGUgbGVuZ3RoIGNoYW5nZWQgYmVmb3JlIHRoaXMgZmlsdGVyCkBAIC03NCw2ICs3OSw5IEBACiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW5HcmFtIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhHcmFtIik7CiAgICAgfQogCisgICAgdGhpcy5jaGFyVXRpbHMgPSB2ZXJzaW9uLm9uT3JBZnRlcihWZXJzaW9uLkxVQ0VORV80NCkKKyAgICAgICAgPyBDaGFyYWN0ZXJVdGlscy5nZXRJbnN0YW5jZSh2ZXJzaW9uKQorICAgICAgICA6IENoYXJhY3RlclV0aWxzLmdldEphdmE0SW5zdGFuY2UoKTsKICAgICB0aGlzLm1pbkdyYW0gPSBtaW5HcmFtOwogICAgIHRoaXMubWF4R3JhbSA9IG1heEdyYW07CiAgIH0KQEAgLTg3LDYgKzk1LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBjdXJUZXJtQnVmZmVyID0gdGVybUF0dC5idWZmZXIoKS5jbG9uZSgpOwogICAgICAgICAgIGN1clRlcm1MZW5ndGggPSB0ZXJtQXR0Lmxlbmd0aCgpOworICAgICAgICAgIGN1ckNvZGVQb2ludENvdW50ID0gY2hhclV0aWxzLmNvZGVQb2ludENvdW50KHRlcm1BdHQpOwogICAgICAgICAgIGN1ckdyYW1TaXplID0gbWluR3JhbTsKICAgICAgICAgICB0b2tTdGFydCA9IG9mZnNldEF0dC5zdGFydE9mZnNldCgpOwogICAgICAgICAgIHRva0VuZCA9IG9mZnNldEF0dC5lbmRPZmZzZXQoKTsKQEAgLTk1LDcgKzEwNCw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChjdXJHcmFtU2l6ZSA8PSBtYXhHcmFtKSB7ICAgICAgICAgLy8gaWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBvdXIgbi1ncmFtIHNpemUgcmFuZ2UsIHF1aXQKLSAgICAgICAgaWYgKGN1ckdyYW1TaXplIDw9IGN1clRlcm1MZW5ndGgpIHsgLy8gaWYgdGhlIHJlbWFpbmluZyBpbnB1dCBpcyB0b28gc2hvcnQsIHdlIGNhbid0IGdlbmVyYXRlIGFueSBuLWdyYW1zCisgICAgICAgIGlmIChjdXJHcmFtU2l6ZSA8PSBjdXJDb2RlUG9pbnRDb3VudCkgeyAvLyBpZiB0aGUgcmVtYWluaW5nIGlucHV0IGlzIHRvbyBzaG9ydCwgd2UgY2FuJ3QgZ2VuZXJhdGUgYW55IG4tZ3JhbXMKICAgICAgICAgICAvLyBncmFiIGdyYW1TaXplIGNoYXJzIGZyb20gZnJvbnQgb3IgYmFjawogICAgICAgICAgIGNsZWFyQXR0cmlidXRlcygpOwogICAgICAgICAgIG9mZnNldEF0dC5zZXRPZmZzZXQodG9rU3RhcnQsIHRva0VuZCk7CkBAIC0xMDcsNyArMTE2LDggQEAKICAgICAgICAgICAgIHBvc0luY3JBdHQuc2V0UG9zaXRpb25JbmNyZW1lbnQoMCk7CiAgICAgICAgICAgfQogICAgICAgICAgIHBvc0xlbkF0dC5zZXRQb3NpdGlvbkxlbmd0aChzYXZlUG9zTGVuKTsKLSAgICAgICAgICB0ZXJtQXR0LmNvcHlCdWZmZXIoY3VyVGVybUJ1ZmZlciwgMCwgY3VyR3JhbVNpemUpOworICAgICAgICAgIGZpbmFsIGludCBjaGFyTGVuZ3RoID0gY2hhclV0aWxzLm9mZnNldEJ5Q29kZVBvaW50cyhjdXJUZXJtQnVmZmVyLCAwLCBjdXJUZXJtTGVuZ3RoLCAwLCBjdXJHcmFtU2l6ZSk7CisgICAgICAgICAgdGVybUF0dC5jb3B5QnVmZmVyKGN1clRlcm1CdWZmZXIsIDAsIGNoYXJMZW5ndGgpOwogICAgICAgICAgIGN1ckdyYW1TaXplKys7CiAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5pemVyLmphdmEgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL0VkZ2VOR3JhbVRva2VuaXplci5qYXZhCmluZGV4IGU0MWQ5NDAuLmRlYjE2ZTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5pemVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9FZGdlTkdyYW1Ub2tlbml6ZXIuamF2YQpAQCAtMTcsMzcgKzE3LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuQ2hhclRlcm1BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLk9mZnNldEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5BcnJheVV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5WZXJzaW9uOwogCiAvKioKICAqIFRva2VuaXplcyB0aGUgaW5wdXQgZnJvbSBhbiBlZGdlIGludG8gbi1ncmFtcyBvZiBnaXZlbiBzaXplKHMpLgogICogPHA+CiAgKiBUaGlzIHtAbGluayBUb2tlbml6ZXJ9IGNyZWF0ZSBuLWdyYW1zIGZyb20gdGhlIGJlZ2lubmluZyBlZGdlIG9mIGEgaW5wdXQgdG9rZW4uCisgKiA8cD48YSBuYW1lPSJtYXRjaF92ZXJzaW9uIiAvPkFzIG9mIEx1Y2VuZSA0LjQsIHRoaXMgY2xhc3Mgc3VwcG9ydHMKKyAqIHtAbGluayAjaXNUb2tlbkNoYXIoaW50KSBwcmUtdG9rZW5pemF0aW9ufSBhbmQgY29ycmVjdGx5IGhhbmRsZXMKKyAqIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVycy4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVkZ2VOR3JhbVRva2VuaXplciBleHRlbmRzIFRva2VuaXplciB7CitwdWJsaWMgY2xhc3MgRWRnZU5HcmFtVG9rZW5pemVyIGV4dGVuZHMgTkdyYW1Ub2tlbml6ZXIgewogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9HUkFNX1NJWkUgPSAxOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01JTl9HUkFNX1NJWkUgPSAxOwogCi0gIHByaXZhdGUgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IGFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7Ci0gIHByaXZhdGUgZmluYWwgT2Zmc2V0QXR0cmlidXRlIG9mZnNldEF0dCA9IGFkZEF0dHJpYnV0ZShPZmZzZXRBdHRyaWJ1dGUuY2xhc3MpOwotICBwcml2YXRlIGZpbmFsIFBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlIHBvc0luY3JBdHQgPSBhZGRBdHRyaWJ1dGUoUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGUuY2xhc3MpOwotCi0gIHByaXZhdGUgaW50IG1pbkdyYW07Ci0gIHByaXZhdGUgaW50IG1heEdyYW07Ci0gIHByaXZhdGUgaW50IGdyYW1TaXplOwotICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZDsKLSAgcHJpdmF0ZSBpbnQgaW5MZW47IC8vIGxlbmd0aCBvZiB0aGUgaW5wdXQgQUZURVIgdHJpbSgpCi0gIHByaXZhdGUgaW50IGNoYXJzUmVhZDsgLy8gbGVuZ3RoIG9mIHRoZSBpbnB1dAotICBwcml2YXRlIFN0cmluZyBpblN0cjsKLQogICAvKioKICAgICogQ3JlYXRlcyBFZGdlTkdyYW1Ub2tlbml6ZXIgdGhhdCBjYW4gZ2VuZXJhdGUgbi1ncmFtcyBpbiB0aGUgc2l6ZXMgb2YgdGhlIGdpdmVuIHJhbmdlCiAgICAqCkBAIC01Nyw4ICs0Myw3IEBACiAgICAqIEBwYXJhbSBtYXhHcmFtIHRoZSBsYXJnZXN0IG4tZ3JhbSB0byBnZW5lcmF0ZQogICAgKi8KICAgcHVibGljIEVkZ2VOR3JhbVRva2VuaXplcihWZXJzaW9uIHZlcnNpb24sIFJlYWRlciBpbnB1dCwgaW50IG1pbkdyYW0sIGludCBtYXhHcmFtKSB7Ci0gICAgc3VwZXIoaW5wdXQpOwotICAgIGluaXQodmVyc2lvbiwgbWluR3JhbSwgbWF4R3JhbSk7CisgICAgc3VwZXIodmVyc2lvbiwgaW5wdXQsIG1pbkdyYW0sIG1heEdyYW0sIHRydWUpOwogICB9CiAKICAgLyoqCkBAIC03MSwxMDIgKzU2LDcgQEAKICAgICogQHBhcmFtIG1heEdyYW0gdGhlIGxhcmdlc3Qgbi1ncmFtIHRvIGdlbmVyYXRlCiAgICAqLwogICBwdWJsaWMgRWRnZU5HcmFtVG9rZW5pemVyKFZlcnNpb24gdmVyc2lvbiwgQXR0cmlidXRlRmFjdG9yeSBmYWN0b3J5LCBSZWFkZXIgaW5wdXQsIGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSkgewotICAgIHN1cGVyKGZhY3RvcnksIGlucHV0KTsKLSAgICBpbml0KHZlcnNpb24sIG1pbkdyYW0sIG1heEdyYW0pOworICAgIHN1cGVyKHZlcnNpb24sIGZhY3RvcnksIGlucHV0LCBtaW5HcmFtLCBtYXhHcmFtLCB0cnVlKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0KFZlcnNpb24gdmVyc2lvbiwgaW50IG1pbkdyYW0sIGludCBtYXhHcmFtKSB7Ci0gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmVyc2lvbiBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgfQotCi0gICAgaWYgKG1pbkdyYW0gPCAxKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW5HcmFtIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLSAgICB9Ci0KLSAgICBpZiAobWluR3JhbSA+IG1heEdyYW0pIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbkdyYW0gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heEdyYW0iKTsKLSAgICB9Ci0KLSAgICB0aGlzLm1pbkdyYW0gPSBtaW5HcmFtOwotICAgIHRoaXMubWF4R3JhbSA9IG1heEdyYW07Ci0gIH0KLQotICAvKiogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtLCBvciBudWxsIGF0IEVPUy4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGluY3JlbWVudFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICAvLyBpZiB3ZSBhcmUganVzdCBzdGFydGluZywgcmVhZCB0aGUgd2hvbGUgaW5wdXQKLSAgICBpZiAoIXN0YXJ0ZWQpIHsKLSAgICAgIHN0YXJ0ZWQgPSB0cnVlOwotICAgICAgZ3JhbVNpemUgPSBtaW5HcmFtOwotICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbTWF0aC5taW4oMTAyNCwgbWF4R3JhbSldOwotICAgICAgY2hhcnNSZWFkID0gMDsKLSAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGEgc2hhcmVkIHJlYWRGdWxseSBzb21ld2hlcmU6Ci0gICAgICBib29sZWFuIGV4aGF1c3RlZCA9IGZhbHNlOwotICAgICAgd2hpbGUgKGNoYXJzUmVhZCA8IG1heEdyYW0pIHsKLSAgICAgICAgZmluYWwgaW50IGluYyA9IGlucHV0LnJlYWQoY2hhcnMsIGNoYXJzUmVhZCwgY2hhcnMubGVuZ3RoLWNoYXJzUmVhZCk7Ci0gICAgICAgIGlmIChpbmMgPT0gLTEpIHsKLSAgICAgICAgICBleGhhdXN0ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJzUmVhZCArPSBpbmM7Ci0gICAgICAgIGlmIChjaGFyc1JlYWQgPT0gY2hhcnMubGVuZ3RoICYmIGNoYXJzUmVhZCA8IG1heEdyYW0pIHsKLSAgICAgICAgICBjaGFycyA9IEFycmF5VXRpbC5ncm93KGNoYXJzKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpblN0ciA9IG5ldyBTdHJpbmcoY2hhcnMsIDAsIGNoYXJzUmVhZCk7Ci0KLSAgICAgIGlmICghZXhoYXVzdGVkKSB7Ci0gICAgICAgIC8vIFJlYWQgZXh0cmEgdGhyb3dhd2F5IGNoYXJzIHNvIHRoYXQgb24gZW5kKCkgd2UKLSAgICAgICAgLy8gcmVwb3J0IHRoZSBjb3JyZWN0IG9mZnNldDoKLSAgICAgICAgY2hhcltdIHRocm93YXdheSA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgZmluYWwgaW50IGluYyA9IGlucHV0LnJlYWQodGhyb3dhd2F5LCAwLCB0aHJvd2F3YXkubGVuZ3RoKTsKLSAgICAgICAgICBpZiAoaW5jID09IC0xKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hhcnNSZWFkICs9IGluYzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbkxlbiA9IGluU3RyLmxlbmd0aCgpOwotICAgICAgaWYgKGluTGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcG9zSW5jckF0dC5zZXRQb3NpdGlvbkluY3JlbWVudCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgcG9zSW5jckF0dC5zZXRQb3NpdGlvbkluY3JlbWVudCgxKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgcmVtYWluaW5nIGlucHV0IGlzIHRvbyBzaG9ydCwgd2UgY2FuJ3QgZ2VuZXJhdGUgYW55IG4tZ3JhbXMKLSAgICBpZiAoZ3JhbVNpemUgPiBpbkxlbikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIGlmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2Ygb3VyIG4tZ3JhbSBzaXplIHJhbmdlLCBxdWl0Ci0gICAgaWYgKGdyYW1TaXplID4gbWF4R3JhbSB8fCBncmFtU2l6ZSA+IGluTGVuKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gZ3JhYiBncmFtU2l6ZSBjaGFycyBmcm9tIGZyb250IG9yIGJhY2sKLSAgICB0ZXJtQXR0LnNldEVtcHR5KCkuYXBwZW5kKGluU3RyLCAwLCBncmFtU2l6ZSk7Ci0gICAgb2Zmc2V0QXR0LnNldE9mZnNldChjb3JyZWN0T2Zmc2V0KDApLCBjb3JyZWN0T2Zmc2V0KGdyYW1TaXplKSk7Ci0gICAgZ3JhbVNpemUrKzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAvLyBzZXQgZmluYWwgb2Zmc2V0Ci0gICAgZmluYWwgaW50IGZpbmFsT2Zmc2V0ID0gY29ycmVjdE9mZnNldChjaGFyc1JlYWQpOwotICAgIHRoaXMub2Zmc2V0QXR0LnNldE9mZnNldChmaW5hbE9mZnNldCwgZmluYWxPZmZzZXQpOwotICB9ICAgIAotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc3VwZXIucmVzZXQoKTsKLSAgICBzdGFydGVkID0gZmFsc2U7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vTkdyYW1Ub2tlbkZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuRmlsdGVyLmphdmEKaW5kZXggYjQ5OTQzNy4uMDljMjI5YiAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuRmlsdGVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuRmlsdGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuT2Zmc2V0QXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5Qb3NpdGlvbkluY3JlbWVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuUG9zaXRpb25MZW5ndGhBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5DaGFyYWN0ZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlZlcnNpb247CiAKIC8qKgpAQCAtMzMsNiArMzQsNyBAQAogICogPGEgbmFtZT0idmVyc2lvbiIvPgogICogPHA+WW91IG11c3Qgc3BlY2lmeSB0aGUgcmVxdWlyZWQge0BsaW5rIFZlcnNpb259IGNvbXBhdGliaWxpdHkgd2hlbgogICogY3JlYXRpbmcgYSB7QGxpbmsgTkdyYW1Ub2tlbkZpbHRlcn0uIEFzIG9mIEx1Y2VuZSA0LjQsIHRoaXMgdG9rZW4gZmlsdGVyczo8dWw+CisgKiA8bGk+aGFuZGxlcyBzdXBwbGVtZW50YXJ5IGNoYXJhY3RlcnMgY29ycmVjdGx5LDwvbGk+CiAgKiA8bGk+ZW1pdHMgYWxsIG4tZ3JhbXMgZm9yIHRoZSBzYW1lIHRva2VuIGF0IHRoZSBzYW1lIHBvc2l0aW9uLDwvbGk+CiAgKiA8bGk+ZG9lcyBub3QgbW9kaWZ5IG9mZnNldHMsPC9saT4KICAqIDxsaT5zb3J0cyBuLWdyYW1zIGJ5IHRoZWlyIG9mZnNldCBpbiB0aGUgb3JpZ2luYWwgdG9rZW4gZmlyc3QsIHRoZW4KQEAgLTQyLDYgKzQ0LDEwIEBACiAgKiB7QGxpbmsgVmVyc2lvbiNMVUNFTkVfNDR9IGluIHRoZSBjb25zdHJ1Y3RvciBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgYXMKICAqIGl0IHdpbGwgbGVhZCB0byBicm9rZW4ge0BsaW5rIFRva2VuU3RyZWFtfXMgdGhhdCB3aWxsIGNhdXNlIGhpZ2hsaWdodGluZwogICogYnVncy4KKyAqIDxwPklmIHlvdSB3ZXJlIHVzaW5nIHRoaXMge0BsaW5rIFRva2VuRmlsdGVyfSB0byBwZXJmb3JtIHBhcnRpYWwgaGlnaGxpZ2h0aW5nLAorICogdGhpcyB3b24ndCB3b3JrIGFueW1vcmUgc2luY2UgdGhpcyBmaWx0ZXIgZG9lc24ndCB1cGRhdGUgb2Zmc2V0cy4gWW91IHNob3VsZAorICogbW9kaWZ5IHlvdXIgYW5hbHlzaXMgY2hhaW4gdG8gdXNlIHtAbGluayBOR3JhbVRva2VuaXplcn0sIGFuZCBwb3RlbnRpYWxseQorICogb3ZlcnJpZGUge0BsaW5rIE5HcmFtVG9rZW5pemVyI2lzVG9rZW5DaGFyKGludCl9IHRvIHBlcmZvcm0gcHJlLXRva2VuaXphdGlvbi4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5HcmFtVG9rZW5GaWx0ZXIgZXh0ZW5kcyBUb2tlbkZpbHRlciB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUlOX05HUkFNX1NJWkUgPSAxOwpAQCAtNTEsNiArNTcsNyBAQAogCiAgIHByaXZhdGUgY2hhcltdIGN1clRlcm1CdWZmZXI7CiAgIHByaXZhdGUgaW50IGN1clRlcm1MZW5ndGg7CisgIHByaXZhdGUgaW50IGN1ckNvZGVQb2ludENvdW50OwogICBwcml2YXRlIGludCBjdXJHcmFtU2l6ZTsKICAgcHJpdmF0ZSBpbnQgY3VyUG9zOwogICBwcml2YXRlIGludCBjdXJQb3NJbmMsIGN1clBvc0xlbjsKQEAgLTU5LDYgKzY2LDcgQEAKICAgcHJpdmF0ZSBib29sZWFuIGhhc0lsbGVnYWxPZmZzZXRzOyAvLyBvbmx5IGlmIHRoZSBsZW5ndGggY2hhbmdlZCBiZWZvcmUgdGhpcyBmaWx0ZXIKIAogICBwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFyYWN0ZXJVdGlscyBjaGFyVXRpbHM7CiAgIHByaXZhdGUgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IGFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CiAgIHByaXZhdGUgZmluYWwgUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGUgcG9zSW5jQXR0OwogICBwcml2YXRlIGZpbmFsIFBvc2l0aW9uTGVuZ3RoQXR0cmlidXRlIHBvc0xlbkF0dDsKQEAgLTc1LDYgKzgzLDkgQEAKICAgcHVibGljIE5HcmFtVG9rZW5GaWx0ZXIoVmVyc2lvbiB2ZXJzaW9uLCBUb2tlblN0cmVhbSBpbnB1dCwgaW50IG1pbkdyYW0sIGludCBtYXhHcmFtKSB7CiAgICAgc3VwZXIobmV3IExlbmd0aEZpbHRlcih2ZXJzaW9uLCBpbnB1dCwgbWluR3JhbSwgSW50ZWdlci5NQVhfVkFMVUUpKTsKICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHRoaXMuY2hhclV0aWxzID0gdmVyc2lvbi5vbk9yQWZ0ZXIoVmVyc2lvbi5MVUNFTkVfNDQpCisgICAgICAgID8gQ2hhcmFjdGVyVXRpbHMuZ2V0SW5zdGFuY2UodmVyc2lvbikKKyAgICAgICAgOiBDaGFyYWN0ZXJVdGlscy5nZXRKYXZhNEluc3RhbmNlKCk7CiAgICAgaWYgKG1pbkdyYW0gPCAxKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW5HcmFtIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKICAgICB9CkBAIC0xMjYsNiArMTM3LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBjdXJUZXJtQnVmZmVyID0gdGVybUF0dC5idWZmZXIoKS5jbG9uZSgpOwogICAgICAgICAgIGN1clRlcm1MZW5ndGggPSB0ZXJtQXR0Lmxlbmd0aCgpOworICAgICAgICAgIGN1ckNvZGVQb2ludENvdW50ID0gY2hhclV0aWxzLmNvZGVQb2ludENvdW50KHRlcm1BdHQpOwogICAgICAgICAgIGN1ckdyYW1TaXplID0gbWluR3JhbTsKICAgICAgICAgICBjdXJQb3MgPSAwOwogICAgICAgICAgIGN1clBvc0luYyA9IHBvc0luY0F0dC5nZXRQb3NpdGlvbkluY3JlbWVudCgpOwpAQCAtMTM4LDEzICsxNTAsMTUgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKHZlcnNpb24ub25PckFmdGVyKFZlcnNpb24uTFVDRU5FXzQ0KSkgewotICAgICAgICBpZiAoY3VyR3JhbVNpemUgPiBtYXhHcmFtIHx8IGN1clBvcyArIGN1ckdyYW1TaXplID4gY3VyVGVybUxlbmd0aCkgeworICAgICAgICBpZiAoY3VyR3JhbVNpemUgPiBtYXhHcmFtIHx8IChjdXJQb3MgKyBjdXJHcmFtU2l6ZSkgPiBjdXJDb2RlUG9pbnRDb3VudCkgewogICAgICAgICAgICsrY3VyUG9zOwogICAgICAgICAgIGN1ckdyYW1TaXplID0gbWluR3JhbTsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VyUG9zICsgY3VyR3JhbVNpemUgPD0gY3VyVGVybUxlbmd0aCkgeworICAgICAgICBpZiAoKGN1clBvcyArIGN1ckdyYW1TaXplKSA8PSBjdXJDb2RlUG9pbnRDb3VudCkgewogICAgICAgICAgIGNsZWFyQXR0cmlidXRlcygpOwotICAgICAgICAgIHRlcm1BdHQuY29weUJ1ZmZlcihjdXJUZXJtQnVmZmVyLCBjdXJQb3MsIGN1ckdyYW1TaXplKTsKKyAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBjaGFyVXRpbHMub2Zmc2V0QnlDb2RlUG9pbnRzKGN1clRlcm1CdWZmZXIsIDAsIGN1clRlcm1MZW5ndGgsIDAsIGN1clBvcyk7CisgICAgICAgICAgZmluYWwgaW50IGVuZCA9IGNoYXJVdGlscy5vZmZzZXRCeUNvZGVQb2ludHMoY3VyVGVybUJ1ZmZlciwgMCwgY3VyVGVybUxlbmd0aCwgc3RhcnQsIGN1ckdyYW1TaXplKTsKKyAgICAgICAgICB0ZXJtQXR0LmNvcHlCdWZmZXIoY3VyVGVybUJ1ZmZlciwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgICAgICBwb3NJbmNBdHQuc2V0UG9zaXRpb25JbmNyZW1lbnQoY3VyUG9zSW5jKTsKICAgICAgICAgICBjdXJQb3NJbmMgPSAwOwogICAgICAgICAgIHBvc0xlbkF0dC5zZXRQb3NpdGlvbkxlbmd0aChjdXJQb3NMZW4pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuaXplci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuaXplci5qYXZhCmluZGV4IGEwNjY1YmYuLjY0NmI1ZTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vTkdyYW1Ub2tlbml6ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL05HcmFtVG9rZW5pemVyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuT2Zmc2V0QXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5Qb3NpdGlvbkluY3JlbWVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuUG9zaXRpb25MZW5ndGhBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5DaGFyYWN0ZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlZlcnNpb247CiAKIC8qKgpAQCAtNDAsMjkgKzQxLDQ3IEBACiAgKiA8dHI+PHRoPk9mZnNldHM8L3RoPjx0ZD5bMCwyWzwvdGQ+PHRkPlswLDNbPC90ZD48dGQ+WzEsM1s8L3RkPjx0ZD5bMSw0WzwvdGQ+PHRkPlsyLDRbPC90ZD48dGQ+WzIsNVs8L3RkPjx0ZD5bMyw1WzwvdGQ+PC90cj4KICAqIDwvdGFibGU+CiAgKiA8YSBuYW1lPSJ2ZXJzaW9uIi8+Ci0gKiA8cD5CZWZvcmUgTHVjZW5lIDQuNCwgdGhpcyBjbGFzcyBoYWQgYSBkaWZmZXJlbnQgYmVoYXZpb3I6PHVsPgotICogPGxpPkl0IGRpZG4ndCBzdXBwb3J0IG1vcmUgdGhhbiAxMDI0IGNoYXJzIG9mIGlucHV0LCB0aGUgcmVzdCB3YXMgdHJhc2hlZC48L2xpPgotICogPGxpPlRoZSBsYXN0IHdoaXRlc3BhY2VzIG9mIHRoZSAxMDI0IGNoYXJzIGJsb2NrIHdlcmUgdHJpbW1lZC48L2xpPgotICogPGxpPlRva2VucyB3ZXJlIGVtaXR0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgKGJ5IGluY3JlYXNpbmcgbGVuZ3RocykuPC9saT48L3VsPgotICogPHA+QWx0aG91Z2ggaGlnaGx5IGRpc2NvdXJhZ2VkLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1c2UgdGhlIG9sZCBiZWhhdmlvcgotICogdGhyb3VnaCB7QGxpbmsgTHVjZW5lNDNOR3JhbVRva2VuaXplcn0uCisgKiA8cD5UaGlzIHRva2VuaXplciBjaGFuZ2VkIGEgbG90IGluIEx1Y2VuZSA0LjQgaW4gb3JkZXIgdG86PHVsPgorICogPGxpPnRva2VuaXplIGluIGEgc3RyZWFtaW5nIGZhc2hpb24gdG8gc3VwcG9ydCBzdHJlYW1zIHdoaWNoIGFyZSBsYXJnZXIKKyAqIHRoYW4gMTAyNCBjaGFycyAobGltaXQgb2YgdGhlIHByZXZpb3VzIHZlcnNpb24pLAorICogPGxpPmNvdW50IGdyYW1zIGJhc2VkIG9uIHVuaWNvZGUgY29kZSBwb2ludHMgaW5zdGVhZCBvZiBqYXZhIGNoYXJzIChhbmQKKyAqIG5ldmVyIHNwbGl0IGluIHRoZSBtaWRkbGUgb2Ygc3Vycm9nYXRlIHBhaXJzKSwKKyAqIDxsaT5naXZlIHRoZSBhYmlsaXR5IHRvIHtAbGluayAjaXNUb2tlbkNoYXIoaW50KSBwcmUtdG9rZW5pemV9IHRoZSBzdHJlYW0KKyAqIGJlZm9yZSBjb21wdXRpbmcgbi1ncmFtcy48L3VsPgorICogPHA+QWRkaXRpb25hbGx5LCB0aGlzIGNsYXNzIGRvZXNuJ3QgdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhbmQgZW1pdHMKKyAqIHRva2VucyBpbiBhIGRpZmZlcmVudCBvcmRlciwgdG9rZW5zIGFyZSBub3cgZW1pdHRlZCBieSBpbmNyZWFzaW5nIHN0YXJ0CisgKiBvZmZzZXRzIHdoaWxlIHRoZXkgdXNlZCB0byBiZSBlbWl0dGVkIGJ5IGluY3JlYXNpbmcgbGVuZ3RocyAod2hpY2ggcHJldmVudGVkCisgKiBmcm9tIHN1cHBvcnRpbmcgbGFyZ2UgaW5wdXQgc3RyZWFtcykuCisgKiA8cD5BbHRob3VnaCA8YiBzdHlsZT0iY29sb3I6cmVkIj5oaWdobHk8L2I+IGRpc2NvdXJhZ2VkLCBpdCBpcyBzdGlsbCBwb3NzaWJsZQorICogdG8gdXNlIHRoZSBvbGQgYmVoYXZpb3IgdGhyb3VnaCB7QGxpbmsgTHVjZW5lNDNOR3JhbVRva2VuaXplcn0uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOR3JhbVRva2VuaXplciBleHRlbmRzIFRva2VuaXplciB7CisvLyBub24tZmluYWwgdG8gYWxsb3cgZm9yIG92ZXJyaWRpbmcgaXNUb2tlbkNoYXIsIGJ1dCBhbGwgb3RoZXIgbWV0aG9kcyBzaG91bGQgYmUgZmluYWwKK3B1YmxpYyBjbGFzcyBOR3JhbVRva2VuaXplciBleHRlbmRzIFRva2VuaXplciB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUlOX05HUkFNX1NJWkUgPSAxOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9OR1JBTV9TSVpFID0gMjsKIAotICBwcml2YXRlIGNoYXJbXSBidWZmZXI7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclN0YXJ0LCBidWZmZXJFbmQ7IC8vIHJlbWFpbmluZyBzbGljZSBvZiB0aGUgYnVmZmVyCisgIHByaXZhdGUgQ2hhcmFjdGVyVXRpbHMgY2hhclV0aWxzOworICBwcml2YXRlIENoYXJhY3RlclV0aWxzLkNoYXJhY3RlckJ1ZmZlciBjaGFyQnVmZmVyOworICBwcml2YXRlIGludFtdIGJ1ZmZlcjsgLy8gbGlrZSBjaGFyQnVmZmVyLCBidXQgY29udmVydGVkIHRvIGNvZGUgcG9pbnRzCisgIHByaXZhdGUgaW50IGJ1ZmZlclN0YXJ0LCBidWZmZXJFbmQ7IC8vIHJlbWFpbmluZyBzbGljZSBpbiBidWZmZXIKICAgcHJpdmF0ZSBpbnQgb2Zmc2V0OwogICBwcml2YXRlIGludCBncmFtU2l6ZTsKICAgcHJpdmF0ZSBpbnQgbWluR3JhbSwgbWF4R3JhbTsKICAgcHJpdmF0ZSBib29sZWFuIGV4aGF1c3RlZDsKKyAgcHJpdmF0ZSBpbnQgbGFzdENoZWNrZWRDaGFyOyAvLyBsYXN0IG9mZnNldCBpbiB0aGUgYnVmZmVyIHRoYXQgd2UgY2hlY2tlZAorICBwcml2YXRlIGludCBsYXN0Tm9uVG9rZW5DaGFyOyAvLyBsYXN0IG9mZnNldCB0aGF0IHdlIGZvdW5kIHRvIG5vdCBiZSBhIHRva2VuIGNoYXIKKyAgcHJpdmF0ZSBib29sZWFuIGVkZ2VzT25seTsgLy8gbGVhZGluZyBlZGdlcyBuLWdyYW1zIG9ubHkKIAogICBwcml2YXRlIGZpbmFsIENoYXJUZXJtQXR0cmlidXRlIHRlcm1BdHQgPSBhZGRBdHRyaWJ1dGUoQ2hhclRlcm1BdHRyaWJ1dGUuY2xhc3MpOwogICBwcml2YXRlIGZpbmFsIFBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlIHBvc0luY0F0dCA9IGFkZEF0dHJpYnV0ZShQb3NpdGlvbkluY3JlbWVudEF0dHJpYnV0ZS5jbGFzcyk7CiAgIHByaXZhdGUgZmluYWwgUG9zaXRpb25MZW5ndGhBdHRyaWJ1dGUgcG9zTGVuQXR0ID0gYWRkQXR0cmlidXRlKFBvc2l0aW9uTGVuZ3RoQXR0cmlidXRlLmNsYXNzKTsKICAgcHJpdmF0ZSBmaW5hbCBPZmZzZXRBdHRyaWJ1dGUgb2Zmc2V0QXR0ID0gYWRkQXR0cmlidXRlKE9mZnNldEF0dHJpYnV0ZS5jbGFzcyk7CiAKKyAgTkdyYW1Ub2tlbml6ZXIoVmVyc2lvbiB2ZXJzaW9uLCBSZWFkZXIgaW5wdXQsIGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgYm9vbGVhbiBlZGdlc09ubHkpIHsKKyAgICBzdXBlcihpbnB1dCk7CisgICAgaW5pdCh2ZXJzaW9uLCBtaW5HcmFtLCBtYXhHcmFtLCBlZGdlc09ubHkpOworICB9CisKICAgLyoqCiAgICAqIENyZWF0ZXMgTkdyYW1Ub2tlbml6ZXIgd2l0aCBnaXZlbiBtaW4gYW5kIG1heCBuLWdyYW1zLgogICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgbHVjZW5lIGNvbXBhdGliaWxpdHkgPGEgaHJlZj0iI3ZlcnNpb24iPnZlcnNpb248L2E+CkBAIC03MSw4ICs5MCwxMiBAQAogICAgKiBAcGFyYW0gbWF4R3JhbSB0aGUgbGFyZ2VzdCBuLWdyYW0gdG8gZ2VuZXJhdGUKICAgICovCiAgIHB1YmxpYyBOR3JhbVRva2VuaXplcihWZXJzaW9uIHZlcnNpb24sIFJlYWRlciBpbnB1dCwgaW50IG1pbkdyYW0sIGludCBtYXhHcmFtKSB7Ci0gICAgc3VwZXIoaW5wdXQpOwotICAgIGluaXQodmVyc2lvbiwgbWluR3JhbSwgbWF4R3JhbSk7CisgICAgdGhpcyh2ZXJzaW9uLCBpbnB1dCwgbWluR3JhbSwgbWF4R3JhbSwgZmFsc2UpOworICB9CisKKyAgTkdyYW1Ub2tlbml6ZXIoVmVyc2lvbiB2ZXJzaW9uLCBBdHRyaWJ1dGVGYWN0b3J5IGZhY3RvcnksIFJlYWRlciBpbnB1dCwgaW50IG1pbkdyYW0sIGludCBtYXhHcmFtLCBib29sZWFuIGVkZ2VzT25seSkgeworICAgIHN1cGVyKGZhY3RvcnksIGlucHV0KTsKKyAgICBpbml0KHZlcnNpb24sIG1pbkdyYW0sIG1heEdyYW0sIGVkZ2VzT25seSk7CiAgIH0KIAogICAvKioKQEAgLTg0LDggKzEwNyw3IEBACiAgICAqIEBwYXJhbSBtYXhHcmFtIHRoZSBsYXJnZXN0IG4tZ3JhbSB0byBnZW5lcmF0ZQogICAgKi8KICAgcHVibGljIE5HcmFtVG9rZW5pemVyKFZlcnNpb24gdmVyc2lvbiwgQXR0cmlidXRlRmFjdG9yeSBmYWN0b3J5LCBSZWFkZXIgaW5wdXQsIGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSkgewotICAgIHN1cGVyKGZhY3RvcnksIGlucHV0KTsKLSAgICBpbml0KHZlcnNpb24sIG1pbkdyYW0sIG1heEdyYW0pOworICAgIHRoaXModmVyc2lvbiwgZmFjdG9yeSwgaW5wdXQsIG1pbkdyYW0sIG1heEdyYW0sIGZhbHNlKTsKICAgfQogCiAgIC8qKgpAQCAtOTcsMTAgKzExOSwxMyBAQAogICAgIHRoaXModmVyc2lvbiwgaW5wdXQsIERFRkFVTFRfTUlOX05HUkFNX1NJWkUsIERFRkFVTFRfTUFYX05HUkFNX1NJWkUpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluaXQoVmVyc2lvbiB2ZXJzaW9uLCBpbnQgbWluR3JhbSwgaW50IG1heEdyYW0pIHsKLSAgICBpZiAoIXZlcnNpb24ub25PckFmdGVyKFZlcnNpb24uTFVDRU5FXzQ0KSkgeworICBwcml2YXRlIHZvaWQgaW5pdChWZXJzaW9uIHZlcnNpb24sIGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgYm9vbGVhbiBlZGdlc09ubHkpIHsKKyAgICBpZiAoIWVkZ2VzT25seSAmJiAhdmVyc2lvbi5vbk9yQWZ0ZXIoVmVyc2lvbi5MVUNFTkVfNDQpKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIG9ubHkgd29ya3Mgd2l0aCBMdWNlbmUgNC40Ky4gVG8gZW11bGF0ZSB0aGUgb2xkIChicm9rZW4pIGJlaGF2aW9yIG9mIE5HcmFtVG9rZW5pemVyLCB1c2UgTHVjZW5lNDNOR3JhbVRva2VuaXplciIpOwogICAgIH0KKyAgICBjaGFyVXRpbHMgPSB2ZXJzaW9uLm9uT3JBZnRlcihWZXJzaW9uLkxVQ0VORV80NCkKKyAgICAgICAgPyBDaGFyYWN0ZXJVdGlscy5nZXRJbnN0YW5jZSh2ZXJzaW9uKQorICAgICAgICA6IENoYXJhY3RlclV0aWxzLmdldEphdmE0SW5zdGFuY2UoKTsKICAgICBpZiAobWluR3JhbSA8IDEpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbkdyYW0gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOwogICAgIH0KQEAgLTEwOSw2NiArMTM0LDEwNyBAQAogICAgIH0KICAgICB0aGlzLm1pbkdyYW0gPSBtaW5HcmFtOwogICAgIHRoaXMubWF4R3JhbSA9IG1heEdyYW07Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbbWF4R3JhbSArIDEwMjRdOworICAgIHRoaXMuZWRnZXNPbmx5ID0gZWRnZXNPbmx5OworICAgIGNoYXJCdWZmZXIgPSBDaGFyYWN0ZXJVdGlscy5uZXdDaGFyYWN0ZXJCdWZmZXIoMiAqIG1heEdyYW0gKyAxMDI0KTsgLy8gMiAqIG1heEdyYW0gaW4gY2FzZSBhbGwgY29kZSBwb2ludHMgcmVxdWlyZSAyIGNoYXJzIGFuZCArIDEwMjQgZm9yIGJ1ZmZlcmluZyB0byBub3Qga2VlcCBwb2xsaW5nIHRoZSBSZWFkZXIKKyAgICBidWZmZXIgPSBuZXcgaW50W2NoYXJCdWZmZXIuZ2V0QnVmZmVyKCkubGVuZ3RoXTsKKyAgICAvLyBNYWtlIHRoZSB0ZXJtIGF0dCBsYXJnZSBlbm91Z2gKKyAgICB0ZXJtQXR0LnJlc2l6ZUJ1ZmZlcigyICogbWF4R3JhbSk7CiAgIH0KIAotICAvKiogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtLCBvciBudWxsIGF0IEVPUy4gKi8KICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGluY3JlbWVudFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIGZpbmFsIGJvb2xlYW4gaW5jcmVtZW50VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGNsZWFyQXR0cmlidXRlcygpOwogCi0gICAgLy8gY29tcGFjdAotICAgIGlmIChidWZmZXJTdGFydCA+PSBidWZmZXIubGVuZ3RoIC0gbWF4R3JhbSkgewotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclN0YXJ0LCBidWZmZXIsIDAsIGJ1ZmZlckVuZCAtIGJ1ZmZlclN0YXJ0KTsKLSAgICAgIGJ1ZmZlckVuZCAtPSBidWZmZXJTdGFydDsKLSAgICAgIGJ1ZmZlclN0YXJ0ID0gMDsKKyAgICAvLyB0ZXJtaW5hdGlvbiBvZiB0aGlzIGxvb3AgaXMgZ3VhcmFudGVlZCBieSB0aGUgZmFjdCB0aGF0IGV2ZXJ5IGl0ZXJhdGlvbgorICAgIC8vIGVpdGhlciBhZHZhbmNlcyB0aGUgYnVmZmVyIChjYWxscyBjb25zdW1lcygpKSBvciBpbmNyZWFzZXMgZ3JhbVNpemUKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgLy8gY29tcGFjdAorICAgICAgaWYgKGJ1ZmZlclN0YXJ0ID49IGJ1ZmZlckVuZCAtIG1heEdyYW0gLSAxICYmICFleGhhdXN0ZWQpIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclN0YXJ0LCBidWZmZXIsIDAsIGJ1ZmZlckVuZCAtIGJ1ZmZlclN0YXJ0KTsKKyAgICAgICAgYnVmZmVyRW5kIC09IGJ1ZmZlclN0YXJ0OworICAgICAgICBsYXN0Q2hlY2tlZENoYXIgLT0gYnVmZmVyU3RhcnQ7CisgICAgICAgIGxhc3ROb25Ub2tlbkNoYXIgLT0gYnVmZmVyU3RhcnQ7CisgICAgICAgIGJ1ZmZlclN0YXJ0ID0gMDsKIAotICAgICAgLy8gZmlsbCBpbiByZW1haW5pbmcgc3BhY2UKLSAgICAgIGlmICghZXhoYXVzdGVkKSB7Ci0gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIGEgc2hhcmVkIHJlYWRGdWxseQotICAgICAgICB3aGlsZSAoYnVmZmVyRW5kIDwgYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgIGZpbmFsIGludCByZWFkID0gaW5wdXQucmVhZChidWZmZXIsIGJ1ZmZlckVuZCwgYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckVuZCk7Ci0gICAgICAgICAgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICAgICAgICAgIGV4aGF1c3RlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnVmZmVyRW5kICs9IHJlYWQ7CisgICAgICAgIC8vIGZpbGwgaW4gcmVtYWluaW5nIHNwYWNlCisgICAgICAgIGV4aGF1c3RlZCA9ICFjaGFyVXRpbHMuZmlsbChjaGFyQnVmZmVyLCBpbnB1dCwgYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckVuZCk7CisgICAgICAgIC8vIGNvbnZlcnQgdG8gY29kZSBwb2ludHMKKyAgICAgICAgYnVmZmVyRW5kICs9IGNoYXJVdGlscy50b0NvZGVQb2ludHMoY2hhckJ1ZmZlci5nZXRCdWZmZXIoKSwgMCwgY2hhckJ1ZmZlci5nZXRMZW5ndGgoKSwgYnVmZmVyLCBidWZmZXJFbmQpOworICAgICAgfQorCisgICAgICAvLyBzaG91bGQgd2UgZ28gdG8gdGhlIG5leHQgb2Zmc2V0PworICAgICAgaWYgKGdyYW1TaXplID4gbWF4R3JhbSB8fCAoYnVmZmVyU3RhcnQgKyBncmFtU2l6ZSkgPiBidWZmZXJFbmQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0ICsgMSArIG1pbkdyYW0gPiBidWZmZXJFbmQpIHsKKyAgICAgICAgICBhc3NlcnQgZXhoYXVzdGVkOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCk7CisgICAgICAgIGdyYW1TaXplID0gbWluR3JhbTsKKyAgICAgIH0KKworICAgICAgdXBkYXRlTGFzdE5vblRva2VuQ2hhcigpOworCisgICAgICAvLyByZXRyeSBpZiB0aGUgdG9rZW4gdG8gYmUgZW1pdHRlZCB3YXMgZ29pbmcgdG8gbm90IG9ubHkgY29udGFpbiB0b2tlbiBjaGFycworICAgICAgZmluYWwgYm9vbGVhbiB0ZXJtQ29udGFpbnNOb25Ub2tlbkNoYXIgPSBsYXN0Tm9uVG9rZW5DaGFyID49IGJ1ZmZlclN0YXJ0ICYmIGxhc3ROb25Ub2tlbkNoYXIgPCAoYnVmZmVyU3RhcnQgKyBncmFtU2l6ZSk7CisgICAgICBmaW5hbCBib29sZWFuIGlzRWRnZUFuZFByZXZpb3VzQ2hhcklzVG9rZW5DaGFyID0gZWRnZXNPbmx5ICYmIGxhc3ROb25Ub2tlbkNoYXIgIT0gYnVmZmVyU3RhcnQgLSAxOworICAgICAgaWYgKHRlcm1Db250YWluc05vblRva2VuQ2hhciB8fCBpc0VkZ2VBbmRQcmV2aW91c0NoYXJJc1Rva2VuQ2hhcikgeworICAgICAgICBjb25zdW1lKCk7CisgICAgICAgIGdyYW1TaXplID0gbWluR3JhbTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZpbmFsIGludCBsZW5ndGggPSBjaGFyVXRpbHMudG9DaGFycyhidWZmZXIsIGJ1ZmZlclN0YXJ0LCBncmFtU2l6ZSwgdGVybUF0dC5idWZmZXIoKSwgMCk7CisgICAgICB0ZXJtQXR0LnNldExlbmd0aChsZW5ndGgpOworICAgICAgcG9zSW5jQXR0LnNldFBvc2l0aW9uSW5jcmVtZW50KDEpOworICAgICAgcG9zTGVuQXR0LnNldFBvc2l0aW9uTGVuZ3RoKDEpOworICAgICAgb2Zmc2V0QXR0LnNldE9mZnNldChjb3JyZWN0T2Zmc2V0KG9mZnNldCksIGNvcnJlY3RPZmZzZXQob2Zmc2V0ICsgbGVuZ3RoKSk7CisgICAgICArK2dyYW1TaXplOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhc3ROb25Ub2tlbkNoYXIoKSB7CisgICAgZmluYWwgaW50IHRlcm1FbmQgPSBidWZmZXJTdGFydCArIGdyYW1TaXplIC0gMTsKKyAgICBpZiAodGVybUVuZCA+IGxhc3RDaGVja2VkQ2hhcikgeworICAgICAgZm9yIChpbnQgaSA9IHRlcm1FbmQ7IGkgPiBsYXN0Q2hlY2tlZENoYXI7IC0taSkgeworICAgICAgICBpZiAoIWlzVG9rZW5DaGFyKGJ1ZmZlcltpXSkpIHsKKyAgICAgICAgICBsYXN0Tm9uVG9rZW5DaGFyID0gaTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQorICAgICAgbGFzdENoZWNrZWRDaGFyID0gdGVybUVuZDsKICAgICB9CisgIH0KIAotICAgIC8vIHNob3VsZCB3ZSBnbyB0byB0aGUgbmV4dCBvZmZzZXQ/Ci0gICAgaWYgKGdyYW1TaXplID4gbWF4R3JhbSB8fCBidWZmZXJTdGFydCArIGdyYW1TaXplID4gYnVmZmVyRW5kKSB7Ci0gICAgICBidWZmZXJTdGFydCsrOwotICAgICAgb2Zmc2V0Kys7Ci0gICAgICBncmFtU2l6ZSA9IG1pbkdyYW07Ci0gICAgfQorICAvKiogQ29uc3VtZSBvbmUgY29kZSBwb2ludC4gKi8KKyAgcHJpdmF0ZSB2b2lkIGNvbnN1bWUoKSB7CisgICAgb2Zmc2V0ICs9IENoYXJhY3Rlci5jaGFyQ291bnQoYnVmZmVyW2J1ZmZlclN0YXJ0KytdKTsKKyAgfQogCi0gICAgLy8gYXJlIHRoZXJlIGVub3VnaCBjaGFycyByZW1haW5pbmc/Ci0gICAgaWYgKGJ1ZmZlclN0YXJ0ICsgZ3JhbVNpemUgPiBidWZmZXJFbmQpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0ZXJtQXR0LmNvcHlCdWZmZXIoYnVmZmVyLCBidWZmZXJTdGFydCwgZ3JhbVNpemUpOwotICAgIHBvc0luY0F0dC5zZXRQb3NpdGlvbkluY3JlbWVudCgxKTsKLSAgICBwb3NMZW5BdHQuc2V0UG9zaXRpb25MZW5ndGgoMSk7Ci0gICAgb2Zmc2V0QXR0LnNldE9mZnNldChjb3JyZWN0T2Zmc2V0KG9mZnNldCksIGNvcnJlY3RPZmZzZXQob2Zmc2V0ICsgZ3JhbVNpemUpKTsKLSAgICArK2dyYW1TaXplOworICAvKiogT25seSBjb2xsZWN0IGNoYXJhY3RlcnMgd2hpY2ggc2F0aXNmeSB0aGlzIGNvbmRpdGlvbi4gKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUb2tlbkNoYXIoaW50IGNocikgewogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICBmaW5hbCBpbnQgZW5kT2Zmc2V0ID0gY29ycmVjdE9mZnNldChvZmZzZXQgKyBidWZmZXJFbmQgLSBidWZmZXJTdGFydCk7CisgIHB1YmxpYyBmaW5hbCB2b2lkIGVuZCgpIHsKKyAgICBhc3NlcnQgYnVmZmVyU3RhcnQgPD0gYnVmZmVyRW5kOworICAgIGludCBlbmRPZmZzZXQgPSBvZmZzZXQ7CisgICAgZm9yIChpbnQgaSA9IGJ1ZmZlclN0YXJ0OyBpIDwgYnVmZmVyRW5kOyArK2kpIHsKKyAgICAgIGVuZE9mZnNldCArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGJ1ZmZlcltpXSk7CisgICAgfQorICAgIGVuZE9mZnNldCA9IGNvcnJlY3RPZmZzZXQoZW5kT2Zmc2V0KTsKICAgICBvZmZzZXRBdHQuc2V0T2Zmc2V0KGVuZE9mZnNldCwgZW5kT2Zmc2V0KTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBzdXBlci5yZXNldCgpOwogICAgIGJ1ZmZlclN0YXJ0ID0gYnVmZmVyRW5kID0gYnVmZmVyLmxlbmd0aDsKKyAgICBsYXN0Tm9uVG9rZW5DaGFyID0gbGFzdENoZWNrZWRDaGFyID0gYnVmZmVyU3RhcnQgLSAxOwogICAgIG9mZnNldCA9IDA7CiAgICAgZ3JhbVNpemUgPSBtaW5HcmFtOwogICAgIGV4aGF1c3RlZCA9IGZhbHNlOworICAgIGNoYXJCdWZmZXIucmVzZXQoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyLmphdmEKaW5kZXggNWRhYzYwZi4uMzExYzg1MCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlci5qYXZhCkBAIC0zNSwxMiArMzUsMjYgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlciBleHRlbmRzIFRva2VuRmlsdGVyIHsKLSAgcHJpdmF0ZSBmaW5hbCBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIgc3RlbW1lciA9IG5ldyBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIoKTsKKyAgcHJpdmF0ZSBmaW5hbCBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIgc3RlbW1lcjsKICAgcHJpdmF0ZSBmaW5hbCBDaGFyVGVybUF0dHJpYnV0ZSB0ZXJtQXR0ID0gYWRkQXR0cmlidXRlKENoYXJUZXJtQXR0cmlidXRlLmNsYXNzKTsKICAgcHJpdmF0ZSBmaW5hbCBLZXl3b3JkQXR0cmlidXRlIGtleXdvcmRBdHRyID0gYWRkQXR0cmlidXRlKEtleXdvcmRBdHRyaWJ1dGUuY2xhc3MpOwotCisgIAorICAvKiogCisgICAqIENhbGxzIHtAbGluayAjTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyKFRva2VuU3RyZWFtLCBpbnQpIAorICAgKiBOb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXIoaW5wdXQsIEJPS01BQUwpfQorICAgKi8KICAgcHVibGljIE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgIHRoaXMoaW5wdXQsIE5vcndlZ2lhbkxpZ2h0U3RlbW1lci5CT0tNQUFMKTsKKyAgfQorICAKKyAgLyoqIAorICAgKiBDcmVhdGVzIGEgbmV3IE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcgorICAgKiBAcGFyYW0gZmxhZ3Mgc2V0IHRvIHtAbGluayBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIjQk9LTUFBTH0sIAorICAgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIjTllOT1JTS30sIG9yIGJvdGguCisgICAqLworICBwdWJsaWMgTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyKFRva2VuU3RyZWFtIGlucHV0LCBpbnQgZmxhZ3MpIHsKICAgICBzdXBlcihpbnB1dCk7CisgICAgc3RlbW1lciA9IG5ldyBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIoZmxhZ3MpOwogICB9CiAgIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKaW5kZXggOThhZjk0ZS4uMzQ0NjgyNSAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTIzLDYgKzIzLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uby5Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5Ub2tlbkZpbHRlckZhY3Rvcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubm8uTm9yd2VnaWFuTGlnaHRTdGVtbWVyLkJPS01BQUw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbkxpZ2h0U3RlbW1lci5OWU5PUlNLOworCiAvKiogCiAgKiBGYWN0b3J5IGZvciB7QGxpbmsgTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyfS4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KQEAgLTMwLDE1ICszMywyNyBAQAogICogICAmbHQ7YW5hbHl6ZXImZ3Q7CiAgKiAgICAgJmx0O3Rva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLyZndDsKICAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLyZndDsKLSAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLyZndDsKKyAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiIHZhcmlhbnQ9Im5iIi8mZ3Q7CiAgKiAgICZsdDsvYW5hbHl6ZXImZ3Q7CiAgKiAmbHQ7L2ZpZWxkVHlwZSZndDs8L3ByZT4KICAqLwogcHVibGljIGNsYXNzIE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBUb2tlbkZpbHRlckZhY3RvcnkgewogICAKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgZmxhZ3M7CisgIAogICAvKiogQ3JlYXRlcyBhIG5ldyBOb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5ICovCiAgIHB1YmxpYyBOb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5KE1hcDxTdHJpbmcsU3RyaW5nPiBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CisgICAgU3RyaW5nIHZhcmlhbnQgPSBnZXQoYXJncywgInZhcmlhbnQiKTsKKyAgICBpZiAodmFyaWFudCA9PSBudWxsIHx8ICJuYiIuZXF1YWxzKHZhcmlhbnQpKSB7CisgICAgICBmbGFncyA9IEJPS01BQUw7CisgICAgfSBlbHNlIGlmICgibm4iLmVxdWFscyh2YXJpYW50KSkgeworICAgICAgZmxhZ3MgPSBOWU5PUlNLOworICAgIH0gZWxzZSBpZiAoIm5vIi5lcXVhbHModmFyaWFudCkpIHsKKyAgICAgIGZsYWdzID0gQk9LTUFBTCB8IE5ZTk9SU0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdmFyaWFudDogIiArIHZhcmlhbnQpOworICAgIH0KICAgICBpZiAoIWFyZ3MuaXNFbXB0eSgpKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBhcmFtZXRlcnM6ICIgKyBhcmdzKTsKICAgICB9CkBAIC00Niw2ICs2MSw2IEBACiAgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFRva2VuU3RyZWFtIGNyZWF0ZShUb2tlblN0cmVhbSBpbnB1dCkgewotICAgIHJldHVybiBuZXcgTm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyKGlucHV0KTsKKyAgICByZXR1cm4gbmV3IE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcihpbnB1dCwgZmxhZ3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbkxpZ2h0U3RlbW1lci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5MaWdodFN0ZW1tZXIuamF2YQppbmRleCA0OTQyODNlLi5kMThkZTMyIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbkxpZ2h0U3RlbW1lci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTGlnaHRTdGVtbWVyLmphdmEKQEAgLTYyLDUwICs2MiwxMDYgQEAKICAqIGNvcnB1cyB0byB2YWxpZGF0ZSBhZ2FpbnN0IHdoZXJlYXMgdGhlIE5vcndlZ2lhbiBvbmUgaXMgaGFuZCBjcmFmdGVkLgogICovCiBwdWJsaWMgY2xhc3MgTm9yd2VnaWFuTGlnaHRTdGVtbWVyIHsKKyAgLyoqIENvbnN0YW50IHRvIHJlbW92ZSBCb2ttw6VsLXNwZWNpZmljIGVuZGluZ3MgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9LTUFBTCA9IDE7CisgIC8qKiBDb25zdGFudCB0byByZW1vdmUgTnlub3Jzay1zcGVjaWZpYyBlbmRpbmdzICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ZTk9SU0sgPSAyOwogICAKKyAgZmluYWwgYm9vbGVhbiB1c2VCb2ttYWFsOworICBmaW5hbCBib29sZWFuIHVzZU55bm9yc2s7CisgIAorICAvKiogCisgICAqIENyZWF0ZXMgYSBuZXcgTm9yd2VnaWFuTGlnaHRTdGVtbWVyCisgICAqIEBwYXJhbSBmbGFncyBzZXQgdG8ge0BsaW5rICNCT0tNQUFMfSwge0BsaW5rICNOWU5PUlNLfSwgb3IgYm90aC4KKyAgICovCisgIHB1YmxpYyBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIoaW50IGZsYWdzKSB7CisgICAgaWYgKGZsYWdzIDw9IDAgfHwgZmxhZ3MgPiBCT0tNQUFMICsgTllOT1JTSykgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBmbGFncyIpOworICAgIH0KKyAgICB1c2VCb2ttYWFsID0gKGZsYWdzICYgQk9LTUFBTCkgIT0gMDsKKyAgICB1c2VOeW5vcnNrID0gKGZsYWdzICYgTllOT1JTSykgIT0gMDsKKyAgfQorICAgICAgCiAgIHB1YmxpYyBpbnQgc3RlbShjaGFyIHNbXSwgaW50IGxlbikgeyAgIAogICAgIC8vIFJlbW92ZSBwb3Nlc3NpdmUgLXMgKGJpbGVucyAtPiBiaWxlbikgYW5kIGNvbnRpbnVlIGNoZWNraW5nIAogICAgIGlmIChsZW4gPiA0ICYmIHNbbGVuLTFdID09ICdzJykKICAgICAgIGxlbi0tOwogCiAgICAgLy8gUmVtb3ZlIGNvbW1vbiBlbmRpbmdzLCBzaW5nbGUtcGFzcwotICAgIGlmIChsZW4gPiA3ICYmIAotICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiaGV0ZXIiKSB8fCAgLy8gZ2VuZXJhbCBlbmRpbmcgKGhlbW1lbGlnLWhldGVyIC0+IGhlbW1lbGlnKQotICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAiaGV0ZW4iKSkpICAgLy8gZ2VuZXJhbCBlbmRpbmcgKGhlbW1lbGlnLWhldGVuIC0+IGhlbW1lbGlnKQorICAgIGlmIChsZW4gPiA3ICYmCisgICAgICAgICgoZW5kc1dpdGgocywgbGVuLCAiaGV0ZXIiKSAmJgorICAgICAgICAgIHVzZUJva21hYWwpIHx8ICAvLyBnZW5lcmFsIGVuZGluZyAoaGVtbWVsaWctaGV0ZXIgLT4gaGVtbWVsaWcpCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiaGV0ZW4iKSAmJgorICAgICAgICAgIHVzZUJva21hYWwpIHx8ICAvLyBnZW5lcmFsIGVuZGluZyAoaGVtbWVsaWctaGV0ZW4gLT4gaGVtbWVsaWcpCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiaGVpdGEiKSAmJgorICAgICAgICAgIHVzZU55bm9yc2spKSkgICAvLyBnZW5lcmFsIGVuZGluZyAoaGVtbWVsZWctaGVpdGEgLT4gaGVtbWVsZWcpCiAgICAgICByZXR1cm4gbGVuIC0gNTsKKyAgICAKKyAgICAvLyBSZW1vdmUgTnlub3JzayBjb21tb24gZW5kaW5ncywgc2luZ2xlLXBhc3MKKyAgICBpZiAobGVuID4gOCAmJiB1c2VOeW5vcnNrICYmCisgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJoZWl0ZXIiKSB8fCAgLy8gZ2VuZXJhbCBlbmRpbmcgKGhlbW1lbGVnLWhlaXRlciAtPiBoZW1tZWxlZykKKyAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImxlaWtlbiIpIHx8ICAvLyBnZW5lcmFsIGVuZGluZyAodHJ5Z2ctbGVpa2VuIC0+IHRyeWdnKQorICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAibGVpa2FyIikpKSAgIC8vIGdlbmVyYWwgZW5kaW5nICh0cnlnZy1sZWlrYXIgLT4gdHJ5Z2cpCisgICAgICByZXR1cm4gbGVuIC0gNjsKIAogICAgIGlmIChsZW4gPiA1ICYmCi0gICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJkb20iKSB8fCAvLyBnZW5lcmFsIGVuZGluZyAoa3Jpc3Rlbi1kb20gLT4ga3Jpc3RlbikKLSAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImhldCIpKSkgIC8vIGdlbmVyYWwgZW5kaW5nIChoZW1tZWxpZy1oZXQgLT4gaGVtbWVsaWcpCisgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJkb20iKSB8fCAgLy8gZ2VuZXJhbCBlbmRpbmcgKGtyaXN0ZW4tZG9tIC0+IGtyaXN0ZW4pCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiaGV0IikgJiYKKyAgICAgICAgICB1c2VCb2ttYWFsKSkpICAgICAgICAgICAgICAvLyBnZW5lcmFsIGVuZGluZyAoaGVtbWVsaWctaGV0IC0+IGhlbW1lbGlnKQogICAgICAgcmV0dXJuIGxlbiAtIDM7CiAgICAgCisgICAgaWYgKGxlbiA+IDYgJiYgdXNlTnlub3JzayAmJgorICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiaGVpdCIpIHx8ICAvLyBnZW5lcmFsIGVuZGluZyAoaGVtbWVsZWctaGVpdCAtPiBoZW1tZWxlZykKKyAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgInNlbWQiKSB8fCAgLy8gZ2VuZXJhbCBlbmRpbmcgKHZlcmstc2VtZCAtPiB2ZXJrKQorICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAibGVpayIpKSkgICAvLyBnZW5lcmFsIGVuZGluZyAodHJ5Z2ctbGVpayAtPiB0cnlnZykKKyAgICAgIHJldHVybiBsZW4gLSA0OworICAgIAogICAgIGlmIChsZW4gPiA3ICYmIAogICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiZWxzZXIiKSB8fCAgIC8vIGdlbmVyYWwgZW5kaW5nIChmw7hsLWVsc2VyIC0+IGbDuGwpCiAgICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbHNlbiIpKSkgICAgLy8gZ2VuZXJhbCBlbmRpbmcgKGbDuGwtZWxzZW4gLT4gZsO4bCkKICAgICAgIHJldHVybiBsZW4gLSA1OwogICAgIAogICAgIGlmIChsZW4gPiA2ICYmCi0gICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJlbmRlIikgfHwgIC8vIChzb3YtZW5kZSAtPiBzb3YpCisgICAgICAgICgoZW5kc1dpdGgocywgbGVuLCAiZW5kZSIpICYmCisgICAgICAgICAgdXNlQm9rbWFhbCkgfHwgICAgICAvLyAoc292LWVuZGUgLT4gc292KQorICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImFuZGUiKSAmJgorICAgICAgICAgIHVzZU55bm9yc2spIHx8ICAgICAgLy8gKHNvdi1hbmRlIC0+IHNvdikKICAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImVsc2UiKSB8fCAgLy8gZ2VuZXJhbCBlbmRpbmcgKGbDuGwtZWxzZSAtPiBmw7hsKQotICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAiZXN0ZSIpIHx8ICAvLyBhZGogKGZpbi1lc3RlIC0+IGZpbikKLSAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImVyZW4iKSkpICAgLy8gbWFzYworICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImVzdGUiKSAmJgorICAgICAgICAgIHVzZUJva21hYWwpIHx8ICAgICAgLy8gYWRqIChmaW4tZXN0ZSAtPiBmaW4pCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiYXN0ZSIpICYmCisgICAgICAgICAgdXNlTnlub3JzaykgfHwgICAgICAvLyBhZGogKGZpbi1hc3RlIC0+IGZpbikKKyAgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJlcmVuIikgJiYKKyAgICAgICAgICB1c2VCb2ttYWFsKSB8fCAgICAgIC8vIG1hc2MKKyAgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJhcmVuIikgJiYKKyAgICAgICAgICB1c2VOeW5vcnNrKSkpICAgICAgIC8vIG1hc2MgCiAgICAgICByZXR1cm4gbGVuIC0gNDsKICAgICAKICAgICBpZiAobGVuID4gNSAmJgotICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiZXJlIikgfHwgLy8gYWRqIChmaW4tZXJlIC0+IGZpbikKLSAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImVzdCIpIHx8IC8vIGFkaiAoZmluLWVzdCAtPiBmaW4pCi0gICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbmUiKSAgICAvLyBtYXNjL2ZlbS9uZXV0ciBwbCBkZWZpbml0ZSAoaHVzLWVuZSkKLSAgICAgICAgICkpIAorICAgICAgICAoKGVuZHNXaXRoKHMsIGxlbiwgImVyZSIpICYmCisgICAgICAgICB1c2VCb2ttYWFsKSB8fCAgICAgLy8gYWRqIChmaW4tZXJlIC0+IGZpbikKKyAgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJhcmUiKSAmJgorICAgICAgICAgIHVzZU55bm9yc2spIHx8ICAgIC8vIGFkaiAoZmluLWFyZSAtPiBmaW4pCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiZXN0IikgJiYKKyAgICAgICAgICB1c2VCb2ttYWFsKSB8fCAgICAvLyBhZGogKGZpbi1lc3QgLT4gZmluKQorICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImFzdCIpICYmCisgICAgICAgICAgdXNlTnlub3JzaykgfHwgICAgLy8gYWRqIChmaW4tYXN0IC0+IGZpbikKKyAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImVuZSIpIHx8IC8vIG1hc2MvZmVtL25ldXRyIHBsIGRlZmluaXRlIChodXMtZW5lKQorICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImFuZSIpICYmCisgICAgICAgICAgdXNlTnlub3JzaykpKSAgICAgLy8gbWFzYyBwbCBkZWZpbml0ZSAoZ3V0LWFuZSkKICAgICAgIHJldHVybiBsZW4gLSAzOwogICAgIAogICAgIGlmIChsZW4gPiA0ICYmCiAgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJlciIpIHx8ICAvLyBtYXNjL2ZlbSBpbmRlZmluaXRlCiAgICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbiIpIHx8ICAvLyBtYXNjL2ZlbSBkZWZpbml0ZQogICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAiZXQiKSB8fCAgLy8gbmV1dHIgZGVmaW5pdGUKLSAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgInN0IikgfHwgIC8vIGFkaiAoYmlsbGlnLXN0IC0+IGJpbGxpZykKKyAgICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJhciIpICYmCisgICAgICAgICAgdXNlTnlub3JzaykgfHwgICAgLy8gbWFzYyBwbCBpbmRlZmluaXRlCisgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAic3QiKSAmJgorICAgICAgICAgIHVzZUJva21hYWwpIHx8ICAgIC8vIGFkaiAoYmlsbGlnLXN0IC0+IGJpbGxpZykKICAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgInRlIikpKQogICAgICAgcmV0dXJuIGxlbiAtIDI7Ci0gICAgCisKICAgICBpZiAobGVuID4gMykKICAgICAgIHN3aXRjaChzW2xlbi0xXSkgewogICAgICAgICBjYXNlICdhJzogICAgIC8vIGZlbSBkZWZpbml0ZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlci5qYXZhCmluZGV4IGYwNmNhMGYuLjlkNGZjZmIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyLmphdmEKQEAgLTM1LDEyICszNSwyNiBAQAogICogPC9wPgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIgZXh0ZW5kcyBUb2tlbkZpbHRlciB7Ci0gIHByaXZhdGUgZmluYWwgTm9yd2VnaWFuTWluaW1hbFN0ZW1tZXIgc3RlbW1lciA9IG5ldyBOb3J3ZWdpYW5NaW5pbWFsU3RlbW1lcigpOworICBwcml2YXRlIGZpbmFsIE5vcndlZ2lhbk1pbmltYWxTdGVtbWVyIHN0ZW1tZXI7CiAgIHByaXZhdGUgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IGFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CiAgIHByaXZhdGUgZmluYWwgS2V5d29yZEF0dHJpYnV0ZSBrZXl3b3JkQXR0ciA9IGFkZEF0dHJpYnV0ZShLZXl3b3JkQXR0cmlidXRlLmNsYXNzKTsKIAorICAvKiogCisgICAqIENhbGxzIHtAbGluayAjTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIoVG9rZW5TdHJlYW0sIGludCkgCisgICAqIE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyKGlucHV0LCBCT0tNQUFMKX0KKyAgICovCiAgIHB1YmxpYyBOb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgIHRoaXMoaW5wdXQsIE5vcndlZ2lhbkxpZ2h0U3RlbW1lci5CT0tNQUFMKTsKKyAgfQorICAKKyAgLyoqIAorICAgKiBDcmVhdGVzIGEgbmV3IE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcgorICAgKiBAcGFyYW0gZmxhZ3Mgc2V0IHRvIHtAbGluayBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIjQk9LTUFBTH0sIAorICAgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBOb3J3ZWdpYW5MaWdodFN0ZW1tZXIjTllOT1JTS30sIG9yIGJvdGguCisgICAqLworICBwdWJsaWMgTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIoVG9rZW5TdHJlYW0gaW5wdXQsIGludCBmbGFncykgewogICAgIHN1cGVyKGlucHV0KTsKKyAgICB0aGlzLnN0ZW1tZXIgPSBuZXcgTm9yd2VnaWFuTWluaW1hbFN0ZW1tZXIoZmxhZ3MpOwogICB9CiAgIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeS5qYXZhCmluZGV4IGViMmY4ZTEuLjE0YTA2YTcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkuamF2YQpAQCAtMjMsNiArMjMsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5GaWx0ZXJGYWN0b3J5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbkxpZ2h0U3RlbW1lci5CT0tNQUFMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uby5Ob3J3ZWdpYW5MaWdodFN0ZW1tZXIuTllOT1JTSzsKKwogLyoqIAogICogRmFjdG9yeSBmb3Ige0BsaW5rIE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyfS4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KQEAgLTMwLDE1ICszMywyNyBAQAogICogICAmbHQ7YW5hbHl6ZXImZ3Q7CiAgKiAgICAgJmx0O3Rva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLyZndDsKICAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLyZndDsKLSAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvJmd0OworICogICAgICZsdDtmaWx0ZXIgY2xhc3M9InNvbHIuTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5IiB2YXJpYW50PSJuYiIvJmd0OwogICogICAmbHQ7L2FuYWx5emVyJmd0OwogICogJmx0Oy9maWVsZFR5cGUmZ3Q7PC9wcmU+CiAgKi8KIHB1YmxpYyBjbGFzcyBOb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBUb2tlbkZpbHRlckZhY3RvcnkgewogICAKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgZmxhZ3M7CisgIAogICAvKiogQ3JlYXRlcyBhIG5ldyBOb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkgKi8KICAgcHVibGljIE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeShNYXA8U3RyaW5nLFN0cmluZz4gYXJncykgewogICAgIHN1cGVyKGFyZ3MpOworICAgIFN0cmluZyB2YXJpYW50ID0gZ2V0KGFyZ3MsICJ2YXJpYW50Iik7CisgICAgaWYgKHZhcmlhbnQgPT0gbnVsbCB8fCAibmIiLmVxdWFscyh2YXJpYW50KSkgeworICAgICAgZmxhZ3MgPSBCT0tNQUFMOworICAgIH0gZWxzZSBpZiAoIm5uIi5lcXVhbHModmFyaWFudCkpIHsKKyAgICAgIGZsYWdzID0gTllOT1JTSzsKKyAgICB9IGVsc2UgaWYgKCJubyIuZXF1YWxzKHZhcmlhbnQpKSB7CisgICAgICBmbGFncyA9IEJPS01BQUwgfCBOWU5PUlNLOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHZhcmlhbnQ6ICIgKyB2YXJpYW50KTsKKyAgICB9CiAgICAgaWYgKCFhcmdzLmlzRW1wdHkoKSkgewogICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwYXJhbWV0ZXJzOiAiICsgYXJncyk7CiAgICAgfQpAQCAtNDYsNiArNjEsNiBAQAogICAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUb2tlblN0cmVhbSBjcmVhdGUoVG9rZW5TdHJlYW0gaW5wdXQpIHsKLSAgICByZXR1cm4gbmV3IE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyKGlucHV0KTsKKyAgICByZXR1cm4gbmV3IE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyKGlucHV0LCBmbGFncyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTWluaW1hbFN0ZW1tZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vTm9yd2VnaWFuTWluaW1hbFN0ZW1tZXIuamF2YQppbmRleCAwM2NlNTdiLi5iYzA4NTQ4IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL05vcndlZ2lhbk1pbmltYWxTdGVtbWVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9Ob3J3ZWdpYW5NaW5pbWFsU3RlbW1lci5qYXZhCkBAIC01MywzMSArNTMsNTIgQEAKICAqLwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuU3RlbW1lclV0aWwuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubm8uTm9yd2VnaWFuTGlnaHRTdGVtbWVyLkJPS01BQUw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbkxpZ2h0U3RlbW1lci5OWU5PUlNLOwogCiAvKioKLSAqIE1pbmltYWwgU3RlbW1lciBmb3IgTm9yd2VnaWFuIGJva23DpWwgKG5vLW5iKQorICogTWluaW1hbCBTdGVtbWVyIGZvciBOb3J3ZWdpYW4gQm9rbcOlbCAobm8tbmIpIGFuZCBOeW5vcnNrIChuby1ubikKICAqIDxwPgogICogU3RlbXMga25vd24gcGx1cmFsIGZvcm1zIGZvciBOb3J3ZWdpYW4gbm91bnMgb25seSwgdG9nZXRoZXIgd2l0aCBnZW5pdGl2IC1zCiAgKi8KIHB1YmxpYyBjbGFzcyBOb3J3ZWdpYW5NaW5pbWFsU3RlbW1lciB7CisgIGZpbmFsIGJvb2xlYW4gdXNlQm9rbWFhbDsKKyAgZmluYWwgYm9vbGVhbiB1c2VOeW5vcnNrOwogICAKLSAgcHVibGljIGludCBzdGVtKGNoYXIgc1tdLCBpbnQgbGVuKSB7ICAgICAgIAorICAvKiogCisgICAqIENyZWF0ZXMgYSBuZXcgTm9yd2VnaWFuTWluaW1hbFN0ZW1tZXIKKyAgICogQHBhcmFtIGZsYWdzIHNldCB0byB7QGxpbmsgTm9yd2VnaWFuTGlnaHRTdGVtbWVyI0JPS01BQUx9LCAKKyAgICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgTm9yd2VnaWFuTGlnaHRTdGVtbWVyI05ZTk9SU0t9LCBvciBib3RoLgorICAgKi8KKyAgcHVibGljIE5vcndlZ2lhbk1pbmltYWxTdGVtbWVyKGludCBmbGFncykgeworICAgIGlmIChmbGFncyA8PSAwIHx8IGZsYWdzID4gQk9LTUFBTCArIE5ZTk9SU0spIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZmxhZ3MiKTsKKyAgICB9CisgICAgdXNlQm9rbWFhbCA9IChmbGFncyAmIEJPS01BQUwpICE9IDA7CisgICAgdXNlTnlub3JzayA9IChmbGFncyAmIE5ZTk9SU0spICE9IDA7CisgIH0KKworICBwdWJsaWMgaW50IHN0ZW0oY2hhciBzW10sIGludCBsZW4pIHsgCiAgICAgLy8gUmVtb3ZlIGdlbml0aXYgcwogICAgIGlmIChsZW4gPiA0ICYmIHNbbGVuLTFdID09ICdzJykKICAgICAgIGxlbi0tOwogICAgIAogICAgIGlmIChsZW4gPiA1ICYmCi0gICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbmUiKSAgICAvLyBtYXNjL2ZlbS9uZXV0ciBwbCBkZWZpbml0ZSAoaHVzLWVuZSkKLSAgICAgICAgKQorICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImVuZSIpIHx8ICAvLyBtYXNjL2ZlbS9uZXV0ciBwbCBkZWZpbml0ZSAoaHVzLWVuZSkKKyAgICAgICAgICAoZW5kc1dpdGgocywgbGVuLCAiYW5lIikgJiYKKyAgICAgICAgICAgdXNlTnlub3JzayAgICAgICAgICAgICAgICAgLy8gbWFzYyBwbCBkZWZpbml0ZSAoZ3V0LWFuZSkKKyAgICAgICAgKSkpCiAgICAgICByZXR1cm4gbGVuIC0gMzsKLSAgICAKKwogICAgIGlmIChsZW4gPiA0ICYmCi0gICAgICAgIChlbmRzV2l0aChzLCBsZW4sICJlciIpIHx8ICAvLyBtYXNjL2ZlbSBpbmRlZmluaXRlCi0gICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbiIpIHx8ICAvLyBtYXNjL2ZlbSBkZWZpbml0ZQotICAgICAgICAgZW5kc1dpdGgocywgbGVuLCAiZXQiKSAgICAgLy8gbmV1dHIgZGVmaW5pdGUKLSAgICAgICAgKSkKKyAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImVyIikgfHwgICAvLyBtYXNjL2ZlbSBpbmRlZmluaXRlCisgICAgICAgICBlbmRzV2l0aChzLCBsZW4sICJlbiIpIHx8ICAgLy8gbWFzYy9mZW0gZGVmaW5pdGUKKyAgICAgICAgIGVuZHNXaXRoKHMsIGxlbiwgImV0IikgfHwgICAvLyBuZXV0ciBkZWZpbml0ZQorICAgICAgICAgKGVuZHNXaXRoKHMsIGxlbiwgImFyIikgJiYKKyAgICAgICAgICB1c2VOeW5vcnNrICAgICAgICAgICAgICAgICAvLyBtYXNjIHBsIGluZGVmaW5pdGUKKyAgICAgICAgKSkpCiAgICAgICByZXR1cm4gbGVuIC0gMjsKLSAgICAKKwogICAgIGlmIChsZW4gPiAzKQogICAgICAgc3dpdGNoKHNbbGVuLTFdKSB7CiAgICAgICAgIGNhc2UgJ2EnOiAgICAgLy8gZmVtIGRlZmluaXRlCmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL3RyL1R1cmtpc2hMb3dlckNhc2VGaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdHIvVHVya2lzaExvd2VyQ2FzZUZpbHRlci5qYXZhCmluZGV4IGUyNmIzNjMuLjM1NzhiZGYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdHIvVHVya2lzaExvd2VyQ2FzZUZpbHRlci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdHIvVHVya2lzaExvd2VyQ2FzZUZpbHRlci5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICBmaW5hbCBjaGFyW10gYnVmZmVyID0gdGVybUF0dC5idWZmZXIoKTsKICAgICAgIGludCBsZW5ndGggPSB0ZXJtQXR0Lmxlbmd0aCgpOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7Ci0gICAgICAgIGZpbmFsIGludCBjaCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWZmZXIsIGkpOworICAgICAgICBmaW5hbCBpbnQgY2ggPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmZmVyLCBpLCBsZW5ndGgpOwogICAgIAogICAgICAgICBpT3JBZnRlciA9IChjaCA9PSBMQVRJTl9DQVBJVEFMX0xFVFRFUl9JIHx8IAogICAgICAgICAgICAgKGlPckFmdGVyICYmIENoYXJhY3Rlci5nZXRUeXBlKGNoKSA9PSBDaGFyYWN0ZXIuTk9OX1NQQUNJTkdfTUFSSykpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAqLwogICBwcml2YXRlIGJvb2xlYW4gaXNCZWZvcmVEb3QoY2hhciBzW10sIGludCBwb3MsIGludCBsZW4pIHsKICAgICBmb3IgKGludCBpID0gcG9zOyBpIDwgbGVuOykgewotICAgICAgZmluYWwgaW50IGNoID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KHMsIGkpOworICAgICAgZmluYWwgaW50IGNoID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KHMsIGksIGxlbik7CiAgICAgICBpZiAoQ2hhcmFjdGVyLmdldFR5cGUoY2gpICE9IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICBpZiAoY2ggPT0gQ09NQklOSU5HX0RPVF9BQk9WRSkKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdXRpbC9DaGFyQXJyYXlNYXAuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdXRpbC9DaGFyQXJyYXlNYXAuamF2YQppbmRleCA4ZTc1OWZhLi40NDJiZjkyIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL3V0aWwvQ2hhckFycmF5TWFwLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL0NoYXJBcnJheU1hcC5qYXZhCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICBpZiAoaWdub3JlQ2FzZSkgewogICAgICAgZm9yKGludCBpPTA7aTxsZW47KSB7CiAgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnRBdCA9IGNoYXJVdGlscy5jb2RlUG9pbnRBdCh0ZXh0MSwgb2ZmK2ksIGxpbWl0KTsKLSAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjb2RlUG9pbnRBdCkgIT0gY2hhclV0aWxzLmNvZGVQb2ludEF0KHRleHQyLCBpKSkKKyAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjb2RlUG9pbnRBdCkgIT0gY2hhclV0aWxzLmNvZGVQb2ludEF0KHRleHQyLCBpLCB0ZXh0Mi5sZW5ndGgpKQogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaSArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGNvZGVQb2ludEF0KTsgCiAgICAgICB9CkBAIC0yODIsNyArMjgyLDcgQEAKICAgICBpZiAoaWdub3JlQ2FzZSkgewogICAgICAgZm9yKGludCBpPTA7aTxsZW47KSB7CiAgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnRBdCA9IGNoYXJVdGlscy5jb2RlUG9pbnRBdCh0ZXh0MSwgaSk7Ci0gICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY29kZVBvaW50QXQpICE9IGNoYXJVdGlscy5jb2RlUG9pbnRBdCh0ZXh0MiwgaSkpCisgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY29kZVBvaW50QXQpICE9IGNoYXJVdGlscy5jb2RlUG9pbnRBdCh0ZXh0MiwgaSwgdGV4dDIubGVuZ3RoKSkKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGkgKz0gQ2hhcmFjdGVyLmNoYXJDb3VudChjb2RlUG9pbnRBdCk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL3V0aWwvQ2hhclRva2VuaXplci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL0NoYXJUb2tlbml6ZXIuamF2YQppbmRleCA0ZDc2OTNkLi4zOGI2ZTYyIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL3V0aWwvQ2hhclRva2VuaXplci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdXRpbC9DaGFyVG9rZW5pemVyLmphdmEKQEAgLTEwMCw3ICsxMDAsOCBAQAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoYnVmZmVySW5kZXggPj0gZGF0YUxlbikgewogICAgICAgICBvZmZzZXQgKz0gZGF0YUxlbjsKLSAgICAgICAgaWYoIWNoYXJVdGlscy5maWxsKGlvQnVmZmVyLCBpbnB1dCkpIHsgLy8gcmVhZCBzdXBwbGVtZW50YXJ5IGNoYXIgYXdhcmUgd2l0aCBDaGFyYWN0ZXJVdGlscworICAgICAgICBjaGFyVXRpbHMuZmlsbChpb0J1ZmZlciwgaW5wdXQpOyAvLyByZWFkIHN1cHBsZW1lbnRhcnkgY2hhciBhd2FyZSB3aXRoIENoYXJhY3RlclV0aWxzCisgICAgICAgIGlmIChpb0J1ZmZlci5nZXRMZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgZGF0YUxlbiA9IDA7IC8vIHNvIG5leHQgb2Zmc2V0ICs9IGRhdGFMZW4gd29uJ3QgZGVjcmVtZW50IG9mZnNldAogICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTExMyw3ICsxMTQsNyBAQAogICAgICAgICBidWZmZXJJbmRleCA9IDA7CiAgICAgICB9CiAgICAgICAvLyB1c2UgQ2hhcmFjdGVyVXRpbHMgaGVyZSB0byBzdXBwb3J0IDwgMy4xIFVURi0xNiBjb2RlIHVuaXQgYmVoYXZpb3IgaWYgdGhlIGNoYXIgYmFzZWQgbWV0aG9kcyBhcmUgZ29uZQotICAgICAgZmluYWwgaW50IGMgPSBjaGFyVXRpbHMuY29kZVBvaW50QXQoaW9CdWZmZXIuZ2V0QnVmZmVyKCksIGJ1ZmZlckluZGV4KTsKKyAgICAgIGZpbmFsIGludCBjID0gY2hhclV0aWxzLmNvZGVQb2ludEF0KGlvQnVmZmVyLmdldEJ1ZmZlcigpLCBidWZmZXJJbmRleCwgaW9CdWZmZXIuZ2V0TGVuZ3RoKCkpOwogICAgICAgZmluYWwgaW50IGNoYXJDb3VudCA9IENoYXJhY3Rlci5jaGFyQ291bnQoYyk7CiAgICAgICBidWZmZXJJbmRleCArPSBjaGFyQ291bnQ7CiAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdXRpbC9DaGFyYWN0ZXJVdGlscy5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL0NoYXJhY3RlclV0aWxzLmphdmEKaW5kZXggM2E4NjRiMy4uN2MzZWM0ZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL0NoYXJhY3RlclV0aWxzLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL0NoYXJhY3RlclV0aWxzLmphdmEKQEAgLTUyLDI3ICs1Miw2IEBACiAgIH0KIAogICAvKioKLSAgICogUmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gaW5kZXggb2YgdGhlIGNoYXIgYXJyYXkuCi0gICAqIERlcGVuZGluZyBvbiB0aGUge0BsaW5rIFZlcnNpb259IHBhc3NlZCB0bwotICAgKiB7QGxpbmsgQ2hhcmFjdGVyVXRpbHMjZ2V0SW5zdGFuY2UoVmVyc2lvbil9IHRoaXMgbWV0aG9kIG1pbWljcyB0aGUgYmVoYXZpb3IKLSAgICogb2Yge0BsaW5rIENoYXJhY3RlciNjb2RlUG9pbnRBdChjaGFyW10sIGludCl9IGFzIGl0IHdvdWxkIGhhdmUgYmVlbgotICAgKiBhdmFpbGFibGUgb24gYSBKYXZhIDEuNCBKVk0gb3Igb24gYSBsYXRlciB2aXJ0dWFsIG1hY2hpbmUgdmVyc2lvbi4KLSAgICogCi0gICAqIEBwYXJhbSBjaGFycwotICAgKiAgICAgICAgICBhIGNoYXJhY3RlciBhcnJheQotICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAqICAgICAgICAgIHRoZSBvZmZzZXQgdG8gdGhlIGNoYXIgdmFsdWVzIGluIHRoZSBjaGFycyBhcnJheSB0byBiZSBjb252ZXJ0ZWQKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gaW5kZXgKLSAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgKiAgICAgICAgICAgLSBpZiB0aGUgYXJyYXkgaXMgbnVsbC4KLSAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAtIGlmIHRoZSB2YWx1ZSBvZmZzZXQgaXMgbmVnYXRpdmUgb3Igbm90IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mCi0gICAqICAgICAgICAgICB0aGUgY2hhciBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29kZVBvaW50QXQoZmluYWwgY2hhcltdIGNoYXJzLCBmaW5hbCBpbnQgb2Zmc2V0KTsKLQotICAvKioKICAgICogUmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gaW5kZXggb2YgdGhlIHtAbGluayBDaGFyU2VxdWVuY2V9LgogICAgKiBEZXBlbmRpbmcgb24gdGhlIHtAbGluayBWZXJzaW9ufSBwYXNzZWQgdG8KICAgICoge0BsaW5rIENoYXJhY3RlclV0aWxzI2dldEluc3RhbmNlKFZlcnNpb24pfSB0aGlzIG1ldGhvZCBtaW1pY3MgdGhlIGJlaGF2aW9yCkBAIC0xMTYsNyArOTUsMTAgQEAKICAgICogICAgICAgICAgIHRoZSBjaGFyIGFycmF5LgogICAgKi8KICAgcHVibGljIGFic3RyYWN0IGludCBjb2RlUG9pbnRBdChmaW5hbCBjaGFyW10gY2hhcnMsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsaW1pdCk7Ci0gIAorCisgIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIDxjb2RlPnNlcTwvY29kZT4uICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29kZVBvaW50Q291bnQoQ2hhclNlcXVlbmNlIHNlcSk7CisKICAgLyoqCiAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENoYXJhY3RlckJ1ZmZlcn0gYW5kIGFsbG9jYXRlcyBhIDxjb2RlPmNoYXJbXTwvY29kZT4KICAgICogb2YgdGhlIGdpdmVuIGJ1ZmZlclNpemUuCkBAIC0xNDAsNTQgKzEyMiwxMDggQEAKICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0IGF0CiAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbWF4IGNoYXIgaW4gdGhlIGJ1ZmZlciB0byBsb3dlciBjYXNlCiAgICAqLwotICBwdWJsaWMgdm9pZCB0b0xvd2VyQ2FzZShmaW5hbCBjaGFyW10gYnVmZmVyLCBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGltaXQpIHsKKyAgcHVibGljIGZpbmFsIHZvaWQgdG9Mb3dlckNhc2UoZmluYWwgY2hhcltdIGJ1ZmZlciwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxpbWl0KSB7CiAgICAgYXNzZXJ0IGJ1ZmZlci5sZW5ndGggPj0gbGltaXQ7CiAgICAgYXNzZXJ0IG9mZnNldCA8PTAgJiYgb2Zmc2V0IDw9IGJ1ZmZlci5sZW5ndGg7CiAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxpbWl0OykgewogICAgICAgaSArPSBDaGFyYWN0ZXIudG9DaGFycygKICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKAotICAgICAgICAgICAgICAgICAgY29kZVBvaW50QXQoYnVmZmVyLCBpKSksIGJ1ZmZlciwgaSk7CisgICAgICAgICAgICAgICAgICBjb2RlUG9pbnRBdChidWZmZXIsIGksIGxpbWl0KSksIGJ1ZmZlciwgaSk7CiAgICAgIH0KICAgfQotICAKKworICAvKiogQ29udmVydHMgYSBzZXF1ZW5jZSBvZiBKYXZhIGNoYXJhY3RlcnMgdG8gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNvZGUgcG9pbnRzLgorICAgKiAgQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHdyaXR0ZW4gdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworICBwdWJsaWMgZmluYWwgaW50IHRvQ29kZVBvaW50cyhjaGFyW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgc3JjTGVuLCBpbnRbXSBkZXN0LCBpbnQgZGVzdE9mZikgeworICAgIGlmIChzcmNMZW4gPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzcmNMZW4gbXVzdCBiZSA+PSAwIik7CisgICAgfQorICAgIGludCBjb2RlUG9pbnRDb3VudCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNMZW47ICkgeworICAgICAgZmluYWwgaW50IGNwID0gY29kZVBvaW50QXQoc3JjLCBzcmNPZmYgKyBpLCBzcmNPZmYgKyBzcmNMZW4pOworICAgICAgZmluYWwgaW50IGNoYXJDb3VudCA9IENoYXJhY3Rlci5jaGFyQ291bnQoY3ApOworICAgICAgZGVzdFtkZXN0T2ZmICsgY29kZVBvaW50Q291bnQrK10gPSBjcDsKKyAgICAgIGkgKz0gY2hhckNvdW50OworICAgIH0KKyAgICByZXR1cm4gY29kZVBvaW50Q291bnQ7CisgIH0KKworICAvKiogQ29udmVydHMgYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHRvIGEgc2VxdWVuY2Ugb2YgSmF2YSBjaGFyYWN0ZXJzLgorICAgKiAgQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4gdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworICBwdWJsaWMgZmluYWwgaW50IHRvQ2hhcnMoaW50W10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgc3JjTGVuLCBjaGFyW10gZGVzdCwgaW50IGRlc3RPZmYpIHsKKyAgICBpZiAoc3JjTGVuIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3JjTGVuIG11c3QgYmUgPj0gMCIpOworICAgIH0KKyAgICBpbnQgd3JpdHRlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNMZW47ICsraSkgeworICAgICAgd3JpdHRlbiArPSBDaGFyYWN0ZXIudG9DaGFycyhzcmNbc3JjT2ZmICsgaV0sIGRlc3QsIGRlc3RPZmYgKyB3cml0dGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXR0ZW47CisgIH0KKwogICAvKioKICAgICogRmlsbHMgdGhlIHtAbGluayBDaGFyYWN0ZXJCdWZmZXJ9IHdpdGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGdpdmVuCi0gICAqIHJlYWRlciB7QGxpbmsgUmVhZGVyfS4gVGhpcyBtZXRob2QgdHJpZXMgdG8gcmVhZCBhcyBtYW55IGNoYXJhY3RlcnMgaW50bwotICAgKiB0aGUge0BsaW5rIENoYXJhY3RlckJ1ZmZlcn0gYXMgcG9zc2libGUsIGVhY2ggY2FsbCB0byBmaWxsIHdpbGwgc3RhcnQKLSAgICogZmlsbGluZyB0aGUgYnVmZmVyIGZyb20gb2Zmc2V0IDxjb2RlPjA8L2NvZGU+IHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNpemUKLSAgICogb2YgdGhlIGludGVybmFsIGNoYXJhY3RlciBhcnJheS4KKyAgICogcmVhZGVyIHtAbGluayBSZWFkZXJ9LiBUaGlzIG1ldGhvZCB0cmllcyB0byByZWFkIDxjb2RlPm51bUNoYXJzPC9jb2RlPgorICAgKiBjaGFyYWN0ZXJzIGludG8gdGhlIHtAbGluayBDaGFyYWN0ZXJCdWZmZXJ9LCBlYWNoIGNhbGwgdG8gZmlsbCB3aWxsIHN0YXJ0CisgICAqIGZpbGxpbmcgdGhlIGJ1ZmZlciBmcm9tIG9mZnNldCA8Y29kZT4wPC9jb2RlPiB1cCB0byA8Y29kZT5udW1DaGFyczwvY29kZT4uCisgICAqIEluIGNhc2UgY29kZSBwb2ludHMgY2FuIHNwYW4gYWNyb3NzIDIgamF2YSBjaGFyYWN0ZXJzLCB0aGlzIG1ldGhvZCBtYXkKKyAgICogb25seSBmaWxsIDxjb2RlPm51bUNoYXJzIC0gMTwvY29kZT4gY2hhcmFjdGVycyBpbiBvcmRlciBub3QgdG8gc3BsaXQgaW4KKyAgICogdGhlIG1pZGRsZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLCBldmVuIGlmIHRoZXJlIGFyZSByZW1haW5pbmcgY2hhcmFjdGVycyBpbgorICAgKiB0aGUge0BsaW5rIFJlYWRlcn0uCiAgICAqIDxwPgogICAgKiBEZXBlbmRpbmcgb24gdGhlIHtAbGluayBWZXJzaW9ufSBwYXNzZWQgdG8KICAgICoge0BsaW5rIENoYXJhY3RlclV0aWxzI2dldEluc3RhbmNlKFZlcnNpb24pfSB0aGlzIG1ldGhvZCBpbXBsZW1lbnRzCiAgICAqIHN1cHBsZW1lbnRhcnkgY2hhcmFjdGVyIGF3YXJlbmVzcyB3aGVuIGZpbGxpbmcgdGhlIGdpdmVuIGJ1ZmZlci4gRm9yIGFsbAotICAgKiB7QGxpbmsgVmVyc2lvbn0gJmd0OyAzLjAge0BsaW5rICNmaWxsKENoYXJhY3RlckJ1ZmZlciwgUmVhZGVyKX0gZ3VhcmFudGVlcworICAgKiB7QGxpbmsgVmVyc2lvbn0gJmd0OyAzLjAge0BsaW5rICNmaWxsKENoYXJhY3RlckJ1ZmZlciwgUmVhZGVyLCBpbnQpfSBndWFyYW50ZWVzCiAgICAqIHRoYXQgdGhlIGdpdmVuIHtAbGluayBDaGFyYWN0ZXJCdWZmZXJ9IHdpbGwgbmV2ZXIgY29udGFpbiBhIGhpZ2ggc3Vycm9nYXRlCiAgICAqIGNoYXJhY3RlciBhcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBidWZmZXIgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IGF2YWlsYWJsZQogICAgKiBjaGFyYWN0ZXIgaW4gdGhlIHJlYWRlci4gSW4gb3RoZXIgd29yZHMsIGhpZ2ggYW5kIGxvdyBzdXJyb2dhdGUgcGFpcnMgd2lsbAogICAgKiBhbHdheXMgYmUgcHJlc2VydmVkIGFjcm9zcyBidWZmZXIgYm9hcmRlcnMuCiAgICAqIDwvcD4KKyAgICogPHA+CisgICAqIEEgcmV0dXJuIHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiBtZWFucyB0aGF0IHRoaXMgbWV0aG9kIGNhbGwgZXhoYXVzdGVkCisgICAqIHRoZSByZWFkZXIsIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSBieXRlcyB3aGljaCBoYXZlIGJlZW4gcmVhZCwgd2hpY2ggY2FuIGJlCisgICAqIHZlcmlmaWVkIGJ5IGNoZWNraW5nIHdoZXRoZXIgPGNvZGU+YnVmZmVyLmdldExlbmd0aCgpICZndDsgMDwvY29kZT4uCisgICAqIDwvcD4KICAgICogCiAgICAqIEBwYXJhbSBidWZmZXIKICAgICogICAgICAgICAgdGhlIGJ1ZmZlciB0byBmaWxsLgogICAgKiBAcGFyYW0gcmVhZGVyCiAgICAqICAgICAgICAgIHRoZSByZWFkZXIgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20uCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgbm8gbW9yZSBjaGFyYWN0ZXJzIGFyZSBhdmFpbGFibGUKLSAgICogICAgICAgICBpbiB0aGUgcmVhZGVyLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgKiBAcGFyYW0gbnVtQ2hhcnMKKyAgICogICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFycyB0byByZWFkCisgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHJlYWRlci5yZWFkIHJldHVybmVkIC0xIHdoaWxlIHRyeWluZyB0byBmaWxsIHRoZSBidWZmZXIKICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgKiAgICAgICAgICAgaWYgdGhlIHJlYWRlciB0aHJvd3MgYW4ge0BsaW5rIElPRXhjZXB0aW9ufS4KICAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZpbGwoQ2hhcmFjdGVyQnVmZmVyIGJ1ZmZlciwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBmaWxsKENoYXJhY3RlckJ1ZmZlciBidWZmZXIsIFJlYWRlciByZWFkZXIsIGludCBudW1DaGFycykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKiBDb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY2FsbHMgPGNvZGU+ZmlsbChidWZmZXIsIHJlYWRlciwgYnVmZmVyLmJ1ZmZlci5sZW5ndGgpPC9jb2RlPi4gKi8KKyAgcHVibGljIGZpbmFsIGJvb2xlYW4gZmlsbChDaGFyYWN0ZXJCdWZmZXIgYnVmZmVyLCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBmaWxsKGJ1ZmZlciwgcmVhZGVyLCBidWZmZXIuYnVmZmVyLmxlbmd0aCk7CisgIH0KKworICAvKiogUmV0dXJuIHRoZSBpbmRleCB3aXRoaW4gPGNvZGU+YnVmW3N0YXJ0OnN0YXJ0K2NvdW50XTwvY29kZT4gd2hpY2ggaXMgYnkgPGNvZGU+b2Zmc2V0PC9jb2RlPgorICAgKiAgY29kZSBwb2ludHMgZnJvbSA8Y29kZT5pbmRleDwvY29kZT4uICovCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgb2Zmc2V0QnlDb2RlUG9pbnRzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgaW5kZXgsIGludCBvZmZzZXQpOworCisgIHN0YXRpYyBpbnQgcmVhZEZ1bGx5KFJlYWRlciByZWFkZXIsIGNoYXJbXSBkZXN0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCByZWFkID0gMDsKKyAgICB3aGlsZSAocmVhZCA8IGxlbikgeworICAgICAgZmluYWwgaW50IHIgPSByZWFkZXIucmVhZChkZXN0LCBvZmZzZXQgKyByZWFkLCBsZW4gLSByZWFkKTsKKyAgICAgIGlmIChyID09IC0xKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVhZCArPSByOworICAgIH0KKyAgICByZXR1cm4gcmVhZDsKKyAgfQogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEphdmE1Q2hhcmFjdGVyVXRpbHMgZXh0ZW5kcyBDaGFyYWN0ZXJVdGlscyB7CiAgICAgSmF2YTVDaGFyYWN0ZXJVdGlscygpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvZGVQb2ludEF0KGZpbmFsIGNoYXJbXSBjaGFycywgZmluYWwgaW50IG9mZnNldCkgewotICAgICAgcmV0dXJuIENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaGFycywgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvZGVQb2ludEF0KGZpbmFsIENoYXJTZXF1ZW5jZSBzZXEsIGZpbmFsIGludCBvZmZzZXQpIHsKICAgICAgIHJldHVybiBDaGFyYWN0ZXIuY29kZVBvaW50QXQoc2VxLCBvZmZzZXQpOwogICAgIH0KQEAgLTE5OCw3ICsyMzQsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBmaWxsKGZpbmFsIENoYXJhY3RlckJ1ZmZlciBidWZmZXIsIGZpbmFsIFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gZmlsbChmaW5hbCBDaGFyYWN0ZXJCdWZmZXIgYnVmZmVyLCBmaW5hbCBSZWFkZXIgcmVhZGVyLCBpbnQgbnVtQ2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBhc3NlcnQgYnVmZmVyLmJ1ZmZlci5sZW5ndGggPj0gMjsKKyAgICAgIGlmIChudW1DaGFycyA8IDIgfHwgbnVtQ2hhcnMgPiBidWZmZXIuYnVmZmVyLmxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudW1DaGFycyBtdXN0IGJlID49IDIgYW5kIDw9IHRoZSBidWZmZXIgc2l6ZSIpOworICAgICAgfQogICAgICAgZmluYWwgY2hhcltdIGNoYXJCdWZmZXIgPSBidWZmZXIuYnVmZmVyOwogICAgICAgYnVmZmVyLm9mZnNldCA9IDA7CiAgICAgICBmaW5hbCBpbnQgb2Zmc2V0OwpAQCAtMjA2LDQ3ICsyNDYsMzYgQEAKICAgICAgIC8vIEluc3RhbGwgdGhlIHByZXZpb3VzbHkgc2F2ZWQgZW5kaW5nIGhpZ2ggc3Vycm9nYXRlOgogICAgICAgaWYgKGJ1ZmZlci5sYXN0VHJhaWxpbmdIaWdoU3Vycm9nYXRlICE9IDApIHsKICAgICAgICAgY2hhckJ1ZmZlclswXSA9IGJ1ZmZlci5sYXN0VHJhaWxpbmdIaWdoU3Vycm9nYXRlOworICAgICAgICBidWZmZXIubGFzdFRyYWlsaW5nSGlnaFN1cnJvZ2F0ZSA9IDA7CiAgICAgICAgIG9mZnNldCA9IDE7CiAgICAgICB9IGVsc2UgewogICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgfQogCi0gICAgICBmaW5hbCBpbnQgcmVhZCA9IHJlYWRlci5yZWFkKGNoYXJCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpOwotICAgICAgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICAgICAgYnVmZmVyLmxlbmd0aCA9IG9mZnNldDsKLSAgICAgICAgYnVmZmVyLmxhc3RUcmFpbGluZ0hpZ2hTdXJyb2dhdGUgPSAwOwotICAgICAgICByZXR1cm4gb2Zmc2V0ICE9IDA7Ci0gICAgICB9Ci0gICAgICBhc3NlcnQgcmVhZCA+IDA7Ci0gICAgICBidWZmZXIubGVuZ3RoID0gcmVhZCArIG9mZnNldDsKKyAgICAgIGZpbmFsIGludCByZWFkID0gcmVhZEZ1bGx5KHJlYWRlciwgY2hhckJ1ZmZlciwgb2Zmc2V0LCBudW1DaGFycyAtIG9mZnNldCk7CiAKLSAgICAgIC8vIElmIHdlIHJlYWQgb25seSBhIHNpbmdsZSBjaGFyLCBhbmQgdGhhdCBjaGFyIHdhcyBhCi0gICAgICAvLyBoaWdoIHN1cnJvZ2F0ZSwgcmVhZCBhZ2FpbjoKLSAgICAgIGlmIChidWZmZXIubGVuZ3RoID09IDEKLSAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKGNoYXJCdWZmZXJbYnVmZmVyLmxlbmd0aCAtIDFdKSkgewotICAgICAgICBmaW5hbCBpbnQgcmVhZDIgPSByZWFkZXIucmVhZChjaGFyQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQnVmZmVyLmxlbmd0aCAtIDEpOwotICAgICAgICBpZiAocmVhZDIgPT0gLTEpIHsKLSAgICAgICAgICAvLyBOT1RFOiBtYWwtZm9ybWVkIGlucHV0IChlbmRlZCBvbiBhIGhpZ2gKLSAgICAgICAgICAvLyBzdXJyb2dhdGUpISAgQ29uc3VtZXIgbXVzdCBkZWFsIHdpdGggaXQuLi4KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQgcmVhZDIgPiAwOwotCi0gICAgICAgIGJ1ZmZlci5sZW5ndGggKz0gcmVhZDI7CisgICAgICBidWZmZXIubGVuZ3RoID0gb2Zmc2V0ICsgcmVhZDsKKyAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gYnVmZmVyLmxlbmd0aCA9PSBudW1DaGFyczsKKyAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgbnVtQ2hhcnMpIHsKKyAgICAgICAgLy8gV2UgZmFpbGVkIHRvIGZpbGwgdGhlIGJ1ZmZlci4gRXZlbiBpZiB0aGUgbGFzdCBjaGFyIGlzIGEgaGlnaAorICAgICAgICAvLyBzdXJyb2dhdGUsIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAKLSAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMQotICAgICAgICAgICYmIENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoY2hhckJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV0pKSB7CisgICAgICBpZiAoQ2hhcmFjdGVyLmlzSGlnaFN1cnJvZ2F0ZShjaGFyQnVmZmVyW2J1ZmZlci5sZW5ndGggLSAxXSkpIHsKICAgICAgICAgYnVmZmVyLmxhc3RUcmFpbGluZ0hpZ2hTdXJyb2dhdGUgPSBjaGFyQnVmZmVyWy0tYnVmZmVyLmxlbmd0aF07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXIubGFzdFRyYWlsaW5nSGlnaFN1cnJvZ2F0ZSA9IDA7CiAgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotICAgICAgcmV0dXJuIHRydWU7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb2RlUG9pbnRDb3VudChDaGFyU2VxdWVuY2Ugc2VxKSB7CisgICAgICByZXR1cm4gQ2hhcmFjdGVyLmNvZGVQb2ludENvdW50KHNlcSwgMCwgc2VxLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGluZGV4LCBpbnQgb2Zmc2V0KSB7CisgICAgICByZXR1cm4gQ2hhcmFjdGVyLm9mZnNldEJ5Q29kZVBvaW50cyhidWYsIHN0YXJ0LCBjb3VudCwgaW5kZXgsIG9mZnNldCk7CiAgICAgfQogICB9CiAKQEAgLTI1NSwxMSArMjg0LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvZGVQb2ludEF0KGZpbmFsIGNoYXJbXSBjaGFycywgZmluYWwgaW50IG9mZnNldCkgewotICAgICAgcmV0dXJuIGNoYXJzW29mZnNldF07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBjb2RlUG9pbnRBdChmaW5hbCBDaGFyU2VxdWVuY2Ugc2VxLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CiAgICAgICByZXR1cm4gc2VxLmNoYXJBdChvZmZzZXQpOwogICAgIH0KQEAgLTI3MiwxMyArMjk2LDMxIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZmlsbChmaW5hbCBDaGFyYWN0ZXJCdWZmZXIgYnVmZmVyLCBmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGZpbGwoQ2hhcmFjdGVyQnVmZmVyIGJ1ZmZlciwgUmVhZGVyIHJlYWRlciwgaW50IG51bUNoYXJzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgYXNzZXJ0IGJ1ZmZlci5idWZmZXIubGVuZ3RoID49IDE7CisgICAgICBpZiAobnVtQ2hhcnMgPCAxIHx8IG51bUNoYXJzID4gYnVmZmVyLmJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVtQ2hhcnMgbXVzdCBiZSA+PSAxIGFuZCA8PSB0aGUgYnVmZmVyIHNpemUiKTsKKyAgICAgIH0KICAgICAgIGJ1ZmZlci5vZmZzZXQgPSAwOwotICAgICAgZmluYWwgaW50IHJlYWQgPSByZWFkZXIucmVhZChidWZmZXIuYnVmZmVyKTsKLSAgICAgIGlmKHJlYWQgPT0gLTEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGZpbmFsIGludCByZWFkID0gcmVhZEZ1bGx5KHJlYWRlciwgYnVmZmVyLmJ1ZmZlciwgMCwgbnVtQ2hhcnMpOwogICAgICAgYnVmZmVyLmxlbmd0aCA9IHJlYWQ7Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJ1ZmZlci5sYXN0VHJhaWxpbmdIaWdoU3Vycm9nYXRlID0gMDsKKyAgICAgIHJldHVybiByZWFkID09IG51bUNoYXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29kZVBvaW50Q291bnQoQ2hhclNlcXVlbmNlIHNlcSkgeworICAgICAgcmV0dXJuIHNlcS5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGluZGV4LCBpbnQgb2Zmc2V0KSB7CisgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gaW5kZXggKyBvZmZzZXQ7CisgICAgICBpZiAocmVzdWx0IDwgMCB8fCByZXN1bHQgPiBjb3VudCkgeworICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5GaWx0ZXJGYWN0b3J5IGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5GaWx0ZXJGYWN0b3J5CmluZGV4IDM0OTdlMzAuLmEwMWI0NWYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLlRva2VuRmlsdGVyRmFjdG9yeQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5Ub2tlbkZpbHRlckZhY3RvcnkKQEAgLTY2LDYgKzY2LDggQEAKIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm1pc2NlbGxhbmVvdXMuU3RlbW1lck92ZXJyaWRlRmlsdGVyRmFjdG9yeQogb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91cy5UcmltRmlsdGVyRmFjdG9yeQogb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91cy5Xb3JkRGVsaW1pdGVyRmlsdGVyRmFjdG9yeQorb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91cy5TY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeQorb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubWlzY2VsbGFuZW91cy5TY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeQogb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubmdyYW0uRWRnZU5HcmFtRmlsdGVyRmFjdG9yeQogb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubmdyYW0uTkdyYW1GaWx0ZXJGYWN0b3J5CiBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uby5Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2NvcmUvVGVzdEFuYWx5emVycy5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9jb3JlL1Rlc3RBbmFseXplcnMuamF2YQppbmRleCBjZTUwMjk3Li4wMTEyZGRlIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2NvcmUvVGVzdEFuYWx5emVycy5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvY29yZS9UZXN0QW5hbHl6ZXJzLmphdmEKQEAgLTE3MCw4ICsxNzAsNiBAQAogICAgIGNoYXJbXSB0ZXJtQnVmZmVyID0gZmlsdGVyLmdldEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcykuYnVmZmVyKCk7CiAgICAgaW50IGxlbmd0aCA9IGhpZ2hTdXJFbmRpbmdMb3dlci5sZW5ndGgoKTsKICAgICBhc3NlcnRFcXVhbHMoJ1x1ZDgwMScsIHRlcm1CdWZmZXJbbGVuZ3RoIC0gMV0pOwotICAgIGFzc2VydEVxdWFscygnXHVkYzNlJywgdGVybUJ1ZmZlcltsZW5ndGhdKTsKLSAgICAKICAgfQogICAKICAgcHVibGljIHZvaWQgdGVzdExvd2VyQ2FzZVRva2VuaXplcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2h1bnNwZWxsL0h1bnNwZWxsRGljdGlvbmFyeVRlc3QuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvSHVuc3BlbGxEaWN0aW9uYXJ5VGVzdC5qYXZhCmluZGV4IGMwYjIwN2QuLmZkOGY5MjEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvSHVuc3BlbGxEaWN0aW9uYXJ5VGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvSHVuc3BlbGxEaWN0aW9uYXJ5VGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC0xMzEsMTIgKzEzMywzMCBAQAogICAgIGFzc2VydEVxdWFscygzLCBkaWN0aW9uYXJ5Lmxvb2t1cFN1ZmZpeChuZXcgY2hhcltdeydlJ30sIDAsIDEpLnNpemUoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEsIGRpY3Rpb25hcnkubG9va3VwUHJlZml4KG5ldyBjaGFyW117J3MnfSwgMCwgMSkuc2l6ZSgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgZGljdGlvbmFyeS5sb29rdXBXb3JkKG5ldyBjaGFyW117J28nLCAnbCcsICdyJ30sIDAsIDMpLnNpemUoKSk7Ci0gICAgCisgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZmxhZ3MgZm9yIGx1Y2VuIiwgMSwgZGljdGlvbmFyeS5sb29rdXBXb3JkKG5ldyBjaGFyW117J2wnLCAndScsICdjJywgJ2UnLCAnbid9LCAwLCA1KS5nZXQoMCkuZ2V0RmxhZ3MoKS5sZW5ndGgpOworCiAgICAgYWZmaXhTdHJlYW0uY2xvc2UoKTsKICAgICBkaWN0U3RyZWFtLmNsb3NlKCk7CiAgIH0KIAogICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SHVuc3BlbGxEaWN0aW9uYXJ5X211bHRpcGxlRGljdFdpdGhPdmVycmlkZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgIElucHV0U3RyZWFtIGFmZml4U3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0LmFmZiIpOworICAgIExpc3Q8SW5wdXRTdHJlYW0+IGRpY3RTdHJlYW1zID0gbmV3IEFycmF5TGlzdDxJbnB1dFN0cmVhbT4oKTsKKyAgICBkaWN0U3RyZWFtcy5hZGQoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0LmRpYyIpKTsKKyAgICBkaWN0U3RyZWFtcy5hZGQoZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0T3ZlcnJpZGUuZGljIikpOworCisgICAgSHVuc3BlbGxEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBuZXcgSHVuc3BlbGxEaWN0aW9uYXJ5KGFmZml4U3RyZWFtLCBkaWN0U3RyZWFtcywgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGZhbHNlKTsKKyAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBmbGFncyBmb3IgbHVjZW4iLCAzLCBkaWN0aW9uYXJ5Lmxvb2t1cFdvcmQobmV3IGNoYXJbXXsnbCcsICd1JywgJ2MnLCAnZScsICduJ30sIDAsIDUpLmdldCgwKS5nZXRGbGFncygpLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZmxhZ3MgZm9yIGJhciIsIDEsIGRpY3Rpb25hcnkubG9va3VwV29yZChuZXcgY2hhcltdeydiJywgJ2EnLCAncid9LCAwLCAzKS5nZXQoMCkuZ2V0RmxhZ3MoKS5sZW5ndGgpOworCisgICAgYWZmaXhTdHJlYW0uY2xvc2UoKTsKKyAgICBmb3IoSW5wdXRTdHJlYW0gZHN0cmVhbSA6IGRpY3RTdHJlYW1zKSB7CisgICAgICBkc3RyZWFtLmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWRIdW5zcGVsbERpY3Rpb25hcnlfbG9hZERpY0FmZigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewogICAgIElucHV0U3RyZWFtIGFmZml4U3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0Q29tcHJlc3NlZC5hZmYiKTsKICAgICBJbnB1dFN0cmVhbSBkaWN0U3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJ0ZXN0Q29tcHJlc3NlZC5kaWMiKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvSHVuc3BlbGxTdGVtbWVyVGVzdC5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC9IdW5zcGVsbFN0ZW1tZXJUZXN0LmphdmEKaW5kZXggODJhOWI4NC4uNjZhOTQxMCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC9IdW5zcGVsbFN0ZW1tZXJUZXN0LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC9IdW5zcGVsbFN0ZW1tZXJUZXN0LmphdmEKQEAgLTk0LDE3ICs5NCwyMSBAQAogICAgIGFzc2VydEVxdWFscygxLCBzdGVtcy5zaXplKCkpOwogICAgIGFzc2VydEVxdWFscygiZm9vIiwgc3RlbXMuZ2V0KDApLmdldFN0ZW1TdHJpbmcoKSk7CiAgICAgCi0gICAgc3RlbXMgPSBzdGVtbWVyLnN0ZW0oImZvb2QiKTsKKyAgICBzdGVtcyA9IHN0ZW1tZXIuc3RlbSgibW9vZCIpOwogICAgIGFzc2VydEVxdWFscygxLCBzdGVtcy5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgc3RlbXMuZ2V0KDApLmdldFN0ZW1TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtb28iLCBzdGVtcy5nZXQoMCkuZ2V0U3RlbVN0cmluZygpKTsKICAgICAKICAgICBzdGVtcyA9IHN0ZW1tZXIuc3RlbSgiRm9vcyIpOwogICAgIGFzc2VydEVxdWFscygxLCBzdGVtcy5zaXplKCkpOwogICAgIGFzc2VydEVxdWFscygiZm9vIiwgc3RlbXMuZ2V0KDApLmdldFN0ZW1TdHJpbmcoKSk7Ci0gICAgCisKKyAgICAvLyBUaGUgIkZvbyIgcnVsZSBnZXRzIG92ZXJyaWRkZW4gYnkgdGhlICJmb28iIHJ1bGUsIGFuZCB3ZSBkb24ndCBtZXJnZQogICAgIHN0ZW1zID0gc3RlbW1lci5zdGVtKCJGb29kIik7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHN0ZW1zLnNpemUoKSk7CisKKyAgICBzdGVtcyA9IHN0ZW1tZXIuc3RlbSgiTW9vZCIpOwogICAgIGFzc2VydEVxdWFscygxLCBzdGVtcy5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgc3RlbXMuZ2V0KDApLmdldFN0ZW1TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtb28iLCBzdGVtcy5nZXQoMCkuZ2V0U3RlbVN0cmluZygpKTsKICAgfQogCiAgIEBUZXN0CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2h1bnNwZWxsL3Rlc3QuZGljIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC90ZXN0LmRpYwppbmRleCAxYTlkYzA3Li4xMmVmZDhmIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2h1bnNwZWxsL3Rlc3QuZGljCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvdGVzdC5kaWMKQEAgLTEsOSArMSwxMCBAQAotNgorOQogbHVjZW4vQQogbHVjZW5lCiBtYWhvdXQvQQogb2xyL0IKIGFiL0MKIEFwYWNoL0EKK0Zvby9FCiBmb28vRAotRm9vL0UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitNb28vRQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvdGVzdE92ZXJyaWRlLmRpYyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaHVuc3BlbGwvdGVzdE92ZXJyaWRlLmRpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTExMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9odW5zcGVsbC90ZXN0T3ZlcnJpZGUuZGljCkBAIC0wLDAgKzEsMyBAQAorMgorbHVjZW4vQUJDCitiYXIvQQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1Rlc3RTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyYWM1OAotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm1pc2NlbGxhbmVvdXM7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQmFzZVRva2VuU3RyZWFtVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuTW9ja1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY29yZS5LZXl3b3JkVG9rZW5pemVyOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlciBleHRlbmRzIEJhc2VUb2tlblN0cmVhbVRlc3RDYXNlIHsKKworCisgIHByaXZhdGUgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgQW5hbHl6ZXIoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRva2VuU3RyZWFtQ29tcG9uZW50cyBjcmVhdGVDb21wb25lbnRzKFN0cmluZyBmaWVsZCwgUmVhZGVyIHJlYWRlcikgeworICAgICAgZmluYWwgVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgICBmaW5hbCBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgU2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlcih0b2tlbml6ZXIpOworICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbUNvbXBvbmVudHModG9rZW5pemVyLCBzdHJlYW0pOworICAgIH0KKyAgfTsKKworICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhZcOkYWVlZWEiLCAiYWFhZWVhIik7IC8vIHNob3VsZCBub3QgY2F1c2UgQXJyYXlPdXRPZkJvdW5kc0V4Y2VwdGlvbgorCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYWXDpGFlZWVhZSIsICJhYWFlZWEiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhZWFlZWVhZSIsICJhYWVlYSIpOworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYsO4ZW4iLCAiYm9lbiIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOlZW5lIiwgImFlbmUiKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYmzDpWLDpnJzeWx0ZXTDuGoiLCAiYmxhYmFyc3lsdGV0b2oiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJibGFhYmFhcnN5bHRldG9laiIsICJibGFiYXJzeWx0ZXRvaiIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImJsw6Viw6Ryc3lsdGV0w7ZqIiwgImJsYWJhcnN5bHRldG9qIik7CisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyYWtzbW9yZ2FzIiwgInJha3Ntb3JnYXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyw6Rrc23DtnJnw6VzIiwgInJha3Ntb3JnYXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyw6Zrc23DuHJnw6VzIiwgInJha3Ntb3JnYXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyYWVrc21vZXJnYWFzIiwgInJha3Ntb3JnYXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyw6Zrc23DtnJnYW9zIiwgInJha3Ntb3JnYXMiKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYWIiLCAiYWIiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJvYiIsICJvYiIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFiIiwgIkFiIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiT2IiLCAiT2IiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOlIiwgImEiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImFhIiwgImEiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhQSIsICJhIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYW8iLCAiYSIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImFPIiwgImEiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFBIiwgIkEiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJBYSIsICJBIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiQW8iLCAiQSIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFPIiwgIkEiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOmIiwgImEiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICLDpCIsICJhIik7CisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICLDhiIsICJBIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw4QiLCAiQSIpOworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYWUiLCAiYSIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImFFIiwgImEiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFlIiwgIkEiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJBRSIsICJBIik7CisKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsO2IiwgIm8iKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICLDuCIsICJvIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw5YiLCAiTyIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOYIiwgIk8iKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAib28iLCAibyIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIm9lIiwgIm8iKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJvTyIsICJvIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAib0UiLCAibyIpOworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiT28iLCAiTyIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIk9lIiwgIk8iKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJPTyIsICJPIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiT0UiLCAiTyIpOworICB9CisgIAorICAvKiogY2hlY2sgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGRvZXNuJ3QgY2F1c2UgaXNzdWVzICovCisgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBbmFseXplciBhID0gbmV3IEFuYWx5emVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgVG9rZW5TdHJlYW1Db21wb25lbnRzIGNyZWF0ZUNvbXBvbmVudHMoU3RyaW5nIGZpZWxkTmFtZSwgUmVhZGVyIHJlYWRlcikgeworICAgICAgICBUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IEtleXdvcmRUb2tlbml6ZXIocmVhZGVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbUNvbXBvbmVudHModG9rZW5pemVyLCBuZXcgU2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlcih0b2tlbml6ZXIpKTsKKyAgICAgIH0gCisgICAgfTsKKyAgICBjaGVja09uZVRlcm0oYSwgIiIsICIiKTsKKyAgfQorICAKKyAgLyoqIGJsYXN0IHNvbWUgcmFuZG9tIHN0cmluZ3MgdGhyb3VnaCB0aGUgYW5hbHl6ZXIgKi8KKyAgcHVibGljIHZvaWQgdGVzdFJhbmRvbURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBjaGVja1JhbmRvbURhdGEocmFuZG9tKCksIGFuYWx5emVyLCAxMDAwKlJBTkRPTV9NVUxUSVBMSUVSKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1Rlc3RTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1Rlc3RTY2FuZGluYXZpYW5Gb2xkaW5nRmlsdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjNjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFNjYW5kaW5hdmlhbkZvbGRpbmdGaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5taXNjZWxsYW5lb3VzOworCisvKioKKyAqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuQmFzZVRva2VuU3RyZWFtRmFjdG9yeVRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2NhbmRpbmF2aWFuRm9sZGluZ0ZpbHRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVG9rZW5TdHJlYW1GYWN0b3J5VGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RTdGVtbWluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKCJyw6Rrc23DtnJnw6VzIik7CisgICAgVG9rZW5TdHJlYW0gc3RyZWFtID0gbmV3IE1vY2tUb2tlbml6ZXIocmVhZGVyLCBNb2NrVG9rZW5pemVyLldISVRFU1BBQ0UsIGZhbHNlKTsKKyAgICBzdHJlYW0gPSB0b2tlbkZpbHRlckZhY3RvcnkoIlNjYW5kaW5hdmlhbkZvbGRpbmciKS5jcmVhdGUoc3RyZWFtKTsKKyAgICBhc3NlcnRUb2tlblN0cmVhbUNvbnRlbnRzKHN0cmVhbSwgbmV3IFN0cmluZ1tdIHsgInJha3Ntb3JnYXMiIH0pOworICB9CisKKyAgLyoqIFRlc3QgdGhhdCBib2d1cyBhcmd1bWVudHMgcmVzdWx0IGluIGV4Y2VwdGlvbiAqLworICBwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNBcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgdG9rZW5GaWx0ZXJGYWN0b3J5KCJTY2FuZGluYXZpYW5Gb2xkaW5nIiwKKyAgICAgICAgICAiYm9ndXNBcmciLCAiYm9ndXNWYWx1ZSIpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlVua25vd24gcGFyYW1ldGVycyIpKTsKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmYwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5taXNjZWxsYW5lb3VzOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkJhc2VUb2tlblN0cmVhbVRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLk1vY2tUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNvcmUuS2V5d29yZFRva2VuaXplcjsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisKK3B1YmxpYyBjbGFzcyBUZXN0U2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlciBleHRlbmRzIEJhc2VUb2tlblN0cmVhbVRlc3RDYXNlIHsKKworCisgIHByaXZhdGUgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgQW5hbHl6ZXIoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRva2VuU3RyZWFtQ29tcG9uZW50cyBjcmVhdGVDb21wb25lbnRzKFN0cmluZyBmaWVsZCwgUmVhZGVyIHJlYWRlcikgeworICAgICAgZmluYWwgVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgICBmaW5hbCBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlcih0b2tlbml6ZXIpOworICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbUNvbXBvbmVudHModG9rZW5pemVyLCBzdHJlYW0pOworICAgIH0KKyAgfTsKKworICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhZcOkYWVlZWEiLCAiw6bDpsOmZWVhIik7IC8vIHNob3VsZCBub3QgY2F1c2UgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhZcOkYWVlZWFlIiwgIsOmw6bDpmVlw6YiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhZWFlZWVhZSIsICLDpsOmZWXDpiIpOworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYsO4ZW4iLCAiYsO4ZW4iKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJiT0VlbiIsICJiw5hlbiIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOlZW5lIiwgIsOlZW5lIik7CisKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImJsw6Viw6Zyc3lsdGV0w7hqIiwgImJsw6Viw6Zyc3lsdGV0w7hqIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYmxhYWJhZXJzeWx0ZXTDtmoiLCAiYmzDpWLDpnJzeWx0ZXTDuGoiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyw6Rrc23DtnJnw6VzIiwgInLDpmtzbcO4cmfDpXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyYWVrc23DtnJnYW9zIiwgInLDpmtzbcO4cmfDpXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyYWVrc23DtnJnYWFzIiwgInLDpmtzbcO4cmfDpXMiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJyYWVrc21vZXJnw6VzIiwgInLDpmtzbcO4cmfDpXMiKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYWIiLCAiYWIiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJvYiIsICJvYiIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFiIiwgIkFiIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiT2IiLCAiT2IiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOlIiwgIsOlIik7CisKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhYSIsICLDpSIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImFBIiwgIsOlIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYW8iLCAiw6UiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJhTyIsICLDpSIpOworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiQUEiLCAiw4UiKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJBYSIsICLDhSIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFvIiwgIsOFIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiQU8iLCAiw4UiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOmIiwgIsOmIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw6QiLCAiw6YiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOGIiwgIsOGIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw4QiLCAiw4YiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgImFlIiwgIsOmIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiYUUiLCAiw6YiKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIkFlIiwgIsOGIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiQUUiLCAiw4YiKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw7YiLCAiw7giKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICLDuCIsICLDuCIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIsOWIiwgIsOYIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiw5giLCAiw5giKTsKKworCisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAib28iLCAiw7giKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJvZSIsICLDuCIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIm9PIiwgIsO4Iik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAib0UiLCAiw7giKTsKKworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIk9vIiwgIsOYIik7CisgICAgY2hlY2tPbmVUZXJtKGFuYWx5emVyLCAiT2UiLCAiw5giKTsKKyAgICBjaGVja09uZVRlcm0oYW5hbHl6ZXIsICJPTyIsICLDmCIpOworICAgIGNoZWNrT25lVGVybShhbmFseXplciwgIk9FIiwgIsOYIik7CisgIH0KKyAgCisgIC8qKiBjaGVjayB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgZG9lc24ndCBjYXVzZSBpc3N1ZXMgKi8KKyAgcHVibGljIHZvaWQgdGVzdEVtcHR5VGVybSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFuYWx5emVyIGEgPSBuZXcgQW5hbHl6ZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBUb2tlblN0cmVhbUNvbXBvbmVudHMgY3JlYXRlQ29tcG9uZW50cyhTdHJpbmcgZmllbGROYW1lLCBSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIFRva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgS2V5d29yZFRva2VuaXplcihyZWFkZXIpOworICAgICAgICByZXR1cm4gbmV3IFRva2VuU3RyZWFtQ29tcG9uZW50cyh0b2tlbml6ZXIsIG5ldyBTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyKHRva2VuaXplcikpOworICAgICAgfSAKKyAgICB9OworICAgIGNoZWNrT25lVGVybShhLCAiIiwgIiIpOworICB9CisgIAorICAvKiogYmxhc3Qgc29tZSByYW5kb20gc3RyaW5ncyB0aHJvdWdoIHRoZSBhbmFseXplciAqLworICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tRGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGNoZWNrUmFuZG9tRGF0YShyYW5kb20oKSwgYW5hbHl6ZXIsIDEwMDAqUkFORE9NX01VTFRJUExJRVIpOworICB9Cit9CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXJGYWN0b3J5LmphdmEgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb25GaWx0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NDE2YgotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm1pc2NlbGxhbmVvdXM7CisKKy8qKgorICogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLk1vY2tUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5CYXNlVG9rZW5TdHJlYW1GYWN0b3J5VGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworcHVibGljIGNsYXNzIFRlc3RTY2FuZGluYXZpYW5Ob3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeSBleHRlbmRzIEJhc2VUb2tlblN0cmVhbUZhY3RvcnlUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdFN0ZW1taW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoInLDpGtzbcO2cmfDpXMiKTsKKyAgICBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgTW9ja1Rva2VuaXplcihyZWFkZXIsIE1vY2tUb2tlbml6ZXIuV0hJVEVTUEFDRSwgZmFsc2UpOworICAgIHN0cmVhbSA9IHRva2VuRmlsdGVyRmFjdG9yeSgiU2NhbmRpbmF2aWFuTm9ybWFsaXphdGlvbiIpLmNyZWF0ZShzdHJlYW0pOworICAgIGFzc2VydFRva2VuU3RyZWFtQ29udGVudHMoc3RyZWFtLCBuZXcgU3RyaW5nW10geyAicsOma3Ntw7hyZ8OlcyIgfSk7CisgIH0KKworICAvKiogVGVzdCB0aGF0IGJvZ3VzIGFyZ3VtZW50cyByZXN1bHQgaW4gZXhjZXB0aW9uICovCisgIHB1YmxpYyB2b2lkIHRlc3RCb2d1c0FyZ3VtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB0b2tlbkZpbHRlckZhY3RvcnkoIlNjYW5kaW5hdmlhbk5vcm1hbGl6YXRpb24iLAorICAgICAgICAgICJib2d1c0FyZyIsICJib2d1c1ZhbHVlIik7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldE1lc3NhZ2UoKS5jb250YWlucygiVW5rbm93biBwYXJhbWV0ZXJzIikpOworICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U3RlbW1lck92ZXJyaWRlRmlsdGVyLmphdmEgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21pc2NlbGxhbmVvdXMvVGVzdFN0ZW1tZXJPdmVycmlkZUZpbHRlci5qYXZhCmluZGV4IDNlMzQyMzAuLmYzNzM5ZTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbWlzY2VsbGFuZW91cy9UZXN0U3RlbW1lck92ZXJyaWRlRmlsdGVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9taXNjZWxsYW5lb3VzL1Rlc3RTdGVtbWVyT3ZlcnJpZGVGaWx0ZXIuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgY2hhcltdIGNoYXJBcnJheSA9IHJhbmRvbVJlYWxpc3RpY1VuaWNvZGVTdHJpbmcudG9DaGFyQXJyYXkoKTsKICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJBcnJheS5sZW5ndGg7KSB7Ci0gICAgICAgIGludCBjcCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaGFyQXJyYXksIGopOworICAgICAgICBpbnQgY3AgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hhckFycmF5LCBqLCBjaGFyQXJyYXkubGVuZ3RoKTsKICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNwKSkgewogICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kQ29kZVBvaW50KGNwKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9FZGdlTkdyYW1Ub2tlbkZpbHRlclRlc3QuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5GaWx0ZXJUZXN0LmphdmEKaW5kZXggNmIzZDhjNS4uN2FlZWM3MSAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9FZGdlTkdyYW1Ub2tlbkZpbHRlclRlc3QuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL0VkZ2VOR3JhbVRva2VuRmlsdGVyVGVzdC5qYXZhCkBAIC0zMiw4ICszMiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNvcmUuTGV0dGVyVG9rZW5pemVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNvcmUuV2hpdGVzcGFjZVRva2VuaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zaGluZ2xlLlNoaW5nbGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLkNoYXJUZXJtQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5PZmZzZXRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLlBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKIAogLyoqCiAgKiBUZXN0cyB7QGxpbmsgRWRnZU5HcmFtVG9rZW5GaWx0ZXJ9IGZvciBjb3JyZWN0bmVzcy4KQEAgLTE5Miw5ICsxOTQsOSBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEdyYXBocygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgVG9rZW5TdHJlYW0gdGsgPSBuZXcgTGV0dGVyVG9rZW5pemVyKFZlcnNpb24uTFVDRU5FXzQ0LCBuZXcgU3RyaW5nUmVhZGVyKCJhYmMgZCBlZmdoIGlqIGtsbW5vIHAgcSIpKTsKKyAgICBUb2tlblN0cmVhbSB0ayA9IG5ldyBMZXR0ZXJUb2tlbml6ZXIoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBTdHJpbmdSZWFkZXIoImFiYyBkIGVmZ2ggaWoga2xtbm8gcCBxIikpOwogICAgIHRrID0gbmV3IFNoaW5nbGVGaWx0ZXIodGspOwotICAgIHRrID0gbmV3IEVkZ2VOR3JhbVRva2VuRmlsdGVyKFZlcnNpb24uTFVDRU5FXzQ0LCB0aywgNywgMTApOworICAgIHRrID0gbmV3IEVkZ2VOR3JhbVRva2VuRmlsdGVyKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCB0aywgNywgMTApOwogICAgIHRrLnJlc2V0KCk7CiAgICAgYXNzZXJ0VG9rZW5TdHJlYW1Db250ZW50cyh0aywKICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImVmZ2ggaWoiLCAiaWoga2xtbiIsICJpaiBrbG1ubyIsICJrbG1ubyBwIiB9LApAQCAtMjA1LDQgKzIwNywyNSBAQAogICAgICAgICAyMwogICAgICk7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxlbWVudGFyeUNoYXJhY3RlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBzID0gX1Rlc3RVdGlsLnJhbmRvbVVuaWNvZGVTdHJpbmcocmFuZG9tKCksIDEwKTsKKyAgICBmaW5hbCBpbnQgY29kZVBvaW50Q291bnQgPSBzLmNvZGVQb2ludENvdW50KDAsIHMubGVuZ3RoKCkpOworICAgIGZpbmFsIGludCBtaW5HcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDMpOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDEwKTsKKyAgICBUb2tlblN0cmVhbSB0ayA9IG5ldyBLZXl3b3JkVG9rZW5pemVyKG5ldyBTdHJpbmdSZWFkZXIocykpOworICAgIHRrID0gbmV3IEVkZ2VOR3JhbVRva2VuRmlsdGVyKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCB0aywgbWluR3JhbSwgbWF4R3JhbSk7CisgICAgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IHRrLmFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CisgICAgZmluYWwgT2Zmc2V0QXR0cmlidXRlIG9mZnNldEF0dCA9IHRrLmFkZEF0dHJpYnV0ZShPZmZzZXRBdHRyaWJ1dGUuY2xhc3MpOworICAgIHRrLnJlc2V0KCk7CisgICAgZm9yIChpbnQgaSA9IG1pbkdyYW07IGkgPD0gTWF0aC5taW4oY29kZVBvaW50Q291bnQsIG1heEdyYW0pOyArK2kpIHsKKyAgICAgIGFzc2VydFRydWUodGsuaW5jcmVtZW50VG9rZW4oKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgb2Zmc2V0QXR0LnN0YXJ0T2Zmc2V0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHMubGVuZ3RoKCksIG9mZnNldEF0dC5lbmRPZmZzZXQoKSk7CisgICAgICBmaW5hbCBpbnQgZW5kID0gQ2hhcmFjdGVyLm9mZnNldEJ5Q29kZVBvaW50cyhzLCAwLCBpKTsKKyAgICAgIGFzc2VydEVxdWFscyhzLnN1YnN0cmluZygwLCBlbmQpLCB0ZXJtQXR0LnRvU3RyaW5nKCkpOworICAgIH0KKyAgICBhc3NlcnRGYWxzZSh0ay5pbmNyZW1lbnRUb2tlbigpKTsKKyAgfQorCiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL0VkZ2VOR3JhbVRva2VuaXplclRlc3QuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5pemVyVGVzdC5qYXZhCmluZGV4IDRkYjdlZmUuLmJkMmRhNzkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5pemVyVGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vRWRnZU5HcmFtVG9rZW5pemVyVGVzdC5qYXZhCkBAIC0yMSwxNSArMjEsMTUgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5CYXNlVG9rZW5TdHJlYW1UZXN0Q2FzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLkNoYXJUZXJtQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5PZmZzZXRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLlBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuX1Rlc3RVdGlsOwogCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5nZW5lcmF0b3JzLlJhbmRvbVN0cmluZ3M7CisKIC8qKgogICogVGVzdHMge0BsaW5rIEVkZ2VOR3JhbVRva2VuaXplcn0gZm9yIGNvcnJlY3RuZXNzLgogICovCkBAIC0xMjAsMjUgKzEyMCw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TkdyYW1zKGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgaW50IGxlbmd0aCwgZmluYWwgU3RyaW5nIG5vblRva2VuQ2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIHMgPSBSYW5kb21TdHJpbmdzLnJhbmRvbUFzY2lpT2ZMZW5ndGgocmFuZG9tKCksIGxlbmd0aCk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBzLCBub25Ub2tlbkNoYXJzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdE5HcmFtcyhpbnQgbWluR3JhbSwgaW50IG1heEdyYW0sIFN0cmluZyBzLCBTdHJpbmcgbm9uVG9rZW5DaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBOR3JhbVRva2VuaXplclRlc3QudGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBzLCBub25Ub2tlbkNoYXJzLCB0cnVlKTsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RMYXJnZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTdHJpbmcgaW5wdXQgPSBfVGVzdFV0aWwucmFuZG9tU2ltcGxlU3RyaW5nKHJhbmRvbSgpLCAxMDI0ICogNSk7Ci0gICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTAyNCk7Ci0gICAgZmluYWwgaW50IG1heEdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgbWluR3JhbSwgNSAqIDEwMjQpOwotICAgIEVkZ2VOR3JhbVRva2VuaXplciB0ayA9IG5ldyBFZGdlTkdyYW1Ub2tlbml6ZXIoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCBtaW5HcmFtLCBtYXhHcmFtKTsKLSAgICBmaW5hbCBDaGFyVGVybUF0dHJpYnV0ZSBjaGFyVGVybUF0dCA9IHRrLmFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7Ci0gICAgZmluYWwgT2Zmc2V0QXR0cmlidXRlIG9mZnNldEF0dCA9IHRrLmFkZEF0dHJpYnV0ZShPZmZzZXRBdHRyaWJ1dGUuY2xhc3MpOwotICAgIGZpbmFsIFBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlIHBvc0luY0F0dCA9IHRrLmFkZEF0dHJpYnV0ZShQb3NpdGlvbkluY3JlbWVudEF0dHJpYnV0ZS5jbGFzcyk7Ci0gICAgdGsucmVzZXQoKTsKLSAgICBmb3IgKGludCBpID0gbWluR3JhbTsgaSA8PSBtYXhHcmFtICYmIGkgPD0gaW5wdXQubGVuZ3RoKCk7ICsraSkgewotICAgICAgYXNzZXJ0VHJ1ZSh0ay5pbmNyZW1lbnRUb2tlbigpKTsKLSAgICAgIGFzc2VydEVxdWFscygwLCBvZmZzZXRBdHQuc3RhcnRPZmZzZXQoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgb2Zmc2V0QXR0LmVuZE9mZnNldCgpKTsKLSAgICAgIGFzc2VydEVxdWFscygxLCBwb3NJbmNBdHQuZ2V0UG9zaXRpb25JbmNyZW1lbnQoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoaW5wdXQuc3Vic3RyaW5nKDAsIGkpLCBjaGFyVGVybUF0dC50b1N0cmluZygpKTsKKyAgICAvLyB0ZXN0IHNsaWRpbmcKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCAxMDApOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDEwMCk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMyAqIDEwMjQsIDQgKiAxMDI0KSwgIiIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExhcmdlTWF4R3JhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gdGVzdCBzbGlkaW5nIHdpdGggbWF4R3JhbSA+IDEwMjQKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxMjkwLCAxMzAwKTsKKyAgICBmaW5hbCBpbnQgbWF4R3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCBtaW5HcmFtLCAxMzAwKTsKKyAgICB0ZXN0TkdyYW1zKG1pbkdyYW0sIG1heEdyYW0sIF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAzICogMTAyNCwgNCAqIDEwMjQpLCAiIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJlVG9rZW5pemF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCAxMDApOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDEwMCk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMCwgNCAqIDEwMjQpLCAiYSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhlYXZ5UHJlVG9rZW5pemF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCAxMDApOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDEwMCk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMCwgNCAqIDEwMjQpLCAiYWJjZGVmIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmV3VG9rZW5DaGFycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgY2hhcltdIGNocnMgPSBuZXcgY2hhcltfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgNDAwMCwgNTAwMCldOworICAgIEFycmF5cy5maWxsKGNocnMsICcgJyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaHJzLmxlbmd0aDsgKytpKSB7CisgICAgICBpZiAocmFuZG9tKCkubmV4dEZsb2F0KCkgPCAwLjEpIHsKKyAgICAgICAgY2hyc1tpXSA9ICdhJzsKKyAgICAgIH0KICAgICB9Ci0gICAgYXNzZXJ0RmFsc2UodGsuaW5jcmVtZW50VG9rZW4oKSk7Ci0gICAgdGsuZW5kKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGlucHV0Lmxlbmd0aCgpLCBvZmZzZXRBdHQuc3RhcnRPZmZzZXQoKSk7CisgICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMik7CisgICAgZmluYWwgaW50IG1heEdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgbWluR3JhbSwgMik7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBuZXcgU3RyaW5nKGNocnMpLCAiICIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZ1bGxVVEY4UmFuZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGludCBtaW5HcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDEwMCk7CisgICAgZmluYWwgaW50IG1heEdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgbWluR3JhbSwgMTAwKTsKKyAgICBmaW5hbCBTdHJpbmcgcyA9IF9UZXN0VXRpbC5yYW5kb21Vbmljb2RlU3RyaW5nKHJhbmRvbSgpLCA0ICogMTAyNCk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBzLCAiIik7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBzLCAiYWJjZGVmIik7CiAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuRmlsdGVyVGVzdC5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuRmlsdGVyVGVzdC5qYXZhCmluZGV4IDM3ZGIwNWQuLjIwYzE4MjAgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vTkdyYW1Ub2tlbkZpbHRlclRlc3QuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL05HcmFtVG9rZW5GaWx0ZXJUZXN0LmphdmEKQEAgLTI2LDcgKzI2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY29yZS5LZXl3b3JkVG9rZW5pemVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNvcmUuV2hpdGVzcGFjZVRva2VuaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5taXNjZWxsYW5lb3VzLkFTQ0lJRm9sZGluZ0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuQ2hhclRlcm1BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLk9mZnNldEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5fVGVzdFV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwpAQCAtMTc3LDQgKzE4MCwyNyBAQAogICAgICAgICApOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdFN1cHBsZW1lbnRhcnlDaGFyYWN0ZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgcyA9IF9UZXN0VXRpbC5yYW5kb21Vbmljb2RlU3RyaW5nKHJhbmRvbSgpLCAxMCk7CisgICAgZmluYWwgaW50IGNvZGVQb2ludENvdW50ID0gcy5jb2RlUG9pbnRDb3VudCgwLCBzLmxlbmd0aCgpKTsKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCAzKTsKKyAgICBmaW5hbCBpbnQgbWF4R3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCBtaW5HcmFtLCAxMCk7CisgICAgVG9rZW5TdHJlYW0gdGsgPSBuZXcgS2V5d29yZFRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKHMpKTsKKyAgICB0ayA9IG5ldyBOR3JhbVRva2VuRmlsdGVyKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCB0aywgbWluR3JhbSwgbWF4R3JhbSk7CisgICAgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IHRrLmFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CisgICAgZmluYWwgT2Zmc2V0QXR0cmlidXRlIG9mZnNldEF0dCA9IHRrLmFkZEF0dHJpYnV0ZShPZmZzZXRBdHRyaWJ1dGUuY2xhc3MpOworICAgIHRrLnJlc2V0KCk7CisgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IGNvZGVQb2ludENvdW50OyArK3N0YXJ0KSB7CisgICAgICBmb3IgKGludCBlbmQgPSBzdGFydCArIG1pbkdyYW07IGVuZCA8PSBNYXRoLm1pbihjb2RlUG9pbnRDb3VudCwgc3RhcnQgKyBtYXhHcmFtKTsgKytlbmQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0ay5pbmNyZW1lbnRUb2tlbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG9mZnNldEF0dC5zdGFydE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMubGVuZ3RoKCksIG9mZnNldEF0dC5lbmRPZmZzZXQoKSk7CisgICAgICAgIGZpbmFsIGludCBzdGFydEluZGV4ID0gQ2hhcmFjdGVyLm9mZnNldEJ5Q29kZVBvaW50cyhzLCAwLCBzdGFydCk7CisgICAgICAgIGZpbmFsIGludCBlbmRJbmRleCA9IENoYXJhY3Rlci5vZmZzZXRCeUNvZGVQb2ludHMocywgMCwgZW5kKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSwgdGVybUF0dC50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0RmFsc2UodGsuaW5jcmVtZW50VG9rZW4oKSk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuaXplclRlc3QuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbmdyYW0vTkdyYW1Ub2tlbml6ZXJUZXN0LmphdmEKaW5kZXggZjU2ZjQxMy4uMGRiZGVmZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uZ3JhbS9OR3JhbVRva2VuaXplclRlc3QuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25ncmFtL05HcmFtVG9rZW5pemVyVGVzdC5qYXZhCkBAIC0xOCw5ICsxOCwxMiBAQAogICovCiAKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uZ3JhbS5OR3JhbVRva2VuaXplclRlc3QuaXNUb2tlbkNoYXI7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5CYXNlVG9rZW5TdHJlYW1UZXN0Q2FzZTsKQEAgLTExNSwyMyArMTE4LDc0IEBACiAgICAgY2hlY2tSYW5kb21EYXRhKHJhbmRvbSgpLCBhLCA1MCpSQU5ET01fTVVMVElQTElFUiwgMTAyNywgZmFsc2UsIGZhbHNlKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCB0ZXN0TkdyYW1zKGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TkdyYW1zKGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgaW50IGxlbmd0aCwgZmluYWwgU3RyaW5nIG5vblRva2VuQ2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgU3RyaW5nIHMgPSBSYW5kb21TdHJpbmdzLnJhbmRvbUFzY2lpT2ZMZW5ndGgocmFuZG9tKCksIGxlbmd0aCk7Ci0gICAgZmluYWwgVG9rZW5TdHJlYW0gZ3JhbXMgPSBuZXcgTkdyYW1Ub2tlbml6ZXIoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBTdHJpbmdSZWFkZXIocyksIG1pbkdyYW0sIG1heEdyYW0pOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgcywgbm9uVG9rZW5DaGFycyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROR3JhbXMoaW50IG1pbkdyYW0sIGludCBtYXhHcmFtLCBTdHJpbmcgcywgU3RyaW5nIG5vblRva2VuQ2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBzLCBub25Ub2tlbkNoYXJzLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgaW50W10gdG9Db2RlUG9pbnRzKENoYXJTZXF1ZW5jZSBzKSB7CisgICAgZmluYWwgaW50W10gY29kZVBvaW50cyA9IG5ldyBpbnRbQ2hhcmFjdGVyLmNvZGVQb2ludENvdW50KHMsIDAsIHMubGVuZ3RoKCkpXTsKKyAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2opIHsKKyAgICAgIGNvZGVQb2ludHNbal0gPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQocywgaSk7CisgICAgICBpICs9IENoYXJhY3Rlci5jaGFyQ291bnQoY29kZVBvaW50c1tqXSk7CisgICAgfQorICAgIHJldHVybiBjb2RlUG9pbnRzOworICB9CisKKyAgc3RhdGljIGJvb2xlYW4gaXNUb2tlbkNoYXIoU3RyaW5nIG5vblRva2VuQ2hhcnMsIGludCBjb2RlUG9pbnQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblRva2VuQ2hhcnMubGVuZ3RoKCk7ICkgeworICAgICAgZmluYWwgaW50IGNwID0gbm9uVG9rZW5DaGFycy5jb2RlUG9pbnRBdChpKTsKKyAgICAgIGlmIChjcCA9PSBjb2RlUG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaSArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGNwKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0TkdyYW1zKGludCBtaW5HcmFtLCBpbnQgbWF4R3JhbSwgU3RyaW5nIHMsIGZpbmFsIFN0cmluZyBub25Ub2tlbkNoYXJzLCBib29sZWFuIGVkZ2VzT25seSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gY29kZSBwb2ludHMKKyAgICBmaW5hbCBpbnRbXSBjb2RlUG9pbnRzID0gdG9Db2RlUG9pbnRzKHMpOworICAgIGZpbmFsIGludFtdIG9mZnNldHMgPSBuZXcgaW50W2NvZGVQb2ludHMubGVuZ3RoICsgMV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICBvZmZzZXRzW2krMV0gPSBvZmZzZXRzW2ldICsgQ2hhcmFjdGVyLmNoYXJDb3VudChjb2RlUG9pbnRzW2ldKTsKKyAgICB9CisgICAgZmluYWwgVG9rZW5TdHJlYW0gZ3JhbXMgPSBuZXcgTkdyYW1Ub2tlbml6ZXIoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBTdHJpbmdSZWFkZXIocyksIG1pbkdyYW0sIG1heEdyYW0sIGVkZ2VzT25seSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Rva2VuQ2hhcihpbnQgY2hyKSB7CisgICAgICAgIHJldHVybiBub25Ub2tlbkNoYXJzLmluZGV4T2YoY2hyKSA8IDA7CisgICAgICB9CisgICAgfTsKICAgICBmaW5hbCBDaGFyVGVybUF0dHJpYnV0ZSB0ZXJtQXR0ID0gZ3JhbXMuYWRkQXR0cmlidXRlKENoYXJUZXJtQXR0cmlidXRlLmNsYXNzKTsKICAgICBmaW5hbCBQb3NpdGlvbkluY3JlbWVudEF0dHJpYnV0ZSBwb3NJbmNBdHQgPSBncmFtcy5hZGRBdHRyaWJ1dGUoUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGUuY2xhc3MpOwogICAgIGZpbmFsIFBvc2l0aW9uTGVuZ3RoQXR0cmlidXRlIHBvc0xlbkF0dCA9IGdyYW1zLmFkZEF0dHJpYnV0ZShQb3NpdGlvbkxlbmd0aEF0dHJpYnV0ZS5jbGFzcyk7CiAgICAgZmluYWwgT2Zmc2V0QXR0cmlidXRlIG9mZnNldEF0dCA9IGdyYW1zLmFkZEF0dHJpYnV0ZShPZmZzZXRBdHRyaWJ1dGUuY2xhc3MpOwogICAgIGdyYW1zLnJlc2V0KCk7Ci0gICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHMubGVuZ3RoKCk7ICsrc3RhcnQpIHsKLSAgICAgIGZvciAoaW50IGVuZCA9IHN0YXJ0ICsgbWluR3JhbTsgZW5kIDw9IHN0YXJ0ICsgbWF4R3JhbSAmJiBlbmQgPD0gcy5sZW5ndGgoKTsgKytlbmQpIHsKKyAgICBmb3IgKGludCBzdGFydCA9IDA7IHN0YXJ0IDwgY29kZVBvaW50cy5sZW5ndGg7ICsrc3RhcnQpIHsKKyAgICAgIG5leHRHcmFtOgorICAgICAgZm9yIChpbnQgZW5kID0gc3RhcnQgKyBtaW5HcmFtOyBlbmQgPD0gc3RhcnQgKyBtYXhHcmFtICYmIGVuZCA8PSBjb2RlUG9pbnRzLmxlbmd0aDsgKytlbmQpIHsKKyAgICAgICAgaWYgKGVkZ2VzT25seSAmJiBzdGFydCA+IDAgJiYgaXNUb2tlbkNoYXIobm9uVG9rZW5DaGFycywgY29kZVBvaW50c1tzdGFydCAtIDFdKSkgeworICAgICAgICAgIC8vIG5vdCBvbiBhbiBlZGdlCisgICAgICAgICAgY29udGludWUgbmV4dEdyYW07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IHN0YXJ0OyBqIDwgZW5kOyArK2opIHsKKyAgICAgICAgICBpZiAoIWlzVG9rZW5DaGFyKG5vblRva2VuQ2hhcnMsIGNvZGVQb2ludHNbal0pKSB7CisgICAgICAgICAgICBjb250aW51ZSBuZXh0R3JhbTsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VHJ1ZShncmFtcy5pbmNyZW1lbnRUb2tlbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHMuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCB0ZXJtQXR0LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhBcnJheXMuY29weU9mUmFuZ2UoY29kZVBvaW50cywgc3RhcnQsIGVuZCksIHRvQ29kZVBvaW50cyh0ZXJtQXR0KSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBwb3NJbmNBdHQuZ2V0UG9zaXRpb25JbmNyZW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGFydCwgb2Zmc2V0QXR0LnN0YXJ0T2Zmc2V0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kLCBvZmZzZXRBdHQuZW5kT2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcG9zTGVuQXR0LmdldFBvc2l0aW9uTGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0c1tzdGFydF0sIG9mZnNldEF0dC5zdGFydE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9mZnNldHNbZW5kXSwgb2Zmc2V0QXR0LmVuZE9mZnNldCgpKTsKICAgICAgIH0KICAgICB9CisgICAgYXNzZXJ0RmFsc2UoZ3JhbXMuaW5jcmVtZW50VG9rZW4oKSk7CiAgICAgZ3JhbXMuZW5kKCk7CiAgICAgYXNzZXJ0RXF1YWxzKHMubGVuZ3RoKCksIG9mZnNldEF0dC5zdGFydE9mZnNldCgpKTsKICAgICBhc3NlcnRFcXVhbHMocy5sZW5ndGgoKSwgb2Zmc2V0QXR0LmVuZE9mZnNldCgpKTsKQEAgLTE0MSwxNCArMTk1LDQ3IEBACiAgICAgLy8gdGVzdCBzbGlkaW5nCiAgICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTAwKTsKICAgICBmaW5hbCBpbnQgbWF4R3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCBtaW5HcmFtLCAxMDApOwotICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDMgKiAxMDI0LCA0ICogMTAyNCkpOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDMgKiAxMDI0LCA0ICogMTAyNCksICIiKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RMYXJnZU1heEdyYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIC8vIHRlc3Qgc2xpZGluZyB3aXRoIG1heEdyYW0gPiAxMDI0Ci0gICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMTIwMCwgMTMwMCk7CisgICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMTI5MCwgMTMwMCk7CiAgICAgZmluYWwgaW50IG1heEdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgbWluR3JhbSwgMTMwMCk7Ci0gICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMyAqIDEwMjQsIDQgKiAxMDI0KSk7CisgICAgdGVzdE5HcmFtcyhtaW5HcmFtLCBtYXhHcmFtLCBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMyAqIDEwMjQsIDQgKiAxMDI0KSwgIiIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFByZVRva2VuaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTAwKTsKKyAgICBmaW5hbCBpbnQgbWF4R3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCBtaW5HcmFtLCAxMDApOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDAsIDQgKiAxMDI0KSwgImEiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIZWF2eVByZVRva2VuaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IG1pbkdyYW0gPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTAwKTsKKyAgICBmaW5hbCBpbnQgbWF4R3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCBtaW5HcmFtLCAxMDApOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDAsIDQgKiAxMDI0KSwgImFiY2RlZiIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZld1Rva2VuQ2hhcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGNoYXJbXSBjaHJzID0gbmV3IGNoYXJbX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDQwMDAsIDUwMDApXTsKKyAgICBBcnJheXMuZmlsbChjaHJzLCAnICcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hycy5sZW5ndGg7ICsraSkgeworICAgICAgaWYgKHJhbmRvbSgpLm5leHRGbG9hdCgpIDwgMC4xKSB7CisgICAgICAgIGNocnNbaV0gPSAnYSc7CisgICAgICB9CisgICAgfQorICAgIGZpbmFsIGludCBtaW5HcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDIpOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDIpOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgbmV3IFN0cmluZyhjaHJzKSwgIiAiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGdWxsVVRGOFJhbmdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbWluR3JhbSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCAxMDApOworICAgIGZpbmFsIGludCBtYXhHcmFtID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIG1pbkdyYW0sIDEwMCk7CisgICAgZmluYWwgU3RyaW5nIHMgPSBfVGVzdFV0aWwucmFuZG9tVW5pY29kZVN0cmluZyhyYW5kb20oKSwgNCAqIDEwMjQpOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgcywgIiIpOworICAgIHRlc3ROR3JhbXMobWluR3JhbSwgbWF4R3JhbSwgcywgImFiY2RlZiIpOwogICB9CiAKIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vVGVzdE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyLmphdmEKaW5kZXggYzAyMTJhNi4uNTVlZWZlMSAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyLmphdmEKQEAgLTMyLDYgKzMyLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkNoYXJBcnJheVNldDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Wb2NhYnVsYXJ5QXNzZXJ0Lio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbkxpZ2h0U3RlbW1lci5CT0tNQUFMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uby5Ob3J3ZWdpYW5MaWdodFN0ZW1tZXIuTllOT1JTSzsKKwogCiAvKioKICAqIFNpbXBsZSB0ZXN0cyBmb3Ige0BsaW5rIE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcn0KQEAgLTQyLDcgKzQ1LDcgQEAKICAgICBwcm90ZWN0ZWQgVG9rZW5TdHJlYW1Db21wb25lbnRzIGNyZWF0ZUNvbXBvbmVudHMoU3RyaW5nIGZpZWxkTmFtZSwKICAgICAgICAgUmVhZGVyIHJlYWRlcikgewogICAgICAgVG9rZW5pemVyIHNvdXJjZSA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7Ci0gICAgICByZXR1cm4gbmV3IFRva2VuU3RyZWFtQ29tcG9uZW50cyhzb3VyY2UsIG5ldyBOb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXIoc291cmNlKSk7CisgICAgICByZXR1cm4gbmV3IFRva2VuU3RyZWFtQ29tcG9uZW50cyhzb3VyY2UsIG5ldyBOb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXIoc291cmNlLCBCT0tNQUFMKSk7CiAgICAgfQogICB9OwogICAKQEAgLTUxLDYgKzU0LDE4IEBACiAgICAgYXNzZXJ0Vm9jYWJ1bGFyeShhbmFseXplciwgbmV3IEZpbGVJbnB1dFN0cmVhbShnZXREYXRhRmlsZSgibmJfbGlnaHQudHh0IikpKTsKICAgfQogICAKKyAgLyoqIFRlc3QgYWdhaW5zdCBhIE55bm9yc2sgdm9jYWJ1bGFyeSBmaWxlICovCisgIHB1YmxpYyB2b2lkIHRlc3ROeW5vcnNrVm9jYWJ1bGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAKKyAgICBBbmFseXplciBhbmFseXplciA9IG5ldyBBbmFseXplcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIFRva2VuU3RyZWFtQ29tcG9uZW50cyBjcmVhdGVDb21wb25lbnRzKFN0cmluZyBmaWVsZE5hbWUsIFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgVG9rZW5pemVyIHNvdXJjZSA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1Db21wb25lbnRzKHNvdXJjZSwgbmV3IE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlcihzb3VyY2UsIE5ZTk9SU0spKTsKKyAgICAgIH0KKyAgICB9OworICAgIGFzc2VydFZvY2FidWxhcnkoYW5hbHl6ZXIsIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RGF0YUZpbGUoIm5uX2xpZ2h0LnR4dCIpKSk7CisgIH0KKyAgCiAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDaGFyQXJyYXlTZXQgZXhjbHVzaW9uU2V0ID0gbmV3IENoYXJBcnJheVNldChURVNUX1ZFUlNJT05fQ1VSUkVOVCwgYXNTZXQoInNla3JldMOmcmVuIiksIGZhbHNlKTsKICAgICBBbmFseXplciBhID0gbmV3IEFuYWx5emVyKCkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeS5qYXZhCmluZGV4IGZlNWY2MmYuLmRmNjE5ODUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vVGVzdE5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL1Rlc3ROb3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTM0LDcgKzM0LDIzIEBACiAgICAgc3RyZWFtID0gdG9rZW5GaWx0ZXJGYWN0b3J5KCJOb3J3ZWdpYW5MaWdodFN0ZW0iKS5jcmVhdGUoc3RyZWFtKTsKICAgICBhc3NlcnRUb2tlblN0cmVhbUNvbnRlbnRzKHN0cmVhbSwgbmV3IFN0cmluZ1tdIHsgImVwbCIsICJlcGwiIH0pOwogICB9Ci0gIAorCisgIC8qKiBUZXN0IHN0ZW1taW5nIHdpdGggdmFyaWFudCBzZXQgZXhwbGljaXRseSB0byBCb2ttw6VsICovCisgIHB1YmxpYyB2b2lkIHRlc3RCb2ttYWFsU3RlbW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigiZXBsZXIgZXBsZSIpOworICAgIFRva2VuU3RyZWFtIHN0cmVhbSA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgc3RyZWFtID0gdG9rZW5GaWx0ZXJGYWN0b3J5KCJOb3J3ZWdpYW5MaWdodFN0ZW0iLCAidmFyaWFudCIsICJuYiIpLmNyZWF0ZShzdHJlYW0pOworICAgIGFzc2VydFRva2VuU3RyZWFtQ29udGVudHMoc3RyZWFtLCBuZXcgU3RyaW5nW10geyAiZXBsIiwgImVwbCIgfSk7CisgIH0KKworICAvKiogVGVzdCBzdGVtbWluZyB3aXRoIHZhcmlhbnQgc2V0IGV4cGxpY2l0bHkgdG8gTnlub3JzayAqLworICBwdWJsaWMgdm9pZCB0ZXN0Tnlub3Jza1N0ZW1taW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoImd1dGFyIGd1dGFuZSIpOworICAgIFRva2VuU3RyZWFtIHN0cmVhbSA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgc3RyZWFtID0gdG9rZW5GaWx0ZXJGYWN0b3J5KCJOb3J3ZWdpYW5MaWdodFN0ZW0iLCAidmFyaWFudCIsICJubiIpLmNyZWF0ZShzdHJlYW0pOworICAgIGFzc2VydFRva2VuU3RyZWFtQ29udGVudHMoc3RyZWFtLCBuZXcgU3RyaW5nW10geyAiZ3V0IiwgImd1dCIgfSk7CisgIH0KKwogICAvKiogVGVzdCB0aGF0IGJvZ3VzIGFyZ3VtZW50cyByZXN1bHQgaW4gZXhjZXB0aW9uICovCiAgIHB1YmxpYyB2b2lkIHRlc3RCb2d1c0FyZ3VtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL1Rlc3ROb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIuamF2YQppbmRleCA2OWNlZTc3Li4zODg2NmY2IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL1Rlc3ROb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vVGVzdE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkNoYXJBcnJheVNldDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Wb2NhYnVsYXJ5QXNzZXJ0Lio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5vLk5vcndlZ2lhbkxpZ2h0U3RlbW1lci5CT0tNQUFMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5uby5Ob3J3ZWdpYW5MaWdodFN0ZW1tZXIuTllOT1JTSzsKIAogLyoqCiAgKiBTaW1wbGUgdGVzdHMgZm9yIHtAbGluayBOb3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlcn0KQEAgLTQyLDE1ICs0NCwyNyBAQAogICAgIHByb3RlY3RlZCBUb2tlblN0cmVhbUNvbXBvbmVudHMgY3JlYXRlQ29tcG9uZW50cyhTdHJpbmcgZmllbGROYW1lLAogICAgICAgICBSZWFkZXIgcmVhZGVyKSB7CiAgICAgICBUb2tlbml6ZXIgc291cmNlID0gbmV3IE1vY2tUb2tlbml6ZXIocmVhZGVyLCBNb2NrVG9rZW5pemVyLldISVRFU1BBQ0UsIGZhbHNlKTsKLSAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1Db21wb25lbnRzKHNvdXJjZSwgbmV3IE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyKHNvdXJjZSkpOworICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbUNvbXBvbmVudHMoc291cmNlLCBuZXcgTm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXIoc291cmNlLCBCT0tNQUFMKSk7CiAgICAgfQogICB9OwogICAKLSAgLyoqIFRlc3QgYWdhaW5zdCBhIHZvY2FidWxhcnkgZmlsZSAqLworICAvKiogVGVzdCBhZ2FpbnN0IGEgQm9rbcOlbCB2b2NhYnVsYXJ5IGZpbGUgKi8KICAgcHVibGljIHZvaWQgdGVzdFZvY2FidWxhcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGFzc2VydFZvY2FidWxhcnkoYW5hbHl6ZXIsIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RGF0YUZpbGUoIm5iX21pbmltYWwudHh0IikpKTsKICAgfQogICAKKyAgLyoqIFRlc3QgYWdhaW5zdCBhIE55bm9yc2sgdm9jYWJ1bGFyeSBmaWxlICovCisgIHB1YmxpYyB2b2lkIHRlc3ROeW5vcnNrVm9jYWJ1bGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAKKyAgICBBbmFseXplciBhbmFseXplciA9IG5ldyBBbmFseXplcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIFRva2VuU3RyZWFtQ29tcG9uZW50cyBjcmVhdGVDb21wb25lbnRzKFN0cmluZyBmaWVsZE5hbWUsIFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgVG9rZW5pemVyIHNvdXJjZSA9IG5ldyBNb2NrVG9rZW5pemVyKHJlYWRlciwgTW9ja1Rva2VuaXplci5XSElURVNQQUNFLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1Db21wb25lbnRzKHNvdXJjZSwgbmV3IE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyKHNvdXJjZSwgTllOT1JTSykpOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0Vm9jYWJ1bGFyeShhbmFseXplciwgbmV3IEZpbGVJbnB1dFN0cmVhbShnZXREYXRhRmlsZSgibm5fbWluaW1hbC50eHQiKSkpOworICB9CisgIAogICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ2hhckFycmF5U2V0IGV4Y2x1c2lvblNldCA9IG5ldyBDaGFyQXJyYXlTZXQoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFzU2V0KCJzZWtyZXTDpnJlbiIpLCBmYWxzZSk7CiAgICAgQW5hbHl6ZXIgYSA9IG5ldyBBbmFseXplcigpIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vVGVzdE5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKaW5kZXggOWMwMzIyNS4uODBiNGRkZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9UZXN0Tm9yd2VnaWFuTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTM1LDYgKzM1LDIyIEBACiAgICAgYXNzZXJ0VG9rZW5TdHJlYW1Db250ZW50cyhzdHJlYW0sIG5ldyBTdHJpbmdbXSB7ICJlcGwiLCAiZXBsIiwgImVwbCIsICJlcGwiLCAiZXBsIiwgImVwbCIgfSk7CiAgIH0KICAgCisgIC8qKiBUZXN0IHN0ZW1taW5nIHdpdGggdmFyaWFudCBzZXQgZXhwbGljaXRseSB0byBCb2ttw6VsICovCisgIHB1YmxpYyB2b2lkIHRlc3RCb2ttYWFsU3RlbW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigiZXBsZSBlcGxldCBlcGxlciBlcGxlbmUgZXBsZXRzIGVwbGVuZXMiKTsKKyAgICBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgTW9ja1Rva2VuaXplcihyZWFkZXIsIE1vY2tUb2tlbml6ZXIuV0hJVEVTUEFDRSwgZmFsc2UpOworICAgIHN0cmVhbSA9IHRva2VuRmlsdGVyRmFjdG9yeSgiTm9yd2VnaWFuTWluaW1hbFN0ZW0iLCAidmFyaWFudCIsICJuYiIpLmNyZWF0ZShzdHJlYW0pOworICAgIGFzc2VydFRva2VuU3RyZWFtQ29udGVudHMoc3RyZWFtLCBuZXcgU3RyaW5nW10geyAiZXBsIiwgImVwbCIsICJlcGwiLCAiZXBsIiwgImVwbCIsICJlcGwiIH0pOworICB9CisgIAorICAvKiogVGVzdCBzdGVtbWluZyB3aXRoIHZhcmlhbnQgc2V0IGV4cGxpY2l0bHkgdG8gTnlub3JzayAqLworICBwdWJsaWMgdm9pZCB0ZXN0Tnlub3Jza1N0ZW1taW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoImd1dCBndXRlbiBndXRhciBndXRhbmUgZ3V0ZW5zIGd1dGFuZXMiKTsKKyAgICBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgTW9ja1Rva2VuaXplcihyZWFkZXIsIE1vY2tUb2tlbml6ZXIuV0hJVEVTUEFDRSwgZmFsc2UpOworICAgIHN0cmVhbSA9IHRva2VuRmlsdGVyRmFjdG9yeSgiTm9yd2VnaWFuTWluaW1hbFN0ZW0iLCAidmFyaWFudCIsICJubiIpLmNyZWF0ZShzdHJlYW0pOworICAgIGFzc2VydFRva2VuU3RyZWFtQ29udGVudHMoc3RyZWFtLCBuZXcgU3RyaW5nW10geyAiZ3V0IiwgImd1dCIsICJndXQiLCAiZ3V0IiwgImd1dCIsICJndXQiIH0pOworICB9CisgIAogICAvKiogVGVzdCB0aGF0IGJvZ3VzIGFyZ3VtZW50cyByZXN1bHQgaW4gZXhjZXB0aW9uICovCiAgIHB1YmxpYyB2b2lkIHRlc3RCb2d1c0FyZ3VtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL25uX2xpZ2h0LnR4dCBiL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbm8vbm5fbGlnaHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGRhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL25uX2xpZ2h0LnR4dApAQCAtMCwwICsxLDExMCBAQAorIworIyBUZXN0cyBmb3IgTm9yd2VnaWFuIE55bm9yc2sgbGlnaHQgc3RlbW1lcgorIyBJdCBzaG91bGQgdGFja2xlIG5vdW5zLCBhZGplY3RpdmVzLCBnZW5pdGl2ZSBhbmQgc29tZSBnZW5lcmFsIGVuZGluZ3MKKyMKKyMgTm91bnMgbWFzY3VsaW5lCitndXQJZ3V0CitndXRlbglndXQKK2d1dGFyCWd1dAorZ3V0YW5lCWd1dAorZ3V0ZW5zCWd1dAorZ3V0YW5lcwlndXQKK3PDuGtuYWQJc8O4a25hZAorc8O4a25hZGVuCXPDuGtuYWQKK3PDuGtuYWRhcglzw7hrbmFkCitzw7hrbmFkYW5lCXPDuGtuYWQKK3PDuGtuYWRlbnMJc8O4a25hZAorc8O4a25hZGFuZXMJc8O4a25hZAorIyBOb3VucyBmZW1pbmluZQora2pvbGUJa2pvbAora2pvbGEJa2pvbAora2pvbGVyCWtqb2wKK2tqb2xlbmUJa2pvbAora2pvbGFzCWtqb2wKKyMgTm91bnMgbmV1dHJhbAorZHlyCWR5cgorZHlyZXQJZHlyCitkeXJhCWR5cgorZHlyYXMJZHlyCitwcm9zcGVrdAlwcm9zcGVrdAorcHJvc3Bla3RldAlwcm9zcGVrdAorcHJvc3Bla3RhCXByb3NwZWt0Citwcm9zcGVrdGFzCXByb3NwZWt0Citpbm5oYWxkCWlubmhhbGQKK2lubmhhbGRldAlpbm5oYWxkCitpbm5oYWxkYQlpbm5oYWxkCisjIEdlbmVyYWwgZW5kaW5ncworaGVtbWVsZWcJaGVtbWVsZWcKK2hlbW1lbGVnaGVpdAloZW1tZWxlZworaGVtbWVsZWdoZWl0YQloZW1tZWxlZworaGVtbWVsZWdoZWl0ZXIJaGVtbWVsZWcKK3ZhbnNrZWxlZwl2YW5za2VsZWcKK3ZhbnNrZWxlZ2hlaXQJdmFuc2tlbGVnCit2YW5za2VsZWdoZWl0YQl2YW5za2VsZWcKK3ZhbnNrZWxlZ2hlaXRlcgl2YW5za2VsZWcKK2hldmVsc2UJaGV2CitoZXZhCWhldgoraGV2ZWxzZW4JaGV2CitoZXZlCWhldgorw6ZybGVnCcOmcmxlZworw6ZybGVnZG9tCcOmcmxlZworw6ZybGVnZG9tbWVuCcOmcmxlZ2RvbW0KK8OmcmxlZ2RvbW1lbnMJw6ZybGVnZG9tbQorYWxkZXJkb20JYWxkZXIKK2FsZGVyZG9tbWVuCWFsZGVyZG9tbQorYWxkZXJkb21tZW5zCWFsZGVyZG9tbQordHJ5Z2cJdHJ5Z2cKK3RyeWdnbGVpawl0cnlnZwordHJ5Z2dsZWlrZW4JdHJ5Z2cKK3RyeWdnbGVpa2Vucwl0cnlnZwordHJ5Z2dsZWlrYXIJdHJ5Z2cKK2tqw6ZybGVpawlrasOmcgora2rDpnJsZWlrZW4Ja2rDpnIKK2tqw6ZybGVpa2VucwlrasOmcgora2rDpnJsZWlrYXIJa2rDpnIKK3ZlcmtlCXZlcmsKK3ZlcmtzZW1kCXZlcmsKK2hqZWxwZQloamVscAoraGplbHBzZW1kCWhqZWxwCisjIEFkamVjdGl2ZXMKK2JpbGxlZwliaWxsZWcKK2JpbGxlZ2FyZQliaWxsZWcKK2JpbGxlZ2FzdAliaWxsZWcKK3NtYWwJc21hbAorc21hbGFyZQlzbWFsCitzbWFsYXN0CXNtYWwKK2ZhcmxlZwlmYXJsZWcKK2ZhcmxlZ2FyZQlmYXJsZWcKK2ZhcmxlZ2FzdAlmYXJsZWcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdvcmRzIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCisjCisjIElycmVndWxhciBtYXNjdWxpbmUgbm91bnMgKG5vdCBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGNvcnJlY3RseSkKK3PDuG5lcglzw7huCitzw7huZW5lCXPDuG4KK2Jyw7hyCWJyw7hyCiticsO4cm5lCWJyw7hybgorIyBJcnJlZ3VsYXIgZmVtaW5pbmUgbm91bnMsIG5vdCBoYW5kbGVkCitkb3R0ZXIJZG90dAorZMO4dHJlcglkw7h0cgorZMO4dHJlbmUJZMO4dHIKK2tsbwlrbG8KK2tsw7hybmUJa2zDuHJuCittb3IJbW9yCittw7hkcmVyCW3DuGRyCittw7hkcmVuZQltw7hkcgorIyBJcnJlZ3VsYXIgbmV1dHJhbCBub3Vucywgbm90IGhhbmRsZWQKK3ZlZHVuZGVyCXZlZHVuZAorIyBPdGhlciB3b3JkcyB0aGF0IHNob3VsZCBub3QgYmUgdG91Y2hlZAorYWJjCWFiYworMTIzCTEyMworSmVucwlKZW5zCisjIElycmVndWxhciBhZGplY3RpdmVzIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCitnYW1tYWwJZ2FtbWFsCitlbGRyZQllbGRyCitlbGRzdAllbGRzdAorIyBWZXJicywgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCitzeW5namUJc3luZ2oKK3N5bmcJc3luZworc29uZwlzb25nCitzdW5nZQlzdW5nCmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL25vL25uX21pbmltYWwudHh0IGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9ubl9taW5pbWFsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU4OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9uby9ubl9taW5pbWFsLnR4dApAQCAtMCwwICsxLDc2IEBACisjCisjIFRlc3RzIGZvciBOb3J3ZWdpYW4gbWluaW1hbCBzdGVtbWVyIHVzaW5nIE55bm9yc2sgYXMgdmFyaWFudAorIyBJdCBvbmx5IHRyaWVzIHRvIHN0ZW0gbm91bnMsIGkuZS4gYmVpbmcgdmVyeSBsaXR0bGUgYWdncmVzc2l2ZQorIworIyBOb3VucyBtYXNjdWxpbmUKK2d1dAlndXQKK2d1dGVuCWd1dAorZ3V0YXIJZ3V0CitndXRhbmUJZ3V0CitndXRlbnMJZ3V0CitndXRhbmVzCWd1dAorc8O4a25hZAlzw7hrbmFkCitzw7hrbmFkZW4Jc8O4a25hZAorc8O4a25hZGFyCXPDuGtuYWQKK3PDuGtuYWRhbmUJc8O4a25hZAorc8O4a25hZGVucwlzw7hrbmFkCitzw7hrbmFkYW5lcwlzw7hrbmFkCisjIE5vdW5zIGZlbWluaW5lCitqZW50ZQlqZW50CitqZW50YQlqZW50CitqZW50ZXIJamVudAoramVudGVuZQlqZW50CitqZW50YXMJamVudAorIyBOb3VucyBuZXV0cmFsCitkeXIJZHlyCitkeXJldAlkeXIKK2R5cmEJZHlyCitkeXJhcwlkeXIKK3Byb3NwZWt0CXByb3NwZWt0Citwcm9zcGVrdGV0CXByb3NwZWt0Citwcm9zcGVrdGEJcHJvc3Bla3QKK3Byb3NwZWt0YXMJcHJvc3Bla3QKK2lubmhhbGQJaW5uaGFsZAoraW5uaGFsZGV0CWlubmhhbGQKK2lubmhhbGRhCWlubmhhbGQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdvcmRzIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCisjCisjIElycmVndWxhciBtYXNjdWxpbmUgbm91bnMgKG5vdCBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGNvcnJlY3RseSkKK3PDuG5lcglzw7huCitzw7huZW5lCXPDuG4KK2Jyw7hyCWJyw7hyCiticsO4cm5lCWJyw7hybgorIyBJcnJlZ3VsYXIgZmVtaW5pbmUgbm91bnMsIG5vdCBoYW5kbGVkCitkb3R0ZXIJZG90dAorZMO4dHJlcglkw7h0cgorZMO4dHJlbmUJZMO4dHIKK2tsbwlrbG8KK2tsw7hybmUJa2zDuHJuCittb3IJbW9yCittw7hkcmVyCW3DuGRyCittw7hkcmVuZQltw7hkcgorIyBJcnJlZ3VsYXIgbmV1dHJhbCBub3Vucywgbm90IGhhbmRsZWQKK3ZlZHVuZGVyCXZlZHVuZAorIyBPdGhlciB3b3JkcyB0aGF0IHNob3VsZCBub3QgYmUgdG91Y2hlZAorYWJjCWFiYworMTIzCTEyMworSmVucwlKZW5zCisjIEFkamVjdGl2ZSwgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCitmYXJsZWcJZmFybGVnCitmYXJsZWdhcmUJZmFybGVnYXIKK2ZhcmxlZ2FzdAlmYXJsZWdhc3QKK3N0b3IJc3Rvcgorc3TDuHJyZQlzdMO4cnIKK3N0w7hyc3QJc3TDuHJzdAorZ2FtbWFsCWdhbW1hbAorZWxkcmUJZWxkcgorZWxkc3QJZWxkc3QKKyMgR2VuZXJhbCBlbmRpbmdzLCBzaG91bGQgbm90IGJlIHN0ZW1tZWQKK3Nhbm5pbmcJc2FubmluZworc2FubmluZ2EJc2FubmluZworIyBWZXJicywgc2hvdWxkIG5vdCBiZSBzdGVtbWVkCitzeW5namUJc3luZ2oKK3N5bmcJc3luZworc29uZwlzb25nCitzdW5nZQlzdW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL1Rlc3RDaGFyYWN0ZXJVdGlscy5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL2NvbW1vbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy91dGlsL1Rlc3RDaGFyYWN0ZXJVdGlscy5qYXZhCmluZGV4IDUwMjIyM2YuLjNjODg0NTQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9jb21tb24vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvdXRpbC9UZXN0Q2hhcmFjdGVyVXRpbHMuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvY29tbW9uL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL3V0aWwvVGVzdENoYXJhY3RlclV0aWxzLmphdmEKQEAgLTIwLDEwICsyMCwxMSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuQ2hhcmFjdGVyVXRpbHMuQ2hhcmFjdGVyQnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuX1Rlc3RVdGlsOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKioKQEAgLTMyLDMyICszMyw2IEBACiBwdWJsaWMgY2xhc3MgVGVzdENoYXJhY3RlclV0aWxzIGV4dGVuZHMgTHVjZW5lVGVzdENhc2UgewogCiAgIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDb2RlUG9pbnRBdENoYXJBcnJheUludCgpIHsKLSAgICBDaGFyYWN0ZXJVdGlscyBqYXZhNCA9IENoYXJhY3RlclV0aWxzLmdldEphdmE0SW5zdGFuY2UoKTsKLSAgICBjaGFyW10gY3BBdDMgPSAiQWJjXHVkODAxXHVkYzFjIi50b0NoYXJBcnJheSgpOwotICAgIGNoYXJbXSBoaWdoU3Vycm9nYXRlQXQzID0gIkFiY1x1ZDgwMSIudG9DaGFyQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGludCkgJ0EnLCBqYXZhNC5jb2RlUG9pbnRBdChjcEF0MywgMCkpOwotICAgIGFzc2VydEVxdWFscygoaW50KSAnXHVkODAxJywgamF2YTQuY29kZVBvaW50QXQoY3BBdDMsIDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoKGludCkgJ1x1ZDgwMScsIGphdmE0LmNvZGVQb2ludEF0KGhpZ2hTdXJyb2dhdGVBdDMsIDMpKTsKLSAgICB0cnkgewotICAgICAgamF2YTQuY29kZVBvaW50QXQoaGlnaFN1cnJvZ2F0ZUF0MywgNCk7Ci0gICAgICBmYWlsKCJhcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIik7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgfQotCi0gICAgQ2hhcmFjdGVyVXRpbHMgamF2YTUgPSBDaGFyYWN0ZXJVdGlscy5nZXRJbnN0YW5jZShURVNUX1ZFUlNJT05fQ1VSUkVOVCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChpbnQpICdBJywgamF2YTUuY29kZVBvaW50QXQoY3BBdDMsIDApKTsKLSAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLnRvQ29kZVBvaW50KCdcdWQ4MDEnLCAnXHVkYzFjJyksIGphdmE1LmNvZGVQb2ludEF0KAotICAgICAgICBjcEF0MywgMykpOwotICAgIGFzc2VydEVxdWFscygoaW50KSAnXHVkODAxJywgamF2YTUuY29kZVBvaW50QXQoaGlnaFN1cnJvZ2F0ZUF0MywgMykpOwotICAgIHRyeSB7Ci0gICAgICBqYXZhNS5jb2RlUG9pbnRBdChoaWdoU3Vycm9nYXRlQXQzLCA0KTsKLSAgICAgIGZhaWwoImFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICB9Ci0gIH0KLQotICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0Q29kZVBvaW50QXRDaGFyU2VxdWVuY2VJbnQoKSB7CiAgICAgQ2hhcmFjdGVyVXRpbHMgamF2YTQgPSBDaGFyYWN0ZXJVdGlscy5nZXRKYXZhNEluc3RhbmNlKCk7CiAgICAgU3RyaW5nIGNwQXQzID0gIkFiY1x1ZDgwMVx1ZGMxYyI7CkBAIC05OCw3ICs3Myw2OCBAQAogICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIudG9Db2RlUG9pbnQoJ1x1ZDgwMScsICdcdWRjMWMnKSwgamF2YTUuY29kZVBvaW50QXQoCiAgICAgICAgIGNwQXQzLCAzLCA1KSk7CiAgICAgYXNzZXJ0RXF1YWxzKChpbnQpICdcdWQ4MDEnLCBqYXZhNS5jb2RlUG9pbnRBdChoaWdoU3Vycm9nYXRlQXQzLCAzLCA0KSk7CisgIH0KIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29kZVBvaW50Q291bnQoKSB7CisgICAgQ2hhcmFjdGVyVXRpbHMgamF2YTQgPSBDaGFyYWN0ZXJVdGlscy5nZXRKYXZhNEluc3RhbmNlKCk7CisgICAgQ2hhcmFjdGVyVXRpbHMgamF2YTUgPSBDaGFyYWN0ZXJVdGlscy5nZXRJbnN0YW5jZShURVNUX1ZFUlNJT05fQ1VSUkVOVCk7CisgICAgZmluYWwgU3RyaW5nIHMgPSBfVGVzdFV0aWwucmFuZG9tVW5pY29kZVN0cmluZyhyYW5kb20oKSk7CisgICAgYXNzZXJ0RXF1YWxzKHMubGVuZ3RoKCksIGphdmE0LmNvZGVQb2ludENvdW50KHMpKTsKKyAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLmNvZGVQb2ludENvdW50KHMsIDAsIHMubGVuZ3RoKCkpLCBqYXZhNS5jb2RlUG9pbnRDb3VudChzKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0T2Zmc2V0QnlDb2RlUG9pbnQoKSB7CisgICAgQ2hhcmFjdGVyVXRpbHMgamF2YTQgPSBDaGFyYWN0ZXJVdGlscy5nZXRKYXZhNEluc3RhbmNlKCk7CisgICAgQ2hhcmFjdGVyVXRpbHMgamF2YTUgPSBDaGFyYWN0ZXJVdGlscy5nZXRJbnN0YW5jZShURVNUX1ZFUlNJT05fQ1VSUkVOVCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICBmaW5hbCBjaGFyW10gcyA9IF9UZXN0VXRpbC5yYW5kb21Vbmljb2RlU3RyaW5nKHJhbmRvbSgpKS50b0NoYXJBcnJheSgpOworICAgICAgZmluYWwgaW50IGluZGV4ID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDAsIHMubGVuZ3RoKTsKKyAgICAgIGZpbmFsIGludCBvZmZzZXQgPSByYW5kb20oKS5uZXh0SW50KDcpIC0gMzsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGludCBvID0gamF2YTQub2Zmc2V0QnlDb2RlUG9pbnRzKHMsIDAsIHMubGVuZ3RoLCBpbmRleCwgb2Zmc2V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG8sIGluZGV4ICsgb2Zmc2V0KTsKKyAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICBhc3NlcnRUcnVlKChpbmRleCArIG9mZnNldCkgPCAwIHx8IChpbmRleCArIG9mZnNldCkgPiBzLmxlbmd0aCk7CisgICAgICB9CisgIAorICAgICAgaW50IG87CisgICAgICB0cnkgeworICAgICAgICBvID0gamF2YTUub2Zmc2V0QnlDb2RlUG9pbnRzKHMsIDAsIHMubGVuZ3RoLCBpbmRleCwgb2Zmc2V0KTsKKyAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIENoYXJhY3Rlci5vZmZzZXRCeUNvZGVQb2ludHMocywgMCwgcy5sZW5ndGgsIGluZGV4LCBvZmZzZXQpOworICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlMikgeworICAgICAgICAgIC8vIE9LCisgICAgICAgIH0KKyAgICAgICAgbyA9IC0xOworICAgICAgfQorICAgICAgaWYgKG8gPj0gMCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoQ2hhcmFjdGVyLm9mZnNldEJ5Q29kZVBvaW50cyhzLCAwLCBzLmxlbmd0aCwgaW5kZXgsIG9mZnNldCksIG8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9ucygpIHsKKyAgICBDaGFyYWN0ZXJVdGlscyBqYXZhNCA9IENoYXJhY3RlclV0aWxzLmdldEphdmE0SW5zdGFuY2UoKTsKKyAgICBDaGFyYWN0ZXJVdGlscyBqYXZhNSA9IENoYXJhY3RlclV0aWxzLmdldEluc3RhbmNlKFRFU1RfVkVSU0lPTl9DVVJSRU5UKTsKKyAgICB0ZXN0Q29udmVyc2lvbnMoamF2YTQpOworICAgIHRlc3RDb252ZXJzaW9ucyhqYXZhNSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdENvbnZlcnNpb25zKENoYXJhY3RlclV0aWxzIGNoYXJVdGlscykgeworICAgIGZpbmFsIGNoYXJbXSBvcmlnID0gX1Rlc3RVdGlsLnJhbmRvbVVuaWNvZGVTdHJpbmcocmFuZG9tKCksIDEwMCkudG9DaGFyQXJyYXkoKTsKKyAgICBmaW5hbCBpbnRbXSBidWYgPSBuZXcgaW50W29yaWcubGVuZ3RoXTsKKyAgICBmaW5hbCBjaGFyW10gcmVzdG9yZWQgPSBuZXcgY2hhcltidWYubGVuZ3RoXTsKKyAgICBmaW5hbCBpbnQgbzEgPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMCwgTWF0aC5taW4oNSwgb3JpZy5sZW5ndGgpKTsKKyAgICBmaW5hbCBpbnQgbzIgPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMCwgbzEpOworICAgIGZpbmFsIGludCBvMyA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAwLCBvMSk7CisgICAgZmluYWwgaW50IGNvZGVQb2ludENvdW50ID0gY2hhclV0aWxzLnRvQ29kZVBvaW50cyhvcmlnLCBvMSwgb3JpZy5sZW5ndGggLSBvMSwgYnVmLCBvMik7CisgICAgZmluYWwgaW50IGNoYXJDb3VudCA9IGNoYXJVdGlscy50b0NoYXJzKGJ1ZiwgbzIsIGNvZGVQb2ludENvdW50LCByZXN0b3JlZCwgbzMpOworICAgIGFzc2VydEVxdWFscyhvcmlnLmxlbmd0aCAtIG8xLCBjaGFyQ291bnQpOworICAgIGFzc2VydEFycmF5RXF1YWxzKEFycmF5cy5jb3B5T2ZSYW5nZShvcmlnLCBvMSwgbzEgKyBjaGFyQ291bnQpLCBBcnJheXMuY29weU9mUmFuZ2UocmVzdG9yZWQsIG8zLCBvMyArIGNoYXJDb3VudCkpOwogICB9CiAKICAgQFRlc3QKQEAgLTEzMiw3ICsxNjgsNyBAQAogICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1ZmZlci5nZXRPZmZzZXQoKSk7CiAgICAgICBhc3NlcnRFcXVhbHMoNiwgYnVmZmVyLmdldExlbmd0aCgpKTsKICAgICAgIGFzc2VydEVxdWFscygiaGVsbG93IiwgbmV3IFN0cmluZyhidWZmZXIuZ2V0QnVmZmVyKCkpKTsKLSAgICAgIGFzc2VydFRydWUoaW5zdGFuY2UuZmlsbChidWZmZXIscmVhZGVyKSk7CisgICAgICBhc3NlcnRGYWxzZShpbnN0YW5jZS5maWxsKGJ1ZmZlcixyZWFkZXIpKTsKICAgICAgIGFzc2VydEVxdWFscyg0LCBidWZmZXIuZ2V0TGVuZ3RoKCkpOwogICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1ZmZlci5nZXRPZmZzZXQoKSk7CiAKQEAgLTE1OSwxNSArMTk1LDEyIEBACiAgICAgYXNzZXJ0RXF1YWxzKDQsIGJ1ZmZlci5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKCIxMjNcdWQ4MDEiLCBuZXcgU3RyaW5nKGJ1ZmZlci5nZXRCdWZmZXIoKSwKICAgICAgICAgYnVmZmVyLmdldE9mZnNldCgpLCBidWZmZXIuZ2V0TGVuZ3RoKCkpKTsKLSAgICBhc3NlcnRUcnVlKGluc3RhbmNlLmZpbGwoYnVmZmVyLCByZWFkZXIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgYnVmZmVyLmdldExlbmd0aCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlx1ZDgwMVx1ZGMxYyIsIG5ldyBTdHJpbmcoYnVmZmVyLmdldEJ1ZmZlcigpLCBidWZmZXIKLSAgICAgICAgLmdldE9mZnNldCgpLCBidWZmZXIuZ2V0TGVuZ3RoKCkpKTsKLSAgICBhc3NlcnRUcnVlKGluc3RhbmNlLmZpbGwoYnVmZmVyLCByZWFkZXIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVmZmVyLmdldExlbmd0aCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlx1ZDgwMSIsIG5ldyBTdHJpbmcoYnVmZmVyLmdldEJ1ZmZlcigpLCBidWZmZXIKKyAgICBhc3NlcnRGYWxzZShpbnN0YW5jZS5maWxsKGJ1ZmZlciwgcmVhZGVyKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIGJ1ZmZlci5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcdWQ4MDFcdWRjMWNcdWQ4MDEiLCBuZXcgU3RyaW5nKGJ1ZmZlci5nZXRCdWZmZXIoKSwgYnVmZmVyCiAgICAgICAgIC5nZXRPZmZzZXQoKSwgYnVmZmVyLmdldExlbmd0aCgpKSk7CiAgICAgYXNzZXJ0RmFsc2UoaW5zdGFuY2UuZmlsbChidWZmZXIsIHJlYWRlcikpOworICAgIGFzc2VydEVxdWFscygwLCBidWZmZXIuZ2V0TGVuZ3RoKCkpOwogICB9CiAKICAgQFRlc3QKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9pY3UvYnVpbGQueG1sIGIvbHVjZW5lL2FuYWx5c2lzL2ljdS9idWlsZC54bWwKaW5kZXggZmNkOTIwMS4uNWQzYzc2ZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2ljdS9idWlsZC54bWwKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2ljdS9idWlsZC54bWwKQEAgLTIzLDYgKzIzLDggQEAKICAgIEFuYWx5c2lzIGludGVncmF0aW9uIHdpdGggSUNVIChJbnRlcm5hdGlvbmFsIENvbXBvbmVudHMgZm9yIFVuaWNvZGUpLgogICA8L2Rlc2NyaXB0aW9uPgogCisgIDxwcm9wZXJ0eSBuYW1lPSJyYXQuYWRkaXRpb25hbC1pbmNsdWRlcyIgdmFsdWU9InNyYy90b29scy8qKiIvPgorCiAgIDxpbXBvcnQgZmlsZT0iLi4vYW5hbHlzaXMtbW9kdWxlLWJ1aWxkLnhtbCIvPgogCiAgIDxwYXRoIGlkPSJpY3VqYXIiPgpAQCAtNTksNyArNjEsNyBAQAogICA8cHJvcGVydHkgbmFtZT0iZ2Vubm9ybTIuc3JjLmZpbGVzIgogICAJdmFsdWU9Im5mYy50eHQgbmZrYy50eHQgbmZrY19jZi50eHQgQmFzaWNGb2xkaW5ncy50eHQgRGlhY3JpdGljRm9sZGluZy50eHQgRGluZ2JhdEZvbGRpbmcudHh0IEhhblJhZGljYWxGb2xkaW5nLnR4dCBOYXRpdmVEaWdpdEZvbGRpbmcudHh0Ii8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJnZW5ub3JtMi50bXAiIHZhbHVlPSIke2J1aWxkLmRpcn0vZ2Vubm9ybTIvdXRyMzAudG1wIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5ub3JtMi5kc3QiIHZhbHVlPSJzcmMvcmVzb3VyY2VzL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2ljdS91dHIzMC5ucm0iLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbm5vcm0yLmRzdCIgdmFsdWU9IiR7cmVzb3VyY2VzLmRpcn0vb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaWN1L3V0cjMwLm5ybSIvPgogICA8dGFyZ2V0IG5hbWU9Imdlbm5vcm0yIiBkZXBlbmRzPSJnZW4tdXRyMzAtZGF0YS1maWxlcyI+CiAgICAgPGVjaG8+Tm90ZSB0aGF0IHRoZSBnZW5ub3JtMiBhbmQgaWN1cGtnIHRvb2xzIG11c3QgYmUgb24geW91ciBQQVRILiBUaGVzZSB0b29scwogYXJlIHBhcnQgb2YgdGhlIElDVTRDIHBhY2thZ2UuIFNlZSBodHRwOi8vc2l0ZS5pY3UtcHJvamVjdC5vcmcvIDwvZWNobz4KQEAgLTgyLDcgKzg0LDcgQEAKICAgPC90YXJnZXQ+CiAgIAogICA8cHJvcGVydHkgbmFtZT0icmJiaS5zcmMuZGlyIiBsb2NhdGlvbj0ic3JjL2RhdGEvdWF4MjkiLz4KLSAgPHByb3BlcnR5IG5hbWU9InJiYmkuZHN0LmRpciIgbG9jYXRpb249InNyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvaWN1L3NlZ21lbnRhdGlvbiIvPgorICA8cHJvcGVydHkgbmFtZT0icmJiaS5kc3QuZGlyIiBsb2NhdGlvbj0iJHtyZXNvdXJjZXMuZGlyfS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9pY3Uvc2VnbWVudGF0aW9uIi8+CiAJCQogICA8dGFyZ2V0IG5hbWU9ImdlbnJiYmkiIGRlcGVuZHM9ImNvbXBpbGUtdG9vbHMiPgogICAgIDxta2RpciBkaXI9IiR7cmJiaS5kc3QuZGlyfSIvPgpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL2t1cm9tb2ppL2J1aWxkLnhtbCBiL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9idWlsZC54bWwKaW5kZXggN2VjNzc2Yi4uMjQyOGJhYyAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL2t1cm9tb2ppL2J1aWxkLnhtbAorKysgYi9sdWNlbmUvYW5hbHlzaXMva3Vyb21vamkvYnVpbGQueG1sCkBAIC0yNiw2ICsyNiw3IEBACiAgIDwhLS0gY3VycmVudGx5IHdoZXRoZXIgcmF0IGRldGVjdHMgdGhpcyBhcyBiaW5hcnkgb3Igbm90CiAgICAgICAgaXMgcGxhdGZvcm0gZGVwZW5kZW50PyEgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJyYXQuZXhjbHVkZXMiIHZhbHVlPSIqKi8qLnR4dCwqKi9ib2NjaGFuLnV0Zi04Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyYXQuYWRkaXRpb25hbC1pbmNsdWRlcyIgdmFsdWU9InNyYy90b29scy8qKiIvPgogCiAgIDwhLS0gd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluIGlwYWRpYy9uYWlzdCBldGMgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuZGVmYXVsdC5jb25maWd1cmF0aW9uIiB2YWx1ZT0iZGVmYXVsdCIvPgpAQCAtNDUsNyArNDYsNyBAQAogICA8cHJvcGVydHkgbmFtZT0iZGljdC5lbmNvZGluZyIgdmFsdWU9ImV1Yy1qcCIvPgogICA8cHJvcGVydHkgbmFtZT0iZGljdC5mb3JtYXQiIHZhbHVlPSJpcGFkaWMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImRpY3Qubm9ybWFsaXplIiB2YWx1ZT0iZmFsc2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImRpY3QudGFyZ2V0LmRpciIgbG9jYXRpb249Ii4vc3JjL3Jlc291cmNlcyIvPgorICA8cHJvcGVydHkgbmFtZT0iZGljdC50YXJnZXQuZGlyIiBsb2NhdGlvbj0iJHtyZXNvdXJjZXMuZGlyfSIvPgogCiAKICAgPGF2YWlsYWJsZSB0eXBlPSJkaXIiIGZpbGU9IiR7YnVpbGQuZGlyfS8ke2lwYWRpYy52ZXJzaW9ufSIgcHJvcGVydHk9ImRpY3QuYXZhaWxhYmxlIi8+CkBAIC04Myw3ICs4NCw3IEBACiAgIDx0YXJnZXQgbmFtZT0iYnVpbGQtZGljdCIgZGVwZW5kcz0iY29tcGlsZS10b29scywgZG93bmxvYWQtZGljdCI+CiAgICAgPHNlcXVlbnRpYWw+CiAgICAgICA8ZGVsZXRlIHZlcmJvc2U9InRydWUiPgotICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvamEvZGljdCIgaW5jbHVkZXM9IioqLyoiLz4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Jlc291cmNlcy5kaXJ9L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2phL2RpY3QiIGluY2x1ZGVzPSIqKi8qIi8+CiAgICAgICA8L2RlbGV0ZT4KICAgICAgIDwhLS0gVE9ETzogb3B0aW1pemUgdGhlIGRpY3Rpb25hcnkgY29uc3RydWN0aW9uIGEgYml0IHNvIHRoYXQgeW91IGRvbid0IG5lZWQgMUcgLS0+CiAgICAgICA8amF2YSBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSIgbWF4bWVtb3J5PSIxZyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5qYS51dGlsLkRpY3Rpb25hcnlCdWlsZGVyIj4KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS9kaWN0L1Rva2VuSW5mb0RpY3Rpb25hcnkuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS9kaWN0L1Rva2VuSW5mb0RpY3Rpb25hcnkuamF2YQppbmRleCBmZDdhNjc2Li42ZWRjZjM0IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMva3Vyb21vamkvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvamEvZGljdC9Ub2tlbkluZm9EaWN0aW9uYXJ5LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2t1cm9tb2ppL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2phL2RpY3QvVG9rZW5JbmZvRGljdGlvbmFyeS5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgdHJ5IHsKICAgICAgIGlzID0gZ2V0UmVzb3VyY2UoRlNUX0ZJTEVOQU1FX1NVRkZJWCk7CiAgICAgICBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKLSAgICAgIGZzdCA9IG5ldyBGU1Q8TG9uZz4obmV3IElucHV0U3RyZWFtRGF0YUlucHV0KGlzKSwgUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKSk7CisgICAgICBmc3QgPSBuZXcgRlNUPExvbmc+KG5ldyBJbnB1dFN0cmVhbURhdGFJbnB1dChpcyksIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICBwcmlvckUgPSBpb2U7CiAgICAgfSBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS9kaWN0L1VzZXJEaWN0aW9uYXJ5LmphdmEgYi9sdWNlbmUvYW5hbHlzaXMva3Vyb21vamkvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvamEvZGljdC9Vc2VyRGljdGlvbmFyeS5qYXZhCmluZGV4IDNmZjVlNjQuLjEwZGYyMzUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS9kaWN0L1VzZXJEaWN0aW9uYXJ5LmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2t1cm9tb2ppL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2phL2RpY3QvVXNlckRpY3Rpb25hcnkuamF2YQpAQCAtODgsNyArODgsNyBAQAogICAgIExpc3Q8U3RyaW5nPiBkYXRhID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGZlYXR1cmVFbnRyaWVzLnNpemUoKSk7CiAgICAgTGlzdDxpbnRbXT4gc2VnbWVudGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8aW50W10+KGZlYXR1cmVFbnRyaWVzLnNpemUoKSk7CiAgICAgCi0gICAgUG9zaXRpdmVJbnRPdXRwdXRzIGZzdE91dHB1dCA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgUG9zaXRpdmVJbnRPdXRwdXRzIGZzdE91dHB1dCA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKICAgICBCdWlsZGVyPExvbmc+IGZzdEJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxMb25nPihGU1QuSU5QVVRfVFlQRS5CWVRFMiwgZnN0T3V0cHV0KTsKICAgICBJbnRzUmVmIHNjcmF0Y2ggPSBuZXcgSW50c1JlZigpOwogICAgIGxvbmcgb3JkID0gMDsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvdG9vbHMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS91dGlsL1Rva2VuSW5mb0RpY3Rpb25hcnlCdWlsZGVyLmphdmEgYi9sdWNlbmUvYW5hbHlzaXMva3Vyb21vamkvc3JjL3Rvb2xzL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvamEvdXRpbC9Ub2tlbkluZm9EaWN0aW9uYXJ5QnVpbGRlci5qYXZhCmluZGV4IGJlYzBjODcuLjI1M2JjODcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9rdXJvbW9qaS9zcmMvdG9vbHMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9qYS91dGlsL1Rva2VuSW5mb0RpY3Rpb25hcnlCdWlsZGVyLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL2t1cm9tb2ppL3NyYy90b29scy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL2phL3V0aWwvVG9rZW5JbmZvRGljdGlvbmFyeUJ1aWxkZXIuamF2YQpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgCiAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIGVuY29kZS4uLiIpOwogCi0gICAgUG9zaXRpdmVJbnRPdXRwdXRzIGZzdE91dHB1dCA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgUG9zaXRpdmVJbnRPdXRwdXRzIGZzdE91dHB1dCA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKICAgICBCdWlsZGVyPExvbmc+IGZzdEJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxMb25nPihGU1QuSU5QVVRfVFlQRS5CWVRFMiwgMCwgMCwgdHJ1ZSwgdHJ1ZSwgSW50ZWdlci5NQVhfVkFMVUUsIGZzdE91dHB1dCwgbnVsbCwgdHJ1ZSwgUGFja2VkSW50cy5ERUZBVUxULCB0cnVlLCAxNSk7CiAgICAgSW50c1JlZiBzY3JhdGNoID0gbmV3IEludHNSZWYoKTsKICAgICBsb25nIG9yZCA9IC0xOyAvLyBmaXJzdCBvcmQgd2lsbCBiZSAwCmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9pdnkueG1sIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvaXZ5LnhtbAppbmRleCA1ZDkzZWYzLi4wYzljMzM3IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9pdnkueG1sCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL2l2eS54bWwKQEAgLTE5LDkgKzE5LDkgQEAKIDxpdnktbW9kdWxlIHZlcnNpb249IjIuMCI+CiAgICAgPGluZm8gb3JnYW5pc2F0aW9uPSJvcmcuYXBhY2hlLmx1Y2VuZSIgbW9kdWxlPSJhbmFseXplcnMtbW9yZm9sb2dpayIvPgogICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5jYXJyb3QyIiBuYW1lPSJtb3Jmb2xvZ2lrLXBvbGlzaCIgcmV2PSIxLjUuNSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmNhcnJvdDIiIG5hbWU9Im1vcmZvbG9naWstZnNhIiByZXY9IjEuNS41IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgotICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuY2Fycm90MiIgbmFtZT0ibW9yZm9sb2dpay1zdGVtbWluZyIgcmV2PSIxLjUuNSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmNhcnJvdDIiIG5hbWU9Im1vcmZvbG9naWstcG9saXNoIiByZXY9IjEuNi4wIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuY2Fycm90MiIgbmFtZT0ibW9yZm9sb2dpay1mc2EiIHJldj0iMS42LjAiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5jYXJyb3QyIiBuYW1lPSJtb3Jmb2xvZ2lrLXN0ZW1taW5nIiByZXY9IjEuNi4wIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgogICAgICAgPGV4Y2x1ZGUgb3JnPSIqIiBleHQ9IioiIG1hdGNoZXI9InJlZ2V4cCIgdHlwZT0iJHtpdnkuZXhjbHVkZS50eXBlc30iLz4gCiAgICAgPC9kZXBlbmRlbmNpZXM+CiA8L2l2eS1tb2R1bGU+CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL01vcmZvbG9naWtBbmFseXplci5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3Jmb2xvZ2lrQW5hbHl6ZXIuamF2YQppbmRleCAwODFkYmU2Li42MjA1ZDM4IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL01vcmZvbG9naWtBbmFseXplci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9yZm9sb2dpa0FuYWx5emVyLmphdmEKQEAgLTI2LDM4ICsyNiwyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkVG9rZW5pemVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuVmVyc2lvbjsKIAotaW1wb3J0IG1vcmZvbG9naWsuc3RlbW1pbmcuUG9saXNoU3RlbW1lci5ESUNUSU9OQVJZOwotCiAvKioKICAqIHtAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcn0gdXNpbmcgTW9yZm9sb2dpayBsaWJyYXJ5LgogICogQHNlZSA8YSBocmVmPSJodHRwOi8vbW9yZm9sb2dpay5ibG9nc3BvdC5jb20vIj5Nb3Jmb2xvZ2lrIHByb2plY3QgcGFnZTwvYT4KICAqLwogcHVibGljIGNsYXNzIE1vcmZvbG9naWtBbmFseXplciBleHRlbmRzIEFuYWx5emVyIHsKLQotICBwcml2YXRlIGZpbmFsIERJQ1RJT05BUlkgZGljdGlvbmFyeTsKICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CiAKICAgLyoqCi0gICAqIEJ1aWxkcyBhbiBhbmFseXplciBmb3IgYSBnaXZlbiBQb2xpc2hTdGVtbWVyLkRJQ1RJT05BUlkgZW51bS4KKyAgICogQnVpbGRzIGFuIGFuYWx5emVyIHdpdGggdGhlIGRlZmF1bHQgTW9yZm9sb2dpaydzIGRpY3Rpb25hcnkgKHBvbGltb3JmKS4KICAgICogCi0gICAqIEBwYXJhbSB2ZXJzCi0gICAqICAgICAgICAgIGx1Y2VuZSBjb21wYXRpYmlsaXR5IHZlcnNpb24KLSAgICogQHBhcmFtIGRpY3QKLSAgICogICAgICAgICAgQSBjb25zdGFudCBzcGVjaWZ5aW5nIHdoaWNoIGRpY3Rpb25hcnkgdG8gY2hvb3NlLiBTZWUgdGhlCi0gICAqICAgICAgICAgIE1vcmZvbG9naWsgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvciB1c2UgdGhlIGRlZmF1bHQuCisgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAqICAgICAgICAgIEx1Y2VuZSBjb21wYXRpYmlsaXR5IHZlcnNpb24KICAgICovCi0gIHB1YmxpYyBNb3Jmb2xvZ2lrQW5hbHl6ZXIoZmluYWwgVmVyc2lvbiB2ZXJzLCBmaW5hbCBESUNUSU9OQVJZIGRpY3QpIHsKLSAgICB0aGlzLnZlcnNpb24gPSB2ZXJzOwotICAgIHRoaXMuZGljdGlvbmFyeSA9IGRpY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGRzIGFuIGFuYWx5emVyIGZvciBhbiBvcmlnaW5hbCBNT1JGT0xPR0lLIGRpY3Rpb25hcnkuCi0gICAqIAotICAgKiBAcGFyYW0gdmVycyAgICAgICAgIGx1Y2VuZSBjb21wYXRpYmlsaXR5IHZlcnNpb24KLSAgICovCi0gIHB1YmxpYyBNb3Jmb2xvZ2lrQW5hbHl6ZXIoZmluYWwgVmVyc2lvbiB2ZXJzKSB7Ci0gICAgdGhpcyh2ZXJzLCBESUNUSU9OQVJZLk1PUkZPTE9HSUspOworICBwdWJsaWMgTW9yZm9sb2dpa0FuYWx5emVyKGZpbmFsIFZlcnNpb24gdmVyc2lvbikgeworICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CiAgIH0KIAogICAvKioKQEAgLTc4LDcgKzYxLDcgQEAKICAgICBmaW5hbCBUb2tlbml6ZXIgc3JjID0gbmV3IFN0YW5kYXJkVG9rZW5pemVyKHRoaXMudmVyc2lvbiwgcmVhZGVyKTsKICAgICAKICAgICByZXR1cm4gbmV3IFRva2VuU3RyZWFtQ29tcG9uZW50cygKLSAgICAgIHNyYywKLSAgICAgIG5ldyBNb3Jmb2xvZ2lrRmlsdGVyKG5ldyBTdGFuZGFyZEZpbHRlcih0aGlzLnZlcnNpb24sIHNyYyksIHRoaXMuZGljdGlvbmFyeSwgdGhpcy52ZXJzaW9uKSk7CisgICAgICAgIHNyYywgCisgICAgICAgIG5ldyBNb3Jmb2xvZ2lrRmlsdGVyKG5ldyBTdGFuZGFyZEZpbHRlcih0aGlzLnZlcnNpb24sIHNyYyksIHRoaXMudmVyc2lvbikpOwogICB9CiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL01vcmZvbG9naWtGaWx0ZXIuamF2YSBiL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9yZm9sb2dpa0ZpbHRlci5qYXZhCmluZGV4IDViZTU2ZDIuLjA0OWRhZDEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9yZm9sb2dpa0ZpbHRlci5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9yZm9sb2dpa0ZpbHRlci5qYXZhCkBAIC0yMiwyMCArMjIsMjEgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IG1vcmZvbG9naWsuc3RlbW1pbmcuKjsKLWltcG9ydCBtb3Jmb2xvZ2lrLnN0ZW1taW5nLlBvbGlzaFN0ZW1tZXIuRElDVElPTkFSWTsKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnRva2VuYXR0cmlidXRlcy5DaGFyVGVybUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuS2V5d29yZEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5DaGFyYWN0ZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLio7CiAKIC8qKgotICoge0BsaW5rIFRva2VuRmlsdGVyfSB1c2luZyBNb3Jmb2xvZ2lrIGxpYnJhcnkuCisgKiB7QGxpbmsgVG9rZW5GaWx0ZXJ9IHVzaW5nIE1vcmZvbG9naWsgbGlicmFyeSB0byB0cmFuc2Zvcm0gaW5wdXQgdG9rZW5zIGludG8gbGVtbWEgYW5kCisgKiBtb3JwaG9zeW50YWN0aWMgKFBPUykgdG9rZW5zLiBBcHBsaWVzIHRvIFBvbGlzaCBvbmx5LiAgCiAgKgotICogTW9yZm9sb2dpa0ZpbHRlciBjb250YWlucyBhIHtAbGluayBNb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlfSwgd2hpY2ggcHJvdmlkZXMgbW9ycGhvc3ludGFjdGljCi0gKiBhbm5vdGF0aW9ucyBmb3IgcHJvZHVjZWQgbGVtbWFzLiBTZWUgdGhlIE1vcmZvbG9naWsgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyAqIDxwPk1vcmZvbG9naWtGaWx0ZXIgY29udGFpbnMgYSB7QGxpbmsgTW9ycGhvc3ludGFjdGljVGFnc0F0dHJpYnV0ZX0sIHdoaWNoIHByb3ZpZGVzIG1vcnBob3N5bnRhY3RpYworICogYW5ub3RhdGlvbnMgZm9yIHByb2R1Y2VkIGxlbW1hcy4gU2VlIHRoZSBNb3Jmb2xvZ2lrIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuPC9wPgogICogCiAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9tb3Jmb2xvZ2lrLmJsb2dzcG90LmNvbS8iPk1vcmZvbG9naWsgcHJvamVjdCBwYWdlPC9hPgogICovCkBAIC00NCw2ICs0NSw3IEBACiAgIHByaXZhdGUgZmluYWwgQ2hhclRlcm1BdHRyaWJ1dGUgdGVybUF0dCA9IGFkZEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CiAgIHByaXZhdGUgZmluYWwgTW9ycGhvc3ludGFjdGljVGFnc0F0dHJpYnV0ZSB0YWdzQXR0ID0gYWRkQXR0cmlidXRlKE1vcnBob3N5bnRhY3RpY1RhZ3NBdHRyaWJ1dGUuY2xhc3MpOwogICBwcml2YXRlIGZpbmFsIFBvc2l0aW9uSW5jcmVtZW50QXR0cmlidXRlIHBvc0luY3JBdHQgPSBhZGRBdHRyaWJ1dGUoUG9zaXRpb25JbmNyZW1lbnRBdHRyaWJ1dGUuY2xhc3MpOworICBwcml2YXRlIGZpbmFsIEtleXdvcmRBdHRyaWJ1dGUga2V5d29yZEF0dHIgPSBhZGRBdHRyaWJ1dGUoS2V5d29yZEF0dHJpYnV0ZS5jbGFzcyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBDaGFyc1JlZiBzY3JhdGNoID0gbmV3IENoYXJzUmVmKDApOwogICBwcml2YXRlIGZpbmFsIENoYXJhY3RlclV0aWxzIGNoYXJVdGlsczsKQEAgLTU4LDEzICs2MCwxMSBAQAogICBwcml2YXRlIGludCBsZW1tYUxpc3RJbmRleDsKIAogICAvKioKLSAgICogQnVpbGRzIGEgZmlsdGVyIGZvciBnaXZlbiBQb2xpc2hTdGVtbWVyLkRJQ1RJT05BUlkgZW51bS4KLSAgICogCisgICAqIENyZWF0ZXMgTW9yZm9sb2dpa0ZpbHRlcgogICAgKiBAcGFyYW0gaW4gICBpbnB1dCB0b2tlbiBzdHJlYW0KLSAgICogQHBhcmFtIGRpY3QgUG9saXNoU3RlbW1lci5ESUNUSU9OQVJZIGVudW0KICAgICogQHBhcmFtIHZlcnNpb24gTHVjZW5lIHZlcnNpb24gY29tcGF0aWJpbGl0eSBmb3IgbG93ZXJjYXNpbmcuCiAgICAqLwotICBwdWJsaWMgTW9yZm9sb2dpa0ZpbHRlcihmaW5hbCBUb2tlblN0cmVhbSBpbiwgZmluYWwgRElDVElPTkFSWSBkaWN0LCBmaW5hbCBWZXJzaW9uIHZlcnNpb24pIHsKKyAgcHVibGljIE1vcmZvbG9naWtGaWx0ZXIoZmluYWwgVG9rZW5TdHJlYW0gaW4sIGZpbmFsIFZlcnNpb24gdmVyc2lvbikgewogICAgIHN1cGVyKGluKTsKICAgICB0aGlzLmlucHV0ID0gaW47CiAgICAgCkBAIC03Myw3ICs3Myw3IEBACiAgICAgQ2xhc3NMb2FkZXIgY2wgPSBtZS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKICAgICB0cnkgewogICAgICAgbWUuc2V0Q29udGV4dENsYXNzTG9hZGVyKFBvbGlzaFN0ZW1tZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICB0aGlzLnN0ZW1tZXIgPSBuZXcgUG9saXNoU3RlbW1lcihkaWN0KTsKKyAgICAgIHRoaXMuc3RlbW1lciA9IG5ldyBQb2xpc2hTdGVtbWVyKCk7CiAgICAgICB0aGlzLmNoYXJVdGlscyA9IENoYXJhY3RlclV0aWxzLmdldEluc3RhbmNlKHZlcnNpb24pOwogICAgICAgdGhpcy5sZW1tYUxpc3QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9IGZpbmFsbHkgewpAQCAtODEsMjkgKzgxLDU3IEBACiAgICAgfSAgCiAgIH0KIAorICAvKioKKyAgICogVGhlIHRhZyBlbmNvZGluZyBmb3JtYXQgaGFzIGJlZW4gY2hhbmdpbmcgaW4gTW9yZm9sb2dpayBmcm9tIHZlcnNpb24KKyAgICogdG8gdmVyc2lvbi4gTGV0J3Mga2VlcCBib3RoIHZhcmlhbnRzIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lIHRvIHJ1bgorICAgKiBiYXNlZCBvbiB0aGlzIGZsYWcuCisgICAqLworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIG11bHRpcGxlVGFnc1BlckxlbW1hID0gdHJ1ZTsKKwogICBwcml2YXRlIHZvaWQgcG9wTmV4dExlbW1hKCkgewotICAgIC8vIENvbGxlY3QgYWxsIHRhZ3MgZm9yIHRoZSBuZXh0IHVuaXF1ZSBsZW1tYS4KLSAgICBDaGFyU2VxdWVuY2UgY3VycmVudFN0ZW07Ci0gICAgaW50IHRhZ3MgPSAwOwotICAgIGRvIHsKKyAgICBpZiAobXVsdGlwbGVUYWdzUGVyTGVtbWEpIHsKKyAgICAgIC8vIE9uZSB0YWcgKGNvbmNhdGVuYXRlZCkgcGVyIGxlbW1hLgogICAgICAgZmluYWwgV29yZERhdGEgbGVtbWEgPSBsZW1tYUxpc3QuZ2V0KGxlbW1hTGlzdEluZGV4KyspOwotICAgICAgY3VycmVudFN0ZW0gPSBsZW1tYS5nZXRTdGVtKCk7Ci0gICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGFnID0gbGVtbWEuZ2V0VGFnKCk7CisgICAgICB0ZXJtQXR0LnNldEVtcHR5KCkuYXBwZW5kKGxlbW1hLmdldFN0ZW0oKSk7CisgICAgICBDaGFyU2VxdWVuY2UgdGFnID0gbGVtbWEuZ2V0VGFnKCk7CiAgICAgICBpZiAodGFnICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHRhZ3NMaXN0LnNpemUoKSA8PSB0YWdzKSB7Ci0gICAgICAgICAgdGFnc0xpc3QuYWRkKG5ldyBTdHJpbmdCdWlsZGVyKCkpOworICAgICAgICBTdHJpbmdbXSB0YWdzID0gdGFnLnRvU3RyaW5nKCkuc3BsaXQoIlxcK3xcXHwiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgaWYgKHRhZ3NMaXN0LnNpemUoKSA8PSBpKSB7CisgICAgICAgICAgICB0YWdzTGlzdC5hZGQobmV3IFN0cmluZ0J1aWxkZXIoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gdGFnc0xpc3QuZ2V0KGkpOworICAgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0YWdzW2ldKTsKICAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gdGFnc0xpc3QuZ2V0KHRhZ3MrKyk7ICAKLSAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChsZW1tYS5nZXRUYWcoKSk7CisgICAgICAgIHRhZ3NBdHQuc2V0VGFncyh0YWdzTGlzdC5zdWJMaXN0KDAsIHRhZ3MubGVuZ3RoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWdzQXR0LnNldFRhZ3MoQ29sbGVjdGlvbnMuPFN0cmluZ0J1aWxkZXI+IGVtcHR5TGlzdCgpKTsKICAgICAgIH0KLSAgICB9IHdoaWxlIChsZW1tYUxpc3RJbmRleCA8IGxlbW1hTGlzdC5zaXplKCkgJiYKLSAgICAgICAgICAgICBlcXVhbENoYXJTZXF1ZW5jZXMobGVtbWFMaXN0LmdldChsZW1tYUxpc3RJbmRleCkuZ2V0U3RlbSgpLCBjdXJyZW50U3RlbSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPbmUgdGFnIChjb25jYXRlbmF0ZWQpIHBlciBzdGVtIChsZW1tYSByZXBlYXRlZCkuCisgICAgICBDaGFyU2VxdWVuY2UgY3VycmVudFN0ZW07CisgICAgICBpbnQgdGFncyA9IDA7CisgICAgICBkbyB7CisgICAgICAgIGZpbmFsIFdvcmREYXRhIGxlbW1hID0gbGVtbWFMaXN0LmdldChsZW1tYUxpc3RJbmRleCsrKTsKKyAgICAgICAgY3VycmVudFN0ZW0gPSBsZW1tYS5nZXRTdGVtKCk7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSB0YWcgPSBsZW1tYS5nZXRUYWcoKTsKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKHRhZ3NMaXN0LnNpemUoKSA8PSB0YWdzKSB7CisgICAgICAgICAgICB0YWdzTGlzdC5hZGQobmV3IFN0cmluZ0J1aWxkZXIoKSk7CisgICAgICAgICAgfQorICAKKyAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IHRhZ3NMaXN0LmdldCh0YWdzKyspOyAgCisgICAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgICBidWZmZXIuYXBwZW5kKGxlbW1hLmdldFRhZygpKTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAobGVtbWFMaXN0SW5kZXggPCBsZW1tYUxpc3Quc2l6ZSgpICYmCisgICAgICAgICAgICAgICBlcXVhbENoYXJTZXF1ZW5jZXMobGVtbWFMaXN0LmdldChsZW1tYUxpc3RJbmRleCkuZ2V0U3RlbSgpLCBjdXJyZW50U3RlbSkpOwogCi0gICAgLy8gU2V0IHRoZSBsZW1tYSdzIGJhc2UgZm9ybSBhbmQgdGFncyBhcyBhdHRyaWJ1dGVzLgotICAgIHRlcm1BdHQuc2V0RW1wdHkoKS5hcHBlbmQoY3VycmVudFN0ZW0pOwotICAgIHRhZ3NBdHQuc2V0VGFncyh0YWdzTGlzdC5zdWJMaXN0KDAsIHRhZ3MpKTsKKyAgICAgIC8vIFNldCB0aGUgbGVtbWEncyBiYXNlIGZvcm0gYW5kIHRhZ3MgYXMgYXR0cmlidXRlcy4KKyAgICAgIHRlcm1BdHQuc2V0RW1wdHkoKS5hcHBlbmQoY3VycmVudFN0ZW0pOworICAgICAgdGFnc0F0dC5zZXRUYWdzKHRhZ3NMaXN0LnN1Ykxpc3QoMCwgdGFncykpOworICAgIH0KICAgfQogCiAgIC8qKgpAQCAtMTQwLDcgKzE2OCw4IEBACiAgICAgICBwb3BOZXh0TGVtbWEoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dC5pbmNyZW1lbnRUb2tlbigpKSB7Ci0gICAgICBpZiAobG9va3VwU3VyZmFjZUZvcm0odGVybUF0dCkgfHwgbG9va3VwU3VyZmFjZUZvcm0odG9Mb3dlcmNhc2UodGVybUF0dCkpKSB7CisgICAgICBpZiAoIWtleXdvcmRBdHRyLmlzS2V5d29yZCgpICYmIAorICAgICAgICAgIChsb29rdXBTdXJmYWNlRm9ybSh0ZXJtQXR0KSB8fCBsb29rdXBTdXJmYWNlRm9ybSh0b0xvd2VyY2FzZSh0ZXJtQXR0KSkpKSB7CiAgICAgICAgIGN1cnJlbnQgPSBjYXB0dXJlU3RhdGUoKTsKICAgICAgICAgcG9wTmV4dExlbW1hKCk7CiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeS5qYXZhCmluZGV4IDNhYmVkYjIuLjM4OGE0NDEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL01vcmZvbG9naWtGaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTE3LDEyICsxNyw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBtb3Jmb2xvZ2lrLnN0ZW1taW5nLlBvbGlzaFN0ZW1tZXIuRElDVElPTkFSWTsKLQogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5GaWx0ZXJGYWN0b3J5OwogCkBAIC0zMiwzOSArMjgsMjggQEAKICAqICZsdDtmaWVsZFR5cGUgbmFtZT0idGV4dF9wb2xpc2giIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCImZ3Q7CiAgKiAgICZsdDthbmFseXplciZndDsKICAqICAgICAmbHQ7dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8mZ3Q7Ci0gKiAgICAgJmx0O2ZpbHRlciBjbGFzcz0ic29sci5Nb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeSIgZGljdGlvbmFyeT0iTU9SRk9MT0dJSyIgLyZndDsKKyAqICAgICAmbHQ7ZmlsdGVyIGNsYXNzPSJzb2xyLk1vcmZvbG9naWtGaWx0ZXJGYWN0b3J5IiAvJmd0OwogICogICAmbHQ7L2FuYWx5emVyJmd0OwogICogJmx0Oy9maWVsZFR5cGUmZ3Q7PC9wcmU+CiAgKiAKLSAqIDxwPkFueSBvZiBNb3Jmb2xvZ2lrIGRpY3Rpb25hcmllcyBjYW4gYmUgdXNlZCwgdGhlc2UgYXJlIGF0IHRoZSBtb21lbnQ6Ci0gKiA8Y29kZT5NT1JGT0xPR0lLPC9jb2RlPiAoTW9yZm9sb2dpaydzIG9yaWdpbmFsIGRpY3Rpb25hcnkpLAotICogPGNvZGU+TU9SRkVVU1o8L2NvZGU+IChNb3JmZXVzei1TSUFUKSwKLSAqIDxjb2RlPkNPTUJJTkVEPC9jb2RlPiAoYm90aCBvZiB0aGUgZGljdGlvbmFyaWVzIGFib3ZlLCBjb21iaW5lZCkuCi0gKiAKICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL21vcmZvbG9naWsuYmxvZ3Nwb3QuY29tLyI+TW9yZm9sb2dpayB3ZWIgc2l0ZTwvYT4KICAqLwogcHVibGljIGNsYXNzIE1vcmZvbG9naWtGaWx0ZXJGYWN0b3J5IGV4dGVuZHMgVG9rZW5GaWx0ZXJGYWN0b3J5IHsKLSAgLyoqIERpY3Rpb25hcnkuICovCi0gIHByaXZhdGUgRElDVElPTkFSWSBkaWN0aW9uYXJ5ID0gRElDVElPTkFSWS5NT1JGT0xPR0lLOwotICAKICAgLyoqIFNjaGVtYSBhdHRyaWJ1dGUuICovCisgIEBEZXByZWNhdGVkCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQ1RJT05BUllfU0NIRU1BX0FUVFJJQlVURSA9ICJkaWN0aW9uYXJ5IjsKLSAgCisKICAgLyoqIENyZWF0ZXMgYSBuZXcgTW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkgKi8KICAgcHVibGljIE1vcmZvbG9naWtGaWx0ZXJGYWN0b3J5KE1hcDxTdHJpbmcsU3RyaW5nPiBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CisKKyAgICAvLyBCZSBzcGVjaWZpYyBhYm91dCBuby1sb25nZXItc3VwcG9ydGVkIGRpY3Rpb25hcnkgYXR0cmlidXRlLgogICAgIFN0cmluZyBkaWN0aW9uYXJ5TmFtZSA9IGdldChhcmdzLCBESUNUSU9OQVJZX1NDSEVNQV9BVFRSSUJVVEUpOwogICAgIGlmIChkaWN0aW9uYXJ5TmFtZSAhPSBudWxsICYmICFkaWN0aW9uYXJ5TmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIERJQ1RJT05BUlkgZGljdGlvbmFyeSA9IERJQ1RJT05BUlkudmFsdWVPZihkaWN0aW9uYXJ5TmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuUk9PVCkpOwotICAgICAgICBhc3NlcnQgZGljdGlvbmFyeSAhPSBudWxsOwotICAgICAgICB0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5OwotICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBESUNUSU9OQVJZX1NDSEVNQV9BVFRSSUJVVEUgKyAiIGF0dHJpYnV0ZSBhY2NlcHRzIHRoZSAiCi0gICAgICAgICAgICArICJmb2xsb3dpbmcgY29uc3RhbnRzOiAiICsgQXJyYXlzLnRvU3RyaW5nKERJQ1RJT05BUlkudmFsdWVzKCkpICsgIiwgdGhpcyB2YWx1ZSBpcyBpbnZhbGlkOiAiICAKLSAgICAgICAgICAgICsgZGljdGlvbmFyeU5hbWUpOwotICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBESUNUSU9OQVJZX1NDSEVNQV9BVFRSSUJVVEUgKyAiIGF0dHJpYnV0ZSBpcyBubyAiCisgICAgICAgICAgKyAibG9uZ2VyIHN1cHBvcnRlZCAoTW9yZm9sb2dpayBoYXMgb25lIGRpY3Rpb25hcnkpOiAiICsgZGljdGlvbmFyeU5hbWUpOwogICAgIH0KKwogICAgIGlmICghYXJncy5pc0VtcHR5KCkpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcGFyYW1ldGVyczogIiArIGFyZ3MpOwogICAgIH0KQEAgLTcyLDYgKzU3LDYgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFRva2VuU3RyZWFtIGNyZWF0ZShUb2tlblN0cmVhbSB0cykgewotICAgIHJldHVybiBuZXcgTW9yZm9sb2dpa0ZpbHRlcih0cywgZGljdGlvbmFyeSwgbHVjZW5lTWF0Y2hWZXJzaW9uKTsKKyAgICByZXR1cm4gbmV3IE1vcmZvbG9naWtGaWx0ZXIodHMsIGx1Y2VuZU1hdGNoVmVyc2lvbik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvTW9ycGhvc3ludGFjdGljVGFnc0F0dHJpYnV0ZS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlLmphdmEKaW5kZXggMjk1MTQ4OC4uMTE3YmU3OCAxMDA2NDQKLS0tIGEvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlLmphdmEKKysrIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9Nb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlLmphdmEKQEAgLTIzLDkgKzIzLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkF0dHJpYnV0ZTsKIAogLyoqIAotICogTW9yZm9sb2dpayBkaWN0aW9uYXJpZXMgcHJvdmlkZSBtb3JwaG9zeW50YWN0aWMgYW5ub3RhdGlvbnMgZm9yCisgKiBNb3Jmb2xvZ2lrIHByb3ZpZGVzIG1vcnBob3N5bnRhY3RpYyBhbm5vdGF0aW9ucyBmb3IKICAqIHN1cmZhY2UgZm9ybXMuIEZvciB0aGUgZXhhY3QgZm9ybWF0IGFuZCBkZXNjcmlwdGlvbiBvZiB0aGVzZSwKLSAqIHNlZSB0aGUgcHJvamVjdCdzIGRvY3VtZW50YXRpb24gKGFubm90YXRpb25zIHZhcnkgYnkgZGljdGlvbmFyeSEpLgorICogc2VlIHRoZSBwcm9qZWN0J3MgZG9jdW1lbnRhdGlvbi4KICAqLwogcHVibGljIGludGVyZmFjZSBNb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlIHsKICAgLyoqIApAQCAtMzYsNyArMzYsOSBAQAogICBwdWJsaWMgdm9pZCBzZXRUYWdzKExpc3Q8U3RyaW5nQnVpbGRlcj4gdGFncyk7CiAKICAgLyoqIAotICAgKiBSZXR1cm5zIHRoZSBQT1MgdGFnIG9mIHRoZSB0ZXJtLgorICAgKiBSZXR1cm5zIHRoZSBQT1MgdGFnIG9mIHRoZSB0ZXJtLiBBIHNpbmdsZSB3b3JkIG1heSBoYXZlIG11bHRpcGxlIFBPUyB0YWdzLCAKKyAgICogZGVwZW5kaW5nIG9uIHRoZSBpbnRlcnByZXRhdGlvbiAoY29udGV4dCBkaXNhbWJpZ3VhdGlvbiBpcyB0eXBpY2FsbHkgbmVlZGVkCisgICAqIHRvIGRldGVybWluZSB3aGljaCBwYXJ0aWN1bGFyIHRhZyBpcyBhcHByb3ByaWF0ZSkuICAKICAgICovCiAgIHB1YmxpYyBMaXN0PFN0cmluZ0J1aWxkZXI+IGdldFRhZ3MoKTsKIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9UZXN0TW9yZm9sb2dpa0FuYWx5emVyLmphdmEgYi9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL1Rlc3RNb3Jmb2xvZ2lrQW5hbHl6ZXIuamF2YQppbmRleCBhOGMxNmQzLi43NDkwY2FhIDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL1Rlc3RNb3Jmb2xvZ2lrQW5hbHl6ZXIuamF2YQorKysgYi9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL1Rlc3RNb3Jmb2xvZ2lrQW5hbHl6ZXIuamF2YQpAQCAtMTgsMTEgKzE4LDIwIEBACiAgKi8KIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy4qOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkJhc2VUb2tlblN0cmVhbVRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5taXNjZWxsYW5lb3VzLlNldEtleXdvcmRNYXJrZXJGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRUb2tlbml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudG9rZW5hdHRyaWJ1dGVzLkNoYXJUZXJtQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuQ2hhckFycmF5U2V0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuVmVyc2lvbjsKIAogLyoqCiAgKiBUT0RPOiBUaGUgdGVzdHMgYmVsb3cgcmVseSBvbiB0aGUgb3JkZXIgb2YgcmV0dXJuZWQgbGVtbWFzLCB3aGljaCBpcyBwcm9iYWJseSBub3QgZ29vZC4gCkBAIC01NiwxMCArNjUsMjIgQEAKICAgICBhc3NlcnRBbmFseXplc1RvUmV1c2UoCiAgICAgICAgIGEsCiAgICAgICAgICJULiBHbFx1MDBGQ2Nrc2JlcmciLAotICAgICAgICBuZXcgU3RyaW5nW10geyAidG8iLCAidG9tIiwgInRvbmEiLCAiR2xcdTAwRkNja3NiZXJnIiB9LAotICAgICAgICBuZXcgaW50W10geyAwLCAwLCAwLCAzICB9LAotICAgICAgICBuZXcgaW50W10geyAxLCAxLCAxLCAxMyB9LAotICAgICAgICBuZXcgaW50W10geyAxLCAwLCAwLCAxICB9KTsKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgInRvbSIsICJ0b25hIiwgIkdsXHUwMEZDY2tzYmVyZyIgfSwKKyAgICAgICAgbmV3IGludFtdIHsgMCwgMCwgMyAgfSwKKyAgICAgICAgbmV3IGludFtdIHsgMSwgMSwgMTMgfSwKKyAgICAgICAgbmV3IGludFtdIHsgMSwgMCwgMSAgfSk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSB2b2lkIGR1bXBUb2tlbnMoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRva2VuU3RyZWFtIHRzID0gZ2V0VGVzdEFuYWx5emVyKCkudG9rZW5TdHJlYW0oImR1bW15IiwgbmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOworICAgIHRzLnJlc2V0KCk7CisKKyAgICBNb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRzLmdldEF0dHJpYnV0ZShNb3JwaG9zeW50YWN0aWNUYWdzQXR0cmlidXRlLmNsYXNzKTsKKyAgICBDaGFyVGVybUF0dHJpYnV0ZSBjaGFyVGVybSA9IHRzLmdldEF0dHJpYnV0ZShDaGFyVGVybUF0dHJpYnV0ZS5jbGFzcyk7CisgICAgd2hpbGUgKHRzLmluY3JlbWVudFRva2VuKCkpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjaGFyVGVybS50b1N0cmluZygpICsgIiA9PiAiICsgYXR0cmlidXRlLmdldFRhZ3MoKSk7CisgICAgfQogICB9CiAKICAgLyoqIFRlc3QgcmV1c2Ugb2YgTW9yZm9sb2dpa0ZpbHRlciB3aXRoIGxlZnRvdmVyIHN0ZW1zLiAqLwpAQCAtMTQ0LDYgKzE2NSwzNCBAQAogICAgIHRzLmNsb3NlKCk7CiAgIH0KIAorICAvKiogKi8KKyAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEtleXdvcmRBdHRyVG9rZW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBURVNUX1ZFUlNJT05fQ1VSUkVOVDsKKworICAgIEFuYWx5emVyIGEgPSBuZXcgTW9yZm9sb2dpa0FuYWx5emVyKHZlcnNpb24pIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIFRva2VuU3RyZWFtQ29tcG9uZW50cyBjcmVhdGVDb21wb25lbnRzKFN0cmluZyBmaWVsZCwgUmVhZGVyIHJlYWRlcikgeworICAgICAgICBmaW5hbCBDaGFyQXJyYXlTZXQga2V5d29yZHMgPSBuZXcgQ2hhckFycmF5U2V0KHZlcnNpb24sIDEsIGZhbHNlKTsKKyAgICAgICAga2V5d29yZHMuYWRkKCJsacWbY2llIik7CisKKyAgICAgICAgZmluYWwgVG9rZW5pemVyIHNyYyA9IG5ldyBTdGFuZGFyZFRva2VuaXplcihURVNUX1ZFUlNJT05fQ1VSUkVOVCwgcmVhZGVyKTsKKyAgICAgICAgVG9rZW5TdHJlYW0gcmVzdWx0ID0gbmV3IFN0YW5kYXJkRmlsdGVyKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBzcmMpOworICAgICAgICByZXN1bHQgPSBuZXcgU2V0S2V5d29yZE1hcmtlckZpbHRlcihyZXN1bHQsIGtleXdvcmRzKTsKKyAgICAgICAgcmVzdWx0ID0gbmV3IE1vcmZvbG9naWtGaWx0ZXIocmVzdWx0LCBURVNUX1ZFUlNJT05fQ1VSUkVOVCk7IAorCisgICAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1Db21wb25lbnRzKHNyYywgcmVzdWx0KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0QW5hbHl6ZXNUb1JldXNlKAorICAgICAgYSwKKyAgICAgICJsacWbY2llIGRhbnljaCIsCisgICAgICBuZXcgU3RyaW5nW10geyAibGnFm2NpZSIsICJkYW55IiwgImRhbmEiLCAiZGFuZSIsICJkYcSHIiB9LAorICAgICAgbmV3IGludFtdIHsgMCwgNywgNywgNywgNyB9LAorICAgICAgbmV3IGludFtdIHsgNiwgMTMsIDEzLCAxMywgMTMgfSwKKyAgICAgIG5ldyBpbnRbXSB7IDEsIDEsIDAsIDAsIDAgfSk7CisgIH0KKwogICAvKiogYmxhc3Qgc29tZSByYW5kb20gc3RyaW5ncyB0aHJvdWdoIHRoZSBhbmFseXplciAqLwogICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgY2hlY2tSYW5kb21EYXRhKHJhbmRvbSgpLCBnZXRUZXN0QW5hbHl6ZXIoKSwgMTAwMCAqIFJBTkRPTV9NVUxUSVBMSUVSKTsgCmRpZmYgLS1naXQgYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL1Rlc3RNb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeS5qYXZhIGIvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9UZXN0TW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkuamF2YQppbmRleCA5YWRjNWE1Li41MDA4NWE5IDEwMDY0NAotLS0gYS9sdWNlbmUvYW5hbHlzaXMvbW9yZm9sb2dpay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL1Rlc3RNb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeS5qYXZhCisrKyBiL2x1Y2VuZS9hbmFseXNpcy9tb3Jmb2xvZ2lrL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2FuYWx5c2lzL21vcmZvbG9naWsvVGVzdE1vcmZvbG9naWtGaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTE4LDggKzE4LDggQEAKICAqLwogCiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5CYXNlVG9rZW5TdHJlYW1UZXN0Q2FzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrVG9rZW5pemVyOwpAQCAtMzEsMTAgKzMxLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0TW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVG9rZW5TdHJlYW1UZXN0Q2FzZSB7CiAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaWN0aW9uYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoInJvd2VyeSBiaWxldHkiKTsKLSAgICBNYXA8U3RyaW5nLFN0cmluZz4gaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gICAgaW5pdFBhcmFtcy5wdXQoTW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkuRElDVElPTkFSWV9TQ0hFTUFfQVRUUklCVVRFLAotICAgICAgICAibW9yZm9sb2dpayIpOwotICAgIE1vcmZvbG9naWtGaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgTW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkoaW5pdFBhcmFtcyk7CisgICAgTW9yZm9sb2dpa0ZpbHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBNb3Jmb2xvZ2lrRmlsdGVyRmFjdG9yeShDb2xsZWN0aW9ucy48U3RyaW5nLFN0cmluZz5lbXB0eU1hcCgpKTsKICAgICBUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgTW9ja1Rva2VuaXplcihyZWFkZXIsIE1vY2tUb2tlbml6ZXIuV0hJVEVTUEFDRSwgZmFsc2UpOwogICAgIHN0cmVhbSA9IGZhY3RvcnkuY3JlYXRlKHN0cmVhbSk7CiAgICAgYXNzZXJ0VG9rZW5TdHJlYW1Db250ZW50cyhzdHJlYW0sIG5ldyBTdHJpbmdbXSB7InJvd2VyIiwgImJpbGV0In0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2JlbmNobWFyay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9iZW5jaG1hcmsvYnlUYXNrL3Rhc2tzL0NyZWF0ZUluZGV4VGFzay5qYXZhIGIvbHVjZW5lL2JlbmNobWFyay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9iZW5jaG1hcmsvYnlUYXNrL3Rhc2tzL0NyZWF0ZUluZGV4VGFzay5qYXZhCmluZGV4IDdmOGM5OTQuLjI0MDg3YWEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9iZW5jaG1hcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvYmVuY2htYXJrL2J5VGFzay90YXNrcy9DcmVhdGVJbmRleFRhc2suamF2YQorKysgYi9sdWNlbmUvYmVuY2htYXJrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2JlbmNobWFyay9ieVRhc2svdGFza3MvQ3JlYXRlSW5kZXhUYXNrLmphdmEKQEAgLTExOSwxNCArMTE5LDkgQEAKICAgICAgIAogICAgICAgaWYgKG1lcmdlU2NoZWR1bGVyLmVxdWFscygib3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyIikpIHsKICAgICAgICAgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyIGNtcyA9IChDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIpIGl3Q29uZi5nZXRNZXJnZVNjaGVkdWxlcigpOwotICAgICAgICBpbnQgdiA9IGNvbmZpZy5nZXQoImNvbmN1cnJlbnQubWVyZ2Uuc2NoZWR1bGVyLm1heC50aHJlYWQuY291bnQiLCAtMSk7Ci0gICAgICAgIGlmICh2ICE9IC0xKSB7Ci0gICAgICAgICAgY21zLnNldE1heFRocmVhZENvdW50KHYpOwotICAgICAgICB9Ci0gICAgICAgIHYgPSBjb25maWcuZ2V0KCJjb25jdXJyZW50Lm1lcmdlLnNjaGVkdWxlci5tYXgubWVyZ2UuY291bnQiLCAtMSk7Ci0gICAgICAgIGlmICh2ICE9IC0xKSB7Ci0gICAgICAgICAgY21zLnNldE1heE1lcmdlQ291bnQodik7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IG1heFRocmVhZENvdW50ID0gY29uZmlnLmdldCgiY29uY3VycmVudC5tZXJnZS5zY2hlZHVsZXIubWF4LnRocmVhZC5jb3VudCIsIENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlci5ERUZBVUxUX01BWF9USFJFQURfQ09VTlQpOworICAgICAgICBpbnQgbWF4TWVyZ2VDb3VudCA9IGNvbmZpZy5nZXQoImNvbmN1cnJlbnQubWVyZ2Uuc2NoZWR1bGVyLm1heC5tZXJnZS5jb3VudCIsIENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlci5ERUZBVUxUX01BWF9NRVJHRV9DT1VOVCk7CisgICAgICAgIGNtcy5zZXRNYXhNZXJnZXNBbmRUaHJlYWRzKG1heE1lcmdlQ291bnQsIG1heFRocmVhZENvdW50KTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE1MSwxMyArMTQ2LDEwIEBACiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5hYmxlIHRvIGluc3RhbnRpYXRlIGNsYXNzICciICsgbWVyZ2VQb2xpY3kgKyAiJyBhcyBtZXJnZSBwb2xpY3kiLCBlKTsKICAgICAgIH0KKyAgICAgIGl3Q29uZi5nZXRNZXJnZVBvbGljeSgpLnNldE5vQ0ZTUmF0aW8oaXNDb21wb3VuZCA/IDEuMCA6IDAuMCk7CiAgICAgICBpZihpd0NvbmYuZ2V0TWVyZ2VQb2xpY3koKSBpbnN0YW5jZW9mIExvZ01lcmdlUG9saWN5KSB7CiAgICAgICAgIExvZ01lcmdlUG9saWN5IGxvZ01lcmdlUG9saWN5ID0gKExvZ01lcmdlUG9saWN5KSBpd0NvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICAgICAgbG9nTWVyZ2VQb2xpY3kuc2V0VXNlQ29tcG91bmRGaWxlKGlzQ29tcG91bmQpOwogICAgICAgICBsb2dNZXJnZVBvbGljeS5zZXRNZXJnZUZhY3Rvcihjb25maWcuZ2V0KCJtZXJnZS5mYWN0b3IiLE9wZW5JbmRleFRhc2suREVGQVVMVF9NRVJHRV9QRkFDVE9SKSk7Ci0gICAgICB9IGVsc2UgaWYoaXdDb25mLmdldE1lcmdlUG9saWN5KCkgaW5zdGFuY2VvZiBUaWVyZWRNZXJnZVBvbGljeSkgewotICAgICAgICBUaWVyZWRNZXJnZVBvbGljeSB0aWVyZWRNZXJnZVBvbGljeSA9IChUaWVyZWRNZXJnZVBvbGljeSkgaXdDb25mLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgICAgIHRpZXJlZE1lcmdlUG9saWN5LnNldFVzZUNvbXBvdW5kRmlsZShpc0NvbXBvdW5kKTsKICAgICAgIH0KICAgICB9CiAgICAgZmluYWwgZG91YmxlIHJhbUJ1ZmZlciA9IGNvbmZpZy5nZXQoInJhbS5mbHVzaC5tYiIsT3BlbkluZGV4VGFzay5ERUZBVUxUX1JBTV9GTFVTSF9NQik7CmRpZmYgLS1naXQgYS9sdWNlbmUvYmVuY2htYXJrL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2JlbmNobWFyay9ieVRhc2svVGVzdFBlcmZUYXNrc0xvZ2ljLmphdmEgYi9sdWNlbmUvYmVuY2htYXJrL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2JlbmNobWFyay9ieVRhc2svVGVzdFBlcmZUYXNrc0xvZ2ljLmphdmEKaW5kZXggNWYwZWFlOS4uNmIxMWZmZCAxMDA3NTUKLS0tIGEvbHVjZW5lL2JlbmNobWFyay9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9iZW5jaG1hcmsvYnlUYXNrL1Rlc3RQZXJmVGFza3NMb2dpYy5qYXZhCisrKyBiL2x1Y2VuZS9iZW5jaG1hcmsvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvYmVuY2htYXJrL2J5VGFzay9UZXN0UGVyZlRhc2tzTG9naWMuamF2YQpAQCAtNDksNiArNDksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkxvZ0RvY01lcmdlUG9saWN5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkxvZ01lcmdlUG9saWN5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lk1lcmdlUG9saWN5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lk11bHRpRmllbGRzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlNlZ21lbnRJbmZvczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TZXJpYWxNZXJnZVNjaGVkdWxlcjsKQEAgLTc1NCw3ICs3NTUsNyBAQAogICAgIGFzc2VydEVxdWFscygyLCB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWF4QnVmZmVyZWREb2NzKCkpOwogICAgIGFzc2VydEVxdWFscyhJbmRleFdyaXRlckNvbmZpZy5ESVNBQkxFX0FVVE9fRkxVU0gsIChpbnQpIHdyaXRlci5nZXRDb25maWcoKS5nZXRSQU1CdWZmZXJTaXplTUIoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDMsICgoTG9nTWVyZ2VQb2xpY3kpIHdyaXRlci5nZXRDb25maWcoKS5nZXRNZXJnZVBvbGljeSgpKS5nZXRNZXJnZUZhY3RvcigpKTsKLSAgICBhc3NlcnRGYWxzZSgoKExvZ01lcmdlUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKSkuZ2V0VXNlQ29tcG91bmRGaWxlKCkpOworICAgIGFzc2VydEVxdWFscygwLjBkLCB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKS5nZXROb0NGU1JhdGlvKCksIDAuMCk7CiAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgRGlyZWN0b3J5IGRpciA9IGJlbmNobWFyay5nZXRSdW5EYXRhKCkuZ2V0RGlyZWN0b3J5KCk7CiAgICAgSW5kZXhSZWFkZXIgcmVhZGVyID0gRGlyZWN0b3J5UmVhZGVyLm9wZW4oZGlyKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9idWlsZC54bWwgYi9sdWNlbmUvYnVpbGQueG1sCmluZGV4IGZjNzNjZWQuLmIwMmVjNmUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9idWlsZC54bWwKKysrIGIvbHVjZW5lL2J1aWxkLnhtbApAQCAtMTgzLDcgKzE4MywxMCBAQAogICAgIDxmb3JiaWRkZW4tYXBpcyBpbnRlcm5hbFJ1bnRpbWVGb3JiaWRkZW49InRydWUiIGNsYXNzcGF0aHJlZj0iZm9yYmlkZGVuLWFwaXMuY2xhc3NwYXRoIj4KICAgICAgIDxidW5kbGVkU2lnbmF0dXJlcyBuYW1lPSJqZGstdW5zYWZlLSR7amF2YWMudGFyZ2V0fSIvPgogICAgICAgPGJ1bmRsZWRTaWduYXR1cmVzIG5hbWU9Impkay1kZXByZWNhdGVkLSR7amF2YWMudGFyZ2V0fSIvPgotICAgICAgPHNpZ25hdHVyZXNGaWxlU2V0IGZpbGU9IiR7Y29tbW9uLmRpcn0vdG9vbHMvZm9yYmlkZGVuQXBpcy9leGVjdXRvcnMudHh0Ii8+CisgICAgICA8c2lnbmF0dXJlc0ZpbGVTZXQgZGlyPSIke2NvbW1vbi5kaXJ9L3Rvb2xzL2ZvcmJpZGRlbkFwaXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJleGVjdXRvcnMudHh0IiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjaGFycy50eHQiIC8+CisgICAgICA8L3NpZ25hdHVyZXNGaWxlU2V0PgogICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2J1aWxkIiBpbmNsdWRlcz0iKiovKi5jbGFzcyIgLz4KICAgICA8L2ZvcmJpZGRlbi1hcGlzPgogICA8L3RhcmdldD4KQEAgLTM0NSw3ICszNDgsNyBAQAogICA8L3RhcmdldD4KIAogICA8IS0tIHJhdC1zb3VyY2VzLXR5cGVkZWYgaXMgKm5vdCogYSB1c2VsZXNzIGRlcGVuZGVuY3kuIGRvIG5vdCByZW1vdmUgLS0+Ci0gIDx0YXJnZXQgbmFtZT0icmF0LXNvdXJjZXMiIGRlcGVuZHM9InJhdC1zb3VyY2VzLXR5cGVkZWYiPgorICA8dGFyZ2V0IG5hbWU9InJhdC1zb3VyY2VzIiBkZXBlbmRzPSJyYXQtc291cmNlcy10eXBlZGVmLGNvbW1vbi5yYXQtc291cmNlcyI+CiAgICAgPHN1YmFudCB0YXJnZXQ9InJhdC1zb3VyY2VzIiBmYWlsb25lcnJvcj0idHJ1ZSIgaW5oZXJpdGFsbD0iZmFsc2UiPgogICAgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJ1cHRvZGF0ZS5hbmQuY29tcGlsZWQucHJvcGVydGllcyIvPgogICAgICAgPGZpbGVzZXQgZGlyPSJjb3JlIiBpbmNsdWRlcz0iYnVpbGQueG1sIi8+CmRpZmYgLS1naXQgYS9sdWNlbmUvY29kZWNzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9ibG9ja3Rlcm1zL1ZhcmlhYmxlR2FwVGVybXNJbmRleFJlYWRlci5qYXZhIGIvbHVjZW5lL2NvZGVjcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvYmxvY2t0ZXJtcy9WYXJpYWJsZUdhcFRlcm1zSW5kZXhSZWFkZXIuamF2YQppbmRleCA1MzJjOWU2Li42OTc1ZjI2IDEwMDY0NAotLS0gYS9sdWNlbmUvY29kZWNzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9ibG9ja3Rlcm1zL1ZhcmlhYmxlR2FwVGVybXNJbmRleFJlYWRlci5qYXZhCisrKyBiL2x1Y2VuZS9jb2RlY3Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2Jsb2NrdGVybXMvVmFyaWFibGVHYXBUZXJtc0luZGV4UmVhZGVyLmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqIEBsdWNlbmUuZXhwZXJpbWVudGFsICovCiBwdWJsaWMgY2xhc3MgVmFyaWFibGVHYXBUZXJtc0luZGV4UmVhZGVyIGV4dGVuZHMgVGVybXNJbmRleFJlYWRlckJhc2UgewogCi0gIHByaXZhdGUgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIGZzdE91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHRydWUpOworICBwcml2YXRlIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBmc3RPdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICBwcml2YXRlIGludCBpbmRleERpdmlzb3I7CiAKICAgLy8gQ2xvc2VkIGlmIGluZGV4TG9hZGVkIGlzIHRydWU6CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgICAgaWYgKGluZGV4RGl2aXNvciA+IDEpIHsKICAgICAgICAgICAvLyBzdWJzYW1wbGUKICAgICAgICAgICBmaW5hbCBJbnRzUmVmIHNjcmF0Y2hJbnRzUmVmID0gbmV3IEludHNSZWYoKTsKLSAgICAgICAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgICAgICAgZmluYWwgQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IEJ1aWxkZXI8TG9uZz4oRlNULklOUFVUX1RZUEUuQllURTEsIG91dHB1dHMpOwogICAgICAgICAgIGZpbmFsIEJ5dGVzUmVmRlNURW51bTxMb25nPiBmc3RFbnVtID0gbmV3IEJ5dGVzUmVmRlNURW51bTxMb25nPihmc3QpOwogICAgICAgICAgIEJ5dGVzUmVmRlNURW51bS5JbnB1dE91dHB1dDxMb25nPiByZXN1bHQ7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29kZWNzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9ibG9ja3Rlcm1zL1ZhcmlhYmxlR2FwVGVybXNJbmRleFdyaXRlci5qYXZhIGIvbHVjZW5lL2NvZGVjcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvYmxvY2t0ZXJtcy9WYXJpYWJsZUdhcFRlcm1zSW5kZXhXcml0ZXIuamF2YQppbmRleCA2NWEwYjdlLi42ZDNmNmJhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29kZWNzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9ibG9ja3Rlcm1zL1ZhcmlhYmxlR2FwVGVybXNJbmRleFdyaXRlci5qYXZhCisrKyBiL2x1Y2VuZS9jb2RlY3Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2Jsb2NrdGVybXMvVmFyaWFibGVHYXBUZXJtc0luZGV4V3JpdGVyLmphdmEKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiAgICAgcHVibGljIEZTVEZpZWxkV3JpdGVyKEZpZWxkSW5mbyBmaWVsZEluZm8sIGxvbmcgdGVybXNGaWxlUG9pbnRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgIHRoaXMuZmllbGRJbmZvID0gZmllbGRJbmZvOwotICAgICAgZnN0T3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgICBmc3RPdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgZnN0QnVpbGRlciA9IG5ldyBCdWlsZGVyPExvbmc+KEZTVC5JTlBVVF9UWVBFLkJZVEUxLCBmc3RPdXRwdXRzKTsKICAgICAgIGluZGV4U3RhcnQgPSBvdXQuZ2V0RmlsZVBvaW50ZXIoKTsKICAgICAgIC8vLy9TeXN0ZW0ub3V0LnByaW50bG4oIlZHVzogZmllbGQ9IiArIGZpZWxkSW5mby5uYW1lKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb2RlY3Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL3NpbXBsZXRleHQvU2ltcGxlVGV4dEZpZWxkc1JlYWRlci5qYXZhIGIvbHVjZW5lL2NvZGVjcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3Mvc2ltcGxldGV4dC9TaW1wbGVUZXh0RmllbGRzUmVhZGVyLmphdmEKaW5kZXggZmY5NDBlOC4uZDU3NmQzYyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvZGVjcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3Mvc2ltcGxldGV4dC9TaW1wbGVUZXh0RmllbGRzUmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvZGVjcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3Mvc2ltcGxldGV4dC9TaW1wbGVUZXh0RmllbGRzUmVhZGVyLmphdmEKQEAgLTUxMyw3ICs1MTMsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBsb2FkVGVybXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgUG9zaXRpdmVJbnRPdXRwdXRzIHBvc0ludE91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKGZhbHNlKTsKKyAgICAgIFBvc2l0aXZlSW50T3V0cHV0cyBwb3NJbnRPdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgZmluYWwgQnVpbGRlcjxQYWlyT3V0cHV0cy5QYWlyPExvbmcsUGFpck91dHB1dHMuUGFpcjxMb25nLExvbmc+Pj4gYjsKICAgICAgIGZpbmFsIFBhaXJPdXRwdXRzPExvbmcsTG9uZz4gb3V0cHV0c0lubmVyID0gbmV3IFBhaXJPdXRwdXRzPExvbmcsTG9uZz4ocG9zSW50T3V0cHV0cywgcG9zSW50T3V0cHV0cyk7CiAgICAgICBmaW5hbCBQYWlyT3V0cHV0czxMb25nLFBhaXJPdXRwdXRzLlBhaXI8TG9uZyxMb25nPj4gb3V0cHV0cyA9IG5ldyBQYWlyT3V0cHV0czxMb25nLFBhaXJPdXRwdXRzLlBhaXI8TG9uZyxMb25nPj4ocG9zSW50T3V0cHV0cywKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb21tb24tYnVpbGQueG1sIGIvbHVjZW5lL2NvbW1vbi1idWlsZC54bWwKaW5kZXggOWE5ZDUyNS4uY2I1ZDJhNSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvbW1vbi1idWlsZC54bWwKKysrIGIvbHVjZW5lL2NvbW1vbi1idWlsZC54bWwKQEAgLTE4Niw2ICsxODYsNyBAQAogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZW5jb2RpbmciIHZhbHVlPSJ1dGYtOCIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiBsb2NhdGlvbj0ic3JjL2phdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlcy5kaXIiIGxvY2F0aW9uPSIke3NyYy5kaXJ9Ly4uL3Jlc291cmNlcyIvPgogICA8cHJvcGVydHkgbmFtZT0idGVzdHMuc3JjLmRpciIgbG9jYXRpb249InNyYy90ZXN0Ii8+CiAgIDxhdmFpbGFibGUgcHJvcGVydHk9Im1vZHVsZS5oYXMudGVzdHMiIHR5cGU9ImRpciIgZmlsZT0iJHt0ZXN0cy5zcmMuZGlyfSIvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iYnVpbGQiLz4KQEAgLTI1NSw2ICsyNTYsMTAgQEAKIAogICA8IS0tIGEgcmVhc29uYWJsZSBkZWZhdWx0IGV4Y2x1c2lvbiBzZXQsIGNhbiBiZSBvdmVycmlkZGVuIGZvciBzcGVjaWFsIGNhc2VzIC0tPgogICA8cHJvcGVydHkgbmFtZT0icmF0LmV4Y2x1ZGVzIiB2YWx1ZT0iKiovVE9ETywqKi8qLnR4dCwqKi8qLmltbCIvPgorICAKKyAgPCEtLSBUaGVzZSBwYXR0ZXJucyBjYW4gYmUgZGVmaW5lZCB0byBhZGQgYWRkaXRpb25hbCBmaWxlcyBmb3IgY2hlY2tzLCByZWxhdGl2ZSB0byBtb2R1bGUncyBob21lIGRpciAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InJhdC5hZGRpdGlvbmFsLWluY2x1ZGVzIiB2YWx1ZT0iIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyYXQuYWRkaXRpb25hbC1leGNsdWRlcyIgdmFsdWU9IiIvPgogCiAgIDxwcm9wZXJ0eXNldCBpZD0idXB0b2RhdGUuYW5kLmNvbXBpbGVkLnByb3BlcnRpZXMiIGR5bmFtaWM9InRydWUiPgogICAgIDxwcm9wZXJ0eXJlZiByZWdleD0iLipcLnVwdG9kYXRlJCQiLz4KQEAgLTM1MSw3ICszNTYsNyBAQAogICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIGRlcGVuZHM9Iml2eS1hdmFpbGFiaWxpdHktY2hlY2ssaXZ5LWNvbmZpZ3VyZSI+CiAgICAgPCEtLSB0b2RvLCBtYWtlIHRoaXMgYSBwcm9wZXJ0eSBvciBzb21ldGhpbmcuIAogICAgICAgICAgb25seSBzcGVjaWFsIGNhc2VzIG5lZWQgYnVuZGxlcyAtLT4KLSAgICA8aXZ5OnJldHJpZXZlIHR5cGU9ImphcixidW5kbGUiIGxvZz0iZG93bmxvYWQtb25seSIgCisgICAgPGl2eTpyZXRyaWV2ZSB0eXBlPSJqYXIsYnVuZGxlLHRlc3RzIiBsb2c9ImRvd25sb2FkLW9ubHkiIAogICAgICAgICAgICAgICAgICAgY29uZj0iJHtpdnkuZGVmYXVsdC5jb25maWd1cmF0aW9ufSIgc3luYz0iJHtpdnkuc3luY30iLz4KICAgPC90YXJnZXQ+CiAKQEAgLTQ4OSw3ICs0OTQsNyBAQAogCiAgICAgPCEtLSBDb3B5IHRoZSByZXNvdXJjZXMgZm9sZGVyIChpZiBleGlzdGVudCkgLS0+CiAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzL2phdmEiPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ly4uL3Jlc291cmNlcyIgZXJyb3Jvbm1pc3NpbmdkaXI9Im5vIi8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7cmVzb3VyY2VzLmRpcn0iIGVycm9yb25taXNzaW5nZGlyPSJubyIvPgogICAgIDwvY29weT4KICAgPC90YXJnZXQ+CiAKQEAgLTg2NCw2ICs4NjksNyBAQAogICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3RzLmNhY2hlZGlyfS8ke25hbWV9IiAvPgogCiAgICAgICAgIDxqdW5pdDQ6anVuaXQ0CisgICAgICAgICAgICB0YXNrTmFtZT0ianVuaXQ0IgogICAgICAgICAgICAgZGlyPSJAe3dvcmtEaXJ9IgogICAgICAgICAgICAgdGVtcGRpcj0iQHt3b3JrRGlyfS90ZW1wIgogICAgICAgICAgICAgbWF4bWVtb3J5PSIke3Rlc3RzLmhlYXBzaXplfSIgCkBAIC0xMzM5LDcgKzEzNDUsNyBAQAogICAgIDxzZXF1ZW50aWFsPgogICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgogICAgICAgPGphcmlmeSBiYXNlZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tc3JjLmphciI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfS8uLi9yZXNvdXJjZXMiIGVycm9yb25taXNzaW5nZGlyPSJubyIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cmVzb3VyY2VzLmRpcn0iIGVycm9yb25taXNzaW5nZGlyPSJubyIvPgogICAgICAgPC9qYXJpZnk+CiAgICAgPC9zZXF1ZW50aWFsPgogICA8L3RhcmdldD4KQEAgLTE0NTQsNyArMTQ2MCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJmaWx0ZXItcG9tLXRlbXBsYXRlcyIgdW5sZXNzPSJmaWx0ZXJlZC5wb20udGVtcGxhdGVzLnVwdG9kYXRlIj4KICAgICA8bWtkaXIgZGlyPSIke2ZpbHRlcmVkLnBvbS50ZW1wbGF0ZXMuZGlyfSIvPgotICAgIDxjb3B5IHRvZGlyPSIke2NvbW1vbi5kaXJ9L2J1aWxkL3BvbXMiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgPGNvcHkgdG9kaXI9IiR7Y29tbW9uLmRpcn0vYnVpbGQvcG9tcyIgb3ZlcndyaXRlPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke2NvbW1vbi5kaXJ9Ly4uL2Rldi10b29scy9tYXZlbiIvPgogICAgICAgPGZpbHRlcnNldCBiZWdpbnRva2VuPSJAIiBlbmR0b2tlbj0iQCI+CiAgICAgICAgIDxmaWx0ZXIgdG9rZW49InZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+CkBAIC0xNTA4LDI4ICsxNTE0LDM0IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0icmF0LXNvdXJjZXMtdHlwZWRlZiIgdW5sZXNzPSJyYXQubG9hZGVkIj4KLSAgICA8aXZ5OmNhY2hlcGF0aCBvcmdhbmlzYXRpb249Im9yZy5hcGFjaGUucmF0IiBtb2R1bGU9ImFwYWNoZS1yYXQiIHJldmlzaW9uPSIwLjgiIHRyYW5zaXRpdmU9ImZhbHNlIiBpbmxpbmU9InRydWUiIGNvbmY9Im1hc3RlciIgdHlwZT0iamFyIiBwYXRoaWQ9InJhdC5jbGFzc3BhdGgiLz4KKyAgICA8aXZ5OmNhY2hlcGF0aCBvcmdhbmlzYXRpb249Im9yZy5hcGFjaGUucmF0IiBtb2R1bGU9ImFwYWNoZS1yYXQiIHJldmlzaW9uPSIwLjkiIHRyYW5zaXRpdmU9ImZhbHNlIiBpbmxpbmU9InRydWUiIGNvbmY9Im1hc3RlciIgdHlwZT0iamFyIiBwYXRoaWQ9InJhdC5jbGFzc3BhdGgiLz4KICAgICA8dHlwZWRlZiByZXNvdXJjZT0ib3JnL2FwYWNoZS9yYXQvYW50dGFza3MvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5yYXQuYW50dGFza3MiIGNsYXNzcGF0aHJlZj0icmF0LmNsYXNzcGF0aCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJyYXQubG9hZGVkIiB2YWx1ZT0idHJ1ZSIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InJhdC1zb3VyY2VzIiBkZXBlbmRzPSJyYXQtc291cmNlcy10eXBlZGVmIgogCSAgZGVzY3JpcHRpb249InJ1bnMgdGhlIHRhc2tzIG92ZXIgc291cmNlIGFuZCB0ZXN0IGZpbGVzIj4KLSAgICA8c2VxdWVudGlhbD4KICAgICA8IS0tIGNyZWF0ZSBhIHRlbXAgZmlsZSBmb3IgdGhlIGxvZyB0byBnbyB0byAtLT4KICAgICA8dGVtcGZpbGUgcHJvcGVydHk9InJhdC5zb3VyY2VzLmxvZ2ZpbGUiCiAgICAgICAgICAgICAgIHByZWZpeD0icmF0IgogICAgICAgICAgICAgICBkZXN0ZGlyPSIke2phdmEuaW8udG1wZGlyfSIvPgogICAgIDwhLS0gcnVuIHJhdCwgZ29pbmcgdG8gdGhlIGZpbGUgLS0+CiAgICAgPHJhdDpyZXBvcnQgeG1sbnM6cmF0PSJhbnRsaWI6b3JnLmFwYWNoZS5yYXQuYW50dGFza3MiIAotICAgICAgICAgICAgICAgIHJlcG9ydEZpbGU9IiR7cmF0LnNvdXJjZXMubG9nZmlsZX0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBleGNsdWRlcz0iJHtyYXQuZXhjbHVkZXN9Ii8+CisgICAgICAgICAgICAgICAgcmVwb3J0RmlsZT0iJHtyYXQuc291cmNlcy5sb2dmaWxlfSIgYWRkRGVmYXVsdExpY2Vuc2VNYXRjaGVycz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqLnhtbCAke3JhdC5hZGRpdGlvbmFsLWluY2x1ZGVzfSIgZXhjbHVkZXM9IiR7cmF0LmFkZGl0aW9uYWwtZXhjbHVkZXN9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGV4Y2x1ZGVzPSIke3JhdC5leGNsdWRlc30iIGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIvPgogICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RzLnNyYy5kaXJ9IiBleGNsdWRlcz0iJHtyYXQuZXhjbHVkZXN9IiBlcnJvcm9ubWlzc2luZ2Rpcj0iZmFsc2UiLz4KLSAgICAgIDwhLS0gc29tZSBtb2R1bGVzIGhhdmUgYSBzcmMvdG9vbHMvW2phdmEsdGVzdF0gLS0+Ci0gICAgICA8ZmlsZXNldCBkaXI9InNyYy90b29scy9qYXZhIiBleGNsdWRlcz0iJHtyYXQuZXhjbHVkZXN9IiBlcnJvcm9ubWlzc2luZ2Rpcj0iZmFsc2UiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rvb2xzL3Rlc3QiIGV4Y2x1ZGVzPSIke3JhdC5leGNsdWRlc30iIGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIvPgorCisgICAgICA8IS0tIFRPRE86IENoZWNrIGFsbCByZXNvdXJjZSBmaWxlcy4gQ3VycmVudGx5IG5vdCBhbGwgc3RvcHdvcmQgYW5kIHNpbWlsYXIgZmlsZXMgaGF2ZSBubyBoZWFkZXIhIC0tPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Jlc291cmNlcy5kaXJ9IiBpbmNsdWRlcz0iTUVUQS1JTkYvKioiIGVycm9yb25taXNzaW5nZGlyPSJmYWxzZSIvPgogICAgICAgCi0gICAgICA8IS0tIGJzZC1saWtlIHN0dWZmIC0tPgorICAgICAgPCEtLSBCU0QgNC1jbGF1c2Ugc3R1ZmYgKGlzIGRpc2FsbG93ZWQgYmVsb3cpIC0tPgorICAgICAgPHJhdDpzdWJzdHJpbmdNYXRjaGVyIGxpY2Vuc2VGYW1pbHlDYXRlZ29yeT0iQlNENCAiCisgICAgICAgICAgICAgbGljZW5zZUZhbWlseU5hbWU9Ik9yaWdpbmFsIEJTRCBMaWNlbnNlICh3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSkiPgorICAgICAgICA8cGF0dGVybiBzdWJzdHJpbmc9IkFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMiLz4KKyAgICAgIDwvcmF0OnN1YnN0cmluZ01hdGNoZXI+CisKKyAgICAgIDwhLS0gQlNELWxpa2Ugc3R1ZmYgLS0+CiAgICAgICA8cmF0OnN1YnN0cmluZ01hdGNoZXIgbGljZW5zZUZhbWlseUNhdGVnb3J5PSJCU0QgICIKICAgICAgICAgICAgICBsaWNlbnNlRmFtaWx5TmFtZT0iTW9kaWZpZWQgQlNEIExpY2Vuc2UiPgogICAgICAgPCEtLSBicmljcyBhdXRvbWF0b24gLS0+CkBAIC0xNTQyLDE2ICsxNTU0LDIwIEBACiAgICAgICAgIDxwYXR0ZXJuIHN1YnN0cmluZz0iRWdvdGhvciBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wMCIvPgogICAgICAgPCEtLSBKYVNwZWxsIC0tPgogICAgICAgICA8cGF0dGVybiBzdWJzdHJpbmc9IkNvcHlyaWdodCAoYykgMjAwNSBCcnVubyBNYXJ0aW5zIi8+CisgICAgICA8IS0tIGQzLmpzIC0tPgorICAgICAgICA8cGF0dGVybiBzdWJzdHJpbmc9IlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMiLz4KKyAgICAgIDwhLS0gaGlnaGxpZ2h0LmpzIC0tPgorICAgICAgICA8cGF0dGVybiBzdWJzdHJpbmc9IlRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyIvPgogICAgICAgPC9yYXQ6c3Vic3RyaW5nTWF0Y2hlcj4KIAotICAgICAgPCEtLSBtaXQtbGlrZSAtLT4KKyAgICAgIDwhLS0gTUlULWxpa2UgLS0+CiAgICAgICA8cmF0OnN1YnN0cmluZ01hdGNoZXIgbGljZW5zZUZhbWlseUNhdGVnb3J5PSJNSVQgICIKICAgICAgICAgICAgICBsaWNlbnNlRmFtaWx5TmFtZT0iVGhlIE1JVCBMaWNlbnNlIj4KICAgICAgIDwhLS0gSUNVIGxpY2Vuc2UgLS0+CiAgICAgICAgIDxwYXR0ZXJuIHN1YnN0cmluZz0iUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSIvPgogICAgICAgPC9yYXQ6c3Vic3RyaW5nTWF0Y2hlcj4KIAotICAgICAgPCEtLSBhcGFjaGUgLS0+CisgICAgICA8IS0tIEFwYWNoZSAtLT4KICAgICAgIDxyYXQ6c3Vic3RyaW5nTWF0Y2hlciBsaWNlbnNlRmFtaWx5Q2F0ZWdvcnk9IkFMICAgIgogICAgICAgICAgICAgIGxpY2Vuc2VGYW1pbHlOYW1lPSJBcGFjaGUiPgogICAgICAgICA8cGF0dGVybiBzdWJzdHJpbmc9IkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciIvPgpAQCAtMTU3NywxMyArMTU5MywxMyBAQAogICAgIDwvcmF0OnJlcG9ydD4KICAgICA8IS0tIG5vdyBwcmludCB0aGUgb3V0cHV0LCBmb3IgcmV2aWV3IC0tPgogICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0icmF0Lm91dHB1dCIgc3JjRmlsZT0iJHtyYXQuc291cmNlcy5sb2dmaWxlfSIvPgotICAgIDxlY2hvPiR7cmF0Lm91dHB1dH08L2VjaG8+CisgICAgPGVjaG8gdGFza25hbWU9InJhdCI+JHtyYXQub3V0cHV0fTwvZWNobz4KICAgICA8ZGVsZXRlPgogICAgICAgPGZpbGVzZXQgZmlsZT0iJHtyYXQuc291cmNlcy5sb2dmaWxlfSI+CiAgICAgICAgIDxhbmQ+CiAgICAgICAgICAgPGNvbnRhaW5zcmVnZXhwIGV4cHJlc3Npb249Il4wIFVua25vd24gTGljZW5zZXMiLz4KICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgPGNvbnRhaW5zcmVnZXhwIGV4cHJlc3Npb249Il5ccyshQUwiLz4KKyAgICAgICAgICAgIDxjb250YWluc3JlZ2V4cCBleHByZXNzaW9uPSJeXHMrISIvPgogICAgICAgICAgIDwvbm90PgogICAgICAgICA8L2FuZD4KICAgICAgIDwvZmlsZXNldD4KQEAgLTE1OTQsNyArMTYxMCw2IEBACiAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtyYXQuc291cmNlcy5sb2dmaWxlfSIvPgogICAgICAgPC9jb25kaXRpb24+CiAgICAgPC9mYWlsPgotICAgIDwvc2VxdWVudGlhbD4KICAgPC90YXJnZXQ+CiAKICAgPCEtLSsKQEAgLTE4MTQsMTAgKzE4MjksNzEgQEAKICAgICAgICAgPC9jb25kaXRpb24+CiAgICAgICA8L2ZhaWw+CiAKLQorICAgICAgPHBhdGNoLWphdmFkb2MgZGlyPSJAe2Rlc3RkaXJ9IiBkb2NlbmNvZGluZz0iJHtqYXZhZG9jLmNoYXJzZXR9Ii8+CiAgICA8L3NlcXVlbnRpYWw+CiAgIDwvbWFjcm9kZWY+CiAKKyAgPCEtLQorICAgIFBhdGNoIGZyYW1lIGluamVjdGlvbiBidWdzIGluIGphdmFkb2MgZ2VuZXJhdGVkIGZpbGVzIC0gc2VlIENWRS0yMDEzLTE1NzEsIGh0dHA6Ly93d3cua2IuY2VydC5vcmcvdnVscy9pZC8yMjU2NTcKKyAgICAKKyAgICBGZWVsIGZyZWUgdG8gdXNlIHRoaXMgbWFjcm8gaW4geW91ciBvd24gQW50IGJ1aWxkIGZpbGUuIFRoaXMgbWFjcm8gd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgamF2YWRvYyB0YXNrIG9uIEFudAorICAgIGFuZCBzaG91bGQgYmUgaW52b2tlZCBkaXJlY3RseSBhZnRlciBpdHMgZXhlY3V0aW9uIHRvIHBhdGNoIGJyb2tlbiBqYXZhZG9jcywgZS5nLjoKKyAgICAgIDxwYXRjaC1qYXZhZG9jIGRpcj0iLi4uIiBkb2NlbmNvZGluZz0iVVRGLTgiLz4KKyAgICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRvY2VuY29kaW5nIHBhcmFtZXRlciB1c2VzIHRoZSBzYW1lIGNoYXJzZXQgbGlrZSBqYXZhZG9jJ3MgZG9jZW5jb2RpbmcuIERlZmF1bHQKKyAgICBpcyB0aGUgcGxhdGZvcm0gZGVmYXVsdCBlbmNvZGluZyAobGlrZSB0aGUgamF2YWRvYyB0YXNrKS4KKyAgICBUaGUgc3BlY2lmaWVkIGRpciBpcyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIHRoZSBqYXZhZG9jIHRhc2suCisgIC0tPgorICA8bWFjcm9kZWYgbmFtZT0icGF0Y2gtamF2YWRvYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvY2VuY29kaW5nIiBkZWZhdWx0PSIke2ZpbGUuZW5jb2Rpbmd9Ii8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8cmVwbGFjZSBlbmNvZGluZz0iQHtkb2NlbmNvZGluZ30iIHN1bW1hcnk9InRydWUiIHRhc2tuYW1lPSJwYXRjaC1qYXZhZG9jIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSJAe2Rpcn0iIGNhc2VzZW5zaXRpdmU9ImZhbHNlIiBpbmNsdWRlcz0iKiovaW5kZXguaHRtbCwqKi9pbmRleC5odG0sKiovdG9jLmh0bWwsKiovdG9jLmh0bSI+CisgICAgICAgICAgPCEtLSBUT0RPOiBhZGQgZW5jb2Rpbmc9IkB7ZG9jZW5jb2Rpbmd9IiB0byBjb250YWlucyBjaGVjaywgd2hlbiB3ZSBhcmUgb24gQU5UIDEuOS4wOiAtLT4KKyAgICAgICAgICA8bm90Pjxjb250YWlucyB0ZXh0PSJmdW5jdGlvbiB2YWxpZFVSTCh1cmwpIHsiIGNhc2VzZW5zaXRpdmU9InRydWUiIC8+PC9ub3Q+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPHJlcGxhY2V0b2tlbj48IVtDREFUQVtmdW5jdGlvbiBsb2FkRnJhbWVzKCkge11dPjwvcmVwbGFjZXRva2VuPgorICAgICAgICA8cmVwbGFjZXZhbHVlIGV4cGFuZFByb3BlcnRpZXM9ImZhbHNlIj48IVtDREFUQVtpZiAodGFyZ2V0UGFnZSAhPSAiIiAmJiAhdmFsaWRVUkwodGFyZ2V0UGFnZSkpCisgICAgICAgIHRhcmdldFBhZ2UgPSAidW5kZWZpbmVkIjsKKyAgICBmdW5jdGlvbiB2YWxpZFVSTCh1cmwpIHsKKyAgICAgICAgdmFyIHBvcyA9IHVybC5pbmRleE9mKCIuaHRtbCIpOworICAgICAgICBpZiAocG9zID09IC0xIHx8IHBvcyAhPSB1cmwubGVuZ3RoIC0gNSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdmFyIGFsbG93TnVtYmVyID0gZmFsc2U7CisgICAgICAgIHZhciBhbGxvd1NlcCA9IGZhbHNlOworICAgICAgICB2YXIgc2VlbkRvdCA9IGZhbHNlOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVybC5sZW5ndGggLSA1OyBpKyspIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHVybC5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JyB8fAorICAgICAgICAgICAgICAgICAgICAnQScgPD0gY2ggJiYgY2ggPD0gJ1onIHx8CisgICAgICAgICAgICAgICAgICAgIGNoID09ICckJyB8fAorICAgICAgICAgICAgICAgICAgICBjaCA9PSAnXycpIHsKKyAgICAgICAgICAgICAgICBhbGxvd051bWJlciA9IHRydWU7CisgICAgICAgICAgICAgICAgYWxsb3dTZXAgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknCisgICAgICAgICAgICAgICAgICAgIHx8IGNoID09ICctJykgeworICAgICAgICAgICAgICAgIGlmICghYWxsb3dOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcvJyB8fCBjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93U2VwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgYWxsb3dOdW1iZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBhbGxvd1NlcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLicpCisgICAgICAgICAgICAgICAgICAgICBzZWVuRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nICYmIHNlZW5Eb3QpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZnVuY3Rpb24gbG9hZEZyYW1lcygpIHtdXT48L3JlcGxhY2V2YWx1ZT4KKyAgICAgIDwvcmVwbGFjZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKICAgPG1hY3JvZGVmIG5hbWU9Im1vZHVsZXMtY3Jhd2wiPgogICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiBkZWZhdWx0PSIiLz4KICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiBkZWZhdWx0PSJ0cnVlIi8+CkBAIC0yMDMwLDcgKzIxMDYsNyBAQAogICAgIDxlbGVtZW50IG5hbWU9Im5lc3RlZCIgb3B0aW9uYWw9ImZhbHNlIiBpbXBsaWNpdD0idHJ1ZSIvPgogICAgIDxzZXF1ZW50aWFsPgogICAgICAgPGNvcHkgdG9kaXI9IkB7dG9kaXJ9IiBmbGF0dGVuPSJAe2ZsYXR0ZW59IiBvdmVyd3JpdGU9IkB7b3ZlcndyaXRlfSIgdmVyYm9zZT0idHJ1ZSIKLSAgICAgICAgcHJlc2VydmVsYXN0bW9kaWZpZWQ9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiIG91dHB1dGVuY29kaW5nPSJVVEYtOCIgdGFza25hbWU9InBlZ2Rvd24iCisgICAgICAgIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJmYWxzZSIgZW5jb2Rpbmc9IlVURi04IiB0YXNrbmFtZT0icGVnZG93biIKICAgICAgID4KICAgICAgICAgPGZpbHRlcmNoYWluPgogICAgICAgICAgIDx0b2tlbmZpbHRlcj4KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9CbG9ja1Rlcm1TdGF0ZS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL0Jsb2NrVGVybVN0YXRlLmphdmEKaW5kZXggOWYzZDkzYS4uMDRlYzNiNyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL0Jsb2NrVGVybVN0YXRlLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL0Jsb2NrVGVybVN0YXRlLmphdmEKQEAgLTUwLDEwICs1MCw2IEBACiAgICAgdG90YWxUZXJtRnJlcSA9IG90aGVyLnRvdGFsVGVybUZyZXE7CiAgICAgdGVybUJsb2NrT3JkID0gb3RoZXIudGVybUJsb2NrT3JkOwogICAgIGJsb2NrRmlsZVBvaW50ZXIgPSBvdGhlci5ibG9ja0ZpbGVQb2ludGVyOwotCi0gICAgLy8gTk9URTogZG9uJ3QgY29weSBibG9ja1Rlcm1Db3VudDsKLSAgICAvLyBpdCdzICJ0cmFuc2llbnQiOiB1c2VkIG9ubHkgYnkgdGhlICJwcmltYXJ5IgotICAgIC8vIHRlcm1TdGF0ZSwgYW5kIHJlZ2VuZXJhdGVkIG9uIHNlZWsgYnkgVGVybVN0YXRlCiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9Db21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvQ29tcHJlc3NpbmdTdG9yZWRGaWVsZHNJbmRleFJlYWRlci5qYXZhCmluZGV4IDAwY2M0ZjQuLmM3Mzk0MmYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9Db21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMjUsMTYgKzI0LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguU2VnbWVudEluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkFycmF5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLklPVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuUGFja2VkSW50czsKIAogLyoqCiAgKiBSYW5kb20tYWNjZXNzIHJlYWRlciBmb3Ige0BsaW5rIENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhXcml0ZXJ9LgogICogQGx1Y2VuZS5pbnRlcm5hbAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcHJlc3NpbmdTdG9yZWRGaWVsZHNJbmRleFJlYWRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSwgQ2xvbmVhYmxlIHsKLQotICBmaW5hbCBJbmRleElucHV0IGZpZWxkc0luZGV4SW47CitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcHJlc3NpbmdTdG9yZWRGaWVsZHNJbmRleFJlYWRlciBpbXBsZW1lbnRzIENsb25lYWJsZSB7CiAKICAgc3RhdGljIGxvbmcgbW92ZUxvd09yZGVyQml0VG9TaWduKGxvbmcgbikgewogICAgIHJldHVybiAoKG4gPj4+IDEpIF4gLShuICYgMSkpOwpAQCAtNDgsOCArNDQsOSBAQAogICBmaW5hbCBQYWNrZWRJbnRzLlJlYWRlcltdIGRvY0Jhc2VzRGVsdGFzOyAvLyBkZWx0YSBmcm9tIHRoZSBhdmcKICAgZmluYWwgUGFja2VkSW50cy5SZWFkZXJbXSBzdGFydFBvaW50ZXJzRGVsdGFzOyAvLyBkZWx0YSBmcm9tIHRoZSBhdmcKIAorICAvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBjbG9zZSBmaWVsZHNJbmRleEluIGFmdGVyIHRoaXMgY29uc3RydWN0b3IKKyAgLy8gaGFzIGJlZW4gY2FsbGVkCiAgIENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIoSW5kZXhJbnB1dCBmaWVsZHNJbmRleEluLCBTZWdtZW50SW5mbyBzaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0aGlzLmZpZWxkc0luZGV4SW4gPSBmaWVsZHNJbmRleEluOwogICAgIG1heERvYyA9IHNpLmdldERvY0NvdW50KCk7CiAgICAgaW50W10gZG9jQmFzZXMgPSBuZXcgaW50WzE2XTsKICAgICBsb25nW10gc3RhcnRQb2ludGVycyA9IG5ldyBsb25nWzE2XTsKQEAgLTEwNiwxNyArMTAzLDYgQEAKICAgICB0aGlzLnN0YXJ0UG9pbnRlcnNEZWx0YXMgPSBBcnJheXMuY29weU9mKHN0YXJ0UG9pbnRlcnNEZWx0YXMsIGJsb2NrQ291bnQpOwogICB9CiAKLSAgcHJpdmF0ZSBDb21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyKENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIgb3RoZXIpIHsKLSAgICB0aGlzLmZpZWxkc0luZGV4SW4gPSBudWxsOwotICAgIHRoaXMubWF4RG9jID0gb3RoZXIubWF4RG9jOwotICAgIHRoaXMuZG9jQmFzZXMgPSBvdGhlci5kb2NCYXNlczsKLSAgICB0aGlzLnN0YXJ0UG9pbnRlcnMgPSBvdGhlci5zdGFydFBvaW50ZXJzOwotICAgIHRoaXMuYXZnQ2h1bmtEb2NzID0gb3RoZXIuYXZnQ2h1bmtEb2NzOwotICAgIHRoaXMuYXZnQ2h1bmtTaXplcyA9IG90aGVyLmF2Z0NodW5rU2l6ZXM7Ci0gICAgdGhpcy5kb2NCYXNlc0RlbHRhcyA9IG90aGVyLmRvY0Jhc2VzRGVsdGFzOwotICAgIHRoaXMuc3RhcnRQb2ludGVyc0RlbHRhcyA9IG90aGVyLnN0YXJ0UG9pbnRlcnNEZWx0YXM7Ci0gIH0KLQogICBwcml2YXRlIGludCBibG9jayhpbnQgZG9jSUQpIHsKICAgICBpbnQgbG8gPSAwLCBoaSA9IGRvY0Jhc2VzLmxlbmd0aCAtIDE7CiAgICAgd2hpbGUgKGxvIDw9IGhpKSB7CkBAIC0xNzIsMTYgKzE1OCw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBDb21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyIGNsb25lKCkgewotICAgIGlmIChmaWVsZHNJbmRleEluID09IG51bGwpIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBJT1V0aWxzLmNsb3NlKGZpZWxkc0luZGV4SW4pOworICAgIHJldHVybiB0aGlzOwogICB9CiAKIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9Db21wcmVzc2luZ1N0b3JlZEZpZWxkc1JlYWRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nU3RvcmVkRmllbGRzUmVhZGVyLmphdmEKaW5kZXggMjg3ZWZlNy4uMjlmZWQ4OCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nU3RvcmVkRmllbGRzUmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nU3RvcmVkRmllbGRzUmVhZGVyLmphdmEKQEAgLTYwLDYgKzYwLDkgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENvbXByZXNzaW5nU3RvcmVkRmllbGRzUmVhZGVyIGV4dGVuZHMgU3RvcmVkRmllbGRzUmVhZGVyIHsKIAorICAvLyBEbyBub3QgcmV1c2UgdGhlIGRlY29tcHJlc3Npb24gYnVmZmVyIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIDMya2IgdG8gZGVjb21wcmVzcworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1JFVVNFX1RIUkVTSE9MRCA9IDEgPDwgMTU7CisKICAgcHJpdmF0ZSBmaW5hbCBGaWVsZEluZm9zIGZpZWxkSW5mb3M7CiAgIHByaXZhdGUgZmluYWwgQ29tcHJlc3NpbmdTdG9yZWRGaWVsZHNJbmRleFJlYWRlciBpbmRleFJlYWRlcjsKICAgcHJpdmF0ZSBmaW5hbCBJbmRleElucHV0IGZpZWxkc1N0cmVhbTsKQEAgLTkzLDE5ICs5NiwyMiBAQAogICAgIG51bURvY3MgPSBzaS5nZXREb2NDb3VudCgpOwogICAgIEluZGV4SW5wdXQgaW5kZXhTdHJlYW0gPSBudWxsOwogICAgIHRyeSB7Ci0gICAgICBmaWVsZHNTdHJlYW0gPSBkLm9wZW5JbnB1dChJbmRleEZpbGVOYW1lcy5zZWdtZW50RmlsZU5hbWUoc2VnbWVudCwgc2VnbWVudFN1ZmZpeCwgRklFTERTX0VYVEVOU0lPTiksIGNvbnRleHQpOworICAgICAgLy8gTG9hZCB0aGUgaW5kZXggaW50byBtZW1vcnkKICAgICAgIGZpbmFsIFN0cmluZyBpbmRleFN0cmVhbUZOID0gSW5kZXhGaWxlTmFtZXMuc2VnbWVudEZpbGVOYW1lKHNlZ21lbnQsIHNlZ21lbnRTdWZmaXgsIEZJRUxEU19JTkRFWF9FWFRFTlNJT04pOwogICAgICAgaW5kZXhTdHJlYW0gPSBkLm9wZW5JbnB1dChpbmRleFN0cmVhbUZOLCBjb250ZXh0KTsKLQogICAgICAgZmluYWwgU3RyaW5nIGNvZGVjTmFtZUlkeCA9IGZvcm1hdE5hbWUgKyBDT0RFQ19TRlhfSURYOwotICAgICAgZmluYWwgU3RyaW5nIGNvZGVjTmFtZURhdCA9IGZvcm1hdE5hbWUgKyBDT0RFQ19TRlhfREFUOwogICAgICAgQ29kZWNVdGlsLmNoZWNrSGVhZGVyKGluZGV4U3RyZWFtLCBjb2RlY05hbWVJZHgsIFZFUlNJT05fU1RBUlQsIFZFUlNJT05fQ1VSUkVOVCk7CisgICAgICBhc3NlcnQgQ29kZWNVdGlsLmhlYWRlckxlbmd0aChjb2RlY05hbWVJZHgpID09IGluZGV4U3RyZWFtLmdldEZpbGVQb2ludGVyKCk7CisgICAgICBpbmRleFJlYWRlciA9IG5ldyBDb21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyKGluZGV4U3RyZWFtLCBzaSk7CisgICAgICBpbmRleFN0cmVhbS5jbG9zZSgpOworICAgICAgaW5kZXhTdHJlYW0gPSBudWxsOworCisgICAgICAvLyBPcGVuIHRoZSBkYXRhIGZpbGUgYW5kIHJlYWQgbWV0YWRhdGEKKyAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHNTdHJlYW1GTiA9IEluZGV4RmlsZU5hbWVzLnNlZ21lbnRGaWxlTmFtZShzZWdtZW50LCBzZWdtZW50U3VmZml4LCBGSUVMRFNfRVhURU5TSU9OKTsKKyAgICAgIGZpZWxkc1N0cmVhbSA9IGQub3BlbklucHV0KGZpZWxkc1N0cmVhbUZOLCBjb250ZXh0KTsKKyAgICAgIGZpbmFsIFN0cmluZyBjb2RlY05hbWVEYXQgPSBmb3JtYXROYW1lICsgQ09ERUNfU0ZYX0RBVDsKICAgICAgIENvZGVjVXRpbC5jaGVja0hlYWRlcihmaWVsZHNTdHJlYW0sIGNvZGVjTmFtZURhdCwgVkVSU0lPTl9TVEFSVCwgVkVSU0lPTl9DVVJSRU5UKTsKICAgICAgIGFzc2VydCBDb2RlY1V0aWwuaGVhZGVyTGVuZ3RoKGNvZGVjTmFtZURhdCkgPT0gZmllbGRzU3RyZWFtLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICBhc3NlcnQgQ29kZWNVdGlsLmhlYWRlckxlbmd0aChjb2RlY05hbWVJZHgpID09IGluZGV4U3RyZWFtLmdldEZpbGVQb2ludGVyKCk7Ci0KLSAgICAgIGluZGV4UmVhZGVyID0gbmV3IENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIoaW5kZXhTdHJlYW0sIHNpKTsKLSAgICAgIGluZGV4U3RyZWFtID0gbnVsbDsKIAogICAgICAgcGFja2VkSW50c1ZlcnNpb24gPSBmaWVsZHNTdHJlYW0ucmVhZFZJbnQoKTsKICAgICAgIGRlY29tcHJlc3NvciA9IGNvbXByZXNzaW9uTW9kZS5uZXdEZWNvbXByZXNzb3IoKTsKQEAgLTEzNCw3ICsxNDAsNyBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmICghY2xvc2VkKSB7Ci0gICAgICBJT1V0aWxzLmNsb3NlKGZpZWxkc1N0cmVhbSwgaW5kZXhSZWFkZXIpOworICAgICAgSU9VdGlscy5jbG9zZShmaWVsZHNTdHJlYW0pOwogICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTI1NSw2ICsyNjEsNyBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGZpbmFsIEJ5dGVzUmVmIGJ5dGVzID0gdG90YWxMZW5ndGggPD0gQlVGRkVSX1JFVVNFX1RIUkVTSE9MRCA/IHRoaXMuYnl0ZXMgOiBuZXcgQnl0ZXNSZWYoKTsKICAgICBkZWNvbXByZXNzb3IuZGVjb21wcmVzcyhmaWVsZHNTdHJlYW0sIHRvdGFsTGVuZ3RoLCBvZmZzZXQsIGxlbmd0aCwgYnl0ZXMpOwogICAgIGFzc2VydCBieXRlcy5sZW5ndGggPT0gbGVuZ3RoOwogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvQ29tcHJlc3NpbmdUZXJtVmVjdG9yc1JlYWRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nVGVybVZlY3RvcnNSZWFkZXIuamF2YQppbmRleCA1NDVjODZjYS4uNDhjOGQ1YyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0NvbXByZXNzaW5nVGVybVZlY3RvcnNSZWFkZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvQ29tcHJlc3NpbmdUZXJtVmVjdG9yc1JlYWRlci5qYXZhCkBAIC0xMDIsMTkgKzEwMiwyMiBAQAogICAgIG51bURvY3MgPSBzaS5nZXREb2NDb3VudCgpOwogICAgIEluZGV4SW5wdXQgaW5kZXhTdHJlYW0gPSBudWxsOwogICAgIHRyeSB7Ci0gICAgICB2ZWN0b3JzU3RyZWFtID0gZC5vcGVuSW5wdXQoSW5kZXhGaWxlTmFtZXMuc2VnbWVudEZpbGVOYW1lKHNlZ21lbnQsIHNlZ21lbnRTdWZmaXgsIFZFQ1RPUlNfRVhURU5TSU9OKSwgY29udGV4dCk7CisgICAgICAvLyBMb2FkIHRoZSBpbmRleCBpbnRvIG1lbW9yeQogICAgICAgZmluYWwgU3RyaW5nIGluZGV4U3RyZWFtRk4gPSBJbmRleEZpbGVOYW1lcy5zZWdtZW50RmlsZU5hbWUoc2VnbWVudCwgc2VnbWVudFN1ZmZpeCwgVkVDVE9SU19JTkRFWF9FWFRFTlNJT04pOwogICAgICAgaW5kZXhTdHJlYW0gPSBkLm9wZW5JbnB1dChpbmRleFN0cmVhbUZOLCBjb250ZXh0KTsKLQogICAgICAgZmluYWwgU3RyaW5nIGNvZGVjTmFtZUlkeCA9IGZvcm1hdE5hbWUgKyBDT0RFQ19TRlhfSURYOwotICAgICAgZmluYWwgU3RyaW5nIGNvZGVjTmFtZURhdCA9IGZvcm1hdE5hbWUgKyBDT0RFQ19TRlhfREFUOwogICAgICAgQ29kZWNVdGlsLmNoZWNrSGVhZGVyKGluZGV4U3RyZWFtLCBjb2RlY05hbWVJZHgsIFZFUlNJT05fU1RBUlQsIFZFUlNJT05fQ1VSUkVOVCk7CisgICAgICBhc3NlcnQgQ29kZWNVdGlsLmhlYWRlckxlbmd0aChjb2RlY05hbWVJZHgpID09IGluZGV4U3RyZWFtLmdldEZpbGVQb2ludGVyKCk7CisgICAgICBpbmRleFJlYWRlciA9IG5ldyBDb21wcmVzc2luZ1N0b3JlZEZpZWxkc0luZGV4UmVhZGVyKGluZGV4U3RyZWFtLCBzaSk7CisgICAgICBpbmRleFN0cmVhbS5jbG9zZSgpOworICAgICAgaW5kZXhTdHJlYW0gPSBudWxsOworCisgICAgICAvLyBPcGVuIHRoZSBkYXRhIGZpbGUgYW5kIHJlYWQgbWV0YWRhdGEKKyAgICAgIGZpbmFsIFN0cmluZyB2ZWN0b3JzU3RyZWFtRk4gPSBJbmRleEZpbGVOYW1lcy5zZWdtZW50RmlsZU5hbWUoc2VnbWVudCwgc2VnbWVudFN1ZmZpeCwgVkVDVE9SU19FWFRFTlNJT04pOworICAgICAgdmVjdG9yc1N0cmVhbSA9IGQub3BlbklucHV0KHZlY3RvcnNTdHJlYW1GTiwgY29udGV4dCk7CisgICAgICBmaW5hbCBTdHJpbmcgY29kZWNOYW1lRGF0ID0gZm9ybWF0TmFtZSArIENPREVDX1NGWF9EQVQ7CiAgICAgICBDb2RlY1V0aWwuY2hlY2tIZWFkZXIodmVjdG9yc1N0cmVhbSwgY29kZWNOYW1lRGF0LCBWRVJTSU9OX1NUQVJULCBWRVJTSU9OX0NVUlJFTlQpOwogICAgICAgYXNzZXJ0IENvZGVjVXRpbC5oZWFkZXJMZW5ndGgoY29kZWNOYW1lRGF0KSA9PSB2ZWN0b3JzU3RyZWFtLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICBhc3NlcnQgQ29kZWNVdGlsLmhlYWRlckxlbmd0aChjb2RlY05hbWVJZHgpID09IGluZGV4U3RyZWFtLmdldEZpbGVQb2ludGVyKCk7Ci0KLSAgICAgIGluZGV4UmVhZGVyID0gbmV3IENvbXByZXNzaW5nU3RvcmVkRmllbGRzSW5kZXhSZWFkZXIoaW5kZXhTdHJlYW0sIHNpKTsKLSAgICAgIGluZGV4U3RyZWFtID0gbnVsbDsKIAogICAgICAgcGFja2VkSW50c1ZlcnNpb24gPSB2ZWN0b3JzU3RyZWFtLnJlYWRWSW50KCk7CiAgICAgICBjaHVua1NpemUgPSB2ZWN0b3JzU3RyZWFtLnJlYWRWSW50KCk7CkBAIC0xNjEsNyArMTY0LDcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBpZiAoIWNsb3NlZCkgewotICAgICAgSU9VdGlscy5jbG9zZSh2ZWN0b3JzU3RyZWFtLCBpbmRleFJlYWRlcik7CisgICAgICBJT1V0aWxzLmNsb3NlKHZlY3RvcnNTdHJlYW0pOwogICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MC9MdWNlbmU0MFRlcm1WZWN0b3JzV3JpdGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDAvTHVjZW5lNDBUZXJtVmVjdG9yc1dyaXRlci5qYXZhCmluZGV4IDAzODYzNjkuLjkzOGQ0YzAgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MC9MdWNlbmU0MFRlcm1WZWN0b3JzV3JpdGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQwL0x1Y2VuZTQwVGVybVZlY3RvcnNXcml0ZXIuamF2YQpAQCAtMjQyLDggKzI0Miw4IEBACiAgICAgICBpZiAocGF5bG9hZHMpIHsKICAgICAgICAgdHZmLndyaXRlQnl0ZXMocGF5bG9hZERhdGEuYnl0ZXMsIHBheWxvYWREYXRhLm9mZnNldCwgcGF5bG9hZERhdGEubGVuZ3RoKTsKICAgICAgIH0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyZWRJbmRleDsgaSsrKSB7Ci0gICAgICAgIGlmIChvZmZzZXRzKSB7CisgICAgICBpZiAob2Zmc2V0cykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlcmVkSW5kZXg7IGkrKykgewogICAgICAgICAgIHR2Zi53cml0ZVZJbnQob2Zmc2V0U3RhcnRCdWZmZXJbaV0gLSBsYXN0T2Zmc2V0KTsKICAgICAgICAgICB0dmYud3JpdGVWSW50KG9mZnNldEVuZEJ1ZmZlcltpXSAtIG9mZnNldFN0YXJ0QnVmZmVyW2ldKTsKICAgICAgICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0RW5kQnVmZmVyW2ldOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQwL3BhY2thZ2UuaHRtbCBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MC9wYWNrYWdlLmh0bWwKaW5kZXggZDIwMDM3Yi4uNTE4NzM1OSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQwL3BhY2thZ2UuaHRtbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDAvcGFja2FnZS5odG1sCkBAIC0zNzIsMTMgKzM3Miw3IEBACiA8YSBuYW1lPSJMaW1pdGF0aW9ucyIgaWQ9IkxpbWl0YXRpb25zIj48L2E+CiA8aDI+TGltaXRhdGlvbnM8L2gyPgogPGRpdj4KLTxwPldoZW4gcmVmZXJyaW5nIHRvIHRlcm0gbnVtYmVycywgTHVjZW5lJ3MgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgSmF2YQotPGNvZGU+aW50PC9jb2RlPiB0byBob2xkIHRoZSB0ZXJtIGluZGV4LCB3aGljaCBtZWFucyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSB0ZXJtcyBpbiBhbnkgc2luZ2xlIGluZGV4IHNlZ21lbnQgaXMgfjIuMSBiaWxsaW9uCi10aW1lcyB0aGUgdGVybSBpbmRleCBpbnRlcnZhbCAoZGVmYXVsdCAxMjgpID0gfjI3NCBiaWxsaW9uLiBUaGlzIGlzIHRlY2huaWNhbGx5Ci1ub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBpbmRleCBmaWxlIGZvcm1hdCwganVzdCBvZiBMdWNlbmUncyBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbi48L3A+Ci08cD5TaW1pbGFybHksIEx1Y2VuZSB1c2VzIGEgSmF2YSA8Y29kZT5pbnQ8L2NvZGU+IHRvIHJlZmVyIHRvCis8cD5MdWNlbmUgdXNlcyBhIEphdmEgPGNvZGU+aW50PC9jb2RlPiB0byByZWZlciB0bwogZG9jdW1lbnQgbnVtYmVycywgYW5kIHRoZSBpbmRleCBmaWxlIGZvcm1hdCB1c2VzIGFuIDxjb2RlPkludDMyPC9jb2RlPgogb24tZGlzayB0byBzdG9yZSBkb2N1bWVudCBudW1iZXJzLiBUaGlzIGlzIGEgbGltaXRhdGlvbgogb2YgYm90aCB0aGUgaW5kZXggZmlsZSBmb3JtYXQgYW5kIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLiBFdmVudHVhbGx5IHRoZXNlCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDEvTHVjZW5lNDFQb3N0aW5nc0Zvcm1hdC5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQxL0x1Y2VuZTQxUG9zdGluZ3NGb3JtYXQuamF2YQppbmRleCA0ODM4ZjdhLi5kZjdmZTZmIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDEvTHVjZW5lNDFQb3N0aW5nc0Zvcm1hdC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MS9MdWNlbmU0MVBvc3RpbmdzRm9ybWF0LmphdmEKQEAgLTE2MSw3ICsxNjEsNyBAQAogICogICAgPGxpPlNraXBGUERlbHRhIGRldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdGVybSdzIFNraXBEYXRhIHdpdGhpbiB0aGUgLmRvYwogICogICAgICAgIGZpbGUuIEluIHBhcnRpY3VsYXIsIGl0IGlzIHRoZSBsZW5ndGggb2YgdGhlIFRlcm1GcmVxIGRhdGEuCiAgKiAgICAgICAgU2tpcERlbHRhIGlzIG9ubHkgc3RvcmVkIGlmIERvY0ZyZXEgaXMgbm90IHNtYWxsZXIgdGhhbiBTa2lwTWluaW11bQotICogICAgICAgIChpLmUuIDggaW4gTHVjZW5lNDFQb3N0aW5nc0Zvcm1hdCkuPC9saT4KKyAqICAgICAgICAoaS5lLiAxMjggaW4gTHVjZW5lNDFQb3N0aW5nc0Zvcm1hdCkuPC9saT4KICAqICAgIDxsaT5TaW5nbGV0b25Eb2NJRCBpcyBhbiBvcHRpbWl6YXRpb24gd2hlbiBhIHRlcm0gb25seSBhcHBlYXJzIGluIG9uZSBkb2N1bWVudC4gSW4gdGhpcyBjYXNlLCBpbnN0ZWFkCiAgKiAgICAgICAgb2Ygd3JpdGluZyBhIGZpbGUgcG9pbnRlciB0byB0aGUgLmRvYyBmaWxlIChEb2NGUERlbHRhKSwgYW5kIHRoZW4gYSBWSW50QmxvY2sgYXQgdGhhdCBsb2NhdGlvbiwgdGhlIAogICogICAgICAgIHNpbmdsZSBkb2N1bWVudCBJRCBpcyB3cml0dGVuIHRvIHRoZSB0ZXJtIGRpY3Rpb25hcnkuPC9saT4KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MS9wYWNrYWdlLmh0bWwgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDEvcGFja2FnZS5odG1sCmluZGV4IDNkZjAyOTMuLmQ0MjljYjAgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0MS9wYWNrYWdlLmh0bWwKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQxL3BhY2thZ2UuaHRtbApAQCAtMzgxLDEzICszODEsNyBAQAogPGEgbmFtZT0iTGltaXRhdGlvbnMiIGlkPSJMaW1pdGF0aW9ucyI+PC9hPgogPGgyPkxpbWl0YXRpb25zPC9oMj4KIDxkaXY+Ci08cD5XaGVuIHJlZmVycmluZyB0byB0ZXJtIG51bWJlcnMsIEx1Y2VuZSdzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyBhIEphdmEKLTxjb2RlPmludDwvY29kZT4gdG8gaG9sZCB0aGUgdGVybSBpbmRleCwgd2hpY2ggbWVhbnMgdGhlCi1tYXhpbXVtIG51bWJlciBvZiB1bmlxdWUgdGVybXMgaW4gYW55IHNpbmdsZSBpbmRleCBzZWdtZW50IGlzIH4yLjEgYmlsbGlvbgotdGltZXMgdGhlIHRlcm0gaW5kZXggaW50ZXJ2YWwgKGRlZmF1bHQgMTI4KSA9IH4yNzQgYmlsbGlvbi4gVGhpcyBpcyB0ZWNobmljYWxseQotbm90IGEgbGltaXRhdGlvbiBvZiB0aGUgaW5kZXggZmlsZSBmb3JtYXQsIGp1c3Qgb2YgTHVjZW5lJ3MgY3VycmVudAotaW1wbGVtZW50YXRpb24uPC9wPgotPHA+U2ltaWxhcmx5LCBMdWNlbmUgdXNlcyBhIEphdmEgPGNvZGU+aW50PC9jb2RlPiB0byByZWZlciB0bworPHA+THVjZW5lIHVzZXMgYSBKYXZhIDxjb2RlPmludDwvY29kZT4gdG8gcmVmZXIgdG8KIGRvY3VtZW50IG51bWJlcnMsIGFuZCB0aGUgaW5kZXggZmlsZSBmb3JtYXQgdXNlcyBhbiA8Y29kZT5JbnQzMjwvY29kZT4KIG9uLWRpc2sgdG8gc3RvcmUgZG9jdW1lbnQgbnVtYmVycy4gVGhpcyBpcyBhIGxpbWl0YXRpb24KIG9mIGJvdGggdGhlIGluZGV4IGZpbGUgZm9ybWF0IGFuZCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gRXZlbnR1YWxseSB0aGVzZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL0x1Y2VuZTQyRG9jVmFsdWVzQ29uc3VtZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc0NvbnN1bWVyLmphdmEKaW5kZXggYWNlZDZjZS4uYTFmNmRjNCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL0x1Y2VuZTQyRG9jVmFsdWVzQ29uc3VtZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvTHVjZW5lNDJEb2NWYWx1ZXNDb25zdW1lci5qYXZhCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICBtZXRhLndyaXRlVkludChmaWVsZC5udW1iZXIpOwogICAgIG1ldGEud3JpdGVCeXRlKEZTVCk7CiAgICAgbWV0YS53cml0ZUxvbmcoZGF0YS5nZXRGaWxlUG9pbnRlcigpKTsKLSAgICBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IEJ1aWxkZXI8TG9uZz4oSU5QVVRfVFlQRS5CWVRFMSwgb3V0cHV0cyk7CiAgICAgSW50c1JlZiBzY3JhdGNoID0gbmV3IEludHNSZWYoKTsKICAgICBsb25nIG9yZCA9IDA7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvTHVjZW5lNDJEb2NWYWx1ZXNGb3JtYXQuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdC5qYXZhCmluZGV4IGJiMzg0YzcuLjNlODEwMDQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdC5qYXZhCkBAIC0xMjAsMTYgKzEyMCwzMyBAQAogICogPC9vbD4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0IGV4dGVuZHMgRG9jVmFsdWVzRm9ybWF0IHsKLQotICAvKiogU29sZSBjb25zdHJ1Y3RvciAqLworICBmaW5hbCBmbG9hdCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbzsKKyAgCisgIC8qKiAKKyAgICogQ2FsbHMge0BsaW5rICNMdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdChmbG9hdCkgCisgICAqIEx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0KFBhY2tlZEludHMuREVGQVVMVCl9IAorICAgKi8KICAgcHVibGljIEx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0KCkgeworICAgIHRoaXMoUGFja2VkSW50cy5ERUZBVUxUKTsKKyAgfQorICAKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgTHVjZW5lNDJEb2NWYWx1ZXNGb3JtYXQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAqIDxjb2RlPmFjY2VwdGFibGVPdmVyaGVhZFJhdGlvPC9jb2RlPiBmb3IgTnVtZXJpY0RvY1ZhbHVlcy4KKyAgICogQHBhcmFtIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvIGNvbXByZXNzaW9uIHBhcmFtZXRlciBmb3IgbnVtZXJpY3MuIAorICAgKiAgICAgICAgQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIG51bWJlciBvZiB1bmlxdWUgdmFsdWVzIGlzIHNtYWxsLgorICAgKiAgICAgICAgCisgICAqIEBsdWNlbmUuZXhwZXJpbWVudGFsCisgICAqLworICBwdWJsaWMgTHVjZW5lNDJEb2NWYWx1ZXNGb3JtYXQoZmxvYXQgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8pIHsKICAgICBzdXBlcigiTHVjZW5lNDIiKTsKKyAgICB0aGlzLmFjY2VwdGFibGVPdmVyaGVhZFJhdGlvID0gYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW87CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIERvY1ZhbHVlc0NvbnN1bWVyIGZpZWxkc0NvbnN1bWVyKFNlZ21lbnRXcml0ZVN0YXRlIHN0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIC8vIG5vdGU6IHdlIGNob29zZSBERUZBVUxUIGhlcmUgKGl0cyByZWFzb25hYmx5IGZhc3QsIGFuZCBmb3Igc21hbGwgYnB2IGhhcyB0aW55IHdhc3RlKQotICAgIHJldHVybiBuZXcgTHVjZW5lNDJEb2NWYWx1ZXNDb25zdW1lcihzdGF0ZSwgREFUQV9DT0RFQywgREFUQV9FWFRFTlNJT04sIE1FVEFEQVRBX0NPREVDLCBNRVRBREFUQV9FWFRFTlNJT04sIFBhY2tlZEludHMuREVGQVVMVCk7CisgICAgcmV0dXJuIG5ldyBMdWNlbmU0MkRvY1ZhbHVlc0NvbnN1bWVyKHN0YXRlLCBEQVRBX0NPREVDLCBEQVRBX0VYVEVOU0lPTiwgTUVUQURBVEFfQ09ERUMsIE1FVEFEQVRBX0VYVEVOU0lPTiwgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8pOwogICB9CiAgIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc1Byb2R1Y2VyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvTHVjZW5lNDJEb2NWYWx1ZXNQcm9kdWNlci5qYXZhCmluZGV4IDMwYWFkMGYuLmM1YWMzZjEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0MkRvY1ZhbHVlc1Byb2R1Y2VyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL0x1Y2VuZTQyRG9jVmFsdWVzUHJvZHVjZXIuamF2YQpAQCAtMjc4LDcgKzI3OCw3IEBACiAgICAgICBpbnN0YW5jZSA9IGZzdEluc3RhbmNlcy5nZXQoZmllbGQubnVtYmVyKTsKICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgICAgIGRhdGEuc2VlayhlbnRyeS5vZmZzZXQpOwotICAgICAgICBpbnN0YW5jZSA9IG5ldyBGU1Q8TG9uZz4oZGF0YSwgUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKSk7CisgICAgICAgIGluc3RhbmNlID0gbmV3IEZTVDxMb25nPihkYXRhLCBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCkpOwogICAgICAgICBmc3RJbnN0YW5jZXMucHV0KGZpZWxkLm51bWJlciwgaW5zdGFuY2UpOwogICAgICAgfQogICAgIH0KQEAgLTM1Miw3ICszNTIsNyBAQAogICAgICAgaW5zdGFuY2UgPSBmc3RJbnN0YW5jZXMuZ2V0KGZpZWxkLm51bWJlcik7CiAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewogICAgICAgICBkYXRhLnNlZWsoZW50cnkub2Zmc2V0KTsKLSAgICAgICAgaW5zdGFuY2UgPSBuZXcgRlNUPExvbmc+KGRhdGEsIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSkpOworICAgICAgICBpbnN0YW5jZSA9IG5ldyBGU1Q8TG9uZz4oZGF0YSwgUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpKTsKICAgICAgICAgZnN0SW5zdGFuY2VzLnB1dChmaWVsZC5udW1iZXIsIGluc3RhbmNlKTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvTHVjZW5lNDJOb3Jtc0Zvcm1hdC5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL0x1Y2VuZTQyTm9ybXNGb3JtYXQuamF2YQppbmRleCA5YzA3YmMzLi5hN2M4YzFhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvTHVjZW5lNDJOb3Jtc0Zvcm1hdC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9MdWNlbmU0Mk5vcm1zRm9ybWF0LmphdmEKQEAgLTQyLDE0ICs0MiwzMiBAQAogICogQHNlZSBMdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTHVjZW5lNDJOb3Jtc0Zvcm1hdCBleHRlbmRzIE5vcm1zRm9ybWF0IHsKKyAgZmluYWwgZmxvYXQgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW87CiAKLSAgLyoqIFNvbGUgY29uc3RydWN0b3IgKi8KLSAgcHVibGljIEx1Y2VuZTQyTm9ybXNGb3JtYXQoKSB7fQorICAvKiogCisgICAqIENhbGxzIHtAbGluayAjTHVjZW5lNDJOb3Jtc0Zvcm1hdChmbG9hdCkgCisgICAqIEx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0KFBhY2tlZEludHMuRkFTVEVTVCl9IAorICAgKi8KKyAgcHVibGljIEx1Y2VuZTQyTm9ybXNGb3JtYXQoKSB7CisgICAgLy8gbm90ZTogd2UgY2hvb3NlIEZBU1RFU1QgaGVyZSAob3RoZXJ3aXNlIG91ciBub3JtcyBhcmUgaGFsZiBhcyBiaWcgYnV0IDE1JSBzbG93ZXIgdGhhbiBwcmV2aW91cyBsdWNlbmUpCisgICAgdGhpcyhQYWNrZWRJbnRzLkZBU1RFU1QpOworICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBMdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICogPGNvZGU+YWNjZXB0YWJsZU92ZXJoZWFkUmF0aW88L2NvZGU+IGZvciBOdW1lcmljRG9jVmFsdWVzLgorICAgKiBAcGFyYW0gYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8gY29tcHJlc3Npb24gcGFyYW1ldGVyIGZvciBudW1lcmljcy4gCisgICAqICAgICAgICBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSB2YWx1ZXMgaXMgc21hbGwuCisgICAqICAgICAgICAKKyAgICogQGx1Y2VuZS5leHBlcmltZW50YWwKKyAgICovCisgIHB1YmxpYyBMdWNlbmU0Mk5vcm1zRm9ybWF0KGZsb2F0IGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKSB7CisgICAgdGhpcy5hY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbyA9IGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvOworICB9CiAgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIERvY1ZhbHVlc0NvbnN1bWVyIG5vcm1zQ29uc3VtZXIoU2VnbWVudFdyaXRlU3RhdGUgc3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy8gbm90ZTogd2UgY2hvb3NlIEZBU1RFU1QgaGVyZSAob3RoZXJ3aXNlIG91ciBub3JtcyBhcmUgaGFsZiBhcyBiaWcgYnV0IDE1JSBzbG93ZXIgdGhhbiBwcmV2aW91cyBsdWNlbmUpCi0gICAgcmV0dXJuIG5ldyBMdWNlbmU0MkRvY1ZhbHVlc0NvbnN1bWVyKHN0YXRlLCBEQVRBX0NPREVDLCBEQVRBX0VYVEVOU0lPTiwgTUVUQURBVEFfQ09ERUMsIE1FVEFEQVRBX0VYVEVOU0lPTiwgUGFja2VkSW50cy5GQVNURVNUKTsKKyAgICByZXR1cm4gbmV3IEx1Y2VuZTQyRG9jVmFsdWVzQ29uc3VtZXIoc3RhdGUsIERBVEFfQ09ERUMsIERBVEFfRVhURU5TSU9OLCBNRVRBREFUQV9DT0RFQywgTUVUQURBVEFfRVhURU5TSU9OLCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbyk7CiAgIH0KICAgCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL3BhY2thZ2UuaHRtbCBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9sdWNlbmU0Mi9wYWNrYWdlLmh0bWwKaW5kZXggOWVkMTdkZi4uNTcxYjc2NiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2x1Y2VuZTQyL3BhY2thZ2UuaHRtbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvbHVjZW5lNDIvcGFja2FnZS5odG1sCkBAIC0zODQsMTMgKzM4NCw3IEBACiA8YSBuYW1lPSJMaW1pdGF0aW9ucyIgaWQ9IkxpbWl0YXRpb25zIj48L2E+CiA8aDI+TGltaXRhdGlvbnM8L2gyPgogPGRpdj4KLTxwPldoZW4gcmVmZXJyaW5nIHRvIHRlcm0gbnVtYmVycywgTHVjZW5lJ3MgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgSmF2YQotPGNvZGU+aW50PC9jb2RlPiB0byBob2xkIHRoZSB0ZXJtIGluZGV4LCB3aGljaCBtZWFucyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSB0ZXJtcyBpbiBhbnkgc2luZ2xlIGluZGV4IHNlZ21lbnQgaXMgfjIuMSBiaWxsaW9uCi10aW1lcyB0aGUgdGVybSBpbmRleCBpbnRlcnZhbCAoZGVmYXVsdCAxMjgpID0gfjI3NCBiaWxsaW9uLiBUaGlzIGlzIHRlY2huaWNhbGx5Ci1ub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBpbmRleCBmaWxlIGZvcm1hdCwganVzdCBvZiBMdWNlbmUncyBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbi48L3A+Ci08cD5TaW1pbGFybHksIEx1Y2VuZSB1c2VzIGEgSmF2YSA8Y29kZT5pbnQ8L2NvZGU+IHRvIHJlZmVyIHRvCis8cD5MdWNlbmUgdXNlcyBhIEphdmEgPGNvZGU+aW50PC9jb2RlPiB0byByZWZlciB0bwogZG9jdW1lbnQgbnVtYmVycywgYW5kIHRoZSBpbmRleCBmaWxlIGZvcm1hdCB1c2VzIGFuIDxjb2RlPkludDMyPC9jb2RlPgogb24tZGlzayB0byBzdG9yZSBkb2N1bWVudCBudW1iZXJzLiBUaGlzIGlzIGEgbGltaXRhdGlvbgogb2YgYm90aCB0aGUgaW5kZXggZmlsZSBmb3JtYXQgYW5kIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLiBFdmVudHVhbGx5IHRoZXNlCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9DaGVja0luZGV4LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9DaGVja0luZGV4LmphdmEKaW5kZXggMGVkYWRmYy4uMTQyYTY3YyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvQ2hlY2tJbmRleC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0NoZWNrSW5kZXguamF2YQpAQCAtNDYzLDExICs0NjMsMTEgQEAKIAogICAgIGlmIChvbmx5U2VnbWVudHMgIT0gbnVsbCkgewogICAgICAgcmVzdWx0LnBhcnRpYWwgPSB0cnVlOwotICAgICAgaWYgKGluZm9TdHJlYW0gIT0gbnVsbCkKKyAgICAgIGlmIChpbmZvU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgaW5mb1N0cmVhbS5wcmludCgiXG5DaGVja2luZyBvbmx5IHRoZXNlIHNlZ21lbnRzOiIpOwotICAgICAgZm9yIChTdHJpbmcgcyA6IG9ubHlTZWdtZW50cykgewotICAgICAgICBpZiAoaW5mb1N0cmVhbSAhPSBudWxsKQorICAgICAgICBmb3IgKFN0cmluZyBzIDogb25seVNlZ21lbnRzKSB7CiAgICAgICAgICAgaW5mb1N0cmVhbS5wcmludCgiICIgKyBzKTsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgcmVzdWx0LnNlZ21lbnRzQ2hlY2tlZC5hZGRBbGwob25seVNlZ21lbnRzKTsKICAgICAgIG1zZyhpbmZvU3RyZWFtLCAiOiIpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIuamF2YQppbmRleCA0MjIxMmVjLi43YzAxNWFhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIuamF2YQpAQCAtMzAsMTIgKzMwLDExIEBACiAgKiAgc2VwYXJhdGUgdGhyZWFkLgogICoKICAqICA8cD5TcGVjaWZ5IHRoZSBtYXggbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBtYXkgcnVuIGF0Ci0gKiAgb25jZSB3aXRoIHtAbGluayAjc2V0TWF4VGhyZWFkQ291bnR9LjwvcD4KKyAqICBvbmNlLCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBtZXJnZXMKKyAqICB3aXRoIHtAbGluayAjc2V0TWF4TWVyZ2VzQW5kVGhyZWFkc30uPC9wPgogICoKLSAqICA8cD5TZXBhcmF0ZWx5IHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cwotICogIG1lcmdlcyB3aXRoIHtAbGluayAjc2V0TWF4TWVyZ2VDb3VudH0uICBJZiB0aGUgbnVtYmVyIG9mCi0gKiAgbWVyZ2VzIGV4Y2VlZHMgdGhlIG1heCBudW1iZXIgb2YgdGhyZWFkcyB0aGVuIHRoZQotICogIGxhcmdlc3QgbWVyZ2VzIGFyZSBwYXVzZWQgdW50aWwgb25lIG9mIHRoZSBzbWFsbGVyCisgKiAgPHA+SWYgdGhlIG51bWJlciBvZiBtZXJnZXMgZXhjZWVkcyB0aGUgbWF4IG51bWJlciBvZiB0aHJlYWRzIAorICogIHRoZW4gdGhlIGxhcmdlc3QgbWVyZ2VzIGFyZSBwYXVzZWQgdW50aWwgb25lIG9mIHRoZSBzbWFsbGVyCiAgKiAgbWVyZ2VzIGNvbXBsZXRlcy48L3A+CiAgKgogICogIDxwPklmIG1vcmUgdGhhbiB7QGxpbmsgI2dldE1heE1lcmdlQ291bnR9IG1lcmdlcyBhcmUKQEAgLTQ5LDIxICs0OCwyOSBAQAogCiAgIC8qKiBMaXN0IG9mIGN1cnJlbnRseSBhY3RpdmUge0BsaW5rIE1lcmdlVGhyZWFkfXMuICovCiAgIHByb3RlY3RlZCBMaXN0PE1lcmdlVGhyZWFkPiBtZXJnZVRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PE1lcmdlVGhyZWFkPigpOworICAKKyAgLyoqIAorICAgKiBEZWZhdWx0IHtAY29kZSBtYXhUaHJlYWRDb3VudH0uCisgICAqIFdlIGRlZmF1bHQgdG8gMTogdGVzdHMgb24gc3Bpbm5pbmctbWFnbmV0IGRyaXZlcyBzaG93ZWQgc2xvd2VyCisgICAqIGluZGV4aW5nIHBlcmZvcm1hbmNlIGlmIG1vcmUgdGhhbiBvbmUgbWVyZ2UgdGhyZWFkIHJ1bnMgYXQKKyAgICogb25jZSAodGhvdWdoIG9uIGFuIFNTRCBpdCB3YXMgZmFzdGVyKQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEX0NPVU5UID0gMTsKKyAgCisgIC8qKiBEZWZhdWx0IHtAY29kZSBtYXhNZXJnZUNvdW50fS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfTUVSR0VfQ09VTlQgPSAyOwogCiAgIC8vIE1heCBudW1iZXIgb2YgbWVyZ2UgdGhyZWFkcyBhbGxvd2VkIHRvIGJlIHJ1bm5pbmcgYXQKICAgLy8gb25jZS4gIFdoZW4gdGhlcmUgYXJlIG1vcmUgbWVyZ2VzIHRoZW4gdGhpcywgd2UKICAgLy8gZm9yY2VmdWxseSBwYXVzZSB0aGUgbGFyZ2VyIG9uZXMsIGxldHRpbmcgdGhlIHNtYWxsZXIKICAgLy8gb25lcyBydW4sIHVwIHVudGlsIG1heE1lcmdlQ291bnQgbWVyZ2VzIGF0IHdoaWNoIHBvaW50CiAgIC8vIHdlIGZvcmNlZnVsbHkgcGF1c2UgaW5jb21pbmcgdGhyZWFkcyAodGhhdCBwcmVzdW1hYmx5Ci0gIC8vIGFyZSB0aGUgb25lcyBjYXVzaW5nIHNvIG11Y2ggbWVyZ2luZykuICBXZSBkZWZhdWx0IHRvIDEKLSAgLy8gaGVyZTogdGVzdHMgb24gc3Bpbm5pbmctbWFnbmV0IGRyaXZlcyBzaG93ZWQgc2xvd2VyCi0gIC8vIGluZGV4aW5nIHBlcmYgaWYgbW9yZSB0aGFuIG9uZSBtZXJnZSB0aHJlYWQgcnVucyBhdAotICAvLyBvbmNlICh0aG91Z2ggb24gYW4gU1NEIGl0IHdhcyBmYXN0ZXIpOgotICBwcml2YXRlIGludCBtYXhUaHJlYWRDb3VudCA9IDE7CisgIC8vIGFyZSB0aGUgb25lcyBjYXVzaW5nIHNvIG11Y2ggbWVyZ2luZykuCisgIHByaXZhdGUgaW50IG1heFRocmVhZENvdW50ID0gREVGQVVMVF9NQVhfVEhSRUFEX0NPVU5UOwogCiAgIC8vIE1heCBudW1iZXIgb2YgbWVyZ2VzIHdlIGFjY2VwdCBiZWZvcmUgZm9yY2VmdWxseQogICAvLyB0aHJvdHRsaW5nIHRoZSBpbmNvbWluZyB0aHJlYWRzCi0gIHByaXZhdGUgaW50IG1heE1lcmdlQ291bnQgPSAyOworICBwcml2YXRlIGludCBtYXhNZXJnZUNvdW50ID0gREVGQVVMVF9NQVhfTUVSR0VfQ09VTlQ7CiAKICAgLyoqIHtAbGluayBEaXJlY3Rvcnl9IHRoYXQgaG9sZHMgdGhlIGluZGV4LiAqLwogICBwcm90ZWN0ZWQgRGlyZWN0b3J5IGRpcjsKQEAgLTgwLDQzICs4Nyw0MCBAQAogICBwdWJsaWMgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKCkgewogICB9CiAKLSAgLyoqIFNldHMgdGhlIG1heCAjIHNpbXVsdGFuZW91cyBtZXJnZSB0aHJlYWRzIHRoYXQgc2hvdWxkCi0gICAqICBiZSBydW5uaW5nIGF0IG9uY2UuICBUaGlzIG11c3QgYmUgPD0ge0BsaW5rCi0gICAqICAjc2V0TWF4TWVyZ2VDb3VudH0uICovCi0gIHB1YmxpYyB2b2lkIHNldE1heFRocmVhZENvdW50KGludCBjb3VudCkgewotICAgIGlmIChjb3VudCA8IDEpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IHNob3VsZCBiZSBhdCBsZWFzdCAxIik7CisgIC8qKgorICAgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXJnZSB0aHJlYWRzIGFuZCBzaW11bHRhbmVvdXMgbWVyZ2VzIGFsbG93ZWQuCisgICAqIAorICAgKiBAcGFyYW0gbWF4TWVyZ2VDb3VudCB0aGUgbWF4ICMgc2ltdWx0YW5lb3VzIG1lcmdlcyB0aGF0IGFyZSBhbGxvd2VkLgorICAgKiAgICAgICBJZiBhIG1lcmdlIGlzIG5lY2Vzc2FyeSB5ZXQgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbWFueQorICAgKiAgICAgICB0aHJlYWRzIHJ1bm5pbmcsIHRoZSBpbmNvbWluZyB0aHJlYWQgKHRoYXQgaXMgY2FsbGluZworICAgKiAgICAgICBhZGQvdXBkYXRlRG9jdW1lbnQpIHdpbGwgYmxvY2sgdW50aWwgYSBtZXJnZSB0aHJlYWQKKyAgICogICAgICAgaGFzIGNvbXBsZXRlZC4gIE5vdGUgdGhhdCB3ZSB3aWxsIG9ubHkgcnVuIHRoZQorICAgKiAgICAgICBzbWFsbGVzdCA8Y29kZT5tYXhUaHJlYWRDb3VudDwvY29kZT4gbWVyZ2VzIGF0IGEgdGltZS4KKyAgICogQHBhcmFtIG1heFRocmVhZENvdW50IHRoZSBtYXggIyBzaW11bHRhbmVvdXMgbWVyZ2UgdGhyZWFkcyB0aGF0IHNob3VsZAorICAgKiAgICAgICBiZSBydW5uaW5nIGF0IG9uY2UuICBUaGlzIG11c3QgYmUgJmx0Oz0gPGNvZGU+bWF4TWVyZ2VDb3VudDwvY29kZT4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1heE1lcmdlc0FuZFRocmVhZHMoaW50IG1heE1lcmdlQ291bnQsIGludCBtYXhUaHJlYWRDb3VudCkgeworICAgIGlmIChtYXhUaHJlYWRDb3VudCA8IDEpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1heFRocmVhZENvdW50IHNob3VsZCBiZSBhdCBsZWFzdCAxIik7CiAgICAgfQotICAgIGlmIChjb3VudCA+IG1heE1lcmdlQ291bnQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IHNob3VsZCBiZSA8PSBtYXhNZXJnZUNvdW50ICg9ICIgKyBtYXhNZXJnZUNvdW50ICsgIikiKTsKKyAgICBpZiAobWF4TWVyZ2VDb3VudCA8IDEpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1heE1lcmdlQ291bnQgc2hvdWxkIGJlIGF0IGxlYXN0IDEiKTsKICAgICB9Ci0gICAgbWF4VGhyZWFkQ291bnQgPSBjb3VudDsKKyAgICBpZiAobWF4VGhyZWFkQ291bnQgPiBtYXhNZXJnZUNvdW50KSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXhUaHJlYWRDb3VudCBzaG91bGQgYmUgPD0gbWF4TWVyZ2VDb3VudCAoPSAiICsgbWF4TWVyZ2VDb3VudCArICIpIik7CisgICAgfQorICAgIHRoaXMubWF4VGhyZWFkQ291bnQgPSBtYXhUaHJlYWRDb3VudDsKKyAgICB0aGlzLm1heE1lcmdlQ291bnQgPSBtYXhNZXJnZUNvdW50OwogICB9CiAKICAgLyoqIFJldHVybnMge0Bjb2RlIG1heFRocmVhZENvdW50fS4KICAgICoKLSAgICogQHNlZSAjc2V0TWF4VGhyZWFkQ291bnQoaW50KSAqLworICAgKiBAc2VlICNzZXRNYXhNZXJnZXNBbmRUaHJlYWRzKGludCwgaW50KSAqLwogICBwdWJsaWMgaW50IGdldE1heFRocmVhZENvdW50KCkgewogICAgIHJldHVybiBtYXhUaHJlYWRDb3VudDsKICAgfQogCi0gIC8qKiBTZXRzIHRoZSBtYXggIyBzaW11bHRhbmVvdXMgbWVyZ2VzIHRoYXQgYXJlIGFsbG93ZWQuCi0gICAqICBJZiBhIG1lcmdlIGlzIG5lY2Vzc2FyeSB5ZXQgd2UgYWxyZWFkeSBoYXZlIHRoaXMgbWFueQotICAgKiAgdGhyZWFkcyBydW5uaW5nLCB0aGUgaW5jb21pbmcgdGhyZWFkICh0aGF0IGlzIGNhbGxpbmcKLSAgICogIGFkZC91cGRhdGVEb2N1bWVudCkgd2lsbCBibG9jayB1bnRpbCBhIG1lcmdlIHRocmVhZAotICAgKiAgaGFzIGNvbXBsZXRlZC4gIE5vdGUgdGhhdCB3ZSB3aWxsIG9ubHkgcnVuIHRoZQotICAgKiAgc21hbGxlc3Qge0BsaW5rICNzZXRNYXhUaHJlYWRDb3VudH0gbWVyZ2VzIGF0IGEgdGltZS4gKi8KLSAgcHVibGljIHZvaWQgc2V0TWF4TWVyZ2VDb3VudChpbnQgY291bnQpIHsKLSAgICBpZiAoY291bnQgPCAxKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCBzaG91bGQgYmUgYXQgbGVhc3QgMSIpOwotICAgIH0KLSAgICBpZiAoY291bnQgPCBtYXhUaHJlYWRDb3VudCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgc2hvdWxkIGJlID49IG1heFRocmVhZENvdW50ICg9ICIgKyBtYXhUaHJlYWRDb3VudCArICIpIik7Ci0gICAgfQotICAgIG1heE1lcmdlQ291bnQgPSBjb3VudDsKLSAgfQotCi0gIC8qKiBTZWUge0BsaW5rICNzZXRNYXhNZXJnZUNvdW50fS4gKi8KKyAgLyoqIFNlZSB7QGxpbmsgI3NldE1heE1lcmdlc0FuZFRocmVhZHN9LiAqLwogICBwdWJsaWMgaW50IGdldE1heE1lcmdlQ291bnQoKSB7CiAgICAgcmV0dXJuIG1heE1lcmdlQ291bnQ7CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0RpcmVjdG9yeVJlYWRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRGlyZWN0b3J5UmVhZGVyLmphdmEKaW5kZXggNzg4YjE1Ny4uZTIzNzJhMSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRGlyZWN0b3J5UmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRGlyZWN0b3J5UmVhZGVyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMjkxLDcgKzI5Miw3IEBACiAgICAgICAgICAgLy8gSU9FeGNlcHRpb24gYWxsb3dlZCB0byB0aHJvdyB0aGVyZSwgaW4gY2FzZQogICAgICAgICAgIC8vIHNlZ21lbnRzX04gaXMgY29ycnVwdAogICAgICAgICAgIHNpcy5yZWFkKGRpciwgZmlsZU5hbWUpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gfCBOb1N1Y2hGaWxlRXhjZXB0aW9uIGZuZmUpIHsKICAgICAgICAgICAvLyBMVUNFTkUtOTQ4OiBvbiBORlMgKGFuZCBtYXliZSBvdGhlcnMpLCBpZgogICAgICAgICAgIC8vIHlvdSBoYXZlIHdyaXRlcnMgc3dpdGNoaW5nIGJhY2sgYW5kIGZvcnRoCiAgICAgICAgICAgLy8gYmV0d2VlbiBtYWNoaW5lcywgaXQncyB2ZXJ5IGxpa2VseSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jQ29uc3VtZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0RvY0NvbnN1bWVyLmphdmEKaW5kZXggZTZkYzEyOS4uNzI0MmYwZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jQ29uc3VtZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2NDb25zdW1lci5qYXZhCkBAIC0yNCw1ICsyNCw0IEBACiAgIGFic3RyYWN0IHZvaWQgZmluaXNoRG9jdW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAgIGFic3RyYWN0IHZvaWQgZmx1c2goZmluYWwgU2VnbWVudFdyaXRlU3RhdGUgc3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKICAgYWJzdHJhY3Qgdm9pZCBhYm9ydCgpOwotICBhYnN0cmFjdCB2b2lkIGRvQWZ0ZXJGbHVzaCgpOwogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jRmllbGRQcm9jZXNzb3IuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0RvY0ZpZWxkUHJvY2Vzc29yLmphdmEKaW5kZXggNTU4NGRmZC4uZTMxOGUxMSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jRmllbGRQcm9jZXNzb3IuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2NGaWVsZFByb2Nlc3Nvci5qYXZhCkBAIC0xNDQsMTUgKzE0NCw2IEBACiAgICAgcmV0dXJuIGZpZWxkczsKICAgfQogCi0gIC8qKiBJbiBmbHVzaCB3ZSByZXNldCB0aGUgZmllbGRIYXNoIHRvIG5vdCBtYWludGFpbiBwZXItZmllbGQgc3RhdGUKLSAgICogIGFjcm9zcyBzZWdtZW50cyAqLwotICBAT3ZlcnJpZGUKLSAgdm9pZCBkb0FmdGVyRmx1c2goKSB7Ci0gICAgZmllbGRIYXNoID0gbmV3IERvY0ZpZWxkUHJvY2Vzc29yUGVyRmllbGRbMl07Ci0gICAgaGFzaE1hc2sgPSAxOwotICAgIHRvdGFsRmllbGRDb3VudCA9IDA7Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgcmVoYXNoKCkgewogICAgIGZpbmFsIGludCBuZXdIYXNoU2l6ZSA9IChmaWVsZEhhc2gubGVuZ3RoKjIpOwogICAgIGFzc2VydCBuZXdIYXNoU2l6ZSA+IGZpZWxkSGFzaC5sZW5ndGg7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2NGaWVsZFByb2Nlc3NvclBlckZpZWxkLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2NGaWVsZFByb2Nlc3NvclBlckZpZWxkLmphdmEKaW5kZXggMzY3MTU2ZS4uMzJmYWQxNSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jRmllbGRQcm9jZXNzb3JQZXJGaWVsZC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0RvY0ZpZWxkUHJvY2Vzc29yUGVyRmllbGQuamF2YQpAQCAtMTcsMTIgKzE3LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5BcnJheVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkNvdW50ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5SYW1Vc2FnZUVzdGltYXRvcjsKIAogLyoqCkBAIC0zMywxOSArMjgsMTYgQEAKIAogICBmaW5hbCBEb2NGaWVsZENvbnN1bWVyUGVyRmllbGQgY29uc3VtZXI7CiAgIGZpbmFsIEZpZWxkSW5mbyBmaWVsZEluZm87Ci0gIHByaXZhdGUgZmluYWwgQ291bnRlciBieXRlc1VzZWQ7CiAKICAgRG9jRmllbGRQcm9jZXNzb3JQZXJGaWVsZCBuZXh0OwogICBpbnQgbGFzdEdlbiA9IC0xOwogCiAgIGludCBmaWVsZENvdW50OwogICBJbmRleGFibGVGaWVsZFtdIGZpZWxkcyA9IG5ldyBJbmRleGFibGVGaWVsZFsxXTsKLSAgcHJpdmF0ZSBmaW5hbCBNYXA8RmllbGRJbmZvLFN0cmluZz4gZHZGaWVsZHMgPSBuZXcgSGFzaE1hcDxGaWVsZEluZm8sU3RyaW5nPigpOwogCiAgIHB1YmxpYyBEb2NGaWVsZFByb2Nlc3NvclBlckZpZWxkKGZpbmFsIERvY0ZpZWxkUHJvY2Vzc29yIGRvY0ZpZWxkUHJvY2Vzc29yLCBmaW5hbCBGaWVsZEluZm8gZmllbGRJbmZvKSB7CiAgICAgdGhpcy5jb25zdW1lciA9IGRvY0ZpZWxkUHJvY2Vzc29yLmNvbnN1bWVyLmFkZEZpZWxkKGZpZWxkSW5mbyk7CiAgICAgdGhpcy5maWVsZEluZm8gPSBmaWVsZEluZm87Ci0gICAgdGhpcy5ieXRlc1VzZWQgPSBkb2NGaWVsZFByb2Nlc3Nvci5ieXRlc1VzZWQ7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRGaWVsZChJbmRleGFibGVGaWVsZCBmaWVsZCkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jdW1lbnRzV3JpdGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXIuamF2YQppbmRleCAzMTcyZjg2Li5jNTFiZTg5IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXIuamF2YQpAQCAtMjksMTUgKzI5LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkLkluZGV4aW5nQ2hhaW47CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkUG9vbC5UaHJlYWRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5GaWVsZEluZm9zLkZpZWxkTnVtYmVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guTWF0Y2hBbGxEb2NzUXVlcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5BbHJlYWR5Q2xvc2VkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GbHVzaEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSU9Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSW5mb1N0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLk11dGFibGVCaXRzOwogCiAvKioKICAqIFRoaXMgY2xhc3MgYWNjZXB0cyBtdWx0aXBsZSBhZGRlZCBkb2N1bWVudHMgYW5kIGRpcmVjdGx5CkBAIC0xMTQsNiArMTEwLDcgQEAKICAgTGlzdDxTdHJpbmc+IG5ld0ZpbGVzOwogCiAgIGZpbmFsIEluZGV4V3JpdGVyIGluZGV4V3JpdGVyOworICBmaW5hbCBMaXZlSW5kZXhXcml0ZXJDb25maWcgaW5kZXhXcml0ZXJDb25maWc7CiAKICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG51bURvY3NJblJBTSA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOwogCkBAIC0xNDQsNiArMTQxLDcgQEAKICAgICB0aGlzLmluZGV4V3JpdGVyID0gd3JpdGVyOwogICAgIHRoaXMuaW5mb1N0cmVhbSA9IGNvbmZpZy5nZXRJbmZvU3RyZWFtKCk7CiAgICAgdGhpcy5zaW1pbGFyaXR5ID0gY29uZmlnLmdldFNpbWlsYXJpdHkoKTsKKyAgICB0aGlzLmluZGV4V3JpdGVyQ29uZmlnID0gd3JpdGVyLmdldENvbmZpZygpOwogICAgIHRoaXMucGVyVGhyZWFkUG9vbCA9IGNvbmZpZy5nZXRJbmRleGVyVGhyZWFkUG9vbCgpOwogICAgIHRoaXMuY2hhaW4gPSBjb25maWcuZ2V0SW5kZXhpbmdDaGFpbigpOwogICAgIHRoaXMucGVyVGhyZWFkUG9vbC5pbml0aWFsaXplKHRoaXMsIGdsb2JhbEZpZWxkTnVtYmVycywgY29uZmlnKTsKQEAgLTUxNyw3ICs1MTUsNyBAQAogICAgIC8vIGJ1ZmZlciwgZm9yY2UgdGhlbSBhbGwgdG8gYXBwbHkgbm93LiBUaGlzIGlzIHRvCiAgICAgLy8gcHJldmVudCB0b28tZnJlcXVlbnQgZmx1c2hpbmcgb2YgYSBsb25nIHRhaWwgb2YKICAgICAvLyB0aW55IHNlZ21lbnRzOgotICAgIGZpbmFsIGRvdWJsZSByYW1CdWZmZXJTaXplTUIgPSBpbmRleFdyaXRlci5nZXRDb25maWcoKS5nZXRSQU1CdWZmZXJTaXplTUIoKTsKKyAgICBmaW5hbCBkb3VibGUgcmFtQnVmZmVyU2l6ZU1CID0gaW5kZXhXcml0ZXJDb25maWcuZ2V0UkFNQnVmZmVyU2l6ZU1CKCk7CiAgICAgaWYgKHJhbUJ1ZmZlclNpemVNQiAhPSBJbmRleFdyaXRlckNvbmZpZy5ESVNBQkxFX0FVVE9fRkxVU0ggJiYKICAgICAgICAgZmx1c2hDb250cm9sLmdldERlbGV0ZUJ5dGVzVXNlZCgpID4gKDEwMjQqMTAyNCpyYW1CdWZmZXJTaXplTUIvMikpIHsKICAgICAgIGlmIChpbmZvU3RyZWFtLmlzRW5hYmxlZCgiRFciKSkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQuamF2YQppbmRleCAzNDk0MzIyLi5jZGM1MDg4IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQuamF2YQpAQCAtMTEyLDcgKzExMiw3IEBACiAKICAgICAvLyBPbmx5IGNhbGxlZCBieSBhc3NlcnRzCiAgICAgcHVibGljIGJvb2xlYW4gdGVzdFBvaW50KFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gZG9jV3JpdGVyLndyaXRlci50ZXN0UG9pbnQobmFtZSk7CisgICAgICByZXR1cm4gZG9jV3JpdGVyLnRlc3RQb2ludChuYW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKQEAgLTE5NCw2ICsxOTQsNyBAQAogICBwcml2YXRlIGZpbmFsIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZShMb2NhbGUuUk9PVCk7CiAgIGZpbmFsIEFsbG9jYXRvciBieXRlQmxvY2tBbGxvY2F0b3I7CiAgIGZpbmFsIEludEJsb2NrUG9vbC5BbGxvY2F0b3IgaW50QmxvY2tBbGxvY2F0b3I7CisgIHByaXZhdGUgZmluYWwgTGl2ZUluZGV4V3JpdGVyQ29uZmlnIGluZGV4V3JpdGVyQ29uZmlnOwogCiAgIAogICBwdWJsaWMgRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkKERpcmVjdG9yeSBkaXJlY3RvcnksIERvY3VtZW50c1dyaXRlciBwYXJlbnQsCkBAIC0yMDMsNiArMjA0LDcgQEAKICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICB0aGlzLmZpZWxkSW5mb3MgPSBmaWVsZEluZm9zOwogICAgIHRoaXMud3JpdGVyID0gcGFyZW50LmluZGV4V3JpdGVyOworICAgIHRoaXMuaW5kZXhXcml0ZXJDb25maWcgPSBwYXJlbnQuaW5kZXhXcml0ZXJDb25maWc7CiAgICAgdGhpcy5pbmZvU3RyZWFtID0gcGFyZW50LmluZm9TdHJlYW07CiAgICAgdGhpcy5jb2RlYyA9IHBhcmVudC5jb2RlYzsKICAgICB0aGlzLmRvY1N0YXRlID0gbmV3IERvY1N0YXRlKHRoaXMsIGluZm9TdHJlYW0pOwpAQCAtMjMyLDYgKzIzNCwxMyBAQAogICAgIGFib3J0aW5nID0gdHJ1ZTsKICAgfQogICAKKyAgZmluYWwgYm9vbGVhbiB0ZXN0UG9pbnQoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAoaW5mb1N0cmVhbS5pc0VuYWJsZWQoIlRQIikpIHsKKyAgICAgIGluZm9TdHJlYW0ubWVzc2FnZSgiVFAiLCBtZXNzYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCiAgIGJvb2xlYW4gY2hlY2tBbmRSZXNldEhhc0Fib3J0ZWQoKSB7CiAgICAgZmluYWwgYm9vbGVhbiByZXR2YWwgPSBoYXNBYm9ydGVkOwogICAgIGhhc0Fib3J0ZWQgPSBmYWxzZTsKQEAgLTIzOSw3ICsyNDgsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdXBkYXRlRG9jdW1lbnQoSW5kZXhEb2N1bWVudCBkb2MsIEFuYWx5emVyIGFuYWx5emVyLCBUZXJtIGRlbFRlcm0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0IHdyaXRlci50ZXN0UG9pbnQoIkRvY3VtZW50c1dyaXRlclBlclRocmVhZCBhZGREb2N1bWVudCBzdGFydCIpOworICAgIGFzc2VydCB0ZXN0UG9pbnQoIkRvY3VtZW50c1dyaXRlclBlclRocmVhZCBhZGREb2N1bWVudCBzdGFydCIpOwogICAgIGFzc2VydCBkZWxldGVRdWV1ZSAhPSBudWxsOwogICAgIGRvY1N0YXRlLmRvYyA9IGRvYzsKICAgICBkb2NTdGF0ZS5hbmFseXplciA9IGFuYWx5emVyOwpAQCAtMjkyLDcgKzMwMSw3IEBACiAgIH0KICAgCiAgIHB1YmxpYyBpbnQgdXBkYXRlRG9jdW1lbnRzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJbmRleERvY3VtZW50PiBkb2NzLCBBbmFseXplciBhbmFseXplciwgVGVybSBkZWxUZXJtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGFzc2VydCB3cml0ZXIudGVzdFBvaW50KCJEb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQgYWRkRG9jdW1lbnRzIHN0YXJ0Iik7CisgICAgYXNzZXJ0IHRlc3RQb2ludCgiRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkIGFkZERvY3VtZW50cyBzdGFydCIpOwogICAgIGFzc2VydCBkZWxldGVRdWV1ZSAhPSBudWxsOwogICAgIGRvY1N0YXRlLmFuYWx5emVyID0gYW5hbHl6ZXI7CiAgICAgaWYgKHNlZ21lbnRJbmZvID09IG51bGwpIHsKQEAgLTQyOCw3ICs0MzcsNiBAQAogICAvKiogUmVzZXQgYWZ0ZXIgYSBmbHVzaCAqLwogICBwcml2YXRlIHZvaWQgZG9BZnRlckZsdXNoKCkgewogICAgIHNlZ21lbnRJbmZvID0gbnVsbDsKLSAgICBjb25zdW1lci5kb0FmdGVyRmx1c2goKTsKICAgICBkaXJlY3RvcnkuZ2V0Q3JlYXRlZEZpbGVzKCkuY2xlYXIoKTsKICAgICBmaWVsZEluZm9zID0gbmV3IEZpZWxkSW5mb3MuQnVpbGRlcihmaWVsZEluZm9zLmdsb2JhbEZpZWxkTnVtYmVycyk7CiAgICAgcGFyZW50LnN1YnRyYWN0Rmx1c2hlZE51bURvY3MobnVtRG9jc0luUkFNKTsKQEAgLTU2MSw3ICs1NjksNyBAQAogCiAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgdHJ5IHsKLSAgICAgIGlmICh3cml0ZXIudXNlQ29tcG91bmRGaWxlKG5ld1NlZ21lbnQpKSB7CisgICAgICBpZiAoaW5kZXhXcml0ZXJDb25maWcuZ2V0VXNlQ29tcG91bmRGaWxlKCkpIHsKIAogICAgICAgICAvLyBOb3cgYnVpbGQgY29tcG91bmQgZmlsZQogICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gb2xkRmlsZXMgPSBJbmRleFdyaXRlci5jcmVhdGVDb21wb3VuZEZpbGUoaW5mb1N0cmVhbSwgZGlyZWN0b3J5LCBNZXJnZVN0YXRlLkNoZWNrQWJvcnQuTk9ORSwgbmV3U2VnbWVudC5pbmZvLCBjb250ZXh0KTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4RGVsZXRpb25Qb2xpY3kuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4RGVsZXRpb25Qb2xpY3kuamF2YQppbmRleCAxZThjYTM1Li5jYTA0ZjMwIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9JbmRleERlbGV0aW9uUG9saWN5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvSW5kZXhEZWxldGlvblBvbGljeS5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKKwogLyoqCiAgKiA8cD5FeHBlcnQ6IHBvbGljeSBmb3IgZGVsZXRpb24gb2Ygc3RhbGUge0BsaW5rIEluZGV4Q29tbWl0IGluZGV4IGNvbW1pdHN9LiAKICAqIApAQCAtNDYsNiArNDgsMTAgQEAKICAqIHRhcmdldD0idG9wIgogICogaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0xVQ0VORS03MTAiPkxVQ0VORS03MTA8L2E+CiAgKiBmb3IgZGV0YWlscy48L3A+CisgKgorICogPHA+SW1wbGVtZW50ZXJzIG9mIHN1Yi1jbGFzc2VzIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB7QGxpbmsgI2Nsb25lKCl9CisgKiByZXR1cm5zIGFuIGluZGVwZW5kZW50IGluc3RhbmNlIGFibGUgdG8gd29yayB3aXRoIGFueSBvdGhlciB7QGxpbmsgSW5kZXhXcml0ZXJ9CisgKiBvciB7QGxpbmsgRGlyZWN0b3J5fSBpbnN0YW5jZS48L3A+CiAgKi8KIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEluZGV4RGVsZXRpb25Qb2xpY3kgaW1wbGVtZW50cyBDbG9uZWFibGUgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvSW5kZXhGaWxlRGVsZXRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvSW5kZXhGaWxlRGVsZXRlci5qYXZhCmluZGV4IGM2ZWM1ZDAuLjlmZjAwMDUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4RmlsZURlbGV0ZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9JbmRleEZpbGVEZWxldGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTE3MCw3ICsxNzEsNyBAQAogICAgICAgICAgICAgU2VnbWVudEluZm9zIHNpcyA9IG5ldyBTZWdtZW50SW5mb3MoKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgIHNpcy5yZWFkKGRpcmVjdG9yeSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAvLyBMVUNFTkUtOTQ4OiBvbiBORlMgKGFuZCBtYXliZSBvdGhlcnMpLCBpZgogICAgICAgICAgICAgICAvLyB5b3UgaGF2ZSB3cml0ZXJzIHN3aXRjaGluZyBiYWNrIGFuZCBmb3J0aAogICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG1hY2hpbmVzLCBpdCdzIHZlcnkgbGlrZWx5IHRoYXQgdGhlCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9JbmRleFdyaXRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvSW5kZXhXcml0ZXIuamF2YQppbmRleCBjMzQ2Y2E4Li5kODkxNTYyIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9JbmRleFdyaXRlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4V3JpdGVyLmphdmEKQEAgLTIxNCw3ICsyMTQsNyBAQAogICBwcml2YXRlIGZpbmFsIEFuYWx5emVyIGFuYWx5emVyOyAgICAvLyBob3cgdG8gYW5hbHl6ZSB0ZXh0CiAKICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGNoYW5nZUNvdW50OyAvLyBpbmNyZW1lbnRzIGV2ZXJ5IHRpbWUgYSBjaGFuZ2UgaXMgY29tcGxldGVkCi0gIHByaXZhdGUgbG9uZyBsYXN0Q29tbWl0Q2hhbmdlQ291bnQ7IC8vIGxhc3QgY2hhbmdlQ291bnQgdGhhdCB3YXMgY29tbWl0dGVkCisgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBsYXN0Q29tbWl0Q2hhbmdlQ291bnQ7IC8vIGxhc3QgY2hhbmdlQ291bnQgdGhhdCB3YXMgY29tbWl0dGVkCiAKICAgcHJpdmF0ZSBMaXN0PFNlZ21lbnRJbmZvUGVyQ29tbWl0PiByb2xsYmFja1NlZ21lbnRzOyAgICAgIC8vIGxpc3Qgb2Ygc2VnbWVudEluZm8gd2Ugd2lsbCBmYWxsYmFjayB0byBpZiB0aGUgY29tbWl0IGZhaWxzCiAKQEAgLTYzMSw3ICs2MzEsMTIgQEAKICAgLyoqCiAgICAqIENvbnN0cnVjdHMgYSBuZXcgSW5kZXhXcml0ZXIgcGVyIHRoZSBzZXR0aW5ncyBnaXZlbiBpbiA8Y29kZT5jb25mPC9jb2RlPi4KICAgICogTm90ZSB0aGF0IHRoZSBwYXNzZWQgaW4ge0BsaW5rIEluZGV4V3JpdGVyQ29uZmlnfSBpcwotICAgKiBwcml2YXRlbHkgY2xvbmVkOyBpZiB5b3UgbmVlZCB0byBtYWtlIHN1YnNlcXVlbnQgImxpdmUiCisgICAqIHByaXZhdGVseSBjbG9uZWQsIHdoaWNoLCBpbi10dXJuLCBjbG9uZXMgdGhlCisgICAqIHtAbGluayBJbmRleFdyaXRlckNvbmZpZyNnZXRGbHVzaFBvbGljeSgpIGZsdXNoIHBvbGljeX0sCisgICAqIHtAbGluayBJbmRleFdyaXRlckNvbmZpZyNnZXRJbmRleERlbGV0aW9uUG9saWN5KCkgZGVsZXRpb24gcG9saWN5fSwKKyAgICoge0BsaW5rIEluZGV4V3JpdGVyQ29uZmlnI2dldE1lcmdlUG9saWN5KCkgbWVyZ2UgcG9saWN5fSwKKyAgICogYW5kIHtAbGluayBJbmRleFdyaXRlckNvbmZpZyNnZXRNZXJnZVNjaGVkdWxlcigpIG1lcmdlIHNjaGVkdWxlcn0uCisgICAqIElmIHlvdSBuZWVkIHRvIG1ha2Ugc3Vic2VxdWVudCAibGl2ZSIKICAgICogY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbiB1c2Uge0BsaW5rICNnZXRDb25maWd9LgogICAgKiA8cD4KICAgICogCkBAIC0yMjY5LDEwICsyMjc0LDYgQEAKICAgICB9CiAgIH0KIAotICBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUoU2VnbWVudEluZm9QZXJDb21taXQgc2VnbWVudEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG1lcmdlUG9saWN5LnVzZUNvbXBvdW5kRmlsZShzZWdtZW50SW5mb3MsIHNlZ21lbnRJbmZvKTsKLSAgfQotCiAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVzZXRNZXJnZUV4Y2VwdGlvbnMoKSB7CiAgICAgbWVyZ2VFeGNlcHRpb25zID0gbmV3IEFycmF5TGlzdDxNZXJnZVBvbGljeS5PbmVNZXJnZT4oKTsKICAgICBtZXJnZUdlbisrOwpAQCAtMjgyNiw2ICsyODI3LDExIEBACiAgICAgY29tbWl0SW50ZXJuYWwoKTsKICAgfQogCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGNvbW1pdHRlZCAqLworICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNVbmNvbW1pdHRlZENoYW5nZXMoKSB7CisgICAgcmV0dXJuIGNoYW5nZUNvdW50ICE9IGxhc3RDb21taXRDaGFuZ2VDb3VudDsKKyAgfQorCiAgIHByaXZhdGUgZmluYWwgdm9pZCBjb21taXRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICBpZiAoaW5mb1N0cmVhbS5pc0VuYWJsZWQoIklXIikpIHsKQEAgLTI4NjUsOCArMjg3MSw4IEBACiAgICAgICAgIGlmIChpbmZvU3RyZWFtLmlzRW5hYmxlZCgiSVciKSkgewogICAgICAgICAgIGluZm9TdHJlYW0ubWVzc2FnZSgiSVciLCAiY29tbWl0OiB3cm90ZSBzZWdtZW50cyBmaWxlIFwiIiArIHBlbmRpbmdDb21taXQuZ2V0U2VnbWVudHNGaWxlTmFtZSgpICsgIlwiIik7CiAgICAgICAgIH0KLSAgICAgICAgbGFzdENvbW1pdENoYW5nZUNvdW50ID0gcGVuZGluZ0NvbW1pdENoYW5nZUNvdW50OwogICAgICAgICBzZWdtZW50SW5mb3MudXBkYXRlR2VuZXJhdGlvbihwZW5kaW5nQ29tbWl0KTsKKyAgICAgICAgbGFzdENvbW1pdENoYW5nZUNvdW50ID0gcGVuZGluZ0NvbW1pdENoYW5nZUNvdW50OwogICAgICAgICByb2xsYmFja1NlZ21lbnRzID0gcGVuZGluZ0NvbW1pdC5jcmVhdGVCYWNrdXBTZWdtZW50SW5mb3MoKTsKICAgICAgICAgZGVsZXRlci5jaGVja3BvaW50KHBlbmRpbmdDb21taXQsIHRydWUpOwogICAgICAgfSBmaW5hbGx5IHsKQEAgLTQxNjIsNyArNDE2OCwxMCBAQAogICAvLyAgIHN0YXJ0Q29tbWl0TWVyZ2VEZWxldGVzCiAgIC8vICAgc3RhcnRNZXJnZUluaXQKICAgLy8gICBEb2N1bWVudHNXcml0ZXIuVGhyZWFkU3RhdGUuaW5pdCBzdGFydAotICBib29sZWFuIHRlc3RQb2ludChTdHJpbmcgbmFtZSkgeworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdGVzdFBvaW50KFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYgKGluZm9TdHJlYW0uaXNFbmFibGVkKCJUUCIpKSB7CisgICAgICBpbmZvU3RyZWFtLm1lc3NhZ2UoIlRQIiwgbWVzc2FnZSk7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4V3JpdGVyQ29uZmlnLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9JbmRleFdyaXRlckNvbmZpZy5qYXZhCmluZGV4IGRlOGQ5NTguLjQzZGUzODEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0luZGV4V3JpdGVyQ29uZmlnLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvSW5kZXhXcml0ZXJDb25maWcuamF2YQpAQCAtMTEwLDYgKzExMCwxMCBAQAogICAgKiAgb3RoZXJzIHRvIGZpbmlzaC4gRGVmYXVsdCB2YWx1ZSBpcyA4LiAqLwogICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX01BWF9USFJFQURfU1RBVEVTID0gODsKICAgCisgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciBjb21wb3VuZCBmaWxlIHN5c3RlbSBmb3IgbmV3bHkgd3JpdHRlbiBzZWdtZW50cworICAgKiAgKHNldCB0byA8Y29kZT50cnVlPC9jb2RlPikuIEZvciBiYXRjaCBpbmRleGluZyB3aXRoIHZlcnkgbGFyZ2UgCisgICAqICByYW0gYnVmZmVycyB1c2UgPGNvZGU+ZmFsc2U8L2NvZGU+ICovCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUZBVUxUX1VTRV9DT01QT1VORF9GSUxFX1NZU1RFTSA9IHRydWU7CiAgIC8qKgogICAgKiBTZXRzIHRoZSBkZWZhdWx0IChmb3IgYW55IGluc3RhbmNlKSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgYSB3cml0ZSBsb2NrCiAgICAqIChpbiBtaWxsaXNlY29uZHMpLgpAQCAtNTQwLDUgKzU0NCw5IEBACiAgIHB1YmxpYyBJbmRleFdyaXRlckNvbmZpZyBzZXRUZXJtSW5kZXhJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKICAgICByZXR1cm4gKEluZGV4V3JpdGVyQ29uZmlnKSBzdXBlci5zZXRUZXJtSW5kZXhJbnRlcnZhbChpbnRlcnZhbCk7CiAgIH0KKyAgCisgIHB1YmxpYyBJbmRleFdyaXRlckNvbmZpZyBzZXRVc2VDb21wb3VuZEZpbGUoYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUpIHsKKyAgICByZXR1cm4gKEluZGV4V3JpdGVyQ29uZmlnKSBzdXBlci5zZXRVc2VDb21wb3VuZEZpbGUodXNlQ29tcG91bmRGaWxlKTsKKyAgfQogCiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9MaXZlSW5kZXhXcml0ZXJDb25maWcuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0xpdmVJbmRleFdyaXRlckNvbmZpZy5qYXZhCmluZGV4IDQ0ODcxNWEuLjhiYjM0NGUgMTAwNzU1Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0xpdmVJbmRleFdyaXRlckNvbmZpZy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0xpdmVJbmRleFdyaXRlckNvbmZpZy5qYXZhCkBAIC05OCw2ICs5OCw5IEBACiAgIC8qKiB7QGxpbmsgVmVyc2lvbn0gdGhhdCB7QGxpbmsgSW5kZXhXcml0ZXJ9IHNob3VsZCBlbXVsYXRlLiAqLwogICBwcm90ZWN0ZWQgZmluYWwgVmVyc2lvbiBtYXRjaFZlcnNpb247CiAKKyAgLyoqIFRydWUgaWYgc2VnbWVudCBmbHVzaGVzIHNob3VsZCB1c2UgY29tcG91bmQgZmlsZSBmb3JtYXQgKi8KKyAgcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gdXNlQ29tcG91bmRGaWxlID0gSW5kZXhXcml0ZXJDb25maWcuREVGQVVMVF9VU0VfQ09NUE9VTkRfRklMRV9TWVNURU07CisKICAgLy8gdXNlZCBieSBJbmRleFdyaXRlckNvbmZpZwogICBMaXZlSW5kZXhXcml0ZXJDb25maWcoQW5hbHl6ZXIgYW5hbHl6ZXIsIFZlcnNpb24gbWF0Y2hWZXJzaW9uKSB7CiAgICAgdGhpcy5hbmFseXplciA9IGFuYWx5emVyOwpAQCAtMTEwLDYgKzExMyw3IEBACiAgICAgdGVybUluZGV4SW50ZXJ2YWwgPSBJbmRleFdyaXRlckNvbmZpZy5ERUZBVUxUX1RFUk1fSU5ERVhfSU5URVJWQUw7IC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHByaXZhdGUgdG8gdGhlIGNvZGVjLCBub3Qgc2V0dGFibGUgaGVyZQogICAgIGRlbFBvbGljeSA9IG5ldyBLZWVwT25seUxhc3RDb21taXREZWxldGlvblBvbGljeSgpOwogICAgIGNvbW1pdCA9IG51bGw7CisgICAgdXNlQ29tcG91bmRGaWxlID0gSW5kZXhXcml0ZXJDb25maWcuREVGQVVMVF9VU0VfQ09NUE9VTkRfRklMRV9TWVNURU07CiAgICAgb3Blbk1vZGUgPSBPcGVuTW9kZS5DUkVBVEVfT1JfQVBQRU5EOwogICAgIHNpbWlsYXJpdHkgPSBJbmRleFNlYXJjaGVyLmdldERlZmF1bHRTaW1pbGFyaXR5KCk7CiAgICAgbWVyZ2VTY2hlZHVsZXIgPSBuZXcgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKCk7CkBAIC0xNTQsNiArMTU4LDcgQEAKICAgICByZWFkZXJQb29saW5nID0gY29uZmlnLmdldFJlYWRlclBvb2xpbmcoKTsKICAgICBmbHVzaFBvbGljeSA9IGNvbmZpZy5nZXRGbHVzaFBvbGljeSgpOwogICAgIHBlclRocmVhZEhhcmRMaW1pdE1CID0gY29uZmlnLmdldFJBTVBlclRocmVhZEhhcmRMaW1pdE1CKCk7CisgICAgdXNlQ29tcG91bmRGaWxlID0gY29uZmlnLmdldFVzZUNvbXBvdW5kRmlsZSgpOwogICB9CiAKICAgLyoqIFJldHVybnMgdGhlIGRlZmF1bHQgYW5hbHl6ZXIgdG8gdXNlIGZvciBpbmRleGluZyBkb2N1bWVudHMuICovCkBAIC01NDIsNiArNTQ3LDMzIEBACiAgICAgcmV0dXJuIGluZm9TdHJlYW07CiAgIH0KICAgCisgIC8qKgorICAgKiBTZXRzIGlmIHRoZSB7QGxpbmsgSW5kZXhXcml0ZXJ9IHNob3VsZCBwYWNrIG5ld2x5IHdyaXR0ZW4gc2VnbWVudHMgaW4gYQorICAgKiBjb21wb3VuZCBmaWxlLiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgKiA8cD4KKyAgICogVXNlIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYmF0Y2ggaW5kZXhpbmcgd2l0aCB2ZXJ5IGxhcmdlIHJhbSBidWZmZXIKKyAgICogc2V0dGluZ3MuCisgICAqIDwvcD4KKyAgICogPHA+CisgICAqIDxiPk5vdGU6IFRvIGNvbnRyb2wgY29tcG91bmQgZmlsZSB1c2FnZSBkdXJpbmcgc2VnbWVudCBtZXJnZXMgc2VlCisgICAqIHtAbGluayBNZXJnZVBvbGljeSNzZXROb0NGU1JhdGlvKGRvdWJsZSl9IGFuZAorICAgKiB7QGxpbmsgTWVyZ2VQb2xpY3kjc2V0TWF4Q0ZTU2VnbWVudFNpemVNQihkb3VibGUpfS4gVGhpcyBzZXR0aW5nIG9ubHkKKyAgICogYXBwbGllcyB0byBuZXdseSBjcmVhdGVkIHNlZ21lbnRzLjwvYj4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIExpdmVJbmRleFdyaXRlckNvbmZpZyBzZXRVc2VDb21wb3VuZEZpbGUoYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUpIHsKKyAgICB0aGlzLnVzZUNvbXBvdW5kRmlsZSA9IHVzZUNvbXBvdW5kRmlsZTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSB7QGxpbmsgSW5kZXhXcml0ZXJ9IHBhY2tzCisgICAqIG5ld2x5IHdyaXR0ZW4gc2VnbWVudHMgaW4gYSBjb21wb3VuZCBmaWxlLiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ29tcG91bmRGaWxlKCkgeworICAgIHJldHVybiB1c2VDb21wb3VuZEZpbGUgOworICB9CisgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTU2Nyw3ICs1OTksMTAgQEAKICAgICBzYi5hcHBlbmQoImluZGV4ZXJUaHJlYWRQb29sPSIpLmFwcGVuZChnZXRJbmRleGVyVGhyZWFkUG9vbCgpKS5hcHBlbmQoIlxuIik7CiAgICAgc2IuYXBwZW5kKCJyZWFkZXJQb29saW5nPSIpLmFwcGVuZChnZXRSZWFkZXJQb29saW5nKCkpLmFwcGVuZCgiXG4iKTsKICAgICBzYi5hcHBlbmQoInBlclRocmVhZEhhcmRMaW1pdE1CPSIpLmFwcGVuZChnZXRSQU1QZXJUaHJlYWRIYXJkTGltaXRNQigpKS5hcHBlbmQoIlxuIik7CisgICAgc2IuYXBwZW5kKCJ1c2VDb21wb3VuZEZpbGU9IikuYXBwZW5kKGdldFVzZUNvbXBvdW5kRmlsZSgpKS5hcHBlbmQoIlxuIik7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KIAorCisKIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0xvZ01lcmdlUG9saWN5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Mb2dNZXJnZVBvbGljeS5qYXZhCmluZGV4IGIzNWYyYWEuLjc1MTg2NDIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0xvZ01lcmdlUG9saWN5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvTG9nTWVyZ2VQb2xpY3kuamF2YQpAQCAtNjQsMTYgKzY0LDkgQEAKIAogICAvKiogRGVmYXVsdCBub0NGU1JhdGlvLiAgSWYgYSBtZXJnZSdzIHNpemUgaXMgPj0gMTAlIG9mCiAgICAqICB0aGUgaW5kZXgsIHRoZW4gd2UgZGlzYWJsZSBjb21wb3VuZCBmaWxlIGZvciBpdC4KLSAgICogIEBzZWUgI3NldE5vQ0ZTUmF0aW8gKi8KKyAgICogIEBzZWUgTWVyZ2VQb2xpY3kjc2V0Tm9DRlNSYXRpbyAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBERUZBVUxUX05PX0NGU19SQVRJTyA9IDAuMTsKIAotICAvKiogRGVmYXVsdCBtYXhDRlNTZWdtZW50U2l6ZSB2YWx1ZSBhbGxvd3MgY29tcG91bmQgZmlsZQotICAgKiBmb3IgYSBzZWdtZW50IG9mIGFueSBzaXplLiBUaGUgYWN0dWFsIGZpbGUgZm9ybWF0IGlzCi0gICAqIHN0aWxsIHN1YmplY3QgdG8gbm9DRlNSYXRpby4KLSAgICogQHNlZSAjc2V0TWF4Q0ZTU2VnbWVudFNpemVNQihkb3VibGUpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9NQVhfQ0ZTX1NFR01FTlRfU0laRSA9IExvbmcuTUFYX1ZBTFVFOwotCiAgIC8qKiBIb3cgbWFueSBzZWdtZW50cyB0byBtZXJnZSBhdCBhIHRpbWUuICovCiAgIHByb3RlY3RlZCBpbnQgbWVyZ2VGYWN0b3IgPSBERUZBVUxUX01FUkdFX0ZBQ1RPUjsKIApAQCAtOTYsMzAgKzg5LDE0IEBACiAgICAqICB3aWxsIG5ldmVyIGJlIG1lcmdlZC4gKi8KICAgcHJvdGVjdGVkIGludCBtYXhNZXJnZURvY3MgPSBERUZBVUxUX01BWF9NRVJHRV9ET0NTOwogCi0gIC8qKiBJZiB0aGUgc2l6ZSBvZiB0aGUgbWVyZ2Ugc2VnbWVudCBleGNlZWRzIHRoaXMgcmF0aW8gb2YKLSAgICogIHRoZSB0b3RhbCBpbmRleCBzaXplIHRoZW4gaXQgd2lsbCByZW1haW4gaW4KLSAgICogIG5vbi1jb21wb3VuZCBmb3JtYXQgZXZlbiBpZiB7QGxpbmsKLSAgICogICNzZXRVc2VDb21wb3VuZEZpbGV9IGlzIHtAY29kZSB0cnVlfS4gKi8KLSAgcHJvdGVjdGVkIGRvdWJsZSBub0NGU1JhdGlvID0gREVGQVVMVF9OT19DRlNfUkFUSU87Ci0KLSAgLyoqIElmIHRoZSBzaXplIG9mIHRoZSBtZXJnZWQgc2VnbWVudCBleGNlZWRzCi0gICAqICB0aGlzIHZhbHVlIHRoZW4gaXQgd2lsbCBub3QgdXNlIGNvbXBvdW5kIGZpbGUgZm9ybWF0LiAqLwotICBwcm90ZWN0ZWQgbG9uZyBtYXhDRlNTZWdtZW50U2l6ZSA9IERFRkFVTFRfTUFYX0NGU19TRUdNRU5UX1NJWkU7Ci0KICAgLyoqIElmIHRydWUsIHdlIHByby1yYXRlIGEgc2VnbWVudCdzIHNpemUgYnkgdGhlCiAgICAqICBwZXJjZW50YWdlIG9mIG5vbi1kZWxldGVkIGRvY3VtZW50cy4gKi8KICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsaWJyYXRlU2l6ZUJ5RGVsZXRlcyA9IHRydWU7CiAKLSAgLyoqIFRydWUgaWYgbmV3IHNlZ21lbnRzIChmbHVzaGVkIG9yIG1lcmdlZCkgc2hvdWxkIHVzZQotICAgKiAgdGhlIGNvbXBvdW5kIGZpbGUgZm9ybWF0LiAgTm90ZSB0aGF0IGxhcmdlIHNlZ21lbnRzCi0gICAqICBtYXkgc29tZXRpbWVzIHN0aWxsIHVzZSBub24tY29tcG91bmQgZm9ybWF0IChzZWUKLSAgICogIHtAbGluayAjc2V0Tm9DRlNSYXRpb30uICovCi0gIHByb3RlY3RlZCBib29sZWFuIHVzZUNvbXBvdW5kRmlsZSA9IHRydWU7Ci0KICAgLyoqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyAKICAgICogIGNvbnN0cnVjdG9ycywgdHlwaWNhbGx5IGltcGxpY2l0LikgKi8KICAgcHVibGljIExvZ01lcmdlUG9saWN5KCkgewotICAgIHN1cGVyKCk7CisgICAgc3VwZXIoREVGQVVMVF9OT19DRlNfUkFUSU8sIE1lcmdlUG9saWN5LkRFRkFVTFRfTUFYX0NGU19TRUdNRU5UX1NJWkUpOwogICB9CiAKICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB7QGNvZGUgTE1QfSBpcyBlbmFibGVkIGluIHtAbGluawpAQCAtMTI5LDI1ICsxMDYsNiBAQAogICAgIHJldHVybiB3ICE9IG51bGwgJiYgdy5pbmZvU3RyZWFtLmlzRW5hYmxlZCgiTE1QIik7CiAgIH0KIAotICAvKiogUmV0dXJucyBjdXJyZW50IHtAY29kZSBub0NGU1JhdGlvfS4KLSAgICoKLSAgICogIEBzZWUgI3NldE5vQ0ZTUmF0aW8gKi8KLSAgcHVibGljIGRvdWJsZSBnZXROb0NGU1JhdGlvKCkgewotICAgIHJldHVybiBub0NGU1JhdGlvOwotICB9Ci0KLSAgLyoqIElmIGEgbWVyZ2VkIHNlZ21lbnQgd2lsbCBiZSBtb3JlIHRoYW4gdGhpcyBwZXJjZW50YWdlCi0gICAqICBvZiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW5kZXgsIGxlYXZlIHRoZSBzZWdtZW50IGFzCi0gICAqICBub24tY29tcG91bmQgZmlsZSBldmVuIGlmIGNvbXBvdW5kIGZpbGUgaXMgZW5hYmxlZC4KLSAgICogIFNldCB0byAxLjAgdG8gYWx3YXlzIHVzZSBDRlMgcmVnYXJkbGVzcyBvZiBtZXJnZQotICAgKiAgc2l6ZS4gKi8KLSAgcHVibGljIHZvaWQgc2V0Tm9DRlNSYXRpbyhkb3VibGUgbm9DRlNSYXRpbykgewotICAgIGlmIChub0NGU1JhdGlvIDwgMC4wIHx8IG5vQ0ZTUmF0aW8gPiAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vQ0ZTUmF0aW8gbXVzdCBiZSAwLjAgdG8gMS4wIGluY2x1c2l2ZTsgZ290ICIgKyBub0NGU1JhdGlvKTsKLSAgICB9Ci0gICAgdGhpcy5ub0NGU1JhdGlvID0gbm9DRlNSYXRpbzsKLSAgfQotCiAgIC8qKiBQcmludCBhIGRlYnVnIG1lc3NhZ2UgdG8ge0BsaW5rIEluZGV4V3JpdGVyfSdzIHtAY29kZQogICAgKiAgaW5mb1N0cmVhbX0uICovCiAgIHByb3RlY3RlZCB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKQEAgLTE3OCwzOSArMTM2LDYgQEAKICAgICB0aGlzLm1lcmdlRmFjdG9yID0gbWVyZ2VGYWN0b3I7CiAgIH0KIAotICAvLyBKYXZhZG9jIGluaGVyaXRlZAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gdXNlQ29tcG91bmRGaWxlKFNlZ21lbnRJbmZvcyBpbmZvcywgU2VnbWVudEluZm9QZXJDb21taXQgbWVyZ2VkSW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoIWdldFVzZUNvbXBvdW5kRmlsZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGxvbmcgbWVyZ2VkSW5mb1NpemUgPSBzaXplKG1lcmdlZEluZm8pOwotICAgIGlmIChtZXJnZWRJbmZvU2l6ZSA+IG1heENGU1NlZ21lbnRTaXplKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChnZXROb0NGU1JhdGlvKCkgPj0gMS4wKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgbG9uZyB0b3RhbFNpemUgPSAwOwotICAgIGZvciAoU2VnbWVudEluZm9QZXJDb21taXQgaW5mbyA6IGluZm9zKSB7Ci0gICAgICB0b3RhbFNpemUgKz0gc2l6ZShpbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lcmdlZEluZm9TaXplIDw9IGdldE5vQ0ZTUmF0aW8oKSAqIHRvdGFsU2l6ZTsKLSAgfQotCi0gIC8qKiBTZXRzIHdoZXRoZXIgY29tcG91bmQgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgZm9yCi0gICAqICBuZXdseSBmbHVzaGVkIGFuZCBuZXdseSBtZXJnZWQgc2VnbWVudHMuICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZUNvbXBvdW5kRmlsZShib29sZWFuIHVzZUNvbXBvdW5kRmlsZSkgewotICAgIHRoaXMudXNlQ29tcG91bmRGaWxlID0gdXNlQ29tcG91bmRGaWxlOwotICB9Ci0KLSAgLyoqIFJldHVybnMgdHJ1ZSBpZiBuZXdseSBmbHVzaGVkIGFuZCBuZXdseSBtZXJnZSBzZWdtZW50cwotICAgKiAgYXJlIHdyaXR0ZW4gaW4gY29tcG91bmQgZmlsZSBmb3JtYXQuIEBzZWUKLSAgICogICNzZXRVc2VDb21wb3VuZEZpbGUgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ29tcG91bmRGaWxlKCkgewotICAgIHJldHVybiB1c2VDb21wb3VuZEZpbGU7Ci0gIH0KLQogICAvKiogU2V0cyB3aGV0aGVyIHRoZSBzZWdtZW50IHNpemUgc2hvdWxkIGJlIGNhbGlicmF0ZWQgYnkKICAgICogIHRoZSBudW1iZXIgb2YgZGVsZXRlcyB3aGVuIGNob29zaW5nIHNlZ21lbnRzIGZvciBtZXJnZS4gKi8KICAgcHVibGljIHZvaWQgc2V0Q2FsaWJyYXRlU2l6ZUJ5RGVsZXRlcyhib29sZWFuIGNhbGlicmF0ZVNpemVCeURlbGV0ZXMpIHsKQEAgLTIyNiw5ICsxNTEsNiBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQogCi0gIC8qKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHByb3ZpZGVkIHtAbGluawotICAgKiAgU2VnbWVudEluZm9QZXJDb21taXR9LiAqLwotICBhYnN0cmFjdCBwcm90ZWN0ZWQgbG9uZyBzaXplKFNlZ21lbnRJbmZvUGVyQ29tbWl0IGluZm8pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSBwcm92aWRlZCB7QGxpbmsKICAgICogIFNlZ21lbnRJbmZvUGVyQ29tbWl0fSwgcHJvLXJhdGVkIGJ5IHBlcmNlbnRhZ2Ugb2YKQEAgLTI0OSwxNSArMTcxLDEwIEBACiAgICAqICBub24tZGVsZXRlZCBkb2N1bWVudHMgaWYge0BsaW5rCiAgICAqICAjc2V0Q2FsaWJyYXRlU2l6ZUJ5RGVsZXRlc30gaXMgc2V0LiAqLwogICBwcm90ZWN0ZWQgbG9uZyBzaXplQnl0ZXMoU2VnbWVudEluZm9QZXJDb21taXQgaW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBsb25nIGJ5dGVTaXplID0gaW5mby5zaXplSW5CeXRlcygpOwogICAgIGlmIChjYWxpYnJhdGVTaXplQnlEZWxldGVzKSB7Ci0gICAgICBpbnQgZGVsQ291bnQgPSB3cml0ZXIuZ2V0KCkubnVtRGVsZXRlZERvY3MoaW5mbyk7Ci0gICAgICBkb3VibGUgZGVsUmF0aW8gPSAoaW5mby5pbmZvLmdldERvY0NvdW50KCkgPD0gMCA/IDAuMGYgOiAoKGZsb2F0KWRlbENvdW50IC8gKGZsb2F0KWluZm8uaW5mby5nZXREb2NDb3VudCgpKSk7Ci0gICAgICBhc3NlcnQgZGVsUmF0aW8gPD0gMS4wOwotICAgICAgcmV0dXJuIChpbmZvLmluZm8uZ2V0RG9jQ291bnQoKSA8PSAwID8gIGJ5dGVTaXplIDogKGxvbmcpKGJ5dGVTaXplICogKDEuMCAtIGRlbFJhdGlvKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYnl0ZVNpemU7CisgICAgICByZXR1cm4gc3VwZXIuc2l6ZShpbmZvKTsKICAgICB9CisgICAgcmV0dXJuIGluZm8uc2l6ZUluQnl0ZXMoKTsKICAgfQogICAKICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGVsaWdpYmxlIGZvcgpAQCAtMjgyLDE5ICsxOTksNiBAQAogICAgICAgKG51bVRvTWVyZ2UgIT0gMSB8fCAhc2VnbWVudElzT3JpZ2luYWwgfHwgaXNNZXJnZWQobWVyZ2VJbmZvKSk7CiAgIH0KIAotICAvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2luZ2xlIGluZm8gaXMgYWxyZWFkeSBmdWxseSBtZXJnZWQgKGhhcyBubwotICAgKiAgcGVuZGluZyBub3JtcyBvciBkZWxldGVzLCBpcyBpbiB0aGUgc2FtZSBkaXIgYXMgdGhlCi0gICAqICB3cml0ZXIsIGFuZCBtYXRjaGVzIHRoZSBjdXJyZW50IGNvbXBvdW5kIGZpbGUgc2V0dGluZyAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01lcmdlZChTZWdtZW50SW5mb1BlckNvbW1pdCBpbmZvKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgSW5kZXhXcml0ZXIgdyA9IHdyaXRlci5nZXQoKTsKLSAgICBhc3NlcnQgdyAhPSBudWxsOwotICAgIGJvb2xlYW4gaGFzRGVsZXRpb25zID0gdy5udW1EZWxldGVkRG9jcyhpbmZvKSA+IDA7Ci0gICAgcmV0dXJuICFoYXNEZWxldGlvbnMgJiYKLSAgICAgIGluZm8uaW5mby5kaXIgPT0gdy5nZXREaXJlY3RvcnkoKSAmJgotICAgICAgKGluZm8uaW5mby5nZXRVc2VDb21wb3VuZEZpbGUoKSA9PSB1c2VDb21wb3VuZEZpbGUgfHwgbm9DRlNSYXRpbyA8IDEuMCk7Ci0gIH0KLQogICAvKioKICAgICogUmV0dXJucyB0aGUgbWVyZ2VzIG5lY2Vzc2FyeSB0byBtZXJnZSB0aGUgaW5kZXgsIHRha2luZyB0aGUgbWF4IG1lcmdlCiAgICAqIHNpemUgb3IgbWF4IG1lcmdlIGRvY3MgaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZXNwZWN0CkBAIC03MjYsMjkgKzYzMCwxMCBAQAogICAgIHNiLmFwcGVuZCgibWF4TWVyZ2VTaXplRm9yRm9yY2VkTWVyZ2U9IikuYXBwZW5kKG1heE1lcmdlU2l6ZUZvckZvcmNlZE1lcmdlKS5hcHBlbmQoIiwgIik7CiAgICAgc2IuYXBwZW5kKCJjYWxpYnJhdGVTaXplQnlEZWxldGVzPSIpLmFwcGVuZChjYWxpYnJhdGVTaXplQnlEZWxldGVzKS5hcHBlbmQoIiwgIik7CiAgICAgc2IuYXBwZW5kKCJtYXhNZXJnZURvY3M9IikuYXBwZW5kKG1heE1lcmdlRG9jcykuYXBwZW5kKCIsICIpOwotICAgIHNiLmFwcGVuZCgidXNlQ29tcG91bmRGaWxlPSIpLmFwcGVuZCh1c2VDb21wb3VuZEZpbGUpLmFwcGVuZCgiLCAiKTsKICAgICBzYi5hcHBlbmQoIm1heENGU1NlZ21lbnRTaXplTUI9IikuYXBwZW5kKGdldE1heENGU1NlZ21lbnRTaXplTUIoKSkuYXBwZW5kKCIsICIpOwogICAgIHNiLmFwcGVuZCgibm9DRlNSYXRpbz0iKS5hcHBlbmQobm9DRlNSYXRpbyk7CiAgICAgc2IuYXBwZW5kKCJdIik7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KIAotICAvKiogUmV0dXJucyB0aGUgbGFyZ2VzdCBzaXplIGFsbG93ZWQgZm9yIGEgY29tcG91bmQgZmlsZSBzZWdtZW50ICovCi0gIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0TWF4Q0ZTU2VnbWVudFNpemVNQigpIHsKLSAgICByZXR1cm4gbWF4Q0ZTU2VnbWVudFNpemUvMTAyNC8xMDI0LjsKLSAgfQotCi0gIC8qKiBJZiBhIG1lcmdlZCBzZWdtZW50IHdpbGwgYmUgbW9yZSB0aGFuIHRoaXMgdmFsdWUsCi0gICAqICBsZWF2ZSB0aGUgc2VnbWVudCBhcwotICAgKiAgbm9uLWNvbXBvdW5kIGZpbGUgZXZlbiBpZiBjb21wb3VuZCBmaWxlIGlzIGVuYWJsZWQuCi0gICAqICBTZXQgdGhpcyB0byBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkgKGRlZmF1bHQpIGFuZCBub0NGU1JhdGlvIHRvIDEuMAotICAgKiAgdG8gYWx3YXlzIHVzZSBDRlMgcmVnYXJkbGVzcyBvZiBtZXJnZSBzaXplLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRNYXhDRlNTZWdtZW50U2l6ZU1CKGRvdWJsZSB2KSB7Ci0gICAgaWYgKHYgPCAwLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1heENGU1NlZ21lbnRTaXplTUIgbXVzdCBiZSA+PTAgKGdvdCAiICsgdiArICIpIik7Ci0gICAgfQotICAgIHYgKj0gMTAyNCAqIDEwMjQ7Ci0gICAgdGhpcy5tYXhDRlNTZWdtZW50U2l6ZSA9ICh2ID4gTG9uZy5NQVhfVkFMVUUpID8gTG9uZy5NQVhfVkFMVUUgOiAobG9uZykgdjsKLSAgfQotCiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9NZXJnZVBvbGljeS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvTWVyZ2VQb2xpY3kuamF2YQppbmRleCBjMTdmMWFiLi4zMzUyYzFmIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9NZXJnZVBvbGljeS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L01lcmdlUG9saWN5LmphdmEKQEAgLTU3LDcgKzU3LDYgQEAKICAqCiAgKiBAbHVjZW5lLmV4cGVyaW1lbnRhbAogICovCi0KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXJnZVBvbGljeSBpbXBsZW1lbnRzIGphdmEuaW8uQ2xvc2VhYmxlLCBDbG9uZWFibGUgewogCiAgIC8qKiBBIG1hcCBvZiBkb2MgSURzLiAqLwpAQCAtMzYxLDkgKzM2MCwyOSBAQAogICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgfQogICB9CisgIAorICAvKioKKyAgICogRGVmYXVsdCByYXRpbyBmb3IgY29tcG91bmQgZmlsZSBzeXN0ZW0gdXNhZ2UuIFNldCB0byA8dHQ+MS4wPC90dD4sIGFsd2F5cyB1c2UgCisgICAqIGNvbXBvdW5kIGZpbGUgc3lzdGVtLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgREVGQVVMVF9OT19DRlNfUkFUSU8gPSAxLjA7CisKKyAgLyoqCisgICAqIERlZmF1bHQgbWF4IHNlZ21lbnQgc2l6ZSBpbiBvcmRlciB0byB1c2UgY29tcG91bmQgZmlsZSBzeXN0ZW0uIFNldCB0byB7QGxpbmsgTG9uZyNNQVhfVkFMVUV9LgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX0NGU19TRUdNRU5UX1NJWkUgPSBMb25nLk1BWF9WQUxVRTsKIAogICAvKioge0BsaW5rIEluZGV4V3JpdGVyfSB0aGF0IGNvbnRhaW5zIHRoaXMgaW5zdGFuY2UuICovCiAgIHByb3RlY3RlZCBTZXRPbmNlPEluZGV4V3JpdGVyPiB3cml0ZXI7CisgIAorICAvKiogSWYgdGhlIHNpemUgb2YgdGhlIG1lcmdlIHNlZ21lbnQgZXhjZWVkcyB0aGlzIHJhdGlvIG9mCisgICAqICB0aGUgdG90YWwgaW5kZXggc2l6ZSB0aGVuIGl0IHdpbGwgcmVtYWluIGluCisgICAqICBub24tY29tcG91bmQgZm9ybWF0ICovCisgIHByb3RlY3RlZCBkb3VibGUgbm9DRlNSYXRpbyA9IERFRkFVTFRfTk9fQ0ZTX1JBVElPOworICAKKyAgLyoqIElmIHRoZSBzaXplIG9mIHRoZSBtZXJnZWQgc2VnbWVudCBleGNlZWRzCisgICAqICB0aGlzIHZhbHVlIHRoZW4gaXQgd2lsbCBub3QgdXNlIGNvbXBvdW5kIGZpbGUgZm9ybWF0LiAqLworICBwcm90ZWN0ZWQgbG9uZyBtYXhDRlNTZWdtZW50U2l6ZSA9IERFRkFVTFRfTUFYX0NGU19TRUdNRU5UX1NJWkU7CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBNZXJnZVBvbGljeSBjbG9uZSgpIHsKQEAgLTM4NCw3ICs0MDMsMTggQEAKICAgICoge0BsaW5rICNzZXRJbmRleFdyaXRlcihJbmRleFdyaXRlcil9LgogICAgKi8KICAgcHVibGljIE1lcmdlUG9saWN5KCkgeworICAgIHRoaXMoREVGQVVMVF9OT19DRlNfUkFUSU8sIERFRkFVTFRfTUFYX0NGU19TRUdNRU5UX1NJWkUpOworICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBtZXJnZSBwb2xpY3kgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHNldHRpbmdzIGZvciBub0NGU1JhdGlvCisgICAqIGFuZCBtYXhDRlNTZWdtZW50U2l6ZS4gVGhpcyBjdG9yIHNob3VsZCBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdXNpbmcgZGlmZmVyZW50CisgICAqIGRlZmF1bHRzIHRoYW4gdGhlIHtAbGluayBNZXJnZVBvbGljeX0KKyAgICovCisgIHByb3RlY3RlZCBNZXJnZVBvbGljeShkb3VibGUgZGVmYXVsdE5vQ0ZTUmF0aW8sIGxvbmcgZGVmYXVsdE1heENGU1NlZ21lbnRTaXplKSB7CiAgICAgd3JpdGVyID0gbmV3IFNldE9uY2U8SW5kZXhXcml0ZXI+KCk7CisgICAgdGhpcy5ub0NGU1JhdGlvID0gZGVmYXVsdE5vQ0ZTUmF0aW87CisgICAgdGhpcy5tYXhDRlNTZWdtZW50U2l6ZSA9IGRlZmF1bHRNYXhDRlNTZWdtZW50U2l6ZTsKICAgfQogCiAgIC8qKgpAQCAtNDUxLDEyICs0ODEsOTEgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCk7CiAgIAotICAKICAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyBzZWdtZW50IChyZWdhcmRsZXNzIG9mIGl0cyBvcmlnaW4pIHNob3VsZCB1c2UgdGhlIGNvbXBvdW5kIGZpbGUgZm9ybWF0LgorICAgKiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgc2VnbWVudCAocmVnYXJkbGVzcyBvZiBpdHMgb3JpZ2luKSBzaG91bGQgdXNlIHRoZQorICAgKiBjb21wb3VuZCBmaWxlIGZvcm1hdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgorICAgKiBpZmYgdGhlIHNpemUgb2YgdGhlIGdpdmVuIG1lcmdlZEluZm8gaXMgbGVzcyBvciBlcXVhbCB0bworICAgKiB7QGxpbmsgI2dldE1heENGU1NlZ21lbnRTaXplTUIoKX0gYW5kIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gdGhlCisgICAqIFRvdGFsSW5kZXhTaXplICoge0BsaW5rICNnZXROb0NGU1JhdGlvKCl9IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCiAgICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUoU2VnbWVudEluZm9zIHNlZ21lbnRzLCBTZWdtZW50SW5mb1BlckNvbW1pdCBuZXdTZWdtZW50KSB0aHJvd3MgSU9FeGNlcHRpb247CisgIHB1YmxpYyBib29sZWFuIHVzZUNvbXBvdW5kRmlsZShTZWdtZW50SW5mb3MgaW5mb3MsIFNlZ21lbnRJbmZvUGVyQ29tbWl0IG1lcmdlZEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGdldE5vQ0ZTUmF0aW8oKSA9PSAwLjApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbG9uZyBtZXJnZWRJbmZvU2l6ZSA9IHNpemUobWVyZ2VkSW5mbyk7CisgICAgaWYgKG1lcmdlZEluZm9TaXplID4gbWF4Q0ZTU2VnbWVudFNpemUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGdldE5vQ0ZTUmF0aW8oKSA+PSAxLjApIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBsb25nIHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChTZWdtZW50SW5mb1BlckNvbW1pdCBpbmZvIDogaW5mb3MpIHsKKyAgICAgIHRvdGFsU2l6ZSArPSBzaXplKGluZm8pOworICAgIH0KKyAgICByZXR1cm4gbWVyZ2VkSW5mb1NpemUgPD0gZ2V0Tm9DRlNSYXRpbygpICogdG90YWxTaXplOworICB9CiAgIAorICAvKiogUmV0dXJuIHRoZSBieXRlIHNpemUgb2YgdGhlIHByb3ZpZGVkIHtAbGluaworICAgKiAgU2VnbWVudEluZm9QZXJDb21taXR9LCBwcm8tcmF0ZWQgYnkgcGVyY2VudGFnZSBvZgorICAgKiAgbm9uLWRlbGV0ZWQgZG9jdW1lbnRzIGlzIHNldC4gKi8KKyAgcHJvdGVjdGVkIGxvbmcgc2l6ZShTZWdtZW50SW5mb1BlckNvbW1pdCBpbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvbmcgYnl0ZVNpemUgPSBpbmZvLnNpemVJbkJ5dGVzKCk7CisgICAgaW50IGRlbENvdW50ID0gd3JpdGVyLmdldCgpLm51bURlbGV0ZWREb2NzKGluZm8pOworICAgIGRvdWJsZSBkZWxSYXRpbyA9IChpbmZvLmluZm8uZ2V0RG9jQ291bnQoKSA8PSAwID8gMC4wZiA6ICgoZmxvYXQpZGVsQ291bnQgLyAoZmxvYXQpaW5mby5pbmZvLmdldERvY0NvdW50KCkpKTsKKyAgICBhc3NlcnQgZGVsUmF0aW8gPD0gMS4wOworICAgIHJldHVybiAoaW5mby5pbmZvLmdldERvY0NvdW50KCkgPD0gMCA/ICBieXRlU2l6ZSA6IChsb25nKShieXRlU2l6ZSAqICgxLjAgLSBkZWxSYXRpbykpKTsKKyAgfQorICAKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNpbmdsZSBpbmZvIGlzIGFscmVhZHkgZnVsbHkgbWVyZ2VkIChoYXMgbm8KKyAgICogIHBlbmRpbmcgZGVsZXRlcywgaXMgaW4gdGhlIHNhbWUgZGlyIGFzIHRoZQorICAgKiAgd3JpdGVyLCBhbmQgbWF0Y2hlcyB0aGUgY3VycmVudCBjb21wb3VuZCBmaWxlIHNldHRpbmcgKi8KKyAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNNZXJnZWQoU2VnbWVudEluZm9QZXJDb21taXQgaW5mbykgeworICAgIEluZGV4V3JpdGVyIHcgPSB3cml0ZXIuZ2V0KCk7CisgICAgYXNzZXJ0IHcgIT0gbnVsbDsKKyAgICBib29sZWFuIGhhc0RlbGV0aW9ucyA9IHcubnVtRGVsZXRlZERvY3MoaW5mbykgPiAwOworICAgIHJldHVybiAhaGFzRGVsZXRpb25zICYmCisgICAgICBpbmZvLmluZm8uZGlyID09IHcuZ2V0RGlyZWN0b3J5KCkgJiYKKyAgICAgICgobm9DRlNSYXRpbyA+IDAuMCAmJiBub0NGU1JhdGlvIDwgMS4wKSB8fCBtYXhDRlNTZWdtZW50U2l6ZSA8IExvbmcuTUFYX1ZBTFVFKTsKKyAgfQorICAKKyAgLyoqIFJldHVybnMgY3VycmVudCB7QGNvZGUgbm9DRlNSYXRpb30uCisgICAqCisgICAqICBAc2VlICNzZXROb0NGU1JhdGlvICovCisgIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0Tm9DRlNSYXRpbygpIHsKKyAgICByZXR1cm4gbm9DRlNSYXRpbzsKKyAgfQorCisgIC8qKiBJZiBhIG1lcmdlZCBzZWdtZW50IHdpbGwgYmUgbW9yZSB0aGFuIHRoaXMgcGVyY2VudGFnZQorICAgKiAgb2YgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGluZGV4LCBsZWF2ZSB0aGUgc2VnbWVudCBhcworICAgKiAgbm9uLWNvbXBvdW5kIGZpbGUgZXZlbiBpZiBjb21wb3VuZCBmaWxlIGlzIGVuYWJsZWQuCisgICAqICBTZXQgdG8gMS4wIHRvIGFsd2F5cyB1c2UgQ0ZTIHJlZ2FyZGxlc3Mgb2YgbWVyZ2UKKyAgICogIHNpemUuICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE5vQ0ZTUmF0aW8oZG91YmxlIG5vQ0ZTUmF0aW8pIHsKKyAgICBpZiAobm9DRlNSYXRpbyA8IDAuMCB8fCBub0NGU1JhdGlvID4gMS4wKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub0NGU1JhdGlvIG11c3QgYmUgMC4wIHRvIDEuMCBpbmNsdXNpdmU7IGdvdCAiICsgbm9DRlNSYXRpbyk7CisgICAgfQorICAgIHRoaXMubm9DRlNSYXRpbyA9IG5vQ0ZTUmF0aW87CisgIH0KKworICAvKiogUmV0dXJucyB0aGUgbGFyZ2VzdCBzaXplIGFsbG93ZWQgZm9yIGEgY29tcG91bmQgZmlsZSBzZWdtZW50ICovCisgIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0TWF4Q0ZTU2VnbWVudFNpemVNQigpIHsKKyAgICByZXR1cm4gbWF4Q0ZTU2VnbWVudFNpemUvMTAyNC8xMDI0LjsKKyAgfQorCisgIC8qKiBJZiBhIG1lcmdlZCBzZWdtZW50IHdpbGwgYmUgbW9yZSB0aGFuIHRoaXMgdmFsdWUsCisgICAqICBsZWF2ZSB0aGUgc2VnbWVudCBhcworICAgKiAgbm9uLWNvbXBvdW5kIGZpbGUgZXZlbiBpZiBjb21wb3VuZCBmaWxlIGlzIGVuYWJsZWQuCisgICAqICBTZXQgdGhpcyB0byBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkgKGRlZmF1bHQpIGFuZCBub0NGU1JhdGlvIHRvIDEuMAorICAgKiAgdG8gYWx3YXlzIHVzZSBDRlMgcmVnYXJkbGVzcyBvZiBtZXJnZSBzaXplLiAqLworICBwdWJsaWMgZmluYWwgdm9pZCBzZXRNYXhDRlNTZWdtZW50U2l6ZU1CKGRvdWJsZSB2KSB7CisgICAgaWYgKHYgPCAwLjApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1heENGU1NlZ21lbnRTaXplTUIgbXVzdCBiZSA+PTAgKGdvdCAiICsgdiArICIpIik7CisgICAgfQorICAgIHYgKj0gMTAyNCAqIDEwMjQ7CisgICAgdGhpcy5tYXhDRlNTZWdtZW50U2l6ZSA9ICh2ID4gTG9uZy5NQVhfVkFMVUUpID8gTG9uZy5NQVhfVkFMVUUgOiAobG9uZykgdjsKKyAgfQorCiAgIC8qKgogICAgKiBNZXJnZVRyaWdnZXIgaXMgcGFzc2VkIHRvCiAgICAqIHtAbGluayBNZXJnZVBvbGljeSNmaW5kTWVyZ2VzKE1lcmdlVHJpZ2dlciwgU2VnbWVudEluZm9zKX0gdG8gaW5kaWNhdGUgdGhlCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9NZXJnZVNjaGVkdWxlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvTWVyZ2VTY2hlZHVsZXIuamF2YQppbmRleCA4Y2QwYjhkLi4zODVmNGI0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9NZXJnZVNjaGVkdWxlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L01lcmdlU2NoZWR1bGVyLmphdmEKQEAgLTI0LDcgKzI0LDkgQEAKICAqICBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgdG8gZXhlY3V0ZSB0aGUgbWVyZ2VzCiAgKiAgc2VsZWN0ZWQgYnkgYSB7QGxpbmsgTWVyZ2VQb2xpY3l9LiAgVGhlIGRlZmF1bHQKICAqICBNZXJnZVNjaGVkdWxlciBpcyB7QGxpbmsgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyfS48L3A+Ci0gKgorICogIDxwPkltcGxlbWVudGVycyBvZiBzdWItY2xhc3NlcyBzaG91bGQgbWFrZSBzdXJlIHRoYXQge0BsaW5rICNjbG9uZSgpfQorICogIHJldHVybnMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgYWJsZSB0byB3b3JrIHdpdGggYW55IHtAbGluayBJbmRleFdyaXRlcn0KKyAqICBpbnN0YW5jZS48L3A+CiAgKiBAbHVjZW5lLmV4cGVyaW1lbnRhbAogKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXJnZVNjaGVkdWxlciBpbXBsZW1lbnRzIENsb3NlYWJsZSwgQ2xvbmVhYmxlIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L05vTWVyZ2VQb2xpY3kuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L05vTWVyZ2VQb2xpY3kuamF2YQppbmRleCBiZjE0N2JjLi42OTdjZTcxIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Ob01lcmdlUG9saWN5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvTm9NZXJnZVBvbGljeS5qYXZhCkBAIC0yMCw4ICsyMCw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguTWVyZ2VQb2xpY3kuTWVyZ2VUcmlnZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lk1lcmdlUG9saWN5Lk1lcmdlU3BlY2lmaWNhdGlvbjsKIAogLyoqCiAgKiBBIHtAbGluayBNZXJnZVBvbGljeX0gd2hpY2ggbmV2ZXIgcmV0dXJucyBtZXJnZXMgdG8gZXhlY3V0ZSAoaGVuY2UgaXQncwpAQCAtNDksNiArNDcsNyBAQAogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlQ29tcG91bmRGaWxlOwogICAKICAgcHJpdmF0ZSBOb01lcmdlUG9saWN5KGJvb2xlYW4gdXNlQ29tcG91bmRGaWxlKSB7CisgICAgc3VwZXIodXNlQ29tcG91bmRGaWxlID8gMS4wIDogMC4wLCAwKTsKICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KICAgICB0aGlzLnVzZUNvbXBvdW5kRmlsZSA9IHVzZUNvbXBvdW5kRmlsZTsKICAgfQpAQCAtNzEsNiArNzAsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc2V0SW5kZXhXcml0ZXIoSW5kZXhXcml0ZXIgd3JpdGVyKSB7fQorICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBsb25nIHNpemUoU2VnbWVudEluZm9QZXJDb21taXQgaW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKKyAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvU2VnbWVudEluZm9zLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9TZWdtZW50SW5mb3MuamF2YQppbmRleCA3ODUxZTc5Li5jZGJhOTZiIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9TZWdtZW50SW5mb3MuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9TZWdtZW50SW5mb3MuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNjEzLDEwICs2MTIsNiBAQAogICAgICAgICAgIEluZGV4SW5wdXQgZ2VuSW5wdXQgPSBudWxsOwogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBnZW5JbnB1dCA9IGRpcmVjdG9yeS5vcGVuSW5wdXQoSW5kZXhGaWxlTmFtZXMuU0VHTUVOVFNfR0VOLCBJT0NvbnRleHQuUkVBRE9OQ0UpOwotICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoaW5mb1N0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIG1lc3NhZ2UoInNlZ21lbnRzLmdlbiBvcGVuOiBGaWxlTm90Rm91bmRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICAgICAgfQogICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChpbmZvU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgICAgbWVzc2FnZSgic2VnbWVudHMuZ2VuIG9wZW46IElPRXhjZXB0aW9uICIgKyBlKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1N0b3JlZEZpZWxkc1Byb2Nlc3Nvci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvU3RvcmVkRmllbGRzUHJvY2Vzc29yLmphdmEKaW5kZXggZWVhMDViMS4uOTMyZTRmZSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvU3RvcmVkRmllbGRzUHJvY2Vzc29yLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvU3RvcmVkRmllbGRzUHJvY2Vzc29yLmphdmEKQEAgLTE4LDExICsxOCwxMyBAQAogICovCiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuQ29kZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLlN0b3JlZEZpZWxkc1dyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5JT0NvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5BcnJheVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JT1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuUmFtVXNhZ2VFc3RpbWF0b3I7CiAKIC8qKiBUaGlzIGlzIGEgU3RvcmVkRmllbGRzQ29uc3VtZXIgdGhhdCB3cml0ZXMgc3RvcmVkIGZpZWxkcy4gKi8KQEAgLTMyLDggKzM0LDYgQEAKICAgZmluYWwgRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkIGRvY1dyaXRlcjsKICAgaW50IGxhc3REb2NJRDsKIAotICBpbnQgZnJlZUNvdW50OwotCiAgIGZpbmFsIERvY3VtZW50c1dyaXRlclBlclRocmVhZC5Eb2NTdGF0ZSBkb2NTdGF0ZTsKICAgZmluYWwgQ29kZWMgY29kZWM7CiAKQEAgLTQ0LDEzICs0NCwxMyBAQAogICB9CiAKICAgcHJpdmF0ZSBpbnQgbnVtU3RvcmVkRmllbGRzOwotICBwcml2YXRlIFN0b3JhYmxlRmllbGRbXSBzdG9yZWRGaWVsZHM7Ci0gIHByaXZhdGUgRmllbGRJbmZvW10gZmllbGRJbmZvczsKKyAgcHJpdmF0ZSBTdG9yYWJsZUZpZWxkW10gc3RvcmVkRmllbGRzID0gbmV3IFN0b3JhYmxlRmllbGRbMV07CisgIHByaXZhdGUgRmllbGRJbmZvW10gZmllbGRJbmZvcyA9IG5ldyBGaWVsZEluZm9bMV07CiAKICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgbnVtU3RvcmVkRmllbGRzID0gMDsKLSAgICBzdG9yZWRGaWVsZHMgPSBuZXcgU3RvcmFibGVGaWVsZFsxXTsKLSAgICBmaWVsZEluZm9zID0gbmV3IEZpZWxkSW5mb1sxXTsKKyAgICBBcnJheXMuZmlsbChzdG9yZWRGaWVsZHMsIG51bGwpOworICAgIEFycmF5cy5maWxsKGZpZWxkSW5mb3MsIG51bGwpOwogICB9CiAgIAogICBAT3ZlcnJpZGUKQEAgLTYxLDcgKzYxLDYgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKFNlZ21lbnRXcml0ZVN0YXRlIHN0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCBudW1Eb2NzID0gc3RhdGUuc2VnbWVudEluZm8uZ2V0RG9jQ291bnQoKTsKLQogICAgIGlmIChudW1Eb2NzID4gMCkgewogICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IGFsbCBkb2N1bWVudHMgc2VlbiBpbiB0aGlzIHNlZ21lbnQKICAgICAgIC8vIGhpdCBub24tYWJvcnRpbmcgZXhjZXB0aW9ucywgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsCkBAIC02OSwxNCArNjgsMTcgQEAKICAgICAgIGluaXRGaWVsZHNXcml0ZXIoc3RhdGUuY29udGV4dCk7CiAgICAgICBmaWxsKG51bURvY3MpOwogICAgIH0KLQogICAgIGlmIChmaWVsZHNXcml0ZXIgIT0gbnVsbCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgZmllbGRzV3JpdGVyLmZpbmlzaChzdGF0ZS5maWVsZEluZm9zLCBudW1Eb2NzKTsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGZpZWxkc1dyaXRlci5jbG9zZSgpOwotICAgICAgICBmaWVsZHNXcml0ZXIgPSBudWxsOwotICAgICAgICBsYXN0RG9jSUQgPSAwOworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaWVsZHNXcml0ZXIuZmluaXNoKHN0YXRlLmZpZWxkSW5mb3MsIG51bURvY3MpOworICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlKGZpZWxkc1dyaXRlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElPVXRpbHMuY2xvc2VXaGlsZUhhbmRsaW5nRXhjZXB0aW9uKGZpZWxkc1dyaXRlcik7CisgICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpAQCAtODgsNyArOTAsNiBAQAogICAgIH0KICAgfQogCi0gIGludCBhbGxvY0NvdW50OwogCiAgIEBPdmVycmlkZQogICB2b2lkIGFib3J0KCkgewpAQCAtMTE0LDcgKzExNSw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHZvaWQgZmluaXNoRG9jdW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGFzc2VydCBkb2NXcml0ZXIud3JpdGVyLnRlc3RQb2ludCgiU3RvcmVkRmllbGRzV3JpdGVyLmZpbmlzaERvY3VtZW50IHN0YXJ0Iik7CisgICAgYXNzZXJ0IGRvY1dyaXRlci50ZXN0UG9pbnQoIlN0b3JlZEZpZWxkc1dyaXRlci5maW5pc2hEb2N1bWVudCBzdGFydCIpOwogCiAgICAgaW5pdEZpZWxkc1dyaXRlcihJT0NvbnRleHQuREVGQVVMVCk7CiAgICAgZmlsbChkb2NTdGF0ZS5kb2NJRCk7CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICB9CiAKICAgICByZXNldCgpOwotICAgIGFzc2VydCBkb2NXcml0ZXIud3JpdGVyLnRlc3RQb2ludCgiU3RvcmVkRmllbGRzV3JpdGVyLmZpbmlzaERvY3VtZW50IGVuZCIpOworICAgIGFzc2VydCBkb2NXcml0ZXIudGVzdFBvaW50KCJTdG9yZWRGaWVsZHNXcml0ZXIuZmluaXNoRG9jdW1lbnQgZW5kIik7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlcm1WZWN0b3JzQ29uc3VtZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlcm1WZWN0b3JzQ29uc3VtZXIuamF2YQppbmRleCBiYWZiYTIyLi5mNTQ4ZWVhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXJtVmVjdG9yc0NvbnN1bWVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVybVZlY3RvcnNDb25zdW1lci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLlRlcm1WZWN0b3JzV3JpdGVyOwpAQCAtMzIsOSArMzMsNiBAQAogCiAgIFRlcm1WZWN0b3JzV3JpdGVyIHdyaXRlcjsKICAgZmluYWwgRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkIGRvY1dyaXRlcjsKLSAgaW50IGZyZWVDb3VudDsKLSAgaW50IGxhc3REb2NJRDsKLQogICBmaW5hbCBEb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQuRG9jU3RhdGUgZG9jU3RhdGU7CiAgIGZpbmFsIEJ5dGVzUmVmIGZsdXNoVGVybSA9IG5ldyBCeXRlc1JlZigpOwogCkBAIC00Miw2ICs0MCw5IEBACiAgIGZpbmFsIEJ5dGVTbGljZVJlYWRlciB2ZWN0b3JTbGljZVJlYWRlclBvcyA9IG5ldyBCeXRlU2xpY2VSZWFkZXIoKTsKICAgZmluYWwgQnl0ZVNsaWNlUmVhZGVyIHZlY3RvclNsaWNlUmVhZGVyT2ZmID0gbmV3IEJ5dGVTbGljZVJlYWRlcigpOwogICBib29sZWFuIGhhc1ZlY3RvcnM7CisgIGludCBudW1WZWN0b3JGaWVsZHM7CisgIGludCBsYXN0RG9jSUQ7CisgIHByaXZhdGUgVGVybVZlY3RvcnNDb25zdW1lclBlckZpZWxkW10gcGVyRmllbGRzID0gbmV3IFRlcm1WZWN0b3JzQ29uc3VtZXJQZXJGaWVsZFsxXTsKIAogICBwdWJsaWMgVGVybVZlY3RvcnNDb25zdW1lcihEb2N1bWVudHNXcml0ZXJQZXJUaHJlYWQgZG9jV3JpdGVyKSB7CiAgICAgdGhpcy5kb2NXcml0ZXIgPSBkb2NXcml0ZXI7CkBAIC01Miw2ICs1Myw3IEBACiAgIHZvaWQgZmx1c2goTWFwPFN0cmluZywgVGVybXNIYXNoQ29uc3VtZXJQZXJGaWVsZD4gZmllbGRzVG9GbHVzaCwgZmluYWwgU2VnbWVudFdyaXRlU3RhdGUgc3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CiAgICAgICBpbnQgbnVtRG9jcyA9IHN0YXRlLnNlZ21lbnRJbmZvLmdldERvY0NvdW50KCk7CisgICAgICBhc3NlcnQgbnVtRG9jcyA+IDA7CiAgICAgICAvLyBBdCBsZWFzdCBvbmUgZG9jIGluIHRoaXMgcnVuIGhhZCB0ZXJtIHZlY3RvcnMgZW5hYmxlZAogICAgICAgdHJ5IHsKICAgICAgICAgZmlsbChudW1Eb2NzKTsKQEAgLTYwLDcgKzYyLDYgQEAKICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgIElPVXRpbHMuY2xvc2Uod3JpdGVyKTsKICAgICAgICAgd3JpdGVyID0gbnVsbDsKLQogICAgICAgICBsYXN0RG9jSUQgPSAwOwogICAgICAgICBoYXNWZWN0b3JzID0gZmFsc2U7CiAgICAgICB9CkBAIC05NCw3ICs5NSw3IEBACiAgIEBPdmVycmlkZQogICB2b2lkIGZpbmlzaERvY3VtZW50KFRlcm1zSGFzaCB0ZXJtc0hhc2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICBhc3NlcnQgZG9jV3JpdGVyLndyaXRlci50ZXN0UG9pbnQoIlRlcm1WZWN0b3JzVGVybXNXcml0ZXIuZmluaXNoRG9jdW1lbnQgc3RhcnQiKTsKKyAgICBhc3NlcnQgZG9jV3JpdGVyLnRlc3RQb2ludCgiVGVybVZlY3RvcnNUZXJtc1dyaXRlci5maW5pc2hEb2N1bWVudCBzdGFydCIpOwogCiAgICAgaWYgKCFoYXNWZWN0b3JzKSB7CiAgICAgICByZXR1cm47CkBAIC0xMTcsNyArMTE4LDcgQEAKIAogICAgIHRlcm1zSGFzaC5yZXNldCgpOwogICAgIHJlc2V0KCk7Ci0gICAgYXNzZXJ0IGRvY1dyaXRlci53cml0ZXIudGVzdFBvaW50KCJUZXJtVmVjdG9yc1Rlcm1zV3JpdGVyLmZpbmlzaERvY3VtZW50IGVuZCIpOworICAgIGFzc2VydCBkb2NXcml0ZXIudGVzdFBvaW50KCJUZXJtVmVjdG9yc1Rlcm1zV3JpdGVyLmZpbmlzaERvY3VtZW50IGVuZCIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xMzAsMTcgKzEzMSwxMiBAQAogICAgIH0KIAogICAgIGxhc3REb2NJRCA9IDA7Ci0KICAgICByZXNldCgpOwogICB9CiAKLSAgaW50IG51bVZlY3RvckZpZWxkczsKLQotICBUZXJtVmVjdG9yc0NvbnN1bWVyUGVyRmllbGRbXSBwZXJGaWVsZHM7Ci0KICAgdm9pZCByZXNldCgpIHsKKyAgICBBcnJheXMuZmlsbChwZXJGaWVsZHMsIG51bGwpOy8vIGRvbid0IGhhbmcgb250byBzdHVmZiBmcm9tIHByZXZpb3VzIGRvYwogICAgIG51bVZlY3RvckZpZWxkcyA9IDA7Ci0gICAgcGVyRmllbGRzID0gbmV3IFRlcm1WZWN0b3JzQ29uc3VtZXJQZXJGaWVsZFsxXTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTc1LDEwICsxNzEsNyBAQAogICBTdHJpbmcgbGFzdFZlY3RvckZpZWxkTmFtZTsKICAgZmluYWwgYm9vbGVhbiB2ZWN0b3JGaWVsZHNJbk9yZGVyKEZpZWxkSW5mbyBmaSkgewogICAgIHRyeSB7Ci0gICAgICBpZiAobGFzdFZlY3RvckZpZWxkTmFtZSAhPSBudWxsKQotICAgICAgICByZXR1cm4gbGFzdFZlY3RvckZpZWxkTmFtZS5jb21wYXJlVG8oZmkubmFtZSkgPCAwOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBsYXN0VmVjdG9yRmllbGROYW1lICE9IG51bGwgPyBsYXN0VmVjdG9yRmllbGROYW1lLmNvbXBhcmVUbyhmaS5uYW1lKSA8IDAgOiB0cnVlOyAKICAgICB9IGZpbmFsbHkgewogICAgICAgbGFzdFZlY3RvckZpZWxkTmFtZSA9IGZpLm5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGllcmVkTWVyZ2VQb2xpY3kuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1RpZXJlZE1lcmdlUG9saWN5LmphdmEKaW5kZXggNzQ1NjgxZC4uZTZhNDg1YiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGllcmVkTWVyZ2VQb2xpY3kuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UaWVyZWRNZXJnZVBvbGljeS5qYXZhCkBAIC0yNyw5ICsyNyw2IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lk1lcmdlUG9saWN5Lk1lcmdlVHJpZ2dlcjsKLQotCiAvKioKICAqICBNZXJnZXMgc2VnbWVudHMgb2YgYXBwcm94aW1hdGVseSBlcXVhbCBzaXplLCBzdWJqZWN0IHRvCiAgKiAgYW4gYWxsb3dlZCBudW1iZXIgb2Ygc2VnbWVudHMgcGVyIHRpZXIuICBUaGlzIGlzIHNpbWlsYXIKQEAgLTc2LDcgKzczLDExIEBACiAvLyAgICAgbWF5YmUgQ01TIHNob3VsZCBkbyBzbykKIAogcHVibGljIGNsYXNzIFRpZXJlZE1lcmdlUG9saWN5IGV4dGVuZHMgTWVyZ2VQb2xpY3kgewotCisgIC8qKiBEZWZhdWx0IG5vQ0ZTUmF0aW8uICBJZiBhIG1lcmdlJ3Mgc2l6ZSBpcyA+PSAxMCUgb2YKKyAgICogIHRoZSBpbmRleCwgdGhlbiB3ZSBkaXNhYmxlIGNvbXBvdW5kIGZpbGUgZm9yIGl0LgorICAgKiAgQHNlZSBNZXJnZVBvbGljeSNzZXROb0NGU1JhdGlvICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERFRkFVTFRfTk9fQ0ZTX1JBVElPID0gMC4xOworICAKICAgcHJpdmF0ZSBpbnQgbWF4TWVyZ2VBdE9uY2UgPSAxMDsKICAgcHJpdmF0ZSBsb25nIG1heE1lcmdlZFNlZ21lbnRCeXRlcyA9IDUqMTAyNCoxMDI0KjEwMjRMOwogICBwcml2YXRlIGludCBtYXhNZXJnZUF0T25jZUV4cGxpY2l0ID0gMzA7CkBAIC04NCwxNCArODUsMTIgQEAKICAgcHJpdmF0ZSBsb25nIGZsb29yU2VnbWVudEJ5dGVzID0gMioxMDI0KjEwMjRMOwogICBwcml2YXRlIGRvdWJsZSBzZWdzUGVyVGllciA9IDEwLjA7CiAgIHByaXZhdGUgZG91YmxlIGZvcmNlTWVyZ2VEZWxldGVzUGN0QWxsb3dlZCA9IDEwLjA7Ci0gIHByaXZhdGUgYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUgPSB0cnVlOwotICBwcml2YXRlIGRvdWJsZSBub0NGU1JhdGlvID0gMC4xOwotICBwcml2YXRlIGxvbmcgbWF4Q0ZTU2VnbWVudFNpemUgPSBMb25nLk1BWF9WQUxVRTsKICAgcHJpdmF0ZSBkb3VibGUgcmVjbGFpbURlbGV0ZXNXZWlnaHQgPSAyLjA7CiAKICAgLyoqIFNvbGUgY29uc3RydWN0b3IsIHNldHRpbmcgYWxsIHNldHRpbmdzIHRvIHRoZWlyCiAgICAqICBkZWZhdWx0cy4gKi8KICAgcHVibGljIFRpZXJlZE1lcmdlUG9saWN5KCkgeworICAgIHN1cGVyKERFRkFVTFRfTk9fQ0ZTX1JBVElPLCBNZXJnZVBvbGljeS5ERUZBVUxUX01BWF9DRlNfU0VHTUVOVF9TSVpFKTsKICAgfQogCiAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyB0byBiZSBtZXJnZWQgYXQgYSB0aW1lCkBAIC0yMzMsNDEgKzIzMiw2IEBACiAgICAgcmV0dXJuIHNlZ3NQZXJUaWVyOwogICB9CiAKLSAgLyoqIFNldHMgd2hldGhlciBjb21wb3VuZCBmaWxlIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBmb3IKLSAgICogIG5ld2x5IGZsdXNoZWQgYW5kIG5ld2x5IG1lcmdlZCBzZWdtZW50cy4gIERlZmF1bHQKLSAgICogIHRydWUuICovCi0gIHB1YmxpYyBUaWVyZWRNZXJnZVBvbGljeSBzZXRVc2VDb21wb3VuZEZpbGUoYm9vbGVhbiB1c2VDb21wb3VuZEZpbGUpIHsKLSAgICB0aGlzLnVzZUNvbXBvdW5kRmlsZSA9IHVzZUNvbXBvdW5kRmlsZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHVzZUNvbXBvdW5kRmlsZSBzZXR0aW5nLgotICAgKgotICAgKiBAc2VlICAjc2V0VXNlQ29tcG91bmRGaWxlICovCi0gIHB1YmxpYyBib29sZWFuIGdldFVzZUNvbXBvdW5kRmlsZSgpIHsKLSAgICByZXR1cm4gdXNlQ29tcG91bmRGaWxlOwotICB9Ci0KLSAgLyoqIElmIGEgbWVyZ2VkIHNlZ21lbnQgd2lsbCBiZSBtb3JlIHRoYW4gdGhpcyBwZXJjZW50YWdlCi0gICAqICBvZiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW5kZXgsIGxlYXZlIHRoZSBzZWdtZW50IGFzCi0gICAqICBub24tY29tcG91bmQgZmlsZSBldmVuIGlmIGNvbXBvdW5kIGZpbGUgaXMgZW5hYmxlZC4KLSAgICogIFNldCB0byAxLjAgdG8gYWx3YXlzIHVzZSBDRlMgcmVnYXJkbGVzcyBvZiBtZXJnZQotICAgKiAgc2l6ZS4gIERlZmF1bHQgaXMgMC4xLiAqLwotICBwdWJsaWMgVGllcmVkTWVyZ2VQb2xpY3kgc2V0Tm9DRlNSYXRpbyhkb3VibGUgbm9DRlNSYXRpbykgewotICAgIGlmIChub0NGU1JhdGlvIDwgMC4wIHx8IG5vQ0ZTUmF0aW8gPiAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vQ0ZTUmF0aW8gbXVzdCBiZSAwLjAgdG8gMS4wIGluY2x1c2l2ZTsgZ290ICIgKyBub0NGU1JhdGlvKTsKLSAgICB9Ci0gICAgdGhpcy5ub0NGU1JhdGlvID0gbm9DRlNSYXRpbzsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgbm9DRlNSYXRpbyBzZXR0aW5nLgotICAgKgotICAgKiBAc2VlICNzZXROb0NGU1JhdGlvICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0Tm9DRlNSYXRpbygpIHsKLSAgICByZXR1cm4gbm9DRlNSYXRpbzsKLSAgfQotCiAgIHByaXZhdGUgY2xhc3MgU2VnbWVudEJ5dGVTaXplRGVzY2VuZGluZyBpbXBsZW1lbnRzIENvbXBhcmF0b3I8U2VnbWVudEluZm9QZXJDb21taXQ+IHsKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2VnbWVudEluZm9QZXJDb21taXQgbzEsIFNlZ21lbnRJbmZvUGVyQ29tbWl0IG8yKSB7CkBAIC02MzcsNDYgKzYwMSw5IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gdXNlQ29tcG91bmRGaWxlKFNlZ21lbnRJbmZvcyBpbmZvcywgU2VnbWVudEluZm9QZXJDb21taXQgbWVyZ2VkSW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoIWdldFVzZUNvbXBvdW5kRmlsZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbG9uZyBtZXJnZWRJbmZvU2l6ZSA9IHNpemUobWVyZ2VkSW5mbyk7Ci0gICAgaWYgKG1lcmdlZEluZm9TaXplID4gbWF4Q0ZTU2VnbWVudFNpemUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZ2V0Tm9DRlNSYXRpbygpID49IDEuMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgbG9uZyB0b3RhbFNpemUgPSAwOwotICAgIGZvciAoU2VnbWVudEluZm9QZXJDb21taXQgaW5mbyA6IGluZm9zKSB7Ci0gICAgICAgIHRvdGFsU2l6ZSArPSBzaXplKGluZm8pOwotICAgIH0KLSAgICByZXR1cm4gbWVyZ2VkSW5mb1NpemUgPD0gZ2V0Tm9DRlNSYXRpbygpICogdG90YWxTaXplOwotICB9Ci0KLSAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICB9CiAKLSAgcHJpdmF0ZSBib29sZWFuIGlzTWVyZ2VkKFNlZ21lbnRJbmZvUGVyQ29tbWl0IGluZm8pIHsKLSAgICBJbmRleFdyaXRlciB3ID0gd3JpdGVyLmdldCgpOwotICAgIGFzc2VydCB3ICE9IG51bGw7Ci0gICAgYm9vbGVhbiBoYXNEZWxldGlvbnMgPSB3Lm51bURlbGV0ZWREb2NzKGluZm8pID4gMDsKLSAgICByZXR1cm4gIWhhc0RlbGV0aW9ucyAmJgotICAgICAgaW5mby5pbmZvLmRpciA9PSB3LmdldERpcmVjdG9yeSgpICYmCi0gICAgICAoaW5mby5pbmZvLmdldFVzZUNvbXBvdW5kRmlsZSgpID09IHVzZUNvbXBvdW5kRmlsZSB8fCBub0NGU1JhdGlvIDwgMS4wIHx8IG1heENGU1NlZ21lbnRTaXplIDwgTG9uZy5NQVhfVkFMVUUpOwotICB9Ci0KLSAgLy8gU2VnbWVudCBzaXplIGluIGJ5dGVzLCBwcm8tcmF0ZWQgYnkgJSBkZWxldGVkCi0gIHByaXZhdGUgbG9uZyBzaXplKFNlZ21lbnRJbmZvUGVyQ29tbWl0IGluZm8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgbG9uZyBieXRlU2l6ZSA9IGluZm8uc2l6ZUluQnl0ZXMoKTsgICAgCi0gICAgZmluYWwgaW50IGRlbENvdW50ID0gd3JpdGVyLmdldCgpLm51bURlbGV0ZWREb2NzKGluZm8pOwotICAgIGZpbmFsIGRvdWJsZSBkZWxSYXRpbyA9IChpbmZvLmluZm8uZ2V0RG9jQ291bnQoKSA8PSAwID8gMC4wZiA6ICgoZG91YmxlKWRlbENvdW50IC8gKGRvdWJsZSlpbmZvLmluZm8uZ2V0RG9jQ291bnQoKSkpOyAgICAKLSAgICBhc3NlcnQgZGVsUmF0aW8gPD0gMS4wOwotICAgIHJldHVybiAobG9uZykgKGJ5dGVTaXplICogKDEuMC1kZWxSYXRpbykpOwotICB9Ci0KICAgcHJpdmF0ZSBsb25nIGZsb29yU2l6ZShsb25nIGJ5dGVzKSB7CiAgICAgcmV0dXJuIE1hdGgubWF4KGZsb29yU2VnbWVudEJ5dGVzLCBieXRlcyk7CiAgIH0KQEAgLTY5OSwyOCArNjI2LDggQEAKICAgICBzYi5hcHBlbmQoImZsb29yU2VnbWVudE1CPSIpLmFwcGVuZChmbG9vclNlZ21lbnRCeXRlcy8xMDI0LzEwMjQuKS5hcHBlbmQoIiwgIik7CiAgICAgc2IuYXBwZW5kKCJmb3JjZU1lcmdlRGVsZXRlc1BjdEFsbG93ZWQ9IikuYXBwZW5kKGZvcmNlTWVyZ2VEZWxldGVzUGN0QWxsb3dlZCkuYXBwZW5kKCIsICIpOwogICAgIHNiLmFwcGVuZCgic2VnbWVudHNQZXJUaWVyPSIpLmFwcGVuZChzZWdzUGVyVGllcikuYXBwZW5kKCIsICIpOwotICAgIHNiLmFwcGVuZCgidXNlQ29tcG91bmRGaWxlPSIpLmFwcGVuZCh1c2VDb21wb3VuZEZpbGUpLmFwcGVuZCgiLCAiKTsKICAgICBzYi5hcHBlbmQoIm1heENGU1NlZ21lbnRTaXplTUI9IikuYXBwZW5kKGdldE1heENGU1NlZ21lbnRTaXplTUIoKSkuYXBwZW5kKCIsICIpOwogICAgIHNiLmFwcGVuZCgibm9DRlNSYXRpbz0iKS5hcHBlbmQobm9DRlNSYXRpbyk7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KLQotICAvKiogUmV0dXJucyB0aGUgbGFyZ2VzdCBzaXplIGFsbG93ZWQgZm9yIGEgY29tcG91bmQgZmlsZSBzZWdtZW50ICovCi0gIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0TWF4Q0ZTU2VnbWVudFNpemVNQigpIHsKLSAgICByZXR1cm4gbWF4Q0ZTU2VnbWVudFNpemUvMTAyNC8xMDI0LjsKLSAgfQotCi0gIC8qKiBJZiBhIG1lcmdlZCBzZWdtZW50IHdpbGwgYmUgbW9yZSB0aGFuIHRoaXMgdmFsdWUsCi0gICAqICBsZWF2ZSB0aGUgc2VnbWVudCBhcwotICAgKiAgbm9uLWNvbXBvdW5kIGZpbGUgZXZlbiBpZiBjb21wb3VuZCBmaWxlIGlzIGVuYWJsZWQuCi0gICAqICBTZXQgdGhpcyB0byBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkgKGRlZmF1bHQpIGFuZCBub0NGU1JhdGlvIHRvIDEuMAotICAgKiAgdG8gYWx3YXlzIHVzZSBDRlMgcmVnYXJkbGVzcyBvZiBtZXJnZSBzaXplLiAqLwotICBwdWJsaWMgZmluYWwgVGllcmVkTWVyZ2VQb2xpY3kgc2V0TWF4Q0ZTU2VnbWVudFNpemVNQihkb3VibGUgdikgewotICAgIGlmICh2IDwgMC4wKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXhDRlNTZWdtZW50U2l6ZU1CIG11c3QgYmUgPj0wIChnb3QgIiArIHYgKyAiKSIpOwotICAgIH0KLSAgICB2ICo9IDEwMjQgKiAxMDI0OwotICAgIHRoaXMubWF4Q0ZTU2VnbWVudFNpemUgPSAodiA+IExvbmcuTUFYX1ZBTFVFKSA/IExvbmcuTUFYX1ZBTFVFIDogKGxvbmcpIHY7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9FeGFjdFBocmFzZVNjb3Jlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0V4YWN0UGhyYXNlU2NvcmVyLmphdmEKaW5kZXggNDg1MGIwNC4uOTA5Y2ZlMCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0V4YWN0UGhyYXNlU2NvcmVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0V4YWN0UGhyYXNlU2NvcmVyLmphdmEKQEAgLTU2LDEwICs1NiwxMCBAQAogICBwcml2YXRlIGludCBkb2NJRCA9IC0xOwogICBwcml2YXRlIGludCBmcmVxOwogCi0gIHByaXZhdGUgZmluYWwgU2ltaWxhcml0eS5FeGFjdFNpbVNjb3JlciBkb2NTY29yZXI7CisgIHByaXZhdGUgZmluYWwgU2ltaWxhcml0eS5TaW1TY29yZXIgZG9jU2NvcmVyOwogICAKICAgRXhhY3RQaHJhc2VTY29yZXIoV2VpZ2h0IHdlaWdodCwgUGhyYXNlUXVlcnkuUG9zdGluZ3NBbmRGcmVxW10gcG9zdGluZ3MsCi0gICAgICAgICAgICAgICAgICAgIFNpbWlsYXJpdHkuRXhhY3RTaW1TY29yZXIgZG9jU2NvcmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBTaW1pbGFyaXR5LlNpbVNjb3JlciBkb2NTY29yZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgc3VwZXIod2VpZ2h0KTsKICAgICB0aGlzLmRvY1Njb3JlciA9IGRvY1Njb3JlcjsKIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0ZpZWxkQ2FjaGUuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlLmphdmEKaW5kZXggNGEzMTAwYS4uZjg3ZmI1MSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0ZpZWxkQ2FjaGUuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvRmllbGRDYWNoZS5qYXZhCkBAIC00OSwzNCArNDksNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEZpZWxkQ2FjaGUgewogCi0gIC8qKiBGaWVsZCB2YWx1ZXMgYXMgOC1iaXQgc2lnbmVkIGJ5dGVzICovCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnl0ZXMgewotICAgIC8qKiBSZXR1cm4gYSBzaW5nbGUgQnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpZWxkJ3MgdmFsdWUuICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0KGludCBkb2NJRCk7Ci0gICAgCi0gICAgLyoqIFplcm8gdmFsdWUgZm9yIGV2ZXJ5IGRvY3VtZW50ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlcyBFTVBUWSA9IG5ldyBCeXRlcygpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJ5dGUgZ2V0KGludCBkb2NJRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoqIEZpZWxkIHZhbHVlcyBhcyAxNi1iaXQgc2lnbmVkIHNob3J0cyAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNob3J0cyB7Ci0gICAgLyoqIFJldHVybiBhIHNob3J0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmllbGQncyB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0KGludCBkb2NJRCk7Ci0gICAgCi0gICAgLyoqIFplcm8gdmFsdWUgZm9yIGV2ZXJ5IGRvY3VtZW50ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTaG9ydHMgRU1QVFkgPSBuZXcgU2hvcnRzKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgc2hvcnQgZ2V0KGludCBkb2NJRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KICAgLyoqIEZpZWxkIHZhbHVlcyBhcyAzMi1iaXQgc2lnbmVkIGludGVnZXJzICovCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSW50cyB7CiAgICAgLyoqIFJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmllbGQncyB2YWx1ZS4gKi8KQEAgLTE3OCwyMiArMTUwLDYgQEAKICAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uOwogICB9CiAKLSAgLyoqIEludGVyZmFjZSB0byBwYXJzZSBieXRlcyBmcm9tIGRvY3VtZW50IGZpZWxkcy4KLSAgICogQHNlZSBGaWVsZENhY2hlI2dldEJ5dGVzKEF0b21pY1JlYWRlciwgU3RyaW5nLCBGaWVsZENhY2hlLkJ5dGVQYXJzZXIsIGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEJ5dGVQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgewotICAgIC8qKiBSZXR1cm4gYSBzaW5nbGUgQnl0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpZWxkJ3MgdmFsdWUuICovCi0gICAgcHVibGljIGJ5dGUgcGFyc2VCeXRlKEJ5dGVzUmVmIHRlcm0pOwotICB9Ci0KLSAgLyoqIEludGVyZmFjZSB0byBwYXJzZSBzaG9ydHMgZnJvbSBkb2N1bWVudCBmaWVsZHMuCi0gICAqIEBzZWUgRmllbGRDYWNoZSNnZXRTaG9ydHMoQXRvbWljUmVhZGVyLCBTdHJpbmcsIEZpZWxkQ2FjaGUuU2hvcnRQYXJzZXIsIGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIFNob3J0UGFyc2VyIGV4dGVuZHMgUGFyc2VyIHsKLSAgICAvKiogUmV0dXJuIGEgc2hvcnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmaWVsZCdzIHZhbHVlLiAqLwotICAgIHB1YmxpYyBzaG9ydCBwYXJzZVNob3J0KEJ5dGVzUmVmIHRlcm0pOwotICB9Ci0KICAgLyoqIEludGVyZmFjZSB0byBwYXJzZSBpbnRzIGZyb20gZG9jdW1lbnQgZmllbGRzLgogICAgKiBAc2VlIEZpZWxkQ2FjaGUjZ2V0SW50cyhBdG9taWNSZWFkZXIsIFN0cmluZywgRmllbGRDYWNoZS5JbnRQYXJzZXIsIGJvb2xlYW4pCiAgICAqLwpAQCAtMjI5LDEzNSArMTg1LDYgQEAKICAgLyoqIEV4cGVydDogVGhlIGNhY2hlIHVzZWQgaW50ZXJuYWxseSBieSBzb3J0aW5nIGFuZCByYW5nZSBxdWVyeSBjbGFzc2VzLiAqLwogICBwdWJsaWMgc3RhdGljIEZpZWxkQ2FjaGUgREVGQVVMVCA9IG5ldyBGaWVsZENhY2hlSW1wbCgpOwogCi0gIC8qKiBUaGUgZGVmYXVsdCBwYXJzZXIgZm9yIGJ5dGUgdmFsdWVzLCB3aGljaCBhcmUgZW5jb2RlZCBieSB7QGxpbmsgQnl0ZSN0b1N0cmluZyhieXRlKX0gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlUGFyc2VyIERFRkFVTFRfQllURV9QQVJTRVIgPSBuZXcgQnl0ZVBhcnNlcigpIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZSBwYXJzZUJ5dGUoQnl0ZXNSZWYgdGVybSkgewotICAgICAgLy8gVE9ETzogd291bGQgYmUgZmFyIGJldHRlciB0byBkaXJlY3RseSBwYXJzZSBmcm9tCi0gICAgICAvLyBVVEY4IGJ5dGVzLi4uIGJ1dCByZWFsbHkgdXNlcnMgc2hvdWxkIHVzZQotICAgICAgLy8gSW50RmllbGQsIGluc3RlYWQsIHdoaWNoIGFscmVhZHkgZGVjb2RlcwotICAgICAgLy8gZGlyZWN0bHkgZnJvbSBieXRlW10KLSAgICAgIHJldHVybiBCeXRlLnBhcnNlQnl0ZSh0ZXJtLnV0ZjhUb1N0cmluZygpKTsKLSAgICB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0gICAgICByZXR1cm4gRmllbGRDYWNoZS5jbGFzcy5nZXROYW1lKCkrIi5ERUZBVUxUX0JZVEVfUEFSU0VSIjsgCi0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXJtc0VudW0gdGVybXNFbnVtKFRlcm1zIHRlcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHRlcm1zLml0ZXJhdG9yKG51bGwpOwotICAgIH0KLSAgfTsKLQotICAvKiogVGhlIGRlZmF1bHQgcGFyc2VyIGZvciBzaG9ydCB2YWx1ZXMsIHdoaWNoIGFyZSBlbmNvZGVkIGJ5IHtAbGluayBTaG9ydCN0b1N0cmluZyhzaG9ydCl9ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU2hvcnRQYXJzZXIgREVGQVVMVF9TSE9SVF9QQVJTRVIgPSBuZXcgU2hvcnRQYXJzZXIoKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHNob3J0IHBhcnNlU2hvcnQoQnl0ZXNSZWYgdGVybSkgewotICAgICAgLy8gVE9ETzogd291bGQgYmUgZmFyIGJldHRlciB0byBkaXJlY3RseSBwYXJzZSBmcm9tCi0gICAgICAvLyBVVEY4IGJ5dGVzLi4uIGJ1dCByZWFsbHkgdXNlcnMgc2hvdWxkIHVzZQotICAgICAgLy8gSW50RmllbGQsIGluc3RlYWQsIHdoaWNoIGFscmVhZHkgZGVjb2RlcwotICAgICAgLy8gZGlyZWN0bHkgZnJvbSBieXRlW10KLSAgICAgIHJldHVybiBTaG9ydC5wYXJzZVNob3J0KHRlcm0udXRmOFRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyAKLSAgICAgIHJldHVybiBGaWVsZENhY2hlLmNsYXNzLmdldE5hbWUoKSsiLkRFRkFVTFRfU0hPUlRfUEFSU0VSIjsgCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXJtc0VudW0gdGVybXNFbnVtKFRlcm1zIHRlcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHRlcm1zLml0ZXJhdG9yKG51bGwpOwotICAgIH0KLSAgfTsKLQotICAvKiogVGhlIGRlZmF1bHQgcGFyc2VyIGZvciBpbnQgdmFsdWVzLCB3aGljaCBhcmUgZW5jb2RlZCBieSB7QGxpbmsgSW50ZWdlciN0b1N0cmluZyhpbnQpfSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEludFBhcnNlciBERUZBVUxUX0lOVF9QQVJTRVIgPSBuZXcgSW50UGFyc2VyKCkgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcGFyc2VJbnQoQnl0ZXNSZWYgdGVybSkgewotICAgICAgLy8gVE9ETzogd291bGQgYmUgZmFyIGJldHRlciB0byBkaXJlY3RseSBwYXJzZSBmcm9tCi0gICAgICAvLyBVVEY4IGJ5dGVzLi4uIGJ1dCByZWFsbHkgdXNlcnMgc2hvdWxkIHVzZQotICAgICAgLy8gSW50RmllbGQsIGluc3RlYWQsIHdoaWNoIGFscmVhZHkgZGVjb2RlcwotICAgICAgLy8gZGlyZWN0bHkgZnJvbSBieXRlW10KLSAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHRlcm0udXRmOFRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0gICAgICByZXR1cm4gRmllbGRDYWNoZS5jbGFzcy5nZXROYW1lKCkrIi5ERUZBVUxUX0lOVF9QQVJTRVIiOyAKLSAgICB9Ci0gIH07Ci0KLSAgLyoqIFRoZSBkZWZhdWx0IHBhcnNlciBmb3IgZmxvYXQgdmFsdWVzLCB3aGljaCBhcmUgZW5jb2RlZCBieSB7QGxpbmsgRmxvYXQjdG9TdHJpbmcoZmxvYXQpfSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEZsb2F0UGFyc2VyIERFRkFVTFRfRkxPQVRfUEFSU0VSID0gbmV3IEZsb2F0UGFyc2VyKCkgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBwYXJzZUZsb2F0KEJ5dGVzUmVmIHRlcm0pIHsKLSAgICAgIC8vIFRPRE86IHdvdWxkIGJlIGZhciBiZXR0ZXIgdG8gZGlyZWN0bHkgcGFyc2UgZnJvbQotICAgICAgLy8gVVRGOCBieXRlcy4uLiBidXQgcmVhbGx5IHVzZXJzIHNob3VsZCB1c2UKLSAgICAgIC8vIEZsb2F0RmllbGQsIGluc3RlYWQsIHdoaWNoIGFscmVhZHkgZGVjb2RlcwotICAgICAgLy8gZGlyZWN0bHkgZnJvbSBieXRlW10KLSAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KHRlcm0udXRmOFRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0gICAgICByZXR1cm4gRmllbGRDYWNoZS5jbGFzcy5nZXROYW1lKCkrIi5ERUZBVUxUX0ZMT0FUX1BBUlNFUiI7IAotICAgIH0KLSAgfTsKLQotICAvKiogVGhlIGRlZmF1bHQgcGFyc2VyIGZvciBsb25nIHZhbHVlcywgd2hpY2ggYXJlIGVuY29kZWQgYnkge0BsaW5rIExvbmcjdG9TdHJpbmcobG9uZyl9ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ1BhcnNlciBERUZBVUxUX0xPTkdfUEFSU0VSID0gbmV3IExvbmdQYXJzZXIoKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgcGFyc2VMb25nKEJ5dGVzUmVmIHRlcm0pIHsKLSAgICAgIC8vIFRPRE86IHdvdWxkIGJlIGZhciBiZXR0ZXIgdG8gZGlyZWN0bHkgcGFyc2UgZnJvbQotICAgICAgLy8gVVRGOCBieXRlcy4uLiBidXQgcmVhbGx5IHVzZXJzIHNob3VsZCB1c2UKLSAgICAgIC8vIExvbmdGaWVsZCwgaW5zdGVhZCwgd2hpY2ggYWxyZWFkeSBkZWNvZGVzCi0gICAgICAvLyBkaXJlY3RseSBmcm9tIGJ5dGVbXQotICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKHRlcm0udXRmOFRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0gICAgICByZXR1cm4gRmllbGRDYWNoZS5jbGFzcy5nZXROYW1lKCkrIi5ERUZBVUxUX0xPTkdfUEFSU0VSIjsgCi0gICAgfQotICB9OwotCi0gIC8qKiBUaGUgZGVmYXVsdCBwYXJzZXIgZm9yIGRvdWJsZSB2YWx1ZXMsIHdoaWNoIGFyZSBlbmNvZGVkIGJ5IHtAbGluayBEb3VibGUjdG9TdHJpbmcoZG91YmxlKX0gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGVQYXJzZXIgREVGQVVMVF9ET1VCTEVfUEFSU0VSID0gbmV3IERvdWJsZVBhcnNlcigpIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIHBhcnNlRG91YmxlKEJ5dGVzUmVmIHRlcm0pIHsKLSAgICAgIC8vIFRPRE86IHdvdWxkIGJlIGZhciBiZXR0ZXIgdG8gZGlyZWN0bHkgcGFyc2UgZnJvbQotICAgICAgLy8gVVRGOCBieXRlcy4uLiBidXQgcmVhbGx5IHVzZXJzIHNob3VsZCB1c2UKLSAgICAgIC8vIERvdWJsZUZpZWxkLCBpbnN0ZWFkLCB3aGljaCBhbHJlYWR5IGRlY29kZXMKLSAgICAgIC8vIGRpcmVjdGx5IGZyb20gYnl0ZVtdCi0gICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHRlcm0udXRmOFRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgCi0gICAgICByZXR1cm4gRmllbGRDYWNoZS5jbGFzcy5nZXROYW1lKCkrIi5ERUZBVUxUX0RPVUJMRV9QQVJTRVIiOyAKLSAgICB9Ci0gIH07Ci0KICAgLyoqCiAgICAqIEEgcGFyc2VyIGluc3RhbmNlIGZvciBpbnQgdmFsdWVzIGVuY29kZWQgYnkge0BsaW5rIE51bWVyaWNVdGlsc30sIGUuZy4gd2hlbiBpbmRleGVkCiAgICAqIHZpYSB7QGxpbmsgSW50RmllbGR9L3tAbGluayBOdW1lcmljVG9rZW5TdHJlYW19LgpAQCAtNDUwLDYwICsyNzcsNiBAQAogICBwdWJsaWMgQml0cyBnZXREb2NzV2l0aEZpZWxkKEF0b21pY1JlYWRlciByZWFkZXIsIFN0cmluZyBmaWVsZCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgIC8qKiBDaGVja3MgdGhlIGludGVybmFsIGNhY2hlIGZvciBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgYW5kIGlmIG5vbmUgaXMKLSAgICogZm91bmQsIHJlYWRzIHRoZSB0ZXJtcyBpbiA8Y29kZT5maWVsZDwvY29kZT4gYXMgYSBzaW5nbGUgYnl0ZSBhbmQgcmV0dXJucyBhbiBhcnJheQotICAgKiBvZiBzaXplIDxjb2RlPnJlYWRlci5tYXhEb2MoKTwvY29kZT4gb2YgdGhlIHZhbHVlIGVhY2ggZG9jdW1lbnQKLSAgICogaGFzIGluIHRoZSBnaXZlbiBmaWVsZC4KLSAgICogQHBhcmFtIHJlYWRlciAgVXNlZCB0byBnZXQgZmllbGQgdmFsdWVzLgotICAgKiBAcGFyYW0gZmllbGQgICBXaGljaCBmaWVsZCBjb250YWlucyB0aGUgc2luZ2xlIGJ5dGUgdmFsdWVzLgotICAgKiBAcGFyYW0gc2V0RG9jc1dpdGhGaWVsZCAgSWYgdHJ1ZSB0aGVuIHtAbGluayAjZ2V0RG9jc1dpdGhGaWVsZH0gd2lsbAotICAgKiAgICAgICAgYWxzbyBiZSBjb21wdXRlZCBhbmQgc3RvcmVkIGluIHRoZSBGaWVsZENhY2hlLgotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZXMgaW4gdGhlIGdpdmVuIGZpZWxkIGZvciBlYWNoIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBJZiBhbnkgZXJyb3Igb2NjdXJzLgotICAgKi8KLSAgcHVibGljIEJ5dGVzIGdldEJ5dGVzKEF0b21pY1JlYWRlciByZWFkZXIsIFN0cmluZyBmaWVsZCwgYm9vbGVhbiBzZXREb2NzV2l0aEZpZWxkKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIENoZWNrcyB0aGUgaW50ZXJuYWwgY2FjaGUgZm9yIGFuIGFwcHJvcHJpYXRlIGVudHJ5LCBhbmQgaWYgbm9uZSBpcyBmb3VuZCwKLSAgICogcmVhZHMgdGhlIHRlcm1zIGluIDxjb2RlPmZpZWxkPC9jb2RlPiBhcyBieXRlcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZgotICAgKiBzaXplIDxjb2RlPnJlYWRlci5tYXhEb2MoKTwvY29kZT4gb2YgdGhlIHZhbHVlIGVhY2ggZG9jdW1lbnQgaGFzIGluIHRoZQotICAgKiBnaXZlbiBmaWVsZC4KLSAgICogQHBhcmFtIHJlYWRlciAgVXNlZCB0byBnZXQgZmllbGQgdmFsdWVzLgotICAgKiBAcGFyYW0gZmllbGQgICBXaGljaCBmaWVsZCBjb250YWlucyB0aGUgYnl0ZXMuCi0gICAqIEBwYXJhbSBwYXJzZXIgIENvbXB1dGVzIGJ5dGUgZm9yIHN0cmluZyB2YWx1ZXMuCi0gICAqIEBwYXJhbSBzZXREb2NzV2l0aEZpZWxkICBJZiB0cnVlIHRoZW4ge0BsaW5rICNnZXREb2NzV2l0aEZpZWxkfSB3aWxsCi0gICAqICAgICAgICBhbHNvIGJlIGNvbXB1dGVkIGFuZCBzdG9yZWQgaW4gdGhlIEZpZWxkQ2FjaGUuCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gZmllbGQgZm9yIGVhY2ggZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIElmIGFueSBlcnJvciBvY2N1cnMuCi0gICAqLwotICBwdWJsaWMgQnl0ZXMgZ2V0Qnl0ZXMoQXRvbWljUmVhZGVyIHJlYWRlciwgU3RyaW5nIGZpZWxkLCBCeXRlUGFyc2VyIHBhcnNlciwgYm9vbGVhbiBzZXREb2NzV2l0aEZpZWxkKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIENoZWNrcyB0aGUgaW50ZXJuYWwgY2FjaGUgZm9yIGFuIGFwcHJvcHJpYXRlIGVudHJ5LCBhbmQgaWYgbm9uZSBpcwotICAgKiBmb3VuZCwgcmVhZHMgdGhlIHRlcm1zIGluIDxjb2RlPmZpZWxkPC9jb2RlPiBhcyBzaG9ydHMgYW5kIHJldHVybnMgYW4gYXJyYXkKLSAgICogb2Ygc2l6ZSA8Y29kZT5yZWFkZXIubWF4RG9jKCk8L2NvZGU+IG9mIHRoZSB2YWx1ZSBlYWNoIGRvY3VtZW50Ci0gICAqIGhhcyBpbiB0aGUgZ2l2ZW4gZmllbGQuCi0gICAqIEBwYXJhbSByZWFkZXIgIFVzZWQgdG8gZ2V0IGZpZWxkIHZhbHVlcy4KLSAgICogQHBhcmFtIGZpZWxkICAgV2hpY2ggZmllbGQgY29udGFpbnMgdGhlIHNob3J0cy4KLSAgICogQHBhcmFtIHNldERvY3NXaXRoRmllbGQgIElmIHRydWUgdGhlbiB7QGxpbmsgI2dldERvY3NXaXRoRmllbGR9IHdpbGwKLSAgICogICAgICAgIGFsc28gYmUgY29tcHV0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgRmllbGRDYWNoZS4KLSAgICogQHJldHVybiBUaGUgdmFsdWVzIGluIHRoZSBnaXZlbiBmaWVsZCBmb3IgZWFjaCBkb2N1bWVudC4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgSWYgYW55IGVycm9yIG9jY3Vycy4KLSAgICovCi0gIHB1YmxpYyBTaG9ydHMgZ2V0U2hvcnRzIChBdG9taWNSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmllbGQsIGJvb2xlYW4gc2V0RG9jc1dpdGhGaWVsZCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKiBDaGVja3MgdGhlIGludGVybmFsIGNhY2hlIGZvciBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgYW5kIGlmIG5vbmUgaXMgZm91bmQsCi0gICAqIHJlYWRzIHRoZSB0ZXJtcyBpbiA8Y29kZT5maWVsZDwvY29kZT4gYXMgc2hvcnRzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mCi0gICAqIHNpemUgPGNvZGU+cmVhZGVyLm1heERvYygpPC9jb2RlPiBvZiB0aGUgdmFsdWUgZWFjaCBkb2N1bWVudCBoYXMgaW4gdGhlCi0gICAqIGdpdmVuIGZpZWxkLgotICAgKiBAcGFyYW0gcmVhZGVyICBVc2VkIHRvIGdldCBmaWVsZCB2YWx1ZXMuCi0gICAqIEBwYXJhbSBmaWVsZCAgIFdoaWNoIGZpZWxkIGNvbnRhaW5zIHRoZSBzaG9ydHMuCi0gICAqIEBwYXJhbSBwYXJzZXIgIENvbXB1dGVzIHNob3J0IGZvciBzdHJpbmcgdmFsdWVzLgotICAgKiBAcGFyYW0gc2V0RG9jc1dpdGhGaWVsZCAgSWYgdHJ1ZSB0aGVuIHtAbGluayAjZ2V0RG9jc1dpdGhGaWVsZH0gd2lsbAotICAgKiAgICAgICAgYWxzbyBiZSBjb21wdXRlZCBhbmQgc3RvcmVkIGluIHRoZSBGaWVsZENhY2hlLgotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZXMgaW4gdGhlIGdpdmVuIGZpZWxkIGZvciBlYWNoIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBJZiBhbnkgZXJyb3Igb2NjdXJzLgotICAgKi8KLSAgcHVibGljIFNob3J0cyBnZXRTaG9ydHMgKEF0b21pY1JlYWRlciByZWFkZXIsIFN0cmluZyBmaWVsZCwgU2hvcnRQYXJzZXIgcGFyc2VyLCBib29sZWFuIHNldERvY3NXaXRoRmllbGQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgCi0gIC8qKiBDaGVja3MgdGhlIGludGVybmFsIGNhY2hlIGZvciBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgYW5kIGlmIG5vbmUgaXMKICAgICogZm91bmQsIHJlYWRzIHRoZSB0ZXJtcyBpbiA8Y29kZT5maWVsZDwvY29kZT4gYXMgaW50ZWdlcnMgYW5kIHJldHVybnMgYW4gYXJyYXkKICAgICogb2Ygc2l6ZSA8Y29kZT5yZWFkZXIubWF4RG9jKCk8L2NvZGU+IG9mIHRoZSB2YWx1ZSBlYWNoIGRvY3VtZW50CiAgICAqIGhhcyBpbiB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvRmllbGRDYWNoZUltcGwuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlSW1wbC5qYXZhCmluZGV4IGI5NGFkNmUuLjliM2QzYTEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlSW1wbC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlSW1wbC5qYXZhCkBAIC0zOCwxMyArMzgsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Tb3J0ZWRTZXREb2NWYWx1ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXNFbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQXJyYXlVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQml0czsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuRmllbGRDYWNoZVNhbml0eUNoZWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5GaXhlZEJpdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlBhZ2VkQnl0ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuR3Jvd2FibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzOwogCiAvKioKQEAgLTYyLDggKzYyLDYgQEAKIAogICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXQoKSB7CiAgICAgY2FjaGVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sQ2FjaGU+KDkpOwotICAgIGNhY2hlcy5wdXQoQnl0ZS5UWVBFLCBuZXcgQnl0ZUNhY2hlKHRoaXMpKTsKLSAgICBjYWNoZXMucHV0KFNob3J0LlRZUEUsIG5ldyBTaG9ydENhY2hlKHRoaXMpKTsKICAgICBjYWNoZXMucHV0KEludGVnZXIuVFlQRSwgbmV3IEludENhY2hlKHRoaXMpKTsKICAgICBjYWNoZXMucHV0KEZsb2F0LlRZUEUsIG5ldyBGbG9hdENhY2hlKHRoaXMpKTsKICAgICBjYWNoZXMucHV0KExvbmcuVFlQRSwgbmV3IExvbmdDYWNoZSh0aGlzKSk7CkBAIC0zNTQsMTkyICszNTIsNiBAQAogICAgIH0KICAgICBjYWNoZXMuZ2V0KERvY3NXaXRoRmllbGRDYWNoZS5jbGFzcykucHV0KHJlYWRlciwgbmV3IENhY2hlS2V5KGZpZWxkLCBudWxsKSwgYml0cyk7CiAgIH0KLSAgCi0gIC8vIGluaGVyaXQgamF2YWRvY3MKLSAgcHVibGljIEJ5dGVzIGdldEJ5dGVzIChBdG9taWNSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmllbGQsIGJvb2xlYW4gc2V0RG9jc1dpdGhGaWVsZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZ2V0Qnl0ZXMocmVhZGVyLCBmaWVsZCwgbnVsbCwgc2V0RG9jc1dpdGhGaWVsZCk7Ci0gIH0KLQotICAvLyBpbmhlcml0IGphdmFkb2NzCi0gIHB1YmxpYyBCeXRlcyBnZXRCeXRlcyhBdG9taWNSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmllbGQsIEJ5dGVQYXJzZXIgcGFyc2VyLCBib29sZWFuIHNldERvY3NXaXRoRmllbGQpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIE51bWVyaWNEb2NWYWx1ZXMgdmFsdWVzSW4gPSByZWFkZXIuZ2V0TnVtZXJpY0RvY1ZhbHVlcyhmaWVsZCk7Ci0gICAgaWYgKHZhbHVlc0luICE9IG51bGwpIHsKLSAgICAgIC8vIE5vdCBjYWNoZWQgaGVyZSBieSBGaWVsZENhY2hlSW1wbCAoY2FjaGVkIGluc3RlYWQKLSAgICAgIC8vIHBlci10aHJlYWQgYnkgU2VnbWVudFJlYWRlcik6Ci0gICAgICByZXR1cm4gbmV3IEJ5dGVzKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJ5dGUgZ2V0KGludCBkb2NJRCkgewotICAgICAgICAgIHJldHVybiAoYnl0ZSkgdmFsdWVzSW4uZ2V0KGRvY0lEKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9IGVsc2UgewotICAgICAgZmluYWwgRmllbGRJbmZvIGluZm8gPSByZWFkZXIuZ2V0RmllbGRJbmZvcygpLmZpZWxkSW5mbyhmaWVsZCk7Ci0gICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBCeXRlcy5FTVBUWTsKLSAgICAgIH0gZWxzZSBpZiAoaW5mby5oYXNEb2NWYWx1ZXMoKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUeXBlIG1pc21hdGNoOiAiICsgZmllbGQgKyAiIHdhcyBpbmRleGVkIGFzICIgKyBpbmZvLmdldERvY1ZhbHVlc1R5cGUoKSk7Ci0gICAgICB9IGVsc2UgaWYgKCFpbmZvLmlzSW5kZXhlZCgpKSB7Ci0gICAgICAgIHJldHVybiBCeXRlcy5FTVBUWTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoQnl0ZXMpIGNhY2hlcy5nZXQoQnl0ZS5UWVBFKS5nZXQocmVhZGVyLCBuZXcgQ2FjaGVLZXkoZmllbGQsIHBhcnNlciksIHNldERvY3NXaXRoRmllbGQpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBCeXRlc0Zyb21BcnJheSBleHRlbmRzIEJ5dGVzIHsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB2YWx1ZXM7Ci0KLSAgICBwdWJsaWMgQnl0ZXNGcm9tQXJyYXkoYnl0ZVtdIHZhbHVlcykgewotICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlIGdldChpbnQgZG9jSUQpIHsKLSAgICAgIHJldHVybiB2YWx1ZXNbZG9jSURdOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBjbGFzcyBCeXRlQ2FjaGUgZXh0ZW5kcyBDYWNoZSB7Ci0gICAgQnl0ZUNhY2hlKEZpZWxkQ2FjaGVJbXBsIHdyYXBwZXIpIHsKLSAgICAgIHN1cGVyKHdyYXBwZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsdWUoQXRvbWljUmVhZGVyIHJlYWRlciwgQ2FjaGVLZXkga2V5LCBib29sZWFuIHNldERvY3NXaXRoRmllbGQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgIGludCBtYXhEb2MgPSByZWFkZXIubWF4RG9jKCk7Ci0gICAgICBmaW5hbCBieXRlW10gdmFsdWVzOwotICAgICAgZmluYWwgQnl0ZVBhcnNlciBwYXJzZXIgPSAoQnl0ZVBhcnNlcikga2V5LmN1c3RvbTsKLSAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAvLyBDb25mdXNpbmc6IG11c3QgZGVsZWdhdGUgdG8gd3JhcHBlciAodnMgc2ltcGx5Ci0gICAgICAgIC8vIHNldHRpbmcgcGFyc2VyID0gREVGQVVMVF9TSE9SVF9QQVJTRVIpIHNvIGNhY2hlCi0gICAgICAgIC8vIGtleSBpbmNsdWRlcyBERUZBVUxUX1NIT1JUX1BBUlNFUjoKLSAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0Qnl0ZXMocmVhZGVyLCBrZXkuZmllbGQsIERFRkFVTFRfQllURV9QQVJTRVIsIHNldERvY3NXaXRoRmllbGQpOwotICAgICAgfQotCi0gICAgICB2YWx1ZXMgPSBuZXcgYnl0ZVttYXhEb2NdOwotCi0gICAgICBVbmludmVydCB1ID0gbmV3IFVuaW52ZXJ0KCkgewotICAgICAgICAgIHByaXZhdGUgYnl0ZSBjdXJyZW50VmFsdWU7Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFRlcm0oQnl0ZXNSZWYgdGVybSkgewotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gcGFyc2VyLnBhcnNlQnl0ZSh0ZXJtKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdERvYyhpbnQgZG9jSUQpIHsKLSAgICAgICAgICAgIHZhbHVlc1tkb2NJRF0gPSBjdXJyZW50VmFsdWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHJvdGVjdGVkIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VyLnRlcm1zRW51bSh0ZXJtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICB1LnVuaW52ZXJ0KHJlYWRlciwga2V5LmZpZWxkLCBzZXREb2NzV2l0aEZpZWxkKTsKLQotICAgICAgaWYgKHNldERvY3NXaXRoRmllbGQpIHsKLSAgICAgICAgd3JhcHBlci5zZXREb2NzV2l0aEZpZWxkKHJlYWRlciwga2V5LmZpZWxkLCB1LmRvY3NXaXRoRmllbGQpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gbmV3IEJ5dGVzRnJvbUFycmF5KHZhbHVlcyk7Ci0gICAgfQotICB9Ci0gIAotICAvLyBpbmhlcml0IGphdmFkb2NzCi0gIHB1YmxpYyBTaG9ydHMgZ2V0U2hvcnRzIChBdG9taWNSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmllbGQsIGJvb2xlYW4gc2V0RG9jc1dpdGhGaWVsZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZ2V0U2hvcnRzKHJlYWRlciwgZmllbGQsIG51bGwsIHNldERvY3NXaXRoRmllbGQpOwotICB9Ci0KLSAgLy8gaW5oZXJpdCBqYXZhZG9jcwotICBwdWJsaWMgU2hvcnRzIGdldFNob3J0cyhBdG9taWNSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmllbGQsIFNob3J0UGFyc2VyIHBhcnNlciwgYm9vbGVhbiBzZXREb2NzV2l0aEZpZWxkKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBOdW1lcmljRG9jVmFsdWVzIHZhbHVlc0luID0gcmVhZGVyLmdldE51bWVyaWNEb2NWYWx1ZXMoZmllbGQpOwotICAgIGlmICh2YWx1ZXNJbiAhPSBudWxsKSB7Ci0gICAgICAvLyBOb3QgY2FjaGVkIGhlcmUgYnkgRmllbGRDYWNoZUltcGwgKGNhY2hlZCBpbnN0ZWFkCi0gICAgICAvLyBwZXItdGhyZWFkIGJ5IFNlZ21lbnRSZWFkZXIpOgotICAgICAgcmV0dXJuIG5ldyBTaG9ydHMoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgc2hvcnQgZ2V0KGludCBkb2NJRCkgewotICAgICAgICAgIHJldHVybiAoc2hvcnQpIHZhbHVlc0luLmdldChkb2NJRCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIEZpZWxkSW5mbyBpbmZvID0gcmVhZGVyLmdldEZpZWxkSW5mb3MoKS5maWVsZEluZm8oZmllbGQpOwotICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gU2hvcnRzLkVNUFRZOwotICAgICAgfSBlbHNlIGlmIChpbmZvLmhhc0RvY1ZhbHVlcygpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlR5cGUgbWlzbWF0Y2g6ICIgKyBmaWVsZCArICIgd2FzIGluZGV4ZWQgYXMgIiArIGluZm8uZ2V0RG9jVmFsdWVzVHlwZSgpKTsKLSAgICAgIH0gZWxzZSBpZiAoIWluZm8uaXNJbmRleGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIFNob3J0cy5FTVBUWTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoU2hvcnRzKSBjYWNoZXMuZ2V0KFNob3J0LlRZUEUpLmdldChyZWFkZXIsIG5ldyBDYWNoZUtleShmaWVsZCwgcGFyc2VyKSwgc2V0RG9jc1dpdGhGaWVsZCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIFNob3J0c0Zyb21BcnJheSBleHRlbmRzIFNob3J0cyB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzaG9ydFtdIHZhbHVlczsKLQotICAgIHB1YmxpYyBTaG9ydHNGcm9tQXJyYXkoc2hvcnRbXSB2YWx1ZXMpIHsKLSAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0KGludCBkb2NJRCkgewotICAgICAgcmV0dXJuIHZhbHVlc1tkb2NJRF07Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIGNsYXNzIFNob3J0Q2FjaGUgZXh0ZW5kcyBDYWNoZSB7Ci0gICAgU2hvcnRDYWNoZShGaWVsZENhY2hlSW1wbCB3cmFwcGVyKSB7Ci0gICAgICBzdXBlcih3cmFwcGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbHVlKEF0b21pY1JlYWRlciByZWFkZXIsIENhY2hlS2V5IGtleSwgYm9vbGVhbiBzZXREb2NzV2l0aEZpZWxkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICBpbnQgbWF4RG9jID0gcmVhZGVyLm1heERvYygpOwotICAgICAgZmluYWwgc2hvcnRbXSB2YWx1ZXM7Ci0gICAgICBmaW5hbCBTaG9ydFBhcnNlciBwYXJzZXIgPSAoU2hvcnRQYXJzZXIpIGtleS5jdXN0b207Ci0gICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgLy8gQ29uZnVzaW5nOiBtdXN0IGRlbGVnYXRlIHRvIHdyYXBwZXIgKHZzIHNpbXBseQotICAgICAgICAvLyBzZXR0aW5nIHBhcnNlciA9IERFRkFVTFRfU0hPUlRfUEFSU0VSKSBzbyBjYWNoZQotICAgICAgICAvLyBrZXkgaW5jbHVkZXMgREVGQVVMVF9TSE9SVF9QQVJTRVI6Ci0gICAgICAgIHJldHVybiB3cmFwcGVyLmdldFNob3J0cyhyZWFkZXIsIGtleS5maWVsZCwgREVGQVVMVF9TSE9SVF9QQVJTRVIsIHNldERvY3NXaXRoRmllbGQpOwotICAgICAgfQotCi0gICAgICB2YWx1ZXMgPSBuZXcgc2hvcnRbbWF4RG9jXTsKLSAgICAgIFVuaW52ZXJ0IHUgPSBuZXcgVW5pbnZlcnQoKSB7Ci0gICAgICAgICAgcHJpdmF0ZSBzaG9ydCBjdXJyZW50VmFsdWU7Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFRlcm0oQnl0ZXNSZWYgdGVybSkgewotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gcGFyc2VyLnBhcnNlU2hvcnQodGVybSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgdmlzaXREb2MoaW50IGRvY0lEKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbZG9jSURdID0gY3VycmVudFZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIudGVybXNFbnVtKHRlcm1zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgIHUudW5pbnZlcnQocmVhZGVyLCBrZXkuZmllbGQsIHNldERvY3NXaXRoRmllbGQpOwotCi0gICAgICBpZiAoc2V0RG9jc1dpdGhGaWVsZCkgewotICAgICAgICB3cmFwcGVyLnNldERvY3NXaXRoRmllbGQocmVhZGVyLCBrZXkuZmllbGQsIHUuZG9jc1dpdGhGaWVsZCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IFNob3J0c0Zyb21BcnJheSh2YWx1ZXMpOwotICAgIH0KLSAgfQogCiAgIC8vIGluaGVyaXQgamF2YWRvY3MKICAgcHVibGljIEludHMgZ2V0SW50cyAoQXRvbWljUmVhZGVyIHJlYWRlciwgU3RyaW5nIGZpZWxkLCBib29sZWFuIHNldERvY3NXaXRoRmllbGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01NzMsMTUgKzM4NSwxOSBAQAogICB9CiAKICAgc3RhdGljIGNsYXNzIEludHNGcm9tQXJyYXkgZXh0ZW5kcyBJbnRzIHsKLSAgICBwcml2YXRlIGZpbmFsIGludFtdIHZhbHVlczsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2tlZEludHMuUmVhZGVyIHZhbHVlczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtaW5WYWx1ZTsKIAotICAgIHB1YmxpYyBJbnRzRnJvbUFycmF5KGludFtdIHZhbHVlcykgeworICAgIHB1YmxpYyBJbnRzRnJvbUFycmF5KFBhY2tlZEludHMuUmVhZGVyIHZhbHVlcywgaW50IG1pblZhbHVlKSB7CisgICAgICBhc3NlcnQgdmFsdWVzLmdldEJpdHNQZXJWYWx1ZSgpIDw9IDMyOwogICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisgICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0KGludCBkb2NJRCkgewotICAgICAgcmV0dXJuIHZhbHVlc1tkb2NJRF07CisgICAgICBmaW5hbCBsb25nIGRlbHRhID0gdmFsdWVzLmdldChkb2NJRCk7CisgICAgICByZXR1cm4gbWluVmFsdWUgKyAoaW50KSBkZWx0YTsKICAgICB9CiAgIH0KIApAQCAtNTk3LDYgKzQxMywxNSBAQAogICAgIH0KICAgfQogCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3dhYmxlV3JpdGVyQW5kTWluVmFsdWUgeworICAgIEdyb3dhYmxlV3JpdGVyQW5kTWluVmFsdWUoR3Jvd2FibGVXcml0ZXIgYXJyYXksIGxvbmcgbWluVmFsdWUpIHsKKyAgICAgIHRoaXMud3JpdGVyID0gYXJyYXk7CisgICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBHcm93YWJsZVdyaXRlciB3cml0ZXI7CisgICAgcHVibGljIGxvbmcgbWluVmFsdWU7CisgIH0KKwogICBzdGF0aWMgZmluYWwgY2xhc3MgSW50Q2FjaGUgZXh0ZW5kcyBDYWNoZSB7CiAgICAgSW50Q2FjaGUoRmllbGRDYWNoZUltcGwgd3JhcHBlcikgewogICAgICAgc3VwZXIod3JhcHBlcik7CkBAIC02MDksMjIgKzQzNCwxNyBAQAogICAgICAgZmluYWwgSW50UGFyc2VyIHBhcnNlciA9IChJbnRQYXJzZXIpIGtleS5jdXN0b207CiAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKICAgICAgICAgLy8gQ29uZnVzaW5nOiBtdXN0IGRlbGVnYXRlIHRvIHdyYXBwZXIgKHZzIHNpbXBseQotICAgICAgICAvLyBzZXR0aW5nIHBhcnNlciA9Ci0gICAgICAgIC8vIERFRkFVTFRfSU5UX1BBUlNFUi9OVU1FUklDX1VUSUxTX0lOVF9QQVJTRVIpIHNvCi0gICAgICAgIC8vIGNhY2hlIGtleSBpbmNsdWRlcwotICAgICAgICAvLyBERUZBVUxUX0lOVF9QQVJTRVIvTlVNRVJJQ19VVElMU19JTlRfUEFSU0VSOgotICAgICAgICB0cnkgewotICAgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEludHMocmVhZGVyLCBrZXkuZmllbGQsIERFRkFVTFRfSU5UX1BBUlNFUiwgc2V0RG9jc1dpdGhGaWVsZCk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZSkgewotICAgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEludHMocmVhZGVyLCBrZXkuZmllbGQsIE5VTUVSSUNfVVRJTFNfSU5UX1BBUlNFUiwgc2V0RG9jc1dpdGhGaWVsZCk7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gc2V0dGluZyBwYXJzZXIgPSBOVU1FUklDX1VUSUxTX0lOVF9QQVJTRVIpIHNvCisgICAgICAgIC8vIGNhY2hlIGtleSBpbmNsdWRlcyBOVU1FUklDX1VUSUxTX0lOVF9QQVJTRVI6CisgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEludHMocmVhZGVyLCBrZXkuZmllbGQsIE5VTUVSSUNfVVRJTFNfSU5UX1BBUlNFUiwgc2V0RG9jc1dpdGhGaWVsZCk7CiAgICAgICB9CiAKLSAgICAgIGZpbmFsIEhvbGRzT25lVGhpbmc8aW50W10+IHZhbHVlc1JlZiA9IG5ldyBIb2xkc09uZVRoaW5nPGludFtdPigpOworICAgICAgZmluYWwgSG9sZHNPbmVUaGluZzxHcm93YWJsZVdyaXRlckFuZE1pblZhbHVlPiB2YWx1ZXNSZWYgPSBuZXcgSG9sZHNPbmVUaGluZzxHcm93YWJsZVdyaXRlckFuZE1pblZhbHVlPigpOwogCiAgICAgICBVbmludmVydCB1ID0gbmV3IFVuaW52ZXJ0KCkgeworICAgICAgICAgIHByaXZhdGUgaW50IG1pblZhbHVlOwogICAgICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnRWYWx1ZTsKLSAgICAgICAgICBwcml2YXRlIGludFtdIHZhbHVlczsKKyAgICAgICAgICBwcml2YXRlIEdyb3dhYmxlV3JpdGVyIHZhbHVlczsKIAogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0VGVybShCeXRlc1JlZiB0ZXJtKSB7CkBAIC02MzQsMTYgKzQ1NCwyOCBAQAogICAgICAgICAgICAgICAvLyAod2hpY2ggd2lsbCBoaXQgYSBOdW1iZXJGb3JtYXRFeGNlcHRpb24KICAgICAgICAgICAgICAgLy8gd2hlbiB3ZSBmaXJzdCB0cnkgdGhlIERFRkFVTFRfSU5UX1BBUlNFUiksCiAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGRvdWJsZS1hbGxvYzoKLSAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IGludFtyZWFkZXIubWF4RG9jKCldOwotICAgICAgICAgICAgICB2YWx1ZXNSZWYuc2V0KHZhbHVlcyk7CisgICAgICAgICAgICAgIGludCBzdGFydEJpdHNQZXJWYWx1ZTsKKyAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYW4gbWlzc2luZyB2YWx1ZXMgKDApIGNhbiBiZSBzdG9yZWQgd2l0aG91dCByZXNpemluZworICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIG1pblZhbHVlID0gY3VycmVudFZhbHVlOworICAgICAgICAgICAgICAgIHN0YXJ0Qml0c1BlclZhbHVlID0gUGFja2VkSW50cy5iaXRzUmVxdWlyZWQoKC1taW5WYWx1ZSkgJiAweEZGRkZGRkZGTCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWluVmFsdWUgPSAwOworICAgICAgICAgICAgICAgIHN0YXJ0Qml0c1BlclZhbHVlID0gUGFja2VkSW50cy5iaXRzUmVxdWlyZWQoY3VycmVudFZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgR3Jvd2FibGVXcml0ZXIoc3RhcnRCaXRzUGVyVmFsdWUsIHJlYWRlci5tYXhEb2MoKSwgUGFja2VkSW50cy5GQVNUKTsKKyAgICAgICAgICAgICAgaWYgKG1pblZhbHVlICE9IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZmlsbCgwLCB2YWx1ZXMuc2l6ZSgpLCAoLW1pblZhbHVlKSAmIDB4RkZGRkZGRkZMKTsgLy8gZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIDAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB2YWx1ZXNSZWYuc2V0KG5ldyBHcm93YWJsZVdyaXRlckFuZE1pblZhbHVlKHZhbHVlcywgbWluVmFsdWUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdERvYyhpbnQgZG9jSUQpIHsKLSAgICAgICAgICAgIHZhbHVlc1tkb2NJRF0gPSBjdXJyZW50VmFsdWU7CisgICAgICAgICAgICB2YWx1ZXMuc2V0KGRvY0lELCAoY3VycmVudFZhbHVlIC0gbWluVmFsdWUpICYgMHhGRkZGRkZGRkwpOwogICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHByb3RlY3RlZCBUZXJtc0VudW0gdGVybXNFbnVtKFRlcm1zIHRlcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgcmV0dXJuIHBhcnNlci50ZXJtc0VudW0odGVybXMpOwpAQCAtNjU1LDExICs0ODcsMTEgQEAKICAgICAgIGlmIChzZXREb2NzV2l0aEZpZWxkKSB7CiAgICAgICAgIHdyYXBwZXIuc2V0RG9jc1dpdGhGaWVsZChyZWFkZXIsIGtleS5maWVsZCwgdS5kb2NzV2l0aEZpZWxkKTsKICAgICAgIH0KLSAgICAgIGludFtdIHZhbHVlcyA9IHZhbHVlc1JlZi5nZXQoKTsKKyAgICAgIEdyb3dhYmxlV3JpdGVyQW5kTWluVmFsdWUgdmFsdWVzID0gdmFsdWVzUmVmLmdldCgpOwogICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgIHZhbHVlcyA9IG5ldyBpbnRbcmVhZGVyLm1heERvYygpXTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRzRnJvbUFycmF5KG5ldyBQYWNrZWRJbnRzLk51bGxSZWFkZXIocmVhZGVyLm1heERvYygpKSwgMCk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gbmV3IEludHNGcm9tQXJyYXkodmFsdWVzKTsKKyAgICAgIHJldHVybiBuZXcgSW50c0Zyb21BcnJheSh2YWx1ZXMud3JpdGVyLmdldE11dGFibGUoKSwgKGludCkgdmFsdWVzLm1pblZhbHVlKTsKICAgICB9CiAgIH0KIApAQCAtNzkxLDE1ICs2MjMsOSBAQAogICAgICAgZmluYWwgRmxvYXRQYXJzZXIgcGFyc2VyID0gKEZsb2F0UGFyc2VyKSBrZXkuY3VzdG9tOwogICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7CiAgICAgICAgIC8vIENvbmZ1c2luZzogbXVzdCBkZWxlZ2F0ZSB0byB3cmFwcGVyICh2cyBzaW1wbHkKLSAgICAgICAgLy8gc2V0dGluZyBwYXJzZXIgPQotICAgICAgICAvLyBERUZBVUxUX0ZMT0FUX1BBUlNFUi9OVU1FUklDX1VUSUxTX0ZMT0FUX1BBUlNFUikgc28KLSAgICAgICAgLy8gY2FjaGUga2V5IGluY2x1ZGVzCi0gICAgICAgIC8vIERFRkFVTFRfRkxPQVRfUEFSU0VSL05VTUVSSUNfVVRJTFNfRkxPQVRfUEFSU0VSOgotICAgICAgICB0cnkgewotICAgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEZsb2F0cyhyZWFkZXIsIGtleS5maWVsZCwgREVGQVVMVF9GTE9BVF9QQVJTRVIsIHNldERvY3NXaXRoRmllbGQpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmUpIHsKLSAgICAgICAgICByZXR1cm4gd3JhcHBlci5nZXRGbG9hdHMocmVhZGVyLCBrZXkuZmllbGQsIE5VTUVSSUNfVVRJTFNfRkxPQVRfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKLSAgICAgICAgfQorICAgICAgICAvLyBzZXR0aW5nIHBhcnNlciA9IE5VTUVSSUNfVVRJTFNfRkxPQVRfUEFSU0VSKSBzbworICAgICAgICAvLyBjYWNoZSBrZXkgaW5jbHVkZXMgTlVNRVJJQ19VVElMU19GTE9BVF9QQVJTRVI6CisgICAgICAgIHJldHVybiB3cmFwcGVyLmdldEZsb2F0cyhyZWFkZXIsIGtleS5maWVsZCwgTlVNRVJJQ19VVElMU19GTE9BVF9QQVJTRVIsIHNldERvY3NXaXRoRmllbGQpOwogICAgICAgfQogCiAgICAgICBmaW5hbCBIb2xkc09uZVRoaW5nPGZsb2F0W10+IHZhbHVlc1JlZiA9IG5ldyBIb2xkc09uZVRoaW5nPGZsb2F0W10+KCk7CkBAIC04NzgsMTUgKzcwNCwxNyBAQAogICB9CiAKICAgc3RhdGljIGNsYXNzIExvbmdzRnJvbUFycmF5IGV4dGVuZHMgTG9uZ3MgewotICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIHZhbHVlczsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2tlZEludHMuUmVhZGVyIHZhbHVlczsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWluVmFsdWU7CiAKLSAgICBwdWJsaWMgTG9uZ3NGcm9tQXJyYXkobG9uZ1tdIHZhbHVlcykgeworICAgIHB1YmxpYyBMb25nc0Zyb21BcnJheShQYWNrZWRJbnRzLlJlYWRlciB2YWx1ZXMsIGxvbmcgbWluVmFsdWUpIHsKICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworICAgICAgdGhpcy5taW5WYWx1ZSA9IG1pblZhbHVlOwogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBnZXQoaW50IGRvY0lEKSB7Ci0gICAgICByZXR1cm4gdmFsdWVzW2RvY0lEXTsKKyAgICAgIHJldHVybiBtaW5WYWx1ZSArIHZhbHVlcy5nZXQoZG9jSUQpOwogICAgIH0KICAgfQogCkBAIC05MDIsMjIgKzczMCwxNyBAQAogICAgICAgZmluYWwgTG9uZ1BhcnNlciBwYXJzZXIgPSAoTG9uZ1BhcnNlcikga2V5LmN1c3RvbTsKICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewogICAgICAgICAvLyBDb25mdXNpbmc6IG11c3QgZGVsZWdhdGUgdG8gd3JhcHBlciAodnMgc2ltcGx5Ci0gICAgICAgIC8vIHNldHRpbmcgcGFyc2VyID0KLSAgICAgICAgLy8gREVGQVVMVF9MT05HX1BBUlNFUi9OVU1FUklDX1VUSUxTX0xPTkdfUEFSU0VSKSBzbwotICAgICAgICAvLyBjYWNoZSBrZXkgaW5jbHVkZXMKLSAgICAgICAgLy8gREVGQVVMVF9MT05HX1BBUlNFUi9OVU1FUklDX1VUSUxTX0xPTkdfUEFSU0VSOgotICAgICAgICB0cnkgewotICAgICAgICAgIHJldHVybiB3cmFwcGVyLmdldExvbmdzKHJlYWRlciwga2V5LmZpZWxkLCBERUZBVUxUX0xPTkdfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKSB7Ci0gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0TG9uZ3MocmVhZGVyLCBrZXkuZmllbGQsIE5VTUVSSUNfVVRJTFNfTE9OR19QQVJTRVIsIHNldERvY3NXaXRoRmllbGQpOwotICAgICAgICB9CisgICAgICAgIC8vIHNldHRpbmcgcGFyc2VyID0gTlVNRVJJQ19VVElMU19MT05HX1BBUlNFUikgc28KKyAgICAgICAgLy8gY2FjaGUga2V5IGluY2x1ZGVzIE5VTUVSSUNfVVRJTFNfTE9OR19QQVJTRVI6CisgICAgICAgIHJldHVybiB3cmFwcGVyLmdldExvbmdzKHJlYWRlciwga2V5LmZpZWxkLCBOVU1FUklDX1VUSUxTX0xPTkdfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKICAgICAgIH0KIAotICAgICAgZmluYWwgSG9sZHNPbmVUaGluZzxsb25nW10+IHZhbHVlc1JlZiA9IG5ldyBIb2xkc09uZVRoaW5nPGxvbmdbXT4oKTsKKyAgICAgIGZpbmFsIEhvbGRzT25lVGhpbmc8R3Jvd2FibGVXcml0ZXJBbmRNaW5WYWx1ZT4gdmFsdWVzUmVmID0gbmV3IEhvbGRzT25lVGhpbmc8R3Jvd2FibGVXcml0ZXJBbmRNaW5WYWx1ZT4oKTsKIAogICAgICAgVW5pbnZlcnQgdSA9IG5ldyBVbmludmVydCgpIHsKKyAgICAgICAgICBwcml2YXRlIGxvbmcgbWluVmFsdWU7CiAgICAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRWYWx1ZTsKLSAgICAgICAgICBwcml2YXRlIGxvbmdbXSB2YWx1ZXM7CisgICAgICAgICAgcHJpdmF0ZSBHcm93YWJsZVdyaXRlciB2YWx1ZXM7CiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFRlcm0oQnl0ZXNSZWYgdGVybSkgewpAQCAtOTI3LDE0ICs3NTAsMjYgQEAKICAgICAgICAgICAgICAgLy8gKHdoaWNoIHdpbGwgaGl0IGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCiAgICAgICAgICAgICAgIC8vIHdoZW4gd2UgZmlyc3QgdHJ5IHRoZSBERUZBVUxUX0lOVF9QQVJTRVIpLAogICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBkb3VibGUtYWxsb2M6Ci0gICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBsb25nW3JlYWRlci5tYXhEb2MoKV07Ci0gICAgICAgICAgICAgIHZhbHVlc1JlZi5zZXQodmFsdWVzKTsKKyAgICAgICAgICAgICAgaW50IHN0YXJ0Qml0c1BlclZhbHVlOworICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhbiBtaXNzaW5nIHZhbHVlcyAoMCkgY2FuIGJlIHN0b3JlZCB3aXRob3V0IHJlc2l6aW5nCisgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBjdXJyZW50VmFsdWU7CisgICAgICAgICAgICAgICAgc3RhcnRCaXRzUGVyVmFsdWUgPSBtaW5WYWx1ZSA9PSBMb25nLk1JTl9WQUxVRSA/IDY0IDogUGFja2VkSW50cy5iaXRzUmVxdWlyZWQoLW1pblZhbHVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgc3RhcnRCaXRzUGVyVmFsdWUgPSBQYWNrZWRJbnRzLmJpdHNSZXF1aXJlZChjdXJyZW50VmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBHcm93YWJsZVdyaXRlcihzdGFydEJpdHNQZXJWYWx1ZSwgcmVhZGVyLm1heERvYygpLCBQYWNrZWRJbnRzLkZBU1QpOworICAgICAgICAgICAgICBpZiAobWluVmFsdWUgIT0gMCkgeworICAgICAgICAgICAgICAgIHZhbHVlcy5maWxsKDAsIHZhbHVlcy5zaXplKCksIC1taW5WYWx1ZSk7IC8vIGRlZmF1bHQgdmFsdWUgbXVzdCBiZSAwCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdmFsdWVzUmVmLnNldChuZXcgR3Jvd2FibGVXcml0ZXJBbmRNaW5WYWx1ZSh2YWx1ZXMsIG1pblZhbHVlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCiAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXREb2MoaW50IGRvY0lEKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbZG9jSURdID0gY3VycmVudFZhbHVlOworICAgICAgICAgICAgdmFsdWVzLnNldChkb2NJRCwgY3VycmVudFZhbHVlIC0gbWluVmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTk0OCwxMSArNzgzLDExIEBACiAgICAgICBpZiAoc2V0RG9jc1dpdGhGaWVsZCkgewogICAgICAgICB3cmFwcGVyLnNldERvY3NXaXRoRmllbGQocmVhZGVyLCBrZXkuZmllbGQsIHUuZG9jc1dpdGhGaWVsZCk7CiAgICAgICB9Ci0gICAgICBsb25nW10gdmFsdWVzID0gdmFsdWVzUmVmLmdldCgpOworICAgICAgR3Jvd2FibGVXcml0ZXJBbmRNaW5WYWx1ZSB2YWx1ZXMgPSB2YWx1ZXNSZWYuZ2V0KCk7CiAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgdmFsdWVzID0gbmV3IGxvbmdbcmVhZGVyLm1heERvYygpXTsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nc0Zyb21BcnJheShuZXcgUGFja2VkSW50cy5OdWxsUmVhZGVyKHJlYWRlci5tYXhEb2MoKSksIDBMKTsKICAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgTG9uZ3NGcm9tQXJyYXkodmFsdWVzKTsKKyAgICAgIHJldHVybiBuZXcgTG9uZ3NGcm9tQXJyYXkodmFsdWVzLndyaXRlci5nZXRNdXRhYmxlKCksIHZhbHVlcy5taW5WYWx1ZSk7CiAgICAgfQogICB9CiAKQEAgLTEwMTMsMTUgKzg0OCw5IEBACiAgICAgICBmaW5hbCBEb3VibGVQYXJzZXIgcGFyc2VyID0gKERvdWJsZVBhcnNlcikga2V5LmN1c3RvbTsKICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewogICAgICAgICAvLyBDb25mdXNpbmc6IG11c3QgZGVsZWdhdGUgdG8gd3JhcHBlciAodnMgc2ltcGx5Ci0gICAgICAgIC8vIHNldHRpbmcgcGFyc2VyID0KLSAgICAgICAgLy8gREVGQVVMVF9ET1VCTEVfUEFSU0VSL05VTUVSSUNfVVRJTFNfRE9VQkxFX1BBUlNFUikgc28KLSAgICAgICAgLy8gY2FjaGUga2V5IGluY2x1ZGVzCi0gICAgICAgIC8vIERFRkFVTFRfRE9VQkxFX1BBUlNFUi9OVU1FUklDX1VUSUxTX0RPVUJMRV9QQVJTRVI6Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0RG91YmxlcyhyZWFkZXIsIGtleS5maWVsZCwgREVGQVVMVF9ET1VCTEVfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKSB7Ci0gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0RG91YmxlcyhyZWFkZXIsIGtleS5maWVsZCwgTlVNRVJJQ19VVElMU19ET1VCTEVfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKLSAgICAgICAgfQorICAgICAgICAvLyBzZXR0aW5nIHBhcnNlciA9IE5VTUVSSUNfVVRJTFNfRE9VQkxFX1BBUlNFUikgc28KKyAgICAgICAgLy8gY2FjaGUga2V5IGluY2x1ZGVzIE5VTUVSSUNfVVRJTFNfRE9VQkxFX1BBUlNFUjoKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0RG91YmxlcyhyZWFkZXIsIGtleS5maWVsZCwgTlVNRVJJQ19VVElMU19ET1VCTEVfUEFSU0VSLCBzZXREb2NzV2l0aEZpZWxkKTsKICAgICAgIH0KIAogICAgICAgZmluYWwgSG9sZHNPbmVUaGluZzxkb3VibGVbXT4gdmFsdWVzUmVmID0gbmV3IEhvbGRzT25lVGhpbmc8ZG91YmxlW10+KCk7CkBAIC0xMDY5LDExICs4OTgsMTEgQEAKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvcnRlZERvY1ZhbHVlc0ltcGwgZXh0ZW5kcyBTb3J0ZWREb2NWYWx1ZXMgewogICAgIHByaXZhdGUgZmluYWwgUGFnZWRCeXRlcy5SZWFkZXIgYnl0ZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYWNrZWRJbnRzLlJlYWRlciB0ZXJtT3JkVG9CeXRlc09mZnNldDsKKyAgICBwcml2YXRlIGZpbmFsIE1vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXIgdGVybU9yZFRvQnl0ZXNPZmZzZXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBQYWNrZWRJbnRzLlJlYWRlciBkb2NUb1Rlcm1PcmQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtT3JkOwogCi0gICAgcHVibGljIFNvcnRlZERvY1ZhbHVlc0ltcGwoUGFnZWRCeXRlcy5SZWFkZXIgYnl0ZXMsIFBhY2tlZEludHMuUmVhZGVyIHRlcm1PcmRUb0J5dGVzT2Zmc2V0LCBQYWNrZWRJbnRzLlJlYWRlciBkb2NUb1Rlcm1PcmQsIGludCBudW1PcmQpIHsKKyAgICBwdWJsaWMgU29ydGVkRG9jVmFsdWVzSW1wbChQYWdlZEJ5dGVzLlJlYWRlciBieXRlcywgTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlciB0ZXJtT3JkVG9CeXRlc09mZnNldCwgUGFja2VkSW50cy5SZWFkZXIgZG9jVG9UZXJtT3JkLCBpbnQgbnVtT3JkKSB7CiAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CiAgICAgICB0aGlzLmRvY1RvVGVybU9yZCA9IGRvY1RvVGVybU9yZDsKICAgICAgIHRoaXMudGVybU9yZFRvQnl0ZXNPZmZzZXQgPSB0ZXJtT3JkVG9CeXRlc09mZnNldDsKQEAgLTExNDQsOSArOTczLDcgQEAKIAogICAgICAgZmluYWwgUGFnZWRCeXRlcyBieXRlcyA9IG5ldyBQYWdlZEJ5dGVzKDE1KTsKIAotICAgICAgaW50IHN0YXJ0Qnl0ZXNCUFY7CiAgICAgICBpbnQgc3RhcnRUZXJtc0JQVjsKLSAgICAgIGludCBzdGFydE51bVVuaXF1ZVRlcm1zOwogCiAgICAgICBmaW5hbCBpbnQgdGVybUNvdW50SGFyZExpbWl0OwogICAgICAgaWYgKG1heERvYyA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewpAQCAtMTE2OSwyMiArOTk2LDE1IEBACiAgICAgICAgICAgICBudW1VbmlxdWVUZXJtcyA9IHRlcm1Db3VudEhhcmRMaW1pdDsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBzdGFydEJ5dGVzQlBWID0gUGFja2VkSW50cy5iaXRzUmVxdWlyZWQobnVtVW5pcXVlVGVybXMqNCk7CiAgICAgICAgICAgc3RhcnRUZXJtc0JQViA9IFBhY2tlZEludHMuYml0c1JlcXVpcmVkKG51bVVuaXF1ZVRlcm1zKTsKLQotICAgICAgICAgIHN0YXJ0TnVtVW5pcXVlVGVybXMgPSAoaW50KSBudW1VbmlxdWVUZXJtczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdGFydEJ5dGVzQlBWID0gMTsKICAgICAgICAgICBzdGFydFRlcm1zQlBWID0gMTsKLSAgICAgICAgICBzdGFydE51bVVuaXF1ZVRlcm1zID0gMTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhcnRCeXRlc0JQViA9IDE7CiAgICAgICAgIHN0YXJ0VGVybXNCUFYgPSAxOwotICAgICAgICBzdGFydE51bVVuaXF1ZVRlcm1zID0gMTsKICAgICAgIH0KIAotICAgICAgR3Jvd2FibGVXcml0ZXIgdGVybU9yZFRvQnl0ZXNPZmZzZXQgPSBuZXcgR3Jvd2FibGVXcml0ZXIoc3RhcnRCeXRlc0JQViwgMStzdGFydE51bVVuaXF1ZVRlcm1zLCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbyk7CisgICAgICBNb25vdG9uaWNBcHBlbmRpbmdMb25nQnVmZmVyIHRlcm1PcmRUb0J5dGVzT2Zmc2V0ID0gbmV3IE1vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXIoKTsKICAgICAgIGZpbmFsIEdyb3dhYmxlV3JpdGVyIGRvY1RvVGVybU9yZCA9IG5ldyBHcm93YWJsZVdyaXRlcihzdGFydFRlcm1zQlBWLCBtYXhEb2MsIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKTsKIAogICAgICAgaW50IHRlcm1PcmQgPSAwOwpAQCAtMTIwNCwxMyArMTAyNCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBpZiAodGVybU9yZCA9PSB0ZXJtT3JkVG9CeXRlc09mZnNldC5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgY29kZSBvbmx5IHJ1bnMgaWYgdGhlIGluY29taW5nCi0gICAgICAgICAgICAvLyByZWFkZXIgaW1wbCBkb2Vzbid0IGltcGxlbWVudAotICAgICAgICAgICAgLy8gc2l6ZSAod2hpY2ggc2hvdWxkIGJlIHVuY29tbW9uKQotICAgICAgICAgICAgdGVybU9yZFRvQnl0ZXNPZmZzZXQgPSB0ZXJtT3JkVG9CeXRlc09mZnNldC5yZXNpemUoQXJyYXlVdGlsLm92ZXJzaXplKDErdGVybU9yZCwgMSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0ZXJtT3JkVG9CeXRlc09mZnNldC5zZXQodGVybU9yZCwgYnl0ZXMuY29weVVzaW5nTGVuZ3RoUHJlZml4KHRlcm0pKTsKKyAgICAgICAgICB0ZXJtT3JkVG9CeXRlc09mZnNldC5hZGQoYnl0ZXMuY29weVVzaW5nTGVuZ3RoUHJlZml4KHRlcm0pKTsKICAgICAgICAgICBkb2NzID0gdGVybXNFbnVtLmRvY3MobnVsbCwgZG9jcywgRG9jc0VudW0uRkxBR19OT05FKTsKICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgZmluYWwgaW50IGRvY0lEID0gZG9jcy5uZXh0RG9jKCk7CkBAIC0xMjIyLDE0ICsxMDM2LDEwIEBACiAgICAgICAgICAgfQogICAgICAgICAgIHRlcm1PcmQrKzsKICAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZXJtT3JkVG9CeXRlc09mZnNldC5zaXplKCkgPiB0ZXJtT3JkKSB7Ci0gICAgICAgICAgdGVybU9yZFRvQnl0ZXNPZmZzZXQgPSB0ZXJtT3JkVG9CeXRlc09mZnNldC5yZXNpemUodGVybU9yZCk7Ci0gICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLy8gbWF5YmUgYW4gaW50LW9ubHkgaW1wbD8KLSAgICAgIHJldHVybiBuZXcgU29ydGVkRG9jVmFsdWVzSW1wbChieXRlcy5mcmVlemUodHJ1ZSksIHRlcm1PcmRUb0J5dGVzT2Zmc2V0LmdldE11dGFibGUoKSwgZG9jVG9UZXJtT3JkLmdldE11dGFibGUoKSwgdGVybU9yZCk7CisgICAgICByZXR1cm4gbmV3IFNvcnRlZERvY1ZhbHVlc0ltcGwoYnl0ZXMuZnJlZXplKHRydWUpLCB0ZXJtT3JkVG9CeXRlc09mZnNldCwgZG9jVG9UZXJtT3JkLmdldE11dGFibGUoKSwgdGVybU9yZCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlUmFuZ2VGaWx0ZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENhY2hlUmFuZ2VGaWx0ZXIuamF2YQppbmRleCA0NzVhNjQ5Li5jMjYyNDk2IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvRmllbGRDYWNoZVJhbmdlRmlsdGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0ZpZWxkQ2FjaGVSYW5nZUZpbHRlci5qYXZhCkBAIC0xOTMsMTA5ICsxOTMsNyBAQAogICAgICAgfQogICAgIH07CiAgIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbnVtZXJpYyByYW5nZSBmaWx0ZXIgdXNpbmcge0BsaW5rIEZpZWxkQ2FjaGUjZ2V0Qnl0ZXMoQXRvbWljUmVhZGVyLFN0cmluZyxib29sZWFuKX0uIFRoaXMgd29ya3Mgd2l0aCBhbGwKLSAgICogYnl0ZSBmaWVsZHMgY29udGFpbmluZyBleGFjdGx5IG9uZSBudW1lcmljIHRlcm0gaW4gdGhlIGZpZWxkLiBUaGUgcmFuZ2UgY2FuIGJlIGhhbGYtb3BlbiBieSBzZXR0aW5nIG9uZQotICAgKiBvZiB0aGUgdmFsdWVzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZENhY2hlUmFuZ2VGaWx0ZXI8Qnl0ZT4gbmV3Qnl0ZVJhbmdlKFN0cmluZyBmaWVsZCwgQnl0ZSBsb3dlclZhbCwgQnl0ZSB1cHBlclZhbCwgYm9vbGVhbiBpbmNsdWRlTG93ZXIsIGJvb2xlYW4gaW5jbHVkZVVwcGVyKSB7Ci0gICAgcmV0dXJuIG5ld0J5dGVSYW5nZShmaWVsZCwgbnVsbCwgbG93ZXJWYWwsIHVwcGVyVmFsLCBpbmNsdWRlTG93ZXIsIGluY2x1ZGVVcHBlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbnVtZXJpYyByYW5nZSBmaWx0ZXIgdXNpbmcge0BsaW5rIEZpZWxkQ2FjaGUjZ2V0Qnl0ZXMoQXRvbWljUmVhZGVyLFN0cmluZyxGaWVsZENhY2hlLkJ5dGVQYXJzZXIsYm9vbGVhbil9LiBUaGlzIHdvcmtzIHdpdGggYWxsCi0gICAqIGJ5dGUgZmllbGRzIGNvbnRhaW5pbmcgZXhhY3RseSBvbmUgbnVtZXJpYyB0ZXJtIGluIHRoZSBmaWVsZC4gVGhlIHJhbmdlIGNhbiBiZSBoYWxmLW9wZW4gYnkgc2V0dGluZyBvbmUKLSAgICogb2YgdGhlIHZhbHVlcyB0byA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmllbGRDYWNoZVJhbmdlRmlsdGVyPEJ5dGU+IG5ld0J5dGVSYW5nZShTdHJpbmcgZmllbGQsIEZpZWxkQ2FjaGUuQnl0ZVBhcnNlciBwYXJzZXIsIEJ5dGUgbG93ZXJWYWwsIEJ5dGUgdXBwZXJWYWwsIGJvb2xlYW4gaW5jbHVkZUxvd2VyLCBib29sZWFuIGluY2x1ZGVVcHBlcikgewotICAgIHJldHVybiBuZXcgRmllbGRDYWNoZVJhbmdlRmlsdGVyPEJ5dGU+KGZpZWxkLCBwYXJzZXIsIGxvd2VyVmFsLCB1cHBlclZhbCwgaW5jbHVkZUxvd2VyLCBpbmNsdWRlVXBwZXIpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIERvY0lkU2V0IGdldERvY0lkU2V0KEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCwgQml0cyBhY2NlcHREb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBieXRlIGluY2x1c2l2ZUxvd2VyUG9pbnQsIGluY2x1c2l2ZVVwcGVyUG9pbnQ7Ci0gICAgICAgIGlmIChsb3dlclZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgZmluYWwgYnl0ZSBpID0gbG93ZXJWYWwuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgaWYgKCFpbmNsdWRlTG93ZXIgJiYgaSA9PSBCeXRlLk1BWF9WQUxVRSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIGluY2x1c2l2ZUxvd2VyUG9pbnQgPSAoYnl0ZSkgKGluY2x1ZGVMb3dlciA/ICBpIDogKGkgKyAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5jbHVzaXZlTG93ZXJQb2ludCA9IEJ5dGUuTUlOX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cHBlclZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgZmluYWwgYnl0ZSBpID0gdXBwZXJWYWwuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgaWYgKCFpbmNsdWRlVXBwZXIgJiYgaSA9PSBCeXRlLk1JTl9WQUxVRSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIGluY2x1c2l2ZVVwcGVyUG9pbnQgPSAoYnl0ZSkgKGluY2x1ZGVVcHBlciA/IGkgOiAoaSAtIDEpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmNsdXNpdmVVcHBlclBvaW50ID0gQnl0ZS5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbmNsdXNpdmVMb3dlclBvaW50ID4gaW5jbHVzaXZlVXBwZXJQb2ludCkKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEZpZWxkQ2FjaGUuQnl0ZXMgdmFsdWVzID0gRmllbGRDYWNoZS5ERUZBVUxULmdldEJ5dGVzKGNvbnRleHQucmVhZGVyKCksIGZpZWxkLCAoRmllbGRDYWNoZS5CeXRlUGFyc2VyKSBwYXJzZXIsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENhY2hlRG9jSWRTZXQoY29udGV4dC5yZWFkZXIoKS5tYXhEb2MoKSwgYWNjZXB0RG9jcykgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoRG9jKGludCBkb2MpIHsKLSAgICAgICAgICAgIGZpbmFsIGJ5dGUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGRvYyk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUgPj0gaW5jbHVzaXZlTG93ZXJQb2ludCAmJiB2YWx1ZSA8PSBpbmNsdXNpdmVVcHBlclBvaW50OwotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIG51bWVyaWMgcmFuZ2UgZmlsdGVyIHVzaW5nIHtAbGluayBGaWVsZENhY2hlI2dldFNob3J0cyhBdG9taWNSZWFkZXIsU3RyaW5nLGJvb2xlYW4pfS4gVGhpcyB3b3JrcyB3aXRoIGFsbAotICAgKiBzaG9ydCBmaWVsZHMgY29udGFpbmluZyBleGFjdGx5IG9uZSBudW1lcmljIHRlcm0gaW4gdGhlIGZpZWxkLiBUaGUgcmFuZ2UgY2FuIGJlIGhhbGYtb3BlbiBieSBzZXR0aW5nIG9uZQotICAgKiBvZiB0aGUgdmFsdWVzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZENhY2hlUmFuZ2VGaWx0ZXI8U2hvcnQ+IG5ld1Nob3J0UmFuZ2UoU3RyaW5nIGZpZWxkLCBTaG9ydCBsb3dlclZhbCwgU2hvcnQgdXBwZXJWYWwsIGJvb2xlYW4gaW5jbHVkZUxvd2VyLCBib29sZWFuIGluY2x1ZGVVcHBlcikgewotICAgIHJldHVybiBuZXdTaG9ydFJhbmdlKGZpZWxkLCBudWxsLCBsb3dlclZhbCwgdXBwZXJWYWwsIGluY2x1ZGVMb3dlciwgaW5jbHVkZVVwcGVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBudW1lcmljIHJhbmdlIGZpbHRlciB1c2luZyB7QGxpbmsgRmllbGRDYWNoZSNnZXRTaG9ydHMoQXRvbWljUmVhZGVyLFN0cmluZyxGaWVsZENhY2hlLlNob3J0UGFyc2VyLGJvb2xlYW4pfS4gVGhpcyB3b3JrcyB3aXRoIGFsbAotICAgKiBzaG9ydCBmaWVsZHMgY29udGFpbmluZyBleGFjdGx5IG9uZSBudW1lcmljIHRlcm0gaW4gdGhlIGZpZWxkLiBUaGUgcmFuZ2UgY2FuIGJlIGhhbGYtb3BlbiBieSBzZXR0aW5nIG9uZQotICAgKiBvZiB0aGUgdmFsdWVzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZENhY2hlUmFuZ2VGaWx0ZXI8U2hvcnQ+IG5ld1Nob3J0UmFuZ2UoU3RyaW5nIGZpZWxkLCBGaWVsZENhY2hlLlNob3J0UGFyc2VyIHBhcnNlciwgU2hvcnQgbG93ZXJWYWwsIFNob3J0IHVwcGVyVmFsLCBib29sZWFuIGluY2x1ZGVMb3dlciwgYm9vbGVhbiBpbmNsdWRlVXBwZXIpIHsKLSAgICByZXR1cm4gbmV3IEZpZWxkQ2FjaGVSYW5nZUZpbHRlcjxTaG9ydD4oZmllbGQsIHBhcnNlciwgbG93ZXJWYWwsIHVwcGVyVmFsLCBpbmNsdWRlTG93ZXIsIGluY2x1ZGVVcHBlcikgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgRG9jSWRTZXQgZ2V0RG9jSWRTZXQoQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0LCBCaXRzIGFjY2VwdERvY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIHNob3J0IGluY2x1c2l2ZUxvd2VyUG9pbnQsIGluY2x1c2l2ZVVwcGVyUG9pbnQ7Ci0gICAgICAgIGlmIChsb3dlclZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgc2hvcnQgaSA9IGxvd2VyVmFsLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICBpZiAoIWluY2x1ZGVMb3dlciAmJiBpID09IFNob3J0Lk1BWF9WQUxVRSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIGluY2x1c2l2ZUxvd2VyUG9pbnQgPSAoc2hvcnQpIChpbmNsdWRlTG93ZXIgPyBpIDogKGkgKyAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5jbHVzaXZlTG93ZXJQb2ludCA9IFNob3J0Lk1JTl9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBwZXJWYWwgIT0gbnVsbCkgewotICAgICAgICAgIHNob3J0IGkgPSB1cHBlclZhbC5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgaWYgKCFpbmNsdWRlVXBwZXIgJiYgaSA9PSBTaG9ydC5NSU5fVkFMVUUpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBpbmNsdXNpdmVVcHBlclBvaW50ID0gKHNob3J0KSAoaW5jbHVkZVVwcGVyID8gaSA6IChpIC0gMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluY2x1c2l2ZVVwcGVyUG9pbnQgPSBTaG9ydC5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbmNsdXNpdmVMb3dlclBvaW50ID4gaW5jbHVzaXZlVXBwZXJQb2ludCkKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEZpZWxkQ2FjaGUuU2hvcnRzIHZhbHVlcyA9IEZpZWxkQ2FjaGUuREVGQVVMVC5nZXRTaG9ydHMoY29udGV4dC5yZWFkZXIoKSwgZmllbGQsIChGaWVsZENhY2hlLlNob3J0UGFyc2VyKSBwYXJzZXIsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENhY2hlRG9jSWRTZXQoY29udGV4dC5yZWFkZXIoKS5tYXhEb2MoKSwgYWNjZXB0RG9jcykgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoRG9jKGludCBkb2MpIHsKLSAgICAgICAgICAgIGZpbmFsIHNob3J0IHZhbHVlID0gdmFsdWVzLmdldChkb2MpOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlID49IGluY2x1c2l2ZUxvd2VyUG9pbnQgJiYgdmFsdWUgPD0gaW5jbHVzaXZlVXBwZXJQb2ludDsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKKwogICAvKioKICAgICogQ3JlYXRlcyBhIG51bWVyaWMgcmFuZ2UgZmlsdGVyIHVzaW5nIHtAbGluayBGaWVsZENhY2hlI2dldEludHMoQXRvbWljUmVhZGVyLFN0cmluZyxib29sZWFuKX0uIFRoaXMgd29ya3Mgd2l0aCBhbGwKICAgICogaW50IGZpZWxkcyBjb250YWluaW5nIGV4YWN0bHkgb25lIG51bWVyaWMgdGVybSBpbiB0aGUgZmllbGQuIFRoZSByYW5nZSBjYW4gYmUgaGFsZi1vcGVuIGJ5IHNldHRpbmcgb25lCkBAIC01MjEsNyArNDE5LDcgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsInJhd3R5cGVzIn0pCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMifSkKICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEZpZWxkQ2FjaGVSYW5nZUZpbHRlcikpIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENvbXBhcmF0b3IuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9GaWVsZENvbXBhcmF0b3IuamF2YQppbmRleCBlZTk2NjhlLi4yOGU2MTQ0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvRmllbGRDb21wYXJhdG9yLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0ZpZWxkQ29tcGFyYXRvci5qYXZhCkBAIC0yMiwxMiArMjIsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5BdG9taWNSZWFkZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkJpbmFyeURvY1ZhbHVlczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Tb3J0ZWREb2NWYWx1ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGUuQnl0ZVBhcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZS5Eb3VibGVQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGUuRmxvYXRQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGUuSW50UGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlLkxvbmdQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGUuU2hvcnRQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CaXRzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CiAKQEAgLTIxOCw3OCArMjE2LDYgQEAKICAgICB9CiAgIH0KIAotICAvKiogUGFyc2VzIGZpZWxkJ3MgdmFsdWVzIGFzIGJ5dGUgKHVzaW5nIHtAbGluawotICAgKiAgRmllbGRDYWNoZSNnZXRCeXRlc30gYW5kIHNvcnRzIGJ5IGFzY2VuZGluZyB2YWx1ZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ5dGVDb21wYXJhdG9yIGV4dGVuZHMgTnVtZXJpY0NvbXBhcmF0b3I8Qnl0ZT4gewotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHZhbHVlczsKLSAgICBwcml2YXRlIGZpbmFsIEJ5dGVQYXJzZXIgcGFyc2VyOwotICAgIHByaXZhdGUgRmllbGRDYWNoZS5CeXRlcyBjdXJyZW50UmVhZGVyVmFsdWVzOwotICAgIHByaXZhdGUgYnl0ZSBib3R0b207Ci0KLSAgICBCeXRlQ29tcGFyYXRvcihpbnQgbnVtSGl0cywgU3RyaW5nIGZpZWxkLCBGaWVsZENhY2hlLlBhcnNlciBwYXJzZXIsIEJ5dGUgbWlzc2luZ1ZhbHVlKSB7Ci0gICAgICBzdXBlcihmaWVsZCwgbWlzc2luZ1ZhbHVlKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBieXRlW251bUhpdHNdOwotICAgICAgdGhpcy5wYXJzZXIgPSAoQnl0ZVBhcnNlcikgcGFyc2VyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShpbnQgc2xvdDEsIGludCBzbG90MikgewotICAgICAgcmV0dXJuIEJ5dGUuY29tcGFyZSh2YWx1ZXNbc2xvdDFdLCB2YWx1ZXNbc2xvdDJdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvbXBhcmVCb3R0b20oaW50IGRvYykgewotICAgICAgYnl0ZSB2MiA9IGN1cnJlbnRSZWFkZXJWYWx1ZXMuZ2V0KGRvYyk7Ci0gICAgICAvLyBUZXN0IGZvciB2MiA9PSAwIHRvIHNhdmUgQml0cy5nZXQgbWV0aG9kIGNhbGwgZm9yCi0gICAgICAvLyB0aGUgY29tbW9uIGNhc2UgKGRvYyBoYXMgdmFsdWUgYW5kIHZhbHVlIGlzIG5vbi16ZXJvKToKLSAgICAgIGlmIChkb2NzV2l0aEZpZWxkICE9IG51bGwgJiYgdjIgPT0gMCAmJiAhZG9jc1dpdGhGaWVsZC5nZXQoZG9jKSkgewotICAgICAgICB2MiA9IG1pc3NpbmdWYWx1ZTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIEJ5dGUuY29tcGFyZShib3R0b20sIHYyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5KGludCBzbG90LCBpbnQgZG9jKSB7Ci0gICAgICBieXRlIHYyID0gY3VycmVudFJlYWRlclZhbHVlcy5nZXQoZG9jKTsKLSAgICAgIC8vIFRlc3QgZm9yIHYyID09IDAgdG8gc2F2ZSBCaXRzLmdldCBtZXRob2QgY2FsbCBmb3IKLSAgICAgIC8vIHRoZSBjb21tb24gY2FzZSAoZG9jIGhhcyB2YWx1ZSBhbmQgdmFsdWUgaXMgbm9uLXplcm8pOgotICAgICAgaWYgKGRvY3NXaXRoRmllbGQgIT0gbnVsbCAmJiB2MiA9PSAwICYmICFkb2NzV2l0aEZpZWxkLmdldChkb2MpKSB7Ci0gICAgICAgIHYyID0gbWlzc2luZ1ZhbHVlOwotICAgICAgfQotICAgICAgdmFsdWVzW3Nsb3RdID0gdjI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpZWxkQ29tcGFyYXRvcjxCeXRlPiBzZXROZXh0UmVhZGVyKEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIE5PVEU6IG11c3QgZG8gdGhpcyBiZWZvcmUgY2FsbGluZyBzdXBlciBvdGhlcndpc2UKLSAgICAgIC8vIHdlIGNvbXB1dGUgdGhlIGRvY3NXaXRoRmllbGQgQml0cyB0d2ljZSEKLSAgICAgIGN1cnJlbnRSZWFkZXJWYWx1ZXMgPSBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0Qnl0ZXMoY29udGV4dC5yZWFkZXIoKSwgZmllbGQsIHBhcnNlciwgbWlzc2luZ1ZhbHVlICE9IG51bGwpOwotICAgICAgcmV0dXJuIHN1cGVyLnNldE5leHRSZWFkZXIoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJvdHRvbShmaW5hbCBpbnQgYm90dG9tKSB7Ci0gICAgICB0aGlzLmJvdHRvbSA9IHZhbHVlc1tib3R0b21dOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlIHZhbHVlKGludCBzbG90KSB7Ci0gICAgICByZXR1cm4gQnl0ZS52YWx1ZU9mKHZhbHVlc1tzbG90XSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wYXJlRG9jVG9WYWx1ZShpbnQgZG9jLCBCeXRlIHZhbHVlKSB7Ci0gICAgICBieXRlIGRvY1ZhbHVlID0gY3VycmVudFJlYWRlclZhbHVlcy5nZXQoZG9jKTsKLSAgICAgIC8vIFRlc3QgZm9yIGRvY1ZhbHVlID09IDAgdG8gc2F2ZSBCaXRzLmdldCBtZXRob2QgY2FsbCBmb3IKLSAgICAgIC8vIHRoZSBjb21tb24gY2FzZSAoZG9jIGhhcyB2YWx1ZSBhbmQgdmFsdWUgaXMgbm9uLXplcm8pOgotICAgICAgaWYgKGRvY3NXaXRoRmllbGQgIT0gbnVsbCAmJiBkb2NWYWx1ZSA9PSAwICYmICFkb2NzV2l0aEZpZWxkLmdldChkb2MpKSB7Ci0gICAgICAgIGRvY1ZhbHVlID0gbWlzc2luZ1ZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuIEJ5dGUuY29tcGFyZShkb2NWYWx1ZSwgdmFsdWUuYnl0ZVZhbHVlKCkpOwotICAgIH0KLSAgfQotCiAgIC8qKiBQYXJzZXMgZmllbGQncyB2YWx1ZXMgYXMgZG91YmxlICh1c2luZyB7QGxpbmsKICAgICogIEZpZWxkQ2FjaGUjZ2V0RG91Ymxlc30gYW5kIHNvcnRzIGJ5IGFzY2VuZGluZyB2YWx1ZSAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERvdWJsZUNvbXBhcmF0b3IgZXh0ZW5kcyBOdW1lcmljQ29tcGFyYXRvcjxEb3VibGU+IHsKQEAgLTQzOSw4MCArMzY1LDYgQEAKICAgICB9CiAgIH0KIAotICAvKiogUGFyc2VzIGZpZWxkJ3MgdmFsdWVzIGFzIHNob3J0ICh1c2luZyB7QGxpbmsKLSAgICogIEZpZWxkQ2FjaGUjZ2V0U2hvcnRzfSBhbmQgc29ydHMgYnkgYXNjZW5kaW5nIHZhbHVlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2hvcnRDb21wYXJhdG9yIGV4dGVuZHMgTnVtZXJpY0NvbXBhcmF0b3I8U2hvcnQ+IHsKLSAgICBwcml2YXRlIGZpbmFsIHNob3J0W10gdmFsdWVzOwotICAgIHByaXZhdGUgZmluYWwgU2hvcnRQYXJzZXIgcGFyc2VyOwotICAgIHByaXZhdGUgRmllbGRDYWNoZS5TaG9ydHMgY3VycmVudFJlYWRlclZhbHVlczsKLSAgICBwcml2YXRlIHNob3J0IGJvdHRvbTsKLQotICAgIFNob3J0Q29tcGFyYXRvcihpbnQgbnVtSGl0cywgU3RyaW5nIGZpZWxkLCBGaWVsZENhY2hlLlBhcnNlciBwYXJzZXIsIFNob3J0IG1pc3NpbmdWYWx1ZSkgewotICAgICAgc3VwZXIoZmllbGQsIG1pc3NpbmdWYWx1ZSk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgc2hvcnRbbnVtSGl0c107Ci0gICAgICB0aGlzLnBhcnNlciA9IChTaG9ydFBhcnNlcikgcGFyc2VyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShpbnQgc2xvdDEsIGludCBzbG90MikgewotICAgICAgcmV0dXJuIFNob3J0LmNvbXBhcmUodmFsdWVzW3Nsb3QxXSwgdmFsdWVzW3Nsb3QyXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wYXJlQm90dG9tKGludCBkb2MpIHsKLSAgICAgIHNob3J0IHYyID0gY3VycmVudFJlYWRlclZhbHVlcy5nZXQoZG9jKTsKLSAgICAgIC8vIFRlc3QgZm9yIHYyID09IDAgdG8gc2F2ZSBCaXRzLmdldCBtZXRob2QgY2FsbCBmb3IKLSAgICAgIC8vIHRoZSBjb21tb24gY2FzZSAoZG9jIGhhcyB2YWx1ZSBhbmQgdmFsdWUgaXMgbm9uLXplcm8pOgotICAgICAgaWYgKGRvY3NXaXRoRmllbGQgIT0gbnVsbCAmJiB2MiA9PSAwICYmICFkb2NzV2l0aEZpZWxkLmdldChkb2MpKSB7Ci0gICAgICAgIHYyID0gbWlzc2luZ1ZhbHVlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gU2hvcnQuY29tcGFyZShib3R0b20sIHYyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5KGludCBzbG90LCBpbnQgZG9jKSB7Ci0gICAgICBzaG9ydCB2MiA9IGN1cnJlbnRSZWFkZXJWYWx1ZXMuZ2V0KGRvYyk7Ci0gICAgICAvLyBUZXN0IGZvciB2MiA9PSAwIHRvIHNhdmUgQml0cy5nZXQgbWV0aG9kIGNhbGwgZm9yCi0gICAgICAvLyB0aGUgY29tbW9uIGNhc2UgKGRvYyBoYXMgdmFsdWUgYW5kIHZhbHVlIGlzIG5vbi16ZXJvKToKLSAgICAgIGlmIChkb2NzV2l0aEZpZWxkICE9IG51bGwgJiYgdjIgPT0gMCAmJiAhZG9jc1dpdGhGaWVsZC5nZXQoZG9jKSkgewotICAgICAgICB2MiA9IG1pc3NpbmdWYWx1ZTsKLSAgICAgIH0KLQotICAgICAgdmFsdWVzW3Nsb3RdID0gdjI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpZWxkQ29tcGFyYXRvcjxTaG9ydD4gc2V0TmV4dFJlYWRlcihBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAvLyBOT1RFOiBtdXN0IGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgc3VwZXIgb3RoZXJ3aXNlCi0gICAgICAvLyB3ZSBjb21wdXRlIHRoZSBkb2NzV2l0aEZpZWxkIEJpdHMgdHdpY2UhCi0gICAgICBjdXJyZW50UmVhZGVyVmFsdWVzID0gRmllbGRDYWNoZS5ERUZBVUxULmdldFNob3J0cyhjb250ZXh0LnJlYWRlcigpLCBmaWVsZCwgcGFyc2VyLCBtaXNzaW5nVmFsdWUgIT0gbnVsbCk7Ci0gICAgICByZXR1cm4gc3VwZXIuc2V0TmV4dFJlYWRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCb3R0b20oZmluYWwgaW50IGJvdHRvbSkgewotICAgICAgdGhpcy5ib3R0b20gPSB2YWx1ZXNbYm90dG9tXTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2hvcnQgdmFsdWUoaW50IHNsb3QpIHsKLSAgICAgIHJldHVybiBTaG9ydC52YWx1ZU9mKHZhbHVlc1tzbG90XSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wYXJlRG9jVG9WYWx1ZShpbnQgZG9jLCBTaG9ydCB2YWx1ZU9iaikgewotICAgICAgZmluYWwgc2hvcnQgdmFsdWUgPSB2YWx1ZU9iai5zaG9ydFZhbHVlKCk7Ci0gICAgICBzaG9ydCBkb2NWYWx1ZSA9IGN1cnJlbnRSZWFkZXJWYWx1ZXMuZ2V0KGRvYyk7Ci0gICAgICAvLyBUZXN0IGZvciBkb2NWYWx1ZSA9PSAwIHRvIHNhdmUgQml0cy5nZXQgbWV0aG9kIGNhbGwgZm9yCi0gICAgICAvLyB0aGUgY29tbW9uIGNhc2UgKGRvYyBoYXMgdmFsdWUgYW5kIHZhbHVlIGlzIG5vbi16ZXJvKToKLSAgICAgIGlmIChkb2NzV2l0aEZpZWxkICE9IG51bGwgJiYgZG9jVmFsdWUgPT0gMCAmJiAhZG9jc1dpdGhGaWVsZC5nZXQoZG9jKSkgewotICAgICAgICBkb2NWYWx1ZSA9IG1pc3NpbmdWYWx1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBTaG9ydC5jb21wYXJlKGRvY1ZhbHVlLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KICAgLyoqIFBhcnNlcyBmaWVsZCdzIHZhbHVlcyBhcyBpbnQgKHVzaW5nIHtAbGluawogICAgKiAgRmllbGRDYWNoZSNnZXRJbnRzfSBhbmQgc29ydHMgYnkgYXNjZW5kaW5nIHZhbHVlICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW50Q29tcGFyYXRvciBleHRlbmRzIE51bWVyaWNDb21wYXJhdG9yPEludGVnZXI+IHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9NdWx0aVBocmFzZVF1ZXJ5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvTXVsdGlQaHJhc2VRdWVyeS5qYXZhCmluZGV4IGNlNDQ2YTguLjkyODM3ZWMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9NdWx0aVBocmFzZVF1ZXJ5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL011bHRpUGhyYXNlUXVlcnkuamF2YQpAQCAtMzEsNyArMzEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1TdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtc0VudW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltU2NvcmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkFycmF5VXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJpdHM7CkBAIC0yNDUsMTQgKzI0NSwxNCBAQAogICAgICAgfQogCiAgICAgICBpZiAoc2xvcCA9PSAwKSB7Ci0gICAgICAgIEV4YWN0UGhyYXNlU2NvcmVyIHMgPSBuZXcgRXhhY3RQaHJhc2VTY29yZXIodGhpcywgcG9zdGluZ3NGcmVxcywgc2ltaWxhcml0eS5leGFjdFNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOworICAgICAgICBFeGFjdFBocmFzZVNjb3JlciBzID0gbmV3IEV4YWN0UGhyYXNlU2NvcmVyKHRoaXMsIHBvc3RpbmdzRnJlcXMsIHNpbWlsYXJpdHkuc2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KSk7CiAgICAgICAgIGlmIChzLm5vRG9jcykgewogICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHJldHVybiBzOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IFNsb3BweVBocmFzZVNjb3Jlcih0aGlzLCBwb3N0aW5nc0ZyZXFzLCBzbG9wLCBzaW1pbGFyaXR5LnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOworICAgICAgICByZXR1cm4gbmV3IFNsb3BweVBocmFzZVNjb3Jlcih0aGlzLCBwb3N0aW5nc0ZyZXFzLCBzbG9wLCBzaW1pbGFyaXR5LnNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOwogICAgICAgfQogICAgIH0KIApAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgIGludCBuZXdEb2MgPSBzY29yZXIuYWR2YW5jZShkb2MpOwogICAgICAgICBpZiAobmV3RG9jID09IGRvYykgewogICAgICAgICAgIGZsb2F0IGZyZXEgPSBzbG9wID09IDAgPyBzY29yZXIuZnJlcSgpIDogKChTbG9wcHlQaHJhc2VTY29yZXIpc2NvcmVyKS5zbG9wcHlGcmVxKCk7Ci0gICAgICAgICAgU2xvcHB5U2ltU2NvcmVyIGRvY1Njb3JlciA9IHNpbWlsYXJpdHkuc2xvcHB5U2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KTsKKyAgICAgICAgICBTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOwogICAgICAgICAgIENvbXBsZXhFeHBsYW5hdGlvbiByZXN1bHQgPSBuZXcgQ29tcGxleEV4cGxhbmF0aW9uKCk7CiAgICAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKCJ3ZWlnaHQoIitnZXRRdWVyeSgpKyIgaW4gIitkb2MrIikgWyIgKyBzaW1pbGFyaXR5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIl0sIHJlc3VsdCBvZjoiKTsKICAgICAgICAgICBFeHBsYW5hdGlvbiBzY29yZUV4cGxhbmF0aW9uID0gZG9jU2NvcmVyLmV4cGxhaW4oZG9jLCBuZXcgRXhwbGFuYXRpb24oZnJlcSwgInBocmFzZUZyZXE9IiArIGZyZXEpKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9QaHJhc2VRdWVyeS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1BocmFzZVF1ZXJ5LmphdmEKaW5kZXggMDkxMWFmNC4uYjQ4YTFkYyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1BocmFzZVF1ZXJ5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1BocmFzZVF1ZXJ5LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtU3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXNFbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TbG9wcHlTaW1TY29yZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNpbVNjb3JlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5BcnJheVV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CaXRzOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgICB9CiAKICAgICAgIGlmIChzbG9wID09IDApIHsgIC8vIG9wdGltaXplIGV4YWN0IGNhc2UKLSAgICAgICAgRXhhY3RQaHJhc2VTY29yZXIgcyA9IG5ldyBFeGFjdFBocmFzZVNjb3Jlcih0aGlzLCBwb3N0aW5nc0ZyZXFzLCBzaW1pbGFyaXR5LmV4YWN0U2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KSk7CisgICAgICAgIEV4YWN0UGhyYXNlU2NvcmVyIHMgPSBuZXcgRXhhY3RQaHJhc2VTY29yZXIodGhpcywgcG9zdGluZ3NGcmVxcywgc2ltaWxhcml0eS5zaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpKTsKICAgICAgICAgaWYgKHMubm9Eb2NzKSB7CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgbmV3IFNsb3BweVBocmFzZVNjb3Jlcih0aGlzLCBwb3N0aW5nc0ZyZXFzLCBzbG9wLCBzaW1pbGFyaXR5LnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOworICAgICAgICAgIG5ldyBTbG9wcHlQaHJhc2VTY29yZXIodGhpcywgcG9zdGluZ3NGcmVxcywgc2xvcCwgc2ltaWxhcml0eS5zaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpKTsKICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0zMDYsNyArMzA2LDcgQEAKICAgICAgICAgaW50IG5ld0RvYyA9IHNjb3Jlci5hZHZhbmNlKGRvYyk7CiAgICAgICAgIGlmIChuZXdEb2MgPT0gZG9jKSB7CiAgICAgICAgICAgZmxvYXQgZnJlcSA9IHNsb3AgPT0gMCA/IHNjb3Jlci5mcmVxKCkgOiAoKFNsb3BweVBocmFzZVNjb3JlcilzY29yZXIpLnNsb3BweUZyZXEoKTsKLSAgICAgICAgICBTbG9wcHlTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zbG9wcHlTaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOworICAgICAgICAgIFNpbVNjb3JlciBkb2NTY29yZXIgPSBzaW1pbGFyaXR5LnNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7CiAgICAgICAgICAgQ29tcGxleEV4cGxhbmF0aW9uIHJlc3VsdCA9IG5ldyBDb21wbGV4RXhwbGFuYXRpb24oKTsKICAgICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oIndlaWdodCgiK2dldFF1ZXJ5KCkrIiBpbiAiK2RvYysiKSBbIiArIHNpbWlsYXJpdHkuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiXSwgcmVzdWx0IG9mOiIpOwogICAgICAgICAgIEV4cGxhbmF0aW9uIHNjb3JlRXhwbGFuYXRpb24gPSBkb2NTY29yZXIuZXhwbGFpbihkb2MsIG5ldyBFeHBsYW5hdGlvbihmcmVxLCAicGhyYXNlRnJlcT0iICsgZnJlcSkpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Nsb3BweVBocmFzZVNjb3Jlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Nsb3BweVBocmFzZVNjb3Jlci5qYXZhCmluZGV4IGE0YWQ3MmEuLjA2NjdkOGIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9TbG9wcHlQaHJhc2VTY29yZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvU2xvcHB5UGhyYXNlU2NvcmVyLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIAogICBwcml2YXRlIGZsb2F0IHNsb3BweUZyZXE7IC8vcGhyYXNlIGZyZXF1ZW5jeSBpbiBjdXJyZW50IGRvYyBhcyBjb21wdXRlZCBieSBwaHJhc2VGcmVxKCkuCiAKLSAgcHJpdmF0ZSBmaW5hbCBTaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlciBkb2NTY29yZXI7CisgIHByaXZhdGUgZmluYWwgU2ltaWxhcml0eS5TaW1TY29yZXIgZG9jU2NvcmVyOwogICAKICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2xvcDsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtUG9zdGluZ3M7CkBAIC01Miw3ICs1Miw3IEBACiAgIHByaXZhdGUgZmluYWwgbG9uZyBjb3N0OwogICAKICAgU2xvcHB5UGhyYXNlU2NvcmVyKFdlaWdodCB3ZWlnaHQsIFBocmFzZVF1ZXJ5LlBvc3RpbmdzQW5kRnJlcVtdIHBvc3RpbmdzLAotICAgICAgaW50IHNsb3AsIFNpbWlsYXJpdHkuU2xvcHB5U2ltU2NvcmVyIGRvY1Njb3JlcikgeworICAgICAgaW50IHNsb3AsIFNpbWlsYXJpdHkuU2ltU2NvcmVyIGRvY1Njb3JlcikgewogICAgIHN1cGVyKHdlaWdodCk7CiAgICAgdGhpcy5kb2NTY29yZXIgPSBkb2NTY29yZXI7CiAgICAgdGhpcy5zbG9wID0gc2xvcDsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9Tb3J0RmllbGQuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9Tb3J0RmllbGQuamF2YQppbmRleCBkMjI1MWQxLi5mNzAwMWJmIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvU29ydEZpZWxkLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1NvcnRGaWVsZC5qYXZhCkBAIC03MSwxOCArNzEsMTAgQEAKICAgICAgKiBsb3dlciB2YWx1ZXMgYXJlIGF0IHRoZSBmcm9udC4gKi8KICAgICBET1VCTEUsCiAKLSAgICAvKiogU29ydCB1c2luZyB0ZXJtIHZhbHVlcyBhcyBlbmNvZGVkIFNob3J0cy4gIFNvcnQgdmFsdWVzIGFyZSBTaG9ydCBhbmQKLSAgICAgKiBsb3dlciB2YWx1ZXMgYXJlIGF0IHRoZSBmcm9udC4gKi8KLSAgICBTSE9SVCwKLQogICAgIC8qKiBTb3J0IHVzaW5nIGEgY3VzdG9tIENvbXBhcmF0b3IuICBTb3J0IHZhbHVlcyBhcmUgYW55IENvbXBhcmFibGUgYW5kCiAgICAgICogc29ydGluZyBpcyBkb25lIGFjY29yZGluZyB0byBuYXR1cmFsIG9yZGVyLiAqLwogICAgIENVU1RPTSwKIAotICAgIC8qKiBTb3J0IHVzaW5nIHRlcm0gdmFsdWVzIGFzIGVuY29kZWQgQnl0ZXMuICBTb3J0IHZhbHVlcyBhcmUgQnl0ZSBhbmQKLSAgICAgKiBsb3dlciB2YWx1ZXMgYXJlIGF0IHRoZSBmcm9udC4gKi8KLSAgICBCWVRFLAotCiAgICAgLyoqIFNvcnQgdXNpbmcgdGVybSB2YWx1ZXMgYXMgU3RyaW5ncywgYnV0IGNvbXBhcmluZyBieQogICAgICAqIHZhbHVlICh1c2luZyBTdHJpbmcuY29tcGFyZVRvKSBmb3IgYWxsIGNvbXBhcmlzb25zLgogICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHNsb3dlciB0aGFuIHtAbGluayAjU1RSSU5HfSwgd2hpY2gKQEAgLTE2NCw4ICsxNTYsNiBAQAogICBwdWJsaWMgU29ydEZpZWxkKFN0cmluZyBmaWVsZCwgRmllbGRDYWNoZS5QYXJzZXIgcGFyc2VyLCBib29sZWFuIHJldmVyc2UpIHsKICAgICBpZiAocGFyc2VyIGluc3RhbmNlb2YgRmllbGRDYWNoZS5JbnRQYXJzZXIpIGluaXRGaWVsZFR5cGUoZmllbGQsIFR5cGUuSU5UKTsKICAgICBlbHNlIGlmIChwYXJzZXIgaW5zdGFuY2VvZiBGaWVsZENhY2hlLkZsb2F0UGFyc2VyKSBpbml0RmllbGRUeXBlKGZpZWxkLCBUeXBlLkZMT0FUKTsKLSAgICBlbHNlIGlmIChwYXJzZXIgaW5zdGFuY2VvZiBGaWVsZENhY2hlLlNob3J0UGFyc2VyKSBpbml0RmllbGRUeXBlKGZpZWxkLCBUeXBlLlNIT1JUKTsKLSAgICBlbHNlIGlmIChwYXJzZXIgaW5zdGFuY2VvZiBGaWVsZENhY2hlLkJ5dGVQYXJzZXIpIGluaXRGaWVsZFR5cGUoZmllbGQsIFR5cGUuQllURSk7CiAgICAgZWxzZSBpZiAocGFyc2VyIGluc3RhbmNlb2YgRmllbGRDYWNoZS5Mb25nUGFyc2VyKSBpbml0RmllbGRUeXBlKGZpZWxkLCBUeXBlLkxPTkcpOwogICAgIGVsc2UgaWYgKHBhcnNlciBpbnN0YW5jZW9mIEZpZWxkQ2FjaGUuRG91YmxlUGFyc2VyKSBpbml0RmllbGRUeXBlKGZpZWxkLCBUeXBlLkRPVUJMRSk7CiAgICAgZWxzZSB7CkBAIC0xNzcsNyArMTY3LDcgQEAKICAgfQogICAKICAgcHVibGljIFNvcnRGaWVsZCBzZXRNaXNzaW5nVmFsdWUoT2JqZWN0IG1pc3NpbmdWYWx1ZSkgewotICAgIGlmICh0eXBlICE9IFR5cGUuQllURSAmJiB0eXBlICE9IFR5cGUuU0hPUlQgJiYgdHlwZSAhPSBUeXBlLklOVCAmJiB0eXBlICE9IFR5cGUuRkxPQVQgJiYgdHlwZSAhPSBUeXBlLkxPTkcgJiYgdHlwZSAhPSBUeXBlLkRPVUJMRSkgeworICAgIGlmICh0eXBlICE9IFR5cGUuSU5UICYmIHR5cGUgIT0gVHlwZS5GTE9BVCAmJiB0eXBlICE9IFR5cGUuTE9ORyAmJiB0eXBlICE9IFR5cGUuRE9VQkxFKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTWlzc2luZyB2YWx1ZSBvbmx5IHdvcmtzIGZvciBudW1lcmljIHR5cGVzIiApOwogICAgIH0KICAgICB0aGlzLm1pc3NpbmdWYWx1ZSA9IG1pc3NpbmdWYWx1ZTsKQEAgLTI3NCwxNCArMjY0LDYgQEAKICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPHN0cmluZ192YWwiICsgIjogXCIiKS5hcHBlbmQoZmllbGQpLmFwcGVuZCgiXCI+Iik7CiAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIEJZVEU6Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxieXRlOiBcIiIpLmFwcGVuZChmaWVsZCkuYXBwZW5kKCJcIj4iKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgU0hPUlQ6Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxzaG9ydDogXCIiKS5hcHBlbmQoZmllbGQpLmFwcGVuZCgiXCI+Iik7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgICBjYXNlIElOVDoKICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPGludCIgKyAiOiBcIiIpLmFwcGVuZChmaWVsZCkuYXBwZW5kKCJcIj4iKTsKICAgICAgICAgYnJlYWs7CkBAIC0zODksMTIgKzM3MSw2IEBACiAgICAgY2FzZSBET1VCTEU6CiAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29tcGFyYXRvci5Eb3VibGVDb21wYXJhdG9yKG51bUhpdHMsIGZpZWxkLCBwYXJzZXIsIChEb3VibGUpIG1pc3NpbmdWYWx1ZSk7CiAKLSAgICBjYXNlIEJZVEU6Ci0gICAgICByZXR1cm4gbmV3IEZpZWxkQ29tcGFyYXRvci5CeXRlQ29tcGFyYXRvcihudW1IaXRzLCBmaWVsZCwgcGFyc2VyLCAoQnl0ZSkgbWlzc2luZ1ZhbHVlKTsKLQotICAgIGNhc2UgU0hPUlQ6Ci0gICAgICByZXR1cm4gbmV3IEZpZWxkQ29tcGFyYXRvci5TaG9ydENvbXBhcmF0b3IobnVtSGl0cywgZmllbGQsIHBhcnNlciwgKFNob3J0KSBtaXNzaW5nVmFsdWUpOwotCiAgICAgY2FzZSBDVVNUT006CiAgICAgICBhc3NlcnQgY29tcGFyYXRvclNvdXJjZSAhPSBudWxsOwogICAgICAgcmV0dXJuIGNvbXBhcmF0b3JTb3VyY2UubmV3Q29tcGFyYXRvcihmaWVsZCwgbnVtSGl0cywgc29ydFBvcywgcmV2ZXJzZSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVybVF1ZXJ5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVybVF1ZXJ5LmphdmEKaW5kZXggZmI1YmZjYy4uMDk5ZTkwYiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlcm1RdWVyeS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXJtUXVlcnkuamF2YQpAQCAtMjksNyArMjksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1TdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtc0VudW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LkV4YWN0U2ltU2NvcmVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TaW1TY29yZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQml0czsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlRvU3RyaW5nVXRpbHM7CkBAIC04NCw3ICs4NCw3IEBACiAgICAgICB9CiAgICAgICBEb2NzRW51bSBkb2NzID0gdGVybXNFbnVtLmRvY3MoYWNjZXB0RG9jcywgbnVsbCk7CiAgICAgICBhc3NlcnQgZG9jcyAhPSBudWxsOwotICAgICAgcmV0dXJuIG5ldyBUZXJtU2NvcmVyKHRoaXMsIGRvY3MsIHNpbWlsYXJpdHkuZXhhY3RTaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpKTsKKyAgICAgIHJldHVybiBuZXcgVGVybVNjb3Jlcih0aGlzLCBkb2NzLCBzaW1pbGFyaXR5LnNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICBpbnQgbmV3RG9jID0gc2NvcmVyLmFkdmFuY2UoZG9jKTsKICAgICAgICAgaWYgKG5ld0RvYyA9PSBkb2MpIHsKICAgICAgICAgICBmbG9hdCBmcmVxID0gc2NvcmVyLmZyZXEoKTsKLSAgICAgICAgICBFeGFjdFNpbVNjb3JlciBkb2NTY29yZXIgPSBzaW1pbGFyaXR5LmV4YWN0U2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KTsKKyAgICAgICAgICBTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOwogICAgICAgICAgIENvbXBsZXhFeHBsYW5hdGlvbiByZXN1bHQgPSBuZXcgQ29tcGxleEV4cGxhbmF0aW9uKCk7CiAgICAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKCJ3ZWlnaHQoIitnZXRRdWVyeSgpKyIgaW4gIitkb2MrIikgWyIgKyBzaW1pbGFyaXR5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIl0sIHJlc3VsdCBvZjoiKTsKICAgICAgICAgICBFeHBsYW5hdGlvbiBzY29yZUV4cGxhbmF0aW9uID0gZG9jU2NvcmVyLmV4cGxhaW4oZG9jLCBuZXcgRXhwbGFuYXRpb24oZnJlcSwgInRlcm1GcmVxPSIgKyBmcmVxKSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVybVNjb3Jlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlcm1TY29yZXIuamF2YQppbmRleCA3NjIzOTE0Li42Njk3NTI0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVybVNjb3Jlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXJtU2NvcmVyLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAKICAqLwogZmluYWwgY2xhc3MgVGVybVNjb3JlciBleHRlbmRzIFNjb3JlciB7CiAgIHByaXZhdGUgZmluYWwgRG9jc0VudW0gZG9jc0VudW07Ci0gIHByaXZhdGUgZmluYWwgU2ltaWxhcml0eS5FeGFjdFNpbVNjb3JlciBkb2NTY29yZXI7CisgIHByaXZhdGUgZmluYWwgU2ltaWxhcml0eS5TaW1TY29yZXIgZG9jU2NvcmVyOwogICAKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhIDxjb2RlPlRlcm1TY29yZXI8L2NvZGU+LgpAQCAtMzYsMTAgKzM2LDEwIEBACiAgICAqIEBwYXJhbSB0ZAogICAgKiAgICAgICAgICBBbiBpdGVyYXRvciBvdmVyIHRoZSBkb2N1bWVudHMgbWF0Y2hpbmcgdGhlIDxjb2RlPlRlcm08L2NvZGU+LgogICAgKiBAcGFyYW0gZG9jU2NvcmVyCi0gICAqICAgICAgICAgIFRoZSA8L2NvZGU+U2ltaWxhcml0eS5FeGFjdFNpbVNjb3JlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gCisgICAqICAgICAgICAgIFRoZSA8L2NvZGU+U2ltaWxhcml0eS5TaW1TY29yZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIAogICAgKiAgICAgICAgICB0byBiZSB1c2VkIGZvciBzY29yZSBjb21wdXRhdGlvbnMuCiAgICAqLwotICBUZXJtU2NvcmVyKFdlaWdodCB3ZWlnaHQsIERvY3NFbnVtIHRkLCBTaW1pbGFyaXR5LkV4YWN0U2ltU2NvcmVyIGRvY1Njb3JlcikgeworICBUZXJtU2NvcmVyKFdlaWdodCB3ZWlnaHQsIERvY3NFbnVtIHRkLCBTaW1pbGFyaXR5LlNpbVNjb3JlciBkb2NTY29yZXIpIHsKICAgICBzdXBlcih3ZWlnaHQpOwogICAgIHRoaXMuZG9jU2NvcmVyID0gZG9jU2NvcmVyOwogICAgIHRoaXMuZG9jc0VudW0gPSB0ZDsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYWNrYWdlLmh0bWwgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvcGFja2FnZS5odG1sCmluZGV4IDUzZWJmODcuLjRiZTVlYmEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3BhY2thZ2UuaHRtbApAQCAtNDQxLDkgKzQ0MSw4IEBACiAgICAgICAgICAgICAgICAgICBleHBsYWluKEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCwgaW50IGRvYyl9ICZtZGFzaDsgUHJvdmlkZSBhIG1lYW5zIGZvciBleHBsYWluaW5nIHdoeSBhIGdpdmVuIGRvY3VtZW50IHdhcwogICAgICAgICAgICAgICAgIHNjb3JlZCB0aGUgd2F5IGl0IHdhcy4KICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgYSB3ZWlnaHQgc3VjaCBhcyBUZXJtV2VpZ2h0Ci0gICAgICAgICAgICAgICAgdGhhdCBzY29yZXMgdmlhIGEge0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eSBTaW1pbGFyaXR5fSB3aWxsIG1ha2UgdXNlIG9mIHRoZSBTaW1pbGFyaXR5J3MgaW1wbGVtZW50YXRpb25zOgotICAgICAgICAgICAgICAgIHtAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuRXhhY3RTaW1TY29yZXIjZXhwbGFpbihpbnQsIEV4cGxhbmF0aW9uKSBFeGFjdFNpbVNjb3JlciNleHBsYWluKGludCBkb2MsIEV4cGxhbmF0aW9uIGZyZXEpfSwKLSAgICAgICAgICAgICAgICBhbmQge0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TbG9wcHlTaW1TY29yZXIjZXhwbGFpbihpbnQsIEV4cGxhbmF0aW9uKSBTbG9wcHlTaW1TY29yZXIjZXhwbGFpbihpbnQgZG9jLCBFeHBsYW5hdGlvbiBmcmVxKX0KKyAgICAgICAgICAgICAgICB0aGF0IHNjb3JlcyB2aWEgYSB7QGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5IFNpbWlsYXJpdHl9IHdpbGwgbWFrZSB1c2Ugb2YgdGhlIFNpbWlsYXJpdHkncyBpbXBsZW1lbnRhdGlvbjoKKyAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNpbVNjb3JlciNleHBsYWluKGludCwgRXhwbGFuYXRpb24pIFNpbVNjb3JlciNleHBsYWluKGludCBkb2MsIEV4cGxhbmF0aW9uIGZyZXEpfS4KICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgIDwvb2w+CkBAIC00NjgsNyArNDY3LDcgQEAKICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNjb3JlciNzY29yZSBzY29yZSgpfSAmbWRhc2g7IFJldHVybiB0aGUgc2NvcmUgb2YgdGhlCiAgICAgICAgICAgICAgICAgY3VycmVudCBkb2N1bWVudC4gVGhpcyB2YWx1ZSBjYW4gYmUgZGV0ZXJtaW5lZCBpbiBhbnkgYXBwcm9wcmlhdGUgd2F5IGZvciBhbiBhcHBsaWNhdGlvbi4gRm9yIGluc3RhbmNlLCB0aGUKICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlRlcm1TY29yZXIgVGVybVNjb3Jlcn0gc2ltcGx5IGRlZmVycyB0byB0aGUgY29uZmlndXJlZCBTaW1pbGFyaXR5OgotICAgICAgICAgICAgICAgIHtAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuRXhhY3RTaW1TY29yZXIjc2NvcmUoaW50LCBpbnQpIEV4YWN0U2ltU2NvcmVyLnNjb3JlKGludCBkb2MsIGludCBmcmVxKX0uCisgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TaW1TY29yZXIjc2NvcmUoaW50LCBmbG9hdCkgU2ltU2NvcmVyLnNjb3JlKGludCBkb2MsIGZsb2F0IGZyZXEpfS4KICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TY29yZXIjZnJlcSBmcmVxKCl9ICZtZGFzaDsgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYXlsb2Fkcy9QYXlsb2FkTmVhclF1ZXJ5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvcGF5bG9hZHMvUGF5bG9hZE5lYXJRdWVyeS5qYXZhCmluZGV4IGVmMmM2ZTUuLjMxMDM0ZWEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYXlsb2Fkcy9QYXlsb2FkTmVhclF1ZXJ5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3BheWxvYWRzL1BheWxvYWROZWFyUXVlcnkuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5XZWlnaHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5EZWZhdWx0U2ltaWxhcml0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltU2NvcmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucy5OZWFyU3BhbnNPcmRlcmVkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucy5OZWFyU3BhbnNVbm9yZGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNwYW5zLlNwYW5OZWFyUXVlcnk7CkBAIC01Myw3ICs1Myw3IEBACiAgKiA8cC8+CiAgKiBQYXlsb2FkIHNjb3JlcyBhcmUgYWdncmVnYXRlZCB1c2luZyBhIHBsdWdnYWJsZSB7QGxpbmsgUGF5bG9hZEZ1bmN0aW9ufS4KICAqIAotICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2xvcHB5U2ltU2NvcmVyI2NvbXB1dGVQYXlsb2FkRmFjdG9yKGludCwgaW50LCBpbnQsIEJ5dGVzUmVmKQorICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltU2NvcmVyI2NvbXB1dGVQYXlsb2FkRmFjdG9yKGludCwgaW50LCBpbnQsIEJ5dGVzUmVmKQogICovCiBwdWJsaWMgY2xhc3MgUGF5bG9hZE5lYXJRdWVyeSBleHRlbmRzIFNwYW5OZWFyUXVlcnkgewogICBwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIHB1YmxpYyBTY29yZXIgc2NvcmVyKEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBzY29yZURvY3NJbk9yZGVyLAogICAgICAgICBib29sZWFuIHRvcFNjb3JlciwgQml0cyBhY2NlcHREb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgcmV0dXJuIG5ldyBQYXlsb2FkTmVhclNwYW5TY29yZXIocXVlcnkuZ2V0U3BhbnMoY29udGV4dCwgYWNjZXB0RG9jcywgdGVybUNvbnRleHRzKSwgdGhpcywKLSAgICAgICAgICBzaW1pbGFyaXR5LCBzaW1pbGFyaXR5LnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOworICAgICAgICAgIHNpbWlsYXJpdHksIHNpbWlsYXJpdHkuc2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KSk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIGludCBuZXdEb2MgPSBzY29yZXIuYWR2YW5jZShkb2MpOwogICAgICAgICBpZiAobmV3RG9jID09IGRvYykgewogICAgICAgICAgIGZsb2F0IGZyZXEgPSBzY29yZXIuZnJlcSgpOwotICAgICAgICAgIFNsb3BweVNpbVNjb3JlciBkb2NTY29yZXIgPSBzaW1pbGFyaXR5LnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7CisgICAgICAgICAgU2ltU2NvcmVyIGRvY1Njb3JlciA9IHNpbWlsYXJpdHkuc2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KTsKICAgICAgICAgICBFeHBsYW5hdGlvbiBleHBsID0gbmV3IEV4cGxhbmF0aW9uKCk7CiAgICAgICAgICAgZXhwbC5zZXREZXNjcmlwdGlvbigid2VpZ2h0KCIrZ2V0UXVlcnkoKSsiIGluICIrZG9jKyIpIFsiICsgc2ltaWxhcml0eS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICJdLCByZXN1bHQgb2Y6Iik7CiAgICAgICAgICAgRXhwbGFuYXRpb24gc2NvcmVFeHBsYW5hdGlvbiA9IGRvY1Njb3Jlci5leHBsYWluKGRvYywgbmV3IEV4cGxhbmF0aW9uKGZyZXEsICJwaHJhc2VGcmVxPSIgKyBmcmVxKSk7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICBwcml2YXRlIGludCBwYXlsb2Fkc1NlZW47CiAKICAgICBwcm90ZWN0ZWQgUGF5bG9hZE5lYXJTcGFuU2NvcmVyKFNwYW5zIHNwYW5zLCBXZWlnaHQgd2VpZ2h0LAotICAgICAgICBTaW1pbGFyaXR5IHNpbWlsYXJpdHksIFNpbWlsYXJpdHkuU2xvcHB5U2ltU2NvcmVyIGRvY1Njb3JlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltaWxhcml0eSBzaW1pbGFyaXR5LCBTaW1pbGFyaXR5LlNpbVNjb3JlciBkb2NTY29yZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICBzdXBlcihzcGFucywgd2VpZ2h0LCBkb2NTY29yZXIpOwogICAgICAgdGhpcy5zcGFucyA9IHNwYW5zOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYXlsb2Fkcy9QYXlsb2FkVGVybVF1ZXJ5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvcGF5bG9hZHMvUGF5bG9hZFRlcm1RdWVyeS5qYXZhCmluZGV4IGNhYjU1ZGYuLmIyNjM5OTkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wYXlsb2Fkcy9QYXlsb2FkVGVybVF1ZXJ5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3BheWxvYWRzL1BheWxvYWRUZXJtUXVlcnkuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Db21wbGV4RXhwbGFuYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5EZWZhdWx0U2ltaWxhcml0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltU2NvcmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucy5TcGFuUXVlcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNwYW5zLlRlcm1TcGFuczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc3BhbnMuU3BhblRlcm1RdWVyeTsKQEAgLTQ5LDcgKzQ5LDcgQEAKICAqIHdoaWNoIHJldHVybnMgMSBieSBkZWZhdWx0LgogICogPHAvPgogICogUGF5bG9hZCBzY29yZXMgYXJlIGFnZ3JlZ2F0ZWQgdXNpbmcgYSBwbHVnZ2FibGUge0BsaW5rIFBheWxvYWRGdW5jdGlvbn0uCi0gKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TbG9wcHlTaW1TY29yZXIjY29tcHV0ZVBheWxvYWRGYWN0b3IoaW50LCBpbnQsIGludCwgQnl0ZXNSZWYpCisgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuU2ltaWxhcml0eS5TaW1TY29yZXIjY29tcHV0ZVBheWxvYWRGYWN0b3IoaW50LCBpbnQsIGludCwgQnl0ZXNSZWYpCiAgKiovCiBwdWJsaWMgY2xhc3MgUGF5bG9hZFRlcm1RdWVyeSBleHRlbmRzIFNwYW5UZXJtUXVlcnkgewogICBwcm90ZWN0ZWQgUGF5bG9hZEZ1bmN0aW9uIGZ1bmN0aW9uOwpAQCAtODIsNyArODIsNyBAQAogICAgIHB1YmxpYyBTY29yZXIgc2NvcmVyKEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBzY29yZURvY3NJbk9yZGVyLAogICAgICAgICBib29sZWFuIHRvcFNjb3JlciwgQml0cyBhY2NlcHREb2NzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgcmV0dXJuIG5ldyBQYXlsb2FkVGVybVNwYW5TY29yZXIoKFRlcm1TcGFucykgcXVlcnkuZ2V0U3BhbnMoY29udGV4dCwgYWNjZXB0RG9jcywgdGVybUNvbnRleHRzKSwKLSAgICAgICAgICB0aGlzLCBzaW1pbGFyaXR5LnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOworICAgICAgICAgIHRoaXMsIHNpbWlsYXJpdHkuc2ltU2NvcmVyKHN0YXRzLCBjb250ZXh0KSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGNsYXNzIFBheWxvYWRUZXJtU3BhblNjb3JlciBleHRlbmRzIFNwYW5TY29yZXIgewpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgcHJvdGVjdGVkIGludCBwYXlsb2Fkc1NlZW47CiAgICAgICBwcml2YXRlIGZpbmFsIFRlcm1TcGFucyB0ZXJtU3BhbnM7CiAKLSAgICAgIHB1YmxpYyBQYXlsb2FkVGVybVNwYW5TY29yZXIoVGVybVNwYW5zIHNwYW5zLCBXZWlnaHQgd2VpZ2h0LCBTaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlciBkb2NTY29yZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBwdWJsaWMgUGF5bG9hZFRlcm1TcGFuU2NvcmVyKFRlcm1TcGFucyBzcGFucywgV2VpZ2h0IHdlaWdodCwgU2ltaWxhcml0eS5TaW1TY29yZXIgZG9jU2NvcmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihzcGFucywgd2VpZ2h0LCBkb2NTY29yZXIpOwogICAgICAgICB0ZXJtU3BhbnMgPSBzcGFuczsKICAgICAgIH0KQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAgICBpbnQgbmV3RG9jID0gc2NvcmVyLmFkdmFuY2UoZG9jKTsKICAgICAgICAgaWYgKG5ld0RvYyA9PSBkb2MpIHsKICAgICAgICAgICBmbG9hdCBmcmVxID0gc2NvcmVyLnNsb3BweUZyZXEoKTsKLSAgICAgICAgICBTbG9wcHlTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zbG9wcHlTaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOworICAgICAgICAgIFNpbVNjb3JlciBkb2NTY29yZXIgPSBzaW1pbGFyaXR5LnNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7CiAgICAgICAgICAgRXhwbGFuYXRpb24gZXhwbCA9IG5ldyBFeHBsYW5hdGlvbigpOwogICAgICAgICAgIGV4cGwuc2V0RGVzY3JpcHRpb24oIndlaWdodCgiK2dldFF1ZXJ5KCkrIiBpbiAiK2RvYysiKSBbIiArIHNpbWlsYXJpdHkuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiXSwgcmVzdWx0IG9mOiIpOwogICAgICAgICAgIEV4cGxhbmF0aW9uIHNjb3JlRXhwbGFuYXRpb24gPSBkb2NTY29yZXIuZXhwbGFpbihkb2MsIG5ldyBFeHBsYW5hdGlvbihmcmVxLCAicGhyYXNlRnJlcT0iICsgZnJlcSkpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9CTTI1U2ltaWxhcml0eS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9CTTI1U2ltaWxhcml0eS5qYXZhCmluZGV4IGU2MTJhYTQuLmQwNjIwMTUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvQk0yNVNpbWlsYXJpdHkuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL0JNMjVTaW1pbGFyaXR5LmphdmEKQEAgLTIxMiw4MCArMjEyLDE4IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIEV4YWN0U2ltU2NvcmVyIGV4YWN0U2ltU2NvcmVyKFNpbVdlaWdodCBzdGF0cywgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgZmluYWwgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgc3RhdHMsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBCTTI1U3RhdHMgYm0yNXN0YXRzID0gKEJNMjVTdGF0cykgc3RhdHM7Ci0gICAgZmluYWwgTnVtZXJpY0RvY1ZhbHVlcyBub3JtcyA9IGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhibTI1c3RhdHMuZmllbGQpOwotICAgIHJldHVybiBub3JtcyA9PSBudWxsIAotICAgICAgPyBuZXcgRXhhY3RCTTI1RG9jU2NvcmVyTm9Ob3JtcyhibTI1c3RhdHMpCi0gICAgICA6IG5ldyBFeGFjdEJNMjVEb2NTY29yZXIoYm0yNXN0YXRzLCBub3Jtcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFNsb3BweVNpbVNjb3JlciBzbG9wcHlTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQk0yNVN0YXRzIGJtMjVzdGF0cyA9IChCTTI1U3RhdHMpIHN0YXRzOwotICAgIHJldHVybiBuZXcgU2xvcHB5Qk0yNURvY1Njb3JlcihibTI1c3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhibTI1c3RhdHMuZmllbGQpKTsKKyAgICByZXR1cm4gbmV3IEJNMjVEb2NTY29yZXIoYm0yNXN0YXRzLCBjb250ZXh0LnJlYWRlcigpLmdldE5vcm1WYWx1ZXMoYm0yNXN0YXRzLmZpZWxkKSk7CiAgIH0KICAgCi0gIHByaXZhdGUgY2xhc3MgRXhhY3RCTTI1RG9jU2NvcmVyIGV4dGVuZHMgRXhhY3RTaW1TY29yZXIgewotICAgIHByaXZhdGUgZmluYWwgQk0yNVN0YXRzIHN0YXRzOwotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgd2VpZ2h0VmFsdWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zOwotICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBjYWNoZTsKLSAgICAKLSAgICBFeGFjdEJNMjVEb2NTY29yZXIoQk0yNVN0YXRzIHN0YXRzLCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgYXNzZXJ0IG5vcm1zICE9IG51bGw7Ci0gICAgICB0aGlzLnN0YXRzID0gc3RhdHM7Ci0gICAgICB0aGlzLndlaWdodFZhbHVlID0gc3RhdHMud2VpZ2h0ICogKGsxICsgMSk7IC8vIGJvb3N0ICogaWRmICogKGsxICsgMSkKLSAgICAgIHRoaXMuY2FjaGUgPSBzdGF0cy5jYWNoZTsKLSAgICAgIHRoaXMubm9ybXMgPSBub3JtczsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IHNjb3JlKGludCBkb2MsIGludCBmcmVxKSB7Ci0gICAgICByZXR1cm4gd2VpZ2h0VmFsdWUgKiBmcmVxIC8gKGZyZXEgKyBjYWNoZVsoYnl0ZSlub3Jtcy5nZXQoZG9jKSAmIDB4RkZdKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cGxhbmF0aW9uIGV4cGxhaW4oaW50IGRvYywgRXhwbGFuYXRpb24gZnJlcSkgewotICAgICAgcmV0dXJuIGV4cGxhaW5TY29yZShkb2MsIGZyZXEsIHN0YXRzLCBub3Jtcyk7Ci0gICAgfQotICB9Ci0gIAotICAvKiogdGhlcmUgYXJlIG5vIG5vcm1zLCB3ZSBhY3QgYXMgaWYgYj0wICovCi0gIHByaXZhdGUgY2xhc3MgRXhhY3RCTTI1RG9jU2NvcmVyTm9Ob3JtcyBleHRlbmRzIEV4YWN0U2ltU2NvcmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEJNMjVTdGF0cyBzdGF0czsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IHdlaWdodFZhbHVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ09SRV9DQUNIRV9TSVpFID0gMzI7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIHNjb3JlQ2FjaGUgPSBuZXcgZmxvYXRbU0NPUkVfQ0FDSEVfU0laRV07Ci0KLSAgICBFeGFjdEJNMjVEb2NTY29yZXJOb05vcm1zKEJNMjVTdGF0cyBzdGF0cykgewotICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOwotICAgICAgdGhpcy53ZWlnaHRWYWx1ZSA9IHN0YXRzLndlaWdodCAqIChrMSArIDEpOyAvLyBib29zdCAqIGlkZiAqIChrMSArIDEpCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNDT1JFX0NBQ0hFX1NJWkU7IGkrKykKLSAgICAgICAgc2NvcmVDYWNoZVtpXSA9IHdlaWdodFZhbHVlICogaSAvIChpICsgazEpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgc2NvcmUoaW50IGRvYywgaW50IGZyZXEpIHsKLSAgICAgIC8vIFRPRE86IG1heWJlIHNjb3JlIGNhY2hlIGlzIG1vcmUgdHJvdWJsZSB0aGFuIGl0cyB3b3J0aD8KLSAgICAgIHJldHVybiBmcmVxIDwgU0NPUkVfQ0FDSEVfU0laRSAgICAgICAgLy8gY2hlY2sgY2FjaGUKLSAgICAgICAgPyBzY29yZUNhY2hlW2ZyZXFdICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0Ci0gICAgICAgIDogd2VpZ2h0VmFsdWUgKiBmcmVxIC8gKGZyZXEgKyBrMSk7IC8vIGNhY2hlIG1pc3MKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cGxhbmF0aW9uIGV4cGxhaW4oaW50IGRvYywgRXhwbGFuYXRpb24gZnJlcSkgewotICAgICAgcmV0dXJuIGV4cGxhaW5TY29yZShkb2MsIGZyZXEsIHN0YXRzLCBudWxsKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU2xvcHB5Qk0yNURvY1Njb3JlciBleHRlbmRzIFNsb3BweVNpbVNjb3JlciB7CisgIHByaXZhdGUgY2xhc3MgQk0yNURvY1Njb3JlciBleHRlbmRzIFNpbVNjb3JlciB7CiAgICAgcHJpdmF0ZSBmaW5hbCBCTTI1U3RhdHMgc3RhdHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCB3ZWlnaHRWYWx1ZTsgLy8gYm9vc3QgKiBpZGYgKiAoazEgKyAxKQogICAgIHByaXZhdGUgZmluYWwgTnVtZXJpY0RvY1ZhbHVlcyBub3JtczsKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gY2FjaGU7CiAgICAgCi0gICAgU2xvcHB5Qk0yNURvY1Njb3JlcihCTTI1U3RhdHMgc3RhdHMsIE51bWVyaWNEb2NWYWx1ZXMgbm9ybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQk0yNURvY1Njb3JlcihCTTI1U3RhdHMgc3RhdHMsIE51bWVyaWNEb2NWYWx1ZXMgbm9ybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CiAgICAgICB0aGlzLndlaWdodFZhbHVlID0gc3RhdHMud2VpZ2h0ICogKGsxICsgMSk7CiAgICAgICB0aGlzLmNhY2hlID0gc3RhdHMuY2FjaGU7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL0RlZmF1bHRTaW1pbGFyaXR5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL0RlZmF1bHRTaW1pbGFyaXR5LmphdmEKaW5kZXggMzU1Y2FmZS4uOGYyYjA3MiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9EZWZhdWx0U2ltaWxhcml0eS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvRGVmYXVsdFNpbWlsYXJpdHkuamF2YQpAQCAtMTksMTAgKzE5LDQwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5GaWVsZEludmVydFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5TbWFsbEZsb2F0OwogCi0vKiogRXhwZXJ0OiBEZWZhdWx0IHNjb3JpbmcgaW1wbGVtZW50YXRpb24uICovCisvKioKKyAqIEV4cGVydDogRGVmYXVsdCBzY29yaW5nIGltcGxlbWVudGF0aW9uIHdoaWNoIHtAbGluayAjZW5jb2RlTm9ybVZhbHVlKGZsb2F0KQorICogZW5jb2Rlc30gbm9ybSB2YWx1ZXMgYXMgYSBzaW5nbGUgYnl0ZSBiZWZvcmUgYmVpbmcgc3RvcmVkLiBBdCBzZWFyY2ggdGltZSwKKyAqIHRoZSBub3JtIGJ5dGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBpbmRleAorICoge0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeSBkaXJlY3Rvcnl9IGFuZAorICoge0BsaW5rICNkZWNvZGVOb3JtVmFsdWUobG9uZykgZGVjb2RlZH0gYmFjayB0byBhIGZsb2F0IDxpPm5vcm08L2k+IHZhbHVlLgorICogVGhpcyBlbmNvZGluZy9kZWNvZGluZywgd2hpbGUgcmVkdWNpbmcgaW5kZXggc2l6ZSwgY29tZXMgd2l0aCB0aGUgcHJpY2Ugb2YKKyAqIHByZWNpc2lvbiBsb3NzIC0gaXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCA8aT5kZWNvZGUoZW5jb2RlKHgpKSA9IHg8L2k+LiBGb3IKKyAqIGluc3RhbmNlLCA8aT5kZWNvZGUoZW5jb2RlKDAuODkpKSA9IDAuNzU8L2k+LgorICogPHA+CisgKiBDb21wcmVzc2lvbiBvZiBub3JtIHZhbHVlcyB0byBhIHNpbmdsZSBieXRlIHNhdmVzIG1lbW9yeSBhdCBzZWFyY2ggdGltZSwKKyAqIGJlY2F1c2Ugb25jZSBhIGZpZWxkIGlzIHJlZmVyZW5jZWQgYXQgc2VhcmNoIHRpbWUsIGl0cyBub3JtcyAtIGZvciBhbGwKKyAqIGRvY3VtZW50cyAtIGFyZSBtYWludGFpbmVkIGluIG1lbW9yeS4KKyAqIDxwPgorICogVGhlIHJhdGlvbmFsZSBzdXBwb3J0aW5nIHN1Y2ggbG9zc3kgY29tcHJlc3Npb24gb2Ygbm9ybSB2YWx1ZXMgaXMgdGhhdCBnaXZlbgorICogdGhlIGRpZmZpY3VsdHkgKGFuZCBpbmFjY3VyYWN5KSBvZiB1c2VycyB0byBleHByZXNzIHRoZWlyIHRydWUgaW5mb3JtYXRpb24KKyAqIG5lZWQgYnkgYSBxdWVyeSwgb25seSBiaWcgZGlmZmVyZW5jZXMgbWF0dGVyLiA8YnI+CisgKiAmbmJzcDs8YnI+CisgKiBMYXN0LCBub3RlIHRoYXQgc2VhcmNoIHRpbWUgaXMgdG9vIGxhdGUgdG8gbW9kaWZ5IHRoaXMgPGk+bm9ybTwvaT4gcGFydCBvZgorICogc2NvcmluZywgZS5nLiBieSB1c2luZyBhIGRpZmZlcmVudCB7QGxpbmsgU2ltaWxhcml0eX0gZm9yIHNlYXJjaC4KKyAqLwogcHVibGljIGNsYXNzIERlZmF1bHRTaW1pbGFyaXR5IGV4dGVuZHMgVEZJREZTaW1pbGFyaXR5IHsKICAgCisgIC8qKiBDYWNoZSBvZiBkZWNvZGVkIGJ5dGVzLiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdFtdIE5PUk1fVEFCTEUgPSBuZXcgZmxvYXRbMjU2XTsKKworICBzdGF0aWMgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIE5PUk1fVEFCTEVbaV0gPSBTbWFsbEZsb2F0LmJ5dGUzMTVUb0Zsb2F0KChieXRlKWkpOworICAgIH0KKyAgfQorCiAgIC8qKiBTb2xlIGNvbnN0cnVjdG9yOiBwYXJhbWV0ZXItZnJlZSAqLwogICBwdWJsaWMgRGVmYXVsdFNpbWlsYXJpdHkoKSB7fQogICAKQEAgLTM4LDYgKzY4LDM1IEBACiAgICAgcmV0dXJuIChmbG9hdCkoMS4wIC8gTWF0aC5zcXJ0KHN1bU9mU3F1YXJlZFdlaWdodHMpKTsKICAgfQogICAKKyAgLyoqCisgICAqIEVuY29kZXMgYSBub3JtYWxpemF0aW9uIGZhY3RvciBmb3Igc3RvcmFnZSBpbiBhbiBpbmRleC4KKyAgICogPHA+CisgICAqIFRoZSBlbmNvZGluZyB1c2VzIGEgdGhyZWUtYml0IG1hbnRpc3NhLCBhIGZpdmUtYml0IGV4cG9uZW50LCBhbmQgdGhlCisgICAqIHplcm8tZXhwb25lbnQgcG9pbnQgYXQgMTUsIHRodXMgcmVwcmVzZW50aW5nIHZhbHVlcyBmcm9tIGFyb3VuZCA3eDEwXjkgdG8KKyAgICogMngxMF4tOSB3aXRoIGFib3V0IG9uZSBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0IG9mIGFjY3VyYWN5LiBaZXJvIGlzIGFsc28KKyAgICogcmVwcmVzZW50ZWQuIE5lZ2F0aXZlIG51bWJlcnMgYXJlIHJvdW5kZWQgdXAgdG8gemVyby4gVmFsdWVzIHRvbyBsYXJnZSB0bworICAgKiByZXByZXNlbnQgYXJlIHJvdW5kZWQgZG93biB0byB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHZhbHVlLiBQb3NpdGl2ZQorICAgKiB2YWx1ZXMgdG9vIHNtYWxsIHRvIHJlcHJlc2VudCBhcmUgcm91bmRlZCB1cCB0byB0aGUgc21hbGxlc3QgcG9zaXRpdmUKKyAgICogcmVwcmVzZW50YWJsZSB2YWx1ZS4KKyAgICogCisgICAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQjc2V0Qm9vc3QoZmxvYXQpCisgICAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5TbWFsbEZsb2F0CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIGxvbmcgZW5jb2RlTm9ybVZhbHVlKGZsb2F0IGYpIHsKKyAgICByZXR1cm4gU21hbGxGbG9hdC5mbG9hdFRvQnl0ZTMxNShmKTsKKyAgfQorCisgIC8qKgorICAgKiBEZWNvZGVzIHRoZSBub3JtIHZhbHVlLCBhc3N1bWluZyBpdCBpcyBhIHNpbmdsZSBieXRlLgorICAgKiAKKyAgICogQHNlZSAjZW5jb2RlTm9ybVZhbHVlKGZsb2F0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmaW5hbCBmbG9hdCBkZWNvZGVOb3JtVmFsdWUobG9uZyBub3JtKSB7CisgICAgcmV0dXJuIE5PUk1fVEFCTEVbKGludCkgKG5vcm0gJiAweEZGKV07ICAvLyAmIDB4RkYgbWFwcyBuZWdhdGl2ZSBieXRlcyB0byBwb3NpdGl2ZSBhYm92ZSAxMjcKKyAgfQorCiAgIC8qKiBJbXBsZW1lbnRlZCBhcwogICAgKiAgPGNvZGU+c3RhdGUuZ2V0Qm9vc3QoKSpsZW5ndGhOb3JtKG51bVRlcm1zKTwvY29kZT4sIHdoZXJlCiAgICAqICA8Y29kZT5udW1UZXJtczwvY29kZT4gaXMge0BsaW5rIEZpZWxkSW52ZXJ0U3RhdGUjZ2V0TGVuZ3RoKCl9IGlmIHtAbGluawpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9NdWx0aVNpbWlsYXJpdHkuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvTXVsdGlTaW1pbGFyaXR5LmphdmEKaW5kZXggMjhjNmQ4MC4uNTA3YzU2OCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9NdWx0aVNpbWlsYXJpdHkuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL011bHRpU2ltaWxhcml0eS5qYXZhCkBAIC01Nyw2MCArNTcsMjUgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgRXhhY3RTaW1TY29yZXIgZXhhY3RTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgRXhhY3RTaW1TY29yZXIgc3ViU2NvcmVyc1tdID0gbmV3IEV4YWN0U2ltU2NvcmVyW3NpbXMubGVuZ3RoXTsKKyAgcHVibGljIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2ltU2NvcmVyIHN1YlNjb3JlcnNbXSA9IG5ldyBTaW1TY29yZXJbc2ltcy5sZW5ndGhdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViU2NvcmVycy5sZW5ndGg7IGkrKykgewotICAgICAgc3ViU2NvcmVyc1tpXSA9IHNpbXNbaV0uZXhhY3RTaW1TY29yZXIoKChNdWx0aVN0YXRzKXN0YXRzKS5zdWJTdGF0c1tpXSwgY29udGV4dCk7CisgICAgICBzdWJTY29yZXJzW2ldID0gc2ltc1tpXS5zaW1TY29yZXIoKChNdWx0aVN0YXRzKXN0YXRzKS5zdWJTdGF0c1tpXSwgY29udGV4dCk7CiAgICAgfQotICAgIHJldHVybiBuZXcgTXVsdGlFeGFjdERvY1Njb3JlcihzdWJTY29yZXJzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU2xvcHB5U2ltU2NvcmVyIHNsb3BweVNpbVNjb3JlcihTaW1XZWlnaHQgc3RhdHMsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTbG9wcHlTaW1TY29yZXIgc3ViU2NvcmVyc1tdID0gbmV3IFNsb3BweVNpbVNjb3JlcltzaW1zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJTY29yZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBzdWJTY29yZXJzW2ldID0gc2ltc1tpXS5zbG9wcHlTaW1TY29yZXIoKChNdWx0aVN0YXRzKXN0YXRzKS5zdWJTdGF0c1tpXSwgY29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgTXVsdGlTbG9wcHlEb2NTY29yZXIoc3ViU2NvcmVycyk7CisgICAgcmV0dXJuIG5ldyBNdWx0aVNpbVNjb3JlcihzdWJTY29yZXJzKTsKICAgfQogICAKLSAgc3RhdGljIGNsYXNzIE11bHRpRXhhY3REb2NTY29yZXIgZXh0ZW5kcyBFeGFjdFNpbVNjb3JlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGFjdFNpbVNjb3JlciBzdWJTY29yZXJzW107CisgIHN0YXRpYyBjbGFzcyBNdWx0aVNpbVNjb3JlciBleHRlbmRzIFNpbVNjb3JlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTaW1TY29yZXIgc3ViU2NvcmVyc1tdOwogICAgIAotICAgIE11bHRpRXhhY3REb2NTY29yZXIoRXhhY3RTaW1TY29yZXIgc3ViU2NvcmVyc1tdKSB7Ci0gICAgICB0aGlzLnN1YlNjb3JlcnMgPSBzdWJTY29yZXJzOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgc2NvcmUoaW50IGRvYywgaW50IGZyZXEpIHsKLSAgICAgIGZsb2F0IHN1bSA9IDAuMGY7Ci0gICAgICBmb3IgKEV4YWN0U2ltU2NvcmVyIHN1YlNjb3JlciA6IHN1YlNjb3JlcnMpIHsKLSAgICAgICAgc3VtICs9IHN1YlNjb3Jlci5zY29yZShkb2MsIGZyZXEpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN1bTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhwbGFuYXRpb24gZXhwbGFpbihpbnQgZG9jLCBFeHBsYW5hdGlvbiBmcmVxKSB7Ci0gICAgICBFeHBsYW5hdGlvbiBleHBsID0gbmV3IEV4cGxhbmF0aW9uKHNjb3JlKGRvYywgKGludClmcmVxLmdldFZhbHVlKCkpLCAic3VtIG9mOiIpOwotICAgICAgZm9yIChFeGFjdFNpbVNjb3JlciBzdWJTY29yZXIgOiBzdWJTY29yZXJzKSB7Ci0gICAgICAgIGV4cGwuYWRkRGV0YWlsKHN1YlNjb3Jlci5leHBsYWluKGRvYywgZnJlcSkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGV4cGw7Ci0gICAgfQotICB9Ci0gIAotICBzdGF0aWMgY2xhc3MgTXVsdGlTbG9wcHlEb2NTY29yZXIgZXh0ZW5kcyBTbG9wcHlTaW1TY29yZXIgewotICAgIHByaXZhdGUgZmluYWwgU2xvcHB5U2ltU2NvcmVyIHN1YlNjb3JlcnNbXTsKLSAgICAKLSAgICBNdWx0aVNsb3BweURvY1Njb3JlcihTbG9wcHlTaW1TY29yZXIgc3ViU2NvcmVyc1tdKSB7CisgICAgTXVsdGlTaW1TY29yZXIoU2ltU2NvcmVyIHN1YlNjb3JlcnNbXSkgewogICAgICAgdGhpcy5zdWJTY29yZXJzID0gc3ViU2NvcmVyczsKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IHNjb3JlKGludCBkb2MsIGZsb2F0IGZyZXEpIHsKICAgICAgIGZsb2F0IHN1bSA9IDAuMGY7Ci0gICAgICBmb3IgKFNsb3BweVNpbVNjb3JlciBzdWJTY29yZXIgOiBzdWJTY29yZXJzKSB7CisgICAgICBmb3IgKFNpbVNjb3JlciBzdWJTY29yZXIgOiBzdWJTY29yZXJzKSB7CiAgICAgICAgIHN1bSArPSBzdWJTY29yZXIuc2NvcmUoZG9jLCBmcmVxKTsKICAgICAgIH0KICAgICAgIHJldHVybiBzdW07CkBAIC0xMTksNyArODQsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFeHBsYW5hdGlvbiBleHBsYWluKGludCBkb2MsIEV4cGxhbmF0aW9uIGZyZXEpIHsKICAgICAgIEV4cGxhbmF0aW9uIGV4cGwgPSBuZXcgRXhwbGFuYXRpb24oc2NvcmUoZG9jLCBmcmVxLmdldFZhbHVlKCkpLCAic3VtIG9mOiIpOwotICAgICAgZm9yIChTbG9wcHlTaW1TY29yZXIgc3ViU2NvcmVyIDogc3ViU2NvcmVycykgeworICAgICAgZm9yIChTaW1TY29yZXIgc3ViU2NvcmVyIDogc3ViU2NvcmVycykgewogICAgICAgICBleHBsLmFkZERldGFpbChzdWJTY29yZXIuZXhwbGFpbihkb2MsIGZyZXEpKTsKICAgICAgIH0KICAgICAgIHJldHVybiBleHBsOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9QZXJGaWVsZFNpbWlsYXJpdHlXcmFwcGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1BlckZpZWxkU2ltaWxhcml0eVdyYXBwZXIuamF2YQppbmRleCA3ODU2YmU5Li4xN2E0NjFlIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1BlckZpZWxkU2ltaWxhcml0eVdyYXBwZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1BlckZpZWxkU2ltaWxhcml0eVdyYXBwZXIuamF2YQpAQCAtNTQsMTUgKzU0LDkgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgRXhhY3RTaW1TY29yZXIgZXhhY3RTaW1TY29yZXIoU2ltV2VpZ2h0IHdlaWdodCwgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgZmluYWwgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgUGVyRmllbGRTaW1XZWlnaHQgcGVyRmllbGRXZWlnaHQgPSAoUGVyRmllbGRTaW1XZWlnaHQpIHdlaWdodDsKLSAgICByZXR1cm4gcGVyRmllbGRXZWlnaHQuZGVsZWdhdGUuZXhhY3RTaW1TY29yZXIocGVyRmllbGRXZWlnaHQuZGVsZWdhdGVXZWlnaHQsIGNvbnRleHQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBTbG9wcHlTaW1TY29yZXIgc2xvcHB5U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBQZXJGaWVsZFNpbVdlaWdodCBwZXJGaWVsZFdlaWdodCA9IChQZXJGaWVsZFNpbVdlaWdodCkgd2VpZ2h0OwotICAgIHJldHVybiBwZXJGaWVsZFdlaWdodC5kZWxlZ2F0ZS5zbG9wcHlTaW1TY29yZXIocGVyRmllbGRXZWlnaHQuZGVsZWdhdGVXZWlnaHQsIGNvbnRleHQpOworICAgIHJldHVybiBwZXJGaWVsZFdlaWdodC5kZWxlZ2F0ZS5zaW1TY29yZXIocGVyRmllbGRXZWlnaHQuZGVsZWdhdGVXZWlnaHQsIGNvbnRleHQpOwogICB9CiAgIAogICAvKiogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1NpbWlsYXJpdHkuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvU2ltaWxhcml0eS5qYXZhCmluZGV4IDE2NDM1ZTUuLmI0ZmY4YmIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvU2ltaWxhcml0eS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvU2ltaWxhcml0eS5qYXZhCkBAIC04OCwxMCArODgsOCBAQAogICogICAgICAgaXMgY2FsbGVkIGZvciBlYWNoIHF1ZXJ5IGxlYWYgbm9kZSwge0BsaW5rIFNpbWlsYXJpdHkjcXVlcnlOb3JtKGZsb2F0KX0gaXMgY2FsbGVkIGZvciB0aGUgdG9wLWxldmVsCiAgKiAgICAgICBxdWVyeSwgYW5kIGZpbmFsbHkge0BsaW5rIFNpbWlsYXJpdHkuU2ltV2VpZ2h0I25vcm1hbGl6ZShmbG9hdCwgZmxvYXQpfSBwYXNzZXMgZG93biB0aGUgbm9ybWFsaXphdGlvbiB2YWx1ZQogICogICAgICAgYW5kIGFueSB0b3AtbGV2ZWwgYm9vc3RzIChlLmcuIGZyb20gZW5jbG9zaW5nIHtAbGluayBCb29sZWFuUXVlcnl9cykuCi0gKiAgIDxsaT5Gb3IgZWFjaCBzZWdtZW50IGluIHRoZSBpbmRleCwgdGhlIFF1ZXJ5IGNyZWF0ZXMgYSB7QGxpbmsgI2V4YWN0U2ltU2NvcmVyKFNpbVdlaWdodCwgQXRvbWljUmVhZGVyQ29udGV4dCl9Ci0gKiAgICAgICAoZm9yIHF1ZXJpZXMgd2l0aCBleGFjdCBmcmVxdWVuY2llcyBzdWNoIGFzIFRlcm1RdWVyeXMgYW5kIGV4YWN0IFBocmFzZVF1ZXJpZXMpIG9yIGEgCi0gKiAgICAgICB7QGxpbmsgI3Nsb3BweVNpbVNjb3JlcihTaW1XZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQpfSAoZm9yIHF1ZXJpZXMgd2l0aCBzbG9wcHkgZnJlcXVlbmNpZXMgc3VjaCBhcwotICogICAgICAgU3BhblF1ZXJ5cyBhbmQgc2xvcHB5IFBocmFzZVF1ZXJpZXMpLiBUaGUgc2NvcmUoKSBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIG1hdGNoaW5nIGRvY3VtZW50LgorICogICA8bGk+Rm9yIGVhY2ggc2VnbWVudCBpbiB0aGUgaW5kZXgsIHRoZSBRdWVyeSBjcmVhdGVzIGEge0BsaW5rICNzaW1TY29yZXIoU2ltV2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0KX0KKyAqICAgICAgIFRoZSBzY29yZSgpIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGVhY2ggbWF0Y2hpbmcgZG9jdW1lbnQuCiAgKiA8L29sPgogICogPHA+CiAgKiA8YSBuYW1lPSJleHBsYWludGltZSIvPgpAQCAtMTY2LDc2ICsxNjQsMzEgQEAKICAgICogQHJldHVybiBTaW1XZWlnaHQgb2JqZWN0IHdpdGggdGhlIGluZm9ybWF0aW9uIHRoaXMgU2ltaWxhcml0eSBuZWVkcyB0byBzY29yZSBhIHF1ZXJ5LgogICAgKi8KICAgcHVibGljIGFic3RyYWN0IFNpbVdlaWdodCBjb21wdXRlV2VpZ2h0KGZsb2F0IHF1ZXJ5Qm9vc3QsIENvbGxlY3Rpb25TdGF0aXN0aWNzIGNvbGxlY3Rpb25TdGF0cywgVGVybVN0YXRpc3RpY3MuLi4gdGVybVN0YXRzKTsKLSAgCisKICAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNpbWlsYXJpdHkuRXhhY3RTaW1TY29yZXJ9IHRvIHNjb3JlIG1hdGNoaW5nIGRvY3VtZW50cyBmcm9tIGEgc2VnbWVudCBvZiB0aGUgaW52ZXJ0ZWQgaW5kZXguCi0gICAqIEBwYXJhbSB3ZWlnaHQgY29sbGVjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHtAbGluayAjY29tcHV0ZVdlaWdodChmbG9hdCwgQ29sbGVjdGlvblN0YXRpc3RpY3MsIFRlcm1TdGF0aXN0aWNzLi4uKX0KLSAgICogQHBhcmFtIGNvbnRleHQgc2VnbWVudCBvZiB0aGUgaW52ZXJ0ZWQgaW5kZXggdG8gYmUgc2NvcmVkLgotICAgKiBAcmV0dXJuIEV4YWN0U2ltU2NvcmVyIGZvciBzY29yaW5nIGRvY3VtZW50cyBhY3Jvc3MgPGNvZGU+Y29udGV4dDwvY29kZT4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGxvdy1sZXZlbCBJL08gZXJyb3IKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBFeGFjdFNpbVNjb3JlciBleGFjdFNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTaW1pbGFyaXR5LlNsb3BweVNpbVNjb3Jlcn0gdG8gc2NvcmUgbWF0Y2hpbmcgZG9jdW1lbnRzIGZyb20gYSBzZWdtZW50IG9mIHRoZSBpbnZlcnRlZCBpbmRleC4KKyAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU2ltaWxhcml0eS5TaW1TY29yZXJ9IHRvIHNjb3JlIG1hdGNoaW5nIGRvY3VtZW50cyBmcm9tIGEgc2VnbWVudCBvZiB0aGUgaW52ZXJ0ZWQgaW5kZXguCiAgICAqIEBwYXJhbSB3ZWlnaHQgY29sbGVjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHtAbGluayAjY29tcHV0ZVdlaWdodChmbG9hdCwgQ29sbGVjdGlvblN0YXRpc3RpY3MsIFRlcm1TdGF0aXN0aWNzLi4uKX0KICAgICogQHBhcmFtIGNvbnRleHQgc2VnbWVudCBvZiB0aGUgaW52ZXJ0ZWQgaW5kZXggdG8gYmUgc2NvcmVkLgogICAgKiBAcmV0dXJuIFNsb3BweVNpbVNjb3JlciBmb3Igc2NvcmluZyBkb2N1bWVudHMgYWNyb3NzIDxjb2RlPmNvbnRleHQ8L2NvZGU+CiAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBsb3ctbGV2ZWwgSS9PIGVycm9yCiAgICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU2xvcHB5U2ltU2NvcmVyIHNsb3BweVNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgcHVibGljIGFic3RyYWN0IFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHdlaWdodCwgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAgIAogICAvKioKLSAgICogQVBJIGZvciBzY29yaW5nIGV4YWN0IHF1ZXJpZXMgc3VjaCBhcyB7QGxpbmsgVGVybVF1ZXJ5fSBhbmQgCi0gICAqIGV4YWN0IHtAbGluayBQaHJhc2VRdWVyeX0uCi0gICAqIDxwPgotICAgKiBGcmVxdWVuY2llcyBhcmUgaW50ZWdlcnMgKHRoZSB0ZXJtIG9yIHBocmFzZSBmcmVxdWVuY3kgd2l0aGluIHRoZSBkb2N1bWVudCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXhhY3RTaW1TY29yZXIgewotICAgIAotICAgIC8qKgotICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyAKLSAgICAgKiBjb25zdHJ1Y3RvcnMsIHR5cGljYWxseSBpbXBsaWNpdC4pCi0gICAgICovCi0gICAgcHVibGljIEV4YWN0U2ltU2NvcmVyKCkge30KLQotICAgIC8qKgotICAgICAqIFNjb3JlIGEgc2luZ2xlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGRvYyBkb2N1bWVudCBpZAotICAgICAqIEBwYXJhbSBmcmVxIHRlcm0gZnJlcXVlbmN5Ci0gICAgICogQHJldHVybiBkb2N1bWVudCdzIHNjb3JlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGZsb2F0IHNjb3JlKGludCBkb2MsIGludCBmcmVxKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHBsYWluIHRoZSBzY29yZSBmb3IgYSBzaW5nbGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gZG9jIGRvY3VtZW50IGlkCi0gICAgICogQHBhcmFtIGZyZXEgRXhwbGFuYXRpb24gb2YgaG93IHRoZSB0ZXJtIGZyZXF1ZW5jeSB3YXMgY29tcHV0ZWQKLSAgICAgKiBAcmV0dXJuIGRvY3VtZW50J3Mgc2NvcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwbGFuYXRpb24gZXhwbGFpbihpbnQgZG9jLCBFeHBsYW5hdGlvbiBmcmVxKSB7Ci0gICAgICBFeHBsYW5hdGlvbiByZXN1bHQgPSBuZXcgRXhwbGFuYXRpb24oc2NvcmUoZG9jLCAoaW50KWZyZXEuZ2V0VmFsdWUoKSksIAotICAgICAgICAgICJzY29yZShkb2M9IiArIGRvYyArICIsZnJlcT0iICsgZnJlcS5nZXRWYWx1ZSgpICsiKSwgd2l0aCBmcmVxIG9mOiIpOwotICAgICAgcmVzdWx0LmFkZERldGFpbChmcmVxKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQVBJIGZvciBzY29yaW5nICJzbG9wcHkiIHF1ZXJpZXMgc3VjaCBhcyB7QGxpbmsgU3BhblF1ZXJ5fSBhbmQgCi0gICAqIHNsb3BweSB7QGxpbmsgUGhyYXNlUXVlcnl9LgorICAgKiBBUEkgZm9yIHNjb3JpbmcgInNsb3BweSIgcXVlcmllcyBzdWNoIGFzIHtAbGluayBUZXJtUXVlcnl9LAorICAgKiB7QGxpbmsgU3BhblF1ZXJ5fSwgYW5kIHtAbGluayBQaHJhc2VRdWVyeX0uCiAgICAqIDxwPgogICAgKiBGcmVxdWVuY2llcyBhcmUgZmxvYXRpbmctcG9pbnQgdmFsdWVzOiBhbiBhcHByb3hpbWF0ZSAKICAgICogd2l0aGluLWRvY3VtZW50IGZyZXF1ZW5jeSBhZGp1c3RlZCBmb3IgInNsb3BwaW5lc3MiIGJ5IAotICAgKiB7QGxpbmsgU2xvcHB5U2ltU2NvcmVyI2NvbXB1dGVTbG9wRmFjdG9yKGludCl9LgorICAgKiB7QGxpbmsgU2ltU2NvcmVyI2NvbXB1dGVTbG9wRmFjdG9yKGludCl9LgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTbG9wcHlTaW1TY29yZXIgeworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNpbVNjb3JlciB7CiAgICAgCiAgICAgLyoqCiAgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIAogICAgICAqIGNvbnN0cnVjdG9ycywgdHlwaWNhbGx5IGltcGxpY2l0LikKICAgICAgKi8KLSAgICBwdWJsaWMgU2xvcHB5U2ltU2NvcmVyKCkge30KKyAgICBwdWJsaWMgU2ltU2NvcmVyKCkge30KIAogICAgIC8qKgogICAgICAqIFNjb3JlIGEgc2luZ2xlIGRvY3VtZW50CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1NpbWlsYXJpdHlCYXNlLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1NpbWlsYXJpdHlCYXNlLmphdmEKaW5kZXggNGY0ZjY3OC4uYzFjY2ZmNCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9TaW1pbGFyaXR5QmFzZS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvU2ltaWxhcml0eUJhc2UuamF2YQpAQCAtMTkwLDM4ICsxOTAsMjAgQEAKICAgfQogICAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBFeGFjdFNpbVNjb3JlciBleGFjdFNpbVNjb3JlcihTaW1XZWlnaHQgc3RhdHMsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKHN0YXRzIGluc3RhbmNlb2YgTXVsdGlTaW1pbGFyaXR5Lk11bHRpU3RhdHMpIHsKICAgICAgIC8vIGEgbXVsdGkgdGVybSBxdWVyeSAoZS5nLiBwaHJhc2UpLiByZXR1cm4gdGhlIHN1bW1hdGlvbiwgCiAgICAgICAvLyBzY29yaW5nIGFsbW9zdCBhcyBpZiBpdCB3ZXJlIGJvb2xlYW4gcXVlcnkKICAgICAgIFNpbVdlaWdodCBzdWJTdGF0c1tdID0gKChNdWx0aVNpbWlsYXJpdHkuTXVsdGlTdGF0cykgc3RhdHMpLnN1YlN0YXRzOwotICAgICAgRXhhY3RTaW1TY29yZXIgc3ViU2NvcmVyc1tdID0gbmV3IEV4YWN0U2ltU2NvcmVyW3N1YlN0YXRzLmxlbmd0aF07CisgICAgICBTaW1TY29yZXIgc3ViU2NvcmVyc1tdID0gbmV3IFNpbVNjb3JlcltzdWJTdGF0cy5sZW5ndGhdOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJTY29yZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgIEJhc2ljU3RhdHMgYmFzaWNzdGF0cyA9IChCYXNpY1N0YXRzKSBzdWJTdGF0c1tpXTsKLSAgICAgICAgc3ViU2NvcmVyc1tpXSA9IG5ldyBCYXNpY0V4YWN0RG9jU2NvcmVyKGJhc2ljc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhiYXNpY3N0YXRzLmZpZWxkKSk7CisgICAgICAgIHN1YlNjb3JlcnNbaV0gPSBuZXcgQmFzaWNTaW1TY29yZXIoYmFzaWNzdGF0cywgY29udGV4dC5yZWFkZXIoKS5nZXROb3JtVmFsdWVzKGJhc2ljc3RhdHMuZmllbGQpKTsKICAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgTXVsdGlTaW1pbGFyaXR5Lk11bHRpRXhhY3REb2NTY29yZXIoc3ViU2NvcmVycyk7CisgICAgICByZXR1cm4gbmV3IE11bHRpU2ltaWxhcml0eS5NdWx0aVNpbVNjb3JlcihzdWJTY29yZXJzKTsKICAgICB9IGVsc2UgewogICAgICAgQmFzaWNTdGF0cyBiYXNpY3N0YXRzID0gKEJhc2ljU3RhdHMpIHN0YXRzOwotICAgICAgcmV0dXJuIG5ldyBCYXNpY0V4YWN0RG9jU2NvcmVyKGJhc2ljc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhiYXNpY3N0YXRzLmZpZWxkKSk7Ci0gICAgfQotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIFNsb3BweVNpbVNjb3JlciBzbG9wcHlTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHN0YXRzIGluc3RhbmNlb2YgTXVsdGlTaW1pbGFyaXR5Lk11bHRpU3RhdHMpIHsKLSAgICAgIC8vIGEgbXVsdGkgdGVybSBxdWVyeSAoZS5nLiBwaHJhc2UpLiByZXR1cm4gdGhlIHN1bW1hdGlvbiwgCi0gICAgICAvLyBzY29yaW5nIGFsbW9zdCBhcyBpZiBpdCB3ZXJlIGJvb2xlYW4gcXVlcnkKLSAgICAgIFNpbVdlaWdodCBzdWJTdGF0c1tdID0gKChNdWx0aVNpbWlsYXJpdHkuTXVsdGlTdGF0cykgc3RhdHMpLnN1YlN0YXRzOwotICAgICAgU2xvcHB5U2ltU2NvcmVyIHN1YlNjb3JlcnNbXSA9IG5ldyBTbG9wcHlTaW1TY29yZXJbc3ViU3RhdHMubGVuZ3RoXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViU2NvcmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICBCYXNpY1N0YXRzIGJhc2ljc3RhdHMgPSAoQmFzaWNTdGF0cykgc3ViU3RhdHNbaV07Ci0gICAgICAgIHN1YlNjb3JlcnNbaV0gPSBuZXcgQmFzaWNTbG9wcHlEb2NTY29yZXIoYmFzaWNzdGF0cywgY29udGV4dC5yZWFkZXIoKS5nZXROb3JtVmFsdWVzKGJhc2ljc3RhdHMuZmllbGQpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgTXVsdGlTaW1pbGFyaXR5Lk11bHRpU2xvcHB5RG9jU2NvcmVyKHN1YlNjb3JlcnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCYXNpY1N0YXRzIGJhc2ljc3RhdHMgPSAoQmFzaWNTdGF0cykgc3RhdHM7Ci0gICAgICByZXR1cm4gbmV3IEJhc2ljU2xvcHB5RG9jU2NvcmVyKGJhc2ljc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhiYXNpY3N0YXRzLmZpZWxkKSk7CisgICAgICByZXR1cm4gbmV3IEJhc2ljU2ltU2NvcmVyKGJhc2ljc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhiYXNpY3N0YXRzLmZpZWxkKSk7CiAgICAgfQogICB9CiAgIApAQCAtMjc3LDQ2ICsyNTksMTcgQEAKICAgCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAKLSAgLyoqIERlbGVnYXRlcyB0aGUge0BsaW5rICNzY29yZShpbnQsIGludCl9IGFuZAotICAgKiB7QGxpbmsgI2V4cGxhaW4oaW50LCBFeHBsYW5hdGlvbil9IG1ldGhvZHMgdG8KLSAgICoge0BsaW5rIFNpbWlsYXJpdHlCYXNlI3Njb3JlKEJhc2ljU3RhdHMsIGZsb2F0LCBmbG9hdCl9IGFuZAotICAgKiB7QGxpbmsgU2ltaWxhcml0eUJhc2UjZXhwbGFpbihCYXNpY1N0YXRzLCBpbnQsIEV4cGxhbmF0aW9uLCBmbG9hdCl9LAotICAgKiByZXNwZWN0aXZlbHkuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEJhc2ljRXhhY3REb2NTY29yZXIgZXh0ZW5kcyBFeGFjdFNpbVNjb3JlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCYXNpY1N0YXRzIHN0YXRzOwotICAgIHByaXZhdGUgZmluYWwgTnVtZXJpY0RvY1ZhbHVlcyBub3JtczsKLSAgICAKLSAgICBCYXNpY0V4YWN0RG9jU2NvcmVyKEJhc2ljU3RhdHMgc3RhdHMsIE51bWVyaWNEb2NWYWx1ZXMgbm9ybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLnN0YXRzID0gc3RhdHM7Ci0gICAgICB0aGlzLm5vcm1zID0gbm9ybXM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBzY29yZShpbnQgZG9jLCBpbnQgZnJlcSkgewotICAgICAgLy8gV2UgaGF2ZSB0byBzdXBwbHkgc29tZXRoaW5nIGluIGNhc2Ugbm9ybXMgYXJlIG9taXR0ZWQKLSAgICAgIHJldHVybiBTaW1pbGFyaXR5QmFzZS50aGlzLnNjb3JlKHN0YXRzLCBmcmVxLAotICAgICAgICAgIG5vcm1zID09IG51bGwgPyAxRiA6IGRlY29kZU5vcm1WYWx1ZSgoYnl0ZSlub3Jtcy5nZXQoZG9jKSkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhwbGFuYXRpb24gZXhwbGFpbihpbnQgZG9jLCBFeHBsYW5hdGlvbiBmcmVxKSB7Ci0gICAgICByZXR1cm4gU2ltaWxhcml0eUJhc2UudGhpcy5leHBsYWluKHN0YXRzLCBkb2MsIGZyZXEsCi0gICAgICAgICAgbm9ybXMgPT0gbnVsbCA/IDFGIDogZGVjb2RlTm9ybVZhbHVlKChieXRlKW5vcm1zLmdldChkb2MpKSk7Ci0gICAgfQotICB9Ci0gIAogICAvKiogRGVsZWdhdGVzIHRoZSB7QGxpbmsgI3Njb3JlKGludCwgZmxvYXQpfSBhbmQKICAgICoge0BsaW5rICNleHBsYWluKGludCwgRXhwbGFuYXRpb24pfSBtZXRob2RzIHRvCiAgICAqIHtAbGluayBTaW1pbGFyaXR5QmFzZSNzY29yZShCYXNpY1N0YXRzLCBmbG9hdCwgZmxvYXQpfSBhbmQKICAgICoge0BsaW5rIFNpbWlsYXJpdHlCYXNlI2V4cGxhaW4oQmFzaWNTdGF0cywgaW50LCBFeHBsYW5hdGlvbiwgZmxvYXQpfSwKICAgICogcmVzcGVjdGl2ZWx5LgogICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBCYXNpY1Nsb3BweURvY1Njb3JlciBleHRlbmRzIFNsb3BweVNpbVNjb3JlciB7CisgIHByaXZhdGUgY2xhc3MgQmFzaWNTaW1TY29yZXIgZXh0ZW5kcyBTaW1TY29yZXIgewogICAgIHByaXZhdGUgZmluYWwgQmFzaWNTdGF0cyBzdGF0czsKICAgICBwcml2YXRlIGZpbmFsIE51bWVyaWNEb2NWYWx1ZXMgbm9ybXM7CiAgICAgCi0gICAgQmFzaWNTbG9wcHlEb2NTY29yZXIoQmFzaWNTdGF0cyBzdGF0cywgTnVtZXJpY0RvY1ZhbHVlcyBub3JtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBCYXNpY1NpbVNjb3JlcihCYXNpY1N0YXRzIHN0YXRzLCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOwogICAgICAgdGhpcy5ub3JtcyA9IG5vcm1zOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvVEZJREZTaW1pbGFyaXR5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc2ltaWxhcml0aWVzL1RGSURGU2ltaWxhcml0eS5qYXZhCmluZGV4IDFhNjE0NzcuLjFkNWM5ZDMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zaW1pbGFyaXRpZXMvVEZJREZTaW1pbGFyaXR5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NpbWlsYXJpdGllcy9URklERlNpbWlsYXJpdHkuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5QaHJhc2VRdWVyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVGVybVN0YXRpc3RpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlNtYWxsRmxvYXQ7CiAKIAogLyoqCkBAIC00OTYsMjcgKzQ5NSw4IEBACiAgKiAgICAgICAgICA8dGQ+PC90ZD4KICAqICAgICAgICA8L3RyPgogICogICAgICA8L3RhYmxlPgotICogICAgICA8YnI+Jm5ic3A7PGJyPgotICogICAgICBIb3dldmVyIHRoZSByZXN1bHRlZCA8aT5ub3JtPC9pPiB2YWx1ZSBpcyB7QGxpbmsgI2VuY29kZU5vcm1WYWx1ZShmbG9hdCkgZW5jb2RlZH0gYXMgYSBzaW5nbGUgYnl0ZQotICogICAgICBiZWZvcmUgYmVpbmcgc3RvcmVkLgotICogICAgICBBdCBzZWFyY2ggdGltZSwgdGhlIG5vcm0gYnl0ZSB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIGluZGV4Ci0gKiAgICAgIHtAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3RvcnkgZGlyZWN0b3J5fSBhbmQKLSAqICAgICAge0BsaW5rICNkZWNvZGVOb3JtVmFsdWUoYnl0ZSkgZGVjb2RlZH0gYmFjayB0byBhIGZsb2F0IDxpPm5vcm08L2k+IHZhbHVlLgotICogICAgICBUaGlzIGVuY29kaW5nL2RlY29kaW5nLCB3aGlsZSByZWR1Y2luZyBpbmRleCBzaXplLCBjb21lcyB3aXRoIHRoZSBwcmljZSBvZgotICogICAgICBwcmVjaXNpb24gbG9zcyAtIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgPGk+ZGVjb2RlKGVuY29kZSh4KSkgPSB4PC9pPi4KLSAqICAgICAgRm9yIGluc3RhbmNlLCA8aT5kZWNvZGUoZW5jb2RlKDAuODkpKSA9IDAuNzU8L2k+LgotICogICAgICA8YnI+Jm5ic3A7PGJyPgotICogICAgICBDb21wcmVzc2lvbiBvZiBub3JtIHZhbHVlcyB0byBhIHNpbmdsZSBieXRlIHNhdmVzIG1lbW9yeSBhdCBzZWFyY2ggdGltZSwgCi0gKiAgICAgIGJlY2F1c2Ugb25jZSBhIGZpZWxkIGlzIHJlZmVyZW5jZWQgYXQgc2VhcmNoIHRpbWUsIGl0cyBub3JtcyAtIGZvciAKLSAqICAgICAgYWxsIGRvY3VtZW50cyAtIGFyZSBtYWludGFpbmVkIGluIG1lbW9yeS4KLSAqICAgICAgPGJyPiZuYnNwOzxicj4KLSAqICAgICAgVGhlIHJhdGlvbmFsZSBzdXBwb3J0aW5nIHN1Y2ggbG9zc3kgY29tcHJlc3Npb24gb2Ygbm9ybSB2YWx1ZXMgaXMgdGhhdAotICogICAgICBnaXZlbiB0aGUgZGlmZmljdWx0eSAoYW5kIGluYWNjdXJhY3kpIG9mIHVzZXJzIHRvIGV4cHJlc3MgdGhlaXIgdHJ1ZSBpbmZvcm1hdGlvbgotICogICAgICBuZWVkIGJ5IGEgcXVlcnksIG9ubHkgYmlnIGRpZmZlcmVuY2VzIG1hdHRlci4KLSAqICAgICAgPGJyPiZuYnNwOzxicj4KLSAqICAgICAgTGFzdCwgbm90ZSB0aGF0IHNlYXJjaCB0aW1lIGlzIHRvbyBsYXRlIHRvIG1vZGlmeSB0aGlzIDxpPm5vcm08L2k+IHBhcnQgb2Ygc2NvcmluZywgZS5nLiBieQotICogICAgICB1c2luZyBhIGRpZmZlcmVudCB7QGxpbmsgU2ltaWxhcml0eX0gZm9yIHNlYXJjaC4KLSAqICAgICAgPGJyPiZuYnNwOzxicj4KKyAqICAgICAgTm90ZSB0aGF0IHNlYXJjaCB0aW1lIGlzIHRvbyBsYXRlIHRvIG1vZGlmeSB0aGlzIDxpPm5vcm08L2k+IHBhcnQgb2Ygc2NvcmluZywgCisgKiAgICAgIGUuZy4gYnkgdXNpbmcgYSBkaWZmZXJlbnQge0BsaW5rIFNpbWlsYXJpdHl9IGZvciBzZWFyY2guCiAgKiAgICA8L2xpPgogICogPC9vbD4KICAqCkBAIC01NzIsMjUgKzU1Miw2IEBACiAgICAqIHdoZW4gPGNvZGU+ZnJlcTwvY29kZT4gaXMgbGFyZ2UsIGFuZCBzbWFsbGVyIHZhbHVlcyB3aGVuIDxjb2RlPmZyZXE8L2NvZGU+CiAgICAqIGlzIHNtYWxsLgogICAgKgotICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI3RmKGZsb2F0KX0uCi0gICAqCi0gICAqIEBwYXJhbSBmcmVxIHRoZSBmcmVxdWVuY3kgb2YgYSB0ZXJtIHdpdGhpbiBhIGRvY3VtZW50Ci0gICAqIEByZXR1cm4gYSBzY29yZSBmYWN0b3IgYmFzZWQgb24gYSB0ZXJtJ3Mgd2l0aGluLWRvY3VtZW50IGZyZXF1ZW5jeQotICAgKi8KLSAgcHVibGljIGZsb2F0IHRmKGludCBmcmVxKSB7Ci0gICAgcmV0dXJuIHRmKChmbG9hdClmcmVxKTsKLSAgfQotCi0gIC8qKiBDb21wdXRlcyBhIHNjb3JlIGZhY3RvciBiYXNlZCBvbiBhIHRlcm0gb3IgcGhyYXNlJ3MgZnJlcXVlbmN5IGluIGEKLSAgICogZG9jdW1lbnQuICBUaGlzIHZhbHVlIGlzIG11bHRpcGxpZWQgYnkgdGhlIHtAbGluayAjaWRmKGxvbmcsIGxvbmcpfQotICAgKiBmYWN0b3IgZm9yIGVhY2ggdGVybSBpbiB0aGUgcXVlcnkgYW5kIHRoZXNlIHByb2R1Y3RzIGFyZSB0aGVuIHN1bW1lZCB0bwotICAgKiBmb3JtIHRoZSBpbml0aWFsIHNjb3JlIGZvciBhIGRvY3VtZW50LgotICAgKgotICAgKiA8cD5UZXJtcyBhbmQgcGhyYXNlcyByZXBlYXRlZCBpbiBhIGRvY3VtZW50IGluZGljYXRlIHRoZSB0b3BpYyBvZiB0aGUKLSAgICogZG9jdW1lbnQsIHNvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCB1c3VhbGx5IHJldHVybiBsYXJnZXIgdmFsdWVzCi0gICAqIHdoZW4gPGNvZGU+ZnJlcTwvY29kZT4gaXMgbGFyZ2UsIGFuZCBzbWFsbGVyIHZhbHVlcyB3aGVuIDxjb2RlPmZyZXE8L2NvZGU+Ci0gICAqIGlzIHNtYWxsLgotICAgKgogICAgKiBAcGFyYW0gZnJlcSB0aGUgZnJlcXVlbmN5IG9mIGEgdGVybSB3aXRoaW4gYSBkb2N1bWVudAogICAgKiBAcmV0dXJuIGEgc2NvcmUgZmFjdG9yIGJhc2VkIG9uIGEgdGVybSdzIHdpdGhpbi1kb2N1bWVudCBmcmVxdWVuY3kKICAgICovCkBAIC02NTUsNyArNjE2LDcgQEAKIAogICAvKiogQ29tcHV0ZXMgYSBzY29yZSBmYWN0b3IgYmFzZWQgb24gYSB0ZXJtJ3MgZG9jdW1lbnQgZnJlcXVlbmN5ICh0aGUgbnVtYmVyCiAgICAqIG9mIGRvY3VtZW50cyB3aGljaCBjb250YWluIHRoZSB0ZXJtKS4gIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUKLSAgICoge0BsaW5rICN0ZihpbnQpfSBmYWN0b3IgZm9yIGVhY2ggdGVybSBpbiB0aGUgcXVlcnkgYW5kIHRoZXNlIHByb2R1Y3RzIGFyZQorICAgKiB7QGxpbmsgI3RmKGZsb2F0KX0gZmFjdG9yIGZvciBlYWNoIHRlcm0gaW4gdGhlIHF1ZXJ5IGFuZCB0aGVzZSBwcm9kdWN0cyBhcmUKICAgICogdGhlbiBzdW1tZWQgdG8gZm9ybSB0aGUgaW5pdGlhbCBzY29yZSBmb3IgYSBkb2N1bWVudC4KICAgICoKICAgICogPHA+VGVybXMgdGhhdCBvY2N1ciBpbiBmZXdlciBkb2N1bWVudHMgYXJlIGJldHRlciBpbmRpY2F0b3JzIG9mIHRvcGljLCBzbwpAQCAtNjg1LDM4ICs2NDYsMTUgQEAKICAgICByZXR1cm4gZW5jb2RlTm9ybVZhbHVlKG5vcm1WYWx1ZSk7CiAgIH0KICAgCi0gIC8qKiBDYWNoZSBvZiBkZWNvZGVkIGJ5dGVzLiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdFtdIE5PUk1fVEFCTEUgPSBuZXcgZmxvYXRbMjU2XTsKLQotICBzdGF0aWMgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgIE5PUk1fVEFCTEVbaV0gPSBTbWFsbEZsb2F0LmJ5dGUzMTVUb0Zsb2F0KChieXRlKWkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBEZWNvZGVzIGEgbm9ybWFsaXphdGlvbiBmYWN0b3Igc3RvcmVkIGluIGFuIGluZGV4LgorICAvKioKKyAgICogRGVjb2RlcyBhIG5vcm1hbGl6YXRpb24gZmFjdG9yIHN0b3JlZCBpbiBhbiBpbmRleC4KKyAgICogCiAgICAqIEBzZWUgI2VuY29kZU5vcm1WYWx1ZShmbG9hdCkKICAgICovCi0gIHB1YmxpYyBmbG9hdCBkZWNvZGVOb3JtVmFsdWUoYnl0ZSBiKSB7Ci0gICAgcmV0dXJuIE5PUk1fVEFCTEVbYiAmIDB4RkZdOyAgLy8gJiAweEZGIG1hcHMgbmVnYXRpdmUgYnl0ZXMgdG8gcG9zaXRpdmUgYWJvdmUgMTI3Ci0gIH0KKyAgcHVibGljIGFic3RyYWN0IGZsb2F0IGRlY29kZU5vcm1WYWx1ZShsb25nIG5vcm0pOwogCi0gIC8qKiBFbmNvZGVzIGEgbm9ybWFsaXphdGlvbiBmYWN0b3IgZm9yIHN0b3JhZ2UgaW4gYW4gaW5kZXguCi0gICoKLSAgKiA8cD5UaGUgZW5jb2RpbmcgdXNlcyBhIHRocmVlLWJpdCBtYW50aXNzYSwgYSBmaXZlLWJpdCBleHBvbmVudCwgYW5kCi0gICogdGhlIHplcm8tZXhwb25lbnQgcG9pbnQgYXQgMTUsIHRodXMKLSAgKiByZXByZXNlbnRpbmcgdmFsdWVzIGZyb20gYXJvdW5kIDd4MTBeOSB0byAyeDEwXi05IHdpdGggYWJvdXQgb25lCi0gICogc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdCBvZiBhY2N1cmFjeS4gIFplcm8gaXMgYWxzbyByZXByZXNlbnRlZC4KLSAgKiBOZWdhdGl2ZSBudW1iZXJzIGFyZSByb3VuZGVkIHVwIHRvIHplcm8uICBWYWx1ZXMgdG9vIGxhcmdlIHRvIHJlcHJlc2VudAotICAqIGFyZSByb3VuZGVkIGRvd24gdG8gdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZS4gIFBvc2l0aXZlIHZhbHVlcyB0b28KLSAgKiBzbWFsbCB0byByZXByZXNlbnQgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIHNtYWxsZXN0IHBvc2l0aXZlIHJlcHJlc2VudGFibGUKLSAgKiB2YWx1ZS4KLSAgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkI3NldEJvb3N0KGZsb2F0KQotICAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5TbWFsbEZsb2F0Ci0gICovCi0gIHB1YmxpYyBieXRlIGVuY29kZU5vcm1WYWx1ZShmbG9hdCBmKSB7Ci0gICAgcmV0dXJuIFNtYWxsRmxvYXQuZmxvYXRUb0J5dGUzMTUoZik7Ci0gIH0KKyAgLyoqIEVuY29kZXMgYSBub3JtYWxpemF0aW9uIGZhY3RvciBmb3Igc3RvcmFnZSBpbiBhbiBpbmRleC4gKi8KKyAgcHVibGljIGFic3RyYWN0IGxvbmcgZW5jb2RlTm9ybVZhbHVlKGZsb2F0IGYpOwogIAogICAvKiogQ29tcHV0ZXMgdGhlIGFtb3VudCBvZiBhIHNsb3BweSBwaHJhc2UgbWF0Y2gsIGJhc2VkIG9uIGFuIGVkaXQgZGlzdGFuY2UuCiAgICAqIFRoaXMgdmFsdWUgaXMgc3VtbWVkIGZvciBlYWNoIHNsb3BweSBwaHJhc2UgbWF0Y2ggaW4gYSBkb2N1bWVudCB0byBmb3JtCkBAIC03NTUsNDkgKzY5MywxNyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBFeGFjdFNpbVNjb3JlciBleGFjdFNpbVNjb3JlcihTaW1XZWlnaHQgc3RhdHMsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIGZpbmFsIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgSURGU3RhdHMgaWRmc3RhdHMgPSAoSURGU3RhdHMpIHN0YXRzOwotICAgIHJldHVybiBuZXcgRXhhY3RURklERkRvY1Njb3JlcihpZGZzdGF0cywgY29udGV4dC5yZWFkZXIoKS5nZXROb3JtVmFsdWVzKGlkZnN0YXRzLmZpZWxkKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFNsb3BweVNpbVNjb3JlciBzbG9wcHlTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgSURGU3RhdHMgaWRmc3RhdHMgPSAoSURGU3RhdHMpIHN0YXRzOwotICAgIHJldHVybiBuZXcgU2xvcHB5VEZJREZEb2NTY29yZXIoaWRmc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhpZGZzdGF0cy5maWVsZCkpOworICAgIHJldHVybiBuZXcgVEZJREZTaW1TY29yZXIoaWRmc3RhdHMsIGNvbnRleHQucmVhZGVyKCkuZ2V0Tm9ybVZhbHVlcyhpZGZzdGF0cy5maWVsZCkpOwogICB9CiAgIAotICAvLyBUT0RPOiB3ZSBjYW4gc3BlY2lhbGl6ZSB0aGVzZSBmb3Igb21pdE5vcm1zIHVwIGZyb250LCBidXQgd2Ugc2hvdWxkIHRlc3QgdGhhdCBpdCBkb2Vzbid0IGNvbmZ1c2Ugc3R1cGlkIGhvdHNwb3QuCi0KLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBFeGFjdFRGSURGRG9jU2NvcmVyIGV4dGVuZHMgRXhhY3RTaW1TY29yZXIgeworICBwcml2YXRlIGZpbmFsIGNsYXNzIFRGSURGU2ltU2NvcmVyIGV4dGVuZHMgU2ltU2NvcmVyIHsKICAgICBwcml2YXRlIGZpbmFsIElERlN0YXRzIHN0YXRzOwogICAgIHByaXZhdGUgZmluYWwgZmxvYXQgd2VpZ2h0VmFsdWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zOwogICAgIAotICAgIEV4YWN0VEZJREZEb2NTY29yZXIoSURGU3RhdHMgc3RhdHMsIE51bWVyaWNEb2NWYWx1ZXMgbm9ybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLnN0YXRzID0gc3RhdHM7Ci0gICAgICB0aGlzLndlaWdodFZhbHVlID0gc3RhdHMudmFsdWU7Ci0gICAgICB0aGlzLm5vcm1zID0gbm9ybXM7IAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgc2NvcmUoaW50IGRvYywgaW50IGZyZXEpIHsKLSAgICAgIGZpbmFsIGZsb2F0IHJhdyA9IHRmKGZyZXEpKndlaWdodFZhbHVlOyAgLy8gY29tcHV0ZSB0ZihmKSp3ZWlnaHQKLQotICAgICAgcmV0dXJuIG5vcm1zID09IG51bGwgPyByYXcgOiByYXcgKiBkZWNvZGVOb3JtVmFsdWUoKGJ5dGUpbm9ybXMuZ2V0KGRvYykpOyAvLyBub3JtYWxpemUgZm9yIGZpZWxkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cGxhbmF0aW9uIGV4cGxhaW4oaW50IGRvYywgRXhwbGFuYXRpb24gZnJlcSkgewotICAgICAgcmV0dXJuIGV4cGxhaW5TY29yZShkb2MsIGZyZXEsIHN0YXRzLCBub3Jtcyk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNsYXNzIFNsb3BweVRGSURGRG9jU2NvcmVyIGV4dGVuZHMgU2xvcHB5U2ltU2NvcmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIElERlN0YXRzIHN0YXRzOwotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgd2VpZ2h0VmFsdWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zOwotICAgIAotICAgIFNsb3BweVRGSURGRG9jU2NvcmVyKElERlN0YXRzIHN0YXRzLCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRGSURGU2ltU2NvcmVyKElERlN0YXRzIHN0YXRzLCBOdW1lcmljRG9jVmFsdWVzIG5vcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOwogICAgICAgdGhpcy53ZWlnaHRWYWx1ZSA9IHN0YXRzLnZhbHVlOwogICAgICAgdGhpcy5ub3JtcyA9IG5vcm1zOwpAQCAtODA3LDcgKzcxMyw3IEBACiAgICAgcHVibGljIGZsb2F0IHNjb3JlKGludCBkb2MsIGZsb2F0IGZyZXEpIHsKICAgICAgIGZpbmFsIGZsb2F0IHJhdyA9IHRmKGZyZXEpICogd2VpZ2h0VmFsdWU7IC8vIGNvbXB1dGUgdGYoZikqd2VpZ2h0CiAgICAgICAKLSAgICAgIHJldHVybiBub3JtcyA9PSBudWxsID8gcmF3IDogcmF3ICogZGVjb2RlTm9ybVZhbHVlKChieXRlKW5vcm1zLmdldChkb2MpKTsgIC8vIG5vcm1hbGl6ZSBmb3IgZmllbGQKKyAgICAgIHJldHVybiBub3JtcyA9PSBudWxsID8gcmF3IDogcmF3ICogZGVjb2RlTm9ybVZhbHVlKG5vcm1zLmdldChkb2MpKTsgIC8vIG5vcm1hbGl6ZSBmb3IgZmllbGQKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCkBAIC04OTQsOCArODAwLDcgQEAKICAgICBmaWVsZEV4cGwuYWRkRGV0YWlsKHN0YXRzLmlkZik7CiAKICAgICBFeHBsYW5hdGlvbiBmaWVsZE5vcm1FeHBsID0gbmV3IEV4cGxhbmF0aW9uKCk7Ci0gICAgZmxvYXQgZmllbGROb3JtID0KLSAgICAgIG5vcm1zIT1udWxsID8gZGVjb2RlTm9ybVZhbHVlKChieXRlKSBub3Jtcy5nZXQoZG9jKSkgOiAxLjBmOworICAgIGZsb2F0IGZpZWxkTm9ybSA9IG5vcm1zICE9IG51bGwgPyBkZWNvZGVOb3JtVmFsdWUobm9ybXMuZ2V0KGRvYykpIDogMS4wZjsKICAgICBmaWVsZE5vcm1FeHBsLnNldFZhbHVlKGZpZWxkTm9ybSk7CiAgICAgZmllbGROb3JtRXhwbC5zZXREZXNjcmlwdGlvbigiZmllbGROb3JtKGRvYz0iK2RvYysiKSIpOwogICAgIGZpZWxkRXhwbC5hZGREZXRhaWwoZmllbGROb3JtRXhwbCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvU3BhblNjb3Jlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NwYW5zL1NwYW5TY29yZXIuamF2YQppbmRleCBhMzYyNzYzLi43NGEwOThkIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvU3BhblNjb3Jlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zcGFucy9TcGFuU2NvcmVyLmphdmEKQEAgLTM0LDkgKzM0LDkgQEAKICAgcHJvdGVjdGVkIGludCBkb2M7CiAgIHByb3RlY3RlZCBmbG9hdCBmcmVxOwogICBwcm90ZWN0ZWQgaW50IG51bU1hdGNoZXM7Ci0gIHByb3RlY3RlZCBmaW5hbCBTaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlciBkb2NTY29yZXI7CisgIHByb3RlY3RlZCBmaW5hbCBTaW1pbGFyaXR5LlNpbVNjb3JlciBkb2NTY29yZXI7CiAgIAotICBwcm90ZWN0ZWQgU3BhblNjb3JlcihTcGFucyBzcGFucywgV2VpZ2h0IHdlaWdodCwgU2ltaWxhcml0eS5TbG9wcHlTaW1TY29yZXIgZG9jU2NvcmVyKQorICBwcm90ZWN0ZWQgU3BhblNjb3JlcihTcGFucyBzcGFucywgV2VpZ2h0IHdlaWdodCwgU2ltaWxhcml0eS5TaW1TY29yZXIgZG9jU2NvcmVyKQogICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHN1cGVyKHdlaWdodCk7CiAgICAgdGhpcy5kb2NTY29yZXIgPSBkb2NTY29yZXI7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvU3BhbldlaWdodC5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NwYW5zL1NwYW5XZWlnaHQuamF2YQppbmRleCA2MDU3MzA4Li44ZTQyOGYxIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvU3BhbldlaWdodC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zcGFucy9TcGFuV2VpZ2h0LmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guKjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltU2NvcmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQml0czsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC04Niw3ICs4Niw3IEBACiAgICAgaWYgKHN0YXRzID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IFNwYW5TY29yZXIocXVlcnkuZ2V0U3BhbnMoY29udGV4dCwgYWNjZXB0RG9jcywgdGVybUNvbnRleHRzKSwgdGhpcywgc2ltaWxhcml0eS5zbG9wcHlTaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpKTsKKyAgICAgIHJldHVybiBuZXcgU3BhblNjb3JlcihxdWVyeS5nZXRTcGFucyhjb250ZXh0LCBhY2NlcHREb2NzLCB0ZXJtQ29udGV4dHMpLCB0aGlzLCBzaW1pbGFyaXR5LnNpbVNjb3JlcihzdGF0cywgY29udGV4dCkpOwogICAgIH0KICAgfQogCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICBpbnQgbmV3RG9jID0gc2NvcmVyLmFkdmFuY2UoZG9jKTsKICAgICAgIGlmIChuZXdEb2MgPT0gZG9jKSB7CiAgICAgICAgIGZsb2F0IGZyZXEgPSBzY29yZXIuc2xvcHB5RnJlcSgpOwotICAgICAgICBTbG9wcHlTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zbG9wcHlTaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOworICAgICAgICBTaW1TY29yZXIgZG9jU2NvcmVyID0gc2ltaWxhcml0eS5zaW1TY29yZXIoc3RhdHMsIGNvbnRleHQpOwogICAgICAgICBDb21wbGV4RXhwbGFuYXRpb24gcmVzdWx0ID0gbmV3IENvbXBsZXhFeHBsYW5hdGlvbigpOwogICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oIndlaWdodCgiK2dldFF1ZXJ5KCkrIiBpbiAiK2RvYysiKSBbIiArIHNpbWlsYXJpdHkuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiXSwgcmVzdWx0IG9mOiIpOwogICAgICAgICBFeHBsYW5hdGlvbiBzY29yZUV4cGxhbmF0aW9uID0gZG9jU2NvcmVyLmV4cGxhaW4oZG9jLCBuZXcgRXhwbGFuYXRpb24oZnJlcSwgInBocmFzZUZyZXE9IiArIGZyZXEpKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3N0b3JlL0RpcmVjdG9yeS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvRGlyZWN0b3J5LmphdmEKaW5kZXggY2E5YjNkZi4uNTQwNDY1NSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvRGlyZWN0b3J5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvRGlyZWN0b3J5LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsgLy8gZm9yIGphdmFkb2NzCiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLklPVXRpbHM7CkBAIC03MCwxMiArNzEsMTIgQEAKICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBUaGlzIG1ldGhvZCBmb2xsb3dzIHRoZQogICAgKiBmb2xsb3dpbmcgY29udHJhY3Q6CiAgICAqIDx1bD4KLSAgICogPGxpPlRocm93cyB7QGxpbmsgRmlsZU5vdEZvdW5kRXhjZXB0aW9ufSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgKiA8bGk+VGhyb3dzIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IG9yIHtAbGluayBOb1N1Y2hGaWxlRXhjZXB0aW9ufQorICAgKiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KICAgICogPGxpPlJldHVybnMgYSB2YWx1ZSAmZ2U7MCBpZiB0aGUgZmlsZSBleGlzdHMsIHdoaWNoIHNwZWNpZmllcyBpdHMgbGVuZ3RoLgogICAgKiA8L3VsPgogICAgKiAKICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbGVuZ3RoLgotICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gSU8gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgZmlsZSdzCiAgICAqICAgICAgICAgbGVuZ3RoLgogICAgKi8KQEAgLTEwNiw3ICsxMDcsOSBAQAogICAgKiB0aGUgb25seSBEaXJlY3RvcnkgaW1wbGVtZW50YXRpb25zIHRoYXQgcmVzcGVjdCB0aGlzCiAgICAqIHBhcmFtZXRlciBhcmUge0BsaW5rIEZTRGlyZWN0b3J5fSBhbmQge0BsaW5rCiAgICAqIENvbXBvdW5kRmlsZURpcmVjdG9yeX0uCi0gICovCisgICAqIDxwPlRocm93cyB7QGxpbmsgRmlsZU5vdEZvdW5kRXhjZXB0aW9ufSBvciB7QGxpbmsgTm9TdWNoRmlsZUV4Y2VwdGlvbn0KKyAgICogaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCisgICAqLwogICBwdWJsaWMgYWJzdHJhY3QgSW5kZXhJbnB1dCBvcGVuSW5wdXQoU3RyaW5nIG5hbWUsIElPQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb247IAogICAKICAgLyoqIENvbnN0cnVjdCBhIHtAbGluayBMb2NrfS4KQEAgLTIyMyw2ICsyMjYsOCBAQAogICAgKiBlZmZpY2llbnRseSBvcGVuIG9uZSBvciBtb3JlIHNsaWNlZCB7QGxpbmsgSW5kZXhJbnB1dH0gaW5zdGFuY2VzIGZyb20gYQogICAgKiBzaW5nbGUgZmlsZSBoYW5kbGUuIFRoZSB1bmRlcmx5aW5nIGZpbGUgaGFuZGxlIGlzIGtlcHQgb3BlbiB1bnRpbCB0aGUKICAgICoge0BsaW5rIEluZGV4SW5wdXRTbGljZXJ9IGlzIGNsb3NlZC4KKyAgICogPHA+VGhyb3dzIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259IG9yIHtAbGluayBOb1N1Y2hGaWxlRXhjZXB0aW9ufQorICAgKiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KICAgICoKICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgKiAgICAgICAgICAgaWYgYW4ge0BsaW5rIElPRXhjZXB0aW9ufSBvY2N1cnMKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvQ29uc3RhbnRzLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL0NvbnN0YW50cy5qYXZhCmluZGV4IDFiYmZiNmEuLjQ0ZjU0NDYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvQ29uc3RhbnRzLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9Db25zdGFudHMuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VOX09TID0gT1NfTkFNRS5zdGFydHNXaXRoKCJTdW5PUyIpOwogICAvKiogVHJ1ZSBpZmYgcnVubmluZyBvbiBNYWMgT1MgWCAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUFDX09TX1ggPSBPU19OQU1FLnN0YXJ0c1dpdGgoIk1hYyBPUyBYIik7CisgIC8qKiBUcnVlIGlmZiBydW5uaW5nIG9uIEZyZWVCU0QgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSRUVfQlNEID0gT1NfTkFNRS5zdGFydHNXaXRoKCJGcmVlQlNEIik7CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfQVJDSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19WRVJTSU9OID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIik7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1JvbGxpbmdCdWZmZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvUm9sbGluZ0J1ZmZlci5qYXZhCmluZGV4IGQzMWJiNGMuLjRjZjAzZjUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvUm9sbGluZ0J1ZmZlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvUm9sbGluZ0J1ZmZlci5qYXZhCkBAIC0xNyw5ICsxNyw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vLyBUT0RPOiBwcm9iYWJseSBtb3ZlIHRoaXMgdG8gY29yZSBhdCBzb21lIHBvaW50IChlZywKLS8vIGN1dG92ZXIga3Vyb21vamksIHN5bmZpbHRlciwgTG9va2FoZWFkVG9rZW5GaWx0ZXIpCi0KIC8qKiBBY3RzIGxpa2UgZm9yZXZlciBncm93aW5nIFRbXSwgYnV0IGludGVybmFsbHkgdXNlcyBhCiAgKiAgY2lyY3VsYXIgYnVmZmVyIHRvIHJldXNlIGluc3RhbmNlcyBvZiBULgogICogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2F1dG9tYXRvbi9TcGVjaWFsT3BlcmF0aW9ucy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9hdXRvbWF0b24vU3BlY2lhbE9wZXJhdGlvbnMuamF2YQppbmRleCAwZTZhZGY2Li5kNDc5Y2Q3IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2F1dG9tYXRvbi9TcGVjaWFsT3BlcmF0aW9ucy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvYXV0b21hdG9uL1NwZWNpYWxPcGVyYXRpb25zLmphdmEKQEAgLTIxOSw3ICsyMTksNyBAQAogICAvKioKICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFjY2VwdGVkIHN0cmluZ3MsIGFzc3VtaW5nIHRoYXQgYXQgbW9zdAogICAgKiA8Y29kZT5saW1pdDwvY29kZT4gc3RyaW5ncyBhcmUgYWNjZXB0ZWQuIElmIG1vcmUgdGhhbiA8Y29kZT5saW1pdDwvY29kZT4gCi0gICAqIHN0cmluZ3MgYXJlIGFjY2VwdGVkLCBudWxsIGlzIHJldHVybmVkLiBJZiA8Y29kZT5saW1pdDwvY29kZT4mbHQ7MCwgdGhlbiAKKyAgICogc3RyaW5ncyBhcmUgYWNjZXB0ZWQsIHRoZSBmaXJzdCBsaW1pdCBzdHJpbmdzIGZvdW5kIGFyZSByZXR1cm5lZC4gSWYgPGNvZGU+bGltaXQ8L2NvZGU+Jmx0OzAsIHRoZW4gCiAgICAqIHRoZSBsaW1pdCBpcyBpbmZpbml0ZS4KICAgICovCiAgIHB1YmxpYyBzdGF0aWMgU2V0PEludHNSZWY+IGdldEZpbml0ZVN0cmluZ3MoQXV0b21hdG9uIGEsIGludCBsaW1pdCkgewpAQCAtMjI3LDExICsyMjcsOSBAQAogICAgIGlmIChhLmlzU2luZ2xldG9uKCkpIHsKICAgICAgIGlmIChsaW1pdCA+IDApIHsKICAgICAgICAgc3RyaW5ncy5hZGQoVXRpbC50b1VURjMyKGEuc2luZ2xldG9uLCBuZXcgSW50c1JlZigpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFnZXRGaW5pdGVTdHJpbmdzKGEuaW5pdGlhbCwgbmV3IEhhc2hTZXQ8U3RhdGU+KCksIHN0cmluZ3MsIG5ldyBJbnRzUmVmKCksIGxpbWl0KSkgewotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gc3RyaW5nczsKICAgICB9CiAgICAgcmV0dXJuIHN0cmluZ3M7CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L05vZGVIYXNoLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9Ob2RlSGFzaC5qYXZhCmluZGV4IDdlMDlhNDIuLjdiNmQ3ODcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L05vZGVIYXNoLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvTm9kZUhhc2guamF2YQpAQCAtMTksMjEgKzE5LDIxIEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuR3Jvd2FibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuUGFja2VkSW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWdlZEdyb3dhYmxlV3JpdGVyOwogCiAvLyBVc2VkIHRvIGRlZHVwIHN0YXRlcyAobG9va3VwIGFscmVhZHktZnJvemVuIHN0YXRlcykKIGZpbmFsIGNsYXNzIE5vZGVIYXNoPFQ+IHsKIAotICBwcml2YXRlIEdyb3dhYmxlV3JpdGVyIHRhYmxlOwotICBwcml2YXRlIGludCBjb3VudDsKLSAgcHJpdmF0ZSBpbnQgbWFzazsKKyAgcHJpdmF0ZSBQYWdlZEdyb3dhYmxlV3JpdGVyIHRhYmxlOworICBwcml2YXRlIGxvbmcgY291bnQ7CisgIHByaXZhdGUgbG9uZyBtYXNrOwogICBwcml2YXRlIGZpbmFsIEZTVDxUPiBmc3Q7CiAgIHByaXZhdGUgZmluYWwgRlNULkFyYzxUPiBzY3JhdGNoQXJjID0gbmV3IEZTVC5BcmM8VD4oKTsKICAgcHJpdmF0ZSBmaW5hbCBGU1QuQnl0ZXNSZWFkZXIgaW47CiAKICAgcHVibGljIE5vZGVIYXNoKEZTVDxUPiBmc3QsIEZTVC5CeXRlc1JlYWRlciBpbikgewotICAgIHRhYmxlID0gbmV3IEdyb3dhYmxlV3JpdGVyKDgsIDE2LCBQYWNrZWRJbnRzLkNPTVBBQ1QpOworICAgIHRhYmxlID0gbmV3IFBhZ2VkR3Jvd2FibGVXcml0ZXIoMTYsIDE8PDMwLCA4LCBQYWNrZWRJbnRzLkNPTVBBQ1QpOwogICAgIG1hc2sgPSAxNTsKICAgICB0aGlzLmZzdCA9IGZzdDsKICAgICB0aGlzLmluID0gaW47CkBAIC02OSwxMCArNjksMTAgQEAKIAogICAvLyBoYXNoIGNvZGUgZm9yIGFuIHVuZnJvemVuIG5vZGUuICBUaGlzIG11c3QgYmUgaWRlbnRpY2FsCiAgIC8vIHRvIHRoZSB1bi1mcm96ZW4gY2FzZSAoYmVsb3cpISEKLSAgcHJpdmF0ZSBpbnQgaGFzaChCdWlsZGVyLlVuQ29tcGlsZWROb2RlPFQ+IG5vZGUpIHsKKyAgcHJpdmF0ZSBsb25nIGhhc2goQnVpbGRlci5VbkNvbXBpbGVkTm9kZTxUPiBub2RlKSB7CiAgICAgZmluYWwgaW50IFBSSU1FID0gMzE7CiAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImhhc2ggdW5mcm96ZW4iKTsKLSAgICBpbnQgaCA9IDA7CisgICAgbG9uZyBoID0gMDsKICAgICAvLyBUT0RPOiBtYXliZSBpZiBudW1iZXIgb2YgYXJjcyBpcyBoaWdoIHdlIGNhbiBzYWZlbHkgc3Vic2FtcGxlPwogICAgIGZvcihpbnQgYXJjSWR4PTA7YXJjSWR4PG5vZGUubnVtQXJjczthcmNJZHgrKykgewogICAgICAgZmluYWwgQnVpbGRlci5BcmM8VD4gYXJjID0gbm9kZS5hcmNzW2FyY0lkeF07CkBAIC04NywxNCArODcsMTQgQEAKICAgICAgIH0KICAgICB9CiAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgcmV0ICIgKyAoaCZJbnRlZ2VyLk1BWF9WQUxVRSkpOwotICAgIHJldHVybiBoICYgSW50ZWdlci5NQVhfVkFMVUU7CisgICAgcmV0dXJuIGggJiBMb25nLk1BWF9WQUxVRTsKICAgfQogCiAgIC8vIGhhc2ggY29kZSBmb3IgYSBmcm96ZW4gbm9kZQotICBwcml2YXRlIGludCBoYXNoKGxvbmcgbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBsb25nIGhhc2gobG9uZyBub2RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIGludCBQUklNRSA9IDMxOwogICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJoYXNoIGZyb3plbiBub2RlPSIgKyBub2RlKTsKLSAgICBpbnQgaCA9IDA7CisgICAgbG9uZyBoID0gMDsKICAgICBmc3QucmVhZEZpcnN0UmVhbFRhcmdldEFyYyhub2RlLCBzY3JhdGNoQXJjLCBpbik7CiAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgbGFiZWw9IiArIHNjcmF0Y2hBcmMubGFiZWwgKyAiIHRhcmdldD0iICsgc2NyYXRjaEFyYy50YXJnZXQgKyAiIGg9IiArIGggKyAiIG91dHB1dD0iICsgZnN0Lm91dHB1dHMub3V0cHV0VG9TdHJpbmcoc2NyYXRjaEFyYy5vdXRwdXQpICsgIiBuZXh0Pz0iICsgc2NyYXRjaEFyYy5mbGFnKDQpICsgIiBmaW5hbD89IiArIHNjcmF0Y2hBcmMuaXNGaW5hbCgpICsgIiBwb3M9IiArIGluLmdldFBvc2l0aW9uKCkpOwpAQCAtMTExLDEzICsxMTEsMTMgQEAKICAgICAgIGZzdC5yZWFkTmV4dFJlYWxBcmMoc2NyYXRjaEFyYywgaW4pOwogICAgIH0KICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiICByZXQgIiArIChoJkludGVnZXIuTUFYX1ZBTFVFKSk7Ci0gICAgcmV0dXJuIGggJiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICByZXR1cm4gaCAmIExvbmcuTUFYX1ZBTFVFOwogICB9CiAKICAgcHVibGljIGxvbmcgYWRkKEJ1aWxkZXIuVW5Db21waWxlZE5vZGU8VD4gbm9kZUluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGFzaDogYWRkIGNvdW50PSIgKyBjb3VudCArICIgdnMgIiArIHRhYmxlLnNpemUoKSk7Ci0gICAgZmluYWwgaW50IGggPSBoYXNoKG5vZGVJbik7Ci0gICAgaW50IHBvcyA9IGggJiBtYXNrOworICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJoYXNoOiBhZGQgY291bnQ9IiArIGNvdW50ICsgIiB2cyAiICsgdGFibGUuc2l6ZSgpICsgIiBtYXNrPSIgKyBtYXNrKTsKKyAgICBmaW5hbCBsb25nIGggPSBoYXNoKG5vZGVJbik7CisgICAgbG9uZyBwb3MgPSBoICYgbWFzazsKICAgICBpbnQgYyA9IDA7CiAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgZmluYWwgbG9uZyB2ID0gdGFibGUuZ2V0KHBvcyk7CkBAIC0xMjgsNyArMTI4LDggQEAKICAgICAgICAgYXNzZXJ0IGhhc2gobm9kZSkgPT0gaCA6ICJmcm96ZW5IYXNoPSIgKyBoYXNoKG5vZGUpICsgIiB2cyBoPSIgKyBoOwogICAgICAgICBjb3VudCsrOwogICAgICAgICB0YWJsZS5zZXQocG9zLCBub2RlKTsKLSAgICAgICAgaWYgKHRhYmxlLnNpemUoKSA8IDIqY291bnQpIHsKKyAgICAgICAgLy8gUmVoYXNoIGF0IDIvMyBvY2N1cGFuY3k6CisgICAgICAgIGlmIChjb3VudCA+IDIqdGFibGUuc2l6ZSgpLzMpIHsKICAgICAgICAgICByZWhhc2goKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbm9kZTsKQEAgLTE0NCw3ICsxNDUsNyBAQAogCiAgIC8vIGNhbGxlZCBvbmx5IGJ5IHJlaGFzaAogICBwcml2YXRlIHZvaWQgYWRkTmV3KGxvbmcgYWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgcG9zID0gaGFzaChhZGRyZXNzKSAmIG1hc2s7CisgICAgbG9uZyBwb3MgPSBoYXNoKGFkZHJlc3MpICYgbWFzazsKICAgICBpbnQgYyA9IDA7CiAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgaWYgKHRhYmxlLmdldChwb3MpID09IDApIHsKQEAgLTE1OCwyMyArMTU5LDE1IEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgcmVoYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBHcm93YWJsZVdyaXRlciBvbGRUYWJsZSA9IHRhYmxlOworICAgIGZpbmFsIFBhZ2VkR3Jvd2FibGVXcml0ZXIgb2xkVGFibGUgPSB0YWJsZTsKIAotICAgIGlmIChvbGRUYWJsZS5zaXplKCkgPj0gSW50ZWdlci5NQVhfVkFMVUUvMikgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRlNUIHRvbyBsYXJnZSAoPiAyLjEgR0IpIik7Ci0gICAgfQotCi0gICAgdGFibGUgPSBuZXcgR3Jvd2FibGVXcml0ZXIob2xkVGFibGUuZ2V0Qml0c1BlclZhbHVlKCksIDIqb2xkVGFibGUuc2l6ZSgpLCBQYWNrZWRJbnRzLkNPTVBBQ1QpOworICAgIHRhYmxlID0gbmV3IFBhZ2VkR3Jvd2FibGVXcml0ZXIoMipvbGRUYWJsZS5zaXplKCksIDE8PDMwLCBQYWNrZWRJbnRzLmJpdHNSZXF1aXJlZChjb3VudCksIFBhY2tlZEludHMuQ09NUEFDVCk7CiAgICAgbWFzayA9IHRhYmxlLnNpemUoKS0xOwotICAgIGZvcihpbnQgaWR4PTA7aWR4PG9sZFRhYmxlLnNpemUoKTtpZHgrKykgeworICAgIGZvcihsb25nIGlkeD0wO2lkeDxvbGRUYWJsZS5zaXplKCk7aWR4KyspIHsKICAgICAgIGZpbmFsIGxvbmcgYWRkcmVzcyA9IG9sZFRhYmxlLmdldChpZHgpOwogICAgICAgaWYgKGFkZHJlc3MgIT0gMCkgewogICAgICAgICBhZGROZXcoYWRkcmVzcyk7CiAgICAgICB9CiAgICAgfQogICB9Ci0KLSAgcHVibGljIGludCBjb3VudCgpIHsKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1Bvc2l0aXZlSW50T3V0cHV0cy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvUG9zaXRpdmVJbnRPdXRwdXRzLmphdmEKaW5kZXggMjQ2MGYyNS4uZDEzNjQ4YSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvUG9zaXRpdmVJbnRPdXRwdXRzLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvUG9zaXRpdmVJbnRPdXRwdXRzLmphdmEKQEAgLTMzLDI2ICszMywxMyBAQAogICAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9uZyBOT19PVVRQVVQgPSBuZXcgTG9uZygwKTsKIAotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZG9TaGFyZTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUG9zaXRpdmVJbnRPdXRwdXRzIHNpbmdsZXRvbiA9IG5ldyBQb3NpdGl2ZUludE91dHB1dHMoKTsKIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQb3NpdGl2ZUludE91dHB1dHMgc2luZ2xldG9uU2hhcmUgPSBuZXcgUG9zaXRpdmVJbnRPdXRwdXRzKHRydWUpOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQb3NpdGl2ZUludE91dHB1dHMgc2luZ2xldG9uTm9TaGFyZSA9IG5ldyBQb3NpdGl2ZUludE91dHB1dHMoZmFsc2UpOwotCi0gIHByaXZhdGUgUG9zaXRpdmVJbnRPdXRwdXRzKGJvb2xlYW4gZG9TaGFyZSkgewotICAgIHRoaXMuZG9TaGFyZSA9IGRvU2hhcmU7CisgIHByaXZhdGUgUG9zaXRpdmVJbnRPdXRwdXRzKCkgewogICB9CiAKLSAgLyoqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIFBvc2l0aXZlSW50T3V0cHV0cy4gKi8KICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludE91dHB1dHMgZ2V0U2luZ2xldG9uKCkgewotICAgIHJldHVybiBnZXRTaW5nbGV0b24odHJ1ZSk7Ci0gIH0KLQotICAvKiogRXhwZXJ0OiBwYXNzIGRvU2hhcmU9ZmFsc2UgdG8gZGlzYWJsZSBvdXRwdXQgc2hhcmluZy4KLSAgICogIEluIHNvbWUgY2FzZXMgdGhpcyBtYXkgcmVzdWx0IGluIGEgc21hbGxlciBGU1QsCi0gICAqICBob3dldmVyIGl0IHdpbGwgYWxzbyBicmVhayBtZXRob2RzIGxpa2Uge0BsaW5rCi0gICAqICBVdGlsI2dldEJ5T3V0cHV0fSBhbmQge0BsaW5rIFV0aWwjc2hvcnRlc3RQYXRoc30uICovCi0gIHB1YmxpYyBzdGF0aWMgUG9zaXRpdmVJbnRPdXRwdXRzIGdldFNpbmdsZXRvbihib29sZWFuIGRvU2hhcmUpIHsKLSAgICByZXR1cm4gZG9TaGFyZSA/IHNpbmdsZXRvblNoYXJlIDogc2luZ2xldG9uTm9TaGFyZTsKKyAgICByZXR1cm4gc2luZ2xldG9uOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC02MSwxNCArNDgsMTAgQEAKICAgICBhc3NlcnQgdmFsaWQob3V0cHV0Mik7CiAgICAgaWYgKG91dHB1dDEgPT0gTk9fT1VUUFVUIHx8IG91dHB1dDIgPT0gTk9fT1VUUFVUKSB7CiAgICAgICByZXR1cm4gTk9fT1VUUFVUOwotICAgIH0gZWxzZSBpZiAoZG9TaGFyZSkgeworICAgIH0gZWxzZSB7CiAgICAgICBhc3NlcnQgb3V0cHV0MSA+IDA7CiAgICAgICBhc3NlcnQgb3V0cHV0MiA+IDA7CiAgICAgICByZXR1cm4gTWF0aC5taW4ob3V0cHV0MSwgb3V0cHV0Mik7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXQxLmVxdWFscyhvdXRwdXQyKSkgewotICAgICAgcmV0dXJuIG91dHB1dDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBOT19PVVRQVVQ7CiAgICAgfQogICB9CiAKQEAgLTEzNCw2ICsxMTcsNiBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAiUG9zaXRpdmVJbnRPdXRwdXRzKGRvU2hhcmU9IiArIGRvU2hhcmUgKyAiKSI7CisgICAgcmV0dXJuICJQb3NpdGl2ZUludE91dHB1dHMiOwogICB9CiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9VdGlsLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9VdGlsLmphdmEKaW5kZXggMjZhYTY5YS4uMmE1NmI0MCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvVXRpbC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1V0aWwuamF2YQpAQCAtOTMsOSArOTMsNyBAQAogICAgKgogICAgKiAgPHA+Tk9URTogdGhpcyBvbmx5IHdvcmtzIHdpdGgge0Bjb2RlIEZTVDxMb25nPn0sIG9ubHkKICAgICogIHdvcmtzIHdoZW4gdGhlIG91dHB1dHMgYXJlIGFzY2VuZGluZyBpbiBvcmRlciB3aXRoCi0gICAqICB0aGUgaW5wdXRzIGFuZCBvbmx5IHdvcmtzIHdoZW4geW91IHNoYXJlZAotICAgKiAgdGhlIG91dHB1dHMgKHBhc3MgZG9TaGFyZT10cnVlIHRvIHtAbGluawotICAgKiAgUG9zaXRpdmVJbnRPdXRwdXRzI2dldFNpbmdsZXRvbn0pLgorICAgKiAgdGhlIGlucHV0cy4KICAgICogIEZvciBleGFtcGxlLCBzaW1wbGUgb3JkaW5hbHMgKDAsIDEsCiAgICAqICAyLCAuLi4pLCBvciBmaWxlIG9mZmV0cyAod2hlbiBhcHBlbmRpbmcgdG8gYSBmaWxlKQogICAgKiAgZml0IHRoaXMuICovCkBAIC01MTcsMTEgKzUxNSw3IEBACiAgIH0KIAogICAvKiogU3RhcnRpbmcgZnJvbSBub2RlLCBmaW5kIHRoZSB0b3AgTiBtaW4gY29zdCAKLSAgICogIGNvbXBsZXRpb25zIHRvIGEgZmluYWwgbm9kZS4KLSAgICoKLSAgICogIDxwPk5PVEU6IHlvdSBtdXN0IHNoYXJlIHRoZSBvdXRwdXRzIHdoZW4geW91IGJ1aWxkIHRoZQotICAgKiAgRlNUIChwYXNzIGRvU2hhcmU9dHJ1ZSB0byB7QGxpbmsKLSAgICogIFBvc2l0aXZlSW50T3V0cHV0cyNnZXRTaW5nbGV0b259KS4gKi8KKyAgICogIGNvbXBsZXRpb25zIHRvIGEgZmluYWwgbm9kZS4gKi8KICAgcHVibGljIHN0YXRpYyA8VD4gTWluUmVzdWx0PFQ+W10gc2hvcnRlc3RQYXRocyhGU1Q8VD4gZnN0LCBGU1QuQXJjPFQ+IGZyb21Ob2RlLCBUIHN0YXJ0T3V0cHV0LCBDb21wYXJhdG9yPFQ+IGNvbXBhcmF0b3IsIGludCB0b3BOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dFbXB0eVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIApAQCAtODE0LDcgKzgwOCw3IEBACiAgICAgZmluYWwgaW50IGNoYXJMaW1pdCA9IG9mZnNldCArIGxlbmd0aDsKICAgICB3aGlsZShjaGFySWR4IDwgY2hhckxpbWl0KSB7CiAgICAgICBzY3JhdGNoLmdyb3coaW50SWR4KzEpOwotICAgICAgZmluYWwgaW50IHV0ZjMyID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KHMsIGNoYXJJZHgpOworICAgICAgZmluYWwgaW50IHV0ZjMyID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KHMsIGNoYXJJZHgsIGNoYXJMaW1pdCk7CiAgICAgICBzY3JhdGNoLmludHNbaW50SWR4XSA9IHV0ZjMyOwogICAgICAgY2hhcklkeCArPSBDaGFyYWN0ZXIuY2hhckNvdW50KHV0ZjMyKTsKICAgICAgIGludElkeCsrOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvcGFja2FnZS5odG1sIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvcGFja2FnZS5odG1sCmluZGV4IDkzYzE2ZTEuLmRmZDQyYTMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L3BhY2thZ2UuaHRtbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9wYWNrYWdlLmh0bWwKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBTdHJpbmcgaW5wdXRWYWx1ZXNbXSA9IHsiY2F0IiwgImRvZyIsICJkb2dzIn07CiAgICAgbG9uZyBvdXRwdXRWYWx1ZXNbXSA9IHs1LCA3LCAxMn07CiAgICAgCi0gICAgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHRydWUpOworICAgIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgIEJ1aWxkZXImbHQ7TG9uZyZndDsgYnVpbGRlciA9IG5ldyBCdWlsZGVyJmx0O0xvbmcmZ3Q7KElOUFVUX1RZUEUuQllURTEsIG91dHB1dHMpOwogICAgIEJ5dGVzUmVmIHNjcmF0Y2hCeXRlcyA9IG5ldyBCeXRlc1JlZigpOwogICAgIEludHNSZWYgc2NyYXRjaEludHMgPSBuZXcgSW50c1JlZigpOwpAQCAtNjAsOCArNjAsNyBAQAogPC9wcmU+CiBSZXRyaWV2YWwgYnkgdmFsdWU6CiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+Ci0gICAgLy8gT25seSB3b3JrcyBiZWNhdXNlIG91dHB1dHMgYXJlIGFsc28gaW4gc29ydGVkIG9yZGVyLCBhbmQKLSAgICAvLyB3ZSBwYXNzZWQgJ3RydWUnIGZvciBzaGFyaW5nIHRvIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24KKyAgICAvLyBPbmx5IHdvcmtzIGJlY2F1c2Ugb3V0cHV0cyBhcmUgYWxzbyBpbiBzb3J0ZWQgb3JkZXIKICAgICBJbnRzUmVmIGtleSA9IFV0aWwuZ2V0QnlPdXRwdXQoZnN0LCAxMik7CiAgICAgU3lzdGVtLm91dC5wcmludGxuKFV0aWwudG9CeXRlc1JlZihrZXksIHNjcmF0Y2hCeXRlcykudXRmOFRvU3RyaW5nKCkpOyAvLyBkb2dzCiA8L3ByZT4KQEAgLTc3LDcgKzc2LDYgQEAKIDwvcHJlPgogTi1zaG9ydGVzdCBwYXRocyBieSB3ZWlnaHQ6CiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+Ci0gICAgLy8gT25seSB3b3JrcyBiZWNhdXNlIHdlIHBhc3NlZCAndHJ1ZScgZm9yIHNoYXJpbmcgdG8gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbgogICAgIENvbXBhcmF0b3ImbHQ7TG9uZyZndDsgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yJmx0O0xvbmcmZ3Q7KCkgewogICAgICAgcHVibGljIGludCBjb21wYXJlKExvbmcgbGVmdCwgTG9uZyByaWdodCkgewogICAgICAgICByZXR1cm4gbGVmdC5jb21wYXJlVG8ocmlnaHQpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQWJzdHJhY3RBcHBlbmRpbmdMb25nQnVmZmVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdEFwcGVuZGluZ0xvbmdCdWZmZXIuamF2YQppbmRleCAwODcxNTRkLi43ODM4MWU5IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdEFwcGVuZGluZ0xvbmdCdWZmZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdEFwcGVuZGluZ0xvbmdCdWZmZXIuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLmNoZWNrQmxvY2tTaXplOworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQXJyYXlVdGlsOwpAQCAtMjUsMzMgKzI3LDM3IEBACiAvKiogQ29tbW9uIGZ1bmN0aW9uYWxpdHkgc2hhcmVkIGJ5IHtAbGluayBBcHBlbmRpbmdMb25nQnVmZmVyfSBhbmQge0BsaW5rIE1vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXJ9LiAqLwogYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBlbmRpbmdMb25nQnVmZmVyIHsKIAotICBzdGF0aWMgZmluYWwgaW50IEJMT0NLX0JJVFMgPSAxMDsKLSAgc3RhdGljIGZpbmFsIGludCBNQVhfUEVORElOR19DT1VOVCA9IDEgPDwgQkxPQ0tfQklUUzsKLSAgc3RhdGljIGZpbmFsIGludCBCTE9DS19NQVNLID0gTUFYX1BFTkRJTkdfQ09VTlQgLSAxOworICBzdGF0aWMgZmluYWwgaW50IE1JTl9QQUdFX1NJWkUgPSA2NDsKKyAgLy8gTW9yZSB0aGFuIDFNIGRvZXNuJ3QgcmVhbGx5IG1ha2VzIHNlbnNlIHdpdGggdGhlc2UgYXBwZW5kaW5nIGJ1ZmZlcnMKKyAgLy8gc2luY2UgdGhlaXIgZ29hbCBpcyB0byB0cnkgdG8gaGF2ZSBzbWFsbCBudW1iZXJzIG9mIGJpdHMgcGVyIHZhbHVlCisgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BBR0VfU0laRSA9IDEgPDwgMjA7CiAKKyAgZmluYWwgaW50IHBhZ2VTaGlmdCwgcGFnZU1hc2s7CiAgIGxvbmdbXSBtaW5WYWx1ZXM7CiAgIFBhY2tlZEludHMuUmVhZGVyW10gZGVsdGFzOwogICBwcml2YXRlIGxvbmcgZGVsdGFzQnl0ZXM7CiAgIGludCB2YWx1ZXNPZmY7Ci0gIGxvbmdbXSBwZW5kaW5nOworICBmaW5hbCBsb25nW10gcGVuZGluZzsKICAgaW50IHBlbmRpbmdPZmY7CiAKLSAgQWJzdHJhY3RBcHBlbmRpbmdMb25nQnVmZmVyKGludCBpbml0aWFsQmxvY2tDb3VudCkgewotICAgIG1pblZhbHVlcyA9IG5ldyBsb25nWzE2XTsKLSAgICBkZWx0YXMgPSBuZXcgUGFja2VkSW50cy5SZWFkZXJbMTZdOwotICAgIHBlbmRpbmcgPSBuZXcgbG9uZ1tNQVhfUEVORElOR19DT1VOVF07CisgIEFic3RyYWN0QXBwZW5kaW5nTG9uZ0J1ZmZlcihpbnQgaW5pdGlhbEJsb2NrQ291bnQsIGludCBwYWdlU2l6ZSkgeworICAgIG1pblZhbHVlcyA9IG5ldyBsb25nW2luaXRpYWxCbG9ja0NvdW50XTsKKyAgICBkZWx0YXMgPSBuZXcgUGFja2VkSW50cy5SZWFkZXJbaW5pdGlhbEJsb2NrQ291bnRdOworICAgIHBlbmRpbmcgPSBuZXcgbG9uZ1twYWdlU2l6ZV07CisgICAgcGFnZVNoaWZ0ID0gY2hlY2tCbG9ja1NpemUocGFnZVNpemUsIE1JTl9QQUdFX1NJWkUsIE1BWF9QQUdFX1NJWkUpOworICAgIHBhZ2VNYXNrID0gcGFnZVNpemUgLSAxOwogICAgIHZhbHVlc09mZiA9IDA7CiAgICAgcGVuZGluZ09mZiA9IDA7CiAgIH0KIAogICAvKiogR2V0IHRoZSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBidWZmZXIuICovCiAgIHB1YmxpYyBmaW5hbCBsb25nIHNpemUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlc09mZiAqIChsb25nKSBNQVhfUEVORElOR19DT1VOVCArIHBlbmRpbmdPZmY7CisgICAgcmV0dXJuIHZhbHVlc09mZiAqIChsb25nKSBwZW5kaW5nLmxlbmd0aCArIHBlbmRpbmdPZmY7CiAgIH0KIAogICAvKiogQXBwZW5kIGEgdmFsdWUgdG8gdGhpcyBidWZmZXIuICovCiAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChsb25nIGwpIHsKLSAgICBpZiAocGVuZGluZ09mZiA9PSBNQVhfUEVORElOR19DT1VOVCkgeworICAgIGlmIChwZW5kaW5nT2ZmID09IHBlbmRpbmcubGVuZ3RoKSB7CiAgICAgICAvLyBjaGVjayBzaXplCiAgICAgICBpZiAoZGVsdGFzLmxlbmd0aCA9PSB2YWx1ZXNPZmYpIHsKICAgICAgICAgZmluYWwgaW50IG5ld0xlbmd0aCA9IEFycmF5VXRpbC5vdmVyc2l6ZSh2YWx1ZXNPZmYgKyAxLCA4KTsKQEAgLTgwLDggKzg2LDggQEAKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkgewogICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIiIgKyBpbmRleCk7CiAgICAgfQotICAgIGludCBibG9jayA9IChpbnQpIChpbmRleCA+PiBCTE9DS19CSVRTKTsKLSAgICBpbnQgZWxlbWVudCA9IChpbnQpIChpbmRleCAmIEJMT0NLX01BU0spOworICAgIGZpbmFsIGludCBibG9jayA9IChpbnQpIChpbmRleCA+PiBwYWdlU2hpZnQpOworICAgIGZpbmFsIGludCBlbGVtZW50ID0gKGludCkgKGluZGV4ICYgcGFnZU1hc2spOwogICAgIHJldHVybiBnZXQoYmxvY2ssIGVsZW1lbnQpOwogICB9CiAKQEAgLTk5LDcgKzEwNSw3IEBACiAgICAgICBpZiAodmFsdWVzT2ZmID09IDApIHsKICAgICAgICAgY3VycmVudFZhbHVlcyA9IHBlbmRpbmc7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjdXJyZW50VmFsdWVzID0gbmV3IGxvbmdbTUFYX1BFTkRJTkdfQ09VTlRdOworICAgICAgICBjdXJyZW50VmFsdWVzID0gbmV3IGxvbmdbcGVuZGluZy5sZW5ndGhdOwogICAgICAgICBmaWxsVmFsdWVzKCk7CiAgICAgICB9CiAgICAgfQpAQCAtMTE1LDcgKzEyMSw3IEBACiAgICAgcHVibGljIGZpbmFsIGxvbmcgbmV4dCgpIHsKICAgICAgIGFzc2VydCBoYXNOZXh0KCk7CiAgICAgICBsb25nIHJlc3VsdCA9IGN1cnJlbnRWYWx1ZXNbcE9mZisrXTsKLSAgICAgIGlmIChwT2ZmID09IE1BWF9QRU5ESU5HX0NPVU5UKSB7CisgICAgICBpZiAocE9mZiA9PSBwZW5kaW5nLmxlbmd0aCkgewogICAgICAgICB2T2ZmICs9IDE7CiAgICAgICAgIHBPZmYgPSAwOwogICAgICAgICBpZiAodk9mZiA8PSB2YWx1ZXNPZmYpIHsKQEAgLTEzOSw2ICsxNDUsNyBAQAogICBwdWJsaWMgbG9uZyByYW1CeXRlc1VzZWQoKSB7CiAgICAgLy8gVE9ETzogdGhpcyBpcyBjYWxsZWQgcGVyLWRvYy1wZXItbm9ybXMvZHYtZmllbGQsIGNhbiB3ZSBvcHRpbWl6ZSB0aGlzPwogICAgIGxvbmcgYnl0ZXNVc2VkID0gUmFtVXNhZ2VFc3RpbWF0b3IuYWxpZ25PYmplY3RTaXplKGJhc2VSYW1CeXRlc1VzZWQoKSkKKyAgICAgICAgKyAyICogUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX0lOVCAvLyBwYWdlU2hpZnQsIHBhZ2VNYXNrCiAgICAgICAgICsgUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX0xPTkcgLy8gdmFsdWVzQnl0ZXMKICAgICAgICAgKyBSYW1Vc2FnZUVzdGltYXRvci5zaXplT2YocGVuZGluZykKICAgICAgICAgKyBSYW1Vc2FnZUVzdGltYXRvci5zaXplT2YobWluVmFsdWVzKQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQWJzdHJhY3RCbG9ja1BhY2tlZFdyaXRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQWJzdHJhY3RCbG9ja1BhY2tlZFdyaXRlci5qYXZhCmluZGV4IDZiMTZjODYuLjY3YzhkNGIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0Fic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdEJsb2NrUGFja2VkV3JpdGVyLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuUGFja2VkSW50cy5jaGVja0Jsb2NrU2l6ZTsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMjQsMjIgKzI2LDExIEBACiAKIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIgewogCisgIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0JMT0NLX1NJWkUgPSA2NDsKICAgc3RhdGljIGZpbmFsIGludCBNQVhfQkxPQ0tfU0laRSA9IDEgPDwgKDMwIC0gMyk7CiAgIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZBTFVFX0VRVUFMU18wID0gMSA8PCAwOwogICBzdGF0aWMgZmluYWwgaW50IEJQVl9TSElGVCA9IDE7CiAKLSAgc3RhdGljIHZvaWQgY2hlY2tCbG9ja1NpemUoaW50IGJsb2NrU2l6ZSkgewotICAgIGlmIChibG9ja1NpemUgPD0gMCB8fCBibG9ja1NpemUgPiBNQVhfQkxPQ0tfU0laRSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmxvY2tTaXplIG11c3QgYmUgPiAwIGFuZCA8ICIgKyBNQVhfQkxPQ0tfU0laRSArICIsIGdvdCAiICsgYmxvY2tTaXplKTsKLSAgICB9Ci0gICAgaWYgKGJsb2NrU2l6ZSA8IDY0KSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJibG9ja1NpemUgbXVzdCBiZSA+PSA2NCwgZ290ICIgKyBibG9ja1NpemUpOwotICAgIH0KLSAgICBpZiAoKGJsb2NrU2l6ZSAmIChibG9ja1NpemUgLSAxKSkgIT0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmxvY2tTaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGdvdCAiICsgYmxvY2tTaXplKTsKLSAgICB9Ci0gIH0KLQogICBzdGF0aWMgbG9uZyB6aWdaYWdFbmNvZGUobG9uZyBuKSB7CiAgICAgcmV0dXJuIChuID4+IDYzKSBeIChuIDw8IDEpOwogICB9CkBAIC02Niw3ICs1Nyw3IEBACiAgICAqIEBwYXJhbSBibG9ja1NpemUgdGhlIG51bWJlciBvZiB2YWx1ZXMgb2YgYSBzaW5nbGUgYmxvY2ssIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA8dHQ+NjQ8L3R0PgogICAgKi8KICAgcHVibGljIEFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIoRGF0YU91dHB1dCBvdXQsIGludCBibG9ja1NpemUpIHsKLSAgICBjaGVja0Jsb2NrU2l6ZShibG9ja1NpemUpOworICAgIGNoZWNrQmxvY2tTaXplKGJsb2NrU2l6ZSwgTUlOX0JMT0NLX1NJWkUsIE1BWF9CTE9DS19TSVpFKTsKICAgICByZXNldChvdXQpOwogICAgIHZhbHVlcyA9IG5ldyBsb25nW2Jsb2NrU2l6ZV07CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0Fic3RyYWN0UGFnZWRNdXRhYmxlLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdFBhZ2VkTXV0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzQxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BYnN0cmFjdFBhZ2VkTXV0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLmNoZWNrQmxvY2tTaXplOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLm51bUJsb2NrczsKKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQXJyYXlVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuUmFtVXNhZ2VFc3RpbWF0b3I7CisKKy8qKgorICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIFBhZ2VkTXV0YWJsZX0gYW5kIHtAbGluayBQYWdlZEdyb3dhYmxlV3JpdGVyfS4KKyAqIEBsdWNlbmUuaW50ZXJuYWwKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYWdlZE11dGFibGU8VCBleHRlbmRzIEFic3RyYWN0UGFnZWRNdXRhYmxlPFQ+PiB7CisKKyAgc3RhdGljIGZpbmFsIGludCBNSU5fQkxPQ0tfU0laRSA9IDEgPDwgNjsKKyAgc3RhdGljIGZpbmFsIGludCBNQVhfQkxPQ0tfU0laRSA9IDEgPDwgMzA7CisKKyAgZmluYWwgbG9uZyBzaXplOworICBmaW5hbCBpbnQgcGFnZVNoaWZ0OworICBmaW5hbCBpbnQgcGFnZU1hc2s7CisgIGZpbmFsIFBhY2tlZEludHMuTXV0YWJsZVtdIHN1Yk11dGFibGVzOworICBmaW5hbCBpbnQgYml0c1BlclZhbHVlOworCisgIEFic3RyYWN0UGFnZWRNdXRhYmxlKGludCBiaXRzUGVyVmFsdWUsIGxvbmcgc2l6ZSwgaW50IHBhZ2VTaXplKSB7CisgICAgdGhpcy5iaXRzUGVyVmFsdWUgPSBiaXRzUGVyVmFsdWU7CisgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICBwYWdlU2hpZnQgPSBjaGVja0Jsb2NrU2l6ZShwYWdlU2l6ZSwgTUlOX0JMT0NLX1NJWkUsIE1BWF9CTE9DS19TSVpFKTsKKyAgICBwYWdlTWFzayA9IHBhZ2VTaXplIC0gMTsKKyAgICBmaW5hbCBpbnQgbnVtUGFnZXMgPSBudW1CbG9ja3Moc2l6ZSwgcGFnZVNpemUpOworICAgIHN1Yk11dGFibGVzID0gbmV3IFBhY2tlZEludHMuTXV0YWJsZVtudW1QYWdlc107CisgIH0KKworICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaWxsUGFnZXMoKSB7CisgICAgZmluYWwgaW50IG51bVBhZ2VzID0gbnVtQmxvY2tzKHNpemUsIHBhZ2VTaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGFnZXM7ICsraSkgeworICAgICAgLy8gZG8gbm90IGFsbG9jYXRlIGZvciBtb3JlIGVudHJpZXMgdGhhbiBuZWNlc3Nhcnkgb24gdGhlIGxhc3QgcGFnZQorICAgICAgZmluYWwgaW50IHZhbHVlQ291bnQgPSBpID09IG51bVBhZ2VzIC0gMSA/IGxhc3RQYWdlU2l6ZShzaXplKSA6IHBhZ2VTaXplKCk7CisgICAgICBzdWJNdXRhYmxlc1tpXSA9IG5ld011dGFibGUodmFsdWVDb3VudCwgYml0c1BlclZhbHVlKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgUGFja2VkSW50cy5NdXRhYmxlIG5ld011dGFibGUoaW50IHZhbHVlQ291bnQsIGludCBiaXRzUGVyVmFsdWUpOworCisgIGZpbmFsIGludCBsYXN0UGFnZVNpemUobG9uZyBzaXplKSB7CisgICAgZmluYWwgaW50IHN6ID0gaW5kZXhJblBhZ2Uoc2l6ZSk7CisgICAgcmV0dXJuIHN6ID09IDAgPyBwYWdlU2l6ZSgpIDogc3o7CisgIH0KKworICBmaW5hbCBpbnQgcGFnZVNpemUoKSB7CisgICAgcmV0dXJuIHBhZ2VNYXNrICsgMTsKKyAgfQorCisgIC8qKiBUaGUgbnVtYmVyIG9mIHZhbHVlcy4gKi8KKyAgcHVibGljIGZpbmFsIGxvbmcgc2l6ZSgpIHsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIGZpbmFsIGludCBwYWdlSW5kZXgobG9uZyBpbmRleCkgeworICAgIHJldHVybiAoaW50KSAoaW5kZXggPj4+IHBhZ2VTaGlmdCk7CisgIH0KKworICBmaW5hbCBpbnQgaW5kZXhJblBhZ2UobG9uZyBpbmRleCkgeworICAgIHJldHVybiAoaW50KSBpbmRleCAmIHBhZ2VNYXNrOworICB9CisKKyAgLyoqIEdldCB2YWx1ZSBhdCA8Y29kZT5pbmRleDwvY29kZT4uICovCisgIHB1YmxpYyBmaW5hbCBsb25nIGdldChsb25nIGluZGV4KSB7CisgICAgYXNzZXJ0IGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplOworICAgIGZpbmFsIGludCBwYWdlSW5kZXggPSBwYWdlSW5kZXgoaW5kZXgpOworICAgIGZpbmFsIGludCBpbmRleEluUGFnZSA9IGluZGV4SW5QYWdlKGluZGV4KTsKKyAgICByZXR1cm4gc3ViTXV0YWJsZXNbcGFnZUluZGV4XS5nZXQoaW5kZXhJblBhZ2UpOworICB9CisKKyAgLyoqIFNldCB2YWx1ZSBhdCA8Y29kZT5pbmRleDwvY29kZT4uICovCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChsb25nIGluZGV4LCBsb25nIHZhbHVlKSB7CisgICAgYXNzZXJ0IGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplOworICAgIGZpbmFsIGludCBwYWdlSW5kZXggPSBwYWdlSW5kZXgoaW5kZXgpOworICAgIGZpbmFsIGludCBpbmRleEluUGFnZSA9IGluZGV4SW5QYWdlKGluZGV4KTsKKyAgICBzdWJNdXRhYmxlc1twYWdlSW5kZXhdLnNldChpbmRleEluUGFnZSwgdmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIGxvbmcgYmFzZVJhbUJ5dGVzVXNlZCgpIHsKKyAgICByZXR1cm4gUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX09CSkVDVF9IRUFERVIKKyAgICAgICAgKyBSYW1Vc2FnZUVzdGltYXRvci5OVU1fQllURVNfT0JKRUNUX1JFRgorICAgICAgICArIFJhbVVzYWdlRXN0aW1hdG9yLk5VTV9CWVRFU19MT05HCisgICAgICAgICsgMyAqIFJhbVVzYWdlRXN0aW1hdG9yLk5VTV9CWVRFU19JTlQ7CisgIH0KKworICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGlzIG9iamVjdC4gKi8KKyAgcHVibGljIGxvbmcgcmFtQnl0ZXNVc2VkKCkgeworICAgIGxvbmcgYnl0ZXNVc2VkID0gUmFtVXNhZ2VFc3RpbWF0b3IuYWxpZ25PYmplY3RTaXplKGJhc2VSYW1CeXRlc1VzZWQoKSk7CisgICAgYnl0ZXNVc2VkICs9IFJhbVVzYWdlRXN0aW1hdG9yLmFsaWduT2JqZWN0U2l6ZShSYW1Vc2FnZUVzdGltYXRvci5OVU1fQllURVNfQVJSQVlfSEVBREVSICsgKGxvbmcpIFJhbVVzYWdlRXN0aW1hdG9yLk5VTV9CWVRFU19PQkpFQ1RfUkVGICogc3ViTXV0YWJsZXMubGVuZ3RoKTsKKyAgICBmb3IgKFBhY2tlZEludHMuTXV0YWJsZSBndyA6IHN1Yk11dGFibGVzKSB7CisgICAgICBieXRlc1VzZWQgKz0gZ3cucmFtQnl0ZXNVc2VkKCk7CisgICAgfQorICAgIHJldHVybiBieXRlc1VzZWQ7CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBuZXdVbmZpbGxlZENvcHkobG9uZyBuZXdTaXplKTsKKworICAvKiogQ3JlYXRlIGEgbmV3IGNvcHkgb2Ygc2l6ZSA8Y29kZT5uZXdTaXplPC9jb2RlPiBiYXNlZCBvbiB0aGUgY29udGVudCBvZgorICAgKiAgdGhpcyBidWZmZXIuIFRoaXMgbWV0aG9kIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBjcmVhdGluZyBhIG5ldworICAgKiAgaW5zdGFuY2UgYW5kIGNvcHlpbmcgdmFsdWVzIG9uZSBieSBvbmUuICovCisgIHB1YmxpYyBmaW5hbCBUIHJlc2l6ZShsb25nIG5ld1NpemUpIHsKKyAgICBmaW5hbCBUIGNvcHkgPSBuZXdVbmZpbGxlZENvcHkobmV3U2l6ZSk7CisgICAgZmluYWwgaW50IG51bUNvbW1vblBhZ2VzID0gTWF0aC5taW4oY29weS5zdWJNdXRhYmxlcy5sZW5ndGgsIHN1Yk11dGFibGVzLmxlbmd0aCk7CisgICAgZmluYWwgbG9uZ1tdIGNvcHlCdWZmZXIgPSBuZXcgbG9uZ1sxMDI0XTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvcHkuc3ViTXV0YWJsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gaSA9PSBjb3B5LnN1Yk11dGFibGVzLmxlbmd0aCAtIDEgPyBsYXN0UGFnZVNpemUobmV3U2l6ZSkgOiBwYWdlU2l6ZSgpOworICAgICAgZmluYWwgaW50IGJwdiA9IGkgPCBudW1Db21tb25QYWdlcyA/IHN1Yk11dGFibGVzW2ldLmdldEJpdHNQZXJWYWx1ZSgpIDogdGhpcy5iaXRzUGVyVmFsdWU7CisgICAgICBjb3B5LnN1Yk11dGFibGVzW2ldID0gbmV3TXV0YWJsZSh2YWx1ZUNvdW50LCBicHYpOworICAgICAgaWYgKGkgPCBudW1Db21tb25QYWdlcykgeworICAgICAgICBmaW5hbCBpbnQgY29weUxlbmd0aCA9IE1hdGgubWluKHZhbHVlQ291bnQsIHN1Yk11dGFibGVzW2ldLnNpemUoKSk7CisgICAgICAgIFBhY2tlZEludHMuY29weShzdWJNdXRhYmxlc1tpXSwgMCwgY29weS5zdWJNdXRhYmxlc1tpXSwgMCwgY29weUxlbmd0aCwgY29weUJ1ZmZlcik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3B5OworICB9CisKKyAgLyoqIFNpbWlsYXIgdG8ge0BsaW5rIEFycmF5VXRpbCNncm93KGxvbmdbXSwgaW50KX0uICovCisgIHB1YmxpYyBmaW5hbCBUIGdyb3cobG9uZyBtaW5TaXplKSB7CisgICAgYXNzZXJ0IG1pblNpemUgPj0gMDsKKyAgICBpZiAobWluU2l6ZSA8PSBzaXplKCkpIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgZmluYWwgVCByZXN1bHQgPSAoVCkgdGhpczsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGxvbmcgZXh0cmEgPSBtaW5TaXplID4+PiAzOworICAgIGlmIChleHRyYSA8IDMpIHsKKyAgICAgIGV4dHJhID0gMzsKKyAgICB9CisgICAgZmluYWwgbG9uZyBuZXdTaXplID0gbWluU2l6ZSArIGV4dHJhOworICAgIHJldHVybiByZXNpemUobmV3U2l6ZSk7CisgIH0KKworICAvKiogU2ltaWxhciB0byB7QGxpbmsgQXJyYXlVdGlsI2dyb3cobG9uZ1tdKX0uICovCisgIHB1YmxpYyBmaW5hbCBUIGdyb3coKSB7CisgICAgcmV0dXJuIGdyb3coc2l6ZSgpICsgMSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKHNpemU9IiArIHNpemUoKSArICIscGFnZVNpemU9IiArIHBhZ2VTaXplKCkgKyAiKSI7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQXBwZW5kaW5nTG9uZ0J1ZmZlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQXBwZW5kaW5nTG9uZ0J1ZmZlci5qYXZhCmluZGV4IDk3OGZjMzIuLjJjMjk3MjkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0FwcGVuZGluZ0xvbmdCdWZmZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9BcHBlbmRpbmdMb25nQnVmZmVyLmphdmEKQEAgLTI3LDkgKzI3LDE2IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBBcHBlbmRpbmdMb25nQnVmZmVyIGV4dGVuZHMgQWJzdHJhY3RBcHBlbmRpbmdMb25nQnVmZmVyIHsKIAotICAvKiogU29sZSBjb25zdHJ1Y3Rvci4gKi8KKyAgLyoqIEBwYXJhbSBpbml0aWFsUGFnZUNvdW50IHRoZSBpbml0aWFsIG51bWJlciBvZiBwYWdlcworICAgKiAgQHBhcmFtIHBhZ2VTaXplICAgICAgICAgdGhlIHNpemUgb2YgYSBzaW5nbGUgcGFnZSAqLworICBwdWJsaWMgQXBwZW5kaW5nTG9uZ0J1ZmZlcihpbnQgaW5pdGlhbFBhZ2VDb3VudCwgaW50IHBhZ2VTaXplKSB7CisgICAgc3VwZXIoaW5pdGlhbFBhZ2VDb3VudCwgcGFnZVNpemUpOworICB9CisKKyAgLyoqIENyZWF0ZSBhbiB7QGxpbmsgQXBwZW5kaW5nTG9uZ0J1ZmZlcn0gd2l0aCBpbml0aWFsUGFnZUNvdW50PTE2IGFuZAorICAgKiAgcGFnZVNpemU9MTAyNC4gKi8KICAgcHVibGljIEFwcGVuZGluZ0xvbmdCdWZmZXIoKSB7Ci0gICAgc3VwZXIoMTYpOworICAgIHRoaXMoMTYsIDEwMjQpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC00Myw4ICs1MCw5IEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHZvaWQgcGFja1BlbmRpbmdWYWx1ZXMoKSB7Ci0gICAgYXNzZXJ0IHBlbmRpbmdPZmYgPT0gTUFYX1BFTkRJTkdfQ09VTlQ7CisgICAgYXNzZXJ0IHBlbmRpbmdPZmYgPT0gcGVuZGluZy5sZW5ndGg7CiAKICAgICAvLyBjb21wdXRlIG1heCBkZWx0YQogICAgIGxvbmcgbWluVmFsdWUgPSBwZW5kaW5nWzBdOwpAQCAtNzEsNiArNzksNyBAQAogICB9CiAKICAgLyoqIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgdGhpcyBidWZmZXIuICovCisgIEBPdmVycmlkZQogICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CiAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpOwogICB9CkBAIC03OCwyMCArODcsMjEgQEAKICAgLyoqIEEgbG9uZyBpdGVyYXRvci4gKi8KICAgcHVibGljIGZpbmFsIGNsYXNzIEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RBcHBlbmRpbmdMb25nQnVmZmVyLkl0ZXJhdG9yIHsKIAotICAgIHByaXZhdGUgSXRlcmF0b3IoKSB7CisgICAgSXRlcmF0b3IoKSB7CiAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHZvaWQgZmlsbFZhbHVlcygpIHsKICAgICAgIGlmICh2T2ZmID09IHZhbHVlc09mZikgewogICAgICAgICBjdXJyZW50VmFsdWVzID0gcGVuZGluZzsKICAgICAgIH0gZWxzZSBpZiAoZGVsdGFzW3ZPZmZdID09IG51bGwpIHsKICAgICAgICAgQXJyYXlzLmZpbGwoY3VycmVudFZhbHVlcywgbWluVmFsdWVzW3ZPZmZdKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTUFYX1BFTkRJTkdfQ09VTlQ7ICkgewotICAgICAgICAgIGsgKz0gZGVsdGFzW3ZPZmZdLmdldChrLCBjdXJyZW50VmFsdWVzLCBrLCBNQVhfUEVORElOR19DT1VOVCAtIGspOworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBlbmRpbmcubGVuZ3RoOyApIHsKKyAgICAgICAgICBrICs9IGRlbHRhc1t2T2ZmXS5nZXQoaywgY3VycmVudFZhbHVlcywgaywgcGVuZGluZy5sZW5ndGggLSBrKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE1BWF9QRU5ESU5HX0NPVU5UOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwZW5kaW5nLmxlbmd0aDsgKytrKSB7CiAgICAgICAgICAgY3VycmVudFZhbHVlc1trXSArPSBtaW5WYWx1ZXNbdk9mZl07CiAgICAgICAgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0Jsb2NrUGFja2VkUmVhZGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9CbG9ja1BhY2tlZFJlYWRlci5qYXZhCmluZGV4IGEzM2RhOTUuLmZmMzVlYzEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0Jsb2NrUGFja2VkUmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQmxvY2tQYWNrZWRSZWFkZXIuamF2YQpAQCAtMTcsMTEgKzE3LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIuQlBWX1NISUZUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5BYnN0cmFjdEJsb2NrUGFja2VkV3JpdGVyLk1BWF9CTE9DS19TSVpFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5BYnN0cmFjdEJsb2NrUGFja2VkV3JpdGVyLk1JTl9CTE9DS19TSVpFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5BYnN0cmFjdEJsb2NrUGFja2VkV3JpdGVyLk1JTl9WQUxVRV9FUVVBTFNfMDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQmxvY2tQYWNrZWRSZWFkZXJJdGVyYXRvci5yZWFkVkxvbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkJsb2NrUGFja2VkUmVhZGVySXRlcmF0b3IuemlnWmFnRGVjb2RlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5CbG9ja1BhY2tlZFdyaXRlci5CUFZfU0hJRlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkJsb2NrUGFja2VkV3JpdGVyLk1JTl9WQUxVRV9FUVVBTFNfMDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQmxvY2tQYWNrZWRXcml0ZXIuY2hlY2tCbG9ja1NpemU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLlBhY2tlZEludHMuY2hlY2tCbG9ja1NpemU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLlBhY2tlZEludHMubnVtQmxvY2tzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtNDAsMTQgKzQzLDEwIEBACiAKICAgLyoqIFNvbGUgY29uc3RydWN0b3IuICovCiAgIHB1YmxpYyBCbG9ja1BhY2tlZFJlYWRlcihJbmRleElucHV0IGluLCBpbnQgcGFja2VkSW50c1ZlcnNpb24sIGludCBibG9ja1NpemUsIGxvbmcgdmFsdWVDb3VudCwgYm9vbGVhbiBkaXJlY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgY2hlY2tCbG9ja1NpemUoYmxvY2tTaXplKTsKICAgICB0aGlzLnZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OwotICAgIGJsb2NrU2hpZnQgPSBJbnRlZ2VyLm51bWJlck9mVHJhaWxpbmdaZXJvcyhibG9ja1NpemUpOworICAgIGJsb2NrU2hpZnQgPSBjaGVja0Jsb2NrU2l6ZShibG9ja1NpemUsIE1JTl9CTE9DS19TSVpFLCBNQVhfQkxPQ0tfU0laRSk7CiAgICAgYmxvY2tNYXNrID0gYmxvY2tTaXplIC0gMTsKLSAgICBmaW5hbCBpbnQgbnVtQmxvY2tzID0gKGludCkgKHZhbHVlQ291bnQgLyBibG9ja1NpemUpICsgKHZhbHVlQ291bnQgJSBibG9ja1NpemUgPT0gMCA/IDAgOiAxKTsKLSAgICBpZiAoKGxvbmcpIG51bUJsb2NrcyAqIGJsb2NrU2l6ZSA8IHZhbHVlQ291bnQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlQ291bnQgaXMgdG9vIGxhcmdlIGZvciB0aGlzIGJsb2NrIHNpemUiKTsKLSAgICB9CisgICAgZmluYWwgaW50IG51bUJsb2NrcyA9IG51bUJsb2Nrcyh2YWx1ZUNvdW50LCBibG9ja1NpemUpOwogICAgIGxvbmdbXSBtaW5WYWx1ZXMgPSBudWxsOwogICAgIHN1YlJlYWRlcnMgPSBuZXcgUGFja2VkSW50cy5SZWFkZXJbbnVtQmxvY2tzXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJsb2NrczsgKytpKSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9CbG9ja1BhY2tlZFJlYWRlckl0ZXJhdG9yLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9CbG9ja1BhY2tlZFJlYWRlckl0ZXJhdG9yLmphdmEKaW5kZXggMjg4NTE4ZC4uN2Q4YmJkMyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvQmxvY2tQYWNrZWRSZWFkZXJJdGVyYXRvci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0Jsb2NrUGFja2VkUmVhZGVySXRlcmF0b3IuamF2YQpAQCAtMTcsOSArMTcsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQmxvY2tQYWNrZWRXcml0ZXIuQlBWX1NISUZUOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5CbG9ja1BhY2tlZFdyaXRlci5NSU5fVkFMVUVfRVFVQUxTXzA7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkJsb2NrUGFja2VkV3JpdGVyLmNoZWNrQmxvY2tTaXplOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5BYnN0cmFjdEJsb2NrUGFja2VkV3JpdGVyLkJQVl9TSElGVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQWJzdHJhY3RCbG9ja1BhY2tlZFdyaXRlci5NQVhfQkxPQ0tfU0laRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQWJzdHJhY3RCbG9ja1BhY2tlZFdyaXRlci5NSU5fQkxPQ0tfU0laRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuQWJzdHJhY3RCbG9ja1BhY2tlZFdyaXRlci5NSU5fVkFMVUVfRVFVQUxTXzA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkJsb2NrUGFja2VkUmVhZGVySXRlcmF0b3IucmVhZFZMb25nOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5CbG9ja1BhY2tlZFJlYWRlckl0ZXJhdG9yLnppZ1phZ0RlY29kZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuUGFja2VkSW50cy5jaGVja0Jsb2NrU2l6ZTsKIAogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC04Nyw3ICs5MSw3IEBACiAgICAqICAgICAgICAgICAgICAgICAgYmVlbiB1c2VkIHRvIHdyaXRlIHRoZSBzdHJlYW0KICAgICovCiAgIHB1YmxpYyBCbG9ja1BhY2tlZFJlYWRlckl0ZXJhdG9yKERhdGFJbnB1dCBpbiwgaW50IHBhY2tlZEludHNWZXJzaW9uLCBpbnQgYmxvY2tTaXplLCBsb25nIHZhbHVlQ291bnQpIHsKLSAgICBjaGVja0Jsb2NrU2l6ZShibG9ja1NpemUpOworICAgIGNoZWNrQmxvY2tTaXplKGJsb2NrU2l6ZSwgTUlOX0JMT0NLX1NJWkUsIE1BWF9CTE9DS19TSVpFKTsKICAgICB0aGlzLnBhY2tlZEludHNWZXJzaW9uID0gcGFja2VkSW50c1ZlcnNpb247CiAgICAgdGhpcy5ibG9ja1NpemUgPSBibG9ja1NpemU7CiAgICAgdGhpcy52YWx1ZXMgPSBuZXcgbG9uZ1tibG9ja1NpemVdOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvR3Jvd2FibGVXcml0ZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL0dyb3dhYmxlV3JpdGVyLmphdmEKaW5kZXggZjdiYzJkZC4uNDViMzMzOCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvR3Jvd2FibGVXcml0ZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9Hcm93YWJsZVdyaXRlci5qYXZhCkBAIC0yMCwyNCArMjAsMzUgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGF0YU91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlJhbVVzYWdlRXN0aW1hdG9yOwogCiAvKiogICAgIAogICogSW1wbGVtZW50cyB7QGxpbmsgUGFja2VkSW50cy5NdXRhYmxlfSwgYnV0IGdyb3dzIHRoZQogICogYml0IGNvdW50IG9mIHRoZSB1bmRlcmx5aW5nIHBhY2tlZCBpbnRzIG9uLWRlbWFuZC4KKyAqIDxwPkJld2FyZSB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBhY2NlcHQgdG8gc2V0IG5lZ2F0aXZlIHZhbHVlcyBidXQgaW4gb3JkZXIKKyAqIHRvIGRvIHRoaXMsIGl0IHdpbGwgZ3JvdyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHZhbHVlIHRvIDY0LgogICoKICAqIDxwPkBsdWNlbmUuaW50ZXJuYWw8L3A+CiAgKi8KLQogcHVibGljIGNsYXNzIEdyb3dhYmxlV3JpdGVyIGltcGxlbWVudHMgUGFja2VkSW50cy5NdXRhYmxlIHsKIAotICBwcml2YXRlIGxvbmcgY3VycmVudE1heFZhbHVlOworICBwcml2YXRlIGxvbmcgY3VycmVudE1hc2s7CiAgIHByaXZhdGUgUGFja2VkSW50cy5NdXRhYmxlIGN1cnJlbnQ7CiAgIHByaXZhdGUgZmluYWwgZmxvYXQgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW87CiAKKyAgLyoqCisgICAqIEBwYXJhbSBzdGFydEJpdHNQZXJWYWx1ZSAgICAgICB0aGUgaW5pdGlhbCBudW1iZXIgb2YgYml0cyBwZXIgdmFsdWUsIG1heSBncm93IGRlcGVuZGluZyBvbiB0aGUgZGF0YQorICAgKiBAcGFyYW0gdmFsdWVDb3VudCAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiB2YWx1ZXMKKyAgICogQHBhcmFtIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvIGFuIGFjY2VwdGFibGUgb3ZlcmhlYWQgcmF0aW8KKyAgICovCiAgIHB1YmxpYyBHcm93YWJsZVdyaXRlcihpbnQgc3RhcnRCaXRzUGVyVmFsdWUsIGludCB2YWx1ZUNvdW50LCBmbG9hdCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbykgewogICAgIHRoaXMuYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8gPSBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbzsKICAgICBjdXJyZW50ID0gUGFja2VkSW50cy5nZXRNdXRhYmxlKHZhbHVlQ291bnQsIHN0YXJ0Qml0c1BlclZhbHVlLCB0aGlzLmFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKTsKLSAgICBjdXJyZW50TWF4VmFsdWUgPSBQYWNrZWRJbnRzLm1heFZhbHVlKGN1cnJlbnQuZ2V0Qml0c1BlclZhbHVlKCkpOworICAgIGN1cnJlbnRNYXNrID0gbWFzayhjdXJyZW50LmdldEJpdHNQZXJWYWx1ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgbWFzayhpbnQgYml0c1BlclZhbHVlKSB7CisgICAgcmV0dXJuIGJpdHNQZXJWYWx1ZSA9PSA2NCA/IH4wTCA6IFBhY2tlZEludHMubWF4VmFsdWUoYml0c1BlclZhbHVlKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNzAsMTYgKzgxLDE2IEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkobG9uZyB2YWx1ZSkgewotICAgIGFzc2VydCB2YWx1ZSA+PSAwOwotICAgIGlmICh2YWx1ZSA8PSBjdXJyZW50TWF4VmFsdWUpIHsKKyAgICBpZiAoKHZhbHVlICYgY3VycmVudE1hc2spID09IHZhbHVlKSB7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGZpbmFsIGludCBiaXRzUmVxdWlyZWQgPSBQYWNrZWRJbnRzLmJpdHNSZXF1aXJlZCh2YWx1ZSk7CisgICAgZmluYWwgaW50IGJpdHNSZXF1aXJlZCA9IHZhbHVlIDwgMCA/IDY0IDogUGFja2VkSW50cy5iaXRzUmVxdWlyZWQodmFsdWUpOworICAgIGFzc2VydCBiaXRzUmVxdWlyZWQgPiBjdXJyZW50LmdldEJpdHNQZXJWYWx1ZSgpOwogICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gc2l6ZSgpOwogICAgIFBhY2tlZEludHMuTXV0YWJsZSBuZXh0ID0gUGFja2VkSW50cy5nZXRNdXRhYmxlKHZhbHVlQ291bnQsIGJpdHNSZXF1aXJlZCwgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8pOwogICAgIFBhY2tlZEludHMuY29weShjdXJyZW50LCAwLCBuZXh0LCAwLCB2YWx1ZUNvdW50LCBQYWNrZWRJbnRzLkRFRkFVTFRfQlVGRkVSX1NJWkUpOwogICAgIGN1cnJlbnQgPSBuZXh0OwotICAgIGN1cnJlbnRNYXhWYWx1ZSA9IFBhY2tlZEludHMubWF4VmFsdWUoY3VycmVudC5nZXRCaXRzUGVyVmFsdWUoKSk7CisgICAgY3VycmVudE1hc2sgPSBtYXNrKGN1cnJlbnQuZ2V0Qml0c1BlclZhbHVlKCkpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xMDksNiArMTIwLDEwIEBACiAgIHB1YmxpYyBpbnQgc2V0KGludCBpbmRleCwgbG9uZ1tdIGFyciwgaW50IG9mZiwgaW50IGxlbikgewogICAgIGxvbmcgbWF4ID0gMDsKICAgICBmb3IgKGludCBpID0gb2ZmLCBlbmQgPSBvZmYgKyBsZW47IGkgPCBlbmQ7ICsraSkgeworICAgICAgLy8gYml0d2lzZSBvciBpcyBuaWNlIGJlY2F1c2UgZWl0aGVyIGFsbCB2YWx1ZXMgYXJlIHBvc2l0aXZlIGFuZCB0aGUKKyAgICAgIC8vIG9yLWVkIHJlc3VsdCB3aWxsIHJlcXVpcmUgYXMgbWFueSBiaXRzIHBlciB2YWx1ZSBhcyB0aGUgbWF4IG9mIHRoZQorICAgICAgLy8gdmFsdWVzLCBvciBvbmUgb2YgdGhlbSBpcyBuZWdhdGl2ZSBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIG5lZ2F0aXZlLAorICAgICAgLy8gZm9yY2luZyBHcm93YWJsZVdyaXRlciB0byB1c2UgNjQgYml0cyBwZXIgdmFsdWUKICAgICAgIG1heCB8PSBhcnJbaV07CiAgICAgfQogICAgIGVuc3VyZUNhcGFjaXR5KG1heCk7CkBAIC0xMjMsNyArMTM4LDEyIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJhbUJ5dGVzVXNlZCgpIHsKLSAgICByZXR1cm4gY3VycmVudC5yYW1CeXRlc1VzZWQoKTsKKyAgICByZXR1cm4gUmFtVXNhZ2VFc3RpbWF0b3IuYWxpZ25PYmplY3RTaXplKAorICAgICAgICBSYW1Vc2FnZUVzdGltYXRvci5OVU1fQllURVNfT0JKRUNUX0hFQURFUgorICAgICAgICArIFJhbVVzYWdlRXN0aW1hdG9yLk5VTV9CWVRFU19PQkpFQ1RfUkVGCisgICAgICAgICsgUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX0xPTkcKKyAgICAgICAgKyBSYW1Vc2FnZUVzdGltYXRvci5OVU1fQllURVNfRkxPQVQpCisgICAgICAgICsgY3VycmVudC5yYW1CeXRlc1VzZWQoKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlci5qYXZhCmluZGV4IDRiMDA5OTQuLmFiYWM1OGQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL01vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9Nb25vdG9uaWNBcHBlbmRpbmdMb25nQnVmZmVyLmphdmEKQEAgLTM3LDE0ICszNywyMiBAQAogICAgIHJldHVybiAobiA+PiA2MykgXiAobiA8PCAxKTsKICAgfQogCi0gIHByaXZhdGUgZmxvYXRbXSBhdmVyYWdlczsKKyAgZmxvYXRbXSBhdmVyYWdlczsKIAotICAvKiogU29sZSBjb25zdHJ1Y3Rvci4gKi8KLSAgcHVibGljIE1vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXIoKSB7Ci0gICAgc3VwZXIoMTYpOwotICAgIGF2ZXJhZ2VzID0gbmV3IGZsb2F0WzE2XTsKKyAgLyoqIEBwYXJhbSBpbml0aWFsUGFnZUNvdW50IHRoZSBpbml0aWFsIG51bWJlciBvZiBwYWdlcworICAgKiAgQHBhcmFtIHBhZ2VTaXplICAgICAgICAgdGhlIHNpemUgb2YgYSBzaW5nbGUgcGFnZSAqLworICBwdWJsaWMgTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlcihpbnQgaW5pdGlhbFBhZ2VDb3VudCwgaW50IHBhZ2VTaXplKSB7CisgICAgc3VwZXIoaW5pdGlhbFBhZ2VDb3VudCwgcGFnZVNpemUpOworICAgIGF2ZXJhZ2VzID0gbmV3IGZsb2F0W3BlbmRpbmcubGVuZ3RoXTsKICAgfQotICAKKworICAvKiogQ3JlYXRlIGFuIHtAbGluayBNb25vdG9uaWNBcHBlbmRpbmdMb25nQnVmZmVyfSB3aXRoIGluaXRpYWxQYWdlQ291bnQ9MTYKKyAgICogIGFuZCBwYWdlU2l6ZT0xMDI0LiAqLworICBwdWJsaWMgTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlcigpIHsKKyAgICB0aGlzKDE2LCAxMDI0KTsKKyAgfQorCisgIEBPdmVycmlkZQogICBsb25nIGdldChpbnQgYmxvY2ssIGludCBlbGVtZW50KSB7CiAgICAgaWYgKGJsb2NrID09IHZhbHVlc09mZikgewogICAgICAgcmV0dXJuIHBlbmRpbmdbZWxlbWVudF07CkBAIC02NiwxNiArNzQsMTYgQEAKIAogICBAT3ZlcnJpZGUKICAgdm9pZCBwYWNrUGVuZGluZ1ZhbHVlcygpIHsKLSAgICBhc3NlcnQgcGVuZGluZ09mZiA9PSBNQVhfUEVORElOR19DT1VOVDsKKyAgICBhc3NlcnQgcGVuZGluZ09mZiA9PSBwZW5kaW5nLmxlbmd0aDsKIAogICAgIG1pblZhbHVlc1t2YWx1ZXNPZmZdID0gcGVuZGluZ1swXTsKLSAgICBhdmVyYWdlc1t2YWx1ZXNPZmZdID0gKGZsb2F0KSAocGVuZGluZ1tCTE9DS19NQVNLXSAtIHBlbmRpbmdbMF0pIC8gQkxPQ0tfTUFTSzsKKyAgICBhdmVyYWdlc1t2YWx1ZXNPZmZdID0gKGZsb2F0KSAocGVuZGluZ1twZW5kaW5nLmxlbmd0aCAtIDFdIC0gcGVuZGluZ1swXSkgLyAocGVuZGluZy5sZW5ndGggLSAxKTsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BFTkRJTkdfQ09VTlQ7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGg7ICsraSkgewogICAgICAgcGVuZGluZ1tpXSA9IHppZ1phZ0VuY29kZShwZW5kaW5nW2ldIC0gbWluVmFsdWVzW3ZhbHVlc09mZl0gLSAobG9uZykgKGF2ZXJhZ2VzW3ZhbHVlc09mZl0gKiAobG9uZykgaSkpOwogICAgIH0KICAgICBsb25nIG1heERlbHRhID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QRU5ESU5HX0NPVU5UOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyArK2kpIHsKICAgICAgIGlmIChwZW5kaW5nW2ldIDwgMCkgewogICAgICAgICBtYXhEZWx0YSA9IC0xOwogICAgICAgICBicmVhazsKQEAgLTk0LDYgKzEwMiw3IEBACiAgIH0KIAogICAvKiogUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGlzIGJ1ZmZlci4gKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCk7CiAgIH0KQEAgLTEwNSwxOCArMTE0LDE5IEBACiAgICAgICBzdXBlcigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHZvaWQgZmlsbFZhbHVlcygpIHsKICAgICAgIGlmICh2T2ZmID09IHZhbHVlc09mZikgewogICAgICAgICBjdXJyZW50VmFsdWVzID0gcGVuZGluZzsKICAgICAgIH0gZWxzZSBpZiAoZGVsdGFzW3ZPZmZdID09IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBNQVhfUEVORElOR19DT1VOVDsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGVuZGluZy5sZW5ndGg7ICsraykgewogICAgICAgICAgIGN1cnJlbnRWYWx1ZXNba10gPSBtaW5WYWx1ZXNbdk9mZl0gKyAobG9uZykgKGF2ZXJhZ2VzW3ZPZmZdICogKGxvbmcpIGspOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE1BWF9QRU5ESU5HX0NPVU5UOyApIHsKLSAgICAgICAgICBrICs9IGRlbHRhc1t2T2ZmXS5nZXQoaywgY3VycmVudFZhbHVlcywgaywgTUFYX1BFTkRJTkdfQ09VTlQgLSBrKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwZW5kaW5nLmxlbmd0aDsgKSB7CisgICAgICAgICAgayArPSBkZWx0YXNbdk9mZl0uZ2V0KGssIGN1cnJlbnRWYWx1ZXMsIGssIHBlbmRpbmcubGVuZ3RoIC0gayk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBNQVhfUEVORElOR19DT1VOVDsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGVuZGluZy5sZW5ndGg7ICsraykgewogICAgICAgICAgIGN1cnJlbnRWYWx1ZXNba10gPSBtaW5WYWx1ZXNbdk9mZl0gKyAobG9uZykgKGF2ZXJhZ2VzW3ZPZmZdICogKGxvbmcpIGspICsgemlnWmFnRGVjb2RlKGN1cnJlbnRWYWx1ZXNba10pOwogICAgICAgICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9Nb25vdG9uaWNCbG9ja1BhY2tlZFJlYWRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvTW9ub3RvbmljQmxvY2tQYWNrZWRSZWFkZXIuamF2YQppbmRleCAyN2IxNGRkLi5mN2Y2ZTQ0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9Nb25vdG9uaWNCbG9ja1BhY2tlZFJlYWRlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL01vbm90b25pY0Jsb2NrUGFja2VkUmVhZGVyLmphdmEKQEAgLTE3LDggKzE3LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIuY2hlY2tCbG9ja1NpemU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIuTUFYX0JMT0NLX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkFic3RyYWN0QmxvY2tQYWNrZWRXcml0ZXIuTUlOX0JMT0NLX1NJWkU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLkJsb2NrUGFja2VkUmVhZGVySXRlcmF0b3IuemlnWmFnRGVjb2RlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLmNoZWNrQmxvY2tTaXplOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLm51bUJsb2NrczsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKQEAgLTM5LDE0ICs0MiwxMCBAQAogCiAgIC8qKiBTb2xlIGNvbnN0cnVjdG9yLiAqLwogICBwdWJsaWMgTW9ub3RvbmljQmxvY2tQYWNrZWRSZWFkZXIoSW5kZXhJbnB1dCBpbiwgaW50IHBhY2tlZEludHNWZXJzaW9uLCBpbnQgYmxvY2tTaXplLCBsb25nIHZhbHVlQ291bnQsIGJvb2xlYW4gZGlyZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGNoZWNrQmxvY2tTaXplKGJsb2NrU2l6ZSk7CiAgICAgdGhpcy52YWx1ZUNvdW50ID0gdmFsdWVDb3VudDsKLSAgICBibG9ja1NoaWZ0ID0gSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoYmxvY2tTaXplKTsKKyAgICBibG9ja1NoaWZ0ID0gY2hlY2tCbG9ja1NpemUoYmxvY2tTaXplLCBNSU5fQkxPQ0tfU0laRSwgTUFYX0JMT0NLX1NJWkUpOwogICAgIGJsb2NrTWFzayA9IGJsb2NrU2l6ZSAtIDE7Ci0gICAgZmluYWwgaW50IG51bUJsb2NrcyA9IChpbnQpICh2YWx1ZUNvdW50IC8gYmxvY2tTaXplKSArICh2YWx1ZUNvdW50ICUgYmxvY2tTaXplID09IDAgPyAwIDogMSk7Ci0gICAgaWYgKChsb25nKSBudW1CbG9ja3MgKiBibG9ja1NpemUgPCB2YWx1ZUNvdW50KSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWx1ZUNvdW50IGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBibG9jayBzaXplIik7Ci0gICAgfQorICAgIGZpbmFsIGludCBudW1CbG9ja3MgPSBudW1CbG9ja3ModmFsdWVDb3VudCwgYmxvY2tTaXplKTsKICAgICBtaW5WYWx1ZXMgPSBuZXcgbG9uZ1tudW1CbG9ja3NdOwogICAgIGF2ZXJhZ2VzID0gbmV3IGZsb2F0W251bUJsb2Nrc107CiAgICAgc3ViUmVhZGVycyA9IG5ldyBQYWNrZWRJbnRzLlJlYWRlcltudW1CbG9ja3NdOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvUGFja2VkSW50cy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvUGFja2VkSW50cy5qYXZhCmluZGV4IGI2ZGI1ODIuLjlhM2I2NjggMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL1BhY2tlZEludHMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9QYWNrZWRJbnRzLmphdmEKQEAgLTIxMyw2ICsyMTMsMTEgQEAKICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwogICAgICAgdGhpcy5iaXRzUGVyVmFsdWUgPSBiaXRzUGVyVmFsdWU7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiAiRm9ybWF0QW5kQml0cyhmb3JtYXQ9IiArIGZvcm1hdCArICIgYml0c1BlclZhbHVlPSIgKyBiaXRzUGVyVmFsdWUgKyAiKSI7CisgICAgfQogICB9CiAKICAgLyoqCkBAIC0xMDM2LDE0ICsxMDQxLDIxIEBACiAgICAqLwogICBwdWJsaWMgc3RhdGljIE11dGFibGUgZ2V0TXV0YWJsZShpbnQgdmFsdWVDb3VudCwKICAgICAgIGludCBiaXRzUGVyVmFsdWUsIGZsb2F0IGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKSB7Ci0gICAgYXNzZXJ0IHZhbHVlQ291bnQgPj0gMDsKLQogICAgIGZpbmFsIEZvcm1hdEFuZEJpdHMgZm9ybWF0QW5kQml0cyA9IGZhc3Rlc3RGb3JtYXRBbmRCaXRzKHZhbHVlQ291bnQsIGJpdHNQZXJWYWx1ZSwgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8pOwotICAgIHN3aXRjaCAoZm9ybWF0QW5kQml0cy5mb3JtYXQpIHsKKyAgICByZXR1cm4gZ2V0TXV0YWJsZSh2YWx1ZUNvdW50LCBmb3JtYXRBbmRCaXRzLmJpdHNQZXJWYWx1ZSwgZm9ybWF0QW5kQml0cy5mb3JtYXQpOworICB9CisKKyAgLyoqIFNhbWUgYXMge0BsaW5rICNnZXRNdXRhYmxlKGludCwgaW50LCBmbG9hdCl9IHdpdGggYSBwcmUtY29tcHV0ZWQgbnVtYmVyCisgICAqICBvZiBiaXRzIHBlciB2YWx1ZSBhbmQgZm9ybWF0LgorICAgKiAgQGx1Y2VuZS5pbnRlcm5hbCAqLworICBwdWJsaWMgc3RhdGljIE11dGFibGUgZ2V0TXV0YWJsZShpbnQgdmFsdWVDb3VudCwKKyAgICAgIGludCBiaXRzUGVyVmFsdWUsIFBhY2tlZEludHMuRm9ybWF0IGZvcm1hdCkgeworICAgIGFzc2VydCB2YWx1ZUNvdW50ID49IDA7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgIGNhc2UgUEFDS0VEX1NJTkdMRV9CTE9DSzoKLSAgICAgICAgcmV0dXJuIFBhY2tlZDY0U2luZ2xlQmxvY2suY3JlYXRlKHZhbHVlQ291bnQsIGZvcm1hdEFuZEJpdHMuYml0c1BlclZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFBhY2tlZDY0U2luZ2xlQmxvY2suY3JlYXRlKHZhbHVlQ291bnQsIGJpdHNQZXJWYWx1ZSk7CiAgICAgICBjYXNlIFBBQ0tFRDoKLSAgICAgICAgc3dpdGNoIChmb3JtYXRBbmRCaXRzLmJpdHNQZXJWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKGJpdHNQZXJWYWx1ZSkgewogICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgIHJldHVybiBuZXcgRGlyZWN0OCh2YWx1ZUNvdW50KTsKICAgICAgICAgICBjYXNlIDE2OgpAQCAtMTA2Myw3ICsxMDc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUGFja2VkNjQodmFsdWVDb3VudCwgZm9ybWF0QW5kQml0cy5iaXRzUGVyVmFsdWUpOworICAgICAgICByZXR1cm4gbmV3IFBhY2tlZDY0KHZhbHVlQ291bnQsIGJpdHNQZXJWYWx1ZSk7CiAgICAgICBkZWZhdWx0OgogICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICB9CkBAIC0xMTk4LDMzICsxMjEwLDM5IEBACiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgIGRlc3Quc2V0KGRlc3RQb3MrKywgc3JjLmdldChzcmNQb3MrKykpOwogICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CiAgICAgICAvLyB1c2UgYnVsayBvcGVyYXRpb25zCi0gICAgICBsb25nW10gYnVmID0gbmV3IGxvbmdbTWF0aC5taW4oY2FwYWNpdHksIGxlbildOwotICAgICAgaW50IHJlbWFpbmluZyA9IDA7Ci0gICAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBmaW5hbCBpbnQgcmVhZCA9IHNyYy5nZXQoc3JjUG9zLCBidWYsIHJlbWFpbmluZywgTWF0aC5taW4obGVuLCBidWYubGVuZ3RoIC0gcmVtYWluaW5nKSk7Ci0gICAgICAgIGFzc2VydCByZWFkID4gMDsKLSAgICAgICAgc3JjUG9zICs9IHJlYWQ7Ci0gICAgICAgIGxlbiAtPSByZWFkOwotICAgICAgICByZW1haW5pbmcgKz0gcmVhZDsKLSAgICAgICAgZmluYWwgaW50IHdyaXR0ZW4gPSBkZXN0LnNldChkZXN0UG9zLCBidWYsIDAsIHJlbWFpbmluZyk7Ci0gICAgICAgIGFzc2VydCB3cml0dGVuID4gMDsKLSAgICAgICAgZGVzdFBvcyArPSB3cml0dGVuOwotICAgICAgICBpZiAod3JpdHRlbiA8IHJlbWFpbmluZykgewotICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCB3cml0dGVuLCBidWYsIDAsIHJlbWFpbmluZyAtIHdyaXR0ZW4pOwotICAgICAgICB9Ci0gICAgICAgIHJlbWFpbmluZyAtPSB3cml0dGVuOwotICAgICAgfQotICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgZmluYWwgaW50IHdyaXR0ZW4gPSBkZXN0LnNldChkZXN0UG9zLCBidWYsIDAsIHJlbWFpbmluZyk7Ci0gICAgICAgIGRlc3RQb3MgKz0gd3JpdHRlbjsKLSAgICAgICAgcmVtYWluaW5nIC09IHdyaXR0ZW47Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCB3cml0dGVuLCBidWYsIDAsIHJlbWFpbmluZyk7Ci0gICAgICB9CisgICAgICBmaW5hbCBsb25nW10gYnVmID0gbmV3IGxvbmdbTWF0aC5taW4oY2FwYWNpdHksIGxlbildOworICAgICAgY29weShzcmMsIHNyY1BvcywgZGVzdCwgZGVzdFBvcywgbGVuLCBidWYpOwogICAgIH0KICAgfQotICAKKworICAvKiogU2FtZSBhcyB7QGxpbmsgI2NvcHkoUmVhZGVyLCBpbnQsIE11dGFibGUsIGludCwgaW50LCBpbnQpfSBidXQgdXNpbmcgYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gKi8KKyAgc3RhdGljIHZvaWQgY29weShSZWFkZXIgc3JjLCBpbnQgc3JjUG9zLCBNdXRhYmxlIGRlc3QsIGludCBkZXN0UG9zLCBpbnQgbGVuLCBsb25nW10gYnVmKSB7CisgICAgYXNzZXJ0IGJ1Zi5sZW5ndGggPiAwOworICAgIGludCByZW1haW5pbmcgPSAwOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICBmaW5hbCBpbnQgcmVhZCA9IHNyYy5nZXQoc3JjUG9zLCBidWYsIHJlbWFpbmluZywgTWF0aC5taW4obGVuLCBidWYubGVuZ3RoIC0gcmVtYWluaW5nKSk7CisgICAgICBhc3NlcnQgcmVhZCA+IDA7CisgICAgICBzcmNQb3MgKz0gcmVhZDsKKyAgICAgIGxlbiAtPSByZWFkOworICAgICAgcmVtYWluaW5nICs9IHJlYWQ7CisgICAgICBmaW5hbCBpbnQgd3JpdHRlbiA9IGRlc3Quc2V0KGRlc3RQb3MsIGJ1ZiwgMCwgcmVtYWluaW5nKTsKKyAgICAgIGFzc2VydCB3cml0dGVuID4gMDsKKyAgICAgIGRlc3RQb3MgKz0gd3JpdHRlbjsKKyAgICAgIGlmICh3cml0dGVuIDwgcmVtYWluaW5nKSB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCB3cml0dGVuLCBidWYsIDAsIHJlbWFpbmluZyAtIHdyaXR0ZW4pOworICAgICAgfQorICAgICAgcmVtYWluaW5nIC09IHdyaXR0ZW47CisgICAgfQorICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICBmaW5hbCBpbnQgd3JpdHRlbiA9IGRlc3Quc2V0KGRlc3RQb3MsIGJ1ZiwgMCwgcmVtYWluaW5nKTsKKyAgICAgIGRlc3RQb3MgKz0gd3JpdHRlbjsKKyAgICAgIHJlbWFpbmluZyAtPSB3cml0dGVuOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHdyaXR0ZW4sIGJ1ZiwgMCwgcmVtYWluaW5nKTsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogRXhwZXJ0OiByZWFkcyBvbmx5IHRoZSBtZXRhZGF0YSBmcm9tIGEgc3RyZWFtLiBUaGlzIGlzIHVzZWZ1bCB0byBsYXRlcgogICAgKiByZXN0b3JlIGEgc3RyZWFtIG9yIG9wZW4gYSBkaXJlY3QgcmVhZGVyIHZpYSAKQEAgLTEyNjEsNCArMTI3OSwyNiBAQAogICAgIH0gICAgCiAgIH0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgLyoqIENoZWNrIHRoYXQgdGhlIGJsb2NrIHNpemUgaXMgYSBwb3dlciBvZiAyLCBpbiB0aGUgcmlnaHQgYm91bmRzLCBhbmQgcmV0dXJuCisgICAqICBpdHMgbG9nIGluIGJhc2UgMi4gKi8KKyAgc3RhdGljIGludCBjaGVja0Jsb2NrU2l6ZShpbnQgYmxvY2tTaXplLCBpbnQgbWluQmxvY2tTaXplLCBpbnQgbWF4QmxvY2tTaXplKSB7CisgICAgaWYgKGJsb2NrU2l6ZSA8IG1pbkJsb2NrU2l6ZSB8fCBibG9ja1NpemUgPiBtYXhCbG9ja1NpemUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJsb2NrU2l6ZSBtdXN0IGJlID49ICIgKyBtaW5CbG9ja1NpemUgKyAiIGFuZCA8PSAiICsgbWF4QmxvY2tTaXplICsgIiwgZ290ICIgKyBibG9ja1NpemUpOworICAgIH0KKyAgICBpZiAoKGJsb2NrU2l6ZSAmIChibG9ja1NpemUgLSAxKSkgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmxvY2tTaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGdvdCAiICsgYmxvY2tTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKGJsb2NrU2l6ZSk7CisgIH0KKworICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHJlcXVpcmVkIHRvIHN0b3JlIDxjb2RlPnNpemU8L2NvZGU+IHZhbHVlcyBvbgorICAgKiAgPGNvZGU+YmxvY2tTaXplPC9jb2RlPi4gKi8KKyAgc3RhdGljIGludCBudW1CbG9ja3MobG9uZyBzaXplLCBpbnQgYmxvY2tTaXplKSB7CisgICAgZmluYWwgaW50IG51bUJsb2NrcyA9IChpbnQpIChzaXplIC8gYmxvY2tTaXplKSArIChzaXplICUgYmxvY2tTaXplID09IDAgPyAwIDogMSk7CisgICAgaWYgKChsb25nKSBudW1CbG9ja3MgKiBibG9ja1NpemUgPCBzaXplKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzaXplIGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBibG9jayBzaXplIik7CisgICAgfQorICAgIHJldHVybiBudW1CbG9ja3M7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvUGFnZWRHcm93YWJsZVdyaXRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvUGFnZWRHcm93YWJsZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjM4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9QYWdlZEdyb3dhYmxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZDsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLlJhbVVzYWdlRXN0aW1hdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLlBhY2tlZEludHMuTXV0YWJsZTsKKworLyoqCisgKiBBIHtAbGluayBQYWdlZEdyb3dhYmxlV3JpdGVyfS4gVGhpcyBjbGFzcyBzbGljZXMgZGF0YSBpbnRvIGZpeGVkLXNpemUgYmxvY2tzCisgKiB3aGljaCBoYXZlIGluZGVwZW5kZW50IG51bWJlcnMgb2YgYml0cyBwZXIgdmFsdWUgYW5kIGdyb3cgb24tZGVtYW5kLgorICogPHA+WW91IHNob3VsZCB1c2UgdGhpcyBjbGFzcyBpbnN0ZWFkIG9mIHtAbGluayBBcHBlbmRpbmdMb25nQnVmZmVyfSBvbmx5IHdoZW4KKyAqIHlvdSBuZWVkIHJhbmRvbSB3cml0ZS1hY2Nlc3MuIE90aGVyd2lzZSB0aGlzIGNsYXNzIHdpbGwgbGlrZWx5IGJlIHNsb3dlciBhbmQKKyAqIGxlc3MgbWVtb3J5LWVmZmljaWVudC4KKyAqIEBsdWNlbmUuaW50ZXJuYWwKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhZ2VkR3Jvd2FibGVXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFBhZ2VkTXV0YWJsZTxQYWdlZEdyb3dhYmxlV3JpdGVyPiB7CisKKyAgZmluYWwgZmxvYXQgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW87CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgUGFnZWRHcm93YWJsZVdyaXRlcn0gaW5zdGFuY2UuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIHN0b3JlLgorICAgKiBAcGFyYW0gcGFnZVNpemUgdGhlIG51bWJlciBvZiB2YWx1ZXMgcGVyIHBhZ2UKKyAgICogQHBhcmFtIHN0YXJ0Qml0c1BlclZhbHVlIHRoZSBpbml0aWFsIG51bWJlciBvZiBiaXRzIHBlciB2YWx1ZQorICAgKiBAcGFyYW0gYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8gYW4gYWNjZXB0YWJsZSBvdmVyaGVhZCByYXRpbworICAgKi8KKyAgcHVibGljIFBhZ2VkR3Jvd2FibGVXcml0ZXIobG9uZyBzaXplLCBpbnQgcGFnZVNpemUsCisgICAgICBpbnQgc3RhcnRCaXRzUGVyVmFsdWUsIGZsb2F0IGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKSB7CisgICAgdGhpcyhzaXplLCBwYWdlU2l6ZSwgc3RhcnRCaXRzUGVyVmFsdWUsIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvLCB0cnVlKTsKKyAgfQorCisgIFBhZ2VkR3Jvd2FibGVXcml0ZXIobG9uZyBzaXplLCBpbnQgcGFnZVNpemUsaW50IHN0YXJ0Qml0c1BlclZhbHVlLCBmbG9hdCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbywgYm9vbGVhbiBmaWxsUGFnZXMpIHsKKyAgICBzdXBlcihzdGFydEJpdHNQZXJWYWx1ZSwgc2l6ZSwgcGFnZVNpemUpOworICAgIHRoaXMuYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8gPSBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbzsKKyAgICBpZiAoZmlsbFBhZ2VzKSB7CisgICAgICBmaWxsUGFnZXMoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE11dGFibGUgbmV3TXV0YWJsZShpbnQgdmFsdWVDb3VudCwgaW50IGJpdHNQZXJWYWx1ZSkgeworICAgIHJldHVybiBuZXcgR3Jvd2FibGVXcml0ZXIoYml0c1BlclZhbHVlLCB2YWx1ZUNvdW50LCBhY2NlcHRhYmxlT3ZlcmhlYWRSYXRpbyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFBhZ2VkR3Jvd2FibGVXcml0ZXIgbmV3VW5maWxsZWRDb3B5KGxvbmcgbmV3U2l6ZSkgeworICAgIHJldHVybiBuZXcgUGFnZWRHcm93YWJsZVdyaXRlcihuZXdTaXplLCBwYWdlU2l6ZSgpLCBiaXRzUGVyVmFsdWUsIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvLCBmYWxzZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGxvbmcgYmFzZVJhbUJ5dGVzVXNlZCgpIHsKKyAgICByZXR1cm4gc3VwZXIuYmFzZVJhbUJ5dGVzVXNlZCgpICsgUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX0ZMT0FUOworICB9CisKK30KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL1BhZ2VkTXV0YWJsZS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvUGFnZWRNdXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNzYxOQotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL1BhZ2VkTXV0YWJsZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQ7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5SYW1Vc2FnZUVzdGltYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzLk11dGFibGU7CisKKy8qKgorICogQSB7QGxpbmsgUGFnZWRNdXRhYmxlfS4gVGhpcyBjbGFzcyBzbGljZXMgZGF0YSBpbnRvIGZpeGVkLXNpemUgYmxvY2tzCisgKiB3aGljaCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIHBlciB2YWx1ZS4gSXQgY2FuIGJlIGEgdXNlZnVsIHJlcGxhY2VtZW50CisgKiBmb3Ige0BsaW5rIFBhY2tlZEludHMuTXV0YWJsZX0gdG8gc3RvcmUgbW9yZSB0aGFuIDJCIHZhbHVlcy4KKyAqIEBsdWNlbmUuaW50ZXJuYWwKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhZ2VkTXV0YWJsZSBleHRlbmRzIEFic3RyYWN0UGFnZWRNdXRhYmxlPFBhZ2VkTXV0YWJsZT4geworCisgIGZpbmFsIFBhY2tlZEludHMuRm9ybWF0IGZvcm1hdDsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBQYWdlZE11dGFibGV9IGluc3RhbmNlLgorICAgKgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0byBzdG9yZS4KKyAgICogQHBhcmFtIHBhZ2VTaXplIHRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciBwYWdlCisgICAqIEBwYXJhbSBiaXRzUGVyVmFsdWUgdGhlIG51bWJlciBvZiBiaXRzIHBlciB2YWx1ZQorICAgKiBAcGFyYW0gYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8gYW4gYWNjZXB0YWJsZSBvdmVyaGVhZCByYXRpbworICAgKi8KKyAgcHVibGljIFBhZ2VkTXV0YWJsZShsb25nIHNpemUsIGludCBwYWdlU2l6ZSwgaW50IGJpdHNQZXJWYWx1ZSwgZmxvYXQgYWNjZXB0YWJsZU92ZXJoZWFkUmF0aW8pIHsKKyAgICB0aGlzKHNpemUsIHBhZ2VTaXplLCBQYWNrZWRJbnRzLmZhc3Rlc3RGb3JtYXRBbmRCaXRzKHBhZ2VTaXplLCBiaXRzUGVyVmFsdWUsIGFjY2VwdGFibGVPdmVyaGVhZFJhdGlvKSk7CisgICAgZmlsbFBhZ2VzKCk7CisgIH0KKworICBQYWdlZE11dGFibGUobG9uZyBzaXplLCBpbnQgcGFnZVNpemUsIFBhY2tlZEludHMuRm9ybWF0QW5kQml0cyBmb3JtYXRBbmRCaXRzKSB7CisgICAgdGhpcyhzaXplLCBwYWdlU2l6ZSwgZm9ybWF0QW5kQml0cy5iaXRzUGVyVmFsdWUsIGZvcm1hdEFuZEJpdHMuZm9ybWF0KTsKKyAgfQorCisgIFBhZ2VkTXV0YWJsZShsb25nIHNpemUsIGludCBwYWdlU2l6ZSwgaW50IGJpdHNQZXJWYWx1ZSwgUGFja2VkSW50cy5Gb3JtYXQgZm9ybWF0KSB7CisgICAgc3VwZXIoYml0c1BlclZhbHVlLCBzaXplLCBwYWdlU2l6ZSk7CisgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE11dGFibGUgbmV3TXV0YWJsZShpbnQgdmFsdWVDb3VudCwgaW50IGJpdHNQZXJWYWx1ZSkgeworICAgIGFzc2VydCB0aGlzLmJpdHNQZXJWYWx1ZSA+PSBiaXRzUGVyVmFsdWU7CisgICAgcmV0dXJuIFBhY2tlZEludHMuZ2V0TXV0YWJsZSh2YWx1ZUNvdW50LCB0aGlzLmJpdHNQZXJWYWx1ZSwgZm9ybWF0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgUGFnZWRNdXRhYmxlIG5ld1VuZmlsbGVkQ29weShsb25nIG5ld1NpemUpIHsKKyAgICByZXR1cm4gbmV3IFBhZ2VkTXV0YWJsZShuZXdTaXplLCBwYWdlU2l6ZSgpLCBiaXRzUGVyVmFsdWUsIGZvcm1hdCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGxvbmcgYmFzZVJhbUJ5dGVzVXNlZCgpIHsKKyAgICByZXR1cm4gc3VwZXIuYmFzZVJhbUJ5dGVzVXNlZCgpICsgUmFtVXNhZ2VFc3RpbWF0b3IuTlVNX0JZVEVTX09CSkVDVF9SRUY7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvcGFja2FnZS5odG1sIGIvbHVjZW5lL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvcGFja2FnZS5odG1sCmluZGV4IDE2OTYwMzMuLjUwNDcwZGQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL3BhY2thZ2UuaHRtbAorKysgYi9sdWNlbmUvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9wYWNrYWdlLmh0bWwKQEAgLTQ3LDYgKzQ3LDExIEBACiAgICAgICAgIDxsaT5TYW1lIGFzIFBhY2tlZEludHMuTXV0YWJsZSBidXQgZ3Jvd3MgdGhlIG51bWJlciBvZiBiaXRzIHBlciB2YWx1ZXMgd2hlbiBuZWVkZWQuPC9saT4KICAgICAgICAgPGxpPlVzZWZ1bCB0byBidWlsZCBhIFBhY2tlZEludHMuTXV0YWJsZSBmcm9tIGEgcmVhZC1vbmNlIHN0cmVhbSBvZiBsb25ncy48L2xpPgogICAgIDwvdWw+PC9saT4KKyAgICA8bGk+PGI+e0BsaW5rIG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLlBhZ2VkR3Jvd2FibGVXcml0ZXJ9PC9iPjx1bD4KKyAgICAgICAgPGxpPlNsaWNlcyBkYXRhIGludG8gZml4ZWQtc2l6ZSBibG9ja3Mgc3RvcmVkIGluIEdyb3dhYmxlV3JpdGVycy48L2xpPgorICAgICAgICA8bGk+U3VwcG9ydHMgbW9yZSB0aGFuIDJCIHZhbHVlcy48L2xpPgorICAgICAgICA8bGk+WW91IHNob3VsZCB1c2UgQXBwZW5kaW5nTG9uZ0J1ZmZlciBpbnN0ZWFkIGlmIHlvdSBkb24ndCBuZWVkIHJhbmRvbSB3cml0ZSBhY2Nlc3MuPC9saT4KKyAgICA8L3VsPjwvbGk+CiAgICAgPGxpPjxiPntAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5BcHBlbmRpbmdMb25nQnVmZmVyfTwvYj48dWw+CiAgICAgICAgIDxsaT5DYW4gc3RvcmUgYW55IHNlcXVlbmNlIG9mIGxvbmdzLjwvbGk+CiAgICAgICAgIDxsaT5Db21wcmVzc2lvbiBpcyBnb29kIHdoZW4gdmFsdWVzIGFyZSBjbG9zZSB0byBlYWNoIG90aGVyLjwvbGk+CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9UZXN0U2VhcmNoLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9UZXN0U2VhcmNoLmphdmEKaW5kZXggYWZiYTUxZS4uZjJiZWRkNCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvVGVzdFNlYXJjaC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL1Rlc3RTZWFyY2guamF2YQpAQCAtMTEyLDEwICsxMTIsNyBAQAogICAgICAgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSk7CiAgICAgICBJbmRleFdyaXRlckNvbmZpZyBjb25mID0gbmV3SW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKTsKICAgICAgIE1lcmdlUG9saWN5IG1wID0gY29uZi5nZXRNZXJnZVBvbGljeSgpOwotICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICAgKChMb2dNZXJnZVBvbGljeSkgbXApLnNldFVzZUNvbXBvdW5kRmlsZSh1c2VDb21wb3VuZEZpbGUpOwotICAgICAgfQotICAgICAgCisgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZSA/IDEuMCA6IDAuMCk7CiAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyZWN0b3J5LCBjb25mKTsKIAogICAgICAgU3RyaW5nW10gZG9jcyA9IHsKQEAgLTEzMCw3ICsxMjcsNyBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkb2NzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgIERvY3VtZW50IGQgPSBuZXcgRG9jdW1lbnQoKTsKICAgICAgICAgZC5hZGQobmV3VGV4dEZpZWxkKCJjb250ZW50cyIsIGRvY3Nbal0sIEZpZWxkLlN0b3JlLllFUykpOwotICAgICAgICBkLmFkZChuZXdTdHJpbmdGaWVsZCgiaWQiLCAiIitqLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgICBkLmFkZChuZXcgSW50RmllbGQoImlkIiwgaiwgRmllbGQuU3RvcmUuTk8pKTsKICAgICAgICAgd3JpdGVyLmFkZERvY3VtZW50KGQpOwogICAgICAgfQogICAgICAgd3JpdGVyLmNsb3NlKCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9UZXN0U2VhcmNoRm9yRHVwbGljYXRlcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvVGVzdFNlYXJjaEZvckR1cGxpY2F0ZXMuamF2YQppbmRleCBmZjJmNDljLi4zZDk0MmRjIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9UZXN0U2VhcmNoRm9yRHVwbGljYXRlcy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL1Rlc3RTZWFyY2hGb3JEdXBsaWNhdGVzLmphdmEKQEAgLTcyLDkgKzcyLDcgQEAKICAgICAgIEFuYWx5emVyIGFuYWx5emVyID0gbmV3IE1vY2tBbmFseXplcihyYW5kb20pOwogICAgICAgSW5kZXhXcml0ZXJDb25maWcgY29uZiA9IG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBhbmFseXplcik7CiAgICAgICBmaW5hbCBNZXJnZVBvbGljeSBtcCA9IGNvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICAgIGlmIChtcCBpbnN0YW5jZW9mIExvZ01lcmdlUG9saWN5KSB7Ci0gICAgICAgICgoTG9nTWVyZ2VQb2xpY3kpIG1wKS5zZXRVc2VDb21wb3VuZEZpbGUodXNlQ29tcG91bmRGaWxlcyk7Ci0gICAgICB9CisgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZXMgPyAxLjAgOiAwLjApOwogICAgICAgSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGRpcmVjdG9yeSwgY29uZik7CiAgICAgICBpZiAoVkVSQk9TRSkgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRFU1Q6IG5vdyBidWlsZCBpbmRleCBNQVhfRE9DUz0iICsgTUFYX0RPQ1MpOwpAQCAtODMsNyArODEsNyBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNQVhfRE9DUzsgaisrKSB7CiAgICAgICAgIERvY3VtZW50IGQgPSBuZXcgRG9jdW1lbnQoKTsKICAgICAgICAgZC5hZGQobmV3VGV4dEZpZWxkKFBSSU9SSVRZX0ZJRUxELCBISUdIX1BSSU9SSVRZLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICAgICAgZC5hZGQobmV3VGV4dEZpZWxkKElEX0ZJRUxELCBJbnRlZ2VyLnRvU3RyaW5nKGopLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICAgICAgZC5hZGQobmV3IEludEZpZWxkKElEX0ZJRUxELCBqLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICAgICAgd3JpdGVyLmFkZERvY3VtZW50KGQpOwogICAgICAgfQogICAgICAgd3JpdGVyLmNsb3NlKCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvVGVzdENvbXByZXNzaW5nU3RvcmVkRmllbGRzRm9ybWF0LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvVGVzdENvbXByZXNzaW5nU3RvcmVkRmllbGRzRm9ybWF0LmphdmEKaW5kZXggZWFlMmY5NC4uMTU3YjM1MyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL1Rlc3RDb21wcmVzc2luZ1N0b3JlZEZpZWxkc0Zvcm1hdC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9UZXN0Q29tcHJlc3NpbmdTdG9yZWRGaWVsZHNGb3JtYXQuamF2YQpAQCAtNDksNiArNDksNyBAQAogICAgIGl3Q29uZi5zZXRDb2RlYyhDb21wcmVzc2luZ0NvZGVjLnJhbmRvbUluc3RhbmNlKHJhbmRvbSgpKSk7CiAgICAgLy8gZGlzYWJsZSBDRlMgYmVjYXVzZSB0aGlzIHRlc3QgY2hlY2tzIGZpbGUgbmFtZXMKICAgICBpd0NvbmYuc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koZmFsc2UpKTsKKyAgICBpd0NvbmYuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKICAgICBSYW5kb21JbmRleFdyaXRlciBpdyA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyLCBpd0NvbmYpOwogCiAgICAgZmluYWwgRG9jdW1lbnQgdmFsaWREb2MgPSBuZXcgRG9jdW1lbnQoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9wZXJmaWVsZC9UZXN0UGVyRmllbGRQb3N0aW5nc0Zvcm1hdDIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9wZXJmaWVsZC9UZXN0UGVyRmllbGRQb3N0aW5nc0Zvcm1hdDIuamF2YQppbmRleCBlZjNkYzZkLi5kMWVlZDQyIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvcGVyZmllbGQvVGVzdFBlckZpZWxkUG9zdGluZ3NGb3JtYXQyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL3BlcmZpZWxkL1Rlc3RQZXJGaWVsZFBvc3RpbmdzRm9ybWF0Mi5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgIHByaXZhdGUgSW5kZXhXcml0ZXIgbmV3V3JpdGVyKERpcmVjdG9yeSBkaXIsIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYpCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIExvZ0RvY01lcmdlUG9saWN5IGxvZ0J5dGVTaXplTWVyZ2VQb2xpY3kgPSBuZXcgTG9nRG9jTWVyZ2VQb2xpY3koKTsKLSAgICBsb2dCeXRlU2l6ZU1lcmdlUG9saWN5LnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSk7IC8vIG1ha2Ugc3VyZSB3ZSB1c2UgcGxhaW4KKyAgICBsb2dCeXRlU2l6ZU1lcmdlUG9saWN5LnNldE5vQ0ZTUmF0aW8oMC4wKTsgLy8gbWFrZSBzdXJlIHdlIHVzZSBwbGFpbgogICAgIC8vIGZpbGVzCiAgICAgY29uZi5zZXRNZXJnZVBvbGljeShsb2dCeXRlU2l6ZU1lcmdlUG9saWN5KTsKIApAQCAtMTQ2LDcgKzE0Niw3IEBACiAKICAgICBpd2NvbmYgPSBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpCiAgICAgICAgIC5zZXRPcGVuTW9kZShPcGVuTW9kZS5BUFBFTkQpLnNldENvZGVjKGNvZGVjKTsKLSAgICAvLygoTG9nTWVyZ2VQb2xpY3kpIGl3Y29uZi5nZXRNZXJnZVBvbGljeSgpKS5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgIC8vKChMb2dNZXJnZVBvbGljeSkgaXdjb25mLmdldE1lcmdlUG9saWN5KCkpLnNldE5vQ0ZTUmF0aW8oMC4wKTsKICAgICAvLygoTG9nTWVyZ2VQb2xpY3kpIGl3Y29uZi5nZXRNZXJnZVBvbGljeSgpKS5zZXRNZXJnZUZhY3RvcigxMCk7CiAgICAgaXdjb25mLnNldE1heEJ1ZmZlcmVkRG9jcyhJbmRleFdyaXRlckNvbmZpZy5ESVNBQkxFX0FVVE9fRkxVU0gpOwogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0QWRkSW5kZXhlcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEFkZEluZGV4ZXMuamF2YQppbmRleCA4OGJiYzNhLi5kZWZjODQ4IDEwMDc1NQotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0QWRkSW5kZXhlcy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RBZGRJbmRleGVzLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTU5Niw3ICs1OTcsNyBAQAogCiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIExvZ0J5dGVTaXplTWVyZ2VQb2xpY3kgbG1wID0gbmV3IExvZ0J5dGVTaXplTWVyZ2VQb2xpY3koKTsKLSAgICBsbXAuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICBsbXAuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgIGxtcC5zZXRNZXJnZUZhY3RvcigxMDApOwogICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKAogICAgICAgICBURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpCkBAIC02MjUsNyArNjI2LDcgQEAKICAgICBEaXJlY3RvcnkgZGlyMiA9IG5ld0RpcmVjdG9yeSgpOwogICAgIGxtcCA9IG5ldyBMb2dCeXRlU2l6ZU1lcmdlUG9saWN5KCk7CiAgICAgbG1wLnNldE1pbk1lcmdlTUIoMC4wMDAxKTsKLSAgICBsbXAuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICBsbXAuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgIGxtcC5zZXRNZXJnZUZhY3Rvcig0KTsKICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyMiwgbmV3SW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKQpAQCAtODg4LDcgKzg4OSw3IEBACiAKICAgICAgIGlmICh0IGluc3RhbmNlb2YgQWxyZWFkeUNsb3NlZEV4Y2VwdGlvbiB8fCB0IGluc3RhbmNlb2YgTWVyZ2VQb2xpY3kuTWVyZ2VBYm9ydGVkRXhjZXB0aW9uIHx8IHQgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbikgewogICAgICAgICByZXBvcnQgPSAhZGlkQ2xvc2U7Ci0gICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pICB7CisgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24gfHwgdCBpbnN0YW5jZW9mIE5vU3VjaEZpbGVFeGNlcHRpb24pICB7CiAgICAgICAgIHJlcG9ydCA9ICFkaWRDbG9zZTsKICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSAgewogICAgICAgICBUaHJvd2FibGUgdDIgPSB0LmdldENhdXNlKCk7CkBAIC0xMDk0LDcgKzEwOTUsNyBAQAogICAgIAogICAgIERpcmVjdG9yeSBkaXIgPSBuZXcgTW9ja0RpcmVjdG9yeVdyYXBwZXIocmFuZG9tKCksIG5ldyBSQU1EaXJlY3RvcnkoKSk7CiAgICAgSW5kZXhXcml0ZXJDb25maWcgY29uZiA9IG5ldyBJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KHRydWUpKTsKLSAgICBMb2dNZXJnZVBvbGljeSBsbXAgPSAoTG9nTWVyZ2VQb2xpY3kpIGNvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKKyAgICBNZXJnZVBvbGljeSBsbXAgPSBjb25mLmdldE1lcmdlUG9saWN5KCk7CiAgICAgLy8gRm9yY2UgY3JlYXRpb24gb2YgQ0ZTOgogICAgIGxtcC5zZXROb0NGU1JhdGlvKDEuMCk7CiAgICAgbG1wLnNldE1heENGU1NlZ21lbnRTaXplTUIoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RBdG9taWNVcGRhdGUuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RBdG9taWNVcGRhdGUuamF2YQppbmRleCBkYWQ3MzYxLi42NDQ0NzdlIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0QXRvbWljVXBkYXRlLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEF0b21pY1VwZGF0ZS5qYXZhCkBAIC0yNSwxOCArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuKjsKIAogcHVibGljIGNsYXNzIFRlc3RBdG9taWNVcGRhdGUgZXh0ZW5kcyBMdWNlbmVUZXN0Q2FzZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1vY2tJbmRleFdyaXRlciBleHRlbmRzIEluZGV4V3JpdGVyIHsKLSAgICBwdWJsaWMgTW9ja0luZGV4V3JpdGVyKERpcmVjdG9yeSBkaXIsIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBzdXBlcihkaXIsIGNvbmYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gdGVzdFBvaW50KFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAoTHVjZW5lVGVzdENhc2UucmFuZG9tKCkubmV4dEludCg0KSA9PSAyKQotICAgICAgICBUaHJlYWQueWllbGQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQorICAKIAogICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUaW1lZFRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgdm9sYXRpbGUgYm9vbGVhbiBmYWlsZWQ7CkBAIC0xMjQsNyArMTEzLDcgQEAKICAgICAgICAgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKQogICAgICAgICAuc2V0TWF4QnVmZmVyZWREb2NzKDcpOwogICAgICgoVGllcmVkTWVyZ2VQb2xpY3kpIGNvbmYuZ2V0TWVyZ2VQb2xpY3koKSkuc2V0TWF4TWVyZ2VBdE9uY2UoMyk7Ci0gICAgSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IE1vY2tJbmRleFdyaXRlcihkaXJlY3RvcnksIGNvbmYpOworICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IFJhbmRvbUluZGV4V3JpdGVyLm1vY2tJbmRleFdyaXRlcihkaXJlY3RvcnksIGNvbmYsIHJhbmRvbSgpKTsKIAogICAgIC8vIEVzdGFibGlzaCBhIGJhc2UgaW5kZXggb2YgMTAwIGRvY3M6CiAgICAgZm9yKGludCBpPTA7aTwxMDA7aSsrKSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0QmFja3dhcmRzQ29tcGF0aWJpbGl0eS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEJhY2t3YXJkc0NvbXBhdGliaWxpdHkuamF2YQppbmRleCA4MmUxOTQ3Li5jYTg1MTcyIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0QmFja3dhcmRzQ29tcGF0aWJpbGl0eS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RCYWNrd2FyZHNDb21wYXRpYmlsaXR5LmphdmEKQEAgLTU3Myw4ICs1NzMsNyBAQAogICAgIF9UZXN0VXRpbC5ybURpcihpbmRleERpcik7CiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0ZTRGlyZWN0b3J5KGluZGV4RGlyKTsKICAgICBMb2dCeXRlU2l6ZU1lcmdlUG9saWN5IG1wID0gbmV3IExvZ0J5dGVTaXplTWVyZ2VQb2xpY3koKTsKLSAgICBtcC5zZXRVc2VDb21wb3VuZEZpbGUoZG9DRlMpOwotICAgIG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKKyAgICBtcC5zZXROb0NGU1JhdGlvKGRvQ0ZTID8gMS4wIDogMC4wKTsKICAgICBtcC5zZXRNYXhDRlNTZWdtZW50U2l6ZU1CKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CiAgICAgLy8gVE9ETzogcmVtb3ZlIHJhbmRvbW5lc3MKICAgICBJbmRleFdyaXRlckNvbmZpZyBjb25mID0gbmV3IEluZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkKQEAgLTU5Myw4ICs1OTIsNyBAQAogICAgIGlmICghZnVsbHlNZXJnZWQpIHsKICAgICAgIC8vIG9wZW4gZnJlc2ggd3JpdGVyIHNvIHdlIGdldCBubyBwcnggZmlsZSBpbiB0aGUgYWRkZWQgc2VnbWVudAogICAgICAgbXAgPSBuZXcgTG9nQnl0ZVNpemVNZXJnZVBvbGljeSgpOwotICAgICAgbXAuc2V0VXNlQ29tcG91bmRGaWxlKGRvQ0ZTKTsKLSAgICAgIG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKKyAgICAgIG1wLnNldE5vQ0ZTUmF0aW8oZG9DRlMgPyAxLjAgOiAwLjApOwogICAgICAgLy8gVE9ETzogcmVtb3ZlIHJhbmRvbW5lc3MKICAgICAgIGNvbmYgPSBuZXcgSW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKQogICAgICAgICAuc2V0TWF4QnVmZmVyZWREb2NzKDEwKS5zZXRNZXJnZVBvbGljeShtcCk7CkBAIC02MjYsNyArNjI0LDcgQEAKICAgICB0cnkgewogICAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0ZTRGlyZWN0b3J5KG91dHB1dERpcik7CiAKLSAgICAgIExvZ01lcmdlUG9saWN5IG1lcmdlUG9saWN5ID0gbmV3TG9nTWVyZ2VQb2xpY3kodHJ1ZSwgMTApOworICAgICAgTWVyZ2VQb2xpY3kgbWVyZ2VQb2xpY3kgPSBuZXdMb2dNZXJnZVBvbGljeSh0cnVlLCAxMCk7CiAgICAgICAKICAgICAgIC8vIFRoaXMgdGVzdCBleHBlY3RzIGFsbCBvZiBpdHMgc2VnbWVudHMgdG8gYmUgaW4gQ0ZTOgogICAgICAgbWVyZ2VQb2xpY3kuc2V0Tm9DRlNSYXRpbygxLjApOyAKQEAgLTYzNyw3ICs2MzUsNyBAQAogICAgICAgICAgIG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuCiAgICAgICAgICAgICAgIHNldE1heEJ1ZmZlcmVkRG9jcygtMSkuCiAgICAgICAgICAgICAgIHNldFJBTUJ1ZmZlclNpemVNQigxNi4wKS4KLSAgICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobWVyZ2VQb2xpY3kpCisgICAgICAgICAgICAgIHNldE1lcmdlUG9saWN5KG1lcmdlUG9saWN5KS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSkKICAgICAgICk7CiAgICAgICBmb3IoaW50IGk9MDtpPDM1O2krKykgewogICAgICAgICBhZGREb2Mod3JpdGVyLCBpKTsKQEAgLTY0OSw3ICs2NDcsNyBAQAogICAgICAgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKAogICAgICAgICAgIGRpciwKICAgICAgICAgICBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpCi0gICAgICAgICAgICAuc2V0TWVyZ2VQb2xpY3koTm9NZXJnZVBvbGljeS5OT19DT01QT1VORF9GSUxFUykKKyAgICAgICAgICAgIC5zZXRNZXJnZVBvbGljeShOb01lcmdlUG9saWN5Lk5PX0NPTVBPVU5EX0ZJTEVTKS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSkKICAgICAgICk7CiAgICAgICBUZXJtIHNlYXJjaFRlcm0gPSBuZXcgVGVybSgiaWQiLCAiNyIpOwogICAgICAgd3JpdGVyLmRlbGV0ZURvY3VtZW50cyhzZWFyY2hUZXJtKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIuamF2YQppbmRleCAwYzc2NDI3Li5iMjRjNTNhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Q29uY3VycmVudE1lcmdlU2NoZWR1bGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlci5qYXZhCkBAIC01OCw2ICs1OCw5IEBACiAgICAgICAgIGJvb2xlYW4gaXNDbG9zZSA9IGZhbHNlOwogICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHRyYWNlID0gbmV3IEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFjZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChpc0RvRmx1c2ggJiYgaXNDbG9zZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICAgIGlmICgiZmx1c2giLmVxdWFscyh0cmFjZVtpXS5nZXRNZXRob2ROYW1lKCkpKSB7CiAgICAgICAgICAgICBpc0RvRmx1c2ggPSB0cnVlOwogICAgICAgICAgIH0KQEAgLTMwMiwxMSArMzA1LDcgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgfTsKLSAgICBpZiAobWF4TWVyZ2VUaHJlYWRzID4gY21zLmdldE1heE1lcmdlQ291bnQoKSkgewotICAgICAgY21zLnNldE1heE1lcmdlQ291bnQobWF4TWVyZ2VDb3VudCk7Ci0gICAgfQotICAgIGNtcy5zZXRNYXhUaHJlYWRDb3VudChtYXhNZXJnZVRocmVhZHMpOwotICAgIGNtcy5zZXRNYXhNZXJnZUNvdW50KG1heE1lcmdlQ291bnQpOworICAgIGNtcy5zZXRNYXhNZXJnZXNBbmRUaHJlYWRzKG1heE1lcmdlQ291bnQsIG1heE1lcmdlVGhyZWFkcyk7CiAgICAgaXdjLnNldE1lcmdlU2NoZWR1bGVyKGNtcyk7CiAgICAgaXdjLnNldE1heEJ1ZmZlcmVkRG9jcygyKTsKIApAQCAtMzMyLDggKzMzMSw3IEBACiAgICAgbG9uZyB0b3RNZXJnZWRCeXRlczsKIAogICAgIHB1YmxpYyBUcmFja2luZ0NNUygpIHsKLSAgICAgIHNldE1heE1lcmdlQ291bnQoNSk7Ci0gICAgICBzZXRNYXhUaHJlYWRDb3VudCg1KTsKKyAgICAgIHNldE1heE1lcmdlc0FuZFRocmVhZHMoNSwgNSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Q3VzdG9tTm9ybXMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RDdXN0b21Ob3Jtcy5qYXZhCmluZGV4IGVlYzQxMmMuLjJhMDUyOGUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RDdXN0b21Ob3Jtcy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RDdXN0b21Ob3Jtcy5qYXZhCkBAIC0xMTIsMTIgKzExMiw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4YWN0U2ltU2NvcmVyIGV4YWN0U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTbG9wcHlTaW1TY29yZXIgc2xvcHB5U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3REZWxldGlvblBvbGljeS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERlbGV0aW9uUG9saWN5LmphdmEKaW5kZXggNzY0NDU4My4uZjRkM2YzNiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERlbGV0aW9uUG9saWN5LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERlbGV0aW9uUG9saWN5LmphdmEKQEAgLTIyNSw5ICsyMjUsNyBAQAogICAgICAgICBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkKICAgICAgICAgLnNldEluZGV4RGVsZXRpb25Qb2xpY3kobmV3IEV4cGlyYXRpb25UaW1lRGVsZXRpb25Qb2xpY3koZGlyLCBTRUNPTkRTKSk7CiAgICAgTWVyZ2VQb2xpY3kgbXAgPSBjb25mLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICgoTG9nTWVyZ2VQb2xpY3kpIG1wKS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSk7Ci0gICAgfQorICAgIG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICBFeHBpcmF0aW9uVGltZURlbGV0aW9uUG9saWN5IHBvbGljeSA9IChFeHBpcmF0aW9uVGltZURlbGV0aW9uUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0SW5kZXhEZWxldGlvblBvbGljeSgpOwogICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBjb21taXREYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKQEAgLTI0Niw5ICsyNDQsNyBAQAogICAgICAgICAgIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRPcGVuTW9kZSgKICAgICAgICAgICBPcGVuTW9kZS5BUFBFTkQpLnNldEluZGV4RGVsZXRpb25Qb2xpY3kocG9saWN5KTsKICAgICAgIG1wID0gY29uZi5nZXRNZXJnZVBvbGljeSgpOwotICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICAgKChMb2dNZXJnZVBvbGljeSkgbXApLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKTsKLSAgICAgIH0KKyAgICAgIG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICAgIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIGNvbmYpOwogICAgICAgcG9saWN5ID0gKEV4cGlyYXRpb25UaW1lRGVsZXRpb25Qb2xpY3kpIHdyaXRlci5nZXRDb25maWcoKS5nZXRJbmRleERlbGV0aW9uUG9saWN5KCk7CiAgICAgICBmb3IoaW50IGo9MDtqPDE3O2orKykgewpAQCAtMzI2LDkgKzMyMiw3IEBACiAgICAgICAgICAgLnNldE1heEJ1ZmZlcmVkRG9jcygxMCkKICAgICAgICAgICAuc2V0TWVyZ2VTY2hlZHVsZXIobmV3IFNlcmlhbE1lcmdlU2NoZWR1bGVyKCkpOwogICAgICAgTWVyZ2VQb2xpY3kgbXAgPSBjb25mLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgICBpZiAobXAgaW5zdGFuY2VvZiBMb2dNZXJnZVBvbGljeSkgewotICAgICAgICAoKExvZ01lcmdlUG9saWN5KSBtcCkuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7Ci0gICAgICB9CisgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZSA/IDEuMCA6IDAuMCk7CiAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgIEtlZXBBbGxEZWxldGlvblBvbGljeSBwb2xpY3kgPSAoS2VlcEFsbERlbGV0aW9uUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0SW5kZXhEZWxldGlvblBvbGljeSgpOwogICAgICAgZm9yKGludCBpPTA7aTwxMDc7aSsrKSB7CkBAIC0zNDcsOSArMzQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRPcGVuTW9kZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1vZGUuQVBQRU5EKS5zZXRJbmRleERlbGV0aW9uUG9saWN5KHBvbGljeSk7CiAgICAgICAgIG1wID0gY29uZi5nZXRNZXJnZVBvbGljeSgpOwotICAgICAgICBpZiAobXAgaW5zdGFuY2VvZiBMb2dNZXJnZVBvbGljeSkgewotICAgICAgICAgICgoTG9nTWVyZ2VQb2xpY3kpIG1wKS5zZXRVc2VDb21wb3VuZEZpbGUodXNlQ29tcG91bmRGaWxlKTsKLSAgICAgICAgfQorICAgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZSA/IDEuMCA6IDAuMCk7CiAgICAgICAgIGlmIChWRVJCT1NFKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNUOiBvcGVuIHdyaXRlciBmb3IgZm9yY2VNZXJnZSIpOwogICAgICAgICB9CkBAIC01MjYsOSArNTE4LDcgQEAKICAgICAgICAgICAuc2V0SW5kZXhEZWxldGlvblBvbGljeShuZXcgS2VlcE5vbmVPbkluaXREZWxldGlvblBvbGljeSgpKQogICAgICAgICAgIC5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgICAgTWVyZ2VQb2xpY3kgbXAgPSBjb25mLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgICBpZiAobXAgaW5zdGFuY2VvZiBMb2dNZXJnZVBvbGljeSkgewotICAgICAgICAoKExvZ01lcmdlUG9saWN5KSBtcCkuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7Ci0gICAgICB9CisgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZSA/IDEuMCA6IDAuMCk7CiAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgIEtlZXBOb25lT25Jbml0RGVsZXRpb25Qb2xpY3kgcG9saWN5ID0gKEtlZXBOb25lT25Jbml0RGVsZXRpb25Qb2xpY3kpIHdyaXRlci5nZXRDb25maWcoKS5nZXRJbmRleERlbGV0aW9uUG9saWN5KCk7CiAgICAgICBmb3IoaW50IGk9MDtpPDEwNztpKyspIHsKQEAgLTUzOSw5ICs1MjksNyBAQAogICAgICAgY29uZiA9IG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkKICAgICAgICAgICAuc2V0T3Blbk1vZGUoT3Blbk1vZGUuQVBQRU5EKS5zZXRJbmRleERlbGV0aW9uUG9saWN5KHBvbGljeSk7CiAgICAgICBtcCA9IGNvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICAgIGlmIChtcCBpbnN0YW5jZW9mIExvZ01lcmdlUG9saWN5KSB7Ci0gICAgICAgICgoTG9nTWVyZ2VQb2xpY3kpIG1wKS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSk7Ci0gICAgICB9CisgICAgICBtcC5zZXROb0NGU1JhdGlvKDEuMCk7CiAgICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgIHBvbGljeSA9IChLZWVwTm9uZU9uSW5pdERlbGV0aW9uUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0SW5kZXhEZWxldGlvblBvbGljeSgpOwogICAgICAgd3JpdGVyLmZvcmNlTWVyZ2UoMSk7CkBAIC01ODEsOSArNTY5LDcgQEAKICAgICAgICAgICAgIC5zZXRJbmRleERlbGV0aW9uUG9saWN5KHBvbGljeSkKICAgICAgICAgICAgIC5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgICAgICBNZXJnZVBvbGljeSBtcCA9IGNvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICAgICAoKExvZ01lcmdlUG9saWN5KSBtcCkuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbXAuc2V0Tm9DRlNSYXRpbyh1c2VDb21wb3VuZEZpbGUgPyAxLjAgOiAwLjApOwogICAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgICAgcG9saWN5ID0gKEtlZXBMYXN0TkRlbGV0aW9uUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0SW5kZXhEZWxldGlvblBvbGljeSgpOwogICAgICAgICBmb3IoaW50IGk9MDtpPDE3O2krKykgewpAQCAtNjQyLDkgKzYyOCw3IEBACiAgICAgICAgICAgLnNldEluZGV4RGVsZXRpb25Qb2xpY3kobmV3IEtlZXBMYXN0TkRlbGV0aW9uUG9saWN5KE4pKQogICAgICAgICAgIC5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgICAgTWVyZ2VQb2xpY3kgbXAgPSBjb25mLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgICBpZiAobXAgaW5zdGFuY2VvZiBMb2dNZXJnZVBvbGljeSkgewotICAgICAgICAoKExvZ01lcmdlUG9saWN5KSBtcCkuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7Ci0gICAgICB9CisgICAgICBtcC5zZXROb0NGU1JhdGlvKHVzZUNvbXBvdW5kRmlsZSA/IDEuMCA6IDAuMCk7CiAgICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgIEtlZXBMYXN0TkRlbGV0aW9uUG9saWN5IHBvbGljeSA9IChLZWVwTGFzdE5EZWxldGlvblBvbGljeSkgd3JpdGVyLmdldENvbmZpZygpLmdldEluZGV4RGVsZXRpb25Qb2xpY3koKTsKICAgICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtNjU4LDkgKzY0Miw3IEBACiAgICAgICAgICAgICAuc2V0T3Blbk1vZGUoT3Blbk1vZGUuQVBQRU5EKS5zZXRJbmRleERlbGV0aW9uUG9saWN5KHBvbGljeSkKICAgICAgICAgICAgIC5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgICAgICBtcCA9IGNvbmYuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICAgICAoKExvZ01lcmdlUG9saWN5KSBtcCkuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbXAuc2V0Tm9DRlNSYXRpbyh1c2VDb21wb3VuZEZpbGUgPyAxLjAgOiAwLjApOwogICAgICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgICAgICAgcG9saWN5ID0gKEtlZXBMYXN0TkRlbGV0aW9uUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0SW5kZXhEZWxldGlvblBvbGljeSgpOwogICAgICAgICBmb3IoaW50IGo9MDtqPDE3O2orKykgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERpcmVjdG9yeVJlYWRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERpcmVjdG9yeVJlYWRlci5qYXZhCmluZGV4IDlmODg5MGIuLjEwMmI3YzkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3REaXJlY3RvcnlSZWFkZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0RGlyZWN0b3J5UmVhZGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtMzIsNiArMzMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5TdG9yZWRGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5TdHJpbmdGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5UZXh0RmllbGQ7CkBAIC00MjgsOCArNDMwLDggQEAKICAgICB9CiAgICAgdHJ5IHsKICAgICAgIERpcmVjdG9yeVJlYWRlci5vcGVuKGZpbGVEaXJOYW1lKTsKLSAgICAgIGZhaWwoIm9wZW5pbmcgRGlyZWN0b3J5UmVhZGVyIG9uIGVtcHR5IGRpcmVjdG9yeSBmYWlsZWQgdG8gcHJvZHVjZSBGaWxlTm90Rm91bmRFeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgZmFpbCgib3BlbmluZyBEaXJlY3RvcnlSZWFkZXIgb24gZW1wdHkgZGlyZWN0b3J5IGZhaWxlZCB0byBwcm9kdWNlIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbi9Ob1N1Y2hGaWxlRXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBHT09ECiAgICAgfQogICAgIHJtRGlyKGZpbGVEaXJOYW1lKTsKQEAgLTQ3MCw4ICs0NzIsOCBAQAogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdGU0RpcmVjdG9yeShkaXJGaWxlKTsKICAgICB0cnkgewogICAgICAgRGlyZWN0b3J5UmVhZGVyLm9wZW4oZGlyKTsKLSAgICAgIGZhaWwoImV4cGVjdGVkIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJleHBlY3RlZCBGaWxlTm90Rm91bmRFeGNlcHRpb24vTm9TdWNoRmlsZUV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgewogICAgICAgLy8gZXhwZWN0ZWQKICAgICB9CiAKQEAgLTQ4MCw4ICs0ODIsOCBAQAogICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgYSBDb3JydXB0SW5kZXhFeGNlcHRpb24gKG5vdCBOUEUpOgogICAgIHRyeSB7CiAgICAgICBEaXJlY3RvcnlSZWFkZXIub3BlbihkaXIpOwotICAgICAgZmFpbCgiZXhwZWN0ZWQgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoImV4cGVjdGVkIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbi9Ob1N1Y2hGaWxlRXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBleHBlY3RlZAogICAgIH0KICAgICAKQEAgLTc2Myw3ICs3NjUsNyBAQAogICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koMTApKQogICAgICk7CiAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgibnVtYmVyIiwgIjE3IiwgRmllbGQuU3RvcmUuTk8pKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgibnVtYmVyIiwgMTcsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgd3JpdGVyLmNvbW1pdCgpOwogICAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3REb2NWYWx1ZXNXaXRoVGhyZWFkcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERvY1ZhbHVlc1dpdGhUaHJlYWRzLmphdmEKaW5kZXggZmYzNGMyMi4uMTdjZTcyYiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERvY1ZhbHVlc1dpdGhUaHJlYWRzLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERvY1ZhbHVlc1dpdGhUaHJlYWRzLmphdmEKQEAgLTg3LDIzICs4NywxNyBAQAogICAgICAgICAgICAgICBCeXRlc1JlZiBzY3JhdGNoMiA9IG5ldyBCeXRlc1JlZigpOwogICAgICAgICAgICAgICBmb3IoaW50IGl0ZXI9MDtpdGVyPGl0ZXJzO2l0ZXIrKykgewogICAgICAgICAgICAgICAgIGludCBkb2NJRCA9IHRocmVhZFJhbmRvbS5uZXh0SW50KG51bURvY3MpOwotICAgICAgICAgICAgICAgIHN3aXRjaCh0aHJlYWRSYW5kb20ubmV4dEludCg2KSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCh0aHJlYWRSYW5kb20ubmV4dEludCg0KSkgewogICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgbnVtYmVycy5nZXQoZG9jSUQpLmxvbmdWYWx1ZSgpLCBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0Qnl0ZXMoYXIsICJudW1iZXIiLCBmYWxzZSkuZ2V0KGRvY0lEKSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKHNob3J0KSBudW1iZXJzLmdldChkb2NJRCkubG9uZ1ZhbHVlKCksIEZpZWxkQ2FjaGUuREVGQVVMVC5nZXRTaG9ydHMoYXIsICJudW1iZXIiLCBmYWxzZSkuZ2V0KGRvY0lEKSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGludCkgbnVtYmVycy5nZXQoZG9jSUQpLmxvbmdWYWx1ZSgpLCBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0SW50cyhhciwgIm51bWJlciIsIGZhbHNlKS5nZXQoZG9jSUQpKTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtYmVycy5nZXQoZG9jSUQpLmxvbmdWYWx1ZSgpLCBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0TG9uZ3MoYXIsICJudW1iZXIiLCBmYWxzZSkuZ2V0KGRvY0lEKSk7CiAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZsb2F0LmludEJpdHNUb0Zsb2F0KChpbnQpIG51bWJlcnMuZ2V0KGRvY0lEKS5sb25nVmFsdWUoKSksIEZpZWxkQ2FjaGUuREVGQVVMVC5nZXRGbG9hdHMoYXIsICJudW1iZXIiLCBmYWxzZSkuZ2V0KGRvY0lEKSwgMC4wZik7CiAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5sb25nQml0c1RvRG91YmxlKG51bWJlcnMuZ2V0KGRvY0lEKS5sb25nVmFsdWUoKSksIEZpZWxkQ2FjaGUuREVGQVVMVC5nZXREb3VibGVzKGFyLCAibnVtYmVyIiwgZmFsc2UpLmdldChkb2NJRCksIDAuMCk7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0RG9jdW1lbnRzV3JpdGVyU3RhbGxDb250cm9sLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0RG9jdW1lbnRzV3JpdGVyU3RhbGxDb250cm9sLmphdmEKaW5kZXggNDA2OTIyMy4uMzE5ZDdiYyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdERvY3VtZW50c1dyaXRlclN0YWxsQ29udHJvbC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3REb2N1bWVudHNXcml0ZXJTdGFsbENvbnRyb2wuamF2YQpAQCAtMzM5LDYgKzMzOSw3IEBACiAgICAgICBmb3IgKFRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7CiAgICAgICAgIGlmICh0aHJlYWQuZ2V0U3RhdGUoKSAhPSBzdGF0ZSkgewogICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKGRvbmUpIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RGaWVsZHNSZWFkZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RGaWVsZHNSZWFkZXIuamF2YQppbmRleCBjMmFkMWU5Li4wNTJhZDZmIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0RmllbGRzUmVhZGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEZpZWxkc1JlYWRlci5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAgICAgfQogICAgIGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYgPSBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpOwotICAgICgoTG9nTWVyZ2VQb2xpY3kpIGNvbmYuZ2V0TWVyZ2VQb2xpY3koKSkuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICBjb25mLmdldE1lcmdlUG9saWN5KCkuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIGNvbmYpOwogICAgIHdyaXRlci5hZGREb2N1bWVudCh0ZXN0RG9jKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTE3MCwxMiArMTcwLDExIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVhZEludGVybmFsKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgc2ltT3V0YWdlKCk7CisgICAgICBkZWxlZ2F0ZS5zZWVrKGdldEZpbGVQb2ludGVyKCkpOwogICAgICAgZGVsZWdhdGUucmVhZEJ5dGVzKGIsIG9mZnNldCwgbGVuZ3RoKTsKICAgICB9CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2Vla0ludGVybmFsKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgLy9zaW1PdXRhZ2UoKTsKLSAgICAgIGRlbGVnYXRlLnNlZWsocG9zKTsKICAgICB9CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgewpAQCAtMTg3LDcgKzE4NiwxNCBAQAogICAgIH0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmF1bHR5SW5kZXhJbnB1dCBjbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRmF1bHR5SW5kZXhJbnB1dChkZWxlZ2F0ZS5jbG9uZSgpKTsKKyAgICAgIEZhdWx0eUluZGV4SW5wdXQgaSA9IG5ldyBGYXVsdHlJbmRleElucHV0KGRlbGVnYXRlLmNsb25lKCkpOworICAgICAgLy8gc2VlayB0aGUgY2xvbmUgdG8gb3VyIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgIHRyeSB7CisgICAgICAgIGkuc2VlayhnZXRGaWxlUG9pbnRlcigpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpOwogICAgIH0KICAgfQogCkBAIC0xOTcsOCArMjAzLDkgQEAKIAogICAgIHRyeSB7CiAgICAgICBEaXJlY3RvcnkgZGlyID0gbmV3IEZhdWx0eUZTRGlyZWN0b3J5KGluZGV4RGlyKTsKLSAgICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKCAKLSAgICAgICAgICBURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLnNldE9wZW5Nb2RlKE9wZW5Nb2RlLkNSRUFURSkpOworICAgICAgSW5kZXhXcml0ZXJDb25maWcgaXdjID0gbmV3SW5kZXhXcml0ZXJDb25maWcoIAorICAgICAgICAgIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuc2V0T3Blbk1vZGUoT3Blbk1vZGUuQ1JFQVRFKTsKKyAgICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIGl3Yyk7CiAgICAgICBmb3IoaW50IGk9MDtpPDI7aSsrKQogICAgICAgICB3cml0ZXIuYWRkRG9jdW1lbnQodGVzdERvYyk7CiAgICAgICB3cml0ZXIuZm9yY2VNZXJnZSgxKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleEZpbGVEZWxldGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhGaWxlRGVsZXRlci5qYXZhCmluZGV4IDc5YTFkOGIuLmEzNGQyZjggMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleEZpbGVEZWxldGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4RmlsZURlbGV0ZXIuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgKChNb2NrRGlyZWN0b3J5V3JhcHBlcilkaXIpLnNldFByZXZlbnREb3VibGVXcml0ZShmYWxzZSk7CiAgICAgfQogCi0gICAgTG9nTWVyZ2VQb2xpY3kgbWVyZ2VQb2xpY3kgPSBuZXdMb2dNZXJnZVBvbGljeSh0cnVlLCAxMCk7CisgICAgTWVyZ2VQb2xpY3kgbWVyZ2VQb2xpY3kgPSBuZXdMb2dNZXJnZVBvbGljeSh0cnVlLCAxMCk7CiAgICAgCiAgICAgLy8gVGhpcyB0ZXN0IGV4cGVjdHMgYWxsIG9mIGl0cyBzZWdtZW50cyB0byBiZSBpbiBDRlMKICAgICBtZXJnZVBvbGljeS5zZXROb0NGU1JhdGlvKDEuMCk7CkBAIC01NCwxNCArNTQsMTUgQEAKICAgICAgICAgZGlyLAogICAgICAgICBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLgogICAgICAgICAgICAgc2V0TWF4QnVmZmVyZWREb2NzKDEwKS4KLSAgICAgICAgICAgIHNldE1lcmdlUG9saWN5KG1lcmdlUG9saWN5KQorICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobWVyZ2VQb2xpY3kpLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKQogICAgICk7CiAKICAgICBpbnQgaTsKICAgICBmb3IoaT0wO2k8MzU7aSsrKSB7CiAgICAgICBhZGREb2Mod3JpdGVyLCBpKTsKICAgICB9Ci0gICAgKChMb2dNZXJnZVBvbGljeSkgd3JpdGVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCkpLnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSk7CisgICAgd3JpdGVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCkuc2V0Tm9DRlNSYXRpbygwLjApOworICAgIHdyaXRlci5nZXRDb25maWcoKS5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOwogICAgIGZvcig7aTw0NTtpKyspIHsKICAgICAgIGFkZERvYyh3cml0ZXIsIGkpOwogICAgIH0KQEAgLTcxLDcgKzcyLDcgQEAKICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoCiAgICAgICAgIGRpciwKICAgICAgICAgbmV3SW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS4KLSAgICAgICAgICAgIHNldE1lcmdlUG9saWN5KE5vTWVyZ2VQb2xpY3kuTk9fQ09NUE9VTkRfRklMRVMpCisgICAgICAgICAgICBzZXRNZXJnZVBvbGljeShOb01lcmdlUG9saWN5Lk5PX0NPTVBPVU5EX0ZJTEVTKS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSkKICAgICApOwogICAgIFRlcm0gc2VhcmNoVGVybSA9IG5ldyBUZXJtKCJpZCIsICI3Iik7CiAgICAgd3JpdGVyLmRlbGV0ZURvY3VtZW50cyhzZWFyY2hUZXJtKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyLmphdmEKaW5kZXggNjdkZWZkZC4uOGNhYWZkNiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyLmphdmEKQEAgLTcwNCw3ICs3MDQsNyBAQAogICAgICAgSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuc2V0TWF4QnVmZmVyZWREb2NzKDIpLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpKTsKICAgICAgIC8vTG9nTWVyZ2VQb2xpY3kgbG1wID0gKExvZ01lcmdlUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKICAgICAgIC8vbG1wLnNldE1lcmdlRmFjdG9yKDIpOwotICAgICAgLy9sbXAuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICAgIC8vbG1wLnNldE5vQ0ZTUmF0aW8oMC4wKTsKICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgICAgU3RyaW5nIGNvbnRlbnRzID0gImFhIGJiIGNjIGRkIGVlIGZmIGdnIGhoIGlpIGpqIGtrIjsKIApAQCAtNzMyLDcgKzczMiw3IEBACiAgICAgICBpZiAoMCA9PSBpICUgNCkgewogICAgICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKSk7CiAgICAgICAgIC8vTG9nTWVyZ2VQb2xpY3kgbG1wMiA9IChMb2dNZXJnZVBvbGljeSkgd3JpdGVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgICAgIC8vbG1wMi5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgICAgICAvL2xtcDIuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgICAgICB3cml0ZXIuZm9yY2VNZXJnZSgxKTsKICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgICB9CkBAIC0xMzM5LDcgKzEzMzksNyBAQAogICAgIGZvcihpbnQgaXRlcj0wO2l0ZXI8MjtpdGVyKyspIHsKICAgICAgIERpcmVjdG9yeSBkaXIgPSBuZXdNb2NrRGlyZWN0b3J5KCk7IC8vIHJlbGllcyBvbiB3aW5kb3dzIHNlbWFudGljcwogCi0gICAgICBMb2dNZXJnZVBvbGljeSBtZXJnZVBvbGljeSA9IG5ld0xvZ01lcmdlUG9saWN5KHRydWUpOworICAgICAgTWVyZ2VQb2xpY3kgbWVyZ2VQb2xpY3kgPSBuZXdMb2dNZXJnZVBvbGljeSh0cnVlKTsKICAgICAgIAogICAgICAgLy8gVGhpcyB0ZXN0IGV4cGVjdHMgYWxsIG9mIGl0cyBzZWdtZW50cyB0byBiZSBpbiBDRlMKICAgICAgIG1lcmdlUG9saWN5LnNldE5vQ0ZTUmF0aW8oMS4wKTsKQEAgLTEzNDgsNyArMTM0OCw3IEBACiAgICAgICBJbmRleFdyaXRlciB3ID0gbmV3IEluZGV4V3JpdGVyKAogICAgICAgICAgIGRpciwKICAgICAgICAgICBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLgotICAgICAgICAgICAgICBzZXRNZXJnZVBvbGljeShtZXJnZVBvbGljeSkKKyAgICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobWVyZ2VQb2xpY3kpLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKQogICAgICAgKTsKICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgICAgZG9jLmFkZChuZXdUZXh0RmllbGQoImZpZWxkIiwgImdvIiwgRmllbGQuU3RvcmUuTk8pKTsKQEAgLTE0NjgsNyArMTQ2OCw3IEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKAogICAgICAgICBURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhCdWZmZXJlZERvY3MoMikuc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4QnVmZmVyZWREb2NzKDIpLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpLnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSkpOwogICAgIFN0cmluZ1tdIGZpbGVzID0gZGlyLmxpc3RBbGwoKTsKIAogICAgIC8vIENyZWF0aW5nIG92ZXIgZW1wdHkgZGlyIHNob3VsZCBub3QgY3JlYXRlIGFueSBmaWxlcywKQEAgLTE1NTAsNyArMTU1MCw3IEBACiAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLnNldFJBTUJ1ZmZlclNpemVNQigwLjAxKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7Ci0gICAgKChMb2dNZXJnZVBvbGljeSkgaW5kZXhXcml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKSkuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICBpbmRleFdyaXRlci5nZXRDb25maWcoKS5nZXRNZXJnZVBvbGljeSgpLnNldE5vQ0ZTUmF0aW8oMC4wKTsKIAogICAgIFN0cmluZyBCSUc9ImFsc2tqaGxha3NqZ2hsYWtzamZoYWxrc3ZqZXBnamlvZWZnam5zZGZqZ2VmZ2poZWxrZ2pocWV3bHJraGd3bGVrZ3Jod2Vsa2dqaHdlbGtncmh3bGtlamciOwogICAgIEJJRz1CSUcrQklHK0JJRytCSUc7CkBAIC0yMjA5LDQgKzIyMDksMjcgQEAKICAgICAgIGRpci5jbG9zZSgpOwogICAgIH0KICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIYXNVbmNvbW1pdHRlZENoYW5nZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKKyAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKSk7CisgICAgYXNzZXJ0VHJ1ZSh3cml0ZXIuaGFzVW5jb21taXR0ZWRDaGFuZ2VzKCkpOyAgLy8gdGhpcyB3aWxsIGJlIHRydWUgYmVjYXVzZSBhIGNvbW1pdCB3aWxsIGNyZWF0ZSBhbiBlbXB0eSBpbmRleAorICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOworICAgIGRvYy5hZGQobmV3VGV4dEZpZWxkKCJteWZpZWxkIiwgImEgYiBjIiwgRmllbGQuU3RvcmUuTk8pKTsKKyAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKKyAgICBhc3NlcnRUcnVlKHdyaXRlci5oYXNVbmNvbW1pdHRlZENoYW5nZXMoKSk7CisgICAgd3JpdGVyLmNvbW1pdCgpOworICAgIGFzc2VydEZhbHNlKHdyaXRlci5oYXNVbmNvbW1pdHRlZENoYW5nZXMoKSk7CisgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CisgICAgYXNzZXJ0VHJ1ZSh3cml0ZXIuaGFzVW5jb21taXR0ZWRDaGFuZ2VzKCkpOworICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkpOworICAgIGFzc2VydEZhbHNlKHdyaXRlci5oYXNVbmNvbW1pdHRlZENoYW5nZXMoKSk7CisgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CisgICAgYXNzZXJ0VHJ1ZSh3cml0ZXIuaGFzVW5jb21taXR0ZWRDaGFuZ2VzKCkpOworCisgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgZGlyLmNsb3NlKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlckNvbmZpZy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyQ29uZmlnLmphdmEKaW5kZXggMmY2NWQxMC4uOWJjMDgwMiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyQ29uZmlnLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyQ29uZmlnLmphdmEKQEAgLTIwLDExICsyMCwxNCBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkNvZGVjOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5GaWVsZEluZm9zRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5TdG9yZWRGaWVsZHNGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQuU3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkLkluZGV4aW5nQ2hhaW47CkBAIC03OCw2ICs4MSw3IEBACiAgICAgYXNzZXJ0RXF1YWxzKEluZGV4V3JpdGVyQ29uZmlnLkRFRkFVTFRfUkFNX1BFUl9USFJFQURfSEFSRF9MSU1JVF9NQiwgY29uZi5nZXRSQU1QZXJUaHJlYWRIYXJkTGltaXRNQigpKTsKICAgICBhc3NlcnRFcXVhbHMoQ29kZWMuZ2V0RGVmYXVsdCgpLCBjb25mLmdldENvZGVjKCkpOwogICAgIGFzc2VydEVxdWFscyhJbmZvU3RyZWFtLmdldERlZmF1bHQoKSwgY29uZi5nZXRJbmZvU3RyZWFtKCkpOworICAgIGFzc2VydEVxdWFscyhJbmRleFdyaXRlckNvbmZpZy5ERUZBVUxUX1VTRV9DT01QT1VORF9GSUxFX1NZU1RFTSwgY29uZi5nZXRVc2VDb21wb3VuZEZpbGUoKSk7CiAgICAgLy8gU2FuaXR5IGNoZWNrIC0gdmFsaWRhdGUgdGhhdCBhbGwgZ2V0dGVycyBhcmUgY292ZXJlZC4KICAgICBTZXQ8U3RyaW5nPiBnZXR0ZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgIGdldHRlcnMuYWRkKCJnZXRBbmFseXplciIpOwpAQCAtMTA0LDYgKzEwOCw3IEBACiAgICAgZ2V0dGVycy5hZGQoImdldFJBTVBlclRocmVhZEhhcmRMaW1pdE1CIik7CiAgICAgZ2V0dGVycy5hZGQoImdldENvZGVjIik7CiAgICAgZ2V0dGVycy5hZGQoImdldEluZm9TdHJlYW0iKTsKKyAgICBnZXR0ZXJzLmFkZCgiZ2V0VXNlQ29tcG91bmRGaWxlIik7CiAgICAgCiAgICAgZm9yIChNZXRob2QgbSA6IEluZGV4V3JpdGVyQ29uZmlnLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CiAgICAgICBpZiAobS5nZXREZWNsYXJpbmdDbGFzcygpID09IEluZGV4V3JpdGVyQ29uZmlnLmNsYXNzICYmIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImdldCIpKSB7CkBAIC0xODgsNiArMTkzLDcgQEAKICAgICBhc3NlcnRFcXVhbHMoSW5kZXhXcml0ZXJDb25maWcuRElTQUJMRV9BVVRPX0ZMVVNILCBJbmRleFdyaXRlckNvbmZpZy5ERUZBVUxUX01BWF9CVUZGRVJFRF9ET0NTKTsKICAgICBhc3NlcnRFcXVhbHMoMTYuMCwgSW5kZXhXcml0ZXJDb25maWcuREVGQVVMVF9SQU1fQlVGRkVSX1NJWkVfTUIsIDAuMCk7CiAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBJbmRleFdyaXRlckNvbmZpZy5ERUZBVUxUX1JFQURFUl9QT09MSU5HKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgSW5kZXhXcml0ZXJDb25maWcuREVGQVVMVF9VU0VfQ09NUE9VTkRfRklMRV9TWVNURU0pOwogICAgIGFzc2VydEVxdWFscyhEaXJlY3RvcnlSZWFkZXIuREVGQVVMVF9URVJNU19JTkRFWF9ESVZJU09SLCBJbmRleFdyaXRlckNvbmZpZy5ERUZBVUxUX1JFQURFUl9URVJNU19JTkRFWF9ESVZJU09SKTsKICAgfQogCkBAIC0zNzAsMjYgKzM3NiwzNiBAQAogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKICAgICBJbmRleFdyaXRlckNvbmZpZyBpd2MgPSBuZXcgSW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKTsKICAgICBpd2Muc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3kodHJ1ZSkpOwotCiAgICAgLy8gU3RhcnQgZmFsc2U6Ci0gICAgKChMb2dNZXJnZVBvbGljeSkgaXdjLmdldE1lcmdlUG9saWN5KCkpLnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSk7IAorICAgIGl3Yy5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOyAKKyAgICBpd2MuZ2V0TWVyZ2VQb2xpY3koKS5zZXROb0NGU1JhdGlvKDAuMGQpOwogICAgIEluZGV4V3JpdGVyIHcgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBpd2MpOwotCiAgICAgLy8gQ2hhbmdlIHRvIHRydWU6Ci0gICAgTG9nTWVyZ2VQb2xpY3kgbG1wID0gKChMb2dNZXJnZVBvbGljeSkgdy5nZXRDb25maWcoKS5nZXRNZXJnZVBvbGljeSgpKTsKLSAgICBsbXAuc2V0Tm9DRlNSYXRpbygxLjApOwotICAgIGxtcC5zZXRNYXhDRlNTZWdtZW50U2l6ZU1CKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7Ci0gICAgbG1wLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKTsKKyAgICB3LmdldENvbmZpZygpLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKTsKIAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImZpZWxkIiwgImZvbyIsIFN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogICAgIHcuY29tbWl0KCk7Ci0KLSAgICBmb3IoU3RyaW5nIGZpbGUgOiBkaXIubGlzdEFsbCgpKSB7Ci0gICAgICAvLyBmcnEgZmlsZSBzaG91bGQgYmUgc3R1Y2sgaW50byBDRlMKLSAgICAgIGFzc2VydEZhbHNlKGZpbGUuZW5kc1dpdGgoIi5mcnEiKSk7Ci0gICAgfQorICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIENGUyBhZnRlciBjb21taXQiLCB3Lm5ld2VzdFNlZ21lbnQoKS5pbmZvLmdldFVzZUNvbXBvdW5kRmlsZSgpKTsKKyAgICAKKyAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJmaWVsZCIsICJmb28iLCBTdG9yZS5OTykpOworICAgIHcuYWRkRG9jdW1lbnQoZG9jKTsKKyAgICB3LmNvbW1pdCgpOworICAgIHcuZm9yY2VNZXJnZSgxKTsKKyAgICB3LmNvbW1pdCgpOworICAgCisgICAgLy8gbm8gY29tcG91bmQgZmlsZXMgYWZ0ZXIgbWVyZ2UKKyAgICBhc3NlcnRGYWxzZSgiRXhwZWN0ZWQgTm9uLUNGUyBhZnRlciBtZXJnZSIsIHcubmV3ZXN0U2VnbWVudCgpLmluZm8uZ2V0VXNlQ29tcG91bmRGaWxlKCkpOworICAgIAorICAgIE1lcmdlUG9saWN5IGxtcCA9IHcuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKKyAgICBsbXAuc2V0Tm9DRlNSYXRpbygxLjApOworICAgIGxtcC5zZXRNYXhDRlNTZWdtZW50U2l6ZU1CKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CisgICAgCisgICAgdy5hZGREb2N1bWVudChkb2MpOworICAgIHcuZm9yY2VNZXJnZSgxKTsKKyAgICB3LmNvbW1pdCgpOworICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIENGUyBhZnRlciBtZXJnZSIsIHcubmV3ZXN0U2VnbWVudCgpLmluZm8uZ2V0VXNlQ29tcG91bmRGaWxlKCkpOwogICAgIHcuY2xvc2UoKTsKICAgICBkaXIuY2xvc2UoKTsKICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyRGVsZXRlLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJEZWxldGUuamF2YQppbmRleCBiY2IxNTRkLi5kYjk0Y2I5IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJEZWxldGUuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJEZWxldGUuamF2YQpAQCAtNzY4LDggKzc2OCw4IEBACiAgICAgSW5kZXhXcml0ZXIgbW9kaWZpZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpLCBNb2NrVG9rZW5pemVyLldISVRFU1BBQ0UsIGZhbHNlKSkuc2V0TWF4QnVmZmVyZWREZWxldGVUZXJtcygyKS5zZXRSZWFkZXJQb29saW5nKGZhbHNlKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7CiAKLSAgICBMb2dNZXJnZVBvbGljeSBsbXAgPSAoTG9nTWVyZ2VQb2xpY3kpIG1vZGlmaWVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCk7Ci0gICAgbG1wLnNldFVzZUNvbXBvdW5kRmlsZSh0cnVlKTsKKyAgICBNZXJnZVBvbGljeSBsbXAgPSBtb2RpZmllci5nZXRDb25maWcoKS5nZXRNZXJnZVBvbGljeSgpOworICAgIGxtcC5zZXROb0NGU1JhdGlvKDEuMCk7CiAKICAgICBkaXIuZmFpbE9uKGZhaWx1cmUucmVzZXQoKSk7CiAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlckV4Y2VwdGlvbnMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlckV4Y2VwdGlvbnMuamF2YQppbmRleCBjN2NkMGYwLi41YzIzYjgwIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJFeGNlcHRpb25zLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyRXhjZXB0aW9ucy5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0yMTAsMTUgKzIxMSwxMCBAQAogCiAgIFRocmVhZExvY2FsPFRocmVhZD4gZG9GYWlsID0gbmV3IFRocmVhZExvY2FsPFRocmVhZD4oKTsKIAotICBwcml2YXRlIGNsYXNzIE1vY2tJbmRleFdyaXRlciBleHRlbmRzIEluZGV4V3JpdGVyIHsKKyAgcHJpdmF0ZSBjbGFzcyBUZXN0UG9pbnQxIGltcGxlbWVudHMgUmFuZG9tSW5kZXhXcml0ZXIuVGVzdFBvaW50IHsKICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20ocmFuZG9tKCkubmV4dExvbmcoKSk7Ci0KLSAgICBwdWJsaWMgTW9ja0luZGV4V3JpdGVyKERpcmVjdG9yeSBkaXIsIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBzdXBlcihkaXIsIGNvbmYpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gdGVzdFBvaW50KFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHZvaWQgYXBwbHkoU3RyaW5nIG5hbWUpIHsKICAgICAgIGlmIChkb0ZhaWwuZ2V0KCkgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoInN0YXJ0RG9GbHVzaCIpICYmIHIubmV4dEludCg0MCkgPT0gMTcpIHsKICAgICAgICAgaWYgKFZFUkJPU0UpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiBOT1cgRkFJTDogIiArIG5hbWUpOwpAQCAtMjI2LDcgKzIyMiw2IEBACiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiBpbnRlbnRpb25hbGx5IGZhaWxpbmcgYXQgIiArIG5hbWUpOwogICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CiAKQEAgLTIzOCw4ICsyMzMsOSBAQAogCiAgICAgTW9ja0FuYWx5emVyIGFuYWx5emVyID0gbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSk7CiAgICAgYW5hbHl6ZXIuc2V0RW5hYmxlQ2hlY2tzKGZhbHNlKTsgLy8gZGlzYWJsZSB3b3JrZmxvdyBjaGVja2luZyBhcyB3ZSBmb3JjZWZ1bGx5IGNsb3NlKCkgaW4gZXhjZXB0aW9uYWwgY2FzZXMuCi0gICAgTW9ja0luZGV4V3JpdGVyIHdyaXRlciAgPSBuZXcgTW9ja0luZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBhbmFseXplcikKLSAgICAgICAgLnNldFJBTUJ1ZmZlclNpemVNQigwLjEpLnNldE1lcmdlU2NoZWR1bGVyKG5ldyBDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIoKSkpOworICAgIAorICAgIEluZGV4V3JpdGVyIHdyaXRlciAgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKQorICAgICAgICAuc2V0UkFNQnVmZmVyU2l6ZU1CKDAuMSkuc2V0TWVyZ2VTY2hlZHVsZXIobmV3IENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlcigpKSwgbmV3IFRlc3RQb2ludDEoKSk7CiAgICAgKChDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIpIHdyaXRlci5nZXRDb25maWcoKS5nZXRNZXJnZVNjaGVkdWxlcigpKS5zZXRTdXBwcmVzc0V4Y2VwdGlvbnMoKTsKICAgICAvL3dyaXRlci5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgIGlmIChWRVJCT1NFKSB7CkBAIC0yODEsOCArMjc3LDggQEAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgTW9ja0FuYWx5emVyIGFuYWx5emVyID0gbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSk7CiAgICAgYW5hbHl6ZXIuc2V0RW5hYmxlQ2hlY2tzKGZhbHNlKTsgLy8gZGlzYWJsZSB3b3JrZmxvdyBjaGVja2luZyBhcyB3ZSBmb3JjZWZ1bGx5IGNsb3NlKCkgaW4gZXhjZXB0aW9uYWwgY2FzZXMuCi0gICAgTW9ja0luZGV4V3JpdGVyIHdyaXRlciAgPSBuZXcgTW9ja0luZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBhbmFseXplcikKLSAgICAgICAgLnNldFJBTUJ1ZmZlclNpemVNQigwLjIpLnNldE1lcmdlU2NoZWR1bGVyKG5ldyBDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIoKSkpOworICAgIEluZGV4V3JpdGVyIHdyaXRlciAgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKQorICAgICAgICAuc2V0UkFNQnVmZmVyU2l6ZU1CKDAuMikuc2V0TWVyZ2VTY2hlZHVsZXIobmV3IENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlcigpKSwgbmV3IFRlc3RQb2ludDEoKSk7CiAgICAgKChDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIpIHdyaXRlci5nZXRDb25maWcoKS5nZXRNZXJnZVNjaGVkdWxlcigpKS5zZXRTdXBwcmVzc0V4Y2VwdGlvbnMoKTsKICAgICAvL3dyaXRlci5zZXRNYXhCdWZmZXJlZERvY3MoMTApOwogICAgIHdyaXRlci5jb21taXQoKTsKQEAgLTMyNCwxOSArMzIwLDEzIEBACiAgIH0KIAogICAvLyBMVUNFTkUtMTE5OAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNb2NrSW5kZXhXcml0ZXIyIGV4dGVuZHMgSW5kZXhXcml0ZXIgewotCi0gICAgcHVibGljIE1vY2tJbmRleFdyaXRlcjIoRGlyZWN0b3J5IGRpciwgSW5kZXhXcml0ZXJDb25maWcgY29uZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHN1cGVyKGRpciwgY29uZik7Ci0gICAgfQotCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RQb2ludDIgaW1wbGVtZW50cyBSYW5kb21JbmRleFdyaXRlci5UZXN0UG9pbnQgewogICAgIGJvb2xlYW4gZG9GYWlsOwogCiAgICAgQE92ZXJyaWRlCi0gICAgYm9vbGVhbiB0ZXN0UG9pbnQoU3RyaW5nIG5hbWUpIHsKKyAgICBwdWJsaWMgdm9pZCBhcHBseShTdHJpbmcgbmFtZSkgewogICAgICAgaWYgKGRvRmFpbCAmJiBuYW1lLmVxdWFscygiRG9jdW1lbnRzV3JpdGVyUGVyVGhyZWFkIGFkZERvY3VtZW50IHN0YXJ0IikpCiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IGZhaWxpbmciKTsKLSAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQogCkBAIC0zNjcsMTEgKzM1NywxMiBAQAogCiAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25Eb2N1bWVudHNXcml0ZXJJbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgTW9ja0luZGV4V3JpdGVyMiB3ID0gbmV3IE1vY2tJbmRleFdyaXRlcjIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKSk7CisgICAgVGVzdFBvaW50MiB0ZXN0UG9pbnQgPSBuZXcgVGVzdFBvaW50MigpOworICAgIEluZGV4V3JpdGVyIHcgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKSwgdGVzdFBvaW50KTsKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiZmllbGQiLCAiYSBmaWVsZCIsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHcuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICB3LmRvRmFpbCA9IHRydWU7CisgICAgdGVzdFBvaW50LmRvRmFpbCA9IHRydWU7CiAgICAgdHJ5IHsKICAgICAgIHcuYWRkRG9jdW1lbnQoZG9jKTsKICAgICAgIGZhaWwoImRpZCBub3QgaGl0IGV4Y2VwdGlvbiIpOwpAQCAtMzg1LDcgKzM3Niw3IEBACiAgIC8vIExVQ0VORS0xMjA4CiAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25KdXN0QmVmb3JlRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBNb2NrSW5kZXhXcml0ZXIgdyA9IG5ldyBNb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRNYXhCdWZmZXJlZERvY3MoMikpOworICAgIEluZGV4V3JpdGVyIHcgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRNYXhCdWZmZXJlZERvY3MoMiksIG5ldyBUZXN0UG9pbnQxKCkpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIGRvYy5hZGQobmV3VGV4dEZpZWxkKCJmaWVsZCIsICJhIGZpZWxkIiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwpAQCAtNDEyLDIyICs0MDMsMTUgQEAKICAgICBkaXIuY2xvc2UoKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1vY2tJbmRleFdyaXRlcjMgZXh0ZW5kcyBJbmRleFdyaXRlciB7Ci0KLSAgICBwdWJsaWMgTW9ja0luZGV4V3JpdGVyMyhEaXJlY3RvcnkgZGlyLCBJbmRleFdyaXRlckNvbmZpZyBjb25mKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgc3VwZXIoZGlyLCBjb25mKTsKLSAgICB9Ci0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGVzdFBvaW50MyBpbXBsZW1lbnRzIFJhbmRvbUluZGV4V3JpdGVyLlRlc3RQb2ludCB7CiAgICAgYm9vbGVhbiBkb0ZhaWw7CiAgICAgYm9vbGVhbiBmYWlsZWQ7Ci0KICAgICBAT3ZlcnJpZGUKLSAgICBib29sZWFuIHRlc3RQb2ludChTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyB2b2lkIGFwcGx5KFN0cmluZyBuYW1lKSB7CiAgICAgICBpZiAoZG9GYWlsICYmIG5hbWUuZXF1YWxzKCJzdGFydE1lcmdlSW5pdCIpKSB7CiAgICAgICAgIGZhaWxlZCA9IHRydWU7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IGZhaWxpbmciKTsKICAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQogCkBAIC00NDEsOCArNDI1LDkgQEAKICAgICBjbXMuc2V0U3VwcHJlc3NFeGNlcHRpb25zKCk7CiAgICAgY29uZi5zZXRNZXJnZVNjaGVkdWxlcihjbXMpOwogICAgICgoTG9nTWVyZ2VQb2xpY3kpIGNvbmYuZ2V0TWVyZ2VQb2xpY3koKSkuc2V0TWVyZ2VGYWN0b3IoMik7Ci0gICAgTW9ja0luZGV4V3JpdGVyMyB3ID0gbmV3IE1vY2tJbmRleFdyaXRlcjMoZGlyLCBjb25mKTsKLSAgICB3LmRvRmFpbCA9IHRydWU7CisgICAgVGVzdFBvaW50MyB0ZXN0UG9pbnQgPSBuZXcgVGVzdFBvaW50MygpOworICAgIEluZGV4V3JpdGVyIHcgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBjb25mLCB0ZXN0UG9pbnQpOworICAgIHRlc3RQb2ludC5kb0ZhaWwgPSB0cnVlOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIGRvYy5hZGQobmV3VGV4dEZpZWxkKCJmaWVsZCIsICJhIGZpZWxkIiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgZm9yKGludCBpPTA7aTwxMDtpKyspCkBAIC00NTMsNyArNDM4LDcgQEAKICAgICAgIH0KIAogICAgICgoQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKSB3LmdldENvbmZpZygpLmdldE1lcmdlU2NoZWR1bGVyKCkpLnN5bmMoKTsKLSAgICBhc3NlcnRUcnVlKHcuZmFpbGVkKTsKKyAgICBhc3NlcnRUcnVlKHRlc3RQb2ludC5mYWlsZWQpOwogICAgIHcuY2xvc2UoKTsKICAgICBkaXIuY2xvc2UoKTsKICAgfQpAQCAtNTU1LDEwICs1NDAsMTUgQEAKICAgICAgICAgYm9vbGVhbiBzYXdBcHBlbmQgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBzYXdGbHVzaCA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKEZyZXFQcm94VGVybXNXcml0ZXJQZXJGaWVsZC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHRyYWNlW2ldLmdldENsYXNzTmFtZSgpKSAmJiAiZmx1c2giLmVxdWFscyh0cmFjZVtpXS5nZXRNZXRob2ROYW1lKCkpKQorICAgICAgICAgIGlmIChzYXdBcHBlbmQgJiYgc2F3Rmx1c2gpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoRnJlcVByb3hUZXJtc1dyaXRlclBlckZpZWxkLmNsYXNzLmdldE5hbWUoKS5lcXVhbHModHJhY2VbaV0uZ2V0Q2xhc3NOYW1lKCkpICYmICJmbHVzaCIuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpIHsKICAgICAgICAgICAgIHNhd0FwcGVuZCA9IHRydWU7Ci0gICAgICAgICAgaWYgKCJmbHVzaCIuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpCisgICAgICAgICAgfQorICAgICAgICAgIGlmICgiZmx1c2giLmVxdWFscyh0cmFjZVtpXS5nZXRNZXRob2ROYW1lKCkpKSB7CiAgICAgICAgICAgICBzYXdGbHVzaCA9IHRydWU7CisgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNhd0FwcGVuZCAmJiBzYXdGbHVzaCAmJiBjb3VudCsrID49IDMwKSB7CkBAIC04OTIsMTIgKzg4MiwxOCBAQAogICAgICAgYm9vbGVhbiBpc0RlbGV0ZSA9IGZhbHNlOwogICAgICAgYm9vbGVhbiBpc0luR2xvYmFsRmllbGRNYXAgPSBmYWxzZTsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2UubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKFNlZ21lbnRJbmZvcy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHRyYWNlW2ldLmdldENsYXNzTmFtZSgpKSAmJiBzdGFnZS5lcXVhbHModHJhY2VbaV0uZ2V0TWV0aG9kTmFtZSgpKSkKKyAgICAgICAgaWYgKGlzQ29tbWl0ICYmIGlzRGVsZXRlICYmIGlzSW5HbG9iYWxGaWVsZE1hcCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChTZWdtZW50SW5mb3MuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0cmFjZVtpXS5nZXRDbGFzc05hbWUoKSkgJiYgc3RhZ2UuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpIHsKICAgICAgICAgICBpc0NvbW1pdCA9IHRydWU7Ci0gICAgICAgIGlmIChNb2NrRGlyZWN0b3J5V3JhcHBlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHRyYWNlW2ldLmdldENsYXNzTmFtZSgpKSAmJiAiZGVsZXRlRmlsZSIuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpCisgICAgICAgIH0KKyAgICAgICAgaWYgKE1vY2tEaXJlY3RvcnlXcmFwcGVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHModHJhY2VbaV0uZ2V0Q2xhc3NOYW1lKCkpICYmICJkZWxldGVGaWxlIi5lcXVhbHModHJhY2VbaV0uZ2V0TWV0aG9kTmFtZSgpKSkgewogICAgICAgICAgIGlzRGVsZXRlID0gdHJ1ZTsKLSAgICAgICAgaWYgKFNlZ21lbnRJbmZvcy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHRyYWNlW2ldLmdldENsYXNzTmFtZSgpKSAmJiAid3JpdGVHbG9iYWxGaWVsZE1hcCIuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpCisgICAgICAgIH0KKyAgICAgICAgaWYgKFNlZ21lbnRJbmZvcy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHRyYWNlW2ldLmdldENsYXNzTmFtZSgpKSAmJiAid3JpdGVHbG9iYWxGaWVsZE1hcCIuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpIHsKICAgICAgICAgICBpc0luR2xvYmFsRmllbGRNYXAgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgICAgCiAgICAgICB9CiAgICAgICBpZiAoaXNJbkdsb2JhbEZpZWxkTWFwICYmIGRvbnRGYWlsRHVyaW5nR2xvYmFsRmllbGRNYXApIHsKQEAgLTEwMTQsMjkgKzEwMTAsMjYgQEAKICAgfQogCiAgIC8vIExVQ0VORS0xMzQ3Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1vY2tJbmRleFdyaXRlcjQgZXh0ZW5kcyBJbmRleFdyaXRlciB7Ci0KLSAgICBwdWJsaWMgTW9ja0luZGV4V3JpdGVyNChEaXJlY3RvcnkgZGlyLCBJbmRleFdyaXRlckNvbmZpZyBjb25mKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgc3VwZXIoZGlyLCBjb25mKTsKLSAgICB9CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RQb2ludDQgaW1wbGVtZW50cyBSYW5kb21JbmRleFdyaXRlci5UZXN0UG9pbnQgewogCiAgICAgYm9vbGVhbiBkb0ZhaWw7CiAKICAgICBAT3ZlcnJpZGUKLSAgICBib29sZWFuIHRlc3RQb2ludChTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyB2b2lkIGFwcGx5KFN0cmluZyBuYW1lKSB7CiAgICAgICBpZiAoZG9GYWlsICYmIG5hbWUuZXF1YWxzKCJyb2xsYmFjayBiZWZvcmUgY2hlY2twb2ludCIpKQogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBmYWlsaW5nIik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KIAogICAvLyBMVUNFTkUtMTM0NwogICBwdWJsaWMgdm9pZCB0ZXN0Um9sbGJhY2tFeGNlcHRpb25IYW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwotICAgIE1vY2tJbmRleFdyaXRlcjQgdyA9IG5ldyBNb2NrSW5kZXhXcml0ZXI0KGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkpOworICAgIFRlc3RQb2ludDQgdGVzdFBvaW50ID0gbmV3IFRlc3RQb2ludDQoKTsKKyAgICBJbmRleFdyaXRlciB3ID0gUmFuZG9tSW5kZXhXcml0ZXIubW9ja0luZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSksIHRlc3RQb2ludCk7CisgICAgCiAKICAgICBhZGREb2Modyk7Ci0gICAgdy5kb0ZhaWwgPSB0cnVlOworICAgIHRlc3RQb2ludC5kb0ZhaWwgPSB0cnVlOwogICAgIHRyeSB7CiAgICAgICB3LnJvbGxiYWNrKCk7CiAgICAgICBmYWlsKCJkaWQgbm90IGhpdCBpbnRlbnRpb25hbCBSdW50aW1lRXhjZXB0aW9uIik7CkBAIC0xMDQ0LDcgKzEwMzcsNyBAQAogICAgICAgLy8gZXhwZWN0ZWQKICAgICB9CiAKLSAgICB3LmRvRmFpbCA9IGZhbHNlOworICAgIHRlc3RQb2ludC5kb0ZhaWwgPSBmYWxzZTsKICAgICB3LnJvbGxiYWNrKCk7CiAgICAgZGlyLmNsb3NlKCk7CiAgIH0KQEAgLTExNTAsOSArMTE0Myw5IEBACiAgICAgd3JpdGVyICA9IG5ldyBJbmRleFdyaXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSh0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KHRydWUpKS5zZXRVc2VDb21wb3VuZEZpbGUodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgTG9nTWVyZ2VQb2xpY3kgbG1wID0gKExvZ01lcmdlUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKKyAgICBNZXJnZVBvbGljeSBsbXAgPSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKICAgICAvLyBGb3JjZSBjcmVhdGlvbiBvZiBDRlM6CiAgICAgbG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICBsbXAuc2V0TWF4Q0ZTU2VnbWVudFNpemVNQihEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpOwpAQCAtMTM0Miw2ICsxMzM1LDcgQEAKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgaWYgKFRlcm1WZWN0b3JzQ29uc3VtZXIuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0cmFjZVtpXS5nZXRDbGFzc05hbWUoKSkgJiYgc3RhZ2UuZXF1YWxzKHRyYWNlW2ldLmdldE1ldGhvZE5hbWUoKSkpIHsKICAgICAgICAgICBmYWlsID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgICAgCkBAIC0xNjc4LDcgKzE2NzIsNyBAQAogICAgICAgfSBjYXRjaCAoQ29ycnVwdEluZGV4RXhjZXB0aW9uIGV4KSB7CiAgICAgICAgIC8vIEV4Y2VwdGlvbnMgYXJlIGZpbmUgLSB3ZSBhcmUgcnVubmluZyBvdXQgb2YgZmlsZSBoYW5kbGVycyBoZXJlCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gfCBOb1N1Y2hGaWxlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgZmFpbHVyZS5jbGVhckRvRmFpbCgpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyTG9ja1JlbGVhc2UuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlckxvY2tSZWxlYXNlLmphdmEKaW5kZXggYWFhMGZiMS4uZTY0NjdmMSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyTG9ja1JlbGVhc2UuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJMb2NrUmVsZWFzZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLk1vY2tBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlckNvbmZpZy5PcGVuTW9kZTsKQEAgLTM3LDEwICszOCwxMCBAQAogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdGU0RpcmVjdG9yeShfVGVzdFV0aWwuZ2V0VGVtcERpcigidGVzdExvY2tSZWxlYXNlIikpOwogICAgIHRyeSB7CiAgICAgICBuZXcgSW5kZXhXcml0ZXIoZGlyLCBuZXcgSW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRPcGVuTW9kZShPcGVuTW9kZS5BUFBFTkQpKTsKLSAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgewogICAgICAgdHJ5IHsKICAgICAgICAgbmV3IEluZGV4V3JpdGVyKGRpciwgbmV3IEluZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuc2V0T3Blbk1vZGUoT3Blbk1vZGUuQVBQRU5EKSk7Ci0gICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKKyAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZTEpIHsKICAgICAgIH0KICAgICB9IGZpbmFsbHkgewogICAgICAgZGlyLmNsb3NlKCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJNZXJnZVBvbGljeS5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyTWVyZ2VQb2xpY3kuamF2YQppbmRleCBkMDE0YjY0Li5hMDU1ODBlIDEwMDc1NQotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJNZXJnZVBvbGljeS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlck1lcmdlUG9saWN5LmphdmEKQEAgLTI3MSw3ICsyNzEsNyBAQAogICAgIGFzc2VydFNldHRlcnMobmV3IExvZ0RvY01lcmdlUG9saWN5KCkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFNldHRlcnMoTG9nTWVyZ2VQb2xpY3kgbG1wKSB7CisgIHByaXZhdGUgdm9pZCBhc3NlcnRTZXR0ZXJzKE1lcmdlUG9saWN5IGxtcCkgewogICAgIGxtcC5zZXRNYXhDRlNTZWdtZW50U2l6ZU1CKDIuMCk7CiAgICAgYXNzZXJ0RXF1YWxzKDIuMCwgbG1wLmdldE1heENGU1NlZ21lbnRTaXplTUIoKSwgRVBTSUxPTik7CiAgICAgCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJXaXRoVGhyZWFkcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4V3JpdGVyV2l0aFRocmVhZHMuamF2YQppbmRleCBjYzY0NmIxLi45ZTRlNWEzIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhXcml0ZXJXaXRoVGhyZWFkcy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFdyaXRlcldpdGhUaHJlYWRzLmphdmEKQEAgLTM1OCw2ICszNTgsOSBAQAogICAgICAgICBib29sZWFuIHNhd0Nsb3NlID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gc2F3TWVyZ2UgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFjZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChzYXdBYm9ydE9yRmx1c2hEb2MgJiYgc2F3TWVyZ2UgJiYgc2F3Q2xvc2UpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KICAgICAgICAgICBpZiAoImFib3J0Ii5lcXVhbHModHJhY2VbaV0uZ2V0TWV0aG9kTmFtZSgpKSB8fAogICAgICAgICAgICAgICAiZmluaXNoRG9jdW1lbnQiLmVxdWFscyh0cmFjZVtpXS5nZXRNZXRob2ROYW1lKCkpKSB7CiAgICAgICAgICAgICBzYXdBYm9ydE9yRmx1c2hEb2MgPSB0cnVlOwpAQCAtMzcwLDggKzM3Myw5IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzYXdBYm9ydE9yRmx1c2hEb2MgJiYgIXNhd0Nsb3NlICYmICFzYXdNZXJnZSkgewotICAgICAgICAgIGlmIChvbmx5T25jZSkKKyAgICAgICAgICBpZiAob25seU9uY2UpIHsKICAgICAgICAgICAgIGRvRmFpbCA9IGZhbHNlOworICAgICAgICAgIH0KICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6IG5vdyBmYWlsIik7CiAgICAgICAgICAgLy9uZXcgVGhyb3dhYmxlKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwogICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibm93IGZhaWxpbmcgb24gcHVycG9zZSIpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE1heFRlcm1GcmVxdWVuY3kuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RNYXhUZXJtRnJlcXVlbmN5LmphdmEKaW5kZXggMzcxYmI5Zi4uOTdkYzY2MSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE1heFRlcm1GcmVxdWVuY3kuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0TWF4VGVybUZyZXF1ZW5jeS5qYXZhCkBAIC0yNiw4ICsyNiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuTW9ja1Rva2VuaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLkRlZmF1bHRTaW1pbGFyaXR5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuVEZJREZTaW1pbGFyaXR5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5fVGVzdFV0aWw7CiAKQEAgLTk3LDIxICs5OCwyOCBAQAogICAvKioKICAgICogU2ltcGxlIHNpbWlsYXJpdHkgdGhhdCBlbmNvZGVzIG1heFRlcm1GcmVxdWVuY3kgZGlyZWN0bHkgYXMgYSBieXRlCiAgICAqLwotICBjbGFzcyBUZXN0U2ltaWxhcml0eSBleHRlbmRzIERlZmF1bHRTaW1pbGFyaXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlIGVuY29kZU5vcm1WYWx1ZShmbG9hdCBmKSB7Ci0gICAgICByZXR1cm4gKGJ5dGUpIGY7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBkZWNvZGVOb3JtVmFsdWUoYnl0ZSBiKSB7Ci0gICAgICByZXR1cm4gKGZsb2F0KSBiOwotICAgIH0KKyAgY2xhc3MgVGVzdFNpbWlsYXJpdHkgZXh0ZW5kcyBURklERlNpbWlsYXJpdHkgewogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGxlbmd0aE5vcm0oRmllbGRJbnZlcnRTdGF0ZSBzdGF0ZSkgewogICAgICAgcmV0dXJuIHN0YXRlLmdldE1heFRlcm1GcmVxdWVuY3koKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBlbmNvZGVOb3JtVmFsdWUoZmxvYXQgZikgeworICAgICAgcmV0dXJuIChieXRlKSBmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBkZWNvZGVOb3JtVmFsdWUobG9uZyBub3JtKSB7CisgICAgICByZXR1cm4gbm9ybTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IGNvb3JkKGludCBvdmVybGFwLCBpbnQgbWF4T3ZlcmxhcCkgeyByZXR1cm4gMDsgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgcXVlcnlOb3JtKGZsb2F0IHN1bU9mU3F1YXJlZFdlaWdodHMpIHsgcmV0dXJuIDA7IH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IHRmKGZsb2F0IGZyZXEpIHsgcmV0dXJuIDA7IH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IGlkZihsb25nIGRvY0ZyZXEsIGxvbmcgbnVtRG9jcykgeyByZXR1cm4gMDsgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgc2xvcHB5RnJlcShpbnQgZGlzdGFuY2UpIHsgcmV0dXJuIDA7IH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGZsb2F0IHNjb3JlUGF5bG9hZChpbnQgZG9jLCBpbnQgc3RhcnQsIGludCBlbmQsIEJ5dGVzUmVmIHBheWxvYWQpIHsgcmV0dXJuIDA7IH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE5vTWVyZ2VQb2xpY3kuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3ROb01lcmdlUG9saWN5LmphdmEKaW5kZXggMTg3NDA5ZS4uOTI5M2ZjNyAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE5vTWVyZ2VQb2xpY3kuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Tm9NZXJnZVBvbGljeS5qYXZhCkBAIC02NSw4ICs2NSw4IEBACiAgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJjbG9uZSIpKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotICAgICAgaWYgKG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBPYmplY3QuY2xhc3MpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtICsgIiBpcyBub3Qgb3ZlcnJpZGRlbiAhIiwgbS5nZXREZWNsYXJpbmdDbGFzcygpID09IE5vTWVyZ2VQb2xpY3kuY2xhc3MpOworICAgICAgaWYgKG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBPYmplY3QuY2xhc3MgJiYgIU1vZGlmaWVyLmlzRmluYWwobS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtICsgIiBpcyBub3Qgb3ZlcnJpZGRlbiAhICIsIG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PSBOb01lcmdlUG9saWN5LmNsYXNzKTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3ROb3Jtcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE5vcm1zLmphdmEKaW5kZXggYmY3ZjEzYy4uYmI5MTczNyAxMDA3NTUKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE5vcm1zLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE5vcm1zLmphdmEKQEAgLTI5LDcgKzI5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLkRlZmF1bHRTaW1pbGFyaXR5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zaW1pbGFyaXRpZXMuUGVyRmllbGRTaW1pbGFyaXR5V3JhcHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5URklERlNpbWlsYXJpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MaW5lRmlsZURvY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2UuU3VwcHJlc3NDb2RlY3M7CkBAIC00NSwyMSArNDcsMjkgQEAKIHB1YmxpYyBjbGFzcyBUZXN0Tm9ybXMgZXh0ZW5kcyBMdWNlbmVUZXN0Q2FzZSB7CiAgIGZpbmFsIFN0cmluZyBieXRlVGVzdEZpZWxkID0gIm5vcm1zVGVzdEJ5dGUiOwogCi0gIGNsYXNzIEN1c3RvbU5vcm1FbmNvZGluZ1NpbWlsYXJpdHkgZXh0ZW5kcyBEZWZhdWx0U2ltaWxhcml0eSB7CisgIGNsYXNzIEN1c3RvbU5vcm1FbmNvZGluZ1NpbWlsYXJpdHkgZXh0ZW5kcyBURklERlNpbWlsYXJpdHkgeworCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGUgZW5jb2RlTm9ybVZhbHVlKGZsb2F0IGYpIHsKLSAgICAgIHJldHVybiAoYnl0ZSkgZjsKKyAgICBwdWJsaWMgbG9uZyBlbmNvZGVOb3JtVmFsdWUoZmxvYXQgZikgeworICAgICAgcmV0dXJuIChsb25nKSBmOwogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZGVjb2RlTm9ybVZhbHVlKGJ5dGUgYikgewotICAgICAgcmV0dXJuIChmbG9hdCkgYjsKKyAgICBwdWJsaWMgZmxvYXQgZGVjb2RlTm9ybVZhbHVlKGxvbmcgbm9ybSkgeworICAgICAgcmV0dXJuIG5vcm07CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGxlbmd0aE5vcm0oRmllbGRJbnZlcnRTdGF0ZSBzdGF0ZSkgewogICAgICAgcmV0dXJuIHN0YXRlLmdldExlbmd0aCgpOwogICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgY29vcmQoaW50IG92ZXJsYXAsIGludCBtYXhPdmVybGFwKSB7IHJldHVybiAwOyB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmbG9hdCBxdWVyeU5vcm0oZmxvYXQgc3VtT2ZTcXVhcmVkV2VpZ2h0cykgeyByZXR1cm4gMDsgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgdGYoZmxvYXQgZnJlcSkgeyByZXR1cm4gMDsgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgaWRmKGxvbmcgZG9jRnJlcSwgbG9uZyBudW1Eb2NzKSB7IHJldHVybiAwOyB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmbG9hdCBzbG9wcHlGcmVxKGludCBkaXN0YW5jZSkgeyByZXR1cm4gMDsgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgc2NvcmVQYXlsb2FkKGludCBkb2MsIGludCBzdGFydCwgaW50IGVuZCwgQnl0ZXNSZWYgcGF5bG9hZCkgeyByZXR1cm4gMDsgfQogICB9CiAgIAogICAvLyBMVUNFTkUtMTI2MApAQCAtMTc5LDEyICsxODksNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFeGFjdFNpbVNjb3JlciBleGFjdFNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2xvcHB5U2ltU2NvcmVyIHNsb3BweVNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHdlaWdodCwgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogICB9IApkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXROb3Jtcy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXROb3Jtcy5qYXZhCmluZGV4IGM1NDU5YTYuLmM0MDBmYzUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RPbWl0Tm9ybXMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0T21pdE5vcm1zLmphdmEKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgICAgICAgICAgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKS5zZXRNYXhCdWZmZXJlZERvY3MoMykuc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koKSkpOwogICAgIExvZ01lcmdlUG9saWN5IGxtcCA9IChMb2dNZXJnZVBvbGljeSkgd3JpdGVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCk7CiAgICAgbG1wLnNldE1lcmdlRmFjdG9yKDIpOwotICAgIGxtcC5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgIGxtcC5zZXROb0NGU1JhdGlvKDAuMCk7CiAgICAgRG9jdW1lbnQgZCA9IG5ldyBEb2N1bWVudCgpOwogCiAgICAgRmllbGRUeXBlIGN1c3RvbVR5cGUgPSBuZXcgRmllbGRUeXBlKFRleHRGaWVsZC5UWVBFX05PVF9TVE9SRUQpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXRQb3NpdGlvbnMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RPbWl0UG9zaXRpb25zLmphdmEKaW5kZXggM2M0Nzc3MC4uYWVlZTZlNiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXRQb3NpdGlvbnMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0T21pdFBvc2l0aW9ucy5qYXZhCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1ZFUlNJT05fQ1VSUkVOVCwgYW5hbHl6ZXIpLnNldE1heEJ1ZmZlcmVkRG9jcygzKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7CiAgICAgTG9nTWVyZ2VQb2xpY3kgbG1wID0gKExvZ01lcmdlUG9saWN5KSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKICAgICBsbXAuc2V0TWVyZ2VGYWN0b3IoMik7Ci0gICAgbG1wLnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSk7CisgICAgbG1wLnNldE5vQ0ZTUmF0aW8oMC4wKTsKICAgICBEb2N1bWVudCBkID0gbmV3IERvY3VtZW50KCk7CiAKICAgICBGaWVsZFR5cGUgZnQgPSBuZXcgRmllbGRUeXBlKFRleHRGaWVsZC5UWVBFX05PVF9TVE9SRUQpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXRUZi5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdE9taXRUZi5qYXZhCmluZGV4IDE2ZWViYjAuLjQ3YWJlYTIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RPbWl0VGYuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0T21pdFRmLmphdmEKQEAgLTE4LDI2ICsxOCwzNSBAQAogICovCiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRmllbGRJbmZvLkluZGV4T3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuVGV4dEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC4qOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkZpZWxkSW5mby5JbmRleE9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkJvb2xlYW5DbGF1c2UuT2NjdXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkJvb2xlYW5RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQ29sbGVjdGlvblN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRXhwbGFuYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlBocmFzZVF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TY29yZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlRlcm1RdWVyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVGVybVN0YXRpc3RpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5URklERlNpbWlsYXJpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZTsKIAogCiBwdWJsaWMgY2xhc3MgVGVzdE9taXRUZiBleHRlbmRzIEx1Y2VuZVRlc3RDYXNlIHsKICAgCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlU2ltaWxhcml0eSBleHRlbmRzIFRGSURGU2ltaWxhcml0eSB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyBmbG9hdCBkZWNvZGVOb3JtVmFsdWUobG9uZyBub3JtKSB7IHJldHVybiBub3JtOyB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIGVuY29kZU5vcm1WYWx1ZShmbG9hdCBmKSB7IHJldHVybiAobG9uZykgZjsgfQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBxdWVyeU5vcm0oZmxvYXQgc3VtT2ZTcXVhcmVkV2VpZ2h0cykgeyByZXR1cm4gMS4wZjsgfQogICAgIEBPdmVycmlkZQpAQCAtMjE1LDcgKzIyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKS5zZXRNYXhCdWZmZXJlZERvY3MoMykuc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koKSkpOwogICAgIExvZ01lcmdlUG9saWN5IGxtcCA9IChMb2dNZXJnZVBvbGljeSkgd3JpdGVyLmdldENvbmZpZygpLmdldE1lcmdlUG9saWN5KCk7CiAgICAgbG1wLnNldE1lcmdlRmFjdG9yKDIpOwotICAgIGxtcC5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgIGxtcC5zZXROb0NGU1JhdGlvKDAuMCk7CiAgICAgRG9jdW1lbnQgZCA9IG5ldyBEb2N1bWVudCgpOwogICAgICAgICAKICAgICBGaWVsZCBmMSA9IG5ld0ZpZWxkKCJmMSIsICJUaGlzIGZpZWxkIGhhcyB0ZXJtIGZyZXFzIiwgb21pdFR5cGUpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdFJvbGxpbmdVcGRhdGVzLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Um9sbGluZ1VwZGF0ZXMuamF2YQppbmRleCA2YWE0NGRkLi5kZmViMzkzIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Um9sbGluZ1VwZGF0ZXMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0Um9sbGluZ1VwZGF0ZXMuamF2YQpAQCAtNTksNyArNTksNyBAQAogICAgIC8vIFRPRE86IHNvbWV0aW1lcyB1cGRhdGUgaWRzIG5vdCBpbiBvcmRlci4uLgogICAgIGZvcihpbnQgZG9jSXRlcj0wO2RvY0l0ZXI8bnVtVXBkYXRlcztkb2NJdGVyKyspIHsKICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IGRvY3MubmV4dERvYygpOwotICAgICAgZmluYWwgU3RyaW5nIG15SUQgPSAiIitpZDsKKyAgICAgIGZpbmFsIFN0cmluZyBteUlEID0gSW50ZWdlci50b1N0cmluZyhpZCk7CiAgICAgICBpZiAoaWQgPT0gU0laRS0xKSB7CiAgICAgICAgIGlkID0gMDsKICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0U3RyZXNzSW5kZXhpbmcyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0U3RyZXNzSW5kZXhpbmcyLmphdmEKaW5kZXggOTA2ZjgwY2YuLmJjNzgyNDkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RTdHJlc3NJbmRleGluZzIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0U3RyZXNzSW5kZXhpbmcyLmphdmEKQEAgLTQ3LDIxICs0NywxNiBAQAogICBzdGF0aWMgaW50IG1heEJ1ZmZlcmVkRG9jcz0zOwogICBzdGF0aWMgaW50IHNlZWQ9MDsKIAotICBwdWJsaWMgY2xhc3MgTW9ja0luZGV4V3JpdGVyIGV4dGVuZHMgSW5kZXhXcml0ZXIgewotCi0gICAgcHVibGljIE1vY2tJbmRleFdyaXRlcihEaXJlY3RvcnkgZGlyLCBJbmRleFdyaXRlckNvbmZpZyBjb25mKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgc3VwZXIoZGlyLCBjb25mKTsKLSAgICB9CisgIHB1YmxpYyBmaW5hbCBjbGFzcyBZaWVsZFRlc3RQb2ludCBpbXBsZW1lbnRzIFJhbmRvbUluZGV4V3JpdGVyLlRlc3RQb2ludCB7CiAKICAgICBAT3ZlcnJpZGUKLSAgICBib29sZWFuIHRlc3RQb2ludChTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyB2b2lkIGFwcGx5KFN0cmluZyBuYW1lKSB7CiAgICAgICAvLyAgICAgIGlmIChuYW1lLmVxdWFscygic3RhcnRDb21taXQiKSkgewogICAgICAgaWYgKHJhbmRvbSgpLm5leHRJbnQoNCkgPT0gMikKICAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KLSAgCisvLyAgCiAgIHB1YmxpYyB2b2lkIHRlc3RSYW5kb21JV1JlYWRlcigpIHRocm93cyBUaHJvd2FibGUgewogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKICAgICAKQEAgLTE1MSwxMiArMTQ2LDEyIEBACiAgIAogICBwdWJsaWMgRG9jc0FuZFdyaXRlciBpbmRleFJhbmRvbUlXUmVhZGVyKGludCBuVGhyZWFkcywgaW50IGl0ZXJhdGlvbnMsIGludCByYW5nZSwgRGlyZWN0b3J5IGRpcikgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgTWFwPFN0cmluZyxEb2N1bWVudD4gZG9jcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb2N1bWVudD4oKTsKLSAgICBJbmRleFdyaXRlciB3ID0gbmV3IE1vY2tJbmRleFdyaXRlcihkaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKAorICAgIEluZGV4V3JpdGVyIHcgPSBSYW5kb21JbmRleFdyaXRlci5tb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZygKICAgICAgICAgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRPcGVuTW9kZShPcGVuTW9kZS5DUkVBVEUpLnNldFJBTUJ1ZmZlclNpemVNQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xKS5zZXRNYXhCdWZmZXJlZERvY3MobWF4QnVmZmVyZWREb2NzKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7CisgICAgICAgICAgICAwLjEpLnNldE1heEJ1ZmZlcmVkRG9jcyhtYXhCdWZmZXJlZERvY3MpLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpLCBuZXcgWWllbGRUZXN0UG9pbnQoKSk7CiAgICAgdy5jb21taXQoKTsKICAgICBMb2dNZXJnZVBvbGljeSBsbXAgPSAoTG9nTWVyZ2VQb2xpY3kpIHcuZ2V0Q29uZmlnKCkuZ2V0TWVyZ2VQb2xpY3koKTsKLSAgICBsbXAuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICBsbXAuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgIGxtcC5zZXRNZXJnZUZhY3RvcihtZXJnZUZhY3Rvcik7CiAgICAgLyoqKgogICAgICAgICB3LnNldE1heE1lcmdlRG9jcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CkBAIC0yMDIsMTIgKzE5NywxMiBAQAogICBwdWJsaWMgTWFwPFN0cmluZyxEb2N1bWVudD4gaW5kZXhSYW5kb20oaW50IG5UaHJlYWRzLCBpbnQgaXRlcmF0aW9ucywgaW50IHJhbmdlLCBEaXJlY3RvcnkgZGlyLCBpbnQgbWF4VGhyZWFkU3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1JlYWRlclBvb2xpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgIE1hcDxTdHJpbmcsRG9jdW1lbnQ+IGRvY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG9jdW1lbnQ+KCk7Ci0gICAgSW5kZXhXcml0ZXIgdyA9IG5ldyBNb2NrSW5kZXhXcml0ZXIoZGlyLCBuZXdJbmRleFdyaXRlckNvbmZpZygKKyAgICBJbmRleFdyaXRlciB3ID0gUmFuZG9tSW5kZXhXcml0ZXIubW9ja0luZGV4V3JpdGVyKGRpciwgbmV3SW5kZXhXcml0ZXJDb25maWcoCiAgICAgICAgIFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuc2V0T3Blbk1vZGUoT3Blbk1vZGUuQ1JFQVRFKQogICAgICAgICAgICAgIC5zZXRSQU1CdWZmZXJTaXplTUIoMC4xKS5zZXRNYXhCdWZmZXJlZERvY3MobWF4QnVmZmVyZWREb2NzKS5zZXRJbmRleGVyVGhyZWFkUG9vbChuZXcgVGhyZWFkQWZmaW5pdHlEb2N1bWVudHNXcml0ZXJUaHJlYWRQb29sKG1heFRocmVhZFN0YXRlcykpCi0gICAgICAgICAgICAgLnNldFJlYWRlclBvb2xpbmcoZG9SZWFkZXJQb29saW5nKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7CisgICAgICAgICAgICAgLnNldFJlYWRlclBvb2xpbmcoZG9SZWFkZXJQb29saW5nKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSwgbmV3IFlpZWxkVGVzdFBvaW50KCkpOwogICAgIExvZ01lcmdlUG9saWN5IGxtcCA9IChMb2dNZXJnZVBvbGljeSkgdy5nZXRDb25maWcoKS5nZXRNZXJnZVBvbGljeSgpOwotICAgIGxtcC5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgIGxtcC5zZXROb0NGU1JhdGlvKDAuMCk7CiAgICAgbG1wLnNldE1lcmdlRmFjdG9yKG1lcmdlRmFjdG9yKTsKIAogICAgIHRocmVhZHMgPSBuZXcgSW5kZXhpbmdUaHJlYWRbblRocmVhZHNdOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdFRlcm1WZWN0b3JzUmVhZGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0VGVybVZlY3RvcnNSZWFkZXIuamF2YQppbmRleCBhNTdhY2UyLi42MzAxOGExIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0VGVybVZlY3RvcnNSZWFkZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0VGVybVZlY3RvcnNSZWFkZXIuamF2YQpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICBkaXIsCiAgICAgICAgIG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTXlBbmFseXplcigpKS4KICAgICAgICAgICAgIHNldE1heEJ1ZmZlcmVkRG9jcygtMSkuCi0gICAgICAgICAgICBzZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeShmYWxzZSwgMTApKQorICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koZmFsc2UsIDEwKSkuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKQogICAgICk7CiAKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RUcnlEZWxldGUuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RUcnlEZWxldGUuamF2YQppbmRleCA2NGZhZTYzLi5jMGQ5YjYwIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0VHJ5RGVsZXRlLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdFRyeURlbGV0ZS5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAgIHByaXZhdGUgc3RhdGljIEluZGV4V3JpdGVyIGdldFdyaXRlciAoRGlyZWN0b3J5IGRpcmVjdG9yeSkKICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgewotICAgIExvZ01lcmdlUG9saWN5IHBvbGljeSA9IG5ldyBMb2dCeXRlU2l6ZU1lcmdlUG9saWN5KCk7CisgICAgTWVyZ2VQb2xpY3kgcG9saWN5ID0gbmV3IExvZ0J5dGVTaXplTWVyZ2VQb2xpY3koKTsKICAgICBJbmRleFdyaXRlckNvbmZpZyBjb25mID0gbmV3IEluZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpOwogICAgIGNvbmYuc2V0TWVyZ2VQb2xpY3kocG9saWN5KTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RVbmlxdWVUZXJtQ291bnQuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RVbmlxdWVUZXJtQ291bnQuamF2YQppbmRleCA1ZTFkYTkwLi4zYWZhOWEyIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0VW5pcXVlVGVybUNvdW50LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdFVuaXF1ZVRlcm1Db3VudC5qYXZhCkBAIC0xMTAsMTIgKzExMCw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4YWN0U2ltU2NvcmVyIGV4YWN0U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTbG9wcHlTaW1TY29yZXIgc2xvcHB5U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9CYXNlVGVzdFJhbmdlRmlsdGVyLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvQmFzZVRlc3RSYW5nZUZpbHRlci5qYXZhCmluZGV4IDcyZGEzNWIuLjg2MWU1NDEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9CYXNlVGVzdFJhbmdlRmlsdGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0Jhc2VUZXN0UmFuZ2VGaWx0ZXIuamF2YQpAQCAtMjIsNyArMjIsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLk1vY2tBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb3VibGVGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZC5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GbG9hdEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkludEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkxvbmdGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlckNvbmZpZy5PcGVuTW9kZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5SYW5kb21JbmRleFdyaXRlcjsKQEAgLTExNSw5ICsxMjAsMTcgQEAKICAgICAKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICBGaWVsZCBpZEZpZWxkID0gbmV3U3RyaW5nRmllbGQocmFuZG9tLCAiaWQiLCAiIiwgRmllbGQuU3RvcmUuWUVTKTsKKyAgICBGaWVsZCBpbnRJZEZpZWxkID0gbmV3IEludEZpZWxkKCJpZF9pbnQiLCAwLCBTdG9yZS5ZRVMpOworICAgIEZpZWxkIGZsb2F0SWRGaWVsZCA9IG5ldyBGbG9hdEZpZWxkKCJpZF9mbG9hdCIsIDAsIFN0b3JlLllFUyk7CisgICAgRmllbGQgbG9uZ0lkRmllbGQgPSBuZXcgTG9uZ0ZpZWxkKCJpZF9sb25nIiwgMCwgU3RvcmUuWUVTKTsKKyAgICBGaWVsZCBkb3VibGVJZEZpZWxkID0gbmV3IERvdWJsZUZpZWxkKCJpZF9kb3VibGUiLCAwLCBTdG9yZS5ZRVMpOwogICAgIEZpZWxkIHJhbmRGaWVsZCA9IG5ld1N0cmluZ0ZpZWxkKHJhbmRvbSwgInJhbmQiLCAiIiwgRmllbGQuU3RvcmUuWUVTKTsKICAgICBGaWVsZCBib2R5RmllbGQgPSBuZXdTdHJpbmdGaWVsZChyYW5kb20sICJib2R5IiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2MuYWRkKGlkRmllbGQpOworICAgIGRvYy5hZGQoaW50SWRGaWVsZCk7CisgICAgZG9jLmFkZChmbG9hdElkRmllbGQpOworICAgIGRvYy5hZGQobG9uZ0lkRmllbGQpOworICAgIGRvYy5hZGQoZG91YmxlSWRGaWVsZCk7CiAgICAgZG9jLmFkZChyYW5kRmllbGQpOwogICAgIGRvYy5hZGQoYm9keUZpZWxkKTsKIApAQCAtMTMzLDYgKzE0NiwxMCBAQAogCiAgICAgICBmb3IgKGludCBkID0gbWluSWQ7IGQgPD0gbWF4SWQ7IGQrKykgewogICAgICAgICBpZEZpZWxkLnNldFN0cmluZ1ZhbHVlKHBhZChkKSk7CisgICAgICAgIGludElkRmllbGQuc2V0SW50VmFsdWUoZCk7CisgICAgICAgIGZsb2F0SWRGaWVsZC5zZXRGbG9hdFZhbHVlKGQpOworICAgICAgICBsb25nSWRGaWVsZC5zZXRMb25nVmFsdWUoZCk7CisgICAgICAgIGRvdWJsZUlkRmllbGQuc2V0RG91YmxlVmFsdWUoZCk7CiAgICAgICAgIGludCByID0gaW5kZXguYWxsb3dOZWdhdGl2ZVJhbmRvbUludHMgPyByYW5kb20ubmV4dEludCgpIDogcmFuZG9tCiAgICAgICAgICAgLm5leHRJbnQoSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgICBpZiAoaW5kZXgubWF4UiA8IHIpIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9KdXN0Q29tcGlsZVNlYXJjaC5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0p1c3RDb21waWxlU2VhcmNoLmphdmEKaW5kZXggNzE3MWNiMS4uYjRiZjBhNCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0p1c3RDb21waWxlU2VhcmNoLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL0p1c3RDb21waWxlU2VhcmNoLmphdmEKQEAgLTI3MCwxMiArMjcwLDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhhY3RTaW1TY29yZXIgZXhhY3RTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihVTlNVUFBPUlRFRF9NU0cpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTbG9wcHlTaW1TY29yZXIgc2xvcHB5U2ltU2NvcmVyKFNpbVdlaWdodCBzdGF0cywgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHsKICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihVTlNVUFBPUlRFRF9NU0cpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RDb25qdW5jdGlvbnMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0Q29uanVuY3Rpb25zLmphdmEKaW5kZXggYTMyNmU3OC4uMWM5NDk3ZiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RDb25qdW5jdGlvbnMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdENvbmp1bmN0aW9ucy5qYXZhCkBAIC0xMDksMTggKzEwOSw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4YWN0U2ltU2NvcmVyIGV4YWN0U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBuZXcgRXhhY3RTaW1TY29yZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgc2NvcmUoaW50IGRvYywgaW50IGZyZXEpIHsKLSAgICAgICAgICByZXR1cm4gZnJlcTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2xvcHB5U2ltU2NvcmVyIHNsb3BweVNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbmV3IFNsb3BweVNpbVNjb3JlcigpIHsKKyAgICBwdWJsaWMgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbmV3IFNpbVNjb3JlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmbG9hdCBzY29yZShpbnQgZG9jLCBmbG9hdCBmcmVxKSB7CiAgICAgICAgICAgcmV0dXJuIGZyZXE7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdERvY1ZhbHVlc1Njb3JpbmcuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0RG9jVmFsdWVzU2NvcmluZy5qYXZhCmluZGV4IDVkZjZhNDMuLmUzYTUzNjkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0RG9jVmFsdWVzU2NvcmluZy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0RG9jVmFsdWVzU2NvcmluZy5qYXZhCkBAIC0xNTYsMzQgKzE1NiwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFeGFjdFNpbVNjb3JlciBleGFjdFNpbVNjb3JlcihTaW1XZWlnaHQgc3RhdHMsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIEV4YWN0U2ltU2NvcmVyIHN1YiA9IHNpbS5leGFjdFNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7Ci0gICAgICBmaW5hbCBGaWVsZENhY2hlLkZsb2F0cyB2YWx1ZXMgPSBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0RmxvYXRzKGNvbnRleHQucmVhZGVyKCksIGJvb3N0RmllbGQsIGZhbHNlKTsKLQotICAgICAgcmV0dXJuIG5ldyBFeGFjdFNpbVNjb3JlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBzY29yZShpbnQgZG9jLCBpbnQgZnJlcSkgewotICAgICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KGRvYykgKiBzdWIuc2NvcmUoZG9jLCBmcmVxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwbGFuYXRpb24gZXhwbGFpbihpbnQgZG9jLCBFeHBsYW5hdGlvbiBmcmVxKSB7Ci0gICAgICAgICAgRXhwbGFuYXRpb24gYm9vc3RFeHBsYW5hdGlvbiA9IG5ldyBFeHBsYW5hdGlvbih2YWx1ZXMuZ2V0KGRvYyksICJpbmRleERvY1ZhbHVlKCIgKyBib29zdEZpZWxkICsgIikiKTsKLSAgICAgICAgICBFeHBsYW5hdGlvbiBzaW1FeHBsYW5hdGlvbiA9IHN1Yi5leHBsYWluKGRvYywgZnJlcSk7Ci0gICAgICAgICAgRXhwbGFuYXRpb24gZXhwbCA9IG5ldyBFeHBsYW5hdGlvbihib29zdEV4cGxhbmF0aW9uLmdldFZhbHVlKCkgKiBzaW1FeHBsYW5hdGlvbi5nZXRWYWx1ZSgpLCAicHJvZHVjdCBvZjoiKTsKLSAgICAgICAgICBleHBsLmFkZERldGFpbChib29zdEV4cGxhbmF0aW9uKTsKLSAgICAgICAgICBleHBsLmFkZERldGFpbChzaW1FeHBsYW5hdGlvbik7Ci0gICAgICAgICAgcmV0dXJuIGV4cGw7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNsb3BweVNpbVNjb3JlciBzbG9wcHlTaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBTbG9wcHlTaW1TY29yZXIgc3ViID0gc2ltLnNsb3BweVNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7CisgICAgcHVibGljIFNpbVNjb3JlciBzaW1TY29yZXIoU2ltV2VpZ2h0IHN0YXRzLCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBTaW1TY29yZXIgc3ViID0gc2ltLnNpbVNjb3JlcihzdGF0cywgY29udGV4dCk7CiAgICAgICBmaW5hbCBGaWVsZENhY2hlLkZsb2F0cyB2YWx1ZXMgPSBGaWVsZENhY2hlLkRFRkFVTFQuZ2V0RmxvYXRzKGNvbnRleHQucmVhZGVyKCksIGJvb3N0RmllbGQsIGZhbHNlKTsKICAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTbG9wcHlTaW1TY29yZXIoKSB7CisgICAgICByZXR1cm4gbmV3IFNpbVNjb3JlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmbG9hdCBzY29yZShpbnQgZG9jLCBmbG9hdCBmcmVxKSB7CiAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5nZXQoZG9jKSAqIHN1Yi5zY29yZShkb2MsIGZyZXEpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RGaWVsZENhY2hlLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdEZpZWxkQ2FjaGUuamF2YQppbmRleCBjMmVkOWEwLi5iYmZhNjIyIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdEZpZWxkQ2FjaGUuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdEZpZWxkQ2FjaGUuamF2YQpAQCAtMjMsMzMgKzIzLDQ1IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkN5Y2xpY0JhcnJpZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkRvY1ZhbHVlc0Zvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5CaW5hcnlEb2NWYWx1ZXNGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb3VibGVGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZC5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GbG9hdEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkludEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkxvbmdGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5OdW1lcmljRG9jVmFsdWVzRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU29ydGVkRG9jVmFsdWVzRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU29ydGVkU2V0RG9jVmFsdWVzRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU3RvcmVkRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU3RyaW5nRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguKjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZS5CeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5BdG9taWNSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguQmluYXJ5RG9jVmFsdWVzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkRpcmVjdG9yeVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Eb2NUZXJtT3JkczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5SYW5kb21JbmRleFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TbG93Q29tcG9zaXRlUmVhZGVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Tb3J0ZWREb2NWYWx1ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguU29ydGVkU2V0RG9jVmFsdWVzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zRW51bTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZS5Eb3VibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlLkZsb2F0czsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZS5JbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlLkxvbmdzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlLlNob3J0czsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CaXRzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLk51bWVyaWNVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC03MCw4ICs4Miw2IEBACiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcmVjdG9yeSwgbmV3SW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7CiAgICAgbG9uZyB0aGVMb25nID0gTG9uZy5NQVhfVkFMVUU7CiAgICAgZG91YmxlIHRoZURvdWJsZSA9IERvdWJsZS5NQVhfVkFMVUU7Ci0gICAgYnl0ZSB0aGVCeXRlID0gQnl0ZS5NQVhfVkFMVUU7Ci0gICAgc2hvcnQgdGhlU2hvcnQgPSBTaG9ydC5NQVhfVkFMVUU7CiAgICAgaW50IHRoZUludCA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgIGZsb2F0IHRoZUZsb2F0ID0gRmxvYXQuTUFYX1ZBTFVFOwogICAgIHVuaWNvZGVTdHJpbmdzID0gbmV3IFN0cmluZ1tOVU1fRE9DU107CkBAIC04MSwxNCArOTEsMTIgQEAKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRE9DUzsgaSsrKXsKICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidGhlTG9uZyIsIFN0cmluZy52YWx1ZU9mKHRoZUxvbmctLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVEb3VibGUiLCBTdHJpbmcudmFsdWVPZih0aGVEb3VibGUtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVCeXRlIiwgU3RyaW5nLnZhbHVlT2YodGhlQnl0ZS0tKSwgRmllbGQuU3RvcmUuTk8pKTsKLSAgICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInRoZVNob3J0IiwgU3RyaW5nLnZhbHVlT2YodGhlU2hvcnQtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVJbnQiLCBTdHJpbmcudmFsdWVPZih0aGVJbnQtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVGbG9hdCIsIFN0cmluZy52YWx1ZU9mKHRoZUZsb2F0LS0pLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ0aGVMb25nIiwgdGhlTG9uZy0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInRoZURvdWJsZSIsIHRoZURvdWJsZS0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgSW50RmllbGQoInRoZUludCIsIHRoZUludC0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidGhlRmxvYXQiLCB0aGVGbG9hdC0tLCBGaWVsZC5TdG9yZS5OTykpOwogICAgICAgaWYgKGklMiA9PSAwKSB7Ci0gICAgICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInNwYXJzZSIsIFN0cmluZy52YWx1ZU9mKGkpLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgic3BhcnNlIiwgaSwgRmllbGQuU3RvcmUuTk8pKTsKICAgICAgIH0KIAogICAgICAgaWYgKGklMiA9PSAwKSB7CkBAIC0xMzMsNyArMTQxLDE2IEBACiAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKICAgICAgIGNhY2hlLnNldEluZm9TdHJlYW0obmV3IFByaW50U3RyZWFtKGJvcywgZmFsc2UsICJVVEYtOCIpKTsKICAgICAgIGNhY2hlLmdldERvdWJsZXMocmVhZGVyLCAidGhlRG91YmxlIiwgZmFsc2UpOwotICAgICAgY2FjaGUuZ2V0RmxvYXRzKHJlYWRlciwgInRoZURvdWJsZSIsIGZhbHNlKTsKKyAgICAgIGNhY2hlLmdldEZsb2F0cyhyZWFkZXIsICJ0aGVEb3VibGUiLCBuZXcgRmllbGRDYWNoZS5GbG9hdFBhcnNlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUZXJtc0VudW0gdGVybXNFbnVtKFRlcm1zIHRlcm1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBOdW1lcmljVXRpbHMuZmlsdGVyUHJlZml4Q29kZWRMb25ncyh0ZXJtcy5pdGVyYXRvcihudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBmbG9hdCBwYXJzZUZsb2F0KEJ5dGVzUmVmIHRlcm0pIHsKKyAgICAgICAgICByZXR1cm4gTnVtZXJpY1V0aWxzLnNvcnRhYmxlSW50VG9GbG9hdCgoaW50KSBOdW1lcmljVXRpbHMucHJlZml4Q29kZWRUb0xvbmcodGVybSkpOworICAgICAgICB9CisgICAgICB9LCBmYWxzZSk7CiAgICAgICBhc3NlcnRUcnVlKGJvcy50b1N0cmluZygiVVRGLTgiKS5pbmRleE9mKCJXQVJOSU5HIikgIT0gLTEpOwogICAgIH0gZmluYWxseSB7CiAgICAgICBGaWVsZENhY2hlLkRFRkFVTFQucHVyZ2VBbGxDYWNoZXMoKTsKQEAgLTE0NCw0MiArMTYxLDI4IEBACiAgICAgRmllbGRDYWNoZSBjYWNoZSA9IEZpZWxkQ2FjaGUuREVGQVVMVDsKICAgICBGaWVsZENhY2hlLkRvdWJsZXMgZG91YmxlcyA9IGNhY2hlLmdldERvdWJsZXMocmVhZGVyLCAidGhlRG91YmxlIiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7CiAgICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3QgdG8gY2FjaGUgcmV0dXJuIHNhbWUgYXJyYXkiLCBkb3VibGVzLCBjYWNoZS5nZXREb3VibGVzKHJlYWRlciwgInRoZURvdWJsZSIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKLSAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB3aXRoIGV4cGxpY2l0IHBhcnNlciByZXR1cm4gc2FtZSBhcnJheSIsIGRvdWJsZXMsIGNhY2hlLmdldERvdWJsZXMocmVhZGVyLCAidGhlRG91YmxlIiwgRmllbGRDYWNoZS5ERUZBVUxUX0RPVUJMRV9QQVJTRVIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKKyAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB3aXRoIGV4cGxpY2l0IHBhcnNlciByZXR1cm4gc2FtZSBhcnJheSIsIGRvdWJsZXMsIGNhY2hlLmdldERvdWJsZXMocmVhZGVyLCAidGhlRG91YmxlIiwgRmllbGRDYWNoZS5OVU1FUklDX1VUSUxTX0RPVUJMRV9QQVJTRVIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9ET0NTOyBpKyspIHsKICAgICAgIGFzc2VydFRydWUoZG91Ymxlcy5nZXQoaSkgKyAiIGRvZXMgbm90IGVxdWFsOiAiICsgKERvdWJsZS5NQVhfVkFMVUUgLSBpKSwgZG91Ymxlcy5nZXQoaSkgPT0gKERvdWJsZS5NQVhfVkFMVUUgLSBpKSk7CiAgICAgfQogICAgIAogICAgIEZpZWxkQ2FjaGUuTG9uZ3MgbG9uZ3MgPSBjYWNoZS5nZXRMb25ncyhyZWFkZXIsICJ0aGVMb25nIiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7CiAgICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3QgdG8gY2FjaGUgcmV0dXJuIHNhbWUgYXJyYXkiLCBsb25ncywgY2FjaGUuZ2V0TG9uZ3MocmVhZGVyLCAidGhlTG9uZyIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKLSAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB3aXRoIGV4cGxpY2l0IHBhcnNlciByZXR1cm4gc2FtZSBhcnJheSIsIGxvbmdzLCBjYWNoZS5nZXRMb25ncyhyZWFkZXIsICJ0aGVMb25nIiwgRmllbGRDYWNoZS5ERUZBVUxUX0xPTkdfUEFSU0VSLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKSk7CisgICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3Qgd2l0aCBleHBsaWNpdCBwYXJzZXIgcmV0dXJuIHNhbWUgYXJyYXkiLCBsb25ncywgY2FjaGUuZ2V0TG9uZ3MocmVhZGVyLCAidGhlTG9uZyIsIEZpZWxkQ2FjaGUuTlVNRVJJQ19VVElMU19MT05HX1BBUlNFUiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0RPQ1M7IGkrKykgewogICAgICAgYXNzZXJ0VHJ1ZShsb25ncy5nZXQoaSkgKyAiIGRvZXMgbm90IGVxdWFsOiAiICsgKExvbmcuTUFYX1ZBTFVFIC0gaSkgKyAiIGk9IiArIGksIGxvbmdzLmdldChpKSA9PSAoTG9uZy5NQVhfVkFMVUUgLSBpKSk7CiAgICAgfQotICAgIAotICAgIEZpZWxkQ2FjaGUuQnl0ZXMgYnl0ZXMgPSBjYWNoZS5nZXRCeXRlcyhyZWFkZXIsICJ0aGVCeXRlIiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7Ci0gICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3QgdG8gY2FjaGUgcmV0dXJuIHNhbWUgYXJyYXkiLCBieXRlcywgY2FjaGUuZ2V0Qnl0ZXMocmVhZGVyLCAidGhlQnl0ZSIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKLSAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB3aXRoIGV4cGxpY2l0IHBhcnNlciByZXR1cm4gc2FtZSBhcnJheSIsIGJ5dGVzLCBjYWNoZS5nZXRCeXRlcyhyZWFkZXIsICJ0aGVCeXRlIiwgRmllbGRDYWNoZS5ERUZBVUxUX0JZVEVfUEFSU0VSLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRE9DUzsgaSsrKSB7Ci0gICAgICBhc3NlcnRUcnVlKGJ5dGVzLmdldChpKSArICIgZG9lcyBub3QgZXF1YWw6ICIgKyAoQnl0ZS5NQVhfVkFMVUUgLSBpKSwgYnl0ZXMuZ2V0KGkpID09IChieXRlKSAoQnl0ZS5NQVhfVkFMVUUgLSBpKSk7Ci0gICAgfQotICAgIAotICAgIEZpZWxkQ2FjaGUuU2hvcnRzIHNob3J0cyA9IGNhY2hlLmdldFNob3J0cyhyZWFkZXIsICJ0aGVTaG9ydCIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpOwotICAgIGFzc2VydFNhbWUoIlNlY29uZCByZXF1ZXN0IHRvIGNhY2hlIHJldHVybiBzYW1lIGFycmF5Iiwgc2hvcnRzLCBjYWNoZS5nZXRTaG9ydHMocmVhZGVyLCAidGhlU2hvcnQiLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKSk7Ci0gICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3Qgd2l0aCBleHBsaWNpdCBwYXJzZXIgcmV0dXJuIHNhbWUgYXJyYXkiLCBzaG9ydHMsIGNhY2hlLmdldFNob3J0cyhyZWFkZXIsICJ0aGVTaG9ydCIsIEZpZWxkQ2FjaGUuREVGQVVMVF9TSE9SVF9QQVJTRVIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9ET0NTOyBpKyspIHsKLSAgICAgIGFzc2VydFRydWUoc2hvcnRzLmdldChpKSArICIgZG9lcyBub3QgZXF1YWw6ICIgKyAoU2hvcnQuTUFYX1ZBTFVFIC0gaSksIHNob3J0cy5nZXQoaSkgPT0gKHNob3J0KSAoU2hvcnQuTUFYX1ZBTFVFIC0gaSkpOwotICAgIH0KLSAgICAKKwogICAgIEZpZWxkQ2FjaGUuSW50cyBpbnRzID0gY2FjaGUuZ2V0SW50cyhyZWFkZXIsICJ0aGVJbnQiLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKTsKICAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB0byBjYWNoZSByZXR1cm4gc2FtZSBhcnJheSIsIGludHMsIGNhY2hlLmdldEludHMocmVhZGVyLCAidGhlSW50IiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkpOwotICAgIGFzc2VydFNhbWUoIlNlY29uZCByZXF1ZXN0IHdpdGggZXhwbGljaXQgcGFyc2VyIHJldHVybiBzYW1lIGFycmF5IiwgaW50cywgY2FjaGUuZ2V0SW50cyhyZWFkZXIsICJ0aGVJbnQiLCBGaWVsZENhY2hlLkRFRkFVTFRfSU5UX1BBUlNFUiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkpOworICAgIGFzc2VydFNhbWUoIlNlY29uZCByZXF1ZXN0IHdpdGggZXhwbGljaXQgcGFyc2VyIHJldHVybiBzYW1lIGFycmF5IiwgaW50cywgY2FjaGUuZ2V0SW50cyhyZWFkZXIsICJ0aGVJbnQiLCBGaWVsZENhY2hlLk5VTUVSSUNfVVRJTFNfSU5UX1BBUlNFUiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0RPQ1M7IGkrKykgewogICAgICAgYXNzZXJ0VHJ1ZShpbnRzLmdldChpKSArICIgZG9lcyBub3QgZXF1YWw6ICIgKyAoSW50ZWdlci5NQVhfVkFMVUUgLSBpKSwgaW50cy5nZXQoaSkgPT0gKEludGVnZXIuTUFYX1ZBTFVFIC0gaSkpOwogICAgIH0KICAgICAKICAgICBGaWVsZENhY2hlLkZsb2F0cyBmbG9hdHMgPSBjYWNoZS5nZXRGbG9hdHMocmVhZGVyLCAidGhlRmxvYXQiLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKTsKICAgICBhc3NlcnRTYW1lKCJTZWNvbmQgcmVxdWVzdCB0byBjYWNoZSByZXR1cm4gc2FtZSBhcnJheSIsIGZsb2F0cywgY2FjaGUuZ2V0RmxvYXRzKHJlYWRlciwgInRoZUZsb2F0IiwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkpOwotICAgIGFzc2VydFNhbWUoIlNlY29uZCByZXF1ZXN0IHdpdGggZXhwbGljaXQgcGFyc2VyIHJldHVybiBzYW1lIGFycmF5IiwgZmxvYXRzLCBjYWNoZS5nZXRGbG9hdHMocmVhZGVyLCAidGhlRmxvYXQiLCBGaWVsZENhY2hlLkRFRkFVTFRfRkxPQVRfUEFSU0VSLCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKSk7CisgICAgYXNzZXJ0U2FtZSgiU2Vjb25kIHJlcXVlc3Qgd2l0aCBleHBsaWNpdCBwYXJzZXIgcmV0dXJuIHNhbWUgYXJyYXkiLCBmbG9hdHMsIGNhY2hlLmdldEZsb2F0cyhyZWFkZXIsICJ0aGVGbG9hdCIsIEZpZWxkQ2FjaGUuTlVNRVJJQ19VVElMU19GTE9BVF9QQVJTRVIsIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9ET0NTOyBpKyspIHsKICAgICAgIGFzc2VydFRydWUoZmxvYXRzLmdldChpKSArICIgZG9lcyBub3QgZXF1YWw6ICIgKyAoRmxvYXQuTUFYX1ZBTFVFIC0gaSksIGZsb2F0cy5nZXQoaSkgPT0gKEZsb2F0Lk1BWF9WQUxVRSAtIGkpKTsKICAgICB9CkBAIC01ODcsMTIgKzU5MCw2IEBACiAgICAgY2FjaGUucHVyZ2VBbGxDYWNoZXMoKTsKICAgICBhc3NlcnRFcXVhbHMoMCwgY2FjaGUuZ2V0Q2FjaGVFbnRyaWVzKCkubGVuZ3RoKTsKICAgICAKLSAgICBCeXRlcyBieXRlcyA9IGNhY2hlLmdldEJ5dGVzKGFyLCAiYm9ndXNieXRlcyIsIHRydWUpOwotICAgIGFzc2VydEVxdWFscygwLCBieXRlcy5nZXQoMCkpOwotCi0gICAgU2hvcnRzIHNob3J0cyA9IGNhY2hlLmdldFNob3J0cyhhciwgImJvZ3Vzc2hvcnRzIiwgdHJ1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHNob3J0cy5nZXQoMCkpOwotICAgIAogICAgIEludHMgaW50cyA9IGNhY2hlLmdldEludHMoYXIsICJib2d1c2ludHMiLCB0cnVlKTsKICAgICBhc3NlcnRFcXVhbHMoMCwgaW50cy5nZXQoMCkpOwogICAgIApAQCAtNjUyLDEyICs2NDksNiBAQAogICAgIGNhY2hlLnB1cmdlQWxsQ2FjaGVzKCk7CiAgICAgYXNzZXJ0RXF1YWxzKDAsIGNhY2hlLmdldENhY2hlRW50cmllcygpLmxlbmd0aCk7CiAgICAgCi0gICAgQnl0ZXMgYnl0ZXMgPSBjYWNoZS5nZXRCeXRlcyhhciwgImJvZ3VzYnl0ZXMiLCB0cnVlKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnl0ZXMuZ2V0KDApKTsKLQotICAgIFNob3J0cyBzaG9ydHMgPSBjYWNoZS5nZXRTaG9ydHMoYXIsICJib2d1c3Nob3J0cyIsIHRydWUpOwotICAgIGFzc2VydEVxdWFscygwLCBzaG9ydHMuZ2V0KDApKTsKLSAgICAKICAgICBJbnRzIGludHMgPSBjYWNoZS5nZXRJbnRzKGFyLCAiYm9ndXNpbnRzIiwgdHJ1ZSk7CiAgICAgYXNzZXJ0RXF1YWxzKDAsIGludHMuZ2V0KDApKTsKICAgICAKQEAgLTY5Miw0ICs2ODMsOTcgQEAKICAgICBpci5jbG9zZSgpOwogICAgIGRpci5jbG9zZSgpOwogICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHVzZSBvZiBHcm93YWJsZVdyaXRlciBkb2Vzbid0IHByZXZlbnQgZnJvbSB1c2luZyB0aGUgZnVsbCBsb25nIHJhbmdlCisgIHB1YmxpYyB2b2lkIHRlc3RMb25nRmllbGRDYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOworICAgIEluZGV4V3JpdGVyQ29uZmlnIGNmZyA9IG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSk7CisgICAgY2ZnLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpOworICAgIFJhbmRvbUluZGV4V3JpdGVyIGl3ID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIsIGNmZyk7CisgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CisgICAgTG9uZ0ZpZWxkIGZpZWxkID0gbmV3IExvbmdGaWVsZCgiZiIsIDBMLCBTdG9yZS5ZRVMpOworICAgIGRvYy5hZGQoZmllbGQpOworICAgIGZpbmFsIGxvbmdbXSB2YWx1ZXMgPSBuZXcgbG9uZ1tfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTApXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkgeworICAgICAgZmluYWwgbG9uZyB2OworICAgICAgc3dpdGNoIChyYW5kb20oKS5uZXh0SW50KDEwKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgdiA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgdiA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICB2ID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdiA9IF9UZXN0VXRpbC5uZXh0TG9uZyhyYW5kb20oKSwgLTEwLCAxMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB2YWx1ZXNbaV0gPSB2OworICAgICAgaWYgKHYgPT0gMCAmJiByYW5kb20oKS5uZXh0Qm9vbGVhbigpKSB7CisgICAgICAgIC8vIG1pc3NpbmcKKyAgICAgICAgaXcuYWRkRG9jdW1lbnQobmV3IERvY3VtZW50KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGQuc2V0TG9uZ1ZhbHVlKHYpOworICAgICAgICBpdy5hZGREb2N1bWVudChkb2MpOworICAgICAgfQorICAgIH0KKyAgICBpdy5mb3JjZU1lcmdlKDEpOworICAgIGZpbmFsIERpcmVjdG9yeVJlYWRlciByZWFkZXIgPSBpdy5nZXRSZWFkZXIoKTsKKyAgICBmaW5hbCBGaWVsZENhY2hlLkxvbmdzIGxvbmdzID0gRmllbGRDYWNoZS5ERUZBVUxULmdldExvbmdzKGdldE9ubHlTZWdtZW50UmVhZGVyKHJlYWRlciksICJmIiwgZmFsc2UpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7CisgICAgICBhc3NlcnRFcXVhbHModmFsdWVzW2ldLCBsb25ncy5nZXQoaSkpOworICAgIH0KKyAgICByZWFkZXIuY2xvc2UoKTsKKyAgICBpdy5jbG9zZSgpOworICAgIGRpci5jbG9zZSgpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHVzZSBvZiBHcm93YWJsZVdyaXRlciBkb2Vzbid0IHByZXZlbnQgZnJvbSB1c2luZyB0aGUgZnVsbCBpbnQgcmFuZ2UKKyAgcHVibGljIHZvaWQgdGVzdEludEZpZWxkQ2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKKyAgICBJbmRleFdyaXRlckNvbmZpZyBjZmcgPSBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpOworICAgIGNmZy5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKTsKKyAgICBSYW5kb21JbmRleFdyaXRlciBpdyA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKKyAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKKyAgICBJbnRGaWVsZCBmaWVsZCA9IG5ldyBJbnRGaWVsZCgiZiIsIDAsIFN0b3JlLllFUyk7CisgICAgZG9jLmFkZChmaWVsZCk7CisgICAgZmluYWwgaW50W10gdmFsdWVzID0gbmV3IGludFtfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMSwgMTApXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkgeworICAgICAgZmluYWwgaW50IHY7CisgICAgICBzd2l0Y2ggKHJhbmRvbSgpLm5leHRJbnQoMTApKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICB2ID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICB2ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIHYgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB2ID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIC0xMCwgMTApOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdmFsdWVzW2ldID0gdjsKKyAgICAgIGlmICh2ID09IDAgJiYgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSkgeworICAgICAgICAvLyBtaXNzaW5nCisgICAgICAgIGl3LmFkZERvY3VtZW50KG5ldyBEb2N1bWVudCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkLnNldEludFZhbHVlKHYpOworICAgICAgICBpdy5hZGREb2N1bWVudChkb2MpOworICAgICAgfQorICAgIH0KKyAgICBpdy5mb3JjZU1lcmdlKDEpOworICAgIGZpbmFsIERpcmVjdG9yeVJlYWRlciByZWFkZXIgPSBpdy5nZXRSZWFkZXIoKTsKKyAgICBmaW5hbCBGaWVsZENhY2hlLkludHMgaW50cyA9IEZpZWxkQ2FjaGUuREVGQVVMVC5nZXRJbnRzKGdldE9ubHlTZWdtZW50UmVhZGVyKHJlYWRlciksICJmIiwgZmFsc2UpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7CisgICAgICBhc3NlcnRFcXVhbHModmFsdWVzW2ldLCBpbnRzLmdldChpKSk7CisgICAgfQorICAgIHJlYWRlci5jbG9zZSgpOworICAgIGl3LmNsb3NlKCk7CisgICAgZGlyLmNsb3NlKCk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RGaWVsZENhY2hlUmFuZ2VGaWx0ZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0RmllbGRDYWNoZVJhbmdlRmlsdGVyLmphdmEKaW5kZXggYjU0OTgzZi4uYmMyNWI1OCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RGaWVsZENhY2hlUmFuZ2VGaWx0ZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5qYXZhCkBAIC0xOSwxNSArMTksMTcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkRpcmVjdG9yeVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLk1vY2tBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5EaXJlY3RvcnlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLk51bWVyaWNVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogLyoqCkBAIC0xODcsOTggKzE4OSw2IEBACiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbnVsLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogICB9CiAgIAotICAvLyBieXRlLXJhbmdlcyBjYW5ub3QgYmUgdGVzdGVkLCBiZWNhdXNlIGFsbCByYW5nZXMgYXJlIHRvbyBiaWcgZm9yIGJ5dGVzLCBuZWVkIGFuIGV4dHJhIHJhbmdlIGZvciB0aGF0Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkQ2FjaGVSYW5nZUZpbHRlclNob3J0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICBJbmRleFJlYWRlciByZWFkZXIgPSBzaWduZWRJbmRleFJlYWRlcjsKLSAgICBJbmRleFNlYXJjaGVyIHNlYXJjaCA9IG5ld1NlYXJjaGVyKHJlYWRlcik7Ci0KLSAgICBpbnQgbnVtRG9jcyA9IHJlYWRlci5udW1Eb2NzKCk7Ci0gICAgaW50IG1lZElkID0gKChtYXhJZCAtIG1pbklkKSAvIDIpOwotICAgIFNob3J0IG1pbklkTyA9IFNob3J0LnZhbHVlT2YoKHNob3J0KSBtaW5JZCk7Ci0gICAgU2hvcnQgbWF4SWRPID0gU2hvcnQudmFsdWVPZigoc2hvcnQpIG1heElkKTsKLSAgICBTaG9ydCBtZWRJZE8gPSBTaG9ydC52YWx1ZU9mKChzaG9ydCkgbWVkSWQpOwotICAgICAgICAKLSAgICBhc3NlcnRFcXVhbHMoIm51bSBvZiBkb2NzIiwgbnVtRG9jcywgMSsgbWF4SWQgLSBtaW5JZCk7Ci0gICAgICAgIAotICAgIFNjb3JlRG9jW10gcmVzdWx0OwotICAgIFF1ZXJ5IHEgPSBuZXcgVGVybVF1ZXJ5KG5ldyBUZXJtKCJib2R5IiwiYm9keSIpKTsKLQotICAgIC8vIHRlc3QgaWQsIGJvdW5kZWQgb24gYm90aCBlbmRzCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJmaW5kIGFsbCIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhbGwgYnV0IGxhc3QiLCBudW1Eb2NzLTEsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhbGwgYnV0IGZpcnN0IiwgbnVtRG9jcy0xLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhbGwgYnV0IGVuZHMiLCBudW1Eb2NzLTIsIHJlc3VsdC5sZW5ndGgpOwotICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1lZElkTyxtYXhJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibWVkIGFuZCB1cCIsIDErIG1heElkLW1lZElkLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ1cCB0byBtZWQiLCAxKyBtZWRJZC1taW5JZCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgCi0gICAgLy8gdW5ib3VuZGVkIGlkCi0KLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld1Nob3J0UmFuZ2UoImlkIixudWxsLG51bGwsVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygiZmluZCBhbGwiLCBudW1Eb2NzLCByZXN1bHQubGVuZ3RoKTsKLQotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1pbklkTyxudWxsLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1pbiBhbmQgdXAiLCBudW1Eb2NzLCByZXN1bHQubGVuZ3RoKTsKLQotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG51bGwsbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1heCBhbmQgZG93biIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWluSWRPLG51bGwsRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibm90IG1pbiwgYnV0IHVwIiwgbnVtRG9jcy0xLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbnVsbCxtYXhJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibm90IG1heCwgYnV0IGRvd24iLCBudW1Eb2NzLTEsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld1Nob3J0UmFuZ2UoImlkIixtZWRJZE8sbWF4SWRPLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1lZCBhbmQgdXAsIG5vdCBtYXgiLCBtYXhJZC1tZWRJZCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1pbklkTyxtZWRJZE8sRixUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibm90IG1pbiwgdXAgdG8gbWVkIiwgbWVkSWQtbWluSWQsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgLy8gdmVyeSBzbWFsbCBzZXRzCi0KLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld1Nob3J0UmFuZ2UoImlkIixtaW5JZE8sbWluSWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1pbixtaW4sRixGIiwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWVkSWRPLG1lZElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJtZWQsbWVkLEYsRiIsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1heElkTyxtYXhJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibWF4LG1heCxGLEYiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1pbklkTyxtaW5JZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygibWluLG1pbixULFQiLCAxLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld1Nob3J0UmFuZ2UoImlkIixudWxsLG1pbklkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJudWwsbWluLEYsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdTaG9ydFJhbmdlKCJpZCIsbWF4SWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7Ci0gICAgYXNzZXJ0RXF1YWxzKCJtYXgsbWF4LFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1heElkTyxudWxsLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1heCxudWwsVCxUIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0KLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld1Nob3J0UmFuZ2UoImlkIixtZWRJZE8sbWVkSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm1lZCxtZWQsVCxUIiwgMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgCi0gICAgLy8gc3BlY2lhbCBjYXNlcwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLFNob3J0LnZhbHVlT2YoU2hvcnQuTUFYX1ZBTFVFKSxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm92ZXJmbG93IHNwZWNpYWwgY2FzZSIsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG51bGwsU2hvcnQudmFsdWVPZihTaG9ydC5NSU5fVkFMVUUpLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKLSAgICBhc3NlcnRFcXVhbHMoIm92ZXJmbG93IHNwZWNpYWwgY2FzZSIsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3U2hvcnRSYW5nZSgiaWQiLG1heElkTyxtaW5JZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwotICAgIGFzc2VydEVxdWFscygiaW52ZXJzZSByYW5nZSIsIDAsIHJlc3VsdC5sZW5ndGgpOwotICB9Ci0gIAogICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRDYWNoZVJhbmdlRmlsdGVySW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKQEAgLTI5OCw3NSArMjA4LDc1IEBACiAKICAgICAvLyB0ZXN0IGlkLCBib3VuZGVkIG9uIGJvdGggZW5kcwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtaW5JZE8sbWF4SWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgbnVtRG9jcywgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtaW5JZE8sbWF4SWRPLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgbGFzdCIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtaW5JZE8sbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgZmlyc3QiLCBudW1Eb2NzLTEsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtaW5JZE8sbWF4SWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgZW5kcyIsIG51bURvY3MtMiwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1lZElkTyxtYXhJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWVkSWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtZWQgYW5kIHVwIiwgMSsgbWF4SWQtbWVkSWQsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtaW5JZE8sbWVkSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoInVwIHRvIG1lZCIsIDErIG1lZElkLW1pbklkLCByZXN1bHQubGVuZ3RoKTsKICAgICAKICAgICAvLyB1bmJvdW5kZWQgaWQKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixudWxsLG51bGwsVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbnVsbCxudWxsLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgbnVtRG9jcywgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWluSWRPLG51bGwsVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWluSWRPLG51bGwsVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWluIGFuZCB1cCIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG51bGwsbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLG51bGwsbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm1heCBhbmQgZG93biIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1pbklkTyxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLG1pbklkTyxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm5vdCBtaW4sIGJ1dCB1cCIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixudWxsLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixudWxsLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJub3QgbWF4LCBidXQgZG93biIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixtZWRJZE8sbWF4SWRPLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLG1lZElkTyxtYXhJZE8sVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWVkIGFuZCB1cCwgbm90IG1heCIsIG1heElkLW1lZElkLCByZXN1bHQubGVuZ3RoKTsKICAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1pbklkTyxtZWRJZE8sRixUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWluSWRPLG1lZElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJub3QgbWluLCB1cCB0byBtZWQiLCBtZWRJZC1taW5JZCwgcmVzdWx0Lmxlbmd0aCk7CiAKICAgICAvLyB2ZXJ5IHNtYWxsIHNldHMKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixtaW5JZE8sbWluSWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLG1pbklkTyxtaW5JZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWluLG1pbixGLEYiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWVkSWRPLG1lZElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtZWRJZE8sbWVkSWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm1lZCxtZWQsRixGIiwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1heElkTyxtYXhJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWF4SWRPLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbWF4LEYsRiIsIDAsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1pbklkTyxtaW5JZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWluSWRPLG1pbklkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtaW4sbWluLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixudWxsLG1pbklkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixudWxsLG1pbklkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJudWwsbWluLEYsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1heElkTyxtYXhJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWF4SWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbWF4LFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkIixtYXhJZE8sbnVsbCxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtYXhJZE8sbnVsbCxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbnVsLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWQiLG1lZElkTyxtZWRJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3SW50UmFuZ2UoImlkX2ludCIsbWVkSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtZWQsbWVkLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogICAgIAogICAgIC8vIHNwZWNpYWwgY2FzZXMKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLEludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSksbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJvdmVyZmxvdyBzcGVjaWFsIGNhc2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbnVsbCxJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLG51bGwsSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUlOX1ZBTFVFKSxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJvdmVyZmxvdyBzcGVjaWFsIGNhc2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZCIsbWF4SWRPLG1pbklkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IixtYXhJZE8sbWluSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImludmVyc2UgcmFuZ2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKICAgfQogICAKQEAgLTM4OSw3NSArMjk5LDc1IEBACiAKICAgICAvLyB0ZXN0IGlkLCBib3VuZGVkIG9uIGJvdGggZW5kcwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxtYXhJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtaW5JZE8sbWF4SWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgbnVtRG9jcywgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxtYXhJZE8sVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtaW5JZE8sbWF4SWRPLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgbGFzdCIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxtYXhJZE8sRixUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtaW5JZE8sbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgZmlyc3QiLCBudW1Eb2NzLTEsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxtYXhJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtaW5JZE8sbWF4SWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImFsbCBidXQgZW5kcyIsIG51bURvY3MtMiwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtZWRJZE8sbWF4SWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWVkSWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtZWQgYW5kIHVwIiwgMSsgbWF4SWQtbWVkSWQsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxtZWRJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtaW5JZE8sbWVkSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoInVwIHRvIG1lZCIsIDErIG1lZElkLW1pbklkLCByZXN1bHQubGVuZ3RoKTsKICAgICAKICAgICAvLyB1bmJvdW5kZWQgaWQKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbnVsbCxudWxsLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbnVsbCxudWxsLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgbnVtRG9jcywgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1pbklkTyxudWxsLFQsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWluSWRPLG51bGwsVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWluIGFuZCB1cCIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixudWxsLG1heElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLG51bGwsbWF4SWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm1heCBhbmQgZG93biIsIG51bURvY3MsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtaW5JZE8sbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLG1pbklkTyxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm5vdCBtaW4sIGJ1dCB1cCIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbnVsbCxtYXhJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixudWxsLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJub3QgbWF4LCBidXQgZG93biIsIG51bURvY3MtMSwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgICAgIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbWVkSWRPLG1heElkTyxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLG1lZElkTyxtYXhJZE8sVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWVkIGFuZCB1cCwgbm90IG1heCIsIG1heElkLW1lZElkLCByZXN1bHQubGVuZ3RoKTsKICAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtaW5JZE8sbWVkSWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWluSWRPLG1lZElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJub3QgbWluLCB1cCB0byBtZWQiLCBtZWRJZC1taW5JZCwgcmVzdWx0Lmxlbmd0aCk7CiAKICAgICAvLyB2ZXJ5IHNtYWxsIHNldHMKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbWluSWRPLG1pbklkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLG1pbklkTyxtaW5JZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygibWluLG1pbixGLEYiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1lZElkTyxtZWRJZE8sRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtZWRJZE8sbWVkSWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoIm1lZCxtZWQsRixGIiwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtYXhJZE8sbWF4SWRPLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWF4SWRPLG1heElkTyxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbWF4LEYsRiIsIDAsIHJlc3VsdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtaW5JZE8sbWluSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWluSWRPLG1pbklkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtaW4sbWluLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbnVsbCxtaW5JZE8sRixUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixudWxsLG1pbklkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJudWwsbWluLEYsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtYXhJZE8sbWF4SWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWF4SWRPLG1heElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbWF4LFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZCIsbWF4SWRPLG51bGwsVCxGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtYXhJZE8sbnVsbCxULEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtYXgsbnVsLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkIixtZWRJZE8sbWVkSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWRfbG9uZyIsbWVkSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJtZWQsbWVkLFQsVCIsIDEsIHJlc3VsdC5sZW5ndGgpOwogICAgIAogICAgIC8vIHNwZWNpYWwgY2FzZXMKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLExvbmcudmFsdWVPZihMb25nLk1BWF9WQUxVRSksbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLExvbmcudmFsdWVPZihMb25nLk1BWF9WQUxVRSksbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJvdmVyZmxvdyBzcGVjaWFsIGNhc2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG51bGwsTG9uZy52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKSxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdMb25nUmFuZ2UoImlkX2xvbmciLG51bGwsTG9uZy52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKSxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJvdmVyZmxvdyBzcGVjaWFsIGNhc2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0xvbmdSYW5nZSgiaWQiLG1heElkTyxtaW5JZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3TG9uZ1JhbmdlKCJpZF9sb25nIixtYXhJZE8sbWluSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImludmVyc2UgcmFuZ2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKICAgfQogICAKQEAgLTQ3NiwxOSArMzg2LDE5IEBACiAgICAgU2NvcmVEb2NbXSByZXN1bHQ7CiAgICAgUXVlcnkgcSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oImJvZHkiLCJib2R5IikpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdGbG9hdFJhbmdlKCJpZCIsbWluSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdGbG9hdFJhbmdlKCJpZF9mbG9hdCIsbWluSWRPLG1lZElkTyxULFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJmaW5kIGFsbCIsIG51bURvY3MvMiwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgaW50IGNvdW50ID0gMDsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0Zsb2F0UmFuZ2UoImlkIixudWxsLG1lZElkTyxGLFQpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdGbG9hdFJhbmdlKCJpZF9mbG9hdCIsbnVsbCxtZWRJZE8sRixUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGNvdW50ICs9IHJlc3VsdC5sZW5ndGg7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdGbG9hdFJhbmdlKCJpZCIsbWVkSWRPLG51bGwsRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RmxvYXRSYW5nZSgiaWRfZmxvYXQiLG1lZElkTyxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBjb3VudCArPSByZXN1bHQubGVuZ3RoOwogICAgIGFzc2VydEVxdWFscygic3VtIG9mIHR3byBjb25jZW5hdHRlZCByYW5nZXMiLCBudW1Eb2NzLCBjb3VudCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdGbG9hdFJhbmdlKCJpZCIsbnVsbCxudWxsLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0Zsb2F0UmFuZ2UoImlkX2Zsb2F0IixudWxsLG51bGwsVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiZmluZCBhbGwiLCBudW1Eb2NzLCByZXN1bHQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0Zsb2F0UmFuZ2UoImlkIixGbG9hdC52YWx1ZU9mKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKSxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0Zsb2F0UmFuZ2UoImlkX2Zsb2F0IixGbG9hdC52YWx1ZU9mKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKSxudWxsLEYsRiksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImluZmluaXR5IHNwZWNpYWwgY2FzZSIsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RmxvYXRSYW5nZSgiaWQiLG51bGwsRmxvYXQudmFsdWVPZihGbG9hdC5ORUdBVElWRV9JTkZJTklUWSksRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RmxvYXRSYW5nZSgiaWRfZmxvYXQiLG51bGwsRmxvYXQudmFsdWVPZihGbG9hdC5ORUdBVElWRV9JTkZJTklUWSksRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiaW5maW5pdHkgc3BlY2lhbCBjYXNlIiwgMCwgcmVzdWx0Lmxlbmd0aCk7CiAgIH0KICAgCkBAIC01MDUsMTkgKzQxNSwxOSBAQAogICAgIFNjb3JlRG9jW10gcmVzdWx0OwogICAgIFF1ZXJ5IHEgPSBuZXcgVGVybVF1ZXJ5KG5ldyBUZXJtKCJib2R5IiwiYm9keSIpKTsKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RG91YmxlUmFuZ2UoImlkIixtaW5JZE8sbWVkSWRPLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0RvdWJsZVJhbmdlKCJpZF9kb3VibGUiLG1pbklkTyxtZWRJZE8sVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiZmluZCBhbGwiLCBudW1Eb2NzLzIsIHJlc3VsdC5sZW5ndGgpOwogICAgIGludCBjb3VudCA9IDA7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdEb3VibGVSYW5nZSgiaWQiLG51bGwsbWVkSWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0RvdWJsZVJhbmdlKCJpZF9kb3VibGUiLG51bGwsbWVkSWRPLEYsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBjb3VudCArPSByZXN1bHQubGVuZ3RoOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RG91YmxlUmFuZ2UoImlkIixtZWRJZE8sbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdEb3VibGVSYW5nZSgiaWRfZG91YmxlIixtZWRJZE8sbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgY291bnQgKz0gcmVzdWx0Lmxlbmd0aDsKICAgICBhc3NlcnRFcXVhbHMoInN1bSBvZiB0d28gY29uY2VuYXR0ZWQgcmFuZ2VzIiwgbnVtRG9jcywgY291bnQpOwotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RG91YmxlUmFuZ2UoImlkIixudWxsLG51bGwsVCxUKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RG91YmxlUmFuZ2UoImlkX2RvdWJsZSIsbnVsbCxudWxsLFQsVCksIG51bURvY3MpLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgbnVtRG9jcywgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdEb3VibGVSYW5nZSgiaWQiLERvdWJsZS52YWx1ZU9mKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSksbnVsbCxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdEb3VibGVSYW5nZSgiaWRfZG91YmxlIixEb3VibGUudmFsdWVPZihEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpLG51bGwsRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiaW5maW5pdHkgc3BlY2lhbCBjYXNlIiwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdEb3VibGVSYW5nZSgiaWQiLG51bGwsIERvdWJsZS52YWx1ZU9mKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSksRixGKSwgbnVtRG9jcykuc2NvcmVEb2NzOworICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3RG91YmxlUmFuZ2UoImlkX2RvdWJsZSIsbnVsbCwgRG91YmxlLnZhbHVlT2YoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSxGLEYpLCBudW1Eb2NzKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJpbmZpbml0eSBzcGVjaWFsIGNhc2UiLCAwLCByZXN1bHQubGVuZ3RoKTsKICAgfQogICAKQEAgLTUyOSwxMyArNDM5LDE1IEBACiAKICAgICBmb3IgKGludCBkID0gLTIwOyBkIDw9IDIwOyBkKyspIHsKICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiaWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGQpLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkX2ludCIsIGQsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJib2R5IiwgImJvZHkiLCBGaWVsZC5TdG9yZS5OTykpOwogICAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgfQogICAgIAogICAgIHdyaXRlci5mb3JjZU1lcmdlKDEpOwotICAgIHdyaXRlci5kZWxldGVEb2N1bWVudHMobmV3IFRlcm0oImlkIiwiMCIpKTsKKyAgICBCeXRlc1JlZiB0ZXJtMCA9IG5ldyBCeXRlc1JlZigpOworICAgIE51bWVyaWNVdGlscy5pbnRUb1ByZWZpeENvZGVkKDAsIDAsIHRlcm0wKTsKKyAgICB3cml0ZXIuZGVsZXRlRG9jdW1lbnRzKG5ldyBUZXJtKCJpZF9pbnQiLCB0ZXJtMCkpOwogICAgIHdyaXRlci5jbG9zZSgpOwogCiAgICAgSW5kZXhSZWFkZXIgcmVhZGVyID0gRGlyZWN0b3J5UmVhZGVyLm9wZW4oZGlyKTsKQEAgLTU0NSwxOSArNDU3LDE5IEBACiAgICAgU2NvcmVEb2NbXSByZXN1bHQ7CiAgICAgUXVlcnkgcSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oImJvZHkiLCJib2R5IikpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdCeXRlUmFuZ2UoImlkIixCeXRlLnZhbHVlT2YoKGJ5dGUpIC0yMCksQnl0ZS52YWx1ZU9mKChieXRlKSAyMCksVCxUKSwgMTAwKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IiwtMjAsMjAsVCxUKSwgMTAwKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJmaW5kIGFsbCIsIDQwLCByZXN1bHQubGVuZ3RoKTsKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3Qnl0ZVJhbmdlKCJpZCIsQnl0ZS52YWx1ZU9mKChieXRlKSAwKSxCeXRlLnZhbHVlT2YoKGJ5dGUpIDIwKSxULFQpLCAxMDApLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLDAsMjAsVCxUKSwgMTAwKS5zY29yZURvY3M7CiAgICAgYXNzZXJ0RXF1YWxzKCJmaW5kIGFsbCIsIDIwLCByZXN1bHQubGVuZ3RoKTsKIAotICAgIHJlc3VsdCA9IHNlYXJjaC5zZWFyY2gocSxGaWVsZENhY2hlUmFuZ2VGaWx0ZXIubmV3Qnl0ZVJhbmdlKCJpZCIsQnl0ZS52YWx1ZU9mKChieXRlKSAtMjApLEJ5dGUudmFsdWVPZigoYnl0ZSkgMCksVCxUKSwgMTAwKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IiwtMjAsMCxULFQpLCAxMDApLnNjb3JlRG9jczsKICAgICBhc3NlcnRFcXVhbHMoImZpbmQgYWxsIiwgMjAsIHJlc3VsdC5sZW5ndGgpOwogCi0gICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdCeXRlUmFuZ2UoImlkIixCeXRlLnZhbHVlT2YoKGJ5dGUpIDEwKSxCeXRlLnZhbHVlT2YoKGJ5dGUpIDIwKSxULFQpLCAxMDApLnNjb3JlRG9jczsKKyAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0ludFJhbmdlKCJpZF9pbnQiLDEwLDIwLFQsVCksIDEwMCkuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiZmluZCBhbGwiLCAxMSwgcmVzdWx0Lmxlbmd0aCk7CiAKLSAgICByZXN1bHQgPSBzZWFyY2guc2VhcmNoKHEsRmllbGRDYWNoZVJhbmdlRmlsdGVyLm5ld0J5dGVSYW5nZSgiaWQiLEJ5dGUudmFsdWVPZigoYnl0ZSkgLTIwKSxCeXRlLnZhbHVlT2YoKGJ5dGUpIC0xMCksVCxUKSwgMTAwKS5zY29yZURvY3M7CisgICAgcmVzdWx0ID0gc2VhcmNoLnNlYXJjaChxLEZpZWxkQ2FjaGVSYW5nZUZpbHRlci5uZXdJbnRSYW5nZSgiaWRfaW50IiwtMjAsLTEwLFQsVCksIDEwMCkuc2NvcmVEb2NzOwogICAgIGFzc2VydEVxdWFscygiZmluZCBhbGwiLCAxMSwgcmVzdWx0Lmxlbmd0aCk7CiAgICAgcmVhZGVyLmNsb3NlKCk7CiAgICAgZGlyLmNsb3NlKCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdE1pblNob3VsZE1hdGNoMi5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RNaW5TaG91bGRNYXRjaDIuamF2YQppbmRleCAyZDI5NGM3Li41N2RiNDZhIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdE1pblNob3VsZE1hdGNoMi5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0TWluU2hvdWxkTWF0Y2gyLmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guQm9vbGVhblF1ZXJ5LkJvb2xlYW5XZWlnaHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5EZWZhdWx0U2ltaWxhcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuRXhhY3RTaW1TY29yZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNpbWlsYXJpdGllcy5TaW1pbGFyaXR5LlNpbVNjb3JlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc2ltaWxhcml0aWVzLlNpbWlsYXJpdHkuU2ltV2VpZ2h0OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgZmluYWwgaW50IG1heERvYzsKIAogICAgIGZpbmFsIFNldDxMb25nPiBvcmRzID0gbmV3IEhhc2hTZXQ8TG9uZz4oKTsKLSAgICBmaW5hbCBFeGFjdFNpbVNjb3JlcltdIHNpbXM7CisgICAgZmluYWwgU2ltU2NvcmVyW10gc2ltczsKICAgICBmaW5hbCBpbnQgbWluTnJTaG91bGRNYXRjaDsKICAgICAKICAgICBkb3VibGUgc2NvcmUgPSBGbG9hdC5OYU47CkBAIC0yODUsNyArMjg1LDcgQEAKICAgICAgIHRoaXMubWF4RG9jID0gcmVhZGVyLm1heERvYygpOwogICAgICAgQm9vbGVhblF1ZXJ5IGJxID0gKEJvb2xlYW5RdWVyeSkgd2VpZ2h0LmdldFF1ZXJ5KCk7CiAgICAgICB0aGlzLm1pbk5yU2hvdWxkTWF0Y2ggPSBicS5nZXRNaW5pbXVtTnVtYmVyU2hvdWxkTWF0Y2goKTsKLSAgICAgIHRoaXMuc2ltcyA9IG5ldyBFeGFjdFNpbVNjb3JlclsoaW50KWR2LmdldFZhbHVlQ291bnQoKV07CisgICAgICB0aGlzLnNpbXMgPSBuZXcgU2ltU2NvcmVyWyhpbnQpZHYuZ2V0VmFsdWVDb3VudCgpXTsKICAgICAgIGZvciAoQm9vbGVhbkNsYXVzZSBjbGF1c2UgOiBicS5nZXRDbGF1c2VzKCkpIHsKICAgICAgICAgYXNzZXJ0ICFjbGF1c2UuaXNQcm9oaWJpdGVkKCk7CiAgICAgICAgIGFzc2VydCAhY2xhdXNlLmlzUmVxdWlyZWQoKTsKQEAgLTMwMCw3ICszMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZXIudGVybVN0YXRpc3RpY3ModGVybSwgY29udGV4dCkpOwogICAgICAgICAgIHcuZ2V0VmFsdWVGb3JOb3JtYWxpemF0aW9uKCk7IC8vIGlnbm9yZWQKICAgICAgICAgICB3Lm5vcm1hbGl6ZSgxRiwgMUYpOwotICAgICAgICAgIHNpbXNbKGludClvcmRdID0gd2VpZ2h0LnNpbWlsYXJpdHkuZXhhY3RTaW1TY29yZXIodywgcmVhZGVyLmdldENvbnRleHQoKSk7CisgICAgICAgICAgc2ltc1soaW50KW9yZF0gPSB3ZWlnaHQuc2ltaWxhcml0eS5zaW1TY29yZXIodywgcmVhZGVyLmdldENvbnRleHQoKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdE11bHRpVGhyZWFkVGVybVZlY3RvcnMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0TXVsdGlUaHJlYWRUZXJtVmVjdG9ycy5qYXZhCmluZGV4IGEyYTc2NDMuLmU5ZDUzMzggMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0TXVsdGlUaHJlYWRUZXJtVmVjdG9ycy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0TXVsdGlUaHJlYWRUZXJtVmVjdG9ycy5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgICAgc3VwZXIuc2V0VXAoKTsKICAgICBkaXJlY3RvcnkgPSBuZXdEaXJlY3RvcnkoKTsKICAgICBJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyZWN0b3J5LCBuZXdJbmRleFdyaXRlckNvbmZpZyggVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCkpKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7Ci0gICAgLy93cml0ZXIuc2V0VXNlQ29tcG91bmRGaWxlKGZhbHNlKTsKKyAgICAvL3dyaXRlci5zZXROb0NGU1JhdGlvKDAuMCk7CiAgICAgLy93cml0ZXIuaW5mb1N0cmVhbSA9IFN5c3RlbS5vdXQ7CiAgICAgRmllbGRUeXBlIGN1c3RvbVR5cGUgPSBuZXcgRmllbGRUeXBlKFRleHRGaWVsZC5UWVBFX1NUT1JFRCk7CiAgICAgY3VzdG9tVHlwZS5zZXRUb2tlbml6ZWQoZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTZWFyY2hBZnRlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTZWFyY2hBZnRlci5qYXZhCmluZGV4IDBiZDIzY2IuLjdhZTFmMjk0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdFNlYXJjaEFmdGVyLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTZWFyY2hBZnRlci5qYXZhCkBAIC0xMTEsOCArMTExLDYgQEAKICAgICBhc3NlcnRRdWVyeShxdWVyeSwgZmlsdGVyLCBTb3J0LklOREVYT1JERVIpOwogICAgIGZvcihpbnQgcmV2PTA7cmV2PDI7cmV2KyspIHsKICAgICAgIGJvb2xlYW4gcmV2ZXJzZWQgPSByZXYgPT0gMTsKLSAgICAgIGFzc2VydFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIsIG5ldyBTb3J0KG5ldyBTb3J0RmllbGRbXSB7bmV3IFNvcnRGaWVsZCgiYnl0ZSIsIFNvcnRGaWVsZC5UeXBlLkJZVEUsIHJldmVyc2VkKX0pKTsKLSAgICAgIGFzc2VydFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIsIG5ldyBTb3J0KG5ldyBTb3J0RmllbGRbXSB7bmV3IFNvcnRGaWVsZCgic2hvcnQiLCBTb3J0RmllbGQuVHlwZS5TSE9SVCwgcmV2ZXJzZWQpfSkpOwogICAgICAgYXNzZXJ0UXVlcnkocXVlcnksIGZpbHRlciwgbmV3IFNvcnQobmV3IFNvcnRGaWVsZFtdIHtuZXcgU29ydEZpZWxkKCJpbnQiLCBTb3J0RmllbGQuVHlwZS5JTlQsIHJldmVyc2VkKX0pKTsKICAgICAgIGFzc2VydFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIsIG5ldyBTb3J0KG5ldyBTb3J0RmllbGRbXSB7bmV3IFNvcnRGaWVsZCgibG9uZyIsIFNvcnRGaWVsZC5UeXBlLkxPTkcsIHJldmVyc2VkKX0pKTsKICAgICAgIGFzc2VydFF1ZXJ5KHF1ZXJ5LCBmaWx0ZXIsIG5ldyBTb3J0KG5ldyBTb3J0RmllbGRbXSB7bmV3IFNvcnRGaWVsZCgiZmxvYXQiLCBTb3J0RmllbGQuVHlwZS5GTE9BVCwgcmV2ZXJzZWQpfSkpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTaGFyZFNlYXJjaGluZy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTaGFyZFNlYXJjaGluZy5qYXZhCmluZGV4IGE2NTczNjMuLjY1ODlmNWEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U2hhcmRTZWFyY2hpbmcuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdFNoYXJkU2VhcmNoaW5nLmphdmEKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICAgICAgICAgIC8vc29ydCA9IG5ldyBTb3J0KFNvcnRGaWVsZC5GSUVMRF9ET0MpOwogICAgICAgICAgICAgICAgIHNvcnQgPSBudWxsOwogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gMikgewotICAgICAgICAgICAgICAgIHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkW10ge25ldyBTb3J0RmllbGQoImRvY2lkIiwgU29ydEZpZWxkLlR5cGUuSU5ULCByYW5kb20oKS5uZXh0Qm9vbGVhbigpKX0pOworICAgICAgICAgICAgICAgIHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkW10ge25ldyBTb3J0RmllbGQoImRvY2lkX2ludCIsIFNvcnRGaWVsZC5UeXBlLklOVCwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSl9KTsKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZFtdIHtuZXcgU29ydEZpZWxkKCJ0aXRsZSIsIFNvcnRGaWVsZC5UeXBlLlNUUklORywgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSl9KTsKICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTaW1pbGFyaXR5UHJvdmlkZXIuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U2ltaWxhcml0eVByb3ZpZGVyLmphdmEKaW5kZXggZDNkM2ExZC4uMzAxNGY3MiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTaW1pbGFyaXR5UHJvdmlkZXIuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdFNpbWlsYXJpdHlQcm92aWRlci5qYXZhCkBAIC0xMDgsNiArMTA4LDE2IEBACiAgIHByaXZhdGUgY2xhc3MgU2ltMSBleHRlbmRzIFRGSURGU2ltaWxhcml0eSB7CiAgICAgCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZW5jb2RlTm9ybVZhbHVlKGZsb2F0IGYpIHsKKyAgICAgIHJldHVybiAobG9uZykgZjsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGRlY29kZU5vcm1WYWx1ZShsb25nIG5vcm0pIHsKKyAgICAgIHJldHVybiBub3JtOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgY29vcmQoaW50IG92ZXJsYXAsIGludCBtYXhPdmVybGFwKSB7CiAgICAgICByZXR1cm4gMWY7CiAgICAgfQpAQCAtMTQ2LDYgKzE1NiwxNiBAQAogICBwcml2YXRlIGNsYXNzIFNpbTIgZXh0ZW5kcyBURklERlNpbWlsYXJpdHkgewogICAgIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGVuY29kZU5vcm1WYWx1ZShmbG9hdCBmKSB7CisgICAgICByZXR1cm4gKGxvbmcpIGY7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBkZWNvZGVOb3JtVmFsdWUobG9uZyBub3JtKSB7CisgICAgICByZXR1cm4gbm9ybTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGNvb3JkKGludCBvdmVybGFwLCBpbnQgbWF4T3ZlcmxhcCkgewogICAgICAgcmV0dXJuIDFmOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U29ydC5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTb3J0LmphdmEKaW5kZXggNmMwYzI2OS4uN2I4ZWYxMCAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTb3J0LmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RTb3J0LmphdmEKQEAgLTI0LDcgKzI0LDExIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG91YmxlRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmxvYXRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Mb25nRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU3RyaW5nRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRGlyZWN0b3J5UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwpAQCAtMzI5LDI1OSArMzMzLDE5IEBACiAgICAgaXIuY2xvc2UoKTsKICAgICBkaXIuY2xvc2UoKTsKICAgfQotICAKLSAgLyoqIFRlc3RzIHNvcnRpbmcgb24gdHlwZSBieXRlICovCi0gIHB1YmxpYyB2b2lkIHRlc3RCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwotICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjIzIiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLkJZVEUpKTsKIAotICAgIFRvcERvY3MgdGQgPSBzZWFyY2hlci5zZWFyY2gobmV3IE1hdGNoQWxsRG9jc1F1ZXJ5KCksIDEwLCBzb3J0KTsKLSAgICBhc3NlcnRFcXVhbHMoMywgdGQudG90YWxIaXRzKTsKLSAgICAvLyBudW1lcmljIG9yZGVyCi0gICAgYXNzZXJ0RXF1YWxzKCItMSIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMF0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiNCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMV0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiMjMiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzJdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLQotICAgIGlyLmNsb3NlKCk7Ci0gICAgZGlyLmNsb3NlKCk7Ci0gIH0KLSAgCi0gIC8qKiBUZXN0cyBzb3J0aW5nIG9uIHR5cGUgYnl0ZSB3aXRoIGEgbWlzc2luZyB2YWx1ZSAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZU1pc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLkJZVEUpKTsKLQotICAgIFRvcERvY3MgdGQgPSBzZWFyY2hlci5zZWFyY2gobmV3IE1hdGNoQWxsRG9jc1F1ZXJ5KCksIDEwLCBzb3J0KTsKLSAgICBhc3NlcnRFcXVhbHMoMywgdGQudG90YWxIaXRzKTsKLSAgICAvLyBudWxsIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYSAwCi0gICAgYXNzZXJ0RXF1YWxzKCItMSIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMF0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydE51bGwoc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1sxXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCI0Iiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAotICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIGJ5dGUsIHNwZWNpZnlpbmcgdGhlIG1pc3NpbmcgdmFsdWUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgQnl0ZS5NQVhfVkFMVUUgKi8KLSAgcHVibGljIHZvaWQgdGVzdEJ5dGVNaXNzaW5nTGFzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwotICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKLSAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKLSAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAKLSAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3U2VhcmNoZXIoaXIpOwotICAgIFNvcnRGaWVsZCBzb3J0RmllbGQgPSBuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLkJZVEUpOwotICAgIHNvcnRGaWVsZC5zZXRNaXNzaW5nVmFsdWUoQnl0ZS5NQVhfVkFMVUUpOwotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KHNvcnRGaWVsZCk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gbnVsbCB2YWx1ZSBpcyB0cmVhdGVkIEJ5dGUuTUFYX1ZBTFVFCi0gICAgYXNzZXJ0RXF1YWxzKCItMSIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMF0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiNCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMV0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydE51bGwoc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAotICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIGJ5dGUgaW4gcmV2ZXJzZSAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZVJldmVyc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiMjMiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKLSAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAKLSAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3U2VhcmNoZXIoaXIpOwotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoInZhbHVlIiwgU29ydEZpZWxkLlR5cGUuQllURSwgdHJ1ZSkpOwotCi0gICAgVG9wRG9jcyB0ZCA9IHNlYXJjaGVyLnNlYXJjaChuZXcgTWF0Y2hBbGxEb2NzUXVlcnkoKSwgMTAsIHNvcnQpOwotICAgIGFzc2VydEVxdWFscygzLCB0ZC50b3RhbEhpdHMpOwotICAgIC8vIHJldmVyc2UgbnVtZXJpYyBvcmRlcgotICAgIGFzc2VydEVxdWFscygiMjMiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAotICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIHNob3J0ICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwotICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKLSAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIzMDAiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKLSAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAKLSAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3U2VhcmNoZXIoaXIpOwotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoInZhbHVlIiwgU29ydEZpZWxkLlR5cGUuU0hPUlQpKTsKLQotICAgIFRvcERvY3MgdGQgPSBzZWFyY2hlci5zZWFyY2gobmV3IE1hdGNoQWxsRG9jc1F1ZXJ5KCksIDEwLCBzb3J0KTsKLSAgICBhc3NlcnRFcXVhbHMoMywgdGQudG90YWxIaXRzKTsKLSAgICAvLyBudW1lcmljIG9yZGVyCi0gICAgYXNzZXJ0RXF1YWxzKCItMSIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMF0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiNCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMV0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiMzAwIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAotICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIHNob3J0IHdpdGggYSBtaXNzaW5nIHZhbHVlICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydE1pc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLlNIT1JUKSk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gbnVsbCBpcyB0cmVhdGVkIGFzIGEgMAotICAgIGFzc2VydEVxdWFscygiLTEiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnROdWxsKHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMV0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiNCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMl0uZG9jKS5nZXQoInZhbHVlIikpOwotCi0gICAgaXIuY2xvc2UoKTsKLSAgICBkaXIuY2xvc2UoKTsKLSAgfQotICAKLSAgLyoqIFRlc3RzIHNvcnRpbmcgb24gdHlwZSBzaG9ydCwgc3BlY2lmeWluZyB0aGUgbWlzc2luZyB2YWx1ZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBTaG9ydC5NQVhfVkFMVUUgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNob3J0TWlzc2luZ0xhc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0RmllbGQgc29ydEZpZWxkID0gbmV3IFNvcnRGaWVsZCgidmFsdWUiLCBTb3J0RmllbGQuVHlwZS5TSE9SVCk7Ci0gICAgc29ydEZpZWxkLnNldE1pc3NpbmdWYWx1ZShTaG9ydC5NQVhfVkFMVUUpOwotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KHNvcnRGaWVsZCk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gbnVsbCBpcyB0cmVhdGVkIGFzIFNob3J0Lk1BWF9WQUxVRQotICAgIGFzc2VydEVxdWFscygiLTEiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnROdWxsKHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMl0uZG9jKS5nZXQoInZhbHVlIikpOwotCi0gICAgaXIuY2xvc2UoKTsKLSAgICBkaXIuY2xvc2UoKTsKLSAgfQotICAKLSAgLyoqIFRlc3RzIHNvcnRpbmcgb24gdHlwZSBzaG9ydCBpbiByZXZlcnNlICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydFJldmVyc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiMzAwIiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLlNIT1JULCB0cnVlKSk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gcmV2ZXJzZSBudW1lcmljIG9yZGVyCi0gICAgYXNzZXJ0RXF1YWxzKCIzMDAiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAogICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIGludCAqLwogICBwdWJsaWMgdm9pZCB0ZXN0SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwMDAwMCIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJ2YWx1ZSIsIDMwMDAwMCwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgidmFsdWUiLCAtMSwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNCIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJ2YWx1ZSIsIDQsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwogICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtNjA3LDEwICszNzEsMTAgQEAKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJ2YWx1ZSIsIC0xLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoInZhbHVlIiwgNCwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7CiAgICAgd3JpdGVyLmNsb3NlKCk7CkBAIC02MzYsMTAgKzQwMCwxMCBAQAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoInZhbHVlIiwgLTEsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgidmFsdWUiLCA0LCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTY2NSwxMyArNDI5LDEzIEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIzMDAwMDAiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgidmFsdWUiLCAzMDAwMDAsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoInZhbHVlIiwgLTEsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgidmFsdWUiLCA0LCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTY5NSwxMyArNDU5LDEzIEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIzMDAwMDAwMDAwIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ2YWx1ZSIsIDMwMDAwMDAwMDBMLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IExvbmdGaWVsZCgidmFsdWUiLCAtMSwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNCIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IExvbmdGaWVsZCgidmFsdWUiLCA0LCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTcyNywxMCArNDkxLDEwIEBACiAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBMb25nRmllbGQoInZhbHVlIiwgLTEsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBMb25nRmllbGQoInZhbHVlIiwgNCwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7CiAgICAgd3JpdGVyLmNsb3NlKCk7CkBAIC03NTYsMTAgKzUyMCwxMCBAQAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ2YWx1ZSIsIC0xLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ2YWx1ZSIsIDQsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwogICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtNzg1LDEzICs1NDksMTMgQEAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwMDAwMDAwMDAiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBMb25nRmllbGQoInZhbHVlIiwgMzAwMDAwMDAwMEwsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ2YWx1ZSIsIC0xLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ2YWx1ZSIsIDQsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwogICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtODE1LDEzICs1NzksMTMgQEAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwLjEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBGbG9hdEZpZWxkKCJ2YWx1ZSIsIDMwLjFmLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMS4zIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidmFsdWUiLCAtMS4zZiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNC4yIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidmFsdWUiLCA0LjJmLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTg0NywxMCArNjExLDEwIEBACiAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEuMyIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IEZsb2F0RmllbGQoInZhbHVlIiwgLTEuM2YsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQuMiIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IEZsb2F0RmllbGQoInZhbHVlIiwgNC4yZiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7CiAgICAgd3JpdGVyLmNsb3NlKCk7CkBAIC04NzYsMTAgKzY0MCwxMCBAQAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xLjMiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBGbG9hdEZpZWxkKCJ2YWx1ZSIsIC0xLjNmLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0LjIiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBGbG9hdEZpZWxkKCJ2YWx1ZSIsIDQuMmYsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwogICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtOTA1LDEzICs2NjksMTMgQEAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwLjEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBGbG9hdEZpZWxkKCJ2YWx1ZSIsIDMwLjFmLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMS4zIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidmFsdWUiLCAtMS4zZiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNC4yIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidmFsdWUiLCA0LjJmLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTkzNSwxNiArNjk5LDE2IEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIzMC4xIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInZhbHVlIiwgMzAuMSwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEuMyIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsIC0xLjMsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQuMjMzMzMzMzMzMzMzMyIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsIDQuMjMzMzMzMzMzMzMzMywgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNC4yMzMzMzMzMzMzMzMyIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInZhbHVlIiwgNC4yMzMzMzMzMzMzMzMyLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTk2OSwxMCArNzMzLDEwIEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyKTsKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIrMCIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsICswZCwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTAiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBEb3VibGVGaWVsZCgidmFsdWUiLCAtMGQsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwpAQCAtOTg0LDggKzc0OCwxMyBAQAogICAgIFRvcERvY3MgdGQgPSBzZWFyY2hlci5zZWFyY2gobmV3IE1hdGNoQWxsRG9jc1F1ZXJ5KCksIDEwLCBzb3J0KTsKICAgICBhc3NlcnRFcXVhbHMoMiwgdGQudG90YWxIaXRzKTsKICAgICAvLyBudW1lcmljIG9yZGVyCi0gICAgYXNzZXJ0RXF1YWxzKCItMCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMF0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydEVxdWFscygiKzAiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKKyAgICBkb3VibGUgdjAgPSBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0RmllbGQoInZhbHVlIikubnVtZXJpY1ZhbHVlKCkuZG91YmxlVmFsdWUoKTsKKyAgICBkb3VibGUgdjEgPSBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0RmllbGQoInZhbHVlIikubnVtZXJpY1ZhbHVlKCkuZG91YmxlVmFsdWUoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdjAsIDBkKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdjEsIDBkKTsKKyAgICAvLyBjaGVjayBzaWduIGJpdHMKKyAgICBhc3NlcnRFcXVhbHMoMSwgRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModjApID4+PiA2Myk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHYxKSA+Pj4gNjMpOwogCiAgICAgaXIuY2xvc2UoKTsKICAgICBkaXIuY2xvc2UoKTsKQEAgLTk5OCwxMyArNzY3LDEzIEBACiAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEuMyIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsIC0xLjMsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQuMjMzMzMzMzMzMzMzMyIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsIDQuMjMzMzMzMzMzMzMzMywgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNC4yMzMzMzMzMzMzMzMyIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInZhbHVlIiwgNC4yMzMzMzMzMzMzMzMyLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKICAgICB3cml0ZXIuY2xvc2UoKTsKQEAgLTEwMzEsMTMgKzgwMCwxMyBAQAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xLjMiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBEb3VibGVGaWVsZCgidmFsdWUiLCAtMS4zLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0LjIzMzMzMzMzMzMzMzMiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBEb3VibGVGaWVsZCgidmFsdWUiLCA0LjIzMzMzMzMzMzMzMzMsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQuMjMzMzMzMzMzMzMzMiIsIEZpZWxkLlN0b3JlLllFUykpOworICAgIGRvYy5hZGQobmV3IERvdWJsZUZpZWxkKCJ2YWx1ZSIsIDQuMjMzMzMzMzMzMzMzMiwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7CiAgICAgd3JpdGVyLmNsb3NlKCk7CkBAIC0xMDY0LDE2ICs4MzMsMTYgQEAKICAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwLjEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBEb3VibGVGaWVsZCgidmFsdWUiLCAzMC4xLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMS4zIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInZhbHVlIiwgLTEuMywgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNC4yMzMzMzMzMzMzMzMzIiwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInZhbHVlIiwgNC4yMzMzMzMzMzMzMzMzLCBGaWVsZC5TdG9yZS5ZRVMpKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0LjIzMzMzMzMzMzMzMzIiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKKyAgICBkb2MuYWRkKG5ldyBEb3VibGVGaWVsZCgidmFsdWUiLCA0LjIzMzMzMzMzMzMzMzIsIEZpZWxkLlN0b3JlLllFUykpOwogICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwogICAgIHdyaXRlci5jbG9zZSgpOwpAQCAtMTE1MCw3ICs5MTksNyBAQAogICAgIGZvcihpbnQgc2VnPTA7c2VnPDI7c2VnKyspIHsKICAgICAgIGZvcihpbnQgZG9jSURYPTA7ZG9jSURYPDEwO2RvY0lEWCsrKSB7CiAgICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJpZCIsICIiK2RvY0lEWCwgRmllbGQuU3RvcmUuWUVTKSk7CisgICAgICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJpZCIsIGRvY0lEWCwgRmllbGQuU3RvcmUuWUVTKSk7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IoaW50IGk9MDtpPGlkO2krKykgewogICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwpAQCAtMTI1MSw5NCArMTAyMCw2IEBACiAgIH0KICAgCiAgIC8qKiAKLSAgICogdGVzdCBzb3J0cyBmb3IgYSBjdXN0b20gYnl0ZSBwYXJzZXIgdGhhdCB1c2VzIGEgc2ltcGxlIGNoYXIgZW5jb2RpbmcgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQnl0ZVBhcnNlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIExpc3Q8U3RyaW5nPiBsZXR0ZXJzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIgfSk7Ci0gICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShsZXR0ZXJzLCByYW5kb20oKSk7Ci0KLSAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgUmFuZG9tSW5kZXhXcml0ZXIgaXcgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgZm9yIChTdHJpbmcgbGV0dGVyIDogbGV0dGVycykgewotICAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJwYXJzZXIiLCBsZXR0ZXIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgICAgaXcuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICB9Ci0gICAgCi0gICAgSW5kZXhSZWFkZXIgaXIgPSBpdy5nZXRSZWFkZXIoKTsKLSAgICBpdy5jbG9zZSgpOwotICAgIAotICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7Ci0gICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgicGFyc2VyIiwgbmV3IEZpZWxkQ2FjaGUuQnl0ZVBhcnNlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJ5dGUgcGFyc2VCeXRlKEJ5dGVzUmVmIHRlcm0pIHsKLSAgICAgICAgcmV0dXJuIChieXRlKSAodGVybS5ieXRlc1t0ZXJtLm9mZnNldF0tJ0EnKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRlcm1zLml0ZXJhdG9yKG51bGwpOwotICAgICAgfQotICAgIH0pLCBTb3J0RmllbGQuRklFTERfRE9DICk7Ci0gICAgCi0gICAgVG9wRG9jcyB0ZCA9IHNlYXJjaGVyLnNlYXJjaChuZXcgTWF0Y2hBbGxEb2NzUXVlcnkoKSwgMTAsIHNvcnQpOwotCi0gICAgLy8gcmVzdWx0cyBzaG91bGQgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCi0gICAgYXNzZXJ0RXF1YWxzKDEwLCB0ZC50b3RhbEhpdHMpOwotICAgIENvbGxlY3Rpb25zLnNvcnQobGV0dGVycyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobGV0dGVycy5nZXQoaSksIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbaV0uZG9jKS5nZXQoInBhcnNlciIpKTsKLSAgICB9Ci0KLSAgICBpci5jbG9zZSgpOwotICAgIGRpci5jbG9zZSgpOwotICB9Ci0gIAotICAvKiogCi0gICAqIHRlc3Qgc29ydHMgZm9yIGEgY3VzdG9tIHNob3J0IHBhcnNlciB0aGF0IHVzZXMgYSBzaW1wbGUgY2hhciBlbmNvZGluZyAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21TaG9ydFBhcnNlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIExpc3Q8U3RyaW5nPiBsZXR0ZXJzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIgfSk7Ci0gICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShsZXR0ZXJzLCByYW5kb20oKSk7Ci0KLSAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgUmFuZG9tSW5kZXhXcml0ZXIgaXcgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgZm9yIChTdHJpbmcgbGV0dGVyIDogbGV0dGVycykgewotICAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJwYXJzZXIiLCBsZXR0ZXIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgICAgaXcuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICB9Ci0gICAgCi0gICAgSW5kZXhSZWFkZXIgaXIgPSBpdy5nZXRSZWFkZXIoKTsKLSAgICBpdy5jbG9zZSgpOwotICAgIAotICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7Ci0gICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgicGFyc2VyIiwgbmV3IEZpZWxkQ2FjaGUuU2hvcnRQYXJzZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBzaG9ydCBwYXJzZVNob3J0KEJ5dGVzUmVmIHRlcm0pIHsKLSAgICAgICAgcmV0dXJuIChzaG9ydCkgKHRlcm0uYnl0ZXNbdGVybS5vZmZzZXRdLSdBJyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKLSAgICAgIH0KLSAgICB9KSwgU29ydEZpZWxkLkZJRUxEX0RPQyApOwotICAgIAotICAgIFRvcERvY3MgdGQgPSBzZWFyY2hlci5zZWFyY2gobmV3IE1hdGNoQWxsRG9jc1F1ZXJ5KCksIDEwLCBzb3J0KTsKLQotICAgIC8vIHJlc3VsdHMgc2hvdWxkIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlcgotICAgIGFzc2VydEVxdWFscygxMCwgdGQudG90YWxIaXRzKTsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KGxldHRlcnMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVycy5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKGxldHRlcnMuZ2V0KGkpLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzW2ldLmRvYykuZ2V0KCJwYXJzZXIiKSk7Ci0gICAgfQotCi0gICAgaXIuY2xvc2UoKTsKLSAgICBkaXIuY2xvc2UoKTsKLSAgfQotICAKLSAgLyoqIAogICAgKiB0ZXN0IHNvcnRzIGZvciBhIGN1c3RvbSBsb25nIHBhcnNlciB0aGF0IHVzZXMgYSBzaW1wbGUgY2hhciBlbmNvZGluZyAKICAgICovCiAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Mb25nUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdFNvcnREb2NWYWx1ZXMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U29ydERvY1ZhbHVlcy5qYXZhCmluZGV4IDU5NWI4NTcuLjQ5Zjk1NGQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U29ydERvY1ZhbHVlcy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0U29ydERvY1ZhbHVlcy5qYXZhCkBAIC0yMjMsMTQyICsyMjMsNiBAQAogICAgIGRpci5jbG9zZSgpOwogICB9CiAgIAotICAvKiogVGVzdHMgc29ydGluZyBvbiB0eXBlIGJ5dGUgKi8KLSAgcHVibGljIHZvaWQgdGVzdEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXcgTnVtZXJpY0RvY1ZhbHVlc0ZpZWxkKCJ2YWx1ZSIsIDIzKSk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiMjMiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ldyBOdW1lcmljRG9jVmFsdWVzRmllbGQoInZhbHVlIiwgLTEpKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3IE51bWVyaWNEb2NWYWx1ZXNGaWVsZCgidmFsdWUiLCA0KSk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNCIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwotICAgIHdyaXRlci5jbG9zZSgpOwotICAgIAotICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7Ci0gICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgidmFsdWUiLCBTb3J0RmllbGQuVHlwZS5CWVRFKSk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gbnVtZXJpYyBvcmRlcgotICAgIGFzc2VydEVxdWFscygiLTEiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjIzIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0gICAgYXNzZXJ0Tm9GaWVsZENhY2hlcygpOwotCi0gICAgaXIuY2xvc2UoKTsKLSAgICBkaXIuY2xvc2UoKTsKLSAgfQotICAKLSAgLyoqIFRlc3RzIHNvcnRpbmcgb24gdHlwZSBieXRlIGluIHJldmVyc2UgKi8KLSAgcHVibGljIHZvaWQgdGVzdEJ5dGVSZXZlcnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwotICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3IE51bWVyaWNEb2NWYWx1ZXNGaWVsZCgidmFsdWUiLCAyMykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjIzIiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXcgTnVtZXJpY0RvY1ZhbHVlc0ZpZWxkKCJ2YWx1ZSIsIC0xKSk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiLTEiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ldyBOdW1lcmljRG9jVmFsdWVzRmllbGQoInZhbHVlIiwgNCkpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjQiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBJbmRleFJlYWRlciBpciA9IHdyaXRlci5nZXRSZWFkZXIoKTsKLSAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAKLSAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3U2VhcmNoZXIoaXIpOwotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoInZhbHVlIiwgU29ydEZpZWxkLlR5cGUuQllURSwgdHJ1ZSkpOwotCi0gICAgVG9wRG9jcyB0ZCA9IHNlYXJjaGVyLnNlYXJjaChuZXcgTWF0Y2hBbGxEb2NzUXVlcnkoKSwgMTAsIHNvcnQpOwotICAgIGFzc2VydEVxdWFscygzLCB0ZC50b3RhbEhpdHMpOwotICAgIC8vIHJldmVyc2UgbnVtZXJpYyBvcmRlcgotICAgIGFzc2VydEVxdWFscygiMjMiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1syXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0gICAgYXNzZXJ0Tm9GaWVsZENhY2hlcygpOwotCi0gICAgaXIuY2xvc2UoKTsKLSAgICBkaXIuY2xvc2UoKTsKLSAgfQotICAKLSAgLyoqIFRlc3RzIHNvcnRpbmcgb24gdHlwZSBzaG9ydCAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKLSAgICBSYW5kb21JbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7Ci0gICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXcgTnVtZXJpY0RvY1ZhbHVlc0ZpZWxkKCJ2YWx1ZSIsIDMwMCkpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIjMwMCIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3IE51bWVyaWNEb2NWYWx1ZXNGaWVsZCgidmFsdWUiLCAtMSkpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInZhbHVlIiwgIi0xIiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgZG9jID0gbmV3IERvY3VtZW50KCk7Ci0gICAgZG9jLmFkZChuZXcgTnVtZXJpY0RvY1ZhbHVlc0ZpZWxkKCJ2YWx1ZSIsIDQpKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICI0IiwgRmllbGQuU3RvcmUuWUVTKSk7Ci0gICAgd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0gICAgSW5kZXhSZWFkZXIgaXIgPSB3cml0ZXIuZ2V0UmVhZGVyKCk7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgCi0gICAgSW5kZXhTZWFyY2hlciBzZWFyY2hlciA9IG5ld1NlYXJjaGVyKGlyKTsKLSAgICBTb3J0IHNvcnQgPSBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJ2YWx1ZSIsIFNvcnRGaWVsZC5UeXBlLlNIT1JUKSk7Ci0KLSAgICBUb3BEb2NzIHRkID0gc2VhcmNoZXIuc2VhcmNoKG5ldyBNYXRjaEFsbERvY3NRdWVyeSgpLCAxMCwgc29ydCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHRkLnRvdGFsSGl0cyk7Ci0gICAgLy8gbnVtZXJpYyBvcmRlcgotICAgIGFzc2VydEVxdWFscygiLTEiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzBdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQiLCBzZWFyY2hlci5kb2ModGQuc2NvcmVEb2NzWzFdLmRvYykuZ2V0KCJ2YWx1ZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjMwMCIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMl0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydE5vRmllbGRDYWNoZXMoKTsKLQotICAgIGlyLmNsb3NlKCk7Ci0gICAgZGlyLmNsb3NlKCk7Ci0gIH0KLSAgCi0gIC8qKiBUZXN0cyBzb3J0aW5nIG9uIHR5cGUgc2hvcnQgaW4gcmV2ZXJzZSAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRSZXZlcnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7Ci0gICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIpOwotICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3IE51bWVyaWNEb2NWYWx1ZXNGaWVsZCgidmFsdWUiLCAzMDApKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICIzMDAiLCBGaWVsZC5TdG9yZS5ZRVMpKTsKLSAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKLSAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBkb2MuYWRkKG5ldyBOdW1lcmljRG9jVmFsdWVzRmllbGQoInZhbHVlIiwgLTEpKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ2YWx1ZSIsICItMSIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgIGRvYy5hZGQobmV3IE51bWVyaWNEb2NWYWx1ZXNGaWVsZCgidmFsdWUiLCA0KSk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidmFsdWUiLCAiNCIsIEZpZWxkLlN0b3JlLllFUykpOwotICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwotICAgIEluZGV4UmVhZGVyIGlyID0gd3JpdGVyLmdldFJlYWRlcigpOwotICAgIHdyaXRlci5jbG9zZSgpOwotICAgIAotICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7Ci0gICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgidmFsdWUiLCBTb3J0RmllbGQuVHlwZS5TSE9SVCwgdHJ1ZSkpOwotCi0gICAgVG9wRG9jcyB0ZCA9IHNlYXJjaGVyLnNlYXJjaChuZXcgTWF0Y2hBbGxEb2NzUXVlcnkoKSwgMTAsIHNvcnQpOwotICAgIGFzc2VydEVxdWFscygzLCB0ZC50b3RhbEhpdHMpOwotICAgIC8vIHJldmVyc2UgbnVtZXJpYyBvcmRlcgotICAgIGFzc2VydEVxdWFscygiMzAwIiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1swXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCI0Iiwgc2VhcmNoZXIuZG9jKHRkLnNjb3JlRG9jc1sxXS5kb2MpLmdldCgidmFsdWUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCItMSIsIHNlYXJjaGVyLmRvYyh0ZC5zY29yZURvY3NbMl0uZG9jKS5nZXQoInZhbHVlIikpOwotICAgIGFzc2VydE5vRmllbGRDYWNoZXMoKTsKLQotICAgIGlyLmNsb3NlKCk7Ci0gICAgZGlyLmNsb3NlKCk7Ci0gIH0KLSAgCiAgIC8qKiBUZXN0cyBzb3J0aW5nIG9uIHR5cGUgaW50ICovCiAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0VGVybVZlY3RvcnMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9UZXN0VGVybVZlY3RvcnMuamF2YQppbmRleCBlYmVmM2JkLi4yM2Q4YTU0IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvVGVzdFRlcm1WZWN0b3JzLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL1Rlc3RUZXJtVmVjdG9ycy5qYXZhCkBAIC01MCw3ICs1MCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geyAgICAgICAgICAgICAgICAgIAogICAgIGRpcmVjdG9yeSA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyZWN0b3J5LCBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSwgTW9ja1Rva2VuaXplci5TSU1QTEUsIHRydWUpKS5zZXRNZXJnZVBvbGljeShuZXdMb2dNZXJnZVBvbGljeSgpKSk7Ci0gICAgLy93cml0ZXIuc2V0VXNlQ29tcG91bmRGaWxlKHRydWUpOworICAgIC8vd3JpdGVyLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICAvL3dyaXRlci5pbmZvU3RyZWFtID0gU3lzdGVtLm91dDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewogICAgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvSnVzdENvbXBpbGVTZWFyY2hTcGFucy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NwYW5zL0p1c3RDb21waWxlU2VhcmNoU3BhbnMuamF2YQppbmRleCA5Y2I0Mzc2Li4xNzc4NzRmIDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvSnVzdENvbXBpbGVTZWFyY2hTcGFucy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zcGFucy9KdXN0Q29tcGlsZVNlYXJjaFNwYW5zLmphdmEKQEAgLTE0OCw3ICsxNDgsNyBAQAogICBzdGF0aWMgZmluYWwgY2xhc3MgSnVzdENvbXBpbGVTcGFuU2NvcmVyIGV4dGVuZHMgU3BhblNjb3JlciB7CiAKICAgICBwcm90ZWN0ZWQgSnVzdENvbXBpbGVTcGFuU2NvcmVyKFNwYW5zIHNwYW5zLCBXZWlnaHQgd2VpZ2h0LAotICAgICAgICBTaW1pbGFyaXR5LlNsb3BweVNpbVNjb3JlciBkb2NTY29yZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNpbWlsYXJpdHkuU2ltU2NvcmVyIGRvY1Njb3JlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgIHN1cGVyKHNwYW5zLCB3ZWlnaHQsIGRvY1Njb3Jlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvVGVzdFBheWxvYWRTcGFucy5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3NwYW5zL1Rlc3RQYXlsb2FkU3BhbnMuamF2YQppbmRleCA0MDE3MmJhLi5mNGIzNTM1IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3BhbnMvVGVzdFBheWxvYWRTcGFucy5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zcGFucy9UZXN0UGF5bG9hZFNwYW5zLmphdmEKQEAgLTM3OSwxMSArMzc5LDExIEBACiAgICAgUGF5bG9hZFNwYW5VdGlsIHBzdSA9IG5ldyBQYXlsb2FkU3BhblV0aWwoc2VhcmNoZXIuZ2V0VG9wUmVhZGVyQ29udGV4dCgpKTsKICAgICAKICAgICBDb2xsZWN0aW9uPGJ5dGVbXT4gcGF5bG9hZHMgPSBwc3UuZ2V0UGF5bG9hZHNGb3JRdWVyeShuZXcgVGVybVF1ZXJ5KG5ldyBUZXJtKFBheWxvYWRIZWxwZXIuRklFTEQsICJyciIpKSk7Ci0gICAgaWYoVkVSQk9TRSkKKyAgICBpZihWRVJCT1NFKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bSBwYXlsb2FkczoiICsgcGF5bG9hZHMuc2l6ZSgpKTsKLSAgICBmb3IgKGZpbmFsIGJ5dGUgW10gYnl0ZXMgOiBwYXlsb2FkcykgewotICAgICAgaWYoVkVSQk9TRSkKKyAgICAgIGZvciAoZmluYWwgYnl0ZSBbXSBieXRlcyA6IHBheWxvYWRzKSB7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKGJ5dGVzLCAiVVRGLTgiKSk7CisgICAgICB9CiAgICAgfQogICAgIHJlYWRlci5jbG9zZSgpOwogICAgIGRpcmVjdG9yeS5jbG9zZSgpOwpAQCAtNDUxLDEyICs0NTEsMTIgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNwYW5zIER1bXAgLS0iKTsKICAgICAgIGlmIChzcGFucy5pc1BheWxvYWRBdmFpbGFibGUoKSkgewogICAgICAgICBDb2xsZWN0aW9uPGJ5dGVbXT4gcGF5bG9hZCA9IHNwYW5zLmdldFBheWxvYWQoKTsKLSAgICAgICAgaWYoVkVSQk9TRSkKKyAgICAgICAgaWYoVkVSQk9TRSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGF5bG9hZHMgZm9yIHNwYW46IiArIHBheWxvYWQuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChmaW5hbCBieXRlIFtdIGJ5dGVzIDogcGF5bG9hZCkgewotICAgICAgICAgIGlmKFZFUkJPU0UpCisgICAgICAgICAgZm9yIChmaW5hbCBieXRlIFtdIGJ5dGVzIDogcGF5bG9hZCkgewogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb2M6IiArIHNwYW5zLmRvYygpICsgIiBzOiIgKyBzcGFucy5zdGFydCgpICsgIiBlOiIgKyBzcGFucy5lbmQoKSArICIgIgogICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoYnl0ZXMsICJVVEYtOCIpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnRFcXVhbHMobnVtUGF5bG9hZHNbY250XSxwYXlsb2FkLnNpemUoKSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zdG9yZS9UZXN0RGlyZWN0b3J5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zdG9yZS9UZXN0RGlyZWN0b3J5LmphdmEKaW5kZXggNTQwMzYyZC4uOWU3NzlmMiAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvVGVzdERpcmVjdG9yeS5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3N0b3JlL1Rlc3REaXJlY3RvcnkuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTW9ja0RpcmVjdG9yeVdyYXBwZXIuVGhyb3R0bGluZzsKQEAgLTk4LDcgKzk5LDcgQEAKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICBJbmRleElucHV0IGlucHV0ID0gZGlyLm9wZW5JbnB1dChmaWxlLCBuZXdJT0NvbnRleHQocmFuZG9tKCkpKTsKICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoInN0aWxsIG9wZW4gZm9yIHdyaXRpbmciKSkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvVGVzdEZpbGVTd2l0Y2hEaXJlY3RvcnkuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3N0b3JlL1Rlc3RGaWxlU3dpdGNoRGlyZWN0b3J5LmphdmEKaW5kZXggYzE4ZDMxZS4uMDQ0Y2EzMSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvVGVzdEZpbGVTd2l0Y2hEaXJlY3RvcnkuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zdG9yZS9UZXN0RmlsZVN3aXRjaERpcmVjdG9yeS5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgICAgSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKAogICAgICAgICBmc2QsCiAgICAgICAgIG5ldyBJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSkpLgotICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koZmFsc2UpKS5zZXRDb2RlYyhDb2RlYy5mb3JOYW1lKCJMdWNlbmU0MCIpKQorICAgICAgICAgICAgc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koZmFsc2UpKS5zZXRDb2RlYyhDb2RlYy5mb3JOYW1lKCJMdWNlbmU0MCIpKS5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpCiAgICAgKTsKICAgICBUZXN0SW5kZXhXcml0ZXJSZWFkZXIuY3JlYXRlSW5kZXhOb0Nsb3NlKHRydWUsICJyYW0iLCB3cml0ZXIpOwogICAgIEluZGV4UmVhZGVyIHJlYWRlciA9IERpcmVjdG9yeVJlYWRlci5vcGVuKHdyaXRlciwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1Rlc3RGaWVsZENhY2hlU2FuaXR5Q2hlY2tlci5qYXZhIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9UZXN0RmllbGRDYWNoZVNhbml0eUNoZWNrZXIuamF2YQppbmRleCBmYmZiZGVkLi44OTVlYWE2IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1Rlc3RGaWVsZENhY2hlU2FuaXR5Q2hlY2tlci5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvVGVzdEZpZWxkQ2FjaGVTYW5pdHlDaGVja2VyLmphdmEKQEAgLTE2LDIxICsxNiwyNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG91YmxlRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmxvYXRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Mb25nRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguQXRvbWljUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkRpcmVjdG9yeVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5NdWx0aVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5NdWx0aVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TbG93Q29tcG9zaXRlUmVhZGVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5GaWVsZENhY2hlU2FuaXR5Q2hlY2tlci5JbnNhbml0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkZpZWxkQ2FjaGVTYW5pdHlDaGVja2VyLkluc2FuaXR5VHlwZTsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KIHB1YmxpYyBjbGFzcyBUZXN0RmllbGRDYWNoZVNhbml0eUNoZWNrZXIgZXh0ZW5kcyBMdWNlbmVUZXN0Q2FzZSB7CiAKICAgcHJvdGVjdGVkIEF0b21pY1JlYWRlciByZWFkZXJBOwpAQCAtNTEsMTggKzU1LDE0IEBACiAKICAgICBsb25nIHRoZUxvbmcgPSBMb25nLk1BWF9WQUxVRTsKICAgICBkb3VibGUgdGhlRG91YmxlID0gRG91YmxlLk1BWF9WQUxVRTsKLSAgICBieXRlIHRoZUJ5dGUgPSBCeXRlLk1BWF9WQUxVRTsKLSAgICBzaG9ydCB0aGVTaG9ydCA9IFNob3J0Lk1BWF9WQUxVRTsKICAgICBpbnQgdGhlSW50ID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgZmxvYXQgdGhlRmxvYXQgPSBGbG9hdC5NQVhfVkFMVUU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRE9DUzsgaSsrKXsKICAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotICAgICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgidGhlTG9uZyIsIFN0cmluZy52YWx1ZU9mKHRoZUxvbmctLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVEb3VibGUiLCBTdHJpbmcudmFsdWVPZih0aGVEb3VibGUtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVCeXRlIiwgU3RyaW5nLnZhbHVlT2YodGhlQnl0ZS0tKSwgRmllbGQuU3RvcmUuTk8pKTsKLSAgICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoInRoZVNob3J0IiwgU3RyaW5nLnZhbHVlT2YodGhlU2hvcnQtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVJbnQiLCBTdHJpbmcudmFsdWVPZih0aGVJbnQtLSksIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJ0aGVGbG9hdCIsIFN0cmluZy52YWx1ZU9mKHRoZUZsb2F0LS0pLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgTG9uZ0ZpZWxkKCJ0aGVMb25nIiwgdGhlTG9uZy0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgRG91YmxlRmllbGQoInRoZURvdWJsZSIsIHRoZURvdWJsZS0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgSW50RmllbGQoInRoZUludCIsIHRoZUludC0tLCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgZG9jLmFkZChuZXcgRmxvYXRGaWVsZCgidGhlRmxvYXQiLCB0aGVGbG9hdC0tLCBGaWVsZC5TdG9yZS5OTykpOwogICAgICAgaWYgKDAgPT0gaSAlIDMpIHsKICAgICAgICAgd0EuYWRkRG9jdW1lbnQoZG9jKTsKICAgICAgIH0gZWxzZSB7CkBAIC05NSwxMiArOTUsMTIgQEAKICAgICBjYWNoZS5wdXJnZUFsbENhY2hlcygpOwogCiAgICAgY2FjaGUuZ2V0RG91YmxlcyhyZWFkZXJBLCAidGhlRG91YmxlIiwgZmFsc2UpOwotICAgIGNhY2hlLmdldERvdWJsZXMocmVhZGVyQSwgInRoZURvdWJsZSIsIEZpZWxkQ2FjaGUuREVGQVVMVF9ET1VCTEVfUEFSU0VSLCBmYWxzZSk7Ci0gICAgY2FjaGUuZ2V0RG91YmxlcyhyZWFkZXJBY2xvbmUsICJ0aGVEb3VibGUiLCBGaWVsZENhY2hlLkRFRkFVTFRfRE9VQkxFX1BBUlNFUiwgZmFsc2UpOwotICAgIGNhY2hlLmdldERvdWJsZXMocmVhZGVyQiwgInRoZURvdWJsZSIsIEZpZWxkQ2FjaGUuREVGQVVMVF9ET1VCTEVfUEFSU0VSLCBmYWxzZSk7CisgICAgY2FjaGUuZ2V0RG91YmxlcyhyZWFkZXJBLCAidGhlRG91YmxlIiwgRmllbGRDYWNoZS5OVU1FUklDX1VUSUxTX0RPVUJMRV9QQVJTRVIsIGZhbHNlKTsKKyAgICBjYWNoZS5nZXREb3VibGVzKHJlYWRlckFjbG9uZSwgInRoZURvdWJsZSIsIEZpZWxkQ2FjaGUuTlVNRVJJQ19VVElMU19ET1VCTEVfUEFSU0VSLCBmYWxzZSk7CisgICAgY2FjaGUuZ2V0RG91YmxlcyhyZWFkZXJCLCAidGhlRG91YmxlIiwgRmllbGRDYWNoZS5OVU1FUklDX1VUSUxTX0RPVUJMRV9QQVJTRVIsIGZhbHNlKTsKIAogICAgIGNhY2hlLmdldEludHMocmVhZGVyWCwgInRoZUludCIsIGZhbHNlKTsKLSAgICBjYWNoZS5nZXRJbnRzKHJlYWRlclgsICJ0aGVJbnQiLCBGaWVsZENhY2hlLkRFRkFVTFRfSU5UX1BBUlNFUiwgZmFsc2UpOworICAgIGNhY2hlLmdldEludHMocmVhZGVyWCwgInRoZUludCIsIEZpZWxkQ2FjaGUuTlVNRVJJQ19VVElMU19JTlRfUEFSU0VSLCBmYWxzZSk7CiAKICAgICAvLyAvLyAvLyAKIApAQCAtMTE5LDkgKzExOSw4IEBACiAgICAgRmllbGRDYWNoZSBjYWNoZSA9IEZpZWxkQ2FjaGUuREVGQVVMVDsKICAgICBjYWNoZS5wdXJnZUFsbENhY2hlcygpOwogCi0gICAgY2FjaGUuZ2V0SW50cyhyZWFkZXJYLCAidGhlSW50IiwgRmllbGRDYWNoZS5ERUZBVUxUX0lOVF9QQVJTRVIsIGZhbHNlKTsKKyAgICBjYWNoZS5nZXRJbnRzKHJlYWRlclgsICJ0aGVJbnQiLCBGaWVsZENhY2hlLk5VTUVSSUNfVVRJTFNfSU5UX1BBUlNFUiwgZmFsc2UpOwogICAgIGNhY2hlLmdldFRlcm1zKHJlYWRlclgsICJ0aGVJbnQiKTsKLSAgICBjYWNoZS5nZXRCeXRlcyhyZWFkZXJYLCAidGhlQnl0ZSIsIGZhbHNlKTsKIAogICAgIC8vIC8vIC8vIAogCkBAIC0xNDcsOCArMTQ2LDYgQEAKICAgICBjYWNoZS5nZXRUZXJtcyhyZWFkZXJCLCAidGhlSW50Iik7CiAgICAgY2FjaGUuZ2V0VGVybXMocmVhZGVyWCwgInRoZUludCIpOwogCi0gICAgY2FjaGUuZ2V0Qnl0ZXMocmVhZGVyWCwgInRoZUJ5dGUiLCBmYWxzZSk7Ci0KIAogICAgIC8vIC8vIC8vIAogCmRpZmYgLS1naXQgYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9UZXN0MkJGU1QuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1Rlc3QyQkZTVC5qYXZhCmluZGV4IDcwMWU5MjEuLmExNDllZDYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1Rlc3QyQkZTVC5qYXZhCisrKyBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1Rlc3QyQkZTVC5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRpbWVvdXRTdWl0ZTsKIAotQElnbm9yZSgiUmVxdWlyZXMgdG9ucyBvZiBoZWFwIHRvIHJ1biAoMTBHIHdvcmtzKSIpCitASWdub3JlKCJSZXF1aXJlcyB0b25zIG9mIGhlYXAgdG8gcnVuICg0MjBHIHdvcmtzKSIpCiBAVGltZW91dFN1aXRlKG1pbGxpcyA9IDEwMCAqIFRpbWVVbml0cy5IT1VSKQogcHVibGljIGNsYXNzIFRlc3QyQkZTVCBleHRlbmRzIEx1Y2VuZVRlc3RDYXNlIHsKIApAQCAtNTAsMTIgKzUwLDEyIEBACiAgICAgZm9yKGludCBkb1BhY2tJdGVyPTA7ZG9QYWNrSXRlcjwyO2RvUGFja0l0ZXIrKykgewogICAgICAgYm9vbGVhbiBkb1BhY2sgPSBkb1BhY2tJdGVyID09IDE7CiAKLSAgICAgIC8vIEJ1aWxkIEZTVCB3LyBOb091dHB1dHMgYW5kIHN0b3Agd2hlbiBub2RlQ291bnQgPiAzQgorICAgICAgLy8gQnVpbGQgRlNUIHcvIE5vT3V0cHV0cyBhbmQgc3RvcCB3aGVuIG5vZGVDb3VudCA+IDIuMkIKICAgICAgIGlmICghZG9QYWNrKSB7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5URVNUOiAzQiBub2RlczsgZG9QYWNrPWZhbHNlIG91dHB1dD1OT19PVVRQVVRTIik7CiAgICAgICAgIE91dHB1dHM8T2JqZWN0PiBvdXRwdXRzID0gTm9PdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgICBPYmplY3QgTk9fT1VUUFVUID0gb3V0cHV0cy5nZXROb091dHB1dCgpOwotICAgICAgICBmaW5hbCBCdWlsZGVyPE9iamVjdD4gYiA9IG5ldyBCdWlsZGVyPE9iamVjdD4oRlNULklOUFVUX1RZUEUuQllURTEsIDAsIDAsIGZhbHNlLCBmYWxzZSwgSW50ZWdlci5NQVhfVkFMVUUsIG91dHB1dHMsCisgICAgICAgIGZpbmFsIEJ1aWxkZXI8T2JqZWN0PiBiID0gbmV3IEJ1aWxkZXI8T2JqZWN0PihGU1QuSU5QVVRfVFlQRS5CWVRFMSwgMCwgMCwgdHJ1ZSwgdHJ1ZSwgSW50ZWdlci5NQVhfVkFMVUUsIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBkb1BhY2ssIFBhY2tlZEludHMuQ09NUEFDVCwgdHJ1ZSwgMTUpOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgaWYgKGNvdW50ICUgMTAwMDAwID09IDApIHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb3VudCArICI6ICIgKyBiLmZzdFNpemVJbkJ5dGVzKCkgKyAiIGJ5dGVzOyAiICsgYi5nZXRUb3RTdGF0ZUNvdW50KCkgKyAiIG5vZGVzIik7CiAgICAgICAgICAgfQotICAgICAgICAgIGlmIChiLmdldFRvdFN0YXRlQ291bnQoKSA+IExJTUlUKSB7CisgICAgICAgICAgaWYgKGIuZ2V0VG90U3RhdGVDb3VudCgpID4gSW50ZWdlci5NQVhfVkFMVUUgKyAxMDBMICogMTAyNCAqIDEwMjQpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgICBuZXh0SW5wdXQociwgaW50czIpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvVGVzdEZTVHMuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1Rlc3RGU1RzLmphdmEKaW5kZXggZmQ3ZThhYy4uZmUyMWUwYSAxMDA2NDQKLS0tIGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvVGVzdEZTVHMuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9UZXN0RlNUcy5qYXZhCkBAIC0xMjYsNyArMTI2LDcgQEAKIAogICAgICAgLy8gRlNUIG9yZCBwb3MgaW50CiAgICAgICB7Ci0gICAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgICAgIGZpbmFsIExpc3Q8RlNUVGVzdGVyLklucHV0T3V0cHV0PExvbmc+PiBwYWlycyA9IG5ldyBBcnJheUxpc3Q8RlNUVGVzdGVyLklucHV0T3V0cHV0PExvbmc+Pih0ZXJtczIubGVuZ3RoKTsKICAgICAgICAgZm9yKGludCBpZHg9MDtpZHg8dGVybXMyLmxlbmd0aDtpZHgrKykgewogICAgICAgICAgIHBhaXJzLmFkZChuZXcgRlNUVGVzdGVyLklucHV0T3V0cHV0PExvbmc+KHRlcm1zMltpZHhdLCAobG9uZykgaWR4KSk7CkBAIC0xNzEsNyArMTcxLDcgQEAKIAogICAgIC8vIFBvc2l0aXZlSW50T3V0cHV0IChvcmQpCiAgICAgewotICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHRydWUpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgICBmaW5hbCBMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4odGVybXMubGVuZ3RoKTsKICAgICAgIGZvcihpbnQgaWR4PTA7aWR4PHRlcm1zLmxlbmd0aDtpZHgrKykgewogICAgICAgICBwYWlycy5hZGQobmV3IEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPih0ZXJtc1tpZHhdLCAobG9uZykgaWR4KSk7CkBAIC0xODEsOCArMTgxLDcgQEAKIAogICAgIC8vIFBvc2l0aXZlSW50T3V0cHV0IChyYW5kb20gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHBvc2l0aXZlIG51bWJlcikKICAgICB7Ci0gICAgICBmaW5hbCBib29sZWFuIGRvU2hhcmUgPSByYW5kb20oKS5uZXh0Qm9vbGVhbigpOwotICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKGRvU2hhcmUpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgICBmaW5hbCBMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4odGVybXMubGVuZ3RoKTsKICAgICAgIGxvbmcgbGFzdE91dHB1dCA9IDA7CiAgICAgICBmb3IoaW50IGlkeD0wO2lkeDx0ZXJtcy5sZW5ndGg7aWR4KyspIHsKQEAgLTE5MCwxMiArMTg5LDEyIEBACiAgICAgICAgIGxhc3RPdXRwdXQgPSB2YWx1ZTsKICAgICAgICAgcGFpcnMuYWRkKG5ldyBGU1RUZXN0ZXIuSW5wdXRPdXRwdXQ8TG9uZz4odGVybXNbaWR4XSwgdmFsdWUpKTsKICAgICAgIH0KLSAgICAgIG5ldyBGU1RUZXN0ZXI8TG9uZz4ocmFuZG9tKCksIGRpciwgaW5wdXRNb2RlLCBwYWlycywgb3V0cHV0cywgZG9TaGFyZSkuZG9UZXN0KHRydWUpOworICAgICAgbmV3IEZTVFRlc3RlcjxMb25nPihyYW5kb20oKSwgZGlyLCBpbnB1dE1vZGUsIHBhaXJzLCBvdXRwdXRzLCB0cnVlKS5kb1Rlc3QodHJ1ZSk7CiAgICAgfQogCiAgICAgLy8gUG9zaXRpdmVJbnRPdXRwdXQgKHJhbmRvbSBwb3NpdGl2ZSBudW1iZXIpCiAgICAgewotICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHJhbmRvbSgpLm5leHRCb29sZWFuKCkpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgICBmaW5hbCBMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPj4odGVybXMubGVuZ3RoKTsKICAgICAgIGZvcihpbnQgaWR4PTA7aWR4PHRlcm1zLmxlbmd0aDtpZHgrKykgewogICAgICAgICBwYWlycy5hZGQobmV3IEZTVFRlc3Rlci5JbnB1dE91dHB1dDxMb25nPih0ZXJtc1tpZHhdLCBfVGVzdFV0aWwubmV4dExvbmcocmFuZG9tKCksIDAsIExvbmcuTUFYX1ZBTFVFKSkpOwpAQCAtMjA1LDggKzIwNCw4IEBACiAKICAgICAvLyBQYWlyPG9yZCwgKHJhbmRvbSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgcG9zaXRpdmUgbnVtYmVyPgogICAgIHsKLSAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvMSA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24ocmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7Ci0gICAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgbzIgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHJhbmRvbSgpLm5leHRCb29sZWFuKCkpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG8xID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG8yID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgZmluYWwgUGFpck91dHB1dHM8TG9uZyxMb25nPiBvdXRwdXRzID0gbmV3IFBhaXJPdXRwdXRzPExvbmcsTG9uZz4obzEsIG8yKTsKICAgICAgIGZpbmFsIExpc3Q8RlNUVGVzdGVyLklucHV0T3V0cHV0PFBhaXJPdXRwdXRzLlBhaXI8TG9uZyxMb25nPj4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxGU1RUZXN0ZXIuSW5wdXRPdXRwdXQ8UGFpck91dHB1dHMuUGFpcjxMb25nLExvbmc+Pj4odGVybXMubGVuZ3RoKTsKICAgICAgIGxvbmcgbGFzdE91dHB1dCA9IDA7CkBAIC0zMDYsNyArMzA1LDcgQEAKICAgICB9CiAgICAgSW5kZXhSZWFkZXIgciA9IERpcmVjdG9yeVJlYWRlci5vcGVuKHdyaXRlciwgdHJ1ZSk7CiAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHJhbmRvbSgpLm5leHRCb29sZWFuKCkpOworICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogCiAgICAgZmluYWwgYm9vbGVhbiBkb1Jld3JpdGUgPSByYW5kb20oKS5uZXh0Qm9vbGVhbigpOwogCkBAIC02NTMsOCArNjUyLDggQEAKIAogICAgIGlmIChzdG9yZU9yZHMgJiYgc3RvcmVEb2NGcmVxcykgewogICAgICAgLy8gU3RvcmUgYm90aCBvcmQgJiBkb2NGcmVxOgotICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG8xID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKLSAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvMiA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oZmFsc2UpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG8xID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOworICAgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG8yID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgZmluYWwgUGFpck91dHB1dHM8TG9uZyxMb25nPiBvdXRwdXRzID0gbmV3IFBhaXJPdXRwdXRzPExvbmcsTG9uZz4obzEsIG8yKTsKICAgICAgIG5ldyBWaXNpdFRlcm1zPFBhaXJPdXRwdXRzLlBhaXI8TG9uZyxMb25nPj4oZGlyT3V0LCB3b3Jkc0ZpbGVJbiwgaW5wdXRNb2RlLCBwcnVuZSwgb3V0cHV0cywgZG9QYWNrLCBub0FyY0FycmF5cykgewogICAgICAgICBSYW5kb20gcmFuZDsKQEAgLTY2OSw3ICs2NjgsNyBAQAogICAgICAgfS5ydW4obGltaXQsIHZlcmlmeSwgZmFsc2UpOwogICAgIH0gZWxzZSBpZiAoc3RvcmVPcmRzKSB7CiAgICAgICAvLyBTdG9yZSBvbmx5IG9yZHMKLSAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgICAgbmV3IFZpc2l0VGVybXM8TG9uZz4oZGlyT3V0LCB3b3Jkc0ZpbGVJbiwgaW5wdXRNb2RlLCBwcnVuZSwgb3V0cHV0cywgZG9QYWNrLCBub0FyY0FycmF5cykgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIExvbmcgZ2V0T3V0cHV0KEludHNSZWYgaW5wdXQsIGludCBvcmQpIHsKQEAgLTY3OCw3ICs2NzcsNyBAQAogICAgICAgfS5ydW4obGltaXQsIHZlcmlmeSwgdHJ1ZSk7CiAgICAgfSBlbHNlIGlmIChzdG9yZURvY0ZyZXFzKSB7CiAgICAgICAvLyBTdG9yZSBvbmx5IGRvY0ZyZXEKLSAgICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbihmYWxzZSk7CisgICAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKICAgICAgIG5ldyBWaXNpdFRlcm1zPExvbmc+KGRpck91dCwgd29yZHNGaWxlSW4sIGlucHV0TW9kZSwgcHJ1bmUsIG91dHB1dHMsIGRvUGFjaywgbm9BcmNBcnJheXMpIHsKICAgICAgICAgUmFuZG9tIHJhbmQ7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzgxLDcgKzc4MCw3IEBACiAgICAgLy8gc21hbGxlciBGU1QgaWYgdGhlIG91dHB1dHMgZ3JvdyBtb25vdG9uaWNhbGx5LiAgQnV0CiAgICAgLy8gaWYgbnVtYmVycyBhcmUgInJhbmRvbSIsIGZhbHNlIHNob3VsZCBnaXZlIHNtYWxsZXIKICAgICAvLyBmaW5hbCBzaXplOgotICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKIAogICAgIC8vIEJ1aWxkIGFuIEZTVCBtYXBwaW5nIEJ5dGVzUmVmIC0+IExvbmcKICAgICBmaW5hbCBCdWlsZGVyPExvbmc+IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxMb25nPihGU1QuSU5QVVRfVFlQRS5CWVRFMSwgb3V0cHV0cyk7CkBAIC0xMTAwLDcgKzEwOTksNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEZpbmFsT3V0cHV0T25FbmRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKIAogICAgIGZpbmFsIEJ1aWxkZXI8TG9uZz4gYnVpbGRlciA9IG5ldyBCdWlsZGVyPExvbmc+KEZTVC5JTlBVVF9UWVBFLkJZVEU0LCAyLCAwLCB0cnVlLCB0cnVlLCBJbnRlZ2VyLk1BWF9WQUxVRSwgb3V0cHV0cywgbnVsbCwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSwgUGFja2VkSW50cy5ERUZBVUxULCB0cnVlLCAxNSk7CiAgICAgYnVpbGRlci5hZGQoVXRpbC50b1VURjMyKCJzdGF0IiwgbmV3IEludHNSZWYoKSksIDE3TCk7CkBAIC0xMTE1LDcgKzExMTQsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEludGVybmFsRmluYWxTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKICAgICBmaW5hbCBib29sZWFuIHdpbGxSZXdyaXRlID0gcmFuZG9tKCkubmV4dEJvb2xlYW4oKTsKICAgICBmaW5hbCBCdWlsZGVyPExvbmc+IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxMb25nPihGU1QuSU5QVVRfVFlQRS5CWVRFMSwgMCwgMCwgdHJ1ZSwgdHJ1ZSwgSW50ZWdlci5NQVhfVkFMVUUsIG91dHB1dHMsIG51bGwsIHdpbGxSZXdyaXRlLCBQYWNrZWRJbnRzLkRFRkFVTFQsIHRydWUsIDE1KTsKICAgICBidWlsZGVyLmFkZChVdGlsLnRvSW50c1JlZihuZXcgQnl0ZXNSZWYoInN0YXQiKSwgbmV3IEludHNSZWYoKSksIG91dHB1dHMuZ2V0Tm9PdXRwdXQoKSk7CkBAIC0xMTM2LDcgKzExMzUsNyBAQAogICAvLyBNYWtlIHN1cmUgcmF3IEZTVCBjYW4gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZpbmFsIHZzCiAgIC8vIG5vbi1maW5hbCBlbmQgbm9kZXMKICAgcHVibGljIHZvaWQgdGVzdE5vbkZpbmFsU3RvcE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgZmluYWwgTG9uZyBub3RoaW5nID0gb3V0cHV0cy5nZXROb091dHB1dCgpOwogICAgIGZpbmFsIEJ1aWxkZXI8TG9uZz4gYiA9IG5ldyBCdWlsZGVyPExvbmc+KEZTVC5JTlBVVF9UWVBFLkJZVEUxLCBvdXRwdXRzKTsKIApAQCAtMTIxNiw3ICsxMjE1LDcgQEAKICAgfTsKIAogICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlc3RQYXRocygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKTsKKyAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKTsKICAgICBmaW5hbCBCdWlsZGVyPExvbmc+IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxMb25nPihGU1QuSU5QVVRfVFlQRS5CWVRFMSwgb3V0cHV0cyk7CiAKICAgICBmaW5hbCBJbnRzUmVmIHNjcmF0Y2ggPSBuZXcgSW50c1JlZigpOwpAQCAtMTI1OCw4ICsxMjU3LDggQEAKICAgcHVibGljIHZvaWQgdGVzdFNob3J0ZXN0UGF0aHNXRlNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICBQYWlyT3V0cHV0czxMb25nLExvbmc+IG91dHB1dHMgPSBuZXcgUGFpck91dHB1dHM8TG9uZyxMb25nPigKLSAgICAgICAgUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKSwgLy8gd2VpZ2h0Ci0gICAgICAgIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSkgIC8vIG91dHB1dAorICAgICAgICBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCksIC8vIHdlaWdodAorICAgICAgICBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCkgIC8vIG91dHB1dAogICAgICk7CiAgICAgCiAgICAgZmluYWwgQnVpbGRlcjxQYWlyPExvbmcsTG9uZz4+IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxQYWlyPExvbmcsTG9uZz4+KEZTVC5JTlBVVF9UWVBFLkJZVEUxLCBvdXRwdXRzKTsKQEAgLTEzMDEsNyArMTMwMCw3IEBACiAgICAgZmluYWwgVHJlZU1hcDxTdHJpbmcsTG9uZz4gc2xvd0NvbXBsZXRvciA9IG5ldyBUcmVlTWFwPFN0cmluZyxMb25nPigpOwogICAgIGZpbmFsIFRyZWVTZXQ8U3RyaW5nPiBhbGxQcmVmaXhlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKICAgICAKLSAgICBmaW5hbCBQb3NpdGl2ZUludE91dHB1dHMgb3V0cHV0cyA9IFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSk7CisgICAgZmluYWwgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCk7CiAgICAgZmluYWwgQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IEJ1aWxkZXI8TG9uZz4oRlNULklOUFVUX1RZUEUuQllURTEsIG91dHB1dHMpOwogICAgIGZpbmFsIEludHNSZWYgc2NyYXRjaCA9IG5ldyBJbnRzUmVmKCk7CiAgICAgCkBAIC0xNDE2LDggKzE0MTUsOCBAQAogICAgIGZpbmFsIFRyZWVTZXQ8U3RyaW5nPiBhbGxQcmVmaXhlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKICAgICAKICAgICBQYWlyT3V0cHV0czxMb25nLExvbmc+IG91dHB1dHMgPSBuZXcgUGFpck91dHB1dHM8TG9uZyxMb25nPigKLSAgICAgICAgUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbih0cnVlKSwgLy8gd2VpZ2h0Ci0gICAgICAgIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSkgIC8vIG91dHB1dAorICAgICAgICBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCksIC8vIHdlaWdodAorICAgICAgICBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCkgIC8vIG91dHB1dAogICAgICk7CiAgICAgZmluYWwgQnVpbGRlcjxQYWlyPExvbmcsTG9uZz4+IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcjxQYWlyPExvbmcsTG9uZz4+KEZTVC5JTlBVVF9UWVBFLkJZVEUxLCBvdXRwdXRzKTsKICAgICBmaW5hbCBJbnRzUmVmIHNjcmF0Y2ggPSBuZXcgSW50c1JlZigpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9qdW5pdGNvbXBhdC9UZXN0RmFpbE9uRmllbGRDYWNoZUluc2FuaXR5LmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2p1bml0Y29tcGF0L1Rlc3RGYWlsT25GaWVsZENhY2hlSW5zYW5pdHkuamF2YQppbmRleCAyMDJlOWZlLi4yMGM4ZTQ3IDEwMDY0NAotLS0gYS9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2p1bml0Y29tcGF0L1Rlc3RGYWlsT25GaWVsZENhY2hlSW5zYW5pdHkuamF2YQorKysgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2p1bml0Y29tcGF0L1Rlc3RGYWlsT25GaWVsZENhY2hlSW5zYW5pdHkuamF2YQpAQCAtNjksNiArNjksNyBAQAogICAgIGZvcihGYWlsdXJlIGYgOiByLmdldEZhaWx1cmVzKCkpIHsKICAgICAgIGlmIChmLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJJbnNhbmUiKSAhPSAtMSkgewogICAgICAgICBpbnNhbmUgPSB0cnVlOworICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5zYW5lKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvanVuaXRjb21wYXQvVGVzdFJlcHJvZHVjZU1lc3NhZ2VXaXRoUmVwZWF0ZWQuamF2YSBiL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvanVuaXRjb21wYXQvVGVzdFJlcHJvZHVjZU1lc3NhZ2VXaXRoUmVwZWF0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA3YzZhCi0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9qdW5pdGNvbXBhdC9UZXN0UmVwcm9kdWNlTWVzc2FnZVdpdGhSZXBlYXRlZC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5qdW5pdGNvbXBhdDsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlOworCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5SZXBlYXQ7CisKKy8qKgorICogVGVzdCByZXByb2R1Y2UgbWVzc2FnZSBpcyByaWdodCB3aXRoIHtAbGluayBSZXBlYXR9IGFubm90YXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UmVwcm9kdWNlTWVzc2FnZVdpdGhSZXBlYXRlZCBleHRlbmRzIFdpdGhOZXN0ZWRUZXN0cyB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmVzdGVkIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRUZXN0IHsKKyAgICBAVGVzdAorICAgIEBSZXBlYXQoaXRlcmF0aW9ucyA9IDEwKQorICAgIHB1YmxpYyB2b2lkIHRlc3RNZSgpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJiYWQiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVGVzdFJlcHJvZHVjZU1lc3NhZ2VXaXRoUmVwZWF0ZWQoKSB7CisgICAgc3VwZXIodHJ1ZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAorICAgIFN0cmluZyBzeXNlcnIgPSBydW5BbmRSZXR1cm5TeXNlcnIoKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzeXNlcnIuY29udGFpbnMoIiAtRHRlc3RzLm1ldGhvZD10ZXN0TWUgIikpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcnVuQW5kUmV0dXJuU3lzZXJyKCkgeworICAgIEpVbml0Q29yZS5ydW5DbGFzc2VzKE5lc3RlZC5jbGFzcyk7CisgICAgU3RyaW5nIGVyciA9IGdldFN5c0VycigpOworICAgIHJldHVybiBlcnI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL1Rlc3RQYWNrZWRJbnRzLmphdmEgYi9sdWNlbmUvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL3BhY2tlZC9UZXN0UGFja2VkSW50cy5qYXZhCmluZGV4IDEwZTdiMDEuLmM2MGNlMTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvcGFja2VkL1Rlc3RQYWNrZWRJbnRzLmphdmEKKysrIGIvbHVjZW5lL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9wYWNrZWQvVGVzdFBhY2tlZEludHMuamF2YQpAQCAtNjUwLDEzICs2NTAsMTMzIEBACiAgICAgd3J0LnNldCg5OSwgKDEgPDwgMjMpIC0gMSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEgPDwgMTAsIHdydC5nZXQodmFsdWVDb3VudCAtIDEpKTsKICAgICB3cnQuc2V0KDEsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICB3cnQuc2V0KDIsIC0zKTsKKyAgICBhc3NlcnRFcXVhbHMoNjQsIHdydC5nZXRCaXRzUGVyVmFsdWUoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEgPDwgMTAsIHdydC5nZXQodmFsdWVDb3VudCAtIDEpKTsKICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NQVhfVkFMVUUsIHdydC5nZXQoMSkpOworICAgIGFzc2VydEVxdWFscygtM0wsIHdydC5nZXQoMikpOwogICAgIGFzc2VydEVxdWFscygyLCB3cnQuZ2V0KDQpKTsKICAgICBhc3NlcnRFcXVhbHMoKDEgPDwgMjMpIC0gMSwgd3J0LmdldCg5OSkpOwogICAgIGFzc2VydEVxdWFscygxMCwgd3J0LmdldCg3KSk7CiAgICAgYXNzZXJ0RXF1YWxzKDk5LCB3cnQuZ2V0KHZhbHVlQ291bnQgLSAxMCkpOwogICAgIGFzc2VydEVxdWFscygxIDw8IDEwLCB3cnQuZ2V0KHZhbHVlQ291bnQgLSAxKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJhbVVzYWdlRXN0aW1hdG9yLnNpemVPZih3cnQpLCB3cnQucmFtQnl0ZXNVc2VkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhZ2VkR3Jvd2FibGVXcml0ZXIoKSB7CisgICAgaW50IHBhZ2VTaXplID0gMSA8PCAoX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDYsIDMwKSk7CisgICAgLy8gc3VwcG9ydHMgMCB2YWx1ZXM/CisgICAgUGFnZWRHcm93YWJsZVdyaXRlciB3cml0ZXIgPSBuZXcgUGFnZWRHcm93YWJsZVdyaXRlcigwLCBwYWdlU2l6ZSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDY0KSwgcmFuZG9tKCkubmV4dEZsb2F0KCkpOworICAgIGFzc2VydEVxdWFscygwLCB3cml0ZXIuc2l6ZSgpKTsKKworICAgIC8vIGNvbXBhcmUgYWdhaW5zdCBBcHBlbmRpbmdMb25nQnVmZmVyCisgICAgQXBwZW5kaW5nTG9uZ0J1ZmZlciBidWYgPSBuZXcgQXBwZW5kaW5nTG9uZ0J1ZmZlcigpOworICAgIGludCBzaXplID0gcmFuZG9tKCkubmV4dEludCgxMDAwMDAwKTsKKyAgICBsb25nIG1heCA9IDU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIGJ1Zi5hZGQoX1Rlc3RVdGlsLm5leHRMb25nKHJhbmRvbSgpLCAwLCBtYXgpKTsKKyAgICAgIGlmIChyYXJlbHkoKSkgeworICAgICAgICBtYXggPSBQYWNrZWRJbnRzLm1heFZhbHVlKHJhcmVseSgpID8gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDAsIDYzKSA6IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAwLCAzMSkpOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZXIgPSBuZXcgUGFnZWRHcm93YWJsZVdyaXRlcihzaXplLCBwYWdlU2l6ZSwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDY0KSwgcmFuZG9tKCkubmV4dEZsb2F0KCkpOworICAgIGFzc2VydEVxdWFscyhzaXplLCB3cml0ZXIuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICB3cml0ZXIuc2V0KGksIGJ1Zi5nZXQoaSkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5nZXQoaSksIHdyaXRlci5nZXQoaSkpOworICAgIH0KKworICAgIC8vIHRlc3QgcmFtQnl0ZXNVc2VkCisgICAgYXNzZXJ0RXF1YWxzKFJhbVVzYWdlRXN0aW1hdG9yLnNpemVPZih3cml0ZXIpLCB3cml0ZXIucmFtQnl0ZXNVc2VkKCksIDgpOworCisgICAgLy8gdGVzdCBjb3B5CisgICAgUGFnZWRHcm93YWJsZVdyaXRlciBjb3B5ID0gd3JpdGVyLnJlc2l6ZShfVGVzdFV0aWwubmV4dExvbmcocmFuZG9tKCksIHdyaXRlci5zaXplKCkgLyAyLCB3cml0ZXIuc2l6ZSgpICogMyAvIDIpKTsKKyAgICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBjb3B5LnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoaSA8IHdyaXRlci5zaXplKCkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHdyaXRlci5nZXQoaSksIGNvcHkuZ2V0KGkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjb3B5LmdldChpKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gdGVzdCBncm93CisgICAgUGFnZWRHcm93YWJsZVdyaXRlciBncm93ID0gd3JpdGVyLmdyb3coX1Rlc3RVdGlsLm5leHRMb25nKHJhbmRvbSgpLCB3cml0ZXIuc2l6ZSgpIC8gMiwgd3JpdGVyLnNpemUoKSAqIDMgLyAyKSk7CisgICAgZm9yIChsb25nIGkgPSAwOyBpIDwgZ3Jvdy5zaXplKCk7ICsraSkgeworICAgICAgaWYgKGkgPCB3cml0ZXIuc2l6ZSgpKSB7CisgICAgICAgIGFzc2VydEVxdWFscyh3cml0ZXIuZ2V0KGkpLCBncm93LmdldChpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZ3Jvdy5nZXQoaSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYWdlZE11dGFibGUoKSB7CisgICAgZmluYWwgaW50IGJpdHNQZXJWYWx1ZSA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmRvbSgpLCAxLCA2NCk7CisgICAgZmluYWwgbG9uZyBtYXggPSBQYWNrZWRJbnRzLm1heFZhbHVlKGJpdHNQZXJWYWx1ZSk7CisgICAgaW50IHBhZ2VTaXplID0gMSA8PCAoX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDYsIDMwKSk7CisgICAgLy8gc3VwcG9ydHMgMCB2YWx1ZXM/CisgICAgUGFnZWRNdXRhYmxlIHdyaXRlciA9IG5ldyBQYWdlZE11dGFibGUoMCwgcGFnZVNpemUsIGJpdHNQZXJWYWx1ZSwgcmFuZG9tKCkubmV4dEZsb2F0KCkgLyAyKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgd3JpdGVyLnNpemUoKSk7CisKKyAgICAvLyBjb21wYXJlIGFnYWluc3QgQXBwZW5kaW5nTG9uZ0J1ZmZlcgorICAgIEFwcGVuZGluZ0xvbmdCdWZmZXIgYnVmID0gbmV3IEFwcGVuZGluZ0xvbmdCdWZmZXIoKTsKKyAgICBpbnQgc2l6ZSA9IHJhbmRvbSgpLm5leHRJbnQoMTAwMDAwMCk7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIGJ1Zi5hZGQoYml0c1BlclZhbHVlID09IDY0ID8gcmFuZG9tKCkubmV4dExvbmcoKSA6IF9UZXN0VXRpbC5uZXh0TG9uZyhyYW5kb20oKSwgMCwgbWF4KSk7CisgICAgfQorICAgIHdyaXRlciA9IG5ldyBQYWdlZE11dGFibGUoc2l6ZSwgcGFnZVNpemUsIGJpdHNQZXJWYWx1ZSwgcmFuZG9tKCkubmV4dEZsb2F0KCkpOworICAgIGFzc2VydEVxdWFscyhzaXplLCB3cml0ZXIuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICB3cml0ZXIuc2V0KGksIGJ1Zi5nZXQoaSkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5nZXQoaSksIHdyaXRlci5nZXQoaSkpOworICAgIH0KKworICAgIC8vIHRlc3QgcmFtQnl0ZXNVc2VkCisgICAgYXNzZXJ0RXF1YWxzKFJhbVVzYWdlRXN0aW1hdG9yLnNpemVPZih3cml0ZXIpIC0gUmFtVXNhZ2VFc3RpbWF0b3Iuc2l6ZU9mKHdyaXRlci5mb3JtYXQpLCB3cml0ZXIucmFtQnl0ZXNVc2VkKCkpOworCisgICAgLy8gdGVzdCBjb3B5CisgICAgUGFnZWRNdXRhYmxlIGNvcHkgPSB3cml0ZXIucmVzaXplKF9UZXN0VXRpbC5uZXh0TG9uZyhyYW5kb20oKSwgd3JpdGVyLnNpemUoKSAvIDIsIHdyaXRlci5zaXplKCkgKiAzIC8gMikpOworICAgIGZvciAobG9uZyBpID0gMDsgaSA8IGNvcHkuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChpIDwgd3JpdGVyLnNpemUoKSkgeworICAgICAgICBhc3NlcnRFcXVhbHMod3JpdGVyLmdldChpKSwgY29weS5nZXQoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvcHkuZ2V0KGkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZXN0IGdyb3cKKyAgICBQYWdlZE11dGFibGUgZ3JvdyA9IHdyaXRlci5ncm93KF9UZXN0VXRpbC5uZXh0TG9uZyhyYW5kb20oKSwgd3JpdGVyLnNpemUoKSAvIDIsIHdyaXRlci5zaXplKCkgKiAzIC8gMikpOworICAgIGZvciAobG9uZyBpID0gMDsgaSA8IGdyb3cuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChpIDwgd3JpdGVyLnNpemUoKSkgeworICAgICAgICBhc3NlcnRFcXVhbHMod3JpdGVyLmdldChpKSwgZ3Jvdy5nZXQoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdyb3cuZ2V0KGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBtZW1vcnkgaG9sZQorICBASWdub3JlCisgIHB1YmxpYyB2b2lkIHRlc3RQYWdlZEdyb3dhYmxlV3JpdGVyT3ZlcmZsb3coKSB7CisgICAgZmluYWwgbG9uZyBzaXplID0gX1Rlc3RVdGlsLm5leHRMb25nKHJhbmRvbSgpLCAyICogKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFLCAzICogKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICBmaW5hbCBpbnQgcGFnZVNpemUgPSAxIDw8IChfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMTYsIDMwKSk7CisgICAgZmluYWwgUGFnZWRHcm93YWJsZVdyaXRlciB3cml0ZXIgPSBuZXcgUGFnZWRHcm93YWJsZVdyaXRlcihzaXplLCBwYWdlU2l6ZSwgMSwgcmFuZG9tKCkubmV4dEZsb2F0KCkpOworICAgIGZpbmFsIGxvbmcgaW5kZXggPSBfVGVzdFV0aWwubmV4dExvbmcocmFuZG9tKCksIChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSwgc2l6ZSAtIDEpOworICAgIHdyaXRlci5zZXQoaW5kZXgsIDIpOworICAgIGFzc2VydEVxdWFscygyLCB3cml0ZXIuZ2V0KGluZGV4KSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIHsKKyAgICAgIGZpbmFsIGxvbmcgaWR4ID0gX1Rlc3RVdGlsLm5leHRMb25nKHJhbmRvbSgpLCAwLCBzaXplKTsKKyAgICAgIGlmIChpZHggPT0gaW5kZXgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHdyaXRlci5nZXQoaWR4KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgd3JpdGVyLmdldChpZHgpKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC04MDgsMTMgKzkyOCwxNSBAQAogICAgIGZpbmFsIGxvbmdbXSBhcnIgPSBuZXcgbG9uZ1tSYW5kb21JbnRzLnJhbmRvbUludEJldHdlZW4ocmFuZG9tKCksIDEsIDEwMDAwMDApXTsKICAgICBmb3IgKGludCBicHYgOiBuZXcgaW50W10gezAsIDEsIDYzLCA2NCwgUmFuZG9tSW50cy5yYW5kb21JbnRCZXR3ZWVuKHJhbmRvbSgpLCAyLCA2Mil9KSB7CiAgICAgICBmb3IgKGJvb2xlYW4gbW9ub3RvbmljIDogbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgIGZpbmFsIGludCBwYWdlU2l6ZSA9IDEgPDwgX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDYsIDIwKTsKKyAgICAgICAgZmluYWwgaW50IGluaXRpYWxQYWdlQ291bnQgPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgMCwgMTYpOwogICAgICAgICBBYnN0cmFjdEFwcGVuZGluZ0xvbmdCdWZmZXIgYnVmOwogICAgICAgICBmaW5hbCBpbnQgaW5jOwogICAgICAgICBpZiAobW9ub3RvbmljKSB7Ci0gICAgICAgICAgYnVmID0gbmV3IE1vbm90b25pY0FwcGVuZGluZ0xvbmdCdWZmZXIoKTsKKyAgICAgICAgICBidWYgPSBuZXcgTW9ub3RvbmljQXBwZW5kaW5nTG9uZ0J1ZmZlcihpbml0aWFsUGFnZUNvdW50LCBwYWdlU2l6ZSk7CiAgICAgICAgICAgaW5jID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIC0xMDAwLCAxMDAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYgPSBuZXcgQXBwZW5kaW5nTG9uZ0J1ZmZlcigpOworICAgICAgICAgIGJ1ZiA9IG5ldyBBcHBlbmRpbmdMb25nQnVmZmVyKGluaXRpYWxQYWdlQ291bnQsIHBhZ2VTaXplKTsKICAgICAgICAgICBpbmMgPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChicHYgPT0gMCkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2RlbW8vYnVpbGQueG1sIGIvbHVjZW5lL2RlbW8vYnVpbGQueG1sCmluZGV4IGIxY2Q0YjQuLjA3NDYwMWEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9kZW1vL2J1aWxkLnhtbAorKysgYi9sdWNlbmUvZGVtby9idWlsZC54bWwKQEAgLTU4LDcgKzU4LDcgQEAKICAgICA8ZWNobz5Db21waWxpbmcgWE1MIFF1ZXJ5UGFyc2VyIERlbW8gV0FSPC9lY2hvPgogCiAgICAgPHdhciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L2x1Y2VuZS14bWwtcXVlcnktZGVtby53YXIiIHdlYnhtbD0ic3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL2x1Y2VuZS9kZW1vL3htbHBhcnNlci9XRUItSU5GL3dlYi54bWwiPgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvcmVzb3VyY2VzL29yZy9hcGFjaGUvbHVjZW5lL2RlbW8veG1scGFyc2VyLyIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Jlc291cmNlcy5kaXJ9L29yZy9hcGFjaGUvbHVjZW5lL2RlbW8veG1scGFyc2VyLyIvPgogICAgICAgPGxpYiBkaXI9IiR7YnVpbGQuZGlyfSI+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZmluYWwubmFtZX0uamFyIi8+CiAgICAgICA8L2xpYj4KZGlmZiAtLWdpdCBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9yYW5nZS9SYW5nZUFjY3VtdWxhdG9yLmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvcmFuZ2UvUmFuZ2VBY2N1bXVsYXRvci5qYXZhCmluZGV4IDVjZGYzM2UuLmZmZmNiNzcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9yYW5nZS9SYW5nZUFjY3VtdWxhdG9yLmphdmEKKysrIGIvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3JhbmdlL1JhbmdlQWNjdW11bGF0b3IuamF2YQpAQCAtOTUsNiArOTUsMTAgQEAKICAgICAgICAgaW50IGRvYyA9IDA7CiAgICAgICAgIHdoaWxlIChkb2MgPCBsZW5ndGggJiYgKGRvYyA9IGhpdHMuYml0cy5uZXh0U2V0Qml0KGRvYykpICE9IC0xKSB7CiAgICAgICAgICAgbG9uZyB2ID0gbmR2LmdldChkb2MpOworICAgICAgICAgIC8vIFRPRE86IGlmIGFsbCByYW5nZXMgYXJlIG5vbi1vdmVybGFwcGluZywgd2UKKyAgICAgICAgICAvLyBzaG91bGQgaW5zdGVhZCBkbyBhIGJpbi1zZWFyY2ggdXAgZnJvbnQKKyAgICAgICAgICAvLyAocmVhbGx5LCBhIHNwZWNpYWxpemVkIGNhc2Ugb2YgdGhlIGludGVydmFsCisgICAgICAgICAgLy8gdHJlZSkKICAgICAgICAgICAvLyBUT0RPOiB1c2UgaW50ZXJ2YWwgdHJlZSBpbnN0ZWFkIG9mIGxpbmVhciBzZWFyY2g6CiAgICAgICAgICAgZm9yKGludCBqPTA7ajxyYW5nZXMucmFuZ2VzLmxlbmd0aDtqKyspIHsKICAgICAgICAgICAgIGlmIChyYW5nZXMucmFuZ2VzW2pdLmFjY2VwdCh2KSkgewpkaWZmIC0tZ2l0IGEvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3NlYXJjaC9EcmlsbFNpZGV3YXlzLmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXMuamF2YQppbmRleCBjNDA5MTgwLi5mMzMxOGVkIDEwMDY0NAotLS0gYS9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXMuamF2YQorKysgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXMuamF2YQpAQCAtMjA4LDkgKzIwOCw5IEBACiAgICAgICAgICAgcmVxdWVzdHMuYWRkKGZyKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgaWYgKHJlcXVlc3RzLmlzRW1wdHkoKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VsZCBub3QgZmluZCBGYWNldFJlcXVlc3QgZm9yIGRyaWxsLXNpZGV3YXlzIGRpbWVuc2lvbiBcIiIgKyBkaW0gKyAiXCIiKTsKLSAgICAgIH0KKyAgICAgIC8vIFdlIGFscmVhZHkgbW92ZWQgYWxsIGRyaWxsLWRvd25zIHRoYXQgZGlkbid0IGhhdmUgYQorICAgICAgLy8gRmFjZXRSZXF1ZXN0LCBpbiBtb3ZlRHJpbGxEb3duT25seUNsYXVzZXMgYWJvdmU6CisgICAgICBhc3NlcnQgIXJlcXVlc3RzLmlzRW1wdHkoKTsKICAgICAgIGRyaWxsU2lkZXdheXNDb2xsZWN0b3JzW2lkeCsrXSA9IEZhY2V0c0NvbGxlY3Rvci5jcmVhdGUoZ2V0RHJpbGxTaWRld2F5c0FjY3VtdWxhdG9yKGRpbSwgbmV3IEZhY2V0U2VhcmNoUGFyYW1zKGZzcC5pbmRleGluZ1BhcmFtcywgcmVxdWVzdHMpKSk7CiAgICAgfQogCkBAIC00MDIsOCArNDAyLDEzIEBACiAgICAgICBxdWVyeSA9IG5ldyBEcmlsbERvd25RdWVyeShmaWx0ZXIsIHF1ZXJ5KTsKICAgICB9CiAgICAgaWYgKHNvcnQgIT0gbnVsbCkgeworICAgICAgaW50IGxpbWl0ID0gc2VhcmNoZXIuZ2V0SW5kZXhSZWFkZXIoKS5tYXhEb2MoKTsKKyAgICAgIGlmIChsaW1pdCA9PSAwKSB7CisgICAgICAgIGxpbWl0ID0gMTsgLy8gdGhlIGNvbGxlY3RvciBkb2VzIG5vdCBhbG93IG51bUhpdHMgPSAwCisgICAgICB9CisgICAgICB0b3BOID0gTWF0aC5taW4odG9wTiwgbGltaXQpOwogICAgICAgZmluYWwgVG9wRmllbGRDb2xsZWN0b3IgaGl0Q29sbGVjdG9yID0gVG9wRmllbGRDb2xsZWN0b3IuY3JlYXRlKHNvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4odG9wTiwgc2VhcmNoZXIuZ2V0SW5kZXhSZWFkZXIoKS5tYXhEb2MoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRG9jU2NvcmVzLApAQCAtNDIyLDcgKzQyNywxMiBAQAogICAgKi8KICAgcHVibGljIERyaWxsU2lkZXdheXNSZXN1bHQgc2VhcmNoKFNjb3JlRG9jIGFmdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpbGxEb3duUXVlcnkgcXVlcnksIGludCB0b3BOLCBGYWNldFNlYXJjaFBhcmFtcyBmc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgVG9wU2NvcmVEb2NDb2xsZWN0b3IgaGl0Q29sbGVjdG9yID0gVG9wU2NvcmVEb2NDb2xsZWN0b3IuY3JlYXRlKE1hdGgubWluKHRvcE4sIHNlYXJjaGVyLmdldEluZGV4UmVhZGVyKCkubWF4RG9jKCkpLCBhZnRlciwgdHJ1ZSk7CisgICAgaW50IGxpbWl0ID0gc2VhcmNoZXIuZ2V0SW5kZXhSZWFkZXIoKS5tYXhEb2MoKTsKKyAgICBpZiAobGltaXQgPT0gMCkgeworICAgICAgbGltaXQgPSAxOyAvLyB0aGUgY29sbGVjdG9yIGRvZXMgbm90IGFsb3cgbnVtSGl0cyA9IDAKKyAgICB9CisgICAgdG9wTiA9IE1hdGgubWluKHRvcE4sIGxpbWl0KTsKKyAgICBUb3BTY29yZURvY0NvbGxlY3RvciBoaXRDb2xsZWN0b3IgPSBUb3BTY29yZURvY0NvbGxlY3Rvci5jcmVhdGUodG9wTiwgYWZ0ZXIsIHRydWUpOwogICAgIERyaWxsU2lkZXdheXNSZXN1bHQgciA9IHNlYXJjaChxdWVyeSwgaGl0Q29sbGVjdG9yLCBmc3ApOwogICAgIHJldHVybiBuZXcgRHJpbGxTaWRld2F5c1Jlc3VsdChyLmZhY2V0UmVzdWx0cywgaGl0Q29sbGVjdG9yLnRvcERvY3MoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9zZWFyY2gvRHJpbGxTaWRld2F5c1F1ZXJ5LmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXNRdWVyeS5qYXZhCmluZGV4IGFmYTA5MDYuLmZkNWQxNjAgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9zZWFyY2gvRHJpbGxTaWRld2F5c1F1ZXJ5LmphdmEKKysrIGIvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3NlYXJjaC9EcmlsbFNpZGV3YXlzUXVlcnkuamF2YQpAQCAtMTE5LDE3ICsxMTksMTkgQEAKICAgICAgICAgICAgIFRlcm1zIHRlcm1zID0gcmVhZGVyLnRlcm1zKGZpZWxkKTsKICAgICAgICAgICAgIGlmICh0ZXJtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgIHRlcm1zRW51bSA9IHRlcm1zLml0ZXJhdG9yKG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGVybXNFbnVtID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxhc3RGaWVsZCA9IGZpZWxkOwogICAgICAgICAgIH0KKyAgICAgICAgICBkaW1zW2RpbV0uZG9jc0VudW1zID0gbmV3IERvY3NFbnVtW2RyaWxsRG93blRlcm1zW2RpbV0ubGVuZ3RoXTsKICAgICAgICAgICBpZiAodGVybXNFbnVtID09IG51bGwpIHsKICAgICAgICAgICAgIG51bGxDb3VudCsrOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQotICAgICAgICAgIGRpbXNbZGltXS5kb2NzRW51bXMgPSBuZXcgRG9jc0VudW1bZHJpbGxEb3duVGVybXNbZGltXS5sZW5ndGhdOwogICAgICAgICAgIGZvcihpbnQgaT0wO2k8ZHJpbGxEb3duVGVybXNbZGltXS5sZW5ndGg7aSsrKSB7CiAgICAgICAgICAgICBpZiAodGVybXNFbnVtLnNlZWtFeGFjdChkcmlsbERvd25UZXJtc1tkaW1dW2ldLmJ5dGVzKCksIGZhbHNlKSkgewotICAgICAgICAgICAgICBEb2NzRW51bSBkb2NzRW51bSA9IHRlcm1zRW51bS5kb2NzKG51bGwsIG51bGwpOworICAgICAgICAgICAgICBEb2NzRW51bSBkb2NzRW51bSA9IHRlcm1zRW51bS5kb2NzKG51bGwsIG51bGwsIDApOwogICAgICAgICAgICAgICBpZiAoZG9jc0VudW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGRpbXNbZGltXS5kb2NzRW51bXNbaV0gPSBkb2NzRW51bTsKICAgICAgICAgICAgICAgICBkaW1zW2RpbV0ubWF4Q29zdCA9IE1hdGgubWF4KGRpbXNbZGltXS5tYXhDb3N0LCBkb2NzRW51bS5jb3N0KCkpOwpAQCAtMTM4LDcgKzE0MCw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG51bGxDb3VudCA+IDEpIHsKKyAgICAgICAgaWYgKG51bGxDb3VudCA+IDEgfHwgKG51bGxDb3VudCA9PSAxICYmIGRpbXMubGVuZ3RoID09IDEpKSB7CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3NlYXJjaC9EcmlsbFNpZGV3YXlzU2NvcmVyLmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXNTY29yZXIuamF2YQppbmRleCA1ZGIyOGYyLi40MmY1MzkwIDEwMDY0NAotLS0gYS9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXNTY29yZXIuamF2YQorKysgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL0RyaWxsU2lkZXdheXNTY29yZXIuamF2YQpAQCAtODAsNyArODAsNyBAQAogICAgIC8vIFBvc2l0aW9uIGFsbCBzY29yZXJzIHRvIHRoZWlyIGZpcnN0IG1hdGNoaW5nIGRvYzoKICAgICBiYXNlU2NvcmVyLm5leHREb2MoKTsKICAgICBmb3IoRG9jc0VudW1zQW5kRnJlcSBkaW0gOiBkaW1zKSB7Ci0gICAgICBmb3IoRG9jc0VudW0gZG9jc0VudW0gOiBkaW0uZG9jc0VudW1zKSB7CisgICAgICBmb3IgKERvY3NFbnVtIGRvY3NFbnVtIDogZGltLmRvY3NFbnVtcykgewogICAgICAgICBpZiAoZG9jc0VudW0gIT0gbnVsbCkgewogICAgICAgICAgIGRvY3NFbnVtLm5leHREb2MoKTsKICAgICAgICAgfQpAQCAtOTUsNyArOTUsNyBAQAogICAgIGZvcihpbnQgZGltPTA7ZGltPG51bURpbXM7ZGltKyspIHsKICAgICAgIGRvY3NFbnVtc1tkaW1dID0gZGltc1tkaW1dLmRvY3NFbnVtczsKICAgICAgIHNpZGV3YXlzQ29sbGVjdG9yc1tkaW1dID0gZGltc1tkaW1dLnNpZGV3YXlzQ29sbGVjdG9yOwotICAgICAgZm9yKERvY3NFbnVtIGRlIDogZGltc1tkaW1dLmRvY3NFbnVtcykgeworICAgICAgZm9yIChEb2NzRW51bSBkZSA6IGRpbXNbZGltXS5kb2NzRW51bXMpIHsKICAgICAgICAgaWYgKGRlICE9IG51bGwpIHsKICAgICAgICAgICBkcmlsbERvd25Db3N0ICs9IGRlLmNvc3QoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L0NhdGVnb3J5UGF0aC5qYXZhIGIvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L0NhdGVnb3J5UGF0aC5qYXZhCmluZGV4IGQzMTU1NmUuLjdmZTM2NTAgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC90YXhvbm9teS9DYXRlZ29yeVBhdGguamF2YQorKysgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvdGF4b25vbXkvQ2F0ZWdvcnlQYXRoLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlQmxvY2tQb29sLkJZVEVfQkxPQ0tfU0laRTsKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKQEAgLTI4LDYgKzMwLDE4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDYXRlZ29yeVBhdGggaW1wbGVtZW50cyBDb21wYXJhYmxlPENhdGVnb3J5UGF0aD4gewogCisgIC8qCisgICAqIGNvcGllZCBmcm9tIERvY3VtZW50V3JpdGVyUGVyVGhyZWFkIC0tIGlmIGEgQ2F0ZWdvcnlQYXRoIGlzIHJlc29sdmVkIHRvIGEKKyAgICogZHJpbGwtZG93biB0ZXJtIHdoaWNoIGlzIGVuY29kZWQgdG8gYSBsYXJnZXIgdGVybSB0aGFuIHRoYXQgbGVuZ3RoLCBpdCBpcworICAgKiBzaWxlbnRseSBkcm9wcGVkISBUaGVyZWZvcmUgd2UgbGltaXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIE1BWC80IHRvCisgICAqIGJlIG9uIHRoZSBzYWZlIHNpZGUuCisgICAqLworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYSB7QGxpbmsgQ2F0ZWdvcnlQYXRofSBjYW4gaGF2ZS4gVGhhdCBpcworICAgKiB7QGxpbmsgQ2F0ZWdvcnlQYXRoI3RvU3RyaW5nKGNoYXIpfSBsZW5ndGggbXVzdCBub3QgZXhjZWVkIHRoYXQgbGltaXQuCisgICAqLworICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNQVhfQ0FURUdPUllfUEFUSF9MRU5HVEggPSAoQllURV9CTE9DS19TSVpFIC0gMikgLyA0OworCiAgIC8qKiBBbiBlbXB0eSB7QGxpbmsgQ2F0ZWdvcnlQYXRofSAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIENhdGVnb3J5UGF0aCBFTVBUWSA9IG5ldyBDYXRlZ29yeVBhdGgoKTsKIApAQCAtNjMsMTAgKzc3LDE4IEBACiAgIC8qKiBDb25zdHJ1Y3QgZnJvbSB0aGUgZ2l2ZW4gcGF0aCBjb21wb25lbnRzLiAqLwogICBwdWJsaWMgQ2F0ZWdvcnlQYXRoKGZpbmFsIFN0cmluZy4uLiBjb21wb25lbnRzKSB7CiAgICAgYXNzZXJ0IGNvbXBvbmVudHMubGVuZ3RoID4gMCA6ICJ1c2UgQ2F0ZWdvcnlQYXRoLkVNUFRZIHRvIGNyZWF0ZSBhbiBlbXB0eSBwYXRoIjsKKyAgICBsb25nIGxlbiA9IDA7CiAgICAgZm9yIChTdHJpbmcgY29tcCA6IGNvbXBvbmVudHMpIHsKICAgICAgIGlmIChjb21wID09IG51bGwgfHwgY29tcC5pc0VtcHR5KCkpIHsKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgb3IgbnVsbCBjb21wb25lbnRzIG5vdCBhbGxvd2VkOiAiICsgQXJyYXlzLnRvU3RyaW5nKGNvbXBvbmVudHMpKTsKICAgICAgIH0KKyAgICAgIGxlbiArPSBjb21wLmxlbmd0aCgpOworICAgIH0KKyAgICBsZW4gKz0gY29tcG9uZW50cy5sZW5ndGggLSAxOyAvLyBhZGQgc2VwYXJhdG9ycworICAgIGlmIChsZW4gPiBNQVhfQ0FURUdPUllfUEFUSF9MRU5HVEgpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IHBhdGggZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgcGF0aCBsZW5ndGg6IG1heD0iCisgICAgICAgICAgKyBNQVhfQ0FURUdPUllfUEFUSF9MRU5HVEggKyAiIGxlbj0iICsgbGVuCisgICAgICAgICAgKyAiIHBhdGg9IiArIEFycmF5cy50b1N0cmluZyhjb21wb25lbnRzKS5zdWJzdHJpbmcoMCwgMzApICsgIi4uLiIpOwogICAgIH0KICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzOwogICAgIGxlbmd0aCA9IGNvbXBvbmVudHMubGVuZ3RoOwpAQCAtNzQsNiArOTYsMTIgQEAKIAogICAvKiogQ29uc3RydWN0IGZyb20gYSBnaXZlbiBwYXRoLCBzZXBhcmF0aW5nIHBhdGggY29tcG9uZW50cyB3aXRoIHtAY29kZSBkZWxpbWl0ZXJ9LiAqLwogICBwdWJsaWMgQ2F0ZWdvcnlQYXRoKGZpbmFsIFN0cmluZyBwYXRoU3RyaW5nLCBmaW5hbCBjaGFyIGRlbGltaXRlcikgeworICAgIGlmIChwYXRoU3RyaW5nLmxlbmd0aCgpID4gTUFYX0NBVEVHT1JZX1BBVEhfTEVOR1RIKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHBhdGggbGVuZ3RoOiBtYXg9IgorICAgICAgICAgICAgICArIE1BWF9DQVRFR09SWV9QQVRIX0xFTkdUSCArICIgbGVuPSIgKyBwYXRoU3RyaW5nLmxlbmd0aCgpCisgICAgICAgICAgICAgICsgIiBwYXRoPSIgKyBwYXRoU3RyaW5nLnN1YnN0cmluZygwLCAzMCkgKyAiLi4uIik7CisgICAgfQorCiAgICAgU3RyaW5nW10gY29tcHMgPSBwYXRoU3RyaW5nLnNwbGl0KFBhdHRlcm4ucXVvdGUoQ2hhcmFjdGVyLnRvU3RyaW5nKGRlbGltaXRlcikpKTsKICAgICBpZiAoY29tcHMubGVuZ3RoID09IDEgJiYgY29tcHNbMF0uaXNFbXB0eSgpKSB7CiAgICAgICBjb21wb25lbnRzID0gbnVsbDsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC90YXhvbm9teS93cml0ZXJjYWNoZS9jbDJvL0NhdGVnb3J5UGF0aFV0aWxzLmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvdGF4b25vbXkvd3JpdGVyY2FjaGUvY2wyby9DYXRlZ29yeVBhdGhVdGlscy5qYXZhCmluZGV4IDJjZWZmNGMuLmYxZDJlOTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9mYWNldC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC90YXhvbm9teS93cml0ZXJjYWNoZS9jbDJvL0NhdGVnb3J5UGF0aFV0aWxzLmphdmEKKysrIGIvbHVjZW5lL2ZhY2V0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L3dyaXRlcmNhY2hlL2NsMm8vQ2F0ZWdvcnlQYXRoVXRpbHMuamF2YQpAQCAtMzksMTQgKzM5LDE0IEBACiAgICAqIHtAbGluayAjc2VyaWFsaXplKENhdGVnb3J5UGF0aCwgQ2hhckJsb2NrQXJyYXkpfS4KICAgICovCiAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlT2ZTZXJpYWxpemVkKENoYXJCbG9ja0FycmF5IGNoYXJCbG9ja0FycmF5LCBpbnQgb2Zmc2V0KSB7Ci0gICAgaW50IGxlbmd0aCA9IChzaG9ydCkgY2hhckJsb2NrQXJyYXkuY2hhckF0KG9mZnNldCsrKTsKKyAgICBpbnQgbGVuZ3RoID0gY2hhckJsb2NrQXJyYXkuY2hhckF0KG9mZnNldCsrKTsKICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAKICAgICBpbnQgaGFzaCA9IGxlbmd0aDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnQgbGVuID0gKHNob3J0KSBjaGFyQmxvY2tBcnJheS5jaGFyQXQob2Zmc2V0KyspOworICAgICAgaW50IGxlbiA9IGNoYXJCbG9ja0FycmF5LmNoYXJBdChvZmZzZXQrKyk7CiAgICAgICBoYXNoID0gaGFzaCAqIDMxICsgY2hhckJsb2NrQXJyYXkuc3ViU2VxdWVuY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW4pLmhhc2hDb2RlKCk7CiAgICAgICBvZmZzZXQgKz0gbGVuOwogICAgIH0KQEAgLTY3LDcgKzY3LDcgQEAKICAgICB9CiAgICAgCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGxlbiA9IChzaG9ydCkgY2hhckJsb2NrQXJyYXkuY2hhckF0KG9mZnNldCsrKTsKKyAgICAgIGludCBsZW4gPSBjaGFyQmxvY2tBcnJheS5jaGFyQXQob2Zmc2V0KyspOwogICAgICAgaWYgKGxlbiAhPSBjcC5jb21wb25lbnRzW2ldLmxlbmd0aCgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9mYWNldC9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Db2RlYyBiL2x1Y2VuZS9mYWNldC9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Db2RlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNiNGNkCi0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2ZhY2V0L3NyYy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkNvZGVjCkBAIC0wLDAgKzEsMTYgQEAKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK29yZy5hcGFjaGUubHVjZW5lLmZhY2V0LmNvZGVjcy5mYWNldDQyLkZhY2V0NDJDb2RlYwpkaWZmIC0tZ2l0IGEvbHVjZW5lL2ZhY2V0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L2NvbXBsZW1lbnRzL1Rlc3RGYWNldHNBY2N1bXVsYXRvcldpdGhDb21wbGVtZW50LmphdmEgYi9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvY29tcGxlbWVudHMvVGVzdEZhY2V0c0FjY3VtdWxhdG9yV2l0aENvbXBsZW1lbnQuamF2YQppbmRleCA4Y2IyMjlhLi5mM2RlMWNhIDEwMDY0NAotLS0gYS9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvY29tcGxlbWVudHMvVGVzdEZhY2V0c0FjY3VtdWxhdG9yV2l0aENvbXBsZW1lbnQuamF2YQorKysgYi9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvY29tcGxlbWVudHMvVGVzdEZhY2V0c0FjY3VtdWxhdG9yV2l0aENvbXBsZW1lbnQuamF2YQpAQCAtMTIxLDggKzEyMSw4IEBACiAgICAgCiAgICAgLy8gUmVzdWx0cyBhcmUgcmVhZHksIHByaW50aW5nIHRoZW0uLi4KICAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChGYWNldFJlc3VsdCBmYWNldFJlc3VsdCA6IHJlcykgewotICAgICAgaWYgKFZFUkJPU0UpIHsKKyAgICBpZiAoVkVSQk9TRSkgeworICAgICAgZm9yIChGYWNldFJlc3VsdCBmYWNldFJlc3VsdCA6IHJlcykgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcyAiKyhpKyspKyI6ICIrZmFjZXRSZXN1bHQpOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9mYWNldC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9zZWFyY2gvVGVzdERyaWxsU2lkZXdheXMuamF2YSBiL2x1Y2VuZS9mYWNldC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC9zZWFyY2gvVGVzdERyaWxsU2lkZXdheXMuamF2YQppbmRleCA3OWI2MmM3Li45NzcyZjkwIDEwMDY0NAotLS0gYS9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvc2VhcmNoL1Rlc3REcmlsbFNpZGV3YXlzLmphdmEKKysrIGIvbHVjZW5lL2ZhY2V0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3NlYXJjaC9UZXN0RHJpbGxTaWRld2F5cy5qYXZhCkBAIC0yOCwxMSArMjgsMTUgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuTW9ja0FuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Db2RlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuRG9jVmFsdWVzRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5wZXJmaWVsZC5QZXJGaWVsZERvY1ZhbHVlc0Zvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5TdHJpbmdGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5mYWNldC5GYWNldFRlc3RDYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmZhY2V0LkZhY2V0VGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmZhY2V0LmNvZGVjcy5mYWNldDQyLkZhY2V0NDJEb2NWYWx1ZXNGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQuaW5kZXguRmFjZXRGaWVsZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQucGFyYW1zLkZhY2V0SW5kZXhpbmdQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQucGFyYW1zLkZhY2V0U2VhcmNoUGFyYW1zOwpAQCAtNTgsNiArNjIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TY29yZURvYzsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU2NvcmVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0RmllbGQuVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5UZXJtUXVlcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlRvcERvY3M7CkBAIC02NSw5ICs3MCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQml0czsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuRml4ZWRCaXRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JT1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSW5QbGFjZU1lcmdlU29ydGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSW5mb1N0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFRlc3REcmlsbFNpZGV3YXlzIGV4dGVuZHMgRmFjZXRUZXN0Q2FzZSB7CiAKQEAgLTQyNiw2ICs0MzMsMTYgQEAKIAogICAgIGJvb2xlYW4gY2FuVXNlRFYgPSBkZWZhdWx0Q29kZWNTdXBwb3J0c1NvcnRlZFNldCgpOwogCisgICAgLy8gVGVzdFJ1bGVTZXR1cEFuZFJlc3RvcmVDbGFzc0VudiBjYW4gc29tZXRpbWVzCisgICAgLy8gcmFuZG9tbHkgcGljayB0aGUgbm9uLWdlbmVyYWwgRmFjZXQ0MkRvY1ZhbHVlc0Zvcm1hdDoKKyAgICBEb2NWYWx1ZXNGb3JtYXQgZHZmID0gQ29kZWMuZ2V0RGVmYXVsdCgpLmRvY1ZhbHVlc0Zvcm1hdCgpOworICAgIGlmIChkdmYgaW5zdGFuY2VvZiBQZXJGaWVsZERvY1ZhbHVlc0Zvcm1hdCkgeworICAgICAgZHZmID0gKChQZXJGaWVsZERvY1ZhbHVlc0Zvcm1hdCkgZHZmKS5nZXREb2NWYWx1ZXNGb3JtYXRGb3JGaWVsZCgiJGZhY2V0cyIpOworICAgIH0KKyAgICBpZiAoZHZmIGluc3RhbmNlb2YgRmFjZXQ0MkRvY1ZhbHVlc0Zvcm1hdCkgeworICAgICAgY2FuVXNlRFYgPSBmYWxzZTsKKyAgICB9CisKICAgICB3aGlsZSAoYUNoYW5jZSA9PSAwLjApIHsKICAgICAgIGFDaGFuY2UgPSByYW5kb20oKS5uZXh0RG91YmxlKCk7CiAgICAgfQpAQCAtMTE0NCw1ICsxMTYxLDMzIEBACiAgICAgfQogICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CiAgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gTFVDRU5FLTUwNDU6IG1ha2Ugc3VyZSBEcmlsbFNpZGV3YXlzIHdvcmtzIHdpdGggYW4gZW1wdHkgaW5kZXgKKyAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CisgICAgRGlyZWN0b3J5IHRheG9EaXIgPSBuZXdEaXJlY3RvcnkoKTsKKyAgICB3cml0ZXIgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpcik7CisgICAgdGF4b1dyaXRlciA9IG5ldyBEaXJlY3RvcnlUYXhvbm9teVdyaXRlcih0YXhvRGlyLCBJbmRleFdyaXRlckNvbmZpZy5PcGVuTW9kZS5DUkVBVEUpOworICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcih3cml0ZXIuZ2V0UmVhZGVyKCkpOworICAgIHdyaXRlci5jbG9zZSgpOworICAgIFRheG9ub215UmVhZGVyIHRheG9SZWFkZXIgPSBuZXcgRGlyZWN0b3J5VGF4b25vbXlSZWFkZXIodGF4b1dyaXRlcik7CisgICAgdGF4b1dyaXRlci5jbG9zZSgpOworCisgICAgLy8gQ291bnQgIkF1dGhvciIKKyAgICBGYWNldFNlYXJjaFBhcmFtcyBmc3AgPSBuZXcgRmFjZXRTZWFyY2hQYXJhbXMobmV3IENvdW50RmFjZXRSZXF1ZXN0KG5ldyBDYXRlZ29yeVBhdGgoIkF1dGhvciIpLCAxMCkpOworCisgICAgRHJpbGxTaWRld2F5cyBkcyA9IG5ldyBEcmlsbFNpZGV3YXlzKHNlYXJjaGVyLCB0YXhvUmVhZGVyKTsKKyAgICBEcmlsbERvd25RdWVyeSBkZHEgPSBuZXcgRHJpbGxEb3duUXVlcnkoZnNwLmluZGV4aW5nUGFyYW1zLCBuZXcgTWF0Y2hBbGxEb2NzUXVlcnkoKSk7CisgICAgZGRxLmFkZChuZXcgQ2F0ZWdvcnlQYXRoKCJBdXRob3IiLCAiTGlzYSIpKTsKKyAgICAKKyAgICBEcmlsbFNpZGV3YXlzUmVzdWx0IHIgPSBkcy5zZWFyY2gobnVsbCwgZGRxLCAxMCwgZnNwKTsgLy8gdGhpcyB1c2VkIHRvIGZhaWwgb24gSWxsZWdhbEFyZ0V4CisgICAgYXNzZXJ0RXF1YWxzKDAsIHIuaGl0cy50b3RhbEhpdHMpOworCisgICAgciA9IGRzLnNlYXJjaChkZHEsIG51bGwsIG51bGwsIDEwLCBuZXcgU29ydChuZXcgU29ydEZpZWxkKCJmb28iLCBUeXBlLklOVCkpLCBmYWxzZSwgZmFsc2UsIGZzcCk7IC8vIHRoaXMgdXNlZCB0byBmYWlsIG9uIElsbGVnYWxBcmdFeAorICAgIGFzc2VydEVxdWFscygwLCByLmhpdHMudG90YWxIaXRzKTsKKyAgICAKKyAgICBJT1V0aWxzLmNsb3NlKHNlYXJjaGVyLmdldEluZGV4UmVhZGVyKCksIHRheG9SZWFkZXIsIGRpciwgdGF4b0Rpcik7CisgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2ZhY2V0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L1Rlc3RDYXRlZ29yeVBhdGguamF2YSBiL2x1Y2VuZS9mYWNldC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC90YXhvbm9teS9UZXN0Q2F0ZWdvcnlQYXRoLmphdmEKaW5kZXggODA5MWM2YS4uZGU1ZDNjYiAxMDA2NDQKLS0tIGEvbHVjZW5lL2ZhY2V0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L1Rlc3RDYXRlZ29yeVBhdGguamF2YQorKysgYi9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvdGF4b25vbXkvVGVzdENhdGVnb3J5UGF0aC5qYXZhCkBAIC0zLDYgKzMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5mYWNldC5GYWNldFRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuX1Rlc3RVdGlsOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKgpAQCAtMjc0LDUgKzI3NSwzMiBAQAogICAgICAgLy8gZXhwZWN0ZWQKICAgICB9CiAgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1BhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgYmlnQ29tcCA9IG51bGw7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCBsZW4gPSBDYXRlZ29yeVBhdGguTUFYX0NBVEVHT1JZX1BBVEhfTEVOR1RIOworICAgICAgYmlnQ29tcCA9IF9UZXN0VXRpbC5yYW5kb21TaW1wbGVTdHJpbmcocmFuZG9tKCksIGxlbiwgbGVuKTsKKyAgICAgIGlmIChiaWdDb21wLmluZGV4T2YoJ1x1MDAxZicpICE9IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGFzc2VydE5vdE51bGwobmV3IENhdGVnb3J5UGF0aCgiZGltIiwgYmlnQ29tcCkpOworICAgICAgZmFpbCgibG9uZyBwYXRocyBzaG91bGQgbm90IGJlIGFsbG93ZWQ7IGxlbj0iICsgYmlnQ29tcC5sZW5ndGgoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGV4cGVjdGVkCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGFzc2VydE5vdE51bGwobmV3IENhdGVnb3J5UGF0aCgiZGltXHUwMDFmIiArIGJpZ0NvbXAsICdcdTAwMWYnKSk7CisgICAgICBmYWlsKCJsb25nIHBhdGhzIHNob3VsZCBub3QgYmUgYWxsb3dlZDsgbGVuPSIgKyBiaWdDb21wLmxlbmd0aCgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gZXhwZWN0ZWQKKyAgICB9CisgIH0KICAgCiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvdGF4b25vbXkvZGlyZWN0b3J5L1Rlc3REaXJlY3RvcnlUYXhvbm9teVdyaXRlci5qYXZhIGIvbHVjZW5lL2ZhY2V0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2ZhY2V0L3RheG9ub215L2RpcmVjdG9yeS9UZXN0RGlyZWN0b3J5VGF4b25vbXlXcml0ZXIuamF2YQppbmRleCA5YWViNzJkLi5mZDUxNWViIDEwMDY0NAotLS0gYS9sdWNlbmUvZmFjZXQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvZmFjZXQvdGF4b25vbXkvZGlyZWN0b3J5L1Rlc3REaXJlY3RvcnlUYXhvbm9teVdyaXRlci5qYXZhCisrKyBiL2x1Y2VuZS9mYWNldC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9mYWNldC90YXhvbm9teS9kaXJlY3RvcnkvVGVzdERpcmVjdG9yeVRheG9ub215V3JpdGVyLmphdmEKQEAgLTEsMTMgKzEsMTkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQudGF4b25vbXkuZGlyZWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuTW9ja0FuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmZhY2V0LkZhY2V0VGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQuaW5kZXguRmFjZXRGaWVsZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQucGFyYW1zLkZhY2V0SW5kZXhpbmdQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZmFjZXQuc2VhcmNoLkRyaWxsRG93blF1ZXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmZhY2V0LnRheG9ub215LkNhdGVnb3J5UGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5mYWNldC50YXhvbm9teS5UYXhvbm9teVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5mYWNldC50YXhvbm9teS5kaXJlY3RvcnkuRGlyZWN0b3J5VGF4b25vbXlXcml0ZXIuTWVtb3J5T3JkaW5hbE1hcDsKQEAgLTIwLDggKzI2LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXJDb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXJDb25maWcuT3Blbk1vZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguU2VnbWVudEluZm9zOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkFscmVhZHlDbG9zZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogLyoKQEAgLTQxMiw1ICs0MjEsNTIgQEAKICAgICB0YXhvV3JpdGVyLmNsb3NlKCk7CiAgICAgZGlyLmNsb3NlKCk7CiAgIH0KLSAgCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEh1Z2VMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIERpcmVjdG9yeSBpbmRleERpciA9IG5ld0RpcmVjdG9yeSgpLCB0YXhvRGlyID0gbmV3RGlyZWN0b3J5KCk7CisgICAgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoaW5kZXhEaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkpOworICAgIERpcmVjdG9yeVRheG9ub215V3JpdGVyIHRheG9Xcml0ZXIgPSBuZXcgRGlyZWN0b3J5VGF4b25vbXlXcml0ZXIodGF4b0RpciwgT3Blbk1vZGUuQ1JFQVRFLCBuZXcgQ2wyb1RheG9ub215V3JpdGVyQ2FjaGUoMiwgMWYsIDEpKTsKKyAgICBGYWNldEZpZWxkcyBmYWNldEZpZWxkcyA9IG5ldyBGYWNldEZpZWxkcyh0YXhvV3JpdGVyKTsKKyAgICAKKyAgICAvLyBBZGQgb25lIGh1Z2UgbGFiZWw6CisgICAgU3RyaW5nIGJpZ3MgPSBudWxsOworICAgIGludCBvcmRpbmFsID0gLTE7CisgICAgQ2F0ZWdvcnlQYXRoIGNwID0gbnVsbDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IGxlbiA9IENhdGVnb3J5UGF0aC5NQVhfQ0FURUdPUllfUEFUSF9MRU5HVEggLSA0OyAvLyBmb3IgdGhlIGRpbWVuc2lvbiBhbmQgc2VwYXJhdG9yCisgICAgICBiaWdzID0gX1Rlc3RVdGlsLnJhbmRvbVNpbXBsZVN0cmluZyhyYW5kb20oKSwgbGVuLCBsZW4pOworICAgICAgY3AgPSBuZXcgQ2F0ZWdvcnlQYXRoKCJkaW0iLCBiaWdzKTsKKyAgICAgIG9yZGluYWwgPSB0YXhvV3JpdGVyLmFkZENhdGVnb3J5KGNwKTsKKyAgICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOworICAgICAgZmFjZXRGaWVsZHMuYWRkRmllbGRzKGRvYywgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjcCkpOworICAgICAgaW5kZXhXcml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEFkZCB0aW55IG9uZXMgdG8gY2F1c2UgYSByZS1oYXNoCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIFN0cmluZyBzID0gX1Rlc3RVdGlsLnJhbmRvbVNpbXBsZVN0cmluZyhyYW5kb20oKSwgMSwgMTApOworICAgICAgdGF4b1dyaXRlci5hZGRDYXRlZ29yeShuZXcgQ2F0ZWdvcnlQYXRoKCJkaW0iLCBzKSk7CisgICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKKyAgICAgIGZhY2V0RmllbGRzLmFkZEZpZWxkcyhkb2MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IENhdGVnb3J5UGF0aCgiZGltIiwgcykpKTsKKyAgICAgIGluZGV4V3JpdGVyLmFkZERvY3VtZW50KGRvYyk7CisgICAgfQorCisgICAgLy8gd2hlbiB0b28gbGFyZ2UgY29tcG9uZW50cyB3ZXJlIGFsbG93ZWQgdG8gYmUgYWRkZWQsIHRoaXMgcmVzdWx0ZWQgaW4gYSBuZXcgYWRkZWQgY2F0ZWdvcnkKKyAgICBhc3NlcnRFcXVhbHMob3JkaW5hbCwgdGF4b1dyaXRlci5hZGRDYXRlZ29yeShjcCkpOworICAgIAorICAgIElPVXRpbHMuY2xvc2UoaW5kZXhXcml0ZXIsIHRheG9Xcml0ZXIpOworICAgIAorICAgIERpcmVjdG9yeVJlYWRlciBpbmRleFJlYWRlciA9IERpcmVjdG9yeVJlYWRlci5vcGVuKGluZGV4RGlyKTsKKyAgICBUYXhvbm9teVJlYWRlciB0YXhvUmVhZGVyID0gbmV3IERpcmVjdG9yeVRheG9ub215UmVhZGVyKHRheG9EaXIpOworICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXcgSW5kZXhTZWFyY2hlcihpbmRleFJlYWRlcik7CisgICAgRHJpbGxEb3duUXVlcnkgZGRxID0gbmV3IERyaWxsRG93blF1ZXJ5KEZhY2V0SW5kZXhpbmdQYXJhbXMuREVGQVVMVCk7CisgICAgZGRxLmFkZChjcCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHNlYXJjaGVyLnNlYXJjaChkZHEsIDEwKS50b3RhbEhpdHMpOworICAgIAorICAgIElPVXRpbHMuY2xvc2UoaW5kZXhSZWFkZXIsIHRheG9SZWFkZXIpOworICAgIAorICAgIElPVXRpbHMuY2xvc2UoaW5kZXhEaXIsIHRheG9EaXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvZ3JvdXBpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2dyb3VwaW5nL0FsbEdyb3VwSGVhZHNDb2xsZWN0b3JUZXN0LmphdmEgYi9sdWNlbmUvZ3JvdXBpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2dyb3VwaW5nL0FsbEdyb3VwSGVhZHNDb2xsZWN0b3JUZXN0LmphdmEKaW5kZXggNmIzN2NlOS4uNzk1YTk4NCAxMDA2NDQKLS0tIGEvbHVjZW5lL2dyb3VwaW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9ncm91cGluZy9BbGxHcm91cEhlYWRzQ29sbGVjdG9yVGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9ncm91cGluZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvZ3JvdXBpbmcvQWxsR3JvdXBIZWFkc0NvbGxlY3RvclRlc3QuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogICAgIERvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIGFkZEdyb3VwRmllbGQoZG9jLCBncm91cEZpZWxkLCAiYXV0aG9yMSIsIHZhbHVlVHlwZSk7CiAgICAgZG9jLmFkZChuZXdUZXh0RmllbGQoImNvbnRlbnQiLCAicmFuZG9tIHRleHQiLCBGaWVsZC5TdG9yZS5OTykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzEiLCAiMSIsIEZpZWxkLlN0b3JlLk5PKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkXzEiLCAxLCBGaWVsZC5TdG9yZS5OTykpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzIiLCAiMSIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogCkBAIC04Niw3ICs4Niw3IEBACiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgYWRkR3JvdXBGaWVsZChkb2MsIGdyb3VwRmllbGQsICJhdXRob3IxIiwgdmFsdWVUeXBlKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiY29udGVudCIsICJzb21lIG1vcmUgcmFuZG9tIHRleHQgYmxvYiIsIEZpZWxkLlN0b3JlLk5PKSk7Ci0gICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiaWRfMSIsICIyIiwgRmllbGQuU3RvcmUuTk8pKTsKKyAgICBkb2MuYWRkKG5ldyBJbnRGaWVsZCgiaWRfMSIsIDIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgZG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiaWRfMiIsICIyIiwgRmllbGQuU3RvcmUuTk8pKTsKICAgICB3LmFkZERvY3VtZW50KGRvYyk7CiAKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICBhZGRHcm91cEZpZWxkKGRvYywgZ3JvdXBGaWVsZCwgImF1dGhvcjEiLCB2YWx1ZVR5cGUpOwogICAgIGRvYy5hZGQobmV3VGV4dEZpZWxkKCJjb250ZW50IiwgInNvbWUgbW9yZSByYW5kb20gdGV4dHVhbCBkYXRhIiwgRmllbGQuU3RvcmUuTk8pKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJpZF8xIiwgIjMiLCBGaWVsZC5TdG9yZS5OTykpOworICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJpZF8xIiwgMywgRmllbGQuU3RvcmUuTk8pKTsKICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJpZF8yIiwgIjMiLCBGaWVsZC5TdG9yZS5OTykpOwogICAgIHcuYWRkRG9jdW1lbnQoZG9jKTsKICAgICB3LmNvbW1pdCgpOyAvLyBUbyBlbnN1cmUgYSBzZWNvbmQgc2VnbWVudApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgYWRkR3JvdXBGaWVsZChkb2MsIGdyb3VwRmllbGQsICJhdXRob3IyIiwgdmFsdWVUeXBlKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiY29udGVudCIsICJzb21lIHJhbmRvbSB0ZXh0IiwgRmllbGQuU3RvcmUuTk8pKTsKLSAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJpZF8xIiwgIjQiLCBGaWVsZC5TdG9yZS5OTykpOworICAgIGRvYy5hZGQobmV3IEludEZpZWxkKCJpZF8xIiwgNCwgRmllbGQuU3RvcmUuTk8pKTsKICAgICBkb2MuYWRkKG5ld1N0cmluZ0ZpZWxkKCJpZF8yIiwgIjQiLCBGaWVsZC5TdG9yZS5OTykpOwogICAgIHcuYWRkRG9jdW1lbnQoZG9jKTsKIApAQCAtMTExLDcgKzExMSw3IEBACiAgICAgZG9jID0gbmV3IERvY3VtZW50KCk7CiAgICAgYWRkR3JvdXBGaWVsZChkb2MsIGdyb3VwRmllbGQsICJhdXRob3IzIiwgdmFsdWVUeXBlKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiY29udGVudCIsICJzb21lIG1vcmUgcmFuZG9tIHRleHQiLCBGaWVsZC5TdG9yZS5OTykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzEiLCAiNSIsIEZpZWxkLlN0b3JlLk5PKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkXzEiLCA1LCBGaWVsZC5TdG9yZS5OTykpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzIiLCAiNSIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogCkBAIC0xMTksMjEgKzExOSwyMSBAQAogICAgIGRvYyA9IG5ldyBEb2N1bWVudCgpOwogICAgIGFkZEdyb3VwRmllbGQoZG9jLCBncm91cEZpZWxkLCAiYXV0aG9yMyIsIHZhbHVlVHlwZSk7CiAgICAgZG9jLmFkZChuZXdUZXh0RmllbGQoImNvbnRlbnQiLCAicmFuZG9tIGJsb2IiLCBGaWVsZC5TdG9yZS5OTykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzEiLCAiNiIsIEZpZWxkLlN0b3JlLk5PKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkXzEiLCA2LCBGaWVsZC5TdG9yZS5OTykpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzIiLCAiNiIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogCiAgICAgLy8gNiAtLSBubyBhdXRob3IgZmllbGQKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiY29udGVudCIsICJyYW5kb20gd29yZCBzdHVjayBpbiBhbG90IG9mIG90aGVyIHRleHQiLCBGaWVsZC5TdG9yZS5OTykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzEiLCAiNiIsIEZpZWxkLlN0b3JlLk5PKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkXzEiLCA2LCBGaWVsZC5TdG9yZS5OTykpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzIiLCAiNiIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogCiAgICAgLy8gNyAtLSBubyBhdXRob3IgZmllbGQKICAgICBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICBkb2MuYWRkKG5ld1RleHRGaWVsZCgiY29udGVudCIsICJyYW5kb20gd29yZCBzdHVjayBpbiBhbG90IG9mIG90aGVyIHRleHQiLCBGaWVsZC5TdG9yZS5OTykpOwotICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzEiLCAiNyIsIEZpZWxkLlN0b3JlLk5PKSk7CisgICAgZG9jLmFkZChuZXcgSW50RmllbGQoImlkXzEiLCA3LCBGaWVsZC5TdG9yZS5OTykpOwogICAgIGRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlkXzIiLCAiNyIsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgdy5hZGREb2N1bWVudChkb2MpOwogCkBAIC00MDYsNiArNDA2LDcgQEAKICAgICAgIGZvciAoaW50IGEgOiBhY3R1YWwpIHsKICAgICAgICAgaWYgKGUgPT0gYSkgewogICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogCmRpZmYgLS1naXQgYS9sdWNlbmUvZ3JvdXBpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2dyb3VwaW5nL1Rlc3RHcm91cGluZy5qYXZhIGIvbHVjZW5lL2dyb3VwaW5nL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9ncm91cGluZy9UZXN0R3JvdXBpbmcuamF2YQppbmRleCA3ZjQzNWQ0Li41ZGRmNjBmIDEwMDY0NAotLS0gYS9sdWNlbmUvZ3JvdXBpbmcvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2dyb3VwaW5nL1Rlc3RHcm91cGluZy5qYXZhCisrKyBiL2x1Y2VuZS9ncm91cGluZy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvZ3JvdXBpbmcvVGVzdEdyb3VwaW5nLmphdmEKQEAgLTgyNywxMiArODI3LDE0IEBACiAgICAgICAgICAgZm9yKFNvcnRGaWVsZCBzZiA6IGRvY1NvcnQuZ2V0U29ydCgpKSB7CiAgICAgICAgICAgICBpZiAoc2YuZ2V0VHlwZSgpID09IFNvcnRGaWVsZC5UeXBlLlNDT1JFKSB7CiAgICAgICAgICAgICAgIGdldFNjb3JlcyA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIAogICAgICAgICAgIGZvcihTb3J0RmllbGQgc2YgOiBncm91cFNvcnQuZ2V0U29ydCgpKSB7CiAgICAgICAgICAgICBpZiAoc2YuZ2V0VHlwZSgpID09IFNvcnRGaWVsZC5UeXBlLlNDT1JFKSB7CiAgICAgICAgICAgICAgIGdldFNjb3JlcyA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL2hpZ2hsaWdodGVyL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wb3N0aW5nc2hpZ2hsaWdodC9Qb3N0aW5nc0hpZ2hsaWdodGVyLmphdmEgYi9sdWNlbmUvaGlnaGxpZ2h0ZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3Bvc3RpbmdzaGlnaGxpZ2h0L1Bvc3RpbmdzSGlnaGxpZ2h0ZXIuamF2YQppbmRleCA4NTBjNzdhLi43MTVlZmViIDEwMDY0NAotLS0gYS9sdWNlbmUvaGlnaGxpZ2h0ZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3Bvc3RpbmdzaGlnaGxpZ2h0L1Bvc3RpbmdzSGlnaGxpZ2h0ZXIuamF2YQorKysgYi9sdWNlbmUvaGlnaGxpZ2h0ZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3Bvc3RpbmdzaGlnaGxpZ2h0L1Bvc3RpbmdzSGlnaGxpZ2h0ZXIuamF2YQpAQCAtMzY5LDcgKzM2OSwxMSBAQAogICAgKiAgaWRlbnRpY2FsIHRvIHdoYXQgd2FzIGluZGV4ZWQuICovCiAgIHByb3RlY3RlZCBTdHJpbmdbXVtdIGxvYWRGaWVsZFZhbHVlcyhJbmRleFNlYXJjaGVyIHNlYXJjaGVyLCBTdHJpbmdbXSBmaWVsZHMsIGludFtdIGRvY2lkcywgaW50IG1heExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBTdHJpbmcgY29udGVudHNbXVtdID0gbmV3IFN0cmluZ1tmaWVsZHMubGVuZ3RoXVtkb2NpZHMubGVuZ3RoXTsKLSAgICBMaW1pdGVkU3RvcmVkRmllbGRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGltaXRlZFN0b3JlZEZpZWxkVmlzaXRvcihmaWVsZHMsIG1heExlbmd0aCk7CisgICAgY2hhciB2YWx1ZVNlcGFyYXRvcnNbXSA9IG5ldyBjaGFyW2ZpZWxkcy5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YWx1ZVNlcGFyYXRvcnNbaV0gPSBnZXRNdWx0aVZhbHVlZFNlcGFyYXRvcihmaWVsZHNbaV0pOworICAgIH0KKyAgICBMaW1pdGVkU3RvcmVkRmllbGRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGltaXRlZFN0b3JlZEZpZWxkVmlzaXRvcihmaWVsZHMsIHZhbHVlU2VwYXJhdG9ycywgbWF4TGVuZ3RoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY2lkcy5sZW5ndGg7IGkrKykgewogICAgICAgc2VhcmNoZXIuZG9jKGRvY2lkc1tpXSwgdmlzaXRvcik7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykgewpAQCAtMzc5LDYgKzM4MywxNiBAQAogICAgIH0KICAgICByZXR1cm4gY29udGVudHM7CiAgIH0KKyAgCisgIC8qKiAKKyAgICogUmV0dXJucyB0aGUgbG9naWNhbCBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMgZm9yIG11bHRpLXZhbHVlZCBmaWVsZHMuCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgc3BhY2UgY2hhcmFjdGVyLCB3aGljaCBtZWFucyBwYXNzYWdlcyBjYW4gc3BhbiBhY3Jvc3MgdmFsdWVzLAorICAgKiBidXQgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUsIGZvciBleGFtcGxlIHdpdGgge0Bjb2RlIFUrMjAyOSBQQVJBR1JBUEggU0VQQVJBVE9SIChQUyl9CisgICAqIGlmIGVhY2ggdmFsdWUgaG9sZHMgYSBkaXNjcmV0ZSBwYXNzYWdlIGZvciBoaWdobGlnaHRpbmcuCisgICAqLworICBwcm90ZWN0ZWQgY2hhciBnZXRNdWx0aVZhbHVlZFNlcGFyYXRvcihTdHJpbmcgZmllbGQpIHsKKyAgICByZXR1cm4gJyAnOworICB9CiAgICAgCiAgIHByaXZhdGUgTWFwPEludGVnZXIsU3RyaW5nPiBoaWdobGlnaHRGaWVsZChTdHJpbmcgZmllbGQsIFN0cmluZyBjb250ZW50c1tdLCBCcmVha0l0ZXJhdG9yIGJpLCBCeXRlc1JlZiB0ZXJtc1tdLCBpbnRbXSBkb2NpZHMsIExpc3Q8QXRvbWljUmVhZGVyQ29udGV4dD4gbGVhdmVzLCBpbnQgbWF4UGFzc2FnZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAKICAgICBNYXA8SW50ZWdlcixTdHJpbmc+IGhpZ2hsaWdodHMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLFN0cmluZz4oKTsKQEAgLTY1MiwxMiArNjY2LDE1IEBACiAgIAogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW1pdGVkU3RvcmVkRmllbGRWaXNpdG9yIGV4dGVuZHMgU3RvcmVkRmllbGRWaXNpdG9yIHsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWVsZHNbXTsKKyAgICBwcml2YXRlIGZpbmFsIGNoYXIgdmFsdWVTZXBhcmF0b3JzW107CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGVuZ3RoOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyc1tdOwogICAgIHByaXZhdGUgaW50IGN1cnJlbnRGaWVsZCA9IC0xOwogICAgIAotICAgIHB1YmxpYyBMaW1pdGVkU3RvcmVkRmllbGRWaXNpdG9yKFN0cmluZyBmaWVsZHNbXSwgaW50IG1heExlbmd0aCkgeworICAgIHB1YmxpYyBMaW1pdGVkU3RvcmVkRmllbGRWaXNpdG9yKFN0cmluZyBmaWVsZHNbXSwgY2hhciB2YWx1ZVNlcGFyYXRvcnNbXSwgaW50IG1heExlbmd0aCkgeworICAgICAgYXNzZXJ0IGZpZWxkcy5sZW5ndGggPT0gdmFsdWVTZXBhcmF0b3JzLmxlbmd0aDsKICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzOworICAgICAgdGhpcy52YWx1ZVNlcGFyYXRvcnMgPSB2YWx1ZVNlcGFyYXRvcnM7CiAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKICAgICAgIGJ1aWxkZXJzID0gbmV3IFN0cmluZ0J1aWxkZXJbZmllbGRzLmxlbmd0aF07CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7CkBAIC02NjksOCArNjg2LDggQEAKICAgICBwdWJsaWMgdm9pZCBzdHJpbmdGaWVsZChGaWVsZEluZm8gZmllbGRJbmZvLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICBhc3NlcnQgY3VycmVudEZpZWxkID49IDA7CiAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVyc1tjdXJyZW50RmllbGRdOwotICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7IC8vIGZvciB0aGUgb2Zmc2V0IGdhcCwgVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZQorICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwICYmIGJ1aWxkZXIubGVuZ3RoKCkgPCBtYXhMZW5ndGgpIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWVTZXBhcmF0b3JzW2N1cnJlbnRGaWVsZF0pOwogICAgICAgfQogICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgKyB2YWx1ZS5sZW5ndGgoKSA+IG1heExlbmd0aCkgewogICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSwgMCwgbWF4TGVuZ3RoIC0gYnVpbGRlci5sZW5ndGgoKSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvaGlnaGxpZ2h0ZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3Bvc3RpbmdzaGlnaGxpZ2h0L1Rlc3RQb3N0aW5nc0hpZ2hsaWdodGVyLmphdmEgYi9sdWNlbmUvaGlnaGxpZ2h0ZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3Bvc3RpbmdzaGlnaGxpZ2h0L1Rlc3RQb3N0aW5nc0hpZ2hsaWdodGVyLmphdmEKaW5kZXggNjk5OTUwZS4uZjcyYzU5YyAxMDA2NDQKLS0tIGEvbHVjZW5lL2hpZ2hsaWdodGVyL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9wb3N0aW5nc2hpZ2hsaWdodC9UZXN0UG9zdGluZ3NIaWdobGlnaHRlci5qYXZhCisrKyBiL2x1Y2VuZS9oaWdobGlnaHRlci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvcG9zdGluZ3NoaWdobGlnaHQvVGVzdFBvc3RpbmdzSGlnaGxpZ2h0ZXIuamF2YQpAQCAtMTIzLDYgKzEyMyw0MyBAQAogICAgIGRpci5jbG9zZSgpOwogICB9CiAgIAorICAvLyBzaW1wbGUgdGVzdCB3aXRoIG11bHRpcGxlIHZhbHVlcyB0aGF0IG1ha2UgYSByZXN1bHQgbG9uZ2VyIHRoYW4gbWF4TGVuZ3RoLgorICBwdWJsaWMgdm9pZCB0ZXN0TWF4TGVuZ3RoV2l0aE11bHRpdmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEaXJlY3RvcnkgZGlyID0gbmV3RGlyZWN0b3J5KCk7CisgICAgLy8gdXNlIHNpbXBsZWFuYWx5emVyIGZvciBtb3JlIG5hdHVyYWwgdG9rZW5pemF0aW9uIChlbHNlICJ0ZXN0LiIgaXMgYSB0b2tlbikKKyAgICBJbmRleFdyaXRlckNvbmZpZyBpd2MgPSBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSwgTW9ja1Rva2VuaXplci5TSU1QTEUsIHRydWUpKTsKKyAgICBpd2Muc2V0TWVyZ2VQb2xpY3kobmV3TG9nTWVyZ2VQb2xpY3koKSk7CisgICAgUmFuZG9tSW5kZXhXcml0ZXIgaXcgPSBuZXcgUmFuZG9tSW5kZXhXcml0ZXIocmFuZG9tKCksIGRpciwgaXdjKTsKKyAgICAKKyAgICBGaWVsZFR5cGUgb2Zmc2V0c1R5cGUgPSBuZXcgRmllbGRUeXBlKFRleHRGaWVsZC5UWVBFX1NUT1JFRCk7CisgICAgb2Zmc2V0c1R5cGUuc2V0SW5kZXhPcHRpb25zKEluZGV4T3B0aW9ucy5ET0NTX0FORF9GUkVRU19BTkRfUE9TSVRJT05TX0FORF9PRkZTRVRTKTsKKyAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKKyAgICAKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgMyA7IGkrKykgeworICAgICAgRmllbGQgYm9keSA9IG5ldyBGaWVsZCgiYm9keSIsICIiLCBvZmZzZXRzVHlwZSk7CisgICAgICBib2R5LnNldFN0cmluZ1ZhbHVlKCJUaGlzIGlzIGEgbXVsdGl2YWx1ZWQgZmllbGQiKTsKKyAgICAgIGRvYy5hZGQoYm9keSk7CisgICAgfQorICAgIAorICAgIGl3LmFkZERvY3VtZW50KGRvYyk7CisgICAgCisgICAgSW5kZXhSZWFkZXIgaXIgPSBpdy5nZXRSZWFkZXIoKTsKKyAgICBpdy5jbG9zZSgpOworICAgIAorICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7CisgICAgUG9zdGluZ3NIaWdobGlnaHRlciBoaWdobGlnaHRlciA9IG5ldyBQb3N0aW5nc0hpZ2hsaWdodGVyKDQwKTsKKyAgICBRdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oImJvZHkiLCAiZmllbGQiKSk7CisgICAgVG9wRG9jcyB0b3BEb2NzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5LCBudWxsLCAxMCwgU29ydC5JTkRFWE9SREVSKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdG9wRG9jcy50b3RhbEhpdHMpOworICAgIFN0cmluZyBzbmlwcGV0c1tdID0gaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0KCJib2R5IiwgcXVlcnksIHNlYXJjaGVyLCB0b3BEb2NzKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgc25pcHBldHMubGVuZ3RoKTsKKyAgICBhc3NlcnRUcnVlKCJTbmlwcGV0IHNob3VsZCBoYXZlIG1heGltdW0gNDAgY2hhcmFjdGVycyBwbHVzIHRoZSBwcmUgYW5kIHBvc3QgdGFncyIsCisgICAgICAgIHNuaXBwZXRzWzBdLmxlbmd0aCgpID09ICg0MCArICI8Yj48L2I+Ii5sZW5ndGgoKSkpOworICAgIAorICAgIGlyLmNsb3NlKCk7CisgICAgZGlyLmNsb3NlKCk7CisgIH0KKyAgCiAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewogICAgIERpcmVjdG9yeSBkaXIgPSBuZXdEaXJlY3RvcnkoKTsKICAgICBJbmRleFdyaXRlckNvbmZpZyBpd2MgPSBuZXdJbmRleFdyaXRlckNvbmZpZyhURVNUX1ZFUlNJT05fQ1VSUkVOVCwgbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSwgTW9ja1Rva2VuaXplci5TSU1QTEUsIHRydWUpKTsKQEAgLTg4NSw0ICs5MjIsNDggQEAKICAgICBpci5jbG9zZSgpOwogICAgIGRpci5jbG9zZSgpOwogICB9CisgIAorICAvKiogY3VzdG9taXppbmcgdGhlIGdhcCBzZXBhcmF0b3IgdG8gZm9yY2UgYSBzZW50ZW5jZSBicmVhayAqLworICBwdWJsaWMgdm9pZCB0ZXN0R2FwU2VwYXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOworICAgIC8vIHVzZSBzaW1wbGVhbmFseXplciBmb3IgbW9yZSBuYXR1cmFsIHRva2VuaXphdGlvbiAoZWxzZSAidGVzdC4iIGlzIGEgdG9rZW4pCisgICAgSW5kZXhXcml0ZXJDb25maWcgaXdjID0gbmV3SW5kZXhXcml0ZXJDb25maWcoVEVTVF9WRVJTSU9OX0NVUlJFTlQsIG5ldyBNb2NrQW5hbHl6ZXIocmFuZG9tKCksIE1vY2tUb2tlbml6ZXIuU0lNUExFLCB0cnVlKSk7CisgICAgaXdjLnNldE1lcmdlUG9saWN5KG5ld0xvZ01lcmdlUG9saWN5KCkpOworICAgIFJhbmRvbUluZGV4V3JpdGVyIGl3ID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIsIGl3Yyk7CisgICAgCisgICAgRmllbGRUeXBlIG9mZnNldHNUeXBlID0gbmV3IEZpZWxkVHlwZShUZXh0RmllbGQuVFlQRV9TVE9SRUQpOworICAgIG9mZnNldHNUeXBlLnNldEluZGV4T3B0aW9ucyhJbmRleE9wdGlvbnMuRE9DU19BTkRfRlJFUVNfQU5EX1BPU0lUSU9OU19BTkRfT0ZGU0VUUyk7CisgICAgRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCk7CisgICAgCisgICAgRmllbGQgYm9keTEgPSBuZXcgRmllbGQoImJvZHkiLCAiIiwgb2Zmc2V0c1R5cGUpOworICAgIGJvZHkxLnNldFN0cmluZ1ZhbHVlKCJUaGlzIGlzIGEgbXVsdGl2YWx1ZWQgZmllbGQiKTsKKyAgICBkb2MuYWRkKGJvZHkxKTsKKyAgICAKKyAgICBGaWVsZCBib2R5MiA9IG5ldyBGaWVsZCgiYm9keSIsICIiLCBvZmZzZXRzVHlwZSk7CisgICAgYm9keTIuc2V0U3RyaW5nVmFsdWUoIlRoaXMgaXMgc29tZXRoaW5nIGRpZmZlcmVudCIpOworICAgIGRvYy5hZGQoYm9keTIpOworICAgIAorICAgIGl3LmFkZERvY3VtZW50KGRvYyk7CisgICAgCisgICAgSW5kZXhSZWFkZXIgaXIgPSBpdy5nZXRSZWFkZXIoKTsKKyAgICBpdy5jbG9zZSgpOworICAgIAorICAgIEluZGV4U2VhcmNoZXIgc2VhcmNoZXIgPSBuZXdTZWFyY2hlcihpcik7CisgICAgUG9zdGluZ3NIaWdobGlnaHRlciBoaWdobGlnaHRlciA9IG5ldyBQb3N0aW5nc0hpZ2hsaWdodGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgY2hhciBnZXRNdWx0aVZhbHVlZFNlcGFyYXRvcihTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgYXNzZXJ0IGZpZWxkLmVxdWFscygiYm9keSIpOworICAgICAgICByZXR1cm4gJ1x1MjAyOSc7CisgICAgICB9CisgICAgfTsKKyAgICBRdWVyeSBxdWVyeSA9IG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oImJvZHkiLCAiZmllbGQiKSk7CisgICAgVG9wRG9jcyB0b3BEb2NzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5LCBudWxsLCAxMCwgU29ydC5JTkRFWE9SREVSKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdG9wRG9jcy50b3RhbEhpdHMpOworICAgIFN0cmluZyBzbmlwcGV0c1tdID0gaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0KCJib2R5IiwgcXVlcnksIHNlYXJjaGVyLCB0b3BEb2NzKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgc25pcHBldHMubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgYSBtdWx0aXZhbHVlZCA8Yj5maWVsZDwvYj5cdTIwMjkiLCBzbmlwcGV0c1swXSk7CisgICAgCisgICAgaXIuY2xvc2UoKTsKKyAgICBkaXIuY2xvc2UoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2pvaW4vYnVpbGQueG1sIGIvbHVjZW5lL2pvaW4vYnVpbGQueG1sCmluZGV4IDFjYjcxMzMuLjgwZDM4NGMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9qb2luL2J1aWxkLnhtbAorKysgYi9sdWNlbmUvam9pbi9idWlsZC54bWwKQEAgLTEsNCArMSwyMiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KIDxwcm9qZWN0IG5hbWU9ImpvaW4iIGRlZmF1bHQ9ImRlZmF1bHQiPgogICA8ZGVzY3JpcHRpb24+CiAgICAgSW5kZXgtdGltZSBhbmQgUXVlcnktdGltZSBqb2lucyBmb3Igbm9ybWFsaXplZCBjb250ZW50CmRpZmYgLS1naXQgYS9sdWNlbmUvam9pbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvam9pbi9UZXJtc1F1ZXJ5LmphdmEgYi9sdWNlbmUvam9pbi9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvam9pbi9UZXJtc1F1ZXJ5LmphdmEKaW5kZXggZjRmMmViMS4uODFkNWRkZCAxMDA2NDQKLS0tIGEvbHVjZW5lL2pvaW4vc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2pvaW4vVGVybXNRdWVyeS5qYXZhCisrKyBiL2x1Y2VuZS9qb2luL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9qb2luL1Rlcm1zUXVlcnkuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogY2xhc3MgVGVybXNRdWVyeSBleHRlbmRzIE11bHRpVGVybVF1ZXJ5IHsKIAogICBwcml2YXRlIGZpbmFsIEJ5dGVzUmVmSGFzaCB0ZXJtczsKKyAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBvcmRzOwogICBwcml2YXRlIGZpbmFsIFF1ZXJ5IGZyb21RdWVyeTsgLy8gVXNlZCBmb3IgZXF1YWxzKCkgb25seQogCiAgIC8qKgpAQCAtNDgsNiArNDksNyBAQAogICAgIHN1cGVyKGZpZWxkKTsKICAgICB0aGlzLmZyb21RdWVyeSA9IGZyb21RdWVyeTsKICAgICB0aGlzLnRlcm1zID0gdGVybXM7CisgICAgb3JkcyA9IHRlcm1zLnNvcnQoQnl0ZXNSZWYuZ2V0VVRGOFNvcnRlZEFzVW5pY29kZUNvbXBhcmF0b3IoKSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTU2LDcgKzU4LDcgQEAKICAgICAgIHJldHVybiBUZXJtc0VudW0uRU1QVFk7CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBTZWVraW5nVGVybVNldFRlcm1zRW51bSh0ZXJtcy5pdGVyYXRvcihudWxsKSwgdGhpcy50ZXJtcyk7CisgICAgcmV0dXJuIG5ldyBTZWVraW5nVGVybVNldFRlcm1zRW51bSh0ZXJtcy5pdGVyYXRvcihudWxsKSwgdGhpcy50ZXJtcywgb3Jkcyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTEwNCwxMiArMTA2LDEyIEBACiAgICAgcHJpdmF0ZSBCeXRlc1JlZiBzZWVrVGVybTsKICAgICBwcml2YXRlIGludCB1cHRvID0gMDsKIAotICAgIFNlZWtpbmdUZXJtU2V0VGVybXNFbnVtKFRlcm1zRW51bSB0ZW51bSwgQnl0ZXNSZWZIYXNoIHRlcm1zKSB7CisgICAgU2Vla2luZ1Rlcm1TZXRUZXJtc0VudW0oVGVybXNFbnVtIHRlbnVtLCBCeXRlc1JlZkhhc2ggdGVybXMsIGludFtdIG9yZHMpIHsKICAgICAgIHN1cGVyKHRlbnVtKTsKICAgICAgIHRoaXMudGVybXMgPSB0ZXJtczsKLQorICAgICAgdGhpcy5vcmRzID0gb3JkczsKKyAgICAgIGNvbXBhcmF0b3IgPSBCeXRlc1JlZi5nZXRVVEY4U29ydGVkQXNVbmljb2RlQ29tcGFyYXRvcigpOwogICAgICAgbGFzdEVsZW1lbnQgPSB0ZXJtcy5zaXplKCkgLSAxOwotICAgICAgb3JkcyA9IHRlcm1zLnNvcnQoY29tcGFyYXRvciA9IHRlbnVtLmdldENvbXBhcmF0b3IoKSk7CiAgICAgICBsYXN0VGVybSA9IHRlcm1zLmdldChvcmRzW2xhc3RFbGVtZW50XSwgbmV3IEJ5dGVzUmVmKCkpOwogICAgICAgc2Vla1Rlcm0gPSB0ZXJtcy5nZXQob3Jkc1t1cHRvXSwgc3BhcmUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9qb2luL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9qb2luL1Rlc3RCbG9ja0pvaW4uamF2YSBiL2x1Y2VuZS9qb2luL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9qb2luL1Rlc3RCbG9ja0pvaW4uamF2YQppbmRleCA1ZGZkNzQ2Li4xNDdiNGE1IDEwMDY0NAotLS0gYS9sdWNlbmUvam9pbi9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvam9pbi9UZXN0QmxvY2tKb2luLmphdmEKKysrIGIvbHVjZW5lL2pvaW4vc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL2pvaW4vVGVzdEJsb2NrSm9pbi5qYXZhCkBAIC00NTksNyArNDU5LDcgQEAKICAgICBmb3IoaW50IHBhcmVudERvY0lEPTA7cGFyZW50RG9jSUQ8bnVtUGFyZW50RG9jcztwYXJlbnREb2NJRCsrKSB7CiAgICAgICBEb2N1bWVudCBwYXJlbnREb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICAgIERvY3VtZW50IHBhcmVudEpvaW5Eb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICAgIEZpZWxkIGlkID0gbmV3U3RyaW5nRmllbGQoInBhcmVudElEIiwgIiIrcGFyZW50RG9jSUQsIEZpZWxkLlN0b3JlLllFUyk7CisgICAgICBGaWVsZCBpZCA9IG5ldyBJbnRGaWVsZCgicGFyZW50SUQiLCBwYXJlbnREb2NJRCwgRmllbGQuU3RvcmUuWUVTKTsKICAgICAgIHBhcmVudERvYy5hZGQoaWQpOwogICAgICAgcGFyZW50Sm9pbkRvYy5hZGQoaWQpOwogICAgICAgcGFyZW50Sm9pbkRvYy5hZGQobmV3U3RyaW5nRmllbGQoImlzUGFyZW50IiwgIngiLCBGaWVsZC5TdG9yZS5OTykpOwpAQCAtNDcyLDggKzQ3Miw4IEBACiAgICAgICB9CiAKICAgICAgIGlmIChkb0RlbGV0ZXMpIHsKLSAgICAgICAgcGFyZW50RG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiYmxvY2tJRCIsICIiK3BhcmVudERvY0lELCBGaWVsZC5TdG9yZS5OTykpOwotICAgICAgICBwYXJlbnRKb2luRG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiYmxvY2tJRCIsICIiK3BhcmVudERvY0lELCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgICBwYXJlbnREb2MuYWRkKG5ldyBJbnRGaWVsZCgiYmxvY2tJRCIsIHBhcmVudERvY0lELCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgICBwYXJlbnRKb2luRG9jLmFkZChuZXcgSW50RmllbGQoImJsb2NrSUQiLCBwYXJlbnREb2NJRCwgRmllbGQuU3RvcmUuTk8pKTsKICAgICAgIH0KIAogICAgICAgZmluYWwgTGlzdDxEb2N1bWVudD4gam9pbkRvY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogICAgICAgICBEb2N1bWVudCBqb2luQ2hpbGREb2MgPSBuZXcgRG9jdW1lbnQoKTsKICAgICAgICAgam9pbkRvY3MuYWRkKGpvaW5DaGlsZERvYyk7CiAKLSAgICAgICAgRmllbGQgY2hpbGRJRCA9IG5ld1N0cmluZ0ZpZWxkKCJjaGlsZElEIiwgIiIrY2hpbGREb2NJRCwgRmllbGQuU3RvcmUuWUVTKTsKKyAgICAgICAgRmllbGQgY2hpbGRJRCA9IG5ldyBJbnRGaWVsZCgiY2hpbGRJRCIsIGNoaWxkRG9jSUQsIEZpZWxkLlN0b3JlLllFUyk7CiAgICAgICAgIGNoaWxkRG9jLmFkZChjaGlsZElEKTsKICAgICAgICAgam9pbkNoaWxkRG9jLmFkZChjaGlsZElEKTsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZG9EZWxldGVzKSB7Ci0gICAgICAgICAgam9pbkNoaWxkRG9jLmFkZChuZXdTdHJpbmdGaWVsZCgiYmxvY2tJRCIsICIiK3BhcmVudERvY0lELCBGaWVsZC5TdG9yZS5OTykpOworICAgICAgICAgIGpvaW5DaGlsZERvYy5hZGQobmV3IEludEZpZWxkKCJibG9ja0lEIiwgcGFyZW50RG9jSUQsIEZpZWxkLlN0b3JlLk5PKSk7CiAgICAgICAgIH0KIAogICAgICAgICB3LmFkZERvY3VtZW50KGNoaWxkRG9jKTsKQEAgLTU0MSw4ICs1NDEsMTAgQEAKICAgICAgIGlmIChWRVJCT1NFKSB7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiREVMRVRFIHBhcmVudElEPSIgKyBkZWxldGVJRCk7CiAgICAgICB9Ci0gICAgICB3LmRlbGV0ZURvY3VtZW50cyhuZXcgVGVybSgiYmxvY2tJRCIsICIiK2RlbGV0ZUlEKSk7Ci0gICAgICBqb2luVy5kZWxldGVEb2N1bWVudHMobmV3IFRlcm0oImJsb2NrSUQiLCAiIitkZWxldGVJRCkpOworICAgICAgQnl0ZXNSZWYgdGVybSA9IG5ldyBCeXRlc1JlZigpOworICAgICAgTnVtZXJpY1V0aWxzLmludFRvUHJlZml4Q29kZWRCeXRlcyhkZWxldGVJRCwgMCwgdGVybSk7CisgICAgICB3LmRlbGV0ZURvY3VtZW50cyhuZXcgVGVybSgiYmxvY2tJRCIsIHRlcm0pKTsKKyAgICAgIGpvaW5XLmRlbGV0ZURvY3VtZW50cyhuZXcgVGVybSgiYmxvY2tJRCIsIHRlcm0pKTsKICAgICB9CiAKICAgICBmaW5hbCBJbmRleFJlYWRlciByID0gdy5nZXRSZWFkZXIoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS0xLjUuNS5qYXIuc2hhMSBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS0xLjUuNS5qYXIuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4OTM1YS4uMDAwMDAwMAotLS0gYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtMS41LjUuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi03OTY1YTM5ZGIxMTRmN2M0MDRiNzFkMzhiYzdmMGU2YTMzMmM0ZTczCmRpZmYgLS1naXQgYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtMS42LjAuamFyLnNoYTEgYi9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtMS42LjAuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0MWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS0xLjYuMC5qYXIuc2hhMQpAQCAtMCwwICsxIEBACiszOTdhOTkzMDcwMjA3OTdlNjc5MGYyZmFmOGNmODY1OTgzYjUyNTU5CmRpZmYgLS1naXQgYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtTElDRU5TRS1CU0QudHh0IGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstZnNhLUxJQ0VOU0UtQlNELnR4dAppbmRleCBmOTdmYjdkLi40ZGFiYTQ3IDEwMDY0NAotLS0gYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtTElDRU5TRS1CU0QudHh0CisrKyBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS1MSUNFTlNFLUJTRC50eHQKQEAgLTEsNiArMSw2IEBACiAKIENvcHlyaWdodCAoYykgMjAwNiBEYXdpZCBXZWlzcwotQ29weXJpZ2h0IChjKSAyMDA3LTIwMTIgRGF3aWQgV2Vpc3MsIE1hcmNpbiBNacWCa293c2tpCitDb3B5cmlnaHQgKGMpIDIwMDctMjAxMyBEYXdpZCBXZWlzcywgTWFyY2luIE1pxYJrb3dza2kKIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIApAQCAtMjYsNCArMjYsNCBAQAogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLTEuNS41Lmphci5zaGExIGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLTEuNS41Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMxNGMwLi4wMDAwMDAwCi0tLSBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC0xLjUuNS5qYXIuc2hhMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWI0YTNhOTc0NmNhYjhiMmM5OWMzM2QyY2VlZGEyZWNlM2Y4ZDhlZjIKZGlmZiAtLWdpdCBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC0xLjYuMC5qYXIuc2hhMSBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC0xLjYuMC5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRlYWQxCi0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLTEuNi4wLmphci5zaGExCkBAIC0wLDAgKzEgQEAKK2NhMDY2MzUzMDk3MWI1NDQyMGZjMWNlYTAwYTYzMzhmNjg0MjgyMzIKZGlmZiAtLWdpdCBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1MSUNFTlNFLUJTRC50eHQgYi9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTElDRU5TRS1CU0QudHh0CmluZGV4IDA0ZmZkMDcuLjY2MGY2MzMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1MSUNFTlNFLUJTRC50eHQKKysrIGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLUxJQ0VOU0UtQlNELnR4dApAQCAtMSw2MiArMSwyNiBAQAogQlNELWxpY2Vuc2VkIGRpY3Rpb25hcnkgb2YgUG9saXNoIChNb3Jmb2xvZ2lrKQogCi1Db3B5cmlnaHQgKGMpIDIwMTIsIE1hcmNpbiBNacWCa293c2tpCitNb3Jmb2xvZ2lrIFBvbGlzaCBkaWN0aW9uYXJ5LgorVmVyc2lvbjogMi4wIFBvbGlNb3JmCitDb3B5cmlnaHQgKGMpIDIwMTMsIE1hcmNpbiBNacWCa293c2tpCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgIHVzZSBpbiAgc291cmNlIGFuZCBiaW5hcnkgIGZvcm1zLCB3aXRoICBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAKIAotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAogCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ09QWVJJR0hUIEhPTERFUlMg4oCcQVMgSVPigJ0gQU5EIEFOWSBFWFBSRVNTCi1PUiAgSU1QTElFRCBXQVJSQU5USUVTLCAgSU5DTFVESU5HLCBCVVQgIE5PVCBMSU1JVEVEICBUTywgIFRIRSBJTVBMSUVECitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UICBTSEFMTCBDT1BZUklHSFQgIEhPTERFUlMgT1IgIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSAgR09PRFMgT1IgIFNFUlZJQ0VTOyAgTE9TUyAgT0YgVVNFLCAgREFUQSwgIE9SIFBST0ZJVFM7ICBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCAgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS0tCi0KLUJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoU0dKUCkKLWh0dHA6Ly9zZ2pwLnBsL21vcmZldXN6LwotCi1Db3B5cmlnaHQgwqkgMjAxMSBaeWdtdW50IFNhbG9uaSwgV8WCb2R6aW1pZXJ6IEdydXN6Y3p5xYRza2ksIAotCSAgICAJIE1hcmNpbiBXb2xpxYRza2ksIFJvYmVydCBXb8WCb3N6Ci0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCAgdXNlIGluICBzb3VyY2UgYW5kIGJpbmFyeSAgZm9ybXMsIHdpdGggIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIENPUFlSSUdIVCBIT0xERVJTIOKAnEFTIElT4oCdIEFORCBBTlkgRVhQUkVTUwotT1IgIElNUExJRUQgV0FSUkFOVElFUywgIElOQ0xVRElORywgQlVUICBOT1QgTElNSVRFRCAgVE8sICBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UICBTSEFMTCBDT1BZUklHSFQgIEhPTERFUlMgT1IgIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSAgR09PRFMgT1IgIFNFUlZJQ0VTOyAgTE9TUyAgT0YgVVNFLCAgREFUQSwgIE9SIFBST0ZJVFM7ICBPUgotQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCAgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKK09OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTk9USUNFLnR4dCBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1OT1RJQ0UudHh0CmluZGV4IGE4YTNhYTEuLjQ1ZDRjYmEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1OT1RJQ0UudHh0CisrKyBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1OT1RJQ0UudHh0CkBAIC0xLDYgKzEsMyBAQAogCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoTW9yZm9sb2dpaykKLShodHRwOi8vbW9yZm9sb2dpay5ibG9nc3BvdC5jb20vKQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoU0dKUCkKLShodHRwOi8vc2dqcC5wbC9tb3JmZXVzei8pCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoTW9yZm9sb2dpaywgUG9saU1vcmYpCisoaHR0cDovL21vcmZvbG9naWsuYmxvZ3Nwb3QuY29tLykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1zdGVtbWluZy0xLjUuNS5qYXIuc2hhMSBiL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLTEuNS41Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTgyNGU0Li4wMDAwMDAwCi0tLSBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLTEuNS41Lmphci5zaGExCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZTVkYzkxM2FkZWJhM2I4OTUzOWNkNWY4MmU1Yjg4ZDEzNmExZDg1YgpkaWZmIC0tZ2l0IGEvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctMS42LjAuamFyLnNoYTEgYi9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1zdGVtbWluZy0xLjYuMC5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE1NDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctMS42LjAuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorOGEyODQ1NzFiZWEyY2RkMzA1Y2Q4NmZiYWM5YmFiNmRlZWYzMWM3ZgpkaWZmIC0tZ2l0IGEvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctTElDRU5TRS1CU0QudHh0IGIvbHVjZW5lL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctTElDRU5TRS1CU0QudHh0CmluZGV4IGY5N2ZiN2QuLjRkYWJhNDcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLUxJQ0VOU0UtQlNELnR4dAorKysgYi9sdWNlbmUvbGljZW5zZXMvbW9yZm9sb2dpay1zdGVtbWluZy1MSUNFTlNFLUJTRC50eHQKQEAgLTEsNiArMSw2IEBACiAKIENvcHlyaWdodCAoYykgMjAwNiBEYXdpZCBXZWlzcwotQ29weXJpZ2h0IChjKSAyMDA3LTIwMTIgRGF3aWQgV2Vpc3MsIE1hcmNpbiBNacWCa293c2tpCitDb3B5cmlnaHQgKGMpIDIwMDctMjAxMyBEYXdpZCBXZWlzcywgTWFyY2luIE1pxYJrb3dza2kKIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIApAQCAtMjYsNCArMjYsNCBAQAogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL21pc2Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvbWlzYy9Td2VldFNwb3RTaW1pbGFyaXR5LmphdmEgYi9sdWNlbmUvbWlzYy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9taXNjL1N3ZWV0U3BvdFNpbWlsYXJpdHkuamF2YQppbmRleCAwNmYzY2FiLi41ZWJmZjUzIDEwMDY0NAotLS0gYS9sdWNlbmUvbWlzYy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9taXNjL1N3ZWV0U3BvdFNpbWlsYXJpdHkuamF2YQorKysgYi9sdWNlbmUvbWlzYy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9taXNjL1N3ZWV0U3BvdFNpbWlsYXJpdHkuamF2YQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAqIEBzZWUgI2Jhc2VsaW5lVGYKICAgICovCiAgIEBPdmVycmlkZQotICBwdWJsaWMgZmxvYXQgdGYoaW50IGZyZXEpIHsKKyAgcHVibGljIGZsb2F0IHRmKGZsb2F0IGZyZXEpIHsKICAgICByZXR1cm4gYmFzZWxpbmVUZihmcmVxKTsKICAgfQogICAKZGlmZiAtLWdpdCBhL2x1Y2VuZS9taXNjL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L0xpc3RPZk91dHB1dHMuamF2YSBiL2x1Y2VuZS9taXNjL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L0xpc3RPZk91dHB1dHMuamF2YQppbmRleCA4ZGI2NTRhLi45OWIyZjNmIDEwMDY0NAotLS0gYS9sdWNlbmUvbWlzYy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9MaXN0T2ZPdXRwdXRzLmphdmEKKysrIGIvbHVjZW5lL21pc2Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvTGlzdE9mT3V0cHV0cy5qYXZhCkBAIC0zOCw2ICszOCwxNSBAQAogICogbW9yZSB0aGFuIG9uZSBvdXRwdXQsIGFzIHRoaXMgcmVxdWlyZXMgcHVzaGluZyBhbGwKICAqIG11bHRpLW91dHB1dCB2YWx1ZXMgdG8gYSBmaW5hbCBzdGF0ZS4KICAqCisgKiA8cD5OT1RFOiB0aGUgb25seSB3YXkgdG8gY3JlYXRlIG11bHRpcGxlIG91dHB1dHMgaXMgdG8KKyAqIGFkZCB0aGUgc2FtZSBpbnB1dCB0byB0aGUgRlNUIG11bHRpcGxlIHRpbWVzIGluIGEgcm93LiAgVGhpcyBpcworICogaG93IHRoZSBGU1QgbWFwcyBhIHNpbmdsZSBpbnB1dCB0byBtdWx0aXBsZSBvdXRwdXRzIChlLmcuIHlvdQorICogY2Fubm90IHBhc3MgYSBMaXN0Jmx0O09iamVjdCZndDsgdG8ge0BsaW5rIEJ1aWxkZXIjYWRkfSkuICBJZgorICogeW91ciBvdXRwdXRzIGFyZSBsb25ncywgYW5kIHlvdSBuZWVkIGF0IG1vc3QgMiwgdGhlbiB1c2UKKyAqIHtAbGluayBVcFRvVHdvUG9zaXRpdmVJbnRPdXRwdXRzfSBpbnN0ZWFkIHNpbmNlIGl0IHN0b3JlcworICogdGhlIG91dHB1dHMgbW9yZSBjb21wYWN0bHkgKGJ5IHN0ZWFsaW5nIGEgYml0IGZyb20gZWFjaAorICogbG9uZyB2YWx1ZSkuCisgKgogICogPHA+Tk9URTogdGhpcyBjYW5ub3Qgd3JhcCBpdHNlbGYgKGllIHlvdSBjYW5ub3QgbWFrZSBhbgogICogRlNUIHdpdGggTGlzdCZsdDtMaXN0Jmx0O09iamVjdCZndDsmZ3Q7IG91dHB1dHMgdXNpbmcgdGhpcykuCiAgKgpkaWZmIC0tZ2l0IGEvbHVjZW5lL21pc2Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvVXBUb1R3b1Bvc2l0aXZlSW50T3V0cHV0cy5qYXZhIGIvbHVjZW5lL21pc2Mvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9mc3QvVXBUb1R3b1Bvc2l0aXZlSW50T3V0cHV0cy5qYXZhCmluZGV4IDA0Y2JiZjEuLjc4ZTI3MTUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9taXNjL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvZnN0L1VwVG9Ud29Qb3NpdGl2ZUludE91dHB1dHMuamF2YQorKysgYi9sdWNlbmUvbWlzYy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL2ZzdC9VcFRvVHdvUG9zaXRpdmVJbnRPdXRwdXRzLmphdmEKQEAgLTE3LDIxICsxNyw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKioKLSAqIEFuIEZTVCB7QGxpbmsgT3V0cHV0c30gaW1wbGVtZW50YXRpb24gd2hlcmUgZWFjaCBvdXRwdXQKLSAqIGlzIG9uZSBvciB0d28gbm9uLW5lZ2F0aXZlIGxvbmcgdmFsdWVzLiAgSWYgaXQncyBhCi0gKiBzaW5nbGUgb3V0cHV0LCBMb25nIGlzIHJldHVybmVkOyBlbHNlLCBUd29Mb25ncy4gIE9yZGVyCi0gKiBpcyBwcmVzZXJ2ZWQgaW4gdGhlIFR3b0xvbmdzIGNhc2UsIGllIC5maXJzdCBpcyB0aGUgZmlyc3QKLSAqIGlucHV0L291dHB1dCBhZGRlZCB0byBCdWlsZGVyLCBhbmQgLnNlY29uZCBpcyB0aGUKLSAqIHNlY29uZC4gIFlvdSBjYW5ub3Qgc3RvcmUgMCBvdXRwdXQgd2l0aCB0aGlzICh0aGF0J3MKLSAqIHJlc2VydmVkIHRvIG1lYW4gIm5vIG91dHB1dCIpIQotICoKLSAqIE5PVEU6IHRoZSByZXN1bHRpbmcgRlNUIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIG1pbmltYWwhCi0gKiBTZWUge0BsaW5rIEJ1aWxkZXJ9LgotICoKLSAqIEBsdWNlbmUuZXhwZXJpbWVudGFsCi0gKi8KLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EYXRhSW5wdXQ7CkBAIC00NiwxMSArMzEsMjEgQEAKICAqIHNlY29uZC4gIFlvdSBjYW5ub3Qgc3RvcmUgMCBvdXRwdXQgd2l0aCB0aGlzICh0aGF0J3MKICAqIHJlc2VydmVkIHRvIG1lYW4gIm5vIG91dHB1dCIpIQogICoKLSAqIE5PVEU6IHRoZSByZXN1bHRpbmcgRlNUIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIG1pbmltYWwhCisgKiA8cD5OT1RFOiB0aGUgb25seSB3YXkgdG8gY3JlYXRlIGEgVHdvTG9uZ3Mgb3V0cHV0IGlzIHRvCisgKiBhZGQgdGhlIHNhbWUgaW5wdXQgdG8gdGhlIEZTVCB0d2ljZSBpbiBhIHJvdy4gIFRoaXMgaXMKKyAqIGhvdyB0aGUgRlNUIG1hcHMgYSBzaW5nbGUgaW5wdXQgdG8gdHdvIG91dHB1dHMgKGUuZy4geW91CisgKiBjYW5ub3QgcGFzcyBhIFR3b0xvbmdzIHRvIHtAbGluayBCdWlsZGVyI2FkZH0uICBJZiB5b3UKKyAqIG5lZWQgbW9yZSB0aGFuIHR3byB0aGVuIHVzZSB7QGxpbmsgTGlzdE9mT3V0cHV0c30sIGJ1dCBpZgorICogeW91IG9ubHkgaGF2ZSBhdCBtb3N0IDIgdGhlbiB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwKKyAqIHJlcXVpcmUgZmV3ZXIgYnl0ZXMgYXMgaXQgc3RlYWxzIG9uZSBiaXQgZnJvbSBlYWNoIGxvbmcKKyAqIHZhbHVlLgorICoKKyAqIDxwPk5PVEU6IHRoZSByZXN1bHRpbmcgRlNUIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIG1pbmltYWwhCiAgKiBTZWUge0BsaW5rIEJ1aWxkZXJ9LgogICoKICAqIEBsdWNlbmUuZXhwZXJpbWVudGFsCiAgKi8KKwogcHVibGljIGZpbmFsIGNsYXNzIFVwVG9Ud29Qb3NpdGl2ZUludE91dHB1dHMgZXh0ZW5kcyBPdXRwdXRzPE9iamVjdD4gewogCiAgIC8qKiBIb2xkcyB0d28gbG9uZyBvdXRwdXRzLiAqLwpkaWZmIC0tZ2l0IGEvbHVjZW5lL21pc2Mvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4U3BsaXR0ZXIuamF2YSBiL2x1Y2VuZS9taXNjL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L1Rlc3RJbmRleFNwbGl0dGVyLmphdmEKaW5kZXggMWVkM2JmMS4uMDgwZjJmZSAxMDA2NDQKLS0tIGEvbHVjZW5lL21pc2Mvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvVGVzdEluZGV4U3BsaXR0ZXIuamF2YQorKysgYi9sdWNlbmUvbWlzYy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9UZXN0SW5kZXhTcGxpdHRlci5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAoKE1vY2tEaXJlY3RvcnlXcmFwcGVyKWZzRGlyKS5zZXRBc3NlcnROb1VucmVmZW5jZWRGaWxlc09uQ2xvc2UoZmFsc2UpOwogICAgIH0KIAotICAgIExvZ01lcmdlUG9saWN5IG1lcmdlUG9saWN5ID0gbmV3IExvZ0J5dGVTaXplTWVyZ2VQb2xpY3koKTsKKyAgICBNZXJnZVBvbGljeSBtZXJnZVBvbGljeSA9IG5ldyBMb2dCeXRlU2l6ZU1lcmdlUG9saWN5KCk7CiAgICAgbWVyZ2VQb2xpY3kuc2V0Tm9DRlNSYXRpbygxLjApOwogICAgIG1lcmdlUG9saWN5LnNldE1heENGU1NlZ21lbnRTaXplTUIoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICBJbmRleFdyaXRlciBpdyA9IG5ldyBJbmRleFdyaXRlcigKZGlmZiAtLWdpdCBhL2x1Y2VuZS9taXNjL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L3NvcnRlci9Tb3J0ZXJUZXN0QmFzZS5qYXZhIGIvbHVjZW5lL21pc2Mvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvc29ydGVyL1NvcnRlclRlc3RCYXNlLmphdmEKaW5kZXggMTU5N2M3MDMuLjM4NDU2YTUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9taXNjL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L3NvcnRlci9Tb3J0ZXJUZXN0QmFzZS5qYXZhCisrKyBiL2x1Y2VuZS9taXNjL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L3NvcnRlci9Tb3J0ZXJUZXN0QmFzZS5qYXZhCkBAIC05OCwxMyArOTgsOCBAQAogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhhY3RTaW1TY29yZXIgZXhhY3RTaW1TY29yZXIoU2ltV2VpZ2h0IHdlaWdodCwgQXRvbWljUmVhZGVyQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIGluLmV4YWN0U2ltU2NvcmVyKHdlaWdodCwgY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTbG9wcHlTaW1TY29yZXIgc2xvcHB5U2ltU2NvcmVyKFNpbVdlaWdodCB3ZWlnaHQsIEF0b21pY1JlYWRlckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBpbi5zbG9wcHlTaW1TY29yZXIod2VpZ2h0LCBjb250ZXh0KTsKKyAgICBwdWJsaWMgU2ltU2NvcmVyIHNpbVNjb3JlcihTaW1XZWlnaHQgd2VpZ2h0LCBBdG9taWNSZWFkZXJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gaW4uc2ltU2NvcmVyKHdlaWdodCwgY29udGV4dCk7CiAgICAgfQogICAgIAogICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvbWlzYy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9taXNjL1N3ZWV0U3BvdFNpbWlsYXJpdHlUZXN0LmphdmEgYi9sdWNlbmUvbWlzYy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9taXNjL1N3ZWV0U3BvdFNpbWlsYXJpdHlUZXN0LmphdmEKaW5kZXggZjIzOGJhNy4uZjVlMzVmMiAxMDA2NDQKLS0tIGEvbHVjZW5lL21pc2Mvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvbWlzYy9Td2VldFNwb3RTaW1pbGFyaXR5VGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9taXNjL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL21pc2MvU3dlZXRTcG90U2ltaWxhcml0eVRlc3QuamF2YQpAQCAtMjQ2LDcgKzI0Niw3IEBACiAgIAogICAgIFN3ZWV0U3BvdFNpbWlsYXJpdHkgc3MgPSBuZXcgU3dlZXRTcG90U2ltaWxhcml0eSgpIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCB0ZihpbnQgZnJlcSkgeworICAgICAgICBwdWJsaWMgZmxvYXQgdGYoZmxvYXQgZnJlcSkgewogICAgICAgICAgIHJldHVybiBoeXBlcmJvbGljVGYoZnJlcSk7CiAgICAgICAgIH0KICAgICAgIH07CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL0J5dGVGaWVsZFNvdXJjZS5qYXZhIGIvbHVjZW5lL3F1ZXJpZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi92YWx1ZXNvdXJjZS9CeXRlRmllbGRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2Njc5Ny4uMDAwMDAwMAotLS0gYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL0J5dGVGaWVsZFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZTsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguQXRvbWljUmVhZGVyQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLkZ1bmN0aW9uVmFsdWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlOwotCi0vKioKLSAqIE9idGFpbnMgaW50IGZpZWxkIHZhbHVlcyBmcm9tIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGV9Ci0gKiB1c2luZyA8Y29kZT5nZXRJbnRzKCk8L2NvZGU+Ci0gKiBhbmQgbWFrZXMgdGhvc2UgdmFsdWVzIGF2YWlsYWJsZSBhcyBvdGhlciBudW1lcmljIHR5cGVzLCBjYXN0aW5nIGFzIG5lZWRlZC4gKgotICoKLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVGaWVsZFNvdXJjZSBleHRlbmRzIEZpZWxkQ2FjaGVTb3VyY2UgewotCi0gIHByaXZhdGUgZmluYWwgRmllbGRDYWNoZS5CeXRlUGFyc2VyIHBhcnNlcjsKLQotICBwdWJsaWMgQnl0ZUZpZWxkU291cmNlKFN0cmluZyBmaWVsZCkgewotICAgIHRoaXMoZmllbGQsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIEJ5dGVGaWVsZFNvdXJjZShTdHJpbmcgZmllbGQsIEZpZWxkQ2FjaGUuQnl0ZVBhcnNlciBwYXJzZXIpIHsKLSAgICBzdXBlcihmaWVsZCk7Ci0gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gImJ5dGUoIiArIGZpZWxkICsgJyknOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBGdW5jdGlvblZhbHVlcyBnZXRWYWx1ZXMoTWFwIGNvbnRleHQsIEF0b21pY1JlYWRlckNvbnRleHQgcmVhZGVyQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBGaWVsZENhY2hlLkJ5dGVzIGFyciA9IGNhY2hlLmdldEJ5dGVzKHJlYWRlckNvbnRleHQucmVhZGVyKCksIGZpZWxkLCBwYXJzZXIsIGZhbHNlKTsKLSAgICAKLSAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVmFsdWVzKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIGFyci5nZXQoZG9jKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWwoaW50IGRvYykgewotICAgICAgICByZXR1cm4gKHNob3J0KSBhcnIuZ2V0KGRvYyk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIChmbG9hdCkgYXJyLmdldChkb2MpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgaW50VmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIChpbnQpIGFyci5nZXQoZG9jKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgbG9uZyBsb25nVmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIChsb25nKSBhcnIuZ2V0KGRvYyk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWwoaW50IGRvYykgewotICAgICAgICByZXR1cm4gKGRvdWJsZSkgYXJyLmdldChkb2MpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTdHJpbmcgc3RyVmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIEJ5dGUudG9TdHJpbmcoYXJyLmdldChkb2MpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uKCkgKyAnPScgKyBieXRlVmFsKGRvYyk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBvYmplY3RWYWwoaW50IGRvYykgewotICAgICAgICByZXR1cm4gYXJyLmdldChkb2MpOyAgLy8gVE9ETzogdmFsaWQ/Ci0gICAgICB9Ci0KLSAgICB9OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmIChvLmdldENsYXNzKCkgIT0gQnl0ZUZpZWxkU291cmNlLmNsYXNzKSByZXR1cm4gZmFsc2U7Ci0gICAgQnl0ZUZpZWxkU291cmNlCi0gICAgICAgICAgICBvdGhlciA9IChCeXRlRmllbGRTb3VyY2UpIG87Ci0gICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcikKLSAgICAgICYmICh0aGlzLnBhcnNlciA9PSBudWxsID8gb3RoZXIucGFyc2VyID09IG51bGwgOgotICAgICAgICAgIHRoaXMucGFyc2VyLmdldENsYXNzKCkgPT0gb3RoZXIucGFyc2VyLmdldENsYXNzKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGggPSBwYXJzZXIgPT0gbnVsbCA/IEJ5dGUuY2xhc3MuaGFzaENvZGUoKSA6IHBhcnNlci5nZXRDbGFzcygpLmhhc2hDb2RlKCk7Ci0gICAgaCArPSBzdXBlci5oYXNoQ29kZSgpOwotICAgIHJldHVybiBoOwotICB9Ci19CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL01heEZsb2F0RnVuY3Rpb24uamF2YSBiL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWF4RmxvYXRGdW5jdGlvbi5qYXZhCmluZGV4IDlmOTk4ZmQuLmQxZTFmNGYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWF4RmxvYXRGdW5jdGlvbi5qYXZhCisrKyBiL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWF4RmxvYXRGdW5jdGlvbi5qYXZhCkBAIC0yNywyMyArMjcsMTggQEAKICAgcHVibGljIE1heEZsb2F0RnVuY3Rpb24oVmFsdWVTb3VyY2VbXSBzb3VyY2VzKSB7CiAgICAgc3VwZXIoc291cmNlcyk7CiAgIH0KLQotICBAT3ZlcnJpZGUgIAorICAKKyAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSgpIHsKICAgICByZXR1cm4gIm1heCI7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIGZsb2F0IGZ1bmMoaW50IGRvYywgRnVuY3Rpb25WYWx1ZXNbXSB2YWxzQXJyKSB7Ci0gICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgZmxvYXQgdmFsID0gMC4wZjsKKyAgICBpZiAodmFsc0Fyci5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMGY7CisgICAgZmxvYXQgdmFsID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgZm9yIChGdW5jdGlvblZhbHVlcyB2YWxzIDogdmFsc0FycikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHZhbCA9IHZhbHMuZmxvYXRWYWwoZG9jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbCA9IE1hdGgubWF4KHZhbHMuZmxvYXRWYWwoZG9jKSx2YWwpOwotICAgICAgfQorICAgICAgdmFsID0gTWF0aC5tYXgodmFscy5mbG9hdFZhbChkb2MpLCB2YWwpOwogICAgIH0KICAgICByZXR1cm4gdmFsOwogICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL01pbkZsb2F0RnVuY3Rpb24uamF2YSBiL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWluRmxvYXRGdW5jdGlvbi5qYXZhCmluZGV4IGFiYWU5ODAuLjRjZjM1ODcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWluRmxvYXRGdW5jdGlvbi5qYXZhCisrKyBiL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTWluRmxvYXRGdW5jdGlvbi5qYXZhCkBAIC0zNSwxNSArMzUsMTAgQEAKIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIGZsb2F0IGZ1bmMoaW50IGRvYywgRnVuY3Rpb25WYWx1ZXNbXSB2YWxzQXJyKSB7Ci0gICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgZmxvYXQgdmFsID0gMC4wZjsKKyAgICBpZiAodmFsc0Fyci5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMGY7CisgICAgZmxvYXQgdmFsID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgZm9yIChGdW5jdGlvblZhbHVlcyB2YWxzIDogdmFsc0FycikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHZhbCA9IHZhbHMuZmxvYXRWYWwoZG9jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbCA9IE1hdGgubWluKHZhbHMuZmxvYXRWYWwoZG9jKSx2YWwpOwotICAgICAgfQorICAgICAgdmFsID0gTWF0aC5taW4odmFscy5mbG9hdFZhbChkb2MpLCB2YWwpOwogICAgIH0KICAgICByZXR1cm4gdmFsOwogICB9CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL05vcm1WYWx1ZVNvdXJjZS5qYXZhIGIvbHVjZW5lL3F1ZXJpZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi92YWx1ZXNvdXJjZS9Ob3JtVmFsdWVTb3VyY2UuamF2YQppbmRleCBiNzE5MjhjLi5jNmI4NmFlIDEwMDc1NQotLS0gYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL05vcm1WYWx1ZVNvdXJjZS5qYXZhCisrKyBiL2x1Y2VuZS9xdWVyaWVzL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vdmFsdWVzb3VyY2UvTm9ybVZhbHVlU291cmNlLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKiogCi0gKiBGdW5jdGlvbiB0aGF0IHJldHVybnMge0BsaW5rIFRGSURGU2ltaWxhcml0eSNkZWNvZGVOb3JtVmFsdWUoYnl0ZSl9CisgKiBGdW5jdGlvbiB0aGF0IHJldHVybnMge0BsaW5rIFRGSURGU2ltaWxhcml0eSNkZWNvZGVOb3JtVmFsdWUobG9uZyl9CiAgKiBmb3IgZXZlcnkgZG9jdW1lbnQuCiAgKiA8cD4KICAqIE5vdGUgdGhhdCB0aGUgY29uZmlndXJlZCBTaW1pbGFyaXR5IGZvciB0aGUgZmllbGQgbXVzdCBiZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJpZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi92YWx1ZXNvdXJjZS9TaG9ydEZpZWxkU291cmNlLmphdmEgYi9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL1Nob3J0RmllbGRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwOWViYi4uMDAwMDAwMAotLS0gYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL1Nob3J0RmllbGRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2U7Ci0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkF0b21pY1JlYWRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi5GdW5jdGlvblZhbHVlczsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZTsKLQotCi0vKioKLSAqIE9idGFpbnMgc2hvcnQgZmllbGQgdmFsdWVzIGZyb20gdGhlIHtAbGluayBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guRmllbGRDYWNoZX0KLSAqIHVzaW5nIDxjb2RlPmdldFNob3J0cygpPC9jb2RlPgotICogYW5kIG1ha2VzIHRob3NlIHZhbHVlcyBhdmFpbGFibGUgYXMgb3RoZXIgbnVtZXJpYyB0eXBlcywgY2FzdGluZyBhcyBuZWVkZWQuCi0gKiovCi1wdWJsaWMgY2xhc3MgU2hvcnRGaWVsZFNvdXJjZSBleHRlbmRzIEZpZWxkQ2FjaGVTb3VyY2UgewotCi0gIGZpbmFsIEZpZWxkQ2FjaGUuU2hvcnRQYXJzZXIgcGFyc2VyOwotCi0gIHB1YmxpYyBTaG9ydEZpZWxkU291cmNlKFN0cmluZyBmaWVsZCkgewotICAgIHRoaXMoZmllbGQsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIFNob3J0RmllbGRTb3VyY2UoU3RyaW5nIGZpZWxkLCBGaWVsZENhY2hlLlNob3J0UGFyc2VyIHBhcnNlcikgewotICAgIHN1cGVyKGZpZWxkKTsKLSAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiAic2hvcnQoIiArIGZpZWxkICsgJyknOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBGdW5jdGlvblZhbHVlcyBnZXRWYWx1ZXMoTWFwIGNvbnRleHQsIEF0b21pY1JlYWRlckNvbnRleHQgcmVhZGVyQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBGaWVsZENhY2hlLlNob3J0cyBhcnIgPSBjYWNoZS5nZXRTaG9ydHMocmVhZGVyQ29udGV4dC5yZWFkZXIoKSwgZmllbGQsIHBhcnNlciwgZmFsc2UpOwotICAgIAotICAgIHJldHVybiBuZXcgRnVuY3Rpb25WYWx1ZXMoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBieXRlIGJ5dGVWYWwoaW50IGRvYykgewotICAgICAgICByZXR1cm4gKGJ5dGUpIGFyci5nZXQoZG9jKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWwoaW50IGRvYykgewotICAgICAgICByZXR1cm4gYXJyLmdldChkb2MpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbChpbnQgZG9jKSB7Ci0gICAgICAgIHJldHVybiAoZmxvYXQpIGFyci5nZXQoZG9jKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IGludFZhbChpbnQgZG9jKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSBhcnIuZ2V0KGRvYyk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbChpbnQgZG9jKSB7Ci0gICAgICAgIHJldHVybiAobG9uZykgYXJyLmdldChkb2MpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsKGludCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIGFyci5nZXQoZG9jKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgU3RyaW5nIHN0clZhbChpbnQgZG9jKSB7Ci0gICAgICAgIHJldHVybiBTaG9ydC50b1N0cmluZyhhcnIuZ2V0KGRvYykpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGRvYykgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24oKSArICc9JyArIHNob3J0VmFsKGRvYyk7Ci0gICAgICB9Ci0KLSAgICB9OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmIChvLmdldENsYXNzKCkgIT0gU2hvcnRGaWVsZFNvdXJjZS5jbGFzcykgcmV0dXJuIGZhbHNlOwotICAgIFNob3J0RmllbGRTb3VyY2UKLSAgICAgICAgICAgIG90aGVyID0gKFNob3J0RmllbGRTb3VyY2UpIG87Ci0gICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvdGhlcikKLSAgICAgICYmICh0aGlzLnBhcnNlciA9PSBudWxsID8gb3RoZXIucGFyc2VyID09IG51bGwgOgotICAgICAgICAgIHRoaXMucGFyc2VyLmdldENsYXNzKCkgPT0gb3RoZXIucGFyc2VyLmdldENsYXNzKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGggPSBwYXJzZXIgPT0gbnVsbCA/IFNob3J0LmNsYXNzLmhhc2hDb2RlKCkgOiBwYXJzZXIuZ2V0Q2xhc3MoKS5oYXNoQ29kZSgpOwotICAgIGggKz0gc3VwZXIuaGFzaENvZGUoKTsKLSAgICByZXR1cm4gaDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJpZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi92YWx1ZXNvdXJjZS9URlZhbHVlU291cmNlLmphdmEgYi9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL1RGVmFsdWVTb3VyY2UuamF2YQppbmRleCAwZmM0ZmM5Li4xMjU1NGJlIDEwMDc1NQotLS0gYS9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL1RGVmFsdWVTb3VyY2UuamF2YQorKysgYi9sdWNlbmUvcXVlcmllcy9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL3ZhbHVlc291cmNlL1RGVmFsdWVTb3VyY2UuamF2YQpAQCAtMjksNyArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKiAKLSAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB7QGxpbmsgVEZJREZTaW1pbGFyaXR5I3RmKGludCl9CisgKiBGdW5jdGlvbiB0aGF0IHJldHVybnMge0BsaW5rIFRGSURGU2ltaWxhcml0eSN0ZihmbG9hdCl9CiAgKiBmb3IgZXZlcnkgZG9jdW1lbnQuCiAgKiA8cD4KICAqIE5vdGUgdGhhdCB0aGUgY29uZmlndXJlZCBTaW1pbGFyaXR5IGZvciB0aGUgZmllbGQgbXVzdCBiZQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9UZXN0Q3VzdG9tU2NvcmVRdWVyeS5qYXZhIGIvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9UZXN0Q3VzdG9tU2NvcmVRdWVyeS5qYXZhCmluZGV4IDQxYTkwM2UuLmQ5NzZkODAgMTAwNzU1Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvVGVzdEN1c3RvbVNjb3JlUXVlcnkuamF2YQorKysgYi9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL1Rlc3RDdXN0b21TY29yZVF1ZXJ5LmphdmEKQEAgLTUzLDI2ICs1Myw2IEBACiAgIH0KIAogICAvKioKLSAgICogVGVzdCB0aGF0IEN1c3RvbVNjb3JlUXVlcnkgb2YgVHlwZS5CWVRFIHJldHVybnMgdGhlIGV4cGVjdGVkIHNjb3Jlcy4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21TY29yZUJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBJTlQgZmllbGQgdmFsdWVzIGFyZSBzbWFsbCBlbm91Z2ggdG8gYmUgcGFyc2VkIGFzIGJ5dGUKLSAgICBkb1Rlc3RDdXN0b21TY29yZShCWVRFX1ZBTFVFU09VUkNFLCAxLjApOwotICAgIGRvVGVzdEN1c3RvbVNjb3JlKEJZVEVfVkFMVUVTT1VSQ0UsIDIuMCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IEN1c3RvbVNjb3JlUXVlcnkgb2YgVHlwZS5TSE9SVCByZXR1cm5zIHRoZSBleHBlY3RlZCBzY29yZXMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tU2NvcmVTaG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIElOVCBmaWVsZCB2YWx1ZXMgYXJlIHNtYWxsIGVub3VnaCB0byBiZSBwYXJzZWQgYXMgc2hvcnQKLSAgICBkb1Rlc3RDdXN0b21TY29yZShTSE9SVF9WQUxVRVNPVVJDRSwgMS4wKTsKLSAgICBkb1Rlc3RDdXN0b21TY29yZShTSE9SVF9WQUxVRVNPVVJDRSwgMy4wKTsKLSAgfQotCi0gIC8qKgogICAgKiBUZXN0IHRoYXQgQ3VzdG9tU2NvcmVRdWVyeSBvZiBUeXBlLklOVCByZXR1cm5zIHRoZSBleHBlY3RlZCBzY29yZXMuCiAgICAqLwogICBAVGVzdApkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi9GdW5jdGlvblRlc3RTZXR1cC5qYXZhIGIvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi9GdW5jdGlvblRlc3RTZXR1cC5qYXZhCmluZGV4IDQxNjk2N2YuLjRmM2MwMTIgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vRnVuY3Rpb25UZXN0U2V0dXAuamF2YQorKysgYi9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL0Z1bmN0aW9uVGVzdFNldHVwLmphdmEKQEAgLTEsMTggKzEsMjUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbjsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZsb2F0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuSW50RmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuVGV4dEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlJhbmRvbUluZGV4V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkLlN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuQnl0ZUZpZWxkU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlJhbmRvbUluZGV4V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zRW51bTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkZsb2F0RmllbGRTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5JbnRGaWVsZFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLlNob3J0RmllbGRTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKQEAgLTUzLDEwICs2MCwyMSBAQAogICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfRklFTEQgPSAiaWlpIjsKICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfRklFTEQgPSAiZmZmIjsKIAotICBwcm90ZWN0ZWQgVmFsdWVTb3VyY2UgQllURV9WQUxVRVNPVVJDRSA9IG5ldyBCeXRlRmllbGRTb3VyY2UoSU5UX0ZJRUxEKTsKLSAgcHJvdGVjdGVkIFZhbHVlU291cmNlIFNIT1JUX1ZBTFVFU09VUkNFID0gbmV3IFNob3J0RmllbGRTb3VyY2UoSU5UX0ZJRUxEKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGRDYWNoZS5GbG9hdFBhcnNlciBDVVNUT01fRkxPQVRfUEFSU0VSID0gbmV3IEZpZWxkQ2FjaGUuRmxvYXRQYXJzZXIoKSB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gRmllbGRDYWNoZS5OVU1FUklDX1VUSUxTX0lOVF9QQVJTRVIudGVybXNFbnVtKHRlcm1zKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IHBhcnNlRmxvYXQoQnl0ZXNSZWYgdGVybSkgeworICAgICAgcmV0dXJuIChmbG9hdCkgRmllbGRDYWNoZS5OVU1FUklDX1VUSUxTX0lOVF9QQVJTRVIucGFyc2VJbnQodGVybSk7CisgICAgfQorICB9OworCiAgIHByb3RlY3RlZCBWYWx1ZVNvdXJjZSBJTlRfVkFMVUVTT1VSQ0UgPSBuZXcgSW50RmllbGRTb3VyY2UoSU5UX0ZJRUxEKTsKLSAgcHJvdGVjdGVkIFZhbHVlU291cmNlIElOVF9BU19GTE9BVF9WQUxVRVNPVVJDRSA9IG5ldyBGbG9hdEZpZWxkU291cmNlKElOVF9GSUVMRCk7CisgIHByb3RlY3RlZCBWYWx1ZVNvdXJjZSBJTlRfQVNfRkxPQVRfVkFMVUVTT1VSQ0UgPSBuZXcgRmxvYXRGaWVsZFNvdXJjZShJTlRfRklFTEQsIENVU1RPTV9GTE9BVF9QQVJTRVIpOwogICBwcm90ZWN0ZWQgVmFsdWVTb3VyY2UgRkxPQVRfVkFMVUVTT1VSQ0UgPSBuZXcgRmxvYXRGaWVsZFNvdXJjZShGTE9BVF9GSUVMRCk7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19URVhUX0xJTkVTW10gPSB7CkBAIC0xNDAsMTAgKzE1OCwxMCBAQAogICAgIGYgPSBuZXdGaWVsZChURVhUX0ZJRUxELCAidGV4dCBvZiBkb2MiICsgc2NvcmVBbmRJRCArIHRleHRMaW5lKGkpLCBjdXN0b21UeXBlMik7IC8vIGZvciByZWd1bGFyIHNlYXJjaAogICAgIGQuYWRkKGYpOwogCi0gICAgZiA9IG5ld0ZpZWxkKElOVF9GSUVMRCwgIiIgKyBzY29yZUFuZElELCBjdXN0b21UeXBlKTsgLy8gZm9yIGZ1bmN0aW9uIHNjb3JpbmcKKyAgICBmID0gbmV3IEludEZpZWxkKElOVF9GSUVMRCwgc2NvcmVBbmRJRCwgU3RvcmUuWUVTKTsgLy8gZm9yIGZ1bmN0aW9uIHNjb3JpbmcKICAgICBkLmFkZChmKTsKIAotICAgIGYgPSBuZXdGaWVsZChGTE9BVF9GSUVMRCwgc2NvcmVBbmRJRCArICIuMDAwIiwgY3VzdG9tVHlwZSk7IC8vIGZvciBmdW5jdGlvbiBzY29yaW5nCisgICAgZiA9IG5ldyBGbG9hdEZpZWxkKEZMT0FUX0ZJRUxELCBzY29yZUFuZElELCBTdG9yZS5ZRVMpOyAvLyBmb3IgZnVuY3Rpb24gc2NvcmluZwogICAgIGQuYWRkKGYpOwogCiAgICAgaXcuYWRkRG9jdW1lbnQoZCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL1Rlc3RGaWVsZFNjb3JlUXVlcnkuamF2YSBiL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vVGVzdEZpZWxkU2NvcmVRdWVyeS5qYXZhCmluZGV4IDQxZDNjNTAuLjdhYWIxN2UgMTAwNzU1Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vVGVzdEZpZWxkU2NvcmVRdWVyeS5qYXZhCisrKyBiL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vVGVzdEZpZWxkU2NvcmVRdWVyeS5qYXZhCkBAIC0xOSwxMiArMTksNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguRGlyZWN0b3J5UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24uRnVuY3Rpb25RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLlZhbHVlU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuQnl0ZUZpZWxkU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuRmxvYXRGaWVsZFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkludEZpZWxkU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuU2hvcnRGaWVsZFNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guSW5kZXhTZWFyY2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guUXVlcnlVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU2NvcmVEb2M7CkBAIC01MCwyMCArNDQsNiBAQAogICAgIGNyZWF0ZUluZGV4KHRydWUpOwogICB9CiAKLSAgLyoqIFRlc3QgdGhhdCBGaWVsZFNjb3JlUXVlcnkgb2YgVHlwZS5CWVRFIHJldHVybnMgZG9jcyBpbiBleHBlY3RlZCBvcmRlci4gKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFJhbmtCeXRlICgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIElOVCBmaWVsZCB2YWx1ZXMgYXJlIHNtYWxsIGVub3VnaCB0byBiZSBwYXJzZWQgYXMgYnl0ZQotICAgIGRvVGVzdFJhbmsoQllURV9WQUxVRVNPVVJDRSk7Ci0gIH0KLQotICAvKiogVGVzdCB0aGF0IEZpZWxkU2NvcmVRdWVyeSBvZiBUeXBlLlNIT1JUIHJldHVybnMgZG9jcyBpbiBleHBlY3RlZCBvcmRlci4gKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFJhbmtTaG9ydCAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBJTlQgZmllbGQgdmFsdWVzIGFyZSBzbWFsbCBlbm91Z2ggdG8gYmUgcGFyc2VkIGFzIHNob3J0Ci0gICAgZG9UZXN0UmFuayhTSE9SVF9WQUxVRVNPVVJDRSk7Ci0gIH0KLQogICAvKiogVGVzdCB0aGF0IEZpZWxkU2NvcmVRdWVyeSBvZiBUeXBlLklOVCByZXR1cm5zIGRvY3MgaW4gZXhwZWN0ZWQgb3JkZXIuICovCiAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RSYW5rSW50ICgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtOTksMjAgKzc5LDYgQEAKICAgICByLmNsb3NlKCk7CiAgIH0KIAotICAvKiogVGVzdCB0aGF0IEZpZWxkU2NvcmVRdWVyeSBvZiBUeXBlLkJZVEUgcmV0dXJucyB0aGUgZXhwZWN0ZWQgc2NvcmVzLiAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RXhhY3RTY29yZUJ5dGUgKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gSU5UIGZpZWxkIHZhbHVlcyBhcmUgc21hbGwgZW5vdWdoIHRvIGJlIHBhcnNlZCBhcyBieXRlCi0gICAgZG9UZXN0RXhhY3RTY29yZShCWVRFX1ZBTFVFU09VUkNFKTsKLSAgfQotCi0gIC8qKiBUZXN0IHRoYXQgRmllbGRTY29yZVF1ZXJ5IG9mIFR5cGUuU0hPUlQgcmV0dXJucyB0aGUgZXhwZWN0ZWQgc2NvcmVzLiAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RXhhY3RTY29yZVNob3J0ICgpIHRocm93cyAgRXhjZXB0aW9uIHsKLSAgICAvLyBJTlQgZmllbGQgdmFsdWVzIGFyZSBzbWFsbCBlbm91Z2ggdG8gYmUgcGFyc2VkIGFzIHNob3J0Ci0gICAgZG9UZXN0RXhhY3RTY29yZShTSE9SVF9WQUxVRVNPVVJDRSk7Ci0gIH0KLQogICAvKiogVGVzdCB0aGF0IEZpZWxkU2NvcmVRdWVyeSBvZiBUeXBlLklOVCByZXR1cm5zIHRoZSBleHBlY3RlZCBzY29yZXMuICovCiAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RFeGFjdFNjb3JlSW50ICgpIHRocm93cyAgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vVGVzdEZ1bmN0aW9uUXVlcnlTb3J0LmphdmEgYi9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL1Rlc3RGdW5jdGlvblF1ZXJ5U29ydC5qYXZhCmluZGV4IDU3MjE4OGYuLjc2MGFhYjMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9xdWVyaWVzL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJpZXMvZnVuY3Rpb24vVGVzdEZ1bmN0aW9uUXVlcnlTb3J0LmphdmEKKysrIGIvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi9UZXN0RnVuY3Rpb25RdWVyeVNvcnQuamF2YQpAQCAtMTgsOSArMTgsMTAgQEAKICAqLwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LlN0cmluZ0ZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkludEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlJhbmRvbUluZGV4V3JpdGVyOwpAQCAtNDYsMTMgKzQ3LDEzIEBACiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXIsIGl3Yyk7CiAKICAgICBEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLSAgICBGaWVsZCBmaWVsZCA9IG5ldyBTdHJpbmdGaWVsZCgidmFsdWUiLCAiIiwgRmllbGQuU3RvcmUuWUVTKTsKKyAgICBGaWVsZCBmaWVsZCA9IG5ldyBJbnRGaWVsZCgidmFsdWUiLCAwLCBGaWVsZC5TdG9yZS5ZRVMpOwogICAgIGRvYy5hZGQoZmllbGQpOwogCiAgICAgLy8gU2F2ZSBkb2NzIHVuc29ydGVkIChkZWNyZWFzaW5nIHZhbHVlIG4sIG4tMSwgLi4uKQogICAgIGZpbmFsIGludCBOVU1fVkFMUyA9IDU7CiAgICAgZm9yIChpbnQgdmFsID0gTlVNX1ZBTFM7IHZhbCA+IDA7IHZhbC0tKSB7Ci0gICAgICBmaWVsZC5zZXRTdHJpbmdWYWx1ZShJbnRlZ2VyLnRvU3RyaW5nKHZhbCkpOworICAgICAgZmllbGQuc2V0SW50VmFsdWUodmFsKTsKICAgICAgIHdyaXRlci5hZGREb2N1bWVudChkb2MpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJpZXMvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcmllcy9mdW5jdGlvbi9UZXN0VmFsdWVTb3VyY2VzLmphdmEgYi9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL1Rlc3RWYWx1ZVNvdXJjZXMuamF2YQppbmRleCBjZDg1NmQzLi5lNzgxYjIyIDEwMDY0NAotLS0gYS9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL1Rlc3RWYWx1ZVNvdXJjZXMuamF2YQorKysgYi9sdWNlbmUvcXVlcmllcy9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyaWVzL2Z1bmN0aW9uL1Rlc3RWYWx1ZVNvdXJjZXMuamF2YQpAQCAtMjIsMTMgKzIyLDE2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG91YmxlRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmxvYXRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Mb25nRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU3RyaW5nRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuVGV4dEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4UmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlJhbmRvbUluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuQnl0ZUZpZWxkU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuQnl0ZXNSZWZGaWVsZFNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkNvbnN0VmFsdWVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5EaXZGbG9hdEZ1bmN0aW9uOwpAQCAtNTQsNyArNTcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuUmFuZ2VNYXBGbG9hdEZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuUmVjaXByb2NhbEZsb2F0RnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5TY2FsZUZsb2F0RnVuY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5TaG9ydEZpZWxkU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuU3VtRmxvYXRGdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLlN1bVRvdGFsVGVybUZyZXFWYWx1ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLlRGVmFsdWVTb3VyY2U7CkBAIC04NSw5ICs4Nyw5IEBACiAgIHN0YXRpYyBJbmRleFNlYXJjaGVyIHNlYXJjaGVyOwogICAKICAgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nW10+IGRvY3VtZW50cyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdW10gewotICAgICAgLyogICAgICAgICAgICAgaWQsICBieXRlLCBkb3VibGUsIGZsb2F0LCBpbnQsICAgIGxvbmcsIHNob3J0LCBzdHJpbmcsIHRleHQgKi8gCi0gICAgICBuZXcgU3RyaW5nW10geyAiMCIsICAiNSIsICIzLjYzIiwgIjUuMiIsICIzNSIsICI0MzQzIiwgIjk0NSIsICJ0ZXN0IiwgInRoaXMgaXMgYSB0ZXN0IHRlc3QgdGVzdCIgfSwKLSAgICAgIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjEyIiwgIjUuNjUiLCAiOS4zIiwgIjU0IiwgIjE5NTQiLCAiMTIzIiwgImJhciIsICAic2Vjb25kIHRlc3QiIH0sCisgICAgICAvKiAgICAgICAgICAgICBpZCwgIGRvdWJsZSwgZmxvYXQsIGludCwgIGxvbmcsICAgc3RyaW5nLCB0ZXh0ICovIAorICAgICAgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMy42MyIsICI1LjIiLCAiMzUiLCAiNDM0MyIsICJ0ZXN0IiwgInRoaXMgaXMgYSB0ZXN0IHRlc3QgdGVzdCIgfSwKKyAgICAgIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjUuNjUiLCAiOS4zIiwgIjU0IiwgIjE5NTQiLCAiYmFyIiwgICJzZWNvbmQgdGVzdCIgfSwKICAgfSk7CiAgIAogICBAQmVmb3JlQ2xhc3MKQEAgLTk5LDE4ICsxMDEsMTQgQEAKICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwogICAgIEZpZWxkIGlkRmllbGQgPSBuZXcgU3RyaW5nRmllbGQoImlkIiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2N1bWVudC5hZGQoaWRGaWVsZCk7Ci0gICAgRmllbGQgYnl0ZUZpZWxkID0gbmV3IFN0cmluZ0ZpZWxkKCJieXRlIiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKLSAgICBkb2N1bWVudC5hZGQoYnl0ZUZpZWxkKTsKLSAgICBGaWVsZCBkb3VibGVGaWVsZCA9IG5ldyBTdHJpbmdGaWVsZCgiZG91YmxlIiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKKyAgICBGaWVsZCBkb3VibGVGaWVsZCA9IG5ldyBEb3VibGVGaWVsZCgiZG91YmxlIiwgMGQsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2N1bWVudC5hZGQoZG91YmxlRmllbGQpOwotICAgIEZpZWxkIGZsb2F0RmllbGQgPSBuZXcgU3RyaW5nRmllbGQoImZsb2F0IiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKKyAgICBGaWVsZCBmbG9hdEZpZWxkID0gbmV3IEZsb2F0RmllbGQoImZsb2F0IiwgMGYsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2N1bWVudC5hZGQoZmxvYXRGaWVsZCk7Ci0gICAgRmllbGQgaW50RmllbGQgPSBuZXcgU3RyaW5nRmllbGQoImludCIsICIiLCBGaWVsZC5TdG9yZS5OTyk7CisgICAgRmllbGQgaW50RmllbGQgPSBuZXcgSW50RmllbGQoImludCIsIDAsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2N1bWVudC5hZGQoaW50RmllbGQpOwotICAgIEZpZWxkIGxvbmdGaWVsZCA9IG5ldyBTdHJpbmdGaWVsZCgibG9uZyIsICIiLCBGaWVsZC5TdG9yZS5OTyk7CisgICAgRmllbGQgbG9uZ0ZpZWxkID0gbmV3IExvbmdGaWVsZCgibG9uZyIsIDBMLCBGaWVsZC5TdG9yZS5OTyk7CiAgICAgZG9jdW1lbnQuYWRkKGxvbmdGaWVsZCk7Ci0gICAgRmllbGQgc2hvcnRGaWVsZCA9IG5ldyBTdHJpbmdGaWVsZCgic2hvcnQiLCAiIiwgRmllbGQuU3RvcmUuTk8pOwotICAgIGRvY3VtZW50LmFkZChzaG9ydEZpZWxkKTsKICAgICBGaWVsZCBzdHJpbmdGaWVsZCA9IG5ldyBTdHJpbmdGaWVsZCgic3RyaW5nIiwgIiIsIEZpZWxkLlN0b3JlLk5PKTsKICAgICBkb2N1bWVudC5hZGQoc3RyaW5nRmllbGQpOwogICAgIEZpZWxkIHRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQoInRleHQiLCAiIiwgRmllbGQuU3RvcmUuTk8pOwpAQCAtMTE4LDE0ICsxMTYsMTIgQEAKICAgICAKICAgICBmb3IgKFN0cmluZyBbXSBkb2MgOiBkb2N1bWVudHMpIHsKICAgICAgIGlkRmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzBdKTsKLSAgICAgIGJ5dGVGaWVsZC5zZXRTdHJpbmdWYWx1ZShkb2NbMV0pOwotICAgICAgZG91YmxlRmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzJdKTsKLSAgICAgIGZsb2F0RmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzNdKTsKLSAgICAgIGludEZpZWxkLnNldFN0cmluZ1ZhbHVlKGRvY1s0XSk7Ci0gICAgICBsb25nRmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzVdKTsKLSAgICAgIHNob3J0RmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzZdKTsKLSAgICAgIHN0cmluZ0ZpZWxkLnNldFN0cmluZ1ZhbHVlKGRvY1s3XSk7Ci0gICAgICB0ZXh0RmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzhdKTsKKyAgICAgIGRvdWJsZUZpZWxkLnNldERvdWJsZVZhbHVlKERvdWJsZS52YWx1ZU9mKGRvY1sxXSkpOworICAgICAgZmxvYXRGaWVsZC5zZXRGbG9hdFZhbHVlKEZsb2F0LnZhbHVlT2YoZG9jWzJdKSk7CisgICAgICBpbnRGaWVsZC5zZXRJbnRWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoZG9jWzNdKSk7CisgICAgICBsb25nRmllbGQuc2V0TG9uZ1ZhbHVlKExvbmcudmFsdWVPZihkb2NbNF0pKTsKKyAgICAgIHN0cmluZ0ZpZWxkLnNldFN0cmluZ1ZhbHVlKGRvY1s1XSk7CisgICAgICB0ZXh0RmllbGQuc2V0U3RyaW5nVmFsdWUoZG9jWzZdKTsKICAgICAgIGl3LmFkZERvY3VtZW50KGRvY3VtZW50KTsKICAgICB9CiAgICAgCkBAIC0xNDMsMTEgKzEzOSw2IEBACiAgICAgZGlyID0gbnVsbDsKICAgfQogICAKLSAgcHVibGljIHZvaWQgdGVzdEJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRIaXRzKG5ldyBGdW5jdGlvblF1ZXJ5KG5ldyBCeXRlRmllbGRTb3VyY2UoImJ5dGUiKSksCi0gICAgICAgIG5ldyBmbG9hdFtdIHsgNWYsIDEyZiB9KTsKLSAgfQotICAKICAgcHVibGljIHZvaWQgdGVzdENvbnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0SGl0cyhuZXcgRnVuY3Rpb25RdWVyeShuZXcgQ29uc3RWYWx1ZVNvdXJjZSgwLjNmKSksCiAgICAgICAgIG5ldyBmbG9hdFtdIHsgMC4zZiwgMC4zZiB9KTsKQEAgLTI5OCwxMSArMjg5LDYgQEAKICAgICAgICBuZXcgZmxvYXRbXSB7IDAuMGYsIDEuMGYgfSk7CiAgIH0KICAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEhpdHMobmV3IEZ1bmN0aW9uUXVlcnkobmV3IFNob3J0RmllbGRTb3VyY2UoInNob3J0IikpLAotICAgICAgICBuZXcgZmxvYXRbXSB7IDk0NWYsIDEyM2YgfSk7Ci0gIH0KLSAgCiAgIHB1YmxpYyB2b2lkIHRlc3RTdW1GbG9hdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGFzc2VydEhpdHMobmV3IEZ1bmN0aW9uUXVlcnkobmV3IFN1bUZsb2F0RnVuY3Rpb24obmV3IFZhbHVlU291cmNlW10gewogICAgICAgICBuZXcgQ29uc3RWYWx1ZVNvdXJjZSgxZiksIG5ldyBDb25zdFZhbHVlU291cmNlKDJmKX0pKSwKZGlmZiAtLWdpdCBhL2x1Y2VuZS9xdWVyeXBhcnNlci9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyeXBhcnNlci9mbGV4aWJsZS9jb3JlL2J1aWxkZXJzL1F1ZXJ5VHJlZUJ1aWxkZXIuamF2YSBiL2x1Y2VuZS9xdWVyeXBhcnNlci9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyeXBhcnNlci9mbGV4aWJsZS9jb3JlL2J1aWxkZXJzL1F1ZXJ5VHJlZUJ1aWxkZXIuamF2YQppbmRleCAyNWYyZWNkLi43ZmM5MTZlIDEwMDY0NAotLS0gYS9sdWNlbmUvcXVlcnlwYXJzZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcnlwYXJzZXIvZmxleGlibGUvY29yZS9idWlsZGVycy9RdWVyeVRyZWVCdWlsZGVyLmphdmEKKysrIGIvbHVjZW5lL3F1ZXJ5cGFyc2VyL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJ5cGFyc2VyL2ZsZXhpYmxlL2NvcmUvYnVpbGRlcnMvUXVlcnlUcmVlQnVpbGRlci5qYXZhCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgYnVpbGRlciA9IGdldFF1ZXJ5QnVpbGRlcihjbGF6eik7CiAKICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgIENsYXNzPD8+W10gY2xhc3NlcyA9IG5vZGUuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgQ2xhc3M8Pz5bXSBjbGFzc2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwogCiAgICAgICAgICAgZm9yIChDbGFzczw/PiBhY3R1YWxDbGFzcyA6IGNsYXNzZXMpIHsKICAgICAgICAgICAgIGJ1aWxkZXIgPSBnZXRRdWVyeUJ1aWxkZXIoYWN0dWFsQ2xhc3MpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3F1ZXJ5cGFyc2VyL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJ5cGFyc2VyL2ZsZXhpYmxlL3N0YW5kYXJkL1F1ZXJ5UGFyc2VyVXRpbC5qYXZhIGIvbHVjZW5lL3F1ZXJ5cGFyc2VyL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJ5cGFyc2VyL2ZsZXhpYmxlL3N0YW5kYXJkL1F1ZXJ5UGFyc2VyVXRpbC5qYXZhCmluZGV4IGI5YTdmZTYuLmZkMzYzZjUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9xdWVyeXBhcnNlci9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyeXBhcnNlci9mbGV4aWJsZS9zdGFuZGFyZC9RdWVyeVBhcnNlclV0aWwuamF2YQorKysgYi9sdWNlbmUvcXVlcnlwYXJzZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcnlwYXJzZXIvZmxleGlibGUvc3RhbmRhcmQvUXVlcnlQYXJzZXJVdGlsLmphdmEKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgaWYgKGMgPT0gJ1xcJyB8fCBjID09ICcrJyB8fCBjID09ICctJyB8fCBjID09ICchJyB8fCBjID09ICcoJyB8fCBjID09ICcpJwogICAgICAgICAgIHx8IGMgPT0gJzonIHx8IGMgPT0gJ14nIHx8IGMgPT0gJ1snIHx8IGMgPT0gJ10nIHx8IGMgPT0gJ1wiJwogICAgICAgICAgIHx8IGMgPT0gJ3snIHx8IGMgPT0gJ30nIHx8IGMgPT0gJ34nIHx8IGMgPT0gJyonIHx8IGMgPT0gJz8nCi0gICAgICAgICAgfHwgYyA9PSAnfCcgfHwgYyA9PSAnJicpIHsKKyAgICAgICAgICB8fCBjID09ICd8JyB8fCBjID09ICcmJyB8fCBjID09ICcvJykgewogICAgICAgICBzYi5hcHBlbmQoJ1xcJyk7CiAgICAgICB9CiAgICAgICBzYi5hcHBlbmQoYyk7CmRpZmYgLS1naXQgYS9sdWNlbmUvcXVlcnlwYXJzZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcnlwYXJzZXIvZmxleGlibGUvY29yZS9idWlsZGVycy9UZXN0UXVlcnlUcmVlQnVpbGRlci5qYXZhIGIvbHVjZW5lL3F1ZXJ5cGFyc2VyL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3F1ZXJ5cGFyc2VyL2ZsZXhpYmxlL2NvcmUvYnVpbGRlcnMvVGVzdFF1ZXJ5VHJlZUJ1aWxkZXIuamF2YQppbmRleCAyZmU1ZTkxLi5lODM3YTUzIDEwMDY0NAotLS0gYS9sdWNlbmUvcXVlcnlwYXJzZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcXVlcnlwYXJzZXIvZmxleGlibGUvY29yZS9idWlsZGVycy9UZXN0UXVlcnlUcmVlQnVpbGRlci5qYXZhCisrKyBiL2x1Y2VuZS9xdWVyeXBhcnNlci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9xdWVyeXBhcnNlci9mbGV4aWJsZS9jb3JlL2J1aWxkZXJzL1Rlc3RRdWVyeVRyZWVCdWlsZGVyLmphdmEKQEAgLTIyLDYgKzIyLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeXBhcnNlci5mbGV4aWJsZS5jb3JlLlF1ZXJ5Tm9kZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeXBhcnNlci5mbGV4aWJsZS5jb3JlLm5vZGVzLkZpZWxkUXVlcnlOb2RlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5cGFyc2VyLmZsZXhpYmxlLmNvcmUubm9kZXMuUXVlcnlOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5cGFyc2VyLmZsZXhpYmxlLmNvcmUubm9kZXMuUXVlcnlOb2RlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeXBhcnNlci5mbGV4aWJsZS5jb3JlLnBhcnNlci5Fc2NhcGVRdWVyeVN5bnRheDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeXBhcnNlci5mbGV4aWJsZS5jb3JlLnV0aWwuVW5lc2NhcGVkQ2hhclNlcXVlbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zNSw2ICszNywyOCBAQAogICAgIE9iamVjdCByZXN1bHQgPSBxdGIuYnVpbGQobmV3IEZpZWxkUXVlcnlOb2RlKG5ldyBVbmVzY2FwZWRDaGFyU2VxdWVuY2UoImZpZWxkIiksICJmb28iLCAwLCAwKSk7CiAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiT0siLCByZXN1bHQpOwogICAgIAorICAgIC8vIExVQ0VORS00ODkwCisgICAgcXRiID0gbmV3IFF1ZXJ5VHJlZUJ1aWxkZXIoKTsKKyAgICBxdGIuc2V0QnVpbGRlcihEdW1teVF1ZXJ5Tm9kZUludGVyZmFjZS5jbGFzcywgbmV3IER1bW15QnVpbGRlcigpKTsKKyAgICByZXN1bHQgPSBxdGIuYnVpbGQobmV3IER1bW15UXVlcnlOb2RlKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk9LIiwgcmVzdWx0KTsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIER1bW15UXVlcnlOb2RlSW50ZXJmYWNlIGV4dGVuZHMgUXVlcnlOb2RlIHsKKyAgICAKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REdW1teVF1ZXJ5Tm9kZSBleHRlbmRzIFF1ZXJ5Tm9kZUltcGwgaW1wbGVtZW50cyBEdW1teVF1ZXJ5Tm9kZUludGVyZmFjZSB7CisgICAgCisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15UXVlcnlOb2RlIGV4dGVuZHMgQWJzdHJhY3REdW1teVF1ZXJ5Tm9kZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHRvUXVlcnlTdHJpbmcoRXNjYXBlUXVlcnlTeW50YXggZXNjYXBlU3ludGF4UGFyc2VyKSB7CisgICAgICByZXR1cm4gIkR1bW15UXVlcnlOb2RlIjsKKyAgICB9CisgICAgCiAgIH0KICAgCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15QnVpbGRlciBpbXBsZW1lbnRzIFF1ZXJ5QnVpbGRlciB7CmRpZmYgLS1naXQgYS9sdWNlbmUvcmVwbGljYXRvci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9yZXBsaWNhdG9yL0xvY2FsUmVwbGljYXRvclRlc3QuamF2YSBiL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvTG9jYWxSZXBsaWNhdG9yVGVzdC5qYXZhCmluZGV4IDFmYjkxNTIuLmVmMjA5NjcgMTAwNzU1Ci0tLSBhL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvTG9jYWxSZXBsaWNhdG9yVGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvTG9jYWxSZXBsaWNhdG9yVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwpAQCAtMTU0LDcgKzE1NSw3IEBACiAgICAgdHJ5IHsKICAgICAgIHJlcGxpY2F0b3Iub2J0YWluRmlsZShyZXMuaWQsIHJlcy5zb3VyY2VGaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKSwgIm1hZGVVcEZpbGUiKTsKICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGZhaWxlZCBvYnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIGZpbGUiKTsKLSAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgewogICAgICAgLy8gZXhwZWN0ZWQKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvUmVwbGljYXRvclRlc3RDYXNlLmphdmEgYi9sdWNlbmUvcmVwbGljYXRvci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9yZXBsaWNhdG9yL1JlcGxpY2F0b3JUZXN0Q2FzZS5qYXZhCmluZGV4IDJkZTQyYWQuLmY2MjE0MDggMTAwNzU1Ci0tLSBhL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvUmVwbGljYXRvclRlc3RDYXNlLmphdmEKKysrIGIvbHVjZW5lL3JlcGxpY2F0b3Ivc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcmVwbGljYXRvci9SZXBsaWNhdG9yVGVzdENhc2UuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CkBAIC0xMjUsMTIgKzEyNCwxNCBAQAogICAgIHJldHVybiBzZXJ2ZXI7CiAgIH0KICAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZlcn0ncyBwb3J0LiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgbm8KLSAgICoge0BsaW5rIENvbm5lY3Rvcn1zIHdlcmUgYWRkZWQgdG8gdGhlIFNlcnZlciBiZXNpZGVzIHRoZSBkZWZhdWx0IG9uZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHNlcnZlclBvcnQoU2VydmVyIGh0dHBTZXJ2ZXIpIHsKLSAgICByZXR1cm4gaHR0cFNlcnZlci5nZXRDb25uZWN0b3JzKClbMF0uZ2V0TG9jYWxQb3J0KCk7CisgIC8qKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZlcn0ncyBwb3J0LiAqLworICBwdWJsaWMgc3RhdGljIGludCBzZXJ2ZXJQb3J0KFNlcnZlciBzZXJ2ZXIpIHsKKyAgICByZXR1cm4gc2VydmVyLmdldENvbm5lY3RvcnMoKVswXS5nZXRMb2NhbFBvcnQoKTsKKyAgfQorICAKKyAgLyoqIFJldHVybnMgYSB7QGxpbmsgU2VydmVyfSdzIGhvc3QuICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckhvc3QoU2VydmVyIHNlcnZlcikgeworICAgIHJldHVybiBzZXJ2ZXIuZ2V0Q29ubmVjdG9ycygpWzBdLmdldEhvc3QoKTsKICAgfQogICAKICAgLyoqCmRpZmYgLS1naXQgYS9sdWNlbmUvcmVwbGljYXRvci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9yZXBsaWNhdG9yL2h0dHAvSHR0cFJlcGxpY2F0b3JUZXN0LmphdmEgYi9sdWNlbmUvcmVwbGljYXRvci9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9yZXBsaWNhdG9yL2h0dHAvSHR0cFJlcGxpY2F0b3JUZXN0LmphdmEKaW5kZXggNzA1OWNjNi4uNDZiNTk0MiAxMDA3NTUKLS0tIGEvbHVjZW5lL3JlcGxpY2F0b3Ivc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvcmVwbGljYXRvci9odHRwL0h0dHBSZXBsaWNhdG9yVGVzdC5qYXZhCisrKyBiL2x1Y2VuZS9yZXBsaWNhdG9yL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3JlcGxpY2F0b3IvaHR0cC9IdHRwUmVwbGljYXRvclRlc3QuamF2YQpAQCAtNTAsNiArNTAsNyBAQAogICBwcml2YXRlIERpcmVjdG9yeVJlYWRlciByZWFkZXI7CiAgIHByaXZhdGUgU2VydmVyIHNlcnZlcjsKICAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgcHJpdmF0ZSBTdHJpbmcgaG9zdDsKICAgcHJpdmF0ZSBEaXJlY3Rvcnkgc2VydmVySW5kZXhEaXIsIGhhbmRsZXJJbmRleERpcjsKICAgCiAgIHByaXZhdGUgdm9pZCBzdGFydFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTksNiArNjAsNyBAQAogICAgIHJlcGxpY2F0aW9uSGFuZGxlci5hZGRTZXJ2bGV0V2l0aE1hcHBpbmcoc2VydmxldCwgUmVwbGljYXRpb25TZXJ2aWNlLlJFUExJQ0FUSU9OX0NPTlRFWFQgKyAiLyoiKTsKICAgICBzZXJ2ZXIgPSBuZXdIdHRwU2VydmVyKHJlcGxpY2F0aW9uSGFuZGxlcik7CiAgICAgcG9ydCA9IHNlcnZlclBvcnQoc2VydmVyKTsKKyAgICBob3N0ID0gc2VydmVySG9zdChzZXJ2ZXIpOwogICB9CiAgIAogICBAQmVmb3JlCkBAIC0xMDMsNyArMTA1LDcgQEAKICAgCiAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJlcGxpY2F0b3IgcmVwbGljYXRvciA9IG5ldyBIdHRwUmVwbGljYXRvcigibG9jYWxob3N0IiwgcG9ydCwgUmVwbGljYXRpb25TZXJ2aWNlLlJFUExJQ0FUSU9OX0NPTlRFWFQgKyAiL3MxIiwgCisgICAgUmVwbGljYXRvciByZXBsaWNhdG9yID0gbmV3IEh0dHBSZXBsaWNhdG9yKGhvc3QsIHBvcnQsIFJlcGxpY2F0aW9uU2VydmljZS5SRVBMSUNBVElPTl9DT05URVhUICsgIi9zMSIsIAogICAgICAgICBnZXRDbGllbnRDb25uZWN0aW9uTWFuYWdlcigpKTsKICAgICBSZXBsaWNhdGlvbkNsaWVudCBjbGllbnQgPSBuZXcgUmVwbGljYXRpb25DbGllbnQocmVwbGljYXRvciwgbmV3IEluZGV4UmVwbGljYXRpb25IYW5kbGVyKGhhbmRsZXJJbmRleERpciwgbnVsbCksIAogICAgICAgICBuZXcgUGVyU2Vzc2lvbkRpcmVjdG9yeUZhY3RvcnkoY2xpZW50V29ya0RpcikpOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3NhbmRib3gvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2FuZGJveC9xdWVyaWVzL1Nsb3dGdXp6eVRlcm1zRW51bS5qYXZhIGIvbHVjZW5lL3NhbmRib3gvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2FuZGJveC9xdWVyaWVzL1Nsb3dGdXp6eVRlcm1zRW51bS5qYXZhCmluZGV4IGRlODUzOWUuLmY2M2MxYTEgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9zYW5kYm94L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NhbmRib3gvcXVlcmllcy9TbG93RnV6enlUZXJtc0VudW0uamF2YQorKysgYi9sdWNlbmUvc2FuZGJveC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zYW5kYm94L3F1ZXJpZXMvU2xvd0Z1enp5VGVybXNFbnVtLmphdmEKQEAgLTMxLDkgKzMxLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5TdHJpbmdIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5Vbmljb2RlVXRpbDsKIAotLyoqIENsYXNzaWMgZnV6enkgVGVybXNFbnVtIGZvciBlbnVtZXJhdGluZyBhbGwgdGVybXMgdGhhdCBhcmUgc2ltaWxhcgorLyoqIFBvdGVudGlhbGx5IHNsb3cgZnV6enkgVGVybXNFbnVtIGZvciBlbnVtZXJhdGluZyBhbGwgdGVybXMgdGhhdCBhcmUgc2ltaWxhcgogICogdG8gdGhlIHNwZWNpZmllZCBmaWx0ZXIgdGVybS4KLSAqCisgKiA8cD4gSWYgdGhlIG1pblNpbWlsYXJpdHkgb3IgbWF4RWRpdHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBBdXRvbWF0b24ncworICogYWxsb3dhYmxlIHJhbmdlLCB0aGlzIGJhY2tzIG9mZiB0byB0aGUgY2xhc3NpYyAoYnJ1dGUgZm9yY2UpCisgKiBmdXp6eSB0ZXJtcyBlbnVtIG1ldGhvZCBieSBjYWxsaW5nIEZ1enp5VGVybXNFbnVtJ3MgZ2V0QXV0b21hdG9uRW51bS4KKyAqIDwvcD4KICAqIDxwPlRlcm0gZW51bWVyYXRpb25zIGFyZSBhbHdheXMgb3JkZXJlZCBieQogICoge0BsaW5rICNnZXRDb21wYXJhdG9yfS4gIEVhY2ggdGVybSBpbiB0aGUgZW51bWVyYXRpb24gaXMKICAqIGdyZWF0ZXIgdGhhbiBhbGwgdGhhdCBwcmVjZWRlIGl0LjwvcD4KQEAgLTEwMywxOCArMTA2LDQzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBJbnRzUmVmIHV0ZjMyID0gbmV3IEludHNSZWYoMjApOwogICAgIAogICAgIC8qKgotICAgICAqIFRoZSB0ZXJtQ29tcGFyZSBtZXRob2QgaW4gRnV6enlUZXJtRW51bSB1c2VzIExldmVuc2h0ZWluIGRpc3RhbmNlIHRvIAorICAgICAqIDxwPlRoZSB0ZXJtQ29tcGFyZSBtZXRob2QgaW4gRnV6enlUZXJtRW51bSB1c2VzIExldmVuc2h0ZWluIGRpc3RhbmNlIHRvIAogICAgICAqIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gdGVybSBhbmQgdGhlIGNvbXBhcmluZyB0ZXJtLiAKKyAgICAgKiA8L3A+CisgICAgICogPHA+SWYgdGhlIG1pblNpbWlsYXJpdHkgaXMgPj0gMS4wLCB0aGlzIHVzZXMgdGhlIG1heEVkaXRzIGFzIHRoZSBjb21wYXJpc29uLgorICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2QgdXNlcyB0aGUgZm9sbG93aW5nIGxvZ2ljIHRvIGNhbGN1bGF0ZSBzaW1pbGFyaXR5LgorICAgICAqIDxwcmU+CisgICAgICogICBzaW1pbGFyaXR5ID0gMSAtICgoZmxvYXQpZGlzdGFuY2UgLyAoZmxvYXQpIChwcmVmaXhMZW5ndGggKyBNYXRoLm1pbih0ZXh0bGVuLCB0YXJnZXRsZW4pKSk7CisgICAgICogICA8L3ByZT4KKyAgICAgKiB3aGVyZSBkaXN0YW5jZSBpcyB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgZm9yIHRoZSB0d28gd29yZHMuCisgICAgICogPC9wPgorICAgICAqIAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBmaW5hbCBBY2NlcHRTdGF0dXMgYWNjZXB0KEJ5dGVzUmVmIHRlcm0pIHsKICAgICAgIGlmIChTdHJpbmdIZWxwZXIuc3RhcnRzV2l0aCh0ZXJtLCBwcmVmaXhCeXRlc1JlZikpIHsKICAgICAgICAgVW5pY29kZVV0aWwuVVRGOHRvVVRGMzIodGVybSwgdXRmMzIpOwotICAgICAgICBmaW5hbCBmbG9hdCBzaW1pbGFyaXR5ID0gc2ltaWxhcml0eSh1dGYzMi5pbnRzLCByZWFsUHJlZml4TGVuZ3RoLCB1dGYzMi5sZW5ndGggLSByZWFsUHJlZml4TGVuZ3RoKTsKLSAgICAgICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7CisgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IGNhbGNEaXN0YW5jZSh1dGYzMi5pbnRzLCByZWFsUHJlZml4TGVuZ3RoLCB1dGYzMi5sZW5ndGggLSByZWFsUHJlZml4TGVuZ3RoKTsKKyAgICAgICAKKyAgICAgICAgLy9JbnRlZ2VyLk1JTl9WQUxVRSBpcyB0aGUgc2VudGluZWwgdGhhdCBMZXZlbnNodGVpbiBzdG9wcGVkIGVhcmx5CisgICAgICAgIGlmIChkaXN0YW5jZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSl7CisgICAgICAgICAgIHJldHVybiBBY2NlcHRTdGF0dXMuTk87CisgICAgICAgIH0KKyAgICAgICAgLy9ubyBuZWVkIHRvIGNhbGMgc2ltaWxhcml0eSwgaWYgcmF3IGlzIHRydWUgYW5kIGRpc3RhbmNlID4gbWF4RWRpdHMKKyAgICAgICAgaWYgKHJhdyA9PSB0cnVlICYmIGRpc3RhbmNlID4gbWF4RWRpdHMpeworICAgICAgICAgICAgICByZXR1cm4gQWNjZXB0U3RhdHVzLk5POworICAgICAgICB9IAorICAgICAgICBmaW5hbCBmbG9hdCBzaW1pbGFyaXR5ID0gY2FsY1NpbWlsYXJpdHkoZGlzdGFuY2UsICh1dGYzMi5sZW5ndGggLSByZWFsUHJlZml4TGVuZ3RoKSwgdGV4dC5sZW5ndGgpOworICAgICAgICAKKyAgICAgICAgLy9pZiByYXcgaXMgdHJ1ZSwgdGhlbiBkaXN0YW5jZSBtdXN0IGFsc28gYmUgPD0gbWF4RWRpdHMgYnkgbm93CisgICAgICAgIC8vZ2l2ZW4gdGhlIHByZXZpb3VzIGlmIHN0YXRlbWVudAorICAgICAgICBpZiAocmF3ID09IHRydWUgfHwKKyAgICAgICAgICAgICAgKHJhdyA9PSBmYWxzZSAmJiBzaW1pbGFyaXR5ID4gbWluU2ltaWxhcml0eSkpIHsKICAgICAgICAgICBib29zdEF0dC5zZXRCb29zdCgoc2ltaWxhcml0eSAtIG1pblNpbWlsYXJpdHkpICogc2NhbGVfZmFjdG9yKTsKICAgICAgICAgICByZXR1cm4gQWNjZXB0U3RhdHVzLllFUzsKLSAgICAgICAgfSBlbHNlIHJldHVybiBBY2NlcHRTdGF0dXMuTk87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBBY2NlcHRTdGF0dXMuTk87CisgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBY2NlcHRTdGF0dXMuRU5EOwogICAgICAgfQpAQCAtMTI1LDUyICsxNTMsMzQgQEAKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgIAogICAgIC8qKgotICAgICAqIDxwPlNpbWlsYXJpdHkgcmV0dXJucyBhIG51bWJlciB0aGF0IGlzIDEuMGYgb3IgbGVzcyAoaW5jbHVkaW5nIG5lZ2F0aXZlIG51bWJlcnMpCi0gICAgICogYmFzZWQgb24gaG93IHNpbWlsYXIgdGhlIFRlcm0gaXMgY29tcGFyZWQgdG8gYSB0YXJnZXQgdGVybS4gIEl0IHJldHVybnMKLSAgICAgKiBleGFjdGx5IDAuMGYgd2hlbgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZWRpdERpc3RhbmNlICZndDsgbWF4aW11bUVkaXREaXN0YW5jZTwvcHJlPgotICAgICAqIE90aGVyd2lzZSBpdCByZXR1cm5zOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgMSAtIChlZGl0RGlzdGFuY2UgLyBsZW5ndGgpPC9wcmU+Ci0gICAgICogd2hlcmUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IHRlcm0gKHRleHQgb3IgdGFyZ2V0KSBpbmNsdWRpbmcgYQotICAgICAqIHByZWZpeCB0aGF0IGFyZSBpZGVudGljYWwgYW5kIGVkaXREaXN0YW5jZSBpcyB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgZm9yCi0gICAgICogdGhlIHR3byB3b3Jkcy48L3A+Ci0gICAgICoKKyAgICAgKiA8cD5jYWxjRGlzdGFuY2UgcmV0dXJucyB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcXVlcnkgdGVybQorICAgICAqIGFuZCB0aGUgdGFyZ2V0IHRlcm0uPC9wPgorICAgICAqIAogICAgICAqIDxwPkVtYmVkZGVkIHdpdGhpbiB0aGlzIGFsZ29yaXRobSBpcyBhIGZhaWwtZmFzdCBMZXZlbnNodGVpbiBkaXN0YW5jZQogICAgICAqIGFsZ29yaXRobS4gIFRoZSBmYWlsLWZhc3QgYWxnb3JpdGhtIGRpZmZlcnMgZnJvbSB0aGUgc3RhbmRhcmQgTGV2ZW5zaHRlaW4KICAgICAgKiBkaXN0YW5jZSBhbGdvcml0aG0gaW4gdGhhdCBpdCBpcyBhYm9ydGVkIGlmIGl0IGlzIGRpc2NvdmVyZWQgdGhhdCB0aGUKICAgICAgKiBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHdvcmRzIGlzIGdyZWF0ZXIgdGhhbiBzb21lIHRocmVzaG9sZC4KLSAgICAgKgotICAgICAqIDxwPlRvIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBkaXN0YW5jZSB0aHJlc2hvbGQgd2UgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKLSAgICAgKiA8cHJlPgotICAgICAqICAgICAoMSAtIG1pbmltdW1TaW1pbGFyaXR5KSAqIGxlbmd0aDwvcHJlPgotICAgICAqIHdoZXJlIGxlbmd0aCBpcyB0aGUgc2hvcnRlc3QgdGVybSBpbmNsdWRpbmcgYW55IHByZWZpeCB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZQotICAgICAqIHNpbWlsYXJpdHkgY29tcGFyaXNvbi4gIFRoaXMgZm9ybXVsYSB3YXMgZGVyaXZlZCBieSBzb2x2aW5nIGZvciB3aGF0IG1heGltdW0gdmFsdWUKLSAgICAgKiBvZiBkaXN0YW5jZSByZXR1cm5zIGZhbHNlIGZvciB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHM6Ci0gICAgICogPHByZT4KLSAgICAgKiAgIHNpbWlsYXJpdHkgPSAxIC0gKChmbG9hdClkaXN0YW5jZSAvIChmbG9hdCkgKHByZWZpeExlbmd0aCArIE1hdGgubWluKHRleHRsZW4sIHRhcmdldGxlbikpKTsKLSAgICAgKiAgIHJldHVybiAoc2ltaWxhcml0eSA+IG1pbmltdW1TaW1pbGFyaXR5KTs8L3ByZT4KLSAgICAgKiB3aGVyZSBkaXN0YW5jZSBpcyB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgZm9yIHRoZSB0d28gd29yZHMuCi0gICAgICogPC9wPgorCiAgICAgICogPHA+TGV2ZW5zaHRlaW4gZGlzdGFuY2UgKGFsc28ga25vd24gYXMgZWRpdCBkaXN0YW5jZSkgaXMgYSBtZWFzdXJlIG9mIHNpbWlsYXJpdHkKICAgICAgKiBiZXR3ZWVuIHR3byBzdHJpbmdzIHdoZXJlIHRoZSBkaXN0YW5jZSBpcyBtZWFzdXJlZCBhcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcgogICAgICAqIGRlbGV0aW9ucywgaW5zZXJ0aW9ucyBvciBzdWJzdGl0dXRpb25zIHJlcXVpcmVkIHRvIHRyYW5zZm9ybSBvbmUgc3RyaW5nIHRvCiAgICAgICogdGhlIG90aGVyIHN0cmluZy4KICAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgd29yZCBvciBwaHJhc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzaW1pbGFyaXR5LCAgMC4wIG9yIGxlc3MgaW5kaWNhdGVzIHRoYXQgaXQgbWF0Y2hlcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkCi0gICAgICogdGhyZXNob2xkIGFuZCAxLjAgaW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgYW5kIHRhcmdldCBhcmUgaWRlbnRpY2FsCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBjb21wYXJpc29uCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHdoYXQncyBsZWZ0IG9mIHRoZSBzdHJpbmcgdG8gY29tcGFyZQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlZGl0cyBvciBJbnRlZ2VyLk1JTl9WQUxVRSBpZiB0aGUgZWRpdCBkaXN0YW5jZSBpcworICAgICAqIGdyZWF0ZXIgdGhhbiBtYXhEaXN0YW5jZS4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IHNpbWlsYXJpdHkoZmluYWwgaW50W10gdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2FsY0Rpc3RhbmNlKGZpbmFsIGludFtdIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgZmluYWwgaW50IG0gPSBsZW5ndGg7CiAgICAgICBmaW5hbCBpbnQgbiA9IHRleHQubGVuZ3RoOwogICAgICAgaWYgKG4gPT0gMCkgIHsKICAgICAgICAgLy93ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGNvbXBhcmUuICBUaGF0IG1lYW5zIGlmIHdlIGp1c3QgYWRkCiAgICAgICAgIC8vdGhlIGxldHRlcnMgZm9yIG0gd2UgZ2V0IHRoZSBuZXcgd29yZAotICAgICAgICByZXR1cm4gcmVhbFByZWZpeExlbmd0aCA9PSAwID8gMC4wZiA6IDEuMGYgLSAoKGZsb2F0KSBtIC8gcmVhbFByZWZpeExlbmd0aCk7CisgICAgICAgIHJldHVybiBtOwogICAgICAgfQogICAgICAgaWYgKG0gPT0gMCkgewotICAgICAgICByZXR1cm4gcmVhbFByZWZpeExlbmd0aCA9PSAwID8gMC4wZiA6IDEuMGYgLSAoKGZsb2F0KSBuIC8gcmVhbFByZWZpeExlbmd0aCk7CisgICAgICAgIHJldHVybiBuOwogICAgICAgfQogICAgICAgCiAgICAgICBmaW5hbCBpbnQgbWF4RGlzdGFuY2UgPSBjYWxjdWxhdGVNYXhEaXN0YW5jZShtKTsKQEAgLTE4Myw3ICsxOTMsNyBAQAogICAgICAgICAvL3doaWNoIGlzIDgtMyBvciBtb3JlIHByZWNpc2VseSBNYXRoLmFicygzLTgpLgogICAgICAgICAvL2lmIG91ciBtYXhpbXVtIGVkaXQgZGlzdGFuY2UgaXMgNCwgdGhlbiB3ZSBjYW4gZGlzY2FyZCB0aGlzIHdvcmQKICAgICAgICAgLy93aXRob3V0IGxvb2tpbmcgYXQgaXQuCi0gICAgICAgIHJldHVybiBGbG9hdC5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgfQogICAgICAgCiAgICAgICAvLyBpbml0IG1hdHJpeCBkCkBAIC0yMTQsNyArMjI0LDcgQEAKICAgICAgICAgaWYgKGogPiBtYXhEaXN0YW5jZSAmJiBiZXN0UG9zc2libGVFZGl0RGlzdGFuY2UgPiBtYXhEaXN0YW5jZSkgeyAgLy9lcXVhbCBpcyBva2F5LCBidXQgbm90IGdyZWF0ZXIKICAgICAgICAgICAvL3RoZSBjbG9zZXN0IHRoZSB0YXJnZXQgY2FuIGJlIHRvIHRoZSB0ZXh0IGlzIGp1c3QgdG9vIGZhciBhd2F5LgogICAgICAgICAgIC8vdGhpcyB0YXJnZXQgaXMgbGVhdmluZyB0aGUgcGFydHkgZWFybHkuCi0gICAgICAgICAgcmV0dXJuIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOworICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNvcHkgY3VycmVudCBkaXN0YW5jZSBjb3VudHMgdG8gJ3ByZXZpb3VzIHJvdycgZGlzdGFuY2UgY291bnRzOiBzd2FwIHAgYW5kIGQKQEAgLTIyNiwxMiArMjM2LDE3IEBACiAgICAgICAvLyBvdXIgbGFzdCBhY3Rpb24gaW4gdGhlIGFib3ZlIGxvb3Agd2FzIHRvIHN3aXRjaCBkIGFuZCBwLCBzbyBwIG5vdwogICAgICAgLy8gYWN0dWFsbHkgaGFzIHRoZSBtb3N0IHJlY2VudCBjb3N0IGNvdW50cwogCisgICAgICByZXR1cm4gcFtuXTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmbG9hdCBjYWxjU2ltaWxhcml0eShpbnQgZWRpdHMsIGludCBtLCBpbnQgbil7CiAgICAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIGxlc3MgdGhhbiAwLjAgd2hlbiB0aGUgZWRpdCBkaXN0YW5jZSBpcwogICAgICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc2hvcnRlciB3b3JkLgogICAgICAgLy8gYnV0IHRoaXMgd2FzIHRoZSBmb3JtdWxhIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZCBpbiBGdXp6eVRlcm1FbnVtLAogICAgICAgLy8gc28gaXQgaGFzIG5vdCBiZWVuIGNoYW5nZWQgKGV2ZW4gdGhvdWdoIG1pbmltdW1TaW1pbGFyaXR5IG11c3QgYmUKICAgICAgIC8vIGdyZWF0ZXIgdGhhbiAwLjApCi0gICAgICByZXR1cm4gMS4wZiAtICgoZmxvYXQpcFtuXSAvIChmbG9hdCkgKHJlYWxQcmVmaXhMZW5ndGggKyBNYXRoLm1pbihuLCBtKSkpOworICAgICAgCisgICAgICByZXR1cm4gMS4wZiAtICgoZmxvYXQpZWRpdHMgLyAoZmxvYXQpIChyZWFsUHJlZml4TGVuZ3RoICsgTWF0aC5taW4obiwgbSkpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sdWNlbmUvc2FuZGJveC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zYW5kYm94L3F1ZXJpZXMvVGVzdFNsb3dGdXp6eVF1ZXJ5LmphdmEgYi9sdWNlbmUvc2FuZGJveC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zYW5kYm94L3F1ZXJpZXMvVGVzdFNsb3dGdXp6eVF1ZXJ5LmphdmEKaW5kZXggYTRhMTI1ZC4uYzgyMzgwNyAxMDA2NDQKLS0tIGEvbHVjZW5lL3NhbmRib3gvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2FuZGJveC9xdWVyaWVzL1Rlc3RTbG93RnV6enlRdWVyeS5qYXZhCisrKyBiL2x1Y2VuZS9zYW5kYm94L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NhbmRib3gvcXVlcmllcy9UZXN0U2xvd0Z1enp5UXVlcnkuamF2YQpAQCAtNDMsNiArNDMsOSBAQAogcHVibGljIGNsYXNzIFRlc3RTbG93RnV6enlRdWVyeSBleHRlbmRzIEx1Y2VuZVRlc3RDYXNlIHsKIAogICBwdWJsaWMgdm9pZCB0ZXN0RnV6emluZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy9ldmVyeSB0ZXN0IHdpdGggU2xvd0Z1enp5UXVlcnkuZGVmYXVsdE1pblNpbWlsYXJpdHkKKyAgICAvL2lzIGV4ZXJjaXNpbmcgdGhlIEF1dG9tYXRvbiwgbm90IHRoZSBicnV0ZSBmb3JjZSBsaW5lYXIgbWV0aG9kCisgICAgCiAgICAgRGlyZWN0b3J5IGRpcmVjdG9yeSA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbUluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgZGlyZWN0b3J5KTsKICAgICBhZGREb2MoImFhYWFhIiwgd3JpdGVyKTsKQEAgLTE5NCw2ICsxOTcsMzAgQEAKICAgICBkaXJlY3RvcnkuY2xvc2UoKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RGdXp6aW5lc3NMb25nMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAvL0x1Y2VuZS01MDMzCisgICAgIERpcmVjdG9yeSBkaXJlY3RvcnkgPSBuZXdEaXJlY3RvcnkoKTsKKyAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXJlY3RvcnkpOworICAgICBhZGREb2MoImFiY2RlZiIsIHdyaXRlcik7CisgICAgIGFkZERvYygic2VnbWVudCIsIHdyaXRlcik7CisKKyAgICAgSW5kZXhSZWFkZXIgcmVhZGVyID0gd3JpdGVyLmdldFJlYWRlcigpOworICAgICBJbmRleFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3U2VhcmNoZXIocmVhZGVyKTsKKyAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgU2xvd0Z1enp5UXVlcnkgcXVlcnk7CisgICAgIAorICAgICBxdWVyeSA9IG5ldyBTbG93RnV6enlRdWVyeShuZXcgVGVybSgiZmllbGQiLCAiYWJjeHh4eCIpLCAzZiwgMCk7ICAgCisgICAgIFNjb3JlRG9jW10gaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxdWVyeSwgbnVsbCwgMTAwMCkuc2NvcmVEb2NzOworICAgICBhc3NlcnRFcXVhbHMoMCwgaGl0cy5sZW5ndGgpOworICAgICAKKyAgICAgcXVlcnkgPSBuZXcgU2xvd0Z1enp5UXVlcnkobmV3IFRlcm0oImZpZWxkIiwgImFiY3h4eHgiKSwgNGYsIDApOyAgIAorICAgICBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5LCBudWxsLCAxMDAwKS5zY29yZURvY3M7CisgICAgIGFzc2VydEVxdWFscygxLCBoaXRzLmxlbmd0aCk7CisgICAgIHJlYWRlci5jbG9zZSgpOworICAgICBkaXJlY3RvcnkuY2xvc2UoKTsKKyAgfQorICAKICAgcHVibGljIHZvaWQgdGVzdEZ1enppbmVzc0xvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBEaXJlY3RvcnkgZGlyZWN0b3J5ID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IFJhbmRvbUluZGV4V3JpdGVyKHJhbmRvbSgpLCBkaXJlY3RvcnkpOwpAQCAtMzg1LDcgKzQxMiw2IEBACiAgIAogICBwdWJsaWMgdm9pZCB0ZXN0R2lnYSgpIHRocm93cyBFeGNlcHRpb24gewogCi0gICAgTW9ja0FuYWx5emVyIGFuYWx5emVyID0gbmV3IE1vY2tBbmFseXplcihyYW5kb20oKSk7CiAgICAgRGlyZWN0b3J5IGluZGV4ID0gbmV3RGlyZWN0b3J5KCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgdyA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kb20oKSwgaW5kZXgpOwogCkBAIC00NDAsMjUgKzQ2NiwyMSBAQAogICAgIGFzc2VydEVxdWFscygxLCBoaXRzLmxlbmd0aCk7CiAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBzZWFyY2hlci5kb2MoaGl0c1swXS5kb2MpLmdldCgiZmllbGQiKSk7CiAgICAgCi0gICAgLy8gVE9ETzogY2Fubm90IHJlYWxseSBiZSBzdXBwb3J0ZWQgZ2l2ZW4gdGhlIGxlZ2FjeSBzY29yaW5nCi0gICAgLy8gc3lzdGVtIHdoaWNoIHNjb3JlcyBuZWdhdGl2ZSwgaWYgdGhlIGRpc3RhbmNlID4gbWluIHRlcm0gbGVuLAotICAgIC8vIHNvIHN1Y2ggbWF0Y2hlcyB3ZXJlIGFsd2F5cyBpbXBvc3NpYmxlIHdpdGggbHVjZW5lIDMueCwgZXRjCi0gICAgLy8KLSAgICAvL3EgPSBuZXcgU2xvd0Z1enp5UXVlcnkobmV3IFRlcm0oImZpZWxkIiwgInQiKSwgMyk7Ci0gICAgLy9oaXRzID0gc2VhcmNoZXIuc2VhcmNoKHEsIDEwKS5zY29yZURvY3M7Ci0gICAgLy9hc3NlcnRFcXVhbHMoMSwgaGl0cy5sZW5ndGgpOwotICAgIC8vYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgc2VhcmNoZXIuZG9jKGhpdHNbMF0uZG9jKS5nZXQoImZpZWxkIikpOworICAgIHEgPSBuZXcgU2xvd0Z1enp5UXVlcnkobmV3IFRlcm0oImZpZWxkIiwgInQiKSwgMyk7CisgICAgaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxLCAxMCkuc2NvcmVEb2NzOworICAgIGFzc2VydEVxdWFscygxLCBoaXRzLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgc2VhcmNoZXIuZG9jKGhpdHNbMF0uZG9jKS5nZXQoImZpZWxkIikpOwogICAgIAotICAgIC8vIHEgPSBuZXcgU2xvd0Z1enp5UXVlcnkobmV3IFRlcm0oImZpZWxkIiwgImEiKSwgNGYsIDAsIDUwKTsKLSAgICAvLyBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHEsIDEwKS5zY29yZURvY3M7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKDEsIGhpdHMubGVuZ3RoKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoInRlc3QiLCBzZWFyY2hlci5kb2MoaGl0c1swXS5kb2MpLmdldCgiZmllbGQiKSk7CisgICAgcSA9IG5ldyBTbG93RnV6enlRdWVyeShuZXcgVGVybSgiZmllbGQiLCAiYSIpLCA0ZiwgMCwgNTApOworICAgIGhpdHMgPSBzZWFyY2hlci5zZWFyY2gocSwgMTApLnNjb3JlRG9jczsKKyAgICBhc3NlcnRFcXVhbHMoMSwgaGl0cy5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscygidGVzdCIsIHNlYXJjaGVyLmRvYyhoaXRzWzBdLmRvYykuZ2V0KCJmaWVsZCIpKTsKICAgICAKLSAgICAvLyBxID0gbmV3IFNsb3dGdXp6eVF1ZXJ5KG5ldyBUZXJtKCJmaWVsZCIsICJhIiksIDZmLCAwLCA1MCk7Ci0gICAgLy8gaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxLCAxMCkuc2NvcmVEb2NzOwotICAgIC8vIGFzc2VydEVxdWFscygyLCBoaXRzLmxlbmd0aCk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgc2VhcmNoZXIuZG9jKGhpdHNbMF0uZG9jKS5nZXQoImZpZWxkIikpOwotICAgIC8vIGFzc2VydEVxdWFscygiZm9vYmFyIiwgc2VhcmNoZXIuZG9jKGhpdHNbMV0uZG9jKS5nZXQoImZpZWxkIikpOworICAgIHEgPSBuZXcgU2xvd0Z1enp5UXVlcnkobmV3IFRlcm0oImZpZWxkIiwgImEiKSwgNmYsIDAsIDUwKTsKKyAgICBoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHEsIDEwKS5zY29yZURvY3M7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGhpdHMubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBzZWFyY2hlci5kb2MoaGl0c1swXS5kb2MpLmdldCgiZmllbGQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBzZWFyY2hlci5kb2MoaGl0c1sxXS5kb2MpLmdldCgiZmllbGQiKSk7CiAgICAgCiAgICAgcmVhZGVyLmNsb3NlKCk7CiAgICAgaW5kZXguY2xvc2UoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9zcGF0aWFsL2J1aWxkLnhtbCBiL2x1Y2VuZS9zcGF0aWFsL2J1aWxkLnhtbAppbmRleCAzNzUwNWU2Li40NjNhZTQzIDEwMDY0NAotLS0gYS9sdWNlbmUvc3BhdGlhbC9idWlsZC54bWwKKysrIGIvbHVjZW5lL3NwYXRpYWwvYnVpbGQueG1sCkBAIC0xLDQgKzEsMjIgQEAKIDw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CiA8cHJvamVjdCBuYW1lPSJzcGF0aWFsIiBkZWZhdWx0PSJkZWZhdWx0Ij4KICAgPGRlc2NyaXB0aW9uPgogICAgIEdlb3NwYXRpYWwgc2VhcmNoCmRpZmYgLS1naXQgYS9sdWNlbmUvc3BhdGlhbC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zcGF0aWFsL3ByZWZpeC9Db250YWluc1ByZWZpeFRyZWVGaWx0ZXIuamF2YSBiL2x1Y2VuZS9zcGF0aWFsL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NwYXRpYWwvcHJlZml4L0NvbnRhaW5zUHJlZml4VHJlZUZpbHRlci5qYXZhCmluZGV4IDc0ZjBhNjguLmJkMGU5NTQgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9zcGF0aWFsL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NwYXRpYWwvcHJlZml4L0NvbnRhaW5zUHJlZml4VHJlZUZpbHRlci5qYXZhCisrKyBiL2x1Y2VuZS9zcGF0aWFsL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NwYXRpYWwvcHJlZml4L0NvbnRhaW5zUHJlZml4VHJlZUZpbHRlci5qYXZhCkBAIC00MSw4ICs0MSwzNSBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29udGFpbnNQcmVmaXhUcmVlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmaXhUcmVlRmlsdGVyIHsKIAotICBwdWJsaWMgQ29udGFpbnNQcmVmaXhUcmVlRmlsdGVyKFNoYXBlIHF1ZXJ5U2hhcGUsIFN0cmluZyBmaWVsZE5hbWUsIFNwYXRpYWxQcmVmaXhUcmVlIGdyaWQsIGludCBkZXRhaWxMZXZlbCkgeworICAvKgorICBGdXR1cmUgb3B0aW1pemF0aW9uczoKKyAgICBJbnN0ZWFkIG9mIHNlZWtFeGFjdCwgdXNlIHNlZWtDZWlsIHdpdGggc29tZSBsZWFwLWZyb2dnaW5nLCBsaWtlIEludGVyc2VjdHMgZG9lcy4KKyAgKi8KKworICAvKioKKyAgICogSWYgdGhlIHNwYXRpYWwgZGF0YSBmb3IgYSBkb2N1bWVudCBpcyBjb21wcmlzZWQgb2YgbXVsdGlwbGUgb3ZlcmxhcHBpbmcgb3IgYWRqYWNlbnQgcGFydHMsCisgICAqIGl0IG1pZ2h0IGZhaWwgdG8gbWF0Y2ggYSBxdWVyeSBzaGFwZSB3aGVuIGRvaW5nIHRoZSBDT05UQUlOUyBwcmVkaWNhdGUgd2hlbiB0aGUgc3VtIG9mCisgICAqIHRob3NlIHNoYXBlcyBjb250YWluIHRoZSBxdWVyeSBzaGFwZSBidXQgbm9uZSBkbyBpbmRpdmlkdWFsbHkuICBTZXQgdGhpcyB0byBmYWxzZSB0bworICAgKiBpbmNyZWFzZSBwZXJmb3JtYW5jZSBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGNpcmN1bXN0YW5jZSAoc3VjaCBhcyBpZiB5b3VyIGluZGV4ZWQKKyAgICogZGF0YSBkb2Vzbid0IGV2ZW4gaGF2ZSBzdWNoIGNvbmRpdGlvbnMpLiAgU2VlIExVQ0VORS01MDYyLgorICAgKi8KKyAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXM7CisKKyAgcHVibGljIENvbnRhaW5zUHJlZml4VHJlZUZpbHRlcihTaGFwZSBxdWVyeVNoYXBlLCBTdHJpbmcgZmllbGROYW1lLCBTcGF0aWFsUHJlZml4VHJlZSBncmlkLCBpbnQgZGV0YWlsTGV2ZWwsIGJvb2xlYW4gbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXMpIHsKICAgICBzdXBlcihxdWVyeVNoYXBlLCBmaWVsZE5hbWUsIGdyaWQsIGRldGFpbExldmVsKTsKKyAgICB0aGlzLm11bHRpT3ZlcmxhcHBpbmdJbmRleGVkU2hhcGVzID0gbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYgKCFzdXBlci5lcXVhbHMobykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG11bHRpT3ZlcmxhcHBpbmdJbmRleGVkU2hhcGVzID09ICgoQ29udGFpbnNQcmVmaXhUcmVlRmlsdGVyKW8pLm11bHRpT3ZlcmxhcHBpbmdJbmRleGVkU2hhcGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgKyAobXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXMgPyAxIDogMCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY1LDE4ICs5MiwyNSBAQAogICAgICAgaWYgKHRlcm1zRW51bSA9PSBudWxsKS8vc2lnbmFscyBhbGwgZG9uZQogICAgICAgICByZXR1cm4gbnVsbDsKIAotICAgICAgLy9MZWFmIGRvY3MgbWF0Y2ggYWxsIHF1ZXJ5IHNoYXBlCisgICAgICAvLyBMZWFmIGRvY3MgbWF0Y2ggYWxsIHF1ZXJ5IHNoYXBlCiAgICAgICBTbWFsbERvY1NldCBsZWFmRG9jcyA9IGdldExlYWZEb2NzKGNlbGwsIGFjY2VwdENvbnRhaW5zKTsKIAotICAgICAgLy8gR2V0IHRoZSBBTkQgb2YgYWxsIGNoaWxkIHJlc3VsdHMKKyAgICAgIC8vIEdldCB0aGUgQU5EIG9mIGFsbCBjaGlsZCByZXN1bHRzIChpbnRvIGNvbWJpbmVkU3ViUmVzdWx0cykKICAgICAgIFNtYWxsRG9jU2V0IGNvbWJpbmVkU3ViUmVzdWx0cyA9IG51bGw7Ci0gICAgICBDb2xsZWN0aW9uPENlbGw+IHN1YkNlbGxzID0gY2VsbC5nZXRTdWJDZWxscyhxdWVyeVNoYXBlKTsKKyAgICAgIC8vICAgT3B0aW1pemF0aW9uOiB1c2UgbnVsbCBzdWJDZWxsc0ZpbHRlciB3aGVuIHdlIGtub3cgY2VsbCBpcyB3aXRoaW4gdGhlIHF1ZXJ5IHNoYXBlLgorICAgICAgU2hhcGUgc3ViQ2VsbHNGaWx0ZXIgPSBxdWVyeVNoYXBlOworICAgICAgaWYgKGNlbGwuZ2V0TGV2ZWwoKSAhPSAwICYmICgoY2VsbC5nZXRTaGFwZVJlbCgpID09IG51bGwgfHwgY2VsbC5nZXRTaGFwZVJlbCgpID09IFNwYXRpYWxSZWxhdGlvbi5XSVRISU4pKSkgeworICAgICAgICBzdWJDZWxsc0ZpbHRlciA9IG51bGw7CisgICAgICAgIGFzc2VydCBjZWxsLmdldFNoYXBlKCkucmVsYXRlKHF1ZXJ5U2hhcGUpID09IFNwYXRpYWxSZWxhdGlvbi5XSVRISU47CisgICAgICB9CisgICAgICBDb2xsZWN0aW9uIDxDZWxsPiBzdWJDZWxscyA9IGNlbGwuZ2V0U3ViQ2VsbHMoc3ViQ2VsbHNGaWx0ZXIpOwogICAgICAgZm9yIChDZWxsIHN1YkNlbGwgOiBzdWJDZWxscykgewogICAgICAgICBpZiAoIXNlZWtFeGFjdChzdWJDZWxsKSkKICAgICAgICAgICBjb21iaW5lZFN1YlJlc3VsdHMgPSBudWxsOwogICAgICAgICBlbHNlIGlmIChzdWJDZWxsLmdldExldmVsKCkgPT0gZGV0YWlsTGV2ZWwpCiAgICAgICAgICAgY29tYmluZWRTdWJSZXN1bHRzID0gZ2V0RG9jcyhzdWJDZWxsLCBhY2NlcHRDb250YWlucyk7Ci0gICAgICAgIGVsc2UgaWYgKHN1YkNlbGwuZ2V0U2hhcGVSZWwoKSA9PSBTcGF0aWFsUmVsYXRpb24uV0lUSElOKQorICAgICAgICBlbHNlIGlmICghbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXMgJiYKKyAgICAgICAgICAgIHN1YkNlbGwuZ2V0U2hhcGVSZWwoKSA9PSBTcGF0aWFsUmVsYXRpb24uV0lUSElOKQogICAgICAgICAgIGNvbWJpbmVkU3ViUmVzdWx0cyA9IGdldExlYWZEb2NzKHN1YkNlbGwsIGFjY2VwdENvbnRhaW5zKTsKICAgICAgICAgZWxzZQogICAgICAgICAgIGNvbWJpbmVkU3ViUmVzdWx0cyA9IHZpc2l0KHN1YkNlbGwsIGFjY2VwdENvbnRhaW5zKTsgLy9yZWN1cnNpb24KQEAgLTkwLDcgKzEyNCw3IEBACiAgICAgICBpZiAoY29tYmluZWRTdWJSZXN1bHRzICE9IG51bGwpIHsKICAgICAgICAgaWYgKGxlYWZEb2NzID09IG51bGwpCiAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVkU3ViUmVzdWx0czsKLSAgICAgICAgcmV0dXJuIGxlYWZEb2NzLnVuaW9uKGNvbWJpbmVkU3ViUmVzdWx0cyk7CisgICAgICAgIHJldHVybiBsZWFmRG9jcy51bmlvbihjb21iaW5lZFN1YlJlc3VsdHMpOy8vdW5pb24gaXMgJ29yJwogICAgICAgfQogICAgICAgcmV0dXJuIGxlYWZEb2NzOwogICAgIH0KQEAgLTEwOSw4ICsxNDMsMTIgQEAKICAgICAgIHJldHVybiBjb2xsZWN0RG9jcyhhY2NlcHRDb250YWlucyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBDZWxsIGxhc3RMZWFmID0gbnVsbDsvL2p1c3QgZm9yIGFzc2VydGlvbgorCiAgICAgcHJpdmF0ZSBTbWFsbERvY1NldCBnZXRMZWFmRG9jcyhDZWxsIGxlYWZDZWxsLCBCaXRzIGFjY2VwdENvbnRhaW5zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgYXNzZXJ0IG5ldyBCeXRlc1JlZihsZWFmQ2VsbC5nZXRUb2tlbkJ5dGVzKCkpLmVxdWFscyh0ZXJtQnl0ZXMpOworICAgICAgYXNzZXJ0ICEgbGVhZkNlbGwuZXF1YWxzKGxhc3RMZWFmKTsvL2Rvbid0IGNhbGwgZm9yIHNhbWUgbGVhZiBhZ2FpbgorICAgICAgbGFzdExlYWYgPSBsZWFmQ2VsbDsKIAogICAgICAgQnl0ZXNSZWYgbmV4dFRlcm0gPSB0ZXJtc0VudW0ubmV4dCgpOwogICAgICAgaWYgKG5leHRUZXJtID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9zcGF0aWFsL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NwYXRpYWwvcHJlZml4L1JlY3Vyc2l2ZVByZWZpeFRyZWVTdHJhdGVneS5qYXZhIGIvbHVjZW5lL3NwYXRpYWwvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3BhdGlhbC9wcmVmaXgvUmVjdXJzaXZlUHJlZml4VHJlZVN0cmF0ZWd5LmphdmEKaW5kZXggNmM1MzY0YS4uYjJkYjI5NiAxMDA2NDQKLS0tIGEvbHVjZW5lL3NwYXRpYWwvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3BhdGlhbC9wcmVmaXgvUmVjdXJzaXZlUHJlZml4VHJlZVN0cmF0ZWd5LmphdmEKKysrIGIvbHVjZW5lL3NwYXRpYWwvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3BhdGlhbC9wcmVmaXgvUmVjdXJzaXZlUHJlZml4VHJlZVN0cmF0ZWd5LmphdmEKQEAgLTM4LDYgKzM4LDEzIEBACiAKICAgcHJpdmF0ZSBpbnQgcHJlZml4R3JpZFNjYW5MZXZlbDsKIAorICAvKiogVHJ1ZSBpZiBvbmx5IGluZGV4ZWQgcG9pbnRzIHNoYWxsIGJlIHN1cHBvcnRlZC4gIFNlZQorICAgKiAge0BsaW5rIEludGVyc2VjdHNQcmVmaXhUcmVlRmlsdGVyI2hhc0luZGV4ZWRMZWF2ZXN9LiAqLworICBwcm90ZWN0ZWQgYm9vbGVhbiBwb2ludHNPbmx5ID0gZmFsc2U7CisKKyAgLyoqIFNlZSB7QGxpbmsgQ29udGFpbnNQcmVmaXhUcmVlRmlsdGVyI211bHRpT3ZlcmxhcHBpbmdJbmRleGVkU2hhcGVzfS4gKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXMgPSB0cnVlOworCiAgIHB1YmxpYyBSZWN1cnNpdmVQcmVmaXhUcmVlU3RyYXRlZ3koU3BhdGlhbFByZWZpeFRyZWUgZ3JpZCwgU3RyaW5nIGZpZWxkTmFtZSkgewogICAgIHN1cGVyKGdyaWQsIGZpZWxkTmFtZSwKICAgICAgICAgdHJ1ZSk7Ly9zaW1wbGlmeSBpbmRleGVkIGNlbGxzCkBAIC02OSwxOCArNzYsMTcgQEAKIAogICAgIFNoYXBlIHNoYXBlID0gYXJncy5nZXRTaGFwZSgpOwogICAgIGludCBkZXRhaWxMZXZlbCA9IGdyaWQuZ2V0TGV2ZWxGb3JEaXN0YW5jZShhcmdzLnJlc29sdmVEaXN0RXJyKGN0eCwgZGlzdEVyclBjdCkpOwotICAgIGZpbmFsIGJvb2xlYW4gaGFzSW5kZXhlZExlYXZlcyA9IHRydWU7CiAKLSAgICBpZiAob3AgPT0gU3BhdGlhbE9wZXJhdGlvbi5JbnRlcnNlY3RzKSB7CisgICAgaWYgKHBvaW50c09ubHkgfHwgb3AgPT0gU3BhdGlhbE9wZXJhdGlvbi5JbnRlcnNlY3RzKSB7CiAgICAgICByZXR1cm4gbmV3IEludGVyc2VjdHNQcmVmaXhUcmVlRmlsdGVyKAotICAgICAgICAgIHNoYXBlLCBnZXRGaWVsZE5hbWUoKSwgZ3JpZCwgZGV0YWlsTGV2ZWwsIHByZWZpeEdyaWRTY2FuTGV2ZWwsCi0gICAgICAgICAgaGFzSW5kZXhlZExlYXZlcyk7CisgICAgICAgICAgc2hhcGUsIGdldEZpZWxkTmFtZSgpLCBncmlkLCBkZXRhaWxMZXZlbCwgcHJlZml4R3JpZFNjYW5MZXZlbCwgIXBvaW50c09ubHkpOwogICAgIH0gZWxzZSBpZiAob3AgPT0gU3BhdGlhbE9wZXJhdGlvbi5Jc1dpdGhpbikgewogICAgICAgcmV0dXJuIG5ldyBXaXRoaW5QcmVmaXhUcmVlRmlsdGVyKAogICAgICAgICAgIHNoYXBlLCBnZXRGaWVsZE5hbWUoKSwgZ3JpZCwgZGV0YWlsTGV2ZWwsIHByZWZpeEdyaWRTY2FuTGV2ZWwsCiAgICAgICAgICAgLTEpOy8vLTEgZmxhZyBpcyBzbG93ZXIgYnV0IGVuc3VyZXMgY29ycmVjdCByZXN1bHRzCiAgICAgfSBlbHNlIGlmIChvcCA9PSBTcGF0aWFsT3BlcmF0aW9uLkNvbnRhaW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IENvbnRhaW5zUHJlZml4VHJlZUZpbHRlcihzaGFwZSwgZ2V0RmllbGROYW1lKCksIGdyaWQsIGRldGFpbExldmVsKTsKKyAgICAgIHJldHVybiBuZXcgQ29udGFpbnNQcmVmaXhUcmVlRmlsdGVyKHNoYXBlLCBnZXRGaWVsZE5hbWUoKSwgZ3JpZCwgZGV0YWlsTGV2ZWwsCisgICAgICAgICAgbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXMpOwogICAgIH0KICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRTcGF0aWFsT3BlcmF0aW9uKG9wKTsKICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3NwYXRpYWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc3BhdGlhbC9wcmVmaXgvU3BhdGlhbE9wUmVjdXJzaXZlUHJlZml4VHJlZVRlc3QuamF2YSBiL2x1Y2VuZS9zcGF0aWFsL3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NwYXRpYWwvcHJlZml4L1NwYXRpYWxPcFJlY3Vyc2l2ZVByZWZpeFRyZWVUZXN0LmphdmEKaW5kZXggOGM2YTMxNy4uY2JlYzBlMiAxMDA2NDQKLS0tIGEvbHVjZW5lL3NwYXRpYWwvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc3BhdGlhbC9wcmVmaXgvU3BhdGlhbE9wUmVjdXJzaXZlUHJlZml4VHJlZVRlc3QuamF2YQorKysgYi9sdWNlbmUvc3BhdGlhbC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zcGF0aWFsL3ByZWZpeC9TcGF0aWFsT3BSZWN1cnNpdmVQcmVmaXhUcmVlVGVzdC5qYXZhCkBAIC0xMTAsNiArMTEwLDE4IEBACiAgICAgZG9UZXN0KFNwYXRpYWxPcGVyYXRpb24uSXNEaXNqb2ludFRvKTsKICAgfQogCisgIC8qKiBTZWUgTFVDRU5FLTUwNjIsIHtAbGluayBDb250YWluc1ByZWZpeFRyZWVGaWx0ZXIjbXVsdGlPdmVybGFwcGluZ0luZGV4ZWRTaGFwZXN9LiAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNQYWlyT3ZlcmxhcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbXlTZXR1cCgzKTsKKyAgICBhZG9jKCIwIiwgbmV3IFNoYXBlUGFpcihjdHgubWFrZVJlY3RhbmdsZSgwLCAzMywgLTEyOCwgMTI4KSwgY3R4Lm1ha2VSZWN0YW5nbGUoMzMsIDEyOCwgLTEyOCwgMTI4KSwgdHJ1ZSkpOworICAgIGNvbW1pdCgpOworICAgIFF1ZXJ5IHF1ZXJ5ID0gc3RyYXRlZ3kubWFrZVF1ZXJ5KG5ldyBTcGF0aWFsQXJncyhTcGF0aWFsT3BlcmF0aW9uLkNvbnRhaW5zLAorICAgICAgICBjdHgubWFrZVJlY3RhbmdsZSgwLCAxMjgsIC0xNiwgMTI4KSkpOworICAgIFNlYXJjaFJlc3VsdHMgc2VhcmNoUmVzdWx0cyA9IGV4ZWN1dGVRdWVyeShxdWVyeSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHNlYXJjaFJlc3VsdHMubnVtRm91bmQpOworICB9CisKICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdFdpdGhpbkRpc2pvaW50UGFydHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIG15U2V0dXAoNyk7CkBAIC0xODQsMTAgKzE5NiwxMCBAQAogICAgICAgU2hhcGUgaW5kZXhlZFNoYXBlOwogICAgICAgU2hhcGUgaW5kZXhlZFNoYXBlR1M7IC8vKGdyaWQtc25hcHBlZCkKICAgICAgIGludCBSID0gcmFuZG9tKCkubmV4dEludCgxMik7Ci0gICAgICBpZiAoUiA9PSAwKSB7Ly8xIGluIDEwCisgICAgICBpZiAoUiA9PSAwKSB7Ly8xIGluIDEyCiAgICAgICAgIGluZGV4ZWRTaGFwZSA9IG51bGw7IC8vbm8gc2hhcGUgZm9yIHRoaXMgZG9jCiAgICAgICAgIGluZGV4ZWRTaGFwZUdTID0gbnVsbDsKLSAgICAgIH0gZWxzZSBpZiAoUiAlIDQgPT0gMCkgey8vMyBpbiAxMgorICAgICAgfSBlbHNlIGlmIChSICUgMyA9PSAwKSB7Ly80LTEgaW4gMTIKICAgICAgICAgLy9jb21wcmlzZWQgb2YgbW9yZSB0aGFuIG9uZSBzaGFwZQogICAgICAgICBSZWN0YW5nbGUgc2hhcGUxID0gcmFuZG9tUmVjdGFuZ2xlKCk7CiAgICAgICAgIFJlY3RhbmdsZSBzaGFwZTIgPSByYW5kb21SZWN0YW5nbGUoKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS9zdWdnZXN0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2FuYWx5emluZy9BbmFseXppbmdTdWdnZXN0ZXIuamF2YSBiL2x1Y2VuZS9zdWdnZXN0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2FuYWx5emluZy9BbmFseXppbmdTdWdnZXN0ZXIuamF2YQppbmRleCA2NmMyNWQ3Li42ZTc5N2FkIDEwMDY0NAotLS0gYS9sdWNlbmUvc3VnZ2VzdC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3VnZ2VzdC9hbmFseXppbmcvQW5hbHl6aW5nU3VnZ2VzdGVyLmphdmEKKysrIGIvbHVjZW5lL3N1Z2dlc3Qvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3N1Z2dlc3QvYW5hbHl6aW5nL0FuYWx5emluZ1N1Z2dlc3Rlci5qYXZhCkBAIC01MTIsNyArNTEyLDcgQEAKIAogICAgICAgcmVhZGVyID0gbmV3IFNvcnQuQnl0ZVNlcXVlbmNlc1JlYWRlcih0ZW1wU29ydGVkKTsKICAgICAgCi0gICAgICBQYWlyT3V0cHV0czxMb25nLEJ5dGVzUmVmPiBvdXRwdXRzID0gbmV3IFBhaXJPdXRwdXRzPExvbmcsQnl0ZXNSZWY+KFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSksIEJ5dGVTZXF1ZW5jZU91dHB1dHMuZ2V0U2luZ2xldG9uKCkpOworICAgICAgUGFpck91dHB1dHM8TG9uZyxCeXRlc1JlZj4gb3V0cHV0cyA9IG5ldyBQYWlyT3V0cHV0czxMb25nLEJ5dGVzUmVmPihQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCksIEJ5dGVTZXF1ZW5jZU91dHB1dHMuZ2V0U2luZ2xldG9uKCkpOwogICAgICAgQnVpbGRlcjxQYWlyPExvbmcsQnl0ZXNSZWY+PiBidWlsZGVyID0gbmV3IEJ1aWxkZXI8UGFpcjxMb25nLEJ5dGVzUmVmPj4oRlNULklOUFVUX1RZUEUuQllURTEsIG91dHB1dHMpOwogCiAgICAgICAvLyBCdWlsZCBGU1Q6CkBAIC02MzQsNyArNjM0LDcgQEAKICAgcHVibGljIGJvb2xlYW4gbG9hZChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBEYXRhSW5wdXQgZGF0YUluID0gbmV3IElucHV0U3RyZWFtRGF0YUlucHV0KGlucHV0KTsKICAgICB0cnkgewotICAgICAgdGhpcy5mc3QgPSBuZXcgRlNUPFBhaXI8TG9uZyxCeXRlc1JlZj4+KGRhdGFJbiwgbmV3IFBhaXJPdXRwdXRzPExvbmcsQnl0ZXNSZWY+KFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSksIEJ5dGVTZXF1ZW5jZU91dHB1dHMuZ2V0U2luZ2xldG9uKCkpKTsKKyAgICAgIHRoaXMuZnN0ID0gbmV3IEZTVDxQYWlyPExvbmcsQnl0ZXNSZWY+PihkYXRhSW4sIG5ldyBQYWlyT3V0cHV0czxMb25nLEJ5dGVzUmVmPihQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKCksIEJ5dGVTZXF1ZW5jZU91dHB1dHMuZ2V0U2luZ2xldG9uKCkpKTsKICAgICAgIG1heEFuYWx5emVkUGF0aHNGb3JPbmVJbnB1dCA9IGRhdGFJbi5yZWFkVkludCgpOwogICAgICAgaGFzUGF5bG9hZHMgPSBkYXRhSW4ucmVhZEJ5dGUoKSA9PSAxOwogICAgIH0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9sdWNlbmUvc3VnZ2VzdC9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3VnZ2VzdC9mc3QvV0ZTVENvbXBsZXRpb25Mb29rdXAuamF2YSBiL2x1Y2VuZS9zdWdnZXN0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2ZzdC9XRlNUQ29tcGxldGlvbkxvb2t1cC5qYXZhCmluZGV4IDdiOGQ3ODIuLmY2MzRiZWUgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9zdWdnZXN0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2ZzdC9XRlNUQ29tcGxldGlvbkxvb2t1cC5qYXZhCisrKyBiL2x1Y2VuZS9zdWdnZXN0L3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2ZzdC9XRlNUQ29tcGxldGlvbkxvb2t1cC5qYXZhCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICBUZXJtRnJlcUl0ZXJhdG9yIGl0ZXIgPSBuZXcgV0ZTVFRlcm1GcmVxSXRlcmF0b3JXcmFwcGVyKGl0ZXJhdG9yKTsKICAgICBJbnRzUmVmIHNjcmF0Y2hJbnRzID0gbmV3IEludHNSZWYoKTsKICAgICBCeXRlc1JlZiBwcmV2aW91cyA9IG51bGw7Ci0gICAgUG9zaXRpdmVJbnRPdXRwdXRzIG91dHB1dHMgPSBQb3NpdGl2ZUludE91dHB1dHMuZ2V0U2luZ2xldG9uKHRydWUpOworICAgIFBvc2l0aXZlSW50T3V0cHV0cyBvdXRwdXRzID0gUG9zaXRpdmVJbnRPdXRwdXRzLmdldFNpbmdsZXRvbigpOwogICAgIEJ1aWxkZXI8TG9uZz4gYnVpbGRlciA9IG5ldyBCdWlsZGVyPExvbmc+KEZTVC5JTlBVVF9UWVBFLkJZVEUxLCBvdXRwdXRzKTsKICAgICB3aGlsZSAoKHNjcmF0Y2ggPSBpdGVyLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgbG9uZyBjb3N0ID0gaXRlci53ZWlnaHQoKTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gbG9hZChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgdGhpcy5mc3QgPSBuZXcgRlNUPExvbmc+KG5ldyBJbnB1dFN0cmVhbURhdGFJbnB1dChpbnB1dCksIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24odHJ1ZSkpOworICAgICAgdGhpcy5mc3QgPSBuZXcgRlNUPExvbmc+KG5ldyBJbnB1dFN0cmVhbURhdGFJbnB1dChpbnB1dCksIFBvc2l0aXZlSW50T3V0cHV0cy5nZXRTaW5nbGV0b24oKSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIElPVXRpbHMuY2xvc2UoaW5wdXQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS9zdWdnZXN0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2FuYWx5emluZy9BbmFseXppbmdTdWdnZXN0ZXJUZXN0LmphdmEgYi9sdWNlbmUvc3VnZ2VzdC9zcmMvdGVzdC9vcmcvYXBhY2hlL2x1Y2VuZS9zZWFyY2gvc3VnZ2VzdC9hbmFseXppbmcvQW5hbHl6aW5nU3VnZ2VzdGVyVGVzdC5qYXZhCmluZGV4IDE1NTQ0NjkuLjgwM2M1ZDkgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS9zdWdnZXN0L3NyYy90ZXN0L29yZy9hcGFjaGUvbHVjZW5lL3NlYXJjaC9zdWdnZXN0L2FuYWx5emluZy9BbmFseXppbmdTdWdnZXN0ZXJUZXN0LmphdmEKKysrIGIvbHVjZW5lL3N1Z2dlc3Qvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9sdWNlbmUvc2VhcmNoL3N1Z2dlc3QvYW5hbHl6aW5nL0FuYWx5emluZ1N1Z2dlc3RlclRlc3QuamF2YQpAQCAtMTE2NCw0ICsxMTY0LDMzIEBACiAgICAgYXNzZXJ0RXF1YWxzKCJbaXNsYSBkZSBtdWVydGEvOCwgaSBsb3ZlIGx1Y3kvN10iLCBzdWdnZXN0ZXIubG9va3VwKCJpIiwgZmFsc2UsIDMpLnRvU3RyaW5nKCkpOwogICAgIGFzc2VydEVxdWFscygiW2kgbG92ZSBsdWN5LzddIiwgc3VnZ2VzdGVyLmxvb2t1cCgiaSAiLCBmYWxzZSwgMykudG9TdHJpbmcoKSk7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VG9vTWFueUV4cGFuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIEFuYWx5emVyIGEgPSBuZXcgQW5hbHl6ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVG9rZW5TdHJlYW1Db21wb25lbnRzIGNyZWF0ZUNvbXBvbmVudHMoU3RyaW5nIGZpZWxkTmFtZSwgUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgIFRva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgTW9ja1Rva2VuaXplcihyZWFkZXIsIE1vY2tUb2tlbml6ZXIuU0lNUExFLCB0cnVlKTsKKyAgICAgICAgCisgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbUNvbXBvbmVudHModG9rZW5pemVyKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUb2tlblN0cmVhbSBnZXRUb2tlblN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgVG9rZW4gYSA9IG5ldyBUb2tlbigiYSIsIDAsIDEpOworICAgICAgICAgICAgICBhLnNldFBvc2l0aW9uSW5jcmVtZW50KDEpOworICAgICAgICAgICAgICBUb2tlbiBiID0gbmV3IFRva2VuKCJiIiwgMCwgMSk7CisgICAgICAgICAgICAgIGIuc2V0UG9zaXRpb25JbmNyZW1lbnQoMCk7CisgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FubmVkVG9rZW5TdHJlYW0obmV3IFRva2VuW10ge2EsIGJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZWFkZXIoZmluYWwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9CisgICAgICB9OworCisgICAgQW5hbHl6aW5nU3VnZ2VzdGVyIHN1Z2dlc3RlciA9IG5ldyBBbmFseXppbmdTdWdnZXN0ZXIoYSwgYSwgMCwgMjU2LCAxKTsKKyAgICBzdWdnZXN0ZXIuYnVpbGQobmV3IFRlcm1GcmVxQXJyYXlJdGVyYXRvcihuZXcgVGVybUZyZXFbXSB7bmV3IFRlcm1GcmVxKCJhIiwgMSl9KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJbYS8xXSIsIHN1Z2dlc3Rlci5sb29rdXAoImEiLCBmYWxzZSwgMSkudG9TdHJpbmcoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvRmFzdENvbXByZXNzaW5nQ29kZWMuamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvRmFzdENvbXByZXNzaW5nQ29kZWMuamF2YQppbmRleCAyNTJiYTVkLi4yNGY0MWFiIDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0Zhc3RDb21wcmVzc2luZ0NvZGVjLmphdmEKKysrIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9GYXN0Q29tcHJlc3NpbmdDb2RlYy5qYXZhCkBAIC0xLDUgKzEsMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLmNvbXByZXNzaW5nOwogCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkRvY1ZhbHVlc0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuTm9ybXNGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLmx1Y2VuZTQyLkx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5sdWNlbmU0Mi5MdWNlbmU0Mk5vcm1zRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwucGFja2VkLlBhY2tlZEludHM7CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtMzIsNCArMzgsMTMgQEAKICAgICB0aGlzKDEgPDwgMTQsIGZhbHNlKTsKICAgfQogCisgIEBPdmVycmlkZQorICBwdWJsaWMgTm9ybXNGb3JtYXQgbm9ybXNGb3JtYXQoKSB7CisgICAgcmV0dXJuIG5ldyBMdWNlbmU0Mk5vcm1zRm9ybWF0KFBhY2tlZEludHMuRkFTVCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERvY1ZhbHVlc0Zvcm1hdCBkb2NWYWx1ZXNGb3JtYXQoKSB7CisgICAgcmV0dXJuIG5ldyBMdWNlbmU0MkRvY1ZhbHVlc0Zvcm1hdChQYWNrZWRJbnRzLkZBU1QpOworICB9CiB9CmRpZmYgLS1naXQgYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0Zhc3REZWNvbXByZXNzaW9uQ29tcHJlc3NpbmdDb2RlYy5qYXZhIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9GYXN0RGVjb21wcmVzc2lvbkNvbXByZXNzaW5nQ29kZWMuamF2YQppbmRleCA1NjhhNjQ5Li43YzZiYTQ4IDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvY29kZWNzL2NvbXByZXNzaW5nL0Zhc3REZWNvbXByZXNzaW9uQ29tcHJlc3NpbmdDb2RlYy5qYXZhCisrKyBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvRmFzdERlY29tcHJlc3Npb25Db21wcmVzc2luZ0NvZGVjLmphdmEKQEAgLTEsNSArMSwxMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuY29tcHJlc3Npbmc7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuRG9jVmFsdWVzRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Ob3Jtc0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MubHVjZW5lNDIuTHVjZW5lNDJEb2NWYWx1ZXNGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLmx1Y2VuZTQyLkx1Y2VuZTQyTm9ybXNGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5wYWNrZWQuUGFja2VkSW50czsKKwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC0zMiw0ICszOCwxMyBAQAogICAgIHRoaXMoMSA8PCAxNCwgZmFsc2UpOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBOb3Jtc0Zvcm1hdCBub3Jtc0Zvcm1hdCgpIHsKKyAgICByZXR1cm4gbmV3IEx1Y2VuZTQyTm9ybXNGb3JtYXQoUGFja2VkSW50cy5ERUZBVUxUKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRG9jVmFsdWVzRm9ybWF0IGRvY1ZhbHVlc0Zvcm1hdCgpIHsKKyAgICByZXR1cm4gbmV3IEx1Y2VuZTQyRG9jVmFsdWVzRm9ybWF0KFBhY2tlZEludHMuREVGQVVMVCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9jb2RlY3MvY29tcHJlc3NpbmcvSGlnaENvbXByZXNzaW9uQ29tcHJlc3NpbmdDb2RlYy5qYXZhIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9IaWdoQ29tcHJlc3Npb25Db21wcmVzc2luZ0NvZGVjLmphdmEKaW5kZXggZmIyMzVmOS4uMmYxZmMyOSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9IaWdoQ29tcHJlc3Npb25Db21wcmVzc2luZ0NvZGVjLmphdmEKKysrIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2NvZGVjcy9jb21wcmVzc2luZy9IaWdoQ29tcHJlc3Npb25Db21wcmVzc2luZ0NvZGVjLmphdmEKQEAgLTEsNSArMSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5jb21wcmVzc2luZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Ob3Jtc0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MubHVjZW5lNDIuTHVjZW5lNDJOb3Jtc0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLnBhY2tlZC5QYWNrZWRJbnRzOworCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTMyLDQgKzM2LDggQEAKICAgICB0aGlzKDEgPDwgMTQsIGZhbHNlKTsKICAgfQogCisgIEBPdmVycmlkZQorICBwdWJsaWMgTm9ybXNGb3JtYXQgbm9ybXNGb3JtYXQoKSB7CisgICAgcmV0dXJuIG5ldyBMdWNlbmU0Mk5vcm1zRm9ybWF0KFBhY2tlZEludHMuQ09NUEFDVCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9CYXNlU3RvcmVkRmllbGRzRm9ybWF0VGVzdENhc2UuamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9CYXNlU3RvcmVkRmllbGRzRm9ybWF0VGVzdENhc2UuamF2YQppbmRleCA2ODg0ZGI3Li40YzQyZjM4IDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvQmFzZVN0b3JlZEZpZWxkc0Zvcm1hdFRlc3RDYXNlLmphdmEKKysrIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0Jhc2VTdG9yZWRGaWVsZHNGb3JtYXRUZXN0Q2FzZS5qYXZhCkBAIC05NCw3ICs5NCw3IEBACiAgICAgRGlyZWN0b3J5IGRpciA9IG5ld0RpcmVjdG9yeSgpOwogICAgIFJhbmRvbSByYW5kID0gcmFuZG9tKCk7CiAgICAgUmFuZG9tSW5kZXhXcml0ZXIgdyA9IG5ldyBSYW5kb21JbmRleFdyaXRlcihyYW5kLCBkaXIsIG5ld0luZGV4V3JpdGVyQ29uZmlnKFRFU1RfVkVSU0lPTl9DVVJSRU5ULCBuZXcgTW9ja0FuYWx5emVyKHJhbmRvbSgpKSkuc2V0TWF4QnVmZmVyZWREb2NzKF9UZXN0VXRpbC5uZXh0SW50KHJhbmQsIDUsIDIwKSkpOwotICAgIC8vdy53LnNldFVzZUNvbXBvdW5kRmlsZShmYWxzZSk7CisgICAgLy93Lncuc2V0Tm9DRlNSYXRpbygwLjApOwogICAgIGZpbmFsIGludCBkb2NDb3VudCA9IGF0TGVhc3QoMjAwKTsKICAgICBmaW5hbCBpbnQgZmllbGRDb3VudCA9IF9UZXN0VXRpbC5uZXh0SW50KHJhbmQsIDEsIDUpOwogCmRpZmYgLS1naXQgYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jSGVscGVyLmphdmEgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvRG9jSGVscGVyLmphdmEKaW5kZXggMjExNDM0My4uYTc3NDE1OSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL2luZGV4L0RvY0hlbHBlci5qYXZhCisrKyBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9Eb2NIZWxwZXIuamF2YQpAQCAtMjcyLDcgKzI3Miw3IEBACiAgIHB1YmxpYyBzdGF0aWMgU2VnbWVudEluZm9QZXJDb21taXQgd3JpdGVEb2MoUmFuZG9tIHJhbmRvbSwgRGlyZWN0b3J5IGRpciwgQW5hbHl6ZXIgYW5hbHl6ZXIsIFNpbWlsYXJpdHkgc2ltaWxhcml0eSwgRG9jdW1lbnQgZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihkaXIsIG5ldyBJbmRleFdyaXRlckNvbmZpZyggLyogTHVjZW5lVGVzdENhc2UubmV3SW5kZXhXcml0ZXJDb25maWcocmFuZG9tLCAqLyAKICAgICAgICAgVEVTVF9WRVJTSU9OX0NVUlJFTlQsIGFuYWx5emVyKS5zZXRTaW1pbGFyaXR5KHNpbWlsYXJpdHkgPT0gbnVsbCA/IEluZGV4U2VhcmNoZXIuZ2V0RGVmYXVsdFNpbWlsYXJpdHkoKSA6IHNpbWlsYXJpdHkpKTsKLSAgICAvL3dyaXRlci5zZXRVc2VDb21wb3VuZEZpbGUoZmFsc2UpOworICAgIC8vd3JpdGVyLnNldE5vQ0ZTUmF0aW8oMC4wKTsKICAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsKICAgICB3cml0ZXIuY29tbWl0KCk7CiAgICAgU2VnbWVudEluZm9QZXJDb21taXQgaW5mbyA9IHdyaXRlci5uZXdlc3RTZWdtZW50KCk7CmRpZmYgLS1naXQgYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvaW5kZXgvUmFuZG9tSW5kZXhXcml0ZXIuamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9SYW5kb21JbmRleFdyaXRlci5qYXZhCmluZGV4IGE1MDdhNjguLjNmZWE4NmMgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9SYW5kb21JbmRleFdyaXRlci5qYXZhCisrKyBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS9pbmRleC9SYW5kb21JbmRleFdyaXRlci5qYXZhCkBAIC0yNSwxNyArMjUsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Nb2NrQW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkNvZGVjOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkJpbmFyeURvY1ZhbHVlc0ZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50Lk51bWVyaWNEb2NWYWx1ZXNGaWVsZDsgCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuU29ydGVkRG9jVmFsdWVzRmllbGQ7IAotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkZpZWxkSW5mby5Eb2NWYWx1ZXNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOyAvLyBqYXZhZG9jCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSW5mb1N0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTnVsbEluZm9TdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuX1Rlc3RVdGlsOwogCkBAIC01NSwyMyArNTAsMjIgQEAKICAgcHJpdmF0ZSBib29sZWFuIGdldFJlYWRlckNhbGxlZDsKICAgcHJpdmF0ZSBmaW5hbCBDb2RlYyBjb2RlYzsgLy8gc3VnYXIKIAotICAvLyBSYW5kb21seSBjYWxscyBUaHJlYWQueWllbGQgc28gd2UgbWl4dXAgdGhyZWFkIHNjaGVkdWxpbmcKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTW9ja0luZGV4V3JpdGVyIGV4dGVuZHMgSW5kZXhXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBSYW5kb20gcjsKLQotICAgIHB1YmxpYyBNb2NrSW5kZXhXcml0ZXIoUmFuZG9tIHIsIERpcmVjdG9yeSBkaXIsIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBzdXBlcihkaXIsIGNvbmYpOwotICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgc29sdmVkIGluIGEgZGlmZmVyZW50IHdheTsgUmFuZG9tIHNob3VsZCBub3QgYmUgc2hhcmVkICghKS4KLSAgICAgIHRoaXMuciA9IG5ldyBSYW5kb20oci5uZXh0TG9uZygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBib29sZWFuIHRlc3RQb2ludChTdHJpbmcgbmFtZSkgewotICAgICAgaWYgKHIubmV4dEludCg0KSA9PSAyKQotICAgICAgICBUaHJlYWQueWllbGQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgSW5kZXhXcml0ZXIgbW9ja0luZGV4V3JpdGVyKERpcmVjdG9yeSBkaXIsIEluZGV4V3JpdGVyQ29uZmlnIGNvbmYsIFJhbmRvbSByKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIFJhbmRvbWx5IGNhbGxzIFRocmVhZC55aWVsZCBzbyB3ZSBtaXh1cCB0aHJlYWQgc2NoZWR1bGluZworICAgIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKHIubmV4dExvbmcoKSk7CisgICAgcmV0dXJuIG1vY2tJbmRleFdyaXRlcihkaXIsIGNvbmYsICBuZXcgVGVzdFBvaW50KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhcHBseShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAocmFuZG9tLm5leHRJbnQoNCkgPT0gMikKKyAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBJbmRleFdyaXRlciBtb2NrSW5kZXhXcml0ZXIoRGlyZWN0b3J5IGRpciwgSW5kZXhXcml0ZXJDb25maWcgY29uZiwgVGVzdFBvaW50IHRlc3RQb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjb25mLnNldEluZm9TdHJlYW0obmV3IFRlc3RQb2ludEluZm9TdHJlYW0oY29uZi5nZXRJbmZvU3RyZWFtKCksIHRlc3RQb2ludCkpOworICAgIHJldHVybiBuZXcgSW5kZXhXcml0ZXIoZGlyLCBjb25mKTsKICAgfQogCiAgIC8qKiBjcmVhdGUgYSBSYW5kb21JbmRleFdyaXRlciB3aXRoIGEgcmFuZG9tIGNvbmZpZzogVXNlcyBURVNUX1ZFUlNJT05fQ1VSUkVOVCBhbmQgTW9ja0FuYWx5emVyICovCkBAIC05Myw3ICs4Nyw3IEBACiAgIHB1YmxpYyBSYW5kb21JbmRleFdyaXRlcihSYW5kb20gciwgRGlyZWN0b3J5IGRpciwgSW5kZXhXcml0ZXJDb25maWcgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBzb2x2ZWQgaW4gYSBkaWZmZXJlbnQgd2F5OyBSYW5kb20gc2hvdWxkIG5vdCBiZSBzaGFyZWQgKCEpLgogICAgIHRoaXMuciA9IG5ldyBSYW5kb20oci5uZXh0TG9uZygpKTsKLSAgICB3ID0gbmV3IE1vY2tJbmRleFdyaXRlcihyLCBkaXIsIGMpOworICAgIHcgPSBtb2NrSW5kZXhXcml0ZXIoZGlyLCBjLCByKTsKICAgICBmbHVzaEF0ID0gX1Rlc3RVdGlsLm5leHRJbnQociwgMTAsIDEwMDApOwogICAgIGNvZGVjID0gdy5nZXRDb25maWcoKS5nZXRDb2RlYygpOwogICAgIGlmIChMdWNlbmVUZXN0Q2FzZS5WRVJCT1NFKSB7CkBAIC0zNDUsNCArMzM5LDQyIEBACiAgIHB1YmxpYyB2b2lkIGZvcmNlTWVyZ2UoaW50IG1heFNlZ21lbnRDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICB3LmZvcmNlTWVyZ2UobWF4U2VnbWVudENvdW50KTsKICAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGVzdFBvaW50SW5mb1N0cmVhbSBleHRlbmRzIEluZm9TdHJlYW0geworICAgIHByaXZhdGUgZmluYWwgSW5mb1N0cmVhbSBkZWxlZ2F0ZTsKKyAgICBwcml2YXRlIGZpbmFsIFRlc3RQb2ludCB0ZXN0UG9pbnQ7CisgICAgCisgICAgcHVibGljIFRlc3RQb2ludEluZm9TdHJlYW0oSW5mb1N0cmVhbSBkZWxlZ2F0ZSwgVGVzdFBvaW50IHRlc3RQb2ludCkgeworICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlID09IG51bGwgPyBuZXcgTnVsbEluZm9TdHJlYW0oKTogZGVsZWdhdGU7CisgICAgICB0aGlzLnRlc3RQb2ludCA9IHRlc3RQb2ludDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIGNvbXBvbmVudCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIGlmICgiVFAiLmVxdWFscyhjb21wb25lbnQpKSB7CisgICAgICAgIHRlc3RQb2ludC5hcHBseShtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGlmIChkZWxlZ2F0ZS5pc0VuYWJsZWQoY29tcG9uZW50KSkgeworICAgICAgICBkZWxlZ2F0ZS5tZXNzYWdlKGNvbXBvbmVudCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgY29tcG9uZW50KSB7CisgICAgICByZXR1cm4gIlRQIi5lcXVhbHMoY29tcG9uZW50KSB8fCBkZWxlZ2F0ZS5pc0VuYWJsZWQoY29tcG9uZW50KTsKKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBTaW1wbGUgaW50ZXJmYWNlIHRoYXQgaXMgZXhlY3V0ZWQgZm9yIGVhY2ggPHR0PlRQPC90dD4ge0BsaW5rIEluZm9TdHJlYW19IGNvbXBvbmVudAorICAgKiBtZXNzYWdlLiBTZWUgYWxzbyB7QGxpbmsgUmFuZG9tSW5kZXhXcml0ZXIjbW9ja0luZGV4V3JpdGVyKERpcmVjdG9yeSwgSW5kZXhXcml0ZXJDb25maWcsIFRlc3RQb2ludCl9CisgICAqLworICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBUZXN0UG9pbnQgeworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFwcGx5KFN0cmluZyBtZXNzYWdlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3N0b3JlL01vY2tEaXJlY3RvcnlXcmFwcGVyLmphdmEgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvTW9ja0RpcmVjdG9yeVdyYXBwZXIuamF2YQppbmRleCBhZWI4MDM5Li5jMTkzOTIzIDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvTW9ja0RpcmVjdG9yeVdyYXBwZXIuamF2YQorKysgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvc3RvcmUvTW9ja0RpcmVjdG9yeVdyYXBwZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTM4NSw3ICszODYsNyBAQAogICAgICAgaWYgKHJhbmRvbVN0YXRlLm5leHRCb29sZWFuKCkpIHsKICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJhIHJhbmRvbSBJT0V4Y2VwdGlvbiAoIiArIG5hbWUgKyAiKSIpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiYSByYW5kb20gSU9FeGNlcHRpb24gKCIgKyBuYW1lICsgIikiKTsKKyAgICAgICAgdGhyb3cgcmFuZG9tU3RhdGUubmV4dEJvb2xlYW4oKSA/IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oImEgcmFuZG9tIElPRXhjZXB0aW9uICgiICsgbmFtZSArICIpIikgOiBuZXcgTm9TdWNoRmlsZUV4Y2VwdGlvbigiYSByYW5kb20gSU9FeGNlcHRpb24gKCIgKyBuYW1lICsgIikiKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTU0NCw3ICs1NDUsNyBAQAogICAgICAgbWF5YmVUaHJvd0RldGVybWluaXN0aWNFeGNlcHRpb24oKTsKICAgICB9CiAgICAgaWYgKCFkZWxlZ2F0ZS5maWxlRXhpc3RzKG5hbWUpKSB7Ci0gICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUgKyAiIGluIGRpcj0iICsgZGVsZWdhdGUpOworICAgICAgdGhyb3cgcmFuZG9tU3RhdGUubmV4dEJvb2xlYW4oKSA/IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obmFtZSArICIgaW4gZGlyPSIgKyBkZWxlZ2F0ZSkgOiBuZXcgTm9TdWNoRmlsZUV4Y2VwdGlvbihuYW1lICsgIiBpbiBkaXI9IiArIGRlbGVnYXRlKTsKICAgICB9CiAKICAgICAvLyBjYW5ub3Qgb3BlbiBhIGZpbGUgZm9yIGlucHV0IGlmIGl0J3Mgc3RpbGwgb3BlbiBmb3IKQEAgLTkyMCw3ICs5MjEsNyBAQAogICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBtYXliZVlpZWxkKCk7CiAgICAgaWYgKCFkZWxlZ2F0ZS5maWxlRXhpc3RzKG5hbWUpKSB7Ci0gICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgICAgdGhyb3cgcmFuZG9tU3RhdGUubmV4dEJvb2xlYW4oKSA/IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obmFtZSkgOiBuZXcgTm9TdWNoRmlsZUV4Y2VwdGlvbihuYW1lKTsKICAgICB9CiAgICAgLy8gY2Fubm90IG9wZW4gYSBmaWxlIGZvciBpbnB1dCBpZiBpdCdzIHN0aWxsIG9wZW4gZm9yCiAgICAgLy8gb3V0cHV0LCBleGNlcHQgZm9yIHNlZ21lbnRzLmdlbiBhbmQgc2VnbWVudHNfTgpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvTGluZUZpbGVEb2NzLmphdmEgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9MaW5lRmlsZURvY3MuamF2YQppbmRleCA5M2YxZjI0Li4wNjNkZWMzIDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9MaW5lRmlsZURvY3MuamF2YQorKysgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9MaW5lRmlsZURvY3MuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5JbnRGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Tb3J0ZWREb2NWYWx1ZXNGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5TdHJpbmdGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5UZXh0RmllbGQ7CkBAIC0xNTgsNiArMTU5LDcgQEAKICAgICBmaW5hbCBGaWVsZCB0aXRsZURWOwogICAgIGZpbmFsIEZpZWxkIGJvZHk7CiAgICAgZmluYWwgRmllbGQgaWQ7CisgICAgZmluYWwgRmllbGQgaWROdW07CiAgICAgZmluYWwgRmllbGQgZGF0ZTsKIAogICAgIHB1YmxpYyBEb2NTdGF0ZShib29sZWFuIHVzZURvY1ZhbHVlcykgewpAQCAtMTgwLDYgKzE4Miw5IEBACiAgICAgICBpZCA9IG5ldyBTdHJpbmdGaWVsZCgiZG9jaWQiLCAiIiwgRmllbGQuU3RvcmUuWUVTKTsKICAgICAgIGRvYy5hZGQoaWQpOwogCisgICAgICBpZE51bSA9IG5ldyBJbnRGaWVsZCgiZG9jaWRfaW50IiwgMCwgRmllbGQuU3RvcmUuTk8pOworICAgICAgZG9jLmFkZChpZE51bSk7CisKICAgICAgIGRhdGUgPSBuZXcgU3RyaW5nRmllbGQoImRhdGUiLCAiIiwgRmllbGQuU3RvcmUuWUVTKTsKICAgICAgIGRvYy5hZGQoZGF0ZSk7CiAKQEAgLTIzMyw3ICsyMzgsOSBAQAogICAgIH0KICAgICBkb2NTdGF0ZS50aXRsZVRva2VuaXplZC5zZXRTdHJpbmdWYWx1ZSh0aXRsZSk7CiAgICAgZG9jU3RhdGUuZGF0ZS5zZXRTdHJpbmdWYWx1ZShsaW5lLnN1YnN0cmluZygxK3Nwb3QsIHNwb3QyKSk7Ci0gICAgZG9jU3RhdGUuaWQuc2V0U3RyaW5nVmFsdWUoSW50ZWdlci50b1N0cmluZyhpZC5nZXRBbmRJbmNyZW1lbnQoKSkpOworICAgIGZpbmFsIGludCBpID0gaWQuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgZG9jU3RhdGUuaWQuc2V0U3RyaW5nVmFsdWUoSW50ZWdlci50b1N0cmluZyhpKSk7CisgICAgZG9jU3RhdGUuaWROdW0uc2V0SW50VmFsdWUoaSk7CiAgICAgcmV0dXJuIGRvY1N0YXRlLmRvYzsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvTHVjZW5lVGVzdENhc2UuamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL0x1Y2VuZVRlc3RDYXNlLmphdmEKaW5kZXggMmNlMjgyMy4uMzc5MWU0OCAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvTHVjZW5lVGVzdENhc2UuamF2YQorKysgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9MdWNlbmVUZXN0Q2FzZS5qYXZhCkBAIC03MzcsNiArNzM3LDEyIEBACiAKICAgICBpZiAoci5uZXh0Qm9vbGVhbigpKSB7CiAgICAgICBjLnNldE1lcmdlU2NoZWR1bGVyKG5ldyBTZXJpYWxNZXJnZVNjaGVkdWxlcigpKTsKKyAgICB9IGVsc2UgaWYgKHJhcmVseShyKSkgeworICAgICAgaW50IG1heFRocmVhZENvdW50ID0gX1Rlc3RVdGlsLm5leHRJbnQocmFuZG9tKCksIDEsIDQpOworICAgICAgaW50IG1heE1lcmdlQ291bnQgPSBfVGVzdFV0aWwubmV4dEludChyYW5kb20oKSwgbWF4VGhyZWFkQ291bnQsIG1heFRocmVhZENvdW50KzQpOworICAgICAgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyIGNtcyA9IG5ldyBDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIoKTsKKyAgICAgIGNtcy5zZXRNYXhNZXJnZXNBbmRUaHJlYWRzKG1heE1lcmdlQ291bnQsIG1heFRocmVhZENvdW50KTsKKyAgICAgIGMuc2V0TWVyZ2VTY2hlZHVsZXIoY21zKTsKICAgICB9CiAgICAgaWYgKHIubmV4dEJvb2xlYW4oKSkgewogICAgICAgaWYgKHJhcmVseShyKSkgewpAQCAtODA4LDYgKzgxNCw3IEBACiAgICAgaWYgKHJhcmVseShyKSkgewogICAgICAgYy5zZXRNZXJnZWRTZWdtZW50V2FybWVyKG5ldyBTaW1wbGVNZXJnZWRTZWdtZW50V2FybWVyKGMuZ2V0SW5mb1N0cmVhbSgpKSk7CiAgICAgfQorICAgIGMuc2V0VXNlQ29tcG91bmRGaWxlKHIubmV4dEJvb2xlYW4oKSk7CiAgICAgYy5zZXRSZWFkZXJQb29saW5nKHIubmV4dEJvb2xlYW4oKSk7CiAgICAgYy5zZXRSZWFkZXJUZXJtc0luZGV4RGl2aXNvcihfVGVzdFV0aWwubmV4dEludChyLCAxLCA0KSk7CiAgICAgcmV0dXJuIGM7CkBAIC04MzEsMjAgKzgzOCwyOSBAQAogCiAgIHB1YmxpYyBzdGF0aWMgTG9nTWVyZ2VQb2xpY3kgbmV3TG9nTWVyZ2VQb2xpY3koUmFuZG9tIHIpIHsKICAgICBMb2dNZXJnZVBvbGljeSBsb2dtcCA9IHIubmV4dEJvb2xlYW4oKSA/IG5ldyBMb2dEb2NNZXJnZVBvbGljeSgpIDogbmV3IExvZ0J5dGVTaXplTWVyZ2VQb2xpY3koKTsKLSAgICBsb2dtcC5zZXRVc2VDb21wb3VuZEZpbGUoci5uZXh0Qm9vbGVhbigpKTsKICAgICBsb2dtcC5zZXRDYWxpYnJhdGVTaXplQnlEZWxldGVzKHIubmV4dEJvb2xlYW4oKSk7CiAgICAgaWYgKHJhcmVseShyKSkgewogICAgICAgbG9nbXAuc2V0TWVyZ2VGYWN0b3IoX1Rlc3RVdGlsLm5leHRJbnQociwgMiwgOSkpOwogICAgIH0gZWxzZSB7CiAgICAgICBsb2dtcC5zZXRNZXJnZUZhY3RvcihfVGVzdFV0aWwubmV4dEludChyLCAxMCwgNTApKTsKICAgICB9Ci0gICAgbG9nbXAuc2V0VXNlQ29tcG91bmRGaWxlKHIubmV4dEJvb2xlYW4oKSk7Ci0gICAgbG9nbXAuc2V0Tm9DRlNSYXRpbygwLjEgKyByLm5leHREb3VibGUoKSowLjgpOwotICAgIGlmIChyYXJlbHkoKSkgewotICAgICAgbG9nbXAuc2V0TWF4Q0ZTU2VnbWVudFNpemVNQigwLjIgKyByLm5leHREb3VibGUoKSAqIDIuMCk7Ci0gICAgfQorICAgIGNvbmZpZ3VyZVJhbmRvbShyLCBsb2dtcCk7CiAgICAgcmV0dXJuIGxvZ21wOwogICB9CisgIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVJhbmRvbShSYW5kb20gciwgTWVyZ2VQb2xpY3kgbWVyZ2VQb2xpY3kpIHsKKyAgICBpZiAoci5uZXh0Qm9vbGVhbigpKSB7CisgICAgICBtZXJnZVBvbGljeS5zZXROb0NGU1JhdGlvKDAuMSArIHIubmV4dERvdWJsZSgpKjAuOCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lcmdlUG9saWN5LnNldE5vQ0ZTUmF0aW8oci5uZXh0Qm9vbGVhbigpID8gMS4wIDogMC4wKTsKKyAgICB9CisgICAgCisgICAgaWYgKHJhcmVseSgpKSB7CisgICAgICBtZXJnZVBvbGljeS5zZXRNYXhDRlNTZWdtZW50U2l6ZU1CKDAuMiArIHIubmV4dERvdWJsZSgpICogMi4wKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVyZ2VQb2xpY3kuc2V0TWF4Q0ZTU2VnbWVudFNpemVNQihEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpOworICAgIH0KKyAgfQogCiAgIHB1YmxpYyBzdGF0aWMgVGllcmVkTWVyZ2VQb2xpY3kgbmV3VGllcmVkTWVyZ2VQb2xpY3koUmFuZG9tIHIpIHsKICAgICBUaWVyZWRNZXJnZVBvbGljeSB0bXAgPSBuZXcgVGllcmVkTWVyZ2VQb2xpY3koKTsKQEAgLTg2NywyOSArODgzLDI1IEBACiAgICAgfSBlbHNlIHsKICAgICAgIHRtcC5zZXRTZWdtZW50c1BlclRpZXIoX1Rlc3RVdGlsLm5leHRJbnQociwgMTAsIDUwKSk7CiAgICAgfQotICAgIHRtcC5zZXRVc2VDb21wb3VuZEZpbGUoci5uZXh0Qm9vbGVhbigpKTsKLSAgICB0bXAuc2V0Tm9DRlNSYXRpbygwLjEgKyByLm5leHREb3VibGUoKSowLjgpOwotICAgIGlmIChyYXJlbHkoKSkgewotICAgICAgdG1wLnNldE1heENGU1NlZ21lbnRTaXplTUIoMC4yICsgci5uZXh0RG91YmxlKCkgKiAyLjApOwotICAgIH0KKyAgICBjb25maWd1cmVSYW5kb20ociwgdG1wKTsKICAgICB0bXAuc2V0UmVjbGFpbURlbGV0ZXNXZWlnaHQoci5uZXh0RG91YmxlKCkqNCk7CiAgICAgcmV0dXJuIHRtcDsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgTG9nTWVyZ2VQb2xpY3kgbmV3TG9nTWVyZ2VQb2xpY3koYm9vbGVhbiB1c2VDRlMpIHsKLSAgICBMb2dNZXJnZVBvbGljeSBsb2dtcCA9IG5ld0xvZ01lcmdlUG9saWN5KCk7Ci0gICAgbG9nbXAuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNGUyk7CisgIHB1YmxpYyBzdGF0aWMgTWVyZ2VQb2xpY3kgbmV3TG9nTWVyZ2VQb2xpY3koYm9vbGVhbiB1c2VDRlMpIHsKKyAgICBNZXJnZVBvbGljeSBsb2dtcCA9IG5ld0xvZ01lcmdlUG9saWN5KCk7CisgICAgbG9nbXAuc2V0Tm9DRlNSYXRpbyh1c2VDRlMgPyAxLjAgOiAwLjApOwogICAgIHJldHVybiBsb2dtcDsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgTG9nTWVyZ2VQb2xpY3kgbmV3TG9nTWVyZ2VQb2xpY3koYm9vbGVhbiB1c2VDRlMsIGludCBtZXJnZUZhY3RvcikgeworICBwdWJsaWMgc3RhdGljIE1lcmdlUG9saWN5IG5ld0xvZ01lcmdlUG9saWN5KGJvb2xlYW4gdXNlQ0ZTLCBpbnQgbWVyZ2VGYWN0b3IpIHsKICAgICBMb2dNZXJnZVBvbGljeSBsb2dtcCA9IG5ld0xvZ01lcmdlUG9saWN5KCk7Ci0gICAgbG9nbXAuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNGUyk7CisgICAgbG9nbXAuc2V0Tm9DRlNSYXRpbyh1c2VDRlMgPyAxLjAgOiAwLjApOwogICAgIGxvZ21wLnNldE1lcmdlRmFjdG9yKG1lcmdlRmFjdG9yKTsKICAgICByZXR1cm4gbG9nbXA7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIExvZ01lcmdlUG9saWN5IG5ld0xvZ01lcmdlUG9saWN5KGludCBtZXJnZUZhY3RvcikgeworICBwdWJsaWMgc3RhdGljIE1lcmdlUG9saWN5IG5ld0xvZ01lcmdlUG9saWN5KGludCBtZXJnZUZhY3RvcikgewogICAgIExvZ01lcmdlUG9saWN5IGxvZ21wID0gbmV3TG9nTWVyZ2VQb2xpY3koKTsKICAgICBsb2dtcC5zZXRNZXJnZUZhY3RvcihtZXJnZUZhY3Rvcik7CiAgICAgcmV0dXJuIGxvZ21wOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvUnVuTGlzdGVuZXJQcmludFJlcHJvZHVjZUluZm8uamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1J1bkxpc3RlbmVyUHJpbnRSZXByb2R1Y2VJbmZvLmphdmEKaW5kZXggZmE3NzU0ZS4uMzJmMmNjMCAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvUnVuTGlzdGVuZXJQcmludFJlcHJvZHVjZUluZm8uamF2YQorKysgYi9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9SdW5MaXN0ZW5lclByaW50UmVwcm9kdWNlSW5mby5qYXZhCkBAIC04OCwxMiArODgsMjcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHRlc3RGaW5pc2hlZChEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRlc3RGYWlsZWQpIHsKLSAgICAgIHJlcG9ydEFkZGl0aW9uYWxGYWlsdXJlSW5mbyhkZXNjcmlwdGlvbi5nZXRNZXRob2ROYW1lKCkpOworICAgICAgcmVwb3J0QWRkaXRpb25hbEZhaWx1cmVJbmZvKAorICAgICAgICAgIHN0cmlwVGVzdE5hbWVBdWdtZW50YXRpb25zKAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5nZXRNZXRob2ROYW1lKCkpKTsKICAgICB9CiAgICAgc2NvcGUgPSBMaWZlY3ljbGVTY29wZS5TVUlURTsKICAgICB0ZXN0RmFpbGVkID0gZmFsc2U7CiAgIH0KIAorICAvKioKKyAgICogVGhlIHtAbGluayBEZXNjcmlwdGlvbn0gb2JqZWN0IGluIEpVbml0IGRvZXMgbm90IGV4cG9zZSB0aGUgYWN0dWFsIHRlc3QgbWV0aG9kLAorICAgKiBpbnN0ZWFkIGl0IGhhcyB0aGUgY29uY2VwdCBvZiBhIHVuaXF1ZSAibmFtZSIgb2YgYSB0ZXN0LiBUbyBydW4gdGhlIHNhbWUgbWV0aG9kICh0ZXN0cykKKyAgICogcmVwZWF0ZWRseSwgcmFuZG9taXplZHRlc3RpbmcgbXVzdCBtYWtlIHRob3NlICJuYW1lcyIgdW5pcXVlOiBpdCBhcHBlbmRzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgorICAgKiBhbmQgc2VlZHMgdG8gdGhlIHRlc3QgbWV0aG9kJ3MgbmFtZS4gV2Ugc3RyaXAgdGhpcyBpbmZvcm1hdGlvbiBoZXJlLiAgIAorICAgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgc3RyaXBUZXN0TmFtZUF1Z21lbnRhdGlvbnMoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7CisgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5yZXBsYWNlQWxsKCJcXHMqXFx7Lis/XFx9IiwgIiIpOworICAgIH0KKyAgICByZXR1cm4gbWV0aG9kTmFtZTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmluaXNoZWQoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgaWYgKHByaW50RGlhZ25vc3RpY3NBZnRlckNsYXNzIHx8IEx1Y2VuZVRlc3RDYXNlLlZFUkJPU0UpIHsKZGlmZiAtLWdpdCBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1Rlc3RSdWxlU2V0dXBBbmRSZXN0b3JlQ2xhc3NFbnYuamF2YSBiL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL1Rlc3RSdWxlU2V0dXBBbmRSZXN0b3JlQ2xhc3NFbnYuamF2YQppbmRleCA3ZjMxZDQ4Li4wMWNiYmNkIDEwMDY0NAotLS0gYS9sdWNlbmUvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9sdWNlbmUvdXRpbC9UZXN0UnVsZVNldHVwQW5kUmVzdG9yZUNsYXNzRW52LmphdmEKKysrIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvVGVzdFJ1bGVTZXR1cEFuZFJlc3RvcmVDbGFzc0Vudi5qYXZhCkBAIC04NCw2ICs4NCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBjb21wb25lbnQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICBpZiAoIlRQIi5lcXVhbHMoY29tcG9uZW50KSkgeworICAgICAgICByZXR1cm47IC8vIGlnbm9yZSB0ZXN0IHBvaW50cyEKKyAgICAgIH0KICAgICAgIGZpbmFsIFN0cmluZyBuYW1lOwogICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIlRFU1QtIikpIHsKICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG1haW4gdGhyZWFkIGlzIHdheSB0b28KZGlmZiAtLWdpdCBhL2x1Y2VuZS90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL2x1Y2VuZS91dGlsL19UZXN0VXRpbC5qYXZhIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvX1Rlc3RVdGlsLmphdmEKaW5kZXggOTE5ZjQ1ZC4uOWVjY2YyNyAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvX1Rlc3RVdGlsLmphdmEKKysrIGIvbHVjZW5lL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvbHVjZW5lL3V0aWwvX1Rlc3RVdGlsLmphdmEKQEAgLTQ5LDcgKzQ5LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLnBlcmZpZWxkLlBlckZpZWxkUG9zdGluZ3NGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuQmluYXJ5RG9jVmFsdWVzRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG91YmxlRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGRUeXBlLk51bWVyaWNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZsb2F0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuSW50RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuTG9uZ0ZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50Lk51bWVyaWNEb2NWYWx1ZXNGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Tb3J0ZWREb2NWYWx1ZXNGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5BdG9taWNSZWFkZXI7CkBAIC03OCwxNCArODMsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtc0VudW07CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGllcmVkTWVyZ2VQb2xpY3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkRG9jOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWx0ZXJlZFF1ZXJ5LkZpbHRlclN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWx0ZXJlZFF1ZXJ5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWx0ZXJlZFF1ZXJ5LkZpbHRlclN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TY29yZURvYzsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guVG9wRG9jczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Db21wb3VuZEZpbGVEaXJlY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLklPQ29udGV4dDsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCiBpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5SYW5kb21pemVkQ29udGV4dDsKIGltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmdlbmVyYXRvcnMuUmFuZG9tSW50czsKIGltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmdlbmVyYXRvcnMuUmFuZG9tUGlja3M7CkBAIC0yNjAsMTcgKzI2Niw2IEBACiAgICAgfQogICB9CiAKLSAgLy8gTk9URTogb25seSB3b3JrcyBmb3IgVE1QIGFuZCBMTVAhIQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlQ29tcG91bmRGaWxlKE1lcmdlUG9saWN5IG1wLCBib29sZWFuIHYpIHsKLSAgICBpZiAobXAgaW5zdGFuY2VvZiBUaWVyZWRNZXJnZVBvbGljeSkgewotICAgICAgKChUaWVyZWRNZXJnZVBvbGljeSkgbXApLnNldFVzZUNvbXBvdW5kRmlsZSh2KTsKLSAgICB9IGVsc2UgaWYgKG1wIGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKLSAgICAgICgoTG9nTWVyZ2VQb2xpY3kpIG1wKS5zZXRVc2VDb21wb3VuZEZpbGUodik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCBzZXQgY29tcG91bmQgZmlsZSBmb3IgTWVyZ2VQb2xpY3kgIiArIG1wKTsKLSAgICB9Ci0gIH0KLQogICAvKiogc3RhcnQgYW5kIGVuZCBhcmUgQk9USCBpbmNsdXNpdmUgKi8KICAgcHVibGljIHN0YXRpYyBpbnQgbmV4dEludChSYW5kb20gciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgcmV0dXJuIFJhbmRvbUludHMucmFuZG9tSW50QmV0d2VlbihyLCBzdGFydCwgZW5kKTsKQEAgLTI5Myw3ICsyODgsMTEgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJhbmRvbVNpbXBsZVN0cmluZyhSYW5kb20gciwgaW50IG1heExlbmd0aCkgewotICAgIGZpbmFsIGludCBlbmQgPSBuZXh0SW50KHIsIDAsIG1heExlbmd0aCk7CisgICAgcmV0dXJuIHJhbmRvbVNpbXBsZVN0cmluZyhyLCAwLCBtYXhMZW5ndGgpOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21TaW1wbGVTdHJpbmcoUmFuZG9tIHIsIGludCBtaW5MZW5ndGgsIGludCBtYXhMZW5ndGgpIHsKKyAgICBmaW5hbCBpbnQgZW5kID0gbmV4dEludChyLCBtaW5MZW5ndGgsIG1heExlbmd0aCk7CiAgICAgaWYgKGVuZCA9PSAwKSB7CiAgICAgICAvLyBhbGxvdyAwIGxlbmd0aAogICAgICAgcmV0dXJuICIiOwpAQCAtMzE5LDcgKzMxOCw3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21TaW1wbGVTdHJpbmcoUmFuZG9tIHIpIHsKLSAgICByZXR1cm4gcmFuZG9tU2ltcGxlU3RyaW5nKHIsIDEwKTsKKyAgICByZXR1cm4gcmFuZG9tU2ltcGxlU3RyaW5nKHIsIDAsIDEwKTsKICAgfQogCiAgIC8qKiBSZXR1cm5zIHJhbmRvbSBzdHJpbmcsIGluY2x1ZGluZyBmdWxsIHVuaWNvZGUgcmFuZ2UuICovCkBAIC03NjIsMTcgKzc2MSwxNyBAQAogICAgIGlmIChtcCBpbnN0YW5jZW9mIExvZ01lcmdlUG9saWN5KSB7CiAgICAgICBMb2dNZXJnZVBvbGljeSBsbXAgPSAoTG9nTWVyZ2VQb2xpY3kpIG1wOwogICAgICAgbG1wLnNldE1lcmdlRmFjdG9yKE1hdGgubWluKDUsIGxtcC5nZXRNZXJnZUZhY3RvcigpKSk7Ci0gICAgICBsbXAuc2V0VXNlQ29tcG91bmRGaWxlKHRydWUpOworICAgICAgbG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICB9IGVsc2UgaWYgKG1wIGluc3RhbmNlb2YgVGllcmVkTWVyZ2VQb2xpY3kpIHsKICAgICAgIFRpZXJlZE1lcmdlUG9saWN5IHRtcCA9IChUaWVyZWRNZXJnZVBvbGljeSkgbXA7CiAgICAgICB0bXAuc2V0TWF4TWVyZ2VBdE9uY2UoTWF0aC5taW4oNSwgdG1wLmdldE1heE1lcmdlQXRPbmNlKCkpKTsKICAgICAgIHRtcC5zZXRTZWdtZW50c1BlclRpZXIoTWF0aC5taW4oNSwgdG1wLmdldFNlZ21lbnRzUGVyVGllcigpKSk7Ci0gICAgICB0bXAuc2V0VXNlQ29tcG91bmRGaWxlKHRydWUpOworICAgICAgdG1wLnNldE5vQ0ZTUmF0aW8oMS4wKTsKICAgICB9CiAgICAgTWVyZ2VTY2hlZHVsZXIgbXMgPSB3LmdldENvbmZpZygpLmdldE1lcmdlU2NoZWR1bGVyKCk7CiAgICAgaWYgKG1zIGluc3RhbmNlb2YgQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKSB7Ci0gICAgICAoKENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlcikgbXMpLnNldE1heFRocmVhZENvdW50KDIpOwotICAgICAgKChDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIpIG1zKS5zZXRNYXhNZXJnZUNvdW50KDMpOworICAgICAgLy8gd3RmLi4uIHNob3VsZG50IGl0IGJlIGV2ZW4gbG93ZXIgc2luY2UgaXRzIDEgYnkgZGVmYXVsdD8hPyEKKyAgICAgICgoQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKSBtcykuc2V0TWF4TWVyZ2VzQW5kVGhyZWFkcygzLCAyKTsKICAgICB9CiAgIH0KIApAQCAtODc5LDYgKzg3OCw3IEBACiAgICAgICBmaW5hbCBGaWVsZCBmaWVsZDEgPSAoRmllbGQpIGY7CiAgICAgICBmaW5hbCBGaWVsZCBmaWVsZDI7CiAgICAgICBmaW5hbCBEb2NWYWx1ZXNUeXBlIGR2VHlwZSA9IGZpZWxkMS5maWVsZFR5cGUoKS5kb2NWYWx1ZVR5cGUoKTsKKyAgICAgIGZpbmFsIE51bWVyaWNUeXBlIG51bVR5cGUgPSBmaWVsZDEuZmllbGRUeXBlKCkubnVtZXJpY1R5cGUoKTsKICAgICAgIGlmIChkdlR5cGUgIT0gbnVsbCkgewogICAgICAgICBzd2l0Y2goZHZUeXBlKSB7CiAgICAgICAgICAgY2FzZSBOVU1FUklDOgpAQCAtODkzLDYgKzg5MywyMyBAQAogICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIFR5cGU6ICIgKyBkdlR5cGUpOwogICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG51bVR5cGUgIT0gbnVsbCkgeworICAgICAgICBzd2l0Y2ggKG51bVR5cGUpIHsKKyAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgIGZpZWxkMiA9IG5ldyBJbnRGaWVsZChmaWVsZDEubmFtZSgpLCBmaWVsZDEubnVtZXJpY1ZhbHVlKCkuaW50VmFsdWUoKSwgZmllbGQxLmZpZWxkVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICBmaWVsZDIgPSBuZXcgRmxvYXRGaWVsZChmaWVsZDEubmFtZSgpLCBmaWVsZDEubnVtZXJpY1ZhbHVlKCkuaW50VmFsdWUoKSwgZmllbGQxLmZpZWxkVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgIGZpZWxkMiA9IG5ldyBMb25nRmllbGQoZmllbGQxLm5hbWUoKSwgZmllbGQxLm51bWVyaWNWYWx1ZSgpLmludFZhbHVlKCksIGZpZWxkMS5maWVsZFR5cGUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgIGZpZWxkMiA9IG5ldyBEb3VibGVGaWVsZChmaWVsZDEubmFtZSgpLCBmaWVsZDEubnVtZXJpY1ZhbHVlKCkuaW50VmFsdWUoKSwgZmllbGQxLmZpZWxkVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIFR5cGU6ICIgKyBudW1UeXBlKTsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgZmllbGQyID0gbmV3IEZpZWxkKGZpZWxkMS5uYW1lKCksIGZpZWxkMS5zdHJpbmdWYWx1ZSgpLCBmaWVsZDEuZmllbGRUeXBlKCkpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL2J1aWxkLnhtbCBiL2x1Y2VuZS90b29scy9idWlsZC54bWwKaW5kZXggMzUzMTBiYy4uZDljYmRjNyAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL2J1aWxkLnhtbAorKysgYi9sdWNlbmUvdG9vbHMvYnVpbGQueG1sCkBAIC0yMSw2ICsyMSw4IEBACiAgIDxkZXNjcmlwdGlvbj5MdWNlbmUgVG9vbHM8L2Rlc2NyaXB0aW9uPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIuLi9idWlsZC90b29scyIvPgorICAKKyAgPHByb3BlcnR5IG5hbWU9InJhdC5hZGRpdGlvbmFsLWluY2x1ZGVzIiB2YWx1ZT0iZm9yYmlkZGVuQXBpcy8qKixwcmV0dGlmeS8qKiIvPgogCiAgIDxpbXBvcnQgZmlsZT0iLi4vY29tbW9uLWJ1aWxkLnhtbCIvPgogCmRpZmYgLS1naXQgYS9sdWNlbmUvdG9vbHMvY3VzdG9tLXRhc2tzLnhtbCBiL2x1Y2VuZS90b29scy9jdXN0b20tdGFza3MueG1sCmluZGV4IDA3NDA1OWIuLjEwZTRiNTYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS90b29scy9jdXN0b20tdGFza3MueG1sCisrKyBiL2x1Y2VuZS90b29scy9jdXN0b20tdGFza3MueG1sCkBAIC0xLDQgKzEsMjEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgogPHByb2plY3QgbmFtZT0iY3VzdG9tLXRhc2tzIj4KICAgPGRlc2NyaXB0aW9uPgogICAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW1wb3J0aW5nIGludG8gYSBtYWluIGJ1aWxkIGZpbGUsIGFuZCBub3QgaW50ZW5kZWQKQEAgLTI2LDcgKzQzLDcgQEAKIAogICAgIDwhLS0gVHlwaWNhbCB2ZXJzaW9uIHBhdHRlcm5zLiAtLT4KICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49IlwucmNbMC05XSsiIHJlcGxhY2U9IiIgZmxhZ3M9ImdpIiAvPgotICAgIDxyZXBsYWNlcmVnZXggcGF0dGVybj0iXC0ocik/KFswLTlcLVxfXC5dKSsoYihldGEpPyhbMC05XC1cLl0pKik/JCIgcmVwbGFjZT0iIiBmbGFncz0iZ2kiIC8+CisgICAgPHJlcGxhY2VyZWdleCBwYXR0ZXJuPSJcLShyKT8oWzAtOVwtXF9cLl0pKygoYihldGEpPyl8KChhKGxwaGEpPykpKFswLTlcLVwuXSkqKT8oXC10ZXN0cyk/JCIgcmVwbGFjZT0iIiBmbGFncz0iZ2kiIC8+CiAKICAgICA8IS0tIGdpdCBoYXNoY29kZSBwYXR0ZXJuOiBpdHMgYWx3YXlzIDQwIGNoYXJzIHJpZ2h0PyAtLT4KICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49IlwtW2EtejAtOV17NDAsNDB9JCIgcmVwbGFjZT0iIiBmbGFncz0iZ2kiIC8+CmRpZmYgLS1naXQgYS9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQgYi9sdWNlbmUvdG9vbHMvZm9yYmlkZGVuQXBpcy9jaGFycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2NzljYgotLS0gL2Rldi9udWxsCisrKyBiL2x1Y2VuZS90b29scy9mb3JiaWRkZW5BcGlzL2NoYXJzLnR4dApAQCAtMCwwICsxLDE3IEBACisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitqYXZhLmxhbmcuQ2hhcmFjdGVyI2NvZGVQb2ludEJlZm9yZShjaGFyW10saW50KSBAIEltcGxpY2l0IHN0YXJ0IG9mZnNldCBpcyBlcnJvci1wcm9uZSB3aGVuIHRoZSBjaGFyW10gaXMgYSBidWZmZXIgYW5kIHRoZSBmaXJzdCBjaGFycyBhcmUgcmFuZG9tIGNoYXJzCitqYXZhLmxhbmcuQ2hhcmFjdGVyI2NvZGVQb2ludEF0KGNoYXJbXSxpbnQpIEAgSW1wbGljaXQgZW5kIG9mZnNldCBpcyBlcnJvci1wcm9uZSB3aGVuIHRoZSBjaGFyW10gaXMgYSBidWZmZXIgYW5kIHRoZSBsYXN0IGNoYXJzIGFyZSByYW5kb20gY2hhcnMKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9qdW5pdDQvdGVzdHMucG9saWN5IGIvbHVjZW5lL3Rvb2xzL2p1bml0NC90ZXN0cy5wb2xpY3kKaW5kZXggZjhjNDAwMi4uMDkzM2NhYiAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL2p1bml0NC90ZXN0cy5wb2xpY3kKKysrIGIvbHVjZW5lL3Rvb2xzL2p1bml0NC90ZXN0cy5wb2xpY3kKQEAgLTU5LDYgKzU5LDEwIEBACiAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblBlcm1pc3Npb24gIioiLCAiKiI7CiAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlclBlcm1pc3Npb24gIioiOwogICBwZXJtaXNzaW9uIGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5UcnVzdFBlcm1pc3Npb24gIioiOworICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gIioiOworICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uICJvcmcuYXBhY2hlLmhhZG9vcC5zZWN1cml0eS5DcmVkZW50aWFscyAqIFwiKlwiIiwgInJlYWQiOworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJwdXRQcm92aWRlclByb3BlcnR5LlNhc2xQbGFpblNlcnZlciI7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gImluc2VydFByb3ZpZGVyLlNhc2xQbGFpblNlcnZlciI7CiAgIAogICAvLyBUSUtBIHVzZXMgQm91bmN5Q2FzdGxlIGFuZCB0aGF0IHJlZ2lzdGVycyBuZXcgcHJvdmlkZXIgZm9yIFBERiBwYXJzaW5nICsgTVNPZmZpY2UgcGFyc2luZy4gTWF5YmUgcmVwb3J0IGFzIGJ1ZyEKICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAicHV0UHJvdmlkZXJQcm9wZXJ0eS5CQyI7CmRpZmYgLS1naXQgYS9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1hcG9sbG8uanMgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1hcG9sbG8uanMKaW5kZXggNzA5OGJhZi4uYTllNDU5NyAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctYXBvbGxvLmpzCisrKyBiL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLWFwb2xsby5qcwpAQCAtMSwyICsxLDE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1siY29tIiwvXiNbXlxuXHJdKi8sbnVsbCwiIyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxudWxsLCciJ11dLFtbImt3ZCIsL14oPzpBRFN8QUR8QVVHfEJaRnxCWk1GfENBRXxDQUZ8Q0F8Q0NTfENPTXxDU3xEQVN8RENBfERDT018RENTfERET1VCTHxESU18RE9VQkxFfERUQ0J8RFRDRnxEVnxEWENIfEVEUlVQVHxFWFRFTkR8SU5DUnxJTkRFWHxORFh8SU5ISU5UfExYQ0h8TUFTS3xNU0t8TVB8TVNVfE5PT1B8T1ZTS3xRWENIfFJBTkR8UkVBRHxSRUxJTlR8UkVTVU1FfFJFVFVSTnxST1J8UlhPUnxTUVVBUkV8U1V8VENSfFRDQUF8T1ZTS3xUQ0Z8VEN8VFN8V0FORHxXT1J8V1JJVEV8WENIfFhMUXxYWEFMUXxaTHxaUXxBRER8QURafFNVQnxTVVp8TVBZfE1QUnxNUFp8RFZQfENPTXxBQlN8Q0xBfENMWnxMRFF8U1RPfFNUUXxBTFN8TExTfExSU3xUUkF8VFNRfFRNSXxUT1Z8QVhUfFRJWHxETFl8SU5QfE9VVClccy8sCiBudWxsXSxbInR5cCIsL14oPzotP0dFTkFEUnw9TUlOVVN8MkJDQURSfFZOfEJPRnxNTXwtPzJDQURSfC0/WzEtNl1ETkFEUnxBRFJFU3xCQkNPTnxbRVNdP0JBTks9P3xCTE9DS3xCTktTVU18RT9DQURSfENPVU5UXCo/fDI/REVDXCo/fC0/RE5DSEFOfC0/RE5QVFJ8RVFVQUxTfEVSQVNFfE1FTU9SWXwyP09DVHxSRU1BRFJ8U0VUTE9DfFNVQlJPfE9SR3xCU1N8QkVTfFNZTnxFUVV8REVGSU5FfEVORClccy8sbnVsbF0sWyJsaXQiLC9eJyg/Oi0qKD86XHd8XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8pPy9dLFsicGxuIiwvXi0qKD86WyEtel18XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8vXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiYXBvbGxvIiwiYWdjIiwiYWVhIl0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctY3NzLmpzIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctY3NzLmpzCmluZGV4IDA0MWUxZjUuLmU5Mzc0NTcgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLWNzcy5qcworKysgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1jc3MuanMKQEAgLTEsMiArMSwxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxmXHIgXSsvLG51bGwsIiBcdFxyXG4MIl1dLFtbInN0ciIsL14iKD86W15cblxmXHIiXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSoiLyxudWxsXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSonLyxudWxsXSxbImxhbmctY3NzLXN0ciIsL151cmxcKChbXiInKV0qKVwpL2ldLFsia3dkIiwvXig/OnVybHxyZ2J8IWltcG9ydGFudHxAaW1wb3J0fEBwYWdlfEBtZWRpYXxAY2hhcnNldHxpbmhlcml0KSg/PVteXHctXXwkKS9pLG51bGxdLFsibGFuZy1jc3Mta3ciLC9eKC0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqKVxzKjovaV0sWyJjb20iLC9eXC9cKlteKl0qXCorKD86W14qL11bXipdKlwqKykqXC8vXSxbImNvbSIsCiAvXig/OjxcIS0tfC0tXD4pL10sWyJsaXQiLC9eKD86XGQrfFxkKlwuXGQrKSg/OiV8W2Etel0rKT8vaV0sWyJsaXQiLC9eI1tcZGEtZl17Myw2fS9pXSxbInBsbiIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXSxbInB1biIsL15bXlxzXHciJ10rL11dKSxbImNzcyJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbImt3ZCIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXV0pLFsiY3NzLWt3Il0pO1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1sic3RyIiwvXlteIicpXSsvXV0pLFsiY3NzLXN0ciJdKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLWhzLmpzIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctaHMuanMKaW5kZXggOWQ3N2IwOC4uMDg1OGU1YyAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctaHMuanMKKysrIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctaHMuanMKQEAgLTEsMiArMSwxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHQtXHIgXSsvLG51bGwsIlx0XG4LDFxyICJdLFsic3RyIiwvXiIoPzpbXlxuXGZcciJcXF18XFxbXFNcc10pKig/OiJ8JCkvLG51bGwsJyInXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcW14mXSknPy8sbnVsbCwiJyJdLFsibGl0IiwvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbKy1dP1xkKyk/KS9pLG51bGwsIjAxMjM0NTY3ODkiXV0sW1siY29tIiwvXig/Oi0tK1teXG5cZlxyXSp8ey0oPzpbXi1dfC0rW159LV0pKi19KS9dLFsia3dkIiwvXig/OmNhc2V8Y2xhc3N8ZGF0YXxkZWZhdWx0fGRlcml2aW5nfGRvfGVsc2V8aWZ8aW1wb3J0fGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHRoZW58dHlwZXx3aGVyZXxfKSg/PVteXGQnQS1aYS16XXwkKS8sCiBudWxsXSxbInBsbiIsL14oPzpbQS1aXVtcdyddKlwuKSpbQS1aYS16XVtcdyddKi9dLFsicHVuIiwvXlteXGRcdC1cciAiJ0EtWmEtel0rL11dKSxbImhzIl0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctbGlzcC5qcyBiL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLWxpc3AuanMKaW5kZXggMDJhMzBlOC4uZGM3ZmEwMSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctbGlzcC5qcworKysgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1saXNwLmpzCkBAIC0xLDMgKzEsMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogdmFyIGE9bnVsbDsKIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sib3BuIiwvXlwoKy8sYSwiKCJdLFsiY2xvIiwvXlwpKy8sYSwiKSJdLFsiY29tIiwvXjtbXlxuXHJdKi8sYSwiOyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxhLCJcdFxuXHIgXHhhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLGEsJyInXV0sW1sia3dkIiwvXig/OmJsb2NrfGNbYWRdK3J8Y2F0Y2h8Y29uW2RzXXxkZWYoPzppbmV8dW4pfGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLGFdLAogWyJsaXQiLC9eWystXT8oPzpbIzBdeFtcZGEtZl0rfFxkK1wvXGQrfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86W2RlXVsrLV0/XGQrKT8pL2ldLFsibGl0IiwvXicoPzotKig/Olx3fFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/KT8vXSxbInBsbiIsL14tKig/OltfYS16XXxcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPy9pXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiY2wiLCJlbCIsImxpc3AiLCJzY20iXSk7CmRpZmYgLS1naXQgYS9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1sdWEuanMgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1sdWEuanMKaW5kZXggZTgzYTNjNC4uZjAyMDExZSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctbHVhLmpzCisrKyBiL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLWx1YS5qcwpAQCAtMSwyICsxLDE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXi0tKD86XFsoPSopXFtbXFNcc10qPyg/Ol1cMV18JCl8W15cblxyXSopL10sWyJzdHIiLC9eXFsoPSopXFtbXFNcc10qPyg/Ol1cMV18JCkvXSxbImt3ZCIsL14oPzphbmR8YnJlYWt8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGZhbHNlfGZvcnxmdW5jdGlvbnxpZnxpbnxsb2NhbHxuaWx8bm90fG9yfHJlcGVhdHxyZXR1cm58dGhlbnx0cnVlfHVudGlsfHdoaWxlKVxiLyxudWxsXSxbImxpdCIsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWystXT9cZCspPykvaV0sCiBbInBsbiIsL15bX2Etel1cdyovaV0sWyJwdW4iLC9eW15cd1x0XG5cciBceGEwXVteXHdcdFxuXHIgIicrPVx4YTAtXSovXV0pLFsibHVhIl0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctbWwuanMgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1tbC5qcwppbmRleCA2ZGYwMmQ3Li42ZDE3ZThiIDEwMDY0NAotLS0gYS9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1tbC5qcworKysgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1tbC5qcwpAQCAtMSwyICsxLDE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbImNvbSIsL14jKD86aWZbXHRcblxyIFx4YTBdKyg/OlskX2Etel1bXHcnXSp8YGBbXlx0XG5ccmBdKig/OmBgfCQpKXxlbHNlfGVuZGlmfGxpZ2h0KS9pLG51bGwsIiMiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKD86J3wkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86XC9cL1teXG5ccl0qfFwoXCpbXFNcc10qP1wqXCkpL10sWyJrd2QiLC9eKD86YWJzdHJhY3R8YW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xkZWZhdWx0fGRlbGVnYXRlfGRvfGRvbmV8ZG93bmNhc3R8ZG93bnRvfGVsaWZ8ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybnxmYWxzZXxmaW5hbGx5fGZvcnxmdW58ZnVuY3Rpb258aWZ8aW58aW5oZXJpdHxpbmxpbmV8aW50ZXJmYWNlfGludGVybmFsfGxhenl8bGV0fG1hdGNofG1lbWJlcnxtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b2Z8b3BlbnxvcnxvdmVycmlkZXxwcml2YXRlfHB1YmxpY3xyZWN8cmV0dXJufHN0YXRpY3xzdHJ1Y3R8dGhlbnx0b3x0cnVlfHRyeXx0eXBlfHVwY2FzdHx1c2V8dmFsfHZvaWR8d2hlbnx3aGlsZXx3aXRofHlpZWxkfGFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kfHNpZ3xhdG9taWN8YnJlYWt8Y2hlY2tlZHxjb21wb25lbnR8Y29uc3R8Y29uc3RyYWludHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxlYWdlcnxldmVudHxleHRlcm5hbHxmaXhlZHxmdW5jdG9yfGdsb2JhbHxpbmNsdWRlfG1ldGhvZHxtaXhpbnxvYmplY3R8cGFyYWxsZWx8cHJvY2Vzc3xwcm90ZWN0ZWR8cHVyZXxzZWFsZWR8dHJhaXR8dmlydHVhbHx2b2xhdGlsZSlcYi9dLAogWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLFsicGxuIiwvXig/OltfYS16XVtcdyddKlshIz9dP3xgYFteXHRcblxyYF0qKD86YGB8JCkpL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXSsvXV0pLFsiZnMiLCJtbCJdKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLXByb3RvLmpzIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMKaW5kZXggZjAwNmFkOC4uNzQxYTQzOCAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMKKysrIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMKQEAgLTEgKzEsMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5zb3VyY2VEZWNvcmF0b3Ioe2tleXdvcmRzOiJieXRlcyxkZWZhdWx0LGRvdWJsZSxlbnVtLGV4dGVuZCxleHRlbnNpb25zLGZhbHNlLGdyb3VwLGltcG9ydCxtYXgsbWVzc2FnZSxvcHRpb24sb3B0aW9uYWwscGFja2FnZSxyZXBlYXRlZCxyZXF1aXJlZCxyZXR1cm5zLHJwYyxzZXJ2aWNlLHN5bnRheCx0byx0cnVlIix0eXBlczovXihib29sfChkb3VibGV8cz9maXhlZHxbc3VdP2ludCkoMzJ8NjQpfGZsb2F0fHN0cmluZylcYi8sY1N0eWxlQ29tbWVudHM6ITB9KSxbInByb3RvIl0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctc3FsLmpzIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctc3FsLmpzCmluZGV4IGRhNzA1YjAuLjA5ZDY1NTggMTAwNjQ0Ci0tLSBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLXNxbC5qcworKysgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy1zcWwuanMKQEAgLTEsMiArMSwxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXC4pKiJ8Jyg/OlteJ1xcXXxcXC4pKicpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/Oi0tW15cblxyXSp8XC9cKltcU1xzXSo/KD86XCpcL3wkKSkvXSxbImt3ZCIsL14oPzphZGR8YWxsfGFsdGVyfGFuZHxhbnl8YXN8YXNjfGF1dGhvcml6YXRpb258YmFja3VwfGJlZ2lufGJldHdlZW58YnJlYWt8YnJvd3NlfGJ1bGt8Ynl8Y2FzY2FkZXxjYXNlfGNoZWNrfGNoZWNrcG9pbnR8Y2xvc2V8Y2x1c3RlcmVkfGNvYWxlc2NlfGNvbGxhdGV8Y29sdW1ufGNvbW1pdHxjb21wdXRlfGNvbnN0cmFpbnR8Y29udGFpbnN8Y29udGFpbnN0YWJsZXxjb250aW51ZXxjb252ZXJ0fGNyZWF0ZXxjcm9zc3xjdXJyZW50fGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8Y3VycmVudF91c2VyfGN1cnNvcnxkYXRhYmFzZXxkYmNjfGRlYWxsb2NhdGV8ZGVjbGFyZXxkZWZhdWx0fGRlbGV0ZXxkZW55fGRlc2N8ZGlza3xkaXN0aW5jdHxkaXN0cmlidXRlZHxkb3VibGV8ZHJvcHxkdW1teXxkdW1wfGVsc2V8ZW5kfGVycmx2bHxlc2NhcGV8ZXhjZXB0fGV4ZWN8ZXhlY3V0ZXxleGlzdHN8ZXhpdHxmZXRjaHxmaWxlfGZpbGxmYWN0b3J8Zm9yfGZvcmVpZ258ZnJlZXRleHR8ZnJlZXRleHR0YWJsZXxmcm9tfGZ1bGx8ZnVuY3Rpb258Z290b3xncmFudHxncm91cHxoYXZpbmd8aG9sZGxvY2t8aWRlbnRpdHl8aWRlbnRpdHljb2x8aWRlbnRpdHlfaW5zZXJ0fGlmfGlufGluZGV4fGlubmVyfGluc2VydHxpbnRlcnNlY3R8aW50b3xpc3xqb2lufGtleXxraWxsfGxlZnR8bGlrZXxsaW5lbm98bG9hZHxtYXRjaHxtZXJnZXxuYXRpb25hbHxub2NoZWNrfG5vbmNsdXN0ZXJlZHxub3R8bnVsbHxudWxsaWZ8b2Z8b2ZmfG9mZnNldHN8b258b3BlbnxvcGVuZGF0YXNvdXJjZXxvcGVucXVlcnl8b3BlbnJvd3NldHxvcGVueG1sfG9wdGlvbnxvcnxvcmRlcnxvdXRlcnxvdmVyfHBlcmNlbnR8cGxhbnxwcmVjaXNpb258cHJpbWFyeXxwcmludHxwcm9jfHByb2NlZHVyZXxwdWJsaWN8cmFpc2Vycm9yfHJlYWR8cmVhZHRleHR8cmVjb25maWd1cmV8cmVmZXJlbmNlc3xyZXBsaWNhdGlvbnxyZXN0b3JlfHJlc3RyaWN0fHJldHVybnxyZXZva2V8cmlnaHR8cm9sbGJhY2t8cm93Y291bnR8cm93Z3VpZGNvbHxydWxlfHNhdmV8c2NoZW1hfHNlbGVjdHxzZXNzaW9uX3VzZXJ8c2V0fHNldHVzZXJ8c2h1dGRvd258c29tZXxzdGF0aXN0aWNzfHN5c3RlbV91c2VyfHRhYmxlfHRleHRzaXplfHRoZW58dG98dG9wfHRyYW58dHJhbnNhY3Rpb258dHJpZ2dlcnx0cnVuY2F0ZXx0c2VxdWFsfHVuaW9ufHVuaXF1ZXx1cGRhdGV8dXBkYXRldGV4dHx1c2V8dXNlcnx1c2luZ3x2YWx1ZXN8dmFyeWluZ3x2aWV3fHdhaXRmb3J8d2hlbnx3aGVyZXx3aGlsZXx3aXRofHdyaXRldGV4dCkoPz1bXlx3LV18JCkvaSwKIG51bGxdLFsibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSxbInBsbiIsL15bX2Etel1bXHctXSovaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1x4YTBdW15cd1x0XG5cciAiJytceGEwLV0qL11dKSxbInNxbCJdKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLXZiLmpzIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctdmIuanMKaW5kZXggMDc1MDZiMC4uZGFkODA5ZSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctdmIuanMKKysrIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctdmIuanMKQEAgLTEsMiArMSwxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBcdTIwMjhcdTIwMjldKy8sbnVsbCwiXHRcblxyIMJceGEw4oCo4oCpIl0sWyJzdHIiLC9eKD86WyJcdTIwMWNcdTIwMWRdKD86W14iXHUyMDFjXHUyMDFkXXxbIlx1MjAxY1x1MjAxZF17Mn0pKD86WyJcdTIwMWNcdTIwMWRdY3wkKXxbIlx1MjAxY1x1MjAxZF0oPzpbXiJcdTIwMWNcdTIwMWRdfFsiXHUyMDFjXHUyMDFkXXsyfSkqKD86WyJcdTIwMWNcdTIwMWRdfCQpKS9pLG51bGwsJyLigJzigJ0nXSxbImNvbSIsL15bJ1x1MjAxOFx1MjAxOV0uKi8sbnVsbCwiJ+KAmOKAmSJdXSxbWyJrd2QiLC9eKD86YWRkaGFuZGxlcnxhZGRyZXNzb2Z8YWxpYXN8YW5kfGFuZGFsc298YW5zaXxhc3xhc3NlbWJseXxhdXRvfGJvb2xlYW58YnlyZWZ8Ynl0ZXxieXZhbHxjYWxsfGNhc2V8Y2F0Y2h8Y2Jvb2x8Y2J5dGV8Y2NoYXJ8Y2RhdGV8Y2RibHxjZGVjfGNoYXJ8Y2ludHxjbGFzc3xjbG5nfGNvYmp8Y29uc3R8Y3Nob3J0fGNzbmd8Y3N0cnxjdHlwZXxkYXRlfGRlY2ltYWx8ZGVjbGFyZXxkZWZhdWx0fGRlbGVnYXRlfGRpbXxkaXJlY3RjYXN0fGRvfGRvdWJsZXxlYWNofGVsc2V8ZWxzZWlmfGVuZHxlbmRpZnxlbnVtfGVyYXNlfGVycm9yfGV2ZW50fGV4aXR8ZmluYWxseXxmb3J8ZnJpZW5kfGZ1bmN0aW9ufGdldHxnZXR0eXBlfGdvc3VifGdvdG98aGFuZGxlc3xpZnxpbXBsZW1lbnRzfGltcG9ydHN8aW58aW5oZXJpdHN8aW50ZWdlcnxpbnRlcmZhY2V8aXN8bGV0fGxpYnxsaWtlfGxvbmd8bG9vcHxtZXxtb2R8bW9kdWxlfG11c3Rpbmhlcml0fG11c3RvdmVycmlkZXxteWJhc2V8bXljbGFzc3xuYW1lc3BhY2V8bmV3fG5leHR8bm90fG5vdGluaGVyaXRhYmxlfG5vdG92ZXJyaWRhYmxlfG9iamVjdHxvbnxvcHRpb258b3B0aW9uYWx8b3J8b3JlbHNlfG92ZXJsb2Fkc3xvdmVycmlkYWJsZXxvdmVycmlkZXN8cGFyYW1hcnJheXxwcmVzZXJ2ZXxwcml2YXRlfHByb3BlcnR5fHByb3RlY3RlZHxwdWJsaWN8cmFpc2VldmVudHxyZWFkb25seXxyZWRpbXxyZW1vdmVoYW5kbGVyfHJlc3VtZXxyZXR1cm58c2VsZWN0fHNldHxzaGFkb3dzfHNoYXJlZHxzaG9ydHxzaW5nbGV8c3RhdGljfHN0ZXB8c3RvcHxzdHJpbmd8c3RydWN0dXJlfHN1YnxzeW5jbG9ja3x0aGVufHRocm93fHRvfHRyeXx0eXBlb2Z8dW5pY29kZXx1bnRpbHx2YXJpYW50fHdlbmR8d2hlbnx3aGlsZXx3aXRofHdpdGhldmVudHN8d3JpdGVvbmx5fHhvcnxlbmRpZnxnb3N1YnxsZXR8dmFyaWFudHx3ZW5kKVxiL2ksCiBudWxsXSxbImNvbSIsL15yZW0uKi9pXSxbImxpdCIsL14oPzp0cnVlXGJ8ZmFsc2VcYnxub3RoaW5nXGJ8XGQrKD86ZVsrLV0/XGQrW2Rmcl0/fFtkZmlscnNdKT98KD86JmhbXGRhLWZdK3wmb1swLTddKylbaWxzXT98XGQqXC5cZCsoPzplWystXT9cZCspP1tkZnJdP3wjXHMrKD86XGQrWy8tXVxkK1svLV1cZCsoPzpccytcZCs6XGQrKD86OlxkKyk/KFxzKig/OmFtfHBtKSk/KT98XGQrOlxkKyg/OjpcZCspPyhccyooPzphbXxwbSkpPylccysjKS9pXSxbInBsbiIsL14oPzooPzpbYS16XXxfXHcpXHcqfFxbKD86W2Etel18X1x3KVx3Kl0pL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidbXF1ceGEwXHUyMDE4XHUyMDE5XHUyMDFjXHUyMDFkXHUyMDI4XHUyMDI5XSsvXSxbInB1biIsL14oPzpcW3xdKS9dXSksWyJ2YiIsInZicyJdKTsKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLXdpa2kuanMgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvbGFuZy13aWtpLmpzCmluZGV4IDliMGI0NDguLmQ0M2I3NGYgMTAwNjQ0Ci0tLSBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9sYW5nLXdpa2kuanMKKysrIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L2xhbmctd2lraS5qcwpAQCAtMSwyICsxLDE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcZFx0IGEtZ2ktelx4YTBdKy8sbnVsbCwiXHQgwlx4YTBhYmNkZWZnaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSJdLFsicHVuIiwvXlsqPVtcXV5+XSsvLG51bGwsIj0qfl5bXSJdXSxbWyJsYW5nLXdpa2kubWV0YSIsLyg/Ol5efFxyXG4/fFxuKSgjW2Etel0rKVxiL10sWyJsaXQiLC9eW0EtWl1bYS16XVtcZGEtel0rW0EtWl1bYS16XVteXFdfXStcYi9dLFsibGFuZy0iLC9ee3t7KFtcU1xzXSs/KX19fS9dLFsibGFuZy0iLC9eYChbXlxuXHJgXSspYC9dLFsic3RyIiwvXmh0dHBzPzpcL1wvW15ccyMvP10qKD86XC9bXlxzIz9dKik/KD86XD9bXlxzI10qKT8oPzojXFMqKT8vaV0sWyJwbG4iLC9eKD86XHJcbnxbXFNcc10pW15cblxyIyo9QS1bXmBoe35dKi9dXSksWyJ3aWtpIl0pOwogUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJrd2QiLC9eI1thLXpdKy9pLG51bGwsIiMiXV0sW10pLFsid2lraS5tZXRhIl0pOwpkaWZmIC0tZ2l0IGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L3ByZXR0aWZ5LmNzcyBiL2x1Y2VuZS90b29scy9wcmV0dGlmeS9wcmV0dGlmeS5jc3MKaW5kZXggZDQ0YjNhMi4uOThmNTg1MSAxMDA2NDQKLS0tIGEvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L3ByZXR0aWZ5LmNzcworKysgYi9sdWNlbmUvdG9vbHMvcHJldHRpZnkvcHJldHRpZnkuY3NzCkBAIC0xICsxLDE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIC5wbG57Y29sb3I6IzAwMH1AbWVkaWEgc2NyZWVuey5zdHJ7Y29sb3I6IzA4MH0ua3dke2NvbG9yOiMwMDh9LmNvbXtjb2xvcjojODAwfS50eXB7Y29sb3I6IzYwNn0ubGl0e2NvbG9yOiMwNjZ9LnB1biwub3BuLC5jbG97Y29sb3I6IzY2MH0udGFne2NvbG9yOiMwMDh9LmF0bntjb2xvcjojNjA2fS5hdHZ7Y29sb3I6IzA4MH0uZGVjLC52YXJ7Y29sb3I6IzYwNn0uZnVue2NvbG9yOnJlZH19QG1lZGlhIHByaW50LHByb2plY3Rpb257LnN0cntjb2xvcjojMDYwfS5rd2R7Y29sb3I6IzAwNjtmb250LXdlaWdodDpib2xkfS5jb217Y29sb3I6IzYwMDtmb250LXN0eWxlOml0YWxpY30udHlwe2NvbG9yOiM0MDQ7Zm9udC13ZWlnaHQ6Ym9sZH0ubGl0e2NvbG9yOiMwNDR9LnB1biwub3BuLC5jbG97Y29sb3I6IzQ0MH0udGFne2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uYXRue2NvbG9yOiM0MDR9LmF0dntjb2xvcjojMDYwfX1wcmUucHJldHR5cHJpbnR7cGFkZGluZzoycHg7Ym9yZGVyOjFweCBzb2xpZCAjODg4fW9sLmxpbmVudW1ze21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9bGkuTDAsbGkuTDEsbGkuTDIsbGkuTDMsbGkuTDUsbGkuTDYsbGkuTDcsbGkuTDh7bGlzdC1zdHlsZS10eXBlOm5vbmV9bGkuTDEsbGkuTDMsbGkuTDUsbGkuTDcsbGkuTDl7YmFja2dyb3VuZDojZWVlfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2x1Y2VuZS90b29scy9wcmV0dGlmeS9wcmV0dGlmeS5qcyBiL2x1Y2VuZS90b29scy9wcmV0dGlmeS9wcmV0dGlmeS5qcwppbmRleCBlZWY1YWQ3Li5kYzM1YzY1IDEwMDY0NAotLS0gYS9sdWNlbmUvdG9vbHMvcHJldHRpZnkvcHJldHRpZnkuanMKKysrIGIvbHVjZW5lL3Rvb2xzL3ByZXR0aWZ5L3ByZXR0aWZ5LmpzCkBAIC0xLDMgKzEsMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogdmFyIHE9bnVsbDt3aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT049ITA7CiAoZnVuY3Rpb24oKXtmdW5jdGlvbiBMKGEpe2Z1bmN0aW9uIG0oYSl7dmFyIGY9YS5jaGFyQ29kZUF0KDApO2lmKGYhPT05MilyZXR1cm4gZjt2YXIgYj1hLmNoYXJBdCgxKTtyZXR1cm4oZj1yW2JdKT9mOiIwIjw9YiYmYjw9IjciP3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDgpOmI9PT0idSJ8fGI9PT0ieCI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMiksMTYpOmEuY2hhckNvZGVBdCgxKX1mdW5jdGlvbiBlKGEpe2lmKGE8MzIpcmV0dXJuKGE8MTY/IlxceDAiOiJcXHgiKSthLnRvU3RyaW5nKDE2KTthPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoYT09PSJcXCJ8fGE9PT0iLSJ8fGE9PT0iWyJ8fGE9PT0iXSIpYT0iXFwiK2E7cmV0dXJuIGF9ZnVuY3Rpb24gaChhKXtmb3IodmFyIGY9YS5zdWJzdHJpbmcoMSxhLmxlbmd0aC0xKS5tYXRjaCgvXFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcWzAtM11bMC03XXswLDJ9fFxcWzAtN117MSwyfXxcXFtcU1xzXXxbXlxcXS9nKSxhPQogW10sYj1bXSxvPWZbMF09PT0iXiIsYz1vPzE6MCxpPWYubGVuZ3RoO2M8aTsrK2Mpe3ZhciBqPWZbY107aWYoL1xcW2Jkc3ddL2kudGVzdChqKSlhLnB1c2goaik7ZWxzZXt2YXIgaj1tKGopLGQ7YysyPGkmJiItIj09PWZbYysxXT8oZD1tKGZbYysyXSksYys9Mik6ZD1qO2IucHVzaChbaixkXSk7ZDw2NXx8aj4xMjJ8fChkPDY1fHxqPjkwfHxiLnB1c2goW01hdGgubWF4KDY1LGopfDMyLE1hdGgubWluKGQsOTApfDMyXSksZDw5N3x8aj4xMjJ8fGIucHVzaChbTWF0aC5tYXgoOTcsaikmLTMzLE1hdGgubWluKGQsMTIyKSYtMzNdKSl9fWIuc29ydChmdW5jdGlvbihhLGYpe3JldHVybiBhWzBdLWZbMF18fGZbMV0tYVsxXX0pO2Y9W107aj1bTmFOLE5hTl07Zm9yKGM9MDtjPGIubGVuZ3RoOysrYylpPWJbY10saVswXTw9alsxXSsxP2pbMV09TWF0aC5tYXgoalsxXSxpWzFdKTpmLnB1c2goaj1pKTtiPVsiWyJdO28mJmIucHVzaCgiXiIpO2IucHVzaC5hcHBseShiLGEpO2ZvcihjPTA7YzwKZGlmZiAtLWdpdCBhL3NvbHIvQ0hBTkdFUy50eHQgYi9zb2xyL0NIQU5HRVMudHh0CmluZGV4IDUxZWZmNWIuLjE5ODBlZDggMTAwNjQ0Ci0tLSBhL3NvbHIvQ0hBTkdFUy50eHQKKysrIGIvc29sci9DSEFOR0VTLnR4dApAQCAtMjQsNyArMjQsNyBAQAogCiBWZXJzaW9ucyBvZiBNYWpvciBDb21wb25lbnRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFwYWNoZSBUaWthIDEuMworQXBhY2hlIFRpa2EgMS40CiBDYXJyb3QyIDMuNi4yCiBWZWxvY2l0eSAxLjcgYW5kIFZlbG9jaXR5IFRvb2xzIDIuMAogQXBhY2hlIFVJTUEgMi4zLjEKQEAgLTMzLDcgKzMzLDggQEAKIFVwZ3JhZGluZyBmcm9tIFNvbHIgNC54CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRCRC4uLgorVGhlICJmaWxlIiBhdHRyaWJ1dGUgb2YgaW5mb1N0cmVhbSBpbiBzb2xyY29uZmlnLnhtbCBpcyByZW1vdmVkLiBDb250cm9sIHRoaXMgCit2aWEgeW91ciBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gKG9yZy5hcGFjaGUuc29sci51cGRhdGUuTG9nZ2luZ0luZm9TdHJlYW0pIGluc3RlYWQuCiAKIERldGFpbGVkIENoYW5nZSBMaXN0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NCwxMSArNDUsMTUgQEAKICogU09MUi00NjIyOiBIYXJkY29kZWQgU29sckNsb3VkIGRlZmF1bHRzIGZvciBob3N0Q29udGV4dCBhbmQgaG9zdFBvcnQgdGhhdAogICB3ZXJlIGRlcHJlY2F0ZWQgaW4gNC4zIGhhdmUgYmVlbiByZW1vdmVkIGNvbXBsZXRlbHkuIChob3NzbWFuKQogCisqIFNPTFItNDc5MjogU3RvcCBzaGlwcGluZyBhIC53YXIuIChSb2JlcnQgTXVpcikKKworKiBTT0xSLTQ5NDg6IFRpZGllZCB1cCBDb3JlQ29udGFpbmVyIGNvbnN0cnVjdGlvbiBsb2dpYy4gIChBbGFuIFdvb2R3YXJkKQorCiA9PT09PT09PT09PT09PT09PT0gIDQuNC4wID09PT09PT09PT09PT09PT09PQogCiBWZXJzaW9ucyBvZiBNYWpvciBDb21wb25lbnRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFwYWNoZSBUaWthIDEuMworQXBhY2hlIFRpa2EgMS40CiBDYXJyb3QyIDMuNi4yCiBWZWxvY2l0eSAxLjcgYW5kIFZlbG9jaXR5IFRvb2xzIDIuMAogQXBhY2hlIFVJTUEgMi4zLjEKQEAgLTU3LDkgKzYyLDMwIEBACiBVcGdyYWRpbmcgZnJvbSBTb2xyIDQuMy4wCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyogVGllcmVkTWVyZ2VQb2xpY3kgYW5kIHRoZSB2YXJpb3VzIHN1YnR5cGVzIG9mIExvZ01lcmdlUG9saWN5IG5vIGxvbmdlciBoYXZlIAorICBhbiBleHBsaWNpdCAic2V0VXNlQ29tcG91bmRGaWxlIiBtZXRob2QuICBJbnN0ZWFkIHRoZSBiZWhhdmlvciBvZiBuZXcgCisgIHNlZ21lbnRzIGlzIGRldGVybWluZWQgYnkgdGhlIEluZGV4V3JpdGVyIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgTWVyZ2VQb2xpY3kgCisgIGlzIG9ubHkgY29uc3VsdGVkIHRvIGRldGVybWluZSBpZiBtZXJnZSBzZWdlbWVudHMgc2hvdWxkIHVzZSB0aGUgY29tcG91bmQgCisgIGZpbGUgZm9ybWF0IChiYXNlZCBvbiB0aGUgdmFsdWUgb2YgInNldE5vQ0ZTUmF0aW8iKS4gIElmIHlvdSBoYXZlIGV4cGxpY2l0bHkgCisgIGNvbmZpZ3VyZWQgb25lIG9mIHRoZXNlIGNsYXNzZXMgdXNpbmcgPG1lcmdlUG9saWN5PiBhbmQgaW5jbHVkZSBhbiBpbml0IGFyZyAKKyAgbGlrZSB0aGlzLi4uCisgICAgIDxib29sIG5hbWU9InVzZUNvbXBvdW5kRmlsZSI+dHJ1ZTwvYm9vbD4KKyAgLi4udGhpcyB3aWxsIG5vdyBiZSB0cmVhdGVkIGFzIGlmIHlvdSBzcGVjaWZpZWQuLi4KKyAgICAgPHVzZUNvbXBvdW5kRmlsZT50cnVlPC91c2VDb21wb3VuZEZpbGU+IAorICAuLi5kaXJlY3RseSBvbiB0aGUgPGluZGV4Q29uZmlnPiAob3ZlcnJpZGluZyBhbnkgdmFsdWUgYWxyZWFkeSBzZXQgdXNpbmcgdGhhdAorICBzeW50YXgpIGFuZCBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQgdG8gdXBkYXRlZCB5b3VyIGNvbmZpZ3VyYXRpb24uICBVc2VycyAKKyAgd2l0aCBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIDxtZXJnZVBvbGljeT4gYXJlIGVuY291cmFnZWQgdG8gcmV2aWV3IHRoZSAKKyAgY3VycmVudCBqYXZhZG9jcyBmb3IgdGhlaXIgTWVyZ2VQb2xpY3kgc3ViY2xhc3MgYW5kIHJldmlldyB0aGVpciBjb25maWd1cmVkIAorICBvcHRpb25zIGNhcmVmdWxseS4gIFNlZSBTT0xSLTQ5NDEsIFNPTFItNDkzNCBhbmQgTFVDRU5FLTUwMzggZm9yIG1vcmUgCisgIGluZm9ybWF0aW9uLgorCiAqIFNPTFItNDc3ODogVGhlIHNpZ25hdHVyZSBvZiBMb2dXYXRjaGVyLnJlZ2lzdGVyTGlzdGVuZXIgaGFzIGNoYW5nZWQsIGZyb20KICAgKExpc3RlbmVyQ29uZmlnLCBDb3JlQ29udGFpbmVyKSB0byAoTGlzdGVuZXJDb25maWcpLiAgVXNlcnMgaW1wbGVtZW50aW5nIHRoZWlyCiAgIG93biBMb2dXYXRjaGVyIGNsYXNzZXMgd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGVpciBjb2RlIGFjY29yZGluZ2x5LgorCisqIExVQ0VORS01MDYzOiBCeXRlRmllbGQgYW5kIFNob3J0RmllbGQgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorICBpbiA1LjAuIElmIHlvdSBhcmUgc3RpbGwgdXNpbmcgdGhlc2UgZmllbGQgdHlwZXMsIHlvdSBzaG91bGQgbWlncmF0ZSB5b3VyCisgIGZpZWxkcyB0byBUcmllSW50RmllbGQuCiAgIAogRGV0YWlsZWQgQ2hhbmdlIExpc3QKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY5LDggKzk1LDkgQEAKIAogKiBTT0xSLTMyNTE6IER5bmFtaWNhbGx5IGFkZCBmaWVsZHMgdG8gc2NoZW1hLiAoU3RldmUgUm93ZSwgUm9iZXJ0IE11aXIsIHlvbmlrKSAgIAogCi0qIFNPTFItNDc2MTogQWRkIG9wdGlvbiB0byBwbHVnaW4gYSBtZXJnZWQgc2VnbWVudCB3YXJtZXIgaW50byBzb2xyY29uZmlnLnhtbAotICAoTWFyayBNaWxsZXIsIE1pa2UgTWNDYW5kbGVzcywgUm9iZXJ0IE11aXIpCisqIFNPTFItNDc2MSwgU09MUi00OTc2OiBBZGQgb3B0aW9uIHRvIHBsdWdpbiBhIG1lcmdlZCBzZWdtZW50IHdhcm1lciBpbnRvIHNvbHJjb25maWcueG1sLiAKKyAgSW5mbyBhYm91dCBzZWdtZW50cyB3YXJtZWQgaW4gdGhlIGJhY2tncm91bmQgaXMgYXZhaWxhYmxlIHZpYSBpbmZvc3RyZWFtLgorICAoTWFyayBNaWxsZXIsIFJ5YW4gRXJuc3QsIE1pa2UgTWNDYW5kbGVzcywgUm9iZXJ0IE11aXIpCiAKICogU09MUi0zMjQwOiBBZGQgInNwZWxsY2hlY2suY29sbGF0ZU1heENvbGxlY3REb2NzIiBvcHRpb24gc28gdGhhdCB3aGVuIHRlc3RpbmcKICAgcG90ZW50aWFsIENvbGxhdGlvbnMgYWdhaW5zdCB0aGUgaW5kZXgsIFNwZWxsQ2hlY2tDb21wb25lbnQgd2lsbCBvbmx5IGNvbGxlY3QKQEAgLTg2LDYgKzExMyw0MyBAQAogCiAqIFNPTFItNDIyODogU29sckoncyBTb2xyUGluZyBvYmplY3QgaGFzIG5ldyBtZXRob2RzIGZvciBwaW5nLCBlbmFibGUsIGFuZAogICBkaXNhYmxlLiAoU2hhd24gSGVpc2V5LCBob3NzbWFuLCBTdGV2ZSBSb3dlKQorICAKKyogU09MUi00ODkzOiBFeHRlbmQgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5Db25maWd1cmFibGVGaWVsZE5hbWVTZWxlY3RvcgorICB0byBlbmFibGUgY2hlY2tpbmcgd2hldGhlciBhIGZpZWxkIG1hdGNoZXMgYW55IHNjaGVtYSBmaWVsZC4gIFRvIHNlbGVjdCBmaWVsZAorICBuYW1lcyB0aGF0IGRvbid0IG1hdGNoIGFueSBmaWVsZHMgb3IgZHluYW1pYyBmaWVsZHMgaW4gdGhlIHNjaGVtYSwgYWRkCisgIDxib29sIG5hbWU9ImZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZCI+ZmFsc2U8L2Jvb2w+IHRvIGFuIHVwZGF0ZQorICBwcm9jZXNzb3IncyBjb25maWd1cmF0aW9uIGluIHNvbHJjb25maWcueG1sLiAgKFN0ZXZlIFJvd2UsIGhvc3NtYW4pCisKKyogU09MUi00OTIxOiBBZG1pbiBVSSBub3cgc3VwcG9ydHMgYWRkaW5nIGRvY3VtZW50cyB0byBTb2xyIChnc2luZ2Vycywgc3RlZmZrZXMpCisKKyogU09MUi00OTE2OiBBZGQgc3VwcG9ydCB0byB3cml0ZSBhbmQgcmVhZCBTb2xyIGluZGV4IGZpbGVzIGFuZCB0cmFuc2FjdGlvbiBsb2cKKyAgZmlsZXMgdG8gYW5kIGZyb20gSERGUy4gKHBodW50LCBNYXJrIE1pbGxlciwgR3JlZyBDaGFuYW4pCisgIAorKiBTT0xSLTQ4OTI6IEFkZCBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSBzdWJjbGFzc2VzIAorICBQYXJzZXtEYXRlLEludGVnZXIsTG9uZyxGbG9hdCxEb3VibGUsQm9vbGVhbn1VcGRhdGVQcm9jZXNzb3JGYWN0b3J5LiBUaGVzZQorICBmYWN0b3JpZXMgaGF2ZSBhIGRlZmF1bHQgc2VsZWN0b3IgdGhhdCBtYXRjaGVzIGFsbCBmaWVsZHMgdGhhdCBlaXRoZXIgZG9u4oCZdAorICBtYXRjaCBhbnkgc2NoZW1hIGZpZWxkLCBvciBhcmUgaW4gdGhlIHNjaGVtYSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgIHR5cGVDbGFzcy4gSWYgdGhleSBzZWUgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIENoYXJTZXF1ZW5jZSwgb3IgY2FuJ3QgcGFyc2UKKyAgdGhlIHZhbHVlLCB0aGV5IGxlYXZlIGl0IGFzIGlzLiBGb3IgbXVsdGktdmFsdWVkIGZpZWxkcywgdGhlc2UgcHJvY2Vzc29ycworICB3aWxsIG5vdCBjb252ZXJ0IGFueSB2YWx1ZXMgdW5sZXNzIGFsbCBhcmUgZmlyc3Qgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgb3IgCisgIGFscmVhZHkgYXJlIGluc3RhbmNlcyBvZiB0aGUgdGFyZ2V0IGNsYXNzLiBPcmRlcmluZyB0aGUgcHJvY2Vzc29ycywgZS5nLgorICBbQm9vbGVhbiwgTG9uZywgRG91YmxlLCBEYXRlXSB3aWxsIGFsbG93IGUuZy4gdmFsdWVzIFsiMiIsICI1IiwgIjguNiJdIHRvCisgIGJlIGxlZnQgYWxvbmUgYnkgdGhlIEJvb2xlYW4gYW5kIExvbmcgcHJvY2Vzc29ycywgYnV0IHRoZW4gY29udmVydGVkIGJ5IHRoZQorICBEb3VibGUgcHJvY2Vzc29yLiAgKFN0ZXZlIFJvd2UsIGhvc3NtYW4pCisKKyogU09MUi00OTcyOiBBZGQgUFVUIGNvbW1hbmQgdG8gWmtDbGkgdG9vbC4gKFJvbWFuIFNoYXBvc2huaWsgdmlhIE1hcmsgTWlsbGVyKQorCisqIFNPTFItNDk3MzogQWRkaW5nIGdldHRlciBtZXRob2QgZm9yIGRlZmF1bHRDb2xsZWN0aW9uIG9uIENsb3VkU29sclNlcnZlci4KKyAgKEZ1cmthbiBLQU1BQ0kgdmlhIE1hcmsgTWlsbGVyKQorICAKKyogU09MUi00ODk3OiBBZGQgc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy8sIGFuIGV4YW1wbGUgY29uZmlnIHNldAorICBmb3Igc2NoZW1hbGVzcyBtb2RlLiAoU3RldmUgUm93ZSkKKworKiBTT0xSLTQ2NTU6IEFkZCBvcHRpb24gdG8gaGF2ZSBPdmVyc2VlciBhc3NpZ24gZ2VuZXJpYyBub2RlIG5hbWVzIHNvIHRoYXQKKyAgbmV3IGFkZHJlc3NlcyBjYW4gaG9zdCBzaGFyZHMgd2l0aG91dCBuYW1pbmcgY29uZnVzaW9uLiAoTWFyayBNaWxsZXIsIEFuc2h1bSBHdXB0YSkKKworKiBTT0xSLTQ5Nzc6IEFkZCBvcHRpb24gdG8gc2VuZCBJbmRleFdyaXRlcidzIGluZm9zdHJlYW0gdG8gdGhlIGxvZ2dpbmcgc3lzdGVtLgorICAoUnlhbiBFcm5zdCB2aWEgUm9iZXJ0IE11aXIpCiAKIEJ1ZyBGaXhlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE0LDYgKzE3OCw5MyBAQAogKiBTT0xSLTQ4NjM6IFJlbW92ZWQgbm9uLWV4aXN0ZW50IGF0dHJpYnV0ZSBzb3VyY2VJZCBmcm9tIGR5bmFtaWMgSk1YIHN0YXRzCiAgIHRvIGZpeCBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiAoc3VnYW51bWEsIGhvc3NtYW4gdmlhIHNoYWxpbikKIAorKiBTT0xSLTQ4OTE6IEpzb25Mb2FkZXIgc2hvdWxkIHByZXNlcnZlIGZpZWxkIHZhbHVlIHR5cGVzIGZyb20gdGhlIEpTT04gY29udGVudCBzdHJlYW0uCisgIChTdGV2ZSBSb3dlKQorIAorKiBTT0xSLTQ4MDU6IFNvbHJlQ29yZSNyZWxvYWQgc2hvdWxkIG5vdCBjYWxsIHByZVJlZ2lzdGVyIGFuZCBwdWJsaXNoIGEgRE9XTiBzdGF0ZSB0bworICBab29LZWVwZXIuIChNYXJrIE1pbGxlciwgSmFyZWQgUm9kcmlndWV6KQorCisqIFNPTFItNDg5OTogV2hlbiByZWNvbm5lY3RpbmcgYWZ0ZXIgWm9vS2VlcGVyIGV4cGlyYXRpb24sIHdlIG5lZWQgdG8gYmUgd2lsbGluZyB0byB3YWl0IAorICBmb3JldmVyLCBub3QganVzdCBmb3IgMzAgc2Vjb25kcy4gKE1hcmsgTWlsbGVyKQorCisqIFNPTFItNDkyMDogSmRiY0RhdGFTb3VyY2UgaW5jb3JyZWN0bHkgc3VwcHJlc3NlcyBleGNlcHRpb25zIHdoZW4gcmV0cmlldmluZyBhIGNvbm5lY3Rpb24gZnJvbQorICBhIEpOREkgY29udGV4dCBhbmQgZmFsbHMgYmFjayB0byB0cnlpbmcgdG8gdXNlIERyaXZlck1hbmFnZXIgdG8gb2J0YWluIGEgY29ubmVjdGlvbi4gQWRkaXRpb25hbGx5LAorICBpZiBhIFNRTEV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgaW5pdGlhbGl6aW5nIGEgY29ubmVjdGlvbiwgc3VjaCBhcyBpbiBzZXRBdXRvQ29tbWl0KCksIHRoZQorICBjb25uZWN0aW9uIHdpbGwgbm90IGJlIGNsb3NlZC4gKENocmlzIEVsZHJlZGdlIHZpYSBzaGFsaW4pCisKKyogU09MUi00OTE1OiBUaGUgcm9vdCBjYXVzZSBzaG91bGQgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgd2hlbiBhIFNvbHJDb3JlIGNyZWF0ZSBjYWxsIGZhaWxzLgorICAoTWFyayBNaWxsZXIpCisKKyogU09MUi00OTI1IDogQ29sbGVjdGlvbiBjcmVhdGUgdGhyb3dzIE5QRSB3aGVuICdudW1TaGFyZHMnIHBhcmFtIGlzIG1pc3NpbmcgKE5vYmxlIFBhdWwpCisKKyogU09MUi00OTEwOiBwZXJzaXN0aW5nIHNvbHIueG1sIGlzIGJyb2tlbi4gTW9yZSBzdHJpbmdlbnQgdGVzdGluZyBvZiBwZXJzaXN0ZW5jZSBmaXhlZAorICB1cCBhIG51bWJlciBvZiBpc3N1ZXMgYW5kIHNldmVyYWwgYnVncyB3aXRoIHBlcnNpc3RlbmNlLiBBbW9uZyB0aGVtIGFyZQorICA+IGRvbid0IHBlcnNpc3RpbmcgaW1wbGljaXQgcHJvcGVydGllcworICA+IHNob3VsZCBwZXJzaXN0IHprSG9zdCBpbiB0aGUgPHNvbHI+IHRhZyAodXNlcidzIGxpc3QpCisgID4gcmVsb2FkaW5nIGEgY29yZSB0aGF0IGhhcyB0cmFuc2llbnQ9InRydWUiIHJldHVybmVkIGFuIGVycm9yLiByZWxvYWQgc2hvdWxkIGxvYWQKKyAgICBhIHRyYW5zaWVudCBjb3JlIGlmIGl0J3Mgbm90IHlldCBsb2FkZWQuCisgID4gTm8gbG9uZ2VyIHBlcnNpc3RpbmcgbG9hZE9uU3RhcnR1cCBvciB0cmFuc2llbnQgY29yZSBwcm9wZXJ0aWVzIGlmIHRoZXkgd2VyZSBub3QKKyAgICBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIHNvbHIueG1sCisgID4gVGVzdGluZyBmbHVzaGVkIG91dCB0aGUgZmFjdCB0aGF0IHlvdSBjb3VsZG4ndCBzd2FwIGEgY29yZSBtYXJrZWQgdHJhbnNpZW50PXRydWUKKyAgICBsb2FkT25TdGFydHVwPWZhbHNlIGJlY2F1c2UgaXQgaGFkbid0IGJlZW4gbG9hZGVkIHlldC4KKyAgPiBTT0xSLTQ4NjIsIENSRUFURSBmYWlscyB0byBwZXJzaXN0IHNjaGVtYSwgY29uZmlnLCBhbmQgZGF0YURpcgorICA+IFNPTFItNDM2Mywgbm90IHBlcnNpc3RpbmcgY29yZUxvYWRUaHJlYWRzIGluIDxzb2xyPiB0YWcKKyAgPiBTT0xSLTM5MDAsIGxvZ1dhdGNoZXIgcHJvcGVydGllcyBub3QgcGVyc2lzdGVkCisgID4gU09MUi00ODUwLCBjb3JlcyBkZWZpbmVkIGFzIGxvYWRPblN0YXJ0dXA9dHJ1ZSwgdHJhbnNpZW50PWZhbHNlIGNhbid0IGJlIHNlYXJjaGVkCisgIChFcmljayBFcmlja3NvbikKKworKiBTT0xSLTQ5MjM6IENvbW1pdHMgdG8gbm9uIGxlYWRlcnMgYXMgcGFydCBvZiBhIHJlcXVlc3QgdGhhdCBhbHNvIGNvbnRhaW4gdXBkYXRlcworICBjYW4gZXhlY3V0ZSBvdXQgb2Ygb3JkZXIuIChob3NzbWFuLCBSaWNhcmRvIE1lcml6YWxkZSwgTWFyayBNaWxsZXIpCisKKyogU09MUi00OTMyOiBwZXJzaXN0aW5nIHNvbHIueG1sIHNhdmVzIHNvbWUgcGFyYW1ldGVycyBpdCBzaG91bGRuJ3Qgd2hlbiB0aGV5IHdlcmVuJ3QKKyAgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYWwuIEJlbmlnbiBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHNhdmVkLCBidXQgc3RpbGwgaW5jb3JyZWN0LgorICAoRXJpY2sgRXJpY2tzb24sIHRoYW5rcyBTaGF3biBIZWlzZXkgZm9yIGhlbHBpbmcgdGVzdCEpCisKKyogU09MUi00OTM0LCBTT0xSLTQ5NDE6IEZpeCBoYW5kbGluZyBvZiA8bWVyZ2VQb2xpY3k+IGluaXQgYXJnIAorICAidXNlQ29tcG91bmRGaWxlIiBuZWVkZWQgYWZ0ZXIgY2hhbmdlcyBpbiBMVUNFTkUtNTAzOCAoaG9zc21hbikKKworKiBTT0xSLTQ0NTY6IEFkbWluIFVJOiBEaXNwbGF5cyBkYXNoYm9hcmQgZXZlbiBpZiBTb2xyIGlzIGRvd24gKHN0ZWZma2VzKQorCisqIFNPTFItNDk0OTogVUkgQW5hbHlzaXMgcGFnZSBkcm9wcGluZyBjaGFyYWN0ZXJzIGZyb20gaW5wdXQgYm94IChzdGVmZmtlcykKKworKiBTT0xSLTQ5NjA6IEZpeCByYWNlIGNvbmRpdGlvbnMgaW4gc2h1dGRvd24gb2YgQ29yZUNvbnRhaW5lcgorICBhbmQgZ2V0Q29yZSB0aGF0IGNvdWxkIGNhdXNlIGEgcmVxdWVzdCB0byBhdHRlbXB0IHRvIHVzZSBhIGNvcmUgdGhhdAorICBoYXMgc2h1dCBkb3duLiAoeW9uaWspCisKKyogU09MUi00OTI2OiBGaXhlZCByYXJlIHJlcGxpY2F0aW9uIGJ1ZyB0aGF0IG5vcm1hbGx5IG9ubHkgbWFuaWZlc3RlZCB3aGVuIAorICB1c2luZyBjb21wb3VuZCBmaWxlIGZvcm1hdC4gKHlvbmlrLCBNYXJrIE1pbGxlcikKKyAgCisqIFNPTFItNDk3NDogT3V0Z3Jvd3RoIG9mIFNPTFItNDk2MCB0aGF0IGluY2x1ZGVzIHRyYW5zaWVudCBjb3JlcyBhbmQgcGVuZGluZyBjb3JlcworICAoRXJpY2sgRXJpY2tzb24pCisKKyogU09MUi0zMzY5OiBzaGFyZHMudG9sZXJhbnQ9dHJ1ZSBpcyBicm9rZW4gZm9yIGdyb3VwIHF1ZXJpZXMKKyAgKFJ1c3NlbGwgQmxhY2ssIE1hcnRpam4gdmFuIEdyb25pbmdlbiwgSmFib3VpbGxlIGplYW4gQ2hhcmxlcywgUnlhbiBNY0tpbmxleSB2aWEgc2hhbGluKQorCisqIFNPTFItNDQ1MjogSHVuc3BlbGwgc3RlbW1lciBzaG91bGQgbm90IG1lcmdlIGR1cGxpY2F0ZSBkaWN0aW9uYXJ5IGVudHJpZXMgKGphbmhveSkKKworKiBTT0xSLTUwMDA6IE1hbmFnZWRJbmRleFNjaGVtYSBkb2Vzbid0IHBlcnNpc3QgdW5pcXVlS2V5IHRhZyBhZnRlciBjYWxsaW5nIGFkZEZpZWxkcworICBtZXRob2QuIChKdW4gT2h0YW5pLCBTdGV2ZSBSb3dlKQorCitPcHRpbWl6YXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogU09MUi00OTIzOiBDb21taXQgdG8gYWxsIG5vZGVzIGluIGEgY29sbGVjdGlvbiBpbiBwYXJhbGxlbCByYXRoZXIgdGhhbiBsb2NhbGx5IGFuZAorICB0aGVuIHRvIGFsbCBvdGhlciBub2Rlcy4gKGhvc3NtYW4sIFJpY2FyZG8gTWVyaXphbGRlLCBNYXJrIE1pbGxlcikKKworKiBTT0xSLTM4Mzg6IEFkbWluIFVJIC0gTXVsdGlwbGUgZmlsdGVyIHF1ZXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUXVlcnkgVUkgKHN0ZWZma2VzKQorCisqIFNPTFItNDcxOSA6IEFkbWluIFVJIC0gRGVmYXVsdCB0byB3dD1qc29uIG9uIFF1ZXJ5LVNjcmVlbiAoc3RlZmZrZXMpCisKKyogU09MUi00NjExOiBBZG1pbiBVSSAtIEFuYWx5c2lzLVVybHMgd2l0aCBlbXB0eSBwYXJhbWV0ZXJzIGNyZWF0ZSBlbXB0eSByZXN1bHQgdGFibGUKKyAgKHN0ZWZma2VzKQorCisqIFNPTFItNDk1NTogQWRtaW4gVUkgLSBTaG93IGFkZHJlc3MgYmFyIG9uIHRvcCBmb3IgU2NoZW1hICsgQ29uZmlnIChzdGVmZmtlcykKKworKiBTT0xSLTQ0MTI6IE5ldyBwYXJhbWV0ZXIgbGFuZ2lkLmxjbWFwIHRvIG1hcCBkZXRlY3RlZCBsYW5ndWFnZSBjb2RlIHRvIGJlIHBsYWNlZCAKKyAgaW4gImxhbmd1YWdlIiBmaWVsZCAoamFuaG95KQorCisqIFNPTFItNDgxNTogQWRtaW4tVUkgLSBESUg6IExldCAiY29tbWl0IiBiZSBjaGVja2VkIGJ5IGRlZmF1bHQgKHN0ZWZma2VzKQorCiBPdGhlciBDaGFuZ2VzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE0Miw2ICsyOTMsMTkgQEAKIAogKiBTT0xSLTQ0NDg6IEFsbG93IHRoZSBzb2xyIGludGVybmFsIGxvYWQgYmFsYW5jZXIgdG8gYmUgbW9yZSBlYXNpbHkgcGx1Z2dhYmxlLgogICAoUGhpbGlwIEhveSB2aWEgUm9iZXJ0IE11aXIpCisgIAorKiBTT0xSLTQyMjQ6IFJlZmFjdG9yIEphdmFCaW5Db2RlYyBpbnB1dCBzdHJlYW0gZGVmaW5pdGlvbiB0byBlbmhhbmNlIHJldXNlLgorICAocGh1bnQgdmlhIE1hcmsgTWlsbGVyKQorCisqIFNPTFItNDkzMTogU29sckRlbGV0aW9uUG9saWN5IG9uSW5pdCBhbmQgb25Db21taXQgbWV0aG9kcyBjaGFuZ2VkIHRvIG92ZXJyaWRlCisgIGV4YWN0IHNpZ25hdHVyZXMgKHdpdGggZ2VuZXJpY3MpIGZyb20gSW5kZXhEZWxldGlvblBvbGljeSAoc2hhbGluKQorCisqIFNPTFItNDk0MjogdGVzdCBpbXByb3ZlbWVudHMgdG8gcmFuZG9taXplIHVzZSBvZiBjb21wb3VuZCBmaWxlcyAoaG9zbWFuKQorCisqIFNPTFItNDk2NjogQ1NTLCBKUyBhbmQgb3RoZXIgZmlsZXMgaW4gd2ViYXBwIHdpdGhvdXQgbGljZW5zZSAodXNjaGluZGxlciwKKyAgc3RlZmZrZXMpCisKKyogU09MUi00OTg2OiBVcGdyYWRlIHRvIFRpa2EgMS40IChNYXJrdXMgSmVsc21hIHZpYSBqYW5ob3kpCiAKID09PT09PT09PT09PT09PT09PSAgNC4zLjEgPT09PT09PT09PT09PT09PT09CiAKQEAgLTIwOSw2ICszNzMsMjYgQEAKIAogKiBTT0xSLTQ4Njc6IEFkbWluIFVJIC0gc2V0dGluZyBsb2dsZXZlbCBvbiByb290IHRocm93cyBSYW5nZUVycm9yIChzdGVmZmtlcykKIAorKiBTT0xSLTQ4NzA6IFJlY2VudFVwZGF0ZXMudXBkYXRlKCkgZG9lcyBub3QgaW5jcmVtZW50IG51bVVwZGF0ZXMgbG9vcCBjb3VudGVyCisgIChBbGV4ZXkgS3VkaW5vdiB2aWEgc2hhbGluKQorCisqIFNPTFItNDg3NywgTFVDRU5FLTUwMjM6IFJlbW92ZWQgU29sckluZGV4U2VhcmNoZXIjZ2V0RG9jU2V0TkMoKSdzIHNwZWNpYWwKKyAgY2FzZSBmb3IgaGFuZGxpbmcgVGVybVF1ZXJ5IHRvIHByZXZlbnQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcmVhZGVyIGRvZXMKKyAgbm90IGhhdmUgZmllbGRzLiAgKEJhbyBZYW5nIFlhbmcsIFV3ZSBTY2hpbmRsZXIpCisKKyogU09MUi00ODgxOiBGaXggRG9jdW1lbnRBbmFseXNpc1JlcXVlc3RIYW5kbGVyIHRvIGNvcnJlY3RseSB1c2UKKyAgRW1wdHlFbnRpdHlSZXNvbHZlciB0byBwcmV2ZW50IGxvYWRpbmcgb2YgZXh0ZXJuYWwgZW50aXRpZXMgbGlrZQorICBVcGRhdGVSZXF1ZXN0SGFuZGxlciBkb2VzLiAgKEhvc3NtYW4sIFV3ZSBTY2hpbmRsZXIpCisKKyogU09MUi00ODU4OiBTb2xyQ29yZSByZWxvYWRpbmcgd2FzIGJyb2tlbiB3aGVuIHRoZSBVcGRhdGVMb2cKKyAgd2FzIGVuYWJsZWQuICAoSG9zc21hbiwgQW5zaHVtIEd1cHRhLCBBbGV4ZXkgU2VyYmEsIE1hcmsgTWlsbGVyLCB5b25paykKKworKiBTT0xSLTQ4NTM6IEZpeGVkIFNvbHJKZXR0eVRlc3RCYXNlIHNvIGl0IG1heSBiZSByZXVzZWQgYnkgZW5kIHVzZXJzCisgIChob3NzbWFuKQorCisqIFNPTFItNDc0NDogVXBkYXRlIGZhaWx1cmUgb24gc3ViIHNoYXJkIGlzIG5vdCBwcm9wYWdhdGVkIHRvIGNsaWVudHMgYnkgcGFyZW50CisgIHNoYXJkIChBbnNodW0gR3VwdGEsIHlvbmlrLCBzaGFsaW4pCisKIE90aGVyIENoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvc29sci9OT1RJQ0UudHh0IGIvc29sci9OT1RJQ0UudHh0CmluZGV4IDcwNzg2MTEuLjUyNTJmYWEgMTAwNjQ0Ci0tLSBhL3NvbHIvTk9USUNFLnR4dAorKysgYi9zb2xyL05PVElDRS50eHQKQEAgLTExLDYgKzExLDggQEAKICAgLSBBcGFjaGUgTHVjZW5lIEphdmEKICAgLSBBcGFjaGUgQ29tbW9ucwogICAtIEFwYWNoZSBHZXJvbmltbyAoc3RheCBBUEkpCisgIC0gQXBhY2hlIEJsdXIKKyAgLSBBcGFjaGUgSGFkb29wCiAKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyB0aGUgSlF1ZXJ5IEphdmFTY3JpcHQgbGlicmFyeSBjcmVhdGVkIGJ5IEpvaG4gUmVzaWcuCiBDb3B5cmlnaHQgKGMpIDIwMTAgSm9obiBSZXNpZywgaHR0cDovL2pxdWVyeS5jb20vCkBAIC0yMSw2ICsyMyw0MiBAQAogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBoaWdobGlnaHQuanMgSmF2YXNjcmlwdCBsaWJyYXJ5IGNyZWF0ZWQgYnkgSXZhbiBTYWdhbGFldgogQ29weXJpZ2h0IChjKSAyMDA2LCBJdmFuIFNhZ2FsYWV2LCBodHRwczovL2dpdGh1Yi5jb20vaXNhZ2FsYWV2L2hpZ2hsaWdodC5qcwogCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIFplcm9DbGlwYm9hcmQuanMgSmF2YXNjcmlwdCBsaWJyYXJ5IGNyZWF0ZWQgYnkgSm9uIFJvaGFuLCBKYW1lcyBNLiBHcmVlbmUKK0NvcHlyaWdodCAoYykgMjAxMiBKb24gUm9oYW4sIEphbWVzIE0uIEdyZWVuZSwgaHR0cHM6Ly9naXRodWIuY29tL3plcm9jbGlwYm9hcmQvWmVyb0NsaXBib2FyZAorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIENob3NlbiBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBQYXRyaWNrIEZpbGxlcgorQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgYnkgSGFydmVzdCwgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGpxdWVyeS5hamF4ZmlsZXVwbG9hZC5qcyBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBKb3JkYW4gRmVsZHN0ZWluCitDb3B5cmlnaHQgKGMpIDIwMTEgSm9yZGFuIEZlbGRzdGVpbiwgaHR0cHM6Ly9naXRodWIuY29tL2pmZWxkc3RlaW4valF1ZXJ5LkFqYXhGaWxlVXBsb2FkLmpzCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBqcXVlcnkuYmxvY2tVSS5qcyBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBNaWtlIEFsc3VwCitDb3B5cmlnaHQgKGMpIDIwMDctMjAxMyBNLiBBbHN1cCBodHRwczovL2dpdGh1Yi5jb20vbWFsc3VwL2Jsb2NrdWkvCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBqcXVlcnkuY29va2llLmpzIEphdmFzY3JpcHQgbGlicmFyeSBjcmVhdGVkIGJ5IEtsYXVzIEhhcnRsCitDb3B5cmlnaHQgKGMpIDIwMTMgS2xhdXMgSGFydGwsIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXJoYXJ0bC9qcXVlcnktY29va2llCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBqcXVlcnkuZm9ybSBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBNaWtlIEFsc3VwCitDb3B5cmlnaHQgMjAwNi0yMDEzIChjKSBNLiBBbHN1cCwgaHR0cHM6Ly9naXRodWIuY29tL21hbHN1cC9mb3JtLworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgdGhlIGpzdHJlZSBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBJdmFuIEJvemhhbm92CitDb3B5cmlnaHQgKGMpIDIwMTMgSXZhbiBCb3poYW5vdiwgaHR0cHM6Ly9naXRodWIuY29tL3Zha2F0YS9qc3RyZWUKKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHRoZSBTYW1teS5qcyBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBBYXJvbiBRdWludAorQ29weXJpZ2h0IChjKSAyMDA4IEFhcm9uIFF1aW50LCBRdWlya2V5IE5ZQywgTExDLCBodHRwczovL2dpdGh1Yi5jb20vcXVpcmtleS9zYW1teQorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMganF1ZXJ5LnRpbWVhZ28uanMgSmF2YXNjcmlwdCBsaWJyYXJ5IGJ5IFJ5YW4gTWNHZWFyeQorQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ5YW4gTWNHZWFyeSwgaHR0cHM6Ly9naXRodWIuY29tL3JtbTV0L2pxdWVyeS10aW1lYWdvCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBsaW5rZXIuanMgSmF2YXNjcmlwdCBsaWJyYXJ5IGNyZWF0ZWQgYnkgTWljaGFsaXMgVHppa2FzICYgVmFzaWxpcyBMb2xvcworQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1pY2hhbGlzIFR6aWthcyAmIFZhc2lsaXMgTG9sb3MsIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2xvcy9qcXVlcnktTGlua2VyLworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgcmVxdWlyZS5qcyBKYXZhc2NyaXB0IGxpYnJhcnkgY3JlYXRlZCBieSBKYW1lcyBCdXJrZQorQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgSmFtZXMgQnVya2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgZnVndWUgaWNvbnMgY3JlYXRlZCBieSBZdXN1a2UgS2FtaXlhbWFuZQorQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBLYW1peWFtYW5lLCBodHRwczovL2dpdGh1Yi5jb20veXVzdWtla2FtaXlhbWFuZS9mdWd1ZS1pY29ucworCiBzdGF4LXV0aWxzIGxpYnJhcnk6IGh0dHBzOi8vc3RheC11dGlscy5kZXYuamF2YS5uZXQvCiBDb3B5cmlnaHQgKGMpIDIwMDQsIENocmlzdGlhbiBOaWxlcywgdW5pdDEyLm5ldAogQ29weXJpZ2h0IChjKSAyMDA0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCkBAIC0zNiw2ICs3NCw5IEBACiBIU1FMIERhdGFiYXNlIChIU1FMREIpOiBodHRwOi8vaHNxbGRiLm9yZy8KIExpY2Vuc2U6IGh0dHA6Ly9oc3FsZGIub3JnL3dlYi9oc3FsTGljZW5zZS5odG1sCiAKK0plcnNleSBDb3JlOiBodHRwczovL2plcnNleS5qYXZhLm5ldC8KK0xpY2Vuc2U6IENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIHYxLjAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCkKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogPT0gIEFwYWNoZSBMdWNlbmUgTm90aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzIsNiArMTEzLDkgQEAKIFRoZSBjbGFzcyBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLldlYWtJZGVudGl0eU1hcCB3YXMgZGVyaXZlZCBmcm9tCiB0aGUgQXBhY2hlIENYRiBwcm9qZWN0IGFuZCBpcyBBcGFjaGUgTGljZW5zZSAyLjAuCiAKK1RoZSBIZGZzRGlyZWN0b3J5IGFuZCBCbG9ja0RpcmVjdG9yeSB3ZXJlIGRlcml2ZWQgZnJvbQordGhlIEFwYWNoZSBCbHVyIGluY3ViYXRpbmcgcHJvamVjdCBhbmQgYXJlIEFwYWNoZSBMaWNlbnNlIDIuMC4KKwogVGhlIEdvb2dsZSBDb2RlIFByZXR0aWZ5IGlzIEFwYWNoZSBMaWNlbnNlIDIuMC4KIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWNvZGUtcHJldHRpZnkvCiAKQEAgLTUxMCwzICs1NTQsMTEgQEAKIFRoaXMgcHJvZHVjdCBjb250YWlucyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFJlc3RsZXQgcHJvamVjdC4KIAogU2VlIGh0dHA6Ly93d3cucmVzdGxldC5vcmcvCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKz09ICAgICBQcm90b2NvbCBCdWZmZXJzIE5vdGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CitDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgoraHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy8KZGlmZiAtLWdpdCBhL3NvbHIvUkVBRE1FLnR4dCBiL3NvbHIvUkVBRE1FLnR4dAppbmRleCAyODcyMzAwLi4xM2Y0Y2EzIDEwMDY0NAotLS0gYS9zb2xyL1JFQURNRS50eHQKKysrIGIvc29sci9SRUFETUUudHh0CkBAIC00MSwxNCArNDEsMTAgQEAKIAogZXhhbXBsZS8KICAgQSBzZWxmLWNvbnRhaW5lZCBleGFtcGxlIFNvbHIgaW5zdGFuY2UsIGNvbXBsZXRlIHdpdGggYSBzYW1wbGUKLSAgY29uZmlndXJhdGlvbiwgZG9jdW1lbnRzIHRvIGluZGV4LCBhbmQgdGhlIEpldHR5IFNlcnZsZXQgY29udGFpbmVyLgorICBjb25maWd1cmF0aW9uIGFuZCBkb2N1bWVudHMgdG8gaW5kZXguCiAgIFBsZWFzZSBzZWUgZXhhbXBsZS9SRUFETUUudHh0IGZvciBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nIHRoaXMKICAgZXhhbXBsZS4KIAotZGlzdC9zb2xyLVhYLndhcgotICBUaGUgQXBhY2hlIFNvbHIgQXBwbGljYXRpb24uICBEZXBsb3kgdGhpcyBXQVIgZmlsZSB0byBhbnkgc2VydmxldAotICBjb250YWluZXIgdG8gcnVuIEFwYWNoZSBTb2xyLgotCiBkaXN0L3NvbHItPGNvbXBvbmVudD4tWFguamFyCiAgIFRoZSBBcGFjaGUgU29sciBsaWJyYXJpZXMuICBUbyBjb21waWxlIEFwYWNoZSBTb2xyIFBsdWdpbnMsCiAgIG9uZSBvciBtb3JlIG9mIHRoZXNlIHdpbGwgYmUgcmVxdWlyZWQuICBUaGUgY29yZSBsaWJyYXJ5IGlzCmRpZmYgLS1naXQgYS9zb2xyL2J1aWxkLnhtbCBiL3NvbHIvYnVpbGQueG1sCmluZGV4IDc4NzUzMTUuLjhkZTA4MGUgMTAwNjQ0Ci0tLSBhL3NvbHIvYnVpbGQueG1sCisrKyBiL3NvbHIvYnVpbGQueG1sCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgPGVjaG8gbWVzc2FnZT0iQW5kIGZvciBkZXZlbG9wZXJzOiIvPgogICAgIDxlY2hvIG1lc3NhZ2U9IlVzZSAnYW50IGNsZWFuJyB0byBjbGVhbiBjb21waWxlZCBmaWxlcy4iIC8+CiAgICAgPGVjaG8gbWVzc2FnZT0iVXNlICdhbnQgY29tcGlsZScgdG8gY29tcGlsZSB0aGUgc291cmNlIGNvZGUuIiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9IlVzZSAnYW50IGRpc3QnIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IFdBUiBhbmQgSkFSIGZpbGVzLiIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJVc2UgJ2FudCBkaXN0JyB0byBidWlsZCB0aGUgcHJvamVjdCBKQVIgZmlsZXMuIiAvPgogICAgIDxlY2hvIG1lc3NhZ2U9IlVzZSAnYW50IGRvY3VtZW50YXRpb24nIHRvIGJ1aWxkIGRvY3VtZW50YXRpb24uIiAvPgogICAgIDxlY2hvIG1lc3NhZ2U9IlVzZSAnYW50IGdlbmVyYXRlLW1hdmVuLWFydGlmYWN0cycgdG8gZ2VuZXJhdGUgbWF2ZW4gYXJ0aWZhY3RzLiIgLz4KICAgICA8ZWNobyBtZXNzYWdlPSJVc2UgJ2FudCBwYWNrYWdlJyB0byBnZW5lcmF0ZSB6aXAsIHRneiBmb3IgZGlzdHJpYnV0aW9uLiIgLz4KQEAgLTU1LDcgKzU1LDcgQEAKICAgICA8L2RlbGV0ZT4KICAgICA8ZWNobz5TZWUgJHtleGFtcGxlfS9SRUFETUUudHh0IGZvciBob3cgdG8gcnVuIHRoZSBTb2xyIGV4YW1wbGUgY29uZmlndXJhdGlvbi48L2VjaG8+CiAgIDwvdGFyZ2V0PgotCisgIAogICA8dGFyZ2V0IG5hbWU9InJ1bi1leGFtcGxlIiBkZXBlbmRzPSJleGFtcGxlIgogICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW4gU29sciBpbnRlcmFjdGl2ZWx5LCB2aWEgSmV0dHkuICAtRGV4YW1wbGUuZGVidWc9dHJ1ZSB0byBlbmFibGUgSlZNIGRlYnVnZ2VyIj4KICAgICA8cHJvcGVydHkgbmFtZT0iZXhhbXBsZS5zb2xyLmhvbWUiIGxvY2F0aW9uPSJleGFtcGxlL3NvbHIiLz4KQEAgLTI2Niw2ICsyNjYsNyBAQAogICAgICAgPGJ1bmRsZWRTaWduYXR1cmVzIG5hbWU9ImNvbW1vbnMtaW8tdW5zYWZlLSR7Y29tbW9ucy1pby52ZXJzaW9ufSIvPgogICAgICAgPHNpZ25hdHVyZXNGaWxlU2V0IGRpcj0iJHtjb21tb24uZGlyfS90b29scy9mb3JiaWRkZW5BcGlzIj4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iZXhlY3V0b3JzLnR4dCIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY2hhcnMudHh0IiAvPgogICAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2bGV0LWFwaS50eHQiIC8+CiAgICAgICA8L3NpZ25hdHVyZXNGaWxlU2V0PgogICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2J1aWxkIj4KQEAgLTI5MSwxMiArMjkyLDEzIEBACiAKICAgPCEtLSByYXQgc291cmNlcyAtLT4KICAgPCEtLSByYXQtc291cmNlcy10eXBlZGVmIGlzICpub3QqIGEgdXNlbGVzcyBkZXBlbmRlbmN5LiBkbyBub3QgcmVtb3ZlIC0tPgotICA8dGFyZ2V0IG5hbWU9InJhdC1zb3VyY2VzIiBkZXBlbmRzPSJyYXQtc291cmNlcy10eXBlZGVmIj4KKyAgPHRhcmdldCBuYW1lPSJyYXQtc291cmNlcyIgZGVwZW5kcz0icmF0LXNvdXJjZXMtdHlwZWRlZixjb21tb24ucmF0LXNvdXJjZXMiPgogICAgIDxzdWJhbnQgdGFyZ2V0PSJyYXQtc291cmNlcyIgaW5oZXJpdGFsbD0iZmFsc2UiID4KICAgICAgIDxwcm9wZXJ0eXNldCByZWZpZD0idXB0b2RhdGUuYW5kLmNvbXBpbGVkLnByb3BlcnRpZXMiLz4KICAgICAgIDxmaWxlc2V0IGRpcj0iY29yZSIgaW5jbHVkZXM9ImJ1aWxkLnhtbCIvPgogICAgICAgPGZpbGVzZXQgZGlyPSJzb2xyaiIgaW5jbHVkZXM9ImJ1aWxkLnhtbCIvPgogICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0LWZyYW1ld29yayIgaW5jbHVkZXM9ImJ1aWxkLnhtbCIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJ3ZWJhcHAiIGluY2x1ZGVzPSJidWlsZC54bWwiLz4KICAgICA8L3N1YmFudD4KICAgICA8Y29udHJpYi1jcmF3bCB0YXJnZXQ9InJhdC1zb3VyY2VzIiBmYWlsb25lcnJvcj0idHJ1ZSIvPgogICA8L3RhcmdldD4KQEAgLTQ3Niw3ICs0NzgsNyBAQAogICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9ImV4YW1wbGUvKiovKi5zaCBleGFtcGxlLyoqL2Jpbi8iIC8+CiAgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iCiAgICAgICAgICAgICAgICAgICBwcmVmaXg9IiR7ZnVsbG5hbWV2ZXJ9IgotICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9ImRpc3QvKi5qYXIgZGlzdC8qLndhciAKKyAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSJkaXN0LyouamFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdC9zb2xyai1saWIvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QvdGVzdC1mcmFtZXdvcmsvKioiCiAgICAgICAgICAgICAgICAgICBleGNsdWRlcz0iKiovKi50Z3ogKiovKi56aXAgKiovKi5tZDUgKiovKnNyYyouamFyICoqLypkb2NzKi5qYXIgKiovKi5zaGExIiAvPgpkaWZmIC0tZ2l0IGEvc29sci9jbG91ZC1kZXYvc29scmNsb3VkLXN0YXJ0LnNoIGIvc29sci9jbG91ZC1kZXYvc29scmNsb3VkLXN0YXJ0LnNoCmluZGV4IGE4OTQwZWMuLjA5NjBmOTYgMTAwNjQ0Ci0tLSBhL3NvbHIvY2xvdWQtZGV2L3NvbHJjbG91ZC1zdGFydC5zaAorKysgYi9zb2xyL2Nsb3VkLWRldi9zb2xyY2xvdWQtc3RhcnQuc2gKQEAgLTI1LDcgKzI1LDcgQEAKIGNwIC1yIC1mIGV4YW1wbGUgZXhhbXBsZTUKIGNwIC1yIC1mIGV4YW1wbGUgZXhhbXBsZTYKIAotamF2YSAtY2xhc3NwYXRoICJleGFtcGxlL3NvbHItd2ViYXBwL3dlYmFwcC9XRUItSU5GL2xpYi8qOmV4YW1wbGUvbGliL2V4dC8iIG9yZy5hcGFjaGUuc29sci5jbG91ZC5aa0NMSSAtY21kIGJvb3RzdHJhcCAtemtob3N0IDEyNy4wLjAuMTo5OTgzIC1zb2xyaG9tZSBleGFtcGxlL3NvbHIgLXJ1bnprIDg5ODMKK2phdmEgLWNsYXNzcGF0aCAiZXhhbXBsZS9zb2xyLXdlYmFwcC93ZWJhcHAvV0VCLUlORi9saWIvKjpleGFtcGxlL2xpYi9leHQvKiIgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLlprQ0xJIC1jbWQgYm9vdHN0cmFwIC16a2hvc3QgMTI3LjAuMC4xOjk5ODMgLXNvbHJob21lIGV4YW1wbGUvc29sciAtcnVuemsgODk4MwogCiBjZCBleGFtcGxlCiBqYXZhIC1EemtSdW4gLURudW1TaGFyZHM9MiAtRFNUT1AuUE9SVD03OTgzIC1EU1RPUC5LRVk9a2V5IC1qYXIgc3RhcnQuamFyIDE+ZXhhbXBsZS5sb2cgMj4mMSAmCmRpZmYgLS1naXQgYS9zb2xyL2NvbW1vbi1idWlsZC54bWwgYi9zb2xyL2NvbW1vbi1idWlsZC54bWwKaW5kZXggY2M3MzM2Yi4uYzQyZTIyMCAxMDA2NDQKLS0tIGEvc29sci9jb21tb24tYnVpbGQueG1sCisrKyBiL3NvbHIvY29tbW9uLWJ1aWxkLnhtbApAQCAtOTYsNiArOTYsMTIgQEAKIAogICA8cGF0aCBpZD0ic29sci50ZXN0LmJhc2UuY2xhc3NwYXRoIj4KICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjb21tb24tc29sci5kaXJ9L2J1aWxkL3NvbHItdGVzdC1mcmFtZXdvcmsvY2xhc3Nlcy9qYXZhIi8+CisgICAgPGZpbGVzZXQgZGlyPSIke2NvbW1vbi1zb2xyLmRpcn0vdGVzdC1mcmFtZXdvcmsvbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJqdW5pdC0qLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9InJhbmRvbWl6ZWR0ZXN0aW5nLXJ1bm5lci0qLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImFudCouamFyIiAvPgorICAgIDwvZmlsZXNldD4KICAgCTxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLmRpcn0vdGVzdC1maWxlcyIvPgogICAJPHBhdGggcmVmaWQ9InRlc3QuYmFzZS5jbGFzc3BhdGgiLz4KICAgPC9wYXRoPgpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2FuYWx5c2lzLWV4dHJhcy9pdnkueG1sIGIvc29sci9jb250cmliL2FuYWx5c2lzLWV4dHJhcy9pdnkueG1sCmluZGV4IGFlZTdjNzQuLjU5N2Y2MDYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9hbmFseXNpcy1leHRyYXMvaXZ5LnhtbAorKysgYi9zb2xyL2NvbnRyaWIvYW5hbHlzaXMtZXh0cmFzL2l2eS54bWwKQEAgLTIwLDkgKzIwLDkgQEAKICAgICA8aW5mbyBvcmdhbmlzYXRpb249Im9yZy5hcGFjaGUuc29sciIgbW9kdWxlPSJhbmFseXNpcy1leHRyYXMiLz4KICAgICA8ZGVwZW5kZW5jaWVzPgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJjb20uaWJtLmljdSIgbmFtZT0iaWN1NGoiIHJldj0iNDkuMSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmNhcnJvdDIiIG5hbWU9Im1vcmZvbG9naWstcG9saXNoIiByZXY9IjEuNS41IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgotICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuY2Fycm90MiIgbmFtZT0ibW9yZm9sb2dpay1mc2EiIHJldj0iMS41LjUiIHRyYW5zaXRpdmU9ImZhbHNlIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5jYXJyb3QyIiBuYW1lPSJtb3Jmb2xvZ2lrLXN0ZW1taW5nIiByZXY9IjEuNS41IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuY2Fycm90MiIgbmFtZT0ibW9yZm9sb2dpay1wb2xpc2giIHJldj0iMS42LjAiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5jYXJyb3QyIiBuYW1lPSJtb3Jmb2xvZ2lrLWZzYSIgcmV2PSIxLjYuMCIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmNhcnJvdDIiIG5hbWU9Im1vcmZvbG9naWstc3RlbW1pbmciIHJldj0iMS42LjAiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZXhjbHVkZSBvcmc9IioiIGV4dD0iKiIgbWF0Y2hlcj0icmVnZXhwIiB0eXBlPSIke2l2eS5leGNsdWRlLnR5cGVzfSIvPiAKICAgICA8L2RlcGVuZGVuY2llcz4KIDwvaXZ5LW1vZHVsZT4KZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi9hbmFseXNpcy1leHRyYXMvc3JjL3Rlc3QtZmlsZXMvYW5hbHlzaXMtZXh0cmFzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWljdWNvbGxhdGUueG1sIGIvc29sci9jb250cmliL2FuYWx5c2lzLWV4dHJhcy9zcmMvdGVzdC1maWxlcy9hbmFseXNpcy1leHRyYXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaWN1Y29sbGF0ZS54bWwKaW5kZXggMmFlNmM3Zi4uNzMwMDRkNyAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL2FuYWx5c2lzLWV4dHJhcy9zcmMvdGVzdC1maWxlcy9hbmFseXNpcy1leHRyYXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaWN1Y29sbGF0ZS54bWwKKysrIGIvc29sci9jb250cmliL2FuYWx5c2lzLWV4dHJhcy9zcmMvdGVzdC1maWxlcy9hbmFseXNpcy1leHRyYXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaWN1Y29sbGF0ZS54bWwKQEAgLTE5LDYgKzE5LDkgQEAKIAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CisgIDwvaW5kZXhDb25maWc+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KIDwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2NsdXN0ZXJpbmcvc3JjL3Rlc3QtZmlsZXMvY2x1c3RlcmluZy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwgYi9zb2xyL2NvbnRyaWIvY2x1c3RlcmluZy9zcmMvdGVzdC1maWxlcy9jbHVzdGVyaW5nL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAppbmRleCA3NmNkN2Q0Li4wNGQ1OTFjIDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvY2x1c3RlcmluZy9zcmMvdGVzdC1maWxlcy9jbHVzdGVyaW5nL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvbnRyaWIvY2x1c3RlcmluZy9zcmMvdGVzdC1maWxlcy9jbHVzdGVyaW5nL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbApAQCAtMjgsNiArMjgsNyBAQAogCiAgIDxpbmRleENvbmZpZz4KICAgICA8bG9ja1R5cGU+c2luZ2xlPC9sb2NrVHlwZT4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICA8L2luZGV4Q29uZmlnPgogICAKICAgPCEtLQlFbmFibGVzIEpNWCBpZiBhbmQgb25seSBpZiBhbiBleGlzdGluZyBNQmVhblNlcnZlciBpcyBmb3VuZCwgdXNlIApkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyLWV4dHJhcy9zcmMvdGVzdC1maWxlcy9kaWhleHRyYXMvc29sci9jb2xsZWN0aW9uMS9jb25mL2RhdGFpbXBvcnQtc29scmNvbmZpZy54bWwgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXItZXh0cmFzL3NyYy90ZXN0LWZpbGVzL2RpaGV4dHJhcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1zb2xyY29uZmlnLnhtbAppbmRleCAxYjI2M2RkLi5kMGU5ODQ0IDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXItZXh0cmFzL3NyYy90ZXN0LWZpbGVzL2RpaGV4dHJhcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXItZXh0cmFzL3NyYy90ZXN0LWZpbGVzL2RpaGV4dHJhcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1zb2xyY29uZmlnLnhtbApAQCAtMTgsNiArMTgsOSBAQAogCiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KKyAgPC9pbmRleENvbmZpZz4KIAogICA8IS0tIFVzZWQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgZGlyZWN0b3J5IHRvIGhvbGQgYWxsIGluZGV4IGRhdGEKICAgICAgICBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IC4vZGF0YSB1bmRlciB0aGUgU29sciBob21lLgpAQCAtMjYsOCArMjksNiBAQAogCiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKLSAgPCEtLSA8aW5kZXhDb25maWc+IHNlY3Rpb24gY291bGQgZ28gaGVyZSwgYnV0IHdlIHdhbnQgdGhlIGRlZmF1bHRzIC0tPgotCiAgIDwhLS0gdGhlIGRlZmF1bHQgaGlnaC1wZXJmb3JtYW5jZSB1cGRhdGUgaGFuZGxlciAtLT4KICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgogCmRpZmYgLS1naXQgYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9KZGJjRGF0YVNvdXJjZS5qYXZhIGIvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2RhdGFpbXBvcnQvSmRiY0RhdGFTb3VyY2UuamF2YQppbmRleCBjY2FmM2E2Li5iM2EwZTljIDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9KZGJjRGF0YVNvdXJjZS5qYXZhCisrKyBiL3NvbHIvY29udHJpYi9kYXRhaW1wb3J0aGFuZGxlci9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9kYXRhaW1wb3J0L0pkYmNEYXRhU291cmNlLmphdmEKQEAgLTIyLDYgKzIyLDggQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCiBpbXBvcnQgamF2YS5zcWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKQEAgLTEzMiw2NiArMTM0LDkwIEBACiAgICAgICAgICAgICAgICAgKyB1cmwpOwogICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIENvbm5lY3Rpb24gYyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYodXJsICE9IG51bGwpeworCisgICAgICAgIGlmIChqbmRpTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgYyA9IGdldEZyb21KbmRpKGluaXRQcm9wcywgam5kaU5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGMgPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odXJsLCBpbml0UHJvcHMpOwotICAgICAgICAgIH0gZWxzZSBpZihqbmRpTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgIEluaXRpYWxDb250ZXh0IGN0eCA9ICBuZXcgSW5pdGlhbENvbnRleHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBqbmRpdmFsID0gIGN0eC5sb29rdXAoam5kaU5hbWUpOwotICAgICAgICAgICAgaWYgKGpuZGl2YWwgaW5zdGFuY2VvZiBqYXZheC5zcWwuRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgICBqYXZheC5zcWwuRGF0YVNvdXJjZSBkYXRhU291cmNlID0gKGphdmF4LnNxbC5EYXRhU291cmNlKSBqbmRpdmFsOwotICAgICAgICAgICAgICBTdHJpbmcgdXNlciA9IChTdHJpbmcpIGluaXRQcm9wcy5nZXQoInVzZXIiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHBhc3MgPSAoU3RyaW5nKSBpbml0UHJvcHMuZ2V0KCJwYXNzd29yZCIpOwotICAgICAgICAgICAgICBpZih1c2VyID09IG51bGwgfHwgdXNlci50cmltKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgYyA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMgPSBkYXRhU291cmNlLmdldENvbm5lY3Rpb24odXNlciwgcGFzcyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhSW1wb3J0SGFuZGxlckV4Y2VwdGlvbihTRVZFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgInRoZSBqbmRpIG5hbWUgOiAnIitqbmRpTmFtZSArIicgaXMgbm90IGEgdmFsaWQgamF2YXguc3FsLkRhdGFTb3VyY2UiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRHJpdmVyTWFuYWdlciBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gdXNlIGEgZHJpdmVyIHdoaWNoIGlzIG5vdCBsb2FkZWQgdGhyb3VnaAorICAgICAgICAgICAgLy8gdGhlIGNsYXNzIGxvYWRlciBvZiB0aGUgY2xhc3Mgd2hpY2ggaXMgdHJ5aW5nIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgY2FzZXMgd2hlcmUgdGhlIHVzZXIgcHV0cyB0aGUgZHJpdmVyIGphciBpbiB0aGUKKyAgICAgICAgICAgIC8vIHNvbHIuaG9tZS9saWIgb3Igc29sci5ob21lL2NvcmUvbGliIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgRHJpdmVyIGQgPSAoRHJpdmVyKSBEb2NCdWlsZGVyLmxvYWRDbGFzcyhkcml2ZXIsIGNvbnRleHQuZ2V0U29sckNvcmUoKSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGMgPSBkLmNvbm5lY3QodXJsLCBpbml0UHJvcHMpOwogICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAvLyBEcml2ZXJNYW5hZ2VyIGRvZXMgbm90IGFsbG93IHlvdSB0byB1c2UgYSBkcml2ZXIgd2hpY2ggaXMgbm90IGxvYWRlZCB0aHJvdWdoCi0gICAgICAgICAgLy8gdGhlIGNsYXNzIGxvYWRlciBvZiB0aGUgY2xhc3Mgd2hpY2ggaXMgdHJ5aW5nIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGNhc2VzIHdoZXJlIHRoZSB1c2VyIHB1dHMgdGhlIGRyaXZlciBqYXIgaW4gdGhlCi0gICAgICAgICAgLy8gc29sci5ob21lL2xpYiBvciBzb2xyLmhvbWUvY29yZS9saWIgZGlyZWN0b3JpZXMuCi0gICAgICAgICAgRHJpdmVyIGQgPSAoRHJpdmVyKSBEb2NCdWlsZGVyLmxvYWRDbGFzcyhkcml2ZXIsIGNvbnRleHQuZ2V0U29sckNvcmUoKSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBjID0gZC5jb25uZWN0KHVybCwgaW5pdFByb3BzKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKGluaXRQcm9wcy5nZXRQcm9wZXJ0eSgicmVhZE9ubHkiKSkpIHsKLSAgICAgICAgICAgIGMuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0gICAgICAgICAgICAvLyBBZGQgb3RoZXIgc2FuZSBkZWZhdWx0cwotICAgICAgICAgICAgYy5zZXRBdXRvQ29tbWl0KHRydWUpOwotICAgICAgICAgICAgYy5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQpOwotICAgICAgICAgICAgYy5zZXRIb2xkYWJpbGl0eShSZXN1bHRTZXQuQ0xPU0VfQ1VSU09SU19BVF9DT01NSVQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIUJvb2xlYW4ucGFyc2VCb29sZWFuKGluaXRQcm9wcy5nZXRQcm9wZXJ0eSgiYXV0b0NvbW1pdCIpKSkgewotICAgICAgICAgICAgYy5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU3RyaW5nIHRyYW5zYWN0aW9uSXNvbGF0aW9uID0gaW5pdFByb3BzLmdldFByb3BlcnR5KCJ0cmFuc2FjdGlvbklzb2xhdGlvbiIpOwotICAgICAgICAgIGlmICgiVFJBTlNBQ1RJT05fUkVBRF9VTkNPTU1JVFRFRCIuZXF1YWxzKHRyYW5zYWN0aW9uSXNvbGF0aW9uKSkgewotICAgICAgICAgICAgYy5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQpOwotICAgICAgICAgIH0gZWxzZSBpZiAoIlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEIi5lcXVhbHModHJhbnNhY3Rpb25Jc29sYXRpb24pKSB7Ci0gICAgICAgICAgICBjLnNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQpOwotICAgICAgICAgIH0gZWxzZSBpZiAoIlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCIuZXF1YWxzKHRyYW5zYWN0aW9uSXNvbGF0aW9uKSkgewotICAgICAgICAgICAgYy5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCk7Ci0gICAgICAgICAgfSBlbHNlIGlmICgiVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFIi5lcXVhbHModHJhbnNhY3Rpb25Jc29sYXRpb24pKSB7Ci0gICAgICAgICAgICBjLnNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKCJUUkFOU0FDVElPTl9OT05FIi5lcXVhbHModHJhbnNhY3Rpb25Jc29sYXRpb24pKSB7Ci0gICAgICAgICAgICBjLnNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fTk9ORSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyBob2xkYWJpbGl0eSA9IGluaXRQcm9wcy5nZXRQcm9wZXJ0eSgiaG9sZGFiaWxpdHkiKTsKLSAgICAgICAgICBpZiAoIkNMT1NFX0NVUlNPUlNfQVRfQ09NTUlUIi5lcXVhbHMoaG9sZGFiaWxpdHkpKSB7Ci0gICAgICAgICAgICBjLnNldEhvbGRhYmlsaXR5KFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVCk7Ci0gICAgICAgICAgfSBlbHNlIGlmICgiSE9MRF9DVVJTT1JTX09WRVJfQ09NTUlUIi5lcXVhbHMoaG9sZGFiaWxpdHkpKSB7Ci0gICAgICAgICAgICBjLnNldEhvbGRhYmlsaXR5KFJlc3VsdFNldC5IT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVQpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0aWFsaXplQ29ubmVjdGlvbihjLCBpbml0UHJvcHMpOworICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgTE9HLndhcm4oIkV4Y2VwdGlvbiBjbG9zaW5nIGNvbm5lY3Rpb24gZHVyaW5nIGNsZWFudXAiLCBlMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBEYXRhSW1wb3J0SGFuZGxlckV4Y2VwdGlvbihTRVZFUkUsICJFeGNlcHRpb24gaW5pdGlhbGl6aW5nIFNRTCBjb25uZWN0aW9uIiwgZSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIExPRy5pbmZvKCJUaW1lIHRha2VuIGZvciBnZXRDb25uZWN0aW9uKCk6ICIKLSAgICAgICAgICAgICAgICArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSk7CisgICAgICAgICAgICArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSk7CisgICAgICAgIHJldHVybiBjOworICAgICAgfQorCisgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjLCBmaW5hbCBQcm9wZXJ0aWVzIGluaXRQcm9wcykKKyAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKGluaXRQcm9wcy5nZXRQcm9wZXJ0eSgicmVhZE9ubHkiKSkpIHsKKyAgICAgICAgICBjLnNldFJlYWRPbmx5KHRydWUpOworICAgICAgICAgIC8vIEFkZCBvdGhlciBzYW5lIGRlZmF1bHRzCisgICAgICAgICAgYy5zZXRBdXRvQ29tbWl0KHRydWUpOworICAgICAgICAgIGMuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEKTsKKyAgICAgICAgICBjLnNldEhvbGRhYmlsaXR5KFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFCb29sZWFuLnBhcnNlQm9vbGVhbihpbml0UHJvcHMuZ2V0UHJvcGVydHkoImF1dG9Db21taXQiKSkpIHsKKyAgICAgICAgICBjLnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB0cmFuc2FjdGlvbklzb2xhdGlvbiA9IGluaXRQcm9wcy5nZXRQcm9wZXJ0eSgidHJhbnNhY3Rpb25Jc29sYXRpb24iKTsKKyAgICAgICAgaWYgKCJUUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVEIi5lcXVhbHModHJhbnNhY3Rpb25Jc29sYXRpb24pKSB7CisgICAgICAgICAgYy5zZXRUcmFuc2FjdGlvbklzb2xhdGlvbihDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQpOworICAgICAgICB9IGVsc2UgaWYgKCJUUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRCIuZXF1YWxzKHRyYW5zYWN0aW9uSXNvbGF0aW9uKSkgeworICAgICAgICAgIGMuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRCk7CisgICAgICAgIH0gZWxzZSBpZiAoIlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCIuZXF1YWxzKHRyYW5zYWN0aW9uSXNvbGF0aW9uKSkgeworICAgICAgICAgIGMuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUQpOworICAgICAgICB9IGVsc2UgaWYgKCJUUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUiLmVxdWFscyh0cmFuc2FjdGlvbklzb2xhdGlvbikpIHsKKyAgICAgICAgICBjLnNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fU0VSSUFMSVpBQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmICgiVFJBTlNBQ1RJT05fTk9ORSIuZXF1YWxzKHRyYW5zYWN0aW9uSXNvbGF0aW9uKSkgeworICAgICAgICAgIGMuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9OT05FKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgaG9sZGFiaWxpdHkgPSBpbml0UHJvcHMuZ2V0UHJvcGVydHkoImhvbGRhYmlsaXR5Iik7CisgICAgICAgIGlmICgiQ0xPU0VfQ1VSU09SU19BVF9DT01NSVQiLmVxdWFscyhob2xkYWJpbGl0eSkpIHsKKyAgICAgICAgICBjLnNldEhvbGRhYmlsaXR5KFJlc3VsdFNldC5DTE9TRV9DVVJTT1JTX0FUX0NPTU1JVCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkhPTERfQ1VSU09SU19PVkVSX0NPTU1JVCIuZXF1YWxzKGhvbGRhYmlsaXR5KSkgeworICAgICAgICAgIGMuc2V0SG9sZGFiaWxpdHkoUmVzdWx0U2V0LkhPTERfQ1VSU09SU19PVkVSX0NPTU1JVCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGdldEZyb21KbmRpKGZpbmFsIFByb3BlcnRpZXMgaW5pdFByb3BzLCBmaW5hbCBTdHJpbmcgam5kaU5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24sCisgICAgICAgICAgU1FMRXhjZXB0aW9uIHsKKworICAgICAgICBDb25uZWN0aW9uIGMgPSBudWxsOworICAgICAgICBJbml0aWFsQ29udGV4dCBjdHggPSAgbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgIE9iamVjdCBqbmRpdmFsID0gIGN0eC5sb29rdXAoam5kaU5hbWUpOworICAgICAgICBpZiAoam5kaXZhbCBpbnN0YW5jZW9mIGphdmF4LnNxbC5EYXRhU291cmNlKSB7CisgICAgICAgICAgamF2YXguc3FsLkRhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IChqYXZheC5zcWwuRGF0YVNvdXJjZSkgam5kaXZhbDsKKyAgICAgICAgICBTdHJpbmcgdXNlciA9IChTdHJpbmcpIGluaXRQcm9wcy5nZXQoInVzZXIiKTsKKyAgICAgICAgICBTdHJpbmcgcGFzcyA9IChTdHJpbmcpIGluaXRQcm9wcy5nZXQoInBhc3N3b3JkIik7CisgICAgICAgICAgaWYodXNlciA9PSBudWxsIHx8IHVzZXIudHJpbSgpLmVxdWFscygiIikpeworICAgICAgICAgICAgYyA9IGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjID0gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKHVzZXIsIHBhc3MpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGF0YUltcG9ydEhhbmRsZXJFeGNlcHRpb24oU0VWRVJFLAorICAgICAgICAgICAgICAgICAgInRoZSBqbmRpIG5hbWUgOiAnIitqbmRpTmFtZSArIicgaXMgbm90IGEgdmFsaWQgamF2YXguc3FsLkRhdGFTb3VyY2UiKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYzsKICAgICAgIH0KICAgICB9OwpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvY29udGVudHN0cmVhbS1zb2xyY29uZmlnLnhtbCBiL3NvbHIvY29udHJpYi9kYXRhaW1wb3J0aGFuZGxlci9zcmMvdGVzdC1maWxlcy9kaWgvc29sci9jb2xsZWN0aW9uMS9jb25mL2NvbnRlbnRzdHJlYW0tc29scmNvbmZpZy54bWwKaW5kZXggM2E4YjE1ZC4uNGU4YTk2YiAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvY29udGVudHN0cmVhbS1zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3QtZmlsZXMvZGloL3NvbHIvY29sbGVjdGlvbjEvY29uZi9jb250ZW50c3RyZWFtLXNvbHJjb25maWcueG1sCkBAIC0xOCw2ICsxOCw5IEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgogCiAgIDwhLS0gVXNlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBkaXJlY3RvcnkgdG8gaG9sZCBhbGwgaW5kZXggZGF0YQogICAgICAgIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgLi9kYXRhIHVuZGVyIHRoZSBTb2xyIGhvbWUuCkBAIC0yNiw4ICsyOSw2IEBACiAKICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KIAotICA8IS0tIDxpbmRleENvbmZpZz4gc2VjdGlvbiBjb3VsZCBnbyBoZXJlLCBidXQgd2Ugd2FudCB0aGUgZGVmYXVsdHMgLS0+Ci0KICAgPCEtLSB0aGUgZGVmYXVsdCBoaWdoLXBlcmZvcm1hbmNlIHVwZGF0ZSBoYW5kbGVyIC0tPgogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi9kYXRhaW1wb3J0aGFuZGxlci9zcmMvdGVzdC1maWxlcy9kaWgvc29sci9jb2xsZWN0aW9uMS9jb25mL2RhdGFpbXBvcnQtbm9kYXRhc291cmNlLXNvbHJjb25maWcueG1sIGIvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1ub2RhdGFzb3VyY2Utc29scmNvbmZpZy54bWwKaW5kZXggNzk2ZjgzMS4uOWZhMzA3MyAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1ub2RhdGFzb3VyY2Utc29scmNvbmZpZy54bWwKKysrIGIvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1ub2RhdGFzb3VyY2Utc29scmNvbmZpZy54bWwKQEAgLTI4LDYgKzI4LDcgQEAKIAogICA8aW5kZXhDb25maWc+CiAgICAgPGxvY2tUeXBlPnNpbmdsZTwvbG9ja1R5cGU+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgPC9pbmRleENvbmZpZz4KIAogICA8IS0tIHRoZSBkZWZhdWx0IGhpZ2gtcGVyZm9ybWFuY2UgdXBkYXRlIGhhbmRsZXIgLS0+CmRpZmYgLS1naXQgYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3QtZmlsZXMvZGloL3NvbHIvY29sbGVjdGlvbjEvY29uZi9kYXRhaW1wb3J0LXNvbHJjb25maWcueG1sIGIvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0LWZpbGVzL2RpaC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZGF0YWltcG9ydC1zb2xyY29uZmlnLnhtbAppbmRleCBkYjBhNTdjLi5jN2QyMDhhIDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3QtZmlsZXMvZGloL3NvbHIvY29sbGVjdGlvbjEvY29uZi9kYXRhaW1wb3J0LXNvbHJjb25maWcueG1sCisrKyBiL3NvbHIvY29udHJpYi9kYXRhaW1wb3J0aGFuZGxlci9zcmMvdGVzdC1maWxlcy9kaWgvc29sci9jb2xsZWN0aW9uMS9jb25mL2RhdGFpbXBvcnQtc29scmNvbmZpZy54bWwKQEAgLTE4LDYgKzE4LDkgQEAKIAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CisgIDwvaW5kZXhDb25maWc+CiAKICAgPCEtLSBVc2VkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGRpcmVjdG9yeSB0byBob2xkIGFsbCBpbmRleCBkYXRhCiAgICAgICAgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAuL2RhdGEgdW5kZXIgdGhlIFNvbHIgaG9tZS4KQEAgLTI2LDggKzI5LDYgQEAKIAogICA8ZGlyZWN0b3J5RmFjdG9yeSBuYW1lPSJEaXJlY3RvcnlGYWN0b3J5IiBjbGFzcz0iJHtzb2xyLmRpcmVjdG9yeUZhY3Rvcnk6c29sci5SQU1EaXJlY3RvcnlGYWN0b3J5fSIvPgogCi0gIDwhLS0gPGluZGV4Q29uZmlnPiBzZWN0aW9uIGNvdWxkIGdvIGhlcmUsIGJ1dCB3ZSB3YW50IHRoZSBkZWZhdWx0cyAtLT4KLQogICA8IS0tIHRoZSBkZWZhdWx0IGhpZ2gtcGVyZm9ybWFuY2UgdXBkYXRlIGhhbmRsZXIgLS0+CiAgIDx1cGRhdGVIYW5kbGVyIGNsYXNzPSJzb2xyLkRpcmVjdFVwZGF0ZUhhbmRsZXIyIj4KIApkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2RhdGFpbXBvcnQvVGVzdEpkYmNEYXRhU291cmNlLmphdmEgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9UZXN0SmRiY0RhdGFTb3VyY2UuamF2YQppbmRleCBlZWQ4ODNjLi5kYTNjMGE1IDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9UZXN0SmRiY0RhdGFTb3VyY2UuamF2YQorKysgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9UZXN0SmRiY0RhdGFTb3VyY2UuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CiBpbXBvcnQgamF2YS5zcWwuRHJpdmVyOwogaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXI7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CkBAIC0xMjcsNiArMTI4LDQ4IEBACiAgIH0KIAogICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmV0cmlldmVGcm9tSm5kaUZhaWx1cmVOb3RIaWRkZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNb2NrSW5pdGlhbENvbnRleHRGYWN0b3J5LmJpbmQoImphdmE6Y29tcC9lbnYvamRiYy9KbmRpREIiLCBkYXRhU291cmNlKTsKKworICAgIHByb3BzLnB1dChKZGJjRGF0YVNvdXJjZS5KTkRJX05BTUUsICJqYXZhOmNvbXAvZW52L2pkYmMvSm5kaURCIik7CisKKyAgICBTUUxFeGNlcHRpb24gc3FsRXhjZXB0aW9uID0gbmV3IFNRTEV4Y2VwdGlvbigiZmFrZSIpOworICAgIEVhc3lNb2NrLmV4cGVjdChkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKSkuYW5kVGhyb3coc3FsRXhjZXB0aW9uKTsKKworICAgIG1vY2tDb250cm9sLnJlcGxheSgpOworICAgIAorICAgIHRyeSB7CisgICAgICBqZGJjRGF0YVNvdXJjZS5jcmVhdGVDb25uZWN0aW9uRmFjdG9yeShjb250ZXh0LCBwcm9wcykuY2FsbCgpOworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgeworICAgICAgYXNzZXJ0U2FtZShzcWxFeGNlcHRpb24sIGV4KTsKKyAgICB9CisgICAgCisgICAgbW9ja0NvbnRyb2wudmVyaWZ5KCk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZXNDb25uZWN0aW9uV2hlbkV4Y2VwdGlvblRocm93bk9uU2V0QXV0b2NvbW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1vY2tJbml0aWFsQ29udGV4dEZhY3RvcnkuYmluZCgiamF2YTpjb21wL2Vudi9qZGJjL0puZGlEQiIsIGRhdGFTb3VyY2UpOworCisgICAgcHJvcHMucHV0KEpkYmNEYXRhU291cmNlLkpORElfTkFNRSwgImphdmE6Y29tcC9lbnYvamRiYy9KbmRpREIiKTsKKworICAgIFNRTEV4Y2VwdGlvbiBzcWxFeGNlcHRpb24gPSBuZXcgU1FMRXhjZXB0aW9uKCJmYWtlIik7CisgICAgRWFzeU1vY2suZXhwZWN0KGRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvbigpKS5hbmRSZXR1cm4oY29ubmVjdGlvbik7CisgICAgY29ubmVjdGlvbi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKKyAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFuZFRocm93KHNxbEV4Y2VwdGlvbik7CisgICAgY29ubmVjdGlvbi5jbG9zZSgpOworICAgIG1vY2tDb250cm9sLnJlcGxheSgpOworICAgIAorICAgIHRyeSB7CisgICAgICBqZGJjRGF0YVNvdXJjZS5jcmVhdGVDb25uZWN0aW9uRmFjdG9yeShjb250ZXh0LCBwcm9wcykuY2FsbCgpOworICAgIH0gY2F0Y2ggKERhdGFJbXBvcnRIYW5kbGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICBhc3NlcnRTYW1lKHNxbEV4Y2VwdGlvbiwgZXguZ2V0Q2F1c2UoKSk7CisgICAgfQorICAgIAorICAgIG1vY2tDb250cm9sLnZlcmlmeSgpOworICB9CisgIAorICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0UmV0cmlldmVGcm9tRHJpdmVyTWFuYWdlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgIERyaXZlck1hbmFnZXIucmVnaXN0ZXJEcml2ZXIoZHJpdmVyKTsKICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2RhdGFpbXBvcnQvVGVzdFpLUHJvcGVydGllc1dyaXRlci5qYXZhIGIvc29sci9jb250cmliL2RhdGFpbXBvcnRoYW5kbGVyL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2RhdGFpbXBvcnQvVGVzdFpLUHJvcGVydGllc1dyaXRlci5qYXZhCmluZGV4IDZmMjkxMDYuLjQ1YmFmYjQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9kYXRhaW1wb3J0aGFuZGxlci9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9kYXRhaW1wb3J0L1Rlc3RaS1Byb3BlcnRpZXNXcml0ZXIuamF2YQorKysgYi9zb2xyL2NvbnRyaWIvZGF0YWltcG9ydGhhbmRsZXIvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvZGF0YWltcG9ydC9UZXN0WktQcm9wZXJ0aWVzV3JpdGVyLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKICAgICBBYnN0cmFjdFprVGVzdENhc2UuYnVpbGRab29LZWVwZXIoemtTZXJ2ZXIuZ2V0WmtIb3N0KCksIHprU2VydmVyLmdldFprQWRkcmVzcygpLCBnZXRGaWxlKCJkaWgvc29sciIpLAogICAgICAgICAiZGF0YWltcG9ydC1zb2xyY29uZmlnLnhtbCIsICJkYXRhaW1wb3J0LXNjaGVtYS54bWwiKTsKIAotICAgIGluaXRDb3JlKCJkYXRhaW1wb3J0LXNvbHJjb25maWcueG1sIiwgImRhdGFpbXBvcnQtc2NoZW1hLnhtbCIsIGdldEZpbGUoImRpaC9zb2xyIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIC8vaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYS54bWwiLCBnZXRGaWxlKCJkaWgvc29sciIpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBjcmVhdGVEZWZhdWx0Q29yZUNvbnRhaW5lcihnZXRGaWxlKCJkaWgvc29sciIpLmdldEFic29sdXRlUGF0aCgpKTsKICAgfQogCiAgIEBCZWZvcmUKZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi9leHRyYWN0aW9uL2l2eS54bWwgYi9zb2xyL2NvbnRyaWIvZXh0cmFjdGlvbi9pdnkueG1sCmluZGV4IGZhYjY0OTIuLjE2ZGZiM2MgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9leHRyYWN0aW9uL2l2eS54bWwKKysrIGIvc29sci9jb250cmliL2V4dHJhY3Rpb24vaXZ5LnhtbApAQCAtMjAsOCArMjAsOCBAQAogICAgIDxpbmZvIG9yZ2FuaXNhdGlvbj0ib3JnLmFwYWNoZS5zb2xyIiBtb2R1bGU9ImV4dHJhY3Rpb24iLz4KICAgICA8ZGVwZW5kZW5jaWVzPgogICAgICAgPCEtLSBUaWthIEpBUnMgLS0+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUudGlrYSIgbmFtZT0idGlrYS1jb3JlIiByZXY9IjEuMyIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS50aWthIiBuYW1lPSJ0aWthLXBhcnNlcnMiIHJldj0iMS4zIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLnRpa2EiIG5hbWU9InRpa2EtY29yZSIgcmV2PSIxLjQiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUudGlrYSIgbmFtZT0idGlrYS1wYXJzZXJzIiByZXY9IjEuNCIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KICAgICAgIDwhLS0gVGlrYSBkZXBlbmRlbmNpZXMgLSBzZWUgaHR0cDovL3Rpa2EuYXBhY2hlLm9yZy8xLjMvZ2V0dGluZ3N0YXJ0ZWQuaHRtbCNVc2luZ19UaWthX2FzX2FfTWF2ZW5fZGVwZW5kZW5jeSAtLT4KICAgICAgIDwhLS0gV2hlbiB1cGdyYWRpbmcgVGlrYSwgdXBncmFkZSBkZXBlbmRlbmNpZXMgdmVyc2lvbnMgYW5kIGFkZCBhbnkgbmV3IG9uZXMKICAgICAgICAgICAgKGV4Y2VwdCBzbGY0ai1hcGksIGNvbW1vbnMtY29kZWMsIGNvbW1vbnMtbG9nZ2luZywgZ2Vyb25pbW8tc3RheC1hcGlfMS4wX3NwZWMpIC0tPgpAQCAtMzEsMTUgKzMxLDE1IEBACiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUuamFtZXMiIG5hbWU9ImFwYWNoZS1taW1lNGotY29yZSIgcmV2PSIwLjcuMiIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KICAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5qYW1lcyIgbmFtZT0iYXBhY2hlLW1pbWU0ai1kb20iIHJldj0iMC43LjIiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUuY29tbW9ucyIgbmFtZT0iY29tbW9ucy1jb21wcmVzcyIgcmV2PSIxLjQuMSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wZGZib3giIG5hbWU9InBkZmJveCIgcmV2PSIxLjcuMSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wZGZib3giIG5hbWU9ImZvbnRib3giIHJldj0iMS43LjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUucGRmYm94IiBuYW1lPSJqZW1wYm94IiByZXY9IjEuNy4xIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLnBkZmJveCIgbmFtZT0icGRmYm94IiByZXY9IjEuOC4xIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLnBkZmJveCIgbmFtZT0iZm9udGJveCIgcmV2PSIxLjguMSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wZGZib3giIG5hbWU9ImplbXBib3giIHJldj0iMS44LjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5ib3VuY3ljYXN0bGUiIG5hbWU9ImJjbWFpbC1qZGsxNSIgcmV2PSIxLjQ1IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYm91bmN5Y2FzdGxlIiBuYW1lPSJiY3Byb3YtamRrMTUiIHJldj0iMS40NSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KLSAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wb2kiIG5hbWU9InBvaSIgcmV2PSIzLjgiIHRyYW5zaXRpdmU9ImZhbHNlIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUucG9pIiBuYW1lPSJwb2ktc2NyYXRjaHBhZCIgcmV2PSIzLjgiIHRyYW5zaXRpdmU9ImZhbHNlIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUucG9pIiBuYW1lPSJwb2ktb294bWwiIHJldj0iMy44IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgotICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLnBvaSIgbmFtZT0icG9pLW9veG1sLXNjaGVtYXMiIHJldj0iMy44IiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLnBvaSIgbmFtZT0icG9pIiByZXY9IjMuOSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wb2kiIG5hbWU9InBvaS1zY3JhdGNocGFkIiByZXY9IjMuOSIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5wb2kiIG5hbWU9InBvaS1vb3htbCIgcmV2PSIzLjkiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUucG9pIiBuYW1lPSJwb2ktb294bWwtc2NoZW1hcyIgcmV2PSIzLjkiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUueG1sYmVhbnMiIG5hbWU9InhtbGJlYW5zIiByZXY9IjIuMy4wIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJkb200aiIgbmFtZT0iZG9tNGoiIHJldj0iMS42LjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5jY2lsLmNvd2FuLnRhZ3NvdXAiIG5hbWU9InRhZ3NvdXAiIHJldj0iMS4yLjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CmRpZmYgLS1naXQgYS9zb2xyL2NvbnRyaWIvZXh0cmFjdGlvbi9zcmMvdGVzdC1maWxlcy9leHRyYWN0aW9uL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbCBiL3NvbHIvY29udHJpYi9leHRyYWN0aW9uL3NyYy90ZXN0LWZpbGVzL2V4dHJhY3Rpb24vc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCmluZGV4IDk3MDBkY2QuLjFhN2YyYmIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9leHRyYWN0aW9uL3NyYy90ZXN0LWZpbGVzL2V4dHJhY3Rpb24vc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCisrKyBiL3NvbHIvY29udHJpYi9leHRyYWN0aW9uL3NyYy90ZXN0LWZpbGVzL2V4dHJhY3Rpb24vc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCkBAIC0yMCw2ICsyMCw5IEBACiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgogICA8am14IC8+CisgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgogCiAgIDwhLS0gVXNlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBkaXJlY3RvcnkgdG8gaG9sZCBhbGwgaW5kZXggZGF0YS4KICAgICAgICBJdCBkZWZhdWx0cyB0byAiaW5kZXgiIGlmIG5vdCBwcmVzZW50LCBhbmQgc2hvdWxkIHByb2JhYmx5CkBAIC0yNyw4ICszMCw2IEBACiAgIDxkYXRhRGlyPiR7c29sci5kYXRhLmRpcjp9PC9kYXRhRGlyPgogICA8ZGlyZWN0b3J5RmFjdG9yeSBuYW1lPSJEaXJlY3RvcnlGYWN0b3J5IiBjbGFzcz0iJHtzb2xyLmRpcmVjdG9yeUZhY3Rvcnk6c29sci5SQU1EaXJlY3RvcnlGYWN0b3J5fSIvPgogCi0gIDwhLS0gPGluZGV4Q29uZmlnPiBzZWN0aW9uIGNvdWxkIGdvIGhlcmUsIGJ1dCB3ZSB3YW50IHRoZSBkZWZhdWx0cyAtLT4KLQogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CiAKICAgICA8IS0tIGF1dG9jb21taXQgcGVuZGluZyBkb2NzIGlmIGNlcnRhaW4gY3JpdGVyaWEgYXJlIG1ldCAKZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvTGFuZ0lkUGFyYW1zLmphdmEgYi9zb2xyL2NvbnRyaWIvbGFuZ2lkL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0xhbmdJZFBhcmFtcy5qYXZhCmluZGV4IDhjMzViZmQuLmZjY2UwZDkgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvTGFuZ0lkUGFyYW1zLmphdmEKKysrIGIvc29sci9jb250cmliL2xhbmdpZC9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9MYW5nSWRQYXJhbXMuamF2YQpAQCAtMzEsNiArMzEsNyBAQAogICBTdHJpbmcgVEhSRVNIT0xEICA9IExBTkdVQUdFX0lEICsgIi50aHJlc2hvbGQiOyAgICAgICAgICAgIC8vIERldGVjdGlvbiB0aHJlc2hvbGQKICAgU3RyaW5nIEVORk9SQ0VfU0NIRU1BID0gIExBTkdVQUdFX0lEICsgIi5lbmZvcmNlU2NoZW1hIjsgICAvLyBFbmZvcmNlcyB0aGF0IG91dHB1dCBmaWVsZHMgZXhpc3QgaW4gc2NoZW1hCiAgIFN0cmluZyBMQU5HX1dISVRFTElTVCAgPSBMQU5HVUFHRV9JRCArICIud2hpdGVsaXN0IjsgICAgICAgLy8gQWxsb3dlZCBsYW5ndWFnZXMKKyAgU3RyaW5nIExDTUFQID0gIExBTkdVQUdFX0lEICsgIi5sY21hcCI7ICAgICAgICAgICAgICAgICAgICAvLyBNYXBzIGRldGVjdGVkIGxhbmdjb2RlIHRvIG90aGVyIHZhbHVlCiAgIFN0cmluZyBNQVBfRU5BQkxFID0gIExBTkdVQUdFX0lEICsgIi5tYXAiOyAgICAgICAgICAgICAgICAgLy8gVHVybnMgb24gb3Igb2ZmIHRoZSBmaWVsZCBtYXBwaW5nCiAgIFN0cmluZyBNQVBfRkwgPSAgTEFOR1VBR0VfSUQgKyAiLm1hcC5mbCI7ICAgICAgICAgICAgICAgICAgLy8gRmllbGQgbGlzdCBmb3IgbWFwcGluZwogICBTdHJpbmcgTUFQX09WRVJXUklURSA9ICBMQU5HVUFHRV9JRCArICIubWFwLm92ZXJ3cml0ZSI7ICAgIC8vIFdoZXRoZXIgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpZWxkcwpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL2xhbmdpZC9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9MYW5ndWFnZUlkZW50aWZpZXJVcGRhdGVQcm9jZXNzb3IuamF2YSBiL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvTGFuZ3VhZ2VJZGVudGlmaWVyVXBkYXRlUHJvY2Vzc29yLmphdmEKaW5kZXggOTZkNmQ2Mi4uYzk5OGVjNCAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL2xhbmdpZC9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9MYW5ndWFnZUlkZW50aWZpZXJVcGRhdGVQcm9jZXNzb3IuamF2YQorKysgYi9zb2xyL2NvbnRyaWIvbGFuZ2lkL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0xhbmd1YWdlSWRlbnRpZmllclVwZGF0ZVByb2Nlc3Nvci5qYXZhCkBAIC03NSw2ICs3NSw3IEBACiAgIHByb3RlY3RlZCBIYXNoU2V0PFN0cmluZz4gbWFwSW5kaXZpZHVhbEZpZWxkc1NldDsKICAgcHJvdGVjdGVkIEhhc2hTZXQ8U3RyaW5nPiBhbGxNYXBGaWVsZHNTZXQ7CiAgIHByb3RlY3RlZCBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGxjTWFwOworICBwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBtYXBMY01hcDsKICAgcHJvdGVjdGVkIEluZGV4U2NoZW1hIHNjaGVtYTsKIAogICAvLyBSZWdleCBwYXR0ZXJucwpAQCAtMTM4LDEzICsxMzksMjYgQEAKICAgICAgICAgYWxsTWFwRmllbGRzU2V0LmFkZEFsbChtYXBJbmRpdmlkdWFsRmllbGRzU2V0KTsKICAgICAgIH0KIAotICAgICAgLy8gTGFuZ3VhZ2UgQ29kZSBtYXBwaW5nCisgICAgICAvLyBOb3JtYWxpemUgZGV0ZWN0ZWQgbGFuZ2NvZGUgb250byBub3JtYWxpemVkIGxhbmdjb2RlCiAgICAgICBsY01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgICBpZihwYXJhbXMuZ2V0KExDTUFQKSAhPSBudWxsKSB7CisgICAgICAgIGZvcihTdHJpbmcgbWFwcGluZyA6IHBhcmFtcy5nZXQoTENNQVApLnNwbGl0KCJbLCBdIikpIHsKKyAgICAgICAgICBTdHJpbmdbXSBrZXlWYWwgPSBtYXBwaW5nLnNwbGl0KCI6Iik7CisgICAgICAgICAgaWYoa2V5VmFsLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICBsY01hcC5wdXQoa2V5VmFsWzBdLCBrZXlWYWxbMV0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuc3VwcG9ydGVkIGZvcm1hdCBmb3IgbGFuZ2lkLmxjbWFwOiAiK21hcHBpbmcrIi4gU2tpcHBpbmcgdGhpcyBtYXBwaW5nLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBMYW5ndWFnZSBDb2RlIG1hcHBpbmcKKyAgICAgIG1hcExjTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKICAgICAgIGlmKHBhcmFtcy5nZXQoTUFQX0xDTUFQKSAhPSBudWxsKSB7CiAgICAgICAgIGZvcihTdHJpbmcgbWFwcGluZyA6IHBhcmFtcy5nZXQoTUFQX0xDTUFQKS5zcGxpdCgiWywgXSIpKSB7CiAgICAgICAgICAgU3RyaW5nW10ga2V5VmFsID0gbWFwcGluZy5zcGxpdCgiOiIpOwogICAgICAgICAgIGlmKGtleVZhbC5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgbGNNYXAucHV0KGtleVZhbFswXSwga2V5VmFsWzFdKTsKKyAgICAgICAgICAgIG1hcExjTWFwLnB1dChrZXlWYWxbMF0sIGtleVZhbFsxXSk7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5zdXBwb3J0ZWQgZm9ybWF0IGZvciBsYW5naWQubWFwLmxjbWFwOiAiK21hcHBpbmcrIi4gU2tpcHBpbmcgdGhpcyBtYXBwaW5nLiIpOwogICAgICAgICAgIH0KQEAgLTMyMiwxMCArMzM2LDExIEBACiAgICAgICBsYW5nU3RyID0gZmFsbGJhY2tMYW5nOwogICAgIH0gZWxzZSB7CiAgICAgICBEZXRlY3RlZExhbmd1YWdlIGxhbmcgPSBsYW5ndWFnZXMuZ2V0KDApOwotICAgICAgaWYobGFuZ1doaXRlbGlzdC5pc0VtcHR5KCkgfHwgbGFuZ1doaXRlbGlzdC5jb250YWlucyhsYW5nLmdldExhbmdDb2RlKCkpKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiTGFuZ3VhZ2UgZGV0ZWN0ZWQge30gd2l0aCBjZXJ0YWludHkge30iLCBsYW5nLmdldExhbmdDb2RlKCksIGxhbmcuZ2V0Q2VydGFpbnR5KCkpOworICAgICAgU3RyaW5nIG5vcm1hbGl6ZWRMYW5nID0gbm9ybWFsaXplTGFuZ0NvZGUobGFuZy5nZXRMYW5nQ29kZSgpKTsKKyAgICAgIGlmKGxhbmdXaGl0ZWxpc3QuaXNFbXB0eSgpIHx8IGxhbmdXaGl0ZWxpc3QuY29udGFpbnMobm9ybWFsaXplZExhbmcpKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiTGFuZ3VhZ2UgZGV0ZWN0ZWQge30gd2l0aCBjZXJ0YWludHkge30iLCBub3JtYWxpemVkTGFuZywgbGFuZy5nZXRDZXJ0YWludHkoKSk7CiAgICAgICAgIGlmKGxhbmcuZ2V0Q2VydGFpbnR5KCkgPj0gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgbGFuZ1N0ciA9IGxhbmcuZ2V0TGFuZ0NvZGUoKTsKKyAgICAgICAgICBsYW5nU3RyID0gbm9ybWFsaXplZExhbmc7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgbG9nLmRlYnVnKCJEZXRlY3RlZCBsYW5ndWFnZSBiZWxvdyB0aHJlc2hvbGQge30sIHVzaW5nIGZhbGxiYWNrIHt9IiwgdGhyZXNob2xkLCBmYWxsYmFja0xhbmcpOwogICAgICAgICAgIGxhbmdTdHIgPSBmYWxsYmFja0xhbmc7CkBAIC0zNDUsNiArMzYwLDIwIEBACiAgIH0KIAogICAvKioKKyAgICogTG9va3MgdXAgbGFuZ3VhZ2UgY29kZSBpbiBtYXAgKGxhbmdpZC5sY21hcCkgYW5kIHJldHVybnMgbWFwcGVkIHZhbHVlCisgICAqIEBwYXJhbSBsYW5nQ29kZSB0aGUgbGFuZ3VhZ2UgY29kZSBzdHJpbmcgcmV0dXJuZWQgZnJvbSBkZXRlY3RvcgorICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkL21hcHBlZCBsYW5ndWFnZSBjb2RlCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZUxhbmdDb2RlKFN0cmluZyBsYW5nQ29kZSkgeworICAgIGlmIChsY01hcC5jb250YWluc0tleShsYW5nQ29kZSkpIHsKKyAgICAgIFN0cmluZyBsYyA9IGxjTWFwLmdldChsYW5nQ29kZSk7CisgICAgICBsb2cuZGVidWcoIkRvaW5nIGxhbmdjb2RlIG5vcm1hbGl6YXRpb24gbWFwcGluZyBmcm9tICIrbGFuZ0NvZGUrIiB0byAiK2xjKTsKKyAgICAgIHJldHVybiBsYzsKKyAgICB9CisgICAgcmV0dXJuIGxhbmdDb2RlOworICB9CisKKyAgLyoqCiAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIG1hcCB0aGUgY3VycmVudCBjb250ZW50cyBpbnRvLCBzbyB0aGF0IHRoZXkgYXJlIHByb3Blcmx5IGFuYWx5emVkLiAgRm9yIGluc3RhbmNlCiAgICAqIGlmIHRoZSBjdXJyZW50RmllbGQgaXMgInRleHQiIGFuZCB0aGUgY29kZSBpcyAiZW4iLCB0aGUgbmV3IGZpZWxkIHdvdWxkIGJ5IGRlZmF1bHQgYmUgInRleHRfZW4iLgogICAgKiBUaGlzIG1ldGhvZCBhbHNvIHBlcmZvcm1zIGN1c3RvbSByZWdleCBwYXR0ZXJuIHJlcGxhY2UgaWYgY29uZmlndXJlZC4gSWYgZW5mb3JjZVNjaGVtYT10cnVlCkBAIC0zNTUsNyArMzg0LDcgQEAKICAgICogQHJldHVybiBUaGUgbmV3IHNjaGVtYSBmaWVsZCBuYW1lLCBiYXNlZCBvbiBwYXR0ZXJuIGFuZCByZXBsYWNlLCBvciBudWxsIGlmIGlsbGVnYWwKICAgICovCiAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGVkRmllbGQoU3RyaW5nIGN1cnJlbnRGaWVsZCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgU3RyaW5nIGxjID0gbGNNYXAuY29udGFpbnNLZXkobGFuZ3VhZ2UpID8gbGNNYXAuZ2V0KGxhbmd1YWdlKSA6IGxhbmd1YWdlOworICAgIFN0cmluZyBsYyA9IG1hcExjTWFwLmNvbnRhaW5zS2V5KGxhbmd1YWdlKSA/IG1hcExjTWFwLmdldChsYW5ndWFnZSkgOiBsYW5ndWFnZTsKICAgICBTdHJpbmcgbmV3RmllbGROYW1lID0gbGFuZ1BhdHRlcm4ubWF0Y2hlcihtYXBQYXR0ZXJuLm1hdGNoZXIoY3VycmVudEZpZWxkKS5yZXBsYWNlRmlyc3QobWFwUmVwbGFjZVN0cikpLnJlcGxhY2VGaXJzdChsYyk7CiAgICAgaWYoZW5mb3JjZVNjaGVtYSAmJiBzY2hlbWEuZ2V0RmllbGRPck51bGwobmV3RmllbGROYW1lKSA9PSBudWxsKSB7CiAgICAgICBsb2cud2FybigiVW5zdWNjZXNzZnVsIGZpZWxkIG5hbWUgbWFwcGluZyBmcm9tIHt9IHRvIHt9LCBmaWVsZCBkb2VzIG5vdCBleGlzdCBhbmQgZW5mb3JjZVNjaGVtYT10cnVlOyBza2lwcGluZyBtYXBwaW5nLiIsIGN1cnJlbnRGaWVsZCwgbmV3RmllbGROYW1lKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL3Rlc3QtZmlsZXMvbGFuZ2lkL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWxhbmd1YWdlaWRlbnRpZmllci54bWwgYi9zb2xyL2NvbnRyaWIvbGFuZ2lkL3NyYy90ZXN0LWZpbGVzL2xhbmdpZC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1sYW5ndWFnZWlkZW50aWZpZXIueG1sCmluZGV4IDZiMmZkY2QuLmM4ZDk4ZmQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL3Rlc3QtZmlsZXMvbGFuZ2lkL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWxhbmd1YWdlaWRlbnRpZmllci54bWwKKysrIGIvc29sci9jb250cmliL2xhbmdpZC9zcmMvdGVzdC1maWxlcy9sYW5naWQvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbGFuZ3VhZ2VpZGVudGlmaWVyLnhtbApAQCAtMjAsNiArMjAsOSBAQAogPGNvbmZpZz4KIAogICA8am14IC8+CisgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgogCiAgIDwhLS0gVXNlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBkaXJlY3RvcnkgdG8gaG9sZCBhbGwgaW5kZXggZGF0YS4KICAgICAgICBJdCBkZWZhdWx0cyB0byAiaW5kZXgiIGlmIG5vdCBwcmVzZW50LCBhbmQgc2hvdWxkIHByb2JhYmx5CmRpZmYgLS1naXQgYS9zb2xyL2NvbnRyaWIvbGFuZ2lkL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0xhbmd1YWdlSWRlbnRpZmllclVwZGF0ZVByb2Nlc3NvckZhY3RvcnlUZXN0Q2FzZS5qYXZhIGIvc29sci9jb250cmliL2xhbmdpZC9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9MYW5ndWFnZUlkZW50aWZpZXJVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdENhc2UuamF2YQppbmRleCBiNzE4Mzg0Li41NTBkMTBmIDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvbGFuZ2lkL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0xhbmd1YWdlSWRlbnRpZmllclVwZGF0ZVByb2Nlc3NvckZhY3RvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL3NvbHIvY29udHJpYi9sYW5naWQvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvTGFuZ3VhZ2VJZGVudGlmaWVyVXBkYXRlUHJvY2Vzc29yRmFjdG9yeVRlc3RDYXNlLmphdmEKQEAgLTExNiw2ICsxMTYsMjIgQEAKICAgfQogCiAgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RNYXBMYW5nY29kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHBhcmFtZXRlcnMgPSBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoKTsKKyAgICBwYXJhbWV0ZXJzLmFkZCgibGFuZ2lkLmZsIiwgIm5hbWUiKTsKKyAgICBwYXJhbWV0ZXJzLmFkZCgibGFuZ2lkLmxjbWFwIiwgInpoX2NuOnpoIHpoX3R3OnpoIik7CisgICAgcGFyYW1ldGVycy5zZXQoImxhbmdpZC5lbmZvcmNlU2NoZW1hIiwgImZhbHNlIik7CisgICAgbGlQcm9jZXNzb3IgPSBjcmVhdGVMYW5nSWRQcm9jZXNzb3IocGFyYW1ldGVycyk7CisKKyAgICBhc3NlcnRFcXVhbHMoInpoIiwgbGlQcm9jZXNzb3IucmVzb2x2ZUxhbmd1YWdlKCJ6aF9jbiIsICJOQSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoInpoIiwgbGlQcm9jZXNzb3IucmVzb2x2ZUxhbmd1YWdlKCJ6aF90dyIsICJOQSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm5vIiwgbGlQcm9jZXNzb3IucmVzb2x2ZUxhbmd1YWdlKCJubyIsICJOQSIpKTsKKyAgICBMaXN0PERldGVjdGVkTGFuZ3VhZ2U+IGxhbmdzID0gbmV3IEFycmF5TGlzdDxEZXRlY3RlZExhbmd1YWdlPigpOworICAgIGxhbmdzLmFkZChuZXcgRGV0ZWN0ZWRMYW5ndWFnZSgiemhfY24iLCAwLjgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInpoIiwgbGlQcm9jZXNzb3IucmVzb2x2ZUxhbmd1YWdlKGxhbmdzLCAiTkEiKSk7CisgIH0KKworICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0UHJlRXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBTb2xySW5wdXREb2N1bWVudCBkb2M7CiAgICAgcGFyYW1ldGVycyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOwpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL3VpbWEvc3JjL3Rlc3QtZmlsZXMvdWltYS9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwgYi9zb2xyL2NvbnRyaWIvdWltYS9zcmMvdGVzdC1maWxlcy91aW1hL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAppbmRleCBlYmQ3OTAzLi45YTcxNDNmIDEwMDY0NAotLS0gYS9zb2xyL2NvbnRyaWIvdWltYS9zcmMvdGVzdC1maWxlcy91aW1hL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvbnRyaWIvdWltYS9zcmMvdGVzdC1maWxlcy91aW1hL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbApAQCAtMjUsNiArMjUsOSBAQAogICAtLT4KIDxjb25maWcgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KKyAgPC9pbmRleENvbmZpZz4KICAgPCEtLQogICAgIGxpYiBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIGluc3RydWN0IFNvbHIgdG8gbG9hZCBhbiBKYXJzCiAgICAgaWRlbnRpZmllZCBhbmQgdXNlIHRoZW0gdG8gcmVzb2x2ZSBhbnkgInBsdWdpbnMiIHNwZWNpZmllZCBpbiB5b3VyCkBAIC02OCw3ICs3MSw2IEBACiAgIC0tPgogICA8ZGF0YURpcj4ke3NvbHIuZGF0YS5kaXI6fTwvZGF0YURpcj4KIAotICA8IS0tIDxpbmRleENvbmZpZz4gc2VjdGlvbiBjb3VsZCBnbyBoZXJlLCBidXQgd2Ugd2FudCB0aGUgZGVmYXVsdHMgLS0+CiAKICAgPCEtLQogICAgIEVuYWJsZXMgSk1YIGlmIGFuZCBvbmx5IGlmIGFuIGV4aXN0aW5nIE1CZWFuU2VydmVyIGlzIGZvdW5kLCB1c2UKZGlmZiAtLWdpdCBhL3NvbHIvY29udHJpYi91aW1hL3NyYy90ZXN0LWZpbGVzL3VpbWEvdWltYS10b2tlbml6ZXJzLXNvbHJjb25maWcueG1sIGIvc29sci9jb250cmliL3VpbWEvc3JjL3Rlc3QtZmlsZXMvdWltYS91aW1hLXRva2VuaXplcnMtc29scmNvbmZpZy54bWwKaW5kZXggNzZkZTE0My4uYzRlYzZjYSAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL3VpbWEvc3JjL3Rlc3QtZmlsZXMvdWltYS91aW1hLXRva2VuaXplcnMtc29scmNvbmZpZy54bWwKKysrIGIvc29sci9jb250cmliL3VpbWEvc3JjL3Rlc3QtZmlsZXMvdWltYS91aW1hLXRva2VuaXplcnMtc29scmNvbmZpZy54bWwKQEAgLTI1LDYgKzI1LDkgQEAKICAgLS0+CiA8Y29uZmlnIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CisgIDwvaW5kZXhDb25maWc+CiAgIDwhLS0KICAgICBsaWIgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCB0byBpbnN0cnVjdCBTb2xyIHRvIGxvYWQgYW4gSmFycwogICAgIGlkZW50aWZpZWQgYW5kIHVzZSB0aGVtIHRvIHJlc29sdmUgYW55ICJwbHVnaW5zIiBzcGVjaWZpZWQgaW4geW91cgpAQCAtNjgsOCArNzEsNiBAQAogICAtLT4KICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CiAKLSAgPCEtLSA8aW5kZXhDb25maWc+IHNlY3Rpb24gY291bGQgZ28gaGVyZSwgYnV0IHdlIHdhbnQgdGhlIGRlZmF1bHRzIC0tPgotCiAgIDwhLS0KICAgICBFbmFibGVzIEpNWCBpZiBhbmQgb25seSBpZiBhbiBleGlzdGluZyBNQmVhblNlcnZlciBpcyBmb3VuZCwgdXNlCiAgICAgdGhpcyBpZiB5b3Ugd2FudCB0byBjb25maWd1cmUgSk1YIHRocm91Z2ggSlZNIHBhcmFtZXRlcnMuIFJlbW92ZQpkaWZmIC0tZ2l0IGEvc29sci9jb250cmliL3ZlbG9jaXR5L3NyYy90ZXN0LWZpbGVzL3ZlbG9jaXR5L3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbCBiL3NvbHIvY29udHJpYi92ZWxvY2l0eS9zcmMvdGVzdC1maWxlcy92ZWxvY2l0eS9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwKaW5kZXggOGQ3N2VlMS4uMGM3MDJiMSAxMDA2NDQKLS0tIGEvc29sci9jb250cmliL3ZlbG9jaXR5L3NyYy90ZXN0LWZpbGVzL3ZlbG9jaXR5L3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvbnRyaWIvdmVsb2NpdHkvc3JjL3Rlc3QtZmlsZXMvdmVsb2NpdHkvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCkBAIC0yMiw2ICsyMiw5IEBACiAtLT4KIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgogCiAgIDxsaWIgZGlyPSIuLi8uLi9jb250cmliL3ZlbG9jaXR5L2xpYiIgLz4KICAgPGxpYiBkaXI9Ii4uLy4uL2Rpc3QvIiByZWdleD0ic29sci12ZWxvY2l0eS1cZC4qXC5qYXIiIC8+CkBAIC0zMSw5ICszNCw2IEBACiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiCiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeX0iLz4KIAotCi0gIDwhLS0gPGluZGV4Q29uZmlnPiBzZWN0aW9uIGNvdWxkIGdvIGhlcmUsIGJ1dCB3ZSB3YW50IHRoZSBkZWZhdWx0cyAtLT4KLQogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CiAgIDwvdXBkYXRlSGFuZGxlcj4KICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvaXZ5LnhtbCBiL3NvbHIvY29yZS9pdnkueG1sCmluZGV4IDJiNGNjYzQuLmIxZDk3NGIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9pdnkueG1sCisrKyBiL3NvbHIvY29yZS9pdnkueG1sCkBAIC0xNiw2ICsxNiw5IEBACiAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgICB1bmRlciB0aGUgTGljZW5zZS4gICAgCiAtLT4KKzwhRE9DVFlQRSBpdnktbW9kdWxlIFsKKyAgPCFFTlRJVFkgaGFkb29wLnZlcnNpb24gIjIuMC41LWFscGhhIj4KK10+CiA8aXZ5LW1vZHVsZSB2ZXJzaW9uPSIyLjAiPgogICAgIDxpbmZvIG9yZ2FuaXNhdGlvbj0ib3JnLmFwYWNoZS5zb2xyIiBtb2R1bGU9ImNvcmUiLz4KIApAQCAtMzIsNiArMzUsMTUgQEAKICAgICAgIDxkZXBlbmRlbmN5IG9yZz0iamF2YXguc2VydmxldCIgbmFtZT0iamF2YXguc2VydmxldC1hcGkiIHJldj0iMy4wLjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5yZXN0bGV0LmplZSIgbmFtZT0ib3JnLnJlc3RsZXQiIHJldj0iMi4xLjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5yZXN0bGV0LmplZSIgbmFtZT0ib3JnLnJlc3RsZXQuZXh0LnNlcnZsZXQiIHJldj0iMi4xLjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+Ci0gICAgICA8ZXhjbHVkZSBvcmc9IioiIGV4dD0iKiIgbWF0Y2hlcj0icmVnZXhwIiB0eXBlPSIke2l2eS5leGNsdWRlLnR5cGVzfSIvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJqb2RhLXRpbWUiIG5hbWU9ImpvZGEtdGltZSIgcmV2PSIyLjIiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICAKKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5oYWRvb3AiIG5hbWU9ImhhZG9vcC1jb21tb24iIHJldj0iJmhhZG9vcC52ZXJzaW9uOyIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5oYWRvb3AiIG5hbWU9ImhhZG9vcC1oZGZzIiByZXY9IiZoYWRvb3AudmVyc2lvbjsiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUuaGFkb29wIiBuYW1lPSJoYWRvb3AtYW5ub3RhdGlvbnMiIHJldj0iJmhhZG9vcC52ZXJzaW9uOyIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLmFwYWNoZS5oYWRvb3AiIG5hbWU9ImhhZG9vcC1hdXRoIiByZXY9IiZoYWRvb3AudmVyc2lvbjsiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbW1vbnMtY29uZmlndXJhdGlvbiIgbmFtZT0iY29tbW9ucy1jb25maWd1cmF0aW9uIiByZXY9IjEuNiIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0iY29tLmdvb2dsZS5wcm90b2J1ZiIgbmFtZT0icHJvdG9idWYtamF2YSIgcmV2PSIyLjQuMGEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbS5nb29nbGVjb2RlLmNvbmN1cnJlbnRsaW5rZWRoYXNobWFwIiBuYW1lPSJjb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUiIHJldj0iMS4yIiB0cmFuc2l0aXZlPSJmYWxzZSIvPgorICAgICAgPGV4Y2x1ZGUgb3JnPSIqIiBleHQ9IioiIG1hdGNoZXI9InJlZ2V4cCIgdHlwZT0iJHtpdnkuZXhjbHVkZS50eXBlc30iLz4gCiAgICAgPC9kZXBlbmRlbmNpZXM+CiA8L2l2eS1tb2R1bGU+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL1NvbHJMb2dGb3JtYXR0ZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sckxvZ0Zvcm1hdHRlci5qYXZhCmluZGV4IDMyNDc4ZDAuLmQ2NjM2ZTggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sckxvZ0Zvcm1hdHRlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sckxvZ0Zvcm1hdHRlci5qYXZhCkBAIC0xNywyMCArMTcsMjQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuWmtDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlJlcGxpY2E7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa1N0YXRlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJRdWVyeVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclJlcXVlc3RJbmZvOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLio7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5aa0NvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuUmVwbGljYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUXVlcnlSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJSZXF1ZXN0SW5mbzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIFNvbHJMb2dGb3JtYXR0ZXIgZXh0ZW5kcyBGb3JtYXR0ZXIgewogCkBAIC0yNTksNyArMjYzLDcgQEAKIAogICBwcml2YXRlIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRSZXBsaWNhUHJvcHMoWmtDb250cm9sbGVyIHprQ29udHJvbGxlciwgU29sckNvcmUgY29yZSkgewogICAgIGZpbmFsIFN0cmluZyBjb2xsZWN0aW9uID0gY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvbGxlY3Rpb25OYW1lKCk7Ci0gICAgUmVwbGljYSByZXBsaWNhID0gemtDb250cm9sbGVyLmdldENsdXN0ZXJTdGF0ZSgpLmdldFJlcGxpY2EoY29sbGVjdGlvbiwgemtDb250cm9sbGVyLmdldENvcmVOb2RlTmFtZShjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkpKTsKKyAgICBSZXBsaWNhIHJlcGxpY2EgPSB6a0NvbnRyb2xsZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0UmVwbGljYShjb2xsZWN0aW9uLCBjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0Q29yZU5vZGVOYW1lKCkpOwogICAgIGlmKHJlcGxpY2EhPW51bGwpIHsKICAgICAgIHJldHVybiByZXBsaWNhLmdldFByb3BlcnRpZXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9KZXR0eVNvbHJSdW5uZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL0pldHR5U29sclJ1bm5lci5qYXZhCmluZGV4IDIwY2MxOTAuLjVlZWIxOWMgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL0pldHR5U29sclJ1bm5lci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL0pldHR5U29sclJ1bm5lci5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAgIHByaXZhdGUgU3RyaW5nIHNoYXJkczsKIAogICBwcml2YXRlIFN0cmluZyBkYXRhRGlyOworICBwcml2YXRlIFN0cmluZyBzb2xyVWxvZ0RpcjsKICAgCiAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdGFydGVkQmVmb3JlID0gZmFsc2U7CiAKQEAgLTM1OSw2ICszNjAsOSBAQAogICAgIGlmKCBkYXRhRGlyICE9IG51bGwpIHsKICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kYXRhLmRpciIsIGRhdGFEaXIpOwogICAgIH0KKyAgICBpZiggc29sclVsb2dEaXIgIT0gbnVsbCkgeworICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLnVsb2cuZGlyIiwgc29sclVsb2dEaXIpOworICAgIH0KICAgICBpZihzaGFyZHMgIT0gbnVsbCkgewogICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzaGFyZCIsIHNoYXJkcyk7CiAgICAgfQpAQCAtMzgyLDYgKzM4Niw4IEBACiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNoYXJkIik7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIuZGF0YS5kaXIiKTsKICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY29yZU5vZGVOYW1lIik7CisgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIudWxvZy5kaXIiKTsKKwogICB9CiAKICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDg1LDYgKzQ5MSwxMCBAQAogICBwdWJsaWMgdm9pZCBzZXREYXRhRGlyKFN0cmluZyBkYXRhRGlyKSB7CiAgICAgdGhpcy5kYXRhRGlyID0gZGF0YURpcjsKICAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0VWxvZ0RpcihTdHJpbmcgdWxvZ0RpcikgeworICAgIHRoaXMuc29sclVsb2dEaXIgPSB1bG9nRGlyOworICB9CiAKICAgcHVibGljIHZvaWQgc2V0Q29yZU5vZGVOYW1lKFN0cmluZyBjb3JlTm9kZU5hbWUpIHsKICAgICB0aGlzLmNvcmVOb2RlTmFtZSA9IGNvcmVOb2RlTmFtZTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQXNzaWduU2hhcmQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQXNzaWduLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9Bc3NpZ25TaGFyZC5qYXZhCnJlbmFtZSB0byBzb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fzc2lnbi5qYXZhCmluZGV4IDUyNGRmZTUuLjhmMDEyMGIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQXNzaWduU2hhcmQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fzc2lnbi5qYXZhCkBAIC0yMywxMiArMjMsMzYgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5DbHVzdGVyU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5SZXBsaWNhOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU2xpY2U7CiAKLXB1YmxpYyBjbGFzcyBBc3NpZ25TaGFyZCB7CiAKK3B1YmxpYyBjbGFzcyBBc3NpZ24geworICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIENPVU5UID0gUGF0dGVybi5jb21waWxlKCJjb3JlX25vZGUoXFxkKykiKTsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25Ob2RlKFN0cmluZyBjb2xsZWN0aW9uLCBDbHVzdGVyU3RhdGUgc3RhdGUpIHsKKyAgICBNYXA8U3RyaW5nLCBTbGljZT4gc2xpY2VNYXAgPSBzdGF0ZS5nZXRTbGljZXNNYXAoY29sbGVjdGlvbik7CisgICAgaWYgKHNsaWNlTWFwID09IG51bGwpIHsKKyAgICAgIHJldHVybiAiY29yZV9ub2RlMSI7CisgICAgfQorCisgICAgaW50IG1heCA9IDA7CisgICAgZm9yIChTbGljZSBzbGljZSA6IHNsaWNlTWFwLnZhbHVlcygpKSB7CisgICAgICBmb3IgKFJlcGxpY2EgcmVwbGljYSA6IHNsaWNlLmdldFJlcGxpY2FzKCkpIHsKKyAgICAgICAgTWF0Y2hlciBtID0gQ09VTlQubWF0Y2hlcihyZXBsaWNhLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgeworICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gImNvcmVfbm9kZSIgKyAobWF4ICsgMSk7CisgIH0KKyAgCiAgIC8qKgogICAgKiBBc3NpZ24gYSBuZXcgdW5pcXVlIGlkIHVwIHRvIHNsaWNlcyBjb3VudCAtIHRoZW4gYWRkIHJlcGxpY2FzIGV2ZW5seS4KICAgICogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Nsb3VkRGVzY3JpcHRvci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9DbG91ZERlc2NyaXB0b3IuamF2YQppbmRleCBjZjA4NmZkLi44YTA3MWM3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Nsb3VkRGVzY3JpcHRvci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2xvdWREZXNjcmlwdG9yLmphdmEKQEAgLTQ0LDYgKzQ0LDEwIEBACiAgIHB1YmxpYyBib29sZWFuIGlzTGVhZGVyKCkgewogICAgIHJldHVybiBpc0xlYWRlcjsKICAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0TGVhZGVyKGJvb2xlYW4gaXNMZWFkZXIpIHsKKyAgICB0aGlzLmlzTGVhZGVyID0gaXNMZWFkZXI7CisgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRTaGFyZElkKFN0cmluZyBzaGFyZElkKSB7CiAgICAgdGhpcy5zaGFyZElkID0gc2hhcmRJZDsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvRWxlY3Rpb25Db250ZXh0LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0VsZWN0aW9uQ29udGV4dC5qYXZhCmluZGV4IDFkNDM2YWYuLjUyZDIyZjAgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvRWxlY3Rpb25Db250ZXh0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9FbGVjdGlvbkNvbnRleHQuamF2YQpAQCAtNDcsOSArNDcsOSBAQAogICBTdHJpbmcgbGVhZGVyU2VxUGF0aDsKICAgcHJpdmF0ZSBTb2xyWmtDbGllbnQgemtDbGllbnQ7CiAgIAotICBwdWJsaWMgRWxlY3Rpb25Db250ZXh0KGZpbmFsIFN0cmluZyBzaGFyZFprTm9kZU5hbWUsCisgIHB1YmxpYyBFbGVjdGlvbkNvbnRleHQoZmluYWwgU3RyaW5nIGNvcmVOb2RlTmFtZSwKICAgICAgIGZpbmFsIFN0cmluZyBlbGVjdGlvblBhdGgsIGZpbmFsIFN0cmluZyBsZWFkZXJQYXRoLCBmaW5hbCBaa05vZGVQcm9wcyBsZWFkZXJQcm9wcywgZmluYWwgU29sclprQ2xpZW50IHprQ2xpZW50KSB7Ci0gICAgdGhpcy5pZCA9IHNoYXJkWmtOb2RlTmFtZTsKKyAgICB0aGlzLmlkID0gY29yZU5vZGVOYW1lOwogICAgIHRoaXMuZWxlY3Rpb25QYXRoID0gZWxlY3Rpb25QYXRoOwogICAgIHRoaXMubGVhZGVyUGF0aCA9IGxlYWRlclBhdGg7CiAgICAgdGhpcy5sZWFkZXJQcm9wcyA9IGxlYWRlclByb3BzOwpAQCAtNzgsOCArNzgsOCBAQAogICBwcm90ZWN0ZWQgTGVhZGVyRWxlY3RvciBsZWFkZXJFbGVjdG9yOwogCiAgIHB1YmxpYyBTaGFyZExlYWRlckVsZWN0aW9uQ29udGV4dEJhc2UoTGVhZGVyRWxlY3RvciBsZWFkZXJFbGVjdG9yLCBmaW5hbCBTdHJpbmcgc2hhcmRJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBjb2xsZWN0aW9uLCBmaW5hbCBTdHJpbmcgc2hhcmRaa05vZGVOYW1lLCBaa05vZGVQcm9wcyBwcm9wcywgWmtTdGF0ZVJlYWRlciB6a1N0YXRlUmVhZGVyKSB7Ci0gICAgc3VwZXIoc2hhcmRaa05vZGVOYW1lLCBaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05TX1pLTk9ERSArICIvIiArIGNvbGxlY3Rpb24gKyAiL2xlYWRlcl9lbGVjdC8iCisgICAgICBmaW5hbCBTdHJpbmcgY29sbGVjdGlvbiwgZmluYWwgU3RyaW5nIGNvcmVOb2RlTmFtZSwgWmtOb2RlUHJvcHMgcHJvcHMsIFprU3RhdGVSZWFkZXIgemtTdGF0ZVJlYWRlcikgeworICAgIHN1cGVyKGNvcmVOb2RlTmFtZSwgWmtTdGF0ZVJlYWRlci5DT0xMRUNUSU9OU19aS05PREUgKyAiLyIgKyBjb2xsZWN0aW9uICsgIi9sZWFkZXJfZWxlY3QvIgogICAgICAgICArIHNoYXJkSWQsIFprU3RhdGVSZWFkZXIuZ2V0U2hhcmRMZWFkZXJzUGF0aChjb2xsZWN0aW9uLCBzaGFyZElkKSwKICAgICAgICAgcHJvcHMsIHprU3RhdGVSZWFkZXIuZ2V0WmtDbGllbnQoKSk7CiAgICAgdGhpcy5sZWFkZXJFbGVjdG9yID0gbGVhZGVyRWxlY3RvcjsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICB6a0NsaWVudC5tYWtlUGF0aChsZWFkZXJQYXRoLCBaa1N0YXRlUmVhZGVyLnRvSlNPTihsZWFkZXJQcm9wcyksCiAgICAgICAgIENyZWF0ZU1vZGUuRVBIRU1FUkFMLCB0cnVlKTsKICAgICBhc3NlcnQgc2hhcmRJZCAhPSBudWxsOwotICAgIFprTm9kZVByb3BzIG0gPSBaa05vZGVQcm9wcy5mcm9tS2V5VmFscyhPdmVyc2Vlci5RVUVVRV9PUEVSQVRJT04sICJsZWFkZXIiLAorICAgIFprTm9kZVByb3BzIG0gPSBaa05vZGVQcm9wcy5mcm9tS2V5VmFscyhPdmVyc2Vlci5RVUVVRV9PUEVSQVRJT04sIFprU3RhdGVSZWFkZXIuTEVBREVSX1BST1AsCiAgICAgICAgIFprU3RhdGVSZWFkZXIuU0hBUkRfSURfUFJPUCwgc2hhcmRJZCwgWmtTdGF0ZVJlYWRlci5DT0xMRUNUSU9OX1BST1AsCiAgICAgICAgIGNvbGxlY3Rpb24sIFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCwgbGVhZGVyUHJvcHMuZ2V0UHJvcGVydGllcygpCiAgICAgICAgICAgICAuZ2V0KFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCksIFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1AsCkBAIC0xMTksOCArMTE5LDggQEAKICAgCiAgIHB1YmxpYyBTaGFyZExlYWRlckVsZWN0aW9uQ29udGV4dChMZWFkZXJFbGVjdG9yIGxlYWRlckVsZWN0b3IsIAogICAgICAgZmluYWwgU3RyaW5nIHNoYXJkSWQsIGZpbmFsIFN0cmluZyBjb2xsZWN0aW9uLAotICAgICAgZmluYWwgU3RyaW5nIHNoYXJkWmtOb2RlTmFtZSwgWmtOb2RlUHJvcHMgcHJvcHMsIFprQ29udHJvbGxlciB6a0NvbnRyb2xsZXIsIENvcmVDb250YWluZXIgY2MpIHsKLSAgICBzdXBlcihsZWFkZXJFbGVjdG9yLCBzaGFyZElkLCBjb2xsZWN0aW9uLCBzaGFyZFprTm9kZU5hbWUsIHByb3BzLAorICAgICAgZmluYWwgU3RyaW5nIGNvcmVOb2RlTmFtZSwgWmtOb2RlUHJvcHMgcHJvcHMsIFprQ29udHJvbGxlciB6a0NvbnRyb2xsZXIsIENvcmVDb250YWluZXIgY2MpIHsKKyAgICBzdXBlcihsZWFkZXJFbGVjdG9yLCBzaGFyZElkLCBjb2xsZWN0aW9uLCBjb3JlTm9kZU5hbWUsIHByb3BzLAogICAgICAgICB6a0NvbnRyb2xsZXIuZ2V0WmtTdGF0ZVJlYWRlcigpKTsKICAgICB0aGlzLnprQ29udHJvbGxlciA9IHprQ29udHJvbGxlcjsKICAgICB0aGlzLmNjID0gY2M7CkBAIC0xMzgsMTIgKzEzOCwxMiBAQAogICBAT3ZlcnJpZGUKICAgdm9pZCBydW5MZWFkZXJQcm9jZXNzKGJvb2xlYW4gd2VBcmVSZXBsYWNlbWVudCkgdGhyb3dzIEtlZXBlckV4Y2VwdGlvbiwKICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgbG9nLmluZm8oIlJ1bm5pbmcgdGhlIGxlYWRlciBwcm9jZXNzLiIpOworICAgIGxvZy5pbmZvKCJSdW5uaW5nIHRoZSBsZWFkZXIgcHJvY2VzcyBmb3Igc2hhcmQgIiArIHNoYXJkSWQpOwogICAgIAogICAgIFN0cmluZyBjb3JlTmFtZSA9IGxlYWRlclByb3BzLmdldFN0cihaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QKTsKICAgICAKICAgICAvLyBjbGVhciB0aGUgbGVhZGVyIGluIGNsdXN0ZXJzdGF0ZQotICAgIFprTm9kZVByb3BzIG0gPSBuZXcgWmtOb2RlUHJvcHMoT3ZlcnNlZXIuUVVFVUVfT1BFUkFUSU9OLCAibGVhZGVyIiwKKyAgICBaa05vZGVQcm9wcyBtID0gbmV3IFprTm9kZVByb3BzKE92ZXJzZWVyLlFVRVVFX09QRVJBVElPTiwgWmtTdGF0ZVJlYWRlci5MRUFERVJfUFJPUCwKICAgICAgICAgWmtTdGF0ZVJlYWRlci5TSEFSRF9JRF9QUk9QLCBzaGFyZElkLCBaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05fUFJPUCwKICAgICAgICAgY29sbGVjdGlvbik7CiAgICAgT3ZlcnNlZXIuZ2V0SW5RdWV1ZSh6a0NsaWVudCkub2ZmZXIoWmtTdGF0ZVJlYWRlci50b0pTT04obSkpOwpAQCAtMjQzLDggKzI0Myw4IEBACiAgICAgICB9CiAKICAgICAgIGxvZy5pbmZvKCJJIGFtIHRoZSBuZXcgbGVhZGVyOiAiCi0gICAgICAgICAgKyBaa0NvcmVOb2RlUHJvcHMuZ2V0Q29yZVVybChsZWFkZXJQcm9wcykpOwotICAgICAgY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpLmlzTGVhZGVyID0gdHJ1ZTsKKyAgICAgICAgICArIFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKGxlYWRlclByb3BzKSArICIgIiArIHNoYXJkSWQpOworICAgICAgY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpLnNldExlYWRlcih0cnVlKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgewogICAgICAgICBjb3JlLmNsb3NlKCk7CkBAIC0yNTQsMTYgKzI1NCwxNyBAQAogICAgIHRyeSB7CiAgICAgICBzdXBlci5ydW5MZWFkZXJQcm9jZXNzKHdlQXJlUmVwbGFjZW1lbnQpOwogICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csICJUaGVyZSB3YXMgYSBwcm9ibGVtIHRyeWluZyB0byByZWdpc3RlciBhcyB0aGUgbGVhZGVyIiwgdCk7CisgICAgICBjYW5jZWxFbGVjdGlvbigpOwogICAgICAgdHJ5IHsKICAgICAgICAgY29yZSA9IGNjLmdldENvcmUoY29yZU5hbWUpOwogICAgICAgICBpZiAoY29yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgY2FuY2VsRWxlY3Rpb24oKTsKICAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLAogICAgICAgICAgICAgICAiRmF0YWwgRXJyb3IsIFNvbHJDb3JlIG5vdCBmb3VuZDoiICsgY29yZU5hbWUgKyAiIGluICIKICAgICAgICAgICAgICAgICAgICsgY2MuZ2V0Q29yZU5hbWVzKCkpOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuaXNMZWFkZXIgPSBmYWxzZTsKKyAgICAgICAgY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpLnNldExlYWRlcihmYWxzZSk7CiAgICAgICAgIAogICAgICAgICAvLyB3ZSBjb3VsZCBub3QgcHVibGlzaCBvdXJzZWx2ZXMgYXMgbGVhZGVyIC0gcmVqb2luIGVsZWN0aW9uCiAgICAgICAgIHJlam9pbkxlYWRlckVsZWN0aW9uKGxlYWRlclNlcVBhdGgsIGNvcmUpOwpAQCAtMzMyLDcgKzMzMyw3IEBACiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlmIChjbnQgJSA0MCA9PSAwKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiV2FpdGluZyB1bnRpbCB3ZSBzZWUgbW9yZSByZXBsaWNhcyB1cDogdG90YWw9IgorICAgICAgICAgICAgbG9nLmluZm8oIldhaXRpbmcgdW50aWwgd2Ugc2VlIG1vcmUgcmVwbGljYXMgdXAgZm9yIHNoYXJkICIgKyBzaGFyZElkICsgIjogdG90YWw9IgogICAgICAgICAgICAgICArIHNsaWNlcy5nZXRSZXBsaWNhc01hcCgpLnNpemUoKSArICIgZm91bmQ9IiArIGZvdW5kCiAgICAgICAgICAgICAgICsgIiB0aW1lb3V0aW49IiArICh0aW1lb3V0QXQgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwogICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXIuamF2YQppbmRleCBjNWE5ZmI0Li5jZjhkMDJlIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL092ZXJzZWVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9PdmVyc2Vlci5qYXZhCkBAIC01MCwxNSArNTAsMTYgQEAKICAqLwogcHVibGljIGNsYXNzIE92ZXJzZWVyIHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFVUVfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUNPUkUgPSAiZGVsZXRlY29yZSI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRUNPTExFQ1RJT04gPSAicmVtb3ZlY29sbGVjdGlvbiI7CiAgIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVVBEQVRFX0RFTEFZID0gMTUwMDsgIC8vIGRlbGF5IGJldHdlZW4gY2xvdWQgc3RhdGUgdXBkYXRlcwogCisKICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE92ZXJzZWVyLmNsYXNzKTsKICAgCiAgIHByaXZhdGUgY2xhc3MgQ2x1c3RlclN0YXRlVXBkYXRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBDbG9zYWJsZVRocmVhZCB7CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUNPUkUgPSAiZGVsZXRlY29yZSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBaa1N0YXRlUmVhZGVyIHJlYWRlcjsKICAgICBwcml2YXRlIGZpbmFsIFNvbHJaa0NsaWVudCB6a0NsaWVudDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBteUlkOwpAQCAtMjY3LDggKzI2OCwxNCBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgY29sbGVjdGlvbiA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QKTsKICAgICAgICAgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09SRV9OT0RFX05BTUVfUFJPUCk7CiAgICAgICAgIGlmIChjb3JlTm9kZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgIC8vIGl0IG11c3QgYmUgdGhlIGRlZmF1bHQgdGhlbgotICAgICAgICAgIGNvcmVOb2RlTmFtZSA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1ApICsgIl8iICsgbWVzc2FnZS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CisgICAgICAgICAgY29yZU5vZGVOYW1lID0gZ2V0QXNzaWduZWRDb3JlTm9kZU5hbWUoc3RhdGUsIG1lc3NhZ2UpOworICAgICAgICAgIGlmIChjb3JlTm9kZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmluZm8oIm5vZGU9IiArIGNvcmVOb2RlTmFtZSArICIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGNvcmVOb2RlTmFtZSBpcyBudWxsLCBhdXRvIGFzc2lnbiBvbmUKKyAgICAgICAgICAgIGNvcmVOb2RlTmFtZSA9IEFzc2lnbi5hc3NpZ25Ob2RlKGNvbGxlY3Rpb24sIHN0YXRlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZS5nZXRQcm9wZXJ0aWVzKCkucHV0KFprU3RhdGVSZWFkZXIuQ09SRV9OT0RFX05BTUVfUFJPUCwgY29yZU5vZGVOYW1lKTsKICAgICAgICAgfQogICAgICAgICBJbnRlZ2VyIG51bVNoYXJkcyA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTlVNX1NIQVJEU19QUk9QKSE9bnVsbD9JbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTlVNX1NIQVJEU19QUk9QKSk6bnVsbDsKICAgICAgICAgbG9nLmluZm8oIlVwZGF0ZSBzdGF0ZSBudW1TaGFyZHM9e30gbWVzc2FnZT17fSIsIG51bVNoYXJkcywgbWVzc2FnZSk7CkBAIC0yODEsNyArMjg4LDYgQEAKICAgICAgICAgLy8gdXNlIHRoZSBwcm92aWRlZCBub24gbnVsbCBzaGFyZElkCiAgICAgICAgIFN0cmluZyBzbGljZU5hbWUgPSBtZXNzYWdlLmdldFN0cihaa1N0YXRlUmVhZGVyLlNIQVJEX0lEX1BST1ApOwogICAgICAgICBpZiAoc2xpY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAvL1N0cmluZyBub2RlTmFtZSA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1ApOwogICAgICAgICAgIC8vZ2V0IHNoYXJkSWQgZnJvbSBDbHVzdGVyU3RhdGUKICAgICAgICAgICBzbGljZU5hbWUgPSBnZXRBc3NpZ25lZElkKHN0YXRlLCBjb3JlTm9kZU5hbWUsIG1lc3NhZ2UpOwogICAgICAgICAgIGlmIChzbGljZU5hbWUgIT0gbnVsbCkgewpAQCAtMjk1LDggKzMwMSw4IEBACiAgICAgICAgICAgICBudW1TaGFyZHMgPSBzdGF0ZS5nZXRDb2xsZWN0aW9uU3RhdGVzKCkuZ2V0KGNvbGxlY3Rpb24pLmdldFNsaWNlcygpLnNpemUoKTsKICAgICAgICAgICAgIGxvZy5pbmZvKCJDb2xsZWN0aW9uIGFscmVhZHkgZXhpc3RzIHdpdGggIiArIFprU3RhdGVSZWFkZXIuTlVNX1NIQVJEU19QUk9QICsgIj0iICsgbnVtU2hhcmRzKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgc2xpY2VOYW1lID0gQXNzaWduU2hhcmQuYXNzaWduU2hhcmQoY29sbGVjdGlvbiwgc3RhdGUsIG51bVNoYXJkcyk7Ci0gICAgICAgICAgbG9nLmluZm8oIkFzc2lnbmluZyBuZXcgbm9kZSB0byBzaGFyZD0iICsgc2xpY2VOYW1lKTsKKyAgICAgICAgICBzbGljZU5hbWUgPSBBc3NpZ24uYXNzaWduU2hhcmQoY29sbGVjdGlvbiwgc3RhdGUsIG51bVNoYXJkcyk7CisgICAgICAgICAgbG9nLmluZm8oIkFzc2lnbmluZyBuZXcgbm9kZSB0byBzaGFyZCBzaGFyZD0iICsgc2xpY2VOYW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIFNsaWNlIHNsaWNlID0gc3RhdGUuZ2V0U2xpY2UoY29sbGVjdGlvbiwgc2xpY2VOYW1lKTsKQEAgLTMyMCw4ICszMjYsMTEgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyB3ZSBkb24ndCBwdXQgbnVtX3NoYXJkcyBpbiB0aGUgY2x1c3RlcnN0YXRlCisgICAgICAgIC8vIHdlIGRvbid0IHB1dCB0aGVzZSBpbiB0aGUgY2x1c3RlcnN0YXRlCiAgICAgICAgICAgcmVwbGljYVByb3BzLnJlbW92ZShaa1N0YXRlUmVhZGVyLk5VTV9TSEFSRFNfUFJPUCk7CisgICAgICAgICAgcmVwbGljYVByb3BzLnJlbW92ZShaa1N0YXRlUmVhZGVyLkNPUkVfTk9ERV9OQU1FX1BST1ApOworICAgICAgICAgIHJlcGxpY2FQcm9wcy5yZW1vdmUoWmtTdGF0ZVJlYWRlci5TSEFSRF9JRF9QUk9QKTsKKyAgICAgICAgICByZXBsaWNhUHJvcHMucmVtb3ZlKFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QKTsKICAgICAgICAgICByZXBsaWNhUHJvcHMucmVtb3ZlKFFVRVVFX09QRVJBVElPTik7CiAgICAgICAgICAgCiAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBwcm9wcyB3aXRoIG51bGwgdmFsdWVzCkBAIC00MTcsNiArNDI2LDI2IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgfQogICAgICAgCisgICAgICBwcml2YXRlIFN0cmluZyBnZXRBc3NpZ25lZENvcmVOb2RlTmFtZShDbHVzdGVyU3RhdGUgc3RhdGUsIFprTm9kZVByb3BzIG1lc3NhZ2UpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTbGljZT4gc2xpY2VzID0gc3RhdGUuZ2V0U2xpY2VzKG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QKSk7CisgICAgICAgIGlmIChzbGljZXMgIT0gbnVsbCkgeworICAgICAgICAgIGZvciAoU2xpY2Ugc2xpY2UgOiBzbGljZXMpIHsKKyAgICAgICAgICAgIGZvciAoUmVwbGljYSByZXBsaWNhIDogc2xpY2UuZ2V0UmVwbGljYXMoKSkgeworICAgICAgICAgICAgICBTdHJpbmcgYmFzZVVybCA9IHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCk7CisgICAgICAgICAgICAgIFN0cmluZyBjb3JlID0gcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBTdHJpbmcgbXNnQmFzZVVybCA9IG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCk7CisgICAgICAgICAgICAgIFN0cmluZyBtc2dDb3JlID0gbWVzc2FnZS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lcXVhbHMobXNnQmFzZVVybCkgJiYgY29yZS5lcXVhbHMobXNnQ29yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGljYS5nZXROYW1lKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICAKICAgICAgIHByaXZhdGUgQ2x1c3RlclN0YXRlIHVwZGF0ZVNsaWNlKENsdXN0ZXJTdGF0ZSBzdGF0ZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTbGljZSBzbGljZSkgewogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyEhISMjIyBPTEQgQ0xVU1RFUlNUQVRFOiAiICsgSlNPTlV0aWwudG9KU09OKHN0YXRlLmdldENvbGxlY3Rpb25TdGF0ZXMoKSkpOwogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nIHNsaWNlOiIgKyBzbGljZSk7CkBAIC01MjYsMTAgKzU1NSw2IEBACiAgICAgICBwcml2YXRlIENsdXN0ZXJTdGF0ZSByZW1vdmVDb3JlKGZpbmFsIENsdXN0ZXJTdGF0ZSBjbHVzdGVyU3RhdGUsIFprTm9kZVByb3BzIG1lc3NhZ2UpIHsKICAgICAgICAgCiAgICAgICAgIFN0cmluZyBjbm4gPSBtZXNzYWdlLmdldFN0cihaa1N0YXRlUmVhZGVyLkNPUkVfTk9ERV9OQU1FX1BST1ApOwotICAgICAgICBpZiAoY25uID09IG51bGwpIHsKLSAgICAgICAgICAvLyBpdCBtdXN0IGJlIHRoZSBkZWZhdWx0IHRoZW4KLSAgICAgICAgICBjbm4gPSBtZXNzYWdlLmdldFN0cihaa1N0YXRlUmVhZGVyLk5PREVfTkFNRV9QUk9QKSArICJfIiArIG1lc3NhZ2UuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1ApOwotICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGNvbGxlY3Rpb24gPSBtZXNzYWdlLmdldFN0cihaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05fUFJPUCk7CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXJDb2xsZWN0aW9uUHJvY2Vzc29yLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL092ZXJzZWVyQ29sbGVjdGlvblByb2Nlc3Nvci5qYXZhCmluZGV4IDViODNmNjMuLjFjZTE0ZmUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXJDb2xsZWN0aW9uUHJvY2Vzc29yLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9PdmVyc2VlckNvbGxlY3Rpb25Qcm9jZXNzb3IuamF2YQpAQCAtMzYwLDEzICszNjAsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5CQURfUkVRVUVTVCwgIlN1Yi1zaGFyZDogIiArIHN1YlNsaWNlICsgIiBleGlzdHMgaW4gYWN0aXZlIHN0YXRlLiBBYm9ydGluZyBzcGxpdCBzaGFyZC4iKTsKICAgICAgICAgICB9IGVsc2UgaWYgKFNsaWNlLkNPTlNUUlVDVElPTi5lcXVhbHMob1NsaWNlLmdldFN0YXRlKCkpKSAgewogICAgICAgICAgICAgZm9yIChSZXBsaWNhIHJlcGxpY2EgOiBvU2xpY2UuZ2V0UmVwbGljYXMoKSkgewotICAgICAgICAgICAgICBTdHJpbmcgY29yZSA9IHJlcGxpY2EuZ2V0U3RyKCJjb3JlIik7Ci0gICAgICAgICAgICAgIGxvZy5pbmZvKCJVbmxvYWRpbmcgY29yZTogIiArIGNvcmUgKyAiIGZyb20gbm9kZTogIiArIHJlcGxpY2EuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOwotICAgICAgICAgICAgICBwYXJhbXMuc2V0KENvcmVBZG1pblBhcmFtcy5BQ1RJT04sIENvcmVBZG1pbkFjdGlvbi5VTkxPQUQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ29yZUFkbWluUGFyYW1zLkNPUkUsIGNvcmUpOwotICAgICAgICAgICAgICBwYXJhbXMuc2V0KENvcmVBZG1pblBhcmFtcy5ERUxFVEVfSU5ERVgsICJ0cnVlIik7Ci0gICAgICAgICAgICAgIHNlbmRTaGFyZFJlcXVlc3QocmVwbGljYS5nZXROb2RlTmFtZSgpLCBwYXJhbXMpOworICAgICAgICAgICAgICBpZiAoY2x1c3RlclN0YXRlLmxpdmVOb2Rlc0NvbnRhaW4ocmVwbGljYS5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3JlID0gcmVwbGljYS5nZXRTdHIoImNvcmUiKTsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiVW5sb2FkaW5nIGNvcmU6ICIgKyBjb3JlICsgIiBmcm9tIG5vZGU6ICIgKyByZXBsaWNhLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ29yZUFkbWluUGFyYW1zLkFDVElPTiwgQ29yZUFkbWluQWN0aW9uLlVOTE9BRC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENvcmVBZG1pblBhcmFtcy5DT1JFLCBjb3JlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENvcmVBZG1pblBhcmFtcy5ERUxFVEVfSU5ERVgsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgc2VuZFNoYXJkUmVxdWVzdChyZXBsaWNhLmdldE5vZGVOYW1lKCksIHBhcmFtcyk7CisgICAgICAgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJSZXBsaWNhIHt9IGV4aXN0cyBpbiBzaGFyZCB7fSBidXQgaXMgbm90IGxpdmUgYW5kIGNhbm5vdCBiZSB1bmxvYWRlZCIsIHJlcGxpY2EsIG9TbGljZSk7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM5NywxMyArNDAxLDE5IEBACiAgICAgICAgIC8vcGFyYW1zLnNldChaa1N0YXRlUmVhZGVyLk5VTV9TSEFSRFNfUFJPUCwgbnVtU2xpY2VzKTsgdG9kbzogaXMgaXQgbmVjZXNzYXJ5LCB3ZSdyZSBub3QgY3JlYXRpbmcgY29sbGVjdGlvbnM/CiAKICAgICAgICAgc2VuZFNoYXJkUmVxdWVzdChub2RlTmFtZSwgcGFyYW1zKTsKKyAgICAgIH0KIAorICAgICAgY29sbGVjdFNoYXJkUmVzcG9uc2VzKHJlc3VsdHMsIHRydWUsCisgICAgICAgICAgIlNQTFRTSEFSRCBmYWlsZWQgdG8gY3JlYXRlIHN1YnNoYXJkIGxlYWRlcnMiKTsKKworICAgICAgZm9yIChTdHJpbmcgc3ViU2hhcmROYW1lIDogc3ViU2hhcmROYW1lcykgewogICAgICAgICAvLyB3YWl0IGZvciBwYXJlbnQgbGVhZGVyIHRvIGFja25vd2xlZGdlIHRoZSBzdWItc2hhcmQgY29yZQogICAgICAgICBsb2cuaW5mbygiQXNraW5nIHBhcmVudCBsZWFkZXIgdG8gd2FpdCBmb3I6ICIgKyBzdWJTaGFyZE5hbWUgKyAiIHRvIGJlIGFsaXZlIG9uOiAiICsgbm9kZU5hbWUpOworICAgICAgICBTdHJpbmcgY29yZU5vZGVOYW1lID0gd2FpdEZvckNvcmVOb2RlTmFtZShjb2xsZWN0aW9uLCB6a1N0YXRlUmVhZGVyLmdldFprQ2xpZW50KCkuZ2V0QmFzZVVybEZvck5vZGVOYW1lKG5vZGVOYW1lKSwgc3ViU2hhcmROYW1lKTsKICAgICAgICAgQ29yZUFkbWluUmVxdWVzdC5XYWl0Rm9yU3RhdGUgY21kID0gbmV3IENvcmVBZG1pblJlcXVlc3QuV2FpdEZvclN0YXRlKCk7CiAgICAgICAgIGNtZC5zZXRDb3JlTmFtZShzdWJTaGFyZE5hbWUpOwogICAgICAgICBjbWQuc2V0Tm9kZU5hbWUobm9kZU5hbWUpOwotICAgICAgICBjbWQuc2V0Q29yZU5vZGVOYW1lKG5vZGVOYW1lICsgIl8iICsgc3ViU2hhcmROYW1lKTsKKyAgICAgICAgY21kLnNldENvcmVOb2RlTmFtZShjb3JlTm9kZU5hbWUpOwogICAgICAgICBjbWQuc2V0U3RhdGUoWmtTdGF0ZVJlYWRlci5BQ1RJVkUpOwogICAgICAgICBjbWQuc2V0Q2hlY2tMaXZlKHRydWUpOwogICAgICAgICBjbWQuc2V0T25seUlmTGVhZGVyKHRydWUpOwpAQCAtNDExLDcgKzQyMSw3IEBACiAgICAgICB9CiAKICAgICAgIGNvbGxlY3RTaGFyZFJlc3BvbnNlcyhyZXN1bHRzLCB0cnVlLAotICAgICAgICAgICJTUExUU0hBUkQgZmFpbGVkIHRvIGNyZWF0ZSBzdWJzaGFyZCBsZWFkZXJzIG9yIHRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGVtIHRvIGNvbWUgdXAiKTsKKyAgICAgICAgICAiU1BMVFNIQVJEIHRpbWVkIG91dCB3YWl0aW5nIGZvciBzdWJzaGFyZCBsZWFkZXJzIHRvIGNvbWUgdXAiKTsKICAgICAgIAogICAgICAgbG9nLmluZm8oIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFsbCBzdWItc2hhcmRzIGZvciBjb2xsZWN0aW9uICIKICAgICAgICAgICArIGNvbGxlY3Rpb25OYW1lICsgIiBwYXJlbnQgc2hhcmQ6ICIgKyBzbGljZSArICIgb246ICIgKyBwYXJlbnRTaGFyZExlYWRlcik7CkBAIC01MDYsMTIgKzUxNiwxMyBAQAogCiAgICAgICAgICAgc2VuZFNoYXJkUmVxdWVzdChzdWJTaGFyZE5vZGVOYW1lLCBwYXJhbXMpOwogCisgICAgICAgICAgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IHdhaXRGb3JDb3JlTm9kZU5hbWUoY29sbGVjdGlvbiwgemtTdGF0ZVJlYWRlci5nZXRaa0NsaWVudCgpLmdldEJhc2VVcmxGb3JOb2RlTmFtZShzdWJTaGFyZE5vZGVOYW1lKSwgc2hhcmROYW1lKTsKICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgcmVwbGljYXMgdG8gYmUgc2VlbiBhcyBhY3RpdmUgb24gc3ViIHNoYXJkIGxlYWRlcgogICAgICAgICAgIGxvZy5pbmZvKCJBc2tpbmcgc3ViIHNoYXJkIGxlYWRlciB0byB3YWl0IGZvcjogIiArIHNoYXJkTmFtZSArICIgdG8gYmUgYWxpdmUgb246ICIgKyBzdWJTaGFyZE5vZGVOYW1lKTsKICAgICAgICAgICBDb3JlQWRtaW5SZXF1ZXN0LldhaXRGb3JTdGF0ZSBjbWQgPSBuZXcgQ29yZUFkbWluUmVxdWVzdC5XYWl0Rm9yU3RhdGUoKTsKICAgICAgICAgICBjbWQuc2V0Q29yZU5hbWUoc3ViU2hhcmROYW1lcy5nZXQoaS0xKSk7CiAgICAgICAgICAgY21kLnNldE5vZGVOYW1lKHN1YlNoYXJkTm9kZU5hbWUpOwotICAgICAgICAgIGNtZC5zZXRDb3JlTm9kZU5hbWUoc3ViU2hhcmROb2RlTmFtZSArICJfIiArIHNoYXJkTmFtZSk7CisgICAgICAgICAgY21kLnNldENvcmVOb2RlTmFtZShjb3JlTm9kZU5hbWUpOwogICAgICAgICAgIGNtZC5zZXRTdGF0ZShaa1N0YXRlUmVhZGVyLkFDVElWRSk7CiAgICAgICAgICAgY21kLnNldENoZWNrTGl2ZSh0cnVlKTsKICAgICAgICAgICBjbWQuc2V0T25seUlmTGVhZGVyKHRydWUpOwpAQCAtNTQ1LDYgKzU1NiwzNSBAQAogICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgbnVsbCwgZSk7CiAgICAgfQogICB9CisgIAorICBwcml2YXRlIFN0cmluZyB3YWl0Rm9yQ29yZU5vZGVOYW1lKERvY0NvbGxlY3Rpb24gY29sbGVjdGlvbiwgU3RyaW5nIG1zZ0Jhc2VVcmwsIFN0cmluZyBtc2dDb3JlKSB7CisgICAgaW50IHJldHJ5Q291bnQgPSAzMjA7CisgICAgd2hpbGUgKHJldHJ5Q291bnQtLSA+IDApIHsKKyAgICAgIE1hcDxTdHJpbmcsU2xpY2U+IHNsaWNlc01hcCA9IHprU3RhdGVSZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkKKyAgICAgICAgICAuZ2V0U2xpY2VzTWFwKGNvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgIGlmIChzbGljZXNNYXAgIT0gbnVsbCkgeworICAgICAgICAKKyAgICAgICAgZm9yIChTbGljZSBzbGljZSA6IHNsaWNlc01hcC52YWx1ZXMoKSkgeworICAgICAgICAgIGZvciAoUmVwbGljYSByZXBsaWNhIDogc2xpY2UuZ2V0UmVwbGljYXMoKSkgeworICAgICAgICAgICAgLy8gVE9ETzogZm9yIHJlYWxseSBsYXJnZSBjbHVzdGVycywgd2UgY291bGQgJ2luZGV4JyBvbiB0aGlzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBiYXNlVXJsID0gcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5CQVNFX1VSTF9QUk9QKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3JlID0gcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChiYXNlVXJsLmVxdWFscyhtc2dCYXNlVXJsKSAmJiBjb3JlLmVxdWFscyhtc2dDb3JlKSkgeworICAgICAgICAgICAgICByZXR1cm4gcmVwbGljYS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsICJDb3VsZCBub3QgZmluZCBjb3JlTm9kZU5hbWUiKTsKKyAgfQogCiAgIHByaXZhdGUgdm9pZCBjb2xsZWN0U2hhcmRSZXNwb25zZXMoTmFtZWRMaXN0IHJlc3VsdHMsIGJvb2xlYW4gYWJvcnRPbkVycm9yLCBTdHJpbmcgbXNnT25FcnJvcikgewogICAgIFNoYXJkUmVzcG9uc2Ugc3JzcDsKQEAgLTU1Miw4ICs1OTIsMTMgQEAKICAgICAgIHNyc3AgPSBzaGFyZEhhbmRsZXIudGFrZUNvbXBsZXRlZE9yRXJyb3IoKTsKICAgICAgIGlmIChzcnNwICE9IG51bGwpIHsKICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3VsdHMsIHNyc3ApOwotICAgICAgICBpZiAoYWJvcnRPbkVycm9yICYmIHNyc3AuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBtc2dPbkVycm9yLCBzcnNwLmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IHNyc3AuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChhYm9ydE9uRXJyb3IgJiYgZXhjZXB0aW9uICE9IG51bGwpICB7CisgICAgICAgICAgLy8gZHJhaW4gcGVuZGluZyByZXF1ZXN0cworICAgICAgICAgIHdoaWxlIChzcnNwICE9IG51bGwpICB7CisgICAgICAgICAgICBzcnNwID0gc2hhcmRIYW5kbGVyLnRha2VDb21wbGV0ZWRPckVycm9yKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsIG1zZ09uRXJyb3IsIGV4Y2VwdGlvbik7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IHdoaWxlIChzcnNwICE9IG51bGwpOwpAQCAtNzc5LDcgKzgyNCw3IEBACiAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBTdHJpbmcgc3RyID0gbWVzc2FnZS5nZXRTdHIoa2V5KTsKICAgICB0cnkgewotICAgICAgcmV0dXJuIHN0ciA9PSBudWxsID8gZGVmIDogSW50ZWdlci5wYXJzZUludChzdHIpOworICAgICAgcmV0dXJuIHN0ciA9PSBudWxsID8gZGVmIDogSW50ZWdlci52YWx1ZU9mKHN0cik7CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csICJDb3VsZCBub3QgcGFyc2UgIiArIGtleSwgZXgpOwogICAgICAgdGhyb3cgZXg7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1JlY292ZXJ5U3RyYXRlZ3kuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvUmVjb3ZlcnlTdHJhdGVneS5qYXZhCmluZGV4IGMxMGJkNWUuLjdhMGRjN2MgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvUmVjb3ZlcnlTdHJhdGVneS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvUmVjb3ZlcnlTdHJhdGVneS5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgemtDb250cm9sbGVyID0gY2MuZ2V0WmtDb250cm9sbGVyKCk7CiAgICAgemtTdGF0ZVJlYWRlciA9IHprQ29udHJvbGxlci5nZXRaa1N0YXRlUmVhZGVyKCk7CiAgICAgYmFzZVVybCA9IHprQ29udHJvbGxlci5nZXRCYXNlVXJsKCk7Ci0gICAgY29yZVprTm9kZU5hbWUgPSB6a0NvbnRyb2xsZXIuZ2V0Q29yZU5vZGVOYW1lKGNkKTsKKyAgICBjb3JlWmtOb2RlTmFtZSA9IGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvcmVOb2RlTmFtZSgpOwogICB9CiAKICAgcHVibGljIHZvaWQgc2V0UmVjb3ZlcmluZ0FmdGVyU3RhcnR1cChib29sZWFuIHJlY292ZXJpbmdBZnRlclN0YXJ0dXApIHsKQEAgLTExOCw0NCArMTE4LDQwIEBACiAgICAgfQogICB9CiAgIAotICBwcml2YXRlIHZvaWQgcmVwbGljYXRlKFN0cmluZyBub2RlTmFtZSwgU29sckNvcmUgY29yZSwgWmtOb2RlUHJvcHMgbGVhZGVycHJvcHMsIFN0cmluZyBiYXNlVXJsKQorICBwcml2YXRlIHZvaWQgcmVwbGljYXRlKFN0cmluZyBub2RlTmFtZSwgU29sckNvcmUgY29yZSwgWmtOb2RlUHJvcHMgbGVhZGVycHJvcHMpCiAgICAgICB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgCi0gICAgU3RyaW5nIGxlYWRlckJhc2VVcmwgPSBsZWFkZXJwcm9wcy5nZXRTdHIoWmtTdGF0ZVJlYWRlci5CQVNFX1VSTF9QUk9QKTsKKwogICAgIFprQ29yZU5vZGVQcm9wcyBsZWFkZXJDTm9kZVByb3BzID0gbmV3IFprQ29yZU5vZGVQcm9wcyhsZWFkZXJwcm9wcyk7CiAgICAgU3RyaW5nIGxlYWRlclVybCA9IGxlYWRlckNOb2RlUHJvcHMuZ2V0Q29yZVVybCgpOwogICAgIAogICAgIGxvZy5pbmZvKCJBdHRlbXB0aW5nIHRvIHJlcGxpY2F0ZSBmcm9tICIgKyBsZWFkZXJVcmwgKyAiLiBjb3JlPSIgKyBjb3JlTmFtZSk7CiAgICAgCi0gICAgLy8gaWYgd2UgYXJlIHRoZSBsZWFkZXIsIGVpdGhlciB3ZSBhcmUgdHJ5aW5nIHRvIHJlY292ZXIgZmFzdGVyCi0gICAgLy8gdGhlbiBvdXIgZXBoZW1lcmFsIHRpbWVkIG91dCBvciB3ZSBhcmUgdGhlIG9ubHkgbm9kZQotICAgIGlmICghbGVhZGVyQmFzZVVybC5lcXVhbHMoYmFzZVVybCkpIHsKLSAgICAgIAotICAgICAgLy8gc2VuZCBjb21taXQKLSAgICAgIGNvbW1pdE9uTGVhZGVyKGxlYWRlclVybCk7Ci0gICAgICAKLSAgICAgIC8vIHVzZSByZXAgaGFuZGxlciBkaXJlY3RseSwgc28gd2UgY2FuIGRvIHRoaXMgc3luYyByYXRoZXIgdGhhbiBhc3luYwotICAgICAgU29sclJlcXVlc3RIYW5kbGVyIGhhbmRsZXIgPSBjb3JlLmdldFJlcXVlc3RIYW5kbGVyKFJFUExJQ0FUSU9OX0hBTkRMRVIpOwotICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBMYXp5UmVxdWVzdEhhbmRsZXJXcmFwcGVyKSB7Ci0gICAgICAgIGhhbmRsZXIgPSAoKExhenlSZXF1ZXN0SGFuZGxlcldyYXBwZXIpaGFuZGxlcikuZ2V0V3JhcHBlZEhhbmRsZXIoKTsKLSAgICAgIH0KLSAgICAgIFJlcGxpY2F0aW9uSGFuZGxlciByZXBsaWNhdGlvbkhhbmRsZXIgPSAoUmVwbGljYXRpb25IYW5kbGVyKSBoYW5kbGVyOwotICAgICAgCi0gICAgICBpZiAocmVwbGljYXRpb25IYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAiU2tpcHBpbmcgcmVjb3ZlcnksIG5vICIgKyBSRVBMSUNBVElPTl9IQU5ETEVSICsgIiBoYW5kbGVyIGZvdW5kIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHNvbHJQYXJhbXMgPSBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoKTsKLSAgICAgIHNvbHJQYXJhbXMuc2V0KFJlcGxpY2F0aW9uSGFuZGxlci5NQVNURVJfVVJMLCBsZWFkZXJVcmwpOwotICAgICAgCi0gICAgICBpZiAoaXNDbG9zZWQoKSkgcmV0cmllcyA9IElOVEVSUlVQVEVEOwotICAgICAgYm9vbGVhbiBzdWNjZXNzID0gcmVwbGljYXRpb25IYW5kbGVyLmRvRmV0Y2goc29sclBhcmFtcywgZmFsc2UpOworICAgIC8vIHNlbmQgY29tbWl0CisgICAgY29tbWl0T25MZWFkZXIobGVhZGVyVXJsKTsKKyAgICAKKyAgICAvLyB1c2UgcmVwIGhhbmRsZXIgZGlyZWN0bHksIHNvIHdlIGNhbiBkbyB0aGlzIHN5bmMgcmF0aGVyIHRoYW4gYXN5bmMKKyAgICBTb2xyUmVxdWVzdEhhbmRsZXIgaGFuZGxlciA9IGNvcmUuZ2V0UmVxdWVzdEhhbmRsZXIoUkVQTElDQVRJT05fSEFORExFUik7CisgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBMYXp5UmVxdWVzdEhhbmRsZXJXcmFwcGVyKSB7CisgICAgICBoYW5kbGVyID0gKChMYXp5UmVxdWVzdEhhbmRsZXJXcmFwcGVyKSBoYW5kbGVyKS5nZXRXcmFwcGVkSGFuZGxlcigpOworICAgIH0KKyAgICBSZXBsaWNhdGlvbkhhbmRsZXIgcmVwbGljYXRpb25IYW5kbGVyID0gKFJlcGxpY2F0aW9uSGFuZGxlcikgaGFuZGxlcjsKKyAgICAKKyAgICBpZiAocmVwbGljYXRpb25IYW5kbGVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICJTa2lwcGluZyByZWNvdmVyeSwgbm8gIiArIFJFUExJQ0FUSU9OX0hBTkRMRVIgKyAiIGhhbmRsZXIgZm91bmQiKTsKKyAgICB9CisgICAgCisgICAgTW9kaWZpYWJsZVNvbHJQYXJhbXMgc29sclBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOworICAgIHNvbHJQYXJhbXMuc2V0KFJlcGxpY2F0aW9uSGFuZGxlci5NQVNURVJfVVJMLCBsZWFkZXJVcmwpOworICAgIAorICAgIGlmIChpc0Nsb3NlZCgpKSByZXRyaWVzID0gSU5URVJSVVBURUQ7CisgICAgYm9vbGVhbiBzdWNjZXNzID0gcmVwbGljYXRpb25IYW5kbGVyLmRvRmV0Y2goc29sclBhcmFtcywgZmFsc2UpOworICAgIAorICAgIGlmICghc3VjY2VzcykgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwKKyAgICAgICAgICAiUmVwbGljYXRpb24gZm9yIHJlY292ZXJ5IGZhaWxlZC4iKTsKKyAgICB9CiAKLSAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLCAiUmVwbGljYXRpb24gZm9yIHJlY292ZXJ5IGZhaWxlZC4iKTsKLSAgICAgIH0KLSAgICAgIAogICAgICAgLy8gc29scmNsb3VkX2RlYnVnCiAvLyAgICAgIHRyeSB7CiAvLyAgICAgICAgUmVmQ291bnRlZDxTb2xySW5kZXhTZWFyY2hlcj4gc2VhcmNoSG9sZGVyID0gY29yZS5nZXROZXdlc3RTZWFyY2hlcihmYWxzZSk7CkBAIC0xNjksNyArMTY1LDcgQEAKIC8vICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIC8vICAgICAgICAKIC8vICAgICAgfQotICAgIH0KKyAgICAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBjb21taXRPbkxlYWRlcihTdHJpbmcgbGVhZGVyVXJsKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMzI5LDEwICszMjUsMTAgQEAKICAgICAgICAgU3RyaW5nIG91clVybCA9IFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKGJhc2VVcmwsIGNvcmVOYW1lKTsKIAogICAgICAgICBib29sZWFuIGlzTGVhZGVyID0gbGVhZGVyVXJsLmVxdWFscyhvdXJVcmwpOwotICAgICAgICBpZiAoaXNMZWFkZXIgJiYgIWNsb3VkRGVzYy5pc0xlYWRlcikgeworICAgICAgICBpZiAoaXNMZWFkZXIgJiYgIWNsb3VkRGVzYy5pc0xlYWRlcigpKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIkNsb3VkIHN0YXRlIHN0aWxsIHNheXMgd2UgYXJlIGxlYWRlci4iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoY2xvdWREZXNjLmlzTGVhZGVyKSB7CisgICAgICAgIGlmIChjbG91ZERlc2MuaXNMZWFkZXIoKSkgewogICAgICAgICAgIC8vIHdlIGFyZSBub3cgdGhlIGxlYWRlciAtIG5vIG9uZSBlbHNlIG11c3QgaGF2ZSBiZWVuIHN1aXRhYmxlCiAgICAgICAgICAgbG9nLndhcm4oIldlIGhhdmUgbm90IHlldCByZWNvdmVyZWQgLSBidXQgd2UgYXJlIG5vdyB0aGUgbGVhZGVyISBjb3JlPSIgKyBjb3JlTmFtZSk7CiAgICAgICAgICAgbG9nLmluZm8oIkZpbmlzaGVkIHJlY292ZXJ5IHByb2Nlc3MuIGNvcmU9IiArIGNvcmVOYW1lKTsKQEAgLTQwNiw4ICs0MDIsNyBAQAogICAgICAgICAKICAgICAgICAgdHJ5IHsKIAotICAgICAgICAgIHJlcGxpY2F0ZSh6a0NvbnRyb2xsZXIuZ2V0Tm9kZU5hbWUoKSwgY29yZSwKLSAgICAgICAgICAgICAgbGVhZGVycHJvcHMsIGxlYWRlclVybCk7CisgICAgICAgICAgcmVwbGljYXRlKHprQ29udHJvbGxlci5nZXROb2RlTmFtZSgpLCBjb3JlLCBsZWFkZXJwcm9wcyk7CiAKICAgICAgICAgICByZXBsYXkodWxvZyk7CiAgICAgICAgICAgcmVwbGF5ZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9TeW5jU3RyYXRlZ3kuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvU3luY1N0cmF0ZWd5LmphdmEKaW5kZXggMWEwNjNiNC4uMTJkMzczOCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9TeW5jU3RyYXRlZ3kuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1N5bmNTdHJhdGVneS5qYXZhCkBAIC02Miw4ICs2Miw4IEBACiAKICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzQ2xvc2VkOwogICAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSHR0cENsaWVudCBjbGllbnQ7Ci0gIHN0YXRpYyB7CisgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgIHsKICAgICBNb2RpZmlhYmxlU29sclBhcmFtcyBwYXJhbXMgPSBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoKTsKICAgICBwYXJhbXMuc2V0KEh0dHBDbGllbnRVdGlsLlBST1BfTUFYX0NPTk5FQ1RJT05TLCAxMDAwMCk7CiAgICAgcGFyYW1zLnNldChIdHRwQ2xpZW50VXRpbC5QUk9QX01BWF9DT05ORUNUSU9OU19QRVJfSE9TVCwgMjApOwpAQCAtODcsNiArODcsMTAgQEAKICAgICBpZiAoU0tJUF9BVVRPX1JFQ09WRVJZKSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgaWYgKGlzQ2xvc2VkKSB7CisgICAgICBsb2cud2FybigiQ2xvc2VkLCBza2lwcGluZyBzeW5jIHVwLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBsb2cuaW5mbygiU3luYyByZXBsaWNhcyB0byAiICsgWmtDb3JlTm9kZVByb3BzLmdldENvcmVVcmwobGVhZGVyUHJvcHMpKTsKICAgICAvLyBUT0RPOiBsb29rIGF0IG91ciBzdGF0ZSB1c2FnZSBvZiBzeW5jCiAgICAgLy8gemtDb250cm9sbGVyLnB1Ymxpc2goY29yZSwgWmtTdGF0ZVJlYWRlci5TWU5DKTsKQEAgLTExMiwyMCArMTE2LDYgQEAKICAgICAgIGxvZy5pbmZvKCJXZSBoYXZlIGJlZW4gY2xvc2VkLCB3b24ndCBzeW5jIHdpdGggcmVwbGljYXMiKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLy8gaWYgbm8gb25lIHRoYXQgaXMgdXAgaXMgYWN0aXZlLCB3ZSBhcmUgd2lsbGluZyB0byB3YWl0Li4uCi0gICAgLy8gd2UgZG9uJ3Qgd2FudCBhIHJlY292ZXJpbmcgbm9kZSB0byBiZWNvbWUgbGVhZGVyIGFuZCB0aGVuCi0gICAgLy8gYSBiZXR0ZXIgY2FuZGlkYXRlIHBvcHMgdXAgYSBzZWNvbmQgbGF0ZXIuCi0vLyAgICBpbnQgdHJpZXMgPSAyMDsKLS8vICAgIHdoaWxlICghYXJlQW55UmVwbGljYXNBY3RpdmUoemtDb250cm9sbGVyLCBjb2xsZWN0aW9uLCBzaGFyZElkKSkgewotLy8gICAgICBpZiAodHJpZXMtLSA9PSAwKSB7Ci0vLyAgICAgICAgYnJlYWs7Ci0vLyAgICAgIH0KLS8vICAgICAgdHJ5IHsKLS8vICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLS8vICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0vLyAgICAgIH0KLS8vICAgIH0KICAgICAKICAgICAvLyBmaXJzdCBzeW5jIG91cnNlbHZlcyAtIHdlIGFyZSB0aGUgcG90ZW50aWFsIGxlYWRlciBhZnRlciBhbGwKICAgICB0cnkgewpAQCAtMTQ2LDcgKzEzNiw3IEBACiAgICAgICAgIHN5bmNUb01lKHprQ29udHJvbGxlciwgY29sbGVjdGlvbiwgc2hhcmRJZCwgbGVhZGVyUHJvcHMsIGNvcmUuZ2V0Q29yZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIAogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbG9nLmluZm8oIkxlYWRlcidzIGF0dGVtcHQgdG8gc3luYyB3aXRoIHNoYXJkIGZhaWxlZCwgbW92aW5nIHRvIHRoZSBuZXh0IGNhbmlkYXRlIik7CisgICAgICAgIGxvZy5pbmZvKCJMZWFkZXIncyBhdHRlbXB0IHRvIHN5bmMgd2l0aCBzaGFyZCBmYWlsZWQsIG1vdmluZyB0byB0aGUgbmV4dCBjYW5kaWRhdGUiKTsKICAgICAgICAgLy8gbGV0cyBzZWUgd2hvIHNlZW1zIGFoZWFkLi4uCiAgICAgICB9CiAgICAgICAKQEAgLTE2MCw4ICsxNTAsNyBAQAogICBwcml2YXRlIGJvb2xlYW4gc3luY1dpdGhSZXBsaWNhcyhaa0NvbnRyb2xsZXIgemtDb250cm9sbGVyLCBTb2xyQ29yZSBjb3JlLAogICAgICAgWmtOb2RlUHJvcHMgcHJvcHMsIFN0cmluZyBjb2xsZWN0aW9uLCBTdHJpbmcgc2hhcmRJZCkgewogICAgIExpc3Q8WmtDb3JlTm9kZVByb3BzPiBub2RlcyA9IHprQ29udHJvbGxlci5nZXRaa1N0YXRlUmVhZGVyKCkKLSAgICAgICAgLmdldFJlcGxpY2FQcm9wcyhjb2xsZWN0aW9uLCBzaGFyZElkLAotICAgICAgICAgICAgemtDb250cm9sbGVyLmdldENvcmVOb2RlTmFtZShjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkpLAorICAgICAgICAuZ2V0UmVwbGljYVByb3BzKGNvbGxlY3Rpb24sIHNoYXJkSWQsY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvcmVOb2RlTmFtZSgpLAogICAgICAgICAgICAgcHJvcHMuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1ApKTsKICAgICAKICAgICBpZiAobm9kZXMgPT0gbnVsbCkgewpAQCAtMTg5LDcgKzE3OCw3IEBACiAgICAgTGlzdDxaa0NvcmVOb2RlUHJvcHM+IG5vZGVzID0gemtDb250cm9sbGVyCiAgICAgICAgIC5nZXRaa1N0YXRlUmVhZGVyKCkKICAgICAgICAgLmdldFJlcGxpY2FQcm9wcyhjb2xsZWN0aW9uLCBzaGFyZElkLAotICAgICAgICAgICAgemtDb250cm9sbGVyLmdldENvcmVOb2RlTmFtZShjZCksCisgICAgICAgICAgICBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKSwKICAgICAgICAgICAgIGxlYWRlclByb3BzLmdldFN0cihaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QKSk7CiAgICAgaWYgKG5vZGVzID09IG51bGwpIHsKICAgICAgIGxvZy5pbmZvKFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKGxlYWRlclByb3BzKSArICIgaGFzIG5vIHJlcGxpY2FzIik7CkBAIC0yNzMsNiArMjYyLDExIEBACiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgIHRoaXMuaXNDbG9zZWQgPSB0cnVlOwogICAgIHRyeSB7CisgICAgICBjbGllbnQuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zaHV0ZG93bigpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csIGUpOworICAgIH0KKyAgICB0cnkgewogICAgICAgRXhlY3V0b3JVdGlsLnNodXRkb3duTm93QW5kQXdhaXRUZXJtaW5hdGlvbihyZWNvdmVyeUNtZEV4ZWN1dG9yKTsKICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCBlKTsKQEAgLTI4MCw3ICsyNzQsNiBAQAogICB9CiAgIAogICBwcml2YXRlIHZvaWQgcmVxdWVzdFJlY292ZXJ5KGZpbmFsIFprTm9kZVByb3BzIGxlYWRlclByb3BzLCBmaW5hbCBTdHJpbmcgYmFzZVVybCwgZmluYWwgU3RyaW5nIGNvcmVOYW1lKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIC8vIFRPRE86IGRvIHRoaXMgaW4gYmFja2dyb3VuZCB0aHJlYWRzCiAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICB7CiAgICAgICAgIHNldERhZW1vbih0cnVlKTsKQEAgLTI5MSw3ICsyODQsNyBAQAogICAgICAgICByZWNvdmVyUmVxdWVzdENtZC5zZXRBY3Rpb24oQ29yZUFkbWluQWN0aW9uLlJFUVVFU1RSRUNPVkVSWSk7CiAgICAgICAgIHJlY292ZXJSZXF1ZXN0Q21kLnNldENvcmVOYW1lKGNvcmVOYW1lKTsKICAgICAgICAgCi0gICAgICAgIEh0dHBTb2xyU2VydmVyIHNlcnZlciA9IG5ldyBIdHRwU29sclNlcnZlcihiYXNlVXJsKTsKKyAgICAgICAgSHR0cFNvbHJTZXJ2ZXIgc2VydmVyID0gbmV3IEh0dHBTb2xyU2VydmVyKGJhc2VVcmwsIGNsaWVudCk7CiAgICAgICAgIHNlcnZlci5zZXRDb25uZWN0aW9uVGltZW91dCg0NTAwMCk7CiAgICAgICAgIHNlcnZlci5zZXRTb1RpbWVvdXQoNDUwMDApOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NMSS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NMSS5qYXZhCmluZGV4IGY4ZTE3MWUuLmRhZDJkODMgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvWmtDTEkuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1prQ0xJLmphdmEKQEAgLTEsMTQgKzEsNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xvdWQ7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKQEAgLTE3LDE4ICs4LDIzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLk9uUmVjb25uZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU29sclprQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db25maWdTb2xyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvbmZpZ1NvbHJYbWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29uZmlnU29sclhtbE9sZDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyUmVzb3VyY2VMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS56b29rZWVwZXIuQ3JlYXRlTW9kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5LZWVwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS56b29rZWVwZXIuWm9vRGVmczsKK2ltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5kYXRhLkFDTDsKIGltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNDksNiArNDUsNyBAQAogcHVibGljIGNsYXNzIFprQ0xJIHsKICAgCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUtFUEFUSCA9ICJtYWtlcGF0aCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVVQgPSAicHV0IjsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05DT05GSUcgPSAiZG93bmNvbmZpZyI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaS19DTElfTkFNRSA9ICJaa0NMSSI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQID0gImhlbHAiOwpAQCAtOTIsNyArODksNyBAQAogICAgICAgICAuaGFzQXJnKHRydWUpCiAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oCiAgICAgICAgICAgICAiY21kIHRvIHJ1bjogIiArIEJPT1RTVFJBUCArICIsICIgKyBVUENPTkZJRyArICIsICIgKyBET1dOQ09ORklHCi0gICAgICAgICAgICAgICAgKyAiLCAiICsgTElOS0NPTkZJRyArICIsICIgKyBNQUtFUEFUSCArICIsICIrIExJU1QgKyAiLCAiICtDTEVBUikuY3JlYXRlKENNRCkpOworICAgICAgICAgICAgICAgICsgIiwgIiArIExJTktDT05GSUcgKyAiLCAiICsgTUFLRVBBVEggKyAiLCAiKyBQVVQgKyAiLCAiKyBMSVNUICsgIiwgIiArIENMRUFSKS5jcmVhdGUoQ01EKSk7CiAKICAgICBPcHRpb24gemtIb3N0T3B0aW9uID0gbmV3IE9wdGlvbigieiIsIFpLSE9TVCwgdHJ1ZSwKICAgICAgICAgIlpvb0tlZXBlciBob3N0IGFkZHJlc3MiKTsKQEAgLTEzNCw3ICsxMzEsOCBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInprY2xpLnNoIC16a2hvc3QgbG9jYWxob3N0Ojk5ODMgLWNtZCAiICsgVVBDT05GSUcgKyAiIC0iICsgQ09ORkRJUiArICIgL29wdC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYiICsgIiAtIiArIENPTkZOQU1FICsgIiBteWNvbmYiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6a2NsaS5zaCAtemtob3N0IGxvY2FsaG9zdDo5OTgzIC1jbWQgIiArIERPV05DT05GSUcgKyAiIC0iICsgQ09ORkRJUiArICIgL29wdC9zb2xyL2NvbGxlY3Rpb24xL2NvbmYiICsgIiAtIiArIENPTkZOQU1FICsgIiBteWNvbmYiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6a2NsaS5zaCAtemtob3N0IGxvY2FsaG9zdDo5OTgzIC1jbWQgIiArIExJTktDT05GSUcgKyAiIC0iICsgQ09MTEVDVElPTiArICIgY29sbGVjdGlvbjEiICsgIiAtIiArIENPTkZOQU1FICsgIiBteWNvbmYiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6a2NsaS5zaCAtemtob3N0IGxvY2FsaG9zdDo5OTgzIC1jbWQgIiArIE1BS0VQQVRIICsgIiAvYXBhY2hlL3NvbHIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6a2NsaS5zaCAtemtob3N0IGxvY2FsaG9zdDo5OTgzIC1jbWQgIiArIE1BS0VQQVRIICsgIiAvYXBhY2hlL3NvbHIvZGF0YS50eHQgJ2NvbmZpZyBkYXRhJyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInprY2xpLnNoIC16a2hvc3QgbG9jYWxob3N0Ojk5ODMgLWNtZCAiICsgUFVUICsgIiAvc29sci5jb25mICdjb25mIGRhdGEnIik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiemtjbGkuc2ggLXpraG9zdCBsb2NhbGhvc3Q6OTk4MyAtY21kICIgKyBDTEVBUiArICIgL3NvbHIiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6a2NsaS5zaCAtemtob3N0IGxvY2FsaG9zdDo5OTgzIC1jbWQgIiArIExJU1QpOwogICAgICAgICByZXR1cm47CkBAIC0xNzgsMjUgKzE3Niw3IEBACiAgICAgICAgICAgU29sclJlc291cmNlTG9hZGVyIGxvYWRlciA9IG5ldyBTb2xyUmVzb3VyY2VMb2FkZXIoc29sckhvbWUpOwogICAgICAgICAgIHNvbHJIb21lID0gbG9hZGVyLmdldEluc3RhbmNlRGlyKCk7CiAKLSAgICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShzb2xySG9tZSwgU09MUl9YTUwpOwotICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKLQotICAgICAgICAgIENvbmZpZ1NvbHIgY2ZnOwotCi0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKGxvYWRlciwgbnVsbCwgbmV3IElucHV0U291cmNlKGlzKSwgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIG9sZFN0eWxlID0gKGNvbmZpZy5nZXROb2RlKCJzb2xyL2NvcmVzIiwgZmFsc2UpICE9IG51bGwpOwotCi0gICAgICAgICAgICAgaWYgKG9sZFN0eWxlKSB7Ci0gICAgICAgICAgICAgICBjZmcgPSBuZXcgQ29uZmlnU29sclhtbE9sZChjb25maWcsIG51bGwpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBjZmcgPSBuZXcgQ29uZmlnU29sclhtbChjb25maWcsIG51bGwpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoaXMpOwotICAgICAgICAgIH0KLQorICAgICAgICAgIENvbmZpZ1NvbHIgY2ZnID0gQ29uZmlnU29sci5mcm9tU29sckhvbWUoc29sckhvbWUpOwogCiAgICAgICAgICAgaWYoIVprQ29udHJvbGxlci5jaGVja0Nocm9vdFBhdGgoemtTZXJ2ZXJBZGRyZXNzLCB0cnVlKSkgewogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBIGNocm9vdCB3YXMgc3BlY2lmaWVkIGluIHprSG9zdCBidXQgdGhlIHpub2RlIGRvZXNuJ3QgZXhpc3QuICIpOwpAQCAtMjU2LDYgKzIzNiwxNSBAQAogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgICAgfQogICAgICAgICAgIHprQ2xpZW50Lm1ha2VQYXRoKGFyZ2xpc3QuZ2V0KDApLnRvU3RyaW5nKCksIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKGxpbmUuZ2V0T3B0aW9uVmFsdWUoQ01EKS5lcXVhbHMoUFVUKSkgeworICAgICAgICAgIExpc3Q8QUNMPiBhY2wgPSBab29EZWZzLklkcy5PUEVOX0FDTF9VTlNBRkU7CisgICAgICAgICAgTGlzdCBhcmdsaXN0ID0gbGluZS5nZXRBcmdMaXN0KCk7CisgICAgICAgICAgaWYgKGFyZ2xpc3Quc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLSIgKyBQVVQgKyAiIHJlcXVpcmVzIHR3byBhcmdzIC0gdGhlIHBhdGggdG8gY3JlYXRlIGFuZCB0aGUgZGF0YSBzdHJpbmciKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgIH0KKyAgICAgICAgICB6a0NsaWVudC5jcmVhdGUoYXJnbGlzdC5nZXQoMCkudG9TdHJpbmcoKSwgYXJnbGlzdC5nZXQoMSkudG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGLTgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNsLCBDcmVhdGVNb2RlLlBFUlNJU1RFTlQsIHRydWUpOwogICAgICAgICB9CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBpZiAoc29sclBvcnQgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NvbnRyb2xsZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvWmtDb250cm9sbGVyLmphdmEKaW5kZXggZThjN2JjYS4uYjA0NmU3ZCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NvbnRyb2xsZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1prQ29udHJvbGxlci5qYXZhCkBAIC0xNywyOCArMTcsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouaW1wbC5IdHRwU29sclNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlcXVlc3QuQ29yZUFkbWluUmVxdWVzdC5XYWl0Rm9yU3RhdGU7CkBAIC03NCw2ICs1MiwyOCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCiAvKioKICAqIEhhbmRsZSBab29LZWVwZXIgaW50ZXJhY3Rpb25zLgogICogCkBAIC0xMzIsNiArMTMyLDggQEAKICAgcHJvdGVjdGVkIHZvbGF0aWxlIE92ZXJzZWVyIG92ZXJzZWVyOwogCiAgIHByaXZhdGUgU3RyaW5nIGxlYWRlclZvdGVXYWl0OworICAKKyAgcHJpdmF0ZSBib29sZWFuIGdlbmVyaWNDb3JlTm9kZU5hbWVzOwogCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQ7CiAKQEAgLTE0MCwxMSArMTQyLDExIEBACiAgIHByaXZhdGUgVXBkYXRlU2hhcmRIYW5kbGVyIHVwZGF0ZVNoYXJkSGFuZGxlcjsKIAogICBwdWJsaWMgWmtDb250cm9sbGVyKGZpbmFsIENvcmVDb250YWluZXIgY2MsIFN0cmluZyB6a1NlcnZlckFkZHJlc3MsIGludCB6a0NsaWVudFRpbWVvdXQsIGludCB6a0NsaWVudENvbm5lY3RUaW1lb3V0LCBTdHJpbmcgbG9jYWxIb3N0LCBTdHJpbmcgbG9jYUhvc3RQb3J0LAotICAgICAgU3RyaW5nIGxvY2FsSG9zdENvbnRleHQsIFN0cmluZyBsZWFkZXJWb3RlV2FpdCwgaW50IGRpc3RyaWJVcGRhdGVDb25uVGltZW91dCwgaW50IGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQsIGZpbmFsIEN1cnJlbnRDb3JlRGVzY3JpcHRvclByb3ZpZGVyIHJlZ2lzdGVyT25SZWNvbm5lY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgIFN0cmluZyBsb2NhbEhvc3RDb250ZXh0LCBTdHJpbmcgbGVhZGVyVm90ZVdhaXQsIGJvb2xlYW4gZ2VuZXJpY0NvcmVOb2RlTmFtZXMsIGludCBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQsIGludCBkaXN0cmliVXBkYXRlU29UaW1lb3V0LCBmaW5hbCBDdXJyZW50Q29yZURlc2NyaXB0b3JQcm92aWRlciByZWdpc3Rlck9uUmVjb25uZWN0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sCiAgICAgICBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKGNjID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvcmVDb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7CiAgICAgdGhpcy5jYyA9IGNjOwotCisgICAgdGhpcy5nZW5lcmljQ29yZU5vZGVOYW1lcyA9IGdlbmVyaWNDb3JlTm9kZU5hbWVzOwogICAgIC8vIGJlIGZvcmdpdmluZyBhbmQgc3RyaXAgdGhpcyBvZmYgbGVhZGluZy90cmFpbGluZyBzbGFzaGVzCiAgICAgLy8gdGhpcyBhbGxvd3MgdXMgdG8gc3VwcG9ydCB1c2VycyBzcGVjaWZ5aW5nIGhvc3RDb250ZXh0PSIvIiBpbiAKICAgICAvLyBzb2xyLnhtbCB0byBpbmRpY2F0ZSB0aGUgcm9vdCBjb250ZXh0LCBpbnN0ZWFkIG9mIGhvc3RDb250ZXh0PSIiIApAQCAtMjU0LDkgKzI1Niw5IEBACiAgICAgICAvLyBiZWZvcmUgcmVnaXN0ZXJpbmcgYXMgbGl2ZSwgbWFrZSBzdXJlIGV2ZXJ5b25lIGlzIGluIGEKICAgICAgIC8vIGRvd24gc3RhdGUKICAgICAgIGZvciAoQ29yZURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb3JlWmtOb2RlTmFtZSA9IGdldENvcmVOb2RlTmFtZShkZXNjcmlwdG9yKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvcmVaa05vZGVOYW1lID0gZGVzY3JpcHRvci5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBkZXNjcmlwdG9yLmdldENsb3VkRGVzY3JpcHRvcigpLmlzTGVhZGVyID0gZmFsc2U7CisgICAgICAgICAgZGVzY3JpcHRvci5nZXRDbG91ZERlc2NyaXB0b3IoKS5zZXRMZWFkZXIoZmFsc2UpOwogICAgICAgICAgIHB1Ymxpc2goZGVzY3JpcHRvciwgWmtTdGF0ZVJlYWRlci5ET1dOLCB1cGRhdGVMYXN0UHVibGlzaGVkKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKQEAgLTMyMyw3ICszMjUsNyBAQAogICAgICAgICAuZ2V0Q3VycmVudERlc2NyaXB0b3JzKCk7CiAgICAgaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKICAgICAgIGZvciAoQ29yZURlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7Ci0gICAgICAgIGRlc2NyaXB0b3IuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuaXNMZWFkZXIgPSBmYWxzZTsKKyAgICAgICAgZGVzY3JpcHRvci5nZXRDbG91ZERlc2NyaXB0b3IoKS5zZXRMZWFkZXIoZmFsc2UpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNTQ0LDcgKzU0Niw2IEBACiAgICAgICAgICAgaWYgKHJlcGxpY2EuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0Tm9kZU5hbWUoKSkKICAgICAgICAgICAgICAgJiYgIShyZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApCiAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFprU3RhdGVSZWFkZXIuRE9XTikpKSB7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5TSEFSRF9JRF9QUk9QKSAhPSBudWxsOwogICAgICAgICAgICAgWmtOb2RlUHJvcHMgbSA9IG5ldyBaa05vZGVQcm9wcyhPdmVyc2Vlci5RVUVVRV9PUEVSQVRJT04sICJzdGF0ZSIsCiAgICAgICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5TVEFURV9QUk9QLCBaa1N0YXRlUmVhZGVyLkRPV04sCiAgICAgICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5CQVNFX1VSTF9QUk9QLCBnZXRCYXNlVXJsKCksCkBAIC01NTUsOCArNTU2LDcgQEAKICAgICAgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLk5PREVfTkFNRV9QUk9QLCBnZXROb2RlTmFtZSgpLAogICAgICAgICAgICAgICAgIFprU3RhdGVSZWFkZXIuU0hBUkRfSURfUFJPUCwKICAgICAgICAgICAgICAgICByZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLlNIQVJEX0lEX1BST1ApLAotICAgICAgICAgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLAotICAgICAgICAgICAgICAgIHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QKSwKKyAgICAgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05fUFJPUCwgY29sbGVjdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05PREVfTkFNRV9QUk9QLCByZXBsaWNhLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB1cGRhdGVkTm9kZXMuYWRkKHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1ApKTsKICAgICAgICAgICAgIG92ZXJzZWVySm9iUXVldWUub2ZmZXIoWmtTdGF0ZVJlYWRlci50b0pTT04obSkpOwpAQCAtNzM1LDcgKzczNSw4IEBACiAgICAgZmluYWwgQ2xvdWREZXNjcmlwdG9yIGNsb3VkRGVzYyA9IGRlc2MuZ2V0Q2xvdWREZXNjcmlwdG9yKCk7CiAgICAgZmluYWwgU3RyaW5nIGNvbGxlY3Rpb24gPSBjbG91ZERlc2MuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKIAotICAgIGZpbmFsIFN0cmluZyBjb3JlWmtOb2RlTmFtZSA9IGdldENvcmVOb2RlTmFtZShkZXNjKTsKKyAgICBmaW5hbCBTdHJpbmcgY29yZVprTm9kZU5hbWUgPSBkZXNjLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvcmVOb2RlTmFtZSgpOworICAgIGFzc2VydCBjb3JlWmtOb2RlTmFtZSAhPSBudWxsIDogIndlIHNob3VsZCBoYXZlIGEgY29yZU5vZGVOYW1lIGJ5IG5vdyI7CiAgICAgCiAgICAgU3RyaW5nIHNoYXJkSWQgPSBjbG91ZERlc2MuZ2V0U2hhcmRJZCgpOwogCkBAIC05MjMsMTYgKzkyNCwxNiBAQAogICAgIHByb3BzLnB1dChaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QLCBjZC5nZXROYW1lKCkpOwogICAgIHByb3BzLnB1dChaa1N0YXRlUmVhZGVyLk5PREVfTkFNRV9QUk9QLCBnZXROb2RlTmFtZSgpKTsKICAgICAKLSAgICBmaW5hbCBTdHJpbmcgY29yZVprTm9kZU5hbWUgPSBnZXRDb3JlTm9kZU5hbWUoY2QpOworICAgIGZpbmFsIFN0cmluZyBjb3JlTm9kZU5hbWUgPSBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKTsKICAgICBaa05vZGVQcm9wcyBvdXJQcm9wcyA9IG5ldyBaa05vZGVQcm9wcyhwcm9wcyk7CiAgICAgU3RyaW5nIGNvbGxlY3Rpb24gPSBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKQogICAgICAgICAuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKICAgICAKICAgICBFbGVjdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBTaGFyZExlYWRlckVsZWN0aW9uQ29udGV4dChsZWFkZXJFbGVjdG9yLCBzaGFyZElkLAotICAgICAgICBjb2xsZWN0aW9uLCBjb3JlWmtOb2RlTmFtZSwgb3VyUHJvcHMsIHRoaXMsIGNjKTsKKyAgICAgICAgY29sbGVjdGlvbiwgY29yZU5vZGVOYW1lLCBvdXJQcm9wcywgdGhpcywgY2MpOwogCiAgICAgbGVhZGVyRWxlY3Rvci5zZXR1cChjb250ZXh0KTsKLSAgICBlbGVjdGlvbkNvbnRleHRzLnB1dChjb3JlWmtOb2RlTmFtZSwgY29udGV4dCk7CisgICAgZWxlY3Rpb25Db250ZXh0cy5wdXQoY29yZU5vZGVOYW1lLCBjb250ZXh0KTsKICAgICBsZWFkZXJFbGVjdG9yLmpvaW5FbGVjdGlvbihjb250ZXh0LCBmYWxzZSk7CiAgIH0KIApAQCAtMTAxNyw3ICsxMDE4LDcgQEAKIAogICAgIGZpbmFsIENsb3VkRGVzY3JpcHRvciBjbG91ZERlc2MgPSBkZXNjLmdldENsb3VkRGVzY3JpcHRvcigpOwogICAgIAotICAgIGZpbmFsIFN0cmluZyBzaGFyZElkID0gc3RhdGUuZ2V0U2hhcmRJZChjb3JlTm9kZU5hbWUpOworICAgIGZpbmFsIFN0cmluZyBzaGFyZElkID0gc3RhdGUuZ2V0U2hhcmRJZChnZXRCYXNlVXJsKCksIGRlc2MuZ2V0TmFtZSgpKTsKIAogICAgIGlmIChzaGFyZElkICE9IG51bGwpIHsKICAgICAgIGNsb3VkRGVzYy5zZXRTaGFyZElkKHNoYXJkSWQpOwpAQCAtMTAyOCwxNiArMTAyOSwyMSBAQAogCiAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoU3RyaW5nIGNvcmVOYW1lLCBDb3JlRGVzY3JpcHRvciBjZCkKICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgS2VlcGVyRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTdHJpbmcgemtOb2RlTmFtZSA9IGdldENvcmVOb2RlTmFtZShjZCk7Ci0gICAgRWxlY3Rpb25Db250ZXh0IGNvbnRleHQgPSBlbGVjdGlvbkNvbnRleHRzLnJlbW92ZSh6a05vZGVOYW1lKTsKKyAgICBmaW5hbCBTdHJpbmcgY29yZU5vZGVOYW1lID0gY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0Q29yZU5vZGVOYW1lKCk7CisgICAgRWxlY3Rpb25Db250ZXh0IGNvbnRleHQgPSBlbGVjdGlvbkNvbnRleHRzLnJlbW92ZShjb3JlTm9kZU5hbWUpOworICAgIAorICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGwgOiBjb3JlTm9kZU5hbWU7CisgICAgCiAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICAgY29udGV4dC5jYW5jZWxFbGVjdGlvbigpOwogICAgIH0KKyAgICBDbG91ZERlc2NyaXB0b3IgY2xvdWREZXNjcmlwdG9yID0gY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCk7CiAgICAgCiAgICAgWmtOb2RlUHJvcHMgbSA9IG5ldyBaa05vZGVQcm9wcyhPdmVyc2Vlci5RVUVVRV9PUEVSQVRJT04sCi0gICAgICAgICJkZWxldGVjb3JlIiwgWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCwgY29yZU5hbWUsCisgICAgICAgIE92ZXJzZWVyLkRFTEVURUNPUkUsIFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1AsIGNvcmVOYW1lLAogICAgICAgICBaa1N0YXRlUmVhZGVyLk5PREVfTkFNRV9QUk9QLCBnZXROb2RlTmFtZSgpLAotICAgICAgICBaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05fUFJPUCwgY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7CisgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLCBjbG91ZERlc2NyaXB0b3IuZ2V0Q29sbGVjdGlvbk5hbWUoKSwKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05PREVfTkFNRV9QUk9QLCBjb3JlTm9kZU5hbWUpOwogICAgIG92ZXJzZWVySm9iUXVldWUub2ZmZXIoWmtTdGF0ZVJlYWRlci50b0pTT04obSkpOwogICB9CiAgIApAQCAtMTIwNiwxMyArMTIxMiw2MCBAQAogICAgIHJldHVybiB6a1N0YXRlUmVhZGVyOwogICB9CiAKLSAgcHJpdmF0ZSBTdHJpbmcgZG9HZXRTaGFyZElkUHJvY2VzcyhTdHJpbmcgY29yZU5hbWUsIENvcmVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICBmaW5hbCBTdHJpbmcgY29yZU5vZGVOYW1lID0gZ2V0Q29yZU5vZGVOYW1lKGRlc2NyaXB0b3IpOworICBwcml2YXRlIHZvaWQgZG9HZXRTaGFyZElkQW5kTm9kZU5hbWVQcm9jZXNzKENvcmVEZXNjcmlwdG9yIGNkKSB7CisgICAgZmluYWwgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvcmVOb2RlTmFtZSgpOworCisgICAgaWYgKGNvcmVOb2RlTmFtZSAhPSBudWxsKSB7CisgICAgICB3YWl0Rm9yU2hhcmRJZChjZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGlmIG5vIGV4cGxpY2l0IGNvcmVOb2RlTmFtZSwgd2Ugd2FudCB0byBtYXRjaCBieSBiYXNlIHVybCBhbmQgY29yZSBuYW1lCisgICAgICB3YWl0Rm9yQ29yZU5vZGVOYW1lKGNkKTsKKyAgICAgIHdhaXRGb3JTaGFyZElkKGNkKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd2FpdEZvckNvcmVOb2RlTmFtZShDb3JlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgaW50IHJldHJ5Q291bnQgPSAzMjA7CisgICAgbG9nLmluZm8oImxvb2sgZm9yIG91ciBjb3JlIG5vZGUgbmFtZSIpOworICAgIHdoaWxlIChyZXRyeUNvdW50LS0gPiAwKSB7CisgICAgICBNYXA8U3RyaW5nLFNsaWNlPiBzbGljZXNNYXAgPSB6a1N0YXRlUmVhZGVyLmdldENsdXN0ZXJTdGF0ZSgpCisgICAgICAgICAgLmdldFNsaWNlc01hcChkZXNjcmlwdG9yLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvbGxlY3Rpb25OYW1lKCkpOworICAgICAgaWYgKHNsaWNlc01hcCAhPSBudWxsKSB7CisgICAgICAgIAorICAgICAgICBmb3IgKFNsaWNlIHNsaWNlIDogc2xpY2VzTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgZm9yIChSZXBsaWNhIHJlcGxpY2EgOiBzbGljZS5nZXRSZXBsaWNhcygpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBmb3IgcmVhbGx5IGxhcmdlIGNsdXN0ZXJzLCB3ZSBjb3VsZCAnaW5kZXgnIG9uIHRoaXMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmwgPSByZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLkJBU0VfVVJMX1BST1ApOworICAgICAgICAgICAgU3RyaW5nIGNvcmUgPSByZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIG1zZ0Jhc2VVcmwgPSBnZXRCYXNlVXJsKCk7CisgICAgICAgICAgICBTdHJpbmcgbXNnQ29yZSA9IGRlc2NyaXB0b3IuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAoYmFzZVVybC5lcXVhbHMobXNnQmFzZVVybCkgJiYgY29yZS5lcXVhbHMobXNnQ29yZSkpIHsKKyAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXRDbG91ZERlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAgICAgLnNldENvcmVOb2RlTmFtZShyZXBsaWNhLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd2FpdEZvclNoYXJkSWQoQ29yZURlc2NyaXB0b3IgY2QpIHsKKyAgICBsb2cuaW5mbygid2FpdGluZyB0byBmaW5kIHNoYXJkIGlkIGluIGNsdXN0ZXJzdGF0ZSBmb3IgIiArIGNkLmdldE5hbWUoKSk7CiAgICAgaW50IHJldHJ5Q291bnQgPSAzMjA7CiAgICAgd2hpbGUgKHJldHJ5Q291bnQtLSA+IDApIHsKLSAgICAgIGZpbmFsIFN0cmluZyBzaGFyZElkID0gemtTdGF0ZVJlYWRlci5nZXRDbHVzdGVyU3RhdGUoKS5nZXRTaGFyZElkKGNvcmVOb2RlTmFtZSk7CisgICAgICBmaW5hbCBTdHJpbmcgc2hhcmRJZCA9IHprU3RhdGVSZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0U2hhcmRJZChnZXRCYXNlVXJsKCksIGNkLmdldE5hbWUoKSk7CiAgICAgICBpZiAoc2hhcmRJZCAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBzaGFyZElkOworICAgICAgICBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5zZXRTaGFyZElkKHNoYXJkSWQpOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICB0cnkgewogICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CkBAIC0xMjIyLDcgKzEyNzUsNyBAQAogICAgIH0KICAgICAKICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLAotICAgICAgICAiQ291bGQgbm90IGdldCBzaGFyZF9pZCBmb3IgY29yZTogIiArIGNvcmVOYW1lICsgIiBjb3JlTm9kZU5hbWU6IiArIGNvcmVOb2RlTmFtZSk7CisgICAgICAgICJDb3VsZCBub3QgZ2V0IHNoYXJkIGlkIGZvciBjb3JlOiAiICsgY2QuZ2V0TmFtZSgpKTsKICAgfQogICAKICAgcHVibGljIHN0YXRpYyB2b2lkIHVwbG9hZFRvWksoU29sclprQ2xpZW50IHprQ2xpZW50LCBGaWxlIGRpciwgU3RyaW5nIHprUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBLZWVwZXJFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKQEAgLTEyNjEsNyArMTMxNCw3IEBACiAgIAogICBwdWJsaWMgU3RyaW5nIGdldENvcmVOb2RlTmFtZShDb3JlRGVzY3JpcHRvciBkZXNjcmlwdG9yKXsKICAgICBTdHJpbmcgY29yZU5vZGVOYW1lID0gZGVzY3JpcHRvci5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKTsKLSAgICBpZiAoY29yZU5vZGVOYW1lID09IG51bGwpIHsKKyAgICBpZiAoY29yZU5vZGVOYW1lID09IG51bGwgJiYgIWdlbmVyaWNDb3JlTm9kZU5hbWVzKSB7CiAgICAgICAvLyBpdCdzIHRoZSBkZWZhdWx0CiAgICAgICByZXR1cm4gZ2V0Tm9kZU5hbWUoKSArICJfIiArIGRlc2NyaXB0b3IuZ2V0TmFtZSgpOwogICAgIH0KQEAgLTEyNzcsMzEgKzEzMzAsMzMgQEAKICAgICBkb3dubG9hZEZyb21aSyh6a0NsaWVudCwgWmtDb250cm9sbGVyLkNPTkZJR1NfWktOT0RFICsgIi8iICsgY29uZmlnTmFtZSwgZGlyKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHByZVJlZ2lzdGVyKENvcmVEZXNjcmlwdG9yIGNkKSB0aHJvd3MgS2VlcGVyRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLQotICAgIC8vIGJlZm9yZSBiZWNvbWluZyBhdmFpbGFibGUsIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGxpdmUgYW5kIGFjdGl2ZQotICAgIC8vIHRoaXMgYWxzbyBnZXRzIHVzIG91ciBhc3NpZ25lZCBzaGFyZCBpZCBpZiBpdCB3YXMgbm90IHNwZWNpZmllZAotICAgIHB1Ymxpc2goY2QsIFprU3RhdGVSZWFkZXIuRE9XTiwgZmFsc2UpOwotICAgIC8vIHNoYXJkU3RhdGUgYW5kIHNoYXJkUmFuZ2UgYXJlIGZvciBvbmUtdGltZSB1c2Ugb25seSwgdGhlcmVhZnRlciB0aGUgYWN0dWFsIHZhbHVlcyBpbiB0aGUgU2xpY2Ugc2hvdWxkIGJlIHVzZWQKLSAgICBpZiAoU2xpY2UuQ09OU1RSVUNUSU9OLmVxdWFscyhjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRTaGFyZFN0YXRlKCkpKSB7Ci0gICAgICBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5zZXRTaGFyZFN0YXRlKG51bGwpOwotICAgICAgY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuc2V0U2hhcmRSYW5nZShudWxsKTsKLSAgICB9Ci0gICAgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IGdldENvcmVOb2RlTmFtZShjZCk7CisgIHB1YmxpYyB2b2lkIHByZVJlZ2lzdGVyKENvcmVEZXNjcmlwdG9yIGNkICkgewogICAgIAorICAgIFN0cmluZyBjb3JlTm9kZU5hbWUgPSBnZXRDb3JlTm9kZU5hbWUoY2QpOworCiAgICAgLy8gbWFrZSBzdXJlIHRoZSBub2RlIG5hbWUgaXMgc2V0IG9uIHRoZSBkZXNjcmlwdG9yCiAgICAgaWYgKGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvcmVOb2RlTmFtZSgpID09IG51bGwpIHsKICAgICAgIGNkLmdldENsb3VkRGVzY3JpcHRvcigpLnNldENvcmVOb2RlTmFtZShjb3JlTm9kZU5hbWUpOwogICAgIH0KKworICAgIC8vIGJlZm9yZSBiZWNvbWluZyBhdmFpbGFibGUsIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGxpdmUgYW5kIGFjdGl2ZQorICAgIC8vIHRoaXMgYWxzbyBnZXRzIHVzIG91ciBhc3NpZ25lZCBzaGFyZCBpZCBpZiBpdCB3YXMgbm90IHNwZWNpZmllZAorICAgIHRyeSB7CisgICAgICBwdWJsaXNoKGNkLCBaa1N0YXRlUmVhZGVyLkRPV04sIGZhbHNlKTsKKyAgICB9IGNhdGNoIChLZWVwZXJFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCIiLCBlKTsKKyAgICAgIHRocm93IG5ldyBab29LZWVwZXJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLCAiIiwgZSk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgIGxvZy5lcnJvcigiIiwgZSk7CisgICAgICB0aHJvdyBuZXcgWm9vS2VlcGVyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIiIsIGUpOworICAgIH0KICAgICAKICAgICBpZiAoY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0U2hhcmRJZCgpID09IG51bGwgJiYgbmVlZHNUb0JlQXNzaWduZWRTaGFyZElkKGNkLCB6a1N0YXRlUmVhZGVyLmdldENsdXN0ZXJTdGF0ZSgpLCBjb3JlTm9kZU5hbWUpKSB7Ci0gICAgICBTdHJpbmcgc2hhcmRJZDsKLSAgICAgIHNoYXJkSWQgPSBkb0dldFNoYXJkSWRQcm9jZXNzKGNkLmdldE5hbWUoKSwgY2QpOwotICAgICAgY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuc2V0U2hhcmRJZChzaGFyZElkKTsKKyAgICAgIGRvR2V0U2hhcmRJZEFuZE5vZGVOYW1lUHJvY2VzcyhjZCk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIHN0aWxsIHdhaXQgdGlsbCB3ZSBzZWUgdXMgaW4gbG9jYWwgc3RhdGUKLSAgICAgIGRvR2V0U2hhcmRJZFByb2Nlc3MoY2QuZ2V0TmFtZSgpLCBjZCk7CisgICAgICBkb0dldFNoYXJkSWRBbmROb2RlTmFtZVByb2Nlc3MoY2QpOwogICAgIH0KIAogICB9CkBAIC0xMzM2LDcgKzEzOTEsNyBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgU3RyaW5nIGxlYWRlckJhc2VVcmwgPSBsZWFkZXJQcm9wcy5nZXRCYXNlVXJsKCk7CiAgICAgU3RyaW5nIGxlYWRlckNvcmVOYW1lID0gbGVhZGVyUHJvcHMuZ2V0Q29yZU5hbWUoKTsKICAgICAKQEAgLTE0OTgsMTEgKzE1NTMsMTEgQEAKICAgfQogICAKICAgLyoqCi0gICAqIHV0aWxpdGl5IG1ldGhvZCBmcm8gdHJpbW1pbmcgYW5kIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSAKKyAgICogVXRpbGl0eSBtZXRob2QgZm9yIHRyaW1taW5nIGFuZCBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBzbGFzaGVzIGZyb20gCiAgICAqIGl0J3MgaW5wdXQuICBNYXkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuICBNYXkgcmV0dXJuIG51bGwgaWYgYW5kIG9ubHkgCiAgICAqIGlmIHRoZSBpbnB1dCBpcyBudWxsLgogICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyaW1MZWFkaW5nQW5kVHJhaWxpbmdTbGFzaGVzKGZpbmFsIFN0cmluZyBpbikgeworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltTGVhZGluZ0FuZFRyYWlsaW5nU2xhc2hlcyhmaW5hbCBTdHJpbmcgaW4pIHsKICAgICBpZiAobnVsbCA9PSBpbikgcmV0dXJuIGluOwogICAgIAogICAgIFN0cmluZyBvdXQgPSBpbjsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9DYWNoaW5nRGlyZWN0b3J5RmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NhY2hpbmdEaXJlY3RvcnlGYWN0b3J5LmphdmEKaW5kZXggNTk0ZDhmOS4uNjBjNDEzMSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NhY2hpbmdEaXJlY3RvcnlGYWN0b3J5LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NhY2hpbmdEaXJlY3RvcnlGYWN0b3J5LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5BbHJlYWR5Q2xvc2VkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5JT0NvbnRleHQuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5OUlRDYWNoaW5nRGlyZWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLk5hdGl2ZUZTTG9ja0ZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTm9Mb2NrRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5SYXRlTGltaXRlZERpcmVjdG9yeVdyYXBwZXI7CkBAIC00MCw2ICs0MSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLk5hbWVkTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuYmxvY2tjYWNoZS5CbG9ja0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmcy5IZGZzRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zdG9yZS5oZGZzLkhkZnNMb2NrRmFjdG9yeTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00OTgsNiArNTAyLDI0IEBACiAgICAgfSBlbHNlIGlmICgic2luZ2xlIi5lcXVhbHMobG9ja1R5cGUpKSB7CiAgICAgICBpZiAoIShkaXIuZ2V0TG9ja0ZhY3RvcnkoKSBpbnN0YW5jZW9mIFNpbmdsZUluc3RhbmNlTG9ja0ZhY3RvcnkpKSBkaXIKICAgICAgICAgICAuc2V0TG9ja0ZhY3RvcnkobmV3IFNpbmdsZUluc3RhbmNlTG9ja0ZhY3RvcnkoKSk7CisgICAgfSBlbHNlIGlmICgiaGRmcyIuZXF1YWxzKGxvY2tUeXBlKSkgeworICAgICAgRGlyZWN0b3J5IGRlbCA9IGRpcjsKKyAgICAgIAorICAgICAgaWYgKGRpciBpbnN0YW5jZW9mIE5SVENhY2hpbmdEaXJlY3RvcnkpIHsKKyAgICAgICAgZGVsID0gKChOUlRDYWNoaW5nRGlyZWN0b3J5KSBkZWwpLmdldERlbGVnYXRlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChkZWwgaW5zdGFuY2VvZiBCbG9ja0RpcmVjdG9yeSkgeworICAgICAgICBkZWwgPSAoKEJsb2NrRGlyZWN0b3J5KSBkZWwpLmdldERpcmVjdG9yeSgpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoIShkZWwgaW5zdGFuY2VvZiBIZGZzRGlyZWN0b3J5KSkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuRk9SQklEREVOLCAiRGlyZWN0b3J5OiAiCisgICAgICAgICAgICArIGRlbC5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgKyAiLCBidXQgaGRmcyBsb2NrIGZhY3RvcnkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEhkZnNEaXJlY3RvcnkiKTsKKyAgICAgIH0KKworICAgICAgZGlyLnNldExvY2tGYWN0b3J5KG5ldyBIZGZzTG9ja0ZhY3RvcnkoKChIZGZzRGlyZWN0b3J5KWRlbCkuZ2V0SGRmc0RpclBhdGgoKSwgKChIZGZzRGlyZWN0b3J5KWRlbCkuZ2V0Q29uZmlndXJhdGlvbigpKSk7CiAgICAgfSBlbHNlIGlmICgibm9uZSIuZXF1YWxzKGxvY2tUeXBlKSkgewogICAgICAgLy8gUmVjaXBlIGZvciBkaXNhc3RlcgogICAgICAgbG9nLmVycm9yKCJDT05GSUdVUkFUSU9OIFdBUk5JTkc6IGxvY2tzIGFyZSBkaXNhYmxlZCBvbiAiICsgZGlyKTsKQEAgLTUxOSw3ICs1NDEsNyBAQAogICAgIHJldHVybiBwYXRoOwogICB9CiAgIAotICBwcml2YXRlIFN0cmluZyBzdHJpcFRyYWlsaW5nU2xhc2goU3RyaW5nIHBhdGgpIHsKKyAgcHJvdGVjdGVkIFN0cmluZyBzdHJpcFRyYWlsaW5nU2xhc2goU3RyaW5nIHBhdGgpIHsKICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWcuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWcuamF2YQppbmRleCA0MWZhM2MyLi5hZjE2YjY2IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29uZmlnLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvbmZpZy5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiAgIHN0YXRpYyBmaW5hbCBYUGF0aEZhY3RvcnkgeHBhdGhGYWN0b3J5ID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAKICAgcHJpdmF0ZSBmaW5hbCBEb2N1bWVudCBkb2M7CisgIHByaXZhdGUgZmluYWwgRG9jdW1lbnQgb3JpZ0RvYzsgLy8gd2l0aCB1bnN1YnN0aXR1dGVkIHByb3BlcnRpZXMKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJlZml4OwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogICBwcml2YXRlIGZpbmFsIFNvbHJSZXNvdXJjZUxvYWRlciBsb2FkZXI7CkBAIC0xMzEsNiArMTMyLDcgQEAKICAgICAgIGRiLnNldEVycm9ySGFuZGxlcih4bWxsb2cpOwogICAgICAgdHJ5IHsKICAgICAgICAgZG9jID0gZGIucGFyc2UoaXMpOworICAgICAgICBvcmlnRG9jID0gY29weURvYyhkb2MpOwogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgLy8gc29tZSBYTUwgcGFyc2VycyBhcmUgYnJva2VuIGFuZCBkb24ndCBjbG9zZSB0aGUgYnl0ZSBzdHJlYW0gKGJ1dCB0aGV5IHNob3VsZCBhY2NvcmRpbmcgdG8gc3BlYykKICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoaXMuZ2V0Qnl0ZVN0cmVhbSgpKTsKQEAgLTE0MCwxOSArMTQyLDI0IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSAgewogICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCAiRXhjZXB0aW9uIGR1cmluZyBwYXJzaW5nIGZpbGU6ICIgKyBuYW1lLCBlKTsKLSAgICAgIHRocm93IGU7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1IsIGUpOwogICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSAgewogICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCAiRXhjZXB0aW9uIGR1cmluZyBwYXJzaW5nIGZpbGU6ICIgKyBuYW1lLCBlKTsKLSAgICAgIHRocm93IGU7Ci0gICAgfSBjYXRjaCggU29sckV4Y2VwdGlvbiBlICl7Ci0gICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csIkVycm9yIGluICIrbmFtZSxlKTsKLSAgICAgIHRocm93IGU7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1IsIGUpOworICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIFNvbHJFeGNlcHRpb24ubG9nKGxvZywgIkV4Y2VwdGlvbiBkdXJpbmcgcGFyc2luZyBmaWxlOiAiICsgbmFtZSwgZSk7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1IsIGUpOwogICAgIH0KICAgfQogICAKICAgcHVibGljIENvbmZpZyhTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyLCBTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jKSB7CiAgICAgdGhpcy5wcmVmaXggPSBudWxsOwogICAgIHRoaXMuZG9jID0gZG9jOworICAgIHRyeSB7CisgICAgICB0aGlzLm9yaWdEb2MgPSBjb3B5RG9jKGRvYyk7CisgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBlKTsKKyAgICB9CiAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKICAgfQpAQCAtNDQxLDQgKzQ0OCw5IEBACiAgICAgCiAgICAgcmV0dXJuIHZlcnNpb247CiAgIH0KKworICBwdWJsaWMgQ29uZmlnIGdldE9yaWdpbmFsQ29uZmlnKCkgeworICAgIHJldHVybiBuZXcgQ29uZmlnKGxvYWRlciwgbnVsbCwgb3JpZ0RvYyk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvbmZpZ1NvbHIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWdTb2xyLmphdmEKaW5kZXggNjNkYTBlZi4uZWRlYTcyMiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvbmZpZ1NvbHIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29uZmlnU29sci5qYXZhCkBAIC0xNywxNSArMTcsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5ET01VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLlByb3BlcnRpZXNVdGlsOwpAQCAtMzMsMTMgKzI2LDc3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbmZpZ1NvbHIgewogICBwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25maWdTb2xyLmNsYXNzKTsKICAgCiAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNPTFJfWE1MX0ZJTEUgPSAic29sci54bWwiOwotICAKKworICBwdWJsaWMgc3RhdGljIENvbmZpZ1NvbHIgZnJvbUZpbGUoRmlsZSBjb25maWdGaWxlKSB7CisgICAgbG9nLmluZm8oIkxvYWRpbmcgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gZnJvbSB7fSIsIGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgU3RyaW5nIHNvbHJIb21lID0gY29uZmlnRmlsZS5nZXRQYXJlbnQoKTsKKyAgICBTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyID0gbmV3IFNvbHJSZXNvdXJjZUxvYWRlcihzb2xySG9tZSk7CisgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGlmICghY29uZmlnRmlsZS5leGlzdHMoKSkgeworICAgICAgICBsb2cuaW5mbygie30gZG9lcyBub3QgZXhpc3QsIHVzaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbiIsIGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDb25maWdTb2xyWG1sT2xkLkRFRl9TT0xSX1hNTC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmcm9tSW5wdXRTdHJlYW0obG9hZGVyLCBpbnB1dFN0cmVhbSk7CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLAorICAgICAgICAgICJDb3VsZCBub3QgbG9hZCBTT0xSIGNvbmZpZ3VyYXRpb24iLCBlKTsKKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpbnB1dFN0cmVhbSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBDb25maWdTb2xyIGZyb21TdHJpbmcoU29sclJlc291cmNlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHhtbCkgeworICAgIHJldHVybiBmcm9tSW5wdXRTdHJlYW0obG9hZGVyLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBDb25maWdTb2xyIGZyb21JbnB1dFN0cmVhbShTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyLCBJbnB1dFN0cmVhbSBpcykgeworICAgIHRyeSB7CisgICAgICBDb25maWcgY29uZmlnID0gbmV3IENvbmZpZyhsb2FkZXIsIG51bGwsIG5ldyBJbnB1dFNvdXJjZShpcyksIG51bGwsIGZhbHNlKTsKKyAgICAgIC8vY29uZmlnLnN1YnN0aXR1dGVQcm9wZXJ0aWVzKCk7CisgICAgICByZXR1cm4gZnJvbUNvbmZpZyhjb25maWcpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBDb25maWdTb2xyIGZyb21Tb2xySG9tZShTdHJpbmcgc29sckhvbWUpIHsKKyAgICByZXR1cm4gZnJvbUZpbGUobmV3IEZpbGUoc29sckhvbWUsIFNPTFJfWE1MX0ZJTEUpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQ29uZmlnU29sciBmcm9tQ29uZmlnKENvbmZpZyBjb25maWcpIHsKKyAgICBib29sZWFuIG9sZFN0eWxlID0gKGNvbmZpZy5nZXROb2RlKCJzb2xyL2NvcmVzIiwgZmFsc2UpICE9IG51bGwpOworICAgIHJldHVybiBvbGRTdHlsZSA/IG5ldyBDb25maWdTb2xyWG1sT2xkKGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgOiBuZXcgQ29uZmlnU29sclhtbChjb25maWcsIG51bGwpOworICB9CisKICAgLy8gVWdseSBmb3Igbm93LCBidXQgd2UnbGwgYXQgbGVhc3QgYmUgYWJsZSB0byBjZW50cmFsaXplIGFsbCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiA0eCBhbmQgNXguCiAgIHB1YmxpYyBzdGF0aWMgZW51bSBDZmdQcm9wIHsKICAgICBTT0xSX0FETUlOSEFORExFUiwKQEAgLTYzLDYgKzEyMCw3IEBACiAgICAgU09MUl9TSEFSREhBTkRMRVJGQUNUT1JZX1NPQ0tFVFRJTUVPVVQsCiAgICAgU09MUl9TSEFSRVNDSEVNQSwKICAgICBTT0xSX1RSQU5TSUVOVENBQ0hFU0laRSwKKyAgICBTT0xSX0dFTkVSSUNDT1JFTk9ERU5BTUVTLAogICAgIFNPTFJfWktDTElFTlRUSU1FT1VULAogICAgIFNPTFJfWktIT1NULAogCkBAIC03OCw2ICsxMzYsMTEgQEAKICAgcHVibGljIENvbmZpZ1NvbHIoQ29uZmlnIGNvbmZpZykgewogICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICB9CisKKyAgLy8gZm9yIGV4dGVuc2lvbiAmIHRlc3RpbmcuCisgIHByb3RlY3RlZCBDb25maWdTb2xyKCkgeworCisgIH0KICAgCiAgIHB1YmxpYyBDb25maWcgZ2V0Q29uZmlnKCkgewogICAgIHJldHVybiBjb25maWc7CkBAIC0xMjQsNyArMTg3LDggQEAKICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewogICAgICAgTm9kZSBwcm9wID0gcHJvcHMuaXRlbShpKTsKLSAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoRE9NVXRpbC5nZXRBdHRyKHByb3AsICJuYW1lIiksIERPTVV0aWwuZ2V0QXR0cihwcm9wLCAidmFsdWUiKSk7CisgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KERPTVV0aWwuZ2V0QXR0cihwcm9wLCAibmFtZSIpLAorICAgICAgICAgIFByb3BlcnRpZXNVdGlsLnN1YnN0aXR1dGVQcm9wZXJ0eShET01VdGlsLmdldEF0dHIocHJvcCwgInZhbHVlIiksIG51bGwpKTsKICAgICB9CiAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWdTb2xyWG1sLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29uZmlnU29sclhtbC5qYXZhCmluZGV4IDBjMjc0YWEuLjgxOTlmNzUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWdTb2xyWG1sLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvbmZpZ1NvbHJYbWwuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuUHJvcGVydGllc1V0aWw7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjcsMTUgKzMzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5Qcm9wZXJ0aWVzVXRpbDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQogCiAvKioKICAqCkBAIC00NiwyMiArNDMsMjUgQEAKICAgcHJpdmF0ZSBTb2xyQ29yZURpc2NvdmVyZXIgc29sckNvcmVEaXNjb3ZlcmVyID0gbmV3IFNvbHJDb3JlRGlzY292ZXJlcigpOwogICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENvcmVEZXNjcmlwdG9yPiBjb3JlRGVzY3JpcHRvck1hcDsKIAotICBwdWJsaWMgQ29uZmlnU29sclhtbChDb25maWcgY29uZmlnLCBDb3JlQ29udGFpbmVyIGNvbnRhaW5lcikKLSAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgcHVibGljIENvbmZpZ1NvbHJYbWwoQ29uZmlnIGNvbmZpZywgQ29yZUNvbnRhaW5lciBjb250YWluZXIpIHsKICAgICBzdXBlcihjb25maWcpOwotICAgIGNoZWNrRm9ySWxsZWdhbENvbmZpZygpOwotICAgIAotICAgIGZpbGxQcm9wTWFwKCk7Ci0gICAgCi0gICAgU3RyaW5nIGNvcmVSb290ID0gZ2V0KENmZ1Byb3AuU09MUl9DT1JFUk9PVERJUkVDVE9SWSwgKGNvbnRhaW5lciA9PSBudWxsID8gY29uZmlnLmdldFJlc291cmNlTG9hZGVyKCkuZ2V0SW5zdGFuY2VEaXIoKSA6IGNvbnRhaW5lci5nZXRTb2xySG9tZSgpKSk7Ci0gICAgY29yZURlc2NyaXB0b3JNYXAgPSBzb2xyQ29yZURpc2NvdmVyZXIuZGlzY292ZXIoY29udGFpbmVyLCBuZXcgRmlsZShjb3JlUm9vdCkpOworICAgIHRyeSB7CisgICAgICBjaGVja0ZvcklsbGVnYWxDb25maWcoKTsKKyAgICAgIGZpbGxQcm9wTWFwKCk7CisgICAgICBjb25maWcuc3Vic3RpdHV0ZVByb3BlcnRpZXMoKTsKKyAgICAgIFN0cmluZyBjb3JlUm9vdCA9IGdldChDZmdQcm9wLlNPTFJfQ09SRVJPT1RESVJFQ1RPUlksIChjb250YWluZXIgPT0gbnVsbCA/IGNvbmZpZy5nZXRSZXNvdXJjZUxvYWRlcigpLmdldEluc3RhbmNlRGlyKCkgOiBjb250YWluZXIuZ2V0U29sckhvbWUoKSkpOworICAgICAgY29yZURlc2NyaXB0b3JNYXAgPSBzb2xyQ29yZURpc2NvdmVyZXIuZGlzY292ZXIoY29udGFpbmVyLCBuZXcgRmlsZShjb3JlUm9vdCkpOworICAgIH0KKyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBlKTsKKyAgICB9CiAgIH0KICAgCiAgIHByaXZhdGUgdm9pZCBjaGVja0ZvcklsbGVnYWxDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIAogICAgIC8vIERvIHNhbml0eSBjaGVja3MgLSB3ZSBkb24ndCB3YW50IHRvIGZpbmQgb2xkIHN0eWxlIGNvbmZpZwogICAgIGZhaWxJZkZvdW5kKCJzb2xyL0Bjb3JlTG9hZFRocmVhZHMiKTsKLSAgICBmYWlsSWZGb3VuZCgic29sci9AcGVyc2lzdCIpOworICAgIGZhaWxJZkZvdW5kKCJzb2xyL0BwZXJzaXN0ZW50Iik7CiAgICAgZmFpbElmRm91bmQoInNvbHIvQHNoYXJlZExpYiIpOwogICAgIGZhaWxJZkZvdW5kKCJzb2xyL0B6a0hvc3QiKTsKICAgICAKQEAgLTc3LDYgKzc3LDcgQEAKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AaG9zdENvbnRleHQiKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AaG9zdFBvcnQiKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AbGVhZGVyVm90ZVdhaXQiKTsKKyAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AZ2VuZXJpY0NvcmVOb2RlTmFtZXMiKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AbWFuYWdlbWVudFBhdGgiKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9Ac2hhcmVTY2hlbWEiKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9jb3Jlcy9AdHJhbnNpZW50Q2FjaGVTaXplIik7CkBAIC0xMTgsNiArMTE5LDcgQEAKICAgICBwcm9wTWFwLnB1dChDZmdQcm9wLlNPTFJfSE9TVENPTlRFWFQsIGRvU3ViKCJzb2xyL3NvbHJjbG91ZC9zdHJbQG5hbWU9J2hvc3RDb250ZXh0J10iKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX0hPU1RQT1JULCBkb1N1Yigic29sci9zb2xyY2xvdWQvaW50W0BuYW1lPSdob3N0UG9ydCddIikpOwogICAgIHByb3BNYXAucHV0KENmZ1Byb3AuU09MUl9MRUFERVJWT1RFV0FJVCwgZG9TdWIoInNvbHIvc29scmNsb3VkL2ludFtAbmFtZT0nbGVhZGVyVm90ZVdhaXQnXSIpKTsKKyAgICBwcm9wTWFwLnB1dChDZmdQcm9wLlNPTFJfR0VORVJJQ0NPUkVOT0RFTkFNRVMsIGRvU3ViKCJzb2xyL3NvbHJjbG91ZC9ib29sW0BuYW1lPSdnZW5lcmljQ29yZU5vZGVOYW1lcyddIikpOwogICAgIHByb3BNYXAucHV0KENmZ1Byb3AuU09MUl9NQU5BR0VNRU5UUEFUSCwgZG9TdWIoInNvbHIvc3RyW0BuYW1lPSdtYW5hZ2VtZW50UGF0aCddIikpOwogICAgIHByb3BNYXAucHV0KENmZ1Byb3AuU09MUl9TSEFSRURMSUIsIGRvU3ViKCJzb2xyL3N0cltAbmFtZT0nc2hhcmVkTGliJ10iKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX1NIQVJFU0NIRU1BLCBkb1N1Yigic29sci9zdHJbQG5hbWU9J3NoYXJlU2NoZW1hJ10iKSk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29uZmlnU29sclhtbE9sZC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvbmZpZ1NvbHJYbWxPbGQuamF2YQppbmRleCA2ZDlhMDhkLi40MGMxYTg3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29uZmlnU29sclhtbE9sZC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db25maWdTb2xyWG1sT2xkLmphdmEKQEAgLTE3LDYgKzE3LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkRPTVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuUHJvcGVydGllc1V0aWw7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yOCwyMCArMzksNiBAQAogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkRPTVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuUHJvcGVydGllc1V0aWw7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KIAogLyoqCiAgKgpAQCAtNTEsMTcgKzQ4LDIwIEBACiAKICAgcHJpdmF0ZSBOb2RlTGlzdCBjb3JlTm9kZXMgPSBudWxsOwogCi0gIHB1YmxpYyBDb25maWdTb2xyWG1sT2xkKENvbmZpZyBjb25maWcsIENvcmVDb250YWluZXIgY29udGFpbmVyKQotICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCisgIHB1YmxpYyBDb25maWdTb2xyWG1sT2xkKENvbmZpZyBjb25maWcpIHsKICAgICBzdXBlcihjb25maWcpOwotICAgIGNoZWNrRm9ySWxsZWdhbENvbmZpZyhjb250YWluZXIpOwotICAgIAotICAgIGZpbGxQcm9wTWFwKCk7Ci0gICAgaW5pdENvcmVMaXN0KGNvbnRhaW5lcik7CisgICAgdHJ5IHsKKyAgICAgIGNoZWNrRm9ySWxsZWdhbENvbmZpZygpOworICAgICAgZmlsbFByb3BNYXAoKTsKKyAgICAgIGNvbmZpZy5zdWJzdGl0dXRlUHJvcGVydGllcygpOworICAgICAgaW5pdENvcmVMaXN0KCk7CisgICAgfQorICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1IsIGUpOworICAgIH0KICAgfQogICAKLSAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9ySWxsZWdhbENvbmZpZyhDb3JlQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9ySWxsZWdhbENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgLy8gRG8gc2FuaXR5IGNoZWNrcyAtIHdlIGRvbid0IHdhbnQgdG8gZmluZCBuZXcgc3R5bGUKICAgICAvLyBjb25maWcKICAgICBmYWlsSWZGb3VuZCgic29sci9zdHJbQG5hbWU9J2FkbWluSGFuZGxlciddIik7CkBAIC03Myw2ICs3Myw3IEBACiAgICAgZmFpbElmRm91bmQoInNvbHIvc29scmNsb3VkL3N0cltAbmFtZT0naG9zdENvbnRleHQnXSIpOwogICAgIGZhaWxJZkZvdW5kKCJzb2xyL3NvbHJjbG91ZC9pbnRbQG5hbWU9J2hvc3RQb3J0J10iKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9zb2xyY2xvdWQvaW50W0BuYW1lPSdsZWFkZXJWb3RlV2FpdCddIik7CisgICAgZmFpbElmRm91bmQoInNvbHIvc29scmNsb3VkL2ludFtAbmFtZT0nZ2VuZXJpY0NvcmVOb2RlTmFtZXMnXSIpOwogICAgIGZhaWxJZkZvdW5kKCJzb2xyL3N0cltAbmFtZT0nbWFuYWdlbWVudFBhdGgnXSIpOwogICAgIGZhaWxJZkZvdW5kKCJzb2xyL3N0cltAbmFtZT0nc2hhcmVkTGliJ10iKTsKICAgICBmYWlsSWZGb3VuZCgic29sci9zdHJbQG5hbWU9J3NoYXJlU2NoZW1hJ10iKTsKQEAgLTEyNSw2ICsxMjYsOCBAQAogICAgICAgICBjb25maWcuZ2V0VmFsKCJzb2xyL2NvcmVzL0Bob3N0UG9ydCIsIGZhbHNlKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX0xFQURFUlZPVEVXQUlULAogICAgICAgICBjb25maWcuZ2V0VmFsKCJzb2xyL2NvcmVzL0BsZWFkZXJWb3RlV2FpdCIsIGZhbHNlKSk7CisgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX0dFTkVSSUNDT1JFTk9ERU5BTUVTLAorICAgICAgICBjb25maWcuZ2V0VmFsKCJzb2xyL2NvcmVzL0BnZW5lcmljQ29yZU5vZGVOYW1lcyIsIGZhbHNlKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX01BTkFHRU1FTlRQQVRILAogICAgICAgICBjb25maWcuZ2V0VmFsKCJzb2xyL2NvcmVzL0BtYW5hZ2VtZW50UGF0aCIsIGZhbHNlKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX1NIQVJFU0NIRU1BLApAQCAtMTM4LDkgKzE0MSw5IEBACiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX1NIQVJESEFORExFUkZBQ1RPUllfTkFNRSwKICAgICAgICAgY29uZmlnLmdldFZhbCgic29sci9zaGFyZEhhbmRsZXJGYWN0b3J5L0BuYW1lIiwgZmFsc2UpKTsKICAgICBwcm9wTWFwLnB1dChDZmdQcm9wLlNPTFJfU0hBUkRIQU5ETEVSRkFDVE9SWV9DT05OVElNRU9VVCwKLSAgICAgICAgY29uZmlnLmdldFZhbCgic29sci9zaGFyZEhhbmRsZXJGYWN0b3J5L2ludFtAY29ublRpbWVvdXRdIiwgZmFsc2UpKTsKKyAgICAgICAgY29uZmlnLmdldFZhbCgic29sci9zaGFyZEhhbmRsZXJGYWN0b3J5L2ludFtAbmFtZT0nY29ublRpbWVvdXQnXSIsIGZhbHNlKSk7CiAgICAgcHJvcE1hcC5wdXQoQ2ZnUHJvcC5TT0xSX1NIQVJESEFORExFUkZBQ1RPUllfU09DS0VUVElNRU9VVCwKLSAgICAgICAgY29uZmlnLmdldFZhbCgic29sci9zaGFyZEhhbmRsZXJGYWN0b3J5L2ludFtAc29ja2V0VGltZW91dF0iLCBmYWxzZSkpOworICAgICAgICBjb25maWcuZ2V0VmFsKCJzb2xyL3NoYXJkSGFuZGxlckZhY3RvcnkvaW50W0BuYW1lPSdzb2NrZXRUaW1lb3V0J10iLCBmYWxzZSkpOwogICAgIAogICAgIC8vIFRoZXNlIGhhdmUgbm8gY291bnRlcnBhcnQgaW4gNS4wLCBhc2tpbmcsIGZvciBhbnkgb2YgdGhlc2UgaW4gU29sciA1LjAKICAgICAvLyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZwpAQCAtMTU0LDcgKzE1Nyw3IEBACiAgICAgCiAgIH0KIAotICBwcml2YXRlIHZvaWQgaW5pdENvcmVMaXN0KENvcmVDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwcml2YXRlIHZvaWQgaW5pdENvcmVMaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAKICAgICBjb3JlTm9kZXMgPSAoTm9kZUxpc3QpIGNvbmZpZy5ldmFsdWF0ZSgic29sci9jb3Jlcy9jb3JlIiwKICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7CkBAIC0yMTksNyArMjIyLDcgQEAKICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWwgPSBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsID0gUHJvcGVydGllc1V0aWwuc3Vic3RpdHV0ZVByb3BlcnR5KGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKSwgbnVsbCk7CiAgICAgICAgICAgICBpZiAoQ29yZURlc2NyaXB0b3IuQ09SRV9EQVRBRElSLmVxdWFscyhhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSkgfHwKICAgICAgICAgICAgICAgICBDb3JlRGVzY3JpcHRvci5DT1JFX0lOU1RESVIuZXF1YWxzKGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpKSkgewogICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJyQnKSA9PSAtMSkgewpAQCAtMjU3LDcgKzI2MCw4IEBACiAgICAgICAgIE5vZGUgbm9kZSA9IGNvcmVOb2Rlcy5pdGVtKGlkeCk7CiAgICAgICAgIGlmIChjb3JlTmFtZS5lcXVhbHMoRE9NVXRpbC5nZXRBdHRyKG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfTkFNRSwKICAgICAgICAgICAgIG51bGwpKSkgewotICAgICAgICAgIHJldHVybiBET01VdGlsLmdldEF0dHIobm9kZSwgcHJvcGVydHksIGRlZmF1bHRWYWwpOworICAgICAgICAgIFN0cmluZyBwcm9wVmFsID0gRE9NVXRpbC5nZXRBdHRyKG5vZGUsIHByb3BlcnR5LCBkZWZhdWx0VmFsKTsKKyAgICAgICAgICByZXR1cm4gUHJvcGVydGllc1V0aWwuc3Vic3RpdHV0ZVByb3BlcnR5KHByb3BWYWwsIG51bGwpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjg2LDE2ICsyOTAsMTYgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9TT0xSX1hNTCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iCi0gICAgICArICI8c29sciBwZXJzaXN0ZW50PVwiZmFsc2VcIj5cbiIKLSAgICAgICsgIiAgPGNvcmVzIGFkbWluUGF0aD1cIi9hZG1pbi9jb3Jlc1wiIGRlZmF1bHRDb3JlTmFtZT1cIiIKLSAgICAgICsgQ29yZUNvbnRhaW5lci5ERUZBVUxUX0RFRkFVTFRfQ09SRV9OQU1FCi0gICAgICArICJcIiIKLSAgICAgICsgIiBob3N0PVwiJHtob3N0On1cIiBob3N0UG9ydD1cIiR7aG9zdFBvcnQ6fVwiIGhvc3RDb250ZXh0PVwiJHtob3N0Q29udGV4dDp9XCIgemtDbGllbnRUaW1lb3V0PVwiJHt6a0NsaWVudFRpbWVvdXQ6MTUwMDB9XCIiCi0gICAgICArICI+XG4iCi0gICAgICArICIgICAgPGNvcmUgbmFtZT1cIiIKLSAgICAgICsgQ29yZUNvbnRhaW5lci5ERUZBVUxUX0RFRkFVTFRfQ09SRV9OQU1FCi0gICAgICArICJcIiBzaGFyZD1cIiR7c2hhcmQ6fVwiIGNvbGxlY3Rpb249XCIke2NvbGxlY3Rpb246fVwiIGluc3RhbmNlRGlyPVwiY29sbGVjdGlvbjFcIiAvPlxuIgotICAgICAgKyAiICA8L2NvcmVzPlxuIiArICI8L3NvbHI+IjsKKyAgICAgICAgKyAiPHNvbHIgcGVyc2lzdGVudD1cImZhbHNlXCI+XG4iCisgICAgICAgICsgIiAgPGNvcmVzIGFkbWluUGF0aD1cIi9hZG1pbi9jb3Jlc1wiIGRlZmF1bHRDb3JlTmFtZT1cIiIKKyAgICAgICAgKyBDb3JlQ29udGFpbmVyLkRFRkFVTFRfREVGQVVMVF9DT1JFX05BTUUKKyAgICAgICAgKyAiXCIiCisgICAgICAgICsgIiBob3N0PVwiJHtob3N0On1cIiBob3N0UG9ydD1cIiR7aG9zdFBvcnQ6fVwiIGhvc3RDb250ZXh0PVwiJHtob3N0Q29udGV4dDp9XCIgemtDbGllbnRUaW1lb3V0PVwiJHt6a0NsaWVudFRpbWVvdXQ6MTUwMDB9XCIiCisgICAgICAgICsgIj5cbiIKKyAgICAgICAgKyAiICAgIDxjb3JlIG5hbWU9XCIiCisgICAgICAgICsgQ29yZUNvbnRhaW5lci5ERUZBVUxUX0RFRkFVTFRfQ09SRV9OQU1FCisgICAgICAgICsgIlwiIHNoYXJkPVwiJHtzaGFyZDp9XCIgY29sbGVjdGlvbj1cIiR7Y29sbGVjdGlvbjp9XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uMVwiIC8+XG4iCisgICAgICAgICsgIiAgPC9jb3Jlcz5cbiIgKyAiPC9zb2xyPiI7CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHN1YnN0aXR1dGVQcm9wZXJ0aWVzKCkgewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvcmVDb250YWluZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db3JlQ29udGFpbmVyLmphdmEKaW5kZXggMWE5NmQyMS4uNmMyZmM1NSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0NvcmVDb250YWluZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29yZUNvbnRhaW5lci5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuWmtDb250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5aa1NvbHJSZXNvdXJjZUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CkBAIC0zOSwyMSArMzgsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5LZWVwZXJFeGNlcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwogCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CiBpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTc2LDYgKzY0LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKwogCiAvKioKICAqCkBAIC0xMDQsMTYgKzk0LDE2IEBACiAKICAgcHJvdGVjdGVkIENvcmVBZG1pbkhhbmRsZXIgY29yZUFkbWluSGFuZGxlciA9IG51bGw7CiAgIHByb3RlY3RlZCBDb2xsZWN0aW9uc0hhbmRsZXIgY29sbGVjdGlvbnNIYW5kbGVyID0gbnVsbDsKLSAgcHJvdGVjdGVkIEZpbGUgY29uZmlnRmlsZSA9IG51bGw7CiAgIHByb3RlY3RlZCBTdHJpbmcgbGliRGlyID0gbnVsbDsKLSAgcHJvdGVjdGVkIFNvbHJSZXNvdXJjZUxvYWRlciBsb2FkZXIgPSBudWxsOworCiAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGNvbnRhaW5lclByb3BlcnRpZXM7CiAgIHByb3RlY3RlZCBNYXA8U3RyaW5nICxJbmRleFNjaGVtYT4gaW5kZXhTY2hlbWFDYWNoZTsKICAgcHJvdGVjdGVkIFN0cmluZyBhZG1pbkhhbmRsZXI7CiAgIHByb3RlY3RlZCBib29sZWFuIHNoYXJlU2NoZW1hOwogICBwcm90ZWN0ZWQgSW50ZWdlciB6a0NsaWVudFRpbWVvdXQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgc29sckhvbWU7CiAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvcmVOYW1lID0gbnVsbDsKKyAgcHJvdGVjdGVkIGludCBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQgPSAwOworICBwcm90ZWN0ZWQgaW50IGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQgPSAwOwogCiAgIHByb3RlY3RlZCBaa0NvbnRhaW5lciB6a1N5cyA9IG5ldyBaa0NvbnRhaW5lcigpOwogCkBAIC0xMjQsMTUxICsxMTQsOTAgQEAKIAogICBwcml2YXRlIGludCBjb3JlTG9hZFRocmVhZHM7CiAgIHByaXZhdGUgQ2xvc2VyVGhyZWFkIGJhY2tncm91bmRDbG9zZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgdm9sYXRpbGUgQ29uZmlnU29sciBjZmc7Ci0gIHByaXZhdGUgQ29uZmlnIG9yaWdDZmc7CisKKyAgcHJvdGVjdGVkIGZpbmFsIENvbmZpZ1NvbHIgY2ZnOworICBwcm90ZWN0ZWQgZmluYWwgU29sclJlc291cmNlTG9hZGVyIGxvYWRlcjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBzb2xySG9tZTsKICAgCiAgIHsKICAgICBsb2cuaW5mbygiTmV3IENvcmVDb250YWluZXIgIiArIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKICAgfQogCiAgIC8qKgotICAgKiBEZXByZWNhdGVkCi0gICAqIEBkZXByZWNhdGVkIHVzZSB0aGUgc2luZ2xlIGFyZyBjb25zdHJ1Y3RvciB3aXRoIGxvY2F0ZVNvbHJIb21lKCkKLSAgICogQHNlZSBTb2xyUmVzb3VyY2VMb2FkZXIjbG9jYXRlU29sckhvbWUKKyAgICogQ3JlYXRlIGEgbmV3IENvcmVDb250YWluZXIgdXNpbmcgc3lzdGVtIHByb3BlcnRpZXMgdG8gZGV0ZWN0IHRoZSBzb2xyIGhvbWUKKyAgICogZGlyZWN0b3J5LiAgVGhlIGNvbnRhaW5lcidzIGNvcmVzIGFyZSBub3QgbG9hZGVkLgorICAgKiBAc2VlICNsb2FkKCkKICAgICovCi0gIEBEZXByZWNhdGVkCiAgIHB1YmxpYyBDb3JlQ29udGFpbmVyKCkgewogICAgIHRoaXMoU29sclJlc291cmNlTG9hZGVyLmxvY2F0ZVNvbHJIb21lKCkpOwogICB9CiAKICAgLyoqCi0gICAqIEluaXRhbGl6ZSBDb3JlQ29udGFpbmVyIGRpcmVjdGx5IGZyb20gdGhlIGNvbnN0cnVjdG9yCisgICAqIENyZWF0ZSBhIG5ldyBDb3JlQ29udGFpbmVyIHVzaW5nIHRoZSBnaXZlbiBTb2xyUmVzb3VyY2VMb2FkZXIuICBUaGUgY29udGFpbmVyJ3MKKyAgICogY29yZXMgYXJlIG5vdCBsb2FkZWQuCisgICAqIEBwYXJhbSBsb2FkZXIgdGhlIFNvbHJSZXNvdXJjZUxvYWRlcgorICAgKiBAc2VlICNsb2FkKCkKICAgICovCi0gIHB1YmxpYyBDb3JlQ29udGFpbmVyKFN0cmluZyBkaXIsIEZpbGUgY29uZmlnRmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgdGhpcyhkaXIpOwotICAgIHRoaXMubG9hZChkaXIsIGNvbmZpZ0ZpbGUpOworICBwdWJsaWMgQ29yZUNvbnRhaW5lcihTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyKSB7CisgICAgdGhpcyhsb2FkZXIsIENvbmZpZ1NvbHIuZnJvbVNvbHJIb21lKGxvYWRlci5nZXRJbnN0YW5jZURpcigpKSk7CiAgIH0KIAogICAvKioKLSAgICogTWluaW1hbCBDb3JlQ29udGFpbmVyIGNvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBDb3JlQ29udGFpbmVyIHJlc291cmNlIGxvYWRlcgorICAgKiBDcmVhdGUgYSBuZXcgQ29yZUNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gc29sciBob21lIGRpcmVjdG9yeS4gIFRoZSBjb250YWluZXIncworICAgKiBjb3JlcyBhcmUgbm90IGxvYWRlZC4KKyAgICogQHBhcmFtIHNvbHJIb21lIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIHNvbHIgaG9tZSBkaXJlY3RvcnkKKyAgICogQHNlZSAjbG9hZCgpCiAgICAqLwotICBwdWJsaWMgQ29yZUNvbnRhaW5lcihTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyKSB7Ci0gICAgdGhpcyhsb2FkZXIuZ2V0SW5zdGFuY2VEaXIoKSk7Ci0gICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisgIHB1YmxpYyBDb3JlQ29udGFpbmVyKFN0cmluZyBzb2xySG9tZSkgeworICAgIHRoaXMobmV3IFNvbHJSZXNvdXJjZUxvYWRlcihzb2xySG9tZSksIENvbmZpZ1NvbHIuZnJvbVNvbHJIb21lKHNvbHJIb21lKSk7CiAgIH0KIAotICBwdWJsaWMgQ29yZUNvbnRhaW5lcihTdHJpbmcgc29sckhvbWUpIHsKLSAgICB0aGlzLnNvbHJIb21lID0gc29sckhvbWU7CisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgQ29yZUNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gU29sclJlc291cmNlTG9hZGVyIGFuZAorICAgKiBjb25maWd1cmF0aW9uLiAgVGhlIGNvbnRhaW5lcidzIGNvcmVzIGFyZSBub3QgbG9hZGVkLgorICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBTb2xyUmVzb3VyY2VMb2FkZXIKKyAgICogQHBhcmFtIGNvbmZpZyBhIENvbmZpZ1NvbHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb250YWluZXIncyBjb25maWd1cmF0aW9uCisgICAqIEBzZWUgI2xvYWQoKQorICAgKi8KKyAgcHVibGljIENvcmVDb250YWluZXIoU29sclJlc291cmNlTG9hZGVyIGxvYWRlciwgQ29uZmlnU29sciBjb25maWcpIHsKKyAgICB0aGlzLmxvYWRlciA9IGNoZWNrTm90TnVsbChsb2FkZXIpOworICAgIHRoaXMuc29sckhvbWUgPSBsb2FkZXIuZ2V0SW5zdGFuY2VEaXIoKTsKKyAgICB0aGlzLmNmZyA9IGNoZWNrTm90TnVsbChjb25maWcpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBDb3JlQ29udGFpbmVyIGFuZCBsb2FkIGl0cyBjb3JlcworICAgKiBAcGFyYW0gc29sckhvbWUgdGhlIHNvbHIgaG9tZSBkaXJlY3RvcnkKKyAgICogQHBhcmFtIGNvbmZpZ0ZpbGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGlzIGNvbnRhaW5lcidzIGNvbmZpZ3VyYXRpb24KKyAgICogQHJldHVybiBhIGxvYWRlZCBDb3JlQ29udGFpbmVyCisgICAqLworICBwdWJsaWMgc3RhdGljIENvcmVDb250YWluZXIgY3JlYXRlQW5kTG9hZChTdHJpbmcgc29sckhvbWUsIEZpbGUgY29uZmlnRmlsZSkgeworICAgIENvcmVDb250YWluZXIgY2MgPSBuZXcgQ29yZUNvbnRhaW5lcihuZXcgU29sclJlc291cmNlTG9hZGVyKHNvbHJIb21lKSwgQ29uZmlnU29sci5mcm9tRmlsZShjb25maWdGaWxlKSk7CisgICAgY2MubG9hZCgpOworICAgIHJldHVybiBjYzsKICAgfQogICAKICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29udGFpbmVyUHJvcGVydGllcygpIHsKICAgICByZXR1cm4gY29udGFpbmVyUHJvcGVydGllczsKICAgfQogCi0gIC8vIEhlbHBlciBjbGFzcyB0byBpbml0aWFsaXplIHRoZSBDb3JlQ29udGFpbmVyCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZXIgewotCi0gICAgLy8gY29yZSBjb250YWluZXIgaW5zdGFudGlhdGlvbgotICAgIHB1YmxpYyBDb3JlQ29udGFpbmVyIGluaXRpYWxpemUoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgIENvcmVDb250YWluZXIgY29yZXMgPSBudWxsOwotICAgICAgU3RyaW5nIHNvbHJIb21lID0gU29sclJlc291cmNlTG9hZGVyLmxvY2F0ZVNvbHJIb21lKCk7Ci0gICAgICAvLyBDb250YWluZXJDb25maWdGaWxlbmFtZSBjb3VsZCAgY291bGQgYmUgYSBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgIEZpbGUgZmNvbmYgPSBuZXcgRmlsZShzb2xySG9tZSwgInNvbHIueG1sIik7Ci0KLSAgICAgIGxvZy5pbmZvKCJsb29raW5nIGZvciBzb2xyIGNvbmZpZyBmaWxlOiAiICsgZmNvbmYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcihzb2xySG9tZSk7Ci0KLSAgICAgIC8vIGZpcnN0IHdlIGZpbmQgemtob3N0LCB0aGVuIHdlIGNoZWNrIGZvciBzb2xyLnhtbCBpbiB6awotICAgICAgLy8gMS4gbG9vayBmb3Igemtob3N0IGZyb20gc3lzIHByb3AgMi4gbG9vayBmb3Igemtob3N0IGluIHtzb2xyLmhvbWV9L3NvbHIucHJvcGVydGllcwotICAgICAgCi0gICAgICAvLyBFaXRoZXIgd2UgaGF2ZSBhIGNvbmZpZyBmaWxlIG9yIG5vdC4KLSAgICAgIAotICAgICAgaWYgKGZjb25mLmV4aXN0cygpKSB7Ci0gICAgICAgIGNvcmVzLmxvYWQoc29sckhvbWUsIGZjb25mKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEJhY2sgY29tcGFydCBzdXBwb3J0Ci0gICAgICAgIGxvZy5pbmZvKCJubyBzb2xyLnhtbCBmb3VuZC4gdXNpbmcgZGVmYXVsdCBvbGQtc3R5bGUgc29sci54bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBjb3Jlcy5sb2FkKHNvbHJIb21lLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oQ29uZmlnU29sclhtbE9sZC5ERUZfU09MUl9YTUwuZ2V0Qnl0ZXMoIlVURi04IikpLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLAotICAgICAgICAgICAgICAiQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplIGZhaWxlZCB3aGVuIHRyeWluZyB0byBsb2FkIGRlZmF1bHQgc29sci54bWwgZmlsZSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNvcmVzLmNvbmZpZ0ZpbGUgPSBmY29uZjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIGNvcmVzOwotICAgIH0KLSAgfQotCi0KICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEluaXRpYWxpemF0aW9uIC8gQ2xlYW51cAogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8qKgotICAgKiBMb2FkIGEgY29uZmlnIGZpbGUgbGlzdGluZyB0aGUgYXZhaWxhYmxlIHNvbHIgY29yZXMuCi0gICAqIEBwYXJhbSBkaXIgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIGFsbCByZXNvdXJjZXMuCi0gICAqIEBwYXJhbSBjb25maWdGaWxlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGRpciwgRmlsZSBjb25maWdGaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICB0aGlzLmNvbmZpZ0ZpbGUgPSBjb25maWdGaWxlOwotICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKLSAgICB0cnkgewotICAgICAgdGhpcy5sb2FkKGRpciwgaW4sICBjb25maWdGaWxlLmdldE5hbWUoKSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGluKTsKLSAgICB9Ci0gIH0gCiAKICAgLyoqCi0gICAqIExvYWQgYSBjb25maWcgZmlsZSBsaXN0aW5nIHRoZSBhdmFpbGFibGUgc29sciBjb3Jlcy4KLSAgICogCi0gICAqIEBwYXJhbSBkaXIgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIGFsbCByZXNvdXJjZXMuCi0gICAqIEBwYXJhbSBpcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIElucHV0U3RyZWFtLiBNYXkgYmUgYSBwcm9wZXJ0aWVzIGZpbGUgb3IgYW4geG1sIGZpbGUKKyAgICogTG9hZCB0aGUgY29yZXMgZGVmaW5lZCBmb3IgdGhpcyBDb3JlQ29udGFpbmVyCiAgICAqLworICBwdWJsaWMgdm9pZCBsb2FkKCkgIHsKIAotICAvLyBMZXQncyBrZWVwIHRoaXMgdWdseSBib29sZWFuIG91dCBvZiBwdWJsaWMgY2lyY3VsYXRpb24uCi0gIHByb3RlY3RlZCB2b2lkIGxvYWQoU3RyaW5nIGRpciwgSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBmaWxlTmFtZSkgIHsKKyAgICBsb2cuaW5mbygiTG9hZGluZyBjb3JlcyBpbnRvIENvcmVDb250YWluZXIgW2luc3RhbmNlRGlyPXt9XSIsIGxvYWRlci5nZXRJbnN0YW5jZURpcigpKTsKKwogICAgIFRocmVhZFBvb2xFeGVjdXRvciBjb3JlTG9hZEV4ZWN1dG9yID0gbnVsbDsKLSAgICBpZiAobnVsbCA9PSBkaXIpIHsKLSAgICAgIC8vIGRvbid0IHJlbHkgb24gU29sclJlc291cmNlTG9hZGVyKCksIGRldGVybWluZSBleHBsaWNpdGx5IGZpcnN0Ci0gICAgICBkaXIgPSBTb2xyUmVzb3VyY2VMb2FkZXIubG9jYXRlU29sckhvbWUoKTsKLSAgICB9Ci0gICAgbG9nLmluZm8oIkxvYWRpbmcgQ29yZUNvbnRhaW5lciB1c2luZyBTb2xyIEhvbWU6ICd7fSciLCBkaXIpOwotICAgIAotICAgIHRoaXMubG9hZGVyID0gbmV3IFNvbHJSZXNvdXJjZUxvYWRlcihkaXIpOwotICAgIHNvbHJIb21lID0gbG9hZGVyLmdldEluc3RhbmNlRGlyKCk7Ci0KLSAgICB0cnkgewotICAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcobG9hZGVyLCBudWxsLCBuZXcgSW5wdXRTb3VyY2UoaXMpLCBudWxsLCBmYWxzZSk7Ci0KLSAgICAgIC8vIG9sZCBzdHlsZSBkZWZpbmVzIGNvcmVzIGluIHNvbHIueG1sLCBuZXcgc3R5bGUgZGlzb3ZlcnMgdGhlbSBieSAKLSAgICAgIC8vIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKLSAgICAgIGJvb2xlYW4gb2xkU3R5bGUgPSAoY29uZmlnLmdldE5vZGUoInNvbHIvY29yZXMiLCBmYWxzZSkgIT0gbnVsbCk7Ci0gICAgICAKLSAgICAgIGlmIChvbGRTdHlsZSkgewotICAgICAgICAvLyBDb25maWdTb2xyIGhhbmRsZXMga2VlcCBvcmlnIHZhbHVlcyBhcm91bmQgZm9yIG5vbiBzb2xyY29yZSBsZXZlbCBpdGVtcywKLSAgICAgICAgLy8gYnV0IHRoaXMgaXMgc3RpbGwgaG93IG9yaWdpbmFsIGNvcmUgbHZsIGF0dHJpYnV0ZXMgYXJlIGtlcHQgYXJvdW5kCi0gICAgICAgIHRoaXMub3JpZ0NmZyA9IG5ldyBDb25maWcobG9hZGVyLCBudWxsLCBjb3B5RG9jKGNvbmZpZy5nZXREb2N1bWVudCgpKSk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNmZyA9IG5ldyBDb25maWdTb2xyWG1sT2xkKGNvbmZpZywgdGhpcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLmNmZyA9IG5ldyBDb25maWdTb2xyWG1sKGNvbmZpZywgdGhpcyk7Ci0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIiIsIGUpOwotICAgIH0KLSAgICAvLyBTaW5jZSB0aGUgY29yZXMgdmFyIGlzIG5vdyBpbml0aWFsaXplZCB0byBudWxsLCBsZXQncyBzZXQgaXQgdXAgcmlnaHQKLSAgICAvLyBub3cuCi0gICAgY2ZnLnN1YnN0aXR1dGVQcm9wZXJ0aWVzKCk7CiAKICAgICAvLyBhZGQgdGhlIHNoYXJlZExpYiB0byB0aGUgc2hhcmVkIHJlc291cmNlIGxvYWRlciBiZWZvcmUgaW5pdGlhbGl6aW5nIGNmZyBiYXNlZCBwbHVnaW5zCiAgICAgbGliRGlyID0gY2ZnLmdldChDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9TSEFSRURMSUIgLCBudWxsKTsKICAgICBpZiAobGliRGlyICE9IG51bGwpIHsKLSAgICAgIEZpbGUgZiA9IEZpbGVVdGlscy5yZXNvbHZlUGF0aChuZXcgRmlsZShkaXIpLCBsaWJEaXIpOworICAgICAgRmlsZSBmID0gRmlsZVV0aWxzLnJlc29sdmVQYXRoKG5ldyBGaWxlKHNvbHJIb21lKSwgbGliRGlyKTsKICAgICAgIGxvZy5pbmZvKCJsb2FkaW5nIHNoYXJlZCBsaWJyYXJ5OiAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICBsb2FkZXIuYWRkVG9DbGFzc0xvYWRlcihsaWJEaXIsIG51bGwsIGZhbHNlKTsKICAgICAgIGxvYWRlci5yZWxvYWRMdWNlbmVTUEkoKTsKQEAgLTI5OCw4ICsyMjcsOCBAQAogICAgIHNoYXJlU2NoZW1hID0gY2ZnLmdldEJvb2woQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfU0hBUkVTQ0hFTUEsIERFRkFVTFRfU0hBUkVfU0NIRU1BKTsKICAgICB6a0NsaWVudFRpbWVvdXQgPSBjZmcuZ2V0SW50KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1pLQ0xJRU5UVElNRU9VVCwgREVGQVVMVF9aS19DTElFTlRfVElNRU9VVCk7CiAgICAgCi0gICAgaW50IGRpc3RyaWJVcGRhdGVDb25uVGltZW91dCA9IGNmZy5nZXRJbnQoQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfRElTVFJJQlVQREFURUNPTk5USU1FT1VULCAwKTsKLSAgICBpbnQgZGlzdHJpYlVwZGF0ZVNvVGltZW91dCA9IGNmZy5nZXRJbnQoQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfRElTVFJJQlVQREFURVNPVElNRU9VVCwgMCk7CisgICAgZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0ID0gY2ZnLmdldEludChDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9ESVNUUklCVVBEQVRFQ09OTlRJTUVPVVQsIDApOworICAgIGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQgPSBjZmcuZ2V0SW50KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0RJU1RSSUJVUERBVEVTT1RJTUVPVVQsIDApOwogCiAgICAgLy8gTm90ZTogaW5pdFpvb0tlZXBlciB3aWxsIGFwcGx5IGhhcmRjb2RlZCBkZWZhdWx0IGlmIGNsb3VkIG1vZGUKICAgICBTdHJpbmcgaG9zdFBvcnQgPSBjZmcuZ2V0KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0hPU1RQT1JULCBudWxsKTsKQEAgLTMxNSwxMyArMjQ0LDE1IEBACiAKICAgICB0cmFuc2llbnRDYWNoZVNpemUgPSBjZmcuZ2V0SW50KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1RSQU5TSUVOVENBQ0hFU0laRSwgSW50ZWdlci5NQVhfVkFMVUUpOwogCisgICAgYm9vbGVhbiBnZW5lcmljQ29yZU5vZGVOYW1lcyA9IGNmZy5nZXRCb29sKENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0dFTkVSSUNDT1JFTk9ERU5BTUVTLCBmYWxzZSk7CisKICAgICBpZiAoc2hhcmVTY2hlbWEpIHsKICAgICAgIGluZGV4U2NoZW1hQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLEluZGV4U2NoZW1hPigpOwogICAgIH0KIAogICAgIHprQ2xpZW50VGltZW91dCA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KCJ6a0NsaWVudFRpbWVvdXQiLAogICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHprQ2xpZW50VGltZW91dCkpKTsKLSAgICB6a1N5cy5pbml0Wm9vS2VlcGVyKHRoaXMsIHNvbHJIb21lLCB6a0hvc3QsIHprQ2xpZW50VGltZW91dCwgaG9zdFBvcnQsIGhvc3RDb250ZXh0LCBob3N0LCBsZWFkZXJWb3RlV2FpdCwgZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0LCBkaXN0cmliVXBkYXRlU29UaW1lb3V0KTsKKyAgICB6a1N5cy5pbml0Wm9vS2VlcGVyKHRoaXMsIHNvbHJIb21lLCB6a0hvc3QsIHprQ2xpZW50VGltZW91dCwgaG9zdFBvcnQsIGhvc3RDb250ZXh0LCBob3N0LCBsZWFkZXJWb3RlV2FpdCwgZ2VuZXJpY0NvcmVOb2RlTmFtZXMsIGRpc3RyaWJVcGRhdGVDb25uVGltZW91dCwgZGlzdHJpYlVwZGF0ZVNvVGltZW91dCk7CiAgICAgCiAgICAgaWYgKGlzWm9vS2VlcGVyQXdhcmUoKSAmJiBjb3JlTG9hZFRocmVhZHMgPD0gMSkgewogICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwKQEAgLTQxNSw3ICszNDYsMTMgQEAKICAgICAgICAgICAgIHAuc2V0VHJhbnNpZW50KCgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShvcHQpIHx8ICJvbiIKICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShvcHQpKSA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgfQotICAgICAgICAgIAorCisgICAgICAgICAgaWYgKHAuaXNUcmFuc2llbnQoKSB8fCAhIHAuaXNMb2FkT25TdGFydHVwKCkpIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZS4gaW5jbHVkZXMgbm9uLXRyYW5zaWVudCBidXQgbm90CisgICAgICAgICAgICAvLyBsb2FkZWQgYXQgc3RhcnR1cCBjb3Jlcy4KKyAgICAgICAgICAgIHNvbHJDb3Jlcy5wdXREeW5hbWljRGVzY3JpcHRvcihyYXdOYW1lLCBwKTsKKyAgICAgICAgICB9CisKICAgICAgICAgICBpZiAocC5pc0xvYWRPblN0YXJ0dXAoKSkgeyAvLyBUaGUgbm9ybWFsIGNhc2UKIAogICAgICAgICAgICAgQ2FsbGFibGU8U29sckNvcmU+IHRhc2sgPSBuZXcgQ2FsbGFibGU8U29sckNvcmU+KCkgewpAQCAtNDIzLDYgKzM2MCw5IEBACiAgICAgICAgICAgICAgIHB1YmxpYyBTb2xyQ29yZSBjYWxsKCkgewogICAgICAgICAgICAgICAgIFNvbHJDb3JlIGMgPSBudWxsOwogICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICBpZiAoemtTeXMuZ2V0WmtDb250cm9sbGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmVSZWdpc3RlckluWmsocCk7CisgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjID0gY3JlYXRlKHApOwogICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb3JlKHAuaXNUcmFuc2llbnQoKSwgbmFtZSwgYywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CkBAIC00NDYsMTAgKzM4Niw2IEBACiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgcGVuZGluZy5hZGQoY29tcGxldGlvblNlcnZpY2Uuc3VibWl0KHRhc2spKTsKIAotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTdG9yZSBpdCBhd2F5IGZvciBsYXRlciB1c2UuIGluY2x1ZGVzIG5vbi10cmFuc2llbnQgYnV0IG5vdAotICAgICAgICAgICAgLy8gbG9hZGVkIGF0IHN0YXJ0dXAgY29yZXMuCi0gICAgICAgICAgICBzb2xyQ29yZXMucHV0RHluYW1pY0Rlc2NyaXB0b3IocmF3TmFtZSwgcCk7CiAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKICAgICAgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csIG51bGwsIGV4KTsKQEAgLTYyOSwyMiArNTY1LDYgQEAKICAgICAgICAgbmFtZS5pbmRleE9mKCAnXFwnICkgPj0gMCApewogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJJbnZhbGlkIGNvcmUgbmFtZTogIituYW1lICk7CiAgICAgfQotCi0gICAgaWYgKHprU3lzLmdldFprQ29udHJvbGxlcigpICE9IG51bGwpIHsKLSAgICAgIC8vIHRoaXMgaGFwcGVucyBiZWZvcmUgd2UgY2FuIHJlY2VpdmUgcmVxdWVzdHMKLSAgICAgIHRyeSB7Ci0gICAgICAgIHprU3lzLmdldFprQ29udHJvbGxlcigpLnByZVJlZ2lzdGVyKGNvcmUuZ2V0Q29yZURlc2NyaXB0b3IoKSk7Ci0gICAgICB9IGNhdGNoIChLZWVwZXJFeGNlcHRpb24gZSkgewotICAgICAgICBsb2cuZXJyb3IoIiIsIGUpOwotICAgICAgICB0aHJvdyBuZXcgWm9vS2VlcGVyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwKLSAgICAgICAgICAgICIiLCBlKTsKLSAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgbG9nLmVycm9yKCIiLCBlKTsKLSAgICAgICAgdGhyb3cgbmV3IFpvb0tlZXBlckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1IsCi0gICAgICAgICAgICAiIiwgZSk7Ci0gICAgICB9Ci0gICAgfQogICAgIAogICAgIFNvbHJDb3JlIG9sZCA9IG51bGw7CiAKQEAgLTg1Myw3ICs3NzMsNyBAQAogICAgIHRyeSB7CiAgICAgICBuYW1lID0gY2hlY2tEZWZhdWx0KG5hbWUpOwogCi0gICAgICBTb2xyQ29yZSBjb3JlID0gc29sckNvcmVzLmdldENvcmUobmFtZSk7CisgICAgICBTb2xyQ29yZSBjb3JlID0gc29sckNvcmVzLmdldENvcmVGcm9tQW55TGlzdChuYW1lLCBmYWxzZSk7CiAgICAgICBpZiAoY29yZSA9PSBudWxsKQogICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbiggU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuQkFEX1JFUVVFU1QsICJObyBzdWNoIGNvcmU6ICIgKyBuYW1lICk7CiAKQEAgLTk2MSwxMCArODgxLDkgQEAKICAgICBuYW1lID0gY2hlY2tEZWZhdWx0KG5hbWUpOwogCiAgICAgLy8gRG8gdGhpcyBpbiB0d28gcGhhc2VzIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gbG9jayBhY2Nlc3MgdG8gdGhlIGNvcmVzIG92ZXIgYSBsb2FkLgotICAgIFNvbHJDb3JlIGNvcmUgPSBzb2xyQ29yZXMuZ2V0Q29yZUZyb21BbnlMaXN0KG5hbWUpOworICAgIFNvbHJDb3JlIGNvcmUgPSBzb2xyQ29yZXMuZ2V0Q29yZUZyb21BbnlMaXN0KG5hbWUsIHRydWUpOwogCiAgICAgaWYgKGNvcmUgIT0gbnVsbCkgewotICAgICAgY29yZS5vcGVuKCk7CiAgICAgICByZXR1cm4gY29yZTsKICAgICB9CiAKQEAgLTk5MSw2ICs5MTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgYXMgYSBjb25zZXF1ZW5jZSBvZiBzaHV0dGluZyBkb3duLgogICAgIHRyeSB7CiAgICAgICBpZiAoY29yZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh6a1N5cy5nZXRaa0NvbnRyb2xsZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgcHJlUmVnaXN0ZXJJblprKGRlc2MpOworICAgICAgICB9CiAgICAgICAgIGNvcmUgPSBjcmVhdGUoZGVzYyk7IC8vIFRoaXMgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIGl0IGZhaWxzLgogICAgICAgICBjb3JlLm9wZW4oKTsKICAgICAgICAgcmVnaXN0ZXJDb3JlKGRlc2MuaXNUcmFuc2llbnQoKSwgbmFtZSwgY29yZSwgZmFsc2UpOwpAQCAtMTA4Miw3ICsxMDA0LDcgQEAKICAgfQogICAKICAgcHVibGljIEZpbGUgZ2V0Q29uZmlnRmlsZSgpIHsKLSAgICByZXR1cm4gY29uZmlnRmlsZTsKKyAgICByZXR1cm4gbmV3IEZpbGUoc29sckhvbWUsIENvbmZpZ1NvbHIuU09MUl9YTUxfRklMRSk7CiAgIH0KIAogICAvKioKQEAgLTEwOTYsNyArMTAxOCw3IEBACiAgIC8qKiBQZXJzaXN0cyB0aGUgY29yZXMgY29uZmlnIGZpbGUgaW4gY29yZXMueG1sLiAqLwogICBARGVwcmVjYXRlZAogICBwdWJsaWMgdm9pZCBwZXJzaXN0KCkgewotICAgIHBlcnNpc3RGaWxlKGNvbmZpZ0ZpbGUpOworICAgIHBlcnNpc3RGaWxlKGdldENvbmZpZ0ZpbGUoKSk7CiAgIH0KIAogICAvKioKQEAgLTExMTcsNDUgKzEwMzksODIgQEAKICAgICAvLyBvbmx5IHRoZSBvbGQgc29scnhtbCBwZXJzaXN0cwogICAgIGlmIChjZmcgIT0gbnVsbCAmJiAhKGNmZyBpbnN0YW5jZW9mIENvbmZpZ1NvbHJYbWxPbGQpKSByZXR1cm47CiAKLSAgICBsb2cuaW5mbygiUGVyc2lzdGluZyBjb3JlcyBjb25maWcgdG8gIiArIChmaWxlID09IG51bGwgPyBjb25maWdGaWxlIDogZmlsZSkpOworICAgIGxvZy5pbmZvKCJQZXJzaXN0aW5nIGNvcmVzIGNvbmZpZyB0byAiICsgKGZpbGUgPT0gbnVsbCA/IGdldENvbmZpZ0ZpbGUoKSA6IGZpbGUpKTsKIAotICAgIAogICAgIC8vIDxzb2xyIGF0dHJpYj0idmFsdWUiPgogICAgIE1hcDxTdHJpbmcsU3RyaW5nPiByb290U29sckF0dHJpYnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotICAgIGlmIChsaWJEaXIgIT0gbnVsbCkgcm9vdFNvbHJBdHRyaWJzLnB1dCgic2hhcmVkTGliIiwgbGliRGlyKTsKLSAgICByb290U29sckF0dHJpYnMucHV0KCJwZXJzaXN0ZW50IiwgQm9vbGVhbi50b1N0cmluZyhpc1BlcnNpc3RlbnQoKSkpOwotICAgIAorCisgICAgYWRkQXR0cmliKHJvb3RTb2xyQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfU0hBUkVETElCLCAic2hhcmVkTGliIiwgdGhpcy5saWJEaXIpOworICAgIGFkZEF0dHJpYihyb290U29sckF0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1BFUlNJU1RFTlQsICJwZXJzaXN0ZW50IiwKKyAgICAgICAgQm9vbGVhbi50b1N0cmluZyhpc1BlcnNpc3RlbnQoKSksICJmYWxzZSIpOworICAgIGFkZEF0dHJpYihyb290U29sckF0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0NPUkVMT0FEVEhSRUFEUywgImNvcmVMb2FkVGhyZWFkcyIsCisgICAgICAgIEludGVnZXIudG9TdHJpbmcodGhpcy5jb3JlTG9hZFRocmVhZHMpLCBJbnRlZ2VyLnRvU3RyaW5nKENPUkVfTE9BRF9USFJFQURTKSk7CisgICAgYWRkQXR0cmliKHJvb3RTb2xyQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfWktIT1NULCAiemtIb3N0IiwgdGhpcy56a0hvc3QpOworCiAgICAgLy8gPHNvbHIgYXR0cmliPSJ2YWx1ZSI+IDxjb3JlcyBhdHRyaWI9InZhbHVlIj4KICAgICBNYXA8U3RyaW5nLFN0cmluZz4gY29yZXNBdHRyaWJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLSAgICBhZGRDb3Jlc0F0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0FETUlOUEFUSCwgImFkbWluUGF0aCIsIHRoaXMuYWRtaW5QYXRoLCBudWxsKTsKLSAgICBhZGRDb3Jlc0F0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0FETUlOSEFORExFUiwgImFkbWluSGFuZGxlciIsIHRoaXMuYWRtaW5IYW5kbGVyLCBudWxsKTsKLSAgICBhZGRDb3Jlc0F0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1NIQVJFU0NIRU1BLCJzaGFyZVNjaGVtYSIsCisgICAgYWRkQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfQURNSU5QQVRILCAiYWRtaW5QYXRoIiwgdGhpcy5hZG1pblBhdGgsIHRoaXMuZ2V0QWRtaW5QYXRoKCkpOworICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0FETUlOSEFORExFUiwgImFkbWluSGFuZGxlciIsIHRoaXMuYWRtaW5IYW5kbGVyKTsKKyAgICBhZGRBdHRyaWIoY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9TSEFSRVNDSEVNQSwgInNoYXJlU2NoZW1hIiwKICAgICAgICAgQm9vbGVhbi50b1N0cmluZyh0aGlzLnNoYXJlU2NoZW1hKSwKICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhERUZBVUxUX1NIQVJFX1NDSEVNQSkpOwotICAgIGFkZENvcmVzQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfSE9TVCwgImhvc3QiLCB6a1N5cy5nZXRIb3N0KCksIG51bGwpOworICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0hPU1QsICJob3N0IiwgemtTeXMuZ2V0SG9zdCgpKTsKIAogICAgIGlmICghIChudWxsID09IGRlZmF1bHRDb3JlTmFtZSB8fCBkZWZhdWx0Q29yZU5hbWUuZXF1YWxzKCIiKSkgKSB7CiAgICAgICBjb3Jlc0F0dHJpYnMucHV0KCJkZWZhdWx0Q29yZU5hbWUiLCBkZWZhdWx0Q29yZU5hbWUpOwogICAgIH0KIAotICAgIGFkZENvcmVzQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfSE9TVFBPUlQsICJob3N0UG9ydCIsemtTeXMuZ2V0SG9zdFBvcnQoKSwgbnVsbCk7Ci0gICAgYWRkQ29yZXNBdHRyaWIoY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9aS0NMSUVOVFRJTUVPVVQsICJ6a0NsaWVudFRpbWVvdXQiLAorICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0hPU1RQT1JULCAiaG9zdFBvcnQiLCB6a1N5cy5nZXRIb3N0UG9ydCgpKTsKKyAgICBhZGRBdHRyaWIoY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9aS0NMSUVOVFRJTUVPVVQsICJ6a0NsaWVudFRpbWVvdXQiLAogICAgICAgICBpbnRUb1N0cmluZyh0aGlzLnprQ2xpZW50VGltZW91dCksCiAgICAgICAgIEludGVnZXIudG9TdHJpbmcoREVGQVVMVF9aS19DTElFTlRfVElNRU9VVCkpOwotICAgIGFkZENvcmVzQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfSE9TVENPTlRFWFQsICJob3N0Q29udGV4dCIsCi0gICAgICAgIHprU3lzLmdldEhvc3RDb250ZXh0KCksIG51bGwpOwotICAgIGFkZENvcmVzQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfTEVBREVSVk9URVdBSVQsICJsZWFkZXJWb3RlV2FpdCIsCisgICAgYWRkQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfSE9TVENPTlRFWFQsICJob3N0Q29udGV4dCIsCisgICAgICAgIHprU3lzLmdldEhvc3RDb250ZXh0KCkpOworICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0xFQURFUlZPVEVXQUlULCAibGVhZGVyVm90ZVdhaXQiLAogICAgICAgICB6a1N5cy5nZXRMZWFkZXJWb3RlV2FpdCgpLCBMRUFERVJfVk9URV9XQUlUKTsKLSAgICBhZGRDb3Jlc0F0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0NPUkVMT0FEVEhSRUFEUywgImNvcmVMb2FkVGhyZWFkcyIsCi0gICAgICAgIEludGVnZXIudG9TdHJpbmcodGhpcy5jb3JlTG9hZFRocmVhZHMpLCBJbnRlZ2VyLnRvU3RyaW5nKENPUkVfTE9BRF9USFJFQURTKSk7CisgICAgYWRkQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfR0VORVJJQ0NPUkVOT0RFTkFNRVMsICJnZW5lcmljQ29yZU5vZGVOYW1lcyIsCisgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoemtTeXMuZ2V0R2VuZXJpY0NvcmVOb2RlTmFtZXMoKSksICJmYWxzZSIpOwogICAgIGlmICh0cmFuc2llbnRDYWNoZVNpemUgIT0gSW50ZWdlci5NQVhfVkFMVUUpIHsgLy8gVGhpcyB0ZXN0CiAgICAgLy8gaXMgYSBjb25zZXF1ZW5jZSBvZiB0ZXN0aW5nLiBJIHJlYWxseSBoYXRlIGl0LgotICAgICAgYWRkQ29yZXNBdHRyaWIoY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9UUkFOU0lFTlRDQUNIRVNJWkUsICJ0cmFuc2llbnRDYWNoZVNpemUiLAorICAgICAgYWRkQXR0cmliKGNvcmVzQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfVFJBTlNJRU5UQ0FDSEVTSVpFLCAidHJhbnNpZW50Q2FjaGVTaXplIiwKICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMudHJhbnNpZW50Q2FjaGVTaXplKSwgSW50ZWdlci50b1N0cmluZyhJbnRlZ2VyLk1BWF9WQUxVRSkpOwogICAgIH0KKyAgICBhZGRBdHRyaWIoY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9ESVNUUklCVVBEQVRFQ09OTlRJTUVPVVQsICJkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQiLAorICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0KSwgSW50ZWdlci50b1N0cmluZyh0aGlzLmRpc3RyaWJVcGRhdGVDb25uVGltZW91dCkpOworICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0RJU1RSSUJVUERBVEVTT1RJTUVPVVQsICJkaXN0cmliVXBkYXRlU29UaW1lb3V0IiwKKyAgICAgICAgSW50ZWdlci50b1N0cmluZyh0aGlzLmRpc3RyaWJVcGRhdGVTb1RpbWVvdXQpLCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuZGlzdHJpYlVwZGF0ZVNvVGltZW91dCkpOworICAgIGFkZEF0dHJpYihjb3Jlc0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX01BTkFHRU1FTlRQQVRILCAibWFuYWdlbWVudFBhdGgiLAorICAgICAgICB0aGlzLm1hbmFnZW1lbnRQYXRoKTsKKworICAgIC8vIGRvbid0IGZvcmdldCB0aGUgbG9nZ2luZyBzdHVmZgorICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9nZ2luZ0F0dHJpYnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBhZGRBdHRyaWIobG9nZ2luZ0F0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0xPR0dJTkdfQ0xBU1MsICJjbGFzcyIsCisgICAgICAgIGNmZy5nZXQoQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfTE9HR0lOR19DTEFTUywgbnVsbCkpOworICAgIGFkZEF0dHJpYihsb2dnaW5nQXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfTE9HR0lOR19FTkFCTEVELCAiZW5hYmxlZCIsCisgICAgICAgIGNmZy5nZXQoQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfTE9HR0lOR19FTkFCTEVELCBudWxsKSk7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHdhdGNoZXJBdHRyaWJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgYWRkQXR0cmliKHdhdGNoZXJBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9MT0dHSU5HX1dBVENIRVJfU0laRSwgInNpemUiLAorICAgICAgICBjZmcuZ2V0KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0xPR0dJTkdfV0FUQ0hFUl9TSVpFLCBudWxsKSk7CisgICAgYWRkQXR0cmliKHdhdGNoZXJBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9MT0dHSU5HX1dBVENIRVJfVEhSRVNIT0xELCAidGhyZXNob2xkIiwKKyAgICAgICAgY2ZnLmdldChDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9MT0dHSU5HX1dBVENIRVJfVEhSRVNIT0xELCBudWxsKSk7CisKKworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc2hhcmRIYW5kbGVyQXR0cmliID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgYWRkQXR0cmliKHNoYXJkSGFuZGxlckF0dHJpYiwgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfU0hBUkRIQU5ETEVSRkFDVE9SWV9DTEFTUywgImNsYXNzIiwKKyAgICAgICAgY2ZnLmdldChDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9TSEFSREhBTkRMRVJGQUNUT1JZX0NMQVNTLCBudWxsKSk7CisgICAgYWRkQXR0cmliKHNoYXJkSGFuZGxlckF0dHJpYiwgQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfU0hBUkRIQU5ETEVSRkFDVE9SWV9OQU1FLCAibmFtZSIsCisgICAgICAgIGNmZy5nZXQoQ29uZmlnU29sci5DZmdQcm9wLlNPTFJfU0hBUkRIQU5ETEVSRkFDVE9SWV9OQU1FLCBudWxsKSk7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNoYXJkSGFuZGxlclByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgYWRkQXR0cmliKHNoYXJkSGFuZGxlclByb3BzLCBDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9TSEFSREhBTkRMRVJGQUNUT1JZX0NPTk5USU1FT1VULCAiY29ublRpbWVvdXQiLAorICAgICAgICBjZmcuZ2V0KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1NIQVJESEFORExFUkZBQ1RPUllfQ09OTlRJTUVPVVQsIG51bGwpKTsKKyAgICBhZGRBdHRyaWIoc2hhcmRIYW5kbGVyUHJvcHMsIENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1NIQVJESEFORExFUkZBQ1RPUllfU09DS0VUVElNRU9VVCwgInNvY2tldFRpbWVvdXQiLAorICAgICAgICBjZmcuZ2V0KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX1NIQVJESEFORExFUkZBQ1RPUllfU09DS0VUVElNRU9VVCwgbnVsbCkpOwogCiAgICAgdHJ5IHsKLSAgICAgIHNvbHJDb3Jlcy5wZXJzaXN0Q29yZXMob3JpZ0NmZywgY29udGFpbmVyUHJvcGVydGllcywgcm9vdFNvbHJBdHRyaWJzLCBjb3Jlc0F0dHJpYnMsIGZpbGUsIGNvbmZpZ0ZpbGUsIGxvYWRlcik7CisgICAgICBzb2xyQ29yZXMucGVyc2lzdENvcmVzKGNmZy5jb25maWcuZ2V0T3JpZ2luYWxDb25maWcoKSwgY29udGFpbmVyUHJvcGVydGllcywgcm9vdFNvbHJBdHRyaWJzLGNvcmVzQXR0cmlicywKKyAgICAgICAgICBsb2dnaW5nQXR0cmlicywgd2F0Y2hlckF0dHJpYnMsIHNoYXJkSGFuZGxlckF0dHJpYiwgc2hhcmRIYW5kbGVyUHJvcHMsIGZpbGUsIGxvYWRlcik7CiAgICAgfSBjYXRjaCAoWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsIG51bGwsIGUpOwogICAgIH0KQEAgLTExNjYsMzAgKzExMjUsMzkgQEAKICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbnRlZ2VyKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBhZGRDb3Jlc0F0dHJpYihNYXA8U3RyaW5nLFN0cmluZz4gY29yZXNBdHRyaWJzLCBDb25maWdTb2xyLkNmZ1Byb3AgcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJOYW1lLCBTdHJpbmcgYXR0cmliVmFsdWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYihNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnMsIENvbmZpZ1NvbHIuQ2ZnUHJvcCBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJOYW1lLCBTdHJpbmcgYXR0cmliVmFsdWUpIHsKKyAgICBhZGRBdHRyaWIoYXR0cmlicywgcHJvcCwgYXR0cmliTmFtZSwgYXR0cmliVmFsdWUsIG51bGwpOworICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmliKE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlicywgQ29uZmlnU29sci5DZmdQcm9wIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYk5hbWUsIFN0cmluZyBhdHRyaWJWYWx1ZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewogICAgIGlmIChjZmcgPT0gbnVsbCkgewotICAgICAgY29yZXNBdHRyaWJzLnB1dChhdHRyaWJOYW1lLCBhdHRyaWJWYWx1ZSk7CisgICAgICBhdHRyaWJzLnB1dChhdHRyaWJOYW1lLCBhdHRyaWJWYWx1ZSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIAorCiAgICAgaWYgKGF0dHJpYlZhbHVlICE9IG51bGwpIHsKICAgICAgIFN0cmluZyBvcmlnVmFsdWUgPSBjZmcuZ2V0T3JpZ1Byb3AocHJvcCwgbnVsbCk7Ci0gICAgICAKKwogICAgICAgaWYgKG9yaWdWYWx1ZSA9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGF0dHJpYlZhbHVlLmVxdWFscyhkZWZhdWx0VmFsdWUpKSByZXR1cm47CiAKICAgICAgIGlmIChhdHRyaWJWYWx1ZS5lcXVhbHMoUHJvcGVydGllc1V0aWwuc3Vic3RpdHV0ZVByb3BlcnR5KG9yaWdWYWx1ZSwgbG9hZGVyLmdldENvcmVQcm9wZXJ0aWVzKCkpKSkgewotICAgICAgICBjb3Jlc0F0dHJpYnMucHV0KGF0dHJpYk5hbWUsIG9yaWdWYWx1ZSk7CisgICAgICAgIGF0dHJpYnMucHV0KGF0dHJpYk5hbWUsIG9yaWdWYWx1ZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjb3Jlc0F0dHJpYnMucHV0KGF0dHJpYk5hbWUsIGF0dHJpYlZhbHVlKTsKKyAgICAgICAgYXR0cmlicy5wdXQoYXR0cmliTmFtZSwgYXR0cmliVmFsdWUpOwogICAgICAgfQogICAgIH0KICAgfQogCisgIHB1YmxpYyB2b2lkIHByZVJlZ2lzdGVySW5aayhmaW5hbCBDb3JlRGVzY3JpcHRvciBwKSB7CisgICAgemtTeXMuZ2V0WmtDb250cm9sbGVyKCkucHJlUmVnaXN0ZXIocCk7CisgIH0KKwogICBwdWJsaWMgU3RyaW5nIGdldFNvbHJIb21lKCkgewogICAgIHJldHVybiBzb2xySG9tZTsKICAgfQotICAKKwogICBwdWJsaWMgYm9vbGVhbiBpc1pvb0tlZXBlckF3YXJlKCkgewogICAgIHJldHVybiB6a1N5cy5nZXRaa0NvbnRyb2xsZXIoKSAhPSBudWxsOwogICB9CkBAIC0xMjIxLDE0ICsxMTg5LDcgQEAKICAgICByZXR1cm4gc29sckNvcmVzLmdldENvcmVUb09yaWdOYW1lKGNvcmUpOwogICB9CiAgIAotICBwcml2YXRlIERvY3VtZW50IGNvcHlEb2MoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgVHJhbnNmb3JtZXIgdHggICA9IHRmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotICAgIERPTVJlc3VsdCByZXN1bHQgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gICAgdHgudHJhbnNmb3JtKHNvdXJjZSxyZXN1bHQpOwotICAgIHJldHVybiAoRG9jdW1lbnQpcmVzdWx0LmdldE5vZGUoKTsKLSAgfQorCiB9CiAKIGNsYXNzIENsb3NlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29yZURlc2NyaXB0b3IuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db3JlRGVzY3JpcHRvci5qYXZhCmluZGV4IGE0NGFiZTcuLjNlNDkwNzEgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db3JlRGVzY3JpcHRvci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db3JlRGVzY3JpcHRvci5qYXZhCkBAIC02NSw2ICs2NSw5IEBACiAgIC8vIHRoZW0gaW5kaXZpZHVhbGx5LgogICBwcml2YXRlIFByb3BlcnRpZXMgY29yZVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwogCisgIC8vVE9ETzogNS4wIHJlbW92ZSB0aGlzLCB0aGlzIGlzIHNvbGVseSBhIGhhY2sgZm9yIHBlcnNpc3RlbmNlLgorICBwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlZFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCiAgIHByaXZhdGUgYm9vbGVhbiBsb2FkZWRJbXBsaWNpdCA9IGZhbHNlOwogCiAgIHByaXZhdGUgZmluYWwgQ29yZUNvbnRhaW5lciBjb3JlQ29udGFpbmVyOwpAQCAtMjgwLDYgKzI4MywxNCBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyB2b2lkIGFkZENyZWF0ZWRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICBjcmVhdGVkUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgZmluYWwgUHJvcGVydGllcyBnZXRDcmVhdGVkUHJvcGVydGllcygpIHsKKyAgICByZXR1cm4gY3JlYXRlZFByb3BlcnRpZXM7CisgIH0KKwogICBwdWJsaWMgQ2xvdWREZXNjcmlwdG9yIGdldENsb3VkRGVzY3JpcHRvcigpIHsKICAgICByZXR1cm4gY2xvdWREZXNjOwogICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvRGlyZWN0b3J5RmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0RpcmVjdG9yeUZhY3RvcnkuamF2YQppbmRleCBhNWIzMjljLi4yYzFhYTU3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvRGlyZWN0b3J5RmFjdG9yeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9EaXJlY3RvcnlGYWN0b3J5LmphdmEKQEAgLTE2Nyw3ICsxNjcsNiBAQAogICAgKi8KICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZShEaXJlY3RvcnkgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb247CiAgIAotICAKICAgLyoqCiAgICAqIE5vcm1hbGl6ZSBhIGdpdmVuIHBhdGguCiAgICAqIApAQCAtMjI5LDUgKzIyOCwyMSBAQAogICAgIH0KICAgICByZXR1cm4gaXNTdWNjZXNzOwogICB9Ci0gIAorCisgIC8qKgorICAgKiBJZiB5b3VyIGltcGxlbWVudGF0aW9uIGNhbiBjb3VudCBvbiBkZWxldGUtb24tbGFzdC1jbG9zZSBzZW1hbnRpY3MKKyAgICogb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byByZW1vdmUgYSBmaWxlIGluIHVzZSwgcmV0dXJuCisgICAqIGZhbHNlIChlZyBORlMpLiBPdGhlcndpc2UsIHJldHVybiB0cnVlLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgZmFsc2UuCisgICAqIAorICAgKiBAcmV0dXJuIHRydWUgaWYgZmFjdG9yeSBpbXBsIHJlcXVpcmVzIHRoYXQgU2VhcmNoZXIncyBleHBsaWNpdGx5CisgICAqIHJlc2VydmUgY29tbWl0IHBvaW50cy4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHNlYXJjaGVyc1Jlc2VydmVDb21taXRQb2ludHMoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREYXRhSG9tZShDb3JlRGVzY3JpcHRvciBjZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBieSBkZWZhdWx0LCB3ZSBnbyBvZmYgdGhlIGluc3RhbmNlIGRpcmVjdG9yeQorICAgIHJldHVybiBub3JtYWxpemUoU29sclJlc291cmNlTG9hZGVyLm5vcm1hbGl6ZURpcihjZC5nZXRJbnN0YW5jZURpcigpKSArIGNkLmdldERhdGFEaXIoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9FcGhlbWVyYWxEaXJlY3RvcnlGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvRXBoZW1lcmFsRGlyZWN0b3J5RmFjdG9yeS5qYXZhCmluZGV4IDkwNGRiMDcuLmY3ZjU4MDkgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9FcGhlbWVyYWxEaXJlY3RvcnlGYWN0b3J5LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0VwaGVtZXJhbERpcmVjdG9yeUZhY3RvcnkuamF2YQpAQCAtNTEsNCArNTEsMTYgQEAKICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZShTdHJpbmcgcGF0aCkgewogICAgIHJldHVybiB0cnVlOwogICB9CisgIAorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZShEaXJlY3RvcnkgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIHJhbSBkaXIgZG9lcyBub3QgcGVyc2lzdCBpdHMgZGlyIGFueXdoZXJlCisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gcmFtIGRpciBkb2VzIG5vdCBwZXJzaXN0IGl0cyBkaXIgYW55d2hlcmUKKyAgfQorCiB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvSGRmc0RpcmVjdG9yeUZhY3RvcnkuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9IZGZzRGlyZWN0b3J5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWM4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvSGRmc0RpcmVjdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI4OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY29yZTsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5zZWN1cml0eS5Vc2VyR3JvdXBJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTlJUQ2FjaGluZ0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuWmtDb250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb24uRXJyb3JDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLlNvbHJQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLk5hbWVkTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuYmxvY2tjYWNoZS5CbG9ja0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zdG9yZS5ibG9ja2NhY2hlLkJsb2NrRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zdG9yZS5ibG9ja2NhY2hlLkJsb2NrRGlyZWN0b3J5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGUuQnVmZmVyU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGUuQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGUuTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmcy5IZGZzRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkhkZnNVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLklPVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEhkZnNEaXJlY3RvcnlGYWN0b3J5IGV4dGVuZHMgQ2FjaGluZ0RpcmVjdG9yeUZhY3RvcnkgeworICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAuZ2V0TG9nZ2VyKEhkZnNEaXJlY3RvcnlGYWN0b3J5LmNsYXNzKTsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0NLQ0FDSEVfU0xBQl9DT1VOVCA9ICJzb2xyLmhkZnMuYmxvY2tjYWNoZS5zbGFiLmNvdW50IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tDQUNIRV9ESVJFQ1RfTUVNT1JZX0FMTE9DQVRJT04gPSAic29sci5oZGZzLmJsb2NrY2FjaGUuZGlyZWN0Lm1lbW9yeS5hbGxvY2F0aW9uIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tDQUNIRV9FTkFCTEVEID0gInNvbHIuaGRmcy5ibG9ja2NhY2hlLmVuYWJsZWQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS0NBQ0hFX1JFQURfRU5BQkxFRCA9ICJzb2xyLmhkZnMuYmxvY2tjYWNoZS5yZWFkLmVuYWJsZWQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS0NBQ0hFX1dSSVRFX0VOQUJMRUQgPSAic29sci5oZGZzLmJsb2NrY2FjaGUud3JpdGUuZW5hYmxlZCI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOUlRDQUNISU5HRElSRUNUT1JZX0VOQUJMRSA9ICJzb2xyLmhkZnMubnJ0Y2FjaGluZ2RpcmVjdG9yeS5lbmFibGUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOUlRDQUNISU5HRElSRUNUT1JZX01BWE1FUkdFU0laRU1CID0gInNvbHIuaGRmcy5ucnRjYWNoaW5nZGlyZWN0b3J5Lm1heG1lcmdlc2l6ZW1iIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlJUQ0FDSElOR0RJUkVDVE9SWV9NQVhDQUNIRU1CID0gInNvbHIuaGRmcy5ucnRjYWNoaW5nZGlyZWN0b3J5Lm1heGNhY2hlZG1iIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVST0ZCTE9DS1NQRVJCQU5LID0gInNvbHIuaGRmcy5ibG9ja2NhY2hlLmJsb2Nrc3BlcmJhbmsiOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VSQkVST1NfRU5BQkxFRCA9ICJzb2xyLmhkZnMuc2VjdXJpdHkua2VyYmVyb3MuZW5hYmxlZCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFUkJFUk9TX0tFWVRBQiA9ICJzb2xyLmhkZnMuc2VjdXJpdHkua2VyYmVyb3Mua2V5dGFiZmlsZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFUkJFUk9TX1BSSU5DSVBBTCA9ICJzb2xyLmhkZnMuc2VjdXJpdHkua2VyYmVyb3MucHJpbmNpcGFsIjsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhERlNfSE9NRSA9ICJzb2xyLmhkZnMuaG9tZSI7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElSRUNUT1JZID0gInNvbHIuaGRmcy5jb25mZGlyIjsKKyAgCisgIHByaXZhdGUgU29sclBhcmFtcyBwYXJhbXM7CisgIAorICBwcml2YXRlIFN0cmluZyBoZGZzRGF0YURpcjsKKyAgCisgIHByaXZhdGUgU3RyaW5nIGNvbmZEaXI7CisgIAorICBwdWJsaWMgc3RhdGljIE1ldHJpY3MgbWV0cmljczsKKyAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBrZXJiZXJvc0luaXQ7CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdChOYW1lZExpc3QgYXJncykgeworICAgIHBhcmFtcyA9IFNvbHJQYXJhbXMudG9Tb2xyUGFyYW1zKGFyZ3MpOworICAgIHRoaXMuaGRmc0RhdGFEaXIgPSBwYXJhbXMuZ2V0KEhERlNfSE9NRSk7CisgICAgaWYgKHRoaXMuaGRmc0RhdGFEaXIgIT0gbnVsbCAmJiB0aGlzLmhkZnNEYXRhRGlyLmxlbmd0aCgpID09IDApIHsKKyAgICAgIHRoaXMuaGRmc0RhdGFEaXIgPSBudWxsOworICAgIH0KKyAgICBib29sZWFuIGtlcmJlcm9zRW5hYmxlZCA9IHBhcmFtcy5nZXRCb29sKEtFUkJFUk9TX0VOQUJMRUQsIGZhbHNlKTsKKyAgICBMT0cuaW5mbygiU29sciBLZXJiZXJvcyBBdXRoZW50aWNhdGlvbiAiCisgICAgICAgICsgKGtlcmJlcm9zRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKyAgICBpZiAoa2VyYmVyb3NFbmFibGVkKSB7CisgICAgICBpbml0S2VyYmVyb3MoKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgRGlyZWN0b3J5IGNyZWF0ZShTdHJpbmcgcGF0aCwgRGlyQ29udGV4dCBkaXJDb250ZXh0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMT0cuaW5mbygiY3JlYXRpbmcgZGlyZWN0b3J5IGZhY3RvcnkgZm9yIHBhdGgge30iLCBwYXRoKTsKKyAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBnZXRDb25mKCk7CisgICAgCisgICAgaWYgKG1ldHJpY3MgPT0gbnVsbCkgeworICAgICAgbWV0cmljcyA9IG5ldyBNZXRyaWNzKGNvbmYpOworICAgIH0KKyAgICAKKyAgICBib29sZWFuIGJsb2NrQ2FjaGVFbmFibGVkID0gcGFyYW1zLmdldEJvb2woQkxPQ0tDQUNIRV9FTkFCTEVELCB0cnVlKTsKKyAgICBib29sZWFuIGJsb2NrQ2FjaGVSZWFkRW5hYmxlZCA9IHBhcmFtcy5nZXRCb29sKEJMT0NLQ0FDSEVfUkVBRF9FTkFCTEVELAorICAgICAgICB0cnVlKTsKKyAgICBib29sZWFuIGJsb2NrQ2FjaGVXcml0ZUVuYWJsZWQgPSBwYXJhbXMuZ2V0Qm9vbChCTE9DS0NBQ0hFX1dSSVRFX0VOQUJMRUQsIHRydWUpOworICAgIERpcmVjdG9yeSBkaXIgPSBudWxsOworICAgIAorICAgIGlmIChibG9ja0NhY2hlRW5hYmxlZCAmJiBkaXJDb250ZXh0ICE9IERpckNvbnRleHQuTUVUQV9EQVRBKSB7CisgICAgICBpbnQgbnVtYmVyT2ZCbG9ja3NQZXJCYW5rID0gcGFyYW1zLmdldEludChOVU1CRVJPRkJMT0NLU1BFUkJBTkssIDE2Mzg0KTsKKyAgICAgIAorICAgICAgaW50IGJsb2NrU2l6ZSA9IEJsb2NrRGlyZWN0b3J5LkJMT0NLX1NJWkU7CisgICAgICAKKyAgICAgIGludCBiYW5rQ291bnQgPSBwYXJhbXMuZ2V0SW50KEJMT0NLQ0FDSEVfU0xBQl9DT1VOVCwgMSk7CisgICAgICAKKyAgICAgIGJvb2xlYW4gZGlyZWN0QWxsb2NhdGlvbiA9IHBhcmFtcy5nZXRCb29sKAorICAgICAgICAgIEJMT0NLQ0FDSEVfRElSRUNUX01FTU9SWV9BTExPQ0FUSU9OLCB0cnVlKTsKKyAgICAgIAorICAgICAgQmxvY2tDYWNoZSBibG9ja0NhY2hlOworICAgICAgCisgICAgICBpbnQgc2xhYlNpemUgPSBudW1iZXJPZkJsb2Nrc1BlckJhbmsgKiBibG9ja1NpemU7CisgICAgICBMT0cuaW5mbygKKyAgICAgICAgICAiTnVtYmVyIG9mIHNsYWJzIG9mIGJsb2NrIGNhY2hlIFt7fV0gd2l0aCBkaXJlY3QgbWVtb3J5IGFsbG9jYXRpb24gc2V0IHRvIFt7fV0iLAorICAgICAgICAgIGJhbmtDb3VudCwgZGlyZWN0QWxsb2NhdGlvbik7CisgICAgICBMT0cuaW5mbygKKyAgICAgICAgICAiQmxvY2sgY2FjaGUgdGFyZ2V0IG1lbW9yeSB1c2FnZSwgc2xhYiBzaXplIG9mIFt7fV0gd2lsbCBhbGxvY2F0ZSBbe31dIHNsYWJzIGFuZCB1c2Ugflt7fV0gYnl0ZXMiLAorICAgICAgICAgIG5ldyBPYmplY3RbXSB7c2xhYlNpemUsIGJhbmtDb3VudCwKKyAgICAgICAgICAgICAgKChsb25nKSBiYW5rQ291bnQgKiAobG9uZykgc2xhYlNpemUpfSk7CisgICAgICAKKyAgICAgIGludCBfMTAyNFNpemUgPSBwYXJhbXMuZ2V0SW50KCJzb2xyLmhkZnMuYmxvY2tjYWNoZS5idWZmZXJzdG9yZS4xMDI0IiwKKyAgICAgICAgICA4MTkyKTsKKyAgICAgIGludCBfODE5MlNpemUgPSBwYXJhbXMuZ2V0SW50KCJzb2xyLmhkZnMuYmxvY2tjYWNoZS5idWZmZXJzdG9yZS44MTkyIiwKKyAgICAgICAgICA4MTkyKTsKKyAgICAgIAorICAgICAgQnVmZmVyU3RvcmUuaW5pdChfMTAyNFNpemUsIF84MTkyU2l6ZSwgbWV0cmljcyk7CisgICAgICBsb25nIHRvdGFsTWVtb3J5ID0gKGxvbmcpIGJhbmtDb3VudCAqIChsb25nKSBudW1iZXJPZkJsb2Nrc1BlckJhbmsKKyAgICAgICAgICAqIChsb25nKSBibG9ja1NpemU7CisgICAgICB0cnkgeworICAgICAgICBibG9ja0NhY2hlID0gbmV3IEJsb2NrQ2FjaGUobWV0cmljcywgZGlyZWN0QWxsb2NhdGlvbiwgdG90YWxNZW1vcnksCisgICAgICAgICAgICBzbGFiU2l6ZSwgYmxvY2tTaXplKTsKKyAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJUaGUgbWF4IGRpcmVjdCBtZW1vcnkgaXMgbGlrZWx5IHRvbyBsb3cuICBFaXRoZXIgaW5jcmVhc2UgaXQgKGJ5IGFkZGluZyAtWFg6TWF4RGlyZWN0TWVtb3J5U2l6ZT08c2l6ZT5nIC1YWDorVXNlTGFyZ2VQYWdlcyB0byB5b3VyIGNvbnRhaW5lcnMgc3RhcnR1cCBhcmdzKSIKKyAgICAgICAgICAgICAgICArICIgb3IgZGlzYWJsZSBkaXJlY3QgYWxsb2NhdGlvbiB1c2luZyBzb2xyLmhkZnMuYmxvY2tjYWNoZS5kaXJlY3QubWVtb3J5LmFsbG9jYXRpb249ZmFsc2UgaW4gc29scmNvbmZpZy54bWwuIElmIHlvdSBhcmUgcHV0dGluZyB0aGUgYmxvY2sgY2FjaGUgb24gdGhlIGhlYXAsIgorICAgICAgICAgICAgICAgICsgIiB5b3VyIGphdmEgaGVhcCBzaXplIG1pZ2h0IG5vdCBiZSBsYXJnZSBlbm91Z2guIgorICAgICAgICAgICAgICAgICsgIiBGYWlsZWQgYWxsb2NhdGluZyB+IiArIHRvdGFsTWVtb3J5IC8gMTAwMDAwMC4wICsgIiBNQi4iLCBlKTsKKyAgICAgIH0KKyAgICAgIENhY2hlIGNhY2hlID0gbmV3IEJsb2NrRGlyZWN0b3J5Q2FjaGUoYmxvY2tDYWNoZSwgbWV0cmljcyk7CisgICAgICBIZGZzRGlyZWN0b3J5IGhkZnNEaXJlY3RvcnkgPSBuZXcgSGRmc0RpcmVjdG9yeShuZXcgUGF0aChwYXRoKSwgY29uZik7CisgICAgICBkaXIgPSBuZXcgQmxvY2tEaXJlY3RvcnkoInNvbHJjb3JlIiwgaGRmc0RpcmVjdG9yeSwgY2FjaGUsIG51bGwsCisgICAgICAgICAgYmxvY2tDYWNoZVJlYWRFbmFibGVkLCBibG9ja0NhY2hlV3JpdGVFbmFibGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgZGlyID0gbmV3IEhkZnNEaXJlY3RvcnkobmV3IFBhdGgocGF0aCksIGNvbmYpOworICAgIH0KKyAgICAKKyAgICBib29sZWFuIG5ydENhY2hpbmdEaXJlY3RvcnkgPSBwYXJhbXMuZ2V0Qm9vbChOUlRDQUNISU5HRElSRUNUT1JZX0VOQUJMRSwgdHJ1ZSk7CisgICAgaWYgKG5ydENhY2hpbmdEaXJlY3RvcnkpIHsKKyAgICAgIGRvdWJsZSBucnRDYWNoZU1heE1lcmdlU2l6ZU1CID0gcGFyYW1zLmdldEludCgKKyAgICAgICAgICBOUlRDQUNISU5HRElSRUNUT1JZX01BWE1FUkdFU0laRU1CLCAxNik7CisgICAgICBkb3VibGUgbnJ0Q2FjaGVNYXhDYWNoZU1CID0gcGFyYW1zLmdldEludChOUlRDQUNISU5HRElSRUNUT1JZX01BWENBQ0hFTUIsCisgICAgICAgICAgMTkyKTsKKyAgICAgIAorICAgICAgcmV0dXJuIG5ldyBOUlRDYWNoaW5nRGlyZWN0b3J5KGRpciwgbnJ0Q2FjaGVNYXhNZXJnZVNpemVNQiwKKyAgICAgICAgICBucnRDYWNoZU1heENhY2hlTUIpOworICAgIH0KKyAgICByZXR1cm4gZGlyOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXhpc3RzKFN0cmluZyBwYXRoKSB7CisgICAgUGF0aCBoZGZzRGlyUGF0aCA9IG5ldyBQYXRoKHBhdGgpOworICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IGdldENvbmYoKTsKKyAgICBGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBudWxsOworICAgIHRyeSB7CisgICAgICBmaWxlU3lzdGVtID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZShoZGZzRGlyUGF0aC50b1VyaSgpLCBjb25mKTsKKyAgICAgIHJldHVybiBmaWxlU3lzdGVtLmV4aXN0cyhoZGZzRGlyUGF0aCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTE9HLmVycm9yKCJFcnJvciBjaGVja2luZyBpZiBoZGZzIHBhdGggZXhpc3RzIiwgZSk7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgY2hlY2tpbmcgaWYgaGRmcyBwYXRoIGV4aXN0cyIsIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmaWxlU3lzdGVtKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBnZXRDb25mKCkgeworICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgY29uZkRpciA9IHBhcmFtcy5nZXQoQ09ORklHX0RJUkVDVE9SWSwgbnVsbCk7CisgICAgSGRmc1V0aWwuYWRkSGRmc1Jlc291cmNlcyhjb25mLCBjb25mRGlyKTsKKyAgICByZXR1cm4gY29uZjsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZURpcmVjdG9yeShDYWNoZVZhbHVlIGNhY2hlVmFsdWUpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IGdldENvbmYoKTsKKyAgICBGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBudWxsOworICAgIHRyeSB7CisgICAgICBmaWxlU3lzdGVtID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZShuZXcgVVJJKGNhY2hlVmFsdWUucGF0aCksIGNvbmYpOworICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmlsZVN5c3RlbS5kZWxldGUobmV3IFBhdGgoY2FjaGVWYWx1ZS5wYXRoKSwgdHJ1ZSk7CisgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCByZW1vdmUgZGlyZWN0b3J5Iik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPRy5lcnJvcigiQ291bGQgbm90IHJlbW92ZSBkaXJlY3RvcnkiLCBlKTsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsCisgICAgICAgICAgIkNvdWxkIG5vdCByZW1vdmUgZGlyZWN0b3J5IiwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGZpbGVTeXN0ZW0pOworICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHBhdGgpIHsKKyAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKCJoZGZzOi8iKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHNlYXJjaGVyc1Jlc2VydmVDb21taXRQb2ludHMoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERhdGFIb21lKENvcmVEZXNjcmlwdG9yIGNkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChoZGZzRGF0YURpciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLCAiWW91IG11c3Qgc2V0IHRoZSAiCisgICAgICAgICAgKyB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBwYXJhbSAiICsgSERGU19IT01FCisgICAgICAgICAgKyAiIGZvciByZWxhdGl2ZSBkYXRhRGlyIHBhdGhzIHRvIHdvcmsiKTsKKyAgICB9CisgICAgCisgICAgLy8gYnkgZGVmYXVsdCwgd2UgZ28gb2ZmIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkKKyAgICBTdHJpbmcgcGF0aDsKKyAgICBpZiAoY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkgIT0gbnVsbCkgeworICAgICAgcGF0aCA9IFVSTEVuY29kZXIuZW5jb2RlKGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldENvbGxlY3Rpb25OYW1lKCksCisgICAgICAgICAgIlVURi04IikKKyAgICAgICAgICArICIvIgorICAgICAgICAgICsgVVJMRW5jb2Rlci5lbmNvZGUoY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0Q29yZU5vZGVOYW1lKCksCisgICAgICAgICAgICAgICJVVEYtOCIpOworICAgIH0gZWxzZSB7CisgICAgICBwYXRoID0gY2QuZ2V0TmFtZSgpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbm9ybWFsaXplKFNvbHJSZXNvdXJjZUxvYWRlci5ub3JtYWxpemVEaXIoWmtDb250cm9sbGVyCisgICAgICAgIC50cmltTGVhZGluZ0FuZFRyYWlsaW5nU2xhc2hlcyhoZGZzRGF0YURpcikKKyAgICAgICAgKyAiLyIKKyAgICAgICAgKyBwYXRoCisgICAgICAgICsgIi8iCisgICAgICAgICsgY2QuZ2V0RGF0YURpcigpKSk7CisgIH0KKyAgCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZkRpcigpIHsKKyAgICByZXR1cm4gY29uZkRpcjsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGluaXRLZXJiZXJvcygpIHsKKyAgICBTdHJpbmcga2V5dGFiRmlsZSA9IHBhcmFtcy5nZXQoS0VSQkVST1NfS0VZVEFCLCAiIikudHJpbSgpOworICAgIGlmIChrZXl0YWJGaWxlLmxlbmd0aCgpID09IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oS0VSQkVST1NfS0VZVEFCICsgIiByZXF1aXJlZCBiZWNhdXNlICIKKyAgICAgICAgICArIEtFUkJFUk9TX0VOQUJMRUQgKyAiIHNldCB0byB0cnVlIik7CisgICAgfQorICAgIFN0cmluZyBwcmluY2lwYWwgPSBwYXJhbXMuZ2V0KEtFUkJFUk9TX1BSSU5DSVBBTCwgIiIpOworICAgIGlmIChwcmluY2lwYWwubGVuZ3RoKCkgPT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihLRVJCRVJPU19QUklOQ0lQQUwKKyAgICAgICAgICArICIgcmVxdWlyZWQgYmVjYXVzZSAiICsgS0VSQkVST1NfRU5BQkxFRCArICIgc2V0IHRvIHRydWUiKTsKKyAgICB9CisgICAgc3luY2hyb25pemVkIChIZGZzRGlyZWN0b3J5RmFjdG9yeS5jbGFzcykgeworICAgICAgaWYgKGtlcmJlcm9zSW5pdCA9PSBudWxsKSB7CisgICAgICAgIGtlcmJlcm9zSW5pdCA9IG5ldyBCb29sZWFuKHRydWUpOworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25mLnNldCgiaGFkb29wLnNlY3VyaXR5LmF1dGhlbnRpY2F0aW9uIiwgImtlcmJlcm9zIik7CisgICAgICAgIFVzZXJHcm91cEluZm9ybWF0aW9uLnNldENvbmZpZ3VyYXRpb24oY29uZik7CisgICAgICAgIExPRy5pbmZvKAorICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gYWNxdWlyZSBrZXJiZXJvcyB0aWNrZXQgd2l0aCBrZXl0YWI6IHt9LCBwcmluY2lwYWw6IHt9ICIsCisgICAgICAgICAgICBrZXl0YWJGaWxlLCBwcmluY2lwYWwpOworICAgICAgICB0cnkgeworICAgICAgICAgIFVzZXJHcm91cEluZm9ybWF0aW9uLmxvZ2luVXNlckZyb21LZXl0YWIocHJpbmNpcGFsLCBrZXl0YWJGaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgICAgICBMT0cuaW5mbygiR290IEtlcmJlcm9zIHRpY2tldCIpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL0luZGV4RGVsZXRpb25Qb2xpY3lXcmFwcGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvSW5kZXhEZWxldGlvblBvbGljeVdyYXBwZXIuamF2YQppbmRleCAyMWRlMGRiLi4xMWM2NzkzIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvSW5kZXhEZWxldGlvblBvbGljeVdyYXBwZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvSW5kZXhEZWxldGlvblBvbGljeVdyYXBwZXIuamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PEluZGV4Q29tbWl0V3JhcHBlcj4gd3JhcChMaXN0PEluZGV4Q29tbWl0PiBsaXN0KSB7CisgIHByaXZhdGUgTGlzdDxJbmRleENvbW1pdFdyYXBwZXI+IHdyYXAoTGlzdDw/IGV4dGVuZHMgSW5kZXhDb21taXQ+IGxpc3QpIHsKICAgICBMaXN0PEluZGV4Q29tbWl0V3JhcHBlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJbmRleENvbW1pdFdyYXBwZXI+KCk7CiAgICAgZm9yIChJbmRleENvbW1pdCBpbmRleENvbW1pdCA6IGxpc3QpIHJlc3VsdC5hZGQobmV3IEluZGV4Q29tbWl0V3JhcHBlcihpbmRleENvbW1pdCkpOwogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICogSW50ZXJuYWwgdXNlIGZvciBMdWNlbmUuLi4gZG8gbm90IGV4cGxpY2l0bHkgY2FsbC4KICAgICovCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvbkluaXQoTGlzdCBsaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBvbkluaXQoTGlzdDw/IGV4dGVuZHMgSW5kZXhDb21taXQ+IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgTGlzdDxJbmRleENvbW1pdFdyYXBwZXI+IHdyYXBwZXJMaXN0ID0gd3JhcChsaXN0KTsKICAgICBkZWxldGlvblBvbGljeS5vbkluaXQod3JhcHBlckxpc3QpOwogICAgIHVwZGF0ZUNvbW1pdFBvaW50cyh3cmFwcGVyTGlzdCk7CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICogSW50ZXJuYWwgdXNlIGZvciBMdWNlbmUuLi4gZG8gbm90IGV4cGxpY2l0bHkgY2FsbC4KICAgICovCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvbkNvbW1pdChMaXN0IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIG9uQ29tbWl0KExpc3Q8PyBleHRlbmRzIEluZGV4Q29tbWl0PiBsaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIExpc3Q8SW5kZXhDb21taXRXcmFwcGVyPiB3cmFwcGVyTGlzdCA9IHdyYXAobGlzdCk7CiAgICAgZGVsZXRpb25Qb2xpY3kub25Db21taXQod3JhcHBlckxpc3QpOwogICAgIHVwZGF0ZUNvbW1pdFBvaW50cyh3cmFwcGVyTGlzdCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckNvcmUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyQ29yZS5qYXZhCmluZGV4IGNhYzcxMWYuLjQxM2RlYWYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyQ29yZS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyQ29yZS5qYXZhCkBAIC0xOCw4ICsxOCwxMCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uV3JpdGVyOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubmV0LlVSTDsKQEAgLTYyLDYgKzY0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Mb2NrT2J0YWluRmFpbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5DbG91ZERlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5TbGljZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Db21tb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuQ29tbW9uUGFyYW1zLkVjaG9QYXJhbVN0eWxlOwpAQCAtNjcwLDExICs2NzMsMTAgQEAKICAgICBpZiAoZGF0YURpciA9PSBudWxsKSB7CiAgICAgICBpZiAoY2QudXNpbmdEZWZhdWx0RGF0YURpcigpKSBkYXRhRGlyID0gY29uZmlnLmdldERhdGFEaXIoKTsKICAgICAgIGlmIChkYXRhRGlyID09IG51bGwpIHsKLSAgICAgICAgZGF0YURpciA9IGNkLmdldERhdGFEaXIoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkYXRhRGlyID0gY2QuZ2V0RGF0YURpcigpOwogICAgICAgICAgIGlmICghZGlyZWN0b3J5RmFjdG9yeS5pc0Fic29sdXRlKGRhdGFEaXIpKSB7Ci0gICAgICAgICAgICBkYXRhRGlyID0gZGlyZWN0b3J5RmFjdG9yeS5ub3JtYWxpemUoU29sclJlc291cmNlTG9hZGVyCi0gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZURpcihjZC5nZXRJbnN0YW5jZURpcigpKSArIGRhdGFEaXIpOworICAgICAgICAgICAgZGF0YURpciA9IGRpcmVjdG9yeUZhY3RvcnkuZ2V0RGF0YUhvbWUoY2QpOwogICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgbnVsbCwgZSk7CkBAIC03NDUsNyArNzQ3LDYgQEAKICAgICAgIHRoaXMuY29kZWMgPSBpbml0Q29kZWMoc29sckNvbmZpZywgc2NoZW1hKTsKICAgICAgIAogICAgICAgaWYgKHVwZGF0ZUhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICBpbml0RGlyZWN0b3J5RmFjdG9yeSgpOwogICAgICAgICBzb2xyQ29yZVN0YXRlID0gbmV3IERlZmF1bHRTb2xyQ29yZVN0YXRlKGdldERpcmVjdG9yeUZhY3RvcnkoKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBzb2xyQ29yZVN0YXRlID0gdXBkYXRlSGFuZGxlci5nZXRTb2xyQ29yZVN0YXRlKCk7CkBAIC04NDgsMTUgKzg0OSw2MyBAQAogICAgIAogICAgIENvcmVDb250YWluZXIgY2MgPSBjZC5nZXRDb3JlQ29udGFpbmVyKCk7CiAgICAgCisgICAgaWYgKGNjICE9IG51bGwpIHsKKyAgICAgIGlmIChjYy5jZmcgIT0gbnVsbCAmJiBjYy5jZmcgaW5zdGFuY2VvZiBDb25maWdTb2xyWG1sKSB7CisgICAgICAgIHdyaXRlUHJvcEZpbGUoY2QsIGNjKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBpZiAoY2MgIT0gbnVsbCAmJiBjYy5pc1pvb0tlZXBlckF3YXJlKCkgJiYgU2xpY2UuQ09OU1RSVUNUSU9OLmVxdWFscyhjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRTaGFyZFN0YXRlKCkpKSB7CiAgICAgICAvLyBzZXQgdXBkYXRlIGxvZyB0byBidWZmZXIgYmVmb3JlIHB1Ymxpc2hpbmcgdGhlIGNvcmUKICAgICAgIGdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5idWZmZXJVcGRhdGVzKCk7CisgICAgICAKKyAgICAgIGNkLmdldENsb3VkRGVzY3JpcHRvcigpLnNldFNoYXJkU3RhdGUobnVsbCk7CisgICAgICBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5zZXRTaGFyZFJhbmdlKG51bGwpOworICAgICAgCiAgICAgfQogICAgIC8vIEZvciBkZWJ1Z2dpbmcgICAKIC8vICAgIG51bU9wZW5zLmluY3JlbWVudEFuZEdldCgpOwogLy8gICAgb3BlbkhhbmRsZXMucHV0KHRoaXMsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmNsb3NlZCBjb3JlIC0gbmFtZToiICsgZ2V0TmFtZSgpICsgIiByZWZzOiAiICsgcmVmQ291bnQuZ2V0KCkpKTsKICAgfQogCisgIHByaXZhdGUgdm9pZCB3cml0ZVByb3BGaWxlKENvcmVEZXNjcmlwdG9yIGNkLCBDb3JlQ29udGFpbmVyIGNjKSB7CisgICAgRmlsZSBwcm9wRmlsZSA9IG5ldyBGaWxlKGNkLmdldEluc3RhbmNlRGlyKCksICJjb3JlLnByb3BlcnRpZXMiKTsKKyAgICBpZiAoIXByb3BGaWxlLmV4aXN0cygpKSB7CisgICAgICBwcm9wRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgIHByb3BzLnB1dCgibmFtZSIsIGNkLmdldE5hbWUoKSk7CisgICAgICBpZiAoY2MuaXNab29LZWVwZXJBd2FyZSgpKSB7CisgICAgICAgIFN0cmluZyBjb2xsZWN0aW9uID0gY2QuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgIHByb3BzLnB1dCgiY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjb3JlTm9kZU5hbWUgPSBjZC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKTsKKyAgICAgICAgaWYgKGNvcmVOb2RlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvcHMucHV0KCJjb3JlTm9kZU5hbWUiLCBjb3JlTm9kZU5hbWUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByb2xlcyA9IGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldFJvbGVzKCk7CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgcHJvcHMucHV0KCJyb2xlcyIsIHJvbGVzKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc2hhcmRJZCA9IGNkLmdldENsb3VkRGVzY3JpcHRvcigpLmdldFNoYXJkSWQoKTsKKyAgICAgICAgaWYgKHNoYXJkSWQgIT0gbnVsbCkgeworICAgICAgICAgIHByb3BzLnB1dCgic2hhcmQiLCBzaGFyZElkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wRmlsZSk7CisgICAgICAgIHByb3BzLnN0b3JlKG91dCwgIiIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBudWxsLCBlKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KG91dCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgICAKICAgcHJpdmF0ZSBDb2RlYyBpbml0Q29kZWMoU29sckNvbmZpZyBzb2xyQ29uZmlnLCBmaW5hbCBJbmRleFNjaGVtYSBzY2hlbWEpIHsKICAgICBmaW5hbCBQbHVnaW5JbmZvIGluZm8gPSBzb2xyQ29uZmlnLmdldFBsdWdpbkluZm8oQ29kZWNGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgZmluYWwgQ29kZWNGYWN0b3J5IGZhY3Rvcnk7CkBAIC0xMzUyLDYgKzE0MDEsMTAgQEAKICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgb3BlblNlYXJjaGVyTG9jayAtIGRvIG5vdCBjYWxsIHdpdGggc2VhcmNrTG9jayBoZWxkIQogICAgKi8KICAgcHVibGljIFJlZkNvdW50ZWQ8U29sckluZGV4U2VhcmNoZXI+ICBvcGVuTmV3U2VhcmNoZXIoYm9vbGVhbiB1cGRhdGVIYW5kbGVyUmVvcGVucywgYm9vbGVhbiByZWFsdGltZSkgeworICAgIGlmIChpc0Nsb3NlZCgpKSB7IC8vIGNhdGNoIHNvbWUgZXJyb3JzIHF1aWNrZXIKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIm9wZW5OZXdTZWFyY2hlciBjYWxsZWQgb24gY2xvc2VkIGNvcmUiKTsKKyAgICB9CisKICAgICBTb2xySW5kZXhTZWFyY2hlciB0bXA7CiAgICAgUmVmQ291bnRlZDxTb2xySW5kZXhTZWFyY2hlcj4gbmV3ZXN0U2VhcmNoZXIgPSBudWxsOwogICAgIGJvb2xlYW4gbnJ0ID0gc29sckNvbmZpZy5yZW9wZW5SZWFkZXJzICYmIHVwZGF0ZUhhbmRsZXJSZW9wZW5zOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJDb3Jlcy5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJDb3Jlcy5qYXZhCmluZGV4IDJkMWFjZjQuLjVkMzk3OTYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyQ29yZXMuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckNvcmVzLmphdmEKQEAgLTE3LDggKzE3LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLkNsb3VkRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuQ29yZUFkbWluUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJYTUxTZXJpYWxpemVyLlNvbHJDb3JlWE1MRGVmOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkRPTVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTMwLDE1ICs0MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiAKLWltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLkNsb3VkRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sclhNTFNlcmlhbGl6ZXIuU29sckNvcmVYTUxEZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuRE9NVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCiAKIGNsYXNzIFNvbHJDb3JlcyB7CiAgIHByaXZhdGUgc3RhdGljIFNvbHJYTUxTZXJpYWxpemVyIFNPTFJfWE1MX1NFUklBTElaRVIgPSBuZXcgU29sclhNTFNlcmlhbGl6ZXIoKTsKQEAgLTk5LDcwICsxMDAsMzQgQEAKICAgLy8gV2UgYXJlIHNodXR0aW5nIGRvd24uIFlvdSBjYW4ndCBob2xkIHRoZSBsb2NrIG9uIHRoZSB2YXJpb3VzIGxpc3RzIG9mIGNvcmVzIHdoaWxlIHRoZXkgc2h1dCBkb3duLCBzbyB3ZSBuZWVkIHRvCiAgIC8vIG1ha2UgYSB0ZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZXMgYW5kIHNodXQgdGhlbSBkb3duIG91dHNpZGUgdGhlIGxvY2suCiAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKCkgewotICAgIExpc3Q8U3RyaW5nPiBjb3JlTmFtZXM7Ci0gICAgTGlzdDxTdHJpbmc+IHRyYW5zaWVudE5hbWVzOwotICAgIExpc3Q8U29sckNvcmU+IHBlbmRpbmdUb0Nsb3NlOworICAgIENvbGxlY3Rpb248U29sckNvcmU+IGNvcmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTb2xyQ29yZT4oKTsKIAogICAgIC8vIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIGZvciBvbmUgb2YgdGhlIGNvcmVzIHRvIG1vdmUgZnJvbSBvbmUgbGlzdCB0byBhbm90aGVyIHdoaWxlIHdlJ3JlIGNsb3NpbmcgdGhlbS4gU28KICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGxpc3RzIHVudGlsIHRoZXkncmUgYWxsIGVtcHR5LiBJbiBwYXJ0aWN1bGFyLCB0aGUgY29yZSBjb3VsZCBoYXZlIG1vdmVkIGZyb20gdGhlIHRyYW5zaWVudAogICAgIC8vIGxpc3QgdG8gdGhlIHBlbmRpbmdDbG9zZXMgbGlzdC4KIAotICAgIHdoaWxlICh0cnVlKSB7CisgICAgZG8geworICAgICAgY29yZUxpc3QuY2xlYXIoKTsKICAgICAgIHN5bmNocm9uaXplZCAobW9kaWZ5TG9jaykgewotICAgICAgICBjb3JlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oY29yZXMua2V5U2V0KCkpOwotICAgICAgICB0cmFuc2llbnROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0cmFuc2llbnRDb3Jlcy5rZXlTZXQoKSk7Ci0gICAgICAgIHBlbmRpbmdUb0Nsb3NlID0gbmV3IEFycmF5TGlzdDxTb2xyQ29yZT4ocGVuZGluZ0Nsb3Nlcyk7CisgICAgICAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBjb3JlcyB0aGVuIGNsZWFyIHRoZSBtYXAgc28gdGhlIGNvcmUgaXNuJ3QgaGFuZGVkIG91dCB0byBhIHJlcXVlc3QgYWdhaW4KKyAgICAgICAgY29yZUxpc3QuYWRkQWxsKGNvcmVzLnZhbHVlcygpKTsKKyAgICAgICAgY29yZXMuY2xlYXIoKTsKKworICAgICAgICBjb3JlTGlzdC5hZGRBbGwodHJhbnNpZW50Q29yZXMudmFsdWVzKCkpOworICAgICAgICB0cmFuc2llbnRDb3Jlcy5jbGVhcigpOworCisgICAgICAgIGNvcmVMaXN0LmFkZEFsbChwZW5kaW5nQ2xvc2VzKTsKKyAgICAgICAgcGVuZGluZ0Nsb3Nlcy5jbGVhcigpOwogICAgICAgfQogCi0gICAgICBpZiAoY29yZU5hbWVzLnNpemUoKSA9PSAwICYmIHRyYW5zaWVudE5hbWVzLnNpemUoKSA9PSAwICYmIHBlbmRpbmdUb0Nsb3NlLnNpemUoKSA9PSAwKSBicmVhazsKLQotICAgICAgZm9yIChTdHJpbmcgY29yZU5hbWUgOiBjb3JlTmFtZXMpIHsKLSAgICAgICAgU29sckNvcmUgY29yZSA9IGNvcmVzLmdldChjb3JlTmFtZSk7Ci0gICAgICAgIGlmIChjb3JlID09IG51bGwpIHsKLSAgICAgICAgICBDb3JlQ29udGFpbmVyLmxvZy5pbmZvKCJDb3JlICIgKyBjb3JlTmFtZSArICIgbW92ZWQgZnJvbSBjb3JlIGNvbnRhaW5lciBsaXN0IGJlZm9yZSBjbG9zaW5nLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3JlLmNsb3NlKCk7Ci0gICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIFNvbHJFeGNlcHRpb24ubG9nKENvcmVDb250YWluZXIubG9nLCAiRXJyb3Igc2h1dHRpbmcgZG93biBjb3JlIiwgdCk7Ci0gICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9kaWZ5TG9jaykgewotICAgICAgICAgICAgICBjb3Jlcy5yZW1vdmUoY29yZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKFN0cmluZyBjb3JlTmFtZSA6IHRyYW5zaWVudE5hbWVzKSB7Ci0gICAgICAgIFNvbHJDb3JlIGNvcmUgPSB0cmFuc2llbnRDb3Jlcy5nZXQoY29yZU5hbWUpOwotICAgICAgICBpZiAoY29yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgQ29yZUNvbnRhaW5lci5sb2cuaW5mbygiQ29yZSAiICsgY29yZU5hbWUgKyAiIG1vdmVkIGZyb20gdHJhbnNpZW50IGNvcmUgY29udGFpbmVyIGxpc3QgYmVmb3JlIGNsb3NpbmcuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUuY2xvc2UoKTsKLSAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgU29sckV4Y2VwdGlvbi5sb2coQ29yZUNvbnRhaW5lci5sb2csICJFcnJvciBzaHV0dGluZyBkb3duIGNvcmUiLCB0KTsKLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtb2RpZnlMb2NrKSB7Ci0gICAgICAgICAgICAgIHRyYW5zaWVudENvcmVzLnJlbW92ZShjb3JlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgc29tZSBjb3JlcyB0aGF0IHdlIHdlcmUgX3RoaW5raW5nXyBhYm91dCBzaHV0dGluZyBkb3duLCBzbyB0YWtlIGNhcmUgb2YgdGhvc2UgdG9vLgotICAgICAgZm9yIChTb2xyQ29yZSBjb3JlIDogcGVuZGluZ1RvQ2xvc2UpIHsKKyAgICAgIGZvciAoU29sckNvcmUgY29yZSA6IGNvcmVMaXN0KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgY29yZS5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgICAgIFNvbHJFeGNlcHRpb24ubG9nKENvcmVDb250YWluZXIubG9nLCAiRXJyb3Igc2h1dHRpbmcgZG93biBjb3JlIiwgdCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgc3luY2hyb25pemVkIChtb2RpZnlMb2NrKSB7Ci0gICAgICAgICAgICBwZW5kaW5nQ2xvc2VzLnJlbW92ZShjb3JlKTsKLSAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9CisgICAgfSB3aGlsZSAoY29yZUxpc3Quc2l6ZSgpID4gMCk7CiAgIH0KIAogICAvL1dBUk5JTkchIFRoaXMgc2hvdWxkIGJlIHRoZSBfb25seV8gcGxhY2UgeW91IHB1dCBhbnl0aGluZyBpbnRvIHRoZSBsaXN0IG9mIHRyYW5zaWVudCBjb3JlcyEKQEAgLTI0NiwxMCArMjExLDE4IEBACiAgICAgc3luY2hyb25pemVkIChtb2RpZnlMb2NrKSB7CiAgICAgICBTb2xyQ29yZSBjMCA9IGNvcmVzLmdldChuMCk7CiAgICAgICBTb2xyQ29yZSBjMSA9IGNvcmVzLmdldChuMSk7Ci0gICAgICBpZiAoYzAgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuQkFEX1JFUVVFU1QsICJObyBzdWNoIGNvcmU6ICIgKyBuMCk7Ci0gICAgICBpZiAoYzEgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuQkFEX1JFUVVFU1QsICJObyBzdWNoIGNvcmU6ICIgKyBuMSk7CisgICAgICBpZiAoYzAgPT0gbnVsbCkgeyAvLyBNaWdodCBiZSBhbiB1bmxvYWRlZCB0cmFuc2llbnQgY29yZQorICAgICAgICBjMCA9IGNvbnRhaW5lci5nZXRDb3JlKG4wKTsKKyAgICAgICAgaWYgKGMwID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5CQURfUkVRVUVTVCwgIk5vIHN1Y2ggY29yZTogIiArIG4wKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGMxID09IG51bGwpIHsgLy8gTWlnaHQgYmUgYW4gdW5sb2FkZWQgdHJhbnNpZW50IGNvcmUKKyAgICAgICAgYzEgPSBjb250YWluZXIuZ2V0Q29yZShuMSk7CisgICAgICAgIGlmIChjMSA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuQkFEX1JFUVVFU1QsICJObyBzdWNoIGNvcmU6ICIgKyBuMSk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIGNvcmVzLnB1dChuMCwgYzEpOwogICAgICAgY29yZXMucHV0KG4xLCBjMCk7CiAKQEAgLTI5OSwyMCArMjcyLDIwIEBACiAgICAgfQogICB9CiAKLSAgcHJvdGVjdGVkIFNvbHJDb3JlIGdldENvcmVGcm9tQW55TGlzdChTdHJpbmcgbmFtZSkgewotICAgIFNvbHJDb3JlIGNvcmU7Ci0KKyAgLyogSWYgeW91IGRvbid0IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LCBzb21lb25lIGNvdWxkIGNsb3NlIHRoZSBjb3JlIGJlZm9yZSB5b3UgdXNlIGl0LiAqLworICBwcm90ZWN0ZWQgU29sckNvcmUgIGdldENvcmVGcm9tQW55TGlzdChTdHJpbmcgbmFtZSwgYm9vbGVhbiBpbmNSZWZDb3VudCkgewogICAgIHN5bmNocm9uaXplZCAobW9kaWZ5TG9jaykgewotICAgICAgY29yZSA9IGNvcmVzLmdldChuYW1lKTsKLSAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGNvcmU7CisgICAgICBTb2xyQ29yZSBjb3JlID0gY29yZXMuZ2V0KG5hbWUpOworCisgICAgICBpZiAoY29yZSA9PSBudWxsKSB7CisgICAgICAgIGNvcmUgPSB0cmFuc2llbnRDb3Jlcy5nZXQobmFtZSk7CiAgICAgICB9CiAKLSAgICAgIGlmIChkeW5hbWljRGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vYm9keSBldmVuIHRyaWVkIHRvIGRlZmluZSBhbnkgdHJhbnNpZW50IGNvcmVzLCBzbyB3ZSdyZSBkb25lLgorICAgICAgaWYgKGNvcmUgIT0gbnVsbCAmJiBpbmNSZWZDb3VudCkgeworICAgICAgICBjb3JlLm9wZW4oKTsKICAgICAgIH0KLSAgICAgIC8vIE5vdyBsb29rIGZvciBhbHJlYWR5IGxvYWRlZCB0cmFuc2llbnQgY29yZXMuCi0gICAgICByZXR1cm4gdHJhbnNpZW50Q29yZXMuZ2V0KG5hbWUpOworCisgICAgICByZXR1cm4gY29yZTsKICAgICB9CiAgIH0KIApAQCAtMzUxLDE1ICszMjQsMTcgQEAKICAgICAgIHJldHVybiBjb3JlVG9PcmlnTmFtZS5nZXQoc29sckNvcmUpOwogICAgIH0KICAgfQotICAKKwogICBwdWJsaWMgdm9pZCBwZXJzaXN0Q29yZXMoQ29uZmlnIGNmZywgUHJvcGVydGllcyBjb250YWluZXJQcm9wZXJ0aWVzLAogICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IHJvb3RTb2xyQXR0cmlicywgTWFwPFN0cmluZyxTdHJpbmc+IGNvcmVzQXR0cmlicywKLSAgICAgIEZpbGUgZmlsZSwgRmlsZSBjb25maWdGaWxlLCBTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyKSB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9nZ2luZ0F0dHJpYnMsIE1hcDxTdHJpbmcsU3RyaW5nPiB3YXRjaGVyQXR0cmlicywKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc2hhcmRIYW5kbGVyQXR0cmliLCBNYXA8U3RyaW5nLFN0cmluZz4gc2hhcmRIYW5kbGVyUHJvcHMsCisgICAgICBGaWxlIGZpbGUsIFNvbHJSZXNvdXJjZUxvYWRlciBsb2FkZXIpIHRocm93cyBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24gewogCi0gICAgCisKICAgICBMaXN0PFNvbHJYTUxTZXJpYWxpemVyLlNvbHJDb3JlWE1MRGVmPiBzb2xyQ29yZVhNTERlZnMgPSBuZXcgQXJyYXlMaXN0PFNvbHJYTUxTZXJpYWxpemVyLlNvbHJDb3JlWE1MRGVmPigpOwogICAgIHN5bmNocm9uaXplZCAobW9kaWZ5TG9jaykgewotICAgICAgCisKICAgICAgIHBlcnNpc3RDb3JlcyhjZmcsIGNvcmVzLCBsb2FkZXIsIHNvbHJDb3JlWE1MRGVmcyk7CiAgICAgICBwZXJzaXN0Q29yZXMoY2ZnLCB0cmFuc2llbnRDb3JlcywgbG9hZGVyLCBzb2xyQ29yZVhNTERlZnMpOwogICAgICAgLy8gYWRkIGJhY2sgYWxsIHRoZSBjb3JlcyB0aGF0IGFyZW4ndCBsb2FkZWQsIGVpdGhlciBpbiBjb3JlcyBvciB0cmFuc2llbnQKQEAgLTM4NCw5ICszNTksMTMgQEAKICAgICAgIHNvbHJYTUxEZWYuY29udGFpbmVyUHJvcGVydGllcyA9IGNvbnRhaW5lclByb3BlcnRpZXM7CiAgICAgICBzb2xyWE1MRGVmLnNvbHJBdHRyaWJzID0gcm9vdFNvbHJBdHRyaWJzOwogICAgICAgc29sclhNTERlZi5jb3Jlc0F0dHJpYnMgPSBjb3Jlc0F0dHJpYnM7CisgICAgICBzb2xyWE1MRGVmLmxvZ2dpbmdBdHRyaWJzID0gbG9nZ2luZ0F0dHJpYnM7CisgICAgICBzb2xyWE1MRGVmLndhdGNoZXJBdHRyaWJzID0gd2F0Y2hlckF0dHJpYnM7CisgICAgICBzb2xyWE1MRGVmLnNoYXJkSGFuZGxlckF0dHJpYnMgPSBzaGFyZEhhbmRsZXJBdHRyaWI7CisgICAgICBzb2xyWE1MRGVmLnNoYXJkSGFuZGxlclByb3BzID0gc2hhcmRIYW5kbGVyUHJvcHM7CiAgICAgICBTT0xSX1hNTF9TRVJJQUxJWkVSLnBlcnNpc3RGaWxlKGZpbGUsIHNvbHJYTUxEZWYpOwogICAgIH0KLSAgICAKKwogICB9CiAgIC8vIFdhaXQgaGVyZSB1bnRpbCBhbnkgcGVuZGluZyBvcGVyYXRpb25zIChsb2FkLCB1bmxvYWQgb3IgcmVsb2FkKSBhcmUgY29tcGxldGVkIG9uIHRoaXMgY29yZS4KICAgcHJvdGVjdGVkIFNvbHJDb3JlIHdhaXRBZGRQZW5kaW5nQ29yZU9wcyhTdHJpbmcgbmFtZSkgewpAQCAtNDE5LDcgKzM5OCw3IEBACiAgICAgICAgIGlmICghIHBlbmRpbmdDb3JlT3BzLmFkZChuYW1lKSkgewogICAgICAgICAgIENvcmVDb250YWluZXIubG9nLndhcm4oIlJlcGxhY2VkIGFuIGVudHJ5IGluIHBlbmRpbmdDb3JlT3BzIHt9LCB3ZSBzaG91bGQgbm90IGJlIGRvaW5nIHRoaXMiLCBuYW1lKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0Q29yZUZyb21BbnlMaXN0KG5hbWUpOyAvLyB3ZSBtaWdodCBoYXZlIGJlZW4gX3VubG9hZGluZ18gdGhlIGNvcmUsIHNvIHJldHVybiB0aGUgY29yZSBpZiBpdCB3YXMgbG9hZGVkLgorICAgICAgICByZXR1cm4gZ2V0Q29yZUZyb21BbnlMaXN0KG5hbWUsIGZhbHNlKTsgLy8gd2UgbWlnaHQgaGF2ZSBiZWVuIF91bmxvYWRpbmdfIHRoZSBjb3JlLCBzbyByZXR1cm4gdGhlIGNvcmUgaWYgaXQgd2FzIGxvYWRlZC4KICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGw7CkBAIC00NDIsOTUgKzQyMSwxNjIgQEAKICAgICAgIGFkZENvcmVUb1BlcnNpc3RMaXN0KGNmZywgbG9hZGVyLCBzb2xyQ29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLCBnZXRDb3JlVG9PcmlnTmFtZShzb2xyQ29yZSksIHNvbHJDb3JlWE1MRGVmcyk7CiAgICAgfQogICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkQ29yZVByb3BlcnR5KE1hcDxTdHJpbmcsU3RyaW5nPiBjb3JlQXR0cmlicywgU29sclJlc291cmNlTG9hZGVyIGxvYWRlciwgTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwKKworICBwcml2YXRlIHZvaWQgYWRkQ29yZVByb3BlcnR5KE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wTWFwLCBTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyLCBOb2RlIG5vZGUsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgeworICAgIGFkZENvcmVQcm9wZXJ0eShwcm9wTWFwLCBsb2FkZXIsIG5vZGUsIG5hbWUsIHZhbHVlLCBudWxsKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRDb3JlUHJvcGVydHkoTWFwPFN0cmluZyxTdHJpbmc+IHByb3BNYXAsIFNvbHJSZXNvdXJjZUxvYWRlciBsb2FkZXIsIE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsCiAgICAgICBTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICAKKwogICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgIGNvcmVBdHRyaWJzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICBwcm9wTWFwLnB1dChuYW1lLCB2YWx1ZSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIAorCiAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICAgU3RyaW5nIHJhd0F0dHJpYlZhbHVlID0gRE9NVXRpbC5nZXRBdHRyKG5vZGUsIG5hbWUsIG51bGwpOwogCisgICAgICBpZiAocmF3QXR0cmliVmFsdWUgPT0gbnVsbCkgeworICAgICAgICByZXR1cm47IC8vIEl0IHdhcyBuZXZlciBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4KKyAgICAgIH0KKwogICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgY29yZUF0dHJpYnMucHV0KG5hbWUsIHJhd0F0dHJpYlZhbHVlKTsKKyAgICAgICAgcHJvcE1hcC5wdXQobmFtZSwgcmF3QXR0cmliVmFsdWUpOwogICAgICAgICByZXR1cm47CiAgICAgICB9Ci0gICAgICBpZiAocmF3QXR0cmliVmFsdWUgPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgeworCisgICAgICAvLyBUaGVyZSBhcmUgc29tZSBfcmVhbGx5IHN0dXBpZF8gYWRkaXRpb25zL3N1YnRyYWN0aW9ucyBvZiB0aGUgc2xhc2ggdGhhdCB3ZSBzaG91bGQgbG9vayBvdXQgZm9yLiBJJ20gKEVPRSkKKyAgICAgIC8vIGFzaGFtZWQgb2YgdGhpcyBidXQgaXQgZml4ZXMgc29tZSB0aGluZ3MgYW5kIHdlJ3JlIHRocm93aW5nIHBlcnNpc3RlbmNlIGF3YXkgYW55d2F5IChhbHRob3VnaAorICAgICAgLy8gbWF5YmUgbm90IGZvciBjb3JlLnByb3BlcnRpZXMgZmlsZXMpLgorICAgICAgU3RyaW5nIGRlZkNvbXAgPSByZWd1bGFyaXplQXR0cihkZWZhdWx0VmFsdWUpOworCisgICAgICBpZiAoZGVmQ29tcCAhPSBudWxsICYmIHJlZ3VsYXJpemVBdHRyKHZhbHVlKS5lcXVhbHMoZGVmQ29tcCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQotICAgICAgaWYgKHJhd0F0dHJpYlZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKERPTVV0aWwuc3Vic3RpdHV0ZVByb3BlcnR5KHJhd0F0dHJpYlZhbHVlLCBsb2FkZXIuZ2V0Q29yZVByb3BlcnRpZXMoKSkpKXsKLSAgICAgICAgY29yZUF0dHJpYnMucHV0KG5hbWUsIHJhd0F0dHJpYlZhbHVlKTsKKyAgICAgIFN0cmluZyByYXdDb21wID0gcmVndWxhcml6ZUF0dHIocmF3QXR0cmliVmFsdWUpOworICAgICAgaWYgKHJhd0NvbXAgIT0gbnVsbCAmJiByZWd1bGFyaXplQXR0cih2YWx1ZSkuZXF1YWxzKAorICAgICAgICAgIHJlZ3VsYXJpemVBdHRyKERPTVV0aWwuc3Vic3RpdHV0ZVByb3BlcnR5KHJhd0F0dHJpYlZhbHVlLCBsb2FkZXIuZ2V0Q29yZVByb3BlcnRpZXMoKSkpKSkgeworICAgICAgICBwcm9wTWFwLnB1dChuYW1lLCByYXdBdHRyaWJWYWx1ZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjb3JlQXR0cmlicy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICBwcm9wTWFwLnB1dChuYW1lLCB2YWx1ZSk7CiAgICAgICB9CiAgICAgfQotCiAgIH0KIAorICBwcm90ZWN0ZWQgU3RyaW5nIHJlZ3VsYXJpemVBdHRyKFN0cmluZyBwYXRoKSB7CisgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgIHJldHVybiBudWxsOworICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICBpZiAocGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7CisgICAgfQorICAgIHJldHVybiBwYXRoOworICB9CiAgIHByb3RlY3RlZCB2b2lkIGFkZENvcmVUb1BlcnNpc3RMaXN0KENvbmZpZyBjZmcsIFNvbHJSZXNvdXJjZUxvYWRlciBsb2FkZXIsCiAgICAgICBDb3JlRGVzY3JpcHRvciBkY29yZSwgU3RyaW5nIG9yaWdDb3JlTmFtZSwKICAgICAgIExpc3Q8U29sckNvcmVYTUxEZWY+IHNvbHJDb3JlWE1MRGVmcykgdGhyb3dzIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgU3RyaW5nIGNvcmVOYW1lID0gZGNvcmUuZ2V0UHJvcGVydHkoQ29yZURlc2NyaXB0b3IuQ09SRV9OQU1FKTsKLSAgICAKKwogICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBjb3JlQXR0cmlicyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgUHJvcGVydGllcyBuZXdQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKLSAgICBDbG91ZERlc2NyaXB0b3IgY2QgPSBkY29yZS5nZXRDbG91ZERlc2NyaXB0b3IoKTsKLSAgICBTdHJpbmcgY29sbGVjdGlvbiA9IG51bGw7Ci0gICAgaWYgKGNkICE9IG51bGwpIGNvbGxlY3Rpb24gPSBjZC5nZXRDb2xsZWN0aW9uTmFtZSgpOworICAgIC8vIFRoaXMgaXMgc2ltcGxlLCBqdXN0IHRha2UgYW55dGhpbmcgc2VudCBpbiBhbmQgc2F2ZWQgYXdheSBpbiBhdCBjb3JlIGNyZWF0aW9uIGFuZCB3cml0ZSBpdCBvdXQuCisgICAgaWYgKGRjb3JlLmdldENyZWF0ZWRQcm9wZXJ0aWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0ZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoQ29yZURlc2NyaXB0b3Iuc3RhbmRhcmRQcm9wTmFtZXMpKTsKKyAgICAgIGNvcmVBdHRyaWJzLnB1dChDb3JlRGVzY3JpcHRvci5DT1JFX05BTUUsIGRjb3JlLmdldE5hbWUoKSk7IC8vIE5PVEU6IG1heSBoYXZlIGJlZW4gc3dhcHBlZCBvciByZW5hbWVkIQorICAgICAgZm9yIChTdHJpbmcga2V5IDogZGNvcmUuZ2V0Q3JlYXRlZFByb3BlcnRpZXMoKS5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgaWYgKCEgc3RkTmFtZXMuY29udGFpbnMoa2V5KSAmJiAhIGtleS5zdGFydHNXaXRoKENvcmVBZG1pblBhcmFtcy5QUk9QRVJUWV9QUkVGSVgpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGtleS5pbmRleE9mKENvcmVBZG1pblBhcmFtcy5QUk9QRVJUWV9QUkVGSVgpID09IDApIHsKKyAgICAgICAgICBuZXdQcm9wcy5wdXQoa2V5LnN1YnN0cmluZyhDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYLmxlbmd0aCgpKSwgZGNvcmUuZ2V0Q3JlYXRlZFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgICAgfSBlbHNlIGlmICghIENvcmVEZXNjcmlwdG9yLkNPUkVfTkFNRS5lcXVhbHMoa2V5KSkgeworICAgICAgICAgIGNvcmVBdHRyaWJzLnB1dChrZXksIGRjb3JlLmdldENyZWF0ZWRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoa2V5KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEluc3VyZSBpbnN0ZGlyIGlzIHBlcnNpc3RlZCBpZiBpdCdzIHRoZSBkZWZhdWx0IHNpbmNlIGl0J3MgY2hlY2tlZCBhdCBzdGFydHVwIGV2ZW4gaWYgbm90IHNwZWNpZmllZCBvbiB0aGUKKyAgICAgIC8vIGNyZWF0ZSBjb21tYW5kLgorICAgICAgaWYgKCEgZGNvcmUuZ2V0Q3JlYXRlZFByb3BlcnRpZXMoKS5jb250YWluc0tleShDb3JlRGVzY3JpcHRvci5DT1JFX0lOU1RESVIpKSB7CisgICAgICAgIGNvcmVBdHRyaWJzLnB1dChDb3JlRGVzY3JpcHRvci5DT1JFX0lOU1RESVIsIGRjb3JlLmdldFJhd0luc3RhbmNlRGlyKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CiAKLSAgICBpZiAob3JpZ0NvcmVOYW1lID09IG51bGwpIHsKLSAgICAgIG9yaWdDb3JlTmFtZSA9IGNvcmVOYW1lOworICAgICAgU3RyaW5nIGNvcmVOYW1lID0gZGNvcmUuZ2V0UHJvcGVydHkoQ29yZURlc2NyaXB0b3IuQ09SRV9OQU1FKTsKKworICAgICAgQ2xvdWREZXNjcmlwdG9yIGNkID0gZGNvcmUuZ2V0Q2xvdWREZXNjcmlwdG9yKCk7CisgICAgICBTdHJpbmcgY29sbGVjdGlvbiA9IG51bGw7CisgICAgICBpZiAoY2QgIT0gbnVsbCkgY29sbGVjdGlvbiA9IGNkLmdldENvbGxlY3Rpb25OYW1lKCk7CisKKyAgICAgIGlmIChvcmlnQ29yZU5hbWUgPT0gbnVsbCkgeworICAgICAgICBvcmlnQ29yZU5hbWUgPSBjb3JlTmFtZTsKKyAgICAgIH0KKworICAgICAgTm9kZSBub2RlID0gbnVsbDsKKyAgICAgIGlmIChjZmcgIT0gbnVsbCkgeworICAgICAgICBub2RlID0gY2ZnLmdldE5vZGUoIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9JyIgKyBvcmlnQ29yZU5hbWUgKyAiJ10iLAorICAgICAgICAgICAgZmFsc2UpOworICAgICAgfQorCisgICAgICBjb3JlQXR0cmlicy5wdXQoQ29yZURlc2NyaXB0b3IuQ09SRV9OQU1FLCBjb3JlTmFtZSk7CisgICAgICAvL2NvcmVBdHRyaWJzLnB1dChDb3JlRGVzY3JpcHRvci5DT1JFX0lOU1RESVIsIGRjb3JlLmdldFJhd0luc3RhbmNlRGlyKCkpOworICAgICAgYWRkQ29yZVByb3BlcnR5KGNvcmVBdHRyaWJzLCBsb2FkZXIsIG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfSU5TVERJUiwgZGNvcmUuZ2V0UmF3SW5zdGFuY2VEaXIoKSwgbnVsbCk7CisKKyAgICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0NPTExFQ1RJT04sCisgICAgICAgICAgU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiBkY29yZS5nZXROYW1lKCkpOworCisgICAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9EQVRBRElSLAorICAgICAgICAgIGRjb3JlLmdldERhdGFEaXIoKSk7CisgICAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9VTE9HRElSLAorICAgICAgICAgIGRjb3JlLmdldFVsb2dEaXIoKSk7CisgICAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9UUkFOU0lFTlQsCisgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhkY29yZS5pc1RyYW5zaWVudCgpKSk7CisgICAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9MT0FET05TVEFSVFVQLAorICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoZGNvcmUuaXNMb2FkT25TdGFydHVwKCkpKTsKKyAgICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0NPTkZJRywKKyAgICAgICAgICBkY29yZS5nZXRDb25maWdOYW1lKCkpOworICAgICAgYWRkQ29yZVByb3BlcnR5KGNvcmVBdHRyaWJzLCBsb2FkZXIsIG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfU0NIRU1BLAorICAgICAgICAgIGRjb3JlLmdldFNjaGVtYU5hbWUoKSk7CisKKyAgICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0NPTExFQ1RJT04sCisgICAgICAgICAgY29sbGVjdGlvbiwgZGNvcmUuZ2V0TmFtZSgpKTsKKworICAgICAgU3RyaW5nIHNoYXJkID0gbnVsbDsKKyAgICAgIFN0cmluZyByb2xlcyA9IG51bGw7CisgICAgICBTdHJpbmcgbm9kZV9uYW1lID0gbnVsbDsKKyAgICAgIGlmIChjZCAhPSBudWxsKSB7CisgICAgICAgIHNoYXJkID0gY2QuZ2V0U2hhcmRJZCgpOworICAgICAgICByb2xlcyA9IGNkLmdldFJvbGVzKCk7CisgICAgICAgIG5vZGVfbmFtZSA9IGNkLmdldENvcmVOb2RlTmFtZSgpOworICAgICAgfQorICAgICAgYWRkQ29yZVByb3BlcnR5KGNvcmVBdHRyaWJzLCBsb2FkZXIsIG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfU0hBUkQsCisgICAgICAgICAgc2hhcmQpOworCisgICAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9ST0xFUywKKyAgICAgICAgICByb2xlcyk7CisKKyAgICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX05PREVfTkFNRSwKKyAgICAgICAgICBub2RlX25hbWUpOworCisKKyAgICAgIGZvciAoT2JqZWN0IGtleSA6IGRjb3JlLmdldENvcmVQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKKworICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHsKKyAgICAgICAgICBOb2RlIHByb3BOb2RlID0gY2ZnLmdldE5vZGUoIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9JyIgKyBvcmlnQ29yZU5hbWUgKyAiJ10vcHJvcGVydHlbQG5hbWU9JyIgKyBrZXkgKyAiJ10iLAorICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgICBpZiAocHJvcE5vZGUgIT0gbnVsbCkgeyAvLyBUaGlzIG1lYW5zIGl0IHdhcyBpbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQsIHNvIGp1c3QgY29weSBpdC4KKyAgICAgICAgICAgIG5ld1Byb3BzLnB1dChET01VdGlsLmdldEF0dHIocHJvcE5vZGUsICJuYW1lIiwgbnVsbCksIERPTVV0aWwuZ2V0QXR0cihwcm9wTm9kZSwgInZhbHVlIiwgbnVsbCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICAKLSAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBkY29yZS5nZXRDb3JlUHJvcGVydGllcygpOwotICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgaWYgKGNmZyAhPSBudWxsKSB7Ci0gICAgICBub2RlID0gY2ZnLmdldE5vZGUoIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9JyIgKyBvcmlnQ29yZU5hbWUgKyAiJ10iLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgY29yZUF0dHJpYnMucHV0KENvcmVEZXNjcmlwdG9yLkNPUkVfTkFNRSwgY29yZU5hbWUpOwotICAgIAotICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0lOU1RESVIsIGRjb3JlLmdldFJhd0luc3RhbmNlRGlyKCksIG51bGwpOwogCi0gICAgY29yZUF0dHJpYnMucHV0KENvcmVEZXNjcmlwdG9yLkNPUkVfQ09MTEVDVElPTiwKLSAgICAgICAgU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiBkY29yZS5nZXROYW1lKCkpOwotICAgIAotICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0RBVEFESVIsIGRjb3JlLmdldERhdGFEaXIoKSwgbnVsbCk7Ci0gICAgYWRkQ29yZVByb3BlcnR5KGNvcmVBdHRyaWJzLCBsb2FkZXIsIG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfVUxPR0RJUiwgZGNvcmUuZ2V0VWxvZ0RpcigpLCBudWxsKTsKLSAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9UUkFOU0lFTlQsIEJvb2xlYW4udG9TdHJpbmcoZGNvcmUuaXNUcmFuc2llbnQoKSksIG51bGwpOwotICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX0xPQURPTlNUQVJUVVAsIEJvb2xlYW4udG9TdHJpbmcoZGNvcmUuaXNMb2FkT25TdGFydHVwKCkpLCBudWxsKTsKLSAgICAKLSAgICBhZGRDb3JlUHJvcGVydHkoY29yZUF0dHJpYnMsIGxvYWRlciwgbm9kZSwgQ29yZURlc2NyaXB0b3IuQ09SRV9DT0xMRUNUSU9OLAotICAgICAgICBjb2xsZWN0aW9uLCBkY29yZS5nZXROYW1lKCkpOwotICAgIAotICAgIFN0cmluZyBzaGFyZCA9IG51bGw7Ci0gICAgU3RyaW5nIHJvbGVzID0gbnVsbDsKLSAgICBpZiAoY2QgIT0gbnVsbCkgewotICAgICAgc2hhcmQgPSBjZC5nZXRTaGFyZElkKCk7Ci0gICAgICByb2xlcyA9IGNkLmdldFJvbGVzKCk7Ci0gICAgfQotICAgIGFkZENvcmVQcm9wZXJ0eShjb3JlQXR0cmlicywgbG9hZGVyLCBub2RlLCBDb3JlRGVzY3JpcHRvci5DT1JFX1NIQVJELAotICAgICAgICBzaGFyZCwgbnVsbCk7Ci0gICAgCi0gICAgYWRkQ29yZVByb3BlcnR5KGNvcmVBdHRyaWJzLCBsb2FkZXIsIG5vZGUsIENvcmVEZXNjcmlwdG9yLkNPUkVfUk9MRVMsCi0gICAgICAgIHJvbGVzLCBudWxsKTsKIAotICAgIGNvcmVBdHRyaWJzLnB1dChDb3JlRGVzY3JpcHRvci5DT1JFX0xPQURPTlNUQVJUVVAsCi0gICAgICAgIEJvb2xlYW4udG9TdHJpbmcoZGNvcmUuaXNMb2FkT25TdGFydHVwKCkpKTsKLSAgICBjb3JlQXR0cmlicy5wdXQoQ29yZURlc2NyaXB0b3IuQ09SRV9UUkFOU0lFTlQsCi0gICAgICAgIEJvb2xlYW4udG9TdHJpbmcoZGNvcmUuaXNUcmFuc2llbnQoKSkpOwotICAgIAogCiAgICAgU29sclhNTFNlcmlhbGl6ZXIuU29sckNvcmVYTUxEZWYgc29sckNvcmVYTUxEZWYgPSBuZXcgU29sclhNTFNlcmlhbGl6ZXIuU29sckNvcmVYTUxEZWYoKTsKICAgICBzb2xyQ29yZVhNTERlZi5jb3JlQXR0cmlicyA9IGNvcmVBdHRyaWJzOwotICAgIHNvbHJDb3JlWE1MRGVmLmNvcmVQcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICBzb2xyQ29yZVhNTERlZi5jb3JlUHJvcGVydGllcyA9IG5ld1Byb3BzOwogICAgIHNvbHJDb3JlWE1MRGVmcy5hZGQoc29sckNvcmVYTUxEZWYpOwotCiAgIH0KIAogICBwcm90ZWN0ZWQgT2JqZWN0IGdldE1vZGlmeUxvY2soKSB7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckRlbGV0aW9uUG9saWN5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckRlbGV0aW9uUG9saWN5LmphdmEKaW5kZXggMzcwMmQ0Yi4uMjBiNTFmNSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJEZWxldGlvblBvbGljeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyRGVsZXRpb25Qb2xpY3kuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogICAgKiBJbnRlcm5hbCB1c2UgZm9yIEx1Y2VuZS4uLiBkbyBub3QgZXhwbGljaXRseSBjYWxsLgogICAgKi8KICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uSW5pdChMaXN0IGNvbW1pdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIG9uSW5pdChMaXN0PD8gZXh0ZW5kcyBJbmRleENvbW1pdD4gY29tbWl0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAvLyBTT0xSLTQ1NDc6IGxvZyBiYXNpYyBkYXRhIGF0IElORk8sIGFkZCBmaWxlbmFtZXMgYXQgREVCVUcuCiAgICAgaWYgKGNvbW1pdHMuaXNFbXB0eSgpKSB7CiAgICAgICByZXR1cm47CkBAIC04NiwyNiArODYsMjYgQEAKICAgICAgICAgbmV3IENvbW1pdHNMb2dnaW5nSW5mbyhjb21taXRzKSk7CiAgICAgbG9nLmRlYnVnKCJTb2xyRGVsZXRpb25Qb2xpY3kub25Jbml0OiBjb21taXRzOiB7fSIsCiAgICAgICAgIG5ldyBDb21taXRzTG9nZ2luZ0RlYnVnKGNvbW1pdHMpKTsKLSAgICB1cGRhdGVDb21taXRzKChMaXN0PEluZGV4Q29tbWl0PikgY29tbWl0cyk7CisgICAgdXBkYXRlQ29tbWl0cyhjb21taXRzKTsKICAgfQogCiAgIC8qKgogICAgKiBJbnRlcm5hbCB1c2UgZm9yIEx1Y2VuZS4uLiBkbyBub3QgZXhwbGljaXRseSBjYWxsLgogICAgKi8KICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uQ29tbWl0KExpc3QgY29tbWl0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIHZvaWQgb25Db21taXQoTGlzdDw/IGV4dGVuZHMgSW5kZXhDb21taXQ+IGNvbW1pdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgLy8gU09MUi00NTQ3OiBsb2cgYmFzaWMgZGF0YSBhdCBJTkZPLCBhZGQgZmlsZW5hbWVzIGF0IERFQlVHLgogICAgIGxvZy5pbmZvKCJTb2xyRGVsZXRpb25Qb2xpY3kub25Db21taXQ6IGNvbW1pdHM6IHt9IiwKICAgICAgICAgbmV3IENvbW1pdHNMb2dnaW5nSW5mbyhjb21taXRzKSk7CiAgICAgbG9nLmRlYnVnKCJTb2xyRGVsZXRpb25Qb2xpY3kub25Db21taXQ6IGNvbW1pdHM6IHt9IiwKICAgICAgICAgbmV3IENvbW1pdHNMb2dnaW5nRGVidWcoY29tbWl0cykpOwotICAgIHVwZGF0ZUNvbW1pdHMoKExpc3Q8SW5kZXhDb21taXQ+KSBjb21taXRzKTsKKyAgICB1cGRhdGVDb21taXRzKGNvbW1pdHMpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tbWl0c0xvZ2dpbmdJbmZvIHsKLSAgICBwcml2YXRlIExpc3Q8SW5kZXhDb21taXQ+IGNvbW1pdHM7CisgICAgcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBJbmRleENvbW1pdD4gY29tbWl0czsKIAotICAgIHB1YmxpYyBDb21taXRzTG9nZ2luZ0luZm8oTGlzdDxJbmRleENvbW1pdD4gY29tbWl0cykgeworICAgIHB1YmxpYyBDb21taXRzTG9nZ2luZ0luZm8oTGlzdDw/IGV4dGVuZHMgSW5kZXhDb21taXQ+IGNvbW1pdHMpIHsKICAgICAgIHRoaXMuY29tbWl0cyA9IGNvbW1pdHM7CiAgICAgfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1pdHNMb2dnaW5nRGVidWcgZXh0ZW5kcyBDb21taXRzTG9nZ2luZ0luZm8gewotICAgIHB1YmxpYyBDb21taXRzTG9nZ2luZ0RlYnVnKExpc3Q8SW5kZXhDb21taXQ+IGNvbW1pdHMpIHsKKyAgICBwdWJsaWMgQ29tbWl0c0xvZ2dpbmdEZWJ1ZyhMaXN0PD8gZXh0ZW5kcyBJbmRleENvbW1pdD4gY29tbWl0cykgewogICAgICAgc3VwZXIoY29tbWl0cyk7CiAgICAgfQogCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tbWl0cyhMaXN0PEluZGV4Q29tbWl0PiBjb21taXRzKSB7CisgIHByaXZhdGUgdm9pZCB1cGRhdGVDb21taXRzKExpc3Q8PyBleHRlbmRzIEluZGV4Q29tbWl0PiBjb21taXRzKSB7CiAgICAgLy8gdG8gYmUgc2FmZSwgd2Ugc2hvdWxkIG9ubHkgY2FsbCBkZWxldGUgb24gYSBjb21taXQgcG9pbnQgcGFzc2VkIHRvIHVzCiAgICAgLy8gaW4gdGhpcyBzcGVjaWZpYyBjYWxsIChtYXkgYmUgYWNyb3NzIGRpZmYgSW5kZXhXcml0ZXIgaW5zdGFuY2VzKS4KICAgICAvLyB0aGlzIHdpbGwgaGFwcGVuIHJhcmVseSwgc28ganVzdCBzeW5jaHJvbml6ZSBldmVyeXRoaW5nCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sclJlc291cmNlTG9hZGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sclJlc291cmNlTG9hZGVyLmphdmEKaW5kZXggYTZkOWIyYi4uYTNkZDVhYyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJSZXNvdXJjZUxvYWRlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyUmVzb3VyY2VMb2FkZXIuamF2YQpAQCAtMTcsNTYgKzE3LDU4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkNoYXJGaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuUmVzb3VyY2VMb2FkZXJBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLlRva2VuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLlRva2VuaXplckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5Xb3JkbGlzdExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuQ29kZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLkRvY1ZhbHVlc0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuUG9zdGluZ3NGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uUmVzb3VyY2VMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmFkbWluLkNvcmVBZG1pbkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuY29tcG9uZW50LlNlYXJjaENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5jb21wb25lbnQuU2hhcmRIYW5kbGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUmVxdWVzdEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlF1ZXJ5UmVzcG9uc2VXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5NYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuU2ltaWxhcml0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5RUGFyc2VyUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yLlVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5wbHVnaW4uU29sckNvcmVBd2FyZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5vSW5pdGlhbENvbnRleHRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuQ2hhckZpbHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMudXRpbC5SZXNvdXJjZUxvYWRlckF3YXJlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5GaWx0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuVG9rZW5pemVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5jb2RlY3MuQ29kZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuY29kZWNzLlBvc3RpbmdzRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmNvZGVjcy5Eb2NWYWx1ZXNGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnV0aWwuV29yZGxpc3RMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5SZXNvdXJjZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5hZG1pbi5Db3JlQWRtaW5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmNvbXBvbmVudC5TaGFyZEhhbmRsZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLlNpbWlsYXJpdHlGYWN0b3J5OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLWltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKLWltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5uYW1pbmcuTm9Jbml0aWFsQ29udGV4dEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuY29tcG9uZW50LlNlYXJjaENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUmVxdWVzdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlF1ZXJ5UmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuVXBkYXRlUmVxdWVzdFByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwucGx1Z2luLlNvbHJDb3JlQXdhcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5RUGFyc2VyUGx1Z2luOwotCiAvKioKICAqIEBzaW5jZSBzb2xyIDEuMwogICovIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJYTUxTZXJpYWxpemVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sclhNTFNlcmlhbGl6ZXIuamF2YQppbmRleCBhNDEzOTk3Li40Mzc2MGUwIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sclhNTFNlcmlhbGl6ZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sclhNTFNlcmlhbGl6ZXIuamF2YQpAQCAtMTcsNiArMTcsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLlhNTDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0zMCwxMSArMzUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLlhNTDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBwdWJsaWMgY2xhc3MgU29sclhNTFNlcmlhbGl6ZXIgewogICBwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5CiAgICAgICAuZ2V0TG9nZ2VyKFNvbHJYTUxTZXJpYWxpemVyLmNsYXNzKTsKQEAgLTYyLDYgKzYyLDQxIEBACiAgICAgaWYgKGNvbnRhaW5lclByb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29udGFpbmVyUHJvcGVydGllcy5pc0VtcHR5KCkpIHsKICAgICAgIHdyaXRlUHJvcGVydGllcyh3LCBjb250YWluZXJQcm9wZXJ0aWVzLCAiICAiKTsKICAgICB9CisKKyAgICAvLyBPdXRwdXQgbG9nZ2luZyBzZWN0aW9uIGlmIGFueQorICAgIGlmIChzb2xyWE1MRGVmLmxvZ2dpbmdBdHRyaWJzLnNpemUoKSA+IDAgfHwgc29sclhNTERlZi53YXRjaGVyQXR0cmlicy5zaXplKCkgPiAwKSB7CisgICAgICB3LndyaXRlKElOREVOVCArICI8bG9nZ2luZyIpOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudCA6IHNvbHJYTUxEZWYubG9nZ2luZ0F0dHJpYnMuZW50cnlTZXQoKSkgeworICAgICAgICB3cml0ZUF0dHJpYnV0ZSh3LCBlbnQuZ2V0S2V5KCksIGVudC5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIHcud3JpdGUoIj5cbiIpOworCisgICAgICBpZiAoc29sclhNTERlZi53YXRjaGVyQXR0cmlicy5zaXplKCkgPiAwKSB7CisgICAgICAgIHcud3JpdGUoSU5ERU5UICsgSU5ERU5UICsgIjx3YXRjaGVyIik7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnQgOiBzb2xyWE1MRGVmLndhdGNoZXJBdHRyaWJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSh3LCBlbnQuZ2V0S2V5KCksIGVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB3LndyaXRlKCIvPlxuIik7CisgICAgICB9CisgICAgICB3LndyaXRlKElOREVOVCArICI8L2xvZ2dpbmc+XG4iKTsKKyAgICB9CisKKyAgICAvLyBPdXRwdXQgc2hhcmQgaGFuZGxlciBzZWN0aW9uIGlmIGFueQorICAgIGlmIChzb2xyWE1MRGVmLnNoYXJkSGFuZGxlckF0dHJpYnMuc2l6ZSgpID4gMCB8fCBzb2xyWE1MRGVmLnNoYXJkSGFuZGxlclByb3BzLnNpemUoKSA+IDApIHsKKyAgICAgIHcud3JpdGUoSU5ERU5UICsgIjxzaGFyZEhhbmRsZXJGYWN0b3J5Iik7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50IDogc29sclhNTERlZi5zaGFyZEhhbmRsZXJBdHRyaWJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgd3JpdGVBdHRyaWJ1dGUodywgZW50LmdldEtleSgpLCBlbnQuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgICB3LndyaXRlKCI+XG4iKTsKKyAgICAgIGlmIChzb2xyWE1MRGVmLnNoYXJkSGFuZGxlclByb3BzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudCA6IHNvbHJYTUxEZWYuc2hhcmRIYW5kbGVyUHJvcHMuZW50cnlTZXQoKSkgeworICAgICAgICAgIHcud3JpdGUoSU5ERU5UICsgSU5ERU5UICsgIjxpbnQgbmFtZT1cIiIgKyBlbnQuZ2V0S2V5KCkgKyAiXCIiICsgIj4iICsgZW50LmdldFZhbHVlKCkgKyAiPC9pbnQ+XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdy53cml0ZShJTkRFTlQgKyAiPC9zaGFyZEhhbmRsZXJGYWN0b3J5PlxuIik7CisgICAgfQorCisKICAgICB3LndyaXRlKElOREVOVCArICI8Y29yZXMiKTsKICAgICBNYXA8U3RyaW5nLFN0cmluZz4gY29yZXNBdHRyaWJzID0gc29sclhNTERlZi5jb3Jlc0F0dHJpYnM7CiAgICAgU2V0PFN0cmluZz4gY29yZUF0dHJpYktleXMgPSBjb3Jlc0F0dHJpYnMua2V5U2V0KCk7CkBAIC0xMTYsNyArMTUxLDcgQEAKICAgfQogICAKICAgdm9pZCBwZXJzaXN0RmlsZShGaWxlIGZpbGUsIFNvbHJYTUxEZWYgc29sclhNTERlZikgewotICAgIGxvZy5pbmZvKCJQZXJzaXN0aW5nIGNvcmVzIGNvbmZpZyB0byAiICsgZmlsZSk7CisgICAgbG9nLmluZm8oIlBlcnNpc3RpbmcgY29yZXMgY29uZmlnIHRvICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAKICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOwogICAgIHRyeSB7CkBAIC0xOTgsNiArMjMzLDEwIEBACiAgICAgUHJvcGVydGllcyBjb250YWluZXJQcm9wZXJ0aWVzOwogICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBzb2xyQXR0cmliczsKICAgICBNYXA8U3RyaW5nLFN0cmluZz4gY29yZXNBdHRyaWJzOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9nZ2luZ0F0dHJpYnM7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiB3YXRjaGVyQXR0cmliczsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNoYXJkSGFuZGxlckF0dHJpYnM7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzaGFyZEhhbmRsZXJQcm9wczsKICAgICBMaXN0PFNvbHJDb3JlWE1MRGVmPiBjb3Jlc0RlZnM7CiAgIH0KICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvcmUvWmtDb250YWluZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9aa0NvbnRhaW5lci5qYXZhCmluZGV4IGM5ZWQ5YjMuLjUzOGY5ZGQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9aa0NvbnRhaW5lci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29yZS9aa0NvbnRhaW5lci5qYXZhCkBAIC01MCw2ICs1MCw3IEBACiAgIHByaXZhdGUgU3RyaW5nIGhvc3RDb250ZXh0OwogICBwcml2YXRlIFN0cmluZyBob3N0OwogICBwcml2YXRlIFN0cmluZyBsZWFkZXJWb3RlV2FpdDsKKyAgcHJpdmF0ZSBCb29sZWFuIGdlbmVyaWNDb3JlTm9kZU5hbWVzOwogICBwcml2YXRlIGludCBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQ7CiAKICAgcHVibGljIFNvbHJaa1NlcnZlciBnZXRaa1NlcnZlcigpIHsKQEAgLTc1LDYgKzc2LDEwIEBACiAgIHB1YmxpYyBTdHJpbmcgZ2V0TGVhZGVyVm90ZVdhaXQoKSB7CiAgICAgcmV0dXJuIGxlYWRlclZvdGVXYWl0OwogICB9CisgIAorICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmljQ29yZU5vZGVOYW1lcygpIHsKKyAgICByZXR1cm4gZ2VuZXJpY0NvcmVOb2RlTmFtZXM7CisgIH0KIAogICBwdWJsaWMgaW50IGdldERpc3RyaWJVcGRhdGVDb25uVGltZW91dCgpIHsKICAgICByZXR1cm4gZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0OwpAQCAtOTAsNyArOTUsNyBAQAogICAgIAogICB9CiAgIAotICBwdWJsaWMgdm9pZCBpbml0Wm9vS2VlcGVyKGZpbmFsIENvcmVDb250YWluZXIgY2MsIFN0cmluZyBzb2xySG9tZSwgU3RyaW5nIHprSG9zdCwgaW50IHprQ2xpZW50VGltZW91dCwgU3RyaW5nIGhvc3RQb3J0LCBTdHJpbmcgaG9zdENvbnRleHQsIFN0cmluZyBob3N0LCBTdHJpbmcgbGVhZGVyVm90ZVdhaXQsIGludCBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQsIGludCBkaXN0cmliVXBkYXRlU29UaW1lb3V0KSB7CisgIHB1YmxpYyB2b2lkIGluaXRab29LZWVwZXIoZmluYWwgQ29yZUNvbnRhaW5lciBjYywgU3RyaW5nIHNvbHJIb21lLCBTdHJpbmcgemtIb3N0LCBpbnQgemtDbGllbnRUaW1lb3V0LCBTdHJpbmcgaG9zdFBvcnQsIFN0cmluZyBob3N0Q29udGV4dCwgU3RyaW5nIGhvc3QsIFN0cmluZyBsZWFkZXJWb3RlV2FpdCwgYm9vbGVhbiBnZW5lcmljQ29yZU5vZGVOYW1lcywgaW50IGRpc3RyaWJVcGRhdGVDb25uVGltZW91dCwgaW50IGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQpIHsKICAgICBaa0NvbnRyb2xsZXIgemtDb250cm9sbGVyID0gbnVsbDsKICAgICAKICAgICAvLyBpZiB6a0hvc3Qgc3lzIHByb3BlcnR5IGlzIG5vdCBzZXQsIHdlIGFyZSBub3QgdXNpbmcgWm9vS2VlcGVyCkBAIC0xMDgsNiArMTEzLDcgQEAKICAgICB0aGlzLmhvc3RDb250ZXh0ID0gaG9zdENvbnRleHQ7CiAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICB0aGlzLmxlYWRlclZvdGVXYWl0ID0gbGVhZGVyVm90ZVdhaXQ7CisgICAgdGhpcy5nZW5lcmljQ29yZU5vZGVOYW1lcyA9IGdlbmVyaWNDb3JlTm9kZU5hbWVzOwogICAgIHRoaXMuZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0ID0gZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0OwogICAgIHRoaXMuZGlzdHJpYlVwZGF0ZVNvVGltZW91dCA9IGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQ7CiAgICAgCkBAIC0xNjMsNyArMTY5LDcgQEAKICAgICAgICAgfQogICAgICAgICB6a0NvbnRyb2xsZXIgPSBuZXcgWmtDb250cm9sbGVyKGNjLCB6b29rZWVwZXJIb3N0LCB6a0NsaWVudFRpbWVvdXQsCiAgICAgICAgICAgICB6a0NsaWVudENvbm5lY3RUaW1lb3V0LCBob3N0LCBob3N0UG9ydCwgaG9zdENvbnRleHQsCi0gICAgICAgICAgICBsZWFkZXJWb3RlV2FpdCwgZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0LCBkaXN0cmliVXBkYXRlU29UaW1lb3V0LAorICAgICAgICAgICAgbGVhZGVyVm90ZVdhaXQsIGdlbmVyaWNDb3JlTm9kZU5hbWVzLCBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQsIGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQsCiAgICAgICAgICAgICBuZXcgQ3VycmVudENvcmVEZXNjcmlwdG9yUHJvdmlkZXIoKSB7CiAKICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvRG9jdW1lbnRBbmFseXNpc1JlcXVlc3RIYW5kbGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvRG9jdW1lbnRBbmFseXNpc1JlcXVlc3RIYW5kbGVyLmphdmEKaW5kZXggYzE2MDJhMC4uNmU4YzUzYSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL0RvY3VtZW50QW5hbHlzaXNSZXF1ZXN0SGFuZGxlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9Eb2N1bWVudEFuYWx5c2lzUmVxdWVzdEhhbmRsZXIuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRmllbGRUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuSW5kZXhTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5FbXB0eUVudGl0eVJlc29sdmVyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTkwLDYgKzkxLDggQEAKICAgICBzdXBlci5pbml0KGFyZ3MpOwogCiAgICAgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgRW1wdHlFbnRpdHlSZXNvbHZlci5jb25maWd1cmVYTUxJbnB1dEZhY3RvcnkoaW5wdXRGYWN0b3J5KTsKKyAgICBpbnB1dEZhY3Rvcnkuc2V0WE1MUmVwb3J0ZXIoeG1sbG9nKTsKICAgICB0cnkgewogICAgICAgLy8gVGhlIGphdmEgMS42IGJ1bmRsZWQgc3RheCBwYXJzZXIgKHNqc3hwKSBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIHRocmVhZC1zYWZlCiAgICAgICAvLyBYTUxJbnB1dEZhY3RvcnksIGFzIHRoYXQgaW1wbGVtZW50YXRpb24gdHJpZXMgdG8gY2FjaGUgYW5kIHJldXNlIHRoZQpAQCAtMTAzLDcgKzEwNiw2IEBACiAgICAgICAvLyBpc2ltcGxlbWVudGF0aW9uIHNwZWNpZmljLgogICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gc2V0IHRoZSAncmV1c2UtaW5zdGFuY2UnIHByb3BlcnR5IGZvciB0aGUgaW5wdXQgZmFjdG9yeTogIiArIGlucHV0RmFjdG9yeSk7CiAgICAgfQotICAgIGlucHV0RmFjdG9yeS5zZXRYTUxSZXBvcnRlcih4bWxsb2cpOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvU25hcFB1bGxlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL1NuYXBQdWxsZXIuamF2YQppbmRleCAyNzE3NDczLi4yYTMxZDJiIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvU25hcFB1bGxlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9TbmFwUHVsbGVyLmphdmEKQEAgLTMxOCwyMCArMzE4LDI1IEBACiAgICAgICBsb25nIGxhdGVzdFZlcnNpb24gPSAoTG9uZykgcmVzcG9uc2UuZ2V0KENNRF9JTkRFWF9WRVJTSU9OKTsKICAgICAgIGxvbmcgbGF0ZXN0R2VuZXJhdGlvbiA9IChMb25nKSByZXNwb25zZS5nZXQoR0VORVJBVElPTik7CiAKLSAgICAgIEluZGV4Q29tbWl0IGNvbW1pdDsKLSAgICAgIFJlZkNvdW50ZWQ8U29sckluZGV4U2VhcmNoZXI+IHNlYXJjaGVyUmVmQ291bnRlZCA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzZWFyY2hlclJlZkNvdW50ZWQgPSBjb3JlLmdldE5ld2VzdFNlYXJjaGVyKGZhbHNlKTsKLSAgICAgICAgaWYgKHNlYXJjaGVyUmVmQ291bnRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgU29sckV4Y2VwdGlvbi5sb2coTE9HLCAiTm8gb3BlbiBzZWFyY2hlciBmb3VuZCAtIGZldGNoIGFib3J0ZWQiKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAvLyBUT0RPOiBtYWtlIHN1cmUgdGhhdCBnZXRMYXRlc3RDb21taXQgb25seSByZXR1cm5zIGNvbW1pdCBwb2ludHMgZm9yIHRoZSBtYWluIGluZGV4IChpLmUuIG5vIHNpZGUtY2FyIGluZGV4ZXMpCisgICAgICBJbmRleENvbW1pdCBjb21taXQgPSBjb3JlLmdldERlbGV0aW9uUG9saWN5KCkuZ2V0TGF0ZXN0Q29tbWl0KCk7CisgICAgICBpZiAoY29tbWl0ID09IG51bGwpIHsKKyAgICAgICAgLy8gUHJlc3VtYWJseSB0aGUgSW5kZXhXcml0ZXIgaGFzbid0IGJlZW4gb3BlbmVkIHlldCwgYW5kIGhlbmNlIHRoZSBkZWxldGlvbiBwb2xpY3kgaGFzbid0IGJlZW4gdXBkYXRlZCB3aXRoIGNvbW1pdCBwb2ludHMKKyAgICAgICAgUmVmQ291bnRlZDxTb2xySW5kZXhTZWFyY2hlcj4gc2VhcmNoZXJSZWZDb3VudGVkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzZWFyY2hlclJlZkNvdW50ZWQgPSBjb3JlLmdldE5ld2VzdFNlYXJjaGVyKGZhbHNlKTsKKyAgICAgICAgICBpZiAoc2VhcmNoZXJSZWZDb3VudGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIExPRy53YXJuKCJObyBvcGVuIHNlYXJjaGVyIGZvdW5kIC0gZmV0Y2ggYWJvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBjb21taXQgPSBzZWFyY2hlclJlZkNvdW50ZWQuZ2V0KCkuZ2V0SW5kZXhSZWFkZXIoKS5nZXRJbmRleENvbW1pdCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChzZWFyY2hlclJlZkNvdW50ZWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHNlYXJjaGVyUmVmQ291bnRlZC5kZWNyZWYoKTsKICAgICAgICAgfQotICAgICAgICBjb21taXQgPSBzZWFyY2hlclJlZkNvdW50ZWQuZ2V0KCkuZ2V0SW5kZXhSZWFkZXIoKS5nZXRJbmRleENvbW1pdCgpOwotICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKHNlYXJjaGVyUmVmQ291bnRlZCAhPSBudWxsKQotICAgICAgICAgIHNlYXJjaGVyUmVmQ291bnRlZC5kZWNyZWYoKTsKICAgICAgIH0KLSAgICAgIAorCisKICAgICAgIGlmIChsYXRlc3RWZXJzaW9uID09IDBMKSB7CiAgICAgICAgIGlmIChmb3JjZVJlcGxpY2F0aW9uICYmIGNvbW1pdC5nZXRHZW5lcmF0aW9uKCkgIT0gMCkgewogICAgICAgICAgIC8vIHNpbmNlIHdlIHdvbid0IGdldCB0aGUgZmlsZXMgZm9yIGFuIGVtcHR5IGluZGV4LApAQCAtNDAzLDcgKzQwOCwxNCBAQAogICAgICAgICAgICAgc3VjY2Vzc2Z1bEluc3RhbGwgPSBtb2RpZnlJbmRleFByb3BzKHRtcElkeERpck5hbWUpOwogICAgICAgICAgICAgZGVsZXRlVG1wSWR4RGlyICA9ICBmYWxzZTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VjY2Vzc2Z1bEluc3RhbGwgPSBtb3ZlSW5kZXhGaWxlcyh0bXBJbmRleERpciwgaW5kZXhEaXIpOworICAgICAgICAgICAgc29sckNvcmUuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFNvbHJDb3JlU3RhdGUoKQorICAgICAgICAgICAgICAgIC5jbG9zZUluZGV4V3JpdGVyKGNvcmUsIHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgc3VjY2Vzc2Z1bEluc3RhbGwgPSBtb3ZlSW5kZXhGaWxlcyh0bXBJbmRleERpciwgaW5kZXhEaXIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgc29sckNvcmUuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFNvbHJDb3JlU3RhdGUoKQorICAgICAgICAgICAgICAgICAgLm9wZW5JbmRleFdyaXRlcihjb3JlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKHN1Y2Nlc3NmdWxJbnN0YWxsKSB7CiAgICAgICAgICAgICBpZiAoaXNGdWxsQ29weU5lZWRlZCkgewpAQCAtNDI2LDcgKzQzOCwxMiBAQAogICAgICAgICAgICAgc3VjY2Vzc2Z1bEluc3RhbGwgPSBtb2RpZnlJbmRleFByb3BzKHRtcElkeERpck5hbWUpOwogICAgICAgICAgICAgZGVsZXRlVG1wSWR4RGlyID0gIGZhbHNlOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdWNjZXNzZnVsSW5zdGFsbCA9IG1vdmVJbmRleEZpbGVzKHRtcEluZGV4RGlyLCBpbmRleERpcik7CisgICAgICAgICAgICBzb2xyQ29yZS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0U29sckNvcmVTdGF0ZSgpLmNsb3NlSW5kZXhXcml0ZXIoY29yZSwgdHJ1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBzdWNjZXNzZnVsSW5zdGFsbCA9IG1vdmVJbmRleEZpbGVzKHRtcEluZGV4RGlyLCBpbmRleERpcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICBzb2xyQ29yZS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0U29sckNvcmVTdGF0ZSgpLm9wZW5JbmRleFdyaXRlcihjb3JlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKHN1Y2Nlc3NmdWxJbnN0YWxsKSB7CiAgICAgICAgICAgICBsb2dSZXBsaWNhdGlvblRpbWVBbmRDb25mRmlsZXMobW9kaWZpZWRDb25mRmlsZXMsIHN1Y2Nlc3NmdWxJbnN0YWxsKTsKQEAgLTQ0Myw3ICs0NjAsMTEgQEAKICAgICAgICAgICAgICAgY29yZS5nZXREaXJlY3RvcnlGYWN0b3J5KCkucmVtb3ZlKGluZGV4RGlyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgb3Blbk5ld1dyaXRlckFuZFNlYXJjaGVyKGlzRnVsbENvcHlOZWVkZWQpOworICAgICAgICAgIGlmIChpc0Z1bGxDb3B5TmVlZGVkKSB7CisgICAgICAgICAgICBzb2xyQ29yZS5nZXRVcGRhdGVIYW5kbGVyKCkubmV3SW5kZXhXcml0ZXIoaXNGdWxsQ29weU5lZWRlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIG9wZW5OZXdTZWFyY2hlckFuZFVwZGF0ZUNvbW1pdFBvaW50KGlzRnVsbENvcHlOZWVkZWQpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICByZXBsaWNhdGlvblN0YXJ0VGltZSA9IDA7CkBAIC02MTUsMTEgKzYzNiw5IEBACiAgICAgcmV0dXJuIHNiOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIG9wZW5OZXdXcml0ZXJBbmRTZWFyY2hlcihib29sZWFuIGlzRnVsbENvcHlOZWVkZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHByaXZhdGUgdm9pZCBvcGVuTmV3U2VhcmNoZXJBbmRVcGRhdGVDb21taXRQb2ludChib29sZWFuIGlzRnVsbENvcHlOZWVkZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgU29sclF1ZXJ5UmVxdWVzdCByZXEgPSBuZXcgTG9jYWxTb2xyUXVlcnlSZXF1ZXN0KHNvbHJDb3JlLAogICAgICAgICBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoKSk7Ci0gICAgLy8gcmVib290IHRoZSB3cml0ZXIgb24gdGhlIG5ldyBpbmRleCBhbmQgZ2V0IGEgbmV3IHNlYXJjaGVyCi0gICAgc29sckNvcmUuZ2V0VXBkYXRlSGFuZGxlcigpLm5ld0luZGV4V3JpdGVyKGlzRnVsbENvcHlOZWVkZWQpOwogICAgIAogICAgIFJlZkNvdW50ZWQ8U29sckluZGV4U2VhcmNoZXI+IHNlYXJjaGVyID0gbnVsbDsKICAgICBJbmRleENvbW1pdCBjb21taXRQb2ludDsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9hZG1pbi9Db3JlQWRtaW5IYW5kbGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvYWRtaW4vQ29yZUFkbWluSGFuZGxlci5qYXZhCmluZGV4IDk3ZGZhMTAuLjMwMTBkNDggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9hZG1pbi9Db3JlQWRtaW5IYW5kbGVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2FkbWluL0NvcmVBZG1pbkhhbmRsZXIuamF2YQpAQCAtMTcsMTkgKzE3LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5hZG1pbjsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5EaXJlY3RvcnlSZWFkZXI7CkBAIC01Nyw4ICs0NCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5EaXJlY3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkRpcmVjdG9yeUZhY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5SZXF1ZXN0SGFuZGxlckJhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuTG9jYWxTb2xyUXVlcnlSZXF1ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJRdWVyeVJlcXVlc3Q7CkBAIC03NSw2ICs2MiwxOSBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKwogLyoqCiAgKgogICogQHNpbmNlIHNvbHIgMS4zCkBAIC00OTgsMTQgKzQ5OCwxOCBAQAogICAgICAgSXRlcmF0b3I8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lc0l0ZXJhdG9yID0gcGFyYW1zLmdldFBhcmFtZXRlck5hbWVzSXRlcmF0b3IoKTsKICAgICAgIHdoaWxlIChwYXJhbWV0ZXJOYW1lc0l0ZXJhdG9yLmhhc05leHQoKSkgewogICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZXNJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclZhbHVlID0gcGFyYW1zLmdldChwYXJhbWV0ZXJOYW1lKTsKKyAgICAgICAgICBkY29yZS5hZGRDcmVhdGVkUHJvcGVydHkocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpOyAvLyBOZWVkIHRoaXMganVuayBmb3Igc2lsbHkgcGVyc2lzdGVuY2UKKwogICAgICAgICAgIGlmKHBhcmFtZXRlck5hbWUuc3RhcnRzV2l0aChDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYKSkgewotICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVmFsdWUgPSBwYXJhbXMuZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcGFyYW1ldGVyTmFtZS5zdWJzdHJpbmcoQ29yZUFkbWluUGFyYW1zLlBST1BFUlRZX1BSRUZJWC5sZW5ndGgoKSk7IC8vIHNraXAgcHJlZml4Ci0gICAgICAgICAgICAgIGNvcmVQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlclZhbHVlKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwYXJhbWV0ZXJOYW1lLnN1YnN0cmluZyhDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYLmxlbmd0aCgpKTsgLy8gc2tpcCBwcmVmaXgKKyAgICAgICAgICAgIGNvcmVQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlclZhbHVlKTsKICAgICAgICAgICB9CiAgICAgICB9CiAgICAgICBkY29yZS5zZXRDb3JlUHJvcGVydGllcyhjb3JlUHJvcGVydGllcyk7Ci0gICAgICAKKyAgICAgIGlmIChjb3JlQ29udGFpbmVyLmdldFprQ29udHJvbGxlcigpICE9IG51bGwpIHsKKyAgICAgICAgY29yZUNvbnRhaW5lci5wcmVSZWdpc3RlckluWmsoZGNvcmUpOworICAgICAgfQogICAgICAgU29sckNvcmUgY29yZSA9IGNvcmVDb250YWluZXIuY3JlYXRlKGRjb3JlKTsKIAogICAgICAgY29yZUNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCBjb3JlLCBmYWxzZSk7CkBAIC01MjIsOSArNTI2LDI0IEBACiAgICAgICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCBudWxsLCBlKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgCisgICAgICBUaHJvd2FibGUgdGMgPSBleDsKKyAgICAgIFRocm93YWJsZSBjID0gbnVsbDsKKyAgICAgIGRvIHsKKyAgICAgICAgdGMgPSB0Yy5nZXRDYXVzZSgpOworICAgICAgICBpZiAodGMgIT0gbnVsbCkgeworICAgICAgICAgIGMgPSB0YzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAodGMgIT0gbnVsbCk7CisgICAgICAKKyAgICAgIFN0cmluZyByb290TXNnID0gIiI7CisgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgIHJvb3RNc2cgPSAiIENhdXNlZCBieTogIiArIGMuZ2V0TWVzc2FnZSgpOworICAgICAgfQorICAgICAgCiAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5CQURfUkVRVUVTVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBDUkVBVEVpbmcgU29sckNvcmUgJyIgKyBuYW1lICsgIic6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkgKyByb290TXNnLCBleCk7CiAgICAgfQogICB9CiAKQEAgLTcxMyw3ICs3MzIsOSBAQAogICAgIGJvb2xlYW4gZG9QZXJzaXN0ID0gZmFsc2U7CiAgICAgU3RyaW5nIGZpbGVOYW1lID0gcGFyYW1zLmdldChDb3JlQWRtaW5QYXJhbXMuRklMRSk7CiAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvcmVDb250YWluZXIuZ2V0Q29uZmlnRmlsZSgpLmdldFBhcmVudEZpbGUoKSwgZmlsZU5hbWUpOworICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGNvcmVDb250YWluZXIuZ2V0Q29uZmlnRmlsZSgpLmdldFBhcmVudEZpbGUoKSwgZmlsZU5hbWUpOwogICAgICAgY29yZUNvbnRhaW5lci5wZXJzaXN0RmlsZShmaWxlKTsKICAgICAgIHJzcC5hZGQoInNhdmVkIiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICBkb1BlcnNpc3QgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9jb21wb25lbnQvSHR0cFNoYXJkSGFuZGxlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9IdHRwU2hhcmRIYW5kbGVyLmphdmEKaW5kZXggZWYzNmJjZi4uMjA2ZmMwOSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9IdHRwU2hhcmRIYW5kbGVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9IdHRwU2hhcmRIYW5kbGVyLmphdmEKQEAgLTM2MiwyMCArMzYyLDE4IEBACiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBSZXBsaWNhPiBzbGljZVNoYXJkcyA9IHNsaWNlLmdldFJlcGxpY2FzTWFwKCk7CiAKICAgICAgICAgICAgIC8vIEZvciBub3csIHJlY3JlYXRlIHRoZSB8IGRlbGltaXRlZCBsaXN0IG9mIGVxdWl2YWxlbnQgc2VydmVycwotICAgICAgICAgICAgU2V0PFN0cmluZz4gbGl2ZU5vZGVzID0gY2x1c3RlclN0YXRlLmdldExpdmVOb2RlcygpOwogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzbGljZVNoYXJkc1N0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoWmtOb2RlUHJvcHMgbm9kZVByb3BzIDogc2xpY2VTaGFyZHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgWmtDb3JlTm9kZVByb3BzIGNvcmVOb2RlUHJvcHMgPSBuZXcgWmtDb3JlTm9kZVByb3BzKG5vZGVQcm9wcyk7Ci0gICAgICAgICAgICAgIGlmICghbGl2ZU5vZGVzLmNvbnRhaW5zKGNvcmVOb2RlUHJvcHMuZ2V0Tm9kZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgIHx8ICFjb3JlTm9kZVByb3BzLmdldFN0YXRlKCkuZXF1YWxzKAorICAgICAgICAgICAgZm9yIChSZXBsaWNhIHJlcGxpY2EgOiBzbGljZVNoYXJkcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJTdGF0ZS5saXZlTm9kZXNDb250YWluKHJlcGxpY2EuZ2V0Tm9kZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgIHx8ICFyZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApLmVxdWFscygKICAgICAgICAgICAgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLkFDVElWRSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNsaWNlU2hhcmRzU3RyLmFwcGVuZCgnfCcpOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBjb3JlTm9kZVByb3BzLmdldENvcmVVcmwoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKHJlcGxpY2EpOwogICAgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkKICAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDcpOwogICAgICAgICAgICAgICBzbGljZVNoYXJkc1N0ci5hcHBlbmQodXJsKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9jb21wb25lbnQvU3RhdHNWYWx1ZXNGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L1N0YXRzVmFsdWVzRmFjdG9yeS5qYXZhCmluZGV4IGMzNTBkZDVkLi5kMzM0ZmZjIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L1N0YXRzVmFsdWVzRmFjdG9yeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9jb21wb25lbnQvU3RhdHNWYWx1ZXNGYWN0b3J5LmphdmEKQEAgLTQ5LDkgKzQ5LDcgQEAKICAgICBpZiAoRG91YmxlRmllbGQuY2xhc3MuaXNJbnN0YW5jZShmaWVsZFR5cGUpIHx8CiAgICAgICAgIEludEZpZWxkLmNsYXNzLmlzSW5zdGFuY2UoZmllbGRUeXBlKSB8fAogICAgICAgICBMb25nRmllbGQuY2xhc3MuaXNJbnN0YW5jZShmaWVsZFR5cGUpIHx8Ci0gICAgICAgIFNob3J0RmllbGQuY2xhc3MuaXNJbnN0YW5jZShmaWVsZFR5cGUpIHx8CiAgICAgICAgIEZsb2F0RmllbGQuY2xhc3MuaXNJbnN0YW5jZShmaWVsZFR5cGUpIHx8Ci0gICAgICAgIEJ5dGVGaWVsZC5jbGFzcy5pc0luc3RhbmNlKGZpZWxkVHlwZSkgfHwKICAgICAgICAgVHJpZUZpZWxkLmNsYXNzLmlzSW5zdGFuY2UoZmllbGRUeXBlKSB8fAogICAgICAgICBTb3J0YWJsZURvdWJsZUZpZWxkLmNsYXNzLmlzSW5zdGFuY2UoZmllbGRUeXBlKSB8fAogICAgICAgICBTb3J0YWJsZUludEZpZWxkLmNsYXNzLmlzSW5zdGFuY2UoZmllbGRUeXBlKSB8fApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2xvYWRlci9Kc29uTG9hZGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvbG9hZGVyL0pzb25Mb2FkZXIuamF2YQppbmRleCBlNDBmYjVlLi43MWI2ZTAzIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvbG9hZGVyL0pzb25Mb2FkZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvbG9hZGVyL0pzb25Mb2FkZXIuamF2YQpAQCAtMTksMTUgKzE5LDIwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuU29sclBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5VcGRhdGVQYXJhbXM7CiBpbXBvcnQgb3JnLm5vZ2dpdC5KU09OUGFyc2VyOwogaW1wb3J0IG9yZy5ub2dnaXQuT2JqZWN0QnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLkNvbnRlbnRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuUmVxdWVzdEhhbmRsZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5VcGRhdGVSZXF1ZXN0SGFuZGxlcjsKQEAgLTUxMiwxMSArNTE3LDEzIEBACiAgICAgICAgIGNhc2UgSlNPTlBhcnNlci5TVFJJTkc6CiAgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRTdHJpbmcoKTsKICAgICAgICAgY2FzZSBKU09OUGFyc2VyLkxPTkc6CisgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRMb25nKCk7CiAgICAgICAgIGNhc2UgSlNPTlBhcnNlci5OVU1CRVI6CisgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXREb3VibGUoKTsKICAgICAgICAgY2FzZSBKU09OUGFyc2VyLkJJR05VTUJFUjoKICAgICAgICAgICByZXR1cm4gcGFyc2VyLmdldE51bWJlckNoYXJzKCkudG9TdHJpbmcoKTsKICAgICAgICAgY2FzZSBKU09OUGFyc2VyLkJPT0xFQU46Ci0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcocGFyc2VyLmdldEJvb2xlYW4oKSk7IC8vIGZvciBsZWdhY3kgcmVhc29ucywgc2luZ2xlIHZhbHVlcyBzIGFyZSBleHBlY3RlZCB0byBiZSBzdHJpbmdzCisgICAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRCb29sZWFuKCk7CiAgICAgICAgIGNhc2UgSlNPTlBhcnNlci5OVUxMOgogICAgICAgICAgIHBhcnNlci5nZXROdWxsKCk7CiAgICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hpZ2hsaWdodC9Qb3N0aW5nc1NvbHJIaWdobGlnaHRlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9oaWdobGlnaHQvUG9zdGluZ3NTb2xySGlnaGxpZ2h0ZXIuamF2YQppbmRleCBhMTYyM2Y0Li4wMTJjOWRlIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2hpZ2hsaWdodC9Qb3N0aW5nc1NvbHJIaWdobGlnaHRlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvaGlnaGxpZ2h0L1Bvc3RpbmdzU29sckhpZ2hsaWdodGVyLmphdmEKQEAgLTY3LDYgKzY3LDcgQEAKICAqICAgICAgICZsdDtzdHIgbmFtZT0iaGwuYnMudmFyaWFudCImZ3Q7Jmx0Oy9zdHImZ3Q7CiAgKiAgICAgICAmbHQ7c3RyIG5hbWU9ImhsLmJzLnR5cGUiJmd0O1NFTlRFTkNFJmx0Oy9zdHImZ3Q7CiAgKiAgICAgICAmbHQ7aW50IG5hbWU9ImhsLm1heEFuYWx5emVkQ2hhcnMiJmd0OzEwMDAwJmx0Oy9pbnQmZ3Q7CisgKiAgICAgICAmbHQ7c3RyIG5hbWU9ImhsLm11bHRpVmFsdWVkU2VwYXJhdG9yQ2hhciImZ3Q7ICZsdDsvc3RyJmd0OwogICogICAgICZsdDsvbHN0Jmd0OwogICogICAmbHQ7L3JlcXVlc3RIYW5kbGVyJmd0OwogICogPC9wcmU+CkBAIC05Niw2ICs5Nyw3IEBACiAgKiAgICA8bGk+aGwuYnMuY291bnRyeSAoc3RyaW5nKSBzcGVjaWZpZXMgY291bnRyeSBjb2RlIGZvciBCcmVha0l0ZXJhdG9yLiBkZWZhdWx0IGlzIGVtcHR5IHN0cmluZyAocm9vdCBsb2NhbGUpCiAgKiAgICA8bGk+aGwuYnMudmFyaWFudCAoc3RyaW5nKSBzcGVjaWZpZXMgY291bnRyeSBjb2RlIGZvciBCcmVha0l0ZXJhdG9yLiBkZWZhdWx0IGlzIGVtcHR5IHN0cmluZyAocm9vdCBsb2NhbGUpCiAgKiAgICA8bGk+aGwubWF4QW5hbHl6ZWRDaGFycyBzcGVjaWZpZXMgaG93IG1hbnkgY2hhcmFjdGVycyBhdCBtb3N0IHdpbGwgYmUgcHJvY2Vzc2VkIGluIGEgZG9jdW1lbnQuCisgKiAgICA8bGk+aGwubXVsdGlWYWx1ZWRTZXBhcmF0b3JDaGFyIHNwZWNpZmllcyB0aGUgbG9naWNhbCBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMgZm9yIG11bHRpLXZhbHVlZCBmaWVsZHMuCiAgKiAgICAgICAgTk9URTogY3VycmVudGx5IGhsLm1heEFuYWx5emVkQ2hhcnMgY2Fubm90IHlldCBiZSBzcGVjaWZpZWQgcGVyLWZpZWxkCiAgKiAgPC91bD4KICAqICAKQEAgLTE2Nyw2ICsxNjksMTUgQEAKICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHBhcmFtcy5nZXRGaWVsZFBhcmFtKGZpZWxkLCBIaWdobGlnaHRQYXJhbXMuQlNfVFlQRSk7CiAgICAgICAgICAgcmV0dXJuIHBhcnNlQnJlYWtJdGVyYXRvcih0eXBlLCBsb2NhbGUpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBjaGFyIGdldE11bHRpVmFsdWVkU2VwYXJhdG9yKFN0cmluZyBmaWVsZCkgeworICAgICAgICAgIFN0cmluZyBzZXAgPSBwYXJhbXMuZ2V0RmllbGRQYXJhbShmaWVsZCwgSGlnaGxpZ2h0UGFyYW1zLk1VTFRJX1ZBTFVFRF9TRVBBUkFUT1IsICIgIik7CisgICAgICAgICAgaWYgKHNlcC5sZW5ndGgoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEhpZ2hsaWdodFBhcmFtcy5NVUxUSV9WQUxVRURfU0VQQVJBVE9SICsgIiBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHNlcC5jaGFyQXQoMCk7CisgICAgICAgIH0KICAgICAgIH07CiAgICAgICAKICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nW10+IHNuaXBwZXRzID0gaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0RmllbGRzKGZpZWxkTmFtZXMsIHF1ZXJ5LCBzZWFyY2hlciwgZG9jSURzLCBtYXhQYXNzYWdlcyk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2xvZ2dpbmcvTG9nV2F0Y2hlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9sb2dnaW5nL0xvZ1dhdGNoZXIuamF2YQppbmRleCAxNmI1Mjc2Li5kMmEyM2JkIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2xvZ2dpbmcvTG9nV2F0Y2hlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvbG9nZ2luZy9Mb2dXYXRjaGVyLmphdmEKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgdi5zaXplID0gY29uZmlnLmdldEludChDb25maWdTb2xyLkNmZ1Byb3AuU09MUl9MT0dHSU5HX1dBVENIRVJfU0laRSwgNTApOwogICAgICAgdi50aHJlc2hvbGQgPSBjb25maWcuZ2V0KENvbmZpZ1NvbHIuQ2ZnUHJvcC5TT0xSX0xPR0dJTkdfV0FUQ0hFUl9USFJFU0hPTEQsIG51bGwpOwogICAgICAgaWYgKHYuc2l6ZSA+IDApIHsKLSAgICAgICAgbG9nLmluZm8oIlJlZ2lzdGVyaW5nIExvZyBMaXN0ZW5lciIpOworICAgICAgICBsb2cuaW5mbygiUmVnaXN0ZXJpbmcgTG9nIExpc3RlbmVyIFt7fV0iLCBsb2dXYXRjaGVyLmdldE5hbWUoKSk7CiAgICAgICAgIGxvZ1dhdGNoZXIucmVnaXN0ZXJMaXN0ZW5lcih2KTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3JlcXVlc3QvU29sclF1ZXJ5UmVxdWVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1NvbHJRdWVyeVJlcXVlc3QuamF2YQppbmRleCA3M2FiYTMwLi5kMDQ1ZjQzIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3JlcXVlc3QvU29sclF1ZXJ5UmVxdWVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvcmVxdWVzdC9Tb2xyUXVlcnlSZXF1ZXN0LmphdmEKQEAgLTczLDYgKzczLDkgQEAKIAogICAvKiogVGhlIHNjaGVtYSBzbmFwc2hvdCBmcm9tIGNvcmUuZ2V0TGF0ZXN0U2NoZW1hKCkgYXQgcmVxdWVzdCBjcmVhdGlvbi4gKi8KICAgcHVibGljIEluZGV4U2NoZW1hIGdldFNjaGVtYSgpOworICAKKyAgLyoqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHNjaGVtYSBzbmFwc2hvdCB3aXRoIHRoZSBsYXRlc3QgZnJvbSB0aGUgY29yZS4gKi8KKyAgcHVibGljIHZvaWQgdXBkYXRlU2NoZW1hVG9MYXRlc3QoKTsKIAogICAvKioKICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgYWxsIHRoZSBpbXBvcnRhbnQgcGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvcmVxdWVzdC9Tb2xyUXVlcnlSZXF1ZXN0QmFzZS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1NvbHJRdWVyeVJlcXVlc3RCYXNlLmphdmEKaW5kZXggMWYwOTNlNC4uMWFkNzViYiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1NvbHJRdWVyeVJlcXVlc3RCYXNlLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1NvbHJRdWVyeVJlcXVlc3RCYXNlLmphdmEKQEAgLTQyLDggKzQyLDggQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNvbHJRdWVyeVJlcXVlc3RCYXNlIGltcGxlbWVudHMgU29sclF1ZXJ5UmVxdWVzdCB7CiAgIHByb3RlY3RlZCBmaW5hbCBTb2xyQ29yZSBjb3JlOwotICBwcm90ZWN0ZWQgZmluYWwgSW5kZXhTY2hlbWEgc2NoZW1hOwogICBwcm90ZWN0ZWQgZmluYWwgU29sclBhcmFtcyBvcmlnUGFyYW1zOworICBwcm90ZWN0ZWQgdm9sYXRpbGUgSW5kZXhTY2hlbWEgc2NoZW1hOwogICBwcm90ZWN0ZWQgU29sclBhcmFtcyBwYXJhbXM7CiAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LE9iamVjdD4gY29udGV4dDsKICAgcHJvdGVjdGVkIEl0ZXJhYmxlPENvbnRlbnRTdHJlYW0+IHN0cmVhbXM7CkBAIC0xMTIsNiArMTEyLDExIEBACiAgICAgcmV0dXJuIHNjaGVtYTsKICAgfQogCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB1cGRhdGVTY2hlbWFUb0xhdGVzdCgpIHsKKyAgICBzY2hlbWEgPSBjb3JlLmdldExhdGVzdFNjaGVtYSgpOworICB9CisKICAgLyoqCiAgICAqIEZyZWVzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LCB0aGlzIG1ldGhvZCA8Yj5tdXN0PC9iPgogICAgKiBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBpbiB1c2UuCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3Jlc3BvbnNlL0JpbmFyeVJlc3BvbnNlV3JpdGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3Jlc3BvbnNlL0JpbmFyeVJlc3BvbnNlV3JpdGVyLmphdmEKaW5kZXggMGUyYjQ5NC4uYjg5NDQ1YSAxMDA3NTUKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9yZXNwb25zZS9CaW5hcnlSZXNwb25zZVdyaXRlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvcmVzcG9uc2UvQmluYXJ5UmVzcG9uc2VXcml0ZXIuamF2YQpAQCAtMjYwLDExICsyNjAsOSBAQAogICAgIEtOT1dOX1RZUEVTLmFkZChCQ0RJbnRGaWVsZC5jbGFzcyk7CiAgICAgS05PV05fVFlQRVMuYWRkKEJDRExvbmdGaWVsZC5jbGFzcyk7CiAgICAgS05PV05fVFlQRVMuYWRkKEJDRFN0ckZpZWxkLmNsYXNzKTsKLSAgICBLTk9XTl9UWVBFUy5hZGQoQnl0ZUZpZWxkLmNsYXNzKTsKICAgICBLTk9XTl9UWVBFUy5hZGQoRGF0ZUZpZWxkLmNsYXNzKTsKICAgICBLTk9XTl9UWVBFUy5hZGQoRG91YmxlRmllbGQuY2xhc3MpOwogICAgIEtOT1dOX1RZUEVTLmFkZChGbG9hdEZpZWxkLmNsYXNzKTsKLSAgICBLTk9XTl9UWVBFUy5hZGQoU2hvcnRGaWVsZC5jbGFzcyk7CiAgICAgS05PV05fVFlQRVMuYWRkKEludEZpZWxkLmNsYXNzKTsKICAgICBLTk9XTl9UWVBFUy5hZGQoTG9uZ0ZpZWxkLmNsYXNzKTsKICAgICBLTk9XTl9UWVBFUy5hZGQoU29ydGFibGVMb25nRmllbGQuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvQnl0ZUZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9CeXRlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczY2U3ZC4uMDAwMDAwMAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9CeXRlRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnNjaGVtYTsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi5WYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkJ5dGVGaWVsZFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5HZW5lcmFsRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhhYmxlRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguU3RvcmFibGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU29ydEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlRleHRSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLlFQYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBudW1lcmljIGZpZWxkIHRoYXQgY2FuIGNvbnRhaW4gOC1iaXQgc2lnbmVkIHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciAKLSAqIHZhbHVlcywgZW5jb2RlZCBhcyBzaW1wbGUgU3RyaW5ncy4KLSAqCi0gKiA8cD4KLSAqIEZpZWxkIHZhbHVlcyB3aWxsIHNvcnQgbnVtZXJpY2FsbHksIGJ1dCBSYW5nZSBRdWVyaWVzIChhbmQgb3RoZXIgZmVhdHVyZXMgCi0gKiB0aGF0IHJlbHkgb24gbnVtZXJpYyByYW5nZXMpIHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQ6IHZhbHVlcyB3aWxsIGJlIAotICogZXZhbHVhdGVkIGluIHVuaWNvZGUgU3RyaW5nIG9yZGVyLCBub3QgbnVtZXJpYyBvcmRlci4KLSAqIDwvcD4KLSAqCi0gKiA8dWw+Ci0gKiAgPGxpPk1pbiBWYWx1ZSBBbGxvd2VkOiAtMTI4PC9saT4KLSAqICA8bGk+TWF4IFZhbHVlIEFsbG93ZWQ6IDEyNzwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgQnl0ZQotICovCi1wdWJsaWMgY2xhc3MgQnl0ZUZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIHsKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoSW5kZXhTY2hlbWEgc2NoZW1hLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpIHsKLSAgICBzdXBlci5pbml0KHNjaGVtYSwgYXJncyk7Ci0gICAgcmVzdHJpY3RQcm9wcyhTT1JUX01JU1NJTkdfRklSU1QgfCBTT1JUX01JU1NJTkdfTEFTVCk7Ci0gIH0KLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU29ydEZpZWxkIGdldFNvcnRGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCwgYm9vbGVhbiByZXZlcnNlKSB7Ci0gICAgZmllbGQuY2hlY2tTb3J0YWJpbGl0eSgpOwotICAgIHJldHVybiBuZXcgU29ydEZpZWxkKGZpZWxkLm5hbWUsIFNvcnRGaWVsZC5UeXBlLkJZVEUsIHJldmVyc2UpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBWYWx1ZVNvdXJjZSBnZXRWYWx1ZVNvdXJjZShTY2hlbWFGaWVsZCBmaWVsZCwgUVBhcnNlciBxcGFyc2VyKSB7Ci0gICAgZmllbGQuY2hlY2tGaWVsZENhY2hlU291cmNlKHFwYXJzZXIpOwotICAgIHJldHVybiBuZXcgQnl0ZUZpZWxkU291cmNlKGZpZWxkLm5hbWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRleHRSZXNwb25zZVdyaXRlciB3cml0ZXIsIFN0cmluZyBuYW1lLCBTdG9yYWJsZUZpZWxkIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHMgPSBmLnN0cmluZ1ZhbHVlKCk7Ci0KLSAgICAvLyB0aGVzZSB2YWx1ZXMgbWF5IGJlIGZyb20gYSBsZWdhY3kgbHVjZW5lIGluZGV4LCB3aGljaCBtYXkKLSAgICAvLyBub3QgYmUgcHJvcGVybHkgZm9ybWF0dGVkIGluIHNvbWUgb3V0cHV0IGZvcm1hdHMsIG9yIG1heQotICAgIC8vIGluY29ycmVjdGx5IGhhdmUgYSB6ZXJvIGxlbmd0aC4KLQotICAgIGlmIChzLmxlbmd0aCgpPT0wKSB7Ci0gICAgICAvLyB6ZXJvIGxlbmd0aCB2YWx1ZSBtZWFucyBzb21lb25lIG1pc3Rha2VubHkgaW5kZXhlZCB0aGUgdmFsdWUKLSAgICAgIC8vIGluc3RlYWQgb2Ygc2ltcGx5IGxlYXZpbmcgaXQgb3V0LiAgV3JpdGUgYSBudWxsIHZhbHVlIGluc3RlYWQgb2YgYSBudW1lcmljLgotICAgICAgd3JpdGVyLndyaXRlTnVsbChuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgYnl0ZSB2YWwgPSBCeXRlLnBhcnNlQnl0ZShzKTsKLSAgICAgIHdyaXRlci53cml0ZUludChuYW1lLCB2YWwpOwotICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsKLSAgICAgIC8vIGNhbid0IHBhcnNlIC0gd3JpdGUgb3V0IHRoZSBjb250ZW50cyBhcyBhIHN0cmluZyBzbyBub3RoaW5nIGlzIGxvc3QgYW5kCi0gICAgICAvLyBjbGllbnRzIGRvbid0IGdldCBhIHBhcnNlIGVycm9yLgotICAgICAgd3JpdGVyLndyaXRlU3RyKG5hbWUsIHMsIHRydWUpOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnl0ZSB0b09iamVjdChTdG9yYWJsZUZpZWxkIGYpIHsKLSAgICByZXR1cm4gQnl0ZS52YWx1ZU9mKHRvRXh0ZXJuYWwoZikpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9EYXRlRmllbGQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0RhdGVGaWVsZC5qYXZhCmluZGV4IDEwMDFiMzUuLmZhZjljNGYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0RhdGVGaWVsZC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0RhdGVGaWVsZC5qYXZhCkBAIC0xMTEsNyArMTExLDcgQEAKICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIj5YTUwgc2NoZW1hIHBhcnQgMjwvYT4KICAqIEBkZXByZWNhdGVkIHtAbGluayBUcmllRGF0ZUZpZWxkfSBpcyByZWNvbWVuZGVkIGZvciBhbGwgbmV3IHNjaGVtYXMKICAqLwotcHVibGljIGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSB7CitwdWJsaWMgY2xhc3MgRGF0ZUZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIGltcGxlbWVudHMgRGF0ZVZhbHVlRmllbGRUeXBlIHsKIAogICBwdWJsaWMgc3RhdGljIFRpbWVab25lIFVUQyA9IFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKTsKIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRGF0ZVZhbHVlRmllbGRUeXBlLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9EYXRlVmFsdWVGaWVsZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU3OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRGF0ZVZhbHVlRmllbGRUeXBlLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnNjaGVtYTsKKworLyoqCisgKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBEYXRlLXZhbHVlZCBmaWVsZCB0eXBlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBEYXRlVmFsdWVGaWVsZFR5cGUgeworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRG91YmxlRmllbGQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0RvdWJsZUZpZWxkLmphdmEKaW5kZXggNWQyOTY4Zi4uNTUwYWRhZSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRG91YmxlRmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Eb3VibGVGaWVsZC5qYXZhCkBAIC0xNywxOCArMTcsMjAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi5WYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkRvdWJsZUZpZWxkU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkdlbmVyYWxGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleGFibGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TdG9yYWJsZUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0RmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlRleHRSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLlFQYXJzZXI7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TdG9yYWJsZUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm1zRW51bTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLlZhbHVlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuRG91YmxlRmllbGRTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXNwb25zZS5UZXh0UmVzcG9uc2VXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5RUGFyc2VyOworCiAvKioKICAqIEEgbGVnYWN5IG51bWVyaWMgZmllbGQgdHlwZSB0aGF0IGVuY29kZXMgIkRvdWJsZSIgdmFsdWVzIGFzIHNpbXBsZSBTdHJpbmdzLgogICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZXhjZXB0IGJ5IHBlb3BsZSB3aXRoIGV4aXN0aW5nIGluZGV4ZXMgdGhhdApAQCAtNDMsNyArNDUsMjEgQEAKICAqIAogICogQHNlZSBUcmllRG91YmxlRmllbGQKICAqLwotcHVibGljIGNsYXNzIERvdWJsZUZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIHsKK3B1YmxpYyBjbGFzcyBEb3VibGVGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSBpbXBsZW1lbnRzIERvdWJsZVZhbHVlRmllbGRUeXBlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZENhY2hlLkRvdWJsZVBhcnNlciBQQVJTRVIgPSBuZXcgRmllbGRDYWNoZS5Eb3VibGVQYXJzZXIoKSB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdGVybXMuaXRlcmF0b3IobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBwYXJzZURvdWJsZShCeXRlc1JlZiB0ZXJtKSB7CisgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHRlcm0udXRmOFRvU3RyaW5nKCkpOworICAgIH0KKyAgfTsKKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgaW5pdChJbmRleFNjaGVtYSBzY2hlbWEsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncykgewogICAgIHN1cGVyLmluaXQoc2NoZW1hLCBhcmdzKTsKQEAgLTU0LDEzICs3MCwxMyBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIFNvcnRGaWVsZCBnZXRTb3J0RmllbGQoU2NoZW1hRmllbGQgZmllbGQsIGJvb2xlYW4gcmV2ZXJzZSkgewogICAgIGZpZWxkLmNoZWNrU29ydGFiaWxpdHkoKTsKLSAgICByZXR1cm4gbmV3IFNvcnRGaWVsZChmaWVsZC5uYW1lLCBTb3J0RmllbGQuVHlwZS5ET1VCTEUsIHJldmVyc2UpOworICAgIHJldHVybiBuZXcgU29ydEZpZWxkKGZpZWxkLm5hbWUsIFBBUlNFUiwgcmV2ZXJzZSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFZhbHVlU291cmNlIGdldFZhbHVlU291cmNlKFNjaGVtYUZpZWxkIGZpZWxkLCBRUGFyc2VyIHFwYXJzZXIpIHsKICAgICBmaWVsZC5jaGVja0ZpZWxkQ2FjaGVTb3VyY2UocXBhcnNlcik7Ci0gICAgcmV0dXJuIG5ldyBEb3VibGVGaWVsZFNvdXJjZShmaWVsZC5uYW1lKTsKKyAgICByZXR1cm4gbmV3IERvdWJsZUZpZWxkU291cmNlKGZpZWxkLm5hbWUsIFBBUlNFUik7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0RvdWJsZVZhbHVlRmllbGRUeXBlLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Eb3VibGVWYWx1ZUZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTcxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Eb3VibGVWYWx1ZUZpZWxkVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zY2hlbWE7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgZG91YmxlLXZhbHVlZCBmaWVsZCB0eXBlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBEb3VibGVWYWx1ZUZpZWxkVHlwZSBleHRlbmRzIE51bWVyaWNWYWx1ZUZpZWxkVHlwZSB7Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9GaWVsZFR5cGUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ZpZWxkVHlwZS5qYXZhCmluZGV4IDhhY2RkYWEuLjVkMDNkMzggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ZpZWxkVHlwZS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ZpZWxkVHlwZS5qYXZhCkBAIC0xNywxOCArMTcsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zY2hlbWE7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkFic3RyYWN0QW5hbHlzaXNGYWN0b3J5LkxVQ0VORV9NQVRDSF9WRVJTSU9OX1BBUkFNOyAKLQogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy50b2tlbmF0dHJpYnV0ZXMuQ2hhclRlcm1BdHRyaWJ1dGU7CkBAIC02Nyw2ICs1NSwxOCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy51dGlsLkFic3RyYWN0QW5hbHlzaXNGYWN0b3J5LkxVQ0VORV9NQVRDSF9WRVJTSU9OX1BBUkFNOworCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIGFsbCBmaWVsZCB0eXBlcyB1c2VkIGJ5IGFuIGluZGV4IHNjaGVtYS4KICAqCkBAIC03OTksNiArNzk5LDE1IEBACiAgICAgICBuYW1lZFByb3BlcnR5VmFsdWVzLmFkZChnZXRQcm9wZXJ0eU5hbWUoVE9LRU5JWkVEKSwgaXNUb2tlbml6ZWQoKSk7CiAgICAgICAvLyBUaGUgQklOQVJZIHByb3BlcnR5IGlzIGFsd2F5cyBmYWxzZQogICAgICAgLy8gbmFtZWRQcm9wZXJ0eVZhbHVlcy5hZGQoZ2V0UHJvcGVydHlOYW1lKEJJTkFSWSksIGhhc1Byb3BlcnR5KEJJTkFSWSkpOworICAgICAgaWYgKG51bGwgIT0gZ2V0U2ltaWxhcml0eUZhY3RvcnkoKSkgeworICAgICAgICBuYW1lZFByb3BlcnR5VmFsdWVzLmFkZChTSU1JTEFSSVRZLCBnZXRTaW1pbGFyaXR5RmFjdG9yeSgpLmdldE5hbWVkUHJvcGVydHlWYWx1ZXMoKSk7CisgICAgICB9CisgICAgICBpZiAobnVsbCAhPSBnZXRQb3N0aW5nc0Zvcm1hdCgpKSB7CisgICAgICAgIG5hbWVkUHJvcGVydHlWYWx1ZXMuYWRkKFBPU1RJTkdTX0ZPUk1BVCwgZ2V0UG9zdGluZ3NGb3JtYXQoKSk7CisgICAgICB9CisgICAgICBpZiAobnVsbCAhPSBnZXREb2NWYWx1ZXNGb3JtYXQoKSkgeworICAgICAgICBuYW1lZFByb3BlcnR5VmFsdWVzLmFkZChET0NfVkFMVUVTX0ZPUk1BVCwgZ2V0RG9jVmFsdWVzRm9ybWF0KCkpOworICAgICAgfQogICAgIH0gZWxzZSB7IC8vIERvbid0IHNob3cgZGVmYXVsdHMKICAgICAgIFNldDxTdHJpbmc+IGZpZWxkUHJvcGVydGllcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IEZpZWxkUHJvcGVydGllcy5wcm9wZXJ0eU5hbWVzKSB7CkBAIC04MjYsMTUgKzgzNSw3IEBACiAgICAgICAgIG5hbWVkUHJvcGVydHlWYWx1ZXMuYWRkKE1VTFRJX1RFUk1fQU5BTFlaRVIsIGdldEFuYWx5emVyUHJvcGVydGllcygoKFRleHRGaWVsZCkgdGhpcykuZ2V0TXVsdGlUZXJtQW5hbHl6ZXIoKSkpOwogICAgICAgfQogICAgIH0KLSAgICBpZiAobnVsbCAhPSBnZXRTaW1pbGFyaXR5RmFjdG9yeSgpKSB7Ci0gICAgICBuYW1lZFByb3BlcnR5VmFsdWVzLmFkZChTSU1JTEFSSVRZLCBnZXRTaW1pbGFyaXR5RmFjdG9yeSgpLmdldE5hbWVkUHJvcGVydHlWYWx1ZXMoKSk7Ci0gICAgfQotICAgIGlmIChudWxsICE9IGdldFBvc3RpbmdzRm9ybWF0KCkpIHsKLSAgICAgIG5hbWVkUHJvcGVydHlWYWx1ZXMuYWRkKFBPU1RJTkdTX0ZPUk1BVCwgZ2V0UG9zdGluZ3NGb3JtYXQoKSk7Ci0gICAgfQotICAgIGlmIChudWxsICE9IGdldERvY1ZhbHVlc0Zvcm1hdCgpKSB7Ci0gICAgICBuYW1lZFByb3BlcnR5VmFsdWVzLmFkZChET0NfVkFMVUVTX0ZPUk1BVCwgZ2V0RG9jVmFsdWVzRm9ybWF0KCkpOwotICAgIH0KKwogICAgIHJldHVybiBuYW1lZFByb3BlcnR5VmFsdWVzOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0Zsb2F0RmllbGQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0Zsb2F0RmllbGQuamF2YQppbmRleCA3NWNmMDg3Li43ZTIzNDQzIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9GbG9hdEZpZWxkLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRmxvYXRGaWVsZC5qYXZhCkBAIC0xOSwxMSArMTksMTUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24uVmFsdWVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5GbG9hdEZpZWxkU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLlFQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguR2VuZXJhbEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4YWJsZUZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlN0b3JhYmxlRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXNFbnVtOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXNwb25zZS5UZXh0UmVzcG9uc2VXcml0ZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtNDIsNyArNDYsMjEgQEAKICAqIAogICogQHNlZSBUcmllRmxvYXRGaWVsZAogICovCi1wdWJsaWMgY2xhc3MgRmxvYXRGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSB7CitwdWJsaWMgY2xhc3MgRmxvYXRGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSBpbXBsZW1lbnRzIEZsb2F0VmFsdWVGaWVsZFR5cGUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkQ2FjaGUuRmxvYXRQYXJzZXIgUEFSU0VSID0gbmV3IEZpZWxkQ2FjaGUuRmxvYXRQYXJzZXIoKSB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdGVybXMuaXRlcmF0b3IobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IHBhcnNlRmxvYXQoQnl0ZXNSZWYgdGVybSkgeworICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQodGVybS51dGY4VG9TdHJpbmcoKSk7CisgICAgfQorICB9OworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBpbml0KEluZGV4U2NoZW1hIHNjaGVtYSwgTWFwPFN0cmluZyxTdHJpbmc+IGFyZ3MpIHsKICAgICBzdXBlci5pbml0KHNjaGVtYSwgYXJncyk7CkBAIC01OCw3ICs3Niw3IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgVmFsdWVTb3VyY2UgZ2V0VmFsdWVTb3VyY2UoU2NoZW1hRmllbGQgZmllbGQsIFFQYXJzZXIgcXBhcnNlcikgewogICAgIGZpZWxkLmNoZWNrRmllbGRDYWNoZVNvdXJjZShxcGFyc2VyKTsKLSAgICByZXR1cm4gbmV3IEZsb2F0RmllbGRTb3VyY2UoZmllbGQubmFtZSk7CisgICAgcmV0dXJuIG5ldyBGbG9hdEZpZWxkU291cmNlKGZpZWxkLm5hbWUsIFBBUlNFUik7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0Zsb2F0VmFsdWVGaWVsZFR5cGUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0Zsb2F0VmFsdWVGaWVsZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjA2Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvRmxvYXRWYWx1ZUZpZWxkVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zY2hlbWE7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgZmxvYXQtdmFsdWVkIGZpZWxkIHR5cGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZsb2F0VmFsdWVGaWVsZFR5cGUgZXh0ZW5kcyBOdW1lcmljVmFsdWVGaWVsZFR5cGUgeworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvSW5kZXhTY2hlbWEuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0luZGV4U2NoZW1hLmphdmEKaW5kZXggYWQwNDIyZC4uZmJkNWM3MCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvSW5kZXhTY2hlbWEuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9JbmRleFNjaGVtYS5qYXZhCkBAIC0zMTEsOCArMzExLDggQEAKICAgICovCiAgIHB1YmxpYyBTY2hlbWFGaWVsZCBnZXRVbmlxdWVLZXlGaWVsZCgpIHsgcmV0dXJuIHVuaXF1ZUtleUZpZWxkOyB9CiAKLSAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlS2V5RmllbGROYW1lOwotICBwcml2YXRlIEZpZWxkVHlwZSB1bmlxdWVLZXlGaWVsZFR5cGU7CisgIHByb3RlY3RlZCBTdHJpbmcgdW5pcXVlS2V5RmllbGROYW1lOworICBwcm90ZWN0ZWQgRmllbGRUeXBlIHVuaXF1ZUtleUZpZWxkVHlwZTsKIAogICAvKioKICAgICogVGhlIHJhdyAoZmllbGQgdHlwZSBlbmNvZGVkKSB2YWx1ZSBvZiB0aGUgVW5pcXVlIEtleSBmaWVsZCBmb3IKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ludEZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9JbnRGaWVsZC5qYXZhCmluZGV4IDNjOTMyMGMuLjJiMTQ4NjcgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ludEZpZWxkLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvSW50RmllbGQuamF2YQpAQCAtMTksMTEgKzE5LDE1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLlZhbHVlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuSW50RmllbGRTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkZpZWxkQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guUVBhcnNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5HZW5lcmFsRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhhYmxlRmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguU3RvcmFibGVGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UZXJtc0VudW07CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlRleHRSZXNwb25zZVdyaXRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC00Miw3ICs0NiwyMSBAQAogICogCiAgKiBAc2VlIFRyaWVJbnRGaWVsZAogICovCi1wdWJsaWMgY2xhc3MgSW50RmllbGQgZXh0ZW5kcyBQcmltaXRpdmVGaWVsZFR5cGUgeworcHVibGljIGNsYXNzIEludEZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIGltcGxlbWVudHMgSW50VmFsdWVGaWVsZFR5cGUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkQ2FjaGUuSW50UGFyc2VyIFBBUlNFUiA9IG5ldyBGaWVsZENhY2hlLkludFBhcnNlcigpIHsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVybXNFbnVtIHRlcm1zRW51bShUZXJtcyB0ZXJtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiB0ZXJtcy5pdGVyYXRvcihudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHBhcnNlSW50KEJ5dGVzUmVmIHRlcm0pIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHRlcm0udXRmOFRvU3RyaW5nKCkpOworICAgIH0KKyAgfTsKKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgaW5pdChJbmRleFNjaGVtYSBzY2hlbWEsIE1hcDxTdHJpbmcsU3RyaW5nPiBhcmdzKSB7CiAgICAgc3VwZXIuaW5pdChzY2hlbWEsIGFyZ3MpOwpAQCAtNTIsMTMgKzcwLDEzIEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgU29ydEZpZWxkIGdldFNvcnRGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCxib29sZWFuIHJldmVyc2UpIHsKICAgICBmaWVsZC5jaGVja1NvcnRhYmlsaXR5KCk7Ci0gICAgcmV0dXJuIG5ldyBTb3J0RmllbGQoZmllbGQubmFtZSxTb3J0RmllbGQuVHlwZS5JTlQsIHJldmVyc2UpOworICAgIHJldHVybiBuZXcgU29ydEZpZWxkKGZpZWxkLm5hbWUsIFBBUlNFUiwgcmV2ZXJzZSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFZhbHVlU291cmNlIGdldFZhbHVlU291cmNlKFNjaGVtYUZpZWxkIGZpZWxkLCBRUGFyc2VyIHFwYXJzZXIpIHsKICAgICBmaWVsZC5jaGVja0ZpZWxkQ2FjaGVTb3VyY2UocXBhcnNlcik7Ci0gICAgcmV0dXJuIG5ldyBJbnRGaWVsZFNvdXJjZShmaWVsZC5uYW1lKTsKKyAgICByZXR1cm4gbmV3IEludEZpZWxkU291cmNlKGZpZWxkLm5hbWUsIFBBUlNFUik7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0ludFZhbHVlRmllbGRUeXBlLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9JbnRWYWx1ZUZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9JbnRWYWx1ZUZpZWxkVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zY2hlbWE7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgaW50LXZhbHVlZCBmaWVsZCB0eXBlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJbnRWYWx1ZUZpZWxkVHlwZSBleHRlbmRzIE51bWVyaWNWYWx1ZUZpZWxkVHlwZSB7Cit9CisKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0xvbmdGaWVsZC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvTG9uZ0ZpZWxkLmphdmEKaW5kZXggOWY3OTVhNy4uNWIxOGRiOCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvTG9uZ0ZpZWxkLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvTG9uZ0ZpZWxkLmphdmEKQEAgLTIyLDcgKzIyLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguR2VuZXJhbEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4YWJsZUZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlN0b3JhYmxlRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXM7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGVybXNFbnVtOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5GaWVsZENhY2hlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5Tb3J0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuVGV4dFJlc3BvbnNlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guUVBhcnNlcjsKIApAQCAtNDIsNyArNDYsMjEgQEAKICAqIAogICogQHNlZSBUcmllTG9uZ0ZpZWxkCiAgKi8KLXB1YmxpYyBjbGFzcyBMb25nRmllbGQgZXh0ZW5kcyBQcmltaXRpdmVGaWVsZFR5cGUgeworcHVibGljIGNsYXNzIExvbmdGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSBpbXBsZW1lbnRzIExvbmdWYWx1ZUZpZWxkVHlwZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGRDYWNoZS5Mb25nUGFyc2VyIFBBUlNFUiA9IG5ldyBGaWVsZENhY2hlLkxvbmdQYXJzZXIoKSB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlcm1zRW51bSB0ZXJtc0VudW0oVGVybXMgdGVybXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdGVybXMuaXRlcmF0b3IobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcGFyc2VMb25nKEJ5dGVzUmVmIHRlcm0pIHsKKyAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh0ZXJtLnV0ZjhUb1N0cmluZygpKTsKKyAgICB9CisgIH07CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGluaXQoSW5kZXhTY2hlbWEgc2NoZW1hLCBNYXA8U3RyaW5nLFN0cmluZz4gYXJncykgewogICAgIHN1cGVyLmluaXQoc2NoZW1hLCBhcmdzKTsKQEAgLTU0LDEzICs3MiwxMyBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIFNvcnRGaWVsZCBnZXRTb3J0RmllbGQoU2NoZW1hRmllbGQgZmllbGQsYm9vbGVhbiByZXZlcnNlKSB7CiAgICAgZmllbGQuY2hlY2tTb3J0YWJpbGl0eSgpOwotICAgIHJldHVybiBuZXcgU29ydEZpZWxkKGZpZWxkLm5hbWUsU29ydEZpZWxkLlR5cGUuTE9ORywgcmV2ZXJzZSk7CisgICAgcmV0dXJuIG5ldyBTb3J0RmllbGQoZmllbGQubmFtZSwgUEFSU0VSLCByZXZlcnNlKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgVmFsdWVTb3VyY2UgZ2V0VmFsdWVTb3VyY2UoU2NoZW1hRmllbGQgZmllbGQsIFFQYXJzZXIgcXBhcnNlcikgewogICAgIGZpZWxkLmNoZWNrRmllbGRDYWNoZVNvdXJjZShxcGFyc2VyKTsKLSAgICByZXR1cm4gbmV3IExvbmdGaWVsZFNvdXJjZShmaWVsZC5uYW1lKTsKKyAgICByZXR1cm4gbmV3IExvbmdGaWVsZFNvdXJjZShmaWVsZC5uYW1lLCBQQVJTRVIpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Mb25nVmFsdWVGaWVsZFR5cGUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL0xvbmdWYWx1ZUZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjhiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Mb25nVmFsdWVGaWVsZFR5cGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hOworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIGxvbmctdmFsdWVkIGZpZWxkIHR5cGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIExvbmdWYWx1ZUZpZWxkVHlwZSBleHRlbmRzIE51bWVyaWNWYWx1ZUZpZWxkVHlwZSB7Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9NYW5hZ2VkSW5kZXhTY2hlbWEuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL01hbmFnZWRJbmRleFNjaGVtYS5qYXZhCmluZGV4IGE1MDVmODMuLmYzZmE5MmMgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL01hbmFnZWRJbmRleFNjaGVtYS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL01hbmFnZWRJbmRleFNjaGVtYS5qYXZhCkBAIC0xNjksNiArMTY5LDEyIEBACiAgICAgcmV0dXJuIGFkZEZpZWxkcyhBcnJheXMuYXNMaXN0KG5ld0ZpZWxkKSk7CiAgIH0KIAorICBwdWJsaWMgY2xhc3MgRmllbGRFeGlzdHNFeGNlcHRpb24gZXh0ZW5kcyBTb2xyRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgRmllbGRFeGlzdHNFeGNlcHRpb24oRXJyb3JDb2RlIGNvZGUsIFN0cmluZyBtc2cpIHsKKyAgICAgIHN1cGVyKGNvZGUsIG1zZyk7CisgICAgfQorICB9CisgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIE1hbmFnZWRJbmRleFNjaGVtYSBhZGRGaWVsZHMoQ29sbGVjdGlvbjxTY2hlbWFGaWVsZD4gbmV3RmllbGRzKSB7CiAgICAgTWFuYWdlZEluZGV4U2NoZW1hIG5ld1NjaGVtYSA9IG51bGw7CkBAIC0xODMsNyArMTg5LDcgQEAKICAgICAgICAgICBmb3IgKFNjaGVtYUZpZWxkIG5ld0ZpZWxkIDogbmV3RmllbGRzKSB7CiAgICAgICAgICAgICBpZiAobnVsbCAhPSBuZXdTY2hlbWEuZ2V0RmllbGRPck51bGwobmV3RmllbGQuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZpZWxkICciICsgbmV3RmllbGQuZ2V0TmFtZSgpICsgIicgYWxyZWFkeSBleGlzdHMuIjsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLkJBRF9SRVFVRVNULCBtc2cpOworICAgICAgICAgICAgICB0aHJvdyBuZXcgRmllbGRFeGlzdHNFeGNlcHRpb24oRXJyb3JDb2RlLkJBRF9SRVFVRVNULCBtc2cpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV3U2NoZW1hLmZpZWxkcy5wdXQobmV3RmllbGQuZ2V0TmFtZSgpLCBuZXdGaWVsZCk7CiAKQEAgLTMyOCw2ICszMzQsOCBAQAogICAgIG5ld1NjaGVtYS5zaW1pbGFyaXR5RmFjdG9yeSA9IHNpbWlsYXJpdHlGYWN0b3J5OwogICAgIG5ld1NjaGVtYS5pc0V4cGxpY2l0U2ltaWxhcml0eSA9IGlzRXhwbGljaXRTaW1pbGFyaXR5OwogICAgIG5ld1NjaGVtYS51bmlxdWVLZXlGaWVsZCA9IHVuaXF1ZUtleUZpZWxkOworICAgIG5ld1NjaGVtYS51bmlxdWVLZXlGaWVsZE5hbWUgPSB1bmlxdWVLZXlGaWVsZE5hbWU7CisgICAgbmV3U2NoZW1hLnVuaXF1ZUtleUZpZWxkVHlwZSA9IHVuaXF1ZUtleUZpZWxkVHlwZTsKIAogICAgIGlmIChpbmNsdWRlRmllbGREYXRhU3RydWN0dXJlcykgewogICAgICAgLy8gVGhlc2UgbmVlZCBuZXcgY29sbGVjdGlvbnMsIHNpbmNlIGFkZEZpZWxkcygpIGNhbiBhZGQgbWVtYmVycyB0byB0aGVtCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9OdW1lcmljVmFsdWVGaWVsZFR5cGUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL051bWVyaWNWYWx1ZUZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjM4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9OdW1lcmljVmFsdWVGaWVsZFR5cGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hOworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIG51bWVyaWMtdmFsdWVkIGZpZWxkIHR5cGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE51bWVyaWNWYWx1ZUZpZWxkVHlwZSB7Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9TaG9ydEZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9TaG9ydEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDU2MDkuLjAwMDAwMDAKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvU2hvcnRGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnNjaGVtYTsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi5WYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLlNob3J0RmllbGRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguR2VuZXJhbEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4YWJsZUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlN0b3JhYmxlRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnRGaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXNwb25zZS5UZXh0UmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5RUGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSBudW1lcmljIGZpZWxkIHRoYXQgY2FuIGNvbnRhaW4gMTYtYml0IHNpZ25lZCB0d28ncyBjb21wbGVtZW50IGludGVnZXIKLSAqIHZhbHVlcywgZW5jb2RlZCBhcyBzaW1wbGUgU3RyaW5ncy4KLSAqCi0gKiA8cD4KLSAqIEZpZWxkIHZhbHVlcyB3aWxsIHNvcnQgbnVtZXJpY2FsbHksIGJ1dCBSYW5nZSBRdWVyaWVzIChhbmQgb3RoZXIgZmVhdHVyZXMgCi0gKiB0aGF0IHJlbHkgb24gbnVtZXJpYyByYW5nZXMpIHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQ6IHZhbHVlcyB3aWxsIGJlIAotICogZXZhbHVhdGVkIGluIHVuaWNvZGUgU3RyaW5nIG9yZGVyLCBub3QgbnVtZXJpYyBvcmRlci4KLSAqIDwvcD4KLSAqCi0gKiA8dWw+Ci0gKiAgPGxpPk1pbiBWYWx1ZSBBbGxvd2VkOiAtMzI3Njg8L2xpPgotICogIDxsaT5NYXggVmFsdWUgQWxsb3dlZDogMzI3Njc8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIFNob3J0Ci0gKiovCi1wdWJsaWMgY2xhc3MgU2hvcnRGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSB7Ci0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBpbml0KEluZGV4U2NoZW1hIHNjaGVtYSwgTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzKSB7Ci0gICAgc3VwZXIuaW5pdChzY2hlbWEsIGFyZ3MpOwotICAgIHJlc3RyaWN0UHJvcHMoU09SVF9NSVNTSU5HX0ZJUlNUIHwgU09SVF9NSVNTSU5HX0xBU1QpOwotICB9Ci0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU29ydEZpZWxkIGdldFNvcnRGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCwgYm9vbGVhbiByZXZlcnNlKSB7Ci0gICAgZmllbGQuY2hlY2tTb3J0YWJpbGl0eSgpOwotICAgIHJldHVybiBuZXcgU29ydEZpZWxkKGZpZWxkLm5hbWUsIFNvcnRGaWVsZC5UeXBlLlNIT1JULCByZXZlcnNlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgVmFsdWVTb3VyY2UgZ2V0VmFsdWVTb3VyY2UoU2NoZW1hRmllbGQgZmllbGQsIFFQYXJzZXIgcXBhcnNlcikgewotICAgIGZpZWxkLmNoZWNrRmllbGRDYWNoZVNvdXJjZShxcGFyc2VyKTsKLSAgICByZXR1cm4gbmV3IFNob3J0RmllbGRTb3VyY2UoZmllbGQubmFtZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGUoVGV4dFJlc3BvbnNlV3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWUsIFN0b3JhYmxlRmllbGQgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgcyA9IGYuc3RyaW5nVmFsdWUoKTsKLQotICAgIC8vIHRoZXNlIHZhbHVlcyBtYXkgYmUgZnJvbSBhIGxlZ2FjeSBsdWNlbmUgaW5kZXgsIHdoaWNoIG1heQotICAgIC8vIG5vdCBiZSBwcm9wZXJseSBmb3JtYXR0ZWQgaW4gc29tZSBvdXRwdXQgZm9ybWF0cywgb3IgbWF5Ci0gICAgLy8gaW5jb3JyZWN0bHkgaGF2ZSBhIHplcm8gbGVuZ3RoLgotCi0gICAgaWYgKHMubGVuZ3RoKCk9PTApIHsKLSAgICAgIC8vIHplcm8gbGVuZ3RoIHZhbHVlIG1lYW5zIHNvbWVvbmUgbWlzdGFrZW5seSBpbmRleGVkIHRoZSB2YWx1ZQotICAgICAgLy8gaW5zdGVhZCBvZiBzaW1wbHkgbGVhdmluZyBpdCBvdXQuICBXcml0ZSBhIG51bGwgdmFsdWUgaW5zdGVhZCBvZiBhIG51bWVyaWMuCi0gICAgICB3cml0ZXIud3JpdGVOdWxsKG5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBzaG9ydCB2YWwgPSBTaG9ydC5wYXJzZVNob3J0KHMpOwotICAgICAgd3JpdGVyLndyaXRlSW50KG5hbWUsIHZhbCk7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpewotICAgICAgLy8gY2FuJ3QgcGFyc2UgLSB3cml0ZSBvdXQgdGhlIGNvbnRlbnRzIGFzIGEgc3RyaW5nIHNvIG5vdGhpbmcgaXMgbG9zdCBhbmQKLSAgICAgIC8vIGNsaWVudHMgZG9uJ3QgZ2V0IGEgcGFyc2UgZXJyb3IuCi0gICAgICB3cml0ZXIud3JpdGVTdHIobmFtZSwgcywgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTaG9ydCB0b09iamVjdChTdG9yYWJsZUZpZWxkIGYpIHsKLSAgICByZXR1cm4gU2hvcnQudmFsdWVPZih0b0V4dGVybmFsKGYpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZURvdWJsZUZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZURvdWJsZUZpZWxkLmphdmEKaW5kZXggNjU0MzZmNC4uMmY0YjBhNiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvU29ydGFibGVEb3VibGVGaWVsZC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1NvcnRhYmxlRG91YmxlRmllbGQuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBEb3VibGVGaWVsZH0gb3Ige0BsaW5rIFRyaWVEb3VibGVGaWVsZH0gLSB3aWxsIGJlIHJlbW92ZWQgaW4gNS54CiAgKi8KIEBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgU29ydGFibGVEb3VibGVGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSB7CitwdWJsaWMgY2xhc3MgU29ydGFibGVEb3VibGVGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSBpbXBsZW1lbnRzIERvdWJsZVZhbHVlRmllbGRUeXBlIHsKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTb3J0RmllbGQgZ2V0U29ydEZpZWxkKFNjaGVtYUZpZWxkIGZpZWxkLGJvb2xlYW4gcmV2ZXJzZSkgewogICAgIHJldHVybiBnZXRTdHJpbmdTb3J0KGZpZWxkLHJldmVyc2UpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvU29ydGFibGVGbG9hdEZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZUZsb2F0RmllbGQuamF2YQppbmRleCA2OWRiNzYxLi5lNjZlMjU1IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZUZsb2F0RmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZUZsb2F0RmllbGQuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBGbG9hdEZpZWxkfSBvciB7QGxpbmsgVHJpZUZsb2F0RmllbGR9IC0gd2lsbCBiZSByZW1vdmVkIGluIDUueAogICovCiBARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFNvcnRhYmxlRmxvYXRGaWVsZCBleHRlbmRzIFByaW1pdGl2ZUZpZWxkVHlwZSB7CitwdWJsaWMgY2xhc3MgU29ydGFibGVGbG9hdEZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIGltcGxlbWVudHMgRmxvYXRWYWx1ZUZpZWxkVHlwZSB7CiAgIEBPdmVycmlkZQogICBwdWJsaWMgU29ydEZpZWxkIGdldFNvcnRGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCxib29sZWFuIHJldmVyc2UpIHsKICAgICByZXR1cm4gZ2V0U3RyaW5nU29ydChmaWVsZCxyZXZlcnNlKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1NvcnRhYmxlSW50RmllbGQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1NvcnRhYmxlSW50RmllbGQuamF2YQppbmRleCBjYmNiOTEzLi45NTU4NTczIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Tb3J0YWJsZUludEZpZWxkLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvU29ydGFibGVJbnRGaWVsZC5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEludEZpZWxkfSBvciB7QGxpbmsgVHJpZUludEZpZWxkfSAtIHdpbGwgYmUgcmVtb3ZlZCBpbiA1LngKICAqLwogQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBTb3J0YWJsZUludEZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIHsKK3B1YmxpYyBjbGFzcyBTb3J0YWJsZUludEZpZWxkIGV4dGVuZHMgUHJpbWl0aXZlRmllbGRUeXBlIGltcGxlbWVudHMgSW50VmFsdWVGaWVsZFR5cGUgewogICBAT3ZlcnJpZGUKICAgcHVibGljIFNvcnRGaWVsZCBnZXRTb3J0RmllbGQoU2NoZW1hRmllbGQgZmllbGQsYm9vbGVhbiByZXZlcnNlKSB7CiAgICAgcmV0dXJuIGdldFN0cmluZ1NvcnQoZmllbGQscmV2ZXJzZSk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRGF0ZUZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRGF0ZUZpZWxkLmphdmEKaW5kZXggOTAxMmU1NC4uMGE2NTJlZiAxMDA3NTUKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZURhdGVGaWVsZC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1RyaWVEYXRlRmllbGQuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICogQHNlZSBEYXRlRmllbGQKICAqIEBzZWUgVHJpZUZpZWxkCiAgKi8KLXB1YmxpYyBjbGFzcyBUcmllRGF0ZUZpZWxkIGV4dGVuZHMgRGF0ZUZpZWxkIHsKK3B1YmxpYyBjbGFzcyBUcmllRGF0ZUZpZWxkIGV4dGVuZHMgRGF0ZUZpZWxkIGltcGxlbWVudHMgRGF0ZVZhbHVlRmllbGRUeXBlIHsKIAogICBmaW5hbCBUcmllRmllbGQgd3JhcHBlZEZpZWxkID0gbmV3IFRyaWVGaWVsZCgpIHt7CiAgICAgdHlwZSA9IFRyaWVUeXBlcy5EQVRFOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZURvdWJsZUZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRG91YmxlRmllbGQuamF2YQppbmRleCBhODg4NGI0Li4xZjBkYThhIDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRG91YmxlRmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRG91YmxlRmllbGQuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICogQHNlZSBEb3VibGUKICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy90aGlyZF9lZGl0aW9uL2h0bWwvdHlwZXNWYWx1ZXMuaHRtbCM0LjIuMyI+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBzNC4yLjM8L2E+CiAgKi8KLXB1YmxpYyBjbGFzcyBUcmllRG91YmxlRmllbGQgZXh0ZW5kcyBUcmllRmllbGQgeworcHVibGljIGNsYXNzIFRyaWVEb3VibGVGaWVsZCBleHRlbmRzIFRyaWVGaWVsZCBpbXBsZW1lbnRzIERvdWJsZVZhbHVlRmllbGRUeXBlIHsKICAgewogICAgIHR5cGU9VHJpZVR5cGVzLkRPVUJMRTsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZUZsb2F0RmllbGQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1RyaWVGbG9hdEZpZWxkLmphdmEKaW5kZXggMmVhMWQxNC4uMTE2M2Q3MiAxMDA3NTUKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZUZsb2F0RmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllRmxvYXRGaWVsZC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgKiBAc2VlIEZsb2F0CiAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvdGhpcmRfZWRpdGlvbi9odG1sL3R5cGVzVmFsdWVzLmh0bWwjNC4yLjMiPkphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgczQuMi4zPC9hPgogICovCi1wdWJsaWMgY2xhc3MgVHJpZUZsb2F0RmllbGQgZXh0ZW5kcyBUcmllRmllbGQgeworcHVibGljIGNsYXNzIFRyaWVGbG9hdEZpZWxkIGV4dGVuZHMgVHJpZUZpZWxkIGltcGxlbWVudHMgRmxvYXRWYWx1ZUZpZWxkVHlwZSB7CiAgIHsKICAgICB0eXBlPVRyaWVUeXBlcy5GTE9BVDsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZUludEZpZWxkLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllSW50RmllbGQuamF2YQppbmRleCA0Y2MyOTk5Li5lNDlmNTlhIDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllSW50RmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllSW50RmllbGQuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogICogCiAgKiBAc2VlIEludGVnZXIKICAqLwotcHVibGljIGNsYXNzIFRyaWVJbnRGaWVsZCBleHRlbmRzIFRyaWVGaWVsZCB7CitwdWJsaWMgY2xhc3MgVHJpZUludEZpZWxkIGV4dGVuZHMgVHJpZUZpZWxkIGltcGxlbWVudHMgSW50VmFsdWVGaWVsZFR5cGUgewogICB7CiAgICAgdHlwZT1UcmllVHlwZXMuSU5URUdFUjsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZUxvbmdGaWVsZC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zY2hlbWEvVHJpZUxvbmdGaWVsZC5qYXZhCmluZGV4IGMyMGYyNTIuLjA1MmU0YTcgMTAwNzU1Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1RyaWVMb25nRmllbGQuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UcmllTG9uZ0ZpZWxkLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKICAqIAogICogQHNlZSBMb25nCiAgKi8KLXB1YmxpYyBjbGFzcyBUcmllTG9uZ0ZpZWxkIGV4dGVuZHMgVHJpZUZpZWxkIHsKK3B1YmxpYyBjbGFzcyBUcmllTG9uZ0ZpZWxkIGV4dGVuZHMgVHJpZUZpZWxkIGltcGxlbWVudHMgTG9uZ1ZhbHVlRmllbGRUeXBlIHsKICAgewogICAgIHR5cGU9VHJpZVR5cGVzLkxPTkc7CiAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1NvbHJJbmRleFNlYXJjaGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9Tb2xySW5kZXhTZWFyY2hlci5qYXZhCmluZGV4IGIyNTM3NDcuLjI0ZTQyOTAgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1NvbHJJbmRleFNlYXJjaGVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvU29sckluZGV4U2VhcmNoZXIuamF2YQpAQCAtMTkzLDcgKzE5MywxMyBAQAogICAgIHRoaXMubmFtZSA9ICJTZWFyY2hlckAiICsgSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSArIChuYW1lIT1udWxsID8gIiAiK25hbWUgOiAiIik7CiAgICAgbG9nLmluZm8oIk9wZW5pbmcgIiArIHRoaXMubmFtZSk7CiAKLSAgICBEaXJlY3RvcnkgZGlyID0gdGhpcy5yZWFkZXIuZGlyZWN0b3J5KCk7CisgICAgaWYgKGRpcmVjdG9yeUZhY3Rvcnkuc2VhcmNoZXJzUmVzZXJ2ZUNvbW1pdFBvaW50cygpKSB7CisgICAgICAvLyByZXNlcnZlIGNvbW1pdCBwb2ludCBmb3IgbGlmZSBvZiBzZWFyY2hlcgorICAgICAgY29yZS5nZXREZWxldGlvblBvbGljeSgpLnNhdmVDb21taXRQb2ludCgKKyAgICAgICAgICByZWFkZXIuZ2V0SW5kZXhDb21taXQoKS5nZXRHZW5lcmF0aW9uKCkpOworICAgIH0KKyAgICAKKyAgICBEaXJlY3RvcnkgZGlyID0gZ2V0SW5kZXhSZWFkZXIoKS5kaXJlY3RvcnkoKTsKICAgICAKICAgICB0aGlzLnJlc2VydmVEaXJlY3RvcnkgPSByZXNlcnZlRGlyZWN0b3J5OwogICAgIHRoaXMuY3JlYXRlZERpcmVjdG9yeSA9IHIgPT0gbnVsbDsKQEAgLTMzMSwxMiArMzM3LDE4IEBACiAgICAgLy8gc3VwZXIuY2xvc2UoKTsKICAgICAvLyBjYW4ndCB1c2Ugc3VwZXIuY2xvc2UoKSBzaW5jZSBpdCBqdXN0IGNhbGxzIHJlYWRlci5jbG9zZSgpIGFuZCB0aGF0IG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlCiAgICAgLy8gcGVyIHJlYWRlciAoZXZlbiBpZiBpbmNSZWYoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQpLgorICAgIAorICAgIGxvbmcgY3BnID0gcmVhZGVyLmdldEluZGV4Q29tbWl0KCkuZ2V0R2VuZXJhdGlvbigpOwogICAgIHRyeSB7CiAgICAgICBpZiAoY2xvc2VSZWFkZXIpIHJlYWRlci5kZWNSZWYoKTsKICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCAiUHJvYmxlbSBkZWMgcmVmJ2luZyByZWFkZXIiLCB0KTsKICAgICB9CiAKKyAgICBpZiAoZGlyZWN0b3J5RmFjdG9yeS5zZWFyY2hlcnNSZXNlcnZlQ29tbWl0UG9pbnRzKCkpIHsKKyAgICAgIGNvcmUuZ2V0RGVsZXRpb25Qb2xpY3koKS5yZWxlYXNlQ29tbWl0UG9pbnQoY3BnKTsKKyAgICB9CisKICAgICBmb3IgKFNvbHJDYWNoZSBjYWNoZSA6IGNhY2hlTGlzdCkgewogICAgICAgY2FjaGUuY2xvc2UoKTsKICAgICB9CkBAIC0xMDk1LDQxICsxMTA3LDEyIEBACiAgICAgRG9jU2V0Q29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBEb2NTZXRDb2xsZWN0b3IobWF4RG9jKCk+PjYsIG1heERvYygpKTsKIAogICAgIGlmIChmaWx0ZXI9PW51bGwpIHsKLSAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFRlcm1RdWVyeSkgewotICAgICAgICBUZXJtIHQgPSAoKFRlcm1RdWVyeSlxdWVyeSkuZ2V0VGVybSgpOwotICAgICAgICBmb3IgKGZpbmFsIEF0b21pY1JlYWRlckNvbnRleHQgbGVhZiA6IGxlYWZDb250ZXh0cykgewotICAgICAgICAgIGZpbmFsIEF0b21pY1JlYWRlciByZWFkZXIgPSBsZWFmLnJlYWRlcigpOwotICAgICAgICAgIGNvbGxlY3Rvci5zZXROZXh0UmVhZGVyKGxlYWYpOwotICAgICAgICAgIEZpZWxkcyBmaWVsZHMgPSByZWFkZXIuZmllbGRzKCk7Ci0gICAgICAgICAgVGVybXMgdGVybXMgPSBmaWVsZHMudGVybXModC5maWVsZCgpKTsKLSAgICAgICAgICBCeXRlc1JlZiB0ZXJtQnl0ZXMgPSB0LmJ5dGVzKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQml0cyBsaXZlRG9jcyA9IHJlYWRlci5nZXRMaXZlRG9jcygpOwotICAgICAgICAgIERvY3NFbnVtIGRvY3NFbnVtID0gbnVsbDsKLSAgICAgICAgICBpZiAodGVybXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVGVybXNFbnVtIHRlcm1zRW51bSA9IHRlcm1zLml0ZXJhdG9yKG51bGwpOwotICAgICAgICAgICAgaWYgKHRlcm1zRW51bS5zZWVrRXhhY3QodGVybUJ5dGVzLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgZG9jc0VudW0gPSB0ZXJtc0VudW0uZG9jcyhsaXZlRG9jcywgbnVsbCwgRG9jc0VudW0uRkxBR19OT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZG9jc0VudW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGRvY2lkOwotICAgICAgICAgICAgd2hpbGUgKChkb2NpZCA9IGRvY3NFbnVtLm5leHREb2MoKSkgIT0gRG9jSWRTZXRJdGVyYXRvci5OT19NT1JFX0RPQ1MpIHsKLSAgICAgICAgICAgICAgY29sbGVjdG9yLmNvbGxlY3QoZG9jaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3VwZXIuc2VhcmNoKHF1ZXJ5LG51bGwsY29sbGVjdG9yKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjb2xsZWN0b3IuZ2V0RG9jU2V0KCk7Ci0KKyAgICAgIHN1cGVyLnNlYXJjaChxdWVyeSxudWxsLGNvbGxlY3Rvcik7CiAgICAgfSBlbHNlIHsKICAgICAgIEZpbHRlciBsdWNlbmVGaWx0ZXIgPSBmaWx0ZXIuZ2V0VG9wRmlsdGVyKCk7CiAgICAgICBzdXBlci5zZWFyY2gocXVlcnksIGx1Y2VuZUZpbHRlciwgY29sbGVjdG9yKTsKLSAgICAgIHJldHVybiBjb2xsZWN0b3IuZ2V0RG9jU2V0KCk7CiAgICAgfQorICAgIHJldHVybiBjb2xsZWN0b3IuZ2V0RG9jU2V0KCk7CiAgIH0KIAogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9WYWx1ZVNvdXJjZVBhcnNlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvVmFsdWVTb3VyY2VQYXJzZXIuamF2YQppbmRleCBiMGQ3ODQxLi5lNDI2YjhiIDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9WYWx1ZVNvdXJjZVBhcnNlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1ZhbHVlU291cmNlUGFyc2VyLmphdmEKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAgfQogICAgIH0pOwogCi0gICAgYWRkUGFyc2VyKCJnZW9kaXN0IiwgSGF2ZXJzaW5lQ29uc3RGdW5jdGlvbi5wYXJzZXIpOworICAgIGFkZFBhcnNlcigiZ2VvZGlzdCIsIG5ldyBHZW9EaXN0VmFsdWVTb3VyY2VQYXJzZXIoKSk7CiAKICAgICBhZGRQYXJzZXIoImhzaW4iLCBuZXcgVmFsdWVTb3VyY2VQYXJzZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTMwOSwxOCArMzA5LDggQEAKICAgICAgICAgVmFsdWVTb3VyY2Ugb25lID0gZnAucGFyc2VWYWx1ZVNvdXJjZSgpOwogICAgICAgICBWYWx1ZVNvdXJjZSB0d28gPSBmcC5wYXJzZVZhbHVlU291cmNlKCk7CiAgICAgICAgIGlmIChmcC5oYXNNb3JlQXJndW1lbnRzKCkpIHsKLQotCi0gICAgICAgICAgTGlzdDxWYWx1ZVNvdXJjZT4gczEgPSBuZXcgQXJyYXlMaXN0PFZhbHVlU291cmNlPigpOwotICAgICAgICAgIHMxLmFkZChvbmUpOwotICAgICAgICAgIHMxLmFkZCh0d28pOwotICAgICAgICAgIHB2MSA9IG5ldyBWZWN0b3JWYWx1ZVNvdXJjZShzMSk7Ci0gICAgICAgICAgVmFsdWVTb3VyY2UgeDIgPSBmcC5wYXJzZVZhbHVlU291cmNlKCk7Ci0gICAgICAgICAgVmFsdWVTb3VyY2UgeTIgPSBmcC5wYXJzZVZhbHVlU291cmNlKCk7Ci0gICAgICAgICAgTGlzdDxWYWx1ZVNvdXJjZT4gczIgPSBuZXcgQXJyYXlMaXN0PFZhbHVlU291cmNlPigpOwotICAgICAgICAgIHMyLmFkZCh4Mik7Ci0gICAgICAgICAgczIuYWRkKHkyKTsKLSAgICAgICAgICBwdjIgPSBuZXcgVmVjdG9yVmFsdWVTb3VyY2UoczIpOworICAgICAgICAgIHB2MSA9IG5ldyBWZWN0b3JWYWx1ZVNvdXJjZShBcnJheXMuYXNMaXN0KG9uZSwgdHdvKSk7Ly94MSwgeTEKKyAgICAgICAgICBwdjIgPSBuZXcgVmVjdG9yVmFsdWVTb3VyY2UoQXJyYXlzLmFzTGlzdChmcC5wYXJzZVZhbHVlU291cmNlKCksIGZwLnBhcnNlVmFsdWVTb3VyY2UoKSkpOy8veDIsIHkyCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBtdWx0aVZhbHVlIHNvdXJjZQogICAgICAgICAgIGlmIChvbmUgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlICYmIHR3byBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZnVuY3Rpb24vZGlzdGFuY2UvR2VvRGlzdFZhbHVlU291cmNlUGFyc2VyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9mdW5jdGlvbi9kaXN0YW5jZS9HZW9EaXN0VmFsdWVTb3VyY2VQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODk5ODBhCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZnVuY3Rpb24vZGlzdGFuY2UvR2VvRGlzdFZhbHVlU291cmNlUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5mdW5jdGlvbi5kaXN0YW5jZTsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBjb20uc3BhdGlhbDRqLmNvcmUuZGlzdGFuY2UuRGlzdGFuY2VVdGlsczsKK2ltcG9ydCBjb20uc3BhdGlhbDRqLmNvcmUuZXhjZXB0aW9uLkludmFsaWRTaGFwZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3BhdGlhbDRqLmNvcmUuaW8uUGFyc2VVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLlZhbHVlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuQ29uc3ROdW1iZXJTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5Eb3VibGVDb25zdFZhbHVlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuTXVsdGlWYWx1ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLlZlY3RvclZhbHVlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLlNwYXRpYWxQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLkZ1bmN0aW9uUVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLlN5bnRheEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guVmFsdWVTb3VyY2VQYXJzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFBhcnNlcyAiZ2VvZGlzdCIgY3JlYXRpbmcge0BsaW5rIEhhdmVyc2luZUNvbnN0RnVuY3Rpb259IG9yIHtAbGluayBIYXZlcnNpbmVGdW5jdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBHZW9EaXN0VmFsdWVTb3VyY2VQYXJzZXIgZXh0ZW5kcyBWYWx1ZVNvdXJjZVBhcnNlciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBWYWx1ZVNvdXJjZSBwYXJzZShGdW5jdGlvblFQYXJzZXIgZnApIHRocm93cyBTeW50YXhFcnJvciB7CisgICAgLy8gVE9ETzogZGlzcGF0Y2ggdGhyb3VnaCBTcGF0aWFsUXVlcnlhYmxlIGluIHRoZSBmdXR1cmU/CisgICAgTGlzdDxWYWx1ZVNvdXJjZT4gc291cmNlcyA9IGZwLnBhcnNlVmFsdWVTb3VyY2VMaXN0KCk7CisKKyAgICAvLyAibSIgaXMgYSBtdWx0aS12YWx1ZSBzb3VyY2UsICJ4IiBpcyBhIHNpbmdsZS12YWx1ZSBzb3VyY2UKKyAgICAvLyBhbGxvdyAobSxtKSAobSx4LHgpICh4LHgsbSkgKHgseCx4LHgpCisgICAgLy8gaWYgbm90IGVub3VnaCBwb2ludHMgYXJlIHByZXNlbnQsICJwdCIgd2lsbCBiZSBjaGVja2VkIGZpcnN0LCBmb2xsb3dlZCBieSAic2ZpZWxkIi4KKworICAgIE11bHRpVmFsdWVTb3VyY2UgbXYxID0gbnVsbDsKKyAgICBNdWx0aVZhbHVlU291cmNlIG12MiA9IG51bGw7CisKKyAgICBpZiAoc291cmNlcy5zaXplKCkgPT0gMCkgeworICAgICAgLy8gbm90aGluZyB0byBkbyBub3cKKyAgICB9IGVsc2UgaWYgKHNvdXJjZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgIFZhbHVlU291cmNlIHZzID0gc291cmNlcy5nZXQoMCk7CisgICAgICBpZiAoISh2cyBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpKSB7CisgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiZ2VvZGlzdCAtIGludmFsaWQgcGFyYW1ldGVyczoiICsgc291cmNlcyk7CisgICAgICB9CisgICAgICBtdjEgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czsKKyAgICB9IGVsc2UgaWYgKHNvdXJjZXMuc2l6ZSgpID09IDIpIHsKKyAgICAgIFZhbHVlU291cmNlIHZzMSA9IHNvdXJjZXMuZ2V0KDApOworICAgICAgVmFsdWVTb3VyY2UgdnMyID0gc291cmNlcy5nZXQoMSk7CisKKyAgICAgIGlmICh2czEgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlICYmIHZzMiBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpIHsKKyAgICAgICAgbXYxID0gKE11bHRpVmFsdWVTb3VyY2UpdnMxOworICAgICAgICBtdjIgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czI7CisgICAgICB9IGVsc2UgeworICAgICAgICBtdjEgPSBtYWtlTVYoc291cmNlcywgc291cmNlcyk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzb3VyY2VzLnNpemUoKT09MykgeworICAgICAgVmFsdWVTb3VyY2UgdnMxID0gc291cmNlcy5nZXQoMCk7CisgICAgICBWYWx1ZVNvdXJjZSB2czIgPSBzb3VyY2VzLmdldCgxKTsKKyAgICAgIGlmICh2czEgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlKSB7ICAgICAvLyAobSx4LHgpCisgICAgICAgIG12MSA9IChNdWx0aVZhbHVlU291cmNlKXZzMTsKKyAgICAgICAgbXYyID0gbWFrZU1WKHNvdXJjZXMuc3ViTGlzdCgxLCAzKSwgc291cmNlcyk7CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHgseCxtKQorICAgICAgICBtdjEgPSBtYWtlTVYoc291cmNlcy5zdWJMaXN0KDAsIDIpLCBzb3VyY2VzKTsKKyAgICAgICAgdnMxID0gc291cmNlcy5nZXQoMik7CisgICAgICAgIGlmICghKHZzMSBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJnZW9kaXN0IC0gaW52YWxpZCBwYXJhbWV0ZXJzOiIgKyBzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtdjIgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czE7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzb3VyY2VzLnNpemUoKT09NCkgeworICAgICAgbXYxID0gbWFrZU1WKHNvdXJjZXMuc3ViTGlzdCgwLCAyKSwgc291cmNlcyk7CisgICAgICBtdjIgPSBtYWtlTVYoc291cmNlcy5zdWJMaXN0KDIsIDQpLCBzb3VyY2VzKTsKKyAgICB9IGVsc2UgaWYgKHNvdXJjZXMuc2l6ZSgpID4gNCkgeworICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJnZW9kaXN0IC0gaW52YWxpZCBwYXJhbWV0ZXJzOiIgKyBzb3VyY2VzKTsKKyAgICB9CisKKyAgICBpZiAobXYxID09IG51bGwpIHsKKyAgICAgIG12MSA9IHBhcnNlUG9pbnQoZnApOworICAgICAgbXYyID0gcGFyc2VTZmllbGQoZnApOworICAgIH0gZWxzZSBpZiAobXYyID09IG51bGwpIHsKKyAgICAgIG12MiA9IHBhcnNlUG9pbnQoZnApOworICAgICAgaWYgKG12MiA9PSBudWxsKQorICAgICAgICBtdjIgPSBwYXJzZVNmaWVsZChmcCk7CisgICAgfQorCisgICAgaWYgKG12MSA9PSBudWxsIHx8IG12MiA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoImdlb2Rpc3QgLSBub3QgZW5vdWdoIHBhcmFtZXRlcnM6IiArIHNvdXJjZXMpOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBwYXJhbWV0ZXJzIGF0IHRoaXMgcG9pbnQsIG5vdyBjaGVjayBpZiBvbmUgb2YgdGhlIHBvaW50cyBpcyBjb25zdGFudAorICAgIGRvdWJsZVtdIGNvbnN0YW50czsKKyAgICBjb25zdGFudHMgPSBnZXRDb25zdGFudHMobXYxKTsKKyAgICBNdWx0aVZhbHVlU291cmNlIG90aGVyID0gbXYyOworICAgIGlmIChjb25zdGFudHMgPT0gbnVsbCkgeworICAgICAgY29uc3RhbnRzID0gZ2V0Q29uc3RhbnRzKG12Mik7CisgICAgICBvdGhlciA9IG12MTsKKyAgICB9CisKKyAgICBpZiAoY29uc3RhbnRzICE9IG51bGwgJiYgb3RoZXIgaW5zdGFuY2VvZiBWZWN0b3JWYWx1ZVNvdXJjZSkgeworICAgICAgcmV0dXJuIG5ldyBIYXZlcnNpbmVDb25zdEZ1bmN0aW9uKGNvbnN0YW50c1swXSwgY29uc3RhbnRzWzFdLCAoVmVjdG9yVmFsdWVTb3VyY2Upb3RoZXIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgSGF2ZXJzaW5lRnVuY3Rpb24obXYxLCBtdjIsIERpc3RhbmNlVXRpbHMuRUFSVEhfTUVBTl9SQURJVVNfS00sIHRydWUpOworICB9CisKKyAgLyoqIG1ha2UgYSBNdWx0aVZhbHVlU291cmNlIGZyb20gdHdvIG5vbiBNdWx0aVZhbHVlU291cmNlcyAqLworICBwcml2YXRlIFZlY3RvclZhbHVlU291cmNlIG1ha2VNVihMaXN0PFZhbHVlU291cmNlPiBzb3VyY2VzLCBMaXN0PFZhbHVlU291cmNlPiBvcmlnKSB0aHJvd3MgU3ludGF4RXJyb3IgeworICAgIFZhbHVlU291cmNlIHZzMSA9IHNvdXJjZXMuZ2V0KDApOworICAgIFZhbHVlU291cmNlIHZzMiA9IHNvdXJjZXMuZ2V0KDEpOworCisgICAgaWYgKHZzMSBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UgfHwgdnMyIGluc3RhbmNlb2YgTXVsdGlWYWx1ZVNvdXJjZSkgeworICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJnZW9kaXN0IC0gaW52YWxpZCBwYXJhbWV0ZXJzOiIgKyBvcmlnKTsKKyAgICB9CisgICAgcmV0dXJuICBuZXcgVmVjdG9yVmFsdWVTb3VyY2Uoc291cmNlcyk7CisgIH0KKworICBwcml2YXRlIE11bHRpVmFsdWVTb3VyY2UgcGFyc2VQb2ludChGdW5jdGlvblFQYXJzZXIgZnApIHRocm93cyBTeW50YXhFcnJvciB7CisgICAgU3RyaW5nIHB0ID0gZnAuZ2V0UGFyYW0oU3BhdGlhbFBhcmFtcy5QT0lOVCk7CisgICAgaWYgKHB0ID09IG51bGwpIHJldHVybiBudWxsOworICAgIGRvdWJsZVtdIHBvaW50ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcG9pbnQgPSBQYXJzZVV0aWxzLnBhcnNlTGF0aXR1ZGVMb25naXR1ZGUocHQpOworICAgIH0gY2F0Y2ggKEludmFsaWRTaGFwZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkJhZCBzcGF0aWFsIHB0OiIgKyBwdCk7CisgICAgfQorICAgIHJldHVybiBuZXcgVmVjdG9yVmFsdWVTb3VyY2UoQXJyYXlzLjxWYWx1ZVNvdXJjZT5hc0xpc3QobmV3IERvdWJsZUNvbnN0VmFsdWVTb3VyY2UocG9pbnRbMF0pLCBuZXcgRG91YmxlQ29uc3RWYWx1ZVNvdXJjZShwb2ludFsxXSkpKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlW10gZ2V0Q29uc3RhbnRzKE11bHRpVmFsdWVTb3VyY2UgdnMpIHsKKyAgICBpZiAoISh2cyBpbnN0YW5jZW9mIFZlY3RvclZhbHVlU291cmNlKSkgcmV0dXJuIG51bGw7CisgICAgTGlzdDxWYWx1ZVNvdXJjZT4gc291cmNlcyA9ICgoVmVjdG9yVmFsdWVTb3VyY2UpdnMpLmdldFNvdXJjZXMoKTsKKyAgICBpZiAoc291cmNlcy5nZXQoMCkgaW5zdGFuY2VvZiBDb25zdE51bWJlclNvdXJjZSAmJiBzb3VyY2VzLmdldCgxKSBpbnN0YW5jZW9mIENvbnN0TnVtYmVyU291cmNlKSB7CisgICAgICByZXR1cm4gbmV3IGRvdWJsZVtdIHsgKChDb25zdE51bWJlclNvdXJjZSkgc291cmNlcy5nZXQoMCkpLmdldERvdWJsZSgpLCAoKENvbnN0TnVtYmVyU291cmNlKSBzb3VyY2VzLmdldCgxKSkuZ2V0RG91YmxlKCl9OworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgTXVsdGlWYWx1ZVNvdXJjZSBwYXJzZVNmaWVsZChGdW5jdGlvblFQYXJzZXIgZnApIHRocm93cyBTeW50YXhFcnJvciB7CisgICAgU3RyaW5nIHNmaWVsZCA9IGZwLmdldFBhcmFtKFNwYXRpYWxQYXJhbXMuRklFTEQpOworICAgIGlmIChzZmllbGQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgU2NoZW1hRmllbGQgc2YgPSBmcC5nZXRSZXEoKS5nZXRTY2hlbWEoKS5nZXRGaWVsZChzZmllbGQpOworICAgIFZhbHVlU291cmNlIHZzID0gc2YuZ2V0VHlwZSgpLmdldFZhbHVlU291cmNlKHNmLCBmcCk7CisgICAgaWYgKCEodnMgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlKSkgeworICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJTcGF0aWFsIGZpZWxkIG11c3QgaW1wbGVtZW50IE11bHRpVmFsdWVTb3VyY2U6IiArIHNmKTsKKyAgICB9CisgICAgcmV0dXJuIChNdWx0aVZhbHVlU291cmNlKXZzOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2Z1bmN0aW9uL2Rpc3RhbmNlL0hhdmVyc2luZUNvbnN0RnVuY3Rpb24uamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2Z1bmN0aW9uL2Rpc3RhbmNlL0hhdmVyc2luZUNvbnN0RnVuY3Rpb24uamF2YQppbmRleCBiOWVmYzAyLi4zMzUyNzIwIDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9mdW5jdGlvbi9kaXN0YW5jZS9IYXZlcnNpbmVDb25zdEZ1bmN0aW9uLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZnVuY3Rpb24vZGlzdGFuY2UvSGF2ZXJzaW5lQ29uc3RGdW5jdGlvbi5qYXZhCkBAIC0xNiwyNyArMTYsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBjb20uc3BhdGlhbDRqLmNvcmUuZGlzdGFuY2UuRGlzdGFuY2VVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5BdG9taWNSZWFkZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24uRnVuY3Rpb25WYWx1ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi5WYWx1ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLmRvY3ZhbHVlcy5Eb3VibGVEb2NWYWx1ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5Db25zdE51bWJlclNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyaWVzLmZ1bmN0aW9uLnZhbHVlc291cmNlLkRvdWJsZUNvbnN0VmFsdWVTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcmllcy5mdW5jdGlvbi52YWx1ZXNvdXJjZS5NdWx0aVZhbHVlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJpZXMuZnVuY3Rpb24udmFsdWVzb3VyY2UuVmVjdG9yVmFsdWVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7Ci1pbXBvcnQgY29tLnNwYXRpYWw0ai5jb3JlLmlvLlBhcnNlVXRpbHM7Ci1pbXBvcnQgY29tLnNwYXRpYWw0ai5jb3JlLmRpc3RhbmNlLkRpc3RhbmNlVXRpbHM7Ci1pbXBvcnQgY29tLnNwYXRpYWw0ai5jb3JlLmV4Y2VwdGlvbi5JbnZhbGlkU2hhcGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuU3BhdGlhbFBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLlNjaGVtYUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guRnVuY3Rpb25RUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guU3ludGF4RXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5WYWx1ZVNvdXJjZVBhcnNlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgc3RhdGljIGNvbS5zcGF0aWFsNGouY29yZS5kaXN0YW5jZS5EaXN0YW5jZVV0aWxzLkRFR1JFRVNfVE9fUkFESUFOUzsKQEAgLTQ2LDEzNSArMzQsNiBAQAogICovCiBwdWJsaWMgY2xhc3MgSGF2ZXJzaW5lQ29uc3RGdW5jdGlvbiBleHRlbmRzIFZhbHVlU291cmNlIHsKIAotICBwdWJsaWMgc3RhdGljIFZhbHVlU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBWYWx1ZVNvdXJjZVBhcnNlcigpIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmFsdWVTb3VyY2UgcGFyc2UoRnVuY3Rpb25RUGFyc2VyIGZwKSB0aHJvd3MgU3ludGF4RXJyb3IKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBkaXNwYXRjaCB0aHJvdWdoIFNwYXRpYWxRdWVyeWFibGUgaW4gdGhlIGZ1dHVyZT8KLSAgICAgIExpc3Q8VmFsdWVTb3VyY2U+IHNvdXJjZXMgPSBmcC5wYXJzZVZhbHVlU291cmNlTGlzdCgpOwotCi0gICAgICAvLyAibSIgaXMgYSBtdWx0aS12YWx1ZSBzb3VyY2UsICJ4IiBpcyBhIHNpbmdsZS12YWx1ZSBzb3VyY2UKLSAgICAgIC8vIGFsbG93IChtLG0pIChtLHgseCkgKHgseCxtKSAoeCx4LHgseCkKLSAgICAgIC8vIGlmIG5vdCBlbm91Z2ggcG9pbnRzIGFyZSBwcmVzZW50LCAicHQiIHdpbGwgYmUgY2hlY2tlZCBmaXJzdCwgZm9sbG93ZWQgYnkgInNmaWVsZCIuICAgICAgCi0KLSAgICAgIE11bHRpVmFsdWVTb3VyY2UgbXYxID0gbnVsbDsKLSAgICAgIE11bHRpVmFsdWVTb3VyY2UgbXYyID0gbnVsbDsKLQotICAgICAgaWYgKHNvdXJjZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbyBub3cKLSAgICAgIH0gZWxzZSBpZiAoc291cmNlcy5zaXplKCkgPT0gMSkgewotICAgICAgICBWYWx1ZVNvdXJjZSB2cyA9IHNvdXJjZXMuZ2V0KDApOwotICAgICAgICBpZiAoISh2cyBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJnZW9kaXN0IC0gaW52YWxpZCBwYXJhbWV0ZXJzOiIgKyBzb3VyY2VzKTsKLSAgICAgICAgfQotICAgICAgICBtdjEgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czsKLSAgICAgIH0gZWxzZSBpZiAoc291cmNlcy5zaXplKCkgPT0gMikgewotICAgICAgICBWYWx1ZVNvdXJjZSB2czEgPSBzb3VyY2VzLmdldCgwKTsKLSAgICAgICAgVmFsdWVTb3VyY2UgdnMyID0gc291cmNlcy5nZXQoMSk7Ci0KLSAgICAgICAgaWYgKHZzMSBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UgJiYgdnMyIGluc3RhbmNlb2YgTXVsdGlWYWx1ZVNvdXJjZSkgewotICAgICAgICAgIG12MSA9IChNdWx0aVZhbHVlU291cmNlKXZzMTsKLSAgICAgICAgICBtdjIgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbXYxID0gbWFrZU1WKHNvdXJjZXMsIHNvdXJjZXMpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHNvdXJjZXMuc2l6ZSgpPT0zKSB7Ci0gICAgICAgIFZhbHVlU291cmNlIHZzMSA9IHNvdXJjZXMuZ2V0KDApOwotICAgICAgICBWYWx1ZVNvdXJjZSB2czIgPSBzb3VyY2VzLmdldCgxKTsKLSAgICAgICAgaWYgKHZzMSBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpIHsgICAgIC8vIChtLHgseCkKLSAgICAgICAgICBtdjEgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czE7Ci0gICAgICAgICAgbXYyID0gbWFrZU1WKHNvdXJjZXMuc3ViTGlzdCgxLDMpLCBzb3VyY2VzKTsKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh4LHgsbSkKLSAgICAgICAgICBtdjEgPSBtYWtlTVYoc291cmNlcy5zdWJMaXN0KDAsMiksIHNvdXJjZXMpOwotICAgICAgICAgIHZzMSA9IHNvdXJjZXMuZ2V0KDIpOwotICAgICAgICAgIGlmICghKHZzMSBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoImdlb2Rpc3QgLSBpbnZhbGlkIHBhcmFtZXRlcnM6IiArIHNvdXJjZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtdjIgPSAoTXVsdGlWYWx1ZVNvdXJjZSl2czE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoc291cmNlcy5zaXplKCk9PTQpIHsKLSAgICAgICAgbXYxID0gbWFrZU1WKHNvdXJjZXMuc3ViTGlzdCgwLDIpLCBzb3VyY2VzKTsKLSAgICAgICAgbXYyID0gbWFrZU1WKHNvdXJjZXMuc3ViTGlzdCgyLDQpLCBzb3VyY2VzKTsKLSAgICAgIH0gZWxzZSBpZiAoc291cmNlcy5zaXplKCkgPiA0KSB7Ci0gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiZ2VvZGlzdCAtIGludmFsaWQgcGFyYW1ldGVyczoiICsgc291cmNlcyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtdjEgPT0gbnVsbCkgewotICAgICAgICBtdjEgPSBwYXJzZVBvaW50KGZwKTsKLSAgICAgICAgbXYyID0gcGFyc2VTZmllbGQoZnApOwotICAgICAgfSBlbHNlIGlmIChtdjIgPT0gbnVsbCkgewotICAgICAgICBtdjIgPSBwYXJzZVBvaW50KGZwKTsKLSAgICAgICAgaWYgKG12MiA9PSBudWxsKQotICAgICAgICAgIG12MiA9IHBhcnNlU2ZpZWxkKGZwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG12MSA9PSBudWxsIHx8IG12MiA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiZ2VvZGlzdCAtIG5vdCBlbm91Z2ggcGFyYW1ldGVyczoiICsgc291cmNlcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBwYXJhbWV0ZXJzIGF0IHRoaXMgcG9pbnQsIG5vdyBjaGVjayBpZiBvbmUgb2YgdGhlIHBvaW50cyBpcyBjb25zdGFudAotICAgICAgZG91YmxlW10gY29uc3RhbnRzOwotICAgICAgY29uc3RhbnRzID0gZ2V0Q29uc3RhbnRzKG12MSk7Ci0gICAgICBNdWx0aVZhbHVlU291cmNlIG90aGVyID0gbXYyOwotICAgICAgaWYgKGNvbnN0YW50cyA9PSBudWxsKSB7Ci0gICAgICAgIGNvbnN0YW50cyA9IGdldENvbnN0YW50cyhtdjIpOwotICAgICAgICBvdGhlciA9IG12MTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNvbnN0YW50cyAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgVmVjdG9yVmFsdWVTb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXZlcnNpbmVDb25zdEZ1bmN0aW9uKGNvbnN0YW50c1swXSwgY29uc3RhbnRzWzFdLCAoVmVjdG9yVmFsdWVTb3VyY2Upb3RoZXIpOwotICAgICAgfSAgICAgIAotCi0gICAgICByZXR1cm4gbmV3IEhhdmVyc2luZUZ1bmN0aW9uKG12MSwgbXYyLCBEaXN0YW5jZVV0aWxzLkVBUlRIX01FQU5fUkFESVVTX0tNLCB0cnVlKTsKLSAgICB9Ci0gIH07Ci0KLSAgLyoqIG1ha2UgYSBNdWx0aVZhbHVlU291cmNlIGZyb20gdHdvIG5vbiBNdWx0aVZhbHVlU291cmNlcyAqLwotICBwcml2YXRlIHN0YXRpYyBWZWN0b3JWYWx1ZVNvdXJjZSBtYWtlTVYoTGlzdDxWYWx1ZVNvdXJjZT4gc291cmNlcywgTGlzdDxWYWx1ZVNvdXJjZT4gb3JpZykgdGhyb3dzIFN5bnRheEVycm9yIHsKLSAgICBWYWx1ZVNvdXJjZSB2czEgPSBzb3VyY2VzLmdldCgwKTsKLSAgICBWYWx1ZVNvdXJjZSB2czIgPSBzb3VyY2VzLmdldCgxKTsKLQotICAgIGlmICh2czEgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlIHx8IHZzMiBpbnN0YW5jZW9mIE11bHRpVmFsdWVTb3VyY2UpIHsKLSAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiZ2VvZGlzdCAtIGludmFsaWQgcGFyYW1ldGVyczoiICsgb3JpZyk7Ci0gICAgfQotICAgIHJldHVybiAgbmV3IFZlY3RvclZhbHVlU291cmNlKHNvdXJjZXMpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgTXVsdGlWYWx1ZVNvdXJjZSBwYXJzZVBvaW50KEZ1bmN0aW9uUVBhcnNlciBmcCkgdGhyb3dzIFN5bnRheEVycm9yIHsKLSAgICBTdHJpbmcgcHQgPSBmcC5nZXRQYXJhbShTcGF0aWFsUGFyYW1zLlBPSU5UKTsKLSAgICBpZiAocHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgZG91YmxlW10gcG9pbnQgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBwb2ludCA9IFBhcnNlVXRpbHMucGFyc2VMYXRpdHVkZUxvbmdpdHVkZShwdCk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFNoYXBlRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiQmFkIHNwYXRpYWwgcHQ6IiArIHB0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBWZWN0b3JWYWx1ZVNvdXJjZShBcnJheXMuPFZhbHVlU291cmNlPmFzTGlzdChuZXcgRG91YmxlQ29uc3RWYWx1ZVNvdXJjZShwb2ludFswXSksbmV3IERvdWJsZUNvbnN0VmFsdWVTb3VyY2UocG9pbnRbMV0pKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBkb3VibGVbXSBnZXRDb25zdGFudHMoTXVsdGlWYWx1ZVNvdXJjZSB2cykgewotICAgIGlmICghKHZzIGluc3RhbmNlb2YgVmVjdG9yVmFsdWVTb3VyY2UpKSByZXR1cm4gbnVsbDsKLSAgICBMaXN0PFZhbHVlU291cmNlPiBzb3VyY2VzID0gKChWZWN0b3JWYWx1ZVNvdXJjZSl2cykuZ2V0U291cmNlcygpOwotICAgIGlmIChzb3VyY2VzLmdldCgwKSBpbnN0YW5jZW9mIENvbnN0TnVtYmVyU291cmNlICYmIHNvdXJjZXMuZ2V0KDEpIGluc3RhbmNlb2YgQ29uc3ROdW1iZXJTb3VyY2UpIHsKLSAgICAgIHJldHVybiBuZXcgZG91YmxlW10geyAoKENvbnN0TnVtYmVyU291cmNlKSBzb3VyY2VzLmdldCgwKSkuZ2V0RG91YmxlKCksICgoQ29uc3ROdW1iZXJTb3VyY2UpIHNvdXJjZXMuZ2V0KDEpKS5nZXREb3VibGUoKX07Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgTXVsdGlWYWx1ZVNvdXJjZSBwYXJzZVNmaWVsZChGdW5jdGlvblFQYXJzZXIgZnApIHRocm93cyBTeW50YXhFcnJvciB7Ci0gICAgU3RyaW5nIHNmaWVsZCA9IGZwLmdldFBhcmFtKFNwYXRpYWxQYXJhbXMuRklFTEQpOwotICAgIGlmIChzZmllbGQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgU2NoZW1hRmllbGQgc2YgPSBmcC5nZXRSZXEoKS5nZXRTY2hlbWEoKS5nZXRGaWVsZChzZmllbGQpOwotICAgIFZhbHVlU291cmNlIHZzID0gc2YuZ2V0VHlwZSgpLmdldFZhbHVlU291cmNlKHNmLCBmcCk7Ci0gICAgaWYgKCEodnMgaW5zdGFuY2VvZiBNdWx0aVZhbHVlU291cmNlKSkgewotICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJTcGF0aWFsIGZpZWxkIG11c3QgaW1wbGVtZW50IE11bHRpVmFsdWVTb3VyY2U6IiArIHNmKTsKLSAgICB9Ci0gICAgcmV0dXJuIChNdWx0aVZhbHVlU291cmNlKXZzOwotICB9Ci0KLQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCiAgIHByaXZhdGUgZmluYWwgZG91YmxlIGxhdENlbnRlcjsKICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbG9uQ2VudGVyOwogICBwcml2YXRlIGZpbmFsIFZlY3RvclZhbHVlU291cmNlIHAyOyAgLy8gbGF0K2xvbiwganVzdCBzYXZlZCBmb3IgZGlzcGxheS9kZWJ1Z2dpbmcKQEAgLTE4NCw3ICs0Myw2IEBACiAgIHByaXZhdGUgZmluYWwgZG91YmxlIGxhdENlbnRlclJhZF9jb3M7IC8vIGNvcyhsYXRDZW50ZXIpCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFQVJUSF9NRUFOX0RJQU1FVEVSID0gRGlzdGFuY2VVdGlscy5FQVJUSF9NRUFOX1JBRElVU19LTSAqIDI7CiAKLQogICBwdWJsaWMgSGF2ZXJzaW5lQ29uc3RGdW5jdGlvbihkb3VibGUgbGF0Q2VudGVyLCBkb3VibGUgbG9uQ2VudGVyLCBWZWN0b3JWYWx1ZVNvdXJjZSB2cykgewogICAgIHRoaXMubGF0Q2VudGVyID0gbGF0Q2VudGVyOwogICAgIHRoaXMubG9uQ2VudGVyID0gbG9uQ2VudGVyOwpAQCAtMjU3LDQgKzExNSw1IEBACiAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7CiAgICAgcmV0dXJuIG5hbWUoKSArICcoJyArIHAyICsgJywnICsgbGF0Q2VudGVyICsgJywnICsgbG9uQ2VudGVyICsgJyknOwogICB9CisKIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2dyb3VwaW5nL2Rpc3RyaWJ1dGVkL3Jlc3BvbnNlcHJvY2Vzc29yL1NlYXJjaEdyb3VwU2hhcmRSZXNwb25zZVByb2Nlc3Nvci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZ3JvdXBpbmcvZGlzdHJpYnV0ZWQvcmVzcG9uc2Vwcm9jZXNzb3IvU2VhcmNoR3JvdXBTaGFyZFJlc3BvbnNlUHJvY2Vzc29yLmphdmEKaW5kZXggYWFhYjNkMC4uOGRlYTFkMyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZ3JvdXBpbmcvZGlzdHJpYnV0ZWQvcmVzcG9uc2Vwcm9jZXNzb3IvU2VhcmNoR3JvdXBTaGFyZFJlc3BvbnNlUHJvY2Vzc29yLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZ3JvdXBpbmcvZGlzdHJpYnV0ZWQvcmVzcG9uc2Vwcm9jZXNzb3IvU2VhcmNoR3JvdXBTaGFyZFJlc3BvbnNlUHJvY2Vzc29yLmphdmEKQEAgLTIwLDggKzIwLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlNvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLmdyb3VwaW5nLlNlYXJjaEdyb3VwOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyU2VydmVyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5TaGFyZFBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5TaW1wbGVPcmRlcmVkTWFwOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmNvbXBvbmVudC5SZXNwb25zZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuY29tcG9uZW50LlNoYXJkUmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5jb21wb25lbnQuU2hhcmRSZXNwb25zZTsKQEAgLTMxLDYgKzM0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLmdyb3VwaW5nLmRpc3RyaWJ1dGVkLnNoYXJkcmVzdWx0c2VyaWFsaXplci5TZWFyY2hHcm91cHNSZXN1bHRUcmFuc2Zvcm1lcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCkBAIC02MSw3ICs2NiwzOCBAQAogICAgIHRyeSB7CiAgICAgICBpbnQgbWF4RWxhcHNlZFRpbWUgPSAwOwogICAgICAgaW50IGhpdENvdW50RHVyaW5nRmlyc3RQaGFzZSA9IDA7CisKKyAgICAgIE5hbWVkTGlzdDxPYmplY3Q+IHNoYXJkSW5mbyA9IG51bGw7CisgICAgICBpZiAocmIucmVxLmdldFBhcmFtcygpLmdldEJvb2woU2hhcmRQYXJhbXMuU0hBUkRTX0lORk8sIGZhbHNlKSkgeworICAgICAgICBzaGFyZEluZm8gPSBuZXcgU2ltcGxlT3JkZXJlZE1hcDxPYmplY3Q+KCk7CisgICAgICAgIHJiLnJzcC5nZXRWYWx1ZXMoKS5hZGQoU2hhcmRQYXJhbXMuU0hBUkRTX0lORk8gKyAiLmZpcnN0UGhhc2UiLCBzaGFyZEluZm8pOworICAgICAgfQorCiAgICAgICBmb3IgKFNoYXJkUmVzcG9uc2Ugc3JzcCA6IHNoYXJkUmVxdWVzdC5yZXNwb25zZXMpIHsKKyAgICAgICAgaWYgKHNoYXJkSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgU2ltcGxlT3JkZXJlZE1hcDxPYmplY3Q+IG5sID0gbmV3IFNpbXBsZU9yZGVyZWRNYXA8T2JqZWN0PigpOworCisgICAgICAgICAgaWYgKHNyc3AuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBzcnNwLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBTb2xyU2VydmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHQgPSAoKFNvbHJTZXJ2ZXJFeGNlcHRpb24pIHQpLmdldENhdXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBubC5hZGQoImVycm9yIiwgdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciB0cmFjZSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih0cmFjZSkpOworICAgICAgICAgICAgbmwuYWRkKCJ0cmFjZSIsIHRyYWNlLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBubC5hZGQoIm51bUZvdW5kIiwgKEludGVnZXIpIHNyc3AuZ2V0U29sclJlc3BvbnNlKCkuZ2V0UmVzcG9uc2UoKS5nZXQoInRvdGFsSGl0Q291bnQiKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzcnNwLmdldFNvbHJSZXNwb25zZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5sLmFkZCgidGltZSIsIHNyc3AuZ2V0U29sclJlc3BvbnNlKCkuZ2V0RWxhcHNlZFRpbWUoKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2hhcmRJbmZvLmFkZChzcnNwLmdldFNoYXJkKCksIG5sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmIucmVxLmdldFBhcmFtcygpLmdldEJvb2woU2hhcmRQYXJhbXMuU0hBUkRTX1RPTEVSQU5ULCBmYWxzZSkgJiYgc3JzcC5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7IC8vIGNvbnRpbnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgd2UncmUgdG9sZXJhbnQuICAKKyAgICAgICAgfQogICAgICAgICBtYXhFbGFwc2VkVGltZSA9IChpbnQpIE1hdGgubWF4KG1heEVsYXBzZWRUaW1lLCBzcnNwLmdldFNvbHJSZXNwb25zZSgpLmdldEVsYXBzZWRUaW1lKCkpOwogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgTmFtZWRMaXN0PE5hbWVkTGlzdD4gZmlyc3RQaGFzZVJlc3VsdCA9IChOYW1lZExpc3Q8TmFtZWRMaXN0Pikgc3JzcC5nZXRTb2xyUmVzcG9uc2UoKS5nZXRSZXNwb25zZSgpLmdldCgiZmlyc3RQaGFzZSIpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZ3JvdXBpbmcvZGlzdHJpYnV0ZWQvcmVzcG9uc2Vwcm9jZXNzb3IvVG9wR3JvdXBzU2hhcmRSZXNwb25zZVByb2Nlc3Nvci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZWFyY2gvZ3JvdXBpbmcvZGlzdHJpYnV0ZWQvcmVzcG9uc2Vwcm9jZXNzb3IvVG9wR3JvdXBzU2hhcmRSZXNwb25zZVByb2Nlc3Nvci5qYXZhCmluZGV4IDQ2YzE2NTAuLjFmNDFiMDcgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2dyb3VwaW5nL2Rpc3RyaWJ1dGVkL3Jlc3BvbnNlcHJvY2Vzc29yL1RvcEdyb3Vwc1NoYXJkUmVzcG9uc2VQcm9jZXNzb3IuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9ncm91cGluZy9kaXN0cmlidXRlZC9yZXNwb25zZXByb2Nlc3Nvci9Ub3BHcm91cHNTaGFyZFJlc3BvbnNlUHJvY2Vzc29yLmphdmEKQEAgLTIzLDggKzIzLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLmdyb3VwaW5nLkdyb3VwRG9jczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guZ3JvdXBpbmcuVG9wR3JvdXBzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyU2VydmVyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5TaGFyZFBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5TaW1wbGVPcmRlcmVkTWFwOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmNvbXBvbmVudC5SZXNwb25zZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuY29tcG9uZW50LlNoYXJkRG9jOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmNvbXBvbmVudC5TaGFyZFJlcXVlc3Q7CkBAIC0zNSw2ICszOCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5ncm91cGluZy5kaXN0cmlidXRlZC5zaGFyZHJlc3VsdHNlcmlhbGl6ZXIuVG9wR3JvdXBzUmVzdWx0VHJhbnNmb3JtZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTc2LDE4ICs4MSw2NiBAQAogICAgIH0KIAogICAgIFRvcEdyb3Vwc1Jlc3VsdFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBuZXcgVG9wR3JvdXBzUmVzdWx0VHJhbnNmb3JtZXIocmIpOworCisgICAgTmFtZWRMaXN0PE9iamVjdD4gc2hhcmRJbmZvID0gbnVsbDsKKyAgICBpZiAocmIucmVxLmdldFBhcmFtcygpLmdldEJvb2woU2hhcmRQYXJhbXMuU0hBUkRTX0lORk8sIGZhbHNlKSkgeworICAgICAgc2hhcmRJbmZvID0gbmV3IFNpbXBsZU9yZGVyZWRNYXA8T2JqZWN0PigpOworICAgICAgcmIucnNwLmdldFZhbHVlcygpLmFkZChTaGFyZFBhcmFtcy5TSEFSRFNfSU5GTywgc2hhcmRJbmZvKTsKKyAgICB9CisKICAgICBmb3IgKFNoYXJkUmVzcG9uc2Ugc3JzcCA6IHNoYXJkUmVxdWVzdC5yZXNwb25zZXMpIHsKKyAgICAgIFNpbXBsZU9yZGVyZWRNYXA8T2JqZWN0PiBpbmRpdmlkdWFsU2hhcmRJbmZvID0gbnVsbDsKKyAgICAgIGlmIChzaGFyZEluZm8gIT0gbnVsbCkgeworICAgICAgICBpbmRpdmlkdWFsU2hhcmRJbmZvID0gbmV3IFNpbXBsZU9yZGVyZWRNYXA8T2JqZWN0PigpOworCisgICAgICAgIGlmIChzcnNwLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICBUaHJvd2FibGUgdCA9IHNyc3AuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBTb2xyU2VydmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0ID0gKChTb2xyU2VydmVyRXhjZXB0aW9uKSB0KS5nZXRDYXVzZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRpdmlkdWFsU2hhcmRJbmZvLmFkZCgiZXJyb3IiLCB0LnRvU3RyaW5nKCkpOworICAgICAgICAgIFN0cmluZ1dyaXRlciB0cmFjZSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIodHJhY2UpKTsKKyAgICAgICAgICBpbmRpdmlkdWFsU2hhcmRJbmZvLmFkZCgidHJhY2UiLCB0cmFjZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBzdW1tYXJ5IGZvciBzdWNjZXNzZnVsIHNoYXJkIHJlc3BvbnNlIGlzIGFkZGVkIGRvd24gYmVsb3cKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JzcC5nZXRTb2xyUmVzcG9uc2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgaW5kaXZpZHVhbFNoYXJkSW5mby5hZGQoInRpbWUiLCBzcnNwLmdldFNvbHJSZXNwb25zZSgpLmdldEVsYXBzZWRUaW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgc2hhcmRJbmZvLmFkZChzcnNwLmdldFNoYXJkKCksIGluZGl2aWR1YWxTaGFyZEluZm8pOworICAgICAgfQorICAgICAgaWYgKHJiLnJlcS5nZXRQYXJhbXMoKS5nZXRCb29sKFNoYXJkUGFyYW1zLlNIQVJEU19UT0xFUkFOVCwgZmFsc2UpICYmIHNyc3AuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsgLy8gY29udGludWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCB3ZSdyZSB0b2xlcmFudC4gIAorICAgICAgfQogICAgICAgTmFtZWRMaXN0PE5hbWVkTGlzdD4gc2Vjb25kUGhhc2VSZXN1bHQgPSAoTmFtZWRMaXN0PE5hbWVkTGlzdD4pIHNyc3AuZ2V0U29sclJlc3BvbnNlKCkuZ2V0UmVzcG9uc2UoKS5nZXQoInNlY29uZFBoYXNlIik7CiAgICAgICBNYXA8U3RyaW5nLCA/PiByZXN1bHQgPSBzZXJpYWxpemVyLnRyYW5zZm9ybVRvTmF0aXZlKHNlY29uZFBoYXNlUmVzdWx0LCBncm91cFNvcnQsIHNvcnRXaXRoaW5Hcm91cCwgc3JzcC5nZXRTaGFyZCgpKTsKKyAgICAgIGludCBudW1Gb3VuZCA9IDA7CisgICAgICBmbG9hdCBtYXhTY29yZSA9IEZsb2F0Lk5hTjsKICAgICAgIGZvciAoU3RyaW5nIGZpZWxkIDogY29tbWFuZFRvcEdyb3Vwcy5rZXlTZXQoKSkgewogICAgICAgICBUb3BHcm91cHM8Qnl0ZXNSZWY+IHRvcEdyb3VwcyA9IChUb3BHcm91cHM8Qnl0ZXNSZWY+KSByZXN1bHQuZ2V0KGZpZWxkKTsKICAgICAgICAgaWYgKHRvcEdyb3VwcyA9PSBudWxsKSB7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGl2aWR1YWxTaGFyZEluZm8gIT0gbnVsbCkgeyAvLyBrZWVwIHRyYWNrIG9mIHRoaXMgd2hlbiBzaGFyZHMuaW5mbz10cnVlCisgICAgICAgICAgbnVtRm91bmQgKz0gdG9wR3JvdXBzLnRvdGFsSGl0Q291bnQ7CisgICAgICAgICAgaWYgKEZsb2F0LmlzTmFOKG1heFNjb3JlKSB8fCB0b3BHcm91cHMubWF4U2NvcmUgPiBtYXhTY29yZSkgbWF4U2NvcmUgPSB0b3BHcm91cHMubWF4U2NvcmU7CisgICAgICAgIH0KICAgICAgICAgY29tbWFuZFRvcEdyb3Vwcy5nZXQoZmllbGQpLmFkZCh0b3BHcm91cHMpOwogICAgICAgfQogICAgICAgZm9yIChTdHJpbmcgcXVlcnkgOiBxdWVyaWVzKSB7Ci0gICAgICAgIGNvbW1hbmRUb3BEb2NzLmdldChxdWVyeSkuYWRkKChRdWVyeUNvbW1hbmRSZXN1bHQpIHJlc3VsdC5nZXQocXVlcnkpKTsKKyAgICAgICAgUXVlcnlDb21tYW5kUmVzdWx0IHF1ZXJ5Q29tbWFuZFJlc3VsdCA9IChRdWVyeUNvbW1hbmRSZXN1bHQpIHJlc3VsdC5nZXQocXVlcnkpOworICAgICAgICBpZiAoaW5kaXZpZHVhbFNoYXJkSW5mbyAhPSBudWxsKSB7IC8vIGtlZXAgdHJhY2sgb2YgdGhpcyB3aGVuIHNoYXJkcy5pbmZvPXRydWUKKyAgICAgICAgICBudW1Gb3VuZCArPSBxdWVyeUNvbW1hbmRSZXN1bHQuZ2V0TWF0Y2hlcygpOworICAgICAgICAgIGZsb2F0IHRoaXNNYXggPSBxdWVyeUNvbW1hbmRSZXN1bHQuZ2V0VG9wRG9jcygpLmdldE1heFNjb3JlKCk7CisgICAgICAgICAgaWYgKEZsb2F0LmlzTmFOKG1heFNjb3JlKSB8fCB0aGlzTWF4ID4gbWF4U2NvcmUpIG1heFNjb3JlID0gdGhpc01heDsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kVG9wRG9jcy5nZXQocXVlcnkpLmFkZChxdWVyeUNvbW1hbmRSZXN1bHQpOworICAgICAgfQorICAgICAgaWYgKGluZGl2aWR1YWxTaGFyZEluZm8gIT0gbnVsbCkgeyAvLyB3aGVuIHNoYXJkcy5pbmZvPXRydWUKKyAgICAgICAgaW5kaXZpZHVhbFNoYXJkSW5mby5hZGQoIm51bUZvdW5kIiwgbnVtRm91bmQpOworICAgICAgICBpbmRpdmlkdWFsU2hhcmRJbmZvLmFkZCgibWF4U2NvcmUiLCBtYXhTY29yZSk7CiAgICAgICB9CiAgICAgfQogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9zaW1pbGFyaXRpZXMvU3dlZXRTcG90U2ltaWxhcml0eUZhY3RvcnkuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL3NpbWlsYXJpdGllcy9Td2VldFNwb3RTaW1pbGFyaXR5RmFjdG9yeS5qYXZhCmluZGV4IDZhNmM1ODIuLjcwOTRlNmEgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL3NpbWlsYXJpdGllcy9Td2VldFNwb3RTaW1pbGFyaXR5RmFjdG9yeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL3NpbWlsYXJpdGllcy9Td2VldFNwb3RTaW1pbGFyaXR5RmFjdG9yeS5qYXZhCkBAIC0xODAsNyArMTgwLDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSHlwZXJib2xpY1N3ZWV0U3BvdFNpbWlsYXJpdHkgCiAgICAgZXh0ZW5kcyBTd2VldFNwb3RTaW1pbGFyaXR5IHsKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgdGYoaW50IGZyZXEpIHsKKyAgICBwdWJsaWMgZmxvYXQgdGYoZmxvYXQgZnJlcSkgewogICAgICAgcmV0dXJuIGh5cGVyYm9saWNUZihmcmVxKTsKICAgICB9CiAgIH07CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlcnZsZXQvU29sckRpc3BhdGNoRmlsdGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3NlcnZsZXQvU29sckRpc3BhdGNoRmlsdGVyLmphdmEKaW5kZXggMmJlMWZlMi4uNzIwNjdmZCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zZXJ2bGV0L1NvbHJEaXNwYXRjaEZpbHRlci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc2VydmxldC9Tb2xyRGlzcGF0Y2hGaWx0ZXIuamF2YQpAQCAtMTcsMzUgKzE3LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc2VydmxldDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7Ci1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGU7CkBAIC04MSw2ICs1MiwzNCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKIC8qKgogICogVGhpcyBmaWx0ZXIgbG9va3MgYXQgdGhlIGluY29taW5nIFVSTCBtYXBzIHRoZW0gdG8gaGFuZGxlcnMgZGVmaW5lZCBpbiBzb2xyY29uZmlnLnhtbAogICoKQEAgLTExNiwxMiArMTE1LDExIEBACiAgIHsKICAgICBsb2cuaW5mbygiU29sckRpc3BhdGNoRmlsdGVyLmluaXQoKSIpOwogCi0gICAgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0ID0gY3JlYXRlSW5pdGlhbGl6ZXIoKTsKICAgICB0cnkgewogICAgICAgLy8gd2ViLnhtbCBjb25maWd1cmF0aW9uCiAgICAgICB0aGlzLnBhdGhQcmVmaXggPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlciggInBhdGgtcHJlZml4IiApOwogCi0gICAgICB0aGlzLmNvcmVzID0gaW5pdC5pbml0aWFsaXplKCk7CisgICAgICB0aGlzLmNvcmVzID0gY3JlYXRlQ29yZUNvbnRhaW5lcigpOwogICAgICAgbG9nLmluZm8oInVzZXIuZGlyPSIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwogICAgIH0KICAgICBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CkBAIC0xMzIsMTUgKzEzMCwyMCBAQAogCiAgICAgbG9nLmluZm8oIlNvbHJEaXNwYXRjaEZpbHRlci5pbml0KCkgZG9uZSIpOwogICB9CisKKyAgLyoqCisgICAqIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIENvcmVDb250YWluZXIgaW5pdGlhbGl6YXRpb24KKyAgICogQHJldHVybiBhIENvcmVDb250YWluZXIgdG8gaG9sZCB0aGlzIHNlcnZlcidzIGNvcmVzCisgICAqLworICBwcm90ZWN0ZWQgQ29yZUNvbnRhaW5lciBjcmVhdGVDb3JlQ29udGFpbmVyKCkgeworICAgIENvcmVDb250YWluZXIgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcigpOworICAgIGNvcmVzLmxvYWQoKTsKKyAgICByZXR1cm4gY29yZXM7CisgIH0KICAgCiAgIHB1YmxpYyBDb3JlQ29udGFpbmVyIGdldENvcmVzKCkgewogICAgIHJldHVybiBjb3JlczsKICAgfQotCi0gIC8qKiBNZXRob2QgdG8gb3ZlcnJpZGUgdG8gY2hhbmdlIGhvdyBDb3JlQ29udGFpbmVyIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZC4gKi8KLSAgcHJvdGVjdGVkIENvcmVDb250YWluZXIuSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoKSB7Ci0gICAgcmV0dXJuIG5ldyBDb3JlQ29udGFpbmVyLkluaXRpYWxpemVyKCk7Ci0gIH0KICAgCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrQ2FjaGUuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjZGY2NAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudGxpbmtlZGhhc2htYXAuQ29uY3VycmVudExpbmtlZEhhc2hNYXA7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudGxpbmtlZGhhc2htYXAuRXZpY3Rpb25MaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIEJsb2NrQ2FjaGUgeworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzEyOE0gPSAxMzQyMTc3Mjg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF8zMksgPSAzMjc2ODsKKyAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPEJsb2NrQ2FjaGVLZXksQmxvY2tDYWNoZUxvY2F0aW9uPiBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyW10gYmFua3M7CisgIHByaXZhdGUgZmluYWwgQmxvY2tMb2Nrc1tdIGxvY2tzOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXJbXSBsb2NrQ291bnRlcnM7CisgIHByaXZhdGUgZmluYWwgaW50IGJsb2NrU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyT2ZCbG9ja3NQZXJCYW5rOworICBwcml2YXRlIGZpbmFsIGludCBtYXhFbnRyaWVzOworICBwcml2YXRlIGZpbmFsIE1ldHJpY3MgbWV0cmljczsKKyAgCisgIHB1YmxpYyBCbG9ja0NhY2hlKE1ldHJpY3MgbWV0cmljcywgYm9vbGVhbiBkaXJlY3RBbGxvY2F0aW9uLCBsb25nIHRvdGFsTWVtb3J5KSB7CisgICAgdGhpcyhtZXRyaWNzLCBkaXJlY3RBbGxvY2F0aW9uLCB0b3RhbE1lbW9yeSwgXzEyOE0pOworICB9CisgIAorICBwdWJsaWMgQmxvY2tDYWNoZShNZXRyaWNzIG1ldHJpY3MsIGJvb2xlYW4gZGlyZWN0QWxsb2NhdGlvbiwKKyAgICAgIGxvbmcgdG90YWxNZW1vcnksIGludCBzbGFiU2l6ZSkgeworICAgIHRoaXMobWV0cmljcywgZGlyZWN0QWxsb2NhdGlvbiwgdG90YWxNZW1vcnksIHNsYWJTaXplLCBfMzJLKTsKKyAgfQorICAKKyAgcHVibGljIEJsb2NrQ2FjaGUoTWV0cmljcyBtZXRyaWNzLCBib29sZWFuIGRpcmVjdEFsbG9jYXRpb24sCisgICAgICBsb25nIHRvdGFsTWVtb3J5LCBpbnQgc2xhYlNpemUsIGludCBibG9ja1NpemUpIHsKKyAgICB0aGlzLm1ldHJpY3MgPSBtZXRyaWNzOworICAgIG51bWJlck9mQmxvY2tzUGVyQmFuayA9IHNsYWJTaXplIC8gYmxvY2tTaXplOworICAgIGludCBudW1iZXJPZkJhbmtzID0gKGludCkgKHRvdGFsTWVtb3J5IC8gc2xhYlNpemUpOworICAgIAorICAgIGJhbmtzID0gbmV3IEJ5dGVCdWZmZXJbbnVtYmVyT2ZCYW5rc107CisgICAgbG9ja3MgPSBuZXcgQmxvY2tMb2Nrc1tudW1iZXJPZkJhbmtzXTsKKyAgICBsb2NrQ291bnRlcnMgPSBuZXcgQXRvbWljSW50ZWdlcltudW1iZXJPZkJhbmtzXTsKKyAgICBtYXhFbnRyaWVzID0gKG51bWJlck9mQmxvY2tzUGVyQmFuayAqIG51bWJlck9mQmFua3MpIC0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQmFua3M7IGkrKykgeworICAgICAgaWYgKGRpcmVjdEFsbG9jYXRpb24pIHsKKyAgICAgICAgYmFua3NbaV0gPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KG51bWJlck9mQmxvY2tzUGVyQmFuayAqIGJsb2NrU2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiYW5rc1tpXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobnVtYmVyT2ZCbG9ja3NQZXJCYW5rICogYmxvY2tTaXplKTsKKyAgICAgIH0KKyAgICAgIGxvY2tzW2ldID0gbmV3IEJsb2NrTG9ja3MobnVtYmVyT2ZCbG9ja3NQZXJCYW5rKTsKKyAgICAgIGxvY2tDb3VudGVyc1tpXSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgfQorICAgIAorICAgIEV2aWN0aW9uTGlzdGVuZXI8QmxvY2tDYWNoZUtleSxCbG9ja0NhY2hlTG9jYXRpb24+IGxpc3RlbmVyID0gbmV3IEV2aWN0aW9uTGlzdGVuZXI8QmxvY2tDYWNoZUtleSxCbG9ja0NhY2hlTG9jYXRpb24+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkV2aWN0aW9uKEJsb2NrQ2FjaGVLZXkga2V5LCBCbG9ja0NhY2hlTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgcmVsZWFzZUxvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIGNhY2hlID0gbmV3IENvbmN1cnJlbnRMaW5rZWRIYXNoTWFwLkJ1aWxkZXI8QmxvY2tDYWNoZUtleSxCbG9ja0NhY2hlTG9jYXRpb24+KCkKKyAgICAgICAgLm1heGltdW1XZWlnaHRlZENhcGFjaXR5KG1heEVudHJpZXMpLmxpc3RlbmVyKGxpc3RlbmVyKS5idWlsZCgpOworICAgIHRoaXMuYmxvY2tTaXplID0gYmxvY2tTaXplOworICB9CisgIAorICBwcml2YXRlIHZvaWQgcmVsZWFzZUxvY2F0aW9uKEJsb2NrQ2FjaGVMb2NhdGlvbiBsb2NhdGlvbikgeworICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBiYW5rSWQgPSBsb2NhdGlvbi5nZXRCYW5rSWQoKTsKKyAgICBpbnQgYmxvY2sgPSBsb2NhdGlvbi5nZXRCbG9jaygpOworICAgIGxvY2F0aW9uLnNldFJlbW92ZWQodHJ1ZSk7CisgICAgbG9ja3NbYmFua0lkXS5jbGVhcihibG9jayk7CisgICAgbG9ja0NvdW50ZXJzW2JhbmtJZF0uZGVjcmVtZW50QW5kR2V0KCk7CisgICAgbWV0cmljcy5ibG9ja0NhY2hlRXZpY3Rpb24uaW5jcmVtZW50QW5kR2V0KCk7CisgICAgbWV0cmljcy5ibG9ja0NhY2hlU2l6ZS5kZWNyZW1lbnRBbmRHZXQoKTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gc3RvcmUoQmxvY2tDYWNoZUtleSBibG9ja0NhY2hlS2V5LCBpbnQgYmxvY2tPZmZzZXQsCisgICAgICBieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggKyBibG9ja09mZnNldCA+IGJsb2NrU2l6ZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJ1ZmZlciBzaXplIGV4Y2VlZGVkLCBleHBlY3RpbmcgbWF4IFsiCisgICAgICAgICAgKyBibG9ja1NpemUgKyAiXSBnb3QgbGVuZ3RoIFsiICsgbGVuZ3RoICsgIl0gd2l0aCBibG9ja09mZnNldCBbIgorICAgICAgICAgICsgYmxvY2tPZmZzZXQgKyAiXSIpOworICAgIH0KKyAgICBCbG9ja0NhY2hlTG9jYXRpb24gbG9jYXRpb24gPSBjYWNoZS5nZXQoYmxvY2tDYWNoZUtleSk7CisgICAgYm9vbGVhbiBuZXdMb2NhdGlvbiA9IGZhbHNlOworICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CisgICAgICBuZXdMb2NhdGlvbiA9IHRydWU7CisgICAgICBsb2NhdGlvbiA9IG5ldyBCbG9ja0NhY2hlTG9jYXRpb24oKTsKKyAgICAgIGlmICghZmluZEVtcHR5TG9jYXRpb24obG9jYXRpb24pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGxvY2F0aW9uLmlzUmVtb3ZlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCBiYW5rSWQgPSBsb2NhdGlvbi5nZXRCYW5rSWQoKTsKKyAgICBpbnQgYmFua09mZnNldCA9IGxvY2F0aW9uLmdldEJsb2NrKCkgKiBibG9ja1NpemU7CisgICAgQnl0ZUJ1ZmZlciBiYW5rID0gZ2V0QmFuayhiYW5rSWQpOworICAgIGJhbmsucG9zaXRpb24oYmFua09mZnNldCArIGJsb2NrT2Zmc2V0KTsKKyAgICBiYW5rLnB1dChkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgaWYgKG5ld0xvY2F0aW9uKSB7CisgICAgICByZWxlYXNlTG9jYXRpb24oY2FjaGUucHV0KGJsb2NrQ2FjaGVLZXkuY2xvbmUoKSwgbG9jYXRpb24pKTsKKyAgICAgIG1ldHJpY3MuYmxvY2tDYWNoZVNpemUuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBwdWJsaWMgYm9vbGVhbiBmZXRjaChCbG9ja0NhY2hlS2V5IGJsb2NrQ2FjaGVLZXksIGJ5dGVbXSBidWZmZXIsCisgICAgICBpbnQgYmxvY2tPZmZzZXQsIGludCBvZmYsIGludCBsZW5ndGgpIHsKKyAgICBCbG9ja0NhY2hlTG9jYXRpb24gbG9jYXRpb24gPSBjYWNoZS5nZXQoYmxvY2tDYWNoZUtleSk7CisgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxvY2F0aW9uLmlzUmVtb3ZlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCBiYW5rSWQgPSBsb2NhdGlvbi5nZXRCYW5rSWQoKTsKKyAgICBpbnQgb2Zmc2V0ID0gbG9jYXRpb24uZ2V0QmxvY2soKSAqIGJsb2NrU2l6ZTsKKyAgICBsb2NhdGlvbi50b3VjaCgpOworICAgIEJ5dGVCdWZmZXIgYmFuayA9IGdldEJhbmsoYmFua0lkKTsKKyAgICBiYW5rLnBvc2l0aW9uKG9mZnNldCArIGJsb2NrT2Zmc2V0KTsKKyAgICBiYW5rLmdldChidWZmZXIsIG9mZiwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gZmV0Y2goQmxvY2tDYWNoZUtleSBibG9ja0NhY2hlS2V5LCBieXRlW10gYnVmZmVyKSB7CisgICAgY2hlY2tMZW5ndGgoYnVmZmVyKTsKKyAgICByZXR1cm4gZmV0Y2goYmxvY2tDYWNoZUtleSwgYnVmZmVyLCAwLCAwLCBibG9ja1NpemUpOworICB9CisgIAorICBwcml2YXRlIGJvb2xlYW4gZmluZEVtcHR5TG9jYXRpb24oQmxvY2tDYWNoZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgLy8gVGhpcyBpcyBhIHRpZ2h0IGxvb3AgdGhhdCB3aWxsIHRyeSBhbmQgZmluZCBhIGxvY2F0aW9uIHRvCisgICAgLy8gcGxhY2UgdGhlIGJsb2NrIGJlZm9yZSBnaXZpbmcgdXAKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgIE9VVEVSOiBmb3IgKGludCBiYW5rSWQgPSAwOyBiYW5rSWQgPCBiYW5rcy5sZW5ndGg7IGJhbmtJZCsrKSB7CisgICAgICAgIEF0b21pY0ludGVnZXIgYml0U2V0Q291bnRlciA9IGxvY2tDb3VudGVyc1tiYW5rSWRdOworICAgICAgICBCbG9ja0xvY2tzIGJpdFNldCA9IGxvY2tzW2JhbmtJZF07CisgICAgICAgIGlmIChiaXRTZXRDb3VudGVyLmdldCgpID09IG51bWJlck9mQmxvY2tzUGVyQmFuaykgeworICAgICAgICAgIC8vIGlmIGJpdHNldCBpcyBmdWxsCisgICAgICAgICAgY29udGludWUgT1VURVI7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhpcyBjaGVjayBuZWVkcyB0byBzcGluLCBpZiBhIGxvY2sgd2FzIGF0dGVtcHRlZCBidXQgbm90IG9idGFpbmVkCisgICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSBiYW5rIHNob3VsZCBub3QgYmUgc2tpcHBlZAorICAgICAgICBpbnQgYml0ID0gYml0U2V0Lm5leHRDbGVhckJpdCgwKTsKKyAgICAgICAgSU5ORVI6IHdoaWxlIChiaXQgIT0gLTEpIHsKKyAgICAgICAgICBpZiAoYml0ID49IG51bWJlck9mQmxvY2tzUGVyQmFuaykgeworICAgICAgICAgICAgLy8gYml0IHNldCBpcyBmdWxsCisgICAgICAgICAgICBjb250aW51ZSBPVVRFUjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFiaXRTZXQuc2V0KGJpdCkpIHsKKyAgICAgICAgICAgIC8vIGxvY2sgd2FzIG5vdCBvYnRhaW5lZAorICAgICAgICAgICAgLy8gdGhpcyByZXN0YXJ0cyBhdCAwIGJlY2F1c2UgYW5vdGhlciBibG9jayBjb3VsZCBoYXZlIGJlZW4gdW5sb2NrZWQKKyAgICAgICAgICAgIC8vIHdoaWxlIHRoaXMgd2FzIGV4ZWN1dGluZworICAgICAgICAgICAgYml0ID0gYml0U2V0Lm5leHRDbGVhckJpdCgwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlIElOTkVSOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBsb2NrIG9idGFpbmVkCisgICAgICAgICAgICBsb2NhdGlvbi5zZXRCYW5rSWQoYmFua0lkKTsKKyAgICAgICAgICAgIGxvY2F0aW9uLnNldEJsb2NrKGJpdCk7CisgICAgICAgICAgICBiaXRTZXRDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrTGVuZ3RoKGJ5dGVbXSBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLmxlbmd0aCAhPSBibG9ja1NpemUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCdWZmZXIgd3Jvbmcgc2l6ZSwgZXhwZWN0aW5nIFsiICsgYmxvY2tTaXplCisgICAgICAgICAgKyAiXSBnb3QgWyIgKyBidWZmZXIubGVuZ3RoICsgIl0iKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciBnZXRCYW5rKGludCBiYW5rSWQpIHsKKyAgICByZXR1cm4gYmFua3NbYmFua0lkXS5kdXBsaWNhdGUoKTsKKyAgfQorICAKKyAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgIHJldHVybiBjYWNoZS5zaXplKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlS2V5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tDYWNoZUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGFlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tDYWNoZUtleS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgQmxvY2tDYWNoZUtleSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgIAorICBwcml2YXRlIGxvbmcgYmxvY2s7CisgIHByaXZhdGUgaW50IGZpbGU7CisgIAorICBwdWJsaWMgbG9uZyBnZXRCbG9jaygpIHsKKyAgICByZXR1cm4gYmxvY2s7CisgIH0KKyAgCisgIHB1YmxpYyBpbnQgZ2V0RmlsZSgpIHsKKyAgICByZXR1cm4gZmlsZTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0QmxvY2sobG9uZyBibG9jaykgeworICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0RmlsZShpbnQgZmlsZSkgeworICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKGludCkgKGJsb2NrIF4gKGJsb2NrID4+PiAzMikpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZmlsZTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOworICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisgICAgQmxvY2tDYWNoZUtleSBvdGhlciA9IChCbG9ja0NhY2hlS2V5KSBvYmo7CisgICAgaWYgKGJsb2NrICE9IG90aGVyLmJsb2NrKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGZpbGUgIT0gb3RoZXIuZmlsZSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIEJsb2NrQ2FjaGVLZXkgY2xvbmUoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAoQmxvY2tDYWNoZUtleSkgc3VwZXIuY2xvbmUoKTsKKyAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlTG9jYXRpb24uamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlTG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg2MjhmCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrQ2FjaGVMb2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK3B1YmxpYyBjbGFzcyBCbG9ja0NhY2hlTG9jYXRpb24geworICAKKyAgcHJpdmF0ZSBpbnQgYmxvY2s7CisgIHByaXZhdGUgaW50IGJhbmtJZDsKKyAgcHJpdmF0ZSBsb25nIGxhc3RBY2Nlc3MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgcHJpdmF0ZSBsb25nIGFjY2Vzc2VzOworICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gcmVtb3ZlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgCisgIHB1YmxpYyB2b2lkIHNldEJsb2NrKGludCBibG9jaykgeworICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0QmFua0lkKGludCBiYW5rSWQpIHsKKyAgICB0aGlzLmJhbmtJZCA9IGJhbmtJZDsKKyAgfQorICAKKyAgcHVibGljIGludCBnZXRCbG9jaygpIHsKKyAgICByZXR1cm4gYmxvY2s7CisgIH0KKyAgCisgIHB1YmxpYyBpbnQgZ2V0QmFua0lkKCkgeworICAgIHJldHVybiBiYW5rSWQ7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRvdWNoKCkgeworICAgIGxhc3RBY2Nlc3MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBhY2Nlc3NlcysrOworICB9CisgIAorICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzKCkgeworICAgIHJldHVybiBsYXN0QWNjZXNzOworICB9CisgIAorICBwdWJsaWMgbG9uZyBnZXROdW1iZXJPZkFjY2Vzc2VzKCkgeworICAgIHJldHVybiBhY2Nlc3NlczsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNSZW1vdmVkKCkgeworICAgIHJldHVybiByZW1vdmVkLmdldCgpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVkKGJvb2xlYW4gcmVtb3ZlZCkgeworICAgIHRoaXMucmVtb3ZlZC5zZXQocmVtb3ZlZCk7CisgIH0KKyAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tEaXJlY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk5MDAyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5LmphdmEKQEAgLTAsMCArMSwzODUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkRpcmVjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5JT0NvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5JbmRleE91dHB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Mb2NrOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkxvY2tGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zdG9yZS5oZGZzLkhkZnNEaXJlY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEJsb2NrRGlyZWN0b3J5IGV4dGVuZHMgRGlyZWN0b3J5IHsKKyAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmxvY2tEaXJlY3RvcnkuY2xhc3MpOworICAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJMT0NLX1NISUZUID0gMTM7IC8vIDJeMTMgPSA4LDE5MiBieXRlcyBwZXIgYmxvY2sKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJMT0NLX01PRCA9IDB4MUZGRjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU0laRSA9IDEgPDwgQkxPQ0tfU0hJRlQ7CisgIAorICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QmxvY2sobG9uZyBwb3MpIHsKKyAgICByZXR1cm4gcG9zID4+PiBCTE9DS19TSElGVDsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBsb25nIGdldFBvc2l0aW9uKGxvbmcgcG9zKSB7CisgICAgcmV0dXJuIHBvcyAmIEJMT0NLX01PRDsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBsb25nIGdldFJlYWxQb3NpdGlvbihsb25nIGJsb2NrLCBsb25nIHBvc2l0aW9uSW5CbG9jaykgeworICAgIHJldHVybiAoYmxvY2sgPDwgQkxPQ0tfU0hJRlQpICsgcG9zaXRpb25JbkJsb2NrOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIENhY2hlIE5PX0NBQ0hFID0gbmV3IENhY2hlKCkgeworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgbmFtZSwgbG9uZyBibG9ja0lkLCBpbnQgYmxvY2tPZmZzZXQsCisgICAgICAgIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHt9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZmV0Y2goU3RyaW5nIG5hbWUsIGxvbmcgYmxvY2tJZCwgaW50IGJsb2NrT2Zmc2V0LCBieXRlW10gYiwKKyAgICAgICAgaW50IG9mZiwgaW50IGxlbmd0aFRvUmVhZEluQmxvY2spIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsZXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2l6ZSgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW5hbWVDYWNoZUZpbGUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3QpIHt9CisgIH07CisgIAorICBwcml2YXRlIERpcmVjdG9yeSBkaXJlY3Rvcnk7CisgIHByaXZhdGUgaW50IGJsb2NrU2l6ZTsKKyAgcHJpdmF0ZSBTdHJpbmcgZGlyTmFtZTsKKyAgcHJpdmF0ZSBDYWNoZSBjYWNoZTsKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBibG9ja0NhY2hlRmlsZVR5cGVzOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYmxvY2tDYWNoZVJlYWRFbmFibGVkOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYmxvY2tDYWNoZVdyaXRlRW5hYmxlZDsKKyAgCisgIHB1YmxpYyBCbG9ja0RpcmVjdG9yeShTdHJpbmcgZGlyTmFtZSwgRGlyZWN0b3J5IGRpcmVjdG9yeSwgQ2FjaGUgY2FjaGUsCisgICAgICBTZXQ8U3RyaW5nPiBibG9ja0NhY2hlRmlsZVR5cGVzLCBib29sZWFuIGJsb2NrQ2FjaGVSZWFkRW5hYmxlZCwKKyAgICAgIGJvb2xlYW4gYmxvY2tDYWNoZVdyaXRlRW5hYmxlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLmRpck5hbWUgPSBkaXJOYW1lOworICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgIGJsb2NrU2l6ZSA9IEJMT0NLX1NJWkU7CisgICAgdGhpcy5jYWNoZSA9IGNhY2hlOworICAgIGlmIChibG9ja0NhY2hlRmlsZVR5cGVzID09IG51bGwgfHwgYmxvY2tDYWNoZUZpbGVUeXBlcy5pc0VtcHR5KCkpIHsKKyAgICAgIHRoaXMuYmxvY2tDYWNoZUZpbGVUeXBlcyA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYmxvY2tDYWNoZUZpbGVUeXBlcyA9IGJsb2NrQ2FjaGVGaWxlVHlwZXM7CisgICAgfQorICAgIHRoaXMuYmxvY2tDYWNoZVJlYWRFbmFibGVkID0gYmxvY2tDYWNoZVJlYWRFbmFibGVkOworICAgIGlmICghYmxvY2tDYWNoZVJlYWRFbmFibGVkKSB7CisgICAgICBMT0cuaW5mbygiQmxvY2sgY2FjaGUgb24gcmVhZCBpcyBkaXNhYmxlZCIpOworICAgIH0KKyAgICB0aGlzLmJsb2NrQ2FjaGVXcml0ZUVuYWJsZWQgPSBibG9ja0NhY2hlV3JpdGVFbmFibGVkOworICAgIGlmICghYmxvY2tDYWNoZVdyaXRlRW5hYmxlZCkgeworICAgICAgTE9HLmluZm8oIkJsb2NrIGNhY2hlIG9uIHdyaXRlIGlzIGRpc2FibGVkIik7CisgICAgfQorICAgIGlmIChkaXJlY3RvcnkuZ2V0TG9ja0ZhY3RvcnkoKSAhPSBudWxsKSB7CisgICAgICBzZXRMb2NrRmFjdG9yeShkaXJlY3RvcnkuZ2V0TG9ja0ZhY3RvcnkoKSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIEluZGV4SW5wdXQgb3BlbklucHV0KFN0cmluZyBuYW1lLCBpbnQgYnVmZmVyU2l6ZSwgSU9Db250ZXh0IGNvbnRleHQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEluZGV4SW5wdXQgc291cmNlID0gZGlyZWN0b3J5Lm9wZW5JbnB1dChuYW1lLCBjb250ZXh0KTsKKyAgICBpZiAodXNlUmVhZENhY2hlKG5hbWUsIGNvbnRleHQpKSB7CisgICAgICByZXR1cm4gbmV3IENhY2hlZEluZGV4SW5wdXQoc291cmNlLCBibG9ja1NpemUsIG5hbWUsCisgICAgICAgICAgZ2V0RmlsZUNhY2hlTmFtZShuYW1lKSwgY2FjaGUsIGJ1ZmZlclNpemUpOworICAgIH0KKyAgICByZXR1cm4gc291cmNlOworICB9CisgIAorICBwcml2YXRlIGJvb2xlYW4gaXNDYWNoYWJsZUZpbGUoU3RyaW5nIG5hbWUpIHsKKyAgICBmb3IgKFN0cmluZyBleHQgOiBibG9ja0NhY2hlRmlsZVR5cGVzKSB7CisgICAgICBpZiAobmFtZS5lbmRzV2l0aChleHQpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5kZXhJbnB1dCBvcGVuSW5wdXQoZmluYWwgU3RyaW5nIG5hbWUsIElPQ29udGV4dCBjb250ZXh0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gb3BlbklucHV0KG5hbWUsIGJsb2NrU2l6ZSwgY29udGV4dCk7CisgIH0KKyAgCisgIHN0YXRpYyBjbGFzcyBDYWNoZWRJbmRleElucHV0IGV4dGVuZHMgQ3VzdG9tQnVmZmVyZWRJbmRleElucHV0IHsKKyAgICAKKyAgICBwcml2YXRlIEluZGV4SW5wdXQgX3NvdXJjZTsKKyAgICBwcml2YXRlIGludCBfYmxvY2tTaXplOworICAgIHByaXZhdGUgbG9uZyBfZmlsZUxlbmd0aDsKKyAgICBwcml2YXRlIFN0cmluZyBfY2FjaGVOYW1lOworICAgIHByaXZhdGUgQ2FjaGUgX2NhY2hlOworICAgIAorICAgIHB1YmxpYyBDYWNoZWRJbmRleElucHV0KEluZGV4SW5wdXQgc291cmNlLCBpbnQgYmxvY2tTaXplLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGNhY2hlTmFtZSwgQ2FjaGUgY2FjaGUsIGludCBidWZmZXJTaXplKSB7CisgICAgICBzdXBlcihuYW1lLCBidWZmZXJTaXplKTsKKyAgICAgIF9zb3VyY2UgPSBzb3VyY2U7CisgICAgICBfYmxvY2tTaXplID0gYmxvY2tTaXplOworICAgICAgX2ZpbGVMZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7CisgICAgICBfY2FjaGVOYW1lID0gY2FjaGVOYW1lOworICAgICAgX2NhY2hlID0gY2FjaGU7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmRleElucHV0IGNsb25lKCkgeworICAgICAgQ2FjaGVkSW5kZXhJbnB1dCBjbG9uZSA9IChDYWNoZWRJbmRleElucHV0KSBzdXBlci5jbG9uZSgpOworICAgICAgY2xvbmUuX3NvdXJjZSA9IChJbmRleElucHV0KSBfc291cmNlLmNsb25lKCk7CisgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiBfc291cmNlLmxlbmd0aCgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZWVrSW50ZXJuYWwobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJlYWRJbnRlcm5hbChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGxvbmcgcG9zaXRpb24gPSBnZXRGaWxlUG9pbnRlcigpOworICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGZldGNoQmxvY2socG9zaXRpb24sIGIsIG9mZiwgbGVuKTsKKyAgICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOworICAgICAgICBsZW4gLT0gbGVuZ3RoOworICAgICAgICBvZmYgKz0gbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmZXRjaEJsb2NrKGxvbmcgcG9zaXRpb24sIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgLy8gcmVhZCB3aG9sZSBibG9jayBpbnRvIGNhY2hlIGFuZCB0aGVuIHByb3ZpZGUgbmVlZGVkIGRhdGEKKyAgICAgIGxvbmcgYmxvY2tJZCA9IGdldEJsb2NrKHBvc2l0aW9uKTsKKyAgICAgIGludCBibG9ja09mZnNldCA9IChpbnQpIGdldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgIGludCBsZW5ndGhUb1JlYWRJbkJsb2NrID0gTWF0aC5taW4obGVuLCBfYmxvY2tTaXplIC0gYmxvY2tPZmZzZXQpOworICAgICAgaWYgKGNoZWNrQ2FjaGUoYmxvY2tJZCwgYmxvY2tPZmZzZXQsIGIsIG9mZiwgbGVuZ3RoVG9SZWFkSW5CbG9jaykpIHsKKyAgICAgICAgcmV0dXJuIGxlbmd0aFRvUmVhZEluQmxvY2s7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkSW50b0NhY2hlQW5kUmVzdWx0KGJsb2NrSWQsIGJsb2NrT2Zmc2V0LCBiLCBvZmYsCisgICAgICAgICAgICBsZW5ndGhUb1JlYWRJbkJsb2NrKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsZW5ndGhUb1JlYWRJbkJsb2NrOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcmVhZEludG9DYWNoZUFuZFJlc3VsdChsb25nIGJsb2NrSWQsIGludCBibG9ja09mZnNldCwKKyAgICAgICAgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW5ndGhUb1JlYWRJbkJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgbG9uZyBwb3NpdGlvbiA9IGdldFJlYWxQb3NpdGlvbihibG9ja0lkLCAwKTsKKyAgICAgIGludCBsZW5ndGggPSAoaW50KSBNYXRoLm1pbihfYmxvY2tTaXplLCBfZmlsZUxlbmd0aCAtIHBvc2l0aW9uKTsKKyAgICAgIF9zb3VyY2Uuc2Vlayhwb3NpdGlvbik7CisgICAgICAKKyAgICAgIGJ5dGVbXSBidWYgPSBCdWZmZXJTdG9yZS50YWtlQnVmZmVyKF9ibG9ja1NpemUpOworICAgICAgX3NvdXJjZS5yZWFkQnl0ZXMoYnVmLCAwLCBsZW5ndGgpOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIGJsb2NrT2Zmc2V0LCBiLCBvZmYsIGxlbmd0aFRvUmVhZEluQmxvY2spOworICAgICAgX2NhY2hlLnVwZGF0ZShfY2FjaGVOYW1lLCBibG9ja0lkLCAwLCBidWYsIDAsIF9ibG9ja1NpemUpOworICAgICAgQnVmZmVyU3RvcmUucHV0QnVmZmVyKGJ1Zik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NhY2hlKGxvbmcgYmxvY2tJZCwgaW50IGJsb2NrT2Zmc2V0LCBieXRlW10gYiwKKyAgICAgICAgaW50IG9mZiwgaW50IGxlbmd0aFRvUmVhZEluQmxvY2spIHsKKyAgICAgIHJldHVybiBfY2FjaGUuZmV0Y2goX2NhY2hlTmFtZSwgYmxvY2tJZCwgYmxvY2tPZmZzZXQsIGIsIG9mZiwKKyAgICAgICAgICBsZW5ndGhUb1JlYWRJbkJsb2NrKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2VJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBfc291cmNlLmNsb3NlKCk7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBTdHJpbmdbXSBmaWxlcyA9IGxpc3RBbGwoKTsKKyAgICAgIAorICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgIGNhY2hlLmRlbGV0ZShnZXRGaWxlQ2FjaGVOYW1lKGZpbGUpKTsKKyAgICAgIH0KKyAgICAgIAorICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gZm9sZGVyIG1heSBiZSBnb25lCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRpcmVjdG9yeS5jbG9zZSgpOworICAgIH0KKyAgfQorICAKKyAgU3RyaW5nIGdldEZpbGVDYWNoZU5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldEZpbGVDYWNoZUxvY2F0aW9uKG5hbWUpICsgIjoiICsgZ2V0RmlsZU1vZGlmaWVkKG5hbWUpOworICB9CisgIAorICBwcml2YXRlIGxvbmcgZ2V0RmlsZU1vZGlmaWVkKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChkaXJlY3RvcnkgaW5zdGFuY2VvZiBGU0RpcmVjdG9yeSkgeworICAgICAgRmlsZSBkaXJlY3RvcnkgPSAoKEZTRGlyZWN0b3J5KSB0aGlzLmRpcmVjdG9yeSkuZ2V0RGlyZWN0b3J5KCk7CisgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIG5hbWUpOworICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkZpbGUgWyIgKyBuYW1lICsgIl0gbm90IGZvdW5kIik7CisgICAgICB9CisgICAgICByZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICB9IGVsc2UgaWYgKGRpcmVjdG9yeSBpbnN0YW5jZW9mIEhkZnNEaXJlY3RvcnkpIHsKKyAgICAgIHJldHVybiAoKEhkZnNEaXJlY3RvcnkpIGRpcmVjdG9yeSkuZmlsZU1vZGlmaWVkKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgY2xlYXJMb2NrKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGRpcmVjdG9yeS5jbGVhckxvY2sobmFtZSk7CisgIH0KKyAgCisgIFN0cmluZyBnZXRGaWxlQ2FjaGVMb2NhdGlvbihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBkaXJOYW1lICsgIi8iICsgbmFtZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvcHkoRGlyZWN0b3J5IHRvLCBTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdCwgSU9Db250ZXh0IGNvbnRleHQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGRpcmVjdG9yeS5jb3B5KHRvLCBzcmMsIGRlc3QsIGNvbnRleHQpOworICB9CisgIAorICBwdWJsaWMgTG9ja0ZhY3RvcnkgZ2V0TG9ja0ZhY3RvcnkoKSB7CisgICAgcmV0dXJuIGRpcmVjdG9yeS5nZXRMb2NrRmFjdG9yeSgpOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldExvY2tJRCgpIHsKKyAgICByZXR1cm4gZGlyZWN0b3J5LmdldExvY2tJRCgpOworICB9CisgIAorICBwdWJsaWMgTG9jayBtYWtlTG9jayhTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBkaXJlY3RvcnkubWFrZUxvY2sobmFtZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHNldExvY2tGYWN0b3J5KExvY2tGYWN0b3J5IGxvY2tGYWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGRpcmVjdG9yeS5zZXRMb2NrRmFjdG9yeShsb2NrRmFjdG9yeSk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzeW5jKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBkaXJlY3Rvcnkuc3luYyhuYW1lcyk7CisgIH0KKyAgCisgIC8vIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgIC8vIHB1YmxpYyB2b2lkIHN5bmMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIC8vIF9kaXJlY3Rvcnkuc3luYyhuYW1lKTsKKyAgLy8gfQorICAKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gZGlyZWN0b3J5LnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciByZWFkIGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQgZm9yIGEgcGFydGljdWxhcgorICAgKiBmaWxlL2NvbnRleHQuCisgICAqLworICBib29sZWFuIHVzZVJlYWRDYWNoZShTdHJpbmcgbmFtZSwgSU9Db250ZXh0IGNvbnRleHQpIHsKKyAgICBpZiAoIWJsb2NrQ2FjaGVSZWFkRW5hYmxlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYmxvY2tDYWNoZUZpbGVUeXBlcyAhPSBudWxsICYmICFpc0NhY2hhYmxlRmlsZShuYW1lKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzd2l0Y2ggKGNvbnRleHQuY29udGV4dCkgeworICAgICAgZGVmYXVsdDogeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB3cml0ZSBjYWNoaW5nIHNob3VsZCBiZSB1c2VkIGZvciBhIHBhcnRpY3VsYXIKKyAgICogZmlsZS9jb250ZXh0LgorICAgKi8KKyAgYm9vbGVhbiB1c2VXcml0ZUNhY2hlKFN0cmluZyBuYW1lLCBJT0NvbnRleHQgY29udGV4dCkgeworICAgIGlmICghYmxvY2tDYWNoZVdyaXRlRW5hYmxlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYmxvY2tDYWNoZUZpbGVUeXBlcyAhPSBudWxsICYmICFpc0NhY2hhYmxlRmlsZShuYW1lKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzd2l0Y2ggKGNvbnRleHQuY29udGV4dCkgeworICAgICAgY2FzZSBNRVJHRTogeworICAgICAgICAvLyB3ZSBjdXJyZW50bHkgZG9uJ3QgY2FjaGUgYW55IG1lcmdlIGNvbnRleHQgd3JpdGVzCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIEluZGV4T3V0cHV0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZSwgSU9Db250ZXh0IGNvbnRleHQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEluZGV4T3V0cHV0IGRlc3QgPSBkaXJlY3RvcnkuY3JlYXRlT3V0cHV0KG5hbWUsIGNvbnRleHQpOworICAgIGlmICh1c2VXcml0ZUNhY2hlKG5hbWUsIGNvbnRleHQpKSB7CisgICAgICByZXR1cm4gbmV3IENhY2hlZEluZGV4T3V0cHV0KHRoaXMsIGRlc3QsIGJsb2NrU2l6ZSwgbmFtZSwgY2FjaGUsCisgICAgICAgICAgYmxvY2tTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2FjaGUuZGVsZXRlKGdldEZpbGVDYWNoZU5hbWUobmFtZSkpOworICAgIGRpcmVjdG9yeS5kZWxldGVGaWxlKG5hbWUpOworICB9CisgIAorICBwdWJsaWMgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBkaXJlY3RvcnkuZmlsZUV4aXN0cyhuYW1lKTsKKyAgfQorICAKKyAgcHVibGljIGxvbmcgZmlsZUxlbmd0aChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZGlyZWN0b3J5LmZpbGVMZW5ndGgobmFtZSk7CisgIH0KKyAgCisgIC8vIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgIC8vIHB1YmxpYyBsb25nIGZpbGVNb2RpZmllZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgLy8gcmV0dXJuIF9kaXJlY3RvcnkuZmlsZU1vZGlmaWVkKG5hbWUpOworICAvLyB9CisgIAorICBwdWJsaWMgU3RyaW5nW10gbGlzdEFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGRpcmVjdG9yeS5saXN0QWxsKCk7CisgIH0KKyAgCisgIC8vIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgIC8vIHB1YmxpYyB2b2lkIHRvdWNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgLy8gX2RpcmVjdG9yeS50b3VjaEZpbGUobmFtZSk7CisgIC8vIH0KKyAgCisgIHB1YmxpYyBEaXJlY3RvcnkgZ2V0RGlyZWN0b3J5KCkgeworICAgIHJldHVybiBkaXJlY3Rvcnk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tEaXJlY3RvcnlDYWNoZS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5Q2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWNhOWJiCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5Q2FjaGUuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zdG9yZS5ibG9ja2NhY2hlOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBCbG9ja0RpcmVjdG9yeUNhY2hlIGltcGxlbWVudHMgQ2FjaGUgeworICBwcml2YXRlIEJsb2NrQ2FjaGUgYmxvY2tDYWNoZTsKKyAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICBwcml2YXRlIE1hcDxTdHJpbmcsSW50ZWdlcj4gbmFtZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KCk7CisgIHByaXZhdGUgTWV0cmljcyBtZXRyaWNzOworICAKKyAgcHVibGljIEJsb2NrRGlyZWN0b3J5Q2FjaGUoQmxvY2tDYWNoZSBibG9ja0NhY2hlLCBNZXRyaWNzIG1ldHJpY3MpIHsKKyAgICB0aGlzLmJsb2NrQ2FjaGUgPSBibG9ja0NhY2hlOworICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZWxldGUoU3RyaW5nIG5hbWUpIHsKKyAgICBuYW1lcy5yZW1vdmUobmFtZSk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIG5hbWUsIGxvbmcgYmxvY2tJZCwgaW50IGJsb2NrT2Zmc2V0LCBieXRlW10gYnVmZmVyLAorICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIEludGVnZXIgZmlsZSA9IG5hbWVzLmdldChuYW1lKTsKKyAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICBmaWxlID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgIG5hbWVzLnB1dChuYW1lLCBmaWxlKTsKKyAgICB9CisgICAgQmxvY2tDYWNoZUtleSBibG9ja0NhY2hlS2V5ID0gbmV3IEJsb2NrQ2FjaGVLZXkoKTsKKyAgICBibG9ja0NhY2hlS2V5LnNldEJsb2NrKGJsb2NrSWQpOworICAgIGJsb2NrQ2FjaGVLZXkuc2V0RmlsZShmaWxlKTsKKyAgICBibG9ja0NhY2hlLnN0b3JlKGJsb2NrQ2FjaGVLZXksIGJsb2NrT2Zmc2V0LCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGZldGNoKFN0cmluZyBuYW1lLCBsb25nIGJsb2NrSWQsIGludCBibG9ja09mZnNldCwgYnl0ZVtdIGIsCisgICAgICBpbnQgb2ZmLCBpbnQgbGVuZ3RoVG9SZWFkSW5CbG9jaykgeworICAgIEludGVnZXIgZmlsZSA9IG5hbWVzLmdldChuYW1lKTsKKyAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEJsb2NrQ2FjaGVLZXkgYmxvY2tDYWNoZUtleSA9IG5ldyBCbG9ja0NhY2hlS2V5KCk7CisgICAgYmxvY2tDYWNoZUtleS5zZXRCbG9jayhibG9ja0lkKTsKKyAgICBibG9ja0NhY2hlS2V5LnNldEZpbGUoZmlsZSk7CisgICAgYm9vbGVhbiBmZXRjaCA9IGJsb2NrQ2FjaGUuZmV0Y2goYmxvY2tDYWNoZUtleSwgYiwgYmxvY2tPZmZzZXQsIG9mZiwKKyAgICAgICAgbGVuZ3RoVG9SZWFkSW5CbG9jayk7CisgICAgaWYgKGZldGNoKSB7CisgICAgICBtZXRyaWNzLmJsb2NrQ2FjaGVIaXQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1ldHJpY3MuYmxvY2tDYWNoZU1pc3MuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorICAgIHJldHVybiBmZXRjaDsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIHNpemUoKSB7CisgICAgcmV0dXJuIGJsb2NrQ2FjaGUuZ2V0U2l6ZSgpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVuYW1lQ2FjaGVGaWxlKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZXN0KSB7CisgICAgSW50ZWdlciBmaWxlID0gbmFtZXMucmVtb3ZlKHNvdXJjZSk7CisgICAgLy8gcG9zc2libGUgaWYgdGhlIGZpbGUgaXMgZW1wdHkKKyAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICBuYW1lcy5wdXQoZGVzdCwgZmlsZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tMb2Nrcy5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrTG9ja3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjlhYzYxCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrTG9ja3MuamF2YQpAQCAtMCwwICsxLDk2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zdG9yZS5ibG9ja2NhY2hlOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nQXJyYXk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLk9wZW5CaXRTZXQ7CisKK3B1YmxpYyBjbGFzcyBCbG9ja0xvY2tzIHsKKyAgCisgIHByaXZhdGUgQXRvbWljTG9uZ0FycmF5IGJpdHM7CisgIHByaXZhdGUgaW50IHdsZW47CisgIAorICBwdWJsaWMgQmxvY2tMb2Nrcyhsb25nIG51bUJpdHMpIHsKKyAgICBpbnQgbGVuZ3RoID0gT3BlbkJpdFNldC5iaXRzMndvcmRzKG51bUJpdHMpOworICAgIGJpdHMgPSBuZXcgQXRvbWljTG9uZ0FycmF5KGxlbmd0aCk7CisgICAgd2xlbiA9IGxlbmd0aDsKKyAgfQorICAKKyAgLyoqCisgICAqIEZpbmQgdGhlIG5leHQgY2xlYXIgYml0IGluIHRoZSBiaXQgc2V0LgorICAgKiAKKyAgICogQHBhcmFtIGluZGV4CisgICAqICAgICAgICAgIGluZGV4CisgICAqIEByZXR1cm4gbmV4dCBuZXh0IGJpdAorICAgKi8KKyAgcHVibGljIGludCBuZXh0Q2xlYXJCaXQoaW50IGluZGV4KSB7CisgICAgaW50IGkgPSBpbmRleCA+PiA2OworICAgIGlmIChpID49IHdsZW4pIHJldHVybiAtMTsKKyAgICBpbnQgc3ViSW5kZXggPSBpbmRleCAmIDB4M2Y7IC8vIGluZGV4IHdpdGhpbiB0aGUgd29yZAorICAgIGxvbmcgd29yZCA9IH5iaXRzLmdldChpKSA+PiBzdWJJbmRleDsgLy8gc2tpcCBhbGwgdGhlIGJpdHMgdG8gdGhlIHJpZ2h0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleAorICAgIGlmICh3b3JkICE9IDApIHsKKyAgICAgIHJldHVybiAoaSA8PCA2KSArIHN1YkluZGV4ICsgTG9uZy5udW1iZXJPZlRyYWlsaW5nWmVyb3Mod29yZCk7CisgICAgfQorICAgIHdoaWxlICgrK2kgPCB3bGVuKSB7CisgICAgICB3b3JkID0gfmJpdHMuZ2V0KGkpOworICAgICAgaWYgKHdvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gKGkgPDwgNikgKyBMb25nLm51bWJlck9mVHJhaWxpbmdaZXJvcyh3b3JkKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisgIAorICAvKioKKyAgICogVGhyZWFkIHNhZmUgc2V0IG9wZXJhdGlvbiB0aGF0IHdpbGwgc2V0IHRoZSBiaXQgaWYgYW5kIG9ubHkgaWYgdGhlIGJpdCB3YXMKKyAgICogbm90IHByZXZpb3VzbHkgc2V0LgorICAgKiAKKyAgICogQHBhcmFtIGluZGV4CisgICAqICAgICAgICAgIHRoZSBpbmRleCBwb3NpdGlvbiB0byBzZXQuCisgICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBiaXQgd2FzIHNldCBhbmQgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgc2V0LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc2V0KGludCBpbmRleCkgeworICAgIGludCB3b3JkTnVtID0gaW5kZXggPj4gNjsgLy8gZGl2IDY0CisgICAgaW50IGJpdCA9IGluZGV4ICYgMHgzZjsgLy8gbW9kIDY0CisgICAgbG9uZyBiaXRtYXNrID0gMUwgPDwgYml0OworICAgIGxvbmcgd29yZCwgb3dvcmQ7CisgICAgZG8geworICAgICAgd29yZCA9IGJpdHMuZ2V0KHdvcmROdW0pOworICAgICAgLy8gaWYgc2V0IGFub3RoZXIgdGhyZWFkIHN0b2xlIHRoZSBsb2NrCisgICAgICBpZiAoKHdvcmQgJiBiaXRtYXNrKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG93b3JkID0gd29yZDsKKyAgICAgIHdvcmQgfD0gYml0bWFzazsKKyAgICB9IHdoaWxlICghYml0cy5jb21wYXJlQW5kU2V0KHdvcmROdW0sIG93b3JkLCB3b3JkKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNsZWFyKGludCBpbmRleCkgeworICAgIGludCB3b3JkTnVtID0gaW5kZXggPj4gNjsKKyAgICBpbnQgYml0ID0gaW5kZXggJiAweDAzZjsKKyAgICBsb25nIGJpdG1hc2sgPSAxTCA8PCBiaXQ7CisgICAgbG9uZyB3b3JkLCBvd29yZDsKKyAgICBkbyB7CisgICAgICB3b3JkID0gYml0cy5nZXQod29yZE51bSk7CisgICAgICBvd29yZCA9IHdvcmQ7CisgICAgICB3b3JkICY9IH5iaXRtYXNrOworICAgIH0gd2hpbGUgKCFiaXRzLmNvbXBhcmVBbmRTZXQod29yZE51bSwgb3dvcmQsIHdvcmQpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0J1ZmZlclN0b3JlLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQnVmZmVyU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNlZDJlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0J1ZmZlclN0b3JlLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQnVmZmVyU3RvcmUgeworICAKKyAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnVmZmVyU3RvcmUuY2xhc3MpOworICAKKyAgcHJpdmF0ZSBzdGF0aWMgQmxvY2tpbmdRdWV1ZTxieXRlW10+IF8xMDI0ID0gc2V0dXBCdWZmZXJzKDEwMjQsIDEpOworICBwcml2YXRlIHN0YXRpYyBCbG9ja2luZ1F1ZXVlPGJ5dGVbXT4gXzgxOTIgPSBzZXR1cEJ1ZmZlcnMoODE5MiwgMSk7CisgIHB1YmxpYyBzdGF0aWMgQXRvbWljTG9uZyBzaGFyZEJ1ZmZlcmNhY2hlTG9zdCA9IG5ldyBBdG9taWNMb25nKCk7CisgIHB1YmxpYyBzdGF0aWMgQXRvbWljTG9uZyBzaGFyZEJ1ZmZlcmNhY2hlQWxsb2NhdGUxMDI0ID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgcHVibGljIHN0YXRpYyBBdG9taWNMb25nIHNoYXJkQnVmZmVyY2FjaGVBbGxvY2F0ZTgxOTIgPSBuZXcgQXRvbWljTG9uZygpOworICBwdWJsaWMgc3RhdGljIEF0b21pY0xvbmcgc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlT3RoZXIgPSBuZXcgQXRvbWljTG9uZygpOworICAKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoaW50IF8xMDI0U2l6ZSwgaW50IF84MTkyU2l6ZSwgTWV0cmljcyBtZXRyaWNzKSB7CisKKyAgICBMT0cuaW5mbygiSW5pdGlhbGl6aW5nIHRoZSAxMDI0IGJ1ZmZlcnMgd2l0aCBbe31dIGJ1ZmZlcnMuIiwgXzEwMjRTaXplKTsKKyAgICBfMTAyNCA9IHNldHVwQnVmZmVycygxMDI0LCBfMTAyNFNpemUpOworICAgIExPRy5pbmZvKCJJbml0aWFsaXppbmcgdGhlIDgxOTIgYnVmZmVycyB3aXRoIFt7fV0gYnVmZmVycy4iLCBfODE5MlNpemUpOworICAgIF84MTkyID0gc2V0dXBCdWZmZXJzKDgxOTIsIF84MTkyU2l6ZSk7CisgICAgc2hhcmRCdWZmZXJjYWNoZUxvc3QgPSBtZXRyaWNzLnNoYXJkQnVmZmVyY2FjaGVMb3N0OworICAgIHNoYXJkQnVmZmVyY2FjaGVBbGxvY2F0ZTEwMjQgPSBtZXRyaWNzLnNoYXJkQnVmZmVyY2FjaGVBbGxvY2F0ZTEwMjQ7CisgICAgc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlODE5MiA9IG1ldHJpY3Muc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlODE5MjsKKyAgICBzaGFyZEJ1ZmZlcmNhY2hlQWxsb2NhdGVPdGhlciA9IG1ldHJpY3Muc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlT3RoZXI7CisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIEJsb2NraW5nUXVldWU8Ynl0ZVtdPiBzZXR1cEJ1ZmZlcnMoaW50IGJ1ZmZlclNpemUsIGludCBjb3VudCkgeworICAgIEJsb2NraW5nUXVldWU8Ynl0ZVtdPiBxdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8Ynl0ZVtdPihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBxdWV1ZS5hZGQobmV3IGJ5dGVbYnVmZmVyU2l6ZV0pOworICAgIH0KKyAgICByZXR1cm4gcXVldWU7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRha2VCdWZmZXIoaW50IGJ1ZmZlclNpemUpIHsKKyAgICBzd2l0Y2ggKGJ1ZmZlclNpemUpIHsKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgICAgcmV0dXJuIG5ld0J1ZmZlcjEwMjQoXzEwMjQucG9sbCgpKTsKKyAgICAgIGNhc2UgODE5MjoKKyAgICAgICAgcmV0dXJuIG5ld0J1ZmZlcjgxOTIoXzgxOTIucG9sbCgpKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXdCdWZmZXIoYnVmZmVyU2l6ZSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QnVmZmVyKGJ5dGVbXSBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGJ1ZmZlclNpemUgPSBidWZmZXIubGVuZ3RoOworICAgIHN3aXRjaCAoYnVmZmVyU2l6ZSkgeworICAgICAgY2FzZSAxMDI0OgorICAgICAgICBjaGVja1JldHVybihfMTAyNC5vZmZlcihidWZmZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSA4MTkyOgorICAgICAgICBjaGVja1JldHVybihfODE5Mi5vZmZlcihidWZmZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JldHVybihib29sZWFuIG9mZmVyKSB7CisgICAgaWYgKCFvZmZlcikgeworICAgICAgc2hhcmRCdWZmZXJjYWNoZUxvc3QuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBieXRlW10gbmV3QnVmZmVyMTAyNChieXRlW10gYnVmKSB7CisgICAgaWYgKGJ1ZiAhPSBudWxsKSB7CisgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBzaGFyZEJ1ZmZlcmNhY2hlQWxsb2NhdGUxMDI0LmluY3JlbWVudEFuZEdldCgpOworICAgIHJldHVybiBuZXcgYnl0ZVsxMDI0XTsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG5ld0J1ZmZlcjgxOTIoYnl0ZVtdIGJ1ZikgeworICAgIGlmIChidWYgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlODE5Mi5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICByZXR1cm4gbmV3IGJ5dGVbODE5Ml07CisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBuZXdCdWZmZXIoaW50IHNpemUpIHsKKyAgICBzaGFyZEJ1ZmZlcmNhY2hlQWxsb2NhdGVPdGhlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICByZXR1cm4gbmV3IGJ5dGVbc2l6ZV07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9DYWNoZS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3MGFkMAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9DYWNoZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENhY2hlIHsKKyAgCisgIC8qKgorICAgKiBSZW1vdmUgYSBmaWxlIGZyb20gdGhlIGNhY2hlLgorICAgKiAKKyAgICogQHBhcmFtIG5hbWUKKyAgICogICAgICAgICAgY2FjaGUgZmlsZSBuYW1lCisgICAqLworICB2b2lkIGRlbGV0ZShTdHJpbmcgbmFtZSk7CisgIAorICAvKioKKyAgICogVXBkYXRlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY2FjaGUgZmlsZS4gQ3JlYXRlcyBjYWNoZSBlbnRyeSBpZgorICAgKiBuZWNlc3NhcnkuCisgICAqIAorICAgKi8KKyAgdm9pZCB1cGRhdGUoU3RyaW5nIG5hbWUsIGxvbmcgYmxvY2tJZCwgaW50IGJsb2NrT2Zmc2V0LCBieXRlW10gYnVmZmVyLAorICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisgIAorICAvKioKKyAgICogRmV0Y2ggdGhlIHNwZWNpZmllZCBjYWNoZSBmaWxlIGNvbnRlbnQuCisgICAqIAorICAgKiBAcmV0dXJuIHRydWUgaWYgY2FjaGVkIGNvbnRlbnQgZm91bmQsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKKyAgICovCisgIGJvb2xlYW4gZmV0Y2goU3RyaW5nIG5hbWUsIGxvbmcgYmxvY2tJZCwgaW50IGJsb2NrT2Zmc2V0LCBieXRlW10gYiwgaW50IG9mZiwKKyAgICAgIGludCBsZW5ndGhUb1JlYWRJbkJsb2NrKTsKKyAgCisgIC8qKgorICAgKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUuCisgICAqLworICBsb25nIHNpemUoKTsKKyAgCisgIC8qKgorICAgKiBFeHBlcnQ6IFJlbmFtZSB0aGUgc3BlY2lmaWVkIGZpbGUgaW4gdGhlIGNhY2hlLiBBbGxvd3MgYSBmaWxlIHRvIGJlIG1vdmVkCisgICAqIHdpdGhvdXQgaW52YWxpZGF0aW5nIHRoZSBjYWNoZS4KKyAgICogCisgICAqIEBwYXJhbSBzb3VyY2UKKyAgICogICAgICAgICAgb3JpZ2luYWwgbmFtZQorICAgKiBAcGFyYW0gZGVzdAorICAgKiAgICAgICAgICBmaW5hbCBuYW1lCisgICAqLworICB2b2lkIHJlbmFtZUNhY2hlRmlsZShTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdCk7CisgIAorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0NhY2hlZEluZGV4T3V0cHV0LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQ2FjaGVkSW5kZXhPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNjOTJlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0NhY2hlZEluZGV4T3V0cHV0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuYmxvY2tjYWNoZTsKKworLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkluZGV4T3V0cHV0OworCisvKgorICogQ2FjaGUgdGhlIGJsb2NrcyBhcyB0aGV5IGFyZSB3cml0dGVuLiBUaGUgY2FjaGUgZmlsZSBuYW1lIGlzIHRoZSBuYW1lIG9mCisgKiB0aGUgZmlsZSB1bnRpbCB0aGUgZmlsZSBpcyBjbG9zZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBjYWNoZSBpcyB1cGRhdGVkCisgKiB0byBpbmNsdWRlIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgKHdoaWNoIGlzIHVua25vd24gdW50aWwgdGhhdCBwb2ludCkuCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZWRJbmRleE91dHB1dCBleHRlbmRzIFJldXNlZEJ1ZmZlcmVkSW5kZXhPdXRwdXQgeworICBwcml2YXRlIGZpbmFsIEJsb2NrRGlyZWN0b3J5IGRpcmVjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBJbmRleE91dHB1dCBkZXN0OworICBwcml2YXRlIGZpbmFsIGludCBibG9ja1NpemU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2F0aW9uOworICBwcml2YXRlIGZpbmFsIENhY2hlIGNhY2hlOworICAKKyAgcHVibGljIENhY2hlZEluZGV4T3V0cHV0KEJsb2NrRGlyZWN0b3J5IGRpcmVjdG9yeSwgSW5kZXhPdXRwdXQgZGVzdCwKKyAgICAgIGludCBibG9ja1NpemUsIFN0cmluZyBuYW1lLCBDYWNoZSBjYWNoZSwgaW50IGJ1ZmZlclNpemUpIHsKKyAgICBzdXBlcihidWZmZXJTaXplKTsKKyAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICB0aGlzLmRlc3QgPSBkZXN0OworICAgIHRoaXMuYmxvY2tTaXplID0gYmxvY2tTaXplOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5sb2NhdGlvbiA9IGRpcmVjdG9yeS5nZXRGaWxlQ2FjaGVMb2NhdGlvbihuYW1lKTsKKyAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBkZXN0LmZsdXNoKCk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZUludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBkZXN0LmNsb3NlKCk7CisgICAgY2FjaGUucmVuYW1lQ2FjaGVGaWxlKGxvY2F0aW9uLCBkaXJlY3RvcnkuZ2V0RmlsZUNhY2hlTmFtZShuYW1lKSk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZWVrSW50ZXJuYWwobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTZWVrIG5vdCBzdXBwb3J0ZWQiKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBpbnQgd3JpdGVCbG9jayhsb25nIHBvc2l0aW9uLCBieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gcmVhZCB3aG9sZSBibG9jayBpbnRvIGNhY2hlIGFuZCB0aGVuIHByb3ZpZGUgbmVlZGVkIGRhdGEKKyAgICBsb25nIGJsb2NrSWQgPSBCbG9ja0RpcmVjdG9yeS5nZXRCbG9jayhwb3NpdGlvbik7CisgICAgaW50IGJsb2NrT2Zmc2V0ID0gKGludCkgQmxvY2tEaXJlY3RvcnkuZ2V0UG9zaXRpb24ocG9zaXRpb24pOworICAgIGludCBsZW5ndGhUb1dyaXRlSW5CbG9jayA9IE1hdGgubWluKGxlbmd0aCwgYmxvY2tTaXplIC0gYmxvY2tPZmZzZXQpOworICAgIAorICAgIC8vIHdyaXRlIHRoZSBmaWxlIGFuZCBjb3B5IGludG8gdGhlIGNhY2hlCisgICAgZGVzdC53cml0ZUJ5dGVzKGIsIG9mZnNldCwgbGVuZ3RoVG9Xcml0ZUluQmxvY2spOworICAgIGNhY2hlLnVwZGF0ZShsb2NhdGlvbiwgYmxvY2tJZCwgYmxvY2tPZmZzZXQsIGIsIG9mZnNldCwKKyAgICAgICAgbGVuZ3RoVG9Xcml0ZUluQmxvY2spOworICAgIAorICAgIHJldHVybiBsZW5ndGhUb1dyaXRlSW5CbG9jazsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50ZXJuYWwoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvbmcgcG9zaXRpb24gPSBnZXRCdWZmZXJTdGFydCgpOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICBpbnQgbGVuID0gd3JpdGVCbG9jayhwb3NpdGlvbiwgYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgcG9zaXRpb24gKz0gbGVuOworICAgICAgbGVuZ3RoIC09IGxlbjsKKyAgICAgIG9mZnNldCArPSBsZW47CisgICAgfQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0N1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0N1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2U3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQ3VzdG9tQnVmZmVyZWRJbmRleElucHV0LmphdmEKQEAgLTAsMCArMSwyNzIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhPdXRwdXQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDdXN0b21CdWZmZXJlZEluZGV4SW5wdXQgZXh0ZW5kcyBJbmRleElucHV0IHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKyAgCisgIHByaXZhdGUgaW50IGJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRTsKKyAgCisgIHByb3RlY3RlZCBieXRlW10gYnVmZmVyOworICAKKyAgcHJpdmF0ZSBsb25nIGJ1ZmZlclN0YXJ0ID0gMDsgLy8gcG9zaXRpb24gaW4gZmlsZSBvZiBidWZmZXIKKyAgcHJpdmF0ZSBpbnQgYnVmZmVyTGVuZ3RoID0gMDsgLy8gZW5kIG9mIHZhbGlkIGJ5dGVzCisgIHByaXZhdGUgaW50IGJ1ZmZlclBvc2l0aW9uID0gMDsgLy8gbmV4dCBieXRlIHRvIHJlYWQKKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGJ1ZmZlclBvc2l0aW9uID49IGJ1ZmZlckxlbmd0aCkgcmVmaWxsKCk7CisgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXJQb3NpdGlvbisrXTsKKyAgfQorICAKKyAgcHVibGljIEN1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dChTdHJpbmcgcmVzb3VyY2VEZXNjKSB7CisgICAgdGhpcyhyZXNvdXJjZURlc2MsIEJVRkZFUl9TSVpFKTsKKyAgfQorICAKKyAgcHVibGljIEN1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dChTdHJpbmcgcmVzb3VyY2VEZXNjLCBpbnQgYnVmZmVyU2l6ZSkgeworICAgIHN1cGVyKHJlc291cmNlRGVzYyk7CisgICAgY2hlY2tCdWZmZXJTaXplKGJ1ZmZlclNpemUpOworICAgIHRoaXMuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBjaGVja0J1ZmZlclNpemUoaW50IGJ1ZmZlclNpemUpIHsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiYnVmZmVyU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChnb3QgIiArIGJ1ZmZlclNpemUgKyAiKSIpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEJ5dGVzKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlYWRCeXRlcyhiLCBvZmZzZXQsIGxlbiwgdHJ1ZSk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkQnl0ZXMoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW4sIGJvb2xlYW4gdXNlQnVmZmVyKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAKKyAgICBpZiAobGVuIDw9IChidWZmZXJMZW5ndGggLSBidWZmZXJQb3NpdGlvbikpIHsKKyAgICAgIC8vIHRoZSBidWZmZXIgY29udGFpbnMgZW5vdWdoIGRhdGEgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QKKyAgICAgIGlmIChsZW4gPiAwKSAvLyB0byBhbGxvdyBiIHRvIGJlIG51bGwgaWYgbGVuIGlzIDAuLi4KKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgYiwgb2Zmc2V0LCBsZW4pOworICAgICAgYnVmZmVyUG9zaXRpb24gKz0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAvLyB0aGUgYnVmZmVyIGRvZXMgbm90IGhhdmUgZW5vdWdoIGRhdGEuIEZpcnN0IHNlcnZlIGFsbCB3ZSd2ZSBnb3QuCisgICAgICBpbnQgYXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gYnVmZmVyUG9zaXRpb247CisgICAgICBpZiAoYXZhaWxhYmxlID4gMCkgeworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVyUG9zaXRpb24sIGIsIG9mZnNldCwgYXZhaWxhYmxlKTsKKyAgICAgICAgb2Zmc2V0ICs9IGF2YWlsYWJsZTsKKyAgICAgICAgbGVuIC09IGF2YWlsYWJsZTsKKyAgICAgICAgYnVmZmVyUG9zaXRpb24gKz0gYXZhaWxhYmxlOworICAgICAgfQorICAgICAgLy8gYW5kIG5vdywgcmVhZCB0aGUgcmVtYWluaW5nICdsZW4nIGJ5dGVzOgorICAgICAgaWYgKHVzZUJ1ZmZlciAmJiBsZW4gPCBidWZmZXJTaXplKSB7CisgICAgICAgIC8vIElmIHRoZSBhbW91bnQgbGVmdCB0byByZWFkIGlzIHNtYWxsIGVub3VnaCwgYW5kCisgICAgICAgIC8vIHdlIGFyZSBhbGxvd2VkIHRvIHVzZSBvdXIgYnVmZmVyLCBkbyBpdCBpbiB0aGUgdXN1YWwKKyAgICAgICAgLy8gYnVmZmVyZWQgd2F5OiBmaWxsIHRoZSBidWZmZXIgYW5kIGNvcHkgZnJvbSBpdDoKKyAgICAgICAgcmVmaWxsKCk7CisgICAgICAgIGlmIChidWZmZXJMZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gd2hlbiByZWZpbGwoKSBjb3VsZCBub3QgcmVhZCBsZW4gYnl0ZXM6CisgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGIsIG9mZnNldCwgYnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlYWQgcGFzdCBFT0YiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgYiwgb2Zmc2V0LCBsZW4pOworICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbGVuOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgYW1vdW50IGxlZnQgdG8gcmVhZCBpcyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyCisgICAgICAgIC8vIG9yIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gbm90IHVzZSBvdXIgYnVmZmVyIC0KKyAgICAgICAgLy8gdGhlcmUncyBubyBwZXJmb3JtYW5jZSByZWFzb24gbm90IHRvIHJlYWQgaXQgYWxsCisgICAgICAgIC8vIGF0IG9uY2UuIE5vdGUgdGhhdCB1bmxpa2UgdGhlIHByZXZpb3VzIGNvZGUgb2YKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhIHNlZWsKKyAgICAgICAgLy8gaGVyZSwgYmVjYXVzZSB0aGVyZSdzIG5vIG5lZWQgdG8gcmVyZWFkIHdoYXQgd2UKKyAgICAgICAgLy8gaGFkIGluIHRoZSBidWZmZXIuCisgICAgICAgIGxvbmcgYWZ0ZXIgPSBidWZmZXJTdGFydCArIGJ1ZmZlclBvc2l0aW9uICsgbGVuOworICAgICAgICBpZiAoYWZ0ZXIgPiBsZW5ndGgoKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZWFkIHBhc3QgRU9GIik7CisgICAgICAgIHJlYWRJbnRlcm5hbChiLCBvZmZzZXQsIGxlbik7CisgICAgICAgIGJ1ZmZlclN0YXJ0ID0gYWZ0ZXI7CisgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgICAgICAgYnVmZmVyTGVuZ3RoID0gMDsgLy8gdHJpZ2dlciByZWZpbGwoKSBvbiByZWFkCisgICAgICB9CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoNCA8PSAoYnVmZmVyTGVuZ3RoIC0gYnVmZmVyUG9zaXRpb24pKSB7CisgICAgICByZXR1cm4gKChidWZmZXJbYnVmZmVyUG9zaXRpb24rK10gJiAweEZGKSA8PCAyNCkKKyAgICAgICAgICB8ICgoYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgfCAoKGJ1ZmZlcltidWZmZXJQb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgfCAoYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhGRik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdXBlci5yZWFkSW50KCk7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICg4IDw9IChidWZmZXJMZW5ndGggLSBidWZmZXJQb3NpdGlvbikpIHsKKyAgICAgIGZpbmFsIGludCBpMSA9ICgoYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhmZikgPDwgMjQpCisgICAgICAgICAgfCAoKGJ1ZmZlcltidWZmZXJQb3NpdGlvbisrXSAmIDB4ZmYpIDw8IDE2KQorICAgICAgICAgIHwgKChidWZmZXJbYnVmZmVyUG9zaXRpb24rK10gJiAweGZmKSA8PCA4KQorICAgICAgICAgIHwgKGJ1ZmZlcltidWZmZXJQb3NpdGlvbisrXSAmIDB4ZmYpOworICAgICAgZmluYWwgaW50IGkyID0gKChidWZmZXJbYnVmZmVyUG9zaXRpb24rK10gJiAweGZmKSA8PCAyNCkKKyAgICAgICAgICB8ICgoYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhmZikgPDwgMTYpCisgICAgICAgICAgfCAoKGJ1ZmZlcltidWZmZXJQb3NpdGlvbisrXSAmIDB4ZmYpIDw8IDgpCisgICAgICAgICAgfCAoYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhmZik7CisgICAgICByZXR1cm4gKCgobG9uZykgaTEpIDw8IDMyKSB8IChpMiAmIDB4RkZGRkZGRkZMKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHN1cGVyLnJlYWRMb25nKCk7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkVkludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKDUgPD0gKGJ1ZmZlckxlbmd0aCAtIGJ1ZmZlclBvc2l0aW9uKSkgeworICAgICAgYnl0ZSBiID0gYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdOworICAgICAgaW50IGkgPSBiICYgMHg3RjsKKyAgICAgIGZvciAoaW50IHNoaWZ0ID0gNzsgKGIgJiAweDgwKSAhPSAwOyBzaGlmdCArPSA3KSB7CisgICAgICAgIGIgPSBidWZmZXJbYnVmZmVyUG9zaXRpb24rK107CisgICAgICAgIGkgfD0gKGIgJiAweDdGKSA8PCBzaGlmdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3VwZXIucmVhZFZJbnQoKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyByZWFkVkxvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICg5IDw9IGJ1ZmZlckxlbmd0aCAtIGJ1ZmZlclBvc2l0aW9uKSB7CisgICAgICBieXRlIGIgPSBidWZmZXJbYnVmZmVyUG9zaXRpb24rK107CisgICAgICBsb25nIGkgPSBiICYgMHg3RjsKKyAgICAgIGZvciAoaW50IHNoaWZ0ID0gNzsgKGIgJiAweDgwKSAhPSAwOyBzaGlmdCArPSA3KSB7CisgICAgICAgIGIgPSBidWZmZXJbYnVmZmVyUG9zaXRpb24rK107CisgICAgICAgIGkgfD0gKGIgJiAweDdGTCkgPDwgc2hpZnQ7CisgICAgICB9CisgICAgICByZXR1cm4gaTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHN1cGVyLnJlYWRWTG9uZygpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIHJlZmlsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9uZyBzdGFydCA9IGJ1ZmZlclN0YXJ0ICsgYnVmZmVyUG9zaXRpb247CisgICAgbG9uZyBlbmQgPSBzdGFydCArIGJ1ZmZlclNpemU7CisgICAgaWYgKGVuZCA+IGxlbmd0aCgpKSAvLyBkb24ndCByZWFkIHBhc3QgRU9GCisgICAgZW5kID0gbGVuZ3RoKCk7CisgICAgaW50IG5ld0xlbmd0aCA9IChpbnQpIChlbmQgLSBzdGFydCk7CisgICAgaWYgKG5ld0xlbmd0aCA8PSAwKSB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJyZWFkIHBhc3QgRU9GIik7CisgICAgCisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICBidWZmZXIgPSBCdWZmZXJTdG9yZS50YWtlQnVmZmVyKGJ1ZmZlclNpemUpOworICAgICAgc2Vla0ludGVybmFsKGJ1ZmZlclN0YXJ0KTsKKyAgICB9CisgICAgcmVhZEludGVybmFsKGJ1ZmZlciwgMCwgbmV3TGVuZ3RoKTsKKyAgICBidWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CisgICAgYnVmZmVyU3RhcnQgPSBzdGFydDsKKyAgICBidWZmZXJQb3NpdGlvbiA9IDA7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2xvc2VJbnRlcm5hbCgpOworICAgIEJ1ZmZlclN0b3JlLnB1dEJ1ZmZlcihidWZmZXIpOworICAgIGJ1ZmZlciA9IG51bGw7CisgIH0KKyAgCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsb3NlSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIAorICAvKioKKyAgICogRXhwZXJ0OiBpbXBsZW1lbnRzIGJ1ZmZlciByZWZpbGwuIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KKyAgICogdGhlIGlucHV0LgorICAgKiAKKyAgICogQHBhcmFtIGIKKyAgICogICAgICAgICAgdGhlIGFycmF5IHRvIHJlYWQgYnl0ZXMgaW50bworICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIGFycmF5IHRvIHN0YXJ0IHN0b3JpbmcgYnl0ZXMKKyAgICogQHBhcmFtIGxlbmd0aAorICAgKiAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlYWRJbnRlcm5hbChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpIHsKKyAgICByZXR1cm4gYnVmZmVyU3RhcnQgKyBidWZmZXJQb3NpdGlvbjsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHBvcyA+PSBidWZmZXJTdGFydCAmJiBwb3MgPCAoYnVmZmVyU3RhcnQgKyBidWZmZXJMZW5ndGgpKSBidWZmZXJQb3NpdGlvbiA9IChpbnQpIChwb3MgLSBidWZmZXJTdGFydCk7IC8vIHNlZWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcgorICAgIGVsc2UgeworICAgICAgYnVmZmVyU3RhcnQgPSBwb3M7CisgICAgICBidWZmZXJQb3NpdGlvbiA9IDA7CisgICAgICBidWZmZXJMZW5ndGggPSAwOyAvLyB0cmlnZ2VyIHJlZmlsbCgpIG9uIHJlYWQoKQorICAgICAgc2Vla0ludGVybmFsKHBvcyk7CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogRXhwZXJ0OiBpbXBsZW1lbnRzIHNlZWsuIFNldHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzIGZpbGUsIHdoZXJlIHRoZSBuZXh0CisgICAqIHtAbGluayAjcmVhZEludGVybmFsKGJ5dGVbXSxpbnQsaW50KX0gd2lsbCBvY2N1ci4KKyAgICogCisgICAqIEBzZWUgI3JlYWRJbnRlcm5hbChieXRlW10saW50LGludCkKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNlZWtJbnRlcm5hbChsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbmRleElucHV0IGNsb25lKCkgeworICAgIEN1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dCBjbG9uZSA9IChDdXN0b21CdWZmZXJlZEluZGV4SW5wdXQpIHN1cGVyLmNsb25lKCk7CisgICAgCisgICAgY2xvbmUuYnVmZmVyID0gbnVsbDsKKyAgICBjbG9uZS5idWZmZXJMZW5ndGggPSAwOworICAgIGNsb25lLmJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgICBjbG9uZS5idWZmZXJTdGFydCA9IGdldEZpbGVQb2ludGVyKCk7CisgICAgCisgICAgcmV0dXJuIGNsb25lOworICB9CisgIAorICAvKioKKyAgICogRmx1c2hlcyB0aGUgaW4tbWVtb3J5IGJ1ZmVyIHRvIHRoZSBnaXZlbiBvdXRwdXQsIGNvcHlpbmcgYXQgbW9zdAorICAgKiA8Y29kZT5udW1CeXRlczwvY29kZT4uCisgICAqIDxwPgorICAgKiA8Yj5OT1RFOjwvYj4gdGhpcyBtZXRob2QgZG9lcyBub3QgcmVmaWxsIHRoZSBidWZmZXIsIGhvd2V2ZXIgaXQgZG9lcworICAgKiBhZHZhbmNlIHRoZSBidWZmZXIgcG9zaXRpb24uCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgZmx1c2hlZCBmcm9tIHRoZSBpbi1tZW1vcnkgYnVmZmVyLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCBmbHVzaEJ1ZmZlcihJbmRleE91dHB1dCBvdXQsIGxvbmcgbnVtQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHRvQ29weSA9IGJ1ZmZlckxlbmd0aCAtIGJ1ZmZlclBvc2l0aW9uOworICAgIGlmICh0b0NvcHkgPiBudW1CeXRlcykgeworICAgICAgdG9Db3B5ID0gKGludCkgbnVtQnl0ZXM7CisgICAgfQorICAgIGlmICh0b0NvcHkgPiAwKSB7CisgICAgICBvdXQud3JpdGVCeXRlcyhidWZmZXIsIGJ1ZmZlclBvc2l0aW9uLCB0b0NvcHkpOworICAgICAgYnVmZmVyUG9zaXRpb24gKz0gdG9Db3B5OworICAgIH0KKyAgICByZXR1cm4gdG9Db3B5OworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvTWV0cmljcy5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL01ldHJpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UxYjlkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL01ldHJpY3MuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuYmxvY2tjYWNoZTsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWV0cmljcy5NZXRyaWNzQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tZXRyaWNzLk1ldHJpY3NSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWV0cmljcy5NZXRyaWNzVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tZXRyaWNzLlVwZGF0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWV0cmljcy5qdm0uSnZtTWV0cmljczsKKworcHVibGljIGNsYXNzIE1ldHJpY3MgaW1wbGVtZW50cyBVcGRhdGVyIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0aG9kQ2FsbCB7CisgICAgcHVibGljIEF0b21pY0xvbmcgaW52b2tlcyA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgcHVibGljIEF0b21pY0xvbmcgdGltZXMgPSBuZXcgQXRvbWljTG9uZygpOworICB9CisKKyAgcHVibGljIEF0b21pY0xvbmcgYmxvY2tDYWNoZUhpdCA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBibG9ja0NhY2hlTWlzcyA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBibG9ja0NhY2hlRXZpY3Rpb24gPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgYmxvY2tDYWNoZVNpemUgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgcm93UmVhZHMgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgcm93V3JpdGVzID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIHJlY29yZFJlYWRzID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIHJlY29yZFdyaXRlcyA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBxdWVyaWVzRXh0ZXJuYWwgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgcXVlcmllc0ludGVybmFsID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIHNoYXJkQnVmZmVyY2FjaGVBbGxvY2F0ZTEwMjQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgc2hhcmRCdWZmZXJjYWNoZUFsbG9jYXRlODE5MiA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBzaGFyZEJ1ZmZlcmNhY2hlQWxsb2NhdGVPdGhlciA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBzaGFyZEJ1ZmZlcmNhY2hlTG9zdCA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgTWFwPFN0cmluZyxNZXRob2RDYWxsPiBtZXRob2RDYWxscyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIE1ldGhvZENhbGw+KCk7CisgIAorICBwdWJsaWMgQXRvbWljTG9uZyB0YWJsZUNvdW50ID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIHJvd0NvdW50ID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIHJlY29yZENvdW50ID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHB1YmxpYyBBdG9taWNMb25nIGluZGV4Q291bnQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHVibGljIEF0b21pY0xvbmcgaW5kZXhNZW1vcnlVc2FnZSA9IG5ldyBBdG9taWNMb25nKDApOworICBwdWJsaWMgQXRvbWljTG9uZyBzZWdtZW50Q291bnQgPSBuZXcgQXRvbWljTG9uZygwKTsKKworICBwcml2YXRlIE1ldHJpY3NSZWNvcmQgbWV0cmljc1JlY29yZDsKKyAgcHJpdmF0ZSBsb25nIHByZXZpb3VzID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIE1ldHJpY3MgbWV0cmljcyA9IG5ldyBNZXRyaWNzKGNvbmYpOworICAgIE1ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IG5ldyBNZXRob2RDYWxsKCk7CisgICAgbWV0cmljcy5tZXRob2RDYWxscy5wdXQoInRlc3QiLG1ldGhvZENhbGwpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgIG1ldHJpY3MuYmxvY2tDYWNoZUhpdC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgIG1ldHJpY3MuYmxvY2tDYWNoZU1pc3MuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICBtZXRob2RDYWxsLmludm9rZXMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICBtZXRob2RDYWxsLnRpbWVzLmFkZEFuZEdldCg1NjAwMDAwMCk7CisgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTWV0cmljcyhDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgICBKdm1NZXRyaWNzLmluaXQoImJsb2NrY2FjaGUiLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgTWV0cmljc0NvbnRleHQgbWV0cmljc0NvbnRleHQgPSBNZXRyaWNzVXRpbC5nZXRDb250ZXh0KCJibG9ja2NhY2hlIik7CisgICAgbWV0cmljc1JlY29yZCA9IE1ldHJpY3NVdGlsLmNyZWF0ZVJlY29yZChtZXRyaWNzQ29udGV4dCwgIm1ldHJpY3MiKTsKKyAgICBtZXRyaWNzQ29udGV4dC5yZWdpc3RlclVwZGF0ZXIodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9VcGRhdGVzKE1ldHJpY3NDb250ZXh0IGNvbnRleHQpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgIGxvbmcgbm93ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBmbG9hdCBzZWNvbmRzID0gKG5vdyAtIHByZXZpb3VzKSAvIDEwMDAwMDAwMDAuMGY7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygiYmxvY2tjYWNoZS5oaXQiLCBnZXRQZXJTZWNvbmQoYmxvY2tDYWNoZUhpdC5nZXRBbmRTZXQoMCksIHNlY29uZHMpKTsKKyAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJibG9ja2NhY2hlLm1pc3MiLCBnZXRQZXJTZWNvbmQoYmxvY2tDYWNoZU1pc3MuZ2V0QW5kU2V0KDApLCBzZWNvbmRzKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygiYmxvY2tjYWNoZS5ldmljdGlvbiIsIGdldFBlclNlY29uZChibG9ja0NhY2hlRXZpY3Rpb24uZ2V0QW5kU2V0KDApLCBzZWNvbmRzKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygiYmxvY2tjYWNoZS5zaXplIiwgYmxvY2tDYWNoZVNpemUuZ2V0KCkpOworICAgICAgbWV0cmljc1JlY29yZC5zZXRNZXRyaWMoInJvdy5yZWFkcyIsIGdldFBlclNlY29uZChyb3dSZWFkcy5nZXRBbmRTZXQoMCksIHNlY29uZHMpKTsKKyAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJyb3cud3JpdGVzIiwgZ2V0UGVyU2Vjb25kKHJvd1dyaXRlcy5nZXRBbmRTZXQoMCksIHNlY29uZHMpKTsKKyAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJyZWNvcmQucmVhZHMiLCBnZXRQZXJTZWNvbmQocmVjb3JkUmVhZHMuZ2V0QW5kU2V0KDApLCBzZWNvbmRzKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygicmVjb3JkLndyaXRlcyIsIGdldFBlclNlY29uZChyZWNvcmRXcml0ZXMuZ2V0QW5kU2V0KDApLCBzZWNvbmRzKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygicXVlcnkuZXh0ZXJuYWwiLCBnZXRQZXJTZWNvbmQocXVlcmllc0V4dGVybmFsLmdldEFuZFNldCgwKSwgc2Vjb25kcykpOworICAgICAgbWV0cmljc1JlY29yZC5zZXRNZXRyaWMoInF1ZXJ5LmludGVybmFsIiwgZ2V0UGVyU2Vjb25kKHF1ZXJpZXNJbnRlcm5hbC5nZXRBbmRTZXQoMCksIHNlY29uZHMpKTsKKyAgICAgIGZvciAoRW50cnk8U3RyaW5nLE1ldGhvZENhbGw+IGVudHJ5IDogbWV0aG9kQ2FsbHMuZW50cnlTZXQoKSkgeworICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIE1ldGhvZENhbGwgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICBsb25nIGludm9rZXMgPSB2YWx1ZS5pbnZva2VzLmdldEFuZFNldCgwKTsKKyAgICAgICAgbG9uZyB0aW1lcyA9IHZhbHVlLnRpbWVzLmdldEFuZFNldCgwKTsKKyAgICAgICAgCisgICAgICAgIGZsb2F0IGF2Z1RpbWVzID0gKHRpbWVzIC8gKGZsb2F0KSBpbnZva2VzKSAvIDEwMDAwMDAwMDAuMGY7CisgICAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJtZXRob2RjYWxscy4iICsga2V5ICsgIi5jb3VudCIsIGdldFBlclNlY29uZChpbnZva2VzLCBzZWNvbmRzKSk7CisgICAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJtZXRob2RjYWxscy4iICsga2V5ICsgIi50aW1lIiwgYXZnVGltZXMpOworICAgICAgfQorICAgICAgbWV0cmljc1JlY29yZC5zZXRNZXRyaWMoInRhYmxlcyIsIHRhYmxlQ291bnQuZ2V0KCkpOworICAgICAgbWV0cmljc1JlY29yZC5zZXRNZXRyaWMoInJvd3MiLCByb3dDb3VudC5nZXQoKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygicmVjb3JkcyIsIHJlY29yZENvdW50LmdldCgpKTsKKyAgICAgIG1ldHJpY3NSZWNvcmQuc2V0TWV0cmljKCJpbmRleC5jb3VudCIsIGluZGV4Q291bnQuZ2V0KCkpOworICAgICAgbWV0cmljc1JlY29yZC5zZXRNZXRyaWMoImluZGV4Lm1lbW9yeXVzYWdlIiwgaW5kZXhNZW1vcnlVc2FnZS5nZXQoKSk7CisgICAgICBtZXRyaWNzUmVjb3JkLnNldE1ldHJpYygiaW5kZXguc2VnbWVudHMiLCBzZWdtZW50Q291bnQuZ2V0KCkpOworICAgICAgcHJldmlvdXMgPSBub3c7CisgICAgfQorICAgIG1ldHJpY3NSZWNvcmQudXBkYXRlKCk7CisgIH0KKworICBwcml2YXRlIGZsb2F0IGdldFBlclNlY29uZChsb25nIHZhbHVlLCBmbG9hdCBzZWNvbmRzKSB7CisgICAgcmV0dXJuIChmbG9hdCkgKHZhbHVlIC8gc2Vjb25kcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL1JldXNlZEJ1ZmZlcmVkSW5kZXhPdXRwdXQuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9SZXVzZWRCdWZmZXJlZEluZGV4T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiNjhkZAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9SZXVzZWRCdWZmZXJlZEluZGV4T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5JbmRleE91dHB1dDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFJldXNlZEJ1ZmZlcmVkSW5kZXhPdXRwdXQgZXh0ZW5kcyBJbmRleE91dHB1dCB7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7CisgIAorICBwcml2YXRlIGludCBidWZmZXJTaXplID0gQlVGRkVSX1NJWkU7CisgIAorICBwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZmZlcjsKKyAgCisgIC8qKiBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvZiBidWZmZXIgKi8KKyAgcHJpdmF0ZSBsb25nIGJ1ZmZlclN0YXJ0ID0gMDsKKyAgLyoqIGVuZCBvZiB2YWxpZCBieXRlcyAqLworICBwcml2YXRlIGludCBidWZmZXJMZW5ndGggPSAwOworICAvKiogbmV4dCBieXRlIHRvIHdyaXRlICovCisgIHByaXZhdGUgaW50IGJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgLyoqIHRvdGFsIGxlbmd0aCBvZiB0aGUgZmlsZSAqLworICBwcml2YXRlIGxvbmcgZmlsZUxlbmd0aCA9IDA7CisgIAorICBwdWJsaWMgUmV1c2VkQnVmZmVyZWRJbmRleE91dHB1dCgpIHsKKyAgICB0aGlzKEJVRkZFUl9TSVpFKTsKKyAgfQorICAKKyAgcHVibGljIFJldXNlZEJ1ZmZlcmVkSW5kZXhPdXRwdXQoaW50IGJ1ZmZlclNpemUpIHsKKyAgICBjaGVja0J1ZmZlclNpemUoYnVmZmVyU2l6ZSk7CisgICAgdGhpcy5idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKyAgICBidWZmZXIgPSBCdWZmZXJTdG9yZS50YWtlQnVmZmVyKHRoaXMuYnVmZmVyU2l6ZSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCBsb25nIGdldEJ1ZmZlclN0YXJ0KCkgeworICAgIHJldHVybiBidWZmZXJTdGFydDsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQnVmZmVyU2l6ZShpbnQgYnVmZmVyU2l6ZSkgeworICAgIGlmIChidWZmZXJTaXplIDw9IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJidWZmZXJTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgKGdvdCAiICsgYnVmZmVyU2l6ZSArICIpIik7CisgIH0KKyAgCisgIC8qKiBXcml0ZSB0aGUgYnVmZmVyZWQgYnl0ZXMgdG8gY2FjaGUgKi8KKyAgcHJpdmF0ZSB2b2lkIGZsdXNoQnVmZmVyVG9DYWNoZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVJbnRlcm5hbChidWZmZXIsIDAsIGJ1ZmZlckxlbmd0aCk7CisgICAgCisgICAgYnVmZmVyU3RhcnQgKz0gYnVmZmVyTGVuZ3RoOworICAgIGJ1ZmZlckxlbmd0aCA9IDA7CisgICAgYnVmZmVyUG9zaXRpb24gPSAwOworICB9CisgIAorICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmbHVzaEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmbHVzaEJ1ZmZlclRvQ2FjaGUoKTsKKyAgICBmbHVzaEludGVybmFsKCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsb3NlSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZsdXNoQnVmZmVyVG9DYWNoZSgpOworICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICBCdWZmZXJTdG9yZS5wdXRCdWZmZXIoYnVmZmVyKTsKKyAgICBidWZmZXIgPSBudWxsOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKSB7CisgICAgcmV0dXJuIGJ1ZmZlclN0YXJ0ICsgYnVmZmVyUG9zaXRpb247CisgIH0KKyAgCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNlZWtJbnRlcm5hbChsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGZpbGVMZW5ndGg7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChidWZmZXJQb3NpdGlvbiA+PSBidWZmZXJTaXplKSB7CisgICAgICBmbHVzaEJ1ZmZlclRvQ2FjaGUoKTsKKyAgICB9CisgICAgaWYgKGdldEZpbGVQb2ludGVyKCkgPj0gZmlsZUxlbmd0aCkgeworICAgICAgZmlsZUxlbmd0aCsrOworICAgIH0KKyAgICBidWZmZXJbYnVmZmVyUG9zaXRpb24rK10gPSBiOworICAgIGlmIChidWZmZXJQb3NpdGlvbiA+IGJ1ZmZlckxlbmd0aCkgeworICAgICAgYnVmZmVyTGVuZ3RoID0gYnVmZmVyUG9zaXRpb247CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogRXhwZXJ0OiBpbXBsZW1lbnRzIGJ1ZmZlciBmbHVzaGluZyB0byBjYWNoZS4gV3JpdGVzIGJ5dGVzIHRvIHRoZSBjdXJyZW50CisgICAqIHBvc2l0aW9uIGluIHRoZSBvdXRwdXQuCisgICAqIAorICAgKiBAcGFyYW0gYgorICAgKiAgICAgICAgICB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHBhcmFtIG9mZnNldAorICAgKiAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZQorICAgKiBAcGFyYW0gbGVuZ3RoCisgICAqICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlSW50ZXJuYWwoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoZ2V0RmlsZVBvaW50ZXIoKSArIGxlbmd0aCA+IGZpbGVMZW5ndGgpIHsKKyAgICAgIGZpbGVMZW5ndGggPSBnZXRGaWxlUG9pbnRlcigpICsgbGVuZ3RoOworICAgIH0KKyAgICBpZiAobGVuZ3RoIDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3NpdGlvbikgeworICAgICAgLy8gdGhlIGJ1ZmZlciBjb250YWlucyBlbm91Z2ggc3BhY2UgdG8gc2F0aXNmeSB0aGlzIHJlcXVlc3QKKyAgICAgIGlmIChsZW5ndGggPiAwKSB7IC8vIHRvIGFsbG93IGIgdG8gYmUgbnVsbCBpZiBsZW4gaXMgMC4uLgorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZnNldCwgYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlclBvc2l0aW9uICs9IGxlbmd0aDsKKyAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA+IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICBidWZmZXJMZW5ndGggPSBidWZmZXJQb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gdGhlIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBzcGFjZS4gRmlyc3QgYnVmZmVyIGFsbCB3ZSd2ZSBnb3QuCisgICAgICBpbnQgYXZhaWxhYmxlID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvc2l0aW9uOworICAgICAgaWYgKGF2YWlsYWJsZSA+IDApIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmZzZXQsIGJ1ZmZlciwgYnVmZmVyUG9zaXRpb24sIGF2YWlsYWJsZSk7CisgICAgICAgIG9mZnNldCArPSBhdmFpbGFibGU7CisgICAgICAgIGxlbmd0aCAtPSBhdmFpbGFibGU7CisgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgYnVmZmVyTGVuZ3RoID0gYnVmZmVyU2l6ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZmx1c2hCdWZmZXJUb0NhY2hlKCk7CisgICAgICAKKyAgICAgIC8vIGFuZCBub3csIHdyaXRlIHRoZSByZW1haW5pbmcgJ2xlbmd0aCcgYnl0ZXM6CisgICAgICBpZiAobGVuZ3RoIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAvLyBJZiB0aGUgYW1vdW50IGxlZnQgdG8gd3JpdGUgaXMgc21hbGwgZW5vdWdoIGRvIGl0IGluIHRoZSB1c3VhbAorICAgICAgICAvLyBidWZmZXJlZCB3YXk6CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2Zmc2V0LCBidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbGVuZ3RoOworICAgICAgICBidWZmZXJMZW5ndGggPSBsZW5ndGg7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgYW1vdW50IGxlZnQgdG8gd3JpdGUgaXMgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlcgorICAgICAgICAvLyB0aGVyZSdzIG5vIHBlcmZvcm1hbmNlIHJlYXNvbiBub3QgdG8gd3JpdGUgaXQgYWxsCisgICAgICAgIC8vIGF0IG9uY2UuCisgICAgICAgIHdyaXRlSW50ZXJuYWwoYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBidWZmZXJTdGFydCArPSBsZW5ndGg7CisgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvcGFja2FnZS5odG1sIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMyOGMyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI5IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorPGJvZHk+Cis8cD4KK0FuIEhERlMgYmxvY2tjYWNoZSBpbXBsZW1lbnRhdGlvbi4KKworCis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0RpcmVjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL0hkZnNEaXJlY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2MwMjMwCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL0hkZnNEaXJlY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSU9Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhPdXRwdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTm9Mb2NrRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuYmxvY2tjYWNoZS5DdXN0b21CdWZmZXJlZEluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEhkZnNEaXJlY3RvcnkgZXh0ZW5kcyBEaXJlY3RvcnkgeworICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIZGZzRGlyZWN0b3J5LmNsYXNzKTsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRl9FWFQgPSAiLmxmIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVFNfR0VOID0gInNlZ21lbnRzLmdlbiI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW5kZXhPdXRwdXQgTlVMTF9XUklURVIgPSBuZXcgTnVsbEluZGV4T3V0cHV0KCk7CisgIHByb3RlY3RlZCBQYXRoIGhkZnNEaXJQYXRoOworICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworICAKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlU3lzdGVtIGZpbGVTeXN0ZW07CisgIAorICBwdWJsaWMgSGRmc0RpcmVjdG9yeShQYXRoIGhkZnNEaXJQYXRoLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydCBoZGZzRGlyUGF0aC50b1N0cmluZygpLnN0YXJ0c1dpdGgoImhkZnM6LyIpIDogaGRmc0RpclBhdGgudG9TdHJpbmcoKTsKKyAgICBzZXRMb2NrRmFjdG9yeShOb0xvY2tGYWN0b3J5LmdldE5vTG9ja0ZhY3RvcnkoKSk7CisgICAgdGhpcy5oZGZzRGlyUGF0aCA9IGhkZnNEaXJQYXRoOworICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgZmlsZVN5c3RlbSA9IEZpbGVTeXN0ZW0ubmV3SW5zdGFuY2UoaGRmc0RpclBhdGgudG9VcmkoKSwgY29uZmlndXJhdGlvbik7CisgICAgdHJ5IHsKKyAgICAgIGlmICghZmlsZVN5c3RlbS5leGlzdHMoaGRmc0RpclBhdGgpKSB7CisgICAgICAgIGZpbGVTeXN0ZW0ubWtkaXJzKGhkZnNEaXJQYXRoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoZmlsZVN5c3RlbSk7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvYmxlbSBjcmVhdGluZyBkaXJlY3Rvcnk6ICIgKyBoZGZzRGlyUGF0aCwKKyAgICAgICAgICBlKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTE9HLmluZm8oIkNsb3NpbmcgaGRmcyBkaXJlY3Rvcnkge30iLCBoZGZzRGlyUGF0aCk7CisgICAgZmlsZVN5c3RlbS5jbG9zZSgpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIEluZGV4T3V0cHV0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZSwgSU9Db250ZXh0IGNvbnRleHQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChTRUdNRU5UU19HRU4uZXF1YWxzKG5hbWUpKSB7CisgICAgICByZXR1cm4gTlVMTF9XUklURVI7CisgICAgfQorICAgIEhkZnNGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBIZGZzRmlsZVdyaXRlcihnZXRGaWxlU3lzdGVtKCksIG5ldyBQYXRoKAorICAgICAgICBoZGZzRGlyUGF0aCwgbmFtZSkpOworICAgIHJldHVybiBuZXcgSGRmc0luZGV4T3V0cHV0KHdyaXRlcik7CisgIH0KKyAgCisgIHByaXZhdGUgU3RyaW5nW10gZ2V0Tm9ybWFsTmFtZXMoTGlzdDxTdHJpbmc+IGZpbGVzKSB7CisgICAgaW50IHNpemUgPSBmaWxlcy5zaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIFN0cmluZyBzdHIgPSBmaWxlcy5nZXQoaSk7CisgICAgICBmaWxlcy5zZXQoaSwgdG9Ob3JtYWxOYW1lKHN0cikpOworICAgIH0KKyAgICByZXR1cm4gZmlsZXMudG9BcnJheShuZXcgU3RyaW5nW10ge30pOworICB9CisgIAorICBwcml2YXRlIFN0cmluZyB0b05vcm1hbE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAobmFtZS5lbmRzV2l0aChMRl9FWFQpKSB7CisgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDMpOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbmRleElucHV0IG9wZW5JbnB1dChTdHJpbmcgbmFtZSwgSU9Db250ZXh0IGNvbnRleHQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBvcGVuSW5wdXQobmFtZSwgQlVGRkVSX1NJWkUpOworICB9CisgIAorICBwcml2YXRlIEluZGV4SW5wdXQgb3BlbklucHV0KFN0cmluZyBuYW1lLCBpbnQgYnVmZmVyU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEhkZnNOb3JtYWxJbmRleElucHV0KG5hbWUsIGdldEZpbGVTeXN0ZW0oKSwgbmV3IFBhdGgoCisgICAgICAgIGhkZnNEaXJQYXRoLCBuYW1lKSwgQlVGRkVSX1NJWkUpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChoZGZzRGlyUGF0aCwgbmFtZSk7CisgICAgTE9HLmRlYnVnKCJEZWxldGluZyB7fSIsIHBhdGgpOworICAgIGdldEZpbGVTeXN0ZW0oKS5kZWxldGUocGF0aCwgZmFsc2UpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0RmlsZVN5c3RlbSgpLmV4aXN0cyhuZXcgUGF0aChoZGZzRGlyUGF0aCwgbmFtZSkpOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZmlsZUxlbmd0aChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gSGRmc0ZpbGVSZWFkZXIuZ2V0TGVuZ3RoKGdldEZpbGVTeXN0ZW0oKSwKKyAgICAgICAgbmV3IFBhdGgoaGRmc0RpclBhdGgsIG5hbWUpKTsKKyAgfQorICAKKyAgcHVibGljIGxvbmcgZmlsZU1vZGlmaWVkKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGVTdGF0dXMgZmlsZVN0YXR1cyA9IGdldEZpbGVTeXN0ZW0oKS5nZXRGaWxlU3RhdHVzKAorICAgICAgICBuZXcgUGF0aChoZGZzRGlyUGF0aCwgbmFtZSkpOworICAgIHJldHVybiBmaWxlU3RhdHVzLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBsaXN0QWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlU3RhdHVzW10gbGlzdFN0YXR1cyA9IGdldEZpbGVTeXN0ZW0oKS5saXN0U3RhdHVzKGhkZnNEaXJQYXRoKTsKKyAgICBMaXN0PFN0cmluZz4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBpZiAobGlzdFN0YXR1cyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt9OworICAgIH0KKyAgICBmb3IgKEZpbGVTdGF0dXMgc3RhdHVzIDogbGlzdFN0YXR1cykgeworICAgICAgaWYgKCFzdGF0dXMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICBmaWxlcy5hZGQoc3RhdHVzLmdldFBhdGgoKS5nZXROYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ2V0Tm9ybWFsTmFtZXMoZmlsZXMpOworICB9CisgIAorICBwdWJsaWMgUGF0aCBnZXRIZGZzRGlyUGF0aCgpIHsKKyAgICByZXR1cm4gaGRmc0RpclBhdGg7CisgIH0KKyAgCisgIHB1YmxpYyBGaWxlU3lzdGVtIGdldEZpbGVTeXN0ZW0oKSB7CisgICAgcmV0dXJuIGZpbGVTeXN0ZW07CisgIH0KKyAgCisgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgIH0KKyAgCisgIHN0YXRpYyBjbGFzcyBIZGZzTm9ybWFsSW5kZXhJbnB1dCBleHRlbmRzIEN1c3RvbUJ1ZmZlcmVkSW5kZXhJbnB1dCB7CisgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAuZ2V0TG9nZ2VyKEhkZnNOb3JtYWxJbmRleElucHV0LmNsYXNzKTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIFBhdGggcGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIEZTRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsZW5ndGg7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb25lID0gZmFsc2U7CisgICAgCisgICAgcHVibGljIEhkZnNOb3JtYWxJbmRleElucHV0KFN0cmluZyBuYW1lLCBGaWxlU3lzdGVtIGZpbGVTeXN0ZW0sIFBhdGggcGF0aCwKKyAgICAgICAgaW50IGJ1ZmZlclNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBzdXBlcihuYW1lKTsKKyAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICBMT0cuZGVidWcoIk9wZW5pbmcgbm9ybWFsIGluZGV4IGlucHV0IG9uIHt9IiwgcGF0aCk7CisgICAgICBGaWxlU3RhdHVzIGZpbGVTdGF0dXMgPSBmaWxlU3lzdGVtLmdldEZpbGVTdGF0dXMocGF0aCk7CisgICAgICBsZW5ndGggPSBmaWxlU3RhdHVzLmdldExlbigpOworICAgICAgaW5wdXRTdHJlYW0gPSBmaWxlU3lzdGVtLm9wZW4ocGF0aCwgYnVmZmVyU2l6ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJlYWRJbnRlcm5hbChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlucHV0U3RyZWFtLnJlYWQoZ2V0RmlsZVBvaW50ZXIoKSwgYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZWVrSW50ZXJuYWwobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpbnB1dFN0cmVhbS5zZWVrKHBvcyk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgTE9HLmRlYnVnKCJDbG9zaW5nIG5vcm1hbCBpbmRleCBpbnB1dCBvbiB7fSIsIHBhdGgpOworICAgICAgaWYgKCFjbG9uZSkgeworICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5kZXhJbnB1dCBjbG9uZSgpIHsKKyAgICAgIEhkZnNOb3JtYWxJbmRleElucHV0IGNsb25lID0gKEhkZnNOb3JtYWxJbmRleElucHV0KSBzdXBlci5jbG9uZSgpOworICAgICAgY2xvbmUuY2xvbmUgPSB0cnVlOworICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKyAgfQorICAKKyAgc3RhdGljIGNsYXNzIEhkZnNJbmRleE91dHB1dCBleHRlbmRzIEluZGV4T3V0cHV0IHsKKyAgICAKKyAgICBwcml2YXRlIEhkZnNGaWxlV3JpdGVyIHdyaXRlcjsKKyAgICAKKyAgICBwdWJsaWMgSGRmc0luZGV4T3V0cHV0KEhkZnNGaWxlV3JpdGVyIHdyaXRlcikgeworICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKSB7CisgICAgICByZXR1cm4gd3JpdGVyLmdldFBvc2l0aW9uKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKKyAgICAgIHJldHVybiB3cml0ZXIubGVuZ3RoKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB3cml0ZXIud3JpdGVCeXRlKGIpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgd3JpdGVyLndyaXRlQnl0ZXMoYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN5bmMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExPRy5kZWJ1ZygiU3luYyBjYWxsZWQgb24ge30iLCBBcnJheXMudG9TdHJpbmcobmFtZXMudG9BcnJheSgpKSk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0ZpbGVSZWFkZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvaGRmcy9IZGZzRmlsZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTM3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0ZpbGVSZWFkZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRlNEYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGF0YUlucHV0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBIZGZzRmlsZVJlYWRlciBleHRlbmRzIERhdGFJbnB1dCB7CisgIAorICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIZGZzRmlsZVJlYWRlci5jbGFzcyk7CisgIAorICBwcml2YXRlIGZpbmFsIFBhdGggcGF0aDsKKyAgcHJpdmF0ZSBGU0RhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgcHJpdmF0ZSBsb25nIGxlbmd0aDsKKyAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvbmU7CisgIAorICBwdWJsaWMgSGRmc0ZpbGVSZWFkZXIoRmlsZVN5c3RlbSBmaWxlU3lzdGVtLCBQYXRoIHBhdGgsIGludCBidWZmZXJTaXplKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIExPRy5kZWJ1ZygiT3BlbmluZyByZWFkZXIgb24ge30iLCBwYXRoKTsKKyAgICBpZiAoIWZpbGVTeXN0ZW0uZXhpc3RzKHBhdGgpKSB7CisgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHBhdGgudG9TdHJpbmcoKSk7CisgICAgfQorICAgIGlucHV0U3RyZWFtID0gZmlsZVN5c3RlbS5vcGVuKHBhdGgsIGJ1ZmZlclNpemUpOworICAgIEZpbGVTdGF0dXMgZmlsZVN0YXR1cyA9IGZpbGVTeXN0ZW0uZ2V0RmlsZVN0YXR1cyhwYXRoKTsKKyAgICBsZW5ndGggPSBmaWxlU3RhdHVzLmdldExlbigpOworICB9CisgIAorICBwdWJsaWMgSGRmc0ZpbGVSZWFkZXIoRmlsZVN5c3RlbSBmaWxlU3lzdGVtLCBQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcyhmaWxlU3lzdGVtLCBwYXRoLCBIZGZzRGlyZWN0b3J5LkJVRkZFUl9TSVpFKTsKKyAgfQorICAKKyAgcHVibGljIGxvbmcgbGVuZ3RoKCkgeworICAgIHJldHVybiBsZW5ndGg7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW5wdXRTdHJlYW0uc2Vlayhwb3MpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCFpc0Nsb25lKSB7CisgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgIH0KKyAgICBMT0cuZGVidWcoIkNsb3NpbmcgcmVhZGVyIG9uIHt9IiwgcGF0aCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgdXNlZCEKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTE9HLndhcm4oIlNob3VsZCBub3QgYmUgdXNlZCEiKTsKKyAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZEJ5dGUoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRCeXRlcyhieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgaW50IGxlblJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKGIsIG9mZnNldCwgbGVuKTsKKyAgICAgIG9mZnNldCArPSBsZW5SZWFkOworICAgICAgbGVuIC09IGxlblJlYWQ7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TGVuZ3RoKEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSwgUGF0aCBwYXRoKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlU3RhdHVzIGZpbGVTdGF0dXMgPSBmaWxlU3lzdGVtLmdldEZpbGVTdGF0dXMocGF0aCk7CisgICAgcmV0dXJuIGZpbGVTdGF0dXMuZ2V0TGVuKCk7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YUlucHV0IGNsb25lKCkgeworICAgIEhkZnNGaWxlUmVhZGVyIHJlYWRlciA9IChIZGZzRmlsZVJlYWRlcikgc3VwZXIuY2xvbmUoKTsKKyAgICByZWFkZXIuaXNDbG9uZSA9IHRydWU7CisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvaGRmcy9IZGZzRmlsZVdyaXRlci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL0hkZnNGaWxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxZjlmNgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvaGRmcy9IZGZzRmlsZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmhkZnM7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5DcmVhdGVGbGFnOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZzU2VydmVyRGVmYXVsdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5wZXJtaXNzaW9uLkZzUGVybWlzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EYXRhT3V0cHV0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBIZGZzRmlsZVdyaXRlciBleHRlbmRzIERhdGFPdXRwdXQgeworICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIZGZzRmlsZVdyaXRlci5jbGFzcyk7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIREZTX1NZTkNfQkxPQ0sgPSAic29sci5oZGZzLnN5bmMuYmxvY2siOworICAKKyAgcHJpdmF0ZSBmaW5hbCBQYXRoIHBhdGg7CisgIHByaXZhdGUgRlNEYXRhT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKKyAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQb3NpdGlvbjsKKyAgCisgIHB1YmxpYyBIZGZzRmlsZVdyaXRlcihGaWxlU3lzdGVtIGZpbGVTeXN0ZW0sIFBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMT0cuZGVidWcoIkNyZWF0aW5nIHdyaXRlciBvbiB7fSIsIHBhdGgpOworICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgCisgICAgQ29uZmlndXJhdGlvbiBjb25mID0gZmlsZVN5c3RlbS5nZXRDb25mKCk7CisgICAgRnNTZXJ2ZXJEZWZhdWx0cyBmc0RlZmF1bHRzID0gZmlsZVN5c3RlbS5nZXRTZXJ2ZXJEZWZhdWx0cyhwYXRoKTsKKyAgICBFbnVtU2V0PENyZWF0ZUZsYWc+IGZsYWdzID0gRW51bVNldC5vZihDcmVhdGVGbGFnLkNSRUFURSwKKyAgICAgICAgQ3JlYXRlRmxhZy5PVkVSV1JJVEUpOworICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oSERGU19TWU5DX0JMT0NLKSkgeworICAgICAgZmxhZ3MuYWRkKENyZWF0ZUZsYWcuU1lOQ19CTE9DSyk7CisgICAgfQorICAgIG91dHB1dFN0cmVhbSA9IGZpbGVTeXN0ZW0uY3JlYXRlKHBhdGgsIEZzUGVybWlzc2lvbi5nZXREZWZhdWx0KCkKKyAgICAgICAgLmFwcGx5VU1hc2soRnNQZXJtaXNzaW9uLmdldFVNYXNrKGNvbmYpKSwgZmxhZ3MsIGZzRGVmYXVsdHMKKyAgICAgICAgLmdldEZpbGVCdWZmZXJTaXplKCksIGZzRGVmYXVsdHMuZ2V0UmVwbGljYXRpb24oKSwgZnNEZWZhdWx0cworICAgICAgICAuZ2V0QmxvY2tTaXplKCksIG51bGwpOworICB9CisgIAorICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CisgICAgcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2Vlayhsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMT0cuZXJyb3IoIkludmFsaWQgc2VlayBjYWxsZWQgb24ge30iLCBwYXRoKTsKKyAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNlZWsgbm90IHN1cHBvcnRlZCIpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gZmx1c2ggdG8gdGhlIG5ldHdvcmssIG5vdCBndWFyYW50ZWVzIGl0IG1ha2VzIGl0IHRvIHRoZSBETiAodnMgaGZsdXNoKQorICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgIExPRy5kZWJ1ZygiRmx1c2hlZCBmaWxlIHt9IiwgcGF0aCk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICBMT0cuZGVidWcoIkNsb3NlZCB3cml0ZXIgb24ge30iLCBwYXRoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0cHV0U3RyZWFtLndyaXRlKGIgJiAweEZGKTsKKyAgICBjdXJyZW50UG9zaXRpb24rKzsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0cHV0U3RyZWFtLndyaXRlKGIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBjdXJyZW50UG9zaXRpb24gKz0gbGVuZ3RoOworICB9CisgIAorICBwdWJsaWMgbG9uZyBnZXRQb3NpdGlvbigpIHsKKyAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0xvY2tGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0xvY2tGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMTEzYQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvaGRmcy9IZGZzTG9ja0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTG9jazsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Mb2NrRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Mb2NrUmVsZWFzZUZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5JT1V0aWxzOworCitwdWJsaWMgY2xhc3MgSGRmc0xvY2tGYWN0b3J5IGV4dGVuZHMgTG9ja0ZhY3RvcnkgeworICAKKyAgcHJpdmF0ZSBQYXRoIGxvY2tQYXRoOworICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgCisgIHB1YmxpYyBIZGZzTG9ja0ZhY3RvcnkoUGF0aCBsb2NrUGF0aCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgdGhpcy5sb2NrUGF0aCA9IGxvY2tQYXRoOworICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgTG9jayBtYWtlTG9jayhTdHJpbmcgbG9ja05hbWUpIHsKKyAgICAKKyAgICBpZiAobG9ja1ByZWZpeCAhPSBudWxsKSB7CisgICAgICBsb2NrTmFtZSA9IGxvY2tQcmVmaXggKyAiLSIgKyBsb2NrTmFtZTsKKyAgICB9CisgICAgCisgICAgSGRmc0xvY2sgbG9jayA9IG5ldyBIZGZzTG9jayhsb2NrUGF0aCwgbG9ja05hbWUsIGNvbmZpZ3VyYXRpb24pOworICAgIAorICAgIHJldHVybiBsb2NrOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXJMb2NrKFN0cmluZyBsb2NrTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlU3lzdGVtIGZzID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgZnMgPSBGaWxlU3lzdGVtLm5ld0luc3RhbmNlKGxvY2tQYXRoLnRvVXJpKCksIGNvbmZpZ3VyYXRpb24pOworICAgICAgCisgICAgICBpZiAoZnMuZXhpc3RzKGxvY2tQYXRoKSkgeworICAgICAgICBpZiAobG9ja1ByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgbG9ja05hbWUgPSBsb2NrUHJlZml4ICsgIi0iICsgbG9ja05hbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFBhdGggbG9ja0ZpbGUgPSBuZXcgUGF0aChsb2NrUGF0aCwgbG9ja05hbWUpOworCisgICAgICAgIGlmIChmcy5leGlzdHMobG9ja0ZpbGUpICYmICFmcy5kZWxldGUobG9ja0ZpbGUsIGZhbHNlKSkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSAiICsgbG9ja0ZpbGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGZzKTsKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBQYXRoIGdldExvY2tQYXRoKCkgeworICAgIHJldHVybiBsb2NrUGF0aDsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgc2V0TG9ja1BhdGgoUGF0aCBsb2NrUGF0aCkgeworICAgIHRoaXMubG9ja1BhdGggPSBsb2NrUGF0aDsKKyAgfQorICAKKyAgc3RhdGljIGNsYXNzIEhkZnNMb2NrIGV4dGVuZHMgTG9jayB7CisgICAgCisgICAgcHJpdmF0ZSBQYXRoIGxvY2tQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIGxvY2tOYW1lOworICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25mOworICAgIAorICAgIHB1YmxpYyBIZGZzTG9jayhQYXRoIGxvY2tQYXRoLCBTdHJpbmcgbG9ja05hbWUsIENvbmZpZ3VyYXRpb24gY29uZikgeworICAgICAgdGhpcy5sb2NrUGF0aCA9IGxvY2tQYXRoOworICAgICAgdGhpcy5sb2NrTmFtZSA9IGxvY2tOYW1lOworICAgICAgdGhpcy5jb25mID0gY29uZjsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb2J0YWluKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIEZTRGF0YU91dHB1dFN0cmVhbSBmaWxlID0gbnVsbDsKKyAgICAgIEZpbGVTeXN0ZW0gZnMgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgZnMgPSBGaWxlU3lzdGVtLm5ld0luc3RhbmNlKGxvY2tQYXRoLnRvVXJpKCksIGNvbmYpOworICAgICAgICAKKyAgICAgICAgZmlsZSA9IGZzLmNyZWF0ZShuZXcgUGF0aChsb2NrUGF0aCwgbG9ja05hbWUpLCBmYWxzZSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGZpbGUpOworICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmcyk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZShsb2NrUGF0aC50b1VyaSgpLCBjb25mKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChmcy5leGlzdHMobmV3IFBhdGgobG9ja1BhdGgsIGxvY2tOYW1lKSkKKyAgICAgICAgICAgICYmICFmcy5kZWxldGUobmV3IFBhdGgobG9ja1BhdGgsIGxvY2tOYW1lKSwgZmFsc2UpKSB0aHJvdyBuZXcgTG9ja1JlbGVhc2VGYWlsZWRFeGNlcHRpb24oCisgICAgICAgICAgICAiZmFpbGVkIHRvIGRlbGV0ZSAiICsgbmV3IFBhdGgobG9ja1BhdGgsIGxvY2tOYW1lKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmcyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKKyAgICAgIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLm5ld0luc3RhbmNlKGxvY2tQYXRoLnRvVXJpKCksIGNvbmYpOworICAgICAgdHJ5IHsKKyAgICAgICAgaXNMb2NrZWQgPSBmcy5leGlzdHMobmV3IFBhdGgobG9ja1BhdGgsIGxvY2tOYW1lKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmcyk7CisgICAgICB9CisgICAgICByZXR1cm4gaXNMb2NrZWQ7CisgICAgfQorICAgIAorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL051bGxJbmRleE91dHB1dC5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL051bGxJbmRleE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTUzODUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvTnVsbEluZGV4T3V0cHV0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuc3RvcmUuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhPdXRwdXQ7CisKK3B1YmxpYyBjbGFzcyBOdWxsSW5kZXhPdXRwdXQgZXh0ZW5kcyBJbmRleE91dHB1dCB7CisgIAorICBwcml2YXRlIGxvbmcgcG9zOworICBwcml2YXRlIGxvbmcgbGVuZ3RoOworICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldEZpbGVQb2ludGVyKCkgeworICAgIHJldHVybiBwb3M7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBsZW5ndGg7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHBvcysrOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwb3MgKz0gbGVuZ3RoOworICAgIHVwZGF0ZUxlbmd0aCgpOworICB9CisgIAorICBwcml2YXRlIHZvaWQgdXBkYXRlTGVuZ3RoKCkgeworICAgIGlmIChwb3MgPiBsZW5ndGgpIHsKKyAgICAgIGxlbmd0aCA9IHBvczsKKyAgICB9CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvcGFja2FnZS5odG1sIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU5MjhlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI5IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorPGJvZHk+Cis8cD4KK0FuIEhERlMgRGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLgorCisKKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RlZmF1bHRTb2xyQ29yZVN0YXRlLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9EZWZhdWx0U29sckNvcmVTdGF0ZS5qYXZhCmluZGV4IDJiMzQ1NDQuLmVmMGEyYTkgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RlZmF1bHRTb2xyQ29yZVN0YXRlLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvRGVmYXVsdFNvbHJDb3JlU3RhdGUuamF2YQpAQCAtMTg3LDYgKzE4Nyw3NiBAQAogICAgICAgfQogICAgIH0KICAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZUluZGV4V3JpdGVyKFNvbHJDb3JlIGNvcmUsIGJvb2xlYW4gcm9sbGJhY2spCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvZy5pbmZvKCJDbG9zaW5nIEluZGV4V3JpdGVyLi4uIik7CisgICAgU3RyaW5nIGNvcmVOYW1lID0gY29yZS5nZXROYW1lKCk7CisgICAgc3luY2hyb25pemVkICh3cml0ZXJQYXVzZUxvY2spIHsKKyAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsICJBbHJlYWR5IGNsb3NlZCIpOworICAgICAgfQorICAgICAgCisgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBXcml0ZXIgdG8gZmFsbCBvdXQgb2YgdXNlCisgICAgICAvLyBmaXJzdCBsZXRzIHN0b3AgaXQgZnJvbSBiZWluZyBsZW50IG91dAorICAgICAgcGF1c2VXcml0ZXIgPSB0cnVlOworICAgICAgLy8gdGhlbiBsZXRzIHdhaXQgdW50aWwgaXRzIG91dCBvZiB1c2UKKyAgICAgIGxvZy5pbmZvKCJXYWl0aW5nIHVudGlsIEluZGV4V3JpdGVyIGlzIHVudXNlZC4uLiBjb3JlPSIgKyBjb3JlTmFtZSk7CisgICAgICAKKyAgICAgIHdoaWxlICghd3JpdGVyRnJlZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHdyaXRlclBhdXNlTG9jay53YWl0KDEwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIAorICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICJTb2xyQ29yZVN0YXRlIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKGluZGV4V3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgaWYgKCFyb2xsYmFjaykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2cuaW5mbygiQ2xvc2luZyBvbGQgSW5kZXhXcml0ZXIuLi4gY29yZT0iICsgY29yZU5hbWUpOworICAgICAgICAgICAgaW5kZXhXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU29sckV4Y2VwdGlvbi5sb2cobG9nLCAiRXJyb3IgY2xvc2luZyBvbGQgSW5kZXhXcml0ZXIuIGNvcmU9IgorICAgICAgICAgICAgICAgICsgY29yZU5hbWUsIHQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmluZm8oIlJvbGxiYWNrIG9sZCBJbmRleFdyaXRlci4uLiBjb3JlPSIgKyBjb3JlTmFtZSk7CisgICAgICAgICAgICBpbmRleFdyaXRlci5yb2xsYmFjaygpOworICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csICJFcnJvciByb2xsaW5nIGJhY2sgb2xkIEluZGV4V3JpdGVyLiBjb3JlPSIKKyAgICAgICAgICAgICAgICArIGNvcmVOYW1lLCB0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvcGVuSW5kZXhXcml0ZXIoU29sckNvcmUgY29yZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBsb2cuaW5mbygiQ3JlYXRpbmcgbmV3IEluZGV4V3JpdGVyLi4uIik7CisgICAgc3luY2hyb25pemVkICh3cml0ZXJQYXVzZUxvY2spIHsKKyAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsICJBbHJlYWR5IGNsb3NlZCIpOworICAgICAgfQorICAgICAgCisgICAgICB0cnkgeworICAgICAgICBpbmRleFdyaXRlciA9IGNyZWF0ZU1haW5JbmRleFdyaXRlcihjb3JlLCAiRGlyZWN0VXBkYXRlSGFuZGxlcjIiKTsKKyAgICAgICAgbG9nLmluZm8oIk5ldyBJbmRleFdyaXRlciBpcyByZWFkeSB0byBiZSB1c2VkLiIpOworICAgICAgICAvLyB3ZSBuZWVkIHRvIG51bGwgdGhpcyBzbyBpdCBwaWNrcyB1cCB0aGUgbmV3IHdyaXRlciBuZXh0IGdldCBjYWxsCisgICAgICAgIHJlZkNudFdyaXRlciA9IG51bGw7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBwYXVzZVdyaXRlciA9IGZhbHNlOworICAgICAgICB3cml0ZXJQYXVzZUxvY2subm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByb2xsYmFja0luZGV4V3JpdGVyKFNvbHJDb3JlIGNvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9EaXJlY3RVcGRhdGVIYW5kbGVyMi5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvRGlyZWN0VXBkYXRlSGFuZGxlcjIuamF2YQppbmRleCA5ZmMzNmI0Li5lMTNhNDFlIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9EaXJlY3RVcGRhdGVIYW5kbGVyMi5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RpcmVjdFVwZGF0ZUhhbmRsZXIyLmphdmEKQEAgLTEwOCw2ICsxMDgsOCBAQAogICAgIHNvZnRDb21taXRUcmFja2VyID0gbmV3IENvbW1pdFRyYWNrZXIoIlNvZnQiLCBjb3JlLCBzb2Z0Q29tbWl0RG9jc1VwcGVyQm91bmQsIHNvZnRDb21taXRUaW1lVXBwZXJCb3VuZCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgCiAgICAgY29tbWl0V2l0aGluU29mdENvbW1pdCA9IHVwZGF0ZUhhbmRsZXJJbmZvLmNvbW1pdFdpdGhpblNvZnRDb21taXQ7CisKKwogICB9CiAgIAogICBwdWJsaWMgRGlyZWN0VXBkYXRlSGFuZGxlcjIoU29sckNvcmUgY29yZSwgVXBkYXRlSGFuZGxlciB1cGRhdGVIYW5kbGVyKSB7CkBAIC0xMjUsNiArMTI3LDEzIEBACiAgICAgc29mdENvbW1pdFRyYWNrZXIgPSBuZXcgQ29tbWl0VHJhY2tlcigiU29mdCIsIGNvcmUsIHNvZnRDb21taXREb2NzVXBwZXJCb3VuZCwgc29mdENvbW1pdFRpbWVVcHBlckJvdW5kLCB1cGRhdGVIYW5kbGVySW5mby5vcGVuU2VhcmNoZXIsIHRydWUpOwogICAgIAogICAgIGNvbW1pdFdpdGhpblNvZnRDb21taXQgPSB1cGRhdGVIYW5kbGVySW5mby5jb21taXRXaXRoaW5Tb2Z0Q29tbWl0OworCisgICAgVXBkYXRlTG9nIGV4aXN0aW5nTG9nID0gdXBkYXRlSGFuZGxlci5nZXRVcGRhdGVMb2coKTsKKyAgICBpZiAodGhpcy51bG9nICE9IG51bGwgJiYgdGhpcy51bG9nID09IGV4aXN0aW5nTG9nKSB7CisgICAgICAvLyBJZiB3ZSBhcmUgcmV1c2luZyB0aGUgZXhpc3RpbmcgdXBkYXRlIGxvZywgaW5mb3JtIHRoZSBsb2cgdGhhdCBpdCdzIHVwZGF0ZSBoYW5kbGVyIGhhcyBjaGFuZ2VkLgorICAgICAgLy8gV2UgZG8gdGhpcyBhcyBsYXRlIGFzIHBvc3NpYmxlLgorICAgICAgdGhpcy51bG9nLmluaXQodGhpcywgY29yZSk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzEsMTEgKzU0MCwxNyBAQAogICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICAgICAvLyBTb2xyQ29yZS52ZXJib3NlKCJ3cml0ZXIuY29tbWl0KCkgc3RhcnQgd3JpdGVyPSIsd3JpdGVyKTsKLSAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gY29tbWl0RGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gICAgICAgICAgY29tbWl0RGF0YS5wdXQoU29sckluZGV4V3JpdGVyLkNPTU1JVF9USU1FX01TRUNfS0VZLAotICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotICAgICAgICAgIHdyaXRlci5zZXRDb21taXREYXRhKGNvbW1pdERhdGEpOwotICAgICAgICAgIHdyaXRlci5jb21taXQoKTsKKworICAgICAgICAgIGlmICh3cml0ZXIuaGFzVW5jb21taXR0ZWRDaGFuZ2VzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBjb21taXREYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKyAgICAgICAgICAgIGNvbW1pdERhdGEucHV0KFNvbHJJbmRleFdyaXRlci5DT01NSVRfVElNRV9NU0VDX0tFWSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgICAgICAgICAgd3JpdGVyLnNldENvbW1pdERhdGEoY29tbWl0RGF0YSk7CisgICAgICAgICAgICB3cml0ZXIuY29tbWl0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJObyB1bmNvbW1pdHRlZCBjaGFuZ2VzLiBTa2lwcGluZyBJVy5jb21taXQuIik7CisgICAgICAgICAgfQorCiAgICAgICAgICAgLy8gU29sckNvcmUudmVyYm9zZSgid3JpdGVyLmNvbW1pdCgpIGVuZCIpOwogICAgICAgICAgIG51bURvY3NQZW5kaW5nLnNldCgwKTsKICAgICAgICAgICBjYWxsUG9zdENvbW1pdENhbGxiYWNrcygpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvSGRmc1RyYW5zYWN0aW9uTG9nLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9IZGZzVHJhbnNhY3Rpb25Mb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU3NzRkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvSGRmc1RyYW5zYWN0aW9uTG9nLmphdmEKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51cGRhdGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dERvY3VtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5EYXRhSW5wdXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuRmFzdElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5GYXN0T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5KYXZhQmluQ29kZWM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiAgTG9nIEZvcm1hdDogTGlzdHtPcGVyYXRpb24sIFZlcnNpb24sIC4uLn0KKyAqICBBREQsIFZFUlNJT04sIERPQworICogIERFTEVURSwgVkVSU0lPTiwgSURfQllURVMKKyAqICBERUxFVEVfQllfUVVFUlksIFZFUlNJT04sIFN0cmluZworICoKKyAqICBUT0RPOiBrZWVwIHR3byBmaWxlcywgb25lIGZvciBbb3BlcmF0aW9uLCB2ZXJzaW9uLCBpZF0gYW5kIHRoZSBvdGhlciBmb3IgdGhlIGFjdHVhbAorICogIGRvY3VtZW50IGRhdGEuICBUaGF0IHdheSB3ZSBjb3VsZCB0aHJvdyBhd2F5IGRvY3VtZW50IGxvZyBmaWxlcyBtb3JlIHJlYWRpbHkKKyAqICB3aGlsZSByZXRhaW5pbmcgdGhlIHNtYWxsZXIgb3BlcmF0aW9uIGxvZyBmaWxlcyBsb25nZXIgKGFuZCB3ZSBjYW4gcmV0cmlldmUKKyAqICB0aGUgc3RvcmVkIGZpZWxkcyBmcm9tIHRoZSBsYXRlc3QgZG9jdW1lbnRzIGZyb20gdGhlIGluZGV4KS4KKyAqCisgKiAgVGhpcyB3b3VsZCByZXF1aXJlIGtlZXBpbmcgYWxsIHNvdXJjZSBmaWVsZHMgc3RvcmVkIG9mIGNvdXJzZS4KKyAqCisgKiAgVGhpcyB3b3VsZCBhbHNvIGFsbG93IHRvIG5vdCBsb2cgZG9jdW1lbnQgZGF0YSBmb3IgcmVxdWVzdHMgd2l0aCBjb21taXQ9dHJ1ZQorICogIGluIHRoZW0gKHNpbmNlIHdlIGtub3cgdGhhdCBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgYWxsIGRvY3Mgd2lsbCBiZSBjb21taXR0ZWQpCisgKgorICovCitwdWJsaWMgY2xhc3MgSGRmc1RyYW5zYWN0aW9uTG9nIGV4dGVuZHMgVHJhbnNhY3Rpb25Mb2cgeworICBwdWJsaWMgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIZGZzVHJhbnNhY3Rpb25Mb2cuY2xhc3MpOworCisKKyAgUGF0aCB0bG9nRmlsZTsKKworICAKKyAgcHJpdmF0ZSBGU0RhdGFPdXRwdXRTdHJlYW0gdGxvZ091dFN0cmVhbTsKKyAgcHJpdmF0ZSBGaWxlU3lzdGVtIGZzOworCisgIEhkZnNUcmFuc2FjdGlvbkxvZyhGaWxlU3lzdGVtIGZzLCBQYXRoIHRsb2dGaWxlLCBDb2xsZWN0aW9uPFN0cmluZz4gZ2xvYmFsU3RyaW5ncykgeworICAgIHRoaXMoZnMsIHRsb2dGaWxlLCBnbG9iYWxTdHJpbmdzLCBmYWxzZSk7CisgIH0KKworICBIZGZzVHJhbnNhY3Rpb25Mb2coRmlsZVN5c3RlbSBmcywgUGF0aCB0bG9nRmlsZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGdsb2JhbFN0cmluZ3MsIGJvb2xlYW4gb3BlbkV4aXN0aW5nKSB7CisgICAgc3VwZXIoKTsKKyAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB0aGlzLmZzID0gZnM7CisKKyAgICB0cnkgeworICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgIC8vbG9nLmRlYnVnKCJOZXcgVHJhbnNhY3Rpb25Mb2cgZmlsZT0iICsgdGxvZ0ZpbGUgKyAiLCBleGlzdHM9IiArIHRsb2dGaWxlLmV4aXN0cygpICsgIiwgc2l6ZT0iICsgdGxvZ0ZpbGUubGVuZ3RoKCkgKyAiLCBvcGVuRXhpc3Rpbmc9IiArIG9wZW5FeGlzdGluZyk7CisgICAgICB9CisgICAgICB0aGlzLnRsb2dGaWxlID0gdGxvZ0ZpbGU7CisgICAgICAKKyAgICAgIC8vIFRPRE86IGxvb2sgaW50byBmb3JjZWZ1bGx5IHRha2luZyBvdmVyIGFueSBsZWFzZQorICAgICAgaWYgKGZzLmV4aXN0cyh0bG9nRmlsZSkgJiYgb3BlbkV4aXN0aW5nKSB7CisgICAgICAgIHRsb2dPdXRTdHJlYW0gPSBmcy5hcHBlbmQodGxvZ0ZpbGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnMuZGVsZXRlKHRsb2dGaWxlLCBmYWxzZSk7CisgICAgICAgIAorICAgICAgICB0bG9nT3V0U3RyZWFtID0gZnMuY3JlYXRlKHRsb2dGaWxlLCAoc2hvcnQpMSk7CisgICAgICAgIHRsb2dPdXRTdHJlYW0uaHN5bmMoKTsKKyAgICAgIH0KKworICAgICAgZm9zID0gbmV3IEZhc3RPdXRwdXRTdHJlYW0odGxvZ091dFN0cmVhbSwgbmV3IGJ5dGVbNjU1MzZdLCAwKTsKKyAgICAgIGxvbmcgc3RhcnQgPSB0bG9nT3V0U3RyZWFtLmdldFBvcygpOyAKKworICAgICAgaWYgKG9wZW5FeGlzdGluZykgeworICAgICAgICBpZiAoc3RhcnQgPiAwKSB7CisgICAgICAgICAgcmVhZEhlYWRlcihudWxsKTsKKyAgICAgICAgICAKKyAgICAgICAgIC8vIHdlIHNob3VsZCBhbHJlYWR5IGJlIGF0IHRoZSBlbmQgCisgICAgICAgICAvLyByYWYuc2VlayhzdGFydCk7CisKKyAgICAgICAgLy8gIGFzc2VydCBjaGFubmVsLnBvc2l0aW9uKCkgPT0gc3RhcnQ7CisgICAgICAgICAgZm9zLnNldFdyaXR0ZW4oc3RhcnQpOyAgICAvLyByZWZsZWN0IHRoYXQgd2UgYXJlbid0IHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAvL2Fzc2VydCBmb3Muc2l6ZSgpID09IGNoYW5uZWwuc2l6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZEdsb2JhbFN0cmluZ3MoZ2xvYmFsU3RyaW5ncyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdGFydCA+IDApIHsKKyAgICAgICAgICBsb2cuZXJyb3IoIk5ldyB0cmFuc2FjdGlvbiBsb2cgYWxyZWFkeSBleGlzdHM6IiArIHRsb2dGaWxlICsgIiBzaXplPSIgKyB0bG9nT3V0U3RyZWFtLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRHbG9iYWxTdHJpbmdzKGdsb2JhbFN0cmluZ3MpOworICAgICAgfQorCisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmICghc3VjY2VzcyAmJiB0bG9nT3V0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0bG9nT3V0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBjbG9zaW5nIHRsb2cgZmlsZSAoYWZ0ZXIgZXJyb3Igb3BlbmluZykiLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlbmRzV2l0aENvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9uZyBzaXplOworICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgZm9zLmZsdXNoKCk7CisgICAgICB0bG9nT3V0U3RyZWFtLmhmbHVzaCgpOworICAgICAgc2l6ZSA9IGZvcy5zaXplKCk7CisgICAgfQorCisgICAgCisgICAgLy8gdGhlIGVuZCBvZiB0aGUgZmlsZSBzaG91bGQgaGF2ZSB0aGUgZW5kIG1lc3NhZ2UgKGFkZGVkIGR1cmluZyBhIGNvbW1pdCkgcGx1cyBhIDQgYnl0ZSBzaXplCisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWyBFTkRfTUVTU0FHRS5sZW5ndGgoKSBdOworICAgIGxvbmcgcG9zID0gc2l6ZSAtIEVORF9NRVNTQUdFLmxlbmd0aCgpIC0gNDsKKyAgICBpZiAocG9zIDwgMCkgcmV0dXJuIGZhbHNlOworICAgIAorICAgIEZTRGF0YUZhc3RJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRlNEYXRhRmFzdElucHV0U3RyZWFtKGZzLm9wZW4odGxvZ0ZpbGUpLCBwb3MpOworICAgIHRyeSB7CisgICAgLy9DaGFubmVsRmFzdElucHV0U3RyZWFtIGlzID0gbmV3IENoYW5uZWxGYXN0SW5wdXRTdHJlYW0oY2hhbm5lbCwgcG9zKTsKKyAgICBkaXMucmVhZChidWYpOworICAgIGZvciAoaW50IGk9MDsgaTxidWYubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChidWZbaV0gIT0gRU5EX01FU1NBR0UuY2hhckF0KGkpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBkaXMuY2xvc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIFRoaXMgY291bGQgbWVzcyB3aXRoIGFueSByZWFkZXJzIG9yIHJldmVyc2UgcmVhZGVycyB0aGF0IGFyZSBvcGVuLCBvciBhbnl0aGluZyB0aGF0IG1pZ2h0IHRyeSB0byBkbyBhIGxvZyBsb29rdXAuCisgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byByb2xsIGJhY2sgYnVmZmVyZWQgdXBkYXRlcywgbm90IGFjdHVhbGx5IGFwcGxpZWQgdXBkYXRlcy4KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgYXNzZXJ0IHNuYXBzaG90X3NpemUgPT0gcG9zOworICAgICAgZm9zLmZsdXNoKCk7CisgICAgICB0bG9nT3V0U3RyZWFtLmhmbHVzaCgpOworICAgICAgLy8gVE9ETzogaG93IGRvIHdlIHJvbGxiYWNrIHdpdGggaGRmcz8/IFdlIG5lZWQgSERGUy0zMTA3CisgICAgICAvL3JhZi5zZXRMZW5ndGgocG9zKTsKKyAgICAgIGZvcy5zZXRXcml0dGVuKHBvcyk7CisgICAgICBhc3NlcnQgZm9zLnNpemUoKSA9PSBwb3M7CisgICAgICBudW1SZWNvcmRzID0gc25hcHNob3RfbnVtUmVjb3JkczsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEhlYWRlcihGYXN0SW5wdXRTdHJlYW0gZmlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIHJlYWQgZXhpc3RpbmcgaGVhZGVyCisgICAgYm9vbGVhbiBjbG9zZUZpcyA9IGZhbHNlOworICAgIGlmIChmaXMgPT0gbnVsbCkgY2xvc2VGaXMgPSB0cnVlOworICAgIGZpcyA9IGZpcyAhPSBudWxsID8gZmlzIDogbmV3IEZTRGF0YUZhc3RJbnB1dFN0cmVhbShmcy5vcGVuKHRsb2dGaWxlKSwgMCk7CisgICAgTWFwIGhlYWRlciA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKKyAgICAgIGhlYWRlciA9IChNYXApIGNvZGVjLnVubWFyc2hhbChmaXMpOworICAgICAgCisgICAgICBmaXMucmVhZEludCgpOyAvLyBza2lwIHNpemUKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGZpcyAhPSBudWxsICYmIGNsb3NlRmlzKSB7CisgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgICAvLyBuZWVkZWQgdG8gcmVhZCBvdGhlciByZWNvcmRzCisKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgIGdsb2JhbFN0cmluZ0xpc3QgPSAoTGlzdDxTdHJpbmc+KWhlYWRlci5nZXQoInN0cmluZ3MiKTsKKyAgICAgIGdsb2JhbFN0cmluZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oZ2xvYmFsU3RyaW5nTGlzdC5zaXplKCkpOworICAgICAgZm9yIChpbnQgaT0wOyBpPGdsb2JhbFN0cmluZ0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZ2xvYmFsU3RyaW5nTWFwLnB1dCggZ2xvYmFsU3RyaW5nTGlzdC5nZXQoaSksIGkrMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIHdyaXRlQ29tbWl0KENvbW1pdFVwZGF0ZUNvbW1hbmQgY21kLCBpbnQgZmxhZ3MpIHsKKyAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYyhyZXNvbHZlcik7CisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICB0cnkgeworICAgICAgICBsb25nIHBvcyA9IGZvcy5zaXplKCk7ICAgLy8gaWYgd2UgaGFkIGZsdXNoZWQsIHRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIGNoYW5uZWwucG9zaXRpb24oKQorCisgICAgICAgIGlmIChwb3MgPT0gMCkgeworICAgICAgICAgIHdyaXRlTG9nSGVhZGVyKGNvZGVjKTsKKyAgICAgICAgICBwb3MgPSBmb3Muc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjb2RlYy5pbml0KGZvcyk7CisgICAgICAgIGNvZGVjLndyaXRlVGFnKEphdmFCaW5Db2RlYy5BUlIsIDMpOworICAgICAgICBjb2RlYy53cml0ZUludChVcGRhdGVMb2cuQ09NTUlUIHwgZmxhZ3MpOyAgLy8gc2hvdWxkIGp1c3QgdGFrZSBvbmUgYnl0ZQorICAgICAgICBjb2RlYy53cml0ZUxvbmcoY21kLmdldFZlcnNpb24oKSk7CisgICAgICAgIGNvZGVjLndyaXRlU3RyKEVORF9NRVNTQUdFKTsgIC8vIGVuc3VyZSB0aGVzZSBieXRlcyBhcmUgKGFsbW9zdCkgbGFzdCBpbiB0aGUgZmlsZQorCisgICAgICAgIGVuZFJlY29yZChwb3MpOworICAgICAgICAKKyAgICAgICAgZm9zLmZsdXNoKCk7ICAvLyBmbHVzaCBzaW5jZSB0aGlzIHdpbGwgYmUgdGhlIGxhc3QgcmVjb3JkIGluIGEgbG9nIGZpbGwKKyAgICAgICAgdGxvZ091dFN0cmVhbS5oZmx1c2goKTsKKworICAgICAgICAvL2Fzc2VydCBmb3Muc2l6ZSgpID09IGNoYW5uZWwuc2l6ZSgpOworCisgICAgICAgIHJldHVybiBwb3M7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQgc2FmZSAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBsb29rdXAobG9uZyBwb3MpIHsKKyAgICAvLyBBIG5lZ2F0aXZlIHBvc2l0aW9uIGNhbiByZXN1bHQgZnJvbSBhIGxvZyByZXBsYXkgKHdoaWNoIGRvZXMgbm90IHJlLWxvZywgYnV0IGRvZXMKKyAgICAvLyB1cGRhdGUgdGhlIHZlcnNpb24gbWFwLiAgVGhpcyBpcyBPSyBzaW5jZSB0aGUgbm9kZSB3b24ndCBiZSBBQ1RJVkUgd2hlbiB0aGlzIGhhcHBlbnMuCisgICAgaWYgKHBvcyA8IDApIHJldHVybiBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIC8vIG1ha2Ugc3VyZSBhbnkgdW5mbHVzaGVkIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCisgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBieSBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgd2UgaGF2ZSBmbHVzaGVkIHVwIHRvCisgICAgICAgIGZvcy5mbHVzaEJ1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgLy8gZmx1c2ggdG8gaGRmcworICAgICAgICB0bG9nT3V0U3RyZWFtLmhmbHVzaCgpOworICAgICAgICAvKioqCisgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjI2ZsdXNoQnVmZmVyIHRvICIgKyBmb3Muc2l6ZSgpICsgIiByYWYubGVuZ3RoKCk9IiArIHJhZi5sZW5ndGgoKSArICIgcG9zPSIrcG9zKTsKKyAgICAgICAgaWYgKGZvcy5zaXplKCkgIT0gcmFmLmxlbmd0aCgpIHx8IHBvcyA+PSBmb3Muc2l6ZSgpICkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFUlJPUiIgKyAiIyMjZmx1c2hCdWZmZXIgdG8gIiArIGZvcy5zaXplKCkgKyAiIHJhZi5sZW5ndGgoKT0iICsgcmFmLmxlbmd0aCgpICsgIiBwb3M9Iitwb3MpOworICAgICAgICB9CisgICAgICAgICoqKi8KKyAgICAgIH0KKworICAgICAgRlNEYXRhRmFzdElucHV0U3RyZWFtIGRpcyA9IG5ldyBGU0RhdGFGYXN0SW5wdXRTdHJlYW0oZnMub3Blbih0bG9nRmlsZSksCisgICAgICAgICAgcG9zKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRpcy5zZWVrKHBvcyk7CisgICAgICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjLnJlYWRWYWwobmV3IEZhc3RJbnB1dFN0cmVhbShkaXMpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgInBvcz0iICsgcG9zLCBlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZmluaXNoKFVwZGF0ZUxvZy5TeW5jTGV2ZWwgc3luY0xldmVsKSB7CisgICAgaWYgKHN5bmNMZXZlbCA9PSBVcGRhdGVMb2cuU3luY0xldmVsLk5PTkUpIHJldHVybjsKKyAgICB0cnkgeworICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgIGZvcy5mbHVzaEJ1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgLy8gd2UgbXVzdCBmbHVzaCB0byBoZGZzCisgICAgICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gaHN5bmMgYmVsb3cgaWYgd2UgZG8gdGhpcyAtIEkKKyAgICAgICAgLy8gdGhpbmsgdGhleSBhcmUgZXF1aXZhbGVudC4KKyAgICAgICAgdGxvZ091dFN0cmVhbS5oZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN5bmNMZXZlbCA9PSBVcGRhdGVMb2cuU3luY0xldmVsLkZTWU5DKSB7CisgICAgICAgIC8vIFNpbmNlIGZzeW5jIGlzIG91dHNpZGUgb2Ygc3luY2hyb25pemVkIGJsb2NrLCB3ZSBjYW4gZW5kIHVwIHdpdGggYSBwYXJ0aWFsCisgICAgICAgIC8vIGxhc3QgcmVjb3JkIG9uIHBvd2VyIGZhaWx1cmUgKHdoaWNoIGlzIE9LLCBhbmQgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVycm9yLi4uCisgICAgICAgIC8vIHdlIGp1c3QgbmVlZCB0byBiZSBhd2FyZSBvZiBpdCB3aGVuIHJlYWRpbmcpLgorICAgICAgICAKKyAgICAgICAgLy9yYWYuZ2V0RkQoKS5zeW5jKCk7CisgICAgICAgIHRsb2dPdXRTdHJlYW0uaHN5bmMoKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgZSk7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICBsb2cuZGVidWcoIkNsb3NpbmcgdGxvZyIgKyB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgIGZvcy5mbHVzaCgpOworICAgICAgICB0bG9nT3V0U3RyZWFtLmhmbHVzaCgpOworICAgICAgICBmb3MuY2xvc2UoKTsKKworICAgICAgICB0bG9nT3V0U3RyZWFtLmNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIGlmIChkZWxldGVPbkNsb3NlKSB7CisgICAgICAgIGZzLmRlbGV0ZSh0bG9nRmlsZSwgdHJ1ZSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiaGRmcyB0bG9ne2ZpbGU9IiArIHRsb2dGaWxlLnRvU3RyaW5nKCkgKyAiIHJlZmNvdW50PSIgKyByZWZjb3VudC5nZXQoKSArICJ9IjsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGEgcmVhZGVyIHRoYXQgY2FuIGJlIHVzZWQgd2hpbGUgYSBsb2cgaXMgc3RpbGwgaW4gdXNlLgorICAgKiBDdXJyZW50bHkgb25seSAqb25lKiBMb2dSZWFkZXIgbWF5IGJlIG91dHN0YW5kaW5nLCBhbmQgdGhhdCBsb2cgbWF5IG9ubHkKKyAgICogYmUgdXNlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4gKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMb2dSZWFkZXIgZ2V0UmVhZGVyKGxvbmcgc3RhcnRpbmdQb3MpIHsKKyAgICByZXR1cm4gbmV3IEhERlNMb2dSZWFkZXIoc3RhcnRpbmdQb3MpOworICB9CisKKyAgLyoqIFJldHVybnMgYSBzaW5nbGUgdGhyZWFkZWQgcmV2ZXJzZSByZWFkZXIgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXZlcnNlUmVhZGVyIGdldFJldmVyc2VSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgSERGU1JldmVyc2VSZWFkZXIoKTsKKyAgfQorCisKKyAgcHVibGljIGNsYXNzIEhERlNMb2dSZWFkZXIgZXh0ZW5kcyBMb2dSZWFkZXJ7CisgICAgRlNEYXRhRmFzdElucHV0U3RyZWFtIGZpczsKKyAgICBwcml2YXRlIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKKworICAgIHB1YmxpYyBIREZTTG9nUmVhZGVyKGxvbmcgc3RhcnRpbmdQb3MpIHsKKyAgICAgIHN1cGVyKCk7CisgICAgICBpbmNyZWYoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIEZTRGF0YUlucHV0U3RyZWFtIGZkaXMgPSBmcy5vcGVuKHRsb2dGaWxlKTsKKyAgICAgICAgZmlzID0gbmV3IEZTRGF0YUZhc3RJbnB1dFN0cmVhbShmZGlzLCBzdGFydGluZ1Bvcyk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBsb2csIG9yIG51bGwgaWYgbm9uZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsb2cgcmVjb3JkLCBvciBudWxsIGlmIEVPRgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBsb3ctbGV2ZWwgSS9PIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgbG9uZyBwb3MgPSBmaXMucG9zaXRpb24oKTsKKworCisgICAgICBzeW5jaHJvbml6ZWQgKEhkZnNUcmFuc2FjdGlvbkxvZy50aGlzKSB7CisgICAgICAgIGlmICh0cmFjZSkgeworICAgICAgICAgIGxvZy50cmFjZSgiUmVhZGluZyBsb2cgcmVjb3JkLiAgcG9zPSIrcG9zKyIgY3VycmVudFNpemU9Iitmb3Muc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3MgPj0gZm9zLnNpemUoKSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIGZvcy5mbHVzaEJ1ZmZlcigpOworICAgICAgICB0bG9nT3V0U3RyZWFtLmhmbHVzaCgpOworICAgICAgICAKKyAgICAgICAgLy8gd2UgYWN0dWFsbHkgbmVlZCBhIG5ldyByZWFkZXIKKyAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgRlNEYXRhSW5wdXRTdHJlYW0gZmRpcyA9IGZzLm9wZW4odGxvZ0ZpbGUpOworICAgICAgICAgIGZpcyA9IG5ldyBGU0RhdGFGYXN0SW5wdXRTdHJlYW0oZmRpcywgcG9zKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgfQorICAgICAgaWYgKHBvcyA9PSAwKSB7CisgICAgICAgIHJlYWRIZWFkZXIoZmlzKTsKKworICAgICAgICAvLyBzaG91bGRuJ3QgY3VycmVudGx5IGhhcHBlbiAtIGhlYWRlciBhbmQgZmlyc3QgcmVjb3JkIGFyZSBjdXJyZW50bHkgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIHN5bmNocm9uaXplZCAoSGRmc1RyYW5zYWN0aW9uTG9nLnRoaXMpIHsKKyAgICAgICAgICBpZiAoZmlzLnBvc2l0aW9uKCkgPj0gZm9zLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIHBvcyA9IGZpcy5wb3NpdGlvbigpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRsb2dPdXRTdHJlYW0uaGZsdXNoKCk7CisgICAgICBPYmplY3QgbyA9IGNvZGVjLnJlYWRWYWwoZmlzKTsKKworICAgICAgLy8gc2tpcCBvdmVyIHJlY29yZCBzaXplCisgICAgICBpbnQgc2l6ZSA9IGZpcy5yZWFkSW50KCk7CisgICAgICBhc3NlcnQgc2l6ZSA9PSBmaXMucG9zaXRpb24oKSAtIHBvcyAtIDQ7CisKKyAgICAgIHJldHVybiBvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgICAgZGVjcmVmKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoSGRmc1RyYW5zYWN0aW9uTG9nLnRoaXMpIHsKKyAgICAgICAgcmV0dXJuICJMb2dSZWFkZXJ7IiArICJmaWxlPSIgKyB0bG9nRmlsZSArICIsIHBvc2l0aW9uPSIgKyBmaXMucG9zaXRpb24oKSArICIsIGVuZD0iICsgZm9zLnNpemUoKSArICJ9IjsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBIREZTUmV2ZXJzZVJlYWRlciBleHRlbmRzIFJldmVyc2VSZWFkZXIgeworICAgIEZTRGF0YUZhc3RJbnB1dFN0cmVhbSBmaXM7CisgICAgcHJpdmF0ZSBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYyhyZXNvbHZlcikgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU29scklucHV0RG9jdW1lbnQgcmVhZFNvbHJJbnB1dERvY3VtZW50KERhdGFJbnB1dElucHV0U3RyZWFtIGRpcykgeworICAgICAgICAvLyBHaXZlbiB0aGF0IHRoZSBTb2xySW5wdXREb2N1bWVudCBpcyBsYXN0IGluIGFuIGFkZCByZWNvcmQsIGl0J3MgT0sgdG8ganVzdCBza2lwCisgICAgICAgIC8vIHJlYWRpbmcgaXQgY29tcGxldGVseS4KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfTsKKworICAgIGludCBuZXh0TGVuZ3RoOyAgLy8gbGVuZ3RoIG9mIHRoZSBuZXh0IHJlY29yZCAodGhlIG5leHQgb25lIGNsb3NlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxvZyBmaWxlKQorICAgIGxvbmcgcHJldlBvczsgICAgLy8gd2hlcmUgd2Ugc3RhcnRlZCByZWFkaW5nIGZyb20gbGFzdCB0aW1lIChzbyBwcmV2UG9zIC0gbmV4dExlbmd0aCA9PSBzdGFydCBvZiBuZXh0IHJlY29yZCkKKworICAgIHB1YmxpYyBIREZTUmV2ZXJzZVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpbmNyZWYoKTsKKworICAgICAgbG9uZyBzejsKKyAgICAgIHN5bmNocm9uaXplZCAoSGRmc1RyYW5zYWN0aW9uTG9nLnRoaXMpIHsKKyAgICAgICAgZm9zLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIAorICAgICAgICAvLyB0aGlzIG11c3QgYmUgYW4gaGZsdXNoCisgICAgICAgIHRsb2dPdXRTdHJlYW0uaGZsdXNoKCk7CisgICAgICAgIHN6ID0gZm9zLnNpemUoKTsKKyAgICAgICAgLy9hc3NlcnQgc3ogPT0gY2hhbm5lbC5zaXplKCk7CisgICAgICB9CisKKyAgICAgIGZpcyA9IG5ldyBGU0RhdGFGYXN0SW5wdXRTdHJlYW0oZnMub3Blbih0bG9nRmlsZSksIDApOworICAgICAgCisgICAgICBpZiAoc3ogPj00KSB7CisgICAgICAgIC8vIHJlYWRIZWFkZXIoZmlzKTsgIC8vIHNob3VsZCBub3QgYmUgbmVlZGVkCisgICAgICAgIHByZXZQb3MgPSBzeiAtIDQ7CisgICAgICAgIGZpcy5zZWVrKHByZXZQb3MpOworICAgICAgICBuZXh0TGVuZ3RoID0gZmlzLnJlYWRJbnQoKTsKKyAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBSZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBsb2csIG9yIG51bGwgaWYgbm9uZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsb2cgcmVjb3JkLCBvciBudWxsIGlmIEVPRgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBsb3ctbGV2ZWwgSS9PIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAocHJldlBvcyA8PSAwKSByZXR1cm4gbnVsbDsKKworICAgICAgbG9uZyBlbmRPZlRoaXNSZWNvcmQgPSBwcmV2UG9zOworCisgICAgICBpbnQgdGhpc0xlbmd0aCA9IG5leHRMZW5ndGg7CisKKyAgICAgIGxvbmcgcmVjb3JkU3RhcnQgPSBwcmV2UG9zIC0gdGhpc0xlbmd0aDsgIC8vIGJhY2sgdXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByZWNvcmQKKyAgICAgIHByZXZQb3MgPSByZWNvcmRTdGFydCAtIDQ7ICAvLyBiYWNrIHVwIDQgbW9yZSB0byByZWFkIHRoZSBsZW5ndGggb2YgdGhlIG5leHQgcmVjb3JkCisKKyAgICAgIGlmIChwcmV2UG9zIDw9IDApIHJldHVybiBudWxsOyAgLy8gdGhpcyByZWNvcmQgaXMgdGhlIGhlYWRlcgorCisgICAgICBsb25nIGJ1ZmZlclBvcyA9IGZpcy5nZXRCdWZmZXJQb3MoKTsKKyAgICAgIGlmIChwcmV2UG9zID49IGJ1ZmZlclBvcykgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvLi4uIHdlJ3JlIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBvc2l0aW9uIGJ1ZmZlciBzbyB0aGF0IHRoaXMgcmVjb3JkIGlzIGF0IHRoZSBlbmQuCisgICAgICAgIC8vIEZvciBzbWFsbCByZWNvcmRzLCB0aGlzIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBjYWxscyB0byBuZXh0KCkgdG8gYmUgd2l0aGluIHRoZSBidWZmZXIuCisgICAgICAgIGxvbmcgc2Vla1BvcyA9ICBlbmRPZlRoaXNSZWNvcmQgLSBmaXMuZ2V0QnVmZmVyU2l6ZSgpOworICAgICAgICBzZWVrUG9zID0gTWF0aC5taW4oc2Vla1BvcywgcHJldlBvcyk7IC8vIHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQgaWYgaXQncyBsYXJnZXIgdGhlbiB0aGUgYmxvY2sgc2l6ZS4KKyAgICAgICAgc2Vla1BvcyA9IE1hdGgubWF4KHNlZWtQb3MsIDApOworICAgICAgICBmaXMuc2VlayhzZWVrUG9zKTsKKyAgICAgICAgZmlzLnBlZWsoKTsgIC8vIGNhdXNlIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAgICAgIH0KKworICAgICAgZmlzLnNlZWsocHJldlBvcyk7CisgICAgICBuZXh0TGVuZ3RoID0gZmlzLnJlYWRJbnQoKTsgICAgIC8vIHRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgKm5leHQqIHJlY29yZCAoaS5lLiBjbG9zZXIgdG8gdGhlIGJlZ2lubmluZykKKworICAgICAgLy8gVE9ETzogb3B0aW9uYWxseSBza2lwIGRvY3VtZW50IGRhdGEKKyAgICAgIE9iamVjdCBvID0gY29kZWMucmVhZFZhbChmaXMpOworCisgICAgICAvLyBhc3NlcnQgZmlzLnBvc2l0aW9uKCkgPT0gcHJldlBvcyArIDQgKyB0aGlzTGVuZ3RoOyAgLy8gdGhpcyBpcyBvbmx5IHRydWUgaWYgd2UgcmVhZCBhbGwgdGhlIGRhdGEgKGFuZCB3ZSBjdXJyZW50bHkgc2tpcCByZWFkaW5nIFNvbHJJbnB1dERvY3VtZW50CisgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICAvKiByZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgbG9nIGZpbGUgb2YgdGhlIGxhc3QgcmVjb3JkIHJldHVybmVkIGJ5IG5leHQoKSAqLworICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKCkgeworICAgICAgcmV0dXJuIHByZXZQb3MgKyA0OyAgLy8gc2tpcCB0aGUgbGVuZ3RoCisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICB0cnkgeworICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgICBkZWNyZWYoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgc3luY2hyb25pemVkIChIZGZzVHJhbnNhY3Rpb25Mb2cudGhpcykgeworICAgICAgICByZXR1cm4gIkxvZ1JlYWRlcnsiICsgImZpbGU9IiArIHRsb2dGaWxlICsgIiwgcG9zaXRpb249IiArIGZpcy5wb3NpdGlvbigpICsgIiwgZW5kPSIgKyBmb3Muc2l6ZSgpICsgIn0iOworICAgICAgfQorICAgIH0KKworCisgIH0KKworfQorCisKKworY2xhc3MgRlNEYXRhRmFzdElucHV0U3RyZWFtIGV4dGVuZHMgRmFzdElucHV0U3RyZWFtIHsKKyAgcHJpdmF0ZSBGU0RhdGFJbnB1dFN0cmVhbSBmaXM7CisKKyAgcHVibGljIEZTRGF0YUZhc3RJbnB1dFN0cmVhbShGU0RhdGFJbnB1dFN0cmVhbSBmaXMsIGxvbmcgY2hQb3NpdGlvbikgeworICAgIC8vIHN1cGVyKG51bGwsIG5ldyBieXRlWzEwXSwwLDApOyAgICAvLyBhIHNtYWxsIGJ1ZmZlciBzaXplIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgc3VwZXIobnVsbCk7CisgICAgdGhpcy5maXMgPSBmaXM7CisgICAgc3VwZXIucmVhZEZyb21TdHJlYW0gPSBjaFBvc2l0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZFdyYXBwZWRTdHJlYW0oYnl0ZVtdIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZmlzLnJlYWQocmVhZEZyb21TdHJlYW0sIHRhcmdldCwgb2Zmc2V0LCBsZW4pOworICB9CisKKyAgcHVibGljIHZvaWQgc2Vlayhsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChwb3NpdGlvbiA8PSByZWFkRnJvbVN0cmVhbSAmJiBwb3NpdGlvbiA+PSBnZXRCdWZmZXJQb3MoKSkgeworICAgICAgLy8gc2VlayB3aXRoaW4gYnVmZmVyCisgICAgICBwb3MgPSAoaW50KShwb3NpdGlvbiAtIGdldEJ1ZmZlclBvcygpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbG9uZyBjdXJyU2l6ZSA9IGNoLnNpemUoKTsgICAvLyBub3QgbmVlZGVkIC0gdW5kZXJseWluZyByZWFkIHNob3VsZCBoYW5kbGUgKHVubGVzcyByZWFkIG5ldmVyIGRvbmUpCisgICAgICAvLyBpZiAocG9zaXRpb24gPiBjdXJyU2l6ZSkgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigiUmVhZCBwYXN0IEVPRjogc2Vla2luZyB0byAiICsgcG9zaXRpb24gKyAiIG9uIGZpbGUgb2Ygc2l6ZSAiICsgY3VyclNpemUgKyAiIGZpbGU9IiArIGNoKTsKKyAgICAgIHJlYWRGcm9tU3RyZWFtID0gcG9zaXRpb247CisgICAgICBlbmQgPSBwb3MgPSAwOworICAgIH0KKyAgICBhc3NlcnQgcG9zaXRpb24oKSA9PSBwb3NpdGlvbjsKKyAgfQorCisgIC8qKiB3aGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgd2hvbGUgZmlsZSAqLworICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJQb3MoKSB7CisgICAgcmV0dXJuIHJlYWRGcm9tU3RyZWFtIC0gZW5kOworICB9CisKKyAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgIHJldHVybiBidWYubGVuZ3RoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaXMuY2xvc2UoKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJyZWFkRnJvbVN0cmVhbT0iK3JlYWRGcm9tU3RyZWFtICsiIHBvcz0iK3BvcyArIiBlbmQ9IitlbmQgKyAiIGJ1ZmZlclBvcz0iK2dldEJ1ZmZlclBvcygpICsgIiBwb3NpdGlvbj0iK3Bvc2l0aW9uKCkgOworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvSGRmc1VwZGF0ZUxvZy5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvSGRmc1VwZGF0ZUxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDljODUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9IZGZzVXBkYXRlTG9nLmphdmEKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51cGRhdGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkJ5dGVzUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb24uRXJyb3JDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlBsdWdpbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuSGRmc1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuSU9VdGlsczsKKworLyoqIEBsdWNlbmUuZXhwZXJpbWVudGFsICovCitwdWJsaWMgY2xhc3MgSGRmc1VwZGF0ZUxvZyBleHRlbmRzIFVwZGF0ZUxvZyB7CisgIAorICBwcml2YXRlIEZpbGVTeXN0ZW0gZnM7CisgIHByaXZhdGUgUGF0aCB0bG9nRGlyOworICBwcml2YXRlIFN0cmluZyBjb25mRGlyOworCisgIHB1YmxpYyBIZGZzVXBkYXRlTG9nKCkgeworICAgIAorICB9CisgIAorICBwdWJsaWMgSGRmc1VwZGF0ZUxvZyhTdHJpbmcgY29uZkRpcikgeworICAgIHRoaXMuY29uZkRpciA9IGNvbmZEaXI7CisgIH0KKyAgCisgIHB1YmxpYyBGaWxlU3lzdGVtIGdldEZzKCkgeworICAgIHJldHVybiBmczsKKyAgfQorICAKKyAgLy8gSEFDSworICAvLyB3aGlsZSB3YWl0aW5nIGZvciBIREZTLTMxMDcsIGluc3RlYWQgb2YgcXVpY2tseQorICAvLyBkcm9wcGluZywgd2Ugc2xvd2x5IGFwcGx5CisgIC8vIFRoaXMgaXMgc29tZXdoYXQgYnJpdHRsZSwgYnV0IGN1cnJlbnQgdXNhZ2UKKyAgLy8gYWxsb3dzIGZvciBpdAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZHJvcEJ1ZmZlcmVkVXBkYXRlcygpIHsKKyAgICBGdXR1cmU8UmVjb3ZlcnlJbmZvPiBmdXR1cmUgPSBhcHBseUJ1ZmZlcmVkVXBkYXRlcygpOworICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZnV0dXJlLmdldCgpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoUGx1Z2luSW5mbyBpbmZvKSB7CisgICAgZGF0YURpciA9IChTdHJpbmcpIGluZm8uaW5pdEFyZ3MuZ2V0KCJkaXIiKTsKKyAgICAKKyAgICBkZWZhdWx0U3luY0xldmVsID0gU3luY0xldmVsLmdldFN5bmNMZXZlbCgoU3RyaW5nKSBpbmZvLmluaXRBcmdzCisgICAgICAgIC5nZXQoInN5bmNMZXZlbCIpKTsKKyAgICAKKyAgfQorCisgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBnZXRDb25mKCkgeworICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgaWYgKGNvbmZEaXIgIT0gbnVsbCkgeworICAgICAgSGRmc1V0aWwuYWRkSGRmc1Jlc291cmNlcyhjb25mLCBjb25mRGlyKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGNvbmY7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0KFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXIsIFNvbHJDb3JlIGNvcmUpIHsKKyAgICAKKyAgICAvLyB1bG9nRGlyIGZyb20gQ29yZURlc2NyaXB0b3Igb3ZlcnJpZGVzCisgICAgU3RyaW5nIHVsb2dEaXIgPSBjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0VWxvZ0RpcigpOworCisgICAgaWYgKHVsb2dEaXIgIT0gbnVsbCkgeworICAgICAgZGF0YURpciA9IHVsb2dEaXI7CisgICAgfQorICAgIGlmIChkYXRhRGlyID09IG51bGwgfHwgZGF0YURpci5sZW5ndGgoKT09MCkgeworICAgICAgZGF0YURpciA9IGNvcmUuZ2V0RGF0YURpcigpOworICAgIH0KKyAgICAKKyAgICBpZiAoIWNvcmUuZ2V0RGlyZWN0b3J5RmFjdG9yeSgpLmlzQWJzb2x1dGUoZGF0YURpcikpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGFEaXIgPSBjb3JlLmdldERpcmVjdG9yeUZhY3RvcnkoKS5nZXREYXRhSG9tZShjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZShuZXcgUGF0aChkYXRhRGlyKS50b1VyaSgpLCBnZXRDb25mKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsIGUpOworICAgIH0KKyAgICAKKyAgICB0aGlzLnVoYW5kbGVyID0gdWhhbmRsZXI7CisgICAgCisgICAgaWYgKGRhdGFEaXIuZXF1YWxzKGxhc3REYXRhRGlyKSkgeworICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiVXBkYXRlSGFuZGxlciBpbml0OiB0bG9nRGlyPSIgKyB0bG9nRGlyICsgIiwgbmV4dCBpZD0iICsgaWQsCisgICAgICAgICAgICAiIHRoaXMgaXMgYSByZW9wZW4uLi4gbm90aGluZyBlbHNlIHRvIGRvLiIpOworICAgICAgfQorICAgICAgCisgICAgICB2ZXJzaW9uSW5mby5yZWxvYWQoKTsKKyAgICAgIAorICAgICAgLy8gb24gYSBub3JtYWwgcmVvcGVuLCB3ZSBjdXJyZW50bHkgc2hvdWxkbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbGFzdERhdGFEaXIgPSBkYXRhRGlyOworICAgIHRsb2dEaXIgPSBuZXcgUGF0aChkYXRhRGlyLCBUTE9HX05BTUUpOworICAgIAorICAgIHRyeSB7CisgICAgICBpZiAoIWZzLmV4aXN0cyh0bG9nRGlyKSkgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmcy5ta2RpcnModGxvZ0Rpcik7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeToiICsgdGxvZ0Rpcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgCisgICAgdGxvZ0ZpbGVzID0gZ2V0TG9nTGlzdChmcywgdGxvZ0Rpcik7CisgICAgaWQgPSBnZXRMYXN0TG9nSWQoKSArIDE7IC8vIGFkZCAxIHNpbmNlIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGxvZyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgdXBkYXRlCisgICAgCisgICAgaWYgKGRlYnVnKSB7CisgICAgICBsb2cuZGVidWcoIlVwZGF0ZUhhbmRsZXIgaW5pdDogdGxvZ0Rpcj0iICsgdGxvZ0RpciArICIsIGV4aXN0aW5nIHRsb2dzPSIKKyAgICAgICAgICArIEFycmF5cy5hc0xpc3QodGxvZ0ZpbGVzKSArICIsIG5leHQgaWQ9IiArIGlkKTsKKyAgICB9CisgICAgCisgICAgVHJhbnNhY3Rpb25Mb2cgb2xkTG9nID0gbnVsbDsKKyAgICBmb3IgKFN0cmluZyBvbGRMb2dOYW1lIDogdGxvZ0ZpbGVzKSB7CisgICAgICBQYXRoIGYgPSBuZXcgUGF0aCh0bG9nRGlyLCBvbGRMb2dOYW1lKTsKKyAgICAgIHRyeSB7CisgICAgICAgIG9sZExvZyA9IG5ldyBIZGZzVHJhbnNhY3Rpb25Mb2coZnMsIGYsIG51bGwsIHRydWUpOworICAgICAgICBhZGRPbGRMb2cob2xkTG9nLCBmYWxzZSk7IC8vIGRvbid0IHJlbW92ZSBvbGQgbG9ncyBvbiBzdGFydHVwIHNpbmNlIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIG9uZSBtYXkgYmUgdW5jYXBwZWQuCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTb2xyRXhjZXB0aW9uLmxvZyhsb2csICJGYWlsdXJlIHRvIG9wZW4gZXhpc3RpbmcgbG9nIGZpbGUgKG5vbiBmYXRhbCkgIgorICAgICAgICAgICAgKyBmLCBlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmcy5kZWxldGUoZiwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBSZWNvcmQgZmlyc3QgdHdvIGxvZ3MgKG9sZGVzdCBmaXJzdCkgYXQgc3RhcnR1cCBmb3IgcG90ZW50aWFsIHRsb2cKKyAgICAvLyByZWNvdmVyeS4KKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgYXQgYWJub3JtYWwgc2h1dGRvd24gYm90aCAidGxvZyIgYW5kICJwcmV2VGxvZyIgd2VyZQorICAgIC8vIHVuY2FwcGVkLgorICAgIGZvciAoVHJhbnNhY3Rpb25Mb2cgbGwgOiBsb2dzKSB7CisgICAgICBuZXdlc3RMb2dzT25TdGFydHVwLmFkZEZpcnN0KGxsKTsKKyAgICAgIGlmIChuZXdlc3RMb2dzT25TdGFydHVwLnNpemUoKSA+PSAyKSBicmVhazsKKyAgICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgIHZlcnNpb25JbmZvID0gbmV3IFZlcnNpb25JbmZvKHRoaXMsIDI1Nik7CisgICAgfSBjYXRjaCAoU29sckV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byB1c2UgdXBkYXRlTG9nOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLAorICAgICAgICAgICJVbmFibGUgdG8gdXNlIHVwZGF0ZUxvZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9CisgICAgCisgICAgLy8gVE9ETzogdGhlc2Ugc3RhcnRpbmdWZXJzaW9ucyBhc3N1bWUgdGhhdCB3ZSBzdWNjZXNzZnVsbHkgcmVjb3ZlciBmcm9tIGFsbAorICAgIC8vIG5vbi1jb21wbGV0ZSB0bG9ncy4KKyAgICBIZGZzVXBkYXRlTG9nLlJlY2VudFVwZGF0ZXMgc3RhcnRpbmdVcGRhdGVzID0gZ2V0UmVjZW50VXBkYXRlcygpOworICAgIHRyeSB7CisgICAgICBzdGFydGluZ1ZlcnNpb25zID0gc3RhcnRpbmdVcGRhdGVzLmdldFZlcnNpb25zKG51bVJlY29yZHNUb0tlZXApOworICAgICAgc3RhcnRpbmdPcGVyYXRpb24gPSBzdGFydGluZ1VwZGF0ZXMuZ2V0TGF0ZXN0T3BlcmF0aW9uKCk7CisgICAgICAKKyAgICAgIC8vIHBvcHVsYXRlIHJlY2VudCBkZWxldGVzIGxpc3QgKHNpbmNlIHdlIGNhbid0IGdldCB0aGF0IGluZm8gZnJvbSB0aGUKKyAgICAgIC8vIGluZGV4KQorICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0aW5nVXBkYXRlcy5kZWxldGVMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIERlbGV0ZVVwZGF0ZSBkdSA9IHN0YXJ0aW5nVXBkYXRlcy5kZWxldGVMaXN0LmdldChpKTsKKyAgICAgICAgb2xkRGVsZXRlcy5wdXQobmV3IEJ5dGVzUmVmKGR1LmlkKSwgbmV3IExvZ1B0cigtMSwgZHUudmVyc2lvbikpOworICAgICAgfQorICAgICAgCisgICAgICAvLyBwb3B1bGF0ZSByZWNlbnQgZGVsZXRlQnlRdWVyeSBjb21tYW5kcworICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0aW5nVXBkYXRlcy5kZWxldGVCeVF1ZXJ5TGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBVcGRhdGUgdXBkYXRlID0gc3RhcnRpbmdVcGRhdGVzLmRlbGV0ZUJ5UXVlcnlMaXN0LmdldChpKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGRicSA9IChMaXN0PE9iamVjdD4pIHVwZGF0ZS5sb2cubG9va3VwKHVwZGF0ZS5wb2ludGVyKTsKKyAgICAgICAgbG9uZyB2ZXJzaW9uID0gKExvbmcpIGRicS5nZXQoMSk7CisgICAgICAgIFN0cmluZyBxID0gKFN0cmluZykgZGJxLmdldCgyKTsKKyAgICAgICAgdHJhY2tEZWxldGVCeVF1ZXJ5KHEsIHZlcnNpb24pOworICAgICAgfQorICAgICAgCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHN0YXJ0aW5nVXBkYXRlcy5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nRGlyKCkgeworICAgIHJldHVybiB0bG9nRGlyLnRvVXJpKCkudG9TdHJpbmcoKTsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRMb2dMaXN0KEZpbGVTeXN0ZW0gZnMsIFBhdGggdGxvZ0RpcikgeworICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBUTE9HX05BTUUgKyAnLic7CisgICAgYXNzZXJ0IGZzICE9IG51bGw7CisgICAgRmlsZVN0YXR1c1tdIGZpbGVTdGF0dXNlczsKKyAgICB0cnkgeworICAgICAgZmlsZVN0YXR1c2VzID0gZnMubGlzdFN0YXR1cyh0bG9nRGlyLCBuZXcgUGF0aEZpbHRlcigpIHsKKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUGF0aCBwYXRoKSB7CisgICAgICAgICAgcmV0dXJuIHBhdGguZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KKyAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbZmlsZVN0YXR1c2VzLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIG5hbWVzW2ldID0gZmlsZVN0YXR1c2VzW2ldLmdldFBhdGgoKS5nZXROYW1lKCk7CisgICAgfQorICAgIEFycmF5cy5zb3J0KG5hbWVzKTsKKworICAgIHJldHVybiBuYW1lczsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKGJvb2xlYW4gY29tbWl0dGVkKSB7CisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICBzdXBlci5jbG9zZShjb21taXR0ZWQpOworICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoZnMpOworICAgIH0KKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGVuc3VyZUxvZygpIHsKKyAgICBpZiAodGxvZyA9PSBudWxsKSB7CisgICAgICBTdHJpbmcgbmV3TG9nTmFtZSA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlJPT1QsIExPR19GSUxFTkFNRV9QQVRURVJOLAorICAgICAgICAgIFRMT0dfTkFNRSwgaWQpOworICAgICAgdGxvZyA9IG5ldyBIZGZzVHJhbnNhY3Rpb25Mb2coZnMsIG5ldyBQYXRoKHRsb2dEaXIsIG5ld0xvZ05hbWUpLAorICAgICAgICAgIGdsb2JhbFN0cmluZ3MpOworICAgIH0KKyAgfQorICAKKyAgLyoqCisgICAqIENsZWFycyB0aGUgbG9ncyBvbiB0aGUgZmlsZSBzeXN0ZW0uIE9ubHkgY2FsbCBiZWZvcmUgaW5pdC4KKyAgICogCisgICAqIEBwYXJhbSBjb3JlIHRoZSBTb2xyQ29yZQorICAgKiBAcGFyYW0gdWxvZ1BsdWdpbkluZm8gdGhlIGluaXQgaW5mbyBmb3IgdGhlIFVwZGF0ZUhhbmRsZXIKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhckxvZyhTb2xyQ29yZSBjb3JlLCBQbHVnaW5JbmZvIHVsb2dQbHVnaW5JbmZvKSB7CisgICAgaWYgKHVsb2dQbHVnaW5JbmZvID09IG51bGwpIHJldHVybjsKKyAgICBQYXRoIHRsb2dEaXIgPSBuZXcgUGF0aChnZXRUbG9nRGlyKGNvcmUsIHVsb2dQbHVnaW5JbmZvKSk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChmcy5leGlzdHModGxvZ0RpcikpIHsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBnZXRMb2dMaXN0KHRsb2dEaXIpOworICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICBQYXRoIGYgPSBuZXcgUGF0aCh0bG9nRGlyLCBmaWxlKTsKKyAgICAgICAgICBib29sZWFuIHMgPSBmcy5kZWxldGUoZiwgZmFsc2UpOworICAgICAgICAgIGlmICghcykgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3QgcmVtb3ZlIHRsb2cgZmlsZToiICsgZik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIFN0cmluZ1tdIGdldExvZ0xpc3QoUGF0aCB0bG9nRGlyKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IFRMT0dfTkFNRSsnLic7CisgICAgRmlsZVN0YXR1c1tdIGZpbGVzID0gZnMubGlzdFN0YXR1cyh0bG9nRGlyLCBuZXcgUGF0aEZpbHRlcigpIHsKKyAgICAgIAorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUGF0aCBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCk7CisgICAgICB9CisgICAgfSk7CisgICAgTGlzdDxTdHJpbmc+IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGZpbGVzLmxlbmd0aCk7CisgICAgZm9yIChGaWxlU3RhdHVzIGZpbGUgOiBmaWxlcykgeworICAgICAgZmlsZUxpc3QuYWRkKGZpbGUuZ2V0UGF0aCgpLmdldE5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiBmaWxlTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIGFibGUgdG8gZHJvcCBidWZmZXJlZCB1cGRhdGVzIGFuZCByZXR1cm4gdG8gdGhlCisgICAqIEFDVElWRSBzdGF0ZQorICAgKi8KKyAgLy8gcHVibGljIGJvb2xlYW4gZHJvcEJ1ZmZlcmVkVXBkYXRlcygpIHsKKyAgLy8gdmVyc2lvbkluZm8uYmxvY2tVcGRhdGVzKCk7CisgIC8vIHRyeSB7CisgIC8vIGlmIChzdGF0ZSAhPSBTdGF0ZS5CVUZGRVJJTkcpIHJldHVybiBmYWxzZTsKKyAgLy8KKyAgLy8gaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgLy8gbG9nLmluZm8oIkRyb3BwaW5nIGJ1ZmZlcmVkIHVwZGF0ZXMgIiArIHRoaXMpOworICAvLyB9CisgIC8vCisgIC8vIC8vIHNpbmNlIHdlIGJsb2NrZWQgdXBkYXRlcywgdGhpcyBzeW5jaHJvbml6YXRpb24gc2hvdWxkbid0IHN0cmljdGx5IGJlCisgIC8vIG5lY2Vzc2FyeS4KKyAgLy8gc3luY2hyb25pemVkICh0aGlzKSB7CisgIC8vIGlmICh0bG9nICE9IG51bGwpIHsKKyAgLy8gdGxvZy5yb2xsYmFjayhyZWNvdmVyeUluZm8ucG9zaXRpb25PZlN0YXJ0KTsKKyAgLy8gfQorICAvLyB9CisgIC8vCisgIC8vIHN0YXRlID0gU3RhdGUuQUNUSVZFOworICAvLyBvcGVyYXRpb25GbGFncyAmPSB+RkxBR19HQVA7CisgIC8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgLy8gU29sckV4Y2VwdGlvbi5sb2cobG9nLCJFcnJvciBhdHRlbXB0aW5nIHRvIHJvbGwgYmFjayBsb2ciLCBlKTsKKyAgLy8gcmV0dXJuIGZhbHNlOworICAvLyB9CisgIC8vIGZpbmFsbHkgeworICAvLyB2ZXJzaW9uSW5mby51bmJsb2NrVXBkYXRlcygpOworICAvLyB9CisgIC8vIHJldHVybiB0cnVlOworICAvLyB9CisgIAorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiSERGU1VwZGF0ZUxvZ3tzdGF0ZT0iICsgZ2V0U3RhdGUoKSArICIsIHRsb2c9IiArIHRsb2cgKyAifSI7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Mb2dnaW5nSW5mb1N0cmVhbS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvTG9nZ2luZ0luZm9TdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzEwYzBhCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvTG9nZ2luZ0luZm9TdHJlYW0uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JbmZvU3RyZWFtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEFuIHtAbGluayBJbmZvU3RyZWFtfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBwYXNzZXMgbWVzc2FnZXMgb24gdG8gU29scidzIGxvZ2dpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnaW5nSW5mb1N0cmVhbSBleHRlbmRzIEluZm9TdHJlYW0geworICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2dnaW5nSW5mb1N0cmVhbS5jbGFzcyk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIGNvbXBvbmVudCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBsb2cuaW5mbygiWyIgKyBjb21wb25lbnQgKyAiXVsiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiXTogIiArIG1lc3NhZ2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgY29tcG9uZW50KSB7CisgICAgLy8gaWdub3JlIHRlc3Rwb2ludHMgc28gdGhpcyBjYW4gYmUgdXNlZCB3aXRoIHRlc3RzIHdpdGhvdXQgZmxvb2RpbmcgbG9ncyB3aXRoIHZlcmJvc2UgbWVzc2FnZXMKKyAgICByZXR1cm4gISJUUCIuZXF1YWxzKGNvbXBvbmVudCkgJiYgbG9nLmlzSW5mb0VuYWJsZWQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvU29sckNtZERpc3RyaWJ1dG9yLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xyQ21kRGlzdHJpYnV0b3IuamF2YQppbmRleCA2YmVjNmQ0Li43NjY3NTVjIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xyQ21kRGlzdHJpYnV0b3IuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xyQ21kRGlzdHJpYnV0b3IuamF2YQpAQCAtMTE0LDExICsxMTQsMTEgQEAKICAgICAKICAgICAvLyBtYWtlIHN1cmUgYW55IHBlbmRpbmcgZGVsZXRlcyBhcmUgZmx1c2hlZAogICAgIGZsdXNoRGVsZXRlcygxKTsKLSAgICAKKwogICAgIC8vIFRPRE86IHRoaXMgaXMgYnJpdHRsZQogICAgIC8vIG5lZWQgdG8gbWFrZSBhIGNsb25lIHNpbmNlIHRoZXNlIGNvbW1hbmRzIG1heSBiZSByZXVzZWQKICAgICBBZGRVcGRhdGVDb21tYW5kIGNsb25lID0gbmV3IEFkZFVwZGF0ZUNvbW1hbmQobnVsbCk7Ci0gICAgCisKICAgICBjbG9uZS5zb2xyRG9jID0gY21kLnNvbHJEb2M7CiAgICAgY2xvbmUuY29tbWl0V2l0aGluID0gY21kLmNvbW1pdFdpdGhpbjsKICAgICBjbG9uZS5vdmVyd3JpdGUgPSBjbWQub3ZlcndyaXRlOwpAQCAtMTM1LDEwICsxMzUsNzkgQEAKICAgICAgIH0KICAgICAgIGFsaXN0LmFkZChhZGRSZXF1ZXN0KTsKICAgICB9Ci0gICAgCisKICAgICBmbHVzaEFkZHMobWF4QnVmZmVyZWRBZGRzUGVyU2VydmVyKTsKICAgfQotICAKKworICAvKioKKyAgICogU3luY2hyb25vdXMgKGJsb2NraW5nKSBhZGQgdG8gc3BlY2lmaWVkIG5vZGUuIEFueSBlcnJvciByZXR1cm5lZCBmcm9tIG5vZGUgaXMgcHJvcGFnYXRlZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN5bmNBZGQoQWRkVXBkYXRlQ29tbWFuZCBjbWQsIE5vZGUgbm9kZSwgTW9kaWZpYWJsZVNvbHJQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvZy5pbmZvKCJTWU5DQUREIG9uIHt9IDoge30iLCBub2RlLCBjbWQuZ2V0UHJpbnRhYmxlSWQoKSk7CisgICAgY2hlY2tSZXNwb25zZXMoZmFsc2UpOworICAgIC8vIGZsdXNoIGFsbCBwZW5kaW5nIGRlbGV0ZXMKKyAgICBmbHVzaERlbGV0ZXMoMSk7CisgICAgLy8gZmx1c2ggYWxsIHBlbmRpbmcgYWRkcworICAgIGZsdXNoQWRkcygxKTsKKyAgICAvLyBmaW5pc2ggd2l0aCB0aGUgcGVuZGluZyByZXF1ZXN0cworICAgIGNoZWNrUmVzcG9uc2VzKGZhbHNlKTsKKworICAgIFVwZGF0ZVJlcXVlc3RFeHQgdXJlcSA9IG5ldyBVcGRhdGVSZXF1ZXN0RXh0KCk7CisgICAgdXJlcS5hZGQoY21kLnNvbHJEb2MsIGNtZC5jb21taXRXaXRoaW4sIGNtZC5vdmVyd3JpdGUpOworICAgIHVyZXEuc2V0UGFyYW1zKHBhcmFtcyk7CisgICAgc3luY1JlcXVlc3Qobm9kZSwgdXJlcSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzeW5jRGVsZXRlKERlbGV0ZVVwZGF0ZUNvbW1hbmQgY21kLCBMaXN0PE5vZGU+IG5vZGVzLCBNb2RpZmlhYmxlU29sclBhcmFtcyBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9nLmluZm8oIlNZTkNERUxFVEUgb24ge30gOiAiLCBub2RlcywgY21kKTsKKyAgICBjaGVja1Jlc3BvbnNlcyhmYWxzZSk7CisgICAgLy8gZmx1c2ggYWxsIHBlbmRpbmcgYWRkcworICAgIGZsdXNoQWRkcygxKTsKKyAgICAvLyBmbHVzaCBhbGwgcGVuZGluZyBkZWxldGVzCisgICAgZmx1c2hEZWxldGVzKDEpOworICAgIC8vIGZpbmlzaCBwZW5kaW5nIHJlcXVlc3RzCisgICAgY2hlY2tSZXNwb25zZXMoZmFsc2UpOworCisgICAgRGVsZXRlVXBkYXRlQ29tbWFuZCBjbG9uZWRDbWQgPSBjbG9uZShjbWQpOworICAgIERlbGV0ZVJlcXVlc3QgZGVsZXRlUmVxdWVzdCA9IG5ldyBEZWxldGVSZXF1ZXN0KCk7CisgICAgZGVsZXRlUmVxdWVzdC5jbWQgPSBjbG9uZWRDbWQ7CisgICAgZGVsZXRlUmVxdWVzdC5wYXJhbXMgPSBwYXJhbXM7CisKKyAgICBVcGRhdGVSZXF1ZXN0RXh0IHVyZXEgPSBuZXcgVXBkYXRlUmVxdWVzdEV4dCgpOworICAgIGlmIChjbWQuaXNEZWxldGVCeUlkKCkpIHsKKyAgICAgIHVyZXEuZGVsZXRlQnlJZChjbWQuZ2V0SWQoKSwgY21kLmdldFZlcnNpb24oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVyZXEuZGVsZXRlQnlRdWVyeShjbWQucXVlcnkpOworICAgIH0KKyAgICB1cmVxLnNldFBhcmFtcyhwYXJhbXMpOworICAgIGZvciAoTm9kZSBub2RlIDogbm9kZXMpIHsKKyAgICAgIHN5bmNSZXF1ZXN0KG5vZGUsIHVyZXEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzeW5jUmVxdWVzdChOb2RlIG5vZGUsIFVwZGF0ZVJlcXVlc3RFeHQgdXJlcSkgeworICAgIFJlcXVlc3Qgc3JlcSA9IG5ldyBSZXF1ZXN0KCk7CisgICAgc3JlcS5ub2RlID0gbm9kZTsKKyAgICBzcmVxLnVyZXEgPSB1cmVxOworCisgICAgU3RyaW5nIHVybCA9IG5vZGUuZ2V0VXJsKCk7CisgICAgU3RyaW5nIGZ1bGxVcmw7CisgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgiaHR0cDovLyIpICYmICF1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSkgeworICAgICAgZnVsbFVybCA9ICJodHRwOi8vIiArIHVybDsKKyAgICB9IGVsc2UgeworICAgICAgZnVsbFVybCA9IHVybDsKKyAgICB9CisKKyAgICBIdHRwU29sclNlcnZlciBzZXJ2ZXIgPSBuZXcgSHR0cFNvbHJTZXJ2ZXIoZnVsbFVybCwKKyAgICAgICAgdXBkYXRlU2hhcmRIYW5kbGVyLmdldEh0dHBDbGllbnQoKSk7CisKKyAgICB0cnkgeworICAgICAgc3JlcS51cnNwID0gc2VydmVyLnJlcXVlc3QodXJlcSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsICJGYWlsZWQgc3luY2hyb25vdXMgdXBkYXRlIG9uIHNoYXJkICIgKyBzcmVxLm5vZGUsIHNyZXEuZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgdm9pZCBkaXN0cmliQ29tbWl0KENvbW1pdFVwZGF0ZUNvbW1hbmQgY21kLCBMaXN0PE5vZGU+IG5vZGVzLAogICAgICAgTW9kaWZpYWJsZVNvbHJQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvU29sckNvcmVTdGF0ZS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvU29sckNvcmVTdGF0ZS5qYXZhCmluZGV4IGNhZDg2NzEuLjU0NjRkMjggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1NvbHJDb3JlU3RhdGUuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xyQ29yZVN0YXRlLmphdmEKQEAgLTg4LDYgKzg4LDI2IEBACiAgICAqLwogICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBuZXdJbmRleFdyaXRlcihTb2xyQ29yZSBjb3JlLCBib29sZWFuIHJvbGxiYWNrKSB0aHJvd3MgSU9FeGNlcHRpb247CiAgIAorICAKKyAgLyoqCisgICAqIEV4cGVydCBtZXRob2QgdGhhdCBjbG9zZXMgdGhlIEluZGV4V3JpdGVyIC0geW91IG11c3QgY2FsbCB7QGxpbmsgI29wZW5JbmRleFdyaXRlcihTb2xyQ29yZSl9CisgICAqIGluIGEgZmluYWxseSBibG9jayBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgKiAKKyAgICogQHBhcmFtIGNvcmUgdGhhdCB0aGUgSVcgYmVsb25ncyB0bworICAgKiBAcGFyYW0gcm9sbGJhY2sgdHJ1ZSBpZiBJVyBzaG91bGQgcm9sbGJhY2sgcmF0aGVyIHRoYW4gY2xvc2UKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhIGxvdy1sZXZlbCBJL08gZXJyb3IuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZUluZGV4V3JpdGVyKFNvbHJDb3JlIGNvcmUsIGJvb2xlYW4gcm9sbGJhY2spIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgCisgIC8qKgorICAgKiBFeHBlcnQgbWV0aG9kIHRoYXQgb3BlbnMgdGhlIEluZGV4V3JpdGVyIC0geW91IG11c3QgY2FsbCB7QGxpbmsgI2Nsb3NlSW5kZXhXcml0ZXIoU29sckNvcmUsIGJvb2xlYW4pfQorICAgKiBmaXJzdCwgYW5kIHRoZW4gY2FsbCB0aGlzIG1ldGhvZCBpbiBhIGZpbmFsbHkgYmxvY2suCisgICAqIAorICAgKiBAcGFyYW0gY29yZSB0aGF0IHRoZSBJVyBiZWxvbmdzIHRvCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBsb3ctbGV2ZWwgSS9PIGVycm9yLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbkluZGV4V3JpdGVyKFNvbHJDb3JlIGNvcmUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgCiAgIC8qKgogICAgKiBHZXQgdGhlIGN1cnJlbnQgSW5kZXhXcml0ZXIuIElmIGEgbmV3IEluZGV4V3JpdGVyIG11c3QgYmUgY3JlYXRlZCwgdXNlIHRoZQogICAgKiBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgU29sckNvcmV9LgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvU29sckluZGV4Q29uZmlnLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhDb25maWcuamF2YQppbmRleCA2YmViN2I0Li42YzMxNTVjIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhDb25maWcuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhDb25maWcuamF2YQpAQCAtMTcsMTIgKzE3LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguKjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlci5JbmRleFJlYWRlcldhcm1lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkluZm9TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5QcmludFN0cmVhbUluZm9TdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb24uRXJyb3JDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5QbHVnaW5JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuSW5kZXhTY2hlbWE7CkBAIC0zMCw2ICszMywxMCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgpAQCAtNDMsNyArNTAsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVJHRV9TQ0hFRFVMRVJfQ0xBU1NOQU1FID0gQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyLmNsYXNzLmdldE5hbWUoKTsKICAgcHVibGljIGZpbmFsIFZlcnNpb24gbHVjZW5lVmVyc2lvbjsKICAgCisgIC8qKgorICAgKiBUaGUgZXhwbGljaXQgdmFsdWUgb2YgJmx0O3VzZUNvbXBvdW5kRmlsZSZndDsgc3BlY2lmaWVkIG9uIHRoaXMgaW5kZXggY29uZmlnCisgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFVzZUNvbXBvdW5kRmlsZX0KKyAgICovCisgIEBEZXByZWNhdGVkCiAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHVzZUNvbXBvdW5kRmlsZTsKKyAgcHJpdmF0ZSBib29sZWFuIGVmZmVjdGl2ZVVzZUNvbXBvdW50RmlsZVNldHRpbmc7CisKICAgcHVibGljIGZpbmFsIGludCBtYXhCdWZmZXJlZERvY3M7CiAgIHB1YmxpYyBmaW5hbCBpbnQgbWF4TWVyZ2VEb2NzOwogICBwdWJsaWMgZmluYWwgaW50IG1heEluZGV4aW5nVGhyZWFkczsKQEAgLTU5LDcgKzczLDcgQEAKICAgCiAgIHB1YmxpYyBmaW5hbCBQbHVnaW5JbmZvIG1lcmdlZFNlZ21lbnRXYXJtZXJJbmZvOwogICAKLSAgcHVibGljIFN0cmluZyBpbmZvU3RyZWFtRmlsZSA9IG51bGw7CisgIHB1YmxpYyBJbmZvU3RyZWFtIGluZm9TdHJlYW0gPSBJbmZvU3RyZWFtLk5PX09VVFBVVDsKIAogICAvLyBBdmFpbGFibGUgbG9jayB0eXBlcwogICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0NLX1RZUEVfU0lNUExFID0gInNpbXBsZSI7CkBAIC03Myw3ICs4Nyw3IEBACiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgIHByaXZhdGUgU29sckluZGV4Q29uZmlnKFNvbHJDb25maWcgc29sckNvbmZpZykgewogICAgIGx1Y2VuZVZlcnNpb24gPSBzb2xyQ29uZmlnLmx1Y2VuZU1hdGNoVmVyc2lvbjsKLSAgICB1c2VDb21wb3VuZEZpbGUgPSBmYWxzZTsKKyAgICB1c2VDb21wb3VuZEZpbGUgPSBlZmZlY3RpdmVVc2VDb21wb3VudEZpbGVTZXR0aW5nID0gZmFsc2U7CiAgICAgbWF4QnVmZmVyZWREb2NzID0gLTE7CiAgICAgbWF4TWVyZ2VEb2NzID0gLTE7CiAgICAgbWF4SW5kZXhpbmdUaHJlYWRzID0gSW5kZXhXcml0ZXJDb25maWcuREVGQVVMVF9NQVhfVEhSRUFEX1NUQVRFUzsKQEAgLTEyMSw2ICsxMzUsNyBAQAogCiAgICAgZGVmYXVsdE1lcmdlUG9saWN5Q2xhc3NOYW1lID0gZGVmLmRlZmF1bHRNZXJnZVBvbGljeUNsYXNzTmFtZTsKICAgICB1c2VDb21wb3VuZEZpbGU9c29sckNvbmZpZy5nZXRCb29sKHByZWZpeCsiL3VzZUNvbXBvdW5kRmlsZSIsIGRlZi51c2VDb21wb3VuZEZpbGUpOworICAgIGVmZmVjdGl2ZVVzZUNvbXBvdW50RmlsZVNldHRpbmcgPSB1c2VDb21wb3VuZEZpbGU7CiAgICAgbWF4QnVmZmVyZWREb2NzPXNvbHJDb25maWcuZ2V0SW50KHByZWZpeCsiL21heEJ1ZmZlcmVkRG9jcyIsZGVmLm1heEJ1ZmZlcmVkRG9jcyk7CiAgICAgbWF4TWVyZ2VEb2NzPXNvbHJDb25maWcuZ2V0SW50KHByZWZpeCsiL21heE1lcmdlRG9jcyIsZGVmLm1heE1lcmdlRG9jcyk7CiAgICAgbWF4SW5kZXhpbmdUaHJlYWRzPXNvbHJDb25maWcuZ2V0SW50KHByZWZpeCsiL21heEluZGV4aW5nVGhyZWFkcyIsZGVmLm1heEluZGV4aW5nVGhyZWFkcyk7CkBAIC0xMzQsMTMgKzE0OSwxNyBAQAogICAgIG1lcmdlUG9saWN5SW5mbyA9IGdldFBsdWdpbkluZm8ocHJlZml4ICsgIi9tZXJnZVBvbGljeSIsIHNvbHJDb25maWcsIGRlZi5tZXJnZVBvbGljeUluZm8pOwogICAgIAogICAgIHRlcm1JbmRleEludGVydmFsID0gc29sckNvbmZpZy5nZXRJbnQocHJlZml4ICsgIi90ZXJtSW5kZXhJbnRlcnZhbCIsIGRlZi50ZXJtSW5kZXhJbnRlcnZhbCk7Ci0gICAgCisKICAgICBib29sZWFuIGluZm9TdHJlYW1FbmFibGVkID0gc29sckNvbmZpZy5nZXRCb29sKHByZWZpeCArICIvaW5mb1N0cmVhbSIsIGZhbHNlKTsKICAgICBpZihpbmZvU3RyZWFtRW5hYmxlZCkgewotICAgICAgaW5mb1N0cmVhbUZpbGU9IHNvbHJDb25maWcuZ2V0KHByZWZpeCArICIvaW5mb1N0cmVhbS9AZmlsZSIsIG51bGwpOwotICAgICAgbG9nLmluZm8oIkluZGV4V3JpdGVyIGluZm9TdHJlYW0gZGVidWcgbG9nIGlzIGVuYWJsZWQ6ICIgKyBpbmZvU3RyZWFtRmlsZSk7CisgICAgICBTdHJpbmcgaW5mb1N0cmVhbUZpbGUgPSBzb2xyQ29uZmlnLmdldChwcmVmaXggKyAiL2luZm9TdHJlYW0vQGZpbGUiLCBudWxsKTsKKyAgICAgIGlmIChpbmZvU3RyZWFtRmlsZSA9PSBudWxsKSB7CisgICAgICAgIGxvZy5pbmZvKCJJbmRleFdyaXRlciBpbmZvU3RyZWFtIHNvbHIgbG9nZ2luZyBpcyBlbmFibGVkIik7CisgICAgICAgIGluZm9TdHJlYW0gPSBuZXcgTG9nZ2luZ0luZm9TdHJlYW0oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlbW92ZSBAZmlsZSBmcm9tIDxpbmZvU3RyZWFtPiB0byBvdXRwdXQgbWVzc2FnZXMgdG8gc29scidzIGxvZ2ZpbGUiKTsKKyAgICAgIH0KICAgICB9Ci0gICAgCiAgICAgbWVyZ2VkU2VnbWVudFdhcm1lckluZm8gPSBnZXRQbHVnaW5JbmZvKHByZWZpeCArICIvbWVyZ2VkU2VnbWVudFdhcm1lciIsIHNvbHJDb25maWcsIGRlZi5tZXJnZWRTZWdtZW50V2FybWVySW5mbyk7CiAgICAgaWYgKG1lcmdlZFNlZ21lbnRXYXJtZXJJbmZvICE9IG51bGwgJiYgc29sckNvbmZpZy5yZW9wZW5SZWFkZXJzID09IGZhbHNlKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdXBwbHlpbmcgYSBtZXJnZWRTZWdtZW50V2FybWVyIHdpbGwgZG8gbm90aGluZyBzaW5jZSByZW9wZW5SZWFkZXJzIGlzIGZhbHNlIik7CkBAIC0xODgsNiArMjA3LDExIEBACiAgICAgaXdjLnNldFNpbWlsYXJpdHkoc2NoZW1hLmdldFNpbWlsYXJpdHkoKSk7CiAgICAgaXdjLnNldE1lcmdlUG9saWN5KGJ1aWxkTWVyZ2VQb2xpY3koc2NoZW1hKSk7CiAgICAgaXdjLnNldE1lcmdlU2NoZWR1bGVyKGJ1aWxkTWVyZ2VTY2hlZHVsZXIoc2NoZW1hKSk7CisgICAgaXdjLnNldEluZm9TdHJlYW0oaW5mb1N0cmVhbSk7CisKKyAgICAvLyBkbyB0aGlzIGFmdGVyIGJ1aWxkTWVyZ2VQb2xpY3kgc2luY2UgdGhlIGJhY2tjb21wYXQgbG9naWMgCisgICAgLy8gdGhlcmUgbWF5IG1vZGlmeSB0aGUgZWZmZWN0aXZlIHVzZUNvbXBvdW5kRmlsZQorICAgIGl3Yy5zZXRVc2VDb21wb3VuZEZpbGUoZ2V0VXNlQ29tcG91bmRGaWxlKCkpOwogCiAgICAgaWYgKG1heEluZGV4aW5nVGhyZWFkcyAhPSAtMSkgewogICAgICAgaXdjLnNldE1heFRocmVhZFN0YXRlcyhtYXhJbmRleGluZ1RocmVhZHMpOwpAQCAtMTk5LDEzICsyMjMsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4UmVhZGVyV2FybWVyLmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW5mb1N0cmVhbS5jbGFzcyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSW5mb1N0cmVhbS5OT19PVVRQVVQgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBpd2MuZ2V0SW5mb1N0cmVhbSgpIH0pOwogICAgICAgaXdjLnNldE1lcmdlZFNlZ21lbnRXYXJtZXIod2FybWVyKTsKICAgICB9CiAKICAgICByZXR1cm4gaXdjOwogICB9CiAKKyAgLyoqCisgICAqIEJ1aWxkcyBhIE1lcmdlUG9saWN5LCBtYXkgYWxzbyBtb2RpZnkgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICAqIGdldFVzZUNvbXBvdW5kRmlsZSgpIGZvciB1c2UgYnkgdGhlIEluZGV4V3JpdGVyQ29uZmlnIGlmIAorICAgKiAidXNlQ29tcG91bmRGaWxlIiBpcyBzcGVjaWZpZWQgYXMgYW4gaW5pdCBhcmcgZm9yIAorICAgKiBhbiBvdXQgb2YgdGhlIGJveCBNZXJnZVBvbGljeSB0aGF0IG5vIGxvbmdlciBzdXBwb3J0cyBpdAorICAgKgorICAgKiBAc2VlICNmaXhVc2VDRk1lcmdlUG9saWN5SW5pdEFyZworICAgKiBAc2VlICNnZXRVc2VDb21wb3VuZEZpbGUKKyAgICovCiAgIHByaXZhdGUgTWVyZ2VQb2xpY3kgYnVpbGRNZXJnZVBvbGljeShJbmRleFNjaGVtYSBzY2hlbWEpIHsKICAgICBTdHJpbmcgbXBDbGFzc05hbWUgPSBtZXJnZVBvbGljeUluZm8gPT0gbnVsbCA/IGRlZmF1bHRNZXJnZVBvbGljeUNsYXNzTmFtZSA6IG1lcmdlUG9saWN5SW5mby5jbGFzc05hbWU7CiAKQEAgLTIxMywyNSArMjQ2LDMxIEBACiAKICAgICBpZiAocG9saWN5IGluc3RhbmNlb2YgTG9nTWVyZ2VQb2xpY3kpIHsKICAgICAgIExvZ01lcmdlUG9saWN5IGxvZ01lcmdlUG9saWN5ID0gKExvZ01lcmdlUG9saWN5KSBwb2xpY3k7CisgICAgICBmaXhVc2VDRk1lcmdlUG9saWN5SW5pdEFyZyhMb2dNZXJnZVBvbGljeS5jbGFzcyk7CiAKICAgICAgIGlmIChtYXhNZXJnZURvY3MgIT0gLTEpCiAgICAgICAgIGxvZ01lcmdlUG9saWN5LnNldE1heE1lcmdlRG9jcyhtYXhNZXJnZURvY3MpOwogCi0gICAgICBsb2dNZXJnZVBvbGljeS5zZXRVc2VDb21wb3VuZEZpbGUodXNlQ29tcG91bmRGaWxlKTsKKyAgICAgIGxvZ01lcmdlUG9saWN5LnNldE5vQ0ZTUmF0aW8oZ2V0VXNlQ29tcG91bmRGaWxlKCkgPyAxLjAgOiAwLjApOwogCiAgICAgICBpZiAobWVyZ2VGYWN0b3IgIT0gLTEpCiAgICAgICAgIGxvZ01lcmdlUG9saWN5LnNldE1lcmdlRmFjdG9yKG1lcmdlRmFjdG9yKTsKKworCiAgICAgfSBlbHNlIGlmIChwb2xpY3kgaW5zdGFuY2VvZiBUaWVyZWRNZXJnZVBvbGljeSkgewogICAgICAgVGllcmVkTWVyZ2VQb2xpY3kgdGllcmVkTWVyZ2VQb2xpY3kgPSAoVGllcmVkTWVyZ2VQb2xpY3kpIHBvbGljeTsKKyAgICAgIGZpeFVzZUNGTWVyZ2VQb2xpY3lJbml0QXJnKFRpZXJlZE1lcmdlUG9saWN5LmNsYXNzKTsKICAgICAgIAotICAgICAgdGllcmVkTWVyZ2VQb2xpY3kuc2V0VXNlQ29tcG91bmRGaWxlKHVzZUNvbXBvdW5kRmlsZSk7CisgICAgICB0aWVyZWRNZXJnZVBvbGljeS5zZXROb0NGU1JhdGlvKGdldFVzZUNvbXBvdW5kRmlsZSgpID8gMS4wIDogMC4wKTsKICAgICAgIAogICAgICAgaWYgKG1lcmdlRmFjdG9yICE9IC0xKSB7CiAgICAgICAgIHRpZXJlZE1lcmdlUG9saWN5LnNldE1heE1lcmdlQXRPbmNlKG1lcmdlRmFjdG9yKTsKICAgICAgICAgdGllcmVkTWVyZ2VQb2xpY3kuc2V0U2VnbWVudHNQZXJUaWVyKG1lcmdlRmFjdG9yKTsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbG9nLndhcm4oIlVzZSBvZiBjb21wb3VuZCBmaWxlIGZvcm1hdCBvciBtZXJnZWZhY3RvciBjYW5ub3QgYmUgY29uZmlndXJlZCBpZiBtZXJnZSBwb2xpY3kgaXMgbm90IGFuIGluc3RhbmNlIG9mIExvZ01lcmdlUG9saWN5IG9yIFRpZXJlZE1lcmdlUG9saWN5LiBUaGUgY29uZmlndXJlZCBwb2xpY3kncyBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuIik7CisKKworICAgIH0gZWxzZSBpZiAobWVyZ2VGYWN0b3IgIT0gLTEpIHsKKyAgICAgIGxvZy53YXJuKCJVc2Ugb2YgPG1lcmdlRmFjdG9yPiBjYW5ub3QgYmUgY29uZmlndXJlZCBpZiBtZXJnZSBwb2xpY3kgaXMgbm90IGFuIGluc3RhbmNlIG9mIExvZ01lcmdlUG9saWN5IG9yIFRpZXJlZE1lcmdlUG9saWN5LiBUaGUgY29uZmlndXJlZCBwb2xpY3kncyBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuIik7CiAgICAgfQogCiAgICAgaWYgKG1lcmdlUG9saWN5SW5mbyAhPSBudWxsKQpAQCAtMjQ0LDkgKzI4Myw1OCBAQAogICAgIFN0cmluZyBtc0NsYXNzTmFtZSA9IG1lcmdlU2NoZWR1bGVySW5mbyA9PSBudWxsID8gU29sckluZGV4Q29uZmlnLkRFRkFVTFRfTUVSR0VfU0NIRURVTEVSX0NMQVNTTkFNRSA6IG1lcmdlU2NoZWR1bGVySW5mby5jbGFzc05hbWU7CiAgICAgTWVyZ2VTY2hlZHVsZXIgc2NoZWR1bGVyID0gc2NoZW1hLmdldFJlc291cmNlTG9hZGVyKCkubmV3SW5zdGFuY2UobXNDbGFzc05hbWUsIE1lcmdlU2NoZWR1bGVyLmNsYXNzKTsKIAotICAgIGlmIChtZXJnZVNjaGVkdWxlckluZm8gIT0gbnVsbCkKLSAgICAgIFNvbHJQbHVnaW5VdGlscy5pbnZva2VTZXR0ZXJzKHNjaGVkdWxlciwgbWVyZ2VTY2hlZHVsZXJJbmZvLmluaXRBcmdzKTsKKyAgICBpZiAobWVyZ2VTY2hlZHVsZXJJbmZvICE9IG51bGwpIHsKKyAgICAgIC8vIExVQ0VORS01MDgwOiB0aGVzZSB0d28gc2V0dGVycyBhcmUgcmVtb3ZlZCwgc28gd2UgaGF2ZSB0byBpbnZva2Ugc2V0TWF4TWVyZ2VzQW5kVGhyZWFkcworICAgICAgLy8gaWYgc29tZW9uZSBoYXMgdGhlbSBjb25maWd1cmVkLgorICAgICAgaWYgKHNjaGVkdWxlciBpbnN0YW5jZW9mIENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlcikgeworICAgICAgICBOYW1lZExpc3QgYXJncyA9IG1lcmdlU2NoZWR1bGVySW5mby5pbml0QXJncy5jbG9uZSgpOworICAgICAgICBJbnRlZ2VyIG1heE1lcmdlQ291bnQgPSAoSW50ZWdlcikgYXJncy5yZW1vdmUoIm1heE1lcmdlQ291bnQiKTsKKyAgICAgICAgaWYgKG1heE1lcmdlQ291bnQgPT0gbnVsbCkgeworICAgICAgICAgIG1heE1lcmdlQ291bnQgPSAoKENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlcikgc2NoZWR1bGVyKS5nZXRNYXhNZXJnZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZWdlciBtYXhUaHJlYWRDb3VudCA9IChJbnRlZ2VyKSBhcmdzLnJlbW92ZSgibWF4VGhyZWFkQ291bnQiKTsKKyAgICAgICAgaWYgKG1heFRocmVhZENvdW50ID09IG51bGwpIHsKKyAgICAgICAgICBtYXhUaHJlYWRDb3VudCA9ICgoQ29uY3VycmVudE1lcmdlU2NoZWR1bGVyKSBzY2hlZHVsZXIpLmdldE1heFRocmVhZENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgKChDb25jdXJyZW50TWVyZ2VTY2hlZHVsZXIpc2NoZWR1bGVyKS5zZXRNYXhNZXJnZXNBbmRUaHJlYWRzKG1heE1lcmdlQ291bnQsIG1heFRocmVhZENvdW50KTsKKyAgICAgICAgU29sclBsdWdpblV0aWxzLmludm9rZVNldHRlcnMoc2NoZWR1bGVyLCBhcmdzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNvbHJQbHVnaW5VdGlscy5pbnZva2VTZXR0ZXJzKHNjaGVkdWxlciwgbWVyZ2VTY2hlZHVsZXJJbmZvLmluaXRBcmdzKTsKKyAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gc2NoZWR1bGVyOwogICB9CisKKyAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ29tcG91bmRGaWxlKCkgeworICAgIHJldHVybiBlZmZlY3RpdmVVc2VDb21wb3VudEZpbGVTZXR0aW5nOworICB9CisKKyAgLyoqCisgICAqIEx1Y2VuZSA0LjQgcmVtb3ZlZCB0aGUgc2V0VXNlQ29tcG91bmRGaWxlKGJvb2xlYW4pIG1ldGhvZCBmcm9tIHRoZSB0d28gCisgICAqIGNvbnJldGUgTWVyZ2VQb2xpY2llcyBwcm92aWRlZCB3aXRoIEx1Y2VuZS9Tb2xyIGFuZCBhZGRlZCBpdCB0byB0aGUgCisgICAqIEluZGV4V1JpdGVyQ29uZmlnLiAgCisgICAqIEluIHRoZSBldmVudCB0aGF0IHVzZXJzIGhhdmUgYSB2YWx1ZSBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZm9yIHRoaXMgCisgICAqIHNldHRlciBpbiB0aGVpciBNZXJnZVBvbGljeSBpbml0IGFyZ3MsIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBNZXJnZVBvbGljeSAKKyAgICogaW5pdCBhcmdzLCB1cGRhdGUgdGhlICdlZmZlY3RpdmUnIHVzZUNvbXBvdW5kRmlsZSBzZXR0aW5nIHVzZWQgYnkgdGhlIAorICAgKiBJbmRleFdyaXRlckNvbmZpZywgYW5kIHdhcm4gYWJvdXQgZGlzY29udGludWluZyB0byB1c2UgdGhpcyBpbml0IGFyZy4KKyAgICogCisgICAqIEBzZWUgI2dldFVzZUNvbXBvdW5kRmlsZQorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpeFVzZUNGTWVyZ2VQb2xpY3lJbml0QXJnKENsYXNzIGMpIHsKKworICAgIGlmIChudWxsID09IG1lcmdlUG9saWN5SW5mbyB8fCBudWxsID09IG1lcmdlUG9saWN5SW5mby5pbml0QXJncykgcmV0dXJuOworCisgICAgT2JqZWN0IHVzZUNGU0FyZyA9IG1lcmdlUG9saWN5SW5mby5pbml0QXJncy5yZW1vdmUoInVzZUNvbXBvdW5kRmlsZSIpOworICAgIGlmIChudWxsICE9IHVzZUNGU0FyZykgeworICAgICAgbG9nLndhcm4oIklnbm9yaW5nICd1c2VDb21wb3VuZEZpbGUnIHNwZWNpZmllZCBhcyBhbiBpbml0IGFyZyBmb3IgdGhlIDxtZXJnZVBvbGljeT4gc2luY2UgaXQgaXMgbm8gZGlyZWN0bHkgbG9uZ2VyIHN1cHBvcnRlZCBieSAiICsgYy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgaWYgKHVzZUNGU0FyZyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgYm9vbGVhbiBjZnMgPSAoKEJvb2xlYW4pdXNlQ0ZTQXJnKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgbG9nLndhcm4oIlBsZWFzZSB1cGRhdGUgeW91ciBjb25maWcgdG8gc3BlY2lmeSA8dXNlQ29tcG91bmRGaWxlPiIrY2ZzKyI8L3VzZUNvbXBvdW5kRmlsZT4gZGlyZWN0bHkgaW4geW91ciA8aW5kZXhDb25maWc+IHNldHRpbmdzLiIpOworICAgICAgICBlZmZlY3RpdmVVc2VDb21wb3VudEZpbGVTZXR0aW5nID0gY2ZzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nLmVycm9yKCJNZXJnZVBvbGljeSdzICd1c2VDb21wb3VuZEZpbGUnIGluaXQgYXJnIGlzIG5vdCBhIGJvb2xlYW4sIGNhbiBub3QgYXBwbHkgYmFjayBjb21wYXQgbG9naWMgdG8gYXBwbHkgdG8gdGhlIEluZGV4V3JpdGVyQ29uZmlnOiAiICsgdXNlQ0ZTQXJnLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvU29sckluZGV4V3JpdGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhXcml0ZXIuamF2YQppbmRleCA0NjRiZGVjLi43MzY4OTNkIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhXcml0ZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhXcml0ZXIuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogICAgIHN1cGVyKGRpcmVjdG9yeSwKICAgICAgICAgICBjb25maWcudG9JbmRleFdyaXRlckNvbmZpZyhzY2hlbWEpLgogICAgICAgICAgIHNldE9wZW5Nb2RlKGNyZWF0ZSA/IEluZGV4V3JpdGVyQ29uZmlnLk9wZW5Nb2RlLkNSRUFURSA6IEluZGV4V3JpdGVyQ29uZmlnLk9wZW5Nb2RlLkFQUEVORCkuCi0gICAgICAgICAgc2V0SW5kZXhEZWxldGlvblBvbGljeShkZWxQb2xpY3kpLnNldENvZGVjKGNvZGVjKS5zZXRJbmZvU3RyZWFtKHRvSW5mb1N0cmVhbShjb25maWcpKQorICAgICAgICAgIHNldEluZGV4RGVsZXRpb25Qb2xpY3koZGVsUG9saWN5KS5zZXRDb2RlYyhjb2RlYykKICAgICAgICAgICApOwogICAgIGxvZy5kZWJ1ZygiT3BlbmVkIFdyaXRlciAiICsgbmFtZSk7CiAgICAgdGhpcy5uYW1lID0gbmFtZTsKQEAgLTg4LDIwICs4OCw2IEBACiAgICAgdGhpcy5kaXJlY3RvcnlGYWN0b3J5ID0gZmFjdG9yeTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEluZm9TdHJlYW0gdG9JbmZvU3RyZWFtKFNvbHJJbmRleENvbmZpZyBjb25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGluZm9TdHJlYW1GaWxlID0gY29uZmlnLmluZm9TdHJlYW1GaWxlOwotICAgIGlmIChpbmZvU3RyZWFtRmlsZSAhPSBudWxsKSB7Ci0gICAgICBGaWxlIGYgPSBuZXcgRmlsZShpbmZvU3RyZWFtRmlsZSk7Ci0gICAgICBGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYsIHRydWUpOwotICAgICAgcmV0dXJuIG5ldyBQcmludFN0cmVhbUluZm9TdHJlYW0obmV3IFByaW50U3RyZWFtKGZvcywgdHJ1ZSwgIlVURi04IikpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSW5mb1N0cmVhbS5OT19PVVRQVVQ7Ci0gICAgfQotICB9Ci0KLQogICAvKioKICAgICogdXNlIERvY3VtZW50QnVpbGRlciBub3cuLi4KICAgICogcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZEZpZWxkKERvY3VtZW50IGRvYywgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWwpIHsKQEAgLTE2NCwxMSArMTUwLDggQEAKICAgICAgIGlmIChpbmZvU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgaW5mb1N0cmVhbS5jbG9zZSgpOwogICAgICAgfQotICAgICAgCiAgICAgICBpc0Nsb3NlZCA9IHRydWU7Ci0gICAgICAKICAgICAgIGRpcmVjdG9yeUZhY3RvcnkucmVsZWFzZShkaXJlY3RvcnkpOwotICAgICAgCiAgICAgICBudW1DbG9zZXMuaW5jcmVtZW50QW5kR2V0KCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9UcmFuc2FjdGlvbkxvZy5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvVHJhbnNhY3Rpb25Mb2cuamF2YQppbmRleCAxMTMzZDJmLi4zMWYxYTM0IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9UcmFuc2FjdGlvbkxvZy5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1RyYW5zYWN0aW9uTG9nLmphdmEKQEAgLTE3LDE1ICsxNyw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQnl0ZXNSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLkZhc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuRmFzdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuSmF2YUJpbkNvZGVjOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTM0LDE1ICsyNSwyMyBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuRGF0YUlucHV0SW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLkZhc3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuRmFzdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuSmF2YUJpbkNvZGVjOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIC8qKgogICogIExvZyBGb3JtYXQ6IExpc3R7T3BlcmF0aW9uLCBWZXJzaW9uLCAuLi59CiAgKiAgQURELCBWRVJTSU9OLCBET0MKQEAgLTc1LDcgKzc0LDcgQEAKICAgRmFzdE91dHB1dFN0cmVhbSBmb3M7ICAgIC8vIGFsbCBhY2Nlc3NlcyB0byB0aGlzIHN0cmVhbSBzaG91bGQgYmUgc3luY2hyb25pemVkIG9uICJ0aGlzIiAoVGhlIFRyYW5zYWN0aW9uTG9nKQogICBpbnQgbnVtUmVjb3JkczsKICAgCi0gIHZvbGF0aWxlIGJvb2xlYW4gZGVsZXRlT25DbG9zZSA9IHRydWU7ICAvLyB3ZSBjYW4gZGVsZXRlIG9sZCB0bG9ncyBzaW5jZSB0aGV5IGFyZSBjdXJyZW50bHkgb25seSB1c2VkIGZvciByZWFsLXRpbWUtZ2V0IChhbmQgaW4gdGhlIGZ1dHVyZSwgcmVjb3ZlcnkpCisgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGRlbGV0ZU9uQ2xvc2UgPSB0cnVlOyAgLy8gd2UgY2FuIGRlbGV0ZSBvbGQgdGxvZ3Mgc2luY2UgdGhleSBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgcmVhbC10aW1lLWdldCAoYW5kIGluIHRoZSBmdXR1cmUsIHJlY292ZXJ5KQogCiAgIEF0b21pY0ludGVnZXIgcmVmY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKICAgTWFwPFN0cmluZyxJbnRlZ2VyPiBnbG9iYWxTdHJpbmdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CkBAIC05OCw3ICs5Nyw3IEBACiAgIH07CiAKICAgcHVibGljIGNsYXNzIExvZ0NvZGVjIGV4dGVuZHMgSmF2YUJpbkNvZGVjIHsKLSAgICBwdWJsaWMgTG9nQ29kZWMoKSB7CisgICAgcHVibGljIExvZ0NvZGVjKEphdmFCaW5Db2RlYy5PYmplY3RSZXNvbHZlciByZXNvbHZlcikgewogICAgICAgc3VwZXIocmVzb2x2ZXIpOwogICAgIH0KIApAQCAtMTIxLDcgKzEyMCw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyByZWFkRXh0ZXJuU3RyaW5nKEZhc3RJbnB1dFN0cmVhbSBmaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFN0cmluZyByZWFkRXh0ZXJuU3RyaW5nKERhdGFJbnB1dElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgIGludCBpZHggPSByZWFkU2l6ZShmaXMpOwogICAgICAgaWYgKGlkeCAhPSAwKSB7Ly8gaWR4ICE9IDAgaXMgdGhlIGluZGV4IG9mIHRoZSBleHRlcm4gc3RyaW5nCiAgICAgICAvLyBubyBuZWVkIHRvIHN5bmNocm9uaXplIGdsb2JhbFN0cmluZ0xpc3QgLSBpdCdzIG9ubHkgdXBkYXRlZCBiZWZvcmUgdGhlIGZpcnN0IHJlY29yZCBpcyB3cml0dGVuIHRvIHRoZSBsb2cKQEAgLTE5MSw2ICsxOTAsOSBAQAogICAgIH0KICAgfQogCisgIC8vIGZvciBzdWJjbGFzc2VzCisgIHByb3RlY3RlZCBUcmFuc2FjdGlvbkxvZygpIHt9CisKICAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBsb2cgKGN1cnJlbnRseSBpbmNsdWRlcyB0aGUgaGVhZGVyIGFuZCBhbiBvcHRpb25hbCBjb21taXQpLgogICAgKiBOb3RlOiBjdXJyZW50bHkgcmV0dXJucyAwIGZvciByZW9wZW5lZCBleGlzdGluZyBsb2cgZmlsZXMuCiAgICAqLwpAQCAtMjQ1LDcgKzI0Nyw3IEBACiAKIAogICBwdWJsaWMgbG9uZyB3cml0ZURhdGEoT2JqZWN0IG8pIHsKLSAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYygpOworICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKICAgICB0cnkgewogICAgICAgbG9uZyBwb3MgPSBmb3Muc2l6ZSgpOyAgIC8vIGlmIHdlIGhhZCBmbHVzaGVkLCB0aGlzIHNob3VsZCBiZSBlcXVhbCB0byBjaGFubmVsLnBvc2l0aW9uKCkKICAgICAgIGNvZGVjLmluaXQoZm9zKTsKQEAgLTI2MCw3ICsyNjIsNyBAQAogICBwcml2YXRlIHZvaWQgcmVhZEhlYWRlcihGYXN0SW5wdXRTdHJlYW0gZmlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIC8vIHJlYWQgZXhpc3RpbmcgaGVhZGVyCiAgICAgZmlzID0gZmlzICE9IG51bGwgPyBmaXMgOiBuZXcgQ2hhbm5lbEZhc3RJbnB1dFN0cmVhbShjaGFubmVsLCAwKTsKLSAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYygpOworICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKICAgICBNYXAgaGVhZGVyID0gKE1hcCljb2RlYy51bm1hcnNoYWwoZmlzKTsKIAogICAgIGZpcy5yZWFkSW50KCk7IC8vIHNraXAgc2l6ZQpAQCAtMjc2LDcgKzI3OCw3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGFkZEdsb2JhbFN0cmluZ3MoQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MpIHsKKyAgcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsU3RyaW5ncyhDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncykgewogICAgIGlmIChzdHJpbmdzID09IG51bGwpIHJldHVybjsKICAgICBpbnQgb3JpZ1NpemUgPSBnbG9iYWxTdHJpbmdNYXAuc2l6ZSgpOwogICAgIGZvciAoU3RyaW5nIHMgOiBzdHJpbmdzKSB7CkBAIC0yOTcsNyArMjk5LDcgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHZvaWQgd3JpdGVMb2dIZWFkZXIoTG9nQ29kZWMgY29kZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHByb3RlY3RlZCB2b2lkIHdyaXRlTG9nSGVhZGVyKExvZ0NvZGVjIGNvZGVjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGxvbmcgcG9zID0gZm9zLnNpemUoKTsKICAgICBhc3NlcnQgcG9zID09IDA7CiAKQEAgLTMwOSw3ICszMTEsNyBAQAogICAgIGVuZFJlY29yZChwb3MpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGVuZFJlY29yZChsb25nIHN0YXJ0UmVjb3JkUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHByb3RlY3RlZCB2b2lkIGVuZFJlY29yZChsb25nIHN0YXJ0UmVjb3JkUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZm9zLndyaXRlSW50KChpbnQpKGZvcy5zaXplKCkgLSBzdGFydFJlY29yZFBvc2l0aW9uKSk7CiAgICAgbnVtUmVjb3JkcysrOwogICB9CkBAIC0zMzMsNyArMzM1LDcgQEAKICAgaW50IGxhc3RBZGRTaXplOwogCiAgIHB1YmxpYyBsb25nIHdyaXRlKEFkZFVwZGF0ZUNvbW1hbmQgY21kLCBpbnQgZmxhZ3MpIHsKLSAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYygpOworICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKICAgICBTb2xySW5wdXREb2N1bWVudCBzZG9jID0gY21kLmdldFNvbHJJbnB1dERvY3VtZW50KCk7CiAKICAgICB0cnkgewpAQCAtMzc1LDcgKzM3Nyw3IEBACiAgIH0KIAogICBwdWJsaWMgbG9uZyB3cml0ZURlbGV0ZShEZWxldGVVcGRhdGVDb21tYW5kIGNtZCwgaW50IGZsYWdzKSB7Ci0gICAgTG9nQ29kZWMgY29kZWMgPSBuZXcgTG9nQ29kZWMoKTsKKyAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYyhyZXNvbHZlcik7CiAKICAgICB0cnkgewogICAgICAgY2hlY2tXcml0ZUhlYWRlcihjb2RlYywgbnVsbCk7CkBAIC00MDUsNyArNDA3LDcgQEAKICAgfQogCiAgIHB1YmxpYyBsb25nIHdyaXRlRGVsZXRlQnlRdWVyeShEZWxldGVVcGRhdGVDb21tYW5kIGNtZCwgaW50IGZsYWdzKSB7Ci0gICAgTG9nQ29kZWMgY29kZWMgPSBuZXcgTG9nQ29kZWMoKTsKKyAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYyhyZXNvbHZlcik7CiAgICAgdHJ5IHsKICAgICAgIGNoZWNrV3JpdGVIZWFkZXIoY29kZWMsIG51bGwpOwogCkBAIC00MzEsNyArNDMzLDcgQEAKIAogCiAgIHB1YmxpYyBsb25nIHdyaXRlQ29tbWl0KENvbW1pdFVwZGF0ZUNvbW1hbmQgY21kLCBpbnQgZmxhZ3MpIHsKLSAgICBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYygpOworICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgIHRyeSB7CiAgICAgICAgIGxvbmcgcG9zID0gZm9zLnNpemUoKTsgICAvLyBpZiB3ZSBoYWQgZmx1c2hlZCwgdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gY2hhbm5lbC5wb3NpdGlvbigpCkBAIC00NzksNyArNDgxLDcgQEAKICAgICAgIH0KIAogICAgICAgQ2hhbm5lbEZhc3RJbnB1dFN0cmVhbSBmaXMgPSBuZXcgQ2hhbm5lbEZhc3RJbnB1dFN0cmVhbShjaGFubmVsLCBwb3MpOwotICAgICAgTG9nQ29kZWMgY29kZWMgPSBuZXcgTG9nQ29kZWMoKTsKKyAgICAgIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKHJlc29sdmVyKTsKICAgICAgIHJldHVybiBjb2RlYy5yZWFkVmFsKGZpcyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SLCBlKTsKQEAgLTUyOSw3ICs1MzEsNyBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBjbG9zZSgpIHsKKyAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CiAgICAgdHJ5IHsKICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICBsb2cuZGVidWcoIkNsb3NpbmcgdGxvZyIgKyB0aGlzKTsKQEAgLTU3MCwxOSArNTcyLDIyIEBACiAKICAgLyoqIFJldHVybnMgYSBzaW5nbGUgdGhyZWFkZWQgcmV2ZXJzZSByZWFkZXIgKi8KICAgcHVibGljIFJldmVyc2VSZWFkZXIgZ2V0UmV2ZXJzZVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBSZXZlcnNlUmVhZGVyKCk7CisgICAgcmV0dXJuIG5ldyBGU1JldmVyc2VSZWFkZXIoKTsKICAgfQogCiAKICAgcHVibGljIGNsYXNzIExvZ1JlYWRlciB7Ci0gICAgQ2hhbm5lbEZhc3RJbnB1dFN0cmVhbSBmaXM7Ci0gICAgcHJpdmF0ZSBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYygpOworICAgIHByaXZhdGUgQ2hhbm5lbEZhc3RJbnB1dFN0cmVhbSBmaXM7CisgICAgcHJpdmF0ZSBMb2dDb2RlYyBjb2RlYyA9IG5ldyBMb2dDb2RlYyhyZXNvbHZlcik7CiAKICAgICBwdWJsaWMgTG9nUmVhZGVyKGxvbmcgc3RhcnRpbmdQb3MpIHsKICAgICAgIGluY3JlZigpOwogICAgICAgZmlzID0gbmV3IENoYW5uZWxGYXN0SW5wdXRTdHJlYW0oY2hhbm5lbCwgc3RhcnRpbmdQb3MpOwogICAgIH0KIAorICAgIC8vIGZvciBjbGFzc2VzIHRoYXQgZXh0ZW5kCisgICAgcHJvdGVjdGVkIExvZ1JlYWRlcigpIHt9CisKICAgICAvKiogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgbG9nLCBvciBudWxsIGlmIG5vbmUgYXZhaWxhYmxlLgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgbG9nIHJlY29yZCwgb3IgbnVsbCBpZiBFT0YKQEAgLTYzOCwxMSArNjQzLDMyIEBACiAKICAgfQogCi0gIHB1YmxpYyBjbGFzcyBSZXZlcnNlUmVhZGVyIHsKKyAgcHVibGljIGFic3RyYWN0IGNsYXNzIFJldmVyc2VSZWFkZXIgeworCisKKworICAgIC8qKiBSZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBsb2csIG9yIG51bGwgaWYgbm9uZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsb2cgcmVjb3JkLCBvciBudWxsIGlmIEVPRgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBsb3ctbGV2ZWwgSS9PIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qIHJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSBsb2cgZmlsZSBvZiB0aGUgbGFzdCByZWNvcmQgcmV0dXJuZWQgYnkgbmV4dCgpICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcG9zaXRpb24oKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpIDsKKworCisgIH0KKyAgCisgIHB1YmxpYyBjbGFzcyBGU1JldmVyc2VSZWFkZXIgZXh0ZW5kcyBSZXZlcnNlUmVhZGVyIHsKICAgICBDaGFubmVsRmFzdElucHV0U3RyZWFtIGZpczsKLSAgICBwcml2YXRlIExvZ0NvZGVjIGNvZGVjID0gbmV3IExvZ0NvZGVjKCkgeworICAgIHByaXZhdGUgTG9nQ29kZWMgY29kZWMgPSBuZXcgTG9nQ29kZWMocmVzb2x2ZXIpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFNvbHJJbnB1dERvY3VtZW50IHJlYWRTb2xySW5wdXREb2N1bWVudChGYXN0SW5wdXRTdHJlYW0gZGlzKSB7CisgICAgICBwdWJsaWMgU29scklucHV0RG9jdW1lbnQgcmVhZFNvbHJJbnB1dERvY3VtZW50KERhdGFJbnB1dElucHV0U3RyZWFtIGRpcykgewogICAgICAgICAvLyBHaXZlbiB0aGF0IHRoZSBTb2xySW5wdXREb2N1bWVudCBpcyBsYXN0IGluIGFuIGFkZCByZWNvcmQsIGl0J3MgT0sgdG8ganVzdCBza2lwCiAgICAgICAgIC8vIHJlYWRpbmcgaXQgY29tcGxldGVseS4KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC02NTIsNyArNjc4LDcgQEAKICAgICBpbnQgbmV4dExlbmd0aDsgIC8vIGxlbmd0aCBvZiB0aGUgbmV4dCByZWNvcmQgKHRoZSBuZXh0IG9uZSBjbG9zZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb2cgZmlsZSkKICAgICBsb25nIHByZXZQb3M7ICAgIC8vIHdoZXJlIHdlIHN0YXJ0ZWQgcmVhZGluZyBmcm9tIGxhc3QgdGltZSAoc28gcHJldlBvcyAtIG5leHRMZW5ndGggPT0gc3RhcnQgb2YgbmV4dCByZWNvcmQpCiAKLSAgICBwdWJsaWMgUmV2ZXJzZVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIEZTUmV2ZXJzZVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICBpbmNyZWYoKTsKIAogICAgICAgbG9uZyBzejsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1VwZGF0ZUhhbmRsZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1VwZGF0ZUhhbmRsZXIuamF2YQppbmRleCBlNzliMTVmLi4wM2M1YTQ4IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9VcGRhdGVIYW5kbGVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvVXBkYXRlSGFuZGxlci5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZTsKIAogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkRpcmVjdG9yeUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuSGRmc0RpcmVjdG9yeUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuUGx1Z2luSW5mbzsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyRXZlbnRMaXN0ZW5lcjsKQEAgLTUyLDcgKzUzLDcgQEAKICAgcHJvdGVjdGVkIFZlY3RvcjxTb2xyRXZlbnRMaXN0ZW5lcj4gc29mdENvbW1pdENhbGxiYWNrcyA9IG5ldyBWZWN0b3I8U29sckV2ZW50TGlzdGVuZXI+KCk7CiAgIHByb3RlY3RlZCBWZWN0b3I8U29sckV2ZW50TGlzdGVuZXI+IG9wdGltaXplQ2FsbGJhY2tzID0gbmV3IFZlY3RvcjxTb2xyRXZlbnRMaXN0ZW5lcj4oKTsKIAotICBwcm90ZWN0ZWQgdm9sYXRpbGUgVXBkYXRlTG9nIHVsb2c7CisgIHByb3RlY3RlZCBmaW5hbCBVcGRhdGVMb2cgdWxvZzsKIAogICBwcml2YXRlIHZvaWQgcGFyc2VFdmVudExpc3RlbmVycygpIHsKICAgICBmaW5hbCBDbGFzczxTb2xyRXZlbnRMaXN0ZW5lcj4gY2xhenogPSBTb2xyRXZlbnRMaXN0ZW5lci5jbGFzczsKQEAgLTcxLDM0ICs3Miw2IEBACiAgICAgfQogICB9CiAKLQotICBwcml2YXRlIHZvaWQgaW5pdExvZyhQbHVnaW5JbmZvIHVsb2dQbHVnaW5JbmZvKSB7Ci0gICAgaWYgKHVsb2dQbHVnaW5JbmZvICE9IG51bGwgJiYgdWxvZ1BsdWdpbkluZm8uaXNFbmFibGVkKCkpIHsKLSAgICAgIHVsb2cgPSBuZXcgVXBkYXRlTG9nKCk7Ci0gICAgICB1bG9nLmluaXQodWxvZ1BsdWdpbkluZm8pOwotICAgICAgLy8gdWxvZyA9IGNvcmUuY3JlYXRlSW5pdEluc3RhbmNlKHVsb2dQbHVnaW5JbmZvLCBVcGRhdGVMb2cuY2xhc3MsICJ1cGRhdGUgbG9nIiwgInNvbHIuTnVsbFVwZGF0ZUxvZyIpOwotICAgICAgdWxvZy5pbml0KHRoaXMsIGNvcmUpOwotICAgIH0KLSAgfQotCi0gIC8vIG5vdCB0aHJlYWQgc2FmZSAtIGZvciBzdGFydHVwCi0gIHByaXZhdGUgdm9pZCBjbGVhckxvZyhQbHVnaW5JbmZvIHVsb2dQbHVnaW5JbmZvKSB7Ci0gICAgaWYgKHVsb2dQbHVnaW5JbmZvID09IG51bGwpIHJldHVybjsKLSAgICBGaWxlIHRsb2dEaXIgPSBVcGRhdGVMb2cuZ2V0VGxvZ0Rpcihjb3JlLCB1bG9nUGx1Z2luSW5mbyk7Ci0gICAgbG9nLmluZm8oIkNsZWFyaW5nIHRsb2cgZmlsZXMsIHRsb2dEaXI9IiArIHRsb2dEaXIpOwotICAgIGlmICh0bG9nRGlyLmV4aXN0cygpKSB7Ci0gICAgICBTdHJpbmdbXSBmaWxlcyA9IFVwZGF0ZUxvZy5nZXRMb2dMaXN0KHRsb2dEaXIpOwotICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHRsb2dEaXIsIGZpbGUpOwotICAgICAgICBib29sZWFuIHMgPSBmLmRlbGV0ZSgpOwotICAgICAgICBpZiAoIXMpIHsKLSAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCByZW1vdmUgdGxvZyBmaWxlOiIgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAvL3Rocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsICJDb3VsZCBub3QgcmVtb3ZlIHRsb2cgZmlsZToiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogICBwcm90ZWN0ZWQgdm9pZCBjYWxsUG9zdENvbW1pdENhbGxiYWNrcygpIHsKICAgICBmb3IgKFNvbHJFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogY29tbWl0Q2FsbGJhY2tzKSB7CiAgICAgICBsaXN0ZW5lci5wb3N0Q29tbWl0KCk7CkBAIC0xMjcsMTQgKzEwMCw0MyBAQAogICAgIGlkRmllbGRUeXBlID0gaWRGaWVsZCE9bnVsbCA/IGlkRmllbGQuZ2V0VHlwZSgpIDogbnVsbDsKICAgICBwYXJzZUV2ZW50TGlzdGVuZXJzKCk7CiAgICAgUGx1Z2luSW5mbyB1bG9nUGx1Z2luSW5mbyA9IGNvcmUuZ2V0U29sckNvbmZpZygpLmdldFBsdWdpbkluZm8oVXBkYXRlTG9nLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgaWYgKCFjb3JlLmlzUmVsb2FkZWQoKSAmJiAhY29yZS5nZXREaXJlY3RvcnlGYWN0b3J5KCkuaXNQZXJzaXN0ZW50KCkpIHsKLSAgICAgIGNsZWFyTG9nKHVsb2dQbHVnaW5JbmZvKTsKLSAgICB9Ci0gICAgaWYgKHVwZGF0ZUxvZyA9PSBudWxsKSB7Ci0gICAgICBpbml0TG9nKHVsb2dQbHVnaW5JbmZvKTsKKyAgICAKKworICAgIGlmICh1cGRhdGVMb2cgPT0gbnVsbCAmJiB1bG9nUGx1Z2luSW5mbyAhPSBudWxsICYmIHVsb2dQbHVnaW5JbmZvLmlzRW5hYmxlZCgpKSB7CisgICAgICBTdHJpbmcgZGF0YURpciA9IChTdHJpbmcpdWxvZ1BsdWdpbkluZm8uaW5pdEFyZ3MuZ2V0KCJkaXIiKTsKKyAgICAgIAorICAgICAgU3RyaW5nIHVsb2dEaXIgPSBjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0VWxvZ0RpcigpOworICAgICAgaWYgKHVsb2dEaXIgIT0gbnVsbCkgeworICAgICAgICBkYXRhRGlyID0gdWxvZ0RpcjsKKyAgICAgIH0KKyAgICAgIGlmIChkYXRhRGlyID09IG51bGwgfHwgZGF0YURpci5sZW5ndGgoKT09MCkgeworICAgICAgICBkYXRhRGlyID0gY29yZS5nZXREYXRhRGlyKCk7CisgICAgICB9CisgICAgICAgICAgIAorICAgICAgaWYgKGRhdGFEaXIgIT0gbnVsbCAmJiBkYXRhRGlyLnN0YXJ0c1dpdGgoImhkZnM6LyIpKSB7CisgICAgICAgIERpcmVjdG9yeUZhY3RvcnkgZGlyRmFjdG9yeSA9IGNvcmUuZ2V0RGlyZWN0b3J5RmFjdG9yeSgpOworICAgICAgICBpZiAoZGlyRmFjdG9yeSBpbnN0YW5jZW9mIEhkZnNEaXJlY3RvcnlGYWN0b3J5KSB7CisgICAgICAgICAgdWxvZyA9IG5ldyBIZGZzVXBkYXRlTG9nKCgoSGRmc0RpcmVjdG9yeUZhY3RvcnkpZGlyRmFjdG9yeSkuZ2V0Q29uZkRpcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1bG9nID0gbmV3IEhkZnNVcGRhdGVMb2coKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVsb2cgPSBuZXcgVXBkYXRlTG9nKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmICghY29yZS5pc1JlbG9hZGVkKCkgJiYgIWNvcmUuZ2V0RGlyZWN0b3J5RmFjdG9yeSgpLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgIHVsb2cuY2xlYXJMb2coY29yZSwgdWxvZ1BsdWdpbkluZm8pOworICAgICAgfQorICAgICAgCisgICAgICB1bG9nLmluaXQodWxvZ1BsdWdpbkluZm8pOworCisgICAgICB1bG9nLmluaXQodGhpcywgY29yZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRoaXMudWxvZyA9IHVwZGF0ZUxvZzsKKyAgICAgIHVsb2cgPSB1cGRhdGVMb2c7CiAgICAgfQorICAgIC8vIHVsb2cuaW5pdCgpIHdoZW4gcmV1c2luZyBhbiBleGlzdGluZyBsb2cgaXMgZGVmZXJyZWQgKGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIHRoZSBEVUgyIGNvbnN0cnVjdG9yCisKICAgfQogCiAgIC8qKgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvVXBkYXRlTG9nLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9VcGRhdGVMb2cuamF2YQppbmRleCA4YWIzYTA3Li5iZTAxZGI1IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9VcGRhdGVMb2cuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9VcGRhdGVMb2cuamF2YQpAQCAtMTcsMTUgKzE3LDM4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRlZFVwZGF0ZVByb2Nlc3Nvci5EaXN0cmliUGhhc2UuRlJPTUxFQURFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuRGlzdHJpYnV0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5ESVNUUklCX1VQREFURV9QQVJBTTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5CeXRlc1JlZjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uLkVycm9yQ29kZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dERvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLk1vZGlmaWFibGVTb2xyUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLlNvbHJQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuVXBkYXRlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5FeGVjdXRvclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLk5hbWVkTGlzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5QbHVnaW5JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LkxvY2FsU29sclF1ZXJ5UmVxdWVzdDsKQEAgLTM0LDkgKzU3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuU29sclF1ZXJ5UmVzcG9uc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5Tb2xySW5kZXhTZWFyY2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRlZFVwZGF0ZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRlZFVwZGF0ZVByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuRGlzdHJpYnV0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yLlVwZGF0ZVJlcXVlc3RQcm9jZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuVXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkRlZmF1bHRTb2xyVGhyZWFkRmFjdG9yeTsKQEAgLTQ1LDE1ICs2NSw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRpbmdVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LkRJU1RSSUJfVVBEQVRFX1BBUkFNOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRlZFVwZGF0ZVByb2Nlc3Nvci5EaXN0cmliUGhhc2UuRlJPTUxFQURFUjsKLQogCiAvKiogQGx1Y2VuZS5leHBlcmltZW50YWwgKi8KIHB1YmxpYyBjbGFzcyBVcGRhdGVMb2cgaW1wbGVtZW50cyBQbHVnaW5JbmZvSW5pdGlhbGl6ZWQgewpAQCAtNjQsNiArNzUsMTAgQEAKICAgcHVibGljIGJvb2xlYW4gZGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKICAgcHVibGljIGJvb2xlYW4gdHJhY2UgPSBsb2cuaXNUcmFjZUVuYWJsZWQoKTsKIAorICAvLyBUT0RPOiBoYWNrCisgIHB1YmxpYyBGaWxlU3lzdGVtIGdldEZzKCkgeworICAgIHJldHVybiBudWxsOworICB9CiAKICAgcHVibGljIGVudW0gU3luY0xldmVsIHsgTk9ORSwgRkxVU0gsIEZTWU5DOwogICAgIHB1YmxpYyBzdGF0aWMgU3luY0xldmVsIGdldFN5bmNMZXZlbChTdHJpbmcgbGV2ZWwpewpAQCAtMTA4LDI3ICsxMjMsMjcgQEAKICAgfQogCiAgIGxvbmcgaWQgPSAtMTsKLSAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZSA9IFN0YXRlLkFDVElWRTsKLSAgcHJpdmF0ZSBpbnQgb3BlcmF0aW9uRmxhZ3M7ICAvLyBmbGFncyB0byB3cml0ZSBpbiB0aGUgdHJhbnNhY3Rpb24gbG9nIHdpdGggb3BlcmF0aW9ucyAoaS5lLiBGTEFHX0dBUCkKKyAgcHJvdGVjdGVkIFN0YXRlIHN0YXRlID0gU3RhdGUuQUNUSVZFOworICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbkZsYWdzOyAgLy8gZmxhZ3MgdG8gd3JpdGUgaW4gdGhlIHRyYW5zYWN0aW9uIGxvZyB3aXRoIG9wZXJhdGlvbnMgKGkuZS4gRkxBR19HQVApCiAKLSAgcHJpdmF0ZSBUcmFuc2FjdGlvbkxvZyB0bG9nOwotICBwcml2YXRlIFRyYW5zYWN0aW9uTG9nIHByZXZUbG9nOwotICBwcml2YXRlIERlcXVlPFRyYW5zYWN0aW9uTG9nPiBsb2dzID0gbmV3IExpbmtlZExpc3Q8VHJhbnNhY3Rpb25Mb2c+KCk7ICAvLyBsaXN0IG9mIHJlY2VudCBsb2dzLCBuZXdlc3QgZmlyc3QKLSAgcHJpdmF0ZSBMaW5rZWRMaXN0PFRyYW5zYWN0aW9uTG9nPiBuZXdlc3RMb2dzT25TdGFydHVwID0gbmV3IExpbmtlZExpc3Q8VHJhbnNhY3Rpb25Mb2c+KCk7Ci0gIHByaXZhdGUgaW50IG51bU9sZFJlY29yZHM7ICAvLyBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgcmVjZW50IGxvZ3MKKyAgcHJvdGVjdGVkIFRyYW5zYWN0aW9uTG9nIHRsb2c7CisgIHByb3RlY3RlZCBUcmFuc2FjdGlvbkxvZyBwcmV2VGxvZzsKKyAgcHJvdGVjdGVkIERlcXVlPFRyYW5zYWN0aW9uTG9nPiBsb2dzID0gbmV3IExpbmtlZExpc3Q8VHJhbnNhY3Rpb25Mb2c+KCk7ICAvLyBsaXN0IG9mIHJlY2VudCBsb2dzLCBuZXdlc3QgZmlyc3QKKyAgcHJvdGVjdGVkIExpbmtlZExpc3Q8VHJhbnNhY3Rpb25Mb2c+IG5ld2VzdExvZ3NPblN0YXJ0dXAgPSBuZXcgTGlua2VkTGlzdDxUcmFuc2FjdGlvbkxvZz4oKTsKKyAgcHJvdGVjdGVkIGludCBudW1PbGRSZWNvcmRzOyAgLy8gbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIHJlY2VudCBsb2dzCiAKLSAgcHJpdmF0ZSBNYXA8Qnl0ZXNSZWYsTG9nUHRyPiBtYXAgPSBuZXcgSGFzaE1hcDxCeXRlc1JlZiwgTG9nUHRyPigpOwotICBwcml2YXRlIE1hcDxCeXRlc1JlZixMb2dQdHI+IHByZXZNYXA7ICAvLyB1c2VkIHdoaWxlIGNvbW1pdHRpbmcvcmVvcGVuaW5nIGlzIGhhcHBlbmluZwotICBwcml2YXRlIE1hcDxCeXRlc1JlZixMb2dQdHI+IHByZXZNYXAyOyAgLy8gdXNlZCB3aGlsZSBjb21taXR0aW5nL3Jlb3BlbmluZyBpcyBoYXBwZW5pbmcKLSAgcHJpdmF0ZSBUcmFuc2FjdGlvbkxvZyBwcmV2TWFwTG9nOyAgLy8gdGhlIHRyYW5zYWN0aW9uIGxvZyB1c2VkIHRvIGxvb2sgdXAgZW50cmllcyBmb3VuZCBpbiBwcmV2TWFwCi0gIHByaXZhdGUgVHJhbnNhY3Rpb25Mb2cgcHJldk1hcExvZzI7ICAvLyB0aGUgdHJhbnNhY3Rpb24gbG9nIHVzZWQgdG8gbG9vayB1cCBlbnRyaWVzIGZvdW5kIGluIHByZXZNYXAKKyAgcHJvdGVjdGVkIE1hcDxCeXRlc1JlZixMb2dQdHI+IG1hcCA9IG5ldyBIYXNoTWFwPEJ5dGVzUmVmLCBMb2dQdHI+KCk7CisgIHByb3RlY3RlZCBNYXA8Qnl0ZXNSZWYsTG9nUHRyPiBwcmV2TWFwOyAgLy8gdXNlZCB3aGlsZSBjb21taXR0aW5nL3Jlb3BlbmluZyBpcyBoYXBwZW5pbmcKKyAgcHJvdGVjdGVkIE1hcDxCeXRlc1JlZixMb2dQdHI+IHByZXZNYXAyOyAgLy8gdXNlZCB3aGlsZSBjb21taXR0aW5nL3Jlb3BlbmluZyBpcyBoYXBwZW5pbmcKKyAgcHJvdGVjdGVkIFRyYW5zYWN0aW9uTG9nIHByZXZNYXBMb2c7ICAvLyB0aGUgdHJhbnNhY3Rpb24gbG9nIHVzZWQgdG8gbG9vayB1cCBlbnRyaWVzIGZvdW5kIGluIHByZXZNYXAKKyAgcHJvdGVjdGVkIFRyYW5zYWN0aW9uTG9nIHByZXZNYXBMb2cyOyAgLy8gdGhlIHRyYW5zYWN0aW9uIGxvZyB1c2VkIHRvIGxvb2sgdXAgZW50cmllcyBmb3VuZCBpbiBwcmV2TWFwCiAKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtRGVsZXRlc1RvS2VlcCA9IDEwMDA7Ci0gIHByaXZhdGUgZmluYWwgaW50IG51bURlbGV0ZXNCeVF1ZXJ5VG9LZWVwID0gMTAwOworICBwcm90ZWN0ZWQgZmluYWwgaW50IG51bURlbGV0ZXNUb0tlZXAgPSAxMDAwOworICBwcm90ZWN0ZWQgZmluYWwgaW50IG51bURlbGV0ZXNCeVF1ZXJ5VG9LZWVwID0gMTAwOwogICBwdWJsaWMgZmluYWwgaW50IG51bVJlY29yZHNUb0tlZXAgPSAxMDA7CiAKICAgLy8ga2VlcCB0cmFjayBvZiBkZWxldGVzIG9ubHkuLi4gdGhpcyBpcyBub3QgdXBkYXRlZCBvbiBhbiBhZGQKLSAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPEJ5dGVzUmVmLCBMb2dQdHI+IG9sZERlbGV0ZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxCeXRlc1JlZiwgTG9nUHRyPihudW1EZWxldGVzVG9LZWVwKSB7CisgIHByb3RlY3RlZCBMaW5rZWRIYXNoTWFwPEJ5dGVzUmVmLCBMb2dQdHI+IG9sZERlbGV0ZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxCeXRlc1JlZiwgTG9nUHRyPihudW1EZWxldGVzVG9LZWVwKSB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgewogICAgICAgcmV0dXJuIHNpemUoKSA+IG51bURlbGV0ZXNUb0tlZXA7CkBAIC0xNDUsMjEgKzE2MCwyMSBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgTGlua2VkTGlzdDxEQlE+IGRlbGV0ZUJ5UXVlcmllcyA9IG5ldyBMaW5rZWRMaXN0PERCUT4oKTsKKyAgcHJvdGVjdGVkIExpbmtlZExpc3Q8REJRPiBkZWxldGVCeVF1ZXJpZXMgPSBuZXcgTGlua2VkTGlzdDxEQlE+KCk7CiAKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0bG9nRmlsZXM7Ci0gIHByaXZhdGUgRmlsZSB0bG9nRGlyOwotICBwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBnbG9iYWxTdHJpbmdzOworICBwcm90ZWN0ZWQgU3RyaW5nW10gdGxvZ0ZpbGVzOworICBwcm90ZWN0ZWQgRmlsZSB0bG9nRGlyOworICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdsb2JhbFN0cmluZ3M7CiAKLSAgcHJpdmF0ZSBTdHJpbmcgZGF0YURpcjsKLSAgcHJpdmF0ZSBTdHJpbmcgbGFzdERhdGFEaXI7CisgIHByb3RlY3RlZCBTdHJpbmcgZGF0YURpcjsKKyAgcHJvdGVjdGVkIFN0cmluZyBsYXN0RGF0YURpcjsKIAotICBwcml2YXRlIFZlcnNpb25JbmZvIHZlcnNpb25JbmZvOworICBwcm90ZWN0ZWQgVmVyc2lvbkluZm8gdmVyc2lvbkluZm87CiAKLSAgcHJpdmF0ZSBTeW5jTGV2ZWwgZGVmYXVsdFN5bmNMZXZlbCA9IFN5bmNMZXZlbC5GTFVTSDsKKyAgcHJvdGVjdGVkIFN5bmNMZXZlbCBkZWZhdWx0U3luY0xldmVsID0gU3luY0xldmVsLkZMVVNIOwogCiAgIHZvbGF0aWxlIFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXI7ICAgIC8vIGEgY29yZSByZWxvYWQgY2FuIGNoYW5nZSB0aGlzIHJlZmVyZW5jZSEKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNhbmNlbEFwcGx5QnVmZmVyVXBkYXRlOworICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBjYW5jZWxBcHBseUJ1ZmZlclVwZGF0ZTsKICAgTGlzdDxMb25nPiBzdGFydGluZ1ZlcnNpb25zOwogICBpbnQgc3RhcnRpbmdPcGVyYXRpb247ICAvLyBsYXN0IG9wZXJhdGlvbiBpbiB0aGUgbG9ncyBvbiBzdGFydHVwCiAKQEAgLTE4OSwxMyArMjA0LDE3IEBACiAgICAgZGVmYXVsdFN5bmNMZXZlbCA9IFN5bmNMZXZlbC5nZXRTeW5jTGV2ZWwoKFN0cmluZylpbmZvLmluaXRBcmdzLmdldCgic3luY0xldmVsIikpOwogICB9CiAKKyAgLyogTm90ZSwgd2hlbiB0aGlzIGlzIGNhbGxlZCwgdWhhbmRsZXIgaXMgbm90IGNvbXBsZXRlbHkgY29uc3RydWN0ZWQuCisgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBsb2cgaXMgY3JlYXRlZCwgb3IKKyAgICogZm9yIGFuIGV4aXN0aW5nIGxvZyB3aGVuZXZlciB0aGUgY29yZSBvciB1cGRhdGUgaGFuZGxlciBjaGFuZ2VzLgorICAgKi8KICAgcHVibGljIHZvaWQgaW5pdChVcGRhdGVIYW5kbGVyIHVoYW5kbGVyLCBTb2xyQ29yZSBjb3JlKSB7CiAgICAgLy8gdWxvZ0RpciBmcm9tIENvcmVEZXNjcmlwdG9yIG92ZXJyaWRlcwogICAgIFN0cmluZyB1bG9nRGlyID0gY29yZS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldFVsb2dEaXIoKTsKICAgICBpZiAodWxvZ0RpciAhPSBudWxsKSB7CiAgICAgICBkYXRhRGlyID0gdWxvZ0RpcjsKICAgICB9Ci0gICAgCisKICAgICBpZiAoZGF0YURpciA9PSBudWxsIHx8IGRhdGFEaXIubGVuZ3RoKCk9PTApIHsKICAgICAgIGRhdGFEaXIgPSBjb3JlLmdldERhdGFEaXIoKTsKICAgICB9CkBAIC0yNzYsOCArMjk1LDggQEAKIAogICB9CiAgIAotICBwdWJsaWMgRmlsZSBnZXRMb2dEaXIoKSB7Ci0gICAgcmV0dXJuIHRsb2dEaXI7CisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nRGlyKCkgeworICAgIHJldHVybiB0bG9nRGlyLmdldEFic29sdXRlUGF0aCgpOwogICB9CiAgIAogICBwdWJsaWMgTGlzdDxMb25nPiBnZXRTdGFydGluZ1ZlcnNpb25zKCkgewpAQCAtMjkxLDcgKzMxMCw3IEBACiAgIC8qIFRha2VzIG92ZXIgb3duZXJzaGlwIG9mIHRoZSBsb2csIGtlZXBpbmcgaXQgdW50aWwgbm8gbG9uZ2VyIG5lZWRlZAogICAgICBhbmQgdGhlbiBkZWNyZW1lbnRpbmcgaXQncyByZWZlcmVuY2UgYW5kIGRyb3BwaW5nIGl0LgogICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkZE9sZExvZyhUcmFuc2FjdGlvbkxvZyBvbGRMb2csIGJvb2xlYW4gcmVtb3ZlT2xkKSB7CisgIHByb3RlY3RlZCB2b2lkIGFkZE9sZExvZyhUcmFuc2FjdGlvbkxvZyBvbGRMb2csIGJvb2xlYW4gcmVtb3ZlT2xkKSB7CiAgICAgaWYgKG9sZExvZyA9PSBudWxsKSByZXR1cm47CiAKICAgICBudW1PbGRSZWNvcmRzICs9IG9sZExvZy5udW1SZWNvcmRzKCk7CkBAIC0zMjIsNyArMzQxLDcgQEAKICAgfQogCiAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRMb2dMaXN0KEZpbGUgZGlyZWN0b3J5KSB7CisgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2dMaXN0KEZpbGUgZGlyZWN0b3J5KSB7CiAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IFRMT0dfTkFNRSsnLic7CiAgICAgU3RyaW5nW10gbmFtZXMgPSBkaXJlY3RvcnkubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTMzMCw2ICszNDksOSBAQAogICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCk7CiAgICAgICB9CiAgICAgfSk7CisgICAgaWYgKG5hbWVzID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgfQogICAgIEFycmF5cy5zb3J0KG5hbWVzKTsKICAgICByZXR1cm4gbmFtZXM7CiAgIH0KQEAgLTU0MCw3ICs1NjIsNyBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBuZXdNYXAoKSB7CisgIHByb3RlY3RlZCB2b2lkIG5ld01hcCgpIHsKICAgICBwcmV2TWFwMiA9IHByZXZNYXA7CiAgICAgcHJldk1hcExvZzIgPSBwcmV2TWFwTG9nOwogCkBAIC03OTMsNyArODE1LDcgQEAKICAgfQogCiAKLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxvZygpIHsKKyAgcHJvdGVjdGVkIHZvaWQgZW5zdXJlTG9nKCkgewogICAgIGlmICh0bG9nID09IG51bGwpIHsKICAgICAgIFN0cmluZyBuZXdMb2dOYW1lID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuUk9PVCwgTE9HX0ZJTEVOQU1FX1BBVFRFUk4sIFRMT0dfTkFNRSwgaWQpOwogICAgICAgdGxvZyA9IG5ldyBUcmFuc2FjdGlvbkxvZyhuZXcgRmlsZSh0bG9nRGlyLCBuZXdMb2dOYW1lKSwgZ2xvYmFsU3RyaW5ncyk7CkBAIC05NjgsNiArOTkwLDggQEAKICAgICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiByZXZlcnNlIHJlYWRpbmcgbG9nIiwgZXgpOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtVXBkYXRlcysrOwogICAgICAgICAgIH0KIAogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xMTM5LDcgKzExNjMsNyBAQAogCiAKIAotICBwcml2YXRlIFJlY292ZXJ5SW5mbyByZWNvdmVyeUluZm87CisgIHByb3RlY3RlZCBSZWNvdmVyeUluZm8gcmVjb3ZlcnlJbmZvOwogCiAgIGNsYXNzIExvZ1JlcGxheWVyIGltcGxlbWVudHMgUnVubmFibGUgewogICAgIHByaXZhdGUgTG9nZ2VyIGxvZ2xvZyA9IGxvZzsgIC8vIHNldCB0byBzb21ldGhpbmcgZGlmZmVyZW50PwpAQCAtMTQxNiw3ICsxNDQwLDcgQEAKICAgICB9CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUbG9nRGlyKFNvbHJDb3JlIGNvcmUsIFBsdWdpbkluZm8gaW5mbykgeworICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRsb2dEaXIoU29sckNvcmUgY29yZSwgUGx1Z2luSW5mbyBpbmZvKSB7CiAgICAgU3RyaW5nIGRhdGFEaXIgPSAoU3RyaW5nKSBpbmZvLmluaXRBcmdzLmdldCgiZGlyIik7CiAgICAgCiAgICAgU3RyaW5nIHVsb2dEaXIgPSBjb3JlLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0VWxvZ0RpcigpOwpAQCAtMTQyNywxMSArMTQ1MSwzMCBAQAogICAgIGlmIChkYXRhRGlyID09IG51bGwgfHwgZGF0YURpci5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICBkYXRhRGlyID0gY29yZS5nZXREYXRhRGlyKCk7CiAgICAgfQotICAgIAotICAgIHJldHVybiBuZXcgRmlsZShkYXRhRGlyLCBUTE9HX05BTUUpOworCisgICAgcmV0dXJuIGRhdGFEaXIgKyAiLyIgKyBUTE9HX05BTUU7CisgIH0KKyAgCisgIC8qKgorICAgKiBDbGVhcnMgdGhlIGxvZ3Mgb24gdGhlIGZpbGUgc3lzdGVtLiBPbmx5IGNhbGwgYmVmb3JlIGluaXQuCisgICAqIAorICAgKiBAcGFyYW0gY29yZSB0aGUgU29sckNvcmUKKyAgICogQHBhcmFtIHVsb2dQbHVnaW5JbmZvIHRoZSBpbml0IGluZm8gZm9yIHRoZSBVcGRhdGVIYW5kbGVyCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhckxvZyhTb2xyQ29yZSBjb3JlLCBQbHVnaW5JbmZvIHVsb2dQbHVnaW5JbmZvKSB7CisgICAgaWYgKHVsb2dQbHVnaW5JbmZvID09IG51bGwpIHJldHVybjsKKyAgICBGaWxlIHRsb2dEaXIgPSBuZXcgRmlsZShnZXRUbG9nRGlyKGNvcmUsIHVsb2dQbHVnaW5JbmZvKSk7CisgICAgaWYgKHRsb2dEaXIuZXhpc3RzKCkpIHsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gZ2V0TG9nTGlzdCh0bG9nRGlyKTsKKyAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh0bG9nRGlyLCBmaWxlKTsKKyAgICAgICAgYm9vbGVhbiBzID0gZi5kZWxldGUoKTsKKyAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3QgcmVtb3ZlIHRsb2cgZmlsZToiICsgZik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAgIH0KICAgCiB9CiAKLQotCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0FkZFNjaGVtYUZpZWxkc1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjg4Y2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0FkZFNjaGVtYUZpZWxkc1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuU29sclF1ZXJ5UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLk1hbmFnZWRJbmRleFNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUuQWRkVXBkYXRlQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5TZWxlY3RvclBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLkZpZWxkTmFtZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLnBsdWdpbi5Tb2xyQ29yZUF3YXJlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5CQURfUkVRVUVTVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uLkVycm9yQ29kZS5TRVJWRVJfRVJST1I7CisKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgcHJvY2Vzc29yIHdpbGwgZHluYW1pY2FsbHkgYWRkIGZpZWxkcyB0byB0aGUgc2NoZW1hIGlmIGFuIGlucHV0IGRvY3VtZW50IGNvbnRhaW5zCisgKiBvbmUgb3IgbW9yZSBmaWVsZHMgdGhhdCBkb24ndCBtYXRjaCBhbnkgZmllbGQgb3IgZHluYW1pYyBmaWVsZCBpbiB0aGUgc2NoZW1hLgorICogPC9wPgorICogPHA+CisgKiBCeSBkZWZhdWx0LCB0aGlzIHByb2Nlc3NvciBzZWxlY3RzIGFsbCBmaWVsZHMgdGhhdCBkb24ndCBtYXRjaCBhIHNjaGVtYSBmaWVsZCBvcgorICogZHluYW1pYyBmaWVsZC4gIFRoZSAiZmllbGROYW1lIiBhbmQgImZpZWxkUmVnZXgiIHNlbGVjdG9ycyBtYXkgYmUgc3BlY2lmaWVkIHRvIGZ1cnRoZXIKKyAqIHJlc3RyaWN0IHRoZSBzZWxlY3RlZCBmaWVsZHMsIGJ1dCB0aGUgb3RoZXIgc2VsZWN0b3JzICgidHlwZU5hbWUiLCAidHlwZUNsYXNzIiwgYW5kCisgKiAiZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkIikgbWF5IG5vdCBiZSBzcGVjaWZpZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgdG8gbWFwIGZyb20gZWFjaCBmaWVsZCdzIHZhbHVlcycgY2xhc3MoZXMpIHRvIHRoZSBzY2hlbWEKKyAqIGZpZWxkIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhlIG5ldyBmaWVsZCB0byB0aGUgc2NoZW1hLiAgQWxsIG5ldyBmaWVsZHMKKyAqIGFyZSB0aGVuIGFkZGVkIHRvIHRoZSBzY2hlbWEgaW4gYSBzaW5nbGUgYmF0Y2guICBJZiBzY2hlbWEgYWRkaXRpb24gZmFpbHMgZm9yIGFueQorICogZmllbGQsIGFkZGl0aW9uIGlzIHJlLWF0dGVtcHRlZCBvbmx5IGZvciB0aG9zZSB0aGF0IGRvbuKAmXQgbWF0Y2ggYW55IHNjaGVtYQorICogZmllbGQuICBUaGlzIHByb2Nlc3MgaXMgcmVwZWF0ZWQsIGVpdGhlciB1bnRpbCBhbGwgbmV3IGZpZWxkcyBhcmUgc3VjY2Vzc2Z1bGx5IGFkZGVkLAorICogb3IgdW50aWwgdGhlcmUgYXJlIG5vIG5ldyBmaWVsZHMgKHByZXN1bWFibHkgYmVjYXVzZSB0aGUgZmllbGRzIHRoYXQgd2VyZSBuZXcgd2hlbgorICogdGhpcyBwcm9jZXNzb3Igc3RhcnRlZCBpdHMgd29yayB3ZXJlIHN1YnNlcXVlbnRseSBhZGRlZCBieSBhIGRpZmZlcmVudCB1cGRhdGUKKyAqIHJlcXVlc3QsIHBvc3NpYmx5IG9uIGEgZGlmZmVyZW50IG5vZGUpLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIHByb2Nlc3NvciB0YWtlcyBhcyBjb25maWd1cmF0aW9uIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlICJ0eXBlTWFwcGluZyItcyBmcm9tCisgKiBvbmUgb3IgbW9yZSAidmFsdWVDbGFzcyItcywgc3BlY2lmaWVkIGFzIGVpdGhlciBhbiAmbHQ7YXJyJmd0OyBvZiAmbHQ7c3RyJmd0Oywgb3IKKyAqIG11bHRpcGxlICZsdDtzdHImZ3Q7IHdpdGggdGhlIHNhbWUgbmFtZSwgdG8gYW4gZXhpc3Rpbmcgc2NoZW1hICJmaWVsZFR5cGUiLgorICogPC9wPgorICogPHA+CisgKiBJZiBtb3JlIHRoYW4gb25lICJ2YWx1ZUNsYXNzIiBpcyBzcGVjaWZpZWQgaW4gYSAidHlwZU1hcHBpbmciLCBmaWVsZCB2YWx1ZXMgd2l0aCBhbnkKKyAqIG9mIHRoZSBzcGVjaWZpZWQgInZhbHVlQ2xhc3MiLXMgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgImZpZWxkVHlwZSIuCisgKiBUaGUgInR5cGVNYXBwaW5nIi1zIGFyZSBhdHRlbXB0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlcjsgaWYgYSBmaWVsZCB2YWx1ZSdzIGNsYXNzCisgKiBpcyBub3Qgc3BlY2lmaWVkIGluIGEgInZhbHVlQ2xhc3MiLCB0aGUgbmV4dCAidHlwZU1hcHBpbmciIGlzIGF0dGVtcHRlZC4gSWYgbm8KKyAqICJ0eXBlTWFwcGluZyIgc3VjY2VlZHMsIHRoZW4gdGhlIHNwZWNpZmllZCAiZGVmYXVsdEZpZWxkVHlwZSIgaXMgdXNlZC4gCisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUgY29uZmlndXJhdGlvbjoKKyAqIDwvcD4KKyAqIAorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb2Nlc3NvciBjbGFzcz0ic29sci5BZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiZndDsKKyAqICAgJmx0O3N0ciBuYW1lPSJkZWZhdWx0RmllbGRUeXBlIiZndDt0ZXh0X2dlbmVyYWwmbHQ7L3N0ciZndDsKKyAqICAgJmx0O2xzdCBuYW1lPSJ0eXBlTWFwcGluZyImZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJ2YWx1ZUNsYXNzIiZndDtCb29sZWFuJmx0Oy9zdHImZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJmaWVsZFR5cGUiJmd0O2Jvb2xlYW4mbHQ7L3N0ciZndDsKKyAqICAgJmx0Oy9sc3QmZ3Q7CisgKiAgICZsdDtsc3QgbmFtZT0idHlwZU1hcHBpbmciJmd0OworICogICAgICZsdDtzdHIgbmFtZT0idmFsdWVDbGFzcyImZ3Q7SW50ZWdlciZsdDsvc3RyJmd0OworICogICAgICZsdDtzdHIgbmFtZT0iZmllbGRUeXBlIiZndDt0aW50Jmx0Oy9zdHImZ3Q7CisgKiAgICZsdDsvbHN0Jmd0OworICogICAmbHQ7bHN0IG5hbWU9InR5cGVNYXBwaW5nIiZndDsKKyAqICAgICAmbHQ7c3RyIG5hbWU9InZhbHVlQ2xhc3MiJmd0O0Zsb2F0Jmx0Oy9zdHImZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJmaWVsZFR5cGUiJmd0O3RmbG9hdCZsdDsvc3RyJmd0OworICogICAmbHQ7L2xzdCZndDsKKyAqICAgJmx0O2xzdCBuYW1lPSJ0eXBlTWFwcGluZyImZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJ2YWx1ZUNsYXNzIiZndDtEYXRlJmx0Oy9zdHImZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJmaWVsZFR5cGUiJmd0O3RkYXRlJmx0Oy9zdHImZ3Q7CisgKiAgICZsdDsvbHN0Jmd0OworICogICAmbHQ7bHN0IG5hbWU9InR5cGVNYXBwaW5nIiZndDsKKyAqICAgICAmbHQ7c3RyIG5hbWU9InZhbHVlQ2xhc3MiJmd0O0xvbmcmbHQ7L3N0ciZndDsKKyAqICAgICAmbHQ7c3RyIG5hbWU9InZhbHVlQ2xhc3MiJmd0O0ludGVnZXImbHQ7L3N0ciZndDsKKyAqICAgICAmbHQ7c3RyIG5hbWU9ImZpZWxkVHlwZSImZ3Q7dGxvbmcmbHQ7L3N0ciZndDsKKyAqICAgJmx0Oy9sc3QmZ3Q7CisgKiAgICZsdDtsc3QgbmFtZT0idHlwZU1hcHBpbmciJmd0OworICogICAgICZsdDthcnIgbmFtZT0idmFsdWVDbGFzcyImZ3Q7CisgKiAgICAgICAmbHQ7c3RyJmd0O0RvdWJsZSZsdDsvc3RyJmd0OworICogICAgICAgJmx0O3N0ciZndDtGbG9hdCZsdDsvc3RyJmd0OworICogICAgICZsdDsvYXJyJmd0OworICogICAgICZsdDtzdHIgbmFtZT0iZmllbGRUeXBlIiZndDt0ZG91YmxlJmx0Oy9zdHImZ3Q7CisgKiAgICZsdDsvbHN0Jmd0OworICogJmx0Oy9wcm9jZXNzb3ImZ3Q7PC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBBZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IGV4dGVuZHMgVXBkYXRlUmVxdWVzdFByb2Nlc3NvckZhY3RvcnkgaW1wbGVtZW50cyBTb2xyQ29yZUF3YXJlIHsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19QQVJBTSA9ICJ0eXBlTWFwcGluZyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9DTEFTU19QQVJBTSA9ICJ2YWx1ZUNsYXNzIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1RZUEVfUEFSQU0gPSAiZmllbGRUeXBlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRklFTERfVFlQRV9QQVJBTSA9ICJkZWZhdWx0RmllbGRUeXBlIjsKKyAgCisgIHByaXZhdGUgTGlzdDxUeXBlTWFwcGluZz4gdHlwZU1hcHBpbmdzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgIHByaXZhdGUgU2VsZWN0b3JQYXJhbXMgaW5jbHVzaW9ucyA9IG5ldyBTZWxlY3RvclBhcmFtcygpOworICBwcml2YXRlIENvbGxlY3Rpb248U2VsZWN0b3JQYXJhbXM+IGV4Y2x1c2lvbnMgPSBuZXcgQXJyYXlMaXN0PFNlbGVjdG9yUGFyYW1zPigpOworICBwcml2YXRlIEZpZWxkTmFtZVNlbGVjdG9yIHNlbGVjdG9yID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZpZWxkVHlwZTsKKworICBwcm90ZWN0ZWQgZmluYWwgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5GaWVsZE5hbWVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKKyAgICBpZiAobnVsbCAhPSBzZWxlY3RvcikgcmV0dXJuIHNlbGVjdG9yOworICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgInNlbGVjdG9yIHdhcyBuZXZlciBpbml0aWFsaXplZCwgaW5mb3JtKFNvbHJDb3JlKSBuZXZlciBjYWxsZWQ/Pz8iKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBnZXRJbnN0YW5jZShTb2xyUXVlcnlSZXF1ZXN0IHJlcSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJzcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgbmV4dCkgeworICAgIHJldHVybiBuZXcgQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yKG5leHQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoTmFtZWRMaXN0IGFyZ3MpIHsKKyAgICBpbmNsdXNpb25zID0gRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkucGFyc2VTZWxlY3RvclBhcmFtcyhhcmdzKTsKKyAgICB2YWxpZGF0ZVNlbGVjdG9yUGFyYW1zKGluY2x1c2lvbnMpOworICAgIGluY2x1c2lvbnMuZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkID0gZmFsc2U7ICAvLyBFeHBsaWNpdGx5IChub24tY29uZmlndXJhYmx5KSByZXF1aXJlIHVua25vd24gZmllbGQgbmFtZXMKKyAgICBleGNsdXNpb25zID0gRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkucGFyc2VTZWxlY3RvckV4Y2x1c2lvblBhcmFtcyhhcmdzKTsKKyAgICBmb3IgKFNlbGVjdG9yUGFyYW1zIGV4Y2x1c2lvbiA6IGV4Y2x1c2lvbnMpIHsKKyAgICAgIHZhbGlkYXRlU2VsZWN0b3JQYXJhbXMoZXhjbHVzaW9uKTsKKyAgICB9CisgICAgT2JqZWN0IGRlZmF1bHRGaWVsZFR5cGVQYXJhbSA9IGFyZ3MucmVtb3ZlKERFRkFVTFRfRklFTERfVFlQRV9QQVJBTSk7CisgICAgaWYgKG51bGwgPT0gZGVmYXVsdEZpZWxkVHlwZVBhcmFtKSB7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICJNaXNzaW5nIHJlcXVpcmVkIGluaXQgcGFyYW0gJyIgKyBERUZBVUxUX0ZJRUxEX1RZUEVfUEFSQU0gKyAiJyIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoICEgKGRlZmF1bHRGaWVsZFR5cGVQYXJhbSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLCAiSW5pdCBwYXJhbSAnIiArIERFRkFVTFRfRklFTERfVFlQRV9QQVJBTSArICInIG11c3QgYmUgYSA8c3RyPiIpOworICAgICAgfQorICAgIH0KKyAgICBkZWZhdWx0RmllbGRUeXBlID0gZGVmYXVsdEZpZWxkVHlwZVBhcmFtLnRvU3RyaW5nKCk7CisKKyAgICB0eXBlTWFwcGluZ3MgPSBwYXJzZVR5cGVNYXBwaW5ncyhhcmdzKTsKKworICAgIHN1cGVyLmluaXQoYXJncyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5mb3JtKFNvbHJDb3JlIGNvcmUpIHsKKyAgICBzZWxlY3RvciA9IEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuY3JlYXRlRmllbGROYW1lU2VsZWN0b3IKKyAgICAgICAgKGNvcmUuZ2V0UmVzb3VyY2VMb2FkZXIoKSwgY29yZSwgaW5jbHVzaW9ucywgZ2V0RGVmYXVsdFNlbGVjdG9yKGNvcmUpKTsKKworICAgIGZvciAoU2VsZWN0b3JQYXJhbXMgZXhjIDogZXhjbHVzaW9ucykgeworICAgICAgc2VsZWN0b3IgPSBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLndyYXAoc2VsZWN0b3IsIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuY3JlYXRlRmllbGROYW1lU2VsZWN0b3IKKyAgICAgICAgICAoY29yZS5nZXRSZXNvdXJjZUxvYWRlcigpLCBjb3JlLCBleGMsIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuU0VMRUNUX05PX0ZJRUxEUykpOworICAgIH0KKworICAgIGZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiB0eXBlTWFwcGluZ3MpIHsKKyAgICAgIHR5cGVNYXBwaW5nLnBvcHVsYXRlVmFsdWVDbGFzc2VzKGNvcmUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRmllbGROYW1lU2VsZWN0b3IgZ2V0RGVmYXVsdFNlbGVjdG9yKGZpbmFsIFNvbHJDb3JlIGNvcmUpIHsKKyAgICByZXR1cm4gbmV3IEZpZWxkTmFtZVNlbGVjdG9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRNdXRhdGUoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBjb3JlLmdldExhdGVzdFNjaGVtYSgpLmdldEZpZWxkVHlwZU5vRXgoZmllbGROYW1lKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUeXBlTWFwcGluZz4gcGFyc2VUeXBlTWFwcGluZ3MoTmFtZWRMaXN0IGFyZ3MpIHsKKyAgICBMaXN0PFR5cGVNYXBwaW5nPiB0eXBlTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFR5cGVNYXBwaW5nPigpOworICAgIExpc3Q8T2JqZWN0PiB0eXBlTWFwcGluZ3NQYXJhbXMgPSBhcmdzLmdldEFsbChUWVBFX01BUFBJTkdfUEFSQU0pOworICAgIGZvciAoT2JqZWN0IHR5cGVNYXBwaW5nT2JqIDogdHlwZU1hcHBpbmdzUGFyYW1zKSB7CisgICAgICBpZiAobnVsbCA9PSB0eXBlTWFwcGluZ09iaikgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICInIiArIFRZUEVfTUFQUElOR19QQVJBTSArICInIGluaXQgcGFyYW0gY2Fubm90IGJlIG51bGwiKTsKKyAgICAgIH0KKyAgICAgIGlmICggISAodHlwZU1hcHBpbmdPYmogaW5zdGFuY2VvZiBOYW1lZExpc3QpICkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICInIiArIFRZUEVfTUFQUElOR19QQVJBTSArICInIGluaXQgcGFyYW0gbXVzdCBiZSBhIDxsc3Q+Iik7CisgICAgICB9CisgICAgICBOYW1lZExpc3QgdHlwZU1hcHBpbmdOYW1lZExpc3QgPSAoTmFtZWRMaXN0KXR5cGVNYXBwaW5nT2JqOworCisgICAgICBPYmplY3QgZmllbGRUeXBlT2JqID0gdHlwZU1hcHBpbmdOYW1lZExpc3QucmVtb3ZlKEZJRUxEX1RZUEVfUEFSQU0pOworICAgICAgaWYgKG51bGwgPT0gZmllbGRUeXBlT2JqKSB7CisgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICJFYWNoICciICsgVFlQRV9NQVBQSU5HX1BBUkFNICsgIicgPGxzdC8+IG11c3QgY29udGFpbiBhICciICsgRklFTERfVFlQRV9QQVJBTSArICInIDxzdHI+Iik7CisgICAgICB9CisgICAgICBpZiAoICEgKGZpZWxkVHlwZU9iaiBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLCAiJyIgKyBGSUVMRF9UWVBFX1BBUkFNICsgIicgaW5pdCBwYXJhbSBtdXN0IGJlIGEgPHN0cj4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChudWxsICE9IHR5cGVNYXBwaW5nTmFtZWRMaXN0LmdldChGSUVMRF9UWVBFX1BBUkFNKSkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsCisgICAgICAgICAgICAiRWFjaCAnIiArIFRZUEVfTUFQUElOR19QQVJBTSArICInIDxsc3QvPiBtdXN0IGNvbnRhaW4gYSAnIiArIEZJRUxEX1RZUEVfUEFSQU0gKyAiJyA8c3RyPiIpOworICAgICAgfQorICAgICAgU3RyaW5nIGZpZWxkVHlwZSA9IGZpZWxkVHlwZU9iai50b1N0cmluZygpOworCisgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVDbGFzc2VzCisgICAgICAgICAgPSBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5vbmVPck1hbnkodHlwZU1hcHBpbmdOYW1lZExpc3QsIFZBTFVFX0NMQVNTX1BBUkFNKTsKKyAgICAgIGlmICh2YWx1ZUNsYXNzZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgCisgICAgICAgICAgICAiRWFjaCAnIiArIFRZUEVfTUFQUElOR19QQVJBTSArICInIDxsc3QvPiBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICciICsgVkFMVUVfQ0xBU1NfUEFSQU0gKyAiJyA8c3RyPiIpOworICAgICAgfQorICAgICAgdHlwZU1hcHBpbmdzLmFkZChuZXcgVHlwZU1hcHBpbmcoZmllbGRUeXBlLCB2YWx1ZUNsYXNzZXMpKTsKKworICAgICAgaWYgKDAgIT0gdHlwZU1hcHBpbmdOYW1lZExpc3Quc2l6ZSgpKSB7CisgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgCisgICAgICAgICAgICAiVW5leHBlY3RlZCAnIiArIFRZUEVfTUFQUElOR19QQVJBTSArICInIGluaXQgc3ViLXBhcmFtKHMpOiAnIiArIHR5cGVNYXBwaW5nTmFtZWRMaXN0LnRvU3RyaW5nKCkgKyAiJyIpOworICAgICAgfQorICAgICAgYXJncy5yZW1vdmUoVFlQRV9NQVBQSU5HX1BBUkFNKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVNYXBwaW5nczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNlbGVjdG9yUGFyYW1zKFNlbGVjdG9yUGFyYW1zIHBhcmFtcykgeworICAgIGlmICggISBwYXJhbXMudHlwZU5hbWUuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICIndHlwZU5hbWUnIGluaXQgcGFyYW0gaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBwcm9jZXNzb3IiKTsKKyAgICB9CisgICAgaWYgKCAhIHBhcmFtcy50eXBlQ2xhc3MuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICIndHlwZUNsYXNzJyBpbml0IHBhcmFtIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcHJvY2Vzc29yIik7CisgICAgfQorICAgIGlmIChudWxsICE9IHBhcmFtcy5maWVsZE5hbWVNYXRjaGVzU2NoZW1hRmllbGQpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgIidmaWVsZE5hbWVNYXRjaGVzU2NoZW1hRmllbGQnIGluaXQgcGFyYW0gaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBwcm9jZXNzb3IiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlTWFwcGluZyB7CisgICAgcHVibGljIFN0cmluZyBmaWVsZFR5cGVOYW1lOworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVDbGFzc05hbWVzOworICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IHZhbHVlQ2xhc3NlczsKKworICAgIHB1YmxpYyBUeXBlTWFwcGluZyhTdHJpbmcgZmllbGRUeXBlTmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlQ2xhc3NOYW1lcykgeworICAgICAgdGhpcy5maWVsZFR5cGVOYW1lID0gZmllbGRUeXBlTmFtZTsKKyAgICAgIHRoaXMudmFsdWVDbGFzc05hbWVzID0gdmFsdWVDbGFzc05hbWVzOworICAgICAgLy8gdGhpcy52YWx1ZUNsYXNzZXMgcG9wdWxhdGlvbiBpcyBkZWxheWVkIHVudGlsIHRoZSBzY2hlbWEgaXMgYXZhaWxhYmxlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVWYWx1ZUNsYXNzZXMoU29sckNvcmUgY29yZSkgeworICAgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gY29yZS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNvcmUuZ2V0UmVzb3VyY2VMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgaWYgKG51bGwgPT0gc2NoZW1hLmdldEZpZWxkVHlwZUJ5TmFtZShmaWVsZFR5cGVOYW1lKSkgeworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsICJmaWVsZFR5cGUgJyIgKyBmaWVsZFR5cGVOYW1lICsgIicgbm90IGZvdW5kIGluIHRoZSBzY2hlbWEiKTsKKyAgICAgIH0KKyAgICAgIHZhbHVlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgZm9yIChTdHJpbmcgdmFsdWVDbGFzc05hbWUgOiB2YWx1ZUNsYXNzTmFtZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB2YWx1ZUNsYXNzZXMuYWRkKGxvYWRlci5sb2FkQ2xhc3ModmFsdWVDbGFzc05hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAidmFsdWVDbGFzcyAnIiArIHZhbHVlQ2xhc3NOYW1lICsgIicgbm90IGZvdW5kIGZvciBmaWVsZFR5cGUgJyIgKyBmaWVsZFR5cGVOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY2xhc3MgQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yIGV4dGVuZHMgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciB7CisgICAgcHVibGljIEFkZFNjaGVtYUZpZWxkc1VwZGF0ZVByb2Nlc3NvcihVcGRhdGVSZXF1ZXN0UHJvY2Vzc29yIG5leHQpIHsKKyAgICAgIHN1cGVyKG5leHQpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQWRkKEFkZFVwZGF0ZUNvbW1hbmQgY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKCAhIGNtZC5nZXRSZXEoKS5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCkuaXNNdXRhYmxlKCkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVGhpcyBJbmRleFNjaGVtYSBpcyBub3QgbXV0YWJsZS4iOworICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihCQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgICBmaW5hbCBTb2xySW5wdXREb2N1bWVudCBkb2MgPSBjbWQuZ2V0U29scklucHV0RG9jdW1lbnQoKTsKKyAgICAgIGZpbmFsIFNvbHJDb3JlIGNvcmUgPSBjbWQuZ2V0UmVxKCkuZ2V0Q29yZSgpOworICAgICAgZm9yICg7OykgeworICAgICAgICBmaW5hbCBJbmRleFNjaGVtYSBvbGRTY2hlbWEgPSBjb3JlLmdldExhdGVzdFNjaGVtYSgpOworICAgICAgICBMaXN0PFNjaGVtYUZpZWxkPiBuZXdGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFNjaGVtYUZpZWxkPigpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUgOiBkb2MuZ2V0RmllbGROYW1lcygpKSB7CisgICAgICAgICAgaWYgKHNlbGVjdG9yLnNob3VsZE11dGF0ZShmaWVsZE5hbWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgZmllbGRUeXBlTmFtZSA9IG1hcFZhbHVlQ2xhc3Nlc1RvRmllbGRUeXBlKGRvYy5nZXRGaWVsZChmaWVsZE5hbWUpKTsKKyAgICAgICAgICAgIG5ld0ZpZWxkcy5hZGQob2xkU2NoZW1hLm5ld0ZpZWxkKGZpZWxkTmFtZSwgZmllbGRUeXBlTmFtZSwgQ29sbGVjdGlvbnMuPFN0cmluZyxPYmplY3Q+ZW1wdHlNYXAoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmV3RmllbGRzLmlzRW1wdHkoKSkgeworICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gLSBubyBmaWVsZHMgd2lsbCBiZSBhZGRlZCAtIGV4aXQgZnJvbSB0aGUgcmV0cnkgbG9vcAorICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gZmllbGRzIHRvIGFkZCB0byB0aGUgc2NoZW1hLiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIkZpZWxkcyB0byBiZSBhZGRlZCB0byB0aGUgc2NoZW1hOiBbIik7CisgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKFNjaGVtYUZpZWxkIGZpZWxkIDogbmV3RmllbGRzKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpc0ZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ7dHlwZT0iKS5hcHBlbmQoZmllbGQuZ2V0VHlwZSgpLmdldFR5cGVOYW1lKCkpLmFwcGVuZCgifSIpOworICAgICAgICAgIH0KKyAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworICAgICAgICAgIGxvZy5kZWJ1ZyhidWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgSW5kZXhTY2hlbWEgbmV3U2NoZW1hID0gb2xkU2NoZW1hLmFkZEZpZWxkcyhuZXdGaWVsZHMpOworICAgICAgICAgIGNtZC5nZXRSZXEoKS5nZXRDb3JlKCkuc2V0TGF0ZXN0U2NoZW1hKG5ld1NjaGVtYSk7CisgICAgICAgICAgY21kLmdldFJlcSgpLnVwZGF0ZVNjaGVtYVRvTGF0ZXN0KCk7CisgICAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgYWRkZWQgZmllbGQocykgdG8gdGhlIHNjaGVtYS4iKTsKKyAgICAgICAgICBicmVhazsgLy8gc3VjY2VzcyAtIGV4aXQgZnJvbSB0aGUgcmV0cnkgbG9vcAorICAgICAgICB9IGNhdGNoKE1hbmFnZWRJbmRleFNjaGVtYS5GaWVsZEV4aXN0c0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLmRlYnVnKCJBdCBsZWFzdCBvbmUgZmllbGQgdG8gYmUgYWRkZWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHNjaGVtYSAtIHJldHJ5aW5nLiIpOworICAgICAgICAgIC8vIE5vIGFjdGlvbjogYXQgbGVhc3Qgb25lIGZpZWxkIHRvIGJlIGFkZGVkIGFscmVhZHkgZXhpc3RzIGluIHRoZSBzY2hlbWEsIHNvIHJldHJ5IAorICAgICAgICB9CisgICAgICB9CisgICAgICBzdXBlci5wcm9jZXNzQWRkKGNtZCk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBwcml2YXRlIFN0cmluZyBtYXBWYWx1ZUNsYXNzZXNUb0ZpZWxkVHlwZShTb2xySW5wdXRGaWVsZCBmaWVsZCkgeworICAgICAgTkVYVF9UWVBFX01BUFBJTkc6IGZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiB0eXBlTWFwcGluZ3MpIHsKKyAgICAgICAgTkVYVF9GSUVMRF9WQUxVRTogZm9yIChPYmplY3QgZmllbGRWYWx1ZSA6IGZpZWxkLmdldFZhbHVlcygpKSB7CisgICAgICAgICAgZm9yIChDbGFzczw/PiB2YWx1ZUNsYXNzIDogdHlwZU1hcHBpbmcudmFsdWVDbGFzc2VzKSB7CisgICAgICAgICAgICBpZiAodmFsdWVDbGFzcy5pc0luc3RhbmNlKGZpZWxkVmFsdWUpKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlIE5FWFRfRklFTERfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFRoaXMgZmllbGRWYWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYW55IG9mIHRoaXMgZmllbGRUeXBlJ3MgdmFsdWVDbGFzcy1zCisgICAgICAgICAgY29udGludWUgTkVYVF9UWVBFX01BUFBJTkc7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3VjY2VzcyEgRWFjaCBvZiB0aGlzIGZpZWxkJ3MgdmFsdWVzIGlzIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGlzIGZpZWxkVHlwZSdzIHZhbHVlQ2xhc3MtcworICAgICAgICByZXR1cm4gdHlwZU1hcHBpbmcuZmllbGRUeXBlTmFtZTsKKyAgICAgIH0KKyAgICAgIC8vIEF0IGxlYXN0IG9uZSBvZiB0aGlzIGZpZWxkJ3MgdmFsdWVzIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBhbnkgY29uZmlndXJlZCBmaWVsZFR5cGUncyB2YWx1ZUNsYXNzLXMKKyAgICAgIHJldHVybiBkZWZhdWx0RmllbGRUeXBlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0FsbFZhbHVlc09yTm9uZUZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9BbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5NjliMAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9BbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXRGaWVsZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworICAgICAgICAgICAgICAgICAgIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBBYnN0cmFjdCBzdWJjbGFzcyBvZiBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yIGZvciBpbXBsZW1lbnRpbmcgCisgKiBVcGRhdGVQcm9jZXNzb3JzIHRoYXQgd2lsbCBtdXRhdGUgYWxsIGluZGl2aWR1YWwgdmFsdWVzIG9mIGEgc2VsZWN0ZWQgCisgKiBmaWVsZCBpbmRlcGVuZGVudGx5LiAgSWYgbm90IGFsbCBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgYWNjZXB0YWJsZQorICogLSBpLmUuLCBtdXRhdGVWYWx1ZShzcmNWYWwpIHJldHVybnMge0BsaW5rICNTS0lQX0ZJRUxEX1ZBTFVFX0xJU1RfU0lOR0xFVE9OfQorICogZm9yIGF0IGxlYXN0IG9uZSB2YWx1ZSAtIHRoZW4gbm9uZSBvZiB0aGUgdmFsdWVzIGFyZSBtdXRhdGVkOgorICogbXV0YXRlKHNyY0ZpZWxkKSB3aWxsIHJldHVybiBzcmNGaWVsZC4KKyAqCisgKiBAc2VlIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3JGYWN0b3J5CisgKiBAc2VlIEZpZWxkVmFsdWVNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWxsVmFsdWVzT3JOb25lRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvciBleHRlbmRzIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBERUxFVEVfVkFMVUVfU0lOR0xFVE9OID0gbmV3IE9iamVjdCgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuICIhIVNpbmdsZXRvbiBPYmplY3QgVHJpZ2dlcmluZyBWYWx1ZSBEZWxldGlvbiEhIjsKKyAgICB9CisgIH07CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTj0gbmV3IE9iamVjdCgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuICIhIVNpbmdsZXRvbiBPYmplY3QgVHJpZ2dlcmluZyBTa2lwcGluZyBGaWVsZCBNdXRhdGlvbiEhIjsKKyAgICB9CisgIH07CisKKworICBwdWJsaWMgQWxsVmFsdWVzT3JOb25lRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvcihGaWVsZE5hbWVTZWxlY3RvciBzZWxlY3RvciwgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgc3VwZXIoc2VsZWN0b3IsIG5leHQpOworICB9CisKKyAgLyoqCisgICAqIE11dGF0ZXMgaW5kaXZpZHVhbCB2YWx1ZXMgb2YgYSBmaWVsZCBhcyBuZWVkZWQsIG9yIHJldHVybnMgdGhlIG9yaWdpbmFsIAorICAgKiB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIHNyY1ZhbCBhIHZhbHVlIGZyb20gYSBtYXRjaGVkIGZpZWxkIHdoaWNoIHNob3VsZCBiZSBtdXRhdGVkCisgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHVzZSBhcyBhIHJlcGxhY2VtZW50IGZvciBzcmMsIG9yIAorICAgKiAgICAgICAgIDxjb2RlPkRFTEVURV9WQUxVRV9TSU5HTEVUT048L2NvZGU+IHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIAorICAgKiAgICAgICAgIHNob3VsZCBiZSByZW1vdmVkIGNvbXBsZXRlbHksIG9yCisgICAqICAgICAgICAgPGNvZGU+U0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdAorICAgKiAgICAgICAgIGEgZmllbGQgdmFsdWUgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCAKKyAgICogQHNlZSAjREVMRVRFX1ZBTFVFX1NJTkdMRVRPTgorICAgKiBAc2VlICNTS0lQX0ZJRUxEX1ZBTFVFX0xJU1RfU0lOR0xFVE9OCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IG11dGF0ZVZhbHVlKGZpbmFsIE9iamVjdCBzcmNWYWwpOworCisgIHByb3RlY3RlZCBmaW5hbCBTb2xySW5wdXRGaWVsZCBtdXRhdGUoZmluYWwgU29scklucHV0RmllbGQgc3JjRmllbGQpIHsKKyAgICBMaXN0PFN0cmluZz4gbWVzc2FnZXMgPSBudWxsOworICAgIFNvbHJJbnB1dEZpZWxkIHJlc3VsdCA9IG5ldyBTb2xySW5wdXRGaWVsZChzcmNGaWVsZC5nZXROYW1lKCkpOworICAgIGZvciAoZmluYWwgT2JqZWN0IHNyY1ZhbCA6IHNyY0ZpZWxkLmdldFZhbHVlcygpKSB7CisgICAgICBmaW5hbCBPYmplY3QgZGVzdFZhbCA9IG11dGF0ZVZhbHVlKHNyY1ZhbCk7CisgICAgICBpZiAoU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTiA9PSBkZXN0VmFsKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiZmllbGQgJ3t9JyB7fSB2YWx1ZSAne30nIGlzIG5vdCBtdXRhdGFibGUsIHNvIG5vIHZhbHVlcyB3aWxsIGJlIG11dGF0ZWQiLAorICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc3JjRmllbGQuZ2V0TmFtZSgpLCBzcmNWYWwuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHNyY1ZhbCB9KTsKKyAgICAgICAgcmV0dXJuIHNyY0ZpZWxkOworICAgICAgfQorICAgICAgaWYgKERFTEVURV9WQUxVRV9TSU5HTEVUT04gPT0gZGVzdFZhbCkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICBpZiAobnVsbCA9PSBtZXNzYWdlcykgeworICAgICAgICAgICAgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZXMuYWRkKFN0cmluZy5mb3JtYXQoTG9jYWxlLlJPT1QsICJyZW1vdmluZyB2YWx1ZSBmcm9tIGZpZWxkICclcyc6ICVzICclcyciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWVsZC5nZXROYW1lKCksIHNyY1ZhbC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgc3JjVmFsKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgIGlmIChudWxsID09IG1lc3NhZ2VzKSB7CisgICAgICAgICAgICBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlcy5hZGQoU3RyaW5nLmZvcm1hdChMb2NhbGUuUk9PVCwgInJlcGxhY2UgdmFsdWUgZnJvbSBmaWVsZCAnJXMnOiAlcyAnJXMnIHdpdGggJXMgJyVzJyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpZWxkLmdldE5hbWUoKSwgc3JjVmFsLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBzcmNWYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RWYWwuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGRlc3RWYWwpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYWRkVmFsdWUoZGVzdFZhbCwgMS4wRik7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5zZXRCb29zdChzcmNGaWVsZC5nZXRCb29zdCgpKTsKKyAgICAKKyAgICBpZiAobnVsbCAhPSBtZXNzYWdlcyAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IG1lc3NhZ2VzKSB7CisgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDAgPT0gcmVzdWx0LmdldFZhbHVlQ291bnQoKSA/IG51bGwgOiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9DbG9uZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Nsb25lRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKaW5kZXggY2Y4ZTVhYi4uNjc5YzZiYiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Nsb25lRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Nsb25lRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTE5NSwyNSArMTk1LDEzIEBACiAgICAgCiAgICAgc3JjU2VsZWN0b3IgPSAKICAgICAgIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuY3JlYXRlRmllbGROYW1lU2VsZWN0b3IKLSAgICAgIChjb3JlLmdldFJlc291cmNlTG9hZGVyKCksCi0gICAgICAgY29yZSwKLSAgICAgICBzcmNJbmNsdXNpb25zLmZpZWxkTmFtZSwKLSAgICAgICBzcmNJbmNsdXNpb25zLnR5cGVOYW1lLAotICAgICAgIHNyY0luY2x1c2lvbnMudHlwZUNsYXNzLAotICAgICAgIHNyY0luY2x1c2lvbnMuZmllbGRSZWdleCwKLSAgICAgICBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLlNFTEVDVF9OT19GSUVMRFMpOworICAgICAgICAgIChjb3JlLmdldFJlc291cmNlTG9hZGVyKCksIGNvcmUsIHNyY0luY2x1c2lvbnMsIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuU0VMRUNUX05PX0ZJRUxEUyk7CiAKICAgICBmb3IgKFNlbGVjdG9yUGFyYW1zIGV4YyA6IHNyY0V4Y2x1c2lvbnMpIHsKICAgICAgIHNyY1NlbGVjdG9yID0gRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci53cmFwCiAgICAgICAgIChzcmNTZWxlY3RvciwKICAgICAgICAgIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuY3JlYXRlRmllbGROYW1lU2VsZWN0b3IKLSAgICAgICAgIChjb3JlLmdldFJlc291cmNlTG9hZGVyKCksCi0gICAgICAgICAgY29yZSwKLSAgICAgICAgICBleGMuZmllbGROYW1lLAotICAgICAgICAgIGV4Yy50eXBlTmFtZSwKLSAgICAgICAgICBleGMudHlwZUNsYXNzLAotICAgICAgICAgIGV4Yy5maWVsZFJlZ2V4LAotICAgICAgICAgIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuU0VMRUNUX05PX0ZJRUxEUykpOworICAgICAgICAgICAgIChjb3JlLmdldFJlc291cmNlTG9hZGVyKCksIGNvcmUsIGV4YywgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5TRUxFQ1RfTk9fRklFTERTKSk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9EaXN0cmlidXRlZFVwZGF0ZVByb2Nlc3Nvci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Rpc3RyaWJ1dGVkVXBkYXRlUHJvY2Vzc29yLmphdmEKaW5kZXggYmNjYzk3ZS4uYjc4NzY2ZiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Rpc3RyaWJ1dGVkVXBkYXRlUHJvY2Vzc29yLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0Rpc3RyaWJ1dGVkVXBkYXRlUHJvY2Vzc29yLmphdmEKQEAgLTIyMiw5ICsyMjIsOSBAQAogICAgICAgICAvLyBSZXBsaWNhIGxlYWRlciA9IHNsaWNlLmdldExlYWRlcigpOwogICAgICAgICBSZXBsaWNhIGxlYWRlclJlcGxpY2EgPSB6a0NvbnRyb2xsZXIuZ2V0WmtTdGF0ZVJlYWRlcigpLmdldExlYWRlclJldHJ5KAogICAgICAgICAgICAgY29sbGVjdGlvbiwgc2hhcmRJZCk7Ci0gICAgICAgIFprQ29yZU5vZGVQcm9wcyBsZWFkZXJQcm9wcyA9IG5ldyBaa0NvcmVOb2RlUHJvcHMobGVhZGVyUmVwbGljYSk7Ci0gICAgICAgIFN0cmluZyBjb3JlTm9kZU5hbWUgPSB6a0NvbnRyb2xsZXIuZ2V0Q29yZU5vZGVOYW1lKHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlzTGVhZGVyID0gY29yZU5vZGVOYW1lLmVxdWFscyhsZWFkZXJSZXBsaWNhLmdldE5hbWUoKSk7CisgICAgICAgIGlzTGVhZGVyID0gbGVhZGVyUmVwbGljYS5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgcmVxLmdldENvcmUoKS5nZXRDb3JlRGVzY3JpcHRvcigpLmdldENsb3VkRGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgLmdldENvcmVOb2RlTmFtZSgpKTsKIAogICAgICAgICBEaXN0cmliUGhhc2UgcGhhc2UgPQogICAgICAgICAgICAgRGlzdHJpYlBoYXNlLnBhcnNlUGFyYW0ocmVxLmdldFBhcmFtcygpLmdldChESVNUUklCX1VQREFURV9QQVJBTSkpOwpAQCAtMjQwLDEwICsyNDAsOSBAQAogICAgICAgICAgIC8vIHNvIGdldCB0aGUgcmVwbGljYXMuLi4KICAgICAgICAgICBmb3J3YXJkVG9MZWFkZXIgPSBmYWxzZTsKICAgICAgICAgICBMaXN0PFprQ29yZU5vZGVQcm9wcz4gcmVwbGljYVByb3BzID0gemtDb250cm9sbGVyLmdldFprU3RhdGVSZWFkZXIoKQotICAgICAgICAgICAgICAuZ2V0UmVwbGljYVByb3BzKGNvbGxlY3Rpb24sIHNoYXJkSWQsIGNvcmVOb2RlTmFtZSwKKyAgICAgICAgICAgICAgLmdldFJlcGxpY2FQcm9wcyhjb2xsZWN0aW9uLCBzaGFyZElkLCBsZWFkZXJSZXBsaWNhLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgIGNvcmVOYW1lLCBudWxsLCBaa1N0YXRlUmVhZGVyLkRPV04pOwogCi0gICAgICAgICAgbm9kZXMgPSBhZGRTdWJTaGFyZExlYWRlcnMoY29sbCwgc2hhcmRJZCwgaWQsIGRvYywgbm9kZXMpOwogICAgICAgICAgIGlmIChyZXBsaWNhUHJvcHMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG5vZGVzID09IG51bGwpICB7CiAgICAgICAgICAgICBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4ocmVwbGljYVByb3BzLnNpemUoKSk7CkBAIC0yNzMsNyArMjcyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBJIG5lZWQgdG8gZm9yd2FyZCBvbnRvIHRoZSBsZWFkZXIuLi4KICAgICAgICAgICBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMSk7Ci0gICAgICAgICAgbm9kZXMuYWRkKG5ldyBSZXRyeU5vZGUobGVhZGVyUHJvcHMsIHprQ29udHJvbGxlci5nZXRaa1N0YXRlUmVhZGVyKCksIGNvbGxlY3Rpb24sIHNoYXJkSWQpKTsKKyAgICAgICAgICBub2Rlcy5hZGQobmV3IFJldHJ5Tm9kZShuZXcgWmtDb3JlTm9kZVByb3BzKGxlYWRlclJlcGxpY2EpLCB6a0NvbnRyb2xsZXIuZ2V0WmtTdGF0ZVJlYWRlcigpLCBjb2xsZWN0aW9uLCBzaGFyZElkKSk7CiAgICAgICAgICAgZm9yd2FyZFRvTGVhZGVyID0gdHJ1ZTsKICAgICAgICAgfQogCkBAIC0yODcsOCArMjg2LDkgQEAKICAgICByZXR1cm4gbm9kZXM7CiAgIH0KIAotICBwcml2YXRlIExpc3Q8Tm9kZT4gYWRkU3ViU2hhcmRMZWFkZXJzKERvY0NvbGxlY3Rpb24gY29sbCwgU3RyaW5nIHNoYXJkSWQsIFN0cmluZyBkb2NJZCwgU29scklucHV0RG9jdW1lbnQgZG9jLCBMaXN0PE5vZGU+IG5vZGVzKSB7CisgIHByaXZhdGUgTGlzdDxOb2RlPiBnZXRTdWJTaGFyZExlYWRlcnMoRG9jQ29sbGVjdGlvbiBjb2xsLCBTdHJpbmcgc2hhcmRJZCwgU3RyaW5nIGRvY0lkLCBTb2xySW5wdXREb2N1bWVudCBkb2MpIHsKICAgICBDb2xsZWN0aW9uPFNsaWNlPiBhbGxTbGljZXMgPSBjb2xsLmdldFNsaWNlcygpOworICAgIExpc3Q8Tm9kZT4gbm9kZXMgPSBudWxsOwogICAgIGZvciAoU2xpY2UgYXNsaWNlIDogYWxsU2xpY2VzKSB7CiAgICAgICBpZiAoU2xpY2UuQ09OU1RSVUNUSU9OLmVxdWFscyhhc2xpY2UuZ2V0U3RhdGUoKSkpICB7CiAgICAgICAgIERvY1JvdXRlci5SYW5nZSBteVJhbmdlID0gY29sbC5nZXRTbGljZShzaGFyZElkKS5nZXRSYW5nZSgpOwpAQCAtMzQzLDcgKzM0Myw5IEBACiAKICAgICBpZiAoaXNMZWFkZXIgJiYgIWxvY2FsSXNMZWFkZXIpIHsKICAgICAgIGxvZy5lcnJvcigiQ2x1c3RlclN0YXRlIHNheXMgd2UgYXJlIHRoZSBsZWFkZXIsIGJ1dCBsb2NhbGx5IHdlIGRvbid0IHRoaW5rIHNvIik7Ci0gICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSwgIkNsdXN0ZXJTdGF0ZSBzYXlzIHdlIGFyZSB0aGUgbGVhZGVyLCBidXQgbG9jYWxseSB3ZSBkb24ndCB0aGluayBzbyIpOworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgIkNsdXN0ZXJTdGF0ZSBzYXlzIHdlIGFyZSB0aGUgbGVhZGVyICgiICsgemtDb250cm9sbGVyLmdldEJhc2VVcmwoKQorICAgICAgICAgICAgICArICIvIiArIHJlcS5nZXRDb3JlKCkuZ2V0TmFtZSgpICsgIiksIGJ1dCBsb2NhbGx5IHdlIGRvbid0IHRoaW5rIHNvLiBSZXF1ZXN0IGNhbWUgZnJvbSAiICsgZnJvbSk7CiAgICAgfQogICB9CiAKQEAgLTM1NiwxNiArMzU4LDE1IEBACiAgICAgdHJ5IHsKICAgICAgIFJlcGxpY2EgbGVhZGVyUmVwbGljYSA9IHprQ29udHJvbGxlci5nZXRaa1N0YXRlUmVhZGVyKCkuZ2V0TGVhZGVyUmV0cnkoCiAgICAgICAgICAgY29sbGVjdGlvbiwgc2hhcmRJZCk7Ci0gICAgICBTdHJpbmcgbGVhZGVyQ29yZU5vZGVOYW1lID0gbGVhZGVyUmVwbGljYS5nZXROYW1lKCk7Ci0KLSAgICAgIFN0cmluZyBjb3JlTm9kZU5hbWUgPSB6a0NvbnRyb2xsZXIuZ2V0Q29yZU5vZGVOYW1lKHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKSk7Ci0gICAgICBpc0xlYWRlciA9IGNvcmVOb2RlTmFtZS5lcXVhbHMobGVhZGVyQ29yZU5vZGVOYW1lKTsKKyAgICAgIGlzTGVhZGVyID0gbGVhZGVyUmVwbGljYS5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgIHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRDbG91ZERlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAuZ2V0Q29yZU5vZGVOYW1lKCkpOwogCiAgICAgICAvLyBUT0RPOiB3aGF0IGlmIHdlIGFyZSBubyBsb25nZXIgdGhlIGxlYWRlcj8KIAogICAgICAgZm9yd2FyZFRvTGVhZGVyID0gZmFsc2U7CiAgICAgICBMaXN0PFprQ29yZU5vZGVQcm9wcz4gcmVwbGljYVByb3BzID0gemtDb250cm9sbGVyLmdldFprU3RhdGVSZWFkZXIoKQotICAgICAgICAgIC5nZXRSZXBsaWNhUHJvcHMoY29sbGVjdGlvbiwgc2hhcmRJZCwgY29yZU5vZGVOYW1lLAorICAgICAgICAgIC5nZXRSZXBsaWNhUHJvcHMoY29sbGVjdGlvbiwgc2hhcmRJZCwgbGVhZGVyUmVwbGljYS5nZXROYW1lKCksCiAgICAgICAgICAgICAgIHJlcS5nZXRDb3JlKCkuZ2V0TmFtZSgpKTsKICAgICAgIGlmIChyZXBsaWNhUHJvcHMgIT0gbnVsbCkgewogICAgICAgICBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4ocmVwbGljYVByb3BzLnNpemUoKSk7CkBAIC0zNzMsOCArMzc0LDYgQEAKICAgICAgICAgICBub2Rlcy5hZGQobmV3IFN0ZE5vZGUocHJvcHMpKTsKICAgICAgICAgfQogICAgICAgfQotCi0gICAgICBub2RlcyA9IGFkZFN1YlNoYXJkTGVhZGVycyh6a0NvbnRyb2xsZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0Q29sbGVjdGlvbihjb2xsZWN0aW9uKSwgc2hhcmRJZCwgbnVsbCwgbnVsbCwgbm9kZXMpOwogICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CiAgICAgICB0aHJvdyBuZXcgWm9vS2VlcGVyRXhjZXB0aW9uKFNvbHJFeGNlcHRpb24uRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIiIsCkBAIC0zOTUsNyArMzk0LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgaXNMZWFkZXIgPSBnZXROb25aa0xlYWRlckFzc3VtcHRpb24ocmVxKTsKICAgICB9Ci0gICAgCisKICAgICBib29sZWFuIGRyb3BDbWQgPSBmYWxzZTsKICAgICBpZiAoIWZvcndhcmRUb0xlYWRlcikgewogICAgICAgZHJvcENtZCA9IHZlcnNpb25BZGQoY21kKTsKQEAgLTQwNSwyMiArNDA0LDM1IEBACiAgICAgICAvLyBUT0RPOiBkbyB3ZSBuZWVkIHRvIGFkZCBhbnl0aGluZyB0byB0aGUgcmVzcG9uc2U/CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIAorCisgICAgaWYgKHprRW5hYmxlZCAmJiBpc0xlYWRlcikgIHsKKyAgICAgIERvY0NvbGxlY3Rpb24gY29sbCA9IHprQ29udHJvbGxlci5nZXRDbHVzdGVyU3RhdGUoKS5nZXRDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOworICAgICAgTGlzdDxOb2RlPiBzdWJTaGFyZExlYWRlcnMgPSBnZXRTdWJTaGFyZExlYWRlcnMoY29sbCwgY2xvdWREZXNjLmdldFNoYXJkSWQoKSwgY21kLmdldEhhc2hhYmxlSWQoKSwgY21kLmdldFNvbHJJbnB1dERvY3VtZW50KCkpOworICAgICAgLy8gdGhlIGxpc3Q8bm9kZT4gd2lsbCBhY3R1YWxseSBoYXZlIG9ubHkgb25lIGVsZW1lbnQgZm9yIGFuIGFkZCByZXF1ZXN0CisgICAgICBpZiAoc3ViU2hhcmRMZWFkZXJzICE9IG51bGwgJiYgIXN1YlNoYXJkTGVhZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgTW9kaWZpYWJsZVNvbHJQYXJhbXMgcGFyYW1zID0gbmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKGZpbHRlclBhcmFtcyhyZXEuZ2V0UGFyYW1zKCkpKTsKKyAgICAgICAgcGFyYW1zLnNldChESVNUUklCX1VQREFURV9QQVJBTSwgRGlzdHJpYlBoYXNlLkZST01MRUFERVIudG9TdHJpbmcoKSk7CisgICAgICAgIHBhcmFtcy5zZXQoImRpc3RyaWIuZnJvbSIsIFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKAorICAgICAgICAgICAgemtDb250cm9sbGVyLmdldEJhc2VVcmwoKSwgcmVxLmdldENvcmUoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgcGFyYW1zLnNldCgiZGlzdHJpYi5mcm9tLnBhcmVudCIsIHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRTaGFyZElkKCkpOworICAgICAgICBmb3IgKE5vZGUgc3ViU2hhcmRMZWFkZXIgOiBzdWJTaGFyZExlYWRlcnMpIHsKKyAgICAgICAgICBjbWREaXN0cmliLnN5bmNBZGQoY21kLCBzdWJTaGFyZExlYWRlciwgcGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKwogICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG51bGw7CiAgICAgaWYgKG5vZGVzICE9IG51bGwpIHsKLSAgICAgIAorCiAgICAgICBwYXJhbXMgPSBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoZmlsdGVyUGFyYW1zKHJlcS5nZXRQYXJhbXMoKSkpOwotICAgICAgcGFyYW1zLnNldChESVNUUklCX1VQREFURV9QQVJBTSwgCi0gICAgICAgICAgICAgICAgIChpc0xlYWRlciA/IAotICAgICAgICAgICAgICAgICAgRGlzdHJpYlBoYXNlLkZST01MRUFERVIudG9TdHJpbmcoKSA6IAorICAgICAgcGFyYW1zLnNldChESVNUUklCX1VQREFURV9QQVJBTSwKKyAgICAgICAgICAgICAgICAgKGlzTGVhZGVyID8KKyAgICAgICAgICAgICAgICAgIERpc3RyaWJQaGFzZS5GUk9NTEVBREVSLnRvU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgRGlzdHJpYlBoYXNlLlRPTEVBREVSLnRvU3RyaW5nKCkpKTsKICAgICAgIGlmIChpc0xlYWRlcikgewogICAgICAgICBwYXJhbXMuc2V0KCJkaXN0cmliLmZyb20iLCBaa0NvcmVOb2RlUHJvcHMuZ2V0Q29yZVVybCgKICAgICAgICAgICAgIHprQ29udHJvbGxlci5nZXRCYXNlVXJsKCksIHJlcS5nZXRDb3JlKCkuZ2V0TmFtZSgpKSk7CiAgICAgICB9Ci0gICAgICBpZiAoZm9yd2FyZFRvU3ViU2hhcmQpICB7Ci0gICAgICAgIHBhcmFtcy5zZXQoImRpc3RyaWIuZnJvbS5wYXJlbnQiLCByZXEuZ2V0Q29yZSgpLmdldENvcmVEZXNjcmlwdG9yKCkuZ2V0Q2xvdWREZXNjcmlwdG9yKCkuZ2V0U2hhcmRJZCgpKTsKLSAgICAgIH0KIAogICAgICAgcGFyYW1zLnNldCgiZGlzdHJpYi5mcm9tIiwgWmtDb3JlTm9kZVByb3BzLmdldENvcmVVcmwoCiAgICAgICAgICAgemtDb250cm9sbGVyLmdldEJhc2VVcmwoKSwgcmVxLmdldENvcmUoKS5nZXROYW1lKCkpKTsKQEAgLTY0MCw3ICs2NTIsNyBAQAogICAgICAgICBpZiAod2lsbERpc3RyaWIpIHsKICAgICAgICAgICBjbG9uZWREb2MgPSBjbWQuc29sckRvYy5kZWVwQ29weSgpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRPRE86IHBvc3NpYmx5IHNldCBjaGVja0RlbGV0ZUJ5UXVlcmllcyBhcyBhIGZsYWcgb24gdGhlIGNvbW1hbmQ/CiAgICAgICAgIGRvTG9jYWxBZGQoY21kKTsKICAgICAgICAgCkBAIC03ODEsMTMgKzc5MywyOCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmICh6a0VuYWJsZWQgJiYgaXNMZWFkZXIpICB7CisgICAgICBEb2NDb2xsZWN0aW9uIGNvbGwgPSB6a0NvbnRyb2xsZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0Q29sbGVjdGlvbihjb2xsZWN0aW9uKTsKKyAgICAgIExpc3Q8Tm9kZT4gc3ViU2hhcmRMZWFkZXJzID0gZ2V0U3ViU2hhcmRMZWFkZXJzKGNvbGwsIGNsb3VkRGVzYy5nZXRTaGFyZElkKCksIG51bGwsIG51bGwpOworICAgICAgLy8gdGhlIGxpc3Q8bm9kZT4gd2lsbCBhY3R1YWxseSBoYXZlIG9ubHkgb25lIGVsZW1lbnQgZm9yIGFuIGFkZCByZXF1ZXN0CisgICAgICBpZiAoc3ViU2hhcmRMZWFkZXJzICE9IG51bGwgJiYgIXN1YlNoYXJkTGVhZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgTW9kaWZpYWJsZVNvbHJQYXJhbXMgcGFyYW1zID0gbmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKGZpbHRlclBhcmFtcyhyZXEuZ2V0UGFyYW1zKCkpKTsKKyAgICAgICAgcGFyYW1zLnNldChESVNUUklCX1VQREFURV9QQVJBTSwgRGlzdHJpYlBoYXNlLkZST01MRUFERVIudG9TdHJpbmcoKSk7CisgICAgICAgIHBhcmFtcy5zZXQoImRpc3RyaWIuZnJvbSIsIFprQ29yZU5vZGVQcm9wcy5nZXRDb3JlVXJsKAorICAgICAgICAgICAgemtDb250cm9sbGVyLmdldEJhc2VVcmwoKSwgcmVxLmdldENvcmUoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgcGFyYW1zLnNldCgiZGlzdHJpYi5mcm9tLnBhcmVudCIsIGNsb3VkRGVzYy5nZXRTaGFyZElkKCkpOworICAgICAgICBjbWREaXN0cmliLnN5bmNEZWxldGUoY21kLCBzdWJTaGFyZExlYWRlcnMsIHBhcmFtcyk7CisgICAgICB9CisgICAgfQorCisKICAgICBNb2RpZmlhYmxlU29sclBhcmFtcyBwYXJhbXMgPSBudWxsOwogICAgIGlmIChub2RlcyAhPSBudWxsKSB7Ci0gICAgICAKKwogICAgICAgcGFyYW1zID0gbmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKGZpbHRlclBhcmFtcyhyZXEuZ2V0UGFyYW1zKCkpKTsKLSAgICAgIHBhcmFtcy5zZXQoRElTVFJJQl9VUERBVEVfUEFSQU0sIAotICAgICAgICAgICAgICAgICAoaXNMZWFkZXIgPyAKLSAgICAgICAgICAgICAgICAgIERpc3RyaWJQaGFzZS5GUk9NTEVBREVSLnRvU3RyaW5nKCkgOiAKKyAgICAgIHBhcmFtcy5zZXQoRElTVFJJQl9VUERBVEVfUEFSQU0sCisgICAgICAgICAgICAgICAgIChpc0xlYWRlciA/CisgICAgICAgICAgICAgICAgICBEaXN0cmliUGhhc2UuRlJPTUxFQURFUi50b1N0cmluZygpIDoKICAgICAgICAgICAgICAgICAgIERpc3RyaWJQaGFzZS5UT0xFQURFUi50b1N0cmluZygpKSk7CiAgICAgICBpZiAoaXNMZWFkZXIpIHsKICAgICAgICAgcGFyYW1zLnNldCgiZGlzdHJpYi5mcm9tIiwgWmtDb3JlTm9kZVByb3BzLmdldENvcmVVcmwoCkBAIC04MTcsOSArODQ0LDExIEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgcGFzc1BhcmFtKFNvbHJQYXJhbXMgcGFyYW1zLCBNb2RpZmlhYmxlU29sclBhcmFtcyBmcGFyYW1zLCBTdHJpbmcgcGFyYW0pIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbXMuZ2V0KHBhcmFtKTsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgZnBhcmFtcy5hZGQocGFyYW0sIHZhbHVlKTsKKyAgICBTdHJpbmdbXSB2YWx1ZXMgPSBwYXJhbXMuZ2V0UGFyYW1zKHBhcmFtKTsKKyAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgIGZwYXJhbXMuYWRkKHBhcmFtLCB2YWx1ZSk7CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTg0MywxMyArODcyLDE1IEBACiAgICAgRGlzdHJpYlBoYXNlIHBoYXNlID0gCiAgICAgRGlzdHJpYlBoYXNlLnBhcnNlUGFyYW0ocmVxLmdldFBhcmFtcygpLmdldChESVNUUklCX1VQREFURV9QQVJBTSkpOwogCisgICAgRG9jQ29sbGVjdGlvbiBjb2xsID0gemtFbmFibGVkIAorICAgICAgPyB6a0NvbnRyb2xsZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0Q29sbGVjdGlvbihjb2xsZWN0aW9uKSA6IG51bGw7CisKICAgICBpZiAoemtFbmFibGVkICYmIERpc3RyaWJQaGFzZS5OT05FID09IHBoYXNlKSB7CiAgICAgICBib29sZWFuIGxlYWRlckZvckFueVNoYXJkID0gZmFsc2U7ICAvLyBzdGFydCBvZmYgYnkgYXNzdW1pbmcgd2UgYXJlIG5vdCBhIGxlYWRlciBmb3IgYW55IHNoYXJkCiAKICAgICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIG91dFBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcyhmaWx0ZXJQYXJhbXMocmVxLmdldFBhcmFtcygpKSk7CiAgICAgICBvdXRQYXJhbXMuc2V0KERJU1RSSUJfVVBEQVRFX1BBUkFNLCBEaXN0cmliUGhhc2UuVE9MRUFERVIudG9TdHJpbmcoKSk7CiAKLSAgICAgIERvY0NvbGxlY3Rpb24gY29sbCA9IHprQ29udHJvbGxlci5nZXRDbHVzdGVyU3RhdGUoKS5nZXRDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwogICAgICAgU29sclBhcmFtcyBwYXJhbXMgPSByZXEuZ2V0UGFyYW1zKCk7CiAgICAgICBDb2xsZWN0aW9uPFNsaWNlPiBzbGljZXMgPSBjb2xsLmdldFJvdXRlcigpLmdldFNlYXJjaFNsaWNlcyhwYXJhbXMuZ2V0KFNoYXJkUGFyYW1zLlNIQVJEX0tFWVMpLCBwYXJhbXMsIGNvbGwpOwogCkBAIC04NjksNyArOTAwLDcgQEAKICAgICAgICAgLy8gQW0gSSB0aGUgbGVhZGVyIGZvciB0aGlzIHNsaWNlPwogICAgICAgICBaa0NvcmVOb2RlUHJvcHMgY29yZUxlYWRlclByb3BzID0gbmV3IFprQ29yZU5vZGVQcm9wcyhsZWFkZXIpOwogICAgICAgICBTdHJpbmcgbGVhZGVyQ29yZU5vZGVOYW1lID0gbGVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IHprQ29udHJvbGxlci5nZXRDb3JlTm9kZU5hbWUocmVxLmdldENvcmUoKS5nZXRDb3JlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgU3RyaW5nIGNvcmVOb2RlTmFtZSA9IHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb3JlTm9kZU5hbWUoKTsKICAgICAgICAgaXNMZWFkZXIgPSBjb3JlTm9kZU5hbWUuZXF1YWxzKGxlYWRlckNvcmVOb2RlTmFtZSk7CiAKICAgICAgICAgaWYgKGlzTGVhZGVyKSB7CkBAIC05NTcsMTYgKzk4OCwyMiBAQAogICAgICAgdmluZm8udW5ibG9ja1VwZGF0ZXMoKTsKICAgICB9CiAKLQogICAgIC8vIGZvcndhcmQgdG8gYWxsIHJlcGxpY2FzCi0gICAgaWYgKGxlYWRlckxvZ2ljICYmIHJlcGxpY2FzICE9IG51bGwpIHsKKyAgICBpZiAobGVhZGVyTG9naWMgJiYgemtFbmFibGVkKSB7CisgICAgICBMaXN0PE5vZGU+IHN1YlNoYXJkTGVhZGVycyA9IGdldFN1YlNoYXJkTGVhZGVycyhjb2xsLCBjbG91ZERlc2MuZ2V0U2hhcmRJZCgpLCBudWxsLCBudWxsKTsKKwogICAgICAgTW9kaWZpYWJsZVNvbHJQYXJhbXMgcGFyYW1zID0gbmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKGZpbHRlclBhcmFtcyhyZXEuZ2V0UGFyYW1zKCkpKTsKICAgICAgIHBhcmFtcy5zZXQoVkVSU0lPTl9GSUVMRCwgTG9uZy50b1N0cmluZyhjbWQuZ2V0VmVyc2lvbigpKSk7CiAgICAgICBwYXJhbXMuc2V0KERJU1RSSUJfVVBEQVRFX1BBUkFNLCBEaXN0cmliUGhhc2UuRlJPTUxFQURFUi50b1N0cmluZygpKTsKICAgICAgIHBhcmFtcy5zZXQoInVwZGF0ZS5mcm9tIiwgWmtDb3JlTm9kZVByb3BzLmdldENvcmVVcmwoCiAgICAgICAgICAgemtDb250cm9sbGVyLmdldEJhc2VVcmwoKSwgcmVxLmdldENvcmUoKS5nZXROYW1lKCkpKTsKLSAgICAgIGNtZERpc3RyaWIuZGlzdHJpYkRlbGV0ZShjbWQsIHJlcGxpY2FzLCBwYXJhbXMpOwotICAgICAgY21kRGlzdHJpYi5maW5pc2goKTsKKyAgICAgIGlmIChzdWJTaGFyZExlYWRlcnMgIT0gbnVsbCkgIHsKKyAgICAgICAgY21kRGlzdHJpYi5zeW5jRGVsZXRlKGNtZCwgc3ViU2hhcmRMZWFkZXJzLCBwYXJhbXMpOworICAgICAgfQorICAgICAgaWYgKHJlcGxpY2FzICE9IG51bGwpIHsKKyAgICAgICAgY21kRGlzdHJpYi5kaXN0cmliRGVsZXRlKGNtZCwgcmVwbGljYXMsIHBhcmFtcyk7CisgICAgICAgIGNtZERpc3RyaWIuZmluaXNoKCk7CisgICAgICB9CiAgICAgfQogCiAKQEAgLTEwOTcsMTUgKzExMzQsMzcgQEAKICAgICB9CiAgIH0KIAotCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29tbWl0KENvbW1pdFVwZGF0ZUNvbW1hbmQgY21kKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHVwZGF0ZUNvbW1hbmQgPSBjbWQ7Ci0KKyAgICBMaXN0PE5vZGU+IG5vZGVzID0gbnVsbDsKKyAgICBib29sZWFuIHNpbmdsZUxlYWRlciA9IGZhbHNlOwogICAgIGlmICh6a0VuYWJsZWQpIHsKICAgICAgIHprQ2hlY2soKTsKKyAgICAgIAorICAgICAgbm9kZXMgPSBnZXRDb2xsZWN0aW9uVXJscyhyZXEsIHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKQorICAgICAgICAgIC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKKyAgICAgIGlmIChpc0xlYWRlciAmJiBub2Rlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBzaW5nbGVMZWFkZXIgPSB0cnVlOworICAgICAgfQogICAgIH0KICAgICAKKyAgICBpZiAoIXprRW5hYmxlZCB8fCByZXEuZ2V0UGFyYW1zKCkuZ2V0Qm9vbChDT01NSVRfRU5EX1BPSU5ULCBmYWxzZSkgfHwgc2luZ2xlTGVhZGVyKSB7CisgICAgICBkb0xvY2FsQ29tbWl0KGNtZCk7CisgICAgfSBlbHNlIGlmICh6a0VuYWJsZWQpIHsKKyAgICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcyhmaWx0ZXJQYXJhbXMocmVxLmdldFBhcmFtcygpKSk7CisgICAgICBpZiAoIXJlcS5nZXRQYXJhbXMoKS5nZXRCb29sKENPTU1JVF9FTkRfUE9JTlQsIGZhbHNlKSkgeworICAgICAgICBwYXJhbXMuc2V0KENPTU1JVF9FTkRfUE9JTlQsIHRydWUpOworCisgICAgICAgIGlmIChub2RlcyAhPSBudWxsKSB7CisgICAgICAgICAgY21kRGlzdHJpYi5kaXN0cmliQ29tbWl0KGNtZCwgbm9kZXMsIHBhcmFtcyk7CisgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZG9Mb2NhbENvbW1pdChDb21taXRVcGRhdGVDb21tYW5kIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBpZiAodmluZm8gIT0gbnVsbCkgewogICAgICAgdmluZm8ubG9ja0ZvclVwZGF0ZSgpOwogICAgIH0KQEAgLTExMjIsMjMgKzExODEsNiBAQAogICAgICAgICB2aW5mby51bmxvY2tGb3JVcGRhdGUoKTsKICAgICAgIH0KICAgICB9Ci0gICAgLy8gVE9ETzogd2Ugc2hvdWxkIGNvbnNpZGVyIHRoaXM/IGNvbW1pdCBldmVyeW9uZSBpbiB0aGUgY3VycmVudCBjb2xsZWN0aW9uCi0KLSAgICBpZiAoemtFbmFibGVkKSB7Ci0gICAgICBNb2RpZmlhYmxlU29sclBhcmFtcyBwYXJhbXMgPSBuZXcgTW9kaWZpYWJsZVNvbHJQYXJhbXMoZmlsdGVyUGFyYW1zKHJlcS5nZXRQYXJhbXMoKSkpOwotICAgICAgaWYgKCFyZXEuZ2V0UGFyYW1zKCkuZ2V0Qm9vbChDT01NSVRfRU5EX1BPSU5ULCBmYWxzZSkpIHsKLSAgICAgICAgcGFyYW1zLnNldChDT01NSVRfRU5EX1BPSU5ULCB0cnVlKTsKLQotICAgICAgICBTdHJpbmcgY29yZU5vZGVOYW1lID0gemtDb250cm9sbGVyLmdldENvcmVOb2RlTmFtZShyZXEuZ2V0Q29yZSgpLmdldENvcmVEZXNjcmlwdG9yKCkpOwotICAgICAgICBMaXN0PE5vZGU+IG5vZGVzID0gZ2V0Q29sbGVjdGlvblVybHMocmVxLCByZXEuZ2V0Q29yZSgpLmdldENvcmVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgIC5nZXRDbG91ZERlc2NyaXB0b3IoKS5nZXRDb2xsZWN0aW9uTmFtZSgpLCBjb3JlTm9kZU5hbWUpOwotCi0gICAgICAgIGlmIChub2RlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgY21kRGlzdHJpYi5kaXN0cmliQ29tbWl0KGNtZCwgbm9kZXMsIHBhcmFtcyk7Ci0gICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9CiAgIH0KICAgCiAgIEBPdmVycmlkZQpAQCAtMTE1MCw3ICsxMTkyLDcgQEAKICAKIAogICAKLSAgcHJpdmF0ZSBMaXN0PE5vZGU+IGdldENvbGxlY3Rpb25VcmxzKFNvbHJRdWVyeVJlcXVlc3QgcmVxLCBTdHJpbmcgY29sbGVjdGlvbiwgU3RyaW5nIGNvcmVOb2RlTmFtZSkgeworICBwcml2YXRlIExpc3Q8Tm9kZT4gZ2V0Q29sbGVjdGlvblVybHMoU29sclF1ZXJ5UmVxdWVzdCByZXEsIFN0cmluZyBjb2xsZWN0aW9uKSB7CiAgICAgQ2x1c3RlclN0YXRlIGNsdXN0ZXJTdGF0ZSA9IHJlcS5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKQogICAgICAgICAuZ2V0Q29yZUNvbnRhaW5lcigpLmdldFprQ29udHJvbGxlcigpLmdldENsdXN0ZXJTdGF0ZSgpOwogICAgIExpc3Q8Tm9kZT4gdXJscyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKQEAgLTExNjYsNyArMTIwOCw3IEBACiAgICAgICAKICAgICAgIGZvciAoRW50cnk8U3RyaW5nLFJlcGxpY2E+IGVudHJ5IDogc2hhcmRNYXAuZW50cnlTZXQoKSkgewogICAgICAgICBaa0NvcmVOb2RlUHJvcHMgbm9kZVByb3BzID0gbmV3IFprQ29yZU5vZGVQcm9wcyhlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKGNsdXN0ZXJTdGF0ZS5saXZlTm9kZXNDb250YWluKG5vZGVQcm9wcy5nZXROb2RlTmFtZSgpKSAmJiAhZW50cnkuZ2V0S2V5KCkuZXF1YWxzKGNvcmVOb2RlTmFtZSkpIHsKKyAgICAgICAgaWYgKGNsdXN0ZXJTdGF0ZS5saXZlTm9kZXNDb250YWluKG5vZGVQcm9wcy5nZXROb2RlTmFtZSgpKSkgewogICAgICAgICAgIHVybHMuYWRkKG5ldyBTdGROb2RlKG5vZGVQcm9wcykpOwogICAgICAgICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL0ZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuamF2YQppbmRleCA5OTNiNGIzLi45MmZjODJiIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmphdmEKQEAgLTIwLDExICsyMCwxMSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuQkFEX1JFUVVFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGUuU0VSVkVSX0VSUk9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5TZWxlY3RvclBhcmFtczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXRGaWVsZDsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICAvLyBmb3Igbm93LCBkb24ndCBhbGxvdyBpdC4KICAgICAgICAgaWYgKCEgZm5hbWUuZXF1YWxzKGRlc3QuZ2V0TmFtZSgpKSApIHsKICAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11dHV0ZSByZXR1cm5lZCBmaWVsZCB3aXRoIGRpZmZlcmVudCBuYW1lOiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXRhdGUgcmV0dXJuZWQgZmllbGQgd2l0aCBkaWZmZXJlbnQgbmFtZTogIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZuYW1lICsgIiA9PiAiICsgZGVzdC5nZXROYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGRvYy5wdXQoZGVzdC5nZXROYW1lKCksIGRlc3QpOwpAQCAtMTE4LDcgKzExOCw3IEBACiAgIH0KICAgCiAgIC8qKgotICAgKiBJbnRlcmZhY2UgZm9yIGlkZW5maWZ5aW5nIHdoaWNoIGZpbGVkcyBzaG91bGQgYmUgbXV0YXRlZAorICAgKiBJbnRlcmZhY2UgZm9yIGlkZW50aWZ5aW5nIHdoaWNoIGZpZWxkcyBzaG91bGQgYmUgbXV0YXRlZAogICAgKi8KICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmllbGROYW1lU2VsZWN0b3IgewogICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE11dGF0ZShmaW5hbCBTdHJpbmcgZmllbGROYW1lKTsKQEAgLTE5Miw3OSArMTkyLDc1IEBACiAgIHB1YmxpYyBzdGF0aWMgRmllbGROYW1lU2VsZWN0b3IgY3JlYXRlRmllbGROYW1lU2VsZWN0b3IKICAgICAoZmluYWwgU29sclJlc291cmNlTG9hZGVyIGxvYWRlciwKICAgICAgZmluYWwgU29sckNvcmUgY29yZSwKLSAgICAgZmluYWwgU2V0PFN0cmluZz4gZmllbGRzLAotICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB0eXBlTmFtZXMsCi0gICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ2xhc3NlcywKLSAgICAgZmluYWwgQ29sbGVjdGlvbjxQYXR0ZXJuPiByZWdleGVzLAorICAgICBmaW5hbCBTZWxlY3RvclBhcmFtcyBwYXJhbXMsCiAgICAgIGZpbmFsIEZpZWxkTmFtZVNlbGVjdG9yIGRlZlNlbGVjdG9yKSB7Ci0gICAgCi0gICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzcz4gY2xhc3NlcyAKLSAgICAgID0gbmV3IEFycmF5TGlzdDxDbGFzcz4odHlwZUNsYXNzZXMuc2l6ZSgpKTsKLSAgICAKLSAgICBmb3IgKFN0cmluZyB0IDogdHlwZUNsYXNzZXMpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGNsYXNzZXMuYWRkKGxvYWRlci5maW5kQ2xhc3ModCwgT2JqZWN0LmNsYXNzKSk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihTRVJWRVJfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCByZXNvbHZlIHR5cGVDbGFzczogIiArIHQsIGUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3Nlcy5pc0VtcHR5KCkgJiYgCi0gICAgICAgIHR5cGVOYW1lcy5pc0VtcHR5KCkgJiYgCi0gICAgICAgIHJlZ2V4ZXMuaXNFbXB0eSgpICYmIAotICAgICAgICBmaWVsZHMuaXNFbXB0eSgpKSB7CisKKyAgICBpZiAocGFyYW1zLm5vU2VsZWN0b3JzU3BlY2lmaWVkKCkpIHsKICAgICAgIHJldHVybiBkZWZTZWxlY3RvcjsKICAgICB9CiAgICAgCi0gICAgcmV0dXJuIG5ldyBDb25maWd1cmFibGVGaWVsZE5hbWVTZWxlY3Rvcihjb3JlLCBmaWVsZHMsIHR5cGVOYW1lcywgY2xhc3NlcywgcmVnZXhlcyk7IAorICAgIHJldHVybiBuZXcgQ29uZmlndXJhYmxlRmllbGROYW1lU2VsZWN0b3IobG9hZGVyLCBjb3JlLCBwYXJhbXMpOyAKICAgfQogICAKKyAgCisgIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25maWd1cmFibGVGaWVsZE5hbWVTZWxlY3RvciAKICAgICBpbXBsZW1lbnRzIEZpZWxkTmFtZVNlbGVjdG9yIHsKIAogICAgIGZpbmFsIFNvbHJDb3JlIGNvcmU7Ci0gICAgZmluYWwgU2V0PFN0cmluZz4gZmllbGRzOwotICAgIGZpbmFsIFNldDxTdHJpbmc+IHR5cGVOYW1lczsKKyAgICBmaW5hbCBTZWxlY3RvclBhcmFtcyBwYXJhbXM7CiAgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzcz4gY2xhc3NlczsKLSAgICBmaW5hbCBDb2xsZWN0aW9uPFBhdHRlcm4+IHJlZ2V4ZXM7CiAKLSAgICBwcml2YXRlIENvbmZpZ3VyYWJsZUZpZWxkTmFtZVNlbGVjdG9yKGZpbmFsIFNvbHJDb3JlIGNvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB0eXBlTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENsYXNzPiBjbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQYXR0ZXJuPiByZWdleGVzKSB7CisgICAgcHJpdmF0ZSBDb25maWd1cmFibGVGaWVsZE5hbWVTZWxlY3RvcihmaW5hbCBTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU29sckNvcmUgY29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdG9yUGFyYW1zIHBhcmFtcykgewogICAgICAgdGhpcy5jb3JlID0gY29yZTsKLSAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzOwotICAgICAgdGhpcy50eXBlTmFtZXMgPSB0eXBlTmFtZXM7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKworICAgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KHBhcmFtcy50eXBlQ2xhc3Muc2l6ZSgpKTsKKworICAgICAgZm9yIChTdHJpbmcgdCA6IHBhcmFtcy50eXBlQ2xhc3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjbGFzc2VzLmFkZChsb2FkZXIuZmluZENsYXNzKHQsIE9iamVjdC5jbGFzcykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgIkNhbid0IHJlc29sdmUgdHlwZUNsYXNzOiAiICsgdCwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7Ci0gICAgICB0aGlzLnJlZ2V4ZXMgPSByZWdleGVzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE11dGF0ZShmaW5hbCBTdHJpbmcgZmllbGROYW1lKSB7CiAgICAgICAKLSAgICAgIC8vIG9yZGVyIG9mIGNoZWNrcyBpcyBic2FlZCBvbiB3aGF0IHNob3VsZCBiZSBxdWlja2VyIAorICAgICAgLy8gb3JkZXIgb2YgY2hlY2tzIGlzIGJhc2VkIG9uIHdoYXQgc2hvdWxkIGJlIHF1aWNrZXIKICAgICAgIC8vIChpZTogc2V0IGxvb2t1cHMgZmFzdGVyIHRoZSBsb29waW5nIG92ZXIgaW5zdGFuY2VPZiAvIG1hdGNoZXMgdGVzdHMKICAgICAgIAotICAgICAgaWYgKCAhIChmaWVsZHMuaXNFbXB0eSgpIHx8IGZpZWxkcy5jb250YWlucyhmaWVsZE5hbWUpKSApIHsKKyAgICAgIGlmICggISAocGFyYW1zLmZpZWxkTmFtZS5pc0VtcHR5KCkgfHwgcGFyYW1zLmZpZWxkTmFtZS5jb250YWlucyhmaWVsZE5hbWUpKSApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgICAgCiAgICAgICAvLyBkbyBub3QgY29uc2lkZXIgaXQgYW4gZXJyb3IgaWYgdGhlIGZpZWxkTmFtZSBoYXMgbm8gdHlwZQogICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgYW5vdGhlciBwcm9jZXNzb3IgZGVhbGluZyB3aXRoIGl0IGxhdGVyCiAgICAgICBGaWVsZFR5cGUgdCA9ICBjb3JlLmdldExhdGVzdFNjaGVtYSgpLmdldEZpZWxkVHlwZU5vRXgoZmllbGROYW1lKTsKLSAgICAgIGlmIChudWxsICE9IHQpIHsKLSAgICAgICAgaWYgKCEgKHR5cGVOYW1lcy5pc0VtcHR5KCkgfHwgdHlwZU5hbWVzLmNvbnRhaW5zKHQuZ2V0VHlwZU5hbWUoKSkpICkgeworICAgICAgZmluYWwgYm9vbGVhbiBmaWVsZEV4aXN0cyA9IChudWxsICE9IHQpOworCisgICAgICBpZiAoIChudWxsICE9IHBhcmFtcy5maWVsZE5hbWVNYXRjaGVzU2NoZW1hRmllbGQpICYmCisgICAgICAgICAgIChmaWVsZEV4aXN0cyAhPSBwYXJhbXMuZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkKSApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoZmllbGRFeGlzdHMpIHsgCisKKyAgICAgICAgaWYgKCEgKHBhcmFtcy50eXBlTmFtZS5pc0VtcHR5KCkgfHwgcGFyYW1zLnR5cGVOYW1lLmNvbnRhaW5zKHQuZ2V0VHlwZU5hbWUoKSkpICkgewogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKCEgKGNsYXNzZXMuaXNFbXB0eSgpIHx8IGluc3RhbmNlT2ZBbnkodCwgY2xhc3NlcykpICkgewogICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gCiAgICAgICAKLSAgICAgIGlmICghIChyZWdleGVzLmlzRW1wdHkoKSB8fCBtYXRjaGVzQW55KGZpZWxkTmFtZSwgcmVnZXhlcykpICkgeworICAgICAgaWYgKCEgKHBhcmFtcy5maWVsZFJlZ2V4LmlzRW1wdHkoKSB8fCBtYXRjaGVzQW55KGZpZWxkTmFtZSwgcGFyYW1zLmZpZWxkUmVnZXgpKSApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmluZGV4IDlmMWViNzIuLmFkNTVlNzAgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC01OCw2ICs1OCwxNSBAQAogICogPGI+YXQgbGVhc3Qgb25lIG9mIGVhY2g8L2I+IHRvIGJlIHNlbGVjdGVkLgogICogPC9wPgogICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHNwZWNpZmllZCBhcyBhICZsdDtib29sJmd0OyAtIHdoZW4gc3BlY2lmaWVkCisgKiBhcyBmYWxzZSwgb25seSBmaWVsZHMgdGhhdCA8Yj5kbyBub3Q8L2I+IG1hdGNoIGEgc2NoZW1hIGZpZWxkL2R5bmFtaWMgZmllbGQgYXJlIHNlbGVjdGVkOworICogd2hlbiBzcGVjaWZpZWQgYXMgdHJ1ZSwgb25seSBmaWVsZHMgdGhhdCA8Yj5kbzwvYj4gbWF0Y2ggYSBzY2hlbWEgZmllbGQvZHluYW1pYyBmaWVsZCBhcmUKKyAqIHNlbGVjdGVkOgorICogPC9wPgorICogPHVsPgorICogICA8bGk+PGNvZGU+ZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkPC9jb2RlPiAtIHNlbGVjdGluZyBzcGVjaWZpYyBmaWVsZHMgYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhleSBtYXRjaCBhIHNjaGVtYSBmaWVsZDwvbGk+CisgKiA8L3VsPgorICogPHA+CiAgKiBPbmUgb3IgbW9yZSA8Y29kZT5leGNsdWRlczwvY29kZT4gJmx0O2xzdCZndDsgcGFyYW1zIG1heSBhbHNvIGJlIHNwZWNpZmllZCwgCiAgKiBjb250YWluaW5nIGFueSBvZiB0aGUgYWJvdmUgY3JpdGVyaWEsIGlkZW50aWZ5aW5nIGZpZWxkcyB0byBiZSBleGNsdWRlZCAKICAqIGZyb20gc2VlbGN0aW9uIGV2ZW4gaWYgdGhleSBtYXRjaCB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLiAgQXMgd2l0aCB0aGUgbWFpbiAKQEAgLTcxLDcgKzgwLDcgQEAKICAqIGZpZWxkcyB3aWxsIGJlIG11dGF0ZWQgaWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggImZvbyIgPGk+b3I8L2k+ICJiYXIiOyAKICAqIDxiPnVubGVzczwvYj4gdGhlIGZpZWxkIG5hbWUgY29udGFpbnMgdGhlIHN1YnN0cmluZyAiU0tJUCIgPGk+b3I8L2k+IAogICogdGhlIGZpZWxkVHlwZSBpcyAob3Igc3ViY2xhc3NlcykgRGF0ZUZpZWxkLiAgTWVhbmluZyBhIGZpZWxkIG5hbWVkIAotICogImZvb19TS0lQIiBpcyBnYXVydW50ZWVkIG5vdCB0byBiZSBzZWxlY3RlZCwgYnV0IGEgZmllbGQgbmFtZWQgImJhcl9zbWl0aCIgCisgKiAiZm9vX1NLSVAiIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIHNlbGVjdGVkLCBidXQgYSBmaWVsZCBuYW1lZCAiYmFyX3NtaXRoIiAKICAqIHRoYXQgdXNlcyBTdHJGaWVsZCB3aWxsIGJlIHNlbGVjdGVkLgogICogPC9wPgogICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgpAQCAtMTA2LDYgKzExNSwxMyBAQAogICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiB0eXBlTmFtZSA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ2xhc3MgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICBwdWJsaWMgQ29sbGVjdGlvbjxQYXR0ZXJuPiBmaWVsZFJlZ2V4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgcHVibGljIEJvb2xlYW4gZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkID0gbnVsbDsgLy8gbnVsbCA9PiBub3Qgc3BlY2lmaWVkCisKKyAgICBwdWJsaWMgYm9vbGVhbiBub1NlbGVjdG9yc1NwZWNpZmllZCgpIHsKKyAgICAgIHJldHVybiB0eXBlQ2xhc3MuaXNFbXB0eSgpICAmJiB0eXBlTmFtZS5pc0VtcHR5KCkgCisgICAgICAgICAgJiYgZmllbGRSZWdleC5pc0VtcHR5KCkgJiYgZmllbGROYW1lLmlzRW1wdHkoKSAKKyAgICAgICAgICAmJiBudWxsID09IGZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZDsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIFNlbGVjdG9yUGFyYW1zIGluY2x1c2lvbnMgPSBuZXcgU2VsZWN0b3JQYXJhbXMoKTsKQEAgLTEyMSw3ICsxMzcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5mb3JtKFNvbHJDb3JlKSBuZXZlciBjYWxsZWQ/Pz8iKTsKICAgfQogCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICBwdWJsaWMgc3RhdGljIFNlbGVjdG9yUGFyYW1zIHBhcnNlU2VsZWN0b3JQYXJhbXMoTmFtZWRMaXN0IGFyZ3MpIHsKICAgICBTZWxlY3RvclBhcmFtcyBwYXJhbXMgPSBuZXcgU2VsZWN0b3JQYXJhbXMoKTsKICAgICAKQEAgLTE0NSwxMyArMTYwLDQxIEBACiAgICAgLy8gcmVzb2x2ZSB0aGlzIGludG8gYWN0dWFsIENsYXNzIG9iamVjdHMgbGF0ZXIKICAgICBwYXJhbXMudHlwZUNsYXNzID0gb25lT3JNYW55KGFyZ3MsICJ0eXBlQ2xhc3MiKTsKIAorICAgIC8vIGdldEJvb2xlYW5BcmcoKSByZXR1cm5zIG51bGwgaWYgdGhlIGFyZyBpcyBub3Qgc3BlY2lmaWVkCisgICAgcGFyYW1zLmZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZCA9IGdldEJvb2xlYW5BcmcoYXJncywgImZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZCIpOworICAgIAogICAgIHJldHVybiBwYXJhbXM7CiAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U2VsZWN0b3JQYXJhbXM+IHBhcnNlU2VsZWN0b3JFeGNsdXNpb25QYXJhbXMoTmFtZWRMaXN0IGFyZ3MpIHsKKyAgICBDb2xsZWN0aW9uPFNlbGVjdG9yUGFyYW1zPiBleGNsdXNpb25zID0gbmV3IEFycmF5TGlzdDxTZWxlY3RvclBhcmFtcz4oKTsKKyAgICBMaXN0PE9iamVjdD4gZXhjTGlzdCA9IGFyZ3MuZ2V0QWxsKCJleGNsdWRlIik7CisgICAgZm9yIChPYmplY3QgZXhjT2JqIDogZXhjTGlzdCkgeworICAgICAgaWYgKG51bGwgPT0gZXhjT2JqKSB7CisgICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uCisgICAgICAgICAgICAoU0VSVkVSX0VSUk9SLCAiJ2V4Y2x1ZGUnIGluaXQgcGFyYW0gY2FuIG5vdCBiZSBudWxsIik7CisgICAgICB9CisgICAgICBpZiAoISAoZXhjT2JqIGluc3RhbmNlb2YgTmFtZWRMaXN0KSApIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24KKyAgICAgICAgICAgIChTRVJWRVJfRVJST1IsICInZXhjbHVkZScgaW5pdCBwYXJhbSBtdXN0IGJlIDxsc3QvPiIpOworICAgICAgfQorICAgICAgTmFtZWRMaXN0IGV4YyA9IChOYW1lZExpc3QpIGV4Y09iajsKKyAgICAgIGV4Y2x1c2lvbnMuYWRkKHBhcnNlU2VsZWN0b3JQYXJhbXMoZXhjKSk7CisgICAgICBpZiAoMCA8IGV4Yy5zaXplKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgIlVuZXhwZWN0ZWQgJ2V4Y2x1ZGUnIGluaXQgc3ViLXBhcmFtKHMpOiAnIiArCisgICAgICAgICAgICAgICAgYXJncy5nZXROYW1lKDApICsgIiciKTsKKyAgICAgIH0KKyAgICAgIC8vIGNhbGwgb25jZSBwZXIgaW5zdGFuY2UKKyAgICAgIGFyZ3MucmVtb3ZlKCJleGNsdWRlIik7CisgICAgfQorICAgIHJldHVybiBleGNsdXNpb25zOworICB9CisgIAogCiAgIC8qKgogICAgKiBIYW5kbGVzIGNvbW1vbiBpbml0aWFsaXphdGlvbiByZWxhdGVkIHRvIHNvdXJjZSBmaWVsZHMgZm9yIAotICAgKiBjb25zdHJ1Y3RvcmluZyB0aGUgRmllbGROYW1lU2VsZWN0b3IgdG8gYmUgdXNlZC4KKyAgICogY29uc3RydWN0aW5nIHRoZSBGaWVsZE5hbWVTZWxlY3RvciB0byBiZSB1c2VkLgogICAgKgogICAgKiBXaWxsIGVycm9yIGlmIGFueSB1bmV4cGVjdGVkIGluaXQgYXJncyBhcmUgZm91bmQsIHNvIHN1YmNsYXNzZXMgc2hvdWxkCiAgICAqIHJlbW92ZSBhbnkgc3ViY2xhc3Mtc3BlY2lmaWMgaW5pdCBhcmdzIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgpAQCAtMTYxLDI3ICsyMDQsOCBAQAogICBwdWJsaWMgdm9pZCBpbml0KE5hbWVkTGlzdCBhcmdzKSB7CiAKICAgICBpbmNsdXNpb25zID0gcGFyc2VTZWxlY3RvclBhcmFtcyhhcmdzKTsKKyAgICBleGNsdXNpb25zID0gcGFyc2VTZWxlY3RvckV4Y2x1c2lvblBhcmFtcyhhcmdzKTsKIAotICAgIExpc3Q8T2JqZWN0PiBleGNMaXN0ID0gYXJncy5nZXRBbGwoImV4Y2x1ZGUiKTsKLSAgICBmb3IgKE9iamVjdCBleGNPYmogOiBleGNMaXN0KSB7Ci0gICAgICBpZiAobnVsbCA9PSBleGNPYmopIHsKLSAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24KLSAgICAgICAgICAoU0VSVkVSX0VSUk9SLCAiJ2V4Y2x1ZGUnIGluaXQgcGFyYW0gY2FuIG5vdCBiZSBudWxsIik7IAotICAgICAgfQotICAgICAgaWYgKCEgKGV4Y09iaiBpbnN0YW5jZW9mIE5hbWVkTGlzdCkgKSB7Ci0gICAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uCi0gICAgICAgICAgKFNFUlZFUl9FUlJPUiwgIidleGNsdWRlJyBpbml0IHBhcmFtIG11c3QgYmUgPGxzdC8+Iik7IAotICAgICAgfQotICAgICAgTmFtZWRMaXN0IGV4YyA9IChOYW1lZExpc3QpIGV4Y09iajsKLSAgICAgIGV4Y2x1c2lvbnMuYWRkKHBhcnNlU2VsZWN0b3JQYXJhbXMoZXhjKSk7Ci0gICAgICBpZiAoMCA8IGV4Yy5zaXplKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgJ2V4Y2x1ZGUnIGluaXQgc3ViLXBhcmFtKHMpOiAnIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldE5hbWUoMCkgKyAiJyIpOwotICAgICAgfQotICAgICAgLy8gY2FsbCBvbmNlIHBlciBpbnN0YW5jZQotICAgICAgYXJncy5yZW1vdmUoImV4Y2x1ZGUiKTsKLSAgICB9CiAgICAgaWYgKDAgPCBhcmdzLnNpemUoKSkgewogICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGluaXQgcGFyYW0ocyk6ICciICsgCkBAIC0xOTUsMjUgKzIxOSwxMyBAQAogICAgIAogICAgIHNlbGVjdG9yID0gCiAgICAgICBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmNyZWF0ZUZpZWxkTmFtZVNlbGVjdG9yCi0gICAgICAoY29yZS5nZXRSZXNvdXJjZUxvYWRlcigpLAotICAgICAgIGNvcmUsCi0gICAgICAgaW5jbHVzaW9ucy5maWVsZE5hbWUsCi0gICAgICAgaW5jbHVzaW9ucy50eXBlTmFtZSwKLSAgICAgICBpbmNsdXNpb25zLnR5cGVDbGFzcywKLSAgICAgICBpbmNsdXNpb25zLmZpZWxkUmVnZXgsCi0gICAgICAgZ2V0RGVmYXVsdFNlbGVjdG9yKGNvcmUpKTsKKyAgICAgICAgICAoY29yZS5nZXRSZXNvdXJjZUxvYWRlcigpLCBjb3JlLCBpbmNsdXNpb25zLCBnZXREZWZhdWx0U2VsZWN0b3IoY29yZSkpOwogCiAgICAgZm9yIChTZWxlY3RvclBhcmFtcyBleGMgOiBleGNsdXNpb25zKSB7CiAgICAgICBzZWxlY3RvciA9IEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3Iud3JhcAogICAgICAgICAoc2VsZWN0b3IsCiAgICAgICAgICBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLmNyZWF0ZUZpZWxkTmFtZVNlbGVjdG9yCi0gICAgICAgICAoY29yZS5nZXRSZXNvdXJjZUxvYWRlcigpLAotICAgICAgICAgIGNvcmUsCi0gICAgICAgICAgZXhjLmZpZWxkTmFtZSwKLSAgICAgICAgICBleGMudHlwZU5hbWUsCi0gICAgICAgICAgZXhjLnR5cGVDbGFzcywKLSAgICAgICAgICBleGMuZmllbGRSZWdleCwKLSAgICAgICAgICBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLlNFTEVDVF9OT19GSUVMRFMpKTsKKyAgICAgICAgICAgICAoY29yZS5nZXRSZXNvdXJjZUxvYWRlcigpLCBjb3JlLCBleGMsIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuU0VMRUNUX05PX0ZJRUxEUykpOwogICAgIH0KICAgfQogICAKQEAgLTI3MCw3ICsyODIsMjggQEAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKKyAgLyoqCisgICAqIFJlbW92ZXMgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBrZXkgZnJvbSBOYW1lZExpc3QsIHJldHVybmluZyB0aGUgQm9vbGVhbgorICAgKiB0aGF0IGtleSByZWZlcnJlZCB0bywgb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBzcGVjaWZpZWQuCisgICAqIEBleGNlcHRpb24gU29sckV4Y2VwdGlvbiBpbnZhbGlkIHR5cGUgb3Igc3RydWN0dXJlCisgICAqLworICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhbkFyZyhmaW5hbCBOYW1lZExpc3QgYXJncywgZmluYWwgU3RyaW5nIGtleSkgeworICAgIEJvb2xlYW4gYm9vbDsKKyAgICBMaXN0IHZhbHVlcyA9IGFyZ3MuZ2V0QWxsKGtleSk7CisgICAgaWYgKDAgPT0gdmFsdWVzLnNpemUoKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oU0VSVkVSX0VSUk9SLCAiT25seSBvbmUgJyIgKyBrZXkgKyAiJyBpcyBhbGxvd2VkIik7CisgICAgfQorICAgIE9iamVjdCBvID0gYXJncy5yZW1vdmUoa2V5KTsKKyAgICBpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgIGJvb2wgPSAoQm9vbGVhbilvOworICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgeworICAgICAgYm9vbCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG8udG9TdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKFNFUlZFUl9FUlJPUiwgIiciICsga2V5ICsgIicgbXVzdCBoYXZlIHR5cGUgJ2Jvb2wnIG9yICdzdHInOyBmb3VuZCAiICsgby5nZXRDbGFzcygpKTsKKyAgICB9CisgICAgcmV0dXJuIGJvb2w7CisgIH0KIH0KLQotCi0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZUJvb2xlYW5GaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZUJvb2xlYW5GaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMwZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlQm9vbGVhbkZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb24uRXJyb3JDb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuU29sclF1ZXJ5UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5Cb29sRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIDxwPgorICogQXR0ZW1wdHMgdG8gbXV0YXRlIHNlbGVjdGVkIGZpZWxkcyB0aGF0IGhhdmUgb25seSBDaGFyU2VxdWVuY2UtdHlwZWQgdmFsdWVzCisgKiBpbnRvIEJvb2xlYW4gdmFsdWVzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZGVmYXVsdCBzZWxlY3Rpb24gYmVoYXZpb3IgaXMgdG8gbXV0YXRlIGJvdGggdGhvc2UgZmllbGRzIHRoYXQgZG9uJ3QgbWF0Y2gKKyAqIGEgc2NoZW1hIGZpZWxkLCBhcyB3ZWxsIGFzIHRob3NlIGZpZWxkcyB0aGF0IGRvIG1hdGNoIGEgc2NoZW1hIGZpZWxkIGFuZCBoYXZlCisgKiBhIGZpZWxkIHR5cGUgdGhhdCB1c2VzIGNsYXNzIHNvbHIuQm9vbGVhbkZpZWxkLgorICogPC9wPgorICogPHA+CisgKiBJZiBhbGwgdmFsdWVzIGFyZSBwYXJzZWFibGUgYXMgYm9vbGVhbiAob3IgYXJlIGFscmVhZHkgQm9vbGVhbiksIHRoZW4gdGhlIGZpZWxkCisgKiB3aWxsIGJlIG11dGF0ZWQsIHJlcGxhY2luZyBlYWNoIHZhbHVlIHdpdGggaXRzIHBhcnNlZCBCb29sZWFuIGVxdWl2YWxlbnQ7IAorICogb3RoZXJ3aXNlLCBubyBtdXRhdGlvbiB3aWxsIG9jY3VyLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZGVmYXVsdCB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMgYXJlICJ0cnVlIiBhbmQgImZhbHNlIiwgcmVzcGVjdGl2ZWx5LCBhbmQgbWF0Y2gKKyAqIGNhc2UtaW5zZW5zaXRpdmVseS4gIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoZSBhY2NlcHRhYmxlIHZhbHVlcywgYW5kCisgKiByZXF1aXJlcyBhIGNhc2Utc2Vuc2l0aXZlIG1hdGNoIC0gbm90ZSB0aGF0IGVpdGhlciBpbmRpdmlkdWFsICZsdDtzdHImZ3Q7IGVsZW1lbnRzCisgKiBvciAmbHQ7YXJyJmd0Oy1zIG9mICZsdDtzdHImZ3Q7IGVsZW1lbnRzIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRydWVWYWx1ZS1zCisgKiBhbmQgZmFsc2VWYWx1ZS1zOgorICogPC9wPgorICoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiZndDsKKyAqICAgJmx0O3N0ciBuYW1lPSJjYXNlU2Vuc2l0aXZlIiZndDt0cnVlJmx0Oy9zdHImZ3Q7CisgKiAgICZsdDtzdHIgbmFtZT0idHJ1ZVZhbHVlIiZndDtUcnVlJmx0Oy9zdHImZ3Q7CisgKiAgICZsdDtzdHIgbmFtZT0idHJ1ZVZhbHVlIiZndDtZZXMmbHQ7L3N0ciZndDsKKyAqICAgJmx0O2FyciBuYW1lPSJmYWxzZVZhbHVlIiZndDsKKyAqICAgICAmbHQ7c3RyJmd0O0ZhbHNlJmx0Oy9zdHImZ3Q7CisgKiAgICAgJmx0O3N0ciZndDtObyZsdDsvc3RyJmd0OworICogICAmbHQ6L2FyciZndDsKKyAqICZsdDsvcHJvY2Vzc29yJmd0OzwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IGV4dGVuZHMgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV9WQUxVRVNfUEFSQU0gPSAidHJ1ZVZhbHVlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFX1ZBTFVFU19QQVJBTSA9ICJmYWxzZVZhbHVlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfU0VOU0lUSVZFX1BBUkFNID0gImNhc2VTZW5zaXRpdmUiOworICAKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiB0cnVlVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ0cnVlIiB9KSk7CisgIHByaXZhdGUgU2V0PFN0cmluZz4gZmFsc2VWYWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImZhbHNlIiB9KSk7CisgIHByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gZmFsc2U7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBVcGRhdGVSZXF1ZXN0UHJvY2Vzc29yIGdldEluc3RhbmNlKFNvbHJRdWVyeVJlcXVlc3QgcmVxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29sclF1ZXJ5UmVzcG9uc2UgcnNwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgcmV0dXJuIG5ldyBBbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yKGdldFNlbGVjdG9yKCksIG5leHQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIE9iamVjdCBtdXRhdGVWYWx1ZShPYmplY3Qgc3JjVmFsKSB7CisgICAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKKyAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsID0gY2FzZVNlbnNpdGl2ZSA/IHNyY1ZhbC50b1N0cmluZygpIDogc3JjVmFsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOworICAgICAgICAgIGlmICh0cnVlVmFsdWVzLmNvbnRhaW5zKHN0cmluZ1ZhbCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoZmFsc2VWYWx1ZXMuY29udGFpbnMoc3RyaW5nVmFsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY1ZhbCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICByZXR1cm4gc3JjVmFsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTS0lQX0ZJRUxEX1ZBTFVFX0xJU1RfU0lOR0xFVE9OOworICAgICAgfQorICAgIH07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdChOYW1lZExpc3QgYXJncykgeworICAgIE9iamVjdCBjYXNlU2Vuc2l0aXZlUGFyYW0gPSBhcmdzLnJlbW92ZShDQVNFX1NFTlNJVElWRV9QQVJBTSk7CisgICAgaWYgKG51bGwgIT0gY2FzZVNlbnNpdGl2ZVBhcmFtKSB7CisgICAgICBpZiAoY2FzZVNlbnNpdGl2ZVBhcmFtIGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICBjYXNlU2Vuc2l0aXZlID0gKEJvb2xlYW4pY2FzZVNlbnNpdGl2ZVBhcmFtOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IEJvb2xlYW4udmFsdWVPZihjYXNlU2Vuc2l0aXZlUGFyYW0udG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorCisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHRydWVWYWx1ZXNQYXJhbSA9IG9uZU9yTWFueShhcmdzLCBUUlVFX1ZBTFVFU19QQVJBTSk7CisgICAgaWYgKCAhIHRydWVWYWx1ZXNQYXJhbS5pc0VtcHR5KCkpIHsKKyAgICAgIHRydWVWYWx1ZXMuY2xlYXIoKTsKKyAgICAgIGZvciAoU3RyaW5nIHRydWVWYWwgOiB0cnVlVmFsdWVzUGFyYW0pIHsKKyAgICAgICAgdHJ1ZVZhbHVlcy5hZGQoY2FzZVNlbnNpdGl2ZSA/IHRydWVWYWwgOiB0cnVlVmFsLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKSk7CisgICAgICB9CisgICAgfQorCisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGZhbHNlVmFsdWVzUGFyYW0gPSBvbmVPck1hbnkoYXJncywgRkFMU0VfVkFMVUVTX1BBUkFNKTsKKyAgICBpZiAoICEgZmFsc2VWYWx1ZXNQYXJhbS5pc0VtcHR5KCkpIHsKKyAgICAgIGZhbHNlVmFsdWVzLmNsZWFyKCk7CisgICAgICBmb3IgKFN0cmluZyB2YWwgOiBmYWxzZVZhbHVlc1BhcmFtKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmYWxzZVZhbCA9IGNhc2VTZW5zaXRpdmUgPyB2YWwgOiB2YWwudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOworICAgICAgICBpZiAodHJ1ZVZhbHVlcy5jb250YWlucyhmYWxzZVZhbCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgU29sckV4Y2VwdGlvbihFcnJvckNvZGUuU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAiUGFyYW0gJyIgKyBGQUxTRV9WQUxVRVNfUEFSQU0gKyAiJyBjb250YWlucyBhIHZhbHVlIGFsc28gaW4gcGFyYW0gJyIgKyBUUlVFX1ZBTFVFU19QQVJBTQorICAgICAgICAgICAgICAgICAgKyAiJzogJyIgKyB2YWwgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGZhbHNlVmFsdWVzLmFkZChmYWxzZVZhbCk7CisgICAgICB9CisgICAgfQorICAgIHN1cGVyLmluaXQoYXJncyk7CisgIH0KKworCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgbWF0Y2ggYW55IHNjaGVtYSBmaWVsZCBvciBkeW5hbWljIGZpZWxkLAorICAgKiAgICAgICAgICAgb3IgaWYgdGhlIG1hdGNoZWQgZmllbGQncyB0eXBlIGlzIEJvb2xGaWVsZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLkZpZWxkTmFtZVNlbGVjdG9yCisgIGdldERlZmF1bHRTZWxlY3RvcihmaW5hbCBTb2xyQ29yZSBjb3JlKSB7CisKKyAgICByZXR1cm4gbmV3IEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuRmllbGROYW1lU2VsZWN0b3IoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE11dGF0ZShmaW5hbCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIGZpbmFsIEluZGV4U2NoZW1hIHNjaGVtYSA9IGNvcmUuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgICAgIEZpZWxkVHlwZSB0eXBlID0gc2NoZW1hLmdldEZpZWxkVHlwZU5vRXgoZmllbGROYW1lKTsKKyAgICAgICAgcmV0dXJuIChudWxsID09IHR5cGUpIHx8ICh0eXBlIGluc3RhbmNlb2YgQm9vbEZpZWxkKTsKKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VEYXRlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VEYXRlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhZWNiZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Mb2NhbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJRdWVyeVJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlNvbHJRdWVyeVJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRGF0ZVZhbHVlRmllbGRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRmllbGRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuSW5kZXhTY2hlbWE7CitpbXBvcnQgb3JnLmpvZGEudGltZS5EYXRlVGltZTsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkRhdGVUaW1lWm9uZTsKK2ltcG9ydCBvcmcuam9kYS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdDsKK2ltcG9ydCBvcmcuam9kYS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogPHA+CisgKiBBdHRlbXB0cyB0byBtdXRhdGUgc2VsZWN0ZWQgZmllbGRzIHRoYXQgaGF2ZSBvbmx5IENoYXJTZXF1ZW5jZS10eXBlZCB2YWx1ZXMKKyAqIGludG8gRGF0ZSB2YWx1ZXMuICBTb2xyIHdpbGwgY29udGludWUgdG8gaW5kZXggZGF0ZS90aW1lcyBpbiB0aGUgVVRDIHRpbWUKKyAqIHpvbmUsIGJ1dCB0aGUgaW5wdXQgZGF0ZS90aW1lcyBtYXkgYmUgZXhwcmVzc2VkIHVzaW5nIG90aGVyIHRpbWUgem9uZXMsCisgKiBhbmQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gVVRDIHdoZW4gdGhleSBhcmUgbXV0YXRlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGRlZmF1bHQgc2VsZWN0aW9uIGJlaGF2aW9yIGlzIHRvIG11dGF0ZSBib3RoIHRob3NlIGZpZWxkcyB0aGF0IGRvbid0IG1hdGNoCisgKiBhIHNjaGVtYSBmaWVsZCwgYXMgd2VsbCBhcyB0aG9zZSBmaWVsZHMgdGhhdCBtYXRjaCBhIHNjaGVtYSBmaWVsZCB3aXRoIGEgZmllbGQgCisgKiB0eXBlIHRoYXQgdXNlcyBjbGFzcyBzb2xyLkRhdGVGaWVsZCBvciBhIHN1Yi1jbGFzcywgaW5jbHVkaW5nIHNvbHIuVHJpZURhdGVGaWVsZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYWxsIHZhbHVlcyBhcmUgcGFyc2VhYmxlIGFzIGRhdGVzIChvciBhcmUgYWxyZWFkeSBEYXRlKSwgdGhlbiB0aGUgZmllbGQgd2lsbAorICogYmUgbXV0YXRlZCwgcmVwbGFjaW5nIGVhY2ggdmFsdWUgd2l0aCBpdHMgcGFyc2VkIERhdGUgZXF1aXZhbGVudDsgb3RoZXJ3aXNlLCBubworICogbXV0YXRpb24gd2lsbCBvY2N1ci4KKyAqIDwvcD4KKyAqIDxwPgorICogT25lIG9yIG1vcmUgZGF0ZSAiZm9ybWF0IiBzcGVjaWZpZXJzIG11c3QgYmUgc3BlY2lmaWVkLiAgU2VlIAorICogPGEgaHJlZj0iaHR0cDovL2pvZGEtdGltZS5zb3VyY2Vmb3JnZS5uZXQvYXBpZG9jcy9vcmcvam9kYS90aW1lL2Zvcm1hdC9EYXRlVGltZUZvcm1hdC5odG1sIgorICogPkpvZGEtdGltZSdzIERhdGVUaW1lRm9ybWF0IGphdmFkb2NzPC9hPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBmb3JtYXQgc3RyaW5ncy4KKyAqIDwvcD4KKyAqIDxwPgorICogQSBkZWZhdWx0IHRpbWUgem9uZSBuYW1lIG9yIG9mZnNldCBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgZm9yIHRob3NlIGRhdGVzCisgKiB0aGF0IGRvbid0IGluY2x1ZGUgYW4gZXhwbGljaXQgem9uZS9vZmZzZXQuICBOT1RFOiB0aHJlZS1sZXR0ZXIgem9uZQorICogZGVzaWduYXRpb25zIGxpa2UgIkVTVCIgYXJlIG5vdCBwYXJzZWFibGUgKHdpdGggdGhlIHNpbmdsZSBleGNlcHRpb24gb2YgIlVUQyIpLAorICogYmVjYXVzZSB0aGV5IGFyZSBhbWJpZ3VvdXMuICBJZiBubyBkZWZhdWx0IHRpbWUgem9uZSBpcyBzcGVjaWZpZWQsIFVUQyB3aWxsIGJlCisgKiB1c2VkLiBTZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX3R6X2RhdGFiYXNlX3RpbWVfem9uZXMiCisgKiA+V2lraXBlZGlhJ3MgbGlzdCBvZiBUWiBkYXRhYmFzZSB0aW1lIHpvbmUgbmFtZXM8L2E+LgorICogPC9wPgorICogPHA+CisgKiBUaGUgbG9jYWxlIHRvIHVzZSB3aGVuIHBhcnNpbmcgZmllbGQgdmFsdWVzIHVzaW5nIHRoZSBzcGVjaWZpZWQgZm9ybWF0cyBtYXkKKyAqIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAgSWYgbm8gbG9jYWxlIGlzIGNvbmZpZ3VyZWQsIHRoZW4ge0BsaW5rIExvY2FsZSNST09UfQorICogd2lsbCBiZSB1c2VkLiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIHRoZSBGcmVuY2gvRnJhbmNlIGxvY2FsZSBhbmQKKyAqIHR3byBkYXRlIGZvcm1hdHMgdGhhdCB3aWxsIHBhcnNlIHRoZSBzdHJpbmdzICJsZSBtYXJkaSA4IGphbnZpZXIgMjAxMyIgYW5kIAorICogImxlIDI4IGTDqWMuIDIwMTAgw6AgMTUgaCAzMCIsIHJlc3BlY3RpdmVseS4gIE5vdGUgdGhhdCBlaXRoZXIgaW5kaXZpZHVhbCAmbHQ7c3RyJmd0OworICogZWxlbWVudHMgb3IgJmx0O2FyciZndDstcyBvZiAmbHQ7c3RyJmd0OyBlbGVtZW50cyBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorICogZGF0ZSBmb3JtYXQocyk6CisgKiA8L3A+CisgKgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiJmd0OworICogICAmbHQ7c3RyIG5hbWU9ImRlZmF1bHRUaW1lWm9uZSImZ3Q7RXVyb3BlL1BhcmlzJmx0Oy9zdHImZ3Q7CisgKiAgICZsdDtzdHIgbmFtZT0ibG9jYWxlIiZndDtmcl9GUiZsdDsvc3RyJmd0OworICogICAmbHQ7YXJyIG5hbWU9ImZvcm1hdCImZ3Q7CisgKiAgICAgJmx0O3N0ciZndDsnbGUnIEVFRUUgZGQgTU1NTSB5eXl5Jmx0Oy9zdHImZ3Q7CisgKiAgICAgJmx0O3N0ciZndDsnbGUnIGRkIE1NTS4geXl5eSAnw6AnIEhIICdoJyBtbSZsdDsvc3RyJmd0OworICogICAmbHQ7L2FyciZndDsKKyAqICZsdDsvcHJvY2Vzc29yJmd0OzwvcHJlPgorICoKKyAqIDxwPgorICogU2VlIHtAbGluayBMb2NhbGV9IGZvciBhIGRlc2NyaXB0aW9uIG9mIGFjY2VwdGFibGUgbGFuZ3VhZ2UsIGNvdW50cnkgKG9wdGlvbmFsKQorICogYW5kIHZhcmlhbnQgKG9wdGlvbmFsKSB2YWx1ZXMsIGpvaW5lZCB3aXRoIHVuZGVyc2NvcmUocykuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkgZXh0ZW5kcyBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhcnNlRGF0ZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFNfUEFSQU0gPSAiZm9ybWF0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVElNRV9aT05FX1BBUkFNID0gImRlZmF1bHRUaW1lWm9uZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfUEFSQU0gPSAibG9jYWxlIjsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsRGF0ZVRpbWVGb3JtYXR0ZXI+IGZvcm1hdHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsRGF0ZVRpbWVGb3JtYXR0ZXI+KCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBVcGRhdGVSZXF1ZXN0UHJvY2Vzc29yIGdldEluc3RhbmNlKFNvbHJRdWVyeVJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xyUXVlcnlSZXNwb25zZSByc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgbmV4dCkgeworICAgIHJldHVybiBuZXcgQWxsVmFsdWVzT3JOb25lRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvcihnZXRTZWxlY3RvcigpLCBuZXh0KSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBPYmplY3QgbXV0YXRlVmFsdWUoT2JqZWN0IHNyY1ZhbCkgeworICAgICAgICBpZiAoc3JjVmFsIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CisgICAgICAgICAgU3RyaW5nIHNyY1N0cmluZ1ZhbCA9IHNyY1ZhbC50b1N0cmluZygpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxEYXRlVGltZUZvcm1hdHRlcj4gZm9ybWF0IDogZm9ybWF0cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBEYXRlVGltZUZvcm1hdHRlciBwYXJzZXIgPSBmb3JtYXQuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUaW1lID0gcGFyc2VyLnBhcnNlRGF0ZVRpbWUoc3JjU3RyaW5nVmFsKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUaW1lLndpdGhab25lKERhdGVUaW1lWm9uZS5VVEMpLnRvRGF0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ2YWx1ZSAne30nIGlzIG5vdCBwYXJzZWFibGUgd2l0aCBmb3JtYXQgJ3t9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzcmNTdHJpbmdWYWwsIGZvcm1hdC5nZXRLZXkoKSB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbG9nLmRlYnVnKCJ2YWx1ZSAne30nIHdhcyBub3QgcGFyc2VkIGJ5IGFueSBjb25maWd1cmVkIGZvcm1hdCwgdGh1cyB3YXMgbm90IG11dGF0ZWQiLCBzcmNTdHJpbmdWYWwpOworICAgICAgICAgIHJldHVybiBTS0lQX0ZJRUxEX1ZBTFVFX0xJU1RfU0lOR0xFVE9OOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBEYXRlKSB7CisgICAgICAgICAgcmV0dXJuIHNyY1ZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoTmFtZWRMaXN0IGFyZ3MpIHsKKyAgICAKKyAgICBMb2NhbGUgbG9jYWxlID0gTG9jYWxlLlJPT1Q7CisgICAgCisgICAgU3RyaW5nIGxvY2FsZVBhcmFtID0gKFN0cmluZylhcmdzLnJlbW92ZShMT0NBTEVfUEFSQU0pOworICAgIGlmIChudWxsICE9IGxvY2FsZVBhcmFtKSB7CisgICAgICBsb2NhbGUgPSBMb2NhbGVVdGlscy50b0xvY2FsZShsb2NhbGVQYXJhbSk7CisgICAgfQorCisgICAgT2JqZWN0IGRlZmF1bHRUaW1lWm9uZVBhcmFtID0gYXJncy5yZW1vdmUoREVGQVVMVF9USU1FX1pPTkVfUEFSQU0pOworICAgIERhdGVUaW1lWm9uZSBkZWZhdWx0VGltZVpvbmUgPSBEYXRlVGltZVpvbmUuVVRDOworICAgIGlmIChudWxsICE9IGRlZmF1bHRUaW1lWm9uZVBhcmFtKSB7CisgICAgICBkZWZhdWx0VGltZVpvbmUgPSBEYXRlVGltZVpvbmUuZm9ySUQoZGVmYXVsdFRpbWVab25lUGFyYW0udG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGZvcm1hdHNQYXJhbSA9IG9uZU9yTWFueShhcmdzLCBGT1JNQVRTX1BBUkFNKTsKKyAgICBpZiAobnVsbCAhPSBmb3JtYXRzUGFyYW0pIHsKKyAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZm9ybWF0c1BhcmFtKSB7CisgICAgICAgIGZvcm1hdHMucHV0KHZhbHVlLCBEYXRlVGltZUZvcm1hdC5mb3JQYXR0ZXJuKHZhbHVlKS53aXRoWm9uZShkZWZhdWx0VGltZVpvbmUpLndpdGhMb2NhbGUobG9jYWxlKSk7CisgICAgICB9CisgICAgfQorICAgIHN1cGVyLmluaXQoYXJncyk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBkb2Vzbid0IG1hdGNoIGFueSBzY2hlbWEgZmllbGQgb3IgZHluYW1pYyBmaWVsZCwKKyAgICogICAgICAgICAgIG9yIGlmIHRoZSBtYXRjaGVkIGZpZWxkJ3MgdHlwZSBpcyBCb29sRmllbGQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5GaWVsZE5hbWVTZWxlY3RvcgorICBnZXREZWZhdWx0U2VsZWN0b3IoZmluYWwgU29sckNvcmUgY29yZSkgeworCisgICAgcmV0dXJuIG5ldyBGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yLkZpZWxkTmFtZVNlbGVjdG9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRNdXRhdGUoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBmaW5hbCBJbmRleFNjaGVtYSBzY2hlbWEgPSBjb3JlLmdldExhdGVzdFNjaGVtYSgpOworICAgICAgICBGaWVsZFR5cGUgdHlwZSA9IHNjaGVtYS5nZXRGaWVsZFR5cGVOb0V4KGZpZWxkTmFtZSk7CisgICAgICAgIHJldHVybiAobnVsbCA9PSB0eXBlKSB8fCB0eXBlIGluc3RhbmNlb2YgRGF0ZVZhbHVlRmllbGRUeXBlOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOTg0YwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJRdWVyeVJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlNvbHJRdWVyeVJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRG91YmxlVmFsdWVGaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIDxwPgorICogQXR0ZW1wdHMgdG8gbXV0YXRlIHNlbGVjdGVkIGZpZWxkcyB0aGF0IGhhdmUgb25seSBDaGFyU2VxdWVuY2UtdHlwZWQgdmFsdWVzCisgKiBpbnRvIERvdWJsZSB2YWx1ZXMuICBJZiByZXF1aXJlZCwgcm91bmRpbmcgdXNlcyBjZWlsaW5nIG1vZGU6CisgKiB7QGxpbmsgUm91bmRpbmdNb2RlI0NFSUxJTkd9LiAgR3JvdXBpbmcgc2VwYXJhdG9ycyAoJywnIGluIHRoZSBST09UIGxvY2FsZSkKKyAqIGFyZSBwYXJzZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBiZWhhdmlvciBpcyB0byBtdXRhdGUgYm90aCB0aG9zZSBmaWVsZHMgdGhhdCBkb24ndCBtYXRjaAorICogYSBzY2hlbWEgZmllbGQsIGFzIHdlbGwgYXMgdGhvc2UgZmllbGRzIHRoYXQgbWF0Y2ggYSBzY2hlbWEgZmllbGQgd2l0aCBhIGZpZWxkIAorICogdHlwZSB0aGF0IHVzZXMgY2xhc3Mgc29sci5Eb3VibGVGaWVsZCwgc29sci5UcmllRG91YmxlRmllbGQsIG9yIAorICogc29sci5Tb3J0YWJsZURvdWJsZUZpZWxkLgorICogPC9wPgorICogPHA+CisgKiBJZiBhbGwgdmFsdWVzIGFyZSBwYXJzZWFibGUgYXMgZG91YmxlIChvciBhcmUgYWxyZWFkeSBEb3VibGUpLCB0aGVuIHRoZSBmaWVsZAorICogd2lsbCBiZSBtdXRhdGVkLCByZXBsYWNpbmcgZWFjaCB2YWx1ZSB3aXRoIGl0cyBwYXJzZWQgRG91YmxlIGVxdWl2YWxlbnQ7IAorICogb3RoZXJ3aXNlLCBubyBtdXRhdGlvbiB3aWxsIG9jY3VyLgorICogPC9wPgorICogPHA+CisgKiBUaGUgbG9jYWxlIHRvIHVzZSB3aGVuIHBhcnNpbmcgZmllbGQgdmFsdWVzLCB3aGljaCB3aWxsIGFmZmVjdCB0aGUgcmVjb2duaXplZAorICogZ3JvdXBpbmcgc2VwYXJhdG9yIGFuZCBkZWNpbWFsIGNoYXJhY3RlcnMsIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gIElmCisgKiBubyBsb2NhbGUgaXMgY29uZmlndXJlZCwgdGhlbiB7QGxpbmsgTG9jYWxlI1JPT1R9IHdpbGwgYmUgdXNlZC4gIFRoZSBmb2xsb3dpbmcKKyAqIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIHRoZSBSdXNzaWFuL1J1c3NpYSBsb2NhbGUsIHdoaWNoIHdpbGwgcGFyc2UgdGhlIHN0cmluZworICogc3RyaW5nICIxMsKgMzQ1LDg5OSIgYXMgZG91YmxlIHZhbHVlIDEyMzQ1Ljg5OSAodGhlIGdyb3VwaW5nIHNlcGFyYXRvcgorICogY2hhcmFjdGVyIGlzIFUrMDBBTyBOTy1CUkVBSyBTUEFDRSkuCisgKiA8L3A+CisgKgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSImZ3Q7CisgKiAgICZsdDtzdHIgbmFtZT0ibG9jYWxlIiZndDtydV9SVSZsdDsvc3RyJmd0OworICogJmx0Oy9wcm9jZXNzb3ImZ3Q7PC9wcmU+CisgKgorICogPHA+CisgKiBTZWUge0BsaW5rIExvY2FsZX0gZm9yIGEgZGVzY3JpcHRpb24gb2YgYWNjZXB0YWJsZSBsYW5ndWFnZSwgY291bnRyeSAob3B0aW9uYWwpCisgKiBhbmQgdmFyaWFudCAob3B0aW9uYWwpIHZhbHVlcywgam9pbmVkIHdpdGggdW5kZXJzY29yZShzKS4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IGV4dGVuZHMgUGFyc2VOdW1lcmljRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGFyc2VEb3VibGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuY2xhc3MpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBnZXRJbnN0YW5jZShTb2xyUXVlcnlSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29sclF1ZXJ5UmVzcG9uc2UgcnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVSZXF1ZXN0UHJvY2Vzc29yIG5leHQpIHsKKyAgICByZXR1cm4gbmV3IFBhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3IoZ2V0U2VsZWN0b3IoKSwgbG9jYWxlLCBuZXh0KTsgCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yIGV4dGVuZHMgQWxsVmFsdWVzT3JOb25lRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2NhbGUgbG9jYWxlOworICAgIC8vIE51bWJlckZvcm1hdCBpbnN0YW5jZXMgYXJlIG5vdCB0aHJlYWQgc2FmZQorICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8TnVtYmVyRm9ybWF0PiBudW1iZXJGb3JtYXQgPSBuZXcgVGhyZWFkTG9jYWw8TnVtYmVyRm9ybWF0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIE51bWJlckZvcm1hdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgIE51bWJlckZvcm1hdCBmb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UobG9jYWxlKTsKKyAgICAgICAgZm9ybWF0LnNldFBhcnNlSW50ZWdlck9ubHkoZmFsc2UpOworICAgICAgICBmb3JtYXQuc2V0Um91bmRpbmdNb2RlKFJvdW5kaW5nTW9kZS5DRUlMSU5HKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgIH0KKyAgICB9OworCisgICAgUGFyc2VEb3VibGVGaWVsZFVwZGF0ZVByb2Nlc3NvcihGaWVsZE5hbWVTZWxlY3RvciBzZWxlY3RvciwgTG9jYWxlIGxvY2FsZSwgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgICBzdXBlcihzZWxlY3RvciwgbmV4dCk7CisgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG11dGF0ZVZhbHVlKE9iamVjdCBzcmNWYWwpIHsKKyAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbCA9IHNyY1ZhbC50b1N0cmluZygpOyAKKyAgICAgICAgUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKKyAgICAgICAgTnVtYmVyIG51bWJlciA9IG51bWJlckZvcm1hdC5nZXQoKS5wYXJzZShzdHJpbmdWYWwsIHBvcyk7CisgICAgICAgIGlmIChwb3MuZ2V0SW5kZXgoKSAhPSBzdHJpbmdWYWwubGVuZ3RoKCkpIHsKKyAgICAgICAgICBsb2cuZGVidWcoInZhbHVlICd7fScgaXMgbm90IHBhcnNlYWJsZSwgdGh1cyBub3QgbXV0YXRlZDsgdW5wYXJzZWQgY2hhcnM6ICd7fSciLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzcmNWYWwsIHN0cmluZ1ZhbC5zdWJzdHJpbmcocG9zLmdldEluZGV4KCkpfSk7CisgICAgICAgICAgcmV0dXJuIFNLSVBfRklFTERfVkFMVUVfTElTVF9TSU5HTEVUT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bWJlci5kb3VibGVWYWx1ZSgpOworICAgICAgfQorICAgICAgaWYgKHNyY1ZhbCBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICByZXR1cm4gc3JjVmFsOworICAgICAgfQorICAgICAgcmV0dXJuIFNLSVBfRklFTERfVkFMVUVfTElTVF9TSU5HTEVUT047CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGlzU2NoZW1hRmllbGRUeXBlQ29tcGF0aWJsZShGaWVsZFR5cGUgdHlwZSkgeworICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgRG91YmxlVmFsdWVGaWVsZFR5cGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZUZsb2F0RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VGbG9hdEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODViODAKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VGbG9hdEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5yZXF1ZXN0LlNvbHJRdWVyeVJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlNvbHJRdWVyeVJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRmllbGRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuRmxvYXRWYWx1ZUZpZWxkVHlwZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogPHA+CisgKiBBdHRlbXB0cyB0byBtdXRhdGUgc2VsZWN0ZWQgZmllbGRzIHRoYXQgaGF2ZSBvbmx5IENoYXJTZXF1ZW5jZS10eXBlZCB2YWx1ZXMKKyAqIGludG8gRmxvYXQgdmFsdWVzLiAgSWYgcmVxdWlyZWQsIHJvdW5kaW5nIHVzZXMgY2VpbGluZyBtb2RlOgorICoge0BsaW5rIFJvdW5kaW5nTW9kZSNDRUlMSU5HfS4gIEdyb3VwaW5nIHNlcGFyYXRvcnMgKCcsJyBpbiB0aGUgUk9PVCBsb2NhbGUpCisgKiBhcmUgcGFyc2VkLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZGVmYXVsdCBzZWxlY3Rpb24gYmVoYXZpb3IgaXMgdG8gbXV0YXRlIGJvdGggdGhvc2UgZmllbGRzIHRoYXQgZG9uJ3QgbWF0Y2gKKyAqIGEgc2NoZW1hIGZpZWxkLCBhcyB3ZWxsIGFzIHRob3NlIGZpZWxkcyB0aGF0IG1hdGNoIGEgc2NoZW1hIGZpZWxkIHdpdGggYSBmaWVsZCAKKyAqIHR5cGUgdGhhdCB1c2VzIGNsYXNzIHNvbHIuRmxvYXRGaWVsZCwgc29sci5UcmllRmxvYXRGaWVsZCwgb3IgCisgKiBzb2xyLlNvcnRhYmxlRmxvYXRGaWVsZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYWxsIHZhbHVlcyBhcmUgcGFyc2VhYmxlIGFzIGZsb2F0IChvciBhcmUgYWxyZWFkeSBGbG9hdCksIHRoZW4gdGhlIGZpZWxkCisgKiB3aWxsIGJlIG11dGF0ZWQsIHJlcGxhY2luZyBlYWNoIHZhbHVlIHdpdGggaXRzIHBhcnNlZCBGbG9hdCBlcXVpdmFsZW50OyAKKyAqIG90aGVyd2lzZSwgbm8gbXV0YXRpb24gd2lsbCBvY2N1ci4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGxvY2FsZSB0byB1c2Ugd2hlbiBwYXJzaW5nIGZpZWxkIHZhbHVlcywgd2hpY2ggd2lsbCBhZmZlY3QgdGhlIHJlY29nbml6ZWQKKyAqIGdyb3VwaW5nIHNlcGFyYXRvciBhbmQgZGVjaW1hbCBjaGFyYWN0ZXJzLCBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuICBJZgorICogbm8gbG9jYWxlIGlzIGNvbmZpZ3VyZWQsIHRoZW4ge0BsaW5rIExvY2FsZSNST09UfSB3aWxsIGJlIHVzZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIHRoZSBSdXNzaWFuL1J1c3NpYSBsb2NhbGUsIHdoaWNoIHdpbGwgcGFyc2UgdGhlIHN0cmluZworICogIjEywqAzNDUsODk5IiBhcyAxMjM0NS44OTlmICh0aGUgZ3JvdXBpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBVKzAwQU8gTk8tQlJFQUsKKyAqIFNQQUNFKS4KKyAqIDwvcD4KKyAqCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRmxvYXRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiJmd0OworICogICAmbHQ7c3RyIG5hbWU9ImxvY2FsZSImZ3Q7cnVfUlUmbHQ7L3N0ciZndDsKKyAqICZsdDsvcHJvY2Vzc29yJmd0OzwvcHJlPgorICoKKyAqIDxwPgorICogU2VlIHtAbGluayBMb2NhbGV9IGZvciBhIGRlc2NyaXB0aW9uIG9mIGFjY2VwdGFibGUgbGFuZ3VhZ2UsIGNvdW50cnkgKG9wdGlvbmFsKQorICogYW5kIHZhcmlhbnQgKG9wdGlvbmFsKSB2YWx1ZXMsIGpvaW5lZCB3aXRoIHVuZGVyc2NvcmUocykuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUZsb2F0RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IGV4dGVuZHMgUGFyc2VOdW1lcmljRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGFyc2VGbG9hdEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5jbGFzcyk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBVcGRhdGVSZXF1ZXN0UHJvY2Vzc29yIGdldEluc3RhbmNlKFNvbHJRdWVyeVJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xyUXVlcnlSZXNwb25zZSByc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgbmV4dCkgeworICAgIHJldHVybiBuZXcgUGFyc2VGbG9hdEZpZWxkVXBkYXRlUHJvY2Vzc29yKGdldFNlbGVjdG9yKCksIGxvY2FsZSwgbmV4dCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJzZUZsb2F0RmllbGRVcGRhdGVQcm9jZXNzb3IgZXh0ZW5kcyBBbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yIHsKKyAgICBwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7CisKKyAgICAvLyBOdW1iZXJGb3JtYXQgaW5zdGFuY2VzIGFyZSBub3QgdGhyZWFkIHNhZmUKKyAgICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsPE51bWJlckZvcm1hdD4gbnVtYmVyRm9ybWF0ID0gbmV3IFRocmVhZExvY2FsPE51bWJlckZvcm1hdD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBOdW1iZXJGb3JtYXQgaW5pdGlhbFZhbHVlKCkgeworICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKGxvY2FsZSk7CisgICAgICAgIGZvcm1hdC5zZXRQYXJzZUludGVnZXJPbmx5KGZhbHNlKTsKKyAgICAgICAgZm9ybWF0LnNldFJvdW5kaW5nTW9kZShSb3VuZGluZ01vZGUuQ0VJTElORyk7CisgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgICB9CisgICAgfTsKKworICAgIFBhcnNlRmxvYXRGaWVsZFVwZGF0ZVByb2Nlc3NvcihGaWVsZE5hbWVTZWxlY3RvciBzZWxlY3RvciwgTG9jYWxlIGxvY2FsZSwgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgICBzdXBlcihzZWxlY3RvciwgbmV4dCk7CisgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG11dGF0ZVZhbHVlKE9iamVjdCBzcmNWYWwpIHsKKyAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbCA9IHNyY1ZhbC50b1N0cmluZygpOworICAgICAgICBQYXJzZVBvc2l0aW9uIHBvcyA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOworICAgICAgICBOdW1iZXIgbnVtYmVyID0gbnVtYmVyRm9ybWF0LmdldCgpLnBhcnNlKHN0cmluZ1ZhbCwgcG9zKTsKKyAgICAgICAgaWYgKHBvcy5nZXRJbmRleCgpICE9IHN0cmluZ1ZhbC5sZW5ndGgoKSkgeworICAgICAgICAgIGxvZy5kZWJ1ZygidmFsdWUgJ3t9JyBpcyBub3QgcGFyc2VhYmxlLCB0aHVzIG5vdCBtdXRhdGVkOyB1bnBhcnNlZCBjaGFyczogJ3t9JyIsCisgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHNyY1ZhbCwgc3RyaW5nVmFsLnN1YnN0cmluZyhwb3MuZ2V0SW5kZXgoKSl9KTsKKyAgICAgICAgICByZXR1cm4gU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVtYmVyLmZsb2F0VmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICByZXR1cm4gc3JjVmFsOworICAgICAgfQorICAgICAgcmV0dXJuIFNLSVBfRklFTERfVkFMVUVfTElTVF9TSU5HTEVUT047CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGlzU2NoZW1hRmllbGRUeXBlQ29tcGF0aWJsZShGaWVsZFR5cGUgdHlwZSkgeworICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgRmxvYXRWYWx1ZUZpZWxkVHlwZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlSW50RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VJbnRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZhYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlSW50RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuU29sclF1ZXJ5UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbnRWYWx1ZUZpZWxkVHlwZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIDxwPgorICogQXR0ZW1wdHMgdG8gbXV0YXRlIHNlbGVjdGVkIGZpZWxkcyB0aGF0IGhhdmUgb25seSBDaGFyU2VxdWVuY2UtdHlwZWQgdmFsdWVzCisgKiBpbnRvIEludGVnZXIgdmFsdWVzLiAgR3JvdXBpbmcgc2VwYXJhdG9ycyAoJywnIGluIHRoZSBST09UIGxvY2FsZSkgYXJlIHBhcnNlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGRlZmF1bHQgc2VsZWN0aW9uIGJlaGF2aW9yIGlzIHRvIG11dGF0ZSBib3RoIHRob3NlIGZpZWxkcyB0aGF0IGRvbid0IG1hdGNoCisgKiBhIHNjaGVtYSBmaWVsZCwgYXMgd2VsbCBhcyB0aG9zZSBmaWVsZHMgdGhhdCBtYXRjaCBhIHNjaGVtYSBmaWVsZCB3aXRoIGEgZmllbGQgCisgKiB0eXBlIHRoYXQgdXNlcyBjbGFzcyBzb2xyLkludEZpZWxkLCBzb2xyLlRyaWVJbnRGaWVsZCwgb3IKKyAqIHNvbHIuU29ydGFibGVJbnRGaWVsZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYWxsIHZhbHVlcyBhcmUgcGFyc2VhYmxlIGFzIGludCAob3IgYXJlIGFscmVhZHkgSW50ZWdlciksIHRoZW4gdGhlIGZpZWxkCisgKiB3aWxsIGJlIG11dGF0ZWQsIHJlcGxhY2luZyBlYWNoIHZhbHVlIHdpdGggaXRzIHBhcnNlZCBJbnRlZ2VyIGVxdWl2YWxlbnQ7CisgKiBvdGhlcndpc2UsIG5vIG11dGF0aW9uIHdpbGwgb2NjdXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBsb2NhbGUgdG8gdXNlIHdoZW4gcGFyc2luZyBmaWVsZCB2YWx1ZXMsIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSByZWNvZ25pemVkCisgKiBncm91cGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuICBJZiBubyBsb2NhbGUgaXMKKyAqIGNvbmZpZ3VyZWQsIHRoZW4ge0BsaW5rIExvY2FsZSNST09UfSB3aWxsIGJlIHVzZWQuIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbgorICogc3BlY2lmaWVzIHRoZSBSdXNzaWFuL1J1c3NpYSBsb2NhbGUsIHdoaWNoIHdpbGwgcGFyc2UgdGhlIHN0cmluZyAiMTLCoDM0NcKgODk5IgorICogYXMgMTIzNDU4OTlMICh0aGUgZ3JvdXBpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBVKzAwQU8gTk8tQlJFQUsgU1BBQ0UpLgorICogPC9wPgorICoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VJbnRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiJmd0OworICogICAmbHQ7c3RyIG5hbWU9ImxvY2FsZSImZ3Q7cnVfUlUmbHQ7L3N0ciZndDsKKyAqICZsdDsvcHJvY2Vzc29yJmd0OzwvcHJlPgorICoKKyAqIDxwPgorICogU2VlIHtAbGluayBMb2NhbGV9IGZvciBhIGRlc2NyaXB0aW9uIG9mIGFjY2VwdGFibGUgbGFuZ3VhZ2UsIGNvdW50cnkgKG9wdGlvbmFsKQorICogYW5kIHZhcmlhbnQgKG9wdGlvbmFsKSB2YWx1ZXMsIGpvaW5lZCB3aXRoIHVuZGVyc2NvcmUocykuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUludEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSBleHRlbmRzIFBhcnNlTnVtZXJpY0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhcnNlSW50RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmNsYXNzKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgZ2V0SW5zdGFuY2UoU29sclF1ZXJ5UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgcmV0dXJuIG5ldyBQYXJzZUludEZpZWxkVXBkYXRlUHJvY2Vzc29yKGdldFNlbGVjdG9yKCksIGxvY2FsZSwgbmV4dCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJzZUludEZpZWxkVXBkYXRlUHJvY2Vzc29yIGV4dGVuZHMgQWxsVmFsdWVzT3JOb25lRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2NhbGUgbG9jYWxlOworICAgIAorICAgIC8vIE51bWJlckZvcm1hdCBpbnN0YW5jZXMgYXJlIG5vdCB0aHJlYWQgc2FmZQorICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8TnVtYmVyRm9ybWF0PiBudW1iZXJGb3JtYXQgPSBuZXcgVGhyZWFkTG9jYWw8TnVtYmVyRm9ybWF0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIE51bWJlckZvcm1hdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgIE51bWJlckZvcm1hdCBmb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UobG9jYWxlKTsKKyAgICAgICAgZm9ybWF0LnNldFBhcnNlSW50ZWdlck9ubHkodHJ1ZSk7CisgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgICB9CisgICAgfTsKKworICAgIFBhcnNlSW50RmllbGRVcGRhdGVQcm9jZXNzb3IoRmllbGROYW1lU2VsZWN0b3Igc2VsZWN0b3IsIExvY2FsZSBsb2NhbGUsIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgbmV4dCkgeworICAgICAgc3VwZXIoc2VsZWN0b3IsIG5leHQpOworICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBtdXRhdGVWYWx1ZShPYmplY3Qgc3JjVmFsKSB7CisgICAgICBpZiAoc3JjVmFsIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWwgPSBzcmNWYWwudG9TdHJpbmcoKTsKKyAgICAgICAgUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKKyAgICAgICAgTnVtYmVyIG51bWJlciA9IG51bWJlckZvcm1hdC5nZXQoKS5wYXJzZShzdHJpbmdWYWwsIHBvcyk7CisgICAgICAgIGlmIChwb3MuZ2V0SW5kZXgoKSAhPSBzdHJpbmdWYWwubGVuZ3RoKCkpIHsKKyAgICAgICAgICBsb2cuZGVidWcoInZhbHVlICd7fScgaXMgbm90IHBhcnNlYWJsZSwgdGh1cyBub3QgbXV0YXRlZDsgdW5wYXJzZWQgY2hhcnM6ICd7fSciLAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzcmNWYWwsIHN0cmluZ1ZhbC5zdWJzdHJpbmcocG9zLmdldEluZGV4KCkpfSk7CisgICAgICAgICAgcmV0dXJuIFNLSVBfRklFTERfVkFMVUVfTElTVF9TSU5HTEVUT047CisgICAgICAgIH0KKyAgICAgICAgaW50IGludFZhbHVlID0gbnVtYmVyLmludFZhbHVlKCk7CisgICAgICAgIGlmIChudW1iZXIubG9uZ1ZhbHVlKCkgPT0gKGxvbmcpaW50VmFsdWUpIHsKKyAgICAgICAgICAvLyBJZiB0aGUgaGlnaCBiaXRzIGRvbid0IGdldCB0cnVuY2F0ZWQgYnkgbnVtYmVyLmludFZhbHVlKCkKKyAgICAgICAgICByZXR1cm4gaW50VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgbG9nLmRlYnVnKCJ2YWx1ZSAne30nIGRvZXNuJ3QgZml0IGludG8gYW4gSW50ZWdlciwgdGh1cyB3YXMgbm90IG11dGF0ZWQiLCBzcmNWYWwpOworICAgICAgICByZXR1cm4gU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNWYWwgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgIHJldHVybiBzcmNWYWw7CisgICAgICB9CisgICAgICByZXR1cm4gU0tJUF9GSUVMRF9WQUxVRV9MSVNUX1NJTkdMRVRPTjsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTY2hlbWFGaWVsZFR5cGVDb21wYXRpYmxlKEZpZWxkVHlwZSB0eXBlKSB7CisgICAgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBJbnRWYWx1ZUZpZWxkVHlwZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlTG9uZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNlTG9uZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMGNlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UuU29sclF1ZXJ5UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5Mb25nVmFsdWVGaWVsZFR5cGU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiA8cD4KKyAqIEF0dGVtcHRzIHRvIG11dGF0ZSBzZWxlY3RlZCBmaWVsZHMgdGhhdCBoYXZlIG9ubHkgQ2hhclNlcXVlbmNlLXR5cGVkIHZhbHVlcworICogaW50byBMb25nIHZhbHVlcy4gIEdyb3VwaW5nIHNlcGFyYXRvcnMgKCcsJyBpbiB0aGUgUk9PVCBsb2NhbGUpIGFyZSBwYXJzZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBiZWhhdmlvciBpcyB0byBtdXRhdGUgYm90aCB0aG9zZSBmaWVsZHMgdGhhdCBkb24ndCBtYXRjaAorICogYSBzY2hlbWEgZmllbGQsIGFzIHdlbGwgYXMgdGhvc2UgZmllbGRzIHRoYXQgbWF0Y2ggYSBzY2hlbWEgZmllbGQgd2l0aCBhIGZpZWxkIAorICogdHlwZSB0aGF0IHVzZXMgY2xhc3Mgc29sci5Mb25nRmllbGQsIHNvbHIuVHJpZUxvbmdGaWVsZCwgb3IgCisgKiBzb2xyLlNvcnRhYmxlTG9uZ0ZpZWxkLgorICogPC9wPgorICogPHA+CisgKiBJZiBhbGwgdmFsdWVzIGFyZSBwYXJzZWFibGUgYXMgbG9uZyAob3IgYXJlIGFscmVhZHkgTG9uZyksIHRoZW4gdGhlIGZpZWxkCisgKiB3aWxsIGJlIG11dGF0ZWQsIHJlcGxhY2luZyBlYWNoIHZhbHVlIHdpdGggaXRzIHBhcnNlZCBMb25nIGVxdWl2YWxlbnQ7CisgKiBvdGhlcndpc2UsIG5vIG11dGF0aW9uIHdpbGwgb2NjdXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBsb2NhbGUgdG8gdXNlIHdoZW4gcGFyc2luZyBmaWVsZCB2YWx1ZXMsIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSByZWNvZ25pemVkCisgKiBncm91cGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuICBJZiBubyBsb2NhbGUgaXMKKyAqIGNvbmZpZ3VyZWQsIHRoZW4ge0BsaW5rIExvY2FsZSNST09UfSB3aWxsIGJlIHVzZWQuIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbgorICogc3BlY2lmaWVzIHRoZSBSdXNzaWFuL1J1c3NpYSBsb2NhbGUsIHdoaWNoIHdpbGwgcGFyc2UgdGhlIHN0cmluZyAiMTLCoDM0NcKgODk5IiAKKyAqIGFzIDEyMzQ1ODk5TCAodGhlIGdyb3VwaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgVSswMEFPIE5PLUJSRUFLIFNQQUNFKS4KKyAqIDwvcD4KKyAqCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlTG9uZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSImZ3Q7CisgKiAgICZsdDtzdHIgbmFtZT0ibG9jYWxlIiZndDtydV9SVSZsdDsvc3RyJmd0OworICogJmx0Oy9wcm9jZXNzb3ImZ3Q7PC9wcmU+CisgKgorICogPHA+CisgKiBTZWUge0BsaW5rIExvY2FsZX0gZm9yIGEgZGVzY3JpcHRpb24gb2YgYWNjZXB0YWJsZSBsYW5ndWFnZSwgY291bnRyeSAob3B0aW9uYWwpCisgKiBhbmQgdmFyaWFudCAob3B0aW9uYWwpIHZhbHVlcywgam9pbmVkIHdpdGggdW5kZXJzY29yZShzKS4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlTG9uZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSBleHRlbmRzIFBhcnNlTnVtZXJpY0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmNsYXNzKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgZ2V0SW5zdGFuY2UoU29sclF1ZXJ5UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUmVxdWVzdFByb2Nlc3NvciBuZXh0KSB7CisgICAgcmV0dXJuIG5ldyBQYXJzZUxvbmdGaWVsZFVwZGF0ZVByb2Nlc3NvcihnZXRTZWxlY3RvcigpLCBsb2NhbGUsIG5leHQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3IgZXh0ZW5kcyBBbGxWYWx1ZXNPck5vbmVGaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yIHsKKyAgICBwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7CisgICAgCisgICAgLy8gTnVtYmVyRm9ybWF0IGluc3RhbmNlcyBhcmUgbm90IHRocmVhZCBzYWZlCisgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxOdW1iZXJGb3JtYXQ+IG51bWJlckZvcm1hdCA9IG5ldyBUaHJlYWRMb2NhbDxOdW1iZXJGb3JtYXQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgTnVtYmVyRm9ybWF0IGluaXRpYWxWYWx1ZSgpIHsKKyAgICAgICAgTnVtYmVyRm9ybWF0IGZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZShsb2NhbGUpOworICAgICAgICBmb3JtYXQuc2V0UGFyc2VJbnRlZ2VyT25seSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgIH0KKyAgICB9OworCisgICAgUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3IoRmllbGROYW1lU2VsZWN0b3Igc2VsZWN0b3IsIExvY2FsZSBsb2NhbGUsIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3IgbmV4dCkgeworICAgICAgc3VwZXIoc2VsZWN0b3IsIG5leHQpOworICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3QgbXV0YXRlVmFsdWUoT2JqZWN0IHNyY1ZhbCkgeworICAgICAgaWYgKHNyY1ZhbCBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgeworICAgICAgICBTdHJpbmcgc3RyaW5nVmFsID0gc3JjVmFsLnRvU3RyaW5nKCk7CisgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7CisgICAgICAgIE51bWJlciBudW1iZXIgPSBudW1iZXJGb3JtYXQuZ2V0KCkucGFyc2Uoc3RyaW5nVmFsLCBwb3MpOworICAgICAgICBpZiAocG9zLmdldEluZGV4KCkgIT0gc3RyaW5nVmFsLmxlbmd0aCgpKSB7CisgICAgICAgICAgbG9nLmRlYnVnKCJ2YWx1ZSAne30nIGlzIG5vdCBwYXJzZWFibGUsIHRodXMgbm90IG11dGF0ZWQ7IHVucGFyc2VkIGNoYXJzOiAne30nIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc3JjVmFsLCBzdHJpbmdWYWwuc3Vic3RyaW5nKHBvcy5nZXRJbmRleCgpKX0pOworICAgICAgICAgIHJldHVybiBTS0lQX0ZJRUxEX1ZBTFVFX0xJU1RfU0lOR0xFVE9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudW1iZXIubG9uZ1ZhbHVlKCk7CisgICAgICB9CisgICAgICBpZiAoc3JjVmFsIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICByZXR1cm4gc3JjVmFsOworICAgICAgfQorICAgICAgcmV0dXJuIFNLSVBfRklFTERfVkFMVUVfTElTVF9TSU5HTEVUT047CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGlzU2NoZW1hRmllbGRUeXBlQ29tcGF0aWJsZShGaWVsZFR5cGUgdHlwZSkgeworICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgTG9uZ1ZhbHVlRmllbGRUeXBlOworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VOdW1lcmljRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvUGFyc2VOdW1lcmljRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiYzY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzZU51bWVyaWNGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkxvY2FsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5GaWVsZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbnVtZXJpYyBwYXJzaW5nIHVwZGF0ZSBwcm9jZXNzb3IgZmFjdG9yaWVzLgorICogU3ViY2xhc3NlcyBjYW4gb3B0aW9uYWxseSBjb25maWd1cmUgYSBsb2NhbGUuICBJZiBubyBsb2NhbGUgaXMgY29uZmlndXJlZCwKKyAqIHRoZW4ge0BsaW5rIExvY2FsZSNST09UfSB3aWxsIGJlIHVzZWQuICBFLmcuIHRvIGNvbmZpZ3VyZSB0aGUgRnJlbmNoL0ZyYW5jZQorICogbG9jYWxlOgorICogCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlW1R5cGVdRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiZndDsKKyAqICAgJmx0O3N0ciBuYW1lPSJsb2NhbGUiJmd0O2ZyX0ZSJmx0Oy9zdHImZ3Q7CisgKiAgIFsuLi5dCisgKiAmbHQ7L3Byb2Nlc3NvciZndDs8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFNlZSB7QGxpbmsgTG9jYWxlfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBhY2NlcHRhYmxlIGxhbmd1YWdlLCBjb3VudHJ5IChvcHRpb25hbCkKKyAqIGFuZCB2YXJpYW50IChvcHRpb25hbCkgdmFsdWVzLCBqb2luZWQgd2l0aCB1bmRlcnNjb3JlKHMpLgorICogPC9wPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFyc2VOdW1lcmljRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IGV4dGVuZHMgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfUEFSQU0gPSAibG9jYWxlIjsKKworICBwcm90ZWN0ZWQgTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5ST09UOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0KE5hbWVkTGlzdCBhcmdzKSB7CisgICAgU3RyaW5nIGxvY2FsZVBhcmFtID0gKFN0cmluZylhcmdzLnJlbW92ZShMT0NBTEVfUEFSQU0pOworICAgIGlmIChudWxsICE9IGxvY2FsZVBhcmFtKSB7CisgICAgICBsb2NhbGUgPSBMb2NhbGVVdGlscy50b0xvY2FsZShsb2NhbGVQYXJhbSk7CisgICAgfQorICAgIHN1cGVyLmluaXQoYXJncyk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBGaWVsZFR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgcGFyc2luZyBmYWN0b3J5LgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNTY2hlbWFGaWVsZFR5cGVDb21wYXRpYmxlKEZpZWxkVHlwZSB0eXBlKTsgIAorCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgbWF0Y2ggYW55IHNjaGVtYSBmaWVsZCBvciBkeW5hbWljIGZpZWxkLAorICAgKiAgICAgICAgICAgb3IgaWYgdGhlIG1hdGNoZWQgZmllbGQncyB0eXBlIGlzIGNvbXBhdGlibGUKKyAgICogQHBhcmFtIGNvcmUgV2hlcmUgdG8gZ2V0IHRoZSBjdXJyZW50IHNjaGVtYSBmcm9tCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpZWxkTXV0YXRpbmdVcGRhdGVQcm9jZXNzb3IuRmllbGROYW1lU2VsZWN0b3IKKyAgZ2V0RGVmYXVsdFNlbGVjdG9yKGZpbmFsIFNvbHJDb3JlIGNvcmUpIHsKKworICAgIHJldHVybiBuZXcgRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3Nvci5GaWVsZE5hbWVTZWxlY3RvcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkTXV0YXRlKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgZmluYWwgSW5kZXhTY2hlbWEgc2NoZW1hID0gY29yZS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICAgICAgRmllbGRUeXBlIHR5cGUgPSBzY2hlbWEuZ2V0RmllbGRUeXBlTm9FeChmaWVsZE5hbWUpOworICAgICAgICByZXR1cm4gKG51bGwgPT0gdHlwZSkgfHwgaXNTY2hlbWFGaWVsZFR5cGVDb21wYXRpYmxlKHR5cGUpOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9VcGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4uamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9VcGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4uamF2YQppbmRleCAyODI1NDliLi44YmQ3NWU2IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvVXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbi5qYXZhCkBAIC0zNCwyMyArMzQsNDggQEAKIC8qKgogICogTWFuYWdlcyBhIGNoYWluIG9mIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JGYWN0b3JpZXMuCiAgKiA8cD4KLSAqIENoYWluIGNhbiBiZSBjb25maWd1cmVkIHZpYSBzb2xyY29uZmlnLnhtbDoKKyAqIENoYWlucyBjYW4gYmUgY29uZmlndXJlZCB2aWEgc29scmNvbmZpZy54bWwgdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXguLi4KICAqIDwvcD4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KLSAqICZsdDt1cGRhdGVSZXF1ZXN0UHJvY2Vzc29ycyBuYW1lPSJrZXkiIGRlZmF1bHQ9InRydWUiJmd0OwotICogICAmbHQ7cHJvY2Vzc29yIGNsYXNzPSJQYXRoVG9DbGFzczEiIC8mZ3Q7Ci0gKiAgICZsdDtwcm9jZXNzb3IgY2xhc3M9IlBhdGhUb0NsYXNzMiIgLyZndDsKKyAqICZsdDt1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0ia2V5IiBkZWZhdWx0PSJ0cnVlIiZndDsKKyAqICAgJmx0O3Byb2Nlc3NvciBjbGFzcz0icGFja2FnZS5DbGFzczEiIC8mZ3Q7CisgKiAgICZsdDtwcm9jZXNzb3IgY2xhc3M9InBhY2thZ2UuQ2xhc3MyIiAmZ3Q7CisgKiAgICAgJmx0O3N0ciBuYW1lPSJzb21lSW5pdFBhcmFtMSImZ3Q7dmFsdWUmbHQ7L3N0ciZndDsKKyAqICAgICAmbHQ7aW50IG5hbWU9InNvbWVJbml0UGFyYW0yIiZndDs0MiZsdDsvaW50Jmd0OworICogICAmbHQ7L3Byb2Nlc3NvciZndDsKICAqICAgJmx0O3Byb2Nlc3NvciBjbGFzcz0ic29sci5Mb2dVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAmZ3Q7CiAgKiAgICAgJmx0O2ludCBuYW1lPSJtYXhOdW1Ub0xvZyImZ3Q7MTAwJmx0Oy9pbnQmZ3Q7CiAgKiAgICZsdDsvcHJvY2Vzc29yJmd0OwogICogICAmbHQ7cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8mZ3Q7Ci0gKiAmbHQ7L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JzJmd0OworICogJmx0Oy91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4mZ3Q7CiAgKiA8L3ByZT4KICAqIDxwPgorICogTXVsdGlwbGUgQ2hhaW5zIGNhbiBiZSBkZWZpbmVkLCBlYWNoIHdpdGggYSBkaXN0aW5jdCBuYW1lLiAgVGhlIG5hbWUgb2YgCisgKiBhIGNoYWluIHVzZWQgdG8gaGFuZGxlIGFuIHVwZGF0ZSByZXF1ZXN0IG1heSBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHJlcXVlc3QgCisgKiBwYXJhbSA8Y29kZT51cGRhdGUuY2hhaW48L2NvZGU+LiAgSWYgbm8gY2hhaW4gaXMgZXhwbGljaXRseSBzZWxlY3RlZCAKKyAqIGJ5IG5hbWUsIHRoZW4gU29sciB3aWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGEgZGVmYXVsdCBjaGFpbjoKKyAqIDwvcD4KKyAqIDx1bD4KKyAqICA8bGk+QSBzaW5nbGUgY29uZmlndXJlZCBjaGFpbiBtYXkgZXhwbGljaXRseSBiZSBkZWNsYXJlZCB3aXRoIAorICogICAgICA8Y29kZT5kZWZhdWx0PSJ0cnVlIjwvY29kZT4gKHNlZSBleGFtcGxlIGFib3ZlKTwvbGk+CisgKiAgPGxpPklmIG5vIGNoYWluIGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgdGhlIGRlZmF1bHQsIFNvbHIgd2lsbCBsb29rIGZvcgorICogICAgICBhbnkgY2hhaW4gdGhhdCBkb2VzIG5vdCBoYXZlIGEgbmFtZSwgYW5kIHRyZWF0IGl0IGFzIHRoZSBkZWZhdWx0PC9saT4KKyAqICA8bGk+QXMgYSBsYXN0IHJlc29ydCwgU29sciB3aWxsIGNyZWF0ZSBhbiBpbXBsaWNpdCBkZWZhdWx0IGNoYWluIAorICogICAgICBjb25zaXN0aW5nIG9mOjx1bD4KKyAqICAgICAgICA8bGk+e0BsaW5rIExvZ1VwZGF0ZVByb2Nlc3NvckZhY3Rvcnl9PC9saT4KKyAqICAgICAgICA8bGk+e0BsaW5rIERpc3RyaWJ1dGVkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeX08L2xpPgorICogICAgICAgIDxsaT57QGxpbmsgUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeX08L2xpPgorICogICAgICA8L3VsPjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPgogICogQWxsbW9zdCBhbGwgcHJvY2Vzc29yIGNoYWlucyBzaG91bGQgZW5kIHdpdGggYW4gaW5zdGFuY2Ugb2YgCi0gKiB7QGxpbmsgUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeX0gdW5sZXNzIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkgCisgKiA8Y29kZT5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5PC9jb2RlPiB1bmxlc3MgdGhlIHVzZXIgaXMgZXhwbGljaXRseSAKICAqIGV4ZWN1dGluZyB0aGUgdXBkYXRlIGNvbW1hbmRzIGluIGFuIGFsdGVybmF0aXZlIGN1c3RvbSAKLSAqIDxjb2RlPlVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JGYWN0b3J5PC9jb2RlPi4KKyAqIDxjb2RlPlVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JGYWN0b3J5PC9jb2RlPi4gIElmIGEgY2hhaW4gaW5jbHVkZXMgCisgKiA8Y29kZT5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5PC9jb2RlPiBidXQgZG9lcyBub3QgaW5jbHVkZSBhIAorICogPGNvZGU+RGlzdHJpYnV0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeTwvY29kZT4sIGl0IHdpbGwgYmUgYWRkZWQgCisgKiBhdXRvbWF0aWNseSBieSB7QGxpbmsgI2luaXQgaW5pdCgpfS4KICAqIDwvcD4KICAqCiAgKiBAc2VlIFVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JGYWN0b3J5CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvSGRmc1V0aWwuamF2YSBiL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9IZGZzVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmFmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvSGRmc1V0aWwuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgSGRmc1V0aWwgeworICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSEFET09QX0NPTkZfRklMRVMgPSB7ImNvcmUtc2l0ZS54bWwiLAorICAgICJoZGZzLXNpdGUueG1sIiwgIm1hcHJlZC1zaXRlLnhtbCIsICJ5YXJuLXNpdGUueG1sIiwgImhhZG9vcC1zaXRlLnhtbCJ9OworICAKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEhkZnNSZXNvdXJjZXMoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29uZkRpcikgeworICBpZiAoY29uZkRpciAhPSBudWxsICYmIGNvbmZEaXIubGVuZ3RoKCkgPiAwKSB7CisgICAgRmlsZSBjb25mRGlyRmlsZSA9IG5ldyBGaWxlKGNvbmZEaXIpOworICAgIGlmICghY29uZkRpckZpbGUuZXhpc3RzKCkpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsICJSZXNvdXJjZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICIgKyBjb25mRGlyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorICAgIGlmICghY29uZkRpckZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24oRXJyb3JDb2RlLlNFUlZFUl9FUlJPUiwgIlNwZWNpZmllZCByZXNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IGEgZGlyZWN0b3J5IiArIGNvbmZEaXJGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisgICAgaWYgKCFjb25mRGlyRmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgIHRocm93IG5ldyBTb2xyRXhjZXB0aW9uKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsICJSZXNvdXJjZSBkaXJlY3RvcnkgbXVzdCBiZSByZWFkYWJsZSBieSB0aGUgU29sciBwcm9jZXNzOiAiICsgY29uZkRpckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKyAgICBmb3IgKFN0cmluZyBmaWxlIDogSEFET09QX0NPTkZfRklMRVMpIHsKKyAgICAgIGlmIChuZXcgRmlsZShjb25mRGlyRmlsZSwgZmlsZSkuZXhpc3RzKCkpIHsKKyAgICAgICAgY29uZi5hZGRSZXNvdXJjZShuZXcgUGF0aChjb25mRGlyLCBmaWxlKSk7CisgICAgICB9CisgICAgfQorICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9JT1V0aWxzLmphdmEgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvSU9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjgyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvSU9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkhkZnNEaXJlY3RvcnlGYWN0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgSU9VdGlscyB7CisgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKElPVXRpbHMuY2xhc3MpOworICAKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShDbG9zZWFibGUgY2xvc2VhYmxlKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChjbG9zZWFibGUgIT0gbnVsbCkgeworICAgICAgICBjbG9zZWFibGUuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgTE9HLmVycm9yKCJFcnJvciB3aGlsZSBjbG9zaW5nIiwgZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvbG9nNGoucHJvcGVydGllcyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9sb2c0ai5wcm9wZXJ0aWVzCmluZGV4IGZiYzgxN2YuLjliNzRhNWYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC03LDMgKzcsNCBAQAogbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JS01cCAtICVke3l5eXktTU0tZGQgSEg6bW06c3MuU1NTfTsgJUM7ICVtXG4KIAogbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuem9va2VlcGVyPVdBUk4KK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmhhZG9vcD1XQVJOCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1hZGQtc2NoZW1hLWZpZWxkcy11cGRhdGUtcHJvY2Vzc29yLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLWFkZC1zY2hlbWEtZmllbGRzLXVwZGF0ZS1wcm9jZXNzb3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTk0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1hZGQtc2NoZW1hLWZpZWxkcy11cGRhdGUtcHJvY2Vzc29yLnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzY2hlbWEgbmFtZT0iYWRkLXNjaGVtYS1maWVsZHMtdXBkYXRlLXByb2Nlc3NvciIgdmVyc2lvbj0iMS41Ij4KKyAgPHR5cGVzPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGludCIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBtdWx0aVZhbHVlZD0idHJ1ZSIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRmbG9hdCIgY2xhc3M9InNvbHIuVHJpZUZsb2F0RmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIG11bHRpVmFsdWVkPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGxvbmciIGNsYXNzPSJzb2xyLlRyaWVMb25nRmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIG11bHRpVmFsdWVkPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGRvdWJsZSIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBtdWx0aVZhbHVlZD0idHJ1ZSIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRkYXRlIiBjbGFzcz0ic29sci5UcmllRGF0ZUZpZWxkIiBwcmVjaXNpb25TdGVwPSI2IiBtdWx0aVZhbHVlZD0idHJ1ZSIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKyAgICA8ZmllbGR0eXBlIG5hbWU9ImJvb2xlYW4iIGNsYXNzPSJzb2xyLkJvb2xGaWVsZCIgc29ydE1pc3NpbmdMYXN0PSJ0cnVlIiBtdWx0aVZhbHVlZD0idHJ1ZSIvPgorICAgIDxmaWVsZHR5cGUgbmFtZT0ic3RyaW5nIiBjbGFzcz0ic29sci5TdHJGaWVsZCIgc29ydE1pc3NpbmdMYXN0PSJ0cnVlIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBtdWx0aVZhbHVlZD0idHJ1ZSIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgPC90eXBlcz4KKyAgPGZpZWxkcz4KKyAgICA8ZmllbGQgbmFtZT0iaWQiICAgICAgICAgICB0eXBlPSJzdHJpbmciICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiLz4KKyAgICA8ZmllbGQgbmFtZT0iX3ZlcnNpb25fIiAgICB0eXBlPSJsb25nIiAgICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICAKKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdCIgICB0eXBlPSJ0ZXh0IiAgICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGkiICB0eXBlPSJ0aW50IiAgICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGwiICB0eXBlPSJ0bG9uZyIgICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGYiICB0eXBlPSJ0ZmxvYXQiICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGQiICB0eXBlPSJ0ZG91YmxlIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGR0IiB0eXBlPSJ0ZGF0ZSIgICBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgPC9maWVsZHM+CisKKyAgPHVuaXF1ZUtleT5pZDwvdW5pcXVlS2V5PgorPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1jb3B5ZmllbGQtdGVzdC54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1jb3B5ZmllbGQtdGVzdC54bWwKaW5kZXggZDNhMTg2Mi4uM2FiNzgzNyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtY29weWZpZWxkLXRlc3QueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLWNvcHlmaWVsZC10ZXN0LnhtbApAQCAtMzk0LDYgKzM5NCw3IEBACiAgICAgICB0ZXJtVmVjdG9ycz0idHJ1ZSIgdGVybVBvc2l0aW9ucz0idHJ1ZSIgdGVybU9mZnNldHM9InRydWUiLz4KICAgIDxmaWVsZCBuYW1lPSJzaWduYXR1cmVGaWVsZCIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIi8+CiAgICAKKyAgIDxmaWVsZCBuYW1lPSJfdmVyc2lvbl8iIHR5cGU9ImxvbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgogCiAgICAKICAgIDwhLS0gRHluYW1pYyBmaWVsZCBkZWZpbml0aW9ucy4gIElmIGEgZmllbGQgbmFtZSBpcyBub3QgZm91bmQsIGR5bmFtaWNGaWVsZHMKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLWZvbGRpbmcueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtZm9sZGluZy54bWwKaW5kZXggODhhNmQ2Ni4uYzJhMGU2MCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtZm9sZGluZy54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtZm9sZGluZy54bWwKQEAgLTIyMSw4ICsyMjEsNiBAQAogICAgIDxmaWVsZFR5cGUgbmFtZT0iZmxvYXQiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSI0IiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CiAgICAgPGZpZWxkVHlwZSBuYW1lPSJsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSI0IiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CiAgICAgPGZpZWxkVHlwZSBuYW1lPSJkb3VibGUiIGNsYXNzPSJzb2xyLlRyaWVEb3VibGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iNCIgb21pdE5vcm1zPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgotICAgIDxmaWVsZFR5cGUgbmFtZT0iYnl0ZSIgY2xhc3M9InNvbHIuQnl0ZUZpZWxkIiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+Ci0gICAgPGZpZWxkVHlwZSBuYW1lPSJzaG9ydCIgY2xhc3M9InNvbHIuU2hvcnRGaWVsZCIgb21pdE5vcm1zPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgogICAgIDxmaWVsZHR5cGUgbmFtZT0iYm9vbGVhbiIgY2xhc3M9InNvbHIuQm9vbEZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiLz4KICAgICA8ZmllbGR0eXBlIG5hbWU9ImRhdGUiIGNsYXNzPSJzb2xyLlRyaWVEYXRlRmllbGQiIHByZWNpc2lvblN0ZXA9IjAiLz4KICAgPC90eXBlcz4KQEAgLTIzMyw4ICsyMzEsNiBAQAogICAgIDxmaWVsZCBuYW1lPSJmbG9hdF9mIiB0eXBlPSJmbG9hdCIvPgogICAgIDxmaWVsZCBuYW1lPSJsb25nX2YiIHR5cGU9ImxvbmciLz4KICAgICA8ZmllbGQgbmFtZT0iZG91YmxlX2YiIHR5cGU9ImRvdWJsZSIvPgotICAgIDxmaWVsZCBuYW1lPSJieXRlX2YiIHR5cGU9ImJ5dGUiLz4KLSAgICA8ZmllbGQgbmFtZT0ic2hvcnRfZiIgdHlwZT0ic2hvcnQiLz4KICAgICA8ZmllbGQgbmFtZT0iYm9vbF9mIiB0eXBlPSJib29sZWFuIi8+CiAgICAgPGZpZWxkIG5hbWU9ImRhdGVfZiIgdHlwZT0iZGF0ZSIvPgogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1sdWNlbmVNYXRjaFZlcnNpb24ueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtbHVjZW5lTWF0Y2hWZXJzaW9uLnhtbAppbmRleCAxM2UxMmYzLi4zYmIyYjQ5IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1sdWNlbmVNYXRjaFZlcnNpb24ueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLWx1Y2VuZU1hdGNoVmVyc2lvbi54bWwKQEAgLTE3LDYgKzE3LDcgQEAKIC0tPgogPHNjaGVtYSBuYW1lPSJsdWNlbmVNYXRjaFZlcnNpb25UZXN0IiB2ZXJzaW9uPSIxLjEiPgogIDx0eXBlcz4KKyAgPGZpZWxkdHlwZSBuYW1lPSJsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIi8+CiAgIDxmaWVsZHR5cGUgbmFtZT0ic3RyaW5nIiBjbGFzcz0ic29sci5TdHJGaWVsZCIvPgogICA8ZmllbGR0eXBlIG5hbWU9InRleHQ0MCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIj4KICAgICA8YW5hbHl6ZXI+CkBAIC01MCw2ICs1MSw3IEBACiAgICA8ZmllbGQgbmFtZT0idGV4dERlZmF1bHQiIHR5cGU9InRleHREZWZhdWx0IiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIiAvPgogICAgPGZpZWxkIG5hbWU9InRleHRTdGFuZGFyZEFuYWx5emVyNDAiIHR5cGU9InRleHRTdGFuZGFyZEFuYWx5emVyNDAiIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0iZmFsc2UiIC8+CiAgICA8ZmllbGQgbmFtZT0idGV4dFN0YW5kYXJkQW5hbHl6ZXJEZWZhdWx0IiB0eXBlPSJ0ZXh0U3RhbmRhcmRBbmFseXplckRlZmF1bHQiIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0iZmFsc2UiIC8+CisgICA8ZmllbGQgbmFtZT0iX3ZlcnNpb25fIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9zUyIgdHlwZT0ic3RyaW5nIiAgaW5kZXhlZD0iZmFsc2UiIHN0b3JlZD0idHJ1ZSIvPgogIDwvZmllbGRzPgogIDx1bmlxdWVLZXk+aWQ8L3VuaXF1ZUtleT4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLW9uZS1maWVsZC1uby1keW5hbWljLWZpZWxkLXVuaXF1ZS1rZXkueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtb25lLWZpZWxkLW5vLWR5bmFtaWMtZmllbGQtdW5pcXVlLWtleS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzYWU3NwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLW9uZS1maWVsZC1uby1keW5hbWljLWZpZWxkLXVuaXF1ZS1rZXkueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjaGVtYSBuYW1lPSJvbmVfZmllbGRfbm9fZHluYW1pY19maWVsZF91bmlxdWVfa2V5IiB2ZXJzaW9uPSIxLjEiPgorICA8dHlwZXM+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJzdHJpbmciIGNsYXNzPSJzb2xyLlN0ckZpZWxkIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0IiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZEFuYWx5emVyIi8+CisgICAgPC9maWVsZFR5cGU+CisgIDwvdHlwZXM+CisgIDxmaWVsZHM+CisgICAgPGZpZWxkIG5hbWU9InN0ciIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgPC9maWVsZHM+CisgIDx1bmlxdWVLZXk+c3RyPC91bmlxdWVLZXk+Cis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLXJlcXVpcmVkLWZpZWxkcy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1yZXF1aXJlZC1maWVsZHMueG1sCmluZGV4IDkzNjMzOTguLjhkZWE3OTEgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLXJlcXVpcmVkLWZpZWxkcy54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtcmVxdWlyZWQtZmllbGRzLnhtbApAQCAtMzc2LDcgKzM3Niw3IEBACiAgICA8ZmllbGQgbmFtZT0iaW50RGVmYXVsdCIgdHlwZT0ic2ludCIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiBkZWZhdWx0PSI0MiIgbXVsdGlWYWx1ZWQ9ImZhbHNlIi8+CiAgICA8ZmllbGQgbmFtZT0ic2lnbmF0dXJlRmllbGQiIHR5cGU9InN0cmluZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJmYWxzZSIvPgogICAgCi0KKyAgIDxmaWVsZCBuYW1lPSJfdmVyc2lvbl8iIHR5cGU9ImxvbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgogICAgCiAgICA8IS0tIER5bmFtaWMgZmllbGQgZGVmaW5pdGlvbnMuICBJZiBhIGZpZWxkIG5hbWUgaXMgbm90IGZvdW5kLCBkeW5hbWljRmllbGRzCiAgICAgICAgIHdpbGwgYmUgdXNlZCBpZiB0aGUgbmFtZSBtYXRjaGVzIGFueSBvZiB0aGUgcGF0dGVybnMuCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1yZXZlcnNlZC54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1yZXZlcnNlZC54bWwKaW5kZXggMjI4NDRhZi4uNDBmYzBlOCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtcmV2ZXJzZWQueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLXJldmVyc2VkLnhtbApAQCAtMjUsNiArMjUsNyBAQAogICA8dHlwZXM+CiAKIAorICAgIDxmaWVsZHR5cGUgbmFtZT0ibG9uZyIgY2xhc3M9InNvbHIuVHJpZUxvbmdGaWVsZCIgLz4KICAgICA8ZmllbGR0eXBlIG5hbWU9ImludGVnZXIiIGNsYXNzPSJzb2xyLkludEZpZWxkIiAvPgogICAgIDxmaWVsZHR5cGUgbmFtZT0ic3RyaW5nIiBjbGFzcz0ic29sci5TdHJGaWVsZCIgLz4KIApAQCAtNzMsNiArNzQsOCBAQAogICAgPGZpZWxkIG5hbWU9InR3byIgdHlwZT0icmV2IiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIi8+CiAgICA8ZmllbGQgbmFtZT0idGhyZWUiIHR5cGU9InRleHQiIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0iZmFsc2UiLz4KIAorICAgPGZpZWxkIG5hbWU9Il92ZXJzaW9uXyIgdHlwZT0ibG9uZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiIC8+CisKICAgIDxmaWVsZCBuYW1lPSJzaWduYXR1cmVGaWVsZCIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9ImZhbHNlIi8+CiAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9Iipfc1MiIHR5cGU9InN0cmluZyIgIGluZGV4ZWQ9ImZhbHNlIiBzdG9yZWQ9InRydWUiLz4KIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtdHJpZS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS10cmllLnhtbAppbmRleCA4NWFkN2I3Li4xODE5YmZhIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS10cmllLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS10cmllLnhtbApAQCAtMjgyLDYgKzI4Miw4IEBACiAKICAgIDxmaWVsZCBuYW1lPSJ0ZGF0ZSIgdHlwZT0idGRhdGUiIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgLz4KIAorICAgPGZpZWxkIG5hbWU9Il92ZXJzaW9uXyIgdHlwZT0ibG9uZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiIC8+CisKICAgIDwhLS0gRHluYW1pYyBmaWVsZCBkZWZpbml0aW9ucy4gIElmIGEgZmllbGQgbmFtZSBpcyBub3QgZm91bmQsIGR5bmFtaWNGaWVsZHMKICAgICAgICAgd2lsbCBiZSB1c2VkIGlmIHRoZSBuYW1lIG1hdGNoZXMgYW55IG9mIHRoZSBwYXR0ZXJucy4KICAgICAgICAgUkVTVFJJQ1RJT046IHRoZSBnbG9iLWxpa2UgcGF0dGVybiBpbiB0aGUgbmFtZSBhdHRyaWJ1dGUgbXVzdCBoYXZlCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS54bWwKaW5kZXggNzQ1MjVjYS4uNmFiNzc0MyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLnhtbApAQCAtNDgsOCArNDgsNiBAQAogICAgIDxmaWVsZFR5cGUgbmFtZT0iZmxvYXQiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CiAgICAgPGZpZWxkVHlwZSBuYW1lPSJsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CiAgICAgPGZpZWxkVHlwZSBuYW1lPSJkb3VibGUiIGNsYXNzPSJzb2xyLlRyaWVEb3VibGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iMCIgb21pdE5vcm1zPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgotICAgIDxmaWVsZFR5cGUgbmFtZT0iYnl0ZSIgY2xhc3M9InNvbHIuQnl0ZUZpZWxkIiBvbWl0Tm9ybXM9InRydWUiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+Ci0gICAgPGZpZWxkVHlwZSBuYW1lPSJzaG9ydCIgY2xhc3M9InNvbHIuU2hvcnRGaWVsZCIgb21pdE5vcm1zPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgogCiAKICAgICA8ZmllbGRUeXBlIG5hbWU9InRpbnQiIGNsYXNzPSJzb2xyLlRyaWVJbnRGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgb21pdE5vcm1zPSJ0cnVlIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgpAQCAtNjA5LDEwICs2MDcsNiBAQAogICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2R0IiB0eXBlPSJkYXRlIiAgICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIi8+CiAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfZHQxIiB0eXBlPSJkYXRlIiAgICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiLz4KICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9iY2QiIHR5cGU9ImJjZHN0ciIgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIvPgotICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2J5IiAgdHlwZT0iYnl0ZSIgIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIvPgotICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2J5MSIgdHlwZT0iYnl0ZSIgIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIi8+Ci0gICA8ZHluYW1pY0ZpZWxkIG5hbWU9Iipfc2giIHR5cGU9InNob3J0IiAgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIi8+Ci0gICA8ZHluYW1pY0ZpZWxkIG5hbWU9Iipfc2gxIiB0eXBlPSJzaG9ydCIgIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIi8+CiAKIAogICAgICAgPCEtLSBzb21lIHRyaWUtY29kZWQgZHluYW1pYyBmaWVsZHMgZm9yIGZhc3RlciByYW5nZSBxdWVyaWVzIC0tPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWExMS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYTExLnhtbAppbmRleCA1YzJlMjgxLi5hOTkzY2JkIDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYTExLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYTExLnhtbApAQCAtMzIyLDYgKzMyMiw4IEBACiAKICAgIDxmaWVsZCBuYW1lPSJ0ZXh0X25vX2FuYWx5emVyIiB0eXBlPSJ0ZXh0X25vX2FuYWx5emVyIiBpbmRleGVkPSJ0cnVlIiAvPgogCisgICA8ZmllbGQgbmFtZT0iX3ZlcnNpb25fIiB0eXBlPSJsb25nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJmYWxzZSIgLz4KKwogICAgPCEtLSBEeW5hbWljIGZpZWxkIGRlZmluaXRpb25zLiAgSWYgYSBmaWVsZCBuYW1lIGlzIG5vdCBmb3VuZCwgZHluYW1pY0ZpZWxkcwogICAgICAgICB3aWxsIGJlIHVzZWQgaWYgdGhlIG5hbWUgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zLgogICAgICAgICBSRVNUUklDVElPTjogdGhlIGdsb2ItbGlrZSBwYXR0ZXJuIGluIHRoZSBuYW1lIGF0dHJpYnV0ZSBtdXN0IGhhdmUKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hc3Vycm91bmQueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWFzdXJyb3VuZC54bWwKaW5kZXggOTIzYmIwZi4uMDRlOTBlMyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWFzdXJyb3VuZC54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWFzdXJyb3VuZC54bWwKQEAgLTUzOSw2ICs1MzksOCBAQAogICAgPGZpZWxkIG5hbWU9InVuaXEzIiB0eXBlPSJzdHJpbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIvPgogICAgPGZpZWxkIG5hbWU9Im5vdW5pcSIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CiAKKyAgIDxmaWVsZCBuYW1lPSJfdmVyc2lvbl8iIHR5cGU9ImxvbmciIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9ImZhbHNlIiAvPgorCiAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfY29vcmRpbmF0ZSIgIHR5cGU9InRkb3VibGUiIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9ImZhbHNlIi8+CiAKIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLVNPTFItNzQ5LnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1TT0xSLTc0OS54bWwKaW5kZXggNzc4NWI1MC4uMWZhYmQ1YyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLVNPTFItNzQ5LnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctU09MUi03NDkueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDxxdWVyeVBhcnNlciBuYW1lPSJmb28iIGNsYXNzPSJGb29RUGFyc2VyUGx1Z2luIi8+CiAgIDwhLS0gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgImx1Y2VuZSIgcXBhcnNlciAtLT4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1hZGQtc2NoZW1hLWZpZWxkcy11cGRhdGUtcHJvY2Vzc29yLWNoYWlucy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYWRkLXNjaGVtYS1maWVsZHMtdXBkYXRlLXByb2Nlc3Nvci1jaGFpbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTlkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYWRkLXNjaGVtYS1maWVsZHMtdXBkYXRlLXByb2Nlc3Nvci1jaGFpbnMueG1sCkBAIC0wLDAgKzEsMTU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+CisKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorICAgVGVzdCBDb25maWcgdGhhdCBlbnVtZXJhdGVzIG1hbnkgZGlmZmVyZW50IHBhcnNpbmcgdXBkYXRlIHByb2Nlc3NvciBjaGFpbiAKKyAgIGNvbmZpZ3VyYXRpb25zLgorICAtLT4KKzxjb25maWc+CisgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KKyAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KKworICA8c2NoZW1hRmFjdG9yeSBjbGFzcz0iTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSI+CisgICAgPGJvb2wgbmFtZT0ibXV0YWJsZSI+dHJ1ZTwvYm9vbD4KKyAgICA8c3RyIG5hbWU9Im1hbmFnZWRTY2hlbWFSZXNvdXJjZU5hbWUiPm1hbmFnZWQtc2NoZW1hPC9zdHI+CisgIDwvc2NoZW1hRmFjdG9yeT4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9ImFkZC1maWVsZHMtbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5BZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZGVmYXVsdEZpZWxkVHlwZSI+dGV4dDwvc3RyPgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkJvb2xlYW48L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPmJvb2xlYW48L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRpbnQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkZsb2F0PC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0iZmllbGRUeXBlIj50ZmxvYXQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS51dGlsLkRhdGU8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkYXRlPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5Mb25nPC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRsb25nPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8YXJyIG5hbWU9InZhbHVlQ2xhc3MiPgorICAgICAgICAgIDxzdHI+amF2YS5sYW5nLkRvdWJsZTwvc3RyPgorICAgICAgICAgIDxzdHI+amF2YS5sYW5nLkZsb2F0PC9zdHI+CisgICAgICAgIDwvYXJyPgorICAgICAgICA8c3RyIG5hbWU9ImZpZWxkVHlwZSI+dGRvdWJsZTwvc3RyPgorICAgICAgPC9sc3Q+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0iYWRkLWZpZWxkcyI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5BZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZGVmYXVsdEZpZWxkVHlwZSI+dGV4dDwvc3RyPgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkJvb2xlYW48L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPmJvb2xlYW48L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRpbnQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkZsb2F0PC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0iZmllbGRUeXBlIj50ZmxvYXQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS51dGlsLkRhdGU8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkYXRlPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5Mb25nPC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRsb25nPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5OdW1iZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkb3VibGU8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgIDwvcHJvY2Vzc29yPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1hbmQtYWRkLWZpZWxkcyI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUJvb2xlYW5GaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlTG9uZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VEb3VibGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRGF0ZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8YXJyIG5hbWU9ImZvcm1hdCI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3MsU1NTWjwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzcy5TU1M8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3MsU1NTPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzWjwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzczwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbVo8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW08L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLFNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLlNTUzwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQgSEg6bW06c3MsU1NTPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzc1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbVo8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZDwvc3RyPgorICAgICAgPC9hcnI+CisgICAgPC9wcm9jZXNzb3I+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5BZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZGVmYXVsdEZpZWxkVHlwZSI+dGV4dDwvc3RyPgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkJvb2xlYW48L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPmJvb2xlYW48L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRpbnQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkZsb2F0PC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0iZmllbGRUeXBlIj50ZmxvYXQ8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS51dGlsLkRhdGU8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkYXRlPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5Mb25nPC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkludGVnZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRsb25nPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5OdW1iZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkb3VibGU8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgIDwvcHJvY2Vzc29yPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1hbHRkaXJlY3RvcnkueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWFsdGRpcmVjdG9yeS54bWwKaW5kZXggOTZjZmQyZC4uMzEwNWJhZiAxMDA3NTUKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWFsdGRpcmVjdG9yeS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWFsdGRpcmVjdG9yeS54bWwKQEAgLTE5LDYgKzE5LDcgQEAKIAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9InN0YW5kYXJkIiBjbGFzcz0ic29sci5TdGFuZGFyZFJlcXVlc3RIYW5kbGVyIj48L3JlcXVlc3RIYW5kbGVyPgogICA8ZGlyZWN0b3J5RmFjdG9yeSBuYW1lPSJEaXJlY3RvcnlGYWN0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmNvcmUuQWx0ZXJuYXRlRGlyZWN0b3J5VGVzdCRUZXN0RlNEaXJlY3RvcnlGYWN0b3J5Ij48L2RpcmVjdG9yeUZhY3Rvcnk+CiAgIDxpbmRleFJlYWRlckZhY3RvcnkgbmFtZT0iSW5kZXhSZWFkZXJGYWN0b3J5IiBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmNvcmUuQWx0ZXJuYXRlRGlyZWN0b3J5VGVzdCRUZXN0SW5kZXhSZWFkZXJGYWN0b3J5Ij48L2luZGV4UmVhZGVyRmFjdG9yeSA+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYmFzaWMueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWJhc2ljLnhtbAppbmRleCBiMjNjNjEyLi5hYmZiNDJkIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYmFzaWMueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1iYXNpYy54bWwKQEAgLTIyLDYgKzIyLDcgQEAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAgIDxkYXRhRGlyPiR7c29sci5kYXRhLmRpcjp9PC9kYXRhRGlyPgorICA8eGk6aW5jbHVkZSBocmVmPSJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgogICA8ZGlyZWN0b3J5RmFjdG9yeSBuYW1lPSJEaXJlY3RvcnlGYWN0b3J5IiBjbGFzcz0iJHtzb2xyLmRpcmVjdG9yeUZhY3Rvcnk6c29sci5SQU1EaXJlY3RvcnlGYWN0b3J5fSIvPgogICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0ic3RhbmRhcmQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiPjwvcmVxdWVzdEhhbmRsZXI+CiA8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1jYWNoaW5nLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1jYWNoaW5nLnhtbAppbmRleCBjNmY3Y2JmLi4wZGU2Zjk0IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctY2FjaGluZy54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWNhY2hpbmcueG1sCkBAIC0xNiw2ICsxNiw3IEBACiAgIC0tPgogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KICAgPHF1ZXJ5PgogICAgIDxjYWNoZSBuYW1lPSJsZnVDYWNoZURlY2F5RmFsc2UiCkBAIC0zNSw0ICszNiw0IEBACiAgICAgICAgICAgIHNpemU9IjEwIgogICAgICAgICAgICBpbml0aWFsU2l6ZT0iOSIgLz4KICAgPC9xdWVyeT4KLTwvY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWNvbXBvbmVudHMtbmFtZS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctY29tcG9uZW50cy1uYW1lLnhtbAppbmRleCA0MGE5NDUxLi5iNTUwMWQ4IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctY29tcG9uZW50cy1uYW1lLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctY29tcG9uZW50cy1uYW1lLnhtbApAQCAtMTcsMjEgKzE3LDEyIEBACiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSBUaGlzIGlzIGEgImtpdGNoZW4gc2luayIgY29uZmlnIGZpbGUgdGhhdCB0ZXN0cyBjYW4gdXNlLgotICAgICBXaGVuIHdyaXR0aW5nIGEgbmV3IHRlc3QsIGZlZWwgZnJlZSB0byBhZGQgKm5ldyogaXRlbXMgKHBsdWdpbnMsCi0gICAgIGNvbmZpZyBvcHRpb25zLCBldGMuLi4pIGFzIGxvbmcgYXMgdGhleSBkb24ndCBicmVhayBhbnkgZXhpc3RpbmcKLSAgICAgdGVzdHMuICBpZiB5b3UgbmVlZCB0byB0ZXN0IHNvbWV0aGluZyBlc290ZXJpYyBwbGVhc2UgYWRkIGEgbmV3Ci0gICAgICJzb2xyY29uZmlnLXlvdXItZXNvdGVyaWMtcHVycG9zZS54bWwiIGNvbmZpZyBmaWxlLgotCi0gICAgIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoaXMgdGVzdCBpcyB1c2VkIGJ5IE1pbmltYWxTY2hlbWFUZXN0IHNvCi0gICAgIEFueXRoaW5nIGFkZGVkIHRvIHRoaXMgZmlsZSBuZWVkcyB0byB3b3JrIGNvcnJlY3RseSBldmVuIGlmIHRoZXJlCi0gICAgIGlzIG5vdyB1bmlxdWVLZXkgb3IgZGVmYXVsdFNlYXJjaCBGaWVsZC4KLSAgLS0+Ci0KIDxjb25maWc+CiAKICAgPGpteCAvPgogCisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CisKICAgPCEtLSBVc2VkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGRpcmVjdG9yeSB0byBob2xkIGFsbCBpbmRleCBkYXRhLgogICAgICAgIEl0IGRlZmF1bHRzIHRvICJpbmRleCIgaWYgbm90IHByZXNlbnQsIGFuZCBzaG91bGQgcHJvYmFibHkKICAgICAgICBub3QgYmUgY2hhbmdlZCBpZiByZXBsaWNhdGlvbiBpcyBpbiB1c2UuIC0tPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWRlZmF1bHRzLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1kZWZhdWx0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzOWVlZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1kZWZhdWx0cy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorCis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gCisKKyBhbiAiZW1wdHkiIHNvbHJjb25maWcgZm9yIHRlc3RpbmcgZGVmYXVsdCBiZWhhdmlvcgorCisgRE8gTk9UIEFERCBUSElOR1MgVE8gVEhJUyBDT05GSUchIAorCisgTk9URTogTW9zdCB0ZXN0cyBzaG91bGQgbm90IHVzZSB0aGlzIGNvbmZpZyB1bmxlc3MgdGhlICpleHBsaWNpdGx5KiB3YW50CisgdG8gdGVzdCBkZWZhdWx0IGJlaGF2aW9yLiAgTW9zdCB0ZXN0cyBzaG91bGQgdXNlIGVpdGhlci4uLgorCisgICAgIHNvbHJjb25maWctbWluaW1hbC54bWwKKyAgICAgc29scmNvbmZpZy1iYXNpYy54bWwKKyAgICAgc29scmNvbmZpZy54bWwKKworIC4uLmluIG9yZGVyIHRvIGdldCBiZXR0ZXIgcmFuZG9taXphdGlvbiBvZiB2YXJpb3VzIGNvbmZpZyBvcHRpb25zLgorCistLT4KKzxjb25maWc+CisgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+PCEtLQorCisKKyAgICAgICAgICAgICAgICBETyBOT1QgQUREIFRISU5HUyBUTyBUSElTIENPTkZJRyEgCisKKworLS0+PC9jb25maWc+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZGVscG9saWN5MS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZGVscG9saWN5MS54bWwKaW5kZXggMDllOWM2NS4uODBhMTEzNiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWRlbHBvbGljeTEueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1kZWxwb2xpY3kxLnhtbApAQCAtMTcsNyArMTcsNiBAQAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLQogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KQEAgLTI2LDYgKzI1LDcgQEAKICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9InN0YW5kYXJkIiBjbGFzcz0ic29sci5TdGFuZGFyZFJlcXVlc3RIYW5kbGVyIi8+CiAKICAgPGluZGV4Q29uZmlnPgorICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgIDxkZWxldGlvblBvbGljeSBjbGFzcz0ic29sci5Tb2xyRGVsZXRpb25Qb2xpY3kiPgogICAgIDxzdHIgbmFtZT0ia2VlcE9wdGltaXplZE9ubHkiPnRydWU8L3N0cj4KICAgICA8c3RyIG5hbWU9Im1heENvbW1pdHNUb0tlZXAiPjM8L3N0cj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1kZWxwb2xpY3kyLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1kZWxwb2xpY3kyLnhtbAppbmRleCA1ODVhMWNkLi42NzEwODkyIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZGVscG9saWN5Mi54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWRlbHBvbGljeTIueG1sCkBAIC0yMSw2ICsyMSw3IEBACiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICAgIDxkZWxldGlvblBvbGljeSBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmNvcmUuRmFrZURlbGV0aW9uUG9saWN5Ij4KICAgICAgIDxzdHIgbmFtZT0idmFyMSI+dmFsdWUxPC9zdHI+CiAJCSAgPHN0ciBuYW1lPSJ2YXIyIj52YWx1ZTI8L3N0cj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1lbGV2YXRlLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1lbGV2YXRlLnhtbAppbmRleCA5ZDA3MzJmLi5kMjE4Y2I5IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZWxldmF0ZS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWVsZXZhdGUueG1sCkBAIC0zMiw2ICszMiw3IEBACiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKICAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgICAgPGxvY2tUeXBlPnNpbmdsZTwvbG9ja1R5cGU+CiAgIDwvaW5kZXhDb25maWc+CiAgIApAQCAtNjYsMTAgKzY3LDggQEAKICAgICA8L2xpc3RlbmVyPgogICAgIC0tPgogCi0KICAgPC91cGRhdGVIYW5kbGVyPgogCi0KICAgPHF1ZXJ5PgogICAgIDwhLS0gTWF4aW11bSBudW1iZXIgb2YgY2xhdXNlcyBpbiBhIGJvb2xlYW4gcXVlcnkuLi4gY2FuIGFmZmVjdAogICAgICAgICByYW5nZSBvciB3aWxkY2FyZCBxdWVyaWVzIHRoYXQgZXhwYW5kIHRvIGJpZyBib29sZWFuCkBAIC03Nyw3ICs3Niw2IEBACiAgICAgLS0+CiAgICAgPG1heEJvb2xlYW5DbGF1c2VzPjEwMjQ8L21heEJvb2xlYW5DbGF1c2VzPgogCi0KICAgICA8IS0tIENhY2hlIHNwZWNpZmljYXRpb24gZm9yIEZpbHRlcnMgb3IgRG9jU2V0cyAtIHVub3JkZXJlZCBzZXQgb2YgKmFsbCogZG9jdW1lbnRzCiAgICAgICAgICB0aGF0IG1hdGNoIGEgcGFydGljdWxhciBxdWVyeS4KICAgICAgIC0tPgpAQCAtMTA4LDE5ICsxMDYsMTYgQEAKICAgICA8IS0tIHNldCBtYXhTaXplIGFydGlmaWNpYWxseSBsb3cgdG8gZXhlcmNpc2UgYm90aCB0eXBlcyBvZiBzZXRzIC0tPgogICAgIDxIYXNoRG9jU2V0IG1heFNpemU9IjMiIGxvYWRGYWN0b3I9IjAuNzUiLz4KIAotCiAgICAgPCEtLSBib29sVG9GaWx0ZXJPcHRpbWl6ZXIgY29udmVydHMgYm9vbGVhbiBjbGF1c2VzIHdpdGggemVybyBib29zdAogICAgICAgICAgaW50byBjYWNoZWQgZmlsdGVycyBpZiB0aGUgbnVtYmVyIG9mIGRvY3Mgc2VsZWN0ZWQgYnkgdGhlIGNsYXVzZSBleGNlZWRzCiAgICAgICAgICB0aGUgdGhyZXNob2xkIChyZXByZXNlbnRlZCBhcyBhIGZyYWN0aW9uIG9mIHRoZSB0b3RhbCBpbmRleCkKICAgICAtLT4KICAgICA8Ym9vbFRvZmlsdGVyT3B0aW1pemVyIGVuYWJsZWQ9ImZhbHNlIiBjYWNoZVNpemU9IjMyIiB0aHJlc2hvbGQ9Ii4wNSIvPgogCi0KICAgPC9xdWVyeT4KIAogICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3VwZGF0ZSIgY2xhc3M9InNvbHIuVXBkYXRlUmVxdWVzdEhhbmRsZXIiICAvPgogCi0KICAgPCEtLSB0ZXN0IGVsZXZhdGlvbiAtLT4KICAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJlbGV2YXRlIiBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuY29tcG9uZW50LlF1ZXJ5RWxldmF0aW9uQ29tcG9uZW50IiA+CiAgICAgPHN0ciBuYW1lPSJxdWVyeUZpZWxkVHlwZSI+c3RyaW5nPC9zdHI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZW5hYmxlcGx1Z2luLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1lbmFibGVwbHVnaW4ueG1sCmluZGV4IGQzODVmOTEuLjJkNTYzZDYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1lbmFibGVwbHVnaW4ueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1lbmFibGVwbHVnaW4ueG1sCkBAIC0yOCw2ICsyOCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpAQCAtNDUsNyArNDYsNiBAQAogICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iZGlzYWJsZWQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiIGVuYWJsZT0iZmFsc2UiLz4KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9ImVuYWJsZWQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiIGVuYWJsZT0idHJ1ZSIvPgogCi0KICAgPCEtLSB0ZXN0IHF1ZXJ5IHBhcmFtZXRlciBkZWZhdWx0cyAtLT4KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9ImxhenkiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiIHN0YXJ0dXA9ImxhenkiPgogICA8L3JlcXVlc3RIYW5kbGVyPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWZ1bmN0aW9ucXVlcnkueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWZ1bmN0aW9ucXVlcnkueG1sCmluZGV4IDEyYmYzYTIuLjFhMWE0ZmYgMTAwNzU1Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1mdW5jdGlvbnF1ZXJ5LnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZnVuY3Rpb25xdWVyeS54bWwKQEAgLTIwLDYgKzIwLDggQEAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAgCisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CisKICAgPCEtLSAgVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgogICAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsIGlzIGZpbGVzeXN0ZW0gYmFzZWQuCiAgICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQgYW5kIG5vdCBwZXJzaXN0ZW50LiAtLT4KQEAgLTM4LDUgKzQwLDQgQEAKICAgICA8ZmxvYXQgbmFtZT0ibnZsRmxvYXRWYWx1ZSI+MC4wPC9mbG9hdD4KICAgPC92YWx1ZVNvdXJjZVBhcnNlcj4KIAotCiA8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1oaWdobGlnaHQueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWhpZ2hsaWdodC54bWwKaW5kZXggOWRhMzI0NS4uN2Q1NWNjMiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWhpZ2hsaWdodC54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWhpZ2hsaWdodC54bWwKQEAgLTIwLDYgKzIwLDggQEAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAKKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KKwogICA8IS0tICBUaGUgRGlyZWN0b3J5RmFjdG9yeSB0byB1c2UgZm9yIGluZGV4ZXMuCiAgICAgICAgIHNvbHIuU3RhbmRhcmREaXJlY3RvcnlGYWN0b3J5LCB0aGUgZGVmYXVsdCwgaXMgZmlsZXN5c3RlbSBiYXNlZC4KICAgICAgICAgc29sci5SQU1EaXJlY3RvcnlGYWN0b3J5IGlzIG1lbW9yeSBiYXNlZCBhbmQgbm90IHBlcnNpc3RlbnQuIC0tPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWluZGV4Y29uZmlnLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1pbmRleGNvbmZpZy54bWwKaW5kZXggNzRjODI2OC4uODM0MDMyZCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWluZGV4Y29uZmlnLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaW5kZXhjb25maWcueG1sCkBAIC0yMiw2ICsyMiw4IEBACiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAKICAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgICAgPG1heEluZGV4aW5nVGhyZWFkcz4xMjM8L21heEluZGV4aW5nVGhyZWFkcz4KKyAgICA8aW5mb1N0cmVhbT50cnVlPC9pbmZvU3RyZWFtPgogICA8L2luZGV4Q29uZmlnPgogPC9jb25maWc+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaW5mb3N0cmVhbS1sb2dnaW5nLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1pbmZvc3RyZWFtLWxvZ2dpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMmY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctaW5mb3N0cmVhbS1sb2dnaW5nLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+CisKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWc+CisgIDxkYXRhRGlyPiR7c29sci5kYXRhLmRpcjp9PC9kYXRhRGlyPgorCisgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisKKyAgPGluZGV4Q29uZmlnPgorICAgIDxpbmZvU3RyZWFtPnRydWU8L2luZm9TdHJlYW0+CisgIDwvaW5kZXhDb25maWc+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1sYXp5d3JpdGVyLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1sYXp5d3JpdGVyLnhtbAppbmRleCAxZTI5MzlmLi4wNjM2YTFkIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbGF6eXdyaXRlci54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWxhenl3cml0ZXIueG1sCkBAIC0yMSw2ICsyMSw3IEBACiAgICAgIERPIE5PVCBBREQgVEhJTkdTIFRPIFRISVMgQ09ORklHISAtLT4KIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0idmVsb2NpdHkiIGNsYXNzPSJzb2xyLlZlbG9jaXR5UmVzcG9uc2VXcml0ZXIiIHN0YXJ0dXA9ImxhenkiLz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYW5hZ2VkLXNjaGVtYS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFuYWdlZC1zY2hlbWEueG1sCmluZGV4IDEzZGE4Y2YuLjM4M2Y4NTggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYW5hZ2VkLXNjaGVtYS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hbmFnZWQtc2NoZW1hLnhtbApAQCAtMjAsNiArMjAsOCBAQAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KIAorICA8eGk6aW5jbHVkZSBocmVmPSJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgorCiAgIDxzY2hlbWFGYWN0b3J5IGNsYXNzPSJNYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5Ij4KICAgICA8Ym9vbCBuYW1lPSJtdXRhYmxlIj5mYWxzZTwvYm9vbD4KICAgICA8c3RyIG5hbWU9Im1hbmFnZWRTY2hlbWFSZXNvdXJjZU5hbWUiPm1hbmFnZWQtc2NoZW1hPC9zdHI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIueG1sCmluZGV4IDdkZTRiMzAuLjk5NmI4N2EgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hc3RlcjEta2VlcE9uZUJhY2t1cC54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMS1rZWVwT25lQmFja3VwLnhtbAppbmRleCA1MzQ3OTc1Li4zMTNlZmM3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMS1rZWVwT25lQmFja3VwLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMS1rZWVwT25lQmFja3VwLnhtbApAQCAtMjMsNiArMjMsNyBAQAogCiAgIDxpbmRleENvbmZpZz4KICAgICA8bG9ja1R5cGU+c2luZ2xlPC9sb2NrVHlwZT4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICA8L2luZGV4Q29uZmlnPgogCiAgIDx1cGRhdGVIYW5kbGVyIGNsYXNzPSJzb2xyLkRpcmVjdFVwZGF0ZUhhbmRsZXIyIj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIxLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIxLnhtbAppbmRleCAzY2VhYTczLi5iNDUxYjc3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hc3RlcjEueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hc3RlcjIueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hc3RlcjIueG1sCmluZGV4IDAyNDgwMTYuLjE2ZDIzODIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIyLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMi54bWwKQEAgLTI0LDYgKzI0LDcgQEAKIAogICA8aW5kZXhDb25maWc+CiAgICAgPGxvY2tUeXBlPnNpbmdsZTwvbG9ja1R5cGU+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgPC9pbmRleENvbmZpZz4KIAogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWFzdGVyMy54bWwKaW5kZXggM2U0ODZkYi4uOWExYmFmYiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1hc3RlcjMueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tYXN0ZXIzLnhtbApAQCAtMjQsNiArMjQsNyBAQAogCiAgIDxpbmRleENvbmZpZz4KICAgICA8bG9ja1R5cGU+c2luZ2xlPC9sb2NrVHlwZT4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICA8L2luZGV4Q29uZmlnPgogCiAgIDx1cGRhdGVIYW5kbGVyIGNsYXNzPSJzb2xyLkRpcmVjdFVwZGF0ZUhhbmRsZXIyIj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tZXJnZXBvbGljeS1kZWZhdWx0cy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWVyZ2Vwb2xpY3ktZGVmYXVsdHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMmE5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWVyZ2Vwb2xpY3ktZGVmYXVsdHMueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgPz4KKworPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29uZmlnPgorICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8ZGlyZWN0b3J5RmFjdG9yeSBuYW1lPSJEaXJlY3RvcnlGYWN0b3J5IiBjbGFzcz0iJHtzb2xyLmRpcmVjdG9yeUZhY3Rvcnk6c29sci5SQU1EaXJlY3RvcnlGYWN0b3J5fSIvPgorCisgIDxpbmRleENvbmZpZz4KKyAgICA8IS0tIGRvIG5vdCBwdXQgYW55IG1lcmdlIHBvbGljeSwgbWVyZ2UgZmFjdG9yIAorICAgICAgICAgb3IgQ0ZTIHJlbGF0ZWQgc2V0dGluZ3MgaGVyZSAKKyAgICAtLT4KKyAgPC9pbmRleENvbmZpZz4KKworICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0ic3RhbmRhcmQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiPjwvcmVxdWVzdEhhbmRsZXI+CisKKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1lcmdlcG9saWN5LWxlZ2FjeS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWVyZ2Vwb2xpY3ktbGVnYWN5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM3N2FlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1lcmdlcG9saWN5LWxlZ2FjeS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorCis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWc+CisgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CisKKyAgPGluZGV4Q29uZmlnPgorICAgIDxtZXJnZUZhY3Rvcj43PC9tZXJnZUZhY3Rvcj4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgorCisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KKworPC9jb25maWc+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWVyZ2Vwb2xpY3kueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1lcmdlcG9saWN5LnhtbAppbmRleCA0ODQ5MGVkLi5jZDM3ZTYwIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWVyZ2Vwb2xpY3kueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tZXJnZXBvbGljeS54bWwKQEAgLTI2LDcgKzI2LDE1IEBACiAgICAgPG1lcmdlUG9saWN5IGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5UaWVyZWRNZXJnZVBvbGljeSI+CiAgICAgICA8aW50IG5hbWU9Im1heE1lcmdlQXRPbmNlRXhwbGljaXQiPjE5PC9pbnQ+CiAgICAgICA8aW50IG5hbWU9InNlZ21lbnRzUGVyVGllciI+OTwvaW50PgotICAgICAgPGRvdWJsZSBuYW1lPSJub0NGU1JhdGlvIj4xLjA8L2RvdWJsZT4KKyAgICAgIDxkb3VibGUgbmFtZT0ibm9DRlNSYXRpbyI+MC4xPC9kb3VibGU+CisKKyAgICAgIDwhLS0gU2V0dGVyIGZvciB0aGlzIHdhcyBtb3ZlZCBmcm9tIHRoZSBNZXJnZVBvbGljaWVzIHRvIEluZGV4V3JpdGVyQ29uZmlnCisgICAgICAgICAgIGluIEx1Y2VuZSA0LjQsIHNvIHdlIHNob3VsZCB0cmVhdCBpdCB0aGUgc2FtZSBhcyBhIDx1c2VDb21wb3VuZEZpbGU+CisgICAgICAgICAgIHNldHRpbmcgYW5kIGxvZyBhIHdhcm5pbmcgKGluc3RlYWQgb2YgZmFpbGluZyBiZWNhdXNlIHRoZSBzZXR0ZXIgaXMgCisgICAgICAgICAgIGdvbmUpLgorICAgICAgLS0+CisgICAgICA8Ym9vbCBuYW1lPSJ1c2VDb21wb3VuZEZpbGUiPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvYm9vbD4KKwogICAgIDwvbWVyZ2VQb2xpY3k+CiAgIDwvaW5kZXhDb25maWc+CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1taW5pbWFsLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1taW5pbWFsLnhtbAppbmRleCA1ZmIzOWJiLi43OGE0ZWI3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbWluaW1hbC54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW1pbmltYWwueG1sCkBAIC0yOCw4ICsyOCw3IEBACiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiCiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLk5SVENhY2hpbmdEaXJlY3RvcnlGYWN0b3J5fSIvPgogCi0gIDxpbmRleENvbmZpZz4KLSAgPC9pbmRleENvbmZpZz4KKyAgPHhpOmluY2x1ZGUgaHJlZj0iLi9zb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgogCiAgIDxqbXgvPgogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbXV0YWJsZS1tYW5hZ2VkLXNjaGVtYS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbXV0YWJsZS1tYW5hZ2VkLXNjaGVtYS54bWwKaW5kZXggOGRhYWNiZi4uMjE1NzFlMSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW11dGFibGUtbWFuYWdlZC1zY2hlbWEueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1tdXRhYmxlLW1hbmFnZWQtc2NoZW1hLnhtbApAQCAtMTksNiArMTksOCBAQAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KIAorICA8eGk6aW5jbHVkZSBocmVmPSJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgorCiAgIDxzY2hlbWFGYWN0b3J5IGNsYXNzPSJNYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5Ij4KICAgICA8Ym9vbCBuYW1lPSJtdXRhYmxlIj50cnVlPC9ib29sPgogICAgIDxzdHIgbmFtZT0ibWFuYWdlZFNjaGVtYVJlc291cmNlTmFtZSI+bWFuYWdlZC1zY2hlbWE8L3N0cj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1uYXRpdmVsb2NrLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1uYXRpdmVsb2NrLnhtbAppbmRleCBhYzBmNzBkLi43YjViNmY3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbmF0aXZlbG9jay54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW5hdGl2ZWxvY2sueG1sCkBAIC0yOCw2ICsyOCw3IEBACiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAKICAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgICAgPGxvY2tUeXBlPm5hdGl2ZTwvbG9ja1R5cGU+CiAgIDwvaW5kZXhDb25maWc+CiA8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1ub2NhY2hlLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1ub2NhY2hlLnhtbAppbmRleCBlODlmN2Y5Li5lZTI3ZDBjIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctbm9jYWNoZS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLW5vY2FjaGUueG1sCkBAIC0yMCw2ICsyMCw3IEBACiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgogCisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDwhLS0gIFRoZSBEaXJlY3RvcnlGYWN0b3J5IHRvIHVzZSBmb3IgaW5kZXhlcy4KICAgICAgICAgc29sci5TdGFuZGFyZERpcmVjdG9yeUZhY3RvcnksIHRoZSBkZWZhdWx0LCBpcyBmaWxlc3lzdGVtIGJhc2VkLgogICAgICAgICBzb2xyLlJBTURpcmVjdG9yeUZhY3RvcnkgaXMgbWVtb3J5IGJhc2VkIGFuZCBub3QgcGVyc2lzdGVudC4gLS0+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcGFyc2luZy11cGRhdGUtcHJvY2Vzc29yLWNoYWlucy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcGFyc2luZy11cGRhdGUtcHJvY2Vzc29yLWNoYWlucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0MWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1wYXJzaW5nLXVwZGF0ZS1wcm9jZXNzb3ItY2hhaW5zLnhtbApAQCAtMCwwICsxLDIzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorCis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgIFRlc3QgQ29uZmlnIHRoYXQgZW51bWVyYXRlcyBtYW55IGRpZmZlcmVudCBwYXJzaW5nIHVwZGF0ZSBwcm9jZXNzb3IgY2hhaW4gCisgICBjb25maWd1cmF0aW9ucy4KKyAgLS0+Cis8Y29uZmlnPgorICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0ic3RhbmRhcmQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiPjwvcmVxdWVzdEhhbmRsZXI+CisgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1kYXRlIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRGF0ZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8c3RyIG5hbWU9ImZvcm1hdCI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtZGF0ZS1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRGF0ZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8c3RyIG5hbWU9ImZvcm1hdCI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1kYXRlLWV4cGxpY2l0LW5vdC1pbi1zY2hlbWEtc2VsZWN0b3Itbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPGJvb2wgbmFtZT0iZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkIj5mYWxzZTwvYm9vbD4KKyAgICAgIDxzdHIgbmFtZT0iZm9ybWF0Ij55eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWjwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWRhdGUtZXhwbGljaXQtdHlwZWNsYXNzLXNlbGVjdG9yLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VEYXRlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0idHlwZUNsYXNzIj5zb2xyLkRhdGVGaWVsZDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJ0eXBlQ2xhc3MiPnNvbHIuVHJpZURhdGVGaWVsZDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmb3JtYXQiPnl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NaPC9zdHI+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtZGF0ZS1ub24tVVRDLWRlZmF1bHRUaW1lWm9uZSI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJkZWZhdWx0VGltZVpvbmUiPkFtZXJpY2EvTmV3X1lvcms8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ibG9jYWxlIj5lbl9VUzwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmb3JtYXQiPnl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NaPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZvcm1hdCI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUzwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJVUy1QYWNpZmljLXBhcnNlLWRhdGUtbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJkZWZhdWx0VGltZVpvbmUiPkFtZXJpY2EvTG9zX0FuZ2VsZXM8L3N0cj4KKyAgICAgIDxhcnIgbmFtZT0iZm9ybWF0Ij4KKyAgICAgICAgPHN0cj5NTS9kZC95eXl5PC9zdHI+CisgICAgICA8L2Fycj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1kYXRlLVVUQy1kZWZhdWx0VGltZVpvbmUtbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJkZWZhdWx0VGltZVpvbmUiPlVUQzwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJsb2NhbGUiPmVuX1VTPC9zdHI+CisgICAgICA8YXJyIG5hbWU9ImZvcm1hdCI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3MsU1NTWjwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzcy5TU1M8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3MsU1NTPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzWjwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzczwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbVo8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW08L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLFNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLlNTUzwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQgSEg6bW06c3MsU1NTPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzc1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbVo8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBoaDptbSBhPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBoaDptbWE8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkPC9zdHI+CisgICAgICAgIDxzdHI+RUVFIE1NTSBkZCBISDptbTpzcyBaIHl5eXk8L3N0cj4KKyAgICAgICAgPHN0cj5FRUUgTU1NIGRkIEhIOm1tOnNzIHl5eXkgWjwvc3RyPgorICAgICAgICA8c3RyPkVFRSBNTU0gZGQgSEg6bW06c3MgeXl5eTwvc3RyPgorICAgICAgICA8c3RyPkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgWjwvc3RyPgorICAgICAgICA8c3RyPkVFRUUsIGRkLU1NTS15eSBISDptbTpzcyBaPC9zdHI+CisgICAgICAgIDxzdHI+RUVFRSwgTU1NTSBkZCwgeXl5eTwvc3RyPgorICAgICAgICA8c3RyPk1NTU0gZGQsIHl5eXk8L3N0cj4KKyAgICAgICAgPHN0cj5NTU0uIGRkLCB5eXl5PC9zdHI+CisgICAgICA8L2Fycj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1mcmVuY2gtZGF0ZS1VVEMtZGVmYXVsdFRpbWVab25lLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VEYXRlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZGVmYXVsdFRpbWVab25lIj5VVEM8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ibG9jYWxlIj5mcjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmb3JtYXQiPidsZScgRUVFRSBkZCBNTU1NIHl5eXk8L3N0cj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1pbnQiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VJbnRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1pbnQtbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUludEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWludC1ydXNzaWFuLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VJbnRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJsb2NhbGUiPnJ1X1JVPC9zdHI+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtbG9uZyI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUxvbmdGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1sb25nLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtbG9uZy1ydXNzaWFuLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0ibG9jYWxlIj5ydV9SVTwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWZsb2F0Ij4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRmxvYXRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1mbG9hdC1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRmxvYXRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1mbG9hdC1mcmVuY2gtbm8tcnVuLXByb2Nlc3NvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUZsb2F0RmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0ibG9jYWxlIj5mcl9GUjwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWRvdWJsZSI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWRvdWJsZS1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtZG91YmxlLWZyZW5jaC1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0ibG9jYWxlIj5mcl9GUjwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWJvb2xlYW4iPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0icGFyc2UtYm9vbGVhbi1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlQm9vbGVhbkZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InBhcnNlLWJvb2xlYW4tYWx0ZXJuYXRlLXZhbHVlcy1uby1ydW4tcHJvY2Vzc29yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlQm9vbGVhbkZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8Ym9vbCBuYW1lPSJjYXNlU2Vuc2l0aXZlIj5mYWxzZTwvYm9vbD4KKyAgICAgIDxhcnIgbmFtZT0idHJ1ZVZhbHVlIj4KKyAgICAgICAgPHN0cj50cnVlPC9zdHI+CisgICAgICAgIDxzdHI+WUVTPC9zdHI+CisgICAgICAgIDxzdHI+b248L3N0cj4KKyAgICAgIDwvYXJyPgorICAgICAgPGFyciBuYW1lPSJmYWxzZVZhbHVlIj4KKyAgICAgICAgPHN0cj5mYWxzZTwvc3RyPgorICAgICAgICA8c3RyPm5vPC9zdHI+CisgICAgICAgIDxzdHI+b0ZGPC9zdHI+CisgICAgICA8L2Fycj4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJwYXJzZS1ib29sZWFuLWFsdGVybmF0ZS1zaW5nbGUtdmFsdWVzLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0idHJ1ZVZhbHVlIj55dXA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZmFsc2VWYWx1ZSI+bm9wZTwvc3RyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9ImNhc2NhZGluZy1wYXJzZXJzLW5vLXJ1bi1wcm9jZXNzb3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUludEZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VMb25nRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgCisgICAgPCEtLSBEaXNhYmxlZCBGbG9hdCBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGNsYWltIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhbmQgcm91bmQgLS0+CisgICAgPCEtLSB0byBmaXQgdmFsdWVzIGluIGF2YWlsYWJsZSBwcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRmxvYXRGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4gLS0+CisgICAgCisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURvdWJsZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VEYXRlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxhcnIgbmFtZT0iZm9ybWF0Ij4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW08L3N0cj4KKyAgICAgIDwvYXJyPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXBocmFzZXN1Z2dlc3QueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXBocmFzZXN1Z2dlc3QueG1sCmluZGV4IGNhMWQ4N2QuLjk2YjRmN2IgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1waHJhc2VzdWdnZXN0LnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcGhyYXNlc3VnZ2VzdC54bWwKQEAgLTIwLDYgKzIwLDcgQEAKIDwhLS0gc29scmNvbmZpZy54bWwgZm9yIGEgV0ZTVCBwaHJhc2Ugc3VnZ2VzdGVyIC0tPgogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1wb3N0aW5nc2hpZ2hsaWdodC54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcG9zdGluZ3NoaWdobGlnaHQueG1sCmluZGV4IDhlYjliNmIuLmMzZDlkNTQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1wb3N0aW5nc2hpZ2hsaWdodC54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXBvc3RpbmdzaGlnaGxpZ2h0LnhtbApAQCAtMjEsNiArMjEsNyBAQAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+CiAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcHJvcGluamVjdC1pbmRleGRlZmF1bHQueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXByb3BpbmplY3QtaW5kZXhkZWZhdWx0LnhtbAppbmRleCA3ZTg2MmVhLi5hNTZhNzFlIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcHJvcGluamVjdC1pbmRleGRlZmF1bHQueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1wcm9waW5qZWN0LWluZGV4ZGVmYXVsdC54bWwKQEAgLTE3LDIxICsxNyw2IEBACiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSAKLQotICAgICBUaGlzIGlzIGEgImtpdGNoZW4gc2luayIgY29uZmlnIGZpbGUgdGhhdCB0ZXN0cyBjYW4gdXNlLgotICAgICBXaGVuIHdyaXR0aW5nIGEgbmV3IHRlc3QsIGZlZWwgZnJlZSB0byBhZGQgKm5ldyogaXRlbXMgKHBsdWdpbnMsCi0gICAgIGNvbmZpZyBvcHRpb25zLCBldGMuLi4pIGFzIGxvbmcgYXMgdGhleSBkb24ndCBicmVhayBhbnkgZXhpc3RpbmcKLSAgICAgdGVzdHMuICBpZiB5b3UgbmVlZCB0byB0ZXN0IHNvbWV0aGluZyBlc290ZXJpYyBwbGVhc2UgYWRkIGEgbmV3Ci0gICAgICJzb2xyY29uZmlnLXlvdXItZXNvdGVyaWMtcHVycG9zZS54bWwiIGNvbmZpZyBmaWxlLgotCi0gICAgIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoaXMgdGVzdCBpcyB1c2VkIGJ5IE1pbmltYWxTY2hlbWFUZXN0IHNvCi0gICAgIEFueXRoaW5nIGFkZGVkIHRvIHRoaXMgZmlsZSBuZWVkcyB0byB3b3JrIGNvcnJlY3RseSBldmVuIGlmIHRoZXJlCi0gICAgIGlzIG5vdyB1bmlxdWVLZXkgb3IgZGVmYXVsdFNlYXJjaCBGaWVsZC4KLQotCi0gIC0tPgotCiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgogCkBAIC00MSw2ICsyNiw3IEBACiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKICAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgICAgPG1lcmdlUG9saWN5IGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Mb2dCeXRlU2l6ZU1lcmdlUG9saWN5Ij4KICAgICAgIDxkb3VibGUgbmFtZT0ibWF4TWVyZ2VNQiI+MzIuMDwvZG91YmxlPgogICAgIDwvbWVyZ2VQb2xpY3k+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcHJvcGluamVjdC54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcHJvcGluamVjdC54bWwKaW5kZXggODY2OWVhNi4uMGJhMjFhNSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXByb3BpbmplY3QueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1wcm9waW5qZWN0LnhtbApAQCAtMTcsMjIgKzE3LDYgQEAKICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08IS0tIAotCi0KLSAgICAgVGhpcyBpcyBhICJraXRjaGVuIHNpbmsiIGNvbmZpZyBmaWxlIHRoYXQgdGVzdHMgY2FuIHVzZS4KLSAgICAgV2hlbiB3cml0dGluZyBhIG5ldyB0ZXN0LCBmZWVsIGZyZWUgdG8gYWRkICpuZXcqIGl0ZW1zIChwbHVnaW5zLAotICAgICBjb25maWcgb3B0aW9ucywgZXRjLi4uKSBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgYnJlYWsgYW55IGV4aXN0aW5nCi0gICAgIHRlc3RzLiAgaWYgeW91IG5lZWQgdG8gdGVzdCBzb21ldGhpbmcgZXNvdGVyaWMgcGxlYXNlIGFkZCBhIG5ldwotICAgICAic29scmNvbmZpZy15b3VyLWVzb3RlcmljLXB1cnBvc2UueG1sIiBjb25maWcgZmlsZS4KLQotICAgICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGlzIHRlc3QgaXMgdXNlZCBieSBNaW5pbWFsU2NoZW1hVGVzdCBzbyAKLSAgICAgQW55dGhpbmcgYWRkZWQgdG8gdGhpcyBmaWxlIG5lZWRzIHRvIHdvcmsgY29ycmVjdGx5IGV2ZW4gaWYgdGhlcmUKLSAgICAgaXMgbm93IHVuaXF1ZUtleSBvciBkZWZhdWx0U2VhcmNoIEZpZWxkLgotCi0KLSAgLS0+Ci0KIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CiAKQEAgLTQzLDYgKzI3LDcgQEAKIAogIAogICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgICA8bWVyZ2VQb2xpY3kgY2xhc3M9Im9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkxvZ0J5dGVTaXplTWVyZ2VQb2xpY3kiPgogICAgICAgPGRvdWJsZSBuYW1lPSJtYXhNZXJnZU1CIj42NC4wPC9kb3VibGU+CiAgICAgPC9tZXJnZVBvbGljeT4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1xdWVyeXNlbmRlci1ub3F1ZXJ5LnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1xdWVyeXNlbmRlci1ub3F1ZXJ5LnhtbAppbmRleCBiMTIzZGI5Li5hZjZjYzc1IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcXVlcnlzZW5kZXItbm9xdWVyeS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXF1ZXJ5c2VuZGVyLW5vcXVlcnkueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgICAgPCEtLSAgVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgogICAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsIGlzIGZpbGVzeXN0ZW0gYmFzZWQuCiAgICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQgYW5kIG5vdCBwZXJzaXN0ZW50LiAtLT4KQEAgLTQ5LDcgKzUwLDYgQEAKICAgICA8bGlzdGVuZXIgZXZlbnQ9Im5ld1NlYXJjaGVyIgogICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmNvcmUuTW9ja0V2ZW50TGlzdGVuZXIiIC8+CiAKLQogICAgIDwhLS0gYSBmaXJzdFNlYXJjaGVyIGV2ZW50IGlzIGZpcmVkIHdoZW5ldmVyIGEgbmV3IHNlYXJjaGVyIGlzIGJlaW5nCiAgICAgICAgICBwcmVwYXJlZCBidXQgdGhlcmUgaXMgbm8gY3VycmVudCByZWdpc3RlcmVkIHNlYXJjaGVyIHRvIGhhbmRsZQogICAgICAgICAgcmVxdWVzdHMgb3IgdG8gZ2FpbiBwcmV3YXJtaW5nIGRhdGEgZnJvbS4gLS0+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcXVlcnlzZW5kZXIueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXF1ZXJ5c2VuZGVyLnhtbAppbmRleCBhMTU4ZDhkNi4uMTIyNTJjMCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXF1ZXJ5c2VuZGVyLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcXVlcnlzZW5kZXIueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgICAgPCEtLSAgVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgogICAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsIGlzIGZpbGVzeXN0ZW0gYmFzZWQuCiAgICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQgYW5kIG5vdCBwZXJzaXN0ZW50LiAtLT4KQEAgLTQ3LDcgKzQ4LDYgQEAKICAgICA8bGlzdGVuZXIgZXZlbnQ9Im5ld1NlYXJjaGVyIgogICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLmNvcmUuTW9ja0V2ZW50TGlzdGVuZXIiIC8+CiAKLQogICAgIDwhLS0gYSBmaXJzdFNlYXJjaGVyIGV2ZW50IGlzIGZpcmVkIHdoZW5ldmVyIGEgbmV3IHNlYXJjaGVyIGlzIGJlaW5nCiAgICAgICAgICBwcmVwYXJlZCBidXQgdGhlcmUgaXMgbm8gY3VycmVudCByZWdpc3RlcmVkIHNlYXJjaGVyIHRvIGhhbmRsZQogICAgICAgICAgcmVxdWVzdHMgb3IgdG8gZ2FpbiBwcmV3YXJtaW5nIGRhdGEgZnJvbS4gLS0+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcmVwZWF0ZXIueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXJlcGVhdGVyLnhtbAppbmRleCBmNWM5MDBlLi5mYjc5NDI3IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcmVwZWF0ZXIueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1yZXBlYXRlci54bWwKQEAgLTI0LDYgKzI0LDcgQEAKIAogICA8aW5kZXhDb25maWc+CiAgICAgPGxvY2tUeXBlPnNpbmdsZTwvbG9ja1R5cGU+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgPC9pbmRleENvbmZpZz4KIAogICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CkBAIC01NCw3ICs1NSw2IEBACiAgICAgPC9sc3Q+CiAgIDwvcmVxdWVzdEhhbmRsZXI+CiAKLQogICA8IS0tIGVuYWJsZSBzdHJlYW1pbmcgZm9yIHRlc3RpbmcuLi4gLS0+CiAgIDxyZXF1ZXN0RGlzcGF0Y2hlciBoYW5kbGVTZWxlY3Q9InRydWUiPgogICAgIDxyZXF1ZXN0UGFyc2VycyBlbmFibGVSZW1vdGVTdHJlYW1pbmc9InRydWUiIG11bHRpcGFydFVwbG9hZExpbWl0SW5LQj0iMjA0OCIvPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXJlc3BvbnNlLWxvZy1jb21wb25lbnQueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXJlc3BvbnNlLWxvZy1jb21wb25lbnQueG1sCmluZGV4IGNhYzUyNGQuLjg1OTg4M2QgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1yZXNwb25zZS1sb2ctY29tcG9uZW50LnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctcmVzcG9uc2UtbG9nLWNvbXBvbmVudC54bWwKQEAgLTE5LDYgKzE5LDcgQEAKIAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9InN0YW5kYXJkIgogICAgICBjbGFzcz0ic29sci5TdGFuZGFyZFJlcXVlc3RIYW5kbGVyIj48L3JlcXVlc3RIYW5kbGVyPgogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2NyaXB0LXVwZGF0ZXByb2Nlc3Nvci54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2NyaXB0LXVwZGF0ZXByb2Nlc3Nvci54bWwKaW5kZXggYmYwZDkzYy4uNDNmYmMyOCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNjcmlwdC11cGRhdGVwcm9jZXNzb3IueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zY3JpcHQtdXBkYXRlcHJvY2Vzc29yLnhtbApAQCAtMjMsNiArMjMsNyBAQAogICAtLT4KIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KIApAQCAtMzQsNyArMzUsNiBAQAogICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUnVuVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KICAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CiAKLQogICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InJ1bi1uby1zY3JpcHRzIj4KICAgICA8IS0tIGZvciBieXBhc3NpbmcgYWxsIHNjcmlwdHMgLS0+CiAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNpbXBsZWxvY2sueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNpbXBsZWxvY2sueG1sCmluZGV4IDE3NjAyNjcuLjc5ODFiODQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zaW1wbGVsb2NrLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2ltcGxlbG9jay54bWwKQEAgLTI4LDYgKzI4LDcgQEAKICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KIAogICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgICA8bG9ja1R5cGU+c2ltcGxlPC9sb2NrVHlwZT4KICAgPC9pbmRleENvbmZpZz4KIDwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNsYXZlLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZS54bWwKaW5kZXggYjAwMjA2Zi4uMWZmMzJhZSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNsYXZlLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2xhdmUueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpAQCAtNTIsNyArNTMsNiBAQAogICAgICA8L2xzdD4KICAgPC9yZXF1ZXN0SGFuZGxlcj4KIAotCiAgIDwhLS0gZW5hYmxlIHN0cmVhbWluZyBmb3IgdGVzdGluZy4uLiAtLT4KICAgPHJlcXVlc3REaXNwYXRjaGVyIGhhbmRsZVNlbGVjdD0idHJ1ZSI+CiAgICAgPHJlcXVlc3RQYXJzZXJzIGVuYWJsZVJlbW90ZVN0cmVhbWluZz0idHJ1ZSIgbXVsdGlwYXJ0VXBsb2FkTGltaXRJbktCPSIyMDQ4Ii8+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2xhdmUxLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZTEueG1sCmluZGV4IDRlZWNmMTEuLjZlOTA3YTQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZTEueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZTEueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpAQCAtNDgsNyArNDksNiBAQAogCiAgIDwvcmVxdWVzdEhhbmRsZXI+CiAKLQogICA8IS0tIGVuYWJsZSBzdHJlYW1pbmcgZm9yIHRlc3RpbmcuLi4gLS0+CiAgIDxyZXF1ZXN0RGlzcGF0Y2hlciBoYW5kbGVTZWxlY3Q9InRydWUiPgogICAgIDxyZXF1ZXN0UGFyc2VycyBlbmFibGVSZW1vdGVTdHJlYW1pbmc9InRydWUiIG11bHRpcGFydFVwbG9hZExpbWl0SW5LQj0iMjA0OCIvPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNvbGNvcmVwcm9wZXJ0aWVzLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zb2xjb3JlcHJvcGVydGllcy54bWwKaW5kZXggZGI5OTY4Yy4uNzIyYTM5MiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNvbGNvcmVwcm9wZXJ0aWVzLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc29sY29yZXByb3BlcnRpZXMueG1sCkBAIC0yOCw2ICsyOCw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT5zaW5nbGU8L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNwZWxsY2hlY2tjb21wb25lbnQueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNwZWxsY2hlY2tjb21wb25lbnQueG1sCmluZGV4IDhhMDFjMTcuLjkwOTJhNTggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zcGVsbGNoZWNrY29tcG9uZW50LnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc3BlbGxjaGVja2NvbXBvbmVudC54bWwKQEAgLTE5LDYgKzE5LDcgQEAKIAogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9InN0YW5kYXJkIgogICAgICBjbGFzcz0ic29sci5TdGFuZGFyZFJlcXVlc3RIYW5kbGVyIj48L3JlcXVlc3RIYW5kbGVyPgogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc3BlbGxjaGVja2VyLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zcGVsbGNoZWNrZXIueG1sCmluZGV4IDcyZmMwZjYuLmU2NzQ0Y2IgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zcGVsbGNoZWNrZXIueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zcGVsbGNoZWNrZXIueG1sCkBAIC0xNyw2ICsxNyw3IEBACiAtLT4KIAogPGNvbmZpZz4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLz4KICAgPCEtLSAgVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgogICAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsIGlzIGZpbGVzeXN0ZW0gYmFzZWQuCiAgICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQgYW5kIG5vdCBwZXJzaXN0ZW50LiAtLT4KQEAgLTI0LDcgKzI1LDYgQEAKIAogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgogCi0KICAgPHVwZGF0ZUhhbmRsZXIgY2xhc3M9InNvbHIuRGlyZWN0VXBkYXRlSGFuZGxlcjIiPgogICA8L3VwZGF0ZUhhbmRsZXI+CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy10ZXJtaW5kZXgueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRlcm1pbmRleC54bWwKaW5kZXggYTVlNDk3YS4uMmFmZDgxMyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRlcm1pbmRleC54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRlcm1pbmRleC54bWwKQEAgLTMxLDYgKzMxLDcgQEAKICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KIAogICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgICA8dGVybUluZGV4SW50ZXJ2YWw+MjU2PC90ZXJtSW5kZXhJbnRlcnZhbD4KICAgICA8bWVyZ2VQb2xpY3kgY2xhc3M9Im9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRpZXJlZE1lcmdlUG9saWN5Ii8+CiAgICAgPG1lcmdlU2NoZWR1bGVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIiLz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy10bG9nLW1hbmFnZWQtc2NoZW1hLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy10bG9nLW1hbmFnZWQtc2NoZW1hLnhtbAppbmRleCAyZGE0ZjIzLi4yYWU5YjM1IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdGxvZy1tYW5hZ2VkLXNjaGVtYS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRsb2ctbWFuYWdlZC1zY2hlbWEueG1sCkBAIC0zNSw2ICszNSw3IEBACiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT4ke3NvbHIubG9jay50eXBlOm5hdGl2ZX08L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPCEtLSBhbiB1cGRhdGUgcHJvY2Vzc29yIHRoZSBleHBsaWNpdGx5IGV4Y2x1ZGVzIGRpc3RyaWIgdG8gdGVzdApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRsb2ctbXV0YWJsZS1tYW5hZ2VkLXNjaGVtYS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdGxvZy1tdXRhYmxlLW1hbmFnZWQtc2NoZW1hLnhtbAppbmRleCAyOGM3YzEzLi4zYzg2ZWI5IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdGxvZy1tdXRhYmxlLW1hbmFnZWQtc2NoZW1hLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdGxvZy1tdXRhYmxlLW1hbmFnZWQtc2NoZW1hLnhtbApAQCAtMzUsNiArMzUsNyBAQAogCiAgIDxpbmRleENvbmZpZz4KICAgICA8bG9ja1R5cGU+JHtzb2xyLmxvY2sudHlwZTpuYXRpdmV9PC9sb2NrVHlwZT4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICA8L2luZGV4Q29uZmlnPgogCiAgIDwhLS0gYW4gdXBkYXRlIHByb2Nlc3NvciB0aGUgZXhwbGljaXRseSBleGNsdWRlcyBkaXN0cmliIHRvIHRlc3QKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy10bG9nLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy10bG9nLnhtbAppbmRleCBkZWEyOGU2Li4yY2FjYjVhIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdGxvZy54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRsb2cueG1sCkBAIC0yNCwxMyArMjQsMTcgQEAKICAgCiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ij4KICAgICA8IS0tIHVzZWQgdG8ga2VlcCBSQU0gcmVxcyBkb3duIGZvciBIZGZzRGlyZWN0b3J5RmFjdG9yeSAtLT4KKyAgICA8Ym9vbCBuYW1lPSJzb2xyLmhkZnMuYmxvY2tjYWNoZS5lbmFibGVkIj4ke3NvbHIuaGRmcy5ibG9ja2NhY2hlLmVuYWJsZWQ6dHJ1ZX08L2Jvb2w+CiAgICAgPGludCBuYW1lPSJzb2xyLmhkZnMuYmxvY2tjYWNoZS5ibG9ja3NwZXJiYW5rIj4ke3NvbHIuaGRmcy5ibG9ja2NhY2hlLmJsb2Nrc3BlcmJhbms6MTAyNH08L2ludD4KKyAgICA8c3RyIG5hbWU9InNvbHIuaGRmcy5ob21lIj4ke3NvbHIuaGRmcy5ob21lOn08L3N0cj4KKyAgICA8c3RyIG5hbWU9InNvbHIuaGRmcy5jb25mZGlyIj4ke3NvbHIuaGRmcy5jb25mZGlyOn08L3N0cj4KICAgPC9kaXJlY3RvcnlGYWN0b3J5PgogICAKICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CiAKICAgPGluZGV4Q29uZmlnPgogICAgIDxsb2NrVHlwZT4ke3NvbHIubG9jay50eXBlOm5hdGl2ZX08L2xvY2tUeXBlPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgIDwvaW5kZXhDb25maWc+CiAKICAgPCEtLSBhbiB1cGRhdGUgcHJvY2Vzc29yIHRoZSBleHBsaWNpdGx5IGV4Y2x1ZGVzIGRpc3RyaWIgdG8gdGVzdApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXRyYW5zZm9ybWVycy54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdHJhbnNmb3JtZXJzLnhtbAppbmRleCBlNTliYWQwLi5lY2FhZjExIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdHJhbnNmb3JtZXJzLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdHJhbnNmb3JtZXJzLnhtbApAQCAtMTksMTIgKzE5LDEyIEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDwhLS0gIFRoZSBEaXJlY3RvcnlGYWN0b3J5IHRvIHVzZSBmb3IgaW5kZXhlcy4KICAgICAgICAgc29sci5TdGFuZGFyZERpcmVjdG9yeUZhY3RvcnksIHRoZSBkZWZhdWx0LCBpcyBmaWxlc3lzdGVtIGJhc2VkLgogICAgICAgICBzb2xyLlJBTURpcmVjdG9yeUZhY3RvcnkgaXMgbWVtb3J5IGJhc2VkIGFuZCBub3QgcGVyc2lzdGVudC4gLS0+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKLQogPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJzdGFuZGFyZCI+CiAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuQ3VzdG9tVXBkYXRlUmVxdWVzdFByb2Nlc3NvckZhY3RvcnkiIGVuYWJsZT0iZmFsc2UiPgogICAgPCEtLSB0aGlzIHByb2Nlc3NvciBpcyBub3QgZW5hYmxlZCwgc28gaXQgd29uJ3QgYmUgdXNlZCBhdCBhbGwgLS0+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdXBkYXRlLXByb2Nlc3Nvci1jaGFpbnMueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXVwZGF0ZS1wcm9jZXNzb3ItY2hhaW5zLnhtbAppbmRleCBkZmZlYWJlLi43ZjUyNjg4IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctdXBkYXRlLXByb2Nlc3Nvci1jaGFpbnMueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy11cGRhdGUtcHJvY2Vzc29yLWNoYWlucy54bWwKQEAgLTI0LDYgKzI0LDcgQEAKICAgLS0+CiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8eGk6aW5jbHVkZSBocmVmPSJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgogICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0ic3RhbmRhcmQiIGNsYXNzPSJzb2xyLlN0YW5kYXJkUmVxdWVzdEhhbmRsZXIiPjwvcmVxdWVzdEhhbmRsZXI+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKQEAgLTUzLDcgKzU0LDYgQEAKICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8+CiAgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgogCi0KICAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJ0cmltLWFsbCI+CiAgICAgPCEtLSBubyBzcGVjaWZpYyBzcmMgZmllbGQgY29uZmlncywgc28gYWxsIGZpZWxkcyBzaG91bGQgZ2V0IHRyaW1tZWQgLS0+CiAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5UcmltRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KQEAgLTY2LDcgKzY2LDYgQEAKICAgICA8L3Byb2Nlc3Nvcj4KICAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CiAKLQogICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9InRyaW0tbW9zdCI+CiAgICAgPCEtLSBhbGwgZmllbGRzIGV4Y2VwdCB0aGUgZXhjbHVzaW9ucyBzaG91bGQgYmUgdHJpbW1lZCAtLT4KICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlRyaW1GaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgpAQCAtMjQxLDYgKzI0MCw0NiBAQAogICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuSWdub3JlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgogICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KIAorICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9Imlnbm9yZS1ub3QtaW4tc2NoZW1hLWV4cGxpY2l0LXNlbGVjdG9yIj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLklnbm9yZUZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8Ym9vbCBuYW1lPSJmaWVsZE5hbWVNYXRjaGVzU2NoZW1hRmllbGQiPmZhbHNlPC9ib29sPgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9Imlnbm9yZS1pbi1zY2hlbWEiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuSWdub3JlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxib29sIG5hbWU9ImZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZCI+dHJ1ZTwvYm9vbD4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisgIAorICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9Imlnbm9yZS1ub3QtaW4tc2NoZW1hLWFuZC1mb28tbmFtZS1wcmVmaXgiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuSWdub3JlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZmllbGRSZWdleCI+Zm9vLio8L3N0cj4KKyAgICAgIDxib29sIG5hbWU9ImZpZWxkTmFtZU1hdGNoZXNTY2hlbWFGaWVsZCI+ZmFsc2U8L2Jvb2w+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0iaWdub3JlLWZvby1uYW1lLXByZWZpeC1leGNlcHQtbm90LXNjaGVtYSI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5JZ25vcmVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJmaWVsZFJlZ2V4Ij5mb28uKjwvc3RyPgorICAgICAgPGxzdCBuYW1lPSJleGNsdWRlIj4KKyAgICAgICAgPGJvb2wgbmFtZT0iZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkIj5mYWxzZTwvYm9vbD4KKyAgICAgIDwvbHN0PgorICAgIDwvcHJvY2Vzc29yPgorICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKworICA8dXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluIG5hbWU9Imlnbm9yZS1ub3QtaW4tc2NoZW1hLWV4cGxpY2l0LXN0ci1zZWxlY3RvciI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5JZ25vcmVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPHN0ciBuYW1lPSJmaWVsZE5hbWVNYXRjaGVzU2NoZW1hRmllbGQiPmZhbHNlPC9zdHI+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCisgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0iaWdub3JlLWluLXNjaGVtYS1zdHItc2VsZWN0b3IiPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuSWdub3JlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KKyAgICAgIDxzdHIgbmFtZT0iZmllbGROYW1lTWF0Y2hlc1NjaGVtYUZpZWxkIj50cnVlPC9zdHI+CisgICAgPC9wcm9jZXNzb3I+CisgIDwvdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWluPgorCiAgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0iaWdub3JlLXNvbWUiPgogICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuSWdub3JlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ij4KICAgICAgIDxzdHIgbmFtZT0iZmllbGRSZWdleCI+LipfcmF3PC9zdHI+CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctd2FybWVyLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy13YXJtZXIueG1sCmluZGV4IDNlMWE0NjUuLjY5YTBmOGEgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy13YXJtZXIueG1sCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy13YXJtZXIueG1sCkBAIC0yNiw2ICsyNiw3IEBACiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KICAgCiAgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgogICAgIDxtZXJnZWRTZWdtZW50V2FybWVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TaW1wbGVNZXJnZWRTZWdtZW50V2FybWVyIi8+CiAgIDwvaW5kZXhDb25maWc+CiA8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy14aW5jbHVkZS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcteGluY2x1ZGUueG1sCmluZGV4IDQxNjJlNGYuLjIzMGExZWIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy14aW5jbHVkZS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXhpbmNsdWRlLnhtbApAQCAtMTksNiArMTksOCBAQAogCiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8eGk6aW5jbHVkZSBocmVmPSJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIvPgorCiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDx4aTppbmNsdWRlIGhyZWY9ImZvb2Jhci1taXNzaW5nLnhtbCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgogICAgIDx4aTpmYWxsYmFjaz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIxZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgPz4KKworPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSAKKworQSBzb2xyY29uZmlnLnhtbCBzbmlwcGV0IGNvbnRhaW5pbmcgaW5kZXhDb25maWcgc2V0dGluZ3MgZm9yIHJhbmRvbWl6ZWQgdGVzdGluZy4KKworLS0+Cis8aW5kZXhDb25maWc+CisgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+Cis8L2luZGV4Q29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwKaW5kZXggODhmNjU1OS4uOTkxNTk0YyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCkBAIC01Myw3ICs1Myw3IEBACiAgICAgPG1lcmdlU2NoZWR1bGVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIiLz4KICAgICA8d3JpdGVMb2NrVGltZW91dD4xMDAwPC93cml0ZUxvY2tUaW1lb3V0PgogICAgIDxtZXJnZUZhY3Rvcj44PC9tZXJnZUZhY3Rvcj4KLQorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CiAgICAgPCEtLSBmb3IgYmV0dGVyIG11bHRpLXNlZ21lbnQgdGVzdGluZywgd2UgYXJlIHVzaW5nIHNsb3dlcgogICAgIGluZGV4aW5nIHByb3BlcnRpZXMgb2YgbWF4QnVmZmVyZWREb2NzPTEwIGFuZCBMb2dEb2NNZXJnZVBvbGljeS4KICAgICAtLT4KQEAgLTk0LDcgKzk0LDcgQEAKICAgICA8L2xpc3RlbmVyPgogICAgIC0tPgogICAgIAotICAgIDx1cGRhdGVMb2cgZW5hYmxlPSIke2VuYWJsZS51cGRhdGUubG9nOmZhbHNlfSI+CisgICAgPHVwZGF0ZUxvZyBlbmFibGU9IiR7ZW5hYmxlLnVwZGF0ZS5sb2c6dHJ1ZX0iPgogICAJICA8c3RyIG5hbWU9ImRpciI+JHtzb2xyLnVsb2cuZGlyOn08L3N0cj4KICAgICA8L3VwZGF0ZUxvZz4gCiAgICAgCkBAIC0xMDQsNyArMTA0LDYgQEAKIAogICA8L3VwZGF0ZUhhbmRsZXI+CiAKLQogICA8cXVlcnk+CiAgICAgPCEtLSBNYXhpbXVtIG51bWJlciBvZiBjbGF1c2VzIGluIGEgYm9vbGVhbiBxdWVyeS4uLiBjYW4gYWZmZWN0CiAgICAgICAgIHJhbmdlIG9yIHdpbGRjYXJkIHF1ZXJpZXMgdGhhdCBleHBhbmQgdG8gYmlnIGJvb2xlYW4KQEAgLTExMiw3ICsxMTEsNiBAQAogICAgIC0tPgogICAgIDxtYXhCb29sZWFuQ2xhdXNlcz4xMDI0PC9tYXhCb29sZWFuQ2xhdXNlcz4KIAotCiAgICAgPCEtLSBDYWNoZSBzcGVjaWZpY2F0aW9uIGZvciBGaWx0ZXJzIG9yIERvY1NldHMgLSB1bm9yZGVyZWQgc2V0IG9mICphbGwqIGRvY3VtZW50cwogICAgICAgICAgdGhhdCBtYXRjaCBhIHBhcnRpY3VsYXIgcXVlcnkuCiAgICAgICAtLT4KQEAgLTE0OSw3ICsxNDcsNiBAQAogICAgICAgLz4KICAgICAtLT4KIAotCiAgICAgPCEtLQogICAgIDx1c2VGaWx0ZXJGb3JTb3J0ZWRRdWVyeT50cnVlPC91c2VGaWx0ZXJGb3JTb3J0ZWRRdWVyeT4KICAgICAtLT4KQEAgLTE1OSwxNCArMTU2LDEyIEBACiAgICAgPCEtLSBzZXQgbWF4U2l6ZSBhcnRpZmljaWFsbHkgbG93IHRvIGV4ZXJjaXNlIGJvdGggdHlwZXMgb2Ygc2V0cyAtLT4KICAgICA8SGFzaERvY1NldCBtYXhTaXplPSIzIiBsb2FkRmFjdG9yPSIwLjc1Ii8+CiAKLQogICAgIDwhLS0gYm9vbFRvRmlsdGVyT3B0aW1pemVyIGNvbnZlcnRzIGJvb2xlYW4gY2xhdXNlcyB3aXRoIHplcm8gYm9vc3QKICAgICAgICAgIGludG8gY2FjaGVkIGZpbHRlcnMgaWYgdGhlIG51bWJlciBvZiBkb2NzIHNlbGVjdGVkIGJ5IHRoZSBjbGF1c2UgZXhjZWVkcwogICAgICAgICAgdGhlIHRocmVzaG9sZCAocmVwcmVzZW50ZWQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgdG90YWwgaW5kZXgpCiAgICAgLS0+CiAgICAgPGJvb2xUb2ZpbHRlck9wdGltaXplciBlbmFibGVkPSJmYWxzZSIgY2FjaGVTaXplPSIzMiIgdGhyZXNob2xkPSIuMDUiLz4KIAotCiAgICAgPCEtLSBhIG5ld1NlYXJjaGVyIGV2ZW50IGlzIGZpcmVkIHdoZW5ldmVyIGEgbmV3IHNlYXJjaGVyIGlzIGJlaW5nIHByZXBhcmVkCiAgICAgICAgICBhbmQgdGhlcmUgaXMgYSBjdXJyZW50IHNlYXJjaGVyIGhhbmRsaW5nIHJlcXVlc3RzIChha2EgcmVnaXN0ZXJlZCkuIC0tPgogICAgIDwhLS0gUXVlcnlTZW5kZXJMaXN0ZW5lciB0YWtlcyBhbiBhcnJheSBvZiBOYW1lZExpc3QgYW5kIGV4ZWN1dGVzIGEKQEAgLTE5MSw3ICsxODYsNiBAQAogICAgIDwvbGlzdGVuZXI+CiAgICAgLS0+CiAKLQogICA8L3F1ZXJ5PgogICAKICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0ieG1sIiBkZWZhdWx0PSJ0cnVlIgpAQCAtMjE5LDcgKzIxMyw2IEBACiAgICAgIDwvbHN0PgogICA8L3JlcXVlc3RIYW5kbGVyPgogCi0KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9ImRpc21heCIgY2xhc3M9InNvbHIuU2VhcmNoSGFuZGxlciIgPgogICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgogICAgICA8c3RyIG5hbWU9ImRlZlR5cGUiPmRpc21heDwvc3RyPgpAQCAtMjY1LDcgKzI1OCw2IEBACiAKICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii91cGRhdGUiIGNsYXNzPSJzb2xyLlVwZGF0ZVJlcXVlc3RIYW5kbGVyIiAgLz4KIAotCiAgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ic3BlbGxjaGVjayIgY2xhc3M9Im9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmNvbXBvbmVudC5TcGVsbENoZWNrQ29tcG9uZW50Ij4KICAgICA8IS0tIFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIGZpZWxkIHZhbHVlIHNvIHdlIGNhbiB0ZXN0IGRlYWxpbmcgd2l0aCB0b2tlbiBvZmZzZXQgY2hhbmdlcyAtLT4KICAgICA8c3RyIG5hbWU9InF1ZXJ5QW5hbHl6ZXJGaWVsZFR5cGUiPmxvd2VycHVuY3RmaWx0PC9zdHI+CkBAIC00NzEsNyArNDYzLDYgQEAKICAgPC9oaWdobGlnaHRpbmc+CiAgIDwvc2VhcmNoQ29tcG9uZW50PgogCi0KICAgPCEtLSBlbmFibGUgc3RyZWFtaW5nIGZvciB0ZXN0aW5nLi4uIC0tPgogICA8cmVxdWVzdERpc3BhdGNoZXIgaGFuZGxlU2VsZWN0PSJ0cnVlIiA+CiAgICAgPHJlcXVlc3RQYXJzZXJzIGVuYWJsZVJlbW90ZVN0cmVhbWluZz0idHJ1ZSIgbXVsdGlwYXJ0VXBsb2FkTGltaXRJbktCPSIyMDQ4IiAvPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnX2NvZGVjLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZ19jb2RlYy54bWwKaW5kZXggNzM4YmIzMy4uYzVjYzA0YyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnX2NvZGVjLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWdfY29kZWMueG1sCkBAIC0xOCw2ICsxOCw3IEBACiAKIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSJzdGFuZGFyZCIgY2xhc3M9InNvbHIuU3RhbmRhcmRSZXF1ZXN0SGFuZGxlciI+PC9yZXF1ZXN0SGFuZGxlcj4KICAgPGNvZGVjRmFjdG9yeSBjbGFzcz0ic29sci5TY2hlbWFDb2RlY0ZhY3RvcnkiLz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZ19wZXJmLnhtbCBiL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZ19wZXJmLnhtbAppbmRleCAwYzVlMjA1Li4xNzJmYzk1IDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWdfcGVyZi54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnX3BlcmYueG1sCkBAIC0yMyw2ICsyMyw4IEBACiAgICAgICAgSWYgcmVwbGljYXRpb24gaXMgaW4gdXNlLCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbi4gLS0+CiAgIDxkYXRhRGlyPiR7c29sci5kYXRhLmRpcjp9PC9kYXRhRGlyPgogCisgIDx4aTppbmNsdWRlIGhyZWY9InNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIi8+CisKICAgPCEtLSAgVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgogICAgICAgICBzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsIGlzIGZpbGVzeXN0ZW0gYmFzZWQuCiAgICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQgYW5kIG5vdCBwZXJzaXN0ZW50LiAtLT4KQEAgLTY2LDcgKzY4LDYgQEAKICAgICA8L2h0dHBDYWNoaW5nPgogICA8L3JlcXVlc3REaXNwYXRjaGVyPgogCi0KICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9InN0YW5kYXJkIiBjbGFzcz0ic29sci5TZWFyY2hIYW5kbGVyIiBkZWZhdWx0PSJ0cnVlIj4KICAgPC9yZXF1ZXN0SGFuZGxlcj4KIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY3JhenktcGF0aC10by1jb25maWcueG1sIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvY3JhenktcGF0aC10by1jb25maWcueG1sCmluZGV4IDQzYmFmOWQuLmI0YmQ1ZTUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL2NyYXp5LXBhdGgtdG8tY29uZmlnLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9jcmF6eS1wYXRoLXRvLWNvbmZpZy54bWwKQEAgLTI1LDYgKzI1LDcgQEAKICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KIAogICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KICAgICA8bG9ja1R5cGU+c2luZ2xlPC9sb2NrVHlwZT4KICAgPC9pbmRleENvbmZpZz4KIApAQCAtMzIsNyArMzMsNiBAQAogICAgIDxjb21taXRJbnRlcnZhbExvd2VyQm91bmQ+MDwvY29tbWl0SW50ZXJ2YWxMb3dlckJvdW5kPgogICA8L3VwZGF0ZUhhbmRsZXI+CiAKLQogICA8cXVlcnk+CiAgICAgPG1heEJvb2xlYW5DbGF1c2VzPjEwMjQ8L21heEJvb2xlYW5DbGF1c2VzPgogICAgIDx1c2VGaWx0ZXJGb3JTb3J0ZWRRdWVyeT50cnVlPC91c2VGaWx0ZXJGb3JTb3J0ZWRRdWVyeT4KQEAgLTU0LDEyICs1NCw5IEBACiAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InVzZWxlc3MiIGNsYXNzPSJvcmcuYXBhY2hlLnNvbHIuT3V0cHV0V3JpdGVyVGVzdCRVc2VsZXNzT3V0cHV0V3JpdGVyIiBzdGFydHVwPSJsYXp5Ii8+CiAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InhzbHQiIGNsYXNzPSJzb2xyLlhTTFRSZXNwb25zZVdyaXRlciIvPgogCi0KICAgPGFkbWluPgogICAgIDxkZWZhdWx0UXVlcnk+c29scjwvZGVmYXVsdFF1ZXJ5PgogICAgIDxnZXR0YWJsZUZpbGVzPnNvbHJjb25maWcueG1sIHNjaGVtYS54bWw8L2dldHRhYmxlRmlsZXM+CiAgIDwvYWRtaW4+CiAKLQotCiA8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL3NvbHItbm8tY29yZS54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9zb2xyLW5vLWNvcmUueG1sCmluZGV4IDNkYmJlNWIuLjQ3NmI1YmMgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC1maWxlcy9zb2xyL3NvbHItbm8tY29yZS54bWwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvc29sci1uby1jb3JlLnhtbApAQCAtMjUsNiArMjUsNyBAQAogICAgIDxzdHIgbmFtZT0iaG9zdENvbnRleHQiPiR7aG9zdENvbnRleHQ6c29scn08L3N0cj4KICAgICA8aW50IG5hbWU9Imhvc3RQb3J0Ij4ke2hvc3RQb3J0Ojg5ODN9PC9pbnQ+CiAgICAgPGludCBuYW1lPSJ6a0NsaWVudFRpbWVvdXQiPiR7c29sci56a2NsaWVudHRpbWVvdXQ6MzAwMDB9PC9pbnQ+CisgICAgPGJvb2wgbmFtZT0iZ2VuZXJpY0NvcmVOb2RlTmFtZXMiPiR7Z2VuZXJpY0NvcmVOb2RlTmFtZXM6dHJ1ZX08L2Jvb2w+CiAgICAgPGludCBuYW1lPSJkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQiPiR7ZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0OjE1MDAwfTwvaW50PgogICAgIDxpbnQgbmFtZT0iZGlzdHJpYlVwZGF0ZVNvVGltZW91dCI+JHtkaXN0cmliVXBkYXRlU29UaW1lb3V0OjEyMDAwMH08L2ludD4KICAgPC9zb2xyY2xvdWQ+CkBAIC0zNSw0ICszNiw0IEBACiAgICAgPGludCBuYW1lPSJjb25uVGltZW91dCI+JHtjb25uVGltZW91dDoxNTAwMH08L2ludD4KICAgPC9zaGFyZEhhbmRsZXJGYWN0b3J5PgogCi08L3NvbHI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9zb2xyPgpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0LWZpbGVzL3NvbHIvc29sci54bWwgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9zb2xyLnhtbAppbmRleCBkOTYyOTE4Li5hMjVlODgwIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9zb2xyLnhtbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3QtZmlsZXMvc29sci9zb2xyLnhtbApAQCAtMzAsNiArMzAsNyBAQAogICAtLT4KICAgPGNvcmVzIGFkbWluUGF0aD0iL2FkbWluL2NvcmVzIiBkZWZhdWx0Q29yZU5hbWU9ImNvbGxlY3Rpb24xIiBob3N0PSIxMjcuMC4wLjEiIGhvc3RQb3J0PSIke2hvc3RQb3J0Ojg5ODN9IiAKICAgICAgICAgIGhvc3RDb250ZXh0PSIke2hvc3RDb250ZXh0OnNvbHJ9IiB6a0NsaWVudFRpbWVvdXQ9IiR7c29sci56a2NsaWVudHRpbWVvdXQ6MzAwMDB9IiBudW1TaGFyZHM9IiR7bnVtU2hhcmRzOjN9IiBzaGFyZVNjaGVtYT0iJHtzaGFyZVNjaGVtYTpmYWxzZX0iIAorICAgICAgICAgZ2VuZXJpY0NvcmVOb2RlTmFtZXM9IiR7Z2VuZXJpY0NvcmVOb2RlTmFtZXM6dHJ1ZX0iCiAgICAgICAgICBkaXN0cmliVXBkYXRlQ29ublRpbWVvdXQ9IiR7ZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0OjE1MDAwfSIgZGlzdHJpYlVwZGF0ZVNvVGltZW91dD0iJHtkaXN0cmliVXBkYXRlU29UaW1lb3V0OjEyMDAwMH0iPgogICAgIDxjb3JlIG5hbWU9ImNvbGxlY3Rpb24xIiBpbnN0YW5jZURpcj0iY29sbGVjdGlvbjEiIHNoYXJkPSIke3NoYXJkOn0iIGNvbGxlY3Rpb249IiR7Y29sbGVjdGlvbjpjb2xsZWN0aW9uMX0iIGNvbmZpZz0iJHtzb2xyY29uZmlnOnNvbHJjb25maWcueG1sfSIgc2NoZW1hPSIke3NjaGVtYTpzY2hlbWEueG1sfSIKICAgICAgICAgICBjb3JlTm9kZU5hbWU9IiR7Y29yZU5vZGVOYW1lOn0iLz4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvU29sclRlc3RDYXNlSjRUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1NvbHJUZXN0Q2FzZUo0VGVzdC5qYXZhCmluZGV4IDYwZjhhYmYuLmQ3MTM1NDcgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvU29sclRlc3RDYXNlSjRUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9Tb2xyVGVzdENhc2VKNFRlc3QuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogICAgIFN0cmluZyB0b3AgPSBTb2xyVGVzdENhc2VKNC5URVNUX0hPTUUoKSArICIvY29sbGVjdGlvbjEvY29uZiI7CiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRvcCwgInNjaGVtYS10aW55LnhtbCIpLCBuZXcgRmlsZShzdWJIb21lLCAic2NoZW1hLXRpbnkueG1sIikpOwogICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0b3AsICJzb2xyY29uZmlnLW1pbmltYWwueG1sIiksIG5ldyBGaWxlKHN1YkhvbWUsICJzb2xyY29uZmlnLW1pbmltYWwueG1sIikpOworICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0b3AsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiksIG5ldyBGaWxlKHN1YkhvbWUsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIikpOwogCiAgICAgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUodG1wU29sckhvbWUsICJjb3JlMCIpLCBuZXcgRmlsZSh0bXBTb2xySG9tZSwgImNvcmUxIikpOwogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3REaXN0cmlidXRlZFNlYXJjaC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9UZXN0RGlzdHJpYnV0ZWRTZWFyY2guamF2YQppbmRleCBhZmFjOTU2Li5iYjhkZTA3IDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3REaXN0cmlidXRlZFNlYXJjaC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdERpc3RyaWJ1dGVkU2VhcmNoLmphdmEKQEAgLTEyMyw2ICsxMjMsNyBAQAogICAgIGhhbmRsZS5jbGVhcigpOwogICAgIGhhbmRsZS5wdXQoIlFUaW1lIiwgU0tJUFZBTCk7CiAgICAgaGFuZGxlLnB1dCgidGltZXN0YW1wIiwgU0tJUFZBTCk7CisgICAgaGFuZGxlLnB1dCgiX3ZlcnNpb25fIiwgU0tJUFZBTCk7IC8vIG5vdCBhIGNsb3VkIHRlc3QsIGJ1dCBtYXkgdXNlIHVwZGF0ZUxvZwogCiAgICAgLy8gcmFuZG9tIHZhbHVlIHNvcnQKICAgICBmb3IgKFN0cmluZyBmIDogZmllbGROYW1lcykgewpAQCAtMzUwLDcgKzM1MSw3IEBACiAgICAgICAgIENoYW9zTW9ua2V5LnN0b3AoZG93bkpldHR5KTsKICAgICAgICAgZG93bkpldHR5cy5hZGQoZG93bkpldHR5KTsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBxdWVyeVBhcnRpYWxSZXN1bHRzKHVwU2hhcmRzLCB1cENsaWVudHMsIAogICAgICAgICAgICJxIiwiKjoqIiwKICAgICAgICAgICAiZmFjZXQiLCJ0cnVlIiwgCkBAIC0zNTgsNyArMzU5LDI3IEBACiAgICAgICAgICAgImZhY2V0LmxpbWl0Iiw1LAogICAgICAgICAgIFNoYXJkUGFyYW1zLlNIQVJEU19JTkZPLCJ0cnVlIiwKICAgICAgICAgICBTaGFyZFBhcmFtcy5TSEFSRFNfVE9MRVJBTlQsInRydWUiKTsKLSAgICAgIAorCisgICAgICBxdWVyeVBhcnRpYWxSZXN1bHRzKHVwU2hhcmRzLCB1cENsaWVudHMsCisgICAgICAgICAgInEiLCAiKjoqIiwKKyAgICAgICAgICAiZmFjZXQiLCAidHJ1ZSIsCisgICAgICAgICAgImZhY2V0LnF1ZXJ5IiwgaTEgKyAiOlsxIFRPIDUwXSIsCisgICAgICAgICAgU2hhcmRQYXJhbXMuU0hBUkRTX0lORk8sICJ0cnVlIiwKKyAgICAgICAgICBTaGFyZFBhcmFtcy5TSEFSRFNfVE9MRVJBTlQsICJ0cnVlIik7CisKKyAgICAgIC8vIHRlc3QgZ3JvdXAgcXVlcnkKKyAgICAgIHF1ZXJ5UGFydGlhbFJlc3VsdHModXBTaGFyZHMsIHVwQ2xpZW50cywKKyAgICAgICAgICAicSIsICIqOioiLAorICAgICAgICAgICJyb3dzIiwgMTAwLAorICAgICAgICAgICJmbCIsICJpZCwiICsgaTEsCisgICAgICAgICAgImdyb3VwIiwgInRydWUiLAorICAgICAgICAgICJncm91cC5xdWVyeSIsIHQxICsgIjpraW5ncyBPUiAiICsgdDEgKyAiOmVnZ3MiLAorICAgICAgICAgICJncm91cC5saW1pdCIsIDEwLAorICAgICAgICAgICJzb3J0IiwgaTEgKyAiIGFzYywgaWQgYXNjIiwKKyAgICAgICAgICBDb21tb25QYXJhbXMuVElNRV9BTExPV0VELCAxLAorICAgICAgICAgIFNoYXJkUGFyYW1zLlNIQVJEU19JTkZPLCAidHJ1ZSIsCisgICAgICAgICAgU2hhcmRQYXJhbXMuU0hBUkRTX1RPTEVSQU5ULCAidHJ1ZSIpOworCiAgICAgICAvLyByZXN0YXJ0IHRoZSBqZXR0eXMKICAgICAgIGZvciAoSmV0dHlTb2xyUnVubmVyIGRvd25KZXR0eSA6IGRvd25KZXR0eXMpIHsKICAgICAgICAgZG93bkpldHR5LnN0YXJ0KCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3RHcm91cGluZ1NlYXJjaC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9UZXN0R3JvdXBpbmdTZWFyY2guamF2YQppbmRleCBkYWIzNzdhLi4yZGYyYzE0IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3RHcm91cGluZ1NlYXJjaC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdEdyb3VwaW5nU2VhcmNoLmphdmEKQEAgLTU0LDYgKzU0LDcgQEAKIAogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVRlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYTEyLnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdEpvaW4uamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdEpvaW4uamF2YQppbmRleCBhZWIxYjE0Li4wM2JlMzJjIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3RKb2luLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9UZXN0Sm9pbi5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsInNjaGVtYTEyLnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdFJhbmRvbUZhY2V0aW5nLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL1Rlc3RSYW5kb21GYWNldGluZy5qYXZhCmluZGV4IDRlMmUwMzYuLjgwMDlkN2IgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvVGVzdFJhbmRvbUZhY2V0aW5nLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9UZXN0UmFuZG9tRmFjZXRpbmcuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCJzY2hlbWExMi54bWwiKTsKICAgfQogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0FsaWFzSW50ZWdyYXRpb25UZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0FsaWFzSW50ZWdyYXRpb25UZXN0LmphdmEKaW5kZXggMmIxOTE5My4uYmMzN2U5ZiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9BbGlhc0ludGVncmF0aW9uVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQWxpYXNJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgY3JlYXRlQWxpYXMoInRlc3RhbGlhcyIsICJjb2xsZWN0aW9uMixjb2xsZWN0aW9uMSIpOwogICAgIAogICAgIC8vIHNlYXJjaCB3aXRoIG5ldyBjbG91ZCBjbGllbnQKLSAgICBDbG91ZFNvbHJTZXJ2ZXIgY2xvdWRTb2xyU2VydmVyID0gbmV3IENsb3VkU29sclNlcnZlcih6a1NlcnZlci5nZXRaa0FkZHJlc3MoKSk7CisgICAgQ2xvdWRTb2xyU2VydmVyIGNsb3VkU29sclNlcnZlciA9IG5ldyBDbG91ZFNvbHJTZXJ2ZXIoemtTZXJ2ZXIuZ2V0WmtBZGRyZXNzKCksIHJhbmRvbSgpLm5leHRCb29sZWFuKCkpOwogICAgIHF1ZXJ5ID0gbmV3IFNvbHJRdWVyeSgiKjoqIik7CiAgICAgcXVlcnkuc2V0KCJjb2xsZWN0aW9uIiwgInRlc3RhbGlhcyIpOwogICAgIHJlcyA9IGNsb3VkU29sclNlcnZlci5xdWVyeShxdWVyeSk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fzc2lnblRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQXNzaWduVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OGY1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fzc2lnblRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbG91ZDsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5DbHVzdGVyU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5Eb2NDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuRG9jUm91dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuSW1wbGljaXREb2NSb3V0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5SZXBsaWNhOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU2xpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa05vZGVQcm9wczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlprU3RhdGVSZWFkZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEFzc2lnblRlc3QgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CisgIHByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFzc2lnblRlc3QuY2xhc3MpOworCisgIAorICBAT3ZlcnJpZGUKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIEBBZnRlcgorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnRlYXJEb3duKCk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RBc3NpZ25Ob2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGNuYW1lID0gImNvbGxlY3Rpb24xIjsKKyAgICAKKyAgICBNYXA8U3RyaW5nLERvY0NvbGxlY3Rpb24+IGNvbGxlY3Rpb25TdGF0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG9jQ29sbGVjdGlvbj4oKTsKKyAgICAKKyAgICBNYXA8U3RyaW5nLFNsaWNlPiBzbGljZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU2xpY2U+KCk7CisgICAgCisgICAgTWFwPFN0cmluZyxSZXBsaWNhPiByZXBsaWNhcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxSZXBsaWNhPigpOworICAgIAorICAgIFprTm9kZVByb3BzIG0gPSBuZXcgWmtOb2RlUHJvcHMoT3ZlcnNlZXIuUVVFVUVfT1BFUkFUSU9OLCAic3RhdGUiLCAKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5TVEFURV9QUk9QLCAiQUNUSVZFIiwgCisgICAgICAgIFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCwgIjAuMC4wLjAiLCAKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCwgImNvcmUxIiwKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5ST0xFU19QUk9QLCBudWxsLAorICAgICAgICBaa1N0YXRlUmVhZGVyLk5PREVfTkFNRV9QUk9QLCAiMF8wXzBfMCIsCisgICAgICAgIFprU3RhdGVSZWFkZXIuU0hBUkRfSURfUFJPUCwgInNoYXJkMSIsCisgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLCBjbmFtZSwKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5OVU1fU0hBUkRTX1BST1AsICIxIiwKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05PREVfTkFNRV9QUk9QLCAiY29yZV9ub2RlMSIpOworICAgIFJlcGxpY2EgcmVwbGljYSA9IG5ldyBSZXBsaWNhKCJjb3JlX25vZGUxIiAsIG0uZ2V0UHJvcGVydGllcygpKTsKKyAgICByZXBsaWNhcy5wdXQoImNvcmVfbm9kZTEiLCByZXBsaWNhKTsKKyAgICAKKyAgICBTbGljZSBzbGljZSA9IG5ldyBTbGljZSgic2xpY2UxIiwgcmVwbGljYXMgLCBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigwKSk7CisgICAgc2xpY2VzLnB1dCgic2xpY2UxIiwgc2xpY2UpOworICAgIAorICAgIERvY1JvdXRlciByb3V0ZXIgPSBuZXcgSW1wbGljaXREb2NSb3V0ZXIoKTsKKyAgICBEb2NDb2xsZWN0aW9uIGRvY0NvbGxlY3Rpb24gPSBuZXcgRG9jQ29sbGVjdGlvbihjbmFtZSwgc2xpY2VzLCBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigwKSwgcm91dGVyKTsKKworICAgIGNvbGxlY3Rpb25TdGF0ZXMucHV0KGNuYW1lLCBkb2NDb2xsZWN0aW9uKTsKKyAgICAKKyAgICBTZXQ8U3RyaW5nPiBsaXZlTm9kZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgQ2x1c3RlclN0YXRlIHN0YXRlID0gbmV3IENsdXN0ZXJTdGF0ZShsaXZlTm9kZXMsIGNvbGxlY3Rpb25TdGF0ZXMpOworICAgIFN0cmluZyBub2RlTmFtZSA9IEFzc2lnbi5hc3NpZ25Ob2RlKCJjb2xsZWN0aW9uMSIsIHN0YXRlKTsKKyAgICAKKyAgICBhc3NlcnRFcXVhbHMoImNvcmVfbm9kZTIiLCBub2RlTmFtZSk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Jhc2ljRGlzdHJpYnV0ZWRaazJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Jhc2ljRGlzdHJpYnV0ZWRaazJUZXN0LmphdmEKaW5kZXggYzgzMWYyZS4uZDk1ODY0NyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9CYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQmFzaWNEaXN0cmlidXRlZFprMlRlc3QuamF2YQpAQCAtNDYsOSArNDYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLkNvbW1vblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Nb2RpZmlhYmxlU29sclBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLlJlcGxpY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VydmxldC5Tb2xyRGlzcGF0Y2hGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuQWJzdHJhY3RTb2xyVGVzdENhc2U7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogCkBAIC0xNzYsOCArMTc0LDggQEAKICAgICAgIGNyZWF0ZUNtZC5zZXRDb3JlTmFtZShPTkVfTk9ERV9DT0xMRUNUSU9OICsgImNvcmUiKTsKICAgICAgIGNyZWF0ZUNtZC5zZXRDb2xsZWN0aW9uKE9ORV9OT0RFX0NPTExFQ1RJT04pOwogICAgICAgY3JlYXRlQ21kLnNldE51bVNoYXJkcygxKTsKLSAgICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICsgT05FX05PREVfQ09MTEVDVElPTik7CisgICAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihnZXREYXRhRGlyKGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICsgT05FX05PREVfQ09MTEVDVElPTikpOwogICAgICAgc2VydmVyLnJlcXVlc3QoY3JlYXRlQ21kKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTMzMSw3ICszMjksNyBAQAogICAgICAgdXJlcS5wcm9jZXNzKGNsb3VkQ2xpZW50KTsKICAgICB9IGNhdGNoKFNvbHJTZXJ2ZXJFeGNlcHRpb24gZSl7CiAgICAgICAvLyB0cnkgYWdhaW4KLSAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgVGhyZWFkLnNsZWVwKDM1MDApOwogICAgICAgdXJlcS5wcm9jZXNzKGNsb3VkQ2xpZW50KTsKICAgICB9CiAgICAgCkBAIC00MTUsMTQgKzQxMywxNiBAQAogICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOwogICAgIHBhcmFtcy5zZXQoInF0IiwgIi9yZXBsaWNhdGlvbiIpOwogICAgIHBhcmFtcy5zZXQoImNvbW1hbmQiLCAiYmFja3VwIik7CisgICAgRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKFRFTVBfRElSLCBCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiLWJhY2t1cGRpci0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgIHBhcmFtcy5zZXQoImxvY2F0aW9uIiwgbG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpOwogCiAgICAgUXVlcnlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUXVlcnlSZXF1ZXN0KHBhcmFtcyk7CiAgICAgTmFtZWRMaXN0PE9iamVjdD4gcmVzdWx0cyA9IGNsaWVudC5yZXF1ZXN0KHJlcXVlc3QgKTsKICAgICAKLSAgICBjaGVja0ZvckJhY2t1cFN1Y2Nlc3MoY2xpZW50KTsKKyAgICBjaGVja0ZvckJhY2t1cFN1Y2Nlc3MoY2xpZW50LCBsb2NhdGlvbik7CiAgICAgCiAgIH0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQmFja3VwU3VjY2VzcyhmaW5hbCBIdHRwU29sclNlcnZlciBjbGllbnQpCisgIHByaXZhdGUgdm9pZCBjaGVja0ZvckJhY2t1cFN1Y2Nlc3MoZmluYWwgSHR0cFNvbHJTZXJ2ZXIgY2xpZW50LCBGaWxlIGxvY2F0aW9uKQogICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgY2xhc3MgQ2hlY2tTdGF0dXMgZXh0ZW5kcyBUaHJlYWQgewogICAgICAgdm9sYXRpbGUgU3RyaW5nIGZhaWwgPSBudWxsOwpAQCAtNDYxLDE2ICs0NjEsNiBAQAogICAgICAgICAKICAgICAgIH07CiAgICAgfQotICAgIDsKLSAgICBTb2xyQ29yZSBjb3JlID0gKChTb2xyRGlzcGF0Y2hGaWx0ZXIpIHNoYXJkVG9KZXR0eS5nZXQoU0hBUkQyKS5nZXQoMCkuamV0dHkKLSAgICAgICAgLmdldERpc3BhdGNoRmlsdGVyKCkuZ2V0RmlsdGVyKCkpLmdldENvcmVzKCkuZ2V0Q29yZSgiY29sbGVjdGlvbjEiKTsKLSAgICBTdHJpbmcgZGRpcjsKLSAgICB0cnkgewotICAgICAgZGRpciA9IGNvcmUuZ2V0RGF0YURpcigpOyAKLSAgICB9IGZpbmFsbHkgewotICAgICAgY29yZS5jbG9zZSgpOwotICAgIH0KLSAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZShkZGlyKTsKICAgICAKICAgICBpbnQgd2FpdENudCA9IDA7CiAgICAgQ2hlY2tTdGF0dXMgY2hlY2tTdGF0dXMgPSBuZXcgQ2hlY2tTdGF0dXMoKTsKQEAgLTQ4MiwxNCArNDcyLDE0IEBACiAgICAgICBpZiAoY2hlY2tTdGF0dXMuc3VjY2VzcykgewogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIFRocmVhZC5zbGVlcCgyMDApOwotICAgICAgaWYgKHdhaXRDbnQgPT0gMjApIHsKKyAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgaWYgKHdhaXRDbnQgPT0gOTApIHsKICAgICAgICAgZmFpbCgiQmFja3VwIHN1Y2Nlc3Mgbm90IGRldGVjdGVkOiIgKyBjaGVja1N0YXR1cy5yZXNwb25zZSk7CiAgICAgICB9CiAgICAgICB3YWl0Q250Kys7CiAgICAgfQogICAgIAotICAgIEZpbGVbXSBmaWxlcyA9IGRhdGFEaXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICBGaWxlW10gZmlsZXMgPSBsb2NhdGlvbi5saXN0RmlsZXMobmV3IEZpbGVuYW1lRmlsdGVyKCkgewogICAgICAgCiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQmFzaWNEaXN0cmlidXRlZFprVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9CYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0LmphdmEKaW5kZXggNzZjNjE3Ni4uZGNiMWRkYiAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9CYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9CYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0LmphdmEKQEAgLTE2MCw3ICsxNjAsMjYgQEAKICAgICAKICAgICB3YWl0Rm9yUmVjb3Zlcmllc1RvRmluaXNoKGZhbHNlKTsKICAgICAKKyAgICBoYW5kbGUuY2xlYXIoKTsKKyAgICBoYW5kbGUucHV0KCJRVGltZSIsIFNLSVBWQUwpOworICAgIGhhbmRsZS5wdXQoInRpbWVzdGFtcCIsIFNLSVBWQUwpOworCiAgICAgZGVsKCIqOioiKTsKKyAgICBxdWVyeUFuZENvbXBhcmVTaGFyZHMocGFyYW1zKCJxIiwgIio6KiIsICJkaXN0cmliIiwgImZhbHNlIiwgInNhbml0eV9jaGVjayIsICJpc19lbXB0eSIpKTsKKworICAgIC8vIGFzayBldmVyeSBpbmRpdmlkdWFsIHJlcGxpY2Egb2YgZXZlcnkgc2hhcmQgdG8gdXBkYXRlK2NvbW1pdCB0aGUgc2FtZSBkb2MgaWQKKyAgICAvLyB3aXRoIGFuIGluY3JlbWVudGluZyBjb3VudGVyIG9uIGVhY2ggdXBkYXRlK2NvbW1pdAorICAgIGludCBmb29faV9jb3VudGVyID0gMDsKKyAgICBmb3IgKFNvbHJTZXJ2ZXIgc2VydmVyIDogY2xpZW50cykgeworICAgICAgZm9vX2lfY291bnRlcisrOworICAgICAgaW5kZXhEb2Moc2VydmVyLCBwYXJhbXMoImNvbW1pdCIsICJ0cnVlIiksIC8vIFNPTFItNDkyMworICAgICAgICAgICAgICAgc2RvYyhpZCwxLCBpMSwxMDAsIHRsb25nLDEwMCwgImZvb19pIiwgZm9vX2lfY291bnRlcikpOworICAgICAgLy8gYWZ0ZXIgZXZlcnkgdXBkYXRlK2NvbW1pdCwgY2hlY2sgYWxsIHRoZSBzaGFyZHMgY29uc2lzdGVuY3kKKyAgICAgIHF1ZXJ5QW5kQ29tcGFyZVNoYXJkcyhwYXJhbXMoInEiLCAiaWQ6MSIsICJkaXN0cmliIiwgImZhbHNlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW5pdHlfY2hlY2siLCAibm9uX2Rpc3RyaWJfaWRfMV9sb29rdXAiKSk7CisgICAgICBxdWVyeUFuZENvbXBhcmVTaGFyZHMocGFyYW1zKCJxIiwgImlkOjEiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbml0eV9jaGVjayIsICJkaXN0cmliX2lkXzFfbG9va3VwIikpOworICAgIH0KIAogICAgIGluZGV4cihpZCwxLCBpMSwgMTAwLCB0bG9uZywgMTAwLHQxLCJub3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiIKICAgICAgICAgICAgICwiZm9vX2YiLCAxLjQxNGYsICJmb29fYiIsICJ0cnVlIiwgImZvb19kIiwgMS40MTRkKTsKQEAgLTE5NSwxMCArMjE0LDEwIEBACiAgICAgfQogCiAgICAgY29tbWl0KCk7Ci0KLSAgICBoYW5kbGUuY2xlYXIoKTsKLSAgICBoYW5kbGUucHV0KCJRVGltZSIsIFNLSVBWQUwpOwotICAgIGhhbmRsZS5wdXQoInRpbWVzdGFtcCIsIFNLSVBWQUwpOworICAgIHF1ZXJ5QW5kQ29tcGFyZVNoYXJkcyhwYXJhbXMoInEiLCAiKjoqIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ydCIsICJpZCBkZXNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXN0cmliIiwgImZhbHNlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FuaXR5X2NoZWNrIiwgImlzX2VtcHR5IikpOwogCiAgICAgLy8gcmFuZG9tIHZhbHVlIHNvcnQKICAgICBmb3IgKFN0cmluZyBmIDogZmllbGROYW1lcykgewpAQCAtNTE5LDExICs1MzgsMTMgQEAKICAgICAgICAgICBDcmVhdGUgY3JlYXRlQ21kID0gbmV3IENyZWF0ZSgpOwogICAgICAgICAgIGNyZWF0ZUNtZC5zZXRDb3JlTmFtZShjb2xsZWN0aW9uICsgZnJlZXplSSk7CiAgICAgICAgICAgY3JlYXRlQ21kLnNldENvbGxlY3Rpb24oY29sbGVjdGlvbik7Ci0gICAgICAgICAgU3RyaW5nIGNvcmUzZGF0YURpciA9IGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgY29sbGVjdGlvbiArICJfM24iICsgZnJlZXplSTsKLSAgICAgICAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihjb3JlM2RhdGFEaXIpOworCiAgICAgICAgICAgY3JlYXRlQ21kLnNldE51bVNoYXJkcyhudW1TaGFyZHMpOwogICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29yZTNkYXRhRGlyID0gZGF0YURpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGNvbGxlY3Rpb24gKyAiXzNuIiArIGZyZWV6ZUk7CisgICAgICAgICAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihnZXREYXRhRGlyKGNvcmUzZGF0YURpcikpOworCiAgICAgICAgICAgICBzZXJ2ZXIucmVxdWVzdChjcmVhdGVDbWQpOwogICAgICAgICAgIH0gY2F0Y2ggKFNvbHJTZXJ2ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CkBAIC01NTUsMTEgKzU3NiwxMyBAQAogICAgIHBhcmFtcy5zZXQoT3ZlcnNlZXJDb2xsZWN0aW9uUHJvY2Vzc29yLk1BWF9TSEFSRFNfUEVSX05PREUsIG1heFNoYXJkc1Blck5vZGUpOwogICAgIGlmIChjcmVhdGVOb2RlU2V0U3RyICE9IG51bGwpIHBhcmFtcy5zZXQoT3ZlcnNlZXJDb2xsZWN0aW9uUHJvY2Vzc29yLkNSRUFURV9OT0RFX1NFVCwgY3JlYXRlTm9kZVNldFN0cik7CiAKLSAgICBpbnQgY2xpZW50SW5kZXggPSByYW5kb20oKS5uZXh0SW50KDIpOworICAgIGludCBjbGllbnRJbmRleCA9IGNsaWVudHMuc2l6ZSgpID4gMSA/IHJhbmRvbSgpLm5leHRJbnQoMikgOiAwOwogICAgIExpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKICAgICBsaXN0LmFkZChudW1TaGFyZHMpOwogICAgIGxpc3QuYWRkKG51bVJlcGxpY2FzKTsKLSAgICBjb2xsZWN0aW9uSW5mb3MucHV0KGNvbGxlY3Rpb25OYW1lLCBsaXN0KTsKKyAgICBpZiAoY29sbGVjdGlvbkluZm9zICE9IG51bGwpIHsKKyAgICAgIGNvbGxlY3Rpb25JbmZvcy5wdXQoY29sbGVjdGlvbk5hbWUsIGxpc3QpOworICAgIH0KICAgICBwYXJhbXMuc2V0KCJuYW1lIiwgY29sbGVjdGlvbk5hbWUpOwogICAgIFNvbHJSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUXVlcnlSZXF1ZXN0KHBhcmFtcyk7CiAgICAgcmVxdWVzdC5zZXRQYXRoKCIvYWRtaW4vY29sbGVjdGlvbnMiKTsKQEAgLTkxMyw4ICs5MzYsOCBAQAogICAgICAgICAgIGlmIChzaGFyZElkID09IG51bGwpIHsKICAgICAgICAgICAgIGNyZWF0ZUNtZC5zZXROdW1TaGFyZHMoMik7CiAgICAgICAgICAgfQotICAgICAgICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICArIGNvbGxlY3Rpb24gKyBudW0pOworICAgICAgICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGdldERhdGFEaXIoZGF0YURpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICsgY29sbGVjdGlvbiArIG51bSkpOwogICAgICAgICAgIGlmIChzaGFyZElkICE9IG51bGwpIHsKICAgICAgICAgICAgIGNyZWF0ZUNtZC5zZXRTaGFyZElkKHNoYXJkSWQpOwogICAgICAgICAgIH0KQEAgLTEwMzcsOCArMTA2MCw5IEBACiAgICAgICAgICAgICBzZXJ2ZXIuc2V0U29UaW1lb3V0KDMwMDAwKTsKICAgICAgICAgICAgIENyZWF0ZSBjcmVhdGVDbWQgPSBuZXcgQ3JlYXRlKCk7CiAgICAgICAgICAgICBjcmVhdGVDbWQuc2V0Q29yZU5hbWUoY29sbGVjdGlvbik7Ci0gICAgICAgICAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLSAgICAgICAgICAgICAgICArIGNvbGxlY3Rpb24gKyBmcm96ZVVuaXF1ZSk7CisgICAgICAgICAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihnZXREYXRhRGlyKGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgICsgY29sbGVjdGlvbiArIGZyb3plVW5pcXVlKSk7CisKICAgICAgICAgICAgIHNlcnZlci5yZXF1ZXN0KGNyZWF0ZUNtZCk7CiAKICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMTA3OSw3ICsxMTAzLDcgQEAKICAgICBpZiAoY29tbW9uZENsb3VkU29sclNlcnZlciA9PSBudWxsKSB7CiAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewogICAgICAgICB0cnkgewotICAgICAgICAgIGNvbW1vbmRDbG91ZFNvbHJTZXJ2ZXIgPSBuZXcgQ2xvdWRTb2xyU2VydmVyKHprU2VydmVyLmdldFprQWRkcmVzcygpKTsKKyAgICAgICAgICBjb21tb25kQ2xvdWRTb2xyU2VydmVyID0gbmV3IENsb3VkU29sclNlcnZlcih6a1NlcnZlci5nZXRaa0FkZHJlc3MoKSwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7CiAgICAgICAgICAgY29tbW9uZENsb3VkU29sclNlcnZlci5zZXREZWZhdWx0Q29sbGVjdGlvbihERUZBVUxUX0NPTExFQ1RJT04pOwogICAgICAgICAgIGNvbW1vbmRDbG91ZFNvbHJTZXJ2ZXIuZ2V0TGJTZXJ2ZXIoKS5zZXRDb25uZWN0aW9uVGltZW91dCgxNTAwMCk7CiAgICAgICAgICAgY29tbW9uZENsb3VkU29sclNlcnZlci5nZXRMYlNlcnZlcigpLnNldFNvVGltZW91dCgzMDAwMCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0NoYW9zTW9ua2V5Tm90aGluZ0lzU2FmZVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlOb3RoaW5nSXNTYWZlVGVzdC5qYXZhCmluZGV4IGZiYjRmZjguLjg1NThiYzUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlOb3RoaW5nSXNTYWZlVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlOb3RoaW5nSXNTYWZlVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTbG93Ci1AQmFkQXBwbGUKIHB1YmxpYyBjbGFzcyBDaGFvc01vbmtleU5vdGhpbmdJc1NhZmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RGdWxsRGlzdHJpYlprVGVzdEJhc2UgewogICBwdWJsaWMgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGFvc01vbmtleU5vdGhpbmdJc1NhZmVUZXN0LmNsYXNzKTsKICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0NoYW9zTW9ua2V5U2hhcmRTcGxpdFRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlTaGFyZFNwbGl0VGVzdC5qYXZhCmluZGV4IDFkYjZkZGQuLmVkMzQ1MDAgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlTaGFyZFNwbGl0VGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2hhb3NNb25rZXlTaGFyZFNwbGl0VGVzdC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS56b29rZWVwZXIuS2VlcGVyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtNDEsNiArNDIsNyBAQAogICogVGVzdCBzcGxpdCBwaGFzZSB0aGF0IG9jY3VycyB3aGVuIGEgQ29sbGVjdGlvbiBBUEkgc3BsaXQgY2FsbCBpcyBtYWRlLgogICovCiBAU2xvdworQElnbm9yZSgiU09MUi00OTQ0IikKIHB1YmxpYyBjbGFzcyBDaGFvc01vbmtleVNoYXJkU3BsaXRUZXN0IGV4dGVuZHMgU2hhcmRTcGxpdFRlc3QgewogCiAgIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVCA9IDEwMDAwOwpAQCAtNzgsNyArODAsNyBAQAogICAgIHRyeSB7CiAgICAgICBkZWwoIio6KiIpOwogICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IDEwMDsgaWQrKykgewotICAgICAgICBpbmRleEFuZFVwZGF0ZUNvdW50KHJvdXRlciwgcmFuZ2VzLCBkb2NDb3VudHMsIFN0cmluZy52YWx1ZU9mKGlkKSk7CisgICAgICAgIGluZGV4QW5kVXBkYXRlQ291bnQocm91dGVyLCByYW5nZXMsIGRvY0NvdW50cywgU3RyaW5nLnZhbHVlT2YoaWQpLCBpZCk7CiAgICAgICB9CiAgICAgICBjb21taXQoKTsKIApAQCAtODgsNyArOTAsNyBAQAogICAgICAgICAgIGludCBtYXggPSBhdExlYXN0KDQwMSk7CiAgICAgICAgICAgZm9yIChpbnQgaWQgPSAxMDE7IGlkIDwgbWF4OyBpZCsrKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBpbmRleEFuZFVwZGF0ZUNvdW50KHJvdXRlciwgcmFuZ2VzLCBkb2NDb3VudHMsIFN0cmluZy52YWx1ZU9mKGlkKSk7CisgICAgICAgICAgICAgIGluZGV4QW5kVXBkYXRlQ291bnQocm91dGVyLCByYW5nZXMsIGRvY0NvdW50cywgU3RyaW5nLnZhbHVlT2YoaWQpLCBpZCk7CiAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChhdExlYXN0KDI1KSk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgZG9jIiwgZSk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0NsdXN0ZXJTdGF0ZVVwZGF0ZVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2x1c3RlclN0YXRlVXBkYXRlVGVzdC5qYXZhCmluZGV4IDAyNTMwYTEuLjdiYzA3ODkgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2x1c3RlclN0YXRlVXBkYXRlVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQ2x1c3RlclN0YXRlVXBkYXRlVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuQ2x1c3RlclN0YXRlOwpAQCAtMzEsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuWmtOb2RlUHJvcHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa1N0YXRlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvcmVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5DcmVhdGVNb2RlOwpAQCAtNDEsNiArMzUsMTEgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogQFNsb3cKIHB1YmxpYyBjbGFzcyBDbHVzdGVyU3RhdGVVcGRhdGVUZXN0IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgIHsKICAgcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQpAQCAtNjUsMTcgKzY0LDE3IEBACiAgIHByaXZhdGUgRmlsZSBkYXRhRGlyMzsKICAgCiAgIHByaXZhdGUgRmlsZSBkYXRhRGlyNDsKLQotICBwcml2YXRlIEluaXRpYWxpemVyIGluaXQyOwogICAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHJjbG91ZC5za2lwLmF1dG9yZWNvdmVyeSIsICJ0cnVlIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJnZW5lcmljQ29yZU5vZGVOYW1lcyIsICJmYWxzZSIpOwogICB9CiAgIAogICBAQWZ0ZXJDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHJjbG91ZC5za2lwLmF1dG9yZWNvdmVyeSIpOworICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJnZW5lcmljQ29yZU5vZGVOYW1lcyIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xMTEsMjIgKzExMCwyMSBAQAogICAgIAogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5zb2xyLmhvbWUiLCBURVNUX0hPTUUoKSk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJob3N0UG9ydCIsICIxNjYxIik7Ci0gICAgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0MSA9IG5ldyBDb3JlQ29udGFpbmVyLkluaXRpYWxpemVyKCk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLmRhdGEuZGlyIiwgQ2x1c3RlclN0YXRlVXBkYXRlVGVzdC50aGlzLmRhdGFEaXIxLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICBjb250YWluZXIxID0gaW5pdDEuaW5pdGlhbGl6ZSgpOworICAgIGNvbnRhaW5lcjEgPSBuZXcgQ29yZUNvbnRhaW5lcigpOworICAgIGNvbnRhaW5lcjEubG9hZCgpOwogICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJob3N0UG9ydCIpOwogICAgIAogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaG9zdFBvcnQiLCAiMTY2MiIpOwotICAgIGluaXQyID0gbmV3IENvcmVDb250YWluZXIuSW5pdGlhbGl6ZXIoKTsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuZGF0YS5kaXIiLCBDbHVzdGVyU3RhdGVVcGRhdGVUZXN0LnRoaXMuZGF0YURpcjIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGNvbnRhaW5lcjIgPSBpbml0Mi5pbml0aWFsaXplKCk7CisgICAgY29udGFpbmVyMiA9IG5ldyBDb3JlQ29udGFpbmVyKCk7CisgICAgY29udGFpbmVyMi5sb2FkKCk7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImhvc3RQb3J0Iik7CiAgICAgCiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJob3N0UG9ydCIsICIxNjYzIik7Ci0gICAgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0MyA9IG5ldyBDb3JlQ29udGFpbmVyLkluaXRpYWxpemVyKCk7Ci0gICAKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuZGF0YS5kaXIiLCBDbHVzdGVyU3RhdGVVcGRhdGVUZXN0LnRoaXMuZGF0YURpcjMuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGNvbnRhaW5lcjMgPSBpbml0My5pbml0aWFsaXplKCk7CisgICAgY29udGFpbmVyMyA9IG5ldyBDb3JlQ29udGFpbmVyKCk7CisgICAgY29udGFpbmVyMy5sb2FkKCk7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImhvc3RQb3J0Iik7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIuc29sci5ob21lIik7CiAgICAgCkBAIC0xNTcsNiArMTU1LDEwIEBACiAgICAgCiAgICAgZGNvcmUuc2V0RGF0YURpcihkYXRhRGlyNC5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKKyAgICBpZiAoY29udGFpbmVyMS5nZXRaa0NvbnRyb2xsZXIoKSAhPSBudWxsKSB7CisgICAgICBjb250YWluZXIxLnByZVJlZ2lzdGVySW5aayhkY29yZSk7CisgICAgfQorICAgIAogICAgIFNvbHJDb3JlIGNvcmUgPSBjb250YWluZXIxLmNyZWF0ZShkY29yZSk7CiAgICAgCiAgICAgY29udGFpbmVyMS5yZWdpc3Rlcihjb3JlLCBmYWxzZSk7CkBAIC0yMjAsNyArMjIyLDExIEBACiAgICAgICAgIC5kaXNjb25uZWN0KCk7CiAgICAgY29udGFpbmVyMi5zaHV0ZG93bigpOwogCi0gICAgY29udGFpbmVyMiA9IGluaXQyLmluaXRpYWxpemUoKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImhvc3RQb3J0IiwgIjE2NjIiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuZGF0YS5kaXIiLCBDbHVzdGVyU3RhdGVVcGRhdGVUZXN0LnRoaXMuZGF0YURpcjIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIGNvbnRhaW5lcjIgPSBuZXcgQ29yZUNvbnRhaW5lcigpOworICAgIGNvbnRhaW5lcjIubG9hZCgpOworICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJob3N0UG9ydCIpOwogICAgIAogICAgIC8vIHBhdXNlIGZvciB3YXRjaCB0byB0cmlnZ2VyCiAgICAgZm9yKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0xlYWRlckVsZWN0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0xlYWRlckVsZWN0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEKaW5kZXggNDY1OGIxZC4uYWNhYTBjNyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9MZWFkZXJFbGVjdGlvbkludGVncmF0aW9uVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvTGVhZGVyRWxlY3Rpb25JbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMTcsNiArMTcsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU29sclprQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuWmtOb2RlUHJvcHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa1N0YXRlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvcmVDb250YWluZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTI3LDIyICs0MSw2IEBACiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlNvbHJaa0NsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlprTm9kZVByb3BzOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuWmtTdGF0ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvcmVDb250YWluZXIuSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCiBAU2xvdwogcHVibGljIGNsYXNzIExlYWRlckVsZWN0aW9uSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogICBwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5CkBAIC0xNDAsNyArMTM4LDYgQEAKICAgICAKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImhvc3RQb3J0IiwgSW50ZWdlci50b1N0cmluZyhwb3J0KSk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzaGFyZCIsIHNoYXJkKTsKLSAgICBJbml0aWFsaXplciBpbml0ID0gbmV3IENvcmVDb250YWluZXIuSW5pdGlhbGl6ZXIoKTsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuZGF0YS5kaXIiLCBkYXRhLmdldEFic29sdXRlUGF0aCgpKTsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuc29sci5ob21lIiwgVEVTVF9IT01FKCkpOwogICAgIFNldDxJbnRlZ2VyPiBwb3J0cyA9IHNoYXJkUG9ydHMuZ2V0KHNoYXJkKTsKQEAgLTE0OSw3ICsxNDYsOCBAQAogICAgICAgc2hhcmRQb3J0cy5wdXQoc2hhcmQsIHBvcnRzKTsKICAgICB9CiAgICAgcG9ydHMuYWRkKHBvcnQpOwotICAgIENvcmVDb250YWluZXIgY29udGFpbmVyID0gaW5pdC5pbml0aWFsaXplKCk7CisgICAgQ29yZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQ29yZUNvbnRhaW5lcigpOworICAgIGNvbnRhaW5lci5sb2FkKCk7CiAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbmVyICIgKyBwb3J0ICsgIiBoYXMgbm8gY29yZXMhIiwgY29udGFpbmVyLmdldENvcmVzKCkKICAgICAgICAgLnNpemUoKSA+IDApOwogICAgIGNvbnRhaW5lck1hcC5wdXQocG9ydCwgY29udGFpbmVyKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL092ZXJzZWVyVGVzdC5qYXZhCmluZGV4IDdjYzU1MGMuLmU3MjJmNTIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvT3ZlcnNlZXJUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9PdmVyc2VlclRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLkNsdXN0ZXJTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLkRvY0NvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5SZXBsaWNhOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU2xpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5Tb2xyWmtDbGllbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa05vZGVQcm9wczsKQEAgLTk4LDcgKzk5LDcgQEAKICAgICAgIHprQ2xpZW50LmNsb3NlKCk7CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcHVibGlzaFN0YXRlKFN0cmluZyBjb3JlTmFtZSwgU3RyaW5nIHN0YXRlTmFtZSwgaW50IG51bVNoYXJkcykKKyAgICBwdWJsaWMgU3RyaW5nIHB1Ymxpc2hTdGF0ZShTdHJpbmcgY29yZU5hbWUsIFN0cmluZyBjb3JlTm9kZU5hbWUsIFN0cmluZyBzdGF0ZU5hbWUsIGludCBudW1TaGFyZHMpCiAgICAgICAgIHRocm93cyBLZWVwZXJFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICBpZiAoc3RhdGVOYW1lID09IG51bGwpIHsKICAgICAgICAgRWxlY3Rpb25Db250ZXh0IGVjID0gZWxlY3Rpb25Db250ZXh0LnJlbW92ZShjb3JlTmFtZSk7CkBAIC0xMDgsNiArMTA5LDcgQEAKICAgICAgICAgWmtOb2RlUHJvcHMgbSA9IG5ldyBaa05vZGVQcm9wcyhPdmVyc2Vlci5RVUVVRV9PUEVSQVRJT04sICJkZWxldGVjb3JlIiwKICAgICAgICAgICAgIFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1AsIG5vZGVOYW1lLAogICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCwgY29yZU5hbWUsCisgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLkNPUkVfTk9ERV9OQU1FX1BST1AsIGNvcmVOb2RlTmFtZSwKICAgICAgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLCBjb2xsZWN0aW9uKTsKICAgICAgICAgICAgIERpc3RyaWJ1dGVkUXVldWUgcSA9IE92ZXJzZWVyLmdldEluUXVldWUoemtDbGllbnQpOwogICAgICAgICAgICAgcS5vZmZlcihaa1N0YXRlUmVhZGVyLnRvSlNPTihtKSk7CkBAIC0xMTcsNiArMTE5LDcgQEAKICAgICAgICAgWmtTdGF0ZVJlYWRlci5TVEFURV9QUk9QLCBzdGF0ZU5hbWUsCiAgICAgICAgIFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1AsIG5vZGVOYW1lLAogICAgICAgICBaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QLCBjb3JlTmFtZSwKKyAgICAgICAgWmtTdGF0ZVJlYWRlci5DT1JFX05PREVfTkFNRV9QUk9QLCBjb3JlTm9kZU5hbWUsCiAgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLCBjb2xsZWN0aW9uLAogICAgICAgICBaa1N0YXRlUmVhZGVyLk5VTV9TSEFSRFNfUFJPUCwgSW50ZWdlci50b1N0cmluZyhudW1TaGFyZHMpLAogICAgICAgICBaa1N0YXRlUmVhZGVyLkJBU0VfVVJMX1BST1AsICJodHRwOi8vIiArIG5vZGVOYW1lCkBAIC0xMjYsNyArMTI5LDggQEAKICAgICAgIH0KICAgICAgIAogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjA7IGkrKykgewotICAgICAgICBTdHJpbmcgc2hhcmRJZCA9IGdldFNoYXJkSWQoY29yZU5hbWUpOworICAgICAgICBTdHJpbmcgc2hhcmRJZCA9IGdldFNoYXJkSWQoImh0dHA6Ly8iICsgbm9kZU5hbWUKKyAgICAgICAgICAgICsgIi9zb2xyLyIsIGNvcmVOYW1lKTsKICAgICAgICAgaWYgKHNoYXJkSWQgIT0gbnVsbCkgewogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB6a0NsaWVudC5tYWtlUGF0aCgiL2NvbGxlY3Rpb25zLyIgKyBjb2xsZWN0aW9uICsgIi9sZWFkZXJfZWxlY3QvIgpAQCAtMTM2LDcgKzE0MCw4IEBACiAgICAgICAgICAgICAgICJodHRwOi8vIiArIG5vZGVOYW1lICsgIi9zb2xyLyIsIFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1AsCiAgICAgICAgICAgICAgIG5vZGVOYW1lLCBaa1N0YXRlUmVhZGVyLkNPUkVfTkFNRV9QUk9QLCBjb3JlTmFtZSwKICAgICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5TSEFSRF9JRF9QUk9QLCBzaGFyZElkLAotICAgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLkNPTExFQ1RJT05fUFJPUCwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgIFprU3RhdGVSZWFkZXIuQ09MTEVDVElPTl9QUk9QLCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICBaa1N0YXRlUmVhZGVyLkNPUkVfTk9ERV9OQU1FX1BST1AsIGNvcmVOb2RlTmFtZSk7CiAgICAgICAgICAgU2hhcmRMZWFkZXJFbGVjdGlvbkNvbnRleHRCYXNlIGN0eCA9IG5ldyBTaGFyZExlYWRlckVsZWN0aW9uQ29udGV4dEJhc2UoCiAgICAgICAgICAgICAgIGVsZWN0b3IsIHNoYXJkSWQsIGNvbGxlY3Rpb24sIG5vZGVOYW1lICsgIl8iICsgY29yZU5hbWUsIHByb3BzLAogICAgICAgICAgICAgICB6a1N0YXRlUmVhZGVyKTsKQEAgLTE0OCwxMyArMTUzLDE4IEBACiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2hhcmRJZChmaW5hbCBTdHJpbmcgY29yZU5hbWUpIHsKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTaGFyZElkKGZpbmFsIFN0cmluZyBiYXNlVXJsLCBmaW5hbCBTdHJpbmcgY29yZU5hbWUpIHsKICAgICAgIE1hcDxTdHJpbmcsU2xpY2U+IHNsaWNlcyA9IHprU3RhdGVSZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0U2xpY2VzTWFwKAogICAgICAgICAgIGNvbGxlY3Rpb24pOwogICAgICAgaWYgKHNsaWNlcyAhPSBudWxsKSB7CiAgICAgICAgIGZvciAoU2xpY2Ugc2xpY2UgOiBzbGljZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICBpZiAoc2xpY2UuZ2V0UmVwbGljYXNNYXAoKS5jb250YWluc0tleShub2RlTmFtZSArICJfIiArIGNvcmVOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHNsaWNlLmdldE5hbWUoKTsKKyAgICAgICAgICBmb3IgKFJlcGxpY2EgcmVwbGljYSA6IHNsaWNlLmdldFJlcGxpY2FzKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGZvciByZWFsbHkgbGFyZ2UgY2x1c3RlcnMsIHdlIGNvdWxkICdpbmRleCcgb24gdGhpcworICAgICAgICAgICAgU3RyaW5nIHJiYXNlVXJsID0gcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5CQVNFX1VSTF9QUk9QKTsKKyAgICAgICAgICAgIFN0cmluZyByY29yZSA9IHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQ09SRV9OQU1FX1BST1ApOworICAgICAgICAgICAgaWYgKGJhc2VVcmwuZXF1YWxzKHJiYXNlVXJsKSAmJiBjb3JlTmFtZS5lcXVhbHMocmNvcmUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBzbGljZS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0yMDIsNyArMjEyLDcgQEAKICAgICAgIGZpbmFsIGludCBudW1TaGFyZHM9NjsKICAgICAgIAogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaGFyZHM7IGkrKykgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJzaGFyZCBnb3Qgbm8gaWQ/IiwgemtDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZSIgKyAoaSsxKSwgWmtTdGF0ZVJlYWRlci5BQ1RJVkUsIDMpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgic2hhcmQgZ290IG5vIGlkPyIsIHprQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUiICsgKGkrMSksICJub2RlIiArIChpKzEpLCBaa1N0YXRlUmVhZGVyLkFDVElWRSwgMykpOwogICAgICAgfQogCiAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVhZGVyLmdldENsdXN0ZXJTdGF0ZSgpLmdldFNsaWNlKCJjb2xsZWN0aW9uMSIsICJzaGFyZDEiKS5nZXRSZXBsaWNhc01hcCgpLnNpemUoKSk7CkBAIC0yNzcsNyArMjg3LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3JlTmFtZSA9ICJjb3JlIiArIHNsb3Q7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGlkc1tzbG90XT1jb250cm9sbGVyc1tzbG90ICUgbm9kZUNvdW50XS5wdWJsaXNoU3RhdGUoY29yZU5hbWUsIFprU3RhdGVSZWFkZXIuQUNUSVZFLCBzbGljZUNvdW50KTsKKyAgICAgICAgICAgICAgaWRzW3Nsb3RdPWNvbnRyb2xsZXJzW3Nsb3QgJSBub2RlQ291bnRdLnB1Ymxpc2hTdGF0ZShjb3JlTmFtZSwgIm5vZGUiICsgc2xvdCwgWmtTdGF0ZVJlYWRlci5BQ1RJVkUsIHNsaWNlQ291bnQpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgZmFpbCgicmVnaXN0ZXIgdGhyZXcgZXhjZXB0aW9uOiIgKyBlLmdldENsYXNzKCkpOwpAQCAtNDQwLDcgKzQ1MCw3IEBACiAKICAgICAgIGFzc2VydEVxdWFscyhyZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkudG9TdHJpbmcoKSwgWmtTdGF0ZVJlYWRlci5SRUNPVkVSSU5HLAogICAgICAgICAgIHJlYWRlci5nZXRDbHVzdGVyU3RhdGUoKS5nZXRTbGljZSgiY29sbGVjdGlvbjEiLCAic2hhcmQxIikuZ2V0UmVwbGljYXNNYXAoKQotICAgICAgICAgICAgICAuZ2V0KCJub2RlMV9jb3JlMSIpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApKTsKKyAgICAgICAgICAgICAgLmdldCgiY29yZV9ub2RlMSIpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApKTsKIAogICAgICAgLy9wdWJsaXNoIG5vZGUgc3RhdGUgKGFjdGl2ZSkKICAgICAgIG0gPSBuZXcgWmtOb2RlUHJvcHMoT3ZlcnNlZXIuUVVFVUVfT1BFUkFUSU9OLCAic3RhdGUiLApAQCAtNDcxLDcgKzQ4MSw3IEBACiAgICAgd2hpbGUobWF4SXRlcmF0aW9ucy0tPjApIHsKICAgICAgIFNsaWNlIHNsaWNlID0gcmVhZGVyLmdldENsdXN0ZXJTdGF0ZSgpLmdldFNsaWNlKCJjb2xsZWN0aW9uMSIsICJzaGFyZDEiKTsKICAgICAgIGlmKHNsaWNlIT1udWxsKSB7Ci0gICAgICAgIGNvcmVTdGF0ZSA9IHNsaWNlLmdldFJlcGxpY2FzTWFwKCkuZ2V0KCJub2RlMV9jb3JlMSIpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApOworICAgICAgICBjb3JlU3RhdGUgPSBzbGljZS5nZXRSZXBsaWNhc01hcCgpLmdldCgiY29yZV9ub2RlMSIpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApOwogICAgICAgICBpZihjb3JlU3RhdGUuZXF1YWxzKGV4cGVjdGVkU3RhdGUpKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC01MjMsMTQgKzUzMywxNCBAQAogICAgICAgb3ZlcnNlZXJDbGllbnQgPSBlbGVjdE5ld092ZXJzZWVyKHNlcnZlci5nZXRaa0FkZHJlc3MoKSk7CiAKICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgIG1vY2tDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZTEiLCBaa1N0YXRlUmVhZGVyLlJFQ09WRVJJTkcsIDEpOworICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJjb3JlX25vZGUxIiwgWmtTdGF0ZVJlYWRlci5SRUNPVkVSSU5HLCAxKTsKIAogICAgICAgd2FpdEZvckNvbGxlY3Rpb25zKHJlYWRlciwgImNvbGxlY3Rpb24xIik7CiAgICAgICB2ZXJpZnlTdGF0dXMocmVhZGVyLCBaa1N0YXRlUmVhZGVyLlJFQ09WRVJJTkcpOwogCiAgICAgICBpbnQgdmVyc2lvbiA9IGdldENsdXN0ZXJTdGF0ZVZlcnNpb24oY29udHJvbGxlckNsaWVudCk7CiAgICAgICAKLSAgICAgIG1vY2tDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZTEiLCBaa1N0YXRlUmVhZGVyLkFDVElWRSwgMSk7CisgICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgImNvcmVfbm9kZTEiLCBaa1N0YXRlUmVhZGVyLkFDVElWRSwgMSk7CiAgICAgICAKICAgICAgIHdoaWxlKHZlcnNpb24gPT0gZ2V0Q2x1c3RlclN0YXRlVmVyc2lvbihjb250cm9sbGVyQ2xpZW50KSk7CiAKQEAgLTUzOSw3ICs1NDksNyBAQAogICAgICAgb3ZlcnNlZXJDbGllbnQuY2xvc2UoKTsKICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsgLy93YWl0IGZvciBvdmVyc2VlciB0byBnZXQga2lsbGVkCiAKLSAgICAgIG1vY2tDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZTEiLCBaa1N0YXRlUmVhZGVyLlJFQ09WRVJJTkcsIDEpOworICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICAiY29yZV9ub2RlMSIsIFprU3RhdGVSZWFkZXIuUkVDT1ZFUklORywgMSk7CiAgICAgICB2ZXJzaW9uID0gZ2V0Q2x1c3RlclN0YXRlVmVyc2lvbihjb250cm9sbGVyQ2xpZW50KTsKICAgICAgIAogICAgICAgb3ZlcnNlZXJDbGllbnQgPSBlbGVjdE5ld092ZXJzZWVyKHNlcnZlci5nZXRaa0FkZHJlc3MoKSk7CkBAIC01NTMsNyArNTYzLDcgQEAKICAgICAgIGFzc2VydEVxdWFscygiU2hhcmQgY291bnQgZG9lcyBub3QgbWF0Y2giLCAxLCByZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkKICAgICAgICAgICAuZ2V0U2xpY2UoImNvbGxlY3Rpb24xIiwgInNoYXJkMSIpLmdldFJlcGxpY2FzTWFwKCkuc2l6ZSgpKTsKICAgICAgIHZlcnNpb24gPSBnZXRDbHVzdGVyU3RhdGVWZXJzaW9uKGNvbnRyb2xsZXJDbGllbnQpOwotICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsIG51bGwsMSk7CisgICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgImNvcmVfbm9kZTEiLCBudWxsLDEpOwogICAgICAgd2hpbGUodmVyc2lvbiA9PSBnZXRDbHVzdGVyU3RhdGVWZXJzaW9uKGNvbnRyb2xsZXJDbGllbnQpKTsKICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwogICAgICAgYXNzZXJ0RmFsc2UoImNvbGxlY3Rpb24xIHNob3VsZCBiZSBnb25lIGFmdGVyIHB1Ymxpc2hpbmcgdGhlIG51bGwgc3RhdGUiLCByZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkuZ2V0Q29sbGVjdGlvbnMoKS5jb250YWlucygiY29sbGVjdGlvbjEiKSk7CkBAIC02NDEsMTYgKzY1MSwxNiBAQAogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdExlYXN0KDQpOyBpKyspIHsKICAgICAgICAga2lsbENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7IC8vZm9yIGVhY2ggcm91bmQgYWxsb3cgMSBraWxsCiAgICAgICAgIG1vY2tDb250cm9sbGVyID0gbmV3IE1vY2taS0NvbnRyb2xsZXIoc2VydmVyLmdldFprQWRkcmVzcygpLCAibm9kZTEiLCAiY29sbGVjdGlvbjEiKTsKLSAgICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJzdGF0ZTEiLDEpOworICAgICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgIm5vZGUxIiwgInN0YXRlMSIsMSk7CiAgICAgICAgIGlmKG1vY2tDb250cm9sbGVyMiE9bnVsbCkgewogICAgICAgICAgIG1vY2tDb250cm9sbGVyMi5jbG9zZSgpOwogICAgICAgICAgIG1vY2tDb250cm9sbGVyMiA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJzdGF0ZTIiLDEpOworICAgICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgIm5vZGUxIiwic3RhdGUyIiwxKTsKICAgICAgICAgbW9ja0NvbnRyb2xsZXIyID0gbmV3IE1vY2taS0NvbnRyb2xsZXIoc2VydmVyLmdldFprQWRkcmVzcygpLCAibm9kZTIiLCAiY29sbGVjdGlvbjEiKTsKLSAgICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJzdGF0ZTEiLDEpOworICAgICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgIm5vZGUxIiwgInN0YXRlMSIsMSk7CiAgICAgICAgIHZlcmlmeVNoYXJkTGVhZGVyKHJlYWRlciwgImNvbGxlY3Rpb24xIiwgInNoYXJkMSIsICJjb3JlMSIpOwotICAgICAgICBtb2NrQ29udHJvbGxlcjIucHVibGlzaFN0YXRlKCJjb3JlNCIsICJzdGF0ZTIiICwxKTsKKyAgICAgICAgbW9ja0NvbnRyb2xsZXIyLnB1Ymxpc2hTdGF0ZSgiY29yZTQiLCAibm9kZTIiLCAic3RhdGUyIiAsMSk7CiAgICAgICAgIG1vY2tDb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgIG1vY2tDb250cm9sbGVyID0gbnVsbDsKICAgICAgICAgdmVyaWZ5U2hhcmRMZWFkZXIocmVhZGVyLCAiY29sbGVjdGlvbjEiLCAic2hhcmQxIiwgImNvcmU0Iik7CkBAIC02OTcsNyArNzA3LDcgQEAKICAgICAgIAogICAgICAgb3ZlcnNlZXJDbGllbnQgPSBlbGVjdE5ld092ZXJzZWVyKHNlcnZlci5nZXRaa0FkZHJlc3MoKSk7CiAKLSAgICAgIG1vY2tDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZTEiLCBaa1N0YXRlUmVhZGVyLlJFQ09WRVJJTkcsIDEpOworICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJjb3JlX25vZGUxIiwgWmtTdGF0ZVJlYWRlci5SRUNPVkVSSU5HLCAxKTsKIAogICAgICAgd2FpdEZvckNvbGxlY3Rpb25zKHJlYWRlciwgImNvbGxlY3Rpb24xIik7CiAgICAgICAKQEAgLTcwOCw3ICs3MTgsNyBAQAogICAgICAgaW50IHZlcnNpb24gPSBnZXRDbHVzdGVyU3RhdGVWZXJzaW9uKGNvbnRyb2xsZXJDbGllbnQpOwogICAgICAgCiAgICAgICBtb2NrQ29udHJvbGxlciA9IG5ldyBNb2NrWktDb250cm9sbGVyKHNlcnZlci5nZXRaa0FkZHJlc3MoKSwgIm5vZGUxIiwgImNvbGxlY3Rpb24xIik7Ci0gICAgICBtb2NrQ29udHJvbGxlci5wdWJsaXNoU3RhdGUoImNvcmUxIiwgWmtTdGF0ZVJlYWRlci5SRUNPVkVSSU5HLCAxKTsKKyAgICAgIG1vY2tDb250cm9sbGVyLnB1Ymxpc2hTdGF0ZSgiY29yZTEiLCAiY29yZV9ub2RlMSIsIFprU3RhdGVSZWFkZXIuUkVDT1ZFUklORywgMSk7CiAKICAgICAgIHdoaWxlICh2ZXJzaW9uID09IGdldENsdXN0ZXJTdGF0ZVZlcnNpb24oY29udHJvbGxlckNsaWVudCkpOwogICAgICAgCkBAIC03MTgsNyArNzI4LDcgQEAKICAgICAgIGludCBudW1Gb3VuZCA9IDA7CiAgICAgICBmb3IgKERvY0NvbGxlY3Rpb24gY29sbGVjdGlvbiA6IHN0YXRlLmdldENvbGxlY3Rpb25TdGF0ZXMoKS52YWx1ZXMoKSkgewogICAgICAgICBmb3IgKFNsaWNlIHNsaWNlIDogY29sbGVjdGlvbi5nZXRTbGljZXMoKSkgewotICAgICAgICAgIGlmIChzbGljZS5nZXRSZXBsaWNhc01hcCgpLmdldCgibm9kZTFfY29yZTEiKSAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKHNsaWNlLmdldFJlcGxpY2FzTWFwKCkuZ2V0KCJjb3JlX25vZGUxIikgIT0gbnVsbCkgewogICAgICAgICAgICAgbnVtRm91bmQrKzsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc2MSw3ICs3NzEsNyBAQAogICAgICAgCiAgICAgICBvdmVyc2VlckNsaWVudCA9IGVsZWN0TmV3T3ZlcnNlZXIoc2VydmVyLmdldFprQWRkcmVzcygpKTsKIAotICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsIFprU3RhdGVSZWFkZXIuUkVDT1ZFUklORywgMTIpOworICAgICAgbW9ja0NvbnRyb2xsZXIucHVibGlzaFN0YXRlKCJjb3JlMSIsICJub2RlMSIsIFprU3RhdGVSZWFkZXIuUkVDT1ZFUklORywgMTIpOwogCiAgICAgICB3YWl0Rm9yQ29sbGVjdGlvbnMocmVhZGVyLCAiY29sbGVjdGlvbjEiKTsKICAgICAgIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9SZWNvdmVyeVprVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9SZWNvdmVyeVprVGVzdC5qYXZhCmluZGV4IDJmN2RhZWIuLjI4ZTQ3M2EgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvUmVjb3Zlcnlaa1Rlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1JlY292ZXJ5WmtUZXN0LmphdmEKQEAgLTg2LDE5ICs4NiwyNSBAQAogICAgIGluZGV4VGhyZWFkLmpvaW4oKTsKICAgICBpbmRleFRocmVhZDIuam9pbigpOwogICAgIAotICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKICAgCi0gICAgd2FpdEZvclRoaW5nc1RvTGV2ZWxPdXQoMzApOworICAgIHdhaXRGb3JUaGluZ3NUb0xldmVsT3V0KDQ1KTsKICAgICAKICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CiAgICAgCiAgICAgd2FpdEZvclRoaW5nc1RvTGV2ZWxPdXQoMzApOwogICAgIAorICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKyAgICAKICAgICB3YWl0Rm9yUmVjb3Zlcmllc1RvRmluaXNoKERFRkFVTFRfQ09MTEVDVElPTiwgemtTdGF0ZVJlYWRlciwgZmFsc2UsIHRydWUpOwogCiAgICAgLy8gdGVzdCB0aGF0IGxlYWRlciBhbmQgcmVwbGljYSBoYXZlIHNhbWUgZG9jIGNvdW50CiAgICAgCi0gICAgY2hlY2tTaGFyZENvbnNpc3RlbmN5KCJzaGFyZDEiLCBmYWxzZSwgZmFsc2UpOworICAgIFN0cmluZyBmYWlsID0gY2hlY2tTaGFyZENvbnNpc3RlbmN5KCJzaGFyZDEiLCBmYWxzZSwgZmFsc2UpOworICAgIGlmIChmYWlsICE9IG51bGwpIHsKKyAgICAgIGZhaWwoZmFpbCk7CisgICAgfQorICAgIAogICAgIFNvbHJRdWVyeSBxdWVyeSA9IG5ldyBTb2xyUXVlcnkoIio6KiIpOwogICAgIHF1ZXJ5LnNldFBhcmFtKCJkaXN0cmliIiwgImZhbHNlIik7CiAgICAgbG9uZyBjbGllbnQxRG9jcyA9IHNoYXJkVG9KZXR0eS5nZXQoInNoYXJkMSIpLmdldCgwKS5jbGllbnQuc29sckNsaWVudC5xdWVyeShxdWVyeSkuZ2V0UmVzdWx0cygpLmdldE51bUZvdW5kKCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1NoYXJkU3BsaXRUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1NoYXJkU3BsaXRUZXN0LmphdmEKaW5kZXggYTk5OWNlNi4uYWIxYmE2MyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9TaGFyZFNwbGl0VGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvU2hhcmRTcGxpdFRlc3QuamF2YQpAQCAtMTcsNiArMTcsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQ29yZUNvbm5lY3Rpb25QTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyUXVlcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyUmVxdWVzdDsKQEAgLTI4LDEwICszNyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXNwb25zZS5RdWVyeVJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuQ2x1c3RlclN0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuQ29tcG9zaXRlSWRSb3V0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5Eb2NSb3V0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5IYXNoQmFzZWRSb3V0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5QbGFpbklkUm91dGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU2xpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa0NvcmVOb2RlUHJvcHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa1N0YXRlUmVhZGVyOwpAQCAtNDMsMTIgKzUwLDYgQEAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIHB1YmxpYyBjbGFzcyBTaGFyZFNwbGl0VGVzdCBleHRlbmRzIEJhc2ljRGlzdHJpYnV0ZWRaa1Rlc3QgewogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJEMV8wID0gU0hBUkQxICsgIl8wIjsKQEAgLTExMCwzNSArMTExLDY2IEBACiAgICAgZGVsKCIqOioiKTsKICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDw9IDEwMDsgaWQrKykgewogICAgICAgU3RyaW5nIHNoYXJkS2V5ID0gIiIgKyAoY2hhcikoJ2EnICsgKGlkICUgMjYpKTsgLy8gU2VlIGNvbW1lbnQgaW4gU2hhcmRSb3V0aW5nVGVzdCBmb3IgaGFzaCBkaXN0cmlidXRpb24KLSAgICAgIGluZGV4QW5kVXBkYXRlQ291bnQocm91dGVyLCByYW5nZXMsIGRvY0NvdW50cywgc2hhcmRLZXkgKyAiISIgKyBTdHJpbmcudmFsdWVPZihpZCkpOworICAgICAgaW5kZXhBbmRVcGRhdGVDb3VudChyb3V0ZXIsIHJhbmdlcywgZG9jQ291bnRzLCBzaGFyZEtleSArICIhIiArIFN0cmluZy52YWx1ZU9mKGlkKSwgaWQpOwogICAgIH0KICAgICBjb21taXQoKTsKIAogICAgIFRocmVhZCBpbmRleFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgaW50IG1heCA9IGF0TGVhc3QoNDAxKTsKKyAgICAgICAgUmFuZG9tIHJhbmRvbSA9IHJhbmRvbSgpOworICAgICAgICBpbnQgbWF4ID0gYXRMZWFzdChyYW5kb20sIDQwMSk7CisgICAgICAgIGludCBzbGVlcCA9IGF0TGVhc3QocmFuZG9tLCAyNSk7CisgICAgICAgIGxvZy5pbmZvKCJTSEFSRFNQTElUVEVTVDogR29pbmcgdG8gYWRkICIgKyBtYXggKyAiIG51bWJlciBvZiBkb2NzIGF0IDEgZG9jIHBlciAiICsgc2xlZXAgKyAibXMiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gZGVsZXRlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKICAgICAgICAgZm9yIChpbnQgaWQgPSAxMDE7IGlkIDwgbWF4OyBpZCsrKSB7CiAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluZGV4QW5kVXBkYXRlQ291bnQocm91dGVyLCByYW5nZXMsIGRvY0NvdW50cywgU3RyaW5nLnZhbHVlT2YoaWQpKTsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChhdExlYXN0KDI1KSk7CisgICAgICAgICAgICBpbmRleEFuZFVwZGF0ZUNvdW50KHJvdXRlciwgcmFuZ2VzLCBkb2NDb3VudHMsIFN0cmluZy52YWx1ZU9mKGlkKSwgaWQpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwKTsKKyAgICAgICAgICAgIGlmICh1c3VhbGx5KHJhbmRvbSkpICB7CisgICAgICAgICAgICAgIFN0cmluZyBkZWxJZCA9IFN0cmluZy52YWx1ZU9mKHJhbmRvbS5uZXh0SW50KGlkIC0gMTAxICsgMSkgKyAxMDEpOworICAgICAgICAgICAgICBpZiAoZGVsZXRlZC5jb250YWlucyhkZWxJZCkpICBjb250aW51ZTsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZWxldGVBbmRVcGRhdGVDb3VudChyb3V0ZXIsIHJhbmdlcywgZG9jQ291bnRzLCBkZWxJZCk7CisgICAgICAgICAgICAgICAgZGVsZXRlZC5hZGQoZGVsSWQpOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIHdoaWxlIGRlbGV0aW5nIGRvY3MiLCBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgZG9jIiwgZSk7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgZG9jcyIsIGUpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH07CiAgICAgaW5kZXhUaHJlYWQuc3RhcnQoKTsKIAotICAgIHNwbGl0U2hhcmQoU0hBUkQxKTsKLQotICAgIGxvZy5pbmZvKCJMYXlvdXQgYWZ0ZXIgc3BsaXQ6IFxuIik7Ci0gICAgcHJpbnRMYXlvdXQoKTsKLQotICAgIGluZGV4VGhyZWFkLmpvaW4oKTsKKyAgICB0cnkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzcGxpdFNoYXJkKFNIQVJEMSk7CisgICAgICAgICAgbG9nLmluZm8oIkxheW91dCBhZnRlciBzcGxpdDogXG4iKTsKKyAgICAgICAgICBwcmludExheW91dCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGNhdGNoIChIdHRwU29sclNlcnZlci5SZW1vdGVTb2xyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpZiAoZS5jb2RlKCkgIT0gNTAwKSAgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbG9nLmVycm9yKCJTUExJVFNIQVJEIGZhaWxlZC4gIiArIChpIDwgMiA/ICIgUmV0cmluZyBzcGxpdCIgOiAiIiksIGUpOworICAgICAgICAgIGlmIChpID09IDIpIHsKKyAgICAgICAgICAgIGZhaWwoIlNQTElUU0hBUkQgd2FzIG5vdCBzdWNjZXNzZnVsIGV2ZW4gYWZ0ZXIgdGhyZWUgdHJpZXMiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW5kZXhUaHJlYWQuam9pbigpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBsb2cuZXJyb3IoIkluZGV4aW5nIHRocmVhZCBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgfQorICAgIH0KIAogICAgIGNvbW1pdCgpOwotCiAgICAgY2hlY2tEb2NDb3VudHNBbmRTaGFyZFN0YXRlcyhkb2NDb3VudHMsIG51bVJlcGxpY2FzKTsKIAogICAgIC8vIHRvZG8gY2FuJ3QgY2FsbCB3YWl0Rm9yVGhpbmdzVG9MZXZlbE91dCBiZWNhdXNlIGl0IGxvb2tzIGZvciBqZXR0eXMgb2YgYWxsIHNoYXJkcwpAQCAtMTQ4LDI0ICsxODAsNiBAQAogICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tEb2NDb3VudHNBbmRTaGFyZFN0YXRlcyhpbnRbXSBkb2NDb3VudHMsIGludCBudW1SZXBsaWNhcykgdGhyb3dzIFNvbHJTZXJ2ZXJFeGNlcHRpb24sIEtlZXBlckV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgIFNvbHJRdWVyeSBxdWVyeSA9IG5ldyBTb2xyUXVlcnkoIio6KiIpLnNldFJvd3MoMTAwMCkuc2V0RmllbGRzKCJpZCIsICJfdmVyc2lvbl8iKTsKLSAgICBxdWVyeS5zZXQoImRpc3RyaWIiLCBmYWxzZSk7Ci0KLSAgICBaa0NvcmVOb2RlUHJvcHMgc2hhcmQxXzAgPSBnZXRMZWFkZXJVcmxGcm9tWmsoQWJzdHJhY3REaXN0cmliWmtUZXN0QmFzZS5ERUZBVUxUX0NPTExFQ1RJT04sIFNIQVJEMV8wKTsKLSAgICBIdHRwU29sclNlcnZlciBzaGFyZDFfMFNlcnZlciA9IG5ldyBIdHRwU29sclNlcnZlcihzaGFyZDFfMC5nZXRDb3JlVXJsKCkpOwotICAgIFF1ZXJ5UmVzcG9uc2UgcmVzcG9uc2UgPSBzaGFyZDFfMFNlcnZlci5xdWVyeShxdWVyeSk7Ci0gICAgbG9uZyBzaGFyZDEwQ291bnQgPSByZXNwb25zZS5nZXRSZXN1bHRzKCkuZ2V0TnVtRm91bmQoKTsKLQotICAgIFprQ29yZU5vZGVQcm9wcyBzaGFyZDFfMSA9IGdldExlYWRlclVybEZyb21aayhBYnN0cmFjdERpc3RyaWJaa1Rlc3RCYXNlLkRFRkFVTFRfQ09MTEVDVElPTiwgU0hBUkQxXzEpOwotICAgIEh0dHBTb2xyU2VydmVyIHNoYXJkMV8xU2VydmVyID0gbmV3IEh0dHBTb2xyU2VydmVyKHNoYXJkMV8xLmdldENvcmVVcmwoKSk7Ci0gICAgUXVlcnlSZXNwb25zZSByZXNwb25zZTIgPSBzaGFyZDFfMVNlcnZlci5xdWVyeShxdWVyeSk7Ci0gICAgbG9uZyBzaGFyZDExQ291bnQgPSByZXNwb25zZTIuZ2V0UmVzdWx0cygpLmdldE51bUZvdW5kKCk7Ci0KLSAgICBsb2dEZWJ1Z0hlbHAoZG9jQ291bnRzLCByZXNwb25zZSwgc2hhcmQxMENvdW50LCByZXNwb25zZTIsIHNoYXJkMTFDb3VudCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIldyb25nIGRvYyBjb3VudCBvbiBzaGFyZDFfMCIsIGRvY0NvdW50c1swXSwgc2hhcmQxMENvdW50KTsKLSAgICBhc3NlcnRFcXVhbHMoIldyb25nIGRvYyBjb3VudCBvbiBzaGFyZDFfMSIsIGRvY0NvdW50c1sxXSwgc2hhcmQxMUNvdW50KTsKLQogICAgIENsdXN0ZXJTdGF0ZSBjbHVzdGVyU3RhdGUgPSBudWxsOwogICAgIFNsaWNlIHNsaWNlMV8wID0gbnVsbCwgc2xpY2UxXzEgPSBudWxsOwogICAgIGludCBpID0gMDsKQEAgLTE4OCw2ICsyMDIsMjQgQEAKICAgICBhc3NlcnRFcXVhbHMoInNoYXJkMV8xIGlzIG5vdCBhY3RpdmUiLCBTbGljZS5BQ1RJVkUsIHNsaWNlMV8xLmdldFN0YXRlKCkpOwogICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHJlcGxpY2FzIGNyZWF0ZWQgZm9yIHNoYXJkMV8wIiwgbnVtUmVwbGljYXMsIHNsaWNlMV8wLmdldFJlcGxpY2FzKCkuc2l6ZSgpKTsKICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiByZXBsaWNhcyBjcmVhdGVkIGZvciBzaGFyZDFfMSIsIG51bVJlcGxpY2FzLCBzbGljZTFfMS5nZXRSZXBsaWNhcygpLnNpemUoKSk7CisKKyAgICBTb2xyUXVlcnkgcXVlcnkgPSBuZXcgU29sclF1ZXJ5KCIqOioiKS5zZXRSb3dzKDEwMDApLnNldEZpZWxkcygiaWQiLCAiX3ZlcnNpb25fIik7CisgICAgcXVlcnkuc2V0KCJkaXN0cmliIiwgZmFsc2UpOworCisgICAgWmtDb3JlTm9kZVByb3BzIHNoYXJkMV8wID0gZ2V0TGVhZGVyVXJsRnJvbVprKEFic3RyYWN0RGlzdHJpYlprVGVzdEJhc2UuREVGQVVMVF9DT0xMRUNUSU9OLCBTSEFSRDFfMCk7CisgICAgSHR0cFNvbHJTZXJ2ZXIgc2hhcmQxXzBTZXJ2ZXIgPSBuZXcgSHR0cFNvbHJTZXJ2ZXIoc2hhcmQxXzAuZ2V0Q29yZVVybCgpKTsKKyAgICBRdWVyeVJlc3BvbnNlIHJlc3BvbnNlID0gc2hhcmQxXzBTZXJ2ZXIucXVlcnkocXVlcnkpOworICAgIGxvbmcgc2hhcmQxMENvdW50ID0gcmVzcG9uc2UuZ2V0UmVzdWx0cygpLmdldE51bUZvdW5kKCk7CisKKyAgICBaa0NvcmVOb2RlUHJvcHMgc2hhcmQxXzEgPSBnZXRMZWFkZXJVcmxGcm9tWmsoQWJzdHJhY3REaXN0cmliWmtUZXN0QmFzZS5ERUZBVUxUX0NPTExFQ1RJT04sIFNIQVJEMV8xKTsKKyAgICBIdHRwU29sclNlcnZlciBzaGFyZDFfMVNlcnZlciA9IG5ldyBIdHRwU29sclNlcnZlcihzaGFyZDFfMS5nZXRDb3JlVXJsKCkpOworICAgIFF1ZXJ5UmVzcG9uc2UgcmVzcG9uc2UyID0gc2hhcmQxXzFTZXJ2ZXIucXVlcnkocXVlcnkpOworICAgIGxvbmcgc2hhcmQxMUNvdW50ID0gcmVzcG9uc2UyLmdldFJlc3VsdHMoKS5nZXROdW1Gb3VuZCgpOworCisgICAgbG9nRGVidWdIZWxwKGRvY0NvdW50cywgcmVzcG9uc2UsIHNoYXJkMTBDb3VudCwgcmVzcG9uc2UyLCBzaGFyZDExQ291bnQpOworCisgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkb2MgY291bnQgb24gc2hhcmQxXzAiLCBkb2NDb3VudHNbMF0sIHNoYXJkMTBDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkb2MgY291bnQgb24gc2hhcmQxXzEiLCBkb2NDb3VudHNbMV0sIHNoYXJkMTFDb3VudCk7CiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBzcGxpdFNoYXJkKFN0cmluZyBzaGFyZElkKSB0aHJvd3MgU29sclNlcnZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMjA4LDkgKzI0MCwyNiBAQAogICAgIGJhc2VTZXJ2ZXIucmVxdWVzdChyZXF1ZXN0KTsKICAgfQogCi0gIHByb3RlY3RlZCB2b2lkIGluZGV4QW5kVXBkYXRlQ291bnQoRG9jUm91dGVyIHJvdXRlciwgTGlzdDxEb2NSb3V0ZXIuUmFuZ2U+IHJhbmdlcywgaW50W10gZG9jQ291bnRzLCBTdHJpbmcgaWQpIHRocm93cyBFeGNlcHRpb24gewotICAgIGluZGV4KCJpZCIsIGlkKTsKKyAgcHJvdGVjdGVkIHZvaWQgaW5kZXhBbmRVcGRhdGVDb3VudChEb2NSb3V0ZXIgcm91dGVyLCBMaXN0PERvY1JvdXRlci5SYW5nZT4gcmFuZ2VzLCBpbnRbXSBkb2NDb3VudHMsIFN0cmluZyBpZCwgaW50IG4pIHRocm93cyBFeGNlcHRpb24geworICAgIGluZGV4KCJpZCIsIGlkLCAibl90aSIsIG4pOwogCisgICAgaW50IGlkeCA9IGdldEhhc2hSYW5nZUlkeChyb3V0ZXIsIHJhbmdlcywgZG9jQ291bnRzLCBpZCk7CisgICAgaWYgKGlkeCAhPSAtMSkgIHsKKyAgICAgIGRvY0NvdW50c1tpZHhdKys7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlQW5kVXBkYXRlQ291bnQoRG9jUm91dGVyIHJvdXRlciwgTGlzdDxEb2NSb3V0ZXIuUmFuZ2U+IHJhbmdlcywgaW50W10gZG9jQ291bnRzLCBTdHJpbmcgaWQpIHRocm93cyBFeGNlcHRpb24geworICAgIGNvbnRyb2xDbGllbnQuZGVsZXRlQnlJZChpZCk7CisgICAgY2xvdWRDbGllbnQuZGVsZXRlQnlJZChpZCk7CisKKyAgICBpbnQgaWR4ID0gZ2V0SGFzaFJhbmdlSWR4KHJvdXRlciwgcmFuZ2VzLCBkb2NDb3VudHMsIGlkKTsKKyAgICBpZiAoaWR4ICE9IC0xKSAgeworICAgICAgZG9jQ291bnRzW2lkeF0tLTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBnZXRIYXNoUmFuZ2VJZHgoRG9jUm91dGVyIHJvdXRlciwgTGlzdDxEb2NSb3V0ZXIuUmFuZ2U+IHJhbmdlcywgaW50W10gZG9jQ291bnRzLCBTdHJpbmcgaWQpIHsKICAgICBpbnQgaGFzaCA9IDA7CiAgICAgaWYgKHJvdXRlciBpbnN0YW5jZW9mIEhhc2hCYXNlZFJvdXRlcikgewogICAgICAgSGFzaEJhc2VkUm91dGVyIGhhc2hCYXNlZFJvdXRlciA9IChIYXNoQmFzZWRSb3V0ZXIpIHJvdXRlcjsKQEAgLTIxOSw4ICsyNjgsOSBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICBEb2NSb3V0ZXIuUmFuZ2UgcmFuZ2UgPSByYW5nZXMuZ2V0KGkpOwogICAgICAgaWYgKHJhbmdlLmluY2x1ZGVzKGhhc2gpKQotICAgICAgICBkb2NDb3VudHNbaV0rKzsKKyAgICAgICAgcmV0dXJuIGk7CiAgICAgfQorICAgIHJldHVybiAtMTsKICAgfQogCiAgIHByb3RlY3RlZCB2b2lkIGxvZ0RlYnVnSGVscChpbnRbXSBkb2NDb3VudHMsIFF1ZXJ5UmVzcG9uc2UgcmVzcG9uc2UsIGxvbmcgc2hhcmQxMENvdW50LCBRdWVyeVJlc3BvbnNlIHJlc3BvbnNlMiwgbG9uZyBzaGFyZDExQ291bnQpIHsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvU2xpY2VTdGF0ZVVwZGF0ZVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvU2xpY2VTdGF0ZVVwZGF0ZVRlc3QuamF2YQppbmRleCAxZGZiNDIyLi42N2JkN2YyIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1NsaWNlU3RhdGVVcGRhdGVUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9TbGljZVN0YXRlVXBkYXRlVGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5aa05vZGVQcm9wczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlprU3RhdGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlQ29udGFpbmVyLkluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuem9va2VlcGVyLkNyZWF0ZU1vZGU7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwpAQCAtNjIsOCArNjEsNiBAQAogCiAgIHByaXZhdGUgRmlsZSBkYXRhRGlyMzsKIAotICBwcml2YXRlIEluaXRpYWxpemVyIGluaXQyOwotCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyY2xvdWQuc2tpcC5hdXRvcmVjb3ZlcnkiLCAidHJ1ZSIpOwpAQCAtMTE3LDIwICsxMTQsMjEgQEAKIAogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5zb2xyLmhvbWUiLCBURVNUX0hPTUUoKSk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJob3N0UG9ydCIsICIxNjYxIik7Ci0gICAgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0MSA9IG5ldyBDb3JlQ29udGFpbmVyLkluaXRpYWxpemVyKCk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLmRhdGEuZGlyIiwgU2xpY2VTdGF0ZVVwZGF0ZVRlc3QudGhpcy5kYXRhRGlyMS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgY29udGFpbmVyMSA9IGluaXQxLmluaXRpYWxpemUoKTsKKyAgICBjb250YWluZXIxID0gbmV3IENvcmVDb250YWluZXIoKTsKIAogICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJob3N0UG9ydCIpOwogCiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJob3N0UG9ydCIsICIxNjYyIik7Ci0gICAgaW5pdDIgPSBuZXcgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplcigpOwogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kYXRhLmRpciIsIFNsaWNlU3RhdGVVcGRhdGVUZXN0LnRoaXMuZGF0YURpcjIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGNvbnRhaW5lcjIgPSBpbml0Mi5pbml0aWFsaXplKCk7CisgICAgY29udGFpbmVyMiA9IG5ldyBDb3JlQ29udGFpbmVyKCk7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImhvc3RQb3J0Iik7CiAKICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgic29sci5zb2xyLmhvbWUiKTsKIAorICAgIGNvbnRhaW5lcjEubG9hZCgpOworICAgIGNvbnRhaW5lcjIubG9hZCgpOworCiAgICAgbG9nLmluZm8oIiMjIyNTRVRVUF9FTkQgIiArIGdldFRlc3ROYW1lKCkpOwogCiAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvU3luY1NsaWNlVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9TeW5jU2xpY2VUZXN0LmphdmEKaW5kZXggMjI5NDhjNC4uMTFjZmI3YyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9TeW5jU2xpY2VUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9TeW5jU2xpY2VUZXN0LmphdmEKQEAgLTY3LDcgKzY3LDYgQEAKICAgICBzdXBlci5zZXRVcCgpOwogICAgIC8vIHdlIGV4cGVjdCB0aGlzIHRpbWUgb2YgZXhjZXB0aW9uIGFzIHNoYXJkcyBnbyB1cCBhbmQgZG93bi4uLgogICAgIC8vaWdub3JlRXhjZXB0aW9uKCIuKiIpOwotICAgIHVzZUZhY3RvcnkobnVsbCk7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJudW1TaGFyZHMiLCBJbnRlZ2VyLnRvU3RyaW5nKHNsaWNlQ291bnQpKTsKICAgfQogICAKQEAgLTk0LDcgKzkzLDcgQEAKICAgICBoYW5kbGUucHV0KCJRVGltZSIsIFNLSVBWQUwpOwogICAgIGhhbmRsZS5wdXQoInRpbWVzdGFtcCIsIFNLSVBWQUwpOwogICAgIAotICAgIHdhaXRGb3JUaGluZ3NUb0xldmVsT3V0KDE1KTsKKyAgICB3YWl0Rm9yVGhpbmdzVG9MZXZlbE91dCgzMCk7CiAKICAgICBkZWwoIio6KiIpOwogICAgIExpc3Q8Q2xvdWRKZXR0eVJ1bm5lcj4gc2tpcFNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PENsb3VkSmV0dHlSdW5uZXI+KCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1Rlc3RNdWx0aUNvcmVDb25mQm9vdHN0cmFwLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1Rlc3RNdWx0aUNvcmVDb25mQm9vdHN0cmFwLmphdmEKaW5kZXggMGQ5YjQ2Ny4uMGU5NzczMSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9UZXN0TXVsdGlDb3JlQ29uZkJvb3RzdHJhcC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvVGVzdE11bHRpQ29yZUNvbmZCb290c3RyYXAuamF2YQpAQCAtMTcsOCArMTcsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbG91ZDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLmNsb3VkLlNvbHJaa0NsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlQ29udGFpbmVyOwpAQCAtMzAsNiArMjgsOCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKIHB1YmxpYyBjbGFzcyBUZXN0TXVsdGlDb3JlQ29uZkJvb3RzdHJhcCBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKICAgcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdE11bHRpQ29yZUNvbmZCb290c3RyYXAuY2xhc3MpOwogICBwcm90ZWN0ZWQgQ29yZUNvbnRhaW5lciBjb3JlcyA9IG51bGw7CkBAIC05OSw3ICs5OSw3IEBACiAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUNvcmVDb25mQm9vdHN0cmFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJib290c3RyYXBfY29uZiIsICJ0cnVlIik7Ci0gICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcihob21lLCBuZXcgRmlsZShob21lLCAic29sci54bWwiKSk7CisgICAgY29yZXMgPSBDb3JlQ29udGFpbmVyLmNyZWF0ZUFuZExvYWQoaG9tZSwgbmV3IEZpbGUoaG9tZSwgInNvbHIueG1sIikpOwogICAgIFNvbHJaa0NsaWVudCB6a2NsaWVudCA9IGNvcmVzLmdldFprQ29udHJvbGxlcigpLmdldFprQ2xpZW50KCk7CiAgICAgLy8gemtjbGllbnQucHJpbnRMYXlvdXRUb1N0ZE91dCgpOwogICAgIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9UZXN0WmtDaHJvb3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvVGVzdFprQ2hyb290LmphdmEKaW5kZXggYjI4ZTNlMi4uYjAyNWQwMyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9UZXN0WmtDaHJvb3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1Rlc3Raa0Nocm9vdC5qYXZhCkBAIC0xNyw4ICsxNyw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU29sclprQ2xpZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuWm9vS2VlcGVyRXhjZXB0aW9uOwpAQCAtMzEsNiArMjksOCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKIHB1YmxpYyBjbGFzcyBUZXN0WmtDaHJvb3QgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CiAgIHByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRlc3Raa0Nocm9vdC5jbGFzcyk7CiAgIHByb3RlY3RlZCBDb3JlQ29udGFpbmVyIGNvcmVzID0gbnVsbDsKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBTb2xyWmtDbGllbnQgemtDbGllbnQyID0gbnVsbDsKICAgICAKICAgICB0cnkgewotICAgICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcihob21lLCBuZXcgRmlsZShob21lLCAic29sci54bWwiKSk7CisgICAgICBjb3JlcyA9IENvcmVDb250YWluZXIuY3JlYXRlQW5kTG9hZChob21lLCBuZXcgRmlsZShob21lLCAic29sci54bWwiKSk7CiAgICAgICB6a0NsaWVudCA9IGNvcmVzLmdldFprQ29udHJvbGxlcigpLmdldFprQ2xpZW50KCk7CiAgICAgICAKICAgICAgIGFzc2VydFRydWUoemtDbGllbnQuZXhpc3RzKCIvY2x1c3RlcnN0YXRlLmpzb24iLCB0cnVlKSk7CkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgICBBYnN0cmFjdFprVGVzdENhc2UuVElNRU9VVCk7CiAgICAgICBhc3NlcnRGYWxzZSgiUGF0aCAnIiArIGNocm9vdCArICInIHNob3VsZCBub3QgZXhpc3QgYmVmb3JlIHRoZSB0ZXN0IiwKICAgICAgICAgICB6a0NsaWVudC5leGlzdHMoY2hyb290LCB0cnVlKSk7Ci0gICAgICBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKKyAgICAgIGNvcmVzID0gQ29yZUNvbnRhaW5lci5jcmVhdGVBbmRMb2FkKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKICAgICAgIGZhaWwoIlRoZXJlIHNob3VsZCBiZSBhIHprIGV4Y2VwdGlvbiwgYXMgdGhlIGluaXRpYWwgcGF0aCBkb2Vzbid0IGV4aXN0Iik7CiAgICAgfSBjYXRjaCAoWm9vS2VlcGVyRXhjZXB0aW9uIGUpIHsKICAgICAgIC8vIGV4cGVjdGVkCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgICBBYnN0cmFjdFprVGVzdENhc2UuVElNRU9VVCk7CiAgICAgICBhc3NlcnRGYWxzZSgiUGF0aCAnIiArIGNocm9vdCArICInIHNob3VsZCBub3QgZXhpc3QgYmVmb3JlIHRoZSB0ZXN0IiwKICAgICAgICAgICB6a0NsaWVudC5leGlzdHMoY2hyb290LCB0cnVlKSk7Ci0gICAgICBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKKyAgICAgIGNvcmVzID0gQ29yZUNvbnRhaW5lci5jcmVhdGVBbmRMb2FkKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKICAgICAgIGFzc2VydFRydWUoCiAgICAgICAgICAgInNvbHJjb25maWcueG1sIHNob3VsZCBoYXZlIGJlZW4gdXBsb2FkZWQgdG8gemsgdG8gdGhlIGNvcnJlY3QgY29uZmlnIGRpcmVjdG9yeSIsCiAgICAgICAgICAgemtDbGllbnQuZXhpc3RzKGNocm9vdCArIFprQ29udHJvbGxlci5DT05GSUdTX1pLTk9ERSArICIvIgpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgICBhc3NlcnRUcnVlKHprQ2xpZW50LmV4aXN0cyhjaHJvb3QsIHRydWUpKTsKICAgICAgIGFzc2VydEZhbHNlKHprQ2xpZW50LmV4aXN0cyhjaHJvb3QgKyAiL2NsdXN0ZXJzdGF0ZS5qc29uIiwgdHJ1ZSkpOwogICAgICAgCi0gICAgICBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKKyAgICAgIGNvcmVzID0gQ29yZUNvbnRhaW5lci5jcmVhdGVBbmRMb2FkKGhvbWUsIG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpKTsKICAgICAgIGFzc2VydFRydWUoemtDbGllbnQuZXhpc3RzKGNocm9vdCArICIvY2x1c3RlcnN0YXRlLmpzb24iLCB0cnVlKSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGlmIChjb3JlcyAhPSBudWxsKSBjb3Jlcy5zaHV0ZG93bigpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9VbmxvYWREaXN0cmlidXRlZFprVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9VbmxvYWREaXN0cmlidXRlZFprVGVzdC5qYXZhCmluZGV4IDhiODU5M2UuLjAxZTgwNDUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvVW5sb2FkRGlzdHJpYnV0ZWRaa1Rlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1VubG9hZERpc3RyaWJ1dGVkWmtUZXN0LmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbihjb2xsZWN0aW9uKTsKICAgICBTdHJpbmcgY29yZURhdGFEaXIgPSBkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGNvbGxlY3Rpb24gKyAiMSI7Ci0gICAgY3JlYXRlQ21kLnNldERhdGFEaXIoY29yZURhdGFEaXIpOworICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGdldERhdGFEaXIoY29yZURhdGFEaXIpKTsKICAgICBjcmVhdGVDbWQuc2V0TnVtU2hhcmRzKDIpOwogICAgIAogICAgIFNvbHJTZXJ2ZXIgY2xpZW50ID0gY2xpZW50cy5nZXQoMCk7CkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbihjb2xsZWN0aW9uKTsKICAgICBjb3JlRGF0YURpciA9IGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcgogICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgY29sbGVjdGlvbiArICIyIjsKLSAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihjb3JlRGF0YURpcik7CisgICAgY3JlYXRlQ21kLnNldERhdGFEaXIoZ2V0RGF0YURpcihjb3JlRGF0YURpcikpOwogICAgIAogICAgIHNlcnZlci5yZXF1ZXN0KGNyZWF0ZUNtZCk7CiAgICAgCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbigidW5sb2FkY29sbGVjdGlvbiIpOwogICAgIGNyZWF0ZUNtZC5zZXROdW1TaGFyZHMoMSk7CiAgICAgU3RyaW5nIGNvcmUxRGF0YURpciA9IGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgInVubG9hZGNvbGxlY3Rpb24xIiArICJfMW4iOwotICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGNvcmUxRGF0YURpcik7CisgICAgY3JlYXRlQ21kLnNldERhdGFEaXIoZ2V0RGF0YURpcihjb3JlMURhdGFEaXIpKTsKICAgICBzZXJ2ZXIucmVxdWVzdChjcmVhdGVDbWQpOwogICAgIAogICAgIFprU3RhdGVSZWFkZXIgemtTdGF0ZVJlYWRlciA9IGdldENvbW1vbkNsb3VkU29sclNlcnZlcigpLmdldFprU3RhdGVSZWFkZXIoKTsKQEAgLTE4OSw3ICsxODksNyBAQAogICAgIGNyZWF0ZUNtZC5zZXRDb3JlTmFtZSgidW5sb2FkY29sbGVjdGlvbjIiKTsKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbigidW5sb2FkY29sbGVjdGlvbiIpOwogICAgIFN0cmluZyBjb3JlMmRhdGFEaXIgPSBkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICJ1bmxvYWRjb2xsZWN0aW9uMSIgKyAiXzJuIjsKLSAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihjb3JlMmRhdGFEaXIpOworICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGdldERhdGFEaXIoY29yZTJkYXRhRGlyKSk7CiAgICAgc2VydmVyLnJlcXVlc3QoY3JlYXRlQ21kKTsKICAgICAKICAgICB6a1N0YXRlUmVhZGVyLnVwZGF0ZUNsdXN0ZXJTdGF0ZSh0cnVlKTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgIGNyZWF0ZUNtZC5zZXRDb3JlTmFtZSgidW5sb2FkY29sbGVjdGlvbjMiKTsKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbigidW5sb2FkY29sbGVjdGlvbiIpOwogICAgIFN0cmluZyBjb3JlM2RhdGFEaXIgPSBkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICJ1bmxvYWRjb2xsZWN0aW9uIiArICJfM24iOwotICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGNvcmUzZGF0YURpcik7CisgICAgY3JlYXRlQ21kLnNldERhdGFEaXIoZ2V0RGF0YURpcihjb3JlM2RhdGFEaXIpKTsKICAgICBzZXJ2ZXIucmVxdWVzdChjcmVhdGVDbWQpOwogICAgIAogICAgIHdhaXRGb3JSZWNvdmVyaWVzVG9GaW5pc2goInVubG9hZGNvbGxlY3Rpb24iLCB6a1N0YXRlUmVhZGVyLCBmYWxzZSk7CkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICBjcmVhdGVDbWQuc2V0Q29yZU5hbWUoInVubG9hZGNvbGxlY3Rpb240Iik7CiAgICAgY3JlYXRlQ21kLnNldENvbGxlY3Rpb24oInVubG9hZGNvbGxlY3Rpb24iKTsKICAgICBTdHJpbmcgY29yZTRkYXRhRGlyID0gZGF0YURpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAidW5sb2FkY29sbGVjdGlvbiIgKyAiXzRuIjsKLSAgICBjcmVhdGVDbWQuc2V0RGF0YURpcihjb3JlNGRhdGFEaXIpOworICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGdldERhdGFEaXIoY29yZTRkYXRhRGlyKSk7CiAgICAgc2VydmVyLnJlcXVlc3QoY3JlYXRlQ21kKTsKICAgICAKICAgICB3YWl0Rm9yUmVjb3Zlcmllc1RvRmluaXNoKCJ1bmxvYWRjb2xsZWN0aW9uIiwgemtTdGF0ZVJlYWRlciwgZmFsc2UpOwpAQCAtMzM0LDcgKzMzNCw3IEBACiAgICAgY3JlYXRlQ21kID0gbmV3IENyZWF0ZSgpOwogICAgIGNyZWF0ZUNtZC5zZXRDb3JlTmFtZShsZWFkZXJQcm9wcy5nZXRDb3JlTmFtZSgpKTsKICAgICBjcmVhdGVDbWQuc2V0Q29sbGVjdGlvbigidW5sb2FkY29sbGVjdGlvbiIpOwotICAgIGNyZWF0ZUNtZC5zZXREYXRhRGlyKGNvcmUxRGF0YURpcik7CisgICAgY3JlYXRlQ21kLnNldERhdGFEaXIoZ2V0RGF0YURpcihjb3JlMURhdGFEaXIpKTsKICAgICBzZXJ2ZXIucmVxdWVzdChjcmVhdGVDbWQpOwogCiAgICAgd2FpdEZvclJlY292ZXJpZXNUb0ZpbmlzaCgidW5sb2FkY29sbGVjdGlvbiIsIHprU3RhdGVSZWFkZXIsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvWmtDTElUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL1prQ0xJVGVzdC5qYXZhCmluZGV4IDIyYTIwMWYuLmQ1MWU2YWMgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvWmtDTElUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NMSVRlc3QuamF2YQpAQCAtMTM4LDYgKzEzOCwxOSBAQAogCiAgICAgYXNzZXJ0VHJ1ZSh6a0NsaWVudC5leGlzdHMoIi9wYXRoL215bmV3cGF0aCIsIHRydWUpKTsKICAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyB0ZXN0IGJvb3RzdHJhcF9jb25mCisgICAgU3RyaW5nIGRhdGEgPSAibXkgZGF0YSI7CisgICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbXSB7Ii16a2hvc3QiLCB6a1NlcnZlci5nZXRaa0FkZHJlc3MoKSwgIi1jbWQiLAorICAgICAgICAicHV0IiwgIi9kYXRhLnR4dCIsIGRhdGF9OworICAgIFprQ0xJLm1haW4oYXJncyk7CisKKyAgICB6a0NsaWVudC5nZXREYXRhKCIvZGF0YS50eHQiLCBudWxsLCBudWxsLCB0cnVlKTsKKworICAgIGFzc2VydEFycmF5RXF1YWxzKHprQ2xpZW50LmdldERhdGEoIi9kYXRhLnR4dCIsIG51bGwsIG51bGwsIHRydWUpLCBkYXRhLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgfQogICAKICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvWmtDb250cm9sbGVyVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggZGM5MzBlYS4uM2EzMWVhNCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9aa0NvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTE3LDExICsxNyw2IEBACiAgKiB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uY2xvdWQuU29sclprQ2xpZW50OwpAQCAtMzQsNiArMjksMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogQFNsb3cKIHB1YmxpYyBjbGFzcyBaa0NvbnRyb2xsZXJUZXN0IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgIGNjID0gZ2V0Q29yZUNvbnRhaW5lcigpOwogICAgICAgCiAgICAgICBaa0NvbnRyb2xsZXIgemtDb250cm9sbGVyID0gbmV3IFprQ29udHJvbGxlcihjYywgc2VydmVyLmdldFprQWRkcmVzcygpLCBUSU1FT1VULCAxMDAwMCwKLSAgICAgICAgICAiMTI3LjAuMC4xIiwgIjg5ODMiLCAic29sciIsICIwIiwgMTAwMDAsIDEwMDAwLCBuZXcgQ3VycmVudENvcmVEZXNjcmlwdG9yUHJvdmlkZXIoKSB7CisgICAgICAgICAgIjEyNy4wLjAuMSIsICI4OTgzIiwgInNvbHIiLCAiMCIsIHRydWUsIDEwMDAwLCAxMDAwMCwgbmV3IEN1cnJlbnRDb3JlRGVzY3JpcHRvclByb3ZpZGVyKCkgewogICAgICAgICAgICAgCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBMaXN0PENvcmVEZXNjcmlwdG9yPiBnZXRDdXJyZW50RGVzY3JpcHRvcnMoKSB7CkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAgIGNjID0gZ2V0Q29yZUNvbnRhaW5lcigpOwogICAgICAgCiAgICAgICB6a0NvbnRyb2xsZXIgPSBuZXcgWmtDb250cm9sbGVyKGNjLCBzZXJ2ZXIuZ2V0WmtBZGRyZXNzKCksCi0gICAgICAgICAgVElNRU9VVCwgMTAwMDAsICIxMjcuMC4wLjEiLCAiODk4MyIsICJzb2xyIiwgIjAiLCAxMDAwMCwgMTAwMDAsIG5ldyBDdXJyZW50Q29yZURlc2NyaXB0b3JQcm92aWRlcigpIHsKKyAgICAgICAgICBUSU1FT1VULCAxMDAwMCwgIjEyNy4wLjAuMSIsICI4OTgzIiwgInNvbHIiLCAiMCIsIHRydWUsIDEwMDAwLCAxMDAwMCwgbmV3IEN1cnJlbnRDb3JlRGVzY3JpcHRvclByb3ZpZGVyKCkgewogICAgICAgICAgICAgCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBMaXN0PENvcmVEZXNjcmlwdG9yPiBnZXRDdXJyZW50RGVzY3JpcHRvcnMoKSB7CkBAIC0yNDAsMTIgKzI0MCw4IEBACiAgIH0KIAogICBwcml2YXRlIENvcmVDb250YWluZXIgZ2V0Q29yZUNvbnRhaW5lcigpIHsKLSAgICBDb3JlQ29udGFpbmVyIGNjID0gbmV3IENvcmVDb250YWluZXIoVEVNUF9ESVIuZ2V0QWJzb2x1dGVQYXRoKCkpIHsKLSAgICAgIHsKLSAgICAgICAgaW5pdFNoYXJkSGFuZGxlcigpOwotICAgICAgfQotICAgIH07Ci0gICAgCisgICAgQ29yZUNvbnRhaW5lciBjYyA9IG5ldyBDb3JlQ29udGFpbmVyKFRFTVBfRElSLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBjYy5sb2FkKCk7CiAgICAgcmV0dXJuIGNjOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9CYXNpY0hkZnNUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvQmFzaWNIZGZzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTRlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvQmFzaWNIZGZzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5Tb2xyUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LlF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuQmFzaWNEaXN0cmlidXRlZFprVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Db2xsZWN0aW9uUGFyYW1zLkNvbGxlY3Rpb25BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuTW9kaWZpYWJsZVNvbHJQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLk5hbWVkTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CisKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFNsb3cKK0BUaHJlYWRMZWFrU2NvcGUoU2NvcGUuTk9ORSkgLy8gaGRmcyBjbGllbnQgY3VycmVudGx5IGxlYWtzIHRocmVhZChzKQorcHVibGljIGNsYXNzIEJhc2ljSGRmc1Rlc3QgZXh0ZW5kcyBCYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0IHsKKworICBwcml2YXRlIHN0YXRpYyBNaW5pREZTQ2x1c3RlciBkZnNDbHVzdGVyOworICAKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBkZnNDbHVzdGVyID0gSGRmc1Rlc3RVdGlsLnNldHVwQ2xhc3MobmV3IEZpbGUoVEVNUF9ESVIsCisgICAgICAgIEhkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiXyIKKyAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuaGRmcy5ob21lIiwgZGZzQ2x1c3Rlci5nZXRVUkkoKS50b1N0cmluZygpICsgIi9zb2xyIik7CisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSGRmc1Rlc3RVdGlsLnRlYXJkb3duQ2xhc3MoZGZzQ2x1c3Rlcik7CisgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIuaGRmcy5ob21lIik7CisgICAgZGZzQ2x1c3RlciA9IG51bGw7CisgIH0KKworICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YURpcihTdHJpbmcgZGF0YURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gSGRmc1Rlc3RVdGlsLmdldERhdGFEaXIoZGZzQ2x1c3RlciwgZGF0YURpcik7CisgIH0KKyAgCisgIHB1YmxpYyBCYXNpY0hkZnNUZXN0KCkgeworICAgIHN1cGVyKCk7CisgICAgc2xpY2VDb3VudCA9IDE7CisgICAgc2hhcmRDb3VudCA9IDE7CisgIH0KKyAgCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U29sclhtbCgpIHsKKyAgICByZXR1cm4gInNvbHItbm8tY29yZS54bWwiOworICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG9UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgY3JlYXRlQ29sbGVjdGlvbigiZGVsZXRlX2RhdGFfZGlyIiwgMSwgMSwgMSk7CisgICAgd2FpdEZvclJlY292ZXJpZXNUb0ZpbmlzaCgiZGVsZXRlX2RhdGFfZGlyIiwgZmFsc2UpOworICAgIGNsb3VkQ2xpZW50LnNldERlZmF1bHRDb2xsZWN0aW9uKCJkZWxldGVfZGF0YV9kaXIiKTsKKyAgICBjbG91ZENsaWVudC5nZXRaa1N0YXRlUmVhZGVyKCkudXBkYXRlQ2x1c3RlclN0YXRlKHRydWUpOworICAgIE5hbWVkTGlzdDxPYmplY3Q+IHJlc3BvbnNlID0gY2xvdWRDbGllbnQucXVlcnkoCisgICAgICAgIG5ldyBTb2xyUXVlcnkoKS5zZXRSZXF1ZXN0SGFuZGxlcigiL2FkbWluL3N5c3RlbSIpKS5nZXRSZXNwb25zZSgpOworICAgIE5hbWVkTGlzdDxPYmplY3Q+IGNvcmVJbmZvID0gKE5hbWVkTGlzdDxPYmplY3Q+KSByZXNwb25zZS5nZXQoImNvcmUiKTsKKyAgICBTdHJpbmcgZGF0YURpciA9IChTdHJpbmcpICgoTmFtZWRMaXN0PE9iamVjdD4pIGNvcmVJbmZvLmdldCgiZGlyZWN0b3J5IikpCisgICAgICAgIC5nZXQoImRhdGEiKTsKKworICAgIE1vZGlmaWFibGVTb2xyUGFyYW1zIHBhcmFtcyA9IG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcygpOworICAgIHBhcmFtcy5zZXQoImFjdGlvbiIsIENvbGxlY3Rpb25BY3Rpb24uREVMRVRFLnRvU3RyaW5nKCkpOworICAgIHBhcmFtcy5zZXQoIm5hbWUiLCAiZGVsZXRlX2RhdGFfZGlyIik7CisgICAgUXVlcnlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUXVlcnlSZXF1ZXN0KHBhcmFtcyk7CisgICAgcmVxdWVzdC5zZXRQYXRoKCIvYWRtaW4vY29sbGVjdGlvbnMiKTsKKyAgICBjbG91ZENsaWVudC5yZXF1ZXN0KHJlcXVlc3QpOworICAgIAorICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgY29uZi5zZXRCb29sZWFuKCJmcy5oZGZzLmltcGwuZGlzYWJsZS5jYWNoZSIsIHRydWUpOworICAgIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLm5ld0luc3RhbmNlKG5ldyBVUkkoZGF0YURpciksIGNvbmYpOworICAgIGFzc2VydEZhbHNlKAorICAgICAgICAiRGF0YSBkaXJlY3RvcnkgZXhpc3RzIGFmdGVyIGNvbGxlY3Rpb24gcmVtb3ZhbCA6ICIKKyAgICAgICAgICAgICsgZGF0YURpciwgZnMuZXhpc3RzKG5ldyBQYXRoKGRhdGFEaXIpKSk7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzQzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc0Jhc2ljRGlzdHJpYnV0ZWRaazJUZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5CYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CisKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLk5pZ2h0bHk7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGU7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGUuU2NvcGU7CisKK0BTbG93CitATmlnaHRseQorQFRocmVhZExlYWtTY29wZShTY29wZS5OT05FKSAvLyBoZGZzIGNsaWVudCBjdXJyZW50bHkgbGVha3MgdGhyZWFkKHMpCitwdWJsaWMgY2xhc3MgSGRmc0Jhc2ljRGlzdHJpYnV0ZWRaazJUZXN0IGV4dGVuZHMgQmFzaWNEaXN0cmlidXRlZFprMlRlc3QgeworICBwcml2YXRlIHN0YXRpYyBNaW5pREZTQ2x1c3RlciBkZnNDbHVzdGVyOworICAKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGZzQ2x1c3RlciA9IEhkZnNUZXN0VXRpbC5zZXR1cENsYXNzKG5ldyBGaWxlKFRFTVBfRElSLAorICAgICAgICBIZGZzQmFzaWNEaXN0cmlidXRlZFprMlRlc3QuY2xhc3MuZ2V0TmFtZSgpICsgIl8iCisgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSGRmc1Rlc3RVdGlsLnRlYXJkb3duQ2xhc3MoZGZzQ2x1c3Rlcik7CisgICAgZGZzQ2x1c3RlciA9IG51bGw7CisgIH0KKworICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YURpcihTdHJpbmcgZGF0YURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gSGRmc1Rlc3RVdGlsLmdldERhdGFEaXIoZGZzQ2x1c3RlciwgZGF0YURpcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNCYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc0Jhc2ljRGlzdHJpYnV0ZWRaa1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc0ODZkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNCYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5CYXNpY0Rpc3RyaWJ1dGVkWmtUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuTmlnaHRseTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFNsb3cKK0BOaWdodGx5CitAVGhyZWFkTGVha1Njb3BlKFNjb3BlLk5PTkUpIC8vIGhkZnMgY2xpZW50IGN1cnJlbnRseSBsZWFrcyB0aHJlYWQocykKK3B1YmxpYyBjbGFzcyBIZGZzQmFzaWNEaXN0cmlidXRlZFprVGVzdCBleHRlbmRzIEJhc2ljRGlzdHJpYnV0ZWRaa1Rlc3QgeworICBwcml2YXRlIHN0YXRpYyBNaW5pREZTQ2x1c3RlciBkZnNDbHVzdGVyOworICAKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGZzQ2x1c3RlciA9IEhkZnNUZXN0VXRpbC5zZXR1cENsYXNzKG5ldyBGaWxlKFRFTVBfRElSLAorICAgICAgICBIZGZzQmFzaWNEaXN0cmlidXRlZFprMlRlc3QuY2xhc3MuZ2V0TmFtZSgpICsgIl8iCisgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSGRmc1Rlc3RVdGlsLnRlYXJkb3duQ2xhc3MoZGZzQ2x1c3Rlcik7CisgICAgZGZzQ2x1c3RlciA9IG51bGw7CisgIH0KKworICAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YURpcihTdHJpbmcgZGF0YURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gSGRmc1Rlc3RVdGlsLmdldERhdGFEaXIoZGZzQ2x1c3RlciwgZGF0YURpcik7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc0NoYW9zTW9ua2V5U2FmZUxlYWRlclRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzQ2hhb3NNb25rZXlTYWZlTGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDk5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc0NoYW9zTW9ua2V5U2FmZUxlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbG91ZC5oZGZzOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLkNoYW9zTW9ua2V5U2FmZUxlYWRlclRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CisKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLk5pZ2h0bHk7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGU7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGUuU2NvcGU7CisKK0BTbG93CitATmlnaHRseQorQFRocmVhZExlYWtTY29wZShTY29wZS5OT05FKSAvLyBoZGZzIGNsaWVudCBjdXJyZW50bHkgbGVha3MgdGhyZWFkKHMpCitwdWJsaWMgY2xhc3MgSGRmc0NoYW9zTW9ua2V5U2FmZUxlYWRlclRlc3QgZXh0ZW5kcyBDaGFvc01vbmtleVNhZmVMZWFkZXJUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgTWluaURGU0NsdXN0ZXIgZGZzQ2x1c3RlcjsKKyAgCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGRmc0NsdXN0ZXIgPSBIZGZzVGVzdFV0aWwuc2V0dXBDbGFzcyhuZXcgRmlsZShURU1QX0RJUiwKKyAgICAgICAgSGRmc0Jhc2ljRGlzdHJpYnV0ZWRaazJUZXN0LmNsYXNzLmdldE5hbWUoKSArICJfIgorICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICB9CisgIAorICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhcmRvd25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIEhkZnNUZXN0VXRpbC50ZWFyZG93bkNsYXNzKGRmc0NsdXN0ZXIpOworICAgIGRmc0NsdXN0ZXIgPSBudWxsOworICB9CisgIAorICBAQmVmb3JlCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisgICAgCisgICAgLy8gc3VwZXIgY2xhc3MgbWF5IGhhcmQgY29kZSBkaXJlY3RvcnkKKyAgICB1c2VGYWN0b3J5KCJvcmcuYXBhY2hlLnNvbHIuY29yZS5IZGZzRGlyZWN0b3J5RmFjdG9yeSIpOworICB9CisKKyAgCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFEaXIoU3RyaW5nIGRhdGFEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEhkZnNUZXN0VXRpbC5nZXREYXRhRGlyKGRmc0NsdXN0ZXIsIGRhdGFEaXIpOworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNDb2xsZWN0aW9uc0FQSURpc3RyaWJ1dGVkWmtUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc0NvbGxlY3Rpb25zQVBJRGlzdHJpYnV0ZWRaa1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZkZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNDb2xsZWN0aW9uc0FQSURpc3RyaWJ1dGVkWmtUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5Db2xsZWN0aW9uc0FQSURpc3RyaWJ1dGVkWmtUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuTmlnaHRseTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFNsb3cKK0BOaWdodGx5CitAVGhyZWFkTGVha1Njb3BlKFNjb3BlLk5PTkUpIC8vIGhkZnMgY2xpZW50IGN1cnJlbnRseSBsZWFrcyB0aHJlYWQocykKK3B1YmxpYyBjbGFzcyBIZGZzQ29sbGVjdGlvbnNBUElEaXN0cmlidXRlZFprVGVzdCBleHRlbmRzIENvbGxlY3Rpb25zQVBJRGlzdHJpYnV0ZWRaa1Rlc3QgeworICBwcml2YXRlIHN0YXRpYyBNaW5pREZTQ2x1c3RlciBkZnNDbHVzdGVyOworICAKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGZzQ2x1c3RlciA9IEhkZnNUZXN0VXRpbC5zZXR1cENsYXNzKG5ldyBGaWxlKFRFTVBfRElSLAorICAgICAgICBIZGZzQ29sbGVjdGlvbnNBUElEaXN0cmlidXRlZFprVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiXyIKKyAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuaGRmcy5ob21lIiwgZGZzQ2x1c3Rlci5nZXRVUkkoKS50b1N0cmluZygpICsgIi9zb2xyIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLmhkZnMuYmxvY2tjYWNoZS5lbmFibGVkIiwgImZhbHNlIik7CisgICAgCisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSGRmc1Rlc3RVdGlsLnRlYXJkb3duQ2xhc3MoZGZzQ2x1c3Rlcik7CisgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIuaGRmcy5ob21lIik7CisgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIuaGRmcy5ibG9ja2NhY2hlLmVuYWJsZWQiKTsKKyAgICBkZnNDbHVzdGVyID0gbnVsbDsKKyAgfQorCisgIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhRGlyKFN0cmluZyBkYXRhRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBIZGZzVGVzdFV0aWwuZ2V0RGF0YURpcihkZnNDbHVzdGVyLCBkYXRhRGlyKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc1JlY292ZXJ5WmtUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc1JlY292ZXJ5WmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZTgyZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzUmVjb3Zlcnlaa1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbG91ZC5oZGZzOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLlJlY292ZXJ5WmtUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuTmlnaHRseTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFNsb3cKK0BOaWdodGx5CitAVGhyZWFkTGVha1Njb3BlKFNjb3BlLk5PTkUpIC8vIGhkZnMgY2xpZW50IGN1cnJlbnRseSBsZWFrcyB0aHJlYWQocykKK3B1YmxpYyBjbGFzcyBIZGZzUmVjb3Zlcnlaa1Rlc3QgZXh0ZW5kcyBSZWNvdmVyeVprVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXI7CisgIAorICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBkZnNDbHVzdGVyID0gSGRmc1Rlc3RVdGlsLnNldHVwQ2xhc3MobmV3IEZpbGUoVEVNUF9ESVIsCisgICAgICAgIEhkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiXyIKKyAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuaGRmcy5ibG9ja2NhY2hlLmJsb2Nrc3BlcmJhbmsiLCAiMjA0OCIpOworICB9CisgIAorICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhcmRvd25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIEhkZnNUZXN0VXRpbC50ZWFyZG93bkNsYXNzKGRmc0NsdXN0ZXIpOworICAgIGRmc0NsdXN0ZXIgPSBudWxsOworICB9CisKKyAgCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFEaXIoU3RyaW5nIGRhdGFEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEhkZnNUZXN0VXRpbC5nZXREYXRhRGlyKGRmc0NsdXN0ZXIsIGRhdGFEaXIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzU3luY1NsaWNlVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNTeW5jU2xpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhNzNiZAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzU3luY1NsaWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNsb3VkLmhkZnM7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5MdWNlbmVUZXN0Q2FzZS5TbG93OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5TeW5jU2xpY2VUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5OaWdodGx5OworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuVGhyZWFkTGVha1Njb3BlOworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuVGhyZWFkTGVha1Njb3BlLlNjb3BlOworCitAU2xvdworQE5pZ2h0bHkKK0BUaHJlYWRMZWFrU2NvcGUoU2NvcGUuTk9ORSkgLy8gaGRmcyBjbGllbnQgY3VycmVudGx5IGxlYWtzIHRocmVhZChzKQorcHVibGljIGNsYXNzIEhkZnNTeW5jU2xpY2VUZXN0IGV4dGVuZHMgU3luY1NsaWNlVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXI7CisgIAorICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBkZnNDbHVzdGVyID0gSGRmc1Rlc3RVdGlsLnNldHVwQ2xhc3MobmV3IEZpbGUoVEVNUF9ESVIsCisgICAgICAgIEhkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiXyIKKyAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgfQorICAKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJkb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBIZGZzVGVzdFV0aWwudGVhcmRvd25DbGFzcyhkZnNDbHVzdGVyKTsKKyAgICBkZnNDbHVzdGVyID0gbnVsbDsKKyAgfQorICAKKyAgQEJlZm9yZQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZXRVcCgpOworICB9CisKKyAgCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFEaXIoU3RyaW5nIGRhdGFEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEhkZnNUZXN0VXRpbC5nZXREYXRhRGlyKGRmc0NsdXN0ZXIsIGRhdGFEaXIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzVGVzdFV0aWwuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGE4M2VhCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbG91ZC9oZGZzL0hkZnNUZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNsb3VkLmhkZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5oZGZzLk1pbmlERlNDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgSGRmc1Rlc3RVdGlsIHsKKyAgCisgIHByaXZhdGUgc3RhdGljIExvY2FsZSBzYXZlZExvY2FsZTsKKworICBwdWJsaWMgc3RhdGljIE1pbmlERlNDbHVzdGVyIHNldHVwQ2xhc3MoU3RyaW5nIGRhdGFEaXIpIHRocm93cyBFeGNlcHRpb24geworICAgIEx1Y2VuZVRlc3RDYXNlLmFzc3VtZUZhbHNlKCJIREZTIHRlc3RzIG9uIFdpbmRvd3MgcmVxdWlyZSBDeWd3aW4iLCBDb25zdGFudHMuV0lORE9XUyk7CisgICAgTHVjZW5lVGVzdENhc2UuYXNzdW1lRmFsc2UoIkhERlMgZG8gbm90IHdvcmsgd2VsbCB3aXRoIEZyZWVCU0QgYmxhY2tob2xlIHNldHVwIiwgQ29uc3RhbnRzLkZSRUVfQlNEKTsKKyAgIC8vIEx1Y2VuZVRlc3RDYXNlLmFzc3VtZUZhbHNlKCJIREZTIHRlc3RzIG9uIFdpbmRvd3MgcmVxdWlyZSBDeWd3aW4iLCBDb25zdGFudHMuRik7CisgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkYXRhRGlyKTsKKyAgICBuZXcgRmlsZShkYXRhRGlyKS5ta2RpcnMoKTsKKworICAgIHNhdmVkTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAvLyBUT0RPOiB3ZSBIQUNLIGFyb3VuZCBIQURPT1AtOTY0MworICAgIExvY2FsZS5zZXREZWZhdWx0KExvY2FsZS5FTkdMSVNIKTsKKyAgICAKKyAgICBpbnQgZGF0YU5vZGVzID0gMjsKKyAgICAKKyAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIGNvbmYuc2V0KCJkZnMuYmxvY2suYWNjZXNzLnRva2VuLmVuYWJsZSIsICJmYWxzZSIpOworICAgIGNvbmYuc2V0KCJkZnMucGVybWlzc2lvbnMuZW5hYmxlZCIsICJmYWxzZSIpOworICAgIGNvbmYuc2V0KCJoYWRvb3Auc2VjdXJpdHkuYXV0aGVudGljYXRpb24iLCAic2ltcGxlIik7CisgICAgY29uZi5zZXQoImhkZnMubWluaWRmcy5iYXNlZGlyIiwgZGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyAiaGRmc0Jhc2VEaXIiKTsKKyAgICBjb25mLnNldCgiZGZzLm5hbWVub2RlLm5hbWUuZGlyIiwgZGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyAibmFtZU5vZGVOYW1lRGlyIik7CisgICAgCisgICAgCisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJ0ZXN0LmJ1aWxkLmRhdGEiLCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJoZGZzIiArIEZpbGUuc2VwYXJhdG9yICsgImJ1aWxkIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJ0ZXN0LmNhY2hlLmRhdGEiLCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJoZGZzIiArIEZpbGUuc2VwYXJhdG9yICsgImNhY2hlIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLmxvY2sudHlwZSIsICJoZGZzIik7CisgICAgCisgICAgTWluaURGU0NsdXN0ZXIgZGZzQ2x1c3RlciA9IG5ldyBNaW5pREZTQ2x1c3Rlcihjb25mLCBkYXRhTm9kZXMsIHRydWUsIG51bGwpOworICAgIAorICAgIFNvbHJUZXN0Q2FzZUo0LnVzZUZhY3RvcnkoIm9yZy5hcGFjaGUuc29sci5jb3JlLkhkZnNEaXJlY3RvcnlGYWN0b3J5Iik7CisgICAgCisgICAgcmV0dXJuIGRmc0NsdXN0ZXI7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bkNsYXNzKE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgIFNvbHJUZXN0Q2FzZUo0LnJlc2V0RmFjdG9yeSgpOworICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJzb2xyLmxvY2sudHlwZSIpOworICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJ0ZXN0LmJ1aWxkLmRhdGEiKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgidGVzdC5jYWNoZS5kYXRhIik7CisgICAgaWYgKGRmc0NsdXN0ZXIgIT0gbnVsbCkgeworICAgICAgZGZzQ2x1c3Rlci5zaHV0ZG93bigpOworICAgIH0KKyAgICAKKyAgICAvLyBUT0RPOiB3ZSBIQUNLIGFyb3VuZCBIQURPT1AtOTY0MworICAgIGlmIChzYXZlZExvY2FsZSAhPSBudWxsKSB7CisgICAgICBMb2NhbGUuc2V0RGVmYXVsdChzYXZlZExvY2FsZSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRhRGlyKE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXIsIFN0cmluZyBkYXRhRGlyKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBVUkkgdXJpID0gZGZzQ2x1c3Rlci5nZXRVUkkoKTsKKyAgICBTdHJpbmcgZGlyID0gdXJpLnRvU3RyaW5nKCkKKyAgICAgICAgKyAiLyIKKyAgICAgICAgKyBuZXcgRmlsZShkYXRhRGlyKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIjoiLCAiXyIpCisgICAgICAgICAgICAucmVwbGFjZUFsbCgiLyIsICJfIik7CisgICAgcmV0dXJuIGRpcjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc1VubG9hZERpc3RyaWJ1dGVkWmtUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL2hkZnMvSGRmc1VubG9hZERpc3RyaWJ1dGVkWmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiNzU4MAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvaGRmcy9IZGZzVW5sb2FkRGlzdHJpYnV0ZWRaa1Rlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbG91ZC5oZGZzOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlLlNsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsb3VkLlVubG9hZERpc3RyaWJ1dGVkWmtUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuTmlnaHRseTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFNsb3cKK0BOaWdodGx5CitAVGhyZWFkTGVha1Njb3BlKFNjb3BlLk5PTkUpIC8vIGhkZnMgY2xpZW50IGN1cnJlbnRseSBsZWFrcyB0aHJlYWQocykKK3B1YmxpYyBjbGFzcyBIZGZzVW5sb2FkRGlzdHJpYnV0ZWRaa1Rlc3QgZXh0ZW5kcyBVbmxvYWREaXN0cmlidXRlZFprVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXI7CisgIAorICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3N1bWVGYWxzZSgiRklYTUU6IFRoaXMgdGVzdCBmYWlscyB1bmRlciBKYXZhIDggYWxsIHRoZSB0aW1lLCBzZWUgU09MUi00NzExIiwgQ29uc3RhbnRzLkpSRV9JU19NSU5JTVVNX0pBVkE4KTsKKyAgICAKKyAgICBkZnNDbHVzdGVyID0gSGRmc1Rlc3RVdGlsLnNldHVwQ2xhc3MobmV3IEZpbGUoVEVNUF9ESVIsCisgICAgICAgIEhkZnNVbmxvYWREaXN0cmlidXRlZFprVGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiXyIKKyAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgfQorICAKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJkb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBIZGZzVGVzdFV0aWwudGVhcmRvd25DbGFzcyhkZnNDbHVzdGVyKTsKKyAgICBkZnNDbHVzdGVyID0gbnVsbDsKKyAgfQorCisgIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhRGlyKFN0cmluZyBkYXRhRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBIZGZzVGVzdFV0aWwuZ2V0RGF0YURpcihkZnNDbHVzdGVyLCBkYXRhRGlyKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQWJzdHJhY3RCYWRDb25maWdUZXN0QmFzZS5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL0Fic3RyYWN0QmFkQ29uZmlnVGVzdEJhc2UuamF2YQppbmRleCA5N2YyOTRlLi4xZWMyZmYzIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQWJzdHJhY3RCYWRDb25maWdUZXN0QmFzZS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9BYnN0cmFjdEJhZENvbmZpZ1Rlc3RCYXNlLmphdmEKQEAgLTE4LDkgKzE4LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbi5FcnJvckNvZGU7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYWRDb25maWdUZXN0QmFzZSBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKQEAgLTUwLDI2ICs0OSwzNyBAQAogCiAgICAgaWdub3JlRXhjZXB0aW9uKFBhdHRlcm4ucXVvdGUoZXJyU3RyaW5nKSk7CiAgICAgdHJ5IHsKKwogICAgICAgaWYgKG51bGwgPT0gc29sckhvbWUpIHsKICAgICAgICAgaW5pdENvcmUoIHNvbHJjb25maWdGaWxlLCBzY2hlbWFGaWxlICk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBpbml0Q29yZSggc29scmNvbmZpZ0ZpbGUsIHNjaGVtYUZpbGUsIHNvbHJIb21lICk7CiAgICAgICB9Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGZvciAoVGhyb3dhYmxlIHQgPSBlOyB0ICE9IG51bGw7IHQgPSB0LmdldENhdXNlKCkpIHsKLSAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCBvdXQgaWYgd2UgZm91bmQgd2hhdCB3ZSBleHBlY3RlZAotICAgICAgICBpZiAodC5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiAtMSAhPSB0LmdldE1lc3NhZ2UoKS5pbmRleE9mKGVyclN0cmluZykpIHJldHVybjsKLSAgICAgIH0KIAotICAgICAgLy8gb3RoZXJ3aXNlLCByZXRocm93IGl0LCBwb3NzaWJseSBjb21wbGV0bGV5IHVucmVsYXRlZAotICAgICAgdGhyb3cgbmV3IFNvbHJFeGNlcHRpb24KLSAgICAgICAgKEVycm9yQ29kZS5TRVJWRVJfRVJST1IsIAotICAgICAgICAgIlVuZXhwZWN0ZWQgZXJyb3IsIGV4cGVjdGVkIGVycm9yIG1hdGNoaW5nOiAiICsgZXJyU3RyaW5nLCBlKTsKLSAgICB9IGZpbmFsbHkgeworICAgICAgQ29yZUNvbnRhaW5lciBjYyA9IGguZ2V0Q29yZUNvbnRhaW5lcigpOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBFeGNlcHRpb24+IGVudHJ5IDogY2MuZ2V0Q29yZUluaXRGYWlsdXJlcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgaWYgKG1hdGNoZXMoZW50cnkuZ2V0VmFsdWUoKSwgZXJyU3RyaW5nKSkKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgaWYgKG1hdGNoZXMoZSwgZXJyU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgdGhyb3cgZTsKKyAgICB9CisgICAgZmluYWxseSB7CiAgICAgICBkZWxldGVDb3JlKCk7CiAgICAgICByZXNldEV4Y2VwdGlvbklnbm9yZXMoKTsKICAgICB9CiAgICAgZmFpbCgiRGlkIG5vdCBlbmNvdW50ZXIgYW55IGV4Y2VwdGlvbiBmcm9tOiAiICsgc29scmNvbmZpZ0ZpbGUgKyAiIHVzaW5nICIgKyBzY2hlbWFGaWxlKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhFeGNlcHRpb24gZSwgU3RyaW5nIGVyclN0cmluZykgeworICAgIGZvciAoVGhyb3dhYmxlIHQgPSBlOyB0ICE9IG51bGw7IHQgPSB0LmdldENhdXNlKCkpIHsKKyAgICAgIGlmICh0LmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIC0xICE9IHQuZ2V0TWVzc2FnZSgpLmluZGV4T2YoZXJyU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29yZUNvbnRhaW5lckNvcmVJbml0RmFpbHVyZXNUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvQ29yZUNvbnRhaW5lckNvcmVJbml0RmFpbHVyZXNUZXN0LmphdmEKaW5kZXggMWE1YTU1Yi4uNjIyY2Y0YyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL0NvcmVDb250YWluZXJDb3JlSW5pdEZhaWx1cmVzVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9Db3JlQ29udGFpbmVyQ29yZUluaXRGYWlsdXJlc1Rlc3QuamF2YQpAQCAtMTcsMjMgKzE3LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSU9VdGlsczsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7Ci0KK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CiAKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIENvcmVDb250YWluZXJDb3JlSW5pdEZhaWx1cmVzVGVzdCBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKICAgCkBAIC00NCw4ICszOCw3IEBACiAgICAgLy8gd291bGQgYmUgbmljZSB0byBkbyB0aGlzIGluIGFuIEBCZWZvcmUgbWV0aG9kLAogICAgIC8vIGJ1dCBqdW5pdCBkb2Vzbid0IGxldCBAQmVmb3JlIG1ldGhvZHMgaGF2ZSB0ZXN0IG5hbWVzCiAgICAgc29sckhvbWUgPSBuZXcgRmlsZShURU1QX0RJUiwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfIiArIGRpclN1ZmZpeCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIG1rZGlycyBzb2xyaG9tZSIsIHNvbHJIb21lLm1rZGlycygpKTsKLSAgICBjYyA9IG5ldyBDb3JlQ29udGFpbmVyKHNvbHJIb21lLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbWtkaXJzIHNvbHJob21lIFsiICsgc29sckhvbWUgKyAiXSIsIHNvbHJIb21lLm1rZGlycygpKTsKICAgfQogCiAgIEBBZnRlcgpAQCAtNjgsNyArNjEsNyBAQAogICAgIE1hcDxTdHJpbmcsRXhjZXB0aW9uPiBmYWlsdXJlcyA9IG51bGw7CiAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGNvcmVzID0gbnVsbDsKICAgICBFeGNlcHRpb24gZmFpbCA9IG51bGw7Ci0gICAgCisKICAgICBpbml0KCJlbXB0eV9mbG93Iik7CiAKICAgICAvLyBzb2xyLnhtbApAQCAtNzcsNyArNzAsOCBAQAogCiAgICAgLy8gLS0tLQogICAgIC8vIGluaXQgdGhlIENvcmVDb250YWluZXIKLSAgICBjYy5sb2FkKHNvbHJIb21lLmdldEFic29sdXRlUGF0aCgpLCBzb2xyWG1sKTsKKyAgICBjYyA9IG5ldyBDb3JlQ29udGFpbmVyKHNvbHJIb21lLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBjYy5sb2FkKCk7CiAKICAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgdGhlIGNvcmVzIHdlIGV4cGVjdAogICAgIGNvcmVzID0gY2MuZ2V0Q29yZU5hbWVzKCk7CkBAIC0xNTAsMjIgKzE0NCwyMyBAQAogICAgIEZpbGVVdGlscy53cml0ZShzb2xyWG1sLCBCQURfU09MUl9YTUwsIElPVXRpbHMuQ0hBUlNFVF9VVEZfOC50b1N0cmluZygpKTsKIAogICAgIC8vIG91ciAib2siIGNvbGxlY3Rpb24KLSAgICBGaWxlVXRpbHMuY29weUZpbGUoZ2V0RmlsZSgic29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYmFzaWMueG1sIiksCisgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGdldEZpbGUoInNvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWRlZmF1bHRzLnhtbCIpLAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZShzb2xySG9tZSwgImNvbF9vayIsICJjb25mIiwgInNvbHJjb25maWcueG1sIikpOwogICAgIEZpbGVVdGlscy5jb3B5RmlsZShnZXRGaWxlKCJzb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLW1pbmltYWwueG1sIiksCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlKHNvbHJIb21lLCAiY29sX29rIiwgImNvbmYiLCAic2NoZW1hLnhtbCIpKTsKLSAgICAKKwogICAgIC8vIG91ciAiYmFkIiBjb2xsZWN0aW9uCiAgICAgaWdub3JlRXhjZXB0aW9uKFBhdHRlcm4ucXVvdGUoIkR1bW15TWVyZ2VQb2xpY3kiKSk7CiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGdldEZpbGUoInNvbHIvY29sbGVjdGlvbjEvY29uZi9iYWQtbXAtc29scmNvbmZpZy54bWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGUoc29sckhvbWUsICJjb2xfYmFkIiwgImNvbmYiLCAic29scmNvbmZpZy54bWwiKSk7CiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGdldEZpbGUoInNvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEtbWluaW1hbC54bWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGUoc29sckhvbWUsICJjb2xfYmFkIiwgImNvbmYiLCAic2NoZW1hLnhtbCIpKTsKLSAgICAKLSAgICAKKworCiAgICAgLy8gLS0tLS0KICAgICAvLyBpbml0IHRoZSAgQ29yZUNvbnRhaW5lciB3aXRoIHRoZSBtaXggb2Ygb2svYmFkIGNvcmVzCi0gICAgY2MubG9hZChzb2xySG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSwgc29sclhtbCk7CisgICAgY2MgPSBuZXcgQ29yZUNvbnRhaW5lcihzb2xySG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgY2MubG9hZCgpOwogICAgIAogICAgIC8vIGNoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgY29yZXMgd2UgZXhwZWN0CiAgICAgY29yZXMgPSBjYy5nZXRDb3JlTmFtZXMoKTsKQEAgLTE5OCw3ICsxOTMsNyBAQAogCiAgICAgLy8gLS0tLS0KICAgICAvLyAiZml4IiB0aGUgYmFkIGNvbGxlY3Rpb24KLSAgICBGaWxlVXRpbHMuY29weUZpbGUoZ2V0RmlsZSgic29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctYmFzaWMueG1sIiksCisgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGdldEZpbGUoInNvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLWRlZmF1bHRzLnhtbCIpLAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZShzb2xySG9tZSwgImNvbF9iYWQiLCAiY29uZiIsICJzb2xyY29uZmlnLnhtbCIpKTsKICAgICBmaW5hbCBDb3JlRGVzY3JpcHRvciBmaXhlZCA9IG5ldyBDb3JlRGVzY3JpcHRvcihjYywgImNvbF9iYWQiLCAiY29sX2JhZCIpOwogICAgIGNjLnJlZ2lzdGVyKCJjb2xfYmFkIiwgY2MuY3JlYXRlKGZpeGVkKSwgZmFsc2UpOwpAQCAtMjkzLDggKzI4OCw4IEBACiAgICAgICBmYWlsKCJjb3JydXB0IHNvbHJjb25maWcueG1sIGZhaWxlZCB0byB0cmlnZ2VyIGV4Y2VwdGlvbiBmcm9tIHJlbG9hZCIpOwogICAgIH0gY2F0Y2ggKFNvbHJFeGNlcHRpb24gZSkgewogICAgICAgYXNzZXJ0VHJ1ZSgiV2UncmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHdyYXBwZWQgU0FYUGFyc2VyRXhjZXB0aW9uIGhlcmUsIGJ1dCB3ZSBkb24ndCIsCi0gICAgICAgICAgZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pOwotICAgICAgU0FYUGFyc2VFeGNlcHRpb24gc2UgPSAoU0FYUGFyc2VFeGNlcHRpb24pZS5nZXRDYXVzZSgpOworICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pOworICAgICAgU0FYUGFyc2VFeGNlcHRpb24gc2UgPSAoU0FYUGFyc2VFeGNlcHRpb24pZS5nZXRDYXVzZSgpLmdldENhdXNlKCk7CiAgICAgICBhc3NlcnRUcnVlKCJyZWxvYWQgZXhjZXB0aW9uIGRvZXNuJ3QgcmVmZXIgdG8gc2xyY29uZmlnLnhtbCAiICsgc2UuZ2V0U3lzdGVtSWQoKSwKICAgICAgICAgICAwIDwgc2UuZ2V0U3lzdGVtSWQoKS5pbmRleE9mKCJzb2xyY29uZmlnLnhtbCIpKTsKIApAQCAtMzE4LDEzICszMTMsMTMgQEAKICAgICBmYWlsID0gZmFpbHVyZXMuZ2V0KCJjb2xfYmFkIik7CiAgICAgYXNzZXJ0Tm90TnVsbCgibnVsbCBmYWlsdXJlIGZvciB0ZXN0IGNvcmUiLCBmYWlsKTsKICAgICBhc3NlcnRUcnVlKCJpbml0IGZhaWx1cmUgaXNuJ3QgU0FYUGFyc2VFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgZmFpbCBpbnN0YW5jZW9mIFNBWFBhcnNlRXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgIGZhaWwuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNBWFBhcnNlRXhjZXB0aW9uKTsKICAgICBhc3NlcnRUcnVlKCJpbml0IGZhaWx1cmUgZG9lc24ndCBtZW50aW9uIHByb2JsZW06ICIgKyBmYWlsLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAwIDwgKChTQVhQYXJzZUV4Y2VwdGlvbilmYWlsKS5nZXRTeXN0ZW1JZCgpLmluZGV4T2YoInNvbHJjb25maWcueG1sIikpOworICAgICAgICAgICAgICAgMCA8ICgoU0FYUGFyc2VFeGNlcHRpb24pZmFpbC5nZXRDYXVzZSgpKS5nZXRTeXN0ZW1JZCgpLmluZGV4T2YoInNvbHJjb25maWcueG1sIikpOwogCiAgICAgLy8gLS0tLQogICAgIC8vIGZpeCBjb2xfYmFkJ3MgY29uZmlnIChhZ2FpbikgYW5kIFJFTE9BRCB0byBmaXggZmFpbHVyZQotICAgIEZpbGVVdGlscy5jb3B5RmlsZShnZXRGaWxlKCJzb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1iYXNpYy54bWwiKSwKKyAgICBGaWxlVXRpbHMuY29weUZpbGUoZ2V0RmlsZSgic29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctZGVmYXVsdHMueG1sIiksCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlKHNvbHJIb21lLCAiY29sX2JhZCIsICJjb25mIiwgInNvbHJjb25maWcueG1sIikpOwogICAgIGNjLnJlbG9hZCgiY29sX2JhZCIpOwogICAgIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL09wZW5DbG9zZUNvcmVTdHJlc3NUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvT3BlbkNsb3NlQ29yZVN0cmVzc1Rlc3QuamF2YQppbmRleCA0ZmY1OGQzLi4zZGIwZjYxIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvT3BlbkNsb3NlQ29yZVN0cmVzc1Rlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvT3BlbkNsb3NlQ29yZVN0cmVzc1Rlc3QuamF2YQpAQCAtMjA3LDkgKzIwNywxMCBAQAogICAgICAgICB9CiAgICAgICB9IHdoaWxlIChzZWNvbmRzUmVtYWluaW5nID4gMCk7CiAKLSAgICAgIGFzc2VydFRydWUoIldlIGRpZG4ndCBpbmRleCBhbnkgZG9jdW1lbnRzLCBzb21ldGhpbmdzIHJlYWxseSBtZXNzc2VkIHVwIiwgY3VtdWxhdGl2ZURvY3MgPiAwKTsKKyAgICAgIGFzc2VydFRydWUoIldlIGRpZG4ndCBpbmRleCBhbnkgZG9jdW1lbnRzLCBzb21ldGhpbmdzIHJlYWxseSBtZXNzZWQgdXAiLCBjdW11bGF0aXZlRG9jcyA+IDApOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIik7CiAgICAgfQogICB9CiAKQEAgLTI0MSw2ICsyNDIsOCBAQAogICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0ZXN0Q29uZiwgInNjaGVtYS10aW55LnhtbCIpLCBuZXcgRmlsZShjb25mLCAic2NoZW1hLXRpbnkueG1sIikpOwogCiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRlc3RDb25mLCAic29scmNvbmZpZy1taW5pbWFsLnhtbCIpLCBuZXcgRmlsZShjb25mLCAic29scmNvbmZpZy1taW5pbWFsLnhtbCIpKTsKKyAgICBGaWxlVXRpbHMuY29weUZpbGUobmV3IEZpbGUodGVzdENvbmYsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiksCisgICAgICAgIG5ldyBGaWxlKGNvbmYsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIikpOwogCiAgICAgaWYgKCFvbGRTdHlsZSkgewogICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRlc3RTcmNSb290LCAiY29uZi9jb3JlLnByb3BlcnRpZXMiKSwgbmV3IEZpbGUoY29yZURpciwgImNvcmUucHJvcGVydGllcyIpKTsKQEAgLTQ3OSw3ICs0ODIsNyBAQAogICAgIHRyeSB7CiAgICAgICBRdWVyeVJlc3BvbnNlIHJlc3BvbnNlID0gc2VydmVyLnF1ZXJ5KHBhcmFtcyk7CiAgICAgICBudW1Gb3VuZCA9IHJlc3BvbnNlLmdldFJlc3VsdHMoKS5nZXROdW1Gb3VuZCgpOwotICAgIH0gY2F0Y2ggKFNvbHJTZXJ2ZXJFeGNlcHRpb24gZSkgeworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgIH0KICAgICByZXR1cm4gbnVtRm91bmQ7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvUXVlcnlSZXN1bHRLZXlUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvUXVlcnlSZXN1bHRLZXlUZXN0LmphdmEKaW5kZXggMzcwMmQyNS4uOGFkMzlkNSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1F1ZXJ5UmVzdWx0S2V5VGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9RdWVyeVJlc3VsdEtleVRlc3QuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICAgIC8vIHRoZSBoYXNoY29kZSBzaG91bGQgYmUgdGhlIHNhbWUgZXZlbiB3aGVuIHRoZSBsaXN0CiAgICAgLy8gb2YgZmlsdGVycyBpcyBpbiBhIGRpZmZlcmVudCBvcmRlcgogICAgIAotICAgIFNvcnQgc29ydCA9IG5ldyBTb3J0KG5ldyBTb3J0RmllbGQoInRlc3QiLCBTb3J0RmllbGQuVHlwZS5CWVRFKSk7CisgICAgU29ydCBzb3J0ID0gbmV3IFNvcnQobmV3IFNvcnRGaWVsZCgidGVzdCIsIFNvcnRGaWVsZC5UeXBlLklOVCkpOwogICAgIExpc3Q8UXVlcnk+IGZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PFF1ZXJ5PigpOwogICAgIGZpbHRlcnMuYWRkKG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oInRlc3QiLCAiZmllbGQiKSkpOwogICAgIGZpbHRlcnMuYWRkKG5ldyBUZXJtUXVlcnkobmV3IFRlcm0oInRlc3QyIiwgImZpZWxkMiIpKSk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckNvcmVDaGVja0xvY2tPblN0YXJ0dXBUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvU29sckNvcmVDaGVja0xvY2tPblN0YXJ0dXBUZXN0LmphdmEKaW5kZXggZTY5Y2UyMy4uYzFlYzhmMSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1NvbHJDb3JlQ2hlY2tMb2NrT25TdGFydHVwVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9Tb2xyQ29yZUNoZWNrTG9ja09uU3RhcnR1cFRlc3QuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBjbGFzcyBTb2xyQ29yZUNoZWNrTG9ja09uU3RhcnR1cFRlc3QgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CiAKQEAgLTYyLDEzICs2Myw5IEBACiAgICAgdHJ5IHsKICAgICAgIC8vb3BlbmluZyBhIG5ldyBjb3JlIG9uIHRoZSBzYW1lIGluZGV4CiAgICAgICBpbml0Q29yZSgic29scmNvbmZpZy1zaW1wbGVsb2NrLnhtbCIsICJzY2hlbWEueG1sIik7CisgICAgICBpZiAoY2hlY2tGb3JDb3JlSW5pdEV4Y2VwdGlvbihMb2NrT2J0YWluRmFpbGVkRXhjZXB0aW9uLmNsYXNzKSkKKyAgICAgICAgcmV0dXJuOwogICAgICAgZmFpbCgiRXhwZWN0ZWQgIiArIExvY2tPYnRhaW5GYWlsZWRFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbik7Ci0gICAgICBhc3NlcnROb3ROdWxsKHQuZ2V0Q2F1c2UoKSk7Ci0gICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pOwotICAgICAgYXNzZXJ0Tm90TnVsbCh0LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSk7Ci0gICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpLnRvU3RyaW5nKCksIHQuZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTG9ja09idGFpbkZhaWxlZEV4Y2VwdGlvbik7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGluZGV4V3JpdGVyLmNsb3NlKCk7CiAgICAgICBkaXJlY3RvcnkuY2xvc2UoKTsKQEAgLTc5LDI0ICs3NiwzMyBAQAogICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlTG9ja0Vycm9yT25TdGFydHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICBEaXJlY3RvcnkgZGlyZWN0b3J5ID0gbmV3RlNEaXJlY3RvcnkobmV3IEZpbGUoZGF0YURpciwgImluZGV4IiksIG5ldyBOYXRpdmVGU0xvY2tGYWN0b3J5KCkpOworICAgIEZpbGUgaW5kZXhEaXIgPSBuZXcgRmlsZShkYXRhRGlyLCAiaW5kZXgiKTsKKyAgICBsb2cuaW5mbygiQWNxdWlyaW5nIGxvY2sgb24ge30iLCBpbmRleERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgRGlyZWN0b3J5IGRpcmVjdG9yeSA9IG5ld0ZTRGlyZWN0b3J5KGluZGV4RGlyLCBuZXcgTmF0aXZlRlNMb2NrRmFjdG9yeSgpKTsKICAgICAvL2NyZWF0ZXMgYSBuZXcgSW5kZXhXcml0ZXIgd2l0aG91dCByZWxlYXNpbmcgdGhlIGxvY2sgeWV0CiAgICAgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoZGlyZWN0b3J5LCBuZXcgSW5kZXhXcml0ZXJDb25maWcoVmVyc2lvbi5MVUNFTkVfNDAsIG51bGwpKTsKIAogICAgIHRyeSB7CiAgICAgICAvL29wZW5pbmcgYSBuZXcgY29yZSBvbiB0aGUgc2FtZSBpbmRleAogICAgICAgaW5pdENvcmUoInNvbHJjb25maWctbmF0aXZlbG9jay54bWwiLCAic2NoZW1hLnhtbCIpOworICAgICAgQ29yZUNvbnRhaW5lciBjYyA9IGguZ2V0Q29yZUNvbnRhaW5lcigpOworICAgICAgaWYgKGNoZWNrRm9yQ29yZUluaXRFeGNlcHRpb24oTG9ja09idGFpbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykpCisgICAgICAgIHJldHVybjsKICAgICAgIGZhaWwoIkV4cGVjdGVkICIgKyBMb2NrT2J0YWluRmFpbGVkRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgfSBjYXRjaChUaHJvd2FibGUgdCkgewotICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbik7Ci0gICAgICBhc3NlcnROb3ROdWxsKHQuZ2V0Q2F1c2UoKSk7Ci0gICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pOwotICAgICAgYXNzZXJ0Tm90TnVsbCh0LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSk7Ci0gICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgIExvY2tPYnRhaW5GYWlsZWRFeGNlcHRpb24pOwogICAgIH0gZmluYWxseSB7CiAgICAgICBpbmRleFdyaXRlci5jbG9zZSgpOwogICAgICAgZGlyZWN0b3J5LmNsb3NlKCk7CiAgICAgICBkZWxldGVDb3JlKCk7CiAgICAgfQogICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9yQ29yZUluaXRFeGNlcHRpb24oQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbj4gY2xhenopIHsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEV4Y2VwdGlvbj4gZW50cnkgOiBoLmdldENvcmVDb250YWluZXIoKS5nZXRDb3JlSW5pdEZhaWx1cmVzKCkuZW50cnlTZXQoKSkgeworICAgICAgZm9yIChUaHJvd2FibGUgdCA9IGVudHJ5LmdldFZhbHVlKCk7IHQgIT0gbnVsbDsgdCA9IHQuZ2V0Q2F1c2UoKSkgeworICAgICAgICBpZiAoY2xhenouaXNJbnN0YW5jZSh0KSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CiB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdEFyYml0cmFyeUluZGV4RGlyLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdEFyYml0cmFyeUluZGV4RGlyLmphdmEKaW5kZXggNTgyMDU5Ny4uMmYyMTMzMyAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RBcmJpdHJhcnlJbmRleERpci5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0QXJiaXRyYXJ5SW5kZXhEaXIuamF2YQpAQCAtNTAsNiArNTAsNyBAQAogICBzdGF0aWMgU3RyaW5nIHNhdmVkRmFjdG9yeTsKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBzYXZlZEZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNvbHIuRGlyZWN0b3J5RmFjdG9yeSIpOwogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc29sci5jb3JlLk1vY2tGU0RpcmVjdG9yeUZhY3RvcnkiKTsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb25maWcuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0Q29uZmlnLmphdmEKaW5kZXggNmRlYmZmNi4uMWUyMzk4ZSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb25maWcuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdENvbmZpZy5qYXZhCkBAIC0xMzgsMTEgKzEzOCwyNiBAQAogICAvLyBJZiBkZWZhdWx0cyBjaGFuZ2UsIGFkZCB0ZXN0IG1ldGhvZHMgdG8gY292ZXIgZWFjaCB2ZXJzaW9uCiAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgU29sckNvbmZpZyBzYyA9IG5ldyBTb2xyQ29uZmlnKG5ldyBTb2xyUmVzb3VyY2VMb2FkZXIoInNvbHIvY29sbGVjdGlvbjEiKSwgInNvbHJjb25maWctZGVmYXVsdHMueG1sIiwgbnVsbCk7CisgICAgU29sckluZGV4Q29uZmlnIHNpYyA9IHNjLmluZGV4Q29uZmlnOworICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCByYW1CdWZmZXJTaXplTUIiLCAxMDAuMEQsIHNpYy5yYW1CdWZmZXJTaXplTUIsIDAuMEQpOworICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCBMb2NrVHlwZSIsIFNvbHJJbmRleENvbmZpZy5MT0NLX1RZUEVfTkFUSVZFLCBzaWMubG9ja1R5cGUpOworICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCB1c2VDb21wb3VuZEZpbGUiLCBmYWxzZSwgc2ljLnVzZUNvbXBvdW5kRmlsZSk7CisKKyAgfQorCisKKyAgLy8gc2FuaXR5IGNoZWNrIHRoYXQgc3lzIHByb3BlcnRpcyBhcmUgd29ya2luZyBhcyBleHBlY3RlZAorICBwdWJsaWMgdm9pZCB0ZXN0U2FuaXR5Q2hlY2tUZXN0U3lzUHJvcHNBcmVVc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgYm9vbGVhbiBleHBlY3RDRlMgCisgICAgICA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlQ29tcG91bmRGaWxlIikpOworCiAgICAgU29sckNvbmZpZyBzYyA9IG5ldyBTb2xyQ29uZmlnKG5ldyBTb2xyUmVzb3VyY2VMb2FkZXIoInNvbHIvY29sbGVjdGlvbjEiKSwgInNvbHJjb25maWctYmFzaWMueG1sIiwgbnVsbCk7CiAgICAgU29sckluZGV4Q29uZmlnIHNpYyA9IHNjLmluZGV4Q29uZmlnOwotICAgIGFzc2VydFRydWUoImRlZmF1bHQgcmFtQnVmZmVyU2l6ZU1CIHNob3VsZCBiZSAxMDAiLCBzaWMucmFtQnVmZmVyU2l6ZU1CID09IDEwMCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiZGVmYXVsdCB1c2VDb21wb3VuZEZpbGUgc2hvdWxkIGJlIGZhbHNlIiwgc2ljLnVzZUNvbXBvdW5kRmlsZSA9PSBmYWxzZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiZGVmYXVsdCBMb2NrVHlwZSBzaG91bGQgYmUgbmF0aXZlIiwgc2ljLmxvY2tUeXBlLmVxdWFscyhTb2xySW5kZXhDb25maWcuTE9DS19UWVBFX05BVElWRSkpOworICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCByYW1CdWZmZXJTaXplTUIiLCAxMDAuMEQsIHNpYy5yYW1CdWZmZXJTaXplTUIsIDAuMEQpOworICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCBMb2NrVHlwZSIsIFNvbHJJbmRleENvbmZpZy5MT0NLX1RZUEVfTkFUSVZFLCBzaWMubG9ja1R5cGUpOworICAgIGFzc2VydEVxdWFscygidXNlQ29tcG91bmRGaWxlIHN5c3Byb3AiLCBleHBlY3RDRlMsIHNpYy51c2VDb21wb3VuZEZpbGUpOwogICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0Q29yZUNvbnRhaW5lci5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb3JlQ29udGFpbmVyLmphdmEKaW5kZXggZDU2ZjJiZi4uMjU5NTY2ZSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb3JlQ29udGFpbmVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb3JlQ29udGFpbmVyLmphdmEKQEAgLTE3LDYgKzE3LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLl9UZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwpAQCAtMjcsMTcgKzM3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOwogCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuX1Rlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCiBwdWJsaWMgY2xhc3MgVGVzdENvcmVDb250YWluZXIgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG9sZFNvbHJIb21lOwpAQCAtNzAsOSArNjksMTAgQEAKICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbWtkaXJzIHdvcmtEaXIiLCBzb2xySG9tZURpcmVjdG9yeS5ta2RpcnMoKSk7CiAKICAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShTb2xyVGVzdENhc2VKNC5URVNUX0hPTUUoKSksIHNvbHJIb21lRGlyZWN0b3J5KTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIHNvbHJjb25maWcgZnJvbSAiICsgbmV3IEZpbGUoU29sclRlc3RDYXNlSjQuVEVTVF9IT01FKCkpLmdldEFic29sdXRlUGF0aCgpKTsKIAogICAgIENvcmVDb250YWluZXIgcmV0ID0gbmV3IENvcmVDb250YWluZXIoc29sckhvbWVEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIHJldC5sb2FkKHNvbHJIb21lRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpLCBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInNvbHIueG1sIikpOworICAgIHJldC5sb2FkKCk7CiAgICAgcmV0dXJuIHJldDsKICAgfQogCkBAIC0xNjEsMTMgKzE2MSwxMyBAQAogICAgICAgU29sckNvcmUgdGVtcGxhdGUgPSBudWxsOwogICAgICAgdHJ5IHsKICAgICAgICAgdGVtcGxhdGUgPSBjb3Jlcy5nZXRDb3JlKCJjb2xsZWN0aW9uMSIpOwotICAgICAgICBpbnN0RGlyID0gdGVtcGxhdGUuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRJbnN0YW5jZURpcigpOworICAgICAgICBpbnN0RGlyID0gdGVtcGxhdGUuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRSYXdJbnN0YW5jZURpcigpOwogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgaWYgKG51bGwgIT0gdGVtcGxhdGUpIHRlbXBsYXRlLmNsb3NlKCk7CiAgICAgICB9CiAgICAgfQogICAgIAotICAgIGZpbmFsIEZpbGUgaW5zdERpckZpbGUgPSBuZXcgRmlsZShpbnN0RGlyKTsKKyAgICBmaW5hbCBGaWxlIGluc3REaXJGaWxlID0gbmV3IEZpbGUoY29yZXMuZ2V0U29sckhvbWUoKSwgaW5zdERpcik7CiAgICAgYXNzZXJ0VHJ1ZSgiaW5zdERpciBkb2Vzbid0IGV4aXN0OiAiICsgaW5zdERpciwgaW5zdERpckZpbGUuZXhpc3RzKCkpOwogICAgIAogICAgIC8vIHNhbml0eSBjaGVjayB0aGUgYmFzaWMgcGVyc2lzdGVuY2Ugb2YgdGhlIGRlZmF1bHQgaW5pdApAQCAtMjYyLDE0ICsyNjIsOCBAQAogICAgIEZpbGUgc29sckhvbWVEaXJlY3RvcnkgPSBuZXcgRmlsZShURU1QX0RJUiwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQogICAgICAgICArICJfbm9Db3JlcyIpOwogICAgIFNldFVwSG9tZShzb2xySG9tZURpcmVjdG9yeSwgRU1QVFlfU09MUl9YTUwpOwotICAgIENvcmVDb250YWluZXIuSW5pdGlhbGl6ZXIgaW5pdCA9IG5ldyBDb3JlQ29udGFpbmVyLkluaXRpYWxpemVyKCk7Ci0gICAgQ29yZUNvbnRhaW5lciBjb3JlcyA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIGNvcmVzID0gaW5pdC5pbml0aWFsaXplKCk7Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBmYWlsKCJDb3JlQ29udGFpbmVyIG5vdCBjcmVhdGVkIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9CisgICAgQ29yZUNvbnRhaW5lciBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKHNvbHJIb21lRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBjb3Jlcy5sb2FkKCk7CiAgICAgdHJ5IHsKICAgICAgIC8vYXNzZXJ0IHplcm8gY29yZXMKICAgICAgIGFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG5vdCBiZSBjb3JlcyIsIDAsIGNvcmVzLmdldENvcmVzKCkuc2l6ZSgpKTsKQEAgLTM2MiwyNCArMzU2LDIxIEBACiAgICAgRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKG5ldyBGaWxlKHRtcFJvb3QsICJleHBsaWNpdC1saWItc29sci54bWwiKSwgIjxzb2xyIHNoYXJlZExpYj1cImxpYlwiPjxjb3Jlcy8+PC9zb2xyPiIsICJVVEYtOCIpOwogICAgIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZShuZXcgRmlsZSh0bXBSb290LCAiY3VzdG9tLWxpYi1zb2xyLnhtbCIpLCAiPHNvbHIgc2hhcmVkTGliPVwiY3VzdG9tTGliXCI+PGNvcmVzLz48L3NvbHI+IiwgIlVURi04Iik7CiAKLSAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNjMSA9IG5ldyBDb3JlQ29udGFpbmVyKHRtcFJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGNjMS5sb2FkKHRtcFJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBGaWxlKHRtcFJvb3QsICJkZWZhdWx0LWxpYi1zb2xyLnhtbCIpKTsKKyAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNjMSA9IENvcmVDb250YWluZXIuY3JlYXRlQW5kTG9hZCh0bXBSb290LmdldEFic29sdXRlUGF0aCgpLCBuZXcgRmlsZSh0bXBSb290LCAiZGVmYXVsdC1saWItc29sci54bWwiKSk7CiAgICAgdHJ5IHsKICAgICAgIGNjMS5sb2FkZXIub3BlblJlc291cmNlKCJkZWZhdWx0U2hhcmVkTGliRmlsZSIpLmNsb3NlKCk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGNjMS5zaHV0ZG93bigpOwogICAgIH0KIAotICAgIGZpbmFsIENvcmVDb250YWluZXIgY2MyID0gbmV3IENvcmVDb250YWluZXIodG1wUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgY2MyLmxvYWQodG1wUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IEZpbGUodG1wUm9vdCwgImV4cGxpY2l0LWxpYi1zb2xyLnhtbCIpKTsKKyAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNjMiA9IENvcmVDb250YWluZXIuY3JlYXRlQW5kTG9hZCh0bXBSb290LmdldEFic29sdXRlUGF0aCgpLCBuZXcgRmlsZSh0bXBSb290LCAiZXhwbGljaXQtbGliLXNvbHIueG1sIikpOwogICAgIHRyeSB7CiAgICAgICBjYzIubG9hZGVyLm9wZW5SZXNvdXJjZSgiZGVmYXVsdFNoYXJlZExpYkZpbGUiKS5jbG9zZSgpOwogICAgIH0gZmluYWxseSB7CiAgICAgICBjYzIuc2h1dGRvd24oKTsKICAgICB9CiAKLSAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNjMyA9IG5ldyBDb3JlQ29udGFpbmVyKHRtcFJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGNjMy5sb2FkKHRtcFJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBGaWxlKHRtcFJvb3QsICJjdXN0b20tbGliLXNvbHIueG1sIikpOworICAgIGZpbmFsIENvcmVDb250YWluZXIgY2MzID0gQ29yZUNvbnRhaW5lci5jcmVhdGVBbmRMb2FkKHRtcFJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBGaWxlKHRtcFJvb3QsICJjdXN0b20tbGliLXNvbHIueG1sIikpOwogICAgIHRyeSB7CiAgICAgICBjYzMubG9hZGVyLm9wZW5SZXNvdXJjZSgiY3VzdG9tU2hhcmVkTGliRmlsZSIpLmNsb3NlKCk7CiAgICAgfSBmaW5hbGx5IHsKQEAgLTM5MiwyMiArMzgzLDQgQEAKICAgICAgICIgIDxjb3JlcyBhZG1pblBhdGg9XCIvYWRtaW4vY29yZXNcIiB0cmFuc2llbnRDYWNoZVNpemU9XCIzMlwiID5cbiIgKwogICAgICAgIiAgPC9jb3Jlcz5cbiIgKwogICAgICAgIjwvc29scj4iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xSX1hNTF9TQU1FX05BTUUgPSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iICsKLSAgICAgICI8c29sciBwZXJzaXN0ZW50PVwiZmFsc2VcIj5cbiIgKwotICAgICAgIiAgPGNvcmVzIGFkbWluUGF0aD1cIi9hZG1pbi9jb3Jlc1wiIHRyYW5zaWVudENhY2hlU2l6ZT1cIjMyXCIgPlxuIiArCi0gICAgICAiICAgIDxjb3JlIG5hbWU9XCJjb3JlMVwiIGluc3RhbmNlRGlyPVwiY29yZTFcIiBkYXRhRGlyPVwiY29yZTFcIi8+IFxuIiArCi0gICAgICAiICAgIDxjb3JlIG5hbWU9XCJjb3JlMVwiIGluc3RhbmNlRGlyPVwiY29yZTJcIiBkYXRhRGlyPVwiY29yZTJcIi8+IFxuICIgKwotICAgICAgIiAgPC9jb3Jlcz5cbiIgKwotICAgICAgIjwvc29scj4iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xSX1hNTF9TQU1FX0RBVEFESVIgPSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iICsKLSAgICAgICI8c29sciBwZXJzaXN0ZW50PVwiZmFsc2VcIj5cbiIgKwotICAgICAgIiAgPGNvcmVzIGFkbWluUGF0aD1cIi9hZG1pbi9jb3Jlc1wiIHRyYW5zaWVudENhY2hlU2l6ZT1cIjMyXCIgPlxuIiArCi0gICAgICAiICAgIDxjb3JlIG5hbWU9XCJjb3JlMlwiIGluc3RhbmNlRGlyPVwiY29yZTJcIiBkYXRhRGlyPVwiLi4vc2FtZWRhdGFkaXJcIiBzY2hlbWE9XCJzY2hlbWEtdGlueS54bWxcIiBjb25maWc9XCJzb2xyY29uZmlnLW1pbmltYWwueG1sXCIgLz4gXG4iICsKLSAgICAgICIgICAgPGNvcmUgbmFtZT1cImNvcmUxXCIgaW5zdGFuY2VEaXI9XCJjb3JlMlwiIGRhdGFEaXI9XCIuLi9zYW1lZGF0YWRpclwiIHNjaGVtYT1cInNjaGVtYS10aW55LnhtbFwiIGNvbmZpZz1cInNvbHJjb25maWctbWluaW1hbC54bWxcIiAgLz4gXG4gIiArCi0gICAgICAiICA8L2NvcmVzPlxuIiArCi0gICAgICAiPC9zb2xyPiI7Ci0KLQogfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RDb3JlRGlzY292ZXJ5LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdENvcmVEaXNjb3ZlcnkuamF2YQppbmRleCBkZDQ5NzNhLi5jNzFhNGQ5IDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdENvcmVEaXNjb3ZlcnkuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdENvcmVEaXNjb3ZlcnkuamF2YQpAQCAtMTcsMTAgKzE3LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLklPVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OwpAQCAtMjksNiArMjUsMTAgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCiBwdWJsaWMgY2xhc3MgVGVzdENvcmVEaXNjb3ZlcnkgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CiAKICAgQEJlZm9yZUNsYXNzCkBAIC0xMDIsMTQgKzEwMiwxMiBAQAogICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBta2RpcnMgZm9yICIgKyBjb25mRGlyLmdldEFic29sdXRlUGF0aCgpLCBjb25mRGlyLm1rZGlycygpKTsKICAgICBGaWxlVXRpbHMuY29weUZpbGUobmV3IEZpbGUodG9wLCAic2NoZW1hLXRpbnkueG1sIiksIG5ldyBGaWxlKGNvbmZEaXIsICJzY2hlbWEtdGlueS54bWwiKSk7CiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRvcCwgInNvbHJjb25maWctbWluaW1hbC54bWwiKSwgbmV3IEZpbGUoY29uZkRpciwgInNvbHJjb25maWctbWluaW1hbC54bWwiKSk7CisgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRvcCwgInNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiKSwgbmV3IEZpbGUoY29uZkRpciwgInNvbHJjb25maWcuc25pcHBldC5yYW5kb21pbmRleGNvbmZpZy54bWwiKSk7CiAgIH0KIAogICBwcml2YXRlIENvcmVDb250YWluZXIgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0ID0gbmV3IENvcmVDb250YWluZXIuSW5pdGlhbGl6ZXIoKTsKLQotICAgIGZpbmFsIENvcmVDb250YWluZXIgY29yZXMgPSBpbml0LmluaXRpYWxpemUoKTsKLSAgICBjb3Jlcy5zZXRQZXJzaXN0ZW50KGZhbHNlKTsKKyAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNvcmVzID0gbmV3IENvcmVDb250YWluZXIoKTsKKyAgICBjb3Jlcy5sb2FkKCk7CiAgICAgcmV0dXJuIGNvcmVzOwogICB9CiAKQEAgLTE4MiwxMCArMTgwLDE0IEBACiAgICAgICBjYyA9IGluaXQoKTsKICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24gaW4gdGVzdER1cGxpY2F0ZU5hbWVzIik7CiAgICAgfSBjYXRjaCAoU29sckV4Y2VwdGlvbiBzZSkgeworICAgICAgVGhyb3dhYmxlIGNhdXNlID0gc2UuZ2V0Q2F1c2UoKTsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gY2F1c2UuZ2V0TWVzc2FnZSgpOwogICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgc2VlbiBhbiBleGNlcHRpb24gYmVjYXVzZSB0d28gY29yZXMgaGFkIHRoZSBzYW1lIG5hbWUiLAotICAgICAgICAgICJDb3JlICArIGRlc2MuZ2V0TmFtZSgpICsgXCIgZGVmaW5lZCB0d2ljZSIuaW5kZXhPZihzZS5nZXRNZXNzYWdlKCkpICE9IC0xKTsKLSAgICAgIGFzc2VydFRydWUoIi9jb3JlMSBzaG91bGQgaGF2ZSBiZWVuIG1lbnRpb25lZCBpbiB0aGUgbWVzc2FnZSIsICIvY29yZTEiLmluZGV4T2Yoc2UuZ2V0TWVzc2FnZSgpKSAhPSAtMSk7Ci0gICAgICBhc3NlcnRUcnVlKCIvY29yZTIgc2hvdWxkIGhhdmUgYmVlbiBtZW50aW9uZWQgaW4gdGhlIG1lc3NhZ2UiLCAiL2NvcmUyIi5pbmRleE9mKHNlLmdldE1lc3NhZ2UoKSkgIT0gLTEpOworICAgICAgICAgIG1lc3NhZ2UuaW5kZXhPZigiQ29yZSBjb3JlMSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIikgIT0gLTEpOworICAgICAgYXNzZXJ0VHJ1ZShGaWxlLnNlcGFyYXRvciArICJjb3JlMSBzaG91bGQgaGF2ZSBiZWVuIG1lbnRpb25lZCBpbiB0aGUgbWVzc2FnZTogIiArIG1lc3NhZ2UsCisgICAgICAgICAgbWVzc2FnZS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgImNvcmUxIikgIT0gLTEpOworICAgICAgYXNzZXJ0VHJ1ZShGaWxlLnNlcGFyYXRvciArICJjb3JlMiBzaG91bGQgaGF2ZSBiZWVuIG1lbnRpb25lZCBpbiB0aGUgbWVzc2FnZToiICsgbWVzc2FnZSwKKyAgICAgICAgICBtZXNzYWdlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiY29yZTIiKSAhPSAtMSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGlmIChjYyAhPSBudWxsKSB7CiAgICAgICAgIGNjLnNodXRkb3duKCk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdEluZm9TdHJlYW1Mb2dnaW5nLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdEluZm9TdHJlYW1Mb2dnaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YmMzZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0SW5mb1N0cmVhbUxvZ2dpbmcuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jb3JlOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuUHJpbnRTdHJlYW1JbmZvU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLkxvZ2dpbmdJbmZvU3RyZWFtOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworcHVibGljIGNsYXNzIFRlc3RJbmZvU3RyZWFtTG9nZ2luZyBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaW5pdENvcmUoInNvbHJjb25maWctaW5mb3N0cmVhbS1sb2dnaW5nLnhtbCIsInNjaGVtYS54bWwiKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdEluZGV4Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhXcml0ZXJDb25maWcgaXdjID0gc29sckNvbmZpZy5pbmRleENvbmZpZy50b0luZGV4V3JpdGVyQ29uZmlnKGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpKTsKKworICAgIGFzc2VydFRydWUoaXdjLmdldEluZm9TdHJlYW0oKSBpbnN0YW5jZW9mIExvZ2dpbmdJbmZvU3RyZWFtKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RMYXp5Q29yZXMuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0TGF6eUNvcmVzLmphdmEKaW5kZXggN2MxN2JmNy4uZTRjMjEwNSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RMYXp5Q29yZXMuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdExhenlDb3Jlcy5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiAgICAgRmlsZSBzb2xyWG1sID0gbmV3IEZpbGUoc29sckhvbWVEaXJlY3RvcnksICJzb2xyLnhtbCIpOwogICAgIEZpbGVVdGlscy53cml0ZShzb2xyWG1sLCBMT1RTX1NPTFJfWE1MLCBJT1V0aWxzLkNIQVJTRVRfVVRGXzgudG9TdHJpbmcoKSk7CiAgICAgZmluYWwgQ29yZUNvbnRhaW5lciBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKHNvbHJIb21lRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICBjb3Jlcy5sb2FkKHNvbHJIb21lRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpLCBzb2xyWG1sKTsKKyAgICBjb3Jlcy5sb2FkKCk7CiAgICAgLy8gIGguZ2V0Q29yZUNvbnRhaW5lcigpLmxvYWQoc29sckhvbWVEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29sci54bWwiKSk7CiAKICAgICBjb3Jlcy5zZXRQZXJzaXN0ZW50KGZhbHNlKTsKQEAgLTI4NSw4ICsyODUsOCBAQAogICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5Db3JlQWRtaW5BY3Rpb24uQ1JFQVRFLnRvU3RyaW5nKCksCiAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLkRBVEFfRElSLCBkYXRhRGlyLAogICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5OQU1FLCBuYW1lLAotICAgICAgICAgICJzY2hlbWEiLCAic2NoZW1hLXRpbnkueG1sIiwKLSAgICAgICAgICAiY29uZmlnIiwgInNvbHJjb25maWctbWluaW1hbC54bWwiKTsKKyAgICAgICAgICAic2NoZW1hIiwgInNjaGVtYS54bWwiLAorICAgICAgICAgICJjb25maWciLCAic29scmNvbmZpZy54bWwiKTsKIAogICAgICAgYWRtaW4uaGFuZGxlUmVxdWVzdEJvZHkocmVxdWVzdCwgcmVzcCk7CiAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXJyb3IiKTsKQEAgLTM0NywyOSArMzQ3LDI5IEBACiAgICAgICBDb3JlRGVzY3JpcHRvciBkMSA9IG5ldyBDb3JlRGVzY3JpcHRvcihjYywgImNvcmUxIiwgIi4vY29yZTEiKTsKICAgICAgIGQxLnNldFRyYW5zaWVudCh0cnVlKTsKICAgICAgIGQxLnNldExvYWRPblN0YXJ0dXAodHJ1ZSk7Ci0gICAgICBkMS5zZXRTY2hlbWFOYW1lKCJzY2hlbWEtdGlueS54bWwiKTsKLSAgICAgIGQxLnNldENvbmZpZ05hbWUoInNvbHJjb25maWctbWluaW1hbC54bWwiKTsKKyAgICAgIGQxLnNldFNjaGVtYU5hbWUoInNjaGVtYS54bWwiKTsKKyAgICAgIGQxLnNldENvbmZpZ05hbWUoInNvbHJjb25maWcueG1sIik7CiAgICAgICBTb2xyQ29yZSBjb3JlMSA9IGNjLmNyZWF0ZShkMSk7CiAKICAgICAgIENvcmVEZXNjcmlwdG9yIGQyID0gbmV3IENvcmVEZXNjcmlwdG9yKGNjLCAiY29yZTIiLCAiLi9jb3JlMiIpOwogICAgICAgZDIuc2V0VHJhbnNpZW50KHRydWUpOwogICAgICAgZDIuc2V0TG9hZE9uU3RhcnR1cChmYWxzZSk7Ci0gICAgICBkMi5zZXRTY2hlbWFOYW1lKCJzY2hlbWEtdGlueS54bWwiKTsKLSAgICAgIGQyLnNldENvbmZpZ05hbWUoInNvbHJjb25maWctbWluaW1hbC54bWwiKTsKKyAgICAgIGQyLnNldFNjaGVtYU5hbWUoInNjaGVtYS54bWwiKTsKKyAgICAgIGQyLnNldENvbmZpZ05hbWUoInNvbHJjb25maWcueG1sIik7CiAgICAgICBTb2xyQ29yZSBjb3JlMiA9IGNjLmNyZWF0ZShkMik7CiAKICAgICAgIENvcmVEZXNjcmlwdG9yIGQzID0gbmV3IENvcmVEZXNjcmlwdG9yKGNjLCAiY29yZTMiLCAiLi9jb3JlMyIpOwogICAgICAgZDMuc2V0VHJhbnNpZW50KGZhbHNlKTsKICAgICAgIGQzLnNldExvYWRPblN0YXJ0dXAodHJ1ZSk7Ci0gICAgICBkMy5zZXRTY2hlbWFOYW1lKCJzY2hlbWEtdGlueS54bWwiKTsKLSAgICAgIGQzLnNldENvbmZpZ05hbWUoInNvbHJjb25maWctbWluaW1hbC54bWwiKTsKKyAgICAgIGQzLnNldFNjaGVtYU5hbWUoInNjaGVtYS54bWwiKTsKKyAgICAgIGQzLnNldENvbmZpZ05hbWUoInNvbHJjb25maWcueG1sIik7CiAgICAgICBTb2xyQ29yZSBjb3JlMyA9IGNjLmNyZWF0ZShkMyk7CiAKICAgICAgIENvcmVEZXNjcmlwdG9yIGQ0ID0gbmV3IENvcmVEZXNjcmlwdG9yKGNjLCAiY29yZTQiLCAiLi9jb3JlNCIpOwogICAgICAgZDQuc2V0VHJhbnNpZW50KGZhbHNlKTsKICAgICAgIGQ0LnNldExvYWRPblN0YXJ0dXAoZmFsc2UpOwotICAgICAgZDQuc2V0U2NoZW1hTmFtZSgic2NoZW1hLXRpbnkueG1sIik7Ci0gICAgICBkNC5zZXRDb25maWdOYW1lKCJzb2xyY29uZmlnLW1pbmltYWwueG1sIik7CisgICAgICBkNC5zZXRTY2hlbWFOYW1lKCJzY2hlbWEueG1sIik7CisgICAgICBkNC5zZXRDb25maWdOYW1lKCJzb2xyY29uZmlnLnhtbCIpOwogICAgICAgU29sckNvcmUgY29yZTQgPSBjYy5jcmVhdGUoZDQpOwogCiAgICAgICBmaW5hbCBGaWxlIG9uZVhtbCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAibGF6eTEuc29sci54bWwiKTsKQEAgLTQ1NSwzMSArNDU1LDIzIEBACiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPVFNfU09MUl9YTUwgPSAiIDxzb2xyIHBlcnNpc3RlbnQ9XCJmYWxzZVwiPiAiICsKICAgICAgICI8Y29yZXMgYWRtaW5QYXRoPVwiL2FkbWluL2NvcmVzXCIgZGVmYXVsdENvcmVOYW1lPVwiY29sbGVjdGlvbkxhenkyXCIgdHJhbnNpZW50Q2FjaGVTaXplPVwiNFwiPiAgIiArCi0gICAgICAiPGNvcmUgbmFtZT1cImNvbGxlY3Rpb24xXCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uMVwiIGNvbmZpZz1cInNvbHJjb25maWctbWluaW1hbC54bWxcIiBzY2hlbWE9XCJzY2hlbWEtdGlueS54bWxcIiAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbjFcIiBpbnN0YW5jZURpcj1cImNvbGxlY3Rpb24xXCIgIC8+ICIgKwogCi0gICAgICAiPGNvcmUgbmFtZT1cImNvbGxlY3Rpb25MYXp5MlwiIGluc3RhbmNlRGlyPVwiY29sbGVjdGlvbjJcIiB0cmFuc2llbnQ9XCJ0cnVlXCIgbG9hZE9uU3RhcnR1cD1cInRydWVcIiAgIiArCi0gICAgICAiIGNvbmZpZz1cInNvbHJjb25maWctbWluaW1hbC54bWxcIiBzY2hlbWE9XCJzY2hlbWEtdGlueS54bWxcIiAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenkyXCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uMlwiIHRyYW5zaWVudD1cInRydWVcIiBsb2FkT25TdGFydHVwPVwidHJ1ZVwiICAgLz4gIiArCiAKLSAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenkzXCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uM1wiIHRyYW5zaWVudD1cIm9uXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgIiArCi0gICAgICAiY29uZmlnPVwic29scmNvbmZpZy1taW5pbWFsLnhtbFwiIHNjaGVtYT1cInNjaGVtYS10aW55LnhtbFwiICAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenkzXCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uM1wiIHRyYW5zaWVudD1cIm9uXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgICAgLz4gIiArCiAKLSAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk0XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uNFwiIHRyYW5zaWVudD1cImZhbHNlXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgIiArCi0gICAgICAiY29uZmlnPVwic29scmNvbmZpZy1taW5pbWFsLnhtbFwiIHNjaGVtYT1cInNjaGVtYS10aW55LnhtbFwiICAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk0XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uNFwiIHRyYW5zaWVudD1cImZhbHNlXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgLz4gIiArCiAKLSAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk1XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uNVwiIHRyYW5zaWVudD1cImZhbHNlXCIgbG9hZE9uU3RhcnR1cD1cInRydWVcIiAiICsKLSAgICAgICJjb25maWc9XCJzb2xyY29uZmlnLW1pbmltYWwueG1sXCIgc2NoZW1hPVwic2NoZW1hLXRpbnkueG1sXCIgIC8+ICIgKworICAgICAgIjxjb3JlIG5hbWU9XCJjb2xsZWN0aW9uTGF6eTVcIiBpbnN0YW5jZURpcj1cImNvbGxlY3Rpb241XCIgdHJhbnNpZW50PVwiZmFsc2VcIiBsb2FkT25TdGFydHVwPVwidHJ1ZVwiIC8+ICIgKwogCi0gICAgICAiPGNvcmUgbmFtZT1cImNvbGxlY3Rpb25MYXp5NlwiIGluc3RhbmNlRGlyPVwiY29sbGVjdGlvbjZcIiB0cmFuc2llbnQ9XCJ0cnVlXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgIiArCi0gICAgICAiY29uZmlnPVwic29scmNvbmZpZy1taW5pbWFsLnhtbFwiIHNjaGVtYT1cInNjaGVtYS10aW55LnhtbFwiICAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk2XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uNlwiIHRyYW5zaWVudD1cInRydWVcIiBsb2FkT25TdGFydHVwPVwiZmFsc2VcIiAvPiAiICsKIAotICAgICAgIjxjb3JlIG5hbWU9XCJjb2xsZWN0aW9uTGF6eTdcIiBpbnN0YW5jZURpcj1cImNvbGxlY3Rpb243XCIgdHJhbnNpZW50PVwidHJ1ZVwiIGxvYWRPblN0YXJ0dXA9XCJmYWxzZVwiICIgKwotICAgICAgImNvbmZpZz1cInNvbHJjb25maWctbWluaW1hbC54bWxcIiBzY2hlbWE9XCJzY2hlbWEtdGlueS54bWxcIiAgLz4gIiArCisgICAgICAiPGNvcmUgbmFtZT1cImNvbGxlY3Rpb25MYXp5N1wiIGluc3RhbmNlRGlyPVwiY29sbGVjdGlvbjdcIiB0cmFuc2llbnQ9XCJ0cnVlXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgLz4gIiArCiAKLSAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk4XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uOFwiIHRyYW5zaWVudD1cInRydWVcIiBsb2FkT25TdGFydHVwPVwiZmFsc2VcIiAiICsKLSAgICAgICJjb25maWc9XCJzb2xyY29uZmlnLW1pbmltYWwueG1sXCIgc2NoZW1hPVwic2NoZW1hLXRpbnkueG1sXCIgIC8+ICIgKworICAgICAgIjxjb3JlIG5hbWU9XCJjb2xsZWN0aW9uTGF6eThcIiBpbnN0YW5jZURpcj1cImNvbGxlY3Rpb244XCIgdHJhbnNpZW50PVwidHJ1ZVwiIGxvYWRPblN0YXJ0dXA9XCJmYWxzZVwiIC8+ICIgKwogCi0gICAgICAiPGNvcmUgbmFtZT1cImNvbGxlY3Rpb25MYXp5OVwiIGluc3RhbmNlRGlyPVwiY29sbGVjdGlvbjlcIiB0cmFuc2llbnQ9XCJ0cnVlXCIgbG9hZE9uU3RhcnR1cD1cImZhbHNlXCIgIiArCi0gICAgICAiY29uZmlnPVwic29scmNvbmZpZy1taW5pbWFsLnhtbFwiIHNjaGVtYT1cInNjaGVtYS10aW55LnhtbFwiICAvPiAiICsKKyAgICAgICI8Y29yZSBuYW1lPVwiY29sbGVjdGlvbkxhenk5XCIgaW5zdGFuY2VEaXI9XCJjb2xsZWN0aW9uOVwiIHRyYW5zaWVudD1cInRydWVcIiBsb2FkT25TdGFydHVwPVwiZmFsc2VcIiAvPiAiICsKIAogICAgICAgIjwvY29yZXM+ICIgKwogICAgICAgIjwvc29scj4iOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RNZXJnZVBvbGljeUNvbmZpZy5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RNZXJnZVBvbGljeUNvbmZpZy5qYXZhCmluZGV4IGJhMzY3NzcuLmI0N2VlZjUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0TWVyZ2VQb2xpY3lDb25maWcuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdE1lcmdlUG9saWN5Q29uZmlnLmphdmEKQEAgLTE3LDM3ICsxNywxNzMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5BdG9taWNSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguQXRvbWljUmVhZGVyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5TZWdtZW50UmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlNlZ21lbnRJbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lk1lcmdlUG9saWN5OwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRpZXJlZE1lcmdlUG9saWN5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLlJlZkNvdW50ZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNlYXJjaC5Tb2xySW5kZXhTZWFyY2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogcHVibGljIGNsYXNzIFRlc3RNZXJnZVBvbGljeUNvbmZpZyBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKKyAgCisgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgZG9jSWRDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoNDIpOwogCi0gIEBCZWZvcmVDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBpbml0Q29yZSgic29scmNvbmZpZy1tZXJnZXBvbGljeS54bWwiLCJzY2hlbWEueG1sIik7CisgIEBBZnRlcgorICBwdWJsaWMgdm9pZCBhZnRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGRlbGV0ZUNvcmUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWVyZ2VQb2xpY3lDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpbml0Q29yZSgic29scmNvbmZpZy1tZXJnZXBvbGljeS1kZWZhdWx0cy54bWwiLCJzY2hlbWEtbWluaW1hbC54bWwiKTsKKyAgICBJbmRleFdyaXRlckNvbmZpZyBpd2MgPSBzb2xyQ29uZmlnLmluZGV4Q29uZmlnLnRvSW5kZXhXcml0ZXJDb25maWcoaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgaXdjLmdldFVzZUNvbXBvdW5kRmlsZSgpKTsKKworICAgIFRpZXJlZE1lcmdlUG9saWN5IHRpZXJlZE1QID0gYXNzZXJ0QW5kQ2FzdChUaWVyZWRNZXJnZVBvbGljeS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdjLmdldE1lcmdlUG9saWN5KCkpOworICAgIGFzc2VydEVxdWFscygwLjBELCB0aWVyZWRNUC5nZXROb0NGU1JhdGlvKCksIDAuMEQpOworCisgICAgYXNzZXJ0Q29tbWl0U29tZU5ld0RvY3MoKTsKKyAgICBhc3NlcnRDb21wb3VuZFNlZ21lbnRzKGguZ2V0Q29yZSgpLCBmYWxzZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGVnYWN5TWVyZ2VQb2xpY3lDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBib29sZWFuIGV4cGVjdENGUyAKKyAgICAgID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VDb21wb3VuZEZpbGUiKSk7CisKKyAgICBpbml0Q29yZSgic29scmNvbmZpZy1tZXJnZXBvbGljeS1sZWdhY3kueG1sIiwic2NoZW1hLW1pbmltYWwueG1sIik7CisgICAgSW5kZXhXcml0ZXJDb25maWcgaXdjID0gc29sckNvbmZpZy5pbmRleENvbmZpZy50b0luZGV4V3JpdGVyQ29uZmlnKGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0Q0ZTLCBpd2MuZ2V0VXNlQ29tcG91bmRGaWxlKCkpOworCisKKyAgICBUaWVyZWRNZXJnZVBvbGljeSB0aWVyZWRNUCA9IGFzc2VydEFuZENhc3QoVGllcmVkTWVyZ2VQb2xpY3kuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3Yy5nZXRNZXJnZVBvbGljeSgpKTsKKworICAgIGFzc2VydEVxdWFscyg3LCB0aWVyZWRNUC5nZXRNYXhNZXJnZUF0T25jZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNy4wRCwgdGllcmVkTVAuZ2V0U2VnbWVudHNQZXJUaWVyKCksIDAuMEQpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RDRlMgPyAxLjBEIDogMC4wRCwgdGllcmVkTVAuZ2V0Tm9DRlNSYXRpbygpLCAwLjBEKTsKKworICAgIGFzc2VydENvbW1pdFNvbWVOZXdEb2NzKCk7CisgICAgYXNzZXJ0Q29tcG91bmRTZWdtZW50cyhoLmdldENvcmUoKSwgZXhwZWN0Q0ZTKTsKICAgfQogICAKICAgcHVibGljIHZvaWQgdGVzdFRpZXJlZE1lcmdlUG9saWN5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgSW5kZXhXcml0ZXJDb25maWcgaXdjID0gc29sckNvbmZpZy5pbmRleENvbmZpZy50b0luZGV4V3JpdGVyQ29uZmlnKGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpKTsKLSAgICBNZXJnZVBvbGljeSBtcCA9IGl3Yy5nZXRNZXJnZVBvbGljeSgpOwotICAgIGFzc2VydFRydWUobXAgaW5zdGFuY2VvZiBUaWVyZWRNZXJnZVBvbGljeSk7Ci0gICAgVGllcmVkTWVyZ2VQb2xpY3kgdGllcmVkTVAgPSAoVGllcmVkTWVyZ2VQb2xpY3kpIG1wOworICAgIGZpbmFsIGJvb2xlYW4gZXhwZWN0Q0ZTIAorICAgICAgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZUNvbXBvdW5kRmlsZSIpKTsKIAotICAgIC8vIG1wLXNwZWNpZmljIHNldHRlcgotICAgIGFzc2VydEVxdWFscygxOSwgdGllcmVkTVAuZ2V0TWF4TWVyZ2VBdE9uY2VFeHBsaWNpdCgpKTsKLSAgICAKLSAgICAvLyBtYWtlIHN1cmUgd2UgYXBwbHkgY29tcG91bmRGaWxlIGFuZCBtZXJnZUZhY3RvcgotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdGllcmVkTVAuZ2V0VXNlQ29tcG91bmRGaWxlKCkpOworICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLW1lcmdlcG9saWN5LnhtbCIsInNjaGVtYS1taW5pbWFsLnhtbCIpOworICAgIEluZGV4V3JpdGVyQ29uZmlnIGl3YyA9IHNvbHJDb25maWcuaW5kZXhDb25maWcudG9JbmRleFdyaXRlckNvbmZpZyhoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdENGUywgaXdjLmdldFVzZUNvbXBvdW5kRmlsZSgpKTsKKworCisgICAgVGllcmVkTWVyZ2VQb2xpY3kgdGllcmVkTVAgPSBhc3NlcnRBbmRDYXN0KFRpZXJlZE1lcmdlUG9saWN5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd2MuZ2V0TWVyZ2VQb2xpY3koKSk7CisKKyAgICAvLyBzZXQgYnkgbGVnYWN5IDxtZXJnZUZhY3Rvcj4gc2V0dGluZwogICAgIGFzc2VydEVxdWFscyg3LCB0aWVyZWRNUC5nZXRNYXhNZXJnZUF0T25jZSgpKTsKICAgICAKLSAgICAvLyBtYWtlIHN1cmUgd2Ugb3ZlcnJvZGUgc2VnbWVudHNQZXJUaWVyIChzcGxpdCBmcm9tIG1heE1lcmdlQXRPbmNlIG91dCBvZiBtZXJnZUZhY3RvcikKKyAgICAvLyBtcC1zcGVjaWZpYyBzZXR0ZXJzCisgICAgYXNzZXJ0RXF1YWxzKDE5LCB0aWVyZWRNUC5nZXRNYXhNZXJnZUF0T25jZUV4cGxpY2l0KCkpOworICAgIGFzc2VydEVxdWFscygwLjFELCB0aWVyZWRNUC5nZXROb0NGU1JhdGlvKCksIDAuMEQpOworICAgIC8vIG1ha2Ugc3VyZSB3ZSBvdmVycm9kZSBzZWdtZW50c1BlclRpZXIgCisgICAgLy8gKHNwbGl0IGZyb20gbWF4TWVyZ2VBdE9uY2Ugb3V0IG9mIG1lcmdlRmFjdG9yKQogICAgIGFzc2VydEVxdWFscyg5RCwgdGllcmVkTVAuZ2V0U2VnbWVudHNQZXJUaWVyKCksIDAuMDAxKTsKICAgICAKLSAgICAvLyBtYWtlIHN1cmUgd2Ugb3ZlcnJvZGUgbm9DRlNSYXRpbyAodXNlbGVzcyBiZWNhdXNlIHdlIGRpc2FibGVkIHVzZUNvbXBvdW5kRmlsZSwKLSAgICAvLyBidXQganVzdCB0byBtYWtlIHN1cmUgaXQgd29ya3MpCi0gICAgYXNzZXJ0RXF1YWxzKDEuMEQsIHRpZXJlZE1QLmdldE5vQ0ZTUmF0aW8oKSwgMC4wMDEpOworICAgIGFzc2VydENvbW1pdFNvbWVOZXdEb2NzKCk7CisgICAgLy8gZXZlbiB0aG91Z2ggd2UgaGF2ZSBhIHNpbmdsZSBzZWdtZW50ICh3aGljaCBpcyAxMDAlIG9mIHRoZSBzaXplIG9mIAorICAgIC8vIHRoZSBpbmRleCB3aGljaCBpcyBoaWdoZXIgdGhlbiBvdXIgMC42RCB0aHJlYXNob2xkKSB0aGUKKyAgICAvLyBjb21wb3VuZCByYXRpbyBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHRoZSBzZWdtZW50IHdhcyBuZXZlciBtZXJnZWQKKyAgICBhc3NlcnRDb21wb3VuZFNlZ21lbnRzKGguZ2V0Q29yZSgpLCBleHBlY3RDRlMpOworCisgICAgYXNzZXJ0Q29tbWl0U29tZU5ld0RvY3MoKTsKKyAgICBhc3NlcnROdW1TZWdtZW50cyhoLmdldENvcmUoKSwgMik7CisgICAgYXNzZXJ0Q29tcG91bmRTZWdtZW50cyhoLmdldENvcmUoKSwgZXhwZWN0Q0ZTKTsKKworICAgIGFzc2VydFUob3B0aW1pemUoKSk7CisgICAgYXNzZXJ0TnVtU2VnbWVudHMoaC5nZXRDb3JlKCksIDEpOworICAgIC8vIHdlJ3ZlIG5vdyBmb3JjZWQgYSBtZXJnZSwgYW5kIHRoZSBNUCByYXRpbyBzaG91bGQgYmUgaW4gcGxheQorICAgIGFzc2VydENvbXBvdW5kU2VnbWVudHMoaC5nZXRDb3JlKCksIGZhbHNlKTsKICAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIFR5cGUgYW5kIGFuIG9iamVjdCBhc3NlcnRzIHRoYXQgdGhlIG9iamVjdCBpcyBub24tbnVsbCBhbmQgYW4gCisgICAqIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgVHlwZS4gIFRoZSBvYmplY3QgaXMgdGhlbiBjYXN0IHRvIHRoYXQgdHlwZSBhbmQgCisgICAqIHJldHVybmVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gVCBhc3NlcnRBbmRDYXN0KENsYXNzPD8gZXh0ZW5kcyBUPiBjbGF6eiwgT2JqZWN0IG8pIHsKKyAgICBhc3NlcnROb3ROdWxsKGNsYXp6KTsKKyAgICBhc3NlcnROb3ROdWxsKG8pOworICAgIGFzc2VydFRydWUoY2xhenouaXNJbnN0YW5jZShvKSk7CisgICAgcmV0dXJuIGNsYXp6LmNhc3Qobyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Q29tbWl0U29tZU5ld0RvY3MoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgIGludCB2YWwgPSBkb2NJZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwgIiIgKyB2YWwsCisgICAgICAgICAgICAgICAgICAgImFfcyIsIHZhbCArICJfIiArIHZhbCArICJfIiArIHZhbCArICJfIiArIHZhbCwKKyAgICAgICAgICAgICAgICAgICAiYl9zIiwgdmFsICsgIl8iICsgdmFsICsgIl8iICsgdmFsICsgIl8iICsgdmFsLAorICAgICAgICAgICAgICAgICAgICJjX3MiLCB2YWwgKyAiXyIgKyB2YWwgKyAiXyIgKyB2YWwgKyAiXyIgKyB2YWwsCisgICAgICAgICAgICAgICAgICAgImRfcyIsIHZhbCArICJfIiArIHZhbCArICJfIiArIHZhbCArICJfIiArIHZhbCwKKyAgICAgICAgICAgICAgICAgICAiZV9zIiwgdmFsICsgIl8iICsgdmFsICsgIl8iICsgdmFsICsgIl8iICsgdmFsLAorICAgICAgICAgICAgICAgICAgICJmX3MiLCB2YWwgKyAiXyIgKyB2YWwgKyAiXyIgKyB2YWwgKyAiXyIgKyB2YWwpKTsKKyAgICB9CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgIH0KKworICAvKioKKyAgICogR2l2ZW4gYW4gU29sckNvcmUsIGFzc2VydHMgdGhhdCB0aGUgbnVtYmVyIG9mIGxlYXZlIHNlZ21lbnRzIGluIAorICAgKiB0aGUgaW5kZXggcmVhZGVyIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE51bVNlZ21lbnRzKFNvbHJDb3JlIGNvcmUsIGludCBleHBlY3RlZCkgeworICAgIFJlZkNvdW50ZWQ8U29sckluZGV4U2VhcmNoZXI+IHNlYXJjaGVyUmVmID0gY29yZS5nZXRSZWdpc3RlcmVkU2VhcmNoZXIoKTsKKyAgICB0cnkgeworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzZWFyY2hlclJlZi5nZXQoKS5nZXRJbmRleFJlYWRlcigpLmxlYXZlcygpLnNpemUoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlYXJjaGVyUmVmLmRlY3JlZigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhbiBTb2xyQ29yZSwgYXNzZXJ0cyB0aGF0IGVhY2ggc2VnbWVudCBpbiB0aGUgKHNlYXJjaGFibGUpIGluZGV4IAorICAgKiBoYXMgYSBjb21wb3VuZCBmaWxlIHN0YXR1cyB0aGF0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIGlucHV0LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbXBvdW5kU2VnbWVudHMoU29sckNvcmUgY29yZSwgYm9vbGVhbiBjb21wb3VuZCkgeworICAgIFJlZkNvdW50ZWQ8U29sckluZGV4U2VhcmNoZXI+IHNlYXJjaGVyUmVmID0gY29yZS5nZXRSZWdpc3RlcmVkU2VhcmNoZXIoKTsKKyAgICB0cnkgeworICAgICAgYXNzZXJ0Q29tcG91bmRTZWdtZW50cyhzZWFyY2hlclJlZi5nZXQoKS5nZXRJbmRleFJlYWRlcigpLCBjb21wb3VuZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlYXJjaGVyUmVmLmRlY3JlZigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhbiBJbmRleFJlYWRlciwgYXNzZXJ0cyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBBdG9tY1JlYWRlciBsZWFmLAorICAgKiBhbmQgdGhhdCBhbGwgQXRvbWljUmVhZGVyIGxlYXZlcyBhcmUgU2VnbWVudFJlYWRlcidzIHRoYXQgaGF2ZSBhIGNvbXBvdW5kIAorICAgKiBmaWxlIHN0YXR1cyB0aGF0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIGlucHV0LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb21wb3VuZFNlZ21lbnRzKEluZGV4UmVhZGVyIHJlYWRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbXBvdW5kKSB7CisKKyAgICBhc3NlcnROb3ROdWxsKCJOdWxsIGxlYXZlcyIsIHJlYWRlci5sZWF2ZXMoKSk7CisgICAgYXNzZXJ0VHJ1ZSgibm8gbGVhdmVzIiwgMCA8IHJlYWRlci5sZWF2ZXMoKS5zaXplKCkpOworCisgICAgZm9yIChBdG9taWNSZWFkZXJDb250ZXh0IGF0b21pYyA6IHJlYWRlci5sZWF2ZXMoKSkgeworICAgICAgYXNzZXJ0VHJ1ZSgibm90IGEgc2VnbWVudCByZWFkZXI6ICIgKyBhdG9taWMucmVhZGVyKCkudG9TdHJpbmcoKSwgCisgICAgICAgICAgICAgICAgIGF0b21pYy5yZWFkZXIoKSBpbnN0YW5jZW9mIFNlZ21lbnRSZWFkZXIpOworICAgICAgCisgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBvdW5kIHN0YXR1cyBpbmNvcnJlY3QgZm9yOiAiICsgCisgICAgICAgICAgICAgICAgICAgYXRvbWljLnJlYWRlcigpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgY29tcG91bmQsCisgICAgICAgICAgICAgICAgICAgKChTZWdtZW50UmVhZGVyKWF0b21pYy5yZWFkZXIoKSkuZ2V0U2VnbWVudEluZm8oKS5pbmZvLmdldFVzZUNvbXBvdW5kRmlsZSgpKTsKKyAgICB9CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RSZWxvYWRBbmREZWxldGVEb2NzLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFJlbG9hZEFuZERlbGV0ZURvY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJjNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RSZWxvYWRBbmREZWxldGVEb2NzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworCisvKiogSW5zcGlyZWQgYnkgU09MUi00ODU4ICovCitwdWJsaWMgY2xhc3MgVGVzdFJlbG9hZEFuZERlbGV0ZURvY3MgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CisgIAorICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgYWZ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciKTsKKyAgICBkZWxldGVDb3JlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkQW5kRGVsZXRlRG9jc05vVXBkYXRlTG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZG9UZXN0KGZhbHNlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWRBbmREZWxldGVEb2NzV2l0aFVwZGF0ZUxvZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGRvVGVzdCh0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb1Rlc3QoZmluYWwgYm9vbGVhbiB1c2VVcGRhdGVMb2cpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCB1c2VVcGRhdGVMb2cgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hLnhtbCIsIFRFU1RfSE9NRSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlVwZGF0ZUxvZyBleGlzdGVuY2UgZG9lc24ndCBtYXRjaCBzeXMgcHJvcCAodGVzdCBjb25maWcgY2hhbmdlZD8pIiwKKyAgICAgICAgICAgICAgICAgdXNlVXBkYXRlTG9nLAorICAgICAgICAgICAgICAgICBudWxsICE9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKSk7CisgICAgaC5yZWxvYWQoKTsKKyAgICBhc3NlcnRVKCI8ZGVsZXRlPjxxdWVyeT4qOio8L3F1ZXJ5PjwvZGVsZXRlPiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFNoYXJkSGFuZGxlckZhY3RvcnkuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U2hhcmRIYW5kbGVyRmFjdG9yeS5qYXZhCmluZGV4IGQyZTAzMzIuLjBmNWZiY2EgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U2hhcmRIYW5kbGVyRmFjdG9yeS5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U2hhcmRIYW5kbGVyRmFjdG9yeS5qYXZhCkBAIC0yOSw4ICsyOSw3IEBACiBwdWJsaWMgY2xhc3MgVGVzdFNoYXJkSGFuZGxlckZhY3RvcnkgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CiAKICAgcHVibGljIHZvaWQgdGVzdFhNTCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIENvcmVDb250YWluZXIgY2MgPSBuZXcgQ29yZUNvbnRhaW5lcihURVNUX0hPTUUoKSk7Ci0gICAgY2MubG9hZChURVNUX0hPTUUoKSwgbmV3IEZpbGUoVEVTVF9IT01FKCksICJzb2xyLXNoYXJkaGFuZGxlci54bWwiKSk7CisgICAgQ29yZUNvbnRhaW5lciBjYyA9IENvcmVDb250YWluZXIuY3JlYXRlQW5kTG9hZChURVNUX0hPTUUoKSwgbmV3IEZpbGUoVEVTVF9IT01FKCksICJzb2xyLXNoYXJkaGFuZGxlci54bWwiKSk7CiAgICAgU2hhcmRIYW5kbGVyRmFjdG9yeSBmYWN0b3J5ID0gY2MuZ2V0U2hhcmRIYW5kbGVyRmFjdG9yeSgpOwogICAgIGFzc2VydFRydWUoZmFjdG9yeSBpbnN0YW5jZW9mIE1vY2tTaGFyZEhhbmRsZXJGYWN0b3J5KTsKICAgICBOYW1lZExpc3QgYXJncyA9ICgoTW9ja1NoYXJkSGFuZGxlckZhY3RvcnkpZmFjdG9yeSkuYXJnczsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sckluZGV4Q29uZmlnLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFNvbHJJbmRleENvbmZpZy5qYXZhCmluZGV4IDlmYTNhZjEuLmUzMmU2MTAgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sckluZGV4Q29uZmlnLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RTb2xySW5kZXhDb25maWcuamF2YQpAQCAtMTksNiArMTksNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXJDb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUuTG9nZ2luZ0luZm9TdHJlYW07CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogCiBwdWJsaWMgY2xhc3MgVGVzdFNvbHJJbmRleENvbmZpZyBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKQEAgLTMyLDUgKzMzLDYgQEAKICAgICBJbmRleFdyaXRlckNvbmZpZyBpd2MgPSBzb2xyQ29uZmlnLmluZGV4Q29uZmlnLnRvSW5kZXhXcml0ZXJDb25maWcoaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCkpOwogCiAgICAgYXNzZXJ0RXF1YWxzKDEyMywgaXdjLmdldE1heFRocmVhZFN0YXRlcygpKTsKKyAgICBhc3NlcnRUcnVlKGl3Yy5nZXRJbmZvU3RyZWFtKCkgaW5zdGFuY2VvZiBMb2dnaW5nSW5mb1N0cmVhbSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sclhNTFNlcmlhbGl6ZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sclhNTFNlcmlhbGl6ZXIuamF2YQppbmRleCAyYWE4OGYwLi4yYzQyNDllIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFNvbHJYTUxTZXJpYWxpemVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RTb2xyWE1MU2VyaWFsaXplci5qYXZhCkBAIC0xNDMsNiArMTQzLDExIEBACiAgICAgc29sclhNTERlZi5jb250YWluZXJQcm9wZXJ0aWVzID0gY29udGFpbmVyUHJvcGVydGllcyA7CiAgICAgc29sclhNTERlZi5zb2xyQXR0cmlicyA9IHJvb3RTb2xyQXR0cmliczsKICAgICBzb2xyWE1MRGVmLmNvcmVzQXR0cmlicyA9IGNvcmVzQXR0cmliczsKKyAgICBzb2xyWE1MRGVmLmxvZ2dpbmdBdHRyaWJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgc29sclhNTERlZi5zaGFyZEhhbmRsZXJQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHNvbHJYTUxEZWYuc2hhcmRIYW5kbGVyQXR0cmlicyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHNvbHJYTUxEZWYubG9nZ2luZ0F0dHJpYnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBzb2xyWE1MRGVmLndhdGNoZXJBdHRyaWJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgcmV0dXJuIHNvbHJYTUxEZWY7CiAgIH0KICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFNvbHJYbWwuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sclhtbC5qYXZhCmluZGV4IDA5Y2FjNGYuLmFhNTFhYTggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sclhtbC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY29yZS9UZXN0U29sclhtbC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICBib29sZWFuIG9sZFN0eWxlID0gKGNvbmZpZy5nZXROb2RlKCJzb2xyL2NvcmVzIiwgZmFsc2UpICE9IG51bGwpOwogICAgICAgQ29uZmlnU29sciBjZmc7CiAgICAgICBpZiAob2xkU3R5bGUpIHsKLSAgICAgICAgY2ZnID0gbmV3IENvbmZpZ1NvbHJYbWxPbGQoY29uZmlnLCBjYyk7CisgICAgICAgIGNmZyA9IG5ldyBDb25maWdTb2xyWG1sT2xkKGNvbmZpZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBjZmcgPSBuZXcgQ29uZmlnU29sclhtbChjb25maWcsIGNjKTsKICAgICAgIH0KQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgYm9vbGVhbiBvbGRTdHlsZSA9IChjb25maWcuZ2V0Tm9kZSgic29sci9jb3JlcyIsIGZhbHNlKSAhPSBudWxsKTsKICAgICAgIENvbmZpZ1NvbHIgY2ZnOwogICAgICAgaWYgKG9sZFN0eWxlKSB7Ci0gICAgICAgIGNmZyA9IG5ldyBDb25maWdTb2xyWG1sT2xkKGNvbmZpZywgY2MpOworICAgICAgICBjZmcgPSBuZXcgQ29uZmlnU29sclhtbE9sZChjb25maWcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgY2ZnID0gbmV3IENvbmZpZ1NvbHJYbWwoY29uZmlnLCBjYyk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NvcmUvVGVzdFNvbHJYbWxQZXJzaXN0ZW5jZS5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RTb2xyWG1sUGVyc2lzdGVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcyMTBhCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jb3JlL1Rlc3RTb2xyWG1sUGVyc2lzdGVuY2UuamF2YQpAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNvcmU7CisKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLnJ1bGVzLlN5c3RlbVByb3BlcnRpZXNSZXN0b3JlUnVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuQ29yZUFkbWluUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmFkbWluLkNvcmVBZG1pbkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlc3BvbnNlLlNvbHJRdWVyeVJlc3BvbnNlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5SdWxlQ2hhaW47CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRlc3RTb2xyWG1sUGVyc2lzdGVuY2UgZXh0ZW5kcyBTb2xyVGVzdENhc2VKNCB7CisKKyAgcHJpdmF0ZSBGaWxlIHNvbHJIb21lRGlyZWN0b3J5ID0gbmV3IEZpbGUoVEVNUF9ESVIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgIC8qCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpbml0Q29yZSgic29scmNvbmZpZy1taW5pbWFsLnhtbCIsICJzY2hlbWEtdGlueS54bWwiKTsKKyAgfQorICAqLworCisgIEBSdWxlCisgIHB1YmxpYyBUZXN0UnVsZSBzb2xyVGVzdFJ1bGVzID0KKyAgICAgIFJ1bGVDaGFpbi5vdXRlclJ1bGUobmV3IFN5c3RlbVByb3BlcnRpZXNSZXN0b3JlUnVsZSgpKTsKKworCisgIHByaXZhdGUgQ29yZUNvbnRhaW5lciBpbml0KFN0cmluZyBzb2xyWG1sU3RyaW5nLCBTdHJpbmcuLi4gc3ViRGlycykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBjcmVhdGVUZW1wRGlyKCk7CisgICAgc29sckhvbWVEaXJlY3RvcnkgPSBkYXRhRGlyOworCisgICAgZm9yIChTdHJpbmcgcyA6IHN1YkRpcnMpIHsKKyAgICAgIGNvcHlNaW5Db25mKG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCBzKSk7CisgICAgfQorCisgICAgRmlsZSBzb2xyWG1sID0gbmV3IEZpbGUoc29sckhvbWVEaXJlY3RvcnksICJzb2xyLnhtbCIpOworICAgIEZpbGVVdGlscy53cml0ZShzb2xyWG1sLCBzb2xyWG1sU3RyaW5nLCBJT1V0aWxzLkNIQVJTRVRfVVRGXzgudG9TdHJpbmcoKSk7CisKKyAgICBmaW5hbCBDb3JlQ29udGFpbmVyIGNvcmVzID0gY3JlYXRlQ29yZUNvbnRhaW5lcihzb2xySG9tZURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSwgc29sclhtbFN0cmluZyk7CisgICAgcmV0dXJuIGNvcmVzOworICB9CisKKworICAvLyB0YWtlIGEgc29sci54bWwgd2l0aCBzeXN0ZW0gdmFycyBpbiA8c29scj4sIDxjb3Jlcz4gYW5kIDxjb3JlPiBhbmQgPGNvcmUvcHJvcGVydGllcz4gdGFncyB0aGF0IGhhdmUgc3lzdGVtCisgIC8vIHZhcmlhYmxlcyBkZWZpbmVkLiBJbnN1cmUgdGhhdCBhZnRlciBwZXJzaXN0aW5nIHNvbHIueG1sLCB0aGV5J3JlIGFsbCBzdGlsbCB0aGVyZSBhcyAke30gc3ludGF4LgorICAvLyBBbHNvIGluc3VyZSB0aGF0IG5vdGhpbmcgZXh0cmEgY3JlcHQgaW4uCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1WYXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy9TZXQgdGhlc2Ugc3lzdGVtIHByb3BzIGluIG9yZGVyIHRvIGluc3VyZSB0aGF0IHdlIGRvbid0IHdyaXRlIG91dCB0aGUgdmFsdWVzIHJhdGhlciB0aGFuIHRoZSAke30gc3ludGF4LgorICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci56a2NsaWVudHRpbWVvdXQiLCAiOTMiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHJjb25maWciLCAic29scmNvbmZpZy54bWwiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNjaGVtYSIsICJzY2hlbWEueG1sIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJ6a0hvc3RTZXQiLCAibG9jYWxob3N0Ojk5ODMiKTsKKworICAgIENvcmVDb250YWluZXIgY2MgPSBpbml0KFNPTFJfWE1MX0xPVFNfU1lTVkFSUywgIlN5c3RlbVZhcnMxIiwgIlN5c3RlbVZhcnMyIik7CisgICAgdHJ5IHsKKworICAgICAgLy8gVGhpcyBzZWVtcyBvZGQsIGJ1dCBpdCdzIGp1c3QgYSBsaXR0bGUgc2VsZiBjaGVjayB0byBzZWUgaWYgdGhlIGNvbXBhcmlzb24gc3RyaW5ncyBhcmUgYmVpbmcgY3JlYXRlZCBjb3JyZWN0bHkKKyAgICAgIHBlcnNpc3RDb250YWluZWRJbk9yaWcoY2MsIG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29scl9jb3B5LnhtbCIpKTsKKworICAgICAgLy8gSXMgZXZlcnl0aGluZyBpbiB0aGUgcGVyc2lzdGVkIGZpbGUgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbD8KKyAgICAgIGZpbmFsIEZpbGUgcGVyc2lzdFhtbCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic3lzdmFycy5zb2xyLnhtbCIpOworICAgICAgLy8gU2lkZSBlZmZlY3QgaGVyZSBpcyB0aGF0IHRoZSBuZXcgZmlsZSBpcyBwZXJzaXN0ZWQgYW5kIGF2YWlsYWJsZSBsYXRlci4KKyAgICAgIHBlcnNpc3RDb250YWluZWRJbk9yaWcoY2MsIHBlcnNpc3RYbWwpOworCisgICAgICAvLyBJcyBldmVyeXRoaW5nIGluIHRoZSBvcmlnaW5hbCBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlZCBvbmU/CisgICAgICBhc3NlcnRYbWxGaWxlKHBlcnNpc3RYbWwsIGdldEFsbE5vZGVzKG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29sci54bWwiKSkpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNjLnNodXRkb3duKCk7CisgICAgICBpZiAoc29sckhvbWVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShzb2xySG9tZURpcmVjdG9yeSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdoZXRoZXIgdGhlIGNvcmUgaXMgdHJhbnNpZW50IG9yIG5vdCBjYW4gbWFrZSBhIGRpZmZlcmVuY2UuCisgICAgZG9SZWxvYWRUZXN0KCJTeXN0ZW1WYXJzMiIpOworICAgIGRvUmVsb2FkVGVzdCgiU3lzdGVtVmFyczEiKTsKKworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvUmVsb2FkVGVzdChTdHJpbmcgd2hpY2gpIHRocm93cyBFeGNlcHRpb24geworCisgICAgQ29yZUNvbnRhaW5lciBjYyA9IGluaXQoU09MUl9YTUxfTE9UU19TWVNWQVJTLCAiU3lzdGVtVmFyczEiLCAiU3lzdGVtVmFyczIiKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ29yZUFkbWluSGFuZGxlciBhZG1pbiA9IG5ldyBDb3JlQWRtaW5IYW5kbGVyKGNjKTsKKyAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJlc3AgPSBuZXcgU29sclF1ZXJ5UmVzcG9uc2UoKTsKKyAgICAgIGFkbWluLmhhbmRsZVJlcXVlc3RCb2R5CisgICAgICAgICAgKHJlcShDb3JlQWRtaW5QYXJhbXMuQUNUSU9OLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ29yZUFkbWluQWN0aW9uLlJFTE9BRC50b1N0cmluZygpLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ09SRSwgd2hpY2gpLAorICAgICAgICAgICAgICByZXNwKTsKKyAgICAgIGFzc2VydE51bGwoIkV4Y2VwdGlvbiBvbiByZWxvYWQiLCByZXNwLmdldEV4Y2VwdGlvbigpKTsKKworICAgICAgcGVyc2lzdENvbnRhaW5lZEluT3JpZyhjYywgbmV3IEZpbGUoc29sckhvbWVEaXJlY3RvcnksICJyZWxvYWQxLnNvbHIueG1sIikpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNjLnNodXRkb3duKCk7CisgICAgICBpZiAoc29sckhvbWVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShzb2xySG9tZURpcmVjdG9yeSk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZG9UZXN0UmVuYW1lKCJTeXN0ZW1WYXJzMSIpOworICAgIGRvVGVzdFJlbmFtZSgiU3lzdGVtVmFyczIiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb1Rlc3RSZW5hbWUoU3RyaW5nIHdoaWNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb3JlQ29udGFpbmVyIGNjID0gaW5pdChTT0xSX1hNTF9MT1RTX1NZU1ZBUlMsICJTeXN0ZW1WYXJzMSIsICJTeXN0ZW1WYXJzMiIpOworICAgIHRyeSB7CisgICAgICBmaW5hbCBDb3JlQWRtaW5IYW5kbGVyIGFkbWluID0gbmV3IENvcmVBZG1pbkhhbmRsZXIoY2MpOworICAgICAgU29sclF1ZXJ5UmVzcG9uc2UgcmVzcCA9IG5ldyBTb2xyUXVlcnlSZXNwb25zZSgpOworICAgICAgYWRtaW4uaGFuZGxlUmVxdWVzdEJvZHkKKyAgICAgICAgICAocmVxKENvcmVBZG1pblBhcmFtcy5BQ1RJT04sCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5Db3JlQWRtaW5BY3Rpb24uUkVOQU1FLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5DT1JFLCB3aGljaCwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLk9USEVSLCAiUmVuYW1lZENvcmUiKSwKKyAgICAgICAgICAgICAgcmVzcCk7CisgICAgICBhc3NlcnROdWxsKCJFeGNlcHRpb24gb24gcmVuYW1lIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIEZpbGUgcGVyc2lzdFhtbCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAicmVuYW1lLnNvbHIueG1sIik7CisgICAgICBGaWxlIG9yaWdYbWwgPSBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInNvbHIueG1sIik7CisKKyAgICAgIC8vIE9LLCBBc3N1cmUgdGhhdCBpZiBJIGNoYW5nZSBldmVyeXRoaW5nIHRoYXQgaGFzIGJlZW4gcmVuYW1lZCB3aXRoIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlIGNvcmUsIGl0IG1hdGNoZXMKKyAgICAgIC8vIHRoZSBvbGQgbGlzdAorICAgICAgY2MucGVyc2lzdEZpbGUocGVyc2lzdFhtbCk7CisgICAgICBTdHJpbmdbXSBwZXJzaXN0TGlzdCA9IGdldEFsbE5vZGVzKHBlcnNpc3RYbWwpOworICAgICAgU3RyaW5nW10gZXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nW3BlcnNpc3RMaXN0Lmxlbmd0aF07CisKKyAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHBlcnNpc3RMaXN0Lmxlbmd0aDsgKytpZHgpIHsKKyAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF0ucmVwbGFjZUFsbCgiUmVuYW1lZENvcmUiLCB3aGljaCk7CisgICAgICB9CisKKyAgICAgIGFzc2VydFhtbEZpbGUob3JpZ1htbCwgZXhwcmVzc2lvbnMpOworCisgICAgICAvLyBOb3cgdGhlIG90aGVyIHdheSwgSWYgSSByZXBsYWNlIHRoZSBvcmlnaW5hbCBuYW1lIGluIHRoZSBvcmlnaW5hbCBYTUwgZmlsZSB3aXRoICJSZW5hbWVkQ29yZSIsIGRvZXMgaXQgbWF0Y2gKKyAgICAgIC8vIHdoYXQgd2FzIHBlcnNpc3RlZD8KKyAgICAgIHBlcnNpc3RMaXN0ID0gZ2V0QWxsTm9kZXMob3JpZ1htbCk7CisgICAgICBleHByZXNzaW9ucyA9IG5ldyBTdHJpbmdbcGVyc2lzdExpc3QubGVuZ3RoXTsKKyAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHBlcnNpc3RMaXN0Lmxlbmd0aDsgKytpZHgpIHsKKyAgICAgICAgLy8gL3NvbHIvY29yZXMvY29yZVtAbmFtZT0nU3lzdGVtVmFyczEnIGFuZCBAY29sbGVjdGlvbj0nJHtjb2xsZWN0aW9uOmNvbGxlY3Rpb24xfSddCisgICAgICAgIGV4cHJlc3Npb25zW2lkeF0gPSBwZXJzaXN0TGlzdFtpZHhdLnJlcGxhY2UoIkBuYW1lPSciICsgd2hpY2ggKyAiJyIsICJAbmFtZT0nUmVuYW1lZENvcmUnIik7CisgICAgICB9CisKKyAgICAgIGFzc2VydFhtbEZpbGUocGVyc2lzdFhtbCwgZXhwcmVzc2lvbnMpOworICAgIH0gZmluYWxseSB7CisgICAgICBjYy5zaHV0ZG93bigpOworICAgICAgaWYgKHNvbHJIb21lRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcnkoc29sckhvbWVEaXJlY3RvcnkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTd2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZG9UZXN0U3dhcCgiU3lzdGVtVmFyczEiLCAiU3lzdGVtVmFyczIiKTsKKyAgICBkb1Rlc3RTd2FwKCJTeXN0ZW1WYXJzMiIsICJTeXN0ZW1WYXJzMSIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvVGVzdFN3YXAoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29yZUNvbnRhaW5lciBjYyA9IGluaXQoU09MUl9YTUxfTE9UU19TWVNWQVJTLCAiU3lzdGVtVmFyczEiLCAiU3lzdGVtVmFyczIiKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ29yZUFkbWluSGFuZGxlciBhZG1pbiA9IG5ldyBDb3JlQWRtaW5IYW5kbGVyKGNjKTsKKyAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJlc3AgPSBuZXcgU29sclF1ZXJ5UmVzcG9uc2UoKTsKKyAgICAgIGFkbWluLmhhbmRsZVJlcXVlc3RCb2R5CisgICAgICAgICAgKHJlcShDb3JlQWRtaW5QYXJhbXMuQUNUSU9OLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ29yZUFkbWluQWN0aW9uLlNXQVAudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLkNPUkUsIGZyb20sCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5PVEhFUiwgdG8pLAorICAgICAgICAgICAgICByZXNwKTsKKyAgICAgIGFzc2VydE51bGwoIkV4Y2VwdGlvbiBvbiBzd2FwIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIEZpbGUgcGVyc2lzdFhtbCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAicmVuYW1lLnNvbHIueG1sIik7CisgICAgICBGaWxlIG9yaWdYbWwgPSBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInNvbHIueG1sIik7CisKKyAgICAgIGNjLnBlcnNpc3RGaWxlKHBlcnNpc3RYbWwpOworICAgICAgU3RyaW5nW10gcGVyc2lzdExpc3QgPSBnZXRBbGxOb2RlcyhwZXJzaXN0WG1sKTsKKyAgICAgIFN0cmluZ1tdIGV4cHJlc3Npb25zID0gbmV3IFN0cmluZ1twZXJzaXN0TGlzdC5sZW5ndGhdOworCisgICAgICAvLyBOb3cgbWFudWFsbHkgY2hhbmdlIHRoZSBuYW1lcyBiYWNrIGFuZCBpdCBzaG91bGQgbWF0Y2ggZXhhY3RseSB0byB0aGUgb3JpZ2luYWwgWE1MLgorICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgcGVyc2lzdExpc3QubGVuZ3RoOyArK2lkeCkgeworICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSAiQG5hbWU9JyIgKyBmcm9tICsgIiciOworICAgICAgICBTdHJpbmcgdG9OYW1lID0gIkBuYW1lPSciICsgdG8gKyAiJyI7CisgICAgICAgIGlmIChwZXJzaXN0TGlzdFtpZHhdLmNvbnRhaW5zKGZyb21OYW1lKSkgeworICAgICAgICAgIGV4cHJlc3Npb25zW2lkeF0gPSBwZXJzaXN0TGlzdFtpZHhdLnJlcGxhY2UoZnJvbU5hbWUsIHRvTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF0ucmVwbGFjZSh0b05hbWUsIGZyb21OYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhc3NlcnRYbWxGaWxlKG9yaWdYbWwsIGV4cHJlc3Npb25zKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBjYy5zaHV0ZG93bigpOworICAgICAgaWYgKHNvbHJIb21lRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcnkoc29sckhvbWVEaXJlY3RvcnkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbWFsWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29yZUNvbnRhaW5lciBjYyA9IGluaXQoU09MUl9YTUxfTUlOSU1BTCwgIlN5c3RlbVZhcnMxIik7CisgICAgdHJ5IHsKKyAgICAgIHBlcnNpc3RDb250YWluZWRJbk9yaWcoY2MsIG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAibWluaW1hbC5zb2xyLnhtbCIpKTsKKyAgICAgIG9yaWdDb250YWluZWRJblBlcnNpc3QoY2MsIG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAibWluaW1hbC5zb2xyLnhtbCIpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgY2Muc2h1dGRvd24oKTsKKyAgICAgIGlmIChzb2xySG9tZURpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KHNvbHJIb21lRGlyZWN0b3J5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFVubG9hZENyZWF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGRvVGVzdFVubG9hZENyZWF0ZSgiU3lzdGVtVmFyczEiKTsKKyAgICBkb1Rlc3RVbmxvYWRDcmVhdGUoIlN5c3RlbVZhcnMyIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgZG9UZXN0VW5sb2FkQ3JlYXRlKFN0cmluZyB3aGljaCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29yZUNvbnRhaW5lciBjYyA9IGluaXQoU09MUl9YTUxfTE9UU19TWVNWQVJTLCAiU3lzdGVtVmFyczEiLCAiU3lzdGVtVmFyczIiKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ29yZUFkbWluSGFuZGxlciBhZG1pbiA9IG5ldyBDb3JlQWRtaW5IYW5kbGVyKGNjKTsKKworICAgICAgU29sclF1ZXJ5UmVzcG9uc2UgcmVzcCA9IG5ldyBTb2xyUXVlcnlSZXNwb25zZSgpOworICAgICAgYWRtaW4uaGFuZGxlUmVxdWVzdEJvZHkKKyAgICAgICAgICAocmVxKENvcmVBZG1pblBhcmFtcy5BQ1RJT04sCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5Db3JlQWRtaW5BY3Rpb24uVU5MT0FELnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5DT1JFLCB3aGljaCksCisgICAgICAgICAgICAgIHJlc3ApOworICAgICAgYXNzZXJ0TnVsbCgiRXhjZXB0aW9uIG9uIHVubG9hZCIsIHJlc3AuZ2V0RXhjZXB0aW9uKCkpOworCisgICAgICBwZXJzaXN0Q29udGFpbmVkSW5PcmlnKGNjLCBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInVubG9hZGNyZWF0ZTEuc29sci54bWwiKSk7CisKKyAgICAgIFN0cmluZyBpbnN0UGF0aCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCB3aGljaCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICBhZG1pbi5oYW5kbGVSZXF1ZXN0Qm9keQorICAgICAgICAgIChyZXEoQ29yZUFkbWluUGFyYW1zLkFDVElPTiwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLkNvcmVBZG1pbkFjdGlvbi5DUkVBVEUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLklOU1RBTkNFX0RJUiwgaW5zdFBhdGgsCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5OQU1FLCB3aGljaCksCisgICAgICAgICAgICAgIHJlc3ApOworICAgICAgYXNzZXJ0TnVsbCgiRXhjZXB0aW9uIG9uIGNyZWF0ZSIsIHJlc3AuZ2V0RXhjZXB0aW9uKCkpOworCisgICAgICBGaWxlIHBlcnNpc3RYbWwgPSBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInJlbmFtZS5zb2xyLnhtbCIpOworICAgICAgRmlsZSBvcmlnWG1sID0gbmV3IEZpbGUoc29sckhvbWVEaXJlY3RvcnksICJzb2xyLnhtbCIpOworCisgICAgICBjYy5wZXJzaXN0RmlsZShwZXJzaXN0WG1sKTsKKyAgICAgIFN0cmluZ1tdIHBlcnNpc3RMaXN0ID0gZ2V0QWxsTm9kZXMocGVyc2lzdFhtbCk7CisgICAgICBTdHJpbmdbXSBleHByZXNzaW9ucyA9IG5ldyBTdHJpbmdbcGVyc2lzdExpc3QubGVuZ3RoXTsKKworICAgICAgLy8gTm93IG1hbnVhbGx5IGNoYW5nZSB0aGUgbmFtZXMgYmFjayBhbmQgaXQgc2hvdWxkIG1hdGNoIGV4YWN0bHkgdG8gdGhlIG9yaWdpbmFsIFhNTC4KKyAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHBlcnNpc3RMaXN0Lmxlbmd0aDsgKytpZHgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiQG5hbWU9JyIgKyB3aGljaCArICInIjsKKworICAgICAgICBpZiAocGVyc2lzdExpc3RbaWR4XS5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgIGlmIChwZXJzaXN0TGlzdFtpZHhdLmNvbnRhaW5zKCJAc2NoZW1hPSdzY2hlbWEueG1sJyIpKSB7CisgICAgICAgICAgICBleHByZXNzaW9uc1tpZHhdID0gcGVyc2lzdExpc3RbaWR4XS5yZXBsYWNlKCJzY2hlbWEueG1sIiwgIiR7c2NoZW1hOnNjaGVtYS54bWx9Iik7CisgICAgICAgICAgfSBlbHNlIGlmIChwZXJzaXN0TGlzdFtpZHhdLmNvbnRhaW5zKCJAY29uZmlnPSdzb2xyY29uZmlnLnhtbCciKSkgeworICAgICAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF0ucmVwbGFjZSgic29scmNvbmZpZy54bWwiLCAiJHtzb2xyY29uZmlnOnNvbHJjb25maWcueG1sfSIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGVyc2lzdExpc3RbaWR4XS5jb250YWlucygiQGluc3RhbmNlRGlyPSIpKSB7CisgICAgICAgICAgICBleHByZXNzaW9uc1tpZHhdID0gcGVyc2lzdExpc3RbaWR4XS5yZXBsYWNlRmlyc3QoImluc3RhbmNlRGlyXFw9Jy4qPyciLCAiaW5zdGFuY2VEaXI9JyIgKyB3aGljaCArICIvJyIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHByZXNzaW9uc1tpZHhdID0gcGVyc2lzdExpc3RbaWR4XTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXNzZXJ0WG1sRmlsZShvcmlnWG1sLCBleHByZXNzaW9ucyk7CisKKworICAgIH0gZmluYWxseSB7CisgICAgICBjYy5zaHV0ZG93bigpOworICAgICAgaWYgKHNvbHJIb21lRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcnkoc29sckhvbWVEaXJlY3RvcnkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwZXJzaXN0Q29udGFpbmVkSW5PcmlnKENvcmVDb250YWluZXIgY2MsIEZpbGUgcGVyc2lzdFhtbCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBjYy5wZXJzaXN0RmlsZShwZXJzaXN0WG1sKTsKKyAgICAvLyBJcyBldmVyeXRoaW5nIHRoYXQncyBpbiB0aGUgb3JpZ2luYWwgZmlsZSBwZXJzaXN0ZWQ/CisgICAgU3RyaW5nW10gZXhwcmVzc2lvbnMgPSBnZXRBbGxOb2RlcyhwZXJzaXN0WG1sKTsKKyAgICBhc3NlcnRYbWxGaWxlKG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29sci54bWwiKSwgZXhwcmVzc2lvbnMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIG9yaWdDb250YWluZWRJblBlcnNpc3QoQ29yZUNvbnRhaW5lciBjYywgRmlsZSBwZXJzaXN0WG1sKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgIGNjLnBlcnNpc3RGaWxlKHBlcnNpc3RYbWwpOworICAgIC8vIElzIGV2ZXJ5dGhpbmcgdGhhdCdzIGluIHRoZSBvcmlnaW5hbCBmaWxlIHBlcnNpc3RlZD8KKyAgICBTdHJpbmdbXSBleHByZXNzaW9ucyA9IGdldEFsbE5vZGVzKG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29sci54bWwiKSk7CisgICAgYXNzZXJ0WG1sRmlsZShwZXJzaXN0WG1sLCBleHByZXNzaW9ucyk7CisgIH0KKworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5pcHVsYXRlQ29yZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb3JlQ29udGFpbmVyIGNjID0gaW5pdChTT0xSX1hNTF9MT1RTX1NZU1ZBUlMsICJTeXN0ZW1WYXJzMSIsICJTeXN0ZW1WYXJzMiIsICJuZXdfb25lIiwgIm5ld190d28iKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ29yZUFkbWluSGFuZGxlciBhZG1pbiA9IG5ldyBDb3JlQWRtaW5IYW5kbGVyKGNjKTsKKyAgICAgIFN0cmluZyBpbnN0UGF0aE9uZSA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAibmV3X29uZSIpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgU29sclF1ZXJ5UmVzcG9uc2UgcmVzcCA9IG5ldyBTb2xyUXVlcnlSZXNwb25zZSgpOworICAgICAgYWRtaW4uaGFuZGxlUmVxdWVzdEJvZHkKKyAgICAgICAgICAocmVxKENvcmVBZG1pblBhcmFtcy5BQ1RJT04sCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5Db3JlQWRtaW5BY3Rpb24uQ1JFQVRFLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5JTlNUQU5DRV9ESVIsIGluc3RQYXRoT25lLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuTkFNRSwgIm5ld19vbmUiKSwKKyAgICAgICAgICAgICAgcmVzcCk7CisgICAgICBhc3NlcnROdWxsKCJFeGNlcHRpb24gb24gY3JlYXRlIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIGFkbWluLmhhbmRsZVJlcXVlc3RCb2R5CisgICAgICAgICAgKHJlcShDb3JlQWRtaW5QYXJhbXMuQUNUSU9OLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ29yZUFkbWluQWN0aW9uLkNSRUFURS50b1N0cmluZygpLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuTkFNRSwgIm5ld190d28iKSwKKyAgICAgICAgICAgICAgcmVzcCk7CisgICAgICBhc3NlcnROdWxsKCJFeGNlcHRpb24gb24gY3JlYXRlIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIEZpbGUgcGVyc2lzdFhtbDEgPSBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgImNyZWF0ZV9tYW5fMS54bWwiKTsKKyAgICAgIG9yaWdDb250YWluZWRJblBlcnNpc3QoY2MsIHBlcnNpc3RYbWwxKTsKKworICAgICAgLy8gV2Uga25vdyBhbGwgdGhlIG9yaWdpbmFsIGRhdGEgaXMgaW4gcGVyc2lzdCwgbm93IGNoZWNrIGZvciBuZXdseS1jcmVhdGVkIGZpbGVzLgorICAgICAgU3RyaW5nW10gZXhwcmVzc2lvbnMgPSBuZXcgIFN0cmluZ1syXTsKKyAgICAgIFN0cmluZyBpbnN0SG9tZSA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAibmV3X29uZSIpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgZXhwcmVzc2lvbnNbMF0gPSAiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0nbmV3X29uZScgYW5kIEBpbnN0YW5jZURpcj0nIiArIGluc3RIb21lICsgIiddIjsKKyAgICAgIGV4cHJlc3Npb25zWzFdID0gIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J25ld190d28nIGFuZCBAaW5zdGFuY2VEaXI9J25ld190d28iICsgRmlsZS5zZXBhcmF0b3IgKyAiJ10iOworCisgICAgICBhc3NlcnRYbWxGaWxlKHBlcnNpc3RYbWwxLCBleHByZXNzaW9ucyk7CisKKyAgICAgIC8vIE5leHQsIHN3YXAgYSBjcmVhdGVkIGNvcmUgYW5kIGNoZWNrCisgICAgICByZXNwID0gbmV3IFNvbHJRdWVyeVJlc3BvbnNlKCk7CisgICAgICBhZG1pbi5oYW5kbGVSZXF1ZXN0Qm9keQorICAgICAgICAgIChyZXEoQ29yZUFkbWluUGFyYW1zLkFDVElPTiwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLkNvcmVBZG1pbkFjdGlvbi5TV0FQLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5DT1JFLCAibmV3X29uZSIsCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5PVEhFUiwgIlN5c3RlbVZhcnMyIiksCisgICAgICAgICAgICAgIHJlc3ApOworICAgICAgYXNzZXJ0TnVsbCgiRXhjZXB0aW9uIG9uIHN3YXAiLCByZXNwLmdldEV4Y2VwdGlvbigpKTsKKworICAgICAgRmlsZSBwZXJzaXN0WG1sMiA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAiY3JlYXRlX21hbl8yLnhtbCIpOworCisgICAgICBjYy5wZXJzaXN0RmlsZShwZXJzaXN0WG1sMik7CisgICAgICBTdHJpbmdbXSBwZXJzaXN0TGlzdCA9IGdldEFsbE5vZGVzKHBlcnNpc3RYbWwyKTsKKyAgICAgIGV4cHJlc3Npb25zID0gbmV3IFN0cmluZ1twZXJzaXN0TGlzdC5sZW5ndGhdOworCisgICAgICAvLyBOb3cgbWFudWFsbHkgY2hhbmdlIHRoZSBuYW1lcyBiYWNrIGFuZCBpdCBzaG91bGQgbWF0Y2ggZXhhY3RseSB0byB0aGUgb3JpZ2luYWwgWE1MLgorICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgcGVyc2lzdExpc3QubGVuZ3RoOyArK2lkeCkgeworICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSAiQG5hbWU9J25ld19vbmUnIjsKKyAgICAgICAgU3RyaW5nIHRvTmFtZSA9ICJAbmFtZT0nU3lzdGVtVmFyczInIjsKKyAgICAgICAgaWYgKHBlcnNpc3RMaXN0W2lkeF0uY29udGFpbnMoZnJvbU5hbWUpKSB7CisgICAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF0ucmVwbGFjZShmcm9tTmFtZSwgdG9OYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBleHByZXNzaW9uc1tpZHhdID0gcGVyc2lzdExpc3RbaWR4XS5yZXBsYWNlKHRvTmFtZSwgZnJvbU5hbWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydFhtbEZpbGUocGVyc2lzdFhtbDEsIGV4cHJlc3Npb25zKTsKKworICAgICAgLy8gVGhlbiByZW5hbWUgdGhlIG90aGVyIGNyZWF0ZWQgY29yZSBhbmQgY2hlY2sKKyAgICAgIGFkbWluLmhhbmRsZVJlcXVlc3RCb2R5CisgICAgICAgICAgKHJlcShDb3JlQWRtaW5QYXJhbXMuQUNUSU9OLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ29yZUFkbWluQWN0aW9uLlJFTkFNRS50b1N0cmluZygpLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ09SRSwgIm5ld190d28iLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuT1RIRVIsICJSZW5hbWVkQ29yZSIpLAorICAgICAgICAgICAgICByZXNwKTsKKyAgICAgIGFzc2VydE51bGwoIkV4Y2VwdGlvbiBvbiByZW5hbWUiLCByZXNwLmdldEV4Y2VwdGlvbigpKTsKKworICAgICAgRmlsZSBwZXJzaXN0WG1sMyA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAiY3JlYXRlX21hbl8zLnhtbCIpOworCisgICAgICAvLyBPSywgQXNzdXJlIHRoYXQgaWYgSSBjaGFuZ2UgZXZlcnl0aGluZyB0aGF0IGhhcyBiZWVuIHJlbmFtZWQgd2l0aCB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRoZSBjb3JlLCBpdCBtYXRjaGVzCisgICAgICAvLyB0aGUgb2xkIGxpc3QKKyAgICAgIGNjLnBlcnNpc3RGaWxlKHBlcnNpc3RYbWwzKTsKKyAgICAgIHBlcnNpc3RMaXN0ID0gZ2V0QWxsTm9kZXMocGVyc2lzdFhtbDMpOworICAgICAgZXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nW3BlcnNpc3RMaXN0Lmxlbmd0aF07CisKKyAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHBlcnNpc3RMaXN0Lmxlbmd0aDsgKytpZHgpIHsKKyAgICAgICAgZXhwcmVzc2lvbnNbaWR4XSA9IHBlcnNpc3RMaXN0W2lkeF0ucmVwbGFjZUFsbCgiUmVuYW1lZENvcmUiLCAibmV3X3R3byIpOworICAgICAgfQorICAgICAgYXNzZXJ0WG1sRmlsZShwZXJzaXN0WG1sMiwgZXhwcmVzc2lvbnMpOworCisgICAgICAvLyBOb3cgdGhlIG90aGVyIHdheSwgSWYgSSByZXBsYWNlIHRoZSBvcmlnaW5hbCBuYW1lIGluIHRoZSBvcmlnaW5hbCBYTUwgZmlsZSB3aXRoICJSZW5hbWVkQ29yZSIsIGRvZXMgaXQgbWF0Y2gKKyAgICAgIC8vIHdoYXQgd2FzIHBlcnNpc3RlZD8KKyAgICAgIHBlcnNpc3RMaXN0ID0gZ2V0QWxsTm9kZXMocGVyc2lzdFhtbDIpOworICAgICAgZXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nW3BlcnNpc3RMaXN0Lmxlbmd0aF07CisgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBwZXJzaXN0TGlzdC5sZW5ndGg7ICsraWR4KSB7CisgICAgICAgIC8vIC9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J1N5c3RlbVZhcnMxJyBhbmQgQGNvbGxlY3Rpb249JyR7Y29sbGVjdGlvbjpjb2xsZWN0aW9uMX0nXQorICAgICAgICBleHByZXNzaW9uc1tpZHhdID0gcGVyc2lzdExpc3RbaWR4XS5yZXBsYWNlKCJAbmFtZT0nbmV3X3R3byciLCAiQG5hbWU9J1JlbmFtZWRDb3JlJyIpOworICAgICAgfQorICAgICAgYXNzZXJ0WG1sRmlsZShwZXJzaXN0WG1sMywgZXhwcmVzc2lvbnMpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNjLnNodXRkb3duKCk7CisgICAgICBpZiAoc29sckhvbWVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShzb2xySG9tZURpcmVjdG9yeSk7CisgICAgICB9CisgICAgfQorCisKKyAgfQorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGVyc2lzdENvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZW1wbGF0ZSBmb3IgY3JlYXRpbmcgYSBjb3JlLgorICAgIENvcmVDb250YWluZXIgY2MgPSBpbml0KFNPTFJfWE1MX0xPVFNfU1lTVkFSUywgIlN5c3RlbVZhcnMxIiwgIlN5c3RlbVZhcnMyIiwgInByb3BzMSIsICJwcm9wczIiKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ29yZUFkbWluSGFuZGxlciBhZG1pbiA9IG5ldyBDb3JlQWRtaW5IYW5kbGVyKGNjKTsKKyAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb3JlICh1c2luZyBDb3JlQWRtaW5IYW5kbGVyKSB3LyBwcm9wZXJ0aWVzCisgICAgICBTdHJpbmcgaW5zdFBhdGgxID0gbmV3IEZpbGUoc29sckhvbWVEaXJlY3RvcnksICJwcm9wczEiKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJlc3AgPSBuZXcgU29sclF1ZXJ5UmVzcG9uc2UoKTsKKyAgICAgIGFkbWluLmhhbmRsZVJlcXVlc3RCb2R5CisgICAgICAgICAgKHJlcShDb3JlQWRtaW5QYXJhbXMuQUNUSU9OLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ29yZUFkbWluQWN0aW9uLkNSRUFURS50b1N0cmluZygpLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuTkFNRSwgInByb3BzMSIsCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5UUkFOU0lFTlQsICJ0cnVlIiwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLkxPQURfT05fU1RBUlRVUCwgInRydWUiLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYICsgInByZWZpeDEiLCAidmFsdWVwMSIsCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5QUk9QRVJUWV9QUkVGSVggKyAicHJlZml4MiIsICJ2YWx1ZVAyIiwKKyAgICAgICAgICAgICAgInd0IiwgImpzb24iLCAvLyBuZWVkIHRvIGluc3VyZSB0aGF0IGV4dHJhIHBhcmFtZXRlcnMgYXJlIF9ub3RfIHByZXNlcnZlZCAoYWN0dWFsbHkgaGFwcGVuZWQpLgorICAgICAgICAgICAgICAicXQiLCAiYWRtaW4vY29yZXMiKSwKKyAgICAgICAgICAgICAgcmVzcCk7CisgICAgICBhc3NlcnROdWxsKCJFeGNlcHRpb24gb24gY3JlYXRlIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIFN0cmluZyBpbnN0UGF0aDIgPSBuZXcgRmlsZShzb2xySG9tZURpcmVjdG9yeSwgInByb3BzMiIpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgYWRtaW4uaGFuZGxlUmVxdWVzdEJvZHkKKyAgICAgICAgICAocmVxKENvcmVBZG1pblBhcmFtcy5BQ1RJT04sCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5Db3JlQWRtaW5BY3Rpb24uQ1JFQVRFLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIENvcmVBZG1pblBhcmFtcy5JTlNUQU5DRV9ESVIsIGluc3RQYXRoMiwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLk5BTUUsICJwcm9wczIiLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYICsgInByZWZpeDJfMSIsICJ2YWx1ZXAyXzEiLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuUFJPUEVSVFlfUFJFRklYICsgInByZWZpeDJfMiIsICJ2YWx1ZVAyXzIiLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuQ09ORklHLCAic29scmNvbmZpZy54bWwiLAorICAgICAgICAgICAgICBDb3JlQWRtaW5QYXJhbXMuREFUQV9ESVIsICIuL2RhdGFEaXJUZXN0IiwKKyAgICAgICAgICAgICAgQ29yZUFkbWluUGFyYW1zLlNDSEVNQSwgInNjaGVtYS54bWwiKSwKKyAgICAgICAgICAgICAgcmVzcCk7CisgICAgICBhc3NlcnROdWxsKCJFeGNlcHRpb24gb24gY3JlYXRlIiwgcmVzcC5nZXRFeGNlcHRpb24oKSk7CisKKyAgICAgIC8vIEV2ZXJ5dGhpbmcgdGhhdCB3YXMgaW4gdGhlIG9yaWdpbmFsIFhNTCBmaWxlIHNob3VsZCBiZSBpbiB0aGUgcGVyc2lzdGVkIG9uZS4KKyAgICAgIGZpbmFsIEZpbGUgcGVyc2lzdFhtbCA9IG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAicGVyc2lzdF9jcmVhdGVfY29yZS5zb2xyLnhtbCIpOworICAgICAgY2MucGVyc2lzdEZpbGUocGVyc2lzdFhtbCk7CisgICAgICBhc3NlcnRYbWxGaWxlKHBlcnNpc3RYbWwsIGdldEFsbE5vZGVzKG5ldyBGaWxlKHNvbHJIb21lRGlyZWN0b3J5LCAic29sci54bWwiKSkpOworCisgICAgICAvLyBBbmQgdGhlIHBhcmFtcyBmb3IgdGhlIG5ldyBjb3JlIHNob3VsZCBiZSBpbiB0aGUgcGVyc2lzdGVkIGZpbGUuCisgICAgICBhc3NlcnRYbWxGaWxlCisgICAgICAgICAgKHBlcnNpc3RYbWwKKyAgICAgICAgICAgICAgLCAiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0ncHJvcHMxJ10vcHJvcGVydHlbQG5hbWU9J3ByZWZpeDEnIGFuZCBAdmFsdWU9J3ZhbHVlcDEnXSIKKyAgICAgICAgICAgICAgLCAiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0ncHJvcHMxJ10vcHJvcGVydHlbQG5hbWU9J3ByZWZpeDInIGFuZCBAdmFsdWU9J3ZhbHVlUDInXSIKKyAgICAgICAgICAgICAgLCAiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0ncHJvcHMxJyBhbmQgQHRyYW5zaWVudD0ndHJ1ZSddIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczEnIGFuZCBAbG9hZE9uU3RhcnR1cD0ndHJ1ZSddIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczEnIGFuZCBAaW5zdGFuY2VEaXI9J3Byb3BzMSIgKyBGaWxlLnNlcGFyYXRvciArICInXSIKKyAgICAgICAgICAgICAgLCAiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0ncHJvcHMyJ10vcHJvcGVydHlbQG5hbWU9J3ByZWZpeDJfMScgYW5kIEB2YWx1ZT0ndmFsdWVwMl8xJ10iCisgICAgICAgICAgICAgICwgIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J3Byb3BzMiddL3Byb3BlcnR5W0BuYW1lPSdwcmVmaXgyXzInIGFuZCBAdmFsdWU9J3ZhbHVlUDJfMiddIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczInIGFuZCBAY29uZmlnPSdzb2xyY29uZmlnLnhtbCddIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczInIGFuZCBAc2NoZW1hPSdzY2hlbWEueG1sJ10iCisgICAgICAgICAgICAgICwgIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J3Byb3BzMicgYW5kIG5vdChAbG9hZE9uU3RhcnR1cCldIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczInIGFuZCBub3QoQHRyYW5zaWVudCldIgorICAgICAgICAgICAgICAsICIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdwcm9wczInIGFuZCBAaW5zdGFuY2VEaXI9JyIgKyBpbnN0UGF0aDIgKyAiJ10iCisgICAgICAgICAgICAgICwgIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J3Byb3BzMicgYW5kIEBkYXRhRGlyPScuL2RhdGFEaXJUZXN0J10iCisgICAgICAgICAgKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBjYy5zaHV0ZG93bigpOworICAgICAgaWYgKHNvbHJIb21lRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcnkoc29sckhvbWVEaXJlY3RvcnkpOworICAgICAgfQorCisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxOb2RlcyhGaWxlIHhtbEZpbGUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsgLy8gWFBBVEggYW5kIHZhbHVlIGZvciBhbGwgZWxlbWVudHMgaW4gdGhlIGluZGljYXRlZCBYTUwKKyAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY0J1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQorICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRvY0J1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jQnVpbGRlci5wYXJzZSh4bWxGaWxlKTsKKworICAgIE5vZGUgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOworICAgIGdhdGhlck5vZGVzKHJvb3QsIGV4cHJlc3Npb25zLCAiIik7CisgICAgcmV0dXJuIGV4cHJlc3Npb25zLnRvQXJyYXkobmV3IFN0cmluZ1tleHByZXNzaW9ucy5zaXplKCldKTsKKyAgfQorCisKKyAgLy8gTm90ZSB0aGlzIGlzIHByZXR0eSBzcGVjaWFsaXplZCBmb3IgYSBzb2xyLnhtbCBmaWxlIGJlY2F1c2Ugd29ya2luZyB3aXRoIHRoZSBET00gaXMgc3VjaCBhIHBhaW4uCisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHF1YWxpZmllZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHt7CisgICAgYWRkKCJjb3JlIik7CisgICAgYWRkKCJwcm9wZXJ0eSIpOworICAgIGFkZCgiaW50Iik7CisgICAgYWRkKCJzdHIiKTsKKyAgICBhZGQoImxvbmciKTsKKyAgICBhZGQoInByb3BlcnR5Iik7CisgIH19OworCisgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBhZGRUZXh0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkge3sKKyAgICBhZGQoImludCIpOworICAgIGFkZCgic3RyIik7CisgICAgYWRkKCJsb25nIik7CisgIH19OworCisgIC8vIHBhdGggaXMgdGhlIHBhdGggdG8gcGFyZW50IG5vZGUKKworICBwcml2YXRlIHZvaWQgZ2F0aGVyTm9kZXMoTm9kZSBub2RlLCBMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIFN0cmluZyBwYXRoKSB7CisKKyAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7CisgICAgU3RyaW5nIHRoaXNQYXRoID0gcGF0aCArICIvIiArIG5vZGVOYW1lOworICAgIC8vUGFyZW50W0BpZD0nMSddL0NoaWxkcmVuL2NoaWxkW0BuYW1lXQorICAgIC8vIEFkZCBpbiB0aGUgeHBhdGhzIGZvciB2ZXJpZmljYXRpb24gb2YgYW55IGF0dHJpYnV0ZXMuCisgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgU3RyaW5nIHF1YWxpZmllciA9ICIiOworICAgIGlmIChhdHRycy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIC8vIEFzc2VtYmxlIHRoZSBwcmVmaXggZm9yIHF1YWxpZnlpbmcgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAgaWYgKHF1YWxpZmllZC5jb250YWlucyhub2RlTmFtZSkpIHsKKyAgICAgICAgcXVhbGlmaWVyID0gIkBuYW1lPSciICsgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0VGV4dENvbnRlbnQoKSArICInIjsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraWR4KSB7CisKKyAgICAgICAgTm9kZSBhdHRyID0gYXR0cnMuaXRlbShpZHgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhxdWFsaWZpZXIpICYmICJuYW1lIi5lcXVhbHMoYXR0ci5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICAgIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGFkZGVkICJuYW1lIiBhdHRyaWJ1dGUgaW4gcXVhbGlmaWVyIHN0cmluZy4KKyAgICAgICAgfQorICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhxdWFsaWZpZXIpKSB7CisgICAgICAgICAgLy8gQ3JlYXRlIFtAbmFtZT0ic3R1ZmYiIGFuZCBAYXR0cmliPSJ2YWx1ZSJdIGZyYWdtZW50CisgICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKHRoaXNQYXRoICsKKyAgICAgICAgICAgICAgIlsiICsgcXVhbGlmaWVyICsgIiBhbmQgQCIgKyBhdHRyLmdldE5vZGVOYW1lKCkgKyAiPSciICsgYXR0ci5nZXRUZXh0Q29udGVudCgpICsgIiddIik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBDcmVhdGUgW0BhdHRyaWI9InZhbHVlIl0gZnJhZ21lbnQKKyAgICAgICAgICBleHByZXNzaW9ucy5hZGQodGhpc1BhdGggKworICAgICAgICAgICAgICAiWyIgKyBxdWFsaWZpZXIgKyAiIEAiICsgYXR0ci5nZXROb2RlTmFtZSgpICsgIj0nIiArIGF0dHIuZ2V0VGV4dENvbnRlbnQoKSArICInXSIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIE5vdyBhZGQgdGhlIHRleHQgZm9yIHNwZWNpYWwgbm9kZXMKKyAgICAvLyBhW25vcm1hbGl6ZS1zcGFjZSh0ZXh0KCkpPSdzb21lc2l0ZSddCisgICAgaWYgKGFkZFRleHQuY29udGFpbnMobm9kZU5hbWUpKSB7CisgICAgICBleHByZXNzaW9ucy5hZGQodGhpc1BhdGggKyAiWyIgKyBxdWFsaWZpZXIgKyAiIGFuZCB0ZXh0KCk9JyIgKyBub2RlLmdldFRleHRDb250ZW50KCkgKyAiJ10iKTsKKyAgICB9CisgICAgLy8gTm93IGNvbGxlY3QgYWxsIHRoZSBjaGlsZCBlbGVtZW50IG5vZGVzLgorICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisKKyAgICAgIE5vZGUgY3VycmVudE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOworICAgICAgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsocXVhbGlmaWVyKSkgeworICAgICAgICAgIGdhdGhlck5vZGVzKGN1cnJlbnROb2RlLCBleHByZXNzaW9ucywgdGhpc1BhdGggKyAiWyIgKyBxdWFsaWZpZXIgKyAiXSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdhdGhlck5vZGVzKGN1cnJlbnROb2RlLCBleHByZXNzaW9ucywgdGhpc1BhdGgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNPTFJfWE1MX0xPVFNfU1lTVkFSUyA9CisgICAgICAiPHNvbHIgcGVyc2lzdGVudD1cIiR7c29sci54bWwucGVyc2lzdDpmYWxzZX1cIiBjb3JlTG9hZFRocmVhZHM9XCIxMlwiIHNoYXJlZExpYj1cIiR7c29tZXRoaW5nOi59XCIgPlxuIiArCisgICAgICAgICAgIiAgPGxvZ2dpbmcgY2xhc3M9XCIke2xvZ2NsYXNzOmxvZzRqLmNsYXNzfVwiIGVuYWJsZWQ9XCJ7bG9nZW5hYmxlOnRydWV9XCI+XG4iICsKKyAgICAgICAgICAiICAgICA8d2F0Y2hlciBzaXplPVwie3dhdGNoU2l6ZToxM31cIiB0aHJlc2hvbGQ9XCIke2xvZ1RocmVzaDo1NH1cIiAvPlxuIiArCisgICAgICAgICAgIiAgPC9sb2dnaW5nPlxuIiArCisgICAgICAgICAgIiAgPHNoYXJkSGFuZGxlckZhY3RvcnkgbmFtZT1cIiR7c2hoYW5kbGVyOnNoYXJkSGFuZGxlckZhY3Rvcnl9XCIgY2xhc3M9XCIke2hhbmRsZWZhYzpIdHRwU2hhcmRIYW5kbGVyRmFjdG9yeX1cIj5cbiIgKworICAgICAgICAgICIgICAgIDxpbnQgbmFtZT1cInNvY2tldFRpbWVvdXRcIj4ke3NvY2tldFRpbWVvdXQ6MTIwMDAwfTwvaW50PiBcbiIgKworICAgICAgICAgICIgICAgIDxpbnQgbmFtZT1cImNvbm5UaW1lb3V0XCI+JHtjb25uVGltZW91dDoxNTAwMH08L2ludD4gXG4iICsKKyAgICAgICAgICAiICA8L3NoYXJkSGFuZGxlckZhY3Rvcnk+IFxuIiArCisgICAgICAgICAgIiAgPGNvcmVzIGFkbWluUGF0aD1cIi9hZG1pbi9jb3Jlc1wiIGRlZmF1bHRDb3JlTmFtZT1cIlN5c3RlbVZhcnMxXCIgaG9zdD1cIjEyNy4wLjAuMVwiIFxuIiArCisgICAgICAgICAgIiAgICAgICBob3N0UG9ydD1cIiR7aG9zdFBvcnQ6ODk4M31cIiBob3N0Q29udGV4dD1cIiR7aG9zdENvbnRleHQ6c29scn1cIiBcbiIgKworICAgICAgICAgICIgICAgICAgemtDbGllbnRUaW1lb3V0PVwiJHtzb2xyLnprY2xpZW50dGltZW91dDozMDAwMH1cIiBcbiIgKworICAgICAgICAgICIgICAgICAgc2hhcmVTY2hlbWE9XCIke3NoYXJlU2NoZW1hOmZhbHNlfVwiIGRpc3RyaWJVcGRhdGVDb25uVGltZW91dD1cIiR7ZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0OjE1MDAwfVwiIFxuIiArCisgICAgICAgICAgIiAgICAgICBkaXN0cmliVXBkYXRlU29UaW1lb3V0PVwiJHtkaXN0cmliVXBkYXRlU29UaW1lb3V0OjEyMDAwMH1cIiBcbiIgKworICAgICAgICAgICIgICAgICAgbGVhZGVyVm90ZVdhaXQ9XCIke2xlYWRWb3RlV2FpdDozMn1cIiBtYW5hZ2VtZW50UGF0aD1cIiR7bWFucGF0aDovdmFyL2xpYi9wYXRofVwiIHRyYW5zaWVudENhY2hlU2l6ZT1cIiR7dHJhblNpemU6MTI4fVwiPiBcbiIgKworICAgICAgICAgICIgICAgIDxjb3JlIG5hbWU9XCJTeXN0ZW1WYXJzMVwiIGluc3RhbmNlRGlyPVwiU3lzdGVtVmFyczEvXCIgc2hhcmQ9XCIke3NoYXJkOjMyfVwiIFxuIiArCisgICAgICAgICAgIiAgICAgICAgICBjb2xsZWN0aW9uPVwiJHtjb2xsZWN0aW9uOmNvbGxlY3Rpb24xfVwiIGNvbmZpZz1cIiR7c29scmNvbmZpZzpzb2xyY29uZmlnLnhtbH1cIiBcbiIgKworICAgICAgICAgICIgICAgICAgICAgc2NoZW1hPVwiJHtzY2hlbWE6c2NoZW1hLnhtbH1cIiB1bG9nRGlyPVwiJHt1bG9nOi4vfVwiIHJvbGVzPVwiJHtteXJvbGU6Ym9zc31cIiBcbiIgKworICAgICAgICAgICIgICAgICAgICAgZGF0YURpcj1cIiR7ZGF0YTouL31cIiBsb2FkT25TdGFydHVwPVwiJHtvblN0YXJ0OnRydWV9XCIgdHJhbnNpZW50PVwiJHt0cmFuOnRydWV9XCIgXG4iICsKKyAgICAgICAgICAiICAgICAgICAgIGNvcmVOb2RlTmFtZT1cIiR7Y29yZU5vZGU6dXR0ZXJseXJpZGljdWxvdXN9XCIgXG4iICsKKyAgICAgICAgICAiICAgICAgID5cbiIgKworICAgICAgICAgICIgICAgIDwvY29yZT5cbiIgKworICAgICAgICAgICIgICAgIDxjb3JlIG5hbWU9XCJTeXN0ZW1WYXJzMlwiIGluc3RhbmNlRGlyPVwiU3lzdGVtVmFyczIvXCIgc2hhcmQ9XCIke3NoYXJkOjMyfVwiIFxuIiArCisgICAgICAgICAgIiAgICAgICAgICBjb2xsZWN0aW9uPVwiJHtjb2xsZWN0aW9uOmNvbGxlY3Rpb24yfVwiIGNvbmZpZz1cIiR7c29scmNvbmZpZzpzb2xyY29uZmlnLnhtbH1cIiBcbiIgKworICAgICAgICAgICIgICAgICAgICAgY29yZU5vZGVOYW1lPVwiJHtjb3JlTm9kZU5hbWU6fVwiIHNjaGVtYT1cIiR7c2NoZW1hOnNjaGVtYS54bWx9XCI+XG4iICsKKyAgICAgICAgICAiICAgICAgPHByb3BlcnR5IG5hbWU9XCJjb2xsZWN0aW9uXCIgdmFsdWU9XCJ7Y29sbGVjdGlvbjpjb2xsZWN0aW9uMn1cIi8+XG4iICsKKyAgICAgICAgICAiICAgICAgPHByb3BlcnR5IG5hbWU9XCJzY2hlbWFcIiB2YWx1ZT1cIiR7c2NoZW1hOnNjaGVtYS54bWx9XCIvPlxuIiArCisgICAgICAgICAgIiAgICAgIDxwcm9wZXJ0eSBuYW1lPVwiY29yZU5vZGVOYW1lXCIgdmFsdWU9XCJFcmlja3NDb3JlXCIvPlxuIiArCisgICAgICAgICAgIiAgICAgPC9jb3JlPlxuIiArCisgICAgICAgICAgIiAgIDwvY29yZXM+XG4iICsKKyAgICAgICAgICAiPC9zb2xyPiI7CisKKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09MUl9YTUxfTUlOSU1BTCA9CisgICAgICAgICAgIjxzb2xyID5cbiIgKworICAgICAgICAgICIgIDxjb3Jlcz4gXG4iICsKKyAgICAgICAgICAiICAgICA8Y29yZSBuYW1lPVwiU3lzdGVtVmFyczFcIiBpbnN0YW5jZURpcj1cIlN5c3RlbVZhcnMxL1wiIC8+XG4iICsKKyAgICAgICAgICAiICAgPC9jb3Jlcz5cbiIgKworICAgICAgICAgICI8L3NvbHI+IjsKKworfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL0pzb25Mb2FkZXJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvSnNvbkxvYWRlclRlc3QuamF2YQppbmRleCA5MTZjZjY5Li45ZGQ1YzcxIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvSnNvbkxvYWRlclRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvSnNvbkxvYWRlclRlc3QuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5Db250ZW50U3RyZWFtQmFzZTsKQEAgLTMwLDcgKzMxLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuQnVmZmVyaW5nUmVxdWVzdFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogcHVibGljIGNsYXNzIEpzb25Mb2FkZXJUZXN0IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewpAQCAtMjM2LDYgKzI0MSwxOTggQEAKICAgICAgICAgLCIvcmVzcG9uc2UvZG9jcy9bMF09PXsnZm9vMl9zJzpbJ2hpJywndGhlcmUnXX0iCiAgICAgKTsKICAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5WYWx1ZXNJbkFkZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBzdHIgPSAieydhZGQnOlt7J2lkJzonMScsJ2IxJzp0cnVlLCdiMic6ZmFsc2UsJ2IzJzpbZmFsc2UsdHJ1ZV19XX0iLnJlcGxhY2UoJ1wnJywgJyInKTsKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJzcCA9IG5ldyBTb2xyUXVlcnlSZXNwb25zZSgpOworICAgIEJ1ZmZlcmluZ1JlcXVlc3RQcm9jZXNzb3IgcCA9IG5ldyBCdWZmZXJpbmdSZXF1ZXN0UHJvY2Vzc29yKG51bGwpOworICAgIEpzb25Mb2FkZXIgbG9hZGVyID0gbmV3IEpzb25Mb2FkZXIoKTsKKyAgICBsb2FkZXIubG9hZChyZXEsIHJzcCwgbmV3IENvbnRlbnRTdHJlYW1CYXNlLlN0cmluZ1N0cmVhbShzdHIpLCBwKTsKKworICAgIGFzc2VydEVxdWFscygxLCBwLmFkZENvbW1hbmRzLnNpemUoKSk7CisKKyAgICBBZGRVcGRhdGVDb21tYW5kIGFkZCA9IHAuYWRkQ29tbWFuZHMuZ2V0KDApOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBhZGQuc29sckRvYzsKKyAgICBTb2xySW5wdXRGaWVsZCBmID0gZC5nZXRGaWVsZCgiYjEiKTsKKyAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBmLmdldFZhbHVlKCkpOworICAgIGYgPSBkLmdldEZpZWxkKCJiMiIpOworICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBmLmdldFZhbHVlKCkpOworICAgIGYgPSBkLmdldEZpZWxkKCJiMyIpOworICAgIGFzc2VydEVxdWFscygyLCAoKExpc3QpZi5nZXRWYWx1ZSgpKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCAoKExpc3QpZi5nZXRWYWx1ZSgpKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsICgoTGlzdClmLmdldFZhbHVlKCkpLmdldCgxKSk7CisKKyAgICByZXEuY2xvc2UoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyVmFsdWVzSW5BZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgc3RyID0gInsnYWRkJzpbeydpZCc6JzEnLCdpMSc6MjU2LCdpMic6LTUxMjM0NTY3ODksJ2kzJzpbMCwxXX1dfSIucmVwbGFjZSgnXCcnLCAnIicpOworICAgIFNvbHJRdWVyeVJlcXVlc3QgcmVxID0gcmVxKCk7CisgICAgU29sclF1ZXJ5UmVzcG9uc2UgcnNwID0gbmV3IFNvbHJRdWVyeVJlc3BvbnNlKCk7CisgICAgQnVmZmVyaW5nUmVxdWVzdFByb2Nlc3NvciBwID0gbmV3IEJ1ZmZlcmluZ1JlcXVlc3RQcm9jZXNzb3IobnVsbCk7CisgICAgSnNvbkxvYWRlciBsb2FkZXIgPSBuZXcgSnNvbkxvYWRlcigpOworICAgIGxvYWRlci5sb2FkKHJlcSwgcnNwLCBuZXcgQ29udGVudFN0cmVhbUJhc2UuU3RyaW5nU3RyZWFtKHN0ciksIHApOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHAuYWRkQ29tbWFuZHMuc2l6ZSgpKTsKKworICAgIEFkZFVwZGF0ZUNvbW1hbmQgYWRkID0gcC5hZGRDb21tYW5kcy5nZXQoMCk7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IGFkZC5zb2xyRG9jOworICAgIFNvbHJJbnB1dEZpZWxkIGYgPSBkLmdldEZpZWxkKCJpMSIpOworICAgIGFzc2VydEVxdWFscygyNTZMLCBmLmdldFZhbHVlKCkpOworICAgIGYgPSBkLmdldEZpZWxkKCJpMiIpOworICAgIGFzc2VydEVxdWFscygtNTEyMzQ1Njc4OUwsIGYuZ2V0VmFsdWUoKSk7CisgICAgZiA9IGQuZ2V0RmllbGQoImkzIik7CisgICAgYXNzZXJ0RXF1YWxzKDIsICgoTGlzdClmLmdldFZhbHVlKCkpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDBMLCAoKExpc3QpZi5nZXRWYWx1ZSgpKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscygxTCwgKChMaXN0KWYuZ2V0VmFsdWUoKSkuZ2V0KDEpKTsKKworICAgIHJlcS5jbG9zZSgpOworICB9CisKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbFZhbHVlc0luQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHN0ciA9ICJ7J2FkZCc6W3snaWQnOicxJywnZDEnOjI1Ni43OCwnZDInOi01MTIzNDU2Nzg5LjAsJ2QzJzowLjAsJ2QzJzoxLjAsJ2Q0JzoxLjdFLTEwfV19Ii5yZXBsYWNlKCdcJycsICciJyk7CisgICAgU29sclF1ZXJ5UmVxdWVzdCByZXEgPSByZXEoKTsKKyAgICBTb2xyUXVlcnlSZXNwb25zZSByc3AgPSBuZXcgU29sclF1ZXJ5UmVzcG9uc2UoKTsKKyAgICBCdWZmZXJpbmdSZXF1ZXN0UHJvY2Vzc29yIHAgPSBuZXcgQnVmZmVyaW5nUmVxdWVzdFByb2Nlc3NvcihudWxsKTsKKyAgICBKc29uTG9hZGVyIGxvYWRlciA9IG5ldyBKc29uTG9hZGVyKCk7CisgICAgbG9hZGVyLmxvYWQocmVxLCByc3AsIG5ldyBDb250ZW50U3RyZWFtQmFzZS5TdHJpbmdTdHJlYW0oc3RyKSwgcCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgcC5hZGRDb21tYW5kcy5zaXplKCkpOworCisgICAgQWRkVXBkYXRlQ29tbWFuZCBhZGQgPSBwLmFkZENvbW1hbmRzLmdldCgwKTsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gYWRkLnNvbHJEb2M7CisgICAgU29scklucHV0RmllbGQgZiA9IGQuZ2V0RmllbGQoImQxIik7CisgICAgYXNzZXJ0RXF1YWxzKDI1Ni43OCwgZi5nZXRWYWx1ZSgpKTsKKyAgICBmID0gZC5nZXRGaWVsZCgiZDIiKTsKKyAgICBhc3NlcnRFcXVhbHMoLTUxMjM0NTY3ODkuMCwgZi5nZXRWYWx1ZSgpKTsKKyAgICBmID0gZC5nZXRGaWVsZCgiZDMiKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgKChMaXN0KWYuZ2V0VmFsdWUoKSkuc2l6ZSgpKTsKKyAgICBhc3NlcnRUcnVlKCgoTGlzdClmLmdldFZhbHVlKCkpLmNvbnRhaW5zKDAuMCkpOworICAgIGFzc2VydFRydWUoKChMaXN0KSBmLmdldFZhbHVlKCkpLmNvbnRhaW5zKDEuMCkpOworICAgIGYgPSBkLmdldEZpZWxkKCJkNCIpOworICAgIGFzc2VydEVxdWFscygxLjdFLTEwLCBmLmdldFZhbHVlKCkpOworCisgICAgcmVxLmNsb3NlKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QmlnRGVjaW1hbFZhbHVlc0luQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHN0ciA9ICgieydhZGQnOlt7J2lkJzonMScsJ2JkMSc6MC4xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NSwiCisgICAgICAgICAgICAgICAgICsgIidiZDInOjEyMzQ1Njc4OTAxMjM0NTY3ODkwLjEyMzQ1Njc4OTAxMjM0NTY3ODkwLCdiZDMnOjAuMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1LCIKKyAgICAgICAgICAgICAgICAgKyAiJ2JkMyc6MTIzNDU2Nzg5MDEyMzQ1Njc4OTAwLjAxMjM0NTY3ODkwMTIzNDU2Nzg5MH1dfSIpLnJlcGxhY2UoJ1wnJywgJyInKTsKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFNvbHJRdWVyeVJlc3BvbnNlIHJzcCA9IG5ldyBTb2xyUXVlcnlSZXNwb25zZSgpOworICAgIEJ1ZmZlcmluZ1JlcXVlc3RQcm9jZXNzb3IgcCA9IG5ldyBCdWZmZXJpbmdSZXF1ZXN0UHJvY2Vzc29yKG51bGwpOworICAgIEpzb25Mb2FkZXIgbG9hZGVyID0gbmV3IEpzb25Mb2FkZXIoKTsKKyAgICBsb2FkZXIubG9hZChyZXEsIHJzcCwgbmV3IENvbnRlbnRTdHJlYW1CYXNlLlN0cmluZ1N0cmVhbShzdHIpLCBwKTsKKworICAgIGFzc2VydEVxdWFscygxLCBwLmFkZENvbW1hbmRzLnNpemUoKSk7CisKKyAgICBBZGRVcGRhdGVDb21tYW5kIGFkZCA9IHAuYWRkQ29tbWFuZHMuZ2V0KDApOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBhZGQuc29sckRvYzsKKyAgICBTb2xySW5wdXRGaWVsZCBmID0gZC5nZXRGaWVsZCgiYmQxIik7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYXNzZXJ0VHJ1ZShmLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgIGFzc2VydEVxdWFscygiMC4xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NSIsIGYuZ2V0VmFsdWUoKSk7CisgICAgZiA9IGQuZ2V0RmllbGQoImJkMiIpOworICAgIGFzc2VydFRydWUoZi5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICBhc3NlcnRFcXVhbHMoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwLjEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgZi5nZXRWYWx1ZSgpKTsKKyAgICBmID0gZC5nZXRGaWVsZCgiYmQzIik7CisgICAgYXNzZXJ0RXF1YWxzKDIsICgoTGlzdClmLmdldFZhbHVlKCkpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZSgoKExpc3QpZi5nZXRWYWx1ZSgpKS5jb250YWlucygiMC4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiKSk7CisgICAgYXNzZXJ0VHJ1ZSgoKExpc3QpZi5nZXRWYWx1ZSgpKS5jb250YWlucygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwLjAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpKTsKKworICAgIHJlcS5jbG9zZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJpZ0ludGVnZXJWYWx1ZXNJbkFkZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBzdHIgPSAoInsnYWRkJzpbeydpZCc6JzEnLCdiaTEnOjEyMzQ1Njc4OTAxMjM0NTY3ODkwMSwnYmkyJzoxMDk4NzY1NDMyMTA5ODc2NTQzMjEwLCIKKyAgICAgICAgICAgICAgICAgKyAiJ2JpMyc6WzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIsMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDldfV19IikucmVwbGFjZSgnXCcnLCAnIicpOworICAgIFNvbHJRdWVyeVJlcXVlc3QgcmVxID0gcmVxKCk7CisgICAgU29sclF1ZXJ5UmVzcG9uc2UgcnNwID0gbmV3IFNvbHJRdWVyeVJlc3BvbnNlKCk7CisgICAgQnVmZmVyaW5nUmVxdWVzdFByb2Nlc3NvciBwID0gbmV3IEJ1ZmZlcmluZ1JlcXVlc3RQcm9jZXNzb3IobnVsbCk7CisgICAgSnNvbkxvYWRlciBsb2FkZXIgPSBuZXcgSnNvbkxvYWRlcigpOworICAgIGxvYWRlci5sb2FkKHJlcSwgcnNwLCBuZXcgQ29udGVudFN0cmVhbUJhc2UuU3RyaW5nU3RyZWFtKHN0ciksIHApOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHAuYWRkQ29tbWFuZHMuc2l6ZSgpKTsKKworICAgIEFkZFVwZGF0ZUNvbW1hbmQgYWRkID0gcC5hZGRDb21tYW5kcy5nZXQoMCk7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IGFkZC5zb2xyRG9jOworICAgIFNvbHJJbnB1dEZpZWxkIGYgPSBkLmdldEZpZWxkKCJiaTEiKTsKKyAgICBhc3NlcnRUcnVlKGYuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEiLCBmLmdldFZhbHVlKCkpOworICAgIGYgPSBkLmdldEZpZWxkKCJiaTIiKTsKKyAgICBhc3NlcnRUcnVlKGYuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgYXNzZXJ0RXF1YWxzKCIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwIiwgZi5nZXRWYWx1ZSgpKTsKKyAgICBmID0gZC5nZXRGaWVsZCgiYmkzIik7CisgICAgYXNzZXJ0RXF1YWxzKDIsICgoTGlzdClmLmdldFZhbHVlKCkpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZSgoKExpc3QpZi5nZXRWYWx1ZSgpKS5jb250YWlucygiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMiIpKTsKKyAgICBhc3NlcnRUcnVlKCgoTGlzdClmLmdldFZhbHVlKCkpLmNvbnRhaW5zKCIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOSIpKTsKKworICAgIHJlcS5jbG9zZSgpOworICB9CisKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QWRkTm9uU3RyaW5nVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQmlnSW50ZWdlciBhbmQgQmlnRGVjaW1hbCBzaG91bGQgYmUgdHlwZWQgYXMgc3RyaW5ncywgc2luY2UgdGhlcmUgaXMgbm8gZGlyZWN0IHN1cHBvcnQgZm9yIHRoZW0KKyAgICB1cGRhdGVKKCgiW3snaWQnOicxJywnYm9vbGVhbl9iJzpmYWxzZSwnbG9uZ19sJzoxOSwnZG91YmxlX2QnOjE4LjYsJ2JpZ19pbnRlZ2VyX3MnOjEyMzQ1Njc4OTAxMjM0NTY3ODkwLCIKKyAgICAgICAgKyIgICAgICAnYmlnX2RlY2ltYWxfcyc6MC4xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1fV0iKS5yZXBsYWNlKCdcJycsICciJyksIHBhcmFtcygiY29tbWl0IiwidHJ1ZSIpKTsKKyAgICBhc3NlcnRKUShyZXEoInEiLCJpZDoxIiwgImZsIiwiYm9vbGVhbl9iLGxvbmdfbCxkb3VibGVfZCxiaWdfaW50ZWdlcl9zLGJpZ19kZWNpbWFsX3MiKQorICAgICAgICAsIi9yZXNwb25zZS9kb2NzL1swXT09eydib29sZWFuX2InOltmYWxzZV0sJ2xvbmdfbCc6WzE5XSwnZG91YmxlX2QnOlsxOC42XSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiJ2JpZ19pbnRlZ2VyX3MnOlsnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnXSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiJ2JpZ19kZWNpbWFsX3MnOlsnMC4xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1J119XX0iCisgICAgKTsKKyAgfQorCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFkZEJpZ0ludGVnZXJWYWx1ZVRvVHJpZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQWRkaW5nIGEgQmlnSW50ZWdlciB0byBhIGxvbmcgZmllbGQgc2hvdWxkIGZhaWwKKyAgICAvLyBCaWdJbnRlZ2VyLmxvbmdWYWx1ZSgpIHJldHVybnMgb25seSB0aGUgbG93LW9yZGVyIDY0IGJpdHMuCisgICAgdHJ5IHsKKyAgICAgIHVwZGF0ZUooKCJbeydpZCc6JzEnLCdiaWdfaW50ZWdlcl90bCc6MTIzNDU2Nzg5MDEyMzQ1Njc4OTB9XSIpLnJlcGxhY2UoJ1wnJywgJyInKSwgbnVsbCk7CisgICAgICBmYWlsKCJBIEJpZ0ludGVnZXIgdmFsdWUgc2hvdWxkIG92ZXJmbG93IGEgbG9uZyBmaWVsZCIpOworICAgIH0gY2F0Y2ggKFNvbHJFeGNlcHRpb24gZSkgeworICAgICAgaWYgKCAhIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBOdW1iZXJGb3JtYXRFeGNlcHRpb24pKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQWRkaW5nIGEgQmlnSW50ZWdlciB0byBhbiBpbnRlZ2VyIGZpZWxkIHNob3VsZCBmYWlsCisgICAgLy8gQmlnSW50ZWdlci5pbnRWYWx1ZSgpIHJldHVybnMgb25seSB0aGUgbG93LW9yZGVyIDMyIGJpdHMuCisgICAgdHJ5IHsKKyAgICAgIHVwZGF0ZUooKCJbeydpZCc6JzEnLCdiaWdfaW50ZWdlcl90aSc6MTIzNDU2Nzg5MDEyMzQ1Njc4OTB9XSIpLnJlcGxhY2UoJ1wnJywgJyInKSwgbnVsbCk7CisgICAgICBmYWlsKCJBIEJpZ0ludGVnZXIgdmFsdWUgc2hvdWxkIG92ZXJmbG93IGFuIGludGVnZXIgZmllbGQiKTsKKyAgICB9IGNhdGNoIChTb2xyRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmICggISAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKSkgeworICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFkZEJpZ0RlY2ltYWxWYWx1ZVRvVHJpZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQWRkaW5nIGEgQmlnRGVjaW1hbCB0byBhIGRvdWJsZSBmaWVsZCBzaG91bGQgc3VjY2VlZCBieSByZWR1Y2luZyBwcmVjaXNpb24KKyAgICB1cGRhdGVKKCgiW3snaWQnOicxJywnYmlnX2RlY2ltYWxfdGQnOjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MC4wOTg3NjU0MzIxfV0iKS5yZXBsYWNlKCdcJycsICciJyksCisgICAgICAgICAgICBwYXJhbXMoImNvbW1pdCIsICJ0cnVlIikpOworICAgIGFzc2VydEpRKHJlcSgicSIsImlkOjEiLCAiZmwiLCJiaWdfZGVjaW1hbF90ZCIpLCAKKyAgICAgICAgICAgICAiL3Jlc3BvbnNlL2RvY3MvWzBdPT17J2JpZ19kZWNpbWFsX3RkJzpbMS4wRTM4XX0iCisgICAgKTsKKworICAgIC8vIEFkZGluZyBhIEJpZ0RlY2ltYWwgdG8gYSBmbG9hdCBmaWVsZCBzaG91bGQgc3VjY2VlZCBieSByZWR1Y2luZyBwcmVjaXNpb24KKyAgICB1cGRhdGVKKCgiW3snaWQnOicyJywnYmlnX2RlY2ltYWxfdGYnOjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MC4wOTg3NjU0MzIxfV0iKS5yZXBsYWNlKCdcJycsICciJyksCisgICAgICAgICAgICBwYXJhbXMoImNvbW1pdCIsICJ0cnVlIikpOworICAgIGFzc2VydEpRKHJlcSgicSIsImlkOjIiLCAiZmwiLCJiaWdfZGVjaW1hbF90ZiIpLAorICAgICAgICAgICAgICIvcmVzcG9uc2UvZG9jcy9bMF09PXsnYmlnX2RlY2ltYWxfdGYnOlsxLjBFMzhdfSIKKyAgICApOworICB9CiAKICAgLy8gVGhlIGRlbGV0ZSBzeW50YXggd2FzIGJvdGggZXh0ZW5kZWQgZm9yIHNpbXBsaWZpY2F0aW9uIGluIDQuMAogICBAVGVzdApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL1Rlc3RDU1ZMb2FkZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9UZXN0Q1NWTG9hZGVyLmphdmEKaW5kZXggYTJkZWIzYi4uZWQyM2EwOCAxMDA3NTUKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL1Rlc3RDU1ZMb2FkZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvVGVzdENTVkxvYWRlci5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsInNjaGVtYTEyLnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9UZXN0UmVwbGljYXRpb25IYW5kbGVyLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvVGVzdFJlcGxpY2F0aW9uSGFuZGxlci5qYXZhCmluZGV4IDhjNTkxYzkuLjM4OGJiYzggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9UZXN0UmVwbGljYXRpb25IYW5kbGVyLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL1Rlc3RSZXBsaWNhdGlvbkhhbmRsZXIuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgc3VwZXIuc2V0VXAoKTsKIC8vICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5IiwgInNvbHIuU3RhbmRhcmREaXJlY3RvcnlGYWN0b3J5Iik7CiAgICAgLy8gRm9yIG1hbnVhbCB0ZXN0aW5nIG9ubHkKLSAgICAvLyB1c2VGYWN0b3J5KG51bGwpOyAvLyBmb3JjZSBhbiBGUyBmYWN0b3J5CisgICAgLy8gdXNlRmFjdG9yeShudWxsKTsgLy8gZm9yY2UgYW4gRlMgZmFjdG9yeS4KICAgICBtYXN0ZXIgPSBuZXcgU29sckluc3RhbmNlKCJtYXN0ZXIiLCBudWxsKTsKICAgICBtYXN0ZXIuc2V0VXAoKTsKICAgICBtYXN0ZXJKZXR0eSA9IGNyZWF0ZUpldHR5KG1hc3Rlcik7CkBAIC0zMzksNiArMzM5LDQwIEBACiAgICAgfQogICB9CiAKKworICAvKioKKyAgICogVmVyaWZ5IHRoYXQgdGhpbmdzIHN0aWxsIHdvcmsgaWYgYW4gSVcgaGFzIG5vdCBiZWVuIG9wZW5lZCAoYW5kIGhlbmNlIHRoZSBDb21taXRQb2ludHMgaGF2ZSBub3QgYmVlbiBjb21tdW5pY2F0ZWQgdG8gdGhlIGRlbGV0aW9uIHBvbGljeSkKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3ROb1dyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHVzZUZhY3RvcnkobnVsbCk7ICAgIC8vIGZvcmNlIGEgcGVyc2lzdGVudCBkaXJlY3RvcnkKKworICAgIC8vIHN0b3AgYW5kIHN0YXJ0IHNvIHRoZXkgc2VlIHRoZSBuZXcgZGlyZWN0b3J5IHNldHRpbmcKKyAgICBzbGF2ZUpldHR5LnN0b3AoKTsKKyAgICBtYXN0ZXJKZXR0eS5zdG9wKCk7CisgICAgc2xhdmVKZXR0eS5zdGFydCh0cnVlKTsKKyAgICBtYXN0ZXJKZXR0eS5zdGFydCh0cnVlKTsKKworICAgIGluZGV4KHNsYXZlQ2xpZW50LCAiaWQiLCAiMTIzNDU2Iik7CisgICAgc2xhdmVDbGllbnQuY29tbWl0KCk7CisgICAgc2xhdmVKZXR0eS5zdG9wKCk7CisgICAgc2xhdmVKZXR0eS5zdGFydCh0cnVlKTsKKworICAgIC8vIEN1cnJlbnRseSB3ZSBvcGVuIGEgd3JpdGVyIG9uLWRlbWFuZC4gIFRoaXMgaXMgdG8gdGVzdCB0aGF0IHdlIGFyZSBjb3JyZWN0bHkgdGVzdGluZworICAgIC8vIHRoZSBjb2RlIHBhdGggd2hlbiBTb2xyRGVsZXRpb25Qb2xpY3kuZ2V0TGF0ZXN0Q29tbWl0KCkgcmV0dXJucyBudWxsLgorICAgIC8vIFdoZW4gd2UgYXJlIHVzaW5nIGFuIGVwaGVtZXJhbCBkaXJlY3RvcnksIGFuIElXIHdpbGwgYWx3YXlzIGJlIG9wZW5lZCB0byBjcmVhdGUgdGhlIGluZGV4IGFuZCBoZW5jZQorICAgIC8vIGdldExhdGVzdENvbW1pdCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC4KKyAgICBDb3JlQ29udGFpbmVyIGNvcmVzID0gKChTb2xyRGlzcGF0Y2hGaWx0ZXIpIHNsYXZlSmV0dHkuZ2V0RGlzcGF0Y2hGaWx0ZXIoKS5nZXRGaWx0ZXIoKSkuZ2V0Q29yZXMoKTsKKyAgICBDb2xsZWN0aW9uPFNvbHJDb3JlPiB0aGVDb3JlcyA9IGNvcmVzLmdldENvcmVzKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHRoZUNvcmVzLnNpemUoKSk7CisgICAgU29sckNvcmUgY29yZSA9IChTb2xyQ29yZSl0aGVDb3Jlcy50b0FycmF5KClbMF07CisgICAgYXNzZXJ0TnVsbCggY29yZS5nZXREZWxldGlvblBvbGljeSgpLmdldExhdGVzdENvbW1pdCgpICk7CisKKworICAgIHB1bGxGcm9tTWFzdGVyVG9TbGF2ZSgpOyAgLy8gdGhpcyB3aWxsIGNhdXNlIFNuYXBQdWxsZXIgdG8gYmUgaW52b2tlZCBhbmQgd2Ugd2lsbCB0ZXN0IHdoZW4gU29sckRlbGV0aW9uUG9saWN5LmdldExhdGVzdENvbW1pdCgpIHJldHVybnMgbnVsbAorCisgICAgcmVzZXRGYWN0b3J5KCk7CisgIH0KKwogICAvKioKICAgICogVmVyaWZ5IHRoYXQgZW1wdHkgY29tbWl0cyBhbmQvb3IgY29tbWl0cyB3aXRoIG9wZW5TZWFyY2hlcj1mYWxzZSAKICAgICogb24gdGhlIG1hc3RlciBkbyBub3QgY2F1c2Ugc3Vic2VxdWVudCByZXBsaWNhdGlvbiBwcm9ibGVtcyBvbiB0aGUgc2xhdmUgCkBAIC0xNTA3LDcgKzE1NDEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YURpcigpIHsKLSAgICAgIHJldHVybiBkYXRhRGlyLnRvU3RyaW5nKCk7CisgICAgICByZXR1cm4gZGF0YURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFNvbHJDb25maWdGaWxlKCkgewpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2FkbWluL0xvZ2dpbmdIYW5kbGVyVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2FkbWluL0xvZ2dpbmdIYW5kbGVyVGVzdC5qYXZhCmluZGV4IGE4MWUwZjEuLjVlYWY5ZWYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9hZG1pbi9Mb2dnaW5nSGFuZGxlclRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvYWRtaW4vTG9nZ2luZ0hhbmRsZXJUZXN0LmphdmEKQEAgLTE3LDE1ICsxNywyMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5oYW5kbGVyLmFkbWluOwogCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuQ29tbW9uUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5sb2dnaW5nLmp1bC5KdWxJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5sb2dnaW5nLmxvZzRqLkxvZzRqSW5mbzsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKKwogcHVibGljIGNsYXNzIExvZ2dpbmdIYW5kbGVyVGVzdCBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKKworICAvLyBUT0RPOiBUaGlzIG9ubHkgdGVzdHMgTG9nNGogYXQgdGhlIG1vbWVudCwgYXMgdGhhdCdzIHdoYXQncyBkZWZpbmVkCisgIC8vIHRocm91Z2ggdGhlIENvcmVDb250YWluZXIuCisKKyAgLy8gVE9ETzogV291bGQgYmUgbmljZSB0byB0aHJvdyBhbiBleGNlcHRpb24gb24gdHJ5aW5nIHRvIHNldCBhCisgIC8vIGxvZyBsZXZlbCB0aGF0IGRvZXNuJ3QgZXhpc3QKICAgCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM1LDcgKzQyLDggQEAKICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdExvZ0xldmVsSGFuZGxlck91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIExvZ2dlciB0c3QgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQiKTsKLSAgICBKdWxJbmZvIHdyYXAgPSBuZXcgSnVsSW5mbyh0c3QuZ2V0TmFtZSgpLCB0c3QpOworICAgIHRzdC5zZXRMZXZlbChMZXZlbC5JTkZPKTsKKyAgICBMb2c0akluZm8gd3JhcCA9IG5ldyBMb2c0akluZm8odHN0LmdldE5hbWUoKSwgdHN0KTsKICAgICAKICAgICBhc3NlcnRRKCJTaG93IExvZyBMZXZlbHMgT0siLAogICAgICAgICAgICAgcmVxKENvbW1vblBhcmFtcy5RVCwiL2FkbWluL2xvZ2dpbmciKQpAQCAtNDYsOCArNTQsOCBAQAogICAgIGFzc2VydFEoIlNldCBhbmQgcmVtb3ZlIGEgbGV2ZWwiLAogICAgICAgICAgICAgcmVxKENvbW1vblBhcmFtcy5RVCwiL2FkbWluL2xvZ2dpbmciLCAgCiAgICAgICAgICAgICAgICAgInNldCIsICJvcmcueHh4Lnl5eS5hYmM6bnVsbCIsCi0gICAgICAgICAgICAgICAgInNldCIsICJvcmcueHh4Lnl5eS56eno6RklORVNUIikKLSAgICAgICAgICAgICwiLy9hcnJbQG5hbWU9J2xvZ2dlcnMnXS9sc3Qvc3RyWy49J29yZy54eHgueXl5Lnp6eiddLy4uL3N0cltAbmFtZT0nbGV2ZWwnXVsuPSdGSU5FU1QnXSIKKyAgICAgICAgICAgICAgICAic2V0IiwgIm9yZy54eHgueXl5Lnp6ejpUUkFDRSIpCisgICAgICAgICAgICAsIi8vYXJyW0BuYW1lPSdsb2dnZXJzJ10vbHN0L3N0clsuPSdvcmcueHh4Lnl5eS56enonXS8uLi9zdHJbQG5hbWU9J2xldmVsJ11bLj0nVFJBQ0UnXSIKICAgICAgICAgICAgICk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9hZG1pbi9MdWtlUmVxdWVzdEhhbmRsZXJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvYWRtaW4vTHVrZVJlcXVlc3RIYW5kbGVyVGVzdC5qYXZhCmluZGV4IDM0ZTlkNzcuLmRjZjczZjYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9hZG1pbi9MdWtlUmVxdWVzdEhhbmRsZXJUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2FkbWluL0x1a2VSZXF1ZXN0SGFuZGxlclRlc3QuamF2YQpAQCAtMTcsMTcgKzE3LDE4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuYWRtaW47CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5sdWtlLkZpZWxkRmxhZzsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUXVlcnlSZXF1ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zY2hlbWEuSW5kZXhTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuQWJzdHJhY3RTb2xyVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuVGVzdEhhcm5lc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCiAvKioKICAqIDpUT0RPOiBjdXJyZW50bHkgb25seSB0ZXN0cyBzb21lIG9mIHRoZSB1dGlsaXRpZXMgaW4gdGhlIEx1a2VSZXF1ZXN0SGFuZGxlcgogICovCkBAIC0zNSw2ICszNiw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsICJzY2hlbWExMi54bWwiKTsKICAgfQogCkBAIC0xNTUsNyArMTU3LDcgQEAKICAgICB0cnkgewogICAgICAgLy8gRmlyc3QsIGRldGVybWluZSB0aGF0IHRoZSB0d28gZmllbGRzIEFSRSB0aGVyZQogICAgICAgU3RyaW5nIHJlc3BvbnNlID0gaC5xdWVyeShyZXEpOwotICAgICAgYXNzZXJ0TnVsbChoLnZhbGlkYXRlWFBhdGgocmVzcG9uc2UsCisgICAgICBhc3NlcnROdWxsKFRlc3RIYXJuZXNzLnZhbGlkYXRlWFBhdGgocmVzcG9uc2UsCiAgICAgICAgICAgZ2V0RmllbGRYUGF0aFByZWZpeCgic29scl90IikgKyAiW0BuYW1lPSdpbmRleCddIiwKICAgICAgICAgICBnZXRGaWVsZFhQYXRoUHJlZml4KCJzb2xyX3MiKSArICJbQG5hbWU9J2luZGV4J10iCiAgICAgICApKTsKQEAgLTE2NCw3ICsxNjYsNyBAQAogICAgICAgZm9yIChTdHJpbmcgZiA6IEFycmF5cy5hc0xpc3QoInNvbHJfdGkiLAogICAgICAgICAgICJzb2xyX3RkIiwgInNvbHJfcGwiLCAic29scl9kdCIsICJzb2xyX2IiKSkgewogCi0gICAgICAgIGFzc2VydE5vdE51bGwoaC52YWxpZGF0ZVhQYXRoKHJlc3BvbnNlLAorICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RIYXJuZXNzLnZhbGlkYXRlWFBhdGgocmVzcG9uc2UsCiAgICAgICAgICAgICBnZXRGaWVsZFhQYXRoUHJlZml4KGYpICsgIltAbmFtZT0naW5kZXgnXSIpKTsKIAogICAgICAgfQpAQCAtMTc0LDcgKzE3Niw3IEBACiAgICAgICBmb3IgKFN0cmluZyBmIDogQXJyYXlzLmFzTGlzdCgic29scl90IiwgInNvbHJfcyIsICJzb2xyX3RpIiwKICAgICAgICAgICAic29scl90ZCIsICJzb2xyX3BsIiwgInNvbHJfZHQiLCAic29scl9iIikpIHsKIAotICAgICAgICBhc3NlcnROdWxsKGgudmFsaWRhdGVYUGF0aChyZXNwb25zZSwKKyAgICAgICAgYXNzZXJ0TnVsbChUZXN0SGFybmVzcy52YWxpZGF0ZVhQYXRoKHJlc3BvbnNlLAogICAgICAgICAgICAgZ2V0RmllbGRYUGF0aFByZWZpeChmKSArICJbQG5hbWU9J2luZGV4J10iKSk7CiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTE4Niw3ICsxODgsNyBAQAogICAgIFNvbHJRdWVyeVJlcXVlc3QgcmVxID0gcmVxKCJxdCIsICIvYWRtaW4vbHVrZSIsICJzaG93IiwgInNjaGVtYSIpOwogCiAgICAgU3RyaW5nIHhtbCA9IGgucXVlcnkocmVxKTsKLSAgICBTdHJpbmcgciA9IGgudmFsaWRhdGVYUGF0aAorICAgIFN0cmluZyByID0gVGVzdEhhcm5lc3MudmFsaWRhdGVYUGF0aAogICAgICAgKHhtbCwKICAgICAgICBmaWVsZCgidGV4dCIpICsgIi9hcnJbQG5hbWU9J2NvcHlTb3VyY2VzJ10vc3RyWy49J3RpdGxlJ10iLAogICAgICAgIGZpZWxkKCJ0ZXh0IikgKyAiL2FycltAbmFtZT0nY29weVNvdXJjZXMnXS9zdHJbLj0nc3ViamVjdCddIiwKQEAgLTIxNiw3ICsyMTgsNyBAQAogCiAgICAgU29sclF1ZXJ5UmVxdWVzdCByZXEgPSByZXEoInF0IiwgIi9hZG1pbi9sdWtlIiwgInNob3ciLCAic2NoZW1hIiwgImluZGVudCIsICJvbiIpOwogICAgIFN0cmluZyB4bWwgPSBoLnF1ZXJ5KHJlcSk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGgudmFsaWRhdGVYUGF0aCh4bWwsIGZpZWxkKCJiZGF5IikgKyAiL2FycltAbmFtZT0nY29weURlc3RzJ10vc3RyWy49J2NhdGNoYWxsX3QnXSIpOworICAgIFN0cmluZyByZXN1bHQgPSBUZXN0SGFybmVzcy52YWxpZGF0ZVhQYXRoKHhtbCwgZmllbGQoImJkYXkiKSArICIvYXJyW0BuYW1lPSdjb3B5RGVzdHMnXS9zdHJbLj0nY2F0Y2hhbGxfdCddIik7CiAgICAgYXNzZXJ0TnVsbCh4bWwsIHJlc3VsdCk7CiAKICAgICAvLyBQdXQgYmFjayB0aGUgY29uZmlndXJhdGlvbiBleHBlY3RlZCBieSB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgaW4gdGhpcyBzdWl0ZQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9CYWRDb21wb25lbnRUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L0JhZENvbXBvbmVudFRlc3QuamF2YQppbmRleCBhZTk0ZDNjLi4xNzM2MWUwIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L0JhZENvbXBvbmVudFRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L0JhZENvbXBvbmVudFRlc3QuamF2YQpAQCAtMTksNyArMTksNiBAQAogICovCiAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29sclRlc3RDYXNlSjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKioKQEAgLTM0LDE0ICszMyw3IEBACiAgICAgICBpZ25vcmVFeGNlcHRpb24oIi4qUXVlcnlFbGV2YXRpb25Db21wb25lbnQuKiIpOwogICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbGV2YXRlLmZpbGUiLCAiZm9vLnhtbCIpOwogICAgICAgaW5pdENvcmUoInNvbHJjb25maWctZWxldmF0ZS54bWwiLCAic2NoZW1hMTIueG1sIik7Ci0gICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vVE9ETzogYmV0dGVyIHdheSBvZiBjaGVja2luZyB0aGlzPwotICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNvbHJFeGNlcHRpb24pewotICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICB9CisgICAgICBhc3NlcnRUcnVlKGhhc0luaXRFeGNlcHRpb24oIlF1ZXJ5RWxldmF0aW9uQ29tcG9uZW50IikpOwogICAgIH0gZmluYWxseSB7CiAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiZWxldmF0ZS5maWxlIik7CiAgICAgICByZXNldEV4Y2VwdGlvbklnbm9yZXMoKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9jb21wb25lbnQvVGVybVZlY3RvckNvbXBvbmVudERpc3RyaWJ1dGVkVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9UZXJtVmVjdG9yQ29tcG9uZW50RGlzdHJpYnV0ZWRUZXN0LmphdmEKaW5kZXggNWY2NTVlMC4uMmY2MTBmZCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9UZXJtVmVjdG9yQ29tcG9uZW50RGlzdHJpYnV0ZWRUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9UZXJtVmVjdG9yQ29tcG9uZW50RGlzdHJpYnV0ZWRUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKICAgICBoYW5kbGUucHV0KCJtYXhTY29yZSIsIFNLSVBWQUwpOwogICAgIGhhbmRsZS5wdXQoInNjb3JlIiwgU0tJUFZBTCk7CiAgICAgaGFuZGxlLnB1dCgiW2RvY2lkXSIsIFNLSVBWQUwpOworICAgIGhhbmRsZS5wdXQoIl92ZXJzaW9uXyIsIFNLSVBWQUwpOyAvLyBub3QgYSBjbG91ZCB0ZXN0LCBidXQgbWF5IHVzZSB1cGRhdGVMb2cKIAogICAgIC8vIFNPTFItMzcyMDogVE9ETzogVFZDIGRvZXNuJ3QgIm1lcmdlIiBkZiBhbmQgaWRmIC4uIHNob3VsZCBpdD8KICAgICBoYW5kbGUucHV0KCJkZiIsIFNLSVBWQUwpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9UZXJtc0NvbXBvbmVudFRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvaGFuZGxlci9jb21wb25lbnQvVGVybXNDb21wb25lbnRUZXN0LmphdmEKaW5kZXggZGMwMzY0ZC4uMzRkODhlOSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9oYW5kbGVyL2NvbXBvbmVudC9UZXJtc0NvbXBvbmVudFRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2hhbmRsZXIvY29tcG9uZW50L1Rlcm1zQ29tcG9uZW50VGVzdC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwic2NoZW1hMTIueG1sIik7CiAKICAgICBhc3NlcnROdWxsKGgudmFsaWRhdGVVcGRhdGUoYWRvYygiaWQiLCAiMCIsICJsb3dlcmZpbHQiLCAiYSIsICJzdGFuZGFyZGZpbHQiLCAiYSIsICJmb29faSIsIjEiKSkpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1Rlc3RCaW5hcnlSZXNwb25zZVdyaXRlci5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9yZXF1ZXN0L1Rlc3RCaW5hcnlSZXNwb25zZVdyaXRlci5qYXZhCmluZGV4IDU1OWUxNjYuLjFiNjBhZWIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvcmVxdWVzdC9UZXN0QmluYXJ5UmVzcG9uc2VXcml0ZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3JlcXVlc3QvVGVzdEJpbmFyeVJlc3BvbnNlV3JpdGVyLmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hMTIueG1sIik7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9yZXNwb25zZS9UZXN0Q1NWUmVzcG9uc2VXcml0ZXIuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvcmVzcG9uc2UvVGVzdENTVlJlc3BvbnNlV3JpdGVyLmphdmEKaW5kZXggZWJkNzY1ZC4uOGE2Yjg1YSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9yZXNwb25zZS9UZXN0Q1NWUmVzcG9uc2VXcml0ZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3Jlc3BvbnNlL1Rlc3RDU1ZSZXNwb25zZVdyaXRlci5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBwdWJsaWMgY2xhc3MgVGVzdENTVlJlc3BvbnNlV3JpdGVyIGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwic2NoZW1hMTIueG1sIik7CiAgICAgY3JlYXRlSW5kZXgoKTsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvTm90UmVxdWlyZWRVbmlxdWVLZXlUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Ob3RSZXF1aXJlZFVuaXF1ZUtleVRlc3QuamF2YQppbmRleCAyNGY5NjJkLi5mODk1ZjBkIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Ob3RSZXF1aXJlZFVuaXF1ZUtleVRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9Ob3RSZXF1aXJlZFVuaXF1ZUtleVRlc3QuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHVzZWNhc2UgZG9lc24ndCB3b3JrIHdpdGggdXBkYXRlTG9nCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwic2NoZW1hLW5vdC1yZXF1aXJlZC11bmlxdWUta2V5LnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1ByaW1pdGl2ZUZpZWxkVHlwZVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1ByaW1pdGl2ZUZpZWxkVHlwZVRlc3QuamF2YQppbmRleCA4NDE1MjM2Li5iZTI4MzYwIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9QcmltaXRpdmVGaWVsZFR5cGVUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvUHJpbWl0aXZlRmllbGRUeXBlVGVzdC5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiAgIHB1YmxpYyB2b2lkIHNldFVwKCkgIHRocm93cyBFeGNlcHRpb24gewogICAgIHN1cGVyLnNldFVwKCk7CiAgICAgLy8gc2V0IHNvbWUgc3lzdGVtIHByb3BlcnRpZXMgZm9yIHVzZSBieSB0ZXN0cworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci50ZXN0LnN5cy5wcm9wMSIsICJwcm9wb25lIik7CiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLnRlc3Quc3lzLnByb3AyIiwgInByb3B0d28iKTsKIApAQCAtNTgsMTEgKzU5LDkgQEAKICAgICBUcmllSW50RmllbGQgdGk7CiAgICAgU29ydGFibGVJbnRGaWVsZCBzaTsKICAgICBMb25nRmllbGQgbDsKLSAgICBTaG9ydEZpZWxkIHNmOwogICAgIEZsb2F0RmllbGQgZjsKICAgICBEb3VibGVGaWVsZCBkOwogICAgIEJvb2xGaWVsZCBiOwotICAgIEJ5dGVGaWVsZCBiZjsKICAgICAKICAgICAKICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTQsMTAgKzkzLDYgQEAKICAgICBsLmluaXQoc2NoZW1hLCBpbml0TWFwKTsKICAgICBhc3NlcnRGYWxzZShsLmhhc1Byb3BlcnR5KEZpZWxkVHlwZS5PTUlUX05PUk1TKSk7CiAKLSAgICBzZiA9IG5ldyBTaG9ydEZpZWxkKCk7Ci0gICAgc2YuaW5pdChzY2hlbWEsIGluaXRNYXApOwotICAgIGFzc2VydEZhbHNlKHNmLmhhc1Byb3BlcnR5KEZpZWxkVHlwZS5PTUlUX05PUk1TKSk7Ci0KICAgICBmID0gbmV3IEZsb2F0RmllbGQoKTsKICAgICBmLmluaXQoc2NoZW1hLCBpbml0TWFwKTsKICAgICBhc3NlcnRGYWxzZShmLmhhc1Byb3BlcnR5KEZpZWxkVHlwZS5PTUlUX05PUk1TKSk7CkBAIC0xMTQsMTAgKzEwOSw2IEBACiAgICAgYi5pbml0KHNjaGVtYSwgaW5pdE1hcCk7CiAgICAgYXNzZXJ0RmFsc2UoYi5oYXNQcm9wZXJ0eShGaWVsZFR5cGUuT01JVF9OT1JNUykpOwogCi0gICAgYmYgPSBuZXcgQnl0ZUZpZWxkKCk7Ci0gICAgYmYuaW5pdChzY2hlbWEsIGluaXRNYXApOwotICAgIGFzc2VydEZhbHNlKGJmLmhhc1Byb3BlcnR5KEZpZWxkVHlwZS5PTUlUX05PUk1TKSk7Ci0KICAgICAvLyBOb24tcHJpbWl0aXZlIGZpZWxkcwogICAgIHQgPSBuZXcgVGV4dEZpZWxkKCk7CiAgICAgdC5pbml0KHNjaGVtYSwgaW5pdE1hcCk7CkBAIC0xNTYsMTAgKzE0Nyw2IEBACiAgICAgbC5pbml0KHNjaGVtYSwgaW5pdE1hcCk7CiAgICAgYXNzZXJ0VHJ1ZShsLmhhc1Byb3BlcnR5KEZpZWxkVHlwZS5PTUlUX05PUk1TKSk7CiAKLSAgICBzZiA9IG5ldyBTaG9ydEZpZWxkKCk7Ci0gICAgc2YuaW5pdChzY2hlbWEsIGluaXRNYXApOwotICAgIGFzc2VydFRydWUoc2YuaGFzUHJvcGVydHkoRmllbGRUeXBlLk9NSVRfTk9STVMpKTsKLQogICAgIGYgPSBuZXcgRmxvYXRGaWVsZCgpOwogICAgIGYuaW5pdChzY2hlbWEsIGluaXRNYXApOwogICAgIGFzc2VydFRydWUoZi5oYXNQcm9wZXJ0eShGaWVsZFR5cGUuT01JVF9OT1JNUykpOwpAQCAtMTc2LDEwICsxNjMsNiBAQAogICAgIGIuaW5pdChzY2hlbWEsIGluaXRNYXApOwogICAgIGFzc2VydFRydWUoYi5oYXNQcm9wZXJ0eShGaWVsZFR5cGUuT01JVF9OT1JNUykpOwogCi0gICAgYmYgPSBuZXcgQnl0ZUZpZWxkKCk7Ci0gICAgYmYuaW5pdChzY2hlbWEsIGluaXRNYXApOwotICAgIGFzc2VydFRydWUoYmYuaGFzUHJvcGVydHkoRmllbGRUeXBlLk9NSVRfTk9STVMpKTsKLQogICAgIC8vIE5vbi1wcmltaXRpdmUgZmllbGRzCiAgICAgdCA9IG5ldyBUZXh0RmllbGQoKTsKICAgICB0LmluaXQoc2NoZW1hLCBpbml0TWFwKTsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1Rlc3RDb2xsYXRpb25GaWVsZC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvVGVzdENvbGxhdGlvbkZpZWxkLmphdmEKaW5kZXggMDljNmRkNy4uMDhlYTI4YSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvVGVzdENvbGxhdGlvbkZpZWxkLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvVGVzdENvbGxhdGlvbkZpZWxkLmphdmEKQEAgLTc0LDYgKzc0LDcgQEAKICAgICAKICAgICAvLyBjb3B5IG92ZXIgY29uZmlndXJhdGlvbiBmaWxlcwogICAgIEZpbGVVdGlscy5jb3B5RmlsZShnZXRGaWxlKCJzb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1iYXNpYy54bWwiKSwgbmV3IEZpbGUoY29uZkRpciwgInNvbHJjb25maWcueG1sIikpOworICAgIEZpbGVVdGlscy5jb3B5RmlsZShnZXRGaWxlKCJzb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIpLCBuZXcgRmlsZShjb25mRGlyLCAic29scmNvbmZpZy5zbmlwcGV0LnJhbmRvbWluZGV4Y29uZmlnLnhtbCIpKTsKICAgICBGaWxlVXRpbHMuY29weUZpbGUoZ2V0RmlsZSgic29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS1jb2xsYXRlLnhtbCIpLCBuZXcgRmlsZShjb25mRGlyLCAic2NoZW1hLnhtbCIpKTsKICAgICAKICAgICAvLyBnZW5lcmF0ZSBjdXN0b20gY29sbGF0aW9uIHJ1bGVzIChESU4gNTAwNy0yKSwgc2F2aW5nIHRvIGN1c3RvbXJ1bGVzLmRhdApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvVGVzdE1hbmFnZWRTY2hlbWEuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2NoZW1hL1Rlc3RNYW5hZ2VkU2NoZW1hLmphdmEKaW5kZXggN2ZiOGEzMS4uOGJjMjljOSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zY2hlbWEvVGVzdE1hbmFnZWRTY2hlbWEuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NjaGVtYS9UZXN0TWFuYWdlZFNjaGVtYS5qYXZhCkBAIC01NSw3ICs1NSw5IEBACiAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUodGVzdEhvbWVDb25mRGlyLCAic29scmNvbmZpZy1tdXRhYmxlLW1hbmFnZWQtc2NoZW1hLnhtbCIpLCB0bXBDb25mRGlyKTsKICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZSh0ZXN0SG9tZUNvbmZEaXIsICJzb2xyY29uZmlnLW1hbmFnZWQtc2NoZW1hLnhtbCIpLCB0bXBDb25mRGlyKTsKICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZSh0ZXN0SG9tZUNvbmZEaXIsICJzb2xyY29uZmlnLWJhc2ljLnhtbCIpLCB0bXBDb25mRGlyKTsKKyAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZSh0ZXN0SG9tZUNvbmZEaXIsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiksIHRtcENvbmZEaXIpOwogICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KG5ldyBGaWxlKHRlc3RIb21lQ29uZkRpciwgInNjaGVtYS1vbmUtZmllbGQtbm8tZHluYW1pYy1maWVsZC54bWwiKSwgdG1wQ29uZkRpcik7CisgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkobmV3IEZpbGUodGVzdEhvbWVDb25mRGlyLCAic2NoZW1hLW9uZS1maWVsZC1uby1keW5hbWljLWZpZWxkLXVuaXF1ZS1rZXkueG1sIiksIHRtcENvbmZEaXIpOwogICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KG5ldyBGaWxlKHRlc3RIb21lQ29uZkRpciwgInNjaGVtYS1taW5pbWFsLnhtbCIpLCB0bXBDb25mRGlyKTsKICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZSh0ZXN0SG9tZUNvbmZEaXIsICJzY2hlbWFfY29kZWMueG1sIiksIHRtcENvbmZEaXIpOwogICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KG5ldyBGaWxlKHRlc3RIb21lQ29uZkRpciwgInNjaGVtYS1ibTI1LnhtbCIpLCB0bXBDb25mRGlyKTsKQEAgLTM4NSw0ICszODcsMzkgQEAKICAgICBhc3NlcnRRKHJlcShmaWVsZE5hbWUgKyAiOnRoaW5nIiksICIvLypbQG51bUZvdW5kPScxJ10iKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0VW5pcXVlS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0U2NoZW1hUmVzb3VyY2UoY29sbGVjdGlvbiwgIm1hbmFnZWQtc2NoZW1hIik7CisgICAgZGVsZXRlQ29yZSgpOworICAgIEZpbGUgbWFuYWdlZFNjaGVtYUZpbGUgPSBuZXcgRmlsZSh0bXBDb25mRGlyLCAibWFuYWdlZC1zY2hlbWEiKTsKKyAgICBhc3NlcnRUcnVlKG1hbmFnZWRTY2hlbWFGaWxlLmRlbGV0ZSgpKTsgLy8gRGVsZXRlIG1hbmFnZWQtc2NoZW1hIHNvIGl0IHdvbid0IGJsb2NrIHBhcnNpbmcgYSBuZXcgc2NoZW1hCisgICAgaW5pdENvcmUoInNvbHJjb25maWctbXV0YWJsZS1tYW5hZ2VkLXNjaGVtYS54bWwiLCAic2NoZW1hLW9uZS1maWVsZC1uby1keW5hbWljLWZpZWxkLXVuaXF1ZS1rZXkueG1sIiwgdG1wU29sckhvbWUuZ2V0UGF0aCgpKTsKKworICAgIGFzc2VydFRydWUobWFuYWdlZFNjaGVtYUZpbGUuZXhpc3RzKCkpOworICAgIFN0cmluZyBtYW5hZ2VkU2NoZW1hQ29udGVudHMgPSBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyhtYW5hZ2VkU2NoZW1hRmlsZSwgIlVURi04Iik7CisgICAgYXNzZXJ0RmFsc2UobWFuYWdlZFNjaGVtYUNvbnRlbnRzLmNvbnRhaW5zKCJcIm5ld19maWVsZFwiIikpOworCisgICAgTWFwPFN0cmluZyxPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOworICAgIG9wdGlvbnMucHV0KCJzdG9yZWQiLCAiZmFsc2UiKTsKKyAgICBJbmRleFNjaGVtYSBvbGRTY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnRFcXVhbHMoInN0ciIsIG9sZFNjaGVtYS5nZXRVbmlxdWVLZXlGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgU3RyaW5nIGZpZWxkTmFtZSA9ICJuZXdfZmllbGQiOworICAgIFN0cmluZyBmaWVsZFR5cGUgPSAic3RyaW5nIjsKKyAgICBTY2hlbWFGaWVsZCBuZXdGaWVsZCA9IG9sZFNjaGVtYS5uZXdGaWVsZChmaWVsZE5hbWUsIGZpZWxkVHlwZSwgb3B0aW9ucyk7CisgICAgSW5kZXhTY2hlbWEgbmV3U2NoZW1hID0gb2xkU2NoZW1hLmFkZEZpZWxkKG5ld0ZpZWxkKTsKKyAgICBhc3NlcnRFcXVhbHMoInN0ciIsIG5ld1NjaGVtYS5nZXRVbmlxdWVLZXlGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgaC5nZXRDb3JlKCkuc2V0TGF0ZXN0U2NoZW1hKG5ld1NjaGVtYSk7CisgICAgbG9nLmluZm8oIiMjIyNjbG9zZSBoYXJuZXNzIik7CisgICAgaC5jbG9zZSgpOworICAgIGxvZy5pbmZvKCIjIyMjY2xvc2UgaGFybmVzcyBlbmQiKTsKKyAgICBpbml0Q29yZSgpOworCisgICAgYXNzZXJ0VHJ1ZShtYW5hZ2VkU2NoZW1hRmlsZS5leGlzdHMoKSk7CisgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuYWdlZFNjaGVtYUZpbGUpOworICAgIG1hbmFnZWRTY2hlbWFDb250ZW50cyA9IElPVXRpbHMudG9TdHJpbmcoc3RyZWFtLCAiVVRGLTgiKTsKKyAgICBzdHJlYW0uY2xvc2UoKTsgLy8gRXhwbGljaXRseSBjbG9zZSBzbyB0aGF0IFdpbmRvd3MgY2FuIGRlbGV0ZSB0aGlzIGZpbGUKKyAgICBhc3NlcnRUcnVlKG1hbmFnZWRTY2hlbWFDb250ZW50cy5jb250YWlucygiPGZpZWxkIG5hbWU9XCJuZXdfZmllbGRcIiB0eXBlPVwic3RyaW5nXCIgc3RvcmVkPVwiZmFsc2VcIi8+IikpOworICAgIEluZGV4U2NoZW1hIG5ld05ld1NjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwobmV3TmV3U2NoZW1hLmdldFVuaXF1ZUtleUZpZWxkKCkpOworICAgIGFzc2VydEVxdWFscygic3RyIiwgbmV3TmV3U2NoZW1hLmdldFVuaXF1ZUtleUZpZWxkKCkuZ2V0TmFtZSgpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvUmV0dXJuRmllbGRzVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvUmV0dXJuRmllbGRzVGVzdC5qYXZhCmluZGV4IDBkNzM5OTAuLjg3MjgwYjQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1JldHVybkZpZWxkc1Rlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9SZXR1cm5GaWVsZHNUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIAogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYTEyLnhtbCIpOwogICAgIFN0cmluZyB2ID0gImhvdyBub3cgYnJvd24gY293IjsKICAgICBhc3NlcnRVKGFkb2MoImlkIiwiMSIsICJ0ZXh0Iix2LCAgInRleHRfbnAiLCB2LCAiI2Zvb19zIiwgdikpOwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdEV4dGVuZGVkRGlzbWF4UGFyc2VyLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0RXh0ZW5kZWREaXNtYXhQYXJzZXIuamF2YQppbmRleCBiY2ZkYjI4Li4zN2YyMjQ3IDEwMDc1NQotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0RXh0ZW5kZWREaXNtYXhQYXJzZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0RXh0ZW5kZWREaXNtYXhQYXJzZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hMTIueG1sIik7CiAgICAgaW5kZXgoKTsKICAgfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdEZpbHRlcmluZy5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdEZpbHRlcmluZy5qYXZhCmluZGV4IGNjNzFmODIuLmIwYTRiZDggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RGaWx0ZXJpbmcuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0RmlsdGVyaW5nLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIAogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVRlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwic2NoZW1hMTIueG1sIik7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdEZvbGRpbmdNdWx0aXRlcm1RdWVyeS5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdEZvbGRpbmdNdWx0aXRlcm1RdWVyeS5qYXZhCmluZGV4IGRiODAwZmMuLjA4ZmNmYTggMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RGb2xkaW5nTXVsdGl0ZXJtUXVlcnkuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0Rm9sZGluZ011bHRpdGVybVF1ZXJ5LmphdmEKQEAgLTQ2LDggKzQ2LDYgQEAKICAgICAgICAgICAiZmxvYXRfZiIsIG51bSwKICAgICAgICAgICAibG9uZ19mIiwgbnVtLAogICAgICAgICAgICJkb3VibGVfZiIsIG51bSwKLSAgICAgICAgICAiYnl0ZV9mIiwgbnVtLAotICAgICAgICAgICJzaG9ydF9mIiwgbnVtLAogICAgICAgICAgICJib29sX2YiLCBib29sVmFsLAogICAgICAgICAgICJkYXRlX2YiLCAiMjAwIiArIEludGVnZXIudG9TdHJpbmcoaSAlIDEwKSArICItMDEtMDFUMDA6MDA6MDBaIiwKICAgICAgICAgICAiY29udGVudCIsIGRvY3NbaV0sCkBAIC0yNjksNyArMjY3LDcgQEAKIAogICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVGV4dFR5cGVzKCkgewotICAgIFN0cmluZ1tdIGludFR5cGVzID0geyJpbnRfZiIsICJmbG9hdF9mIiwgImxvbmdfZiIsICJkb3VibGVfZiIsICJieXRlX2YiLCAic2hvcnRfZiJ9OworICAgIFN0cmluZ1tdIGludFR5cGVzID0geyJpbnRfZiIsICJmbG9hdF9mIiwgImxvbmdfZiIsICJkb3VibGVfZiJ9OwogCiAgICAgZm9yIChTdHJpbmcgc3RyIDogaW50VHlwZXMpIHsKICAgICAgIGFzc2VydFEocmVxKCJxIiwgc3RyICsgIjoiICsgIjAiKSwKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RQc2V1ZG9SZXR1cm5GaWVsZHMuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RQc2V1ZG9SZXR1cm5GaWVsZHMuamF2YQppbmRleCBiZTVkYTlhLi5mMWRhN2MyIDEwMDY0NAotLS0gYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0UHNldWRvUmV0dXJuRmllbGRzLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFBzZXVkb1JldHVybkZpZWxkcy5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsInNjaGVtYTEyLnhtbCIpOwogCiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RSZWNvdmVyeS5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFJlY292ZXJ5LmphdmEKaW5kZXggNWE4ZThjMC4uNGI1ZWQ1OSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFJlY292ZXJ5LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFJlY292ZXJ5LmphdmEKQEAgLTE3LDYgKzE3LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnNlYXJjaDsKIAogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yLkRpc3RyaWJ1dGluZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkuRElTVFJJQl9VUERBVEVfUEFSQU07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247CiBpbXBvcnQgb3JnLm5vZ2dpdC5PYmplY3RCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUXVlcnlSZXF1ZXN0OwpAQCAtNDEsOCArNDQsMTYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuRGlzdHJpYnV0aW5nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeS5ESVNUUklCX1VQREFURV9QQVJBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuRGlzdHJpYnV0ZWRVcGRhdGVQcm9jZXNzb3IuRGlzdHJpYlBoYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUXVlcnlSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUuRGlyZWN0VXBkYXRlSGFuZGxlcjI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5VcGRhdGVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUuVXBkYXRlTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUucHJvY2Vzc29yLkRpc3RyaWJ1dGVkVXBkYXRlUHJvY2Vzc29yLkRpc3RyaWJQaGFzZTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm5vZ2dpdC5PYmplY3RCdWlsZGVyOwogCiBwdWJsaWMgY2xhc3MgVGVzdFJlY292ZXJ5IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogCkBAIC00ODcsNyArNDk4LDQwIEBACiAgIH0KIAogCisKKyAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9nIGlzIGluZm9ybWVkIG9mIGEgY29yZSByZWxvYWQKICAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGxvbmcgdmVyc2lvbiA9IGFkZEFuZEdldFZlcnNpb24oc2RvYygiaWQiLCJyZWxvYWQxIikgLCBudWxsKTsKKworICAgIGgucmVsb2FkKCk7CisKKyAgICB2ZXJzaW9uID0gYWRkQW5kR2V0VmVyc2lvbihzZG9jKCJpZCIsInJlbG9hZDEiLCAiX3ZlcnNpb25fIiwgTG9uZy50b1N0cmluZyh2ZXJzaW9uKSksIG51bGwpOworCisgICAgYXNzZXJ0VShjb21taXQoKSk7CisKKyAgICAvLyBpZiB3ZSB0cnkgdGhlIG9wdGltaXN0aWMgY29uY3VycmVuY3kgYWdhaW4sIHRoZSB0bG9nIGxvb2t1cCBtYXBzIHNob3VsZCBiZSBjbGVhcgorICAgIC8vIGFuZCB3ZSBzaG91bGQgZ28gdG8gdGhlIGluZGV4IHRvIGNoZWNrIHRoZSB2ZXJzaW9uLiAgVGhpcyBpbmRpcmVjdGx5IHRlc3RzIHRoYXQKKyAgICAvLyB0aGUgdXBkYXRlIGxvZyB3YXMgaW5mb3JtZWQgb2YgdGhlIHJlbG9hZC4gIFNlZSBTT0xSLTQ4NTgKKworICAgIHZlcnNpb24gPSBhZGRBbmRHZXRWZXJzaW9uKHNkb2MoImlkIiwicmVsb2FkMSIsICJfdmVyc2lvbl8iLCBMb25nLnRvU3RyaW5nKHZlcnNpb24pKSwgbnVsbCk7CisKKyAgICAvLyBhIGRlbGV0ZUJ5UXVlcnkgY3VycmVudGx5IGZvcmNlcyBvcGVuIGEgbmV3IHJlYWx0aW1lIHJlYWRlciB2aWEgdGhlIHVwZGF0ZSBsb2cuCisgICAgLy8gVGhpcyBhbHNvIHRlc3RzIHRoYXQgdGhlIHVwZGF0ZSBsb2cgd2FzIGluZm9ybWVkIG9mIHRoZSBuZXcgdWRwYXRlIGhhbmRsZXIuCisKKyAgICBkZWxldGVCeVF1ZXJ5QW5kR2V0VmVyc2lvbigiZm9vX3Q6aG93bm93YnJvd25jb3ciLCBudWxsKTsKKworICAgIHZlcnNpb24gPSBhZGRBbmRHZXRWZXJzaW9uKHNkb2MoImlkIiwicmVsb2FkMSIsICJfdmVyc2lvbl8iLCBMb25nLnRvU3RyaW5nKHZlcnNpb24pKSwgbnVsbCk7CisKKyAgICAvLyBpZiB0aGUgdXBkYXRlIGxvZyB3YXMgbm90IGluZm9ybWVkIG9mIHRoZSBuZXcgdXBkYXRlIGhhbmRsZXIsIHRoZW4gdGhlIG9sZCBjb3JlIHdpbGwKKyAgICAvLyBpbmNvcnJlY3RseSBiZSB1c2VkIGZvciBzb21lIG9mIHRoZSBvcGVyYXRpb25zIGFib3ZlIGFuZCBvcGVuZWQgc2VhcmNoZXJzCisgICAgLy8gd2lsbCBuZXZlciBiZSBjbG9zZWQuICBUaGlzIHVzZWQgdG8gY2F1c2UgdGhlIHRlc3QgZnJhbWV3b3JrIHRvIGZhaWwgYmVjYXVzZSBvZiB1bmNsb3NlZCBkaXJlY3RvcnkgY2hlY2tzLgorICAgIC8vIFNvbHJDb3JlLm9wZW5OZXdTZWFyY2hlciB3YXMgbW9kaWZpZWQgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvcmUgaXMgY2xvc2VkLCByZXN1bHRpbmcgaW4KKyAgICAvLyBhIGZhc3RlciBmYWlsLgorICB9CisKKworICAgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJpbmdGbGFncygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IGZhbHNlOwpAQCAtNzEwLDE2ICs3NTQsMTcgQEAKICAgICAgIGNsZWFySW5kZXgoKTsKICAgICAgIGFzc2VydFUoY29tbWl0KCkpOwogCi0gICAgICBGaWxlIGxvZ0RpciA9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5nZXRMb2dEaXIoKTsKKyAgICAgIFVwZGF0ZUxvZyB1bG9nID0gaC5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpOworICAgICAgRmlsZSBsb2dEaXIgPSBuZXcgRmlsZShoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCkpOwogCiAgICAgICBoLmNsb3NlKCk7CiAKLSAgICAgIFN0cmluZ1tdIGZpbGVzID0gVXBkYXRlTG9nLmdldExvZ0xpc3QobG9nRGlyKTsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gdWxvZy5nZXRMb2dMaXN0KGxvZ0Rpcik7CiAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKICAgICAgICAgbmV3IEZpbGUobG9nRGlyLCBmaWxlKS5kZWxldGUoKTsKICAgICAgIH0KIAotICAgICAgYXNzZXJ0RXF1YWxzKDAsIFVwZGF0ZUxvZy5nZXRMb2dMaXN0KGxvZ0RpcikubGVuZ3RoKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCB1bG9nLmdldExvZ0xpc3QobG9nRGlyKS5sZW5ndGgpOwogCiAgICAgICBjcmVhdGVDb3JlKCk7CiAKQEAgLTczNyw3ICs3ODIsNyBAQAogICAgICAgYXNzZXJ0VShjb21taXQoKSk7CiAgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CiAKLSAgICAgIGFzc2VydEVxdWFscygyLCBVcGRhdGVMb2cuZ2V0TG9nTGlzdChsb2dEaXIpLmxlbmd0aCk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgdWxvZy5nZXRMb2dMaXN0KGxvZ0RpcikubGVuZ3RoKTsKIAogICAgICAgYWRkRG9jcygxMDUsIHN0YXJ0LCB2ZXJzaW9ucyk7ICBzdGFydCs9MTA1OwogICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK21heFJlcSksICIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucy5zdWJMaXN0KDAsTWF0aC5taW4obWF4UmVxLHN0YXJ0KSkpOwpAQCAtNzQ1LDcgKzc5MCw3IEBACiAgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CiAKICAgICAgIC8vIHByZXZpb3VzIHR3byBsb2dzIHNob3VsZCBiZSBnb25lIG5vdwotICAgICAgYXNzZXJ0RXF1YWxzKDEsIFVwZGF0ZUxvZy5nZXRMb2dMaXN0KGxvZ0RpcikubGVuZ3RoKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB1bG9nLmdldExvZ0xpc3QobG9nRGlyKS5sZW5ndGgpOwogCiAgICAgICBhZGREb2NzKDEsIHN0YXJ0LCB2ZXJzaW9ucyk7ICBzdGFydCs9MTsKICAgICAgIGguY2xvc2UoKTsKQEAgLTc2NSwxNCArODEwLDE0IEBACiAgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CiAKICAgICAgIC8vIHByZXZpb3VzIGxvZ3Mgc2hvdWxkIGJlIGdvbmUgbm93Ci0gICAgICBhc3NlcnRFcXVhbHMoMSwgVXBkYXRlTG9nLmdldExvZ0xpc3QobG9nRGlyKS5sZW5ndGgpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVsb2cuZ2V0TG9nTGlzdChsb2dEaXIpLmxlbmd0aCk7CiAKICAgICAgIC8vCiAgICAgICAvLyB0ZXN0IHRoYXQgYSBjb3JydXB0IHRsb2cgZmlsZSBkb2Vzbid0IHN0b3AgdXMgZnJvbSBjb21pbmcgdXAsIG9yIHNlZWluZyB2ZXJzaW9ucyBiZWZvcmUgdGhhdCB0bG9nIGZpbGUuCiAgICAgICAvLwogICAgICAgYWRkRG9jcygxLCBzdGFydCwgbmV3IExpbmtlZExpc3Q8TG9uZz4oKSk7IC8vIGRvbid0IGFkZCB0aGlzIHRvIHRoZSB2ZXJzaW9ucyBsaXN0IGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvc2UgaXQuLi4KICAgICAgIGguY2xvc2UoKTsKLSAgICAgIGZpbGVzID0gVXBkYXRlTG9nLmdldExvZ0xpc3QobG9nRGlyKTsKKyAgICAgIGZpbGVzID0gdWxvZy5nZXRMb2dMaXN0KGxvZ0Rpcik7CiAgICAgICBBcnJheXMuc29ydChmaWxlcyk7CiAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKG5ldyBGaWxlKGxvZ0RpciwgZmlsZXNbZmlsZXMubGVuZ3RoLTFdKSwgInJ3Iik7CiAgICAgICByYWYud3JpdGVDaGFycygiVGhpcyBpcyBhIHRyYXNoZWQgbG9nIGZpbGUgdGhhdCByZWFsbHkgc2hvdWxkbid0IHdvcmsgYXQgYWxsLCBidXQgd2UnbGwgc2VlLi4uIik7CkBAIC04MjAsNyArODY1LDggQEAKICAgICAgICAgfQogICAgICAgfTsKIAotICAgICAgRmlsZSBsb2dEaXIgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisgICAgICBVcGRhdGVMb2cgdWxvZyA9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKTsKKyAgICAgIEZpbGUgbG9nRGlyID0gbmV3IEZpbGUoaC5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpLmdldExvZ0RpcigpKTsKIAogICAgICAgY2xlYXJJbmRleCgpOwogICAgICAgYXNzZXJ0VShjb21taXQoKSk7CkBAIC04MzAsNyArODc2LDcgQEAKICAgICAgIGFzc2VydFUoYWRvYygiaWQiLCJGMyIpKTsKIAogICAgICAgaC5jbG9zZSgpOwotICAgICAgU3RyaW5nW10gZmlsZXMgPSBVcGRhdGVMb2cuZ2V0TG9nTGlzdChsb2dEaXIpOworICAgICAgU3RyaW5nW10gZmlsZXMgPSB1bG9nLmdldExvZ0xpc3QobG9nRGlyKTsKICAgICAgIEFycmF5cy5zb3J0KGZpbGVzKTsKICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobmV3IEZpbGUobG9nRGlyLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pLCAicnciKTsKICAgICAgIHJhZi5zZWVrKHJhZi5sZW5ndGgoKSk7ICAvLyBzZWVrIHRvIGVuZApAQCAtODc0LDcgKzkyMCw4IEBACiAgICAgdHJ5IHsKICAgICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSBmYWxzZTsKIAotICAgICAgRmlsZSBsb2dEaXIgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisgICAgICBVcGRhdGVMb2cgdWxvZyA9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKTsKKyAgICAgIEZpbGUgbG9nRGlyID0gbmV3IEZpbGUoaC5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpLmdldExvZ0RpcigpKTsKIAogICAgICAgY2xlYXJJbmRleCgpOwogICAgICAgYXNzZXJ0VShjb21taXQoKSk7CkBAIC04ODYsNyArOTMzLDcgQEAKICAgICAgIGguY2xvc2UoKTsKIAogCi0gICAgICBTdHJpbmdbXSBmaWxlcyA9IFVwZGF0ZUxvZy5nZXRMb2dMaXN0KGxvZ0Rpcik7CisgICAgICBTdHJpbmdbXSBmaWxlcyA9IHVsb2cuZ2V0TG9nTGlzdChsb2dEaXIpOwogICAgICAgQXJyYXlzLnNvcnQoZmlsZXMpOwogICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShuZXcgRmlsZShsb2dEaXIsIGZpbGVzW2ZpbGVzLmxlbmd0aC0xXSksICJydyIpOwogICAgICAgbG9uZyBsZW4gPSByYWYubGVuZ3RoKCk7CkBAIC05NTcsNyArMTAwNCw4IEBACiAgICAgICAgIH0KICAgICAgIH07CiAKLSAgICAgIEZpbGUgbG9nRGlyID0gaC5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpLmdldExvZ0RpcigpOworICAgICAgVXBkYXRlTG9nIHVsb2cgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCk7CisgICAgICBGaWxlIGxvZ0RpciA9IG5ldyBGaWxlKGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5nZXRMb2dEaXIoKSk7CiAKICAgICAgIGNsZWFySW5kZXgoKTsKICAgICAgIGFzc2VydFUoY29tbWl0KCkpOwpAQCAtOTY3LDcgKzEwMTUsNyBAQAogICAgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkNDQ0NDQyIpKTsKIAogICAgICAgaC5jbG9zZSgpOwotICAgICAgU3RyaW5nW10gZmlsZXMgPSBVcGRhdGVMb2cuZ2V0TG9nTGlzdChsb2dEaXIpOworICAgICAgU3RyaW5nW10gZmlsZXMgPSB1bG9nLmdldExvZ0xpc3QobG9nRGlyKTsKICAgICAgIEFycmF5cy5zb3J0KGZpbGVzKTsKICAgICAgIFN0cmluZyBmbmFtZSA9IGZpbGVzW2ZpbGVzLmxlbmd0aC0xXTsKICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobmV3IEZpbGUobG9nRGlyLCBmbmFtZSksICJydyIpOwpAQCAtMTAzNywxNyArMTA4NSwxOCBAQAogCiAgIC8vIHN0b3BzIHRoZSBjb3JlLCByZW1vdmVzIHRoZSB0cmFuc2FjdGlvbiBsb2dzLCByZXN0YXJ0cyB0aGUgY29yZS4KICAgdm9pZCBkZWxldGVMb2dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmlsZSBsb2dEaXIgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisgICAgVXBkYXRlTG9nIHVsb2cgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCk7CisgICAgRmlsZSBsb2dEaXIgPSBuZXcgRmlsZShoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCkpOwogCiAgICAgaC5jbG9zZSgpOwogCiAgICAgdHJ5IHsKLSAgICAgIFN0cmluZ1tdIGZpbGVzID0gVXBkYXRlTG9nLmdldExvZ0xpc3QobG9nRGlyKTsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gdWxvZy5nZXRMb2dMaXN0KGxvZ0Rpcik7CiAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKICAgICAgICAgbmV3IEZpbGUobG9nRGlyLCBmaWxlKS5kZWxldGUoKTsKICAgICAgIH0KIAotICAgICAgYXNzZXJ0RXF1YWxzKDAsIFVwZGF0ZUxvZy5nZXRMb2dMaXN0KGxvZ0RpcikubGVuZ3RoKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCB1bG9nLmdldExvZ0xpc3QobG9nRGlyKS5sZW5ndGgpOwogICAgIH0gZmluYWxseSB7CiAgICAgICAvLyBtYWtlIHN1cmUgd2UgY3JlYXRlIHRoZSBjb3JlIGFnYWluLCBldmVuIGlmIHRoZSBhc3NlcnQgZmFpbHMgc28gaXQgd29uJ3QgbWVzcwogICAgICAgLy8gdXAgdGhlIG5leHQgdGVzdC4KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RSZWNvdmVyeUhkZnMuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RSZWNvdmVyeUhkZnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg2NzAyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFJlY292ZXJ5SGRmcy5qYXZhCkBAIC0wLDAgKzEsMTE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zZWFyY2g7CisKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3Nvci5EaXN0cmlidXRpbmdVcGRhdGVQcm9jZXNzb3JGYWN0b3J5LkRJU1RSSUJfVVBEQVRFX1BBUkFNOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbG91ZC5oZGZzLkhkZnNCYXNpY0Rpc3RyaWJ1dGVkWmsyVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmcy5IZGZzVGVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLkRpcmVjdFVwZGF0ZUhhbmRsZXIyOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci51cGRhdGUuSGRmc1VwZGF0ZUxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLlVwZGF0ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5VcGRhdGVMb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuRGlzdHJpYnV0ZWRVcGRhdGVQcm9jZXNzb3IuRGlzdHJpYlBoYXNlOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5ub2dnaXQuT2JqZWN0QnVpbGRlcjsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuVGhyZWFkTGVha0xpbmdlcmluZzsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZTsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLmFubm90YXRpb25zLlRocmVhZExlYWtTY29wZS5TY29wZTsKKworQFRocmVhZExlYWtTY29wZShTY29wZS5OT05FKSAvLyBoZGZzIG1pbmkgY2x1c3RlciBjdXJyZW50bHkgbGVha3MgdGhyZWFkcworQFRocmVhZExlYWtMaW5nZXJpbmcobGluZ2VyID0gMCkKKy8vIFRPRE86IGxvbmdlciB0ZXJtIHRoaXMgc2hvdWxkIGJlIGNvbWJpbmVkIHdpdGggVGVzdFJlY292ZXJ5IHNvbWVob3cKK3B1YmxpYyBjbGFzcyBUZXN0UmVjb3ZlcnlIZGZzIGV4dGVuZHMgU29sclRlc3RDYXNlSjQgeworCisgIC8vIG1lYW5zIHRoYXQgd2UndmUgc2VlbiB0aGUgbGVhZGVyIGFuZCBoYXZlIHZlcnNpb24gaW5mbyAoaS5lLiB3ZSBhcmUgYSBub24tbGVhZGVyIHJlcGxpY2EpCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBGUk9NX0xFQURFUiA9IERpc3RyaWJQaGFzZS5GUk9NTEVBREVSLnRvU3RyaW5nKCk7IAorCisgIHByaXZhdGUgc3RhdGljIGludCB0aW1lb3V0PTYwOyAgLy8gYWNxdWlyZSB0aW1lb3V0IGluIHNlY29uZHMuICBjaGFuZ2UgdGhpcyB0byBhIGh1Z2UgbnVtYmVyIHdoZW4gZGVidWdnaW5nIHRvIHByZXZlbnQgdGhyZWFkcyBmcm9tIGFkdmFuY2luZy4KKyAgCisgIHByaXZhdGUgc3RhdGljIE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhkZnNVcmk7CisgIAorICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGZzQ2x1c3RlciA9IEhkZnNUZXN0VXRpbC5zZXR1cENsYXNzKG5ldyBGaWxlKFRFTVBfRElSLAorICAgICAgICBIZGZzQmFzaWNEaXN0cmlidXRlZFprMlRlc3QuY2xhc3MuZ2V0TmFtZSgpICsgIl8iCisgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgaGRmc1VyaSA9IGRmc0NsdXN0ZXIuZ2V0RmlsZVN5c3RlbSgpLmdldFVyaSgpLnRvU3RyaW5nKCk7CisgICAgCisgICAgaGRmc0RhdGFEaXIgPSBoZGZzVXJpICsgIi9zb2xyL3NoYXJkMSI7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzb2xyLmRhdGEuZGlyIiwgaGRmc1VyaSArICIvc29sci9zaGFyZDEiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIudWxvZy5kaXIiLCBoZGZzVXJpICsgIi9zb2xyL3NoYXJkMSIpOworICAgIAorICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLXRsb2cueG1sIiwic2NoZW1hMTUueG1sIik7CisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHIudWxvZy5kaXIiKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgic29sci5kYXRhLmRpciIpOworICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJ0ZXN0LmJ1aWxkLmRhdGEiKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgidGVzdC5jYWNoZS5kYXRhIik7CisgICAgaGRmc0RhdGFEaXIgPSBudWxsOworICAgIGRmc0NsdXN0ZXIgPSBudWxsOworICAgIEhkZnNUZXN0VXRpbC50ZWFyZG93bkNsYXNzKGRmc0NsdXN0ZXIpOworICAgIEZpbGVTeXN0ZW0uY2xvc2VBbGwoKTsKKyAgfQorCisgIC8vIHNpbmNlIHdlIG1ha2UgdXAgZmFrZSB2ZXJzaW9ucyBpbiB0aGVzZSB0ZXN0cywgd2UgY2FuIGdldCBtZXNzZWQgdXAgYnkgYSBEQlEgd2l0aCBhIHJlYWwgdmVyc2lvbgorICAvLyBzaW5jZSBTb2xyIGNhbiB0aGluayBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHJlb3JkZXJlZC4KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsZWFySW5kZXgoKSB7CisgICAgdHJ5IHsKKyAgICAgIGRlbGV0ZUJ5UXVlcnlBbmRHZXRWZXJzaW9uKCIqOioiLCBwYXJhbXMoIl92ZXJzaW9uXyIsIExvbmcudG9TdHJpbmcoLUxvbmcuTUFYX1ZBTFVFKSwgRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TG9nUmVwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKworICAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IGZhbHNlOworICAgICAgZmluYWwgU2VtYXBob3JlIGxvZ1JlcGxheSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgICBmaW5hbCBTZW1hcGhvcmUgbG9nUmVwbGF5RmluaXNoID0gbmV3IFNlbWFwaG9yZSgwKTsKKworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2dSZXBsYXkudHJ5QWNxdWlyZSh0aW1lb3V0LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBsb2dSZXBsYXlGaW5pc2gucmVsZWFzZSgpOworICAgICAgICB9CisgICAgICB9OworCisKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBEZXF1ZTxMb25nPiB2ZXJzaW9ucyA9IG5ldyBBcnJheURlcXVlPExvbmc+KCk7CisgICAgICB2ZXJzaW9ucy5hZGRGaXJzdChhZGRBbmRHZXRWZXJzaW9uKHNkb2MoImlkIiwgIkExIiksIG51bGwpKTsKKyAgICAgIHZlcnNpb25zLmFkZEZpcnN0KGFkZEFuZEdldFZlcnNpb24oc2RvYygiaWQiLCAiQTExIiksIG51bGwpKTsKKyAgICAgIHZlcnNpb25zLmFkZEZpcnN0KGFkZEFuZEdldFZlcnNpb24oc2RvYygiaWQiLCAiQTEyIiksIG51bGwpKTsKKyAgICAgIHZlcnNpb25zLmFkZEZpcnN0KGRlbGV0ZUJ5UXVlcnlBbmRHZXRWZXJzaW9uKCJpZDpBMTEiLCBudWxsKSk7CisgICAgICB2ZXJzaW9ucy5hZGRGaXJzdChhZGRBbmRHZXRWZXJzaW9uKHNkb2MoImlkIiwgIkExMyIpLCBudWxsKSk7CisKKyAgICAgIGFzc2VydEpRKHJlcSgicSIsIio6KiIpLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTAiKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK3ZlcnNpb25zLnNpemUoKSkgLCIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucyk7CisKKyAgICAgIGguY2xvc2UoKTsKKyAgICAgIGNyZWF0ZUNvcmUoKTsKKyAgICAgIC8vIFNvbHIgc2hvdWxkIGtpY2sgdGhpcyBvZmYgbm93CisgICAgICAvLyBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkucmVjb3ZlckZyb21Mb2coKTsKKworICAgICAgLy8gdmVyaWZ5IHRoYXQgcHJldmlvdXMgY2xvc2UgZGlkbid0IGRvIGEgY29tbWl0CisgICAgICAvLyByZWNvdmVyeSBzaG91bGQgYmUgYmxvY2tlZCBieSBvdXIgaG9vaworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiKjoqIikgLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTAiKTsKKworICAgICAgLy8gbWFrZSBzdXJlIHdlIGNhbiBzdGlsbCBhY2Nlc3MgdmVyc2lvbnMgYWZ0ZXIgYSByZXN0YXJ0CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrdmVyc2lvbnMuc2l6ZSgpKSwiL3ZlcnNpb25zPT0iICsgdmVyc2lvbnMpOworCisgICAgICAvLyB1bmJsb2NrIHJlY292ZXJ5CisgICAgICBsb2dSZXBsYXkucmVsZWFzZSgxMDAwKTsKKworICAgICAgLy8gbWFrZSBzdXJlIHdlIGNhbiBzdGlsbCBhY2Nlc3MgdmVyc2lvbnMgZHVyaW5nIHJlY292ZXJ5CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrdmVyc2lvbnMuc2l6ZSgpKSwiL3ZlcnNpb25zPT0iICsgdmVyc2lvbnMpOworCisgICAgICAvLyB3YWl0IHVudGlsIHJlY292ZXJ5IGhhcyBmaW5pc2hlZAorICAgICAgYXNzZXJ0VHJ1ZShsb2dSZXBsYXlGaW5pc2gudHJ5QWNxdWlyZSh0aW1lb3V0LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgIGFzc2VydEpRKHJlcSgicSIsIio6KiIpICwiL3Jlc3BvbnNlL251bUZvdW5kPT0zIik7CisKKyAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYW4gc3RpbGwgYWNjZXNzIHZlcnNpb25zIGFmdGVyIHJlY292ZXJ5CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrdmVyc2lvbnMuc2l6ZSgpKSAsIi92ZXJzaW9ucz09IiArIHZlcnNpb25zKTsKKworICAgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkEyIikpOworICAgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkEzIikpOworICAgICAgYXNzZXJ0VShkZWxJKCJBMiIpKTsKKyAgICAgIGFzc2VydFUoYWRvYygiaWQiLCJBNCIpKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiKjoqIikgLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTMiKTsKKworICAgICAgaC5jbG9zZSgpOworICAgICAgY3JlYXRlQ29yZSgpOworICAgICAgLy8gU29sciBzaG91bGQga2ljayB0aGlzIG9mZiBub3cKKyAgICAgIC8vIGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5yZWNvdmVyRnJvbUxvZygpOworCisgICAgICAvLyB3YWl0IHVudGlsIHJlY292ZXJ5IGhhcyBmaW5pc2hlZAorICAgICAgYXNzZXJ0VHJ1ZShsb2dSZXBsYXlGaW5pc2gudHJ5QWNxdWlyZSh0aW1lb3V0LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICBhc3NlcnRKUShyZXEoInEiLCIqOioiKSAsIi9yZXNwb25zZS9udW1Gb3VuZD09NSIpOworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiaWQ6QTIiKSAsIi9yZXNwb25zZS9udW1Gb3VuZD09MCIpOworCisgICAgICAvLyBubyB1cGRhdGVzLCBzbyBpbnN1cmUgdGhhdCByZWNvdmVyeSBkb2VzIG5vdCBydW4KKyAgICAgIGguY2xvc2UoKTsKKyAgICAgIGludCBwZXJtaXRzID0gbG9nUmVwbGF5LmF2YWlsYWJsZVBlcm1pdHMoKTsKKyAgICAgIGNyZWF0ZUNvcmUoKTsKKyAgICAgIC8vIFNvbHIgc2hvdWxkIGtpY2sgdGhpcyBvZmYgbm93CisgICAgICAvLyBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkucmVjb3ZlckZyb21Mb2coKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiKjoqIikgLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTUiKTsKKyAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgYXNzZXJ0RXF1YWxzKHBlcm1pdHMsIGxvZ1JlcGxheS5hdmFpbGFibGVQZXJtaXRzKCkpOyAvLyBubyB1cGRhdGVzLCBzbyBpbnN1cmUgdGhhdCByZWNvdmVyeSBkaWRuJ3QgcnVuCisKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQUNUSVZFLCBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0U3RhdGUoKSk7CisKKyAgICB9IGZpbmFsbHkgeworICAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IHRydWU7CisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlIb29rID0gbnVsbDsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBudWxsOworICAgIH0KKworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IGZhbHNlOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXkgPSBuZXcgU2VtYXBob3JlKDApOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXlGaW5pc2ggPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFzc2VydFRydWUobG9nUmVwbGF5LnRyeUFjcXVpcmUodGltZW91dCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbG9nUmVwbGF5RmluaXNoLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXIgPSByZXEuZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKTsKKyAgICBVcGRhdGVMb2cgdWxvZyA9IHVoYW5kbGVyLmdldFVwZGF0ZUxvZygpOworCisgICAgdHJ5IHsKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5CVUZGRVJJTkcsIHVsb2cuZ2V0U3RhdGUoKSk7CisgICAgICBGdXR1cmU8VXBkYXRlTG9nLlJlY292ZXJ5SW5mbz4gcmluZm9GdXR1cmUgPSB1bG9nLmFwcGx5QnVmZmVyZWRVcGRhdGVzKCk7CisgICAgICBhc3NlcnRUcnVlKHJpbmZvRnV0dXJlID09IG51bGwpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5BQ1RJVkUsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5CVUZGRVJJTkcsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIHVwZGF0ZXMgZnJvbSBhIGxlYWRlcgorICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQjEiLCAiX3ZlcnNpb25fIiwiMTAxMCIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJCMTEiLCAiX3ZlcnNpb25fIiwiMTAxNSIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25EZWxRKCJpZDpCMSBpZDpCMTEgaWQ6QjIgaWQ6QjMiKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSLCAiX3ZlcnNpb25fIiwiLTEwMTciKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJCMiIsICJfdmVyc2lvbl8iLCIxMDIwIikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkIzIiwgIl92ZXJzaW9uXyIsIjEwMzAiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgZGVsZXRlQW5kR2V0VmVyc2lvbigiQjEiLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIsICJfdmVyc2lvbl8iLCItMjAxMCIpKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCI2IikKKyAgICAgICAgICAsIj09eyd2ZXJzaW9ucyc6Wy0yMDEwLDEwMzAsMTAyMCwtMTAxNywxMDE1LDEwMTBdfSIKKyAgICAgICk7CisKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIjYiKQorICAgICAgICAgICwiPT17J3ZlcnNpb25zJzpbLTIwMTAsMTAzMCwxMDIwLC0xMDE3LDEwMTUsMTAxMF19IgorICAgICAgKTsKKworICAgICAgLy8gdXBkYXRlcyBzaG91bGQgYmUgYnVmZmVyZWQsIHNvIHdlIHNob3VsZCBub3Qgc2VlIGFueSByZXN1bHRzIHlldC4KKyAgICAgIGFzc2VydEpRKHJlcSgicSIsICIqOioiKQorICAgICAgICAgICwgIi9yZXNwb25zZS9udW1Gb3VuZD09MCIKKyAgICAgICk7CisKKyAgICAgIC8vIHJlYWwtdGltZSBnZXQgc2hvdWxkIGFsc28gbm90IHNob3cgYW55dGhpbmcgKHRoaXMgY291bGQgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgICAgICAvLyBidXQgaXQncyBjdXJyZW50bHkgdXNlZCBmb3IgdmFsaWRhdGluZyB2ZXJzaW9uIG51bWJlcnMgdG9vLCBzbyBpdCB3b3VsZAorICAgICAgLy8gYmUgYmFkIGZvciB1cGRhdGVzIHRvIGJlIHZpc2libGUgaWYgd2UncmUganVzdCBidWZmZXJpbmcuCisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJpZCIsIkIzIikKKyAgICAgICAgICAsIj09eydkb2MnOm51bGx9IgorICAgICAgKTsKKworCisgICAgICByaW5mb0Z1dHVyZSA9IHVsb2cuYXBwbHlCdWZmZXJlZFVwZGF0ZXMoKTsKKyAgICAgIGFzc2VydFRydWUocmluZm9GdXR1cmUgIT0gbnVsbCk7CisKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQVBQTFlJTkdfQlVGRkVSRUQsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIGxvZ1JlcGxheS5yZWxlYXNlKDEwMDApOworCisgICAgICBVcGRhdGVMb2cuUmVjb3ZlcnlJbmZvIHJpbmZvID0gcmluZm9GdXR1cmUuZ2V0KCk7CisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsKKworCisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIjYiKQorICAgICAgICAgICwiPT17J3ZlcnNpb25zJzpbLTIwMTAsMTAzMCwxMDIwLC0xMDE3LDEwMTUsMTAxMF19IgorICAgICAgKTsKKworCisgICAgICBhc3NlcnRKUShyZXEoInEiLCAiKjoqIikKKyAgICAgICAgICAsICIvcmVzcG9uc2UvbnVtRm91bmQ9PTIiCisgICAgICApOworCisgICAgICAvLyBtb3ZlIGJhY2sgdG8gcmVjb3ZlcmluZworICAgICAgdWxvZy5idWZmZXJVcGRhdGVzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkJVRkZFUklORywgdWxvZy5nZXRTdGF0ZSgpKTsKKworICAgICAgTG9uZyB2ZXIgPSBnZXRWZXIocmVxKCJxdCIsIi9nZXQiLCAiaWQiLCJCMyIpKTsKKyAgICAgIGFzc2VydEVxdWFscygxMDMwTCwgdmVyLmxvbmdWYWx1ZSgpKTsKKworICAgICAgLy8gYWRkIGEgcmVvcmRlcmVkIGRvYyB0aGF0IHNob3VsZG4ndCBvdmVyd3JpdGUgb25lIGluIHRoZSBpbmRleAorICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQjMiLCAiX3ZlcnNpb25fIiwiMyIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisKKyAgICAgIC8vIHJlb3JkZXIgdHdvIGJ1ZmZlcmVkIHVwZGF0ZXMKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkI0IiwgIl92ZXJzaW9uXyIsIjEwNDAiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgZGVsZXRlQW5kR2V0VmVyc2lvbigiQjQiLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIsICJfdmVyc2lvbl8iLCItOTQwIikpOyAgIC8vIHRoaXMgdXBkYXRlIHNob3VsZCBub3QgdGFrZSBhZmZlY3QKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkI2IiwgIl92ZXJzaW9uXyIsIjEwNjAiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQjUiLCAiX3ZlcnNpb25fIiwiMTA1MCIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJCOCIsICJfdmVyc2lvbl8iLCIxMDgwIikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKworICAgICAgLy8gdGVzdCB0aGF0IGRlbGV0ZSBieSBxdWVyeSBpcyBhdCBsZWFzdCBidWZmZXJlZCBhbG9uZyB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBzbyBpdCB3aWxsIGRlbGV0ZSB0aGUKKyAgICAgIC8vIGN1cnJlbnRseSBidWZmZXJlZCBpZDo4IChldmVuIGlmIGl0IGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgdmVyc2lvbmluZykKKyAgICAgIHVwZGF0ZUooIntcImRlbGV0ZVwiOiB7IFwicXVlcnlcIjpcImlkOkIyIE9SIGlkOkI4XCIgfX0iLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIsICJfdmVyc2lvbl8iLCItMzAwMCIpKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIxMyIpCisgICAgICAgICAgLCI9PXsndmVyc2lvbnMnOlstMzAwMCwxMDgwLDEwNTAsMTA2MCwtOTQwLDEwNDAsMywtMjAxMCwxMDMwLDEwMjAsLTEwMTcsMTAxNSwxMDEwXX0iICAvLyB0aGUgIjMiIGFwcGVhcnMgYmVjYXVzZSB2ZXJzaW9ucyBhcmVuJ3QgY2hlY2tlZCB3aGlsZSBidWZmZXJpbmcKKyAgICAgICk7CisKKyAgICAgIGxvZ1JlcGxheS5kcmFpblBlcm1pdHMoKTsKKyAgICAgIHJpbmZvRnV0dXJlID0gdWxvZy5hcHBseUJ1ZmZlcmVkVXBkYXRlcygpOworICAgICAgYXNzZXJ0VHJ1ZShyaW5mb0Z1dHVyZSAhPSBudWxsKTsKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQVBQTFlJTkdfQlVGRkVSRUQsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIC8vIGFwcGx5IGEgc2luZ2xlIHVwZGF0ZQorICAgICAgbG9nUmVwbGF5LnJlbGVhc2UoMSk7CisKKyAgICAgIC8vIG5vdyBhZGQgYW5vdGhlciB1cGRhdGUKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkI3IiwgIl92ZXJzaW9uXyIsIjEwNzAiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICAvLyBhIHJlb3JkZXJlZCB1cGRhdGUgdGhhdCBzaG91bGQgYmUgZHJvcHBlZAorICAgICAgZGVsZXRlQW5kR2V0VmVyc2lvbigiQjUiLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIsICJfdmVyc2lvbl8iLCItOTUwIikpOworCisgICAgICBkZWxldGVBbmRHZXRWZXJzaW9uKCJCNiIsIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUiwgIl92ZXJzaW9uXyIsIi0yMDYwIikpOworCisgICAgICBsb2dSZXBsYXkucmVsZWFzZSgxMDAwKTsKKyAgICAgIFVwZGF0ZUxvZy5SZWNvdmVyeUluZm8gcmVjSW5mbyA9IHJpbmZvRnV0dXJlLmdldCgpOworCisgICAgICBhc3NlcnRKUShyZXEoInEiLCAiKjoqIiwgInNvcnQiLCJpZCBhc2MiLCAiZmwiLCJpZCxfdmVyc2lvbl8iKQorICAgICAgICAgICwgIi9yZXNwb25zZS9kb2NzPT1bIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAieydpZCc6J0IzJywnX3ZlcnNpb25fJzoxMDMwfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIix7J2lkJzonQjQnLCdfdmVyc2lvbl8nOjEwNDB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLHsnaWQnOidCNScsJ192ZXJzaW9uXyc6MTA1MH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICIseydpZCc6J0I3JywnX3ZlcnNpb25fJzoxMDcwfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSIKKyAgICAgICk7CisKKyAgICAgIGFzc2VydEVxdWFscygxLCByZWNJbmZvLmRlbGV0ZUJ5UXVlcnkpOworCisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsgLy8gbGVhdmUgZWFjaCB0ZXN0IG1ldGhvZCBpbiBhIGdvb2Qgc3RhdGUKKyAgICB9IGZpbmFsbHkgeworICAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IHRydWU7CisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlIb29rID0gbnVsbDsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBudWxsOworCisgICAgICByZXEoKS5jbG9zZSgpOworICAgIH0KKworICB9CisKKworICBAVGVzdAorICBASWdub3JlKCJIREZTLTMxMDc6IG5vIHRydW5jYXRlIHN1cHBvcnQgeWV0IikKKyAgcHVibGljIHZvaWQgdGVzdERyb3BCdWZmZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IGZhbHNlOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXkgPSBuZXcgU2VtYXBob3JlKDApOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXlGaW5pc2ggPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFzc2VydFRydWUobG9nUmVwbGF5LnRyeUFjcXVpcmUodGltZW91dCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbG9nUmVwbGF5RmluaXNoLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXIgPSByZXEuZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKTsKKyAgICBVcGRhdGVMb2cgdWxvZyA9IHVoYW5kbGVyLmdldFVwZGF0ZUxvZygpOworCisgICAgdHJ5IHsKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5CVUZGRVJJTkcsIHVsb2cuZ2V0U3RhdGUoKSk7CisgICAgICBGdXR1cmU8VXBkYXRlTG9nLlJlY292ZXJ5SW5mbz4gcmluZm9GdXR1cmUgPSB1bG9nLmFwcGx5QnVmZmVyZWRVcGRhdGVzKCk7CisgICAgICBhc3NlcnRUcnVlKHJpbmZvRnV0dXJlID09IG51bGwpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5BQ1RJVkUsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgYXNzZXJ0RXF1YWxzKFVwZGF0ZUxvZy5TdGF0ZS5CVUZGRVJJTkcsIHVsb2cuZ2V0U3RhdGUoKSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIHVwZGF0ZXMgZnJvbSBhIGxlYWRlcgorICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzEiLCAiX3ZlcnNpb25fIiwiMTAxIikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkMyIiwgIl92ZXJzaW9uXyIsIjEwMiIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJDMyIsICJfdmVyc2lvbl8iLCIxMDMiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICBhc3NlcnRUcnVlKHVsb2cuZHJvcEJ1ZmZlcmVkVXBkYXRlcygpKTsKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwgIkM0IiwgIl92ZXJzaW9uXyIsIjEwNCIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCAiQzUiLCAiX3ZlcnNpb25fIiwiMTA1IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKworICAgICAgbG9nUmVwbGF5LnJlbGVhc2UoMTAwMCk7CisgICAgICByaW5mb0Z1dHVyZSA9IHVsb2cuYXBwbHlCdWZmZXJlZFVwZGF0ZXMoKTsKKyAgICAgIFVwZGF0ZUxvZy5SZWNvdmVyeUluZm8gcmluZm8gPSByaW5mb0Z1dHVyZS5nZXQoKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCByaW5mby5hZGRzKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIyIikKKyAgICAgICAgICAsIj09eyd2ZXJzaW9ucyc6WzEwNSwxMDRdfSIKKyAgICAgICk7CisKKyAgICAgIC8vIHRoaXMgdGltZSBhZGQgc29tZSBkb2NzIGZpcnN0IGJlZm9yZSBidWZmZXJpbmcgc3RhcnRzIChzbyB0bG9nIHdvbid0IGJlIGF0IHBvcyAwKQorICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzEwMCIsICJfdmVyc2lvbl8iLCIyMDAiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzEwMSIsICJfdmVyc2lvbl8iLCIyMDEiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICB1bG9nLmJ1ZmZlclVwZGF0ZXMoKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkMxMDMiLCAiX3ZlcnNpb25fIiwiMjAzIikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkMxMDQiLCAiX3ZlcnNpb25fIiwiMjA0IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKworICAgICAgYXNzZXJ0VHJ1ZSh1bG9nLmRyb3BCdWZmZXJlZFVwZGF0ZXMoKSk7CisgICAgICB1bG9nLmJ1ZmZlclVwZGF0ZXMoKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkMxMDUiLCAiX3ZlcnNpb25fIiwiMjA1IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkMxMDYiLCAiX3ZlcnNpb25fIiwiMjA2IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKworICAgICAgcmluZm9GdXR1cmUgPSB1bG9nLmFwcGx5QnVmZmVyZWRVcGRhdGVzKCk7CisgICAgICByaW5mbyA9IHJpbmZvRnV0dXJlLmdldCgpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJpbmZvLmFkZHMpOworCisgICAgICBhc3NlcnRKUShyZXEoInEiLCAiKjoqIiwgInNvcnQiLCJfdmVyc2lvbl8gYXNjIiwgImZsIiwiaWQsX3ZlcnNpb25fIikKKyAgICAgICAgICAsICIvcmVzcG9uc2UvZG9jcz09WyIKKyAgICAgICAgICArICJ7J2lkJzonQzQnLCdfdmVyc2lvbl8nOjEwNH0iCisgICAgICAgICAgKyAiLHsnaWQnOidDNScsJ192ZXJzaW9uXyc6MTA1fSIKKyAgICAgICAgICArICIseydpZCc6J0MxMDAnLCdfdmVyc2lvbl8nOjIwMH0iCisgICAgICAgICAgKyAiLHsnaWQnOidDMTAxJywnX3ZlcnNpb25fJzoyMDF9IgorICAgICAgICAgICsgIix7J2lkJzonQzEwNScsJ192ZXJzaW9uXyc6MjA1fSIKKyAgICAgICAgICArICIseydpZCc6J0MxMDYnLCdfdmVyc2lvbl8nOjIwNn0iCisgICAgICAgICAgKyJdIgorICAgICAgKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCI2IikKKyAgICAgICAgICAsIj09eyd2ZXJzaW9ucyc6WzIwNiwyMDUsMjAxLDIwMCwxMDUsMTA0XX0iCisgICAgICApOworCisgICAgICB1bG9nLmJ1ZmZlclVwZGF0ZXMoKTsKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQlVGRkVSSU5HLCB1bG9nLmdldFN0YXRlKCkpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzMwMSIsICJfdmVyc2lvbl8iLCI5OTgiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzMwMiIsICJfdmVyc2lvbl8iLCI5OTkiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgYXNzZXJ0VHJ1ZSh1bG9nLmRyb3BCdWZmZXJlZFVwZGF0ZXMoKSk7CisKKyAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjYW4gb3ZlcndyaXRlIHdpdGggYSBsb3dlciB2ZXJzaW9uCisgICAgICAvLyBUT0RPOiBpcyB0aGlzIGZ1bmN0aW9uYWxpdHkgbmVlZGVkPworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzMwMSIsICJfdmVyc2lvbl8iLCIzMDEiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiQzMwMiIsICJfdmVyc2lvbl8iLCIzMDIiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIyIikKKyAgICAgICAgICAsIj09eyd2ZXJzaW9ucyc6WzMwMiwzMDFdfSIKKyAgICAgICk7CisKKyAgICAgIGFzc2VydEpRKHJlcSgicSIsICIqOioiLCAic29ydCIsIl92ZXJzaW9uXyBkZXNjIiwgImZsIiwiaWQsX3ZlcnNpb25fIiwgInJvd3MiLCIyIikKKyAgICAgICAgICAsICIvcmVzcG9uc2UvZG9jcz09WyIKKyAgICAgICAgICArICJ7J2lkJzonQzMwMicsJ192ZXJzaW9uXyc6MzAyfSIKKyAgICAgICAgICArICIseydpZCc6J0MzMDEnLCdfdmVyc2lvbl8nOjMwMX0iCisgICAgICAgICAgKyJdIgorICAgICAgKTsKKworCisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJDMiIsICJfdmVyc2lvbl8iLCIzMDIiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisKKworCisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsgLy8gbGVhdmUgZWFjaCB0ZXN0IG1ldGhvZCBpbiBhIGdvb2Qgc3RhdGUKKyAgICB9IGZpbmFsbHkgeworICAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IHRydWU7CisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlIb29rID0gbnVsbDsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBudWxsOworCisgICAgICByZXEoKS5jbG9zZSgpOworICAgIH0KKworICB9CisKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nRmxhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSBmYWxzZTsKKyAgICBmaW5hbCBTZW1hcGhvcmUgbG9nUmVwbGF5RmluaXNoID0gbmV3IFNlbWFwaG9yZSgwKTsKKworICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbG9nUmVwbGF5RmluaXNoLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXIgPSByZXEuZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKTsKKyAgICBVcGRhdGVMb2cgdWxvZyA9IHVoYW5kbGVyLmdldFVwZGF0ZUxvZygpOworCisgICAgdHJ5IHsKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRFcXVhbHMoVXBkYXRlTG9nLlN0YXRlLkFDVElWRSwgdWxvZy5nZXRTdGF0ZSgpKTsKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworCisgICAgICAvLyBzaW11bGF0ZSB1cGRhdGVzIGZyb20gYSBsZWFkZXIKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIlExIiwgIl92ZXJzaW9uXyIsIjEwMSIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJRMiIsICJfdmVyc2lvbl8iLCIxMDIiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiUTMiLCAiX3ZlcnNpb25fIiwiMTAzIikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQlVGRkVSSU5HLCB1bG9nLmdldFN0YXRlKCkpOworCisgICAgICByZXEuY2xvc2UoKTsKKyAgICAgIGguY2xvc2UoKTsKKyAgICAgIGNyZWF0ZUNvcmUoKTsKKworICAgICAgcmVxID0gcmVxKCk7CisgICAgICB1aGFuZGxlciA9IHJlcS5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpOworICAgICAgdWxvZyA9IHVoYW5kbGVyLmdldFVwZGF0ZUxvZygpOworCisgICAgICBsb2dSZXBsYXlGaW5pc2guYWNxdWlyZSgpOyAgLy8gd2FpdCBmb3IgcmVwbGF5IHRvIGZpbmlzaAorCisgICAgICBhc3NlcnRUcnVlKCh1bG9nLmdldFN0YXJ0aW5nT3BlcmF0aW9uKCkgJiBVcGRhdGVMb2cuRkxBR19HQVApICE9IDApOyAgIC8vIHNpbmNlIHdlIGRpZWQgd2hpbGUgYnVmZmVyaW5nLCB3ZSBzaG91bGQgc2VlIHRoaXMgbGFzdAorCisgICAgICAvLworICAgICAgLy8gVHJ5IGFnYWluIHRvIGVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cyBsb2cgcmVwbGF5IGRpZG4ndCB3aXBlIG91dCBvdXIgZmxhZ3MKKyAgICAgIC8vCisKKyAgICAgIHJlcS5jbG9zZSgpOworICAgICAgaC5jbG9zZSgpOworICAgICAgY3JlYXRlQ29yZSgpOworCisgICAgICByZXEgPSByZXEoKTsKKyAgICAgIHVoYW5kbGVyID0gcmVxLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCk7CisgICAgICB1bG9nID0gdWhhbmRsZXIuZ2V0VXBkYXRlTG9nKCk7CisKKyAgICAgIGFzc2VydFRydWUoKHVsb2cuZ2V0U3RhcnRpbmdPcGVyYXRpb24oKSAmIFVwZGF0ZUxvZy5GTEFHX0dBUCkgIT0gMCk7CisKKyAgICAgIC8vIG5vdyBkbyBzb21lIG5vcm1hbCBub24tYnVmZmVyZWQgYWRkcworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiUTQiLCAiX3ZlcnNpb25fIiwiMTE0IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIlE1IiwgIl92ZXJzaW9uXyIsIjExNSIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJRNiIsICJfdmVyc2lvbl8iLCIxMTYiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworICAgICAgYXNzZXJ0VShjb21taXQoKSk7CisKKyAgICAgIHJlcS5jbG9zZSgpOworICAgICAgaC5jbG9zZSgpOworICAgICAgY3JlYXRlQ29yZSgpOworCisgICAgICByZXEgPSByZXEoKTsKKyAgICAgIHVoYW5kbGVyID0gcmVxLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCk7CisgICAgICB1bG9nID0gdWhhbmRsZXIuZ2V0VXBkYXRlTG9nKCk7CisKKyAgICAgIGFzc2VydFRydWUoKHVsb2cuZ2V0U3RhcnRpbmdPcGVyYXRpb24oKSAmIFVwZGF0ZUxvZy5GTEFHX0dBUCkgPT0gMCk7CisKKyAgICAgIHVsb2cuYnVmZmVyVXBkYXRlcygpOworICAgICAgLy8gc2ltdWxhdGUgcmVjZWl2aW5nIG5vIHVwZGF0ZXMKKyAgICAgIHVsb2cuYXBwbHlCdWZmZXJlZFVwZGF0ZXMoKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIlE3IiwgIl92ZXJzaW9uXyIsIjExNyIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7IC8vIGRvIGFub3RoZXIgYWRkIHRvIG1ha2Ugc3VyZSBmbGFncyBhcmUgYmFjayB0byBub3JtYWwKKworICAgICAgcmVxLmNsb3NlKCk7CisgICAgICBoLmNsb3NlKCk7CisgICAgICBjcmVhdGVDb3JlKCk7CisKKyAgICAgIHJlcSA9IHJlcSgpOworICAgICAgdWhhbmRsZXIgPSByZXEuZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKTsKKyAgICAgIHVsb2cgPSB1aGFuZGxlci5nZXRVcGRhdGVMb2coKTsKKworICAgICAgYXNzZXJ0VHJ1ZSgodWxvZy5nZXRTdGFydGluZ09wZXJhdGlvbigpICYgVXBkYXRlTG9nLkZMQUdfR0FQKSA9PSAwKTsgLy8gY2hlY2sgZmxhZ3Mgb24gUTcKKworICAgICAgbG9nUmVwbGF5RmluaXNoLmFjcXVpcmUoKTsKKyAgICAgIGFzc2VydEVxdWFscyhVcGRhdGVMb2cuU3RhdGUuQUNUSVZFLCB1bG9nLmdldFN0YXRlKCkpOyAvLyBsZWF2ZSBlYWNoIHRlc3QgbWV0aG9kIGluIGEgZ29vZCBzdGF0ZQorICAgIH0gZmluYWxseSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gdHJ1ZTsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUhvb2sgPSBudWxsOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG51bGw7CisKKyAgICAgIHJlcSgpLmNsb3NlKCk7CisgICAgfQorCisgIH0KKworCisKKyAgLy8gbWFrZSBzdXJlIHRoYXQgb24gYSByZXN0YXJ0LCB2ZXJzaW9ucyBkb24ndCBzdGFydCB0b28gbG93CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uc09uUmVzdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGNsZWFySW5kZXgoKTsKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKworICAgIGFzc2VydFUoYWRvYygiaWQiLCJEMSIsICJ2YWxfaSIsIjEiKSk7CisgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkQyIiwgInZhbF9pIiwiMSIpKTsKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBsb25nIHYxID0gZ2V0VmVyKHJlcSgicSIsImlkOkQxIikpOworICAgIGxvbmcgdjFhID0gZ2V0VmVyKHJlcSgicSIsImlkOkQyIikpOworCisgICAgaC5jbG9zZSgpOworICAgIGNyZWF0ZUNvcmUoKTsKKworICAgIGFzc2VydFUoYWRvYygiaWQiLCJEMSIsICJ2YWxfaSIsIjIiKSk7CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgbG9uZyB2MiA9IGdldFZlcihyZXEoInEiLCJpZDpEMSIpKTsKKworICAgIGFzc2VydCh2MiA+IHYxKTsKKworICAgIGFzc2VydEpRKHJlcSgicXQiLCIvZ2V0IiwgImdldFZlcnNpb25zIiwiMiIpCisgICAgICAgICwiL3ZlcnNpb25zPT1bIiArIHYyICsgIiwiICsgdjFhICsgIl0iCisgICAgKTsKKworICB9CisKKyAgLy8gbWFrZSBzdXJlIHRoYXQgbG9nIGlzbid0IG5lZWRsZXNzbHkgcmVwbGF5ZWQgYWZ0ZXIgYSBjbGVhbiBzaHV0ZG93bgorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TaHV0ZG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSB0cnVlOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXkgPSBuZXcgU2VtYXBob3JlKDApOworICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXlGaW5pc2ggPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFzc2VydFRydWUobG9nUmVwbGF5LnRyeUFjcXVpcmUodGltZW91dCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUZpbmlzaEhvb2sgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbG9nUmVwbGF5RmluaXNoLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICBTb2xyUXVlcnlSZXF1ZXN0IHJlcSA9IHJlcSgpOworICAgIFVwZGF0ZUhhbmRsZXIgdWhhbmRsZXIgPSByZXEuZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKTsKKyAgICBVcGRhdGVMb2cgdWxvZyA9IHVoYW5kbGVyLmdldFVwZGF0ZUxvZygpOworCisgICAgdHJ5IHsKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRTEiLCAidmFsX2kiLCIxIikpOworICAgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkUyIiwgInZhbF9pIiwiMSIpKTsKKworICAgICAgLy8gc2V0IHRvIGEgaGlnaCBlbm91Z2ggbnVtYmVyIHNvIHRoaXMgdGVzdCB3b24ndCBoYW5nIG9uIGEgYnVnCisgICAgICBsb2dSZXBsYXkucmVsZWFzZSgxMCk7CisKKyAgICAgIGguY2xvc2UoKTsKKyAgICAgIGNyZWF0ZUNvcmUoKTsKKworICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkb2NzIGdvdCBjb21taXR0ZWQKKyAgICAgIGFzc2VydEpRKHJlcSgicSIsIio6KiIpLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTIiKTsKKworICAgICAgLy8gbWFrZSBzdXJlIG5vIHJlcGxheSBoYXBwZW5lZAorICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBsb2dSZXBsYXkuYXZhaWxhYmxlUGVybWl0cygpKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gdHJ1ZTsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUhvb2sgPSBudWxsOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG51bGw7CisKKyAgICAgIHJlcSgpLmNsb3NlKCk7CisgICAgfQorICB9CisgIAorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZERvY3MoaW50IG5Eb2NzLCBpbnQgc3RhcnQsIExpbmtlZExpc3Q8TG9uZz4gdmVyc2lvbnMpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IGk9MDsgaTxuRG9jczsgaSsrKSB7CisgICAgICB2ZXJzaW9ucy5hZGRGaXJzdCggYWRkQW5kR2V0VmVyc2lvbiggc2RvYygiaWQiLEludGVnZXIudG9TdHJpbmcoc3RhcnQgKyBuRG9jcykpICwgbnVsbCkgKTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2xkTG9ncygpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gZmFsc2U7CisgICAgICBmaW5hbCBTZW1hcGhvcmUgbG9nUmVwbGF5ID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXlGaW5pc2ggPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlIb29rID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvZ1JlcGxheS50cnlBY3F1aXJlKHRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworCisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlGaW5pc2hIb29rID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIGxvZ1JlcGxheUZpbmlzaC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgIH07CisKKworICAgICAgY2xlYXJJbmRleCgpOworICAgICAgYXNzZXJ0VShjb21taXQoKSk7CisKKyAgICAgIFN0cmluZyBsb2dEaXIgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisgCisgICAgICAKKyAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICBjb25mLnNldEJvb2xlYW4oImZzLmhkZnMuaW1wbC5kaXNhYmxlLmNhY2hlIiwgdHJ1ZSk7CisgICAgICBGaWxlU3lzdGVtIGZzOworICAgICAgdHJ5IHsKKyAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaGRmc1VyaSk7CisgICAgICAgIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZSh1cmksIGNvbmYpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgICAgCisgICAgICBoLmNsb3NlKCk7CisKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gSGRmc1VwZGF0ZUxvZy5nZXRMb2dMaXN0KGZzLCBuZXcgUGF0aChsb2dEaXIpKTsKKyAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICBmcy5kZWxldGUobmV3IFBhdGgobG9nRGlyLCBmaWxlKSwgZmFsc2UpOworICAgICAgfQorCisgICAgICBhc3NlcnRFcXVhbHMoMCwgSGRmc1VwZGF0ZUxvZy5nZXRMb2dMaXN0KGZzLCBuZXcgUGF0aChsb2dEaXIpKS5sZW5ndGgpOworCisgICAgICBjcmVhdGVDb3JlKCk7CisKKyAgICAgIGludCBzdGFydCA9IDA7CisgICAgICBpbnQgbWF4UmVxID0gNTA7CisKKyAgICAgIExpbmtlZExpc3Q8TG9uZz4gdmVyc2lvbnMgPSBuZXcgTGlua2VkTGlzdDxMb25nPigpOworICAgICAgYWRkRG9jcygxMCwgc3RhcnQsIHZlcnNpb25zKTsgc3RhcnQrPTEwOworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK21heFJlcSksICIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucy5zdWJMaXN0KDAsTWF0aC5taW4obWF4UmVxLHN0YXJ0KSkpOworICAgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CisKKyAgICAgIGFkZERvY3MoMTAsIHN0YXJ0LCB2ZXJzaW9ucyk7ICBzdGFydCs9MTA7CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CisgICAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICAgIGFzc2VydEpRKHJlcSgicXQiLCIvZ2V0IiwgImdldFZlcnNpb25zIiwiIittYXhSZXEpLCAiL3ZlcnNpb25zPT0iICsgdmVyc2lvbnMuc3ViTGlzdCgwLE1hdGgubWluKG1heFJlcSxzdGFydCkpKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKDIsIEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSkubGVuZ3RoKTsKKworICAgICAgYWRkRG9jcygxMDUsIHN0YXJ0LCB2ZXJzaW9ucyk7ICBzdGFydCs9MTA1OworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK21heFJlcSksICIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucy5zdWJMaXN0KDAsTWF0aC5taW4obWF4UmVxLHN0YXJ0KSkpOworICAgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CisKKyAgICAgIC8vIHByZXZpb3VzIHR3byBsb2dzIHNob3VsZCBiZSBnb25lIG5vdworICAgICAgYXNzZXJ0RXF1YWxzKDEsIEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSkubGVuZ3RoKTsKKworICAgICAgYWRkRG9jcygxLCBzdGFydCwgdmVyc2lvbnMpOyAgc3RhcnQrPTE7CisgICAgICBoLmNsb3NlKCk7CisgICAgICBjcmVhdGVDb3JlKCk7ICAgICAgLy8gdHJpZ2dlciByZWNvdmVyeSwgbWFrZSBzdXJlIHRoYXQgdGxvZyByZWZlcmVuY2UgaGFuZGxpbmcgaXMgY29ycmVjdAorCisgICAgICAvLyB0ZXN0IHdlIGNhbiBnZXQgdmVyc2lvbnMgd2hpbGUgcmVwbGF5IGlzIGhhcHBlbmluZworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK21heFJlcSksICIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucy5zdWJMaXN0KDAsTWF0aC5taW4obWF4UmVxLHN0YXJ0KSkpOworCisgICAgICBsb2dSZXBsYXkucmVsZWFzZSgxMDAwKTsKKyAgICAgIGFzc2VydFRydWUobG9nUmVwbGF5RmluaXNoLnRyeUFjcXVpcmUodGltZW91dCwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIiIrbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCxNYXRoLm1pbihtYXhSZXEsc3RhcnQpKSk7CisKKyAgICAgIGFkZERvY3MoMTA1LCBzdGFydCwgdmVyc2lvbnMpOyAgc3RhcnQrPTEwNTsKKyAgICAgIGFzc2VydEpRKHJlcSgicXQiLCIvZ2V0IiwgImdldFZlcnNpb25zIiwiIittYXhSZXEpLCAiL3ZlcnNpb25zPT0iICsgdmVyc2lvbnMuc3ViTGlzdCgwLE1hdGgubWluKG1heFJlcSxzdGFydCkpKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIiK21heFJlcSksICIvdmVyc2lvbnM9PSIgKyB2ZXJzaW9ucy5zdWJMaXN0KDAsTWF0aC5taW4obWF4UmVxLHN0YXJ0KSkpOworCisgICAgICAvLyBwcmV2aW91cyBsb2dzIHNob3VsZCBiZSBnb25lIG5vdworICAgICAgYXNzZXJ0RXF1YWxzKDEsIEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSkubGVuZ3RoKTsKKworICAgICAgLy8KKyAgICAgIC8vIHRlc3QgdGhhdCBhIGNvcnJ1cHQgdGxvZyBmaWxlIGRvZXNuJ3Qgc3RvcCB1cyBmcm9tIGNvbWluZyB1cCwgb3Igc2VlaW5nIHZlcnNpb25zIGJlZm9yZSB0aGF0IHRsb2cgZmlsZS4KKyAgICAgIC8vCisgICAgICBhZGREb2NzKDEsIHN0YXJ0LCBuZXcgTGlua2VkTGlzdDxMb25nPigpKTsgLy8gZG9uJ3QgYWRkIHRoaXMgdG8gdGhlIHZlcnNpb25zIGxpc3QgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gbG9zZSBpdC4uLgorICAgICAgaC5jbG9zZSgpOworICAgICAgZmlsZXMgPSBIZGZzVXBkYXRlTG9nLmdldExvZ0xpc3QoZnMsIG5ldyBQYXRoKGxvZ0RpcikpOzsKKyAgICAgIEFycmF5cy5zb3J0KGZpbGVzKTsKKworICAgICAgRlNEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IGZzLmNyZWF0ZShuZXcgUGF0aChuZXcgUGF0aChsb2dEaXIpLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pLCAoc2hvcnQpMSk7CisgICAgICBkb3Mud3JpdGVVVEYoIlRoaXMgaXMgYSB0cmFzaGVkIGxvZyBmaWxlIHRoYXQgcmVhbGx5IHNob3VsZG4ndCB3b3JrIGF0IGFsbCwgYnV0IHdlJ2xsIHNlZS4uIik7CisgICAgICBkb3MuY2xvc2UoKTsKKworICAgICAgaWdub3JlRXhjZXB0aW9uKCJGYWlsdXJlIHRvIG9wZW4gZXhpc3RpbmciKTsKKyAgICAgIGNyZWF0ZUNvcmUoKTsKKyAgICAgIC8vIHdlIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgbGlzdCBvZiB2ZXJzaW9ucyAobm90IGluY2x1ZGluZyB0aGUgdHJhc2hlZCBsb2cgZmlsZSkKKyAgICAgIGFzc2VydEpRKHJlcSgicXQiLCAiL2dldCIsICJnZXRWZXJzaW9ucyIsICIiICsgbWF4UmVxKSwgIi92ZXJzaW9ucz09IiArIHZlcnNpb25zLnN1Ykxpc3QoMCwgTWF0aC5taW4obWF4UmVxLCBzdGFydCkpKTsKKyAgICAgIHJlc2V0RXhjZXB0aW9uSWdub3JlcygpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSB0cnVlOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG51bGw7CisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlGaW5pc2hIb29rID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvLworICAvLyB0ZXN0IHRoYXQgYSBwYXJ0aWFsbHkgd3JpdHRlbiBsYXN0IHRsb2cgZW50cnkgKHRoYXQgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IgYm90aCByZXZlcnNlIHJlYWRpbmcgYW5kIGZvcgorICAvLyBsb2cgcmVwbGF5KSBkb2Vzbid0IHN0b3AgdXMgZnJvbSBjb21pbmcgdXAsIGFuZCBmcm9tIHJlY292ZXJpbmcgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgbm90IGN1dCBvZmYuCisgIC8vCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlZExvZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gZmFsc2U7CisgICAgICBmaW5hbCBTZW1hcGhvcmUgbG9nUmVwbGF5ID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICAgIGZpbmFsIFNlbWFwaG9yZSBsb2dSZXBsYXlGaW5pc2ggPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlIb29rID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvZ1JlcGxheS50cnlBY3F1aXJlKHRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworCisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlGaW5pc2hIb29rID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIGxvZ1JlcGxheUZpbmlzaC5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIFN0cmluZyBsb2dEaXIgPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRjEiKSk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRjIiKSk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRjMiKSk7CisKKyAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICBjb25mLnNldEJvb2xlYW4oImZzLmhkZnMuaW1wbC5kaXNhYmxlLmNhY2hlIiwgdHJ1ZSk7CisgICAgICBGaWxlU3lzdGVtIGZzOworICAgICAgdHJ5IHsKKyAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaGRmc1VyaSk7CisgICAgICAgIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZSh1cmksIGNvbmYpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgICAgCisgICAgICBoLmNsb3NlKCk7CisgICAgICAKKworICAgICAgCisgICAgICBTdHJpbmdbXSBmaWxlcyA9IEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSk7CisgICAgICBBcnJheXMuc29ydChmaWxlcyk7CisKKyAgICAgIEZTRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBmcy5hcHBlbmQobmV3IFBhdGgobG9nRGlyLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pKTsKKyAgICAKKyAgICAgIGRvcy53cml0ZUxvbmcoMHhmZmZmZmZmZmZmZmZmZmZmTCk7CisgICAgICBkb3Mud3JpdGVDaGFycygiVGhpcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYSBnb29kIGxvZyBmaWxlLCByZXByZXNlbnRpbmcgYSBiYWQgcGFydGlhbGx5IHdyaXR0ZW4gcmVjb3JkLiIpOworICAgICAgZG9zLmNsb3NlKCk7CisKKyAgICAgIGxvZ1JlcGxheS5yZWxlYXNlKDEwMDApOworICAgICAgbG9nUmVwbGF5RmluaXNoLmRyYWluUGVybWl0cygpOworICAgICAgaWdub3JlRXhjZXB0aW9uKCJPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOyAgLy8gdGhpcyBpcyB3aGF0IHRoZSBjb3JydXB0ZWQgbG9nIGN1cnJlbnRseSBwcm9kdWNlcy4uLiBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgICAgIGNyZWF0ZUNvcmUoKTsKKyAgICAgIGFzc2VydFRydWUobG9nUmVwbGF5RmluaXNoLnRyeUFjcXVpcmUodGltZW91dCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgcmVzZXRFeGNlcHRpb25JZ25vcmVzKCk7CisgICAgICBhc3NlcnRKUShyZXEoInEiLCIqOioiKSAsIi9yZXNwb25zZS9udW1Gb3VuZD09MyIpOworCisgICAgICAvLworICAgICAgLy8gTm93IHRlc3QgdGhhdCB0aGUgYmFkIGxvZyBmaWxlIGRvZXNuJ3QgbWVzcyB1cCByZXRyaWV2aW5nIGxhdGVzdCB2ZXJzaW9ucworICAgICAgLy8KKworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiRjQiLCAiX3ZlcnNpb25fIiwiMTA0IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkY1IiwgIl92ZXJzaW9uXyIsIjEwNSIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJGNiIsICJfdmVyc2lvbl8iLCIxMDYiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICAvLyBUaGlzIGN1cnJlbnRseSBza2lwcyB0aGUgYmFkIGxvZyBmaWxlIGFuZCBhbHNvIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGNsZWFySW5kZXggKGRlbCAqOiopCisgICAgICAvLyBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIjYiKSwgIi92ZXJzaW9ucz09WzEwNiwxMDUsMTA0XSIpOworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIzIiksICIvdmVyc2lvbnM9PVsxMDYsMTA1LDEwNF0iKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gdHJ1ZTsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUhvb2sgPSBudWxsOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG51bGw7CisgICAgfQorICB9CisKKworICAvLworICAvLyB0ZXN0IHRoYXQgYSBjb3JydXB0IHRsb2cgZG9lc24ndCBzdG9wIHVzIGZyb20gY29taW5nIHVwCisgIC8vCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDb3JydXB0TG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSBmYWxzZTsKKworICAgICAgU3RyaW5nIGxvZ0RpciA9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5nZXRMb2dEaXIoKTsKKyAKKyAgICAgIGNsZWFySW5kZXgoKTsKKyAgICAgIGFzc2VydFUoY29tbWl0KCkpOworCisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRzEiKSk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRzIiKSk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiRzMiKSk7CisKKyAgICAgIGguY2xvc2UoKTsKKyAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICBjb25mLnNldEJvb2xlYW4oImZzLmhkZnMuaW1wbC5kaXNhYmxlLmNhY2hlIiwgdHJ1ZSk7CisgICAgICBGaWxlU3lzdGVtIGZzOworICAgICAgdHJ5IHsKKyAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaGRmc1VyaSk7CisgICAgICAgIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZSh1cmksIGNvbmYpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfQorCisgICAgICBTdHJpbmdbXSBmaWxlcyA9IEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSk7CisgICAgICBBcnJheXMuc29ydChmaWxlcyk7CisKKyAgICAgIEZTRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBmcy5jcmVhdGUobmV3IFBhdGgobG9nRGlyLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pLCAoc2hvcnQpMSk7CisgICAgICBkb3Mud3JpdGUobmV3IGJ5dGVbKGludCk4MDBdKTsgIC8vIHplcm8gb3V0IGZpbGUKKyAgICAgIGRvcy5jbG9zZSgpOworCisKKyAgICAgIGlnbm9yZUV4Y2VwdGlvbigiRmFpbHVyZSB0byBvcGVuIGV4aXN0aW5nIGxvZyBmaWxlIik7ICAvLyB0aGlzIGlzIHdoYXQgdGhlIGNvcnJ1cHRlZCBsb2cgY3VycmVudGx5IHByb2R1Y2VzLi4uIHN1YmplY3QgdG8gY2hhbmdlLgorICAgICAgY3JlYXRlQ29yZSgpOworICAgICAgcmVzZXRFeGNlcHRpb25JZ25vcmVzKCk7CisKKyAgICAgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IHJlc3BvbmRzCisgICAgICBhc3NlcnRKUShyZXEoInEiLCIqOioiKSAsIi9yZXNwb25zZS9udW1Gb3VuZD09MCIpOworCisgICAgICAvLworICAgICAgLy8gTm93IHRlc3QgdGhhdCB0aGUgYmFkIGxvZyBmaWxlIGRvZXNuJ3QgbWVzcyB1cCByZXRyaWV2aW5nIGxhdGVzdCB2ZXJzaW9ucworICAgICAgLy8KKworICAgICAgdXBkYXRlSihqc29uQWRkKHNkb2MoImlkIiwiRzQiLCAiX3ZlcnNpb25fIiwiMTA0IikpLCBwYXJhbXMoRElTVFJJQl9VUERBVEVfUEFSQU0sRlJPTV9MRUFERVIpKTsKKyAgICAgIHVwZGF0ZUooanNvbkFkZChzZG9jKCJpZCIsIkc1IiwgIl92ZXJzaW9uXyIsIjEwNSIpKSwgcGFyYW1zKERJU1RSSUJfVVBEQVRFX1BBUkFNLEZST01fTEVBREVSKSk7CisgICAgICB1cGRhdGVKKGpzb25BZGQoc2RvYygiaWQiLCJHNiIsICJfdmVyc2lvbl8iLCIxMDYiKSksIHBhcmFtcyhESVNUUklCX1VQREFURV9QQVJBTSxGUk9NX0xFQURFUikpOworCisgICAgICAvLyBUaGlzIGN1cnJlbnRseSBza2lwcyB0aGUgYmFkIGxvZyBmaWxlIGFuZCBhbHNvIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGNsZWFySW5kZXggKGRlbCAqOiopCisgICAgICAvLyBhc3NlcnRKUShyZXEoInF0IiwiL2dldCIsICJnZXRWZXJzaW9ucyIsIjYiKSwgIi92ZXJzaW9ucz09WzEwNiwxMDUsMTA0XSIpOworICAgICAgYXNzZXJ0SlEocmVxKCJxdCIsIi9nZXQiLCAiZ2V0VmVyc2lvbnMiLCIzIiksICIvdmVyc2lvbnM9PVsxMDYsMTA1LDEwNF0iKTsKKworICAgICAgYXNzZXJ0VShjb21taXQoKSk7CisKKyAgICAgIGFzc2VydEpRKHJlcSgicSIsIio6KiIpICwiL3Jlc3BvbnNlL251bUZvdW5kPT0zIik7CisKKyAgICAgIC8vIFRoaXMgbWVzc2VzIHVwIHNvbWUgb3RoZXIgdGVzdHMgKG9uIHdpbmRvd3MpIGlmIHdlIGRvbid0IHJlbW92ZSB0aGUgYmFkIGxvZy4KKyAgICAgIC8vIFRoaXMgKnNob3VsZCogaG9wZWZ1bGx5IGp1c3QgYmUgYmVjYXVzZSB0aGUgdGVzdHMgYXJlIHRvbyBmcmFnaWxlIGFuZCBub3QgYmVjYXVzZSBvZiByZWFsIGJ1Z3MgLSBidXQgaXQgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBmdXJ0aGVyLgorICAgICAgZGVsZXRlTG9ncygpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIERpcmVjdFVwZGF0ZUhhbmRsZXIyLmNvbW1pdE9uQ2xvc2UgPSB0cnVlOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG51bGw7CisgICAgICBVcGRhdGVMb2cudGVzdGluZ19sb2dSZXBsYXlGaW5pc2hIb29rID0gbnVsbDsKKyAgICB9CisgIH0KKworCisKKyAgLy8gaW4gcmFyZSBjaXJjdW1zdGFuY2VzLCB0d28gbG9ncyBjYW4gYmUgbGVmdCB1bmNhcHBlZCAobGFja2luZyBhIGNvbW1pdCBhdCB0aGUgZW5kIHNpZ25pZnlpbmcgdGhhdCBhbGwgdGhlIGNvbnRlbnQgaW4gdGhlIGxvZyB3YXMgY29tbWl0dGVkKQorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3ZlcnlNdWx0aXBsZUxvZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgRGlyZWN0VXBkYXRlSGFuZGxlcjIuY29tbWl0T25DbG9zZSA9IGZhbHNlOworICAgICAgZmluYWwgU2VtYXBob3JlIGxvZ1JlcGxheSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgICBmaW5hbCBTZW1hcGhvcmUgbG9nUmVwbGF5RmluaXNoID0gbmV3IFNlbWFwaG9yZSgwKTsKKworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5SG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb2dSZXBsYXkudHJ5QWNxdWlyZSh0aW1lb3V0LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBsb2dSZXBsYXlGaW5pc2gucmVsZWFzZSgpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICBTdHJpbmcgbG9nRGlyID0gaC5nZXRDb3JlKCkuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpLmdldExvZ0RpcigpOworICAgICAgQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgIGNvbmYuc2V0Qm9vbGVhbigiZnMuaGRmcy5pbXBsLmRpc2FibGUuY2FjaGUiLCB0cnVlKTsKKyAgICAgIEZpbGVTeXN0ZW0gZnM7CisgICAgICB0cnkgeworICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShoZGZzVXJpKTsKKyAgICAgICAgZnMgPSBGaWxlU3lzdGVtLm5ld0luc3RhbmNlKHVyaSwgY29uZik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgICBjbGVhckluZGV4KCk7CisgICAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKworICAgICAgYXNzZXJ0VShhZG9jKCJpZCIsIkFBQUFBQSIpKTsKKyAgICAgIGFzc2VydFUoYWRvYygiaWQiLCJCQkJCQkIiKSk7CisgICAgICBhc3NlcnRVKGFkb2MoImlkIiwiQ0NDQ0NDIikpOworCisgICAgICBoLmNsb3NlKCk7CisgICAgICBTdHJpbmdbXSBmaWxlcyA9IEhkZnNVcGRhdGVMb2cuZ2V0TG9nTGlzdChmcywgbmV3IFBhdGgobG9nRGlyKSk7CisgICAgICBBcnJheXMuc29ydChmaWxlcyk7CisgICAgICBTdHJpbmcgZm5hbWUgPSBmaWxlc1tmaWxlcy5sZW5ndGgtMV07CisKKyAgICAgIEZTRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBmcy5hcHBlbmQobmV3IFBhdGgobG9nRGlyLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pKTsKKyAgICAgIGRvcy53cml0ZUxvbmcoMHhmZmZmZmZmZmZmZmZmZmZmTCk7CisgICAgICBkb3Mud3JpdGVDaGFycygiVGhpcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYSBnb29kIGxvZyBmaWxlLCByZXByZXNlbnRpbmcgYSBiYWQgcGFydGlhbGx5IHdyaXR0ZW4gcmVjb3JkLiIpOworICAgICAgZG9zLmNsb3NlKCk7CisgICAgICAKKyAgICAgIEZTRGF0YUlucHV0U3RyZWFtIGRpcyA9IGZzLm9wZW4obmV3IFBhdGgobG9nRGlyLCBmaWxlc1tmaWxlcy5sZW5ndGgtMV0pKTsKKyAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbKGludClkaXMuYXZhaWxhYmxlKCldOworCisgICAgICBkaXMucmVhZEZ1bGx5KGNvbnRlbnQpOworCisgICAgICBkaXMuY2xvc2UoKTsKKworICAgICAgLy8gTm93IG1ha2UgYSBuZXdlciBsb2cgZmlsZSB3aXRoIGp1c3QgdGhlIElEcyBjaGFuZ2VkLiAgTk9URTogdGhpcyBtYXkgbm90IHdvcmsgaWYgbG9nIGZvcm1hdCBjaGFuZ2VzIHRvbyBtdWNoIQorICAgICAgZmluZFJlcGxhY2UoIkFBQUFBQSIuZ2V0Qnl0ZXMoIlVURi04IiksICJhYWFhYWEiLmdldEJ5dGVzKCJVVEYtOCIpLCBjb250ZW50KTsKKyAgICAgIGZpbmRSZXBsYWNlKCJCQkJCQkIiLmdldEJ5dGVzKCJVVEYtOCIpLCAiYmJiYmJiIi5nZXRCeXRlcygiVVRGLTgiKSwgY29udGVudCk7CisgICAgICBmaW5kUmVwbGFjZSgiQ0NDQ0NDIi5nZXRCeXRlcygiVVRGLTgiKSwgImNjY2NjYyIuZ2V0Qnl0ZXMoIlVURi04IiksIGNvbnRlbnQpOworCisgICAgICAvLyBXQVJOSU5HLi4uIGFzc3VtZXMgZm9ybWF0IG9mIC4wMDAwMG4gd2hlcmUgbiBpcyBsZXNzIHRoYW4gOQorICAgICAgbG9uZyBsb2dOdW1iZXIgPSBMb25nLnBhcnNlTG9uZyhmbmFtZS5zdWJzdHJpbmcoZm5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpKTsKKyAgICAgIFN0cmluZyBmbmFtZTIgPSBTdHJpbmcuZm9ybWF0KExvY2FsZS5ST09ULAorICAgICAgICAgIFVwZGF0ZUxvZy5MT0dfRklMRU5BTUVfUEFUVEVSTiwKKyAgICAgICAgICBVcGRhdGVMb2cuVExPR19OQU1FLAorICAgICAgICAgIGxvZ051bWJlciArIDEpOworICAgICAgCisgICAgICBkb3MgPSBmcy5jcmVhdGUobmV3IFBhdGgobG9nRGlyLCBmbmFtZTIpLCAoc2hvcnQpMSk7CisgICAgICBkb3Mud3JpdGUoY29udGVudCk7CisgICAgICBkb3MuY2xvc2UoKTsKKyAgICAgIAorCisgICAgICBsb2dSZXBsYXkucmVsZWFzZSgxMDAwKTsKKyAgICAgIGxvZ1JlcGxheUZpbmlzaC5kcmFpblBlcm1pdHMoKTsKKyAgICAgIGlnbm9yZUV4Y2VwdGlvbigiT3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsgIC8vIHRoaXMgaXMgd2hhdCB0aGUgY29ycnVwdGVkIGxvZyBjdXJyZW50bHkgcHJvZHVjZXMuLi4gc3ViamVjdCB0byBjaGFuZ2UuCisgICAgICBjcmVhdGVDb3JlKCk7CisgICAgICBhc3NlcnRUcnVlKGxvZ1JlcGxheUZpbmlzaC50cnlBY3F1aXJlKHRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgIHJlc2V0RXhjZXB0aW9uSWdub3JlcygpOworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiKjoqIikgLCIvcmVzcG9uc2UvbnVtRm91bmQ9PTYiKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBEaXJlY3RVcGRhdGVIYW5kbGVyMi5jb21taXRPbkNsb3NlID0gdHJ1ZTsKKyAgICAgIFVwZGF0ZUxvZy50ZXN0aW5nX2xvZ1JlcGxheUhvb2sgPSBudWxsOworICAgICAgVXBkYXRlTG9nLnRlc3RpbmdfbG9nUmVwbGF5RmluaXNoSG9vayA9IG51bGw7CisgICAgfQorICB9CisKKworICAvLyBOT1RFOiByZXBsYWNlbWVudCBtdXN0IGN1cnJlbnRseSBiZSBzYW1lIHNpemUKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kUmVwbGFjZShieXRlW10gZnJvbSwgYnl0ZVtdIHRvLCBieXRlW10gZGF0YSkgeworICAgIGludCBpZHggPSAtZnJvbS5sZW5ndGg7CisgICAgZm9yKDs7KSB7CisgICAgICBpZHggPSBpbmRleE9mKGZyb20sIGRhdGEsIGlkeCArIGZyb20ubGVuZ3RoKTsgIC8vIHNraXAgb3ZlciBwcmV2aW91cyBtYXRjaAorICAgICAgaWYgKGlkeCA8IDApIGJyZWFrOworICAgICAgZm9yIChpbnQgaT0wOyBpPHRvLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGRhdGFbaWR4K2ldID0gdG9baV07CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZihieXRlW10gdGFyZ2V0LCBieXRlW10gZGF0YSwgaW50IHN0YXJ0KSB7CisgICAgb3V0ZXI6IGZvciAoaW50IGk9c3RhcnQ7IGk8ZGF0YS5sZW5ndGggLSB0YXJnZXQubGVuZ3RoOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGo9MDsgajx0YXJnZXQubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgaWYgKGRhdGFbaStqXSAhPSB0YXJnZXRbal0pIGNvbnRpbnVlIG91dGVyOworICAgICAgfQorICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIHN0b3BzIHRoZSBjb3JlLCByZW1vdmVzIHRoZSB0cmFuc2FjdGlvbiBsb2dzLCByZXN0YXJ0cyB0aGUgY29yZS4KKyAgdm9pZCBkZWxldGVMb2dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGxvZ0RpciA9IGguZ2V0Q29yZSgpLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5nZXRMb2dEaXIoKTsKKyAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIGNvbmYuc2V0Qm9vbGVhbigiZnMuaGRmcy5pbXBsLmRpc2FibGUuY2FjaGUiLCB0cnVlKTsKKyAgICBGaWxlU3lzdGVtIGZzOworICAgIHRyeSB7CisgICAgICBVUkkgdXJpID0gbmV3IFVSSShoZGZzVXJpKTsKKyAgICAgIGZzID0gRmlsZVN5c3RlbS5uZXdJbnN0YW5jZSh1cmksIGNvbmYpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgaC5jbG9zZSgpOworCisgICAgdHJ5IHsKKyAgICAgIFN0cmluZ1tdIGZpbGVzID0gSGRmc1VwZGF0ZUxvZy5nZXRMb2dMaXN0KGZzLCBuZXcgUGF0aChsb2dEaXIpKTsKKyAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICAvL25ldyBGaWxlKGxvZ0RpciwgZmlsZSkuZGVsZXRlKCk7CisgICAgICAgIGZzLmRlbGV0ZShuZXcgUGF0aChsb2dEaXIsIGZpbGUpLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIGFzc2VydEVxdWFscygwLCBIZGZzVXBkYXRlTG9nLmdldExvZ0xpc3QoZnMsIG5ldyBQYXRoKGxvZ0RpcikpLmxlbmd0aCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjcmVhdGUgdGhlIGNvcmUgYWdhaW4sIGV2ZW4gaWYgdGhlIGFzc2VydCBmYWlscyBzbyBpdCB3b24ndCBtZXNzCisgICAgICAvLyB1cCB0aGUgbmV4dCB0ZXN0LgorICAgICAgY3JlYXRlQ29yZSgpOworICAgICAgYXNzZXJ0SlEocmVxKCJxIiwiKjoqIikgLCIvcmVzcG9uc2UvbnVtRm91bmQ9PSIpOyAgIC8vIGVuc3VyZSBpdCB3b3JrcworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIExvbmcgZ2V0VmVyKFNvbHJRdWVyeVJlcXVlc3QgcmVxKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcmVzcG9uc2UgPSBKUShyZXEpOworICAgIE1hcCByc3AgPSAoTWFwKSBPYmplY3RCdWlsZGVyLmZyb21KU09OKHJlc3BvbnNlKTsKKyAgICBNYXAgZG9jID0gbnVsbDsKKyAgICBpZiAocnNwLmNvbnRhaW5zS2V5KCJkb2MiKSkgeworICAgICAgZG9jID0gKE1hcClyc3AuZ2V0KCJkb2MiKTsKKyAgICB9IGVsc2UgaWYgKHJzcC5jb250YWluc0tleSgiZG9jcyIpKSB7CisgICAgICBMaXN0IGxzdCA9IChMaXN0KXJzcC5nZXQoImRvY3MiKTsKKyAgICAgIGlmIChsc3Quc2l6ZSgpID4gMCkgeworICAgICAgICBkb2MgPSAoTWFwKWxzdC5nZXQoMCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyc3AuY29udGFpbnNLZXkoInJlc3BvbnNlIikpIHsKKyAgICAgIE1hcCByZXNwb25zZU1hcCA9IChNYXApcnNwLmdldCgicmVzcG9uc2UiKTsKKyAgICAgIExpc3QgbHN0ID0gKExpc3QpcmVzcG9uc2VNYXAuZ2V0KCJkb2NzIik7CisgICAgICBpZiAobHN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgZG9jID0gKE1hcClsc3QuZ2V0KDApOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkb2MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICByZXR1cm4gKExvbmcpZG9jLmdldCgiX3ZlcnNpb25fIik7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFNvbHJRdWVyeVBhcnNlci5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFNvbHJRdWVyeVBhcnNlci5qYXZhCmluZGV4IDExNGIxYzguLjQ0ZTA5YmYgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RTb2xyUXVlcnlQYXJzZXIuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0U29sclF1ZXJ5UGFyc2VyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0U29sclF1ZXJ5UGFyc2VyIGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYTEyLnhtbCIpOwogICAgIGNyZWF0ZUluZGV4KCk7CiAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RWYWx1ZVNvdXJjZUNhY2hlLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9UZXN0VmFsdWVTb3VyY2VDYWNoZS5qYXZhCmluZGV4IGI2ZGE1OTEuLjU3YzQwNjQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL1Rlc3RWYWx1ZVNvdXJjZUNhY2hlLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvVGVzdFZhbHVlU291cmNlQ2FjaGUuamF2YQpAQCAtNzgsOCArNzgsNiBAQAogICAgICAgICAidmFsMV9pMSIsCiAgICAgICAgICJ2YWwxX2wxIiwKICAgICAgICAgInZhbDFfYjEiLAotICAgICAgICAidmFsMV9ieTEiLAotICAgICAgICAidmFsMV9zaDEiCiAgICAgfTsKICAgICBmb3IgKFN0cmluZyB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykgewogICAgICAgZm9yIChTdHJpbmcgbnVtcyA6IG51bWJlcnMpIHsKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2Z1bmN0aW9uL2Rpc3RhbmNlL0Rpc3RhbmNlRnVuY3Rpb25UZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3NlYXJjaC9mdW5jdGlvbi9kaXN0YW5jZS9EaXN0YW5jZUZ1bmN0aW9uVGVzdC5qYXZhCmluZGV4IGJjMjc2NGIuLjY1ODA4YmQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc2VhcmNoL2Z1bmN0aW9uL2Rpc3RhbmNlL0Rpc3RhbmNlRnVuY3Rpb25UZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zZWFyY2gvZnVuY3Rpb24vZGlzdGFuY2UvRGlzdGFuY2VGdW5jdGlvblRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogcHVibGljIGNsYXNzIERpc3RhbmNlRnVuY3Rpb25UZXN0IGV4dGVuZHMgU29sclRlc3RDYXNlSjQgewogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYTEyLnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrQ2FjaGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmZDgxMwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvYmxvY2tjYWNoZS9CbG9ja0NhY2hlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5zdG9yZS5ibG9ja2NhY2hlOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGlsLkx1Y2VuZVRlc3RDYXNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQmxvY2tDYWNoZVRlc3QgZXh0ZW5kcyBMdWNlbmVUZXN0Q2FzZSB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja0NhY2hlKCkgeworICAgIGludCBibG9ja3NJblRlc3QgPSAyMDAwMDAwOworICAgIGludCBibG9ja1NpemUgPSAxMDI0OworICAgIAorICAgIGludCBzbGFiU2l6ZSA9IGJsb2NrU2l6ZSAqIDQwOTY7CisgICAgbG9uZyB0b3RhbE1lbW9yeSA9IDIgKiBzbGFiU2l6ZTsKKyAgICAKKyAgICBCbG9ja0NhY2hlIGJsb2NrQ2FjaGUgPSBuZXcgQmxvY2tDYWNoZShuZXcgTWV0cmljcyhuZXcgQ29uZmlndXJhdGlvbigpKSwgdHJ1ZSx0b3RhbE1lbW9yeSxzbGFiU2l6ZSxibG9ja1NpemUpOworICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICBSYW5kb20gcmFuZG9tID0gcmFuZG9tKCk7CisgICAgYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtibG9ja1NpemVdOworICAgIEF0b21pY0xvbmcgaGl0c0luQ2FjaGUgPSBuZXcgQXRvbWljTG9uZygpOworICAgIEF0b21pY0xvbmcgbWlzc2VzSW5DYWNoZSA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgbG9uZyBzdG9yZVRpbWUgPSAwOworICAgIGxvbmcgZmV0Y2hUaW1lID0gMDsKKyAgICBpbnQgcGFzc2VzID0gMTAwMDA7CisKKyAgICBCbG9ja0NhY2hlS2V5IGJsb2NrQ2FjaGVLZXkgPSBuZXcgQmxvY2tDYWNoZUtleSgpOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXNzZXM7IGorKykgeworICAgICAgbG9uZyBibG9jayA9IHJhbmRvbS5uZXh0SW50KGJsb2Nrc0luVGVzdCk7CisgICAgICBpbnQgZmlsZSA9IDA7CisgICAgICBibG9ja0NhY2hlS2V5LnNldEJsb2NrKGJsb2NrKTsKKyAgICAgIGJsb2NrQ2FjaGVLZXkuc2V0RmlsZShmaWxlKTsKKworICAgICAgaWYgKGJsb2NrQ2FjaGUuZmV0Y2goYmxvY2tDYWNoZUtleSwgYnVmZmVyKSkgeworICAgICAgICBoaXRzSW5DYWNoZS5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1pc3Nlc0luQ2FjaGUuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisKKyAgICAgIGJ5dGVbXSB0ZXN0RGF0YSA9IHRlc3REYXRhKHJhbmRvbSwgYmxvY2tTaXplLCBuZXdEYXRhKTsKKyAgICAgIGxvbmcgdDEgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgIGJsb2NrQ2FjaGUuc3RvcmUoYmxvY2tDYWNoZUtleSwgMCwgdGVzdERhdGEsIDAsIGJsb2NrU2l6ZSk7CisgICAgICBzdG9yZVRpbWUgKz0gKFN5c3RlbS5uYW5vVGltZSgpIC0gdDEpOworCisgICAgICBsb25nIHQzID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBpZiAoYmxvY2tDYWNoZS5mZXRjaChibG9ja0NhY2hlS2V5LCBidWZmZXIpKSB7CisgICAgICAgIGZldGNoVGltZSArPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSB0Myk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0RGF0YSwgYnVmZmVyKSk7CisgICAgICB9CisgICAgfQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FjaGUgSGl0cyAgICA9ICIgKyBoaXRzSW5DYWNoZS5nZXQoKSk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWNoZSBNaXNzZXMgID0gIiArIG1pc3Nlc0luQ2FjaGUuZ2V0KCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmUgICAgICAgICA9ICIgKyAoc3RvcmVUaW1lIC8gKGRvdWJsZSkgcGFzc2VzKSAvIDEwMDAwMDAuMCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJGZXRjaCAgICAgICAgID0gIiArIChmZXRjaFRpbWUgLyAoZG91YmxlKSBwYXNzZXMpIC8gMTAwMDAwMC4wKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMgb2YgRWxlbWVudHMgPSAiICsgYmxvY2tDYWNoZS5nZXRTaXplKCkpOworICB9CisKKyAgLyoqCisgICAqIFZlcmlmeSBjaGVja2luZyBvZiBidWZmZXIgc2l6ZSBsaW1pdHMgYWdhaW5zdCB0aGUgY2FjaGVkIGJsb2NrIHNpemUuCisgICAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0J1ZmZlcigpIHsKKyAgICBSYW5kb20gcmFuZG9tID0gcmFuZG9tKCk7CisgICAgaW50IGJsb2NrU2l6ZSA9IEJsb2NrQ2FjaGUuXzMySzsKKyAgICBpbnQgc2xhYlNpemUgPSBibG9ja1NpemUgKiAxMDI0OworICAgIGxvbmcgdG90YWxNZW1vcnkgPSAyICogc2xhYlNpemU7CisKKyAgICBCbG9ja0NhY2hlIGJsb2NrQ2FjaGUgPSBuZXcgQmxvY2tDYWNoZShuZXcgTWV0cmljcyhuZXcgQ29uZmlndXJhdGlvbigpKSwKKyAgICAgICAgdHJ1ZSwgdG90YWxNZW1vcnksIHNsYWJTaXplKTsKKyAgICBCbG9ja0NhY2hlS2V5IGJsb2NrQ2FjaGVLZXkgPSBuZXcgQmxvY2tDYWNoZUtleSgpOworICAgIGJsb2NrQ2FjaGVLZXkuc2V0QmxvY2soMCk7CisgICAgYmxvY2tDYWNoZUtleS5zZXRGaWxlKDApOworICAgIGJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbYmxvY2tTaXplKjNdOworICAgIGJ5dGVbXSB0ZXN0RGF0YSA9IHRlc3REYXRhKHJhbmRvbSwgYmxvY2tTaXplLCBuZXdEYXRhKTsKKworICAgIGFzc2VydFRydWUoYmxvY2tDYWNoZS5zdG9yZShibG9ja0NhY2hlS2V5LCAwLCB0ZXN0RGF0YSwgMCwgYmxvY2tTaXplKSk7CisgICAgYXNzZXJ0VHJ1ZShibG9ja0NhY2hlLnN0b3JlKGJsb2NrQ2FjaGVLZXksIDAsIHRlc3REYXRhLCBibG9ja1NpemUsIGJsb2NrU2l6ZSkpOworICAgIGFzc2VydFRydWUoYmxvY2tDYWNoZS5zdG9yZShibG9ja0NhY2hlS2V5LCAwLCB0ZXN0RGF0YSwgYmxvY2tTaXplKjIsIGJsb2NrU2l6ZSkpOworCisgICAgYXNzZXJ0VHJ1ZShibG9ja0NhY2hlLnN0b3JlKGJsb2NrQ2FjaGVLZXksIDEsIHRlc3REYXRhLCAwLCBibG9ja1NpemUgLSAxKSk7CisgICAgYXNzZXJ0VHJ1ZShibG9ja0NhY2hlLnN0b3JlKGJsb2NrQ2FjaGVLZXksIDEsIHRlc3REYXRhLCBibG9ja1NpemUsIGJsb2NrU2l6ZSAtIDEpKTsKKyAgICBhc3NlcnRUcnVlKGJsb2NrQ2FjaGUuc3RvcmUoYmxvY2tDYWNoZUtleSwgMSwgdGVzdERhdGEsIGJsb2NrU2l6ZSoyLCBibG9ja1NpemUgLSAxKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdGVzdERhdGEoUmFuZG9tIHJhbmRvbSwgaW50IHNpemUsIGJ5dGVbXSBidWYpIHsKKyAgICByYW5kb20ubmV4dEJ5dGVzKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5VGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zdG9yZS9ibG9ja2NhY2hlL0Jsb2NrRGlyZWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2Jsb2NrY2FjaGUvQmxvY2tEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwyNTcgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmJsb2NrY2FjaGU7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRlNEaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSU9Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhPdXRwdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuTWVyZ2VJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmhkZnMuSGRmc0RpcmVjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGVjb2RlLmNvbmN1cnJlbnRsaW5rZWRoYXNobWFwLkNvbmN1cnJlbnRMaW5rZWRIYXNoTWFwOworCitwdWJsaWMgY2xhc3MgQmxvY2tEaXJlY3RvcnlUZXN0IGV4dGVuZHMgTHVjZW5lVGVzdENhc2UgeworCisgIHByaXZhdGUgY2xhc3MgTWFwcGVyQ2FjaGUgaW1wbGVtZW50cyBDYWNoZSB7CisgICAgcHVibGljIE1hcDxTdHJpbmcsIGJ5dGVbXT4gbWFwID0gbmV3IENvbmN1cnJlbnRMaW5rZWRIYXNoTWFwLkJ1aWxkZXI8U3RyaW5nLCBieXRlW10+KCkubWF4aW11bVdlaWdodGVkQ2FwYWNpdHkoOCkuYnVpbGQoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgbmFtZSwgbG9uZyBibG9ja0lkLCBpbnQgYmxvY2tPZmZzZXQsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgIGJ5dGVbXSBjYWNoZWQgPSBtYXAuZ2V0KG5hbWUgKyBibG9ja0lkKTsKKyAgICAgIGlmIChjYWNoZWQgIT0gbnVsbCkgeworICAgICAgICBpbnQgbmV3bGVuID0gTWF0aC5tYXgoY2FjaGVkLmxlbmd0aCwgYmxvY2tPZmZzZXQgKyBsZW5ndGgpOworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlW25ld2xlbl07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2FjaGVkLCAwLCBiLCAwLCBjYWNoZWQubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG9mZnNldCwgYiwgYmxvY2tPZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGNhY2hlZCA9IGI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjYWNoZWQgPSBjb3B5KGJsb2NrT2Zmc2V0LCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIG1hcC5wdXQobmFtZSArIGJsb2NrSWQsIGNhY2hlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gY29weShpbnQgYmxvY2tPZmZzZXQsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbbGVuZ3RoICsgYmxvY2tPZmZzZXRdOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG9mZnNldCwgYiwgYmxvY2tPZmZzZXQsIGxlbmd0aCk7CisgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBmZXRjaChTdHJpbmcgbmFtZSwgbG9uZyBibG9ja0lkLCBpbnQgYmxvY2tPZmZzZXQsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuZ3RoVG9SZWFkSW5CbG9jaykgeworICAgICAgLy8gcmV0dXJuIGZhbHNlOworICAgICAgYnl0ZVtdIGRhdGEgPSBtYXAuZ2V0KG5hbWUgKyBibG9ja0lkKTsKKyAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBibG9ja09mZnNldCwgYiwgb2ZmLCBsZW5ndGhUb1JlYWRJbkJsb2NrKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2l6ZSgpIHsKKyAgICAgIHJldHVybiBtYXAuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbmFtZUNhY2hlRmlsZShTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNQkVSX09GX1dSSVRFUyA9IDEwMDAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZJTEVfU0laRSA9IDEwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GSUxFX1NJWkUgPSAxMDAwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQlVGRkVSX1NJWkUgPSAxOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRkZFUl9TSVpFID0gMTIwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNQkVSX09GX1JFQURTID0gMjAwMDA7CisgIHByaXZhdGUgQmxvY2tEaXJlY3RvcnkgZGlyZWN0b3J5OworICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tOworICBwcml2YXRlIE1hcHBlckNhY2hlIG1hcHBlckNhY2hlOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZXRVcCgpOworICAgIGZpbGUgPSBuZXcgRmlsZShURU1QX0RJUiwgSGRmc0RpcmVjdG9yeS5jbGFzcy5nZXROYW1lKCkgKyAiLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgcm0oZmlsZSk7CisgICAgZmlsZS5ta2RpcnMoKTsKKyAgICBGU0RpcmVjdG9yeSBkaXIgPSBGU0RpcmVjdG9yeS5vcGVuKG5ldyBGaWxlKGZpbGUsICJiYXNlIikpOworICAgIG1hcHBlckNhY2hlID0gbmV3IE1hcHBlckNhY2hlKCk7CisgICAgZGlyZWN0b3J5ID0gbmV3IEJsb2NrRGlyZWN0b3J5KCJ0ZXN0IiwgZGlyLCBtYXBwZXJDYWNoZSwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmFuZG9tID0gcmFuZG9tKCk7CisgIH0KKyAgCisgIEBBZnRlcgorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgZGlyZWN0b3J5LmNsb3NlKCk7CisgICAgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeShmaWxlKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFT0YoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERpcmVjdG9yeSBmc0RpciA9IEZTRGlyZWN0b3J5Lm9wZW4obmV3IEZpbGUoZmlsZSwgIm5vcm1hbCIpKTsKKyAgICBTdHJpbmcgbmFtZSA9ICJ0ZXN0LmVvZiI7CisgICAgY3JlYXRlRmlsZShuYW1lLCBmc0RpciwgZGlyZWN0b3J5KTsKKyAgICBsb25nIGZzTGVuZ3RoID0gZnNEaXIuZmlsZUxlbmd0aChuYW1lKTsKKyAgICBsb25nIGhkZnNMZW5ndGggPSBkaXJlY3RvcnkuZmlsZUxlbmd0aChuYW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoZnNMZW5ndGgsIGhkZnNMZW5ndGgpOworICAgIHRlc3RFb2YobmFtZSwgZnNEaXIsIGZzTGVuZ3RoKTsKKyAgICB0ZXN0RW9mKG5hbWUsIGRpcmVjdG9yeSwgaGRmc0xlbmd0aCk7CisgICAgZnNEaXIuY2xvc2UoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0ZXN0RW9mKFN0cmluZyBuYW1lLCBEaXJlY3RvcnkgZGlyZWN0b3J5LCBsb25nIGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBJbmRleElucHV0IGlucHV0ID0gZGlyZWN0b3J5Lm9wZW5JbnB1dChuYW1lLCBuZXcgSU9Db250ZXh0KCkpOworICAgIHRyeSB7CisgICAgaW5wdXQuc2VlayhsZW5ndGgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IGVvZiIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBpbnB1dC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RSYW5kb21BY2Nlc3NXcml0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvbmcgdDEgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKworICAgIGludCBpID0gMDsKKyAgICB0cnkgeworICAgICAgZm9yICg7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIERpcmVjdG9yeSBmc0RpciA9IEZTRGlyZWN0b3J5Lm9wZW4obmV3IEZpbGUoZmlsZSwgIm5vcm1hbCIpKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7CisgICAgICAgIGNyZWF0ZUZpbGUobmFtZSwgZnNEaXIsIGRpcmVjdG9yeSk7CisgICAgICAgIGFzc2VydElucHV0c0VxdWFscyhuYW1lLCBmc0RpciwgZGlyZWN0b3J5KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIGZhaWwoIlRlc3QgZmFpbGVkIG9uIHBhc3MgWyIgKyBpICsgIl0iKTsKKyAgICB9CisgICAgbG9uZyB0MiA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgdGltZSBpcyAiICsgKCh0MiAtIHQxKS8xMDAwMDAwKSArICJtcyIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFJhbmRvbUFjY2Vzc1dyaXRlc0xhcmdlQ2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG1hcHBlckNhY2hlLm1hcCA9IG5ldyBDb25jdXJyZW50TGlua2VkSGFzaE1hcC5CdWlsZGVyPFN0cmluZywgYnl0ZVtdPigpLm1heGltdW1XZWlnaHRlZENhcGFjaXR5KDEwMDAwKS5idWlsZCgpOworICAgIHRlc3RSYW5kb21BY2Nlc3NXcml0ZXMoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJbnB1dHNFcXVhbHMoU3RyaW5nIG5hbWUsIERpcmVjdG9yeSBmc0RpciwgRGlyZWN0b3J5IGhkZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHJlYWRzID0gcmFuZG9tLm5leHRJbnQoTUFYX05VTUJFUl9PRl9SRUFEUyk7CisgICAgSW5kZXhJbnB1dCBmc0lucHV0ID0gZnNEaXIub3BlbklucHV0KG5hbWUsIG5ldyBJT0NvbnRleHQoKSk7CisgICAgSW5kZXhJbnB1dCBoZGZzSW5wdXQgPSBoZGZzLm9wZW5JbnB1dChuYW1lLCBuZXcgSU9Db250ZXh0KCkpOworICAgIGFzc2VydEVxdWFscyhmc0lucHV0Lmxlbmd0aCgpLCBoZGZzSW5wdXQubGVuZ3RoKCkpOworICAgIGludCBmaWxlTGVuZ3RoID0gKGludCkgZnNJbnB1dC5sZW5ndGgoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWRzOyBpKyspIHsKKyAgICAgIGJ5dGVbXSBmc0J1ZiA9IG5ldyBieXRlW3JhbmRvbS5uZXh0SW50KE1hdGgubWluKE1BWF9CVUZGRVJfU0laRSAtIE1JTl9CVUZGRVJfU0laRSwgZmlsZUxlbmd0aCkpICsgTUlOX0JVRkZFUl9TSVpFXTsKKyAgICAgIGJ5dGVbXSBoZGZzQnVmID0gbmV3IGJ5dGVbZnNCdWYubGVuZ3RoXTsKKyAgICAgIGludCBvZmZzZXQgPSByYW5kb20ubmV4dEludChmc0J1Zi5sZW5ndGgpOworICAgICAgaW50IGxlbmd0aCA9IHJhbmRvbS5uZXh0SW50KGZzQnVmLmxlbmd0aCAtIG9mZnNldCk7CisgICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoZmlsZUxlbmd0aCAtIGxlbmd0aCk7CisgICAgICBmc0lucHV0LnNlZWsocG9zKTsKKyAgICAgIGZzSW5wdXQucmVhZEJ5dGVzKGZzQnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBoZGZzSW5wdXQuc2Vlayhwb3MpOworICAgICAgaGRmc0lucHV0LnJlYWRCeXRlcyhoZGZzQnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBmb3IgKGludCBmID0gb2Zmc2V0OyBmIDwgbGVuZ3RoOyBmKyspIHsKKyAgICAgICAgaWYgKGZzQnVmW2ZdICE9IGhkZnNCdWZbZl0pIHsKKyAgICAgICAgICBmYWlsKCJyZWFkIFsiICsgaSArICJdIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZnNJbnB1dC5jbG9zZSgpOworICAgIGhkZnNJbnB1dC5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGUoU3RyaW5nIG5hbWUsIERpcmVjdG9yeSBmc0RpciwgRGlyZWN0b3J5IGhkZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHdyaXRlcyA9IHJhbmRvbS5uZXh0SW50KE1BWF9OVU1CRVJfT0ZfV1JJVEVTKTsKKyAgICBpbnQgZmlsZUxlbmd0aCA9IHJhbmRvbS5uZXh0SW50KE1BWF9GSUxFX1NJWkUgLSBNSU5fRklMRV9TSVpFKSArIE1JTl9GSUxFX1NJWkU7CisgICAgSW5kZXhPdXRwdXQgZnNPdXRwdXQgPSBmc0Rpci5jcmVhdGVPdXRwdXQobmFtZSwgSU9Db250ZXh0LkRFRkFVTFQpOworICAgIEluZGV4T3V0cHV0IGhkZnNPdXRwdXQgPSBoZGZzLmNyZWF0ZU91dHB1dChuYW1lLCBJT0NvbnRleHQuREVGQVVMVCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0ZXM7IGkrKykgeworICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3JhbmRvbS5uZXh0SW50KE1hdGgubWluKE1BWF9CVUZGRVJfU0laRSAtIE1JTl9CVUZGRVJfU0laRSwgZmlsZUxlbmd0aCkpICsgTUlOX0JVRkZFUl9TSVpFXTsKKyAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgIGludCBvZmZzZXQgPSByYW5kb20ubmV4dEludChidWYubGVuZ3RoKTsKKyAgICAgIGludCBsZW5ndGggPSByYW5kb20ubmV4dEludChidWYubGVuZ3RoIC0gb2Zmc2V0KTsKKyAgICAgIGZzT3V0cHV0LndyaXRlQnl0ZXMoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBoZGZzT3V0cHV0LndyaXRlQnl0ZXMoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIGZzT3V0cHV0LmNsb3NlKCk7CisgICAgaGRmc091dHB1dC5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gTG9uZy50b1N0cmluZyhNYXRoLmFicyhyYW5kb20ubmV4dExvbmcoKSkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHJtKEZpbGUgZmlsZSkgeworICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICBmb3IgKEZpbGUgZiA6IGZpbGUubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgcm0oZik7CisgICAgICB9CisgICAgfQorICAgIGZpbGUuZGVsZXRlKCk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBibG9jayBjYWNoZSBhcmUgaGFuZGxlZAorICAgKiBhcHByb3ByaWF0ZWx5LgorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZW5zdXJlQ2FjaGVDb25maWd1cmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJT0NvbnRleHQgbWVyZ2VDb250ZXh0ID0gbmV3IElPQ29udGV4dChuZXcgTWVyZ2VJbmZvKDEsMSxmYWxzZSwxKSk7CisKKyAgICBCbG9ja0RpcmVjdG9yeSBkID0gZGlyZWN0b3J5OworICAgIGFzc2VydFRydWUoZC51c2VSZWFkQ2FjaGUoIiIsIElPQ29udGV4dC5ERUZBVUxUKSk7CisgICAgYXNzZXJ0VHJ1ZShkLnVzZVdyaXRlQ2FjaGUoIiIsIElPQ29udGV4dC5ERUZBVUxUKSk7CisgICAgYXNzZXJ0RmFsc2UoZC51c2VXcml0ZUNhY2hlKCIiLCBtZXJnZUNvbnRleHQpKTsKKworICAgIGQgPSBuZXcgQmxvY2tEaXJlY3RvcnkoInRlc3QiLCBkaXJlY3RvcnksIG1hcHBlckNhY2hlLCBudWxsLCB0cnVlLCBmYWxzZSk7CisgICAgYXNzZXJ0VHJ1ZShkLnVzZVJlYWRDYWNoZSgiIiwgSU9Db250ZXh0LkRFRkFVTFQpKTsKKyAgICBhc3NlcnRGYWxzZShkLnVzZVdyaXRlQ2FjaGUoIiIsIElPQ29udGV4dC5ERUZBVUxUKSk7CisgICAgYXNzZXJ0RmFsc2UoZC51c2VXcml0ZUNhY2hlKCIiLCBtZXJnZUNvbnRleHQpKTsKKworICAgIGQgPSBuZXcgQmxvY2tEaXJlY3RvcnkoInRlc3QiLCBkaXJlY3RvcnksIG1hcHBlckNhY2hlLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisgICAgYXNzZXJ0RmFsc2UoZC51c2VSZWFkQ2FjaGUoIiIsIElPQ29udGV4dC5ERUZBVUxUKSk7CisgICAgYXNzZXJ0VHJ1ZShkLnVzZVdyaXRlQ2FjaGUoIiIsIElPQ29udGV4dC5ERUZBVUxUKSk7CisgICAgYXNzZXJ0RmFsc2UoZC51c2VXcml0ZUNhY2hlKCIiLCBtZXJnZUNvbnRleHQpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL0hkZnNEaXJlY3RvcnlUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0RpcmVjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ5MTEyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9zdG9yZS9oZGZzL0hkZnNEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwyMjIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmhkZnM7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5EaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSU9Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnN0b3JlLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5kZXhPdXRwdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuUkFNRGlyZWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmcy5IZGZzVGVzdFV0aWw7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGU7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGUuU2NvcGU7CisKK0BUaHJlYWRMZWFrU2NvcGUoU2NvcGUuTk9ORSkgLy8gaGRmcyBjbGllbnQgY3VycmVudGx5IGxlYWtzIHRocmVhZCAoSEFET09QLTkwNDkpCisvL0BJZ25vcmUoInRoaXMgdGVzdCB2aW9sYXRlcyB0aGUgdGVzdCBzZWN1cml0eSBwb2xpY3kgYmVjYXVzZSBvZiBvcmcuYXBhY2hlLmhhZG9vcC5mcy5SYXdMb2NhbEZpbGVTeXN0ZW0ubWtkaXJzIikKK3B1YmxpYyBjbGFzcyBIZGZzRGlyZWN0b3J5VGVzdCBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNQkVSX09GX1dSSVRFUyA9IDEwMDAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZJTEVfU0laRSA9IDEwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GSUxFX1NJWkUgPSAxMDAwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQlVGRkVSX1NJWkUgPSAxOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRkZFUl9TSVpFID0gNTAwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVU1CRVJfT0ZfUkVBRFMgPSAxMDAwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgTWluaURGU0NsdXN0ZXIgZGZzQ2x1c3RlcjsKKyAgcHJpdmF0ZSBIZGZzRGlyZWN0b3J5IGRpcmVjdG9yeTsKKyAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tOworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBjcmVhdGVUZW1wRGlyKCk7CisgICAgZGZzQ2x1c3RlciA9IEhkZnNUZXN0VXRpbC5zZXR1cENsYXNzKFRFTVBfRElSLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBIZGZzRGlyZWN0b3J5VGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiX2hkZnNkaXItIgorICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgfQorICAKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBIZGZzVGVzdFV0aWwudGVhcmRvd25DbGFzcyhkZnNDbHVzdGVyKTsKKyAgICBkZnNDbHVzdGVyID0gbnVsbDsKKyAgfQorICAKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN1cGVyLnNldFVwKCk7CisgICAgCisgICAgQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICBjb25mLnNldCgiZGZzLnBlcm1pc3Npb25zLmVuYWJsZWQiLCAiZmFsc2UiKTsKKyAgICAKKyAgICBkaXJlY3RvcnkgPSBuZXcgSGRmc0RpcmVjdG9yeShuZXcgUGF0aChkZnNDbHVzdGVyLmdldFVSSSgpLnRvU3RyaW5nKCkgKyBkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi9oZGZzIiksIGNvbmYpOworICAgIAorICAgIHJhbmRvbSA9IHJhbmRvbSgpOworICB9CisgIAorICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci50ZWFyRG93bigpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGluZ0FuZFJlYWRpbmdBRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nW10gbGlzdEFsbCA9IGRpcmVjdG9yeS5saXN0QWxsKCk7CisgICAgZm9yIChTdHJpbmcgZmlsZSA6IGxpc3RBbGwpIHsKKyAgICAgIGRpcmVjdG9yeS5kZWxldGVGaWxlKGZpbGUpOworICAgIH0KKyAgICAKKyAgICBJbmRleE91dHB1dCBvdXRwdXQgPSBkaXJlY3RvcnkuY3JlYXRlT3V0cHV0KCJ0ZXN0aW5nLnRlc3QiLCBuZXcgSU9Db250ZXh0KCkpOworICAgIG91dHB1dC53cml0ZUludCgxMjM0NSk7CisgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgb3V0cHV0LmNsb3NlKCk7CisKKyAgICBJbmRleElucHV0IGlucHV0ID0gZGlyZWN0b3J5Lm9wZW5JbnB1dCgidGVzdGluZy50ZXN0IiwgbmV3IElPQ29udGV4dCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMTIzNDUsIGlucHV0LnJlYWRJbnQoKSk7CisgICAgaW5wdXQuY2xvc2UoKTsKKworICAgIGxpc3RBbGwgPSBkaXJlY3RvcnkubGlzdEFsbCgpOworICAgIGFzc2VydEVxdWFscygxLCBsaXN0QWxsLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0aW5nLnRlc3QiLCBsaXN0QWxsWzBdKTsKKworICAgIGFzc2VydEVxdWFscyg0LCBkaXJlY3RvcnkuZmlsZUxlbmd0aCgidGVzdGluZy50ZXN0IikpOworCisgICAgSW5kZXhJbnB1dCBpbnB1dDEgPSBkaXJlY3Rvcnkub3BlbklucHV0KCJ0ZXN0aW5nLnRlc3QiLCBuZXcgSU9Db250ZXh0KCkpOworCisgICAgSW5kZXhJbnB1dCBpbnB1dDIgPSAoSW5kZXhJbnB1dCkgaW5wdXQxLmNsb25lKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEyMzQ1LCBpbnB1dDIucmVhZEludCgpKTsKKyAgICBpbnB1dDIuY2xvc2UoKTsKKworICAgIGFzc2VydEVxdWFscygxMjM0NSwgaW5wdXQxLnJlYWRJbnQoKSk7CisgICAgaW5wdXQxLmNsb3NlKCk7CisKKyAgICBhc3NlcnRGYWxzZShkaXJlY3RvcnkuZmlsZUV4aXN0cygidGVzdGluZy50ZXN0Lm90aGVyIikpOworICAgIGFzc2VydFRydWUoZGlyZWN0b3J5LmZpbGVFeGlzdHMoInRlc3RpbmcudGVzdCIpKTsKKyAgICBkaXJlY3RvcnkuZGVsZXRlRmlsZSgidGVzdGluZy50ZXN0Iik7CisgICAgYXNzZXJ0RmFsc2UoZGlyZWN0b3J5LmZpbGVFeGlzdHMoInRlc3RpbmcudGVzdCIpKTsKKyAgfQorICAKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEVPRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGlyZWN0b3J5IGZzRGlyID0gbmV3IFJBTURpcmVjdG9yeSgpOworICAgIFN0cmluZyBuYW1lID0gInRlc3QuZW9mIjsKKyAgICBjcmVhdGVGaWxlKG5hbWUsIGZzRGlyLCBkaXJlY3RvcnkpOworICAgIGxvbmcgZnNMZW5ndGggPSBmc0Rpci5maWxlTGVuZ3RoKG5hbWUpOworICAgIGxvbmcgaGRmc0xlbmd0aCA9IGRpcmVjdG9yeS5maWxlTGVuZ3RoKG5hbWUpOworICAgIGFzc2VydEVxdWFscyhmc0xlbmd0aCwgaGRmc0xlbmd0aCk7CisgICAgdGVzdEVvZihuYW1lLGZzRGlyLGZzTGVuZ3RoKTsKKyAgICB0ZXN0RW9mKG5hbWUsZGlyZWN0b3J5LGhkZnNMZW5ndGgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RFb2YoU3RyaW5nIG5hbWUsIERpcmVjdG9yeSBkaXJlY3RvcnksIGxvbmcgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEluZGV4SW5wdXQgaW5wdXQgPSBkaXJlY3Rvcnkub3BlbklucHV0KG5hbWUsIG5ldyBJT0NvbnRleHQoKSk7CisgICAgaW5wdXQuc2VlayhsZW5ndGgpOworICAgIHRyeSB7CisgICAgICBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgZmFpbCgic2hvdWxkIHRocm93IGVvZiIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tQWNjZXNzV3JpdGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgaSA9IDA7CisgICAgdHJ5IHsKKyAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgZm9yICg7IGk8IDEwOyBpKyspIHsKKyAgICAgICAgRGlyZWN0b3J5IGZzRGlyID0gbmV3IFJBTURpcmVjdG9yeSgpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JraW5nIG9uIHBhc3MgWyIgKyBpICArIl0gY29udGFpbnMgWyIgKyBuYW1lcy5jb250YWlucyhuYW1lKSArICJdIik7CisgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgY3JlYXRlRmlsZShuYW1lLGZzRGlyLGRpcmVjdG9yeSk7CisgICAgICAgIGFzc2VydElucHV0c0VxdWFscyhuYW1lLGZzRGlyLGRpcmVjdG9yeSk7CisgICAgICAgIGZzRGlyLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKCJUZXN0IGZhaWxlZCBvbiBwYXNzIFsiICsgaSArICJdIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydElucHV0c0VxdWFscyhTdHJpbmcgbmFtZSwgRGlyZWN0b3J5IGZzRGlyLCBIZGZzRGlyZWN0b3J5IGhkZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHJlYWRzID0gcmFuZG9tLm5leHRJbnQoTUFYX05VTUJFUl9PRl9SRUFEUyk7CisgICAgSW5kZXhJbnB1dCBmc0lucHV0ID0gZnNEaXIub3BlbklucHV0KG5hbWUsbmV3IElPQ29udGV4dCgpKTsKKyAgICBJbmRleElucHV0IGhkZnNJbnB1dCA9IGhkZnMub3BlbklucHV0KG5hbWUsbmV3IElPQ29udGV4dCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZnNJbnB1dC5sZW5ndGgoKSwgaGRmc0lucHV0Lmxlbmd0aCgpKTsKKyAgICBpbnQgZmlsZUxlbmd0aCA9IChpbnQpIGZzSW5wdXQubGVuZ3RoKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkczsgaSsrKSB7CisgICAgICBpbnQgbmV4dEludCA9IE1hdGgubWluKE1BWF9CVUZGRVJfU0laRSAtIE1JTl9CVUZGRVJfU0laRSxmaWxlTGVuZ3RoKTsKKyAgICAgIGJ5dGVbXSBmc0J1ZiA9IG5ldyBieXRlW3JhbmRvbS5uZXh0SW50KG5leHRJbnQgPiAwID8gbmV4dEludCA6IDEpICsgTUlOX0JVRkZFUl9TSVpFXTsKKyAgICAgIGJ5dGVbXSBoZGZzQnVmID0gbmV3IGJ5dGVbZnNCdWYubGVuZ3RoXTsKKyAgICAgIGludCBvZmZzZXQgPSByYW5kb20ubmV4dEludChmc0J1Zi5sZW5ndGgpOworICAgICAgCisgICAgICBuZXh0SW50ID0gZnNCdWYubGVuZ3RoIC0gb2Zmc2V0OworICAgICAgaW50IGxlbmd0aCA9IHJhbmRvbS5uZXh0SW50KG5leHRJbnQgPiAwID8gbmV4dEludCA6IDEpOworICAgICAgbmV4dEludCA9IGZpbGVMZW5ndGggLSBsZW5ndGg7CisgICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQobmV4dEludCA+IDAgPyBuZXh0SW50IDogMSk7CisgICAgICBmc0lucHV0LnNlZWsocG9zKTsKKyAgICAgIGZzSW5wdXQucmVhZEJ5dGVzKGZzQnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBoZGZzSW5wdXQuc2Vlayhwb3MpOworICAgICAgaGRmc0lucHV0LnJlYWRCeXRlcyhoZGZzQnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBmb3IgKGludCBmID0gb2Zmc2V0OyBmIDwgbGVuZ3RoOyBmKyspIHsKKyAgICAgICAgaWYgKGZzQnVmW2ZdICE9IGhkZnNCdWZbZl0pIHsKKyAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZnNJbnB1dC5jbG9zZSgpOworICAgIGhkZnNJbnB1dC5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGUoU3RyaW5nIG5hbWUsIERpcmVjdG9yeSBmc0RpciwgSGRmc0RpcmVjdG9yeSBoZGZzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCB3cml0ZXMgPSByYW5kb20ubmV4dEludChNQVhfTlVNQkVSX09GX1dSSVRFUyk7CisgICAgaW50IGZpbGVMZW5ndGggPSByYW5kb20ubmV4dEludChNQVhfRklMRV9TSVpFIC0gTUlOX0ZJTEVfU0laRSkgKyBNSU5fRklMRV9TSVpFOworICAgIEluZGV4T3V0cHV0IGZzT3V0cHV0ID0gZnNEaXIuY3JlYXRlT3V0cHV0KG5hbWUsIG5ldyBJT0NvbnRleHQoKSk7CisgICAgZnNPdXRwdXQuc2V0TGVuZ3RoKGZpbGVMZW5ndGgpOworICAgIEluZGV4T3V0cHV0IGhkZnNPdXRwdXQgPSBoZGZzLmNyZWF0ZU91dHB1dChuYW1lLCBuZXcgSU9Db250ZXh0KCkpOworICAgIGhkZnNPdXRwdXQuc2V0TGVuZ3RoKGZpbGVMZW5ndGgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JpdGVzOyBpKyspIHsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtyYW5kb20ubmV4dEludChNYXRoLm1pbihNQVhfQlVGRkVSX1NJWkUgLSBNSU5fQlVGRkVSX1NJWkUsZmlsZUxlbmd0aCkpICsgTUlOX0JVRkZFUl9TSVpFXTsKKyAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgIGludCBvZmZzZXQgPSByYW5kb20ubmV4dEludChidWYubGVuZ3RoKTsKKyAgICAgIGludCBsZW5ndGggPSByYW5kb20ubmV4dEludChidWYubGVuZ3RoIC0gb2Zmc2V0KTsKKyAgICAgIGZzT3V0cHV0LndyaXRlQnl0ZXMoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBoZGZzT3V0cHV0LndyaXRlQnl0ZXMoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIGZzT3V0cHV0LmNsb3NlKCk7CisgICAgaGRmc091dHB1dC5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gTG9uZy50b1N0cmluZyhNYXRoLmFicyhyYW5kb20ubmV4dExvbmcoKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvc3RvcmUvaGRmcy9IZGZzTG9ja0ZhY3RvcnlUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0xvY2tGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTYzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3N0b3JlL2hkZnMvSGRmc0xvY2tGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnN0b3JlLmhkZnM7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5Mb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xvdWQuaGRmcy5IZGZzVGVzdFV0aWw7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGU7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrU2NvcGUuU2NvcGU7CisKK0BUaHJlYWRMZWFrU2NvcGUoU2NvcGUuTk9ORSkgLy8gaGRmcyBjbGllbnQgY3VycmVudGx5IGxlYWtzIHRocmVhZCAoSEFET09QLTkwNDkpCitwdWJsaWMgY2xhc3MgSGRmc0xvY2tGYWN0b3J5VGVzdCBleHRlbmRzIFNvbHJUZXN0Q2FzZUo0IHsKKyAgCisgIHByaXZhdGUgc3RhdGljIE1pbmlERlNDbHVzdGVyIGRmc0NsdXN0ZXI7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGNyZWF0ZVRlbXBEaXIoKTsKKyAgICBkZnNDbHVzdGVyID0gSGRmc1Rlc3RVdGlsLnNldHVwQ2xhc3MoVEVNUF9ESVIuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIEhkZnNMb2NrRmFjdG9yeVRlc3QuY2xhc3MuZ2V0TmFtZSgpICsgIl9oZGZzZGlyLSIKKyAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgIH0KKyAgCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSGRmc1Rlc3RVdGlsLnRlYXJkb3duQ2xhc3MoZGZzQ2x1c3Rlcik7CisgICAgZGZzQ2x1c3RlciA9IG51bGw7CisgIH0KKyAgCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZXRVcCgpOworICB9CisgIAorICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdXBlci50ZWFyRG93bigpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFVSSSB1cmkgPSBkZnNDbHVzdGVyLmdldFVSSSgpOworICAgIFBhdGggbG9ja1BhdGggPSBuZXcgUGF0aCh1cmkudG9TdHJpbmcoKSwgIi9sb2NrIik7CisgICAgSGRmc0xvY2tGYWN0b3J5IGxvY2tGYWN0b3J5ID0gbmV3IEhkZnNMb2NrRmFjdG9yeShsb2NrUGF0aCwgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgTG9jayBsb2NrID0gbG9ja0ZhY3RvcnkubWFrZUxvY2soInRlc3Rsb2NrIik7CisgICAgYm9vbGVhbiBzdWNjZXNzID0gbG9jay5vYnRhaW4oKTsKKyAgICBhc3NlcnRUcnVlKCJXZSBjb3VsZCBub3QgZ2V0IHRoZSBsb2NrIHdoZW4gaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSIsIHN1Y2Nlc3MpOworICAgIHN1Y2Nlc3MgPSBsb2NrLm9idGFpbigpOworICAgIGFzc2VydEZhbHNlKCJXZSBnb3QgdGhlIGxvY2sgYnV0IGl0IHNob3VsZCBiZSB1bmF2YWlsYmxlIiwgc3VjY2Vzcyk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgc3VjY2VzcyA9IGxvY2sub2J0YWluKCk7CisgICAgYXNzZXJ0VHJ1ZSgiV2UgY291bGQgbm90IGdldCB0aGUgbG9jayB3aGVuIGl0IHNob3VsZCBiZSBhdmFpbGFibGUiLCBzdWNjZXNzKTsKKyAgICBzdWNjZXNzID0gbG9jay5vYnRhaW4oKTsKKyAgICBhc3NlcnRGYWxzZSgiV2UgZ290IHRoZSBsb2NrIGJ1dCBpdCBzaG91bGQgYmUgdW5hdmFpbGJsZSIsIHN1Y2Nlc3MpOworICB9CisgIAorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvRGlyZWN0VXBkYXRlSGFuZGxlck9wdGltaXplVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvRGlyZWN0VXBkYXRlSGFuZGxlck9wdGltaXplVGVzdC5qYXZhCmluZGV4IDdmYWExNGEuLjA2NmViMzUgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RpcmVjdFVwZGF0ZUhhbmRsZXJPcHRpbWl6ZVRlc3QuamF2YQorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9EaXJlY3RVcGRhdGVIYW5kbGVyT3B0aW1pemVUZXN0LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIAogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOyAvLyBzY2hlbWExMiBkb2Vzbid0IHN1cHBvcnQgX3ZlcnNpb25fCiAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwgInNjaGVtYTEyLnhtbCIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RpcmVjdFVwZGF0ZUhhbmRsZXJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9EaXJlY3RVcGRhdGVIYW5kbGVyVGVzdC5qYXZhCmluZGV4IGRkZDdmNzguLmM2NjA5MTIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RpcmVjdFVwZGF0ZUhhbmRsZXJUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvRGlyZWN0VXBkYXRlSGFuZGxlclRlc3QuamF2YQpAQCAtNDUsNiArNDUsNyBAQAogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBzYXZlZEZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNvbHIuRGlyZWN0b3J5RmFjdG9yeSIpOwogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc29sci5jb3JlLk1vY2tGU0RpcmVjdG9yeUZhY3RvcnkiKTsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hMTIueG1sIik7CiAgIH0KICAgCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Eb2N1bWVudEJ1aWxkZXJUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Eb2N1bWVudEJ1aWxkZXJUZXN0LmphdmEKaW5kZXggZWI5ZDczNy4uYzhmZmU0YSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvRG9jdW1lbnRCdWlsZGVyVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL0RvY3VtZW50QnVpbGRlclRlc3QuamF2YQpAQCAtMzU3LDkgKzM1Nyw3IEBACiAgICAqLwogICBwcml2YXRlIHN0YXRpYyBieXRlIGV4cGVjdGVkTm9ybShmaW5hbCBEZWZhdWx0U2ltaWxhcml0eSBzaW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGgsIGZpbmFsIGZsb2F0IGJvb3N0KSB7Ci0gICAgCi0gICAgcmV0dXJuIHNpbS5lbmNvZGVOb3JtVmFsdWUoYm9vc3QgLyAoKGZsb2F0KSBNYXRoLnNxcnQobGVuZ3RoKSkpOwotCisgICAgcmV0dXJuIChieXRlKSBzaW0uZW5jb2RlTm9ybVZhbHVlKGJvb3N0IC8gKChmbG9hdCkgTWF0aC5zcXJ0KGxlbmd0aCkpKTsKICAgfQogICAgIAogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9Tb2xySW5kZXhTcGxpdHRlclRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1NvbHJJbmRleFNwbGl0dGVyVGVzdC5qYXZhCmluZGV4IGYwMTdlYmUuLjdlYTI2NjkgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1NvbHJJbmRleFNwbGl0dGVyVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1NvbHJJbmRleFNwbGl0dGVyVGVzdC5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsICJzY2hlbWExMi54bWwiKTsKICAgfQogCkBAIC0xMzUsMTIgKzEzNiwyMSBAQAogICAgICAgQ29yZURlc2NyaXB0b3IgZGNvcmUxID0gbmV3IENvcmVEZXNjcmlwdG9yKGguZ2V0Q29yZUNvbnRhaW5lcigpLCAic3BsaXQxIiwgaC5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRJbnN0YW5jZURpcigpKTsKICAgICAgIGRjb3JlMS5zZXREYXRhRGlyKGluZGV4RGlyMS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICBkY29yZTEuc2V0U2NoZW1hTmFtZSgic2NoZW1hMTIueG1sIik7CisgICAgICAKKyAgICAgIGlmIChoLmdldENvcmVDb250YWluZXIoKS5nZXRaa0NvbnRyb2xsZXIoKSAhPSBudWxsKSB7CisgICAgICAgIGguZ2V0Q29yZUNvbnRhaW5lcigpLnByZVJlZ2lzdGVySW5aayhkY29yZTEpOworICAgICAgfQorICAgICAgCiAgICAgICBjb3JlMSA9IGguZ2V0Q29yZUNvbnRhaW5lcigpLmNyZWF0ZShkY29yZTEpOwogICAgICAgaC5nZXRDb3JlQ29udGFpbmVyKCkucmVnaXN0ZXIoY29yZTEsIGZhbHNlKTsKIAogICAgICAgQ29yZURlc2NyaXB0b3IgZGNvcmUyID0gbmV3IENvcmVEZXNjcmlwdG9yKGguZ2V0Q29yZUNvbnRhaW5lcigpLCAic3BsaXQyIiwgaC5nZXRDb3JlKCkuZ2V0Q29yZURlc2NyaXB0b3IoKS5nZXRJbnN0YW5jZURpcigpKTsKICAgICAgIGRjb3JlMi5zZXREYXRhRGlyKGluZGV4RGlyMi5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICBkY29yZTIuc2V0U2NoZW1hTmFtZSgic2NoZW1hMTIueG1sIik7CisgICAgICAKKyAgICAgIGlmIChoLmdldENvcmVDb250YWluZXIoKS5nZXRaa0NvbnRyb2xsZXIoKSAhPSBudWxsKSB7CisgICAgICAgIGguZ2V0Q29yZUNvbnRhaW5lcigpLnByZVJlZ2lzdGVySW5aayhkY29yZTIpOworICAgICAgfQogICAgICAgY29yZTIgPSBoLmdldENvcmVDb250YWluZXIoKS5jcmVhdGUoZGNvcmUyKTsKICAgICAgIGguZ2V0Q29yZUNvbnRhaW5lcigpLnJlZ2lzdGVyKGNvcmUyLCBmYWxzZSk7CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1Rlc3RBdG9taWNVcGRhdGVFcnJvckNhc2VzLmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9UZXN0QXRvbWljVXBkYXRlRXJyb3JDYXNlcy5qYXZhCmluZGV4IDVkY2Y4ZDIuLmJhY2M4NWQgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL1Rlc3RBdG9taWNVcGRhdGVFcnJvckNhc2VzLmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvVGVzdEF0b21pY1VwZGF0ZUVycm9yQ2FzZXMuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCiAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOb1RMb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICB0cnkgeworICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsICJmYWxzZSIpOwogICAgICAgaW5pdENvcmUoInNvbHJjb25maWcueG1sIiwic2NoZW1hMTUueG1sIik7CiAgICAgICAKICAgICAgIFVwZGF0ZUhhbmRsZXIgdWggPSBoLmdldENvcmUoKS5nZXRVcGRhdGVIYW5kbGVyKCk7CkBAIC01Niw2ICs1Nyw3IEBACiAgICAgICB9CiAKICAgICB9IGZpbmFsbHkgeworICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIik7CiAgICAgICBkZWxldGVDb3JlKCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9BZGRTY2hlbWFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2Q4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLlRlc3RNYW5hZ2VkU2NoZW1hOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuRGF0ZVRpbWU7CitpbXBvcnQgb3JnLmpvZGEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmpvZGEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmpvZGEudGltZS5mb3JtYXQuSVNPRGF0ZVRpbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBmaWVsZCBtdXRhdGluZyB1cGRhdGUgcHJvY2Vzc29ycworICogdGhhdCBwYXJzZSBEYXRlcywgTG9uZ3MsIERvdWJsZXMsIGFuZCBCb29sZWFucy4KKyAqLworcHVibGljIGNsYXNzIEFkZFNjaGVtYUZpZWxkc1VwZGF0ZVByb2Nlc3NvckZhY3RvcnlUZXN0IGV4dGVuZHMgVXBkYXRlUHJvY2Vzc29yVGVzdEJhc2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MUkNPTkZJR19YTUwgPSAic29scmNvbmZpZy1hZGQtc2NoZW1hLWZpZWxkcy11cGRhdGUtcHJvY2Vzc29yLWNoYWlucy54bWwiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1hNTCAgICAgPSAic2NoZW1hLWFkZC1zY2hlbWEtZmllbGRzLXVwZGF0ZS1wcm9jZXNzb3IueG1sIjsKKworICBwcml2YXRlIHN0YXRpYyBGaWxlIHRtcFNvbHJIb21lOworICBwcml2YXRlIHN0YXRpYyBGaWxlIHRtcENvbmZEaXI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbGxlY3Rpb24gPSAiY29sbGVjdGlvbjEiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZkRpciA9IGNvbGxlY3Rpb24gKyAiL2NvbmYiOworCisgIEBCZWZvcmUKKyAgcHJpdmF0ZSB2b2lkIGluaXRNYW5hZ2VkU2NoZW1hQ29yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGNyZWF0ZVRlbXBEaXIoKTsKKyAgICBmaW5hbCBTdHJpbmcgdG1wU29sckhvbWVQYXRoCisgICAgICAgID0gVEVNUF9ESVIgKyBGaWxlLnNlcGFyYXRvciArIFRlc3RNYW5hZ2VkU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIHRtcFNvbHJIb21lID0gbmV3IEZpbGUodG1wU29sckhvbWVQYXRoKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICB0bXBDb25mRGlyID0gbmV3IEZpbGUodG1wU29sckhvbWUsIGNvbmZEaXIpOworICAgIEZpbGUgdGVzdEhvbWVDb25mRGlyID0gbmV3IEZpbGUoVEVTVF9IT01FKCksIGNvbmZEaXIpOworICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KG5ldyBGaWxlKHRlc3RIb21lQ29uZkRpciwgU09MUkNPTkZJR19YTUwpLCB0bXBDb25mRGlyKTsKKyAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShuZXcgRmlsZSh0ZXN0SG9tZUNvbmZEaXIsIFNDSEVNQV9YTUwpLCB0bXBDb25mRGlyKTsKKworICAgIC8vIGluaXRDb3JlIHdpbGwgdHJpZ2dlciBhbiB1cGdyYWRlIHRvIG1hbmFnZWQgc2NoZW1hLCBzaW5jZSB0aGUgc29scmNvbmZpZyoueG1sIGhhcworICAgIC8vIDxzY2hlbWFGYWN0b3J5IGNsYXNzPSJNYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5IiAuLi4gLz4KKyAgICBpbml0Q29yZShTT0xSQ09ORklHX1hNTCwgU0NIRU1BX1hNTCwgdG1wU29sckhvbWUuZ2V0UGF0aCgpKTsKKyAgfQorCisgIEBBZnRlcgorICBwcml2YXRlIHZvaWQgZGVsZXRlQ29yZUFuZFRlbXBTb2xySG9tZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGRlbGV0ZUNvcmUoKTsKKyAgICBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KHRtcFNvbHJIb21lKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUgPSAibmV3ZmllbGQxIjsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUpKTsKKyAgICBTdHJpbmcgZGF0ZVN0cmluZyA9ICIyMDEwLTExLTEyVDEzOjE0OjE1LjE2OFoiOworICAgIERhdGVUaW1lRm9ybWF0dGVyIGRhdGVUaW1lRm9ybWF0dGVyID0gSVNPRGF0ZVRpbWVGb3JtYXQuZGF0ZVRpbWUoKTsKKyAgICBEYXRlIGRhdGUgPSBkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKGRhdGVTdHJpbmcpLnRvRGF0ZSgpOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJhZGQtZmllbGRzLW5vLXJ1bi1wcm9jZXNzb3IiLCBkb2MoZigiaWQiLCAiMSIpLCBmKGZpZWxkTmFtZSwgZGF0ZSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZSkpOworICAgIGFzc2VydEVxdWFscygidGRhdGUiLCBzY2hlbWEuZ2V0RmllbGRUeXBlKGZpZWxkTmFtZSkuZ2V0VHlwZU5hbWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRmllbGRSb3VuZFRyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lID0gIm5ld2ZpZWxkMiI7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lKSk7CisgICAgRmxvYXQgZmxvYXRWYWx1ZSA9IC0xMzI1OC45OTJmOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJhZGQtZmllbGRzIiwgZG9jKGYoImlkIiwgIjIiKSwgZihmaWVsZE5hbWUsIGZsb2F0VmFsdWUpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRmbG9hdCIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lKS5nZXRUeXBlTmFtZSgpKTsKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6MiIpLCAiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUgKyAiJ10vZmxvYXRbLj0nIiArIGZsb2F0VmFsdWUudG9TdHJpbmcoKSArICInXSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZpZWxkTWl4ZWRGaWVsZFR5cGVzUm91bmRUcmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSA9ICJuZXdmaWVsZDMiOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZSkpOworICAgIEZsb2F0IGZpZWxkVmFsdWUxID0gLTEzMjU4LjBmOworICAgIERvdWJsZSBmaWVsZFZhbHVlMiA9IDguNDgyODgwMDgwOEUxMDsgCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQKKyAgICAgICAgKCJhZGQtZmllbGRzIiwgZG9jKGYoImlkIiwgIjMiKSwgZihmaWVsZE5hbWUsIGZpZWxkVmFsdWUxLCBmaWVsZFZhbHVlMikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZSkpOworICAgIGFzc2VydEVxdWFscygidGRvdWJsZSIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lKS5nZXRUeXBlTmFtZSgpKTsKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6MyIpCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUgKyAiJ10vZG91YmxlWy49JyIgKyBmaWVsZFZhbHVlMS50b1N0cmluZygpICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lICsgIiddL2RvdWJsZVsuPSciICsgZmllbGRWYWx1ZTIudG9TdHJpbmcoKSArICInXSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZpZWxkRGVmYXVsdEZpZWxkVHlwZVJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUgPSAibmV3ZmllbGQ0IjsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUpKTsKKyAgICBGbG9hdCBmaWVsZFZhbHVlMSA9IC0xMzI1OC4wZjsKKyAgICBEb3VibGUgZmllbGRWYWx1ZTIgPSA4LjQ4Mjg4MDA4MDhFMTA7CisgICAgU3RyaW5nIGZpZWxkVmFsdWUzID0gImJsYWggYmxhaCI7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQKKyAgICAgICAgKCJhZGQtZmllbGRzIiwgZG9jKGYoImlkIiwgIjQiKSwgZihmaWVsZE5hbWUsIGZpZWxkVmFsdWUxLCBmaWVsZFZhbHVlMiwgZmllbGRWYWx1ZTMpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBzY2hlbWEuZ2V0RmllbGRUeXBlKGZpZWxkTmFtZSkuZ2V0VHlwZU5hbWUoKSk7CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjQiKQorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lICsgIiddL3N0clsuPSciICsgZmllbGRWYWx1ZTEudG9TdHJpbmcoKSArICInXSIKKyAgICAgICAgLCIvL2FycltAbmFtZT0nIiArIGZpZWxkTmFtZSArICInXS9zdHJbLj0nIiArIGZpZWxkVmFsdWUyLnRvU3RyaW5nKCkgKyAiJ10iCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUgKyAiJ10vc3RyWy49JyIgKyBmaWVsZFZhbHVlMy50b1N0cmluZygpICsgIiddIgorICAgICk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVGaWVsZHNSb3VuZFRyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lMSA9ICJuZXdmaWVsZDUiOworICAgIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUyID0gIm5ld2ZpZWxkNiI7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lMSkpOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZTIpKTsKKyAgICBGbG9hdCBmaWVsZDFWYWx1ZTEgPSAtMTMyNTguMGY7CisgICAgRG91YmxlIGZpZWxkMVZhbHVlMiA9IDguNDgyODgwMDgwOEUxMDsKKyAgICBMb25nIGZpZWxkMVZhbHVlMyA9IDk5OUw7CisgICAgSW50ZWdlciBmaWVsZDJWYWx1ZTEgPSA1NTEyMzsKKyAgICBMb25nIGZpZWxkMlZhbHVlMiA9IDEyMzQ1Njc4OTAxMjM0NTY3ODlMOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkCisgICAgICAgICgiYWRkLWZpZWxkcyIsIGRvYyhmKCJpZCIsICI1IiksIGYoZmllbGROYW1lMSwgZmllbGQxVmFsdWUxLCBmaWVsZDFWYWx1ZTIsIGZpZWxkMVZhbHVlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoZmllbGROYW1lMiwgZmllbGQyVmFsdWUxLCBmaWVsZDJWYWx1ZTIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUxKSk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lMikpOworICAgIGFzc2VydEVxdWFscygidGRvdWJsZSIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lMSkuZ2V0VHlwZU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0bG9uZyIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lMikuZ2V0VHlwZU5hbWUoKSk7CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjUiKQorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMSArICInXS9kb3VibGVbLj0nIiArIGZpZWxkMVZhbHVlMS50b1N0cmluZygpICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMSArICInXS9kb3VibGVbLj0nIiArIGZpZWxkMVZhbHVlMi50b1N0cmluZygpICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMSArICInXS9kb3VibGVbLj0nIiArIGZpZWxkMVZhbHVlMy5kb3VibGVWYWx1ZSgpICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMiArICInXS9sb25nWy49JyIgKyBmaWVsZDJWYWx1ZTEudG9TdHJpbmcoKSArICInXSIKKyAgICAgICAgLCIvL2FycltAbmFtZT0nIiArIGZpZWxkTmFtZTIgKyAiJ10vbG9uZ1suPSciICsgZmllbGQyVmFsdWUyLnRvU3RyaW5nKCkgKyAiJ10iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZEFkZE11bHRpcGxlRmllbGRzUm91bmRUcmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZTEgPSAibmV3ZmllbGQ3IjsKKyAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lMiA9ICJuZXdmaWVsZDgiOworICAgIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUzID0gIm5ld2ZpZWxkOSI7CisgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZTQgPSAibmV3ZmllbGQxMCI7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lMSkpOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZTIpKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUzKSk7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lNCkpOworICAgIFN0cmluZyBmaWVsZDFTdHJpbmcxID0gIi0xMywyNTguMCI7IAorICAgIEZsb2F0IGZpZWxkMVZhbHVlMSA9IC0xMzI1OC4wZjsKKyAgICBTdHJpbmcgZmllbGQxU3RyaW5nMiA9ICI4NCw4MjgsODAwLDgwOC4wIjsgCisgICAgRG91YmxlIGZpZWxkMVZhbHVlMiA9IDguNDgyODgwMDgwOEUxMDsKKyAgICBTdHJpbmcgZmllbGQxU3RyaW5nMyA9ICI5OTkiOworICAgIExvbmcgZmllbGQxVmFsdWUzID0gOTk5TDsKKyAgICBTdHJpbmcgZmllbGQyU3RyaW5nMSA9ICI1NSwxMjMiOworICAgIEludGVnZXIgZmllbGQyVmFsdWUxID0gNTUxMjM7CisgICAgU3RyaW5nIGZpZWxkMlN0cmluZzIgPSAiMSwyMzQsNTY3LDg5MCwxMjMsNDU2LDc4OSI7CisgICAgTG9uZyBmaWVsZDJWYWx1ZTIgPSAxMjM0NTY3ODkwMTIzNDU2Nzg5TDsKKyAgICBTdHJpbmcgZmllbGQzU3RyaW5nMSA9ICJibGFoLWJsYWgiOworICAgIFN0cmluZyBmaWVsZDNWYWx1ZTEgPSBmaWVsZDNTdHJpbmcxOworICAgIFN0cmluZyBmaWVsZDNTdHJpbmcyID0gIi01LjI4RS0zIjsKKyAgICBEb3VibGUgZmllbGQzVmFsdWUyID0gLTUuMjhFLTM7CisgICAgU3RyaW5nIGZpZWxkNFN0cmluZzEgPSAiMTk5OS0wNC0xNyAxNzo0MiI7CisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXIgPSBEYXRlVGltZUZvcm1hdC5mb3JQYXR0ZXJuKCJ5eXl5LU1NLWRkIEhIOm1tIikud2l0aFpvbmVVVEMoKTsKKyAgICBEYXRlVGltZSBkYXRlVGltZSA9ICBkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKGZpZWxkNFN0cmluZzEpOworICAgIERhdGUgZmllbGQ0VmFsdWUxID0gZGF0ZVRpbWUudG9EYXRlKCk7CisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXIyID0gRGF0ZVRpbWVGb3JtYXQuZm9yUGF0dGVybigieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIikud2l0aFpvbmVVVEMoKTsKKyAgICBTdHJpbmcgZmllbGQ0VmFsdWUxU3RyaW5nID0gZGF0ZVRpbWVGb3JtYXR0ZXIyLnByaW50KGRhdGVUaW1lKSArICJaIjsKKyAgICAKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZAorICAgICAgICAoInBhcnNlLWFuZC1hZGQtZmllbGRzIiwgZG9jKGYoImlkIiwgIjYiKSwgZihmaWVsZE5hbWUxLCBmaWVsZDFTdHJpbmcxLCBmaWVsZDFTdHJpbmcyLCBmaWVsZDFTdHJpbmczKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoZmllbGROYW1lMiwgZmllbGQyU3RyaW5nMSwgZmllbGQyU3RyaW5nMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKGZpZWxkTmFtZTMsIGZpZWxkM1N0cmluZzEsIGZpZWxkM1N0cmluZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZihmaWVsZE5hbWU0LCBmaWVsZDRTdHJpbmcxKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lMSkpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZTIpKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbChmaWVsZE5hbWUzKSk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoZmllbGROYW1lNCkpOworICAgIGFzc2VydEVxdWFscygidGRvdWJsZSIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lMSkuZ2V0VHlwZU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0bG9uZyIsIHNjaGVtYS5nZXRGaWVsZFR5cGUoZmllbGROYW1lMikuZ2V0VHlwZU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0Iiwgc2NoZW1hLmdldEZpZWxkVHlwZShmaWVsZE5hbWUzKS5nZXRUeXBlTmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRkYXRlIiwgc2NoZW1hLmdldEZpZWxkVHlwZShmaWVsZE5hbWU0KS5nZXRUeXBlTmFtZSgpKTsKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6NiIpCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUxICsgIiddL2RvdWJsZVsuPSciICsgZmllbGQxVmFsdWUxLnRvU3RyaW5nKCkgKyAiJ10iCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUxICsgIiddL2RvdWJsZVsuPSciICsgZmllbGQxVmFsdWUyLnRvU3RyaW5nKCkgKyAiJ10iCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUxICsgIiddL2RvdWJsZVsuPSciICsgZmllbGQxVmFsdWUzLmRvdWJsZVZhbHVlKCkgKyAiJ10iCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWUyICsgIiddL2xvbmdbLj0nIiArIGZpZWxkMlZhbHVlMS50b1N0cmluZygpICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMiArICInXS9sb25nWy49JyIgKyBmaWVsZDJWYWx1ZTIudG9TdHJpbmcoKSArICInXSIKKyAgICAgICAgLCIvL2FycltAbmFtZT0nIiArIGZpZWxkTmFtZTMgKyAiJ10vc3RyWy49JyIgKyBmaWVsZDNTdHJpbmcxICsgIiddIgorICAgICAgICAsIi8vYXJyW0BuYW1lPSciICsgZmllbGROYW1lMyArICInXS9zdHJbLj0nIiArIGZpZWxkM1N0cmluZzIgKyAiJ10iCisgICAgICAgICwiLy9hcnJbQG5hbWU9JyIgKyBmaWVsZE5hbWU0ICsgIiddL2RhdGVbLj0nIiArIGZpZWxkNFZhbHVlMVN0cmluZyArICInXSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvRmllbGRNdXRhdGluZ1VwZGF0ZVByb2Nlc3NvclRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yVGVzdC5qYXZhCmluZGV4IDM5YzRiM2QuLjI5NjUyOTIgMTAwNjQ0Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yVGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9GaWVsZE11dGF0aW5nVXBkYXRlUHJvY2Vzc29yVGVzdC5qYXZhCkBAIC01NTIsNiArNTUyLDggQEAKICAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKICAgICBhc3NlcnROdWxsKCJ0ZXN0IGV4cGVjdHMgJ2Zvb19naWJlcmlzaCcgdG8gbm90IGJlIGEgdmFsaWQgZmllbGQsIGxvb2tzIGxpa2Ugc2NoZW1hIHdhcyBjaGFuZ2VkIG91dCBmcm9tIHVuZGVyIHVzIiwKICAgICAgICAgICAgICAgIHNjaGVtYS5nZXRGaWVsZFR5cGVOb0V4KCJmb29fZ2liZXJpc2giKSk7CisgICAgYXNzZXJ0TnVsbCgidGVzdCBleHBlY3RzICdiYXJfZ2liZXJpc2gnIHRvIG5vdCBiZSBhIHZhbGlkIGZpZWxkLCBsb29rcyBsaWtlIHNjaGVtYSB3YXMgY2hhbmdlZCBvdXQgZnJvbSB1bmRlciB1cyIsCisgICAgICAgICAgICAgICBzY2hlbWEuZ2V0RmllbGRUeXBlTm9FeCgiYmFyX2dpYmVyaXNoIikpOwogICAgIGFzc2VydE5vdE51bGwoInRlc3QgZXhwZWN0cyAndF9yYXcnIHRvIGJlIGEgdmFsaWQgZmllbGQsIGxvb2tzIGxpa2Ugc2NoZW1hIHdhcyBjaGFuZ2VkIG91dCBmcm9tIHVuZGVyIHVzIiwKICAgICAgICAgICAgICAgICAgIHNjaGVtYS5nZXRGaWVsZFR5cGVOb0V4KCJ0X3JhdyIpKTsKICAgICBhc3NlcnROb3ROdWxsKCJ0ZXN0IGV4cGVjdHMgJ2Zvb19zJyB0byBiZSBhIHZhbGlkIGZpZWxkLCBsb29rcyBsaWtlIHNjaGVtYSB3YXMgY2hhbmdlZCBvdXQgZnJvbSB1bmRlciB1cyIsCkBAIC01NjEsMTEgKzU2MywxMyBAQAogICAgIAogICAgIGQgPSBwcm9jZXNzQWRkKCJpZ25vcmUtbm90LWluLXNjaGVtYSIsICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTExIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImJhcl9naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGYoInRfcmF3IiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX3MiLCAiaG9zcyIpKSk7CiAgICAgCiAgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJiYXJfZ2liZXJpc2giKSk7CiAgICAgYXNzZXJ0RmFsc2UoZC5jb250YWluc0tleSgiZm9vX2dpYmVyaXNoIikpOwogICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksIAogICAgICAgICAgICAgICAgICBkLmdldEZpZWxkVmFsdWVzKCJ0X3JhdyIpKTsKQEAgLTU3NCwxNSArNTc4LDk4IEBACiAgICAgZCA9IHByb2Nlc3NBZGQoImlnbm9yZS1zb21lIiwKICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiMTExMSIpLAogICAgICAgICAgICAgICAgICAgICAgICBmKCJmb29fZ2liZXJpc2giLCAiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICAgICAgICBmKCJiYXJfZ2liZXJpc2giLCAiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAogICAgICAgICAgICAgICAgICAgICAgICBmKCJ0X3JhdyIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19zIiwgImhvc3MiKSkpOwogCiAgICAgYXNzZXJ0Tm90TnVsbChkKTsKICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLCAKICAgICAgICAgICAgICAgICAgZC5nZXRGaWVsZFZhbHVlcygiZm9vX2dpYmVyaXNoIikpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksIAorICAgICAgICAgICAgICAgICBkLmdldEZpZWxkVmFsdWVzKCJiYXJfZ2liZXJpc2giKSk7CiAgICAgYXNzZXJ0RmFsc2UoZC5jb250YWluc0tleSgidF9yYXciKSk7CiAgICAgYXNzZXJ0RXF1YWxzKCJob3NzIiwgZC5nZXRGaWVsZFZhbHVlKCJmb29fcyIpKTsKLSAgICAKKworICAgIGQgPSBwcm9jZXNzQWRkKCJpZ25vcmUtbm90LWluLXNjaGVtYS1leHBsaWNpdC1zZWxlY3RvciIsCisgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgIjExMTEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX2dpYmVyaXNoIiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiYmFyX2dpYmVyaXNoIiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigidF9yYXciLCAiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICAgICAgICBmKCJmb29fcyIsICJob3NzIikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGFzc2VydEZhbHNlKGQuY29udGFpbnNLZXkoImZvb19naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJiYXJfZ2liZXJpc2giKSk7CisgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgZC5nZXRGaWVsZFZhbHVlcygidF9yYXciKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3NzIiwgZC5nZXRGaWVsZFZhbHVlKCJmb29fcyIpKTsKKworICAgIGQgPSBwcm9jZXNzQWRkKCJpZ25vcmUtbm90LWluLXNjaGVtYS1hbmQtZm9vLW5hbWUtcHJlZml4IiwKKyAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiMTExMSIpLAorICAgICAgICAgICAgICAgICAgICAgICBmKCJmb29fZ2liZXJpc2giLCAiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICAgICAgICBmKCJiYXJfZ2liZXJpc2giLCAiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICAgICAgICBmKCJ0X3JhdyIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19zIiwgImhvc3MiKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0RmFsc2UoZC5jb250YWluc0tleSgiZm9vX2dpYmVyaXNoIikpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgIGQuZ2V0RmllbGRWYWx1ZXMoImJhcl9naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICBkLmdldEZpZWxkVmFsdWVzKCJ0X3JhdyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3MiLCBkLmdldEZpZWxkVmFsdWUoImZvb19zIikpOworCisgICAgZCA9IHByb2Nlc3NBZGQoImlnbm9yZS1mb28tbmFtZS1wcmVmaXgtZXhjZXB0LW5vdC1zY2hlbWEiLAorICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTExIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImJhcl9naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoInRfcmF3IiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX3MiLCAiaG9zcyIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiMTIzNDU2Nzg5IiwgIiIsIDQyLCAiYWJjZCIpLAorICAgICAgICAgICAgICAgICBkLmdldEZpZWxkVmFsdWVzKCJmb29fZ2liZXJpc2giKSk7CisgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgZC5nZXRGaWVsZFZhbHVlcygiYmFyX2dpYmVyaXNoIikpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgIGQuZ2V0RmllbGRWYWx1ZXMoInRfcmF3IikpOworICAgIGFzc2VydEZhbHNlKGQuY29udGFpbnNLZXkoImZvb19zIikpOworCisgICAgZCA9IHByb2Nlc3NBZGQoImlnbm9yZS1pbi1zY2hlbWEiLAorICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTExIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImJhcl9naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoInRfcmF3IiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX3MiLCAiaG9zcyIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuY29udGFpbnNLZXkoImZvb19naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRUcnVlKGQuY29udGFpbnNLZXkoImJhcl9naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJpZCIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJ0X3JhdyIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJmb29fcyIpKTsKKworICAgIGQgPSBwcm9jZXNzQWRkKCJpZ25vcmUtbm90LWluLXNjaGVtYS1leHBsaWNpdC1zdHItc2VsZWN0b3IiLAorICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTExIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImJhcl9naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoInRfcmF3IiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX3MiLCAiaG9zcyIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJmb29fZ2liZXJpc2giKSk7CisgICAgYXNzZXJ0RmFsc2UoZC5jb250YWluc0tleSgiYmFyX2dpYmVyaXNoIikpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgIGQuZ2V0RmllbGRWYWx1ZXMoInRfcmF3IikpOworICAgIGFzc2VydEVxdWFscygiaG9zcyIsIGQuZ2V0RmllbGRWYWx1ZSgiZm9vX3MiKSk7CisKKyAgICBkID0gcHJvY2Vzc0FkZCgiaWdub3JlLWluLXNjaGVtYS1zdHItc2VsZWN0b3IiLAorICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTExIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImZvb19naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoImJhcl9naWJlcmlzaCIsICIxMjM0NTY3ODkiLCAiIiwgNDIsICJhYmNkIiksCisgICAgICAgICAgICAgICAgICAgICAgIGYoInRfcmF3IiwgIjEyMzQ1Njc4OSIsICIiLCA0MiwgImFiY2QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZigiZm9vX3MiLCAiaG9zcyIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuY29udGFpbnNLZXkoImZvb19naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRUcnVlKGQuY29udGFpbnNLZXkoImJhcl9naWJlcmlzaCIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJpZCIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJ0X3JhdyIpKTsKKyAgICBhc3NlcnRGYWxzZShkLmNvbnRhaW5zS2V5KCJmb29fcyIpKTsKIAogICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzaW5nRmllbGRVcGRhdGVQcm9jZXNzb3JzVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1BhcnNpbmdGaWVsZFVwZGF0ZVByb2Nlc3NvcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlNmMyMQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9QYXJzaW5nRmllbGRVcGRhdGVQcm9jZXNzb3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXBkYXRlLnByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkRhdGVUaW1lOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuRGF0ZVRpbWVab25lOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5qb2RhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOworaW1wb3J0IG9yZy5qb2RhLnRpbWUuZm9ybWF0LklTT0RhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIGZpZWxkIG11dGF0aW5nIHVwZGF0ZSBwcm9jZXNzb3JzCisgKiB0aGF0IHBhcnNlIERhdGVzLCBMb25ncywgRG91YmxlcywgYW5kIEJvb2xlYW5zLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2luZ0ZpZWxkVXBkYXRlUHJvY2Vzc29yc1Rlc3QgZXh0ZW5kcyBVcGRhdGVQcm9jZXNzb3JUZXN0QmFzZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFUFNJTE9OID0gMUUtMTU7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLXBhcnNpbmctdXBkYXRlLXByb2Nlc3Nvci1jaGFpbnMueG1sIiwgInNjaGVtYTEyLnhtbCIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGF0ZVJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkYXRlX2R0IikpOyAvLyBzaG91bGQgbWF0Y2ggIipfZHQiIGR5bmFtaWMgZmllbGQKKyAgICBTdHJpbmcgZGF0ZVN0cmluZyA9ICIyMDEwLTExLTEyVDEzOjE0OjE1LjE2OFoiOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1kYXRlIiwgZG9jKGYoImlkIiwgIjkiKSwgZigiZGF0ZV9kdCIsIGRhdGVTdHJpbmcpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBEYXRlVGltZUZvcm1hdHRlciBkYXRlVGltZUZvcm1hdHRlciA9IElTT0RhdGVUaW1lRm9ybWF0LmRhdGVUaW1lKCk7CisgICAgRGF0ZVRpbWUgZGF0ZVRpbWUgPSBkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKGRhdGVTdHJpbmcpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJkYXRlX2R0IikgaW5zdGFuY2VvZiBEYXRlKTsKKyAgICBhc3NlcnRFcXVhbHMoZGF0ZVRpbWUuZ2V0TWlsbGlzKCksICgoRGF0ZSkgZC5nZXRGaWVsZFZhbHVlKCJkYXRlX2R0IikpLmdldFRpbWUoKSk7CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjkiKSwgIi8vZGF0ZVtAbmFtZT0nZGF0ZV9kdCddWy49JyIgKyBkYXRlU3RyaW5nICsgIiddIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VUcmllRGF0ZVJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkYXRlX3RkdCIpKTsgLy8gc2hvdWxkIG1hdGNoICIqX3RkdCIgZHluYW1pYyBmaWVsZAorICAgIFN0cmluZyBkYXRlU3RyaW5nID0gIjIwMTAtMTEtMTJUMTM6MTQ6MTUuMTY4WiI7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRhdGUiLCBkb2MoZigiaWQiLCAiMzkiKSwgZigiZGF0ZV90ZHQiLCBkYXRlU3RyaW5nKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXIgPSBJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpOworICAgIERhdGVUaW1lIGRhdGVUaW1lID0gZGF0ZVRpbWVGb3JtYXR0ZXIucGFyc2VEYXRlVGltZShkYXRlU3RyaW5nKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZGF0ZV90ZHQiKSBpbnN0YW5jZW9mIERhdGUpOworICAgIGFzc2VydEVxdWFscyhkYXRlVGltZS5nZXRNaWxsaXMoKSwgKChEYXRlKSBkLmdldEZpZWxkVmFsdWUoImRhdGVfdGR0IikpLmdldFRpbWUoKSk7CisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjM5IiksICIvL2RhdGVbQG5hbWU9J2RhdGVfdGR0J11bLj0nIiArIGRhdGVTdHJpbmcgKyAiJ10iKTsKKyAgfQorCisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGF0ZUZpZWxkTm90SW5TY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBTdHJpbmcgZGF0ZVN0cmluZyA9ICIyMDEwLTExLTEyVDEzOjE0OjE1LjE2OFoiOworICAgIERhdGVUaW1lRm9ybWF0dGVyIGRhdGVUaW1lRm9ybWF0dGVyID0gSVNPRGF0ZVRpbWVGb3JtYXQuZGF0ZVRpbWUoKTsKKyAgICBEYXRlVGltZSBkYXRlVGltZSA9IGRhdGVUaW1lRm9ybWF0dGVyLnBhcnNlRGF0ZVRpbWUoZGF0ZVN0cmluZyk7CisKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtZGF0ZS1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiMTgiKSwgZigibm90X2luX3NjaGVtYSIsIGRhdGVTdHJpbmcpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGVUaW1lLmdldE1pbGxpcygpLCAoKERhdGUpZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hIikpLmdldFRpbWUoKSk7CisgICAgCisgICAgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRhdGUtbm8tcnVuLXByb2Nlc3NvciIsIAorICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIzNiIpLCBmKCJub3RfaW5fc2NoZW1hIiwgIm5vdCBhIGRhdGUiLCBkYXRlU3RyaW5nKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgZm9yIChPYmplY3QgdmFsIDogZC5nZXRGaWVsZFZhbHVlcygibm90X2luX3NjaGVtYSIpKSB7CisgICAgICAvLyBjaGVjayB0aGF0IG5vdGhpbmcgd2FzIG11dGF0ZWQsIHNpbmNlIG5vdCBhbGwgZmllbGQgdmFsdWVzIGFyZSBwYXJzZWFibGUgYXMgZGF0ZXMgCisgICAgICBhc3NlcnRUcnVlKHZhbCBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgfQorCisgICAgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRhdGUtbm8tcnVuLXByb2Nlc3NvciIsCisgICAgICAgIGRvYyhmKCJpZCIsICI3MiIpLCBmKCJub3RfaW5fc2NoZW1hIiwgZGF0ZVN0cmluZywgIm5vdCBhIGRhdGUiKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgZm9yIChPYmplY3QgdmFsIDogZC5nZXRGaWVsZFZhbHVlcygibm90X2luX3NjaGVtYSIpKSB7CisgICAgICAvLyBjaGVjayBhZ2FpbiB0aGF0IG5vdGhpbmcgd2FzIG11dGF0ZWQsIGJ1dCB3aXRoIGEgdmFsaWQgZGF0ZSBmaXJzdCB0aGlzIHRpbWUgCisgICAgICBhc3NlcnRUcnVlKHZhbCBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VEYXRlTm9uVVRDZGVmYXVsdFRpbWVab25lUm91bmRUcmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImRhdGVfZHQiKSk7IC8vIHNob3VsZCBtYXRjaCAiKl9kdCIgZHluYW1pYyBmaWVsZAorICAgIFN0cmluZyBkYXRlU3RyaW5nTm9UaW1lWm9uZSAgICAgICAgID0gIjIwMTAtMTEtMTJUMTM6MTQ6MTUuMTY4IjsKKyAgICBTdHJpbmcgZGF0ZVN0cmluZ1VUQyA9IGRhdGVTdHJpbmdOb1RpbWVab25lICsgIloiOworCisgICAgLy8gZGF0ZVN0cmluZ05vVGltZVpvbmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgaW4gdGltZVpvbmUgQW1lcmljYS9OZXdfWW9yaywgdGhlbiBwcmludGVkIGFzIFVUQworICAgIFN0cmluZyBkYXRlU3RyaW5nVVNFYXN0ZXJuVGltZUFzVVRDID0gIjIwMTAtMTEtMTJUMTg6MTQ6MTUuMTY4WiI7CisgICAgCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQKKyAgICAgICAgKCJwYXJzZS1kYXRlLW5vbi1VVEMtZGVmYXVsdFRpbWVab25lIiwgZG9jKGYoImlkIiwgIjk5IiksIGYoImRhdGVVVENfZHQiLCBkYXRlU3RyaW5nVVRDKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCJkYXRlTm9UaW1lWm9uZV9kdCIsIGRhdGVTdHJpbmdOb1RpbWVab25lKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgU3RyaW5nIHBhdHRlcm4gPSAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1oiOworICAgIERhdGVUaW1lRm9ybWF0dGVyIGRhdGVUaW1lRm9ybWF0dGVyVVRDID0gRGF0ZVRpbWVGb3JtYXQuZm9yUGF0dGVybihwYXR0ZXJuKTsKKyAgICBEYXRlVGltZSBkYXRlVGltZVVUQyA9IGRhdGVUaW1lRm9ybWF0dGVyVVRDLnBhcnNlRGF0ZVRpbWUoZGF0ZVN0cmluZ1VUQyk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImRhdGVVVENfZHQiKSBpbnN0YW5jZW9mIERhdGUpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJkYXRlTm9UaW1lWm9uZV9kdCIpIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGVUaW1lVVRDLmdldE1pbGxpcygpLCAoKERhdGUpIGQuZ2V0RmllbGRWYWx1ZSgiZGF0ZVVUQ19kdCIpKS5nZXRUaW1lKCkpOworICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgIGFzc2VydFEocmVxKCJpZDo5OSIpIAorICAgICAgICAsIi8vZGF0ZVtAbmFtZT0nZGF0ZVVUQ19kdCddWy49JyIgKyBkYXRlU3RyaW5nVVRDICsgIiddIgorICAgICAgICAsIi8vZGF0ZVtAbmFtZT0nZGF0ZU5vVGltZVpvbmVfZHQnXVsuPSciICsgZGF0ZVN0cmluZ1VTRWFzdGVyblRpbWVBc1VUQyArICInXSIpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VEYXRlRXhwbGljaXROb3RJblNjaGVtYVNlbGVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoIm5vdF9pbl9zY2hlbWEiKSk7CisgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSAiMjAxMC0xMS0xMlQxMzoxNDoxNS4xNjhaIjsKKyAgICBEYXRlVGltZUZvcm1hdHRlciBkYXRlVGltZUZvcm1hdHRlciA9IElTT0RhdGVUaW1lRm9ybWF0LmRhdGVUaW1lKCk7CisgICAgRGF0ZVRpbWUgZGF0ZVRpbWUgPSBkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKGRhdGVTdHJpbmcpOworCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRhdGUtZXhwbGljaXQtbm90LWluLXNjaGVtYS1zZWxlY3Rvci1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiODgiKSwgZigibm90X2luX3NjaGVtYSIsIGRhdGVTdHJpbmcpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGVUaW1lLmdldE1pbGxpcygpLCAoKERhdGUpZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hIikpLmdldFRpbWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VEYXRlRXhwbGljaXRUeXBlQ2xhc3NTZWxlY3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkYXRlX2R0IikpOworICAgIFN0cmluZyBkYXRlU3RyaW5nID0gIjIwMTAtMTEtMTJUMTM6MTQ6MTUuMTY4WiI7CisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXIgPSBJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpOworICAgIERhdGVUaW1lIGRhdGVUaW1lID0gZGF0ZVRpbWVGb3JtYXR0ZXIucGFyc2VEYXRlVGltZShkYXRlU3RyaW5nKTsKKworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1kYXRlLWV4cGxpY2l0LXR5cGVjbGFzcy1zZWxlY3Rvci1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiNzciKSwgZigiZGF0ZV9kdCIsIGRhdGVTdHJpbmcpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZGF0ZV9kdCIpIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGVUaW1lLmdldE1pbGxpcygpLCAoKERhdGUpZC5nZXRGaWVsZFZhbHVlKCJkYXRlX2R0IikpLmdldFRpbWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVU1BhY2lmaWNEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoIm5vdF9pbl9zY2hlbWEiKSk7CisgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSAiOC85LzIwMTAiOyAgLy8gSW50ZXJwcmV0ZWQgYXMgMDA6MDAgVVMgUGFjaWZpYyBEYXlsaWdodCBUaW1lID0gVVRDKzA3OjAwCisgICAgU3RyaW5nIGRhdGVTdHJpbmdVVEMgPSAiMjAxMC0wOC0wOVQwNzowMDowMC4wMDBaIjsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgiVVMtUGFjaWZpYy1wYXJzZS1kYXRlLW5vLXJ1bi1wcm9jZXNzb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIyODgiKSwgZigibm90X2luX3NjaGVtYSIsIGRhdGVTdHJpbmcpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGVTdHJpbmdVVEMsIAorICAgICAgICAgICAgICAgICAobmV3IERhdGVUaW1lKCgoRGF0ZSlkLmdldEZpZWxkVmFsdWUoIm5vdF9pbl9zY2hlbWEiKSkuZ2V0VGltZSgpLERhdGVUaW1lWm9uZS5VVEMpKS50b1N0cmluZygpKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGF0ZUZvcm1hdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdbXSBmb3JtYXRFeGFtcGxlcyA9IHsgCisgICAgICAgICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWiIsICAiMjAxMC0wMS0xNVQwMDowMDowMC4wMDBaIiwKKyAgICAgICAgInl5eXktTU0tZGQnVCdISDptbTpzcyxTU1NaIiwgICIyMDEwLTAxLTE1VDAwOjAwOjAwLDAwMFoiLAorICAgICAgICAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUyIsICAgIjIwMTAtMDEtMTVUMDA6MDA6MDAuMDAwIiwKKyAgICAgICAgInl5eXktTU0tZGQnVCdISDptbTpzcyxTU1MiLCAgICIyMDEwLTAxLTE1VDAwOjAwOjAwLDAwMCIsCisgICAgICAgICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NaIiwgICAgICAiMjAxMC0wMS0xNVQwMDowMDowMFoiLAorICAgICAgICAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiwgICAgICAgIjIwMTAtMDEtMTVUMDA6MDA6MDAiLAorICAgICAgICAieXl5eS1NTS1kZCdUJ0hIOm1tWiIsICAgICAgICAgIjIwMTAtMDEtMTVUMDA6MDBaIiwKKyAgICAgICAgInl5eXktTU0tZGQnVCdISDptbSIsICAgICAgICAgICIyMDEwLTAxLTE1VDAwOjAwIiwKKyAgICAgICAgInl5eXktTU0tZGQgSEg6bW06c3MuU1NTWiIsICAgICIyMDEwLTAxLTE1IDAwOjAwOjAwLjAwMFoiLAorICAgICAgICAieXl5eS1NTS1kZCBISDptbTpzcyxTU1NaIiwgICAgIjIwMTAtMDEtMTUgMDA6MDA6MDAsMDAwWiIsCisgICAgICAgICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyIsICAgICAiMjAxMC0wMS0xNSAwMDowMDowMC4wMDAiLAorICAgICAgICAieXl5eS1NTS1kZCBISDptbTpzcyxTU1MiLCAgICAgIjIwMTAtMDEtMTUgMDA6MDA6MDAsMDAwIiwKKyAgICAgICAgInl5eXktTU0tZGQgSEg6bW06c3NaIiwgICAgICAgICIyMDEwLTAxLTE1IDAwOjAwOjAwWiIsCisgICAgICAgICJ5eXl5LU1NLWRkIEhIOm1tOnNzIiwgICAgICAgICAiMjAxMC0wMS0xNSAwMDowMDowMCIsCisgICAgICAgICJ5eXl5LU1NLWRkIEhIOm1tWiIsICAgICAgICAgICAiMjAxMC0wMS0xNSAwMDowMFoiLAorICAgICAgICAieXl5eS1NTS1kZCBISDptbSIsICAgICAgICAgICAgIjIwMTAtMDEtMTUgMDA6MDAiLAorICAgICAgICAieXl5eS1NTS1kZCBoaDptbSBhIiwgICAgICAgICAgIjIwMTAtMDEtMTUgMTI6MDAgQU0iLAorICAgICAgICAieXl5eS1NTS1kZCBoaDptbWEiLCAgICAgICAgICAgIjIwMTAtMDEtMTUgMTI6MDBBTSIsCisgICAgICAgICJ5eXl5LU1NLWRkIiwgICAgICAgICAgICAgICAgICAiMjAxMC0wMS0xNSIsCisgICAgICAgICJFRUUgTU1NIGRkIEhIOm1tOnNzIFogeXl5eSIsICAiRnJpIEphbiAxNSAwMDowMDowMCArMDAwMCAyMDEwIiwKKyAgICAgICAgIkVFRSBNTU0gZGQgSEg6bW06c3MgeXl5eSBaIiwgICJGcmkgSmFuIDE1IDAwOjAwOjAwIDIwMTAgKzAwOjAwIiwKKyAgICAgICAgIkVFRSBNTU0gZGQgSEg6bW06c3MgeXl5eSIsICAgICJGcmkgSmFuIDE1IDAwOjAwOjAwIDIwMTAiLAorICAgICAgICAiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaIiwgIkZyaSwgMTUgSmFuIDIwMTAgMDA6MDA6MDAgKzAwOjAwIiwKKyAgICAgICAgIkVFRUUsIGRkLU1NTS15eSBISDptbTpzcyBaIiwgICJGcmlkYXksIDE1LUphbi0xMCAwMDowMDowMCArMDA6MDAiLAorICAgICAgICAiRUVFRSwgTU1NTSBkZCwgeXl5eSIsICAgICAgICAgIkZyaWRheSwgSmFudWFyeSAxNSwgMjAxMCIsCisgICAgICAgICJNTU1NIGRkLCB5eXl5IiwgICAgICAgICAgICAgICAiSmFudWFyeSAxNSwgMjAxMCIsCisgICAgICAgICJNTU0uIGRkLCB5eXl5IiwgICAgICAgICAgICAgICAiSmFuLiAxNSwgMjAxMCIKKyAgICB9OworCisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImRhdGVVVENfZHQiKSk7IC8vIHNob3VsZCBtYXRjaCAiKl9kdCIgZHluYW1pYyBmaWVsZAorCisgICAgU3RyaW5nIGRhdGVUaW1lUGF0dGVybiA9ICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWiI7CisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXJVVEMgPSBEYXRlVGltZUZvcm1hdC5mb3JQYXR0ZXJuKGRhdGVUaW1lUGF0dGVybik7CisgICAgRGF0ZVRpbWUgZGF0ZVRpbWVVVEMgPSBkYXRlVGltZUZvcm1hdHRlclVUQy5wYXJzZURhdGVUaW1lKGZvcm1hdEV4YW1wbGVzWzFdKTsKKworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZvcm1hdEV4YW1wbGVzLmxlbmd0aCA7IGkgKz0gMikgeworICAgICAgU3RyaW5nIGZvcm1hdCA9IGZvcm1hdEV4YW1wbGVzW2ldOworICAgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSBmb3JtYXRFeGFtcGxlc1tpICsgMV07CisgICAgICBTdHJpbmcgaWQgPSAiOTUiICsgaTsKKyAgICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1kYXRlLVVUQy1kZWZhdWx0VGltZVpvbmUtbm8tcnVuLXByb2Nlc3NvciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgaWQpLCBmKCJkYXRlVVRDX2R0IiwgZGF0ZVN0cmluZykpKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgICBhc3NlcnRUcnVlKCJkYXRlICciICsgZGF0ZVN0cmluZyArICInIHdpdGggZm9ybWF0ICciICsgZm9ybWF0ICsgIicgaXMgbm90IG11dGF0ZWQgdG8gYSBEYXRlIiwKKyAgICAgICAgICBkLmdldEZpZWxkVmFsdWUoImRhdGVVVENfZHQiKSBpbnN0YW5jZW9mIERhdGUpOworICAgICAgYXNzZXJ0RXF1YWxzKCJkYXRlICciICsgZGF0ZVN0cmluZyArICInIHdpdGggZm9ybWF0ICciICsgZm9ybWF0ICsgIicgbWlzbWF0Y2hlZCBtaWxsaXNlY29uZHMiLAorICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lVVRDLmdldE1pbGxpcygpLCAoKERhdGUpZC5nZXRGaWVsZFZhbHVlKCJkYXRlVVRDX2R0IikpLmdldFRpbWUoKSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VGcmVuY2hEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoIm5vdF9pbl9zY2hlbWEiKSk7CisgICAgU3RyaW5nIGZyZW5jaERhdGVTdHJpbmcgPSAibGUgdmVuZHJlZGkgMTUgamFudmllciAyMDEwIjsKKyAgICBTdHJpbmcgZGF0ZVN0cmluZyA9ICIyMDEwLTAxLTE1VDAwOjAwOjAwLjAwMFoiOworICAgIERhdGVUaW1lRm9ybWF0dGVyIGRhdGVUaW1lRm9ybWF0dGVyID0gSVNPRGF0ZVRpbWVGb3JtYXQuZGF0ZVRpbWUoKTsKKyAgICBEYXRlVGltZSBkYXRlVGltZSA9IGRhdGVUaW1lRm9ybWF0dGVyLnBhcnNlRGF0ZVRpbWUoZGF0ZVN0cmluZyk7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWZyZW5jaC1kYXRlLVVUQy1kZWZhdWx0VGltZVpvbmUtbm8tcnVuLXByb2Nlc3NvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgIjg4IiksIGYoIm5vdF9pbl9zY2hlbWEiLCBmcmVuY2hEYXRlU3RyaW5nKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoIm5vdF9pbl9zY2hlbWEiKSBpbnN0YW5jZW9mIERhdGUpOworICAgIGFzc2VydEVxdWFscyhkYXRlVGltZS5nZXRNaWxsaXMoKSwgKChEYXRlKWQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpKS5nZXRUaW1lKCkpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkUGFyc2VNaXhlZERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBEYXRlVGltZUZvcm1hdHRlciBkYXRlVGltZUZvcm1hdHRlciA9IElTT0RhdGVUaW1lRm9ybWF0LmRhdGVPcHRpb25hbFRpbWVQYXJzZXIoKS53aXRoWm9uZVVUQygpOworICAgIE1hcDxPYmplY3QsT2JqZWN0PiBtaXhlZCA9IG5ldyBIYXNoTWFwPE9iamVjdCxPYmplY3Q+KCk7CisgICAgU3RyaW5nW10gZGF0ZVN0cmluZ3MgPSB7ICIyMDIwLTA1LTEzVDE4OjQ3IiwgIjE5ODktMTItMTQiLCAiMTY4Mi0wNy0yMlQxODozMzowMC4wMDBaIiB9OworICAgIGZvciAoU3RyaW5nIGRhdGVTdHJpbmcgOiBkYXRlU3RyaW5ncykgeworICAgICAgbWl4ZWQucHV0KGRhdGVUaW1lRm9ybWF0dGVyLnBhcnNlRGF0ZVRpbWUoZGF0ZVN0cmluZykudG9EYXRlKCksIGRhdGVTdHJpbmcpOworICAgIH0KKyAgICBEb3VibGUgZXh0cmFEb3VibGUgPSAyOS41NTRkOworICAgIG1peGVkLnB1dChleHRyYURvdWJsZSwgZXh0cmFEb3VibGUpOyAvLyBEb3VibGUtdHlwZWQgZmllbGQgdmFsdWUKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtZGF0ZS1uby1ydW4tcHJvY2Vzc29yIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgIjcyMDEiKSwgZigibm90X2luX3NjaGVtYSIsIG1peGVkLnZhbHVlcygpKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYm9vbGVhbiBmb3VuZERvdWJsZSA9IGZhbHNlOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKCJub3RfaW5fc2NoZW1hIikpIHsKKyAgICAgIGlmIChleHRyYURvdWJsZSA9PSBvKSB7CisgICAgICAgIGZvdW5kRG91YmxlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgICB9CisgICAgICBtaXhlZC52YWx1ZXMoKS5yZW1vdmUobyk7CisgICAgfQorICAgIGFzc2VydFRydWUoZm91bmREb3VibGUpOworICAgIGFzc2VydFRydWUobWl4ZWQuaXNFbXB0eSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUludFJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJpbnQxX2kiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2kiCisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImludDJfaSIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfaSIKKyAgICBpbnQgdmFsdWUgPSAxMDg5ODgzNDkxOworICAgIFN0cmluZyBpbnRTdHJpbmcxID0gIjEwODk4ODM0OTEiOworICAgIFN0cmluZyBpbnRTdHJpbmcyID0gIjEsMDg5LDg4Myw0OTEiOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1pbnQiLAorICAgICAgICBkb2MoZigiaWQiLCAiMTEzIiksIGYoImludDFfaSIsIGludFN0cmluZzEpLCBmKCJpbnQyX2kiLCBpbnRTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImludDFfaSIpIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKEludGVnZXIpZC5nZXRGaWVsZFZhbHVlKCJpbnQxX2kiKSkuaW50VmFsdWUoKSk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImludDJfaSIpIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKEludGVnZXIpZC5nZXRGaWVsZFZhbHVlKCJpbnQyX2kiKSkuaW50VmFsdWUoKSk7CisKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6MTEzIikKKyAgICAgICAgLCIvL2ludFtAbmFtZT0naW50MV9pJ11bLj0nIiArIHZhbHVlICsgIiddIgorICAgICAgICAsIi8vaW50W0BuYW1lPSdpbnQyX2knXVsuPSciICsgdmFsdWUgKyAiJ10iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUludE5vblJvb3RMb2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiaW50X2kiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2kiCisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoIm5vdF9pbl9zY2hlbWEiKSk7CisgICAgaW50IHZhbHVlID0gMTA4OTg4MzQ5MTsKKyAgICBTdHJpbmcgaW50U3RyaW5nMSA9ICIxMDg5ODgzNDkxIjsKKyAgICBTdHJpbmcgaW50U3RyaW5nMiA9ICIxwqAwODnCoDg4M8KgNDkxIjsgLy8gbm8tYnJlYWsgc3BhY2UgVSswMEEwCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWludC1ydXNzaWFuLW5vLXJ1bi1wcm9jZXNzb3IiLAorICAgICAgICBkb2MoZigiaWQiLCAiMTEzIiksIGYoImludF9pIiwgaW50U3RyaW5nMSksIGYoIm5vdF9pbl9zY2hlbWEiLCBpbnRTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImludF9pIikgaW5zdGFuY2VvZiBJbnRlZ2VyKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcilkLmdldEZpZWxkVmFsdWUoImludF9pIikpLmludFZhbHVlKCkpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hIikgaW5zdGFuY2VvZiBJbnRlZ2VyKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcilkLmdldEZpZWxkVmFsdWUoIm5vdF9pbl9zY2hlbWEiKSkuaW50VmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VUcmllSW50Um91bmRUcmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImludDFfdGkiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX3RpIgorICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJpbnQyX3RpIikpOyAvLyBzaG91bGQgbWF0Y2ggZHluYW1pYyBmaWVsZCAiKl90aSIKKyAgICBpbnQgdmFsdWUgPSAxMDg5ODgzNDkxOworICAgIFN0cmluZyBpbnRTdHJpbmcxID0gIjEwODk4ODM0OTEiOworICAgIFN0cmluZyBpbnRTdHJpbmcyID0gIjEsMDg5LDg4Myw0OTEiOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1pbnQiLAorICAgICAgICBkb2MoZigiaWQiLCAiMTEzIiksIGYoImludDFfdGkiLCBpbnRTdHJpbmcxKSwgZigiaW50Ml90aSIsIGludFN0cmluZzIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiaW50MV90aSIpIGluc3RhbmNlb2YgSW50ZWdlcik7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKEludGVnZXIpZC5nZXRGaWVsZFZhbHVlKCJpbnQxX3RpIikpLmludFZhbHVlKCkpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJpbnQyX3RpIikgaW5zdGFuY2VvZiBJbnRlZ2VyKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcilkLmdldEZpZWxkVmFsdWUoImludDJfdGkiKSkuaW50VmFsdWUoKSk7CisKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6MTEzIikKKyAgICAgICAgLCIvL2ludFtAbmFtZT0naW50MV90aSddWy49JyIgKyB2YWx1ZSArICInXSIKKyAgICAgICAgLCIvL2ludFtAbmFtZT0naW50Ml90aSddWy49JyIgKyB2YWx1ZSArICInXSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEludE92ZXJmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoIm5vdF9pbl9zY2hlbWExIikpOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJub3RfaW5fc2NoZW1hMiIpKTsKKyAgICBsb25nIGxvbmdWYWx1ZTEgPSAobG9uZylJbnRlZ2VyLk1BWF9WQUxVRSArIDEwMEw7CisgICAgbG9uZyBsb25nVmFsdWUyID0gKGxvbmcpSW50ZWdlci5NSU5fVkFMVUUgLSAxMDBMOworICAgIFN0cmluZyBsb25nU3RyaW5nMSA9IExvbmcudG9TdHJpbmcobG9uZ1ZhbHVlMSk7CisgICAgU3RyaW5nIGxvbmdTdHJpbmcyID0gTG9uZy50b1N0cmluZyhsb25nVmFsdWUyKTsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtaW50LW5vLXJ1bi1wcm9jZXNzb3IiLAorICAgICAgICBkb2MoZigiaWQiLCAiMjgyIiksIGYoIm5vdF9pbl9zY2hlbWExIiwgbG9uZ1N0cmluZzEpLCBmKCJub3RfaW5fc2NoZW1hMiIsIGxvbmdTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoIm5vdF9pbl9zY2hlbWExIikgaW5zdGFuY2VvZiBTdHJpbmcpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hMiIpIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdEZhaWxlZFBhcnNlTWl4ZWRJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBNYXA8T2JqZWN0LE9iamVjdD4gbWl4ZWQgPSBuZXcgSGFzaE1hcDxPYmplY3QsT2JqZWN0PigpOworICAgIEZsb2F0IGZsb2F0VmFsID0gMjk0NDIzLjBmOworICAgIG1peGVkLnB1dCg4NSwgIjg1Iik7CisgICAgbWl4ZWQucHV0KGZsb2F0VmFsLCBmbG9hdFZhbCk7IC8vIEZsb2F0LXR5cGVkIGZpZWxkIHZhbHVlCisgICAgbWl4ZWQucHV0KC0yODk0NTE4LCAiLTIsODk0LDUxOCIpOworICAgIG1peGVkLnB1dCgxODc5NDcyMTkzLCAiMSw4NzksNDcyLDE5MyIpOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1pbnQtbm8tcnVuLXByb2Nlc3NvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgIjcyMDIiKSwgZigibm90X2luX3NjaGVtYSIsIG1peGVkLnZhbHVlcygpKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYm9vbGVhbiBmb3VuZEZsb2F0ID0gZmFsc2U7CisgICAgZm9yIChPYmplY3QgbyA6IGQuZ2V0RmllbGRWYWx1ZXMoIm5vdF9pbl9zY2hlbWEiKSkgeworICAgICAgaWYgKGZsb2F0VmFsID09IG8pIHsKKyAgICAgICAgZm91bmRGbG9hdCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgfQorICAgICAgbWl4ZWQudmFsdWVzKCkucmVtb3ZlKG8pOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGZvdW5kRmxvYXQpOworICAgIGFzc2VydFRydWUobWl4ZWQuaXNFbXB0eSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUxvbmdSb3VuZFRyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibG9uZzFfbCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfbCIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibG9uZzJfbCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfbCIKKyAgICBsb25nIHZhbHVlID0gMTA4OTg4MzQ5MUw7CisgICAgU3RyaW5nIGxvbmdTdHJpbmcxID0gIjEwODk4ODM0OTEiOworICAgIFN0cmluZyBsb25nU3RyaW5nMiA9ICIxLDA4OSw4ODMsNDkxIjsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtbG9uZyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIxMTMiKSwgZigibG9uZzFfbCIsIGxvbmdTdHJpbmcxKSwgZigibG9uZzJfbCIsIGxvbmdTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImxvbmcxX2wiKSBpbnN0YW5jZW9mIExvbmcpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKChMb25nKSBkLmdldEZpZWxkVmFsdWUoImxvbmcxX2wiKSkubG9uZ1ZhbHVlKCkpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJsb25nMl9sIikgaW5zdGFuY2VvZiBMb25nKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoTG9uZylkLmdldEZpZWxkVmFsdWUoImxvbmcyX2wiKSkubG9uZ1ZhbHVlKCkpOworICAgIAorICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgIGFzc2VydFEocmVxKCJpZDoxMTMiKQorICAgICAgICAsIi8vbG9uZ1tAbmFtZT0nbG9uZzFfbCddWy49JyIgKyB2YWx1ZSArICInXSIKKyAgICAgICAgLCIvL2xvbmdbQG5hbWU9J2xvbmcyX2wnXVsuPSciICsgdmFsdWUgKyAiJ10iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUxvbmdOb25Sb290TG9jYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImxvbmdfbCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfbCIKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBsb25nIHZhbHVlID0gMTA4OTg4MzQ5MUw7CisgICAgU3RyaW5nIGxvbmdTdHJpbmcxID0gIjEwODk4ODM0OTEiOworICAgIFN0cmluZyBsb25nU3RyaW5nMiA9ICIxwqAwODnCoDg4M8KgNDkxIjsgLy8gbm8tYnJlYWsgc3BhY2UgVSswMEEwCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWxvbmctcnVzc2lhbi1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiMTEzIiksIGYoImxvbmdfbCIsIGxvbmdTdHJpbmcxKSwgZigibm90X2luX3NjaGVtYSIsIGxvbmdTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImxvbmdfbCIpIGluc3RhbmNlb2YgTG9uZyk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKExvbmcpZC5nZXRGaWVsZFZhbHVlKCJsb25nX2wiKSkubG9uZ1ZhbHVlKCkpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hIikgaW5zdGFuY2VvZiBMb25nKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoTG9uZylkLmdldEZpZWxkVmFsdWUoIm5vdF9pbl9zY2hlbWEiKSkubG9uZ1ZhbHVlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVHJpZUxvbmdSb3VuZFRyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibG9uZzFfdGwiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX3RsIgorICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJsb25nMl90bCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfdGwiCisgICAgbG9uZyB2YWx1ZSA9IDEwODk4ODM0OTFMOworICAgIFN0cmluZyBsb25nU3RyaW5nMSA9ICIxMDg5ODgzNDkxIjsKKyAgICBTdHJpbmcgbG9uZ1N0cmluZzIgPSAiMSwwODksODgzLDQ5MSI7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWxvbmciLAorICAgICAgICBkb2MoZigiaWQiLCAiMTEzIiksIGYoImxvbmcxX3RsIiwgbG9uZ1N0cmluZzEpLCBmKCJsb25nMl90bCIsIGxvbmdTdHJpbmcyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImxvbmcxX3RsIikgaW5zdGFuY2VvZiBMb25nKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsICgoTG9uZylkLmdldEZpZWxkVmFsdWUoImxvbmcxX3RsIikpLmxvbmdWYWx1ZSgpKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibG9uZzJfdGwiKSBpbnN0YW5jZW9mIExvbmcpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKChMb25nKWQuZ2V0RmllbGRWYWx1ZSgibG9uZzJfdGwiKSkubG9uZ1ZhbHVlKCkpOworCisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjExMyIpCisgICAgICAgICwiLy9sb25nW0BuYW1lPSdsb25nMV90bCddWy49JyIgKyB2YWx1ZSArICInXSIKKyAgICAgICAgLCIvL2xvbmdbQG5hbWU9J2xvbmcyX3RsJ11bLj0nIiArIHZhbHVlICsgIiddIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkUGFyc2VNaXhlZExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBNYXA8T2JqZWN0LE9iamVjdD4gbWl4ZWQgPSBuZXcgSGFzaE1hcDxPYmplY3QsT2JqZWN0PigpOworICAgIEZsb2F0IGZsb2F0VmFsID0gMjk0NDIzLjBmOworICAgIG1peGVkLnB1dCg4NUwsICI4NSIpOworICAgIG1peGVkLnB1dChmbG9hdFZhbCwgZmxvYXRWYWwpOyAvLyBGbG9hdC10eXBlZCBmaWVsZCB2YWx1ZQorICAgIG1peGVkLnB1dCgtMjg5NDUxOEwsICItMiw4OTQsNTE4Iik7CisgICAgbWl4ZWQucHV0KDE4Nzk0NzIxOTNMLCAiMSw4NzksNDcyLDE5MyIpOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1sb25nLW5vLXJ1bi1wcm9jZXNzb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICI3MjA0IiksIGYoIm5vdF9pbl9zY2hlbWEiLCBtaXhlZC52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGJvb2xlYW4gZm91bmRGbG9hdCA9IGZhbHNlOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKCJub3RfaW5fc2NoZW1hIikpIHsKKyAgICAgIGlmIChmbG9hdFZhbCA9PSBvKSB7CisgICAgICAgIGZvdW5kRmxvYXQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgIH0KKyAgICAgIG1peGVkLnZhbHVlcygpLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShmb3VuZEZsb2F0KTsKKyAgICBhc3NlcnRUcnVlKG1peGVkLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VGbG9hdFJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJmbG9hdDFfZiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfZiIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiZmxvYXQyX2YiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2YiCisgICAgZmxvYXQgdmFsdWUgPSAxMDg5OC44MzQ5MWY7CisgICAgU3RyaW5nIGZsb2F0U3RyaW5nMSA9ICIxMDg5OC44MzQ5MSI7CisgICAgU3RyaW5nIGZsb2F0U3RyaW5nMiA9ICIxMCw4OTguODM0OTEiOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1mbG9hdCIsCisgICAgICAgIGRvYyhmKCJpZCIsICIxMjgiKSwgZigiZmxvYXQxX2YiLCBmbG9hdFN0cmluZzEpLCBmKCJmbG9hdDJfZiIsIGZsb2F0U3RyaW5nMikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJmbG9hdDFfZiIpIGluc3RhbmNlb2YgRmxvYXQpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKEZsb2F0KWQuZ2V0RmllbGRWYWx1ZSgiZmxvYXQxX2YiKSwgRVBTSUxPTik7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImZsb2F0Ml9mIikgaW5zdGFuY2VvZiBGbG9hdCk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoRmxvYXQpZC5nZXRGaWVsZFZhbHVlKCJmbG9hdDJfZiIpLCBFUFNJTE9OKTsKKworICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgIGFzc2VydFEocmVxKCJpZDoxMjgiKQorICAgICAgICAsIi8vZmxvYXRbQG5hbWU9J2Zsb2F0MV9mJ11bLj0nIiArIHZhbHVlICsgIiddIgorICAgICAgICAsIi8vZmxvYXRbQG5hbWU9J2Zsb2F0Ml9mJ11bLj0nIiArIHZhbHVlICsgIiddIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VGbG9hdE5vblJvb3RMb2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiZmxvYXRfZiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfZiIKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBmbG9hdCB2YWx1ZSA9IDEwODk4LjgzNDkxZjsKKyAgICBTdHJpbmcgZmxvYXRTdHJpbmcxID0gIjEwODk4LDgzNDkxIjsKKyAgICBTdHJpbmcgZmxvYXRTdHJpbmcyID0gIjEwwqA4OTgsODM0OTEiOyAvLyBuby1icmVhayBzcGFjZTogVSswMEEwCisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWZsb2F0LWZyZW5jaC1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgZG9jKGYoImlkIiwgIjE0MCIpLCBmKCJmbG9hdF9mIiwgZmxvYXRTdHJpbmcxKSwKKyAgICAgICAgICAgIGYoIm5vdF9pbl9zY2hlbWEiLCBmbG9hdFN0cmluZzIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZmxvYXRfZiIpIGluc3RhbmNlb2YgRmxvYXQpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKEZsb2F0KWQuZ2V0RmllbGRWYWx1ZSgiZmxvYXRfZiIpLCBFUFNJTE9OKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpIGluc3RhbmNlb2YgRmxvYXQpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKEZsb2F0KWQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpLCBFUFNJTE9OKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVRyaWVGbG9hdFJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJmbG9hdDFfdGYiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX3RmIgorICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJmbG9hdDJfdGYiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX3RmIgorICAgIGZsb2F0IHZhbHVlID0gMTA4OTguODM0OTFmOworICAgIFN0cmluZyBmbG9hdFN0cmluZzEgPSAiMTA4OTguODM0OTEiOworICAgIFN0cmluZyBmbG9hdFN0cmluZzIgPSAiMTAsODk4LjgzNDkxIjsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtZmxvYXQiLAorICAgICAgICBkb2MoZigiaWQiLCAiNzI4IiksIGYoImZsb2F0MV90ZiIsIGZsb2F0U3RyaW5nMSksIGYoImZsb2F0Ml90ZiIsIGZsb2F0U3RyaW5nMikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJmbG9hdDFfdGYiKSBpbnN0YW5jZW9mIEZsb2F0KTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIChGbG9hdClkLmdldEZpZWxkVmFsdWUoImZsb2F0MV90ZiIpLCBFUFNJTE9OKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZmxvYXQyX3RmIikgaW5zdGFuY2VvZiBGbG9hdCk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoRmxvYXQpZC5nZXRGaWVsZFZhbHVlKCJmbG9hdDJfdGYiKSwgRVBTSUxPTik7CisKKyAgICBhc3NlcnRVKGNvbW1pdCgpKTsKKyAgICBhc3NlcnRRKHJlcSgiaWQ6NzI4IikKKyAgICAgICAgLCIvL2Zsb2F0W0BuYW1lPSdmbG9hdDFfdGYnXVsuPSciICsgdmFsdWUgKyAiJ10iCisgICAgICAgICwiLy9mbG9hdFtAbmFtZT0nZmxvYXQyX3RmJ11bLj0nIiArIHZhbHVlICsgIiddIik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZEZsb2F0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJmbG9hdF90ZiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfdGYiCisgICAgTWFwPEZsb2F0LE9iamVjdD4gbWl4ZWRGbG9hdHMgPSBuZXcgSGFzaE1hcDxGbG9hdCxPYmplY3Q+KCk7CisgICAgbWl4ZWRGbG9hdHMucHV0KDg1LjBmLCAiODUiKTsKKyAgICBtaXhlZEZsb2F0cy5wdXQoMjg5NDUxOC4wZiwgIjIsODk0LDUxOCIpOworICAgIG1peGVkRmxvYXRzLnB1dCgyLjk0NDIzRS05ZiwgMi45NDQyM0UtOWYpOyAvLyBGbG9hdC10eXBlZCBmaWVsZCB2YWx1ZQorICAgIG1peGVkRmxvYXRzLnB1dCg0ODc5NDcyMS45MzdmLCAiNDgsNzk0LDcyMS45MzciKTsKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtZmxvYXQtbm8tcnVuLXByb2Nlc3NvciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyhmKCJpZCIsICIzNDIiKSwgZigiZmxvYXRfdGYiLCBtaXhlZEZsb2F0cy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKCJmbG9hdF90ZiIpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBGbG9hdCk7CisgICAgICBtaXhlZEZsb2F0cy5yZW1vdmUobyk7CisgICAgfQorICAgIGFzc2VydFRydWUobWl4ZWRGbG9hdHMuaXNFbXB0eSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWRQYXJzZU1peGVkRmxvYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBNYXA8T2JqZWN0LE9iamVjdD4gbWl4ZWQgPSBuZXcgSGFzaE1hcDxPYmplY3QsT2JqZWN0PigpOworICAgIExvbmcgbG9uZ1ZhbCA9IDI5NDQyM0w7CisgICAgbWl4ZWQucHV0KDg1TCwgIjg1Iik7CisgICAgbWl4ZWQucHV0KGxvbmdWYWwsIGxvbmdWYWwpOyAvLyBGbG9hdC10eXBlZCBmaWVsZCB2YWx1ZQorICAgIG1peGVkLnB1dCgtMjg5NDUxOEwsICItMiw4OTQsNTE4Iik7CisgICAgbWl4ZWQucHV0KDE4Nzk0NzIxOTNMLCAiMSw4NzksNDcyLDE5MyIpOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1mbG9hdC1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiNzIwNSIpLCBmKCJub3RfaW5fc2NoZW1hIiwgbWl4ZWQudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBib29sZWFuIGZvdW5kTG9uZyA9IGZhbHNlOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKCJub3RfaW5fc2NoZW1hIikpIHsKKyAgICAgIGlmIChsb25nVmFsID09IG8pIHsKKyAgICAgICAgZm91bmRMb25nID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgICB9CisgICAgICBtaXhlZC52YWx1ZXMoKS5yZW1vdmUobyk7CisgICAgfQorICAgIGFzc2VydFRydWUoZm91bmRMb25nKTsKKyAgICBhc3NlcnRUcnVlKG1peGVkLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VEb3VibGVSb3VuZFRyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiZG91YmxlMV9kIikpOyAvLyBzaG91bGQgbWF0Y2ggZHluYW1pYyBmaWVsZCAiKl9kIgorICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkb3VibGUyX2QiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2QiCisgICAgZG91YmxlIHZhbHVlID0gMTA4OTguODM0OTE7CisgICAgU3RyaW5nIGRvdWJsZVN0cmluZzEgPSAiMTA4OTguODM0OTEiOworICAgIFN0cmluZyBkb3VibGVTdHJpbmcyID0gIjEwLDg5OC44MzQ5MSI7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRvdWJsZSIsCisgICAgICAgIGRvYyhmKCJpZCIsICIxMjgiKSwgZigiZG91YmxlMV9kIiwgZG91YmxlU3RyaW5nMSksIGYoImRvdWJsZTJfZCIsIGRvdWJsZVN0cmluZzIpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZG91YmxlMV9kIikgaW5zdGFuY2VvZiBEb3VibGUpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKERvdWJsZSlkLmdldEZpZWxkVmFsdWUoImRvdWJsZTFfZCIpLCBFUFNJTE9OKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiZG91YmxlMl9kIikgaW5zdGFuY2VvZiBEb3VibGUpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKERvdWJsZSlkLmdldEZpZWxkVmFsdWUoImRvdWJsZTJfZCIpLCBFUFNJTE9OKTsKKworICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgIGFzc2VydFEocmVxKCJpZDoxMjgiKQorICAgICAgICAsIi8vZG91YmxlW0BuYW1lPSdkb3VibGUxX2QnXVsuPSciICsgdmFsdWUgKyAiJ10iCisgICAgICAgICwiLy9kb3VibGVbQG5hbWU9J2RvdWJsZTJfZCddWy49JyIgKyB2YWx1ZSArICInXSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRG91YmxlTm9uUm9vdExvY2FsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkb3VibGVfZCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfZCIKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBkb3VibGUgdmFsdWUgPSAxMDg5OC44MzQ5MTsKKyAgICBTdHJpbmcgZG91YmxlU3RyaW5nMSA9ICIxMDg5OCw4MzQ5MSI7CisgICAgU3RyaW5nIGRvdWJsZVN0cmluZzIgPSAiMTDCoDg5OCw4MzQ5MSI7IC8vIG5vLWJyZWFrIHNwYWNlOiBVKzAwQTAKKyAgICBTb2xySW5wdXREb2N1bWVudCBkID0gcHJvY2Vzc0FkZCgicGFyc2UtZG91YmxlLWZyZW5jaC1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiMTQwIiksIGYoImRvdWJsZV9kIiwgZG91YmxlU3RyaW5nMSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCJub3RfaW5fc2NoZW1hIiwgZG91YmxlU3RyaW5nMikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJkb3VibGVfZCIpIGluc3RhbmNlb2YgRG91YmxlKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIChEb3VibGUpZC5nZXRGaWVsZFZhbHVlKCJkb3VibGVfZCIpLCBFUFNJTE9OKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgibm90X2luX3NjaGVtYSIpIGluc3RhbmNlb2YgRG91YmxlKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIChEb3VibGUpZC5nZXRGaWVsZFZhbHVlKCJub3RfaW5fc2NoZW1hIiksIEVQU0lMT04pOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVHJpZURvdWJsZVJvdW5kVHJpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJkb3VibGUxX3RkIikpOyAvLyBzaG91bGQgbWF0Y2ggZHluYW1pYyBmaWVsZCAiKl90ZCIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiZG91YmxlMl90ZCIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfdGQiCisgICAgZG91YmxlIHZhbHVlID0gMTA4OTguODM0OTE7CisgICAgU3RyaW5nIGRvdWJsZVN0cmluZzEgPSAiMTA4OTguODM0OTEiOworICAgIFN0cmluZyBkb3VibGVTdHJpbmcyID0gIjEwLDg5OC44MzQ5MSI7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRvdWJsZSIsCisgICAgICAgIGRvYyhmKCJpZCIsICI3MjgiKSwgZigiZG91YmxlMV90ZCIsIGRvdWJsZVN0cmluZzEpLCBmKCJkb3VibGUyX3RkIiwgZG91YmxlU3RyaW5nMikpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKCJkb3VibGUxX3RkIikgaW5zdGFuY2VvZiBEb3VibGUpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgKERvdWJsZSlkLmdldEZpZWxkVmFsdWUoImRvdWJsZTFfdGQiKSwgRVBTSUxPTik7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImRvdWJsZTJfdGQiKSBpbnN0YW5jZW9mIERvdWJsZSk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCAoRG91YmxlKWQuZ2V0RmllbGRWYWx1ZSgiZG91YmxlMl90ZCIpLCBFUFNJTE9OKTsKKworICAgIGFzc2VydFUoY29tbWl0KCkpOworICAgIGFzc2VydFEocmVxKCJpZDo3MjgiKQorICAgICAgICAsIi8vZG91YmxlW0BuYW1lPSdkb3VibGUxX3RkJ11bLj0nIiArIHZhbHVlICsgIiddIgorICAgICAgICAsIi8vZG91YmxlW0BuYW1lPSdkb3VibGUyX3RkJ11bLj0nIiArIHZhbHVlICsgIiddIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkUGFyc2VNaXhlZERvdWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJub3RfaW5fc2NoZW1hIikpOworICAgIE1hcDxPYmplY3QsT2JqZWN0PiBtaXhlZCA9IG5ldyBIYXNoTWFwPE9iamVjdCxPYmplY3Q+KCk7CisgICAgTG9uZyBsb25nVmFsID0gMjk0NDIzTDsKKyAgICBtaXhlZC5wdXQoODUsICI4NS4wIik7CisgICAgbWl4ZWQucHV0KGxvbmdWYWwsIGxvbmdWYWwpOyAvLyBGbG9hdC10eXBlZCBmaWVsZCB2YWx1ZQorICAgIG1peGVkLnB1dCgtMjg5NC41MTgsICItMiw4OTQuNTE4Iik7CisgICAgbWl4ZWQucHV0KDE4Nzk0Ny4yMTkzLCAiMTg3LDk0Ny4yMTkzIik7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWRvdWJsZS1uby1ydW4tcHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MoZigiaWQiLCAiNzIwNiIpLCBmKCJub3RfaW5fc2NoZW1hIiwgbWl4ZWQudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBib29sZWFuIGZvdW5kTG9uZyA9IGZhbHNlOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKCJub3RfaW5fc2NoZW1hIikpIHsKKyAgICAgIGlmIChsb25nVmFsID09IG8pIHsKKyAgICAgICAgZm91bmRMb25nID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFN0cmluZyk7CisgICAgICB9CisgICAgICBtaXhlZC52YWx1ZXMoKS5yZW1vdmUobyk7CisgICAgfQorICAgIGFzc2VydFRydWUoZm91bmRMb25nKTsKKyAgICBhc3NlcnRUcnVlKG1peGVkLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VCb29sZWFuUm91bmRUcmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5kZXhTY2hlbWEgc2NoZW1hID0gaC5nZXRDb3JlKCkuZ2V0TGF0ZXN0U2NoZW1hKCk7CisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImJvb2xlYW4xX2IiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2IiCisgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0RmllbGRPck51bGwoImJvb2xlYW4yX2IiKSk7IC8vIHNob3VsZCBtYXRjaCBkeW5hbWljIGZpZWxkICIqX2IiCisgICAgYm9vbGVhbiB2YWx1ZTEgPSB0cnVlOworICAgIGJvb2xlYW4gdmFsdWUyID0gZmFsc2U7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWJvb2xlYW4iLAorICAgICAgICBkb2MoZigiaWQiLCAiMTQxIiksIGYoImJvb2xlYW4xX2IiLCB2YWx1ZTEpLCBmKCJib29sZWFuMl9iIiwgdmFsdWUyKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoImJvb2xlYW4xX2IiKSBpbnN0YW5jZW9mIEJvb2xlYW4pOworICAgIGFzc2VydEVxdWFscyh2YWx1ZTEsIGQuZ2V0RmllbGRWYWx1ZSgiYm9vbGVhbjFfYiIpKTsKKyAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZSgiYm9vbGVhbjJfYiIpIGluc3RhbmNlb2YgQm9vbGVhbik7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMiwgZC5nZXRGaWVsZFZhbHVlKCJib29sZWFuMl9iIikpOworCisgICAgYXNzZXJ0VShjb21taXQoKSk7CisgICAgYXNzZXJ0UShyZXEoImlkOjE0MSIpCisgICAgICAgICwiLy9ib29sW0BuYW1lPSdib29sZWFuMV9iJ11bLj0nIiArIHZhbHVlMSArICInXSIKKyAgICAgICAgLCIvL2Jvb2xbQG5hbWU9J2Jvb2xlYW4yX2InXVsuPSciICsgdmFsdWUyICsgIiddIik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFsdGVybmF0ZVZhbHVlQm9vbGVhbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiYm9vbGVhbjFfYiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfYiIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiYm9vbGVhbjJfYiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfYiIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiYm9vbGVhbjNfYiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfYiIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiYm9vbGVhbjRfYiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfYiIKKyAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgiYm9vbGVhbjVfYiIpKTsgLy8gc2hvdWxkIG1hdGNoIGR5bmFtaWMgZmllbGQgIipfYiIKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBib29sZWFuW10gdmFsdWVzICAgICAgPSB7IHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKKyAgICBTdHJpbmdbXSBzdHJpbmdWYWx1ZXMgPSB7ICJvbiIsICJ5ZXMiLCAiVHJ1ZSIsICJPZmYiLCAibm8iLCAiRkFMU0UiIH07CisgICAgU3RyaW5nW10gZmllbGROYW1lcyAgID0geyAiYm9vbGVhbjFfYiIsICJib29sZWFuMl9iIiwgImJvb2xlYW4zX2IiLCAiYm9vbGVhbjRfYiIsICJib29sZWFuNV9iIiwgIm5vdF9pbl9zY2hlbWEiIH07CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IGRvYyhmKCJpZCIsICI1NSIpKTsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoIDsgKytpKSB7CisgICAgICBkLmFkZEZpZWxkKGZpZWxkTmFtZXNbaV0sIHN0cmluZ1ZhbHVlc1tpXSk7CisgICAgfQorICAgIGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1ib29sZWFuLWFsdGVybmF0ZS12YWx1ZXMtbm8tcnVuLXByb2Nlc3NvciIsIGQpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoIDsgKytpKSB7CisgICAgICBhc3NlcnRUcnVlKGQuZ2V0RmllbGRWYWx1ZShmaWVsZE5hbWVzW2ldKSBpbnN0YW5jZW9mIEJvb2xlYW4pOworICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlc1tpXSwgZC5nZXRGaWVsZFZhbHVlKGZpZWxkTmFtZXNbaV0pKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbHRlcm5hdGVTaW5nbGVWYWx1ZXNCb29sZWFucygpIHRocm93cyBFeGNlcHRpb24geworICAgIEluZGV4U2NoZW1hIHNjaGVtYSA9IGguZ2V0Q29yZSgpLmdldExhdGVzdFNjaGVtYSgpOworICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJib29sZWFuMV9iIikpOyAvLyBzaG91bGQgbWF0Y2ggZHluYW1pYyBmaWVsZCAiKl9iIgorICAgIGFzc2VydE5vdE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKCJib29sZWFuMl9iIikpOyAvLyBzaG91bGQgbWF0Y2ggZHluYW1pYyBmaWVsZCAiKl9iIgorICAgIGJvb2xlYW5bXSB2YWx1ZXMgICAgICA9IHsgdHJ1ZSwgZmFsc2UgfTsKKyAgICBTdHJpbmdbXSBzdHJpbmdWYWx1ZXMgPSB7ICJ5dXAiLCAibm9wZSIgfTsKKyAgICBTdHJpbmdbXSBmaWVsZE5hbWVzICAgPSB7ICJib29sZWFuMV9iIiwgImJvb2xlYW4yX2IiIH07CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IGRvYyhmKCJpZCIsICI1OSIpKTsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoIDsgKytpKSB7CisgICAgICBkLmFkZEZpZWxkKGZpZWxkTmFtZXNbaV0sIHN0cmluZ1ZhbHVlc1tpXSk7CisgICAgfQorICAgIGQgPSBwcm9jZXNzQWRkKCJwYXJzZS1ib29sZWFuLWFsdGVybmF0ZS1zaW5nbGUtdmFsdWVzLW5vLXJ1bi1wcm9jZXNzb3IiLCBkKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworCisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aCA7ICsraSkgeworICAgICAgYXNzZXJ0VHJ1ZShkLmdldEZpZWxkVmFsdWUoZmllbGROYW1lc1tpXSkgaW5zdGFuY2VvZiBCb29sZWFuKTsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXNbaV0sIGQuZ2V0RmllbGRWYWx1ZShmaWVsZE5hbWVzW2ldKSk7CisgICAgfQorCisgICAgLy8gU3RhbmRhcmQgYm9vbGVhbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtdXRhdGVkLCBzaW5jZSB0aGV5J3JlIG5vdCBjb25maWd1cmVkCisgICAgc3RyaW5nVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgInRydWUiLCAiZmFsc2UiIH07CisgICAgZCA9IGRvYyhmKCJpZCIsICI1OTMiKSk7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aCA7ICsraSkgeworICAgICAgZC5hZGRGaWVsZChmaWVsZE5hbWVzW2ldLCBzdHJpbmdWYWx1ZXNbaV0pOworICAgIH0KKyAgICBkID0gcHJvY2Vzc0FkZCgicGFyc2UtYm9vbGVhbi1hbHRlcm5hdGUtc2luZ2xlLXZhbHVlcy1uby1ydW4tcHJvY2Vzc29yIiwgZCk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGggOyArK2kpIHsKKyAgICAgIGFzc2VydFRydWUoZC5nZXRGaWVsZFZhbHVlKGZpZWxkTmFtZXNbaV0pIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkUGFyc2VNaXhlZEJvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBhc3NlcnROdWxsKHNjaGVtYS5nZXRGaWVsZE9yTnVsbCgibm90X2luX3NjaGVtYSIpKTsKKyAgICBNYXA8T2JqZWN0LE9iamVjdD4gbWl4ZWQgPSBuZXcgSGFzaE1hcDxPYmplY3QsT2JqZWN0PigpOworICAgIExvbmcgbG9uZ1ZhbCA9IDI5NDQyM0w7CisgICAgbWl4ZWQucHV0KHRydWUsICJ0cnVlIik7CisgICAgbWl4ZWQucHV0KGxvbmdWYWwsIGxvbmdWYWwpOyAvLyBGbG9hdC10eXBlZCBmaWVsZCB2YWx1ZQorICAgIG1peGVkLnB1dChmYWxzZSwgImZhbHNlIik7CisgICAgbWl4ZWQucHV0KHRydWUsICJ0cnVlIik7CisgICAgU29scklucHV0RG9jdW1lbnQgZCA9IHByb2Nlc3NBZGQoInBhcnNlLWJvb2xlYW4tbm8tcnVuLXByb2Nlc3NvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jKGYoImlkIiwgIjcyMDciKSwgZigibm90X2luX3NjaGVtYSIsIG1peGVkLnZhbHVlcygpKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgYm9vbGVhbiBmb3VuZExvbmcgPSBmYWxzZTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcygibm90X2luX3NjaGVtYSIpKSB7CisgICAgICBpZiAobG9uZ1ZhbCA9PSBvKSB7CisgICAgICAgIGZvdW5kTG9uZyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBTdHJpbmcpOworICAgICAgfQorICAgICAgbWl4ZWQudmFsdWVzKCkucmVtb3ZlKG8pOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGZvdW5kTG9uZyk7CisgICAgYXNzZXJ0VHJ1ZShtaXhlZC5pc0VtcHR5KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENhc2NhZGluZ1BhcnNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmRleFNjaGVtYSBzY2hlbWEgPSBoLmdldENvcmUoKS5nZXRMYXRlc3RTY2hlbWEoKTsKKyAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lID0gIm5vdF9pbl9zY2hlbWEiOworICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEZpZWxkT3JOdWxsKGZpZWxkTmFtZSkpOworICAgIFNvbHJJbnB1dERvY3VtZW50IGQgPSBudWxsOworICAgIFN0cmluZyBjaGFpbiA9ICJjYXNjYWRpbmctcGFyc2Vycy1uby1ydW4tcHJvY2Vzc29yIjsKKyAgICAKKyAgICBNYXA8Qm9vbGVhbixTdHJpbmc+IGJvb2xlYW5zID0gbmV3IEhhc2hNYXA8Qm9vbGVhbixTdHJpbmc+KCk7CisgICAgYm9vbGVhbnMucHV0KHRydWUsICJ0cnVFIik7CisgICAgYm9vbGVhbnMucHV0KGZhbHNlLCAiRmFsc2UiKTsKKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjM0MSIpLCBmKGZpZWxkTmFtZSwgYm9vbGVhbnMudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBCb29sZWFuKTsKKyAgICAgIGJvb2xlYW5zLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShib29sZWFucy5pc0VtcHR5KCkpOworCisgICAgTWFwPEludGVnZXIsU3RyaW5nPiBpbnRzID0gbmV3IEhhc2hNYXA8SW50ZWdlcixTdHJpbmc+KCk7CisgICAgaW50cy5wdXQoMiwgIjIiKTsKKyAgICBpbnRzLnB1dCg1MDkyOCwgIjUwOTI4Iik7CisgICAgaW50cy5wdXQoODY5NDIwMDgsICI4Niw5NDIsMDA4Iik7CisgICAgZCA9IHByb2Nlc3NBZGQoY2hhaW4sIGRvYyhmKCJpZCIsICIzMzMiKSwgZihmaWVsZE5hbWUsIGludHMudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKTsKKyAgICAgIGludHMucmVtb3ZlKG8pOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGludHMuaXNFbXB0eSgpKTsKKworICAgIE1hcDxMb25nLFN0cmluZz4gbG9uZ3MgPSBuZXcgSGFzaE1hcDxMb25nLFN0cmluZz4oKTsKKyAgICBsb25ncy5wdXQoMkwsICIyIik7CisgICAgbG9uZ3MucHV0KDUwOTI4TCwgIjUwOTI4Iik7CisgICAgbG9uZ3MucHV0KDg2OTQyMDA4OTg3NjU0TCwgIjg2LDk0MiwwMDgsOTg3LDY1NCIpOworICAgIGQgPSBwcm9jZXNzQWRkKGNoYWluLCBkb2MoZigiaWQiLCAiMzQyIiksIGYoZmllbGROYW1lLCBsb25ncy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKGZpZWxkTmFtZSkpIHsKKyAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIExvbmcpOworICAgICAgbG9uZ3MucmVtb3ZlKG8pOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGxvbmdzLmlzRW1wdHkoKSk7CisgICAgCisgICAgLyoKKyAgICAvLyBEaXNhYmxpbmcgdGhpcyB0ZXN0IGJlY2F1c2UgdW5saWtlIEludGVnZXIvTG9uZywgRmxvYXQgcGFyc2luZyBjYW4gcGVyZm9ybQorICAgIC8vIHJvdW5kaW5nIHRvIG1ha2UgdmFsdWVzIGZpdC4gIFNlZSAKKyAgICBNYXA8RmxvYXQsU3RyaW5nPiBmbG9hdHMgPSBuZXcgSGFzaE1hcDxGbG9hdCxTdHJpbmc+KCk7CisgICAgZmxvYXRzLnB1dCgyLjAsICIyLiIpOworICAgIGZsb2F0cy5wdXQoNTA5LjI4LCAiNTA5LjI4Iik7CisgICAgZmxvYXRzLnB1dCg4Njk0Mi4wMDgsICI4Niw5NDIuMDA4Iik7CisgICAgZCA9IHByb2Nlc3NBZGQoY2hhaW4sIGRvYyhmKCJpZCIsICIzNDIiKSwgZihmaWVsZE5hbWUsIGZsb2F0cy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKGZpZWxkTmFtZSkpIHsKKyAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIGZsb2F0KTsKKyAgICAgIGxvbmdzLnJlbW92ZShvKTsKKyAgICB9CisgICAgKi8KKworICAgIE1hcDxEb3VibGUsU3RyaW5nPiBkb3VibGVzID0gbmV3IEhhc2hNYXA8RG91YmxlLFN0cmluZz4oKTsKKyAgICBkb3VibGVzLnB1dCgyLjAsICIyLiIpOworICAgIGRvdWJsZXMucHV0KDUwOS4yOCwgIjUwOS4yOCIpOworICAgIGRvdWJsZXMucHV0KDg2OTQyLjAwOCwgIjg2LDk0Mi4wMDgiKTsKKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjM0MiIpLCBmKGZpZWxkTmFtZSwgZG91Ymxlcy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKGZpZWxkTmFtZSkpIHsKKyAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIERvdWJsZSk7CisgICAgICBsb25ncy5yZW1vdmUobyk7CisgICAgfQorCisgICAgRGF0ZVRpbWVGb3JtYXR0ZXIgZGF0ZVRpbWVGb3JtYXR0ZXIgPSBJU09EYXRlVGltZUZvcm1hdC5kYXRlT3B0aW9uYWxUaW1lUGFyc2VyKCkud2l0aFpvbmVVVEMoKTsKKyAgICBNYXA8RGF0ZSxTdHJpbmc+IGRhdGVzID0gbmV3IEhhc2hNYXA8RGF0ZSxTdHJpbmc+KCk7CisgICAgU3RyaW5nW10gZGF0ZVN0cmluZ3MgPSB7ICIyMDIwLTA1LTEzVDE4OjQ3IiwgIjE5ODktMTItMTQiLCAiMTY4Mi0wNy0yMlQxODozMzowMC4wMDBaIiB9OworICAgIGZvciAoU3RyaW5nIGRhdGVTdHJpbmcgOiBkYXRlU3RyaW5ncykgeworICAgICAgZGF0ZXMucHV0KGRhdGVUaW1lRm9ybWF0dGVyLnBhcnNlRGF0ZVRpbWUoZGF0ZVN0cmluZykudG9EYXRlKCksIGRhdGVTdHJpbmcpOworICAgIH0KKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjM0MyIpLCBmKGZpZWxkTmFtZSwgZGF0ZXMudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBEYXRlKTsKKyAgICAgIGRhdGVzLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShkYXRlcy5pc0VtcHR5KCkpOworICAgIAorICAgIE1hcDxEb3VibGUsU3RyaW5nPiBtaXhlZExvbmdzQW5kRG91YmxlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPERvdWJsZSxTdHJpbmc+KCk7IC8vIHByZXNlcnZlIG9yZGVyCisgICAgbWl4ZWRMb25nc0FuZERvdWJsZXMucHV0KDg1LjAsICI4NSIpOworICAgIG1peGVkTG9uZ3NBbmREb3VibGVzLnB1dCgyLjk0NDIzRS05LCAiMi45NDQyM0UtOSIpOworICAgIG1peGVkTG9uZ3NBbmREb3VibGVzLnB1dCgyODk0NTE4LjAsICIyLDg5NCw1MTgiKTsKKyAgICBtaXhlZExvbmdzQW5kRG91Ymxlcy5wdXQoNDg3OTQ3MjEuOTM3LCAiNDgsNzk0LDcyMS45MzciKTsKKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjM0NCIpLCBmKGZpZWxkTmFtZSwgbWl4ZWRMb25nc0FuZERvdWJsZXMudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBEb3VibGUpOworICAgICAgbWl4ZWRMb25nc0FuZERvdWJsZXMucmVtb3ZlKG8pOworICAgIH0KKyAgICBhc3NlcnRUcnVlKG1peGVkTG9uZ3NBbmREb3VibGVzLmlzRW1wdHkoKSk7CisgICAgCisgICAgU2V0PFN0cmluZz4gbWl4ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgbWl4ZWQuYWRkKCJ0cnVlIik7CisgICAgbWl4ZWQuYWRkKCIxNjgyLTA3LTIyVDE4OjMzOjAwLjAwMFoiKTsKKyAgICBtaXhlZC5hZGQoIjIsODk0LDUxOCIpOworICAgIG1peGVkLmFkZCgiMzA4LDM5MywxMzEsMzc5LDkwMCIpOworICAgIG1peGVkLmFkZCgiNDgsNzk0LDcyMS45MzciKTsKKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjM0NSIpLCBmKGZpZWxkTmFtZSwgbWl4ZWQpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBTdHJpbmcpOworICAgIH0KKworICAgIE1hcDxEb3VibGUsT2JqZWN0PiBtaXhlZERvdWJsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxEb3VibGUsT2JqZWN0PigpOyAvLyBwcmVzZXJ2ZSBvcmRlcgorICAgIG1peGVkRG91Ymxlcy5wdXQoODUuMCwgIjg1Iik7CisgICAgbWl4ZWREb3VibGVzLnB1dCgyLjk0NDIzRS05LCAyLjk0NDIzRS05KTsgLy8gRG91YmxlLXR5cGVkIGZpZWxkIHZhbHVlCisgICAgbWl4ZWREb3VibGVzLnB1dCgyODk0NTE4LjAsICIyLDg5NCw1MTgiKTsKKyAgICBtaXhlZERvdWJsZXMucHV0KDQ4Nzk0NzIxLjkzNywgIjQ4LDc5NCw3MjEuOTM3Iik7CisgICAgZCA9IHByb2Nlc3NBZGQoY2hhaW4sIGRvYyhmKCJpZCIsICIzMzkxIiksIGYoZmllbGROYW1lLCBtaXhlZERvdWJsZXMudmFsdWVzKCkpKSk7CisgICAgYXNzZXJ0Tm90TnVsbChkKTsKKyAgICBmb3IgKE9iamVjdCBvIDogZC5nZXRGaWVsZFZhbHVlcyhmaWVsZE5hbWUpKSB7CisgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBEb3VibGUpOworICAgICAgbWl4ZWREb3VibGVzLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShtaXhlZERvdWJsZXMuaXNFbXB0eSgpKTsKKworICAgIE1hcDxJbnRlZ2VyLE9iamVjdD4gbWl4ZWRJbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8SW50ZWdlcixPYmplY3Q+KCk7IC8vIHByZXNlcnZlIG9yZGVyCisgICAgbWl4ZWRJbnRzLnB1dCg4NSwgIjg1Iik7CisgICAgbWl4ZWRJbnRzLnB1dCgyOTQ0MjMsIDI5NDQyMyk7IC8vIEludGVnZXItdHlwZWQgZmllbGQgdmFsdWUKKyAgICBtaXhlZEludHMucHV0KC0yODk0NTE4LCAiLTIsODk0LDUxOCIpOworICAgIG1peGVkSW50cy5wdXQoMTg3OTQ3MjE5MywgIjEsODc5LDQ3MiwxOTMiKTsKKyAgICBkID0gcHJvY2Vzc0FkZChjaGFpbiwgZG9jKGYoImlkIiwgIjMzOTIiKSwgZihmaWVsZE5hbWUsIG1peGVkSW50cy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKGZpZWxkTmFtZSkpIHsKKyAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIEludGVnZXIpOworICAgICAgbWl4ZWRJbnRzLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShtaXhlZEludHMuaXNFbXB0eSgpKTsKKworICAgIE1hcDxMb25nLE9iamVjdD4gbWl4ZWRMb25ncyA9IG5ldyBMaW5rZWRIYXNoTWFwPExvbmcsT2JqZWN0PigpOyAvLyBwcmVzZXJ2ZSBvcmRlcgorICAgIG1peGVkTG9uZ3MucHV0KDg1TCwgIjg1Iik7CisgICAgbWl4ZWRMb25ncy5wdXQoNDI5NDQyMzNMLCA0Mjk0NDIzM0wpOyAvLyBMb25nLXR5cGVkIGZpZWxkIHZhbHVlCisgICAgbWl4ZWRMb25ncy5wdXQoMjg5NDUxOEwsICIyLDg5NCw1MTgiKTsKKyAgICBtaXhlZExvbmdzLnB1dCg0ODc5NDcyMTkzN0wsICI0OCw3OTQsNzIxLDkzNyIpOworICAgIGQgPSBwcm9jZXNzQWRkKGNoYWluLCBkb2MoZigiaWQiLCAiMzM5MyIpLCBmKGZpZWxkTmFtZSwgbWl4ZWRMb25ncy52YWx1ZXMoKSkpKTsKKyAgICBhc3NlcnROb3ROdWxsKGQpOworICAgIGZvciAoT2JqZWN0IG8gOiBkLmdldEZpZWxkVmFsdWVzKGZpZWxkTmFtZSkpIHsKKyAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIExvbmcpOworICAgICAgbWl4ZWRMb25ncy5yZW1vdmUobyk7CisgICAgfQorICAgIGFzc2VydFRydWUobWl4ZWRMb25ncy5pc0VtcHR5KCkpOworCisgICAgTWFwPEJvb2xlYW4sT2JqZWN0PiBtaXhlZEJvb2xlYW5zID0gbmV3IExpbmtlZEhhc2hNYXA8Qm9vbGVhbixPYmplY3Q+KCk7IC8vIHByZXNlcnZlIG9yZGVyCisgICAgbWl4ZWRCb29sZWFucy5wdXQodHJ1ZSwgInRydWUiKTsKKyAgICBtaXhlZEJvb2xlYW5zLnB1dChmYWxzZSwgZmFsc2UpOyAvLyBCb29sZWFuLXR5cGVkIGZpZWxkIHZhbHVlCisgICAgbWl4ZWRCb29sZWFucy5wdXQoZmFsc2UsICJmYWxzZSIpOworICAgIG1peGVkQm9vbGVhbnMucHV0KHRydWUsICJ0cnVlIik7CisgICAgZCA9IHByb2Nlc3NBZGQoY2hhaW4sIGRvYyhmKCJpZCIsICIzMzk0IiksIGYoZmllbGROYW1lLCBtaXhlZEJvb2xlYW5zLnZhbHVlcygpKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgZm9yIChPYmplY3QgbyA6IGQuZ2V0RmllbGRWYWx1ZXMoZmllbGROYW1lKSkgeworICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgQm9vbGVhbik7CisgICAgICBtaXhlZEJvb2xlYW5zLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShtaXhlZEJvb2xlYW5zLmlzRW1wdHkoKSk7CisKKyAgICBkYXRlVGltZUZvcm1hdHRlciA9IElTT0RhdGVUaW1lRm9ybWF0LmRhdGVPcHRpb25hbFRpbWVQYXJzZXIoKS53aXRoWm9uZVVUQygpOworICAgIE1hcDxEYXRlLE9iamVjdD4gbWl4ZWREYXRlcyA9IG5ldyBIYXNoTWFwPERhdGUsT2JqZWN0PigpOworICAgIGRhdGVTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgIjIwMjAtMDUtMTNUMTg6NDciLCAiMTk4OS0xMi0xNCIsICIxNjgyLTA3LTIyVDE4OjMzOjAwLjAwMFoiIH07CisgICAgZm9yIChTdHJpbmcgZGF0ZVN0cmluZyA6IGRhdGVTdHJpbmdzKSB7CisgICAgICBtaXhlZERhdGVzLnB1dChkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKGRhdGVTdHJpbmcpLnRvRGF0ZSgpLCBkYXRlU3RyaW5nKTsKKyAgICB9CisgICAgRGF0ZSBleHRyYURhdGUgPSBkYXRlVGltZUZvcm1hdHRlci5wYXJzZURhdGVUaW1lKCIyMDAzLTA0LTI0IikudG9EYXRlKCk7CisgICAgbWl4ZWREYXRlcy5wdXQoZXh0cmFEYXRlLCBleHRyYURhdGUpOyAvLyBEYXRlLXR5cGVkIGZpZWxkIHZhbHVlCisgICAgZCA9IHByb2Nlc3NBZGQoY2hhaW4sIGRvYyhmKCJpZCIsICIzMzk1IiksIGYoZmllbGROYW1lLCBtaXhlZERhdGVzLnZhbHVlcygpKSkpOworICAgIGFzc2VydE5vdE51bGwoZCk7CisgICAgZm9yIChPYmplY3QgbyA6IGQuZ2V0RmllbGRWYWx1ZXMoZmllbGROYW1lKSkgeworICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgRGF0ZSk7CisgICAgICBtaXhlZERhdGVzLnJlbW92ZShvKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShtaXhlZERhdGVzLmlzRW1wdHkoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9SZWdleEJvb3N0UHJvY2Vzc29yVGVzdC5qYXZhIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1JlZ2V4Qm9vc3RQcm9jZXNzb3JUZXN0LmphdmEKaW5kZXggZDc1N2JkMi4uZGFjMGFkMCAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1JlZ2V4Qm9vc3RQcm9jZXNzb3JUZXN0LmphdmEKKysrIGIvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1JlZ2V4Qm9vc3RQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIAogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hMTIueG1sIik7CiAgICAgU29sckNvcmUgY29yZSA9IGguZ2V0Q29yZSgpOwogICAgIF9wYXJzZXIgPSBuZXcgU29sclJlcXVlc3RQYXJzZXJzKCBudWxsICk7CmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvU2lnbmF0dXJlVXBkYXRlUHJvY2Vzc29yRmFjdG9yeVRlc3QuamF2YSBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9TaWduYXR1cmVVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDcwMDNjZTAuLmVmN2E4ZjMgMTAwNzU1Ci0tLSBhL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9TaWduYXR1cmVVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9TaWduYXR1cmVVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdC5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAKICAgQEJlZm9yZUNsYXNzCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciLCAiZmFsc2UiKTsgLy8gc2NoZW1hMTIgZG9lc24ndCBzdXBwb3J0IF92ZXJzaW9uXwogICAgIGluaXRDb3JlKCJzb2xyY29uZmlnLnhtbCIsICJzY2hlbWExMi54bWwiKTsKICAgfQogCmRpZmYgLS1naXQgYS9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvVW5pcUZpZWxkc1VwZGF0ZVByb2Nlc3NvckZhY3RvcnlUZXN0LmphdmEgYi9zb2xyL2NvcmUvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL3VwZGF0ZS9wcm9jZXNzb3IvVW5pcUZpZWxkc1VwZGF0ZVByb2Nlc3NvckZhY3RvcnlUZXN0LmphdmEKaW5kZXggMzBlY2JkZS4uNzhhYzU4YSAxMDA2NDQKLS0tIGEvc29sci9jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci91cGRhdGUvcHJvY2Vzc29yL1VuaXFGaWVsZHNVcGRhdGVQcm9jZXNzb3JGYWN0b3J5VGVzdC5qYXZhCisrKyBiL3NvbHIvY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvdXBkYXRlL3Byb2Nlc3Nvci9VbmlxRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeVRlc3QuamF2YQpAQCAtNDMsNiArNDMsNyBAQAogCiAgIEBCZWZvcmVDbGFzcwogICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVuYWJsZS51cGRhdGUubG9nIiwgImZhbHNlIik7IC8vIHNjaGVtYTEyIGRvZXNuJ3Qgc3VwcG9ydCBfdmVyc2lvbl8KICAgICBpbml0Q29yZSgic29scmNvbmZpZy54bWwiLCAic2NoZW1hMTIueG1sIik7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvY3VycmVuY3kueG1sIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvY3VycmVuY3kueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWM1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9jdXJyZW5jeS54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEV4YW1wbGUgZXhjaGFuZ2UgcmF0ZXMgZmlsZSBmb3IgQ3VycmVuY3lGaWVsZCB0eXBlIG5hbWVkICJjdXJyZW5jeSIgaW4gZXhhbXBsZSBzY2hlbWEgLS0+CisKKzxjdXJyZW5jeUNvbmZpZyB2ZXJzaW9uPSIxLjAiPgorICA8cmF0ZXM+CisgICAgPCEtLSBVcGRhdGVkIGZyb20gaHR0cDovL3d3dy5leGNoYW5nZXJhdGUuY29tLyBhdCAyMDExLTA5LTI3IC0tPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkFSUyIgcmF0ZT0iNC4zMzM4NzEiIGNvbW1lbnQ9IkFSR0VOVElOQSBQZXNvIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkFVRCIgcmF0ZT0iMS4wMjU3NjgiIGNvbW1lbnQ9IkFVU1RSQUxJQSBEb2xsYXIiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iRVVSIiByYXRlPSIwLjc0MzY3NiIgY29tbWVudD0iRXVyb3BlYW4gRXVybyIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJCUkwiIHJhdGU9IjEuODgxMDkzIiBjb21tZW50PSJCUkFaSUwgUmVhbCIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJDQUQiIHJhdGU9IjEuMDMwODE1IiBjb21tZW50PSJDQU5BREEgRG9sbGFyIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkNMUCIgcmF0ZT0iNTE5LjA5OTYiIGNvbW1lbnQ9IkNISUxFIFBlc28iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQ05ZIiByYXRlPSI2LjM4NzMxMCIgY29tbWVudD0iQ0hJTkEgWXVhbiIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJDWksiIHJhdGU9IjE4LjQ3MTM0IiBjb21tZW50PSJDWkVDSCBSRVAuIEtvcnVuYSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJES0siIHJhdGU9IjUuNTE1NDM2IiBjb21tZW50PSJERU5NQVJLIEtyb25lIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkhLRCIgcmF0ZT0iNy44MDE5MjIiIGNvbW1lbnQ9IkhPTkcgS09ORyBEb2xsYXIiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iSFVGIiByYXRlPSIyMTUuNjE2OSIgY29tbWVudD0iSFVOR0FSWSBGb3JpbnQiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iSVNLIiByYXRlPSIxMTguMTI4MCIgY29tbWVudD0iSUNFTEFORCBLcm9uYSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJJTlIiIHJhdGU9IjQ5LjQ5MDg4IiBjb21tZW50PSJJTkRJQSBSdXBlZSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJYRFIiIHJhdGU9IjAuNjQxMzU4IiBjb21tZW50PSJJTlROTCBNT04uIEZVTkQgU0RSIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IklMUyIgcmF0ZT0iMy43MDk3MzkiIGNvbW1lbnQ9IklTUkFFTCBTaGVxZWwiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iSlBZIiByYXRlPSI3Ni4zMjQxOSIgY29tbWVudD0iSkFQQU4gWWVuIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IktSVyIgcmF0ZT0iMTE2OS4xNzMiIGNvbW1lbnQ9IktPUkVBIChTT1VUSCkgV29uIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IktXRCIgcmF0ZT0iMC4yNzUxNDIiIGNvbW1lbnQ9IktVV0FJVCBEaW5hciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJNWE4iIHJhdGU9IjEzLjg1ODk1IiBjb21tZW50PSJNRVhJQ08gUGVzbyIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJOWkQiIHJhdGU9IjEuMjg1MTU5IiBjb21tZW50PSJORVcgWkVBTEFORCBEb2xsYXIiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iTk9LIiByYXRlPSI1Ljg1OTAzNSIgY29tbWVudD0iTk9SV0FZIEtyb25lIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlBLUiIgcmF0ZT0iODcuNTcwMDciIGNvbW1lbnQ9IlBBS0lTVEFOIFJ1cGVlIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlBFTiIgcmF0ZT0iMi43MzA2ODMiIGNvbW1lbnQ9IlBFUlUgU29sIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlBIUCIgcmF0ZT0iNDMuNjIwMzkiIGNvbW1lbnQ9IlBISUxJUFBJTkVTIFBlc28iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iUExOIiByYXRlPSIzLjMxMDEzOSIgY29tbWVudD0iUE9MQU5EIFpsb3R5IiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlJPTiIgcmF0ZT0iMy4xMDA5MzIiIGNvbW1lbnQ9IlJPTUFOSUEgTGV1IiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IlJVQiIgcmF0ZT0iMzIuMTQ2NjMiIGNvbW1lbnQ9IlJVU1NJQSBSdWJsZSIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJTQVIiIHJhdGU9IjMuNzUwNDY1IiBjb21tZW50PSJTQVVESSBBUkFCSUEgUml5YWwiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iU0dEIiByYXRlPSIxLjI5OTM1MiIgY29tbWVudD0iU0lOR0FQT1JFIERvbGxhciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJaQVIiIHJhdGU9IjguMzI5NzYxIiBjb21tZW50PSJTT1VUSCBBRlJJQ0EgUmFuZCIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJTRUsiIHJhdGU9IjYuODgzNDQyIiBjb21tZW50PSJTV0VERU4gS3JvbmEiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iQ0hGIiByYXRlPSIwLjkwNjAzNSIgY29tbWVudD0iU1dJVFpFUkxBTkQgRnJhbmMiIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iVFdEIiByYXRlPSIzMC40MDI4MyIgY29tbWVudD0iVEFJV0FOIERvbGxhciIgLz4KKyAgICA8cmF0ZSBmcm9tPSJVU0QiIHRvPSJUSEIiIHJhdGU9IjMwLjg5NDg3IiBjb21tZW50PSJUSEFJTEFORCBCYWh0IiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkFFRCIgcmF0ZT0iMy42NzI5NTUiIGNvbW1lbnQ9IlUuQS5FLiBEaXJoYW0iIC8+CisgICAgPHJhdGUgZnJvbT0iVVNEIiB0bz0iVUFIIiByYXRlPSI3Ljk4ODU4MiIgY29tbWVudD0iVUtSQUlORSBIcnl2bmlhIiAvPgorICAgIDxyYXRlIGZyb209IlVTRCIgdG89IkdCUCIgcmF0ZT0iMC42NDc5MTAiIGNvbW1lbnQ9IlVOSVRFRCBLSU5HRE9NIFBvdW5kIiAvPgorICAgIAorICAgIDwhLS0gQ3Jvc3MtcmF0ZXMgZm9yIHNvbWUgY29tbW9uIGN1cnJlbmNpZXMgLS0+CisgICAgPHJhdGUgZnJvbT0iRVVSIiB0bz0iR0JQIiByYXRlPSIwLjg2OTkxNCIgLz4gIAorICAgIDxyYXRlIGZyb209IkVVUiIgdG89Ik5PSyIgcmF0ZT0iNy44MDAwOTUiIC8+ICAKKyAgICA8cmF0ZSBmcm9tPSJHQlAiIHRvPSJOT0siIHJhdGU9IjguOTY2NTA4IiAvPiAgCisgIDwvcmF0ZXM+Cis8L2N1cnJlbmN5Q29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZWxldmF0ZS54bWwgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9lbGV2YXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQ1Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvZWxldmF0ZS54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gSWYgdGhpcyBmaWxlIGlzIGZvdW5kIGluIHRoZSBjb25maWcgZGlyZWN0b3J5LCBpdCB3aWxsIG9ubHkgYmUKKyAgICAgbG9hZGVkIG9uY2UgYXQgc3RhcnR1cC4gIElmIGl0IGlzIGZvdW5kIGluIFNvbHIncyBkYXRhCisgICAgIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSByZS1sb2FkZWQgZXZlcnkgY29tbWl0LgorCisgICBTZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1F1ZXJ5RWxldmF0aW9uQ29tcG9uZW50IGZvciBtb3JlIGluZm8KKworLS0+Cis8ZWxldmF0ZT4KKyA8cXVlcnkgdGV4dD0iZm9vIGJhciI+CisgIDxkb2MgaWQ9IjEiIC8+CisgIDxkb2MgaWQ9IjIiIC8+CisgIDxkb2MgaWQ9IjMiIC8+CisgPC9xdWVyeT4KKyAKKyA8cXVlcnkgdGV4dD0iaXBvZCI+CisgICA8ZG9jIGlkPSJNQTE0N0xML0EiIC8+ICA8IS0tIHB1dCB0aGUgYWN0dWFsIGlwb2QgYXQgdGhlIHRvcCAtLT4KKyAgIDxkb2MgaWQ9IklXLTAyIiBleGNsdWRlPSJ0cnVlIiAvPiA8IS0tIGV4Y2x1ZGUgdGhpcyBjYWJsZSAtLT4KKyA8L3F1ZXJ5PgorIAorPC9lbGV2YXRlPgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfY2EudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfY2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2E4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQKQEAgLTAsMCArMSw4IEBACisjIFNldCBvZiBDYXRhbGFuIGNvbnRyYWN0aW9ucyBmb3IgRWxpc2lvbkZpbHRlcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2QKK2wKK20KK24KK3MKK3QKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2ZyLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2ZyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJiYTUxCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0CkBAIC0wLDAgKzEsMTUgQEAKKyMgU2V0IG9mIEZyZW5jaCBjb250cmFjdGlvbnMgZm9yIEVsaXNpb25GaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitsCittCit0CitxdQorbgorcworagorZAorYworanVzcXUKK3F1b2lxdQorbG9yc3F1CitwdWlzcXUKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2dhLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvY29udHJhY3Rpb25zX2dhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWJlN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0CkBAIC0wLDAgKzEsNSBAQAorIyBTZXQgb2YgSXJpc2ggY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyCisjIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbAorZAorbQorYgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfaXQudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9jb250cmFjdGlvbnNfaXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzA0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL2NvbnRyYWN0aW9uc19pdC50eHQKQEAgLTAsMCArMSwyMyBAQAorIyBTZXQgb2YgSXRhbGlhbiBjb250cmFjdGlvbnMgZm9yIEVsaXNpb25GaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitjCitsIAorYWxsIAorZGFsbCAKK2RlbGwgCituZWxsIAorc3VsbCAKK2NvbGwgCitwZWxsIAorZ2wgCithZ2wgCitkYWdsIAorZGVnbCAKK25lZ2wgCitzdWdsIAordW4gCittIAordCAKK3MgCit2IAorZApkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9oeXBoZW5hdGlvbnNfZ2EudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9oeXBoZW5hdGlvbnNfZ2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMjY0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQKQEAgLTAsMCArMSw1IEBACisjIFNldCBvZiBJcmlzaCBoeXBoZW5hdGlvbnMgZm9yIFN0b3BGaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitoCituCit0CmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0ZW1kaWN0X25sLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RlbWRpY3RfbmwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTA3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0ZW1kaWN0X25sLnR4dApAQCAtMCwwICsxLDYgQEAKKyMgU2V0IG9mIG92ZXJyaWRlcyBmb3IgdGhlIGR1dGNoIHN0ZW1tZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitmaWV0cwlmaWV0cworYnJvbWZpZXRzCWJyb21maWV0cworZWkJZWllcgora2luZAlraW5kZXIKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHRhZ3NfamEudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wdGFnc19qYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNzUwOAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHRhZ3NfamEudHh0CkBAIC0wLDAgKzEsNDIwIEBACisjCisjIFRoaXMgZmlsZSBkZWZpbmVzIGEgSmFwYW5lc2Ugc3RvcHRhZyBzZXQgZm9yIEphcGFuZXNlUGFydE9mU3BlZWNoU3RvcEZpbHRlci4KKyMKKyMgQW55IHRva2VuIHdpdGggYSBwYXJ0LW9mLXNwZWVjaCB0YWcgdGhhdCBleGFjdGx5IG1hdGNoZXMgdGhvc2UgZGVmaW5lZCBpbiB0aGlzCisjIGZpbGUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgdG9rZW4gc3RyZWFtLgorIworIyBTZXQgeW91ciBvd24gc3RvcHRhZ3MgYnkgdW5jb21tZW50aW5nIHRoZSBsaW5lcyBiZWxvdy4gIE5vdGUgdGhhdCBjb21tZW50cyBhcmUKKyMgbm90IGFsbG93ZWQgb24gdGhlIHNhbWUgbGluZSBhcyBhIHN0b3B0YWcuICBTZWUgTFVDRU5FLTM3NDUgZm9yIGZyZXF1ZW5jeSBsaXN0cywKKyMgZXRjLiB0aGF0IGNhbiBiZSB1c2VmdWwgZm9yIGJ1aWxkaW5nIHlvdSBvd24gc3RvcHRhZyBzZXQuCisjCisjIFRoZSBlbnRpcmUgcG9zc2libGUgdGFnc2V0IGlzIHByb3ZpZGVkIGJlbG93IGZvciBjb252ZW5pZW5jZS4KKyMKKyMjIyMjCisjICBub3VuOiB1bmNsYXNzaWZpZWQgbm91bnMKKyPlkI3oqZ4KKyMKKyMgIG5vdW4tY29tbW9uOiBDb21tb24gbm91bnMgb3Igbm91bnMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQKKyPlkI3oqZ4t5LiA6IisCisjCisjICBub3VuLXByb3BlcjogUHJvcGVyIG5vdW5zIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkIAorI+WQjeipni3lm7rmnInlkI3oqZ4KKyMKKyMgIG5vdW4tcHJvcGVyLW1pc2M6IG1pc2NlbGxhbmVvdXMgcHJvcGVyIG5vdW5zCisj5ZCN6KmeLeWbuuacieWQjeipni3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyLXBlcnNvbjogUGVyc29uYWwgbmFtZXMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS6uuWQjQorIworIyAgbm91bi1wcm9wZXItcGVyc29uLW1pc2M6IG5hbWVzIHRoYXQgY2Fubm90IGJlIGRpdmlkZWQgaW50byBzdXJuYW1lIGFuZCAKKyMgIGdpdmVuIG5hbWU7IGZvcmVpZ24gbmFtZXM7IG5hbWVzIHdoZXJlIHRoZSBzdXJuYW1lIG9yIGdpdmVuIG5hbWUgaXMgdW5rbm93bi4KKyMgIGUuZy4g44GK5biC44Gu5pa5Cisj5ZCN6KmeLeWbuuacieWQjeipni3kurrlkI0t5LiA6IisCisjCisjICBub3VuLXByb3Blci1wZXJzb24tc3VybmFtZTogTWFpbmx5IEphcGFuZXNlIHN1cm5hbWVzLgorIyAgZS5nLiDlsbHnlLAKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS6uuWQjS3lp5MKKyMKKyMgIG5vdW4tcHJvcGVyLXBlcnNvbi1naXZlbl9uYW1lOiBNYWlubHkgSmFwYW5lc2UgZ2l2ZW4gbmFtZXMuCisjICBlLmcuIOWkqumDjgorI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeWQjQorIworIyAgbm91bi1wcm9wZXItb3JnYW5pemF0aW9uOiBOYW1lcyByZXByZXNlbnRpbmcgb3JnYW5pemF0aW9ucy4KKyMgIGUuZy4g6YCa55Sj55yBLCBOSEsKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLee1hOe5lAorIworIyAgbm91bi1wcm9wZXItcGxhY2U6IFBsYWNlIG5hbWVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkCisj5ZCN6KmeLeWbuuacieWQjeipni3lnLDln58KKyMKKyMgIG5vdW4tcHJvcGVyLXBsYWNlLW1pc2M6IFBsYWNlIG5hbWVzIGV4Y2x1ZGluZyBjb3VudHJpZXMuCisjICBlLmcuIOOCouOCuOOCoiwg44OQ44Or44K744Ot44OKLCDkuqzpg70KKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeWcsOWfny3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyLXBsYWNlLWNvdW50cnk6IENvdW50cnkgbmFtZXMuIAorIyAgZS5nLiDml6XmnKwsIOOCquODvOOCueODiOODqeODquOCogorI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fLeWbvQorIworIyAgbm91bi1wcm9ub3VuOiBQcm9ub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3ku6PlkI3oqZ4KKyMKKyMgIG5vdW4tcHJvbm91bi1taXNjOiBtaXNjZWxsYW5lb3VzIHByb25vdW5zOiAKKyMgIGUuZy4g44Gd44KMLCDjgZPjgZMsIOOBguOBhOOBpCwg44GC44Gq44GfLCDjgYLjgaHjgZPjgaEsIOOBhOOBj+OBpCwg44Gp44GT44GLLCDjgarjgassIOOBv+OBquOBleOCkywg44G/44KT44GqLCDjgo/jgZ/jgY/jgZcsIOOCj+OCjOOCj+OCjAorI+WQjeipni3ku6PlkI3oqZ4t5LiA6IisCisjCisjICBub3VuLXByb25vdW4tY29udHJhY3Rpb246IFNwb2tlbiBsYW5ndWFnZSBjb250cmFjdGlvbiBtYWRlIGJ5IGNvbWJpbmluZyBhIAorIyAgcHJvbm91biBhbmQgdGhlIHBhcnRpY2xlICd3YScuCisjICBlLmcuIOOBguOCiuOCgywg44GT44KK44KDLCDjgZPjgorjgoPjgYIsIOOBneOCiuOCgywg44Gd44KK44KD44GCIAorI+WQjeipni3ku6PlkI3oqZ4t57iu57SECisjCisjICBub3VuLWFkdmVyYmlhbDogVGVtcG9yYWwgbm91bnMgc3VjaCBhcyBuYW1lcyBvZiBkYXlzIG9yIG1vbnRocyB0aGF0IGJlaGF2ZSAKKyMgIGxpa2UgYWR2ZXJicy4gTm91bnMgdGhhdCByZXByZXNlbnQgYW1vdW50IG9yIHJhdGlvcyBhbmQgY2FuIGJlIHVzZWQgYWR2ZXJiaWFsbHksCisjICBlLmcuIOmHkeabnCwg5LiA5pyILCDljYjlvowsIOWwkemHjworI+WQjeipni3lia/oqZ7lj6/og70KKyMKKyMgIG5vdW4tdmVyYmFsOiBOb3VucyB0aGF0IHRha2UgYXJndW1lbnRzIHdpdGggY2FzZSBhbmQgY2FuIGFwcGVhciBmb2xsb3dlZCBieSAKKyMgICdzdXJ1JyBhbmQgcmVsYXRlZCB2ZXJicyAo44GZ44KLLCDjgafjgY3jgossIOOBquOBleOCiywg44GP44Gg44GV44KLKQorIyAgZS5nLiDjgqTjg7Pjg5fjg4Pjg4gsIOaEm+edgCwg5oKq5YyWLCDmgqrmiKboi6bpl5gsIOS4gOWuieW/gywg5LiL5Y+W44KKCisj5ZCN6KmeLeOCteWkieaOpee2mgorIworIyAgbm91bi1hZGplY3RpdmUtYmFzZTogVGhlIGJhc2UgZm9ybSBvZiBhZGplY3RpdmVzLCB3b3JkcyB0aGF0IGFwcGVhciBiZWZvcmUg44GqICgibmEiKQorIyAgZS5nLiDlgaXlurcsIOWuieaYkywg6aeE55uuLCDjgaDjgoEKKyPlkI3oqZ4t5b2i5a655YuV6Kme6Kqe5bm5CisjCisjICBub3VuLW51bWVyaWM6IEFyYWJpYyBudW1iZXJzLCBDaGluZXNlIG51bWVyYWxzLCBhbmQgY291bnRlcnMgbGlrZSDkvZUgKOWbniksIOaVsC4KKyMgIGUuZy4gMCwgMSwgMiwg5L2VLCDmlbAsIOW5vgorI+WQjeipni3mlbAKKyMKKyMgIG5vdW4tYWZmaXg6IG5vdW4gYWZmaXhlcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3pnZ7oh6rnq4sKKyMKKyMgIG5vdW4tYWZmaXgtbWlzYzogT2YgYWRub21pbmFsaXplcnMsIHRoZSBjYXNlLW1hcmtlciDjga4gKCJubyIpLCBhbmQgd29yZHMgdGhhdCAKKyMgIGF0dGFjaCB0byB0aGUgYmFzZSBmb3JtIG9mIGluZmxlY3Rpb25hbCB3b3Jkcywgd29yZHMgdGhhdCBjYW5ub3QgYmUgY2xhc3NpZmllZCAKKyMgIGludG8gYW55IG9mIHRoZSBvdGhlciBjYXRlZ29yaWVzIGJlbG93LiBUaGlzIGNhdGVnb3J5IGluY2x1ZGVzIGluZGVmaW5pdGUgbm91bnMuCisjICBlLmcuIOOBguOBi+OBpOOBjSwg5pqBLCDjgYvjgYQsIOeUsuaWkCwg5rCXLCDjgY3jgonjgYQsIOWrjOOBhCwg44GP44GbLCDnmZYsIOOBk+OBqCwg5LqLLCDjgZTjgagsIOavjiwg44GX44Gg44GELCDmrKHnrKwsIAorIyAgICAgICDpoIYsIOOBm+OBhCwg5omA54K6LCDjgaTjgYTjgacsIOW6j+OBpywg44Gk44KC44KKLCDnqY3jgoLjgoosIOeCuSwg44Gp44GT44KNLCDjga4sIOOBr+OBmiwg562ILCDjga/jgZrjgb8sIOW8vuOBvywgCisjICAgICAgIOaLjeWtkCwg44G144GGLCDjgbXjgoosIOaMr+OCiiwg44G744GGLCDmlrksIOaXqCwg44KC44GuLCDniaksIOiAhSwg44KG44GILCDmlYUsIOOChuOBiOOCkywg5omA5LulLCDjgo/jgZEsIOiosywKKyMgICAgICAg44KP44KKLCDlibLjgoosIOWJsiwg44KTLeWPo+iqni8sIOOCguOCky3lj6Poqp4vCisj5ZCN6KmeLemdnuiHqueriy3kuIDoiKwKKyMKKyMgIG5vdW4tYWZmaXgtYWR2ZXJiaWFsOiBub3VuIGFmZml4ZXMgdGhhdCB0aGF0IGNhbiBiZWhhdmUgYXMgYWR2ZXJicy4KKyMgIGUuZy4g44GC44GE44GgLCDplpMsIOOBguOBkuOBjywg5oyZ44GS5Y+lLCDjgYLjgagsIOW+jCwg5L2Z44KKLCDku6XlpJYsIOS7pemZjSwg5Lul5b6MLCDku6XkuIosIOS7peWJjSwg5LiA5pa5LCDjgYbjgYgsIAorIyAgICAgICDkuIosIOOBhuOBoSwg5YaFLCDjgYrjgoosIOaKmOOCiiwg44GL44GO44KKLCDpmZDjgoosIOOBjeOCiiwg44Gj44GN44KKLCDntZDmnpwsIOOBk+OCjSwg6aCDLCDjgZXjgYQsIOmamywg5pyA5LitLCDjgZXjgarjgYssIAorIyAgICAgICDmnIDkuK0sIOOBmOOBn+OBhCwg6Ieq5L2TLCDjgZ/jgbMsIOW6piwg44Gf44KBLCDngrosIOOBpOOBqSwg6YO95bqmLCDjgajjgYrjgoosIOmAmuOCiiwg44Go44GNLCDmmYIsIOOBqOOBk+OCjSwg5omALCAKKyMgICAgICAg44Go44Gf44KTLCDpgJTnq68sIOOBquOBiywg5LitLCDjga7jgaEsIOW+jCwg44Gw44GC44GELCDloLTlkIgsIOaXpSwg44G244KTLCDliIYsIOOBu+OBiywg5LuWLCDjgb7jgYgsIOWJjSwg44G+44G+LCAKKyMgICAgICAg5YSYLCDkvq0sIOOBv+OBjuOCiiwg55+i5YWICisj5ZCN6KmeLemdnuiHqueriy3lia/oqZ7lj6/og70KKyMKKyMgIG5vdW4tYWZmaXgtYXV4OiBub3VuIGFmZml4ZXMgdHJlYXRlZCBhcyDliqnli5XoqZ4gKCJhdXhpbGlhcnkgdmVyYiIpIGluIHNjaG9vbCBncmFtbWFycyAKKyMgIHdpdGggdGhlIHN0ZW0g44KI44GGKOOBoCkgKCJ5b3UoZGEpIikuCisjICBlLmcuICDjgojjgYYsIOOChOOBhiwg5qeYICjjgojjgYYpCisj5ZCN6KmeLemdnuiHqueriy3liqnli5XoqZ7oqp7lubkKKyMgIAorIyAgbm91bi1hZmZpeC1hZGplY3RpdmUtYmFzZTogbm91biBhZmZpeGVzIHRoYXQgY2FuIGNvbm5lY3QgdG8gdGhlIGluZGVjbGluYWJsZQorIyAgY29ubmVjdGlvbiBmb3JtIOOBqiAoYXV4ICJkYSIpLgorIyAgZS5nLiDjgb/jgZ/jgYQsIOOBteOBhgorI+WQjeipni3pnZ7oh6rnq4st5b2i5a655YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXNwZWNpYWw6IHNwZWNpYWwgbm91bnMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQuCisj5ZCN6KmeLeeJueauigorIworIyAgbm91bi1zcGVjaWFsLWF1eDogVGhlIOOBneOBhuOBoCAoInNvdWRhIikgc3RlbSBmb3JtIHRoYXQgaXMgdXNlZCBmb3IgcmVwb3J0aW5nIG5ld3MsIGlzIAorIyAgdHJlYXRlZCBhcyDliqnli5XoqZ4gKCJhdXhpbGlhcnkgdmVyYiIpIGluIHNjaG9vbCBncmFtbWFycywgYW5kIGF0dGFjaCB0byB0aGUgYmFzZSAKKyMgIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzLgorIyAgZS5nLiDjgZ3jgYYKKyPlkI3oqZ4t54m55q6KLeWKqeWLleipnuiqnuW5uQorIworIyAgbm91bi1zdWZmaXg6IG5vdW4gc3VmZml4ZXMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQuCisj5ZCN6KmeLeaOpeWwvgorIworIyAgbm91bi1zdWZmaXgtbWlzYzogT2YgdGhlIG5vdW5zIG9yIHN0ZW0gZm9ybXMgb2Ygb3RoZXIgcGFydHMgb2Ygc3BlZWNoIHRoYXQgY29ubmVjdCAKKyMgIHRvIOOCrOODqyBvciDjgr/jgqQgYW5kIGNhbiBjb21iaW5lIGludG8gY29tcG91bmQgbm91bnMsIHdvcmRzIHRoYXQgY2Fubm90IGJlIGNsYXNzaWZpZWQgaW50bworIyAgYW55IG9mIHRoZSBvdGhlciBjYXRlZ29yaWVzIGJlbG93LiBJbiBnZW5lcmFsLCB0aGlzIGNhdGVnb3J5IGlzIG1vcmUgaW5jbHVzaXZlIHRoYW4gCisjICDmjqXlsL7oqp4gKCJzdWZmaXgiKSBhbmQgaXMgdXN1YWxseSB0aGUgbGFzdCBlbGVtZW50IGluIGEgY29tcG91bmQgbm91bi4KKyMgIGUuZy4g44GK44GNLCDjgYvjgZ8sIOaWuSwg55Sy5paQICjjgYzjgYQpLCDjgYzjgYvjgoosIOOBjuOBvywg5rCX5ZGzLCDjgZDjgovjgb8sICjvvZ7jgZfjgZ8pIOOBlSwg5qyh56ysLCDmuIggKOOBmikg44G/LAorIyAgICAgICDjgojjgYYsICjjgafjgY0p44Gj44GTLCDmhJ8sIOimsywg5oCnLCDlraYsIOmhniwg6Z2iLCDnlKgKKyPlkI3oqZ4t5o6l5bC+LeS4gOiIrAorIworIyAgbm91bi1zdWZmaXgtcGVyc29uOiBTdWZmaXhlcyB0aGF0IGZvcm0gbm91bnMgYW5kIGF0dGFjaCB0byBwZXJzb24gbmFtZXMgbW9yZSBvZnRlbgorIyAgdGhhbiBvdGhlciBub3Vucy4KKyMgIGUuZy4g5ZCbLCDmp5gsIOiRlworI+WQjeipni3mjqXlsL4t5Lq65ZCNCisjCisjICBub3VuLXN1ZmZpeC1wbGFjZTogU3VmZml4ZXMgdGhhdCBmb3JtIG5vdW5zIGFuZCBhdHRhY2ggdG8gcGxhY2UgbmFtZXMgbW9yZSBvZnRlbiAKKyMgIHRoYW4gb3RoZXIgbm91bnMuCisjICBlLmcuIOeUuiwg5biCLCDnnIwKKyPlkI3oqZ4t5o6l5bC+LeWcsOWfnworIworIyAgbm91bi1zdWZmaXgtdmVyYmFsOiBPZiB0aGUgc3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gbm91bnMgYW5kIGZvcm0gbm91bnMsIHRob3NlIHRoYXQgCisjICBjYW4gYXBwZWFyIGJlZm9yZSDjgrnjg6sgKCJzdXJ1IikuCisjICBlLmcuIOWMliwg6KaWLCDliIbjgZEsIOWFpeOCiiwg6JC944GhLCDosrfjgYQKKyPlkI3oqZ4t5o6l5bC+LeOCteWkieaOpee2mgorIworIyAgbm91bi1zdWZmaXgtYXV4OiBUaGUgc3RlbSBmb3JtIG9mIOOBneOBhuOBoCAo5qeY5oWLKSB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgY29uZGl0aW9ucywgCisjICBpcyB0cmVhdGVkIGFzIOWKqeWLleipniAoImF1eGlsaWFyeSB2ZXJiIikgaW4gc2Nob29sIGdyYW1tYXJzLCBhbmQgYXR0YWNoIHRvIHRoZSAKKyMgIGNvbmp1bmN0aXZlIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzLgorIyAgZS5nLiDjgZ3jgYYKKyPlkI3oqZ4t5o6l5bC+LeWKqeWLleipnuiqnuW5uQorIworIyAgbm91bi1zdWZmaXgtYWRqZWN0aXZlLWJhc2U6IFN1ZmZpeGVzIHRoYXQgYXR0YWNoIHRvIG90aGVyIG5vdW5zIG9yIHRoZSBjb25qdW5jdGl2ZSAKKyMgIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzIGFuZCBhcHBlYXIgYmVmb3JlIHRoZSBjb3B1bGEg44GgICgiZGEiKS4KKyMgIGUuZy4g55qELCDjgZIsIOOBjOOBoQorI+WQjeipni3mjqXlsL4t5b2i5a655YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXN1ZmZpeC1hZHZlcmJpYWw6IFN1ZmZpeGVzIHRoYXQgYXR0YWNoIHRvIG90aGVyIG5vdW5zIGFuZCBjYW4gYmVoYXZlIGFzIGFkdmVyYnMuCisjICBlLmcuIOW+jCAo44GUKSwg5Lul5b6MLCDku6XpmY0sIOS7peWJjSwg5YmN5b6MLCDkuK0sIOacqywg5LiKLCDmmYIgKOOBmCkKKyPlkI3oqZ4t5o6l5bC+LeWJr+ipnuWPr+iDvQorIworIyAgbm91bi1zdWZmaXgtY2xhc3NpZmllcjogU3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gbnVtYmVycyBhbmQgZm9ybSBub3Vucy4gVGhpcyBjYXRlZ29yeSAKKyMgIGlzIG1vcmUgaW5jbHVzaXZlIHRoYW4g5Yqp5pWw6KmeICgiY2xhc3NpZmllciIpIGFuZCBpbmNsdWRlcyBjb21tb24gbm91bnMgdGhhdCBhdHRhY2ggCisjICB0byBudW1iZXJzLgorIyAgZS5nLiDlgIssIOOBpCwg5pysLCDlhoosIOODkeODvOOCu+ODs+ODiCwgY20sIGtnLCDjgqvmnIgsIOOBi+WbvSwg5Yy655S7LCDmmYLplpMsIOaZguWNigorI+WQjeipni3mjqXlsL4t5Yqp5pWw6KmeCisjCisjICBub3VuLXN1ZmZpeC1zcGVjaWFsOiBTcGVjaWFsIHN1ZmZpeGVzIHRoYXQgbWFpbmx5IGF0dGFjaCB0byBpbmZsZWN0aW5nIHdvcmRzLgorIyAgZS5nLiAo5qW944GXKSDjgZUsICjogIPjgYgpIOaWuQorI+WQjeipni3mjqXlsL4t54m55q6KCisjCisjICBub3VuLXN1ZmZpeC1jb25qdW5jdGl2ZTogTm91bnMgdGhhdCBiZWhhdmUgbGlrZSBjb25qdW5jdGlvbnMgYW5kIGpvaW4gdHdvIHdvcmRzIAorIyAgdG9nZXRoZXIuCisjICBlLmcuICjml6XmnKwpIOWvviAo44Ki44Oh44Oq44KrKSwg5a++ICjjgqLjg6Hjg6rjgqspLCAoMykg5a++ICg1KSwgKOWls+WEqikg5YW8ICjkuLvlqaYpCisj5ZCN6KmeLeaOpee2muipnueahAorIworIyAgbm91bi12ZXJiYWxfYXV4OiBOb3VucyB0aGF0IGF0dGFjaCB0byB0aGUgY29uanVuY3RpdmUgcGFydGljbGUg44GmICgidGUiKSBhbmQgYXJlIAorIyAgc2VtYW50aWNhbGx5IHZlcmItbGlrZS4KKyMgIGUuZy4g44GU44KJ44KTLCDjgZTopqcsIOW+oeimpywg6aCC5oi0Cisj5ZCN6KmeLeWLleipnumdnuiHqueri+eahAorIworIyAgbm91bi1xdW90YXRpb246IHRleHQgdGhhdCBjYW5ub3QgYmUgc2VnbWVudGVkIGludG8gd29yZHMsIHByb3ZlcmJzLCBDaGluZXNlIHBvZXRyeSwgCisjICBkaWFsZWN0cywgRW5nbGlzaCwgZXRjLiBDdXJyZW50bHksIHRoZSBvbmx5IGVudHJ5IGZvciDlkI3oqZ4g5byV55So5paH5a2X5YiXICgibm91biBxdW90YXRpb24iKSAKKyMgIGlzIOOBhOOCj+OBjyAoIml3YWt1IikuCisj5ZCN6KmeLeW8leeUqOaWh+Wtl+WIlworIworIyAgbm91bi1uYWlfYWRqZWN0aXZlOiBXb3JkcyB0aGF0IGFwcGVhciBiZWZvcmUgdGhlIGF1eGlsaWFyeSB2ZXJiIOOBquOBhCAoIm5haSIpIGFuZAorIyAgYmVoYXZlIGxpa2UgYW4gYWRqZWN0aXZlLgorIyAgZS5nLiDnlLPjgZfoqLMsIOS7leaWuSwg44Go44KT44Gn44KCLCDpgZXjgYQKKyPlkI3oqZ4t44OK44Kk5b2i5a656Kme6Kqe5bm5CisjCisjIyMjIworIyAgcHJlZml4OiB1bmNsYXNzaWZpZWQgcHJlZml4ZXMKKyPmjqXpoK3oqZ4KKyMKKyMgIHByZWZpeC1ub21pbmFsOiBQcmVmaXhlcyB0aGF0IGF0dGFjaCB0byBub3VucyAoaW5jbHVkaW5nIGFkamVjdGl2ZSBzdGVtIGZvcm1zKSAKKyMgIGV4Y2x1ZGluZyBudW1lcmljYWwgZXhwcmVzc2lvbnMuCisjICBlLmcuIOOBiiAo5rC0KSwg5p+QICjmsI8pLCDlkIwgKOekviksIOaVhSAo772e5rCPKSwg6auYICjlk4Hos6opLCDjgYogKOimi+S6iyksIOOBlCAo56uL5rS+KQorI+aOpemgreipni3lkI3oqZ7mjqXntpoKKyMKKyMgIHByZWZpeC12ZXJiYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIHRoZSBpbXBlcmF0aXZlIGZvcm0gb2YgYSB2ZXJiIG9yIGEgdmVyYgorIyAgaW4gY29uanVuY3RpdmUgZm9ybSBmb2xsb3dlZCBieSDjgarjgosv44Gq44GV44KLL+OBj+OBoOOBleOCiy4KKyMgIGUuZy4g44GKICjoqq3jgb/jgarjgZXjgYQpLCDjgYogKOW6p+OCiikKKyPmjqXpoK3oqZ4t5YuV6Kme5o6l57aaCisjCisjICBwcmVmaXgtYWRqZWN0aXZhbDogUHJlZml4ZXMgdGhhdCBhdHRhY2ggdG8gYWRqZWN0aXZlcy4KKyMgIGUuZy4g44GKICjlr5LjgYTjgafjgZnjga3jgYgpLCDjg5DjgqsgKOOBp+OBi+OBhCkKKyPmjqXpoK3oqZ4t5b2i5a656Kme5o6l57aaCisjCisjICBwcmVmaXgtbnVtZXJpY2FsOiBQcmVmaXhlcyB0aGF0IGF0dGFjaCB0byBudW1lcmljYWwgZXhwcmVzc2lvbnMuCisjICBlLmcuIOe0hCwg44GK44KI44GdLCDmr47mmYIKKyPmjqXpoK3oqZ4t5pWw5o6l57aaCisjCisjIyMjIworIyAgdmVyYjogdW5jbGFzc2lmaWVkIHZlcmJzCisj5YuV6KmeCisjCisjICB2ZXJiLW1haW46Cisj5YuV6KmeLeiHqueriworIworIyAgdmVyYi1hdXhpbGlhcnk6Cisj5YuV6KmeLemdnuiHqueriworIworIyAgdmVyYi1zdWZmaXg6Cisj5YuV6KmeLeaOpeWwvgorIworIyMjIyMKKyMgIGFkamVjdGl2ZTogdW5jbGFzc2lmaWVkIGFkamVjdGl2ZXMKKyPlvaLlrrnoqZ4KKyMKKyMgIGFkamVjdGl2ZS1tYWluOgorI+W9ouWuueipni3oh6rnq4sKKyMKKyMgIGFkamVjdGl2ZS1hdXhpbGlhcnk6Cisj5b2i5a656KmeLemdnuiHqueriworIworIyAgYWRqZWN0aXZlLXN1ZmZpeDoKKyPlvaLlrrnoqZ4t5o6l5bC+CisjCisjIyMjIworIyAgYWR2ZXJiOiB1bmNsYXNzaWZpZWQgYWR2ZXJicworI+WJr+ipngorIworIyAgYWR2ZXJiLW1pc2M6IFdvcmRzIHRoYXQgY2FuIGJlIHNlZ21lbnRlZCBpbnRvIG9uZSB1bml0IGFuZCB3aGVyZSBhZG5vbWluYWwgCisjICBtb2RpZmljYXRpb24gaXMgbm90IHBvc3NpYmxlLgorIyAgZS5nLiDjgYLjgYTjgYvjgo/jgonjgZosIOWkmuWIhgorI+WJr+ipni3kuIDoiKwKKyMKKyMgIGFkdmVyYi1wYXJ0aWNsZV9jb25qdW5jdGlvbjogQWR2ZXJicyB0aGF0IGNhbiBiZSBmb2xsb3dlZCBieSDjga4sIOOBrywg44GrLCAKKyMgIOOBqiwg44GZ44KLLCDjgaAsIGV0Yy4KKyMgIGUuZy4g44GT44KT44Gq44GrLCDjgZ3jgpPjgarjgassIOOBguOCk+OBquOBqywg44Gq44Gr44GLLCDjgarjgpPjgafjgoIKKyPlia/oqZ4t5Yqp6Kme6aGe5o6l57aaCisjCisjIyMjIworIyAgYWRub21pbmFsOiBXb3JkcyB0aGF0IG9ubHkgaGF2ZSBub3VuLW1vZGlmeWluZyBmb3Jtcy4KKyMgIGUuZy4g44GT44GuLCDjgZ3jga4sIOOBguOBriwg44Gp44GuLCDjgYTjgo/jgobjgossIOOBquOCk+OCieOBi+OBriwg5L2V44KJ44GL44GuLCDjgYTjgo3jgpPjgaosIOOBk+OBhuOBhOOBhiwg44Gd44GG44GE44GGLCDjgYLjgYLjgYTjgYYsIAorIyAgICAgICDjganjgYbjgYTjgYYsIOOBk+OCk+OBqiwg44Gd44KT44GqLCDjgYLjgpPjgaosIOOBqeOCk+OBqiwg5aSn44GN44GqLCDlsI/jgZXjgaosIOOBiuOBi+OBl+OBqiwg44G744KT44GuLCDjgZ/jgYTjgZfjgZ8sIAorIyAgICAgICDjgIwoLCDjgoIpIOOBleOCiyAo44GT44Go44Gq44GM44KJKeOAjSwg5b6u44CF44Gf44KLLCDloILjgIXjgZ/jgossIOWNmOOBquOCiywg44GE44GL44Gq44KLLCDmiJHjgYzjgI3jgIzlkIzjgZgsIOS6oeOBjQorI+mAo+S9k+ipngorIworIyMjIyMKKyMgIGNvbmp1bmN0aW9uOiBDb25qdW5jdGlvbnMgdGhhdCBjYW4gb2NjdXIgaW5kZXBlbmRlbnRseS4KKyMgIGUuZy4g44GMLCDjgZHjgozjganjgoIsIOOBneOBl+OBpiwg44GY44KD44GCLCDjgZ3jgozjganjgZPjgo3jgYsKK+aOpee2muipngorIworIyMjIyMKKyMgIHBhcnRpY2xlOiB1bmNsYXNzaWZpZWQgcGFydGljbGVzLgor5Yqp6KmeCisjCisjICBwYXJ0aWNsZS1jYXNlOiBjYXNlIHBhcnRpY2xlcyB3aGVyZSB0aGUgc3ViY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkLgor5Yqp6KmeLeagvOWKqeipngorIworIyAgcGFydGljbGUtY2FzZS1taXNjOiBDYXNlIHBhcnRpY2xlcy4KKyMgIGUuZy4g44GL44KJLCDjgYwsIOOBpywg44GoLCDjgassIOOBuCwg44KI44KKLCDjgpIsIOOBriwg44Gr44GmCivliqnoqZ4t5qC85Yqp6KmeLeS4gOiIrAorIworIyAgcGFydGljbGUtY2FzZS1xdW90ZTogdGhlICJ0byIgdGhhdCBhcHBlYXJzIGFmdGVyIG5vdW5zLCBhIHBlcnNvbuKAmXMgc3BlZWNoLCAKKyMgIHF1b3RhdGlvbiBtYXJrcywgZXhwcmVzc2lvbnMgb2YgZGVjaXNpb25zIGZyb20gYSBtZWV0aW5nLCByZWFzb25zLCBqdWRnZW1lbnRzLAorIyAgY29uamVjdHVyZXMsIGV0Yy4KKyMgIGUuZy4gKCDjgaApIOOBqCAo6L+w44G544GfLiksICgg44Gn44GC44KLKSDjgaggKOOBl+OBpuWft+ihjOeMtuS6iC4uLikKK+WKqeipni3moLzliqnoqZ4t5byV55SoCisjCisjICBwYXJ0aWNsZS1jYXNlLWNvbXBvdW5kOiBDb21wb3VuZHMgb2YgcGFydGljbGVzIGFuZCB2ZXJicyB0aGF0IG1haW5seSBiZWhhdmUgCisjICBsaWtlIGNhc2UgcGFydGljbGVzLgorIyAgZS5nLiDjgajjgYTjgYYsIOOBqOOBhOOBo+OBnywg44Go44GL44GE44GGLCDjgajjgZfjgaYsIOOBqOOBqOOCguOBqywg44Go5YWx44GrLCDjgafjgoLjgaPjgaYsIOOBq+OBguOBn+OBo+OBpiwg44Gr5b2T44Gf44Gj44GmLCDjgavlvZPjgaPjgaYsCisjICAgICAgIOOBq+OBguOBn+OCiiwg44Gr5b2T44Gf44KKLCDjgavlvZPjgoosIOOBq+W9k+OBn+OCiywg44Gr44GC44Gf44KLLCDjgavjgYrjgYTjgaYsIOOBq+aWvOOBhOOBpizjgavmlrzjgaYsIOOBq+OBiuOBkeOCiywg44Gr5pa844GR44KLLCAKKyMgICAgICAg44Gr44GL44GRLCDjgavjgYvjgZHjgaYsIOOBq+OBi+OCk+OBlywg44Gr6Zai44GXLCDjgavjgYvjgpPjgZfjgaYsIOOBq+mWouOBl+OBpiwg44Gr44GL44KT44GZ44KLLCDjgavplqLjgZnjgossIOOBq+mam+OBlywgCisjICAgICAgIOOBq+mam+OBl+OBpiwg44Gr44GX44Gf44GM44GELCDjgavlvpPjgYQsIOOBq+W+k+OBhiwg44Gr44GX44Gf44GM44Gj44GmLCDjgavlvpPjgaPjgaYsIOOBq+OBn+OBhOOBlywg44Gr5a++44GXLCDjgavjgZ/jgYTjgZfjgaYsIAorIyAgICAgICDjgavlr77jgZfjgaYsIOOBq+OBn+OBhOOBmeOCiywg44Gr5a++44GZ44KLLCDjgavjgaTjgYTjgaYsIOOBq+OBpOOBjSwg44Gr44Gk44GRLCDjgavjgaTjgZHjgaYsIOOBq+OBpOOCjCwg44Gr44Gk44KM44GmLCDjgavjgajjgaPjgaYsCisjICAgICAgIOOBq+OBqOOCiiwg44Gr44G+44Gk44KP44KLLCDjgavjgojjgaPjgaYsIOOBq+S+neOBo+OBpiwg44Gr5Zug44Gj44GmLCDjgavjgojjgoosIOOBq+S+neOCiiwg44Gr5Zug44KKLCDjgavjgojjgossIOOBq+S+neOCiywg44Gr5Zug44KLLCAKKyMgICAgICAg44Gr44KP44Gf44Gj44GmLCDjgavjgo/jgZ/jgossIOOCkuOCguOBo+OBpiwg44KS5Lul44Gj44GmLCDjgpLpgJrjgZgsIOOCkumAmuOBmOOBpiwg44KS6YCa44GX44GmLCDjgpLjgoHjgZDjgaPjgaYsIOOCkuOCgeOBkOOCiiwg44KS44KB44GQ44KLLAorIyAgICAgICDjgaPjgaYt5Y+j6KqeLywg44Gh44KF44GGLemWouilv+W8geOAjOOBqOOBhOOBhuOAjS8sICjkvZUpIOOBpuOBhOOBhiAo5Lq6KS3lj6Poqp4vLCDjgaPjgabjgYTjgYYt5Y+j6KqeLywg44Go44GE44G1LCDjgajjgYvjgYTjgbUKK+WKqeipni3moLzliqnoqZ4t6YCj6KqeCisjCisjICBwYXJ0aWNsZS1jb25qdW5jdGl2ZToKKyMgIGUuZy4g44GL44KJLCDjgYvjgonjgavjga8sIOOBjCwg44GR44KM44GpLCDjgZHjgozjganjgoIsIOOBkeOBqSwg44GXLCDjgaTjgaQsIOOBpiwg44GnLCDjgagsIOOBqOOBk+OCjeOBjCwg44Gp44GT44KN44GLLCDjgajjgoIsIOOBqeOCgiwgCisjICAgICAgIOOBquOBjOOCiSwg44Gq44KKLCDjga7jgacsIOOBruOBqywg44GwLCDjgoLjga7jga4sIOOChCAoIOOBl+OBnyksIOOChOOBhOOBquOChCwgKOOBk+OCjeOCkykg44GY44KDKOOBhOOBkeOBquOBhCkt5Y+j6KqeLywgCisjICAgICAgICjooYzjgaMpIOOBoeOCgyjjgYTjgZHjgarjgYQpLeWPo+iqni8sICjoqIDjgaMpIOOBn+OBo+OBpiAo44GX44GL44Gf44GM44Gq44GEKS3lj6Poqp4vLCAo44Gd44KM44GM44Gq44GPKeOBo+OBn+OBo+OBpiAo5bmz5rCXKS3lj6Poqp4vCivliqnoqZ4t5o6l57aa5Yqp6KmeCisjCisjICBwYXJ0aWNsZS1kZXBlbmRlbmN5OgorIyAgZS5nLiDjgZPjgZ0sIOOBleOBiCwg44GX44GLLCDjgZnjgoksIOOBrywg44KCLCDjgZ4KK+WKqeipni3kv4LliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWFkdmVyYmlhbDoKKyMgIGUuZy4g44GM44Gm44KJLCDjgYvjgoIsIOOBj+OCieOBhCwg5L2NLCDjgZDjgonjgYQsIOOBl+OCgiwgKOWtpuagoSkg44GY44KDKOOBk+OCjOOBjOa1geihjOOBo+OBpuOBhOOCiykt5Y+j6KqeLywgCisjICAgICAgICjjgZ3jgowp44GY44KD44GCICjjgojjgY/jgarjgYQpLeWPo+iqni8sIOOBmuOBpCwgKOengSkg44Gq44GeLCDjgarjgaksICjnp4EpIOOBquOCiiAo44GrKSwgKOWFiOeUnykg44Gq44KT44GLICjlpKflq4zjgYQpLeWPo+iqni8sCisjICAgICAgICjnp4EpIOOBquOCk+OBniwgKOWFiOeUnykg44Gq44KT44GmICjlpKflq4zjgYQpLeWPo+iqni8sIOOBruOBvywg44Gg44GRLCAo56eBKSDjgaDjgaPjgaYt5Y+j6KqeLywg44Gg44GrLCAKKyMgICAgICAgKOW9vCnjgaPjgZ/jgokt5Y+j6KqeLywgKOOBiuiMtikg44Gn44KCICjjgYTjgYvjgYwpLCDnrYkgKOOBqOOBhiksICjku4rlvowpIOOBqOOCgiwg44Gw44GL44KKLCDjgbDjgaPjgYst5Y+j6KqeLywg44Gw44Gj44GL44KKLeWPo+iqni8sCisjICAgICAgIOOBu+OBqSwg56iLLCDjgb7jgacsIOi/hCwgKOiqsCkg44KCICjjgYwpKFvliqnoqZ4t5qC85Yqp6KmeXSDjgYrjgojjgbMgW+WKqeipni3kv4LliqnoqZ5dIOOBruWJjeOBq+S9jee9ruOBmeOCi+OAjOOCguOAjSkKK+WKqeipni3lia/liqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWludGVyamVjdGl2ZTogcGFydGljbGVzIHdpdGggaW50ZXJqZWN0aXZlIGdyYW1tYXRpY2FsIHJvbGVzLgorIyAgZS5nLiAo5p2+5bO2KSDjgoQKK+WKqeipni3plpPmipXliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWNvb3JkaW5hdGU6CisjICBlLmcuIOOBqCwg44Gf44KKLCDjgaDjga4sIOOBoOOCiiwg44Go44GLLCDjgarjgoosIOOChCwg44KE44KJCivliqnoqZ4t5Lim56uL5Yqp6KmeCisjCisjICBwYXJ0aWNsZS1maW5hbDoKKyMgIGUuZy4g44GL44GELCDjgYvjgZfjgoksIOOBlSwg44GcLCAo44GgKeOBo+OBkS3lj6Poqp4vLCAo44Go44G+44Gj44Gm44KLKSDjgact5pa56KiALywg44GqLCDjg4osIOOBquOBgi3lj6Poqp4vLCDjgZ4sIOOBrSwg44ONLCAKKyMgICAgICAg44Gt44GHLeWPo+iqni8sIOOBreOBiC3lj6Poqp4vLCDjga3jgpMt5pa56KiALywg44GuLCDjga7jgYYt5Y+j6KqeLywg44KELCDjgogsIOODqCwg44KI44GJLeWPo+iqni8sIOOCjywg44KP44GELeWPo+iqni8KK+WKqeipni3ntYLliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWFkdmVyYmlhbC9jb25qdW5jdGl2ZS9maW5hbDogVGhlIHBhcnRpY2xlICJrYSIgd2hlbiB1bmtub3duIHdoZXRoZXIgaXQgaXMgCisjICBhZHZlcmJpYWwsIGNvbmp1bmN0aXZlLCBvciBzZW50ZW5jZSBmaW5hbC4gRm9yIGV4YW1wbGU6CisjICAgICAgIChhKSDjgIxBIOOBiyBCIOOBi+OAjS4gRXg644CMKOWbveWGheOBp+mBi+eUqOOBmeOCiykg44GLLCjmtbflpJbjgafpgYvnlKjjgZnjgospIOOBiyAoLinjgI0KKyMgICAgICAgKGIpIEluc2lkZSBhbiBhZHZlcmIgcGhyYXNlLiBFeDrjgIwo5bm444GE44Go44GE44GGKSDjgYsgKCwg5q276ICF44Gv44GE44Gq44GL44Gj44GfLinjgI0KKyMgICAgICAgICAgIOOAjCjnpYjjgorjgYzlsYrjgYTjgZ/jgZvjgYQpIOOBiyAoLCDoqabpqJPjgavlkIjmoLzjgZfjgZ8uKeOAjQorIyAgICAgICAoYykg44CM44GL44Gu44KI44GG44Gr44CNLiBFeDrjgIwo5L2V44KC44Gq44GL44Gj44GfKSDjgYsgKOOBruOCiOOBhuOBq+aMr+OCi+iInuOBo+OBny4p44CNCisjICBlLmcuIOOBiwor5Yqp6KmeLeWJr+WKqeipnu+8j+S4pueri+WKqeipnu+8j+e1guWKqeipngorIworIyAgcGFydGljbGUtYWRub21pbmFsaXplcjogVGhlICJubyIgdGhhdCBhdHRhY2hlcyB0byBub3VucyBhbmQgbW9kaWZpZXMgCisjICBub24taW5mbGVjdGlvbmFsIHdvcmRzLgor5Yqp6KmeLemAo+S9k+WMlgorIworIyAgcGFydGljbGUtYWRub21pbmFsaXplcjogVGhlICJuaSIgYW5kICJ0byIgdGhhdCBhcHBlYXIgZm9sbG93aW5nIG5vdW5zIGFuZCBhZHZlcmJzIAorIyAgdGhhdCBhcmUgZ2lvbmdvLCBnaXNlaWdvLCBvciBnaXRhaWdvLgorIyAgZS5nLiDjgassIOOBqAor5Yqp6KmeLeWJr+ipnuWMlgorIworIyAgcGFydGljbGUtc3BlY2lhbDogQSBwYXJ0aWNsZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIG9uZSBvZiB0aGUgYWJvdmUgY2xhc3NpZmljYXRpb25zLiAKKyMgIFRoaXMgaW5jbHVkZXMgcGFydGljbGVzIHRoYXQgYXJlIHVzZWQgaW4gVGFua2EsIEhhaWt1LCBhbmQgb3RoZXIgcG9ldHJ5LgorIyAgZS5nLiDjgYvjgaosIOOBkeOCgCwgKCDjgZfjgZ/jgaDjgo3jgYYpIOOBqywgKOOBguOCk+OBnykg44Gr44KDKOOCj+OBi+OCieOCkyksICjkv7opIOOCkyAo5a62KQor5Yqp6KmeLeeJueauigorIworIyMjIyMKKyMgIGF1eGlsaWFyeS12ZXJiOgor5Yqp5YuV6KmeCisjCisjIyMjIworIyAgaW50ZXJqZWN0aW9uOiBHcmVldGluZ3MgYW5kIG90aGVyIGV4Y2xhbWF0aW9ucy4KKyMgIGUuZy4g44GK44Gv44KI44GGLCDjgYrjga/jgojjgYbjgZTjgZbjgYTjgb7jgZksIOOBk+OCk+OBq+OBoeOBrywg44GT44KT44Gw44KT44GvLCDjgYLjgorjgYzjgajjgYYsIOOBqeOBhuOCguOBguOCiuOBjOOBqOOBhiwg44GC44KK44GM44Go44GG44GU44GW44GE44G+44GZLCAKKyMgICAgICAg44GE44Gf44Gg44GN44G+44GZLCDjgZTjgaHjgZ3jgYbjgZXjgb4sIOOBleOCiOOBquOCiSwg44GV44KI44GG44Gq44KJLCDjga/jgYQsIOOBhOOBhOOBiCwg44GU44KB44KTLCDjgZTjgoHjgpPjgarjgZXjgYQKKyPmhJ/li5XoqZ4KKyMKKyMjIyMjCisjICBzeW1ib2w6IHVuY2xhc3NpZmllZCBTeW1ib2xzLgor6KiY5Y+3CisjCisjICBzeW1ib2wtbWlzYzogQSBnZW5lcmFsIHN5bWJvbCBub3QgaW4gb25lIG9mIHRoZSBjYXRlZ29yaWVzIGJlbG93LgorIyAgZS5nLiBb4peL4peOQCTjgJLihpIrXQor6KiY5Y+3LeS4gOiIrAorIworIyAgc3ltYm9sLWNvbW1hOiBDb21tYXMKKyMgIGUuZy4gWyzjgIFdCivoqJjlj7ct6Kqt54K5CisjCisjICBzeW1ib2wtcGVyaW9kOiBQZXJpb2RzIGFuZCBmdWxsIHN0b3BzLgorIyAgZS5nLiBbLu+8juOAgl0KK+iomOWPty3lj6XngrkKKyMKKyMgIHN5bWJvbC1zcGFjZTogRnVsbC13aWR0aCB3aGl0ZXNwYWNlLgor6KiY5Y+3LeepuueZvQorIworIyAgc3ltYm9sLW9wZW5fYnJhY2tldDoKKyMgIGUuZy4gWyh74oCY4oCc44CO44CQXQor6KiY5Y+3LeaLrOW8p+mWiworIworIyAgc3ltYm9sLWNsb3NlX2JyYWNrZXQ6CisjICBlLmcuIFspfeKAmeKAneOAj+OAjeOAkV0KK+iomOWPty3mi6zlvKfplokKKyMKKyMgIHN5bWJvbC1hbHBoYWJldGljOgorI+iomOWPty3jgqLjg6vjg5XjgqHjg5njg4Pjg4gKKyMKKyMjIyMjCisjICBvdGhlcjogdW5jbGFzc2lmaWVkIG90aGVyCisj44Gd44Gu5LuWCisjCisjICBvdGhlci1pbnRlcmplY3Rpb246IFdvcmRzIHRoYXQgYXJlIGhhcmQgdG8gY2xhc3NpZnkgYXMgbm91bi1zdWZmaXhlcyBvciAKKyMgIHNlbnRlbmNlLWZpbmFsIHBhcnRpY2xlcy4KKyMgIGUuZy4gKOOBoCnjgqEKK+OBneOBruS7li3plpPmipUKKyMKKyMjIyMjCisjICBmaWxsZXI6IEFpenVjaGkgdGhhdCBvY2N1cnMgZHVyaW5nIGEgY29udmVyc2F0aW9uIG9yIHNvdW5kcyBpbnNlcnRlZCBhcyBmaWxsZXIuCisjICBlLmcuIOOBguOBriwg44GG44KT44GoLCDjgYjjgagKK+ODleOCo+ODqeODvAorIworIyMjIyMKKyMgIG5vbi12ZXJiYWw6IG5vbi12ZXJiYWwgc291bmQuCivpnZ7oqIDoqp7pn7MKKyMKKyMjIyMjCisjICBmcmFnbWVudDoKKyPoqp7mlq3niYcKKyMKKyMjIyMjCisjICB1bmtub3duOiB1bmtub3duIHBhcnQgb2Ygc3BlZWNoLgorI+acquefpeiqngorIworIyMjIyMgRW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2FyLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2FyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY4MjlkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfYXIudHh0CkBAIC0wLDAgKzEsMTI1IEBACisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4KKyMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisjIENsZWFuZWQgb24gT2N0b2JlciAxMSwgMjAwOSAobm90IG5vcm1hbGl6ZWQsIHNvIHVzZSBiZWZvcmUgbm9ybWFsaXphdGlvbikKKyMgVGhpcyBtZWFucyB0aGF0IHdoZW4gbW9kaWZ5aW5nIHRoaXMgbGlzdCwgeW91IG1pZ2h0IG5lZWQgdG8gYWRkIHNvbWUgCisjIHJlZHVuZGFudCBlbnRyaWVzLCBmb3IgZXhhbXBsZSBjb250YWluaW5nIGZvcm1zIHdpdGggYm90aCDYoyBhbmQg2KcKK9mF2YYKK9mI2YXZhgor2YXZhtmH2KcKK9mF2YbZhwor2YHZigor2YjZgdmKCivZgdmK2YfYpwor2YHZitmHCivZiAor2YEKK9ir2YUKK9in2YgKK9ij2YgKK9ioCivYqNmH2KcKK9io2YcKK9inCivYowor2KfZiQor2KfZigor2KPZigor2KPZiQor2YTYpwor2YjZhNinCivYp9mE2KcKK9ij2YTYpwor2KXZhNinCivZhNmD2YYKK9mF2KcKK9mI2YXYpwor2YPZhdinCivZgdmF2KcKK9i52YYKK9mF2LkKK9in2LDYpwor2KXYsNinCivYp9mGCivYo9mGCivYpdmGCivYp9mG2YfYpwor2KPZhtmH2KcKK9il2YbZh9inCivYp9mG2YcKK9ij2YbZhwor2KXZhtmHCivYqNin2YYKK9io2KPZhgor2YHYp9mGCivZgdij2YYKK9mI2KfZhgor2YjYo9mGCivZiNil2YYKK9in2YTYqtmJCivYp9mE2KrZigor2KfZhNiw2YkKK9in2YTYsNmKCivYp9mE2LDZitmGCivYp9mE2YkKK9in2YTZigor2KXZhNmJCivYpdmE2YoKK9i52YTZiQor2LnZhNmK2YfYpwor2LnZhNmK2YcKK9in2YXYpwor2KPZhdinCivYpdmF2KcKK9in2YrYttinCivYo9mK2LbYpwor2YPZhAor2YjZg9mECivZhNmFCivZiNmE2YUKK9mE2YYKK9mI2YTZhgor2YfZiQor2YfZigor2YfZiAor2YjZh9mJCivZiNmH2YoKK9mI2YfZiAor2YHZh9mJCivZgdmH2YoKK9mB2YfZiAor2KfZhtiqCivYo9mG2KoKK9mE2YMKK9mE2YfYpwor2YTZhwor2YfYsNmHCivZh9iw2KcKK9iq2YTZgwor2LDZhNmDCivZh9mG2KfZgwor2YPYp9mG2KoKK9mD2KfZhgor2YrZg9mI2YYKK9iq2YPZiNmGCivZiNmD2KfZhtiqCivZiNmD2KfZhgor2LrZitixCivYqNi52LYKK9mC2K8KK9mG2K3ZiAor2KjZitmGCivYqNmK2YbZhdinCivZhdmG2LAKK9i22YXZhgor2K3ZitirCivYp9mE2KfZhgor2KfZhNii2YYKK9iu2YTYp9mECivYqNi52K8KK9mC2KjZhAor2K3YqtmJCivYudmG2K8KK9i52YbYr9mF2KcKK9mE2K/ZiQor2KzZhdmK2LkKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2JnLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2JnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU0YmEyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0CkBAIC0wLDAgKzEsMTkzIEBACisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4KKyMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCivQsAor0LDQtwor0LDQutC+CivQsNC70LAKK9Cx0LUKK9Cx0LXQtwor0LHQtdGI0LUKK9Cx0LgKK9Cx0LjQuwor0LHQuNC70LAKK9Cx0LjQu9C4CivQsdC40LvQvgor0LHQu9C40LfQvgor0LHRitC00LDRggor0LHRitC00LUKK9Cx0Y/RhdCwCivQsgor0LLQsNGBCivQstCw0YgKK9Cy0LDRiNCwCivQstC10YDQvtGP0YLQvdC+CivQstC10YfQtQor0LLQt9C10LzQsAor0LLQuAor0LLQuNC1CivQstC40L3QsNCz0LgKK9Cy0YHQtQor0LLRgdC10LrQuAor0LLRgdC40YfQutC4CivQstGB0LjRh9C60L4KK9Cy0YHRj9C60LAKK9Cy0YrQsgor0LLRitC/0YDQtdC60LgKK9Cy0YrRgNGF0YMKK9CzCivQs9C4CivQs9C70LDQstC90L4KK9Cz0L4KK9C0CivQtNCwCivQtNCw0LvQuAor0LTQvgor0LTQvtC60LDRgtC+CivQtNC+0LrQvtCz0LAKK9C00L7RgNC4CivQtNC+0YHQtdCz0LAKK9C00L7RgdGC0LAKK9C1CivQtdC00LLQsAor0LXQtNC40L0KK9C10YLQvgor0LfQsAor0LfQsNC0CivQt9Cw0LXQtNC90L4KK9C30LDRgNCw0LTQuAor0LfQsNGB0LXQs9CwCivQt9Cw0YLQvtCy0LAKK9C30LDRidC+CivQt9Cw0YnQvtGC0L4KK9C4CivQuNC3CivQuNC70LgKK9C40LwKK9C40LzQsAor0LjQvNCw0YIKK9C40YHQutCwCivQuQor0LrQsNC30LAKK9C60LDQugor0LrQsNC60LLQsAor0LrQsNC60LLQvgor0LrQsNC60YLQvgor0LrQsNC60YrQsgor0LrQsNGC0L4KK9C60L7Qs9CwCivQutC+0LPQsNGC0L4KK9C60L7QtdGC0L4KK9C60L7QuNGC0L4KK9C60L7QuQor0LrQvtC50YLQvgor0LrQvtC70LrQvgor0LrQvtGP0YLQvgor0LrRitC00LUKK9C60YrQtNC10YLQvgor0LrRitC8CivQu9C4CivQvAor0LzQtQor0LzQtdC20LTRgwor0LzQtdC9CivQvNC4CivQvNC90L7Qt9C40L3QsAor0LzQvtCz0LAKK9C80L7Qs9Cw0YIKK9C80L7QttC1CivQvNC+0LvRjwor0LzQvtC80LXQvdGC0LAKK9C80YMKK9C9CivQvdCwCivQvdCw0LQKK9C90LDQt9Cw0LQKK9C90LDQuQor0L3QsNC/0YDQsNCy0LgKK9C90LDQv9GA0LXQtAor0L3QsNC/0YDQuNC80LXRgAor0L3QsNGBCivQvdC1CivQvdC10LPQvgor0L3QtdGPCivQvdC4CivQvdC40LUKK9C90LjQutC+0LkKK9C90LjRgtC+CivQvdC+CivQvdGP0LrQvtC4CivQvdGP0LrQvtC5CivQvdGP0LzQsAor0L7QsdCw0YfQtQor0L7QutC+0LvQvgor0L7RgdCy0LXQvQor0L7RgdC+0LHQtdC90L4KK9C+0YIKK9C+0YLQs9C+0YDQtQor0L7RgtC90L7QstC+CivQvtGJ0LUKK9C/0LDQugor0L/Qvgor0L/QvtCy0LXRh9C1CivQv9C+0LLQtdGH0LXRgtC+CivQv9C+0LQKK9C/0L7QvdC1CivQv9C+0YDQsNC00LgKK9C/0L7RgdC70LUKK9C/0L7Rh9GC0LgKK9C/0YDQsNCy0LgKK9C/0YDQtdC0CivQv9GA0LXQtNC4CivQv9GA0LXQtwor0L/RgNC4CivQv9GK0LoKK9C/0YrRgNCy0L4KK9GBCivRgdCwCivRgdCw0LzQvgor0YHQtQor0YHQtdCz0LAKK9GB0LgKK9GB0LrQvtGA0L4KK9GB0LvQtdC0CivRgdC80LUKK9GB0L/QvtGA0LXQtAor0YHRgNC10LQKK9GB0YDQtdGJ0YMKK9GB0YLQtQor0YHRitC8CivRgdGK0YEKK9GB0YrRidC+CivRggor0YLQsNC30LgKK9GC0LDQutCwCivRgtCw0LrQuNCy0LAKK9GC0LDQutGK0LIKK9GC0LDQvAor0YLQstC+0LkKK9GC0LUKK9GC0LXQt9C4CivRgtC4CivRgtC9CivRgtC+CivRgtC+0LLQsAor0YLQvtCz0LDQstCwCivRgtC+0LfQuAor0YLQvtC5CivRgtC+0LvQutC+0LLQsAor0YLQvtGH0L3Qvgor0YLRgNGP0LHQstCwCivRgtGD0LoKK9GC0YrQuQor0YLRjwor0YLRj9GFCivRgwor0YXQsNGA0LXRgdCy0LAKK9GHCivRh9C1CivRh9C10YHRgtC+CivRh9GA0LXQtwor0YnQtQor0YnQvtC8CivRjwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfY2EudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfY2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTY1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQKQEAgLTAsMCArMSwyMjAgQEAKKyMgQ2F0YWxhbiBzdG9wd29yZHMgZnJvbSBodHRwOi8vZ2l0aHViLmNvbS92Y2wvY3VlLmxhbmd1YWdlIChBcGFjaGUgMiBMaWNlbnNlZCkKK2EKK2FiYW5zCithY8OtCithaAorYWl4w60KK2FpeMOyCithbAorYWxzCithbGVzaG9yZXMKK2FsZ3VuCithbGd1bmEKK2FsZ3VuZXMKK2FsZ3VucworYWxob3JhCithbGzDoAorYWxsw60KK2FsbMOyCithbHRyYQorYWx0cmUKK2FsdHJlcworYW1iCithbWJkw7NzCithbWJkdWVzCithcGEKK2FxdWVsbAorYXF1ZWxsYQorYXF1ZWxsZXMKK2FxdWVsbHMKK2FxdWVzdAorYXF1ZXN0YQorYXF1ZXN0ZXMKK2FxdWVzdHMKK2FxdcOtCitiYWl4CitjYWRhCitjYWRhc2PDugorY2FkYXNjdW5hCitjYWRhc2N1bmVzCitjYWRhc2N1bnMKK2NvbQorY29udHJhCitkJ3VuCitkJ3VuYQorZCd1bmVzCitkJ3VucworZGFsdAorZGUKK2RlbAorZGVscworZGVzCitkZXNwcsOpcworZGlucworZGludHJlCitkb25hdAorZG9uY3MKK2R1cmFudAorZQorZWgKK2VsCitlbHMKK2VtCitlbgorZW5jYXJhCitlbnMKK2VudHJlCivDqXJlbQorZXJlbgorw6lyZXUKK2VzCivDqXMKK2VzdGEKK2VzdMOgCitlc3TDoHZlbQorZXN0YXZlbgorZXN0w6B2ZXUKK2VzdGV1CitldAorZXRjCitldHMKK2ZpbnMKK2ZvcmEKK2dhaXJlYsOpCitoYQoraGFuCitoYXMKK2hhdmlhCitoZQoraGVtCitoZXUKK2hpIAoraG8KK2kKK2lndWFsCitpZ3VhbHMKK2phCitsJ2hpCitsYQorbGVzCitsaQorbGknbgorbGxhdm9ycworbSdoZQorbWEKK21hbAorbWFsZ3JhdAorbWF0ZWl4CittYXRlaXhhCittYXRlaXhlcworbWF0ZWl4b3MKK21lCittZW50cmUKK23DqXMKK21ldQorbWV1cworbWV2YQorbWV2ZXMKK21vbHQKK21vbHRhCittb2x0ZXMKK21vbHRzCittb24KK21vbnMKK24naGUKK24naGkKK25lCituaQorbm8KK25vZ2Vuc21lbnlzCitub23DqXMKK25vc2FsdHJlcworbm9zdHJhCitub3N0cmUKK25vc3RyZXMKK28KK29oCitvaQorb24KK3BhcworcGVsCitwZWxzCitwZXIKK3BlcsOyCitwZXJxdcOoCitwb2MgCitwb2NhCitwb2NzCitwb3F1ZXMKK3BvdHNlcgorcHJvcGkKK3F1YWwKK3F1YWxzCitxdWFuCitxdWFudCAKK3F1ZQorcXXDqAorcXVlbGNvbQorcXVpCitxdWluCitxdWluYQorcXVpbmVzCitxdWlucworcydoYQorcydoYW4KK3NhCitzZW1ibGFudAorc2VtYmxhbnRzCitzZXMKK3NldSAKK3NldXMKK3NldmEKK3NldmEKK3NldmVzCitzaQorc29icmUKK3NvYnJldG90Citzw7NjCitzb2xhbWVudAorc29scworc29uIAorc8Ozbgorc29ucyAKK3NvdGEKK3NvdQordCdoYQordCdoYW4KK3QnaGUKK3RhCit0YWwKK3RhbWLDqQordGFtcG9jCit0YW4KK3RhbnQKK3RhbnRhCit0YW50ZXMKK3RldQordGV1cwordGV2YQordGV2ZXMKK3RvbgordG9ucwordG90Cit0b3RhCit0b3RlcwordG90cwordW4KK3VuYQordW5lcwordW5zCit1cwordmEKK3ZhaWcKK3ZhbQordmFuCit2YXMKK3ZldQordm9zYWx0cmVzCit2b3N0cmEKK3Zvc3RyZQordm9zdHJlcwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfY3oudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfY3oudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzYwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19jei50eHQKQEAgLTAsMCArMSwxNzIgQEAKK2EKK3MKK2sKK28KK2kKK3UKK3YKK3oKK2RuZXMKK2N6Cit0w61tdG8KK2J1ZGXFoQorYnVkZW0KK2J5bGkKK2pzZcWhCittxa9qCitzdsO9bQordGEKK3RvbXRvCit0b2hsZQordHV0bwordHl0bworamVqCit6ZGEKK3Byb8SNCittw6F0ZQordGF0bwora2FtCit0b2hvdG8KK2tkbwora3RlxZnDrQorbWkKK27DoW0KK3RvbQordG9tdXRvCittw610CituaWMKK3Byb3RvCitrdGVyb3UKK2J5bGEKK3RvaG8KK3Byb3Rvxb5lCithc2kKK2hvCituYcWhaQorbmFwacWhdGUKK3JlCitjb8W+Cit0w61tCit0YWvFvmUKK3N2w71jaAoramVqw60KK3N2w71taQoranN0ZQorYWoKK3R1Cit0ZWR5Cit0ZXRvCitieWxvCitrZGUKK2tlCitwcmF2w6kKK2ppCituYWQKK25lanNvdQorxI1pCitwb2QKK3TDqW1hCittZXppCitwxZllcwordHkKK3BhawordsOhbQorYW5pCitrZHnFvgordsWhYWsKK25lZworanNlbQordGVudG8KK8SNbMOhbmt1CivEjWzDoW5reQorYWJ5Citqc21lCitwxZllZAorcHRhCitqZWppY2gKK2J5bAoramXFoXTEmworYcW+CitiZXoKK3Rha8OpCitwb3V6ZQorcHJ2bsOtCit2YcWhZQora3RlcsOhCituw6FzCitub3bDvQordGlweQorcG9rdWQKK23Fr8W+ZQorc3RyYW5hCitqZWhvCitzdsOpCitqaW7DqQorenByw6F2eQorbm92w6kKK25lbsOtCit2w6FzCitqZW4KK3BvZGxlCit6ZGUKK3XFvgorYsO9dAordsOtY2UKK2J1ZGUKK2ppxb4KK25lxb4KK2t0ZXLDvQorYnkKK2t0ZXLDqQorY28KK25lYm8KK3RlbgordGFrCittw6EKK3DFmWkKK29kCitwbworanNvdQoramFrCitkYWzFocOtCithbGUKK3NpCitzZQordmUKK3RvCitqYWtvCit6YQorenDEm3QKK3plCitkbworcHJvCitqZQorbmEKK2F0ZAorYXRwCitqYWttaWxlCitwxZlpxI1lbcW+Citqw6EKK29uCitvbmEKK29ubworb25pCitvbnkKK215Cit2eQorasOtCitqaQorbcSbCittbmUKK2plbXUKK3RvbXUKK3TEm20KK3TEm211CituxJttdQorbsSbbXXFvgoramVob8W+Citqw63FvgoramVsaWtvxb4KK2plxb4KK2pha2/FvgorbmHEjWXFvgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZGEudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZGEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmY1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19kYS50eHQKQEAgLTAsMCArMSwxMDggQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZGFuaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKworIHwgQSBEYW5pc2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworIHwgVGhpcyBpcyBhIHJhbmtlZCBsaXN0IChjb21tb25lc3QgdG8gcmFyZXN0KSBvZiBzdG9wd29yZHMgZGVyaXZlZCBmcm9tCisgfCBhIGxhcmdlIHRleHQgc2FtcGxlLgorCisKK29nICAgICAgICAgICB8IGFuZAoraSAgICAgICAgICAgIHwgaW4KK2plZyAgICAgICAgICB8IEkKK2RldCAgICAgICAgICB8IHRoYXQgKGRlbS4gcHJvbm91bikvaXQgKHBlcnMuIHByb25vdW4pCithdCAgICAgICAgICAgfCB0aGF0IChpbiBmcm9udCBvZiBhIHNlbnRlbmNlKS90byAod2l0aCBpbmZpbml0aXZlKQorZW4gICAgICAgICAgIHwgYS9hbgorZGVuICAgICAgICAgIHwgaXQgKHBlcnMuIHByb25vdW4pL3RoYXQgKGRlbS4gcHJvbm91bikKK3RpbCAgICAgICAgICB8IHRvL2F0L2Zvci91bnRpbC9hZ2FpbnN0L2J5L29mL2ludG8sIG1vcmUKK2VyICAgICAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGJlIgorc29tICAgICAgICAgIHwgd2hvLCBhcworcMOlICAgICAgICAgICB8IG9uL3Vwb24vaW4vb24vYXQvdG8vYWZ0ZXIvb2Yvd2l0aC9mb3IsIG9uCitkZSAgICAgICAgICAgfCB0aGV5CittZWQgICAgICAgICAgfCB3aXRoL2J5L2luLCBhbG9uZworaGFuICAgICAgICAgIHwgaGUKK2FmICAgICAgICAgICB8IG9mL2J5L2Zyb20vb2ZmL2Zvci9pbi93aXRoL29uLCBvZmYKK2ZvciAgICAgICAgICB8IGF0L2Zvci90by9mcm9tL2J5L29mL2FnbywgaW4gZnJvbnQvYmVmb3JlLCBiZWNhdXNlCitpa2tlICAgICAgICAgfCBub3QKK2RlciAgICAgICAgICB8IHdoby93aGljaCwgdGhlcmUvdGhvc2UKK3ZhciAgICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIGJlIgorbWlnICAgICAgICAgIHwgbWUvbXlzZWxmCitzaWcgICAgICAgICAgfCBvbmVzZWxmL2hpbXNlbGYvaGVyc2VsZi9pdHNlbGYvdGhlbXNlbHZlcworbWVuICAgICAgICAgIHwgYnV0CitldCAgICAgICAgICAgfCBhL2FuL29uZSwgb25lIChudW1iZXIpLCBzb21lb25lL3NvbWVib2R5L29uZQoraGFyICAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gaGF2ZSIKK29tICAgICAgICAgICB8IHJvdW5kL2Fib3V0L2Zvci9pbi9hLCBhYm91dC9hcm91bmQvZG93biwgaWYKK3ZpICAgICAgICAgICB8IHdlCittaW4gICAgICAgICAgfCBteQoraGF2ZGUgICAgICAgIHwgcGFzdCB0ZW5zZSBvZiAidG8gaGF2ZSIKK2hhbSAgICAgICAgICB8IGhpbQoraHVuICAgICAgICAgIHwgc2hlCitudSAgICAgICAgICAgfCBub3cKK292ZXIgICAgICAgICB8IG92ZXIvYWJvdmUvYWNyb3NzL2J5L2JleW9uZC9wYXN0L29uL2Fib3V0LCBvdmVyL3Bhc3QKK2RhICAgICAgICAgICB8IHRoZW4sIHdoZW4vYXMvc2luY2UKK2ZyYSAgICAgICAgICB8IGZyb20vb2ZmL3NpbmNlLCBvZmYsIHNpbmNlCitkdSAgICAgICAgICAgfCB5b3UKK3VkICAgICAgICAgICB8IG91dAorc2luICAgICAgICAgIHwgaGlzL2hlci9pdHMvb25lJ3MKK2RlbSAgICAgICAgICB8IHRoZW0KK29zICAgICAgICAgICB8IHVzL291cnNlbHZlcworb3AgICAgICAgICAgIHwgdXAKK21hbiAgICAgICAgICB8IHlvdS9vbmUKK2hhbnMgICAgICAgICB8IGhpcworaHZvciAgICAgICAgIHwgd2hlcmUKK2VsbGVyICAgICAgICB8IG9yCitodmFkICAgICAgICAgfCB3aGF0Citza2FsICAgICAgICAgfCBtdXN0L3NoYWxsIGV0Yy4KK3NlbHYgICAgICAgICB8IG15c2VsZi95b3VzZWxmL2hlcnNlbGYvb3Vyc2VsdmVzIGV0Yy4sIGV2ZW4KK2hlciAgICAgICAgICB8IGhlcmUKK2FsbGUgICAgICAgICB8IGFsbC9ldmVyeW9uZS9ldmVyeWJvZHkgZXRjLgordmlsICAgICAgICAgIHwgd2lsbCAodmVyYikKK2JsZXYgICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIHN0YXkvdG8gcmVtYWluL3RvIGdldC90byBiZWNvbWUiCitrdW5uZSAgICAgICAgfCBjb3VsZAoraW5kICAgICAgICAgIHwgaW4KK27DpXIgICAgICAgICAgfCB3aGVuCit2w6ZyZSAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gYmUiCitkb2cgICAgICAgICAgfCBob3dldmVyL3lldC9hZnRlciBhbGwKK25vZ2V0ICAgICAgICB8IHNvbWV0aGluZwordmlsbGUgICAgICAgIHwgd291bGQKK2pvICAgICAgICAgICB8IHlvdSBrbm93L3lvdSBzZWUgKGFkdiksIHllcworZGVyZXMgICAgICAgIHwgdGhlaXIvdGhlaXJzCitlZnRlciAgICAgICAgfCBhZnRlci9iZWhpbmQvYWNjb3JkaW5nIHRvL2Zvci9ieS9mcm9tLCBsYXRlci9hZnRlcndhcmRzCituZWQgICAgICAgICAgfCBkb3duCitza3VsbGUgICAgICAgfCBzaG91bGQKK2Rlbm5lICAgICAgICB8IHRoaXMKK2VuZCAgICAgICAgICB8IHRoYW4KK2RldHRlICAgICAgICB8IHRoaXMKK21pdCAgICAgICAgICB8IG15L21pbmUKK29nc8OlICAgICAgICAgfCBhbHNvCit1bmRlciAgICAgICAgfCB1bmRlci9iZW5lYXRoL2JlbG93L2R1cmluZywgYmVsb3cvdW5kZXJuZWF0aAoraGF2ZSAgICAgICAgIHwgaGF2ZQorZGlnICAgICAgICAgIHwgeW91CithbmRlbiAgICAgICAgfCBvdGhlcgoraGVuZGUgICAgICAgIHwgaGVyCittaW5lICAgICAgICAgfCBteQorYWx0ICAgICAgICAgIHwgZXZlcnl0aGluZworbWVnZXQgICAgICAgIHwgbXVjaC92ZXJ5LCBwbGVudHkgb2YKK3NpdCAgICAgICAgICB8IGhpcywgaGVyLCBpdHMsIG9uZSdzCitzaW5lICAgICAgICAgfCBoaXMsIGhlciwgaXRzLCBvbmUncwordm9yICAgICAgICAgIHwgb3VyCittb2QgICAgICAgICAgfCBhZ2FpbnN0CitkaXNzZSAgICAgICAgfCB0aGVzZQoraHZpcyAgICAgICAgIHwgaWYKK2RpbiAgICAgICAgICB8IHlvdXIveW91cnMKK25vZ2xlICAgICAgICB8IHNvbWUKK2hvcyAgICAgICAgICB8IGJ5L2F0CitibGl2ZSAgICAgICAgfCBiZS9iZWNvbWUKK21hbmdlICAgICAgICB8IG1hbnkKK2FkICAgICAgICAgICB8IGJ5L3Rocm91Z2gKK2JsaXZlciAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGJlL3RvIGJlY29tZSIKK2hlbmRlcyAgICAgICB8IGhlci9oZXJzCit2w6ZyZXQgICAgICAgIHwgYmUKK3RoaSAgICAgICAgICB8IGZvciAoY29uaikKK2plciAgICAgICAgICB8IHlvdQorc8OlZGFuICAgICAgICB8IHN1Y2gsIGxpa2UgdGhpcy9saWtlIHRoYXQKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2RlLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzcwMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZGUudHh0CkBAIC0wLDAgKzEsMjkyIEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2dlcm1hbi9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisKKyB8IEEgR2VybWFuIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoZSBudW1iZXIgb2YgZm9ybXMgaW4gdGhpcyBsaXN0IGlzIHJlZHVjZWQgc2lnbmlmaWNhbnRseSBieSBwYXNzaW5nIGl0CisgfCB0aHJvdWdoIHRoZSBHZXJtYW4gc3RlbW1lci4KKworCithYmVyICAgICAgICAgICB8ICBidXQKKworYWxsZSAgICAgICAgICAgfCAgYWxsCithbGxlbQorYWxsZW4KK2FsbGVyCithbGxlcworCithbHMgICAgICAgICAgICB8ICB0aGFuLCBhcworYWxzbyAgICAgICAgICAgfCAgc28KK2FtICAgICAgICAgICAgIHwgIGFuICsgZGVtCithbiAgICAgICAgICAgICB8ICBhdAorCithbmRlciAgICAgICAgICB8ICBvdGhlcgorYW5kZXJlCithbmRlcmVtCithbmRlcmVuCithbmRlcmVyCithbmRlcmVzCithbmRlcm0KK2FuZGVybgorYW5kZXJyCithbmRlcnMKKworYXVjaCAgICAgICAgICAgfCAgYWxzbworYXVmICAgICAgICAgICAgfCAgb24KK2F1cyAgICAgICAgICAgIHwgIG91dCBvZgorYmVpICAgICAgICAgICAgfCAgYnkKK2JpbiAgICAgICAgICAgIHwgIGFtCitiaXMgICAgICAgICAgICB8ICB1bnRpbAorYmlzdCAgICAgICAgICAgfCAgYXJ0CitkYSAgICAgICAgICAgICB8ICB0aGVyZQorZGFtaXQgICAgICAgICAgfCAgd2l0aCBpdAorZGFubiAgICAgICAgICAgfCAgdGhlbgorCitkZXIgICAgICAgICAgICB8ICB0aGUKK2RlbgorZGVzCitkZW0KK2RpZQorZGFzCisKK2Rhw58gICAgICAgICAgICB8ICB0aGF0CisKK2RlcnNlbGJlICAgICAgIHwgIHRoZSBzYW1lCitkZXJzZWxiZW4KK2RlbnNlbGJlbgorZGVzc2VsYmVuCitkZW1zZWxiZW4KK2RpZXNlbGJlCitkaWVzZWxiZW4KK2Rhc3NlbGJlCisKK2RhenUgICAgICAgICAgIHwgIHRvIHRoYXQKKworZGVpbiAgICAgICAgICAgfCAgdGh5CitkZWluZQorZGVpbmVtCitkZWluZW4KK2RlaW5lcgorZGVpbmVzCisKK2Rlbm4gICAgICAgICAgIHwgIGJlY2F1c2UKKworZGVyZXIgICAgICAgICAgfCAgb2YgdGhvc2UKK2Rlc3NlbiAgICAgICAgIHwgIG9mIGhpbQorCitkaWNoICAgICAgICAgICB8ICB0aGVlCitkaXIgICAgICAgICAgICB8ICB0byB0aGVlCitkdSAgICAgICAgICAgICB8ICB0aG91CisKK2RpZXMgICAgICAgICAgIHwgIHRoaXMKK2RpZXNlCitkaWVzZW0KK2RpZXNlbgorZGllc2VyCitkaWVzZXMKKworCitkb2NoICAgICAgICAgICB8ICAoc2V2ZXJhbCBtZWFuaW5ncykKK2RvcnQgICAgICAgICAgIHwgIChvdmVyKSB0aGVyZQorCisKK2R1cmNoICAgICAgICAgIHwgIHRocm91Z2gKKworZWluICAgICAgICAgICAgfCAgYQorZWluZQorZWluZW0KK2VpbmVuCitlaW5lcgorZWluZXMKKworZWluaWcgICAgICAgICAgfCAgc29tZQorZWluaWdlCitlaW5pZ2VtCitlaW5pZ2VuCitlaW5pZ2VyCitlaW5pZ2VzCisKK2Vpbm1hbCAgICAgICAgIHwgIG9uY2UKKworZXIgICAgICAgICAgICAgfCAgaGUKK2lobiAgICAgICAgICAgIHwgIGhpbQoraWhtICAgICAgICAgICAgfCAgdG8gaGltCisKK2VzICAgICAgICAgICAgIHwgIGl0CitldHdhcyAgICAgICAgICB8ICBzb21ldGhpbmcKKworZXVlciAgICAgICAgICAgfCAgeW91cgorZXVyZQorZXVyZW0KK2V1cmVuCitldXJlcgorZXVyZXMKKworZsO8ciAgICAgICAgICAgIHwgIGZvcgorZ2VnZW4gICAgICAgICAgfCAgdG93YXJkcworZ2V3ZXNlbiAgICAgICAgfCAgcC5wLiBvZiBzZWluCitoYWIgICAgICAgICAgICB8ICBoYXZlCitoYWJlICAgICAgICAgICB8ICBoYXZlCitoYWJlbiAgICAgICAgICB8ICBoYXZlCitoYXQgICAgICAgICAgICB8ICBoYXMKK2hhdHRlICAgICAgICAgIHwgIGhhZAoraGF0dGVuICAgICAgICAgfCAgaGFkCitoaWVyICAgICAgICAgICB8ICBoZXJlCitoaW4gICAgICAgICAgICB8ICB0aGVyZQoraGludGVyICAgICAgICAgfCAgYmVoaW5kCisKK2ljaCAgICAgICAgICAgIHwgIEkKK21pY2ggICAgICAgICAgIHwgIG1lCittaXIgICAgICAgICAgICB8ICB0byBtZQorCisKK2lociAgICAgICAgICAgIHwgIHlvdSwgdG8gaGVyCitpaHJlCitpaHJlbQoraWhyZW4KK2locmVyCitpaHJlcworZXVjaCAgICAgICAgICAgfCAgdG8geW91CisKK2ltICAgICAgICAgICAgIHwgIGluICsgZGVtCitpbiAgICAgICAgICAgICB8ICBpbgoraW5kZW0gICAgICAgICAgfCAgd2hpbGUKK2lucyAgICAgICAgICAgIHwgIGluICsgZGFzCitpc3QgICAgICAgICAgICB8ICBpcworCitqZWRlICAgICAgICAgICB8ICBlYWNoLCBldmVyeQoramVkZW0KK2plZGVuCitqZWRlcgoramVkZXMKKworamVuZSAgICAgICAgICAgfCAgdGhhdAoramVuZW0KK2plbmVuCitqZW5lcgoramVuZXMKKworamV0enQgICAgICAgICAgfCAgbm93CitrYW5uICAgICAgICAgICB8ICBjYW4KKwora2VpbiAgICAgICAgICAgfCAgbm8KK2tlaW5lCitrZWluZW0KK2tlaW5lbgora2VpbmVyCitrZWluZXMKKwora8O2bm5lbiAgICAgICAgIHwgIGNhbgora8O2bm50ZSAgICAgICAgIHwgIGNvdWxkCittYWNoZW4gICAgICAgICB8ICBkbworbWFuICAgICAgICAgICAgfCAgb25lCisKK21hbmNoZSAgICAgICAgIHwgIHNvbWUsIG1hbnkgYQorbWFuY2hlbQorbWFuY2hlbgorbWFuY2hlcgorbWFuY2hlcworCittZWluICAgICAgICAgICB8ICBteQorbWVpbmUKK21laW5lbQorbWVpbmVuCittZWluZXIKK21laW5lcworCittaXQgICAgICAgICAgICB8ICB3aXRoCittdXNzICAgICAgICAgICB8ICBtdXN0CittdXNzdGUgICAgICAgICB8ICBoYWQgdG8KK25hY2ggICAgICAgICAgIHwgIHRvKHdhcmRzKQorbmljaHQgICAgICAgICAgfCAgbm90CituaWNodHMgICAgICAgICB8ICBub3RoaW5nCitub2NoICAgICAgICAgICB8ICBzdGlsbCwgeWV0CitudW4gICAgICAgICAgICB8ICBub3cKK251ciAgICAgICAgICAgIHwgIG9ubHkKK29iICAgICAgICAgICAgIHwgIHdoZXRoZXIKK29kZXIgICAgICAgICAgIHwgIG9yCitvaG5lICAgICAgICAgICB8ICB3aXRob3V0CitzZWhyICAgICAgICAgICB8ICB2ZXJ5CisKK3NlaW4gICAgICAgICAgIHwgIGhpcworc2VpbmUKK3NlaW5lbQorc2VpbmVuCitzZWluZXIKK3NlaW5lcworCitzZWxic3QgICAgICAgICB8ICBzZWxmCitzaWNoICAgICAgICAgICB8ICBoZXJzZWxmCisKK3NpZSAgICAgICAgICAgIHwgIHRoZXksIHNoZQoraWhuZW4gICAgICAgICAgfCAgdG8gdGhlbQorCitzaW5kICAgICAgICAgICB8ICBhcmUKK3NvICAgICAgICAgICAgIHwgIHNvCisKK3NvbGNoZSAgICAgICAgIHwgIHN1Y2gKK3NvbGNoZW0KK3NvbGNoZW4KK3NvbGNoZXIKK3NvbGNoZXMKKworc29sbCAgICAgICAgICAgfCAgc2hhbGwKK3NvbGx0ZSAgICAgICAgIHwgIHNob3VsZAorc29uZGVybiAgICAgICAgfCAgYnV0Citzb25zdCAgICAgICAgICB8ICBlbHNlCivDvGJlciAgICAgICAgICAgfCAgb3ZlcgordW0gICAgICAgICAgICAgfCAgYWJvdXQsIGFyb3VuZAordW5kICAgICAgICAgICAgfCAgYW5kCisKK3VucyAgICAgICAgICAgIHwgIHVzCit1bnNlCit1bnNlbQordW5zZW4KK3Vuc2VyCit1bnNlcworCit1bnRlciAgICAgICAgICB8ICB1bmRlcgordmllbCAgICAgICAgICAgfCAgbXVjaAordm9tICAgICAgICAgICAgfCAgdm9uICsgZGVtCit2b24gICAgICAgICAgICB8ICBmcm9tCit2b3IgICAgICAgICAgICB8ICBiZWZvcmUKK3fDpGhyZW5kICAgICAgICB8ICB3aGlsZQord2FyICAgICAgICAgICAgfCAgd2FzCit3YXJlbiAgICAgICAgICB8ICB3ZXJlCit3YXJzdCAgICAgICAgICB8ICB3YXN0Cit3YXMgICAgICAgICAgICB8ICB3aGF0Cit3ZWcgICAgICAgICAgICB8ICBhd2F5LCBvZmYKK3dlaWwgICAgICAgICAgIHwgIGJlY2F1c2UKK3dlaXRlciAgICAgICAgIHwgIGZ1cnRoZXIKKword2VsY2hlICAgICAgICAgfCAgd2hpY2gKK3dlbGNoZW0KK3dlbGNoZW4KK3dlbGNoZXIKK3dlbGNoZXMKKword2VubiAgICAgICAgICAgfCAgd2hlbgord2VyZGUgICAgICAgICAgfCAgd2lsbAord2VyZGVuICAgICAgICAgfCAgd2lsbAord2llICAgICAgICAgICAgfCAgaG93Cit3aWVkZXIgICAgICAgICB8ICBhZ2Fpbgord2lsbCAgICAgICAgICAgfCAgd2FudAord2lyICAgICAgICAgICAgfCAgd2UKK3dpcmQgICAgICAgICAgIHwgIHdpbGwKK3dpcnN0ICAgICAgICAgIHwgIHdpbGxzdAord28gICAgICAgICAgICAgfCAgd2hlcmUKK3dvbGxlbiAgICAgICAgIHwgIHdhbnQKK3dvbGx0ZSAgICAgICAgIHwgIHdhbnRlZAord8O8cmRlICAgICAgICAgIHwgIHdvdWxkCit3w7xyZGVuICAgICAgICAgfCAgd291bGQKK3p1ICAgICAgICAgICAgIHwgIHRvCit6dW0gICAgICAgICAgICB8ICB6dSArIGRlbQorenVyICAgICAgICAgICAgfCAgenUgKyBkZXIKK3p3YXIgICAgICAgICAgIHwgIGluZGVlZAorendpc2NoZW4gICAgICAgfCAgYmV0d2VlbgorCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNjgxZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2VsLnR4dApAQCAtMCwwICsxLDc4IEBACisjIEx1Y2VuZSBHcmVlayBTdG9wd29yZHMgbGlzdAorIyBOb3RlOiBieSBkZWZhdWx0IHRoaXMgZmlsZSBpcyB1c2VkIGFmdGVyIEdyZWVrTG93ZXJDYXNlRmlsdGVyLAorIyBzbyB3aGVuIG1vZGlmeWluZyB0aGlzIGZpbGUgdXNlICfPgycgaW5zdGVhZCBvZiAnz4InIAorzr8KK863CivPhM6/CivOv865CivPhM6xCivPhM6/z4UKK8+EzrfPgworz4TPic69CivPhM6/zr0KK8+EzrfOvQorzrrOsc65IAorzrrOuQorzroKK861zrnOvM6xzrkKK861zrnPg86xzrkKK861zrnOvc6xzrkKK861zrnOvM6xz4PPhM61CivOtc65z4PPhM61CivPg8+Ezr8KK8+Dz4TOv869CivPg8+EzrcKK8+Dz4TOt869CivOvM6xCivOsc67zrvOsQorzrHPgM6/CivOs865zrEKK8+Az4HOv8+DCivOvM61CivPg861CivPic+DCivPgM6xz4HOsQorzrHOvc+EzrkKK866zrHPhM6xCivOvM61z4TOsQorzrjOsQorzr3OsQorzrTOtQorzrTOtc69CivOvM63CivOvM63zr0KK861z4DOuQorzrXOvc+JCivOtc6xzr0KK86xzr0KK8+Ezr/PhM61CivPgM6/z4UKK8+Az4nPgworz4DOv865zr/Pgworz4DOv865zrEKK8+Azr/Ouc6/CivPgM6/zrnOv865CivPgM6/zrnOtc+DCivPgM6/zrnPic69CivPgM6/zrnOv8+Fz4MKK86xz4XPhM6/z4MKK86xz4XPhM63CivOsc+Fz4TOvworzrHPhc+Ezr/OuQorzrHPhc+Ez4nOvQorzrHPhc+Ezr/Phc+DCivOsc+Fz4TOtc+DCivOsc+Fz4TOsQorzrXOus61zrnOvc6/z4MKK861zrrOtc65zr3OtworzrXOus61zrnOvc6/CivOtc66zrXOuc69zr/OuQorzrXOus61zrnOvc61z4MKK861zrrOtc65zr3OsQorzrXOus61zrnOvc+Jzr0KK861zrrOtc65zr3Ov8+Fz4MKK86/z4DPic+DCivOv868z4nPgworzrnPg8+Jz4MKK86/z4POvworzr/PhM65CmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxNjRjMAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2VuLnR4dApAQCAtMCwwICsxLDU0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgYSBjb3VwbGUgb2YgdGVzdCBzdG9wd29yZHMgdG8gdGVzdCB0aGF0IHRoZSB3b3JkcyBhcmUgcmVhbGx5IGJlaW5nCisjIGNvbmZpZ3VyZWQgZnJvbSB0aGlzIGZpbGU6CitzdG9wd29yZGEKK3N0b3B3b3JkYgorCisjIFN0YW5kYXJkIGVuZ2xpc2ggc3RvcCB3b3JkcyB0YWtlbiBmcm9tIEx1Y2VuZSdzIFN0b3BBbmFseXplcgorYQorYW4KK2FuZAorYXJlCithcworYXQKK2JlCitidXQKK2J5Citmb3IKK2lmCitpbgoraW50bworaXMKK2l0Citubworbm90CitvZgorb24KK29yCitzdWNoCit0aGF0Cit0aGUKK3RoZWlyCit0aGVuCit0aGVyZQordGhlc2UKK3RoZXkKK3RoaXMKK3RvCit3YXMKK3dpbGwKK3dpdGgKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2VzLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIxNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZXMudHh0CkBAIC0wLDAgKzEsMzU0IEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL3NwYW5pc2gvc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorCisgfCBBIFNwYW5pc2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworCisgfCBUaGUgZm9sbG93aW5nIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcworIHwgZGVyaXZpbmcgZnJvbSBhIGxhcmdlIHNhbXBsZSBvZiB0ZXh0LgorCisgfCBFeHRyYSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIGVuZC4KKworZGUgICAgICAgICAgICAgfCAgZnJvbSwgb2YKK2xhICAgICAgICAgICAgIHwgIHRoZSwgaGVyCitxdWUgICAgICAgICAgICB8ICB3aG8sIHRoYXQKK2VsICAgICAgICAgICAgIHwgIHRoZQorZW4gICAgICAgICAgICAgfCAgaW4KK3kgICAgICAgICAgICAgIHwgIGFuZAorYSAgICAgICAgICAgICAgfCAgdG8KK2xvcyAgICAgICAgICAgIHwgIHRoZSwgdGhlbQorZGVsICAgICAgICAgICAgfCAgZGUgKyBlbAorc2UgICAgICAgICAgICAgfCAgaGltc2VsZiwgZnJvbSBoaW0gZXRjCitsYXMgICAgICAgICAgICB8ICB0aGUsIHRoZW0KK3BvciAgICAgICAgICAgIHwgIGZvciwgYnksIGV0YwordW4gICAgICAgICAgICAgfCAgYQorcGFyYSAgICAgICAgICAgfCAgZm9yCitjb24gICAgICAgICAgICB8ICB3aXRoCitubyAgICAgICAgICAgICB8ICBubwordW5hICAgICAgICAgICAgfCAgYQorc3UgICAgICAgICAgICAgfCAgaGlzLCBoZXIKK2FsICAgICAgICAgICAgIHwgIGEgKyBlbAorICB8IGVzICAgICAgICAgZnJvbSBTRVIKK2xvICAgICAgICAgICAgIHwgIGhpbQorY29tbyAgICAgICAgICAgfCAgaG93Cittw6FzICAgICAgICAgICAgfCAgbW9yZQorcGVybyAgICAgICAgICAgfCAgcGVybworc3VzICAgICAgICAgICAgfCAgc3UgcGx1cmFsCitsZSAgICAgICAgICAgICB8ICB0byBoaW0sIGhlcgoreWEgICAgICAgICAgICAgfCAgYWxyZWFkeQorbyAgICAgICAgICAgICAgfCAgb3IKKyAgfCBmdWUgICAgICAgIGZyb20gU0VSCitlc3RlICAgICAgICAgICB8ICB0aGlzCisgIHwgaGEgICAgICAgICBmcm9tIEhBQkVSCitzw60gICAgICAgICAgICAgfCAgaGltc2VsZiBldGMKK3BvcnF1ZSAgICAgICAgIHwgIGJlY2F1c2UKK2VzdGEgICAgICAgICAgIHwgIHRoaXMKKyAgfCBzb24gICAgICAgIGZyb20gU0VSCitlbnRyZSAgICAgICAgICB8ICBiZXR3ZWVuCisgIHwgZXN0w6EgICAgIGZyb20gRVNUQVIKK2N1YW5kbyAgICAgICAgIHwgIHdoZW4KK211eSAgICAgICAgICAgIHwgIHZlcnkKK3NpbiAgICAgICAgICAgIHwgIHdpdGhvdXQKK3NvYnJlICAgICAgICAgIHwgIG9uCisgIHwgc2VyICAgICAgICBmcm9tIFNFUgorICB8IHRpZW5lICAgICAgZnJvbSBURU5FUgordGFtYmnDqW4gICAgICAgIHwgIGFsc28KK21lICAgICAgICAgICAgIHwgIG1lCitoYXN0YSAgICAgICAgICB8ICB1bnRpbAoraGF5ICAgICAgICAgICAgfCAgdGhlcmUgaXMvYXJlCitkb25kZSAgICAgICAgICB8ICB3aGVyZQorICB8IGhhbiAgICAgICAgZnJvbSBIQUJFUgorcXVpZW4gICAgICAgICAgfCAgd2hvbSwgdGhhdAorICB8IGVzdMOhbiAgICAgIGZyb20gRVNUQVIKKyAgfCBlc3RhZG8gICAgIGZyb20gRVNUQVIKK2Rlc2RlICAgICAgICAgIHwgIGZyb20KK3RvZG8gICAgICAgICAgIHwgIGFsbAorbm9zICAgICAgICAgICAgfCAgdXMKK2R1cmFudGUgICAgICAgIHwgIGR1cmluZworICB8IGVzdGFkb3MgICAgZnJvbSBFU1RBUgordG9kb3MgICAgICAgICAgfCAgYWxsCit1bm8gICAgICAgICAgICB8ICBhCitsZXMgICAgICAgICAgICB8ICB0byB0aGVtCituaSAgICAgICAgICAgICB8ICBub3IKK2NvbnRyYSAgICAgICAgIHwgIGFnYWluc3QKK290cm9zICAgICAgICAgIHwgIG90aGVyCisgIHwgZnVlcm9uICAgICBmcm9tIFNFUgorZXNlICAgICAgICAgICAgfCAgdGhhdAorZXNvICAgICAgICAgICAgfCAgdGhhdAorICB8IGhhYsOtYSAgICAgIGZyb20gSEFCRVIKK2FudGUgICAgICAgICAgIHwgIGJlZm9yZQorZWxsb3MgICAgICAgICAgfCAgdGhleQorZSAgICAgICAgICAgICAgfCAgYW5kICh2YXJpYW50IG9mIHkpCitlc3RvICAgICAgICAgICB8ICB0aGlzCittw60gICAgICAgICAgICAgfCAgbWUKK2FudGVzICAgICAgICAgIHwgIGJlZm9yZQorYWxndW5vcyAgICAgICAgfCAgc29tZQorcXXDqSAgICAgICAgICAgIHwgIHdoYXQ/Cit1bm9zICAgICAgICAgICB8ICBhCit5byAgICAgICAgICAgICB8ICBJCitvdHJvICAgICAgICAgICB8ICBvdGhlcgorb3RyYXMgICAgICAgICAgfCAgb3RoZXIKK290cmEgICAgICAgICAgIHwgIG90aGVyCivDqWwgICAgICAgICAgICAgfCAgaGUKK3RhbnRvICAgICAgICAgIHwgIHNvIG11Y2gsIG1hbnkKK2VzYSAgICAgICAgICAgIHwgIHRoYXQKK2VzdG9zICAgICAgICAgIHwgIHRoZXNlCittdWNobyAgICAgICAgICB8ICBtdWNoLCBtYW55CitxdWllbmVzICAgICAgICB8ICB3aG8KK25hZGEgICAgICAgICAgIHwgIG5vdGhpbmcKK211Y2hvcyAgICAgICAgIHwgIG1hbnkKK2N1YWwgICAgICAgICAgIHwgIHdobworICB8IHNlYSAgICAgICAgZnJvbSBTRVIKK3BvY28gICAgICAgICAgIHwgIGZldworZWxsYSAgICAgICAgICAgfCAgc2hlCitlc3RhciAgICAgICAgICB8ICB0byBiZQorICB8IGhhYmVyICAgICAgZnJvbSBIQUJFUgorZXN0YXMgICAgICAgICAgfCAgdGhlc2UKKyAgfCBlc3RhYmEgICAgIGZyb20gRVNUQVIKKyAgfCBlc3RhbW9zICAgIGZyb20gRVNUQVIKK2FsZ3VuYXMgICAgICAgIHwgIHNvbWUKK2FsZ28gICAgICAgICAgIHwgIHNvbWV0aGluZworbm9zb3Ryb3MgICAgICAgfCAgd2UKKworICAgICAgfCBvdGhlciBmb3JtcworCittaSAgICAgICAgICAgICB8ICBtZQorbWlzICAgICAgICAgICAgfCAgbWkgcGx1cmFsCit0w7ogICAgICAgICAgICAgfCAgdGhvdQordGUgICAgICAgICAgICAgfCAgdGhlZQordGkgICAgICAgICAgICAgfCAgdGhlZQordHUgICAgICAgICAgICAgfCAgdGh5Cit0dXMgICAgICAgICAgICB8ICB0dSBwbHVyYWwKK2VsbGFzICAgICAgICAgIHwgIHRoZXkKK25vc290cmFzICAgICAgIHwgIHdlCit2b3NvdHJvcyAgICAgICB8ICB5b3UKK3Zvc290cmFzICAgICAgIHwgIHlvdQorb3MgICAgICAgICAgICAgfCAgeW91Cittw61vICAgICAgICAgICAgfCAgbWluZQorbcOtYSAgICAgICAgICAgIHwKK23DrW9zICAgICAgICAgICB8Cittw61hcyAgICAgICAgICAgfAordHV5byAgICAgICAgICAgfCAgdGhpbmUKK3R1eWEgICAgICAgICAgIHwKK3R1eW9zICAgICAgICAgIHwKK3R1eWFzICAgICAgICAgIHwKK3N1eW8gICAgICAgICAgIHwgIGhpcywgaGVycywgdGhlaXJzCitzdXlhICAgICAgICAgICB8CitzdXlvcyAgICAgICAgICB8CitzdXlhcyAgICAgICAgICB8CitudWVzdHJvICAgICAgICB8ICBvdXJzCitudWVzdHJhICAgICAgICB8CitudWVzdHJvcyAgICAgICB8CitudWVzdHJhcyAgICAgICB8Cit2dWVzdHJvICAgICAgICB8ICB5b3VycwordnVlc3RyYSAgICAgICAgfAordnVlc3Ryb3MgICAgICAgfAordnVlc3RyYXMgICAgICAgfAorZXNvcyAgICAgICAgICAgfCAgdGhvc2UKK2VzYXMgICAgICAgICAgIHwgIHRob3NlCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZXN0YXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK2VzdG95Citlc3TDoXMKK2VzdMOhCitlc3RhbW9zCitlc3TDoWlzCitlc3TDoW4KK2VzdMOpCitlc3TDqXMKK2VzdGVtb3MKK2VzdMOpaXMKK2VzdMOpbgorZXN0YXLDqQorZXN0YXLDoXMKK2VzdGFyw6EKK2VzdGFyZW1vcworZXN0YXLDqWlzCitlc3RhcsOhbgorZXN0YXLDrWEKK2VzdGFyw61hcworZXN0YXLDrWFtb3MKK2VzdGFyw61haXMKK2VzdGFyw61hbgorZXN0YWJhCitlc3RhYmFzCitlc3TDoWJhbW9zCitlc3RhYmFpcworZXN0YWJhbgorZXN0dXZlCitlc3R1dmlzdGUKK2VzdHV2bworZXN0dXZpbW9zCitlc3R1dmlzdGVpcworZXN0dXZpZXJvbgorZXN0dXZpZXJhCitlc3R1dmllcmFzCitlc3R1dmnDqXJhbW9zCitlc3R1dmllcmFpcworZXN0dXZpZXJhbgorZXN0dXZpZXNlCitlc3R1dmllc2VzCitlc3R1dmnDqXNlbW9zCitlc3R1dmllc2VpcworZXN0dXZpZXNlbgorZXN0YW5kbworZXN0YWRvCitlc3RhZGEKK2VzdGFkb3MKK2VzdGFkYXMKK2VzdGFkCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgaGFiZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgoraGUKK2hhcworaGEKK2hlbW9zCitoYWLDqWlzCitoYW4KK2hheWEKK2hheWFzCitoYXlhbW9zCitoYXnDoWlzCitoYXlhbgoraGFicsOpCitoYWJyw6FzCitoYWJyw6EKK2hhYnJlbW9zCitoYWJyw6lpcworaGFicsOhbgoraGFicsOtYQoraGFicsOtYXMKK2hhYnLDrWFtb3MKK2hhYnLDrWFpcworaGFicsOtYW4KK2hhYsOtYQoraGFiw61hcworaGFiw61hbW9zCitoYWLDrWFpcworaGFiw61hbgoraHViZQoraHViaXN0ZQoraHVibworaHViaW1vcworaHViaXN0ZWlzCitodWJpZXJvbgoraHViaWVyYQoraHViaWVyYXMKK2h1YmnDqXJhbW9zCitodWJpZXJhaXMKK2h1YmllcmFuCitodWJpZXNlCitodWJpZXNlcworaHViacOpc2Vtb3MKK2h1Ymllc2VpcworaHViaWVzZW4KK2hhYmllbmRvCitoYWJpZG8KK2hhYmlkYQoraGFiaWRvcworaGFiaWRhcworCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHNlciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorc295CitlcmVzCitlcworc29tb3MKK3NvaXMKK3Nvbgorc2VhCitzZWFzCitzZWFtb3MKK3Nlw6Fpcworc2Vhbgorc2Vyw6kKK3NlcsOhcworc2Vyw6EKK3NlcmVtb3MKK3NlcsOpaXMKK3NlcsOhbgorc2Vyw61hCitzZXLDrWFzCitzZXLDrWFtb3MKK3NlcsOtYWlzCitzZXLDrWFuCitlcmEKK2VyYXMKK8OpcmFtb3MKK2VyYWlzCitlcmFuCitmdWkKK2Z1aXN0ZQorZnVlCitmdWltb3MKK2Z1aXN0ZWlzCitmdWVyb24KK2Z1ZXJhCitmdWVyYXMKK2Z1w6lyYW1vcworZnVlcmFpcworZnVlcmFuCitmdWVzZQorZnVlc2VzCitmdcOpc2Vtb3MKK2Z1ZXNlaXMKK2Z1ZXNlbgorc2llbmRvCitzaWRvCisgIHwgIHNlZCBhbHNvIG1lYW5zICd0aGlyc3QnCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgdGVuZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgordGVuZ28KK3RpZW5lcwordGllbmUKK3RlbmVtb3MKK3RlbsOpaXMKK3RpZW5lbgordGVuZ2EKK3RlbmdhcwordGVuZ2Ftb3MKK3RlbmfDoWlzCit0ZW5nYW4KK3RlbmRyw6kKK3RlbmRyw6FzCit0ZW5kcsOhCit0ZW5kcmVtb3MKK3RlbmRyw6lpcwordGVuZHLDoW4KK3RlbmRyw61hCit0ZW5kcsOtYXMKK3RlbmRyw61hbW9zCit0ZW5kcsOtYWlzCit0ZW5kcsOtYW4KK3RlbsOtYQordGVuw61hcwordGVuw61hbW9zCit0ZW7DrWFpcwordGVuw61hbgordHV2ZQordHV2aXN0ZQordHV2bwordHV2aW1vcwordHV2aXN0ZWlzCit0dXZpZXJvbgordHV2aWVyYQordHV2aWVyYXMKK3R1dmnDqXJhbW9zCit0dXZpZXJhaXMKK3R1dmllcmFuCit0dXZpZXNlCit0dXZpZXNlcwordHV2acOpc2Vtb3MKK3R1dmllc2VpcwordHV2aWVzZW4KK3RlbmllbmRvCit0ZW5pZG8KK3RlbmlkYQordGVuaWRvcwordGVuaWRhcwordGVuZWQKKwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19ldS50eHQKQEAgLTAsMCArMSw5OSBAQAorIyBleGFtcGxlIHNldCBvZiBiYXNxdWUgc3RvcHdvcmRzCithbAorYW5pdHoKK2FyYWJlcmEKK2Fza28KK2JhaW5hCitiYXQKK2JhdGVhbgorYmF0ZWsKK2JhdGkKK2JhdHp1ZWkKK2JhdHp1ZWsKK2JhdHp1ZXRhbgorYmF0enVrCitiZXJhCitiZXJhaWVrCitiZXJhdQorYmVyYXVlaworYmVyZQorYmVyb3JpCitiZXJvcmllaworYmVzdGUKK2JlemFsYQorZGEKK2RhZ28KK2RpcmEKK2RpdHUKK2R1CitkdXRlCitlZG8KK2VnaW4KK2VyZQorZXRhCitldXJhaworZXoKK2dhaW5lcmEKK2d1CitndXR4aQorZ3V6dGkKK2hhaWVpCitoYWllaworaGFpZXRhbgoraGFpbmJlc3RlCitoYWxhCitoYW4KK2hhbmRpaworaGFuZ28KK2hhcmEKK2hhcmkKK2hhcmsKK2hhcnRhbgoraGF1CitoYXVlaQoraGF1ZWsKK2hhdWV0YW4KK2hlbWVuCitoZW1lbmRpaworaGVtZW5nbworaGkKK2hvbmEKK2hvbmVrCitob25lbGEKK2hvbmV0YW4KK2hvbmkKK2hvcgoraG9yaQoraG9yaWVpCitob3JpZWsKK2hvcmlldGFuCitob3JrbworaG9ycmEKK2hvcnJlaworaG9ycmVsYQoraG9ycmV0YW4KK2hvcnJpCitob3J0aWsKK2h1cmEKK2l6YW4KK25pCitub2l6Citub2xhCitub24KK25vbmRpaworbm9uZ28KK25vcgorbm9yYQoremUKK3plaW4KK3plbgoremVuYmFpdAoremVuYmF0Cit6ZXIKK3plcmdhdGlrCit6aXJlbgoreml0dWVuCit6dQorenVlaworenVlbgorenV0ZW4KZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2ZhLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2ZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM2NDFjCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZmEudHh0CkBAIC0wLDAgKzEsMzEzIEBACisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4KKyMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGlzIHVzZWQgYWZ0ZXIgbm9ybWFsaXphdGlvbiwgc28gd2hlbiBhZGRpbmcgZW50cmllcworIyB0byB0aGlzIGZpbGUsIHVzZSB0aGUgYXJhYmljICfZiicgaW5zdGVhZCBvZiAn24wnCivYp9mG2KfZhgor2YbYr9in2LTYqtmHCivYs9ix2KfYs9ixCivYrtmK2KfZhwor2KfZiti02KfZhgor2YjZigor2KrYp9mD2YbZiNmGCivYqNmK2LTYqtix2YoKK9iv2YjZhQor2b7Yswor2YbYp9i02YoKK9mI2q/ZiAor2YrYpwor2K/Yp9i02KrZhtivCivYs9m+2LMKK9mH2Ybar9in2YUKK9mH2LHar9iyCivZvtmG2KwKK9mG2LTYp9mGCivYp9mF2LPYp9mECivYr9mK2q/YsQor2q/YsdmI2YfZigor2LTYr9mG2K8KK9qG2LfZiNixCivYr9mHCivZiAor2K/ZiAor2YbYrtiz2KrZitmGCivZiNmE2YoKK9qG2LHYpwor2obZhwor2YjYs9i3CivZhwor2YPYr9in2YUKK9mC2KfYqNmECivZitmDCivYsdmB2KoKK9mH2YHYqgor2YfZhdqG2YbZitmGCivYr9ixCivZh9iy2KfYsQor2KjZhNmHCivYqNmE2YoKK9i02KfZitivCivYp9mF2KcKK9i02YbYp9iz2YoKK9qv2LHZgdiq2YcKK9iv2YfYrwor2K/Yp9i02KrZhwor2K/Yp9mG2LPYqgor2K/Yp9i02KrZhgor2K7ZiNin2YfZitmFCivZhdmK2YTZitin2LHYrwor2YjZgtiq2YrZg9mHCivYp9mF2K8KK9iu2YjYp9mH2K8KK9is2LIKK9in2YjYsdiv2YcKK9i02K/Zhwor2KjZhNmD2YcKK9iu2K/Zhdin2KoKK9i02K/Zhgor2KjYsdiu2YoKK9mG2KjZiNivCivYqNiz2YrYp9ix2YoKK9is2YTZiNqv2YrYsdmKCivYrdmCCivZg9ix2K/ZhtivCivZhtmI2LnZigor2KjYudix2YoKK9mG2YPYsdiv2YcKK9mG2LjZitixCivZhtio2KfZitivCivYqNmI2K/Zhwor2KjZiNiv2YYKK9iv2KfYrwor2KfZiNix2K8KK9mH2LPYqgor2KzYp9mK2YoKK9i02YjYrwor2K/Zhtio2KfZhAor2K/Yp9iv2YcKK9io2KfZitivCivYs9in2KjZggor2YfZitqGCivZh9mF2KfZhgor2KfZhtis2KcKK9mD2YXYqtixCivZg9is2KfYs9iqCivar9ix2K/Yrwor2YPYs9mKCivYqtixCivZhdix2K/ZhQor2KrYp9mGCivYr9in2K/Zhgor2KjZiNiv2YbYrwor2LPYsdmKCivYrNiv2KcKK9mG2K/Yp9ix2YbYrwor2YXar9ixCivZitmD2K/Zitqv2LEKK9iv2KfYsdivCivYr9mH2YbYrwor2KjZhtin2KjYsdin2YrZhgor2YfZhtqv2KfZhdmKCivYs9mF2KoKK9is2KcKK9in2YbahtmHCivYrtmI2K8KK9iv2KfYr9mG2K8KK9iy2YrYp9ivCivYr9in2LHZhtivCivYp9ir2LEKK9io2K/ZiNmGCivYqNmH2KrYsdmK2YYKK9io2YrYtNiq2LEKK9in2YTYqNiq2YcKK9io2YcKK9io2LHYp9iz2KfYswor2KjZitix2YjZhgor2YPYsdivCivYqNi52LbZigor2q/YsdmB2KoKK9iq2YjZigor2KfZigor2YXZitmE2YrZiNmGCivYp9mICivYrNix2YrYp9mGCivYqtmI2YQKK9io2LEKK9mF2KfZhtmG2K8KK9io2LHYp9io2LEKK9io2KfYtNmK2YUKK9mF2K/YqtmKCivar9mI2YrZhtivCivYp9mD2YbZiNmGCivYqtinCivYqtmG2YfYpwor2KzYr9mK2K8KK9qG2YbYrwor2KjZigor2YbYtNiv2YcKK9mD2LHYr9mGCivZg9ix2K/ZhQor2q/ZiNmK2K8KK9mD2LHYr9mHCivZg9mG2YrZhQor2YbZhdmKCivZhtiy2K8KK9ix2YjZigor2YLYtdivCivZgdmC2LcKK9io2KfZhNin2YoKK9iv2Yrar9ix2KfZhgor2KfZitmGCivYr9mK2LHZiNiyCivYqtmI2LPYtwor2LPZiNmFCivYp9mK2YUKK9iv2KfZhtmG2K8KK9iz2YjZigor2KfYs9iq2YHYp9iv2YcKK9i02YXYpwor2YPZhtin2LEKK9iv2KfYsdmK2YUKK9iz2KfYrtiq2YcKK9i32YjYsQor2KfZhdiv2YcKK9ix2YHYqtmHCivZhtiu2LPYqgor2KjZitiz2KoKK9mG2LLYr9mK2YMKK9i32YoKK9mD2YbZitivCivYp9iyCivYp9mG2YfYpwor2KrZhdin2YXZigor2K/Yp9i02KoKK9mK2YPZigor2LfYsdmK2YIKK9in2LQKK9qG2YrYs9iqCivYsdmI2KgKK9mG2YXYp9mK2K8KK9qv2YHYqgor2obZhtiv2YrZhgor2obZitiy2YoKK9iq2YjYp9mG2K8KK9in2YUKK9in2YrYpwor2KjYpwor2KfZhgor2KfZitivCivYqtix2YrZhgor2KfZitmG2YPZhwor2K/Zitqv2LHZigor2LHYp9mHCivZh9in2YrZigor2KjYsdmI2LIKK9mH2YXahtmG2KfZhgor2b7Yp9i52YrZhgor2YPYswor2K3Yr9mI2K8KK9mF2K7YqtmE2YEKK9mF2YLYp9io2YQKK9qG2YrYsgor2q/Zitix2K8KK9mG2K/Yp9ix2K8KK9i22K8KK9mH2YXahtmI2YYKK9iz2KfYstmKCivYtNin2YYKK9mF2YjYsdivCivYqNin2LHZhwor2YXYsdiz2YoKK9iu2YjZiti0CivYqNix2K7ZiNix2K/Yp9ixCivahtmI2YYKK9iu2KfYsdisCivYtNi0CivZh9mG2YjYsgor2KrYrdiqCivYttmF2YYKK9mH2LPYqtmK2YUKK9qv2YHYqtmHCivZgdmD2LEKK9io2LPZitin2LEKK9m+2YrYtAor2KjYsdin2YoKK9ix2YjYstmH2KfZigor2KfZhtmD2YcKK9mG2K7ZiNin2YfYrwor2KjYp9mE2KcKK9mD2YQKK9mI2YLYqtmKCivZg9mKCivahtmG2YrZhgor2YPZhwor2q/Zitix2YoKK9mG2YrYs9iqCivYp9iz2KoKK9mD2KzYpwor2YPZhtivCivZhtmK2LIKK9mK2KfYqNivCivYqNmG2K/Zigor2K3YqtmKCivYqtmI2KfZhtmG2K8KK9i52YLYqAor2K7ZiNin2LPYqgor2YPZhtmG2K8KK9io2YrZhgor2KrZhdin2YUKK9mH2YXZhwor2YXYpwor2KjYp9i02YbYrwor2YXYq9mECivYtNivCivYp9ix2YoKK9io2KfYtNivCivYp9ix2YcKK9i32KjZggor2KjYudivCivYp9qv2LEKK9i12YjYsdiqCivYutmK2LEKK9is2KfZigor2KjZiti0CivYsdmK2LLZigor2KfZhtivCivYstmK2LHYpwor2obar9mI2YbZhwor2KjYp9ixCivZhNi32YHYpwor2YXZigor2K/Ysdio2KfYsdmHCivZhdmGCivYr9mK2K/Zhwor2YfZhdmK2YYKK9qv2LDYp9ix2YoKK9io2LHYr9in2LHZigor2LnZhNiqCivar9iw2KfYtNiq2YcKK9mH2YUKK9mB2YjZggor2YbZhwor2YfYpwor2LTZiNmG2K8KK9in2KjYp9ivCivZh9mF2YjYp9ix2YcKK9mH2LEKK9in2YjZhAor2K7ZiNin2YfZhtivCivahtmH2KfYsQor2YbYp9mFCivYp9mF2LHZiNiyCivZhdin2YYKK9mH2KfZigor2YLYqNmECivZg9mG2YUKK9iz2LnZigor2KrYp9iy2YcKK9ix2KcKK9mH2LPYqtmG2K8KK9iy2YrYsQor2KzZhNmI2YoKK9i52YbZiNin2YYKK9io2YjYrwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZmkudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZmkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19maS50eHQKQEAgLTAsMCArMSw5NSBAQAorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9maW5uaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyAKK3wgZm9ybXMgb2YgQkUKKworb2xsYQorb2xlbgorb2xldAorb24KK29sZW1tZQorb2xldHRlCitvdmF0CitvbGUgICAgICAgIHwgbmVnYXRpdmUgZm9ybQorCitvbGkKK29saXNpCitvbGlzaXQKK29saXNpbgorb2xpc2ltbWUKK29saXNpdHRlCitvbGlzaXZhdAorb2xpdAorb2xpbgorb2xpbW1lCitvbGl0dGUKK29saXZhdAorb2xsdXQKK29sbGVldAorCitlbiAgICAgICAgIHwgbmVnYXRpb24KK2V0CitlaQorZW1tZQorZXR0ZQorZWl2w6R0CisKK3xOb20gICBHZW4gICAgQWNjICAgIFBhcnQgICBJbmVzcyAgIEVsYXQgICAgSWxsYXQgIEFkZXNzICAgQWJsYXQgICBBbGxhdCAgIEVzcyAgICBUcmFucworbWluw6QgICBtaW51biAgbWludXQgIG1pbnVhICBtaW51c3NhIG1pbnVzdGEgbWludXVuIG1pbnVsbGEgbWludWx0YSBtaW51bGxlICAgICAgICAgICAgICAgfCBJCitzaW7DpCAgIHNpbnVuICBzaW51dCAgc2ludWEgIHNpbnVzc2Egc2ludXN0YSBzaW51dW4gc2ludWxsYSBzaW51bHRhIHNpbnVsbGUgICAgICAgICAgICAgICB8IHlvdQoraMOkbiAgICBow6RuZW4gIGjDpG5ldCAgaMOkbnTDpCAgaMOkbmVzc8OkIGjDpG5lc3TDpCBow6RuZWVuIGjDpG5lbGzDpCBow6RuZWx0w6QgaMOkbmVsbGUgICAgICAgICAgICAgICB8IGhlIHNoZQorbWUgICAgIG1laWTDpG4gbWVpZMOkdCBtZWl0w6QgIG1laXNzw6QgIG1laXN0w6QgIG1laWhpbiBtZWlsbMOkICBtZWlsdMOkICBtZWlsbGUgICAgICAgICAgICAgICAgfCB3ZQordGUgICAgIHRlaWTDpG4gdGVpZMOkdCB0ZWl0w6QgIHRlaXNzw6QgIHRlaXN0w6QgIHRlaWhpbiB0ZWlsbMOkICB0ZWlsdMOkICB0ZWlsbGUgICAgICAgICAgICAgICAgfCB5b3UKK2hlICAgICBoZWlkw6RuIGhlaWTDpHQgaGVpdMOkICBoZWlzc8OkICBoZWlzdMOkICBoZWloaW4gaGVpbGzDpCAgaGVpbHTDpCAgaGVpbGxlICAgICAgICAgICAgICAgIHwgdGhleQorCit0w6Rtw6QgICB0w6Rtw6RuICAgICAgICAgdMOkdMOkICAgdMOkc3PDpCAgIHTDpHN0w6QgICB0w6Row6RuICB0YWxsw6QgICB0w6RsdMOkICAgdMOkbGxlICAgdMOkbsOkICAgdMOka3NpICB8IHRoaXMKK3R1byAgICB0dW9uICAgICAgICAgIHR1b3TDpCAgdHVvc3NhICB0dW9zdGEgIHR1b2hvbiB0dW9sbGEgIHR1b2x0YSAgdHVvbGxlICB0dW9uYSAgdHVva3NpIHwgdGhhdAorc2UgICAgIHNlbiAgICAgICAgICAgc2l0w6QgICBzaWluw6QgICBzaWl0w6QgICBzaWloZW4gc2lsbMOkICAgc2lsdMOkICAgc2lsbGUgICBzaW7DpCAgIHNpa3NpICB8IGl0Cituw6Rtw6QgICBuw6RpZGVuICAgICAgICBuw6RpdMOkICBuw6Rpc3PDpCAgbsOkaXN0w6QgIG7DpGloaW4gbsOkaWxsw6QgIG7DpGlsdMOkICBuw6RpbGxlICBuw6RpbsOkICBuw6Rpa3NpIHwgdGhlc2UKK251byAgICBub2lkZW4gICAgICAgIG5vaXRhICBub2lzc2EgIG5vaXN0YSAgbm9paGluIG5vaWxsYSAgbm9pbHRhICBub2lsbGUgIG5vaW5hICBub2lrc2kgfCB0aG9zZQorbmUgICAgIG5paWRlbiAgICAgICAgbmlpdMOkICBuaWlzc8OkICBuaWlzdMOkICBuaWloaW4gbmlpbGzDpCAgbmlpbHTDpCAgbmlpbGxlICBuaWluw6QgIG5paWtzaSB8IHRoZXkKKwora3VrYSAgIGtlbmVuIGtlbmV0ICAga2V0w6QgICBrZW5lc3PDpCBrZW5lc3TDpCBrZW5lZW4ga2VuZWxsw6Qga2VuZWx0w6Qga2VuZWxsZSBrZW5lbsOkIGtlbmVrc2l8IHdobwora2V0a8OkICBrZWlkZW4ga2V0a8OkICBrZWl0w6QgIGtlaXNzw6QgIGtlaXN0w6QgIGtlaWhpbiBrZWlsbMOkICBrZWlsdMOkICBrZWlsbGUgIGtlaW7DpCAga2Vpa3NpIHwgKHBsKQorbWlrw6QgICBtaW5rw6QgbWlua8OkICAgbWl0w6QgICBtaXNzw6QgICBtaXN0w6QgICBtaWhpbiAgbWlsbMOkICAgbWlsdMOkICAgbWlsbGUgICBtaW7DpCAgIG1pa3NpICB8IHdoaWNoIHdoYXQKK21pdGvDpCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHBsKQorCitqb2thICAgam9ua2EgICAgICAgICBqb3RhICAgam9zc2EgICBqb3N0YSAgIGpvaG9uICBqb2xsYSAgIGpvbHRhICAgam9sbGUgICBqb25hICAgam9rc2kgIHwgd2hvIHdoaWNoCitqb3RrYSAgam9pZGVuICAgICAgICBqb2l0YSAgam9pc3NhICBqb2lzdGEgIGpvaWhpbiBqb2lsbGEgIGpvaWx0YSAgam9pbGxlICBqb2luYSAgam9pa3NpIHwgKHBsKQorCit8IGNvbmp1bmN0aW9ucworCitldHTDpCAgIHwgdGhhdAoramEgICAgIHwgYW5kCitqb3MgICAgfCBpZgora29za2EgIHwgYmVjYXVzZQora3VpbiAgIHwgdGhhbgorbXV0dGEgIHwgYnV0CituaWluICAgfCBzbworc2Vrw6QgICB8IGFuZAorc2lsbMOkICB8IGZvcgordGFpICAgIHwgb3IKK3ZhYW4gICB8IGJ1dAordmFpICAgIHwgb3IKK3ZhaWtrYSB8IGFsdGhvdWdoCisKKworfCBwcmVwb3NpdGlvbnMKKwora2Fuc3NhICB8IHdpdGgKK211a2FhbiAgfCBhY2NvcmRpbmcgdG8KK25vaW4gICAgfCBhYm91dAorcG9pa2tpICB8IGFjcm9zcworeWxpICAgICB8IG92ZXIsIGFjcm9zcworCit8IG90aGVyCisKK2t1biAgICB8IHdoZW4KK25paW4gICB8IHNvCitueXQgICAgfCBub3cKK2l0c2UgICB8IHNlbGYKKwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZnIudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDEyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19mci50eHQKQEAgLTAsMCArMSwxODQgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZnJlbmNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKworIHwgQSBGcmVuY2ggc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworYXUgICAgICAgICAgICAgfCAgYSArIGxlCithdXggICAgICAgICAgICB8ICBhICsgbGVzCithdmVjICAgICAgICAgICB8ICB3aXRoCitjZSAgICAgICAgICAgICB8ICB0aGlzCitjZXMgICAgICAgICAgICB8ICB0aGVzZQorZGFucyAgICAgICAgICAgfCAgd2l0aAorZGUgICAgICAgICAgICAgfCAgb2YKK2RlcyAgICAgICAgICAgIHwgIGRlICsgbGVzCitkdSAgICAgICAgICAgICB8ICBkZSArIGxlCitlbGxlICAgICAgICAgICB8ICBzaGUKK2VuICAgICAgICAgICAgIHwgIGBvZiB0aGVtJyBldGMKK2V0ICAgICAgICAgICAgIHwgIGFuZAorZXV4ICAgICAgICAgICAgfCAgdGhlbQoraWwgICAgICAgICAgICAgfCAgaGUKK2plICAgICAgICAgICAgIHwgIEkKK2xhICAgICAgICAgICAgIHwgIHRoZQorbGUgICAgICAgICAgICAgfCAgdGhlCitsZXVyICAgICAgICAgICB8ICB0aGVpcgorbHVpICAgICAgICAgICAgfCAgaGltCittYSAgICAgICAgICAgICB8ICBteSAoZmVtKQorbWFpcyAgICAgICAgICAgfCAgYnV0CittZSAgICAgICAgICAgICB8ICBtZQorbcOqbWUgICAgICAgICAgIHwgIHNhbWU7IGFzIGluIG1vaS1tw6ptZSAobXlzZWxmKSBldGMKK21lcyAgICAgICAgICAgIHwgIG1lIChwbCkKK21vaSAgICAgICAgICAgIHwgIG1lCittb24gICAgICAgICAgICB8ICBteSAobWFzYykKK25lICAgICAgICAgICAgIHwgIG5vdAorbm9zICAgICAgICAgICAgfCAgb3VyIChwbCkKK25vdHJlICAgICAgICAgIHwgIG91cgorbm91cyAgICAgICAgICAgfCAgd2UKK29uICAgICAgICAgICAgIHwgIG9uZQorb3UgICAgICAgICAgICAgfCAgd2hlcmUKK3BhciAgICAgICAgICAgIHwgIGJ5CitwYXMgICAgICAgICAgICB8ICBub3QKK3BvdXIgICAgICAgICAgIHwgIGZvcgorcXUgICAgICAgICAgICAgfCAgcXVlIGJlZm9yZSB2b3dlbAorcXVlICAgICAgICAgICAgfCAgdGhhdAorcXVpICAgICAgICAgICAgfCAgd2hvCitzYSAgICAgICAgICAgICB8ICBoaXMsIGhlciAoZmVtKQorc2UgICAgICAgICAgICAgfCAgb25lc2VsZgorc2VzICAgICAgICAgICAgfCAgaGlzIChwbCkKK3NvbiAgICAgICAgICAgIHwgIGhpcywgaGVyIChtYXNjKQorc3VyICAgICAgICAgICAgfCAgb24KK3RhICAgICAgICAgICAgIHwgIHRoeSAoZmVtKQordGUgICAgICAgICAgICAgfCAgdGhlZQordGVzICAgICAgICAgICAgfCAgdGh5IChwbCkKK3RvaSAgICAgICAgICAgIHwgIHRoZWUKK3RvbiAgICAgICAgICAgIHwgIHRoeSAobWFzYykKK3R1ICAgICAgICAgICAgIHwgIHRob3UKK3VuICAgICAgICAgICAgIHwgIGEKK3VuZSAgICAgICAgICAgIHwgIGEKK3ZvcyAgICAgICAgICAgIHwgIHlvdXIgKHBsKQordm90cmUgICAgICAgICAgfCAgeW91cgordm91cyAgICAgICAgICAgfCAgeW91CisKKyAgICAgICAgICAgICAgIHwgIHNpbmdsZSBsZXR0ZXIgZm9ybXMKKworYyAgICAgICAgICAgICAgfCAgYycKK2QgICAgICAgICAgICAgIHwgIGQnCitqICAgICAgICAgICAgICB8ICBqJworbCAgICAgICAgICAgICAgfCAgbCcKK8OgICAgICAgICAgICAgICB8ICB0bywgYXQKK20gICAgICAgICAgICAgIHwgIG0nCituICAgICAgICAgICAgICB8ICBuJworcyAgICAgICAgICAgICAgfCAgcycKK3QgICAgICAgICAgICAgIHwgIHQnCit5ICAgICAgICAgICAgICB8ICB0aGVyZQorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIMOqdHJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK8OpdMOpCivDqXTDqWUKK8OpdMOpZXMKK8OpdMOpcworw6l0YW50CitzdWlzCitlcworZXN0Citzb21tZXMKK8OqdGVzCitzb250CitzZXJhaQorc2VyYXMKK3NlcmEKK3Nlcm9ucworc2VyZXoKK3Nlcm9udAorc2VyYWlzCitzZXJhaXQKK3NlcmlvbnMKK3Nlcmllegorc2VyYWllbnQKK8OpdGFpcworw6l0YWl0CivDqXRpb25zCivDqXRpZXoKK8OpdGFpZW50CitmdXMKK2Z1dAorZsO7bWVzCitmw7t0ZXMKK2Z1cmVudAorc29pcworc29pdAorc295b25zCitzb3llegorc29pZW50CitmdXNzZQorZnVzc2VzCitmw7t0CitmdXNzaW9ucworZnVzc2llegorZnVzc2VudAorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIGF2b2lyIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK2F5YW50CitldQorZXVlCitldWVzCitldXMKK2FpCithcworYXZvbnMKK2F2ZXoKK29udAorYXVyYWkKK2F1cmFzCithdXJhCithdXJvbnMKK2F1cmV6CithdXJvbnQKK2F1cmFpcworYXVyYWl0CithdXJpb25zCithdXJpZXoKK2F1cmFpZW50CithdmFpcworYXZhaXQKK2F2aW9ucworYXZpZXoKK2F2YWllbnQKK2V1dAorZcO7bWVzCitlw7t0ZXMKK2V1cmVudAorYWllCithaWVzCithaXQKK2F5b25zCitheWV6CithaWVudAorZXVzc2UKK2V1c3NlcworZcO7dAorZXVzc2lvbnMKK2V1c3NpZXoKK2V1c3NlbnQKKworICAgICAgICAgICAgICAgfCBMYXRlciBhZGRpdGlvbnMgKGZyb20gSmVhbi1DaHJpc3RvcGhlIERlc2NoYW1wcykKK2NlY2kgICAgICAgICAgIHwgIHRoaXMKK2NlbGEgICAgICAgICAgIHwgIHRoYXQKK2NlbMOgICAgICAgICAgICB8ICB0aGF0CitjZXQgICAgICAgICAgICB8ICB0aGlzCitjZXR0ZSAgICAgICAgICB8ICB0aGlzCitpY2kgICAgICAgICAgICB8ICBoZXJlCitpbHMgICAgICAgICAgICB8ICB0aGV5CitsZXMgICAgICAgICAgICB8ICB0aGUgKHBsKQorbGV1cnMgICAgICAgICAgfCAgdGhlaXIgKHBsKQorcXVlbCAgICAgICAgICAgfCAgd2hpY2gKK3F1ZWxzICAgICAgICAgIHwgIHdoaWNoCitxdWVsbGUgICAgICAgICB8ICB3aGljaAorcXVlbGxlcyAgICAgICAgfCAgd2hpY2gKK3NhbnMgICAgICAgICAgIHwgIHdpdGhvdXQKK3NvaSAgICAgICAgICAgIHwgIG9uZXNlbGYKKwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2EudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2EudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjg4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19nYS50eHQKQEAgLTAsMCArMSwxMTAgQEAKKworYQorYWNoCithZworYWd1cworYW4KK2FvbgorYXIKK2FybmEKK2FzCitiJworYmEKK2JlaXJ0CitiaMO6cgorY2FvZ2EKK2NlYXRoYWlyCitjZWF0aHJhcgorY2hvbWgKK2NodMOzCitjaHVpZworY2h1bgorY29pcworY8OpYWQKK2PDumlnCitjw7ppZ2VhcgorZCcKK2RhaWNoZWFkCitkYXIKK2RlCitkZWljaAorZGVpY2huacO6cgorZGVuCitkaMOhCitkbworZG9uCitkdMOtCitkw6EKK2TDoXIKK2TDsworZmFvaQorZmFvaW4KK2Zhb2luYQorZmFvaW7DoXIKK2ZhcmEKK2ZpY2hlCitnYWNoCitnYW4KK2dvCitndXIKK2hhb24KK2hvY2h0CitpCitpYWQKK2lkaXIKK2luCitpbmEKK2lucworaW7DoXIKK2lzCitsZQorbGVpcworbGVuYQorbGVuw6FyCittJworbWFyCittbworbcOpCituYQorbmFjaAorbmFvaQorbmFvbsO6cgorbsOhCituw60KK27DrW9yCituw7MKK27Ds2NoYQorb2NodAorb2NodGFyCitvcworcm9pbWgKK3NhCitzZWFjaHQKK3NlYWNodGFyCitzZWFjaHTDsworc2Vhc2NhCitzZWlzZWFyCitzaWFkCitzaWJoCitzaW5uCitzbmEKK3PDqQorc8OtCit0YXIKK3RoYXIKK3Row7oKK3RyacO6cgordHLDrQordHLDrW5hCit0csOtbsOhcgordHLDrW9jaGEKK3TDugordW0KK8Ohcgorw6kKK8OpaXMKK8OtCivDsworw7NuCivDs25hCivDs27DoXIKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2dsLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2dsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODc2MGIxCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfZ2wudHh0CkBAIC0wLDAgKzEsMTYxIEBACisjIGdhbGljYW4gc3RvcHdvcmRzCithCithw61uZGEKK2Fsw60KK2FxdWVsCithcXVlbGEKK2FxdWVsYXMKK2FxdWVsZXMKK2FxdWlsbworYXF1w60KK2FvCithb3MKK2FzCithc8OtCivDoQorYmVuCitjYW5kbworY2hlCitjbworY29hCitjb21pZ28KK2NvbgorY29ubm9zY28KK2NvbnRpZ28KK2NvbnZvc2NvCitjb2FzCitjb3MKK2N1bgorY3VucworY3VuaGEKK2N1bmhhcworZGEKK2RhbGd1bmhhCitkYWxndW5oYXMKK2RhbGfDum4KK2RhbGfDum5zCitkYXMKK2RlCitkZWwKK2RlbGEKK2RlbGFzCitkZWxlcworZGVzZGUKK2Rlc3RlCitkbworZG9zCitkdW4KK2R1bnMKK2R1bmhhCitkdW5oYXMKK2UKK2VsCitlbGEKK2VsYXMKK2VsZXMKK2VuCitlcmEKK2VyYW4KK2VzYQorZXNhcworZXNlCitlc2VzCitlc3RhCitlc3RhcgorZXN0YWJhCitlc3TDoQorZXN0w6FuCitlc3RlCitlc3RlcworZXN0aXZlbgorZXN0b3UKK2V1CivDqQorZmFjZXIKK2ZvaQorZm9yb24KK2Z1bgoraGFiw61hCitoYWkKK2lzbworaXN0bworbGEKK2xhcworbGxlCitsbGVzCitsbworbG9zCittYWlzCittZQorbWV1CittZXVzCittaW4KK21pw7FhCittacOxYXMKK21vaQorbmEKK25hcworbmVzdGUKK25pbgorbm8KK25vbgorbm9zCitub3NhCitub3Nhcworbm9zbworbm9zb3MKK27Ds3MKK251bgorbnVuaGEKK251bnMKK251bmhhcworbworb3MKK291CivDsworw7NzCitwYXJhCitwZXJvCitwb2RlCitwb2lzCitwb2xhCitwb2xhcworcG9sbworcG9sb3MKK3BvcgorcXVlCitzZQorc2Vuw7NuCitzZXIKK3NldQorc2V1cworc2V4YQorc2lkbworc29icmUKK3PDumEKK3PDumFzCit0YW3DqW4KK3RhbgordGUKK3RlbgordGXDsWVuCit0ZcOxbwordGVyCit0ZXUKK3RldXMKK3RpCit0aWRvCit0acOxYQordGl2ZW4KK3TDumEKK3TDumFzCit1bgordW5oYQordW5oYXMKK3Vucwordm9zCit2b3NhCit2b3Nhcwordm9zbwordm9zb3MKK3bDs3MKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2hpLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2hpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI4NmJiCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfaGkudHh0CkBAIC0wLDAgKzEsMjM1IEBACisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGFsc28gY29udGFpbnMgZm9ybXMgbm9ybWFsaXplZCBieSBIaW5kaU5vcm1hbGl6ZXIgCisjIGZvciBzcGVsbGluZyB2YXJpYXRpb24gKHNlZSBzZWN0aW9uIGJlbG93KSwgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIHdoZXRoZXIgb3IgCisjIG5vdCB5b3UgZW5hYmxlIHRoYXQgZmVhdHVyZS4gV2hlbiBhZGRpbmcgYWRkaXRpb25hbCBlbnRyaWVzIHRvIHRoaXMgbGlzdCwKKyMgcGxlYXNlIGFkZCB0aGUgbm9ybWFsaXplZCBmb3JtIGFzIHdlbGwuIAor4KSF4KSC4KSm4KSwCivgpIXgpKQKK+CkheCkquCkqOCkvgor4KSF4KSq4KSo4KWACivgpIXgpKrgpKjgpYcKK+CkheCkreClgAor4KSG4KSm4KS/CivgpIbgpKoKK+Ckh+CkpOCljeCkr+CkvuCkpuCkvwor4KSH4KSoIAor4KSH4KSo4KSV4KS+CivgpIfgpKjgpY3gpLngpYDgpIIKK+Ckh+CkqOCljeCkueClh+Ckggor4KSH4KSo4KWN4KS54KWL4KSCCivgpIfgpLgKK+Ckh+CkuOCkleCkvgor4KSH4KS44KSV4KWACivgpIfgpLjgpJXgpYcKK+Ckh+CkuOCkruClh+Ckggor4KSH4KS44KWACivgpIfgpLjgpYcKK+CkieCkqAor4KSJ4KSo4KSV4KS+CivgpIngpKjgpJXgpYAKK+CkieCkqOCkleClhwor4KSJ4KSo4KSV4KWLCivgpIngpKjgpY3gpLngpYDgpIIKK+CkieCkqOCljeCkueClh+Ckggor4KSJ4KSo4KWN4KS54KWL4KSCCivgpIngpLgKK+CkieCkuOCkleClhwor4KSJ4KS44KWACivgpIngpLjgpYcKK+Ckj+CklQor4KSP4KS14KSCCivgpI/gpLgKK+CkkOCkuOClhwor4KSU4KSwCivgpJXgpIgKK+CkleCksAor4KSV4KSw4KSk4KS+CivgpJXgpLDgpKTgpYcKK+CkleCksOCkqOCkvgor4KSV4KSw4KSo4KWHCivgpJXgpLDgpYfgpIIKK+CkleCkueCkpOClhwor4KSV4KS54KS+CivgpJXgpL4KK+CkleCkvuClnuClgAor4KSV4KS/CivgpJXgpL/gpKTgpKjgpL4KK+CkleCkv+CkqOCljeCkueClh+Ckggor4KSV4KS/4KSo4KWN4KS54KWL4KSCCivgpJXgpL/gpK/gpL4KK+CkleCkv+CksAor4KSV4KS/4KS4CivgpJXgpL/gpLjgpYAKK+CkleCkv+CkuOClhwor4KSV4KWACivgpJXgpYHgpJsKK+CkleClgeCksgor4KSV4KWHCivgpJXgpYsKK+CkleCli+CkiAor4KSV4KWM4KSoCivgpJXgpYzgpKjgpLjgpL4KK+Ckl+Ckr+Ckvgor4KSY4KSwCivgpJzgpKwKK+CknOCkueCkvuCkgQor4KSc4KS+CivgpJzgpL/gpKTgpKjgpL4KK+CknOCkv+CkqAor4KSc4KS/4KSo4KWN4KS54KWH4KSCCivgpJzgpL/gpKjgpY3gpLngpYvgpIIKK+CknOCkv+CkuAor4KSc4KS/4KS44KWHCivgpJzgpYDgpKfgpLAKK+CknOCliOCkuOCkvgor4KSc4KWI4KS44KWHCivgpJzgpYsKK+CkpOCklQor4KSk4KSsCivgpKTgpLDgpLkKK+CkpOCkv+CkqAor4KSk4KS/4KSo4KWN4KS54KWH4KSCCivgpKTgpL/gpKjgpY3gpLngpYvgpIIKK+CkpOCkv+CkuAor4KSk4KS/4KS44KWHCivgpKTgpYsKK+CkpeCkvgor4KSl4KWACivgpKXgpYcKK+CkpuCkrOCkvuCksOCkvgor4KSm4KS/4KSv4KS+CivgpKbgpYHgpLjgpLDgpL4KK+CkpuClguCkuOCksOClhwor4KSm4KWLCivgpKbgpY3gpLXgpL7gpLDgpL4KK+CkqAor4KSo4KS54KWA4KSCCivgpKjgpL4KK+CkqOCkv+CkueCkvuCkr+CkpAor4KSo4KWA4KSa4KWHCivgpKjgpYcKK+CkquCksAor4KSq4KSwICAKK+CkquCkueCksuClhwor4KSq4KWC4KSw4KS+CivgpKrgpYcKK+Ckq+Ckv+CksAor4KSs4KSo4KWACivgpKzgpLngpYAKK+CkrOCkueClgeCkpAor4KSs4KS+4KSmCivgpKzgpL7gpLLgpL4KK+CkrOCkv+CksuCkleClgeCksgor4KSt4KWACivgpK3gpYDgpKTgpLAKK+CkruCkl+CksAor4KSu4KS+4KSo4KWLCivgpK7gpYcKK+CkruClh+Ckggor4KSv4KSm4KS/CivgpK/gpLkKK+Ckr+CkueCkvuCkgQor4KSv4KS54KWACivgpK/gpL4KK+Ckr+Ckv+CkuSAKK+Ckr+Clhwor4KSw4KSW4KWH4KSCCivgpLDgpLngpL4KK+CksOCkueClhwor4KSx4KWN4KS14KS+4KS44KS+CivgpLLgpL/gpI8KK+CksuCkv+Ckr+Clhwor4KSy4KWH4KSV4KS/4KSoCivgpLUKK+CkteCksOCljeCklwor4KS14KS5CivgpLXgpLkgCivgpLXgpLngpL7gpIEKK+CkteCkueClgOCkggor4KS14KS+4KSy4KWHCivgpLXgpYHgpLkgCivgpLXgpYcKK+CkteClmuCliOCksOCkuQor4KS44KSC4KSXCivgpLjgpJXgpKTgpL4KK+CkuOCkleCkpOClhwor4KS44KSs4KS44KWHCivgpLjgpK3gpYAKK+CkuOCkvuCkpQor4KS44KS+4KSs4KWB4KSkCivgpLjgpL7gpK0KK+CkuOCkvuCksOCkvgor4KS44KWHCivgpLjgpYsKK+CkueClgAor4KS54KWB4KSGCivgpLngpYHgpIgKK+CkueClgeCkjwor4KS54KWICivgpLngpYjgpIIKK+CkueCliwor4KS54KWL4KSk4KS+CivgpLngpYvgpKTgpYAKK+CkueCli+CkpOClhwor4KS54KWL4KSo4KS+CivgpLngpYvgpKjgpYcKKyMgYWRkaXRpb25hbCBub3JtYWxpemVkIGZvcm1zIG9mIHRoZSBhYm92ZQor4KSF4KSq4KSo4KS/CivgpJzgpYfgpLjgpYcKK+CkueCli+CkpOCkvwor4KS44KSt4KS/CivgpKTgpL/gpILgpLngpYvgpIIKK+Ckh+CkguCkueCli+Ckggor4KSm4KS14KS+4KSw4KS+CivgpIfgpLjgpL8KK+CkleCkv+CkguCkueClh+Ckggor4KSl4KS/CivgpIngpILgpLngpYvgpIIKK+Ckk+CksAor4KSc4KS/4KSC4KS54KWH4KSCCivgpLXgpLngpL/gpIIKK+CkheCkreCkvwor4KSs4KSo4KS/CivgpLngpL8KK+CkieCkguCkueCkv+Ckggor4KSJ4KSC4KS54KWH4KSCCivgpLngpYfgpIIKK+CkteCkl+Clh+CksOCkuQor4KSP4KS44KWHCivgpLDgpLXgpL7gpLjgpL4KK+CkleCli+CkqAor4KSo4KS/4KSa4KWHCivgpJXgpL7gpKvgpL8KK+CkieCkuOCkvwor4KSq4KWB4KSw4KS+CivgpK3gpL/gpKTgpLAKK+CkueClhwor4KSs4KS54KS/CivgpLXgpLngpL7gpIIKK+CkleCli+Ckhwor4KSv4KS54KS+4KSCCivgpJzgpL/gpILgpLngpYvgpIIKK+CkpOCkv+CkguCkueClh+Ckggor4KSV4KS/4KS44KS/CivgpJXgpIcKK+Ckr+CkueCkvwor4KSH4KSC4KS54KS/4KSCCivgpJzgpL/gpKfgpLAKK+Ckh+CkguCkueClh+Ckggor4KSF4KSm4KS/CivgpIfgpKTgpK/gpL7gpKbgpL8KK+CkueClgeCkhwor4KSV4KWL4KSo4KS44KS+CivgpIfgpLjgpJXgpL8KK+CkpuClgeCkuOCksOClhwor4KSc4KS54KS+4KSCCivgpIXgpKoKK+CkleCkv+CkguCkueCli+Ckggor4KSJ4KSo4KSV4KS/CivgpK3gpL8KK+CkteCksOCklwor4KS54KWB4KSFCivgpJzgpYfgpLjgpL4KK+CkqOCkueCkv+CkggpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfaHUudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfaHUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTZmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19odS50eHQKQEAgLTAsMCArMSwyMDkgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvaHVuZ2FyaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyAKK3wgSHVuZ2FyaWFuIHN0b3Agd29yZCBsaXN0Cit8IHByZXBhcmVkIGJ5IEFubmEgVG9yZGFpCisKK2EKK2Fob2d5CithaG9sCitha2kKK2FraWsKK2Fra29yCithbGF0dAorw6FsdGFsCivDoWx0YWzDoWJhbgorYW1lbHkKK2FtZWx5ZWsKK2FtZWx5ZWtiZW4KK2FtZWx5ZWtldAorYW1lbHlldAorYW1lbHluZWsKK2FtaQorYW1pdAorYW1vbHlhbgorYW3DrWcKK2FtaWtvcgorw6F0CithYmJhbgorYWhob3oKK2FubmFrCithcnJhCithcnLDs2wKK2F6Cithem9rCithem9uCithenQKK2F6emFsCithesOpcnQKK2F6dMOhbgorYXp1dMOhbgorYXpvbmJhbgorYsOhcgorYmUKK2JlbMO8bAorYmVubmUKK2Npa2sKK2Npa2tlaworY2lra2VrZXQKK2NzYWsKK2RlCitlCitlZGRpZworZWfDqXN6CitlZ3kKK2VneWVzCitlZ3lldGxlbgorZWd5w6liCitlZ3lpaworZWd5cmUKK2Vra29yCitlbAorZWzDqWcKK2VsbGVuCitlbMWRCitlbMWRc3rDtnIKK2VsxZF0dAorZWxzxZEKK8Opbgorw6lwcGVuCitlYmJlbgorZWhoZXoKK2VtaWx5ZW4KK2VubmVrCitlcnJlCitlegorZXp0CitlemVrCitlemVuCitlenplbAorZXrDqXJ0CivDqXMKK2ZlbAorZmVsw6kKK2hhbmVtCitoaXN6ZW4KK2hvZ3kKK2hvZ3lhbgoraWdlbgorw61neQoraWxsZXR2ZQoraWxsLgoraWxsCitpbHllbgoraWx5ZW5rb3IKK2lzb24KK2lzbcOpdAoraXR0Citqw7MKK2rDs2wKK2pvYmJhbgora2VsbAora2VsbGV0dAora2VyZXN6dMO8bAora2VyZXNzw7xuawora2kKK2vDrXbDvGwKK2vDtnrDtnR0Citrw7Z6w7xsCitsZWdhbMOhYmIKK2xlaGV0CitsZWhldGV0dAorbGVneWVuCitsZW5uZQorbGVubmkKK2xlc3oKK2xldHQKK21hZ2EKK21hZ8OhdAorbWFqZAorbWFqZAorbcOhcgorbcOhcworbcOhc2lrCittZWcKK23DqWcKK21lbGxldHQKK21lcnQKK21lbHkKK21lbHllaworbWkKK21pdAorbcOtZworbWnDqXJ0CittaWx5ZW4KK21pa29yCittaW5kZW4KK21pbmRlbnQKK21pbmRlbmtpCittaW5kaWcKK21pbnQKK21pbnRoYQorbWl2ZWwKK21vc3QKK25hZ3kKK25hZ3lvYmIKK25hZ3lvbgorbmUKK27DqWhhCituZWtlbQorbmVraQorbmVtCituw6low6FueQorbsOpbGvDvGwKK25pbmNzCitvbHlhbgorb3R0CivDtnNzemUKK8WRCivFkWsKK8WRa2V0CitwZWRpZworcGVyc3plCityw6EKK3MKK3NhasOhdAorc2VtCitzZW1taQorc29rCitzb2thdAorc29ra2FsCitzesOhbcOhcmEKK3N6ZW1iZW4KK3N6ZXJpbnQKK3N6aW50ZQordGFsw6FuCit0ZWjDoXQKK3RlbGplcwordG92w6FiYgordG92w6FiYsOhCit0w7ZiYgorw7pneQordWd5YW5pcworw7pqCivDumphYmIKK8O6anJhCit1dMOhbgordXTDoW5hCit1dG9sc8OzCit2YWd5Cit2YWd5aXMKK3ZhbGFraQordmFsYW1pCit2YWxhbWludAordmFsw7MKK3ZhZ3lvawordmFuCit2YW5uYWsKK3ZvbHQKK3ZvbHRhbQordm9sdGFrCit2b2x0dW5rCit2aXNzemEKK3ZlbGUKK3Zpc3pvbnQKK3ZvbG5hCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19oeS50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19oeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMWM1MAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2h5LnR4dApAQCAtMCwwICsxLDQ2IEBACisjIGV4YW1wbGUgc2V0IG9mIEFybWVuaWFuIHN0b3B3b3Jkcy4KK9Wh1bXVpAor1aHVtdWsCivVodW11bYKK9Wh1bXVvQor1aTVuNaCCivVpNW41oLWhAor1aXVtAor1aXVtgor1aXVttaECivVpdW9CivVpdaECivVpwor1afVqwor1afVq9W2CivVp9Wr1bbWhAor1afVq9aACivVp9Wr1oQKK9Wn1oAKK9Wo1b3Vvwor1akKK9WrCivVq9W2CivVq9W91a8KK9Wr1oAKK9Wv1aHVtAor1bDVodW01aHWgAor1bDVpdW/CivVsNWl1b/VuAor1bTVpdW21oQKK9W01aXVuwor1bTVqwor1bYKK9W21aEKK9W21aHWhwor1bbWgNWhCivVttaA1aHVttaECivVuNaACivVuNaA1agKK9W41oDVuNW21oQKK9W41oDVutWl1b0KK9W41oIKK9W41oLVtAor1brVq9W/1asKK9W+1oDVoQor1ocKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2lkLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2lkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE3ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfaWQudHh0CkBAIC0wLDAgKzEsMzU5IEBACisjIGZyb20gYXBwZW5kaXggRCBvZjogQSBTdHVkeSBvZiBTdGVtbWluZyBFZmZlY3RzIG9uIEluZm9ybWF0aW9uCisjIFJldHJpZXZhbCBpbiBCYWhhc2EgSW5kb25lc2lhCithZGEKK2FkYW55YQorYWRhbGFoCithZGFwdW4KK2FnYWsKK2FnYWtueWEKK2FnYXIKK2FrYW4KK2FrYW5rYWgKK2FraGlybnlhCitha3UKK2FrdWxhaAorYW1hdAorYW1hdGxhaAorYW5kYQorYW5kYWxhaAorYW50YXIKK2RpYW50YXJhbnlhCithbnRhcmEKK2FudGFyYW55YQorZGlhbnRhcmEKK2FwYQorYXBhYW4KK21lbmdhcGEKK2FwYWJpbGEKK2FwYWthaAorYXBhbGFnaQorYXBhdGFoCithdGF1CithdGF1a2FoCithdGF1cHVuCitiYWdhaQorYmFnYWlrYW4KK3NlYmFnYWkKK3NlYmFnYWlueWEKK2JhZ2FpbWFuYQorYmFnYWltYW5hcHVuCitzZWJhZ2FpbWFuYQorYmFnYWltYW5ha2FoCitiYWdpCitiYWhrYW4KK2JhaHdhCitiYWh3YXNhbnlhCitzZWJhbGlrbnlhCitiYW55YWsKK3NlYmFueWFrCitiZWJlcmFwYQorc2ViZXJhcGEKK2JlZ2luaQorYmVnaW5pYW4KK2JlZ2luaWthaAorYmVnaW5pbGFoCitzZWJlZ2luaQorYmVnaXR1CitiZWdpdHVrYWgKK2JlZ2l0dWxhaAorYmVnaXR1cHVuCitzZWJlZ2l0dQorYmVsdW0KK2JlbHVtbGFoCitzZWJlbHVtCitzZWJlbHVtbnlhCitzZWJlbmFybnlhCitiZXJhcGEKK2JlcmFwYWthaAorYmVyYXBhbGFoCitiZXJhcGFwdW4KK2JldHVsa2FoCitzZWJldHVsbnlhCitiaWFzYQorYmlhc2FueWEKK2JpbGEKK2JpbGFrYWgKK2Jpc2EKK2Jpc2FrYWgKK3NlYmlzYW55YQorYm9sZWgKK2JvbGVoa2FoCitib2xlaGxhaAorYnVhdAorYnVrYW4KK2J1a2Fua2FoCitidWthbmxhaAorYnVrYW5ueWEKK2N1bWEKK3BlcmN1bWEKK2RhaHVsdQorZGFsYW0KK2RhbgorZGFwYXQKK2RhcmkKK2RhcmlwYWRhCitkZWthdAorZGVtaQorZGVtaWtpYW4KK2RlbWlraWFubGFoCitzZWRlbWlraWFuCitkZW5nYW4KK2RlcGFuCitkaQorZGlhCitkaWFsYWgKK2RpbmkKK2RpcmkKK2RpcmlueWEKK3RlcmRpcmkKK2RvbmcKK2R1bHUKK2VuZ2dhaworZW5nZ2FrbnlhCitlbnRhaAorZW50YWhsYWgKK3RlcmhhZGFwCit0ZXJoYWRhcG55YQoraGFsCitoYW1waXIKK2hhbnlhCitoYW55YWxhaAoraGFydXMKK2hhcnVzbGFoCitoYXJ1c255YQorc2VoYXJ1c255YQoraGVuZGFrCitoZW5kYWtsYWgKK2hlbmRha255YQoraGluZ2dhCitzZWhpbmdnYQoraWEKK2lhbGFoCitpYmFyYXQKK2luZ2luCitpbmdpbmthaAoraW5naW5rYW4KK2luaQoraW5pa2FoCitpbmlsYWgKK2l0dQoraXR1a2FoCitpdHVsYWgKK2phbmdhbgoramFuZ2Fua2FuCitqYW5nYW5sYWgKK2ppa2EKK2ppa2FsYXUKK2p1Z2EKK2p1c3RydQora2FsYQora2FsYXUKK2thbGF1bGFoCitrYWxhdXB1bgora2FsaWFuCitrYW1pCitrYW1pbGFoCitrYW11CitrYW11bGFoCitrYW4KK2thcGFuCitrYXBhbmthaAora2FwYW5wdW4KK2Rpa2FyZW5ha2FuCitrYXJlbmEKK2thcmVuYW55YQora2UKK2tlY2lsCitrZW11ZGlhbgora2VuYXBhCitrZXBhZGEKK2tlcGFkYW55YQora2V0aWthCitzZWtldGlrYQora2h1c3VzbnlhCitraW5pCitraW5pbGFoCitraXJhbnlhCitzZWtpcmFueWEKK2tpdGEKK2tpdGFsYWgKK2tvaworbGFnaQorbGFnaWFuCitzZWxhZ2kKK2xhaAorbGFpbgorbGFpbm55YQorbWVsYWlua2FuCitzZWxha3UKK2xhbHUKK21lbGFsdWkKK3RlcmxhbHUKK2xhbWEKK2xhbWFueWEKK3NlbGFtYQorc2VsYW1hCitzZWxhbWFueWEKK2xlYmloCit0ZXJsZWJpaAorYmVybWFjYW0KK21hY2FtCitzZW1hY2FtCittYWthCittYWthbnlhCittYWtpbgorbWFsYWgKK21hbGFoYW4KK21hbXB1CittYW1wdWthaAorbWFuYQorbWFuYWthbGEKK21hbmFsYWdpCittYXNpaAorbWFzaWhrYWgKK3NlbWFzaWgKK21hc2luZworbWF1CittYXVwdW4KK3NlbWF1bnlhCittZW1hbmcKK21lcmVrYQorbWVyZWthbGFoCittZXNraQorbWVza2lwdW4KK3NlbXVsYQorbXVuZ2tpbgorbXVuZ2tpbmthaAorbmFoCituYW11bgorbmFudGkKK25hbnRpbnlhCitueWFyaXMKK29sZWgKK29sZWhueWEKK3Nlb3JhbmcKK3Nlc2VvcmFuZworcGFkYQorcGFkYW55YQorcGFkYWhhbAorcGFsaW5nCitzZXBhbmphbmcKK3BhbnRhcworc2VwYW50YXNueWEKK3NlcGFudGFzbnlhbGFoCitwYXJhCitwYXN0aQorcGFzdGlsYWgKK3BlcgorcGVybmFoCitwdWxhCitwdW4KK21lcnVwYWthbgorcnVwYW55YQorc2VydXBhCitzYWF0CitzYWF0bnlhCitzZXNhYXQKK3NhamEKK3NhamFsYWgKK3NhbGluZworYmVyc2FtYQorc2FtYQorc2VzYW1hCitzYW1iaWwKK3NhbXBhaQorc2FuYQorc2FuZ2F0CitzYW5nYXRsYWgKK3NheWEKK3NheWFsYWgKK3NlCitzZWJhYgorc2ViYWJueWEKK3NlYnVhaAordGVyc2VidXQKK3RlcnNlYnV0bGFoCitzZWRhbmcKK3NlZGFuZ2thbgorc2VkaWtpdAorc2VkaWtpdG55YQorc2VnYWxhCitzZWdhbGFueWEKK3NlZ2VyYQorc2VzZWdlcmEKK3NlamFrCitzZWplbmFrCitzZWthbGkKK3Nla2FsaWFuCitzZWthbGlwdW4KK3Nlc2VrYWxpCitzZWthbGlndXMKK3Nla2FyYW5nCitzZWthcmFuZworc2VraXRhcgorc2VraXRhcm55YQorc2VsYQorc2VsYWluCitzZWxhbHUKK3NlbHVydWgKK3NlbHVydWhueWEKK3NlbWFraW4KK3NlbWVudGFyYQorc2VtcGF0CitzZW11YQorc2VtdWFueWEKK3NlbmRpcmkKK3NlbmRpcmlueWEKK3Nlb2xhaAorc2VwZXJ0aQorc2VwZXJ0aW55YQorc2VyaW5nCitzZXJpbmdueWEKK3NlcnRhCitzaWFwYQorc2lhcGFrYWgKK3NpYXBhcHVuCitkaXNpbmkKK2Rpc2luaWxhaAorc2luaQorc2luaWxhaAorc2VzdWF0dQorc2VzdWF0dW55YQorc3VhdHUKK3Nlc3VkYWgKK3Nlc3VkYWhueWEKK3N1ZGFoCitzdWRhaGthaAorc3VkYWhsYWgKK3N1cGF5YQordGFkaQordGFkaW55YQordGFrCit0YW5wYQorc2V0ZWxhaAordGVsYWgKK3RlbnRhbmcKK3RlbnR1Cit0ZW50dWxhaAordGVudHVueWEKK3RlcnRlbnR1CitzZXRlcnVzbnlhCit0YXBpCit0ZXRhcGkKK3NldGlhcAordGlhcAorc2V0aWRha255YQordGlkYWsKK3RpZGFra2FoCit0aWRha2xhaAordG9oCit3YWR1aAord2FoCit3YWhhaQorc2V3YWt0dQord2FsYXUKK3dhbGF1cHVuCit3b25nCit5YWl0dQoreWFrbmkKK3lhbmcKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2I1YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfaXQudHh0CkBAIC0wLDAgKzEsMzAxIEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2l0YWxpYW4vc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorCisgfCBBbiBJdGFsaWFuIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKK2FkICAgICAgICAgICAgIHwgIGEgKHRvKSBiZWZvcmUgdm93ZWwKK2FsICAgICAgICAgICAgIHwgIGEgKyBpbAorYWxsbyAgICAgICAgICAgfCAgYSArIGxvCithaSAgICAgICAgICAgICB8ICBhICsgaQorYWdsaSAgICAgICAgICAgfCAgYSArIGdsaQorYWxsICAgICAgICAgICAgfCAgYSArIGwnCithZ2wgICAgICAgICAgICB8ICBhICsgZ2wnCithbGxhICAgICAgICAgICB8ICBhICsgbGEKK2FsbGUgICAgICAgICAgIHwgIGEgKyBsZQorY29uICAgICAgICAgICAgfCAgd2l0aAorY29sICAgICAgICAgICAgfCAgY29uICsgaWwKK2NvaSAgICAgICAgICAgIHwgIGNvbiArIGkgKGZvcm1zIGNvbGxvLCBjb2dsaSBldGMgYXJlIG5vdyB2ZXJ5IHJhcmUpCitkYSAgICAgICAgICAgICB8ICBmcm9tCitkYWwgICAgICAgICAgICB8ICBkYSArIGlsCitkYWxsbyAgICAgICAgICB8ICBkYSArIGxvCitkYWkgICAgICAgICAgICB8ICBkYSArIGkKK2RhZ2xpICAgICAgICAgIHwgIGRhICsgZ2xpCitkYWxsICAgICAgICAgICB8ICBkYSArIGwnCitkYWdsICAgICAgICAgICB8ICBkYSArIGdsbCcKK2RhbGxhICAgICAgICAgIHwgIGRhICsgbGEKK2RhbGxlICAgICAgICAgIHwgIGRhICsgbGUKK2RpICAgICAgICAgICAgIHwgIG9mCitkZWwgICAgICAgICAgICB8ICBkaSArIGlsCitkZWxsbyAgICAgICAgICB8ICBkaSArIGxvCitkZWkgICAgICAgICAgICB8ICBkaSArIGkKK2RlZ2xpICAgICAgICAgIHwgIGRpICsgZ2xpCitkZWxsICAgICAgICAgICB8ICBkaSArIGwnCitkZWdsICAgICAgICAgICB8ICBkaSArIGdsJworZGVsbGEgICAgICAgICAgfCAgZGkgKyBsYQorZGVsbGUgICAgICAgICAgfCAgZGkgKyBsZQoraW4gICAgICAgICAgICAgfCAgaW4KK25lbCAgICAgICAgICAgIHwgIGluICsgZWwKK25lbGxvICAgICAgICAgIHwgIGluICsgbG8KK25laSAgICAgICAgICAgIHwgIGluICsgaQorbmVnbGkgICAgICAgICAgfCAgaW4gKyBnbGkKK25lbGwgICAgICAgICAgIHwgIGluICsgbCcKK25lZ2wgICAgICAgICAgIHwgIGluICsgZ2wnCituZWxsYSAgICAgICAgICB8ICBpbiArIGxhCituZWxsZSAgICAgICAgICB8ICBpbiArIGxlCitzdSAgICAgICAgICAgICB8ICBvbgorc3VsICAgICAgICAgICAgfCAgc3UgKyBpbAorc3VsbG8gICAgICAgICAgfCAgc3UgKyBsbworc3VpICAgICAgICAgICAgfCAgc3UgKyBpCitzdWdsaSAgICAgICAgICB8ICBzdSArIGdsaQorc3VsbCAgICAgICAgICAgfCAgc3UgKyBsJworc3VnbCAgICAgICAgICAgfCAgc3UgKyBnbCcKK3N1bGxhICAgICAgICAgIHwgIHN1ICsgbGEKK3N1bGxlICAgICAgICAgIHwgIHN1ICsgbGUKK3BlciAgICAgICAgICAgIHwgIHRocm91Z2gsIGJ5Cit0cmEgICAgICAgICAgICB8ICBhbW9uZworY29udHJvICAgICAgICAgfCAgYWdhaW5zdAoraW8gICAgICAgICAgICAgfCAgSQordHUgICAgICAgICAgICAgfCAgdGhvdQorbHVpICAgICAgICAgICAgfCAgaGUKK2xlaSAgICAgICAgICAgIHwgIHNoZQorbm9pICAgICAgICAgICAgfCAgd2UKK3ZvaSAgICAgICAgICAgIHwgIHlvdQorbG9ybyAgICAgICAgICAgfCAgdGhleQorbWlvICAgICAgICAgICAgfCAgbXkKK21pYSAgICAgICAgICAgIHwKK21pZWkgICAgICAgICAgIHwKK21pZSAgICAgICAgICAgIHwKK3R1byAgICAgICAgICAgIHwKK3R1YSAgICAgICAgICAgIHwKK3R1b2kgICAgICAgICAgIHwgIHRoeQordHVlICAgICAgICAgICAgfAorc3VvICAgICAgICAgICAgfAorc3VhICAgICAgICAgICAgfAorc3VvaSAgICAgICAgICAgfCAgaGlzLCBoZXIKK3N1ZSAgICAgICAgICAgIHwKK25vc3RybyAgICAgICAgIHwgIG91cgorbm9zdHJhICAgICAgICAgfAorbm9zdHJpICAgICAgICAgfAorbm9zdHJlICAgICAgICAgfAordm9zdHJvICAgICAgICAgfCAgeW91cgordm9zdHJhICAgICAgICAgfAordm9zdHJpICAgICAgICAgfAordm9zdHJlICAgICAgICAgfAorbWkgICAgICAgICAgICAgfCAgbWUKK3RpICAgICAgICAgICAgIHwgIHRoZWUKK2NpICAgICAgICAgICAgIHwgIHVzLCB0aGVyZQordmkgICAgICAgICAgICAgfCAgeW91LCB0aGVyZQorbG8gICAgICAgICAgICAgfCAgaGltLCB0aGUKK2xhICAgICAgICAgICAgIHwgIGhlciwgdGhlCitsaSAgICAgICAgICAgICB8ICB0aGVtCitsZSAgICAgICAgICAgICB8ICB0aGVtLCB0aGUKK2dsaSAgICAgICAgICAgIHwgIHRvIGhpbSwgdGhlCituZSAgICAgICAgICAgICB8ICBmcm9tIHRoZXJlIGV0YworaWwgICAgICAgICAgICAgfCAgdGhlCit1biAgICAgICAgICAgICB8ICBhCit1bm8gICAgICAgICAgICB8ICBhCit1bmEgICAgICAgICAgICB8ICBhCittYSAgICAgICAgICAgICB8ICBidXQKK2VkICAgICAgICAgICAgIHwgIGFuZAorc2UgICAgICAgICAgICAgfCAgaWYKK3BlcmNow6kgICAgICAgICB8ICB3aHksIGJlY2F1c2UKK2FuY2hlICAgICAgICAgIHwgIGFsc28KK2NvbWUgICAgICAgICAgIHwgIGhvdworZG92ICAgICAgICAgICAgfCAgd2hlcmUgKGFzIGRvdicpCitkb3ZlICAgICAgICAgICB8ICB3aGVyZQorY2hlICAgICAgICAgICAgfCAgd2hvLCB0aGF0CitjaGkgICAgICAgICAgICB8ICB3aG8KK2N1aSAgICAgICAgICAgIHwgIHdob20KK25vbiAgICAgICAgICAgIHwgIG5vdAorcGnDuSAgICAgICAgICAgIHwgIG1vcmUKK3F1YWxlICAgICAgICAgIHwgIHdobywgdGhhdAorcXVhbnRvICAgICAgICAgfCAgaG93IG11Y2gKK3F1YW50aSAgICAgICAgIHwKK3F1YW50YSAgICAgICAgIHwKK3F1YW50ZSAgICAgICAgIHwKK3F1ZWxsbyAgICAgICAgIHwgIHRoYXQKK3F1ZWxsaSAgICAgICAgIHwKK3F1ZWxsYSAgICAgICAgIHwKK3F1ZWxsZSAgICAgICAgIHwKK3F1ZXN0byAgICAgICAgIHwgIHRoaXMKK3F1ZXN0aSAgICAgICAgIHwKK3F1ZXN0YSAgICAgICAgIHwKK3F1ZXN0ZSAgICAgICAgIHwKK3NpICAgICAgICAgICAgIHwgIHllcwordHV0dG8gICAgICAgICAgfCAgYWxsCit0dXR0aSAgICAgICAgICB8ICBhbGwKKworICAgICAgICAgICAgICAgfCAgc2luZ2xlIGxldHRlciBmb3JtczoKKworYSAgICAgICAgICAgICAgfCAgYXQKK2MgICAgICAgICAgICAgIHwgIGFzIGMnIGZvciBjZSBvciBjaQorZSAgICAgICAgICAgICAgfCAgYW5kCitpICAgICAgICAgICAgICB8ICB0aGUKK2wgICAgICAgICAgICAgIHwgIGFzIGwnCitvICAgICAgICAgICAgICB8ICBvcgorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIGF2ZXJlLCB0byBoYXZlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKKworaG8KK2hhaQoraGEKK2FiYmlhbW8KK2F2ZXRlCitoYW5ubworYWJiaWEKK2FiYmlhdGUKK2FiYmlhbm8KK2F2csOyCithdnJhaQorYXZyw6AKK2F2cmVtbworYXZyZXRlCithdnJhbm5vCithdnJlaQorYXZyZXN0aQorYXZyZWJiZQorYXZyZW1tbworYXZyZXN0ZQorYXZyZWJiZXJvCithdmV2bworYXZldmkKK2F2ZXZhCithdmV2YW1vCithdmV2YXRlCithdmV2YW5vCitlYmJpCithdmVzdGkKK2ViYmUKK2F2ZW1tbworYXZlc3RlCitlYmJlcm8KK2F2ZXNzaQorYXZlc3NlCithdmVzc2ltbworYXZlc3Nlcm8KK2F2ZW5kbworYXZ1dG8KK2F2dXRhCithdnV0aQorYXZ1dGUKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3NlcmUsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3Nvbm8KK3NlaQorw6gKK3NpYW1vCitzaWV0ZQorc2lhCitzaWF0ZQorc2lhbm8KK3NhcsOyCitzYXJhaQorc2Fyw6AKK3NhcmVtbworc2FyZXRlCitzYXJhbm5vCitzYXJlaQorc2FyZXN0aQorc2FyZWJiZQorc2FyZW1tbworc2FyZXN0ZQorc2FyZWJiZXJvCitlcm8KK2VyaQorZXJhCitlcmF2YW1vCitlcmF2YXRlCitlcmFubworZnVpCitmb3N0aQorZnUKK2Z1bW1vCitmb3N0ZQorZnVyb25vCitmb3NzaQorZm9zc2UKK2Zvc3NpbW8KK2Zvc3Nlcm8KK2Vzc2VuZG8KKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBmYXJlLCB0byBkbyAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSwgZmEsIGZhdC0pOgorZmFjY2lvCitmYWkKK2ZhY2NpYW1vCitmYW5ubworZmFjY2lhCitmYWNjaWF0ZQorZmFjY2lhbm8KK2ZhcsOyCitmYXJhaQorZmFyw6AKK2ZhcmVtbworZmFyZXRlCitmYXJhbm5vCitmYXJlaQorZmFyZXN0aQorZmFyZWJiZQorZmFyZW1tbworZmFyZXN0ZQorZmFyZWJiZXJvCitmYWNldm8KK2ZhY2V2aQorZmFjZXZhCitmYWNldmFtbworZmFjZXZhdGUKK2ZhY2V2YW5vCitmZWNpCitmYWNlc3RpCitmZWNlCitmYWNlbW1vCitmYWNlc3RlCitmZWNlcm8KK2ZhY2Vzc2kKK2ZhY2Vzc2UKK2ZhY2Vzc2ltbworZmFjZXNzZXJvCitmYWNlbmRvCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2Ygc3RhcmUsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3N0bworc3RhaQorc3RhCitzdGlhbW8KK3N0YW5ubworc3RpYQorc3RpYXRlCitzdGlhbm8KK3N0YXLDsgorc3RhcmFpCitzdGFyw6AKK3N0YXJlbW8KK3N0YXJldGUKK3N0YXJhbm5vCitzdGFyZWkKK3N0YXJlc3RpCitzdGFyZWJiZQorc3RhcmVtbW8KK3N0YXJlc3RlCitzdGFyZWJiZXJvCitzdGF2bworc3RhdmkKK3N0YXZhCitzdGF2YW1vCitzdGF2YXRlCitzdGF2YW5vCitzdGV0dGkKK3N0ZXN0aQorc3RldHRlCitzdGVtbW8KK3N0ZXN0ZQorc3RldHRlcm8KK3N0ZXNzaQorc3Rlc3NlCitzdGVzc2ltbworc3Rlc3Nlcm8KK3N0YW5kbwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfamEudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfamEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19qYS50eHQKQEAgLTAsMCArMSwxMjcgQEAKKyMKKyMgVGhpcyBmaWxlIGRlZmluZXMgYSBzdG9wd29yZCBzZXQgZm9yIEphcGFuZXNlLgorIworIyBUaGlzIHNldCBpcyBtYWRlIHVwIG9mIGhhbmQtcGlja2VkIGZyZXF1ZW50IHRlcm1zIGZyb20gc2VnbWVudGVkIEphcGFuZXNlIFdpa2lwZWRpYS4KKyMgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhbmQgZnJlcXVlbnQga2FuamkgaGF2ZSBtb3N0bHkgYmVlbiBsZWZ0IG91dC4gIFNlZSBMVUNFTkUtMzc0NQorIyBmb3IgZnJlcXVlbmN5IGxpc3RzLCBldGMuIHRoYXQgY2FuIGJlIHVzZWZ1bCBmb3IgbWFraW5nIHlvdXIgb3duIHNldCAoaWYgZGVzaXJlZCkKKyMKKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGVzZSBzdG9wd29yZHMgYW5kIHRoZSB0ZXJtcyBzdG9wcGVkIHdoZW4gdXNlZAorIyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBKYXBhbmVzZVBhcnRPZlNwZWVjaFN0b3BGaWx0ZXIuICBXaGVuIGVkaXRpbmcgdGhpcyBmaWxlLCBub3RlCisjIHRoYXQgY29tbWVudHMgYXJlIG5vdCBhbGxvd2VkIG9uIHRoZSBzYW1lIGxpbmUgYXMgc3RvcHdvcmRzLgorIworIyBBbHNvIG5vdGUgdGhhdCBzdG9wcGluZyBpcyBkb25lIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuICBDaGFuZ2UgeW91ciBTdG9wRmlsdGVyCisjIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgY2FzZS1zZW5zaXRpdmUgc3RvcHBpbmcuICBMYXN0bHksIG5vdGUgdGhhdCBzdG9wcGluZyBpcyBkb25lCisjIHVzaW5nIHRoZSBzYW1lIGNoYXJhY3RlciB3aWR0aCBhcyB0aGUgZW50cmllcyBpbiB0aGlzIGZpbGUuICBTaW5jZSB0aGlzIFN0b3BGaWx0ZXIgaXMKKyMgbm9ybWFsbHkgZG9uZSBhZnRlciBhIENKS1dpZHRoRmlsdGVyIGluIHlvdXIgY2hhaW4sIHlvdSB3b3VsZCB1c3VhbGx5IHdhbnQgeW91ciByb21hamkKKyMgZW50cmllcyB0byBiZSBpbiBoYWxmLXdpZHRoIGFuZCB5b3VyIGthbmEgZW50cmllcyB0byBiZSBpbiBmdWxsLXdpZHRoLgorIwor44GuCivjgasKK+OBrwor44KSCivjgZ8KK+OBjAor44GnCivjgaYKK+OBqAor44GXCivjgowKK+OBlQor44GC44KLCivjgYTjgosKK+OCggor44GZ44KLCivjgYvjgokKK+OBqgor44GT44GoCivjgajjgZfjgaYKK+OBhAor44KECivjgozjgosKK+OBquOBqQor44Gq44GjCivjgarjgYQKK+OBk+OBrgor44Gf44KBCivjgZ3jga4KK+OBguOBowor44KI44GGCivjgb7jgZ8KK+OCguOBrgor44Go44GE44GGCivjgYLjgooKK+OBvuOBpwor44KJ44KMCivjgarjgosKK+OBuAor44GLCivjgaAKK+OBk+OCjAor44Gr44KI44Gj44GmCivjgavjgojjgooKK+OBiuOCigor44KI44KKCivjgavjgojjgosKK+OBmgor44Gq44KKCivjgonjgozjgosKK+OBq+OBiuOBhOOBpgor44GwCivjgarjgYvjgaMKK+OBquOBjwor44GX44GL44GXCivjgavjgaTjgYTjgaYKK+OBmwor44Gg44GjCivjgZ3jga7lvowKK+OBp+OBjeOCiwor44Gd44KMCivjgYYKK+OBruOBpwor44Gq44GKCivjga7jgb8KK+OBp+OBjQor44GNCivjgaQKK+OBq+OBiuOBkeOCiwor44GK44KI44GzCivjgYTjgYYKK+OBleOCieOBqwor44Gn44KCCivjgokKK+OBn+OCigor44Gd44Gu5LuWCivjgavplqLjgZnjgosKK+OBn+OBoQor44G+44GZCivjgpMKK+OBquOCiQor44Gr5a++44GX44GmCivnibnjgasKK+OBm+OCiwor5Y+K44GzCivjgZPjgozjgokKK+OBqOOBjQor44Gn44GvCivjgavjgaYKK+OBu+OBiwor44Gq44GM44KJCivjgYbjgaEKK+OBneOBl+OBpgor44Go44Go44KC44GrCivjgZ/jgaDjgZcKK+OBi+OBpOOBpgor44Gd44KM44Ge44KMCivjgb7jgZ/jga8KK+OBigor44G744GpCivjgoLjga7jga4KK+OBq+WvvuOBmeOCiwor44G744Go44KT44GpCivjgajlhbHjgasKK+OBqOOBhOOBo+OBnwor44Gn44GZCivjgajjgoIKK+OBqOOBk+OCjQor44GT44GTCisjIyMjIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19sdi50eHQKQEAgLTAsMCArMSwxNzIgQEAKKyMgU2V0IG9mIExhdHZpYW4gc3RvcHdvcmRzIGZyb20gQSBTdGVtbWluZyBBbGdvcml0aG0gZm9yIExhdHZpYW4sIEthcmxpcyBLcmVzbGlucworIyB0aGUgb3JpZ2luYWwgbGlzdCBvZiBvdmVyIDgwMCBmb3JtcyB3YXMgcmVmaW5lZDogCisjICAgcHJvbm91bnMsIGFkdmVyYnMsIGludGVyamVjdGlvbnMgd2VyZSByZW1vdmVkCisjIAorIyBwcmVwb3NpdGlvbnMKK2FpegorYXAKK2FyCithcGFrxaEKK8SBcnB1cworYXVnxaFwdXMKK2JlegorY2F1cgorZMSTxLwKK2dhcgoraWVrxaEKK2l6Citrb3DFoQorbGFiYWQKK2xlanB1cworbMSrZHoKK25vCitvdHJwdXMKK3BhCitwYXIKK3DEgXIKK3DEk2MKK3BpZQorcGlybXMKK3ByZXQKK3ByaWVrxaEKK3N0YXJwCivFoWFpcHVzCit1egordmnFhnB1cwordmlycwordmlyc3B1cworemVtCithcGFrxaFwdXMKKyMgQ29uanVuY3Rpb25zCit1bgorYmV0CitqbworamEKK2thCitsYWkKK3RvbcSTcgordGlra28KK3R1cnByZXTEqworYXLEqwora2F1dAorZ2FuCit0xIFkxJPEvAordMSBCituZQordGlrdmllbgordmllbgora8SBCitpcgordGUKK3ZhaQora2FtxJNyCisjIFBhcnRpY2xlcworYXIKK2RpZXppbgorZHJvxaFpCitkaWVtxb7Ek2wKK25lYsWrdAoraWsKK2l0Cit0YcSNdQorbnUKK3BhdAordGlrbGFiCitpZWvFoXB1cworbmVkegordGlrCituZXZpcwordHVycHJldGltCitqZWIKK2lla2FtCitpZWvEgW0KK2lla8SBbXMKK2tvbMSrZHoKK2zEq2R6a28KK3Rpa2zEq2R6CitqZWLFoXUKK3TEgWxhYgordMSBcMSTYworbmVrxIEKK2l0aW4KK2rEgQoramF1CitqZWwKK27EkworbmV6aW4KK3RhZAordGlrYWkKK3ZpcwordGFrCitpZWthbXMKK3ZpZW4KKyMgbW9kYWwgdmVyYnMKK2LFq3QgIAorYmlqdSAKK2JpamkKK2JpamEKK2JpasSBbQorYmlqxIF0Citlc211Citlc2kKK2VzYW0KK2VzYXQgCitixavFoXUgICAgIAorYsWrc2kKK2LFq3MKK2LFq3NpbQorYsWrc2lldAordGlrdAordGlrdQordGlraQordGlrYQordGlrxIFtCit0aWvEgXQKK3RpZWt1Cit0aWVjCit0aWVrCit0aWVrYW0KK3RpZWthdAordGlrxaF1Cit0aWtzCit0aWtzaW0KK3Rpa3NpZXQKK3RhcHQKK3RhcGkKK3RhcMSBdAordG9wYXQKK3RhcMWhdQordGFwc2kKK3RhcHMKK3RhcHNpbQordGFwc2lldAora8S8xat0CitrxLx1dnUKK2vEvHV2aQora8S8dXZhCitrxLx1dsSBbQora8S8dXbEgXQKK2vEvMWrc3R1CitrxLzFq3N0aQora8S8xatzdAora8S8xatzdGFtCitrxLzFq3N0YXQKK2vEvMWrxaF1CitrxLzFq3NpCitrxLzFq3MKK2vEvMWrc2ltCitrxLzFq3NpZXQKKyMgdmVyYnMKK3ZhcsSTdAordmFyxJNqdQordmFyxJNqxIFtCit2YXLEk8WhdQordmFyxJNzaW0KK3ZhcgordmFyxJNqaQordmFyxJNqxIF0Cit2YXLEk3NpCit2YXLEk3NpZXQKK3ZhcmF0Cit2YXLEk2phCit2YXLEk3MKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX25sLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX25sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ2MWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfbmwudHh0CkBAIC0wLDAgKzEsMTE3IEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2R1dGNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKworIHwgQSBEdXRjaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCBUaGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2Ugc2FtcGxlIG9mIER1dGNoIHRleHQuCisKKyB8IER1dGNoIHN0b3Agd29yZHMgZnJlcXVlbnRseSBleGhpYml0IGhvbW9ueW0gY2xhc2hlcy4gVGhlc2UgYXJlIGluZGljYXRlZAorIHwgY2xlYXJseSBiZWxvdy4KKworZGUgICAgICAgICAgICAgfCAgdGhlCitlbiAgICAgICAgICAgICB8ICBhbmQKK3ZhbiAgICAgICAgICAgIHwgIG9mLCBmcm9tCitpayAgICAgICAgICAgICB8ICBJLCB0aGUgZWdvCit0ZSAgICAgICAgICAgICB8ICAoMSkgY2hleiwgYXQgZXRjLCAoMikgdG8sICgzKSB0b28KK2RhdCAgICAgICAgICAgIHwgIHRoYXQsIHdoaWNoCitkaWUgICAgICAgICAgICB8ICB0aGF0LCB0aG9zZSwgd2hvLCB3aGljaAoraW4gICAgICAgICAgICAgfCAgaW4sIGluc2lkZQorZWVuICAgICAgICAgICAgfCAgYSwgYW4sIG9uZQoraGlqICAgICAgICAgICAgfCAgaGUKK2hldCAgICAgICAgICAgIHwgIHRoZSwgaXQKK25pZXQgICAgICAgICAgIHwgIG5vdCwgbm90aGluZywgbmF1Z2h0Cit6aWpuICAgICAgICAgICB8ICAoMSkgdG8gYmUsIGJlaW5nLCAoMikgaGlzLCBvbmUncywgaXRzCitpcyAgICAgICAgICAgICB8ICBpcword2FzICAgICAgICAgICAgfCAgKDEpIHdhcywgcGFzdCB0ZW5zZSBvZiBhbGwgcGVyc29ucyBzaW5nLiBvZiAnemlqbicgKHRvIGJlKSAoMikgd2F4LCAoMykgdGhlIHdhc2hpbmcsICg0KSByaXNlIG9mIHJpdmVyCitvcCAgICAgICAgICAgICB8ICBvbiwgdXBvbiwgYXQsIGluLCB1cCwgdXNlZCB1cAorYWFuICAgICAgICAgICAgfCAgb24sIHVwb24sIHRvIChhcyBkYXRpdmUpCittZXQgICAgICAgICAgICB8ICB3aXRoLCBieQorYWxzICAgICAgICAgICAgfCAgbGlrZSwgc3VjaCBhcywgd2hlbgordm9vciAgICAgICAgICAgfCAgKDEpIGJlZm9yZSwgaW4gZnJvbnQgb2YsICgyKSBmdXJyb3cKK2hhZCAgICAgICAgICAgIHwgIGhhZCwgcGFzdCB0ZW5zZSBhbGwgcGVyc29ucyBzaW5nLiBvZiAnaGViYmVuJyAoaGF2ZSkKK2VyICAgICAgICAgICAgIHwgIHRoZXJlCittYWFyICAgICAgICAgICB8ICBidXQsIG9ubHkKK29tICAgICAgICAgICAgIHwgIHJvdW5kLCBhYm91dCwgZm9yIGV0YworaGVtICAgICAgICAgICAgfCAgaGltCitkYW4gICAgICAgICAgICB8ICB0aGVuCit6b3UgICAgICAgICAgICB8ICBzaG91bGQvd291bGQsIHBhc3QgdGVuc2UgYWxsIHBlcnNvbnMgc2luZy4gb2YgJ3p1bGxlbicKK29mICAgICAgICAgICAgIHwgIG9yLCB3aGV0aGVyLCBpZgord2F0ICAgICAgICAgICAgfCAgd2hhdCwgc29tZXRoaW5nLCBhbnl0aGluZworbWlqbiAgICAgICAgICAgfCAgcG9zc2Vzc2l2ZSBhbmQgbm91biAnbWluZScKK21lbiAgICAgICAgICAgIHwgIHBlb3BsZSwgJ29uZScKK2RpdCAgICAgICAgICAgIHwgIHRoaXMKK3pvICAgICAgICAgICAgIHwgIHNvLCB0aHVzLCBpbiB0aGlzIHdheQorZG9vciAgICAgICAgICAgfCAgdGhyb3VnaCBieQorb3ZlciAgICAgICAgICAgfCAgb3ZlciwgYWNyb3NzCit6ZSAgICAgICAgICAgICB8ICBzaGUsIGhlciwgdGhleSwgdGhlbQoremljaCAgICAgICAgICAgfCAgb25lc2VsZgorYmlqICAgICAgICAgICAgfCAgKDEpIGEgYmVlLCAoMikgYnksIG5lYXIsIGF0Citvb2sgICAgICAgICAgICB8ICBhbHNvLCB0b28KK3RvdCAgICAgICAgICAgIHwgIHRpbGwsIHVudGlsCitqZSAgICAgICAgICAgICB8ICB5b3UKK21paiAgICAgICAgICAgIHwgIG1lCit1aXQgICAgICAgICAgICB8ICBvdXQgb2YsIGZyb20KK2RlciAgICAgICAgICAgIHwgIE9sZCBEdXRjaCBmb3JtIG9mICd2YW4gZGVyJyBzdGlsbCBmb3VuZCBpbiBzdXJuYW1lcworZGFhciAgICAgICAgICAgfCAgKDEpIHRoZXJlLCAoMikgYmVjYXVzZQoraGFhciAgICAgICAgICAgfCAgKDEpIGhlciwgdGhlaXIsIHRoZW0sICgyKSBoYWlyCituYWFyICAgICAgICAgICB8ICAoMSkgdW5wbGVhc2FudCwgdW53ZWxsIGV0YywgKDIpIHRvd2FyZHMsICgzKSBhcworaGViICAgICAgICAgICAgfCAgcHJlc2VudCBmaXJzdCBwZXJzb24gc2luZy4gb2YgJ3RvIGhhdmUnCitob2UgICAgICAgICAgICB8ICBob3csIHdoeQoraGVlZnQgICAgICAgICAgfCAgcHJlc2VudCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ3RvIGhhdmUnCitoZWJiZW4gICAgICAgICB8ICAndG8gaGF2ZScgYW5kIHZhcmlvdXMgcGFydHMgdGhlcmVvZgorZGV6ZSAgICAgICAgICAgfCAgdGhpcwordSAgICAgICAgICAgICAgfCAgeW91Cit3YW50ICAgICAgICAgICB8ICAoMSkgZm9yLCAoMikgbWl0dGVuLCAoMykgcmlnZ2luZworbm9nICAgICAgICAgICAgfCAgeWV0LCBzdGlsbAoremFsICAgICAgICAgICAgfCAgJ3NoYWxsJywgZmlyc3QgYW5kIHRoaXJkIHBlcnNvbiBzaW5nLiBvZiB2ZXJiICd6dWxsZW4nICh3aWxsKQorbWUgICAgICAgICAgICAgfCAgbWUKK3ppaiAgICAgICAgICAgIHwgIHNoZSwgdGhleQorbnUgICAgICAgICAgICAgfCAgbm93CitnZSAgICAgICAgICAgICB8ICAndGhvdScsIHN0aWxsIHVzZWQgaW4gQmVsZ2l1bSBhbmQgc291dGggTmV0aGVybGFuZHMKK2dlZW4gICAgICAgICAgIHwgIG5vbmUKK29tZGF0ICAgICAgICAgIHwgIGJlY2F1c2UKK2lldHMgICAgICAgICAgIHwgIHNvbWV0aGluZywgc29tZXdoYXQKK3dvcmRlbiAgICAgICAgIHwgIHRvIGJlY29tZSwgZ3JvdywgZ2V0Cit0b2NoICAgICAgICAgICB8ICB5ZXQsIHN0aWxsCithbCAgICAgICAgICAgICB8ICBhbGwsIGV2ZXJ5LCBlYWNoCit3YXJlbiAgICAgICAgICB8ICAoMSkgJ3dlcmUnICgyKSB0byB3YW5kZXIsICgzKSB3YXJlcywgKDMpCit2ZWVsICAgICAgICAgICB8ICBtdWNoLCBtYW55CittZWVyICAgICAgICAgICB8ICAoMSkgbW9yZSwgKDIpIGxha2UKK2RvZW4gICAgICAgICAgIHwgIHRvIGRvLCB0byBtYWtlCit0b2VuICAgICAgICAgICB8ICB0aGVuLCB3aGVuCittb2V0ICAgICAgICAgICB8ICBub3VuICdzcG90L21vdGUnIGFuZCBwcmVzZW50IGZvcm0gb2YgJ3RvIG11c3QnCitiZW4gICAgICAgICAgICB8ICAoMSkgYW0sICgyKSAnYXJlJyBpbiBpbnRlcnJvZ2F0aXZlIHNlY29uZCBwZXJzb24gc2luZ3VsYXIgb2YgJ3RvIGJlJworem9uZGVyICAgICAgICAgfCAgd2l0aG91dAora2FuICAgICAgICAgICAgfCAgbm91biAnY2FuJyBhbmQgcHJlc2VudCBmb3JtIG9mICd0byBiZSBhYmxlJworaHVuICAgICAgICAgICAgfCAgdGhlaXIsIHRoZW0KK2R1cyAgICAgICAgICAgIHwgIHNvLCBjb25zZXF1ZW50bHkKK2FsbGVzICAgICAgICAgIHwgIGFsbCwgZXZlcnl0aGluZywgYW55dGhpbmcKK29uZGVyICAgICAgICAgIHwgIHVuZGVyLCBiZW5lYXRoCitqYSAgICAgICAgICAgICB8ICB5ZXMsIG9mIGNvdXJzZQorZWVucyAgICAgICAgICAgfCAgb25jZSwgb25lIGRheQoraGllciAgICAgICAgICAgfCAgaGVyZQord2llICAgICAgICAgICAgfCAgd2hvCit3ZXJkICAgICAgICAgICB8ICBpbXBlcmZlY3QgdGhpcmQgcGVyc29uIHNpbmcuIG9mICdiZWNvbWUnCithbHRpamQgICAgICAgICB8ICBhbHdheXMKK2RvY2ggICAgICAgICAgIHwgIHlldCwgYnV0IGV0Yword29yZHQgICAgICAgICAgfCAgcHJlc2VudCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ2JlY29tZScKK3dlemVuICAgICAgICAgIHwgICgxKSB0byBiZSwgKDIpICdiZWVuJyBhcyBpbiAnYmVlbiBmaXNoaW5nJywgKDMpIG9ycGhhbnMKK2t1bm5lbiAgICAgICAgIHwgIHRvIGJlIGFibGUKK29ucyAgICAgICAgICAgIHwgIHVzL291cgoremVsZiAgICAgICAgICAgfCAgc2VsZgordGVnZW4gICAgICAgICAgfCAgYWdhaW5zdCwgdG93YXJkcywgYXQKK25hICAgICAgICAgICAgIHwgIGFmdGVyLCBuZWFyCityZWVkcyAgICAgICAgICB8ICBhbHJlYWR5Cit3aWwgICAgICAgICAgICB8ICAoMSkgcHJlc2VudCB0ZW5zZSBvZiAnd2FudCcsICgyKSAnd2lsbCcsIG5vdW4sICgzKSBmZW5kZXIKK2tvbiAgICAgICAgICAgIHwgIGNvdWxkOyBwYXN0IHRlbnNlIG9mICd0byBiZSBhYmxlJworbmlldHMgICAgICAgICAgfCAgbm90aGluZwordXcgICAgICAgICAgICAgfCAgeW91cgoraWVtYW5kICAgICAgICAgfCAgc29tZWJvZHkKK2dld2Vlc3QgICAgICAgIHwgIGJlZW47IHBhc3QgcGFydGljaXBsZSBvZiAnYmUnCithbmRlcmUgICAgICAgICB8ICBvdGhlcgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmYzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19uby50eHQKQEAgLTAsMCArMSwxOTIgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvbm9yd2VnaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKworIHwgQSBOb3J3ZWdpYW4gc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworIHwgVGhpcyBzdG9wIHdvcmQgbGlzdCBpcyBmb3IgdGhlIGRvbWluYW50IGJva23DpWwgZGlhbGVjdC4gV29yZHMgdW5pcXVlCisgfCB0byBueW5vcnNrIGFyZSBtYXJrZWQgKi4KKworIHwgUmV2aXNlZCBieSBKYW4gQnJ1dXNnYWFyZCA8SmFuLkJydXVzZ2FhcmRAc3NiLm5vPiwgSmFuIDIwMDUKKworb2cgICAgICAgICAgICAgfCBhbmQKK2kgICAgICAgICAgICAgIHwgaW4KK2plZyAgICAgICAgICAgIHwgSQorZGV0ICAgICAgICAgICAgfCBpdC90aGlzL3RoYXQKK2F0ICAgICAgICAgICAgIHwgdG8gKHcuIGluZi4pCitlbiAgICAgICAgICAgICB8IGEvYW4KK2V0ICAgICAgICAgICAgIHwgYS9hbgorZGVuICAgICAgICAgICAgfCBpdC90aGlzL3RoYXQKK3RpbCAgICAgICAgICAgIHwgdG8KK2VyICAgICAgICAgICAgIHwgaXMvYW0vYXJlCitzb20gICAgICAgICAgICB8IHdoby90aGF0Citww6UgICAgICAgICAgICAgfCBvbgorZGUgICAgICAgICAgICAgfCB0aGV5IC8geW91KGZvcm1hbCkKK21lZCAgICAgICAgICAgIHwgd2l0aAoraGFuICAgICAgICAgICAgfCBoZQorYXYgICAgICAgICAgICAgfCBvZgoraWtrZSAgICAgICAgICAgfCBub3QKK2lra2plICAgICAgICAgIHwgbm90ICoKK2RlciAgICAgICAgICAgIHwgdGhlcmUKK3PDpSAgICAgICAgICAgICB8IHNvCit2YXIgICAgICAgICAgICB8IHdhcy93ZXJlCittZWcgICAgICAgICAgICB8IG1lCitzZWcgICAgICAgICAgICB8IHlvdQorbWVuICAgICAgICAgICAgfCBidXQKK2V0dCAgICAgICAgICAgIHwgb25lCitoYXIgICAgICAgICAgICB8IGhhdmUKK29tICAgICAgICAgICAgIHwgYWJvdXQKK3ZpICAgICAgICAgICAgIHwgd2UKK21pbiAgICAgICAgICAgIHwgbXkKK21pdHQgICAgICAgICAgIHwgbXkKK2hhICAgICAgICAgICAgIHwgaGF2ZQoraGFkZGUgICAgICAgICAgfCBoYWQKK2h1biAgICAgICAgICAgIHwgc2hlCituw6UgICAgICAgICAgICAgfCBub3cKK292ZXIgICAgICAgICAgIHwgb3ZlcgorZGEgICAgICAgICAgICAgfCB3aGVuL2FzCit2ZWQgICAgICAgICAgICB8IGJ5L2tub3cKK2ZyYSAgICAgICAgICAgIHwgZnJvbQorZHUgICAgICAgICAgICAgfCB5b3UKK3V0ICAgICAgICAgICAgIHwgb3V0CitzaW4gICAgICAgICAgICB8IHlvdXIKK2RlbSAgICAgICAgICAgIHwgdGhlbQorb3NzICAgICAgICAgICAgfCB1cworb3BwICAgICAgICAgICAgfCB1cAorbWFuICAgICAgICAgICAgfCB5b3Uvb25lCitrYW4gICAgICAgICAgICB8IGNhbgoraGFucyAgICAgICAgICAgfCBoaXMKK2h2b3IgICAgICAgICAgIHwgd2hlcmUKK2VsbGVyICAgICAgICAgIHwgb3IKK2h2YSAgICAgICAgICAgIHwgd2hhdAorc2thbCAgICAgICAgICAgfCBzaGFsbC9tdXN0CitzZWx2ICAgICAgICAgICB8IHNlbGYgKHJlZmxlY3RpdmUpCitzasO4bCAgICAgICAgICAgfCBzZWxmIChyZWZsZWN0aXZlKQoraGVyICAgICAgICAgICAgfCBoZXJlCithbGxlICAgICAgICAgICB8IGFsbAordmlsICAgICAgICAgICAgfCB3aWxsCitibGkgICAgICAgICAgICB8IGJlY29tZQorYmxlICAgICAgICAgICAgfCBiZWNhbWUKK2JsZWkgICAgICAgICAgIHwgYmVjYW1lICoKK2JsaXR0ICAgICAgICAgIHwgaGF2ZSBiZWNvbWUKK2t1bm5lICAgICAgICAgIHwgY291bGQKK2lubiAgICAgICAgICAgIHwgaW4KK27DpXIgICAgICAgICAgICB8IHdoZW4KK3bDpnJlICAgICAgICAgICB8IGJlCitrb20gICAgICAgICAgICB8IGNvbWUKK25vZW4gICAgICAgICAgIHwgc29tZQorbm9lICAgICAgICAgICAgfCBzb21lCit2aWxsZSAgICAgICAgICB8IHdvdWxkCitkZXJlICAgICAgICAgICB8IHlvdQorc29tICAgICAgICAgICAgfCB3aG8vd2hpY2gvdGhhdAorZGVyZXMgICAgICAgICAgfCB0aGVpci90aGVpcnMKK2t1biAgICAgICAgICAgIHwgb25seS9qdXN0CitqYSAgICAgICAgICAgICB8IHllcworZXR0ZXIgICAgICAgICAgfCBhZnRlcgorbmVkICAgICAgICAgICAgfCBkb3duCitza3VsbGUgICAgICAgICB8IHNob3VsZAorZGVubmUgICAgICAgICAgfCB0aGlzCitmb3IgICAgICAgICAgICB8IGZvci9iZWNhdXNlCitkZWcgICAgICAgICAgICB8IHlvdQorc2kgICAgICAgICAgICAgfCBoZXJzL2hpcworc2luZSAgICAgICAgICAgfCBoZXJzL2hpcworc2l0dCAgICAgICAgICAgfCBoZXJzL2hpcworbW90ICAgICAgICAgICAgfCBhZ2FpbnN0CivDpSAgICAgICAgICAgICAgfCB0bworbWVnZXQgICAgICAgICAgfCBtdWNoCitodm9yZm9yICAgICAgICB8IHdoeQorZGV0dGUgICAgICAgICAgfCB0aGlzCitkaXNzZSAgICAgICAgICB8IHRoZXNlL3Rob3NlCit1dGVuICAgICAgICAgICB8IHdpdGhvdXQKK2h2b3JkYW4gICAgICAgIHwgaG93CitpbmdlbiAgICAgICAgICB8IG5vbmUKK2RpbiAgICAgICAgICAgIHwgeW91cgorZGl0dCAgICAgICAgICAgfCB5b3VyCitibGlyICAgICAgICAgICB8IGJlY29tZQorc2FtbWUgICAgICAgICAgfCBzYW1lCitodmlsa2VuICAgICAgICB8IHdoaWNoCitodmlsa2UgICAgICAgICB8IHdoaWNoIChwbHVyYWwpCitzw6VubiAgICAgICAgICAgfCBzdWNoIGEKK2lubmkgICAgICAgICAgIHwgaW5zaWRlL3dpdGhpbgorbWVsbG9tICAgICAgICAgfCBiZXR3ZWVuCit2w6VyICAgICAgICAgICAgfCBvdXIKK2h2ZXIgICAgICAgICAgIHwgZWFjaAoraHZlbSAgICAgICAgICAgfCB3aG8KK3ZvcnMgICAgICAgICAgIHwgdXMvb3VycworaHZpcyAgICAgICAgICAgfCB3aG9zZQorYsOlZGUgICAgICAgICAgIHwgYm90aAorYmFyZSAgICAgICAgICAgfCBvbmx5L2p1c3QKK2VubiAgICAgICAgICAgIHwgdGhhbgorZm9yZGkgICAgICAgICAgfCBhcy9iZWNhdXNlCitmw7hyICAgICAgICAgICAgfCBiZWZvcmUKK21hbmdlICAgICAgICAgIHwgbWFueQorb2dzw6UgICAgICAgICAgIHwgYWxzbworc2xpayAgICAgICAgICAgfCBqdXN0Cit2w6ZydCAgICAgICAgICAgfCBiZWVuCit2w6ZyZSAgICAgICAgICAgfCB0byBiZQorYsOlZSAgICAgICAgICAgIHwgYm90aCAqCitiZWdnZSAgICAgICAgICB8IGJvdGgKK3NpZGVuICAgICAgICAgIHwgc2luY2UKK2R5a2sgICAgICAgICAgIHwgeW91ciAqCitkeWtrYXIgICAgICAgICB8IHlvdXJzICoKK2RlaSAgICAgICAgICAgIHwgdGhleSAqCitkZWlyYSAgICAgICAgICB8IHRoZW0gKgorZGVpcmVzICAgICAgICAgfCB0aGVpcnMgKgorZGVpbSAgICAgICAgICAgfCB0aGVtICoKK2RpICAgICAgICAgICAgIHwgeW91ciAoZmVtLikgKgorZMOlICAgICAgICAgICAgIHwgYXMvd2hlbiAqCitlZyAgICAgICAgICAgICB8IEkgKgorZWluICAgICAgICAgICAgfCBhL2FuICoKK2VpdCAgICAgICAgICAgIHwgYS9hbiAqCitlaXR0ICAgICAgICAgICB8IGEvYW4gKgorZWxsZXMgICAgICAgICAgfCBvciAqCitob25vbSAgICAgICAgICB8IGhlICoKK2hqw6UgICAgICAgICAgICB8IGF0ICoKK2hvICAgICAgICAgICAgIHwgc2hlICoKK2hvZSAgICAgICAgICAgIHwgc2hlICoKK2hlbm5lICAgICAgICAgIHwgaGVyCitoZW5uYXIgICAgICAgICB8IGhlci9oZXJzCitoZW5uZXMgICAgICAgICB8IGhlcnMKK2hvc3MgICAgICAgICAgIHwgaG93ICoKK2hvc3NlbiAgICAgICAgIHwgaG93ICoKK2lra2plICAgICAgICAgIHwgbm90ICoKK2luZ2kgICAgICAgICAgIHwgbm9vbmUgKgoraW5ramUgICAgICAgICAgfCBub29uZSAqCitrb3JsZWlzICAgICAgICB8IGhvdyAqCitrb3JzbyAgICAgICAgICB8IGhvdyAqCitrdmEgICAgICAgICAgICB8IHdoYXQvd2hpY2ggKgora3ZhciAgICAgICAgICAgfCB3aGVyZSAqCitrdmFyaGVsc3QgICAgICB8IHdoZXJlICoKK2t2ZW4gICAgICAgICAgIHwgd2hvL3dob20gKgora3ZpICAgICAgICAgICAgfCB3aHkgKgora3ZpZm9yICAgICAgICAgfCB3aHkgKgorbWUgICAgICAgICAgICAgfCB3ZSAqCittZWRhbiAgICAgICAgICB8IHdoaWxlICoKK21pICAgICAgICAgICAgIHwgbXkgKgorbWluZSAgICAgICAgICAgfCBteSAqCitteWtqZSAgICAgICAgICB8IG11Y2ggKgorbm8gICAgICAgICAgICAgfCBub3cgKgorbm9rb24gICAgICAgICAgfCBzb21lIChtYXNjLi9uZXV0LikgKgorbm9rYSAgICAgICAgICAgfCBzb21lIChmZW0uKSAqCitub2tvciAgICAgICAgICB8IHNvbWUgKgorbm9rbyAgICAgICAgICAgfCBzb21lICoKK25va3JlICAgICAgICAgIHwgc29tZSAqCitzaSAgICAgICAgICAgICB8IGhpcy9oZXJzICoKK3NpYSAgICAgICAgICAgIHwgc2luY2UgKgorc2lkYW4gICAgICAgICAgfCBzaW5jZSAqCitzbyAgICAgICAgICAgICB8IHNvICoKK3NvbXQgICAgICAgICAgIHwgc29tZSAqCitzb21tZSAgICAgICAgICB8IHNvbWUgKgordW0gICAgICAgICAgICAgfCBhYm91dCoKK3VwcCAgICAgICAgICAgIHwgdXAgKgordmVyZSAgICAgICAgICAgfCBiZSAqCit2b3JlICAgICAgICAgICB8IHdhcyAqCit2ZXJ0ZSAgICAgICAgICB8IGJlY29tZSAqCit2b3J0ICAgICAgICAgICB8IGJlY29tZSAqCit2YXJ0ZSAgICAgICAgICB8IGJlY2FtZSAqCit2YXJ0ICAgICAgICAgICB8IGJlY2FtZSAqCisKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZjMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfcHQudHh0CkBAIC0wLDAgKzEsMjUxIEBACisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL3BvcnR1Z3Vlc2Uvc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorCisgfCBBIFBvcnR1Z3Vlc2Ugc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworCisgfCBUaGUgZm9sbG93aW5nIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcworIHwgZGVyaXZpbmcgZnJvbSBhIGxhcmdlIHNhbXBsZSBvZiB0ZXh0LgorCisgfCBFeHRyYSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIGVuZC4KKworZGUgICAgICAgICAgICAgfCAgb2YsIGZyb20KK2EgICAgICAgICAgICAgIHwgIHRoZTsgdG8sIGF0OyBoZXIKK28gICAgICAgICAgICAgIHwgIHRoZTsgaGltCitxdWUgICAgICAgICAgICB8ICB3aG8sIHRoYXQKK2UgICAgICAgICAgICAgIHwgIGFuZAorZG8gICAgICAgICAgICAgfCAgZGUgKyBvCitkYSAgICAgICAgICAgICB8ICBkZSArIGEKK2VtICAgICAgICAgICAgIHwgIGluCit1bSAgICAgICAgICAgICB8ICBhCitwYXJhICAgICAgICAgICB8ICBmb3IKKyAgfCDDqSAgICAgICAgICBmcm9tIFNFUgorY29tICAgICAgICAgICAgfCAgd2l0aAorbsOjbyAgICAgICAgICAgIHwgIG5vdCwgbm8KK3VtYSAgICAgICAgICAgIHwgIGEKK29zICAgICAgICAgICAgIHwgIHRoZTsgdGhlbQorbm8gICAgICAgICAgICAgfCAgZW0gKyBvCitzZSAgICAgICAgICAgICB8ICBoaW1zZWxmIGV0YworbmEgICAgICAgICAgICAgfCAgZW0gKyBhCitwb3IgICAgICAgICAgICB8ICBmb3IKK21haXMgICAgICAgICAgIHwgIG1vcmUKK2FzICAgICAgICAgICAgIHwgIHRoZTsgdGhlbQorZG9zICAgICAgICAgICAgfCAgZGUgKyBvcworY29tbyAgICAgICAgICAgfCAgYXMsIGxpa2UKK21hcyAgICAgICAgICAgIHwgIGJ1dAorICB8IGZvaSAgICAgICAgZnJvbSBTRVIKK2FvICAgICAgICAgICAgIHwgIGEgKyBvCitlbGUgICAgICAgICAgICB8ICBoZQorZGFzICAgICAgICAgICAgfCAgZGUgKyBhcworICB8IHRlbSAgICAgICAgZnJvbSBURVIKK8OgICAgICAgICAgICAgICB8ICBhICsgYQorc2V1ICAgICAgICAgICAgfCAgaGlzCitzdWEgICAgICAgICAgICB8ICBoZXIKK291ICAgICAgICAgICAgIHwgIG9yCisgIHwgc2VyICAgICAgICBmcm9tIFNFUgorcXVhbmRvICAgICAgICAgfCAgd2hlbgorbXVpdG8gICAgICAgICAgfCAgbXVjaAorICB8IGjDoSAgICAgICAgIGZyb20gSEFWCitub3MgICAgICAgICAgICB8ICBlbSArIG9zOyB1cworasOhICAgICAgICAgICAgIHwgIGFscmVhZHksIG5vdworICB8IGVzdMOhICAgICAgIGZyb20gRVNUCitldSAgICAgICAgICAgICB8ICBJCit0YW1iw6ltICAgICAgICAgfCAgYWxzbworc8OzICAgICAgICAgICAgIHwgIG9ubHksIGp1c3QKK3BlbG8gICAgICAgICAgIHwgIHBlciArIG8KK3BlbGEgICAgICAgICAgIHwgIHBlciArIGEKK2F0w6kgICAgICAgICAgICB8ICB1cCB0bworaXNzbyAgICAgICAgICAgfCAgdGhhdAorZWxhICAgICAgICAgICAgfCAgaGUKK2VudHJlICAgICAgICAgIHwgIGJldHdlZW4KKyAgfCBlcmEgICAgICAgIGZyb20gU0VSCitkZXBvaXMgICAgICAgICB8ICBhZnRlcgorc2VtICAgICAgICAgICAgfCAgd2l0aG91dAorbWVzbW8gICAgICAgICAgfCAgc2FtZQorYW9zICAgICAgICAgICAgfCAgYSArIG9zCisgIHwgdGVyICAgICAgICBmcm9tIFRFUgorc2V1cyAgICAgICAgICAgfCAgaGlzCitxdWVtICAgICAgICAgICB8ICB3aG9tCituYXMgICAgICAgICAgICB8ICBlbSArIGFzCittZSAgICAgICAgICAgICB8ICBtZQorZXNzZSAgICAgICAgICAgfCAgdGhhdAorZWxlcyAgICAgICAgICAgfCAgdGhleQorICB8IGVzdMOjbyAgICAgIGZyb20gRVNUCit2b2PDqiAgICAgICAgICAgfCAgeW91CisgIHwgdGluaGEgICAgICBmcm9tIFRFUgorICB8IGZvcmFtICAgICAgZnJvbSBTRVIKK2Vzc2EgICAgICAgICAgIHwgIHRoYXQKK251bSAgICAgICAgICAgIHwgIGVtICsgdW0KK25lbSAgICAgICAgICAgIHwgIG5vcgorc3VhcyAgICAgICAgICAgfCAgaGVyCittZXUgICAgICAgICAgICB8ICBteQorw6BzICAgICAgICAgICAgIHwgIGEgKyBhcworbWluaGEgICAgICAgICAgfCAgbXkKKyAgfCB0w6ptICAgICAgICBmcm9tIFRFUgorbnVtYSAgICAgICAgICAgfCAgZW0gKyB1bWEKK3BlbG9zICAgICAgICAgIHwgIHBlciArIG9zCitlbGFzICAgICAgICAgICB8ICB0aGV5CisgIHwgaGF2aWEgICAgICBmcm9tIEhBVgorICB8IHNlamEgICAgICAgZnJvbSBTRVIKK3F1YWwgICAgICAgICAgIHwgIHdoaWNoCisgIHwgc2Vyw6EgICAgICAgZnJvbSBTRVIKK27Ds3MgICAgICAgICAgICB8ICB3ZQorICB8IHRlbmhvICAgICAgZnJvbSBURVIKK2xoZSAgICAgICAgICAgIHwgIHRvIGhpbSwgaGVyCitkZWxlcyAgICAgICAgICB8ICBvZiB0aGVtCitlc3NhcyAgICAgICAgICB8ICB0aG9zZQorZXNzZXMgICAgICAgICAgfCAgdGhvc2UKK3BlbGFzICAgICAgICAgIHwgIHBlciArIGFzCitlc3RlICAgICAgICAgICB8ICB0aGlzCisgIHwgZm9zc2UgICAgICBmcm9tIFNFUgorZGVsZSAgICAgICAgICAgfCAgb2YgaGltCisKKyB8IG90aGVyIHdvcmRzLiBUaGVyZSBhcmUgbWFueSBjb250cmFjdGlvbnMgc3VjaCBhcyBuYXF1ZWxlID0gZW0rYXF1ZWxlLAorIHwgbW8gPSBtZStvLCBidXQgdGhleSBhcmUgcmFyZS4KKyB8IEluZGVmaW5pdGUgYXJ0aWNsZSBwbHVyYWwgZm9ybXMgYXJlIGFsc28gcmFyZS4KKwordHUgICAgICAgICAgICAgfCAgdGhvdQordGUgICAgICAgICAgICAgfCAgdGhlZQordm9jw6pzICAgICAgICAgIHwgIHlvdSAocGx1cmFsKQordm9zICAgICAgICAgICAgfCAgeW91CitsaGVzICAgICAgICAgICB8ICB0byB0aGVtCittZXVzICAgICAgICAgICB8ICBteQorbWluaGFzCit0ZXUgICAgICAgICAgICB8ICB0aHkKK3R1YQordGV1cwordHVhcworbm9zc28gICAgICAgICAgfCBvdXIKK25vc3NhCitub3Nzb3MKK25vc3NhcworCitkZWxhICAgICAgICAgICB8ICBvZiBoZXIKK2RlbGFzICAgICAgICAgIHwgIG9mIHRoZW0KKworZXN0YSAgICAgICAgICAgfCAgdGhpcworZXN0ZXMgICAgICAgICAgfCAgdGhlc2UKK2VzdGFzICAgICAgICAgIHwgIHRoZXNlCithcXVlbGUgICAgICAgICB8ICB0aGF0CithcXVlbGEgICAgICAgICB8ICB0aGF0CithcXVlbGVzICAgICAgICB8ICB0aG9zZQorYXF1ZWxhcyAgICAgICAgfCAgdGhvc2UKK2lzdG8gICAgICAgICAgIHwgIHRoaXMKK2FxdWlsbyAgICAgICAgIHwgIHRoYXQKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3RhciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorZXN0b3UKK2VzdMOhCitlc3RhbW9zCitlc3TDo28KK2VzdGl2ZQorZXN0ZXZlCitlc3RpdmVtb3MKK2VzdGl2ZXJhbQorZXN0YXZhCitlc3TDoXZhbW9zCitlc3RhdmFtCitlc3RpdmVyYQorZXN0aXbDqXJhbW9zCitlc3RlamEKK2VzdGVqYW1vcworZXN0ZWphbQorZXN0aXZlc3NlCitlc3RpdsOpc3NlbW9zCitlc3RpdmVzc2VtCitlc3RpdmVyCitlc3RpdmVybW9zCitlc3RpdmVyZW0KKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBoYXZlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CitoZWkKK2jDoQoraGF2ZW1vcworaMOjbworaG91dmUKK2hvdXZlbW9zCitob3V2ZXJhbQoraG91dmVyYQoraG91dsOpcmFtb3MKK2hhamEKK2hhamFtb3MKK2hhamFtCitob3V2ZXNzZQoraG91dsOpc3NlbW9zCitob3V2ZXNzZW0KK2hvdXZlcgoraG91dmVybW9zCitob3V2ZXJlbQoraG91dmVyZWkKK2hvdXZlcsOhCitob3V2ZXJlbW9zCitob3V2ZXLDo28KK2hvdXZlcmlhCitob3V2ZXLDrWFtb3MKK2hvdXZlcmlhbQorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHNlciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorc291Citzb21vcworc8OjbworZXJhCivDqXJhbW9zCitlcmFtCitmdWkKK2ZvaQorZm9tb3MKK2ZvcmFtCitmb3JhCitmw7RyYW1vcworc2VqYQorc2VqYW1vcworc2VqYW0KK2Zvc3NlCitmw7Rzc2Vtb3MKK2Zvc3NlbQorZm9yCitmb3Jtb3MKK2ZvcmVtCitzZXJlaQorc2Vyw6EKK3NlcmVtb3MKK3NlcsOjbworc2VyaWEKK3NlcsOtYW1vcworc2VyaWFtCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgdGVyLCB0byBoYXZlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3RlbmhvCit0ZW0KK3RlbW9zCit0w6ltCit0aW5oYQordMOtbmhhbW9zCit0aW5oYW0KK3RpdmUKK3RldmUKK3RpdmVtb3MKK3RpdmVyYW0KK3RpdmVyYQordGl2w6lyYW1vcwordGVuaGEKK3RlbmhhbW9zCit0ZW5oYW0KK3RpdmVzc2UKK3RpdsOpc3NlbW9zCit0aXZlc3NlbQordGl2ZXIKK3RpdmVybW9zCit0aXZlcmVtCit0ZXJlaQordGVyw6EKK3RlcmVtb3MKK3RlcsOjbwordGVyaWEKK3RlcsOtYW1vcwordGVyaWFtCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19yby50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19yby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZWU5MAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3JvLnR4dApAQCAtMCwwICsxLDIzMyBAQAorIyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgSmFjcXVlcyBTYXZveSBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorYWNlYQorYWNlYXN0YQorYWNlYXN0xIMKK2FjZWVhCithY2VpCithY2VpYQorYWNlbAorYWNlbGEKK2FjZWxlCithY2VsZWEKK2FjZXN0CithY2VzdGEKK2FjZXN0ZQorYWNlc3RlYQorYWNlxZ90aQorYWNlxZ90aWEKK2Fjb2xvCithY3VtCithaQorYWlhCithaWLEgworYWljaQorYWwKK8SDbGEKK2FsZQorYWxlYQorxINsZWEKK2FsdGNldmEKK2FsdGNpbmV2YQorYW0KK2FyCithcmUKK2HFnworYcWfYWRhcgorYXNlbWVuZWEKK2FzdGEKK8SDc3RhCithc3TEg3ppCithc3RlYQorxINzdGVhCivEg8WfdGlhCithc3VwcmEKK2HFo2kKK2F1CithdmVhCithdmVtCithdmXFo2kKK2F6aQorYmluZQorYnVjdXIKK2J1bsSDCitjYQorY8SDCitjxINjaQorY8OibmQKK2NhcmUKK2PEg3JlaQorY8SDcm9yCitjxINydWkKK2PDonQKK2PDonRlCitjw6LFo2kKK2PEg3RyZQorY8OidHZhCitjZQorY2VsCitjZXZhCitjaGlhcgorY8OubmQKK2NpbmUKK2NpbmV2YQorY8OudAorY8OudGUKK2PDrsWjaQorY8OudHZhCitjb250cmEKK2N1CitjdW0KK2N1bXZhCitjdXLDom5kCitjdXLDrm5kCitkYQorZMSDCitkYWPEgworZGFyCitkYXRvcml0xIMKK2RlCitkZWNpCitkZWphCitkZW9hcmVjZQorZGVwYXJ0ZQorZGXFn2kKK2RpbgorZGluYWludGVhCitkaW50cgorZGludHJlCitkcmVwdAorZHVwxIMKK2VhCitlaQorZWwKK2VsZQorZXJhbQorZXN0ZQorZcWfdGkKK2V1CitmYWNlCitmxINyxIMKK2ZpCitmaWUKK2ZpZWNhcmUKK2ZpaQorZmltCitmacWjaQoraWFyCitpZXJpCivDrmkKK8OubAorw65taQorw65tcG90cml2YQorw65uIAorw65uYWludGUKK8OubmFpbnRlYQorw65uY8OidAorw65uY8OudAorw65uY290cm8KK8OubnRyZQorw65udHJ1Y8OidAorw65udHJ1Y8OudAorw67Fo2kKK2xhCitsw6JuZ8SDCitsZQorbGkKK2zDrm5nxIMKK2xvcgorbHVpCittxIMKK23DomluZQorbWVhCittZWkKK21lbGUKK21lcmV1CittZXUKK21pCittaW5lCittdWx0CittdWx0xIMKK211bMWjaQorbmUKK25pY8SDaWVyaQorbmljaQorbmltZW5pCituacWfdGUKK25vYXN0csSDCitub2FzdHJlCitub2kKK25vxZ90cmkKK25vc3RydQorbnUKK29yaQorb3JpY8OibmQKK29yaWNhcmUKK29yaWPDonQKK29yaWNlCitvcmljw65uZAorb3JpY2luZQorb3JpY8OudAorb3JpY3VtCitvcml1bmRlCitww6JuxIMKK3BlCitwZW50cnUKK3Blc3RlCitww65uxIMKK3BvYXRlCitwb3QKK3ByZWEKK3ByaW1hCitwcmltdWwKK3ByaW4KK3ByaW50cgorc2EKK3PEgworc8SDaQorc2FsZQorc2F1CitzxIN1CitzZQorxZ9pCitzw65udAorc8OubnRlbQorc8OubnRlxaNpCitzcHJlCitzdWIKK3N1bnQKK3N1bnRlbQorc3VudGXFo2kKK3RhCit0xINpCit0YWxlCit0xIN1Cit0ZQorxaNpCivFo2llCit0aW5lCit0b2F0xIMKK3RvYXRlCit0b3QKK3RvxaNpCit0b3R1xZ9pCit0dQordW4KK3VuYQordW5kZQordW5kZXZhCit1bmVpCit1bmVsZQordW5lb3JpCit1bm9yCit2xIMKK3ZpCit2b2FzdHLEgwordm9hc3RyZQordm9pCit2b8WfdHJpCit2b3N0cnUKK3ZvdcSDCit2cmVvCit2cmV1bgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfcnUudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfcnUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19ydS50eHQKQEAgLTAsMCArMSwyNDEgQEAKKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvcnVzc2lhbi9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisKKyB8IGEgcnVzc2lhbiBzdG9wIHdvcmQgbGlzdC4gY29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIGVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCB0aGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2UgdGV4dCBzYW1wbGUuCisKKyB8IGxldHRlciBg0ZEnIGlzIHRyYW5zbGF0ZWQgdG8gYNC1Jy4KKwor0LggICAgICAgICAgICAgIHwgYW5kCivQsiAgICAgICAgICAgICAgfCBpbi9pbnRvCivQstC+ICAgICAgICAgICAgIHwgYWx0ZXJuYXRpdmUgZm9ybQor0L3QtSAgICAgICAgICAgICB8IG5vdAor0YfRgtC+ICAgICAgICAgICAgfCB3aGF0L3RoYXQKK9C+0L0gICAgICAgICAgICAgfCBoZQor0L3QsCAgICAgICAgICAgICB8IG9uL29udG8KK9GPICAgICAgICAgICAgICB8IGkKK9GBICAgICAgICAgICAgICB8IGZyb20KK9GB0L4gICAgICAgICAgICAgfCBhbHRlcm5hdGl2ZSBmb3JtCivQutCw0LogICAgICAgICAgICB8IGhvdwor0LAgICAgICAgICAgICAgIHwgbWlsZGVyIGZvcm0gb2YgYG5vJyAoYnV0KQor0YLQviAgICAgICAgICAgICB8IGNvbmp1bmN0aW9uIGFuZCBmb3JtIG9mIGB0aGF0Jwor0LLRgdC1ICAgICAgICAgICAgfCBhbGwKK9C+0L3QsCAgICAgICAgICAgIHwgc2hlCivRgtCw0LogICAgICAgICAgICB8IHNvLCB0aHVzCivQtdCz0L4gICAgICAgICAgICB8IGhpbQor0L3QviAgICAgICAgICAgICB8IGJ1dAor0LTQsCAgICAgICAgICAgICB8IHllcy9hbmQKK9GC0YsgICAgICAgICAgICAgfCB0aG91CivQuiAgICAgICAgICAgICAgfCB0b3dhcmRzLCBieQor0YMgICAgICAgICAgICAgIHwgYXJvdW5kLCBjaGV6CivQttC1ICAgICAgICAgICAgIHwgaW50ZW5zaWZpZXIgcGFydGljbGUKK9Cy0YsgICAgICAgICAgICAgfCB5b3UKK9C30LAgICAgICAgICAgICAgfCBiZXlvbmQsIGJlaGluZAor0LHRiyAgICAgICAgICAgICB8IGNvbmRpdGlvbmFsL3N1YmouIHBhcnRpY2xlCivQv9C+ICAgICAgICAgICAgIHwgdXAgdG8sIGFsb25nCivRgtC+0LvRjNC60L4gICAgICAgICB8IG9ubHkKK9C10LUgICAgICAgICAgICAgfCBoZXIKK9C80L3QtSAgICAgICAgICAgIHwgdG8gbWUKK9Cx0YvQu9C+ICAgICAgICAgICB8IGl0IHdhcwor0LLQvtGCICAgICAgICAgICAgfCBoZXJlIGlzL2FyZSwgcGFydGljbGUKK9C+0YIgICAgICAgICAgICAgfCBhd2F5IGZyb20KK9C80LXQvdGPICAgICAgICAgICB8IG1lCivQtdGJ0LUgICAgICAgICAgICB8IHN0aWxsLCB5ZXQsIG1vcmUKK9C90LXRgiAgICAgICAgICAgIHwgbm8sIHRoZXJlIGlzbnQvYXJlbnQKK9C+ICAgICAgICAgICAgICB8IGFib3V0CivQuNC3ICAgICAgICAgICAgIHwgb3V0IG9mCivQtdC80YMgICAgICAgICAgICB8IHRvIGhpbQor0YLQtdC/0LXRgNGMICAgICAgICAgfCBub3cKK9C60L7Qs9C00LAgICAgICAgICAgfCB3aGVuCivQtNCw0LbQtSAgICAgICAgICAgfCBldmVuCivQvdGDICAgICAgICAgICAgIHwgc28sIHdlbGwKK9Cy0LTRgNGD0LMgICAgICAgICAgfCBzdWRkZW5seQor0LvQuCAgICAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9C10YHQu9C4ICAgICAgICAgICB8IGlmCivRg9C20LUgICAgICAgICAgICB8IGFscmVhZHksIGJ1dCBob21vbnltIG9mIGBuYXJyb3dlcicKK9C40LvQuCAgICAgICAgICAgIHwgb3IKK9C90LggICAgICAgICAgICAgfCBuZWl0aGVyCivQsdGL0YLRjCAgICAgICAgICAgfCB0byBiZQor0LHRi9C7ICAgICAgICAgICAgfCBoZSB3YXMKK9C90LXQs9C+ICAgICAgICAgICB8IHByZXBvc2l0aW9uYWwgZm9ybSBvZiDQtdCz0L4KK9C00L4gICAgICAgICAgICAgfCB1cCB0bwor0LLQsNGBICAgICAgICAgICAgfCB5b3UgYWNjdXNhdGl2ZQor0L3QuNCx0YPQtNGMICAgICAgICAgfCBpbmRlZi4gc3VmZml4IHByZWNlZGVkIGJ5IGh5cGhlbgor0L7Qv9GP0YLRjCAgICAgICAgICB8IGFnYWluCivRg9C2ICAgICAgICAgICAgIHwgYWxyZWFkeSwgYnV0IGhvbW9ueW0gb2YgYGFkZGVyJwor0LLQsNC8ICAgICAgICAgICAgfCB0byB5b3UKK9GB0LrQsNC30LDQuyAgICAgICAgIHwgaGUgc2FpZAor0LLQtdC00YwgICAgICAgICAgIHwgcGFydGljbGUgYGFmdGVyIGFsbCcKK9GC0LDQvCAgICAgICAgICAgIHwgdGhlcmUKK9C/0L7RgtC+0LwgICAgICAgICAgfCB0aGVuCivRgdC10LHRjyAgICAgICAgICAgfCBvbmVzZWxmCivQvdC40YfQtdCz0L4gICAgICAgICB8IG5vdGhpbmcKK9C10LkgICAgICAgICAgICAgfCB0byBoZXIKK9C80L7QttC10YIgICAgICAgICAgfCB1c3VhbGx5IHdpdGggYNCx0YvRgtGMJyBhcyBgbWF5YmUnCivQvtC90LggICAgICAgICAgICB8IHRoZXkKK9GC0YPRgiAgICAgICAgICAgIHwgaGVyZQor0LPQtNC1ICAgICAgICAgICAgfCB3aGVyZQor0LXRgdGC0YwgICAgICAgICAgIHwgdGhlcmUgaXMvYXJlCivQvdCw0LTQviAgICAgICAgICAgfCBnb3QgdG8sIG11c3QKK9C90LXQuSAgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mICDQtdC5CivQtNC70Y8gICAgICAgICAgICB8IGZvcgor0LzRiyAgICAgICAgICAgICB8IHdlCivRgtC10LHRjyAgICAgICAgICAgfCB0aGVlCivQuNGFICAgICAgICAgICAgIHwgdGhlbSwgdGhlaXIKK9GH0LXQvCAgICAgICAgICAgIHwgdGhhbgor0LHRi9C70LAgICAgICAgICAgIHwgc2hlIHdhcwor0YHQsNC8ICAgICAgICAgICAgfCBzZWxmCivRh9GC0L7QsSAgICAgICAgICAgfCBpbiBvcmRlciB0bwor0LHQtdC3ICAgICAgICAgICAgfCB3aXRob3V0CivQsdGD0LTRgtC+ICAgICAgICAgIHwgYXMgaWYKK9GH0LXQu9C+0LLQtdC6ICAgICAgICB8IG1hbiwgcGVyc29uLCBvbmUKK9GH0LXQs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHdoYXQnCivRgNCw0LcgICAgICAgICAgICB8IG9uY2UKK9GC0L7QttC1ICAgICAgICAgICB8IGFsc28KK9GB0LXQsdC1ICAgICAgICAgICB8IHRvIG9uZXNlbGYKK9C/0L7QtCAgICAgICAgICAgIHwgYmVuZWF0aAor0LbQuNC30L3RjCAgICAgICAgICB8IGxpZmUKK9Cx0YPQtNC10YIgICAgICAgICAgfCB3aWxsIGJlCivQtiAgICAgICAgICAgICAgfCBzaG9ydCBmb3JtIG9mIGludGVuc2lmZXIgcGFydGljbGUgYNC20LUnCivRgtC+0LPQtNCwICAgICAgICAgIHwgdGhlbgor0LrRgtC+ICAgICAgICAgICAgfCB3aG8KK9GN0YLQvtGCICAgICAgICAgICB8IHRoaXMKK9Cz0L7QstC+0YDQuNC7ICAgICAgICB8IHdhcyBzYXlpbmcKK9GC0L7Qs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoYXQnCivQv9C+0YLQvtC80YMgICAgICAgICB8IGZvciB0aGF0IHJlYXNvbgor0Y3RgtC+0LPQviAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoaXMnCivQutCw0LrQvtC5ICAgICAgICAgIHwgd2hpY2gKK9GB0L7QstGB0LXQvCAgICAgICAgIHwgYWx0b2dldGhlcgor0L3QuNC8ICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC10LPQvicsIGDQvtC90LgnCivQt9C00LXRgdGMICAgICAgICAgIHwgaGVyZQor0Y3RgtC+0LwgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mIGDRjdGC0L7RgicKK9C+0LTQuNC9ICAgICAgICAgICB8IG9uZQor0L/QvtGH0YLQuCAgICAgICAgICB8IGFsbW9zdAor0LzQvtC5ICAgICAgICAgICAgfCBteQor0YLQtdC8ICAgICAgICAgICAgfCBpbnN0cnVtZW50YWwvZGF0aXZlIHBsdXJhbCBvZiBg0YLQvtGCJywgYNGC0L4nCivRh9GC0L7QsdGLICAgICAgICAgIHwgZnVsbCBmb3JtIG9mIGBpbiBvcmRlciB0aGF0Jwor0L3QtdC1ICAgICAgICAgICAgfCBoZXIgKGFjYy4pCivQutCw0LbQtdGC0YHRjyAgICAgICAgfCBpdCBzZWVtcwor0YHQtdC50YfQsNGBICAgICAgICAgfCBub3cKK9Cx0YvQu9C4ICAgICAgICAgICB8IHRoZXkgd2VyZQor0LrRg9C00LAgICAgICAgICAgIHwgd2hlcmUgdG8KK9C30LDRh9C10LwgICAgICAgICAgfCB3aHkKK9GB0LrQsNC30LDRgtGMICAgICAgICB8IHRvIHNheQor0LLRgdC10YUgICAgICAgICAgIHwgYWxsIChhY2MuLCBnZW4uIHByZXBvc24uIHBsdXJhbCkKK9C90LjQutC+0LPQtNCwICAgICAgICB8IG5ldmVyCivRgdC10LPQvtC00L3RjyAgICAgICAgfCB0b2RheQor0LzQvtC20L3QviAgICAgICAgICB8IHBvc3NpYmxlLCBvbmUgY2FuCivQv9GA0LggICAgICAgICAgICB8IGJ5CivQvdCw0LrQvtC90LXRhiAgICAgICAgfCBmaW5hbGx5CivQtNCy0LAgICAgICAgICAgICB8IHR3bwor0L7QsSAgICAgICAgICAgICB8IGFsdGVybmF0aXZlIGZvcm0gb2YgYNC+JywgYWJvdXQKK9C00YDRg9Cz0L7QuSAgICAgICAgIHwgYW5vdGhlcgor0YXQvtGC0YwgICAgICAgICAgIHwgZXZlbgor0L/QvtGB0LvQtSAgICAgICAgICB8IGFmdGVyCivQvdCw0LQgICAgICAgICAgICB8IGFib3ZlCivQsdC+0LvRjNGI0LUgICAgICAgICB8IG1vcmUKK9GC0L7RgiAgICAgICAgICAgIHwgdGhhdCBvbmUgKG1hc2MuKQor0YfQtdGA0LXQtyAgICAgICAgICB8IGFjcm9zcywgaW4KK9GN0YLQuCAgICAgICAgICAgIHwgdGhlc2UKK9C90LDRgSAgICAgICAgICAgIHwgdXMKK9C/0YDQviAgICAgICAgICAgIHwgYWJvdXQKK9Cy0YHQtdCz0L4gICAgICAgICAgfCBpbiBhbGwsIG9ubHksIG9mIGFsbAor0L3QuNGFICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC+0L3QuCcgKHRoZXkpCivQutCw0LrQsNGPICAgICAgICAgIHwgd2hpY2gsIGZlbWluaW5lCivQvNC90L7Qs9C+ICAgICAgICAgIHwgbG90cwor0YDQsNC30LLQtSAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9GB0LrQsNC30LDQu9CwICAgICAgICB8IHNoZSBzYWlkCivRgtGA0LggICAgICAgICAgICB8IHRocmVlCivRjdGC0YMgICAgICAgICAgICB8IHRoaXMsIGFjYy4gZmVtLiBzaW5nLgor0LzQvtGPICAgICAgICAgICAgfCBteSwgZmVtaW5pbmUKK9Cy0L/RgNC+0YfQtdC8ICAgICAgICB8IG1vcmVvdmVyLCBiZXNpZGVzCivRhdC+0YDQvtGI0L4gICAgICAgICB8IGdvb2QKK9GB0LLQvtGOICAgICAgICAgICB8IG9uZXMgb3duLCBhY2MuIGZlbS4gc2luZy4KK9GN0YLQvtC5ICAgICAgICAgICB8IG9ibGlxdWUgZm9ybSBvZiBg0Y3RgtCwJywgZmVtLiBgdGhpcycKK9C/0LXRgNC10LQgICAgICAgICAgfCBpbiBmcm9udCBvZgor0LjQvdC+0LPQtNCwICAgICAgICAgfCBzb21ldGltZXMKK9C70YPRh9GI0LUgICAgICAgICAgfCBiZXR0ZXIKK9GH0YPRgtGMICAgICAgICAgICB8IGEgbGl0dGxlCivRgtC+0LwgICAgICAgICAgICB8IHByZXBvc24uIGZvcm0gb2YgYHRoYXQgb25lJwor0L3QtdC70YzQt9GPICAgICAgICAgfCBvbmUgbXVzdCBub3QKK9GC0LDQutC+0LkgICAgICAgICAgfCBzdWNoIGEgb25lCivQuNC8ICAgICAgICAgICAgIHwgdG8gdGhlbQor0LHQvtC70LXQtSAgICAgICAgICB8IG1vcmUKK9Cy0YHQtdCz0LTQsCAgICAgICAgIHwgYWx3YXlzCivQutC+0L3QtdGH0L3QviAgICAgICAgfCBvZiBjb3Vyc2UKK9Cy0YHRjiAgICAgICAgICAgIHwgYWNjLiBmZW0uIHNpbmcgb2YgYGFsbCcKK9C80LXQttC00YMgICAgICAgICAgfCBiZXR3ZWVuCisKKworICB8IGI6IHNvbWUgcGFyYWRpZ21zCisgIHwKKyAgfCBwZXJzb25hbCBwcm9ub3VucworICB8CisgIHwg0Y8gINC80LXQvdGPICDQvNC90LUgINC80L3QvtC5ICBb0LzQvdC+0Y5dCisgIHwg0YLRiyAg0YLQtdCx0Y8gINGC0LXQsdC1ICDRgtC+0LHQvtC5ICBb0YLQvtCx0L7Rjl0KKyAgfCDQvtC9ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8INC+0L3QsCAg0LXQtSAg0Y3QuCAg0LXRjiAgW9C90LXQtSwg0L3RjdC4LCDQvdC10Y5dCisgIHwg0L7QvdC+ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8CisgIHwg0LzRiyAg0L3QsNGBICDQvdCw0LwgINC90LDQvNC4CisgIHwg0LLRiyAg0LLQsNGBICDQstCw0LwgINCy0LDQvNC4CisgIHwg0L7QvdC4ICDQuNGFICDQuNC8ICDQuNC80LggIFvQvdC40YUsINC90LjQvCwg0L3QuNC80LhdCisgIHwKKyAgfCAgINGB0LXQsdGPICDRgdC10LHQtSAg0YHQvtCx0L7QuSAgIFvRgdC+0LHQvtGOXQorICB8CisgIHwgZGVtb25zdHJhdGl2ZSBwcm9ub3Vuczog0Y3RgtC+0YIgKHRoaXMpLCDRgtC+0YIgKHRoYXQpCisgIHwKKyAgfCDRjdGC0L7RgiAg0Y3RgtCwICDRjdGC0L4gINGN0YLQuAorICB8INGN0YLQvtCz0L4gINGN0YLRiyAg0Y3RgtC+ICDRjdGC0LgKKyAgfCDRjdGC0L7Qs9C+ICDRjdGC0L7QuSAg0Y3RgtC+0LPQviAg0Y3RgtC40YUKKyAgfCDRjdGC0L7QvNGDICDRjdGC0L7QuSAg0Y3RgtC+0LzRgyAg0Y3RgtC40LwKKyAgfCDRjdGC0LjQvCAg0Y3RgtC+0LkgINGN0YLQuNC8ICBb0Y3RgtC+0Y5dICDRjdGC0LjQvNC4CisgIHwg0Y3RgtC+0LwgINGN0YLQvtC5ICDRjdGC0L7QvCAg0Y3RgtC40YUKKyAgfAorICB8INGC0L7RgiAg0YLQsCAg0YLQviAg0YLQtQorICB8INGC0L7Qs9C+ICDRgtGDICDRgtC+ICDRgtC1CisgIHwg0YLQvtCz0L4gINGC0L7QuSAg0YLQvtCz0L4gINGC0LXRhQorICB8INGC0L7QvNGDICDRgtC+0LkgINGC0L7QvNGDICDRgtC10LwKKyAgfCDRgtC10LwgINGC0L7QuSAg0YLQtdC8ICBb0YLQvtGOXSAg0YLQtdC80LgKKyAgfCDRgtC+0LwgINGC0L7QuSAg0YLQvtC8ICDRgtC10YUKKyAgfAorICB8IGRldGVybWluYXRpdmUgcHJvbm91bnMKKyAgfAorICB8IChhKSDQstC10YHRjCAoYWxsKQorICB8CisgIHwg0LLQtdGB0YwgINCy0YHRjyAg0LLRgdC1ICDQstGB0LUKKyAgfCDQstGB0LXQs9C+ICDQstGB0Y4gINCy0YHQtSAg0LLRgdC1CisgIHwg0LLRgdC10LPQviAg0LLRgdC10LkgINCy0YHQtdCz0L4gINCy0YHQtdGFCisgIHwg0LLRgdC10LzRgyAg0LLRgdC10LkgINCy0YHQtdC80YMgINCy0YHQtdC8CisgIHwg0LLRgdC10LwgINCy0YHQtdC5ICDQstGB0LXQvCAgW9Cy0YHQtdGOXSAg0LLRgdC10LzQuAorICB8INCy0YHQtdC8ICDQstGB0LXQuSAg0LLRgdC10LwgINCy0YHQtdGFCisgIHwKKyAgfCAoYikg0YHQsNC8IChoaW1zZWxmIGV0YykKKyAgfAorICB8INGB0LDQvCAg0YHQsNC80LAgINGB0LDQvNC+ICDRgdCw0LzQuAorICB8INGB0LDQvNC+0LPQviDRgdCw0LzRgyAg0YHQsNC80L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtCz0L4g0YHQsNC80L7QuSDRgdCw0LzQvtCz0L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtC80YMg0YHQsNC80L7QuSDRgdCw0LzQvtC80YMgINGB0LDQvNC40LwKKyAgfCDRgdCw0LzQuNC8ICDRgdCw0LzQvtC5ICDRgdCw0LzQuNC8ICBb0YHQsNC80L7Rjl0gINGB0LDQvNC40LzQuAorICB8INGB0LDQvNC+0Lwg0YHQsNC80L7QuSDRgdCw0LzQvtC8ICDRgdCw0LzQuNGFCisgIHwKKyAgfCBzdGVtcyBvZiB2ZXJicyBgdG8gYmUnLCBgdG8gaGF2ZScsIGB0byBkbycgYW5kIG1vZGFsCisgIHwKKyAgfCDQsdGL0YLRjCAg0LHRiyAg0LHRg9C0ICDQsdGL0LIgINC10YHRgtGMICDRgdGD0YLRjAorICB8INC40LzQtQorICB8INC00LXQuworICB8INC80L7QsyAgINC80L7QtiAg0LzQvtGH0YwKKyAgfCDRg9C80LUKKyAgfCDRhdC+0YcgINGF0L7RggorICB8INC00L7Qu9C2CisgIHwg0LzQvtC20L0KKyAgfCDQvdGD0LbQvQorICB8INC90LXQu9GM0LfRjworCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19zdi50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc19zdi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiZGRmZAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3N2LnR4dApAQCAtMCwwICsxLDEzMSBAQAorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9zd2VkaXNoL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKworIHwgQSBTd2VkaXNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQorIHwgYSBsYXJnZSB0ZXh0IHNhbXBsZS4KKworIHwgU3dlZGlzaCBzdG9wIHdvcmRzIG9jY2FzaW9uYWxseSBleGhpYml0IGhvbW9ueW0gY2xhc2hlcy4gRm9yIGV4YW1wbGUKKyB8ICBzw6UgPSBzbywgYnV0IGFsc28gc2VlZC4gVGhlc2UgYXJlIGluZGljYXRlZCBjbGVhcmx5IGJlbG93LgorCitvY2ggICAgICAgICAgICB8IGFuZAorZGV0ICAgICAgICAgICAgfCBpdCwgdGhpcy90aGF0CithdHQgICAgICAgICAgICB8IHRvICh3aXRoIGluZmluaXRpdmUpCitpICAgICAgICAgICAgICB8IGluLCBhdAorZW4gICAgICAgICAgICAgfCBhCitqYWcgICAgICAgICAgICB8IEkKK2hvbiAgICAgICAgICAgIHwgc2hlCitzb20gICAgICAgICAgICB8IHdobywgdGhhdAoraGFuICAgICAgICAgICAgfCBoZQorcMOlICAgICAgICAgICAgIHwgb24KK2RlbiAgICAgICAgICAgIHwgaXQsIHRoaXMvdGhhdAorbWVkICAgICAgICAgICAgfCB3aXRoCit2YXIgICAgICAgICAgICB8IHdoZXJlLCBlYWNoCitzaWcgICAgICAgICAgICB8IGhpbShzZWxmKSBldGMKK2bDtnIgICAgICAgICAgICB8IGZvcgorc8OlICAgICAgICAgICAgIHwgc28gKGFsc286IHNlZWQpCit0aWxsICAgICAgICAgICB8IHRvCivDpHIgICAgICAgICAgICAgfCBpcworbWVuICAgICAgICAgICAgfCBidXQKK2V0dCAgICAgICAgICAgIHwgYQorb20gICAgICAgICAgICAgfCBpZjsgYXJvdW5kLCBhYm91dAoraGFkZSAgICAgICAgICAgfCBoYWQKK2RlICAgICAgICAgICAgIHwgdGhleSwgdGhlc2UvdGhvc2UKK2F2ICAgICAgICAgICAgIHwgb2YKK2lja2UgICAgICAgICAgIHwgbm90LCBubworbWlnICAgICAgICAgICAgfCBtZQorZHUgICAgICAgICAgICAgfCB5b3UKK2hlbm5lICAgICAgICAgIHwgaGVyCitkw6UgICAgICAgICAgICAgfCB0aGVuLCB3aGVuCitzaW4gICAgICAgICAgICB8IGhpcworbnUgICAgICAgICAgICAgfCBub3cKK2hhciAgICAgICAgICAgIHwgaGF2ZQoraW50ZSAgICAgICAgICAgfCBpbnRlIG7DpWdvbiA9IG5vIG9uZQoraGFucyAgICAgICAgICAgfCBoaXMKK2hvbm9tICAgICAgICAgIHwgaGltCitza3VsbGUgICAgICAgICB8ICdzYWtlJworaGVubmVzICAgICAgICAgfCBoZXIKK2TDpHIgICAgICAgICAgICB8IHRoZXJlCittaW4gICAgICAgICAgICB8IG15CittYW4gICAgICAgICAgICB8IG9uZSAocHJvbm91bikKK2VqICAgICAgICAgICAgIHwgbm9yCit2aWQgICAgICAgICAgICB8IGF0LCBieSwgb24gKGFsc286IHZhc3QpCitrdW5kZSAgICAgICAgICB8IGNvdWxkCituw6Vnb3QgICAgICAgICAgfCBzb21lIGV0YworZnLDpW4gICAgICAgICAgIHwgZnJvbSwgb2ZmCit1dCAgICAgICAgICAgICB8IG91dAorbsOkciAgICAgICAgICAgIHwgd2hlbgorZWZ0ZXIgICAgICAgICAgfCBhZnRlciwgYmVoaW5kCit1cHAgICAgICAgICAgICB8IHVwCit2aSAgICAgICAgICAgICB8IHdlCitkZW0gICAgICAgICAgICB8IHRoZW0KK3ZhcmEgICAgICAgICAgIHwgYmUKK3ZhZCAgICAgICAgICAgIHwgd2hhdAorw7Z2ZXIgICAgICAgICAgIHwgb3Zlcgorw6RuICAgICAgICAgICAgIHwgdGhhbgorZGlnICAgICAgICAgICAgfCB5b3UKK2thbiAgICAgICAgICAgIHwgY2FuCitzaW5hICAgICAgICAgICB8IGhpcworaMOkciAgICAgICAgICAgIHwgaGVyZQoraGEgICAgICAgICAgICAgfCBoYXZlCittb3QgICAgICAgICAgICB8IHRvd2FyZHMKK2FsbGEgICAgICAgICAgIHwgYWxsCit1bmRlciAgICAgICAgICB8IHVuZGVyIChhbHNvOiB3b25kZXIpCituw6Vnb24gICAgICAgICAgfCBzb21lIGV0YworZWxsZXIgICAgICAgICAgfCBvciAoZWxzZSkKK2FsbHQgICAgICAgICAgIHwgYWxsCitteWNrZXQgICAgICAgICB8IG11Y2gKK3NlZGFuICAgICAgICAgIHwgc2luY2UKK2p1ICAgICAgICAgICAgIHwgd2h5CitkZW5uYSAgICAgICAgICB8IHRoaXMvdGhhdAorc2rDpGx2ICAgICAgICAgIHwgbXlzZWxmLCB5b3Vyc2VsZiBldGMKK2RldHRhICAgICAgICAgIHwgdGhpcy90aGF0CivDpXQgICAgICAgICAgICAgfCB0bwordXRhbiAgICAgICAgICAgfCB3aXRob3V0Cit2YXJpdCAgICAgICAgICB8IHdhcworaHVyICAgICAgICAgICAgfCBob3cKK2luZ2VuICAgICAgICAgIHwgbm8KK21pdHQgICAgICAgICAgIHwgbXkKK25pICAgICAgICAgICAgIHwgeW91CitibGkgICAgICAgICAgICB8IHRvIGJlLCBiZWNvbWUKK2JsZXYgICAgICAgICAgIHwgZnJvbSBibGkKK29zcyAgICAgICAgICAgIHwgdXMKK2RpbiAgICAgICAgICAgIHwgdGh5CitkZXNzYSAgICAgICAgICB8IHRoZXNlL3Rob3NlCituw6VncmEgICAgICAgICAgfCBzb21lIGV0YworZGVyYXMgICAgICAgICAgfCB0aGVpcgorYmxpciAgICAgICAgICAgfCBmcm9tIGJsaQorbWluYSAgICAgICAgICAgfCBteQorc2FtbWEgICAgICAgICAgfCAodGhlKSBzYW1lCit2aWxrZW4gICAgICAgICB8IHdobywgdGhhdAorZXIgICAgICAgICAgICAgfCB5b3UsIHlvdXIKK3PDpWRhbiAgICAgICAgICB8IHN1Y2ggYQordsOlciAgICAgICAgICAgIHwgb3VyCitibGl2aXQgICAgICAgICB8IGZyb20gYmxpCitkZXNzICAgICAgICAgICB8IGl0cworaW5vbSAgICAgICAgICAgfCB3aXRoaW4KK21lbGxhbiAgICAgICAgIHwgYmV0d2Vlbgorc8OlZGFudCAgICAgICAgIHwgc3VjaCBhCit2YXJmw7ZyICAgICAgICAgfCB3aHkKK3ZhcmplICAgICAgICAgIHwgZWFjaAordmlsa2EgICAgICAgICAgfCB3aG8sIHRoYXQKK2RpdHQgICAgICAgICAgIHwgdGh5Cit2ZW0gICAgICAgICAgICB8IHdobwordmlsa2V0ICAgICAgICAgfCB3aG8sIHRoYXQKK3NpdHRhICAgICAgICAgIHwgaGlzCitzw6VkYW5hICAgICAgICAgfCBzdWNoIGEKK3ZhcnQgICAgICAgICAgIHwgZWFjaAorZGluYSAgICAgICAgICAgfCB0aHkKK3ZhcnMgICAgICAgICAgIHwgd2hvc2UKK3bDpXJ0ICAgICAgICAgICB8IG91cgordsOlcmEgICAgICAgICAgIHwgb3VyCitlcnQgICAgICAgICAgICB8IHlvdXIKK2VyYSAgICAgICAgICAgIHwgeW91cgordmlsa2FzICAgICAgICAgfCB3aG9zZQorCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc190aC50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3N0b3B3b3Jkc190aC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmMGZhYgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3RoLnR4dApAQCAtMCwwICsxLDExOSBAQAorIyBUaGFpIHN0b3B3b3JkcyBmcm9tOgorIyAiT3BpbmlvbiBEZXRlY3Rpb24gaW4gVGhhaSBQb2xpdGljYWwgTmV3cyBDb2x1bW5zCisjIEJhc2VkIG9uIFN1YmplY3Rpdml0eSBBbmFseXNpcyIKKyMgS2hhbXBvbCBTdWtodW0sIFN1cG90IE5pdHN1d2F0LCBhbmQgQ2hvb2NoYXJ0IEhhcnVlY2hhaXlhc2FrCivguYTguKfguYkKK+C5hOC4oeC5iAor4LmE4LibCivguYTguJTguYkKK+C5g+C4q+C5iQor4LmD4LiZCivguYLguJTguKIKK+C5geC4q+C5iOC4hwor4LmB4Lil4LmJ4LinCivguYHguKXguLAKK+C5geC4o+C4gQor4LmB4Lia4LiaCivguYHguJXguYgKK+C5gOC4reC4hwor4LmA4Lir4LmH4LiZCivguYDguKXguKIKK+C5gOC4o+C4tOC5iOC4oQor4LmA4Lij4LiyCivguYDguKHguLfguYjguK0KK+C5gOC4nuC4t+C5iOC4rQor4LmA4Lie4Lij4Liy4LiwCivguYDguJvguYfguJnguIHguLLguKMKK+C5gOC4m+C5h+C4mQor4LmA4Lib4Li04LiU4LmA4Lic4LiiCivguYDguJvguLTguJQKK+C5gOC4meC4t+C5iOC4reC4h+C4iOC4suC4gQor4LmA4LiU4Li14Lii4Lin4LiB4Lix4LiZCivguYDguJTguLXguKLguKcKK+C5gOC4iuC5iOC4mQor4LmA4LiJ4Lie4Liy4LiwCivguYDguITguKIKK+C5gOC4guC5ieC4sgor4LmA4LiC4LiyCivguK3guLXguIEKK+C4reC4suC4iAor4Lit4Liw4LmE4LijCivguK3guK3guIEKK+C4reC4ouC5iOC4suC4hwor4Lit4Lii4Li54LmICivguK3guKLguLLguIEKK+C4q+C4suC4gQor4Lir4Lil4Liy4LiiCivguKvguKXguLHguIfguIjguLLguIEKK+C4q+C4peC4seC4hwor4Lir4Lij4Li34LitCivguKvguJnguLbguYjguIcKK+C4quC5iOC4p+C4mQor4Liq4LmI4LiHCivguKrguLjguJQKK+C4quC5jeC4suC4q+C4o+C4seC4mgor4Lin4LmI4LiyCivguKfguLHguJkKK+C4peC4hwor4Lij4LmI4Lin4LihCivguKPguLLguKIKK+C4o+C4seC4mgor4Lij4Liw4Lir4Lin4LmI4Liy4LiHCivguKPguKfguKEKK+C4ouC4seC4hwor4Lih4Li1CivguKHguLLguIEKK+C4oeC4sgor4Lie4Lij4LmJ4Lit4LihCivguJ7guJoKK+C4nOC5iOC4suC4mQor4Lic4LilCivguJrguLLguIcKK+C4meC5iOC4sgor4LiZ4Li14LmJCivguJnguY3guLIKK+C4meC4seC5ieC4mQor4LiZ4Lix4LiBCivguJnguK3guIHguIjguLLguIEKK+C4l+C4uOC4gQor4LiX4Li14LmI4Liq4Li44LiUCivguJfguLXguYgKK+C4l+C5jeC4suC5g+C4q+C5iQor4LiX4LmN4LiyCivguJfguLLguIcKK+C4l+C4seC5ieC4h+C4meC4teC5iQor4LiX4Lix4LmJ4LiHCivguJbguYnguLIKK+C4luC4ueC4gQor4LiW4Li24LiHCivguJXguYnguK3guIcKK+C4leC5iOC4suC4h+C5hgor4LiV4LmI4Liy4LiHCivguJXguYjguK0KK+C4leC4suC4oQor4LiV4Lix4LmJ4LiH4LmB4LiV4LmICivguJXguLHguYnguIcKK+C4lOC5ieC4suC4mQor4LiU4LmJ4Lin4LiiCivguJTguLHguIcKK+C4i+C4tuC5iOC4hwor4LiK4LmI4Lin4LiHCivguIjguLbguIcKK+C4iOC4suC4gQor4LiI4Lix4LiUCivguIjguLAKK+C4hOC4t+C4rQor4LiE4Lin4Liy4LihCivguITguKPguLHguYnguIcKK+C4hOC4hwor4LiC4Li24LmJ4LiZCivguILguK3guIcKK+C4guC4rQor4LiC4LiT4LiwCivguIHguYjguK3guJkKK+C4geC5hwor4LiB4Liy4LijCivguIHguLHguJoKK+C4geC4seC4mQor4LiB4Lin4LmI4LiyCivguIHguKXguYjguLLguKcKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ5NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy9zdG9wd29yZHNfdHIudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjIFR1cmtpc2ggc3RvcHdvcmRzIGZyb20gTFVDRU5FLTU1OQorIyBtZXJnZWQgd2l0aCB0aGUgbGlzdCBmcm9tICJJbmZvcm1hdGlvbiBSZXRyaWV2YWwgb24gVHVya2lzaCBUZXh0cyIKKyMgICAoaHR0cDovL3d3dy51c2Vycy5tdW9oaW8uZWR1L2NhbmYvcGFwZXJzL0pBU0lTVDIwMDhvZmZQcmludC5wZGYpCithY2FiYQorYWx0bcSxxZ8KK2FsdMSxCithbWEKK2FuY2FrCithcmFkYQorYXNsxLFuZGEKK2F5csSxY2EKK2JhbmEKK2JhesSxCitiZWxraQorYmVuCitiZW5kZW4KK2JlbmkKK2JlbmltCitiZXJpCitiZcWfCitiaWxlCitiaW4KK2JpcgorYmlyw6dvaworYmlyaQorYmlya2HDpworYmlya2V6CitiaXLFn2V5CitiaXLFn2V5aQorYml6CitiaXplCitiaXpkZW4KK2JpemkKK2JpemltCitiw7Z5bGUKK2LDtnlsZWNlCitidQorYnVuYQorYnVuZGEKK2J1bmRhbgorYnVubGFyCitidW5sYXLEsQorYnVubGFyxLFuCitidW51CitidW51bgorYnVyYWRhCivDp29rCivDp8O8bmvDvAorZGEKK2RhaGEKK2RhaGkKK2RlCitkZWZhCitkZcSfaWwKK2RpxJ9lcgorZGl5ZQorZG9rc2FuCitkb2t1egorZG9sYXnEsQorZG9sYXnEsXPEsXlsYQorZMO2cnQKK2VkZWNlaworZWRlbgorZWRlcmVrCitlZGlsZWNlaworZWRpbGl5b3IKK2VkaWxtZXNpCitlZGl5b3IKK2XEn2VyCitlbGxpCitlbgorZXRtZXNpCitldHRpCitldHRpxJ9pCitldHRpxJ9pbmkKK2dpYmkKK2fDtnJlCitoYWxlbgoraGFuZ2kKK2hhdHRhCitoZW0KK2hlbsO8egoraGVwCitoZXBzaQoraGVyCitoZXJoYW5naQoraGVya2VzaW4KK2hpw6cKK2hpw6diaXIKK2nDp2luCitpa2kKK2lsZQoraWxnaWxpCitpc2UKK2nFn3RlCitpdGliYXJlbgoraXRpYmFyaXlsZQora2FkYXIKK2thcsWfxLFuCitrYXRyaWx5b24KK2tlbmRpCitrZW5kaWxlcmluZQora2VuZGluaQora2VuZGlzaQora2VuZGlzaW5lCitrZW5kaXNpbmkKK2tlegora2kKK2tpbQora2ltZGVuCitraW1lCitraW1pCitraW1zZQora8SxcmsKK21pbHlhcgorbWlseW9uCittdQorbcO8CittxLEKK25hc8SxbAorbmUKK25lZGVuCituZWRlbmxlCituZXJkZQorbmVyZWRlCituZXJleWUKK25peWUKK25pw6dpbgorbworb2xhbgorb2xhcmFrCitvbGR1CitvbGR1xJ91CitvbGR1xJ91bnUKK29sZHVrbGFyxLFuxLEKK29sbWFkxLEKK29sbWFkxLHEn8SxCitvbG1haworb2xtYXPEsQorb2xtYXlhbgorb2xtYXoKK29sc2EKK29sc3VuCitvbHVwCitvbHVyCitvbHVyc2EKK29sdXlvcgorb24KK29uYQorb25kYW4KK29ubGFyCitvbmxhcmRhbgorb25sYXLEsQorb25sYXLEsW4KK29udQorb251bgorb3R1egorb3lzYQorw7Z5bGUKK3BlaworcmHEn21lbgorc2FkZWNlCitzYW5raQorc2VraXoKK3Nla3Nlbgorc2VuCitzZW5kZW4KK3NlbmkKK3NlbmluCitzaXoKK3NpemRlbgorc2l6aQorc2l6aW4KK8WfZXkKK8WfZXlkZW4KK8WfZXlpCivFn2V5bGVyCivFn8O2eWxlCivFn3UKK8WfdW5hCivFn3VuZGEKK8WfdW5kYW4KK8WfdW5sYXLEsQorxZ91bnUKK3RhcmFmxLFuZGFuCit0cmlseW9uCit0w7xtCivDvMOnCivDvHplcmUKK3ZhcgordmFyZMSxCit2ZQordmV5YQoreWEKK3lhbmkKK3lhcGFjYWsKK3lhcMSxbGFuCit5YXDEsWxtYXPEsQoreWFwxLF5b3IKK3lhcG1haworeWFwdMSxCit5YXB0xLHEn8SxCit5YXB0xLHEn8SxbsSxCit5YXB0xLFrbGFyxLEKK3llZGkKK3llcmluZQoreWV0bWnFnworeWluZQoreWlybWkKK3lva3NhCit5w7x6Cit6YXRlbgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy91c2VyZGljdF9qYS50eHQgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9sYW5nL3VzZXJkaWN0X2phLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAzNjhlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvbGFuZy91c2VyZGljdF9qYS50eHQKQEAgLTAsMCArMSwyOSBAQAorIworIyBUaGlzIGlzIGEgc2FtcGxlIHVzZXIgZGljdGlvbmFyeSBmb3IgS3Vyb21vamkgKEphcGFuZXNlVG9rZW5pemVyKQorIworIyBBZGQgZW50cmllcyB0byB0aGlzIGZpbGUgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIHN0YXRpc3RpY2FsIG1vZGVsIGluIHRlcm1zCisjIG9mIHNlZ21lbnRhdGlvbiwgcmVhZGluZ3MgYW5kIHBhcnQtb2Ytc3BlZWNoIHRhZ3MuICBOb3RpY2UgdGhhdCBlbnRyaWVzIGRvCisjIG5vdCBoYXZlIHdlaWdodHMgc2luY2UgdGhleSBhcmUgYWx3YXlzIHVzZWQgd2hlbiBmb3VuZC4gIFRoaXMgaXMgYnktZGVzaWduCisjIGluIG9yZGVyIHRvIG1heGltaXplIGVhc2Utb2YtdXNlLgorIworIyBFbnRyaWVzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgQ1NWIGZvcm1hdDoKKyMgIDx0ZXh0Piw8dG9rZW4gMT4gLi4uIDx0b2tlbiBuPiw8cmVhZGluZyAxPiAuLi4gPHJlYWRpbmcgbj4sPHBhcnQtb2Ytc3BlZWNoIHRhZz4KKyMKKyMgTm90aWNlIHRoYXQgYSBzaW5nbGUgaGFsZi13aWR0aCBzcGFjZSBzZXBhcmF0ZXMgdG9rZW5zIGFuZCByZWFkaW5ncywgYW5kCisjIHRoYXQgdGhlIG51bWJlciB0b2tlbnMgYW5kIHJlYWRpbmdzIG11c3QgbWF0Y2ggZXhhY3RseS4KKyMKKyMgQWxzbyBub3RpY2UgdGhhdCBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgPHRleHQ+IGlzIHVuZGVmaW5lZC4KKyMKKyMgV2hpdGVzcGFjZSBvbmx5IGxpbmVzIGFyZSBpZ25vcmVkLiAgQ29tbWVudHMgYXJlIG5vdCBhbGxvd2VkIG9uIGVudHJ5IGxpbmVzLgorIworCisjIEN1c3RvbSBzZWdtZW50YXRpb24gZm9yIGthbmppIGNvbXBvdW5kcwor5pel5pys57WM5riI5paw6IGeLOaXpeacrCDntYzmuIgg5paw6IGeLOODi+ODm+ODsyDjgrHjgqTjgrbjgqQg44K344Oz44OW44OzLOOCq+OCueOCv+ODoOWQjeipngor6Zai6KW/5Zu96Zqb56m65rivLOmWouilvyDlm73pmpsg56m65rivLOOCq+ODs+OCteOCpCDjgrPjgq/jgrXjgqQg44Kv44Km44Kz44KmLOOCq+OCueOCv+ODoOWQjeipngorCisjIEN1c3RvbSBzZWdtZW50YXRpb24gZm9yIGNvbXBvdW5kIGthdGFrYW5hCivjg4jjg7zjg4jjg5Djg4PjgrAs44OI44O844OIIOODkOODg+OCsCzjg4jjg7zjg4gg44OQ44OD44KwLOOBi+OBmuOCq+ODiuWQjeipngor44K344On44Or44OA44O844OQ44OD44KwLOOCt+ODp+ODq+ODgOODvCDjg5Djg4PjgrAs44K344On44Or44OA44O8IOODkOODg+OCsCzjgYvjgZrjgqvjg4rlkI3oqZ4KKworIyBDdXN0b20gcmVhZGluZyBmb3IgZm9ybWVyIHN1bW8gd3Jlc3RsZXIKK+acnemdkum+jSzmnJ3pnZLpvo0s44Ki44K144K344On44Km44Oq44Ol44KmLOOCq+OCueOCv+ODoOS6uuWQjQpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvcHJvdHdvcmRzLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3Byb3R3b3Jkcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmYzBhYgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3Byb3R3b3Jkcy50eHQKQEAgLTAsMCArMSwyMSBAQAorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVc2UgYSBwcm90ZWN0ZWQgd29yZCBmaWxlIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgc3RlbW1lciByZWR1Y2luZyB0d28KKyMgdW5yZWxhdGVkIHdvcmRzIHRvIHRoZSBzYW1lIGJhc2Ugd29yZC4KKworIyBTb21lIG5vbi13b3JkcyB0aGF0IG5vcm1hbGx5IHdvbid0IGJlIGVuY291bnRlcmVkLAorIyBqdXN0IHRvIHRlc3QgdGhhdCB0aGV5IHdvbid0IGJlIHN0ZW1tZWQuCitkb250c3RlbXMKK3p3aGFja3kKKwpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLnhtbCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTE1NzcxNQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS54bWwKQEAgLTAsMCArMSwxMDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAgCisgVGhpcyBpcyB0aGUgU29sciBzY2hlbWEgZmlsZS4gVGhpcyBmaWxlIHNob3VsZCBiZSBuYW1lZCAic2NoZW1hLnhtbCIgYW5kCisgc2hvdWxkIGJlIGluIHRoZSBjb25mIGRpcmVjdG9yeSB1bmRlciB0aGUgc29sciBob21lCisgKGkuZS4gLi9zb2xyL2NvbmYvc2NoZW1hLnhtbCBieSBkZWZhdWx0KSAKKyBvciBsb2NhdGVkIHdoZXJlIHRoZSBjbGFzc2xvYWRlciBmb3IgdGhlIFNvbHIgd2ViYXBwIGNhbiBmaW5kIGl0LgorCisgVGhpcyBleGFtcGxlIHNjaGVtYSBpcyB0aGUgcmVjb21tZW5kZWQgc3RhcnRpbmcgcG9pbnQgZm9yIHVzZXJzLgorIEl0IHNob3VsZCBiZSBrZXB0IGNvcnJlY3QgYW5kIGNvbmNpc2UsIHVzYWJsZSBvdXQtb2YtdGhlLWJveC4KKworIEZvciBtb3JlIGluZm9ybWF0aW9uLCBvbiBob3cgdG8gY3VzdG9taXplIHRoaXMgZmlsZSwgcGxlYXNlIHNlZQorIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TY2hlbWFYbWwKKworIFBFUkZPUk1BTkNFIE5PVEU6IHRoaXMgc2NoZW1hIGluY2x1ZGVzIG1hbnkgb3B0aW9uYWwgZmVhdHVyZXMgYW5kIHNob3VsZCBub3QKKyBiZSB1c2VkIGZvciBiZW5jaG1hcmtpbmcuICBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uZSBjb3VsZAorICAtIHNldCBzdG9yZWQ9ImZhbHNlIiBmb3IgYWxsIGZpZWxkcyBwb3NzaWJsZSAoZXNwIGxhcmdlIGZpZWxkcykgd2hlbiB5b3UKKyAgICBvbmx5IG5lZWQgdG8gc2VhcmNoIG9uIHRoZSBmaWVsZCBidXQgZG9uJ3QgbmVlZCB0byByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgdmFsdWUuCisgIC0gc2V0IGluZGV4ZWQ9ImZhbHNlIiBpZiB5b3UgZG9uJ3QgbmVlZCB0byBzZWFyY2ggb24gdGhlIGZpZWxkLCBidXQgb25seQorICAgIHJldHVybiB0aGUgZmllbGQgYXMgYSByZXN1bHQgb2Ygc2VhcmNoaW5nIG9uIG90aGVyIGluZGV4ZWQgZmllbGRzLgorICAtIHJlbW92ZSBhbGwgdW5uZWVkZWQgY29weUZpZWxkIHN0YXRlbWVudHMKKyAgLSBmb3IgYmVzdCBpbmRleCBzaXplIGFuZCBzZWFyY2hpbmcgcGVyZm9ybWFuY2UsIHNldCAiaW5kZXgiIHRvIGZhbHNlCisgICAgZm9yIGFsbCBnZW5lcmFsIHRleHQgZmllbGRzLCB1c2UgY29weUZpZWxkIHRvIGNvcHkgdGhlbSB0byB0aGUKKyAgICBjYXRjaGFsbCAidGV4dCIgZmllbGQsIGFuZCB1c2UgdGhhdCBmb3Igc2VhcmNoaW5nLgorICAtIEZvciBtYXhpbXVtIGluZGV4aW5nIHBlcmZvcm1hbmNlLCB1c2UgdGhlIFN0cmVhbWluZ1VwZGF0ZVNvbHJTZXJ2ZXIKKyAgICBqYXZhIGNsaWVudC4KKyAgLSBSZW1lbWJlciB0byBydW4gdGhlIEpWTSBpbiBzZXJ2ZXIgbW9kZSwgYW5kIHVzZSBhIGhpZ2hlciBsb2dnaW5nIGxldmVsCisgICAgdGhhdCBhdm9pZHMgbG9nZ2luZyBldmVyeSByZXF1ZXN0CistLT4KKworPHNjaGVtYSBuYW1lPSJleGFtcGxlLXNjaGVtYWxlc3MiIHZlcnNpb249IjEuNSI+CisgIDwhLS0gYXR0cmlidXRlICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGlzIHNjaGVtYSBhbmQgaXMgb25seSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICAgICAgIHZlcnNpb249IngueSIgaXMgU29scidzIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgc2NoZW1hIHN5bnRheCBhbmQgCisgICAgICAgc2VtYW50aWNzLiAgSXQgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBjaGFuZ2VkIGJ5IGFwcGxpY2F0aW9ucy4KKworICAgICAgIDEuMDogbXVsdGlWYWx1ZWQgYXR0cmlidXRlIGRpZCBub3QgZXhpc3QsIGFsbCBmaWVsZHMgYXJlIG11bHRpVmFsdWVkIAorICAgICAgICAgICAgYnkgbmF0dXJlCisgICAgICAgMS4xOiBtdWx0aVZhbHVlZCBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgZmFsc2UgYnkgZGVmYXVsdCAKKyAgICAgICAxLjI6IG9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucyBhdHRyaWJ1dGUgaW50cm9kdWNlZCwgdHJ1ZSBieSBkZWZhdWx0IAorICAgICAgICAgICAgZXhjZXB0IGZvciB0ZXh0IGZpZWxkcy4KKyAgICAgICAxLjM6IHJlbW92ZWQgb3B0aW9uYWwgZmllbGQgY29tcHJlc3MgZmVhdHVyZQorICAgICAgIDEuNDogYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcyBhdHRyaWJ1dGUgaW50cm9kdWNlZCB0byBkcml2ZSBRdWVyeVBhcnNlcgorICAgICAgICAgICAgYmVoYXZpb3Igd2hlbiBhIHNpbmdsZSBzdHJpbmcgcHJvZHVjZXMgbXVsdGlwbGUgdG9rZW5zLiAgRGVmYXVsdHMgCisgICAgICAgICAgICB0byBvZmYgZm9yIHZlcnNpb24gPj0gMS40CisgICAgICAgMS41OiBvbWl0Tm9ybXMgZGVmYXVsdHMgdG8gdHJ1ZSBmb3IgcHJpbWl0aXZlIGZpZWxkIHR5cGVzIAorICAgICAgICAgICAgKGludCwgZmxvYXQsIGJvb2xlYW4sIHN0cmluZy4uLikKKyAgICAgLS0+CisKKyAgPGZpZWxkcz4KKyAgICA8IS0tIFZhbGlkIGF0dHJpYnV0ZXMgZm9yIGZpZWxkczoKKyAgICAgbmFtZTogbWFuZGF0b3J5IC0gdGhlIG5hbWUgZm9yIHRoZSBmaWVsZAorICAgICB0eXBlOiBtYW5kYXRvcnkgLSB0aGUgbmFtZSBvZiBhIGZpZWxkIHR5cGUgZnJvbSB0aGUgCisgICAgICAgPHR5cGVzPiBmaWVsZFR5cGUgc2VjdGlvbgorICAgICBpbmRleGVkOiB0cnVlIGlmIHRoaXMgZmllbGQgc2hvdWxkIGJlIGluZGV4ZWQgKHNlYXJjaGFibGUgb3Igc29ydGFibGUpCisgICAgIHN0b3JlZDogdHJ1ZSBpZiB0aGlzIGZpZWxkIHNob3VsZCBiZSByZXRyaWV2YWJsZQorICAgICBkb2NWYWx1ZXM6IHRydWUgaWYgdGhpcyBmaWVsZCBzaG91bGQgaGF2ZSBkb2MgdmFsdWVzLiBEb2MgdmFsdWVzIGFyZQorICAgICAgIHVzZWZ1bCBmb3IgZmFjZXRpbmcsIGdyb3VwaW5nLCBzb3J0aW5nIGFuZCBmdW5jdGlvbiBxdWVyaWVzLiBBbHRob3VnaCBub3QKKyAgICAgICByZXF1aXJlZCwgZG9jIHZhbHVlcyB3aWxsIG1ha2UgdGhlIGluZGV4IGZhc3RlciB0byBsb2FkLCBtb3JlCisgICAgICAgTlJULWZyaWVuZGx5IGFuZCBtb3JlIG1lbW9yeS1lZmZpY2llbnQuIFRoZXkgaG93ZXZlciBjb21lIHdpdGggc29tZQorICAgICAgIGxpbWl0YXRpb25zOiB0aGV5IGFyZSBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkgU3RyRmllbGQsIFVVSURGaWVsZAorICAgICAgIGFuZCBhbGwgVHJpZSpGaWVsZHMsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUsIHRoZXkgbWlnaHQKKyAgICAgICByZXF1aXJlIHRoZSBmaWVsZCB0byBiZSBzaW5nbGUtdmFsdWVkLCBiZSByZXF1aXJlZCBvciBoYXZlIGEgZGVmYXVsdAorICAgICAgIHZhbHVlIChjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmllbGQgdHlwZSB5b3UncmUgaW50ZXJlc3RlZCBpbgorICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uKQorICAgICBtdWx0aVZhbHVlZDogdHJ1ZSBpZiB0aGlzIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIHZhbHVlcyBwZXIgZG9jdW1lbnQKKyAgICAgb21pdE5vcm1zOiAoZXhwZXJ0KSBzZXQgdG8gdHJ1ZSB0byBvbWl0IHRoZSBub3JtcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICB0aGlzIGZpZWxkICh0aGlzIGRpc2FibGVzIGxlbmd0aCBub3JtYWxpemF0aW9uIGFuZCBpbmRleC10aW1lCisgICAgICAgYm9vc3RpbmcgZm9yIHRoZSBmaWVsZCwgYW5kIHNhdmVzIHNvbWUgbWVtb3J5KS4gIE9ubHkgZnVsbC10ZXh0CisgICAgICAgZmllbGRzIG9yIGZpZWxkcyB0aGF0IG5lZWQgYW4gaW5kZXgtdGltZSBib29zdCBuZWVkIG5vcm1zLgorICAgICAgIE5vcm1zIGFyZSBvbWl0dGVkIGZvciBwcmltaXRpdmUgKG5vbi1hbmFseXplZCkgdHlwZXMgYnkgZGVmYXVsdC4KKyAgICAgdGVybVZlY3RvcnM6IFtmYWxzZV0gc2V0IHRvIHRydWUgdG8gc3RvcmUgdGhlIHRlcm0gdmVjdG9yIGZvciBhCisgICAgICAgZ2l2ZW4gZmllbGQuCisgICAgICAgV2hlbiB1c2luZyBNb3JlTGlrZVRoaXMsIGZpZWxkcyB1c2VkIGZvciBzaW1pbGFyaXR5IHNob3VsZCBiZQorICAgICAgIHN0b3JlZCBmb3IgYmVzdCBwZXJmb3JtYW5jZS4KKyAgICAgdGVybVBvc2l0aW9uczogU3RvcmUgcG9zaXRpb24gaW5mb3JtYXRpb24gd2l0aCB0aGUgdGVybSB2ZWN0b3IuICAKKyAgICAgICBUaGlzIHdpbGwgaW5jcmVhc2Ugc3RvcmFnZSBjb3N0cy4KKyAgICAgdGVybU9mZnNldHM6IFN0b3JlIG9mZnNldCBpbmZvcm1hdGlvbiB3aXRoIHRoZSB0ZXJtIHZlY3Rvci4gVGhpcyAKKyAgICAgICB3aWxsIGluY3JlYXNlIHN0b3JhZ2UgY29zdHMuCisgICAgIHJlcXVpcmVkOiBUaGUgZmllbGQgaXMgcmVxdWlyZWQuICBJdCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZQorICAgICAgIHZhbHVlIGRvZXMgbm90IGV4aXN0CisgICAgIGRlZmF1bHQ6IGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQKKyAgICAgICB3aGVuIGFkZGluZyBhIGRvY3VtZW50LgorICAgLS0+CisKKyAgICA8IS0tIGZpZWxkIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBvciB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgb25seSBhbmQKKyAgICAgIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQuICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3RyaWN0bHkgZW5mb3JjZWQsCisgICAgICBidXQgb3RoZXIgZmllbGQgbmFtZXMgd2lsbCBub3QgaGF2ZSBmaXJzdCBjbGFzcyBzdXBwb3J0IGZyb20gYWxsIGNvbXBvbmVudHMKKyAgICAgIGFuZCBiYWNrIGNvbXBhdGliaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuICBOYW1lcyB3aXRoIGJvdGggbGVhZGluZyBhbmQKKyAgICAgIHRyYWlsaW5nIHVuZGVyc2NvcmVzIChlLmcuIF92ZXJzaW9uXykgYXJlIHJlc2VydmVkLgorICAgLS0+CisKKyAgICA8IS0tIEluIHRoaXMgInNjaGVtYWxlc3MiIGV4YW1wbGUsIG9ubHkgdHdvIGZpZWxkcyBhcmUgcHJlLWRlY2xhcmVkOiBpZCBhbmQgX3ZlcnNpb25fLgorICAgICAgICAgQWxsIG90aGVyIGZpZWxkcyB3aWxsIGJlIHR5cGUgZ3Vlc3NlZCBhbmQgYWRkZWQgdmlhIHRoZQorICAgICAgICAgImFkZC11bmtub3duLWZpZWxkcy10by10aGUtc2NoZW1hIiB1cGRhdGUgcmVxdWVzdCBwcm9jZXNzb3IgY2hhaW4gZGVjbGFyZWQgCisgICAgICAgICBpbiBzb2xyY29uZmlnLnhtbC4KKyAgICAgIC0tPgorICAgIDxmaWVsZCBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0iZmFsc2UiIC8+CisgICAgPGZpZWxkIG5hbWU9Il92ZXJzaW9uXyIgdHlwZT0ibG9uZyIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIi8+CisKKworICAgIDwhLS0gRHluYW1pYyBmaWVsZCBkZWZpbml0aW9ucyBhbGxvdyB1c2luZyBjb252ZW50aW9uIG92ZXIgY29uZmlndXJhdGlvbgorICAgICAgIGZvciBmaWVsZHMgdmlhIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHBhdHRlcm5zIHRvIG1hdGNoIGZpZWxkIG5hbWVzLiAKKyAgICAgICBFWEFNUExFOiAgbmFtZT0iKl9pIiB3aWxsIG1hdGNoIGFueSBmaWVsZCBlbmRpbmcgaW4gX2kgKGxpa2UgbXlpZF9pLCB6X2kpCisgICAgICAgUkVTVFJJQ1RJT046IHRoZSBnbG9iLWxpa2UgcGF0dGVybiBpbiB0aGUgbmFtZSBhdHRyaWJ1dGUgbXVzdCBoYXZlCisgICAgICAgYSAiKiIgb25seSBhdCB0aGUgc3RhcnQgb3IgdGhlIGVuZC4gIC0tPgorICAgCisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2kiICB0eXBlPSJpbnQiICAgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfaXMiIHR5cGU9ImludCIgICAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIgIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX3MiICB0eXBlPSJzdHJpbmciICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIiAvPgorICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9zcyIgdHlwZT0ic3RyaW5nIiAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfbCIgIHR5cGU9ImxvbmciICAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIvPgorICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9scyIgdHlwZT0ibG9uZyIgICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIiAgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdCIgIHR5cGU9InRleHRfZ2VuZXJhbCIgICAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIvPgorICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl90eHQiIHR5cGU9InRleHRfZ2VuZXJhbCIgICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0idHJ1ZSIvPgorICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9lbiIgIHR5cGU9InRleHRfZW4iICAgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2IiICB0eXBlPSJib29sZWFuIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfYnMiIHR5cGU9ImJvb2xlYW4iIGluZGV4ZWQ9InRydWUiIHN0b3JlZD0idHJ1ZSIgIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2YiICB0eXBlPSJmbG9hdCIgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfZnMiIHR5cGU9ImZsb2F0IiAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIgIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2QiICB0eXBlPSJkb3VibGUiIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfZHMiIHR5cGU9ImRvdWJsZSIgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIgIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisKKyAgICA8IS0tIFR5cGUgdXNlZCB0byBpbmRleCB0aGUgbGF0IGFuZCBsb24gY29tcG9uZW50cyBmb3IgdGhlICJsb2NhdGlvbiIgRmllbGRUeXBlIC0tPgorICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9jb29yZGluYXRlIiAgdHlwZT0idGRvdWJsZSIgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0iZmFsc2UiIC8+CisKKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfZHQiICB0eXBlPSJkYXRlIiAgICBpbmRleGVkPSJ0cnVlIiAgc3RvcmVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSIqX2R0cyIgdHlwZT0iZGF0ZSIgICAgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfcCIgIHR5cGU9ImxvY2F0aW9uIiBpbmRleGVkPSJ0cnVlIiBzdG9yZWQ9InRydWUiLz4KKworICAgIDwhLS0gc29tZSB0cmllLWNvZGVkIGR5bmFtaWMgZmllbGRzIGZvciBmYXN0ZXIgcmFuZ2UgcXVlcmllcyAtLT4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGkiIHR5cGU9InRpbnQiICAgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGwiIHR5cGU9InRsb25nIiAgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGYiIHR5cGU9InRmbG9hdCIgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGQiIHR5cGU9InRkb3VibGUiIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfdGR0IiB0eXBlPSJ0ZGF0ZSIgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKworICAgIDxkeW5hbWljRmllbGQgbmFtZT0iKl9waSIgIHR5cGU9InBpbnQiICAgIGluZGV4ZWQ9InRydWUiICBzdG9yZWQ9InRydWUiLz4KKyAgICA8ZHluYW1pY0ZpZWxkIG5hbWU9IipfYyIgICB0eXBlPSJjdXJyZW5jeSIgaW5kZXhlZD0idHJ1ZSIgIHN0b3JlZD0idHJ1ZSIvPgorCisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSJpZ25vcmVkXyoiIHR5cGU9Imlnbm9yZWQiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSJhdHRyXyoiIHR5cGU9InRleHRfZ2VuZXJhbCIgaW5kZXhlZD0idHJ1ZSIgc3RvcmVkPSJ0cnVlIiBtdWx0aVZhbHVlZD0idHJ1ZSIvPgorCisgICAgPGR5bmFtaWNGaWVsZCBuYW1lPSJyYW5kb21fKiIgdHlwZT0icmFuZG9tIiAvPgorCisgICAgPCEtLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBpZ25vcmUgYW55IGZpZWxkcyB0aGF0IGRvbid0IGFscmVhZHkgbWF0Y2ggYW4gZXhpc3RpbmcgCisgICAgICAgIGZpZWxkIG5hbWUgb3IgZHluYW1pYyBmaWVsZCwgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZW0gYXMgYW4gZXJyb3IuIAorICAgICAgICBhbHRlcm5hdGVseSwgY2hhbmdlIHRoZSB0eXBlPSJpZ25vcmVkIiB0byBzb21lIG90aGVyIHR5cGUgZS5nLiAidGV4dCIgaWYgeW91IHdhbnQgCisgICAgICAgIHVua25vd24gZmllbGRzIGluZGV4ZWQgYW5kL29yIHN0b3JlZCBieSBkZWZhdWx0IAorICAgICAgICAKKyAgICAgICAgTkI6IHVzZSBvZiAiKiIgZHluYW1pYyBmaWVsZHMgd2lsbCBkaXNhYmxlIGZpZWxkIHR5cGUgZ3Vlc3NpbmcgYW5kIGFkZGluZworICAgICAgICB1bmtub3duIGZpZWxkcyB0byB0aGUgc2NoZW1hLiAtLT4gCisgICAgPCEtLWR5bmFtaWNGaWVsZCBuYW1lPSIqIiB0eXBlPSJpZ25vcmVkIiBtdWx0aVZhbHVlZD0idHJ1ZSIgLy0tPgorICAgCisgIDwvZmllbGRzPgorCisKKyAgPCEtLSBGaWVsZCB0byB1c2UgdG8gZGV0ZXJtaW5lIGFuZCBlbmZvcmNlIGRvY3VtZW50IHVuaXF1ZW5lc3MuIAorICAgICAgVW5sZXNzIHRoaXMgZmllbGQgaXMgbWFya2VkIHdpdGggcmVxdWlyZWQ9ImZhbHNlIiwgaXQgd2lsbCBiZSBhIHJlcXVpcmVkIGZpZWxkCisgICAtLT4KKyAgPHVuaXF1ZUtleT5pZDwvdW5pcXVlS2V5PgorCisgIDwhLS0gREVQUkVDQVRFRDogVGhlIGRlZmF1bHRTZWFyY2hGaWVsZCBpcyBjb25zdWx0ZWQgYnkgdmFyaW91cyBxdWVyeSBwYXJzZXJzIHdoZW4KKyAgcGFyc2luZyBhIHF1ZXJ5IHN0cmluZyB0aGF0IGlzbid0IGV4cGxpY2l0IGFib3V0IHRoZSBmaWVsZC4gIE1hY2hpbmUgKG5vbi11c2VyKQorICBnZW5lcmF0ZWQgcXVlcmllcyBhcmUgYmVzdCBtYWRlIGV4cGxpY2l0LCBvciB0aGV5IGNhbiB1c2UgdGhlICJkZiIgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMuCisgIE5vdGU6IFVuLWNvbW1lbnRpbmcgZGVmYXVsdFNlYXJjaEZpZWxkIHdpbGwgYmUgaW5zdWZmaWNpZW50IGlmIHlvdXIgcmVxdWVzdCBoYW5kbGVyCisgIGluIHNvbHJjb25maWcueG1sIGRlZmluZXMgImRmIiwgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZS4gVGhhdCB3b3VsZCBuZWVkIHRvIGJlIHJlbW92ZWQuCisgPGRlZmF1bHRTZWFyY2hGaWVsZD50ZXh0PC9kZWZhdWx0U2VhcmNoRmllbGQ+IC0tPgorCisgIDwhLS0gREVQUkVDQVRFRDogVGhlIGRlZmF1bHRPcGVyYXRvciAoQU5EfE9SKSBpcyBjb25zdWx0ZWQgYnkgdmFyaW91cyBxdWVyeSBwYXJzZXJzCisgIHdoZW4gcGFyc2luZyBhIHF1ZXJ5IHN0cmluZyB0byBkZXRlcm1pbmUgaWYgYSBjbGF1c2Ugb2YgdGhlIHF1ZXJ5IHNob3VsZCBiZSBtYXJrZWQgYXMKKyAgcmVxdWlyZWQgb3Igb3B0aW9uYWwsIGFzc3VtaW5nIHRoZSBjbGF1c2UgaXNuJ3QgYWxyZWFkeSBtYXJrZWQgYnkgc29tZSBvcGVyYXRvci4KKyAgVGhlIGRlZmF1bHQgaXMgT1IsIHdoaWNoIGlzIGdlbmVyYWxseSBhc3N1bWVkIHNvIGl0IGlzIG5vdCBhIGdvb2QgaWRlYSB0byBjaGFuZ2UgaXQKKyAgZ2xvYmFsbHkgaGVyZS4gIFRoZSAicS5vcCIgcmVxdWVzdCBwYXJhbWV0ZXIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMuCisgPHNvbHJRdWVyeVBhcnNlciBkZWZhdWx0T3BlcmF0b3I9Ik9SIi8+IC0tPgorCisgIDwhLS0gY29weUZpZWxkIGNvbW1hbmRzIGNvcHkgb25lIGZpZWxkIHRvIGFub3RoZXIgYXQgdGhlIHRpbWUgYSBkb2N1bWVudAorICAgICAgICBpcyBhZGRlZCB0byB0aGUgaW5kZXguICBJdCdzIHVzZWQgZWl0aGVyIHRvIGluZGV4IHRoZSBzYW1lIGZpZWxkIGRpZmZlcmVudGx5LAorICAgICAgICBvciB0byBhZGQgbXVsdGlwbGUgZmllbGRzIHRvIHRoZSBzYW1lIGZpZWxkIGZvciBlYXNpZXIvZmFzdGVyIHNlYXJjaGluZy4KKworICAgPGNvcHlGaWVsZCBzb3VyY2U9ImNhdCIgZGVzdD0idGV4dCIvPgorICAgPGNvcHlGaWVsZCBzb3VyY2U9Im5hbWUiIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJtYW51IiBkZXN0PSJ0ZXh0Ii8+CisgICA8Y29weUZpZWxkIHNvdXJjZT0iZmVhdHVyZXMiIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJpbmNsdWRlcyIgZGVzdD0idGV4dCIvPgorICAgPGNvcHlGaWVsZCBzb3VyY2U9Im1hbnUiIGRlc3Q9Im1hbnVfZXhhY3QiLz4KKyAgIC0tPgorCisgIDwhLS0gQ29weSB0aGUgcHJpY2UgaW50byBhIGN1cnJlbmN5IGVuYWJsZWQgZmllbGQgKGRlZmF1bHQgVVNEKQorICAgPGNvcHlGaWVsZCBzb3VyY2U9InByaWNlIiBkZXN0PSJwcmljZV9jIi8+CisgICAtLT4KKworICA8IS0tIFRleHQgZmllbGRzIGZyb20gU29sckNlbGwgdG8gc2VhcmNoIGJ5IGRlZmF1bHQgaW4gb3VyIGNhdGNoLWFsbCBmaWVsZAorICAgPGNvcHlGaWVsZCBzb3VyY2U9InRpdGxlIiBkZXN0PSJ0ZXh0Ii8+CisgICA8Y29weUZpZWxkIHNvdXJjZT0iYXV0aG9yIiBkZXN0PSJ0ZXh0Ii8+CisgICA8Y29weUZpZWxkIHNvdXJjZT0iZGVzY3JpcHRpb24iIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJrZXl3b3JkcyIgZGVzdD0idGV4dCIvPgorICAgPGNvcHlGaWVsZCBzb3VyY2U9ImNvbnRlbnQiIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJjb250ZW50X3R5cGUiIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJyZXNvdXJjZW5hbWUiIGRlc3Q9InRleHQiLz4KKyAgIDxjb3B5RmllbGQgc291cmNlPSJ1cmwiIGRlc3Q9InRleHQiLz4KKyAgIC0tPgorCisgIDwhLS0gQ3JlYXRlIGEgc3RyaW5nIHZlcnNpb24gb2YgYXV0aG9yIGZvciBmYWNldGluZworICAgPGNvcHlGaWVsZCBzb3VyY2U9ImF1dGhvciIgZGVzdD0iYXV0aG9yX3MiLz4KKyAgIC0tPgorCQorICA8IS0tIEFib3ZlLCBtdWx0aXBsZSBzb3VyY2UgZmllbGRzIGFyZSBjb3BpZWQgdG8gdGhlIFt0ZXh0XSBmaWVsZC4gCisJICBBbm90aGVyIHdheSB0byBtYXAgbXVsdGlwbGUgc291cmNlIGZpZWxkcyB0byB0aGUgc2FtZSAKKwkgIGRlc3RpbmF0aW9uIGZpZWxkIGlzIHRvIHVzZSB0aGUgZHluYW1pYyBmaWVsZCBzeW50YXguIAorCSAgY29weUZpZWxkIGFsc28gc3VwcG9ydHMgYSBtYXhDaGFycyB0byBjb3B5IHNldHRpbmcuICAtLT4KKwkgICAKKyAgPCEtLSA8Y29weUZpZWxkIHNvdXJjZT0iKl90IiBkZXN0PSJ0ZXh0IiBtYXhDaGFycz0iMzAwMCIvPiAtLT4KKworICA8IS0tIGNvcHkgbmFtZSB0byBhbHBoYU5hbWVTb3J0LCBhIGZpZWxkIGRlc2lnbmVkIGZvciBzb3J0aW5nIGJ5IG5hbWUgLS0+CisgIDwhLS0gPGNvcHlGaWVsZCBzb3VyY2U9Im5hbWUiIGRlc3Q9ImFscGhhTmFtZVNvcnQiLz4gLS0+CisgCisgIDx0eXBlcz4KKyAgICA8IS0tIGZpZWxkIHR5cGUgZGVmaW5pdGlvbnMuIFRoZSAibmFtZSIgYXR0cmlidXRlIGlzCisgICAgICAganVzdCBhIGxhYmVsIHRvIGJlIHVzZWQgYnkgZmllbGQgZGVmaW5pdGlvbnMuICBUaGUgImNsYXNzIgorICAgICAgIGF0dHJpYnV0ZSBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHRoZSByZWFsCisgICAgICAgYmVoYXZpb3Igb2YgdGhlIGZpZWxkVHlwZS4KKyAgICAgICAgIENsYXNzIG5hbWVzIHN0YXJ0aW5nIHdpdGggInNvbHIiIHJlZmVyIHRvIGphdmEgY2xhc3NlcyBpbiBhCisgICAgICAgc3RhbmRhcmQgcGFja2FnZSBzdWNoIGFzIG9yZy5hcGFjaGUuc29sci5hbmFseXNpcworICAgIC0tPgorCisgICAgPCEtLSBUaGUgU3RyRmllbGQgdHlwZSBpcyBub3QgYW5hbHl6ZWQsIGJ1dCBpbmRleGVkL3N0b3JlZCB2ZXJiYXRpbS4KKyAgICAgICBJdCBzdXBwb3J0cyBkb2MgdmFsdWVzIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIGZpZWxkIG5lZWRzIHRvIGJlCisgICAgICAgc2luZ2xlLXZhbHVlZCBhbmQgZWl0aGVyIHJlcXVpcmVkIG9yIGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICAgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJzdHJpbmciIGNsYXNzPSJzb2xyLlN0ckZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiIC8+CisKKyAgICA8IS0tIGJvb2xlYW4gdHlwZTogInRydWUiIG9yICJmYWxzZSIgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJib29sZWFuIiBjbGFzcz0ic29sci5Cb29sRmllbGQiIHNvcnRNaXNzaW5nTGFzdD0idHJ1ZSIvPgorCisgICAgPGZpZWxkVHlwZSBuYW1lPSJib29sZWFucyIgY2xhc3M9InNvbHIuQm9vbEZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisKKyAgICA8IS0tIHNvcnRNaXNzaW5nTGFzdCBhbmQgc29ydE1pc3NpbmdGaXJzdCBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCBhdHRyaWJ1dGVzIGFyZQorICAgICAgICAgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0eXBlcyB0aGF0IGFyZSBzb3J0ZWQgaW50ZXJuYWxseSBhcyBzdHJpbmdzCisgICAgICAgICBhbmQgb24gbnVtZXJpYyB0eXBlcy4KKwkgICAgIFRoaXMgaW5jbHVkZXMgInN0cmluZyIsImJvb2xlYW4iLCBhbmQsIGFzIG9mIDMuNSAoYW5kIDQueCksCisJICAgICBpbnQsIGZsb2F0LCBsb25nLCBkYXRlLCBkb3VibGUsIGluY2x1ZGluZyB0aGUgIlRyaWUiIHZhcmlhbnRzLgorICAgICAgIC0gSWYgc29ydE1pc3NpbmdMYXN0PSJ0cnVlIiwgdGhlbiBhIHNvcnQgb24gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIGRvY3VtZW50cworICAgICAgICAgd2l0aG91dCB0aGUgZmllbGQgdG8gY29tZSBhZnRlciBkb2N1bWVudHMgd2l0aCB0aGUgZmllbGQsCisgICAgICAgICByZWdhcmRsZXNzIG9mIHRoZSByZXF1ZXN0ZWQgc29ydCBvcmRlciAoYXNjIG9yIGRlc2MpLgorICAgICAgIC0gSWYgc29ydE1pc3NpbmdGaXJzdD0idHJ1ZSIsIHRoZW4gYSBzb3J0IG9uIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBkb2N1bWVudHMKKyAgICAgICAgIHdpdGhvdXQgdGhlIGZpZWxkIHRvIGNvbWUgYmVmb3JlIGRvY3VtZW50cyB3aXRoIHRoZSBmaWVsZCwKKyAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlcXVlc3RlZCBzb3J0IG9yZGVyLgorICAgICAgIC0gSWYgc29ydE1pc3NpbmdMYXN0PSJmYWxzZSIgYW5kIHNvcnRNaXNzaW5nRmlyc3Q9ImZhbHNlIiAodGhlIGRlZmF1bHQpLAorICAgICAgICAgdGhlbiBkZWZhdWx0IGx1Y2VuZSBzb3J0aW5nIHdpbGwgYmUgdXNlZCB3aGljaCBwbGFjZXMgZG9jcyB3aXRob3V0IHRoZQorICAgICAgICAgZmllbGQgZmlyc3QgaW4gYW4gYXNjZW5kaW5nIHNvcnQgYW5kIGxhc3QgaW4gYSBkZXNjZW5kaW5nIHNvcnQuCisgICAgLS0+ICAgIAorCisgICAgPCEtLQorICAgICAgRGVmYXVsdCBudW1lcmljIGZpZWxkIHR5cGVzLiBGb3IgZmFzdGVyIHJhbmdlIHF1ZXJpZXMsIGNvbnNpZGVyIHRoZSB0aW50L3RmbG9hdC90bG9uZy90ZG91YmxlIHR5cGVzLgorCisgICAgICBUaGVzZSBmaWVsZHMgc3VwcG9ydCBkb2MgdmFsdWVzLCBidXQgdGhleSByZXF1aXJlIHRoZSBmaWVsZCB0byBiZQorICAgICAgc2luZ2xlLXZhbHVlZCBhbmQgZWl0aGVyIGJlIHJlcXVpcmVkIG9yIGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iaW50IiBjbGFzcz0ic29sci5UcmllSW50RmllbGQiIHByZWNpc2lvblN0ZXA9IjAiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJmbG9hdCIgY2xhc3M9InNvbHIuVHJpZUZsb2F0RmllbGQiIHByZWNpc2lvblN0ZXA9IjAiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb25nIiBjbGFzcz0ic29sci5UcmllTG9uZ0ZpZWxkIiBwcmVjaXNpb25TdGVwPSIwIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iZG91YmxlIiBjbGFzcz0ic29sci5UcmllRG91YmxlRmllbGQiIHByZWNpc2lvblN0ZXA9IjAiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisKKyAgICA8IS0tCisgICAgIE51bWVyaWMgZmllbGQgdHlwZXMgdGhhdCBpbmRleCBlYWNoIHZhbHVlIGF0IHZhcmlvdXMgbGV2ZWxzIG9mIHByZWNpc2lvbgorICAgICB0byBhY2NlbGVyYXRlIHJhbmdlIHF1ZXJpZXMgd2hlbiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBiZXR3ZWVuIHRoZSByYW5nZQorICAgICBlbmRwb2ludHMgaXMgbGFyZ2UuIFNlZSB0aGUgamF2YWRvYyBmb3IgTnVtZXJpY1JhbmdlUXVlcnkgZm9yIGludGVybmFsCisgICAgIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKKyAgICAgU21hbGxlciBwcmVjaXNpb25TdGVwIHZhbHVlcyAoc3BlY2lmaWVkIGluIGJpdHMpIHdpbGwgbGVhZCB0byBtb3JlIHRva2VucworICAgICBpbmRleGVkIHBlciB2YWx1ZSwgc2xpZ2h0bHkgbGFyZ2VyIGluZGV4IHNpemUsIGFuZCBmYXN0ZXIgcmFuZ2UgcXVlcmllcy4KKyAgICAgQSBwcmVjaXNpb25TdGVwIG9mIDAgZGlzYWJsZXMgaW5kZXhpbmcgYXQgZGlmZmVyZW50IHByZWNpc2lvbiBsZXZlbHMuCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0aW50IiBjbGFzcz0ic29sci5UcmllSW50RmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZmxvYXQiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIvPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGxvbmciIGNsYXNzPSJzb2xyLlRyaWVMb25nRmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZG91YmxlIiBjbGFzcz0ic29sci5UcmllRG91YmxlRmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisgICAgCisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0aW50cyIgY2xhc3M9InNvbHIuVHJpZUludEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRmbG9hdHMiIGNsYXNzPSJzb2xyLlRyaWVGbG9hdEZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRsb25ncyIgY2xhc3M9InNvbHIuVHJpZUxvbmdGaWVsZCIgcHJlY2lzaW9uU3RlcD0iOCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZG91YmxlcyIgY2xhc3M9InNvbHIuVHJpZURvdWJsZUZpZWxkIiBwcmVjaXNpb25TdGVwPSI4IiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMCIgbXVsdGlWYWx1ZWQ9InRydWUiLz4KKworICAgIDwhLS0gVGhlIGZvcm1hdCBmb3IgdGhpcyBkYXRlIGZpZWxkIGlzIG9mIHRoZSBmb3JtIDE5OTUtMTItMzFUMjM6NTk6NTlaLCBhbmQKKyAgICAgICAgIGlzIGEgbW9yZSByZXN0cmljdGVkIGZvcm0gb2YgdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiBkYXRlVGltZQorICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lICAgIAorICAgICAgICAgVGhlIHRyYWlsaW5nICJaIiBkZXNpZ25hdGVzIFVUQyB0aW1lIGFuZCBpcyBtYW5kYXRvcnkuCisgICAgICAgICBPcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMgYXJlIGFsbG93ZWQ6IDE5OTUtMTItMzFUMjM6NTk6NTkuOTk5WgorICAgICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgYXJlIG1hbmRhdG9yeS4KKworICAgICAgICAgRXhwcmVzc2lvbnMgY2FuIGFsc28gYmUgdXNlZCB0byBkZW5vdGUgY2FsY3VsYXRpb25zIHRoYXQgc2hvdWxkIGJlCisgICAgICAgICBwZXJmb3JtZWQgcmVsYXRpdmUgdG8gIk5PVyIgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSwgaWUuLi4KKworICAgICAgICAgICAgICAgTk9XL0hPVVIKKyAgICAgICAgICAgICAgICAgIC4uLiBSb3VuZCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaG91cgorICAgICAgICAgICAgICAgTk9XLTFEQVkKKyAgICAgICAgICAgICAgICAgIC4uLiBFeGFjdGx5IDEgZGF5IHByaW9yIHRvIG5vdworICAgICAgICAgICAgICAgTk9XL0RBWSs2TU9OVEhTKzNEQVlTCisgICAgICAgICAgICAgICAgICAuLi4gNiBtb250aHMgYW5kIDMgZGF5cyBpbiB0aGUgZnV0dXJlIGZyb20gdGhlIHN0YXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZGF5CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBDb25zdWx0IHRoZSBEYXRlRmllbGQgamF2YWRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgIE5vdGU6IEZvciBmYXN0ZXIgcmFuZ2UgcXVlcmllcywgY29uc2lkZXIgdGhlIHRkYXRlIHR5cGUKKyAgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iZGF0ZSIgY2xhc3M9InNvbHIuVHJpZURhdGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iMCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiLz4KKworICAgIDwhLS0gQSBUcmllIGJhc2VkIGRhdGUgZmllbGQgZm9yIGZhc3RlciBkYXRlIHJhbmdlIHF1ZXJpZXMgYW5kIGRhdGUgZmFjZXRpbmcuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGRhdGUiIGNsYXNzPSJzb2xyLlRyaWVEYXRlRmllbGQiIHByZWNpc2lvblN0ZXA9IjYiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIwIi8+CisKKyAgICA8ZmllbGRUeXBlIG5hbWU9InRkYXRlcyIgY2xhc3M9InNvbHIuVHJpZURhdGVGaWVsZCIgcHJlY2lzaW9uU3RlcD0iNiIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjAiIG11bHRpVmFsdWVkPSJ0cnVlIi8+CisKKworICAgIDwhLS1CaW5hcnkgZGF0YSB0eXBlLiBUaGUgZGF0YSBzaG91bGQgYmUgc2VudC9yZXRyaWV2ZWQgaW4gYXMgQmFzZTY0IGVuY29kZWQgU3RyaW5ncyAtLT4KKyAgICA8ZmllbGR0eXBlIG5hbWU9ImJpbmFyeSIgY2xhc3M9InNvbHIuQmluYXJ5RmllbGQiLz4KKworICAgIDwhLS0KKyAgICAgIE5vdGU6CisgICAgICBUaGVzZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgaW5kZXhlcyAoY3JlYXRlZCB3aXRoIGx1Y2VuZSBvciBvbGRlciBTb2xyIHZlcnNpb25zKS4KKyAgICAgIFVzZSBUcmllIGJhc2VkIGZpZWxkcyBpbnN0ZWFkLiBBcyBvZiBTb2xyIDMuNSBhbmQgNC54LCBUcmllIGJhc2VkIGZpZWxkcyBzdXBwb3J0IHNvcnRNaXNzaW5nRmlyc3QvTGFzdAorICAgICAgCisgICAgICBQbGFpbiBudW1lcmljIGZpZWxkIHR5cGVzIHRoYXQgc3RvcmUgYW5kIGluZGV4IHRoZSB0ZXh0CisgICAgICB2YWx1ZSB2ZXJiYXRpbSAoYW5kIGhlbmNlIGRvbid0IGNvcnJlY3RseSBzdXBwb3J0IHJhbmdlIHF1ZXJpZXMsIHNpbmNlIHRoZQorICAgICAgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBpc24ndCBlcXVhbCB0byB0aGUgbnVtZXJpYyBvcmRlcmluZykKKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBpbnQiIGNsYXNzPSJzb2xyLkludEZpZWxkIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJwbG9uZyIgY2xhc3M9InNvbHIuTG9uZ0ZpZWxkIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJwZmxvYXQiIGNsYXNzPSJzb2xyLkZsb2F0RmllbGQiLz4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InBkb3VibGUiIGNsYXNzPSJzb2xyLkRvdWJsZUZpZWxkIi8+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJwZGF0ZSIgY2xhc3M9InNvbHIuRGF0ZUZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiLz4KKworICAgIDwhLS0gVGhlICJSYW5kb21Tb3J0RmllbGQiIGlzIG5vdCB1c2VkIHRvIHN0b3JlIG9yIHNlYXJjaCBhbnkKKyAgICAgICAgIGRhdGEuICBZb3UgY2FuIGRlY2xhcmUgZmllbGRzIG9mIHRoaXMgdHlwZSBpdCBpbiB5b3VyIHNjaGVtYQorICAgICAgICAgdG8gZ2VuZXJhdGUgcHNldWRvLXJhbmRvbSBvcmRlcmluZ3Mgb2YgeW91ciBkb2NzIGZvciBzb3J0aW5nIAorICAgICAgICAgb3IgZnVuY3Rpb24gcHVycG9zZXMuICBUaGUgb3JkZXJpbmcgaXMgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBmaWVsZAorICAgICAgICAgbmFtZSBhbmQgdGhlIHZlcnNpb24gb2YgdGhlIGluZGV4LiBBcyBsb25nIGFzIHRoZSBpbmRleCB2ZXJzaW9uCisgICAgICAgICByZW1haW5zIHVuY2hhbmdlZCwgYW5kIHRoZSBzYW1lIGZpZWxkIG5hbWUgaXMgcmV1c2VkLAorICAgICAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSBkb2NzIHdpbGwgYmUgY29uc2lzdGVudC4gIAorICAgICAgICAgSWYgeW91IHdhbnQgZGlmZmVyZW50IHBzdWVkby1yYW5kb20gb3JkZXJpbmdzIG9mIGRvY3VtZW50cywKKyAgICAgICAgIGZvciB0aGUgc2FtZSB2ZXJzaW9uIG9mIHRoZSBpbmRleCwgdXNlIGEgZHluYW1pY0ZpZWxkIGFuZAorICAgICAgICAgY2hhbmdlIHRoZSBmaWVsZCBuYW1lIGluIHRoZSByZXF1ZXN0LgorICAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InJhbmRvbSIgY2xhc3M9InNvbHIuUmFuZG9tU29ydEZpZWxkIiBpbmRleGVkPSJ0cnVlIiAvPgorCisgICAgPCEtLSBzb2xyLlRleHRGaWVsZCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgY3VzdG9tIHRleHQgYW5hbHl6ZXJzCisgICAgICAgICBzcGVjaWZpZWQgYXMgYSB0b2tlbml6ZXIgYW5kIGEgbGlzdCBvZiB0b2tlbiBmaWx0ZXJzLiBEaWZmZXJlbnQKKyAgICAgICAgIGFuYWx5emVycyBtYXkgYmUgc3BlY2lmaWVkIGZvciBpbmRleGluZyBhbmQgcXVlcnlpbmcuCisKKyAgICAgICAgIFRoZSBvcHRpb25hbCBwb3NpdGlvbkluY3JlbWVudEdhcCBwdXRzIHNwYWNlIGJldHdlZW4gbXVsdGlwbGUgZmllbGRzIG9mCisgICAgICAgICB0aGlzIHR5cGUgb24gdGhlIHNhbWUgZG9jdW1lbnQsIHdpdGggdGhlIHB1cnBvc2Ugb2YgcHJldmVudGluZyBmYWxzZSBwaHJhc2UKKyAgICAgICAgIG1hdGNoaW5nIGFjcm9zcyBmaWVsZHMuCisKKyAgICAgICAgIEZvciBtb3JlIGluZm8gb24gY3VzdG9taXppbmcgeW91ciBhbmFseXplciBjaGFpbiwgcGxlYXNlIHNlZQorICAgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0FuYWx5emVyc1Rva2VuaXplcnNUb2tlbkZpbHRlcnMKKyAgICAgLS0+CisKKyAgICA8IS0tIE9uZSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGV4aXN0aW5nIEFuYWx5emVyIGNsYXNzIHRoYXQgaGFzIGEKKyAgICAgICAgIGRlZmF1bHQgY29uc3RydWN0b3IgdmlhIHRoZSBjbGFzcyBhdHRyaWJ1dGUgb24gdGhlIGFuYWx5emVyIGVsZW1lbnQuCisgICAgICAgICBFeGFtcGxlOgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9ncmVlayIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIj4KKyAgICAgIDxhbmFseXplciBjbGFzcz0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZWwuR3JlZWtBbmFseXplciIvPgorICAgIDwvZmllbGRUeXBlPgorICAgIC0tPgorCisgICAgPCEtLSBBIHRleHQgZmllbGQgdGhhdCBvbmx5IHNwbGl0cyBvbiB3aGl0ZXNwYWNlIGZvciBleGFjdCBtYXRjaGluZyBvZiB3b3JkcyAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfd3MiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuV2hpdGVzcGFjZVRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEEgZ2VuZXJhbCB0ZXh0IGZpZWxkIHRoYXQgaGFzIHJlYXNvbmFibGUsIGdlbmVyaWMKKyAgICAgICAgIGNyb3NzLWxhbmd1YWdlIGRlZmF1bHRzOiBpdCB0b2tlbml6ZXMgd2l0aCBTdGFuZGFyZFRva2VuaXplciwKKwkgcmVtb3ZlcyBzdG9wIHdvcmRzIGZyb20gY2FzZS1pbnNlbnNpdGl2ZSAic3RvcHdvcmRzLnR4dCIKKwkgKGVtcHR5IGJ5IGRlZmF1bHQpLCBhbmQgZG93biBjYXNlcy4gIEF0IHF1ZXJ5IHRpbWUgb25seSwgaXQKKwkgYWxzbyBhcHBsaWVzIHN5bm9ueW1zLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZ2VuZXJhbCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIiBtdWx0aVZhbHVlZD0idHJ1ZSI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgLz4KKyAgICAgICAgPCEtLSBpbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgb25seSB1c2Ugc3lub255bXMgYXQgcXVlcnkgdGltZQorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0iaW5kZXhfc3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9ImZhbHNlIi8+CisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ic3RvcHdvcmRzLnR4dCIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TeW5vbnltRmlsdGVyRmFjdG9yeSIgc3lub255bXM9InN5bm9ueW1zLnR4dCIgaWdub3JlQ2FzZT0idHJ1ZSIgZXhwYW5kPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSB0ZXh0IGZpZWxkIHdpdGggZGVmYXVsdHMgYXBwcm9wcmlhdGUgZm9yIEVuZ2xpc2g6IGl0CisgICAgICAgICB0b2tlbml6ZXMgd2l0aCBTdGFuZGFyZFRva2VuaXplciwgcmVtb3ZlcyBFbmdsaXNoIHN0b3Agd29yZHMKKyAgICAgICAgIChsYW5nL3N0b3B3b3Jkc19lbi50eHQpLCBkb3duIGNhc2VzLCBwcm90ZWN0cyB3b3JkcyBmcm9tIHByb3R3b3Jkcy50eHQsIGFuZAorICAgICAgICAgZmluYWxseSBhcHBsaWVzIFBvcnRlcidzIHN0ZW1taW5nLiAgVGhlIHF1ZXJ5IHRpbWUgYW5hbHl6ZXIKKyAgICAgICAgIGFsc28gYXBwbGllcyBzeW5vbnltcyBmcm9tIHN5bm9ueW1zLnR4dC4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2VuIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBpbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgb25seSB1c2Ugc3lub255bXMgYXQgcXVlcnkgdGltZQorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0iaW5kZXhfc3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9ImZhbHNlIi8+CisgICAgICAgIC0tPgorICAgICAgICA8IS0tIENhc2UgaW5zZW5zaXRpdmUgc3RvcCB3b3JkIHJlbW92YWwuCisgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hQb3NzZXNzaXZlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLktleXdvcmRNYXJrZXJGaWx0ZXJGYWN0b3J5IiBwcm90ZWN0ZWQ9InByb3R3b3Jkcy50eHQiLz4KKyAgICAgICAgPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICAgIDxhbmFseXplciB0eXBlPSJxdWVyeSI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3lub255bUZpbHRlckZhY3RvcnkiIHN5bm9ueW1zPSJzeW5vbnltcy50eHQiIGlnbm9yZUNhc2U9InRydWUiIGV4cGFuZD0idHJ1ZSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IgorICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U9InRydWUiCisgICAgICAgICAgICAgICAgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2VuLnR4dCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hQb3NzZXNzaXZlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLktleXdvcmRNYXJrZXJGaWx0ZXJGYWN0b3J5IiBwcm90ZWN0ZWQ9InByb3R3b3Jkcy50eHQiLz4KKyAgICAgICAgPCEtLSBPcHRpb25hbGx5IHlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBsZXNzIGFnZ3Jlc3NpdmUgc3RlbW1lciBpbnN0ZWFkIG9mIFBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5OgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKwktLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Qb3J0ZXJTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gQSB0ZXh0IGZpZWxkIHdpdGggZGVmYXVsdHMgYXBwcm9wcmlhdGUgZm9yIEVuZ2xpc2gsIHBsdXMKKwkgYWdncmVzc2l2ZSB3b3JkLXNwbGl0dGluZyBhbmQgYXV0b3BocmFzZSBmZWF0dXJlcyBlbmFibGVkLgorCSBUaGlzIGZpZWxkIGlzIGp1c3QgbGlrZSB0ZXh0X2VuLCBleGNlcHQgaXQgYWRkcworCSBXb3JkRGVsaW1pdGVyRmlsdGVyIHRvIGVuYWJsZSBzcGxpdHRpbmcgYW5kIG1hdGNoaW5nIG9mCisJIHdvcmRzIG9uIGNhc2UtY2hhbmdlLCBhbHBoYSBudW1lcmljIGJvdW5kYXJpZXMsIGFuZAorCSBub24tYWxwaGFudW1lcmljIGNoYXJzLiAgVGhpcyBtZWFucyBjZXJ0YWluIGNvbXBvdW5kIHdvcmQKKwkgY2FzZXMgd2lsbCB3b3JrLCBmb3IgZXhhbXBsZSBxdWVyeSAid2kgZmkiIHdpbGwgbWF0Y2gKKwkgZG9jdW1lbnQgIldpRmkiIG9yICJ3aS1maSIuCisgICAgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9lbl9zcGxpdHRpbmciIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCIgYXV0b0dlbmVyYXRlUGhyYXNlUXVlcmllcz0idHJ1ZSI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gaW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIG9ubHkgdXNlIHN5bm9ueW1zIGF0IHF1ZXJ5IHRpbWUKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TeW5vbnltRmlsdGVyRmFjdG9yeSIgc3lub255bXM9ImluZGV4X3N5bm9ueW1zLnR4dCIgaWdub3JlQ2FzZT0idHJ1ZSIgZXhwYW5kPSJmYWxzZSIvPgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBDYXNlIGluc2Vuc2l0aXZlIHN0b3Agd29yZCByZW1vdmFsLgorICAgICAgICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBpZ25vcmVDYXNlPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19lbi50eHQiCisgICAgICAgICAgICAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMSIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMSIgY2F0ZW5hdGVXb3Jkcz0iMSIgY2F0ZW5hdGVOdW1iZXJzPSIxIiBjYXRlbmF0ZUFsbD0iMCIgc3BsaXRPbkNhc2VDaGFuZ2U9IjEiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuS2V5d29yZE1hcmtlckZpbHRlckZhY3RvcnkiIHByb3RlY3RlZD0icHJvdHdvcmRzLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgICAgPGFuYWx5emVyIHR5cGU9InF1ZXJ5Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9InRydWUiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBpZ25vcmVDYXNlPSJ0cnVlIgorICAgICAgICAgICAgICAgIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19lbi50eHQiCisgICAgICAgICAgICAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLldvcmREZWxpbWl0ZXJGaWx0ZXJGYWN0b3J5IiBnZW5lcmF0ZVdvcmRQYXJ0cz0iMSIgZ2VuZXJhdGVOdW1iZXJQYXJ0cz0iMSIgY2F0ZW5hdGVXb3Jkcz0iMCIgY2F0ZW5hdGVOdW1iZXJzPSIwIiBjYXRlbmF0ZUFsbD0iMCIgc3BsaXRPbkNhc2VDaGFuZ2U9IjEiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuS2V5d29yZE1hcmtlckZpbHRlckZhY3RvcnkiIHByb3RlY3RlZD0icHJvdHdvcmRzLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnRlclN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBMZXNzIGZsZXhpYmxlIG1hdGNoaW5nLCBidXQgbGVzcyBmYWxzZSBtYXRjaGVzLiAgUHJvYmFibHkgbm90IGlkZWFsIGZvciBwcm9kdWN0IG5hbWVzLAorICAgICAgICAgYnV0IG1heSBiZSBnb29kIGZvciBTS1VzLiAgQ2FuIGluc2VydCBkYXNoZXMgaW4gdGhlIHdyb25nIHBsYWNlIGFuZCBzdGlsbCBtYXRjaC4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2VuX3NwbGl0dGluZ190aWdodCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIiBhdXRvR2VuZXJhdGVQaHJhc2VRdWVyaWVzPSJ0cnVlIj4KKyAgICAgIDxhbmFseXplcj4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5XaGl0ZXNwYWNlVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN5bm9ueW1GaWx0ZXJGYWN0b3J5IiBzeW5vbnltcz0ic3lub255bXMudHh0IiBpZ25vcmVDYXNlPSJ0cnVlIiBleHBhbmQ9ImZhbHNlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19lbi50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Xb3JkRGVsaW1pdGVyRmlsdGVyRmFjdG9yeSIgZ2VuZXJhdGVXb3JkUGFydHM9IjAiIGdlbmVyYXRlTnVtYmVyUGFydHM9IjAiIGNhdGVuYXRlV29yZHM9IjEiIGNhdGVuYXRlTnVtYmVycz0iMSIgY2F0ZW5hdGVBbGw9IjAiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuS2V5d29yZE1hcmtlckZpbHRlckZhY3RvcnkiIHByb3RlY3RlZD0icHJvdHdvcmRzLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVuZ2xpc2hNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSB0aGlzIGZpbHRlciBjYW4gcmVtb3ZlIGFueSBkdXBsaWNhdGUgdG9rZW5zIHRoYXQgYXBwZWFyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIC0gc29tZXRpbWVzCisgICAgICAgICAgICAgcG9zc2libGUgd2l0aCBXb3JkRGVsaW1pdGVyRmlsdGVyIGluIGNvbmp1bmN0b24gd2l0aCBzdGVtbWluZy4gLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuUmVtb3ZlRHVwbGljYXRlc1Rva2VuRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gSnVzdCBsaWtlIHRleHRfZ2VuZXJhbCBleGNlcHQgaXQgcmV2ZXJzZXMgdGhlIGNoYXJhY3RlcnMgb2YKKwkgZWFjaCB0b2tlbiwgdG8gZW5hYmxlIG1vcmUgZWZmaWNpZW50IGxlYWRpbmcgd2lsZGNhcmQgcXVlcmllcy4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dlbmVyYWxfcmV2IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9InN0b3B3b3Jkcy50eHQiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlJldmVyc2VkV2lsZGNhcmRGaWx0ZXJGYWN0b3J5IiB3aXRoT3JpZ2luYWw9InRydWUiCisgICAgICAgICAgICAgICAgbWF4UG9zQXN0ZXJpc2s9IjMiIG1heFBvc1F1ZXN0aW9uPSIyIiBtYXhGcmFjdGlvbkFzdGVyaXNrPSIwLjMzIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgICAgPGFuYWx5emVyIHR5cGU9InF1ZXJ5Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TeW5vbnltRmlsdGVyRmFjdG9yeSIgc3lub255bXM9InN5bm9ueW1zLnR4dCIgaWdub3JlQ2FzZT0idHJ1ZSIgZXhwYW5kPSJ0cnVlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJzdG9wd29yZHMudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIGNoYXJGaWx0ZXIgKyBXaGl0ZXNwYWNlVG9rZW5pemVyICAtLT4KKyAgICA8IS0tCisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2NoYXJfbm9ybSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIiA+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDxjaGFyRmlsdGVyIGNsYXNzPSJzb2xyLk1hcHBpbmdDaGFyRmlsdGVyRmFjdG9yeSIgbWFwcGluZz0ibWFwcGluZy1JU09MYXRpbjFBY2NlbnQudHh0Ii8+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuV2hpdGVzcGFjZVRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgLS0+CisKKyAgICA8IS0tIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgS2V5d29yZFRva2VuaXplciBhbG9uZworICAgICAgICAgV2l0aCB2YXJpb3VzIFRva2VuRmlsdGVyRmFjdG9yaWVzIHRvIHByb2R1Y2UgYSBzb3J0YWJsZSBmaWVsZAorICAgICAgICAgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHNvbWUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIHRleHQKKyAgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iYWxwaGFPbmx5U29ydCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBzb3J0TWlzc2luZ0xhc3Q9InRydWUiIG9taXROb3Jtcz0idHJ1ZSI+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDwhLS0gS2V5d29yZFRva2VuaXplciBkb2VzIG5vIGFjdHVhbCB0b2tlbml6aW5nLCBzbyB0aGUgZW50aXJlCisgICAgICAgICAgICAgaW5wdXQgc3RyaW5nIGlzIHByZXNlcnZlZCBhcyBhIHNpbmdsZSB0b2tlbgorICAgICAgICAgIC0tPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLktleXdvcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gVGhlIExvd2VyQ2FzZSBUb2tlbkZpbHRlciBkb2VzIHdoYXQgeW91IGV4cGVjdCwgd2hpY2ggY2FuIGJlCisgICAgICAgICAgICAgd2hlbiB5b3Ugd2FudCB5b3VyIHNvcnRpbmcgdG8gYmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiIC8+CisgICAgICAgIDwhLS0gVGhlIFRyaW1GaWx0ZXIgcmVtb3ZlcyBhbnkgbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlRyaW1GaWx0ZXJGYWN0b3J5IiAvPgorICAgICAgICA8IS0tIFRoZSBQYXR0ZXJuUmVwbGFjZUZpbHRlciBnaXZlcyB5b3UgdGhlIGZsZXhpYmlsaXR5IHRvIHVzZQorICAgICAgICAgICAgIEphdmEgUmVndWxhciBleHByZXNzaW9uIHRvIHJlcGxhY2UgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICBtYXRjaGluZyBhIHBhdHRlcm4gd2l0aCBhbiBhcmJpdHJhcnkgcmVwbGFjZW1lbnQgc3RyaW5nLCAKKyAgICAgICAgICAgICB3aGljaCBtYXkgaW5jbHVkZSBiYWNrIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnMgb2YgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgc3RyaW5nIG1hdGNoZWQgYnkgdGhlIHBhdHRlcm4uCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgU2VlIHRoZSBKYXZhIFJlZ3VsYXIgRXhwcmVzc2lvbiBkb2N1bWVudGF0aW9uIGZvciBtb3JlCisgICAgICAgICAgICAgaW5mb3JtYXRpb24gb24gcGF0dGVybiBhbmQgcmVwbGFjZW1lbnQgc3RyaW5nIHN5bnRheC4KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorICAgICAgICAgIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBhdHRlcm5SZXBsYWNlRmlsdGVyRmFjdG9yeSIKKyAgICAgICAgICAgICAgICBwYXR0ZXJuPSIoW15hLXpdKSIgcmVwbGFjZW1lbnQ9IiIgcmVwbGFjZT0iYWxsIgorICAgICAgICAgICAgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPGZpZWxkdHlwZSBuYW1lPSJwaG9uZXRpYyIgc3RvcmVkPSJmYWxzZSIgaW5kZXhlZD0idHJ1ZSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiA+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRG91YmxlTWV0YXBob25lRmlsdGVyRmFjdG9yeSIgaW5qZWN0PSJmYWxzZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkdHlwZT4KKworICAgIDxmaWVsZHR5cGUgbmFtZT0icGF5bG9hZHMiIHN0b3JlZD0iZmFsc2UiIGluZGV4ZWQ9InRydWUiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLldoaXRlc3BhY2VUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0KKyAgICAgICAgVGhlIERlbGltaXRlZFBheWxvYWRUb2tlbkZpbHRlciBjYW4gcHV0IHBheWxvYWRzIG9uIHRva2Vucy4uLiBmb3IgZXhhbXBsZSwKKyAgICAgICAgYSB0b2tlbiBvZiAiZm9vfDEuNCIgIHdvdWxkIGJlIGluZGV4ZWQgYXMgImZvbyIgd2l0aCBhIHBheWxvYWQgb2YgMS40ZgorICAgICAgICBBdHRyaWJ1dGVzIG9mIHRoZSBEZWxpbWl0ZWRQYXlsb2FkVG9rZW5GaWx0ZXJGYWN0b3J5IDogCisgICAgICAgICAiZGVsaW1pdGVyIiAtIGEgb25lIGNoYXJhY3RlciBkZWxpbWl0ZXIuIERlZmF1bHQgaXMgfCAocGlwZSkKKwkgImVuY29kZXIiIC0gaG93IHRvIGVuY29kZSB0aGUgZm9sbG93aW5nIHZhbHVlIGludG8gYSBwbGF5bG9hZAorCSAgICBmbG9hdCAtPiBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5wYXlsb2Fkcy5GbG9hdEVuY29kZXIsCisJICAgIGludGVnZXIgLT4gby5hLmwuYS5wLkludGVnZXJFbmNvZGVyCisJICAgIGlkZW50aXR5IC0+IG8uYS5sLmEucC5JZGVudGl0eUVuY29kZXIKKyAgICAgICAgICAgIEZ1bGx5IFF1YWxpZmllZCBjbGFzcyBuYW1lIGltcGxlbWVudGluZyBQYXlsb2FkRW5jb2RlciwgRW5jb2RlciBtdXN0IGhhdmUgYSBubyBhcmcgY29uc3RydWN0b3IuCisgICAgICAgICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5EZWxpbWl0ZWRQYXlsb2FkVG9rZW5GaWx0ZXJGYWN0b3J5IiBlbmNvZGVyPSJmbG9hdCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkdHlwZT4KKworICAgIDwhLS0gbG93ZXJjYXNlcyB0aGUgZW50aXJlIGZpZWxkIHZhbHVlLCBrZWVwaW5nIGl0IGFzIGEgc2luZ2xlIHRva2VuLiAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJsb3dlcmNhc2UiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuS2V5d29yZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5IiAvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICAgIDwhLS0gCisgICAgICBFeGFtcGxlIG9mIHVzaW5nIFBhdGhIaWVyYXJjaHlUb2tlbml6ZXJGYWN0b3J5IGF0IGluZGV4IHRpbWUsIHNvCisgICAgICBxdWVyaWVzIGZvciBwYXRocyBtYXRjaCBkb2N1bWVudHMgYXQgdGhhdCBwYXRoLCBvciBpbiBkZXNjZW5kZW50IHBhdGhzCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJkZXNjZW5kZW50X3BhdGgiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0iaW5kZXgiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlBhdGhIaWVyYXJjaHlUb2tlbml6ZXJGYWN0b3J5IiBkZWxpbWl0ZXI9Ii8iIC8+CisgICAgICA8L2FuYWx5emVyPgorICAgICAgPGFuYWx5emVyIHR5cGU9InF1ZXJ5Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgPCEtLSAKKyAgICAgIEV4YW1wbGUgb2YgdXNpbmcgUGF0aEhpZXJhcmNoeVRva2VuaXplckZhY3RvcnkgYXQgcXVlcnkgdGltZSwgc28KKyAgICAgIHF1ZXJpZXMgZm9yIHBhdGhzIG1hdGNoIGRvY3VtZW50cyBhdCB0aGF0IHBhdGgsIG9yIGluIGFuY2VzdG9yIHBhdGhzCisgICAgLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJhbmNlc3Rvcl9wYXRoIiBjbGFzcz0ic29sci5UZXh0RmllbGQiPgorICAgICAgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5LZXl3b3JkVG9rZW5pemVyRmFjdG9yeSIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgICA8YW5hbHl6ZXIgdHlwZT0icXVlcnkiPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlBhdGhIaWVyYXJjaHlUb2tlbml6ZXJGYWN0b3J5IiBkZWxpbWl0ZXI9Ii8iIC8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBzaW5jZSBmaWVsZHMgb2YgdGhpcyB0eXBlIGFyZSBieSBkZWZhdWx0IG5vdCBzdG9yZWQgb3IgaW5kZXhlZCwKKyAgICAgICAgIGFueSBkYXRhIGFkZGVkIHRvIHRoZW0gd2lsbCBiZSBpZ25vcmVkIG91dHJpZ2h0LiAgLS0+IAorICAgIDxmaWVsZHR5cGUgbmFtZT0iaWdub3JlZCIgc3RvcmVkPSJmYWxzZSIgaW5kZXhlZD0iZmFsc2UiIG11bHRpVmFsdWVkPSJ0cnVlIiBjbGFzcz0ic29sci5TdHJGaWVsZCIgLz4KKworICAgIDwhLS0gVGhpcyBwb2ludCB0eXBlIGluZGV4ZXMgdGhlIGNvb3JkaW5hdGVzIGFzIHNlcGFyYXRlIGZpZWxkcyAoc3ViRmllbGRzKQorICAgICAgSWYgc3ViRmllbGRUeXBlIGlzIGRlZmluZWQsIGl0IHJlZmVyZW5jZXMgYSB0eXBlLCBhbmQgYSBkeW5hbWljIGZpZWxkCisgICAgICBkZWZpbml0aW9uIGlzIGNyZWF0ZWQgbWF0Y2hpbmcgKl9fXzx0eXBlbmFtZT4uICBBbHRlcm5hdGVseSwgaWYgCisgICAgICBzdWJGaWVsZFN1ZmZpeCBpcyBkZWZpbmVkLCB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBzdWJGaWVsZHMuCisgICAgICBFeGFtcGxlOiBpZiBzdWJGaWVsZFR5cGU9ImRvdWJsZSIsIHRoZW4gdGhlIGNvb3JkaW5hdGVzIHdvdWxkIGJlCisgICAgICAgIGluZGV4ZWQgaW4gZmllbGRzIG15bG9jXzBfX19kb3VibGUsbXlsb2NfMV9fX2RvdWJsZS4KKyAgICAgIEV4YW1wbGU6IGlmIHN1YkZpZWxkU3VmZml4PSJfZCIgdGhlbiB0aGUgY29vcmRpbmF0ZXMgd291bGQgYmUgaW5kZXhlZAorICAgICAgICBpbiBmaWVsZHMgbXlsb2NfMF9kLG15bG9jXzFfZAorICAgICAgVGhlIHN1YkZpZWxkcyBhcmUgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBmaWVsZFR5cGUsIGFuZCBlbmQKKyAgICAgIHVzZXJzIG5vcm1hbGx5IHNob3VsZCBub3QgbmVlZCB0byBrbm93IGFib3V0IHRoZW0uCisgICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0icG9pbnQiIGNsYXNzPSJzb2xyLlBvaW50VHlwZSIgZGltZW5zaW9uPSIyIiBzdWJGaWVsZFN1ZmZpeD0iX2QiLz4KKworICAgIDwhLS0gQSBzcGVjaWFsaXplZCBmaWVsZCBmb3IgZ2Vvc3BhdGlhbCBzZWFyY2guIElmIGluZGV4ZWQsIHRoaXMgZmllbGRUeXBlIG11c3Qgbm90IGJlIG11bHRpdmFsdWVkLiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImxvY2F0aW9uIiBjbGFzcz0ic29sci5MYXRMb25UeXBlIiBzdWJGaWVsZFN1ZmZpeD0iX2Nvb3JkaW5hdGUiLz4KKworICAgIDwhLS0gQW4gYWx0ZXJuYXRpdmUgZ2Vvc3BhdGlhbCBmaWVsZCB0eXBlIG5ldyB0byBTb2xyIDQuICBJdCBzdXBwb3J0cyBtdWx0aVZhbHVlZCBhbmQgcG9seWdvbiBzaGFwZXMuCisgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFuZCBvdGhlciBTcGF0aWFsIGZpZWxkcyBuZXcgdG8gU29sciA0LCBzZWU6CisgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU29sckFkYXB0ZXJzRm9yTHVjZW5lU3BhdGlhbDQKKyAgICAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9ImxvY2F0aW9uX3JwdCIgY2xhc3M9InNvbHIuU3BhdGlhbFJlY3Vyc2l2ZVByZWZpeFRyZWVGaWVsZFR5cGUiCisgICAgICAgICAgICAgICBnZW89InRydWUiIGRpc3RFcnJQY3Q9IjAuMDI1IiBtYXhEaXN0RXJyPSIwLjAwMDAwOSIgdW5pdHM9ImRlZ3JlZXMiIC8+CisKKyAgICA8IS0tIE1vbmV5L2N1cnJlbmN5IGZpZWxkIHR5cGUuIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvTW9uZXlGaWVsZFR5cGUKKyAgICAgICAgUGFyYW1ldGVyczoKKyAgICAgICAgICBkZWZhdWx0Q3VycmVuY3k6IFNwZWNpZmllcyB0aGUgZGVmYXVsdCBjdXJyZW5jeSBpZiBub25lIHNwZWNpZmllZC4gRGVmYXVsdHMgdG8gIlVTRCIKKyAgICAgICAgICBwcmVjaXNpb25TdGVwOiAgIFNwZWNpZmllcyB0aGUgcHJlY2lzaW9uU3RlcCBmb3IgdGhlIFRyaWVMb25nIGZpZWxkIHVzZWQgZm9yIHRoZSBhbW91bnQKKyAgICAgICAgICBwcm92aWRlckNsYXNzOiAgIExldHMgeW91IHBsdWcgaW4gb3RoZXIgZXhjaGFuZ2UgcHJvdmlkZXIgYmFja2VuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbHIuRmlsZUV4Y2hhbmdlUmF0ZVByb3ZpZGVyIGlzIHRoZSBkZWZhdWx0IGFuZCB0YWtlcyBvbmUgcGFyYW1ldGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvbmZpZzogbmFtZSBvZiBhbiB4bWwgZmlsZSBob2xkaW5nIGV4Y2hhbmdlIHJhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2xyLk9wZW5FeGNoYW5nZVJhdGVzT3JnUHJvdmlkZXIgdXNlcyByYXRlcyBmcm9tIG9wZW5leGNoYW5nZXJhdGVzLm9yZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNGaWxlTG9jYXRpb246IFVSTCBvciBwYXRoIHRvIHJhdGVzIEpTT04gZmlsZSAoZGVmYXVsdCBsYXRlc3QuanNvbiBvbiB0aGUgd2ViKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoSW50ZXJ2YWw6IE51bWJlciBvZiBtaW51dGVzIGJldHdlZW4gZWFjaCByYXRlcyBmZXRjaCAoZGVmYXVsdDogMTQ0MCwgbWluOiA2MCkKKyAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0iY3VycmVuY3kiIGNsYXNzPSJzb2xyLkN1cnJlbmN5RmllbGQiIHByZWNpc2lvblN0ZXA9IjgiIGRlZmF1bHRDdXJyZW5jeT0iVVNEIiBjdXJyZW5jeUNvbmZpZz0iY3VycmVuY3kueG1sIiAvPgorICAgICAgICAgICAgIAorCisKKyAgICA8IS0tIHNvbWUgZXhhbXBsZXMgZm9yIGRpZmZlcmVudCBsYW5ndWFnZXMgKGdlbmVyYWxseSBvcmRlcmVkIGJ5IElTTyBjb2RlKSAtLT4KKworICAgIDwhLS0gQXJhYmljIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9hciIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gZm9yIGFueSBub24tYXJhYmljIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2FyLnR4dCIgLz4KKyAgICAgICAgPCEtLSBub3JtYWxpemVzIO+7ryB0byDvu7EsIGV0YyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5BcmFiaWNOb3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkFyYWJpY1N0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorCisgICAgPCEtLSBCdWxnYXJpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2JnIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4gCisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfYmcudHh0IiAvPiAKKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5CdWxnYXJpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPiAgICAgICAKKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBDYXRhbGFuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jYSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gcmVtb3ZlcyBsJywgZXRjIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVsaXNpb25GaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiBhcnRpY2xlcz0ibGFuZy9jb250cmFjdGlvbnNfY2EudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfY2EudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkNhdGFsYW4iLz4gICAgICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQ0pLIGJpZ3JhbSAoc2VlIHRleHRfamEgZm9yIGEgSmFwYW5lc2UgY29uZmlndXJhdGlvbiB1c2luZyBtb3JwaG9sb2dpY2FsIGFuYWx5c2lzKSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfY2prIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZSB3aWR0aCBiZWZvcmUgYmlncmFtLCBhcyBlLmcuIGhhbGYtd2lkdGggZGFrdXRlbiBjb21iaW5lICAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5DSktXaWR0aEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBmb3IgYW55IG5vbi1DSksgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkNKS0JpZ3JhbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisKKyAgICA8IS0tIEN6ZWNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9jeiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfY3oudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkN6ZWNoU3RlbUZpbHRlckZhY3RvcnkiLz4gICAgICAgCisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gRGFuaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9kYSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZGEudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkRhbmlzaCIvPiAgICAgICAKKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHZXJtYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2RlIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19kZS50eHQiIGZvcm1hdD0ic25vd2JhbGwiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2VybWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5HZXJtYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLkdlcm1hbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgICAgPCEtLSBtb3JlIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iR2VybWFuMiIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBHcmVlayAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfZWwiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGdyZWVrIHNwZWNpZmljIGxvd2VyY2FzZSBmb3Igc2lnbWEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR3JlZWtMb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9ImZhbHNlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZWwudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkdyZWVrU3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBTcGFuaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9lcyIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZXMudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNwYW5pc2hMaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbW9yZSBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IlNwYW5pc2giLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gQmFzcXVlIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9ldSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZXUudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkJhc3F1ZSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFBlcnNpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2ZhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPgorICAgICAgICA8IS0tIGZvciBaV05KIC0tPgorICAgICAgICA8Y2hhckZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuQ2hhckZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuQXJhYmljTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5QZXJzaWFuTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2ZhLnR4dCIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBGaW5uaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9maSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZmkudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkZpbm5pc2giLz4KKyAgICAgICAgPCEtLSBsZXNzIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuRmlubmlzaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gRnJlbmNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9mciIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gcmVtb3ZlcyBsJywgZXRjIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkVsaXNpb25GaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiBhcnRpY2xlcz0ibGFuZy9jb250cmFjdGlvbnNfZnIudHh0Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfZnIudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkZyZW5jaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBsZXNzIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuRnJlbmNoTWluaW1hbFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJGcmVuY2giLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSXJpc2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dhIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIGQnLCBldGMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuRWxpc2lvbkZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIGFydGljbGVzPSJsYW5nL2NvbnRyYWN0aW9uc19nYS50eHQiLz4KKyAgICAgICAgPCEtLSByZW1vdmVzIG4tLCBldGMuIHBvc2l0aW9uIGluY3JlbWVudHMgaXMgaW50ZW50aW9uYWxseSBmYWxzZSEgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL2h5cGhlbmF0aW9uc19nYS50eHQiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5JcmlzaExvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2dhLnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IklyaXNoIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gR2FsaWNpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2dsIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19nbC50eHQiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuR2FsaWNpYW5TdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5HYWxpY2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBIaW5kaSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaGkiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPCEtLSBub3JtYWxpemVzIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSW5kaWNOb3JtYWxpemF0aW9uRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG5vcm1hbGl6ZXMgdmFyaWF0aW9uIGluIHNwZWxsaW5nIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkhpbmRpTm9ybWFsaXphdGlvbkZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2hpLnR4dCIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5IaW5kaVN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSHVuZ2FyaWFuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9odSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfaHUudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9Ikh1bmdhcmlhbiIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5IdW5nYXJpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPiAgIAorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEFybWVuaWFuIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9oeSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfaHkudHh0IiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IkFybWVuaWFuIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSW5kb25lc2lhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaWQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2lkLnR4dCIgLz4KKyAgICAgICAgPCEtLSBmb3IgYSBsZXNzIGFnZ3Jlc3NpdmUgYXBwcm9hY2ggKG9ubHkgaW5mbGVjdGlvbmFsIHN1ZmZpeGVzKSwgc2V0IHN0ZW1EZXJpdmF0aW9uYWwgdG8gZmFsc2UgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSW5kb25lc2lhblN0ZW1GaWx0ZXJGYWN0b3J5IiBzdGVtRGVyaXZhdGlvbmFsPSJ0cnVlIi8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gSXRhbGlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfaXQiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIHJlbW92ZXMgbCcsIGV0YyAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5FbGlzaW9uRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgYXJ0aWNsZXM9ImxhbmcvY29udHJhY3Rpb25zX2l0LnR4dCIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX2l0LnR4dCIgZm9ybWF0PSJzbm93YmFsbCIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5JdGFsaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIG1vcmUgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJJdGFsaWFuIi8+IC0tPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIEphcGFuZXNlIHVzaW5nIG1vcnBob2xvZ2ljYWwgYW5hbHlzaXMgKHNlZSB0ZXh0X2NqayBmb3IgYSBjb25maWd1cmF0aW9uIHVzaW5nIGJpZ3JhbW1pbmcpCisKKyAgICAgICAgIE5PVEU6IElmIHlvdSB3YW50IHRvIG9wdGltaXplIHNlYXJjaCBmb3IgcHJlY2lzaW9uLCB1c2UgZGVmYXVsdCBvcGVyYXRvciBBTkQgaW4geW91ciBxdWVyeQorICAgICAgICAgcGFyc2VyIGNvbmZpZyB3aXRoIDxzb2xyUXVlcnlQYXJzZXIgZGVmYXVsdE9wZXJhdG9yPSJBTkQiLz4gZnVydGhlciBkb3duIGluIHRoaXMgZmlsZS4gIFVzZSAKKyAgICAgICAgIE9SIGlmIHlvdSB3b3VsZCBsaWtlIHRvIG9wdGltaXplIGZvciByZWNhbGwgKGRlZmF1bHQpLgorICAgIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9qYSIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIiBhdXRvR2VuZXJhdGVQaHJhc2VRdWVyaWVzPSJmYWxzZSI+CisgICAgICA8YW5hbHl6ZXI+CisgICAgICAgIDwhLS0gS3Vyb21vamkgSmFwYW5lc2UgbW9ycGhvbG9naWNhbCBhbmFseXplci90b2tlbml6ZXIgKEphcGFuZXNlVG9rZW5pemVyKQorCisgICAgICAgICAgIEt1cm9tb2ppIGhhcyBhIHNlYXJjaCBtb2RlIChkZWZhdWx0KSB0aGF0IGRvZXMgc2VnbWVudGF0aW9uIHVzZWZ1bCBmb3Igc2VhcmNoLiAgQSBoZXVyaXN0aWMKKyAgICAgICAgICAgaXMgdXNlZCB0byBzZWdtZW50IGNvbXBvdW5kcyBpbnRvIGl0cyBwYXJ0cyBhbmQgdGhlIGNvbXBvdW5kIGl0c2VsZiBpcyBrZXB0IGFzIHN5bm9ueW0uCisKKyAgICAgICAgICAgVmFsaWQgdmFsdWVzIGZvciBhdHRyaWJ1dGUgbW9kZSBhcmU6CisgICAgICAgICAgICAgIG5vcm1hbDogcmVndWxhciBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgc2VhcmNoOiBzZWdtZW50YXRpb24gdXNlZnVsIGZvciBzZWFyY2ggd2l0aCBzeW5vbnltcyBjb21wb3VuZHMgKGRlZmF1bHQpCisgICAgICAgICAgICBleHRlbmRlZDogc2FtZSBhcyBzZWFyY2ggbW9kZSwgYnV0IHVuaWdyYW1zIHVua25vd24gd29yZHMgKGV4cGVyaW1lbnRhbCkKKworICAgICAgICAgICBGb3Igc29tZSBhcHBsaWNhdGlvbnMgaXQgbWlnaHQgYmUgZ29vZCB0byB1c2Ugc2VhcmNoIG1vZGUgZm9yIGluZGV4aW5nIGFuZCBub3JtYWwgbW9kZSBmb3IKKyAgICAgICAgICAgcXVlcmllcyB0byByZWR1Y2UgcmVjYWxsIGFuZCBwcmV2ZW50IHBhcnRzIG9mIGNvbXBvdW5kcyBmcm9tIGJlaW5nIG1hdGNoZWQgYW5kIGhpZ2hsaWdodGVkLgorICAgICAgICAgICBVc2UgPGFuYWx5emVyIHR5cGU9ImluZGV4Ij4gYW5kIDxhbmFseXplciB0eXBlPSJxdWVyeSI+IGZvciB0aGlzIGFuZCBtb2RlIG5vcm1hbCBpbiBxdWVyeS4KKworICAgICAgICAgICBLdXJvbW9qaSBhbHNvIGhhcyBhIGNvbnZlbmllbnQgdXNlciBkaWN0aW9uYXJ5IGZlYXR1cmUgdGhhdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgc3RhdGlzdGljYWwKKyAgICAgICAgICAgbW9kZWwgd2l0aCB5b3VyIG93biBlbnRyaWVzIGZvciBzZWdtZW50YXRpb24sIHBhcnQtb2Ytc3BlZWNoIHRhZ3MgYW5kIHJlYWRpbmdzIHdpdGhvdXQgYSBuZWVkCisgICAgICAgICAgIHRvIHNwZWNpZnkgd2VpZ2h0cy4gIE5vdGljZSB0aGF0IHVzZXIgZGljdGlvbmFyaWVzIGhhdmUgbm90IGJlZW4gc3ViamVjdCB0byBleHRlbnNpdmUgdGVzdGluZy4KKworICAgICAgICAgICBVc2VyIGRpY3Rpb25hcnkgYXR0cmlidXRlcyBhcmU6CisgICAgICAgICAgICAgICAgICAgICB1c2VyRGljdGlvbmFyeTogdXNlciBkaWN0aW9uYXJ5IGZpbGVuYW1lCisgICAgICAgICAgICAgdXNlckRpY3Rpb25hcnlFbmNvZGluZzogdXNlciBkaWN0aW9uYXJ5IGVuY29kaW5nIChkZWZhdWx0IGlzIFVURi04KQorCisgICAgICAgICAgIFNlZSBsYW5nL3VzZXJkaWN0X2phLnR4dCBmb3IgYSBzYW1wbGUgdXNlciBkaWN0aW9uYXJ5IGZpbGUuCisKKyAgICAgICAgICAgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhcmUgZGlzY2FyZGVkIGJ5IGRlZmF1bHQuICBVc2UgZGlzY2FyZFB1bmN0dWF0aW9uPSJmYWxzZSIgdG8ga2VlcCB0aGVtLgorCisgICAgICAgICAgIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvSmFwYW5lc2VMYW5ndWFnZVN1cHBvcnQgZm9yIG1vcmUgb24gSmFwYW5lc2UgbGFuZ3VhZ2Ugc3VwcG9ydC4KKyAgICAgICAgLS0+CisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giLz4KKyAgICAgICAgPCEtLTx0b2tlbml6ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VUb2tlbml6ZXJGYWN0b3J5IiBtb2RlPSJzZWFyY2giIHVzZXJEaWN0aW9uYXJ5PSJsYW5nL3VzZXJkaWN0X2phLnR4dCIvPi0tPgorICAgICAgICA8IS0tIFJlZHVjZXMgaW5mbGVjdGVkIHZlcmJzIGFuZCBhZGplY3RpdmVzIHRvIHRoZWlyIGJhc2UvZGljdGlvbmFyeSBmb3JtcyAo6L6e5pu45b2iKSAtLT4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5KYXBhbmVzZUJhc2VGb3JtRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFJlbW92ZXMgdG9rZW5zIHdpdGggY2VydGFpbiBwYXJ0LW9mLXNwZWVjaCB0YWdzIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkphcGFuZXNlUGFydE9mU3BlZWNoU3RvcEZpbHRlckZhY3RvcnkiIHRhZ3M9Imxhbmcvc3RvcHRhZ3NfamEudHh0IiAvPgorICAgICAgICA8IS0tIE5vcm1hbGl6ZXMgZnVsbC13aWR0aCByb21hamkgdG8gaGFsZi13aWR0aCBhbmQgaGFsZi13aWR0aCBrYW5hIHRvIGZ1bGwtd2lkdGggKFVuaWNvZGUgTkZLQyBzdWJzZXQpIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkNKS1dpZHRoRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8IS0tIFJlbW92ZXMgY29tbW9uIHRva2VucyB0eXBpY2FsbHkgbm90IHVzZWZ1bCBmb3Igc2VhcmNoLCBidXQgaGF2ZSBhIG5lZ2F0aXZlIGVmZmVjdCBvbiByYW5raW5nIC0tPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfamEudHh0IiAvPgorICAgICAgICA8IS0tIE5vcm1hbGl6ZXMgY29tbW9uIGthdGFrYW5hIHNwZWxsaW5nIHZhcmlhdGlvbnMgYnkgcmVtb3ZpbmcgYW55IGxhc3QgbG9uZyBzb3VuZCBjaGFyYWN0ZXIgKFUrMzBGQykgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuSmFwYW5lc2VLYXRha2FuYVN0ZW1GaWx0ZXJGYWN0b3J5IiBtaW5pbXVtTGVuZ3RoPSI0Ii8+CisgICAgICAgIDwhLS0gTG93ZXItY2FzZXMgcm9tYWppIGNoYXJhY3RlcnMgLS0+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIExhdHZpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X2x2IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19sdi50eHQiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTGF0dmlhblN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gRHV0Y2ggLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X25sIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19ubC50eHQiIGZvcm1hdD0ic25vd2JhbGwiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RlbW1lck92ZXJyaWRlRmlsdGVyRmFjdG9yeSIgZGljdGlvbmFyeT0ibGFuZy9zdGVtZGljdF9ubC50eHQiIGlnbm9yZUNhc2U9ImZhbHNlIi8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iRHV0Y2giLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBOb3J3ZWdpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X25vIiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19uby50eHQiIGZvcm1hdD0ic25vd2JhbGwiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iTm9yd2VnaWFuIi8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICAgIDwhLS0gc2luZ3VsYXIvcGx1cmFsOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbk1pbmltYWxTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBQb3J0dWd1ZXNlIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9wdCIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfcHQudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnR1Z3Vlc2VMaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnR1Z3Vlc2VNaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICAgIDwhLS0gbW9yZSBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IlBvcnR1Z3Vlc2UiLz4gLS0+CisgICAgICAgIDwhLS0gbW9zdCBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLlBvcnR1Z3Vlc2VTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBSb21hbmlhbiAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfcm8iIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3JvLnR4dCIgLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Tbm93YmFsbFBvcnRlckZpbHRlckZhY3RvcnkiIGxhbmd1YWdlPSJSb21hbmlhbiIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKyAgICAKKyAgICA8IS0tIFJ1c3NpYW4gLS0+CisgICAgPGZpZWxkVHlwZSBuYW1lPSJ0ZXh0X3J1IiBjbGFzcz0ic29sci5UZXh0RmllbGQiIHBvc2l0aW9uSW5jcmVtZW50R2FwPSIxMDAiPgorICAgICAgPGFuYWx5emVyPiAKKyAgICAgICAgPHRva2VuaXplciBjbGFzcz0ic29sci5TdGFuZGFyZFRva2VuaXplckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5Mb3dlckNhc2VGaWx0ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU3RvcEZpbHRlckZhY3RvcnkiIGlnbm9yZUNhc2U9InRydWUiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc19ydS50eHQiIGZvcm1hdD0ic25vd2JhbGwiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iUnVzc2lhbiIvPgorICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5SdXNzaWFuTGlnaHRTdGVtRmlsdGVyRmFjdG9yeSIvPiAtLT4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBTd2VkaXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF9zdiIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfc3YudHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9IlN3ZWRpc2giLz4KKyAgICAgICAgPCEtLSBsZXNzIGFnZ3Jlc3NpdmU6IDxmaWx0ZXIgY2xhc3M9InNvbHIuU3dlZGlzaExpZ2h0U3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICA8L2FuYWx5emVyPgorICAgIDwvZmllbGRUeXBlPgorICAgIAorICAgIDwhLS0gVGhhaSAtLT4KKyAgICA8ZmllbGRUeXBlIG5hbWU9InRleHRfdGgiIGNsYXNzPSJzb2xyLlRleHRGaWVsZCIgcG9zaXRpb25JbmNyZW1lbnRHYXA9IjEwMCI+CisgICAgICA8YW5hbHl6ZXI+IAorICAgICAgICA8dG9rZW5pemVyIGNsYXNzPSJzb2xyLlN0YW5kYXJkVG9rZW5pemVyRmFjdG9yeSIvPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5UaGFpV29yZEZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0idHJ1ZSIgd29yZHM9Imxhbmcvc3RvcHdvcmRzX3RoLnR4dCIgLz4KKyAgICAgIDwvYW5hbHl6ZXI+CisgICAgPC9maWVsZFR5cGU+CisgICAgCisgICAgPCEtLSBUdXJraXNoIC0tPgorICAgIDxmaWVsZFR5cGUgbmFtZT0idGV4dF90ciIgY2xhc3M9InNvbHIuVGV4dEZpZWxkIiBwb3NpdGlvbkluY3JlbWVudEdhcD0iMTAwIj4KKyAgICAgIDxhbmFseXplcj4gCisgICAgICAgIDx0b2tlbml6ZXIgY2xhc3M9InNvbHIuU3RhbmRhcmRUb2tlbml6ZXJGYWN0b3J5Ii8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuVHVya2lzaExvd2VyQ2FzZUZpbHRlckZhY3RvcnkiLz4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0ic29sci5TdG9wRmlsdGVyRmFjdG9yeSIgaWdub3JlQ2FzZT0iZmFsc2UiIHdvcmRzPSJsYW5nL3N0b3B3b3Jkc190ci50eHQiIC8+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuU25vd2JhbGxQb3J0ZXJGaWx0ZXJGYWN0b3J5IiBsYW5ndWFnZT0iVHVya2lzaCIvPgorICAgICAgPC9hbmFseXplcj4KKyAgICA8L2ZpZWxkVHlwZT4KKworICA8L3R5cGVzPgorICAKKyAgPCEtLSBTaW1pbGFyaXR5IGlzIHRoZSBzY29yaW5nIHJvdXRpbmUgZm9yIGVhY2ggZG9jdW1lbnQgdnMuIGEgcXVlcnkuCisgICAgICAgQSBjdXN0b20gU2ltaWxhcml0eSBvciBTaW1pbGFyaXR5RmFjdG9yeSBtYXkgYmUgc3BlY2lmaWVkIGhlcmUsIGJ1dCAKKyAgICAgICB0aGUgZGVmYXVsdCBpcyBmaW5lIGZvciBtb3N0IGFwcGxpY2F0aW9ucy4gIAorICAgICAgIEZvciBtb3JlIGluZm86IGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TY2hlbWFYbWwjU2ltaWxhcml0eQorICAgIC0tPgorICA8IS0tCisgICAgIDxzaW1pbGFyaXR5IGNsYXNzPSJjb20uZXhhbXBsZS5zb2xyLkN1c3RvbVNpbWlsYXJpdHlGYWN0b3J5Ij4KKyAgICAgICA8c3RyIG5hbWU9InBhcmFta2V5Ij5wYXJhbSB2YWx1ZTwvc3RyPgorICAgICA8L3NpbWlsYXJpdHk+CisgICAgLS0+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmY5NTIyCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwKQEAgLTAsMCArMSwxODg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAKKyAgICAgRm9yIG1vcmUgZGV0YWlscyBhYm91dCBjb25maWd1cmF0aW9ucyBvcHRpb25zIHRoYXQgbWF5IGFwcGVhciBpbgorICAgICB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU29sckNvbmZpZ1htbC4gCistLT4KKzxjb25maWc+CisgIDwhLS0gSW4gYWxsIGNvbmZpZ3VyYXRpb24gYmVsb3csIGEgcHJlZml4IG9mICJzb2xyLiIgZm9yIGNsYXNzIG5hbWVzCisgICAgICAgaXMgYW4gYWxpYXMgdGhhdCBjYXVzZXMgc29sciB0byBzZWFyY2ggYXBwcm9wcmlhdGUgcGFja2FnZXMsCisgICAgICAgaW5jbHVkaW5nIG9yZy5hcGFjaGUuc29sci4oc2VhcmNofHVwZGF0ZXxyZXF1ZXN0fGNvcmV8YW5hbHlzaXMpCisKKyAgICAgICBZb3UgbWF5IGFsc28gc3BlY2lmeSBhIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzbmFtZSBpZiB5b3UKKyAgICAgICBoYXZlIHlvdXIgb3duIGN1c3RvbSBwbHVnaW5zLgorICAgIC0tPgorCisgIDwhLS0gQ29udHJvbHMgd2hhdCB2ZXJzaW9uIG9mIEx1Y2VuZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgU29scgorICAgICAgIGFkaGVyZSB0by4gIEdlbmVyYWxseSwgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiB0bworICAgICAgIGdldCBhbGwgYnVnIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZAorICAgICAgIHRoYXQgeW91IGZ1bGx5IHJlLWluZGV4IGFmdGVyIGNoYW5naW5nIHRoaXMgc2V0dGluZyBhcyBpdCBjYW4KKyAgICAgICBhZmZlY3QgYm90aCBob3cgdGV4dCBpcyBpbmRleGVkIGFuZCBxdWVyaWVkLgorICAtLT4KKyAgPGx1Y2VuZU1hdGNoVmVyc2lvbj5MVUNFTkVfNTA8L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKworICA8IS0tIDxsaWIvPiBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIGluc3RydWN0IFNvbHIgdG8gbG9hZCBhbiBKYXJzCisgICAgICAgaWRlbnRpZmllZCBhbmQgdXNlIHRoZW0gdG8gcmVzb2x2ZSBhbnkgInBsdWdpbnMiIHNwZWNpZmllZCBpbgorICAgICAgIHlvdXIgc29scmNvbmZpZy54bWwgb3Igc2NoZW1hLnhtbCAoaWU6IEFuYWx5emVycywgUmVxdWVzdAorICAgICAgIEhhbmRsZXJzLCBldGMuLi4pLgorCisgICAgICAgQWxsIGRpcmVjdG9yaWVzIGFuZCBwYXRocyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgaW5zdGFuY2VEaXIuCisKKyAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IDxsaWIvPiBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyCisgICAgICAgdGhhdCB0aGV5IGFwcGVhciBpbiB5b3VyIHNvbHJjb25maWcueG1sIGZpbGUsIGFuZCBhcmUgInN0YWNrZWQiIAorICAgICAgIG9uIHRvcCBvZiBlYWNoIG90aGVyIHdoZW4gYnVpbGRpbmcgYSBDbGFzc0xvYWRlciAtIHNvIGlmIHlvdSBoYXZlIAorICAgICAgIHBsdWdpbiBqYXJzIHdpdGggZGVwZW5kZW5jaWVzIG9uIG90aGVyIGphcnMsIHRoZSAibG93ZXIgbGV2ZWwiIAorICAgICAgIGRlcGVuZGVuY3kgamFycyBzaG91bGQgYmUgbG9hZGVkIGZpcnN0LgorCisgICAgICAgSWYgYSAiLi9saWIiIGRpcmVjdG9yeSBleGlzdHMgaW4geW91ciBpbnN0YW5jZURpciwgYWxsIGZpbGVzCisgICAgICAgZm91bmQgaW4gaXQgYXJlIGluY2x1ZGVkIGFzIGlmIHlvdSBoYWQgdXNlZCB0aGUgZm9sbG93aW5nCisgICAgICAgc3ludGF4Li4uCisgICAgICAgCisgICAgICAgICAgICAgIDxsaWIgZGlyPSIuL2xpYiIgLz4KKyAgICAtLT4KKworICA8IS0tIEEgJ2Rpcicgb3B0aW9uIGJ5IGl0c2VsZiBhZGRzIGFueSBmaWxlcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5IAorICAgICAgIHRvIHRoZSBjbGFzc3BhdGgsIHRoaXMgaXMgdXNlZnVsIGZvciBpbmNsdWRpbmcgYWxsIGphcnMgaW4gYQorICAgICAgIGRpcmVjdG9yeS4KKworICAgICAgIFdoZW4gYSAncmVnZXgnIGlzIHNwZWNpZmllZCBpbiBhZGRpdGlvbiB0byBhICdkaXInLCBvbmx5IHRoZQorICAgICAgIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IHdoaWNoIGNvbXBsZXRlbHkgbWF0Y2ggdGhlIHJlZ2V4CisgICAgICAgKGFuY2hvcmVkIG9uIGJvdGggZW5kcykgd2lsbCBiZSBpbmNsdWRlZC4KKworICAgICAgIElmIGEgJ2Rpcicgb3B0aW9uICh3aXRoIG9yIHdpdGhvdXQgYSByZWdleCkgaXMgdXNlZCBhbmQgbm90aGluZworICAgICAgIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcywgYSB3YXJuaW5nIHdpbGwgYmUgbG9nZ2VkLgorCisgICAgICAgVGhlIGV4YW1wbGVzIGJlbG93IGNhbiBiZSB1c2VkIHRvIGxvYWQgc29tZSBzb2xyLWNvbnRyaWJzIGFsb25nIAorICAgICAgIHdpdGggdGhlaXIgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLgorICAgIC0tPgorICA8bGliIGRpcj0iLi4vLi4vLi4vY29udHJpYi9leHRyYWN0aW9uL2xpYiIgcmVnZXg9Ii4qXC5qYXIiIC8+CisgIDxsaWIgZGlyPSIuLi8uLi8uLi9kaXN0LyIgcmVnZXg9InNvbHItY2VsbC1cZC4qXC5qYXIiIC8+CisKKyAgPGxpYiBkaXI9Ii4uLy4uLy4uL2NvbnRyaWIvY2x1c3RlcmluZy9saWIvIiByZWdleD0iLipcLmphciIgLz4KKyAgPGxpYiBkaXI9Ii4uLy4uLy4uL2Rpc3QvIiByZWdleD0ic29sci1jbHVzdGVyaW5nLVxkLipcLmphciIgLz4KKworICA8bGliIGRpcj0iLi4vLi4vLi4vY29udHJpYi9sYW5naWQvbGliLyIgcmVnZXg9Ii4qXC5qYXIiIC8+CisgIDxsaWIgZGlyPSIuLi8uLi8uLi9kaXN0LyIgcmVnZXg9InNvbHItbGFuZ2lkLVxkLipcLmphciIgLz4KKworICA8bGliIGRpcj0iLi4vLi4vLi4vY29udHJpYi92ZWxvY2l0eS9saWIiIHJlZ2V4PSIuKlwuamFyIiAvPgorICA8bGliIGRpcj0iLi4vLi4vLi4vZGlzdC8iIHJlZ2V4PSJzb2xyLXZlbG9jaXR5LVxkLipcLmphciIgLz4KKworICA8IS0tIGFuIGV4YWN0ICdwYXRoJyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgJ2RpcicgdG8gc3BlY2lmeSBhIAorICAgICAgIHNwZWNpZmljIGphciBmaWxlLiAgVGhpcyB3aWxsIGNhdXNlIGEgc2VyaW91cyBlcnJvciB0byBiZSBsb2dnZWQgCisgICAgICAgaWYgaXQgY2FuJ3QgYmUgbG9hZGVkLgorICAgIC0tPgorICA8IS0tCisgICAgIDxsaWIgcGF0aD0iLi4vYS1qYXItdGhhdC1kb2VzLW5vdC1leGlzdC5qYXIiIC8+IAorICAtLT4KKworICA8IS0tIERhdGEgRGlyZWN0b3J5CisKKyAgICAgICBVc2VkIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGRpcmVjdG9yeSB0byBob2xkIGFsbCBpbmRleCBkYXRhCisgICAgICAgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAuL2RhdGEgdW5kZXIgdGhlIFNvbHIgaG9tZS4gIElmCisgICAgICAgcmVwbGljYXRpb24gaXMgaW4gdXNlLCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgcmVwbGljYXRpb24KKyAgICAgICBjb25maWd1cmF0aW9uLgorICAgIC0tPgorICA8ZGF0YURpcj4ke3NvbHIuZGF0YS5kaXI6fTwvZGF0YURpcj4KKworCisgIDwhLS0gVGhlIERpcmVjdG9yeUZhY3RvcnkgdG8gdXNlIGZvciBpbmRleGVzLgorICAgICAgIAorICAgICAgIHNvbHIuU3RhbmRhcmREaXJlY3RvcnlGYWN0b3J5IGlzIGZpbGVzeXN0ZW0KKyAgICAgICBiYXNlZCBhbmQgdHJpZXMgdG8gcGljayB0aGUgYmVzdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQKKyAgICAgICBKVk0gYW5kIHBsYXRmb3JtLiAgc29sci5OUlRDYWNoaW5nRGlyZWN0b3J5RmFjdG9yeSwgdGhlIGRlZmF1bHQsCisgICAgICAgd3JhcHMgc29sci5TdGFuZGFyZERpcmVjdG9yeUZhY3RvcnkgYW5kIGNhY2hlcyBzbWFsbCBmaWxlcyBpbiBtZW1vcnkKKyAgICAgICBmb3IgYmV0dGVyIE5SVCBwZXJmb3JtYW5jZS4KKworICAgICAgIE9uZSBjYW4gZm9yY2UgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHZpYSBzb2xyLk1NYXBEaXJlY3RvcnlGYWN0b3J5LAorICAgICAgIHNvbHIuTklPRlNEaXJlY3RvcnlGYWN0b3J5LCBvciBzb2xyLlNpbXBsZUZTRGlyZWN0b3J5RmFjdG9yeS4KKworICAgICAgIHNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeSBpcyBtZW1vcnkgYmFzZWQsIG5vdAorICAgICAgIHBlcnNpc3RlbnQsIGFuZCBkb2Vzbid0IHdvcmsgd2l0aCByZXBsaWNhdGlvbi4KKyAgICAtLT4KKyAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIKKyAgICAgICAgICAgICAgICAgICAgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuTlJUQ2FjaGluZ0RpcmVjdG9yeUZhY3Rvcnl9Ii8+CisKKyAgPCEtLSBUaGUgQ29kZWNGYWN0b3J5IGZvciBkZWZpbmluZyB0aGUgZm9ybWF0IG9mIHRoZSBpbnZlcnRlZCBpbmRleC4KKyAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBTY2hlbWFDb2RlY0ZhY3RvcnksIHdoaWNoIGlzIHRoZSBvZmZpY2lhbCBMdWNlbmUKKyAgICAgICBpbmRleCBmb3JtYXQsIGJ1dCBob29rcyBpbnRvIHRoZSBzY2hlbWEgdG8gcHJvdmlkZSBwZXItZmllbGQgY3VzdG9taXphdGlvbiBvZgorICAgICAgIHRoZSBwb3N0aW5ncyBsaXN0cyBhbmQgcGVyLWRvY3VtZW50IHZhbHVlcyBpbiB0aGUgZmllbGRUeXBlIGVsZW1lbnQKKyAgICAgICAocG9zdGluZ3NGb3JtYXQvZG9jVmFsdWVzRm9ybWF0KS4gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucworICAgICAgIGFyZSBleHBlcmltZW50YWwsIHNvIGlmIHlvdSBjaG9vc2UgdG8gY3VzdG9taXplIHRoZSBpbmRleCBmb3JtYXQsIGl0cyBhIGdvb2QKKyAgICAgICBpZGVhIHRvIGNvbnZlcnQgYmFjayB0byB0aGUgb2ZmaWNpYWwgZm9ybWF0IGUuZy4gdmlhIEluZGV4V3JpdGVyLmFkZEluZGV4ZXMoSW5kZXhSZWFkZXIpCisgICAgICAgYmVmb3JlIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVpbmRleGluZy4KKyAgLS0+CisgIDxjb2RlY0ZhY3RvcnkgY2xhc3M9InNvbHIuU2NoZW1hQ29kZWNGYWN0b3J5Ii8+CisKKyAgPCEtLSBUbyBkaXNhYmxlIGR5bmFtaWMgc2NoZW1hIFJFU1QgQVBJcywgdXNlIHRoZSBmb2xsb3dpbmcgZm9yIDxzY2hlbWFGYWN0b3J5PjoKKyAgCisgICAgICAgPHNjaGVtYUZhY3RvcnkgY2xhc3M9IkNsYXNzaWNJbmRleFNjaGVtYUZhY3RvcnkiLz4KKworICAgICAgIFdoZW4gTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSBpcyBzcGVjaWZpZWQgaW5zdGVhZCwgU29sciB3aWxsIGxvYWQgdGhlIHNjaGVtYSBmcm9tCisgICAgICAgaGUgcmVzb3VyY2UgbmFtZWQgaW4gJ21hbmFnZWRTY2hlbWFSZXNvdXJjZU5hbWUnLCByYXRoZXIgdGhhbiBmcm9tIHNjaGVtYS54bWwuCisgICAgICAgTm90ZSB0aGF0IHRoZSBtYW5hZ2VkIHNjaGVtYSByZXNvdXJjZSBDQU5OT1QgYmUgbmFtZWQgc2NoZW1hLnhtbC4gIElmIHRoZSBtYW5hZ2VkCisgICAgICAgc2NoZW1hIGRvZXMgbm90IGV4aXN0LCBTb2xyIHdpbGwgY3JlYXRlIGl0IGFmdGVyIHJlYWRpbmcgc2NoZW1hLnhtbCwgdGhlbiByZW5hbWUKKyAgICAgICAnc2NoZW1hLnhtbCcgdG8gJ3NjaGVtYS54bWwuYmFrJy4gCisgICAgICAgCisgICAgICAgRG8gTk9UIGhhbmQgZWRpdCB0aGUgbWFuYWdlZCBzY2hlbWEgLSBleHRlcm5hbCBtb2RpZmljYXRpb25zIHdpbGwgYmUgaWdub3JlZCBhbmQKKyAgICAgICBvdmVyd3JpdHRlbiBhcyBhIHJlc3VsdCBvZiBzY2hlbWEgbW9kaWZpY2F0aW9uIFJFU1QgQVBJIGNhbGxzLgorCisgICAgICAgV2hlbiBNYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5IGlzIHNwZWNpZmllZCB3aXRoIG11dGFibGUgPSB0cnVlLCBzY2hlbWEKKyAgICAgICBtb2RpZmljYXRpb24gUkVTVCBBUEkgY2FsbHMgd2lsbCBiZSBhbGxvd2VkOyBvdGhlcndpc2UsIGVycm9yIHJlc3BvbnNlcyB3aWxsIGJlCisgICAgICAgc2VudCBiYWNrIGZvciB0aGVzZSByZXF1ZXN0cy4gCisgIC0tPgorICA8c2NoZW1hRmFjdG9yeSBjbGFzcz0iTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSI+CisgICAgPGJvb2wgbmFtZT0ibXV0YWJsZSI+dHJ1ZTwvYm9vbD4KKyAgICA8c3RyIG5hbWU9Im1hbmFnZWRTY2hlbWFSZXNvdXJjZU5hbWUiPm1hbmFnZWQtc2NoZW1hPC9zdHI+CisgIDwvc2NoZW1hRmFjdG9yeT4KKworICA8IS0tIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICAgICAgIEluZGV4IENvbmZpZyAtIFRoZXNlIHNldHRpbmdzIGNvbnRyb2wgbG93LWxldmVsIGJlaGF2aW9yIG9mIGluZGV4aW5nCisgICAgICAgTW9zdCBleGFtcGxlIHNldHRpbmdzIGhlcmUgc2hvdyB0aGUgZGVmYXVsdCB2YWx1ZSwgYnV0IGFyZSBjb21tZW50ZWQKKyAgICAgICBvdXQsIHRvIG1vcmUgZWFzaWx5IHNlZSB3aGVyZSBjdXN0b21pemF0aW9ucyBoYXZlIGJlZW4gbWFkZS4KKyAgICAgICAKKyAgICAgICBOb3RlOiBUaGlzIHJlcGxhY2VzIDxpbmRleERlZmF1bHRzPiBhbmQgPG1haW5JbmRleD4gZnJvbSBvbGRlciB2ZXJzaW9ucworICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAtLT4KKyAgPGluZGV4Q29uZmlnPgorICAgIDwhLS0gbWF4RmllbGRMZW5ndGggd2FzIHJlbW92ZWQgaW4gNC4wLiBUbyBnZXQgc2ltaWxhciBiZWhhdmlvciwgaW5jbHVkZSBhIAorICAgICAgICAgTGltaXRUb2tlbkNvdW50RmlsdGVyRmFjdG9yeSBpbiB5b3VyIGZpZWxkVHlwZSBkZWZpbml0aW9uLiBFLmcuIAorICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLkxpbWl0VG9rZW5Db3VudEZpbHRlckZhY3RvcnkiIG1heFRva2VuQ291bnQ9IjEwMDAwIi8+CisgICAgLS0+CisgICAgPCEtLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgYSB3cml0ZSBsb2NrIChtcykgZm9yIGFuIEluZGV4V3JpdGVyLiBEZWZhdWx0OiAxMDAwIC0tPgorICAgIDwhLS0gPHdyaXRlTG9ja1RpbWVvdXQ+MTAwMDwvd3JpdGVMb2NrVGltZW91dD4gIC0tPgorCisgICAgPCEtLSBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRocmVhZHMgdGhhdCBtYXkgYmUKKyAgICAgICAgIGluZGV4aW5nIGRvY3VtZW50cyBhdCBvbmNlIGluIEluZGV4V3JpdGVyOyBpZiBtb3JlIHRoYW4gdGhpcworICAgICAgICAgbWFueSB0aHJlYWRzIGFycml2ZSB0aGV5IHdpbGwgd2FpdCBmb3Igb3RoZXJzIHRvIGZpbmlzaC4KKyAgICAgICAgIERlZmF1bHQgaW4gU29sci9MdWNlbmUgaXMgOC4gLS0+CisgICAgPCEtLSA8bWF4SW5kZXhpbmdUaHJlYWRzPjg8L21heEluZGV4aW5nVGhyZWFkcz4gIC0tPgorCisgICAgPCEtLSBFeHBlcnQ6IEVuYWJsaW5nIGNvbXBvdW5kIGZpbGUgd2lsbCB1c2UgbGVzcyBmaWxlcyBmb3IgdGhlIGluZGV4LCAKKyAgICAgICAgIHVzaW5nIGZld2VyIGZpbGUgZGVzY3JpcHRvcnMgb24gdGhlIGV4cGVuc2Ugb2YgcGVyZm9ybWFuY2UgZGVjcmVhc2UuIAorICAgICAgICAgRGVmYXVsdCBpbiBMdWNlbmUgaXMgInRydWUiLiBEZWZhdWx0IGluIFNvbHIgaXMgImZhbHNlIiAoc2luY2UgMy42KSAtLT4KKyAgICA8IS0tIDx1c2VDb21wb3VuZEZpbGU+ZmFsc2U8L3VzZUNvbXBvdW5kRmlsZT4gLS0+CisKKyAgICA8IS0tIHJhbUJ1ZmZlclNpemVNQiBzZXRzIHRoZSBhbW91bnQgb2YgUkFNIHRoYXQgbWF5IGJlIHVzZWQgYnkgTHVjZW5lCisgICAgICAgICBpbmRleGluZyBmb3IgYnVmZmVyaW5nIGFkZGVkIGRvY3VtZW50cyBhbmQgZGVsZXRpb25zIGJlZm9yZSB0aGV5IGFyZQorICAgICAgICAgZmx1c2hlZCB0byB0aGUgRGlyZWN0b3J5LgorICAgICAgICAgbWF4QnVmZmVyZWREb2NzIHNldHMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBidWZmZXJlZAorICAgICAgICAgYmVmb3JlIGZsdXNoaW5nLgorICAgICAgICAgSWYgYm90aCByYW1CdWZmZXJTaXplTUIgYW5kIG1heEJ1ZmZlcmVkRG9jcyBpcyBzZXQsIHRoZW4KKyAgICAgICAgIEx1Y2VuZSB3aWxsIGZsdXNoIGJhc2VkIG9uIHdoaWNoZXZlciBsaW1pdCBpcyBoaXQgZmlyc3QuICAtLT4KKyAgICA8IS0tIDxyYW1CdWZmZXJTaXplTUI+MTAwPC9yYW1CdWZmZXJTaXplTUI+IC0tPgorICAgIDwhLS0gPG1heEJ1ZmZlcmVkRG9jcz4xMDAwPC9tYXhCdWZmZXJlZERvY3M+IC0tPgorCisgICAgPCEtLSBFeHBlcnQ6IE1lcmdlIFBvbGljeSAKKyAgICAgICAgIFRoZSBNZXJnZSBQb2xpY3kgaW4gTHVjZW5lIGNvbnRyb2xzIGhvdyBtZXJnaW5nIG9mIHNlZ21lbnRzIGlzIGRvbmUuCisgICAgICAgICBUaGUgZGVmYXVsdCBzaW5jZSBTb2xyL0x1Y2VuZSAzLjMgaXMgVGllcmVkTWVyZ2VQb2xpY3kuCisgICAgICAgICBUaGUgZGVmYXVsdCBzaW5jZSBMdWNlbmUgMi4zIHdhcyB0aGUgTG9nQnl0ZVNpemVNZXJnZVBvbGljeSwKKyAgICAgICAgIEV2ZW4gb2xkZXIgdmVyc2lvbnMgb2YgTHVjZW5lIHVzZWQgTG9nRG9jTWVyZ2VQb2xpY3kuCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgIDxtZXJnZVBvbGljeSBjbGFzcz0ib3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguVGllcmVkTWVyZ2VQb2xpY3kiPgorICAgICAgICAgIDxpbnQgbmFtZT0ibWF4TWVyZ2VBdE9uY2UiPjEwPC9pbnQ+CisgICAgICAgICAgPGludCBuYW1lPSJzZWdtZW50c1BlclRpZXIiPjEwPC9pbnQ+CisgICAgICAgIDwvbWVyZ2VQb2xpY3k+CisgICAgICAtLT4KKworICAgIDwhLS0gTWVyZ2UgRmFjdG9yCisgICAgICAgICBUaGUgbWVyZ2UgZmFjdG9yIGNvbnRyb2xzIGhvdyBtYW55IHNlZ21lbnRzIHdpbGwgZ2V0IG1lcmdlZCBhdCBhIHRpbWUuCisgICAgICAgICBGb3IgVGllcmVkTWVyZ2VQb2xpY3ksIG1lcmdlRmFjdG9yIGlzIGEgY29udmVuaWVuY2UgcGFyYW1ldGVyIHdoaWNoCisgICAgICAgICB3aWxsIHNldCBib3RoIE1heE1lcmdlQXRPbmNlIGFuZCBTZWdtZW50c1BlclRpZXIgYXQgb25jZS4KKyAgICAgICAgIEZvciBMb2dCeXRlU2l6ZU1lcmdlUG9saWN5LCBtZXJnZUZhY3RvciBkZWNpZGVzIGhvdyBtYW55IG5ldyBzZWdtZW50cworICAgICAgICAgd2lsbCBiZSBhbGxvd2VkIGJlZm9yZSB0aGV5IGFyZSBtZXJnZWQgaW50byBvbmUuCisgICAgICAgICBEZWZhdWx0IGlzIDEwIGZvciBib3RoIG1lcmdlIHBvbGljaWVzLgorICAgICAgLS0+CisgICAgPCEtLSAKKyAgICA8bWVyZ2VGYWN0b3I+MTA8L21lcmdlRmFjdG9yPgorICAgICAgLS0+CisKKyAgICA8IS0tIEV4cGVydDogTWVyZ2UgU2NoZWR1bGVyCisgICAgICAgICBUaGUgTWVyZ2UgU2NoZWR1bGVyIGluIEx1Y2VuZSBjb250cm9scyBob3cgbWVyZ2VzIGFyZQorICAgICAgICAgcGVyZm9ybWVkLiAgVGhlIENvbmN1cnJlbnRNZXJnZVNjaGVkdWxlciAoTHVjZW5lIDIuMyBkZWZhdWx0KQorICAgICAgICAgY2FuIHBlcmZvcm0gbWVyZ2VzIGluIHRoZSBiYWNrZ3JvdW5kIHVzaW5nIHNlcGFyYXRlIHRocmVhZHMuCisgICAgICAgICBUaGUgU2VyaWFsTWVyZ2VTY2hlZHVsZXIgKEx1Y2VuZSAyLjIgZGVmYXVsdCkgZG9lcyBub3QuCisgICAgIC0tPgorICAgIDwhLS0gCisgICAgICAgPG1lcmdlU2NoZWR1bGVyIGNsYXNzPSJvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5Db25jdXJyZW50TWVyZ2VTY2hlZHVsZXIiLz4KKyAgICAgICAtLT4KKworICAgIDwhLS0gTG9ja0ZhY3RvcnkgCisKKyAgICAgICAgIFRoaXMgb3B0aW9uIHNwZWNpZmllcyB3aGljaCBMdWNlbmUgTG9ja0ZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICAgICAgIHRvIHVzZS4KKyAgICAgIAorICAgICAgICAgc2luZ2xlID0gU2luZ2xlSW5zdGFuY2VMb2NrRmFjdG9yeSAtIHN1Z2dlc3RlZCBmb3IgYQorICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5IGluZGV4IG9yIHdoZW4gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YKKyAgICAgICAgICAgICAgICAgIGFub3RoZXIgcHJvY2VzcyB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBpbmRleC4KKyAgICAgICAgIG5hdGl2ZSA9IE5hdGl2ZUZTTG9ja0ZhY3RvcnkgLSB1c2VzIE9TIG5hdGl2ZSBmaWxlIGxvY2tpbmcuCisgICAgICAgICAgICAgICAgICBEbyBub3QgdXNlIHdoZW4gbXVsdGlwbGUgc29sciB3ZWJhcHBzIGluIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICBKVk0gYXJlIGF0dGVtcHRpbmcgdG8gc2hhcmUgYSBzaW5nbGUgaW5kZXguCisgICAgICAgICBzaW1wbGUgPSBTaW1wbGVGU0xvY2tGYWN0b3J5ICAtIHVzZXMgYSBwbGFpbiBmaWxlIGZvciBsb2NraW5nCisKKyAgICAgICAgIERlZmF1bHRzOiAnbmF0aXZlJyBpcyBkZWZhdWx0IGZvciBTb2xyMy42IGFuZCBsYXRlciwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgJ3NpbXBsZScgaXMgdGhlIGRlZmF1bHQKKworICAgICAgICAgTW9yZSBkZXRhaWxzIG9uIHRoZSBudWFuY2VzIG9mIGVhY2ggTG9ja0ZhY3RvcnkuLi4KKyAgICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbHVjZW5lLWphdmEvQXZhaWxhYmxlTG9ja0ZhY3RvcmllcworICAgIC0tPgorICAgIDxsb2NrVHlwZT4ke3NvbHIubG9jay50eXBlOm5hdGl2ZX08L2xvY2tUeXBlPgorCisgICAgPCEtLSBVbmxvY2sgT24gU3RhcnR1cAorCisgICAgICAgICBJZiB0cnVlLCB1bmxvY2sgYW55IGhlbGQgd3JpdGUgb3IgY29tbWl0IGxvY2tzIG9uIHN0YXJ0dXAuCisgICAgICAgICBUaGlzIGRlZmVhdHMgdGhlIGxvY2tpbmcgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIG11bHRpcGxlCisgICAgICAgICBwcm9jZXNzZXMgdG8gc2FmZWx5IGFjY2VzcyBhIGx1Y2VuZSBpbmRleCwgYW5kIHNob3VsZCBiZSB1c2VkCisgICAgICAgICB3aXRoIGNhcmUuIERlZmF1bHQgaXMgImZhbHNlIi4KKworICAgICAgICAgVGhpcyBpcyBub3QgbmVlZGVkIGlmIGxvY2sgdHlwZSBpcyAnc2luZ2xlJworICAgICAtLT4KKyAgICA8IS0tCisgICAgPHVubG9ja09uU3RhcnR1cD5mYWxzZTwvdW5sb2NrT25TdGFydHVwPgorICAgICAgLS0+CisKKyAgICA8IS0tIEV4cGVydDogQ29udHJvbHMgaG93IG9mdGVuIEx1Y2VuZSBsb2FkcyB0ZXJtcyBpbnRvIG1lbW9yeQorICAgICAgICAgRGVmYXVsdCBpcyAxMjggYW5kIGlzIGxpa2VseSBnb29kIGZvciBtb3N0IGV2ZXJ5b25lLgorICAgICAgLS0+CisgICAgPCEtLSA8dGVybUluZGV4SW50ZXJ2YWw+MTI4PC90ZXJtSW5kZXhJbnRlcnZhbD4gLS0+CisKKyAgICA8IS0tIElmIHRydWUsIEluZGV4UmVhZGVycyB3aWxsIGJlIHJlb3BlbmVkIChvZnRlbiBtb3JlIGVmZmljaWVudCkKKyAgICAgICAgIGluc3RlYWQgb2YgY2xvc2VkIGFuZCB0aGVuIG9wZW5lZC4gRGVmYXVsdDogdHJ1ZQorICAgICAgLS0+CisgICAgPCEtLSAKKyAgICA8cmVvcGVuUmVhZGVycz50cnVlPC9yZW9wZW5SZWFkZXJzPgorICAgICAgLS0+CisKKyAgICA8IS0tIENvbW1pdCBEZWxldGlvbiBQb2xpY3kKKyAgICAgICAgIEN1c3RvbSBkZWxldGlvbiBwb2xpY2llcyBjYW4gYmUgc3BlY2lmaWVkIGhlcmUuIFRoZSBjbGFzcyBtdXN0CisgICAgICAgICBpbXBsZW1lbnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhEZWxldGlvblBvbGljeS4KKworICAgICAgICAgVGhlIGRlZmF1bHQgU29sciBJbmRleERlbGV0aW9uUG9saWN5IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCisgICAgICAgICBkZWxldGluZyBpbmRleCBjb21taXQgcG9pbnRzIG9uIG51bWJlciBvZiBjb21taXRzLCBhZ2Ugb2YKKyAgICAgICAgIGNvbW1pdCBwb2ludCBhbmQgb3B0aW1pemVkIHN0YXR1cy4KKyAgICAgICAgIAorICAgICAgICAgVGhlIGxhdGVzdCBjb21taXQgcG9pbnQgc2hvdWxkIGFsd2F5cyBiZSBwcmVzZXJ2ZWQgcmVnYXJkbGVzcworICAgICAgICAgb2YgdGhlIGNyaXRlcmlhLgorICAgIC0tPgorICAgIDwhLS0gCisgICAgPGRlbGV0aW9uUG9saWN5IGNsYXNzPSJzb2xyLlNvbHJEZWxldGlvblBvbGljeSI+CisgICAgLS0+CisgICAgPCEtLSBUaGUgbnVtYmVyIG9mIGNvbW1pdCBwb2ludHMgdG8gYmUga2VwdCAtLT4KKyAgICA8IS0tIDxzdHIgbmFtZT0ibWF4Q29tbWl0c1RvS2VlcCI+MTwvc3RyPiAtLT4KKyAgICA8IS0tIFRoZSBudW1iZXIgb2Ygb3B0aW1pemVkIGNvbW1pdCBwb2ludHMgdG8gYmUga2VwdCAtLT4KKyAgICA8IS0tIDxzdHIgbmFtZT0ibWF4T3B0aW1pemVkQ29tbWl0c1RvS2VlcCI+MDwvc3RyPiAtLT4KKyAgICA8IS0tCisgICAgICAgIERlbGV0ZSBhbGwgY29tbWl0IHBvaW50cyBvbmNlIHRoZXkgaGF2ZSByZWFjaGVkIHRoZSBnaXZlbiBhZ2UuCisgICAgICAgIFN1cHBvcnRzIERhdGVNYXRoUGFyc2VyIHN5bnRheCBlLmcuCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPHN0ciBuYW1lPSJtYXhDb21taXRBZ2UiPjMwTUlOVVRFUzwvc3RyPgorICAgICAgIDxzdHIgbmFtZT0ibWF4Q29tbWl0QWdlIj4xREFZPC9zdHI+CisgICAgLS0+CisgICAgPCEtLSAKKyAgICA8L2RlbGV0aW9uUG9saWN5PgorICAgIC0tPgorCisgICAgPCEtLSBMdWNlbmUgSW5mb3N0cmVhbQorICAgICAgIAorICAgICAgICAgVG8gYWlkIGluIGFkdmFuY2VkIGRlYnVnZ2luZywgTHVjZW5lIHByb3ZpZGVzIGFuICJJbmZvU3RyZWFtIgorICAgICAgICAgb2YgZGV0YWlsZWQgaW5mb3JtYXRpb24gd2hlbiBpbmRleGluZy4KKworICAgICAgICAgU2V0dGluZyBUaGUgdmFsdWUgdG8gdHJ1ZSB3aWxsIGluc3RydWN0IHRoZSB1bmRlcmx5aW5nIEx1Y2VuZQorICAgICAgICAgSW5kZXhXcml0ZXIgdG8gd3JpdGUgaXRzIGRlYnVnZ2luZyBpbmZvIHRoZSBzcGVjaWZpZWQgZmlsZQorICAgICAgLS0+CisgICAgPCEtLSA8aW5mb1N0cmVhbSBmaWxlPSJJTkZPU1RSRUFNLnR4dCI+ZmFsc2U8L2luZm9TdHJlYW0+IC0tPgorICA8L2luZGV4Q29uZmlnPgorCisKKyAgPCEtLSBKTVgKKyAgICAgICAKKyAgICAgICBUaGlzIGV4YW1wbGUgZW5hYmxlcyBKTVggaWYgYW5kIG9ubHkgaWYgYW4gZXhpc3RpbmcgTUJlYW5TZXJ2ZXIKKyAgICAgICBpcyBmb3VuZCwgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gY29uZmlndXJlIEpNWCB0aHJvdWdoIEpWTQorICAgICAgIHBhcmFtZXRlcnMuIFJlbW92ZSB0aGlzIHRvIGRpc2FibGUgZXhwb3NpbmcgU29sciBjb25maWd1cmF0aW9uCisgICAgICAgYW5kIHN0YXRpc3RpY3MgdG8gSk1YLgorCisgICAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJKbXgKKyAgICAtLT4KKyAgPGpteCAvPgorICA8IS0tIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIHNlcnZlciwgc3BlY2lmeSB0aGUKKyAgICAgICBhZ2VudElkIAorICAgIC0tPgorICA8IS0tIDxqbXggYWdlbnRJZD0ibXlBZ2VudCIgLz4gLS0+CisgIDwhLS0gSWYgeW91IHdhbnQgdG8gc3RhcnQgYSBuZXcgTUJlYW5TZXJ2ZXIsIHNwZWNpZnkgdGhlIHNlcnZpY2VVcmwgLS0+CisgIDwhLS0gPGpteCBzZXJ2aWNlVXJsPSJzZXJ2aWNlOmpteDpybWk6Ly8vam5kaS9ybWk6Ly9sb2NhbGhvc3Q6OTk5OS9zb2xyIi8+CisgICAgLS0+CisKKyAgPCEtLSBUaGUgZGVmYXVsdCBoaWdoLXBlcmZvcm1hbmNlIHVwZGF0ZSBoYW5kbGVyIC0tPgorICA8dXBkYXRlSGFuZGxlciBjbGFzcz0ic29sci5EaXJlY3RVcGRhdGVIYW5kbGVyMiI+CisKKyAgICA8IS0tIEVuYWJsZXMgYSB0cmFuc2FjdGlvbiBsb2csIHVzZWQgZm9yIHJlYWwtdGltZSBnZXQsIGR1cmFiaWxpdHksIGFuZAorICAgICAgICAgYW5kIHNvbHIgY2xvdWQgcmVwbGljYSByZWNvdmVyeS4gIFRoZSBsb2cgY2FuIGdyb3cgYXMgYmlnIGFzCisgICAgICAgICB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIHRoZSBpbmRleCwgc28gdXNlIG9mIGEgaGFyZCBhdXRvQ29tbWl0CisgICAgICAgICBpcyByZWNvbW1lbmRlZCAoc2VlIGJlbG93KS4KKyAgICAgICAgICJkaXIiIC0gdGhlIHRhcmdldCBkaXJlY3RvcnkgZm9yIHRyYW5zYWN0aW9uIGxvZ3MsIGRlZmF1bHRzIHRvIHRoZQorICAgICAgICAgICAgICAgIHNvbHIgZGF0YSBkaXJlY3RvcnkuICAtLT4KKyAgICA8dXBkYXRlTG9nPgorICAgICAgPHN0ciBuYW1lPSJkaXIiPiR7c29sci51bG9nLmRpcjp9PC9zdHI+CisgICAgPC91cGRhdGVMb2c+CisKKyAgICA8IS0tIEF1dG9Db21taXQKKworICAgICAgICAgUGVyZm9ybSBhIGhhcmQgY29tbWl0IGF1dG9tYXRpY2FsbHkgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgorICAgICAgICAgSW5zdGVhZCBvZiBlbmFibGluZyBhdXRvQ29tbWl0LCBjb25zaWRlciB1c2luZyAiY29tbWl0V2l0aGluIgorICAgICAgICAgd2hlbiBhZGRpbmcgZG9jdW1lbnRzLiAKKworICAgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1VwZGF0ZVhtbE1lc3NhZ2VzCisKKyAgICAgICAgIG1heERvY3MgLSBNYXhpbXVtIG51bWJlciBvZiBkb2N1bWVudHMgdG8gYWRkIHNpbmNlIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgY29tbWl0IGJlZm9yZSBhdXRvbWF0aWNhbGx5IHRyaWdnZXJpbmcgYSBuZXcgY29tbWl0LgorCisgICAgICAgICBtYXhUaW1lIC0gTWF4aW11bSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IGlzIGFsbG93ZWQgdG8gcGFzcworICAgICAgICAgICAgICAgICAgIHNpbmNlIGEgZG9jdW1lbnQgd2FzIGFkZGVkIGJlZm9yZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyBhIG5ldyBjb21taXQuIAorICAgICAgICAgb3BlblNlYXJjaGVyIC0gaWYgZmFsc2UsIHRoZSBjb21taXQgY2F1c2VzIHJlY2VudCBpbmRleCBjaGFuZ2VzCisgICAgICAgICAgIHRvIGJlIGZsdXNoZWQgdG8gc3RhYmxlIHN0b3JhZ2UsIGJ1dCBkb2VzIG5vdCBjYXVzZSBhIG5ldworICAgICAgICAgICBzZWFyY2hlciB0byBiZSBvcGVuZWQgdG8gbWFrZSB0aG9zZSBjaGFuZ2VzIHZpc2libGUuCisKKyAgICAgICAgIElmIHRoZSB1cGRhdGVMb2cgaXMgZW5hYmxlZCwgdGhlbiBpdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0bworICAgICAgICAgaGF2ZSBzb21lIHNvcnQgb2YgaGFyZCBhdXRvQ29tbWl0IHRvIGxpbWl0IHRoZSBsb2cgc2l6ZS4KKyAgICAgIC0tPgorICAgIDxhdXRvQ29tbWl0PgorICAgICAgPG1heFRpbWU+MTUwMDA8L21heFRpbWU+CisgICAgICA8b3BlblNlYXJjaGVyPmZhbHNlPC9vcGVuU2VhcmNoZXI+CisgICAgPC9hdXRvQ29tbWl0PgorCisgICAgPCEtLSBzb2Z0QXV0b0NvbW1pdCBpcyBsaWtlIGF1dG9Db21taXQgZXhjZXB0IGl0IGNhdXNlcyBhCisgICAgICAgICAnc29mdCcgY29tbWl0IHdoaWNoIG9ubHkgZW5zdXJlcyB0aGF0IGNoYW5nZXMgYXJlIHZpc2libGUKKyAgICAgICAgIGJ1dCBkb2VzIG5vdCBlbnN1cmUgdGhhdCBkYXRhIGlzIHN5bmNlZCB0byBkaXNrLiAgVGhpcyBpcworICAgICAgICAgZmFzdGVyIGFuZCBtb3JlIG5lYXItcmVhbHRpbWUgZnJpZW5kbHkgdGhhbiBhIGhhcmQgY29tbWl0LgorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgPGF1dG9Tb2Z0Q29tbWl0PiAKKyAgICAgICAgPG1heFRpbWU+MTAwMDwvbWF4VGltZT4gCisgICAgICA8L2F1dG9Tb2Z0Q29tbWl0PgorICAgICAtLT4KKworICAgIDwhLS0gVXBkYXRlIFJlbGF0ZWQgRXZlbnQgTGlzdGVuZXJzCisgICAgICAgICAKKyAgICAgICAgIFZhcmlvdXMgSW5kZXhXcml0ZXIgcmVsYXRlZCBldmVudHMgY2FuIHRyaWdnZXIgTGlzdGVuZXJzIHRvCisgICAgICAgICB0YWtlIGFjdGlvbnMuCisKKyAgICAgICAgIHBvc3RDb21taXQgLSBmaXJlZCBhZnRlciBldmVyeSBjb21taXQgb3Igb3B0aW1pemUgY29tbWFuZAorICAgICAgICAgcG9zdE9wdGltaXplIC0gZmlyZWQgYWZ0ZXIgZXZlcnkgb3B0aW1pemUgY29tbWFuZAorICAgICAgLS0+CisgICAgPCEtLSBUaGUgUnVuRXhlY3V0YWJsZUxpc3RlbmVyIGV4ZWN1dGVzIGFuIGV4dGVybmFsIGNvbW1hbmQgZnJvbSBhCisgICAgICAgICBob29rIHN1Y2ggYXMgcG9zdENvbW1pdCBvciBwb3N0T3B0aW1pemUuCisgICAgICAgICAKKyAgICAgICAgIGV4ZSAtIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRvIHJ1bgorICAgICAgICAgZGlyIC0gZGlyIHRvIHVzZSBhcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKGRlZmF1bHQ9Ii4iKQorICAgICAgICAgd2FpdCAtIHRoZSBjYWxsaW5nIHRocmVhZCB3YWl0cyB1bnRpbCB0aGUgZXhlY3V0YWJsZSByZXR1cm5zLiAKKyAgICAgICAgICAgICAgICAoZGVmYXVsdD0idHJ1ZSIpCisgICAgICAgICBhcmdzIC0gdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtLiAgKGRlZmF1bHQgaXMgbm9uZSkKKyAgICAgICAgIGVudiAtIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQuICAoZGVmYXVsdCBpcyBub25lKQorICAgICAgLS0+CisgICAgPCEtLSBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IFJ1bkV4ZWN1dGFibGVMaXN0ZW5lciBjb3VsZCBiZSB1c2VkCisgICAgICAgICB3aXRoIHRoZSBzY3JpcHQgYmFzZWQgcmVwbGljYXRpb24uLi4KKyAgICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Db2xsZWN0aW9uRGlzdHJpYnV0aW9uCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxpc3RlbmVyIGV2ZW50PSJwb3N0Q29tbWl0IiBjbGFzcz0ic29sci5SdW5FeGVjdXRhYmxlTGlzdGVuZXIiPgorICAgICAgICAgPHN0ciBuYW1lPSJleGUiPnNvbHIvYmluL3NuYXBzaG9vdGVyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImRpciI+Ljwvc3RyPgorICAgICAgICAgPGJvb2wgbmFtZT0id2FpdCI+dHJ1ZTwvYm9vbD4KKyAgICAgICAgIDxhcnIgbmFtZT0iYXJncyI+IDxzdHI+YXJnMTwvc3RyPiA8c3RyPmFyZzI8L3N0cj4gPC9hcnI+CisgICAgICAgICA8YXJyIG5hbWU9ImVudiI+IDxzdHI+TVlWQVI9dmFsMTwvc3RyPiA8L2Fycj4KKyAgICAgICA8L2xpc3RlbmVyPgorICAgICAgLS0+CisKKyAgPC91cGRhdGVIYW5kbGVyPgorCisgIDwhLS0gSW5kZXhSZWFkZXJGYWN0b3J5CisKKyAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBmb3JtYXQgdG8gc3BlY2lmeSBhIGN1c3RvbSBJbmRleFJlYWRlckZhY3RvcnksCisgICAgICAgd2hpY2ggYWxsb3dzIGZvciBhbHRlcm5hdGUgSW5kZXhSZWFkZXIgaW1wbGVtZW50YXRpb25zLgorCisgICAgICAgKiogRXhwZXJpbWVudGFsIEZlYXR1cmUgKioKKworICAgICAgIFBsZWFzZSBub3RlIC0gVXNpbmcgYSBjdXN0b20gSW5kZXhSZWFkZXJGYWN0b3J5IG1heSBwcmV2ZW50CisgICAgICAgY2VydGFpbiBvdGhlciBmZWF0dXJlcyBmcm9tIHdvcmtpbmcuIFRoZSBBUEkgdG8KKyAgICAgICBJbmRleFJlYWRlckZhY3RvcnkgbWF5IGNoYW5nZSB3aXRob3V0IHdhcm5pbmcgb3IgbWF5IGV2ZW4gYmUKKyAgICAgICByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzIGlmIHRoZSBwcm9ibGVtcyBjYW5ub3QgYmUKKyAgICAgICByZXNvbHZlZC4KKworCisgICAgICAgKiogRmVhdHVyZXMgdGhhdCBtYXkgbm90IHdvcmsgd2l0aCBjdXN0b20gSW5kZXhSZWFkZXJGYWN0b3J5ICoqCisKKyAgICAgICBUaGUgUmVwbGljYXRpb25IYW5kbGVyIGFzc3VtZXMgYSBkaXNrLXJlc2lkZW50IGluZGV4LiBVc2luZyBhCisgICAgICAgY3VzdG9tIEluZGV4UmVhZGVyIGltcGxlbWVudGF0aW9uIG1heSBjYXVzZSBpbmNvbXBhdGliaWxpdHkKKyAgICAgICB3aXRoIFJlcGxpY2F0aW9uSGFuZGxlciBhbmQgbWF5IGNhdXNlIHJlcGxpY2F0aW9uIHRvIG5vdCB3b3JrCisgICAgICAgY29ycmVjdGx5LiBTZWUgU09MUi0xMzY2IGZvciBkZXRhaWxzLgorCisgICAgLS0+CisgIDwhLS0KKyAgPGluZGV4UmVhZGVyRmFjdG9yeSBuYW1lPSJJbmRleFJlYWRlckZhY3RvcnkiIGNsYXNzPSJwYWNrYWdlLmNsYXNzIj4KKyAgICA8c3RyIG5hbWU9InNvbWVBcmciPlNvbWUgVmFsdWU8L3N0cj4KKyAgPC9pbmRleFJlYWRlckZhY3RvcnkgPgorICAtLT4KKyAgPCEtLSBCeSBleHBsaWNpdGx5IGRlY2xhcmluZyB0aGUgRmFjdG9yeSwgdGhlIHRlcm1JbmRleERpdmlzb3IgY2FuCisgICAgICAgYmUgc3BlY2lmaWVkLgorICAgIC0tPgorICA8IS0tCisgICAgIDxpbmRleFJlYWRlckZhY3RvcnkgbmFtZT0iSW5kZXhSZWFkZXJGYWN0b3J5IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5TdGFuZGFyZEluZGV4UmVhZGVyRmFjdG9yeSI+CisgICAgICAgPGludCBuYW1lPSJzZXRUZXJtSW5kZXhEaXZpc29yIj4xMjwvaW50PgorICAgICA8L2luZGV4UmVhZGVyRmFjdG9yeSA+CisgICAgLS0+CisKKyAgPCEtLSB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAgICAgICBRdWVyeSBzZWN0aW9uIC0gdGhlc2Ugc2V0dGluZ3MgY29udHJvbCBxdWVyeSB0aW1lIHRoaW5ncyBsaWtlIGNhY2hlcworICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAtLT4KKyAgPHF1ZXJ5PgorICAgIDwhLS0gTWF4IEJvb2xlYW4gQ2xhdXNlcworCisgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjbGF1c2VzIGluIGVhY2ggQm9vbGVhblF1ZXJ5LCAgYW4gZXhjZXB0aW9uCisgICAgICAgICBpcyB0aHJvd24gaWYgZXhjZWVkZWQuCisKKyAgICAgICAgICoqIFdBUk5JTkcgKioKKyAgICAgICAgIAorICAgICAgICAgVGhpcyBvcHRpb24gYWN0dWFsbHkgbW9kaWZpZXMgYSBnbG9iYWwgTHVjZW5lIHByb3BlcnR5IHRoYXQKKyAgICAgICAgIHdpbGwgYWZmZWN0IGFsbCBTb2xyQ29yZXMuICBJZiBtdWx0aXBsZSBzb2xyY29uZmlnLnhtbCBmaWxlcworICAgICAgICAgZGlzYWdyZWUgb24gdGhpcyBwcm9wZXJ0eSwgdGhlIHZhbHVlIGF0IGFueSBnaXZlbiBtb21lbnQgd2lsbAorICAgICAgICAgYmUgYmFzZWQgb24gdGhlIGxhc3QgU29sckNvcmUgdG8gYmUgaW5pdGlhbGl6ZWQuCisgICAgICAgICAKKyAgICAgIC0tPgorICAgIDxtYXhCb29sZWFuQ2xhdXNlcz4xMDI0PC9tYXhCb29sZWFuQ2xhdXNlcz4KKworCisgICAgPCEtLSBTb2xyIEludGVybmFsIFF1ZXJ5IENhY2hlcworCisgICAgICAgICBUaGVyZSBhcmUgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBjYWNoZSBhdmFpbGFibGUgZm9yIFNvbHIsCisgICAgICAgICBMUlVDYWNoZSwgYmFzZWQgb24gYSBzeW5jaHJvbml6ZWQgTGlua2VkSGFzaE1hcCwgYW5kCisgICAgICAgICBGYXN0TFJVQ2FjaGUsIGJhc2VkIG9uIGEgQ29uY3VycmVudEhhc2hNYXAuICAKKworICAgICAgICAgRmFzdExSVUNhY2hlIGhhcyBmYXN0ZXIgZ2V0cyBhbmQgc2xvd2VyIHB1dHMgaW4gc2luZ2xlCisgICAgICAgICB0aHJlYWRlZCBvcGVyYXRpb24gYW5kIHRodXMgaXMgZ2VuZXJhbGx5IGZhc3RlciB0aGFuIExSVUNhY2hlCisgICAgICAgICB3aGVuIHRoZSBoaXQgcmF0aW8gb2YgdGhlIGNhY2hlIGlzIGhpZ2ggKD4gNzUlKSwgYW5kIG1heSBiZQorICAgICAgICAgZmFzdGVyIHVuZGVyIG90aGVyIHNjZW5hcmlvcyBvbiBtdWx0aS1jcHUgc3lzdGVtcy4KKyAgICAtLT4KKworICAgIDwhLS0gRmlsdGVyIENhY2hlCisKKyAgICAgICAgIENhY2hlIHVzZWQgYnkgU29sckluZGV4U2VhcmNoZXIgZm9yIGZpbHRlcnMgKERvY1NldHMpLAorICAgICAgICAgdW5vcmRlcmVkIHNldHMgb2YgKmFsbCogZG9jdW1lbnRzIHRoYXQgbWF0Y2ggYSBxdWVyeS4gIFdoZW4gYQorICAgICAgICAgbmV3IHNlYXJjaGVyIGlzIG9wZW5lZCwgaXRzIGNhY2hlcyBtYXkgYmUgcHJlcG9wdWxhdGVkIG9yCisgICAgICAgICAiYXV0b3dhcm1lZCIgdXNpbmcgZGF0YSBmcm9tIGNhY2hlcyBpbiB0aGUgb2xkIHNlYXJjaGVyLgorICAgICAgICAgYXV0b3dhcm1Db3VudCBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHByZXBvcHVsYXRlLiAgRm9yCisgICAgICAgICBMUlVDYWNoZSwgdGhlIGF1dG93YXJtZWQgaXRlbXMgd2lsbCBiZSB0aGUgbW9zdCByZWNlbnRseQorICAgICAgICAgYWNjZXNzZWQgaXRlbXMuCisKKyAgICAgICAgIFBhcmFtZXRlcnM6CisgICAgICAgICAgIGNsYXNzIC0gdGhlIFNvbHJDYWNoZSBpbXBsZW1lbnRhdGlvbiBMUlVDYWNoZSBvcgorICAgICAgICAgICAgICAgKExSVUNhY2hlIG9yIEZhc3RMUlVDYWNoZSkKKyAgICAgICAgICAgc2l6ZSAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjYWNoZQorICAgICAgICAgICBpbml0aWFsU2l6ZSAtIHRoZSBpbml0aWFsIGNhcGFjaXR5IChudW1iZXIgb2YgZW50cmllcykgb2YKKyAgICAgICAgICAgICAgIHRoZSBjYWNoZS4gIChzZWUgamF2YS51dGlsLkhhc2hNYXApCisgICAgICAgICAgIGF1dG93YXJtQ291bnQgLSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gcHJlcG9wdWxhdGUgZnJvbQorICAgICAgICAgICAgICAgYW5kIG9sZCBjYWNoZS4gIAorICAgICAgLS0+CisgICAgPGZpbHRlckNhY2hlIGNsYXNzPSJzb2xyLkZhc3RMUlVDYWNoZSIKKyAgICAgICAgICAgICAgICAgc2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICBhdXRvd2FybUNvdW50PSIwIi8+CisKKyAgICA8IS0tIFF1ZXJ5IFJlc3VsdCBDYWNoZQorICAgICAgICAgCisgICAgICAgICBDYWNoZXMgcmVzdWx0cyBvZiBzZWFyY2hlcyAtIG9yZGVyZWQgbGlzdHMgb2YgZG9jdW1lbnQgaWRzCisgICAgICAgICAoRG9jTGlzdCkgYmFzZWQgb24gYSBxdWVyeSwgYSBzb3J0LCBhbmQgdGhlIHJhbmdlIG9mIGRvY3VtZW50cyByZXF1ZXN0ZWQuICAKKyAgICAgIC0tPgorICAgIDxxdWVyeVJlc3VsdENhY2hlIGNsYXNzPSJzb2xyLkxSVUNhY2hlIgorICAgICAgICAgICAgICAgICAgICAgIHNpemU9IjUxMiIKKyAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZT0iNTEyIgorICAgICAgICAgICAgICAgICAgICAgIGF1dG93YXJtQ291bnQ9IjAiLz4KKworICAgIDwhLS0gRG9jdW1lbnQgQ2FjaGUKKworICAgICAgICAgQ2FjaGVzIEx1Y2VuZSBEb2N1bWVudCBvYmplY3RzICh0aGUgc3RvcmVkIGZpZWxkcyBmb3IgZWFjaAorICAgICAgICAgZG9jdW1lbnQpLiAgU2luY2UgTHVjZW5lIGludGVybmFsIGRvY3VtZW50IGlkcyBhcmUgdHJhbnNpZW50LAorICAgICAgICAgdGhpcyBjYWNoZSB3aWxsIG5vdCBiZSBhdXRvd2FybWVkLiAgCisgICAgICAtLT4KKyAgICA8ZG9jdW1lbnRDYWNoZSBjbGFzcz0ic29sci5MUlVDYWNoZSIKKyAgICAgICAgICAgICAgICAgICBzaXplPSI1MTIiCisgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNpemU9IjUxMiIKKyAgICAgICAgICAgICAgICAgICBhdXRvd2FybUNvdW50PSIwIi8+CisKKyAgICA8IS0tIEZpZWxkIFZhbHVlIENhY2hlCisgICAgICAgICAKKyAgICAgICAgIENhY2hlIHVzZWQgdG8gaG9sZCBmaWVsZCB2YWx1ZXMgdGhhdCBhcmUgcXVpY2tseSBhY2Nlc3NpYmxlCisgICAgICAgICBieSBkb2N1bWVudCBpZC4gIFRoZSBmaWVsZFZhbHVlQ2FjaGUgaXMgY3JlYXRlZCBieSBkZWZhdWx0CisgICAgICAgICBldmVuIGlmIG5vdCBjb25maWd1cmVkIGhlcmUuCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGZpZWxkVmFsdWVDYWNoZSBjbGFzcz0ic29sci5GYXN0TFJVQ2FjaGUiCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplPSI1MTIiCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvd2FybUNvdW50PSIxMjgiCisgICAgICAgICAgICAgICAgICAgICAgICBzaG93SXRlbXM9IjMyIiAvPgorICAgICAgLS0+CisKKyAgICA8IS0tIEN1c3RvbSBDYWNoZQorCisgICAgICAgICBFeGFtcGxlIG9mIGEgZ2VuZXJpYyBjYWNoZS4gIFRoZXNlIGNhY2hlcyBtYXkgYmUgYWNjZXNzZWQgYnkKKyAgICAgICAgIG5hbWUgdGhyb3VnaCBTb2xySW5kZXhTZWFyY2hlci5nZXRDYWNoZSgpLGNhY2hlTG9va3VwKCksIGFuZAorICAgICAgICAgY2FjaGVJbnNlcnQoKS4gIFRoZSBwdXJwb3NlIGlzIHRvIGVuYWJsZSBlYXN5IGNhY2hpbmcgb2YKKyAgICAgICAgIHVzZXIvYXBwbGljYXRpb24gbGV2ZWwgZGF0YS4gIFRoZSByZWdlbmVyYXRvciBhcmd1bWVudCBzaG91bGQKKyAgICAgICAgIGJlIHNwZWNpZmllZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzb2xyLkNhY2hlUmVnZW5lcmF0b3IgCisgICAgICAgICBpZiBhdXRvd2FybWluZyBpcyBkZXNpcmVkLiAgCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGNhY2hlIG5hbWU9Im15VXNlckNhY2hlIgorICAgICAgICAgICAgICBjbGFzcz0ic29sci5MUlVDYWNoZSIKKyAgICAgICAgICAgICAgc2l6ZT0iNDA5NiIKKyAgICAgICAgICAgICAgaW5pdGlhbFNpemU9IjEwMjQiCisgICAgICAgICAgICAgIGF1dG93YXJtQ291bnQ9IjEwMjQiCisgICAgICAgICAgICAgIHJlZ2VuZXJhdG9yPSJjb20ubXljb21wYW55Lk15UmVnZW5lcmF0b3IiCisgICAgICAgICAgICAgIC8+CisgICAgICAtLT4KKworCisgICAgPCEtLSBMYXp5IEZpZWxkIExvYWRpbmcKKworICAgICAgICAgSWYgdHJ1ZSwgc3RvcmVkIGZpZWxkcyB0aGF0IGFyZSBub3QgcmVxdWVzdGVkIHdpbGwgYmUgbG9hZGVkCisgICAgICAgICBsYXppbHkuICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudAorICAgICAgICAgaWYgdGhlIHVzdWFsIGNhc2UgaXMgdG8gbm90IGxvYWQgYWxsIHN0b3JlZCBmaWVsZHMsCisgICAgICAgICBlc3BlY2lhbGx5IGlmIHRoZSBza2lwcGVkIGZpZWxkcyBhcmUgbGFyZ2UgY29tcHJlc3NlZCB0ZXh0CisgICAgICAgICBmaWVsZHMuCisgICAgLS0+CisgICAgPGVuYWJsZUxhenlGaWVsZExvYWRpbmc+dHJ1ZTwvZW5hYmxlTGF6eUZpZWxkTG9hZGluZz4KKworICAgIDwhLS0gVXNlIEZpbHRlciBGb3IgU29ydGVkIFF1ZXJ5CisgCisgICAgICAgICBBIHBvc3NpYmxlIG9wdGltaXphdGlvbiB0aGF0IGF0dGVtcHRzIHRvIHVzZSBhIGZpbHRlciB0bworICAgICAgICAgc2F0aXNmeSBhIHNlYXJjaC4gIElmIHRoZSByZXF1ZXN0ZWQgc29ydCBkb2VzIG5vdCBpbmNsdWRlCisgICAgICAgICBzY29yZSwgdGhlbiB0aGUgZmlsdGVyQ2FjaGUgd2lsbCBiZSBjaGVja2VkIGZvciBhIGZpbHRlcgorICAgICAgICAgbWF0Y2hpbmcgdGhlIHF1ZXJ5LiBJZiBmb3VuZCwgdGhlIGZpbHRlciB3aWxsIGJlIHVzZWQgYXMgdGhlCisgICAgICAgICBzb3VyY2Ugb2YgZG9jdW1lbnQgaWRzLCBhbmQgdGhlbiB0aGUgc29ydCB3aWxsIGJlIGFwcGxpZWQgdG8KKyAgICAgICAgIHRoYXQuCisgCisgICAgICAgICBGb3IgbW9zdCBzaXR1YXRpb25zLCB0aGlzIHdpbGwgbm90IGJlIHVzZWZ1bCB1bmxlc3MgeW91CisgICAgICAgICBmcmVxdWVudGx5IGdldCB0aGUgc2FtZSBzZWFyY2ggcmVwZWF0ZWRseSB3aXRoIGRpZmZlcmVudCBzb3J0CisgICAgICAgICBvcHRpb25zLCBhbmQgbm9uZSBvZiB0aGVtIGV2ZXIgdXNlICJzY29yZSIKKyAgICAgIC0tPgorICAgIDwhLS0KKyAgICAgICA8dXNlRmlsdGVyRm9yU29ydGVkUXVlcnk+dHJ1ZTwvdXNlRmlsdGVyRm9yU29ydGVkUXVlcnk+CisgICAgICAtLT4KKworICAgIDwhLS0gUmVzdWx0IFdpbmRvdyBTaXplCisgCisgICAgICAgICBBbiBvcHRpbWl6YXRpb24gZm9yIHVzZSB3aXRoIHRoZSBxdWVyeVJlc3VsdENhY2hlLiAgV2hlbiBhIHNlYXJjaAorICAgICAgICAgaXMgcmVxdWVzdGVkLCBhIHN1cGVyc2V0IG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGRvY3VtZW50IGlkcworICAgICAgICAgYXJlIGNvbGxlY3RlZC4gIEZvciBleGFtcGxlLCBpZiBhIHNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHF1ZXJ5CisgICAgICAgICByZXF1ZXN0cyBtYXRjaGluZyBkb2N1bWVudHMgMTAgdGhyb3VnaCAxOSwgYW5kIHF1ZXJ5V2luZG93U2l6ZSBpcyA1MCwKKyAgICAgICAgIHRoZW4gZG9jdW1lbnRzIDAgdGhyb3VnaCA0OSB3aWxsIGJlIGNvbGxlY3RlZCBhbmQgY2FjaGVkLiAgQW55IGZ1cnRoZXIKKyAgICAgICAgIHJlcXVlc3RzIGluIHRoYXQgcmFuZ2UgY2FuIGJlIHNhdGlzZmllZCB2aWEgdGhlIGNhY2hlLiAgCisgICAgICAtLT4KKyAgICA8cXVlcnlSZXN1bHRXaW5kb3dTaXplPjIwPC9xdWVyeVJlc3VsdFdpbmRvd1NpemU+CisKKyAgICA8IS0tIE1heGltdW0gbnVtYmVyIG9mIGRvY3VtZW50cyB0byBjYWNoZSBmb3IgYW55IGVudHJ5IGluIHRoZQorICAgICAgICAgcXVlcnlSZXN1bHRDYWNoZS4gCisgICAgICAtLT4KKyAgICA8cXVlcnlSZXN1bHRNYXhEb2NzQ2FjaGVkPjIwMDwvcXVlcnlSZXN1bHRNYXhEb2NzQ2FjaGVkPgorCisgICAgPCEtLSBRdWVyeSBSZWxhdGVkIEV2ZW50IExpc3RlbmVycworIAorICAgICAgICAgVmFyaW91cyBJbmRleFNlYXJjaGVyIHJlbGF0ZWQgZXZlbnRzIGNhbiB0cmlnZ2VyIExpc3RlbmVycyB0bworICAgICAgICAgdGFrZSBhY3Rpb25zLgorIAorICAgICAgICAgbmV3U2VhcmNoZXIgLSBmaXJlZCB3aGVuZXZlciBhIG5ldyBzZWFyY2hlciBpcyBiZWluZyBwcmVwYXJlZAorICAgICAgICAgYW5kIHRoZXJlIGlzIGEgY3VycmVudCBzZWFyY2hlciBoYW5kbGluZyByZXF1ZXN0cyAoYWthCisgICAgICAgICByZWdpc3RlcmVkKS4gIEl0IGNhbiBiZSB1c2VkIHRvIHByaW1lIGNlcnRhaW4gY2FjaGVzIHRvCisgICAgICAgICBwcmV2ZW50IGxvbmcgcmVxdWVzdCB0aW1lcyBmb3IgY2VydGFpbiByZXF1ZXN0cy4KKyAKKyAgICAgICAgIGZpcnN0U2VhcmNoZXIgLSBmaXJlZCB3aGVuZXZlciBhIG5ldyBzZWFyY2hlciBpcyBiZWluZworICAgICAgICAgcHJlcGFyZWQgYnV0IHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVnaXN0ZXJlZCBzZWFyY2hlciB0byBoYW5kbGUKKyAgICAgICAgIHJlcXVlc3RzIG9yIHRvIGdhaW4gYXV0b3dhcm1pbmcgZGF0YSBmcm9tLgorIAorICAgICAgICAgCisgICAgICAtLT4KKyAgICA8IS0tIFF1ZXJ5U2VuZGVyTGlzdGVuZXIgdGFrZXMgYW4gYXJyYXkgb2YgTmFtZWRMaXN0IGFuZCBleGVjdXRlcyBhCisgICAgICAgICBsb2NhbCBxdWVyeSByZXF1ZXN0IGZvciBlYWNoIE5hbWVkTGlzdCBpbiBzZXF1ZW5jZS4gCisgICAgICAtLT4KKyAgICA8bGlzdGVuZXIgZXZlbnQ9Im5ld1NlYXJjaGVyIiBjbGFzcz0ic29sci5RdWVyeVNlbmRlckxpc3RlbmVyIj4KKyAgICAgIDxhcnIgbmFtZT0icXVlcmllcyI+CisgICAgICAgIDwhLS0KKyAgICAgICAgICAgPGxzdD48c3RyIG5hbWU9InEiPnNvbHI8L3N0cj48c3RyIG5hbWU9InNvcnQiPnByaWNlIGFzYzwvc3RyPjwvbHN0PgorICAgICAgICAgICA8bHN0PjxzdHIgbmFtZT0icSI+cm9ja3M8L3N0cj48c3RyIG5hbWU9InNvcnQiPndlaWdodCBhc2M8L3N0cj48L2xzdD4KKyAgICAgICAgICAtLT4KKyAgICAgIDwvYXJyPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGxpc3RlbmVyIGV2ZW50PSJmaXJzdFNlYXJjaGVyIiBjbGFzcz0ic29sci5RdWVyeVNlbmRlckxpc3RlbmVyIj4KKyAgICAgIDxhcnIgbmFtZT0icXVlcmllcyI+CisgICAgICAgIDwhLS0KKyAgICAgICAgPGxzdD4KKyAgICAgICAgICA8c3RyIG5hbWU9InEiPnN0YXRpYyBmaXJzdFNlYXJjaGVyIHdhcm1pbmcgaW4gc29scmNvbmZpZy54bWw8L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICAgIC0tPgorICAgICAgPC9hcnI+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDwhLS0gVXNlIENvbGQgU2VhcmNoZXIKKworICAgICAgICAgSWYgYSBzZWFyY2ggcmVxdWVzdCBjb21lcyBpbiBhbmQgdGhlcmUgaXMgbm8gY3VycmVudAorICAgICAgICAgcmVnaXN0ZXJlZCBzZWFyY2hlciwgdGhlbiBpbW1lZGlhdGVseSByZWdpc3RlciB0aGUgc3RpbGwKKyAgICAgICAgIHdhcm1pbmcgc2VhcmNoZXIgYW5kIHVzZSBpdC4gIElmICJmYWxzZSIgdGhlbiBhbGwgcmVxdWVzdHMKKyAgICAgICAgIHdpbGwgYmxvY2sgdW50aWwgdGhlIGZpcnN0IHNlYXJjaGVyIGlzIGRvbmUgd2FybWluZy4KKyAgICAgIC0tPgorICAgIDx1c2VDb2xkU2VhcmNoZXI+ZmFsc2U8L3VzZUNvbGRTZWFyY2hlcj4KKworICAgIDwhLS0gTWF4IFdhcm1pbmcgU2VhcmNoZXJzCisgICAgICAgICAKKyAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHNlYXJjaGVycyB0aGF0IG1heSBiZSB3YXJtaW5nIGluIHRoZQorICAgICAgICAgYmFja2dyb3VuZCBjb25jdXJyZW50bHkuICBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGlzIGxpbWl0CisgICAgICAgICBpcyBleGNlZWRlZC4KKworICAgICAgICAgUmVjb21tZW5kIHZhbHVlcyBvZiAxLTIgZm9yIHJlYWQtb25seSBzbGF2ZXMsIGhpZ2hlciBmb3IKKyAgICAgICAgIG1hc3RlcnMgdy9vIGNhY2hlIHdhcm1pbmcuCisgICAgICAtLT4KKyAgICA8bWF4V2FybWluZ1NlYXJjaGVycz4yPC9tYXhXYXJtaW5nU2VhcmNoZXJzPgorCisgIDwvcXVlcnk+CisKKworICA8IS0tIFJlcXVlc3QgRGlzcGF0Y2hlcgorCisgICAgICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IgaG93IHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIKKyAgICAgICBzaG91bGQgYmVoYXZlIHdoZW4gcHJvY2Vzc2luZyByZXF1ZXN0cyBmb3IgdGhpcyBTb2xyQ29yZS4KKworICAgICAgIGhhbmRsZVNlbGVjdCBpcyBhIGxlZ2FjeSBvcHRpb24gdGhhdCBhZmZlY3RzIHRoZSBiZWhhdmlvciBvZiByZXF1ZXN0cworICAgICAgIHN1Y2ggYXMgL3NlbGVjdD9xdD1YWFgKKworICAgICAgIGhhbmRsZVNlbGVjdD0idHJ1ZSIgd2lsbCBjYXVzZSB0aGUgU29sckRpc3BhdGNoRmlsdGVyIHRvIHByb2Nlc3MKKyAgICAgICB0aGUgcmVxdWVzdCBhbmQgZGlzcGF0Y2ggdGhlIHF1ZXJ5IHRvIGEgaGFuZGxlciBzcGVjaWZpZWQgYnkgdGhlIAorICAgICAgICJxdCIgcGFyYW0sIGFzc3VtaW5nICIvc2VsZWN0IiBpc24ndCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisKKyAgICAgICBoYW5kbGVTZWxlY3Q9ImZhbHNlIiB3aWxsIGNhdXNlIHRoZSBTb2xyRGlzcGF0Y2hGaWx0ZXIgdG8KKyAgICAgICBpZ25vcmUgIi9zZWxlY3QiIHJlcXVlc3RzLCByZXN1bHRpbmcgaW4gYSA0MDQgdW5sZXNzIGEgaGFuZGxlcgorICAgICAgIGlzIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBuYW1lICIvc2VsZWN0IgorCisgICAgICAgaGFuZGxlU2VsZWN0PSJ0cnVlIiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIG5ldyB1c2VycywgYnV0IGlzIHRoZSBkZWZhdWx0CisgICAgICAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgLS0+CisgIDxyZXF1ZXN0RGlzcGF0Y2hlciBoYW5kbGVTZWxlY3Q9ImZhbHNlIiA+CisgICAgPCEtLSBSZXF1ZXN0IFBhcnNpbmcKKworICAgICAgICAgVGhlc2Ugc2V0dGluZ3MgaW5kaWNhdGUgaG93IFNvbHIgUmVxdWVzdHMgbWF5IGJlIHBhcnNlZCwgYW5kCisgICAgICAgICB3aGF0IHJlc3RyaWN0aW9ucyBtYXkgYmUgcGxhY2VkIG9uIHRoZSBDb250ZW50U3RyZWFtcyBmcm9tCisgICAgICAgICB0aG9zZSByZXF1ZXN0cworCisgICAgICAgICBlbmFibGVSZW1vdGVTdHJlYW1pbmcgLSBlbmFibGVzIHVzZSBvZiB0aGUgc3RyZWFtLmZpbGUKKyAgICAgICAgIGFuZCBzdHJlYW0udXJsIHBhcmFtZXRlcnMgZm9yIHNwZWNpZnlpbmcgcmVtb3RlIHN0cmVhbXMuCisKKyAgICAgICAgIG11bHRpcGFydFVwbG9hZExpbWl0SW5LQiAtIHNwZWNpZmllcyB0aGUgbWF4IHNpemUgKGluIEtpQikgb2YKKyAgICAgICAgIE11bHRpcGFydCBGaWxlIFVwbG9hZHMgdGhhdCBTb2xyIHdpbGwgYWxsb3cgaW4gYSBSZXF1ZXN0LgorICAgICAgICAgCisgICAgICAgICBmb3JtZGF0YVVwbG9hZExpbWl0SW5LQiAtIHNwZWNpZmllcyB0aGUgbWF4IHNpemUgKGluIEtpQikgb2YKKyAgICAgICAgIGZvcm0gZGF0YSAoYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkKSBzZW50IHZpYQorICAgICAgICAgUE9TVC4gWW91IGNhbiB1c2UgUE9TVCB0byBwYXNzIHJlcXVlc3QgcGFyYW1ldGVycyBub3QKKyAgICAgICAgIGZpdHRpbmcgaW50byB0aGUgVVJMLgorICAgICAgICAgCisgICAgICAgICBhZGRIdHRwUmVxdWVzdFRvQ29udGV4dCAtIGlmIHNldCB0byB0cnVlLCBpdCB3aWxsIGluc3RydWN0CisgICAgICAgICB0aGUgcmVxdWVzdFBhcnNlcnMgdG8gaW5jbHVkZSB0aGUgb3JpZ2luYWwgSHR0cFNlcnZsZXRSZXF1ZXN0CisgICAgICAgICBvYmplY3QgaW4gdGhlIGNvbnRleHQgbWFwIG9mIHRoZSBTb2xyUXVlcnlSZXF1ZXN0IHVuZGVyIHRoZSAKKyAgICAgICAgIGtleSAiaHR0cFJlcXVlc3QiLiBJdCB3aWxsIG5vdCBiZSB1c2VkIGJ5IGFueSBvZiB0aGUgZXhpc3RpbmcKKyAgICAgICAgIFNvbHIgY29tcG9uZW50cywgYnV0IG1heSBiZSB1c2VmdWwgd2hlbiBkZXZlbG9waW5nIGN1c3RvbSAKKyAgICAgICAgIHBsdWdpbnMuCisgICAgICAgICAKKyAgICAgICAgICoqKiBXQVJOSU5HICoqKgorICAgICAgICAgVGhlIHNldHRpbmdzIGJlbG93IGF1dGhvcml6ZSBTb2xyIHRvIGZldGNoIHJlbW90ZSBmaWxlcywgWW91CisgICAgICAgICBzaG91bGQgbWFrZSBzdXJlIHlvdXIgc3lzdGVtIGhhcyBzb21lIGF1dGhlbnRpY2F0aW9uIGJlZm9yZQorICAgICAgICAgdXNpbmcgZW5hYmxlUmVtb3RlU3RyZWFtaW5nPSJ0cnVlIgorCisgICAgICAtLT4KKyAgICA8cmVxdWVzdFBhcnNlcnMgZW5hYmxlUmVtb3RlU3RyZWFtaW5nPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBhcnRVcGxvYWRMaW1pdEluS0I9IjIwNDgwMDAiCisgICAgICAgICAgICAgICAgICAgIGZvcm1kYXRhVXBsb2FkTGltaXRJbktCPSIyMDQ4IgorICAgICAgICAgICAgICAgICAgICBhZGRIdHRwUmVxdWVzdFRvQ29udGV4dD0iZmFsc2UiLz4KKworICAgIDwhLS0gSFRUUCBDYWNoaW5nCisKKyAgICAgICAgIFNldCBIVFRQIGNhY2hpbmcgcmVsYXRlZCBwYXJhbWV0ZXJzIChmb3IgcHJveHkgY2FjaGVzIGFuZCBjbGllbnRzKS4KKworICAgICAgICAgVGhlIG9wdGlvbnMgYmVsb3cgaW5zdHJ1Y3QgU29sciBub3QgdG8gb3V0cHV0IGFueSBIVFRQIENhY2hpbmcKKyAgICAgICAgIHJlbGF0ZWQgaGVhZGVycworICAgICAgLS0+CisgICAgPGh0dHBDYWNoaW5nIG5ldmVyMzA0PSJ0cnVlIiAvPgorICAgIDwhLS0gSWYgeW91IGluY2x1ZGUgYSA8Y2FjaGVDb250cm9sPiBkaXJlY3RpdmUsIGl0IHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgZ2VuZXJhdGUgYSBDYWNoZS1Db250cm9sIGhlYWRlciAoYXMgd2VsbCBhcyBhbiBFeHBpcmVzIGhlYWRlcgorICAgICAgICAgaWYgdGhlIHZhbHVlIGNvbnRhaW5zICJtYXgtYWdlPSIpCisgICAgICAgICAKKyAgICAgICAgIEJ5IGRlZmF1bHQsIG5vIENhY2hlLUNvbnRyb2wgaGVhZGVyIGlzIGdlbmVyYXRlZC4KKyAgICAgICAgIAorICAgICAgICAgWW91IGNhbiB1c2UgdGhlIDxjYWNoZUNvbnRyb2w+IG9wdGlvbiBldmVuIGlmIHlvdSBoYXZlIHNldAorICAgICAgICAgbmV2ZXIzMDQ9InRydWUiCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGh0dHBDYWNoaW5nIG5ldmVyMzA0PSJ0cnVlIiA+CisgICAgICAgICA8Y2FjaGVDb250cm9sPm1heC1hZ2U9MzAsIHB1YmxpYzwvY2FjaGVDb250cm9sPiAKKyAgICAgICA8L2h0dHBDYWNoaW5nPgorICAgICAgLS0+CisgICAgPCEtLSBUbyBlbmFibGUgU29sciB0byByZXNwb25kIHdpdGggYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgSFRUUAorICAgICAgICAgQ2FjaGluZyBoZWFkZXJzLCBhbmQgdG8gcmVzcG9uc2UgdG8gQ2FjaGUgVmFsaWRhdGlvbiByZXF1ZXN0cworICAgICAgICAgY29ycmVjdGx5LCBzZXQgdGhlIHZhbHVlIG9mIG5ldmVyMzA0PSJmYWxzZSIKKyAgICAgICAgIAorICAgICAgICAgVGhpcyB3aWxsIGNhdXNlIFNvbHIgdG8gZ2VuZXJhdGUgTGFzdC1Nb2RpZmllZCBhbmQgRVRhZworICAgICAgICAgaGVhZGVycyBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgSW5kZXguCisKKyAgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgdG8gYWZmZWN0IHRoZQorICAgICAgICAgdmFsdWVzIG9mIHRoZXNlIGhlYWRlcnMuLi4KKworICAgICAgICAgbGFzdE1vZEZyb20gLSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAib3BlblRpbWUiIHdoaWNoIG1lYW5zIHRoZQorICAgICAgICAgTGFzdC1Nb2RpZmllZCB2YWx1ZSAoYW5kIHZhbGlkYXRpb24gYWdhaW5zdCBJZi1Nb2RpZmllZC1TaW5jZQorICAgICAgICAgcmVxdWVzdHMpIHdpbGwgYWxsIGJlIHJlbGF0aXZlIHRvIHdoZW4gdGhlIGN1cnJlbnQgU2VhcmNoZXIKKyAgICAgICAgIHdhcyBvcGVuZWQuICBZb3UgY2FuIGNoYW5nZSBpdCB0byBsYXN0TW9kRnJvbT0iZGlyTGFzdE1vZCIgaWYKKyAgICAgICAgIHlvdSB3YW50IHRoZSB2YWx1ZSB0byBleGFjdGx5IGNvcnJlc3BvbmQgdG8gd2hlbiB0aGUgcGh5c2ljYWwKKyAgICAgICAgIGluZGV4IHdhcyBsYXN0IG1vZGlmaWVkLgorCisgICAgICAgICBldGFnU2VlZD0iLi4uIiBpcyBhbiBvcHRpb24geW91IGNhbiBjaGFuZ2UgdG8gZm9yY2UgdGhlIEVUYWcKKyAgICAgICAgIGhlYWRlciAoYW5kIHZhbGlkYXRpb24gYWdhaW5zdCBJZi1Ob25lLU1hdGNoIHJlcXVlc3RzKSB0byBiZQorICAgICAgICAgZGlmZmVyZW50IGV2ZW4gaWYgdGhlIGluZGV4IGhhcyBub3QgY2hhbmdlZCAoaWU6IHdoZW4gbWFraW5nCisgICAgICAgICBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHlvdXIgY29uZmlnIGZpbGUpCisKKyAgICAgICAgIChsYXN0TW9kaWZpZWRGcm9tIGFuZCBldGFnU2VlZCBhcmUgYm90aCBpZ25vcmVkIGlmIHlvdSB1c2UKKyAgICAgICAgIHRoZSBuZXZlcjMwND0idHJ1ZSIgb3B0aW9uKQorICAgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxodHRwQ2FjaGluZyBsYXN0TW9kaWZpZWRGcm9tPSJvcGVuVGltZSIKKyAgICAgICAgICAgICAgICAgICAgZXRhZ1NlZWQ9IlNvbHIiPgorICAgICAgICAgPGNhY2hlQ29udHJvbD5tYXgtYWdlPTMwLCBwdWJsaWM8L2NhY2hlQ29udHJvbD4gCisgICAgICAgPC9odHRwQ2FjaGluZz4KKyAgICAgIC0tPgorICA8L3JlcXVlc3REaXNwYXRjaGVyPgorCisgIDwhLS0gUmVxdWVzdCBIYW5kbGVycyAKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Tb2xyUmVxdWVzdEhhbmRsZXIKKworICAgICAgIEluY29taW5nIHF1ZXJpZXMgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIGEgc3BlY2lmaWMgaGFuZGxlciBieSBuYW1lCisgICAgICAgYmFzZWQgb24gdGhlIHBhdGggc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LgorCisgICAgICAgTGVnYWN5IGJlaGF2aW9yOiBJZiB0aGUgcmVxdWVzdCBwYXRoIHVzZXMgIi9zZWxlY3QiIGJ1dCBubyBSZXF1ZXN0CisgICAgICAgSGFuZGxlciBoYXMgdGhhdCBuYW1lLCBhbmQgaWYgaGFuZGxlU2VsZWN0PSJ0cnVlIiBoYXMgYmVlbiBzcGVjaWZpZWQgaW4KKyAgICAgICB0aGUgcmVxdWVzdERpc3BhdGNoZXIsIHRoZW4gdGhlIFJlcXVlc3QgSGFuZGxlciBpcyBkaXNwYXRjaGVkIGJhc2VkIG9uCisgICAgICAgdGhlIHF0IHBhcmFtZXRlci4gIEhhbmRsZXJzIHdpdGhvdXQgYSBsZWFkaW5nICcvJyBhcmUgYWNjZXNzZWQgdGhpcyB3YXkKKyAgICAgICBsaWtlIHNvOiBodHRwOi8vaG9zdC9hcHAvW2NvcmUvXXNlbGVjdD9xdD1uYW1lICBJZiBubyBxdCBpcworICAgICAgIGdpdmVuLCB0aGVuIHRoZSByZXF1ZXN0SGFuZGxlciB0aGF0IGRlY2xhcmVzIGRlZmF1bHQ9InRydWUiIHdpbGwgYmUKKyAgICAgICB1c2VkIG9yIHRoZSBvbmUgbmFtZWQgInN0YW5kYXJkIi4KKworICAgICAgIElmIGEgUmVxdWVzdCBIYW5kbGVyIGlzIGRlY2xhcmVkIHdpdGggc3RhcnR1cD0ibGF6eSIsIHRoZW4gaXQgd2lsbAorICAgICAgIG5vdCBiZSBpbml0aWFsaXplZCB1bnRpbCB0aGUgZmlyc3QgcmVxdWVzdCB0aGF0IHVzZXMgaXQuCisKKyAgICAtLT4KKyAgPCEtLSBTZWFyY2hIYW5kbGVyCisKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU2VhcmNoSGFuZGxlcgorCisgICAgICAgRm9yIHByb2Nlc3NpbmcgU2VhcmNoIFF1ZXJpZXMsIHRoZSBwcmltYXJ5IFJlcXVlc3QgSGFuZGxlcgorICAgICAgIHByb3ZpZGVkIHdpdGggU29sciBpcyAiU2VhcmNoSGFuZGxlciIgSXQgZGVsZWdhdGVzIHRvIGEgc2VxdWVudAorICAgICAgIG9mIFNlYXJjaENvbXBvbmVudHMgKHNlZSBiZWxvdykgYW5kIHN1cHBvcnRzIGRpc3RyaWJ1dGVkCisgICAgICAgcXVlcmllcyBhY3Jvc3MgbXVsdGlwbGUgc2hhcmRzCisgICAgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvc2VsZWN0IiBjbGFzcz0ic29sci5TZWFyY2hIYW5kbGVyIj4KKyAgICA8IS0tIGRlZmF1bHQgdmFsdWVzIGZvciBxdWVyeSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQsIHRoZXNlCisgICAgICAgICB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgcGFyYW1ldGVycyBpbiB0aGUgcmVxdWVzdAorICAgICAgLS0+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8c3RyIG5hbWU9ImVjaG9QYXJhbXMiPmV4cGxpY2l0PC9zdHI+CisgICAgICA8aW50IG5hbWU9InJvd3MiPjEwPC9pbnQ+CisgICAgICA8IS0tIDxzdHIgbmFtZT0iZGYiPnRleHQ8L3N0cj4gLS0+CisgICAgPC9sc3Q+CisgICAgPCEtLSBJbiBhZGRpdGlvbiB0byBkZWZhdWx0cywgImFwcGVuZHMiIHBhcmFtcyBjYW4gYmUgc3BlY2lmaWVkCisgICAgICAgICB0byBpZGVudGlmeSB2YWx1ZXMgd2hpY2ggc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mCisgICAgICAgICBtdWx0aS12YWwgcGFyYW1zIGZyb20gdGhlIHF1ZXJ5IChvciB0aGUgZXhpc3RpbmcgImRlZmF1bHRzIikuCisgICAgICAtLT4KKyAgICA8IS0tIEluIHRoaXMgZXhhbXBsZSwgdGhlIHBhcmFtICJmcT1pbnN0b2NrOnRydWUiIHdvdWxkIGJlIGFwcGVuZGVkIHRvCisgICAgICAgICBhbnkgcXVlcnkgdGltZSBmcSBwYXJhbXMgdGhlIHVzZXIgbWF5IHNwZWNpZnksIGFzIGEgbWVjaGFuaXNtIGZvcgorICAgICAgICAgcGFydGl0aW9uaW5nIHRoZSBpbmRleCwgaW5kZXBlbmRlbnQgb2YgYW55IHVzZXIgc2VsZWN0ZWQgZmlsdGVyaW5nCisgICAgICAgICB0aGF0IG1heSBhbHNvIGJlIGRlc2lyZWQgKHBlcmhhcHMgYXMgYSByZXN1bHQgb2YgZmFjZXRlZCBzZWFyY2hpbmcpLgorCisgICAgICAgICBOT1RFOiB0aGVyZSBpcyAqYWJzb2x1dGVseSogbm90aGluZyBhIGNsaWVudCBjYW4gZG8gdG8gcHJldmVudCB0aGVzZQorICAgICAgICAgImFwcGVuZHMiIHZhbHVlcyBmcm9tIGJlaW5nIHVzZWQsIHNvIGRvbid0IHVzZSB0aGlzIG1lY2hhbmlzbQorICAgICAgICAgdW5sZXNzIHlvdSBhcmUgc3VyZSB5b3UgYWx3YXlzIHdhbnQgaXQuCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJhcHBlbmRzIj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZnEiPmluU3RvY2s6dHJ1ZTwvc3RyPgorICAgICAgIDwvbHN0PgorICAgICAgLS0+CisgICAgPCEtLSAiaW52YXJpYW50cyIgYXJlIGEgd2F5IG9mIGxldHRpbmcgdGhlIFNvbHIgbWFpbnRhaW5lciBsb2NrIGRvd24KKyAgICAgICAgIHRoZSBvcHRpb25zIGF2YWlsYWJsZSB0byBTb2xyIGNsaWVudHMuICBBbnkgcGFyYW1zIHZhbHVlcworICAgICAgICAgc3BlY2lmaWVkIGhlcmUgYXJlIHVzZWQgcmVnYXJkbGVzcyBvZiB3aGF0IHZhbHVlcyBtYXkgYmUgc3BlY2lmaWVkCisgICAgICAgICBpbiBlaXRoZXIgdGhlIHF1ZXJ5LCB0aGUgImRlZmF1bHRzIiwgb3IgdGhlICJhcHBlbmRzIiBwYXJhbXMuCisKKyAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZhY2V0LmZpZWxkIGFuZCBmYWNldC5xdWVyeSBwYXJhbXMgd291bGQKKyAgICAgICAgIGJlIGZpeGVkLCBsaW1pdGluZyB0aGUgZmFjZXRzIGNsaWVudHMgY2FuIHVzZS4gIEZhY2V0aW5nIGlzCisgICAgICAgICBub3QgdHVybmVkIG9uIGJ5IGRlZmF1bHQgLSBidXQgaWYgdGhlIGNsaWVudCBkb2VzIHNwZWNpZnkKKyAgICAgICAgIGZhY2V0PXRydWUgaW4gdGhlIHJlcXVlc3QsIHRoZXNlIGFyZSB0aGUgb25seSBmYWNldHMgdGhleQorICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIHNlZSBjb3VudHMgZm9yOyByZWdhcmRsZXNzIG9mIHdoYXQgb3RoZXIKKyAgICAgICAgIGZhY2V0LmZpZWxkIG9yIGZhY2V0LnF1ZXJ5IHBhcmFtcyB0aGV5IG1heSBzcGVjaWZ5LgorCisgICAgICAgICBOT1RFOiB0aGVyZSBpcyAqYWJzb2x1dGVseSogbm90aGluZyBhIGNsaWVudCBjYW4gZG8gdG8gcHJldmVudCB0aGVzZQorICAgICAgICAgImludmFyaWFudHMiIHZhbHVlcyBmcm9tIGJlaW5nIHVzZWQsIHNvIGRvbid0IHVzZSB0aGlzIG1lY2hhbmlzbQorICAgICAgICAgdW5sZXNzIHlvdSBhcmUgc3VyZSB5b3UgYWx3YXlzIHdhbnQgaXQuCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJpbnZhcmlhbnRzIj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZmFjZXQuZmllbGQiPmNhdDwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJmYWNldC5maWVsZCI+bWFudV9leGFjdDwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJmYWNldC5xdWVyeSI+cHJpY2U6WyogVE8gNTAwXTwvc3RyPgorICAgICAgICAgPHN0ciBuYW1lPSJmYWNldC5xdWVyeSI+cHJpY2U6WzUwMCBUTyAqXTwvc3RyPgorICAgICAgIDwvbHN0PgorICAgICAgLS0+CisgICAgPCEtLSBJZiB0aGUgZGVmYXVsdCBsaXN0IG9mIFNlYXJjaENvbXBvbmVudHMgaXMgbm90IGRlc2lyZWQsIHRoYXQKKyAgICAgICAgIGxpc3QgY2FuIGVpdGhlciBiZSBvdmVycmlkZGVuIGNvbXBsZXRlbHksIG9yIGNvbXBvbmVudHMgY2FuIGJlCisgICAgICAgICBwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gdGhlIGRlZmF1bHQgbGlzdC4gIChzZWUgYmVsb3cpCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGFyciBuYW1lPSJjb21wb25lbnRzIj4KKyAgICAgICAgIDxzdHI+bmFtZU9mQ3VzdG9tQ29tcG9uZW50MTwvc3RyPgorICAgICAgICAgPHN0cj5uYW1lT2ZDdXN0b21Db21wb25lbnQyPC9zdHI+CisgICAgICAgPC9hcnI+CisgICAgICAtLT4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIEEgcmVxdWVzdCBoYW5kbGVyIHRoYXQgcmV0dXJucyBpbmRlbnRlZCBKU09OIGJ5IGRlZmF1bHQgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvcXVlcnkiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJlY2hvUGFyYW1zIj5leHBsaWNpdDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJ3dCI+anNvbjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJpbmRlbnQiPnRydWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZGYiPnRleHQ8L3N0cj4KKyAgICA8L2xzdD4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworCisgIDwhLS0gcmVhbHRpbWUgZ2V0IGhhbmRsZXIsIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBsYXRlc3Qgc3RvcmVkIGZpZWxkcyBvZgorICAgICAgIGFueSBkb2N1bWVudCwgd2l0aG91dCB0aGUgbmVlZCB0byBjb21taXQgb3Igb3BlbiBhIG5ldyBzZWFyY2hlci4gIFRoZQorICAgICAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSB1cGRhdGVMb2cgZmVhdHVyZSBiZWluZyBlbmFibGVkLiAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9nZXQiIGNsYXNzPSJzb2xyLlJlYWxUaW1lR2V0SGFuZGxlciI+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8c3RyIG5hbWU9Im9taXRIZWFkZXIiPnRydWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0id3QiPmpzb248L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iaW5kZW50Ij50cnVlPC9zdHI+CisgICAgPC9sc3Q+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKworICA8IS0tIEEgUm9idXN0IEV4YW1wbGUgCisgICAgICAgCisgICAgICAgVGhpcyBleGFtcGxlIFNlYXJjaEhhbmRsZXIgZGVjbGFyYXRpb24gc2hvd3Mgb2ZmIHVzYWdlIG9mIHRoZQorICAgICAgIFNlYXJjaEhhbmRsZXIgd2l0aCBtYW55IGRlZmF1bHRzIGRlY2xhcmVkCisKKyAgICAgICBOb3RlIHRoYXQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIFJlcXVlc3QgSGFuZGxlcgorICAgICAgIChTZWFyY2hIYW5kbGVyKSBjYW4gYmUgcmVnaXN0ZXJlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudAorICAgICAgIG5hbWVzIChhbmQgZGlmZmVyZW50IGluaXQgcGFyYW1ldGVycykKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9icm93c2UiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJlY2hvUGFyYW1zIj5leHBsaWNpdDwvc3RyPgorCisgICAgICA8IS0tIFZlbG9jaXR5UmVzcG9uc2VXcml0ZXIgc2V0dGluZ3MgLS0+CisgICAgICA8c3RyIG5hbWU9Ind0Ij52ZWxvY2l0eTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJ2LnRlbXBsYXRlIj5icm93c2U8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0idi5sYXlvdXQiPmxheW91dDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJ0aXRsZSI+U29scml0YXM8L3N0cj4KKworICAgICAgPCEtLSBRdWVyeSBzZXR0aW5ncyAtLT4KKyAgICAgIDxzdHIgbmFtZT0iZGVmVHlwZSI+ZWRpc21heDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJxZiI+CisgICAgICAgIHRleHReMC41IGZlYXR1cmVzXjEuMCBuYW1lXjEuMiBza3VeMS41IGlkXjEwLjAgbWFudV4xLjEgY2F0XjEuNAorICAgICAgICB0aXRsZV4xMC4wIGRlc2NyaXB0aW9uXjUuMCBrZXl3b3Jkc141LjAgYXV0aG9yXjIuMCByZXNvdXJjZW5hbWVeMS4wCisgICAgICA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZGYiPnRleHQ8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ibW0iPjEwMCU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0icS5hbHQiPio6Kjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJyb3dzIj4xMDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmbCI+KixzY29yZTwvc3RyPgorCisgICAgICA8c3RyIG5hbWU9Im1sdC5xZiI+CisgICAgICAgIHRleHReMC41IGZlYXR1cmVzXjEuMCBuYW1lXjEuMiBza3VeMS41IGlkXjEwLjAgbWFudV4xLjEgY2F0XjEuNAorICAgICAgICB0aXRsZV4xMC4wIGRlc2NyaXB0aW9uXjUuMCBrZXl3b3Jkc141LjAgYXV0aG9yXjIuMCByZXNvdXJjZW5hbWVeMS4wCisgICAgICA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ibWx0LmZsIj50ZXh0LGZlYXR1cmVzLG5hbWUsc2t1LGlkLG1hbnUsY2F0LHRpdGxlLGRlc2NyaXB0aW9uLGtleXdvcmRzLGF1dGhvcixyZXNvdXJjZW5hbWU8L3N0cj4KKyAgICAgIDxpbnQgbmFtZT0ibWx0LmNvdW50Ij4zPC9pbnQ+CisKKyAgICAgIDwhLS0gRmFjZXRpbmcgZGVmYXVsdHMgLS0+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0Ij5vbjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmYWNldC5maWVsZCI+Y2F0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LmZpZWxkIj5tYW51X2V4YWN0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LmZpZWxkIj5jb250ZW50X3R5cGU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZmFjZXQuZmllbGQiPmF1dGhvcl9zPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LnF1ZXJ5Ij5pcG9kPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LnF1ZXJ5Ij5HQjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmYWNldC5taW5jb3VudCI+MTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmYWNldC5waXZvdCI+Y2F0LGluU3RvY2s8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZmFjZXQucmFuZ2Uub3RoZXIiPmFmdGVyPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LnJhbmdlIj5wcmljZTwvc3RyPgorICAgICAgPGludCBuYW1lPSJmLnByaWNlLmZhY2V0LnJhbmdlLnN0YXJ0Ij4wPC9pbnQ+CisgICAgICA8aW50IG5hbWU9ImYucHJpY2UuZmFjZXQucmFuZ2UuZW5kIj42MDA8L2ludD4KKyAgICAgIDxpbnQgbmFtZT0iZi5wcmljZS5mYWNldC5yYW5nZS5nYXAiPjUwPC9pbnQ+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LnJhbmdlIj5wb3B1bGFyaXR5PC9zdHI+CisgICAgICA8aW50IG5hbWU9ImYucG9wdWxhcml0eS5mYWNldC5yYW5nZS5zdGFydCI+MDwvaW50PgorICAgICAgPGludCBuYW1lPSJmLnBvcHVsYXJpdHkuZmFjZXQucmFuZ2UuZW5kIj4xMDwvaW50PgorICAgICAgPGludCBuYW1lPSJmLnBvcHVsYXJpdHkuZmFjZXQucmFuZ2UuZ2FwIj4zPC9pbnQ+CisgICAgICA8c3RyIG5hbWU9ImZhY2V0LnJhbmdlIj5tYW51ZmFjdHVyZWRhdGVfZHQ8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5tYW51ZmFjdHVyZWRhdGVfZHQuZmFjZXQucmFuZ2Uuc3RhcnQiPk5PVy9ZRUFSLTEwWUVBUlM8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5tYW51ZmFjdHVyZWRhdGVfZHQuZmFjZXQucmFuZ2UuZW5kIj5OT1c8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5tYW51ZmFjdHVyZWRhdGVfZHQuZmFjZXQucmFuZ2UuZ2FwIj4rMVlFQVI8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5tYW51ZmFjdHVyZWRhdGVfZHQuZmFjZXQucmFuZ2Uub3RoZXIiPmJlZm9yZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmLm1hbnVmYWN0dXJlZGF0ZV9kdC5mYWNldC5yYW5nZS5vdGhlciI+YWZ0ZXI8L3N0cj4KKworICAgICAgPCEtLSBIaWdobGlnaHRpbmcgZGVmYXVsdHMgLS0+CisgICAgICA8c3RyIG5hbWU9ImhsIj5vbjwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJobC5mbCI+Y29udGVudCBmZWF0dXJlcyB0aXRsZSBuYW1lPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImhsLmVuY29kZXIiPmh0bWw8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iaGwuc2ltcGxlLnByZSI+Jmx0O2ImZ3Q7PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImhsLnNpbXBsZS5wb3N0Ij4mbHQ7L2ImZ3Q7PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImYudGl0bGUuaGwuZnJhZ3NpemUiPjA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi50aXRsZS5obC5hbHRlcm5hdGVGaWVsZCI+dGl0bGU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5uYW1lLmhsLmZyYWdzaXplIj4wPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImYubmFtZS5obC5hbHRlcm5hdGVGaWVsZCI+bmFtZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJmLmNvbnRlbnQuaGwuc25pcHBldHMiPjM8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5jb250ZW50LmhsLmZyYWdzaXplIj4yMDA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZi5jb250ZW50LmhsLmFsdGVybmF0ZUZpZWxkIj5jb250ZW50PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImYuY29udGVudC5obC5tYXhBbHRlcm5hdGVGaWVsZExlbmd0aCI+NzUwPC9zdHI+CisKKyAgICAgIDwhLS0gU3BlbGwgY2hlY2tpbmcgZGVmYXVsdHMgLS0+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2siPm9uPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suZXh0ZW5kZWRSZXN1bHRzIj5mYWxzZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLmNvdW50Ij41PC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suYWx0ZXJuYXRpdmVUZXJtQ291bnQiPjI8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhSZXN1bHRzRm9yU3VnZ2VzdCI+NTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLmNvbGxhdGUiPnRydWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5jb2xsYXRlRXh0ZW5kZWRSZXN1bHRzIj50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9uVHJpZXMiPjU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhDb2xsYXRpb25zIj4zPC9zdHI+CisgICAgPC9sc3Q+CisKKyAgICA8IS0tIGFwcGVuZCBzcGVsbGNoZWNraW5nIHRvIG91ciBsaXN0IG9mIGNvbXBvbmVudHMgLS0+CisgICAgPGFyciBuYW1lPSJsYXN0LWNvbXBvbmVudHMiPgorICAgICAgPHN0cj5zcGVsbGNoZWNrPC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKworICA8IS0tIFVwZGF0ZSBSZXF1ZXN0IEhhbmRsZXIuICAKKyAgICAgICAKKyAgICAgICBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvVXBkYXRlWG1sTWVzc2FnZXMKKworICAgICAgIFRoZSBjYW5vbmljYWwgUmVxdWVzdCBIYW5kbGVyIGZvciBNb2RpZnlpbmcgdGhlIEluZGV4IHRocm91Z2gKKyAgICAgICBjb21tYW5kcyBzcGVjaWZpZWQgdXNpbmcgWE1MLCBKU09OLCBDU1YsIG9yIEpBVkFCSU4KKworICAgICAgIE5vdGU6IFNpbmNlIHNvbHIxLjEgcmVxdWVzdEhhbmRsZXJzIHJlcXVpcmVzIGEgdmFsaWQgY29udGVudAorICAgICAgIHR5cGUgaGVhZGVyIGlmIHBvc3RlZCBpbiB0aGUgYm9keS4gRm9yIGV4YW1wbGUsIGN1cmwgbm93CisgICAgICAgcmVxdWlyZXM6IC1IICdDb250ZW50LXR5cGU6dGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgnCisgICAgICAgCisgICAgICAgVG8gb3ZlcnJpZGUgdGhlIHJlcXVlc3QgY29udGVudCB0eXBlIGFuZCBmb3JjZSBhIHNwZWNpZmljIAorICAgICAgIENvbnRlbnQtdHlwZSwgdXNlIHRoZSByZXF1ZXN0IHBhcmFtZXRlcjogCisgICAgICAgICA/dXBkYXRlLmNvbnRlbnRUeXBlPXRleHQvY3N2CisgICAgICAgCisgICAgICAgVGhpcyBoYW5kbGVyIHdpbGwgcGljayBhIHJlc3BvbnNlIGZvcm1hdCB0byBtYXRjaCB0aGUgaW5wdXQKKyAgICAgICBpZiB0aGUgJ3d0JyBwYXJhbWV0ZXIgaXMgbm90IGV4cGxpY2l0CisgICAgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvdXBkYXRlIiBjbGFzcz0ic29sci5VcGRhdGVSZXF1ZXN0SGFuZGxlciI+CisgICAgPCEtLSBTZWUgYmVsb3cgZm9yIGluZm9ybWF0aW9uIG9uIGRlZmluaW5nIAorICAgICAgICAgdXBkYXRlUmVxdWVzdFByb2Nlc3NvckNoYWlucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IG5hbWUgCisgICAgICAgICBvbiBlYWNoIFVwZGF0ZSBSZXF1ZXN0CisgICAgICAtLT4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0idXBkYXRlLmNoYWluIj5hZGQtdW5rbm93bi1maWVsZHMtdG8tdGhlLXNjaGVtYTwvc3RyPgorICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDwhLS0gZm9yIGJhY2sgY29tcGF0IHdpdGggY2xpZW50cyB1c2luZyAvdXBkYXRlL2pzb24gYW5kIC91cGRhdGUvY3N2IC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3VwZGF0ZS9qc29uIiBjbGFzcz0ic29sci5Kc29uVXBkYXRlUmVxdWVzdEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJzdHJlYW0uY29udGVudFR5cGUiPmFwcGxpY2F0aW9uL2pzb248L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0idXBkYXRlLmNoYWluIj5hZGQtdW5rbm93bi1maWVsZHMtdG8tdGhlLXNjaGVtYTwvc3RyPgorICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL3VwZGF0ZS9jc3YiIGNsYXNzPSJzb2xyLkNTVlJlcXVlc3RIYW5kbGVyIj4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0ic3RyZWFtLmNvbnRlbnRUeXBlIj5hcHBsaWNhdGlvbi9jc3Y8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0idXBkYXRlLmNoYWluIj5hZGQtdW5rbm93bi1maWVsZHMtdG8tdGhlLXNjaGVtYTwvc3RyPgorICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDwhLS0gU29sciBDZWxsIFVwZGF0ZSBSZXF1ZXN0IEhhbmRsZXIKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9FeHRyYWN0aW5nUmVxdWVzdEhhbmRsZXIgCisKKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii91cGRhdGUvZXh0cmFjdCIKKyAgICAgICAgICAgICAgICAgIHN0YXJ0dXA9ImxhenkiCisgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5leHRyYWN0aW9uLkV4dHJhY3RpbmdSZXF1ZXN0SGFuZGxlciIgPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJsb3dlcm5hbWVzIj50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InVwcmVmaXgiPmlnbm9yZWRfPC9zdHI+CisKKyAgICAgIDwhLS0gY2FwdHVyZSBsaW5rIGhyZWZzIGJ1dCBpZ25vcmUgZGl2IGF0dHJpYnV0ZXMgLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcHR1cmVBdHRyIj50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZtYXAuYSI+bGlua3M8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZm1hcC5kaXYiPmlnbm9yZWRfPC9zdHI+CisgICAgPC9sc3Q+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKworICA8IS0tIEZpZWxkIEFuYWx5c2lzIFJlcXVlc3QgSGFuZGxlcgorCisgICAgICAgUmVxdWVzdEhhbmRsZXIgdGhhdCBwcm92aWRlcyBtdWNoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMKKyAgICAgICBhbmFseXNpcy5qc3AuIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgbXVsdGlwbGUgZmllbGQKKyAgICAgICB0eXBlcyBhbmQgZmllbGQgbmFtZXMgaW4gdGhlIHNhbWUgcmVxdWVzdCBhbmQgb3V0cHV0cworICAgICAgIGluZGV4LXRpbWUgYW5kIHF1ZXJ5LXRpbWUgYW5hbHlzaXMgZm9yIGVhY2ggb2YgdGhlbS4KKworICAgICAgIFJlcXVlc3QgcGFyYW1ldGVycyBhcmU6CisgICAgICAgYW5hbHlzaXMuZmllbGRuYW1lIC0gZmllbGQgbmFtZSB3aG9zZSBhbmFseXplcnMgYXJlIHRvIGJlIHVzZWQKKworICAgICAgIGFuYWx5c2lzLmZpZWxkdHlwZSAtIGZpZWxkIHR5cGUgd2hvc2UgYW5hbHl6ZXJzIGFyZSB0byBiZSB1c2VkCisgICAgICAgYW5hbHlzaXMuZmllbGR2YWx1ZSAtIHRleHQgZm9yIGluZGV4LXRpbWUgYW5hbHlzaXMKKyAgICAgICBxIChvciBhbmFseXNpcy5xKSAtIHRleHQgZm9yIHF1ZXJ5IHRpbWUgYW5hbHlzaXMKKyAgICAgICBhbmFseXNpcy5zaG93bWF0Y2ggKHRydWV8ZmFsc2UpIC0gV2hlbiBzZXQgdG8gdHJ1ZSBhbmQgd2hlbgorICAgICAgICAgICBxdWVyeSBhbmFseXNpcyBpcyBwZXJmb3JtZWQsIHRoZSBwcm9kdWNlZCB0b2tlbnMgb2YgdGhlCisgICAgICAgICAgIGZpZWxkIHZhbHVlIGFuYWx5c2lzIHdpbGwgYmUgbWFya2VkIGFzICJtYXRjaGVkIiBmb3IgZXZlcnkKKyAgICAgICAgICAgdG9rZW4gdGhhdCBpcyBwcm9kdWNlcyBieSB0aGUgcXVlcnkgYW5hbHlzaXMKKyAgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FuYWx5c2lzL2ZpZWxkIgorICAgICAgICAgICAgICAgICAgc3RhcnR1cD0ibGF6eSIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLkZpZWxkQW5hbHlzaXNSZXF1ZXN0SGFuZGxlciIgLz4KKworCisgIDwhLS0gRG9jdW1lbnQgQW5hbHlzaXMgSGFuZGxlcgorCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0FuYWx5c2lzUmVxdWVzdEhhbmRsZXIKKworICAgICAgIEFuIGFuYWx5c2lzIGhhbmRsZXIgdGhhdCBwcm92aWRlcyBhIGJyZWFrZG93biBvZiB0aGUgYW5hbHlzaXMKKyAgICAgICBwcm9jZXNzIG9mIHByb3ZpZGVkIGRvY3VtZW50cy4gVGhpcyBoYW5kbGVyIGV4cGVjdHMgYSAoc2luZ2xlKQorICAgICAgIGNvbnRlbnQgc3RyZWFtIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICAgICA8ZG9jcz4KKyAgICAgICAgIDxkb2M+CisgICAgICAgICAgIDxmaWVsZCBuYW1lPSJpZCI+MTwvZmllbGQ+CisgICAgICAgICAgIDxmaWVsZCBuYW1lPSJuYW1lIj5UaGUgTmFtZTwvZmllbGQ+CisgICAgICAgICAgIDxmaWVsZCBuYW1lPSJ0ZXh0Ij5UaGUgVGV4dCBWYWx1ZTwvZmllbGQ+CisgICAgICAgICA8L2RvYz4KKyAgICAgICAgIDxkb2M+Li4uPC9kb2M+CisgICAgICAgICA8ZG9jPi4uLjwvZG9jPgorICAgICAgICAgLi4uCisgICAgICAgPC9kb2NzPgorCisgICAgTm90ZTogRWFjaCBkb2N1bWVudCBtdXN0IGNvbnRhaW4gYSBmaWVsZCB3aGljaCBzZXJ2ZXMgYXMgdGhlCisgICAgdW5pcXVlIGtleS4gVGhpcyBrZXkgaXMgdXNlZCBpbiB0aGUgcmV0dXJuZWQgcmVzcG9uc2UgdG8gYXNzb2NpYXRlCisgICAgYW4gYW5hbHlzaXMgYnJlYWtkb3duIHRvIHRoZSBhbmFseXplZCBkb2N1bWVudC4KKworICAgIExpa2UgdGhlIEZpZWxkQW5hbHlzaXNSZXF1ZXN0SGFuZGxlciwgdGhpcyBoYW5kbGVyIGFsc28gc3VwcG9ydHMKKyAgICBxdWVyeSBhbmFseXNpcyBieSBzZW5kaW5nIGVpdGhlciBhbiAiYW5hbHlzaXMucXVlcnkiIG9yICJxIgorICAgIHJlcXVlc3QgcGFyYW1ldGVyIHRoYXQgaG9sZHMgdGhlIHF1ZXJ5IHRleHQgdG8gYmUgYW5hbHl6ZWQuIEl0CisgICAgYWxzbyBzdXBwb3J0cyB0aGUgImFuYWx5c2lzLnNob3dtYXRjaCIgcGFyYW1ldGVyIHdoaWNoIHdoZW4gc2V0IHRvCisgICAgdHJ1ZSwgYWxsIGZpZWxkIHRva2VucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSB0b2tlbnMgd2lsbCBiZSBtYXJrZWQKKyAgICBhcyBhICJtYXRjaCIuIAorICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hbmFseXNpcy9kb2N1bWVudCIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLkRvY3VtZW50QW5hbHlzaXNSZXF1ZXN0SGFuZGxlciIKKyAgICAgICAgICAgICAgICAgIHN0YXJ0dXA9ImxhenkiIC8+CisKKyAgPCEtLSBBZG1pbiBIYW5kbGVycworCisgICAgICAgQWRtaW4gSGFuZGxlcnMgLSBUaGlzIHdpbGwgcmVnaXN0ZXIgYWxsIHRoZSBzdGFuZGFyZCBhZG1pbgorICAgICAgIFJlcXVlc3RIYW5kbGVycy4gIAorICAgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FkbWluLyIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmFkbWluLkFkbWluSGFuZGxlcnMiIC8+CisgIDwhLS0gVGhpcyBzaW5nbGUgaGFuZGxlciBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcuLi4gLS0+CisgIDwhLS0KKyAgICAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9sdWtlIiAgICAgICBjbGFzcz0ic29sci5hZG1pbi5MdWtlUmVxdWVzdEhhbmRsZXIiIC8+CisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vc3lzdGVtIiAgICAgY2xhc3M9InNvbHIuYWRtaW4uU3lzdGVtSW5mb0hhbmRsZXIiIC8+CisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vcGx1Z2lucyIgICAgY2xhc3M9InNvbHIuYWRtaW4uUGx1Z2luSW5mb0hhbmRsZXIiIC8+CisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vdGhyZWFkcyIgICAgY2xhc3M9InNvbHIuYWRtaW4uVGhyZWFkRHVtcEhhbmRsZXIiIC8+CisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vcHJvcGVydGllcyIgY2xhc3M9InNvbHIuYWRtaW4uUHJvcGVydGllc1JlcXVlc3RIYW5kbGVyIiAvPgorICAgICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2FkbWluL2ZpbGUiICAgICAgIGNsYXNzPSJzb2xyLmFkbWluLlNob3dGaWxlUmVxdWVzdEhhbmRsZXIiID4KKyAgICAtLT4KKyAgPCEtLSBJZiB5b3Ugd2lzaCB0byBoaWRlIGZpbGVzIHVuZGVyICR7c29sci5ob21lfS9jb25mLCBleHBsaWNpdGx5CisgICAgICAgcmVnaXN0ZXIgdGhlIFNob3dGaWxlUmVxdWVzdEhhbmRsZXIgdXNpbmc6IAorICAgIC0tPgorICA8IS0tCisgICAgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvYWRtaW4vZmlsZSIgCisgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5hZG1pbi5TaG93RmlsZVJlcXVlc3RIYW5kbGVyIiA+CisgICAgICAgPGxzdCBuYW1lPSJpbnZhcmlhbnRzIj4KKyAgICAgICAgIDxzdHIgbmFtZT0iaGlkZGVuIj5zeW5vbnltcy50eHQ8L3N0cj4gCisgICAgICAgICA8c3RyIG5hbWU9ImhpZGRlbiI+YW5vdGhlcmZpbGUudHh0PC9zdHI+IAorICAgICAgIDwvbHN0PgorICAgICA8L3JlcXVlc3RIYW5kbGVyPgorICAgIC0tPgorCisgIDwhLS0gcGluZy9oZWFsdGhjaGVjayAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9hZG1pbi9waW5nIiBjbGFzcz0ic29sci5QaW5nUmVxdWVzdEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iaW52YXJpYW50cyI+CisgICAgICA8c3RyIG5hbWU9InEiPnNvbHJwaW5ncXVlcnk8L3N0cj4KKyAgICA8L2xzdD4KKyAgICA8bHN0IG5hbWU9ImRlZmF1bHRzIj4KKyAgICAgIDxzdHIgbmFtZT0iZWNob1BhcmFtcyI+YWxsPC9zdHI+CisgICAgPC9sc3Q+CisgICAgPCEtLSBBbiBvcHRpb25hbCBmZWF0dXJlIG9mIHRoZSBQaW5nUmVxdWVzdEhhbmRsZXIgaXMgdG8gY29uZmlndXJlIHRoZSAKKyAgICAgICAgIGhhbmRsZXIgd2l0aCBhICJoZWFsdGhjaGVja0ZpbGUiIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZS9kaXNhYmxlIAorICAgICAgICAgdGhlIFBpbmdSZXF1ZXN0SGFuZGxlci4KKyAgICAgICAgIHJlbGF0aXZlIHBhdGhzIGFyZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBkYXRhIGRpciAKKyAgICAgIC0tPgorICAgIDwhLS0gPHN0ciBuYW1lPSJoZWFsdGhjaGVja0ZpbGUiPnNlcnZlci1lbmFibGVkLnR4dDwvc3RyPiAtLT4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIEVjaG8gdGhlIHJlcXVlc3QgY29udGVudHMgYmFjayB0byB0aGUgY2xpZW50IC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2RlYnVnL2R1bXAiIGNsYXNzPSJzb2xyLkR1bXBSZXF1ZXN0SGFuZGxlciIgPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJlY2hvUGFyYW1zIj5leHBsaWNpdDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJlY2hvSGFuZGxlciI+dHJ1ZTwvc3RyPgorICAgIDwvbHN0PgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDwhLS0gU29sciBSZXBsaWNhdGlvbgorCisgICAgICAgVGhlIFNvbHJSZXBsaWNhdGlvbkhhbmRsZXIgc3VwcG9ydHMgcmVwbGljYXRpbmcgaW5kZXhlcyBmcm9tIGEKKyAgICAgICAibWFzdGVyIiB1c2VkIGZvciBpbmRleGluZyBhbmQgInNsYXZlcyIgdXNlZCBmb3IgcXVlcmllcy4KKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Tb2xyUmVwbGljYXRpb24gCisKKyAgICAgICBJdCBpcyBhbHNvIG5lY2Vzc2FyeSBmb3IgU29sckNsb3VkIHRvIGZ1bmN0aW9uIChpbiBDbG91ZCBtb2RlLCB0aGUKKyAgICAgICByZXBsaWNhdGlvbiBoYW5kbGVyIGlzIHVzZWQgdG8gYnVsayB0cmFuc2ZlciBzZWdtZW50cyB3aGVuIG5vZGVzIAorICAgICAgIGFyZSBhZGRlZCBvciBuZWVkIHRvIHJlY292ZXIpLgorCisgICAgICAgaHR0cHM6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Tb2xyQ2xvdWQvCisgICAgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvcmVwbGljYXRpb24iIGNsYXNzPSJzb2xyLlJlcGxpY2F0aW9uSGFuZGxlciIgPgorICAgIDwhLS0KKyAgICAgICBUbyBlbmFibGUgc2ltcGxlIG1hc3Rlci9zbGF2ZSByZXBsaWNhdGlvbiwgdW5jb21tZW50IG9uZSBvZiB0aGUgCisgICAgICAgc2VjdGlvbnMgYmVsb3csIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgc29sciBpbnN0YW5jZSBzaG91bGQgYmUKKyAgICAgICB0aGUgIm1hc3RlciIgb3IgYSAic2xhdmUiLiAgSWYgdGhpcyBpbnN0YW5jZSBpcyBhICJzbGF2ZSIgeW91IHdpbGwgCisgICAgICAgYWxzbyBuZWVkIHRvIGZpbGwgaW4gdGhlIG1hc3RlclVybCB0byBwb2ludCB0byBhIHJlYWwgbWFjaGluZS4KKyAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJtYXN0ZXIiPgorICAgICAgICAgPHN0ciBuYW1lPSJyZXBsaWNhdGVBZnRlciI+Y29tbWl0PC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9InJlcGxpY2F0ZUFmdGVyIj5zdGFydHVwPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImNvbmZGaWxlcyI+c2NoZW1hLnhtbCxzdG9wd29yZHMudHh0PC9zdHI+CisgICAgICAgPC9sc3Q+CisgICAgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0ic2xhdmUiPgorICAgICAgICAgPHN0ciBuYW1lPSJtYXN0ZXJVcmwiPmh0dHA6Ly95b3VyLW1hc3Rlci1ob3N0bmFtZTo4OTgzL3NvbHI8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0icG9sbEludGVydmFsIj4wMDowMDo2MDwvc3RyPgorICAgICAgIDwvbHN0PgorICAgIC0tPgorICA8L3JlcXVlc3RIYW5kbGVyPgorCisgIDwhLS0gU2VhcmNoIENvbXBvbmVudHMKKworICAgICAgIFNlYXJjaCBjb21wb25lbnRzIGFyZSByZWdpc3RlcmVkIHRvIFNvbHJDb3JlIGFuZCB1c2VkIGJ5IAorICAgICAgIGluc3RhbmNlcyBvZiBTZWFyY2hIYW5kbGVyICh3aGljaCBjYW4gYWNjZXNzIHRoZW0gYnkgbmFtZSkKKyAgICAgICAKKyAgICAgICBCeSBkZWZhdWx0LCB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZToKKyAgICAgICAKKyAgICAgICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9InF1ZXJ5IiAgICAgY2xhc3M9InNvbHIuUXVlcnlDb21wb25lbnQiIC8+CisgICAgICAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJmYWNldCIgICAgIGNsYXNzPSJzb2xyLkZhY2V0Q29tcG9uZW50IiAvPgorICAgICAgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ibWx0IiAgICAgICBjbGFzcz0ic29sci5Nb3JlTGlrZVRoaXNDb21wb25lbnQiIC8+CisgICAgICAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJoaWdobGlnaHQiIGNsYXNzPSJzb2xyLkhpZ2hsaWdodENvbXBvbmVudCIgLz4KKyAgICAgICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9InN0YXRzIiAgICAgY2xhc3M9InNvbHIuU3RhdHNDb21wb25lbnQiIC8+CisgICAgICAgPHNlYXJjaENvbXBvbmVudCBuYW1lPSJkZWJ1ZyIgICAgIGNsYXNzPSJzb2xyLkRlYnVnQ29tcG9uZW50IiAvPgorICAgCisgICAgICAgRGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGEgcmVxdWVzdEhhbmRsZXIgd291bGQgbG9vayBsaWtlOgorCisgICAgICAgPGFyciBuYW1lPSJjb21wb25lbnRzIj4KKyAgICAgICAgIDxzdHI+cXVlcnk8L3N0cj4KKyAgICAgICAgIDxzdHI+ZmFjZXQ8L3N0cj4KKyAgICAgICAgIDxzdHI+bWx0PC9zdHI+CisgICAgICAgICA8c3RyPmhpZ2hsaWdodDwvc3RyPgorICAgICAgICAgPHN0cj5zdGF0czwvc3RyPgorICAgICAgICAgPHN0cj5kZWJ1Zzwvc3RyPgorICAgICAgIDwvYXJyPgorCisgICAgICAgSWYgeW91IHJlZ2lzdGVyIGEgc2VhcmNoQ29tcG9uZW50IHRvIG9uZSBvZiB0aGUgc3RhbmRhcmQgbmFtZXMsIAorICAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuCisKKyAgICAgICBUbyBpbnNlcnQgY29tcG9uZW50cyBiZWZvcmUgb3IgYWZ0ZXIgdGhlICdzdGFuZGFyZCcgY29tcG9uZW50cywgdXNlOgorICAgIAorICAgICAgIDxhcnIgbmFtZT0iZmlyc3QtY29tcG9uZW50cyI+CisgICAgICAgICA8c3RyPm15Rmlyc3RDb21wb25lbnROYW1lPC9zdHI+CisgICAgICAgPC9hcnI+CisgICAgCisgICAgICAgPGFyciBuYW1lPSJsYXN0LWNvbXBvbmVudHMiPgorICAgICAgICAgPHN0cj5teUxhc3RDb21wb25lbnROYW1lPC9zdHI+CisgICAgICAgPC9hcnI+CisKKyAgICAgICBOT1RFOiBUaGUgY29tcG9uZW50IHJlZ2lzdGVyZWQgd2l0aCB0aGUgbmFtZSAiZGVidWciIHdpbGwKKyAgICAgICBhbHdheXMgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlICJsYXN0LWNvbXBvbmVudHMiIAorICAgICAgIAorICAgICAtLT4KKworICA8IS0tIFNwZWxsIENoZWNrCisKKyAgICAgICBUaGUgc3BlbGwgY2hlY2sgY29tcG9uZW50IGNhbiByZXR1cm4gYSBsaXN0IG9mIGFsdGVybmF0aXZlIHNwZWxsaW5nCisgICAgICAgc3VnZ2VzdGlvbnMuICAKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TcGVsbENoZWNrQ29tcG9uZW50CisgICAgLS0+CisgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0ic3BlbGxjaGVjayIgY2xhc3M9InNvbHIuU3BlbGxDaGVja0NvbXBvbmVudCI+CisKKyAgICA8c3RyIG5hbWU9InF1ZXJ5QW5hbHl6ZXJGaWVsZFR5cGUiPnRleHRfZ2VuZXJhbDwvc3RyPgorCisgICAgPCEtLSBNdWx0aXBsZSAiU3BlbGwgQ2hlY2tlcnMiIGNhbiBiZSBkZWNsYXJlZCBhbmQgdXNlZCBieSB0aGlzCisgICAgICAgICBjb21wb25lbnQKKyAgICAgIC0tPgorCisgICAgPCEtLSBhIHNwZWxsY2hlY2tlciBidWlsdCBmcm9tIGEgZmllbGQgb2YgdGhlIG1haW4gaW5kZXggLS0+CisgICAgPGxzdCBuYW1lPSJzcGVsbGNoZWNrZXIiPgorICAgICAgPHN0ciBuYW1lPSJuYW1lIj5kZWZhdWx0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZpZWxkIj50ZXh0PC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImNsYXNzbmFtZSI+c29sci5EaXJlY3RTb2xyU3BlbGxDaGVja2VyPC9zdHI+CisgICAgICA8IS0tIHRoZSBzcGVsbGNoZWNrIGRpc3RhbmNlIG1lYXN1cmUgdXNlZCwgdGhlIGRlZmF1bHQgaXMgdGhlIGludGVybmFsIGxldmVuc2h0ZWluIC0tPgorICAgICAgPHN0ciBuYW1lPSJkaXN0YW5jZU1lYXN1cmUiPmludGVybmFsPC9zdHI+CisgICAgICA8IS0tIG1pbmltdW0gYWNjdXJhY3kgbmVlZGVkIHRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBzcGVsbGNoZWNrIHN1Z2dlc3Rpb24gLS0+CisgICAgICA8ZmxvYXQgbmFtZT0iYWNjdXJhY3kiPjAuNTwvZmxvYXQ+CisgICAgICA8IS0tIHRoZSBtYXhpbXVtICNlZGl0cyB3ZSBjb25zaWRlciB3aGVuIGVudW1lcmF0aW5nIHRlcm1zOiBjYW4gYmUgMSBvciAyIC0tPgorICAgICAgPGludCBuYW1lPSJtYXhFZGl0cyI+MjwvaW50PgorICAgICAgPCEtLSB0aGUgbWluaW11bSBzaGFyZWQgcHJlZml4IHdoZW4gZW51bWVyYXRpbmcgdGVybXMgLS0+CisgICAgICA8aW50IG5hbWU9Im1pblByZWZpeCI+MTwvaW50PgorICAgICAgPCEtLSBtYXhpbXVtIG51bWJlciBvZiBpbnNwZWN0aW9ucyBwZXIgcmVzdWx0LiAtLT4KKyAgICAgIDxpbnQgbmFtZT0ibWF4SW5zcGVjdGlvbnMiPjU8L2ludD4KKyAgICAgIDwhLS0gbWluaW11bSBsZW5ndGggb2YgYSBxdWVyeSB0ZXJtIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGNvcnJlY3Rpb24gLS0+CisgICAgICA8aW50IG5hbWU9Im1pblF1ZXJ5TGVuZ3RoIj40PC9pbnQ+CisgICAgICA8IS0tIG1heGltdW0gdGhyZXNob2xkIG9mIGRvY3VtZW50cyBhIHF1ZXJ5IHRlcm0gY2FuIGFwcGVhciB0byBiZSBjb25zaWRlcmVkIGZvciBjb3JyZWN0aW9uIC0tPgorICAgICAgPGZsb2F0IG5hbWU9Im1heFF1ZXJ5RnJlcXVlbmN5Ij4wLjAxPC9mbG9hdD4KKyAgICAgIDwhLS0gdW5jb21tZW50IHRoaXMgdG8gcmVxdWlyZSBzdWdnZXN0aW9ucyB0byBvY2N1ciBpbiAxJSBvZiB0aGUgZG9jdW1lbnRzCisgICAgICAJPGZsb2F0IG5hbWU9InRocmVzaG9sZFRva2VuRnJlcXVlbmN5Ij4uMDE8L2Zsb2F0PgorICAgICAgLS0+CisgICAgPC9sc3Q+CisKKyAgICA8IS0tIGEgc3BlbGxjaGVja2VyIHRoYXQgY2FuIGJyZWFrIG9yIGNvbWJpbmUgd29yZHMuICBTZWUgIi9zcGVsbCIgaGFuZGxlciBiZWxvdyBmb3IgdXNhZ2UgLS0+CisgICAgPGxzdCBuYW1lPSJzcGVsbGNoZWNrZXIiPgorICAgICAgPHN0ciBuYW1lPSJuYW1lIj53b3JkYnJlYWs8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iY2xhc3NuYW1lIj5zb2xyLldvcmRCcmVha1NvbHJTcGVsbENoZWNrZXI8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iZmllbGQiPm5hbWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iY29tYmluZVdvcmRzIj50cnVlPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImJyZWFrV29yZHMiPnRydWU8L3N0cj4KKyAgICAgIDxpbnQgbmFtZT0ibWF4Q2hhbmdlcyI+MTA8L2ludD4KKyAgICA8L2xzdD4KKworICAgIDwhLS0gYSBzcGVsbGNoZWNrZXIgdGhhdCB1c2VzIGEgZGlmZmVyZW50IGRpc3RhbmNlIG1lYXN1cmUgLS0+CisgICAgPCEtLQorICAgICAgIDxsc3QgbmFtZT0ic3BlbGxjaGVja2VyIj4KKyAgICAgICAgIDxzdHIgbmFtZT0ibmFtZSI+amFyb3dpbmtsZXI8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iZmllbGQiPnNwZWxsPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImNsYXNzbmFtZSI+c29sci5EaXJlY3RTb2xyU3BlbGxDaGVja2VyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImRpc3RhbmNlTWVhc3VyZSI+CisgICAgICAgICAgIG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGVsbC5KYXJvV2lua2xlckRpc3RhbmNlCisgICAgICAgICA8L3N0cj4KKyAgICAgICA8L2xzdD4KKyAgICAgLS0+CisKKyAgICA8IS0tIGEgc3BlbGxjaGVja2VyIHRoYXQgdXNlIGFuIGFsdGVybmF0ZSBjb21wYXJhdG9yIAorCisgICAgICAgICBjb21wYXJhdG9yQ2xhc3MgYmUgb25lIG9mOgorICAgICAgICAgIDEuIHNjb3JlIChkZWZhdWx0KQorICAgICAgICAgIDIuIGZyZXEgKEZyZXF1ZW5jeSBmaXJzdCwgdGhlbiBzY29yZSkKKyAgICAgICAgICAzLiBBIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCisgICAgICAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJzcGVsbGNoZWNrZXIiPgorICAgICAgICAgPHN0ciBuYW1lPSJuYW1lIj5mcmVxPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9ImZpZWxkIj5sb3dlcmZpbHQ8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iY2xhc3NuYW1lIj5zb2xyLkRpcmVjdFNvbHJTcGVsbENoZWNrZXI8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iY29tcGFyYXRvckNsYXNzIj5mcmVxPC9zdHI+CisgICAgICAtLT4KKworICAgIDwhLS0gQSBzcGVsbGNoZWNrZXIgdGhhdCByZWFkcyB0aGUgbGlzdCBvZiB3b3JkcyBmcm9tIGEgZmlsZSAtLT4KKyAgICA8IS0tCisgICAgICAgPGxzdCBuYW1lPSJzcGVsbGNoZWNrZXIiPgorICAgICAgICAgPHN0ciBuYW1lPSJjbGFzc25hbWUiPnNvbHIuRmlsZUJhc2VkU3BlbGxDaGVja2VyPC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9Im5hbWUiPmZpbGU8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0ic291cmNlTG9jYXRpb24iPnNwZWxsaW5ncy50eHQ8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0iY2hhcmFjdGVyRW5jb2RpbmciPlVURi04PC9zdHI+CisgICAgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2tJbmRleERpciI+c3BlbGxjaGVja2VyRmlsZTwvc3RyPgorICAgICAgIDwvbHN0PgorICAgICAgLS0+CisgIDwvc2VhcmNoQ29tcG9uZW50PgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIHNwZWxsY2hlY2sgY29tcG9uZW50LiAgCisKKyAgICAgICBOT1RFOiBUaGlzIGlzIHB1cmVseSBhcyBhbiBleGFtcGxlLiAgVGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhlCisgICAgICAgU3BlbGxDaGVja0NvbXBvbmVudCBpcyB0byBob29rIGl0IGludG8gdGhlIHJlcXVlc3QgaGFuZGxlciB0aGF0CisgICAgICAgaGFuZGxlcyB5b3VyIG5vcm1hbCB1c2VyIHF1ZXJpZXMgc28gdGhhdCBhIHNlcGFyYXRlIHJlcXVlc3QgaXMKKyAgICAgICBub3QgbmVlZGVkIHRvIGdldCBzdWdnZXN0aW9ucy4KKworICAgICAgIElOIE9USEVSIFdPUkRTLCBUSEVSRSBJUyBSRUFMTFkgR09PRCBDSEFOQ0UgVEhFIFNFVFVQIEJFTE9XIElTCisgICAgICAgTk9UIFdIQVQgWU9VIFdBTlQgRk9SIFlPVVIgUFJPRFVDVElPTiBTWVNURU0hCisgICAgICAgCisgICAgICAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TcGVsbENoZWNrQ29tcG9uZW50IGZvciBkZXRhaWxzCisgICAgICAgb24gdGhlIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii9zcGVsbCIgY2xhc3M9InNvbHIuU2VhcmNoSGFuZGxlciIgc3RhcnR1cD0ibGF6eSI+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8c3RyIG5hbWU9ImRmIj50ZXh0PC9zdHI+CisgICAgICA8IS0tIFNvbHIgd2lsbCB1c2Ugc3VnZ2VzdGlvbnMgZnJvbSBib3RoIHRoZSAnZGVmYXVsdCcgc3BlbGxjaGVja2VyCisgICAgICAgICAgIGFuZCBmcm9tIHRoZSAnd29yZGJyZWFrJyBzcGVsbGNoZWNrZXIgYW5kIGNvbWJpbmUgdGhlbS4KKyAgICAgICAgICAgY29sbGF0aW9ucyAocmUtd3JpdHRlbiBxdWVyaWVzKSBjYW4gaW5jbHVkZSBhIGNvbWJpbmF0aW9uIG9mCisgICAgICAgICAgIGNvcnJlY3Rpb25zIGZyb20gYm90aCBzcGVsbGNoZWNrZXJzIC0tPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLmRpY3Rpb25hcnkiPmRlZmF1bHQ8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5kaWN0aW9uYXJ5Ij53b3JkYnJlYWs8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjayI+b248L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5leHRlbmRlZFJlc3VsdHMiPnRydWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5jb3VudCI+MTA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5hbHRlcm5hdGl2ZVRlcm1Db3VudCI+NTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLm1heFJlc3VsdHNGb3JTdWdnZXN0Ij41PC9zdHI+CisgICAgICA8c3RyIG5hbWU9InNwZWxsY2hlY2suY29sbGF0ZSI+dHJ1ZTwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJzcGVsbGNoZWNrLmNvbGxhdGVFeHRlbmRlZFJlc3VsdHMiPnRydWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhDb2xsYXRpb25UcmllcyI+MTA8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0ic3BlbGxjaGVjay5tYXhDb2xsYXRpb25zIj41PC9zdHI+CisgICAgPC9sc3Q+CisgICAgPGFyciBuYW1lPSJsYXN0LWNvbXBvbmVudHMiPgorICAgICAgPHN0cj5zcGVsbGNoZWNrPC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKyAgPCEtLSBUZXJtIFZlY3RvciBDb21wb25lbnQKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9UZXJtVmVjdG9yQ29tcG9uZW50CisgICAgLS0+CisgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0idHZDb21wb25lbnQiIGNsYXNzPSJzb2xyLlRlcm1WZWN0b3JDb21wb25lbnQiLz4KKworICA8IS0tIEEgcmVxdWVzdCBoYW5kbGVyIGZvciBkZW1vbnN0cmF0aW5nIHRoZSB0ZXJtIHZlY3RvciBjb21wb25lbnQKKworICAgICAgIFRoaXMgaXMgcHVyZWx5IGFzIGFuIGV4YW1wbGUuCisKKyAgICAgICBJbiByZWFsaXR5IHlvdSB3aWxsIGxpa2VseSB3YW50IHRvIGFkZCB0aGUgY29tcG9uZW50IHRvIHlvdXIgCisgICAgICAgYWxyZWFkeSBzcGVjaWZpZWQgcmVxdWVzdCBoYW5kbGVycy4gCisgICAgLS0+CisgIDxyZXF1ZXN0SGFuZGxlciBuYW1lPSIvdHZyaCIgY2xhc3M9InNvbHIuU2VhcmNoSGFuZGxlciIgc3RhcnR1cD0ibGF6eSI+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8c3RyIG5hbWU9ImRmIj50ZXh0PC9zdHI+CisgICAgICA8Ym9vbCBuYW1lPSJ0diI+dHJ1ZTwvYm9vbD4KKyAgICA8L2xzdD4KKyAgICA8YXJyIG5hbWU9Imxhc3QtY29tcG9uZW50cyI+CisgICAgICA8c3RyPnR2Q29tcG9uZW50PC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKyAgPCEtLSBDbHVzdGVyaW5nIENvbXBvbmVudAorCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0NsdXN0ZXJpbmdDb21wb25lbnQKKworICAgICAgIFlvdSdsbCBuZWVkIHRvIHNldCB0aGUgc29sci5jbHVzdGVyaW5nLmVuYWJsZWQgc3lzdGVtIHByb3BlcnR5CisgICAgICAgd2hlbiBydW5uaW5nIHNvbHIgdG8gcnVuIHdpdGggY2x1c3RlcmluZyBlbmFibGVkOgorCisgICAgICAgICAgICBqYXZhIC1Ec29sci5jbHVzdGVyaW5nLmVuYWJsZWQ9dHJ1ZSAtamFyIHN0YXJ0LmphcgorCisgICAgLS0+CisgIDxzZWFyY2hDb21wb25lbnQgbmFtZT0iY2x1c3RlcmluZyIKKyAgICAgICAgICAgICAgICAgICBlbmFibGU9IiR7c29sci5jbHVzdGVyaW5nLmVuYWJsZWQ6ZmFsc2V9IgorICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbXBvbmVudCIgPgorICAgIDwhLS0gRGVjbGFyZSBhbiBlbmdpbmUgLS0+CisgICAgPGxzdCBuYW1lPSJlbmdpbmUiPgorICAgICAgPCEtLSBUaGUgbmFtZSwgb25seSBvbmUgY2FuIGJlIG5hbWVkICJkZWZhdWx0IiAtLT4KKyAgICAgIDxzdHIgbmFtZT0ibmFtZSI+ZGVmYXVsdDwvc3RyPgorCisgICAgICA8IS0tIENsYXNzIG5hbWUgb2YgQ2Fycm90MiBjbHVzdGVyaW5nIGFsZ29yaXRobS4KKworICAgICAgICAgICBDdXJyZW50bHkgYXZhaWxhYmxlIGFsZ29yaXRobXMgYXJlOgorICAgICAgICAgICAKKyAgICAgICAgICAgKiBvcmcuY2Fycm90Mi5jbHVzdGVyaW5nLmxpbmdvLkxpbmdvQ2x1c3RlcmluZ0FsZ29yaXRobQorICAgICAgICAgICAqIG9yZy5jYXJyb3QyLmNsdXN0ZXJpbmcuc3RjLlNUQ0NsdXN0ZXJpbmdBbGdvcml0aG0KKyAgICAgICAgICAgKiBvcmcuY2Fycm90Mi5jbHVzdGVyaW5nLmttZWFucy5CaXNlY3RpbmdLTWVhbnNDbHVzdGVyaW5nQWxnb3JpdGhtCisgICAgICAgICAgIAorICAgICAgICAgICBTZWUgaHR0cDovL3Byb2plY3QuY2Fycm90Mi5vcmcvYWxnb3JpdGhtcy5odG1sIGZvciB0aGUKKyAgICAgICAgICAgYWxnb3JpdGhtJ3MgY2hhcmFjdGVyaXN0aWNzLgorICAgICAgICAtLT4KKyAgICAgIDxzdHIgbmFtZT0iY2Fycm90LmFsZ29yaXRobSI+b3JnLmNhcnJvdDIuY2x1c3RlcmluZy5saW5nby5MaW5nb0NsdXN0ZXJpbmdBbGdvcml0aG08L3N0cj4KKworICAgICAgPCEtLSBPdmVycmlkaW5nIHZhbHVlcyBmb3IgQ2Fycm90MiBkZWZhdWx0IGFsZ29yaXRobSBhdHRyaWJ1dGVzLgorCisgICAgICAgICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIGFsbCBhdmFpbGFibGUgYXR0cmlidXRlcywgc2VlOgorICAgICAgICAgICBodHRwOi8vZG93bmxvYWQuY2Fycm90Mi5vcmcvc3RhYmxlL21hbnVhbC8jY2hhcHRlci5jb21wb25lbnRzLgorICAgICAgICAgICBVc2UgYXR0cmlidXRlIGtleSBhcyBuYW1lIGF0dHJpYnV0ZSBvZiBzdHIgZWxlbWVudHMKKyAgICAgICAgICAgYmVsb3cuIFRoZXNlIGNhbiBiZSBmdXJ0aGVyIG92ZXJyaWRkZW4gZm9yIGluZGl2aWR1YWwKKyAgICAgICAgICAgcmVxdWVzdHMgYnkgc3BlY2lmeWluZyBhdHRyaWJ1dGUga2V5IGFzIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICAgICAgIG5hbWUgYW5kIGF0dHJpYnV0ZSB2YWx1ZSBhcyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgIC0tPgorICAgICAgPHN0ciBuYW1lPSJMaW5nb0NsdXN0ZXJpbmdBbGdvcml0aG0uZGVzaXJlZENsdXN0ZXJDb3VudEJhc2UiPjIwPC9zdHI+CisKKyAgICAgIDwhLS0gTG9jYXRpb24gb2YgQ2Fycm90MiBsZXhpY2FsIHJlc291cmNlcy4KKworICAgICAgICAgICBBIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGxvYWQgQ2Fycm90Mi1zcGVjaWZpYyBzdG9wIHdvcmRzCisgICAgICAgICAgIGFuZCBzdG9wIGxhYmVscy4gQWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gU29sciBjb25maWcgZGlyZWN0b3J5LgorICAgICAgICAgICBJZiBhIHNwZWNpZmljIHJlc291cmNlIChlLmcuIHN0b3B3b3Jkcy5lbikgaXMgcHJlc2VudCBpbiB0aGUKKyAgICAgICAgICAgc3BlY2lmaWVkIGRpciwgaXQgd2lsbCBjb21wbGV0ZWx5IG92ZXJyaWRlIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgIGRlZmF1bHQgb25lIHRoYXQgc2hpcHMgd2l0aCBDYXJyb3QyLgorCisgICAgICAgICAgIEZvciBhbiBvdmVydmlldyBvZiBDYXJyb3QyIGxleGljYWwgcmVzb3VyY2VzLCBzZWU6CisgICAgICAgICAgIGh0dHA6Ly9kb3dubG9hZC5jYXJyb3QyLm9yZy9oZWFkL21hbnVhbC8jY2hhcHRlci5sZXhpY2FsLXJlc291cmNlcworICAgICAgICAtLT4KKyAgICAgIDxzdHIgbmFtZT0iY2Fycm90LmxleGljYWxSZXNvdXJjZXNEaXIiPmNsdXN0ZXJpbmcvY2Fycm90Mjwvc3RyPgorCisgICAgICA8IS0tIFRoZSBsYW5ndWFnZSB0byBhc3N1bWUgZm9yIHRoZSBkb2N1bWVudHMuCisKKyAgICAgICAgICAgRm9yIGEgbGlzdCBvZiBhbGxvd2VkIHZhbHVlcywgc2VlOgorICAgICAgICAgICBodHRwOi8vZG93bmxvYWQuY2Fycm90Mi5vcmcvc3RhYmxlL21hbnVhbC8jc2VjdGlvbi5hdHRyaWJ1dGUubGluZ28uTXVsdGlsaW5ndWFsQ2x1c3RlcmluZy5kZWZhdWx0TGFuZ3VhZ2UKKyAgICAgICAtLT4KKyAgICAgIDxzdHIgbmFtZT0iTXVsdGlsaW5ndWFsQ2x1c3RlcmluZy5kZWZhdWx0TGFuZ3VhZ2UiPkVOR0xJU0g8L3N0cj4KKyAgICA8L2xzdD4KKyAgICA8bHN0IG5hbWU9ImVuZ2luZSI+CisgICAgICA8c3RyIG5hbWU9Im5hbWUiPnN0Yzwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJjYXJyb3QuYWxnb3JpdGhtIj5vcmcuY2Fycm90Mi5jbHVzdGVyaW5nLnN0Yy5TVENDbHVzdGVyaW5nQWxnb3JpdGhtPC9zdHI+CisgICAgPC9sc3Q+CisgIDwvc2VhcmNoQ29tcG9uZW50PgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIGNsdXN0ZXJpbmcgY29tcG9uZW50CisKKyAgICAgICBUaGlzIGlzIHB1cmVseSBhcyBhbiBleGFtcGxlLgorCisgICAgICAgSW4gcmVhbGl0eSB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0byBhZGQgdGhlIGNvbXBvbmVudCB0byB5b3VyIAorICAgICAgIGFscmVhZHkgc3BlY2lmaWVkIHJlcXVlc3QgaGFuZGxlcnMuIAorICAgIC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2NsdXN0ZXJpbmciCisgICAgICAgICAgICAgICAgICBzdGFydHVwPSJsYXp5IgorICAgICAgICAgICAgICAgICAgZW5hYmxlPSIke3NvbHIuY2x1c3RlcmluZy5lbmFibGVkOmZhbHNlfSIKKyAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPGJvb2wgbmFtZT0iY2x1c3RlcmluZyI+dHJ1ZTwvYm9vbD4KKyAgICAgIDxzdHIgbmFtZT0iY2x1c3RlcmluZy5lbmdpbmUiPmRlZmF1bHQ8L3N0cj4KKyAgICAgIDxib29sIG5hbWU9ImNsdXN0ZXJpbmcucmVzdWx0cyI+dHJ1ZTwvYm9vbD4KKyAgICAgIDwhLS0gVGhlIHRpdGxlIGZpZWxkIC0tPgorICAgICAgPHN0ciBuYW1lPSJjYXJyb3QudGl0bGUiPm5hbWU8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0iY2Fycm90LnVybCI+aWQ8L3N0cj4KKyAgICAgIDwhLS0gVGhlIGZpZWxkIHRvIGNsdXN0ZXIgb24gLS0+CisgICAgICA8c3RyIG5hbWU9ImNhcnJvdC5zbmlwcGV0Ij5mZWF0dXJlczwvc3RyPgorICAgICAgPCEtLSBwcm9kdWNlIHN1bW1hcmllcyAtLT4KKyAgICAgIDxib29sIG5hbWU9ImNhcnJvdC5wcm9kdWNlU3VtbWFyeSI+dHJ1ZTwvYm9vbD4KKyAgICAgIDwhLS0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGxhYmVscyBwZXIgY2x1c3RlciAtLT4KKyAgICAgIDwhLS08aW50IG5hbWU9ImNhcnJvdC5udW1EZXNjcmlwdGlvbnMiPjU8L2ludD4tLT4KKyAgICAgIDwhLS0gcHJvZHVjZSBzdWIgY2x1c3RlcnMgLS0+CisgICAgICA8Ym9vbCBuYW1lPSJjYXJyb3Qub3V0cHV0U3ViQ2x1c3RlcnMiPmZhbHNlPC9ib29sPgorCisgICAgICA8c3RyIG5hbWU9ImRlZlR5cGUiPmVkaXNtYXg8L3N0cj4KKyAgICAgIDxzdHIgbmFtZT0icWYiPgorICAgICAgICB0ZXh0XjAuNSBmZWF0dXJlc14xLjAgbmFtZV4xLjIgc2t1XjEuNSBpZF4xMC4wIG1hbnVeMS4xIGNhdF4xLjQKKyAgICAgIDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJxLmFsdCI+KjoqPC9zdHI+CisgICAgICA8c3RyIG5hbWU9InJvd3MiPjEwPC9zdHI+CisgICAgICA8c3RyIG5hbWU9ImZsIj4qLHNjb3JlPC9zdHI+CisgICAgPC9sc3Q+CisgICAgPGFyciBuYW1lPSJsYXN0LWNvbXBvbmVudHMiPgorICAgICAgPHN0cj5jbHVzdGVyaW5nPC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKyAgPCEtLSBUZXJtcyBDb21wb25lbnQKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9UZXJtc0NvbXBvbmVudAorCisgICAgICAgQSBjb21wb25lbnQgdG8gcmV0dXJuIHRlcm1zIGFuZCBkb2N1bWVudCBmcmVxdWVuY3kgb2YgdGhvc2UKKyAgICAgICB0ZXJtcworICAgIC0tPgorICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9InRlcm1zIiBjbGFzcz0ic29sci5UZXJtc0NvbXBvbmVudCIvPgorCisgIDwhLS0gQSByZXF1ZXN0IGhhbmRsZXIgZm9yIGRlbW9uc3RyYXRpbmcgdGhlIHRlcm1zIGNvbXBvbmVudCAtLT4KKyAgPHJlcXVlc3RIYW5kbGVyIG5hbWU9Ii90ZXJtcyIgY2xhc3M9InNvbHIuU2VhcmNoSGFuZGxlciIgc3RhcnR1cD0ibGF6eSI+CisgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICA8Ym9vbCBuYW1lPSJ0ZXJtcyI+dHJ1ZTwvYm9vbD4KKyAgICAgIDxib29sIG5hbWU9ImRpc3RyaWIiPmZhbHNlPC9ib29sPgorICAgIDwvbHN0PgorICAgIDxhcnIgbmFtZT0iY29tcG9uZW50cyI+CisgICAgICA8c3RyPnRlcm1zPC9zdHI+CisgICAgPC9hcnI+CisgIDwvcmVxdWVzdEhhbmRsZXI+CisKKworICA8IS0tIFF1ZXJ5IEVsZXZhdGlvbiBDb21wb25lbnQKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9RdWVyeUVsZXZhdGlvbkNvbXBvbmVudAorCisgICAgICAgYSBzZWFyY2ggY29tcG9uZW50IHRoYXQgZW5hYmxlcyB5b3UgdG8gY29uZmlndXJlIHRoZSB0b3AKKyAgICAgICByZXN1bHRzIGZvciBhIGdpdmVuIHF1ZXJ5IHJlZ2FyZGxlc3Mgb2YgdGhlIG5vcm1hbCBsdWNlbmUKKyAgICAgICBzY29yaW5nLgorICAgIC0tPgorICA8c2VhcmNoQ29tcG9uZW50IG5hbWU9ImVsZXZhdG9yIiBjbGFzcz0ic29sci5RdWVyeUVsZXZhdGlvbkNvbXBvbmVudCIgPgorICAgIDwhLS0gcGljayBhIGZpZWxkVHlwZSB0byBhbmFseXplIHF1ZXJpZXMgLS0+CisgICAgPHN0ciBuYW1lPSJxdWVyeUZpZWxkVHlwZSI+c3RyaW5nPC9zdHI+CisgICAgPHN0ciBuYW1lPSJjb25maWctZmlsZSI+ZWxldmF0ZS54bWw8L3N0cj4KKyAgPC9zZWFyY2hDb21wb25lbnQ+CisKKyAgPCEtLSBBIHJlcXVlc3QgaGFuZGxlciBmb3IgZGVtb25zdHJhdGluZyB0aGUgZWxldmF0b3IgY29tcG9uZW50IC0tPgorICA8cmVxdWVzdEhhbmRsZXIgbmFtZT0iL2VsZXZhdGUiIGNsYXNzPSJzb2xyLlNlYXJjaEhhbmRsZXIiIHN0YXJ0dXA9ImxhenkiPgorICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgPHN0ciBuYW1lPSJlY2hvUGFyYW1zIj5leHBsaWNpdDwvc3RyPgorICAgICAgPHN0ciBuYW1lPSJkZiI+dGV4dDwvc3RyPgorICAgIDwvbHN0PgorICAgIDxhcnIgbmFtZT0ibGFzdC1jb21wb25lbnRzIj4KKyAgICAgIDxzdHI+ZWxldmF0b3I8L3N0cj4KKyAgICA8L2Fycj4KKyAgPC9yZXF1ZXN0SGFuZGxlcj4KKworICA8IS0tIEhpZ2hsaWdodGluZyBDb21wb25lbnQKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9IaWdobGlnaHRpbmdQYXJhbWV0ZXJzCisgICAgLS0+CisgIDxzZWFyY2hDb21wb25lbnQgY2xhc3M9InNvbHIuSGlnaGxpZ2h0Q29tcG9uZW50IiBuYW1lPSJoaWdobGlnaHQiPgorICAgIDxoaWdobGlnaHRpbmc+CisgICAgICA8IS0tIENvbmZpZ3VyZSB0aGUgc3RhbmRhcmQgZnJhZ21lbnRlciAtLT4KKyAgICAgIDwhLS0gVGhpcyBjb3VsZCBtb3N0IGxpa2VseSBiZSBjb21tZW50ZWQgb3V0IGluIHRoZSAiZGVmYXVsdCIgY2FzZSAtLT4KKyAgICAgIDxmcmFnbWVudGVyIG5hbWU9ImdhcCIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCisgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuR2FwRnJhZ21lbnRlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDxpbnQgbmFtZT0iaGwuZnJhZ3NpemUiPjEwMDwvaW50PgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvZnJhZ21lbnRlcj4KKworICAgICAgPCEtLSBBIHJlZ3VsYXItZXhwcmVzc2lvbi1iYXNlZCBmcmFnbWVudGVyIAorICAgICAgICAgICAoZm9yIHNlbnRlbmNlIGV4dHJhY3Rpb24pIAorICAgICAgICAtLT4KKyAgICAgIDxmcmFnbWVudGVyIG5hbWU9InJlZ2V4IgorICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlJlZ2V4RnJhZ21lbnRlciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDwhLS0gc2xpZ2h0bHkgc21hbGxlciBmcmFnc2l6ZXMgd29yayBiZXR0ZXIgYmVjYXVzZSBvZiBzbG9wIC0tPgorICAgICAgICAgIDxpbnQgbmFtZT0iaGwuZnJhZ3NpemUiPjcwPC9pbnQ+CisgICAgICAgICAgPCEtLSBhbGxvdyA1MCUgc2xvcCBvbiBmcmFnbWVudCBzaXplcyAtLT4KKyAgICAgICAgICA8ZmxvYXQgbmFtZT0iaGwucmVnZXguc2xvcCI+MC41PC9mbG9hdD4KKyAgICAgICAgICA8IS0tIGEgYmFzaWMgc2VudGVuY2UgcGF0dGVybiAtLT4KKyAgICAgICAgICA8c3RyIG5hbWU9ImhsLnJlZ2V4LnBhdHRlcm4iPlstXHcgLC9cblwmcXVvdDsmYXBvcztdezIwLDIwMH08L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICA8L2ZyYWdtZW50ZXI+CisKKyAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBzdGFuZGFyZCBmb3JtYXR0ZXIgLS0+CisgICAgICA8Zm9ybWF0dGVyIG5hbWU9Imh0bWwiCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCisgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5IdG1sRm9ybWF0dGVyIj4KKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5zaW1wbGUucHJlIj48IVtDREFUQVs8ZW0+XV0+PC9zdHI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5zaW1wbGUucG9zdCI+PCFbQ0RBVEFbPC9lbT5dXT48L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICA8L2Zvcm1hdHRlcj4KKworICAgICAgPCEtLSBDb25maWd1cmUgdGhlIHN0YW5kYXJkIGVuY29kZXIgLS0+CisgICAgICA8ZW5jb2RlciBuYW1lPSJodG1sIgorICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0Lkh0bWxFbmNvZGVyIiAvPgorCisgICAgICA8IS0tIENvbmZpZ3VyZSB0aGUgc3RhbmRhcmQgZnJhZ0xpc3RCdWlsZGVyIC0tPgorICAgICAgPGZyYWdMaXN0QnVpbGRlciBuYW1lPSJzaW1wbGUiCisgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLmhpZ2hsaWdodC5TaW1wbGVGcmFnTGlzdEJ1aWxkZXIiLz4KKworICAgICAgPCEtLSBDb25maWd1cmUgdGhlIHNpbmdsZSBmcmFnTGlzdEJ1aWxkZXIgLS0+CisgICAgICA8ZnJhZ0xpc3RCdWlsZGVyIG5hbWU9InNpbmdsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlNpbmdsZUZyYWdMaXN0QnVpbGRlciIvPgorCisgICAgICA8IS0tIENvbmZpZ3VyZSB0aGUgd2VpZ2h0ZWQgZnJhZ0xpc3RCdWlsZGVyIC0tPgorICAgICAgPGZyYWdMaXN0QnVpbGRlciBuYW1lPSJ3ZWlnaHRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LldlaWdodGVkRnJhZ0xpc3RCdWlsZGVyIi8+CisKKyAgICAgIDwhLS0gZGVmYXVsdCB0YWcgRnJhZ21lbnRzQnVpbGRlciAtLT4KKyAgICAgIDxmcmFnbWVudHNCdWlsZGVyIG5hbWU9ImRlZmF1bHQiCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlNjb3JlT3JkZXJGcmFnbWVudHNCdWlsZGVyIj4KKyAgICAgICAgPCEtLSAKKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5tdWx0aVZhbHVlZFNlcGFyYXRvckNoYXIiPi88L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICAgIC0tPgorICAgICAgPC9mcmFnbWVudHNCdWlsZGVyPgorCisgICAgICA8IS0tIG11bHRpLWNvbG9yZWQgdGFnIEZyYWdtZW50c0J1aWxkZXIgLS0+CisgICAgICA8ZnJhZ21lbnRzQnVpbGRlciBuYW1lPSJjb2xvcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNvbHIuaGlnaGxpZ2h0LlNjb3JlT3JkZXJGcmFnbWVudHNCdWlsZGVyIj4KKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC50YWcucHJlIj48IVtDREFUQVsKKyAgICAgICAgICAgICAgIDxiIHN0eWxlPSJiYWNrZ3JvdW5kOnllbGxvdyI+LDxiIHN0eWxlPSJiYWNrZ3JvdW5kOmxhd2dyZWVuIj4sCisgICAgICAgICAgICAgICA8YiBzdHlsZT0iYmFja2dyb3VuZDphcXVhbWFyaW5lIj4sPGIgc3R5bGU9ImJhY2tncm91bmQ6bWFnZW50YSI+LAorICAgICAgICAgICAgICAgPGIgc3R5bGU9ImJhY2tncm91bmQ6cGFsZWdyZWVuIj4sPGIgc3R5bGU9ImJhY2tncm91bmQ6Y29yYWwiPiwKKyAgICAgICAgICAgICAgIDxiIHN0eWxlPSJiYWNrZ3JvdW5kOndoZWF0Ij4sPGIgc3R5bGU9ImJhY2tncm91bmQ6a2hha2kiPiwKKyAgICAgICAgICAgICAgIDxiIHN0eWxlPSJiYWNrZ3JvdW5kOmxpbWUiPiw8YiBzdHlsZT0iYmFja2dyb3VuZDpkZWVwc2t5Ymx1ZSI+XV0+PC9zdHI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC50YWcucG9zdCI+PCFbQ0RBVEFbPC9iPl1dPjwvc3RyPgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvZnJhZ21lbnRzQnVpbGRlcj4KKworICAgICAgPGJvdW5kYXJ5U2Nhbm5lciBuYW1lPSJkZWZhdWx0IgorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuU2ltcGxlQm91bmRhcnlTY2FubmVyIj4KKyAgICAgICAgPGxzdCBuYW1lPSJkZWZhdWx0cyI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy5tYXhTY2FuIj4xMDwvc3RyPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwuYnMuY2hhcnMiPi4sIT8gJiM5OyYjMTA7JiMxMzs8L3N0cj4KKyAgICAgICAgPC9sc3Q+CisgICAgICA8L2JvdW5kYXJ5U2Nhbm5lcj4KKworICAgICAgPGJvdW5kYXJ5U2Nhbm5lciBuYW1lPSJicmVha0l0ZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic29sci5oaWdobGlnaHQuQnJlYWtJdGVyYXRvckJvdW5kYXJ5U2Nhbm5lciI+CisgICAgICAgIDxsc3QgbmFtZT0iZGVmYXVsdHMiPgorICAgICAgICAgIDwhLS0gdHlwZSBzaG91bGQgYmUgb25lIG9mIENIQVJBQ1RFUiwgV09SRChkZWZhdWx0KSwgTElORSBhbmQgU0VOVEVOQ0UgLS0+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy50eXBlIj5XT1JEPC9zdHI+CisgICAgICAgICAgPCEtLSBsYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBMb2NhbGUgb2JqZWN0LiAgLS0+CisgICAgICAgICAgPCEtLSBBbmQgdGhlIExvY2FsZSBvYmplY3Qgd2lsbCBiZSB1c2VkIHdoZW4gZ2V0dGluZyBpbnN0YW5jZSBvZiBCcmVha0l0ZXJhdG9yIC0tPgorICAgICAgICAgIDxzdHIgbmFtZT0iaGwuYnMubGFuZ3VhZ2UiPmVuPC9zdHI+CisgICAgICAgICAgPHN0ciBuYW1lPSJobC5icy5jb3VudHJ5Ij5VUzwvc3RyPgorICAgICAgICA8L2xzdD4KKyAgICAgIDwvYm91bmRhcnlTY2FubmVyPgorICAgIDwvaGlnaGxpZ2h0aW5nPgorICA8L3NlYXJjaENvbXBvbmVudD4KKworICA8IS0tIFVwZGF0ZSBQcm9jZXNzb3JzCisKKyAgICAgICBDaGFpbnMgb2YgVXBkYXRlIFByb2Nlc3NvciBGYWN0b3JpZXMgZm9yIGRlYWxpbmcgd2l0aCBVcGRhdGUKKyAgICAgICBSZXF1ZXN0cyBjYW4gYmUgZGVjbGFyZWQsIGFuZCB0aGVuIHVzZWQgYnkgbmFtZSBpbiBVcGRhdGUKKyAgICAgICBSZXF1ZXN0IFByb2Nlc3NvcnMKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9VcGRhdGVSZXF1ZXN0UHJvY2Vzc29yCisKKyAgICAtLT4KKyAgCisgIDwhLS0gQWRkIHVua25vd24gZmllbGRzIHRvIHRoZSBzY2hlbWEgCisgIAorICAgICAgIEFuIGV4YW1wbGUgZmllbGQgdHlwZSBndWVzc2luZyB1cGRhdGUgcHJvY2Vzc29yIHRoYXQgd2lsbAorICAgICAgIGF0dGVtcHQgdG8gcGFyc2Ugc3RyaW5nLXR5cGVkIGZpZWxkIHZhbHVlcyBhcyBCb29sZWFucywgTG9uZ3MsCisgICAgICAgRG91Ymxlcywgb3IgRGF0ZXMsIGFuZCB0aGVuIGFkZCBzY2hlbWEgZmllbGRzIHdpdGggdGhlIGd1ZXNzZWQKKyAgICAgICBmaWVsZCB0eXBlcy4gIAorICAgICAgIAorICAgICAgIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgc2NoZW1hIGlzIGJvdGggbWFuYWdlZCBhbmQgbXV0YWJsZSwgYnkKKyAgICAgICBkZWNsYXJpbmcgc2NoZW1hRmFjdG9yeSBhcyBNYW5hZ2VkSW5kZXhTY2hlbWFGYWN0b3J5LCB3aXRoCisgICAgICAgbXV0YWJsZSBzcGVjaWZpZWQgYXMgdHJ1ZS4gCisgICAgICAgCisgICAgICAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9HdWVzc2luZ0ZpZWxkVHlwZXMKKyAgICAtLT4KKyAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJhZGQtdW5rbm93bi1maWVsZHMtdG8tdGhlLXNjaGVtYSI+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SZW1vdmVCbGFua0ZpZWxkVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIvPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuUGFyc2VCb29sZWFuRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZUxvbmdGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlBhcnNlRG91YmxlRmllbGRVcGRhdGVQcm9jZXNzb3JGYWN0b3J5Ii8+CisgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5QYXJzZURhdGVGaWVsZFVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgPGFyciBuYW1lPSJmb3JtYXQiPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NaPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLFNTU1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzLFNTUzwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQnVCdISDptbTpzc1o8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW06c3M8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkJ1QnSEg6bW1aPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCdUJ0hIOm1tPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzcy5TU1NaPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzcyxTU1NaPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzcy5TU1M8L3N0cj4KKyAgICAgICAgPHN0cj55eXl5LU1NLWRkIEhIOm1tOnNzLFNTUzwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQgSEg6bW06c3NaPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTpzczwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQgSEg6bW1aPC9zdHI+CisgICAgICAgIDxzdHI+eXl5eS1NTS1kZCBISDptbTwvc3RyPgorICAgICAgICA8c3RyPnl5eXktTU0tZGQ8L3N0cj4KKyAgICAgIDwvYXJyPgorICAgIDwvcHJvY2Vzc29yPgorICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuQWRkU2NoZW1hRmllbGRzVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICA8c3RyIG5hbWU9ImRlZmF1bHRGaWVsZFR5cGUiPnRleHRfZ2VuZXJhbDwvc3RyPgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkJvb2xlYW48L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPmJvb2xlYW5zPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEudXRpbC5EYXRlPC9zdHI+CisgICAgICAgIDxzdHIgbmFtZT0iZmllbGRUeXBlIj50ZGF0ZXM8L3N0cj4KKyAgICAgIDwvbHN0PgorICAgICAgPGxzdCBuYW1lPSJ0eXBlTWFwcGluZyI+CisgICAgICAgIDxzdHIgbmFtZT0idmFsdWVDbGFzcyI+amF2YS5sYW5nLkxvbmc8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJ2YWx1ZUNsYXNzIj5qYXZhLmxhbmcuSW50ZWdlcjwvc3RyPgorICAgICAgICA8c3RyIG5hbWU9ImZpZWxkVHlwZSI+dGxvbmdzPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICAgIDxsc3QgbmFtZT0idHlwZU1hcHBpbmciPgorICAgICAgICA8c3RyIG5hbWU9InZhbHVlQ2xhc3MiPmphdmEubGFuZy5OdW1iZXI8L3N0cj4KKyAgICAgICAgPHN0ciBuYW1lPSJmaWVsZFR5cGUiPnRkb3VibGVzPC9zdHI+CisgICAgICA8L2xzdD4KKyAgICA8L3Byb2Nlc3Nvcj4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLkxvZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiLz4KKyAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisKKyAgPCEtLSBEZWR1cGxpY2F0aW9uCisKKyAgICAgICBBbiBleGFtcGxlIGRlZHVwIHVwZGF0ZSBwcm9jZXNzb3IgdGhhdCBjcmVhdGVzIHRoZSAiaWQiIGZpZWxkCisgICAgICAgb24gdGhlIGZseSBiYXNlZCBvbiB0aGUgaGFzaCBjb2RlIG9mIHNvbWUgb3RoZXIgZmllbGRzLiAgVGhpcworICAgICAgIGV4YW1wbGUgaGFzIG92ZXJ3cml0ZUR1cGVzIHNldCB0byBmYWxzZSBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhlCisgICAgICAgaWQgZmllbGQgYXMgdGhlIHNpZ25hdHVyZUZpZWxkIGFuZCBTb2xyIHdpbGwgbWFpbnRhaW4KKyAgICAgICB1bmlxdWVuZXNzIGJhc2VkIG9uIHRoYXQgYW55d2F5LiAgCisgICAgICAgCisgICAgLS0+CisgIDwhLS0KKyAgICAgPHVwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbiBuYW1lPSJkZWR1cGUiPgorICAgICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIucHJvY2Vzc29yLlNpZ25hdHVyZVVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgICAgPGJvb2wgbmFtZT0iZW5hYmxlZCI+dHJ1ZTwvYm9vbD4KKyAgICAgICAgIDxzdHIgbmFtZT0ic2lnbmF0dXJlRmllbGQiPmlkPC9zdHI+CisgICAgICAgICA8Ym9vbCBuYW1lPSJvdmVyd3JpdGVEdXBlcyI+ZmFsc2U8L2Jvb2w+CisgICAgICAgICA8c3RyIG5hbWU9ImZpZWxkcyI+bmFtZSxmZWF0dXJlcyxjYXQ8L3N0cj4KKyAgICAgICAgIDxzdHIgbmFtZT0ic2lnbmF0dXJlQ2xhc3MiPnNvbHIucHJvY2Vzc29yLkxvb2t1cDNTaWduYXR1cmU8L3N0cj4KKyAgICAgICA8L3Byb2Nlc3Nvcj4KKyAgICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLkxvZ1VwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8+CisgICAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgorICAgICA8L3VwZGF0ZVJlcXVlc3RQcm9jZXNzb3JDaGFpbj4KKyAgICAtLT4KKworICA8IS0tIExhbmd1YWdlIGlkZW50aWZpY2F0aW9uCisKKyAgICAgICBUaGlzIGV4YW1wbGUgdXBkYXRlIGNoYWluIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBpbmNvbWluZworICAgICAgIGRvY3VtZW50cyB1c2luZyB0aGUgbGFuZ2lkIGNvbnRyaWIuIFRoZSBkZXRlY3RlZCBsYW5ndWFnZSBpcworICAgICAgIHdyaXR0ZW4gdG8gZmllbGQgbGFuZ3VhZ2Vfcy4gTm8gZmllbGQgbmFtZSBtYXBwaW5nIGlzIGRvbmUuCisgICAgICAgVGhlIGZpZWxkcyB1c2VkIGZvciBkZXRlY3Rpb24gYXJlIHRleHQsIHRpdGxlLCBzdWJqZWN0IGFuZCBkZXNjcmlwdGlvbiwKKyAgICAgICBtYWtpbmcgdGhpcyBleGFtcGxlIHN1aXRhYmxlIGZvciBkZXRlY3RpbmcgbGFuZ3VhZ2VzIGZvcm0gZnVsbC10ZXh0CisgICAgICAgcmljaCBkb2N1bWVudHMgaW5qZWN0ZWQgdmlhIEV4dHJhY3RpbmdSZXF1ZXN0SGFuZGxlci4KKyAgICAgICBTZWUgbW9yZSBhYm91dCBsYW5nSWQgYXQgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL0xhbmd1YWdlRGV0ZWN0aW9uCisgICAgLS0+CisgIDwhLS0KKyAgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0ibGFuZ2lkIj4KKyAgICAgPHByb2Nlc3NvciBjbGFzcz0ib3JnLmFwYWNoZS5zb2xyLnVwZGF0ZS5wcm9jZXNzb3IuVGlrYUxhbmd1YWdlSWRlbnRpZmllclVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiPgorICAgICAgIDxzdHIgbmFtZT0ibGFuZ2lkLmZsIj50ZXh0LHRpdGxlLHN1YmplY3QsZGVzY3JpcHRpb248L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImxhbmdpZC5sYW5nRmllbGQiPmxhbmd1YWdlX3M8L3N0cj4KKyAgICAgICA8c3RyIG5hbWU9ImxhbmdpZC5mYWxsYmFjayI+ZW48L3N0cj4KKyAgICAgPC9wcm9jZXNzb3I+CisgICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuTG9nVXBkYXRlUHJvY2Vzc29yRmFjdG9yeSIgLz4KKyAgICAgPHByb2Nlc3NvciBjbGFzcz0ic29sci5SdW5VcGRhdGVQcm9jZXNzb3JGYWN0b3J5IiAvPgorICAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisgIC0tPgorCisgIDwhLS0gU2NyaXB0IHVwZGF0ZSBwcm9jZXNzb3IKKworICAgIFRoaXMgZXhhbXBsZSBob29rcyBpbiBhbiB1cGRhdGUgcHJvY2Vzc29yIGltcGxlbWVudGVkIHVzaW5nIEphdmFTY3JpcHQuCisKKyAgICBTZWUgbW9yZSBhYm91dCB0aGUgc2NyaXB0IHVwZGF0ZSBwcm9jZXNzb3IgYXQgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NjcmlwdFVwZGF0ZVByb2Nlc3NvcgorICAtLT4KKyAgPCEtLQorICAgIDx1cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4gbmFtZT0ic2NyaXB0Ij4KKyAgICAgIDxwcm9jZXNzb3IgY2xhc3M9InNvbHIuU3RhdGVsZXNzU2NyaXB0VXBkYXRlUHJvY2Vzc29yRmFjdG9yeSI+CisgICAgICAgIDxzdHIgbmFtZT0ic2NyaXB0Ij51cGRhdGUtc2NyaXB0LmpzPC9zdHI+CisgICAgICAgIDxsc3QgbmFtZT0icGFyYW1zIj4KKyAgICAgICAgICA8c3RyIG5hbWU9ImNvbmZpZ19wYXJhbSI+ZXhhbXBsZSBjb25maWcgcGFyYW1ldGVyPC9zdHI+CisgICAgICAgIDwvbHN0PgorICAgICAgPC9wcm9jZXNzb3I+CisgICAgICA8cHJvY2Vzc29yIGNsYXNzPSJzb2xyLlJ1blVwZGF0ZVByb2Nlc3NvckZhY3RvcnkiIC8+CisgICAgPC91cGRhdGVSZXF1ZXN0UHJvY2Vzc29yQ2hhaW4+CisgIC0tPgorCisgIDwhLS0gUmVzcG9uc2UgV3JpdGVycworCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1F1ZXJ5UmVzcG9uc2VXcml0ZXIKKworICAgICAgIFJlcXVlc3QgcmVzcG9uc2VzIHdpbGwgYmUgd3JpdHRlbiB1c2luZyB0aGUgd3JpdGVyIHNwZWNpZmllZCBieQorICAgICAgIHRoZSAnd3QnIHJlcXVlc3QgcGFyYW1ldGVyIG1hdGNoaW5nIHRoZSBuYW1lIG9mIGEgcmVnaXN0ZXJlZAorICAgICAgIHdyaXRlci4KKworICAgICAgIFRoZSAiZGVmYXVsdCIgd3JpdGVyIGlzIHRoZSBkZWZhdWx0IGFuZCB3aWxsIGJlIHVzZWQgaWYgJ3d0JyBpcworICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCisgICAgLS0+CisgIDwhLS0gVGhlIGZvbGxvd2luZyByZXNwb25zZSB3cml0ZXJzIGFyZSBpbXBsaWNpdGx5IGNvbmZpZ3VyZWQgdW5sZXNzCisgICAgICAgb3ZlcnJpZGRlbi4uLgorICAgIC0tPgorICA8IS0tCisgICAgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InhtbCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzb2xyLlhNTFJlc3BvbnNlV3JpdGVyIiAvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJqc29uIiBjbGFzcz0ic29sci5KU09OUmVzcG9uc2VXcml0ZXIiLz4KKyAgICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0icHl0aG9uIiBjbGFzcz0ic29sci5QeXRob25SZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJydWJ5IiBjbGFzcz0ic29sci5SdWJ5UmVzcG9uc2VXcml0ZXIiLz4KKyAgICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0icGhwIiBjbGFzcz0ic29sci5QSFBSZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJwaHBzIiBjbGFzcz0ic29sci5QSFBTZXJpYWxpemVkUmVzcG9uc2VXcml0ZXIiLz4KKyAgICAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0iY3N2IiBjbGFzcz0ic29sci5DU1ZSZXNwb25zZVdyaXRlciIvPgorICAgICA8cXVlcnlSZXNwb25zZVdyaXRlciBuYW1lPSJzY2hlbWEueG1sIiBjbGFzcz0ic29sci5TY2hlbWFYbWxSZXNwb25zZVdyaXRlciIvPgorICAgIC0tPgorCisgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9Impzb24iIGNsYXNzPSJzb2xyLkpTT05SZXNwb25zZVdyaXRlciI+CisgICAgPCEtLSBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSB0dXRvcmlhbCwgSlNPTiByZXNwb25zZXMgYXJlIHdyaXR0ZW4gYXMKKyAgICAgcGxhaW4gdGV4dCBzbyB0aGF0IHRoZXkgYXJlIGVhc3kgdG8gcmVhZCBpbiAqYW55KiBicm93c2VyLgorICAgICBJZiB5b3UgZXhwZWN0IGEgTUlNRSB0eXBlIG9mICJhcHBsaWNhdGlvbi9qc29uIiBqdXN0IHJlbW92ZSB0aGlzIG92ZXJyaWRlLgorICAgIC0tPgorICAgIDxzdHIgbmFtZT0iY29udGVudC10eXBlIj50ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04PC9zdHI+CisgIDwvcXVlcnlSZXNwb25zZVdyaXRlcj4KKworICA8IS0tCisgICAgIEN1c3RvbSByZXNwb25zZSB3cml0ZXJzIGNhbiBiZSBkZWNsYXJlZCBhcyBuZWVkZWQuLi4KKyAgICAtLT4KKyAgPHF1ZXJ5UmVzcG9uc2VXcml0ZXIgbmFtZT0idmVsb2NpdHkiIGNsYXNzPSJzb2xyLlZlbG9jaXR5UmVzcG9uc2VXcml0ZXIiIHN0YXJ0dXA9ImxhenkiLz4KKworCisgIDwhLS0gWFNMVCByZXNwb25zZSB3cml0ZXIgdHJhbnNmb3JtcyB0aGUgWE1MIG91dHB1dCBieSBhbnkgeHNsdCBmaWxlIGZvdW5kCisgICAgICAgaW4gU29scidzIGNvbmYveHNsdCBkaXJlY3RvcnkuICBDaGFuZ2VzIHRvIHhzbHQgZmlsZXMgYXJlIGNoZWNrZWQgZm9yCisgICAgICAgZXZlcnkgeHNsdENhY2hlTGlmZXRpbWVTZWNvbmRzLiAgCisgICAgLS0+CisgIDxxdWVyeVJlc3BvbnNlV3JpdGVyIG5hbWU9InhzbHQiIGNsYXNzPSJzb2xyLlhTTFRSZXNwb25zZVdyaXRlciI+CisgICAgPGludCBuYW1lPSJ4c2x0Q2FjaGVMaWZldGltZVNlY29uZHMiPjU8L2ludD4KKyAgPC9xdWVyeVJlc3BvbnNlV3JpdGVyPgorCisgIDwhLS0gUXVlcnkgUGFyc2VycworCisgICAgICAgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1NvbHJRdWVyeVN5bnRheAorCisgICAgICAgTXVsdGlwbGUgUVBhcnNlclBsdWdpbnMgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgbmFtZSwgYW5kIHRoZW4KKyAgICAgICB1c2VkIGluIGVpdGhlciB0aGUgImRlZlR5cGUiIHBhcmFtIGZvciB0aGUgUXVlcnlDb21wb25lbnQgKHVzZWQKKyAgICAgICBieSBTZWFyY2hIYW5kbGVyKSBvciBpbiBMb2NhbFBhcmFtcworICAgIC0tPgorICA8IS0tIGV4YW1wbGUgb2YgcmVnaXN0ZXJpbmcgYSBxdWVyeSBwYXJzZXIgLS0+CisgIDwhLS0KKyAgICAgPHF1ZXJ5UGFyc2VyIG5hbWU9Im15cGFyc2VyIiBjbGFzcz0iY29tLm15Y29tcGFueS5NeVFQYXJzZXJQbHVnaW4iLz4KKyAgICAtLT4KKworICA8IS0tIEZ1bmN0aW9uIFBhcnNlcnMKKworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9GdW5jdGlvblF1ZXJ5CisKKyAgICAgICBNdWx0aXBsZSBWYWx1ZVNvdXJjZVBhcnNlcnMgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgbmFtZSwgYW5kIHRoZW4KKyAgICAgICB1c2VkIGFzIGZ1bmN0aW9uIG5hbWVzIHdoZW4gdXNpbmcgdGhlICJmdW5jIiBRUGFyc2VyLgorICAgIC0tPgorICA8IS0tIGV4YW1wbGUgb2YgcmVnaXN0ZXJpbmcgYSBjdXN0b20gZnVuY3Rpb24gcGFyc2VyICAtLT4KKyAgPCEtLQorICAgICA8dmFsdWVTb3VyY2VQYXJzZXIgbmFtZT0ibXlmdW5jIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb20ubXljb21wYW55Lk15VmFsdWVTb3VyY2VQYXJzZXIiIC8+CisgICAgLS0+CisKKworICA8IS0tIERvY3VtZW50IFRyYW5zZm9ybWVycworICAgICAgIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Eb2NUcmFuc2Zvcm1lcnMKKyAgICAtLT4KKyAgPCEtLQorICAgICBDb3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKyAgICAgPHRyYW5zZm9ybWVyIG5hbWU9ImRiIiBjbGFzcz0iY29tLm15Y29tcGFueS5Mb2FkRnJvbURhdGFiYXNlVHJhbnNmb3JtZXIiID4KKyAgICAgICA8aW50IG5hbWU9ImNvbm5lY3Rpb24iPmpkYmM6Ly8uLi4uPC9pbnQ+CisgICAgIDwvdHJhbnNmb3JtZXI+CisgICAgIAorICAgICBUbyBhZGQgYSBjb25zdGFudCB2YWx1ZSB0byBhbGwgZG9jcywgdXNlOgorICAgICA8dHJhbnNmb3JtZXIgbmFtZT0ibXl0cmFuczIiIGNsYXNzPSJvcmcuYXBhY2hlLnNvbHIucmVzcG9uc2UudHJhbnNmb3JtLlZhbHVlQXVnbWVudGVyRmFjdG9yeSIgPgorICAgICAgIDxpbnQgbmFtZT0idmFsdWUiPjU8L2ludD4KKyAgICAgPC90cmFuc2Zvcm1lcj4KKyAgICAgCisgICAgIElmIHlvdSB3YW50IHRoZSB1c2VyIHRvIHN0aWxsIGJlIGFibGUgdG8gY2hhbmdlIGl0IHdpdGggX3ZhbHVlOnNvbWV0aGluZ18gdXNlIHRoaXM6CisgICAgIDx0cmFuc2Zvcm1lciBuYW1lPSJteXRyYW5zMyIgY2xhc3M9Im9yZy5hcGFjaGUuc29sci5yZXNwb25zZS50cmFuc2Zvcm0uVmFsdWVBdWdtZW50ZXJGYWN0b3J5IiA+CisgICAgICAgPGRvdWJsZSBuYW1lPSJkZWZhdWx0VmFsdWUiPjU8L2RvdWJsZT4KKyAgICAgPC90cmFuc2Zvcm1lcj4KKworICAgICAgSWYgeW91IGFyZSB1c2luZyB0aGUgUXVlcnlFbGV2YXRpb25Db21wb25lbnQsIHlvdSBtYXkgd2lzaCB0byBtYXJrIGRvY3VtZW50cyB0aGF0IGdldCBib29zdGVkLiAgVGhlCisgICAgICBFZGl0b3JpYWxNYXJrZXJGYWN0b3J5IHdpbGwgZG8gZXhhY3RseSB0aGF0OgorICAgICA8dHJhbnNmb3JtZXIgbmFtZT0icWVjQm9vc3RlciIgY2xhc3M9Im9yZy5hcGFjaGUuc29sci5yZXNwb25zZS50cmFuc2Zvcm0uRWRpdG9yaWFsTWFya2VyRmFjdG9yeSIgLz4KKyAgICAtLT4KKworCisgIDwhLS0gTGVnYWN5IGNvbmZpZyBmb3IgdGhlIGFkbWluIGludGVyZmFjZSAtLT4KKyAgPGFkbWluPgorICAgIDxkZWZhdWx0UXVlcnk+KjoqPC9kZWZhdWx0UXVlcnk+CisgIDwvYWRtaW4+CisKKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc3RvcHdvcmRzLnR4dCBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3N0b3B3b3Jkcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxZTgzZQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvZXhhbXBsZS9leGFtcGxlLXNjaGVtYWxlc3Mvc29sci9jb2xsZWN0aW9uMS9jb25mL3N0b3B3b3Jkcy50eHQKQEAgLTAsMCArMSwxNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc3lub255bXMudHh0IGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc3lub255bXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzIxMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zeW5vbnltcy50eHQKQEAgLTAsMCArMSwyOSBAQAorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3NvbWUgdGVzdCBzeW5vbnltIG1hcHBpbmdzIHVubGlrZWx5IHRvIGFwcGVhciBpbiByZWFsIGlucHV0IHRleHQKK2FhYWZvbyA9PiBhYWFiYXIKK2JiYmZvbyA9PiBiYmJmb28gYmJiYmFyCitjY2Nmb28gPT4gY2NjYmFyIGNjY2JhegorZm9vYWFhLGJhcmFhYSxiYXphYWEKKworIyBTb21lIHN5bm9ueW0gZ3JvdXBzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZQorR0IsZ2liLGdpZ2FieXRlLGdpZ2FieXRlcworTUIsbWliLG1lZ2FieXRlLG1lZ2FieXRlcworVGVsZXZpc2lvbiwgVGVsZXZpc2lvbnMsIFRWLCBUVnMKKyNub3RpY2Ugd2UgdXNlICJnaWIiIGluc3RlYWQgb2YgIkdpQiIgc28gYW55IFdvcmREZWxpbWl0ZXJGaWx0ZXIgY29taW5nCisjYWZ0ZXIgdXMgd29uJ3Qgc3BsaXQgaXQgaW50byB0d28gd29yZHMuCisKKyMgU3lub255bSBtYXBwaW5ncyBjYW4gYmUgdXNlZCBmb3Igc3BlbGxpbmcgY29ycmVjdGlvbiB0b28KK3BpeGltYSA9PiBwaXhtYQorCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvZXhhbXBsZS1zY2hlbWFsZXNzL3NvbHIvY29sbGVjdGlvbjEvY29yZS5wcm9wZXJ0aWVzIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvcmUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBjZjdkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9leGFtcGxlL2V4YW1wbGUtc2NoZW1hbGVzcy9zb2xyL2NvbGxlY3Rpb24xL2NvcmUucHJvcGVydGllcwpAQCAtMCwwICsxIEBACituYW1lPWNvbGxlY3Rpb24xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvc29sci9leGFtcGxlL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmluZGV4IDkzZGM2MmEuLmYzM2ZhNzEgMTAwNjQ0Ci0tLSBhL3NvbHIvZXhhbXBsZS9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgYi9zb2xyL2V4YW1wbGUvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKQEAgLTEsNCArMSw1IEBACiAjICBMb2dnaW5nIGxldmVsCitzb2xyLmxvZz1sb2dzLwogbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBmaWxlLCBDT05TT0xFCiAKIGxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKQEAgLTEyLDggKzEzLDEyIEBACiBsb2c0ai5hcHBlbmRlci5maWxlLk1heEJhY2t1cEluZGV4PTkKIAogIy0gRmlsZSB0byBsb2cgdG8gYW5kIGxvZyBmb3JtYXQKLWxvZzRqLmFwcGVuZGVyLmZpbGUuRmlsZT1sb2dzL3NvbHIubG9nCitsb2c0ai5hcHBlbmRlci5maWxlLkZpbGU9JHtzb2xyLmxvZ30vc29sci5sb2cKIGxvZzRqLmFwcGVuZGVyLmZpbGUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAogbG9nNGouYXBwZW5kZXIuZmlsZS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JS01cCAtICVke3l5eXktTU0tZGQgSEg6bW06c3MuU1NTfTsgJUM7ICVtXG4KIAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuem9va2VlcGVyPVdBUk4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS56b29rZWVwZXI9V0FSTgorbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuaGFkb29wPVdBUk4KKworIyBzZXQgdG8gSU5GTyB0byBlbmFibGUgaW5mb3N0cmVhbSBsb2cgbWVzc2FnZXMKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnNvbHIudXBkYXRlLkxvZ2dpbmdJbmZvU3RyZWFtPU9GRgpkaWZmIC0tZ2l0IGEvc29sci9leGFtcGxlL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEueG1sIGIvc29sci9leGFtcGxlL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zY2hlbWEueG1sCmluZGV4IDZmMjZmMmMuLjljZGQyOTcgMTAwNzU1Ci0tLSBhL3NvbHIvZXhhbXBsZS9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLnhtbAorKysgYi9zb2xyL2V4YW1wbGUvc29sci9jb2xsZWN0aW9uMS9jb25mL3NjaGVtYS54bWwKQEAgLTEwMzEsOCArMTAzMSw5IEBACiAgICAgICAgIDxmaWx0ZXIgY2xhc3M9InNvbHIuTG93ZXJDYXNlRmlsdGVyRmFjdG9yeSIvPgogICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlN0b3BGaWx0ZXJGYWN0b3J5IiBpZ25vcmVDYXNlPSJ0cnVlIiB3b3Jkcz0ibGFuZy9zdG9wd29yZHNfbm8udHh0IiBmb3JtYXQ9InNub3diYWxsIiAvPgogICAgICAgICA8ZmlsdGVyIGNsYXNzPSJzb2xyLlNub3diYWxsUG9ydGVyRmlsdGVyRmFjdG9yeSIgbGFuZ3VhZ2U9Ik5vcndlZ2lhbiIvPgotICAgICAgICA8IS0tIGxlc3MgYWdncmVzc2l2ZTogPGZpbHRlciBjbGFzcz0ic29sci5Ob3J3ZWdpYW5MaWdodFN0ZW1GaWx0ZXJGYWN0b3J5Ii8+IC0tPgotICAgICAgICA8IS0tIHNpbmd1bGFyL3BsdXJhbDogPGZpbHRlciBjbGFzcz0ic29sci5Ob3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiLz4gLS0+CisgICAgICAgIDwhLS0gbGVzcyBhZ2dyZXNzaXZlOiA8ZmlsdGVyIGNsYXNzPSJzb2xyLk5vcndlZ2lhbkxpZ2h0U3RlbUZpbHRlckZhY3RvcnkiIHZhcmlhbnQ9Im5iIi8+IC0tPgorICAgICAgICA8IS0tIHNpbmd1bGFyL3BsdXJhbDogPGZpbHRlciBjbGFzcz0ic29sci5Ob3J3ZWdpYW5NaW5pbWFsU3RlbUZpbHRlckZhY3RvcnkiIHZhcmlhbnQ9Im5iIi8+IC0tPgorICAgICAgICA8IS0tIFRoZSAibGlnaHQiIGFuZCAibWluaW1hbCIgc3RlbW1lcnMgc3VwcG9ydCB2YXJpYW50czogbmI9Qm9rbcOlbCwgbm49Tnlub3Jzaywgbm89Qm90aCAtLT4KICAgICAgIDwvYW5hbHl6ZXI+CiAgICAgPC9maWVsZFR5cGU+CiAgICAgCmRpZmYgLS1naXQgYS9zb2xyL2V4YW1wbGUvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sIGIvc29sci9leGFtcGxlL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbAppbmRleCBjNDAzZWJlLi4xZmMzZGM0IDEwMDc1NQotLS0gYS9zb2xyL2V4YW1wbGUvc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCisrKyBiL3NvbHIvZXhhbXBsZS9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwKQEAgLTY2LDYgKzY2LDkgQEAKICAgICAgICBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeSB3aGljaCBjb21wbGV0ZWx5IG1hdGNoIHRoZSByZWdleAogICAgICAgIChhbmNob3JlZCBvbiBib3RoIGVuZHMpIHdpbGwgYmUgaW5jbHVkZWQuCiAKKyAgICAgICBJZiBhICdkaXInIG9wdGlvbiAod2l0aCBvciB3aXRob3V0IGEgcmVnZXgpIGlzIHVzZWQgYW5kIG5vdGhpbmcKKyAgICAgICBpcyBmb3VuZCB0aGF0IG1hdGNoZXMsIGEgd2FybmluZyB3aWxsIGJlIGxvZ2dlZC4KKwogICAgICAgIFRoZSBleGFtcGxlcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBsb2FkIHNvbWUgc29sci1jb250cmlicyBhbG9uZyAKICAgICAgICB3aXRoIHRoZWlyIGV4dGVybmFsIGRlcGVuZGVuY2llcy4KICAgICAtLT4KQEAgLTgxLDExICs4NCw2IEBACiAgIDxsaWIgZGlyPSIuLi8uLi8uLi9jb250cmliL3ZlbG9jaXR5L2xpYiIgcmVnZXg9Ii4qXC5qYXIiIC8+CiAgIDxsaWIgZGlyPSIuLi8uLi8uLi9kaXN0LyIgcmVnZXg9InNvbHItdmVsb2NpdHktXGQuKlwuamFyIiAvPgogCi0gIDwhLS0gSWYgYSAnZGlyJyBvcHRpb24gKHdpdGggb3Igd2l0aG91dCBhIHJlZ2V4KSBpcyB1c2VkIGFuZCBub3RoaW5nCi0gICAgICAgaXMgZm91bmQgdGhhdCBtYXRjaGVzLCBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuCi0gICAgLS0+Ci0gIDxsaWIgZGlyPSIvbm9uL2V4aXN0ZW50L2Rpci95aWVsZHMvd2FybmluZyIgLz4gCi0KICAgPCEtLSBhbiBleGFjdCAncGF0aCcgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhICdkaXInIHRvIHNwZWNpZnkgYSAKICAgICAgICBzcGVjaWZpYyBqYXIgZmlsZS4gIFRoaXMgd2lsbCBjYXVzZSBhIHNlcmlvdXMgZXJyb3IgdG8gYmUgbG9nZ2VkIAogICAgICAgIGlmIGl0IGNhbid0IGJlIGxvYWRlZC4KQEAgLTE4Niw3ICsxODQsOCBAQAogICAgICAgICAgbWF4QnVmZmVyZWREb2NzIHNldHMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBidWZmZXJlZAogICAgICAgICAgYmVmb3JlIGZsdXNoaW5nLgogICAgICAgICAgSWYgYm90aCByYW1CdWZmZXJTaXplTUIgYW5kIG1heEJ1ZmZlcmVkRG9jcyBpcyBzZXQsIHRoZW4KLSAgICAgICAgIEx1Y2VuZSB3aWxsIGZsdXNoIGJhc2VkIG9uIHdoaWNoZXZlciBsaW1pdCBpcyBoaXQgZmlyc3QuICAtLT4KKyAgICAgICAgIEx1Y2VuZSB3aWxsIGZsdXNoIGJhc2VkIG9uIHdoaWNoZXZlciBsaW1pdCBpcyBoaXQgZmlyc3QuCisgICAgICAgICBUaGUgZGVmYXVsdCBpcyAxMDAgTUIuICAtLT4KICAgICA8IS0tIDxyYW1CdWZmZXJTaXplTUI+MTAwPC9yYW1CdWZmZXJTaXplTUI+IC0tPgogICAgIDwhLS0gPG1heEJ1ZmZlcmVkRG9jcz4xMDAwPC9tYXhCdWZmZXJlZERvY3M+IC0tPgogCkBAIC0zMDYsMTAgKzMwNSwxMSBAQAogICAgICAgICAgVG8gYWlkIGluIGFkdmFuY2VkIGRlYnVnZ2luZywgTHVjZW5lIHByb3ZpZGVzIGFuICJJbmZvU3RyZWFtIgogICAgICAgICAgb2YgZGV0YWlsZWQgaW5mb3JtYXRpb24gd2hlbiBpbmRleGluZy4KIAotICAgICAgICAgU2V0dGluZyBUaGUgdmFsdWUgdG8gdHJ1ZSB3aWxsIGluc3RydWN0IHRoZSB1bmRlcmx5aW5nIEx1Y2VuZQotICAgICAgICAgSW5kZXhXcml0ZXIgdG8gd3JpdGUgaXRzIGRlYnVnZ2luZyBpbmZvIHRoZSBzcGVjaWZpZWQgZmlsZQorICAgICAgICAgU2V0dGluZyB0aGUgdmFsdWUgdG8gdHJ1ZSB3aWxsIGluc3RydWN0IHRoZSB1bmRlcmx5aW5nIEx1Y2VuZQorICAgICAgICAgSW5kZXhXcml0ZXIgdG8gd3JpdGUgaXRzIGluZm8gc3RyZWFtIHRvIHNvbHIncyBsb2cuIEJ5IGRlZmF1bHQsCisgICAgICAgICB0aGlzIGlzIGVuYWJsZWQgaGVyZSwgYW5kIGNvbnRyb2xsZWQgdGhyb3VnaCBsb2c0ai5wcm9wZXJ0aWVzLgogICAgICAgLS0+Ci0gICAgIDwhLS0gPGluZm9TdHJlYW0gZmlsZT0iSU5GT1NUUkVBTS50eHQiPmZhbHNlPC9pbmZvU3RyZWFtPiAtLT4gCisgICAgIDxpbmZvU3RyZWFtPnRydWU8L2luZm9TdHJlYW0+CiAgIDwvaW5kZXhDb25maWc+CiAKIApAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICAgICBoYXZlIHNvbWUgc29ydCBvZiBoYXJkIGF1dG9Db21taXQgdG8gbGltaXQgdGhlIGxvZyBzaXplLgogICAgICAgLS0+CiAgICAgIDxhdXRvQ29tbWl0PiAKLSAgICAgICA8bWF4VGltZT4xNTAwMDwvbWF4VGltZT4gCisgICAgICAgPG1heFRpbWU+JHtzb2xyLmF1dG9Db21taXQubWF4VGltZToxNTAwMH08L21heFRpbWU+IAogICAgICAgIDxvcGVuU2VhcmNoZXI+ZmFsc2U8L29wZW5TZWFyY2hlcj4gCiAgICAgIDwvYXV0b0NvbW1pdD4KIApAQCAtMzc1LDExICszNzUsMTAgQEAKICAgICAgICAgIGJ1dCBkb2VzIG5vdCBlbnN1cmUgdGhhdCBkYXRhIGlzIHN5bmNlZCB0byBkaXNrLiAgVGhpcyBpcwogICAgICAgICAgZmFzdGVyIGFuZCBtb3JlIG5lYXItcmVhbHRpbWUgZnJpZW5kbHkgdGhhbiBhIGhhcmQgY29tbWl0LgogICAgICAgLS0+Ci0gICAgIDwhLS0KLSAgICAgICA8YXV0b1NvZnRDb21taXQ+IAotICAgICAgICAgPG1heFRpbWU+MTAwMDwvbWF4VGltZT4gCi0gICAgICAgPC9hdXRvU29mdENvbW1pdD4KLSAgICAgIC0tPgorCisgICAgIDxhdXRvU29mdENvbW1pdD4gCisgICAgICAgPG1heFRpbWU+JHtzb2xyLmF1dG9Tb2Z0Q29tbWl0Lm1heFRpbWU6LTF9PC9tYXhUaW1lPiAKKyAgICAgPC9hdXRvU29mdENvbW1pdD4KIAogICAgIDwhLS0gVXBkYXRlIFJlbGF0ZWQgRXZlbnQgTGlzdGVuZXJzCiAgICAgICAgICAKZGlmZiAtLWdpdCBhL3NvbHIvZXhhbXBsZS9zb2xyL3NvbHIueG1sIGIvc29sci9leGFtcGxlL3NvbHIvc29sci54bWwKaW5kZXggZDAyODAwYi4uN2FlNzI0NCAxMDA2NDQKLS0tIGEvc29sci9leGFtcGxlL3NvbHIvc29sci54bWwKKysrIGIvc29sci9leGFtcGxlL3NvbHIvc29sci54bWwKQEAgLTMzLDYgKzMzLDcgQEAKICAgICA8aW50IG5hbWU9Imhvc3RQb3J0Ij4ke2pldHR5LnBvcnQ6ODk4M308L2ludD4KICAgICA8c3RyIG5hbWU9Imhvc3RDb250ZXh0Ij4ke2hvc3RDb250ZXh0OnNvbHJ9PC9zdHI+CiAgICAgPGludCBuYW1lPSJ6a0NsaWVudFRpbWVvdXQiPiR7emtDbGllbnRUaW1lb3V0OjE1MDAwfTwvaW50PgorICAgIDxib29sIG5hbWU9ImdlbmVyaWNDb3JlTm9kZU5hbWVzIj4ke2dlbmVyaWNDb3JlTm9kZU5hbWVzOnRydWV9PC9ib29sPgogICA8L3NvbHJjbG91ZD4KIAogICA8c2hhcmRIYW5kbGVyRmFjdG9yeSBuYW1lPSJzaGFyZEhhbmRsZXJGYWN0b3J5IgpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb21tb25zLWNvbmZpZ3VyYXRpb24tMS42Lmphci5zaGExIGIvc29sci9saWNlbnNlcy9jb21tb25zLWNvbmZpZ3VyYXRpb24tMS42Lmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGFkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2NvbW1vbnMtY29uZmlndXJhdGlvbi0xLjYuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorMzJjYWRkZTIzOTU1ZDc2ODFiMGQ5NGEyNzE1ODQ2ZDIwYjQyNTIzNQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb21tb25zLWNvbmZpZ3VyYXRpb24tTElDRU5TRS1BU0wudHh0IGIvc29sci9saWNlbnNlcy9jb21tb25zLWNvbmZpZ3VyYXRpb24tTElDRU5TRS1BU0wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2NvbW1vbnMtY29uZmlndXJhdGlvbi1MSUNFTlNFLUFTTC50eHQKQEAgLTAsMCArMSw0MDMgQEAKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisKKworICAgMS4gRGVmaW5pdGlvbnMuCisKKworCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKworICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKworICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKworICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKworCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKworCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKworICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisKKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKworICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorCisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKworICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKworCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKworICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKworICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisKKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKworICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKworICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKworICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKworICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKworICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKworICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisKKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKworICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKworICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisKKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKworICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKworICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKworICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKworICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisKKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKworICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKworICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKworCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKworICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKworICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorCisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKworICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKworICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKworICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKworICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKworCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKworICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKworICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKworICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKworICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKworICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKworCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKworICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKworICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorCisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKworCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKworICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKworICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKworICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKworICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKworICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKworICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKworICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKworICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisKKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKworICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKworICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisKKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKworCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworCisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKworICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKworICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisKKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKworICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb21tb25zLWNvbmZpZ3VyYXRpb24tTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvY29tbW9ucy1jb25maWd1cmF0aW9uLU5PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxNjMzNQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvY29tbW9ucy1jb25maWd1cmF0aW9uLU5PVElDRS50eHQKQEAgLTAsMCArMSw5IEBACitBcGFjaGUgQ29tbW9ucyBDb25maWd1cmF0aW9uCisKK0NvcHlyaWdodCAyMDAxLTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKworCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5CisKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUtMS4yLmphci5zaGExIGIvc29sci9saWNlbnNlcy9jb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUtMS4yLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMGZlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2NvbmN1cnJlbnRsaW5rZWRoYXNobWFwLWxydS0xLjIuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorNDMxNmQ3MTBiNjYxOWZmZTIxMGM5OGRlYjJiMDg5MzU4N2RhZDQ1NApkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUtTElDRU5TRS1BU0wudHh0IGIvc29sci9saWNlbnNlcy9jb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUtTElDRU5TRS1BU0wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2NvbmN1cnJlbnRsaW5rZWRoYXNobWFwLWxydS1MSUNFTlNFLUFTTC50eHQKQEAgLTAsMCArMSw0MDMgQEAKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisKKworICAgMS4gRGVmaW5pdGlvbnMuCisKKworCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKworICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKworICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKworICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKworCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKworCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKworICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisKKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKworICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorCisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKworICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKworCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKworICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKworICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisKKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKworICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKworICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKworICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKworICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKworICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKworICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisKKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKworICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKworICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisKKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKworICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKworICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKworICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKworICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisKKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKworICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKworICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKworCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKworICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKworICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorCisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKworICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKworICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKworICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKworICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKworCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKworICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKworICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKworICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKworICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKworICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKworCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKworICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKworICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorCisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKworCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKworICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKworICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKworICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKworICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKworICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKworICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKworICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKworICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisKKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKworICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKworICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisKKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKworCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworCisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKworICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKworICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisKKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKworICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9jb25jdXJyZW50bGlua2VkaGFzaG1hcC1scnUtTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvY29uY3VycmVudGxpbmtlZGhhc2htYXAtbHJ1LU5PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvY29uY3VycmVudGxpbmtlZGhhc2htYXAtbHJ1LU5PVElDRS50eHQKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvZm9udGJveC0xLjcuMS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvZm9udGJveC0xLjcuMS5qYXIuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhYjNhNi4uMDAwMDAwMAotLS0gYS9zb2xyL2xpY2Vuc2VzL2ZvbnRib3gtMS43LjEuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi02YTZiNjU5OGQwZTI2M2M3NTFmY2NmZjI2ZWY0ZmRmODU0Mzg4OGU3CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2ZvbnRib3gtMS44LjEuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL2ZvbnRib3gtMS44LjEuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2YTljMAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvZm9udGJveC0xLjguMS5qYXIuc2hhMQpAQCAtMCwwICsxIEBACiszMjg3OWJiNmJiODdiMTVjNmQ1M2JjMzU4ZTgzZWRlNDBmYzcyOWFlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hbm5vdGF0aW9ucy0yLjAuNS1hbHBoYS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWFubm90YXRpb25zLTIuMC41LWFscGhhLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWU3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hbm5vdGF0aW9ucy0yLjAuNS1hbHBoYS5qYXIuc2hhMQpAQCAtMCwwICsxIEBACis2NGUyYjM4NjM4ZjNiM2VjZjE0ODA2YTEyYzkxOTMzNGViZDc3ZmY3CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hbm5vdGF0aW9ucy1MSUNFTlNFLUFTTC50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hbm5vdGF0aW9ucy1MSUNFTlNFLUFTTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ZTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWFubm90YXRpb25zLUxJQ0VOU0UtQVNMLnR4dApAQCAtMCwwICsxLDI0NCBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitBUEFDSEUgSEFET09QIFNVQkNPTVBPTkVOVFM6CisKK1RoZSBBcGFjaGUgSGFkb29wIHByb2plY3QgY29udGFpbnMgc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodAorbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdGhlc2UKK3N1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZworbGljZW5zZXMuIAorCitGb3IgdGhlIG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuYmxvb20uKiBjbGFzc2VzOgorCisvKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEV1cm9wZWFuIENvbW1pc3Npb24gcHJvamVjdCBPbmVMYWIgdW5kZXIgY29udHJhY3QKKyAqIDAzNDgxOSAoaHR0cDovL3d3dy5vbmUtbGFiLm9yZykKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIAorICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIAorICogY29uZGl0aW9ucyBhcmUgbWV0OgorICogIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBDYXRob2xpcXVlIGRlIExvdXZhaW4gLSBVQ0wKKyAqICAgIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAorICogICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIAorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICogICAgCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIAorICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyAKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIAorICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCAKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiAKKyAqIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSAKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9oYWRvb3AtYW5ub3RhdGlvbnMtTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWFubm90YXRpb25zLU5PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YTVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWFubm90YXRpb25zLU5PVElDRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRoZSBBcGFjaGUgU29mdHdhcmUKK0ZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWF1dGgtMi4wLjUtYWxwaGEuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hdXRoLTIuMC41LWFscGhhLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1M2RjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hdXRoLTIuMC41LWFscGhhLmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzhjYTJmNjUyMWYyNTgyYmQzYjk1NTc1NjE0ZDY4NjZkODFlMjI0YjcKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWF1dGgtTElDRU5TRS1BU0wudHh0IGIvc29sci9saWNlbnNlcy9oYWRvb3AtYXV0aC1MSUNFTlNFLUFTTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ZTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWF1dGgtTElDRU5TRS1BU0wudHh0CkBAIC0wLDAgKzEsMjQ0IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0FQQUNIRSBIQURPT1AgU1VCQ09NUE9ORU5UUzoKKworVGhlIEFwYWNoZSBIYWRvb3AgcHJvamVjdCBjb250YWlucyBzdWJjb21wb25lbnRzIHdpdGggc2VwYXJhdGUgY29weXJpZ2h0Citub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSB0aGVzZQorc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nCitsaWNlbnNlcy4gCisKK0ZvciB0aGUgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5ibG9vbS4qIGNsYXNzZXM6CisKKy8qKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgRXVyb3BlYW4gQ29tbWlzc2lvbiBwcm9qZWN0IE9uZUxhYiB1bmRlciBjb250cmFjdAorICogMDM0ODE5IChodHRwOi8vd3d3Lm9uZS1sYWIub3JnKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IgCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IENhdGhvbGlxdWUgZGUgTG91dmFpbiAtIFVDTAorICogICAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCisgKiAgICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAgICAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCAKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIAorICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiAKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCAKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIAorICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hdXRoLU5PVElDRS50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1hdXRoLU5PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YTVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWF1dGgtTk9USUNFLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZQorRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9oYWRvb3AtY29tbW9uLTIuMC4wLWNkaDQuMi4wLVNOQVBTSE9ULXRlc3RzLU5PVElDRS50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1jb21tb24tMi4wLjAtY2RoNC4yLjAtU05BUFNIT1QtdGVzdHMtTk9USUNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZhNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9oYWRvb3AtY29tbW9uLTIuMC4wLWNkaDQuMi4wLVNOQVBTSE9ULXRlc3RzLU5PVElDRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRoZSBBcGFjaGUgU29mdHdhcmUKK0ZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi0yLjAuNS1hbHBoYS10ZXN0cy5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi0yLjAuNS1hbHBoYS10ZXN0cy5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY5ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9oYWRvb3AtY29tbW9uLTIuMC41LWFscGhhLXRlc3RzLmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzU4ZDQwZmRjOTQyOGQxYjBlZWM0MmI5NTFhN2M3ZWNiYTVkOTFiMWEKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi0yLjAuNS1hbHBoYS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi0yLjAuNS1hbHBoYS5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVkMjkzCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9oYWRvb3AtY29tbW9uLTIuMC41LWFscGhhLmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzg2MjUwYWQ1MzZkN2JiNDZmN2Q3ZDdmMjU4NjMzNDNkMTQwYTgzYzIKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi1MSUNFTlNFLUFTTC50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1jb21tb24tTElDRU5TRS1BU0wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGU4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1jb21tb24tTElDRU5TRS1BU0wudHh0CkBAIC0wLDAgKzEsMjQ0IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0FQQUNIRSBIQURPT1AgU1VCQ09NUE9ORU5UUzoKKworVGhlIEFwYWNoZSBIYWRvb3AgcHJvamVjdCBjb250YWlucyBzdWJjb21wb25lbnRzIHdpdGggc2VwYXJhdGUgY29weXJpZ2h0Citub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSB0aGVzZQorc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nCitsaWNlbnNlcy4gCisKK0ZvciB0aGUgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5ibG9vbS4qIGNsYXNzZXM6CisKKy8qKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgRXVyb3BlYW4gQ29tbWlzc2lvbiBwcm9qZWN0IE9uZUxhYiB1bmRlciBjb250cmFjdAorICogMDM0ODE5IChodHRwOi8vd3d3Lm9uZS1sYWIub3JnKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IgCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IENhdGhvbGlxdWUgZGUgTG91dmFpbiAtIFVDTAorICogICAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCisgKiAgICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAgICAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCAKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIAorICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiAKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCAKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIAorICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1jb21tb24tTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi1OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmE1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1jb21tb24tTk9USUNFLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZQorRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9oYWRvb3AtY29tbW9uLXRlc3RzLUxJQ0VOU0UtQVNMLnR4dCBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi10ZXN0cy1MSUNFTlNFLUFTTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ZTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWNvbW1vbi10ZXN0cy1MSUNFTlNFLUFTTC50eHQKQEAgLTAsMCArMSwyNDQgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworQVBBQ0hFIEhBRE9PUCBTVUJDT01QT05FTlRTOgorCitUaGUgQXBhY2hlIEhhZG9vcCBwcm9qZWN0IGNvbnRhaW5zIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZSBjb3B5cmlnaHQKK25vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHRoZXNlCitzdWJjb21wb25lbnRzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcKK2xpY2Vuc2VzLiAKKworRm9yIHRoZSBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLmJsb29tLiogY2xhc3NlczoKKworLyoqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBFdXJvcGVhbiBDb21taXNzaW9uIHByb2plY3QgT25lTGFiIHVuZGVyIGNvbnRyYWN0CisgKiAwMzQ4MTkgKGh0dHA6Ly93d3cub25lLWxhYi5vcmcpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciAKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyAKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgQ2F0aG9saXF1ZSBkZSBMb3V2YWluIC0gVUNMCisgKiAgICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAKKyAqICAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciAKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqICAgIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSAKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCAKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtMi4wLjUtYWxwaGEtdGVzdHMuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLTIuMC41LWFscGhhLXRlc3RzLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODA4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLTIuMC41LWFscGhhLXRlc3RzLmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzQ1MzIzMTMxODM4NmM1YWQwMjg1YzE4OTM2MjAxM2QwODVkYTE4ZDgKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtMi4wLjUtYWxwaGEuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLTIuMC41LWFscGhhLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjQxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLTIuMC41LWFscGhhLmphci5zaGExCkBAIC0wLDAgKzEgQEAKK2VmOWYwNzgwYzhhNGE4MmYwMWRiMDc2YzE3Mzg0NTNkNGI0MGQ3ZjMKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtTElDRU5TRS1BU0wudHh0IGIvc29sci9saWNlbnNlcy9oYWRvb3AtaGRmcy1MSUNFTlNFLUFTTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ZTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtTElDRU5TRS1BU0wudHh0CkBAIC0wLDAgKzEsMjQ0IEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0FQQUNIRSBIQURPT1AgU1VCQ09NUE9ORU5UUzoKKworVGhlIEFwYWNoZSBIYWRvb3AgcHJvamVjdCBjb250YWlucyBzdWJjb21wb25lbnRzIHdpdGggc2VwYXJhdGUgY29weXJpZ2h0Citub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSB0aGVzZQorc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nCitsaWNlbnNlcy4gCisKK0ZvciB0aGUgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5ibG9vbS4qIGNsYXNzZXM6CisKKy8qKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgRXVyb3BlYW4gQ29tbWlzc2lvbiBwcm9qZWN0IE9uZUxhYiB1bmRlciBjb250cmFjdAorICogMDM0ODE5IChodHRwOi8vd3d3Lm9uZS1sYWIub3JnKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IgCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IENhdGhvbGlxdWUgZGUgTG91dmFpbiAtIFVDTAorICogICAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCisgKiAgICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAgICAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCAKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIAorICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiAKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCAKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIAorICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLU5PVElDRS50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLU5PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YTVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtTk9USUNFLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZQorRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9oYWRvb3AtaGRmcy10ZXN0cy1MSUNFTlNFLUFTTC50eHQgYi9zb2xyL2xpY2Vuc2VzL2hhZG9vcC1oZGZzLXRlc3RzLUxJQ0VOU0UtQVNMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThlODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9oYWRvb3AtaGRmcy10ZXN0cy1MSUNFTlNFLUFTTC50eHQKQEAgLTAsMCArMSwyNDQgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworQVBBQ0hFIEhBRE9PUCBTVUJDT01QT05FTlRTOgorCitUaGUgQXBhY2hlIEhhZG9vcCBwcm9qZWN0IGNvbnRhaW5zIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZSBjb3B5cmlnaHQKK25vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHRoZXNlCitzdWJjb21wb25lbnRzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcKK2xpY2Vuc2VzLiAKKworRm9yIHRoZSBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLmJsb29tLiogY2xhc3NlczoKKworLyoqCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBFdXJvcGVhbiBDb21taXNzaW9uIHByb2plY3QgT25lTGFiIHVuZGVyIGNvbnRyYWN0CisgKiAwMzQ4MTkgKGh0dHA6Ly93d3cub25lLWxhYi5vcmcpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciAKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyAKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgQ2F0aG9saXF1ZSBkZSBMb3V2YWluIC0gVUNMCisgKiAgICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAKKyAqICAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciAKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqICAgIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSAKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCAKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIAorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtdGVzdHMtTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvaGFkb29wLWhkZnMtdGVzdHMtTk9USUNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZhNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9oYWRvb3AtaGRmcy10ZXN0cy1OT1RJQ0UudHh0CkBAIC0wLDAgKzEsMiBAQAorVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUaGUgQXBhY2hlIFNvZnR3YXJlCitGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2phdmFzc2lzdC0zLjYuMC5HQS1MSUNFTlNFLU1QTC50eHQgYi9zb2xyL2xpY2Vuc2VzL2phdmFzc2lzdC0zLjYuMC5HQS1MSUNFTlNFLU1QTC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Zjk2NTEuLjAwMDAwMDAKLS0tIGEvc29sci9saWNlbnNlcy9qYXZhc3Npc3QtMy42LjAuR0EtTElDRU5TRS1NUEwudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KLQotMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgMS4wLjEuICJDb21tZXJjaWFsIFVzZSIgbWVhbnMgZGlzdHJpYnV0aW9uIG9yIG90aGVyd2lzZSBtYWtpbmcgdGhlCi0gICAgIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLQotICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvCi0gICAgIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0gICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucwotICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotICAgICAxLjMuICJDb3ZlcmVkIENvZGUiIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCi0gICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKLSAgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLSAgICAgMS40LiAiRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIiBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkKLSAgICAgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgdGhlIGVsZWN0cm9uaWMKLSAgICAgdHJhbnNmZXIgb2YgZGF0YS4KLQotICAgICAxLjUuICJFeGVjdXRhYmxlIiBtZWFucyBDb3ZlcmVkIENvZGUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UKLSAgICAgQ29kZS4KLQotICAgICAxLjYuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQKLSAgICAgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdAotICAgICBBLgotCi0gICAgIDEuNy4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yCi0gICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIDEuOC4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgMS44LjEuICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bQotICAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKLSAgICAgc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKLSAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCi0gICAgIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhCi0gICAgIE1vZGlmaWNhdGlvbiBpczoKLSAgICAgICAgICBBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlCi0gICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvcgotICAgICAgICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgMS4xMC4gIk9yaWdpbmFsIENvZGUiIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUKLSAgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzCi0gICAgIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcwotICAgICBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgMS4xMC4xLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yCi0gICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgIG1ldGhvZCwgcHJvY2VzcywKLSAgICAgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgotCi0gICAgIDEuMTEuICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yCi0gICAgIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LCBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMKLSAgICAgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCi0gICAgIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3Igc291cmNlIGNvZGUKLSAgICAgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFub3RoZXIKLSAgICAgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZQotICAgICBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZQotICAgICBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlCi0gICAgIGZvciBubyBjaGFyZ2UuCi0KLSAgICAgMS4xMi4gIllvdSIgKG9yICJZb3VyIikgIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkKLSAgICAgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXNzdWVkIHVuZGVyIFNlY3Rpb24gNi4xLgotICAgICBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzCi0gICAgIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YKLSAgICAgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LAotICAgICB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkKLSAgICAgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50Ci0gICAgICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaAotICAgICBlbnRpdHkuCi0KLTIuIFNvdXJjZSBDb2RlIExpY2Vuc2UuCi0KLSAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eQotICAgICBjbGFpbXM6Ci0gICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgotICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciB0byB1c2UsIHJlcHJvZHVjZSwKLSAgICAgICAgICBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsCi0gICAgICAgICAgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vcgotICAgICAgICAgIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0KLSAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50cyBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yCi0gICAgICAgICAgc2VsbGluZyBvZiBPcmlnaW5hbCBDb2RlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsCi0gICAgICAgICAgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlCi0gICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0KLSAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIuMShhKSBhbmQgKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcwotICAgICAgICAgIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCi0gICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIENvZGU7IDIpCi0gICAgICAgICAgc2VwYXJhdGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgIG9yIDMpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZAotICAgICAgICAgIGJ5OiBpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGlpKSB0aGUKLSAgICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgQ29kZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLSAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLSAgICAgU3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yCi0gICAgIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UKLQotICAgICAgICAgIChhKSAgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IKLSAgICAgICAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksCi0gICAgICAgICAgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZikgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIENvZGUKLSAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLQotICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3IKLSAgICAgICAgICBzZWxsaW5nIG9mICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUKLSAgICAgICAgICBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMKLSAgICAgICAgICBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZQotICAgICAgICAgIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAyKSB0aGUgY29tYmluYXRpb24gb2YKLSAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvcgotICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotCi0gICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBtYWtlcyBDb21tZXJjaWFsIFVzZSBvZgotICAgICAgICAgIHRoZSBDb3ZlcmVkIENvZGUuCi0KLSAgICAgICAgICAoZCkgICAgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcwotICAgICAgICAgIGdyYW50ZWQ6IDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgMikgIHNlcGFyYXRlIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247Ci0gICAgICAgICAgMykgIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZgotICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gb3IgaWkpICB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlCi0gICAgICAgICAgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlICAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgNCkgdW5kZXIgUGF0ZW50IENsYWltcwotICAgICAgICAgIGluZnJpbmdlZCBieSBDb3ZlcmVkIENvZGUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5Ci0gICAgICAgICAgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0gICAgIDMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4KLSAgICAgVGhlIE1vZGlmaWNhdGlvbnMgd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUKLSAgICAgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICAgICBTZWN0aW9uIDIuMi4gVGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIG1heSBiZQotICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbgotICAgICBvZiB0aGlzIExpY2Vuc2UgcmVsZWFzZWQgdW5kZXIgU2VjdGlvbiA2LjEsIGFuZCBZb3UgbXVzdCBpbmNsdWRlIGEKLSAgICAgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBZb3UKLSAgICAgZGlzdHJpYnV0ZS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgU291cmNlIENvZGUKLSAgICAgdmVyc2lvbiB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIHJpZ2h0cyBoZXJldW5kZXIuIEhvd2V2ZXIsIFlvdSBtYXkgaW5jbHVkZQotICAgICBhbiBhZGRpdGlvbmFsIGRvY3VtZW50IG9mZmVyaW5nIHRoZSBhZGRpdGlvbmFsIHJpZ2h0cyBkZXNjcmliZWQgaW4KLSAgICAgU2VjdGlvbiAzLjUuCi0KLSAgICAgMy4yLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgIEFueSBNb2RpZmljYXRpb24gd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBtdXN0IGJlCi0gICAgIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICBlaXRoZXIgb24gdGhlIHNhbWUgbWVkaWEgYXMgYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHZpYSBhbiBhY2NlcHRlZAotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gdG8gYW55b25lIHRvIHdob20geW91IG1hZGUgYW4KLSAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIGF2YWlsYWJsZTsgYW5kIGlmIG1hZGUgYXZhaWxhYmxlIHZpYSBFbGVjdHJvbmljCi0gICAgIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20sIG11c3QgcmVtYWluIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3QgdHdlbHZlICgxMikKLSAgICAgbW9udGhzIGFmdGVyIHRoZSBkYXRlIGl0IGluaXRpYWxseSBiZWNhbWUgYXZhaWxhYmxlLCBvciBhdCBsZWFzdCBzaXgKLSAgICAgKDYpIG1vbnRocyBhZnRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGF0IHBhcnRpY3VsYXIgTW9kaWZpY2F0aW9uCi0gICAgIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHN1Y2ggcmVjaXBpZW50cy4gWW91IGFyZSByZXNwb25zaWJsZSBmb3IKLSAgICAgZW5zdXJpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiByZW1haW5zIGF2YWlsYWJsZSBldmVuIGlmIHRoZQotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gaXMgbWFpbnRhaW5lZCBieSBhIHRoaXJkIHBhcnR5LgotCi0gICAgIDMuMy4gRGVzY3JpcHRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLSAgICAgWW91IG11c3QgY2F1c2UgYWxsIENvdmVyZWQgQ29kZSB0byB3aGljaCBZb3UgY29udHJpYnV0ZSB0byBjb250YWluIGEKLSAgICAgZmlsZSBkb2N1bWVudGluZyB0aGUgY2hhbmdlcyBZb3UgbWFkZSB0byBjcmVhdGUgdGhhdCBDb3ZlcmVkIENvZGUgYW5kCi0gICAgIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBwcm9taW5lbnQgc3RhdGVtZW50IHRoYXQKLSAgICAgdGhlIE1vZGlmaWNhdGlvbiBpcyBkZXJpdmVkLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBmcm9tIE9yaWdpbmFsCi0gICAgIENvZGUgcHJvdmlkZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlCi0gICAgIEluaXRpYWwgRGV2ZWxvcGVyIGluIChhKSB0aGUgU291cmNlIENvZGUsIGFuZCAoYikgaW4gYW55IG5vdGljZSBpbiBhbgotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gb3IgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGluIHdoaWNoIFlvdSBkZXNjcmliZSB0aGUKLSAgICAgb3JpZ2luIG9yIG93bmVyc2hpcCBvZiB0aGUgQ292ZXJlZCBDb2RlLgotCi0gICAgIDMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMKLSAgICAgICAgICAoYSkgVGhpcmQgUGFydHkgQ2xhaW1zLgotICAgICAgICAgIElmIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2UgdGhhdCBhIGxpY2Vuc2UgdW5kZXIgYSB0aGlyZCBwYXJ0eSdzCi0gICAgICAgICAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBpcyByZXF1aXJlZCB0byBleGVyY2lzZSB0aGUgcmlnaHRzCi0gICAgICAgICAgZ3JhbnRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIsCi0gICAgICAgICAgQ29udHJpYnV0b3IgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIFNvdXJjZSBDb2RlCi0gICAgICAgICAgZGlzdHJpYnV0aW9uIHRpdGxlZCAiTEVHQUwiIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZQotICAgICAgICAgIHBhcnR5IG1ha2luZyB0aGUgY2xhaW0gaW4gc3VmZmljaWVudCBkZXRhaWwgdGhhdCBhIHJlY2lwaWVudCB3aWxsCi0gICAgICAgICAga25vdyB3aG9tIHRvIGNvbnRhY3QuIElmIENvbnRyaWJ1dG9yIG9idGFpbnMgc3VjaCBrbm93bGVkZ2UgYWZ0ZXIKLSAgICAgICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMiwKLSAgICAgICAgICBDb250cmlidXRvciBzaGFsbCBwcm9tcHRseSBtb2RpZnkgdGhlIExFR0FMIGZpbGUgaW4gYWxsIGNvcGllcwotICAgICAgICAgIENvbnRyaWJ1dG9yIG1ha2VzIGF2YWlsYWJsZSB0aGVyZWFmdGVyIGFuZCBzaGFsbCB0YWtlIG90aGVyIHN0ZXBzCi0gICAgICAgICAgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykKLSAgICAgICAgICByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHRob3NlIHdobyByZWNlaXZlZCB0aGUgQ292ZXJlZAotICAgICAgICAgIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcyBiZWVuIG9idGFpbmVkLgotCi0gICAgICAgICAgKGIpIENvbnRyaWJ1dG9yIEFQSXMuCi0gICAgICAgICAgSWYgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGluY2x1ZGUgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAgICAgICAgICBpbnRlcmZhY2UgYW5kIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2Ugb2YgcGF0ZW50IGxpY2Vuc2VzIHdoaWNoCi0gICAgICAgICAgYXJlIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGF0IEFQSSwgQ29udHJpYnV0b3IgbXVzdAotICAgICAgICAgIGFsc28gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBMRUdBTCBmaWxlLgotCi0gICAgICAgICAgICAgICAoYykgICAgUmVwcmVzZW50YXRpb25zLgotICAgICAgICAgIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0bwotICAgICAgICAgIFNlY3Rpb24gMy40KGEpIGFib3ZlLCBDb250cmlidXRvciBiZWxpZXZlcyB0aGF0IENvbnRyaWJ1dG9yJ3MKLSAgICAgICAgICBNb2RpZmljYXRpb25zIGFyZSBDb250cmlidXRvcidzIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vcgotICAgICAgICAgIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5Ci0gICAgICAgICAgdGhpcyBMaWNlbnNlLgotCi0gICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KLSAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCi0gICAgIENvZGUuICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcHV0IHN1Y2ggbm90aWNlIGluIGEgcGFydGljdWxhciBTb3VyY2UKLSAgICAgQ29kZSBmaWxlIGR1ZSB0byBpdHMgc3RydWN0dXJlLCB0aGVuIFlvdSBtdXN0IGluY2x1ZGUgc3VjaCBub3RpY2UgaW4gYQotICAgICBsb2NhdGlvbiAoc3VjaCBhcyBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSB1c2VyIHdvdWxkIGJlIGxpa2VseQotICAgICB0byBsb29rIGZvciBzdWNoIGEgbm90aWNlLiAgSWYgWW91IGNyZWF0ZWQgb25lIG9yIG1vcmUgTW9kaWZpY2F0aW9uKHMpCi0gICAgIFlvdSBtYXkgYWRkIHlvdXIgbmFtZSBhcyBhIENvbnRyaWJ1dG9yIHRvIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQS4gIFlvdSBtdXN0IGFsc28gZHVwbGljYXRlIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbgotICAgICBmb3IgdGhlIFNvdXJjZSBDb2RlIHdoZXJlIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgb3Igb3duZXJzaGlwCi0gICAgIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuICBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvCi0gICAgIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5Ci0gICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBDb2RlLiBIb3dldmVyLCBZb3UKLSAgICAgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhbgotICAgICBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzCi0gICAgIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwKLSAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLSAgICAgMy42LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLSAgICAgWW91IG1heSBkaXN0cmlidXRlIENvdmVyZWQgQ29kZSBpbiBFeGVjdXRhYmxlIGZvcm0gb25seSBpZiB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIFNlY3Rpb24gMy4xLTMuNSBoYXZlIGJlZW4gbWV0IGZvciB0aGF0IENvdmVyZWQgQ29kZSwKLSAgICAgYW5kIGlmIFlvdSBpbmNsdWRlIGEgbm90aWNlIHN0YXRpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiBvZgotICAgICB0aGUgQ292ZXJlZCBDb2RlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAotICAgICBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBvZiBob3cgYW5kIHdoZXJlIFlvdSBoYXZlIGZ1bGZpbGxlZCB0aGUKLSAgICAgb2JsaWdhdGlvbnMgb2YgU2VjdGlvbiAzLjIuIFRoZSBub3RpY2UgbXVzdCBiZSBjb25zcGljdW91c2x5IGluY2x1ZGVkCi0gICAgIGluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uLCByZWxhdGVkIGRvY3VtZW50YXRpb24gb3IKLSAgICAgY29sbGF0ZXJhbCBpbiB3aGljaCBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIHRoZQotICAgICBDb3ZlcmVkIENvZGUuIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIG9mIENvdmVyZWQKLSAgICAgQ29kZSBvciBvd25lcnNoaXAgcmlnaHRzIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5Ci0gICAgIGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KLSAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZQotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MKLSAgICAgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcwotICAgICBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIHVuZGVyIGEgZGlmZmVyZW50Ci0gICAgIGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlcgotICAgICBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5Ci0gICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoCi0gICAgIHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjcuIExhcmdlciBXb3Jrcy4KLSAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZQotICAgICBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCi0gICAgIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLgotCi00LiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBTdGF0dXRlIG9yIFJlZ3VsYXRpb24uCi0KLSAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcwotICAgICBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0bwotICAgICBzdGF0dXRlLCBqdWRpY2lhbCBvcmRlciwgb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGgKLSAgICAgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCAoYikKLSAgICAgZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZCB0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbgotICAgICBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBMRUdBTCBmaWxlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuNCBhbmQgbXVzdAotICAgICBiZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UgQ29kZS4gRXhjZXB0IHRvIHRoZQotICAgICBleHRlbnQgcHJvaGliaXRlZCBieSBzdGF0dXRlIG9yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZQotICAgICBzdWZmaWNpZW50bHkgZGV0YWlsZWQgZm9yIGEgcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8KLSAgICAgdW5kZXJzdGFuZCBpdC4KLQotNS4gQXBwbGljYXRpb24gb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcwotICAgICBhdHRhY2hlZCB0aGUgbm90aWNlIGluIEV4aGliaXQgQSBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuCi0KLTYuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi0gICAgIDYuMS4gTmV3IFZlcnNpb25zLgotICAgICBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAoIk5ldHNjYXBlIikgbWF5IHB1Ymxpc2ggcmV2aXNlZAotICAgICBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZSBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24KLSAgICAgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgotCi0gICAgIDYuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLSAgICAgT25jZSBDb3ZlcmVkIENvZGUgaGFzIGJlZW4gcHVibGlzaGVkIHVuZGVyIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZQotICAgICBMaWNlbnNlLCBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKLSAgICAgdmVyc2lvbi4gWW91IG1heSBhbHNvIGNob29zZSB0byB1c2Ugc3VjaCBDb3ZlcmVkIENvZGUgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IE5ldHNjYXBlLiBObyBvbmUKLSAgICAgb3RoZXIgdGhhbiBOZXRzY2FwZSBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGUgdGVybXMgYXBwbGljYWJsZSB0bwotICAgICBDb3ZlcmVkIENvZGUgY3JlYXRlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgICAgNi4zLiBEZXJpdmF0aXZlIFdvcmtzLgotICAgICBJZiBZb3UgY3JlYXRlIG9yIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlICh3aGljaCB5b3UgbWF5Ci0gICAgIG9ubHkgZG8gaW4gb3JkZXIgdG8gYXBwbHkgaXQgdG8gY29kZSB3aGljaCBpcyBub3QgYWxyZWFkeSBDb3ZlcmVkIENvZGUKLSAgICAgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlKSwgWW91IG11c3QgKGEpIHJlbmFtZSBZb3VyIGxpY2Vuc2Ugc28gdGhhdAotICAgICB0aGUgcGhyYXNlcyAiTW96aWxsYSIsICJNT1pJTExBUEwiLCAiTU9aUEwiLCAiTmV0c2NhcGUiLAotICAgICAiTVBMIiwgIk5QTCIgb3IgYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91cgotICAgICBsaWNlbnNlIChleGNlcHQgdG8gbm90ZSB0aGF0IHlvdXIgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKQotICAgICBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgWW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlCi0gICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgICBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyLCBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZgotICAgICB0aGlzIExpY2Vuc2UuKQotCi03LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi0gICAgIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsCi0gICAgIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRgotICAgICBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuCi0gICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERQotICAgICBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULAotICAgICBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFCi0gICAgIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIKLSAgICAgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLSAgICAgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi04LiBURVJNSU5BVElPTi4KLQotICAgICA4LjEuICBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUKLSAgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQotICAgICBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBBbGwKLSAgICAgc3VibGljZW5zZXMgdG8gdGhlIENvdmVyZWQgQ29kZSB3aGljaCBhcmUgcHJvcGVybHkgZ3JhbnRlZCBzaGFsbAotICAgICBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyCi0gICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlCi0gICAgIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgOC4yLiAgSWYgWW91IGluaXRpYXRlIGxpdGlnYXRpb24gYnkgYXNzZXJ0aW5nIGEgcGF0ZW50IGluZnJpbmdlbWVudAotICAgICBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyCi0gICAgIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20KLSAgICAgWW91IGZpbGUgc3VjaCBhY3Rpb24gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgIGFsbGVnaW5nIHRoYXQ6Ci0KLSAgICAgKGEpICBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0gICAgIGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGJ5IHN1Y2gKLSAgICAgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZQotICAgICBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5LAotICAgICB1bmxlc3MgaWYgd2l0aGluIDYwIGRheXMgYWZ0ZXIgcmVjZWlwdCBvZiBub3RpY2UgWW91IGVpdGhlcjogKGkpCi0gICAgIGFncmVlIGluIHdyaXRpbmcgdG8gcGF5IFBhcnRpY2lwYW50IGEgbXV0dWFsbHkgYWdyZWVhYmxlIHJlYXNvbmFibGUKLSAgICAgcm95YWx0eSBmb3IgWW91ciBwYXN0IGFuZCBmdXR1cmUgdXNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSBzdWNoCi0gICAgIFBhcnRpY2lwYW50LCBvciAoaWkpIHdpdGhkcmF3IFlvdXIgbGl0aWdhdGlvbiBjbGFpbSB3aXRoIHJlc3BlY3QgdG8KLSAgICAgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50LiAgSWYgd2l0aGluIDYwIGRheXMKLSAgICAgb2Ygbm90aWNlLCBhIHJlYXNvbmFibGUgcm95YWx0eSBhbmQgcGF5bWVudCBhcnJhbmdlbWVudCBhcmUgbm90Ci0gICAgIG11dHVhbGx5IGFncmVlZCB1cG9uIGluIHdyaXRpbmcgYnkgdGhlIHBhcnRpZXMgb3IgdGhlIGxpdGlnYXRpb24gY2xhaW0KLSAgICAgaXMgbm90IHdpdGhkcmF3biwgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlcgotICAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBhdCB0aGUgZXhwaXJhdGlvbiBvZgotICAgICB0aGUgNjAgZGF5IG5vdGljZSBwZXJpb2Qgc3BlY2lmaWVkIGFib3ZlLgotCi0gICAgIChiKSAgYW55IHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgZGV2aWNlLCBvdGhlciB0aGFuIHN1Y2ggUGFydGljaXBhbnQncwotICAgICBDb250cmlidXRvciBWZXJzaW9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuCi0gICAgIGFueSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEoYikKLSAgICAgYW5kIDIuMihiKSBhcmUgcmV2b2tlZCBlZmZlY3RpdmUgYXMgb2YgdGhlIGRhdGUgWW91IGZpcnN0IG1hZGUsIHVzZWQsCi0gICAgIHNvbGQsIGRpc3RyaWJ1dGVkLCBvciBoYWQgbWFkZSwgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgUGFydGljaXBhbnQuCi0KLSAgICAgOC4zLiAgSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gYWdhaW5zdCBQYXJ0aWNpcGFudAotICAgICBhbGxlZ2luZyB0aGF0IHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yCi0gICAgIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQgd2hlcmUgc3VjaCBjbGFpbSBpcyByZXNvbHZlZCAoc3VjaCBhcwotICAgICBieSBsaWNlbnNlIG9yIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudAotICAgICBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwgdGhlbiB0aGUgcmVhc29uYWJsZSB2YWx1ZSBvZiB0aGUgbGljZW5zZXMKLSAgICAgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIgc2hhbGwgYmUgdGFrZW4KLSAgICAgaW50byBhY2NvdW50IGluIGRldGVybWluaW5nIHRoZSBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IKLSAgICAgbGljZW5zZS4KLQotICAgICA4LjQuICBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgOC4xIG9yIDguMiBhYm92ZSwKLSAgICAgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycyBhbmQgcmVzZWxsZXJzKQotICAgICB3aGljaCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyCi0gICAgIHByaW9yIHRvIHRlcm1pbmF0aW9uIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi0gICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCi0gICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwKLSAgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsCi0gICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IKLSAgICAgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCi0gICAgIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwKLSAgICAgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLSAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKLSAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQotICAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCi0gICAgIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFCi0gICAgIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTwotICAgICBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLSAgICAgVGhlIENvdmVyZWQgQ29kZSBpcyBhICJjb21tZXJjaWFsIGl0ZW0sIiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbgotICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKLSAgICAgc29mdHdhcmUiIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCIgYXMgc3VjaAotICAgICB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4Ci0gICAgIEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwKLSAgICAgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlCi0gICAgIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgotCi0xMS4gTUlTQ0VMTEFORU9VUy4KLQotICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAotICAgICBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCi0gICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudAotICAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5Ci0gICAgIENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZgotICAgICBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCi0gICAgIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLAotICAgICBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4gdGhlIFVuaXRlZAotICAgICBTdGF0ZXMgb2YgQW1lcmljYSwgYW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCi0gICAgIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuCi0gICAgIERpc3RyaWN0IG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LAotICAgICBDYWxpZm9ybmlhLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcKLSAgICAgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kCi0gICAgIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24KLSAgICAgQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4KLSAgICAgQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3QKLSAgICAgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMKLSAgICAgTGljZW5zZS4KLQotMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLSAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCi0gICAgIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvCi0gICAgIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAotICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCi0gICAgIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi0xMy4gTVVMVElQTEUtTElDRU5TRUQgQ09ERS4KLQotICAgICBJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMKLSAgICAgIk11bHRpcGxlLUxpY2Vuc2VkIi4gICJNdWx0aXBsZS1MaWNlbnNlZCIgbWVhbnMgdGhhdCB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgcGVybWl0cyB5b3UgdG8gdXRpbGl6ZSBwb3J0aW9ucyBvZiB0aGUgQ292ZXJlZCBDb2RlIHVuZGVyCi0gICAgIFlvdXIgY2hvaWNlIG9mIHRoZSBOUEwgb3IgdGhlIGFsdGVybmF0aXZlIGxpY2Vuc2VzLCBpZiBhbnksIHNwZWNpZmllZAotICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIGZpbGUgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4KLQotRVhISUJJVCBBIC1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlLgotCi0gICAgIGBgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotICAgICBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi0gICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi0gICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLSAgICAgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAgICAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi0gICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX18uCi0gICAgIFBvcnRpb25zIGNyZWF0ZWQgYnkgX19fX19fX19fX19fX19fX19fX19fXyBhcmUgQ29weXJpZ2h0IChDKSBfX19fX18KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX18uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICAgQ29udHJpYnV0b3Iocyk6IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIHRoZSBfX19fXyBsaWNlbnNlICh0aGUgICJbX19fXSBMaWNlbnNlIiksIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgIHByb3Zpc2lvbnMgb2YgW19fX19fX10gTGljZW5zZSBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlCi0gICAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQotICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtfX19fXSBMaWNlbnNlIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotICAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKLSAgICAgZGVsZXRpbmcgIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlICB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKLSAgICAgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgW19fX10gTGljZW5zZS4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0gICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSAgICAgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIFtfX19dIExpY2Vuc2UuIgotCi0gICAgIFtOT1RFOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIHRleHQgb2YKLSAgICAgdGhlIG5vdGljZXMgaW4gdGhlIFNvdXJjZSBDb2RlIGZpbGVzIG9mIHRoZSBPcmlnaW5hbCBDb2RlLiBZb3Ugc2hvdWxkCi0gICAgIHVzZSB0aGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSByYXRoZXIgdGhhbiB0aGUgdGV4dCBmb3VuZCBpbiB0aGUKLSAgICAgT3JpZ2luYWwgQ29kZSBTb3VyY2UgQ29kZSBmb3IgWW91ciBNb2RpZmljYXRpb25zLl0KZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvamF2YXNzaXN0LTMuNi4wLkdBLU5PVElDRS50eHQgYi9zb2xyL2xpY2Vuc2VzL2phdmFzc2lzdC0zLjYuMC5HQS1OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxYTljLi4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvamF2YXNzaXN0LTMuNi4wLkdBLU5PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1Db3B5cmlnaHQgbm90aWNlcwotCi1KYXZhc3Npc3QsIGEgSmF2YS1ieXRlY29kZSB0cmFuc2xhdG9yIHRvb2xraXQuIAotQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgU2hpZ2VydSBDaGliYS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotVGhlIGNvbnRlbnRzIG9mIHRoaXMgc29mdHdhcmUsIEphdmFzc2lzdCwgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgCi1BTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotVGhlIE9yaWdpbmFsIENvZGUgaXMgSmF2YXNzaXN0LgotCi1UaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2hpZ2VydSBDaGliYS4gUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlCi0gIENvcHlyaWdodCAoQykgMTk5OS0yMDA2IFNoaWdlcnUgQ2hpYmEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUNvbnRyaWJ1dG9yKHMpOiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIHNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIExHUEwuCi0KLUlmIHlvdSBvYnRhaW4gdGhpcyBzb2Z0d2FyZSBhcyBwYXJ0IG9mIEpCb3NzLCB0aGUgY29udGVudHMgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCB1bmRlciBvbmx5IHRoZSB0ZXJtcyBvZiB0aGUgTEdQTC4gVG8gdXNlIHRoZW0gdW5kZXIgdGhlIE1QTCwgeW91IG11c3Qgb2J0YWluIGEgc2VwYXJhdGUgcGFja2FnZSBpbmNsdWRpbmcgb25seSBKYXZhc3Npc3QgYnV0IG5vdCB0aGUgb3RoZXIgcGFydCBvZiBKQm9zcy4KLQotQWxsIHRoZSBjb250cmlidXRvcnMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSB0cmVlIG11c3QgYWdyZWUgdG8gdGhlIG9yaWdpbmFsIGxpY2Vuc2UgdGVybSBkZXNjcmliZWQgYWJvdmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9qZW1wYm94LTEuNy4xLmphci5zaGExIGIvc29sci9saWNlbnNlcy9qZW1wYm94LTEuNy4xLmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUxN2Q5Li4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvamVtcGJveC0xLjcuMS5qYXIuc2hhMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWE5NGU3YjUyODlmNTg0ODYzOTA2MTllODdhNTBhM2JiMWQ5NzUwYzMKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvamVtcGJveC0xLjguMS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvamVtcGJveC0xLjguMS5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGViZGFlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9qZW1wYm94LTEuOC4xLmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzFhMzRkZTk4YzIwMjkzYjA3NDc0YWExN2NiMDVkYWQ2NjA3MGI5YzgKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvamVyc2V5LWNvcmUtMS4xNi5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvamVyc2V5LWNvcmUtMS4xNi5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU3NDhkCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9qZXJzZXktY29yZS0xLjE2Lmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzM0ZTllMTY0MDM5OTEzMjgzZGE5N2FmOGQ4MDZlZDkyYTkzMWQzMmIKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvamVyc2V5LWNvcmUtTElDRU5TRS1DRERMLnR4dCBiL3NvbHIvbGljZW5zZXMvamVyc2V5LWNvcmUtTElDRU5TRS1DRERMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJkZjgwCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9qZXJzZXktY29yZS1MSUNFTlNFLUNEREwudHh0CkBAIC0wLDAgKzEsODEgQEAKK0NPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpVmVyc2lvbiAxLjEKKworMS4gRGVmaW5pdGlvbnMuCisKKzEuMS4g4oCcQ29udHJpYnV0b3LigJ0gbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCisxLjIuIOKAnENvbnRyaWJ1dG9yIFZlcnNpb27igJ0gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KKzEuMy4g4oCcQ292ZXJlZCBTb2Z0d2FyZeKAnSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisxLjQuIOKAnEV4ZWN1dGFibGXigJ0gbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KKzEuNS4g4oCcSW5pdGlhbCBEZXZlbG9wZXLigJ0gbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KKzEuNi4g4oCcTGFyZ2VyIFdvcmvigJ0gbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisxLjcuIOKAnExpY2Vuc2XigJ0gbWVhbnMgdGhpcyBkb2N1bWVudC4KKzEuOC4g4oCcTGljZW5zYWJsZeKAnSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KKzEuOS4g4oCcTW9kaWZpY2F0aW9uc+KAnSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKK0EuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKK0IuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCitDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKzEuMTAuIOKAnE9yaWdpbmFsIFNvZnR3YXJl4oCdIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KKzEuMTEuIOKAnFBhdGVudCBDbGFpbXPigJ0gbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCisxLjEyLiDigJxTb3VyY2UgQ29kZeKAnSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KKzEuMTMuIOKAnFlvdeKAnSAob3Ig4oCcWW91cuKAnSkgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCDigJxZb3XigJ0gaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIOKAnGNvbnRyb2zigJ0gbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisyLiBMaWNlbnNlIEdyYW50cy4KKworMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCitDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgorKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgorMi4yLiBDb250cmlidXRvciBHcmFudC4KK0NvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgorKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KKzMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KKworMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCitBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorMy4yLiBNb2RpZmljYXRpb25zLgorVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKzMuMy4gUmVxdWlyZWQgTm90aWNlcy4KK1lvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCiszLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCitZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgorMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KK1lvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgorMy42LiBMYXJnZXIgV29ya3MuCitZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KKzQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgorCis0LjEuIE5ldyBWZXJzaW9ucy4KK09yYWNsZSBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCis0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCitZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgorNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KK1doZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgorNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KKworQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4g4oCcQVMgSVPigJ0gQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCisKKzYuIFRFUk1JTkFUSU9OLgorCis2LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCis2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyDigJxQYXJ0aWNpcGFudOKAnSkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCis2LjMuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50IGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvciBsaWNlbnNlLgorNi40LiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCitVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorCis4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgorCitUaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIOKAnGNvbW1lcmNpYWwgaXRlbSzigJ0gYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIOKAnGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmXigJ0gKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDCpyAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCDigJxjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb27igJ0gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzkuIE1JU0NFTExBTkVPVVMuCisKK1RoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KKworMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCisKK0FzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2pldHR5LTYuMS4yNi5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvamV0dHktNi4xLjI2Lmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWU2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2pldHR5LTYuMS4yNi5qYXIuc2hhMQpAQCAtMCwwICsxIEBACisyZjU0NmUyODlmZGRkNWIxZmFiMWQ0MTk5ZmJiNmU5ZWY0M2VlNGIwCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2pldHR5LXV0aWwtNi4xLjI2Lmphci5zaGExIGIvc29sci9saWNlbnNlcy9qZXR0eS11dGlsLTYuMS4yNi5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0YzUwCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9qZXR0eS11dGlsLTYuMS4yNi5qYXIuc2hhMQpAQCAtMCwwICsxIEBACitlNTY0MmZlMDM5OTgxNGUxNjg3ZDU1YTM4NjJhYTVhMzQxNzIyNmE5CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS0yLjIuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS0yLjIuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ODYzOQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvam9kYS10aW1lLTIuMi5qYXIuc2hhMQpAQCAtMCwwICsxIEBACithNWYyOWE3YWNhZGRlYTNmNGFmMzA3ZThjZjJkMGNjODI2NDVmZDdkCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS1MSUNFTlNFLUFTTC50eHQgYi9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS1MSUNFTlNFLUFTTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvam9kYS10aW1lLUxJQ0VOU0UtQVNMLnR4dApAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvam9kYS10aW1lLU5PVElDRS50eHQgYi9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS1OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZmJjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL2pvZGEtdGltZS1OT1RJQ0UudHh0CkBAIC0wLDAgKzEsNSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKz0gTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCA9Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQorSm9kYS5vcmcgKGh0dHA6Ly93d3cuam9kYS5vcmcvKS4KZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtMS41LjUuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstZnNhLTEuNS41Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg5MzVhLi4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtMS41LjUuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi03OTY1YTM5ZGIxMTRmN2M0MDRiNzFkMzhiYzdmMGU2YTMzMmM0ZTczCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstZnNhLTEuNi4wLmphci5zaGExIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS0xLjYuMC5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQxY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLWZzYS0xLjYuMC5qYXIuc2hhMQpAQCAtMCwwICsxIEBACiszOTdhOTkzMDcwMjA3OTdlNjc5MGYyZmFmOGNmODY1OTgzYjUyNTU5CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstZnNhLUxJQ0VOU0UtQlNELnR4dCBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtTElDRU5TRS1CU0QudHh0CmluZGV4IGY5N2ZiN2QuLjRkYWJhNDcgMTAwNjQ0Ci0tLSBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtTElDRU5TRS1CU0QudHh0CisrKyBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1mc2EtTElDRU5TRS1CU0QudHh0CkBAIC0xLDYgKzEsNiBAQAogCiBDb3B5cmlnaHQgKGMpIDIwMDYgRGF3aWQgV2Vpc3MKLUNvcHlyaWdodCAoYykgMjAwNy0yMDEyIERhd2lkIFdlaXNzLCBNYXJjaW4gTWnFgmtvd3NraQorQ29weXJpZ2h0IChjKSAyMDA3LTIwMTMgRGF3aWQgV2Vpc3MsIE1hcmNpbiBNacWCa293c2tpCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKQEAgLTI2LDQgKzI2LDQgQEAKIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtMS41LjUuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLTEuNS41Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMxNGMwLi4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtMS41LjUuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iNGEzYTk3NDZjYWI4YjJjOTljMzNkMmNlZWRhMmVjZTNmOGQ4ZWYyCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLTEuNi4wLmphci5zaGExIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC0xLjYuMC5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRlYWQxCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC0xLjYuMC5qYXIuc2hhMQpAQCAtMCwwICsxIEBACitjYTA2NjM1MzA5NzFiNTQ0MjBmYzFjZWEwMGE2MzM4ZjY4NDI4MjMyCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLUxJQ0VOU0UtQlNELnR4dCBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTElDRU5TRS1CU0QudHh0CmluZGV4IDA0ZmZkMDcuLjY2MGY2MzMgMTAwNjQ0Ci0tLSBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTElDRU5TRS1CU0QudHh0CisrKyBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTElDRU5TRS1CU0QudHh0CkBAIC0xLDYyICsxLDI2IEBACiBCU0QtbGljZW5zZWQgZGljdGlvbmFyeSBvZiBQb2xpc2ggKE1vcmZvbG9naWspCiAKLUNvcHlyaWdodCAoYykgMjAxMiwgTWFyY2luIE1pxYJrb3dza2kKK01vcmZvbG9naWsgUG9saXNoIGRpY3Rpb25hcnkuCitWZXJzaW9uOiAyLjAgUG9saU1vcmYKK0NvcHlyaWdodCAoYykgMjAxMywgTWFyY2luIE1pxYJrb3dza2kKIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCAgdXNlIGluICBzb3VyY2UgYW5kIGJpbmFyeSAgZm9ybXMsIHdpdGggIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IAogCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCiAKLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBDT1BZUklHSFQgSE9MREVSUyDigJxBUyBJU+KAnSBBTkQgQU5ZIEVYUFJFU1MKLU9SICBJTVBMSUVEIFdBUlJBTlRJRVMsICBJTkNMVURJTkcsIEJVVCAgTk9UIExJTUlURUQgIFRPLCAgVEhFIElNUExJRUQKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgIFNIQUxMIENPUFlSSUdIVCAgSE9MREVSUyBPUiAgQ09OVFJJQlVUT1JTIEJFCi1MSUFCTEUgRk9SICBBTlkgRElSRUNULCAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCAgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFICBHT09EUyBPUiAgU0VSVklDRVM7ICBMT1NTICBPRiBVU0UsICBEQVRBLCAgT1IgUFJPRklUUzsgIE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEICBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLS0KLQotQlNELWxpY2Vuc2VkIGRpY3Rpb25hcnkgb2YgUG9saXNoIChTR0pQKQotaHR0cDovL3NnanAucGwvbW9yZmV1c3ovCi0KLUNvcHlyaWdodCDCqSAyMDExIFp5Z211bnQgU2Fsb25pLCBXxYJvZHppbWllcnogR3J1c3pjennFhHNraSwgCi0JICAgIAkgTWFyY2luIFdvbGnFhHNraSwgUm9iZXJ0IFdvxYJvc3oKLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kICB1c2UgaW4gIHNvdXJjZSBhbmQgYmluYXJ5ICBmb3Jtcywgd2l0aCAgb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ09QWVJJR0hUIEhPTERFUlMg4oCcQVMgSVPigJ0gQU5EIEFOWSBFWFBSRVNTCi1PUiAgSU1QTElFRCBXQVJSQU5USUVTLCAgSU5DTFVESU5HLCBCVVQgIE5PVCBMSU1JVEVEICBUTywgIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgIFNIQUxMIENPUFlSSUdIVCAgSE9MREVSUyBPUiAgQ09OVFJJQlVUT1JTIEJFCi1MSUFCTEUgRk9SICBBTlkgRElSRUNULCAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCAgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFICBHT09EUyBPUiAgU0VSVklDRVM7ICBMT1NTICBPRiBVU0UsICBEQVRBLCAgT1IgUFJPRklUUzsgIE9SCi1CVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEICBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi1XSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi1PUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi1JRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1wb2xpc2gtTk9USUNFLnR4dAppbmRleCBhOGEzYWExLi40NWQ0Y2JhIDEwMDY0NAotLS0gYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstcG9saXNoLU5PVElDRS50eHQKKysrIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXBvbGlzaC1OT1RJQ0UudHh0CkBAIC0xLDYgKzEsMyBAQAogCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoTW9yZm9sb2dpaykKLShodHRwOi8vbW9yZm9sb2dpay5ibG9nc3BvdC5jb20vKQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoU0dKUCkKLShodHRwOi8vc2dqcC5wbC9tb3JmZXVzei8pCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgZGF0YSBmcm9tIEJTRC1saWNlbnNlZCBkaWN0aW9uYXJ5IG9mIFBvbGlzaCAoTW9yZm9sb2dpaywgUG9saU1vcmYpCisoaHR0cDovL21vcmZvbG9naWsuYmxvZ3Nwb3QuY29tLykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctMS41LjUuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctMS41LjUuamFyLnNoYTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODI0ZTQuLjAwMDAwMDAKLS0tIGEvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLTEuNS41Lmphci5zaGExCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZTVkYzkxM2FkZWJhM2I4OTUzOWNkNWY4MmU1Yjg4ZDEzNmExZDg1YgpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLTEuNi4wLmphci5zaGExIGIvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLTEuNi4wLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTU0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctMS42LjAuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorOGEyODQ1NzFiZWEyY2RkMzA1Y2Q4NmZiYWM5YmFiNmRlZWYzMWM3ZgpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLUxJQ0VOU0UtQlNELnR4dCBiL3NvbHIvbGljZW5zZXMvbW9yZm9sb2dpay1zdGVtbWluZy1MSUNFTlNFLUJTRC50eHQKaW5kZXggZjk3ZmI3ZC4uNGRhYmE0NyAxMDA2NDQKLS0tIGEvc29sci9saWNlbnNlcy9tb3Jmb2xvZ2lrLXN0ZW1taW5nLUxJQ0VOU0UtQlNELnR4dAorKysgYi9zb2xyL2xpY2Vuc2VzL21vcmZvbG9naWstc3RlbW1pbmctTElDRU5TRS1CU0QudHh0CkBAIC0xLDYgKzEsNiBAQAogCiBDb3B5cmlnaHQgKGMpIDIwMDYgRGF3aWQgV2Vpc3MKLUNvcHlyaWdodCAoYykgMjAwNy0yMDEyIERhd2lkIFdlaXNzLCBNYXJjaW4gTWnFgmtvd3NraQorQ29weXJpZ2h0IChjKSAyMDA3LTIwMTMgRGF3aWQgV2Vpc3MsIE1hcmNpbiBNacWCa293c2tpCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKQEAgLTI2LDQgKzI2LDQgQEAKIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvcGRmYm94LTEuNy4xLmphci5zaGExIGIvc29sci9saWNlbnNlcy9wZGZib3gtMS43LjEuamFyLnNoYTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjFiNDAuLjAwMDAwMDAKLS0tIGEvc29sci9saWNlbnNlcy9wZGZib3gtMS43LjEuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iNzYyYzE3N2Y4ODFlOGFhMDk1Y2Y1MTVkZjE4NTE5MWExMjNkOTQ5CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3BkZmJveC0xLjguMS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvcGRmYm94LTEuOC4xLmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmU2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL3BkZmJveC0xLjguMS5qYXIuc2hhMQpAQCAtMCwwICsxIEBACisyMTI3Y2VlZjllY2VmZmU0ZmVmZTQ0NWZhOGVhZTQ2MDljNTFlMTQ1CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3BvaS0zLjguamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL3BvaS0zLjguamFyLnNoYTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTE1MjcuLjAwMDAwMDAKLS0tIGEvc29sci9saWNlbnNlcy9wb2ktMy44Lmphci5zaGExCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotNTUyYTc3MDNkMzJjNTdhZGI2MTFkZjA4NGI0NWY3MTU4ZTg2NTNmMwpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9wb2ktMy45Lmphci5zaGExIGIvc29sci9saWNlbnNlcy9wb2ktMy45Lmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzRjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL3BvaS0zLjkuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorNWQ1ZTQxMzU0ZTg4MzIyZTRiYzU5MGIzMWYzZDJkMWQ1MmIzZTZhYwpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9wb2ktb294bWwtMy44Lmphci5zaGExIGIvc29sci9saWNlbnNlcy9wb2ktb294bWwtMy44Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGFhYWZhLi4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvcG9pLW9veG1sLTMuOC5qYXIuc2hhMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTIzNWQxOGFkY2NjMmIxNDBmYjNmOTBhMmZhODU5YjdhZTI5ZDU3YjgKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvcG9pLW9veG1sLTMuOS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvcG9pLW9veG1sLTMuOS5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI1YjBlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9wb2ktb294bWwtMy45Lmphci5zaGExCkBAIC0wLDAgKzEgQEAKK2JiZTgzYzczOWQyMmVlY2ZhY2QwNmQ3ZTBiOTliYTEzMjc3MDQwZWQKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvcG9pLW9veG1sLXNjaGVtYXMtMy44Lmphci5zaGExIGIvc29sci9saWNlbnNlcy9wb2ktb294bWwtc2NoZW1hcy0zLjguamFyLnNoYTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGU1MGUuLjAwMDAwMDAKLS0tIGEvc29sci9saWNlbnNlcy9wb2ktb294bWwtc2NoZW1hcy0zLjguamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jYjNiMjY4MDllYzY1ZWJhMjIxNDNhY2ZkZGY2NTRiY2Y3MGFhMDA5CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3BvaS1vb3htbC1zY2hlbWFzLTMuOS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvcG9pLW9veG1sLXNjaGVtYXMtMy45Lmphci5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzQxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL3BvaS1vb3htbC1zY2hlbWFzLTMuOS5qYXIuc2hhMQpAQCAtMCwwICsxIEBACis0YzUxNDQ5OGYwZTgyY2NjZmRkMzIwOGI5Y2FmZjJmNDUxNThkYjRhCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3BvaS1zY3JhdGNocGFkLTMuOC5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvcG9pLXNjcmF0Y2hwYWQtMy44Lmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTUyYjU1Li4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvcG9pLXNjcmF0Y2hwYWQtMy44Lmphci5zaGExCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMzNlZjNlYjdiZDk3YzBkY2RmMjg3M2IwZTBhMDkzOGYwMTNkNDEwYwpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9wb2ktc2NyYXRjaHBhZC0zLjkuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL3BvaS1zY3JhdGNocGFkLTMuOS5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ4YjFmCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy9wb2ktc2NyYXRjaHBhZC0zLjkuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorMGYwN2Q1NGY4OGE5ZjZjNzQzZDEzM2JlOGQ0NDQ2ODc5YTFlNjcyOQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9wcm90b2J1Zi1qYXZhLTIuNC4wYS5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvcHJvdG9idWYtamF2YS0yLjQuMGEuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YmYwMwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvcHJvdG9idWYtamF2YS0yLjQuMGEuamFyLnNoYTEKQEAgLTAsMCArMSBAQAorN2VmNzViNjNkYzg3OTdkMzZjY2ExZTNjMDg2NjUxMTdjYzY5ZTUyZgpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy9wcm90b2J1Zi1qYXZhLUxJQ0VOU0UtQlNELnR4dCBiL3NvbHIvbGljZW5zZXMvcHJvdG9idWYtamF2YS1MSUNFTlNFLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ODhhZgotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvcHJvdG9idWYtamF2YS1MSUNFTlNFLUJTRC50eHQKQEAgLTAsMCArMSw5IEBACitDb3B5cmlnaHQgKGMpIDxZRUFSPiwgPE9XTkVSPgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCitSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCitSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCitOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8T1JHQU5JWkFUSU9OPiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3Byb3RvYnVmLWphdmEtTk9USUNFLnR4dCBiL3NvbHIvbGljZW5zZXMvcHJvdG9idWYtamF2YS1OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmQ5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL2xpY2Vuc2VzL3Byb3RvYnVmLWphdmEtTk9USUNFLnR4dApAQCAtMCwwICsxLDMgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci9saWNlbnNlcy90aWthLWNvcmUtMS4zLmphci5zaGExIGIvc29sci9saWNlbnNlcy90aWthLWNvcmUtMS4zLmphci5zaGExCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWIzMWUwLi4wMDAwMDAwCi0tLSBhL3NvbHIvbGljZW5zZXMvdGlrYS1jb3JlLTEuMy5qYXIuc2hhMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTlkNjYwYmZhMjg4MWUzZWUzOGQzZTJlMmU4ZDU0YmM0NDhlODA3M2EKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvdGlrYS1jb3JlLTEuNC5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvdGlrYS1jb3JlLTEuNC5qYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIyNzZlCi0tLSAvZGV2L251bGwKKysrIGIvc29sci9saWNlbnNlcy90aWthLWNvcmUtMS40Lmphci5zaGExCkBAIC0wLDAgKzEgQEAKKzMwZmQ1ZDJjNGMyMWVkOTA4ZDRiNzQwNjRhYzdmNGY0ZmRiZTlhZTcKZGlmZiAtLWdpdCBhL3NvbHIvbGljZW5zZXMvdGlrYS1wYXJzZXJzLTEuMy5qYXIuc2hhMSBiL3NvbHIvbGljZW5zZXMvdGlrYS1wYXJzZXJzLTEuMy5qYXIuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1M2Y1My4uMDAwMDAwMAotLS0gYS9zb2xyL2xpY2Vuc2VzL3Rpa2EtcGFyc2Vycy0xLjMuamFyLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0xOWJiMWY2NWQ1MmE0MWVmNDc1ODNjZDdkZWIwZTRmY2FmMjVjYWI5CmRpZmYgLS1naXQgYS9zb2xyL2xpY2Vuc2VzL3Rpa2EtcGFyc2Vycy0xLjQuamFyLnNoYTEgYi9zb2xyL2xpY2Vuc2VzL3Rpa2EtcGFyc2Vycy0xLjQuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3OTAxMAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvbGljZW5zZXMvdGlrYS1wYXJzZXJzLTEuNC5qYXIuc2hhMQpAQCAtMCwwICsxIEBACis1OGFiYTExNzg5ZGM1MDhmMDA0ZTMzNTI5NDgzOTRjOWUzOTVmYjUwCmRpZmYgLS1naXQgYS9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9DbG91ZFNvbHJTZXJ2ZXIuamF2YSBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Nsb3VkU29sclNlcnZlci5qYXZhCmluZGV4IGY1ZmQxNjYuLjA4YTQ0NmIgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Nsb3VkU29sclNlcnZlci5qYXZhCisrKyBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Nsb3VkU29sclNlcnZlci5qYXZhCkBAIC05MSw2ICs5MSwxMyBAQAogICAgICAgdGhpcy5sYlNlcnZlciA9IG5ldyBMQkh0dHBTb2xyU2VydmVyKG15Q2xpZW50KTsKICAgICAgIHRoaXMudXBkYXRlc1RvTGVhZGVycyA9IHRydWU7CiAgIH0KKyAgCisgIHB1YmxpYyBDbG91ZFNvbHJTZXJ2ZXIoU3RyaW5nIHprSG9zdCwgYm9vbGVhbiB1cGRhdGVzVG9MZWFkZXJzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICB0aGlzLnprSG9zdCA9IHprSG9zdDsKKyAgICB0aGlzLm15Q2xpZW50ID0gSHR0cENsaWVudFV0aWwuY3JlYXRlQ2xpZW50KG51bGwpOworICAgIHRoaXMubGJTZXJ2ZXIgPSBuZXcgTEJIdHRwU29sclNlcnZlcihteUNsaWVudCk7CisgICAgdGhpcy51cGRhdGVzVG9MZWFkZXJzID0gdXBkYXRlc1RvTGVhZGVyczsKK30KIAogICAvKioKICAgICogQHBhcmFtIHprSG9zdCBUaGUgY2xpZW50IGVuZHBvaW50IG9mIHRoZSB6b29rZWVwZXIgcXVvcnVtIGNvbnRhaW5pbmcgdGhlIGNsb3VkIHN0YXRlLApAQCAtMTI0LDYgKzEzMSwxMSBAQAogICAgIHRoaXMuZGVmYXVsdENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwogICB9CiAKKyAgLyoqIEdldHMgdGhlIGRlZmF1bHQgY29sbGVjdGlvbiBmb3IgcmVxdWVzdCAqLworICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2xsZWN0aW9uKCkgeworICAgIHJldHVybiBkZWZhdWx0Q29sbGVjdGlvbjsKKyAgfQorCiAgIC8qKiBTZXQgdGhlIGNvbm5lY3QgdGltZW91dCB0byB0aGUgem9va2VlcGVyIGVuc2VtYmxlIGluIG1zICovCiAgIHB1YmxpYyB2b2lkIHNldFprQ29ubmVjdFRpbWVvdXQoaW50IHprQ29ubmVjdFRpbWVvdXQpIHsKICAgICB0aGlzLnprQ29ubmVjdFRpbWVvdXQgPSB6a0Nvbm5lY3RUaW1lb3V0OwpAQCAtMzQ4LDYgKzM2MCwxMCBAQAogICBwdWJsaWMgTEJIdHRwU29sclNlcnZlciBnZXRMYlNlcnZlcigpIHsKICAgICByZXR1cm4gbGJTZXJ2ZXI7CiAgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzVXBkYXRlc1RvTGVhZGVycygpIHsKKyAgICByZXR1cm4gdXBkYXRlc1RvTGVhZGVyczsKKyAgfQogCiAgIC8vIGZvciB0ZXN0cwogICBNYXA8U3RyaW5nLExpc3Q8U3RyaW5nPj4gZ2V0VXJsTGlzdHMoKSB7CmRpZmYgLS1naXQgYS9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9IdHRwU29sclNlcnZlci5qYXZhIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2ltcGwvSHR0cFNvbHJTZXJ2ZXIuamF2YQppbmRleCA4ODhiZTkwLi5kYTRlNDQ4IDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9IdHRwU29sclNlcnZlci5qYXZhCisrKyBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0h0dHBTb2xyU2VydmVyLmphdmEKQEAgLTY1OCw3ICs2NTgsNyBAQAogICAgKiBzdGF0dXMgY29kZSB0aGF0IG1heSBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIgb3IgYSAKICAgICogcHJveHkgYWxvbmcgdGhlIHdheS4KICAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVtb3RlU29sckV4Y2VwdGlvbiBleHRlbmRzIFNvbHJFeGNlcHRpb24geworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlbW90ZVNvbHJFeGNlcHRpb24gZXh0ZW5kcyBTb2xyRXhjZXB0aW9uIHsKICAgICAvKioKICAgICAgKiBAcGFyYW0gY29kZSBBcmJpdHJhcnkgSFRUUCBzdGF0dXMgY29kZQogICAgICAqIEBwYXJhbSBtc2cgRXhjZXB0aW9uIE1lc3NhZ2UKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL1N0cmVhbWluZ0JpbmFyeVJlc3BvbnNlUGFyc2VyLmphdmEgYi9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9TdHJlYW1pbmdCaW5hcnlSZXNwb25zZVBhcnNlci5qYXZhCmluZGV4IDhmNzY2NmUuLjE0YmUxZjMgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL1N0cmVhbWluZ0JpbmFyeVJlc3BvbnNlUGFyc2VyLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2ltcGwvU3RyZWFtaW5nQmluYXJ5UmVzcG9uc2VQYXJzZXIuamF2YQpAQCAtMTYsMTcgKzE2LDE3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5pbXBsOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5TdHJlYW1pbmdSZXNwb25zZUNhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckRvY3VtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckRvY3VtZW50TGlzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLkZhc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5EYXRhSW5wdXRJbnB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuSmF2YUJpbkNvZGVjOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CiAKIC8qKgogICogQSBCaW5hcnlSZXNwb25zZVBhcnNlciB0aGF0IHNlbmRzIGNhbGxiYWNrIGV2ZW50cyByYXRoZXIgdGhlbiBidWlsZApAQCAtNDksMTQgKzQ5LDE0IEBACiAgICAgICBKYXZhQmluQ29kZWMgY29kZWMgPSBuZXcgSmF2YUJpbkNvZGVjKCkgewogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU29sckRvY3VtZW50IHJlYWRTb2xyRG9jdW1lbnQoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIFNvbHJEb2N1bWVudCByZWFkU29sckRvY3VtZW50KERhdGFJbnB1dElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICBTb2xyRG9jdW1lbnQgZG9jID0gc3VwZXIucmVhZFNvbHJEb2N1bWVudChkaXMpOwogICAgICAgICAgIGNhbGxiYWNrLnN0cmVhbVNvbHJEb2N1bWVudCggZG9jICk7CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNvbHJEb2N1bWVudExpc3QgcmVhZFNvbHJEb2N1bWVudExpc3QoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIFNvbHJEb2N1bWVudExpc3QgcmVhZFNvbHJEb2N1bWVudExpc3QoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgIFNvbHJEb2N1bWVudExpc3Qgc29sckRvY3MgPSBuZXcgU29sckRvY3VtZW50TGlzdCgpOwogICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSByZWFkVmFsKGRpcyk7CiAgICAgICAgICAgc29sckRvY3Muc2V0TnVtRm91bmQoKExvbmcpIGxpc3QuZ2V0KDApKTsKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9yZXF1ZXN0L0phdmFCaW5VcGRhdGVSZXF1ZXN0Q29kZWMuamF2YSBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9yZXF1ZXN0L0phdmFCaW5VcGRhdGVSZXF1ZXN0Q29kZWMuamF2YQppbmRleCA4YzBkNWQwLi5lMjFiZmE2IDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovcmVxdWVzdC9KYXZhQmluVXBkYXRlUmVxdWVzdENvZGVjLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL3JlcXVlc3QvSmF2YUJpblVwZGF0ZVJlcXVlc3RDb2RlYy5qYXZhCkBAIC0xNiwxNyArMTYsMjAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlcXVlc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLk1vZGlmaWFibGVTb2xyUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLlNvbHJQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi51dGlsLkZhc3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuSmF2YUJpbkNvZGVjOwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Nb2RpZmlhYmxlU29sclBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Tb2xyUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5EYXRhSW5wdXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuSmF2YUJpbkNvZGVjOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3Q7CiAKIC8qKgogICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbWFyc2hhbGxpbmcgYW4gVXBkYXRlUmVxdWVzdCB0byBhIE5hbWVkTGlzdCB3aGljaCBjYW4gYmUgc2VyaWFsaXplZCBpbiB0aGUgamF2YWJpbiBmb3JtYXQgYW5kCkBAIC05NCw3ICs5Nyw3IEBACiAgICAgICBwcml2YXRlIGJvb2xlYW4gc2Vlbk91dGVyTW9zdERvY0l0ZXJhdG9yID0gZmFsc2U7CiAgICAgICAgIAogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTmFtZWRMaXN0IHJlYWROYW1lZExpc3QoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHB1YmxpYyBOYW1lZExpc3QgcmVhZE5hbWVkTGlzdChEYXRhSW5wdXRJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBzeiA9IHJlYWRTaXplKGRpcyk7CiAgICAgICAgIE5hbWVkTGlzdCBubCA9IG5ldyBOYW1lZExpc3QoKTsKICAgICAgICAgaWYgKG5hbWVkTGlzdFswXSA9PSBudWxsKSB7CkBAIC0xMDksNyArMTEyLDcgQEAKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTGlzdCByZWFkSXRlcmF0b3IoRmFzdElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHB1YmxpYyBMaXN0IHJlYWRJdGVyYXRvcihEYXRhSW5wdXRJbnB1dFN0cmVhbSBmaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gZGVmYXVsdCBiZWhhdmlvciBmb3IgcmVhZGluZyBhbnkgcmVndWxhciBJdGVyYXRvciBpbiB0aGUgc3RyZWFtCiAgICAgICAgIGlmIChzZWVuT3V0ZXJNb3N0RG9jSXRlcmF0b3IpIHJldHVybiBzdXBlci5yZWFkSXRlcmF0b3IoZmlzKTsKQEAgLTEyMCw3ICsxMjMsNyBAQAogICAgICAgICByZXR1cm4gcmVhZE91dGVyTW9zdERvY0l0ZXJhdG9yKGZpcyk7CiAgICAgICB9CiAKLSAgICAgIHByaXZhdGUgTGlzdCByZWFkT3V0ZXJNb3N0RG9jSXRlcmF0b3IoRmFzdElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHByaXZhdGUgTGlzdCByZWFkT3V0ZXJNb3N0RG9jSXRlcmF0b3IoRGF0YUlucHV0SW5wdXRTdHJlYW0gZmlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBOYW1lZExpc3QgcGFyYW1zID0gKE5hbWVkTGlzdCkgbmFtZWRMaXN0WzBdLmdldFZhbCgwKTsKICAgICAgICAgdXBkYXRlUmVxdWVzdC5zZXRQYXJhbXMobmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKFNvbHJQYXJhbXMudG9Tb2xyUGFyYW1zKHBhcmFtcykpKTsKICAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIHN1cGVyLnJlYWRJdGVyYXRvcihmaXMpOwpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL0NsdXN0ZXJTdGF0ZS5qYXZhIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL0NsdXN0ZXJTdGF0ZS5qYXZhCmluZGV4IDdlNzliY2UuLjEyM2IwZjIgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi9jbG91ZC9DbHVzdGVyU3RhdGUuamF2YQorKysgYi9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb21tb24vY2xvdWQvQ2x1c3RlclN0YXRlLmphdmEKQEAgLTE2NSwxNSArMTY1LDE4IEBACiAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChsaXZlTm9kZXMpOwogICB9CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgc2xpY2Uvc2hhcmRJZCBmb3IgYSBjb3JlLgotICAgKiBAcGFyYW0gY29yZU5vZGVOYW1lIGluIHRoZSBmb3JtIG9mIG5vZGVOYW1lX2NvcmVOYW1lICh0aGUgbmFtZSBvZiB0aGUgcmVwbGljYSkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2hhcmRJZChTdHJpbmcgY29yZU5vZGVOYW1lKSB7Ci0gICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIGdldFNoYXJkSWQoIitjb3JlTm9kZU5hbWUrIikgaW4gIiArIGNvbGxlY3Rpb25TdGF0ZXMpOworICBwdWJsaWMgU3RyaW5nIGdldFNoYXJkSWQoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBjb3JlTmFtZSkgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIGdldFNoYXJkSWQoIiArIGJhc2VVcmwgKyAiLCIgKyBjb3JlTmFtZSArICIpIGluICIgKyBjb2xsZWN0aW9uU3RhdGVzKTsKICAgICBmb3IgKERvY0NvbGxlY3Rpb24gY29sbCA6IGNvbGxlY3Rpb25TdGF0ZXMudmFsdWVzKCkpIHsKICAgICAgIGZvciAoU2xpY2Ugc2xpY2UgOiBjb2xsLmdldFNsaWNlcygpKSB7Ci0gICAgICAgIGlmIChzbGljZS5nZXRSZXBsaWNhc01hcCgpLmNvbnRhaW5zS2V5KGNvcmVOb2RlTmFtZSkpIHJldHVybiBzbGljZS5nZXROYW1lKCk7CisgICAgICAgIGZvciAoUmVwbGljYSByZXBsaWNhIDogc2xpY2UuZ2V0UmVwbGljYXMoKSkgeworICAgICAgICAgIC8vIFRPRE86IGZvciByZWFsbHkgbGFyZ2UgY2x1c3RlcnMsIHdlIGNvdWxkICdpbmRleCcgb24gdGhpcworICAgICAgICAgIFN0cmluZyByYmFzZVVybCA9IHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuQkFTRV9VUkxfUFJPUCk7CisgICAgICAgICAgU3RyaW5nIHJjb3JlID0gcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CisgICAgICAgICAgaWYgKGJhc2VVcmwuZXF1YWxzKHJiYXNlVXJsKSAmJiBjb3JlTmFtZS5lcXVhbHMocmNvcmUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2xpY2UuZ2V0TmFtZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi9jbG91ZC9Db25uZWN0aW9uTWFuYWdlci5qYXZhIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKaW5kZXggOGU1YjA5My4uMWY4YzQwYiAxMDA2NDQKLS0tIGEvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgICAgICAgICAvLyBpZiBrZWVwZXIgZG9lcyBub3QgcmVwbGFjZSBvbGRLZWVwZXIgd2UgbXVzdCBiZSBzdXJlIHRvIGNsb3NlIGl0CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9uVXBkYXRlTG9jaykgewogICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdEZvckNvbm5lY3RlZChTb2xyWmtDbGllbnQuREVGQVVMVF9DTElFTlRfQ09OTkVDVF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEZvckNvbm5lY3RlZChMb25nLk1BWF9WQUxVRSk7CiAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKICAgICAgICAgICAgICAgICAgICAgY2xvc2VLZWVwZXIoa2VlcGVyKTsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL1prU3RhdGVSZWFkZXIuamF2YSBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi9jbG91ZC9aa1N0YXRlUmVhZGVyLmphdmEKaW5kZXggNjM2NWVlZi4uMzU2ZjE0YiAxMDA2NDQKLS0tIGEvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL2Nsb3VkL1prU3RhdGVSZWFkZXIuamF2YQorKysgYi9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb21tb24vY2xvdWQvWmtTdGF0ZVJlYWRlci5qYXZhCkBAIC01MDgsNiArNTA4LDcgQEAKICAgCiAgIHB1YmxpYyBMaXN0PFprQ29yZU5vZGVQcm9wcz4gZ2V0UmVwbGljYVByb3BzKFN0cmluZyBjb2xsZWN0aW9uLAogICAgICAgU3RyaW5nIHNoYXJkSWQsIFN0cmluZyB0aGlzQ29yZU5vZGVOYW1lLCBTdHJpbmcgY29yZU5hbWUsIFN0cmluZyBtdXN0TWF0Y2hTdGF0ZUZpbHRlciwgU3RyaW5nIG11c3ROb3RNYXRjaFN0YXRlRmlsdGVyKSB7CisgICAgYXNzZXJ0IHRoaXNDb3JlTm9kZU5hbWUgIT0gbnVsbDsKICAgICBDbHVzdGVyU3RhdGUgY2x1c3RlclN0YXRlID0gdGhpcy5jbHVzdGVyU3RhdGU7CiAgICAgaWYgKGNsdXN0ZXJTdGF0ZSA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTU0MCw3ICs1NDEsNyBAQAogICAgICAgfQogICAgIH0KICAgICBpZiAobm9kZXMuc2l6ZSgpID09IDApIHsKLSAgICAgIC8vIG5vIHJlcGxpY2FzIC0gZ28gbG9jYWwKKyAgICAgIC8vIG5vIHJlcGxpY2FzCiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi91dGlsL0RhdGFJbnB1dElucHV0U3RyZWFtLmphdmEgYi9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb21tb24vdXRpbC9EYXRhSW5wdXRJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTJmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb21tb24vdXRpbC9EYXRhSW5wdXRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogQW4gYWJzdHJhY3QgRGF0YUlucHV0IHRoYXQgZXh0ZW5kcyBJbnB1dFN0cmVhbQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YUlucHV0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFJbnB1dCB7Cit9CmRpZmYgLS1naXQgYS9zb2xyL3NvbHJqL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jb21tb24vdXRpbC9GYXN0SW5wdXRTdHJlYW0uamF2YSBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi91dGlsL0Zhc3RJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDBjNDYzZTQuLjhhMmVjZWUgMTAwNzU1Ci0tLSBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi91dGlsL0Zhc3RJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi91dGlsL0Zhc3RJbnB1dFN0cmVhbS5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiAvKiogU2luZ2xlIHRocmVhZGVkIGJ1ZmZlcmVkIElucHV0U3RyZWFtCiAgKiAgSW50ZXJuYWwgU29sciB1c2Ugb25seSwgc3ViamVjdCB0byBjaGFuZ2UuCiAgKi8KLXB1YmxpYyBjbGFzcyBGYXN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFJbnB1dCB7CitwdWJsaWMgY2xhc3MgRmFzdElucHV0U3RyZWFtIGV4dGVuZHMgRGF0YUlucHV0SW5wdXRTdHJlYW0gewogICBwcm90ZWN0ZWQgZmluYWwgSW5wdXRTdHJlYW0gaW47CiAgIHByb3RlY3RlZCBmaW5hbCBieXRlW10gYnVmOwogICBwcm90ZWN0ZWQgaW50IHBvczsKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2NvbW1vbi91dGlsL0phdmFCaW5Db2RlYy5qYXZhIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL3V0aWwvSmF2YUJpbkNvZGVjLmphdmEKaW5kZXggODA3NTIzZi4uZDY1YmRjMyAxMDA3NTUKLS0tIGEvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL3V0aWwvSmF2YUJpbkNvZGVjLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY29tbW9uL3V0aWwvSmF2YUJpbkNvZGVjLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQAogICB9CiAKIAotICBwdWJsaWMgU2ltcGxlT3JkZXJlZE1hcDxPYmplY3Q+IHJlYWRPcmRlcmVkTWFwKEZhc3RJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBTaW1wbGVPcmRlcmVkTWFwPE9iamVjdD4gcmVhZE9yZGVyZWRNYXAoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCBzeiA9IHJlYWRTaXplKGRpcyk7CiAgICAgU2ltcGxlT3JkZXJlZE1hcDxPYmplY3Q+IG5sID0gbmV3IFNpbXBsZU9yZGVyZWRNYXA8T2JqZWN0PigpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3o7IGkrKykgewpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgcmV0dXJuIG5sOwogICB9CiAKLSAgcHVibGljIE5hbWVkTGlzdDxPYmplY3Q+IHJlYWROYW1lZExpc3QoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIE5hbWVkTGlzdDxPYmplY3Q+IHJlYWROYW1lZExpc3QoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCBzeiA9IHJlYWRTaXplKGRpcyk7CiAgICAgTmFtZWRMaXN0PE9iamVjdD4gbmwgPSBuZXcgTmFtZWRMaXN0PE9iamVjdD4oKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAgIHByb3RlY3RlZCBieXRlIHRhZ0J5dGU7CiAKLSAgcHVibGljIE9iamVjdCByZWFkVmFsKEZhc3RJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBPYmplY3QgcmVhZFZhbChEYXRhSW5wdXRJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgdGFnQnl0ZSA9IGRpcy5yZWFkQnl0ZSgpOwogCiAgICAgLy8gaWYgKCh0YWdCeXRlICYgMHhlMCkgPT0gMCkgewpAQCAtMzA0LDcgKzMwNCw3IEBACiAgICAgZGFvcy53cml0ZShhcnIsIG9mZnNldCwgbGVuKTsKICAgfQogCi0gIHB1YmxpYyBieXRlW10gcmVhZEJ5dGVBcnJheShGYXN0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgYnl0ZVtdIHJlYWRCeXRlQXJyYXkoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGJ5dGVbXSBhcnIgPSBuZXcgYnl0ZVtyZWFkVkludChkaXMpXTsKICAgICBkaXMucmVhZEZ1bGx5KGFycik7CiAgICAgcmV0dXJuIGFycjsKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyBTb2xyRG9jdW1lbnQgcmVhZFNvbHJEb2N1bWVudChGYXN0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgU29sckRvY3VtZW50IHJlYWRTb2xyRG9jdW1lbnQoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIE5hbWVkTGlzdCBubCA9IChOYW1lZExpc3QpIHJlYWRWYWwoZGlzKTsKICAgICBTb2xyRG9jdW1lbnQgZG9jID0gbmV3IFNvbHJEb2N1bWVudCgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuc2l6ZSgpOyBpKyspIHsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgIHJldHVybiBkb2M7CiAgIH0KIAotICBwdWJsaWMgU29sckRvY3VtZW50TGlzdCByZWFkU29sckRvY3VtZW50TGlzdChGYXN0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgU29sckRvY3VtZW50TGlzdCByZWFkU29sckRvY3VtZW50TGlzdChEYXRhSW5wdXRJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgU29sckRvY3VtZW50TGlzdCBzb2xyRG9jcyA9IG5ldyBTb2xyRG9jdW1lbnRMaXN0KCk7CiAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHJlYWRWYWwoZGlzKTsKICAgICBzb2xyRG9jcy5zZXROdW1Gb3VuZCgoTG9uZykgbGlzdC5nZXQoMCkpOwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgd3JpdGVBcnJheShkb2NzKTsKICAgfQogCi0gIHB1YmxpYyBTb2xySW5wdXREb2N1bWVudCByZWFkU29scklucHV0RG9jdW1lbnQoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIFNvbHJJbnB1dERvY3VtZW50IHJlYWRTb2xySW5wdXREb2N1bWVudChEYXRhSW5wdXRJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaW50IHN6ID0gcmVhZFZJbnQoZGlzKTsKICAgICBmbG9hdCBkb2NCb29zdCA9IChGbG9hdClyZWFkVmFsKGRpcyk7CiAgICAgU29scklucHV0RG9jdW1lbnQgc2RvYyA9IG5ldyBTb2xySW5wdXREb2N1bWVudCgpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAgIH0KIAogCi0gIHB1YmxpYyBNYXA8T2JqZWN0LE9iamVjdD4gcmVhZE1hcChGYXN0SW5wdXRTdHJlYW0gZGlzKQorICBwdWJsaWMgTWFwPE9iamVjdCxPYmplY3Q+IHJlYWRNYXAoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKQogICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaW50IHN6ID0gcmVhZFZJbnQoZGlzKTsKICAgICBNYXA8T2JqZWN0LE9iamVjdD4gbSA9IG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxPYmplY3Q+KCk7CkBAIC00MTEsNyArNDExLDcgQEAKICAgICB3cml0ZVZhbChFTkRfT0JKKTsKICAgfQogCi0gIHB1YmxpYyBMaXN0PE9iamVjdD4gcmVhZEl0ZXJhdG9yKEZhc3RJbnB1dFN0cmVhbSBmaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBMaXN0PE9iamVjdD4gcmVhZEl0ZXJhdG9yKERhdGFJbnB1dElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBBcnJheUxpc3Q8T2JqZWN0PiBsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIE9iamVjdCBvID0gcmVhZFZhbChmaXMpOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIExpc3Q8T2JqZWN0PiByZWFkQXJyYXkoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIExpc3Q8T2JqZWN0PiByZWFkQXJyYXkoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCBzeiA9IHJlYWRTaXplKGRpcyk7CiAgICAgQXJyYXlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pihzeik7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzejsgaSsrKSB7CkBAIC00NzMsNyArNDczLDcgQEAKICAgYnl0ZVtdIGJ5dGVzOwogICBDaGFyQXJyIGFyciA9IG5ldyBDaGFyQXJyKCk7CiAKLSAgcHVibGljIFN0cmluZyByZWFkU3RyKEZhc3RJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cihEYXRhSW5wdXRJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaW50IHN6ID0gcmVhZFNpemUoZGlzKTsKICAgICBpZiAoYnl0ZXMgPT0gbnVsbCB8fCBieXRlcy5sZW5ndGggPCBzeikgYnl0ZXMgPSBuZXcgYnl0ZVtzel07CiAgICAgZGlzLnJlYWRGdWxseShieXRlcywgMCwgc3opOwpAQCAtNTAxLDcgKzUwMSw3IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIGludCByZWFkU21hbGxJbnQoRmFzdElucHV0U3RyZWFtIGRpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIGludCByZWFkU21hbGxJbnQoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGludCB2ID0gdGFnQnl0ZSAmIDB4MEY7CiAgICAgaWYgKCh0YWdCeXRlICYgMHgxMCkgIT0gMCkKICAgICAgIHYgPSAocmVhZFZJbnQoZGlzKSA8PCA0KSB8IHY7CkBAIC01MjUsNyArNTI1LDcgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgbG9uZyByZWFkU21hbGxMb25nKEZhc3RJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBsb25nIHJlYWRTbWFsbExvbmcoRGF0YUlucHV0SW5wdXRTdHJlYW0gZGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGxvbmcgdiA9IHRhZ0J5dGUgJiAweDBGOwogICAgIGlmICgodGFnQnl0ZSAmIDB4MTApICE9IDApCiAgICAgICB2ID0gKHJlYWRWTG9uZyhkaXMpIDw8IDQpIHwgdjsKQEAgLTYwNyw3ICs2MDcsNyBAQAogICB9CiAKIAotICBwdWJsaWMgaW50IHJlYWRTaXplKEZhc3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIGludCByZWFkU2l6ZShEYXRhSW5wdXRJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBpbnQgc3ogPSB0YWdCeXRlICYgMHgxZjsKICAgICBpZiAoc3ogPT0gMHgxZikgc3ogKz0gcmVhZFZJbnQoaW4pOwogICAgIHJldHVybiBzejsKQEAgLTYzNCw3ICs2MzQsNyBAQAogICAgKgogICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIGlzIGEgbG93LWxldmVsIEkvTyBlcnJvci4KICAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRWSW50KEZhc3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgcmVhZFZJbnQoRGF0YUlucHV0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgYnl0ZSBiID0gaW4ucmVhZEJ5dGUoKTsKICAgICBpbnQgaSA9IGIgJiAweDdGOwogICAgIGZvciAoaW50IHNoaWZ0ID0gNzsgKGIgJiAweDgwKSAhPSAwOyBzaGlmdCArPSA3KSB7CkBAIC02NTMsNyArNjUzLDcgQEAKICAgICBvdXQud3JpdGVCeXRlKChieXRlKSBpKTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkVkxvbmcoRmFzdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICBwdWJsaWMgc3RhdGljIGxvbmcgcmVhZFZMb25nKERhdGFJbnB1dElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGJ5dGUgYiA9IGluLnJlYWRCeXRlKCk7CiAgICAgbG9uZyBpID0gYiAmIDB4N0Y7CiAgICAgZm9yIChpbnQgc2hpZnQgPSA3OyAoYiAmIDB4ODApICE9IDA7IHNoaWZ0ICs9IDcpIHsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCiAgIH0KIAotICBwdWJsaWMgU3RyaW5nIHJlYWRFeHRlcm5TdHJpbmcoRmFzdElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIFN0cmluZyByZWFkRXh0ZXJuU3RyaW5nKERhdGFJbnB1dElucHV0U3RyZWFtIGZpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gcmVhZFNpemUoZmlzKTsKICAgICBpZiAoaWR4ICE9IDApIHsvLyBpZHggIT0gMCBpcyB0aGUgaW5kZXggb2YgdGhlIGV4dGVybiBzdHJpbmcKICAgICAgIHJldHVybiBzdHJpbmdzTGlzdC5nZXQoaWR4IC0gMSk7CmRpZmYgLS1naXQgYS9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL2xvZzRqLnByb3BlcnRpZXMgYi9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL2xvZzRqLnByb3BlcnRpZXMKaW5kZXggZmJjODE3Zi4uOWI3NGE1ZiAxMDA2NDQKLS0tIGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9sb2c0ai5wcm9wZXJ0aWVzCisrKyBiL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovbG9nNGoucHJvcGVydGllcwpAQCAtNywzICs3LDQgQEAKIGxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSUtNXAgLSAlZHt5eXl5LU1NLWRkIEhIOm1tOnNzLlNTU307ICVDOyAlbVxuCiAKIGxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnpvb2tlZXBlcj1XQVJOCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5oYWRvb3A9V0FSTgpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZTEueG1sIGIvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy1zbGF2ZTEueG1sCmluZGV4IDc2ZGIzNzguLjk5YmVjMDQgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWctc2xhdmUxLnhtbAorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLXNsYXZlMS54bWwKQEAgLTE5LDExICsxOSwxMiBAQAogCiA8Y29uZmlnPgogICA8bHVjZW5lTWF0Y2hWZXJzaW9uPiR7dGVzdHMubHVjZW5lTWF0Y2hWZXJzaW9uOkxVQ0VORV9DVVJSRU5UfTwvbHVjZW5lTWF0Y2hWZXJzaW9uPgorICA8aW5kZXhDb25maWc+CisgICAgPHVzZUNvbXBvdW5kRmlsZT4ke3VzZUNvbXBvdW5kRmlsZTpmYWxzZX08L3VzZUNvbXBvdW5kRmlsZT4KKyAgPC9pbmRleENvbmZpZz4KICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlJBTURpcmVjdG9yeUZhY3Rvcnl9Ii8+CiAKLSAgPCEtLSA8aW5kZXhDb25maWc+IHNlY3Rpb24gY291bGQgZ28gaGVyZSwgYnV0IHdlIHdhbnQgdGhlIGRlZmF1bHRzIC0tPgotCiAgIDx1cGRhdGVIYW5kbGVyIGNsYXNzPSJzb2xyLkRpcmVjdFVwZGF0ZUhhbmRsZXIyIj4KICAgPC91cGRhdGVIYW5kbGVyPgogCmRpZmYgLS1naXQgYS9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL3NvbHIvY29sbGVjdGlvbjEvY29uZi9zb2xyY29uZmlnLnhtbCBiL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCmluZGV4IGYxYTMxZGUuLjdmNjgzZTUgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCisrKyBiL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9jb2xsZWN0aW9uMS9jb25mL3NvbHJjb25maWcueG1sCkBAIC0yMiw2ICsyMiw5IEBACiAtLT4KIDxjb25maWc+CiAgIDxsdWNlbmVNYXRjaFZlcnNpb24+JHt0ZXN0cy5sdWNlbmVNYXRjaFZlcnNpb246TFVDRU5FX0NVUlJFTlR9PC9sdWNlbmVNYXRjaFZlcnNpb24+CisgIDxpbmRleENvbmZpZz4KKyAgICA8dXNlQ29tcG91bmRGaWxlPiR7dXNlQ29tcG91bmRGaWxlOmZhbHNlfTwvdXNlQ29tcG91bmRGaWxlPgorICA8L2luZGV4Q29uZmlnPgogICAgPGRhdGFEaXI+JHtzb2xyLmRhdGEuZGlyOn08L2RhdGFEaXI+CiAgIDxkaXJlY3RvcnlGYWN0b3J5IG5hbWU9IkRpcmVjdG9yeUZhY3RvcnkiIGNsYXNzPSIke3NvbHIuZGlyZWN0b3J5RmFjdG9yeTpzb2xyLlN0YW5kYXJkRGlyZWN0b3J5RmFjdG9yeX0iLz4KIApkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NoYXJlZC9jb25mL3NvbHJjb25maWcueG1sIGIvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NoYXJlZC9jb25mL3NvbHJjb25maWcueG1sCmluZGV4IDhjZGEwZTYuLjMxZDhmMWQgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9zaGFyZWQvY29uZi9zb2xyY29uZmlnLnhtbAorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL3NvbHIvc2hhcmVkL2NvbmYvc29scmNvbmZpZy54bWwKQEAgLTIyLDYgKzIyLDkgQEAKIC0tPgogPGNvbmZpZz4KICAgPGx1Y2VuZU1hdGNoVmVyc2lvbj4ke3Rlc3RzLmx1Y2VuZU1hdGNoVmVyc2lvbjpMVUNFTkVfQ1VSUkVOVH08L2x1Y2VuZU1hdGNoVmVyc2lvbj4KKyAgPGluZGV4Q29uZmlnPgorICAgIDx1c2VDb21wb3VuZEZpbGU+JHt1c2VDb21wb3VuZEZpbGU6ZmFsc2V9PC91c2VDb21wb3VuZEZpbGU+CisgIDwvaW5kZXhDb25maWc+CiAgIDxkYXRhRGlyPiR7dGVtcERpcn0vZGF0YS8ke2wxMG46fS0ke3ZlcnNpb246fTwvZGF0YURpcj4KICAgPGRpcmVjdG9yeUZhY3RvcnkgbmFtZT0iRGlyZWN0b3J5RmFjdG9yeSIgY2xhc3M9IiR7c29sci5kaXJlY3RvcnlGYWN0b3J5OnNvbHIuUkFNRGlyZWN0b3J5RmFjdG9yeX0iLz4KIApkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NoYXJlZC9zb2xyLnhtbCBiL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9zaGFyZWQvc29sci54bWwKaW5kZXggNDhlMDkxYi4uNTVjMThlYiAxMDA2NDQKLS0tIGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NoYXJlZC9zb2xyLnhtbAorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL3NvbHIvc2hhcmVkL3NvbHIueG1sCkBAIC0zMCw3ICszMCw3IEBACiAgIGFkbWluUGF0aDogUmVxdWVzdEhhbmRsZXIgcGF0aCB0byBtYW5hZ2UgY29yZXMuICAKICAgICBJZiAnbnVsbCcgKG9yIGFic2VudCksIGNvcmVzIHdpbGwgbm90IGJlIG1hbmFnZWFibGUgdmlhIFJFU1QKICAgLS0+Ci0gIDxjb3JlcyBhZG1pblBhdGg9Ii9hZG1pbi9jb3JlcyIgZGVmYXVsdENvcmVOYW1lPSJjb3JlMCIgaG9zdD0iMTI3LjAuMC4xIiBob3N0UG9ydD0iJHtob3N0UG9ydDo4OTgzfSIgaG9zdENvbnRleHQ9IiR7aG9zdENvbnRleHQ6c29scn0iIHprQ2xpZW50VGltZW91dD0iODAwMCI+CisgIDxjb3JlcyBhZG1pblBhdGg9Ii9hZG1pbi9jb3JlcyIgZGVmYXVsdENvcmVOYW1lPSJjb3JlMCIgaG9zdD0iMTI3LjAuMC4xIiBob3N0UG9ydD0iJHtob3N0UG9ydDo4OTgzfSIgaG9zdENvbnRleHQ9IiR7aG9zdENvbnRleHQ6c29scn0iIHprQ2xpZW50VGltZW91dD0iODAwMCIgZ2VuZXJpY0NvcmVOb2RlTmFtZXM9IiR7Z2VuZXJpY0NvcmVOb2RlTmFtZXM6dHJ1ZX0iPgogICAgIDxjb3JlIG5hbWU9ImNvbGxlY3Rpb24xIiBpbnN0YW5jZURpcj0iLiIgLz4KICAgICA8Y29yZSBuYW1lPSJjb3JlMCIgaW5zdGFuY2VEaXI9IiR7dGhlSW5zdGFuY2VEaXI6Li99IiBkYXRhRGlyPSIke2RhdGFEaXIxfSIgY29sbGVjdGlvbj0iJHtjb2xsZWN0aW9uOmFjb2xsZWN0aW9ufSI+CiAgICAgICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjMuNSIvPgpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NvbHIueG1sIGIvc29sci9zb2xyai9zcmMvdGVzdC1maWxlcy9zb2xyai9zb2xyL3NvbHIueG1sCmluZGV4IDQ0ZDBmNzguLjczZDExMTEgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3QtZmlsZXMvc29scmovc29sci9zb2xyLnhtbAorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0LWZpbGVzL3NvbHJqL3NvbHIvc29sci54bWwKQEAgLTI4LDcgKzI4LDcgQEAKICAgYWRtaW5QYXRoOiBSZXF1ZXN0SGFuZGxlciBwYXRoIHRvIG1hbmFnZSBjb3Jlcy4gIAogICAgIElmICdudWxsJyAob3IgYWJzZW50KSwgY29yZXMgd2lsbCBub3QgYmUgbWFuYWdlYWJsZSB2aWEgcmVxdWVzdCBoYW5kbGVyCiAgIC0tPgotICA8Y29yZXMgYWRtaW5QYXRoPSIvYWRtaW4vY29yZXMiIGRlZmF1bHRDb3JlTmFtZT0iY29sbGVjdGlvbjEiIGhvc3Q9IjEyNy4wLjAuMSIgaG9zdFBvcnQ9IiR7aG9zdFBvcnQ6ODk4M30iIGhvc3RDb250ZXh0PSIke2hvc3RDb250ZXh0OnNvbHJ9IiB6a0NsaWVudFRpbWVvdXQ9IjgwMDAiIG51bVNoYXJkcz0iJHtudW1TaGFyZHM6M30iPgorICA8Y29yZXMgYWRtaW5QYXRoPSIvYWRtaW4vY29yZXMiIGRlZmF1bHRDb3JlTmFtZT0iY29sbGVjdGlvbjEiIGhvc3Q9IjEyNy4wLjAuMSIgaG9zdFBvcnQ9IiR7aG9zdFBvcnQ6ODk4M30iIGhvc3RDb250ZXh0PSIke2hvc3RDb250ZXh0OnNvbHJ9IiB6a0NsaWVudFRpbWVvdXQ9IjgwMDAiIGdlbmVyaWNDb3JlTm9kZU5hbWVzPSIke2dlbmVyaWNDb3JlTm9kZU5hbWVzOnRydWV9Ij4KICAgICA8Y29yZSBuYW1lPSJjb2xsZWN0aW9uMSIgaW5zdGFuY2VEaXI9ImNvbGxlY3Rpb24xIiBzaGFyZD0iJHtzaGFyZDp9IiBjb2xsZWN0aW9uPSIke2NvbGxlY3Rpb246Y29sbGVjdGlvbjF9IiBjb25maWc9IiR7c29scmNvbmZpZzpzb2xyY29uZmlnLnhtbH0iIHNjaGVtYT0iJHtzY2hlbWE6c2NoZW1hLnhtbH0iLz4KICAgPC9jb3Jlcz4KIDwvc29scj4KZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9NZXJnZUluZGV4ZXNFeGFtcGxlVGVzdEJhc2UuamF2YSBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9NZXJnZUluZGV4ZXNFeGFtcGxlVGVzdEJhc2UuamF2YQppbmRleCA1NWZlZWFlLi5jMTZmMTE3IDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovTWVyZ2VJbmRleGVzRXhhbXBsZVRlc3RCYXNlLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL01lcmdlSW5kZXhlc0V4YW1wbGVUZXN0QmFzZS5qYXZhCkBAIC0xNywxMCArMTcsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmo7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLlNvbHJUZXN0Q2FzZUo0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmoucmVxdWVzdC5BYnN0cmFjdFVwZGF0ZVJlcXVlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkNvcmVBZG1pblJlcXVlc3Q7CkBAIC0zMiw5ICsyOCwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvcmVDb250YWluZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnV0aWwuRXh0ZXJuYWxQYXRoczsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiAvKioKICAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRlc3RpbmcgbWVyZ2UgaW5kZXhlcyBjb21tYW5kCiAgKgpAQCAtNDIsNyArNDEsOCBAQAogICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1lcmdlSW5kZXhlc0V4YW1wbGVUZXN0QmFzZSBleHRlbmRzIFNvbHJFeGFtcGxlVGVzdEJhc2UgewotICBwcm90ZWN0ZWQgc3RhdGljIENvcmVDb250YWluZXIgY29yZXM7CisKKyAgcHJvdGVjdGVkIENvcmVDb250YWluZXIgY29yZXM7CiAgIHByaXZhdGUgU3RyaW5nIHNhdmVQcm9wOwogICBwcml2YXRlIEZpbGUgZGF0YURpcjI7CiAKQEAgLTU2LDEzICs1NiwxMiBAQAogICAgIGlmIChkYXRhRGlyID09IG51bGwpIHsKICAgICAgIGNyZWF0ZVRlbXBEaXIoKTsKICAgICB9Ci0gICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcigpOwogICB9Ci0gIAotICBAQWZ0ZXJDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpIHsKLSAgICBjb3Jlcy5zaHV0ZG93bigpOwotICAgIGNvcmVzID0gbnVsbDsKKworICBwcm90ZWN0ZWQgdm9pZCBzZXR1cENvcmVDb250YWluZXIoKSB7CisgICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcihnZXRTb2xySG9tZSgpKTsKKyAgICBjb3Jlcy5sb2FkKCk7CisgICAgLy9jb3JlcyA9IENvcmVDb250YWluZXIuY3JlYXRlQW5kTG9hZChnZXRTb2xySG9tZSgpLCBuZXcgRmlsZShURU1QX0RJUiwgInNvbHIueG1sIikpOwogICB9CiAgIAogICBAT3ZlcnJpZGUKQEAgLTcxLDE3ICs3MCwxOSBAQAogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5IiwgInNvbHIuU3RhbmRhcmREaXJlY3RvcnlGYWN0b3J5Iik7CiAgICAgc3VwZXIuc2V0VXAoKTsKIAotICAgIFNvbHJDb3JlLmxvZy5pbmZvKCJDT1JFUz0iICsgY29yZXMgKyAiIDogIiArIGNvcmVzLmdldENvcmVOYW1lcygpKTsKLSAgICBjb3Jlcy5zZXRQZXJzaXN0ZW50KGZhbHNlKTsKLSAgICAKICAgICAvLyBzZXR1cCBkYXRhZGlycwotICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggInNvbHIuY29yZTAuZGF0YS5kaXIiLCBTb2xyVGVzdENhc2VKNC5kYXRhRGlyLmdldENhbm9uaWNhbFBhdGgoKSApOyAKLSAgICAKKyAgICBTeXN0ZW0uc2V0UHJvcGVydHkoICJzb2xyLmNvcmUwLmRhdGEuZGlyIiwgU29sclRlc3RDYXNlSjQuZGF0YURpci5nZXRDYW5vbmljYWxQYXRoKCkgKTsKKwogICAgIGRhdGFEaXIyID0gbmV3IEZpbGUoVEVNUF9ESVIsIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi0iCiAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICAgIGRhdGFEaXIyLm1rZGlycygpOwotICAgIAotICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggInNvbHIuY29yZTEuZGF0YS5kaXIiLCB0aGlzLmRhdGFEaXIyLmdldENhbm9uaWNhbFBhdGgoKSApOyAKKworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggInNvbHIuY29yZTEuZGF0YS5kaXIiLCB0aGlzLmRhdGFEaXIyLmdldENhbm9uaWNhbFBhdGgoKSApOworCisgICAgc2V0dXBDb3JlQ29udGFpbmVyKCk7CisgICAgU29sckNvcmUubG9nLmluZm8oIkNPUkVTPSIgKyBjb3JlcyArICIgOiAiICsgY29yZXMuZ2V0Q29yZU5hbWVzKCkpOworICAgIGNvcmVzLnNldFBlcnNpc3RlbnQoZmFsc2UpOworCiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTk2LDYgKzk3LDggQEAKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIhISEhIFdBUk5JTkc6IGJlc3QgZWZmb3J0IHRvIHJlbW92ZSAiICsgZGF0YURpcjIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIEZBSUxFRCAhISEhISIpOwogICAgICAgfQogICAgIH0KKworICAgIGNvcmVzLnNodXRkb3duKCk7CiAgICAgCiAgICAgaWYgKHNhdmVQcm9wID09IG51bGwpIFN5c3RlbS5jbGVhclByb3BlcnR5KCJzb2xyLmRpcmVjdG9yeUZhY3RvcnkiKTsKICAgICBlbHNlIFN5c3RlbS5zZXRQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5Iiwgc2F2ZVByb3ApOwpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL011bHRpQ29yZUV4YW1wbGVUZXN0QmFzZS5qYXZhIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL011bHRpQ29yZUV4YW1wbGVUZXN0QmFzZS5qYXZhCmluZGV4IDQ4ZmUxZDkuLjE1ZjIxMjggMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9NdWx0aUNvcmVFeGFtcGxlVGVzdEJhc2UuamF2YQorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovTXVsdGlDb3JlRXhhbXBsZVRlc3RCYXNlLmphdmEKQEAgLTE3LDggKzE3LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkFic3RyYWN0VXBkYXRlUmVxdWVzdC5BQ1RJT047CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkNvcmVBZG1pblJlcXVlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkNvcmVBZG1pblJlcXVlc3QuVW5sb2FkOwpAQCAtMzAsMTAgKzI4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5FeHRlcm5hbFBhdGhzOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKKwogCiAvKioKICAqCkBAIC00MSwzMCArMzksMjEgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpQ29yZUV4YW1wbGVUZXN0QmFzZSBleHRlbmRzIFNvbHJFeGFtcGxlVGVzdEJhc2UgCiB7Ci0gIHByb3RlY3RlZCBzdGF0aWMgQ29yZUNvbnRhaW5lciBjb3JlczsKKyAgcHJvdGVjdGVkIENvcmVDb250YWluZXIgY29yZXM7CiAKICAgcHJpdmF0ZSBGaWxlIGRhdGFEaXIyOwogICBwcml2YXRlIEZpbGUgZGF0YURpcjE7CiAKICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgZ2V0U29sckhvbWUoKSB7IHJldHVybiBFeHRlcm5hbFBhdGhzLkVYQU1QTEVfTVVMVElDT1JFX0hPTUU7IH0KIAotICAKLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVUaGlzQ2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIHByb3RlY3RlZCB2b2lkIHNldHVwQ29yZUNvbnRhaW5lcigpIHsKICAgICBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKCk7Ci0gIH0KLSAgCi0gIEBBZnRlckNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZnRlckNsYXNzKCkgewotICAgIGNvcmVzLnNodXRkb3duKCk7CisgICAgY29yZXMubG9hZCgpOwogICB9CiAgIAogICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBzdXBlci5zZXRVcCgpOwogCi0gICAgU29sckNvcmUubG9nLmluZm8oIkNPUkVTPSIgKyBjb3JlcyArICIgOiAiICsgY29yZXMuZ2V0Q29yZU5hbWVzKCkpOwotICAgIGNvcmVzLnNldFBlcnNpc3RlbnQoZmFsc2UpOwotICAgIAogICAgIGRhdGFEaXIxID0gbmV3IEZpbGUoVEVNUF9ESVIsIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi1jb3JlMC0iCiAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICAgIGRhdGFEaXIxLm1rZGlycygpOwpAQCAtNzQsNyArNjMsMTQgQEAKICAgICBkYXRhRGlyMi5ta2RpcnMoKTsKICAgICAKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoICJzb2xyLmNvcmUwLmRhdGEuZGlyIiwgdGhpcy5kYXRhRGlyMS5nZXRDYW5vbmljYWxQYXRoKCkgKTsgCi0gICAgU3lzdGVtLnNldFByb3BlcnR5KCAic29sci5jb3JlMS5kYXRhLmRpciIsIHRoaXMuZGF0YURpcjIuZ2V0Q2Fub25pY2FsUGF0aCgpICk7IAorICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggInNvbHIuY29yZTEuZGF0YS5kaXIiLCB0aGlzLmRhdGFEaXIyLmdldENhbm9uaWNhbFBhdGgoKSApOworCisgICAgc2V0dXBDb3JlQ29udGFpbmVyKCk7CisKKyAgICBTb2xyQ29yZS5sb2cuaW5mbygiQ09SRVM9IiArIGNvcmVzICsgIiA6ICIgKyBjb3Jlcy5nZXRDb3JlTmFtZXMoKSk7CisgICAgY29yZXMuc2V0UGVyc2lzdGVudChmYWxzZSk7CisKKwogICB9CiAgIAogICBAT3ZlcnJpZGUKQEAgLTg5LDYgKzg1LDggQEAKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIhISEhIFdBUk5JTkc6IGJlc3QgZWZmb3J0IHRvIHJlbW92ZSAiICsgZGF0YURpcjIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIEZBSUxFRCAhISEhISIpOwogICAgICAgfQogICAgIH0KKworICAgIGNvcmVzLnNodXRkb3duKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9BYnN0cmFjdEVtYmVkZGVkU29sclNlcnZlclRlc3RDYXNlLmphdmEgYi9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovZW1iZWRkZWQvQWJzdHJhY3RFbWJlZGRlZFNvbHJTZXJ2ZXJUZXN0Q2FzZS5qYXZhCmluZGV4IDJiN2ExOGIuLmRmYTJlOWEgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9BYnN0cmFjdEVtYmVkZGVkU29sclNlcnZlclRlc3RDYXNlLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL0Fic3RyYWN0RW1iZWRkZWRTb2xyU2VydmVyVGVzdENhc2UuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogICAgIHN1cGVyLnNldFVwKCk7CiAKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNvbHIuc29sci5ob21lIiwgU09MUl9IT01FLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvbHIgaG9tZTogIiArIFNPTFJfSE9NRS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKICAgICAvL1RoZSBpbmRleCBpcyBhbHdheXMgc3RvcmVkIHdpdGhpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKICAgICBjcmVhdGVUZW1wRGlyKCk7CkBAIC02MSw3ICs2Miw4IEBACiAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkYXRhRGlyMiIsIGRhdGFEaXIyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInRlbXBEaXIiLCB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInRlc3RzLnNoYXJkaGFuZGxlci5yYW5kb21TZWVkIiwgTG9uZy50b1N0cmluZyhyYW5kb20oKS5uZXh0TG9uZygpKSk7Ci0gICAgY29yZXMgPSBuZXcgQ29yZUNvbnRhaW5lcihTT0xSX0hPTUUuZ2V0QWJzb2x1dGVQYXRoKCksIGdldFNvbHJYbWwoKSk7CisgICAgY29yZXMgPSBDb3JlQ29udGFpbmVyLmNyZWF0ZUFuZExvYWQoU09MUl9IT01FLmdldEFic29sdXRlUGF0aCgpLCBnZXRTb2xyWG1sKCkpOworICAgIGNvcmVzLnNldFBlcnNpc3RlbnQoZmFsc2UpOwogICB9CiAgIAogICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRTb2xyWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9NZXJnZUluZGV4ZXNFbWJlZGRlZFRlc3QuamF2YSBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9NZXJnZUluZGV4ZXNFbWJlZGRlZFRlc3QuamF2YQppbmRleCA1MmZjNDI1Li43NTIzOWFiIDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovZW1iZWRkZWQvTWVyZ2VJbmRleGVzRW1iZWRkZWRUZXN0LmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL01lcmdlSW5kZXhlc0VtYmVkZGVkVGVzdC5qYXZhCkBAIC0xNyw4ICsxNyw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5lbWJlZGRlZDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouTWVyZ2VJbmRleGVzRXhhbXBsZVRlc3RCYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouU29sclNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKQEAgLTM2LDEwICszNCw2IEBACiAgICAgLy8gVE9ETzogZml4IHRoaXMgdGVzdCB0byB1c2UgTW9ja0RpcmVjdG9yeUZhY3RvcnkKICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgic29sci5kaXJlY3RvcnlGYWN0b3J5Iik7CiAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKGdldFNvbHJIb21lKCkpOwotICAgIEZpbGUgZiA9IG5ldyBGaWxlKGhvbWUsICJzb2xyLnhtbCIpOwotICAgIGNvcmVzLmxvYWQoZ2V0U29sckhvbWUoKSwgZik7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9NdWx0aUNvcmVFbWJlZGRlZFRlc3QuamF2YSBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9NdWx0aUNvcmVFbWJlZGRlZFRlc3QuamF2YQppbmRleCBjM2ExZmI3Li40MjdhMTBkIDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovZW1iZWRkZWQvTXVsdGlDb3JlRW1iZWRkZWRUZXN0LmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL011bHRpQ29yZUVtYmVkZGVkVGVzdC5qYXZhCkBAIC0xNyw4ICsxNyw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5lbWJlZGRlZDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouTXVsdGlDb3JlRXhhbXBsZVRlc3RCYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouU29sclNlcnZlcjsKIApAQCAtMzUsMTAgKzMzLDYgQEAKICAgICAvLyBUT0RPOiBmaXggdGhpcyB0ZXN0IHRvIHVzZSBNb2NrRGlyZWN0b3J5RmFjdG9yeQogICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJzb2xyLmRpcmVjdG9yeUZhY3RvcnkiKTsKICAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKCBnZXRTb2xySG9tZSgpICk7Ci0gICAgRmlsZSBmID0gbmV3IEZpbGUoIGhvbWUsICJzb2xyLnhtbCIgKTsKLSAgICBjb3Jlcy5sb2FkKCBnZXRTb2xySG9tZSgpLCBmICk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9UZXN0U29sclByb3BlcnRpZXMuamF2YSBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9lbWJlZGRlZC9UZXN0U29sclByb3BlcnRpZXMuamF2YQppbmRleCA3MWEwNzE2Li5lZGUxNjYwIDEwMDY0NAotLS0gYS9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovZW1iZWRkZWQvVGVzdFNvbHJQcm9wZXJ0aWVzLmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2VtYmVkZGVkL1Rlc3RTb2xyUHJvcGVydGllcy5qYXZhCkBAIC0xNywyMCArMTcsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLmVtYmVkZGVkOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwueHBhdGguKjsKLQoraW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcucnVsZXMuU3lzdGVtUHJvcGVydGllc1Jlc3RvcmVSdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJ5dGVTdHJlYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5Tb2xyVGVzdENhc2VKNDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLlNvbHJRdWVyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLlNvbHJTZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkFic3RyYWN0VXBkYXRlUmVxdWVzdC5BQ1RJT047Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LkNvcmVBZG1pblJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXF1ZXN0LlF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlcXVlc3QuVXBkYXRlUmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlc3BvbnNlLkNvcmVBZG1pblJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lcjsKQEAgLTQ2LDcgKzQyLDE3IEBACiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIAotaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcucnVsZXMuU3lzdGVtUHJvcGVydGllc1Jlc3RvcmVSdWxlOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIAogLyoqCiAgKgpAQCAtNzUsNiArODEsMTcgQEAKICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgIHN1cGVyLnRlYXJEb3duKCk7IAogICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wRmlsZShGaWxlIGZpbGVUb0R1bXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJEdW1waW5nICIgKyBmaWxlVG9EdW1wLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVRvRHVtcCk7CisgICAgdHJ5IHsKKyAgICAgIEJ5dGVTdHJlYW1zLmNvcHkoaXMsIFN5c3RlbS5vdXQpOworICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGlzKTsKKyAgICB9CisgIH0KICAgCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgRmlsZSBnZXRTb2xyWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMDcsNiArMTI0LDEwIEBACiAKICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIFN0cmluZyBwZXJzaXN0ZWRTb2xyWG1sID0gbmV3IEZpbGUodGVtcERpciwgU09MUl9QRVJTSVNUX1hNTCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgbG9nLmluZm8oInBlcnNpc3RlZFNvbHJYbWw6IHt9IiwgcGVyc2lzdGVkU29sclhtbCk7CisKICAgICBVcGRhdGVSZXF1ZXN0IHVwID0gbmV3IFVwZGF0ZVJlcXVlc3QoKTsKICAgICB1cC5zZXRBY3Rpb24oQUNUSU9OLkNPTU1JVCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgdXAuZGVsZXRlQnlRdWVyeSgiKjoqIik7CkBAIC0xNzYsMTQgKzE5NywxNCBAQAogICAgIGxvbmcgYWZ0ZXIgPSBtY3IuZ2V0U3RhcnRUaW1lKG5hbWUpLmdldFRpbWUoKTsKICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBtb3JlIHJlY2VudCB0aW1lOiAiICsgYWZ0ZXIgKyAiLCIgKyBiZWZvcmUsIGFmdGVyID4gYmVmb3JlKTsKIAotICAgIG1jciA9IENvcmVBZG1pblJlcXVlc3QucGVyc2lzdChTT0xSX1BFUlNJU1RfWE1MLCBjb3JlYWRtaW4pOworICAgIG1jciA9IENvcmVBZG1pblJlcXVlc3QucGVyc2lzdChwZXJzaXN0ZWRTb2xyWG1sLCBjb3JlYWRtaW4pOwogCiAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUodGVtcERpciwgU09MUl9QRVJTSVNUX1hNTCkpOworICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHBlcnNpc3RlZFNvbHJYbWwpKTsKICAgICB0cnkgewogICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGZpcyk7CiAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUodGVtcERpciwgU09MUl9QRVJTSVNUX1hNTCkpOworICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShwZXJzaXN0ZWRTb2xyWG1sKSk7CiAgICAgICBTdHJpbmcgc29sclBlcnNpc3RYbWwgPSBJT1V0aWxzLnRvU3RyaW5nKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICJVVEYtOCIpKTsKICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ4bWw6IiArIHNvbHJQZXJzaXN0WG1sKTsKICAgICAgIGFzc2VydFRydWUoIlwiL3NvbHIvY29yZXNbQGRlZmF1bHRDb3JlTmFtZT0nY29yZTAnXVwiIGRvZXNuJ3QgbWF0Y2ggaW46XG4iICsgc29sclBlcnNpc3RYbWwsCkBAIC0xOTYsMjEgKzIxNywyMiBAQAogICAgICAgICAgICAgICAgICBleGlzdHMoIi9zb2xyL2NvcmVzW0B6a0NsaWVudFRpbWVvdXQ9JzgwMDAnXSIsIGRvY3VtZW50KSk7CiAgICAgICBhc3NlcnRUcnVlKCJcIi9zb2xyL2NvcmVzW0Bob3N0Q29udGV4dD0nJHtob3N0Q29udGV4dDpzb2xyfSddXCIgZG9lc24ndCBtYXRjaCBpbjpcbiIgKyBzb2xyUGVyc2lzdFhtbCwKICAgICAgICAgICAgICAgICAgZXhpc3RzKCIvc29sci9jb3Jlc1tAaG9zdENvbnRleHQ9JyR7aG9zdENvbnRleHQ6c29scn0nXSIsIGRvY3VtZW50KSk7Ci0gICAgICAKKyAgICAgIGFzc2VydFRydWUoIlwiL3NvbHIvY29yZXNbQGdlbmVyaWNDb3JlTm9kZU5hbWVzPScke2dlbmVyaWNDb3JlTm9kZU5hbWVzOnRydWV9J11cIiBkb2Vzbid0IG1hdGNoIGluOlxuIiArIHNvbHJQZXJzaXN0WG1sLAorICAgICAgICAgIGV4aXN0cygiL3NvbHIvY29yZXNbQGdlbmVyaWNDb3JlTm9kZU5hbWVzPScke2dlbmVyaWNDb3JlTm9kZU5hbWVzOnRydWV9J10iLCBkb2N1bWVudCkpOwogICAgIH0gZmluYWxseSB7CiAgICAgICBmaXMuY2xvc2UoKTsKICAgICB9CiAgICAgCiAgICAgQ29yZUFkbWluUmVxdWVzdC5yZW5hbWVDb3JlKG5hbWUsICJyZW5hbWVkX2NvcmUiLCBjb3JlYWRtaW4pOwogICAgIAotICAgIG1jciA9IENvcmVBZG1pblJlcXVlc3QucGVyc2lzdChTT0xSX1BFUlNJU1RfWE1MLCBnZXRSZW5hbWVkU29sckFkbWluKCkpOworICAgIG1jciA9IENvcmVBZG1pblJlcXVlc3QucGVyc2lzdChwZXJzaXN0ZWRTb2xyWG1sLCBnZXRSZW5hbWVkU29sckFkbWluKCkpOwogICAgIAogLy8gICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSh0ZW1wRGlyLCBTT0xSX1BFUlNJU1RfWE1MKSk7CiAvLyAgICBTdHJpbmcgc29sclBlcnNpc3RYbWwgPSBJT1V0aWxzLnRvU3RyaW5nKGZpcyk7CiAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbDoiICsgc29sclBlcnNpc3RYbWwpOwogLy8gICAgZmlzLmNsb3NlKCk7CiAgICAgCi0gICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSh0ZW1wRGlyLCBTT0xSX1BFUlNJU1RfWE1MKSk7CisgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShwZXJzaXN0ZWRTb2xyWG1sKSk7CiAgICAgdHJ5IHsKICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShmaXMpOwogICAgICAgYXNzZXJ0VHJ1ZShleGlzdHMoIi9zb2xyL2NvcmVzL2NvcmVbQG5hbWU9J3JlbmFtZWRfY29yZSddIiwgZG9jdW1lbnQpKTsKQEAgLTIzNCwxNyArMjU2LDE3IEBACiAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbDoiICsgc29sclBlcnNpc3RYbWwpOwogLy8gICAgZmlzLmNsb3NlKCk7CiAgICAgCi0gICAgbWNyID0gQ29yZUFkbWluUmVxdWVzdC5wZXJzaXN0KFNPTFJfUEVSU0lTVF9YTUwsIGdldFJlbmFtZWRTb2xyQWRtaW4oKSk7CisgICAgbWNyID0gQ29yZUFkbWluUmVxdWVzdC5wZXJzaXN0KHBlcnNpc3RlZFNvbHJYbWwsIGdldFJlbmFtZWRTb2xyQWRtaW4oKSk7CiAgICAgCiAvLyAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHNvbHJYbWwuZ2V0UGFyZW50KCksIFNPTFJfUEVSU0lTVF9YTUwpKTsKIC8vICAgIHNvbHJQZXJzaXN0WG1sID0gSU9VdGlscy50b1N0cmluZyhmaXMpOwogLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWw6IiArIHNvbHJQZXJzaXN0WG1sKTsKIC8vICAgIGZpcy5jbG9zZSgpOwogICAgIAotICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUodGVtcERpciwgU09MUl9QRVJTSVNUX1hNTCkpOworICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUocGVyc2lzdGVkU29sclhtbCkpOwogICAgIHRyeSB7CiAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoZmlzKTsKLSAgICAgIGFzc2VydFRydWUoZXhpc3RzKCIvc29sci9jb3Jlcy9jb3JlW0BuYW1lPSdjb2xsZWN0aW9uMScgYW5kIChAaW5zdGFuY2VEaXI9Jy4vJyBvciBAaW5zdGFuY2VEaXI9Jy5cXCcpXSIsIGRvY3VtZW50KSk7CisgICAgICBhc3NlcnRUcnVlKGV4aXN0cygiL3NvbHIvY29yZXMvY29yZVtAbmFtZT0nY29sbGVjdGlvbjEnIGFuZCBAaW5zdGFuY2VEaXI9Jy4nXSIsIGRvY3VtZW50KSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGZpcy5jbG9zZSgpOwogICAgIH0KQEAgLTI1OCw5ICsyODAsOSBAQAogLy8gICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbDoiICsgc29sclBlcnNpc3RYbWwpOwogLy8gICBmaXMuY2xvc2UoKTsKICAgICAKLSAgICBjb3JlcyA9IG5ldyBDb3JlQ29udGFpbmVyKFNPTFJfSE9NRS5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IEZpbGUodGVtcERpciwgU09MUl9QRVJTSVNUX1hNTCkpOworICAgIGNvcmVzID0gQ29yZUNvbnRhaW5lci5jcmVhdGVBbmRMb2FkKFNPTFJfSE9NRS5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IEZpbGUocGVyc2lzdGVkU29sclhtbCkpOwogIAotICAgIG1jciA9IENvcmVBZG1pblJlcXVlc3QucGVyc2lzdChTT0xSX1BFUlNJU1RfWE1MLCBnZXRSZW5hbWVkU29sckFkbWluKCkpOworICAgIC8vbWNyID0gQ29yZUFkbWluUmVxdWVzdC5wZXJzaXN0KFNPTFJfUEVSU0lTVF9YTUwsIGdldFJlbmFtZWRTb2xyQWRtaW4oKSk7CiAgICAgCiAvLyAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShzb2xyWG1sLmdldFBhcmVudCgpLAogLy8gICAgIFNPTFJfUEVSU0lTVF9YTUwpKTsKZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Jhc2ljSHR0cFNvbHJTZXJ2ZXJUZXN0LmphdmEgYi9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9CYXNpY0h0dHBTb2xyU2VydmVyVGVzdC5qYXZhCmluZGV4IDlmMmFmNjUuLjdmZjhlZDkgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Jhc2ljSHR0cFNvbHJTZXJ2ZXJUZXN0LmphdmEKKysrIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2ltcGwvQmFzaWNIdHRwU29sclNlcnZlclRlc3QuamF2YQpAQCAtNDk1LDYgKzQ5NSwyMiBAQAogICAgIGNsaWVudC5nZXRDb25uZWN0aW9uTWFuYWdlcigpLnNodXRkb3duKCk7CiAgIH0KIAorICAvKioKKyAgICogQSB0cml2aWFsIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGUgZXhhbXBsZSBrZXlzdG9yZSB1c2VkIGZvciBTU0wgdGVzdGluZyBjYW4gYmUgCisgICAqIGZvdW5kIHVzaW5nIHRoZSBiYXNlIGNsYXNzLiB0aGlzIGhlbHBzIGZ1dHVyZS1wcm9vZiBhZ2FpbnN0IGh0ZSBwb3NzaWJpbGl0eSBvZiAKKyAgICogc29tZXRoaW5nIG1vdmluZy9icmVha2luZyB0aGVrZXlzdG9yZSBwYXRoIGluIGEgd2F5IHRoYXQgcmVzdWx0cyBpbiB0aGUgU1NMIAorICAgKiByYW5kb21pemF0aW9uIGxvZ2ljIGJlaW5nIGZvcmNlZCB0byBzaWxlbnRseSBuZXZlciB1c2UgU1NMLiAgKFdlIGNhbid0IGVuZm9yY2UgCisgICAqIHRoaXMgdHlwZSBvZiBjaGVjayBpbiB0aGUgYmFzZSBjbGFzcyBiZWNhdXNlIHRoZW4gaXQgd291bGQgbm90IGJlIHVzYWJsZSBieSBjbGllbnQgCisgICAqIGNvZGUgZGVwZW5kaW5nIG9uIHRoZSB0ZXN0IGZyYW1ld29yaworICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEV4YW1wbGVLZXlzdG9yZVBhdGgoKSB7CisgICAgYXNzZXJ0Tm90TnVsbCgiRXhhbXBsZSBrZXlzdG9yZSBpcyBudWxsLCBtZWFuaW5nIHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIGluIHRoZSAiICsKKyAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmUgb2YgdGhlIGV4YW1wbGUgY29uZmlncyBhbmQvb3IgRXh0ZXJuYWxQYXRocy5qYXZhIC0gIiArIAorICAgICAgICAgICAgICAgICAgIlNTTCByYW5kb21pemF0aW9uIGlzIGJyb2tlbiIsCisgICAgICAgICAgICAgICAgICBnZXRFeGFtcGxlS2V5c3RvcmVGaWxlKCkpOworICB9CisKKwogICBwcml2YXRlIGludCBmaW5kVW51c2VkUG9ydCgpIHsKICAgICBmb3IgKGludCBwb3J0ID0gMDsgcG9ydCA8IDY1NTM1OyBwb3J0KyspIHsKICAgICAgIFNvY2tldCBzID0gbmV3IFNvY2tldCgpOwpkaWZmIC0tZ2l0IGEvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2ltcGwvQ2xvdWRTb2xyU2VydmVyVGVzdC5qYXZhIGIvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL2ltcGwvQ2xvdWRTb2xyU2VydmVyVGVzdC5qYXZhCmluZGV4IGM2Y2I2OGYuLjNmOTllYWEgMTAwNjQ0Ci0tLSBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9pbXBsL0Nsb3VkU29sclNlcnZlclRlc3QuamF2YQorKysgYi9zb2xyL3NvbHJqL3NyYy90ZXN0L29yZy9hcGFjaGUvc29sci9jbGllbnQvc29scmovaW1wbC9DbG91ZFNvbHJTZXJ2ZXJUZXN0LmphdmEKQEAgLTEwMiwzNSArMTAyLDM5IEBACiAKICAgICBpbmRleHIoaWQsIDAsICJhX3QiLCAidG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIik7CiAgICAgCi0gICAgLy8gY29tcGFyZSBsZWFkZXJzIGxpc3QKICAgICBDbG91ZEpldHR5UnVubmVyIHNoYXJkMUxlYWRlciA9IHNoYXJkVG9MZWFkZXJKZXR0eS5nZXQoInNoYXJkMSIpOwogICAgIENsb3VkSmV0dHlSdW5uZXIgc2hhcmQyTGVhZGVyID0gc2hhcmRUb0xlYWRlckpldHR5LmdldCgic2hhcmQyIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGNsb3VkQ2xpZW50LmdldExlYWRlclVybExpc3RzKCkuZ2V0KCJjb2xsZWN0aW9uMSIpLnNpemUoKSk7Ci0gICAgSGFzaFNldDxTdHJpbmc+IGxlYWRlclVybFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBsZWFkZXJVcmxTZXQuYWRkQWxsKGNsb3VkQ2xpZW50LmdldExlYWRlclVybExpc3RzKCkuZ2V0KCJjb2xsZWN0aW9uMSIpKTsKLSAgICBhc3NlcnRUcnVlKCJmYWlsIGNoZWNrIGZvciBsZWFkZXI6IiArIHNoYXJkMUxlYWRlci51cmwgKyAiIGluICIKLSAgICAgICAgKyBsZWFkZXJVcmxTZXQsIGxlYWRlclVybFNldC5jb250YWlucyhzaGFyZDFMZWFkZXIudXJsICsgIi8iKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiZmFpbCBjaGVjayBmb3IgbGVhZGVyOiIgKyBzaGFyZDJMZWFkZXIudXJsICsgIiBpbiAiCi0gICAgICAgICsgbGVhZGVyVXJsU2V0LCBsZWFkZXJVcmxTZXQuY29udGFpbnMoc2hhcmQyTGVhZGVyLnVybCArICIvIikpOwotCi0gICAgLy8gY29tcGFyZSByZXBsaWNhcyBsaXN0Ci0gICAgU2V0PFN0cmluZz4gcmVwbGljYXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgTGlzdDxDbG91ZEpldHR5UnVubmVyPiBqZXR0aWVzID0gc2hhcmRUb0pldHR5LmdldCgic2hhcmQxIik7Ci0gICAgZm9yIChDbG91ZEpldHR5UnVubmVyIGNqZXR0eSA6IGpldHRpZXMpIHsKLSAgICAgIHJlcGxpY2FzLmFkZChjamV0dHkudXJsKTsKLSAgICB9Ci0gICAgamV0dGllcyA9IHNoYXJkVG9KZXR0eS5nZXQoInNoYXJkMiIpOwotICAgIGZvciAoQ2xvdWRKZXR0eVJ1bm5lciBjamV0dHkgOiBqZXR0aWVzKSB7Ci0gICAgICByZXBsaWNhcy5hZGQoY2pldHR5LnVybCk7Ci0gICAgfQotICAgIHJlcGxpY2FzLnJlbW92ZShzaGFyZDFMZWFkZXIudXJsKTsKLSAgICByZXBsaWNhcy5yZW1vdmUoc2hhcmQyTGVhZGVyLnVybCk7CiAgICAgCi0gICAgYXNzZXJ0RXF1YWxzKHJlcGxpY2FzLnNpemUoKSwgY2xvdWRDbGllbnQuZ2V0UmVwbGljYXNMaXN0cygpLmdldCgiY29sbGVjdGlvbjEiKS5zaXplKCkpOwotICAgIAotICAgIGZvciAoU3RyaW5nIHVybCA6IGNsb3VkQ2xpZW50LmdldFJlcGxpY2FzTGlzdHMoKS5nZXQoImNvbGxlY3Rpb24xIikpIHsKLSAgICAgIGFzc2VydFRydWUoImZhaWwgY2hlY2sgZm9yIHJlcGxpY2E6IiArIHVybCArICIgaW4gIiArIHJlcGxpY2FzLAotICAgICAgICAgIHJlcGxpY2FzLmNvbnRhaW5zKHN0cmlwVHJhaWxpbmdTbGFzaCh1cmwpKSk7CisgICAgaWYgKGNsb3VkQ2xpZW50LmlzVXBkYXRlc1RvTGVhZGVycygpKSB7CisgICAgICAvLyBjb21wYXJlIGxlYWRlcnMgbGlzdAorICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsb3VkQ2xpZW50LmdldExlYWRlclVybExpc3RzKCkuZ2V0KCJjb2xsZWN0aW9uMSIpLnNpemUoKSk7CisgICAgICBIYXNoU2V0PFN0cmluZz4gbGVhZGVyVXJsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgbGVhZGVyVXJsU2V0LmFkZEFsbChjbG91ZENsaWVudC5nZXRMZWFkZXJVcmxMaXN0cygpLmdldCgiY29sbGVjdGlvbjEiKSk7CisgICAgICBhc3NlcnRUcnVlKCJmYWlsIGNoZWNrIGZvciBsZWFkZXI6IiArIHNoYXJkMUxlYWRlci51cmwgKyAiIGluICIKKyAgICAgICAgICArIGxlYWRlclVybFNldCwgbGVhZGVyVXJsU2V0LmNvbnRhaW5zKHNoYXJkMUxlYWRlci51cmwgKyAiLyIpKTsKKyAgICAgIGFzc2VydFRydWUoImZhaWwgY2hlY2sgZm9yIGxlYWRlcjoiICsgc2hhcmQyTGVhZGVyLnVybCArICIgaW4gIgorICAgICAgICAgICsgbGVhZGVyVXJsU2V0LCBsZWFkZXJVcmxTZXQuY29udGFpbnMoc2hhcmQyTGVhZGVyLnVybCArICIvIikpOworICAgICAgCisgICAgICAvLyBjb21wYXJlIHJlcGxpY2FzIGxpc3QKKyAgICAgIFNldDxTdHJpbmc+IHJlcGxpY2FzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgTGlzdDxDbG91ZEpldHR5UnVubmVyPiBqZXR0aWVzID0gc2hhcmRUb0pldHR5LmdldCgic2hhcmQxIik7CisgICAgICBmb3IgKENsb3VkSmV0dHlSdW5uZXIgY2pldHR5IDogamV0dGllcykgeworICAgICAgICByZXBsaWNhcy5hZGQoY2pldHR5LnVybCk7CisgICAgICB9CisgICAgICBqZXR0aWVzID0gc2hhcmRUb0pldHR5LmdldCgic2hhcmQyIik7CisgICAgICBmb3IgKENsb3VkSmV0dHlSdW5uZXIgY2pldHR5IDogamV0dGllcykgeworICAgICAgICByZXBsaWNhcy5hZGQoY2pldHR5LnVybCk7CisgICAgICB9CisgICAgICByZXBsaWNhcy5yZW1vdmUoc2hhcmQxTGVhZGVyLnVybCk7CisgICAgICByZXBsaWNhcy5yZW1vdmUoc2hhcmQyTGVhZGVyLnVybCk7CisgICAgICAKKyAgICAgIGFzc2VydEVxdWFscyhyZXBsaWNhcy5zaXplKCksCisgICAgICAgICAgY2xvdWRDbGllbnQuZ2V0UmVwbGljYXNMaXN0cygpLmdldCgiY29sbGVjdGlvbjEiKS5zaXplKCkpOworICAgICAgCisgICAgICBmb3IgKFN0cmluZyB1cmwgOiBjbG91ZENsaWVudC5nZXRSZXBsaWNhc0xpc3RzKCkuZ2V0KCJjb2xsZWN0aW9uMSIpKSB7CisgICAgICAgIGFzc2VydFRydWUoImZhaWwgY2hlY2sgZm9yIHJlcGxpY2E6IiArIHVybCArICIgaW4gIiArIHJlcGxpY2FzLAorICAgICAgICAgICAgcmVwbGljYXMuY29udGFpbnMoc3RyaXBUcmFpbGluZ1NsYXNoKHVybCkpKTsKKyAgICAgIH0KICAgICB9CiAgICAgCiAgIH0KZGlmZiAtLWdpdCBhL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9yZXF1ZXN0L1Rlc3RDb3JlQWRtaW4uamF2YSBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9yZXF1ZXN0L1Rlc3RDb3JlQWRtaW4uamF2YQppbmRleCBlNDMyYmRjLi42ODFlNWY5YiAxMDA2NDQKLS0tIGEvc29sci9zb2xyai9zcmMvdGVzdC9vcmcvYXBhY2hlL3NvbHIvY2xpZW50L3NvbHJqL3JlcXVlc3QvVGVzdENvcmVBZG1pbi5qYXZhCisrKyBiL3NvbHIvc29scmovc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zb2xyL2NsaWVudC9zb2xyai9yZXF1ZXN0L1Rlc3RDb3JlQWRtaW4uamF2YQpAQCAtMTcsOCArMTcsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmoucmVxdWVzdDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQoraW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuYW5ub3RhdGlvbnMuVGhyZWFkTGVha0ZpbHRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuU29scklnbm9yZWRUaHJlYWRzRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouU29sclNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLmVtYmVkZGVkLkFic3RyYWN0RW1iZWRkZWRTb2xyU2VydmVyVGVzdENhc2U7CkBAIC0yNywxNCArMjcsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Nb2RpZmlhYmxlU29sclBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrRmlsdGVyczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIEBUaHJlYWRMZWFrRmlsdGVycyhkZWZhdWx0RmlsdGVycyA9IHRydWUsIGZpbHRlcnMgPSB7U29scklnbm9yZWRUaHJlYWRzRmlsdGVyLmNsYXNzfSkKIHB1YmxpYyBjbGFzcyBUZXN0Q29yZUFkbWluIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZFNvbHJTZXJ2ZXJUZXN0Q2FzZSB7CkBAIC02Nyw2ICs2Niw4IEBACiAgICAgCiAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZShURU1QX0RJUiwgInNvbHJ0ZXN0LSIgKyBnZXRUZXN0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgdG1wLm1rZGlycygpOworCisgICAgbG9nLmluZm8oIkNyZWF0aW5nIGNvcmVzIHVuZGVybmVhdGgge30iLCB0bXApOwogICAgIAogICAgIEZpbGUgZGF0YURpciA9IG5ldyBGaWxlKHRtcCwgdGhpcy5nZXRUZXN0TmFtZSgpCiAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLSIgKyAiZGF0YSIpOwpAQCAtMTAzLDcgKzEwNCw3IEBACiAKICAgICBGaWxlIGxvZ0RpcjsKICAgICB0cnkgewotICAgICAgbG9nRGlyID0gY29yZS5nZXRVcGRhdGVIYW5kbGVyKCkuZ2V0VXBkYXRlTG9nKCkuZ2V0TG9nRGlyKCk7CisgICAgICBsb2dEaXIgPSBuZXcgRmlsZShjb3JlLmdldFVwZGF0ZUhhbmRsZXIoKS5nZXRVcGRhdGVMb2coKS5nZXRMb2dEaXIoKSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGNvcmVQcm92ZUl0LmNsb3NlKCk7CiAgICAgICBjb3JlLmNsb3NlKCk7CmRpZmYgLS1naXQgYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL2l2eS54bWwgYi9zb2xyL3Rlc3QtZnJhbWV3b3JrL2l2eS54bWwKaW5kZXggM2RlMDgyMi4uNDYxZDFjZCAxMDA2NDQKLS0tIGEvc29sci90ZXN0LWZyYW1ld29yay9pdnkueG1sCisrKyBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvaXZ5LnhtbApAQCAtMTYsNyArMTYsMTAgQEAKICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKIC0tPgotPGl2eS1tb2R1bGUgdmVyc2lvbj0iMi4wIj4KKzwhRE9DVFlQRSBpdnktbW9kdWxlIFsKKyAgPCFFTlRJVFkgaGFkb29wLnZlcnNpb24gIjIuMC41LWFscGhhIj4KK10+Cis8aXZ5LW1vZHVsZSB2ZXJzaW9uPSIyLjAiIHhtbG5zOm09Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvbWF2ZW4iPgogICAgIDxpbmZvIG9yZ2FuaXNhdGlvbj0ib3JnLmFwYWNoZS5zb2xyIiBtb2R1bGU9InNvbHItdGVzdC1mcmFtZXdvcmsiLz4KIAogICAgIDxjb25maWd1cmF0aW9ucz4KQEAgLTMxLDEwICszNCwyNCBAQAogICAgIDxkZXBlbmRlbmNpZXMgZGVmYXVsdGNvbmY9ImRlZmF1bHQiPgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLmFudCIgbmFtZT0iYW50IiByZXY9IjEuOC4yIiB0cmFuc2l0aXZlPSJmYWxzZSIgLz4KIAotICAgICAgPGRlcGVuZGVuY3kgb3JnPSJqdW5pdCIgbmFtZT0ianVuaXQiIHJldj0iNC4xMCIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNvbmY9ImRlZmF1bHQtPio7anVuaXQ0LXN0ZGFsb25lLT4qIiAvPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJqdW5pdCIgbmFtZT0ianVuaXQiIHJldj0iNC4xMCIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNvbmY9ImRlZmF1bHQtPio7anVuaXQ0LXN0ZGFsb25lLT4qIj4KKyAgICAgICAgPGV4Y2x1ZGUgb3JnPSJvcmcuaGFtY3Jlc3QiIG1vZHVsZT0iaGFtY3Jlc3QtY29yZSIvPgorICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nIiBuYW1lPSJqdW5pdDQtYW50IiByZXY9IjIuMC4xMCIgdHJhbnNpdGl2ZT0iZmFsc2UiIGNvbmY9ImRlZmF1bHQtPio7anVuaXQ0LXN0ZGFsb25lLT4qIiAvPgogICAgICAgPGRlcGVuZGVuY3kgb3JnPSJjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nIiBuYW1lPSJyYW5kb21pemVkdGVzdGluZy1ydW5uZXIiIHJldj0iMi4wLjEwIiB0cmFuc2l0aXZlPSJmYWxzZSIgY29uZj0iZGVmYXVsdC0+KjtqdW5pdDQtc3RkYWxvbmUtPioiIC8+CiAKKyAgICAgIDwhLS0gSGFkb29wIERmc01pbmlDbHVzdGVyIERlcGVuZGVuY2llcy0tPgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLmhhZG9vcCIgbmFtZT0iaGFkb29wLWNvbW1vbiIgdHJhbnNpdGl2ZT0iZmFsc2UiIHJldj0iJmhhZG9vcC52ZXJzaW9uOyIgY29uZj0iZGVmYXVsdC0+KjtqdW5pdDQtc3RkYWxvbmUtPioiPgorICAgICAgICA8YXJ0aWZhY3QgbmFtZT0iaGFkb29wLWNvbW1vbiIgdHlwZT0idGVzdHMiIGV4dD0iamFyIiBtOmNsYXNzaWZpZXI9InRlc3RzIiAvPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcuYXBhY2hlLmhhZG9vcCIgbmFtZT0iaGFkb29wLWhkZnMiIHRyYW5zaXRpdmU9ImZhbHNlIiByZXY9IiZoYWRvb3AudmVyc2lvbjsiIGNvbmY9ImRlZmF1bHQtPio7anVuaXQ0LXN0ZGFsb25lLT4qIj4KKyAgICAgICAgPGFydGlmYWN0IG5hbWU9ImhhZG9vcC1oZGZzIiB0eXBlPSJ0ZXN0cyIgZXh0PSJqYXIiIG06Y2xhc3NpZmllcj0idGVzdHMiIC8+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5tb3J0YmF5LmpldHR5IiBuYW1lPSJqZXR0eSIgcmV2PSI2LjEuMjYiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5tb3J0YmF5LmpldHR5IiBuYW1lPSJqZXR0eS11dGlsIiByZXY9IjYuMS4yNiIgdHJhbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICAgIDxkZXBlbmRlbmN5IG9yZz0iY29tLnN1bi5qZXJzZXkiIG5hbWU9ImplcnNleS1jb3JlIiByZXY9IjEuMTYiIHRyYW5zaXRpdmU9ImZhbHNlIi8+CisgICAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbW1vbnMtY29sbGVjdGlvbnMiIG5hbWU9ImNvbW1vbnMtY29sbGVjdGlvbnMiIHJldj0iMy4yLjEiIHRyYW5zaXRpdmU9ImZhbHNlIi8+ICAKKyAgICAgIAogICAgICAgPGV4Y2x1ZGUgb3JnPSIqIiBleHQ9IioiIG1hdGNoZXI9InJlZ2V4cCIgdHlwZT0iJHtpdnkuZXhjbHVkZS50eXBlc30iLz4gCiAgICAgPC9kZXBlbmRlbmNpZXM+CiA8L2l2eS1tb2R1bGU+CmRpZmYgLS1naXQgYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9CYXNlRGlzdHJpYnV0ZWRTZWFyY2hUZXN0Q2FzZS5qYXZhIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvQmFzZURpc3RyaWJ1dGVkU2VhcmNoVGVzdENhc2UuamF2YQppbmRleCA3NDMyNDBhLi4xYThlYmY0IDEwMDY0NAotLS0gYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9CYXNlRGlzdHJpYnV0ZWRTZWFyY2hUZXN0Q2FzZS5qYXZhCisrKyBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL0Jhc2VEaXN0cmlidXRlZFNlYXJjaFRlc3RDYXNlLmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlcXVlc3QuVXBkYXRlUmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnJlc3BvbnNlLlF1ZXJ5UmVzcG9uc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5yZXNwb25zZS5VcGRhdGVSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLlNvbHJSZXNwb25zZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJEb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJEb2N1bWVudExpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudDsKQEAgLTQyNCw2ICs0MjUsOSBAQAogICAgIGluZGV4RG9jKGRvYyk7CiAgIH0KIAorICAvKioKKyAgICogSW5kZXhlcyB0aGUgZG9jdW1lbnQgaW4gYm90aCB0aGUgY29udHJvbCBjbGllbnQsIGFuZCBhIHJhbmRvbWx5IHNlbGVjdGVkIGNsaWVudAorICAgKi8KICAgcHJvdGVjdGVkIHZvaWQgaW5kZXhEb2MoU29scklucHV0RG9jdW1lbnQgZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNvbHJTZXJ2ZXJFeGNlcHRpb24gewogICAgIGNvbnRyb2xDbGllbnQuYWRkKGRvYyk7CiAKQEAgLTQzMiw2ICs0MzYsMTcgQEAKICAgICBjbGllbnQuYWRkKGRvYyk7CiAgIH0KICAgCisgIC8qKgorICAgKiBJbmRleGVzIHRoZSBkb2N1bWVudCBpbiBib3RoIHRoZSBjb250cm9sIGNsaWVudCBhbmQgdGhlIHNwZWNpZmllZCBjbGllbnQgYXNzZXJ0aW5nCisgICAqIHRoYXQgdGhlIHJlc3BvbmVzIGFyZSBlcXVpdmlsZW50CisgICAqLworICBwcm90ZWN0ZWQgVXBkYXRlUmVzcG9uc2UgaW5kZXhEb2MoU29sclNlcnZlciBzZXJ2ZXIsIFNvbHJQYXJhbXMgcGFyYW1zLCBTb2xySW5wdXREb2N1bWVudC4uLiBzZG9jcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTb2xyU2VydmVyRXhjZXB0aW9uIHsKKyAgICBVcGRhdGVSZXNwb25zZSBjb250cm9sUnNwID0gYWRkKGNvbnRyb2xDbGllbnQsIHBhcmFtcywgc2RvY3MpOworICAgIFVwZGF0ZVJlc3BvbnNlIHNwZWNpZmljUnNwID0gYWRkKHNlcnZlciwgcGFyYW1zLCBzZG9jcyk7CisgICAgY29tcGFyZVNvbHJSZXNwb25zZXMoc3BlY2lmaWNSc3AsIGNvbnRyb2xSc3ApOworICAgIHJldHVybiBzcGVjaWZpY1JzcDsKKyAgfQorCiAgIHByb3RlY3RlZCBVcGRhdGVSZXNwb25zZSBhZGQoU29sclNlcnZlciBzZXJ2ZXIsIFNvbHJQYXJhbXMgcGFyYW1zLCBTb2xySW5wdXREb2N1bWVudC4uLiBzZG9jcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTb2xyU2VydmVyRXhjZXB0aW9uIHsKICAgICBVcGRhdGVSZXF1ZXN0IHVyZXEgPSBuZXcgVXBkYXRlUmVxdWVzdCgpOwogICAgIHVyZXEuc2V0UGFyYW1zKG5ldyBNb2RpZmlhYmxlU29sclBhcmFtcyhwYXJhbXMpKTsKQEAgLTU0Niw2ICs1NjEsOSBAQAogICB9CiAgIAogICBwdWJsaWMgUXVlcnlSZXNwb25zZSBxdWVyeUFuZENvbXBhcmUoU29sclBhcmFtcyBwYXJhbXMsIFNvbHJTZXJ2ZXIuLi4gc2VydmVycykgdGhyb3dzIFNvbHJTZXJ2ZXJFeGNlcHRpb24geworICAgIHJldHVybiBxdWVyeUFuZENvbXBhcmUocGFyYW1zLCBBcnJheXMuPFNvbHJTZXJ2ZXI+YXNMaXN0KHNlcnZlcnMpKTsKKyAgfQorICBwdWJsaWMgUXVlcnlSZXNwb25zZSBxdWVyeUFuZENvbXBhcmUoU29sclBhcmFtcyBwYXJhbXMsIEl0ZXJhYmxlPFNvbHJTZXJ2ZXI+IHNlcnZlcnMpIHRocm93cyBTb2xyU2VydmVyRXhjZXB0aW9uIHsKICAgICBRdWVyeVJlc3BvbnNlIGZpcnN0ID0gbnVsbDsKICAgICBmb3IgKFNvbHJTZXJ2ZXIgc2VydmVyIDogc2VydmVycykgewogICAgICAgUXVlcnlSZXNwb25zZSByc3AgPSBzZXJ2ZXIucXVlcnkobmV3IE1vZGlmaWFibGVTb2xyUGFyYW1zKHBhcmFtcykpOwpAQCAtNzgzLDggKzgwMSwxNCBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKKyAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVNvbHJSZXNwb25zZXMoU29sclJlc3BvbnNlIGEsIFNvbHJSZXNwb25zZSBiKSB7CisgICAgU3RyaW5nIGNtcCA9IGNvbXBhcmUoYS5nZXRSZXNwb25zZSgpLCBiLmdldFJlc3BvbnNlKCksIGZsYWdzLCBoYW5kbGUpOworICAgIGlmIChjbXAgIT0gbnVsbCkgeworICAgICAgbG9nLmVycm9yKCJNaXNtYXRjaGVkIHJlc3BvbnNlczpcbiIgKyBhICsgIlxuIiArIGIpOworICAgICAgQXNzZXJ0LmZhaWwoY21wKTsKKyAgICB9CisgIH0KICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVJlc3BvbnNlcyhRdWVyeVJlc3BvbnNlIGEsIFF1ZXJ5UmVzcG9uc2UgYikgewotICAgIFN0cmluZyBjbXA7CiAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgicmVtb3ZlLnZlcnNpb24uZmllbGQiKSAhPSBudWxsKSB7CiAgICAgICAvLyB3ZSBkb24ndCBjYXJlIGlmIG9uZSBoYXMgYSB2ZXJzaW9uIGFuZCB0aGUgb3RoZXIgZG9lc250IC0KICAgICAgIC8vIGNvbnRyb2wgdnMgZGlzdHJpYgpAQCAtODAwLDExICs4MjQsNyBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGNtcCA9IGNvbXBhcmUoYS5nZXRSZXNwb25zZSgpLCBiLmdldFJlc3BvbnNlKCksIGZsYWdzLCBoYW5kbGUpOwotICAgIGlmIChjbXAgIT0gbnVsbCkgewotICAgICAgbG9nLmVycm9yKCJNaXNtYXRjaGVkIHJlc3BvbnNlczpcbiIgKyBhICsgIlxuIiArIGIpOwotICAgICAgQXNzZXJ0LmZhaWwoY21wKTsKLSAgICB9CisgICAgY29tcGFyZVNvbHJSZXNwb25zZXMoYSwgYik7CiAgIH0KIAogICBAVGVzdApkaWZmIC0tZ2l0IGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sckpldHR5VGVzdEJhc2UuamF2YSBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL1NvbHJKZXR0eVRlc3RCYXNlLmphdmEKaW5kZXggM2Q2MTljNC4uZmVhZTgyYSAxMDA3NTUKLS0tIGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sckpldHR5VGVzdEJhc2UuamF2YQorKysgYi9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9Tb2xySmV0dHlUZXN0QmFzZS5qYXZhCkBAIC00NCwxOCArNDQsMzIgQEAKICAgcHVibGljIFN0cmluZyBnZXRTb2xySG9tZSgpIHsgcmV0dXJuIEV4dGVybmFsUGF0aHMuRVhBTVBMRV9IT01FOyB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYW5hZ2VTc2xQcm9wcyA9IHRydWU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgVEVTVF9LRVlTVE9SRSA9IG5ldyBGaWxlKEV4dGVybmFsUGF0aHMuU09VUkNFX0hPTUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZS9ldGMvc29scnRlc3Qua2V5c3RvcmUiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBURVNUX0tFWVNUT1JFOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gU1NMX1BST1BTID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKICAgc3RhdGljIHsKKyAgICBURVNUX0tFWVNUT1JFID0gKG51bGwgPT0gRXh0ZXJuYWxQYXRocy5TT1VSQ0VfSE9NRSkKKyAgICAgID8gbnVsbCA6IG5ldyBGaWxlKEV4dGVybmFsUGF0aHMuU09VUkNFX0hPTUUsICJleGFtcGxlL2V0Yy9zb2xydGVzdC5rZXlzdG9yZSIpOworICAgIFN0cmluZyBrZXlzdG9yZVBhdGggPSBudWxsID09IFRFU1RfS0VZU1RPUkUgPyBudWxsIDogVEVTVF9LRVlTVE9SRS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwogICAgIFNTTF9QUk9QUy5wdXQoInRlc3RzLmpldHR5U3NsIiwiZmFsc2UiKTsKICAgICBTU0xfUFJPUFMucHV0KCJ0ZXN0cy5qZXR0eVNzbC5jbGllbnRBdXRoIiwiZmFsc2UiKTsKLSAgICBTU0xfUFJPUFMucHV0KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwgVEVTVF9LRVlTVE9SRS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgU1NMX1BST1BTLnB1dCgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIGtleXN0b3JlUGF0aCk7CiAgICAgU1NMX1BST1BTLnB1dCgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiwic2VjcmV0Iik7Ci0gICAgU1NMX1BST1BTLnB1dCgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgVEVTVF9LRVlTVE9SRS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgU1NMX1BST1BTLnB1dCgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwga2V5c3RvcmVQYXRoKTsKICAgICBTU0xfUFJPUFMucHV0KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIsInNlY3JldCIpOwogICB9CiAKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEZpbGUgb2JqZWN0IGZvciB0aGUgZXhhbXBsZSBrZXlzdG9yZSB1c2VkIHdoZW4gdGhpcyBiYXNlY2xhc3MgcmFuZG9tbHkgCisgICAqIHVzZXMgU1NMLiAgTWF5IGJlIG51bGwgaWZ0aGlzIHRlc3QgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJ1bm5pbmcgYXMgcGFydCBvZiB0aGUgCisgICAqIHN0YW5kYXJkIHNvbHIgZGlzdHJpYnV0aW9uIGFuZCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZXhhbXBsZSBjb25maWdzLgorICAgKgorICAgKiBAbHVjZW5lLmludGVybmFsIAorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGdldEV4YW1wbGVLZXlzdG9yZUZpbGUoKSB7CisgICAgcmV0dXJuIFRFU1RfS0VZU1RPUkU7CisgIH0KKwogICBAQmVmb3JlQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVNvbHJKZXR0eVRlc3RCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKQEAgLTYzLDIwICs3NywyNyBAQAogICAgIGZpbmFsIGJvb2xlYW4gdHJ5U3NsID0gcmFuZG9tKCkubmV4dEJvb2xlYW4oKTsKICAgICBmaW5hbCBib29sZWFuIHRyeVNzbENsaWVudEF1dGggPSByYW5kb20oKS5uZXh0Qm9vbGVhbigpOwogICAgIAorICAgIC8vIG9ubHkgcmFuZG9taXplIFNTTCBpZiB3ZSBhcmUgYSBzb2xyIHRlc3Qgd2l0aCBhY2Nlc3MgdG8gdGhlIGV4YW1wbGUga2V5c3RvcmUKKyAgICBpZiAobnVsbCA9PSBnZXRFeGFtcGxlS2V5c3RvcmVGaWxlKCkpIHsKKyAgICAgIGxvZy5pbmZvKCJTb2xyJ3MgZXhhbXBsZSBrZXlzdG9yZSBub3QgZGVmaW5lZCAobm90IGEgc29sciB0ZXN0Pykgc2tpcHBpbmcgU1NMIHJhbmRvbWl6YXRpb24iKTsKKyAgICAgIG1hbmFnZVNzbFByb3BzID0gZmFsc2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0VHJ1ZSgidGVzdCBrZXlzdG9yZSBkb2VzIG5vdCBleGlzdCwgcmFuZG9taXplZCBzc2wgdGVzdGluZyBicm9rZW46ICIgKworICAgICAgICAgICAgICAgZ2V0RXhhbXBsZUtleXN0b3JlRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLCAKKyAgICAgICAgICAgICAgIGdldEV4YW1wbGVLZXlzdG9yZUZpbGUoKS5leGlzdHMoKSApOworICAgIAogICAgIC8vIG9ubHkgcmFuZG9taXplIFNTTCBpZiBub25lIG9mIHRoZSBTU0xfUFJPUFMgYXJlIGFscmVhZHkgc2V0CiAgICAgZmluYWwgTWFwPE9iamVjdCxPYmplY3Q+IHN5c3Byb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKICAgICBmb3IgKFN0cmluZyBwcm9wIDogU1NMX1BST1BTLmtleVNldCgpKSB7CiAgICAgICBpZiAoc3lzcHJvcHMuY29udGFpbnNLZXkocHJvcCkpIHsKICAgICAgICAgbG9nLmluZm8oIlN5c3RlbSBwcm9wZXJ0eSBleHBsaWNpdGx5IHNldCwgc28gc2tpcHBpbmcgcmFuZG9taXplZCBzc2wgcHJvcGVydGllczogIiArIHByb3ApOwogICAgICAgICBtYW5hZ2VTc2xQcm9wcyA9IGZhbHNlOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KIAotICAgIGFzc2VydFRydWUoInRlc3Qga2V5c3RvcmUgZG9lcyBub3QgZXhpc3QsIGNhbid0IGJlIHVzZWQgZm9yIHJhbmRvbWl6ZWQgIiArCi0gICAgICAgICAgICAgICAic3NsIHRlc3Rpbmc6ICIgKyBURVNUX0tFWVNUT1JFLmdldEFic29sdXRlUGF0aCgpLCAKLSAgICAgICAgICAgICAgIFRFU1RfS0VZU1RPUkUuZXhpc3RzKCkgKTsKLQogICAgIGlmIChtYW5hZ2VTc2xQcm9wcykgewogICAgICAgbG9nLmluZm8oIlJhbmRvbWl6ZWQgc3NsICh7fSkgYW5kIGNsaWVudEF1dGggKHt9KSIsIHRyeVNzbCwgdHJ5U3NsQ2xpZW50QXV0aCk7CiAgICAgICBmb3IgKFN0cmluZyBwcm9wIDogU1NMX1BST1BTLmtleVNldCgpKSB7CmRpZmYgLS1naXQgYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9Tb2xyVGVzdENhc2VKNC5qYXZhIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvU29sclRlc3RDYXNlSjQuamF2YQppbmRleCA5NzJlNjAxLi4zZWRhNTVmIDEwMDc1NQotLS0gYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9Tb2xyVGVzdENhc2VKNC5qYXZhCisrKyBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL1NvbHJUZXN0Q2FzZUo0LmphdmEKQEAgLTE3LDI2ICsxNywyOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuc29scjsKIAotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQoraW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuUmFuZG9taXplZENvbnRleHQ7CitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrRmlsdGVyczsKK2ltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLnJ1bGVzLlN5c3RlbVByb3BlcnRpZXNSZXN0b3JlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnV0aWwuTHVjZW5lVGVzdENhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUudXRpbC5RdWlja1BhdGNoVGhyZWFkc0ZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY2xpZW50LnNvbHJqLnV0aWwuQ2xpZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi4qOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29sckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLlNvbHJJbnB1dERvY3VtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5jbG91ZC5Tb2xyWmtDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnBhcmFtcy5Db21tb25QYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuTW9kaWZpYWJsZVNvbHJQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5wYXJhbXMuU29sclBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuWE1MOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvcmVDb250YWluZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyQ29yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuaGFuZGxlci5Kc29uVXBkYXRlUmVxdWVzdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Mb2NhbFNvbHJRdWVyeVJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUmVxdWVzdEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLlNjaGVtYUZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5zZWFyY2guU29sckluZGV4U2VhcmNoZXI7CkBAIC00NCw3ICs0NiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLkFic3RyYWN0U29sclRlc3RDYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci51dGlsLlJldmVydERlZmF1bHRUaHJlYWRIYW5kbGVyUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIudXRpbC5UZXN0SGFybmVzczsKLWltcG9ydCBvcmcuanVuaXQuKjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkNsYXNzUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQucnVsZXMuUnVsZUNoYWluOwogaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKIGltcG9ydCBvcmcubm9nZ2l0LkNoYXJBcnI7CkBAIC01NCw5ICs1OSwyMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAotaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2gucmFuZG9taXplZHRlc3RpbmcuUmFuZG9taXplZENvbnRleHQ7Ci1pbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5yYW5kb21pemVkdGVzdGluZy5hbm5vdGF0aW9ucy5UaHJlYWRMZWFrRmlsdGVyczsKLWltcG9ydCBjb20uY2Fycm90c2VhcmNoLnJhbmRvbWl6ZWR0ZXN0aW5nLnJ1bGVzLlN5c3RlbVByb3BlcnRpZXNSZXN0b3JlUnVsZTsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CiAKIC8qKgogICogQSBqdW5pdDQgU29sciB0ZXN0IGhhcm5lc3MgdGhhdCBleHRlbmRzIEx1Y2VuZVRlc3RDYXNlSjQuIFRvIGNoYW5nZSB3aGljaCBjb3JlIGlzIHVzZWQgd2hlbiBsb2FkaW5nIHRoZSBzY2hlbWEgYW5kIHNvbHJjb25maWcueG1sLCBzaW1wbHkKQEAgLTg2LDYgKzEwNCw5IEBACiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICBwcml2YXRlIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgewogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamV0dHkudGVzdE1vZGUiLCAidHJ1ZSIpOworICAgIAorICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgidXNlQ29tcG91bmRGaWxlIiwgQm9vbGVhbi50b1N0cmluZyhyYW5kb20oKS5uZXh0Qm9vbGVhbigpKSk7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbmFibGUudXBkYXRlLmxvZyIsIHVzdWFsbHkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgidGVzdHMuc2hhcmRoYW5kbGVyLnJhbmRvbVNlZWQiLCBMb25nLnRvU3RyaW5nKHJhbmRvbSgpLm5leHRMb25nKCkpKTsKICAgICBzZXR1cExvZ2dpbmcoKTsKICAgICBzdGFydFRyYWNraW5nU2VhcmNoZXJzKCk7CkBAIC0xMDQsNiArMTI1LDggQEAKICAgICBjb3JlTmFtZSA9IENvcmVDb250YWluZXIuREVGQVVMVF9ERUZBVUxUX0NPUkVfTkFNRTsKICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiamV0dHkudGVzdE1vZGUiKTsKICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgidGVzdHMuc2hhcmRoYW5kbGVyLnJhbmRvbVNlZWQiKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiZW5hYmxlLnVwZGF0ZS5sb2ciKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgidXNlQ29tcG91bmRGaWxlIik7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoYW5nZWRGYWN0b3J5ID0gZmFsc2U7CkBAIC0zNDAsNiArMzYzLDkgQEAKICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIHN0b3J5IHRoZSBpbmRleCBtYW5hZ2VkIGJ5IHRoZSBUZXN0SGFybmVzcyBoCiAgICAqLwogICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZGF0YURpcjsKKyAgCisgIC8vIGhhY2sgZHVlIHRvIEZpbGUgZGF0YURpcgorICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBoZGZzRGF0YURpcjsKIAogICAvKioKICAgICogSW5pdGlhbGl6ZXMgdGhpbmdzIHlvdXIgdGVzdCBtaWdodCBuZWVkCkBAIC0zOTAsMTQgKzQxNiw0NyBAQAogICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQ29yZSgpIHsKICAgICBhc3NlcnROb3ROdWxsKHRlc3RTb2xySG9tZSk7CiAgICAgc29sckNvbmZpZyA9IFRlc3RIYXJuZXNzLmNyZWF0ZUNvbmZpZyh0ZXN0U29sckhvbWUsIGNvcmVOYW1lLCBnZXRTb2xyQ29uZmlnRmlsZSgpKTsKLSAgICBoID0gbmV3IFRlc3RIYXJuZXNzKCBjb3JlTmFtZSwKLSAgICAgICAgICAgIGRhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgaCA9IG5ldyBUZXN0SGFybmVzcyggY29yZU5hbWUsIGhkZnNEYXRhRGlyID09IG51bGwgPyBkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpIDogaGRmc0RhdGFEaXIsCiAgICAgICAgICAgICBzb2xyQ29uZmlnLAogICAgICAgICAgICAgZ2V0U2NoZW1hRmlsZSgpKTsKICAgICBscmYgPSBoLmdldFJlcXVlc3RGYWN0b3J5CiAgICAgICAgICAgICAoInN0YW5kYXJkIiwwLDIwLENvbW1vblBhcmFtcy5WRVJTSU9OLCIyLjIiKTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgQ29yZUNvbnRhaW5lciBjcmVhdGVDb3JlQ29udGFpbmVyKFN0cmluZyBzb2xySG9tZSwgU3RyaW5nIHNvbHJYTUwpIHsKKyAgICB0ZXN0U29sckhvbWUgPSBjaGVja05vdE51bGwoc29sckhvbWUpOworICAgIGlmIChkYXRhRGlyID09IG51bGwpCisgICAgICBjcmVhdGVUZW1wRGlyKCk7CisgICAgaCA9IG5ldyBUZXN0SGFybmVzcyhzb2xySG9tZSwgc29sclhNTCk7CisgICAgbHJmID0gaC5nZXRSZXF1ZXN0RmFjdG9yeSgic3RhbmRhcmQiLCAwLCAyMCwgQ29tbW9uUGFyYW1zLlZFUlNJT04sICIyLjIiKTsKKyAgICByZXR1cm4gaC5nZXRDb3JlQ29udGFpbmVyKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIENvcmVDb250YWluZXIgY3JlYXRlRGVmYXVsdENvcmVDb250YWluZXIoU3RyaW5nIHNvbHJIb21lKSB7CisgICAgdGVzdFNvbHJIb21lID0gY2hlY2tOb3ROdWxsKHNvbHJIb21lKTsKKyAgICBpZiAoZGF0YURpciA9PSBudWxsKQorICAgICAgY3JlYXRlVGVtcERpcigpOworICAgIGggPSBuZXcgVGVzdEhhcm5lc3MoImNvbGxlY3Rpb24xIiwgZGF0YURpci5nZXRBYnNvbHV0ZVBhdGgoKSwgInNvbHJjb25maWcueG1sIiwgInNjaGVtYS54bWwiKTsKKyAgICBscmYgPSBoLmdldFJlcXVlc3RGYWN0b3J5KCJzdGFuZGFyZCIsIDAsIDIwLCBDb21tb25QYXJhbXMuVkVSU0lPTiwgIjIuMiIpOworICAgIHJldHVybiBoLmdldENvcmVDb250YWluZXIoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbml0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBFeGNlcHRpb24+IGVudHJ5IDogaC5nZXRDb3JlQ29udGFpbmVyKCkuZ2V0Q29yZUluaXRGYWlsdXJlcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldE1lc3NhZ2UoKS5pbmRleE9mKG1lc3NhZ2UpICE9IC0xKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0luaXRFeGNlcHRpb24oQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbj4gZXhjZXB0aW9uVHlwZSkgeworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgRXhjZXB0aW9uPiBlbnRyeSA6IGguZ2V0Q29yZUNvbnRhaW5lcigpLmdldENvcmVJbml0RmFpbHVyZXMoKS5lbnRyeVNldCgpKSB7CisgICAgICBpZiAoZXhjZXB0aW9uVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGVudHJ5LmdldFZhbHVlKCkuZ2V0Q2xhc3MoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICAvKiogU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHNldFVwIGNhbiBvcHRpb25hbGx5IGNhbGwgdGhpcyBtZXRob2QKICAgICogdG8gbG9nIHRoZSBmYWN0IHRoYXQgdGhlaXIgc2V0VXAgcHJvY2VzcyBoYXMgZW5kZWQuCiAgICAqLwpAQCAtMTQ0NCwxMiArMTUwMywxMiBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBhc3NlcnRYbWxGaWxlKGZpbmFsIEZpbGUgZmlsZSwgU3RyaW5nLi4uIHhwYXRoKQorICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0WG1sRmlsZShmaW5hbCBGaWxlIGZpbGUsIFN0cmluZy4uLiB4cGF0aCkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKIAogICAgIHRyeSB7CiAgICAgICBTdHJpbmcgeG1sID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcoZmlsZSwgIlVURi04Iik7Ci0gICAgICBTdHJpbmcgcmVzdWx0cyA9IGgudmFsaWRhdGVYUGF0aCh4bWwsIHhwYXRoKTsKKyAgICAgIFN0cmluZyByZXN1bHRzID0gVGVzdEhhcm5lc3MudmFsaWRhdGVYUGF0aCh4bWwsIHhwYXRoKTsKICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9ICJGaWxlIFhQYXRoIGZhaWx1cmU6IGZpbGU9IiArIGZpbGUuZ2V0UGF0aCgpICsgIiB4cGF0aD0iCiAgICAgICAgICAgICArIHJlc3VsdHMgKyAiXG5cbnhtbCB3YXM6ICIgKyB4bWw7CkBAIC0xNDY1LDggKzE1MjQsOSBAQAogICAgIEZpbGUgc3ViSG9tZSA9IG5ldyBGaWxlKGRzdFJvb3QsICJjb25mIik7CiAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIG1ha2Ugc3ViZGlyZWN0b3J5ICIsIGRzdFJvb3QubWtkaXJzKCkpOwogICAgIFN0cmluZyB0b3AgPSBTb2xyVGVzdENhc2VKNC5URVNUX0hPTUUoKSArICIvY29sbGVjdGlvbjEvY29uZiI7Ci0gICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRvcCwgInNjaGVtYS10aW55LnhtbCIpLCBuZXcgRmlsZShzdWJIb21lLCAic2NoZW1hLXRpbnkueG1sIikpOwotICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0b3AsICJzb2xyY29uZmlnLW1pbmltYWwueG1sIiksIG5ldyBGaWxlKHN1YkhvbWUsICJzb2xyY29uZmlnLW1pbmltYWwueG1sIikpOworICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0b3AsICJzY2hlbWEtdGlueS54bWwiKSwgbmV3IEZpbGUoc3ViSG9tZSwgInNjaGVtYS54bWwiKSk7CisgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHRvcCwgInNvbHJjb25maWctbWluaW1hbC54bWwiKSwgbmV3IEZpbGUoc3ViSG9tZSwgInNvbHJjb25maWcueG1sIikpOworICAgIEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZSh0b3AsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIiksIG5ldyBGaWxlKHN1YkhvbWUsICJzb2xyY29uZmlnLnNuaXBwZXQucmFuZG9taW5kZXhjb25maWcueG1sIikpOwogICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fic3RyYWN0RGlzdHJpYlprVGVzdEJhc2UuamF2YSBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fic3RyYWN0RGlzdHJpYlprVGVzdEJhc2UuamF2YQppbmRleCBhMzkxOTUxLi43MGYxYzg0IDEwMDY0NAotLS0gYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9BYnN0cmFjdERpc3RyaWJaa1Rlc3RCYXNlLmphdmEKKysrIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQWJzdHJhY3REaXN0cmliWmtUZXN0QmFzZS5qYXZhCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgCiAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZWNvdmVyaWVzVG9GaW5pc2goU3RyaW5nIGNvbGxlY3Rpb24sIFprU3RhdGVSZWFkZXIgemtTdGF0ZVJlYWRlciwgYm9vbGVhbiB2ZXJib3NlLCBib29sZWFuIGZhaWxPblRpbWVvdXQpCiAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB3YWl0Rm9yUmVjb3Zlcmllc1RvRmluaXNoKGNvbGxlY3Rpb24sIHprU3RhdGVSZWFkZXIsIHZlcmJvc2UsIGZhaWxPblRpbWVvdXQsIDIzMCk7CisgICAgd2FpdEZvclJlY292ZXJpZXNUb0ZpbmlzaChjb2xsZWN0aW9uLCB6a1N0YXRlUmVhZGVyLCB2ZXJib3NlLCBmYWlsT25UaW1lb3V0LCAzMzApOwogICB9CiAgIAogICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yUmVjb3Zlcmllc1RvRmluaXNoKFN0cmluZyBjb2xsZWN0aW9uLApAQCAtMTUxLDggKzE1MSw3IEBACiAgICAgICAgICAgaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigicnN0YXRlOiIKICAgICAgICAgICAgICAgKyBzaGFyZC5nZXRWYWx1ZSgpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApCiAgICAgICAgICAgICAgICsgIiBsaXZlOiIKLSAgICAgICAgICAgICAgKyBjbHVzdGVyU3RhdGUubGl2ZU5vZGVzQ29udGFpbihzaGFyZC5nZXRWYWx1ZSgpLmdldFN0cigKLSAgICAgICAgICAgICAgWmtTdGF0ZVJlYWRlci5OT0RFX05BTUVfUFJPUCkpKTsKKyAgICAgICAgICAgICAgKyBjbHVzdGVyU3RhdGUubGl2ZU5vZGVzQ29udGFpbihzaGFyZC5nZXRWYWx1ZSgpLmdldE5vZGVOYW1lKCkpKTsKICAgICAgICAgICBTdHJpbmcgc3RhdGUgPSBzaGFyZC5nZXRWYWx1ZSgpLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApOwogICAgICAgICAgIGlmICgoc3RhdGUuZXF1YWxzKFprU3RhdGVSZWFkZXIuUkVDT1ZFUklORykgfHwgc3RhdGUKICAgICAgICAgICAgICAgLmVxdWFscyhaa1N0YXRlUmVhZGVyLlNZTkMpIHx8IHN0YXRlLmVxdWFscyhaa1N0YXRlUmVhZGVyLkRPV04pKQpkaWZmIC0tZ2l0IGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQWJzdHJhY3RGdWxsRGlzdHJpYlprVGVzdEJhc2UuamF2YSBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL2Nsb3VkL0Fic3RyYWN0RnVsbERpc3RyaWJaa1Rlc3RCYXNlLmphdmEKaW5kZXggMjZhMjY4Mi4uMGI2MTY5YSAxMDA2NDQKLS0tIGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvY2xvdWQvQWJzdHJhY3RGdWxsRGlzdHJpYlprVGVzdEJhc2UuamF2YQorKysgYi9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci9jbG91ZC9BYnN0cmFjdEZ1bGxEaXN0cmliWmtUZXN0QmFzZS5qYXZhCkBAIC0xOTcsNiArMTk3LDcgQEAKICAgQEFmdGVyQ2xhc3MKICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQ2xhc3MoKSB7CiAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoInNvbHJjbG91ZC51cGRhdGUuZGVsYXkiKTsKKyAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiZ2VuZXJpY0NvcmVOb2RlTmFtZXMiKTsKICAgfQogICAKICAgcHVibGljIEFic3RyYWN0RnVsbERpc3RyaWJaa1Rlc3RCYXNlKCkgewpAQCAtMjExLDYgKzIxMiwxMCBAQAogICAgIHVzZUV4cGxpY2l0Tm9kZU5hbWVzID0gcmFuZG9tKCkubmV4dEJvb2xlYW4oKTsKICAgfQogICAKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhRGlyKFN0cmluZyBkYXRhRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBkYXRhRGlyOworICB9CisgIAogICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2xvdWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBhc3NlcnQoY2xvdWRJbml0ID09IGZhbHNlKTsKICAgICBjbG91ZEluaXQgPSB0cnVlOwpAQCAtMjMwLDcgKzIzNSw3IEBACiAgIAogICBwcm90ZWN0ZWQgQ2xvdWRTb2xyU2VydmVyIGNyZWF0ZUNsb3VkQ2xpZW50KFN0cmluZyBkZWZhdWx0Q29sbGVjdGlvbikKICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgIENsb3VkU29sclNlcnZlciBzZXJ2ZXIgPSBuZXcgQ2xvdWRTb2xyU2VydmVyKHprU2VydmVyLmdldFprQWRkcmVzcygpKTsKKyAgICBDbG91ZFNvbHJTZXJ2ZXIgc2VydmVyID0gbmV3IENsb3VkU29sclNlcnZlcih6a1NlcnZlci5nZXRaa0FkZHJlc3MoKSwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7CiAgICAgaWYgKGRlZmF1bHRDb2xsZWN0aW9uICE9IG51bGwpIHNlcnZlci5zZXREZWZhdWx0Q29sbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvbik7CiAgICAgc2VydmVyLmdldExiU2VydmVyKCkuZ2V0SHR0cENsaWVudCgpLmdldFBhcmFtcygpCiAgICAgICAgIC5zZXRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuQ09OTkVDVElPTl9USU1FT1VULCA1MDAwKTsKQEAgLTMyOCw4ICszMzMsOCBAQAogICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi1qZXR0eSIgKyBjbnQgKyAiLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICBqZXR0eURpci5ta2RpcnMoKTsKICAgICAgIHNldHVwSmV0dHlTb2xySG9tZShqZXR0eURpcik7Ci0gICAgICBKZXR0eVNvbHJSdW5uZXIgaiA9IGNyZWF0ZUpldHR5KGpldHR5RGlyLCB0ZXN0RGlyICsgIi9qZXR0eSIKLSAgICAgICAgICArIGNudCwgbnVsbCwgInNvbHJjb25maWcueG1sIiwgbnVsbCk7CisgICAgICBKZXR0eVNvbHJSdW5uZXIgaiA9IGNyZWF0ZUpldHR5KGpldHR5RGlyLCBnZXREYXRhRGlyKHRlc3REaXIgKyAiL2pldHR5IgorICAgICAgICAgICsgY250KSwgbnVsbCwgInNvbHJjb25maWcueG1sIiwgbnVsbCk7CiAgICAgICBqZXR0eXMuYWRkKGopOwogICAgICAgU29sclNlcnZlciBjbGllbnQgPSBjcmVhdGVOZXdTb2xyU2VydmVyKGouZ2V0TG9jYWxQb3J0KCkpOwogICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKQEAgLTQyOCw2ICs0MzMsMjggQEAKICAgICByZXR1cm4gY250OwogICB9CiAgIAorICBwdWJsaWMgSmV0dHlTb2xyUnVubmVyIGNyZWF0ZUpldHR5KFN0cmluZyBkYXRhRGlyLCBTdHJpbmcgdWxvZ0RpciwgU3RyaW5nIHNoYXJkTGlzdCwKKyAgICAgIFN0cmluZyBzb2xyQ29uZmlnT3ZlcnJpZGUpIHRocm93cyBFeGNlcHRpb24geworICAgIAorICAgIEpldHR5U29sclJ1bm5lciBqZXR0eSA9IG5ldyBKZXR0eVNvbHJSdW5uZXIoZ2V0U29sckhvbWUoKSwgY29udGV4dCwgMCwKKyAgICAgICAgc29sckNvbmZpZ092ZXJyaWRlLCBudWxsLCBmYWxzZSwgZ2V0RXh0cmFTZXJ2bGV0cygpKTsKKyAgICBqZXR0eS5zZXRTaGFyZHMoc2hhcmRMaXN0KTsKKyAgICBqZXR0eS5zZXREYXRhRGlyKGdldERhdGFEaXIoZGF0YURpcikpOworICAgIGpldHR5LnN0YXJ0KCk7CisgICAgCisgICAgcmV0dXJuIGpldHR5OworICB9CisgIAorICBwdWJsaWMgSmV0dHlTb2xyUnVubmVyIGNyZWF0ZUpldHR5KEZpbGUgc29sckhvbWUsIFN0cmluZyBkYXRhRGlyLCBTdHJpbmcgc2hhcmRMaXN0LCBTdHJpbmcgc29sckNvbmZpZ092ZXJyaWRlLCBTdHJpbmcgc2NoZW1hT3ZlcnJpZGUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgSmV0dHlTb2xyUnVubmVyIGpldHR5ID0gbmV3IEpldHR5U29sclJ1bm5lcihzb2xySG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGV4dCwgMCwgc29sckNvbmZpZ092ZXJyaWRlLCBzY2hlbWFPdmVycmlkZSwgZmFsc2UsIGdldEV4dHJhU2VydmxldHMoKSk7CisgICAgamV0dHkuc2V0U2hhcmRzKHNoYXJkTGlzdCk7CisgICAgamV0dHkuc2V0RGF0YURpcihnZXREYXRhRGlyKGRhdGFEaXIpKTsKKyAgICBqZXR0eS5zdGFydCgpOworICAgIAorICAgIHJldHVybiBqZXR0eTsKKyAgfQorICAKICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGluZ3NGcm9tWmsoTGlzdDxKZXR0eVNvbHJSdW5uZXI+IGpldHR5cywKICAgICAgIExpc3Q8U29sclNlcnZlcj4gY2xpZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgWmtTdGF0ZVJlYWRlciB6a1N0YXRlUmVhZGVyID0gY2xvdWRDbGllbnQuZ2V0WmtTdGF0ZVJlYWRlcigpOwpAQCAtNDgzLDcgKzUxMCw3IEBACiAgICAgICAgICAgICBjanIuamV0dHkgPSBqZXR0eTsKICAgICAgICAgICAgIGNqci5pbmZvID0gcmVwbGljYTsKICAgICAgICAgICAgIGNqci5ub2RlTmFtZSA9IHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1ApOwotICAgICAgICAgICAgY2pyLmNvcmVOb2RlTmFtZSA9IHJlcGxpY2EuZ2V0TmFtZSgpOworICAgICAgICAgICAgY2pyLmNvcmVOb2RlTmFtZSA9IHJlcGxpY2EuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgICAgIGNqci51cmwgPSByZXBsaWNhLmdldFN0cihaa1N0YXRlUmVhZGVyLkJBU0VfVVJMX1BST1ApICsgIi8iICsgcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5DT1JFX05BTUVfUFJPUCk7CiAgICAgICAgICAgICBjanIuY2xpZW50ID0gZmluZENsaWVudEJ5UG9ydChwb3J0LCB0aGVDbGllbnRzKTsKICAgICAgICAgICAgIGxpc3QuYWRkKGNqcik7CkBAIC04MDMsMTMgKzgzMCw2OCBAQAogICAgIH0KICAgfQogICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgcXVlcnkgYWdhaW5zdCBlYWNoIGxpdmUgYW5kIGFjdGl2ZSByZXBsaWNhIG9mIHRoZSBzcGVjaWZpZWQgc2hhcmQgCisgICAqIGFuZCBhc2VydHMgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLgorICAgKgorICAgKiBAc2VlICNxdWVyeUFuZENvbXBhcmUKKyAgICovCisgIHB1YmxpYyBRdWVyeVJlc3BvbnNlIHF1ZXJ5QW5kQ29tcGFyZVJlcGxpY2FzKFNvbHJQYXJhbXMgcGFyYW1zLCBTdHJpbmcgc2hhcmQpIAorICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgQXJyYXlMaXN0PFNvbHJTZXJ2ZXI+IHNoYXJkQ2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8U29sclNlcnZlcj4oNyk7CisKKyAgICB1cGRhdGVNYXBwaW5nc0Zyb21aayhqZXR0eXMsIGNsaWVudHMpOworICAgIFprU3RhdGVSZWFkZXIgemtTdGF0ZVJlYWRlciA9IGNsb3VkQ2xpZW50LmdldFprU3RhdGVSZWFkZXIoKTsKKyAgICBMaXN0PENsb3VkSmV0dHlSdW5uZXI+IHNvbHJKZXR0aWVzID0gc2hhcmRUb0pldHR5LmdldChzaGFyZCk7CisgICAgYXNzZXJ0Tm90TnVsbCgibm8gamV0dGllcyBmb3VuZCBmb3Igc2hhcmQ6ICIgKyBzaGFyZCwgc29sckpldHRpZXMpOworCisKKyAgICBmb3IgKENsb3VkSmV0dHlSdW5uZXIgY2pldHR5IDogc29sckpldHRpZXMpIHsKKyAgICAgIFprTm9kZVByb3BzIHByb3BzID0gY2pldHR5LmluZm87CisgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwcm9wcy5nZXRTdHIoWmtTdGF0ZVJlYWRlci5OT0RFX05BTUVfUFJPUCk7CisgICAgICBib29sZWFuIGFjdGl2ZSA9IHByb3BzLmdldFN0cihaa1N0YXRlUmVhZGVyLlNUQVRFX1BST1ApLmVxdWFscyhaa1N0YXRlUmVhZGVyLkFDVElWRSk7CisgICAgICBib29sZWFuIGxpdmUgPSB6a1N0YXRlUmVhZGVyLmdldENsdXN0ZXJTdGF0ZSgpLmxpdmVOb2Rlc0NvbnRhaW4obm9kZU5hbWUpOworICAgICAgaWYgKGFjdGl2ZSAmJiBsaXZlKSB7CisgICAgICAgIHNoYXJkQ2xpZW50cy5hZGQoY2pldHR5LmNsaWVudC5zb2xyQ2xpZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHF1ZXJ5QW5kQ29tcGFyZShwYXJhbXMsIHNoYXJkQ2xpZW50cyk7CisgIH0KKworICAvKioKKyAgICogRm9yIGVhY2ggU2hhcmQsIGV4ZWN1dGVzIGEgcXVlcnkgYWdhaW5zdCBlYWNoIGxpdmUgYW5kIGFjdGl2ZSByZXBsaWNhIG9mIHRoYXQgc2hhcmQKKyAgICogYW5kIGFzc2VydHMgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsIGZvciBlYWNoIHJlcGxpY2Egb2YgdGhlIHNhbWUgc2hhcmQuICAKKyAgICogQmVjYXVzZSByZXN1bHRzIGFyZSBub3QgY29tcGFyZWQgYmV0d2VlbiByZXBsaWNhcyBvZiBkaWZmZXJlbnQgc2hhcmRzLCB0aGlzIG1ldGhvZCAKKyAgICogc2hvdWxkIGJlIHNhZmUgZm9yIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBvZiBhbnkgcXVlcnksIGV2ZW4gaWYgaXQgY29udGFpbnMgCisgICAqICJkaXN0cmliPWZhbHNlIiwgYmVjYXVzZSB0aGUgcmVwbGljYXMgc2hvdWxkIGFsbCBiZSBpZGVudGljYWwuCisgICAqCisgICAqIEBzZWUgQWJzdHJhY3RGdWxsRGlzdHJpYlprVGVzdEJhc2UjcXVlcnlBbmRDb21wYXJlUmVwbGljYXMoU29sclBhcmFtcywgU3RyaW5nKQorICAgKi8KKyAgcHVibGljIHZvaWQgcXVlcnlBbmRDb21wYXJlU2hhcmRzKFNvbHJQYXJhbXMgcGFyYW1zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIHVwZGF0ZU1hcHBpbmdzRnJvbVprKGpldHR5cywgY2xpZW50cyk7CisgICAgTGlzdDxTdHJpbmc+IHNoYXJkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzaGFyZFRvSmV0dHkua2V5U2V0KCkpOworICAgIGZvciAoU3RyaW5nIHNoYXJkIDogc2hhcmRzKSB7CisgICAgICBxdWVyeUFuZENvbXBhcmVSZXBsaWNhcyhwYXJhbXMsIHNoYXJkKTsKKyAgICB9CisgIH0KKworICAvKiogCisgICAqIFJldHVybnMgYSBub24tbnVsbCBzdHJpbmcgaWYgcmVwbGljYXMgd2l0aGluIHRoZSBzYW1lIHNoYXJkIGRvIG5vdCBoYXZlIGEgCisgICAqIGNvbnNpc3RlbnQgbnVtYmVyIG9mIGRvY3VtZW50cy4gCisgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBjaGVja1NoYXJkQ29uc2lzdGVuY3koU3RyaW5nIHNoYXJkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBjaGVja1NoYXJkQ29uc2lzdGVuY3koc2hhcmQsIGZhbHNlLCBmYWxzZSk7CiAgIH0KIAotICAvKiBSZXR1cm5zIGEgbm9uLW51bGwgc3RyaW5nIGlmIHJlcGxpY2FzIHdpdGhpbiB0aGUgc2FtZSBzaGFyZCBhcmUgbm90IGNvbnNpc3RlbnQuCi0gICAqIElmIGV4cGVjdEZhaWx1cmU9PWZhbHNlLCB0aGUgZXhhY3QgZGlmZmVyZW5jZXMgZm91bmQgd2lsbCBiZSBsb2dnZWQgc2luY2UgdGhpcyB3b3VsZCBiZSBhbiB1bmV4cGVjdGVkIGZhaWx1cmUuCi0gICAqIHZlcmJvc2UgY2F1c2VzIGV4dHJhIGRlYnVnZ2luZyBpbnRvIHRvIGJlIGRpc3BsYXllZCwgZXZlbiBpZiBldmVyeXRoaW5nIGlzIGNvbnNpc3RlbnQuCisgIC8qKiAKKyAgICogUmV0dXJucyBhIG5vbi1udWxsIHN0cmluZyBpZiByZXBsaWNhcyB3aXRoaW4gdGhlIHNhbWUgc2hhcmQgZG8gbm90IGhhdmUgYSAKKyAgICogY29uc2lzdGVudCBudW1iZXIgb2YgZG9jdW1lbnRzLgorICAgKiBJZiBleHBlY3RGYWlsdXJlPT1mYWxzZSwgdGhlIGV4YWN0IGRpZmZlcmVuY2VzIGZvdW5kIHdpbGwgYmUgbG9nZ2VkIHNpbmNlIAorICAgKiB0aGlzIHdvdWxkIGJlIGFuIHVuZXhwZWN0ZWQgZmFpbHVyZS4KKyAgICogdmVyYm9zZSBjYXVzZXMgZXh0cmEgZGVidWdnaW5nIGludG8gdG8gYmUgZGlzcGxheWVkLCBldmVuIGlmIGV2ZXJ5dGhpbmcgaXMgCisgICAqIGNvbnNpc3RlbnQuCiAgICAqLwogICBwcm90ZWN0ZWQgU3RyaW5nIGNoZWNrU2hhcmRDb25zaXN0ZW5jeShTdHJpbmcgc2hhcmQsIGJvb2xlYW4gZXhwZWN0RmFpbHVyZSwgYm9vbGVhbiB2ZXJib3NlKQogICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC04ODksNiArOTcxLDQ2IEBACiAgICAgCiAgIH0KICAgCisgIHB1YmxpYyB2b2lkIHNob3dDb3VudHMoKSB7CisgICAgU2V0PFN0cmluZz4gdGhlU2hhcmRzID0gc2hhcmRUb0pldHR5LmtleVNldCgpOworICAgIAorICAgIGZvciAoU3RyaW5nIHNoYXJkIDogdGhlU2hhcmRzKSB7CisgICAgICBMaXN0PENsb3VkSmV0dHlSdW5uZXI+IHNvbHJKZXR0aWVzID0gc2hhcmRUb0pldHR5LmdldChzaGFyZCk7CisgICAgICAKKyAgICAgIGZvciAoQ2xvdWRKZXR0eVJ1bm5lciBjamV0dHkgOiBzb2xySmV0dGllcykgeworICAgICAgICBaa05vZGVQcm9wcyBwcm9wcyA9IGNqZXR0eS5pbmZvOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBST1BTOiIgKyBwcm9wcyk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgIFNvbHJQYXJhbXMgcXVlcnkgPSBwYXJhbXMoInEiLCAiKjoqIiwgInJvd3MiLCAiMCIsICJkaXN0cmliIiwKKyAgICAgICAgICAgICAgImZhbHNlIiwgInRlc3RzIiwgImNoZWNrU2hhcmRDb25zaXN0ZW5jeSIpOyAvLyAidGVzdHMiIGlzIGp1c3QgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhZyB0aGF0IHdvbid0IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZXhjZXB0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWNob2VkIGluIGxvZ3MKKyAgICAgICAgICBsb25nIG51bSA9IGNqZXR0eS5jbGllbnQuc29sckNsaWVudC5xdWVyeShxdWVyeSkuZ2V0UmVzdWx0cygpCisgICAgICAgICAgICAgIC5nZXROdW1Gb3VuZCgpOworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRE9DUzoiICsgbnVtKTsKKyAgICAgICAgfSBjYXRjaCAoU29sclNlcnZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJlcnJvciBjb250YWN0aW5nIGNsaWVudDogIiArIGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICsgIlxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gY2F0Y2ggKFNvbHJFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXJyb3IgY29udGFjdGluZyBjbGllbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICArICJcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gbGl2ZSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwcm9wcy5nZXRTdHIoWmtTdGF0ZVJlYWRlci5OT0RFX05BTUVfUFJPUCk7CisgICAgICAgIFprU3RhdGVSZWFkZXIgemtTdGF0ZVJlYWRlciA9IGNsb3VkQ2xpZW50LmdldFprU3RhdGVSZWFkZXIoKTsKKyAgICAgICAgaWYgKHprU3RhdGVSZWFkZXIuZ2V0Q2x1c3RlclN0YXRlKCkubGl2ZU5vZGVzQ29udGFpbihub2RlTmFtZSkpIHsKKyAgICAgICAgICBsaXZlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBsaXZlOiIgKyBsaXZlKTsKKyAgICAgICAgCisgICAgICB9CisgICAgfQorICB9CisgIAogICBwcml2YXRlIFN0cmluZyB0b1N0cihTb2xyRG9jdW1lbnRMaXN0IGxzdCwgaW50IG1heFN6KSB7CiAgICAgaWYgKGxzdC5zaXplKCkgPD0gbWF4U3opIHJldHVybiBsc3QudG9TdHJpbmcoKTsKIApAQCAtMTQ2NCw3ICsxNTg2LDcgQEAKICAgICAgIGZvciAoU3RyaW5nIHNsaWNlTmFtZSA6IHNsaWNlcy5rZXlTZXQoKSkgewogICAgICAgICBmb3IgKFJlcGxpY2EgcmVwbGljYSA6IHNsaWNlcy5nZXQoc2xpY2VOYW1lKS5nZXRSZXBsaWNhcygpKSB7CiAgICAgICAgICAgaWYgKG5vZGVzQWxsb3dlZFRvUnVuU2hhcmRzICE9IG51bGwgJiYgIW5vZGVzQWxsb3dlZFRvUnVuU2hhcmRzLmNvbnRhaW5zKHJlcGxpY2EuZ2V0U3RyKFprU3RhdGVSZWFkZXIuTk9ERV9OQU1FX1BST1ApKSkgewotICAgICAgICAgICAgcmV0dXJuICJTaGFyZCAiICsgcmVwbGljYS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQgb24gbm9kZSAiICsgcmVwbGljYS5nZXRTdHIoWmtTdGF0ZVJlYWRlci5OT0RFX05BTUVfUFJPUCkgKyAiIG5vdCBhbGxvd2VkIHRvIHJ1biBzaGFyZHMgZm9yIHRoZSBjcmVhdGVkIGNvbGxlY3Rpb24gIiArIGNvbGxlY3Rpb25OYW1lOworICAgICAgICAgICAgcmV0dXJuICJTaGFyZCAiICsgcmVwbGljYS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQgb24gbm9kZSAiICsgcmVwbGljYS5nZXROb2RlTmFtZSgpICsgIiBub3QgYWxsb3dlZCB0byBydW4gc2hhcmRzIGZvciB0aGUgY3JlYXRlZCBjb2xsZWN0aW9uICIgKyBjb2xsZWN0aW9uTmFtZTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdG90YWxTaGFyZHMgKz0gc2xpY2VzLmdldChzbGljZU5hbWUpLmdldFJlcGxpY2FzKCkuc2l6ZSgpOwpAQCAtMTUwNSw3ICsxNjI3LDcgQEAKICAgICBpZiAoY29tbW9uZENsb3VkU29sclNlcnZlciA9PSBudWxsKSB7CiAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewogICAgICAgICB0cnkgewotICAgICAgICAgIGNvbW1vbmRDbG91ZFNvbHJTZXJ2ZXIgPSBuZXcgQ2xvdWRTb2xyU2VydmVyKHprU2VydmVyLmdldFprQWRkcmVzcygpKTsKKyAgICAgICAgICBjb21tb25kQ2xvdWRTb2xyU2VydmVyID0gbmV3IENsb3VkU29sclNlcnZlcih6a1NlcnZlci5nZXRaa0FkZHJlc3MoKSwgcmFuZG9tKCkubmV4dEJvb2xlYW4oKSk7CiAgICAgICAgICAgY29tbW9uZENsb3VkU29sclNlcnZlci5zZXREZWZhdWx0Q29sbGVjdGlvbihERUZBVUxUX0NPTExFQ1RJT04pOwogICAgICAgICAgIGNvbW1vbmRDbG91ZFNvbHJTZXJ2ZXIuY29ubmVjdCgpOwogICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9CYXNlVGVzdEhhcm5lc3MuamF2YSBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvQmFzZVRlc3RIYXJuZXNzLmphdmEKaW5kZXggMDQ5NWM5MS4uNmU0NzgwOSAxMDA2NDQKLS0tIGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9CYXNlVGVzdEhhcm5lc3MuamF2YQorKysgYi9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91dGlsL0Jhc2VUZXN0SGFybmVzcy5qYXZhCkBAIC0zMywxMCArMzMsMTAgQEAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiAKIGFic3RyYWN0IHB1YmxpYyBjbGFzcyBCYXNlVGVzdEhhcm5lc3MgewotICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsPERvY3VtZW50QnVpbGRlcj4gYnVpbGRlclRMID0gbmV3IFRocmVhZExvY2FsPERvY3VtZW50QnVpbGRlcj4oKTsKLSAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxYUGF0aD4geHBhdGhUTCA9IG5ldyBUaHJlYWRMb2NhbDxYUGF0aD4oKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8RG9jdW1lbnRCdWlsZGVyPiBidWlsZGVyVEwgPSBuZXcgVGhyZWFkTG9jYWw8RG9jdW1lbnRCdWlsZGVyPigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxYUGF0aD4geHBhdGhUTCA9IG5ldyBUaHJlYWRMb2NhbDxYUGF0aD4oKTsKIAotICBwdWJsaWMgRG9jdW1lbnRCdWlsZGVyIGdldFhtbERvY3VtZW50QnVpbGRlcigpIHsKKyAgcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0WG1sRG9jdW1lbnRCdWlsZGVyKCkgewogICAgIHRyeSB7CiAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJUTC5nZXQoKTsKICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgWFBhdGggZ2V0WHBhdGgoKSB7CisgIHB1YmxpYyBzdGF0aWMgWFBhdGggZ2V0WHBhdGgoKSB7CiAgICAgdHJ5IHsKICAgICAgIFhQYXRoIHhwYXRoID0geHBhdGhUTC5nZXQoKTsKICAgICAgIGlmICh4cGF0aCA9PSBudWxsKSB7CkBAIC03MSw3ICs3MSw3IEBACiAgICAqIEBwYXJhbSB0ZXN0cyBBcnJheSBvZiBYUGF0aCBzdHJpbmdzIHRvIHRlc3QgKGluIGJvb2xlYW4gbW9kZSkgb24gdGhlIHhtbAogICAgKiBAcmV0dXJuIG51bGwgaWYgYWxsIGdvb2QsIG90aGVyd2lzZSB0aGUgZmlyc3QgdGVzdCB0aGF0IGZhaWxzLgogICAgKi8KLSAgcHVibGljIFN0cmluZyB2YWxpZGF0ZVhQYXRoKFN0cmluZyB4bWwsIFN0cmluZy4uLiB0ZXN0cykKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVYUGF0aChTdHJpbmcgeG1sLCBTdHJpbmcuLi4gdGVzdHMpCiAgICAgICB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewogCiAgICAgaWYgKHRlc3RzPT1udWxsIHx8IHRlc3RzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvRXh0ZXJuYWxQYXRocy5qYXZhIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9FeHRlcm5hbFBhdGhzLmphdmEKaW5kZXggNzkyNThlYS4uZjEyZTNhNCAxMDA2NDQKLS0tIGEvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9FeHRlcm5hbFBhdGhzLmphdmEKKysrIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9FeHRlcm5hbFBhdGhzLmphdmEKQEAgLTI1LDMwICsyNSw1NSBAQAogICogQGx1Y2VuZS5pbnRlcm5hbAogICovCiBwdWJsaWMgY2xhc3MgRXh0ZXJuYWxQYXRocyB7CisKKyAgLyoqCisgICAqIDxwPgorICAgKiBUaGUgbWFpbiBkaXJlY3RvcnkgcGF0aCBmb3IgdGhlIHNvbHIgc291cmNlIGJlaW5nIGJ1aWx0IGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLiAgSWYgaXQgCisgICAqIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCAtLSBwb3NzaWx5IGJlY2F1c2UgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhIGNsaWVudCBjb2RlIGJhc2UgCisgICAqIHVzaW5nIGh0ZSB0ZXN0IGZyYW1lb3dyayAtLSB0aGVuIHRoaXMgdmFyaWFibGUgd2lsbCBiZSBudWxsLgorICAgKiA8L3A+CisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgYWxsIG90aGVyIHN0YXRpYyBwYXRocyBhdmFpbGFibGUgaW4gdGhpcyBjbGFzcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgCisgICAqIGhvbWUsIGFuZCBpZiBpdCBpcyBudWxsLCB0aG9zZSBwYXRocyB3aWxsIGp1c3QgYmUgcmVsYXRpdmUgdG8gJ251bGwnIGFuZCBtYXkgbm90IGJlIAorICAgKiBtZWFuaW5nZnVsLgorICAgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0hPTUUgPSBkZXRlcm1pbmVTb3VyY2VIb21lKCk7CisgIC8qIEBzZWUgI1NPVVJDRV9IT01FICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQkFQUF9IT01FID0gbmV3IEZpbGUoU09VUkNFX0hPTUUsICJ3ZWJhcHAvd2ViIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgIC8qIEBzZWUgI1NPVVJDRV9IT01FICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYQU1QTEVfSE9NRSA9IG5ldyBGaWxlKFNPVVJDRV9IT01FLCAiZXhhbXBsZS9zb2xyIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgIC8qIEBzZWUgI1NPVVJDRV9IT01FICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYQU1QTEVfTVVMVElDT1JFX0hPTUUgPSBuZXcgRmlsZShTT1VSQ0VfSE9NRSwgImV4YW1wbGUvbXVsdGljb3JlIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgIC8qIEBzZWUgI1NPVVJDRV9IT01FICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYQU1QTEVfU0NIRU1BPUVYQU1QTEVfSE9NRSsiL2NvbGxlY3Rpb24xL2NvbmYvc2NoZW1hLnhtbCI7CisgIC8qIEBzZWUgI1NPVVJDRV9IT01FICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYQU1QTEVfQ09ORklHPUVYQU1QTEVfSE9NRSsiL2NvbGxlY3Rpb24xL2NvbmYvc29scmNvbmZpZy54bWwiOwogICAKKyAgLyoqCisgICAqIFVnbHksIHVnbHkgaGFjayB0byBkZXRlcm1pbmUgdGhlIGV4YW1wbGUgaG9tZSB3aXRob3V0IGRlcGVuZGluZyBvbiB0aGUgQ1dECisgICAqIHRoaXMgaXMgbmVlZGVkIGZvciBleGFtcGxlL211bHRpY29yZSB0ZXN0cyB3aGljaCByZXNpZGUgb3V0c2lkZSB0aGUgY2xhc3NwYXRoLgorICAgKiBpZiB0aGUgc291cmNlIGhvbWUgY2FuJ3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgKi8KICAgc3RhdGljIFN0cmluZyBkZXRlcm1pbmVTb3VyY2VIb21lKCkgewotICAgIC8vIHVnbHksIHVnbHkgaGFjayB0byBkZXRlcm1pbmUgdGhlIGV4YW1wbGUgaG9tZSB3aXRob3V0IGRlcGVuZGluZyBvbiB0aGUgQ1dECi0gICAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGV4YW1wbGUvbXVsdGljb3JlIHRlc3RzIHdoaWNoIHJlc2lkZSBvdXRzaWRlIHRoZSBjbGFzc3BhdGgKLSAgICBGaWxlIGZpbGU7CiAgICAgdHJ5IHsKLSAgICAgIGZpbGUgPSBuZXcgRmlsZSgic29sci9jb25mIik7Ci0gICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoInNvbHIvY29uZiIpLnRvVVJJKCkpOworICAgICAgRmlsZSBmaWxlOworICAgICAgdHJ5IHsKKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJzb2xyL2NvbmYiKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoInNvbHIvY29uZiIpLnRvVVJJKCkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyAic29sci9jb25mIiBpbiB0aGUgY2xhc3NwYXRoLCBmYWxsIGJhY2sgdG8gc2VhcmNoaW5nIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAgICBmaWxlID0gbmV3IEZpbGUoIi4iKTsKICAgICAgIH0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gInNvbHIvY29uZiIgaW4gdGhlIGNsYXNzcGF0aCwgZmFsbCBiYWNrIHRvIHNlYXJjaGluZyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAgICAgIGZpbGUgPSBuZXcgRmlsZSgiLiIpOworICAgICAgRmlsZSBiYXNlID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgIHdoaWxlICghKG5ldyBGaWxlKGJhc2UsICJzb2xyL0NIQU5HRVMudHh0IikuZXhpc3RzKCkpICYmIG51bGwgIT0gYmFzZSkgeworICAgICAgICBiYXNlID0gYmFzZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gKG51bGwgPT0gYmFzZSkgPyBudWxsIDogbmV3IEZpbGUoYmFzZSwgInNvbHIvIikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBhbGwgYmV0cyBhcmUgb2ZmCisgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgRmlsZSBiYXNlID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKLSAgICB3aGlsZSAoIW5ldyBGaWxlKGJhc2UsICJzb2xyL0NIQU5HRVMudHh0IikuZXhpc3RzKCkpIHsKLSAgICAgIGJhc2UgPSBiYXNlLmdldFBhcmVudEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBGaWxlKGJhc2UsICJzb2xyLyIpLmdldEFic29sdXRlUGF0aCgpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91dGlsL1Jlc3RUZXN0QmFzZS5qYXZhIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9SZXN0VGVzdEJhc2UuamF2YQppbmRleCA1YTc3YjlmLi45MDQxZjBiIDEwMDY0NAotLS0gYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91dGlsL1Jlc3RUZXN0QmFzZS5qYXZhCisrKyBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvUmVzdFRlc3RCYXNlLmphdmEKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgfQogICAgICAgKi8KIAotICAgICAgU3RyaW5nIHJlc3VsdHMgPSByZXN0VGVzdEhhcm5lc3MudmFsaWRhdGVYUGF0aChyZXNwb25zZSwgdGVzdHMpOworICAgICAgU3RyaW5nIHJlc3VsdHMgPSBUZXN0SGFybmVzcy52YWxpZGF0ZVhQYXRoKHJlc3BvbnNlLCB0ZXN0cyk7CiAKICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9ICJSRVFVRVNUIEZBSUxFRDogeHBhdGg9IiArIHJlc3VsdHMKZGlmZiAtLWdpdCBhL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvVGVzdEhhcm5lc3MuamF2YSBiL3NvbHIvdGVzdC1mcmFtZXdvcmsvc3JjL2phdmEvb3JnL2FwYWNoZS9zb2xyL3V0aWwvVGVzdEhhcm5lc3MuamF2YQppbmRleCAyZGYyZjEwLi41MGNjNTc2IDEwMDY0NAotLS0gYS9zb2xyL3Rlc3QtZnJhbWV3b3JrL3NyYy9qYXZhL29yZy9hcGFjaGUvc29sci91dGlsL1Rlc3RIYXJuZXNzLmphdmEKKysrIGIvc29sci90ZXN0LWZyYW1ld29yay9zcmMvamF2YS9vcmcvYXBhY2hlL3NvbHIvdXRpbC9UZXN0SGFybmVzcy5qYXZhCkBAIC0xNywyMCArMTcsMTcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnNvbHIudXRpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xyRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24ucGFyYW1zLkNvbW1vblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db25maWdTb2xyWG1sT2xkOworaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb21tb24udXRpbC5OYW1lZExpc3QuTmFtZWRMaXN0RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29uZmlnU29scjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc29sci5jb3JlLlNvbHJDb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuU29sckNvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmNvcmUuQ29yZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Db3JlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29yZS5Tb2xyUmVzb3VyY2VMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuVXBkYXRlUmVxdWVzdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmxvZ2dpbmcuTGlzdGVuZXJDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zb2xyLmxvZ2dpbmcuTG9nV2F0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIubG9nZ2luZy5qdWwuSnVsV2F0Y2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Mb2NhbFNvbHJRdWVyeVJlcXVlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnJlcXVlc3QuU29sclF1ZXJ5UmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIucmVxdWVzdC5Tb2xyUmVxdWVzdEhhbmRsZXI7CkBAIC00MCw5ICszNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zb2xyLnNjaGVtYS5JbmRleFNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2NoZW1hLkluZGV4U2NoZW1hRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNvbHIuc2VydmxldC5EaXJlY3RTb2xyQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNvbHIuY29tbW9uLnV0aWwuTmFtZWRMaXN0Lk5hbWVkTGlzdEVudHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNTEsOCArNDUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCiAKIC8qKgogICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSBoYXJuZXNzIHRoYXQgbWF5IGJlIHVzZWZ1bCB3aGVuCkBAIC0xMDYsMTkgKzk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xyQ29uZmlnIHNvbHJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGUpIHsKICAgICB0aGlzKCBjb3JlTmFtZSwgZGF0YURpcmVjdG9yeSwgc29sckNvbmZpZywgSW5kZXhTY2hlbWFGYWN0b3J5LmJ1aWxkSW5kZXhTY2hlbWEoc2NoZW1hRmlsZSwgc29sckNvbmZpZykpOwotICB9IAotICAvKioKLSAgICogQHBhcmFtIGNvcmVOYW1lIHRvIGluaXRpYWxpemUKLSAgICogQHBhcmFtIGRhdGFEaXJlY3RvcnkgcGF0aCBmb3IgaW5kZXggZGF0YSwgd2lsbCBub3QgYmUgY2xlYW5lZCB1cAotICAgKiBAcGFyYW0gc29sckNvbmZpZyBzb2xyY29uZmlnIGluc3RhbmNlCi0gICAqIEBwYXJhbSBpbmRleFNjaGVtYSBzY2hlbWEgaW5zdGFuY2UKLSAgICovCi0gICAgcHVibGljIFRlc3RIYXJuZXNzKCBTdHJpbmcgY29yZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YURpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvbHJDb25maWcgc29sckNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4U2NoZW1hIGluZGV4U2NoZW1hKSB7Ci0gICAgICAgIHRoaXMoY29yZU5hbWUsIG5ldyBJbml0aWFsaXplcihjb3JlTmFtZSwgZGF0YURpcmVjdG9yeSwgc29sckNvbmZpZywgaW5kZXhTY2hlbWEpKTsKLSAgICB9CisgIH0KKwogICAgLyoqCiAgICAgKiBAcGFyYW0gZGF0YURpcmVjdG9yeSBwYXRoIGZvciBpbmRleCBkYXRhLCB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwCiAgICAgKiBAcGFyYW0gc29sckNvbmZpZyBzb2xyb25maWcgaW5zdGFuY2UKQEAgLTEzNywxOCArMTE4LDI2IEBACiAgIHB1YmxpYyBUZXN0SGFybmVzcyggU3RyaW5nIGRhdGFEaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgU29sckNvbmZpZyBzb2xyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgIEluZGV4U2NoZW1hIGluZGV4U2NoZW1hKSB7Ci0gICAgICB0aGlzKG51bGwsIG5ldyBJbml0aWFsaXplcihudWxsLCBkYXRhRGlyZWN0b3J5LCBzb2xyQ29uZmlnLCBpbmRleFNjaGVtYSkpOworICAgICAgdGhpcyhDb3JlQ29udGFpbmVyLkRFRkFVTFRfREVGQVVMVF9DT1JFX05BTUUsIGRhdGFEaXJlY3RvcnksIHNvbHJDb25maWcsIGluZGV4U2NoZW1hKTsKICAgfQotICAKLSAgcHVibGljIFRlc3RIYXJuZXNzKFN0cmluZyBjb3JlTmFtZSwgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciBpbml0KSB7Ci0gICAgdHJ5IHsKIAotICAgICAgY29udGFpbmVyID0gaW5pdC5pbml0aWFsaXplKCk7CisgIC8qKgorICAgKiBAcGFyYW0gY29yZU5hbWUgdG8gaW5pdGlhbGl6ZQorICAgKiBAcGFyYW0gZGF0YURpciBwYXRoIGZvciBpbmRleCBkYXRhLCB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwCisgICAqIEBwYXJhbSBzb2xyQ29uZmlnIHNvbHJjb25maWcgcmVzb3VyY2UgbmFtZQorICAgKiBAcGFyYW0gaW5kZXhTY2hlbWEgc2NoZW1hIHJlc291cmNlIG5hbWUKKyAgICovCisgIHB1YmxpYyBUZXN0SGFybmVzcyhTdHJpbmcgY29yZU5hbWUsIFN0cmluZyBkYXRhRGlyLCBTdHJpbmcgc29sckNvbmZpZywgU3RyaW5nIGluZGV4U2NoZW1hKSB7CisgICAgdHJ5IHsKICAgICAgIGlmIChjb3JlTmFtZSA9PSBudWxsKQogICAgICAgICBjb3JlTmFtZSA9IENvcmVDb250YWluZXIuREVGQVVMVF9ERUZBVUxUX0NPUkVfTkFNRTsKLQogICAgICAgdGhpcy5jb3JlTmFtZSA9IGNvcmVOYW1lOwogCisgICAgICBTb2xyUmVzb3VyY2VMb2FkZXIgbG9hZGVyID0gbmV3IFNvbHJSZXNvdXJjZUxvYWRlcihTb2xyUmVzb3VyY2VMb2FkZXIubG9jYXRlU29sckhvbWUoKSk7CisgICAgICBDb25maWdTb2xyIGNvbmZpZyA9IGdldFRlc3RIYXJuZXNzQ29uZmlnKGNvcmVOYW1lLCBkYXRhRGlyLCBzb2xyQ29uZmlnLCBpbmRleFNjaGVtYSk7CisgICAgICBjb250YWluZXIgPSBuZXcgQ29yZUNvbnRhaW5lcihsb2FkZXIsIGNvbmZpZyk7CisgICAgICBjb250YWluZXIubG9hZCgpOworCiAgICAgICB1cGRhdGVyID0gbmV3IFVwZGF0ZVJlcXVlc3RIYW5kbGVyKCk7CiAgICAgICB1cGRhdGVyLmluaXQoIG51bGwgKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMTU2LDY3ICsxNDUsNTAgQEAKICAgICB9CiAgIH0KIAotICAvLyBDcmVhdGVzIGEgY29udGFpbmVyIGJhc2VkIG9uIGluZm9zIG5lZWRlZCB0byBjcmVhdGUgb25lIGNvcmUKLSAgc3RhdGljIGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQ29yZUNvbnRhaW5lci5Jbml0aWFsaXplciB7Ci0gICAgU3RyaW5nIGNvcmVOYW1lOwotICAgIFN0cmluZyBkYXRhRGlyZWN0b3J5OwotICAgIFNvbHJDb25maWcgc29sckNvbmZpZzsKLSAgICBJbmRleFNjaGVtYSBpbmRleFNjaGVtYTsKLSAgICBwdWJsaWMgSW5pdGlhbGl6ZXIoU3RyaW5nIGNvcmVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFNvbHJDb25maWcgc29sckNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICBJbmRleFNjaGVtYSBpbmRleFNjaGVtYSkgewotICAgICAgaWYgKGNvcmVOYW1lID09IG51bGwpCi0gICAgICAgIGNvcmVOYW1lID0gQ29yZUNvbnRhaW5lci5ERUZBVUxUX0RFRkFVTFRfQ09SRV9OQU1FOwotICAgICAgdGhpcy5jb3JlTmFtZSA9IGNvcmVOYW1lOwotICAgICAgdGhpcy5kYXRhRGlyZWN0b3J5ID0gZGF0YURpcmVjdG9yeTsKLSAgICAgIHRoaXMuc29sckNvbmZpZyA9IHNvbHJDb25maWc7Ci0gICAgICB0aGlzLmluZGV4U2NoZW1hID0gaW5kZXhTY2hlbWE7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29yZU5hbWUoKSB7Ci0gICAgICByZXR1cm4gY29yZU5hbWU7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb3JlQ29udGFpbmVyIGluaXRpYWxpemUoKSB7Ci0gICAgICBDb3JlQ29udGFpbmVyIGNvbnRhaW5lcjsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZyBzb2xySG9tZSA9IFNvbHJSZXNvdXJjZUxvYWRlci5sb2NhdGVTb2xySG9tZSgpOwotICAgICAgICBjb250YWluZXIgPSBuZXcgQ29yZUNvbnRhaW5lcihuZXcgU29sclJlc291cmNlTG9hZGVyKHNvbHJIb21lKSkgewotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBob3N0UG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdFBvcnQiLCAiODk4MyIpOwotICAgICAgICAgICAgU3RyaW5nIGhvc3RDb250ZXh0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJob3N0Q29udGV4dCIsICJzb2xyIik7Ci0gICAgICAgICAgICBkZWZhdWx0Q29yZU5hbWUgPSBDb3JlQ29udGFpbmVyLkRFRkFVTFRfREVGQVVMVF9DT1JFX05BTUU7Ci0gICAgICAgICAgICBpbml0U2hhcmRIYW5kbGVyKCk7Ci0gICAgICAgICAgICB6a1N5cy5pbml0Wm9vS2VlcGVyKHRoaXMsIHNvbHJIb21lLCBTeXN0ZW0uZ2V0UHJvcGVydHkoInprSG9zdCIpLCAzMDAwMCwgaG9zdFBvcnQsIGhvc3RDb250ZXh0LCBudWxsLCAiMzAwMDAiLCAzMDAwMCwgMzAwMDApOwotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oQ29uZmlnU29sclhtbE9sZC5ERUZfU09MUl9YTUwuZ2V0Qnl0ZXMoIlVURi04IikpOwotICAgICAgICAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcobG9hZGVyLCBudWxsLCBuZXcgSW5wdXRTb3VyY2UoaXMpLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICBjZmcgPSBuZXcgQ29uZmlnU29sclhtbE9sZChjb25maWcsIHRoaXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICAgIExvZ1dhdGNoZXI8Pz4gbG9nZ2luZyA9IG5ldyBKdWxXYXRjaGVyKCJ0ZXN0Iik7Ci0gICAgICBsb2dnaW5nLnJlZ2lzdGVyTGlzdGVuZXIobmV3IExpc3RlbmVyQ29uZmlnKCkpOwotICAgICAgY29udGFpbmVyLnNldExvZ2dpbmcobG9nZ2luZyk7Ci0gICAgICAKLSAgICAgIENvcmVEZXNjcmlwdG9yIGRjb3JlID0gbmV3IENvcmVEZXNjcmlwdG9yKGNvbnRhaW5lciwgY29yZU5hbWUsIHNvbHJDb25maWcuZ2V0UmVzb3VyY2VMb2FkZXIoKS5nZXRJbnN0YW5jZURpcigpKTsKLSAgICAgIGRjb3JlLnNldENvbmZpZ05hbWUoc29sckNvbmZpZy5nZXRSZXNvdXJjZU5hbWUoKSk7Ci0gICAgICBkY29yZS5zZXRTY2hlbWFOYW1lKGluZGV4U2NoZW1hLmdldFJlc291cmNlTmFtZSgpKTsKLSAgICAgIFNvbHJDb3JlIGNvcmUgPSBuZXcgU29sckNvcmUoY29yZU5hbWUsIGRhdGFEaXJlY3RvcnksIHNvbHJDb25maWcsIGluZGV4U2NoZW1hLCBkY29yZSk7Ci0gICAgICBjb250YWluZXIucmVnaXN0ZXIoY29yZU5hbWUsIGNvcmUsIGZhbHNlKTsKKyAgcHVibGljIFRlc3RIYXJuZXNzKFN0cmluZyBjb3JlTmFtZSwgU3RyaW5nIGRhdGFEaXIsIFNvbHJDb25maWcgc29sckNvbmZpZywgSW5kZXhTY2hlbWEgaW5kZXhTY2hlbWEpIHsKKyAgICB0aGlzKGNvcmVOYW1lLCBkYXRhRGlyLCBzb2xyQ29uZmlnLmdldFJlc291cmNlTmFtZSgpLCBpbmRleFNjaGVtYS5nZXRSZXNvdXJjZU5hbWUoKSk7CisgIH0KIAotICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGJlIGV4ZXJjaXNpbmcgdGhlICpzYW1lKiBjb3JlIGNvbnRhaW5lciBpbml0aWFsaXphdGlvbiBjb2RlLCBub3QgZXF1aXZhbGVudCBjb2RlIQotICAgICAgaWYgKGNvbnRhaW5lci5nZXRaa0NvbnRyb2xsZXIoKSA9PSBudWxsICYmIGNvcmUuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpICE9IG51bGwpIHsKLSAgICAgICAgLy8gYWx3YXlzIGtpY2sgb2ZmIHJlY292ZXJ5IGlmIHdlIGFyZSBpbiBzdGFuZGFsb25lIG1vZGUuCi0gICAgICAgIGNvcmUuZ2V0VXBkYXRlSGFuZGxlcigpLmdldFVwZGF0ZUxvZygpLnJlY292ZXJGcm9tTG9nKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGFpbmVyOwotICAgIH0KKyAgLyoqCisgICAqIENyZWF0ZSBhIFRlc3RIYXJuZXNzIHVzaW5nIGEgc3BlY2lmaWMgc29sciBob21lIGRpcmVjdG9yeSBhbmQgc29sciB4bWwKKyAgICogQHBhcmFtIHNvbHJIb21lIHRoZSBzb2xyIGhvbWUgZGlyZWN0b3J5CisgICAqIEBwYXJhbSBzb2xyWG1sIGEgRmlsZSBwb2ludGluZyB0byBhIHNvbHIueG1sIGNvbmZpZ3VyYXRpb24KKyAgICovCisgIHB1YmxpYyBUZXN0SGFybmVzcyhTdHJpbmcgc29sckhvbWUsIFN0cmluZyBzb2xyWG1sKSB7CisgICAgdGhpcyhuZXcgU29sclJlc291cmNlTG9hZGVyKHNvbHJIb21lKSwKKyAgICAgICAgICBDb25maWdTb2xyLmZyb21JbnB1dFN0cmVhbShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc29sclhtbC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpKSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgVGVzdEhhcm5lc3MgdXNpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBsb2FkZXIgYW5kIGNvbmZpZworICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBTb2xyUmVzb3VyY2VMb2FkZXIgdG8gdXNlCisgICAqIEBwYXJhbSBjb25maWcgdGhlIENvbmZpZ1NvbHIgdG8gdXNlCisgICAqLworICBwdWJsaWMgVGVzdEhhcm5lc3MoU29sclJlc291cmNlTG9hZGVyIGxvYWRlciwgQ29uZmlnU29sciBjb25maWcpIHsKKyAgICBjb250YWluZXIgPSBuZXcgQ29yZUNvbnRhaW5lcihsb2FkZXIsIGNvbmZpZyk7CisgICAgY29udGFpbmVyLmxvYWQoKTsKKyAgICB1cGRhdGVyID0gbmV3IFVwZGF0ZVJlcXVlc3RIYW5kbGVyKCk7CisgICAgdXBkYXRlci5pbml0KG51bGwpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQ29uZmlnU29sciBnZXRUZXN0SGFybmVzc0NvbmZpZyhTdHJpbmcgY29yZU5hbWUsIFN0cmluZyBkYXRhRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2xyQ29uZmlnLCBTdHJpbmcgc2NoZW1hKSB7CisgICAgU3RyaW5nIHNvbHJ4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIgorICAgICAgICArICI8c29sciBwZXJzaXN0ZW50PVwiZmFsc2VcIj5cbiIKKyAgICAgICAgKyAiICA8bG9nZ2luZyBlbmFibGVkPVwidHJ1ZVwiLz5cbiIKKyAgICAgICAgKyAiICA8Y29yZXMgYWRtaW5QYXRoPVwiL2FkbWluL2NvcmVzXCIgZGVmYXVsdENvcmVOYW1lPVwiIgorICAgICAgICArIENvcmVDb250YWluZXIuREVGQVVMVF9ERUZBVUxUX0NPUkVfTkFNRQorICAgICAgICArICJcIiIKKyAgICAgICAgKyAiIGhvc3Q9XCIke2hvc3Q6fVwiIGhvc3RQb3J0PVwiJHtob3N0UG9ydDp9XCIgaG9zdENvbnRleHQ9XCIke2hvc3RDb250ZXh0On1cIiIKKyAgICAgICAgKyAiIGRpc3RyaWJVcGRhdGVTb1RpbWVvdXQ9XCIzMDAwMFwiIgorICAgICAgICArICIgemtDbGllbnRUaW1lb3V0PVwiJHt6a0NsaWVudFRpbWVvdXQ6MzAwMDB9XCIgZGlzdHJpYlVwZGF0ZUNvbm5UaW1lb3V0PVwiMzAwMDBcIiIKKyAgICAgICAgKyAiPlxuIgorICAgICAgICArICIgICAgPGNvcmUgbmFtZT1cIiIgKyBjb3JlTmFtZSArICJcIiBjb25maWc9XCIiICsgc29sckNvbmZpZworICAgICAgICArICJcIiBzY2hlbWE9XCIiICsgc2NoZW1hICsgIlwiIGRhdGFEaXI9XCIiICsgZGF0YURpcgorICAgICAgICArICJcIiB0cmFuc2llbnQ9XCJmYWxzZVwiIGxvYWRPblN0YXJ0dXA9XCJ0cnVlXCIiCisgICAgICAgICsgIiBzaGFyZD1cIiR7c2hhcmQ6c2hhcmQxfVwiIGNvbGxlY3Rpb249XCIke2NvbGxlY3Rpb246Y29sbGVjdGlvbjF9XCIgaW5zdGFuY2VEaXI9XCIiICsgY29yZU5hbWUgKyAiL1wiIC8+XG4iCisgICAgICAgICsgIiAgPC9jb3Jlcz5cbiIgKyAiPC9zb2xyPiI7CisgICAgcmV0dXJuIENvbmZpZ1NvbHIuZnJvbVN0cmluZyhuZXcgU29sclJlc291cmNlTG9hZGVyKGRhdGFEaXIpLCBzb2xyeG1sKTsKICAgfQogICAKICAgcHVibGljIENvcmVDb250YWluZXIgZ2V0Q29yZUNvbnRhaW5lcigpIHsKZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL2J1aWxkLnhtbCBiL3NvbHIvd2ViYXBwL2J1aWxkLnhtbAppbmRleCAyMGVlMDcyLi40YWQ0YjA1IDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC9idWlsZC54bWwKKysrIGIvc29sci93ZWJhcHAvYnVpbGQueG1sCkBAIC0xOCw2ICsxOCw5IEBACiA8cHJvamVjdCBuYW1lPSJzb2xyLXdlYmFwcCIgZGVmYXVsdD0iZGVmYXVsdCI+CiAgIDxkZXNjcmlwdGlvbj5Tb2xyIHdlYmFwcDwvZGVzY3JpcHRpb24+CiAKKyAgPHByb3BlcnR5IG5hbWU9InJhdC5hZGRpdGlvbmFsLWluY2x1ZGVzIiB2YWx1ZT0iKioiLz4KKyAgPHByb3BlcnR5IG5hbWU9InJhdC5hZGRpdGlvbmFsLWV4Y2x1ZGVzIiB2YWx1ZT0id2ViL2ltZy8qKiIvPgorCiAgIDxpbXBvcnQgZmlsZT0iLi4vY29tbW9uLWJ1aWxkLnhtbCIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJleGNsdWRlLmZyb20ud2FyIiB2YWx1ZT0iKnNsZjRqKixsb2c0ai0qIiAvPgpAQCAtNjUsOCArNjgsOSBAQAogICAgIDwvd2FyPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImRpc3QtbWF2ZW4iIGRlcGVuZHM9ImRpc3QsIGZpbHRlci1wb20tdGVtcGxhdGVzLCBpbnN0YWxsLW1hdmVuLXRhc2tzLCBtMi1kZXBsb3ktc29sci1wYXJlbnQtcG9tIj4KLSAgICA8bTItZGVwbG95IGphci5maWxlPSIke2Rpc3R9L3NvbHItJHt2ZXJzaW9ufS53YXIiCi0gICAgICAgICAgICAgICBwb20ueG1sPSIke2ZpbHRlcmVkLnBvbS50ZW1wbGF0ZXMuZGlyfS9zb2xyL3dlYmFwcC9wb20ueG1sIi8+Ci0gIDwvdGFyZ2V0PgorICA8IS0tIG5vdGhpbmcgdG8gZG8gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1tYXZlbiIvPgorCisgIDwhLS0gbm90aGluZyB0byBkbyAtLT4KKyAgPHRhcmdldCBuYW1lPSItdmFsaWRhdGUtbWF2ZW4tZGVwZW5kZW5jaWVzIi8+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvV0VCLUlORi93ZWJsb2dpYy54bWwgYi9zb2xyL3dlYmFwcC93ZWIvV0VCLUlORi93ZWJsb2dpYy54bWwKaW5kZXggNGIzYTY2Ny4uYjg2NDVlYiAxMDA3NTUKLS0tIGEvc29sci93ZWJhcHAvd2ViL1dFQi1JTkYvd2VibG9naWMueG1sCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9XRUItSU5GL3dlYmxvZ2ljLnhtbApAQCAtMSw0ICsxLDIwIEBACiA8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgogPHdlYmxvZ2ljLXdlYi1hcHAKICAgICB4bWxucz0iaHR0cDovL3d3dy5iZWEuY29tL25zL3dlYmxvZ2ljLzkwIgogICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvYWRtaW4uaHRtbCBiL3NvbHIvd2ViYXBwL3dlYi9hZG1pbi5odG1sCmluZGV4IDlmNWExMzEuLjJkYjU0ZTkgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9hZG1pbi5odG1sCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9hZG1pbi5odG1sCkBAIC0zNSw2ICszNSw3IEBACiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9zdHlsZXMvbG9nZ2luZy5jc3M/Xz0ke3ZlcnNpb259Ij4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL3N0eWxlcy9tZW51LmNzcz9fPSR7dmVyc2lvbn0iPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3Mvc3R5bGVzL3BsdWdpbnMuY3NzP189JHt2ZXJzaW9ufSI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9zdHlsZXMvZG9jdW1lbnRzLmNzcz9fPSR7dmVyc2lvbn0iPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3Mvc3R5bGVzL3F1ZXJ5LmNzcz9fPSR7dmVyc2lvbn0iPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3Mvc3R5bGVzL3JlcGxpY2F0aW9uLmNzcz9fPSR7dmVyc2lvbn0iPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3Mvc3R5bGVzL3NjaGVtYS1icm93c2VyLmNzcz9fPSR7dmVyc2lvbn0iPgpAQCAtMTM4LDYgKzEzOSwxMiBAQAogICAgIDwvZGl2PgogICAgIAogICA8L2Rpdj4KKworICA8ZGl2IGlkPSJjb25uZWN0aW9uX3N0YXR1cyI+CisKKyAgICA8c3Bhbj5Db25uZWN0aW9uIGxvc3Qg4oCmPC9zcGFuPgorCisgIDwvZGl2PgogICAKICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiB2YXIgcmVxdWlyZSA9IHsgdXJsQXJnczogJ189JHt2ZXJzaW9ufScgfTsgPC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJqcy9yZXF1aXJlLmpzP189JHt2ZXJzaW9ufSIgZGF0YS1tYWluPSJqcy9tYWluIj48L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3MvY2hvc2VuLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3MvY2hvc2VuLmNzcwppbmRleCA3MDZjYWY3Li44M2Y2Yjk3IDEwMDc1NQotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL2Nob3Nlbi5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9jaG9zZW4uY3NzCkBAIC0xLDMgKzEsMzIgQEAKKy8qCisKK0Nob3NlbgorCistIGJ5IFBhdHJpY2sgRmlsbGVyIGZvciBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQorLSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBieSBIYXJ2ZXN0CisKK0F2YWlsYWJsZSBmb3IgdXNlIHVuZGVyIHRoZSBNSVQgTGljZW5zZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKwogLyogQGdyb3VwIEJhc2UgKi8KIC5jaHpuLWNvbnRhaW5lciB7CiAgIGZvbnQtc2l6ZTogMTNweDsKZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2FuYWx5c2lzLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2FuYWx5c2lzLmNzcwppbmRleCBmMjg3MzdiLi4yMjczZjRmIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9hbmFseXNpcy5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvYW5hbHlzaXMuY3NzCkBAIC0xLDMgKzEsMjIgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKwogI2NvbnRlbnQgI2FuYWx5c2lzLWhvbGRlcgogewogICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CkBAIC0yODksNCArMzA4LDQgQEAKIH0KIAogI2NvbnRlbnQgI2FuYWx5c2lzICNmaWVsZC1hbmFseXNpcyBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9yZWNlaXB0LnBuZyApOyB9Ci0jY29udGVudCAjYW5hbHlzaXMgLmFuYWx5c2lzLXJlc3VsdCBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9yZWNlaXB0LWludm9pY2UucG5nICk7IH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjY29udGVudCAjYW5hbHlzaXMgLmFuYWx5c2lzLXJlc3VsdCBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9yZWNlaXB0LWludm9pY2UucG5nICk7IH0KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2Nsb3VkLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2Nsb3VkLmNzcwppbmRleCAzYzU5NjdjLi45MTIxNDMyIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9jbG91ZC5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvY2xvdWQuY3NzCkBAIC0xLDMgKzEsMjIgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKwogI2NvbnRlbnQgI2Nsb3VkCiB7CiAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKQEAgLTM4Nyw0ICs0MDYsNCBAQAogI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsubHZsLTEKIHsKICAgc3Ryb2tlOiAjZmZmOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2NvbW1vbi5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9jb21tb24uY3NzCmluZGV4IDk2MDgzNGUuLjhlNjcxY2EgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2NvbW1vbi5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvY29tbW9uLmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICoKIHsKICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKQEAgLTYwNSw0ICs2MjQsNjYgQEAKICNjb250ZW50IC50cmVlIGEuanN0cmVlLXNlYXJjaAogewogICBjb2xvcjphcXVhOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworI2Nvbm5lY3Rpb25fc3RhdHVzCit7CisgIGRpc3BsYXk6IG5vbmU7CisgIHBhZGRpbmc6IDMwcHg7Cit9CisKKyNjb25uZWN0aW9uX3N0YXR1cyBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9uZXR3b3JrLXN0YXR1cy1idXN5LnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICM4MDA7CisgIHBhZGRpbmctbGVmdDogMjZweDsKK30KKworI2Nvbm5lY3Rpb25fc3RhdHVzLm9ubGluZSBzcGFuLAorI2Nvbm5lY3Rpb25fc3RhdHVzLm9ubGluZSBzcGFuIGEKK3sKKyAgY29sb3I6ICMwODA7Cit9CisKKyNjb25uZWN0aW9uX3N0YXR1cy5vbmxpbmUgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbmV0d29yay1zdGF0dXMucG5nICk7Cit9CisKKyNjb25uZWN0aW9uX3N0YXR1cy5vbmxpbmUgc3BhbiBhCit7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisjY29ubmVjdGlvbl9zdGF0dXMub25saW5lIHNwYW4gYTpob3ZlcgoreworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKyNjb250ZW50IC5hZGRyZXNzLWJhcgoreworICBtYXJnaW4tYm90dG9tOiAxMHB4OworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktYWRkcmVzcy1iYXIucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7CisgIGJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICBjb2xvcjogI2MwYzBjMDsKKyAgZGlzcGxheTogYmxvY2s7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDVweDsKKyAgcGFkZGluZy1sZWZ0OiAyNnB4OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjY29udGVudCAuYWRkcmVzcy1iYXI6Zm9jdXMsCisjY29udGVudCAuYWRkcmVzcy1iYXI6aG92ZXIKK3sKKyAgYm9yZGVyLWNvbG9yOiAjYzBjMGMwOworICBib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLW1vei1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgY29sb3I6ICMzMzM7Cit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9jb3Jlcy5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9jb3Jlcy5jc3MKaW5kZXggMjQ4MTEwNS4uYTkzYWQ1NSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvY29yZXMuY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2NvcmVzLmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICNjb3JlcwogewogICBwb3NpdGlvbjogcmVsYXRpdmU7CkBAIC0yMDAsNCArMjE5LDQgQEAKICNjb250ZW50ICNjb3JlcyAjZGF0YSBsaSBkZC5pY28gc3BhbgogewogICBkaXNwbGF5OiBub25lOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2Rhc2hib2FyZC5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9kYXNoYm9hcmQuY3NzCmluZGV4IDgwZGFjODYuLmYxMTY2MjQgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2Rhc2hib2FyZC5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvZGFzaGJvYXJkLmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICNkYXNoYm9hcmQgLmJsb2NrCiB7CiAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9kYXRhaW1wb3J0LmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2RhdGFpbXBvcnQuY3NzCmluZGV4IDIxNzMyYjYuLjBlYzE5NmQgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2RhdGFpbXBvcnQuY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2RhdGFpbXBvcnQuY3NzCkBAIC0xLDMgKzEsMjIgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKwogI2NvbnRlbnQgI2RhdGFpbXBvcnQKIHsKICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOwpAQCAtMzgxLDQgKzQwMCw0IEBACiB7CiAgIGNvbG9yOiAjYzBjMGMwOwogICBmb250LXN0eWxlOiBub3JtYWw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvZG9jdW1lbnRzLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2RvY3VtZW50cy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNGVmYwotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2RvY3VtZW50cy5jc3MKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2RvY3VtZW50cworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDQ1JSAwOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0KK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qd2lkdGg6IDIxJTsqLworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGxhYmVsCit7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBpbnB1dCwKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gc2VsZWN0LAorI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSB0ZXh0YXJlYQoreworICBtYXJnaW4tYm90dG9tOiAycHg7CisgIC8qd2lkdGg6IDEwMCU7Ki8KK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBpbnB1dCwKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gdGV4dGFyZWEKK3sKKyAgbWFyZ2luLWJvdHRvbTogMnB4OworICAvKndpZHRoOiA5OCU7Ki8KK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAjc3RhcnQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qd2lkdGg6IDQ1JTsqLworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtICNyb3dzCit7CisgIGZsb2F0OiByaWdodDsKKyAvKiB3aWR0aDogNDUlOyovCit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gLmNoZWNrYm94IGlucHV0Cit7CisgIG1hcmdpbi1ib3R0b206IDA7CisgIHdpZHRoOiBhdXRvOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0LAorI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7CisgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldC5jb21tb24KK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldCBsZWdlbmQsCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbC5leHBhbmRlZCBsZWdlbmQKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworICBwYWRkaW5nOiAwcHggNXB4OworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IGxlZ2VuZCBsYWJlbAoreworICBtYXJnaW4tdG9wOiAwOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IC5maWVsZHNldAoreworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWFyZ2luLWJvdHRvbTogNXB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwKK3sKKyAgYm9yZGVyOiAwOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbCAuZmllbGRzZXQKK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwgbGVnZW5kCit7CisgIG1hcmdpbi1sZWZ0OiAwOworICBwYWRkaW5nLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gLm9wdGlvbmFsLmV4cGFuZGVkIC5maWVsZHNldAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZmlsZS11cGxvYWR7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdAoreworICBkaXNwbGF5OiBub25lOworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA1NCU7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjdXJsCit7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1hZGRyZXNzLWJhci5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDUwJTsKKyAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKKyAgYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7CisgIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7CisgIC13ZWJraXQtYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7CisgIGNvbG9yOiAjYzBjMGMwOworICBkaXNwbGF5OiBibG9jazsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogNXB4OworICBwYWRkaW5nLWxlZnQ6IDI2cHg7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjdXJsOmZvY3VzLAorI2NvbnRlbnQgI2RvY3VtZW50cyAjcmVzdWx0ICN1cmw6aG92ZXIKK3sKKyAgYm9yZGVyLWNvbG9yOiAjYzBjMGMwOworICBib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLW1vei1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgY29sb3I6ICMzMzM7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UKK3sKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjcmVzdWx0ICNyZXNwb25zZSBwcmUKK3sKKyAgcGFkZGluZy1sZWZ0OiAyMHB4OworfQorCisuZGVzY3JpcHRpb257CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjdXBsb2FkLW9ubHl7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyNkb2N1bWVudC10eXBleworICBwYWRkaW5nLWJvdHRvbTogNXB4OworfQorCisjd2l6YXJkeworICBkaXNwbGF5OiBub25lOworfQorCisjd2l6YXJkLWZpZWxkcyBkaXZ7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9CisKKyN3aXotZmllbGQtZGF0YSwgI3dpei1maWVsZC1kYXRhIHNwYW57CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9pbmRleC5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9pbmRleC5jc3MKaW5kZXggMjhkOTU0Zi4uNDk3N2NmNSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvaW5kZXguY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2luZGV4LmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICNpbmRleCAuYmFyLWRlc2MKIHsKICAgY29sb3I6ICNjMGMwYzA7CkBAIC0xODcsNCArMjA2LDQgQEAKICNjb250ZW50ICNpbmRleCAjanZtLW1lbW9yeS1iYXIKIHsKICAgbWFyZ2luLXRvcDogMjBweDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9qYXZhLXByb3BlcnRpZXMuY3NzIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvamF2YS1wcm9wZXJ0aWVzLmNzcwppbmRleCA4YTQ2MjIzLi5hYjViNjdiIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9qYXZhLXByb3BlcnRpZXMuY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2phdmEtcHJvcGVydGllcy5jc3MKQEAgLTEsMyArMSwyMiBAQAorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiAjY29udGVudCAjamF2YS1wcm9wZXJ0aWVzIC5sb2FkZXIKIHsKICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CkBAIC0zMCw0ICs0OSw0IEBACiAjY29udGVudCAjamF2YS1wcm9wZXJ0aWVzIGxpIGRkLm9kZAogewogICBjb2xvcjogIzk5OTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9sb2dnaW5nLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2xvZ2dpbmcuY3NzCmluZGV4IGIzN2ZmNmYuLjg2YTgzNWYgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2xvZ2dpbmcuY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL2xvZ2dpbmcuY3NzCkBAIC0xLDMgKzEsMjIgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKwogI2NvbnRlbnQgI2xvZ2dpbmcgLmxvYWRlcgogewogICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKQEAgLTMzMyw0ICszNTIsNCBAQAogewogICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtMS5wbmcgKTsKICAgY29sb3I6ICM4MDA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvbWVudS5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9tZW51LmNzcwppbmRleCBkZmE1NGIyLi4yM2UzOWZjIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9tZW51LmNzcworKysgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9tZW51LmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNtZW51LXdyYXBwZXIKIHsKICAgcG9zaXRpb246IGZpeGVkOwpAQCAtMjM5LDYgKzI1OCw3IEBACiAjY29yZS1tZW51IC5zY2hlbWEgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90YWJsZS5wbmcgKTsgfQogI2NvcmUtbWVudSAuY29uZmlnIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZ2Vhci5wbmcgKTsgfQogI2NvcmUtbWVudSAuYW5hbHlzaXMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9mdW5uZWwucG5nICk7IH0KKyNjb3JlLW1lbnUgLmRvY3VtZW50cyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50cy1zdGFjay5wbmcgKTsgfQogI2NvcmUtbWVudSAuc2NoZW1hLWJyb3dzZXIgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ib29rLW9wZW4tdGV4dC5wbmcgKTsgfQogI2NvcmUtbWVudSAucmVwbGljYXRpb24gYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLnBuZyApOyB9CiAjY29yZS1tZW51IC5kaXN0cmlidXRpb24gYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLXNlbGVjdC5wbmcgKTsgfQpAQCAtMjg0LDQgKzMwNCw0IEBACiB7CiAgIGJhY2tncm91bmQtY29sb3I6ICNlMGUwZTA7CiAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL3BsdWdpbnMuY3NzIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvcGx1Z2lucy5jc3MKaW5kZXggYmRjZDhjNC4uODVlNWFiMSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvcGx1Z2lucy5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvcGx1Z2lucy5jc3MKQEAgLTEsMyArMSwyMiBAQAorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiAjY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbgogewogICB3aWR0aDogMjAlOwpAQCAtMTcyLDQgKzE5MSw0IEBACiAjcmVjb3JkaW5nIGJ1dHRvbiBzcGFuCiB7CiAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9uZXctdGV4dC5wbmcgKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9xdWVyeS5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9xdWVyeS5jc3MKaW5kZXggMDU0N2UyYy4uOWZkNzkxMyAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvcXVlcnkuY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL3F1ZXJ5LmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICNxdWVyeQogewogICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CkBAIC0zMiw2ICs1MSw0NCBAQAogICB3aWR0aDogOTglOwogfQogCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIGlucHV0Cit7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogODAlCit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgLmJ1dHRvbnMKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogMTYlOworfQorCisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgaGVpZ2h0OiAyNXB4OworICB3aWR0aDogNDklOworfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIGEgc3BhbgoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIGEuYWRkCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wbHVzLWJ1dHRvbi5wbmcgKTsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIGEucmVtCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9taW51cy1idXR0b24ucG5nICk7CisgIGZsb2F0OiBsZWZ0OworfQorCiAjY29udGVudCAjcXVlcnkgI2Zvcm0gI3N0YXJ0CiB7CiAgIGZsb2F0OiBsZWZ0OwpAQCAtMTExLDMzICsxNjgsNiBAQAogICB3aWR0aDogNzclOwogfQogCi0jY29udGVudCAjcXVlcnkgI3Jlc3VsdCAjdXJsCi17Ci0gIG1hcmdpbi1ib3R0b206IDEwcHg7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1hZGRyZXNzLWJhci5wbmcgKTsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDUwJTsKLSAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKLSAgYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7Ci0gIGNvbG9yOiAjYzBjMGMwOwotICBkaXNwbGF5OiBibG9jazsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcGFkZGluZzogNXB4OwotICBwYWRkaW5nLWxlZnQ6IDI2cHg7Ci0gIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLSNjb250ZW50ICNxdWVyeSAjcmVzdWx0ICN1cmw6Zm9jdXMsCi0jY29udGVudCAjcXVlcnkgI3Jlc3VsdCAjdXJsOmhvdmVyCi17Ci0gIGJvcmRlci1jb2xvcjogI2MwYzBjMDsKLSAgYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7Ci0gIGNvbG9yOiAjMzMzOwotfQotCiAjY29udGVudCAjcXVlcnkgI3Jlc3VsdCAjcmVzcG9uc2UKIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9yZXBsaWNhdGlvbi5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9yZXBsaWNhdGlvbi5jc3MKaW5kZXggM2Q4ZjAyMS4uNzM3OTUwNCAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvcmVwbGljYXRpb24uY3NzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL3JlcGxpY2F0aW9uLmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICNyZXBsaWNhdGlvbgogewogICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CkBAIC00OTMsNCArNTEyLDQgQEAKICNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAucmVmcmVzaC1zdGF0dXMgc3BhbgogewogICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL3NjaGVtYS1icm93c2VyLmNzcyBiL3NvbHIvd2ViYXBwL3dlYi9jc3Mvc3R5bGVzL3NjaGVtYS1icm93c2VyLmNzcwppbmRleCAzODFjYmU2Li5lNDNkZTQwIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy9zY2hlbWEtYnJvd3Nlci5jc3MKKysrIGIvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvc2NoZW1hLWJyb3dzZXIuY3NzCkBAIC0xLDMgKzEsMjIgQEAKKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKwogI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyIC5sb2FkZXIKIHsKICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CkBAIC01NTYsNCArNTc1LDQgQEAKICNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGk6aG92ZXIgZHQKIHsKICAgY29sb3I6ICMzMzM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2Nzcy9zdHlsZXMvdGhyZWFkcy5jc3MgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy90aHJlYWRzLmNzcwppbmRleCBlNjllZGFlLi5kOGFhNmFiIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy90aHJlYWRzLmNzcworKysgYi9zb2xyL3dlYmFwcC93ZWIvY3NzL3N0eWxlcy90aHJlYWRzLmNzcwpAQCAtMSwzICsxLDIyIEBACisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKICNjb250ZW50ICN0aHJlYWRzIC5sb2FkZXIKIHsKICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CkBAIC0xNTAsNCArMTY5LDQgQEAKICNjb250ZW50ICN0aHJlYWRzLmNvbGxhcHNlZCAuY29udHJvbHMgLmNvbGxhcHNlCiB7CiAgIGRpc3BsYXk6IG5vbmU7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2ltZy9pY28vZG9jdW1lbnRzLXN0YWNrLnBuZyBiL3NvbHIvd2ViYXBwL3dlYi9pbWcvaWNvL2RvY3VtZW50cy1zdGFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5N2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9pbWcvaWNvL2RvY3VtZW50cy1zdGFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2ltZy9pY28vbWludXMtYnV0dG9uLnBuZyBiL3NvbHIvd2ViYXBwL3dlYi9pbWcvaWNvL21pbnVzLWJ1dHRvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmRjMDE5YQotLS0gL2Rldi9udWxsCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9pbWcvaWNvL21pbnVzLWJ1dHRvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9aZXJvQ2xpcGJvYXJkLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9aZXJvQ2xpcGJvYXJkLmpzCmluZGV4IDkyMzY0YmQuLjVkNzY3MWEgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvWmVyb0NsaXBib2FyZC5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL1plcm9DbGlwYm9hcmQuanMKQEAgLTEsMyArMSwyOCBAQAorLyoKKworVGhlIE1JVCBMaWNlbnNlIChNSVQpCitDb3B5cmlnaHQgKGMpIDIwMTIgSm9uIFJvaGFuLCBKYW1lcyBNLiBHcmVlbmUsIAorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKwogLy8gU2ltcGxlIFNldCBDbGlwYm9hcmQgU3lzdGVtCiAvLyBBdXRob3I6IEpvc2VwaCBIdWNrYWJ5CiAKZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvY2hvc2VuLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9jaG9zZW4uanMKaW5kZXggZWVmMjlkZC4uYmYyNTBhMiAxMDA3NTUKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9jaG9zZW4uanMKKysrIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9jaG9zZW4uanMKQEAgLTEsMyArMSwzMiBAQAorLyoKKworQ2hvc2VuCisKKy0gYnkgUGF0cmljayBGaWxsZXIgZm9yIEhhcnZlc3QgaHR0cDovL2dldGhhcnZlc3QuY29tCistIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIGJ5IEhhcnZlc3QKKworQXZhaWxhYmxlIGZvciB1c2UgdW5kZXIgdGhlIE1JVCBMaWNlbnNlCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworCiAvLyBDaG9zZW4sIGEgU2VsZWN0IEJveCBFbmhhbmNlciBmb3IgalF1ZXJ5IGFuZCBQcm90b3lwZQogLy8gYnkgUGF0cmljayBGaWxsZXIgZm9yIEhhcnZlc3QsIGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQogLy8gCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2QzLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9kMy5qcwppbmRleCBjMWI2Y2FmLi41MDE1NjAzIDEwMDc1NQotLS0gYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2QzLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvZDMuanMKQEAgLTEsMyArMSwzNCBAQAorLyoKKworQ29weXJpZ2h0IChjKSAyMDEzLCBNaWNoYWVsIEJvc3RvY2sKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworKiBUaGUgbmFtZSBNaWNoYWVsIEJvc3RvY2sgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCitBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE1JQ0hBRUwgQk9TVE9DSyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCitJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKK0JVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworKi8KKwogKGZ1bmN0aW9uKCl7aWYgKCFEYXRlLm5vdykgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsKICAgcmV0dXJuICtuZXcgRGF0ZTsKIH07CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2hpZ2hsaWdodC5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvaGlnaGxpZ2h0LmpzCmluZGV4IDU5MTZhYTEuLjUyN2MzNDAgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvaGlnaGxpZ2h0LmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvaGlnaGxpZ2h0LmpzCkBAIC0xICsxLDMxIEBACi12YXIgaGxqcz1uZXcgZnVuY3Rpb24oKXtmdW5jdGlvbiBsKG8pe3JldHVybiBvLnJlcGxhY2UoLyYvZ20sIiZhbXA7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKX1mdW5jdGlvbiBiKHApe2Zvcih2YXIgbz1wLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpe2lmKG8ubm9kZU5hbWU9PSJDT0RFIil7cmV0dXJuIG99aWYoIShvLm5vZGVUeXBlPT0zJiZvLm5vZGVWYWx1ZS5tYXRjaCgvXHMrLykpKXticmVha319fWZ1bmN0aW9uIGgocCxvKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHAuY2hpbGROb2RlcyxmdW5jdGlvbihxKXtpZihxLm5vZGVUeXBlPT0zKXtyZXR1cm4gbz9xLm5vZGVWYWx1ZS5yZXBsYWNlKC9cbi9nLCIiKTpxLm5vZGVWYWx1ZX1pZihxLm5vZGVOYW1lPT0iQlIiKXtyZXR1cm4iXG4ifXJldHVybiBoKHEsbyl9KS5qb2luKCIiKX1mdW5jdGlvbiBhKHEpe3ZhciBwPShxLmNsYXNzTmFtZSsiICIrcS5wYXJlbnROb2RlLmNsYXNzTmFtZSkuc3BsaXQoL1xzKy8pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIucmVwbGFjZSgvXmxhbmd1YWdlLS8sIiIpfSk7Zm9yKHZhciBvPTA7bzxwLmxlbmd0aDtvKyspe2lmKGVbcFtvXV18fHBbb109PSJuby1oaWdobGlnaHQiKXtyZXR1cm4gcFtvXX19fWZ1bmN0aW9uIGMocSl7dmFyIG89W107KGZ1bmN0aW9uIHAocixzKXtmb3IodmFyIHQ9ci5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXtpZih0Lm5vZGVUeXBlPT0zKXtzKz10Lm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZih0Lm5vZGVOYW1lPT0iQlIiKXtzKz0xfWVsc2V7aWYodC5ub2RlVHlwZT09MSl7by5wdXNoKHtldmVudDoic3RhcnQiLG9mZnNldDpzLG5vZGU6dH0pO3M9cCh0LHMpO28ucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDpzLG5vZGU6dH0pfX19fXJldHVybiBzfSkocSwwKTtyZXR1cm4gb31mdW5jdGlvbiBqKHgsdix3KXt2YXIgcD0wO3ZhciB5PSIiO3ZhciByPVtdO2Z1bmN0aW9uIHQoKXtpZih4Lmxlbmd0aCYmdi5sZW5ndGgpe2lmKHhbMF0ub2Zmc2V0IT12WzBdLm9mZnNldCl7cmV0dXJuKHhbMF0ub2Zmc2V0PHZbMF0ub2Zmc2V0KT94OnZ9ZWxzZXtyZXR1cm4gdlswXS5ldmVudD09InN0YXJ0Ij94OnZ9fWVsc2V7cmV0dXJuIHgubGVuZ3RoP3g6dn19ZnVuY3Rpb24gcyhBKXtmdW5jdGlvbiB6KEIpe3JldHVybiIgIitCLm5vZGVOYW1lKyc9IicrbChCLnZhbHVlKSsnIid9cmV0dXJuIjwiK0Eubm9kZU5hbWUrQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKEEuYXR0cmlidXRlcyx6KS5qb2luKCIiKSsiPiJ9d2hpbGUoeC5sZW5ndGh8fHYubGVuZ3RoKXt2YXIgdT10KCkuc3BsaWNlKDAsMSlbMF07eSs9bCh3LnN1YnN0cihwLHUub2Zmc2V0LXApKTtwPXUub2Zmc2V0O2lmKHUuZXZlbnQ9PSJzdGFydCIpe3krPXModS5ub2RlKTtyLnB1c2godS5ub2RlKX1lbHNle2lmKHUuZXZlbnQ9PSJzdG9wIil7dmFyIG8scT1yLmxlbmd0aDtkb3txLS07bz1yW3FdO3krPSgiPC8iK28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKG8hPXUubm9kZSk7ci5zcGxpY2UocSwxKTt3aGlsZShxPHIubGVuZ3RoKXt5Kz1zKHJbcV0pO3ErK319fX1yZXR1cm4geStsKHcuc3Vic3RyKHApKX1mdW5jdGlvbiBmKHEpe2Z1bmN0aW9uIG8ocyxyKXtyZXR1cm4gUmVnRXhwKHMsIm0iKyhxLmNJPyJpIjoiIikrKHI/ImciOiIiKSl9ZnVuY3Rpb24gcCh5LHcpe2lmKHkuY29tcGlsZWQpe3JldHVybn15LmNvbXBpbGVkPXRydWU7dmFyIHM9W107aWYoeS5rKXt2YXIgcj17fTtmdW5jdGlvbiB6KEEsdCl7dC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEM9Qi5zcGxpdCgifCIpO3JbQ1swXV09W0EsQ1sxXT9OdW1iZXIoQ1sxXSk6MV07cy5wdXNoKENbMF0pfSl9eS5sUj1vKHkubHx8aGxqcy5JUix0cnVlKTtpZih0eXBlb2YgeS5rPT0ic3RyaW5nIil7eigia2V5d29yZCIseS5rKX1lbHNle2Zvcih2YXIgeCBpbiB5Lmspe2lmKCF5LmsuaGFzT3duUHJvcGVydHkoeCkpe2NvbnRpbnVlfXooeCx5LmtbeF0pfX15Lms9cn1pZih3KXtpZih5LmJXSyl7eS5iPSJcXGIoIitzLmpvaW4oInwiKSsiKVxccyJ9eS5iUj1vKHkuYj95LmI6IlxcQnxcXGIiKTtpZigheS5lJiYheS5lVyl7eS5lPSJcXEJ8XFxiIn1pZih5LmUpe3kuZVI9byh5LmUpfXkudEU9eS5lfHwiIjtpZih5LmVXJiZ3LnRFKXt5LnRFKz0oeS5lPyJ8IjoiIikrdy50RX19aWYoeS5pKXt5LmlSPW8oeS5pKX1pZih5LnI9PT11bmRlZmluZWQpe3kucj0xfWlmKCF5LmMpe3kuYz1bXX1mb3IodmFyIHY9MDt2PHkuYy5sZW5ndGg7disrKXtpZih5LmNbdl09PSJzZWxmIil7eS5jW3ZdPXl9cCh5LmNbdl0seSl9aWYoeS5zdGFydHMpe3AoeS5zdGFydHMsdyl9dmFyIHU9W107Zm9yKHZhciB2PTA7djx5LmMubGVuZ3RoO3YrKyl7dS5wdXNoKHkuY1t2XS5iKX1pZih5LnRFKXt1LnB1c2goeS50RSl9aWYoeS5pKXt1LnB1c2goeS5pKX15LnQ9dS5sZW5ndGg/byh1LmpvaW4oInwiKSx0cnVlKTp7ZXhlYzpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbH19fXAocSl9ZnVuY3Rpb24gZChELEUpe2Z1bmN0aW9uIG8ocixNKXtmb3IodmFyIEw9MDtMPE0uYy5sZW5ndGg7TCsrKXt2YXIgSz1NLmNbTF0uYlIuZXhlYyhyKTtpZihLJiZLLmluZGV4PT0wKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gcyhLLHIpe2lmKEsuZSYmSy5lUi50ZXN0KHIpKXtyZXR1cm4gS31pZihLLmVXKXtyZXR1cm4gcyhLLnBhcmVudCxyKX19ZnVuY3Rpb24gdChyLEspe3JldHVybiBLLmkmJksuaVIudGVzdChyKX1mdW5jdGlvbiB5KEwscil7dmFyIEs9Ri5jST9yWzBdLnRvTG93ZXJDYXNlKCk6clswXTtyZXR1cm4gTC5rLmhhc093blByb3BlcnR5KEspJiZMLmtbS119ZnVuY3Rpb24gRygpe3ZhciBLPWwodyk7aWYoIUEuayl7cmV0dXJuIEt9dmFyIHI9IiI7dmFyIE49MDtBLmxSLmxhc3RJbmRleD0wO3ZhciBMPUEubFIuZXhlYyhLKTt3aGlsZShMKXtyKz1LLnN1YnN0cihOLEwuaW5kZXgtTik7dmFyIE09eShBLEwpO2lmKE0pe3YrPU1bMV07cis9JzxzcGFuIGNsYXNzPSInK01bMF0rJyI+JytMWzBdKyI8L3NwYW4+In1lbHNle3IrPUxbMF19Tj1BLmxSLmxhc3RJbmRleDtMPUEubFIuZXhlYyhLKX1yZXR1cm4gcitLLnN1YnN0cihOKX1mdW5jdGlvbiB6KCl7aWYoQS5zTCYmIWVbQS5zTF0pe3JldHVybiBsKHcpfXZhciByPUEuc0w/ZChBLnNMLHcpOmcodyk7aWYoQS5yPjApe3YrPXIua2V5d29yZF9jb3VudDtCKz1yLnJ9cmV0dXJuJzxzcGFuIGNsYXNzPSInK3IubGFuZ3VhZ2UrJyI+JytyLnZhbHVlKyI8L3NwYW4+In1mdW5jdGlvbiBKKCl7cmV0dXJuIEEuc0whPT11bmRlZmluZWQ/eigpOkcoKX1mdW5jdGlvbiBJKEwscil7dmFyIEs9TC5jTj8nPHNwYW4gY2xhc3M9IicrTC5jTisnIj4nOiIiO2lmKEwuckIpe3grPUs7dz0iIn1lbHNle2lmKEwuZUIpe3grPWwocikrSzt3PSIifWVsc2V7eCs9Szt3PXJ9fUE9T2JqZWN0LmNyZWF0ZShMLHtwYXJlbnQ6e3ZhbHVlOkF9fSk7Qis9TC5yfWZ1bmN0aW9uIEMoSyxyKXt3Kz1LO2lmKHI9PT11bmRlZmluZWQpe3grPUooKTtyZXR1cm4gMH12YXIgTD1vKHIsQSk7aWYoTCl7eCs9SigpO0koTCxyKTtyZXR1cm4gTC5yQj8wOnIubGVuZ3RofXZhciBNPXMoQSxyKTtpZihNKXtpZighKE0uckV8fE0uZUUpKXt3Kz1yfXgrPUooKTtkb3tpZihBLmNOKXt4Kz0iPC9zcGFuPiJ9QT1BLnBhcmVudH13aGlsZShBIT1NLnBhcmVudCk7aWYoTS5lRSl7eCs9bChyKX13PSIiO2lmKE0uc3RhcnRzKXtJKE0uc3RhcnRzLCIiKX1yZXR1cm4gTS5yRT8wOnIubGVuZ3RofWlmKHQocixBKSl7dGhyb3ciSWxsZWdhbCJ9dys9cjtyZXR1cm4gci5sZW5ndGh8fDF9dmFyIEY9ZVtEXTtmKEYpO3ZhciBBPUY7dmFyIHc9IiI7dmFyIEI9MDt2YXIgdj0wO3ZhciB4PSIiO3RyeXt2YXIgdSxxLHA9MDt3aGlsZSh0cnVlKXtBLnQubGFzdEluZGV4PXA7dT1BLnQuZXhlYyhFKTtpZighdSl7YnJlYWt9cT1DKEUuc3Vic3RyKHAsdS5pbmRleC1wKSx1WzBdKTtwPXUuaW5kZXgrcX1DKEUuc3Vic3RyKHApKTtyZXR1cm57cjpCLGtleXdvcmRfY291bnQ6dix2YWx1ZTp4LGxhbmd1YWdlOkR9fWNhdGNoKEgpe2lmKEg9PSJJbGxlZ2FsIil7cmV0dXJue3I6MCxrZXl3b3JkX2NvdW50OjAsdmFsdWU6bChFKX19ZWxzZXt0aHJvdyBIfX19ZnVuY3Rpb24gZyhzKXt2YXIgbz17a2V5d29yZF9jb3VudDowLHI6MCx2YWx1ZTpsKHMpfTt2YXIgcT1vO2Zvcih2YXIgcCBpbiBlKXtpZighZS5oYXNPd25Qcm9wZXJ0eShwKSl7Y29udGludWV9dmFyIHI9ZChwLHMpO3IubGFuZ3VhZ2U9cDtpZihyLmtleXdvcmRfY291bnQrci5yPnEua2V5d29yZF9jb3VudCtxLnIpe3E9cn1pZihyLmtleXdvcmRfY291bnQrci5yPm8ua2V5d29yZF9jb3VudCtvLnIpe3E9bztvPXJ9fWlmKHEubGFuZ3VhZ2Upe28uc2Vjb25kX2Jlc3Q9cX1yZXR1cm4gb31mdW5jdGlvbiBpKHEscCxvKXtpZihwKXtxPXEucmVwbGFjZSgvXigoPFtePl0rPnxcdCkrKS9nbSxmdW5jdGlvbihyLHYsdSx0KXtyZXR1cm4gdi5yZXBsYWNlKC9cdC9nLHApfSl9aWYobyl7cT1xLnJlcGxhY2UoL1xuL2csIjxicj4iKX1yZXR1cm4gcX1mdW5jdGlvbiBtKHIsdSxwKXt2YXIgdj1oKHIscCk7dmFyIHQ9YShyKTtpZih0PT0ibm8taGlnaGxpZ2h0Iil7cmV0dXJufXZhciB3PXQ/ZCh0LHYpOmcodik7dD13Lmxhbmd1YWdlO3ZhciBvPWMocik7aWYoby5sZW5ndGgpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3EuaW5uZXJIVE1MPXcudmFsdWU7dy52YWx1ZT1qKG8sYyhxKSx2KX13LnZhbHVlPWkody52YWx1ZSx1LHApO3ZhciBzPXIuY2xhc3NOYW1lO2lmKCFzLm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit0KyIoXFxzfCQpIikpe3M9cz8ocysiICIrdCk6dH1yLmlubmVySFRNTD13LnZhbHVlO3IuY2xhc3NOYW1lPXM7ci5yZXN1bHQ9e2xhbmd1YWdlOnQsa3c6dy5rZXl3b3JkX2NvdW50LHJlOncucn07aWYody5zZWNvbmRfYmVzdCl7ci5zZWNvbmRfYmVzdD17bGFuZ3VhZ2U6dy5zZWNvbmRfYmVzdC5sYW5ndWFnZSxrdzp3LnNlY29uZF9iZXN0LmtleXdvcmRfY291bnQscmU6dy5zZWNvbmRfYmVzdC5yfX19ZnVuY3Rpb24gbigpe2lmKG4uY2FsbGVkKXtyZXR1cm59bi5jYWxsZWQ9dHJ1ZTtBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGIpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe20obyxobGpzLnRhYlJlcGxhY2UpfSl9ZnVuY3Rpb24gaygpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuLGZhbHNlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbixmYWxzZSl9dmFyIGU9e307dGhpcy5MQU5HVUFHRVM9ZTt0aGlzLmhpZ2hsaWdodD1kO3RoaXMuaGlnaGxpZ2h0QXV0bz1nO3RoaXMuZml4TWFya3VwPWk7dGhpcy5oaWdobGlnaHRCbG9jaz1tO3RoaXMuaW5pdEhpZ2hsaWdodGluZz1uO3RoaXMuaW5pdEhpZ2hsaWdodGluZ09uTG9hZD1rO3RoaXMuSVI9IlthLXpBLVpdW2EtekEtWjAtOV9dKiI7dGhpcy5VSVI9IlthLXpBLVpfXVthLXpBLVowLTlfXSoiO3RoaXMuTlI9IlxcYlxcZCsoXFwuXFxkKyk/Ijt0aGlzLkNOUj0iKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIjt0aGlzLkJOUj0iXFxiKDBiWzAxXSspIjt0aGlzLlJTUj0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8XFwufC18LT18L3wvPXw6fDt8PHw8PHw8PD18PD18PXw9PXw9PT18Pnw+PXw+Pnw+Pj18Pj4+fD4+Pj18XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+Ijt0aGlzLkJFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihxLHIpe3ZhciBvPXt9O2Zvcih2YXIgcCBpbiBxKXtvW3BdPXFbcF19aWYocil7Zm9yKHZhciBwIGluIHIpe29bcF09cltwXX19cmV0dXJuIG99fSgpO2hsanMuTEFOR1VBR0VTLnJ1Ynk9ZnVuY3Rpb24oZSl7dmFyIGE9IlthLXpBLVpfXVthLXpBLVowLTlfXSooXFwhfFxcPyk/Ijt2YXIgaj0iW2EtekEtWl9dXFx3KlshPz1dP3xbLSt+XVxcQHw8PHw+Pnw9fnw9PT0/fDw9PnxbPD5dPT98XFwqXFwqfFstLyslXiYqfmB8XXxcXFtcXF09PyI7dmFyIGc9e2tleXdvcmQ6ImFuZCBmYWxzZSB0aGVuIGRlZmluZWQgbW9kdWxlIGluIHJldHVybiByZWRvIGlmIEJFR0lOIHJldHJ5IGVuZCBmb3IgdHJ1ZSBzZWxmIHdoZW4gbmV4dCB1bnRpbCBkbyBiZWdpbiB1bmxlc3MgRU5EIHJlc2N1ZSBuaWwgZWxzZSBicmVhayB1bmRlZiBub3Qgc3VwZXIgY2xhc3MgY2FzZSByZXF1aXJlIHlpZWxkIGFsaWFzIHdoaWxlIGVuc3VyZSBlbHNpZiBvciBpbmNsdWRlIn07dmFyIGM9e2NOOiJ5YXJkb2N0YWciLGI6IkBbQS1aYS16XSsifTt2YXIgaz1be2NOOiJjb21tZW50IixiOiIjIixlOiIkIixjOltjXX0se2NOOiJjb21tZW50IixiOiJeXFw9YmVnaW4iLGU6Il5cXD1lbmQiLGM6W2NdLHI6MTB9LHtjTjoiY29tbWVudCIsYjoiXl9fRU5EX18iLGU6IlxcbiQifV07dmFyIGQ9e2NOOiJzdWJzdCIsYjoiI1xceyIsZToifSIsbDphLGs6Z307dmFyIGk9W2UuQkUsZF07dmFyIGI9W3tjTjoic3RyaW5nIixiOiInIixlOiInIixjOmkscjowfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6IiVbcXddP1xcKCIsZToiXFwpIixjOml9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXFsiLGU6IlxcXSIsYzppfSx7Y046InN0cmluZyIsYjoiJVtxd10/eyIsZToifSIsYzppfSx7Y046InN0cmluZyIsYjoiJVtxd10/PCIsZToiPiIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8vIixlOiIvIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPyUiLGU6IiUiLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LSIsZToiLSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXHwiLGU6IlxcfCIsYzppLHI6MTB9XTt2YXIgaD17Y046ImZ1bmN0aW9uIixiV0s6dHJ1ZSxlOiIgfCR8OyIsazoiZGVmIixjOlt7Y046InRpdGxlIixiOmosbDphLGs6Z30se2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixsOmEsazpnfV0uY29uY2F0KGspfTt2YXIgZj1rLmNvbmNhdChiLmNvbmNhdChbe2NOOiJjbGFzcyIsYldLOnRydWUsZToiJHw7IixrOiJjbGFzcyBtb2R1bGUiLGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXpfXVxcdyooOjpcXHcrKSooXFw/fFxcISk/IixyOjB9LHtjTjoiaW5oZXJpdGFuY2UiLGI6IjxcXHMqIixjOlt7Y046InBhcmVudCIsYjoiKCIrZS5JUisiOjopPyIrZS5JUn1dfV0uY29uY2F0KGspfSxoLHtjTjoiY29uc3RhbnQiLGI6Iig6Oik/KFxcYltBLVpdXFx3Kig6Oik/KSsiLHI6MH0se2NOOiJzeW1ib2wiLGI6IjoiLGM6Yi5jb25jYXQoW3tiOmp9XSkscjowfSx7Y046InN5bWJvbCIsYjphKyI6IixyOjB9LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXD9cXHcifSx7Y046InZhcmlhYmxlIixiOiIoXFwkXFxXKXwoKFxcJHxcXEBcXEA/KShcXHcrKSkifSx7YjoiKCIrZS5SU1IrIilcXHMqIixjOmsuY29uY2F0KFt7Y046InJlZ2V4cCIsYjoiLyIsZToiL1thLXpdKiIsaToiXFxuIixjOltlLkJFLGRdfV0pLHI6MH1dKSk7ZC5jPWY7aC5jWzFdLmM9ZjtyZXR1cm57bDphLGs6ZyxjOmZ9fShobGpzKTtobGpzLkxBTkdVQUdFUy5kaWZmPWZ1bmN0aW9uKGEpe3JldHVybntjOlt7Y046ImNodW5rIixiOiJeXFxAXFxAICtcXC1cXGQrLFxcZCsgK1xcK1xcZCssXFxkKyArXFxAXFxAJCIscjoxMH0se2NOOiJjaHVuayIsYjoiXlxcKlxcKlxcKiArXFxkKyxcXGQrICtcXCpcXCpcXCpcXCokIixyOjEwfSx7Y046ImNodW5rIixiOiJeXFwtXFwtXFwtICtcXGQrLFxcZCsgK1xcLVxcLVxcLVxcLSQiLHI6MTB9LHtjTjoiaGVhZGVyIixiOiJJbmRleDogIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6Ij09PT09IixlOiI9PT09PSQifSx7Y046ImhlYWRlciIsYjoiXlxcLVxcLVxcLSIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiJeXFwqezN9ICIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiJeXFwrXFwrXFwrIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6IlxcKns1fSIsZToiXFwqezV9JCJ9LHtjTjoiYWRkaXRpb24iLGI6Il5cXCsiLGU6IiQifSx7Y046ImRlbGV0aW9uIixiOiJeXFwtIixlOiIkIn0se2NOOiJjaGFuZ2UiLGI6Il5cXCEiLGU6IiQifV19fShobGpzKTtobGpzLkxBTkdVQUdFUy5qYXZhc2NyaXB0PWZ1bmN0aW9uKGEpe3JldHVybntrOntrZXl3b3JkOiJpbiBpZiBmb3Igd2hpbGUgZmluYWxseSB2YXIgbmV3IGZ1bmN0aW9uIGRvIHJldHVybiB2b2lkIGVsc2UgYnJlYWsgY2F0Y2ggaW5zdGFuY2VvZiB3aXRoIHRocm93IGNhc2UgZGVmYXVsdCB0cnkgdGhpcyBzd2l0Y2ggY29udGludWUgdHlwZW9mIGRlbGV0ZSBsZXQgeWllbGQgY29uc3QiLGxpdGVyYWw6InRydWUgZmFsc2UgbnVsbCB1bmRlZmluZWQgTmFOIEluZmluaXR5In0sYzpbYS5BU00sYS5RU00sYS5DTENNLGEuQ0JMQ0xNLGEuQ05NLHtiOiIoIithLlJTUisifFxcYihjYXNlfHJldHVybnx0aHJvdylcXGIpXFxzKiIsazoicmV0dXJuIHRocm93IGNhc2UiLGM6W2EuQ0xDTSxhLkNCTENMTSx7Y046InJlZ2V4cCIsYjoiLyIsZToiL1tnaW1dKiIsaToiXFxuIixjOlt7YjoiXFxcXC8ifV19LHtiOiI8IixlOiI+OyIsc0w6InhtbCJ9XSxyOjB9LHtjTjoiZnVuY3Rpb24iLGJXSzp0cnVlLGU6InsiLGs6ImZ1bmN0aW9uIixjOlt7Y046InRpdGxlIixiOiJbQS1aYS16JF9dWzAtOUEtWmEteiRfXSoifSx7Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6W2EuQ0xDTSxhLkNCTENMTV0saToiW1wiJ1xcKF0ifV0saToiXFxbfCUifV19fShobGpzKTtobGpzLkxBTkdVQUdFUy54bWw9ZnVuY3Rpb24oYSl7dmFyIGM9IltBLVphLXowLTlcXC5fOi1dKyI7dmFyIGI9e2VXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6YyxyOjB9LHtiOic9IicsckI6dHJ1ZSxlOiciJyxjOlt7Y046InZhbHVlIixiOiciJyxlVzp0cnVlfV19LHtiOiI9JyIsckI6dHJ1ZSxlOiInIixjOlt7Y046InZhbHVlIixiOiInIixlVzp0cnVlfV19LHtiOiI9IixjOlt7Y046InZhbHVlIixiOiJbXlxccy8+XSsifV19XX07cmV0dXJue2NJOnRydWUsYzpbe2NOOiJwaSIsYjoiPFxcPyIsZToiXFw/PiIscjoxMH0se2NOOiJkb2N0eXBlIixiOiI8IURPQ1RZUEUiLGU6Ij4iLHI6MTAsYzpbe2I6IlxcWyIsZToiXFxdIn1dfSx7Y046ImNvbW1lbnQiLGI6IjwhLS0iLGU6Ii0tPiIscjoxMH0se2NOOiJjZGF0YSIsYjoiPFxcIVxcW0NEQVRBXFxbIixlOiJcXF1cXF0+IixyOjEwfSx7Y046InRhZyIsYjoiPHN0eWxlKD89XFxzfD58JCkiLGU6Ij4iLGs6e3RpdGxlOiJzdHlsZSJ9LGM6W2JdLHN0YXJ0czp7ZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZToic2NyaXB0In0sYzpbYl0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTp0cnVlLHNMOiJqYXZhc2NyaXB0In19LHtiOiI8JSIsZToiJT4iLHNMOiJ2YnNjcmlwdCJ9LHtjTjoidGFnIixiOiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJ0aXRsZSIsYjoiW14gLz5dKyJ9LGJdfV19fShobGpzKTtobGpzLkxBTkdVQUdFUy5waHA9ZnVuY3Rpb24oYSl7dmFyIGU9e2NOOiJ2YXJpYWJsZSIsYjoiXFwkK1thLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSoifTt2YXIgYj1bYS5pbmhlcml0KGEuQVNNLHtpOm51bGx9KSxhLmluaGVyaXQoYS5RU00se2k6bnVsbH0pLHtjTjoic3RyaW5nIixiOidiIicsZTonIicsYzpbYS5CRV19LHtjTjoic3RyaW5nIixiOiJiJyIsZToiJyIsYzpbYS5CRV19XTt2YXIgYz1bYS5CTk0sYS5DTk1dO3ZhciBkPXtjTjoidGl0bGUiLGI6YS5VSVJ9O3JldHVybntjSTp0cnVlLGs6ImFuZCBpbmNsdWRlX29uY2UgbGlzdCBhYnN0cmFjdCBnbG9iYWwgcHJpdmF0ZSBlY2hvIGludGVyZmFjZSBhcyBzdGF0aWMgZW5kc3dpdGNoIGFycmF5IG51bGwgaWYgZW5kd2hpbGUgb3IgY29uc3QgZm9yIGVuZGZvcmVhY2ggc2VsZiB2YXIgd2hpbGUgaXNzZXQgcHVibGljIHByb3RlY3RlZCBleGl0IGZvcmVhY2ggdGhyb3cgZWxzZWlmIGluY2x1ZGUgX19GSUxFX18gZW1wdHkgcmVxdWlyZV9vbmNlIGRvIHhvciByZXR1cm4gaW1wbGVtZW50cyBwYXJlbnQgY2xvbmUgdXNlIF9fQ0xBU1NfXyBfX0xJTkVfXyBlbHNlIGJyZWFrIHByaW50IGV2YWwgbmV3IGNhdGNoIF9fTUVUSE9EX18gY2FzZSBleGNlcHRpb24gcGhwX3VzZXJfZmlsdGVyIGRlZmF1bHQgZGllIHJlcXVpcmUgX19GVU5DVElPTl9fIGVuZGRlY2xhcmUgZmluYWwgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIGVuZGZvciBlbmRpZiBkZWNsYXJlIHVuc2V0IHRydWUgZmFsc2UgbmFtZXNwYWNlIHRyYWl0IGdvdG8gaW5zdGFuY2VvZiBpbnN0ZWFkb2YgX19ESVJfXyBfX05BTUVTUEFDRV9fIF9faGFsdF9jb21waWxlciIsYzpbYS5DTENNLGEuSENNLHtjTjoiY29tbWVudCIsYjoiL1xcKiIsZToiXFwqLyIsYzpbe2NOOiJwaHBkb2MiLGI6Ilxcc0BbQS1aYS16XSsifV19LHtjTjoiY29tbWVudCIsZUI6dHJ1ZSxiOiJfX2hhbHRfY29tcGlsZXIuKz87IixlVzp0cnVlfSx7Y046InN0cmluZyIsYjoiPDw8WydcIl0/XFx3K1snXCJdPyQiLGU6Il5cXHcrOyIsYzpbYS5CRV19LHtjTjoicHJlcHJvY2Vzc29yIixiOiI8XFw/cGhwIixyOjEwfSx7Y046InByZXByb2Nlc3NvciIsYjoiXFw/PiJ9LGUse2NOOiJmdW5jdGlvbiIsYldLOnRydWUsZToieyIsazoiZnVuY3Rpb24iLGk6IlxcJHxcXFt8JSIsYzpbZCx7Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6WyJzZWxmIixlLGEuQ0JMQ0xNXS5jb25jYXQoYikuY29uY2F0KGMpfV19LHtjTjoiY2xhc3MiLGJXSzp0cnVlLGU6InsiLGs6ImNsYXNzIixpOiJbOlxcKFxcJF0iLGM6W3tiV0s6dHJ1ZSxlVzp0cnVlLGs6ImV4dGVuZHMiLGM6W2RdfSxkXX0se2I6Ij0+In1dLmNvbmNhdChiKS5jb25jYXQoYyl9fShobGpzKTtobGpzLkxBTkdVQUdFUy5weXRob249ZnVuY3Rpb24oYSl7dmFyIGY9e2NOOiJwcm9tcHQiLGI6Il4oPj4+fFxcLlxcLlxcLikgIn07dmFyIGM9W3tjTjoic3RyaW5nIixiOiIodXxiKT9yPycnJyIsZToiJycnIixjOltmXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8Yik/cj8iIiInLGU6JyIiIicsYzpbZl0scjoxMH0se2NOOiJzdHJpbmciLGI6Iih1fHJ8dXIpJyIsZToiJyIsYzpbYS5CRV0scjoxMH0se2NOOiJzdHJpbmciLGI6Jyh1fHJ8dXIpIicsZTonIicsYzpbYS5CRV0scjoxMH0se2NOOiJzdHJpbmciLGI6IihifGJyKSciLGU6IiciLGM6W2EuQkVdfSx7Y046InN0cmluZyIsYjonKGJ8YnIpIicsZTonIicsYzpbYS5CRV19XS5jb25jYXQoW2EuQVNNLGEuUVNNXSk7dmFyIGU9e2NOOiJ0aXRsZSIsYjphLlVJUn07dmFyIGQ9e2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixjOlsic2VsZiIsYS5DTk0sZl0uY29uY2F0KGMpfTt2YXIgYj17YldLOnRydWUsZToiOiIsaToiWyR7PTtcXG5dIixjOltlLGRdLHI6MTB9O3JldHVybntrOntrZXl3b3JkOiJhbmQgZWxpZiBpcyBnbG9iYWwgYXMgaW4gaWYgZnJvbSByYWlzZSBmb3IgZXhjZXB0IGZpbmFsbHkgcHJpbnQgaW1wb3J0IHBhc3MgcmV0dXJuIGV4ZWMgZWxzZSBicmVhayBub3Qgd2l0aCBjbGFzcyBhc3NlcnQgeWllbGQgdHJ5IHdoaWxlIGNvbnRpbnVlIGRlbCBvciBkZWYgbGFtYmRhIG5vbmxvY2FsfDEwIixidWlsdF9pbjoiTm9uZSBUcnVlIEZhbHNlIEVsbGlwc2lzIE5vdEltcGxlbWVudGVkIn0saToiKDwvfC0+fFxcPykiLGM6Yy5jb25jYXQoW2YsYS5IQ00sYS5pbmhlcml0KGIse2NOOiJmdW5jdGlvbiIsazoiZGVmIn0pLGEuaW5oZXJpdChiLHtjTjoiY2xhc3MiLGs6ImNsYXNzIn0pLGEuQ05NLHtjTjoiZGVjb3JhdG9yIixiOiJAIixlOiIkIn0se2I6IlxcYihwcmludHxleGVjKVxcKCJ9XSl9fShobGpzKTtobGpzLkxBTkdVQUdFUy5qc29uPWZ1bmN0aW9uKGEpe3ZhciBlPXtsaXRlcmFsOiJ0cnVlIGZhbHNlIG51bGwifTt2YXIgZD1bYS5RU00sYS5DTk1dO3ZhciBjPXtjTjoidmFsdWUiLGU6IiwiLGVXOnRydWUsZUU6dHJ1ZSxjOmQsazplfTt2YXIgYj17YjoieyIsZToifSIsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6J1xccyoiJyxlOiciXFxzKjpcXHMqJyxlQjp0cnVlLGVFOnRydWUsYzpbYS5CRV0saToiXFxuIixzdGFydHM6Y31dLGk6IlxcUyJ9O3ZhciBmPXtiOiJcXFsiLGU6IlxcXSIsYzpbYS5pbmhlcml0KGMse2NOOm51bGx9KV0saToiXFxTIn07ZC5zcGxpY2UoZC5sZW5ndGgsMCxiLGYpO3JldHVybntjOmQsazplLGk6IlxcUyJ9fShobGpzKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisvKgorCitDb3B5cmlnaHQgKGMpIDIwMDYsIEl2YW4gU2FnYWxhZXYKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgaGlnaGxpZ2h0LmpzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyAKKyAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSAKKyAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKK0VYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKK09OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyovCisKK3ZhciBobGpzPW5ldyBmdW5jdGlvbigpe2Z1bmN0aW9uIGwobyl7cmV0dXJuIG8ucmVwbGFjZSgvJi9nbSwiJmFtcDsiKS5yZXBsYWNlKC88L2dtLCImbHQ7IikucmVwbGFjZSgvPi9nbSwiJmd0OyIpfWZ1bmN0aW9uIGIocCl7Zm9yKHZhciBvPXAuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZyl7aWYoby5ub2RlTmFtZT09IkNPREUiKXtyZXR1cm4gb31pZighKG8ubm9kZVR5cGU9PTMmJm8ubm9kZVZhbHVlLm1hdGNoKC9ccysvKSkpe2JyZWFrfX19ZnVuY3Rpb24gaChwLG8pe3JldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwocC5jaGlsZE5vZGVzLGZ1bmN0aW9uKHEpe2lmKHEubm9kZVR5cGU9PTMpe3JldHVybiBvP3Eubm9kZVZhbHVlLnJlcGxhY2UoL1xuL2csIiIpOnEubm9kZVZhbHVlfWlmKHEubm9kZU5hbWU9PSJCUiIpe3JldHVybiJcbiJ9cmV0dXJuIGgocSxvKX0pLmpvaW4oIiIpfWZ1bmN0aW9uIGEocSl7dmFyIHA9KHEuY2xhc3NOYW1lKyIgIitxLnBhcmVudE5vZGUuY2xhc3NOYW1lKS5zcGxpdCgvXHMrLyk7cD1wLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5yZXBsYWNlKC9ebGFuZ3VhZ2UtLywiIil9KTtmb3IodmFyIG89MDtvPHAubGVuZ3RoO28rKyl7aWYoZVtwW29dXXx8cFtvXT09Im5vLWhpZ2hsaWdodCIpe3JldHVybiBwW29dfX19ZnVuY3Rpb24gYyhxKXt2YXIgbz1bXTsoZnVuY3Rpb24gcChyLHMpe2Zvcih2YXIgdD1yLmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpe2lmKHQubm9kZVR5cGU9PTMpe3MrPXQubm9kZVZhbHVlLmxlbmd0aH1lbHNle2lmKHQubm9kZU5hbWU9PSJCUiIpe3MrPTF9ZWxzZXtpZih0Lm5vZGVUeXBlPT0xKXtvLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnMsbm9kZTp0fSk7cz1wKHQscyk7by5wdXNoKHtldmVudDoic3RvcCIsb2Zmc2V0OnMsbm9kZTp0fSl9fX19cmV0dXJuIHN9KShxLDApO3JldHVybiBvfWZ1bmN0aW9uIGooeCx2LHcpe3ZhciBwPTA7dmFyIHk9IiI7dmFyIHI9W107ZnVuY3Rpb24gdCgpe2lmKHgubGVuZ3RoJiZ2Lmxlbmd0aCl7aWYoeFswXS5vZmZzZXQhPXZbMF0ub2Zmc2V0KXtyZXR1cm4oeFswXS5vZmZzZXQ8dlswXS5vZmZzZXQpP3g6dn1lbHNle3JldHVybiB2WzBdLmV2ZW50PT0ic3RhcnQiP3g6dn19ZWxzZXtyZXR1cm4geC5sZW5ndGg/eDp2fX1mdW5jdGlvbiBzKEEpe2Z1bmN0aW9uIHooQil7cmV0dXJuIiAiK0Iubm9kZU5hbWUrJz0iJytsKEIudmFsdWUpKyciJ31yZXR1cm4iPCIrQS5ub2RlTmFtZStBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoQS5hdHRyaWJ1dGVzLHopLmpvaW4oIiIpKyI+In13aGlsZSh4Lmxlbmd0aHx8di5sZW5ndGgpe3ZhciB1PXQoKS5zcGxpY2UoMCwxKVswXTt5Kz1sKHcuc3Vic3RyKHAsdS5vZmZzZXQtcCkpO3A9dS5vZmZzZXQ7aWYodS5ldmVudD09InN0YXJ0Iil7eSs9cyh1Lm5vZGUpO3IucHVzaCh1Lm5vZGUpfWVsc2V7aWYodS5ldmVudD09InN0b3AiKXt2YXIgbyxxPXIubGVuZ3RoO2Rve3EtLTtvPXJbcV07eSs9KCI8LyIrby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKyI+Iil9d2hpbGUobyE9dS5ub2RlKTtyLnNwbGljZShxLDEpO3doaWxlKHE8ci5sZW5ndGgpe3krPXMocltxXSk7cSsrfX19fXJldHVybiB5K2wody5zdWJzdHIocCkpfWZ1bmN0aW9uIGYocSl7ZnVuY3Rpb24gbyhzLHIpe3JldHVybiBSZWdFeHAocywibSIrKHEuY0k/ImkiOiIiKSsocj8iZyI6IiIpKX1mdW5jdGlvbiBwKHksdyl7aWYoeS5jb21waWxlZCl7cmV0dXJufXkuY29tcGlsZWQ9dHJ1ZTt2YXIgcz1bXTtpZih5Lmspe3ZhciByPXt9O2Z1bmN0aW9uIHooQSx0KXt0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgQz1CLnNwbGl0KCJ8Iik7cltDWzBdXT1bQSxDWzFdP051bWJlcihDWzFdKToxXTtzLnB1c2goQ1swXSl9KX15LmxSPW8oeS5sfHxobGpzLklSLHRydWUpO2lmKHR5cGVvZiB5Lms9PSJzdHJpbmciKXt6KCJrZXl3b3JkIix5LmspfWVsc2V7Zm9yKHZhciB4IGluIHkuayl7aWYoIXkuay5oYXNPd25Qcm9wZXJ0eSh4KSl7Y29udGludWV9eih4LHkua1t4XSl9fXkuaz1yfWlmKHcpe2lmKHkuYldLKXt5LmI9IlxcYigiK3Muam9pbigifCIpKyIpXFxzIn15LmJSPW8oeS5iP3kuYjoiXFxCfFxcYiIpO2lmKCF5LmUmJiF5LmVXKXt5LmU9IlxcQnxcXGIifWlmKHkuZSl7eS5lUj1vKHkuZSl9eS50RT15LmV8fCIiO2lmKHkuZVcmJncudEUpe3kudEUrPSh5LmU/InwiOiIiKSt3LnRFfX1pZih5Lmkpe3kuaVI9byh5LmkpfWlmKHkucj09PXVuZGVmaW5lZCl7eS5yPTF9aWYoIXkuYyl7eS5jPVtdfWZvcih2YXIgdj0wO3Y8eS5jLmxlbmd0aDt2Kyspe2lmKHkuY1t2XT09InNlbGYiKXt5LmNbdl09eX1wKHkuY1t2XSx5KX1pZih5LnN0YXJ0cyl7cCh5LnN0YXJ0cyx3KX12YXIgdT1bXTtmb3IodmFyIHY9MDt2PHkuYy5sZW5ndGg7disrKXt1LnB1c2goeS5jW3ZdLmIpfWlmKHkudEUpe3UucHVzaCh5LnRFKX1pZih5Lmkpe3UucHVzaCh5LmkpfXkudD11Lmxlbmd0aD9vKHUuam9pbigifCIpLHRydWUpOntleGVjOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsfX19cChxKX1mdW5jdGlvbiBkKEQsRSl7ZnVuY3Rpb24gbyhyLE0pe2Zvcih2YXIgTD0wO0w8TS5jLmxlbmd0aDtMKyspe3ZhciBLPU0uY1tMXS5iUi5leGVjKHIpO2lmKEsmJksuaW5kZXg9PTApe3JldHVybiBNLmNbTF19fX1mdW5jdGlvbiBzKEsscil7aWYoSy5lJiZLLmVSLnRlc3Qocikpe3JldHVybiBLfWlmKEsuZVcpe3JldHVybiBzKEsucGFyZW50LHIpfX1mdW5jdGlvbiB0KHIsSyl7cmV0dXJuIEsuaSYmSy5pUi50ZXN0KHIpfWZ1bmN0aW9uIHkoTCxyKXt2YXIgSz1GLmNJP3JbMF0udG9Mb3dlckNhc2UoKTpyWzBdO3JldHVybiBMLmsuaGFzT3duUHJvcGVydHkoSykmJkwua1tLXX1mdW5jdGlvbiBHKCl7dmFyIEs9bCh3KTtpZighQS5rKXtyZXR1cm4gS312YXIgcj0iIjt2YXIgTj0wO0EubFIubGFzdEluZGV4PTA7dmFyIEw9QS5sUi5leGVjKEspO3doaWxlKEwpe3IrPUsuc3Vic3RyKE4sTC5pbmRleC1OKTt2YXIgTT15KEEsTCk7aWYoTSl7dis9TVsxXTtyKz0nPHNwYW4gY2xhc3M9IicrTVswXSsnIj4nK0xbMF0rIjwvc3Bhbj4ifWVsc2V7cis9TFswXX1OPUEubFIubGFzdEluZGV4O0w9QS5sUi5leGVjKEspfXJldHVybiByK0suc3Vic3RyKE4pfWZ1bmN0aW9uIHooKXtpZihBLnNMJiYhZVtBLnNMXSl7cmV0dXJuIGwodyl9dmFyIHI9QS5zTD9kKEEuc0wsdyk6Zyh3KTtpZihBLnI+MCl7dis9ci5rZXl3b3JkX2NvdW50O0IrPXIucn1yZXR1cm4nPHNwYW4gY2xhc3M9Iicrci5sYW5ndWFnZSsnIj4nK3IudmFsdWUrIjwvc3Bhbj4ifWZ1bmN0aW9uIEooKXtyZXR1cm4gQS5zTCE9PXVuZGVmaW5lZD96KCk6RygpfWZ1bmN0aW9uIEkoTCxyKXt2YXIgSz1MLmNOPyc8c3BhbiBjbGFzcz0iJytMLmNOKyciPic6IiI7aWYoTC5yQil7eCs9Szt3PSIifWVsc2V7aWYoTC5lQil7eCs9bChyKStLO3c9IiJ9ZWxzZXt4Kz1LO3c9cn19QT1PYmplY3QuY3JlYXRlKEwse3BhcmVudDp7dmFsdWU6QX19KTtCKz1MLnJ9ZnVuY3Rpb24gQyhLLHIpe3crPUs7aWYocj09PXVuZGVmaW5lZCl7eCs9SigpO3JldHVybiAwfXZhciBMPW8ocixBKTtpZihMKXt4Kz1KKCk7SShMLHIpO3JldHVybiBMLnJCPzA6ci5sZW5ndGh9dmFyIE09cyhBLHIpO2lmKE0pe2lmKCEoTS5yRXx8TS5lRSkpe3crPXJ9eCs9SigpO2Rve2lmKEEuY04pe3grPSI8L3NwYW4+In1BPUEucGFyZW50fXdoaWxlKEEhPU0ucGFyZW50KTtpZihNLmVFKXt4Kz1sKHIpfXc9IiI7aWYoTS5zdGFydHMpe0koTS5zdGFydHMsIiIpfXJldHVybiBNLnJFPzA6ci5sZW5ndGh9aWYodChyLEEpKXt0aHJvdyJJbGxlZ2FsIn13Kz1yO3JldHVybiByLmxlbmd0aHx8MX12YXIgRj1lW0RdO2YoRik7dmFyIEE9Rjt2YXIgdz0iIjt2YXIgQj0wO3ZhciB2PTA7dmFyIHg9IiI7dHJ5e3ZhciB1LHEscD0wO3doaWxlKHRydWUpe0EudC5sYXN0SW5kZXg9cDt1PUEudC5leGVjKEUpO2lmKCF1KXticmVha31xPUMoRS5zdWJzdHIocCx1LmluZGV4LXApLHVbMF0pO3A9dS5pbmRleCtxfUMoRS5zdWJzdHIocCkpO3JldHVybntyOkIsa2V5d29yZF9jb3VudDp2LHZhbHVlOngsbGFuZ3VhZ2U6RH19Y2F0Y2goSCl7aWYoSD09IklsbGVnYWwiKXtyZXR1cm57cjowLGtleXdvcmRfY291bnQ6MCx2YWx1ZTpsKEUpfX1lbHNle3Rocm93IEh9fX1mdW5jdGlvbiBnKHMpe3ZhciBvPXtrZXl3b3JkX2NvdW50OjAscjowLHZhbHVlOmwocyl9O3ZhciBxPW87Zm9yKHZhciBwIGluIGUpe2lmKCFlLmhhc093blByb3BlcnR5KHApKXtjb250aW51ZX12YXIgcj1kKHAscyk7ci5sYW5ndWFnZT1wO2lmKHIua2V5d29yZF9jb3VudCtyLnI+cS5rZXl3b3JkX2NvdW50K3Eucil7cT1yfWlmKHIua2V5d29yZF9jb3VudCtyLnI+by5rZXl3b3JkX2NvdW50K28ucil7cT1vO289cn19aWYocS5sYW5ndWFnZSl7by5zZWNvbmRfYmVzdD1xfXJldHVybiBvfWZ1bmN0aW9uIGkocSxwLG8pe2lmKHApe3E9cS5yZXBsYWNlKC9eKCg8W14+XSs+fFx0KSspL2dtLGZ1bmN0aW9uKHIsdix1LHQpe3JldHVybiB2LnJlcGxhY2UoL1x0L2cscCl9KX1pZihvKXtxPXEucmVwbGFjZSgvXG4vZywiPGJyPiIpfXJldHVybiBxfWZ1bmN0aW9uIG0ocix1LHApe3ZhciB2PWgocixwKTt2YXIgdD1hKHIpO2lmKHQ9PSJuby1oaWdobGlnaHQiKXtyZXR1cm59dmFyIHc9dD9kKHQsdik6Zyh2KTt0PXcubGFuZ3VhZ2U7dmFyIG89YyhyKTtpZihvLmxlbmd0aCl7dmFyIHE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7cS5pbm5lckhUTUw9dy52YWx1ZTt3LnZhbHVlPWoobyxjKHEpLHYpfXcudmFsdWU9aSh3LnZhbHVlLHUscCk7dmFyIHM9ci5jbGFzc05hbWU7aWYoIXMubWF0Y2goIihcXHN8XikobGFuZ3VhZ2UtKT8iK3QrIihcXHN8JCkiKSl7cz1zPyhzKyIgIit0KTp0fXIuaW5uZXJIVE1MPXcudmFsdWU7ci5jbGFzc05hbWU9cztyLnJlc3VsdD17bGFuZ3VhZ2U6dCxrdzp3LmtleXdvcmRfY291bnQscmU6dy5yfTtpZih3LnNlY29uZF9iZXN0KXtyLnNlY29uZF9iZXN0PXtsYW5ndWFnZTp3LnNlY29uZF9iZXN0Lmxhbmd1YWdlLGt3Oncuc2Vjb25kX2Jlc3Qua2V5d29yZF9jb3VudCxyZTp3LnNlY29uZF9iZXN0LnJ9fX1mdW5jdGlvbiBuKCl7aWYobi5jYWxsZWQpe3JldHVybn1uLmNhbGxlZD10cnVlO0FycmF5LnByb3RvdHlwZS5tYXAuY2FsbChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJlIiksYikuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24obyl7bShvLGhsanMudGFiUmVwbGFjZSl9KX1mdW5jdGlvbiBrKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLG4sZmFsc2UpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuLGZhbHNlKX12YXIgZT17fTt0aGlzLkxBTkdVQUdFUz1lO3RoaXMuaGlnaGxpZ2h0PWQ7dGhpcy5oaWdobGlnaHRBdXRvPWc7dGhpcy5maXhNYXJrdXA9aTt0aGlzLmhpZ2hsaWdodEJsb2NrPW07dGhpcy5pbml0SGlnaGxpZ2h0aW5nPW47dGhpcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPWs7dGhpcy5JUj0iW2EtekEtWl1bYS16QS1aMC05X10qIjt0aGlzLlVJUj0iW2EtekEtWl9dW2EtekEtWjAtOV9dKiI7dGhpcy5OUj0iXFxiXFxkKyhcXC5cXGQrKT8iO3RoaXMuQ05SPSIoXFxiMFt4WF1bYS1mQS1GMC05XSt8KFxcYlxcZCsoXFwuXFxkKik/fFxcLlxcZCspKFtlRV1bLStdP1xcZCspPykiO3RoaXMuQk5SPSJcXGIoMGJbMDFdKykiO3RoaXMuUlNSPSIhfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFwqfFxcKj18XFwrfFxcKz18LHxcXC58LXwtPXwvfC89fDp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iO3RoaXMuQkU9e2I6IlxcXFxbXFxzXFxTXSIscjowfTt0aGlzLkFTTT17Y046InN0cmluZyIsYjoiJyIsZToiJyIsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuUVNNPXtjTjoic3RyaW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W3RoaXMuQkVdLHI6MH07dGhpcy5DTENNPXtjTjoiY29tbWVudCIsYjoiLy8iLGU6IiQifTt0aGlzLkNCTENMTT17Y046ImNvbW1lbnQiLGI6Ii9cXCoiLGU6IlxcKi8ifTt0aGlzLkhDTT17Y046ImNvbW1lbnQiLGI6IiMiLGU6IiQifTt0aGlzLk5NPXtjTjoibnVtYmVyIixiOnRoaXMuTlIscjowfTt0aGlzLkNOTT17Y046Im51bWJlciIsYjp0aGlzLkNOUixyOjB9O3RoaXMuQk5NPXtjTjoibnVtYmVyIixiOnRoaXMuQk5SLHI6MH07dGhpcy5pbmhlcml0PWZ1bmN0aW9uKHEscil7dmFyIG89e307Zm9yKHZhciBwIGluIHEpe29bcF09cVtwXX1pZihyKXtmb3IodmFyIHAgaW4gcil7b1twXT1yW3BdfX1yZXR1cm4gb319KCk7aGxqcy5MQU5HVUFHRVMucnVieT1mdW5jdGlvbihlKXt2YXIgYT0iW2EtekEtWl9dW2EtekEtWjAtOV9dKihcXCF8XFw/KT8iO3ZhciBqPSJbYS16QS1aX11cXHcqWyE/PV0/fFstK35dXFxAfDw8fD4+fD1+fD09PT98PD0+fFs8Pl09P3xcXCpcXCp8Wy0vKyVeJip+YHxdfFxcW1xcXT0/Ijt2YXIgZz17a2V5d29yZDoiYW5kIGZhbHNlIHRoZW4gZGVmaW5lZCBtb2R1bGUgaW4gcmV0dXJuIHJlZG8gaWYgQkVHSU4gcmV0cnkgZW5kIGZvciB0cnVlIHNlbGYgd2hlbiBuZXh0IHVudGlsIGRvIGJlZ2luIHVubGVzcyBFTkQgcmVzY3VlIG5pbCBlbHNlIGJyZWFrIHVuZGVmIG5vdCBzdXBlciBjbGFzcyBjYXNlIHJlcXVpcmUgeWllbGQgYWxpYXMgd2hpbGUgZW5zdXJlIGVsc2lmIG9yIGluY2x1ZGUifTt2YXIgYz17Y046InlhcmRvY3RhZyIsYjoiQFtBLVphLXpdKyJ9O3ZhciBrPVt7Y046ImNvbW1lbnQiLGI6IiMiLGU6IiQiLGM6W2NdfSx7Y046ImNvbW1lbnQiLGI6Il5cXD1iZWdpbiIsZToiXlxcPWVuZCIsYzpbY10scjoxMH0se2NOOiJjb21tZW50IixiOiJeX19FTkRfXyIsZToiXFxuJCJ9XTt2YXIgZD17Y046InN1YnN0IixiOiIjXFx7IixlOiJ9IixsOmEsazpnfTt2YXIgaT1bZS5CRSxkXTt2YXIgYj1be2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGM6aSxyOjB9LHtjTjoic3RyaW5nIixiOiciJyxlOiciJyxjOmkscjowfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFwoIixlOiJcXCkiLGM6aX0se2NOOiJzdHJpbmciLGI6IiVbcXddP1xcWyIsZToiXFxdIixjOml9LHtjTjoic3RyaW5nIixiOiIlW3F3XT97IixlOiJ9IixjOml9LHtjTjoic3RyaW5nIixiOiIlW3F3XT88IixlOiI+IixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPy8iLGU6Ii8iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/JSIsZToiJSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8tIixlOiItIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddP1xcfCIsZToiXFx8IixjOmkscjoxMH1dO3ZhciBoPXtjTjoiZnVuY3Rpb24iLGJXSzp0cnVlLGU6IiB8JHw7IixrOiJkZWYiLGM6W3tjTjoidGl0bGUiLGI6aixsOmEsazpnfSx7Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGw6YSxrOmd9XS5jb25jYXQoayl9O3ZhciBmPWsuY29uY2F0KGIuY29uY2F0KFt7Y046ImNsYXNzIixiV0s6dHJ1ZSxlOiIkfDsiLGs6ImNsYXNzIG1vZHVsZSIsYzpbe2NOOiJ0aXRsZSIsYjoiW0EtWmEtel9dXFx3Kig6OlxcdyspKihcXD98XFwhKT8iLHI6MH0se2NOOiJpbmhlcml0YW5jZSIsYjoiPFxccyoiLGM6W3tjTjoicGFyZW50IixiOiIoIitlLklSKyI6Oik/IitlLklSfV19XS5jb25jYXQoayl9LGgse2NOOiJjb25zdGFudCIsYjoiKDo6KT8oXFxiW0EtWl1cXHcqKDo6KT8pKyIscjowfSx7Y046InN5bWJvbCIsYjoiOiIsYzpiLmNvbmNhdChbe2I6an1dKSxyOjB9LHtjTjoic3ltYm9sIixiOmErIjoiLHI6MH0se2NOOiJudW1iZXIiLGI6IihcXGIwWzAtN19dKyl8KFxcYjB4WzAtOWEtZkEtRl9dKyl8KFxcYlsxLTldWzAtOV9dKihcXC5bMC05X10rKT8pfFswX11cXGIiLHI6MH0se2NOOiJudW1iZXIiLGI6IlxcP1xcdyJ9LHtjTjoidmFyaWFibGUiLGI6IihcXCRcXFcpfCgoXFwkfFxcQFxcQD8pKFxcdyspKSJ9LHtiOiIoIitlLlJTUisiKVxccyoiLGM6ay5jb25jYXQoW3tjTjoicmVnZXhwIixiOiIvIixlOiIvW2Etel0qIixpOiJcXG4iLGM6W2UuQkUsZF19XSkscjowfV0pKTtkLmM9ZjtoLmNbMV0uYz1mO3JldHVybntsOmEsazpnLGM6Zn19KGhsanMpO2hsanMuTEFOR1VBR0VTLmRpZmY9ZnVuY3Rpb24oYSl7cmV0dXJue2M6W3tjTjoiY2h1bmsiLGI6Il5cXEBcXEAgK1xcLVxcZCssXFxkKyArXFwrXFxkKyxcXGQrICtcXEBcXEAkIixyOjEwfSx7Y046ImNodW5rIixiOiJeXFwqXFwqXFwqICtcXGQrLFxcZCsgK1xcKlxcKlxcKlxcKiQiLHI6MTB9LHtjTjoiY2h1bmsiLGI6Il5cXC1cXC1cXC0gK1xcZCssXFxkKyArXFwtXFwtXFwtXFwtJCIscjoxMH0se2NOOiJoZWFkZXIiLGI6IkluZGV4OiAiLGU6IiQifSx7Y046ImhlYWRlciIsYjoiPT09PT0iLGU6Ij09PT09JCJ9LHtjTjoiaGVhZGVyIixiOiJeXFwtXFwtXFwtIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6Il5cXCp7M30gIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6Il5cXCtcXCtcXCsiLGU6IiQifSx7Y046ImhlYWRlciIsYjoiXFwqezV9IixlOiJcXCp7NX0kIn0se2NOOiJhZGRpdGlvbiIsYjoiXlxcKyIsZToiJCJ9LHtjTjoiZGVsZXRpb24iLGI6Il5cXC0iLGU6IiQifSx7Y046ImNoYW5nZSIsYjoiXlxcISIsZToiJCJ9XX19KGhsanMpO2hsanMuTEFOR1VBR0VTLmphdmFzY3JpcHQ9ZnVuY3Rpb24oYSl7cmV0dXJue2s6e2tleXdvcmQ6ImluIGlmIGZvciB3aGlsZSBmaW5hbGx5IHZhciBuZXcgZnVuY3Rpb24gZG8gcmV0dXJuIHZvaWQgZWxzZSBicmVhayBjYXRjaCBpbnN0YW5jZW9mIHdpdGggdGhyb3cgY2FzZSBkZWZhdWx0IHRyeSB0aGlzIHN3aXRjaCBjb250aW51ZSB0eXBlb2YgZGVsZXRlIGxldCB5aWVsZCBjb25zdCIsbGl0ZXJhbDoidHJ1ZSBmYWxzZSBudWxsIHVuZGVmaW5lZCBOYU4gSW5maW5pdHkifSxjOlthLkFTTSxhLlFTTSxhLkNMQ00sYS5DQkxDTE0sYS5DTk0se2I6IigiK2EuUlNSKyJ8XFxiKGNhc2V8cmV0dXJufHRocm93KVxcYilcXHMqIixrOiJyZXR1cm4gdGhyb3cgY2FzZSIsYzpbYS5DTENNLGEuQ0JMQ0xNLHtjTjoicmVnZXhwIixiOiIvIixlOiIvW2dpbV0qIixpOiJcXG4iLGM6W3tiOiJcXFxcLyJ9XX0se2I6IjwiLGU6Ij47IixzTDoieG1sIn1dLHI6MH0se2NOOiJmdW5jdGlvbiIsYldLOnRydWUsZToieyIsazoiZnVuY3Rpb24iLGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXokX11bMC05QS1aYS16JF9dKiJ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbYS5DTENNLGEuQ0JMQ0xNXSxpOiJbXCInXFwoXSJ9XSxpOiJcXFt8JSJ9XX19KGhsanMpO2hsanMuTEFOR1VBR0VTLnhtbD1mdW5jdGlvbihhKXt2YXIgYz0iW0EtWmEtejAtOVxcLl86LV0rIjt2YXIgYj17ZVc6dHJ1ZSxjOlt7Y046ImF0dHJpYnV0ZSIsYjpjLHI6MH0se2I6Jz0iJyxyQjp0cnVlLGU6JyInLGM6W3tjTjoidmFsdWUiLGI6JyInLGVXOnRydWV9XX0se2I6Ij0nIixyQjp0cnVlLGU6IiciLGM6W3tjTjoidmFsdWUiLGI6IiciLGVXOnRydWV9XX0se2I6Ij0iLGM6W3tjTjoidmFsdWUiLGI6IlteXFxzLz5dKyJ9XX1dfTtyZXR1cm57Y0k6dHJ1ZSxjOlt7Y046InBpIixiOiI8XFw/IixlOiJcXD8+IixyOjEwfSx7Y046ImRvY3R5cGUiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixlOiJcXF0ifV19LHtjTjoiY29tbWVudCIsYjoiPCEtLSIsZToiLS0+IixyOjEwfSx7Y046ImNkYXRhIixiOiI8XFwhXFxbQ0RBVEFcXFsiLGU6IlxcXVxcXT4iLHI6MTB9LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToiPiIsazp7dGl0bGU6InN0eWxlIn0sYzpbYl0sc3RhcnRzOntlOiI8L3N0eWxlPiIsckU6dHJ1ZSxzTDoiY3NzIn19LHtjTjoidGFnIixiOiI8c2NyaXB0KD89XFxzfD58JCkiLGU6Ij4iLGs6e3RpdGxlOiJzY3JpcHQifSxjOltiXSxzdGFydHM6e2U6IjxcL3NjcmlwdD4iLHJFOnRydWUsc0w6ImphdmFzY3JpcHQifX0se2I6IjwlIixlOiIlPiIsc0w6InZic2NyaXB0In0se2NOOiJ0YWciLGI6IjwvPyIsZToiLz8+IixjOlt7Y046InRpdGxlIixiOiJbXiAvPl0rIn0sYl19XX19KGhsanMpO2hsanMuTEFOR1VBR0VTLnBocD1mdW5jdGlvbihhKXt2YXIgZT17Y046InZhcmlhYmxlIixiOiJcXCQrW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKiJ9O3ZhciBiPVthLmluaGVyaXQoYS5BU00se2k6bnVsbH0pLGEuaW5oZXJpdChhLlFTTSx7aTpudWxsfSkse2NOOiJzdHJpbmciLGI6J2IiJyxlOiciJyxjOlthLkJFXX0se2NOOiJzdHJpbmciLGI6ImInIixlOiInIixjOlthLkJFXX1dO3ZhciBjPVthLkJOTSxhLkNOTV07dmFyIGQ9e2NOOiJ0aXRsZSIsYjphLlVJUn07cmV0dXJue2NJOnRydWUsazoiYW5kIGluY2x1ZGVfb25jZSBsaXN0IGFic3RyYWN0IGdsb2JhbCBwcml2YXRlIGVjaG8gaW50ZXJmYWNlIGFzIHN0YXRpYyBlbmRzd2l0Y2ggYXJyYXkgbnVsbCBpZiBlbmR3aGlsZSBvciBjb25zdCBmb3IgZW5kZm9yZWFjaCBzZWxmIHZhciB3aGlsZSBpc3NldCBwdWJsaWMgcHJvdGVjdGVkIGV4aXQgZm9yZWFjaCB0aHJvdyBlbHNlaWYgaW5jbHVkZSBfX0ZJTEVfXyBlbXB0eSByZXF1aXJlX29uY2UgZG8geG9yIHJldHVybiBpbXBsZW1lbnRzIHBhcmVudCBjbG9uZSB1c2UgX19DTEFTU19fIF9fTElORV9fIGVsc2UgYnJlYWsgcHJpbnQgZXZhbCBuZXcgY2F0Y2ggX19NRVRIT0RfXyBjYXNlIGV4Y2VwdGlvbiBwaHBfdXNlcl9maWx0ZXIgZGVmYXVsdCBkaWUgcmVxdWlyZSBfX0ZVTkNUSU9OX18gZW5kZGVjbGFyZSBmaW5hbCB0cnkgdGhpcyBzd2l0Y2ggY29udGludWUgZW5kZm9yIGVuZGlmIGRlY2xhcmUgdW5zZXQgdHJ1ZSBmYWxzZSBuYW1lc3BhY2UgdHJhaXQgZ290byBpbnN0YW5jZW9mIGluc3RlYWRvZiBfX0RJUl9fIF9fTkFNRVNQQUNFX18gX19oYWx0X2NvbXBpbGVyIixjOlthLkNMQ00sYS5IQ00se2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIixjOlt7Y046InBocGRvYyIsYjoiXFxzQFtBLVphLXpdKyJ9XX0se2NOOiJjb21tZW50IixlQjp0cnVlLGI6Il9faGFsdF9jb21waWxlci4rPzsiLGVXOnRydWV9LHtjTjoic3RyaW5nIixiOiI8PDxbJ1wiXT9cXHcrWydcIl0/JCIsZToiXlxcdys7IixjOlthLkJFXX0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IjxcXD9waHAiLHI6MTB9LHtjTjoicHJlcHJvY2Vzc29yIixiOiJcXD8+In0sZSx7Y046ImZ1bmN0aW9uIixiV0s6dHJ1ZSxlOiJ7IixrOiJmdW5jdGlvbiIsaToiXFwkfFxcW3wlIixjOltkLHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbInNlbGYiLGUsYS5DQkxDTE1dLmNvbmNhdChiKS5jb25jYXQoYyl9XX0se2NOOiJjbGFzcyIsYldLOnRydWUsZToieyIsazoiY2xhc3MiLGk6Ils6XFwoXFwkXSIsYzpbe2JXSzp0cnVlLGVXOnRydWUsazoiZXh0ZW5kcyIsYzpbZF19LGRdfSx7YjoiPT4ifV0uY29uY2F0KGIpLmNvbmNhdChjKX19KGhsanMpO2hsanMuTEFOR1VBR0VTLnB5dGhvbj1mdW5jdGlvbihhKXt2YXIgZj17Y046InByb21wdCIsYjoiXig+Pj58XFwuXFwuXFwuKSAifTt2YXIgYz1be2NOOiJzdHJpbmciLGI6Iih1fGIpP3I/JycnIixlOiInJyciLGM6W2ZdLHI6MTB9LHtjTjoic3RyaW5nIixiOicodXxiKT9yPyIiIicsZTonIiIiJyxjOltmXSxyOjEwfSx7Y046InN0cmluZyIsYjoiKHV8cnx1ciknIixlOiInIixjOlthLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8cnx1cikiJyxlOiciJyxjOlthLkJFXSxyOjEwfSx7Y046InN0cmluZyIsYjoiKGJ8YnIpJyIsZToiJyIsYzpbYS5CRV19LHtjTjoic3RyaW5nIixiOicoYnxicikiJyxlOiciJyxjOlthLkJFXX1dLmNvbmNhdChbYS5BU00sYS5RU01dKTt2YXIgZT17Y046InRpdGxlIixiOmEuVUlSfTt2YXIgZD17Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6WyJzZWxmIixhLkNOTSxmXS5jb25jYXQoYyl9O3ZhciBiPXtiV0s6dHJ1ZSxlOiI6IixpOiJbJHs9O1xcbl0iLGM6W2UsZF0scjoxMH07cmV0dXJue2s6e2tleXdvcmQ6ImFuZCBlbGlmIGlzIGdsb2JhbCBhcyBpbiBpZiBmcm9tIHJhaXNlIGZvciBleGNlcHQgZmluYWxseSBwcmludCBpbXBvcnQgcGFzcyByZXR1cm4gZXhlYyBlbHNlIGJyZWFrIG5vdCB3aXRoIGNsYXNzIGFzc2VydCB5aWVsZCB0cnkgd2hpbGUgY29udGludWUgZGVsIG9yIGRlZiBsYW1iZGEgbm9ubG9jYWx8MTAiLGJ1aWx0X2luOiJOb25lIFRydWUgRmFsc2UgRWxsaXBzaXMgTm90SW1wbGVtZW50ZWQifSxpOiIoPC98LT58XFw/KSIsYzpjLmNvbmNhdChbZixhLkhDTSxhLmluaGVyaXQoYix7Y046ImZ1bmN0aW9uIixrOiJkZWYifSksYS5pbmhlcml0KGIse2NOOiJjbGFzcyIsazoiY2xhc3MifSksYS5DTk0se2NOOiJkZWNvcmF0b3IiLGI6IkAiLGU6IiQifSx7YjoiXFxiKHByaW50fGV4ZWMpXFwoIn1dKX19KGhsanMpO2hsanMuTEFOR1VBR0VTLmpzb249ZnVuY3Rpb24oYSl7dmFyIGU9e2xpdGVyYWw6InRydWUgZmFsc2UgbnVsbCJ9O3ZhciBkPVthLlFTTSxhLkNOTV07dmFyIGM9e2NOOiJ2YWx1ZSIsZToiLCIsZVc6dHJ1ZSxlRTp0cnVlLGM6ZCxrOmV9O3ZhciBiPXtiOiJ7IixlOiJ9IixjOlt7Y046ImF0dHJpYnV0ZSIsYjonXFxzKiInLGU6JyJcXHMqOlxccyonLGVCOnRydWUsZUU6dHJ1ZSxjOlthLkJFXSxpOiJcXG4iLHN0YXJ0czpjfV0saToiXFxTIn07dmFyIGY9e2I6IlxcWyIsZToiXFxdIixjOlthLmluaGVyaXQoYyx7Y046bnVsbH0pXSxpOiJcXFMifTtkLnNwbGljZShkLmxlbmd0aCwwLGIsZik7cmV0dXJue2M6ZCxrOmUsaToiXFxTIn19KGhsanMpOwpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnktMS43LjIubWluLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnktMS43LjIubWluLmpzCmluZGV4IGM5NDFhNWYuLjQzOGZmNzkgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LTEuNy4yLm1pbi5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS0xLjcuMi5taW4uanMKQEAgLTEsMyArMSwyNyBAQAorLyoKKworQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gUmVzaWcsIGh0dHA6Ly9qcXVlcnkuY29tLworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKwogLyohCiAgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjQuMwogICogaHR0cDovL2pxdWVyeS5jb20vCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5hamF4ZmlsZXVwbG9hZC5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmFqYXhmaWxldXBsb2FkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTM4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5hamF4ZmlsZXVwbG9hZC5qcwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDExIEpvcmRhbiBGZWxkc3RlaW4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLy8gT3JpZ2luYWwgY29kZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vamZlbGRzdGVpbi9qUXVlcnkuQWpheEZpbGVVcGxvYWQuanMgaHR0cHM6Ly9naXRodWIuY29tL2pmZWxkc3RlaW4valF1ZXJ5LkFqYXhGaWxlVXBsb2FkLmpzL2NvbW1pdC85ZGQ1NmI0MTYxY2JlZDEzODI4N2QzYWUyOWE0NzZiYjU5ZWI1ZmM0CisvLyBBbGwgbW9kaWZpY2F0aW9ucyBhcmUgQlNEIGxpY2Vuc2VkCisvLyBHU0k6IE1vZGlmaWNhdGlvbnMgbWFkZSB0byBzdXBwb3J0IGltbWVkaWF0ZSB1cGxvYWQKKy8qCisgLy8KKyAvLyAgLSBBamF4aWZpZXMgYW4gaW5kaXZpZHVhbCA8aW5wdXQgdHlwZT0iZmlsZSI+CisgLy8gIC0gRmlsZXMgYXJlIHNhbmRib3hlZC4gRG9lc24ndCBtYXR0ZXIgaG93IG1hbnksIG9yIHdoZXJlIHRoZXkgYXJlLCBvbiB0aGUgcGFnZS4KKyAvLyAgLSBBbGxvd3MgZm9yIGV4dHJhIHBhcmFtZXRlcnMgdG8gYmUgaW5jbHVkZWQgd2l0aCB0aGUgZmlsZQorIC8vICAtIG9uU3RhcnQgY2FsbGJhY2sgY2FuIGNhbmNlbCB0aGUgdXBsb2FkIGJ5IHJldHVybmluZyBmYWxzZQorICovCisKKworKGZ1bmN0aW9uICgkKSB7CisgICQuZm4uYWpheGZpbGV1cGxvYWQgPSBmdW5jdGlvbiAob3B0aW9ucykgeworICAgIHZhciBzZXR0aW5ncyA9IHsKKyAgICAgIHBhcmFtczoge30sCisgICAgICBhY3Rpb246ICcnLAorICAgICAgb25TdGFydDogZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zb2xlLmxvZygnc3RhcnRpbmcgdXBsb2FkJyk7CisgICAgICAgIGNvbnNvbGUubG9nKHRoaXMpOworICAgICAgfSwKKyAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uIChyZXNwb25zZSkgeworICAgICAgICBjb25zb2xlLmxvZygnZ290IHJlc3BvbnNlOiAnKTsKKyAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpOworICAgICAgICBjb25zb2xlLmxvZyh0aGlzKTsKKyAgICAgIH0sCisgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zb2xlLmxvZygnY2FuY2VsbGluZzogJyk7CisgICAgICAgIGNvbnNvbGUubG9nKHRoaXMpOworICAgICAgfSwKKyAgICAgIHZhbGlkYXRlX2V4dGVuc2lvbnM6IHRydWUsCisgICAgICB2YWxpZF9leHRlbnNpb25zOiBbJ2dpZicsICdwbmcnLCAnanBnJywgJ2pwZWcnXSwKKyAgICAgIHN1Ym1pdF9idXR0b246IG51bGwsCisgICAgICB1cGxvYWRfbm93OiBmYWxzZQorICAgIH07CisKKyAgICB2YXIgdXBsb2FkaW5nX2ZpbGUgPSBmYWxzZTsKKworICAgIGlmIChvcHRpb25zKSB7CisgICAgICAkLmV4dGVuZChzZXR0aW5ncywgb3B0aW9ucyk7CisgICAgfQorCisKKyAgICAvLyAndGhpcycgaXMgYSBqUXVlcnkgY29sbGVjdGlvbiBvZiBvbmUgb3IgbW9yZSAoaG9wZWZ1bGx5KQorICAgIC8vICBmaWxlIGVsZW1lbnRzLCBidXQgZG9lc24ndCBjaGVjayBmb3IgdGhpcyB5ZXQKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciAkZWxlbWVudCA9ICQodGhpcyk7CisgICAgICAvKgorICAgICAgIC8vIEludGVybmFsIGhhbmRsZXIgdGhhdCB0cmllcyB0byBwYXJzZSB0aGUgcmVzcG9uc2UKKyAgICAgICAvLyAgYW5kIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4KKyAgICAgICAqLworICAgICAgdmFyIGhhbmRsZVJlc3BvbnNlID0gZnVuY3Rpb24gKGxvYWRlZEZyYW1lLCBlbGVtZW50KSB7CisgICAgICAgIHZhciByZXNwb25zZSwgcmVzcG9uc2VTdHIgPSBsb2FkZWRGcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MOworICAgICAgICB0cnkgeworICAgICAgICAgIC8vcmVzcG9uc2UgPSAkLnBhcnNlSlNPTigkLnRyaW0ocmVzcG9uc2VTdHIpKTsKKyAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZVN0cjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlYXItZG93biB0aGUgd3JhcHBlciBmb3JtCisgICAgICAgIGVsZW1lbnQuc2libGluZ3MoKS5yZW1vdmUoKTsKKyAgICAgICAgZWxlbWVudC51bndyYXAoKTsKKworICAgICAgICB1cGxvYWRpbmdfZmlsZSA9IGZhbHNlOworCisgICAgICAgIC8vIFBhc3MgYmFjayB0byB0aGUgdXNlcgorICAgICAgICBzZXR0aW5ncy5vbkNvbXBsZXRlLmFwcGx5KGVsZW1lbnQsIFtyZXNwb25zZSwgc2V0dGluZ3MucGFyYW1zXSk7CisgICAgICB9OworICAgICAgLyoKKyAgICAgICAvLyBXcmFwcyBlbGVtZW50IGluIGEgPGZvcm0+IHRhZywgYW5kIGluc2VydHMgaGlkZGVuIGlucHV0cyBmb3IgZWFjaAorICAgICAgIC8vICBrZXk6dmFsdWUgcGFpciBpbiBzZXR0aW5ncy5wYXJhbXMgc28gdGhleSBjYW4gYmUgc2VudCBhbG9uZyB3aXRoCisgICAgICAgLy8gIHRoZSB1cGxvYWQuIFRoZW4sIGNyZWF0ZXMgYW4gaWZyYW1lIHRoYXQgdGhlIHdob2xlIHRoaW5nIGlzCisgICAgICAgLy8gIHVwbG9hZGVkIHRocm91Z2guCisgICAgICAgKi8KKyAgICAgIHZhciB3cmFwRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgICAgIC8vIENyZWF0ZSBhbiBpZnJhbWUgdG8gc3VibWl0IHRocm91Z2gsIHVzaW5nIGEgc2VtaS11bmlxdWUgSUQKKyAgICAgICAgdmFyIGZyYW1lX2lkID0gJ2FqYXhVcGxvYWRlci1pZnJhbWUtJyArIE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKQorICAgICAgICAkKCdib2R5JykuYWZ0ZXIoJzxpZnJhbWUgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIG5hbWU9IicgKyBmcmFtZV9pZCArICciIGlkPSInICsgZnJhbWVfaWQgKyAnIi8+Jyk7CisgICAgICAgICQoJyMnICsgZnJhbWVfaWQpLmxvYWQoZnVuY3Rpb24gKCkgeworICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKHRoaXMsIGVsZW1lbnQpOworICAgICAgICB9KTsKKyAgICAgICAgY29uc29sZS5sb2coInNldHRpbmdzLmFjdGlvbjogIiArIHNldHRpbmdzLmFjdGlvbik7CisgICAgICAgIC8vIFdyYXAgaXQgaW4gYSBmb3JtCisgICAgICAgIGVsZW1lbnQud3JhcChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuICc8Zm9ybSBhY3Rpb249IicgKyBzZXR0aW5ncy5hY3Rpb24gKyAnIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iJyArIGZyYW1lX2lkICsgJyIgLz4nCisgICAgICAgIH0pCisgICAgICAgICAgLy8gSW5zZXJ0IDxpbnB1dCB0eXBlPSdoaWRkZW4nPidzIGZvciBlYWNoIHBhcmFtCisgICAgICAgICAgICAuYmVmb3JlKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgdmFyIGtleSwgaHRtbCA9ICcnOworICAgICAgICAgICAgICBmb3IgKGtleSBpbiBzZXR0aW5ncy5wYXJhbXMpIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW1WYWwgPSBzZXR0aW5ncy5wYXJhbXNba2V5XTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtVmFsID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICAgICAgICBwYXJhbVZhbCA9IHBhcmFtVmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicgKyBrZXkgKyAnIiB2YWx1ZT0iJyArIHBhcmFtVmFsICsgJyIgLz4nOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBodG1sOworICAgICAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHZhciB1cGxvYWRfZmlsZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKCRlbGVtZW50LnZhbCgpID09ICcnKSByZXR1cm4gc2V0dGluZ3Mub25DYW5jZWwuYXBwbHkoJGVsZW1lbnQsIFtzZXR0aW5ncy5wYXJhbXNdKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgZXh0ZW5zaW9uIGlzIHZhbGlkCisgICAgICAgIHZhciBleHQgPSAkZWxlbWVudC52YWwoKS5zcGxpdCgnLicpLnBvcCgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmICh0cnVlID09PSBzZXR0aW5ncy52YWxpZGF0ZV9leHRlbnNpb25zICYmICQuaW5BcnJheShleHQsIHNldHRpbmdzLnZhbGlkX2V4dGVuc2lvbnMpID09IC0xKSB7CisgICAgICAgICAgLy8gUGFzcyBiYWNrIHRvIHRoZSB1c2VyCisgICAgICAgICAgc2V0dGluZ3Mub25Db21wbGV0ZS5hcHBseSgkZWxlbWVudCwgWworICAgICAgICAgICAge3N0YXR1czogZmFsc2UsIG1lc3NhZ2U6ICdUaGUgc2VsZWN0IGZpbGUgdHlwZSBpcyBpbnZhbGlkLiBGaWxlIG11c3QgYmUgJyArIHNldHRpbmdzLnZhbGlkX2V4dGVuc2lvbnMuam9pbignLCAnKSArICcuJ30sCisgICAgICAgICAgICBzZXR0aW5ncy5wYXJhbXMKKyAgICAgICAgICBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1cGxvYWRpbmdfZmlsZSA9IHRydWU7CisKKyAgICAgICAgICAvLyBDcmVhdGVzIHRoZSBmb3JtLCBleHRyYSBpbnB1dHMgYW5kIGlmcmFtZSB1c2VkIHRvCisgICAgICAgICAgLy8gIHN1Ym1pdCAvIHVwbG9hZCB0aGUgZmlsZQorICAgICAgICAgIHdyYXBFbGVtZW50KCRlbGVtZW50KTsKKworICAgICAgICAgIC8vIENhbGwgdXNlci1zdXBwbGllZCAob3IgZGVmYXVsdCkgb25TdGFydCgpLCBzZXR0aW5nCisgICAgICAgICAgLy8gIGl0J3MgdGhpcyBjb250ZXh0IHRvIHRoZSBmaWxlIERPTSBlbGVtZW50CisgICAgICAgICAgdmFyIHJldCA9IHNldHRpbmdzLm9uU3RhcnQuYXBwbHkoJGVsZW1lbnQsIFtzZXR0aW5ncy5wYXJhbXNdKTsKKworICAgICAgICAgIC8vIGxldCBvblN0YXJ0IGhhdmUgdGhlIG9wdGlvbiB0byBjYW5jZWwgdGhlIHVwbG9hZAorICAgICAgICAgIGlmIChyZXQgIT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZWxlbWVudC5wYXJlbnQoJ2Zvcm0nKS5zdWJtaXQoZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgICAgIH0pLnN1Ym1pdCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIGlmIChzZXR0aW5ncy51cGxvYWRfbm93KSB7CisgICAgICAgIGlmICghdXBsb2FkaW5nX2ZpbGUpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygidXBsb2FkaW5nIG5vdyIpOworICAgICAgICAgIHVwbG9hZF9maWxlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBhcmUgYWxyZWFkeSBzZXR1cC4gTWF5IHJlcGxhY2UgdGhpcworICAgICAgLy8gIHdpdGggdW5pbml0KCkgbGF0ZXIsIHRvIGFsbG93IHVwZGF0aW5nIHRoYXQgc2V0dGluZ3MKKyAgICAgIGlmICgkZWxlbWVudC5kYXRhKCdhamF4VXBsb2FkZXItc2V0dXAnKSA9PT0gdHJ1ZSkgcmV0dXJuOworCisgICAgICAkZWxlbWVudC5jaGFuZ2UoZnVuY3Rpb24gKCkgeworICAgICAgICAvLyBzaW5jZSBhIG5ldyBpbWFnZSB3YXMgc2VsZWN0ZWQsIHJlc2V0IHRoZSBtYXJrZXIKKyAgICAgICAgdXBsb2FkaW5nX2ZpbGUgPSBmYWxzZTsKKworICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgZmlsZSBmcm9tIGhlcmUgaWYgd2UgaGF2ZW4ndCBhc3NpZ25lZCBhIHN1Ym1pdCBidXR0b24KKyAgICAgICAgaWYgKHNldHRpbmdzLnN1Ym1pdF9idXR0b24gPT0gbnVsbCkgeworICAgICAgICAgIGNvbnNvbGUubG9nKCJ1cGxvYWRpbmciKTsKKyAgICAgICAgICB1cGxvYWRfZmlsZSgpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgaWYgKHNldHRpbmdzLnN1Ym1pdF9idXR0b24gPT0gbnVsbCkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICB9IGVsc2UgeworICAgICAgICBzZXR0aW5ncy5zdWJtaXRfYnV0dG9uLmNsaWNrKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygidXBsb2FkaW5nOiAiICsgdXBsb2FkaW5nX2ZpbGUpOworICAgICAgICAgIC8vIG9ubHkgYXR0ZW1wdCB0byB1cGxvYWQgZmlsZSBpZiB3ZSdyZSBub3QgdXBsb2FkaW5nCisgICAgICAgICAgaWYgKCF1cGxvYWRpbmdfZmlsZSkgeworICAgICAgICAgICAgdXBsb2FkX2ZpbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorCisKKyAgICAgIC8vIE1hcmsgdGhpcyBlbGVtZW50IGFzIHNldHVwCisgICAgICAkZWxlbWVudC5kYXRhKCdhamF4VXBsb2FkZXItc2V0dXAnLCB0cnVlKTsKKworCisgICAgfSk7CisgIH0KK30pKGpRdWVyeSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5hdXRvZ3Jvdy5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmF1dG9ncm93LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTQxYTYyLi4wMDAwMDAwCi0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmF1dG9ncm93LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qIAotICogQXV0byBFeHBhbmRpbmcgVGV4dCBBcmVhICgxLjIuMikKLSAqIGJ5IENocnlzIEJhZGVyICh3d3cuY2hyeXNiYWRlci5jb20pCi0gKiBjaHJ5c2JAZ21haWwuY29tCi0gKgotICogU3BlY2lhbCB0aGFua3MgdG86Ci0gKiBKYWtlIENoYXBhIC0gamFrZUBoeWJyaWRzdHVkaW8uY29tCi0gKiBKb2huIFJlc2lnIC0gamVyZXNpZ0BnbWFpbC5jb20KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hyeXMgQmFkZXIgKHd3dy5jaHJ5c2JhZGVyLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZS4gCi0gKgotICoKLSAqIE5PVEU6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGpRdWVyeSB0byB3b3JrLiAgRG93bmxvYWQgalF1ZXJ5IGF0IHd3dy5qcXVlcnkuY29tCi0gKgotICovCi0gCi0oZnVuY3Rpb24oalF1ZXJ5KSB7Ci0JCSAgCi0JdmFyIHNlbGYgPSBudWxsOwotIAotCWpRdWVyeS5mbi5hdXRvZ3JvdyA9IGZ1bmN0aW9uKG8pCi0JewkKLQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLQkJCW5ldyBqUXVlcnkuYXV0b2dyb3codGhpcywgbyk7Ci0JCX0pOwotCX07Ci0JCi0KLSAgICAvKioKLSAgICAgKiBUaGUgYXV0b2dyb3cgb2JqZWN0LgotICAgICAqCi0gICAgICogQGNvbnN0cnVjdG9yCi0gICAgICogQG5hbWUgalF1ZXJ5LmF1dG9ncm93Ci0gICAgICogQHBhcmFtIE9iamVjdCBlIFRoZSB0ZXh0YXJlYSB0byBjcmVhdGUgdGhlIGF1dG9ncm93IGZvci4KLSAgICAgKiBAcGFyYW0gSGFzaCBvIEEgc2V0IG9mIGtleS92YWx1ZSBwYWlycyB0byBzZXQgYXMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotICAgICAqIEBjYXQgUGx1Z2lucy9hdXRvZ3JvdwotICAgICAqLwotCQotCWpRdWVyeS5hdXRvZ3JvdyA9IGZ1bmN0aW9uIChlLCBvKQotCXsKLQkJdGhpcy5vcHRpb25zCQkgIAk9IG8gfHwge307Ci0JCXRoaXMuZHVtbXkJCQkgIAk9IG51bGw7Ci0JCXRoaXMuaW50ZXJ2YWwJIAkgIAk9IG51bGw7Ci0JCXRoaXMubGluZV9oZWlnaHQJICAJPSB0aGlzLm9wdGlvbnMubGluZUhlaWdodCB8fCBwYXJzZUludChqUXVlcnkoZSkuY3NzKCdsaW5lLWhlaWdodCcpLCAxMCk7Ci0JCXRoaXMubWluX2hlaWdodAkJICAJPSB0aGlzLm9wdGlvbnMubWluSGVpZ2h0IHx8IHBhcnNlSW50KGpRdWVyeShlKS5jc3MoJ21pbi1oZWlnaHQnKSwgMTApOwotCQl0aGlzLm1heF9oZWlnaHQJCSAgCT0gdGhpcy5vcHRpb25zLm1heEhlaWdodCB8fCBwYXJzZUludChqUXVlcnkoZSkuY3NzKCdtYXgtaGVpZ2h0JyksIDEwKTsKLQkJdGhpcy50ZXh0YXJlYQkJICAJPSBqUXVlcnkoZSk7Ci0JCQotCQlpZih0aGlzLmxpbmVfaGVpZ2h0ID09IE5hTikKLQkJICB0aGlzLmxpbmVfaGVpZ2h0ID0gMDsKLQkJCi0JCS8vIE9ubHkgb25lIHRleHRhcmVhIGFjdGl2YXRlZCBhdCBhIHRpbWUsIHRoZSBvbmUgYmVpbmcgdXNlZAotCQl0aGlzLmluaXQoKTsKLQl9OwotCQotCWpRdWVyeS5hdXRvZ3Jvdy5mbiA9IGpRdWVyeS5hdXRvZ3Jvdy5wcm90b3R5cGUgPSB7Ci0gICAgYXV0b2dyb3c6ICcxLjIuMicKLSAgfTsKLQkKLSAJalF1ZXJ5LmF1dG9ncm93LmZuLmV4dGVuZCA9IGpRdWVyeS5hdXRvZ3Jvdy5leHRlbmQgPSBqUXVlcnkuZXh0ZW5kOwotCQotCWpRdWVyeS5hdXRvZ3Jvdy5mbi5leHRlbmQoewotCQkJCQkJIAotCQlpbml0OiBmdW5jdGlvbigpIHsJCQkKLQkJCXZhciBzZWxmID0gdGhpczsJCQkKLQkJCXRoaXMudGV4dGFyZWEuY3NzKHtvdmVyZmxvdzogJ2hpZGRlbicsIGRpc3BsYXk6ICdibG9jayd9KTsKLQkJCXRoaXMudGV4dGFyZWEuYmluZCgnZm9jdXMnLCBmdW5jdGlvbigpIHsgc2VsZi5zdGFydEV4cGFuZCgpOyB9ICkuYmluZCgnYmx1cicsIGZ1bmN0aW9uKCkgeyBzZWxmLnN0b3BFeHBhbmQoKTsgfSk7Ci0JCQl0aGlzLmNoZWNrRXhwYW5kKCk7CQotCQl9LAotCQkJCQkJIAotCQlzdGFydEV4cGFuZDogZnVuY3Rpb24oKSB7CQkJCQotCQkgIHZhciBzZWxmID0gdGhpczsKLQkJCXRoaXMuaW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7c2VsZi5jaGVja0V4cGFuZCgpO30sIDQwMCk7Ci0JCX0sCi0JCQotCQlzdG9wRXhwYW5kOiBmdW5jdGlvbigpIHsKLQkJCWNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7CQotCQl9LAotCQkKLQkJY2hlY2tFeHBhbmQ6IGZ1bmN0aW9uKCkgewotCQkJCi0JCQlpZiAodGhpcy5kdW1teSA9PSBudWxsKQotCQkJewotCQkJCXRoaXMuZHVtbXkgPSBqUXVlcnkoJzxkaXY+PC9kaXY+Jyk7Ci0JCQkJdGhpcy5kdW1teS5jc3MoewotCQkJCQkJCQkJCQkJJ2ZvbnQtc2l6ZScgIDogdGhpcy50ZXh0YXJlYS5jc3MoJ2ZvbnQtc2l6ZScpLAotCQkJCQkJCQkJCQkJJ2ZvbnQtZmFtaWx5JzogdGhpcy50ZXh0YXJlYS5jc3MoJ2ZvbnQtZmFtaWx5JyksCi0JCQkJCQkJCQkJCQknd2lkdGgnICAgICAgOiB0aGlzLnRleHRhcmVhLmNzcygnd2lkdGgnKSwKLQkJCQkJCQkJCQkJCS8vIElFIHNoaXRzIGl0cyBwYW50cyBpZiB5b3UgdW5jb21tZW50IHRoZSBuZXh0IGxpbmUhCi0JCQkJCQkJCQkJCQkvLydwYWRkaW5nJyAgICA6IHRoaXMudGV4dGFyZWEuY3NzKCdwYWRkaW5nJyksCi0JCQkJCQkJCQkJCQknbGluZS1oZWlnaHQnOiB0aGlzLmxpbmVfaGVpZ2h0ICsgJ3B4JywKLQkJCQkJCQkJCQkJCSdvdmVyZmxvdy14JyA6ICdoaWRkZW4nLAotCQkJCQkJCQkJCQkJJ3Bvc2l0aW9uJyAgIDogJ2Fic29sdXRlJywKLQkJCQkJCQkJCQkJCSd0b3AnICAgICAgICA6IDAsCi0JCQkJCQkJCQkJCQknbGVmdCcJCSA6IC05OTk5Ci0JCQkJCQkJCQkJCQl9KS5hcHBlbmRUbygnYm9keScpOwotCQkJfQotCQkJCi0JCQkvLyBTdHJpcCBIVE1MIHRhZ3MKLQkJCXZhciBodG1sID0gdGhpcy50ZXh0YXJlYS52YWwoKS5yZXBsYWNlKC8oPHw+KS9nLCAnJyk7Ci0JCQkKLQkJCS8vIElFIGlzIGRpZmZlcmVudCwgYXMgcGVyIHVzdWFsCi0JCQlpZiAoJC5icm93c2VyLm1zaWUpCi0JCQl7Ci0JCQkJaHRtbCA9IGh0bWwucmVwbGFjZSgvXG4vZywgJzxCUj5uZXcnKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlodG1sID0gaHRtbC5yZXBsYWNlKC9cbi9nLCAnPGJyPm5ldycpOwotCQkJfQotCQkJCi0JCQlpZiAodGhpcy5kdW1teS5odG1sKCkgIT0gaHRtbCkKLQkJCXsKLQkJCQl0aGlzLmR1bW15Lmh0bWwoaHRtbCk7CQotCQkJCQotCQkJCWlmICh0aGlzLm1heF9oZWlnaHQgPiAwICYmICh0aGlzLmR1bW15LmhlaWdodCgpICsgdGhpcy5saW5lX2hlaWdodCA+IHRoaXMubWF4X2hlaWdodCkpCi0JCQkJewotCQkJCQl0aGlzLnRleHRhcmVhLmNzcygnb3ZlcmZsb3cteScsICdhdXRvJyk7CQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl0aGlzLnRleHRhcmVhLmNzcygnb3ZlcmZsb3cteScsICdoaWRkZW4nKTsKLQkJCQkJaWYgKHRoaXMudGV4dGFyZWEuaGVpZ2h0KCkgPCB0aGlzLmR1bW15LmhlaWdodCgpICsgdGhpcy5saW5lX2hlaWdodCB8fCAodGhpcy5kdW1teS5oZWlnaHQoKSA8IHRoaXMudGV4dGFyZWEuaGVpZ2h0KCkpKQotCQkJCQl7CQotCQkJCQkJdGhpcy50ZXh0YXJlYS5hbmltYXRlKHtoZWlnaHQ6ICh0aGlzLmR1bW15LmhlaWdodCgpICsgdGhpcy5saW5lX2hlaWdodCkgKyAncHgnfSwgMTAwKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkgfSk7Ci19KShqUXVlcnkpOwpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuYmxvY2tVSS5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmJsb2NrVUkuanMKaW5kZXggNTViNTJhOS4uMzhlNjQxMCAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuYmxvY2tVSS5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5ibG9ja1VJLmpzCkBAIC0xLDQgKzEsMjggQEAKLe+7vy8qIQor77u/LyoKKworVGhlIE1JVCBMaWNlbnNlIChNSVQpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworCisvKiEKICAqIGpRdWVyeSBibG9ja1VJIHBsdWdpbgogICogVmVyc2lvbiAyLjM5ICgyMy1NQVktMjAxMSkKICAqIEByZXF1aXJlcyBqUXVlcnkgdjEuMi4zIG9yIGxhdGVyCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5jb29raWUuanMgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5jb29raWUuanMKaW5kZXggNmQ1OTc0YS4uMDMwNzlhNSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuY29va2llLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmNvb2tpZS5qcwpAQCAtMSwzICsxLDI3IEBACisvKgorCitUaGUgTUlUIExpY2Vuc2UgKE1JVCkKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKyovCisKIC8qIQogICogalF1ZXJ5IENvb2tpZSBQbHVnaW4KICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXJoYXJ0bC9qcXVlcnktY29va2llCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5mb3JtLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuZm9ybS5qcwppbmRleCBiMzZjZWI5ZC4uNjNlZTRjMSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuZm9ybS5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5mb3JtLmpzCkBAIC0xLDMgKzEsMjcgQEAKKy8qCisKK1RoZSBNSVQgTGljZW5zZSAoTUlUKQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKwogLyohCiAgKiBqUXVlcnkgRm9ybSBQbHVnaW4KICAqIHZlcnNpb246IDIuNDcgKDA0LVNFUC0yMDEwKQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuanN0cmVlLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuanN0cmVlLmpzCmluZGV4IDBlZWEyZjYuLmI4NmRiNmUgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LmpzdHJlZS5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5qc3RyZWUuanMKQEAgLTEsNCArMSwyOCBAQAogLyoKKworVGhlIE1JVCBMaWNlbnNlIChNSVQpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworCisvKgogICoganNUcmVlIDEuMC1yYzEKICAqIGh0dHA6Ly9qc3RyZWUuY29tLwogICoKQEAgLTM1MDcsNCArMzUzMSw0IEBACiAJCX0KIAl9KTsKIH0pKGpRdWVyeSk7Ci0vLyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLy8qLwpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkuc2FtbXkuanMgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5zYW1teS5qcwppbmRleCBkNjU1YzhkLi5mZmEzZGNjIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5zYW1teS5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS5zYW1teS5qcwpAQCAtMSwyMCArMSwyNyBAQAogLy8gbmFtZTogc2FtbXkKIC8vIHZlcnNpb246IDAuNi4yCiAvKgotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0NvcHlyaWdodCAoYykgMjAwOCBBYXJvbiBRdWludCwgUXVpcmtleSBOWUMsIExMQwogCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKICovCiAKIChmdW5jdGlvbigkLCB3aW5kb3cpIHsKZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LnRpbWVhZ28uanMgYi9zb2xyL3dlYmFwcC93ZWIvanMvbGliL2pxdWVyeS50aW1lYWdvLmpzCmluZGV4IDZkZjc3NDIuLjMyYTVhYzcgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvanF1ZXJ5LnRpbWVhZ28uanMKKysrIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9qcXVlcnkudGltZWFnby5qcwpAQCAtMSw0ICsxLDI4IEBACiAvKgorCitUaGUgTUlUIExpY2Vuc2UgKE1JVCkKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKyovCisKKy8qCiAgKiB0aW1lYWdvOiBhIGpRdWVyeSBwbHVnaW4sIHZlcnNpb246IDAuOS4zICgyMDExLTAxLTIxKQogICogQHJlcXVpcmVzIGpRdWVyeSB2MS4yLjMgb3IgbGF0ZXIKICAqCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL29yZGVyLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL2xpYi9vcmRlci5qcwppbmRleCA1ZWRkNWNlLi4xNjljY2ZiIDEwMDY0NAotLS0gYS9zb2xyL3dlYmFwcC93ZWIvanMvbGliL29yZGVyLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9saWIvb3JkZXIuanMKQEAgLTEsMyArMSwzMCBAQAorLyoKKworTUlUIExpY2Vuc2UKKy0tLS0tLS0tLS0tCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDExLCBUaGUgRG9qbyBGb3VuZGF0aW9uCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworCiAvKioKICAqIEBsaWNlbnNlIFJlcXVpcmVKUyBvcmRlciAxLjAuNSBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgVGhlIERvam8gRm91bmRhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS4KZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9qcy9tYWluLmpzIGIvc29sci93ZWJhcHAvd2ViL2pzL21haW4uanMKaW5kZXggNjM1ZjE1Yy4uNzkyYTE4NSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL21haW4uanMKKysrIGIvc29sci93ZWJhcHAvd2ViL2pzL21haW4uanMKQEAgLTIwLDEyICsyMCwxMiBAQAogICBbCiAgICAgJ2xpYi9vcmRlciFsaWIvY29uc29sZScsCiAgICAgJ2xpYi9vcmRlciFqcXVlcnknLAotICAgICdsaWIvb3JkZXIhbGliL2pxdWVyeS5hdXRvZ3JvdycsCiAgICAgJ2xpYi9vcmRlciFsaWIvanF1ZXJ5LmNvb2tpZScsCiAgICAgJ2xpYi9vcmRlciFsaWIvanF1ZXJ5LmZvcm0nLAogICAgICdsaWIvb3JkZXIhbGliL2pxdWVyeS5qc3RyZWUnLAogICAgICdsaWIvb3JkZXIhbGliL2pxdWVyeS5zYW1teScsCiAgICAgJ2xpYi9vcmRlciFsaWIvanF1ZXJ5LnRpbWVhZ28nLAorICAgICdsaWIvb3JkZXIhbGliL2pxdWVyeS5hamF4ZmlsZXVwbG9hZCcsCiAgICAgJ2xpYi9vcmRlciFsaWIvanF1ZXJ5LmJsb2NrVUknLAogICAgICdsaWIvb3JkZXIhbGliL2hpZ2hsaWdodCcsCiAgICAgJ2xpYi9vcmRlciFsaWIvbGlua2VyJywKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAnbGliL29yZGVyIXNjcmlwdHMvYW5hbHlzaXMnLAogICAgICdsaWIvb3JkZXIhc2NyaXB0cy9jbG91ZCcsCiAgICAgJ2xpYi9vcmRlciFzY3JpcHRzL2NvcmVzJywKKyAgICAnbGliL29yZGVyIXNjcmlwdHMvZG9jdW1lbnRzJywKICAgICAnbGliL29yZGVyIXNjcmlwdHMvZGF0YWltcG9ydCcsCiAgICAgJ2xpYi9vcmRlciFzY3JpcHRzL2Rhc2hib2FyZCcsCiAgICAgJ2xpYi9vcmRlciFzY3JpcHRzL2ZpbGUnLApAQCAtNTQsNCArNTUsNCBAQAogICB7CiAgICAgYXBwLnJ1bigpOwogICB9Ci0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyk7CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvcmVxdWlyZS5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9yZXF1aXJlLmpzCmluZGV4IDE4NDZiMmUuLjhlZTAwNTEgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9yZXF1aXJlLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9yZXF1aXJlLmpzCkBAIC0xLDMgKzEsMzAgQEAKKy8qCisKK01JVCBMaWNlbnNlCistLS0tLS0tLS0tLQorCitDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgVGhlIERvam8gRm91bmRhdGlvbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKwogLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAgKiBAbGljZW5zZSBSZXF1aXJlSlMgMS4wLjYgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIEF2YWlsYWJsZSB2aWEgdGhlIE1JVCBvciBuZXcgQlNEIGxpY2Vuc2UuCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9hbmFseXNpcy5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2FuYWx5c2lzLmpzCmluZGV4IDkxODY0MzkuLjhhZWUxMjkgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2FuYWx5c2lzLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2FuYWx5c2lzLmpzCkBAIC0xMjUsMTEgKzEyNSwxMSBAQAogICAgICAgICAgICAgICB2YXIgZmllbGRzID0gMDsKICAgICAgICAgICAgICAgZm9yKCB2YXIga2V5IGluIGNvbnRleHQucGFyYW1zICkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAnc3RyaW5nJyA9PT0gdHlwZW9mIGNvbnRleHQucGFyYW1zW2tleV0gKQorICAgICAgICAgICAgICAgIGlmKCAnc3RyaW5nJyA9PT0gdHlwZW9mIGNvbnRleHQucGFyYW1zW2tleV0gJiYgMCAhPT0gY29udGV4dC5wYXJhbXNba2V5XS5sZW5ndGggKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIGZpZWxkcysrOwogICAgICAgICAgICAgICAgICAgJCggJ1tuYW1lPSInICsga2V5ICsgJyJdJywgYW5hbHlzaXNfZm9ybSApCi0gICAgICAgICAgICAgICAgICAgIC52YWwoIGNvbnRleHQucGFyYW1zW2tleV0ucmVwbGFjZSggL1wrL2csICcgJyApICk7CisgICAgICAgICAgICAgICAgICAgIC52YWwoIGNvbnRleHQucGFyYW1zW2tleV0gKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KIApAQCAtMjUwLDcgKzI1MCw4IEBACiAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSAkLnBhcmFtKCBjb21wdXRlX2FuYWx5c2lzX3BhcmFtcygpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSggL1tcd1wuXSs9XCsqKCYpL2csICckMScgKSAvLyByZW1vdmUgZW1wdHkgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCAvKCYpKy8sICckMScgKSAgICAgICAgICAgIC8vIHJlZHVjZSBtdWx0aXBsZSBhbXBlcnNhbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eJi8sICcnICk7ICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYW1wZXJzYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9eJi8sICcnICkgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYW1wZXJzYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIC9cKy9nLCAnJTIwJyApOyAgICAgICAgICAgLy8gcmVwbGFjZSBwbHVzLXNpZ25zIHdpdGggZW5jb2RlZCB3aGl0ZXNwYWNlcwogCiAgICAgICAgICAgICAgIGNvbnRleHQucmVkaXJlY3QoIGNvbnRleHQucGF0aC5zcGxpdCggJz8nICkuc2hpZnQoKSArICc/JyArIHBhcmFtcyApOwogICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9hcHAuanMgYi9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9hcHAuanMKaW5kZXggZTdkNTE1Ny4uOGVlYTk3ZiAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvYXBwLmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2FwcC5qcwpAQCAtMzUxLDIzICszNTEsMjUgQEAKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZhciBjb3JlX25hbWUgPSAkKCAnb3B0aW9uOnNlbGVjdGVkJywgdGhpcyApLnRleHQoKTsKIAotICAgICAgICAgICAgICAgIGlmKCBjb3JlX25hbWUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRoYXQuY29yZV9tZW51CisgICAgICAgICAgICAgICAgdGhhdC5jb3JlX21lbnUKICAgICAgICAgICAgICAgICAgICAgLmh0bWwKLSAgICAgICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9Im92ZXJ2aWV3Ij48YSBocmVmPSIjLycgKyBjb3JlX25hbWUgKyAnIj48c3Bhbj5PdmVydmlldzwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0icGluZyI+PGEgcmVsPSInICsgdGhhdC5jb25maWcuc29scl9wYXRoICsgJy8nICsgY29yZV9uYW1lICsgJy9hZG1pbi9waW5nIj48c3Bhbj5QaW5nPC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPSJxdWVyeSI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9xdWVyeSI+PHNwYW4+UXVlcnk8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9InNjaGVtYSI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9zY2hlbWEiPjxzcGFuPlNjaGVtYTwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0iY29uZmlnIj48YSBocmVmPSIjLycgKyBjb3JlX25hbWUgKyAnL2NvbmZpZyI+PHNwYW4+Q29uZmlnPC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPSJyZXBsaWNhdGlvbiI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9yZXBsaWNhdGlvbiI+PHNwYW4+UmVwbGljYXRpb248L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9ImFuYWx5c2lzIj48YSBocmVmPSIjLycgKyBjb3JlX25hbWUgKyAnL2FuYWx5c2lzIj48c3Bhbj5BbmFseXNpczwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0ic2NoZW1hLWJyb3dzZXIiPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICcvc2NoZW1hLWJyb3dzZXIiPjxzcGFuPlNjaGVtYSBCcm93c2VyPC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsgCi0gICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0icGx1Z2lucyI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9wbHVnaW5zIj48c3Bhbj5QbHVnaW5zIC8gU3RhdHM8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9ImRhdGFpbXBvcnQiPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICcvZGF0YWltcG9ydCI+PHNwYW4+RGF0YWltcG9ydDwvc3Bhbj48L2E+PC9saT4nICsgIlxuIgorICAgICAgICAgICAgICAgICAgICAoLy9LZWVwIHRoaXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGFmdGVyIHRoZSBvdmVydmlldworICAgICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0ib3ZlcnZpZXciPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICciPjxzcGFuPk92ZXJ2aWV3PC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPSJhbmFseXNpcyI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9hbmFseXNpcyI+PHNwYW4+QW5hbHlzaXM8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9ImNvbmZpZyI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9jb25maWciPjxzcGFuPkNvbmZpZzwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0iZGF0YWltcG9ydCI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9kYXRhaW1wb3J0Ij48c3Bhbj5EYXRhaW1wb3J0PC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPSJkb2N1bWVudHMiPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICcvZG9jdW1lbnRzIj48c3Bhbj5Eb2N1bWVudHM8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9InBpbmciPjxhIHJlbD0iJyArIHRoYXQuY29uZmlnLnNvbHJfcGF0aCArICcvJyArIGNvcmVfbmFtZSArICcvYWRtaW4vcGluZyI+PHNwYW4+UGluZzwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0icGx1Z2lucyI+PGEgaHJlZj0iIy8nICsgY29yZV9uYW1lICsgJy9wbHVnaW5zIj48c3Bhbj5QbHVnaW5zIC8gU3RhdHM8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9InF1ZXJ5Ij48YSBocmVmPSIjLycgKyBjb3JlX25hbWUgKyAnL3F1ZXJ5Ij48c3Bhbj5RdWVyeTwvc3Bhbj48L2E+PC9saT4nICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsaSBjbGFzcz0icmVwbGljYXRpb24iPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICcvcmVwbGljYXRpb24iPjxzcGFuPlJlcGxpY2F0aW9uPC9zcGFuPjwvYT48L2xpPicgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPSJzY2hlbWEiPjxhIGhyZWY9IiMvJyArIGNvcmVfbmFtZSArICcvc2NoZW1hIj48c3Bhbj5TY2hlbWE8L3NwYW4+PC9hPjwvbGk+JyArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9InNjaGVtYS1icm93c2VyIj48YSBocmVmPSIjLycgKyBjb3JlX25hbWUgKyAnL3NjaGVtYS1icm93c2VyIj48c3Bhbj5TY2hlbWEgQnJvd3Nlcjwvc3Bhbj48L2E+PC9saT4nICsgIlxuIgorCiAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKKyAgICAgICAgICAgICAgICBpZiggY29yZV9uYW1lICkKKyAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CkBAIC01ODUsNSArNTg3LDc0IEBACiAKIH07CiAKK3ZhciBjb25uZWN0aW9uX2NoZWNrX2RlbGF5ID0gMTAwMDsKK3ZhciBjb25uZWN0aW9uX3dvcmtpbmcgPSB0cnVlOworCit2YXIgY29ubmVjdGlvbl9jaGVjayA9IGZ1bmN0aW9uIGNvbm5lY3Rpb25fY2hlY2soKQoreworICAkLmFqYXgKKyAgKAorICAgIHsKKyAgICAgIHVybCA6IGNvbmZpZy5zb2xyX3BhdGggKyBjb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJmluZGV4SW5mbz1mYWxzZScsCisgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgIGNvbnRleHQgOiAkKCAnLmJsb2NrVUkgI2Nvbm5lY3Rpb25fc3RhdHVzIHNwYW4nICksCisgICAgICBiZWZvcmVTZW5kIDogZnVuY3Rpb24oIGFyciwgZm9ybSwgb3B0aW9ucyApCisgICAgICB7ICAgICAgICAgICAgICAgCisgICAgICAgIHRoaXMKKyAgICAgICAgICAuYWRkQ2xhc3MoICdsb2FkZXInICk7CisgICAgICB9LAorICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSApCisgICAgICB7CisgICAgICAgIGNvbm5lY3Rpb25fd29ya2luZyA9IHRydWU7CisKKyAgICAgICAgdGhpcworICAgICAgICAgIC5odG1sKCAnSW5zdGFuY2UgaXMgYXZhaWxhYmxlIC0gPGEgaHJlZj0iamF2YXNjcmlwdDpsb2NhdGlvbi5yZWxvYWQoKTsiPlJlbG9hZCB0aGUgcGFnZTwvYT4nICk7CisKKyAgICAgICAgdGhpcy5wYXJlbnRzKCAnI2Nvbm5lY3Rpb25fc3RhdHVzJyApCisgICAgICAgICAgLmFkZENsYXNzKCAnb25saW5lJyApOworCisgICAgICAgIHRoaXMucGFyZW50cyggJy5ibG9ja1VJJyApCisgICAgICAgICAgLmNzcyggJ2JvcmRlckNvbG9yJywgJyMwODAnICk7CisgICAgICB9LAorICAgICAgZXJyb3IgOiBmdW5jdGlvbigpCisgICAgICB7CisgICAgICAgIGNvbm5lY3Rpb25fY2hlY2tfZGVsYXkgKz0gY29ubmVjdGlvbl9jaGVja19kZWxheTsKKyAgICAgICAgd2luZG93LnNldFRpbWVvdXQoIGNvbm5lY3Rpb25fY2hlY2ssIGNvbm5lY3Rpb25fY2hlY2tfZGVsYXkgKTsKKyAgICAgIH0sCisgICAgICBjb21wbGV0ZSA6IGZ1bmN0aW9uKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcworICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2xvYWRlcicgKTsKKyAgICAgIH0KKyAgICB9CisgICk7Cit9OworCit2YXIgY29ubmVjdGlvbl9lcnJvciA9IGZ1bmN0aW9uIGNvbm5lY3Rpb25fZXJyb3IoKQoreworICBjb25uZWN0aW9uX3dvcmtpbmcgPSBmYWxzZTsKKworICAkLmJsb2NrVUkKKyAgKAorICAgIHsKKyAgICAgIG1lc3NhZ2U6ICQoICcjY29ubmVjdGlvbl9zdGF0dXMnICksCisgICAgICBjc3M6IHsgd2lkdGg6ICc0NTBweCcsIGJvcmRlckNvbG9yOiAnI2YwMCcgfQorICAgIH0KKyAgKTsKKworICB3aW5kb3cuc2V0VGltZW91dCggY29ubmVjdGlvbl9jaGVjaywgY29ubmVjdGlvbl9jaGVja19kZWxheSApOworfQorCiskKCBkb2N1bWVudCApLmFqYXhFcnJvcgorKAorICBmdW5jdGlvbiggZXZlbnQsIHhociwgc2V0dGluZ3MsIHRocm93bkVycm9yICkKKyAgeworICAgIGlmKCBjb25uZWN0aW9uX3dvcmtpbmcgJiYgMCA9PT0geGhyLnN0YXR1cyApCisgICAgeworICAgICAgY29ubmVjdGlvbl9lcnJvcigpOworICAgIH0KKyAgfQorKTsKKwogJC5hamF4U2V0dXAoIHsgY2FjaGU6IGZhbHNlIH0gKTsKIHZhciBhcHAgPSBuZXcgc29scl9hZG1pbiggYXBwX2NvbmZpZyApOwpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvZGF0YWltcG9ydC5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2RhdGFpbXBvcnQuanMKaW5kZXggMWIyYjdmMS4uMjhiZWIwYSAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvZGF0YWltcG9ydC5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9kYXRhaW1wb3J0LmpzCkBAIC0zMjMsOSArMzIzLDYgQEAKICAgICAgICAgICAgICAgICBzdWJtaXRfc3BhbgogICAgICAgICAgICAgICAgICAgLmRhdGEoICdvcmlnaW5hbCcsIHN1Ym1pdF9zcGFuLnRleHQoKSApCiAgICAgICAgICAgICAgICAgICAudGV4dCggc3VibWl0X3NwYW4uZGF0YSggJ2RlYnVnbW9kZScgKSApOwotCi0gICAgICAgICAgICAgICAgJCggJ3RleHRhcmVhJywgYmxvY2sgKQotICAgICAgICAgICAgICAgICAgLmF1dG9ncm93KCkKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHsKQEAgLTgxMiw0ICs4MDksNCBAQAogICAgICAgfQogICAgICk7CiAgIH0KLSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorKTsKZGlmZiAtLWdpdCBhL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2RvY3VtZW50cy5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2RvY3VtZW50cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDEyZTIzCi0tLSAvZGV2L251bGwKKysrIGIvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvZG9jdW1lbnRzLmpzCkBAIC0wLDAgKzEsMzcwIEBACisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvL2hlbHBlciBmb3IgZm9ybWF0dGluZyBKU09OIGFuZCBvdGhlcnMKK3ZhciBjb250ZW50X2dlbmVyYXRvciA9IHsKKworICBfZGVmYXVsdDogZnVuY3Rpb24gKHRvRXNjKSB7CisgICAgcmV0dXJuIHRvRXNjLmVzYygpOworICB9LAorCisgIGpzb246IGZ1bmN0aW9uICh0b0VzYykgeworICAgIHJldHVybiBhcHAuZm9ybWF0X2pzb24odG9Fc2MpOworICB9CisKK307CisKKy8vVXRpbHRpdHkgZnVuY3Rpb24gZm9yIHR1cm5pbmcgb24vb2ZmIHZhcmlvdXMgZWxlbWVudHMKK2Z1bmN0aW9uIHRvZ2dsZXMoZG9jdW1lbnRzX2Zvcm0sIHNob3dfanNvbiwgc2hvd19maWxlLCBzaG93X2RvYywgZG9jX3RleHQsIHNob3dfd2l6YXJkKSB7CisgIHZhciBqc29uX29ubHkgPSAkKCcjanNvbi1vbmx5Jyk7CisgIHZhciB0aGVfZG9jdW1lbnQgPSAkKCcjZG9jdW1lbnQnLCBkb2N1bWVudHNfZm9ybSk7CisgIGlmIChzaG93X2RvYykgeworICAgIC8vY29uc29sZS5sb2coImRvYzogIiArIGRvY190ZXh0KTsKKyAgICB0aGVfZG9jdW1lbnQudmFsKGRvY190ZXh0KTsKKyAgICB0aGVfZG9jdW1lbnQuc2hvdygpOworICB9IGVsc2UgeworICAgIHRoZV9kb2N1bWVudC5oaWRlKCk7CisgIH0KKyAgaWYgKHNob3dfanNvbikgeworICAgIGpzb25fb25seS5zaG93KCk7CisgIH0gZWxzZSB7CisgICAganNvbl9vbmx5LmhpZGUoKTsKKyAgfQorICB2YXIgZmlsZV91cGxvYWQgPSAkKCcjZmlsZS11cGxvYWQnLCBkb2N1bWVudHNfZm9ybSk7CisgIHZhciB1cGxvYWRfb25seSA9ICQoJyN1cGxvYWQtb25seScsIGRvY3VtZW50c19mb3JtKTsKKyAgaWYgKHNob3dfZmlsZSkgeworICAgIGZpbGVfdXBsb2FkLnNob3coKTsKKyAgICB1cGxvYWRfb25seS5zaG93KCk7CisgIH0gZWxzZSB7CisgICAgZmlsZV91cGxvYWQuaGlkZSgpOworICAgIHVwbG9hZF9vbmx5LmhpZGUoKTsKKyAgfQorICB2YXIgd2l6YXJkID0gJCgnI3dpemFyZCcsIGRvY3VtZW50c19mb3JtKTsKKyAgaWYgKHNob3dfd2l6YXJkKSB7CisgICAgd2l6YXJkLnNob3coKTsKKyAgfSBlbHNlIHsKKyAgICB3aXphcmQuaGlkZSgpOworICB9Cit9CisvLyAjLzpjb3JlL2RvY3VtZW50cworCisvL1V0aWx0aXR5IGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIHRoZSB3aXphcmQgZmllbGRzCitmdW5jdGlvbiBhZGRXaXphcmRGaWVsZHMoYWN0aXZlX2NvcmUsIHdpemFyZCkgeworICB2YXIgY29yZV9iYXNlcGF0aCA9IGFjdGl2ZV9jb3JlLmF0dHIoJ2RhdGEtYmFzZXBhdGgnKTsKKyAgdmFyIHNlbGVjdF9vcHRpb25zID0gIiI7CisgIC8vUG9wdWxhdGUgdGhlIHNlbGVjdCBvcHRpb25zIGJhc2VkIG9mZiB0aGUgRmllbGRzIFJFU1QgQVBJCisgICQuZ2V0SlNPTih3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QKKyAgICAgICAgICArIGNvcmVfYmFzZXBhdGggKyAiL3NjaGVtYS9maWVsZHMiKS5kb25lKAorICAgICAgLy9UT0RPOiBoYW5kbGUgZHluYW1pYyBmaWVsZHMKKyAgICAgIC8vVE9ETzogZ2V0IHRoZSB1bmlxdWUga2V5LCB0b28KKyAgICAgIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgIHZhciBmaWVsZF9zZWxlY3QgPSAkKCIjd2l6LWZpZWxkLXNlbGVjdCIsIHdpemFyZCk7CisgICAgICAgIGZpZWxkX3NlbGVjdC5lbXB0eSgpOworICAgICAgICAkLmVhY2goZGF0YS5maWVsZHMsCisgICAgICAgICAgICBmdW5jdGlvbiAoaSwgaXRlbSkgeworICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJpWyIgKyBpICsgIl09IiArIGl0ZW0ubmFtZSk7CisgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgIT0gIl92ZXJzaW9uXyIpeworICAgICAgICAgICAgICAgIHNlbGVjdF9vcHRpb25zICs9ICc8b3B0aW9uIG5hbWU9IicgKyBpdGVtLm5hbWUgKyAnIj4nCisgICAgICAgICAgICAgICAgICArIGl0ZW0ubmFtZSArICc8L29wdGlvbj4nOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgLy9jb25zb2xlLmxvZygic2VsZWN0X29wdGlvbnM6ICIgKyBzZWxlY3Rfb3B0aW9ucyk7CisgICAgICAgIC8vZmlsbCBpbiB0aGUgc2VsZWN0IG9wdGlvbnMKKyAgICAgICAgZmllbGRfc2VsZWN0LmFwcGVuZChzZWxlY3Rfb3B0aW9ucyk7CisgICAgICB9KTsKKyAgdmFyIHdpemFyZF9kb2MgPSAkKCIjd2l6YXJkLWRvYyIsIHdpemFyZCk7CisgIHdpemFyZF9kb2MuZGllKCdmb2N1c2luJykKKyAgICAgIC5saXZlKCdmb2N1c2luJywgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICQoIiN3aXphcmQtZG9jIiwgd2l6YXJkKS50ZXh0KCIiKTsKKyAgICAgIH0KKyAgKTsKKyAgLy9BZGQgdGhlIGNsaWNrIGhhbmRsZXIgZm9yIHRoZSAiQWRkIEZpZWxkIiB0YXJnZXQsIHdoaWNoCisgIC8vdGFrZXMgdGhlIGZpZWxkIGNvbnRlbnQgYW5kIG1vdmVzIGl0IGludG8gdGhlIGRvY3VtZW50IHRhcmdldAorICB2YXIgYWRkX2ZpZWxkID0gJCgiI2FkZC1maWVsZC1ocmVmIiwgd2l6YXJkKTsKKyAgYWRkX2ZpZWxkLmRpZSgiY2xpY2siKQorICAgICAgLmxpdmUoImNsaWNrIiwKKyAgICAgIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAvL3Rha2UgdGhlIGZpZWxkIGFuZCB0aGUgY29udGVudHMgYW5kIGFwcGVuZCBpdCB0byB0aGUgZG9jdW1lbnQKKyAgICAgICAgdmFyIHdpel9zZWxlY3QgPSAkKCIjd2l6LWZpZWxkLXNlbGVjdCIsIHdpemFyZCk7CisgICAgICAgIHZhciBzZWxlY3RlZCA9ICQoIm9wdGlvbjpzZWxlY3RlZCIsIHdpel9zZWxlY3QpOworICAgICAgICBjb25zb2xlLmxvZygic2VsZWN0ZWQgZmllbGQ6ICIgKyBzZWxlY3RlZCk7CisgICAgICAgIHZhciB3aXpfZG9jID0gJCgiI3dpemFyZC1kb2MiLCB3aXphcmQpOworICAgICAgICB2YXIgdGhlX2RvY3VtZW50ID0gJCgiI2RvY3VtZW50Iik7CisgICAgICAgIHZhciBjdXJyZW50X2RvYyA9IHRoZV9kb2N1bWVudC52YWwoKTsKKyAgICAgICAgY29uc29sZS5sb2coImN1cnJlbnRfdGV4dDogIiArIGN1cnJlbnRfZG9jICsgIiB3aXpfZG9jOiAiICsgd2l6X2RvYy52YWwoKSk7CisgICAgICAgIHZhciBpbmRleCA9IGN1cnJlbnRfZG9jLmxhc3RJbmRleE9mKCJ9Iik7CisgICAgICAgIHZhciBuZXdfZW50cnkgPSAnIicgKyBzZWxlY3RlZC52YWwoKSArICciOiInICsgd2l6X2RvYy52YWwoKSArICciJzsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICBjdXJyZW50X2RvYyA9IGN1cnJlbnRfZG9jLnN1YnN0cmluZygwLCBpbmRleCkgKyAnLCAnICsgbmV3X2VudHJ5ICsgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vd2UgZG9uJ3QgaGF2ZSBhIGRvYyBhdCBhbGwKKyAgICAgICAgICBjdXJyZW50X2RvYyA9ICJ7IiArIG5ld19lbnRyeSArICJ9IjsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50X2RvYyA9IGNvbnRlbnRfZ2VuZXJhdG9yWydqc29uJ10oY3VycmVudF9kb2MpOworICAgICAgICB0aGVfZG9jdW1lbnQudmFsKGN1cnJlbnRfZG9jKTsKKyAgICAgICAgLy9jbGVhciB0aGUgd2l6IGRvYyB3aW5kb3cKKyAgICAgICAgd2l6X2RvYy52YWwoIiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICk7CisKKyAgLy9jb25zb2xlLmxvZygiYWRkaW5nICIgKyBpICsgIiBjaGlsZDogIiArIGNoaWxkKTsKKworfQorCisvL1RoZSBtYWluIHByb2dyYW0gZm9yIGFkZGluZyB0aGUgZG9jcworc2FtbXkuZ2V0CisoCisgICAgbmV3IFJlZ0V4cChhcHAuY29yZV9yZWdleF9iYXNlICsgJ1xcLyhkb2N1bWVudHMpJCcpLAorICAgIGZ1bmN0aW9uIChjb250ZXh0KSB7CisgICAgICB2YXIgYWN0aXZlX2NvcmUgPSB0aGlzLmFjdGl2ZV9jb3JlOworICAgICAgdmFyIGNvcmVfYmFzZXBhdGggPSBhY3RpdmVfY29yZS5hdHRyKCdkYXRhLWJhc2VwYXRoJyk7CisgICAgICB2YXIgY29udGVudF9lbGVtZW50ID0gJCgnI2NvbnRlbnQnKTsKKworCisgICAgICAkLnBvc3QKKyAgICAgICgKKyAgICAgICAgICAndHBsL2RvY3VtZW50cy5odG1sJywKKyAgICAgICAgICBmdW5jdGlvbiAodGVtcGxhdGUpIHsKKworICAgICAgICAgICAgY29udGVudF9lbGVtZW50CisgICAgICAgICAgICAgICAgLmh0bWwodGVtcGxhdGUpOworICAgICAgICAgICAgdmFyIGRvY3VtZW50c19lbGVtZW50ID0gJCgnI2RvY3VtZW50cycsIGNvbnRlbnRfZWxlbWVudCk7CisgICAgICAgICAgICB2YXIgZG9jdW1lbnRzX2Zvcm0gPSAkKCcjZm9ybSBmb3JtJywgZG9jdW1lbnRzX2VsZW1lbnQpOworICAgICAgICAgICAgdmFyIHVybF9lbGVtZW50ID0gJCgnI3VybCcsIGRvY3VtZW50c19lbGVtZW50KTsKKyAgICAgICAgICAgIHZhciByZXN1bHRfZWxlbWVudCA9ICQoJyNyZXN1bHQnLCBkb2N1bWVudHNfZWxlbWVudCk7CisgICAgICAgICAgICB2YXIgcmVzcG9uc2VfZWxlbWVudCA9ICQoJyNyZXNwb25zZScsIGRvY3VtZW50c19lbGVtZW50KTsKKyAgICAgICAgICAgIHZhciBkb2NfdHlwZV9zZWxlY3QgPSAkKCcjZG9jdW1lbnQtdHlwZScsIGRvY3VtZW50c19mb3JtKTsKKyAgICAgICAgICAgIC8vU2luY2Ugd2UgYXJlIHNob3dpbmcgImV4YW1wbGUiIGRvY3MsIHdoZW4gdGhlIGFyZWEgcmVjZWl2ZXMgdGhlIGZvY3VzCisgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGV4YW1wbGUgY29udGVudC4KKyAgICAgICAgICAgICQoJyNkb2N1bWVudCcsIGRvY3VtZW50c19mb3JtKS5kaWUoJ2ZvY3VzaW4nKQorICAgICAgICAgICAgICAgIC5saXZlKCdmb2N1c2luJywKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudF90eXBlID0gJCgnI2RvY3VtZW50LXR5cGUnLCBkb2N1bWVudHNfZm9ybSkudmFsKCk7CisgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRfdHlwZSAhPSAid2l6YXJkIil7CisgICAgICAgICAgICAgICAgICAgIC8vRG9uJ3QgY2xlYXIgdGhlIGRvY3VtZW50IHdoZW4gaW4gd2l6YXJkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIHZhciB0aGVfZG9jdW1lbnQgPSAkKCcjZG9jdW1lbnQnLCBkb2N1bWVudHNfZm9ybSk7CisgICAgICAgICAgICAgICAgICAgIHRoZV9kb2N1bWVudC50ZXh0KCIiKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvKnJlc3BvbnNlX2VsZW1lbnQuaHRtbCgiIik7Ki8KKyAgICAgICAgICAgIC8vU2V0dXAgdGhlIGhhbmRsZXJzIGZvciB0b2dnbGluZyB0aGUgdmFyaW91cyBkaXNwbGF5IG9wdGlvbnMgZm9yIHRoZSAiRG9jdW1lbnQgVHlwZSIgc2VsZWN0CisgICAgICAgICAgICBkb2NfdHlwZV9zZWxlY3QKKyAgICAgICAgICAgICAgICAuZGllKCdjaGFuZ2UnKQorICAgICAgICAgICAgICAgIC5saXZlCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgJ2NoYW5nZScsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRfdHlwZSA9ICQoJyNkb2N1bWVudC10eXBlJywgZG9jdW1lbnRzX2Zvcm0pLnZhbCgpOworICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfdXBsb2FkID0gJCgnI2ZpbGUtdXBsb2FkJywgZG9jdW1lbnRzX2Zvcm0pOworCisgICAgICAgICAgICAgICAgICAvL25lZWQgdG8gY2xlYXIgb3V0IGFueSBvbGQgZmlsZSB1cGxvYWQgYnkgZm9yY2luZyBhIHJlZHJhdyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAvL3dlIGRvbid0IHRyeSB0byB1cGxvYWQgYW4gb2xkIGZpbGUKKyAgICAgICAgICAgICAgICAgIGZpbGVfdXBsb2FkLmh0bWwoZmlsZV91cGxvYWQuaHRtbCgpKTsKKyAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudF90eXBlID09ICJqc29uIikgeworICAgICAgICAgICAgICAgICAgICB0b2dnbGVzKGRvY3VtZW50c19mb3JtLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgJ3siaWQiOiJjaGFuZ2UubWUiLCJ0aXRsZSI6ImNoYW5nZS5tZSJ9JywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAkKCIjYXR0cmlicyIpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRfdHlwZSA9PSAidXBsb2FkIikgeworICAgICAgICAgICAgICAgICAgICB0b2dnbGVzKGRvY3VtZW50c19mb3JtLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsICIiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICQoIiNhdHRyaWJzIikuc2hvdygpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudF90eXBlID09ICJjc3YiKSB7CisgICAgICAgICAgICAgICAgICAgIHRvZ2dsZXMoZG9jdW1lbnRzX2Zvcm0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgImlkLHRpdGxlXG5jaGFuZ2UubWUsY2hhbmdlLm1lIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAkKCIjYXR0cmlicyIpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRfdHlwZSA9PSAic29sciIpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9nZ2xlcyhkb2N1bWVudHNfZm9ybSwgZmFsc2UsIGZhbHNlLCB0cnVlLCAnPGFkZD5cbicgKworICAgICAgICAgICAgICAgICAgICAgICAgJzxkb2M+XG4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8ZmllbGQgbmFtZT0iaWQiPmNoYW5nZS5tZTwvZmllbGQ+XG4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8ZmllbGQgbmFtZT0idGl0bGUiID5jaGFuZy5tZTwvZmllbGQ+XG4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8L2RvYz5cbicgKworICAgICAgICAgICAgICAgICAgICAgICAgJzwvYWRkPlxuJywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAkKCIjYXR0cmlicyIpLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRfdHlwZSA9PSAid2l6YXJkIikgeworICAgICAgICAgICAgICAgICAgICB2YXIgd2l6YXJkID0gJCgnI3dpemFyZCcsIGRvY3VtZW50c19mb3JtKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkV2l6YXJkRmllbGRzKGFjdGl2ZV9jb3JlLCB3aXphcmQpOworICAgICAgICAgICAgICAgICAgICAvLyQoIiN3aXphcmQtZG9jIiwgd2l6YXJkKS50ZXh0KCdFbnRlciB5b3VyIGZpZWxkIHRleHQgaGVyZSBhbmQgdGhlbiBjbGljayAiQWRkIEZpZWxkIiB0byBhZGQgdGhlIGZpZWxkIHRvIHRoZSBkb2N1bWVudC4nKTsKKyAgICAgICAgICAgICAgICAgICAgdG9nZ2xlcyhkb2N1bWVudHNfZm9ybSwgZmFsc2UsIGZhbHNlLCB0cnVlLCAiIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICQoIiNhdHRyaWJzIikuc2hvdygpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudF90eXBlID09ICJ4bWwiKSB7CisgICAgICAgICAgICAgICAgICAgIHRvZ2dsZXMoZG9jdW1lbnRzX2Zvcm0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgJzxkb2M+XG4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8ZmllbGQgbmFtZT0iaWQiPmNoYW5nZS5tZTwvZmllbGQ+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAnPGZpZWxkIG5hbWU9InRpdGxlIj5jaGFuZ2UubWU8L2ZpZWxkPicgKworICAgICAgICAgICAgICAgICAgICAgICAgJzwvZG9jPicsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgJCgiI2F0dHJpYnMiKS5zaG93KCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGRvY190eXBlX3NlbGVjdC5jaG9zZW4oKS50cmlnZ2VyKCdjaGFuZ2UnKTsKKyAgICAgICAgICAgIC8vU2V0dXAgdGhlIHN1Ym1pdCBvcHRpb24gaGFuZGxpbmcuCisgICAgICAgICAgICBkb2N1bWVudHNfZm9ybQorICAgICAgICAgICAgICAgIC5kaWUoJ3N1Ym1pdCcpCisgICAgICAgICAgICAgICAgLmxpdmUKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAnc3VibWl0JywKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgIHZhciBmb3JtX3ZhbHVlcyA9IFtdOworICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJfcGF0aCA9ICQoJyNxdCcsIGRvY3VtZW50c19mb3JtKS52YWwoKTsKKyAgICAgICAgICAgICAgICAgIGlmICgnLycgIT09IGhhbmRsZXJfcGF0aFswXSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtX3ZhbHVlcy5wdXNoKHsgbmFtZTogJ3F0JywgdmFsdWU6IGhhbmRsZXJfcGF0aC5lc2MoKSB9KTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9wYXRoID0gJy91cGRhdGUnOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRfdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0CisgICAgICAgICAgICAgICAgICAgICAgKyBjb3JlX2Jhc2VwYXRoICsgaGFuZGxlcl9wYXRoICsgJz93dD1qc29uJzsKKworICAgICAgICAgICAgICAgICAgdXJsX2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsIGRvY3VtZW50X3VybCkKKyAgICAgICAgICAgICAgICAgICAgICAudGV4dChkb2N1bWVudF91cmwpCisgICAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXIoJ2NoYW5nZScpOworICAgICAgICAgICAgICAgICAgdmFyIHRoZV9kb2N1bWVudCA9ICQoJyNkb2N1bWVudCcsIGRvY3VtZW50c19mb3JtKS52YWwoKTsKKyAgICAgICAgICAgICAgICAgIHZhciBjb21taXRfd2l0aGluID0gJCgnI2NvbW1pdFdpdGhpbicsIGRvY3VtZW50c19mb3JtKS52YWwoKTsKKyAgICAgICAgICAgICAgICAgIHZhciBib29zdCA9ICQoJyNib29zdCcsIGRvY3VtZW50c19mb3JtKS52YWwoKTsKKyAgICAgICAgICAgICAgICAgIHZhciBvdmVyd3JpdGUgPSAkKCcjb3ZlcndyaXRlJywgZG9jdW1lbnRzX2Zvcm0pLnZhbCgpOworICAgICAgICAgICAgICAgICAgdmFyIHRoZV9jb21tYW5kID0gIiI7CisgICAgICAgICAgICAgICAgICB2YXIgY29udGVudF90eXBlID0gIiI7CisgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRfdHlwZSA9ICQoJyNkb2N1bWVudC10eXBlJywgZG9jdW1lbnRzX2Zvcm0pLnZhbCgpOworICAgICAgICAgICAgICAgICAgdmFyIGRvaW5nRmlsZVVwbG9hZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgLy9Cb3RoIEpTT04gYW5kIFdpemFyZCB1c2UgdGhlIHNhbWUgcGF0aHdheSBmb3Igc3VibWlzc2lvbgorICAgICAgICAgICAgICAgICAgLy9OZXcgZW50cmllcyBwcmltYXJpbHkgbmVlZCB0byBmaWxsIHRoZV9jb21tYW5kIGFuZCBzZXQgdGhlIGNvbnRlbnRfdHlwZQorICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50X3R5cGUgPT0gImpzb24iIHx8IGRvY3VtZW50X3R5cGUgPT0gIndpemFyZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBKU09OIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgdGhlX2NvbW1hbmQgPSAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJyJhZGQiOnsgImRvYyI6JyArIHRoZV9kb2N1bWVudCArICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAnImJvb3N0IjonICsgYm9vc3QgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJyJvdmVyd3JpdGUiOicgKyBvdmVyd3JpdGUgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJyJjb21taXRXaXRoaW4iOicgKyBjb21taXRfd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICArICJ9fSI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRfdHlwZSA9PSAiY3N2IikgeworICAgICAgICAgICAgICAgICAgICB0aGVfY29tbWFuZCA9IHRoZV9kb2N1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfdXJsICs9ICImY29tbWl0V2l0aGluPSIgKyBjb21taXRfd2l0aGluICsgIiZvdmVyd3JpdGU9IiArIG92ZXJ3cml0ZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2NzdiI7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50X3R5cGUgPT0gInhtbCIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhlX2NvbW1hbmQgPSAnPGFkZCBjb21taXRXaXRoaW49IicgKyBjb21taXRfd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICArICciIG92ZXJ3cml0ZT0iJyArIG92ZXJ3cml0ZSArICciJworICAgICAgICAgICAgICAgICAgICAgICAgKyAiPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlX2RvY3VtZW50ICsgIjwvYWRkPiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L3htbCI7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50X3R5cGUgPT0gInVwbG9hZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9pbmdGaWxlVXBsb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRfdHlwZSA9PSAic29sciIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9ndWVzcyBjb250ZW50X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgdGhlX2NvbW1hbmQgPSB0aGVfZG9jdW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGVfZG9jdW1lbnQuaW5kZXhPZigiPCIpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAvL1hNTAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L3htbCI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhlX2RvY3VtZW50LmluZGV4T2YoInsiKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy9KU09OCisgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iOworICAgICAgICAgICAgICAgICAgICB9IC8vVE9ETzogZG8gd2UgbmVlZCB0byBoYW5kbGUgb3RoZXJzPworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy9Ib3cgdG8gaGFuZGxlIG90aGVyPworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvL0hhbmRsZSB0aGUgc3VibWlzc2lvbiBvZiB0aGUgZm9ybSBpbiB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgbm90IHVwbG9hZGluZyBhIGZpbGUKKyAgICAgICAgICAgICAgICAgIGlmIChkb2luZ0ZpbGVVcGxvYWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgJC5hamF4KAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGRvY3VtZW50X3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBjb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoZV9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiByZXNwb25zZV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJiZWZvcmVTZW5kOiBWYWxzOiAiICsgZG9jdW1lbnRfdXJsICsgIiBjb250ZW50LXR5cGU6ICIgKyBkb2N1bWVudF90eXBlICsgIiB0aGUgY21kOiAiICsgdGhlX2NvbW1hbmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhocikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJzdWNjZXNzOiAgIiArIHJlc3BvbnNlICsgIiBzdGF0dXM6ICIgKyB0ZXh0X3N0YXR1cyArICIgeGhyOiAiICsgeGhyLnJlc3BvbnNlVGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sKCc8ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+U3RhdHVzPC9zcGFuPjogJyArIHRleHRfc3RhdHVzICsgJzwvZGl2PicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGRpdj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlJlc3BvbnNlOjwvc3Bhbj4nICsgJzxwcmUgY2xhc3M9InN5bnRheCBsYW5ndWFnZS1qc29uIj48Y29kZT4nICsgY29udGVudF9nZW5lcmF0b3JbJ2pzb24nXSh4aHIucmVzcG9uc2VUZXh0KSArICI8L2NvZGU+PC9wcmU+PC9kaXY+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnQuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhociwgdGV4dF9zdGF0dXMsIGVycm9yX3Rocm93bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJlcnJvcjogIiArIHRleHRfc3RhdHVzICsgIiB0aHJvd246ICIgKyBlcnJvcl90aHJvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHRtbCgnPGRpdj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlN0YXR1czwvc3Bhbj46ICcgKyB0ZXh0X3N0YXR1cyArICc8L2Rpdj48ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RXJyb3I6PC9zcGFuPiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJycgKyBlcnJvcl90aHJvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPC9kaXY+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc8ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RXJyb3I8L3NwYW4+OicgKyAnPHByZSBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLWpzb24iPjxjb2RlPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZW50X2dlbmVyYXRvclsnanNvbiddKHhoci5yZXNwb25zZVRleHQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvY29kZT48L3ByZT48L2Rpdj4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudC5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoeGhyLCB0ZXh0X3N0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coImNvbXBsZXRlOiAiICsgdGV4dF9zdGF0dXMgKyAiIHhocjogIiArIHhoci5yZXNwb25zZVRleHQgKyAiIGRvYyB0eXBlOiAiICsgZG9jdW1lbnRfdHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KHRleHRfc3RhdHVzICsgIjogIiArIHhoci5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdsb2FkZXInICk7Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy91cGxvYWQgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRoZV9maWxlID0gJCgnI3RoZS1maWxlJywgZG9jdW1lbnRzX2Zvcm0pOworICAgICAgICAgICAgICAgICAgICB2YXIgZXJoX3BhcmFtcyA9ICQoJyNlcmgtcGFyYW1zJywgZG9jdW1lbnRzX2Zvcm0pLnZhbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJoX3BhcmFtcyAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChlcmhfcGFyYW1zLnN1YnN0cmluZygwLDEpICE9ICImIil7CisgICAgICAgICAgICAgICAgICAgICAgICBlcmhfcGFyYW1zID0gIiYiICsgZXJoX3BhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfdXJsID0gZG9jdW1lbnRfdXJsICsgZXJoX3BhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygidXBsb2FkaW5nIGZpbGUgdG86ICIgKyBkb2N1bWVudF91cmwpOworICAgICAgICAgICAgICAgICAgICB0aGVfZmlsZS5hamF4ZmlsZXVwbG9hZCh7CisgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbic6IGRvY3VtZW50X3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAndmFsaWRhdGVfZXh0ZW5zaW9ucyc6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICd1cGxvYWRfbm93JzogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAncGFyYW1zJzogeworICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dHJhJzogJ2luZm8nCisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAnb25Db21wbGV0ZSc6IGZ1bmN0aW9uIChyZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5yZXBsYWNlKCc8cHJlIHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsiPicsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UucmVwbGFjZSgiPC9wcmU+IiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbXBsZXRlZCB1cGxvYWQ6ICcgKyByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZV9lbGVtZW50Lmh0bWwoJzxkaXY+PHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5SZXNwb25zZTo8L3NwYW4+JyArICc8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGU+JyArIGNvbnRlbnRfZ2VuZXJhdG9yWydqc29uJ10ocmVzcG9uc2UpICsgIjwvY29kZT48L3ByZT48L2Rpdj4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50LnNob3coKTsKKworICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgJ29uU3RhcnQnOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygic3RhcnRpbmcgZmlsZSB1cGxvYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKHdlV2FudGVkVG8pIHJldHVybiBmYWxzZTsgLy8gY2FuY2VscyB1cGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICdvbkNhbmNlbCc6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBmaWxlIHNlbGVjdGVkJyk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICAgIH0KKyAgICAgICkKKyAgICB9CispCisvKgorIFNhbXBsZSBkb2NzOgorIDxkb2MgYm9vc3Q9IjIuNSI+CisgPGZpZWxkIG5hbWU9ImlkIj4wNTk5MTwvZmllbGQ+CisgPGZpZWxkIG5hbWU9InRpdGxlIiBib29zdD0iMi4wIj5CcmlkZ2V3YXRlcjwvZmllbGQ+CisgPC9kb2M+CisKKyB7ImlkIjoiZm9vIiwidGl0bGUiOiJibGFoIn0KKworICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvZmlsZS5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL2ZpbGUuanMKaW5kZXggYTFmZjg3Ny4uOTVkMjAxZiAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL2pzL3NjcmlwdHMvZmlsZS5qcworKysgYi9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9maWxlLmpzCkBAIC0yMiwzNCArMjIsNTEgQEAKICAgZnVuY3Rpb24oIGNvbnRleHQgKQogICB7CiAgICAgdmFyIGNvcmVfYmFzZXBhdGggPSB0aGlzLmFjdGl2ZV9jb3JlLmF0dHIoICdkYXRhLWJhc2VwYXRoJyApOwotCXZhciBmaWxldHlwZSA9IGNvbnRleHQucGFyYW1zLnNwbGF0WzFdOyAvLyBlaXRoZXIgc2NoZW1hIG9yIGNvbmZpZwkKLQl2YXIgZmlsZW5hbWUgPSB0aGlzLmFjdGl2ZV9jb3JlLmF0dHIoIGZpbGV0eXBlICk7CisgICAgdmFyIGNvbnRlbnRfZWxlbWVudCA9ICQoICcjY29udGVudCcgKTsKIAotICAgICQuYWpheAorICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyBjb3JlX2Jhc2VwYXRoICsgJy9hZG1pbi9maWxlJworICAgICAgICAgICAgKyAnP2ZpbGU9JyArIHRoaXMuYWN0aXZlX2NvcmUuYXR0ciggY29udGV4dC5wYXJhbXMuc3BsYXRbMV0gKQorICAgICAgICAgICAgKyAnJmNvbnRlbnRUeXBlPXRleHQveG1sO2NoYXJzZXQ9dXRmLTgnOworCisgICAgJC5nZXQKICAgICAoCisgICAgICAndHBsL2ZpbGUuaHRtbCcsCisgICAgICBmdW5jdGlvbiggdGVtcGxhdGUgKQogICAgICAgewotICAgICAgICB1cmwgOiBjb3JlX2Jhc2VwYXRoICsgIi9hZG1pbi9maWxlP2ZpbGU9IiArIGZpbGVuYW1lICsgIiZjb250ZW50VHlwZT10ZXh0L3htbDtjaGFyc2V0PXV0Zi04IiwKLSAgICAgICAgZGF0YVR5cGUgOiAneG1sJywKLSAgICAgICAgY29udGV4dCA6ICQoICcjY29udGVudCcgKSwKLSAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCB4aHIsIHNldHRpbmdzICkKLSAgICAgICAgewotICAgICAgICAgIHRoaXMKLSAgICAgICAgICAuaHRtbCggJzxkaXYgY2xhc3M9ImxvYWRlciI+TG9hZGluZyAuLi48L2Rpdj4nICk7Ci0gICAgICAgIH0sCi0gICAgICAgIGNvbXBsZXRlIDogZnVuY3Rpb24oIHhociwgdGV4dF9zdGF0dXMgKQotICAgICAgICB7Ci0gICAgICAgICAgdmFyIGNvZGUgPSAkKAotICAgICAgICAgICAgJzxwcmUgY2xhc3M9InN5bnRheCBsYW5ndWFnZS14bWwiPjxjb2RlPicgKwotICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dC5lc2MoKSArCi0gICAgICAgICAgICAnPC9jb2RlPjwvcHJlPicKLSAgICAgICAgICApOwotICAgICAgICAgIHRoaXMuaHRtbCggY29kZSApOworICAgICAgICBjb250ZW50X2VsZW1lbnQKKyAgICAgICAgICAuaHRtbCggdGVtcGxhdGUgKTsKIAotICAgICAgICAgIGlmKCAnc3VjY2VzcycgPT09IHRleHRfc3RhdHVzICkKKyAgICAgICAgJCggJyN1cmwnLCBjb250ZW50X2VsZW1lbnQgKQorICAgICAgICAgIC50ZXh0KCB1cmwgKQorICAgICAgICAgIC5hdHRyKCAnaHJlZicsIHVybCApOworCisgICAgICAgICQuYWpheAorICAgICAgICAoCiAgICAgICAgICAgewotICAgICAgICAgICAgaGxqcy5oaWdobGlnaHRCbG9jayggY29kZS5nZXQoMCkgKTsKKyAgICAgICAgICAgIHVybCA6IHVybCwKKyAgICAgICAgICAgIGRhdGFUeXBlIDogJ3htbCcsCisgICAgICAgICAgICBjb250ZXh0IDogJCggJyNyZXNwb25zZScgLGNvbnRlbnRfZWxlbWVudCApLAorICAgICAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCB4aHIsIHNldHRpbmdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhpcworICAgICAgICAgICAgICAuaHRtbCggJzxkaXYgY2xhc3M9ImxvYWRlciI+TG9hZGluZyAuLi48L2Rpdj4nICk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgY29tcGxldGUgOiBmdW5jdGlvbiggeGhyLCB0ZXh0X3N0YXR1cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHZhciBjb2RlID0gJCgKKyAgICAgICAgICAgICAgICAnPHByZSBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLXhtbCI+PGNvZGU+JyArCisgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dC5lc2MoKSArCisgICAgICAgICAgICAgICAgJzwvY29kZT48L3ByZT4nCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgIHRoaXMuaHRtbCggY29kZSApOworCisgICAgICAgICAgICAgIGlmKCAnc3VjY2VzcycgPT09IHRleHRfc3RhdHVzICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0QmxvY2soIGNvZGUuZ2V0KDApICk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgKTsKICAgICAgIH0KICAgICApOwogICB9CmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvanMvc2NyaXB0cy9xdWVyeS5qcyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL3F1ZXJ5LmpzCmluZGV4IDNkN2JjYmEuLjQxN2ZlZjkgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL3F1ZXJ5LmpzCisrKyBiL3NvbHIvd2ViYXBwL3dlYi9qcy9zY3JpcHRzL3F1ZXJ5LmpzCkBAIC0xMDYsNiArMTA2LDM5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgKTsKIAorICAgICAgICAkKCAnLm11bHRpcGxlIGEnLCBxdWVyeV9mb3JtICkKKyAgICAgICAgICAuZGllKCAnY2xpY2snICkKKyAgICAgICAgICAubGl2ZQorICAgICAgICAgICgKKyAgICAgICAgICAgICdjbGljaycsCisgICAgICAgICAgICBmdW5jdGlvbiggZXZlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YXIgc2VsZiA9ICQoIHRoaXMgKTsKKyAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbGYuY2xvc2VzdCggJy5yb3cnICk7CisgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNsb3Nlc3QoICcubXVsdGlwbGUnICk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2YXIgYWRkID0gcGFyc2VJbnQoIHNlbGYuZGF0YSggJ2FjdGlvbicgKSwgMTAgKTsKKyAgICAgICAgICAgICAgaWYoIGFkZCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmV3X3JvdyA9IHJvdy5jbG9uZSgpOworICAgICAgICAgICAgICAgIG5ld19yb3cuZmluZCggJ2lucHV0JyApLnZhbCggJycgKTsKKyAgICAgICAgICAgICAgICByb3cuYWZ0ZXIoIG5ld19yb3cgKTsKKyAgICAgICAgICAgICAgICByb3cubmV4dCgpLmZpbmQoICdpbnB1dCcgKS5mb2N1cygpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYoIDEgPT09ICQoICcucm93JywgY29udGFpbmVyICkuc2l6ZSgpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvdy5maW5kKCAnaW5wdXQnICkudmFsKCAnJyApLmZvY3VzKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm93LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCAnaW5wdXQ6bGFzdCcgKS5mb2N1cygpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICkKKwogICAgICAgICBxdWVyeV9mb3JtCiAgICAgICAgICAgLmRpZSggJ3N1Ym1pdCcgKQogICAgICAgICAgIC5saXZlCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvdHBsL2RhdGFpbXBvcnQuaHRtbCBiL3NvbHIvd2ViYXBwL3dlYi90cGwvZGF0YWltcG9ydC5odG1sCmluZGV4IDE3ZjNlMWQuLjAzYjJkM2YgMTAwNjQ0Ci0tLSBhL3NvbHIvd2ViYXBwL3dlYi90cGwvZGF0YWltcG9ydC5odG1sCisrKyBiL3NvbHIvd2ViYXBwL3dlYi90cGwvZGF0YWltcG9ydC5odG1sCkBAIC0xMzMsMTIgKzEzMywxMiBAQAogICAgICAgPC9sYWJlbD4KIAogICAgICAgPGxhYmVsIGZvcj0iY2xlYW4iIGNsYXNzPSJjaGVja2JveCI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2xlYW4iIGlkPSJjbGVhbiIgdmFsdWU9InRydWUiPgorICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNsZWFuIiBpZD0iY2xlYW4iIHZhbHVlPSJ0cnVlIiBjaGVja2VkPSJjaGVja2VkIj4KICAgICAgICAgPGEgcmVsPSJoZWxwIj5DbGVhbjwvYT4KICAgICAgIDwvbGFiZWw+CiAKICAgICAgIDxsYWJlbCBmb3I9ImNvbW1pdCIgY2xhc3M9ImNoZWNrYm94Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjb21taXQiIGlkPSJjb21taXQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjb21taXQiIGlkPSJjb21taXQiIHZhbHVlPSJ0cnVlIiBjaGVja2VkPSJjaGVja2VkIj4KICAgICAgICAgPGEgcmVsPSJoZWxwIj5Db21taXQ8L2E+CiAgICAgICA8L2xhYmVsPgogCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvdHBsL2RvY3VtZW50cy5odG1sIGIvc29sci93ZWJhcHAvd2ViL3RwbC9kb2N1bWVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDk1M2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc29sci93ZWJhcHAvd2ViL3RwbC9kb2N1bWVudHMuaHRtbApAQCAtMCwwICsxLDEwNyBAQAorPCEtLQorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGRpdiBpZD0iZG9jdW1lbnRzIiBjbGFzcz0iY2xlYXJmaXgiPgorICA8ZGl2IGlkPSJmb3JtIj4KKyAgICA8Zm9ybSBhY3Rpb249IiMiIG1ldGhvZD0icG9zdCI+CisgICAgICA8bGFiZWwgZm9yPSJxdCI+CisgICAgICAgIDxhIHJlbD0iaGVscCI+UmVxdWVzdC1IYW5kbGVyIChxdCk8L2E+CisgICAgICA8L2xhYmVsPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdCIgdmFsdWU9Ii91cGRhdGUiIHRpdGxlPSJSZXF1ZXN0IGhhbmRsZXIgaW4gc29scmNvbmZpZy54bWwuIj4KKyAgICAgIDwhLS0gVE9ETzogQWRkIHN1cHBvcnQgZm9yIHVwbG9hZGluZyBkb2NzIGFuZCBhIGRvYyB3aXphcmQgLS0+CisgICAgICA8bGFiZWwgZm9yPSJkb2N1bWVudC10eXBlIj4KKyAgICAgICAgPGEgcmVsPSJoZWxwIj5Eb2N1bWVudCBUeXBlPC9hPgorICAgICAgPC9sYWJlbD4KKworICAgICAgPGRpdj48c2VsZWN0IG5hbWU9ImRvY3VtZW50LXR5cGUiIGlkPSJkb2N1bWVudC10eXBlIiB0aXRsZT0iVGhlIHR5cGUgb2YgdGhlIGRvY3VtZW50IGZpZWxkIj4KKyAgICAgICAgPCEtLSBUT0RPOiBzdXBwb3J0IHRoZSBCdWlsZGVyIC0tPgorICAgICAgICA8b3B0aW9uIHZhbHVlPSJjc3YiPkNTVjwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uIHZhbHVlPSJ3aXphcmQiPkRvY3VtZW50IEJ1aWxkZXI8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0idXBsb2FkIj5GaWxlIFVwbG9hZDwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPSJ0cnVlIiB2YWx1ZT0ianNvbiI+SlNPTjwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uIHZhbHVlPSJzb2xyIj5Tb2xyIENvbW1hbmQgKHJhdyBYTUwgb3IgSlNPTik8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0ieG1sIj5YTUw8L29wdGlvbj4KKyAgICAgICAgPCEtLSBUT0RPOiBJZiBvdGhlciwgdGhlbiwgc2hvdyBhIHRleHQgYm94IC0tPgorICAgICAgICA8IS0tPG9wdGlvbj5PdGhlcjwvb3B0aW9uPi0tPgorICAgICAgPC9zZWxlY3Q+PC9kaXY+CisKKyAgICAgIDxkaXYgaWQ9ImRvY3VtZW50LWNvbnRhaW5lciI+CisgICAgICAgIDxkaXYgaWQ9IndpemFyZCI+CisgICAgICAgICAgPGRpdiBpZD0id2l6YXJkLWZpZWxkcyI+CisgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RmllbGQ8L3NwYW4+OiA8c2VsZWN0IGlkPSJ3aXotZmllbGQtc2VsZWN0IiBuYW1lPSJ3aXotZmllbGQtc2VsZWN0Ij48L3NlbGVjdD4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdj48c3BhbiBpZD0id2l6LWZpZWxkLWRhdGEiPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RmllbGQgRGF0YTwvc3Bhbj46PC9zcGFuPiA8dGV4dGFyZWEgaWQ9IndpemFyZC1kb2MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3aXphcmQtZG9jIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz0iMTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzPSI0MCI+RW50ZXIgeW91ciBmaWVsZCB0ZXh0IGhlcmUgYW5kIHRoZW4gY2xpY2sgIkFkZCBGaWVsZCIgdG8gYWRkIHRoZSBmaWVsZCB0byB0aGUgZG9jdW1lbnQuPC90ZXh0YXJlYT48L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2IGlkPSJ3aXphcmQtYWRkIj48YSBpZD0iYWRkLWZpZWxkLWhyZWYiIGhyZWY9IiMiPjxpbWcgYm9yZGVyPSIwIiBzcmM9Ii4vaW1nL2ljby9wbHVzLWJ1dHRvbi5wbmciLz5BZGQKKyAgICAgICAgICAgIEZpZWxkPC9hPjwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGxhYmVsIGZvcj0iZG9jdW1lbnQiPgorICAgICAgICAgIDxhIHJlbD0iaGVscCI+RG9jdW1lbnQocyk8L2E+CisgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJkb2N1bWVudCIgaWQ9ImRvY3VtZW50IiB0aXRsZT0iVGhlIERvY3VtZW50IiByb3dzPSIxMCIKKyAgICAgICAgICAgICAgICAgIGNvbHM9IjcwIj57ImlkIjoiY2hhbmdlLm1lIiwidGl0bGUiOiJjaGFuZ2UubWUifTwvdGV4dGFyZWE+CisKKyAgICAgICAgPGRpdiBpZD0iZmlsZS11cGxvYWQiPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0idGhlLWZpbGUiIG5hbWU9InRoZS1maWxlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgaWQ9ImFkdmFuY2VkIj4KKyAgICAgICAgPCEtLSBUT0RPOiBvbmx5IHNob3cgZm9yIEpTT04vWE1MLS0+CisgICAgICAgIDxkaXYgaWQ9ImF0dHJpYnMiPgorICAgICAgICAgIDxkaXYgaWQ9InVwbG9hZC1vbmx5Ij4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImVyaC1wYXJhbXMiPjwhLS0gVE9ETzogY2xlYW5lciB3YXkgdG8gZG8gdGhpcz8gLS0+CisgICAgICAgICAgICAgIDxhIHJlbD0iaGVscCI+RXh0cmFjdGluZyBSZXEuIEhhbmRsZXIgUGFyYW1zPC9hPgorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZXJoLXBhcmFtcyIgdmFsdWU9IiZsaXRlcmFsLmlkPWNoYW5nZS5tZSIKKyAgICAgICAgICAgICAgICAgICB0aXRsZT0iRXh0cmFjdGluZyBSZXF1ZXN0IEhhbmRsZXIgUGFyYW1ldGVycyIgc2l6ZT0iNTAiPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxkaXYgaWQ9ImdlbmVyYWwtYXR0cmlicyI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb21taXRXaXRoaW4iPgorICAgICAgICAgICAgICA8YSByZWw9ImhlbHAiPkNvbW1pdCBXaXRoaW48L2E+CisgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb21taXRXaXRoaW4iIHZhbHVlPSIxMDAwIiB0aXRsZT0iQ29tbWl0IFdpdGhpbiAobXMpIj4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9Im92ZXJ3cml0ZSI+CisgICAgICAgICAgICAgIDxhIHJlbD0iaGVscCI+T3ZlcndyaXRlPC9hPgorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ib3ZlcndyaXRlIiB2YWx1ZT0idHJ1ZSIgdGl0bGU9Ik92ZXJ3cml0ZSI+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPCEtLSBCb29zdCBpcyBqc29uIG9ubHksIHNpbmNlIHRoZSBYTUwgaGFzIGl0IGVtYmVkZGVkIC0tPgorICAgICAgICAgIDxkaXYgaWQ9Impzb24tb25seSI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJib29zdCI+CisgICAgICAgICAgICAgIDxhIHJlbD0iaGVscCI+Qm9vc3Q8L2E+CisgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJib29zdCIgdmFsdWU9IjEuMCIgdGl0bGU9IkRvY3VtZW50IEJvb3N0Ij4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGlkPSJzdWJtaXQiPlN1Ym1pdCBEb2N1bWVudDwvYnV0dG9uPgorICAgIDwvZm9ybT4KKyAgPC9kaXY+CisgIDxkaXYgaWQ9InJlc3VsdCI+CisgICAgPGRpdiBpZD0icmVzcG9uc2UiPgorICAgICAgPCEtLTxpZnJhbWUgc3JjPSJhYm91dDpibGFuayI+PC9pZnJhbWU+LS0+CisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvdHBsL2ZpbGUuaHRtbCBiL3NvbHIvd2ViYXBwL3dlYi90cGwvZmlsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1ZmEwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zb2xyL3dlYmFwcC93ZWIvdHBsL2ZpbGUuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9ImZpbGUiIGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgPGEgaWQ9InVybCIgY2xhc3M9ImFkZHJlc3MtYmFyIiBocmVmPSIjIj48L2E+CisKKyAgPGRpdiBpZD0icmVzcG9uc2UiPjwvZGl2PgorCis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb2xyL3dlYmFwcC93ZWIvdHBsL3F1ZXJ5Lmh0bWwgYi9zb2xyL3dlYmFwcC93ZWIvdHBsL3F1ZXJ5Lmh0bWwKaW5kZXggMWJjY2UxZi4uYmQwY2RiMCAxMDA2NDQKLS0tIGEvc29sci93ZWJhcHAvd2ViL3RwbC9xdWVyeS5odG1sCisrKyBiL3NvbHIvd2ViYXBwL3dlYi90cGwvcXVlcnkuaHRtbApAQCAtMzcsMTIgKzM3LDIwIEBACiAgICAgICAgIDxsYWJlbCBmb3I9ImZxIj4KICAgICAgICAgICA8YSByZWw9ImhlbHAiPmZxPC9hPgogICAgICAgICA8L2xhYmVsPgotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImZxIiBuYW1lPSJmcSIgY2xhc3M9Im11bHRpcGxlIiB0aXRsZT0iRmlsdGVyIHF1ZXJ5LiI+CisgICAgICAgIDxkaXYgY2xhc3M9Im11bHRpcGxlIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cgY2xlYXJmaXgiPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJmcSIgbmFtZT0iZnEiIHRpdGxlPSJGaWx0ZXIgcXVlcnkuIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgorICAgICAgICAgICAgICA8YSBjbGFzcz0icmVtIiBkYXRhLWFjdGlvbj0iMCI+PHNwYW4+Wy1dPC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPGEgY2xhc3M9ImFkZCIgZGF0YS1hY3Rpb249IjEiPjxzcGFuPlsrXTwvc3Bhbj48L2E+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CiAKICAgICAgICAgPGxhYmVsIGZvcj0ic29ydCI+CiAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5zb3J0PC9hPgogICAgICAgICA8L2xhYmVsPgotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNvcnQiIG5hbWU9InNvcnQiIGNsYXNzPSJtdWx0aXBsZSIgdGl0bGU9IlNvcnQgZmllbGQgb3IgZnVuY3Rpb24gd2l0aCBhc2N8ZGVzYy4iPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNvcnQiIG5hbWU9InNvcnQiIHRpdGxlPSJTb3J0IGZpZWxkIG9yIGZ1bmN0aW9uIHdpdGggYXNjfGRlc2MuIj4KIAogICAgICAgICA8bGFiZWwgZm9yPSJzdGFydCI+CiAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5zdGFydDwvYT4sCkBAIC03Miw4ICs4MCw4IEBACiAgICAgICAgICAgPGEgcmVsPSJoZWxwIj53dDwvYT4KICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgPHNlbGVjdCBuYW1lPSJ3dCIgaWQ9Ind0IiB0aXRsZT0iVGhlIHdyaXRlciB0eXBlIChyZXNwb25zZSBmb3JtYXQpLiI+Ci0gICAgICAgICAgPG9wdGlvbj54bWw8L29wdGlvbj4KICAgICAgICAgICA8b3B0aW9uPmpzb248L29wdGlvbj4KKyAgICAgICAgICA8b3B0aW9uPnhtbDwvb3B0aW9uPgogICAgICAgICAgIDxvcHRpb24+cHl0aG9uPC9vcHRpb24+CiAgICAgICAgICAgPG9wdGlvbj5ydWJ5PC9vcHRpb24+CiAgICAgICAgICAgPG9wdGlvbj5waHA8L29wdGlvbj4KQEAgLTM0MCw3ICszNDgsNyBAQAogCiAgIDxkaXYgaWQ9InJlc3VsdCI+CiAKLSAgICA8YSBpZD0idXJsIiBocmVmPSIjIj48L2E+CisgICAgPGEgaWQ9InVybCIgY2xhc3M9ImFkZHJlc3MtYmFyIiBocmVmPSIjIj48L2E+CiAKICAgICA8ZGl2IGlkPSJyZXNwb25zZSI+CiAK