UEsDBBQACAgIAJu2R0AAAAAAAAAAAAAAAAAUAAQATUVUQS1JTkYvTUFOSUZFU1QuTUb+ygAAjZNNT8MwDIbvlfofqknc1mgtX1LRDoB6QYAmhribzNsy2qQk7rTy63GXqWysQ1wiRfbz2o7fPIFWc3QUv6F1yugsSsQoDO5qPSswfsHPWlmc5RuUNXE412tljS5RUxY9pNM8TsRllz5tyndTKPkMJWaRsQuBslCVQ7GqtRHEddyNU3pRIHGpMdkawyD3OfEjfDVTAsvKPrBTvZWk1kDGnpIUr3x2WWGw6zr2/CEljUVha02qxJt3X2DtRx8PzsWVGA2GPj8MIo+0atpsRJWKFdjKGonOGXtE88OJdNTxHgbNOrQt21Mu/QGgArls86lH+FokA9Y5UN5rq1c95XZ+NbNFWMdTJRLMgODfpMcsVsYpMqxjm79YXpA6HuaChx4NuuXu2S4VifisoVBzhbzFfFMZS/EE5AcsTtppeMISvKltjLvsC2+HOMWy0wvXdXhfgHMToGUW8YLkxyM0pqa2wFDsjaFnrUHPDu6/LcyDTtr/0WRRwWbvwv6/nO3dutDT7n9275SGQRh8A1BLBwiwFb0sigEAALYDAABQSwMECgAACAAA7YwJP/pdOBi2DAAAtgwAAAwAAABydW5UZXN0cy54bWw8cHJvamVjdAogICAgbmFtZT0iU2ltUmVsIFRlc3RzIgogICAgYmFzZWRpcj0iLiIKICAgIGRlZmF1bHQ9InJ1blRlc3RzIj4KCiAgICA8cHJvcGVydHkKICAgICAgICBlbnZpcm9ubWVudD0iZW52Ii8+Cgk8IS0tCgkgICAgICAgIFRoaXMgcHJvcGVydHkgZmlsZSBuYW1lIGlzIGl0c2VsZiBhIHByb3BlcnR5LCBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbgoJICAgICAgICBvbiBvbmUgbWFjaGluZSB2ZXJzdXMgYW5vdGhlci4gV2UgZG8gaXQgdGhpcyB3YXksIGluc3RlYWQgb2YganVzdCBzcGVjaWZ5aW5nCgkgICAgICAgIC1wcm9wZXJ0eUZpbGUgb24gY29tbWFuZCBsaW5lLCBzbyB0aGF0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgY2FuIGJlICJuZXN0ZWQiCgkgICAgICAgIGluIG90aGVyIHByb3BlcnR5IHZhbHVlcyBhbmQgZXZhbHVhdGVkIGxhemlseS4KCSAgICAtLT4KCiAgICA8cHJvcGVydHkKICAgICAgICBuYW1lPSJhZ2dyUHJvcGVydHlGaWxlIgogICAgICAgIHZhbHVlPSJhZ2dyLnByb3BlcnRpZXMiLz4KCiAgICA8cHJvcGVydHkKICAgICAgICBmaWxlPSIke2FnZ3JQcm9wZXJ0eUZpbGV9Ii8+CgoJPCEtLSBCeSBkZWZhdWx0LCB3ZSdsbCBwdXQgdGVzdCBvdXRwdXQgZmlsZXMgaW4gInN0YWdpbmciIHNvIHRoZSBpbmRleC5odG1sIGZpbGUgICAtLT4KICAgIDxwcm9wZXJ0eQogICAgICAgIG5hbWU9Im91dHB1dERpcmVjdG9yeSIKICAgICAgICB2YWx1ZT0iJHtURVNUX1JFU1VMVFN9Ii8+CgogICAgPHRhcmdldAogICAgICAgIG5hbWU9InJ1blRlc3RzIj4KICAgICAgICA8ZWNobwogICAgICAgICAgICBtZXNzYWdlPSJDcmVhdGluZyBSZXBvcnRzIi8+CgogICAgICAgIDxlY2hvcHJvcGVydGllcy8+CgogICAgICAgIDxta2RpcgogICAgICAgICAgICBkaXI9IiR7b3V0cHV0RGlyZWN0b3J5fSIvPgoKICAgIAk8IS0tIE5PVEU6IHdlIHN0cm9uZ2x5IGFzc3VtZSAnb3V0cHV0RGlyZWN0b3J5JyBpcyBkZWRpY2F0ZWQgY29tcGxldGVseSBmb3Igb3VyIHVzZSEgLS0+CiAgICAgICAgPGRlbGV0ZT4KICAgICAgICAgICAgPGZpbGVzZXQKICAgICAgICAgICAgICAgIGRpcj0iJHtvdXRwdXREaXJlY3Rvcnl9Ij4KICAgICAgICAgICAgPC9maWxlc2V0PgogICAgICAgIDwvZGVsZXRlPgogICAgICAgPG1rZGlyCiAgICAgICAgICAgZGlyPSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIvPgoKICAgICAgICA8Y29weQogICAgICAgICAgICB0b2ZpbGU9IiR7b3V0cHV0RGlyZWN0b3J5fS9pbmRleC5odG1sIgogICAgICAgICAgICBmaWxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdGVtcGxhdGVGaWxlcy9pbmRleFBlbmRpbmcuaHRtbCIKICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIi8+CgogICAgICAgIDxnZW5lcmF0ZVJlcG9zaXRvcnlSZXBvcnRzCiAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iCiAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s9IiR7dGVzdFJlcG9EaXJlY3Rvcnl9IgogICAgICAgICAgICBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5PSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIKICAgICAgICAgICAgZmFpbHVyZXNvY2N1cnJlZD0iZmFpbHVyZXNvY2N1cnJlZCIvPgoKICAgICAgICA8Y29weQogICAgICAgICAgICB0b2ZpbGU9IiR7b3V0cHV0RGlyZWN0b3J5fS9pbmRleC5odG1sIgogICAgICAgICAgICBmaWxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdGVtcGxhdGVGaWxlcy9pbmRleG1haW5wcmVzaWduLmh0bWwiCiAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgoKICAgICAgICA8ZXhlYwogICAgICAgICAgICBleGVjdXRhYmxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdmVyaWZ5ZGlyLnNoIj4KICAgICAgICAgICAgPGFyZwogICAgICAgICAgICAgICAgdmFsdWU9IiR7dGVzdFJlcG9EaXJlY3Rvcnl9Ii8+CiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgIHZhbHVlPSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIvPgoJCiAgICAgICAgCTwhLS0gd2UnbGwgY2hlY2sgamFycyBvbmx5LCB0byBzYXZlIHRpbWUgLi4uIGFzc3VtZSBwYWNrLmd6IGZpbGVzIHdvdWxkIGJlIGNvcnJlY3QgdG9vICAKICAgICAgICAgICA8YXJnCiAgICAgICAgICAgICAgICB2YWx1ZT0iLipcKFwuamFyJFx8XC5qYXJcLnBhY2tcLmd6JFwpIi8+IC0tPgogICAgICAgIAkKICAgICAgICAJPCEtLSByZXN0cmljdGluZyB0byAnY29tbW9uJyBqdXN0IGZvciB0ZXN0aW5nIC4uLiBzbyBmaW5pc2hlcyByZWxhdGl2ZWx5IHF1aWNrbHkgCiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgIHZhbHVlPSIuKmNvbW1vbi4qXC5qYXIkIi8+CiAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgICAgPGFyZwogICAgICAgICAgICAgICAgIHZhbHVlPSIuKlwuamFyJCIvPgogICAgICAgIDwvZXhlYz4KCiAgICAgICAgPGNvcHkKICAgICAgICAgICAgdG9maWxlPSIke291dHB1dERpcmVjdG9yeX0vaW5kZXguaHRtbCIKICAgICAgICAgICAgZmlsZT0iJHtCVUlMRF9URVNUU19ESVJ9L3RlbXBsYXRlRmlsZXMvaW5kZXhtYWluLmh0bWwiCiAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgoKCQk8IS0tCiAgICAgICAgPG1rZGlyCiAgICAgICAgICAgIGRpcj0iJHtvdXRwdXREaXJlY3Rvcnl9L291dHB1dC1lY2xpcHNlIi8+CiAgICAgICAgPHRlc3RMYXlvdXR0YXNrCiAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iCiAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS91cGRhdGVzLzMuN21pbGVzdG9uZXMvUy0zLjdSQzMtSTIwMTEwNTI2MTcwOC8iCiAgICAgICAgICAgIG91dHB1dFJlc3VsdHNEaXJlY3Rvcnk9IiR7b3V0cHV0RGlyZWN0b3J5fS9vdXRwdXQtZWNsaXBzZSIKICAgICAgICAgICAgZmFpbHVyZXNvY2N1cnJlZD0iZmFpbHVyZXNvY2N1cnJlZCIvPgotLT4KCgkJPCEtLSBUT0RPOiB1c2UgdG1wIG9uIHN0YWdpbmcgZGlyZWN0b3J5IHRvIGF2b2lkIGZpbGxpbmcgdXAgL3RtcD8gLS0+CiAgICAgICAgPGRlbGV0ZQogICAgICAgICAgICBkaXI9Ii90bXAvdGVtcFdvcmtpbmdMb2NhdGlvbiIvPgoKCQk8IS0tIGN1cnJlbnRseSwgd2UgbmV2ZXIgImZhaWwiIC4uLiBidXQsIHdpbGwgaW4gZnV0dXJlIC0tPgogICAgICAgIDxmYWlsCiAgICAgICAgICAgIGlmPSJmYWlsdXJlc29jY3VycmVkIi8+CiAgICA8L3RhcmdldD4KPC9wcm9qZWN0PlBLAwQKAAAIAADtjAk/W0OBfGIGAABiBgAADAAAAHZlcmlmeWRpci5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0ICd2ZXJpZnkuc2gnIGlzIGluIHNhbWUgZGlyZWN0b3J5IGFzICd2ZXJpZnlkaXIuc2gnIAojIHNvIHRoZSBjb3JyZWN0ICd2ZXJpZnkuc2gnIGZpbGUgY29tbWFuZCBjYW4gYmUgdXNlZDsgdGhlIG9uZSB0aGF0ICJnb2VzIHdpdGgiIHRoZSB2ZXJpZnlkaXIuc2ggc2NyaXB0IAojIHdlIGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiBTbywgd2Ugc3RvcmUgdGhlIHBhdGggdG8gdmVyaWZ5ZGlyLnNoIGluIEVYRUNESVIuICAKRVhFQ0RJUj0kezAlLyp9CgplY2hvICIxOiAiICQxCmVjaG8gIjI6ICIgJDIKZWNobyAiMzogIiAkMwoKaWYgWyAteiAkMSBdCnRoZW4KICAgIGxvYz0uLwplbHNlCiAgICBsb2M9JHsxfQpmaQoKaWYgWyAteiAkMiBdCnRoZW4KICAgIGV4cG9ydCBWRVJJRllPVVRESVI9IiR7SE9NRX0iL3ZlcmlmeWRpcm91dHB1dAplbHNlCiAgICBleHBvcnQgVkVSSUZZT1VURElSPSIkezJ9Ii92ZXJpZnlkaXJvdXRwdXQKZmkKCmlmIFsgLXogJDMgXQp0aGVuCiAgICBwYXQ9Ii4qXChcLmphciRcfFwuamFyXC5wYWNrXC5neiRcKSIKZWxzZQogICAgcGF0PSIkezN9IgpmaQoKIyBWRVJJRllPVVRESVIgaXMgdXNlZCBpbiAndmVyaWZ5LnNoJyBhbmQgbXVzdCBiZSBjbGVhbiBiZWZvcmUKIyBiZWdpbm5pbmcgdGhlIG92ZXJhbGwgY2hlY2sKCiMgbWFrZSwgaW4gY2FzZSBkb2Vzbid0IGV4aXN0Cm1rZGlyIC1wICIke1ZFUklGWU9VVERJUn0iCgojIGV2ZW4gdGhvdWdoIHdlIGp1c3Qgc2V0IGl0IGFib3ZlLCBpbmNsdWRlIHRoZSBpZiBjaGVjayAKIyBoZXJlIHRvIGdhdXJkIGFnYWluc3QgZnV0dXJlIGVycm9ycywgc2luY2UgaWYgJ3ZlcmZpeW91dGRpcicgaXMgCiMgbm90IGRlZmluZWQsIHRoZSByZW1vdmUgd291bGQgYmUgZm9yIHRoZSByb290IGRpcmVjdG9yeSEhIAppZiBbWyAtbiAiJHtWRVJJRllPVVRESVJ9IiBdXQp0aGVuIAogICAgICAgcm0gLWZyICIke1ZFUklGWU9VVERJUn0iLyoKZmkKCmVjaG8gIiAgIHZlcmlmeSBkaXJlY3Rvcnk6ICR7bG9jfSIKZWNobyAiICAgZm9yIGZpbGUgcGF0dGVybjogJHtwYXR9IgplY2hvICIgICByZXN1bHQgbGlzdCBmaWxlcyB3aWxsIGJlIGluICIgIiR7VkVSSUZZT1VURElSfSIgIihhbmQgYW55IGV4aXN0aW5nIGZpbGVzIHRoZXJlIHJlbW92ZWQpLiIKCmZpbmQgIiR7bG9jfSIgLXJlZ2V4ICIke3BhdH0iIC1leGVjICR7RVhFQ0RJUn0vdmVyaWZ5LnNoICd7fScgXDsKCiMgaWYgY2VydGFpbiBmaWxlcyB3ZXJlIG5vdCBjcmVhdGVkIGR1cmluZyBzaWduaW5nIGNoZWNrcywgY3JlYXRlIGEgInBsYWluIiBvbmUgYXQgZXhwZWN0ZWQgbG9jYXRpb24sIAojIHRvIGF2b2lkIDQwNCBlcnJvcnMgZnJvbSBzdGFuZGFyZCBpbmRleC5odG1sLiBGb3IgZXhhbXBsZSwgYWxsIGphcnMgYXJlIHNpZ25lZCwgdGhlcmUgd2lsbCBiZSBubyB1bnNpZ25lZC50eHQgZmlsZXMuCmlmIFsgISAtZSAiJHtWRVJJRllPVVRESVJ9Ii91bnNpZ25lZC50eHQgXQp0aGVuCiAgICBlY2hvICAiVGhlcmUgd2VyZSBubyB1bnNpZ25lZCBqYXJzIGluIHRoZSBkaXJlY3RvcmllcyBjaGVja2VkLiAiID4gIiR7VkVSSUZZT1VURElSfSIvdW5zaWduZWQudHh0CmZpIAoKUEsDBAoAAAgAAO2MCT90D6eYVwUAAFcFAAAWAAAAY2xlYW51cEJ1aWxkUmVzdWx0cy5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgc21hbGwgdXRpbGl0eSB0byByZW1vdmUgb2xkICh0ZW1wb3JhcnkpIGJ1aWxkcyBmcm9tIHdvcmsgYXJlYQoKIyBmaW5kcyBmaWxlIG9uIHVzZXJzIHBhdGgsIGJlZm9yZSBjdXJyZW50IGRpcmVjdG9yeQojIGhlbmNlLCBub24tcHJvZHVjdGlvbiB1c2VycyBjYW4gc2V0IHRoZWlyIG93biB2YWx1ZXMgZm9yIHRlc3QgbWFjaGluZXMKc291cmNlIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZQoKIyByZW1vdmUgYXJ0aWZhY3RzIG92ZXIgbiBkYXlzIG9sZAojICh3aGVyZSBob3VycyA9IDI0ICsgKG4gKiAyNCksIGJhc2ljYWxseSwgc28gdGhhdAojIGV2ZW4gbj0wIG1lYW5zICIxIGRheSIpCgojIHNldCBhdCAxMCBkYXlzLCB1bmRlciBhc3N1bXB0aW9uIHRoYXQgYmVmb3JlIHRoYXQgdGltZSwKIyBhcnRpZmFjdHMgd2lsbCBiZSAic2F2ZWQiIGVsc2V3aGVyZSwgaWYgbmVlZGVkLgojIGlmIG1vcmUgY2xlYW51cCBpcyBuZWVkZWQsIHdlIHNob3VsZCB0YWtlIHRpbWUsIGFuZAojIGV4aXN0ZW5jZSBvZiBtb3JlIHJlY2VudCBidWlsZHMgaW50byBhY2NvdW50LCBzbyB3ZSBuZXZlcgojIGRlbGV0ZSB0aGUgbGFzdCBleGlzdGluZyBidWlsZCAoZXZlbiBpZiAib2xkIikuCgpuZGF5cz0xOwphcnRpZmFjdHNEaXI9JHtCVUlMRF9SRVNVTFRTfTsKCmVjaG87CmVjaG8gIiAgICBSZW1vdmluZyBhcnRpZmFjdCBkaXJlY3RvcmllcyBvbGRlciB0aGFuICR7bmRheXN9IGRheXMiOwplY2hvICIgICAgICAgIChmcm9tICR7YXJ0aWZhY3RzRGlyfSkiOwpiZWZvcmU9YGZpbmQgJHthcnRpZmFjdHNEaXJ9IC1taW5kZXB0aCAxIC1tYXhkZXB0aCAxIHwgd2MgLWxgOwplY2hvICIgICAgICAgICAgICBudW1iZXIgb2YgZGlyZWN0b3JpZXMgYmVmb3JlIGNsZWFuaW5nOiAke2JlZm9yZX0iOwoKIyBlbXB0eSBkaXJlY3RvcmllcyBvZnRlbiByZXN1bHQgZnJvbSAiYmFkIGJ1aWxkcyIuIFdlIHJlbW92ZSB0aG9zZSBubyBtYXR0ZXIgaG93IG9sZApmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMiAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybSAtZnIgJ3t9JyBcOwojIG5vdyByZW1vdmUgb2xkIG9uZXMKZmluZCAke2FydGlmYWN0c0Rpcn0gLW1pbmRlcHRoIDEgLW1heGRlcHRoIDEgLXR5cGUgZCAtY3RpbWUgKyRuZGF5cyAtZXhlY2RpciAke0JVSUxEX0hPTUV9JHtSRUxFTkdfVE9PTFN9L3JlbW92ZUlmLnNoICd7fScgXDsKCmFmdGVyPWBmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMSB8IHdjIC1sYDsKZWNobyAiICAgICAgICAgICAgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGFmdGVyIGNsZWFuaW5nOiAke2FmdGVyfSI7CmVjaG8KUEsDBAoAAAgAAJiLDD8VKl4B8AQAAPAEAAAWAAAAcnVuRWNsaXBzZUFudFJ1bm5lci5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgT24gcHJvZHVjdGlvbiBtYWNoaW5lLCBpdCBpcyBub3JtYWwgdG8gIm5vdCBmaW5kIiB0aGlzIGZpbGUgd2hlbiBydW5uaW5nLiAKIyBBbGwgdmFyaWFibGVzIHRoYXQgbWlnaHQgYmUgZGVmaW5lZCBpbiBpdCBoYXZlIGNvcnJlY3QgdmFsdWVzIHNldCBmb3IgdGhlIHByb2R1Y3Rpb24gCiMgbWFjaGluZS4gSXRzIHB1cnBvc2UgaXMgaWYvd2hlbiBydW5uaW5nIG9uIGEgdGVzdCBtYWNoaW5lLCB0aGUgdmFyaWFibGVzIGNhbiBiZSBvdmVyIHJpZGRlbgojIGVhc2lseSBpbiB0aGF0IG9uZSBmaWxlLCBhbmQgbGVhdmUgb3JpZ2luYWwgc2NyaXB0cyBhbG9uZS4gCnNvdXJjZSBhZ2dyX3Byb3BlcnRpZXMuc2hzb3VyY2UKCiMgVGhlc2UgZmlyc3QgZmV3IHZhcmlhYmxlcyBjb21tb25seSBuZWVkIHRvIG92ZXJyaWRkZW4gb24gdGVzdCBtYWNoaW5lcywgdGhleSAKIyBhcmUgdmVyeSBzcGVjaWZpYyBwZXIgbWFjaGluZS4gCiMgdGhlIHRvcCBkaXJlY3Rvcnkgb2YgYnVpbGQtcmVsYXRlZCBkaXJlY3RvcmllcwpleHBvcnQgQlVJTERfSE9NRT0ke0JVSUxEX0hPTUU6LS9zaGFyZWQvanVub30KZXhwb3J0IEpBVkFfSE9NRT0ke0pBVkFfSE9NRTotL3NoYXJlZC9vcmJpdC9hcHBzL2libS1qYXZhLWkzODYtNjB9CgojIFRoZXNlIHJlbWFpbmluZyB2YXJpYWJsZSBzaG91bGQgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbnQsIGFzIHRoZXkgCiMgYXJlIHJlbGF0aXZlbHkgY29uc3RhbnQsIG9yIGNvbXB1dGVkIGZyb20gb3RoZXJzLiAKZXhwb3J0IFJFTEVOR19URVNUUz0ke1JFTEVOR19URVNUUzotb3JnLmVjbGlwc2UuanVuby50ZXN0c30KZXhwb3J0IEpBVkFfRVhFQ19ESVI9JHtKQVZBX0VYRUNfRElSOi0ke0pBVkFfSE9NRX0vanJlL2Jpbn0KZXhwb3J0IEJVSUxEX1RFU1RTX0RJUj0ke0JVSUxEX1RFU1RTX0RJUjotJHtCVUlMRF9IT01FfS8ke1JFTEVOR19URVNUU319CmV4cG9ydCBFQ0xJUFNFX0hPTUVfVEVTVD0ke0VDTElQU0VfSE9NRV9URVNUOi0ke0JVSUxEX0hPTUV9L3Rlc3RJbnN0YW5jZX0KCiIke0VDTElQU0VfSE9NRV9URVNUfSIvZWNsaXBzZS9lY2xpcHNlIC1jb25zb2xlbG9nIC1kYXRhIC4vZWNsaXBzZVdvcmtzcGFjZSAtbm9zcGxhc2ggLS1sYXVuY2hlci5zdXBwcmVzc0Vycm9ycyAtdm0gIiR7SkFWQV9FWEVDX0RJUn0iIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgLWYgICR7QlVJTERfVEVTVFNfRElSfS9ydW5UZXN0cy54bWwgIiRAIgpQSwMECgAACAAAj7VHQJEWjaMyCwAAMgsAACoAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuY2xhc3PK/rq+AAAAMQB/BwACAQAkb3JnL2VjbGlwc2UvanVuby90ZXN0cy9UZXN0QWN0aXZhdG9yBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVBY3RpdmF0b3IBAA1QSV9QUk9WX1RFU1RTAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACwEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdAEAB2NvbnRleHQBACJMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7AQAMcGFja2FnZUFkbWluAQAsTG9yZy9vc2dpL3NlcnZpY2UvcGFja2FnZWFkbWluL1BhY2thZ2VBZG1pbjsBAA9wYWNrYWdlQWRtaW5SZWYBACVMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAOVEVTVF9EQVRBX1BBVEgBAAg8Y2xpbml0PgEAAygpVgEABENvZGUJAAEAFwwADgAPCQABABkMABAAEQgAGwEACHRlc3REYXRhCQABAB0MABIACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAiDAAgABQBAAR0aGlzAQAmTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvVGVzdEFjdGl2YXRvcjsBAApnZXRDb250ZXh0AQAkKClMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7CQABACgMAAwADQEACmdldExvZ0ZpbGUBABAoKUxqYXZhL2lvL0ZpbGU7BwAsAQArb3JnL2VjbGlwc2Uvb3NnaS9mcmFtZXdvcmsvbG9nL0ZyYW1ld29ya0xvZwoALgAwBwAvAQAPamF2YS9sYW5nL0NsYXNzDAAxADIBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsKADQANgcANQEAOm9yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL1NlcnZpY2VIZWxwZXIMADcAOAEACmdldFNlcnZpY2UBAEgoTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsLACsAOgwAOwAqAQAHZ2V0RmlsZQEAA2xvZwEALUxvcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9sb2cvRnJhbWV3b3JrTG9nOwEABXN0YXJ0AQAlKExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDspVgEACkV4Y2VwdGlvbnMHAEIBABNqYXZhL2xhbmcvRXhjZXB0aW9uBwBEAQAqb3JnL29zZ2kvc2VydmljZS9wYWNrYWdlYWRtaW4vUGFja2FnZUFkbWluCwBGAEgHAEcBACBvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dAwASQBKAQATZ2V0U2VydmljZVJlZmVyZW5jZQEAOShMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwsARgBMDAA3AE0BADkoTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOylMamF2YS9sYW5nL09iamVjdDsBAARzdG9wAQARZ2V0VGVzdERhdGFGb2xkZXILAEYAUQwAUgBTAQAJZ2V0QnVuZGxlAQAdKClMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZTsLAFUAVwcAVgEAGW9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGUMAFgAWQEACGdldEVudHJ5AQAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9uZXQvVVJMOwcAWwEADGphdmEvaW8vRmlsZQoAXQBfBwBeAQAkb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL0ZpbGVMb2NhdG9yDABgAGEBAAdyZXNvbHZlAQAeKExqYXZhL25ldC9VUkw7KUxqYXZhL25ldC9VUkw7CgBjAGUHAGQBAAxqYXZhL25ldC9VUkwMADsAMgoAWgBnDAAgAGgB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KioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0czsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJMOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nOwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwppbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwoKcHVibGljIGNsYXNzIFRlc3RBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgICAgICBQSV9QUk9WX1RFU1RTICAgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0IjsKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCAgICAgY29udGV4dDsKICAgIHByaXZhdGUgc3RhdGljIFBhY2thZ2VBZG1pbiAgICAgcGFja2FnZUFkbWluICAgID0gbnVsbDsKICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluUmVmID0gbnVsbDsKICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICAgICAgICAgICAgVEVTVF9EQVRBX1BBVEggID0gInRlc3REYXRhIjsgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAoKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewogICAgICAgIHJldHVybiBjb250ZXh0OwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gYSBmaWxlIGhhbmRsZSB0byB0aGUgZnJhbWV3b3JrIGxvZyBmaWxlLCBvciBudWxsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMb2dGaWxlKCkgewogICAgICAgIEZyYW1ld29ya0xvZyBsb2cgPSAoRnJhbWV3b3JrTG9nKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoY29udGV4dCwgRnJhbWV3b3JrTG9nLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgcmV0dXJuIGxvZyA9PSBudWxsID8gbnVsbCA6IGxvZy5nZXRGaWxlKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBUZXN0QWN0aXZhdG9yLmNvbnRleHQgPSBjb250ZXh0OwogICAgICAgIHBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICBwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgVGVzdEFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdERhdGFGb2xkZXIoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgVVJMIHVybCA9IGNvbnRleHQuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVGVzdEFjdGl2YXRvci5URVNUX0RBVEFfUEFUSCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0RmlsZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7CiAgICAgICAgaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBCdW5kbGVbXSBidW5kbGVzID0gcGFja2FnZUFkbWluLmdldEJ1bmRsZXMoc3ltYm9saWNOYW1lLCBudWxsKTsKICAgICAgICBpZiAoYnVuZGxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvL1JldHVybiB0aGUgZmlyc3QgYnVuZGxlIHRoYXQgaXMgbm90IGluc3RhbGxlZCBvciB1bmluc3RhbGxlZAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cgp9ClBLAwQKAAAIAACPtUdAWTaz/oATAACAEwAAMQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2suY2xhc3PK/rq+AAAAMQDQBwACAQArb3JnL2VjbGlwc2UvanVuby90ZXN0cy9SdW5BbGxSZXBvcnRzQW50VGFzawcABAEAGW9yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2sBABBkaXJlY3RvcnlUb0NoZWNrAQASTGphdmEvbGFuZy9TdHJpbmc7AQAOdGVtcFdvcmtpbmdEaXIBABZvdXRwdXRSZXN1bHRzRGlyZWN0b3J5AQAQZmFpbHVyZXNPY2N1cnJlZAEAAVoBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAA8MAAsADAkAAQARDAAJAAoBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAtTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2s7AQAHZXhlY3V0ZQEACkV4Y2VwdGlvbnMHABkBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbgcAGwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCAAdAQAHZmlsZTovLwoAGgAfDAALACABABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAIgwAIwAkAQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CgAaACYMACcAKAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAGgAqDAArACQBAAh0b1N0cmluZwcALQEALG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nCgAsAA8KACwAMAwAMQAgAQAQc2V0UmVwb1VSTFRvVGVzdAoAAQAzDAA0ACQBABlnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5CgAsADYMADcAIAEAEnNldE91dHB1dERpcmVjdG9yeQoALAA5DAA6ADsBABN0ZXN0VmVyc2lvblVuaXFuZXNzAQADKClaCgABAD0MAD4APwEAE3NldEZhaWx1cmVzT2NjdXJyZWQBAAQoWilWBwBBAQAqb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyCgBAAA8KAEAAMAoAQAA2CgBAAEYMAEcAOwEAEHRlc3RGZWF0dXJlTmFtZXMKAEAASQwASgA7AQAPdGVzdEJ1bmRsZU5hbWVzBwBMAQAwb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyCgBLAA8KAEsAMAoASwA2CgBLAFEMAFIAOwEAEXRlc3RQcm92aWRlck5hbWVzBwBUAQA6b3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcgoAUwAPCgBTADAKAFMANgoAUwBZDABaADsBABN0ZXN0RGlzcGxheWFibGVEYXRhBwBcAQAvb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlTmFtZUxlbmd0aHMKAFsADwoAWwAwCgBbADYKAFsAYQwAYgBjAQAadGVzdEZlYXR1cmVEaXJlY3RvcnlMZW5ndGgBAAMoKUkKABgAZQwACwBmAQAYKExqYXZhL2xhbmcvVGhyb3dhYmxlOylWBwBoAQAib3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0VTVGVzdAoAZwAPCgBnAGsMAGwAIAEAE3NldERpcmVjdG9yeVRvQ2hlY2sKAAEAbgwAbwAkAQARZ2V0VGVtcFdvcmtpbmdEaXIKAGcAcQwAcgAgAQARc2V0VGVtcFdvcmtpbmdEaXIKAGcANgoAZwB1DAB2ADsBABF0ZXN0RVNTZXR0aW5nUnVsZQcAeAEAJG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdAoAdwAPCgB3AGsKAHcAcQoAdwA2CgB3AH4MAH8AOwEAE3Rlc3RCUkVFU2V0dGluZ1J1bGUHAIEBACdvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3QKAIAADwoAgABrCgCAADYKAIAAhgwAhwA7AQAOdGVzdEJ1bmRsZVBhY2sHAIkBACdvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3QKAIgADwoAiABrCgCIADYKAIgAjgwAjwA7AQAUdGVzdFZlcnNpb25zUGF0dGVybnMHAJEBACpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QKAJAADwoAkABrCgCQAHEKAJAANgoAkACXDACYADsBAAp0ZXN0TGF5b3V0BwCaAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbgcAnAEAM29yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgcAngEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcAoAEAE2phdmEvaW8vSU9FeGNlcHRpb24BAApyZXBvVG9UZXN0AQAPdW5pcXVlbmVzc0NoZWNrAQATZmVhdHVyZU5hbWVGYWlsdXJlcwEAEmJ1bmRsZU5hbWVGYWlsdXJlcwEAFHByb3ZpZGVyTmFtZXNGYWlsdXJlAQAZbGljZW5zZUNvbnNpc3RlbmN5RmFpbHVyZQEAEXVuaXF1ZW5lc3NDaGVja2VyAQAuTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nOwEAB2l1TmFtZXMBACxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyOwEAE3Byb3ZpZGVyTmFtZUNoZWNrZXIBADJMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyOwEADmxpY2Vuc2VDaGVja2VyAQA8TG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXI7AQASZmVhdHVyZU5hbWVMZW5ndGhzAQAxTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzOwEAAWUBADBMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbjsBADVMb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwEAHUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247AQAGZXNUZXN0AQAkTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9FU1Rlc3Q7AQAKZXNGYWlsdXJlcwEACGJyZWVUZXN0AQAmTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdDsBAAxicmVlRmFpbHVyZXMBAAhwYWNr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YWNrMjAwVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFycy5UZXN0TGF5b3V0VGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFycy5WZXJzaW9uVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLkZlYXR1cmVOYW1lTGVuZ3RoczsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuSVVOYW1lQ2hlY2tlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuUHJvdmlkZXJOYW1lQ2hlY2tlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVmVyc2lvbkNoZWNraW5nOwoKcHVibGljIGNsYXNzIFJ1bkFsbFJlcG9ydHNBbnRUYXNrIGV4dGVuZHMgVGFzayB7CgogICAgcHJpdmF0ZSBTdHJpbmcgIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICBwcml2YXRlIFN0cmluZyAgdGVtcFdvcmtpbmdEaXI7CiAgICBwcml2YXRlIFN0cmluZyAgb3V0cHV0UmVzdWx0c0RpcmVjdG9yeTsKICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsdXJlc09jY3VycmVkID0gZmFsc2U7CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKCiAgICAgICAgdHJ5IHsKCgogICAgICAgICAgICBTdHJpbmcgcmVwb1RvVGVzdCA9ICJmaWxlOi8vIiArIGdldERpcmVjdG9yeVRvQ2hlY2soKTsKCiAgICAgICAgICAgIGJvb2xlYW4gdW5pcXVlbmVzc0NoZWNrID0gZmFsc2U7CiAgICAgICAgICAgIGJvb2xlYW4gZmVhdHVyZU5hbWVGYWlsdXJlcyA9IGZhbHNlOwogICAgICAgICAgICBib29sZWFuIGJ1bmRsZU5hbWVGYWlsdXJlcyA9IGZhbHNlOwogICAgICAgICAgICBib29sZWFuIHByb3ZpZGVyTmFtZXNGYWlsdXJlID0gZmFsc2U7CiAgICAgICAgICAgIGJvb2xlYW4gbGljZW5zZUNvbnNpc3RlbmN5RmFpbHVyZSA9IGZhbHNlOwogICAgICAgICAgICB0cnkgewoKICAgICAgICAgICAgICAgIFZlcnNpb25DaGVja2luZyB1bmlxdWVuZXNzQ2hlY2tlciA9IG5ldyBWZXJzaW9uQ2hlY2tpbmcoKTsKICAgICAgICAgICAgICAgIHVuaXF1ZW5lc3NDaGVja2VyLnNldFJlcG9VUkxUb1Rlc3QocmVwb1RvVGVzdCk7CiAgICAgICAgICAgICAgICB1bmlxdWVuZXNzQ2hlY2tlci5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgICAgIHVuaXF1ZW5lc3NDaGVjayA9IHVuaXF1ZW5lc3NDaGVja2VyLnRlc3RWZXJzaW9uVW5pcW5lc3MoKTsKICAgICAgICAgICAgICAgIGlmICh1bmlxdWVuZXNzQ2hlY2spIHsKICAgICAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIElVTmFtZUNoZWNrZXIgaXVOYW1lcyA9IG5ldyBJVU5hbWVDaGVja2VyKCk7CiAgICAgICAgICAgICAgICBpdU5hbWVzLnNldFJlcG9VUkxUb1Rlc3QocmVwb1RvVGVzdCk7CiAgICAgICAgICAgICAgICBpdU5hbWVzLnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICAgICAgZmVhdHVyZU5hbWVGYWlsdXJlcyA9IGl1TmFtZXMudGVzdEZlYXR1cmVOYW1lcygpOwogICAgICAgICAgICAgICAgYnVuZGxlTmFtZUZhaWx1cmVzID0gaXVOYW1lcy50ZXN0QnVuZGxlTmFtZXMoKTsKCiAgICAgICAgICAgICAgICBQcm92aWRlck5hbWVDaGVja2VyIHByb3ZpZGVyTmFtZUNoZWNrZXIgPSBuZXcgUHJvdmlkZXJOYW1lQ2hlY2tlcigpOwogICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lQ2hlY2tlci5zZXRSZXBvVVJMVG9UZXN0KHJlcG9Ub1Rlc3QpOwogICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lQ2hlY2tlci5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZXNGYWlsdXJlID0gcHJvdmlkZXJOYW1lQ2hlY2tlci50ZXN0UHJvdmlkZXJOYW1lcygpOwoKICAgICAgICAgICAgICAgIEZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyIGxpY2Vuc2VDaGVja2VyID0gbmV3IEZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyKCk7CiAgICAgICAgICAgICAgICBsaWNlbnNlQ2hlY2tlci5zZXRSZXBvVVJMVG9UZXN0KHJlcG9Ub1Rlc3QpOwogICAgICAgICAgICAgICAgbGljZW5zZUNoZWNrZXIuc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgICAgICBsaWNlbnNlQ29uc2lzdGVuY3lGYWlsdXJlID0gbGljZW5zZUNoZWNrZXIudGVzdERpc3BsYXlhYmxlRGF0YSgpOwoKICAgICAgICAgICAgICAgIEZlYXR1cmVOYW1lTGVuZ3RocyBmZWF0dXJlTmFtZUxlbmd0aHMgPSBuZXcgRmVhdHVyZU5hbWVMZW5ndGhzKCk7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0UmVwb1VSTFRvVGVzdChyZXBvVG9UZXN0KTsKICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy50ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aCgpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmVhdHVyZU5hbWVGYWlsdXJlcyB8fCBidW5kbGVOYW1lRmFpbHVyZXMgfHwgcHJvdmlkZXJOYW1lc0ZhaWx1cmUgfHwgbGljZW5zZUNvbnNpc3RlbmN5RmFpbHVyZSkgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIEVTVGVzdCBlc1Rlc3QgPSBuZXcgRVNUZXN0KCk7CiAgICAgICAgICAgIGVzVGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIGVzVGVzdC5zZXRUZW1wV29ya2luZ0RpcihnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgZXNUZXN0LnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwoKICAgICAgICAgICAgYm9vbGVhbiBlc0ZhaWx1cmVzID0gZXNUZXN0LnRlc3RFU1NldHRpbmdSdWxlKCk7CgogICAgICAgICAgICBpZiAoZXNGYWlsdXJlcykgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQlJFRVRlc3QgYnJlZVRlc3QgPSBuZXcgQlJFRVRlc3QoKTsKICAgICAgICAgICAgYnJlZVRlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICBicmVlVGVzdC5zZXRUZW1wV29ya2luZ0RpcihnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgYnJlZVRlc3Quc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CgogICAgICAgICAgICBib29sZWFuIGJyZWVGYWlsdXJlcyA9IGJyZWVUZXN0LnRlc3RCUkVFU2V0dGluZ1J1bGUoKTsKCiAgICAgICAgICAgIGlmIChicmVlRmFpbHVyZXMpIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBQYWNrMjAwVGVzdCBwYWNrVGVzdCA9IG5ldyBQYWNrMjAwVGVzdCgpOwogICAgICAgICAgICBwYWNrVGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIHBhY2tUZXN0LnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICBib29sZWFuIHBhY2tGYWlsdXJlcyA9IHBhY2tUZXN0LnRlc3RCdW5kbGVQYWNrKCk7CiAgICAgICAgICAgIGlmIChwYWNrRmFpbHVyZXMpIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBWZXJzaW9uVGVzdCB2ZXJzaW9uVGVzdCA9IG5ldyBWZXJzaW9uVGVzdCgpOwogICAgICAgICAgICB2ZXJzaW9uVGVzdC5zZXREaXJlY3RvcnlUb0NoZWNrKGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIHZlcnNpb25UZXN0LnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICBib29sZWFuIHZlcnNpb25DaGVjayA9IHZlcnNpb25UZXN0LnRlc3RWZXJzaW9uc1BhdHRlcm5zKCk7CiAgICAgICAgICAgIGlmICh2ZXJzaW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBUZXN0TGF5b3V0VGVzdCB0ZXN0ID0gbmV3IFRlc3RMYXlvdXRUZXN0KCk7CiAgICAgICAgICAgIHRlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICB0ZXN0LnNldFRlbXBXb3JraW5nRGlyKGdldFRlbXBXb3JraW5nRGlyKCkpOwogICAgICAgICAgICB0ZXN0LnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICBib29sZWFuIGxheW91dEZhaWx1cmVzID0gdGVzdC50ZXN0TGF5b3V0KCk7CiAgICAgICAgICAgIGlmIChsYXlvdXRGYWlsdXJlcykgewogICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRUZW1wV29ya2luZ0RpcigpIHsKICAgICAgICByZXR1cm4gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0VGVtcFdvcmtpbmdEaXIoU3RyaW5nIHRlbXBXb3JraW5nRGlyKSB7CiAgICAgICAgdGhpcy50ZW1wV29ya2luZ0RpciA9IHRlbXBXb3JraW5nRGlyOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbHVyZXNPY2N1cnJlZCgpIHsKICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cnJlZDsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlc09jY3VycmVkKGJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCkgewogICAgICAgIHRoaXMuZmFpbHVyZXNPY2N1cnJlZCA9IGZhaWx1cmVzT2NjdXJyZWQ7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoU3RyaW5nIG91dHB1dFJlc3VsdHNEaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dFJlc3VsdHNEaXJlY3RvcnkgPSBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5OwogICAgfQoKfQpQSwMECgAACAAAj7VHQLY2AbJhAwAAYQMAADcAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QkQlJFRUZpbGVEYXRhLmNsYXNzyv66vgAAADEAKQcAAgEAMW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS9sYW5nL0NvbXBhcmFibGUBAAhmaWxlbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACWJyZWVWYWx1ZQEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUKAAMADgwACgAPAQADKClWCQABABEMAAcACAkAAQATDAAJAAgBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAzTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGE7AQAJY29tcGFyZVRvAQAVKExqYXZhL2xhbmcvT2JqZWN0OylJCgAbAB0HABwBABBqYXZhL2xhbmcvU3RyaW5nDAAYAB4BABUoTGphdmEvbGFuZy9TdHJpbmc7KUkBAAFvAQASTGphdmEvbGFuZy9PYmplY3Q7AQAGcmVzdWx0AQABSQEAClNvdXJjZUZpbGUBAA1CUkVFVGVzdC5qYXZhAQAMSW5uZXJDbGFzc2VzBwAnAQAkb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0JSRUVUZXN0AQAMQlJFRUZpbGVEYXRhACAAAQADAAEABQACAAAABwAIAAAAAAAJAAgAAAACAAEACgALAAEADAAAAFkAAgADAAAADyq3AA0qK7UAECostQASsQAAAAIAFAAAABIABAAAADIABAAzAAkANAAOADUAFQAAACAAAwAAAA8AFgAXAAAAAAAPAAcACAABAAAADwAJAAgAAgABABgAGQABAAwAAABuAAIAAwAAACQqtAASK8AAAbQAErYAGj0cmgASKrQAECvAAAG0ABC2ABo9HKwAAAACABQAAAASAAQAAAA5AA8AOgATADsAIgA9ABUAAAAgAAMAAAAkABYAFwAAAAAAJAAfACAAAQAPABUAIQAiAAIAAgAjAAAAAgAkACUAAAAKAAEAAQAmACgACFBLAwQKAAAIAACPtUdAiJ8LFygqAAAoKgAAKgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdC5jbGFzc8r+ur4AAAAxAcsHAAIBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QHAAQBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMBAA5vdXRwdXRGaWxlbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAxicmVlZGF0YS50eHQBAC5QUk9QRVJUWV9CVU5ETEVfUkVRVUlSRURfRVhFQ1VUSU9OX0VOVklST05NRU5UCAAMAQAjQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQBAApuYW1lUGFyc2VyAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlBwATAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgoAEgAVDAAWABABAAY8aW5pdD4JAAEAGAwADQAOAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlCgADABUBAAR0aGlzAQAmTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgoAAQAVCAAiAQAXL2hvbWUvZmlsZXMvdGVzdFNES1JlcG8KAAEAJAwAJQAmAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAoDAApACoBABN0ZXN0QlJFRVNldHRpbmdSdWxlAQADKClaCgAsAC4HAC0BABNqYXZhL2lvL0lPRXhjZXB0aW9uDAAvABABAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAKRXhjZXB0aW9ucwcANwEADGphdmEvaW8vRmlsZQoAAQA5DAA6ADsBABJnZXRCdW5kbGVEaXJlY3RvcnkBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoANgA9DAAWACYKAAEAPwwAQABBAQAPY2hlY2tCdW5kbGVCUkVFAQARKExqYXZhL2lvL0ZpbGU7KVoBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgoARwBJBwBIAQAQamF2YS9sYW5nL09iamVjdAwASgBLAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7CABNAQAVZXhjZXB0aW9ucy5wcm9wZXJ0aWVzCgBPAFEHAFABAA9qYXZhL2xhbmcvQ2xhc3MMAFIAUwEAE2dldFJlc291cmNlQXNTdHJlYW0BACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwcAVQEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgBUABUIAFgBAAAKAFQAWgwAWwBcAQAEbG9hZAEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVggAXgEADmJyZWVFeGNlcHRpb25zCgBUAGAMAGEAYgEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAGQAZgcAZQEAE2phdmEvaW8vSW5wdXRTdHJlYW0MAGcAEAEABWNsb3NlBwBpAQARamF2YS91dGlsL0hhc2hNYXAKAGgAFQcAbAEAE2phdmEvdXRpbC9BcnJheUxpc3QKAGsAFQcAbwEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAG4AFQoANgByDABzAHQBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoANgB2DAB3ADsBAAdnZXROYW1lCgABAHkMAHoAYgEADWdldEJ1bmRsZU5hbWUKAHwAfgcAfQEAEGphdmEvbGFuZy9TdHJpbmcMAH8AgAEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABAIIMAIMAhAEADmdldEJSRUVGcm9tSkFSAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwoAfACGDACHAIgBAAZsZW5ndGgBAAMoKUkKAAEAigwAiwBBAQAMY29udGFpbnNKYXZhCgABAI0MAI4AjwEAD2luY3JlbWVudENvdW50cwEAJChMamF2YS91dGlsL01hcDtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCRDACSAJMBABR0cmFja0ZhbHNlSW5jbHVzaW9ucwEAMyhMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCVDACWAJcBAA50cmFja09taXNzaW9ucwEAIShMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTspVgoAAQCZDACaAJsBAAtwcmludHJlcG9ydAEANShMamF2YS91dGlsL01hcDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0lJSSlWAQAOcHJvcGVydHlTdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABdicmVlRXhjZXB0aW9uUHJvcGVydGllcwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAxqYXZhV2l0aEJyZWUBAA9MamF2YS91dGlsL01hcDsBAA9ub25qYXZhV2l0aEJyZWUBABBMamF2YS91dGlsL0xpc3Q7AQAPamF2YVdpdGhvdXRCcmVlAQANbm9uSmF2YU5vQlJFRQEAAUkBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAB2NoZWNrZWQBAAFpAQAFY2hpbGQBAARuYW1lAQAKYnVuZGxlTmFtZQEABGJyZWUHALEBAClvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgoAAQCzDAC0ADsBABJnZXRPdXRwdXREaXJlY3RvcnkKALAAtgwAFgC3AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCgCwALkMALoAEAEAB3dyaXRlbG4HALwBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAvgEAFiAgIERpcmVjdG9yeSBjaGVja2VkOiAKALsAPQoAAQDBDADCADsBABNnZXREaXJlY3RvcnlUb0NoZWNrCgC7AMQMAMUAxgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAuwDIDADJADsBAAh0b1N0cmluZwoAsADLDAC6ACYIAM0BAAsgICBDaGVja2VkIAoAuwDPDADFANABABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADSAQAEIG9mIAgA1AEABiBqYXJzLggA1gEATSAgQnVuZGxlcyB3aXRoIGFwcHJvcHJpYXRlIHVzZSBvZiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCAoQlJFRSk6CADYAQATICAgSmF2YSB3aXRoIEJSRUU6IAoAAQDaDADbANwBAAp0b3RhbENvdW50AQASKExqYXZhL3V0aWwvTWFwOylJCADeAQAZICAgTm9uIEphdmEgd2l0aG91dCBCUkVFOggA4AEAKSAgIERpc3RyaWJ1dGlvbiBvZiBCUkVFcyBpbiBKYXZhIEJ1bmRsZXMgCwDiAOQHAOMBAA1qYXZhL3V0aWwvTWFwDADlAOYBAAZrZXlTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwoAawDoDAAWAOkBABkoTGphdmEvdXRpbC9Db2xsZWN0aW9uOylWCgDrAO0HAOwBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAO4A7wEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCwDxAPMHAPIBAA5qYXZhL3V0aWwvTGlzdAwA9AD1AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwD3APkHAPgBABJqYXZhL3V0aWwvSXRlcmF0b3IMAPoA+wEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwsA4gD9DAD+AP8BAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwcBAQEAEWphdmEvbGFuZy9JbnRlZ2VyCAEDAQAJCQklNWQJJXMKCgEAAQUMAQYAiAEACGludFZhbHVlCgEAAQgMAQkBCgEAB3ZhbHVlT2YBABYoSSlMamF2YS9sYW5nL0ludGVnZXI7CgCwAQwMAQ0BDgEABnByaW50ZgEAKChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYLAPcBEAwBEQAqAQAHaGFzTmV4dAgBEwEANyAgQnVuZGxlcyB3aXRoIHF1ZXN0aW9uYWJsZSBhYnNlbmNlIG9yIHByZXNlbmNlIG9mIEJSRUUIARUBACEgICAgSmF2YSBCdW5kbGVzIHdpdGhvdXQgYSBCUkVFOiALAPEBFwwBGACIAQAEc2l6ZQgBGgEAByAgICAgICAKALsBHAwAxQEdAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CAEfAQAiICAgIE5vbiBKYXZhIEJ1bmRsZXMgd2l0aCBhIEJSRUU6IAcBIQEAMW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEIASMBAAglMjRzCSVzCgkBIAElDAEmAAYBAAlicmVlVmFsdWUJASABKAwBKQAGAQAIZmlsZW5hbWUHASsBAA9qYXZhL2xhbmcvRXJyb3IIAS0BABJQcm9ncmFtbWluZyBlcnJvci4KASoAPQoAsABmAQAMcmVwb3J0V3JpdGVyAQArTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwEACGFsbEJSRUVzAQAPTGphdmEvdXRpbC9TZXQ7AQALYWxsQlJFRUxpc3QBAAZvYmplY3QBABJMamF2YS9sYW5nL09iamVjdDsBAAVjb3VudAEAE0xqYXZhL2xhbmcvSW50ZWdlcjsBABRMamF2YS91dGlsL0l0ZXJhdG9yOwEADGJyZWVmaWxlZGF0YQEAM0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QkQlJFRUZpbGVEYXRhOwsA4gE9DAE+AT8BAAZ2YWx1ZXMBABgoKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjsLAUEA8wcBQgEAFGphdmEvdXRpbC9Db2xsZWN0aW9uAQAJYWxsQ291bnRzAQAWTGphdmEvdXRpbC9Db2xsZWN0aW9uOwEABXRvdGFsCwDxAUcMAUgBSQEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgoBIAC2AQAEbGlzdAoBAAFNDAAWAU4BAAQoSSlWCwDiAVAMAVEBUgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgABAVQMAVUBVgEACWluY3JlbWVudAEAKChMamF2YS9sYW5nL0ludGVnZXI7KUxqYXZhL2xhbmcvSW50ZWdlcjsBAAdicmVlTWFwBwFZAQAVamF2YS91dGlsL2phci9KYXJGaWxlCgFYAVsMABYBXAEAEyhMamF2YS9pby9GaWxlO1pJKVYKAVgBXgwBXwFgAQAHZW50cmllcwEAGSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsLAWIBZAcBYwEAFWphdmEvdXRpbC9FbnVtZXJhdGlvbgwBZQD7AQALbmV4dEVsZW1lbnQHAWcBABZqYXZhL3V0aWwvamFyL0phckVudHJ5CgFmAHYIAWoBAAYuY2xhc3MKAHwBbAwBbQFuAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAXABAAQuamFyCgFYAXIMAXMBdAEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEBdgwAiwF3AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylaCwFiAXkMAXoAKgEAD2hhc01vcmVFbGVtZW50cwkBfAF+BwF9AQAQamF2YS9sYW5nL1N5c3RlbQwBfwGAAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CgAsAYIMAYMAOwEACmdldE1lc3NhZ2UKAYUBhwcBhgEAE2phdmEvaW8vUHJpbnRTdHJlYW0MAYgAJgEAB3ByaW50bG4KAVgAZgEAB2phcmZpbGUBAANqYXIBABdMamF2YS91dGlsL2phci9KYXJGaWxlOwEAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247AQAFZW50cnkBABhMamF2YS91dGlsL2phci9KYXJFbnRyeTsBAAVpbnB1dAEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBADFMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3V0aWwvamFyL0phckVudHJ5Oz47BwGUAQAcamF2YS91dGlsL2phci9KYXJJbnB1dFN0cmVhbQoBkwGWDAAWAFwKAZMBmAwBmQGaAQAMZ2V0TmV4dEVudHJ5AQAaKClMamF2YS91dGlsL3ppcC9aaXBFbnRyeTsKAZwAdgcBnQEAFmphdmEvdXRpbC96aXAvWmlwRW50cnkKAZMBnwwBoACIAQAJYXZhaWxhYmxlAQAOamFySW5wdXRTdHJlYW0BAB5MamF2YS91dGlsL2phci9KYXJJbnB1dFN0cmVhbTsBABhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTsKABIBpQwBpgFuAQAFcGFyc2UKABIBqAwBqQA7AQAQZ2V0UHJvamVjdFN0cmluZwEACGZ1bGxu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AQsAFQEMABgBDQAkAQ4AMgEPADQBEAA3ARIARQETAE0BFABWARUAWAEWAFsBDABoARwAagEdAHUBIAB5ASIAgAEkAIUBHwCHASAAiwEiAJIBJACUASgAlwEgAJsBIgCiASQApAEpABoAAABSAAgAAACmABwAHQAAAAAApgGKAEMAAQACAKQAiwBFAAIABACiAYsBjAADABUAUwFfAY0ABAAkADcBjgGPAAUATQAOAZAAnQAGAGoACwAzADQABAGRAAAADAABABUAUwFfAZIABAACAIsBdwABABEAAAFIAAMABwAAAGwDPbsBk1krtwGVTqcAIS22AZc6BBkExgAWGQS2AZsTAWm2AWuZAAgEPacANC22AZ6d/96nACpOLbYAKyvGAC4rtgBjpwAnOganACI6BSvGAAwrtgBjpwAFOgYZBb8rxgAMK7YAY6cABToGHKwABQACADMANgAsAD8AQwBGACwAAgA7AEsAAABRAFUAWAAsAGEAZQBoACwAAgAZAAAAXgAXAAABLgACATEACwEyAA4BMwAUATQAGQE1ACcBNgApATcALAEyADYBPQA3AT4AOwFBAD8BQwBGAUUASwFAAE0BQQBRAUMAWAFFAFoBSQBdAUEAYQFDAGgBRQBqAUoAGgAAAD4ABgAAAGwAHAAdAAAAAABsAZAAnQABAAIAagCLAEUAAgALACsBoQGiAAMAFAAYAY4BowAEADcABAAzADQAAwACAHoAYgABABEAAABvAAIABAAAABcBTbIAFyu2AaQ+HZkACrIAF7YBp00ssAAAAAIAGQAAABYABQAAAU4AAgFPAAoBUAAOAVEAFQFTABoAAAAqAAQAAAAXABwAHQAAAAAAFwGqAAYAAQACABUBqwAGAAIACgANAawARQADAAIBrQGuAAEAEQAAAWIAAgAHAAAAaAFOKwG4Aa86BBkEEgu5APwCAMAAfE6nAEM6BBkEtgG1K8YARSu2AGOnAD46BqcAOToEGQS2ACsrxgAuK7YAY6cAJzoGpwAiOgUrxgAMK7YAY6cABToGGQW/K8YADCu2AGOnAAU6Bi2wAAgAAgAWABkBtgAkACgAKwAsAAIAFgAwACwAOwA/AEIALAACACAARwAAADAANwBHAAAATQBRAFQALABdAGEAZAAsAAIAGQAAAFoAFgAAAVsAAgFdAAkBXgAZAWAAGwFhACABZwAkAWkAKwFrADABYwAyAWQANwFnADsBaQBCAWsARwFmAEkBZwBNAWkAVAFrAFYBbwBZAWcAXQFpAGQBawBmAXEAGgAAAEgABwAAAGgAHAAdAAAAAABoAZAAnQABAAAAaAG4AAYAAgACAGYArwAGAAMACQAQAbkAoQAEABsABQAzAboABAAyAAUAMwA0AAQAAgCDAIQAAQARAAACEgAFAAgAAACwAU0BTrsBWFkrAwS3AVpOLRMBu7YBvToEGQTHAB8sxgAMLLYAY6cABToHLcYADC22AYmnAAU6BwGwLRkEtgFxTSosK7YBwbcBxDoGLMYADCy2AGOnAAU6By3GAAwttgGJpwAFOgcZBrA6BLIBexkEtgGBtgGELMYADCy2AGOnAAU6By3GAAwttgGJpwAFOgcBsDoFLMYADCy2AGOnAAU6By3GAAwttgGJpwAFOgcZBb8ADQAhACUAKAAsAC4AMgA1ACwATwBTAFYALABcAGAAYwAsAAQAHQBoACwAOQBLAGgALAB5AH0AgAAsAIYAigCNACwABAAdAJEAAAA5AEsAkQAAAGgAdQCRAAAAlwCbAJ4ALACkAKgAqwAsAAIAGQAAAJoAJgAAAXoAAgF7AAQBfQAPAX4AGAF/AB0BjQAhAY8AKAGRACoBlQAuAZcANQGZADcBggA5AYQAQAGFAEsBjQBPAY8AVgGRAFgBlQBcAZcAYwGZAGUBhQBoAYcAagGIAHUBjQB5AY8AgAGRAIIBlQCGAZcAjQGZAI8BigCRAYwAkwGNAJcBjwCeAZEAoAGVAKQBlwCrAZkArQGdABoAAABIAAcAAACwABwAHQAAAAAAsAHGAEMAAQACAK4BkACdAAIABACsAYsBjAADABgACQGOAY8ABAA5ABYBjgGPAAQAagAPADMANAAEAAIBxwAAAAIByAHJAAAACgABASAAAQHKAAhQSwMECgAACAAAmRpEQIm40ncsOAAALDgAACkAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvQlJFRVRlc3QuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwogKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSAnRWNsaXBzZSBPcmJpdCcgcHJvamVjdCB0aGVuIGFkYXB0ZWQgdG8gdXNlIAogKiBpbiBXVFAgYW5kIGltcHJvdmVkIHRvIHVzZSAnTWFuaWZlc3QnIHRvIHJlYWQgbWFuaWZlc3QubWYsIGluc3RlYWQgb2YgcmVhZGluZyAKICogaXQgYXMgYSBwcm9wZXJ0aWVzIGZpbGUuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5qYXJzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwppbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwppbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5GdWxsSmFyTmFtZVBhcnNlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLlJlcG9ydFdyaXRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwoKLyoqCiAqIEBzaW5jZSAzLjMKICovCnB1YmxpYyBjbGFzcyBCUkVFVGVzdCBleHRlbmRzIFRlc3RKYXJzIHsKCgoKICAgIHN0YXRpYyBjbGFzcyBCUkVFRmlsZURhdGEgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKICAgICAgICBTdHJpbmcgZmlsZW5hbWU7CiAgICAgICAgU3RyaW5nIGJyZWVWYWx1ZTsKCiAgICAgICAgcHVibGljIEJSRUVGaWxlRGF0YShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBicmVlVmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwogICAgICAgICAgICB0aGlzLmJyZWVWYWx1ZSA9IGJyZWVWYWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CiAgICAgICAgICAgIC8vIGZpcnN0IHNvcnQgb24gYnJlZSBuYW1lLCB0aGVuIG9uIGZpbGUvYnVuZGxlIG5hbWUKICAgICAgICAgICAgaW50IHJlc3VsdCA9IGJyZWVWYWx1ZS5jb21wYXJlVG8oKChCUkVFRmlsZURhdGEpIG8pLmJyZWVWYWx1ZSk7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWUuY29tcGFyZVRvKCgoQlJFRUZpbGVEYXRhKSBvKS5maWxlbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAiYnJlZWRhdGEudHh0IjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgICAgIFBST1BFUlRZX0JVTkRMRV9SRVFVSVJFRF9FWEVDVVRJT05fRU5WSVJPTk1FTlQgPSAiQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVsbEphck5hbWVQYXJzZXIgbmFtZVBhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgQlJFRVRlc3QgdGVzdGxheW91dCA9IG5ldyBCUkVFVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiL2hvbWUvZmlsZXMvdGVzdFNES1JlcG8iKTsKICAgICAgICB0cnkgewogICAgICAgICAgICB0ZXN0bGF5b3V0LnRlc3RCUkVFU2V0dGluZ1J1bGUoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RCUkVFU2V0dGluZ1J1bGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwoKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZDsKCiAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gY2hlY2tCdW5kbGVCUkVFKGlucHV0ZGlyKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tCdW5kbGVCUkVFKEZpbGUgaW5wdXRkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gcmVzZXQvaW5pdGlhbGl6ZSBlcnJvcnMKICAgICAgICBJbnB1dFN0cmVhbSBwcm9wZXJ0eVN0cmVhbSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJleGNlcHRpb25zLnByb3BlcnRpZXMiKTsKICAgICAgICBQcm9wZXJ0aWVzIGJyZWVFeGNlcHRpb25Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBTdHJpbmcgYnJlZUV4Y2VwdGlvbnMgPSAiIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBicmVlRXhjZXB0aW9uUHJvcGVydGllcy5sb2FkKHByb3BlcnR5U3RyZWFtKTsKICAgICAgICAgICAgYnJlZUV4Y2VwdGlvbnMgPSBicmVlRXhjZXB0aW9uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiYnJlZUV4Y2VwdGlvbnMiKTsKICAgICAgICAgICAgaWYgKGJyZWVFeGNlcHRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyZWVFeGNlcHRpb25zID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVN0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RyZWFtLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHVudXN1YWwgdG8gZ2V0IGhlcmU/CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KLy8gTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgTWFwIGphdmFXaXRoQnJlZSA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgTGlzdCBub25qYXZhV2l0aEJyZWUgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgTGlzdCBqYXZhV2l0aG91dEJyZWUgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgaW50IG5vbkphdmFOb0JSRUUgPSAwOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBKQVJGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIGludCBjaGVja2VkID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CiAgICAgICAgICAgIC8vIHdpdGggSnVubywgc2luY2Ugd2UgaGF2ZSBhbGwgamFycyBvbiBmaWxlIHN5c3RlbSwgaW4gYWRkaXRpb24gdG8gcGFjay5neiBmaWxlcywKICAgICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgdGhlIHBhY2suZ3ogb25lcy4gV2UgY2FuIGFzc3VtZSB0aGV5IGFyZSBpZGVudGlhbCB0byB0aGVpciAuamFyIHZlcnNpb24uCi8vIGlmIChjaGlsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUikpIHsKLy8gY2hpbGQgPSBnZXRGaWxlRnJvbVBBQ0tFREpBUihjaGlsZCk7Ci8vIH0KLy8gaWYgKGNoaWxkICE9IG51bGwpIHsKCiAgICAgICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZ2V0QnVuZGxlTmFtZShuYW1lKTsKICAgICAgICAgICAgaWYgKChidW5kbGVOYW1lICE9IG51bGwpICYmICFicmVlRXhjZXB0aW9ucy5jb250YWlucyhidW5kbGVOYW1lKSkgewogICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgU3RyaW5nIGJyZWUgPSBnZXRCUkVFRnJvbUpBUihjaGlsZCk7CiAgICAgICAgICAgICAgICBpZiAoKGJyZWUgIT0gbnVsbCkgJiYgKGJyZWUubGVuZ3RoKCkgPiAwKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGhhcyBCUkVFLCBjb25maXJtIGlzIGphdmEgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoY2hpbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudENvdW50cyhqYXZhV2l0aEJyZWUsIGJyZWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGYWxzZUluY2x1c2lvbnMobm9uamF2YVdpdGhCcmVlLCBjaGlsZCwgYnJlZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzT2NjdXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gQlJFRSwgY29uZmlybSBpcyBub24tamF2YQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoY2hpbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrT21pc3Npb25zKGphdmFXaXRob3V0QnJlZSwgY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9uSmF2YU5vQlJFRSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgcHJpbnRyZXBvcnQoamF2YVdpdGhCcmVlLCBub25qYXZhV2l0aEJyZWUsIGphdmFXaXRob3V0QnJlZSwgbm9uSmF2YU5vQlJFRSwgdG90YWxzaXplLCBjaGVja2VkKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRyZXBvcnQoTWFwIGphdmFXaXRoQnJlZSwgTGlzdCBub25qYXZhV2l0aEJyZWUsIExpc3QgamF2YVdpdGhvdXRCcmVlLCBpbnQgbm9uSmF2YU5vQlJFRSwgaW50IHRvdGFsc2l6ZSwgaW50IGNoZWNrZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoKICAgICAgICBSZXBvcnRXcml0ZXIgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXJlY3RvcnkgY2hlY2tlZDogIiArIGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIiBqYXJzLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICBCdW5kbGVzIHdpdGggYXBwcm9wcmlhdGUgdXNlIG9mIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IChCUkVFKToiKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIEphdmEgd2l0aCBCUkVFOiAiICsgdG90YWxDb3VudChqYXZhV2l0aEJyZWUpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE5vbiBKYXZhIHdpdGhvdXQgQlJFRToiICsgbm9uSmF2YU5vQlJFRSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXN0cmlidXRpb24gb2YgQlJFRXMgaW4gSmF2YSBCdW5kbGVzICIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICBTZXQgYWxsQlJFRXMgPSBqYXZhV2l0aEJyZWUua2V5U2V0KCk7CiAgICAgICAgICAgIExpc3QgYWxsQlJFRUxpc3QgPSBuZXcgQXJyYXlMaXN0KGFsbEJSRUVzKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhbGxCUkVFTGlzdCk7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGFsbEJSRUVMaXN0KSB7CiAgICAgICAgICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIGphdmFXaXRoQnJlZS5nZXQob2JqZWN0KTsKICAgICAgICAgICAgICAgIHJlcG9ydFdyaXRlci5wcmludGYoIlx0XHQlNWRcdCVzXG4iLCBjb3VudC5pbnRWYWx1ZSgpLCBvYmplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgIEJ1bmRsZXMgd2l0aCBxdWVzdGlvbmFibGUgYWJzZW5jZSBvciBwcmVzZW5jZSBvZiBCUkVFIik7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICAgSmF2YSBCdW5kbGVzIHdpdGhvdXQgYSBCUkVFOiAiICsgamF2YVdpdGhvdXRCcmVlLnNpemUoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoamF2YVdpdGhvdXRCcmVlKTsKICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGphdmFXaXRob3V0QnJlZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIE5vbiBKYXZhIEJ1bmRsZXMgd2l0aCBhIEJSRUU6ICIgKyBub25qYXZhV2l0aEJyZWUuc2l6ZSgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub25qYXZhV2l0aEJyZWUpOwogICAgICAgICAgICBCUkVFRmlsZURhdGEgYnJlZWZpbGVkYXRhID0gbnVsbDsKICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vbmphdmFXaXRoQnJlZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJSRUVGaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGJyZWVmaWxlZGF0YSA9IChCUkVFRmlsZURhdGEpIG9iamVjdDsKICAgICAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIucHJpbnRmKCIlMjRzXHQlc1xuIiwgYnJlZWZpbGVkYXRhLmJyZWVWYWx1ZSwgYnJlZWZpbGVkYXRhLmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUHJvZ3JhbW1pbmcgZXJyb3IuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGludCB0b3RhbENvdW50KE1hcCBqYXZhV2l0aEJyZWUpIHsKCiAgICAgICAgQ29sbGVjdGlvbiBhbGxDb3VudHMgPSBqYXZhV2l0aEJyZWUudmFsdWVzKCk7CiAgICAgICAgaW50IHRvdGFsID0gMDsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQ291bnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBjb3VudC5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWw7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRyYWNrT21pc3Npb25zKExpc3QgamF2YVdpdGhvdXRCcmVlLCBGaWxlIGNoaWxkKSB7CiAgICAgICAgamF2YVdpdGhvdXRCcmVlLmFkZChjaGlsZC5nZXROYW1lKCkpOwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgdHJhY2tGYWxzZUluY2x1c2lvbnMoTGlzdCBsaXN0LCBGaWxlIGNoaWxkLCBTdHJpbmcgYnJlZSkgewogICAgICAgIGxpc3QuYWRkKG5ldyBCUkVFRmlsZURhdGEoY2hpbGQuZ2V0TmFtZSgpLCBicmVlKSk7CgogICAgfQoKICAgIHByaXZhdGUgdm9pZCBpbmNyZW1lbnRDb3VudHMoTWFwIGJyZWVNYXAsIFN0cmluZyBicmVlKSB7CiAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBicmVlTWFwLmdldChicmVlKTsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICBicmVlTWFwLnB1dChicmVlLCBuZXcgSW50ZWdlcigxKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBicmVlTWFwLnB1dChicmVlLCBpbmNyZW1lbnQoY291bnQpKTsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgSW50ZWdlciBpbmNyZW1lbnQoSW50ZWdlciBjb3VudCkgewogICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSk7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShGaWxlIGphcmZpbGUpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7CiAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zSmF2YShpbnB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbnNKYXZhOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGphcklucHV0U3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGlucHV0KTsKICAgICAgICAgICAgd2hpbGUgKGphcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewogICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zSmF2YTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVOYW1lKFN0cmluZyBmdWxsbmFtZSkgewogICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwogICAgICAgIGJvb2xlYW4gcGFyc2FibGUgPSBuYW1lUGFyc2VyLnBhcnNlKGZ1bGxuYW1lKTsKICAgICAgICBpZiAocGFyc2FibGUpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmFtZVBhcnNlci5nZXRQcm9qZWN0U3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkIGZyb20gdGhlIG1hbmlmZXN0IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGlucHV0CiAgICAgKiBzdHJlYW0uCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJSRUVGcm9tTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBwYXRoKSB7CiAgICAgICAgU3RyaW5nIGJyZWUgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBicmVlID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoUFJPUEVSVFlfQlVORExFX1JFUVVJUkVEX0VYRUNVVElPTl9FTlZJUk9OTUVOVCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBicmVlOwogICAgfQoKCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGEgYnVuZGxlIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlLiBMb29rIGludG8KICAgICAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QlJFRUZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArCiAgICAgICAgICAgICAgICAvLyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlucHV0ID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKICAgICAgICAgICAgcmV0dXJuIGdldEJSRUVGcm9tTWFuaWZlc3QoaW5wdXQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAvLyBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpQSwMECgAACAAAj7VHQHZwqrLqIAAA6iAAACgAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvRVNUZXN0LmNsYXNzyv66vgAAADEBewcAAgEAIm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9FU1Rlc3QHAAQBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMBACFQUk9QRVJUWV9FQ0xJUFNFX1NPVVJDRVJFRkVSRU5DRVMBABJMamF2YS9sYW5nL09iamVjdDsBAApuYW1lUGFyc2VyAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAOb3V0cHV0RmlsZW5hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAANAQAKZXNkYXRhLnR4dAEACDxjbGluaXQ+AQADKClWAQAEQ29kZQgAEgEAGEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcwkAAQAUDAAFAAYHABYBAC5vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyCgAVABgMABkADwEABjxpbml0PgkAAQAbDAAHAAgBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAGAEABHRoaXMBACRMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0VTVGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgoAAQAYCAAlAQApL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2p1bm9SQzIvZWNsaXBzZUpFRS8KAAEAJwwAKAApAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQArDAAsAC0BABF0ZXN0RVNTZXR0aW5nUnVsZQEAAygpWgoALwAxBwAwAQATamF2YS9pby9JT0V4Y2VwdGlvbgwAMgAPAQAPcHJpbnRTdGFja1RyYWNlAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEACkV4Y2VwdGlvbnMHADoBAAxqYXZhL2lvL0ZpbGUKAAEAPAwAPQA+AQASZ2V0QnVuZGxlRGlyZWN0b3J5AQAUKClMamF2YS9sYW5nL1N0cmluZzsKADkAQAwAGQApCgABAEIMAEMARAEADWNoZWNrQnVuZGxlRVMBABEoTGphdmEvaW8vRmlsZTspWgEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAA9mYWlsdXJlc09jY3VyZWQBAAFaCgBKAEwHAEsBABBqYXZhL2xhbmcvT2JqZWN0DABNAE4BAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsIAFABABVleGNlcHRpb25zLnByb3BlcnRpZXMKAFIAVAcAUwEAD2phdmEvbGFuZy9DbGFzcwwAVQBWAQATZ2V0UmVzb3VyY2VBc1N0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07BwBYAQAUamF2YS91dGlsL1Byb3BlcnRpZXMKAFcAGAgAWwEAAAoAVwBdDABeAF8BAARsb2FkAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCABhAQAMZXNFeGNlcHRpb25zCgBXAGMMAGQAZQEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAGcAaQcAaAEAE2phdmEvaW8vSW5wdXRTdHJlYW0MAGoADwEABWNsb3NlBwBsAQARamF2YS91dGlsL0hhc2hNYXAKAGsAGAcAbwEAE2phdmEvdXRpbC9BcnJheUxpc3QKAG4AGAcAcgEALm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAHEAGAoAOQB1DAB2AHcBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAOQB5DAB6AD4BAAdnZXROYW1lCgABAHwMAH0AZQEADWdldEJ1bmRsZU5hbWUKAH8AgQcAgAEAEGphdmEvbGFuZy9TdHJpbmcMAIIAgwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABAIUMAIYAhwEADGdldEVTRnJvbUpBUgEAIihMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsIAIkBAAhwcm9qZWN0PQoAfwCLDACMAI0BAAZsZW5ndGgBAAMoKUkKAAEAjwwAkACRAQAPaW5jcmVtZW50Q291bnRzAQAkKExqYXZhL3V0aWwvTWFwO0xqYXZhL2xhbmcvU3RyaW5nOylWCgABAJMMAJQAlQEADnRyYWNrT21pc3Npb25zAQAhKExqYXZhL3V0aWwvTGlzdDtMamF2YS9pby9GaWxlOylWCgABAJcMAJgAmQEAC3ByaW50cmVwb3J0AQAlKExqYXZhL3V0aWwvTWFwO0xqYXZhL3V0aWwvTGlzdDtJSUkpVgEADnByb3BlcnR5U3RyZWFtAQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAVZXNFeGNlcHRpb25Qcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwEABndpdGhFcwEAD0xqYXZhL3V0aWwvTWFwOwEACXdpdGhvdXRFcwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQAMblByb2plY3RUYWdzAQABaQEABWNoaWxkAQAEbmFtZQEACmJ1bmRsZU5hbWUBAAJlcwcArgEAKW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyCgABALAMALEAPgEAEmdldE91dHB1dERpcmVjdG9yeQoArQCzDAAZALQBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKAK0AtgwAtwAPAQAHd3JpdGVsbgcAuQEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCAC7AQAWICAgRGlyZWN0b3J5IGNoZWNrZWQ6IAoAuABACgC4AL4MAL8AwAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAuADCDADDAD4BAAh0b1N0cmluZwoArQDFDAC3ACkIAMcBAAsgICBDaGVja2VkIAoAuADJDAC/AMoBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADMAQAEIG9mIAgAzgEABiBqYXJzLggA0AEANyAgIE51bWJlciBvZiBidW5kbGVzIHdpdGggYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzOiAKAAEA0gwA0wDUAQAKdG90YWxDb3VudAEAEihMamF2YS91dGlsL01hcDspSQgA1gEAKSAgICAgICAgTnVtYmVyIG9mIHRob3NlIHdpdGggJ3Byb2plY3Q9JzogCADYAQALIGF0dHJpYnV0ZS4IANoBADogICBOdW1iZXIgb2YgYnVuZGxlcyB3aXRob3V0IGFuIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczogCwDcAN4HAN0BAA5qYXZhL3V0aWwvTGlzdAwA3wCNAQAEc2l6ZQgA4QEAMCAgQnVuZGxlcyB3aXRoIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcyAodG90YWw6IAgA4wEAASkLAOUA5wcA5gEADWphdmEvdXRpbC9NYXAMAOgA6QEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CgBuAOsMABkA7AEAGShMamF2YS91dGlsL0NvbGxlY3Rpb247KVYKAO4A8AcA7wEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA8QDyAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLANwA9AwA9QD2AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwD4APoHAPkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAPsA/AEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwgA/gEAAyAgIAoAuAEADAC/AQEBAC0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsLAPgBAwwBBAAtAQAHaGFzTmV4dAgBBgEAOCAgICBCdW5kbGVzIHdpdGhvdXQgYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzICh0b3RhbDogCAEIAQAHICAgICAgIAoArQBpAQAKd2l0aG91dEVTcwEADHJlcG9ydFdyaXRlcgEAK0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBAAZhbGxFU3MBABZMamF2YS91dGlsL0NvbGxlY3Rpb247AQAJYWxsRVNMaXN0AQAGb2JqZWN0CwDlARIMARMBFAEABnZhbHVlcwEAGCgpTGphdmEvdXRpbC9Db2xsZWN0aW9uOwsBFgD0BwEXAQAUamF2YS91dGlsL0NvbGxlY3Rpb24HARkBABFqYXZhL2xhbmcvSW50ZWdlcgoBGAEbDAEcAI0BAAhpbnRWYWx1ZQEADWJ1bmRsZXNXaXRoRXMBAAlhbGxDb3VudHMBAAV0b3RhbAEAFExqYXZhL3V0aWwvSXRlcmF0b3I7AQAFY291bnQBABNMamF2YS9sYW5nL0ludGVnZXI7CwDcASQMASUBJgEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgEAEGJ1bmRsZXNXaXRob3V0RXMLAOUBKQwBKgErAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsKARgBLQwAGQEuAQAEKEkpVgsA5QEwDAExATIBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQE0DAE1ATYBAAlpbmNyZW1lbnQBACgoTGphdmEvbGFuZy9JbnRlZ2VyOylMamF2YS9sYW5nL0ludGVnZXI7AQAFZXNNYXAKABUBOQwBOgE7AQAFcGFyc2UBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoKABUBPQwBPgA+AQAQZ2V0UHJvamVjdFN0cmluZwEACGZ1bGxuYW1lAQAGcmVzdWx0AQAIcGFyc2FibGUBABFnZXRFU0Zyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgFFAUcHAUYBACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAFIAUkBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsKAUsAMQcBTAEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24BAAVpbnB1dAEABHBhdGgBAAphdHRyaWJ1dGVzAQAkTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb247BwFSAQAVamF2YS91dGlsL2phci9KYXJGaWxlCgFRAVQMABkBVQEAEyhMamF2YS9pby9GaWxlO1pJKVYIAVcBABRNRVRBLUlORi9NQU5JRkVTVC5NRgoBUQFZDAFaAVsBAAtnZXRKYXJF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amF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwppbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLkZ1bGxKYXJOYW1lUGFyc2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5KQVJGaWxlTmFtZUZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CgovKioKICogVGVzdCB0byBjaGVjayBNQU5JRkVTVC5NRiBmaWxlcyBpbiBqYXJzIGluIGEgcmVwb3NpdG9yeSBmb3IgcHJlc2VuY2Ugb2YKICogRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzLgogKiAKICogQHNpbmNlIDMuNwogKi8KcHVibGljIGNsYXNzIEVTVGVzdCBleHRlbmRzIFRlc3RKYXJzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgICAgICAgICAgICBQUk9QRVJUWV9FQ0xJUFNFX1NPVVJDRVJFRkVSRU5DRVMgPSAiRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bGxKYXJOYW1lUGFyc2VyIG5hbWVQYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgICAgICAgICAgICAgICAgICAgID0gImVzZGF0YS50eHQiOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgRVNUZXN0IHRlc3RsYXlvdXQgPSBuZXcgRVNUZXN0KCk7CiAgICAgICAgdGVzdGxheW91dC5zZXREaXJlY3RvcnlUb0NoZWNrKCIvaG9tZS9maWxlcy9idWlsZHppcHMvanVub1JDMi9lY2xpcHNlSkVFLyIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEVTU2V0dGluZ1J1bGUoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKCgogICAgcHVibGljIGJvb2xlYW4gdGVzdEVTU2V0dGluZ1J1bGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwoKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZDsKCiAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gY2hlY2tCdW5kbGVFUyhpbnB1dGRpcik7CgogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlRVMoRmlsZSBpbnB1dGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyByZXNldC9pbml0aWFsaXplIGVycm9ycwogICAgICAgIElucHV0U3RyZWFtIHByb3BlcnR5U3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImV4Y2VwdGlvbnMucHJvcGVydGllcyIpOwogICAgICAgIFByb3BlcnRpZXMgZXNFeGNlcHRpb25Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBTdHJpbmcgZXNFeGNlcHRpb25zID0gIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZXNFeGNlcHRpb25Qcm9wZXJ0aWVzLmxvYWQocHJvcGVydHlTdHJlYW0pOwogICAgICAgICAgICBlc0V4Y2VwdGlvbnMgPSBlc0V4Y2VwdGlvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImVzRXhjZXB0aW9ucyIpOwogICAgICAgICAgICBpZiAoZXNFeGNlcHRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGVzRXhjZXB0aW9ucyA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB1bnVzdWFsIHRvIGdldCBoZXJlPwogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIE1hcCB3aXRoRXMgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgIExpc3Qgd2l0aG91dEVzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBKQVJGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIGludCBjaGVja2VkID0gMDsKICAgICAgICBpbnQgblByb2plY3RUYWdzID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CgogICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGdldEJ1bmRsZU5hbWUobmFtZSk7CiAgICAgICAgICAgIGlmICgoYnVuZGxlTmFtZSAhPSBudWxsKSAmJiAhZXNFeGNlcHRpb25zLmNvbnRhaW5zKGJ1bmRsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICBjaGVja2VkKys7CiAgICAgICAgICAgICAgICBTdHJpbmcgZXMgPSBnZXRFU0Zyb21KQVIoY2hpbGQpOwogICAgICAgICAgICAgICAgaWYgKChlcyAhPSBudWxsKSAmJiBlcy5jb250YWlucygicHJvamVjdD0iKSkgewogICAgICAgICAgICAgICAgICAgIG5Qcm9qZWN0VGFncysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChlcyAhPSBudWxsKSAmJiAoZXMubGVuZ3RoKCkgPiAwKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGhhcyBFUwogICAgICAgICAgICAgICAgICAgIGluY3JlbWVudENvdW50cyh3aXRoRXMsIGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIG5vIEVTCiAgICAgICAgICAgICAgICAgICAgdHJhY2tPbWlzc2lvbnMod2l0aG91dEVzLCBjaGlsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRyZXBvcnQod2l0aEVzLCB3aXRob3V0RXMsIHRvdGFsc2l6ZSwgY2hlY2tlZCwgblByb2plY3RUYWdzKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRyZXBvcnQoTWFwIHdpdGhFcywgTGlzdCB3aXRob3V0RVNzLCBpbnQgdG90YWxzaXplLCBpbnQgY2hlY2tlZCwgaW50IG5Qcm9qZWN0VGFncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgogICAgICAgIFJlcG9ydFdyaXRlciByZXBvcnRXcml0ZXIgPSBuZXcgUmVwb3J0V3JpdGVyKGdldE91dHB1dERpcmVjdG9yeSgpLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIERpcmVjdG9yeSBjaGVja2VkOiAiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIgamFycy4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE51bWJlciBvZiBidW5kbGVzIHdpdGggYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzOiAiICsgdG90YWxDb3VudCh3aXRoRXMpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAgTnVtYmVyIG9mIHRob3NlIHdpdGggJ3Byb2plY3Q9JzogIiArIG5Qcm9qZWN0VGFncyArICIgYXR0cmlidXRlLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgTnVtYmVyIG9mIGJ1bmRsZXMgd2l0aG91dCBhbiBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXM6ICIgKyB3aXRob3V0RVNzLnNpemUoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgIEJ1bmRsZXMgd2l0aCBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXMgKHRvdGFsOiAiICsgdG90YWxDb3VudCh3aXRoRXMpICsgIikiKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgQ29sbGVjdGlvbiBhbGxFU3MgPSB3aXRoRXMua2V5U2V0KCk7CiAgICAgICAgICAgIExpc3QgYWxsRVNMaXN0ID0gbmV3IEFycmF5TGlzdChhbGxFU3MpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGFsbEVTTGlzdCk7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGFsbEVTTGlzdCkgewogICAgICAgICAgICAgICAgLy9JbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIHdpdGhFcy5nZXQob2JqZWN0KTsKICAgICAgICAgICAgICAgIC8vcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICIgKyBjb3VudC5pbnRWYWx1ZSgpICsgIiAgIiArIG9iamVjdCk7CiAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIiArIG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICBCdW5kbGVzIHdpdGhvdXQgYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzICh0b3RhbDogIiArIHdpdGhvdXRFU3Muc2l6ZSgpICsgIikiKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh3aXRob3V0RVNzKTsKICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogd2l0aG91dEVTcykgewogICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLmNsb3NlKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgaW50IHRvdGFsQ291bnQoTWFwIGJ1bmRsZXNXaXRoRXMpIHsKCiAgICAgICAgQ29sbGVjdGlvbiBhbGxDb3VudHMgPSBidW5kbGVzV2l0aEVzLnZhbHVlcygpOwogICAgICAgIGludCB0b3RhbCA9IDA7CiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbENvdW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgY291bnQuaW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCB0cmFja09taXNzaW9ucyhMaXN0IGJ1bmRsZXNXaXRob3V0RXMsIEZpbGUgY2hpbGQpIHsKICAgICAgICBidW5kbGVzV2l0aG91dEVzLmFkZChjaGlsZC5nZXROYW1lKCkpOwoKICAgIH0KCgogICAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudENvdW50cyhNYXAgZXNNYXAsIFN0cmluZyBlcykgewogICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgZXNNYXAuZ2V0KGVzKTsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICBlc01hcC5wdXQoZXMsIG5ldyBJbnRlZ2VyKDEpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVzTWFwLnB1dChlcywgaW5jcmVtZW50KGNvdW50KSk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIEludGVnZXIgaW5jcmVtZW50KEludGVnZXIgY291bnQpIHsKICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpOwogICAgfQoKCgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlTmFtZShTdHJpbmcgZnVsbG5hbWUpIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKICAgICAgICBib29sZWFuIHBhcnNhYmxlID0gbmFtZVBhcnNlci5wYXJzZShmdWxsbmFtZSk7CiAgICAgICAgaWYgKHBhcnNhYmxlKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5hbWVQYXJzZXIuZ2V0UHJvamVjdFN0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRFU0Zyb21NYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICBTdHJpbmcgZXMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBlcyA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0VDTElQU0VfU09VUkNFUkVGRVJFTkNFUyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBlczsKICAgIH0KCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGEgYnVuZGxlIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlLiBMb29rIGludG8KICAgICAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RVNGcm9tSkFSKEZpbGUgZmlsZSkgewogICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKICAgICAgICBKYXJGaWxlIGphciA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIGFkZEVycm9yKCJCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6ICIgKwogICAgICAgICAgICAgICAgLy8gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgIHJldHVybiBnZXRFU0Zyb21NYW5pZmVzdChpbnB1dCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIC8vIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgamFyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCn0KUEsDBAoAAAgAAI+1R0Bjffma40YAAONGAAAwAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RMYXlvdXRUZXN0LmNsYXNzyv66vgAAADECowcAAgEAKm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0TGF5b3V0VGVzdAcABAEAJG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycwEADUVYVEVOU0lPTl9KQVIBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQAELmphcgEAFEVYVEVOU0lPTl9QQUNFS0RfSkFSCAAMAQAILnBhY2suZ3oBAA1FWFRFTlNJT05fWklQCAAPAQAELnppcAEAElBST1BFUlRZX0JVTkRMRV9JRAgAEgEAE0J1bmRsZS1TeW1ib2xpY05hbWUBAA5jb25maWdGaWxlbmFtZQEAD0tFWV9ERlRfQklOX0pBUggAFgEAEmRlZmF1bHQuYmluYXJ5LmphcgEAD0tFWV9ERlRfU1JDX0pBUggAGQEAEmRlZmF1bHQuc291cmNlLmphcgEAD0tFWV9ERlRfRkVBVFVSRQgAHAEAD2RlZmF1bHQuZmVhdHVyZQEABmNvbmZpZwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAZlcnJvcnMBABBMamF2YS91dGlsL0xpc3Q7AQAQZGlyZWN0b3J5VG9DaGVjawEADnRlbXBXb3JraW5nRGlyAQAPb3V0cHV0RGlyZWN0b3J5AQAMcmVwb3J0V3JpdGVyAQArTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwEABjxpbml0PgEAAygpVgEABENvZGUKAAMAKgwAJgAnCAAsAQARY29uZmlnLnByb3BlcnRpZXMJAAEALgwAEwAGBwAwAQATamF2YS91dGlsL0FycmF5TGlzdAoALwAqCQABADMMAB8AIAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RMYXlvdXRUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABACoIADwBAAtEOlx0ZW1wdGVzdAoAAQA+DAA/AEABABNzZXREaXJlY3RvcnlUb0NoZWNrAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCABCAQAHRDovdGVtcAoAAQBEDABFAEABABFzZXRUZW1wV29ya2luZ0RpcgoAAQBHDABIAEkBAAp0ZXN0TGF5b3V0AQADKClaCgBLAE0HAEwBABNqYXZhL2lvL0lPRXhjZXB0aW9uDABOACcBAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAIYWRkRXJyb3ILAFYAWAcAVwEADmphdmEvdXRpbC9MaXN0DABZAFoBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAdtZXNzYWdlAQAKRXhjZXB0aW9ucwoAAQBeDABfAGABAA9nZXRSZXBvcnRXcml0ZXIBAC0oKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsIAGIBAC9DaGVjayBmaWxlcyBhbmQgbGF5b3V0IGluIGJ1bmRsZXMgYW5kIGZlYXR1cmVzLgoAZABmBwBlAQApb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIMAGcAQAEAB3dyaXRlbG4KAAEAaQwAagBJAQARdGVzdEZlYXR1cmVMYXlvdXQKAAEAbAwAbQBJAQAQdGVzdEJ1bmRsZUxheW91dAoAZABvDABwACcBAAVjbG9zZQEABnJlc3VsdAEAAVoBAA9mZWF0dXJlRmFpbHVyZXMBAA5idW5kbGVGYWlsdXJlcwcAdgEADGphdmEvaW8vRmlsZQoAAQB4DAB5AHoBABJnZXRCdW5kbGVEaXJlY3RvcnkBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoAdQB8DAAmAEAHAH4BAC5vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyCgB9ACoKAHUAgQwAggCDAQAJbGlzdEZpbGVzAQApKExqYXZhL2lvL0ZpbGVuYW1lRmlsdGVyOylbTGphdmEvaW8vRmlsZTsKAAEAhQwAhgCHAQALZ2V0QnVuZGxlSWQBACIoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7CACJAQAHLnNvdXJjZQoAiwCNBwCMAQAQamF2YS9sYW5nL1N0cmluZwwAjgCPAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAJEBAAguaW5mb3BvcAgAkwEACS5kb2MudXNlcggAlQEABC5kb2MIAJcBAAguZG9jLmlzdggAmQEACC5kb2MuZGV2CACbAQAILmRvYy5hcGkIAJ0BABBzdGFuZGFyZC5zY2hlbWFzCACfAQAJLmJyYW5kaW5nCgABAKEMAKIAowEAC2dldEV4cGVjdGVkAQAkKExqYXZhL2xhbmcvU3RyaW5nO1opTGphdmEvdXRpbC9TZXQ7CgABAKUMAKYApwEADXByb2Nlc3NCdW5kbGUBACAoTGphdmEvaW8vRmlsZTtMamF2YS91dGlsL1NldDspVgoAZACpDABnACcHAKsBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggArQEADSAgIENoZWNraW5nOiAKAKoAfAoAqgCwDACxALIBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAKoAtAwAtQB6AQAIdG9TdHJpbmcIALcBAAsgICBDaGVja2VkIAoAqgC5DACxALoBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CAC8AQAEIG9mIAgAvgEAAS4IAMABABEgICBFcnJvcnMgZm91bmQ6IAsAVgDCDADDAMQBAARzaXplAQADKClJCgDGAMgHAMcBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAMkAygEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCwBWAMwMAM0AzgEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsA0ADSBwDRAQASamF2YS91dGlsL0l0ZXJhdG9yDADTANQBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsKAGQA1gwAZwDXAQAVKExqYXZhL2xhbmcvT2JqZWN0OylWCwDQANkMANoASQEAB2hhc05leHQBAA9mYWlsdXJlc09jY3VyZWQBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAIY2hpbGRyZW4BAA9bTGphdmEvaW8vRmlsZTsBAAl0b3RhbHNpemUBAAFJAQAHY2hlY2tlZAEAAWkBAAVjaGlsZAEAAmlkAQAEaXRlcgEAFExqYXZhL3V0aWwvSXRlcmF0b3I7CQABAOkMAB0AHgoAAQDrDADsACcBAAlnZXRDb25maWcKAO4A8AcA7wEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzDADxAPIBAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7BwD0AQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24IAPYBAB1VbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6IAoA8wB8BwD5AQARamF2YS91dGlsL0hhc2hTZXQKAPgAKgcA/AEAGWphdmEvdXRpbC9TdHJpbmdUb2tlbml6ZXIIAP4BAAEsCgD7AQAMACYBAQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoA+wEDDAEEAHoBAAluZXh0VG9rZW4KAIsBBgwBBwB6AQAEdHJpbQsBCQBYBwEKAQANamF2YS91dGlsL1NldAoA+wEMDAENAEkBAA1oYXNNb3JlVG9rZW5zAQAGc291cmNlAQAEbGluZQEAD0xqYXZhL3V0aWwvU2V0OwEACXRva2VuaXplcgEAG0xqYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyOwEAEmdldEZlYXR1cmVFeHBlY3RlZAEAJShMamF2YS9sYW5nL1N0cmluZztaWilMamF2YS91dGlsL1NldDsBAAN6aXAKAO4AKgoAAQEYDAEZAHoBABFnZXRDb25maWdGaWxlbmFtZQoAdQEbDAEcAEkBAAZleGlzdHMHAR4BABdqYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbQoBHQEgDAAmASEBABEoTGphdmEvaW8vRmlsZTspVgoBIwElBwEkAQAQamF2YS9sYW5nL09iamVjdAwBJgEnAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7CgEpASsHASoBAA9qYXZhL2xhbmcvQ2xhc3MMASwBLQEAE2dldFJlc291cmNlQXNTdHJlYW0BACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwgBLwEAIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZS4KAO4BMQwBMgEzAQAEbG9hZAEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgoBNQBvBwE2AQATamF2YS9pby9JbnB1dFN0cmVhbQEABWlucHV0AQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAKY29uZmlnRmlsZQoAdQE7DAE8AEkBAAtpc0RpcmVjdG9yeQsBCQDCCwEJAT8MAUABQQEAB3RvQXJyYXkBACgoW0xqYXZhL2xhbmcvT2JqZWN0OylbTGphdmEvbGFuZy9PYmplY3Q7BwBQCAFEAQAACgABAUYMAUcBSAEACnByb2Nlc3NEaXIBADYoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvaW8vRmlsZTtbTGphdmEvbGFuZy9TdHJpbmc7KVYIAUoBAAhNaXNzaW5nIAgBTAEACSBpbiBkaXI6IAoAdQFODAFPAHoBAA9nZXRBYnNvbHV0ZVBhdGgKAAEBUQwAVABACgABAVMMAVQBVQEADnByb2Nlc3NBcmNoaXZlAQAkKExqYXZhL2lvL0ZpbGU7W0xqYXZhL2xhbmcvU3RyaW5nOylWAQAEZmlsZQEACGV4cGVjdGVkAQAFYXJyYXkBAA5wcm9jZXNzRmVhdHVyZQcBWwEAFWphdmEvdXRpbC96aXAvWmlwRmlsZQoBWgFdDAAmAV4BABIoTGphdmEvaW8vRmlsZTtJKVYKAVoBYAwBYQFiAQAHZW50cmllcwEAGSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsLAWQBZgcBZQEAFWphdmEvdXRpbC9FbnVtZXJhdGlvbgwBZwDUAQALbmV4dEVsZW1lbnQHAWkBABZqYXZhL3V0aWwvemlwL1ppcEVudHJ5CgFoAWsMAWwAegEAB2dldE5hbWUKAIsBbgwBbwCPAQAHbWF0Y2hlcwoBcQBNBwFyAQAmamF2YS91dGlsL3JlZ2V4L1BhdHRlcm5TeW50YXhFeGNlcHRpb24LAWQBdAwBdQBJAQAPaGFzTW9yZUVsZW1lbnRzCAF3AQAKIGluIGZpbGU6IAoAdQFrCgFaAG8BABdMamF2YS91dGlsL3ppcC9aaXBGaWxlOwEAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247AQAFZW50cnkBABhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTsBAARuYW1lAQAHcGF0dGVybgEAAmV4AQAoTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwoAdQGDDACCAYQBABEoKVtMamF2YS9pby9GaWxlOwoAiwGGDAGHAMQBAAZsZW5ndGgKAIsBiQwBigGLAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgCqAY0MALEBjgEAHChDKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAXEBkAwBkQB6AQAKZ2V0TWVzc2FnZQEABHJvb3QBAANkaXIBAAVpbmRleAEAF2dldEJ1bmRsZUlkRnJvbU1hbmlmZXN0AQA7KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAZgBmgcBmQEAJW9yZy9lY2xpcHNlL29zZ2kvdXRpbC9NYW5pZmVzdEVsZW1lbnQMAZsBnAEAE3BhcnNlQnVuZGxlTWFuaWZlc3QBADUoTGphdmEvaW8vSW5wdXRTdHJlYW07TGphdmEvdXRpbC9NYXA7KUxqYXZhL3V0aWwvTWFwOwsBngGgBwGfAQANamF2YS91dGlsL01hcAwBoQGiAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsIAaQBADpCdW5kbGVTeW1ib2xpY05hbWUgaGVhZGVyIG5vdCBzZXQgaW4gbWFuaWZlc3QgZm9yIGJ1bmRsZTogCgCLAaYMAacBqAEAB2luZGV4T2YBAAQoSSlJCgCLAaoMAasBrAEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAa4BkAcBrwEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24KAEsBkAEABHBhdGgBAAphdHRyaWJ1dGVzAQAPTGphdmEvdXRpbC9NYXA7AQADcG9zAQAkTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb247CgABAbcMAbgAhwEAEmdldEJ1bmRsZUlkRnJvbURpcgoAiwG6DAG7AHoBAAt0b0xvd2VyQ2FzZQoAAQG9DAG+AIcBABJnZXRCdW5kbGVJZEZyb21aSVAKAAEBwAwBwQCHAQASZ2V0QnVuZGxlSWRGcm9tSkFSCgFaASAIAcQBABheLiovTUVUQS1JTkYvTUFOSUZFU1QuTUYKAVoBxgwBxwHIAQAOZ2V0SW5wdXRTdHJlYW0BAC8oTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAAQHKDAGVAZYIAcwBADNCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgaW4gYnVuZGxlOiAIAc4BABRNRVRBLUlORi9NQU5JRkVTVC5NRgoAdQHQDAAmAdEBACMoTGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspVgoAdQHTDAHUAEkBAAZpc0ZpbGUIAdYBACxCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgYXQ6IAoB2AGQBwHZAQAdamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb24BAAxtYW5pZmVzdEZpbGUBAB9MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247AQAUZ2V0RmlsZUZyb21QQUNLRURKQVIBAB4oTGphdmEvaW8vRmlsZTspTGphdmEvaW8vRmlsZTsKAd8B4QcB4AEARW9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcgwB4gHjAQASZ2V0VW5wYWNrUHJvY2Vzc29yAQBfKExqYXZhL3V0aWwvUHJvcGVydGllczspTG9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcjsKAAEB5QwB5gB6AQARZ2V0VGVtcFdvcmtpbmdEaXIKAd8B6AwB6QBAAQATc2V0V29ya2luZ0RpcmVjdG9yeQoB3wHrDAHsAd0BAApwcm9jZXNzSmFyAQAGdG1wamFyAQAMamFycHJvY2Vzc29yAQBHTG9yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvcjsBABNnZXREaXJlY3RvcnlUb0NoZWNrCQABAfIMACEABgEAEGJ1bmRsZURpclRvQ2hlY2sBABFzZXRDb25maWdGaWxlbmFtZQcB9gEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoB9QH4DAAmAfkBABMoTGphdmEvaW8vRmlsZTtaSSlWCgH1AfsMAfwB/QEAC2dldEphckVudHJ5AQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL2phci9KYXJFbnRyeTsIAf8BACxCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6IAoB9QBvCgH1AcYBAANqYXIBABdMamF2YS91dGlsL2phci9KYXJGaWxlOwEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwkAAQIGDAAiAAYKAAECCAwCCQB6AQATZ2V0RmVhdHVyZURpcmVjdG9yeQoAAQILDAHcAd0KAAECDQwCDgCHAQAMZ2V0RmVhdHVyZUlkCgABAhAMARMBFAoAAQISDAFZAKcBABBmYWlsdXJlc09jY3VycmVkCgABAhUMAhYAhwEAE2dldEZlYXR1cmVJZEZyb21EaXIKAAECGAwCGQCHAQATZ2V0RmVhdHVyZUlkRnJvbUpBUggCGwEAC2ZlYXR1cmUueG1sCAIdAQAxRmVhdHVyZSBqYXIgZG9lcyBub3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGU6IAoAAQIfDAIgAiEBABhnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwBACkoTGphdmEvaW8vSW5wdXRTdHJlYW07KUxqYXZhL2xhbmcvU3RyaW5nOwoCIwGQBwIkAQAuamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgoCJgGQBwInAQAYb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uAQAwTGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247AQAaTG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsIAisBABpGZWF0dXJlLnhtbCBub3QgZm91bmQgYXQ6IAoAAQItDAIgAIcBAAtmZWF0dXJlRmlsZQoAAQIwDAIxAjIBAAZnZXRET00BACYoTGphdmEvaW8vRmlsZTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwoAAQI0DAI1AjYBABNnZXRGZWF0dXJlSWRGcm9tRE9NAQAqKExvcmcvdzNjL2RvbS9Eb2N1bWVudDspTGphdmEvbGFuZy9TdHJpbmc7AQAIZG9jdW1lbnQBABZMb3JnL3czYy9kb20vRG9jdW1lbnQ7CAI6AQAHZmVhdHVyZQsCPAI+BwI9AQAUb3JnL3czYy9kb20vRG9jdW1lbnQMAj8CQAEAFGdldEVsZW1lbnRzQnlUYWdOYW1lAQAqKExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL3czYy9kb20vTm9kZUxpc3Q7CwJCAkQHAkMBABRvcmcvdzNjL2RvbS9Ob2RlTGlzdAwCRQDEAQAJZ2V0TGVuZ3RoCwJCAkcMAkgCSQEABGl0ZW0BABUoSSlMb3JnL3czYy9kb20vTm9kZTsHAksBABNvcmcvdzNjL2RvbS9FbGVtZW50CwJKAk0MAk4CTwEADWdldEF0dHJpYnV0ZXMBABwoKUxvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXA7CADlCwJSAlQHAlMBABhvcmcvdzNjL2RvbS9OYW1lZE5vZGVNYXAMAlUCVgEADGdldE5hbWVkSXRlbQEAJihMamF2YS9sYW5nL1N0cmluZzspTG9yZy93M2MvZG9tL05vZGU7CwJYAloHAlkBABBvcmcvdzNjL2RvbS9Ob2RlDAJbAHoBAAxnZXROb2RlVmFsdWUBAA9mZWF0dXJlRWxlbWVudHMBABZMb3JnL3czYy9kb20vTm9kZUxpc3Q7AQAOZmVhdHVyZUVsZW1lbnQBABVMb3JnL3czYy9kb20vRWxlbWVudDsBAAtmZWF0dXJlTm9kZQEAEkxvcmcvdzNjL2RvbS9Ob2RlOwEADWFOYW1lZE5vZGVNYXABABpMb3JnL3czYy9kb20vTmFtZWROb2RlTWFwOwEAC2lkQXR0cmlidXRlCgABAmYMAjECZwEALShMamF2YS9pby9JbnB1dFN0cmVhbTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwEABnN0cmVhbQcCagEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIHAmwBABJqYXZhL2lvL0ZpbGVSZWFkZXIKAmsBIAoCaQJvDAAmAnABABMoTGphdmEvaW8vUmVhZGVyOylWBwJyAQAXb3JnL3htbC9zYXgvSW5wdXRTb3VyY2UKAnECbwoCdQJ3BwJ2AQAoamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQwCeAJ5AQALbmV3SW5zdGFuY2UBACwoKUxqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwoCdQJ7DAJ8An0BABJuZXdEb2N1bWVudEJ1aWxkZXIBACUoKUxqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXI7CgJ/AoEHAoABACFqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXIMAoICgwEABXBhcnNlAQAxKExvcmcveG1sL3NheC9JbnB1dFNvdXJjZTspTG9yZy93M2MvZG9tL0RvY3VtZW50OwoCJgBNCgJpAG8KAiMATQgCiAEALkVycm9yOiBjb3VsZCBub3QgcGFyc2UgeG1sIGluIGNsYXNzcGF0aCBmaWxlOiABAAlhRG9jdW1lbnQBAAZyZWFkZXIBABhMamF2YS9pby9CdWZmZXJlZFJlYWRlcjsBAAtpbnB1dFNvdXJjZQEAGUxvcmcveG1sL3NheC9JbnB1dFNvdXJjZTsBAAdmYWN0b3J5AQAqTGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3Rvcnk7AQAHYnVpbGRlcgEAI0xqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXI7AQADbXNnCgJxApQMACYBMwEAEmdldE91dHB1dERpcmVjdG9yeQkAAQKXDAAjAAYBABJzZXRPdXRwdXREaXJlY3RvcnkJAAECmgwAJAAlCAKcAQAPbGF5b3V0Q2hlY2sudHh0CgABAp4MApUAegoAZAEAAQAOb3V0cHV0RmlsZW5hbWUBAApTb3VyY2VGaWxlAQATVGVzdExheW91dFRlc3QuamF2YQAhAAEAAwAAAA4AGgAFAAYAAQAHAAAAAgAIABoACgAGAAEABwAAAAIACwAaAA0ABgABAAcAAAACAA4AGgAQAAYAAQAHAAAAAgARAAIAEwAGAAAAGgAUAAYAAQAH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KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFyczsKCmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLkpBUkZpbGVOYW1lRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwppbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwppbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwoKLyoqCiAqIEBzaW5jZSAzLjMKICovCnB1YmxpYyBjbGFzcyBUZXN0TGF5b3V0VGVzdCBleHRlbmRzIFRlc3RKYXJzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiAgICAgICAgPSAiLmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLnBhY2suZ3oiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9aSVAgICAgICAgID0gIi56aXAiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JVTkRMRV9JRCAgID0gIkJ1bmRsZS1TeW1ib2xpY05hbWUiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVuYW1lICAgICAgID0gImNvbmZpZy5wcm9wZXJ0aWVzIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREZUX0JJTl9KQVIgICAgICA9ICJkZWZhdWx0LmJpbmFyeS5qYXIiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERlRfU1JDX0pBUiAgICAgID0gImRlZmF1bHQuc291cmNlLmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RGVF9GRUFUVVJFICAgICAgPSAiZGVmYXVsdC5mZWF0dXJlIjsKICAgIHByaXZhdGUgUHJvcGVydGllcyAgICAgICAgICBjb25maWc7CiAgICBwcml2YXRlIExpc3QgICAgICAgICAgICAgICAgZXJyb3JzICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgZGlyZWN0b3J5VG9DaGVjazsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICB0ZW1wV29ya2luZ0RpcjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBvdXRwdXREaXJlY3Rvcnk7CiAgICBwcml2YXRlIFJlcG9ydFdyaXRlciAgICAgICAgcmVwb3J0V3JpdGVyOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgVGVzdExheW91dFRlc3QgdGVzdGxheW91dCA9IG5ldyBUZXN0TGF5b3V0VGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXB0ZXN0Iik7CiAgICAgICAgdGVzdGxheW91dC5zZXRUZW1wV29ya2luZ0RpcigiRDovdGVtcCIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdExheW91dCgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgZXJyb3JzLmFkZChtZXNzYWdlKTsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0TGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIkNoZWNrIGZpbGVzIGFuZCBsYXlvdXQgaW4gYnVuZGxlcyBhbmQgZmVhdHVyZXMuIik7CiAgICAgICAgICAgIGJvb2xlYW4gZmVhdHVyZUZhaWx1cmVzID0gdGVzdEZlYXR1cmVMYXlvdXQoKTsKICAgICAgICAgICAgYm9vbGVhbiBidW5kbGVGYWlsdXJlcyA9IHRlc3RCdW5kbGVMYXlvdXQoKTsKICAgICAgICAgICAgcmVzdWx0ID0gZmVhdHVyZUZhaWx1cmVzIHx8IGJ1bmRsZUZhaWx1cmVzOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkuY2xvc2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gdGVzdEJ1bmRsZUxheW91dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgogICAgICAgIGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwoKCiAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKCiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBKQVJGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIGludCBjaGVja2VkID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0QnVuZGxlSWQoY2hpbGQpOwogICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGlkLmVuZHNXaXRoKCIuc291cmNlIikgfHwgaWQuZW5kc1dpdGgoIi5pbmZvcG9wIikgfHwgaWQuZW5kc1dpdGgoIi5kb2MudXNlciIpIHx8IGlkLmVuZHNXaXRoKCIuZG9jIikgfHwgaWQuZW5kc1dpdGgoIi5kb2MuaXN2IikgfHwgaWQuZW5kc1dpdGgoIi5kb2MuZGV2IikgfHwgaWQuZW5kc1dpdGgoIi5kb2MuYXBpIikgfHwgaWQuZW5kc1dpdGgoInN0YW5kYXJkLnNjaGVtYXMiKSB8fCBpZC5lbmRzV2l0aCgiLmJyYW5kaW5nIikpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQnVuZGxlKGNoaWxkLCBnZXRFeHBlY3RlZChpZCwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrZWQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCdW5kbGUoY2hpbGQsIGdldEV4cGVjdGVkKGlkLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrZWQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNraW5nOiAiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm4gYSBzZXQgb2YgcmVndWxhciBleHByZXNzaW9ucwogICAgICogd2hpY2ggbWF0Y2ggdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGJ1bmRsZS4KICAgICAqLwogICAgcHJpdmF0ZSBTZXQgZ2V0RXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSkgewogICAgICAgIC8vIGlzIHRoZSBjb25maWcgY2FjaGVkPwogICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgewogICAgICAgICAgICBnZXRDb25maWcoKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoaWQpOwogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX1NSQ19KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX0JJTl9KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6ICIgKyBpZCk7CiAgICAgICAgfQogICAgICAgIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwogICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIHsKICAgICAgICAgICAgcmVzdWx0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIFNldCBnZXRGZWF0dXJlRXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSwgYm9vbGVhbiB6aXApIHsKICAgICAgICAvLyBpcyB0aGUgY29uZmlnIGNhY2hlZD8KICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKICAgICAgICAgICAgZ2V0Q29uZmlnKCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBsaW5lID0gY29uZmlnLmdldFByb3BlcnR5KGlkKTsKICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoS0VZX0RGVF9GRUFUVVJFKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHNldHRpbmdzIGZvcjogIiArIGlkKTsKICAgICAgICB9CiAgICAgICAgU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7CiAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewogICAgICAgICAgICByZXN1bHQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBnZXRDb25maWcoKSB7CiAgICAgICAgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlYWQgdGhpcyBmaWxlLCBpdCdzIGJlZW4gc2V0IGJ5IGNhbGxlcgogICAgICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdGaWxlbmFtZSgpKTsKICAgICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGVsc2UsIHVzZSB0aGUgZGVmYXVsdCB3ZSAic2hpcCIKICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0Q29uZmlnRmlsZW5hbWUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubG9hZChpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogUHJvY2VzcyB0aGUgYnVuZGxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggdGhlIGdpdmVuIHNldCBvZgogICAgICogZXhwZWN0ZWQgcmVzdWx0cy4KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdW5kbGUoRmlsZSBmaWxlLCBTZXQgZXhwZWN0ZWQpIHsKICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBleHBlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZXhwZWN0ZWQuc2l6ZSgpXSk7CiAgICAgICAgICAgIHByb2Nlc3NEaXIoIiIsIGZpbGUsIGFycmF5KTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgYXJyYXlbaV0gKyAiIGluIGRpcjogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcm9jZXNzQXJjaGl2ZShmaWxlLCAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShGaWxlIGZpbGUsIFNldCBleHBlY3RlZCkgewogICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKTsKICAgICAgICAgICAgcHJvY2Vzc0RpcigiIiwgZmlsZSwgYXJyYXkpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGFkZEVycm9yKCJNaXNzaW5nICIgKyBhcnJheVtpXSArICIgaW4gZGlyOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByb2Nlc3NBcmNoaXZlKGZpbGUsIChTdHJpbmdbXSkgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nW2V4cGVjdGVkLnNpemUoKV0pKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBidW5kbGUgaXMgYW4gYXJjaGl2ZS4gTWFrZSBzdXJlIGl0IGhhcyB0aGUgcmlnaHQgY29udGVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXJjaGl2ZShGaWxlIGZpbGUsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgWmlwRmlsZSB6aXAgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHppcCA9IG5ldyBaaXBGaWxlKGZpbGUsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gemlwLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGV4cGVjdGVkW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLm1hdGNoZXMocGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgZXhwZWN0ZWRbaV0gKyAiIGluIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB6aXAuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBUaGUgYnVuZGxlIGlzIGluIGEgZGlyZWN0b3J5LgogICAgICovCiAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcihTdHJpbmcgcm9vdCwgRmlsZSBkaXIsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZGlyLmxpc3RGaWxlcygpOwogICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByb290Lmxlbmd0aCgpID09IDAgPyBjaGlsZC5nZXROYW1lKCkgOiByb290ICsgJy8nICsgY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICBpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgcHJvY2Vzc0RpcihuYW1lLCBjaGlsZCwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBleHBlY3RlZFtpXTsKICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubWF0Y2hlcyhwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21NYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0JVTkRMRV9JRCk7CiAgICAgICAgICAgIGlmICgoaWQgPT0gbnVsbCkgfHwgKGlkLmxlbmd0aCgpID09IDApKSB7CiAgICAgICAgICAgICAgICBhZGRFcnJvcigiQnVuZGxlU3ltYm9saWNOYW1lIGhlYWRlciBub3Qgc2V0IGluIG1hbmlmZXN0IGZvciBidW5kbGU6ICIgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2FuIGJlIGZvbGxvd2VkIGJ5IGF0dHJpYnV0ZXMgc3VjaCBhcwogICAgICAgICAgICAgICAgLy8gJ3NpbmdsZXRvbicKICAgICAgICAgICAgICAgIGludCBwb3MgPSBpZC5pbmRleE9mKCc7Jyk7CiAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDAsIHBvcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkZW50aWZpZXIgZm9yIHRoZSBidW5kbGUgY29udGFpbmVkIGluIHRoZSBnaXZlbgogICAgICogYXJjaGl2ZS9kaXJlY3RvcnkuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkKEZpbGUgZmlsZSkgewogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbURpcihmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fWklQKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbVpJUChmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbUpBUihmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkRnJvbVpJUChGaWxlIGZpbGUpIHsKICAgICAgICBaaXBGaWxlIHppcCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7CiAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CiAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5tYXRjaGVzKCJeLiovIiArIEphckZpbGUuTUFOSUZFU1RfTkFNRSkpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ1bmRsZUlkRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgIC8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHppcC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBtYW5pZmVzdCAoTUFOSUZFU1QuTUYpIG5vdCBmb3VuZCBpbiBidW5kbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGFuIGV4cGFuZGVkIGJ1bmRsZSBvbiBkaXNjLiBMb29rIGludG8gdGhlCiAgICAgKiBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlSWRGcm9tRGlyKEZpbGUgZGlyKSB7CiAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGRpciwgSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSB8fCAhbWFuaWZlc3RGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgIGFkZEVycm9yKCJCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgYXQ6ICIgKyBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlkID0gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QobmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpLCBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBnaXZlbiBmaWxlIHBvaW50cyB0byBhIGJ1bmRsZSBjb250YWluZWQgaW4gYW4gYXJjaGl2ZS4gTG9vayBpbnRvCiAgICAgKiB0aGUgYnVuZGxlIG1hbmlmZXN0IGZpbGUgdG8gZmluZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVBBQ0tFREpBUihGaWxlIGZpbGUpIHsKCiAgICAgICAgRmlsZSB0bXBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphclByb2Nlc3NvciBqYXJwcm9jZXNzb3IgPSBKYXJQcm9jZXNzb3IuZ2V0VW5wYWNrUHJvY2Vzc29yKG51bGwpOwogICAgICAgICAgICBqYXJwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgdG1wamFyID0gamFycHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRtcGphcjsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlbmFtZSgpIHsKICAgICAgICByZXR1cm4gY29uZmlnRmlsZW5hbWU7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZW5hbWUoU3RyaW5nIGNvbmZpZ0ZpbGVuYW1lKSB7CiAgICAgICAgdGhpcy5jb25maWdGaWxlbmFtZSA9IGNvbmZpZ0ZpbGVuYW1lOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bwogICAgICogdGhlIGJ1bmRsZSBtYW5pZmVzdCBmaWxlIHRvIGZpbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5wdXQgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogICAgICAgICAgICByZXR1cm4gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QoaW5wdXQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBXb3JraW5nRGlyKCkgewogICAgICAgIHJldHVybiB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsKICAgICAgICB0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHRlc3RGZWF0dXJlTGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCA9IGZhbHNlOwogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShnZXRGZWF0dXJlRGlyZWN0b3J5KCkpOwogICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICBpbnQgY2hlY2tlZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgIGlmIChjaGlsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUikpIHsKICAgICAgICAgICAgICAgIGNoaWxkID0gZ2V0RmlsZUZyb21QQUNLRURKQVIoY2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRGZWF0dXJlSWQoY2hpbGQpOwogICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmVhdHVyZShjaGlsZCwgZ2V0RmVhdHVyZUV4cGVjdGVkKGlkLCB0cnVlLCBjaGlsZC5nZXROYW1lKCkuZW5kc1dpdGgoRVhURU5TSU9OX1pJUCkpKTsKICAgICAgICAgICAgICAgICAgICBjaGVja2VkKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNraW5nOiAiICsgZ2V0RmVhdHVyZURpcmVjdG9yeSgpKTsKICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIi4iKTsKICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgICBFcnJvcnMgZm91bmQ6ICIgKyBlcnJvcnMuc2l6ZSgpKTsKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VycmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJyZWQ7CgogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZChGaWxlIGZpbGUpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgaWQgPSBnZXRGZWF0dXJlSWRGcm9tRGlyKGZpbGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEVYVEVOU0lPTl9KQVIpKSB7CiAgICAgICAgICAgIGlkID0gZ2V0RmVhdHVyZUlkRnJvbUpBUihmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7CiAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KCJmZWF0dXJlLnhtbCIpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRkRXJyb3IoIkZlYXR1cmUgamFyIGRvZXMgbm90IGNvbnRhaW4gYSBmZWF0dXJlLnhtbCBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5wdXQgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogICAgICAgICAgICBpZCA9IGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgamFyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlSWRGcm9tRGlyKEZpbGUgZGlyKSB7CiAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKICAgICAgICBGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoZGlyLCAiZmVhdHVyZS54bWwiKTsKICAgICAgICBpZiAoIWZlYXR1cmVGaWxlLmV4aXN0cygpIHx8ICFmZWF0dXJlRmlsZS5pc0ZpbGUoKSkgewogICAgICAgICAgICBhZGRFcnJvcigiRmVhdHVyZS54bWwgbm90IGZvdW5kIGF0OiAiICsgZmVhdHVyZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWQgPSBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoZmVhdHVyZUZpbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUZyb21GZWF0dXJlWE1MKEZpbGUgZmlsZSkgewogICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZ2V0RE9NKGZpbGUpOwogICAgICAgIHJldHVybiBnZXRGZWF0dXJlSWRGcm9tRE9NKGRvY3VtZW50KTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlSWRGcm9tRE9NKERvY3VtZW50IGRvY3VtZW50KSB7CiAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICBOb2RlTGlzdCBmZWF0dXJlRWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZmVhdHVyZSIpOwogICAgICAgICAgICBFbGVtZW50IGZlYXR1cmVFbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgaWYgKGZlYXR1cmVFbGVtZW50cy5nZXRMZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgIE5vZGUgZmVhdHVyZU5vZGUgPSBmZWF0dXJlRWxlbWVudHMuaXRlbSgwKTsKICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBmZWF0dXJlRWxlbWVudCA9IChFbGVtZW50KSBmZWF0dXJlTm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmVhdHVyZUVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGFOYW1lZE5vZGVNYXAgPSBmZWF0dXJlRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICAgICBOb2RlIGlkQXR0cmlidXRlID0gYU5hbWVkTm9kZU1hcC5nZXROYW1lZEl0ZW0oImlkIik7CiAgICAgICAgICAgICAgICBpZCA9IGlkQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRET00oc3RyZWFtKTsKICAgICAgICByZXR1cm4gZ2V0RmVhdHVyZUlkRnJvbURPTShkb2N1bWVudCk7CiAgICB9CgogICAgcHJpdmF0ZSBEb2N1bWVudCBnZXRET00oRmlsZSBmaWxlKSB7CgogICAgICAgIERvY3VtZW50IGFEb2N1bWVudCA9IG51bGw7CiAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOwogICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOwogICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKICAgICAgICAgICAgYURvY3VtZW50ID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIG9uZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoYURvY3VtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvcjogY291bGQgbm90IHBhcnNlIHhtbCBpbiBjbGFzc3BhdGggZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYURvY3VtZW50OwoKICAgIH0KCiAgICBwcml2YXRlIERvY3VtZW50IGdldERPTShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKCiAgICAgICAgRG9jdW1lbnQgYURvY3VtZW50ID0gbnVsbDsKICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOwogICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CiAgICAgICAgYURvY3VtZW50ID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7CgogICAgICAgIHJldHVybiBhRG9jdW1lbnQ7CgogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgUmVwb3J0V3JpdGVyIGdldFJlcG9ydFdyaXRlcigpIHsKICAgICAgICBpZiAocmVwb3J0V3JpdGVyID09IG51bGwpIHsKICAgICAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVuYW1lID0gImxheW91dENoZWNrLnR4dCI7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlciA9IG5ldyBSZXBvcnRXcml0ZXIoZ2V0T3V0cHV0RGlyZWN0b3J5KCksIG91dHB1dEZpbGVuYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydFdyaXRlcjsKICAgIH0KfQpQSwMECgAACAAAj7VHQCujM0ZAHAAAQBwAAC0AAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3QuY2xhc3PK/rq+AAAAMQFABwACAQAnb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0BwAEAQAkb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1Rlc3RKYXJzAQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAQuamFyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIIAAwBAAwuamFyLnBhY2suZ3oBAApuYW1lUGFyc2VyAQAwTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAOb3V0cHV0RmlsZW5hbWUBAA9vdXRwdXREaXJlY3RvcnkBABBkaXJlY3RvcnlUb0NoZWNrAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlBwAWAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgoAFQAYDAAZABMBAAY8aW5pdD4JAAEAGwwADQAOCAAdAQAPcGFjazIwMGRhdGEudHh0CQABAB8MAA8ABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQoAAwAYAQAEdGhpcwEAKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAGAgAKQEAEEQ6XHRlbXBcc3RhZ2luZ1wKAAEAKwwALAAtAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAvDAAwADEBAA50ZXN0QnVuZGxlUGFjawEAAygpWgoAMwA1BwA0AQATamF2YS9pby9JT0V4Y2VwdGlvbgwANgATAQAPcHJpbnRTdGFja1RyYWNlAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAE2dldERpcmVjdG9yeVRvQ2hlY2sBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQA/DAARAAYBABBidW5kbGVEaXJUb0NoZWNrAQAKRXhjZXB0aW9ucwcAQwEADGphdmEvaW8vRmlsZQoAAQBFDABGAD0BABJnZXRCdW5kbGVEaXJlY3RvcnkKAEIASAwAGQAtCgABAEoMAEsATAEAEGNoZWNrRmlsZXNQYWNrZWQBABEoTGphdmEvaW8vRmlsZTspWgEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAA9mYWlsdXJlc09jY3VyZWQBAAFaBwBSAQATamF2YS91dGlsL0FycmF5TGlzdAoAUQAYBwBVAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgoAVAAYCgBCAFgMAFkAWgEACWxpc3RGaWxlcwEAKShMamF2YS9pby9GaWxlbmFtZUZpbHRlcjspW0xqYXZhL2lvL0ZpbGU7BwBcAQAxb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlcgoAWwAYCgABAF8MAGAAYQEADG5vcGFja2VkRmlsZQEALyhbTGphdmEvaW8vRmlsZTtbTGphdmEvaW8vRmlsZTspW0xqYXZhL2lvL0ZpbGU7CgBCAGMMAGQAPQEAB2dldE5hbWUKAEIAZgwAZwAxAQAGaXNGaWxlCgABAGkMAGoAawEADGdldEJhc2ljTmFtZQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgAVAG0MAG4AbwEABXBhcnNlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaBwBxAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAHMAdQcAdAEAEGphdmEvbGFuZy9TdHJpbmcMAHYAdwEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAcABICAB6AQAxIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB2ZXJzaW9uIChpdCBpcyB1bnBhcnNhYmxlKQoAcAB8DAB9AH4BAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAHAAgAwAgQA9AQAIdG9TdHJpbmcLAIMAhQcAhAEADmphdmEvdXRpbC9MaXN0DACGAIcBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAAEAiQwAigBMAQAMY29udGFpbnNKYXZhCACMAQAgIGNvbnRhaW5zIGphdmEgYnV0IGlzIG5vdCBwYWNrZWQKAAEAjgwAjwCQAQAMcHJpbnRTdW1tYXJ5AQAzKExqYXZhL3V0aWwvTGlzdDtbTGphdmEvaW8vRmlsZTtbTGphdmEvaW8vRmlsZTtJSSlWCwCDAJIMAJMAlAEABHNpemUBAAMoKUkBAAZlcnJvcnMBABBMamF2YS91dGlsL0xpc3Q7AQALamFyY2hpbGRyZW4BAA9bTGphdmEvaW8vRmlsZTsBAA5wYWNrZWRjaGlsZHJlbgEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEACWJhc2ljTmFtZQEABXZhbGlkBwCjAQApb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIKAAEApQwApgA9AQASZ2V0T3V0cHV0RGlyZWN0b3J5CgCiAKgMABkAqQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoAogCrDACsABMBAAd3cml0ZWxuCACuAQAWICAgRGlyZWN0b3J5IGNoZWNrZWQ6IAoAogCwDACsAC0IALIBACggQ2hlY2sgb2YgcGFja2VkIGFuZCBub3QgcGFja2VkIGJ1bmRsZXMuCAC0AQAXICAgTnVtYmVyIG9mIGphciBmaWxlcyAKAHAAtgwAfQC3AQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgAuQEAGyAgIE51bWJlciBvZiBwYWNrLmd6IGZpbGVzIAgAuwEALSAgIERpZmZlcmVuY2UsIG51bWJlciBvZiBqYXIgZmlsZXMgdG8gY2hlY2s6IAgAvQEACyAgIENoZWNrZWQgCAC/AQAEIG9mIAgAwQEAAS4IAMMBABEgICBFcnJvcnMgZm91bmQ6IAoAxQDHBwDGAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDADIAMkBAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgsAgwDLDADMAM0BAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAM8A0QcA0AEAEmphdmEvdXRpbC9JdGVyYXRvcgwA0gDTAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CgCiANUMAKwA1gEAFShMamF2YS9sYW5nL09iamVjdDspVgsAzwDYDADZADEBAAdoYXNOZXh0CgCiANsMANwAEwEABWNsb3NlAQAMcmVwb3J0V3JpdGVyAQArTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwEABGl0ZXIBABRMamF2YS91dGlsL0l0ZXJhdG9yOwoAAQDiDADjAOQBAAhjb250YWlucwEAIChbTGphdmEvaW8vRmlsZTtMamF2YS9pby9GaWxlOylaCgBRAIUKAFEAkgoAUQDLAQAHcmVzdWx0cwEAFUxqYXZhL3V0aWwvQXJyYXlMaXN0OwEABGZpbGUBAAlmaWxlQXJyYXkKAHMA7QwA7gCHAQAGZXF1YWxzAQAGcmVzdWx0BwDxAQAVamF2YS91dGlsL2phci9KYXJGaWxlCgDwAPMMABkA9AEAEyhMamF2YS9pby9GaWxlO1pJKVYKAPAA9gwA9wD4AQAHZW50cmllcwEAGSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsLAPoA/AcA+wEAFWphdmEvdXRpbC9FbnVtZXJhdGlvbgwA/QDTAQALbmV4dEVsZW1lbnQHAP8BABZqYXZhL3V0aWwvamFyL0phckVudHJ5CgD+AGMIAQIBAAYuY2xhc3MKAHMBBAwBBQBvAQAIZW5kc1dpdGgKAPABBwwBCAEJAQAOZ2V0SW5wdXRTdHJlYW0BAC8oTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwoAAQELDACKAQwBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVoLAPoBDgwBDwAxAQAPaGFzTW9yZUVsZW1lbnRzCgDwANsBAAdqYXJmaWxlAQADamFyAQAXTGphdmEvdXRpbC9qYXIvSmFyRmlsZTsBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEABWVudHJ5AQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7AQAFaW5wdXQBABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAxTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS91dGlsL2phci9KYXJFbnRyeTs+OwcBHAEAHGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW0KARsBHgwAGQEfAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgEbASEMASIBIwEADGdldE5leHRFbnRyeQEAGigpTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgElAGMHASYBABZqYXZhL3V0aWwvemlwL1ppcEVudHJ5CgEbASgMASkAlAEACWF2YWlsYWJsZQoBKwDbBwEsAQATamF2YS9pby9JbnB1dFN0cmVhbQEADmphcklucHV0U3RyZWFtAQAeTGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW07AQAYTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgBzATEMATIBMwEAC2xhc3RJbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJCgBzATUMATYBNwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBAAhmdWxsbmFtZQEACWV4dGVuc2lvbgEAA3BvcwkAAQE8DAAQAAYBABJzZXRPdXRwdXREaXJlY3RvcnkBAApTb3VyY2VGaWxlAQAQUGFjazIwMFRlc3QuamF2YQAhAAEAAwAAAAYAGgAFAAYAAQAHAAAAAgAIABoACgAGAAEABwAAAAIACwAKAA0ADgAAAAoADwAGAAAAAgAQAAYAAAACABEABgAAAA8ACAASABMAAQAUAAAAOAACAAAAAAAQuwAVWbcAF7MAGhIcswAesQAAAAIAIAAA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dXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIAogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwppbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwppbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5GdWxsSmFyTmFtZVBhcnNlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLlBhY2tHekZpbGVOYW1lRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CgovKioKICogQHNpbmNlIDMuMwogKi8KcHVibGljIGNsYXNzIFBhY2syMDBUZXN0IGV4dGVuZHMgVGVzdEphcnMgewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgIEVYVEVOU0lPTl9KQVIgICAgICAgID0gIi5qYXIiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgICAgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLmphci5wYWNrLmd6IjsKICAgIHByaXZhdGUgc3RhdGljIEZ1bGxKYXJOYW1lUGFyc2VyIG5hbWVQYXJzZXIgICAgICAgICAgID0gbmV3IEZ1bGxKYXJOYW1lUGFyc2VyKCk7CiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgICAgICBvdXRwdXRGaWxlbmFtZSAgICAgICA9ICJwYWNrMjAwZGF0YS50eHQiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5OwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5VG9DaGVjazsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIFBhY2syMDBUZXN0IHRlc3RsYXlvdXQgPSBuZXcgUGFjazIwMFRlc3QoKTsKICAgICAgICB0ZXN0bGF5b3V0LnNldERpcmVjdG9yeVRvQ2hlY2soIkQ6XFx0ZW1wXFxzdGFnaW5nXFwiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICB0ZXN0bGF5b3V0LnRlc3RCdW5kbGVQYWNrKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAgIH0KCgogICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgewogICAgICAgIHJldHVybiBkaXJlY3RvcnlUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVRvQ2hlY2soU3RyaW5nIGJ1bmRsZURpclRvQ2hlY2spIHsKICAgICAgICB0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RCdW5kbGVQYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNQYWNrZWQoaW5wdXRkaXIpOwogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZXNQYWNrZWQoRmlsZSBpbnB1dGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyByZXNldC9pbml0aWFsaXplIGVycm9ycwogICAgICAgIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgRmlsZVtdIGphcmNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBKQVJGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBGaWxlW10gcGFja2VkY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IFBhY2tHekZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIEZpbGVbXSBub3BhY2tlZEZpbGUgPSBub3BhY2tlZEZpbGUoamFyY2hpbGRyZW4sIHBhY2tlZGNoaWxkcmVuKTsKICAgICAgICBpbnQgdG90YWxzaXplID0gbm9wYWNrZWRGaWxlLmxlbmd0aDsKICAgICAgICBpbnQgY2hlY2tlZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbHNpemU7IGkrKykgewogICAgICAgICAgICBGaWxlIGNoaWxkID0gbm9wYWNrZWRGaWxlW2ldOwogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKICAgICAgICAgICAgLy8gYXNzdW1lIGRpcmVjdG9yeSBpZiBub3QgZmlsZQogICAgICAgICAgICBpZiAoY2hpbGQuaXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgIGNoZWNrZWQrKzsKCiAgICAgICAgICAgICAgICBTdHJpbmcgYmFzaWNOYW1lID0gZ2V0QmFzaWNOYW1lKG5hbWUsIEVYVEVOU0lPTl9KQVIpOwogICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9IG5hbWVQYXJzZXIucGFyc2UoYmFzaWNOYW1lKTsKLy8gU3RyaW5nIGJ1bmRsZW5hbWUgPSBiYXNpY05hbWU7CiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuYW1lICsgIiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoY2hpbGQpKSB7Ci8vIGJ1bmRsZW5hbWUgPSBuYW1lUGFyc2VyLmdldFByb2plY3RTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuYW1lICsgIiBjb250YWlucyBqYXZhIGJ1dCBpcyBub3QgcGFja2VkIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgcHJpbnRTdW1tYXJ5KGVycm9ycywgamFyY2hpbGRyZW4sIHBhY2tlZGNoaWxkcmVuLCB0b3RhbHNpemUsIGNoZWNrZWQpOwogICAgICAgIGlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFN1bW1hcnkoTGlzdCBlcnJvcnMsIEZpbGVbXSBqYXJjaGlsZHJlbiwgRmlsZVtdIHBhY2tlZGNoaWxkcmVuLCBpbnQgdG90YWxzaXplLCBpbnQgY2hlY2tlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgogICAgICAgIFJlcG9ydFdyaXRlciByZXBvcnRXcml0ZXIgPSBuZXcgUmVwb3J0V3JpdGVyKGdldE91dHB1dERpcmVjdG9yeSgpLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIERpcmVjdG9yeSBjaGVja2VkOiAiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiIENoZWNrIG9mIHBhY2tlZCBhbmQgbm90IHBhY2tlZCBidW5kbGVzLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgTnVtYmVyIG9mIGphciBmaWxlcyAiICsgamFyY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE51bWJlciBvZiBwYWNrLmd6IGZpbGVzICIgKyBwYWNrZWRjaGlsZHJlbi5sZW5ndGgpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgRGlmZmVyZW5jZSwgbnVtYmVyIG9mIGphciBmaWxlcyB0byBjaGVjazogIiArIChqYXJjaGlsZHJlbi5sZW5ndGggLSBwYWNrZWRjaGlsZHJlbi5sZW5ndGgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgRXJyb3JzIGZvdW5kOiAiICsgZXJyb3JzLnNpemUoKSk7CgogICAgICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZXJyb3JzKTsKICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbihpdGVyLm5leHQoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIEZpbGVbXSBub3BhY2tlZEZpbGUoRmlsZVtdIGphcmNoaWxkcmVuLCBGaWxlW10gcGFja2VkY2hpbGRyZW4pIHsKICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphcmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIEZpbGUgZmlsZSA9IGphcmNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoIWNvbnRhaW5zKHBhY2tlZGNoaWxkcmVuLCBmaWxlKSkgewogICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgRmlsZVtdIGZpbGVBcnJheSA9IG5ldyBGaWxlW3Jlc3VsdHMuc2l6ZSgpXTsKICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogICAgICAgICAgICBmaWxlQXJyYXlbaSsrXSA9IChGaWxlKSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmaWxlQXJyYXk7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKEZpbGVbXSBwYWNrZWRjaGlsZHJlbiwgRmlsZSBmaWxlKSB7CiAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2tlZGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChnZXRCYXNpY05hbWUocGFja2VkY2hpbGRyZW5baV0uZ2V0TmFtZSgpLCBFWFRFTlNJT05fUEFDRUtEX0pBUikuZXF1YWxzKGdldEJhc2ljTmFtZShmaWxlLmdldE5hbWUoKSwgRVhURU5TSU9OX0pBUikpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKYXZhKEZpbGUgamFyZmlsZSkgewogICAgICAgIC8vIFdlIGFzc3VtZSB0aGUgZmlsZSBpcyBhICdqYXInIGZpbGUuCiAgICAgICAgYm9vbGVhbiBjb250YWluc0phdmEgPSBmYWxzZTsKICAgICAgICBKYXJGaWxlIGphciA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoamFyZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgRW51bWVyYXRpb248SmFyRW50cnk+IGVudHJpZXMgPSBqYXIuZW50cmllcygpOwogICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zSmF2YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgewogICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNKYXZhKGlucHV0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgamFyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250YWluc0phdmE7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShJbnB1dFN0cmVhbSBpbnB1dCkgewogICAgICAgIC8vIFdlIGFzc3VtZSB0aGUgZmlsZSBpcyBhICdqYXInIGZpbGUuCiAgICAgICAgYm9vbGVhbiBjb250YWluc0phdmEgPSBmYWxzZTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgSmFySW5wdXRTdHJlYW0gamFySW5wdXRTdHJlYW0gPSBuZXcgSmFySW5wdXRTdHJlYW0oaW5wdXQpOwogICAgICAgICAgICB3aGlsZSAoamFySW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7CiAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IGphcklucHV0U3RyZWFtLmdldE5leHRFbnRyeSgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbnNKYXZhOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJhc2ljTmFtZShTdHJpbmcgZnVsbG5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZnVsbG5hbWU7CiAgICAgICAgaW50IHBvcyA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKGV4dGVuc2lvbik7CiAgICAgICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KCgp9ClBLAwQKAAAIAACPtUdAMLoz3sIVAADCFQAALQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdC5jbGFzc8r+ur4AAAAxARMHAAIBACdvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVmVyc2lvblRlc3QHAAQBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMBAA1FWFRFTlNJT05fSkFSAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEABC5qYXIBABRFWFRFTlNJT05fUEFDRUtEX0pBUggADAEADC5qYXIucGFjay5negEADUVYVEVOU0lPTl9aSVAIAA8BAAQuemlwAQAKbmFtZVBhcnNlcgEAMExvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyOwEACUJBQ0tTTEFTSAEADkxJVEVSQUxfUEVSSU9EAQADQU5ZAQAJdGhyZWVkb3RzAQAZTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwEAD291dHB1dERpcmVjdG9yeQEADHJlcG9ydFdyaXRlcgEAK0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBABBkaXJlY3RvcnlUb0NoZWNrAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAfDAAbABwHACEBAC5vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyCgAgAB8JAAEAJAwAEAARCAAmAQABXAkAAQAoDAASAAYHACoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoALAAuBwAtAQAQamF2YS9sYW5nL1N0cmluZwwALwAwAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgApADIMABsAMwEAFShMamF2YS9sYW5nL1N0cmluZzspVggANQEAAS4KACkANwwAOAA5AQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgApADsMADwAPQEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsJAAEAPwwAEwAGCABBAQACLioJAAEAQwwAFAAGCgBFAEcHAEYBABdqYXZhL3V0aWwvcmVnZXgvUGF0dGVybgwASABJAQAHY29tcGlsZQEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuOwkAAQBLDAAVABYBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQApTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdDsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgoAAQAfCABUAQAQRDpcdGVtcFxzdGFnaW5nXAoAAQBWDABXADMBABNzZXREaXJlY3RvcnlUb0NoZWNrCgABAFkMAFoAWwEAE3Rlc3RGZWF0dXJlVmVyc2lvbnMBAAMoKVoKAAEAXQwAXgBbAQASdGVzdEJ1bmRsZVZlcnNpb25zCgBgAGIHAGEBABNqYXZhL2lvL0lPRXhjZXB0aW9uDABjABwBAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQATZ2V0RGlyZWN0b3J5VG9DaGVjawkAAQBrDAAaAAYBABBidW5kbGVEaXJUb0NoZWNrAQAKRXhjZXB0aW9ucwcAbwEADGphdmEvaW8vRmlsZQoAAQBxDAByAD0BABJnZXRCdW5kbGVEaXJlY3RvcnkKAG4AMgoAAQB1DAB2AHcBAA9nZXRSZXBvcnRXcml0ZXIBAC0oKUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsIAHkBACUgQ2hlY2sgZm9yIDQtcGFydCB2ZXJzaW9ucyBpbiBCdW5kbGVzCgB7AH0HAHwBAClvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgwAfgAzAQAHd3JpdGVsbgoAAQCADACBAIIBABJjaGVja0ZpbGVzVmVyc2lvbnMBABEoTGphdmEvaW8vRmlsZTspWgEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAA9mYWlsdXJlc09jY3VyZWQBAAFaBwCIAQATamF2YS91dGlsL0FycmF5TGlzdAoAhwAfBwCLAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgoAigAfCgBuAI4MAI8AkAEACWxpc3RGaWxlcwEAKShMamF2YS9pby9GaWxlbmFtZUZpbHRlcjspW0xqYXZhL2lvL0ZpbGU7CgBuAJIMAJMAPQEAB2dldE5hbWUKAG4AlQwAlgBbAQAGaXNGaWxlCgAsAJgMAJkAmgEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgABAJwMAJ0AngEADGdldEJhc2ljTmFtZQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgAgAKAMAKEAmgEABXBhcnNlCACjAQAxIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB2ZXJzaW9uIChpdCBpcyB1bnBhcnNhYmxlKQsApQCnBwCmAQAOamF2YS91dGlsL0xpc3QMAKgAqQEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgoAIACrDACsAD0BABBnZXRWZXJzaW9uU3RyaW5nCgBFAK4MAK8AsAEAB21hdGNoZXIBADMoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsKALIAtAcAswEAF2phdmEvdXRpbC9yZWdleC9NYXRjaGVyDAC1AFsBAAdtYXRjaGVzCAC3AQAZIGRvZXMgbm90IGNvbnRhaW4gNCBwYXJ0cwgAuQEACyAgIENoZWNrZWQgCgApALsMADgAvAEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAL4BAAQgb2YgCADAAQARICAgRXJyb3JzIGZvdW5kOiALAKUAwgwAwwDEAQAEc2l6ZQEAAygpSQoAxgDIBwDHAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDADJAMoBAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgsApQDMDADNAM4BAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLANAA0gcA0QEAEmphdmEvdXRpbC9JdGVyYXRvcgwA0wDUAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CgB7ANYMAH4A1wEAFShMamF2YS9sYW5nL09iamVjdDspVgsA0ADZDADaAFsBAAdoYXNOZXh0AQAGZXJyb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEACGNoaWxkcmVuAQAPW0xqYXZhL2lvL0ZpbGU7AQAJdG90YWxzaXplAQABSQEAB2NoZWNrZWQBAAFpAQAFY2hpbGQBAARuYW1lAQAFdmFsaWQBAAd2ZXJzaW9uAQAZTGphdmEvdXRpbC9yZWdleC9NYXRjaGVyOwEABGl0ZXIBABRMamF2YS91dGlsL0l0ZXJhdG9yOwoALADrDADsAO0BAAtsYXN0SW5kZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQoALADvDADwAPEBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7AQAIZnVsbG5hbWUBAAlleHRlbnNpb24BAAZyZXN1bHQBAANwb3MBABR0ZXN0VmVyc2lvbnNQYXR0ZXJucwgA+AEAHUNoZWNrIDQtcGFydCB2ZXJzaW9uIHBhdHRlcm5zCgB7APoMAPsAHAEABWNsb3NlAQAPZmVhdHVyZUZhaWx1cmVzAQAOYnVuZGxlRmFpbHVyZXMKAAEA/wwBAAA9AQATZ2V0RmVhdHVyZURpcmVjdG9yeQgBAgEAJiBDaGVjayBmb3IgNC1wYXJ0IHZlcnNpb25zIGluIEZlYXR1cmVzAQASZ2V0T3V0cHV0RGlyZWN0b3J5CQABAQUMABcABgEAEnNldE91dHB1dERpcmVjdG9yeQkAAQEIDAAYABkI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ZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiBUaGlzIGZpbGUgb3JpZ2luYWxseSBjYW1lIGZyb20gJ0VjbGlwc2UgT3JiaXQnIHByb2plY3QgdGhlbiBhZGFwdGVkIHRvIHVzZSAKICogaW4gV1RQIGFuZCBpbXByb3ZlZCB0byB1c2UgJ01hbmlmZXN0JyB0byByZWFkIG1hbmlmZXN0Lm1mLCBpbnN0ZWFkIG9mIHJlYWRpbmcgCiAqIGl0IGFzIGEgcHJvcGVydGllcyBmaWxlLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuamFyczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLkZ1bGxKYXJOYW1lUGFyc2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5KQVJGaWxlTmFtZUZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwoKLyoqCiAqIEBzaW5jZSAzLjMKICovCnB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdCBleHRlbmRzIFRlc3RKYXJzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiAgICAgICAgPSAiLmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLmphci5wYWNrLmd6IjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fWklQICAgICAgICA9ICIuemlwIjsKICAgIHByaXZhdGUgRnVsbEphck5hbWVQYXJzZXIgICBuYW1lUGFyc2VyICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIEJBQ0tTTEFTSCAgICAgICAgICAgID0gIlxcIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBMSVRFUkFMX1BFUklPRCAgICAgICA9IEJBQ0tTTEFTSCArICIuIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBBTlkgICAgICAgICAgICAgICAgICA9ICIuKiI7CiAgICBwcml2YXRlIFBhdHRlcm4gICAgICAgICAgICAgdGhyZWVkb3RzICAgICAgICAgICAgPSBQYXR0ZXJuLmNvbXBpbGUoQU5ZICsgTElURVJBTF9QRVJJT0QgKyBBTlkgKyBMSVRFUkFMX1BFUklPRCArIEFOWSArIExJVEVSQUxfUEVSSU9EICsgQU5ZKTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBvdXRwdXREaXJlY3Rvcnk7CiAgICBwcml2YXRlIFJlcG9ydFdyaXRlciAgICAgICAgcmVwb3J0V3JpdGVyOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgVmVyc2lvblRlc3QgdGVzdGxheW91dCA9IG5ldyBWZXJzaW9uVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXBcXHN0YWdpbmdcXCIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEZlYXR1cmVWZXJzaW9ucygpOwogICAgICAgICAgICB0ZXN0bGF5b3V0LnRlc3RCdW5kbGVWZXJzaW9ucygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5VG9DaGVjazsKCgogICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgewogICAgICAgIHJldHVybiBkaXJlY3RvcnlUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVRvQ2hlY2soU3RyaW5nIGJ1bmRsZURpclRvQ2hlY2spIHsKICAgICAgICB0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0QnVuZGxlVmVyc2lvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwoKICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgQ2hlY2sgZm9yIDQtcGFydCB2ZXJzaW9ucyBpbiBCdW5kbGVzIik7CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0ZpbGVzVmVyc2lvbnMoaW5wdXRkaXIpOwogICAgICAgIC8vIGFzc2VydEZhbHNlKCJTb21lIGJ1bmRsZXMgZGlkIG5vdCBoYXZlIDQgcGFydCB2ZXJzaW9uIG51bWJlcnMiLCBmYWlsdXJlc09jY3VyZWQpOwogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZXNWZXJzaW9ucyhGaWxlIGlucHV0ZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzCiAgICAgICAgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBmYWxzZTsKICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKICAgICAgICAgICAgLy8gYXNzdW1lIGRpcmVjdG9yeSBpZiBub3QgZmlsZQogICAgICAgICAgICBpZiAoY2hpbGQuaXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9QQUNFS0RfSkFSKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRCYXNpY05hbWUobmFtZSwgRVhURU5TSU9OX1BBQ0VLRF9KQVIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRCYXNpY05hbWUobmFtZSwgRVhURU5TSU9OX0pBUik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fWklQKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjaGVja2VkKys7CiAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBuYW1lUGFyc2VyLnBhcnNlKG5hbWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5hbWUgKyAiIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB2ZXJzaW9uIChpdCBpcyB1bnBhcnNhYmxlKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBuYW1lUGFyc2VyLmdldFZlcnNpb25TdHJpbmcoKTsKICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHRocmVlZG90cy5tYXRjaGVyKHZlcnNpb24pOwoKICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5hbWUgKyAiIGRvZXMgbm90IGNvbnRhaW4gNCBwYXJ0cyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJhc2ljTmFtZShTdHJpbmcgZnVsbG5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZnVsbG5hbWU7CiAgICAgICAgaW50IHBvcyA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKGV4dGVuc2lvbik7CiAgICAgICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RWZXJzaW9uc1BhdHRlcm5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIkNoZWNrIDQtcGFydCB2ZXJzaW9uIHBhdHRlcm5zIik7CiAgICAgICAgICAgIGJvb2xlYW4gZmVhdHVyZUZhaWx1cmVzID0gdGVzdEZlYXR1cmVWZXJzaW9ucygpOwogICAgICAgICAgICBib29sZWFuIGJ1bmRsZUZhaWx1cmVzID0gdGVzdEJ1bmRsZVZlcnNpb25zKCk7CiAgICAgICAgICAgIHJlc3VsdCA9IGZlYXR1cmVGYWlsdXJlcyB8fCBidW5kbGVGYWlsdXJlczsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLmNsb3NlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHRlc3RGZWF0dXJlVmVyc2lvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZ2V0RmVhdHVyZURpcmVjdG9yeSgpKTsKCiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiIENoZWNrIGZvciA0LXBhcnQgdmVyc2lvbnMgaW4gRmVhdHVyZXMiKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNWZXJzaW9ucyhpbnB1dGRpcik7CiAgICAgICAgLy8gYXNzZXJ0RmFsc2UoIlNvbWUgZmVhdHVyZXMgZGlkIG5vdCBoYXZlIDQgcGFydCB2ZXJzaW9uIG51bWJlcnMiLCBmYWlsdXJlc09jY3VyZWQpOwogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CgogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgUmVwb3J0V3JpdGVyIGdldFJlcG9ydFdyaXRlcigpIHsKICAgICAgICBpZiAocmVwb3J0V3JpdGVyID09IG51bGwpIHsKICAgICAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVuYW1lID0gInZlcnNpb25QYXR0ZXJuQ2hlY2sudHh0IjsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0V3JpdGVyOwogICAgfQp9ClBLAwQKAAAIAACPtUdAReJ4bfUKAAD1CgAAKgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycy5jbGFzc8r+ur4AAAAxAHQHAAIBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAPYnVuZGxlRGlyZWN0b3J5AQASTGphdmEvbGFuZy9TdHJpbmc7AQAQZmVhdHVyZURpcmVjdG9yeQEAEGRpcmVjdG9yeVRvQ2hlY2sBAA50ZW1wV29ya2luZ0RpcgEAD291dHB1dERpcmVjdG9yeQEABjxpbml0PgEAAygpVgEABENvZGUKAAMADwwACwAMAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAJkxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnM7AQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABABcMAAgABgEAE3NldERpcmVjdG9yeVRvQ2hlY2sBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABBidW5kbGVEaXJUb0NoZWNrAQASZ2V0T3V0cHV0RGlyZWN0b3J5CQABAB0MAAoABggAHwEACHVzZXIuZGlyCgAhACMHACIBABBqYXZhL2xhbmcvU3lzdGVtDAAkACUBAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQARZ2V0VGVtcFdvcmtpbmdEaXIJAAEAKAwACQAGAQARc2V0VGVtcFdvcmtpbmdEaXIBABJzZXRPdXRwdXREaXJlY3RvcnkBABJnZXRCdW5kbGVEaXJlY3RvcnkJAAEALQwABQAGCAAvAQARYWdncmVnYXRlL3BsdWdpbnMIADEBAAdwbHVnaW5zCgABADMMABQAFQcANQEAI29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uCAA3AQAtTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuCgA0ADkMAAsAGQoAAQA7DAA8ACUBABFlbnN1cmVFbmRpbmdTbGFzaAcAPgEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgBAAEIHAEEBABBqYXZhL2xhbmcvU3RyaW5nDABDAEQBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAD0AOQoAPQBHDABIAEkBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAD0ASwwATAAVAQAIdG9TdHJpbmcH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cHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycy5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLmphcnM7CgppbXBvcnQgamF2YS5pby5GaWxlOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwoKcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RKYXJzIHsKCgogICAgcHJpdmF0ZSBTdHJpbmcgYnVuZGxlRGlyZWN0b3J5OwogICAgcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZURpcmVjdG9yeTsKICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICBwcml2YXRlIFN0cmluZyB0ZW1wV29ya2luZ0RpcjsKICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSA9PSBudWxsKSB7CiAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBXb3JraW5nRGlyKCkgewogICAgICAgIHJldHVybiB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsKICAgICAgICB0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJ1bmRsZURpcmVjdG9yeSgpIHsKICAgICAgICBpZiAoYnVuZGxlRGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gd2UgdHJ5IGJvdGggYWdncmVnYXRlL3BsdWdpbnMgYW5kIGlmIGRvZXNuJ3QgZXhpc3QsIGFzc3VtZSBwbHVnaW5zCiAgICAgICAgICAgIFN0cmluZyBBR0dSX1BMVUdJTlNfRElSID0gImFnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICAgICAgU3RyaW5nIFBMVUdJTlNfRElSID0gInBsdWdpbnMiOwogICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3BlcnR5ID0gZW5zdXJlRW5kaW5nU2xhc2gocHJvcGVydHkpOwoKICAgICAgICAgICAgLy8gdHJ5IGFnZ3JlZ2F0ZSBmaXJzdAogICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArIEFHR1JfUExVR0lOU19ESVI7CiAgICAgICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShidW5kbGVEaXJlY3RvcnkpOwogICAgICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICAgICAgLy8gdGhlbiB0cnkgbW9yZSBjb21tb24gbm9uLWFnZ3JlZ2F0ZSBwbHVnaW5zIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyBQTFVHSU5TX0RJUjsKICAgICAgICAgICAgICAgIGlucHV0ZGlyID0gbmV3IEZpbGUoYnVuZGxlRGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgYnVuZGxlRGlyZWN0b3J5ICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1bmRsZURpcmVjdG9yeTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBlbnN1cmVFbmRpbmdTbGFzaChTdHJpbmcgcHJvcGVydHkpIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcHJvcGVydHk7CiAgICAgICAgaWYgKCFyZXN1bHQuZW5kc1dpdGgoIi8iKSkgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAiLyI7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGZWF0dXJlRGlyZWN0b3J5KCkgewogICAgICAgIGlmIChmZWF0dXJlRGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gd2UgdHJ5IGJvdGggYWdncmVnYXRlL3BsdWdpbnMgYW5kIGlmIGRvZXNuJ3QgZXhpc3QsIGFzc3VtZSBwbHVnaW5zCiAgICAgICAgICAgIFN0cmluZyBBR0dSX0ZFQVRVUkVTX0RJUiA9ICJhZ2dyZWdhdGUvZmVhdHVyZXMiOwogICAgICAgICAgICBTdHJpbmcgRkVBVFVSRVNfRElSID0gImZlYXR1cmVzIjsKICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwogICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9wZXJ0eSA9IGVuc3VyZUVuZGluZ1NsYXNoKHByb3BlcnR5KTsKICAgICAgICAgICAgLy8gdHJ5IGFnZ3JlZ2F0ZSBmaXJzdAogICAgICAgICAgICBmZWF0dXJlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyBBR0dSX0ZFQVRVUkVTX0RJUjsKICAgICAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGZlYXR1cmVEaXJlY3RvcnkpOwogICAgICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICAgICAgLy8gdGhlbiB0cnkgbW9yZSBjb21tb24gbm9uLWFnZ3JlZ2F0ZSBwbHVnaW5zIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgRkVBVFVSRVNfRElSOwogICAgICAgICAgICAgICAgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmZWF0dXJlIGRpcmVjb3RyeSAoIiArIGZlYXR1cmVEaXJlY3RvcnkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmVhdHVyZURpcmVjdG9yeTsKICAgIH0KCgp9ClBLAwQKAAAIAABaqQk/xy/ubv8DAAD/AwAALQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9jb25maWcucHJvcGVydGllcyMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwKIyBhYm91dCBmaWxlLCBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmb3IgdHJhbnNsYXRpb24sCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4KZGVmYXVsdC5zb3VyY2UuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUgpkZWZhdWx0LmJpbmFyeS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbAoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBzb3VyY2UgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LAojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwKIyBhcyB3ZWxsIGFzIGEgemlwIGZpbGUgd2l0aCBzb3VyY2UgYW5kIGFuIGFib3V0LiBOb3RlIHRoZQojIGV4dHJhIGRpcmVjdG9yeSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nCmRlZmF1bHQuc291cmNlLnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQleLiovYWJvdXRcLmh0bWwKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUi4gTm90ZSB0aGUKIyBleHRyYSBkaXJlY3RvcnkgZW50cnkgYXQgdGhlIGJlZ2lubmluZwpkZWZhdWx0LmJpbmFyeS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJXi4qL2Fib3V0XC5odG1sCgoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBmZWF0dXJlCmRlZmF1bHQuZmVhdHVyZSA9IGxpY2Vuc2VcLmh0bWwsIFwKCQkoZWRsLXYxMFwuaHRtbHxlcGwtdjEwXC5odG1sKVBLAwQKAAAIAABaqQk/ToF6UXQHAAB0BwAAMQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9jb25maWdIT0xELnByb3BlcnRpZXMjIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsCiMgYWJvdXQgZmlsZSwgcGx1Z2luLnhtbCBhbmQgcGx1Z2luLnByb3BlcnRpZXMgZm9yIHRyYW5zbGF0aW9uLAojIGFzIHdlbGwgYXMgYSB6aXAgZmlsZSB3aXRoIHNvdXJjZSBhbmQgYW4gYWJvdXQuCmRlZmF1bHQuc291cmNlLmphciA9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUgpkZWZhdWx0LmJpbmFyeS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzLCBcCgkJLipcLihjbGFzc3xqYXIpJAoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBzb3VyY2UgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LAojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwKIyBhcyB3ZWxsIGFzIGEgemlwIGZpbGUgd2l0aCBzb3VyY2UgYW5kIGFuIGFib3V0LiBOb3RlIHRoZQojIGV4dHJhIGRpcmVjdG9yeSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nCmRlZmF1bHQuc291cmNlLnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQleLiovYWJvdXRcLmh0bWwsIFwKCQleLiovKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzCgojIGRlZmF1bHQgbGF5b3V0IGZvciBhIGJpbmFyeSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsIAojIGFib3V0IGZpbGUsIGFuZCBhdCBsZWFzdCBvbmUgY2xhc3MgZmlsZSBvciBKQVIuIE5vdGUgdGhlCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcKZGVmYXVsdC5iaW5hcnkuemlwID0gXi4qL01FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCV4uKi9hYm91dFwuaHRtbCwgXAoJCV4uKi8ocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMsIFwKCQkuKlwuKGNsYXNzfGphcikkCgojIHNwZWNpYWwgY2FzZSBvZiBhIGNvZGUgYnVuZGxlIG5vdCBjb250YWluaW5nIGNvZGUgPwpvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAoJCQojIHNwZWNpYWwgY2FzZSB3aXRoIG5vIGNvZGU6IGJyYW5kaW5nIGJ1bmRsZQpvcmcuZWNsaXBzZS53c3QueHNsPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAoJCQojIHNwZWNpYWwgY2FzZSB3aXRoIG5vIGNvZGU6IGJyYW5kaW5nIGJ1bmRsZQkKb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcHJvai5zZGs9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCQoKIyBzcGVjaWFsIGNhc2Ugd2l0aCBubyBjb2RlOiBicmFuZGluZyBidW5kbGUJCQkKb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcHJvai5lbmFibGVtZW50LmpkdC5zZGs9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCQoJCQojIHNwZWNpYWwgY2FzZSBvZiBhIGJ1bmRsZSB3aXRoIG5vIGNvZGUJCQpvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbCwgXAoJCS4qKHBsdWdpbnxidW5kbGUpXC5wcm9wZXJ0aWVzIAkKCQkJCQlQSwMECgAACAAAWqkJP+23nfTYAwAA2AMAADEAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvZXhjZXB0aW9ucy5wcm9wZXJ0aWVzYnJlZUV4Y2VwdGlvbnM9b3JnLmVjbGlwc2Uuc3d0LCBcCiBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLnhtbCwgXAogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcywgXAogb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnRlYW0uZXhhbXBsZXMuZmlsZXN5c3RlbSwgXAogb3JnLmVjbGlwc2UudWkuZXhhbXBsZXMuamF2YWVkaXRvciwgXAogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwsIFwKIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnNkay5leGFtcGxlcywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludCwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS50ZWFtLmV4YW1wbGVzLmZpbGVzeXN0ZW0sIFwKIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmphdmFlZGl0b3IsIFwKUEsDBAoAAAgAAI+1R0AVX0w2JCQAACQkAAAyAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcuY2xhc3PK/rq+AAAAMQFwBwACAQAsb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcHAAQBACVvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQAGRVFVQUxTAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEABmVxdWFscwEAC1NUQVJUU19XSVRICAAMAQAKc3RhcnRzV2l0aAEAFlNUQVJUV0lUSF9NQVRDSF9MRU5HVEgBAAFJAwAAAAUBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABQMABAAEQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC5Mb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmc7AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsJABwAHgcAHQEAEGphdmEvbGFuZy9TeXN0ZW0MAB8AIAEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwgAIgEAFXRlc3QgdmVyc2lvbiBjaGVja2luZwoAJAAmBwAlAQATamF2YS9pby9QcmludFN0cmVhbQwAJwAoAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAUCAArAQATdGVzdFZlcnNpb25VbmlxbmVzcwoAAQAtDAAuACgBAAdzZXROYW1lCAAwAQAsZmlsZTovLy9ob21lL3NoYXJlZC93ZWJ0b29scy90ZXN0U3RhZ2luZ1JlcG8KAAEAMgwAMwAoAQAQc2V0UmVwb1VSTFRvVGVzdAgANQEAES9ob21lL2Rhdmlkdy90ZW1wCgABADcMADgAKAEAEnNldE91dHB1dERpcmVjdG9yeQEABHRlc3QBAAMoKVoBAApFeGNlcHRpb25zBwA9AQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwA/AQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbgcAQQEAM29yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgcAQwEAE2phdmEvaW8vSU9FeGNlcHRpb24KAAEARQwARgBHAQAJZ2V0QWxsSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABAEkMAEoASwEAFmFuYWx5emVWZXJzaW9uUGF0dGVybnMBAC4oTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OylWCgABAE0MAE4ATwEAGGFuYWx5emVOb25VbmlxdWVWZXJzaW9ucwEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAAZhbGxJVXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYKAAEAVwwAWABZAQASZ2V0T3V0cHV0RGlyZWN0b3J5AQAUKClMamF2YS9sYW5nL1N0cmluZzsHAFsBAAxqYXZhL2lvL0ZpbGUIAF0BABN2ZXJzaW9uUGF0dGVybnMudHh0CgBaAF8MABAAYAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgcAYgEAEmphdmEvaW8vRmlsZVdyaXRlcgoAYQBkDAAQAGUBABEoTGphdmEvaW8vRmlsZTspVgcAZwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCABpAQAIb3V0cHV0OiAKAGYAawwAEAAoCgBaAG0MAG4AWQEAD2dldEFic29sdXRlUGF0aAoAZgBwDABxAHIBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAGYAdAwAdQBZAQAIdG9TdHJpbmcIAHcBACxWZXJzaW9uIHF1YWxpZmVyIHBhdHRlcm5zIHVzZWQgaW4gcmVwb3NpdG9yeQkAAQB5DAB6AAYBAANFT0wKAGEAfAwAfQAoAQAFd3JpdGUIAH8BAB5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAKAAEAgQwAggBZAQAQZ2V0UmVwb1VSTFRvVGVzdAgAhAEATyhFeHBsb3JhdG9yeSByZXBvcnQgLi4uIG1heWJlIGV2ZW50dWFsbHkgdXNlZCB0byBmaW5kIHR5cG9zLCBzdWNoIGFzICdxdWFsZmVyJykKAAEAhgwAhwCIAQARY29sbGVjdFF1YWxpZmllcnMBAFEoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0O0xqYXZhL2lvL0ZpbGVXcml0ZXI7KUxqYXZhL3V0aWwvTGlzdDsKAAEAigwAiwCMAQAYY29sbGFwc2VTb3J0ZWRRdWFsaWZpZXJzAQAnKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0OylWCgBhAI4MAI8AEQEABWNsb3NlCgBCAJEMAJIAEQEAD3ByaW50U3RhY2tUcmFjZQEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAC3Rlc3REaXJOYW1lAQANYWxsUXVhbGlmaWVycwEAEExqYXZhL3V0aWwvTGlzdDsBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47BwCeAQAPamF2YS9sYW5nL0Vycm9yAQA7KExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47KVYKAKEAowcAogEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwApAClAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYKAKcAqQcAqAEAEGphdmEvbGFuZy9TdHJpbmcMAKoAqwEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwgArQEAKkNvdW50IG9mIChzb3J0ZWQpIHBhdHRlcm5zIG1hdGNoaW5nIHVwIHRvIAoAZgCvDABxALABABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CACyAQAMIGNoYXJhY3RlcnMuCwC0ALYHALUBAA5qYXZhL3V0aWwvTGlzdAwAtwC4AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwC6ALwHALsBABJqYXZhL3V0aWwvSXRlcmF0b3IMAL0AvgEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoApwDADAAJAMEBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAKcAwwwAxADFAQAGbGVuZ3RoAQADKClJCADHAQAOW2VtcHR5IHN0cmluZ10KAKcAyQwAqgDKAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7CADMAQABCQgAzgEAAwkJCQoAAQDQDADRANIBAA1zdGFydHNTaW1pbGFyAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaCADUAQACCQkKAAEA1gwA1wDYAQAKc3Vic2VjdGlvbgEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgCdABQLALoA2wwA3AA6AQAHaGFzTmV4dAEACXJlZmVyZW5jZQEACHJlZkNvdW50AQAEdHlwZQEAAXEBAJkoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS9pby9GaWxlV3JpdGVyOylMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsHAOMBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgDiABQLAOYA6AcA5wEAKW9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0DADpAOoBABF0b1VubW9kaWZpYWJsZVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwDsALYHAO0BAA1qYXZhL3V0aWwvU2V0BwDvAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0CADxAQAEdHJ1ZQgA8wEAJG9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeQsA7gD1DAD2ANgBAAtnZXRQcm9wZXJ0eQoAAQD4DAD5APoBAAlpc1NwZWNpYWwBADUoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspWgsA7gD8DAD9AP4BAApnZXRWZXJzaW9uAQArKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uOwoBAAECBwEBAQAnb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uDAEDADoBABBpc09TR2lDb21wYXRpYmxlCgEAAQUMAQYAxQEAD2dldFNlZ21lbnRDb3VudAoBAAEIDAEJAQoBAApnZXRTZWdtZW50AQAZKEkpTGphdmEvbGFuZy9Db21wYXJhYmxlOwgBDAEAGXplcm8gbGVuZ3RoIDR0aCBzZWdtZW50OiALAO4BDgwBDwBZAQAFZ2V0SWQLALQBEQwBEgDBAQADYWRkCAEUAQANUHJvZ3JhbSBFcnJvcgoAnQBrCAEXAQAnTnVtYmVyIG9mIG5vbk9TR2kgY29tcGF0aWJsZSB2ZXJzaW9uczogCAEZAQAiTnVtYmVyIHdpdGggbW9yZSB0aGFuIDQgc2VnbWVudHM6IAgBGwEAIk51bWJlciB3dGloIGxlc3MgdGhhbiA0IHNlZ21lbnRzOiABABFub25PU0dpQ29tcGF0aWJsZQEADW5MZXNzVGhhbkZvdXIBAA1uTW9yZVRoYW5Gb3VyAQACaXUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEACmlzQ2F0ZWdvcnkBAAFaAQANYnVuZGxlVmVyc2lvbgEAKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb247AQAJcXVhbGlmaWVyAQAWTGphdmEvbGFuZy9Db21wYXJhYmxlOwEAB3FTdHJpbmcKAKcBKQwADAEqAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgCnASwMAS0BLgEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBAAZyZXN1bHQBAGIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspWgoAAQEyDAEzATQBABR0YWJ1bGF0ZU5vblVuaXF1ZUlEcwEAPChMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KUxqYXZhL3V0aWwvTWFwOwgBNgEAFW5vblVuaXF1ZVZlcnNpb25zLnR4dAgBOAEAJk5vbiBVbmlxdWUgVmVyc2lvbnMgdXNlZCBpbiByZXBvc2l0b3J5CwE6ATwHATsBAA1qYXZhL3V0aWwvTWFwDAE9AOoBAAZrZXlTZXQLAToBPwwBQAFBAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsLAOwBQwwBRADFAQAEc2l6ZQoAAQFGDAFHAUgBAAdwcmludElkAQApKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvbGFuZy9PYmplY3Q7KVYKAAEBSgwBSwFIAQAMcHJpbnRWZXJzaW9uCAFNAQAdTnVtYmVyIG9mIHVuaXF1ZSBpZC12ZXJzaW9ucyABAAdidW5kbGVzAQAPTGphdmEvdXRpbC9NYXA7AQAHblVuaXF1ZQEACGJ1bmRsZUlkAQASTGphdmEvbGFuZy9PYmplY3Q7AQAKdmVyc2lvblNldAEAD0xqYXZhL3V0aWwvU2V0OwEAB3ZlcnNpb24BAHAoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspTGphdmEvdXRpbC9NYXA7BwFYAQARamF2YS91dGlsL0hhc2hNYXAKAVcAFAsBOgFbDAFcAMEBAAtjb250YWluc0tleQsA7AERBwFfAQARamF2YS91dGlsL0hhc2hTZXQKAV4AFAsBOgFiDAFjAWQBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoBZgCRBwFnAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24BABxMamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb247CgBmABQKAGYBawwAcQFsAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACaWQBAApTb3VyY2VGaWxlAQAUVmVyc2lvbkNoZWNraW5nLmphdmEAIQABAAMAAAAD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AAAbAB8AlAABAAAAGwFVAVIAAgABAW4AAAACAW9QSwMECgAACAAAWqkJP15iLNGlLQAApS0AADEAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZy5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuVmVyc2lvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5UZXN0UmVwbzsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVmVyc2lvbkNoZWNraW5nOwoKcHVibGljIGNsYXNzIFZlcnNpb25DaGVja2luZyBleHRlbmRzIFRlc3RSZXBvIHsKCgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMUyAgICAgICAgICAgICAgICAgPSAiZXF1YWxzIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVFNfV0lUSCAgICAgICAgICAgID0gInN0YXJ0c1dpdGgiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgIFNUQVJUV0lUSF9NQVRDSF9MRU5HVEggPSA1OwoKICAgIC8qKgogICAgICogVGhlIHRlc3Qgc2V0dXAgaW4gdGhpcyBzdWl0ZSBtZXRob2QgaXMgYXR5cGljYWwsIGJ1dCBoYW5keSBkbyB0byBsb2NhbAogICAgICogdGVzdGluZyBmcm9tIHdvcmtiZW5jaC4gRm9yIHByb2R1Y3Rpb24gd29yaywgY3VycmVudGx5LCB0aGUgdmFsdWVzIGFyZQogICAgICogc2V0IGluIGFudCBleGVjdXRlIG1ldGhvZC4gSWYvd2hlbiBjb252ZXJ0ZWQgdG8gdHJ1ZSBKVW5pdCB0ZXN0cywgdGhpcwogICAgICogc3VpdGUgbWV0aG9kIHdpbGwgbmVlZCB0byBiZSBjaGFhbmdlZCB0byBhIG1vcmUgdHlwaWNhbCBmb3JtLCBhbmQgbm8KICAgICAqIHZhbHVlIGhhcmQgY29kZWQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3QgdmVyc2lvbiBjaGVja2luZyIpOwogICAgICAgIFZlcnNpb25DaGVja2luZyB0ZXN0ID0gbmV3IFZlcnNpb25DaGVja2luZygpOwogICAgICAgIHRlc3Quc2V0TmFtZSgidGVzdFZlcnNpb25VbmlxbmVzcyIpOwogICAgICAgIHRlc3Quc2V0UmVwb1VSTFRvVGVzdCgiZmlsZTovLy9ob21lL3NoYXJlZC93ZWJ0b29scy90ZXN0U3RhZ2luZ1JlcG8iKTsKICAgICAgICB0ZXN0LnNldE91dHB1dERpcmVjdG9yeSgiL2hvbWUvZGF2aWR3L3RlbXAiKTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0VmVyc2lvblVuaXFuZXNzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSBnZXRBbGxJVXMoKTsKICAgICAgICBhbmFseXplVmVyc2lvblBhdHRlcm5zKGFsbElVcyk7CiAgICAgICAgcmV0dXJuIGFuYWx5emVOb25VbmlxdWVWZXJzaW9ucyhhbGxJVXMpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBhbmFseXplVmVyc2lvblBhdHRlcm5zKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoKCiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgInZlcnNpb25QYXR0ZXJucy50eHQiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwoKCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIlZlcnNpb24gcXVhbGlmZXIgcGF0dGVybnMgdXNlZCBpbiByZXBvc2l0b3J5IiArIEVPTCArIEVPTCk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyBFT0wgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCIoRXhwbG9yYXRvcnkgcmVwb3J0IC4uLiBtYXliZSBldmVudHVhbGx5IHVzZWQgdG8gZmluZCB0eXBvcywgc3VjaCBhcyAncXVhbGZlcicpIiArIEVPTCArIEVPTCk7CgogICAgICAgICAgICBMaXN0PFN0cmluZz4gYWxsUXVhbGlmaWVycyA9IGNvbGxlY3RRdWFsaWZpZXJzKGFsbElVcywgb3V0ZmlsZVdyaXRlcik7CgoKCiAgICAgICAgICAgIGNvbGxhcHNlU29ydGVkUXVhbGlmaWVycyhvdXRmaWxlV3JpdGVyLCBhbGxRdWFsaWZpZXJzKTsKCgogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHdlaXJkCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgY29sbGFwc2VTb3J0ZWRRdWFsaWZpZXJzKEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgTGlzdDxTdHJpbmc+IGFsbFF1YWxpZmllcnMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXJyb3IgewogICAgICAgIFN0cmluZyByZWZlcmVuY2UgPSBudWxsOwogICAgICAgIGludCByZWZDb3VudCA9IDA7CiAgICAgICAgU3RyaW5nIHR5cGUgPSBFUVVBTFM7CiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhbGxRdWFsaWZpZXJzKTsKCiAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShFT0wgKyAiQ291bnQgb2YgKHNvcnRlZCkgcGF0dGVybnMgbWF0Y2hpbmcgdXAgdG8gIiArIFNUQVJUV0lUSF9NQVRDSF9MRU5HVEggKyAiIGNoYXJhY3RlcnMuIiArIEVPTCArIEVPTCk7CgogICAgICAgIGZvciAoU3RyaW5nIHEgOiBhbGxRdWFsaWZpZXJzKSB7CiAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcTsKICAgICAgICAgICAgICAgIHJlZkNvdW50ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UuZXF1YWxzKHEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gRVFVQUxTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9ICJbZW1wdHkgc3RyaW5nXSI7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUocmVmQ291bnQgKyAiXHQiICsgdHlwZSArICJcdFx0XHQiICsgcmVmZXJlbmNlICsgRU9MKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRVFVQUxTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydHNTaW1pbGFyKHJlZmVyZW5jZSwgcSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFNUQVJUU19XSVRIOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNUQVJUU19XSVRILmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShyZWZDb3VudCArICJcdCIgKyB0eXBlICsgIlx0XHQiICsgc3Vic2VjdGlvbihyZWZlcmVuY2UpICsgRU9MKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChFUVVBTFMuZXF1YWxzKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKHJlZkNvdW50ICsgIlx0IiArIHR5cGUgKyAiXHRcdFx0IiArIHJlZmVyZW5jZSArIEVPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBxOwogICAgICAgICAgICAgICAgICAgICAgICByZWZDb3VudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFUVVBTFM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb2xsZWN0UXVhbGlmaWVycyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzLCBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXJyb3IgewogICAgICAgIExpc3Q8U3RyaW5nPiBhbGxRdWFsaWZpZXJzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGludCBub25PU0dpQ29tcGF0aWJsZSA9IDA7CiAgICAgICAgaW50IG5MZXNzVGhhbkZvdXIgPSAwOwogICAgICAgIGludCBuTW9yZVRoYW5Gb3VyID0gMDsKICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewoKICAgICAgICAgICAgLy8gZXhjbHVkZSBjYXRlZ29yaWVzLCBzaW5jZSB0aGV5IGFyZSAob2Z0ZW4pIGludGVuZGVkIHRvIHdvcmsgd2l0aCBzYW1lIElELCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBib29sZWFuIGlzQ2F0ZWdvcnkgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiKSk7CgogICAgICAgICAgICAvLyB3ZSBleGNsdWRlIHRoZXNlIHRoaW5ncyBpbiBzb21lIG90aGVyIHJlcG8gcmVwb3J0cyAuLi4gdG8gaW1wcm92ZSBmb2N1cyAuLi4gYnV0IHN1c3BlY3Qgbm90IG5lZWRlZCBoZXJlLgogICAgICAgICAgICAvLyBib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CiAgICAgICAgICAgIC8vICFpc0ZyYWdtZW50ICYmICFpc0ZlYXR1cmVHcm91cChpdSkKICAgICAgICAgICAgaWYgKCFpc0NhdGVnb3J5ICYmICFpc1NwZWNpYWwoaXUpKSB7CiAgICAgICAgICAgICAgICAvL1N0cmluZyBidW5kbGVJZCA9IGl1LmdldElkKCk7CiAgICAgICAgICAgICAgICBWZXJzaW9uIGJ1bmRsZVZlcnNpb24gPSBpdS5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlVmVyc2lvbi5pc09TR2lDb21wYXRpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlVmVyc2lvbi5nZXRTZWdtZW50Q291bnQoKSA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmFibGUgcXVhbGlmaWVyID0gYnVuZGxlVmVyc2lvbi5nZXRTZWdtZW50KDMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVyIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcVN0cmluZyA9IChTdHJpbmcpIHF1YWxpZmllcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxU3RyaW5nLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJ6ZXJvIGxlbmd0aCA0dGggc2VnbWVudDogIiArIGl1LmdldElkKCkgKyBFT0wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsUXVhbGlmaWVycy5hZGQocVN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlByb2dyYW0gRXJyb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidW5kbGVWZXJzaW9uLmdldFNlZ21lbnRDb3VudCgpIDwgNCkgewogICAgICAgICAgICAgICAgICAgICAgICBuTGVzc1RoYW5Gb3VyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1bmRsZVZlcnNpb24uZ2V0U2VnbWVudENvdW50KCkgPiA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5Nb3JlVGhhbkZvdXIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBub25PU0dpQ29tcGF0aWJsZSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICB9CgogICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIk51bWJlciBvZiBub25PU0dpIGNvbXBhdGlibGUgdmVyc2lvbnM6ICIgKyBub25PU0dpQ29tcGF0aWJsZSArIEVPTCk7CiAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShFT0wgKyAiTnVtYmVyIHdpdGggbW9yZSB0aGFuIDQgc2VnbWVudHM6ICIgKyBuTW9yZVRoYW5Gb3VyICsgRU9MKTsKICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKEVPTCArICJOdW1iZXIgd3RpaCBsZXNzIHRoYW4gNCBzZWdtZW50czogIiArIG5MZXNzVGhhbkZvdXIgKyBFT0wgKyBFT0wpOwogICAgICAgIHJldHVybiBhbGxRdWFsaWZpZXJzOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydHNTaW1pbGFyKFN0cmluZyByZWZlcmVuY2UsIFN0cmluZyBxKSB7CiAgICAgICAgcmV0dXJuIChxLnN0YXJ0c1dpdGgoc3Vic2VjdGlvbihyZWZlcmVuY2UpKSk7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgc3Vic2VjdGlvbihTdHJpbmcgcmVmZXJlbmNlKSB7CiAgICAgICAgLy8gbGVuZ3RoID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7CgogICAgICAgIFN0cmluZyByZXN1bHQgPSByZWZlcmVuY2U7CiAgICAgICAgaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+PSBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IChyZWZlcmVuY2Uuc3Vic3RyaW5nKDAsIFNUQVJUV0lUSF9NQVRDSF9MRU5HVEgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKCiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGFuYWx5emVOb25VbmlxdWVWZXJzaW9ucyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIE1hcCBidW5kbGVzID0gdGFidWxhdGVOb25VbmlxdWVJRHMoYWxsSVVzKTsKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAibm9uVW5pcXVlVmVyc2lvbnMudHh0Iik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKCgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJOb24gVW5pcXVlIFZlcnNpb25zIHVzZWQgaW4gcmVwb3NpdG9yeSIgKyBFT0wgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJSZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgRU9MICsgRU9MKTsKCiAgICAgICAgICAgIGludCBuVW5pcXVlID0gMDsKICAgICAgICAgICAgZm9yIChPYmplY3QgYnVuZGxlSWQgOiBidW5kbGVzLmtleVNldCgpKSB7CiAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IChTZXQpIGJ1bmRsZXMuZ2V0KGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uU2V0LnNpemUoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgblVuaXF1ZSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRJZChvdXRmaWxlV3JpdGVyLCBidW5kbGVJZCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmVyc2lvbiA6IHZlcnNpb25TZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRWZXJzaW9uKG91dGZpbGVXcml0ZXIsIHZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShFT0wgKyAiTnVtYmVyIG9mIHVuaXF1ZSBpZC12ZXJzaW9ucyAiICsgblVuaXF1ZSArIEVPTCk7CgogICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIGZhbHNlIChubyBlcnJvciksIGZvciBub3cgLi4uIGV2ZW50dWFsbHkgbWF5IGJlIGFibGUgdG8gCiAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgc29tZSBoZXVyaXN0aWMgdG8gcmV0dXJuICJlcnJvciIsIHN1Y2ggYXMgaWYgbmV3LCBub24tZXhwZWN0ZWQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHdlaXJkCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgcHJpdmF0ZSBNYXAgdGFidWxhdGVOb25VbmlxdWVJRHMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgewogICAgICAgIE1hcCBidW5kbGVzID0gbmV3IEhhc2hNYXAoKTsKICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBjYXRlZ29yaWVzLCBzaW5jZSB0aGV5IGFyZSAob2Z0ZW4pIGludGVuZGVkIHRvIHdvcmsgd2l0aCBzYW1lIElELCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwoKICAgICAgICAgICAgICAgIC8vIHdlIGV4Y2x1ZGUgdGhlc2UgdGhpbmdzIGluIHNvbWUgb3RoZXIgcmVwbyByZXBvcnRzIC4uLiB0byBpbXByb3ZlIGZvY3VzIC4uLiBidXQgc3VzcGVjdCBub3QgbmVlZGVkIGhlcmUuCiAgICAgICAgICAgICAgICAvL2Jvb2xlYW4gaXNGcmFnbWVudCA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCIpKTsKICAgICAgICAgICAgICAgIC8vICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50ICYmICFpc0ZlYXR1cmVHcm91cChpdSkKICAgICAgICAgICAgICAgIGlmICghaXNDYXRlZ29yeSkgewogICAgICAgICAgICAgICAgICAgIFN0cmluZyBidW5kbGVJZCA9IGl1LmdldElkKCk7CiAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiBidW5kbGVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpOwogICAgICAgICAgICAgICAgICAgIC8vIGlmIGJ1bmRsZSBJRCBpcyBhbHJlYWR5IGluIG1hcCwgd2UgbXVzdCBoYXZlIGFscmVhZHkgZm91bmQgYXQgbGVhc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNldCB2ZXJzaW9uU2V0ID0gKFNldCkgYnVuZGxlcy5nZXQoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uU2V0LmFkZChidW5kbGVWZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgZm91bmQgb25lIHlldCwgc28gYWRkIGl0LCB3aXRoIGluaXRpYWwgc2V0IG9mIGl0cyAob25lKSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIFNldCB2ZXJzaW9uU2V0ID0gbmV3IEhhc2hTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblNldC5hZGQoYnVuZGxlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZXMucHV0KGJ1bmRsZUlkLCB2ZXJzaW9uU2V0KTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVuZGxlczsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRJZChGaWxlV3JpdGVyIG91dCwgT2JqZWN0IGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG91dC53cml0ZShpZCArIEVPTCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50VmVyc2lvbihGaWxlV3JpdGVyIG91dCwgT2JqZWN0IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgb3V0LndyaXRlKCJcdCIgKyB2ZXJzaW9uICsgRU9MKTsKICAgIH0KCn0KUEsDBAoAAAgAAI+1R0C+VV+FVhkAAFYZAAAwAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmNsYXNzyv66vgAAADEBCAcAAgEAKm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlcgcABAEAJW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8BAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAkMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyOwEAD3Rlc3RCdW5kbGVOYW1lcwEAAygpWgEACkV4Y2VwdGlvbnMHABIBABtqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb24HABQBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uBwAWAQAzb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uBwAYAQATamF2YS9pby9JT0V4Y2VwdGlvbgoAAQAaDAAbABwBAAlnZXRBbGxJVXMBAC0oKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsKAAEAHgwAHwAgAQAQY2hlY2tCdW5kbGVOYW1lcwEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAAZhbGxJVXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAQdGVzdEZlYXR1cmVOYW1lcwoAAQAnDAAoABwBAA5nZXRBbGxHcm91cElVcwoAAQAqDAArACABABFjaGVja0ZlYXR1cmVOYW1lcwEACVNpZ25hdHVyZQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylaBwAvAQATamF2YS91dGlsL0FycmF5TGlzdAoALgAJCgABADIMADMANAEAEmdldE91dHB1dERpcmVjdG9yeQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7BwA2AQAMamF2YS9pby9GaWxlCAA4AQARZmVhdHVyZU5hbWVzLmh0bWwKADUAOgwABQA7AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwA9AQASamF2YS9pby9GaWxlV3JpdGVyCgA8AD8MAAUAQAEAEShMamF2YS9pby9GaWxlOylWCQBCAEQHAEMBABBqYXZhL2xhbmcvU3lzdGVtDABFAEYBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsHAEgBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggASgEACG91dHB1dDogCgBHAEwMAAUATQEAFShMamF2YS9sYW5nL1N0cmluZzspVgoANQBPDABQADQBAA9nZXRBYnNvbHV0ZVBhdGgKAEcAUgwAUwBUAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBHAFYMAFcANAEACHRvU3RyaW5nCgBZAFsHAFoBABNqYXZhL2lvL1ByaW50U3RyZWFtDABcAE0BAAdwcmludGxuCwBeAGAHAF8BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwAYQBiAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsAZABmBwBlAQANamF2YS91dGlsL1NldAwAZwBoAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwBqAGwHAGsBABJqYXZhL3V0aWwvSXRlcmF0b3IMAG0AbgEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwcAcAEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAgAcgEABHRydWUIAHQBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkLAG8AdgwAdwB4AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAegB8BwB7AQAQamF2YS9sYW5nL1N0cmluZwwAfQB+AQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCACAAQAkb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50CgABAIIMAIMAhAEADmlzRmVhdHVyZUdyb3VwAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoKAAEAhgwAhwCEAQAJaXNTcGVjaWFsCACJAQAbb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lCwBvAIsMAHcAjAEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CwCOAJAHAI8BAA5qYXZhL3V0aWwvTGlzdAwAkQB+AQADYWRkCACTAQABJQoAegCVDACWAJcBAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCACZAQAIRmVhdHVyZS0IAJsBAAdCdW5kbGUtCACdAQAHZmVhdHVyZQgAnwEABnBsdWdpbggAoQEAC1BsdWdpbi5uYW1lCACjAQAJZnJhZ21lbnQuCAClAQALRWNsaXBzZS5vcmcIAKcBAAZidW5kbGUKAKkAqwcAqgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDACsAAYBAA9wcmludFN0YWNrVHJhY2ULAGoArgwArwAPAQAHaGFzTmV4dAgAsQEAKTxoMT5GZWF0dXJlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+CQABALMMALQAtQEAA0VPTAEAEkxqYXZhL2xhbmcvU3RyaW5nOwoAPAC3DAC4AE0BAAV3cml0ZQgAugEAITxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6IAoAAQC8DAC9ADQBABBnZXRSZXBvVVJMVG9UZXN0CAC/AQAEPC9wPggAwQEANTxoMj5NYWpvcjogbWlzc2luZyBvciAocHJvYmFibHkpIGluY29ycmVjdCBuYW1lczwvaDI+CgABAMMMAMQAxQEAFHByaW50TGluZXNCdW5kbGVOYW1lAQAnKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0OylWCADHAQAfPGgyPlByb2JhYmx5IGNvcnJlY3QgbmFtZXM8L2gyPgsAjgDJDADKAMsBAARzaXplAQADKClJCgA8AM0MAM4ABgEABWNsb3NlCgAXAKsBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBABNpbmNvcnJlY3RCdW5kbGVOYW1lAQAQTGphdmEvdXRpbC9MaXN0OwEAGXByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUBAAt0ZXN0RGlyTmFtZQEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAppc0NhdGVnb3J5AQABWgEACmlzRnJhZ21lbnQBAApidW5kbGVOYW1lAQABZQEAHExqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbjsBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAERMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwgA4wEAEGJ1bmRsZU5hbWVzLmh0bWwIAOUBACg8aDE+QnVuZGxlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+CADnAQA7PGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4IAOkBACU8aDI+UHJvYmFibHkgY29ycmVjdCBidW5kbGUgbmFtZTwvaDI+AQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcA7AEAK29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IKAOsACQoA7wDxBwDwAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDADyAPMBAARzb3J0AQApKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0NvbXBhcmF0b3I7KVYIAPUBAAo8cD5Db3VudDogCgBHAPcMAFMA+AEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAPoBAAQ8b2w+CwCOAGYKAAEA/QwA/gD/AQARcHJpbnRMaW5lTGlzdEl0ZW0BAFsoTGphdmEvaW8vRmlsZVdyaXRlcjtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0O0xqYXZhL2xhbmcvU3RyaW5nOylWCAEBAQAFPC9vbD4BAAZpdUxpc3QBABRjb21wYXJhdG9yQnVuZGxlTmFtZQEAFkxqYXZhL3V0aWwvQ29tcGFyYXRvcjsBAEtMamF2YS91dGlsL0NvbXBhcmF0b3I8LUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsBAApTb3VyY2VGaWxlAQASSVVOYW1lQ2hlY2tlci5qYXZhACEAAQADAAAAAAAGAAEABQAGAAEABwAAAC8AAQABAAAABSq3AAixAAAAAgAKAAAABgABAAAAEwALAAAADAABAAAABQAMAA0AAAABAA4ADwACABAAAAAKAAQAEQATABUAFwAHAAAAVQACAAIAAAALKrYAGUwqK7cAHawAAAADAAoAAAAKAAIAAAAYAAUAGQALAAAAFgACAAAACwAMAA0AAAAFAAYAIQAiAAEAIwAAAAwAAQAFAAYAIQAkAAEAAQAlAA8AAgAQAAAACgAEABEAEwAVABcABwAAAFUAAgACAAAACyq2ACZMKiu3ACmsAAAAAwAKAAAACgACAAAAHQAFAB4ACwAAABYAAgAAAAsADAANAAAABQAGACEAIgABACMAAAAMAAEA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4AAOACMAAAAgAAMAAAHgACEAJAABAA0B0wDUAOEABAAWAcoA1gDhAAUAAgDEAMUAAwAQAAAABAABABcALAAAAAIA6gAHAAABEgAEAAYAAACEuwDrWbcA7U4sLbgA7iu7AEdZEvS3AEssuQDIAQC2APayALK2AFG2AFW2ALYruwBHWRL5twBLsgCytgBRtgBVtgC2LLkA+wEAOgWnABgZBbkAaQEAwABvOgQqKxkEEoi2APwZBbkArQEAmv/kK7sAR1kTAQC3AEuyALK2AFG2AFW2ALaxAAAAAwAKAAAAJgAJAAAArwAIALAADQCxACwAsgBCALQAWQC1AGIAtABsALcAgwC4AAsAAAA0AAUAAACEAAwADQAAAAAAhABFANEAAQAAAIQBAgDVAAIACAB8AQMBBAADAFkACQDYANkABAAjAAAAFgACAAAAhAECAOEAAgAIAHwBAwEFAAMAAQEGAAAAAgEHUEsDBAoAAAgAAFqpCT9Kpp9mpiMAAKYjAAAvAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3M7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVGVzdFJlcG87CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLklVSWRDb21wYXJhdG9yOwoKcHVibGljIGNsYXNzIElVTmFtZUNoZWNrZXIgZXh0ZW5kcyBUZXN0UmVwbyB7CgoKCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0QnVuZGxlTmFtZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbElVcygpOwogICAgICAgIHJldHVybiBjaGVja0J1bmRsZU5hbWVzKGFsbElVcyk7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdEZlYXR1cmVOYW1lcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gZ2V0QWxsR3JvdXBJVXMoKTsKICAgICAgICByZXR1cm4gY2hlY2tGZWF0dXJlTmFtZXMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGZWF0dXJlTmFtZXMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBpbmNvcnJlY3RCdW5kbGVOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJmZWF0dXJlTmFtZXMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGFsbElVcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBleGNsdWRlIGZyYWdtZW50cz8KICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IGRvIG5vdCBuZWVkIHRvIGV4Y2x1ZGUgYWxsIG9mIHRoZXNlPyBTaW5jZSB3ZSBhcmUgc3BlY2lmaWNhbGx5IHNlbGVjdGluZyAiZ3JvdXBzIj8gCiAgICAgICAgICAgICAgICAgICAgaWYgKChpc0ZlYXR1cmVHcm91cChpdSkgJiYgIWlzQ2F0ZWdvcnkpICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX05BTUUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VyZSBmaSBjYW4gZXZlciBiZSBudWxsIC4uLiBidXQsIGp1c3QgaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RCdW5kbGVOYW1lLmFkZChpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiJSIpIHx8IGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiRmVhdHVyZS0iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkJ1bmRsZS0iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoImZlYXR1cmUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoInBsdWdpbiIpIHx8IGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiUGx1Z2luLm5hbWUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoImZyYWdtZW50LiIpIHx8IGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiRWNsaXBzZS5vcmciKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoImJ1bmRsZSIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVyaW1lbnQgdG8gZmluZCBjb25maWdzIGFuZCBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50QWxsUHJvcGVydGllcyhvdXRmaWxlV3JpdGVyLCBpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMT5GZWF0dXJlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+IiArIEVPTCk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+TWFqb3I6IG1pc3Npbmcgb3IgKHByb2JhYmx5KSBpbmNvcnJlY3QgbmFtZXM8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzQnVuZGxlTmFtZShvdXRmaWxlV3JpdGVyLCBpbmNvcnJlY3RCdW5kbGVOYW1lKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPlByb2JhYmx5IGNvcnJlY3QgbmFtZXM8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzQnVuZGxlTmFtZShvdXRmaWxlV3JpdGVyLCBwcm9iYWJseUNvcnJlY3RCdW5kbGVOYW1lKTsKCiAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGluY29ycmVjdEJ1bmRsZU5hbWUuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbmFtaW5nIG9yIGxvY2FsaXphdGlvbi4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAvLyAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGluY29ycmVjdEJ1bmRsZU5hbWUuc2l6ZSgpID4gMDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlTmFtZXMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBpbmNvcnJlY3RCdW5kbGVOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJidW5kbGVOYW1lcy5odG1sIik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhdGVnb3JpZXMKICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2F0ZWdvcnkgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGV4Y2x1ZGUgZnJhZ21lbnRzPwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGcmFnbWVudCA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCIpKTsKCgogICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4Y2x1ZGUgZmVhdHVyZSBncm91cHMgaGVyZSwgc28gdGhleSBjYW4gYmUgaW4gdGhlaXIgb3duIGxpc3QsIGZvciBiZXR0ZXIgZm9jdXMKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2F0ZWdvcnkgJiYgIWlzU3BlY2lhbChpdSkgJiYgIWlzRnJhZ21lbnQgJiYgIWlzRmVhdHVyZUdyb3VwKGl1KSkgewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cmUgZmkgY2FuIGV2ZXIgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIiUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkJ1bmRsZS0iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoInBsdWdpbiIpIHx8IGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiUGx1Z2luLm5hbWUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoImZyYWdtZW50LiIpIHx8IGJ1bmRsZU5hbWUuc3RhcnRzV2l0aCgiRWNsaXBzZS5vcmciKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoImJ1bmRsZSIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVyaW1lbnQgdG8gZmluZCBjb25maWdzIGFuZCBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50QWxsUHJvcGVydGllcyhvdXRmaWxlV3JpdGVyLCBpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMT5CdW5kbGUgbmFtZXMgdXNlZCBpbiByZXBvc2l0b3J5PC9oMT4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIiArIGdldFJlcG9VUkxUb1Rlc3QoKSArICI8L3A+IiArIEVPTCk7CiAgICAgICAgICAgIC8vb3V0ZmlsZVdyaXRlci53cml0ZSgiPHA+Tm90ZSwgdGhlcmUgYXJlIHNldmVyYWwgcHJvYmxlbXMgd2l0aCB0aGlzIHRlc3QsIGUuZy4gc2VlIDxhIGhyZWY9XCJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5NTY2XCI+YnVnIDMwOTU2NjwvYT4uIFNvIHByb3ZpZGVkIGhlcmUgYXMgRllJIGZvciBub3cuPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+TWFqb3I6IG1pc3Npbmcgb3IgKHByb2JhYmx5KSBpbmNvcnJlY3QgYnVuZGxlIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzQnVuZGxlTmFtZShvdXRmaWxlV3JpdGVyLCBpbmNvcnJlY3RCdW5kbGVOYW1lKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPlByb2JhYmx5IGNvcnJlY3QgYnVuZGxlIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzQnVuZGxlTmFtZShvdXRmaWxlV3JpdGVyLCBwcm9iYWJseUNvcnJlY3RCdW5kbGVOYW1lKTsKCiAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGluY29ycmVjdEJ1bmRsZU5hbWUuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbmFtaW5nIG9yIGxvY2FsaXphdGlvbi4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAvLyAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGluY29ycmVjdEJ1bmRsZU5hbWUuc2l6ZSgpID4gMDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50TGluZXNCdW5kbGVOYW1lKEZpbGVXcml0ZXIgb3V0LCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGl1TGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvL0NvbXBhcmF0b3I8PyBzdXBlciBJSW5zdGFsbGFibGVVbml0PiBjb21wYXJhdG9yQnVuZGxlTmFtZSA9IG5ldyBJVU5hbWVBbmRJZENvbXBhcmF0b3IoKTsKICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvckJ1bmRsZU5hbWUgPSBuZXcgSVVJZENvbXBhcmF0b3IoKTsKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGl1TGlzdCwgY29tcGFyYXRvckJ1bmRsZU5hbWUpOwogICAgICAgIG91dC53cml0ZSgiPHA+Q291bnQ6ICIgKyBpdUxpc3Quc2l6ZSgpICsgRU9MKTsKICAgICAgICBvdXQud3JpdGUoIjxvbD4iICsgRU9MKTsKCiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogaXVMaXN0KSB7CiAgICAgICAgICAgIHByaW50TGluZUxpc3RJdGVtKG91dCwgaXUsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FKTsKICAgICAgICB9CiAgICAgICAgb3V0LndyaXRlKCI8L29sPiIgKyBFT0wpOwogICAgfQoKfQpQSwMECgAACAAAj7VHQDsM1y5CGwAAQhsAADUAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3Rocy5jbGFzc8r+ur4AAAAxAUEHAAIBAC9vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3RocwcABAEAJW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8BAAxkaXN0cmlidXRpb24BAA9MamF2YS91dGlsL01hcDsBAAttYXhDcml0ZXJpYQEAAUkBAAxsb25nZXN0TmFtZXMBABBMamF2YS91dGlsL0xpc3Q7AQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAPDAALAAwJAAEAEQwABQAGCQABABMMAAcACAcAFQEAE2phdmEvdXRpbC9BcnJheUxpc3QKABQADwkAAQAYDAAJAAoBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAxTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzOwEADGFzU29ydGVkTGlzdAEAKChMamF2YS91dGlsL0NvbGxlY3Rpb247KUxqYXZhL3V0aWwvTGlzdDsBAAlTaWduYXR1cmUBAFM8VDo6TGphdmEvbGFuZy9Db21wYXJhYmxlPC1UVDs+Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRUOz47KUxqYXZhL3V0aWwvTGlzdDxUVDs+OwoAFAAiDAALACMBABkoTGphdmEvdXRpbC9Db2xsZWN0aW9uOylWCgAlACcHACYBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMACgAKQEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWAQABYwEAFkxqYXZhL3V0aWwvQ29sbGVjdGlvbjsBAARsaXN0AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAG0xqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVDs+OwEAFUxqYXZhL3V0aWwvTGlzdDxUVDs+OwEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7CQAzADUHADQBABBqYXZhL2xhbmcvU3lzdGVtDAA2ADcBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIADkBAB50ZXN0IGZlYXR1cmUgZGlyZWN0b3J5IGxlbmd0aHMKADsAPQcAPAEAE2phdmEvaW8vUHJpbnRTdHJlYW0MAD4APwEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEADwgAQgEAGnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoCgABAEQMAEUAPwEAB3NldE5hbWUIAEcBAC1maWxlOi8vL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2p1bm9SQzMvd3RwLXJlcG8KAAEASQwASgA/AQAQc2V0UmVwb1VSTFRvVGVzdAgATAEAES9ob21lL2Rhdmlkdy90ZW1wCgABAE4MAE8APwEAEnNldE91dHB1dERpcmVjdG9yeQEAEmZlYXR1cmVOYW1lTGVuZ3RocwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCABUAQAmL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2p1bm9SQzMvd3RwLXJlcG8IAFYBAAUvdGVtcAoAAQBYDABCAFkBAAMoKUkKAFsAXQcAXAEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24MAF4ADAEAD3ByaW50U3RhY2tUcmFjZQoAYABdBwBhAQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uCgBjAF0HAGQBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAFlAQAwTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb247AQAdTGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAAdhbmFseXplAQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspVgEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylWBwBvAQARamF2YS91dGlsL0hhc2hNYXAKAG4ADwsAcgB0BwBzAQApb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQMAHUAdgEAEXRvVW5tb2RpZmlhYmxlU2V0AQARKClMamF2YS91dGlsL1NldDsLAHgAegcAeQEADWphdmEvdXRpbC9TZXQMAHsAfAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsAfgCABwB/AQASamF2YS91dGlsL0l0ZXJhdG9yDACBAIIBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsHAIQBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQLAIMAhgwAhwCIAQAFZ2V0SWQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwgAigEADi5mZWF0dXJlLmdyb3VwCgCMAI4HAI0BABBqYXZhL2xhbmcvU3RyaW5nDACPAFkBAAZsZW5ndGgKAIwAkQwAkgCTAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoKAIwAlQwAlgCXAQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwcAmQEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgCMAJsMAJwAnQEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAmACfDAALAD8IAKEBAAFfCgCYAKMMAKQApQEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwsAgwCnDACoAKkBAApnZXRWZXJzaW9uAQArKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uOwoAmACrDACkAKwBAC0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAJgArgwArwCIAQAIdG9TdHJpbmcKAAEAsQwAsgCzAQAIdGFidWxhdGUBAAQoSSlWCwC1ALcHALYBAA5qYXZhL3V0aWwvTGlzdAwAuAC5AQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCwB+ALsMALwAvQEAB2hhc05leHQBAAMoKVoBAAZhbGxJVXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQACaXUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEAC2ZlYXR1cmVOYW1lAQASTGphdmEvbGFuZy9TdHJpbmc7AQAMZmVhdHVyZUdyb3VwAQASZmVhdHVyZUdyb3VwTGVuZ3RoAQAEbGluZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQALcHJpbnRSZXBvcnQBAApFeGNlcHRpb25zCADLAQAdPGJyIC8+PT09PT09PT09PT09PT09PT09PT09PT0KAAEAzQwAzgCIAQASZ2V0T3V0cHV0RGlyZWN0b3J5BwDQAQAMamF2YS9pby9GaWxlCADSAQAcZmVhdHVyZURpcmVjdG9yeUxlbmd0aHMuaHRtbAoAzwDUDAALANUBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYHANcBABJqYXZhL2lvL0ZpbGVXcml0ZXIKANYA2QwACwDaAQARKExqYXZhL2lvL0ZpbGU7KVYIANwBACE8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAKAAEA3gwA3wCIAQAQZ2V0UmVwb1VSTFRvVGVzdAgA4QEABDwvcD4JAAEA4wwA5ADDAQADRU9MCgABAOYMAD4A5wEAKShMamF2YS9pby9GaWxlV3JpdGVyO0xqYXZhL2xhbmcvU3RyaW5nOylWCADpAQA2PGJyIC8+PGJyIC8+RGlzdHJpYnV0aW9uIG9mIEZlYXR1cmUgRGlyZWN0b3J5IExlbmd0aHM6BwDrAQARamF2YS9sYW5nL0ludGVnZXIKAOoA7QwACwCzCwDvAPEHAPABAA1qYXZhL3V0aWwvTWFwDADyAHYBAAZrZXlTZXQKAAEA9AwAHQAeCwC1AHoLAO8A9wwA+AD5AQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsIAPsBAAggJm5ic3A7IAoA6gD9DAD+AFkBAAhpbnRWYWx1ZQoA6gEADACcAQEBABYoSSlMamF2YS9sYW5nL0ludGVnZXI7CAEDAQAXPT09PT09PT09PT09PT09PT09PT09PT0IAQUBACggJm5ic3A7IFRvdGFsIGZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lczogCwC1AQcMAQgAWQEABHNpemUIAQoBADQgJm5ic3A7IEZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lcyB3aXRoIGxlbmd0aHMgYWJvdmUgCgCYAQwMAKQBDQEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsHAQ8BADNvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3IKAQ4ADwoAJQESDAAoARMBACkoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjspVgsAtQEVDAD4ARYBABUoSSlMamF2YS9sYW5nL09iamVjdDsKAIwBGAwAnAEZAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7CAEbAQBOICZuYnNwOyAgTm8gZmVhdHVyZSBkaXJlY3RvcnkgbmFtZXMgbGVuZ3RocyB3ZXJlIGxvbmdlciB0aGFuIHRoZSBtYXhDcml0ZXJpYSwgCgDWAR0MAR4ADAEABWNsb3NlAQAGU1BBQ0VSAQANb3V0ZmlsZVdyaXRlcgEAFExqYXZhL2lvL0ZpbGVXcml0ZXI7AQAHb3V0ZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQALdGVzdERpck5hbWUBAAV0b3RhbAEAE0xqYXZhL2xhbmcvSW50ZWdlcjsBAARrZXlzAQAPTGphdmEvdXRpbC9TZXQ7AQAUTGphdmEvdXRpbC9JdGVyYXRvcjsBAAhjYXRlZ29yeQEABWNvdW50AQABaQEAJUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL0ludGVnZXI7PjsLAO8BLwwBMAExAQADcHV0AQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsKAAEBMwwBNAE1AQAOZ2V0QWxsR3JvdXBJVXMBAC0oKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsKAAEBNwwBOAE5AQAVY2hlY2tGZWF0dXJlRGlyTGVudGhzAQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspSQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylJCgABATwMAGsAbAoAAQE+DADIAAwBAApTb3VyY2VGaWxlAQAXRmVhdHVyZU5hbWVMZW5ndGhzLmphdmEAIQABAAMAAAADAAIABQAGAAAAAgAHAAgAAAACAAkACgAAAAkA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cmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLkZlYXR1cmVOYW1lTGVuZ3RoczsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVGVzdFJlcG87CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzLlN0cmluZ0xlbmd0aENvbXBhcmF0b3I7CgpwdWJsaWMgY2xhc3MgRmVhdHVyZU5hbWVMZW5ndGhzIGV4dGVuZHMgVGVzdFJlcG8gewoKICAgIHByaXZhdGUgTWFwICBkaXN0cmlidXRpb24gPSBudWxsOwogICAgcHJpdmF0ZSBpbnQgIG1heENyaXRlcmlhICA9IDEwMDsKICAgIHByaXZhdGUgTGlzdCBsb25nZXN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CgogICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gTGlzdDxUPiBhc1NvcnRlZExpc3QoQ29sbGVjdGlvbjxUPiBjKSB7CiAgICAgICAgTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPihjKTsKICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKICAgICAgICByZXR1cm4gbGlzdDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0IGZlYXR1cmUgZGlyZWN0b3J5IGxlbmd0aHMiKTsKICAgICAgICBGZWF0dXJlTmFtZUxlbmd0aHMgZmVhdHVyZU5hbWVMZW5ndGhzID0gbmV3IEZlYXR1cmVOYW1lTGVuZ3RocygpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXROYW1lKCJ0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aCIpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRSZXBvVVJMVG9UZXN0KCJmaWxlOi8vL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2p1bm9SQzMvd3RwLXJlcG8iKTsKICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0T3V0cHV0RGlyZWN0b3J5KCIvaG9tZS9kYXZpZHcvdGVtcCIpOwogICAgICAgIHJldHVybiBmZWF0dXJlTmFtZUxlbmd0aHM7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIEZlYXR1cmVOYW1lTGVuZ3RocyBmZWF0dXJlTmFtZUxlbmd0aHMgPSBuZXcgRmVhdHVyZU5hbWVMZW5ndGhzKCk7CiAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnNldFJlcG9VUkxUb1Rlc3QoIi9ob21lL2ZpbGVzL2J1aWxkemlwcy9qdW5vUkMzL3d0cC1yZXBvIik7CiAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnNldE91dHB1dERpcmVjdG9yeSgiL3RlbXAiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMudGVzdEZlYXR1cmVEaXJlY3RvcnlMZW5ndGgoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgYW5hbHl6ZShJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzKSB7CiAgICAgICAgZGlzdHJpYnV0aW9uID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAvLyBzaW11bGF0ZSB3aGF0IGRpcmVjdG9yeSBuYW1lIHdvdWxkIGJlLCB3aGVuIGluc3RhbGxlZAogICAgICAgICAgICBTdHJpbmcgZmVhdHVyZU5hbWUgPSBpdS5nZXRJZCgpOwogICAgICAgICAgICBTdHJpbmcgZmVhdHVyZUdyb3VwID0gIi5mZWF0dXJlLmdyb3VwIjsKICAgICAgICAgICAgaW50IGZlYXR1cmVHcm91cExlbmd0aCA9IGZlYXR1cmVHcm91cC5sZW5ndGgoKTsKICAgICAgICAgICAgaWYgKGZlYXR1cmVOYW1lLmVuZHNXaXRoKGZlYXR1cmVHcm91cCkpIHsKICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWUuc3Vic3RyaW5nKDAsIGZlYXR1cmVOYW1lLmxlbmd0aCgpIC0gZmVhdHVyZUdyb3VwTGVuZ3RoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBmZWF0dXJlTmFtZSArICJfIiArIGl1LmdldFZlcnNpb24oKTsKICAgICAgICAgICAgdGFidWxhdGUobGluZS5sZW5ndGgoKSk7CiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gbWF4Q3JpdGVyaWEpIHsKICAgICAgICAgICAgICAgIGxvbmdlc3ROYW1lcy5hZGQobGluZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50UmVwb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgU1BBQ0VSID0gIjxiciAvPj09PT09PT09PT09PT09PT09PT09PT09IjsKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiZmVhdHVyZURpcmVjdG9yeUxlbmd0aHMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CgogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RGlzdHJpYnV0aW9uIG9mIEZlYXR1cmUgRGlyZWN0b3J5IExlbmd0aHM6IiArIFNQQUNFUik7CgogICAgICAgICAgICBJbnRlZ2VyIHRvdGFsID0gbmV3IEludGVnZXIoMCk7CiAgICAgICAgICAgIFNldCBrZXlzID0gZGlzdHJpYnV0aW9uLmtleVNldCgpOwogICAgICAgICAgICBMaXN0PEludGVnZXI+IGxpc3QgPSBhc1NvcnRlZExpc3Qoa2V5cyk7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgIEludGVnZXIgY2F0ZWdvcnkgPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBkaXN0cmlidXRpb24uZ2V0KGNhdGVnb3J5KTsKICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgTkJTUCArIGNhdGVnb3J5ICsgTkJTUCArIGNvdW50KTsKICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBjb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI9PT09PT09PT09PT09PT09PT09PT09PSIgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIE5CU1AgKyAiVG90YWwgZmVhdHVyZXMgZGlyZWN0b3J5IG5hbWVzOiAiICsgdG90YWwgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI9PT09PT09PT09PT09PT09PT09PT09PSIgKyBFT0wpOwogICAgICAgICAgICBpZiAobG9uZ2VzdE5hbWVzLnNpemUoKSA+IDApIHsKCiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIE5CU1AgKyAiRmVhdHVyZXMgZGlyZWN0b3J5IG5hbWVzIHdpdGggbGVuZ3RocyBhYm92ZSAiICsgbWF4Q3JpdGVyaWEgKyBFT0wpOwogICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsb25nZXN0TmFtZXMsIG5ldyBTdHJpbmdMZW5ndGhDb21wYXJhdG9yKCkpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb25nZXN0TmFtZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IChTdHJpbmcpIGxvbmdlc3ROYW1lcy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBsaW5lLmxlbmd0aCgpICsgTkJTUCArIGxpbmUgKyBFT0wpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBOQlNQICsgIiBObyBmZWF0dXJlIGRpcmVjdG9yeSBuYW1lcyBsZW5ndGhzIHdlcmUgbG9uZ2VyIHRoYW4gdGhlIG1heENyaXRlcmlhLCAiICsgbWF4Q3JpdGVyaWEgKyBFT0wpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgd2VpcmQKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgdGFidWxhdGUoaW50IGxlbmd0aCkgewogICAgICAgIEludGVnZXIgY2F0ZWdvcnkgPSBuZXcgSW50ZWdlcihsZW5ndGgpOwogICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgZGlzdHJpYnV0aW9uLmdldChjYXRlZ29yeSk7CiAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gb3VyIGZpcnN0IG9jY3VyYW5jZQogICAgICAgICAgICBjb3VudCA9IG5ldyBJbnRlZ2VyKDEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDE7CiAgICAgICAgfQogICAgICAgIGRpc3RyaWJ1dGlvbi5wdXQoY2F0ZWdvcnksIGNvdW50KTsKICAgIH0KCiAgICBwdWJsaWMgaW50IHRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbEdyb3VwSVVzKCk7CiAgICAgICAgcmV0dXJuIGNoZWNrRmVhdHVyZURpckxlbnRocyhhbGxJVXMpOwogICAgfQoKICAgIHByaXZhdGUgaW50IGNoZWNrRmVhdHVyZURpckxlbnRocyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGFuYWx5emUoYWxsSVVzKTsKICAgICAgICBwcmludFJlcG9ydCgpOwogICAgICAgIHJldHVybiBsb25nZXN0TmFtZXMuc2l6ZSgpOwogICAgfQp9ClBLAwQKAAAIAACPtUdA4D/bXgQbAAAEGwAANgAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvUHJvdmlkZXJOYW1lQ2hlY2tlci5jbGFzc8r+ur4AAAAxAUYHAAIBADBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIHAAQBACVvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQART0xEX1BST1ZJREVSX05BTUUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQALRWNsaXBzZS5vcmcBABdFWFBFQ1RFRF9QUk9WSURFUl9OQU1FUwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABAMAAwADQcAEgEAEGphdmEvbGFuZy9TdHJpbmcIABQBABdFY2xpcHNlIEVxdWlub3ggUHJvamVjdAgAFgEAC0VjbGlwc2UgUFRQCAAYAQANRWNsaXBzZSBPcmJpdAgAGgEAGkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCAAcAQALRWNsaXBzZSBDRFQIAB4BAB9FY2xpcHNlIEFnZW50IE1vZGVsaW5nIFBsYXRmb3JtCAAgAQAURWNsaXBzZSBCSVJUIFByb2plY3QIACIBABtFY2xpcHNlIERhdGEgVG9vbHMgUGxhdGZvcm0IACQBABhFY2xpcHNlIE1vZGVsaW5nIFByb2plY3QIACYBAA1FY2xpcHNlIE15bHluCAAoAQAXRWNsaXBzZSBNZW1vcnkgQW5hbHl6ZXIIACoBABNFY2xpcHNlIExpbnV4IFRvb2xzCAAsAQAORWNsaXBzZSBKdWJ1bGEIAC4BABVFY2xpcHNlIEpldHR5IFByb2plY3QIADABAA1FY2xpcHNlIEd5cmV4CAAyAQAMRWNsaXBzZSBFR2l0CAA0AQAMRWNsaXBzZSBKR2l0CAA2AQAeRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQcm9qZWN0CAA4AQAZRWNsaXBzZSBQYWNrYWdpbmcgUHJvamVjdAgAOgEAFUVjbGlwc2UgU2NvdXQgUHJvamVjdAgAPAEAEEVjbGlwc2UgU2VxdW95YWgIAD4BABJFY2xpcHNlIFRNIFByb2plY3QJAAEAQAwACgALAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAMkxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXI7AQASY2hlY2tQcm92aWRlck5hbWVzAQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspWgEACkV4Y2VwdGlvbnMHAEkBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVoHAE0BABNqYXZhL3V0aWwvQXJyYXlMaXN0CgBMABAKAAEAUAwAUQBSAQASZ2V0T3V0cHV0RGlyZWN0b3J5AQAUKClMamF2YS9sYW5nL1N0cmluZzsHAFQBAAxqYXZhL2lvL0ZpbGUIAFYBABJwcm92aWRlck5hbWVzLmh0bWwKAFMAWAwADABZAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwBbAQASamF2YS9pby9GaWxlV3JpdGVyCgBaAF0MAAwAXgEAEShMamF2YS9pby9GaWxlOylWCQBgAGIHAGEBABBqYXZhL2xhbmcvU3lzdGVtDABjAGQBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsHAGYBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAaAEACG91dHB1dDogCgBlAGoMAAwAawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAUwBtDABuAFIBAA9nZXRBYnNvbHV0ZVBhdGgKAGUAcAwAcQByAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBlAHQMAHUAUgEACHRvU3RyaW5nCgB3AHkHAHgBABNqYXZhL2lvL1ByaW50U3RyZWFtDAB6AGsBAAdwcmludGxuCwB8AH4HAH0BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwAfwCAAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsAggCEBwCDAQANamF2YS91dGlsL1NldAwAhQCGAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwCIAIoHAIkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAIsAjAEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwcAjgEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAgAkAEABHRydWUIAJIBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkLAI0AlAwAlQCWAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAEQCYDACZAJoBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoIAJwBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQKAAEAngwAnwCgAQAJaXNTcGVjaWFsAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoIAKIBAB9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyCwCNAKQMAJUApQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CwCnAKkHAKgBAA5qYXZhL3V0aWwvTGlzdAwAqgCaAQADYWRkCACsAQABJQoAEQCuDACvALABAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCACyAQAHRWNsaXBzZQgAtAEAC2VjbGlwc2Uub3JnCAC2AQALVEhBTEVTR1JPVVAIALgBAAVJTlJJQQgAugEAC0VuZ2luZWVyaW5nCAC8AQAPb3JnLmVjbGlwc2Uuand0CgARAL4MAL8AwAEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCADCAQAPd3d3LmV4YW1wbGUub3JnCADEAQAPd3d3LmVjbGlwc2Uub3JnCADGAQAIUHJvdmlkZXIIAMgBAAhwcm92aWRlcggAygEAB0J1bmRsZS0IAMwBAARidW5kCADOAQAHRWNsaXNwZQgA0AEADkVjbGlwc2Uub3JnIC0gCgABANIMANMAsAEAFGluTGlzdE9mRXhwZWN0ZWROYW1lCgDVANcHANYBABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwA2AANAQAPcHJpbnRTdGFja1RyYWNlCwCIANoMANsA3AEAB2hhc05leHQBAAMoKVoIAN4BACo8aDE+UHJvdmlkZXIgbmFtZXMgdXNlZCBpbiByZXBvc2l0b3J5PC9oMT4JAAEA4AwA4QAGAQADRU9MCgBaAOMMAOQAawEABXdyaXRlCADmAQAhPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAOgMAOkAUgEAEGdldFJlcG9VUkxUb1Rlc3QIAOsBAAQ8L3A+CADtAQA9PGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPgoAAQDvDADwAPEBABJwcmludExpbmVzUHJvdmlkZXIBACcoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS91dGlsL0xpc3Q7KVYIAPMBAEQ8aDI+SW5kZXRlcm1pbmF0ZTogbWF5YmUgY29ycmVjdCwgbWF5YmUgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPggA9QEANzxoMj5NaW5vciBwcm9ibGVtIG9mIHVzaW5nIG9sZCBzdHlsZSBwcm92aWRlciBuYW1lPC9oMj4IAPcBAC08aDI+UHJvYmFibHkgdXNpbmcgY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4LAKcA+QwA+gD7AQAEc2l6ZQEAAygpSQoAWgD9DAD+AA0BAAVjbG9zZQoASADXAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAFWluY29ycmVjdFByb3ZpZGVyTmFtZQEAEExqYXZhL3V0aWwvTGlzdDsBABNjb3JyZWN0UHJvdmlkZXJOYW1lAQAYaW5jb3JyZWN0T2xkUHJvdmlkZXJOYW1lAQATdW5rbm93blByb3ZpZGVyTmFtZQEAC3Rlc3REaXJOYW1lAQACaXUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEACmlzQ2F0ZWdvcnkBAAFaAQAKaXNGcmFnbWVudAEADHByb3ZpZGVyTmFtZQEAAWUBABxMamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQBETGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsBABF0ZXN0UHJvdmlkZXJOYW1lcwcBGgEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcBHAEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24HAR4BADNvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KAAEBIAwBIQEiAQAJZ2V0QWxsSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABASQMAEUARgEABnJlc3VsdAEAAWkBAAFJAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcBKgEAK29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IKASkAEAoBLQEvBwEuAQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDAEwATEBAARzb3J0AQApKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0NvbXBhcmF0b3I7KVYIATMBAAo8cD5Db3VudDogCgBlATUMAHEBNgEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIATgBAAQ8b2w+CwCnAIQKAAEBOwwBPAE9AQARcHJpbnRMaW5lTGlzdEl0ZW0BAFsoTGphdmEvaW8vRmlsZVdyaXRlcjtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0O0xqYXZhL2xhbmcvU3RyaW5nOylWCAE/AQAFPC9vbD4BAAZpdUxpc3QBABZjb21wYXJhdG9yUHJvdmlkZXJOYW1lAQAWTGphdmEvdXRpbC9Db21wYXJhdG9yOwEAS0xqYXZhL3V0aWwvQ29tcGFyYXRvcjwtTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEAClNvdXJjZUZpbGUBABhQcm92aWRlck5hbWVDaGVja2VyLmphdmEAIQABAAMAAAACABoABQAGAAEABwAAAAIACAACAAoACwAAAAUAAQAMAA0AAQAOAAAAvgAFAAEAAACMKrcADyoQFr0AEVkDEhNTWQQSFVNZBRIXU1kGEhlTWQcSG1NZCBIdU1kQBhIfU1kQBxIhU1kQCBIjU1kQCRIlU1kQChInU1kQCxIpU1kQDBIrU1kQDRItU1kQDhIvU1kQDxIxU1kQEBIzU1kQERI1U1kQEhI3U1kQExI5U1kQFBI7U1kQFRI9U7UAP7EAAAACAEEAAAAOAAMAAAATAAQAFQCLABMAQgAAAAwAAQAAAIwAQwBEAAAAAgBFAEYAAwBHAAAABAABAEgASgAAAAIASwAOAAAErgAE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vR0AADUAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy5yZXBvcy5UZXN0UmVwbzsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHMuSVVJZENvbXBhcmF0b3I7CgpwdWJsaWMgY2xhc3MgUHJvdmlkZXJOYW1lQ2hlY2tlciBleHRlbmRzIFRlc3RSZXBvIHsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfUFJPVklERVJfTkFNRSAgICAgICA9ICJFY2xpcHNlLm9yZyI7CiAgICBwcml2YXRlIFN0cmluZ1tdICAgICAgICAgICAgRVhQRUNURURfUFJPVklERVJfTkFNRVMgPSB7IkVjbGlwc2UgRXF1aW5veCBQcm9qZWN0IiwgIkVjbGlwc2UgUFRQIiwgIkVjbGlwc2UgT3JiaXQiLCAiRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0iLCAiRWNsaXBzZSBDRFQiLCAiRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybSIsICJFY2xpcHNlIEJJUlQgUHJvamVjdCIsICJFY2xpcHNlIERhdGEgVG9vbHMgUGxhdGZvcm0iLCAiRWNsaXBzZSBNb2RlbGluZyBQcm9qZWN0IiwgIkVjbGlwc2UgTXlseW4iLCAiRWNsaXBzZSBNZW1vcnkgQW5hbHl6ZXIiLCAiRWNsaXBzZSBMaW51eCBUb29scyIsICJFY2xpcHNlIEp1YnVsYSIsICJFY2xpcHNlIEpldHR5IFByb2plY3QiLCAiRWNsaXBzZSBHeXJleCIsICJFY2xpcHNlIEVHaXQiLCAiRWNsaXBzZSBKR2l0IiwgIkVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUHJvamVjdCIsICJFY2xpcHNlIFBhY2thZ2luZyBQcm9qZWN0IiwgIkVjbGlwc2UgU2NvdXQgUHJvamVjdCIsICJFY2xpcHNlIFNlcXVveWFoIiwgIkVjbGlwc2UgVE0gUHJvamVjdCJ9OwoKICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1Byb3ZpZGVyTmFtZXMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBpbmNvcnJlY3RQcm92aWRlck5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBjb3JyZWN0UHJvdmlkZXJOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0T2xkUHJvdmlkZXJOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gdW5rbm93blByb3ZpZGVyTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJwcm92aWRlck5hbWVzLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXRlZ29yeSA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSIpKTsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZXhjbHVkZSBmcmFnbWVudHM/CiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0ZyYWdtZW50ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IikpOwoKCiAgICAgICAgICAgICAgICAgICAgLy98fCBpdS5nZXRJZCgpLmVuZHNXaXRoKCJmZWF0dXJlLmdyb3VwIikKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2F0ZWdvcnkgJiYgIWlzU3BlY2lhbChpdSkgJiYgIWlzRnJhZ21lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyTmFtZSA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9WSURFUiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0UHJvdmlkZXJOYW1lLmFkZChpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uIGVycm9ycyBhbmQgbWlzc3BlbGxpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCIlIikgfHwgcHJvdmlkZXJOYW1lLmVxdWFscygiRWNsaXBzZSIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJlY2xpcHNlLm9yZyIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJUSEFMRVNHUk9VUCIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJJTlJJQSIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJFbmdpbmVlcmluZyIpIHx8IHByb3ZpZGVyTmFtZS5jb250YWlucygib3JnLmVjbGlwc2Uuand0IikgfHwgcHJvdmlkZXJOYW1lLmNvbnRhaW5zKCJ3d3cuZXhhbXBsZS5vcmciKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoInd3dy5lY2xpcHNlLm9yZyIpIHx8IHByb3ZpZGVyTmFtZS5jb250YWlucygiUHJvdmlkZXIiKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoInByb3ZpZGVyIikgfHwgcHJvdmlkZXJOYW1lLnN0YXJ0c1dpdGgoIkJ1bmRsZS0iKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiYnVuZCIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJFY2xpc3BlIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJFY2xpcHNlLm9yZyAtICIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0UHJvdmlkZXJOYW1lLmFkZChpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5MaXN0T2ZFeHBlY3RlZE5hbWUocHJvdmlkZXJOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKE9MRF9QUk9WSURFUl9OQU1FLmVxdWFscyhwcm92aWRlck5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RPbGRQcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciBpcyBpbXBvcnRhbnQsIHN0YXJ0cyB3aXRoIEVjbGlwc2UsIGJ1dCBub3Qgb25lIG9mIHRoZSBhYm92ZSBlLmcuICJFY2xpcHNlIE9yYml0IiBvciAiRWNsaXBzZS5vcmciPyAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXZlbnR1YWxseSBwdXQgaW4gd2l0aCAiaW5jb3JyZWN0PyIKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXJOYW1lLnN0YXJ0c1dpdGgoIkVjbGlwc2UiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93blByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93blByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVyaW1lbnQgdG8gZmluZCBjb25maWdzIGFuZCBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRBbGxQcm9wZXJ0aWVzKG91dGZpbGVXcml0ZXIsIGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgxPlByb3ZpZGVyIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+IiArIEVPTCk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+TWFqb3I6IG1pc3Npbmcgb3IgKHByb2JhYmx5KSBpbmNvcnJlY3QgcHJvdmlkZXIgbmFtZTwvaDI+IiArIEVPTCk7CiAgICAgICAgICAgIHByaW50TGluZXNQcm92aWRlcihvdXRmaWxlV3JpdGVyLCBpbmNvcnJlY3RQcm92aWRlck5hbWUpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+SW5kZXRlcm1pbmF0ZTogbWF5YmUgY29ycmVjdCwgbWF5YmUgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzUHJvdmlkZXIob3V0ZmlsZVdyaXRlciwgdW5rbm93blByb3ZpZGVyTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5NaW5vciBwcm9ibGVtIG9mIHVzaW5nIG9sZCBzdHlsZSBwcm92aWRlciBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc1Byb3ZpZGVyKG91dGZpbGVXcml0ZXIsIGluY29ycmVjdE9sZFByb3ZpZGVyTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5Qcm9iYWJseSB1c2luZyBjb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzUHJvdmlkZXIob3V0ZmlsZVdyaXRlciwgY29ycmVjdFByb3ZpZGVyTmFtZSk7CgogICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChpbmNvcnJlY3RQcm92aWRlck5hbWUuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbmFtaW5nIG9yIGxvY2FsaXphdGlvbi4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAvLyAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGluY29ycmVjdFByb3ZpZGVyTmFtZS5zaXplKCkgPiAwOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHdlaXJkCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0UHJvdmlkZXJOYW1lcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gZ2V0QWxsSVVzKCk7CiAgICAgICAgcmV0dXJuIGNoZWNrUHJvdmlkZXJOYW1lcyhhbGxJVXMpOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBpbkxpc3RPZkV4cGVjdGVkTmFtZShTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYUEVDVEVEX1BST1ZJREVSX05BTUVTLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChFWFBFQ1RFRF9QUk9WSURFUl9OQU1FU1tpXS5lcXVhbHMocHJvdmlkZXJOYW1lKSkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CgogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludExpbmVzUHJvdmlkZXIoRmlsZVdyaXRlciBvdXQsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaXVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIENvbXBhcmF0b3I8PyBzdXBlciBJSW5zdGFsbGFibGVVbml0PiBjb21wYXJhdG9yUHJvdmlkZXJOYW1lID0gbmV3IElVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IoKTsKICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvclByb3ZpZGVyTmFtZSA9IG5ldyBJVUlkQ29tcGFyYXRvcigpOwogICAgICAgIENvbGxlY3Rpb25zLnNvcnQoaXVMaXN0LCBjb21wYXJhdG9yUHJvdmlkZXJOYW1lKTsKICAgICAgICBvdXQud3JpdGUoIjxwPkNvdW50OiAiICsgaXVMaXN0LnNpemUoKSArIEVPTCk7CiAgICAgICAgb3V0LndyaXRlKCI8b2w+IiArIEVPTCk7CgogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGl1TGlzdCkgewogICAgICAgICAgICBwcmludExpbmVMaXN0SXRlbShvdXQsIGl1LCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPVklERVIpOwogICAgICAgIH0KICAgICAgICBvdXQud3JpdGUoIjwvb2w+IiArIEVPTCk7CiAgICB9Cn0KUEsDBAoAAAgAAIy2R0Buu+9MIz4AACM+AABAAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlci5jbGFzc8r+ur4AAAAxAe4HAAIBADpvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyBwAEAQAlb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwbwEAIVNUQU5EQVJEX0xJQ0VOU0VTX1BST1BFUlRJRVNfRklMRQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAFXByZXZpb3VzUGFja2FnZUhlYWRlcgEACDxjbGluaXQ+AQADKClWAQAEQ29kZQgADAEAG3N0YW5kYXJkTGljZW5zZXMucHJvcGVydGllcwkAAQAODAAFAAYBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAY8aW5pdD4KAAMAEwwAEQAJCQABABUMAAcABgEABHRoaXMBADxMb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcjsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgoAAQATCQAcAB4HAB0BABBqYXZhL2xhbmcvU3lzdGVtDAAfACABAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIACIBAAAKAAEAJAwAJQAmAQASZ2V0SW5pdGlhbFNlZ21lbnRzAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKACgAKgcAKQEAE2phdmEvaW8vUHJpbnRTdHJlYW0MACsALAEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIAC4BAANvbmUIADABAAdvbmUudHdvCAAyAQANb25lLnR3by50aHJlZQgANAEAEm9uZS50d28udGhyZWUuZm91cggANgEAF29uZS50d28udGhyZWUuZm91ci5maXZlCAA4AQABLggAOgEACG9uZS50d28uAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAhpbnN0YW5jZQEAF2NoZWNrTGljZW5zZUNvbnNpc3RlbmN5AQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspWgEACkV4Y2VwdGlvbnMHAEIBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVoHAEYBABRqYXZhL3V0aWwvUHJvcGVydGllcwoARQATCgBJAEsHAEoBABBqYXZhL2xhbmcvT2JqZWN0DABMAE0BAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsKAE8AUQcAUAEAD2phdmEvbGFuZy9DbGFzcwwAUgBTAQATZ2V0UmVzb3VyY2VBc1N0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07CgBFAFUMAFYAVwEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYIAFkBAAtsaWNlbnNlMjAxMQoARQBbDABcACYBAAtnZXRQcm9wZXJ0eQgAXgEAC2xpY2Vuc2UyMDEwBwBgAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9MaWNlbnNlCgBfAGIMABEAYwEANShMamF2YS9uZXQvVVJJO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwBlAQATamF2YS91dGlsL0FycmF5TGlzdAoAZAATCgABAGgMAGkAagEADWNoZWNrTGljZW5zZXMBANIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYKAAEAbAwAbQBuAQAScHJpbnRSZXBvcnRMaWNlbnNlAQBTKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYLAHAAcgcAcQEADmphdmEvdXRpbC9MaXN0DABzAHQBAARzaXplAQADKClJAQALYWxsRmVhdHVyZXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAGcmVzdWx0AQABWgEACnByb3BlcnRpZXMBABZMamF2YS91dGlsL1Byb3BlcnRpZXM7AQAIaW5TdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBAAhib2R5MjAxMQEACGJvZHkyMDEwAQATc3RhbmRhcmRMaWNlbnNlMjAxMQEAKkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlOwEAE3N0YW5kYXJkTGljZW5zZTIwMTABAAlub0xpY2Vuc2UBABBMamF2YS91dGlsL0xpc3Q7AQAMZXh0cmFMaWNlbnNlAQALZ29vZExpY2Vuc2UBAApvbGRMaWNlbnNlAQAKYmFkTGljZW5zZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEARExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQIKKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylWBwCNAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAI8BACROdW1iZXIgb2YgSVVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAKAIwAkQwAEQAsCwCTAJUHAJQBAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwAlgCXAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsAmQByBwCaAQANamF2YS91dGlsL1NldAoAjACcDACdAJ4BAAZhcHBlbmQBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgCMAKAMAKEAogEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsLAJkApAwApQCmAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwCoAKoHAKkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAKsArAEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwcArgEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAsArQCwDACxAKIBAAVnZXRJZAgAswEADi5mZWF0dXJlLmdyb3VwCgC1ALcHALYBABBqYXZhL2xhbmcvU3RyaW5nDAC4ALkBAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWgsArQC7DAC8AL0BAAtnZXRMaWNlbnNlcwEAKihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9Db2xsZWN0aW9uOwsAvwDBBwDAAQAUamF2YS91dGlsL0NvbGxlY3Rpb24MAMIAwwEAB2lzRW1wdHkBAAMoKVoLAHAAxQwAxgDHAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCwC/AHILAL8ApAcAywEAKG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2ULAMoAzQwAzgCiAQAHZ2V0VVVJRAoAtQDQDADRAMcBAAZlcXVhbHMLAMoA0wwA1ACiAQAHZ2V0Qm9keQoAtQDWDADXAHQBAAZsZW5ndGgLAKgA2QwA2gDDAQAHaGFzTmV4dAgA3AEAJk51bWJlciBmZWF0dXJlcyBkdXJpbmcgbGljZW5zZSBjaGVjazogCADeAQApTnVtYmVyIG5vbi1mZWF0dWVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiABABNwbGF0Zm9ybUxpY2Vuc2UyMDExAQATcGxhdGZvcm1MaWNlbnNlMjAxMAEACW5GZWF0dXJlcwEAAUkBAAxuTm9uRmVhdHVyZXMBAAdmZWF0dXJlAQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAhsaWNlbnNlcwEAFkxqYXZhL3V0aWwvQ29sbGVjdGlvbjsBAA5mZWF0dXJlTGljZW5zZQEAEmZlYXR1cmVMaWNlbnNlVGV4dAEAQkxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JTGljZW5zZTs+OwEBVyhMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYKAAEA7QwA7gCiAQASZ2V0T3V0cHV0RGlyZWN0b3J5BwDwAQAMamF2YS9pby9GaWxlCADyAQAXbGljZW5zZUNvbnNpc3RlbmN5Lmh0bWwKAO8A9AwAEQD1AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwD3AQASamF2YS9pby9GaWxlV3JpdGVyCgD2APkMABEA+gEAEShMamF2YS9pby9GaWxlOylWCAD8AQAeUmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAP4MAP8AogEAEGdldFJlcG9VUkxUb1Rlc3QKAIwBAQwAnQECAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgABAQQMAQUBBgEADnByaW50cGFyYWdyYXBoAQApKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvbGFuZy9TdHJpbmc7KVYIAQgBAAkJb3V0cHV0OiAKAO8BCgwBCwCiAQAPZ2V0QWJzb2x1dGVQYXRoCAENAQAbTGljZW5zZSBDb25zaXN0ZW5jeSBTdW1tYXJ5CgABAQ8MARABEQEAC3ByaW50SGVhZGVyAQAqKExqYXZhL2lvL0ZpbGVXcml0ZXI7SUxqYXZhL2xhbmcvU3RyaW5nOylWCAETAQApRmVhdHVyZXMgd2l0aCBjb25mb3JtaW5nICgyMDExKSBsaWNlbnNlOiAKAAEBFQwAKwEGCAEXAQAiRmVhdHVyZXMgd2l0aCBvbGQgKDIwMTApIGxpY2Vuc2U6IAgBGQEAKUZlYXR1cmVzIHdpdGggZGlmZmVyZW50IChvciBubykgbGljZW5zZTogCAEbAQAkRmVhdHVyZXMgd2l0aCBubyBsaWNlbnNlIGF0dHJpYnV0ZTogCAEdAQAeRmVhdHVyZXMgd2l0aCBleHRyYSBsaWNlbnNlczogCAEfAQAHRGV0YWlscwgBIQEAIkZlYXR1cmVzIHdpdGggbm8gbGljZW5zZSBhdHRyaWJ1dGUHASMBACtvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yCgEiABMKASYBKAcBJwEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwBKQEqAQAEc29ydAEAKShMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yOylWCwBwAKQIAS0BAE1GZWF0dXJlcyB3aXRoIGRpZmZlcmVudCAob3Igbm8pIGxpY2Vuc2UgKGFuZCBmaXJzdCBmZXcgbGluZXMgb2YgbGljZW5zZSB0ZXh0KQoAAQEvDAEwAQYBABJtYWtlSGVhZGVySWZOZWVkZWQLAK0BMgwAvAEzAQAYKClMamF2YS91dGlsL0NvbGxlY3Rpb247CgE1ATcHATYBAA5qYXZhL2xhbmcvTWF0aAwBOAE5AQADbWluAQAFKElJKUkKALUBOwwBPAE9AQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwgBPwEAIEZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlCAFBAQAlRmVhdHVyZXMgd2l0aCBtYXRjaGluZyAoMjAxMSkgbGljZW5zZQoAQQFDDAFEAAkBAA9wcmludFN0YWNrVHJhY2UKAPYBRgwBRwAJAQAFY2xvc2UBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBAAt0ZXN0RGlyTmFtZQEABHVuaXQBAAtsaWNlbnNlVGV4dAEABmFtb3VudAEAEHNob3J0TGljZW5zZVRleHQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247CAFUAQAgVW5leHBlY3RlZGx5IGVtcHR5IHBhY2thZ2UgbmFtZT8BAApvdXRwdXRmaWxlAQACaWQBAA5wcm9wb3NlZEhlYWRlcggBWQEAAlwuCgC1AVsMAVwBXQEABXNwbGl0AQAnKExqYXZhL2xhbmcvU3RyaW5nOylbTGphdmEvbGFuZy9TdHJpbmc7CgC1AV8MAWABYQEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEAE3Byb3Bvc2VkSGVhZGVyQXJyYXkBAAluU2VnbWVudHMBAAFpAQATdGVzdERpc3BsYXlhYmxlRGF0YQcBZwEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcBaQEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24HAWsBADNvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KAAEBbQwBbgFvAQAOZ2V0QWxsR3JvdXBJVXMBAC0oKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsKAAEBcQwAPgA/CgABAXMMAXQAPwEAD2NoZWNrQ29weXJpZ2h0cwoAAQF2DAF3AD8BABFjaGVja0Rlc2NyaXB0aW9ucwEABmFsbElVcwsArQF6DAF7AXwBAAxnZXRDb3B5cmlnaHQBAEAoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lDb3B5cmlnaHQ7CwF+ANMHAX8BACpvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lDb3B5cmlnaHQIAYEBAAElCgC1AYMMAYQAuQEACnN0YXJ0c1dpdGgIAYYBAAFbCAGIAQAJQ29weXJpZ2h0CAGKAQANKGMpIENvcHlyaWdodAoAtQGMDAGNAY4BAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWggBkAEACWNvcHlyaWdodAoAAQGSDAGTAZQBABVwcmludFJlcG9ydENvcHlyaWdodHMBADMoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYBABBub09yQmFkQ29weXJpZ2h0AQALb2tDb3B5cmlnaHQBABZpbmRldGVybWluYXRlQ29weXJpZ2h0AQAsTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUNvcHlyaWdodDsBAARib2R5CAGbAQAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbgsArQGdDABcAZ4BADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAAQGgDAGhAaIBABZwcmludFJlcG9ydERlc2NyaXB0aW9uAQAjKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7KVYBAAlub25lT3JCYWQBAAJvawEAC2Rlc2NyaXB0aW9uAQCLKExqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVggBqAEAHTxiciAvPj09PT09PT09PT09PT09PT09PT09PT09CAGqAQARZGVzY3JpcHRpb25zLmh0bWwIAawBAAhvdXRwdXQ6IAgBrgEAITxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6IAgBsAEABDwvcD4JAAEBsgwBswAGAQADRU9MCAG1AQAfPGJyIC8+PGJyIC8+RGVzY3JpcHRpb24gUmVwb3J0OggBtwEALkZlYXR1cmVzIHdyb25nIG9yIHVuZXhwbGFpbmFibGUgZGVzY3JpcHRpb25zOiAIAbkBABtGZWF0dXJlcyBwcm9iYWJseSBjb3JyZWN0OiAIAbsBABc9PT09PT09PT09PT09PT09PT09PT09PQgBvQEAFDxiciAvPjxiciAvPkRldGFpbHM6CAG/AQAoRmVhdHVyZXMgd2l0aCBubyBvciBkdWJpb3VzIGRlc2NyaXBpdG9uOgoAAQHBDAHCAcMBABRwcmludExpbmVEZXNjcmlwdGlvbgEASShMamF2YS9pby9GaWxlV3JpdGVyO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVYIAcUBACc8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIGRlc2NyaXBpdG9uczoBAAZTUEFDRVIBAM8oTGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYIAckBAA9jb3B5cmlnaHRzLmh0bWwIAcsBAB08YnIgLz48YnIgLz5Db3B5cmlnaHQgUmVwb3J0OggBzQEALEZlYXR1cmVzIHdyb25nIG9yIHVuZXhwbGFpbmFibGUgY29weXJpZ2h0czogCAHPAQAwRmVhdHVyZXMgbWF5YmUgd3JvbmcsIG1heWJlIGNvcnJlY3QgY29weXJpZ2h0czogCAHRAQA7RmVhdHVyZXMgd2l0aCBubyBvciBwcm9iYWJseSBpbmNvcnJlY3QgY29weXJpZ2h0IHN0YXRlbWVudDoKAAEB0wwB1AHDAQAScHJpbnRMaW5lQ29weXJpZ2h0CAHWAQBnPGJyIC8+PGJyIC8+SW5kZXRlcm1pbmFudDogZmVhdHVyZSdzIGNv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AgBZAZAABgADAAsAUAHpAZgABAAgADsB6gAGAAUAKwAwAesABgAGAAIBwgHDAAIAQAAAAAQAAQBBAAoAAADKAAUABgAAAE4sEwGaAbkBnAMATiy5AK8BADoELLkB3AEAtgHgOgUqK7sAjFkZBLgBXrcAkBMB47YBABkFtgEAsgHltgEAEwHjtgEALbYBALYAn7YBFLEAAAACAA8AAAAmAAkAAAHbAAQB3AAFAdsACwHdABMB3gAeAd8AQwHgAEoB3wBNAeEAEAAAAD4ABgAAAE4AFgAXAAAAAABOAUgBSQABAAAATgHoAOUAAgALAEMBpQAGAAMAEwA7AeoABgAEAB4AMAHrAAYABQABAewAAAACAe1QSwMECgAACAAAjLZHQIdNhImjQQAAo0EAAD8AAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3M7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuTGljZW5zZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklDb3B5cmlnaHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklMaWNlbnNlOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnJlcG9zLlRlc3RSZXBvOwppbXBvcnQgb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlscy5JVUlkQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlciBleHRlbmRzIFRlc3RSZXBvIHsKCXByaXZhdGUgc3RhdGljIFN0cmluZyBTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUgPSAic3RhbmRhcmRMaWNlbnNlcy5wcm9wZXJ0aWVzIjsKCXByaXZhdGUgU3RyaW5nIHByZXZpb3VzUGFja2FnZUhlYWRlciA9IG51bGw7CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCS8vIEZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyIGZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyID0gbmV3CgkJLy8gRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIoKTsKCQkvLyBmZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcgoJCS8vIC5zZXRSZXBvVVJMVG9UZXN0KCIvaG9tZS9kYXZpZHcvYnVpbGQvZmluYWwvYWdncmVnYXRlIik7CgkJLy8gZmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuc2V0T3V0cHV0RGlyZWN0b3J5KCIvaG9tZS9kYXZpZHcvdGVtcCIpOwoJCS8vIHRyeSB7CgkJLy8gZmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIudGVzdERpc3BsYXlhYmxlRGF0YSgpOwoJCS8vIH0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7CgkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKCQkvLyB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewoJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CgkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CgkJLy8gfQoKCQlGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlciBpbnN0YW5jZSA9IG5ldyBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcigpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZS5nZXRJbml0aWFsU2VnbWVudHMoIiIpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2UuZ2V0SW5pdGlhbFNlZ21lbnRzKCJvbmUiKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKGluc3RhbmNlLmdldEluaXRpYWxTZWdtZW50cygib25lLnR3byIpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2UuZ2V0SW5pdGlhbFNlZ21lbnRzKCJvbmUudHdvLnRocmVlIikpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZS5nZXRJbml0aWFsU2VnbWVudHMoIm9uZS50d28udGhyZWUuZm91ciIpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2UKCQkJCS5nZXRJbml0aWFsU2VnbWVudHMoIm9uZS50d28udGhyZWUuZm91ci5maXZlIikpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZS5nZXRJbml0aWFsU2VnbWVudHMoIi4iKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKGluc3RhbmNlLmdldEluaXRpYWxTZWdtZW50cygib25lLnR3by4iKSk7Cgl9CgoJcHJpdmF0ZSBib29sZWFuIGNoZWNrTGljZW5zZUNvbnNpc3RlbmN5KAoJCQlJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsRmVhdHVyZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwoKCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAoJCQkJU1RBTkRBUkRfTElDRU5TRVNfUFJPUEVSVElFU19GSUxFKTsKCQlwcm9wZXJ0aWVzLmxvYWQoaW5TdHJlYW0pOwoJCVN0cmluZyBib2R5MjAxMSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImxpY2Vuc2UyMDExIik7CgkJU3RyaW5nIGJvZHkyMDEwID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibGljZW5zZTIwMTAiKTsKCQlJTGljZW5zZSBzdGFuZGFyZExpY2Vuc2UyMDExID0gbmV3IExpY2Vuc2UobnVsbCwgYm9keTIwMTEsIG51bGwpOwoJCUlMaWNlbnNlIHN0YW5kYXJkTGljZW5zZTIwMTAgPSBuZXcgTGljZW5zZShudWxsLCBib2R5MjAxMCwgbnVsbCk7CgoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbm9MaWNlbnNlID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZXh0cmFMaWNlbnNlID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZ29vZExpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CgkJTGlzdDxJSW5zdGFsbGFibGVVbml0PiBvbGRMaWNlbnNlID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkTGljZW5zZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKCQljaGVja0xpY2Vuc2VzKHN0YW5kYXJkTGljZW5zZTIwMTEsIHN0YW5kYXJkTGljZW5zZTIwMTAsIGFsbEZlYXR1cmVzLAoJCQkJZ29vZExpY2Vuc2UsIG9sZExpY2Vuc2UsIGJhZExpY2Vuc2UsIG5vTGljZW5zZSwgZXh0cmFMaWNlbnNlKTsKCgkJcHJpbnRSZXBvcnRMaWNlbnNlKGdvb2RMaWNlbnNlLCBvbGRMaWNlbnNlLCBiYWRMaWNlbnNlLCBub0xpY2Vuc2UsCgkJCQlleHRyYUxpY2Vuc2UpOwoJCXJlc3VsdCA9ICgoYmFkTGljZW5zZS5zaXplKCkgPiAwKSB8fCAoZXh0cmFMaWNlbnNlLnNpemUoKSA+IDApIHx8IChub0xpY2Vuc2UKCQkJCS5zaXplKCkgPiAwKSk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglwcml2YXRlIHZvaWQgY2hlY2tMaWNlbnNlcyhJTGljZW5zZSBwbGF0Zm9ybUxpY2Vuc2UyMDExLAoJCQlJTGljZW5zZSBwbGF0Zm9ybUxpY2Vuc2UyMDEwLAoJCQlJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsRmVhdHVyZXMsCgkJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZ29vZExpY2Vuc2UsCgkJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gb2xkTGljZW5zZSwKCQkJTGlzdDxJSW5zdGFsbGFibGVVbml0PiBiYWRMaWNlbnNlLAoJCQlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG5vTGljZW5zZSwKCQkJTGlzdDxJSW5zdGFsbGFibGVVbml0PiBleHRyYUxpY2Vuc2UpIHsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBJVXMgZHVyaW5nIGxpY2Vuc2UgY2hlY2s6ICIKCQkJCSsgYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKS5zaXplKCkpOwoJCWludCBuRmVhdHVyZXMgPSAwOwoJCWludCBuTm9uRmVhdHVyZXMgPSAwOwoJCWZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewoJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgSUQ6ICIgKyBmZWF0dXJlLmdldElkKCkpOwoJCQkvLyBpZ25vcmUgSVVzIHRoYXQgYXJlIG5vdCBmZWF0dXJlcwoJCQkvLyBUT0RPOiBidXQsIHdlIGdldCAiZ3JvdXBzIiAuLi4gd2hhdCBraW5kIG9mIGdyb3VwcyBhcmUgbm90CgkJCS8vIGZlYXR1cmUgZ3JvdXBzPwoJCQlpZiAoZmVhdHVyZS5nZXRJZCgpLmVuZHNXaXRoKCIuZmVhdHVyZS5ncm91cCIpKSB7CgkJCQluRmVhdHVyZXMrKzsKCQkJCUNvbGxlY3Rpb248SUxpY2Vuc2U+IGxpY2Vuc2VzID0gZmVhdHVyZS5nZXRMaWNlbnNlcyhudWxsKTsKCQkJCWlmIChsaWNlbnNlcy5pc0VtcHR5KCkpIHsKCQkJCQlub0xpY2Vuc2UuYWRkKGZlYXR1cmUpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKGxpY2Vuc2VzLnNpemUoKSAhPSAxKSB7CgkJCQkJZXh0cmFMaWNlbnNlLmFkZChmZWF0dXJlKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCUlMaWNlbnNlIGZlYXR1cmVMaWNlbnNlID0gbGljZW5zZXMuaXRlcmF0b3IoKS5uZXh0KCk7CgkJCQlpZiAocGxhdGZvcm1MaWNlbnNlMjAxMC5nZXRVVUlEKCkuZXF1YWxzKAoJCQkJCQlmZWF0dXJlTGljZW5zZS5nZXRVVUlEKCkpKSB7CgkJCQkJb2xkTGljZW5zZS5hZGQoZmVhdHVyZSk7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpZiAocGxhdGZvcm1MaWNlbnNlMjAxMS5nZXRVVUlEKCkuZXF1YWxzKAoJCQkJCQlmZWF0dXJlTGljZW5zZS5nZXRVVUlEKCkpKSB7CgkJCQkJZ29vZExpY2Vuc2UuYWRkKGZlYXR1cmUpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJLy8gaWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgc29tZSBraW5kIG9mIGJhZCBsaWNlbnNlLCBvciBpdHMKCQkJCS8vIG1pc3NpbmcuCgkJCQlTdHJpbmcgZmVhdHVyZUxpY2Vuc2VUZXh0ID0gZmVhdHVyZUxpY2Vuc2UuZ2V0Qm9keSgpOwoJCQkJaWYgKGZlYXR1cmVMaWNlbnNlVGV4dCA9PSBudWxsCgkJCQkJCXx8IGZlYXR1cmVMaWNlbnNlVGV4dC5sZW5ndGgoKSA9PSAwKSB7CgkJCQkJbm9MaWNlbnNlLmFkZChmZWF0dXJlKTsKCQkJCX0KCQkJCS8vICJiYWQiIGluIHRoaXMgY29udGV4dCBtZWFucyBkaWZmZXJlbnQgZnJvbSBvbmUgb2YgdGhlCgkJCQkvLyBzdGFuZGFyZCBvbmVzLgoJCQkJYmFkTGljZW5zZS5hZGQoZmVhdHVyZSk7CgkJCX0gZWxzZSB7CgkJCQluTm9uRmVhdHVyZXMrKzsKCQkJfQoJCX0KCQlTeXN0ZW0ub3V0CgkJCQkucHJpbnRsbigiTnVtYmVyIGZlYXR1cmVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAiICsgbkZlYXR1cmVzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBub24tZmVhdHVlcyBkdXJpbmcgbGljZW5zZSBjaGVjazogIgoJCQkJKyBuTm9uRmVhdHVyZXMpOwoJfQoKCXByaXZhdGUgdm9pZCBwcmludFJlcG9ydExpY2Vuc2UoTGlzdDxJSW5zdGFsbGFibGVVbml0PiBnb29kTGljZW5zZSwKCQkJTGlzdDxJSW5zdGFsbGFibGVVbml0PiBvbGRMaWNlbnNlLAoJCQlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGJhZExpY2Vuc2UsCgkJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbm9MaWNlbnNlLAoJCQlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGV4dHJhTGljZW5zZSkgewoKCQlGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwoJCUZpbGUgb3V0ZmlsZSA9IG51bGw7CgkJU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CgkJdHJ5IHsKCQkJb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAibGljZW5zZUNvbnNpc3RlbmN5Lmh0bWwiKTsKCQkJb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwoJCQlwcmludHBhcmFncmFwaChvdXRmaWxlV3JpdGVyLCAiUmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIgoJCQkJCSsgZ2V0UmVwb1VSTFRvVGVzdCgpKTsKCQkJcHJpbnRwYXJhZ3JhcGgob3V0ZmlsZVdyaXRlciwKCQkJCQkiXHRvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKCQkJcHJpbnRIZWFkZXIob3V0ZmlsZVdyaXRlciwgMiwgIkxpY2Vuc2UgQ29uc2lzdGVuY3kgU3VtbWFyeSIpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIGNvbmZvcm1pbmcgKDIwMTEpIGxpY2Vuc2U6ICIKCQkJCQkrIGdvb2RMaWNlbnNlLnNpemUoKSk7CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOiAiCgkJCQkJKyBvbGRMaWNlbnNlLnNpemUoKSk7CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggZGlmZmVyZW50IChvciBubykgbGljZW5zZTogIgoJCQkJCSsgYmFkTGljZW5zZS5zaXplKCkpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIG5vIGxpY2Vuc2UgYXR0cmlidXRlOiAiCgkJCQkJKyBub0xpY2Vuc2Uuc2l6ZSgpKTsKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBleHRyYSBsaWNlbnNlczogIgoJCQkJCSsgZXh0cmFMaWNlbnNlLnNpemUoKSk7CgoJCQlwcmludEhlYWRlcihvdXRmaWxlV3JpdGVyLCAyLCAiRGV0YWlscyIpOwoKCQkJcHJpbnRIZWFkZXIob3V0ZmlsZVdyaXRlciwgMywgIkZlYXR1cmVzIHdpdGggbm8gbGljZW5zZSBhdHRyaWJ1dGUiKTsKCQkJQ29sbGVjdGlvbnMuc29ydChub0xpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKCQkJZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBub0xpY2Vuc2UpIHsKCQkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgdW5pdC5nZXRJZCgpKTsKCQkJfQoKCQkJcHJpbnRIZWFkZXIob3V0ZmlsZVdyaXRlciwgMywKCQkJCQkiRmVhdHVyZXMgd2l0aCBkaWZmZXJlbnQgKG9yIG5vKSBsaWNlbnNlIChhbmQgZmlyc3QgZmV3IGxpbmVzIG9mIGxpY2Vuc2UgdGV4dCkiKTsKCQkJQ29sbGVjdGlvbnMuc29ydChiYWRMaWNlbnNlLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CgkJCWZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogYmFkTGljZW5zZSkgewoJCQkJbWFrZUhlYWRlcklmTmVlZGVkKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CgkJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CgkJCQlDb2xsZWN0aW9uPElMaWNlbnNlPiBsaWNlbnNlcyA9IHVuaXQuZ2V0TGljZW5zZXMoKTsKCQkJCUlMaWNlbnNlIGZlYXR1cmVMaWNlbnNlID0gbGljZW5zZXMuaXRlcmF0b3IoKS5uZXh0KCk7CgkJCQlTdHJpbmcgbGljZW5zZVRleHQgPSBmZWF0dXJlTGljZW5zZS5nZXRCb2R5KCk7CgkJCQkvLyBieSBiZWluZyBpbiAiYmFkIGZlYXR1cmUgbGlzdCIgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdAoJCQkJLy8gbGVhc3QKCQkJCS8vIHNvbWUgdGV4dCwgYXMgY2hlY2tlZCBpbiBjaGVja0xpY2Vuc2VDb25zaXN0ZW5jeSBtZXRob2QuCgkJCQlpbnQgYW1vdW50ID0gTWF0aC5taW4oMjAwLCBsaWNlbnNlVGV4dC5sZW5ndGgoKSk7CgkJCQlTdHJpbmcgc2hvcnRMaWNlbnNlVGV4dCA9IGxpY2Vuc2VUZXh0LnN1YnN0cmluZygwLCBhbW91bnQpOwoJCQkJcHJpbnRwYXJhZ3JhcGgob3V0ZmlsZVdyaXRlciwgc2hvcnRMaWNlbnNlVGV4dCk7CgkJCX0KCQkJcHJpbnRIZWFkZXIob3V0ZmlsZVdyaXRlciwgMywgIkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlIik7CgkJCUNvbGxlY3Rpb25zLnNvcnQob2xkTGljZW5zZSwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwoJCQlmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IG9sZExpY2Vuc2UpIHsKCQkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgdW5pdC5nZXRJZCgpKTsKCQkJfQoJCQlwcmludEhlYWRlcihvdXRmaWxlV3JpdGVyLCAzLAoJCQkJCSJGZWF0dXJlcyB3aXRoIG1hdGNoaW5nICgyMDExKSBsaWNlbnNlIik7CgkJCUNvbGxlY3Rpb25zLnNvcnQoZ29vZExpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKCQkJZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBnb29kTGljZW5zZSkgewoJCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCB1bml0LmdldElkKCkpOwoJCQl9CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0gZmluYWxseSB7CgkJCWlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKCQkJCXRyeSB7CgkJCQkJb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwoJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQkJCS8vIHdlaXJkbmVzcwoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJCQl9CgkJCX0KCQl9CgkJLy8gaWYgKChiYWRMaWNlbnNlLnNpemUoKSA+IDApIHx8IChleHRyYUxpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwKCQkvLyAobm9MaWNlbnNlLnNpemUoKSA+IDApKSB7CgkJLy8gZmFpbCgiRXJyb3JzIGluIGxpY2Vuc2UgY29uc2lzdGVuY3kuIEZvciBsaXN0LCBzZWUgIiArCgkJLy8gb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgkJLy8gfQoJfQoKCXByaXZhdGUgdm9pZCBtYWtlSGVhZGVySWZOZWVkZWQoRmlsZVdyaXRlciBvdXRwdXRmaWxlLCBTdHJpbmcgaWQpCgkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CgoJCVN0cmluZyBwcm9wb3NlZEhlYWRlciA9IGdldEluaXRpYWxTZWdtZW50cyhpZCk7CgkJaWYgKHByb3Bvc2VkSGVhZGVyID09IG51bGwgfHwgcHJvcG9zZWRIZWFkZXIubGVuZ3RoKCkgPT0gMCkgewoJCQlwcm9wb3NlZEhlYWRlciA9ICJVbmV4cGVjdGVkbHkgZW1wdHkgcGFja2FnZSBuYW1lPyI7CgkJfQoJCWlmIChwcmV2aW91c1BhY2thZ2VIZWFkZXIgPT0gbnVsbAoJCQkJfHwgIXByZXZpb3VzUGFja2FnZUhlYWRlci5lcXVhbHMocHJvcG9zZWRIZWFkZXIpKSB7CgkJCXByZXZpb3VzUGFja2FnZUhlYWRlciA9IHByb3Bvc2VkSGVhZGVyOwoJCQlwcmludEhlYWRlcihvdXRwdXRmaWxlLCA0LCBwcm9wb3NlZEhlYWRlcik7CgkJfQoJfQoKCXByaXZhdGUgU3RyaW5nIGdldEluaXRpYWxTZWdtZW50cyhTdHJpbmcgaWQpIHsKCQlTdHJpbmcgcHJvcG9zZWRIZWFkZXIgPSAiIjsKCQlpZiAoIShpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApKSB7CgkJCVN0cmluZ1tdIHByb3Bvc2VkSGVhZGVyQXJyYXkgPSBpZC5zcGxpdCgiXFwuIik7CgkJCWlmIChwcm9wb3NlZEhlYWRlckFycmF5Lmxlbmd0aCA+IDApIHsKCQkJCWludCBuU2VnbWVudHMgPSBNYXRoLm1pbihwcm9wb3NlZEhlYWRlckFycmF5Lmxlbmd0aCwgMyk7CgkJCQlpbnQgaSA9IDA7CgkJCQlkbyB7CgkJCQkJaWYgKHByb3Bvc2VkSGVhZGVyLmxlbmd0aCgpICE9IDApIHsKCQkJCQkJcHJvcG9zZWRIZWFkZXIgPSBwcm9wb3NlZEhlYWRlciArICIuIjsKCQkJCQl9CgkJCQkJcHJvcG9zZWRIZWFkZXIgPSBwcm9wb3NlZEhlYWRlciArIHByb3Bvc2VkSGVhZGVyQXJyYXlbaV07CgkJCQkJaSsrOwoJCQkJfSB3aGlsZSAoaSA8IG5TZWdtZW50cyk7CgkJCX0KCQl9CgkJcmV0dXJuIHByb3Bvc2VkSGVhZGVyOwoJfQoKCXB1YmxpYyBib29sZWFuIHRlc3REaXNwbGF5YWJsZURhdGEoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLAoJCQlQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CgkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKCQlJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gZ2V0QWxsR3JvdXBJVXMoKTsKCQlyZXN1bHQgPSBjaGVja0xpY2Vuc2VDb25zaXN0ZW5jeShhbGxJVXMpOwoJCXJlc3VsdCA9IHJlc3VsdCB8IGNoZWNrQ29weXJpZ2h0cyhhbGxJVXMpOwoJCXJlc3VsdCA9IHJlc3VsdCB8IGNoZWNrRGVzY3JpcHRpb25zKGFsbElVcyk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglwcml2YXRlIGJvb2xlYW4gY2hlY2tDb3B5cmlnaHRzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxGZWF0dXJlcykgewoJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CgoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbm9PckJhZENvcHlyaWdodCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKCQlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9rQ29weXJpZ2h0ID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5kZXRlcm1pbmF0ZUNvcHlyaWdodCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKCgkJZm9yIChJSW5zdGFsbGFibGVVbml0IGZlYXR1cmUgOiBhbGxGZWF0dXJlcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CgkJCWlmIChmZWF0dXJlLmdldElkKCkuZW5kc1dpdGgoIi5mZWF0dXJlLmdyb3VwIikpIHsKCQkJCUlDb3B5cmlnaHQgY29weXJpZ2h0ID0gZmVhdHVyZS5nZXRDb3B5cmlnaHQobnVsbCk7CgkJCQlpZiAoY29weXJpZ2h0ID09IG51bGwpIHsKCQkJCQlub09yQmFkQ29weXJpZ2h0LmFkZChmZWF0dXJlKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCVN0cmluZyBib2R5ID0gY29weXJpZ2h0LmdldEJvZHkoKTsKCQkJCWlmICgoYm9keSA9PSBudWxsKSB8fCAoYm9keS5sZW5ndGgoKSA9PSAwKQoJCQkJCQl8fCBib2R5LnN0YXJ0c1dpdGgoIiUiKSB8fCBib2R5LnN0YXJ0c1dpdGgoIlsiKSkgewoJCQkJCW5vT3JCYWRDb3B5cmlnaHQuYWRkKGZlYXR1cmUpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCWlmIChib2R5LnN0YXJ0c1dpdGgoIkNvcHlyaWdodCIpCgkJCQkJCXx8IGJvZHkuc3RhcnRzV2l0aCgiKGMpIENvcHlyaWdodCIpKSB7CgkJCQkJb2tDb3B5cmlnaHQuYWRkKGZlYXR1cmUpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIHRlc3RzIGNsYXVzZXMgbWF0dGVyLCBvYnZvdXNseS4gKENvbXBhcmUKCQkJCS8vIHdpdGggYWJvdmUgJ3N0YXJ0c1dpdGgnLikKCQkJCWlmIChib2R5LmNvbnRhaW5zKCJDb3B5cmlnaHQiKSB8fCBib2R5LmNvbnRhaW5zKCJjb3B5cmlnaHQiKSkgewoJCQkJCWluZGV0ZXJtaW5hdGVDb3B5cmlnaHQuYWRkKGZlYXR1cmUpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJLy8gZmFsbHRocm91Z2ggYXNzdW1lZCAiYmFkIgoJCQkJbm9PckJhZENvcHlyaWdodC5hZGQoZmVhdHVyZSk7CgkJCX0KCgkJfQoKCQlwcmludFJlcG9ydENvcHlyaWdodHMob2tDb3B5cmlnaHQsIG5vT3JCYWRDb3B5cmlnaHQsCgkJCQlpbmRldGVybWluYXRlQ29weXJpZ2h0KTsKCQlyZXN1bHQgPSAoKG5vT3JCYWRDb3B5cmlnaHQuc2l6ZSgpID4gMCkpOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJcHJpdmF0ZSBib29sZWFuIGNoZWNrRGVzY3JpcHRpb25zKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxGZWF0dXJlcykgewoJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CgoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbm9uZU9yQmFkID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwoJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gb2sgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CgoJCWZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewoJCQlpZiAoZmVhdHVyZS5nZXRJZCgpLmVuZHNXaXRoKCIuZmVhdHVyZS5ncm91cCIpKSB7CgkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBmZWF0dXJlLmdldFByb3BlcnR5KAoJCQkJCQlJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04sIG51bGwpOwoJCQkJaWYgKChkZXNjcmlwdGlvbiA9PSBudWxsKSB8fCAoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPD0gMCkKCQkJCQkJfHwgZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgiJSIpKSB7CgkJCQkJbm9uZU9yQmFkLmFkZChmZWF0dXJlKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlvay5hZGQoZmVhdHVyZSk7CgkJCX0KCgkJfQoKCQlwcmludFJlcG9ydERlc2NyaXB0aW9uKG9rLCBub25lT3JCYWQpOwoJCXJlc3VsdCA9ICgobm9uZU9yQmFkLnNpemUoKSA+IDApKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCXByaXZhdGUgdm9pZCBwcmludFJlcG9ydERlc2NyaXB0aW9uKExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gb2ssCgkJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbm9uZU9yQmFkKSB7CgkJU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CgoJCUZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CgkJRmlsZSBvdXRmaWxlID0gbnVsbDsKCQlTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKCQl0cnkgewoJCQlvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJkZXNjcmlwdGlvbnMuaHRtbCIpOwoJCQlvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIKCQkJCQkrIGdldFJlcG9VUkxUb1Rlc3QoKSArICI8L3A+IiArIEVPTCk7CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRlc2NyaXB0aW9uIFJlcG9ydDoiICsgU1BBQ0VSKTsKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLAoJCQkJCSJGZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGRlc2NyaXB0aW9uczogIgoJCQkJCQkJKyBub25lT3JCYWQuc2l6ZSgpKTsKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgcHJvYmFibHkgY29ycmVjdDogIiArIG9rLnNpemUoKSk7CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIj09PT09PT09PT09PT09PT09PT09PT09Iik7CgoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5EZXRhaWxzOiIgKyBTUEFDRVIpOwoKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBubyBvciBkdWJpb3VzIGRlc2NyaXBpdG9uOiIKCQkJCQkrIFNQQUNFUik7CgkJCUNvbGxlY3Rpb25zLnNvcnQobm9uZU9yQmFkLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CgkJCWZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogbm9uZU9yQmFkKSB7CgkJCQlwcmludExpbmVEZXNjcmlwdGlvbihvdXRmaWxlV3JpdGVyLCB1bml0KTsKCQkJfQoKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkZXNjcmlwaXRvbnM6IgoJCQkJCSsgU1BBQ0VSKTsKCQkJQ29sbGVjdGlvbnMuc29ydChvaywgbmV3IElVSWRDb21wYXJhdG9yKCkpOwoJCQlmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IG9rKSB7CgkJCQlwcmludExpbmVEZXNjcmlwdGlvbihvdXRmaWxlV3JpdGVyLCB1bml0KTsKCQkJfQoKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJfSBmaW5hbGx5IHsKCQkJaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewoJCQkJdHJ5IHsKCQkJCQlvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CgkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCQkJLy8gd2VpcmRuZXNzCgkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJCX0KCQkJfQoJCX0KCQkvLyBpZiAoKGJhZExpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKGV4dHJhTGljZW5zZS5zaXplKCkgPiAwKSB8fAoJCS8vIChub0xpY2Vuc2Uuc2l6ZSgpID4gMCkpIHsKCQkvLyBmYWlsKCJFcnJvcnMgaW4gbGljZW5zZSBjb25zaXN0ZW5jeS4gRm9yIGxpc3QsIHNlZSAiICsKCQkvLyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKCQkvLyB9Cgl9CgoJcHJpdmF0ZSB2b2lkIHByaW50UmVwb3J0Q29weXJpZ2h0cyhMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGdvb2QsCgkJCUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG1heWJlKSB7CgkJU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CgoJCUZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CgkJRmlsZSBvdXRmaWxlID0gbnVsbDsKCQlTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKCQl0cnkgewoJCQlvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJjb3B5cmlnaHRzLmh0bWwiKTsKCQkJb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsICI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiCgkJCQkJKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5Db3B5cmlnaHQgUmVwb3J0OiIgKyBTUEFDRVIpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsCgkJCQkJIkZlYXR1cmVzIHdyb25nIG9yIHVuZXhwbGFpbmFibGUgY29weXJpZ2h0czogIiArIGJhZC5zaXplKCkpOwoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsCgkJCQkJIkZlYXR1cmVzIG1heWJlIHdyb25nLCBtYXliZSBjb3JyZWN0IGNvcHlyaWdodHM6ICIKCQkJCQkJCSsgbWF5YmUuc2l6ZSgpKTsKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgcHJvYmFibHkgY29ycmVjdDogIiArIGdvb2Quc2l6ZSgpKTsKCQkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iKTsKCgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRldGFpbHM6IiArIFNQQUNFUik7CgoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsCgkJCQkJIkZlYXR1cmVzIHdpdGggbm8gb3IgcHJvYmFibHkgaW5jb3JyZWN0IGNvcHlyaWdodCBzdGF0ZW1lbnQ6IgoJCQkJCQkJKyBTUEFDRVIpOwoJCQlDb2xsZWN0aW9ucy5zb3J0KGJhZCwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwoJCQlmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IGJhZCkgewoJCQkJcHJpbnRMaW5lQ29weXJpZ2h0KG91dGZpbGVXcml0ZXIsIHVuaXQpOwoJCQl9CgoJCQlwcmludGxuKG91dGZpbGVXcml0ZXIsCgkJCQkJIjxiciAvPjxiciAvPkluZGV0ZXJtaW5hbnQ6IGZlYXR1cmUncyBjb3B5cmlnaHQgdGV4dCBjb250YWlucyB0aGUgd29yZCAnY29weXJpZ2h0JyBidXQgbm90IGF0IGJlZ2lubmluZzoiCgkJCQkJCQkrIFNQQUNFUik7CgkJCUNvbGxlY3Rpb25zLnNvcnQobWF5YmUsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKCQkJZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBtYXliZSkgewoJCQkJcHJpbnRMaW5lQ29weXJpZ2h0KG91dGZpbGVXcml0ZXIsIHVuaXQpOwoJCQl9CgkJCXByaW50bG4ob3V0ZmlsZVdyaXRlciwKCQkJCQkiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBjb3B5cmlnaHRzIHRoYXQgYXJlIHByb2JhYmx5IG9rIChpLmUuIHN0YXJ0IHdpdGggJ0NvcHlyaWdodCcpOiIKCQkJCQkJCSsgU1BBQ0VSKTsKCQkJQ29sbGVjdGlvbnMuc29ydChnb29kLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CgkJCWZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogZ29vZCkgewoJCQkJcHJpbnRMaW5lQ29weXJpZ2h0KG91dGZpbGVXcml0ZXIsIHVuaXQpOwoJCQl9CgoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQl9IGZpbmFsbHkgewoJCQlpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCW91dGZpbGVXcml0ZXIuY2xvc2UoKTsKCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJCQkvLyB3ZWlyZG5lc3MKCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCQkJfQoJCQl9CgkJfQoJCS8vIGlmICgoYmFkTGljZW5zZS5zaXplKCkgPiAwKSB8fCAoZXh0cmFMaWNlbnNlLnNpemUoKSA+IDApIHx8CgkJLy8gKG5vTGljZW5zZS5zaXplKCkgPiAwKSkgewoJCS8vIGZhaWwoIkVycm9ycyBpbiBsaWNlbnNlIGNvbnNpc3RlbmN5LiBGb3IgbGlzdCwgc2VlICIgKwoJCS8vIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwoJCS8vIH0KCX0KCglwcml2YXRlIHZvaWQgcHJpbnRMaW5lQ29weXJpZ2h0KEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwKCQkJSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgkJU3RyaW5nIGNvcHlyaWdodCA9IG51bGw7CgkJSUNvcHlyaWdodCBjb3B5cmlnaHRJdSA9IGl1LmdldENvcHlyaWdodChudWxsKTsKCQlpZiAoY29weXJpZ2h0SXUgIT0gbnVsbCkgewoJCQljb3B5cmlnaHQgPSBjb3B5cmlnaHRJdS5nZXRCb2R5KCk7CgkJfQoJCVN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKCQlTdHJpbmcgaXVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CgkJcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBpdUlkICsgTkJTUCArIGl1VmVyc2lvbiArIEJSICsgTkJTUCArIGNvcHlyaWdodCk7Cgl9CgoJcHJpdmF0ZSB2b2lkIHByaW50TGluZURlc2NyaXB0aW9uKEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwKCQkJSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgkJU3RyaW5nIGRlc2NyaXB0aW9uID0gaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLAoJCQkJbnVsbCk7CgkJU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwoJCVN0cmluZyBpdVZlcnNpb24gPSBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKCQlwcmludGxuKG91dGZpbGVXcml0ZXIsIGl1SWQgKyBOQlNQICsgaXVWZXJzaW9uICsgQlIgKyBOQlNQCgkJCQkrIGRlc2NyaXB0aW9uKTsKCX0KfQpQSwMECgAACAAAj7VHQEVVUvIMHgAADB4AACsAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvLmNsYXNzyv66vgAAADEBUAcAAgEAJW9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8HAAQBABhqdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UBAAVERUJVRwEAAVoBAA1Db25zdGFudFZhbHVlAwAAAAABAANFT0wBABJMamF2YS9sYW5nL1N0cmluZzsBAAROQlNQCAANAQAIICZuYnNwOyABAAJCUgEAE0pVTklUX1JFUE9SVF9PVVRQVVQIABEBABNqdW5pdC1yZXBvcnQtb3V0cHV0AQANcmVwb1VSTFRvVGVzdAEAD291dHB1dERpcmVjdG9yeQEACDxjbGluaXQ+AQADKClWAQAEQ29kZQgAGAEADmxpbmUuc2VwYXJhdG9yCAAaAQABCgoAHAAeBwAdAQAQamF2YS9sYW5nL1N5c3RlbQwAHwAgAQALZ2V0UHJvcGVydHkBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwkAAQAiDAAJAAoHACQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAJgEABTxici8+CgAjACgMACkAKgEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAIwAsDAAtAC4BAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKACMAMAwAMQAyAQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQA0DAAOAAoBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAOAwAKQAVAQAEdGhpcwEAJ0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvOwEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7CQAcAD4MAD8AQAEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwgAQgEAEHN1aXRlIGZvciBsYXlvdXQKAEQARgcARQEAE2phdmEvaW8vUHJpbnRTdHJlYW0MAEcAKgEAB3ByaW50bG4HAEkBABlqdW5pdC9mcmFtZXdvcmsvVGVzdFN1aXRlCgBIAEsMACkATAEAFChMamF2YS9sYW5nL0NsYXNzOylWAQApKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvbGFuZy9TdHJpbmc7KVYBAApFeGNlcHRpb25zBwBQAQATamF2YS9pby9JT0V4Y2VwdGlvbggAUgEABDxsaT4IAFQBAAU8L2xpPgoAVgBYBwBXAQASamF2YS9pby9GaWxlV3JpdGVyDABZACoBAAV3cml0ZQEAFExqYXZhL2lvL0ZpbGVXcml0ZXI7AQAJd2hvbGVMaW5lAQAOcHJpbnRwYXJhZ3JhcGgIAF4BAAM8cD4KAAEAYAwAYQBiAQAOY29udmVydEVPTHRvQlIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgAZAEABDwvcD4BAAtwcmludEhlYWRlcgEAKihMamF2YS9pby9GaWxlV3JpdGVyO0lMamF2YS9sYW5nL1N0cmluZzspVggAaAEAAjxoCgAjAGoMAC0AawEAHChJKUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAG0BAAE+CABvAQADPC9oAQAFbGV2ZWwBAAFJCABzAQAEXHJcbggAdQEABzxiciAvPgoKAHcAeQcAeAEAEGphdmEvbGFuZy9TdHJpbmcMAHoAIAEACnJlcGxhY2VBbGwIAHwBAAJcbggAfgEAAlxyAQAGcmVzdWx0AQAJaXNTcGVjaWFsAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoLAIMAhQcAhAEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAwAhgAyAQAFZ2V0SWQIAIgBAAVhLmpyZQoAdwCKDACLAIwBAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCACOAQAMY29uZmlnLmEuanJlCACQAQAjb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlX3Jvb3QIAJIBACJvcmcuZWNsaXBzZS5yY3AuY29uZmlndXJhdGlvbl9yb290CACUAQASdG9vbGluZ29yZy5lY2xpcHNlCACWAQAIdG9vbGluZy4BAAJpdQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQAEaXVJZAEADmlzRmVhdHVyZUdyb3VwCACcAQANZmVhdHVyZS5ncm91cAoAdwCeDACfAIwBAAhlbmRzV2l0aAEAEXByaW50TGluZUxpc3RJdGVtAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMamF2YS9sYW5nL1N0cmluZzspVgsAgwAeCwCDAKQMAKUApgEACmdldFZlcnNpb24BACsoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb247CgCoADAHAKkBACdvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb24KAHcAqwwArACtAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgABAK8MAEcATQEADW91dGZpbGVXcml0ZXIBAAppdXByb3BlcnR5AQAPaXVwcm9wZXJ0eVZhbHVlAQAJaXVWZXJzaW9uAQAScHJpbnRBbGxQcm9wZXJ0aWVzAQBJKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspVgsAgwC3DAC4ALkBAA1nZXRQcm9wZXJ0aWVzAQARKClMamF2YS91dGlsL01hcDsLALsAvQcAvAEADWphdmEvdXRpbC9NYXAMAL4AvwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwDBAMMHAMIBAA1qYXZhL3V0aWwvU2V0DADEAMUBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAMcAyQcAyAEAEmphdmEvdXRpbC9JdGVyYXRvcgwAygDLAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CwC7AM0MAM4AzwEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgAjADgKACMA0gwALQDTAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADVAQADIDogCwDHANcMANgA2QEAB2hhc05leHQBAAMoKVoBAA1vdXRGaWxlV3JpdGVyAQAKcHJvcGVydGllcwEAD0xqYXZhL3V0aWwvTWFwOwEABGtleXMBAA9MamF2YS91dGlsL1NldDsBAANrZXkBABJMamF2YS9sYW5nL09iamVjdDsBAAV2YWx1ZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OwEACWdldEFsbElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwcA5wEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcA6QEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24BAAlTaWduYXR1cmUBAGEoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47CgABAO0MAO4AMgEAEGdldFJlcG9VUkxUb1Rlc3QHAPABAAxqYXZhL25ldC9VUkkKAO8AKAoAAQDzDAD0APUBABxnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyAQBJKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwsA9wD5BwD4AQBFb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyDAD6APsBAA5sb2FkUmVwb3NpdG9yeQEAeyhMamF2YS9uZXQvVVJJO0xvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvSVByb2dyZXNzTW9uaXRvcjspTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwgA/QEAF25vIHJlcG9zaXRvcnkgZm91bmQgYXQgCgDvADAKAAEBAAwBAQECAQANYXNzZXJ0Tm90TnVsbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgoBBAEGBwEFAQAmb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9RdWVyeVV0aWwMAQcBCAEAEGNyZWF0ZUlVQW55UXVlcnkBACcoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeTsLAQoBDAcBCwEAPm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5DAENAQ4BAAVxdWVyeQEAfShMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnk7TG9yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9JUHJvZ3Jlc3NNb25pdG9yOylMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CwEQARIHAREBAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwBEwDZAQAHaXNFbXB0eQoAAQEVDAEWARcBAAthc3NlcnRGYWxzZQEABChaKVYBAAdyZXBvVVJMAQAMcmVwb0xvY2F0aW9uAQAOTGphdmEvbmV0L1VSSTsBAARyZXBvAQBATG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwEABmFsbElVcwEAK0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEADmdldEFsbEdyb3VwSVVzCgEEASIMASMBCAEAEmNyZWF0ZUlVR3JvdXBRdWVyeQoAAQElDAEmAScBAAhnZXRBZ2VudAEAMigpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9JUHJvdmlzaW9uaW5nQWdlbnQ7CQD3ASkMASoACgEADFNFUlZJQ0VfTkFNRQsBLAEuBwEtAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL0lQcm92aXNpb25pbmdBZ2VudAwBLwEwAQAKZ2V0U2VydmljZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7CgEyATQHATMBACRvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL1Rlc3RBY3RpdmF0b3IMATUBNgEACmdldENvbnRleHQBACQoKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsJASwBKQoBOQE7BwE6AQA6b3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlcgwBLwE8AQBIKExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7CQABAT4MABIACggAEgoAHAFBDAAfAGIHAUMBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbggBRQEAKHRoZSAncmVwb1VSTFRvVGVzdCcgcHJvcGVydHkgd2FzIG5vdCBzZXQKAUIAKAgBSAEAD3JlcG9VUkxUb1Rlc3Q6IAEAEHNldFJlcG9VUkxUb1Rlc3QBABJnZXRPdXRwdXREaXJlY3RvcnkJAAEBTAwAEwAKAQASc2V0T3V0cHV0RGlyZWN0b3J5AQAKU291cmNlRmlsZQEADVRlc3RSZXBvLmphdmEAIQABAAMAAAAHABwABQAGAAEABwAAAAIACAAcAAkACgAAABwACwAKAAEABwAAAAIADAAcAA4ACgAAABoADwAKAAEABwAAAAIAEAACABIACgAAAAIAEwAKAAAAEwAIABQAFQABABYAAABIAAMAAAAAACASFxIZuAAbswAhuwAjWRIltwAnsgAhtgArtgAvswAzsQAAAAIANQAAAA4AAwAAAC0ACgAvAB8AKwA2AAAAAgAAAAEAKQAVAAEAFgAAAC8AAQABAAAABSq3ADexAAAAAgA1AAAABgABAAAAKwA2AAAADAABAAAABQA5ADoAAAAJADsAPAABABYAAAA2AAMAAAAAABKyAD0SQbYAQ7sASFkSAbcASrAAAAACADUAAAAKAAIAAAAzAAgANAA2AAAAAgAAAAQARwBNAAIATgAAAAQAAQBPABYAAABiAAQAAwAAACAruwAjWRJRtwAnLLYAKxJTtgArsgAhtgArtgAvtgBVsQAAAAIANQAAAAoAAgAAADwAHwA+ADYAAAAgAAMAAAAgADkAOgAAAAAAIAA/AFoAAQAAACAAWwAKAAIABABcAE0AAgBOAAAABAABAE8AFgAAAGYABAADAAAAJCu7ACNZEl23ACcqLLcAX7YAKxJjtgArsgAhtgArtgAvtgBVsQAAAAIANQAAAAoAAgAAAEAAIwBCADYAAAAgAAMAAAAkADkAOgAAAAAAJAA/AFoAAQAAACQAWwAKAAIABABlAGYAAgBOAAAABAABAE8AFgAAAH4ABAAEAAAAMiu7ACNZEme3ACcctgBpEmy2ACsttgArEm62ACsctgBpEmy2ACuyACG2ACu2AC+2AFWxAAAAAgA1AAAACgACAAAARAAxAEYANgAAACoABAAAADIAOQA6AAAAAAAyAD8AWgABAAAAMgBwAHEAAgAAADIAWwAKAAMAAgBhAGIAAQAWAAAAbQADAAMAAAAfK00sEnISdLYAdk0sEnsSdLYAdk0sEn0SdLYAdk0ssAAAAAIANQAAABYABQAAAEgAAgBJAAsASgAUAEsAHQBMADYAAAAgAAMAAAAfADkAOgAAAAAAHwBbAAoAAQACAB0AfwAKAAIABACAAIEAAQAWAAAAlQACAAQAAABFK7kAggEATSwSh7YAiZoANCwSjbYAiZoAKywSj7YAiZoAIiwSkbYAiZoAGSwSk7YAiZoAECwSlbYAiZoABwOnAAQEPh2sAAAAAgA1AAAADgADAAAAWQAHAFoAQwBbADYAAAAqAAQAAABFADkAOgAAAAAARQCXAJgAAQAHAD4AmQAKAAIAQwACAIAABgADAAQAmgCBAAEAFgAAAGAAAgAEAAAAECu5AIIBAE0sEpu2AJ0+HawAAAACADUAAAAOAAMAAABgAAcAYQAOAGIANgAAACoABAAAABAAOQA6AAAAAAAQAJcAmAABAAcACQCZAAoAAgAOAAIAmgAGAAMABACgAKEAAgBOAAAABAABAE8AFgAAAMIABQAHAAAATCwtAbkAogMAOgQsuQCCAQA6BSy5AKMBALYApzoGKiu7ACNZGQW4AKq3ACcSDLYAKxkGtgArEgy2ACuyADO2ACsZBLYAK7YAL7YArrEAAAACADUAAAAWAAUAAABoAAoAaQASAGoAHQBrAEsAbAA2AAAASAAHAAAATAA5ADoAAAAAAEwAsABaAAEAAABMAJcAmAACAAAATACxAAoAAwAKAEIAsgAKAAQAEgA6AJkACgAFAB0ALwCzAAoABgAEALQAtQACAE4AAAAEAAEATwAWAAAA6gAEAAgAAABaLLkAtgEATi25ALoBADoEGQS5AMABADoGpwA3GQa5AMYBADoFLRkFuQDMAgDAAHc6ByoruwAjWbcA0BkFtgDREtS2ACsZB7YAK7YAL7YArhkGuQDWAQCa/8WxAAAAAwA1AAAAHgAHAAAAdgAHAHcADwB4ACQAeQAxAHoATwB4AFkAfQA2AAAASAAHAAAAWgA5ADoAAAAAAFoA2gBaAAEAAABaAJcAmAACAAcAUwDbANwAAwAPAEsA3QDeAAQAJAArAN8A4AAFADEAHgDhAAoABwDiAAAADAABAAcAUwDbAOMAAwAEAOQA5QADAE4AAAAGAAIA5gDoAOoAAAACAOsAFgAAAMUAAwAFAAAASSq2AOxMuwDvWSu3APFNuADyLAG5APYDAE67ACNZEvy3ACcstgD+tgArtgAvLbgA/y24AQMBuQEJAwA6BBkEuQEPAQC4ARQZBLAAAAADADUAAAAeAAcAAACAAAUAgQAOAIIAGQCDADAAhAA8AIUARgCGADYAAAA0AAUAAABJADkAOgAAAAUARAEYAAoAAQAOADsBGQEaAAIAGQAwARsBHAADADwADQEdAR4ABADiAAAADAABADwADQEdAR8ABAAEASAA5QADAE4AAAAGAAIA5gDoAOoAAAACAOsAFgAAAMUAAwAFAAAASSq2AOxMuwDvWSu3APFNuADyLAG5APYDAE67ACNZEvy3ACcstgD+tgArtgAvLbgA/y24ASEBuQEJAwA6BBkEuQEPAQC4ARQZBLAAAAADADUAAAAeAAcAAACKAAUAiwAOAIwAGQCNADAAjgA8AI8ARgCQADYAAAA0AAUAAABJADkAOgAAAAUARAEYAAoAAQAOADsBGQEaAAIAGQAwARsBHAADADwADQEdAR4ABADiAAAADAABADwADQEdAR8ABAAMAPQA9QABABYAAAAvAAIAAAAAAA+4ASSyASi5ASsCAMAA97AAAAACADUAAAAGAAEAAACUADYAAAACAAAADAEmAScAAQAWAAAALQACAAAAAAANuAExsgE3uAE4wAEssAAAAAIANQAAAAYAAQAAAJkANgAAAAIAAAABAO4AMgABABYAAACAAAQAAQAAAEIqtAE9xwAfKhMBP7gBQLUBPSq0AT3HAA67AUJZEwFEtwFGv7IAPbsAI1kTAUe3ACcqtAE9tgArtgAvtgBDKrQBPbAAAAACADUAAAAaAAYAAACdAAcAngARAKAAGAChACMApQA9AKYANgAAAAwAAQAAAEIAOQA6AAAAAQFJACoAAQAWAAAAPgACAAIAAAAGKiu1AT2xAAAAAgA1AAAACgACAAAAqgAFAKsANgAAABYAAgAAAAYAOQA6AAAAAAAGABIACgABAAEBSgAyAAEAFgAAAEcAAgABAAAAFSq0AUvHAAwqEhC4AUC1AUsqtAFLsAAAAAIANQAAAA4AAwAAAK4ABwCvABAAsQA2AAAADAABAAAAFQA5ADoAAAABAU0AKgABABYAAAA+AAIAAgAAAAYqK7UBS7EAAAACADUAAAAKAAIAAAC1AAUAtgA2AAAAFgACAAAABgA5ADoAAAAAAAYAEwAKAAEAAQFOAAAAAgFPUEsDBAoAAAgAADSrR0BHj+l7MRwAADEcAAAqAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwby5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3M7CgppbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSSTsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUuSVByb3Zpc2lvbmluZ0FnZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5RdWVyeVV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlcG9zaXRvcnkubWV0YWRhdGEuSU1ldGFkYXRhUmVwb3NpdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeS5tZXRhZGF0YS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMuVGVzdEFjdGl2YXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmp1bm8udGVzdHMucmVwb3MuVGVzdFJlcG87CgovKioKICogVGVzdHMgdGhhdCBsaWNlbnNlcyBpbiB0aGUgcmVwb3NpdG9yeSBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBwbGF0Zm9ybQogKiBmZWF0dXJlIGxpY2Vuc2UuCiAqIAogKiBUaGlzIHdhcyBiYXNlZCBvbiB0ZXN0IGNvZGUgb3JpZ2luYWxseSBhdHRhY2hlZCB0byBidWcgMzA2NjI3CiAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY2MjcKICovCnB1YmxpYyBjbGFzcyBUZXN0UmVwbyBleHRlbmRzIFRlc3RDYXNlIHsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgICAgICAgICAgICAgID0gZmFsc2U7CiAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyAgRU9MICAgICAgICAgICAgICAgICA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nICBOQlNQICAgICAgICAgICAgICAgID0gIiAmbmJzcDsgIjsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nICBCUiAgICAgICAgICAgICAgICAgID0gIjxici8+IiArIEVPTDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICBKVU5JVF9SRVBPUlRfT1VUUFVUID0gImp1bml0LXJlcG9ydC1vdXRwdXQiOwoKICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1aXRlIGZvciBsYXlvdXQiKTsKICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0UmVwby5jbGFzcyk7CiAgICB9CgoKICAgIHByaXZhdGUgU3RyaW5nIHJlcG9VUkxUb1Rlc3Q7CiAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7CgogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRsbihGaWxlV3JpdGVyIG91dCwgU3RyaW5nIHdob2xlTGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBvdXQud3JpdGUoIjxsaT4iICsgd2hvbGVMaW5lICsgIjwvbGk+IiArIEVPTCk7CgogICAgfQogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRwYXJhZ3JhcGgoRmlsZVdyaXRlciBvdXQsIFN0cmluZyB3aG9sZUxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgb3V0LndyaXRlKCI8cD4iICsgY29udmVydEVPTHRvQlIod2hvbGVMaW5lKSArICI8L3A+IiArIEVPTCk7CgogICAgfQogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRIZWFkZXIoRmlsZVdyaXRlciBvdXQsIGludCBsZXZlbCwgU3RyaW5nIHdob2xlTGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBvdXQud3JpdGUoIjxoIitsZXZlbCsiPiIgKyB3aG9sZUxpbmUgKyAiPC9oIitsZXZlbCsiPiIgKyBFT0wpOwoKICAgIH0KICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRFT0x0b0JSKFN0cmluZyB3aG9sZUxpbmUpIHsKCQlTdHJpbmcgcmVzdWx0ID0gd2hvbGVMaW5lOwoJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKCJcXHJcXG4iLCAiPGJyIC8+XG4iKTsKCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiXFxuIiwgIjxiciAvPlxuIik7CgkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIlxcciIsICI8YnIgLz5cbiIpOwoJCXJldHVybiByZXN1bHQ7Cgl9Cglwcm90ZWN0ZWQgYm9vbGVhbiBpc1NwZWNpYWwoSUluc3RhbGxhYmxlVW5pdCBpdSkgewoKCiAgICAgICAgLy8gVE9ETzogSSBhc3N1bWUgJ2V4ZWN1dGFibGUgcm9vdHMnLCBldGMuIGhhdmUgbm8gcmVhZGFibGUgbmFtZT8gCiAgICAgICAgLyoKICAgICAgICAgKiBUT0RPOiB3aGF0IGFyZSB0aGVzZSBzcGVjaWFsIHRoaW5ncz8gV2hhdCBldmVyIHRoZXkKICAgICAgICAgKiBhcmUsIHRoZXkgaGF2ZSBubyBwcm92aWRlciBuYW1lLiBjb25maWcuYS5qcmUgaXMKICAgICAgICAgKiBpZGVudGlmaWVkIGFzIGEgZnJhZ21lbnQKICAgICAgICAgKiAob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50KS4gYS5qcmUgaGFzIG5vCiAgICAgICAgICogcHJvcGVydGllcy4KICAgICAgICAgKi8KICAgICAgICBTdHJpbmcgaXVJZCA9IGl1LmdldElkKCk7CiAgICAgICAgYm9vbGVhbiBpc1NwZWNpYWwgPSBpdUlkLnN0YXJ0c1dpdGgoImEuanJlIikgfHwgaXVJZC5zdGFydHNXaXRoKCJjb25maWcuYS5qcmUiKSB8fCBpdUlkLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmVxdWlub3guZXhlY3V0YWJsZV9yb290IikgfHwgaXVJZC5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5yY3AuY29uZmlndXJhdGlvbl9yb290IikgfHwgaXVJZC5zdGFydHNXaXRoKCJ0b29saW5nb3JnLmVjbGlwc2UiKSB8fCBpdUlkLnN0YXJ0c1dpdGgoInRvb2xpbmcuIik7CiAgICAgICAgcmV0dXJuIGlzU3BlY2lhbDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZlYXR1cmVHcm91cChJSW5zdGFsbGFibGVVbml0IGl1KSB7CgogICAgICAgIFN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKICAgICAgICBib29sZWFuIGlzRmVhdHVyZUdyb3VwID0gaXVJZC5lbmRzV2l0aCgiZmVhdHVyZS5ncm91cCIpOwogICAgICAgIHJldHVybiBpc0ZlYXR1cmVHcm91cDsKICAgIH0KCgoKICAgIHByb3RlY3RlZCB2b2lkIHByaW50TGluZUxpc3RJdGVtKEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIGl1cHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIGl1cHJvcGVydHlWYWx1ZSA9IGl1LmdldFByb3BlcnR5KGl1cHJvcGVydHksIG51bGwpOwogICAgICAgIFN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKICAgICAgICBTdHJpbmcgaXVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CiAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBpdUlkICsgTkJTUCArIGl1VmVyc2lvbiArIE5CU1AgKyBCUiArIGl1cHJvcGVydHlWYWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBVc2UgZm9yIGRlYnVnZ2luZyBhbmQgZXhwbG9yYXRpb24KICAgICAqIAogICAgICogQHBhcmFtIG91dEZpbGVXcml0ZXIKICAgICAqIEBwYXJhbSBpdQogICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEFsbFByb3BlcnRpZXMoRmlsZVdyaXRlciBvdXRGaWxlV3JpdGVyLCBJSW5zdGFsbGFibGVVbml0IGl1KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IGl1LmdldFByb3BlcnRpZXMoKTsKICAgICAgICBTZXQga2V5cyA9IHByb3BlcnRpZXMua2V5U2V0KCk7CiAgICAgICAgZm9yIChPYmplY3Qga2V5IDoga2V5cykgewogICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChrZXkpOwogICAgICAgICAgICBwcmludGxuKG91dEZpbGVXcml0ZXIsIGtleSArICIgOiAiICsgdmFsdWUpOwogICAgICAgIH0KCiAgICB9CgogICAgcHJvdGVjdGVkIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBnZXRBbGxJVXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewogICAgICAgIFN0cmluZyByZXBvVVJMID0gZ2V0UmVwb1VSTFRvVGVzdCgpOwogICAgICAgIFVSSSByZXBvTG9jYXRpb24gPSBuZXcgVVJJKHJlcG9VUkwpOwogICAgICAgIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKS5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24sIG51bGwpOwogICAgICAgIGFzc2VydE5vdE51bGwoIm5vIHJlcG9zaXRvcnkgZm91bmQgYXQgIiArIHJlcG9Mb2NhdGlvbi50b1N0cmluZygpLCByZXBvKTsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gcmVwby5xdWVyeShRdWVyeVV0aWwuY3JlYXRlSVVBbnlRdWVyeSgpLCBudWxsKTsKICAgICAgICBhc3NlcnRGYWxzZShhbGxJVXMuaXNFbXB0eSgpKTsKICAgICAgICByZXR1cm4gYWxsSVVzOwogICAgfQoKICAgIHByb3RlY3RlZCBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gZ2V0QWxsR3JvdXBJVXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewogICAgICAgIFN0cmluZyByZXBvVVJMID0gZ2V0UmVwb1VSTFRvVGVzdCgpOwogICAgICAgIFVSSSByZXBvTG9jYXRpb24gPSBuZXcgVVJJKHJlcG9VUkwpOwogICAgICAgIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKS5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24sIG51bGwpOwogICAgICAgIGFzc2VydE5vdE51bGwoIm5vIHJlcG9zaXRvcnkgZm91bmQgYXQgIiArIHJlcG9Mb2NhdGlvbi50b1N0cmluZygpLCByZXBvKTsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gcmVwby5xdWVyeShRdWVyeVV0aWwuY3JlYXRlSVVHcm91cFF1ZXJ5KCksIG51bGwpOwogICAgICAgIGFzc2VydEZhbHNlKGFsbElVcy5pc0VtcHR5KCkpOwogICAgICAgIHJldHVybiBhbGxJVXM7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCkgewogICAgICAgIHJldHVybiAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIGdldEFnZW50KCkuZ2V0U2VydmljZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5TRVJWSUNFX05BTUUpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgSVByb3Zpc2lvbmluZ0FnZW50IGdldEFnZW50KCkgewogICAgICAgIC8vIGdldCB0aGUgZ2xvYmFsIGFnZW50IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc3lzdGVtCiAgICAgICAgcmV0dXJuIChJUHJvdmlzaW9uaW5nQWdlbnQpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0FnZW50LlNFUlZJQ0VfTkFNRSk7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRSZXBvVVJMVG9UZXN0KCkgewogICAgICAgIGlmIChyZXBvVVJMVG9UZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgcmVwb1VSTFRvVGVzdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicmVwb1VSTFRvVGVzdCIpOwoKICAgICAgICAgICAgaWYgKHJlcG9VUkxUb1Rlc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0aGUgJ3JlcG9VUkxUb1Rlc3QnIHByb3BlcnR5IHdhcyBub3Qgc2V0Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVwb1VSTFRvVGVzdDogIiArIHJlcG9VUkxUb1Rlc3QpOwogICAgICAgIHJldHVybiByZXBvVVJMVG9UZXN0OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFJlcG9VUkxUb1Rlc3QoU3RyaW5nIHJlcG9VUkxUb1Rlc3QpIHsKICAgICAgICB0aGlzLnJlcG9VUkxUb1Rlc3QgPSByZXBvVVJMVG9UZXN0OwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSlVOSVRfUkVQT1JUX09VVFBVVCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KfQpQSwMECgAACAAAWqkJP8hlmLiHPwAAhz8AADgAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3JlcG9zL3N0YW5kYXJkTGljZW5zZXMucHJvcGVydGllc2xpY2Vuc2UyMDExPVwKRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCkZlYnJ1YXJ5IDEsIDIwMTFcblwKXG5cClVzYWdlIE9mIENvbnRlbnRcblwKXG5cClRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cClVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXApBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXApBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXApPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXApPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXApCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cClxuXApBcHBsaWNhYmxlIExpY2Vuc2VzXG5cClxuXApVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCkVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCnRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCnByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cClxuXApDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCnJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cClxuXAogICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAogICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCiAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCiAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAogICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCiAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCiAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXApcblwKVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXApjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXApMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCmluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXApcblwKICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCiAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCiAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAogICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cClxuXApOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cClByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXApJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAp3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAp5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCnRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAp0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCmdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXApcblwKVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXApUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXApcblwKICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCiAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAogICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCiAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAogICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXApcblwKSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXApUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXApcblwKXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cClxuXApUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCmJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCnRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXApvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCkluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKXG5cCllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCkluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCmluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXApcblwKICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAogICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAogICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCiAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAogICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCiAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCiAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKXG5cCkNyeXB0b2dyYXBoeVxuXApcblwKQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCmN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAp1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKXG5cCkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KCmxpY2Vuc2UyMDEwPVwKRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCkFwcmlsIDE0LCAyMDEwXG5cClxuXApVc2FnZSBPZiBDb250ZW50XG5cClxuXApUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCk9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXApVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCk5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCkFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cClRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXApcblwKQXBwbGljYWJsZSBMaWNlbnNlc1xuXApcblwKVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXApFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAp0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXApwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCkZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXApcblwKQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCmRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXApyZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCmFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXApcblwKICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAogICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAogICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCiAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCiAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCiAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAogICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCiAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAogICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKXG5cClRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCmNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCmluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAppbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKXG5cCiAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAogICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAogICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCiAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXApcblwKTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXApQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cClVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKeW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAp0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cClN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXApnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKXG5cClRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cClNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKXG5cCiAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAogICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAogICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKXG5cCklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCmlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCmdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKXG5cClxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXApcblwKVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXApidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAp0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCnRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXApJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cClxuXApZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCllvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXApJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAppbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCm1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCmFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKXG5cCiAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCiAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCiAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCiAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCiAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAogICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAogICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAogICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCiAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCiAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cClxuXApDcnlwdG9ncmFwaHlcblwKXG5cCkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXApjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCmFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCnJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCnJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cClxuXApKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuClBLAwQKAAAIAACPtUdAMDaUMFIFAABSBQAAOAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmNsYXNzyv66vgAAADEANQcAAgEAMm9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAFGphdmEvdXRpbC9Db21wYXJhdG9yAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwALDAAHAAgBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA0TG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yOwEAB2NvbXBhcmUBAGcoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylJCAATAQAbb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lCwAVABcHABYBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQMABgAGQEAC2dldFByb3BlcnR5AQA4KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsIABsBAARudWxsCgAdAB8HAB4BABBqYXZhL2xhbmcvU3RyaW5nDAAgACEBAAljb21wYXJlVG8BABUoTGphdmEvbGFuZy9TdHJpbmc7KUkLABUAIwwAJAAlAQAFZ2V0SWQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAA2l1MQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQADaXUyAQACcDEBABJMamF2YS9sYW5nL1N0cmluZzsBAAJwMgEABnJlc3VsdAEAAUkBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUkKAAEAMAwAEAARAQAKU291cmNlRmlsZQEAGklVTmFtZUFuZElkQ29tcGFyYXRvci5qYXZhAQAJU2lnbmF0dXJlAQBcTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsAIQABAAMAAQAFAAAAAwABAAcACAABAAkAAAAvAAEAAQAAAAUqtwAKsQAAAAIADAAAAAYAAQAAAAcADQAAAAwAAQAAAAUADgAPAAAAAQAQABEAAQAJAAAA6gADAAYAAABaK8cACSzHAAUDrCvGAAcsxwAFBKwrEhIBuQAUAwBOLBISAbkAFAMAOgQtxwAGEhpOGQTHAAcSGjoELRkEtgAcNgUVBZoAFCu5ACIBACy5ACIBALYAHDYFFQWsAAAAAgAMAAAAOgAOAAAADAAIAA0ACgAPABIAEAAUABMAHgAUACkAFQAtABYAMAAYADUAGQA5ABsAQQAcAEYAHwBXACEADQAAAD4ABgAAAFoADgAPAAAAAABaACYAJwABAAAAWgAoACcAAgAeADwAKQAqAAMAKQAxACsAKgAEAEEAGQAsAC0ABRBBABAALgABAAkAAAAtAAMAAwAAAA0qK8AAFSzAABW2AC+sAAAAAgAMAAAABgABAAAAAQANAAAAAgAAAAIAMQAAAAIAMgAzAAAAAgA0UEsDBAoAAAgAAFqpCT/nJayTUgQAAFIEAAA3AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVU5hbWVBbmRJZENvbXBhcmF0b3IuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuanVuby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CgpwdWJsaWMgY2xhc3MgSVVOYW1lQW5kSWRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJSW5zdGFsbGFibGVVbml0PiB7CgoKICAgIHB1YmxpYyBpbnQgY29tcGFyZShJSW5zdGFsbGFibGVVbml0IGl1MSwgSUluc3RhbGxhYmxlVW5pdCBpdTIpIHsKICAgICAgICAvLyBuZWl0aGVyIGl1IHNob3VsZCBiZSBudWxsIC4uLiBidXQsIGp1c3QgdG8gY292ZXIgYWxsIGNhc2VzCiAgICAgICAgaWYgKChpdTEgPT0gbnVsbCkgJiYgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGl1MSA9PSBudWxsKSB8fCAoaXUyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgU3RyaW5nIHAxID0gaXUxLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgU3RyaW5nIHAyID0gaXUyLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgaWYgKHAxID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHAxID0gIm51bGwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwMiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwMiA9ICJudWxsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gcDEuY29tcGFyZVRvKHAyKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBwcm92aWRlciBuYW1lcyBhcmUgZXF1YWwsIHVzZSBpZCBhcyBzZWNvbmRhcnkKICAgICAgICAgICAgICAgIC8vIHNvcnQga2V5CiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdTEuZ2V0SWQoKS5jb21wYXJlVG8oaXUyLmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgfQp9UEsDBAoAAAgAAI+1R0BNiOxu9AMAAPQDAAA5AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9TdHJpbmdMZW5ndGhDb21wYXJhdG9yLmNsYXNzyv66vgAAADEALgcAAgEAM29yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABRqYXZhL3V0aWwvQ29tcGFyYXRvcgEABjxpbml0PgEAAygpVgEABENvZGUKAAMACwwABwAIAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEANUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3I7AQAHY29tcGFyZQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSQcAEwEAEWphdmEvbGFuZy9JbnRlZ2VyCgAVABcHABYBABBqYXZhL2xhbmcvU3RyaW5nDAAYABkBAAZsZW5ndGgBAAMoKUkKABIAGwwABwAcAQAEKEkpVgoAEgAeDAAfACABAAljb21wYXJlVG8BABYoTGphdmEvbGFuZy9JbnRlZ2VyOylJAQAHc3RyaW5nMQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAB3N0cmluZzIBAAdsZW5ndGgxAQATTGphdmEvbGFuZy9JbnRlZ2VyOwEAB2xlbmd0aDIBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUkKAAEAKQwAEAARAQAKU291cmNlRmlsZQEAG1N0cmluZ0xlbmd0aENvbXBhcmF0b3IuamF2YQEACVNpZ25hdHVyZQEAPExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL1N0cmluZzs+OwAhAAEAAwABAAUAAAADAAEABwAIAAEACQAAAC8AAQABAAAABSq3AAqxAAAAAgAMAAAABgABAAAABQANAAAADAABAAAABQAOAA8AAAABABAAEQABAAkAAACeAAMABQAAADQrxwAJLMcABQOsK8YAByzHAAUErLsAElkrtgAUtwAaTrsAElkstgAUtwAaOgQtGQS2AB2sAAAAAgAMAAAAHgAHAAAACQAIAAoACgAMABIADQAUABAAIAARAC0AEgANAAAANAAFAAAANAAOAA8AAAAAADQAIQAiAAEAAAA0ACMAIgACACAAFAAkACUAAwAtAAcAJgAlAAQQQQAQACcAAQAJAAAALQADAAMAAAANKivAABUswAAVtgAorAAAAAIADAAAAAYAAQAAAAEADQAAAAIAAAACACoAAAACACsALAAAAAIALVBLAwQKAAAIAABaqQk/ML7plT4CAAA+AgAAOAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwoKcHVibGljIGNsYXNzIFN0cmluZ0xlbmd0aENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFN0cmluZz4gewoKCiAgICBwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSB7CiAgICAgICAgaWYgKChzdHJpbmcxID09IG51bGwpICYmIChzdHJpbmcyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoc3RyaW5nMSA9PSBudWxsKSB8fCAoc3RyaW5nMiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEludGVnZXIgbGVuZ3RoMSA9IG5ldyBJbnRlZ2VyKHN0cmluZzEubGVuZ3RoKCkpOwogICAgICAgICAgICBJbnRlZ2VyIGxlbmd0aDIgPSBuZXcgSW50ZWdlcihzdHJpbmcyLmxlbmd0aCgpKTsKICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDEuY29tcGFyZVRvKGxlbmd0aDIpOwogICAgICAgIH0KICAgIH0KfVBLAwQKAAAIAACPtUdAPmFB2BsEAAAbBAAAMQAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IuY2xhc3PK/rq+AAAAMQAoBwACAQArb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABRqYXZhL3V0aWwvQ29tcGFyYXRvcgEABjxpbml0PgEAAygpVgEABENvZGUKAAMACwwABwAIAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEALUxvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yOwEAB2NvbXBhcmUBAGcoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylJCwATABUHABQBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQMABYAFwEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsKABkAGwcAGgEAEGphdmEvbGFuZy9TdHJpbmcMABwAHQEACWNvbXBhcmVUbwEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAA2l1MQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQADaXUyAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABACMMABAAEQEAClNvdXJjZUZpbGUBABNJVUlkQ29tcGFyYXRvci5qYXZhAQAJU2lnbmF0dXJlAQBcTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsAIQABAAMAAQAFAAAAAwABAAcACAABAAkAAAAvAAEAAQAAAAUqtwAKsQAAAAIADAAAAAYAAQAAAAcADQAAAAwAAQAAAAUADgAPAAAAAQAQABEAAQAJAAAAcgACAAMAAAAkK8cACSzHAAUDrCvGAAcsxwAFBKwruQASAQAsuQASAQC2ABisAAAAAgAMAAAAFgAFAAAADAAIAA0ACgAPABIAEAAUABMADQAAACAAAwAAACQADgAPAAAAAAAkAB4AHwABAAAAJAAgAB8AAhBBABAAIQABAAkAAAAtAAMAAwAAAA0qK8AAEyzAABO2ACKsAAAAAgAMAAAABgABAAAAAQANAAAAAgAAAAIAJAAAAAIAJQAmAAAAAgAnUEsDBAoAAAgAAFqpCT/e7EmBSgIAAEoCAAAwAAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKCnB1YmxpYyBjbGFzcyBJVUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SUluc3RhbGxhYmxlVW5pdD4gewoKCiAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUluc3RhbGxhYmxlVW5pdCBpdTEsIElJbnN0YWxsYWJsZVVuaXQgaXUyKSB7CiAgICAgICAgLy8gbmVpdGhlciBpdSBzaG91bGQgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IHRvIGNvdmVyIGFsbCBjYXNlcwogICAgICAgIGlmICgoaXUxID09IG51bGwpICYmIChpdTIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChpdTEgPT0gbnVsbCkgfHwgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpdTEuZ2V0SWQoKS5jb21wYXJlVG8oaXUyLmdldElkKCkpOwogICAgICAgIH0KICAgIH0KfVBLAwQKAAAIAACPtUdAdcuURLYCAAC2AgAANwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuY2xhc3PK/rq+AAAAMQAiBwACAQAxb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABZqYXZhL2lvL0ZpbGVuYW1lRmlsdGVyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAALAQAMLmphci5wYWNrLmd6AQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAQDAAMAA0BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAzTG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXI7AQAGYWNjZXB0AQAjKExqYXZhL2lvL0ZpbGU7TGphdmEvbGFuZy9TdHJpbmc7KVoKABgAGgcAGQEAEGphdmEvbGFuZy9TdHJpbmcMABsAHAEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQADZGlyAQAOTGphdmEvaW8vRmlsZTsBAARuYW1lAQAKU291cmNlRmlsZQEAGVBhY2tHekZpbGVOYW1lRmlsdGVyLmphdmEAIQABAAMAAQAFAAEAGgAHAAgAAQAJAAAAAgAKAAIAAQAMAA0AAQAOAAAALwABAAEAAAAFKrcAD7EAAAACABEAAAAGAAEAAAAGABIAAAAMAAEAAAAFABMAFAAAAAEAFQAWAAEADgAAAEUAAgADAAAABywSCrYAF6wAAAACABEAAAAGAAEAAAAKABIAAAAgAAMAAAAHABMAFAAAAAAABwAdAB4AAQAAAAcAHwAIAAIAAQAgAAAAAgAhUEsDBAoAAAgAAFqpCT+Oz/RBUQEAAFEBAAA2AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CgpwdWJsaWMgY2xhc3MgUGFja0d6RmlsZU5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BBQ0VLRF9KQVIgPSAiLmphci5wYWNrLmd6IjsKCiAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpOwogICAgfQp9ClBLAwQKAAAIAACPtUdAfTpJFl4FAABeBQAAPAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVQcm92aWRlckFuZElkQ29tcGFyYXRvci5jbGFzc8r+ur4AAAAxADUHAAIBADZvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADhMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yOwEAB2NvbXBhcmUBAGcoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylJCAATAQAbb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lCwAVABcHABYBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQMABgAGQEAC2dldFByb3BlcnR5AQA4KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsIABsBAARudWxsCgAdAB8HAB4BABBqYXZhL2xhbmcvU3RyaW5nDAAgACEBAAljb21wYXJlVG8BABUoTGphdmEvbGFuZy9TdHJpbmc7KUkLABUAIwwAJAAlAQAFZ2V0SWQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAA2l1MQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQADaXUyAQACcDEBABJMamF2YS9sYW5nL1N0cmluZzsBAAJwMgEABnJlc3VsdAEAAUkBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUkKAAEAMAwAEAARAQAKU291cmNlRmlsZQEAHklVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuamF2YQEACVNpZ25hdHVyZQEAXExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47ACEAAQADAAEABQAAAAMAAQAHAAgAAQAJAAAALwABAAEAAAAFKrcACrEAAAACAAwAAAAGAAEAAAAHAA0AAAAMAAEAAAAFAA4ADwAAAAEAEAARAAEACQAAAOoAAwAGAAAAWivHAAksxwAFA6wrxgAHLMcABQSsKxISAbkAFAMATiwSEgG5ABQDADoELccABhIaThkExwAHEho6BC0ZBLYAHDYFFQWaABQruQAiAQAsuQAiAQC2ABw2BRUFrAAAAAIADAAAADoADgAAAAwACAANAAoADwASABAAFAATAB4AFAApABUALQAWADAAGAA1ABkAOQAbAEEAHABGAB8AVwAhAA0AAAA+AAYAAABaAA4ADwAAAAAAWgAmACcAAQAAAFoAKAAnAAIAHgA8ACkAKgADACkAMQArACoABABBABkALAAtAAUQQQAQAC4AAQAJAAAALQADAAMAAAANKivAABUswAAVtgAvrAAAAAIADAAAAAYAAQAAAAEADQAAAAIAAAACADEAAAACADIAMwAAAAIANFBLAwQKAAAIAABaqQk/qqN3slYEAABWBAAAOwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVQcm92aWRlckFuZElkQ29tcGFyYXRvci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKCnB1YmxpYyBjbGFzcyBJVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJSW5zdGFsbGFibGVVbml0PiB7CgoKICAgIHB1YmxpYyBpbnQgY29tcGFyZShJSW5zdGFsbGFibGVVbml0IGl1MSwgSUluc3RhbGxhYmxlVW5pdCBpdTIpIHsKICAgICAgICAvLyBuZWl0aGVyIGl1IHNob3VsZCBiZSBudWxsIC4uLiBidXQsIGp1c3QgdG8gY292ZXIgYWxsIGNhc2VzCiAgICAgICAgaWYgKChpdTEgPT0gbnVsbCkgJiYgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGl1MSA9PSBudWxsKSB8fCAoaXUyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgU3RyaW5nIHAxID0gaXUxLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgU3RyaW5nIHAyID0gaXUyLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgaWYgKHAxID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHAxID0gIm51bGwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwMiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwMiA9ICJudWxsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gcDEuY29tcGFyZVRvKHAyKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBwcm92aWRlciBuYW1lcyBhcmUgZXF1YWwsIHVzZSBpZCBhcyBzZWNvbmRhcnkKICAgICAgICAgICAgICAgIC8vIHNvcnQga2V5CiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdTEuZ2V0SWQoKS5jb21wYXJlVG8oaXUyLmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgfQp9UEsDBAoAAAgAAI+1R0D6mKNVngIAAJ4CAAA0AAAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlci5jbGFzc8r+ur4AAAAxACIHAAIBAC5vcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAFmphdmEvaW8vRmlsZW5hbWVGaWx0ZXIBAA1FWFRFTlNJT05fSkFSAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACwEABC5qYXIBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABAMAAwADQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADBMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcjsBAAZhY2NlcHQBACMoTGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspWgoAGAAaBwAZAQAQamF2YS9sYW5nL1N0cmluZwwAGwAcAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAANkaXIBAA5MamF2YS9pby9GaWxlOwEABG5hbWUBAApTb3VyY2VGaWxlAQAWSkFSRmlsZU5hbWVGaWx0ZXIuamF2YQAhAAEAAwABAAUAAQAaAAcACAABAAkAAAACAAoAAgABAAwADQABAA4AAAAvAAEAAQAAAAUqtwAPsQAAAAIAEQAAAAYAAQAAAAYAEgAAAAwAAQAAAAUAEwAUAAAAAQAVABYAAQAOAAAARQACAAMAAAAHLBIKtgAXrAAAAAIAEQAAAAYAAQAAAAoAEgAAACAAAwAAAAcAEwAUAAAAAAAHAB0AHgABAAAABwAfAAgAAgABACAAAAACACFQSwMECgAACAAAWqkJPxr5Etk4AQAAOAEAADMAAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKCnB1YmxpYyBjbGFzcyBKQVJGaWxlTmFtZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSkFSID0gIi5qYXIiOwoKICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKTsKICAgIH0KfQpQSwMECgAACAAAj7VHQAjCMJjUCQAA1AkAAC8AAABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlci5jbGFzc8r+ur4AAAAxAG8HAAIBAClvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgcABAEAEGphdmEvbGFuZy9PYmplY3QBAANFT0wBABJMamF2YS9sYW5nL1N0cmluZzsBAA5vdXRwdXRGaWxlbmFtZQEAD291dHB1dERpcmVjdG9yeQEADW91dGZpbGV3cml0ZXIBABVMamF2YS9pby9QcmludFdyaXRlcjsBAAg8Y2xpbml0PgEAAygpVgEABENvZGUIAA8BAA5saW5lLnNlcGFyYXRvcggAEQEAAQoKABMAFQcAFAEAEGphdmEvbGFuZy9TeXN0ZW0MABYAFwEAC2dldFByb3BlcnR5AQA4KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsJAAEAGQwABQAGAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAGPGluaXQ+AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCgADAB8MABwADAkAAQAhDAAIAAYJAAEAIwwABwAGAQAEdGhpcwEAK0xvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBABFnZXRPdXRwdXRGaWxlbmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQARc2V0T3V0cHV0RmlsZW5hbWUBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABJnZXRPdXRwdXREaXJlY3RvcnkBABJzZXRPdXRwdXREaXJlY3RvcnkBAAlnZXRXcml0ZXIBABcoKUxqYXZhL2lvL1ByaW50V3JpdGVyOwEACkV4Y2VwdGlvbnMHADABAB1qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbgkAAQAyDAAJAAoHADQBAAxqYXZhL2lvL0ZpbGUKAAEANgwAKgAnCgABADgMACYAJwoAMwA6DAAcAB0HADwBABNqYXZhL2lvL1ByaW50V3JpdGVyCgA7AD4MABwAPwEAEShMamF2YS9pby9GaWxlOylWAQAHb3V0ZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAHd3JpdGVsbgcARAEAE2phdmEvaW8vSU9FeGNlcHRpb24KAAEARgwALAAtBwBIAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAEoATAcASwEAEGphdmEvbGFuZy9TdHJpbmcMAE0ATgEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoARwBQDAAcACkKAEcAUgwAUwBUAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBHAFYMAFcAJwEACHRvU3RyaW5nCgA7AFkMAFoAKQEABXdyaXRlAQAEdGV4dAEABWNsb3NlCgA7AF4MAFwADAEAFShMamF2YS9sYW5nL09iamVjdDspVgoAAwBWCgABAGIMAEIAKQEABm9iamVjdAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABnByaW50ZgEAKChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKADsAaAwAZQBpAQA8KExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspTGph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IHByaXZhdGUgUHJpbnRXcml0ZXIgICAgICAgICBvdXRmaWxld3JpdGVyOwoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RmlsZW5hbWUoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dEZpbGVuYW1lOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVuYW1lKFN0cmluZyBvdXRwdXRGaWxlbmFtZSkgewogICAgICAgIHRoaXMub3V0cHV0RmlsZW5hbWUgPSBvdXRwdXRGaWxlbmFtZTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHJpdmF0ZSBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICBpZiAob3V0ZmlsZXdyaXRlciA9PSBudWxsKSB7CiAgICAgICAgICAgIEZpbGUgb3V0ZmlsZSA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpLCBnZXRPdXRwdXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgb3V0ZmlsZXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dGZpbGV3cml0ZXI7CiAgICB9CgogICAgcHVibGljIHZvaWQgd3JpdGVsbihTdHJpbmcgdGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBnZXRXcml0ZXIoKS53cml0ZSh0ZXh0ICsgRU9MKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB3cml0ZWxuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBnZXRXcml0ZXIoKS53cml0ZShFT0wpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgIGlmIChvdXRmaWxld3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgb3V0ZmlsZXdyaXRlci5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCB3cml0ZWxuKE9iamVjdCBvYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgd3JpdGVsbihvYmplY3QudG9TdHJpbmcoKSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgcHJpbnRmKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGdldFdyaXRlcigpLnByaW50Zihmb3JtYXQsIGFyZ3MpOwogICAgfQp9ClBLAwQKAAAIAACPtUdAD9Y4oPoHAAD6BwAANAAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuY2xhc3PK/rq+AAAAMQB2BwACAQAub3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcgcABAEAEGphdmEvbGFuZy9PYmplY3QBAAVERUJVRwEAAVoBAA1Db25zdGFudFZhbHVlAwAAAAABAAtTVEFSVF9HUk9VUAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACUVORF9HUk9VUAEAClVOREVSU0NPUkUBAAlCQUNLU0xBU0gBAA5MSVRFUkFMX1BFUklPRAEACUFOWURJR0lUUwEAA0FOWQEAB3BhdHRlcm4BABlMamF2YS91dGlsL3JlZ2V4L1BhdHRlcm47AQANcHJvamVjdFN0cmluZwEADXZlcnNpb25TdHJpbmcBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABkMABUAFggAGwEAASgJAAEAHQwACQAKCAAfAQABKQkAAQAhDAALAAoIACMBAAFfCQABACUMAAwACggAJwEAAVwJAAEAKQwADQAKBwArAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAC0ALwcALgEAEGphdmEvbGFuZy9TdHJpbmcMADAAMQEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoAKgAzDAAVADQBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYIADYBAAEuCgAqADgMADkAOgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAKgA8DAA9AD4BAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABAEAMAA4ACggAQgEAAWQIAEQBAAEqCQABAEYMAA8ACggASAEAAi4qCQABAEoMABAACggATAEAAT8KAE4AUAcATwEAF2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuDABRAFIBAAdjb21waWxlAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL3JlZ2V4L1BhdHRlcm47CQABAFQMABEAEgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADBMb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcjsBAAVwYXJzZQEAFShMamF2YS9sYW5nL1N0cmluZzspWggAXAEAAAkAAQBeDAATAAoJAAEAYAwAFAAKCgBOAGIMAGMAZAEAB21hdGNoZXIBADMoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsKAGYAaAcAZwEAF2phdmEvdXRpbC9yZWdleC9NYXRjaGVyDABpAGoBAAdtYXRjaGVzAQADKClaCgBmAGwMAG0AbgEABWdyb3VwAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7AQAEbGluZQEABnJlc3VsdAEAGUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsBABBnZXRQcm9qZWN0U3RyaW5nAQAQZ2V0VmVyc2lvblN0cmluZwEAClNvdXJjZUZpbGUBABZGdWxsSmFyTmFtZVBhcnNlci5qYXZhACEAAQADAAAACwAaAAUABgABAAcAAAACAAgAAgAJAAoAAAACAAsACgAAAAIADAAKAAAAAgANAAoAAAACAA4ACgAAAAIADwAKAAAAAgAQAAoAAAACABEAEgAAAAIAEwAKAAAAAgAUAAoAAAAEAAEAFQAWAAEAFwAAAVMABAABAAABBSq3ABgqEhq1ABwqEh61ACAqEiK1ACQqEia1ACgquwAqWSq0ACi4ACy3ADISNbYAN7YAO7UAPyq7ACpZKrQAKLgALLcAMhJBtgA3EkO2ADe2ADu1AEUqEke1AEkquwAqWSq0ABy4ACy3ADIqtABJtgA3KrQAILYANyq0ACS2ADcqtAActgA3KrQAHLYANyq0AEW2ADcqtAAgtgA3KrQAP7YANyq0ABy2ADcqtABFtgA3KrQAILYANyq0AD+2ADcqtAActgA3KrQARbYANyq0ACC2ADcqtAActgA3KrQAP7YANyq0AEm2ADcqtAAgtgA3Eku2ADcqtAAgtgA3tgA7uABNtQBTsQAAAAIAVQAAACoACgAAABIABAAWAAoAFwAQABgAFgAZABwAGgA2ABsAVQAcAFsAHQEEABIAVgAAAAwAAQAAAQUAVwBYAAAAAQBZAFoAAQAXAAAApQADAAQAAAA5Az0qElu1AF0qElu1AF8qtABTK7YAYU4ttgBlmgAIAz2nABcqLQS2AGu1AF0qLQW2AGu1AF8EPRysAAAAAgBVAAAAKgAKAAAAJAACACUACAAmAA4AJwAXACkAHgAqACMAMwAsADQANQA1ADcAPABWAAAAKgAEAAAAOQBXAFgAAAAAADkAbwAKAAEAAgA3AHAABgACABcAIgBjAHEAAwABAHIAPgABABcAAAAvAAEAAQAAAAUqtABdsAAAAAIAVQAAAAYAAQAAAEEAVgAAAAwAAQAAAAUAVwBYAAAAAQBzAD4AAQAXAAAALwABAAEAAAAFKrQAX7AAAAACAFUAAAAGAAEAAABHAFYAAAAMAAEAAAAFAFcAWAAAAAEAdAAAAAIAdVBLAwQKAAAIAABaqQk/CZx0bmQKAABkCgAAMwAAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CgpwdWJsaWMgY2xhc3MgRnVsbEphck5hbWVQYXJzZXIgewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgICAgICAgICAgPSBmYWxzZTsKICAgIC8vIHNpbXBsaWZpZWQgcGF0dGVybjogKElEKSAnXycgKE4gJy4nIE0gJy4nIE8gJy4nIFMpICcuamFyJwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBTVEFSVF9HUk9VUCAgICA9ICIoIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgRU5EX0dST1VQICAgICAgPSAiKSI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIFVOREVSU0NPUkUgICAgID0gIl8iOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBCQUNLU0xBU0ggICAgICA9ICJcXCI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIExJVEVSQUxfUEVSSU9EID0gQkFDS1NMQVNIICsgIi4iOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBBTllESUdJVFMgICAgICA9IEJBQ0tTTEFTSCArICJkIiArICIqIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgQU5ZICAgICAgICAgICAgPSAiLioiOwogICAgcHJpdmF0ZSBQYXR0ZXJuICAgICAgICAgICAgICBwYXR0ZXJuICAgICAgICA9IFBhdHRlcm4uY29tcGlsZShTVEFSVF9HUk9VUCArIEFOWSArIEVORF9HUk9VUCArIFVOREVSU0NPUkUgKyBTVEFSVF9HUk9VUCArIFNUQVJUX0dST1VQICsgQU5ZRElHSVRTICsgRU5EX0dST1VQICsgTElURVJBTF9QRVJJT0QgKyBTVEFSVF9HUk9VUCArIEFOWURJR0lUUyArIEVORF9HUk9VUCArIExJVEVSQUxfUEVSSU9EICsgU1RBUlRfR1JPVVAgKyBBTllESUdJVFMgKyBFTkRfR1JPVVAgKyBTVEFSVF9HUk9VUCArIExJVEVSQUxfUEVSSU9EICsgQU5ZICsgRU5EX0dST1VQICsgIj8iICsgRU5EX0dST1VQKTsKCiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHByb2plY3RTdHJpbmc7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmc7CgoKICAgIHB1YmxpYyBib29sZWFuIHBhcnNlKFN0cmluZyBsaW5lKSB7CiAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICBwcm9qZWN0U3RyaW5nID0gIiI7CiAgICAgICAgdmVyc2lvblN0cmluZyA9ICIiOwogICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKCiAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewogICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHR0aGUgbGluZSBkaWQgbm90IG1hdGNoIHBhcnNlIHJ1bGU6ICIpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBsaW5lKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcm9qZWN0U3RyaW5nID0gbWF0Y2hlci5ncm91cCgxKTsKICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMik7CiAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByb2plY3RTdHJpbmcpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHZlcnNpb25TdHJpbmcpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCgogICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0U3RyaW5nKCkgewogICAgICAgIHJldHVybiBwcm9qZWN0U3RyaW5nOwogICAgfQoKCgogICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewogICAgICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nOwogICAgfQp9UEsDBAoAAAgAAO2MCT+Nz+lRlgUAAJYFAAAKAAAAYWJvdXQuaHRtbDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCiAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KPHRpdGxlPkFib3V0PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBsYW5nPSJFTi1VUyI+CjxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogCjxQPkp1bmUsIDIwMDg8L1A+CQo8aDM+TGljZW5zZTwvaDM+Cgo8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQpFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAphdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgpGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgoKPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQphcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCnByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQppbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAphbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgoKPC9ib2R5Pgo8L2h0bWw+UEsDBAoAAAgAAFqpCT/rhGNxTAEAAEwBAAAKAAAAcGx1Z2luLnhtbDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cjw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjUiPz4KPHBsdWdpbj4KICAgPGV4dGVuc2lvbgogICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VGFza3MiPgogICAgICAgICA8YW50VGFzawogICAgICAgICBsaWJyYXJ5PSJjaGVja0xheW91dC5qYXIiCiAgICAgICAgIG5hbWU9ImdlbmVyYXRlUmVwb3NpdG9yeVJlcG9ydHMiCiAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qdW5vLnRlc3RzLlJ1bkFsbFJlcG9ydHNBbnRUYXNrIiAvPgogICAgICAgICAKICAgPC9leHRlbnNpb24+Cgo8L3BsdWdpbj4KUEsDBAoAAAgAAO2MCT/2E0FdYwAAAGMAAAAGAAAAYW50LnNoIyEvYmluL3NoCgpzb3VyY2UgYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlCgpBTlRfQ01EPSIke0FOVF9IT01FfS9iaW4vYW50Igoke0FOVF9IT01FfS9iaW4vYW50ICIkQCIKUEsDBAoAAAgAAGeqCT8ulHfe+QEAAPkBAAATAAAAaW52b2tlQW50UnVubmVyLnhtbDxwcm9qZWN0IG5hbWU9Imp1bm9BbnRSdW5uZXIiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imludm9rZUFudCI+CgkgICAgPHByb3BlcnR5CgkgICAgICAgIGVudmlyb25tZW50PSJlbnYiIC8+CgkgICAgICAgIAkKCTx0YXJnZXQgbmFtZT0iaW52b2tlQW50Ij4KCgkJPGVjaG8gbWVzc2FnZT0iaW52b2tlIGFudCBydW5uZXIsIGZyb20gYW50IiAvPgoJCTxleGVjIGV4ZWN1dGFibGU9IiR7ZW52LkVDTElQU0VfSE9NRX0vZWNsaXBzZSIgCgkJCWZhaWxvbmVycm9yPSJmYWxzZSIgCgkJCWFwcGVuZD0idHJ1ZSI+CgkJCTxhcmcgbGluZT0iLWNvbnNvbGVsb2cgLWRhdGEgLi9ydW5FY2xpcHNlV29ya3NwYWNlIC1kZWJ1ZyAtbm9zcGxhc2ggLS1sYXVuY2hlci5zdXBwcmVzc0Vycm9ycyAtdm0gJHtlbnYuSkFWQV9FWEVDX0RJUn0gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFJ1bm5lciAtZiBydW5UZXN0cy54bWwiIC8+CgkJPC9leGVjPgoJPC90YXJnZXQ+CjwvcHJvamVjdD5QSwMECgAACAAA8GEKP/OzuNaVDAAAlQwAABEAAABnZXRSZWxlbmdUZXN0cy5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgaXQgaXMgYXNzdW1lZCB3ZSBhcmUgZXhlY3V0aW5nIHRoaXMgaW4gUkVMRU5HX1RFU1RTIG9yIHRoZSBwYXJlbnQgb2YgUkVMRU5HX1RFU1RTCgojIE5vdGU6IGZvciBkZXBsb3ltZW50IG9uIHByb2R1Y3Rpb24gbWFjaGluZSwgbm8gImN1c3RvbSIgcHJvcGVydGllcyBuZWVkIHRvIGJlIHNldCBpbiBhZ2dyX3Byb3BlcnRpZXMuc2hzb3VyY2UsIAojIGFzc3VtaW5nIHRoZSAiaHVkc29uIGJ1aWxkIHNjcmlwdCIgaGFzIGJlZW4gc2V0IHVwIGFwcHJvcHJpYXRlbHkuIAojIDEuIG5lZWQgdG8gc2V0ICJ1c2UgY3VzdG9tIHdvcmtzcGFjZSIgc28gc29tZSBvZiB0aGUgcmVsYXRpdmUgZGlyZWN0b3J5IGFzc3VtcHRpb25zIGFyZSB0cnVlIC4uLiBzdWNoIGFzIGZvciBKdW5vLCBzZXQgCiMgICAgL3NoYXJlZC9qdW5vL29yZy5lY2xpcHNlLmp1bm8udGVzdHMKIyAyLiBjb3B5ICJieSBoYW5kIiAob3Igc2NwKSB0aGlzIGdldFJlbGVuZ1Rlc3RzLnNoIGZpbGUgdG8gL3NoYXJlZC9qdW5vIGFuZCBydW4gZnJvbSBodWRzb24gZnJvbSB0aGVyZSwgdGhlIHBhcmVudCBvZiAKIyAgICBvLmUuaS50ZXN0cywgbmFtZWx5ICJydW4gc2hlbGwgc2NyaXB0IiAvc2hhcmVkL2p1bm8vZ2V0UmVsZW5nVGVzdHMuc2gKIyAzLiBXZSBjdXJyZW50bHkgYXNzdW1lICJ0ZXN0SW5zdGFuY2UiIGFscmVhZHkgZXhpc3RzLCBhcyBhIGNoaWxkIG9mIC9zaGFyZWQvanVubywgYW5kIGNvbnRhaW5zIGFuIGluc3RhbmNlIG9mIGVjbGlwc2UgU0RLICgzLjcpLiAKCgojIGZpbmRzIGZpbGUgb24gdXNlcnMgcGF0aCwgYmVmb3JlIGN1cnJlbnQgZGlyZWN0b3J5CiMgaGVuY2UsIG5vbi1wcm9kdWN0aW9uIHVzZXJzIGNhbiBzZXQgdGhlaXIgb3duIHZhbHVlcyBmb3IgdGVzdCBtYWNoaW5lcwpzb3VyY2UgYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlCgppZiBbIC16ICR7UkVMRU5HX1RFU1RTfSBdIDsgdGhlbgoKICAgIFJFTEVOR19URVNUUz1vcmcuZWNsaXBzZS5qdW5vLnRlc3RzCiAgICBlY2hvICJSRUxFTkdfVEVTVFMgc2V0IGZyb20gc2NyaXB0OiAiICRSRUxFTkdfVEVTVFMKZWxzZQogICAgZWNobyAiUkVMRU5HX1RFU1RTIHNldCBmcm9tIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZTogIiAkUkVMRU5HX1RFU1RTCgpmaQoKIyBUaGlzIHNjcmlwdCBmaWxlIGlzIHRvIGhlbHAgZ2V0IGJ1aWxkcyBzdGFydGVkICJmcmVzaCIsIHdoZW4KIyB0aGUgJHtSRUxFTkdfVEVTVFN9IGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvbiBsb2NhbCBmaWxlIHN5c3RlbS4KIyBXaGlsZSBpdCBpcyBpbiB0aGUgY3ZzIHJlcG9zaXRvcnkgaW4gJHtSRUxFTkdfVEVTVFN9LCBpdCBpcwojIG1lYW50IHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnkKIyBvZiAke1JFTEVOR19URVNUU30gb24gdGhlIGZpbGUgc3lzdGVtLgoKIyBleHBvcnQgaXMgdXNlZCwgaW5zdGVhZCBvZiBjaGVja291dCwganVzdCB0byBhdm9pZCB0aGUgQ1ZTIGRpcmVjdG9yaWVzIGFuZCBzaW5jZSB0aGlzIGNvZGUKIyBmb3IgYSBsb2NhbCBidWlsZCwgdGhlcmUgc2hvdWxkIG5ldmVyIGJlIGEgbmVlZCB0byBjaGVjayBpdCBiYWNrIGluIHRvIENWUy4KCiMgSWYgdGhlcmUgaXMgbm8gc3ViZGlyZWN0b3J5LCB0cnkgZ29pbmcgdXAgb25lIGRpcmVjdG9yeSBhbmQgbG9va2luZyBhZ2FpbiAoaW4gY2FzZSB3ZSBhcmUgaW4gaXQpLgppZiBbICEgLWUgJHtSRUxFTkdfVEVTVFN9IF0KdGhlbgogICAgY2QgLi4KICAgIGlmIFsgISAtZSAke1JFTEVOR19URVNUU30gXQogICAgdGhlbiAgICAgICAgCiAgICAgICAgZWNobyAiJHtSRUxFTkdfVEVTVFN9IGRvZXMgbm90IGV4aXN0IGFzIHN1YiBkaXJlY3RvcnkiOwogICAgICAgIGV4aXQgMTsKICAgIGZpCmZpCgoKIyBtYWtlIHN1cmUgUkVMRU5HX1RFU1RTIGhhcyBiZWVuIGRlZmluZWQgYW5kIGlzIG5vIHplcm8gbGVuZ3RoLCBvciAKIyBlbHNlIGZvbGxvd2luZyB3aWxsIGV2YWwgdG8gInJtIC1mciAvKiIgLi4uIHBvdGVudGlhbGx5IGNhdGFzdHJvcGhpYwppZiBbIC16ICIke1JFTEVOR19URVNUU30iIF0KdGhlbgogICAgZWNobyAiVGhlIHZhcmlhYmxlIFJFTEVOR19URVNUUyBtdXN0IGJlIGRlZmluZWQgdG8gcnVuIHRoaXMgc2NyaXB0IgogICAgZXhpdCAxOwpmaQplY2hvICIgICAgcmVtb3ZpbmcgYWxsIG9mICR7UkVMRU5HX1RFU1RTfSAuLi4iCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8qCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8ucHJvamVjdApybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvLnNldHRpbmdzCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8uY2xhc3NwYXRoCm1rZGlyIC1wICIke1JFTEVOR19URVNUU30iCgojY29udHJvbHRhZz1kYXZpZF93aWxsaWFtc190ZW1wQnJhbmNoMwpjb250cm9sdGFnPUhFQUQKZWNobyAiICAgIGNoZWNraW5nIG91dCAkY29udHJvbHRhZyBvZiAke1JFTEVOR19URVNUU30gZnJvbSBjdnMgLi4uIgoKZXhwb3J0IENWU19SU0g9c3NoCmlmIFsgLXogJHtDVlNfSU5GT30gXSA7IHRoZW4KICAgIENWU19JTkZPPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6CmZpCgplY2hvICJDVlNfSU5GTzogIiAkQ1ZTX0lORk8KCmN2cyAtUSAtZiAtZCAke0NWU19JTkZPfS9jdnNyb290L2NhbGxpc3RvICBleHBvcnQgLWQgJHtSRUxFTkdfVEVTVFN9IC1yICRjb250cm9sdGFnICR7UkVMRU5HX1RFU1RTfQpyZXR1cm5jb2RlPSQ/CmlmIFsgJHJldHVybmNvZGUgLW5lIDAgXSAKdGhlbgogICAgZWNobyAibm9uIHplcm8gZnJvbSBjdnMgY2hlY2tvdXQ6ICIkcmV0dXJuY29kZQogICAgZXhpdCAkcmV0dXJuY29kZQpmaSAKZWNobyAiICAgIG1ha2luZyBzdXJlIHJlbGVuZyBjb250cm9sIGZpbGVzIGFyZSBleGVjdXRhYmxlIGFuZCBoYXZlIHByb3BlciBFT0wgLi4uIgpkb3MydW5peCAke1JFTEVOR19URVNUU30vKi5zaCogJHtSRUxFTkdfVEVTVFN9LyoucHJvcGVydGllcyAke1JFTEVOR19URVNUU30vKi54bWwgPi9kZXYvbnVsbCAyPj4vZGV2L251bGwKY2htb2QgK3ggJHtSRUxFTkdfVEVTVFN9Lyouc2ggPiAvZGV2L251bGwKZWNobwoKIyBUT0RPIC4uLiBhIGJpdCBxdWlya3kgLi4uIG5lZWQgdG8gaW5zdGFsbCByZWxlbmcgdGVzdHMgYXMgYWJvdmUsIGJ1dCB0aGVuIAojIGFsc28gcnVuICJpbnN0YWxsVGVzdHMiIHRhcmdldCBmcm9tIHJlbGVuZyB0b29scyBidWlsZC54bWwgZmlsZS4gCgoKUEsDBAoAAAgAAO2MCT/z0ziaEAUAABAFAAAfAAAAdGVtcGxhdGVGaWxlcy9pbmRleFBlbmRpbmcuaHRtbDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KPHRpdGxlPlNvZnR3YXJlIFJlcG9zaXRvcnkgUmVwb3J0cyBQZW5kaW5nPC90aXRsZT4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4iIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCiAgICBocmVmPSIvZWNsaXBzZS9lY2xpcHNlLm9yZy1jb21tb24vc3R5bGVzaGVldHMvdmlzdWFsLmNzcyIKICAgIG1lZGlhPSJzY3JlZW4iIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCiAgICBocmVmPSIvZWNsaXBzZS9lY2xpcHNlLm9yZy1jb21tb24vc3R5bGVzaGVldHMvbGF5b3V0LmNzcyIKICAgIG1lZGlhPSJzY3JlZW4iIC8+CjwvaGVhZD4KPGJvZHk+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj48aW1nCiAgICAgICAgICAgIHNyYz0iL2VjbGlwc2UvZWNsaXBzZS5vcmctY29tbW9uL3N0eWxlc2hlZXRzL2hlYWRlcl9sb2dvLmdpZiIKICAgICAgICAgICAgd2lkdGg9IjE2MyIgaGVpZ2h0PSI2OCIgYm9yZGVyPSIwIiBhbHQ9IkVjbGlwc2UgTG9nbyIKICAgICAgICAgICAgY2xhc3M9ImxvZ28iIC8+IDwvYT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWlkY29sdW1uIj4KCiAgICAgICAgPGgyPlNvZnR3YXJlIFJlcG9zaXRvcnkgUmVwb3J0czwvaDI+CgogICAgICAgIDxwPgogICAgICAgICAgICBObyByZXBvcnRzIGF0IHRoaXMgdGltZS4gVGhlIHJlcG9ydHMgYXJlIGluIHByb2dyZXNzIChvcgogICAgICAgICAgICB3ZXJlIGVuZGVkIGFibm9ybWFsbHkpLiBDaGVjayBhZ2FpbiBpbiAxNSBtaW51dGVzLCBvciBtb25pdG9yCiAgICAgICAgICAgIHRoZSA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9odWRzb24uZWNsaXBzZS5vcmcvaHVkc29uL3ZpZXcvUmVwb3NpdG9yeSUyMEFnZ3JlZ2F0aW9uLyI+UmVwb3NpdG9yeQogICAgICAgICAgICAgICAgQWdncmVnYXRpb24gYnVpbGQuPC9hPgogICAgICAgIDwvcD4KCgogICAgPC9kaXY+CjwvYm9keT4KPC9odG1sPlBLAwQKAAAIAADtjAk/ZSCp7S8vAAAvLwAAHAAAAHRlbXBsYXRlRmlsZXMvaW5kZXhtYWluLmh0bWw8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KPGhlYWQ+Cjx0aXRsZT5Tb2Z0d2FyZSBSZXBvc2l0b3J5IFJlcG9ydHM8L3RpdGxlPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgo8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKICAgIGhyZWY9Ii9lY2xpcHNlL2VjbGlwc2Uub3JnLWNvbW1vbi9zdHlsZXNoZWV0cy92aXN1YWwuY3NzIgogICAgbWVkaWE9InNjcmVlbiIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKICAgIGhyZWY9Ii9lY2xpcHNlL2VjbGlwc2Uub3JnLWNvbW1vbi9zdHlsZXNoZWV0cy9sYXlvdXQuY3NzIgogICAgbWVkaWE9InNjcmVlbiIgLz4KPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPjxpbWcKICAgICAgICAgICAgc3JjPSIvZWNsaXBzZS9lY2xpcHNlLm9yZy1jb21tb24vc3R5bGVzaGVldHMvaGVhZGVyX2xvZ28uZ2lmIgogICAgICAgICAgICB3aWR0aD0iMTYzIiBoZWlnaHQ9IjY4IiBib3JkZXI9IjAiIGFsdD0iRWNsaXBzZSBMb2dvIgogICAgICAgICAgICBjbGFzcz0ibG9nbyIgLz4gPC9hPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtaWRjb2x1bW4iPgoKICAgICAgICA8aDE+U29mdHdhcmUgUmVwb3NpdG9yeSBSZXBvcnRzPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgVGhlIHJlcG9ydHMgYXJlIGxpc3RlZCBpbiBhcHByb3hpbWF0ZSBvcmRlciBvZiBwcmlvcml0eS4KICAgICAgICAgICAgU3VjaCBhcywgYnVuZGxlcyBtdXN0IG5vdCBoYXZlIG1pc3NpbmcgbGVnYWwgZmlsZXMsIGFuZCBhbGwKICAgICAgICAgICAgYnVuZGxlcyBuZWVkIHRvIGJlIHNpZ25lZCAod2l0aCBmZXcgZXhjZXB0aW9ucyksIGFuZCBhbGwKICAgICAgICAgICAgYnVuZGxlcyBtdXN0IHVzZSA0IHBhcnQgdmVyc2lvbiBudW1iZXJzLiBUaGUgcmVtYWluaW5nCiAgICAgICAgICAgIHJlcG9ydHMgYXJlIGltcG9ydGFudCwgYW5kIGlkZWFsbHkgd291bGQgYmUgImNsZWFuIiwgYnV0CiAgICAgICAgICAgIG5vcm1hbGx5IHdvdWxkIG5vdCBwcmV2ZW50IHRoZSByZWxlYXNlLCBvciBpbmNsdXNpb24gaW4gdGhlCiAgICAgICAgICAgIGNvbW1vbiByZXBvc2l0b3J5LiBFeGNlcHQgd2hlcmUgbm90ZWQsIHRoZSBjaGVja3MgYXJlIGRvbmUKICAgICAgICAgICAgZGlyZWN0bHkgYXJlIGphcnMgaW4gdGhlIG1haW4gY29tbW9uIHJlcG9zaXRvcnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIFRoYXQgaXMsIGl0IGRvZXMgbm90IGNoZWNrIHRoZSAidHJ1c3RlZCByZXBvc2l0b3JpZXMiIHdlCiAgICAgICAgICAgIHBvaW50IHRvIHZpYSBjb21wb3NpdGUgaW5kaXJlY3Rpb24uIFNlZSB0aGUgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL1NpbVJlbC9TaW11bHRhbmVvdXNfUmVsZWFzZV9SZXBvcnRzX0ZBUSI+CiAgICAgICAgICAgICAgICBSZXBvcnRzIEZBUTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGUgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZXMgdGhlIHJlcG9ydHMuCgogICAgICAgIDwvcD4KICAgICAgICA8cD5SZW1lbWJlciwgdGhlc2UgYXV0b21hdGVkIHJlcG9ydHMgdGVzdCBhIG1pbmltYWwgdmlldyBvZgogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeS4gRm9yIGV4YW1wbGUsIGEgYnVuZGxlIG1heSBoYXZlIGFuIGFib3V0Lmh0bWwKICAgICAgICAgICAgZmlsZSwgc28gaXMgbm90IGxpc3RlZCBpbiAibWlzc2luZyBmaWxlcyIgcmVwb3J0LCBidXQgdGhhdAogICAgICAgICAgICBkb2VzIG5vdCBtZWFuIHRoZSBjb250ZW50IG9mIHRoZSBhYm91dC5odG1sIGZpbGUgaXMgY29ycmVjdC4KICAgICAgICAgICAgSW4gb3RoZXIgd29yZHMsIENvbW1pdHRlcnMgYW5kIFByb2plY3QgTGVhZHMgYXJlIHN0aWxsCiAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBjb3JyZWN0bmVzcyAtLSB0aGVzZSByZXBvcnRzIGFyZSBtb3JlCiAgICAgICAgICAgIGZvY3VzZWQgb24gb2J2aW91cyBpbmNvcnJlY3RuZXNzLCB1c3VhbGx5IHRoaW5ncyB0aGF0IGhhcHBlbgogICAgICAgICAgICBieSBzbWFsbCBvdmVyc2lnaHRzLCBhbmQgd2hpY2ggYXJlIG9mdGVuIGhhcmQgdG8gInNwb3QiCiAgICAgICAgICAgIHVudGlsIHRvbyBsYXRlLiBOb3RlIHRvbyB0aGF0IG1hbnkgb2YgdGhlICJlcnJvcnMiIHRoZXNlCiAgICAgICAgICAgIHJlcG9ydHMgbGlzdCwgY2FuIGJlIGNhdWdodCBhdCBkZXZlbG9wbWVudCB0aW1lLCBpbiBFY2xpcHNlCiAgICAgICAgICAgIElERSwgYnkgcHJvcGVyIHNldHRpbmcgb2YgUERFIGNvbXBpbGVyIHNldHRpbmdzLjwvcD4KICAgICAgICA8cD5BbHNvLCByZW1lbWJlciwgZXNwZWNpYWxseSBzaW5jZSB0aGVzZSByZXBvcnRzIGFyZSAibmV3IgogICAgICAgICAgICBpbiB0aGlzIGNvbnRleHQsIHRoZSByZXBvcnRzIG1heSBjb250YWluIG91dC1yaWdodCBlcnJvcnMKICAgICAgICAgICAgYW5kIHdpbGwgY2VydGFpbmx5IG5lZWQgaW1wcm92ZW1lbnQgb3ZlciB0aW1lLiBDb250cmlidXRpb25zCiAgICAgICAgICAgIHdlbGNvbWUuIFBsZWFzZSBvcGVuIGEgYnVnIGluIGNyb3NzLXByb2plY3QgY29tcG9uZW50IGlmIHlvdQogICAgICAgICAgICBzZWUgcHJvYmxlbXMgb3IgaGF2ZSBuZXcgY29udHJpYnV0aW9ucy48L3A+CiAgICAgICAgPGRsPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2xheW91dENoZWNrLnR4dCI+QnVuZGxlcyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZmlsZXM8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5UaGlzIHJlcG9ydCBsaXN0cyBidW5kbGVzIGFuZCBmZWF0dXJlcyB0aGF0IGFyZQogICAgICAgICAgICAgICAgbWlzc2luZyBpbXBvcnRhbnQsIHJlcXVpcmVkIGZpbGVzLiBJdCBsb29rcyBkaXJlY3RseSBhdAogICAgICAgICAgICAgICAgamFycyBpbiB0aGUgY29tbW9uIHJlcG9zaXRvcnkuIChDdXJyZW50bHksIGRvZXMgbm90CiAgICAgICAgICAgICAgICBjaGVjayB0aG9zZSAidHJ1c3RlZCByZXBvc2l0b3JpZXMiIHdlIHBvaW50IHRvIHZpYQogICAgICAgICAgICAgICAgY29tcG9zaXRlIGluZGlyZWN0aW9uKS4gTWlzc2luZyBsZWdhbCBmaWxlcyBhcmUgdXN1YWxseQogICAgICAgICAgICAgICAgY29uc2lkZXJlZCBhICJzdG9wIHNoaXAiIGlzc3VlLCBzaW5jZSBFY2xpcHNlIGlzIHdlbGwKICAgICAgICAgICAgICAgIGtub3duIGZvciBpdHMgSVAgcXVhbGl0eS48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3ZlcmlmeWRpcm91dHB1dC91bnNpZ25lZC50eHQiPlVuc2lnbmVkCiAgICAgICAgICAgICAgICAgICAgYnVuZGxlczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPlRoaXMgcmVwb3J0IGxpc3RzIGJ1bmRsZXMgYW5kIGZlYXR1cmVzIHRoYXQgYXJlCiAgICAgICAgICAgICAgICB0aGF0IGFyZSBub3Qgc2lnbmVkLiBQcmV0dHkgc2VyaW91cyBpc3N1ZSwgdGhvdWdoIHRoZXJlCiAgICAgICAgICAgICAgICBhcmUgYSBmZXcgZXhjZXB0aW9ucy4gKHdlbGwsIG9ubHkgb25lIGNvZGUgZXhjZXB0aW9uIGlzCiAgICAgICAgICAgICAgICBrbm93biAuLi4gc2VlIGJlbG93KS48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3ZlcnNpb25QYXR0ZXJuQ2hlY2sudHh0Ij5CdW5kbGVzCiAgICAgICAgICAgICAgICAgICAgYW5kIEZlYXR1cmVzIG5vdCB1c2luZyA0IHBhcnQgdmVyc2lvbnM8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5UbyBoYXZlIHAyIHVwZGF0ZSBjb3JyZWN0bHkgYW5kIE9TR2kgdG8gcmVzb2x2ZQogICAgICAgICAgICAgICAgYnVuZGxlcyBhcyBleHBlY3RlZCwgaXQgaXMgZXNzZW50aWFsIHRoYXQgYnVuZGxlcyBhbmQKICAgICAgICAgICAgICAgIGZlYXR1cmVzIHVzZSB0aGUgcmVxdWlyZWQgNCBwYXJ0IHZlcnNpb25pbmcgcnVsZXMuIEV2ZXJ5CiAgICAgICAgICAgICAgICBidWlsZC48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2xpY2Vuc2VDb25zaXN0ZW5jeS5odG1sIj5Db25zaXN0ZW50LAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbGljZW5zZXMgKFNVQSkgaW4gZmVhdHVyZXM8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5DaGVjayB0byBtYWtlIHN1cmUgZmVhdHVyZXMgdXNlIHRoZSBjdXJyZW50LAogICAgICAgICAgICAgICAgY29ycmVjdCBsaWNlbnNlLiBUaGUgcmVwb3J0IGFsc28gbGlzdHMgZmVhdHVyZXMgaW4KICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgd2l0aCBubyBsaWNlbnNlIChTVUEpIGluIHRoZSBjb250ZW50CiAgICAgICAgICAgICAgICBtZXRhZGF0YS4gVGhpcyByZXBvcnQgdXNlcyB0aGUgcmVwb3NpdG9yeSdzIGNvbnRlbnQKICAgICAgICAgICAgICAgIG1ldGFkYXRhLCBpbnN0ZWFkIG9mIHRoZSBqYXIgZmlsZXMgdGhlbXNlbHZlcywgaW4KICAgICAgICAgICAgICAgIGNvbnRyYXN0IHRvIHRoZSAibWlzc2luZyBmaWxlcyIgcmVwb3J0LCBhYm92ZS4gQm90aCBhcmUKICAgICAgICAgICAgICAgIGltcG9ydGFudCB0byBiZSBjb3JyZWN0LCBhcyBkaWZmZXJlbnQgcGFydHMgb2YgRWNsaXBzZQogICAgICAgICAgICAgICAgY29kZSB1c2Ugb25lIG9yIHRoZSBvdGhlciB0byBwcmVzZW50IGluZm9ybWF0aW9uIHRvIHRoZQogICAgICAgICAgICAgICAgdXNlciBkZXBlbmRpbmcgb24gdGhlIHRhc2suPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9icmVlZGF0YS50eHQiPlVzZSBhbmQgRGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgb2YgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5JbnRlcmVzdGluZyByZXBvcnQgc2hvd2luZyB3aGF0IEJSRUVzIGFyZSBpbiB1c2UsCiAgICAgICAgICAgICAgICBhbmQgd2hpY2ggYnVuZGxlcyBhcmUgbWlzc2luZyBpdC4gQWxsIGJ1bmRsZXMgd2l0aCBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHNob3VsZCBoYXZlIG9uZSwgYnV0IGl0IGlzIG5vdCByZXF1aXJlZCBpbgogICAgICAgICAgICAgICAgcmVzb3VyY2Utb25seSBidW5kbGVzLjwvZGQ+CgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3BhY2syMDBkYXRhLnR4dCI+SmFycyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBQYWNrMjAwIGZpbGU8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5QYWNrMjAwIGNvbXByZXNzaW9uIGlzIGltcG9ydGFudCB0byBzYXZlIGJhbmR3aWR0aC4KICAgICAgICAgICAgICAgIFRoaXMgcmVwb3J0IHdpbGwgbmV2ZXIgYmUgcGVyZmVjdCAuLi4gdGhhdCBpcywgdGhlcmUgYXJlCiAgICAgICAgICAgICAgICBjYXNlcyB3aGVyZSBpdCBpcyBrbm93biB0aGF0IGEgamFyIGNhbiBub3QgYmUgY2xlYW5seQogICAgICAgICAgICAgICAgY29tcHJlc3NlZCB3aXRoIHBhY2syMDAuIEJ1dCBuZWFybHkgYWxsIGNhbi4gU28gb25lIG9yCiAgICAgICAgICAgICAgICB0d28gZnJvbSBhIHByb2plY3Qgc2hvdWxkIGJlIGlnbm9yZWQgYXMgIk9LIiAuLi4gYnV0IGEKICAgICAgICAgICAgICAgIHBhdHRlcm4gb2YgYWxsIGphcnMvYnVuZGxlcyBmcm9tIGEgcHJvamVjdCBub3QgYmVpbmcKICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgaW5kaWNhdGVzIHRoZSBwcm9qZWN0IHNpbXBseSBoYXMgbm90CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCB0aGF0IHlldCBpbiB0aGVpciBidWlsZCBvciBjb250cmlidXRpb24KICAgICAgICAgICAgICAgIHByb2Nlc3MuPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9mZWF0dXJlTmFtZXMuaHRtbCI+RmVhdHVyZSBuYW1lcwogICAgICAgICAgICAgICAgICAgIHJlcG9ydDwvYT4KICAgICAgICAgICAgPC9kdD4KCiAgICAgICAgICAgIDxkZD5DaGVjayB0aGlzIHJlcG9ydCBmb3IgZmVhdHVyZXMgdXNpbmcgaW5jb3JyZWN0CiAgICAgICAgICAgICAgICBuYW1lcyBvciBpbmNvcnJlY3QgbG9jYWxpemF0aW9uIHNldHRpbmdzLiBXaGlsZSB3ZSBjYW4KICAgICAgICAgICAgICAgIG5vdCBhdXRvbWF0aWNhbGx5IGtub3cgd2hhdCB0aGUgY29ycmVjdCBuYW1lIG9mIGEgYnVuZGxlCiAgICAgICAgICAgICAgICBpcywgd2UgY2FuIGJlIHN1cmUgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCAnJScsIGFuZCBpcwogICAgICAgICAgICAgICAgbm90ICJGZWF0dXJlLU5hbWUiIG9yICJmZWF0dXJlIiwgZXRjLiBUaGlzIHRlc3QgaXMgcmFuCiAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBjb250ZW50IG1ldGFkYXRhIG9mIHRoZSByZXBvc2l0b3J5LjwvZGQ+CiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvYnVuZGxlTmFtZXMuaHRtbCI+QnVuZGxlIG5hbWVzCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0PC9hPgogICAgICAgICAgICA8L2R0PgoKICAgICAgICAgICAgPGRkPkNoZWNrIHRoaXMgcmVwb3J0IGZvciBidW5kbGVzIHVzaW5nIGluY29ycmVjdCBuYW1lcwogICAgICAgICAgICAgICAgb3IgaW5jb3JyZWN0IGxvY2FsaXphdGlvbiBzZXR0aW5ncy4gV2hpbGUgd2UgY2FuIG5vdAogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBrbm93IHdoYXQgdGhlIGNvcnJlY3QgbmFtZSBvZiBhIGJ1bmRsZSBpcywKICAgICAgICAgICAgICAgIHdlIGNhbiBiZSBzdXJlIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggJyUnLCBhbmQgaXMgbm90CiAgICAgICAgICAgICAgICAiQnVuZGxlLU5hbWUiIG9yICJwbHVnaW4tbmFtZSIsIGV0Yy4gVGhpcyB0ZXN0IGlzIHJhbgogICAgICAgICAgICAgICAgYWdhaW5zdCB0aGUgY29udGVudCBtZXRhZGF0YSBvZiB0aGUgcmVwb3NpdG9yeS48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3Byb3ZpZGVyTmFtZXMuaHRtbCI+UHJvdmlkZXIgbmFtZQogICAgICAgICAgICAgICAgICAgIHJlcG9ydDwvYT4KICAgICAgICAgICAgPC9kdD4KCiAgICAgICAgICAgIDxkZD5DaGVjayBmb3IgYnVuZGxlcyB1c2luZyBpbmNvcnJlY3QgcHJvdmlkZXIgbmFtZXMKICAgICAgICAgICAgICAgIChCdW5kbGUtVmVuZG9yIGRpcmVjdGl2ZSkgb3IgaW5jb3JyZWN0IGxvY2FsaXphdGlvbgogICAgICAgICAgICAgICAgc2V0dGluZ3MuIFRoZSBiZXN0IGZvcm0gb2YgcHJvdmlkZXIgbmFtZSBpcyAiRWNsaXBzZQogICAgICAgICAgICAgICAgJmx0O3Byb2plY3QgbmFtZSZndDsiLiBTb21lIHByb2plY3RzIGhhdmUgY2hvc2VuIGEKICAgICAgICAgICAgICAgIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtLCBhbmQgY2FuIG5vdCBhdXRvbWF0ZSBldmVyeSBuYW1lCiAgICAgICAgICAgICAgICBjaGVjaywgYnV0LCBhZ2Fpbiwgd2Uga25vdyBpdCBzaG91bGQgbm90IHN0YXJ0IHdpdGggJyUnLAogICAgICAgICAgICAgICAgbm90IGJlICJwcm92aWRlci1uYW1lIiBub3IgYmUgZW1wdHkgKG51bGwpLiBUaGlzIHRlc3QgaXMKICAgICAgICAgICAgICAgIHJhbiBhZ2FpbnN0IHRoZSBjb250ZW50IG1ldGFkYXRhIG9mIHRoZSByZXBvc2l0b3J5LjwvZGQ+CgoKICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9jb3B5cmlnaHRzLmh0bWwiPkZlYXR1cmUgQ29weXJpZ2h0czwvYT4KICAgICAgICAgICAgPC9kdD4KCiAgICAgICAgICAgIDxkZD5MaXN0IGNvcHlyaWdodHMgdXNlZCBieSBGZWF0dXJlcy48L2RkPgoKICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9kZXNjcmlwdGlvbnMuaHRtbCI+RmVhdHVyZQogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uczwvYT4KICAgICAgICAgICAgPC9kdD4KCiAgICAgICAgICAgIDxkZD5MaXN0IGRlc2NyaXB0aW9ucyB1c2VkIGJ5IEZlYXR1cmVzLjwvZGQ+CgoKCgoKCgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL25vblVuaXF1ZVZlcnNpb25zLnR4dCI+TGlzdCBvZgogICAgICAgICAgICAgICAgICAgIG5vbi11bmlxdWUgdmVyc2lvbnM8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5MaXN0IHRob3NlIGJ1bmRsZXMgKHRlY2huaWNhbGx5LCBJVXMpIGZvciB3aGljaAogICAgICAgICAgICAgICAgdGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zLiBJdCBpcyBvZnRlbiBxdWl0ZSBub3JtYWwKICAgICAgICAgICAgICAgIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSB2ZXJzaW9ucyAoZS5nLiB3aGVuIGRpZmZlciBieQogICAgICAgICAgICAgICAgbWFqb3Igb3IgbWlub3IgdmVyc2lvbnMpLCBidXQgc29tZXRpbWVzIGxvb2tpbmcgYXQgdGhlCiAgICAgICAgICAgICAgICBtdWx0aXBsZSB2ZXJzaW9uIHJlcG9ydCBjYW4gc3BvdCB1bmV4cGVjdGVkIGNhc2VzIHdoZXJlCiAgICAgICAgICAgICAgICB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbnMuIEV2ZW4gaWYgc28sIGl0IHdpbGwgdXN1YWxseQogICAgICAgICAgICAgICAgbm90IGNhdXNlIHByb2JsZW1zLCBidXQgY2FuIGF0IGxlYXN0IGJlIGluZWZmaWNpZW50IHVzZQogICAgICAgICAgICAgICAgb2Ygc3BhY2UgKGUuZy4gaWYgZGlmZmVyIG9ubHkgYnkgcXVhbGlmaWVyKS48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3ZlcnNpb25QYXR0ZXJucy50eHQiPlZlcnNpb24KICAgICAgICAgICAgICAgICAgICBRdWFsaWZlciBQYXR0ZXJuczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPlRoaXMgaXMgYW4gZXhwbG9yYXRvcnkgcmVwb3J0IG9mIHRoZSB0aGUgdHlwZXMgb3IKICAgICAgICAgICAgICAgIHBhdHRlcm5zIG9mIHZlcnNpb24gcXVhbGlmZXJzIGJ5IGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGluCiAgICAgICAgICAgICAgICB0aGUgcmVwb3NpdG9yeS4gTG9uZ2VyIHRlcm0sIHRoaXMgcmVwb3J0IGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgICAgdG8gc3BvdCB0eXBvcyBhbmQgYWxzbyBmaW5kIGJ1bmRsZXMgb3IgZmVhdHVyZXMgaW4gdGhlCiAgICAgICAgICAgICAgICByZXBvc2l0b3J5IHRoYXQgZG8gbm90IHVzZSA0IHBhcnQgdmVyc2lvbmluZy4gKEEgcmVwb3J0LAogICAgICAgICAgICAgICAgYWJvdmUsIGFsc28gZGV0ZWN0cyBsYWNrIG9mIDQgcGFydCB2ZXJzaW9uaW5nLCBidXQgaXMKICAgICAgICAgICAgICAgIGJhc2VkIG9uIGphcnMsIGZvdW5kIGluIGNvbW1vbiBkaXJlY3RvcnksIHJhdGhlciB0aGFuCiAgICAgICAgICAgICAgICBhbGwgb2YgY29udGVudCBtZXRhZGF0YSBpbiByZXBvc2l0b3J5Lik8L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2VzZGF0YS50eHQiPlVzZSBvZgogICAgICAgICAgICAgICAgICAgIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgTGlzdCB0aG9zZSBidW5kbGVzIHdoaWNoIGFyZSwgYW5kIHdoaWNoIGFyZSBub3QsIHVzaW5nCiAgICAgICAgICAgICAgICB0aGUgPGEKICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9QREUvVUkvU291cmNlUmVmZXJlbmNlcyI+RWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzPC9hPgogICAgICAgICAgICAgICAgZGlyZWN0aXZlIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBkaXJlY3RpdmUuIFRoaXMKICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSAoYW5kIHJlcG9ydCkgaXMgdXNlZnVsIGZvciBzb21lIHByb2plY3RzIHRvCiAgICAgICAgICAgICAgICBoZWxwIHRoZWlyIGNvbW11bml0eSBmaW5kIHRoZWlyIHNvdXJjZSBjb2RlIGRpcmVjdGx5CiAgICAgICAgICAgICAgICBmcm9tIHRoZWlyIHJlcG9zaXRvcnkgKHRvIGhlbHAgbWFrZSBwcm92aWRpbmcgcGF0Y2hlcwogICAgICAgICAgICAgICAgZWFzaWVyKSwgYnV0IGlzIG5vdCB1c2VmdWwgb3IgYXBwcm9wcmlhdGUgZm9yIGFsbAogICAgICAgICAgICAgICAgcHJvamVjdHMuIFVzZSB0aGUgZGlyZWN0aXZlLCBhbmQgdGhlIHJlcG9ydCwgaG93ZXZlcgogICAgICAgICAgICAgICAgeW91ciBwcm9qZWN0IGRlZW1zIGFwcHJvcHJpYXRlIGFuZCB1c2VmdWwuCiAgICAgICAgICAgIDwvZGQ+CiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvZmVhdHVyZURpcmVjdG9yeUxlbmd0aHMuaHRtbCI+RmVhdHVyZQogICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBMZW5ndGhzPC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+VGhpcyBpcyBhbiBleHBsb3JhdG9yeSByZXBvcnQgb2YgdGhlIGxlbmd0aCBvZgogICAgICAgICAgICAgICAgZmVhdHVyZSBkaXJlY3RvcmllcyBsZW5ndGgsIGlmIGZlYXR1cmUgd2FzIGluc3RhbGxlZCwKICAgICAgICAgICAgICAgIChub3QgaW5jbHVkaW5nIHRoZSAuLi4vZWNsaXBzZS9mZWF0dXJlcyBwYXJ0IG9mIG5hbWUpLgogICAgICAgICAgICAgICAgSXRzIHB1cnBvc2UgaXQgdG8gYWxlcnQgdGhlIGludGVyZXN0ZWQgb2YgZXhjZXB0aW9uYWxseQogICAgICAgICAgICAgICAgbG9uZyBmZWF0dXJlIG5hbWVzLCB3aGljaCBtaWdodCBjYXVzZSBzb21lIGlzc3VlcyBvbgogICAgICAgICAgICAgICAgc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gVGhpcyByZXBvcnQgaXMgZXhwbG9yYXRvcnksCiAgICAgICAgICAgICAgICBzaW5jZSBpdCBpcyB1bmNsZWFyIHdoYXQsIGlmIGFueSwgc2hvdWxkIGJlIGNvbnNpZGVyZWQKICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxlbmd0aCwgd2hpY2ggZGVwZW5kcyBvbiBtYW55IGZhY3RvcnMuIEJ1dAogICAgICAgICAgICAgICAgLi4uIGlmIHlvdSBhcmUgY3JlYXRpbmcgbmV3IGZlYXR1cmVzLCBpdCdkIGJlIGJlc3Qgbm90CiAgICAgICAgICAgICAgICB0byBleGNlZWQgdGhlIHR5cGljYWwgc2l6ZXMuPC9kZD4KCgoKCiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvdmVyaWZ5ZGlyb3V0cHV0L2tub3dudW5zaWduZWQudHh0Ij5TaWduZWQKICAgICAgICAgICAgICAgICAgICBidW5kbGVzIGV4Y2VwdGlvbnM8L2E+CiAgICAgICAgICAgIDwvZHQ+CgogICAgICAgICAgICA8ZGQ+SnVzdCB0byBkb2N1bWVudCBpdCwgdGhlcmUgYXJlIGEgZmV3IGtub3duIGNhc2VzIG9mCiAgICAgICAgICAgICAgICBqYXJzIGluIHRoZSByZXBvc2l0b3J5IHRoYXQgYXJlIG5vdCBvciBzaG91bGQgbm90IGJlCiAgICAgICAgICAgICAgICBzaWduZWQuPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy92ZXJpZnlkaXJvdXRwdXQvdmVyaWZpZWQudHh0Ij5Db3JyZWN0bHkKICAgICAgICAgICAgICAgICAgICBzaWduZWQgYnVuZGxlczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPkFnYWluLCBqdXN0IGRvY3VtZW50YXRpb24gb2YgamFycyB3ZSBmb3VuZAogICAgICAgICAgICAgICAgY29ycmVjdGx5IHNpZ25lZC48L2RkPgogICAgICAgIDwvZGw+CiAgICA8L2Rpdj4KPC9ib2R5Pgo8L2h0bWw+UEsDBAoAAAgAAO2MCT9RK79euS0AALktAAAjAAAAdGVtcGxhdGVGaWxlcy9pbmRleG1haW5wcmVzaWduLmh0bWw8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KPGhlYWQ+Cjx0aXRsZT5Tb2Z0d2FyZSBSZXBvc2l0b3J5IFJlcG9ydHM8L3RpdGxlPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgo8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKICAgIGhyZWY9Ii9lY2xpcHNlL2VjbGlwc2Uub3JnLWNvbW1vbi9zdHlsZXNoZWV0cy92aXN1YWwuY3NzIgogICAgbWVkaWE9InNjcmVlbiIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKICAgIGhyZWY9Ii9lY2xpcHNlL2VjbGlwc2Uub3JnLWNvbW1vbi9zdHlsZXNoZWV0cy9sYXlvdXQuY3NzIgogICAgbWVkaWE9InNjcmVlbiIgLz4KPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPjxpbWcKICAgICAgICAgICAgc3JjPSIvZWNsaXBzZS9lY2xpcHNlLm9yZy1jb21tb24vc3R5bGVzaGVldHMvaGVhZGVyX2xvZ28uZ2lmIgogICAgICAgICAgICB3aWR0aD0iMTYzIiBoZWlnaHQ9IjY4IiBib3JkZXI9IjAiIGFsdD0iRWNsaXBzZSBMb2dvIgogICAgICAgICAgICBjbGFzcz0ibG9nbyIgLz4gPC9hPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtaWRjb2x1bW4iPgoKICAgICAgICA8aDE+U29mdHdhcmUgUmVwb3NpdG9yeSBSZXBvcnRzPC9oMT4KCiAgICAgICAgPHA+CiAgICAgICAgICAgIDxzdHJvbmc+IFRoZSAic2lnbmluZyB0ZXN0IiBpcyBzdGlsbCBydW5uaW5nIDwvc3Ryb25nPiAob3IKICAgICAgICAgICAgZW5kZWQgYWJub3JtYWxseSkgYW5kIGl0IHRha2VzIGEgbG9uZyB0aW1lLiBDaGVjayBiYWNrIGluIGEKICAgICAgICAgICAgZmV3IGhvdXJzLCBvciBtb25pdG9yIHRoZSA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9odWRzb24uZWNsaXBzZS5vcmcvaHVkc29uL3ZpZXcvUmVwb3NpdG9yeSUyMEFnZ3JlZ2F0aW9uLyI+UmVwb3NpdG9yeQogICAgICAgICAgICAgICAgQWdncmVnYXRpb24gYnVpbGQuPC9hPgogICAgICAgIDwvcD4KCiAgICAgICAgPHA+CiAgICAgICAgICAgIFRoZSByZXBvcnRzIGFyZSBsaXN0ZWQgaW4gYXBwcm94aW1hdGUgb3JkZXIgb2YgcHJpb3JpdHkuCiAgICAgICAgICAgIFN1Y2ggYXMsIGJ1bmRsZXMgbXVzdCBub3QgaGF2ZSBtaXNzaW5nIGxlZ2FsIGZpbGVzLCBhbmQgYWxsCiAgICAgICAgICAgIGJ1bmRsZXMgbmVlZCB0byBiZSBzaWduZWQgKHdpdGggZmV3IGV4Y2VwdGlvbnMpLCBhbmQgYWxsCiAgICAgICAgICAgIGJ1bmRsZXMgbXVzdCB1c2UgNCBwYXJ0IHZlcnNpb24gbnVtYmVycy4gVGhlIHJlbWFpbmluZwogICAgICAgICAgICByZXBvcnRzIGFyZSBpbXBvcnRhbnQsIGFuZCBpZGVhbGx5IHdvdWxkIGJlICJjbGVhbiIsIGJ1dAogICAgICAgICAgICBub3JtYWxseSB3b3VsZCBub3QgcHJldmVudCB0aGUgcmVsZWFzZSwgb3IgaW5jbHVzaW9uIGluIHRoZQogICAgICAgICAgICBjb21tb24gcmVwb3NpdG9yeS4gRXhjZXB0IHdoZXJlIG5vdGVkLCB0aGUgY2hlY2tzIGFyZSBkb25lCiAgICAgICAgICAgIGRpcmVjdGx5IGFyZSBqYXJzIGluIHRoZSBtYWluIGNvbW1vbiByZXBvc2l0b3J5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICBUaGF0IGlzLCBpdCBkb2VzIG5vdCBjaGVjayB0aGUgInRydXN0ZWQgcmVwb3NpdG9yaWVzIiB3ZQogICAgICAgICAgICBwb2ludCB0byB2aWEgY29tcG9zaXRlIGluZGlyZWN0aW9uLiBTZWUgdGhlIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9TaW1SZWwvU2ltdWx0YW5lb3VzX1JlbGVhc2VfUmVwb3J0c19GQVEiPgogICAgICAgICAgICAgICAgUmVwb3J0cyBGQVE8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSByZXBvcnRzLgoKICAgICAgICA8L3A+CiAgICAgICAgPHA+UmVtZW1iZXIsIHRoZXNlIGF1dG9tYXRlZCByZXBvcnRzIHRlc3QgYSBtaW5pbWFsIHZpZXcgb2YKICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkuIEZvciBleGFtcGxlLCBhIGJ1bmRsZSBtYXkgaGF2ZSBhbiBhYm91dC5odG1sCiAgICAgICAgICAgIGZpbGUsIHNvIGlzIG5vdCBsaXN0ZWQgaW4gIm1pc3NpbmcgZmlsZXMiIHJlcG9ydCwgYnV0IHRoYXQKICAgICAgICAgICAgZG9lcyBub3QgbWVhbiB0aGUgY29udGVudCBvZiB0aGUgYWJvdXQuaHRtbCBmaWxlIGlzIGNvcnJlY3QuCiAgICAgICAgICAgIEluIG90aGVyIHdvcmRzLCBDb21taXR0ZXJzIGFuZCBQcm9qZWN0IExlYWRzIGFyZSBzdGlsbAogICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgY29ycmVjdG5lc3MgLS0gdGhlc2UgcmVwb3J0cyBhcmUgbW9yZQogICAgICAgICAgICBmb2N1c2VkIG9uIG9idmlvdXMgaW5jb3JyZWN0bmVzcywgdXN1YWxseSB0aGluZ3MgdGhhdCBoYXBwZW4KICAgICAgICAgICAgYnkgc21hbGwgb3ZlcnNpZ2h0cywgYW5kIHdoaWNoIGFyZSBvZnRlbiBoYXJkIHRvICJzcG90IgogICAgICAgICAgICB1bnRpbCB0b28gbGF0ZS4gTm90ZSB0b28gdGhhdCBtYW55IG9mIHRoZSAiZXJyb3JzIiB0aGVzZQogICAgICAgICAgICByZXBvcnRzIGxpc3QsIGNhbiBiZSBjYXVnaHQgYXQgZGV2ZWxvcG1lbnQgdGltZSwgaW4gRWNsaXBzZQogICAgICAgICAgICBJREUsIGJ5IHByb3BlciBzZXR0aW5nIG9mIFBERSBjb21waWxlciBzZXR0aW5ncy48L3A+CiAgICAgICAgPHA+QWxzbywgcmVtZW1iZXIsIGVzcGVjaWFsbHkgc2luY2UgdGhlc2UgcmVwb3J0cyBhcmUgIm5ldyIKICAgICAgICAgICAgaW4gdGhpcyBjb250ZXh0LCB0aGUgcmVwb3J0cyBtYXkgY29udGFpbiBvdXQtcmlnaHQgZXJyb3JzCiAgICAgICAgICAgIGFuZCB3aWxsIGNlcnRhaW5seSBuZWVkIGltcHJvdmVtZW50IG92ZXIgdGltZS4gQ29udHJpYnV0aW9ucwogICAgICAgICAgICB3ZWxjb21lLiBQbGVhc2Ugb3BlbiBhIGJ1ZyBpbiBjcm9zcy1wcm9qZWN0IGNvbXBvbmVudCBpZiB5b3UKICAgICAgICAgICAgc2VlIHByb2JsZW1zIG9yIGhhdmUgbmV3IGNvbnRyaWJ1dGlvbnMuPC9wPgogICAgICAgIDxkbD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9sYXlvdXRDaGVjay50eHQiPkJ1bmRsZXMgbWlzc2luZwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZpbGVzPC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+VGhpcyByZXBvcnQgbGlzdHMgYnVuZGxlcyBhbmQgZmVhdHVyZXMgdGhhdCBhcmUKICAgICAgICAgICAgICAgIG1pc3NpbmcgaW1wb3J0YW50LCByZXF1aXJlZCBmaWxlcy4gSXQgbG9va3MgZGlyZWN0bHkgYXQKICAgICAgICAgICAgICAgIGphcnMgaW4gdGhlIGNvbW1vbiByZXBvc2l0b3J5LiAoQ3VycmVudGx5LCBkb2VzIG5vdAogICAgICAgICAgICAgICAgY2hlY2sgdGhvc2UgInRydXN0ZWQgcmVwb3NpdG9yaWVzIiB3ZSBwb2ludCB0byB2aWEKICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBpbmRpcmVjdGlvbikuIE1pc3NpbmcgbGVnYWwgZmlsZXMgYXJlIHVzdWFsbHkKICAgICAgICAgICAgICAgIGNvbnNpZGVyZWQgYSAic3RvcCBzaGlwIiBpc3N1ZSwgc2luY2UgRWNsaXBzZSBpcyB3ZWxsCiAgICAgICAgICAgICAgICBrbm93biBmb3IgaXRzIElQIHF1YWxpdHkuPC9kZD4KICAgICAgICAgICAgPGR0PlVuc2lnbmVkIGJ1bmRsZXM8L2R0PgogICAgICAgICAgICA8ZGQ+KHBlbmRpbmcpPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy92ZXJzaW9uUGF0dGVybkNoZWNrLnR4dCI+QnVuZGxlcwogICAgICAgICAgICAgICAgICAgIGFuZCBGZWF0dXJlcyBub3QgdXNpbmcgNCBwYXJ0IHZlcnNpb25zPC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+VG8gaGF2ZSBwMiB1cGRhdGUgY29ycmVjdGx5IGFuZCBPU0dpIHRvIHJlc29sdmUKICAgICAgICAgICAgICAgIGJ1bmRsZXMgYXMgZXhwZWN0ZWQsIGl0IGlzIGVzc2VudGlhbCB0aGF0IGJ1bmRsZXMgYW5kCiAgICAgICAgICAgICAgICBmZWF0dXJlcyB1c2UgdGhlIHJlcXVpcmVkIDQgcGFydCB2ZXJzaW9uaW5nIHJ1bGVzLiBFdmVyeQogICAgICAgICAgICAgICAgYnVpbGQuPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9saWNlbnNlQ29uc2lzdGVuY3kuaHRtbCI+Q29uc2lzdGVudCwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGxpY2Vuc2VzIChTVUEpIGluIGZlYXR1cmVzPC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+Q2hlY2sgdG8gbWFrZSBzdXJlIGZlYXR1cmVzIHVzZSB0aGUgY3VycmVudCwKICAgICAgICAgICAgICAgIGNvcnJlY3QgbGljZW5zZS4gVGhlIHJlcG9ydCBhbHNvIGxpc3RzIGZlYXR1cmVzIGluCiAgICAgICAgICAgICAgICByZXBvc2l0b3J5IHdpdGggbm8gbGljZW5zZSAoU1VBKSBpbiB0aGUgY29udGVudAogICAgICAgICAgICAgICAgbWV0YWRhdGEuIFRoaXMgcmVwb3J0IHVzZXMgdGhlIHJlcG9zaXRvcnkncyBjb250ZW50CiAgICAgICAgICAgICAgICBtZXRhZGF0YSwgaW5zdGVhZCBvZiB0aGUgamFyIGZpbGVzIHRoZW1zZWx2ZXMsIGluCiAgICAgICAgICAgICAgICBjb250cmFzdCB0byB0aGUgIm1pc3NpbmcgZmlsZXMiIHJlcG9ydCwgYWJvdmUuIEJvdGggYXJlCiAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gYmUgY29ycmVjdCwgYXMgZGlmZmVyZW50IHBhcnRzIG9mIEVjbGlwc2UKICAgICAgICAgICAgICAgIGNvZGUgdXNlIG9uZSBvciB0aGUgb3RoZXIgdG8gcHJlc2VudCBpbmZvcm1hdGlvbiB0byB0aGUKICAgICAgICAgICAgICAgIHVzZXIgZGVwZW5kaW5nIG9uIHRoZSB0YXNrLjwvZGQ+CiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvYnJlZWRhdGEudHh0Ij5Vc2UgYW5kIERpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgIG9mIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50PC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+SW50ZXJlc3RpbmcgcmVwb3J0IHNob3dpbmcgd2hhdCBCUkVFcyBhcmUgaW4gdXNlLAogICAgICAgICAgICAgICAgYW5kIHdoaWNoIGJ1bmRsZXMgYXJlIG1pc3NpbmcgaXQuIEFsbCBidW5kbGVzIHdpdGggSmF2YQogICAgICAgICAgICAgICAgY29kZSBzaG91bGQgaGF2ZSBvbmUsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQgaW4KICAgICAgICAgICAgICAgIHJlc291cmNlLW9ubHkgYnVuZGxlcy48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3BhY2syMDBkYXRhLnR4dCI+SmFycyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBQYWNrMjAwIGZpbGU8L2E+CiAgICAgICAgICAgIDwvZHQ+CiAgICAgICAgICAgIDxkZD5QYWNrMjAwIGNvbXByZXNzaW9uIGlzIGltcG9ydGFudCB0byBzYXZlIGJhbmR3aWR0aC4KICAgICAgICAgICAgICAgIFRoaXMgcmVwb3J0IHdpbGwgbmV2ZXIgYmUgcGVyZmVjdCAuLi4gdGhhdCBpcywgdGhlcmUgYXJlCiAgICAgICAgICAgICAgICBjYXNlcyB3aGVyZSBpdCBpcyBrbm93biB0aGF0IGEgamFyIGNhbiBub3QgYmUgY2xlYW5seQogICAgICAgICAgICAgICAgY29tcHJlc3NlZCB3aXRoIHBhY2syMDAuIEJ1dCBuZWFybHkgYWxsIGNhbi4gU28gb25lIG9yCiAgICAgICAgICAgICAgICB0d28gZnJvbSBhIHByb2plY3Qgc2hvdWxkIGJlIGlnbm9yZWQgYXMgIk9LIiAuLi4gYnV0IGEKICAgICAgICAgICAgICAgIHBhdHRlcm4gb2YgYWxsIGphcnMvYnVuZGxlcyBmcm9tIGEgcHJvamVjdCBub3QgYmVpbmcKICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgaW5kaWNhdGVzIHRoZSBwcm9qZWN0IHNpbXBseSBoYXMgbm90CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCB0aGF0IHlldCBpbiB0aGVpciBidWlsZCBvciBjb250cmlidXRpb24KICAgICAgICAgICAgICAgIHByb2Nlc3MuPC9kZD4KICAgICAgICAgICAgPGR0PgogICAgICAgICAgICAgICAgPGEgaHJlZj0icmVwb3J0cy9mZWF0dXJlTmFtZXMuaHRtbCI+RmVhdHVyZSBuYW1lcwogICAgICAgICAgICAgICAgICAgIHJlcG9ydDwvYT4KICAgICAgICAgICAgPC9kdD4KCiAgICAgICAgICAgIDxkZD5DaGVjayB0aGlzIHJlcG9ydCBmb3IgZmVhdHVyZXMgdXNpbmcgaW5jb3JyZWN0CiAgICAgICAgICAgICAgICBuYW1lcyBvciBpbmNvcnJlY3QgbG9jYWxpemF0aW9uIHNldHRpbmdzLiBXaGlsZSB3ZSBjYW4KICAgICAgICAgICAgICAgIG5vdCBhdXRvbWF0aWNhbGx5IGtub3cgd2hhdCB0aGUgY29ycmVjdCBuYW1lIG9mIGEgYnVuZGxlCiAgICAgICAgICAgICAgICBpcywgd2UgY2FuIGJlIHN1cmUgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCAnJScsIGFuZCBpcwogICAgICAgICAgICAgICAgbm90ICJGZWF0dXJlLU5hbWUiIG9yICJmZWF0dXJlIiwgZXRjLiBUaGlzIHRlc3QgaXMgcmFuCiAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBjb250ZW50IG1ldGFkYXRhIG9mIHRoZSByZXBvc2l0b3J5LjwvZGQ+CiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvYnVuZGxlTmFtZXMuaHRtbCI+QnVuZGxlIG5hbWVzCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0PC9hPgogICAgICAgICAgICA8L2R0PgoKICAgICAgICAgICAgPGRkPkNoZWNrIHRoaXMgcmVwb3J0IGZvciBidW5kbGVzIHVzaW5nIGluY29ycmVjdCBuYW1lcwogICAgICAgICAgICAgICAgb3IgaW5jb3JyZWN0IGxvY2FsaXphdGlvbiBzZXR0aW5ncy4gV2hpbGUgd2UgY2FuIG5vdAogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBrbm93IHdoYXQgdGhlIGNvcnJlY3QgbmFtZSBvZiBhIGJ1bmRsZSBpcywKICAgICAgICAgICAgICAgIHdlIGNhbiBiZSBzdXJlIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggJyUnLCBhbmQgaXMgbm90CiAgICAgICAgICAgICAgICAiQnVuZGxlLU5hbWUiIG9yICJwbHVnaW4tbmFtZSIsIGV0Yy4gVGhpcyB0ZXN0IGlzIHJhbgogICAgICAgICAgICAgICAgYWdhaW5zdCB0aGUgY29udGVudCBtZXRhZGF0YSBvZiB0aGUgcmVwb3NpdG9yeS48L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3Byb3ZpZGVyTmFtZXMuaHRtbCI+UHJvdmlkZXIgbmFtZQogICAgICAgICAgICAgICAgICAgIHJlcG9ydDwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPkNoZWNrIGZvciBidW5kbGVzIHVzaW5nIGluY29ycmVjdCBwcm92aWRlciBuYW1lcwogICAgICAgICAgICAgICAgKEJ1bmRsZS1WZW5kb3IgZGlyZWN0aXZlKSBvciBpbmNvcnJlY3QgbG9jYWxpemF0aW9uCiAgICAgICAgICAgICAgICBzZXR0aW5ncy4gVGhlIGJlc3QgZm9ybSBvZiBwcm92aWRlciBuYW1lIGlzICJFY2xpcHNlCiAgICAgICAgICAgICAgICAmbHQ7cHJvamVjdCBuYW1lJmd0OyIuIFNvbWUgcHJvamVjdHMgaGF2ZSBjaG9zZW4gYQogICAgICAgICAgICAgICAgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0sIGFuZCBjYW4gbm90IGF1dG9tYXRlIGV2ZXJ5IG5hbWUKICAgICAgICAgICAgICAgIGNoZWNrLCBidXQsIGFnYWluLCB3ZSBrbm93IGl0IHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnJScsCiAgICAgICAgICAgICAgICBub3QgYmUgInByb3ZpZGVyLW5hbWUiIG5vciBiZSBlbXB0eSAobnVsbCkuIFRoaXMgdGVzdCBpcwogICAgICAgICAgICAgICAgcmFuIGFnYWluc3QgdGhlIGNvbnRlbnQgbWV0YWRhdGEgb2YgdGhlIHJlcG9zaXRvcnkuPC9kZD4KCgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2NvcHlyaWdodHMuaHRtbCI+RmVhdHVyZSBDb3B5cmlnaHRzPC9hPgogICAgICAgICAgICA8L2R0PgoKICAgICAgICAgICAgPGRkPkxpc3QgY29weXJpZ2h0cyB1c2VkIGJ5IEZlYXR1cmVzLjwvZGQ+CgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2Rlc2NyaXB0aW9ucy5odG1sIj5GZWF0dXJlCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25zPC9hPgogICAgICAgICAgICA8L2R0PgoKICAgICAgICAgICAgPGRkPkxpc3QgZGVzY3JpcHRpb25zIHVzZWQgYnkgRmVhdHVyZXMuPC9kZD4KCgoKCgoKCiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvbm9uVW5pcXVlVmVyc2lvbnMudHh0Ij5MaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgbm9uLXVuaXF1ZSB2ZXJzaW9uczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPkxpc3QgdGhvc2UgYnVuZGxlcyAodGVjaG5pY2FsbHksIElVcykgZm9yIHdoaWNoCiAgICAgICAgICAgICAgICB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbnMuIEl0IGlzIG9mdGVuIHF1aXRlIG5vcm1hbAogICAgICAgICAgICAgICAgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIHZlcnNpb25zIChlLmcuIHdoZW4gZGlmZmVyIGJ5CiAgICAgICAgICAgICAgICBtYWpvciBvciBtaW5vciB2ZXJzaW9ucyksIGJ1dCBzb21ldGltZXMgbG9va2luZyBhdCB0aGUKICAgICAgICAgICAgICAgIG11bHRpcGxlIHZlcnNpb24gcmVwb3J0IGNhbiBzcG90IHVuZXhwZWN0ZWQgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICAgIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucy4gRXZlbiBpZiBzbywgaXQgd2lsbCB1c3VhbGx5CiAgICAgICAgICAgICAgICBub3QgY2F1c2UgcHJvYmxlbXMsIGJ1dCBjYW4gYXQgbGVhc3QgYmUgaW5lZmZpY2llbnQgdXNlCiAgICAgICAgICAgICAgICBvZiBzcGFjZSAoZS5nLiBpZiBkaWZmZXIgb25seSBieSBxdWFsaWZpZXIpLjwvZGQ+CgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL3ZlcnNpb25QYXR0ZXJucy50eHQiPlZlcnNpb24KICAgICAgICAgICAgICAgICAgICBRdWFsaWZlciBQYXR0ZXJuczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPlRoaXMgaXMgYW4gZXhwbG9yYXRvcnkgcmVwb3J0IG9mIHRoZSB0aGUgdHlwZXMgb3IKICAgICAgICAgICAgICAgIHBhdHRlcm5zIG9mIHZlcnNpb24gcXVhbGlmZXJzIGJ5IGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGluCiAgICAgICAgICAgICAgICB0aGUgcmVwb3NpdG9yeS4gTG9uZ2VyIHRlcm0sIHRoaXMgcmVwb3J0IGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgICAgdG8gc3BvdCB0eXBvcyBhbmQgYWxzbyBmaW5kIGJ1bmRsZXMgb3IgZmVhdHVyZXMgaW4gdGhlCiAgICAgICAgICAgICAgICByZXBvc2l0b3J5IHRoYXQgZG8gbm90IHVzZSA0IHBhcnQgdmVyc2lvbmluZy4gKEEgcmVwb3J0LAogICAgICAgICAgICAgICAgYWJvdmUsIGFsc28gZGV0ZWN0cyBsYWNrIG9mIDQgcGFydCB2ZXJzaW9uaW5nLCBidXQgaXMKICAgICAgICAgICAgICAgIGJhc2VkIG9uIGphcnMsIGZvdW5kIGluIGNvbW1vbiBkaXJlY3RvcnksIHJhdGhlciB0aGFuCiAgICAgICAgICAgICAgICBhbGwgb2YgY29udGVudCBtZXRhZGF0YSBpbiByZXBvc2l0b3J5Lik8L2RkPgogICAgICAgICAgICA8ZHQ+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJyZXBvcnRzL2VzZGF0YS50eHQiPlVzZSBvZgogICAgICAgICAgICAgICAgICAgIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczwvYT4KICAgICAgICAgICAgPC9kdD4KICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgTGlzdCB0aG9zZSBidW5kbGVzIHdoaWNoIGFyZSwgYW5kIHdoaWNoIGFyZSBub3QsIHVzaW5nCiAgICAgICAgICAgICAgICB0aGUgPGEKICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9QREUvVUkvU291cmNlUmVmZXJlbmNlcyI+RWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzPC9hPgogICAgICAgICAgICAgICAgZGlyZWN0aXZlIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBkaXJlY3RpdmUuIFRoaXMKICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSAoYW5kIHJlcG9ydCkgaXMgdXNlZnVsIGZvciBzb21lIHByb2plY3RzIHRvCiAgICAgICAgICAgICAgICBoZWxwIHRoZWlyIGNvbW11bml0eSBmaW5kIHRoZWlyIHNvdXJjZSBjb2RlIGRpcmVjdGx5CiAgICAgICAgICAgICAgICBmcm9tIHRoZWlyIHJlcG9zaXRvcnkgKHRvIGhlbHAgbWFrZSBwcm92aWRpbmcgcGF0Y2hlcwogICAgICAgICAgICAgICAgZWFzaWVyKSwgYnV0IGlzIG5vdCB1c2VmdWwgb3IgYXBwcm9wcmlhdGUgZm9yIGFsbAogICAgICAgICAgICAgICAgcHJvamVjdHMuIFVzZSB0aGUgZGlyZWN0aXZlLCBhbmQgdGhlIHJlcG9ydCwgaG93ZXZlcgogICAgICAgICAgICAgICAgeW91ciBwcm9qZWN0IGRlZW1zIGFwcHJvcHJpYXRlIGFuZCB1c2VmdWwuCiAgICAgICAgICAgIDwvZGQ+CiAgICAgICAgICAgIDxkdD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InJlcG9ydHMvZmVhdHVyZURpcmVjdG9yeUxlbmd0aHMuaHRtbCI+RmVhdHVyZQogICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBMZW5ndGhzPC9hPgogICAgICAgICAgICA8L2R0PgogICAgICAgICAgICA8ZGQ+VGhpcyBpcyBhbiBleHBsb3JhdG9yeSByZXBvcnQgb2YgdGhlIGxlbmd0aCBvZgogICAgICAgICAgICAgICAgZmVhdHVyZSBkaXJlY3RvcmllcyBsZW5ndGgsIGlmIGZlYXR1cmUgd2FzIGluc3RhbGxlZCwKICAgICAgICAgICAgICAgIChub3QgaW5jbHVkaW5nIHRoZSAuLi4vZWNsaXBzZS9mZWF0dXJlcyBwYXJ0IG9mIG5hbWUpLgogICAgICAgICAgICAgICAgSXRzIHB1cnBvc2UgaXQgdG8gYWxlcnQgdGhlIGludGVyZXN0ZWQgb2YgZXhjZXB0aW9uYWxseQogICAgICAgICAgICAgICAgbG9uZyBmZWF0dXJlIG5hbWVzLCB3aGljaCBtaWdodCBjYXVzZSBzb21lIGlzc3VlcyBvbgogICAgICAgICAgICAgICAgc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gVGhpcyByZXBvcnQgaXMgZXhwbG9yYXRvcnksCiAgICAgICAgICAgICAgICBzaW5jZSBpdCBpcyB1bmNsZWFyIHdoYXQsIGlmIGFueSwgc2hvdWxkIGJlIGNvbnNpZGVyZWQKICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxlbmd0aCwgd2hpY2ggZGVwZW5kcyBvbiBtYW55IGZhY3RvcnMuIEJ1dAogICAgICAgICAgICAgICAgLi4uIGlmIHlvdSBhcmUgY3JlYXRpbmcgbmV3IGZlYXR1cmVzLCBpdCdkIGJlIGJlc3Qgbm90CiAgICAgICAgICAgICAgICB0byBleGNlZWQgdGhlIHR5cGljYWwgc2l6ZXMuPC9kZD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkdD5TaWduZWQgYnVuZGxlcyBleGNlcHRpb25zPC9kdD4KICAgICAgICAgICAgPGRkPihwZW5kaW5nKTwvZGQ+CiAgICAgICAgICAgIDxkdD5Db3JyZWN0bHkgc2lnbmVkIGJ1bmRsZXM8L2R0PgogICAgICAgICAgICA8ZGQ+KHBlbmRpbmcpPC9kZD4KICAgICAgICA8L2RsPgogICAgPC9kaXY+CjwvYm9keT4KPC9odG1sPlBLAwQKAAAIAADtjAk/P04PD0gCAABIAgAAHQAAAHRlbXBsYXRlRmlsZXMvbm92YUZvb3Rlci5odG1sPC9kaXY+PGJyIHN0eWxlPSJjbGVhcjpib3RoO2hlaWdodDoxZW07Ii8+Jm5ic3A7PC9kaXY+PGRpdiBpZD0iY2xlYXJGb290ZXIiPjwvZGl2PjxkaXYgaWQ9ImZvb3RlciI+PHVsIGlkPSJmb290ZXJuYXYiPgo8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPkhvbWU8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9wcml2YWN5LnBocCI+UHJpdmFjeSBQb2xpY3k8L2E+PC9saT4KPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvdGVybXNvZnVzZS5waHAiPlRlcm1zIG9mIFVzZTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsLyI+TGVnYWw8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZm91bmRhdGlvbi9jb250YWN0LnBocCI+Q29udGFjdCBVczwvYT48L2xpPgo8L3VsPjxzcGFuIGlkPSJjb3B5cmlnaHQiPkNvcHlyaWdodCAmY29weTsgMjAxMCBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLjwvc3Bhbj48L2Rpdj48L2Rpdj4JCQpQSwMECgAACAAA7YwJPx/smfNqEAAAahAAAB0AAAB0ZW1wbGF0ZUZpbGVzL25vdmFIZWFkZXIuaHRtbDxoZWFkPgo8dGl0bGU+VGl0bGU8L3RpdGxlPjxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU3VzYW4gSXdhaSwgRGVuaXMgUm95IiAvPgo8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iZWNsaXBzZSIgLz4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iL2VjbGlwc2Uub3JnLWNvbW1vbi95dWkvMi42LjAvYnVpbGQvcmVzZXQtZm9udHMtZ3JpZHMvcmVzZXQtZm9udHMtZ3JpZHMuY3NzIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZWNsaXBzZS5vcmctY29tbW9uL3l1aS8yLjYuMC9idWlsZC9tZW51L2Fzc2V0cy9za2lucy9zYW0vbWVudS5jc3MiIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9lY2xpcHNlLm9yZy1jb21tb24vdGhlbWVzL05vdmEvY3NzL3Jlc2V0LmNzcyIvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZWNsaXBzZS5vcmctY29tbW9uL3RoZW1lcy9Ob3ZhL2Nzcy9sYXlvdXQuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZWNsaXBzZS5vcmctY29tbW9uL3RoZW1lcy9Ob3ZhL2Nzcy9oZWFkZXIuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZWNsaXBzZS5vcmctY29tbW9uL3RoZW1lcy9Ob3ZhL2Nzcy9mb290ZXIuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvZWNsaXBzZS5vcmctY29tbW9uL3RoZW1lcy9Ob3ZhL2Nzcy92aXN1YWwuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgo8IS0tW2lmIElFXT4gCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9lY2xpcHNlLm9yZy1jb21tb24vdGhlbWVzL05vdmEvY3NzL2llX3N0eWxlLmNzcyIgbWVkaWE9InNjcmVlbiIvPiA8IVtlbmRpZl0tLT4KPCEtLVtpZiBJRSA2XT4gCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9lY2xpcHNlLm9yZy1jb21tb24vdGhlbWVzL05vdmEvY3NzL2llNl9zdHlsZS5jc3MiIG1lZGlhPSJzY3JlZW4iLz4gPCFbZW5kaWZdLS0+CjwvaGVhZD48Ym9keT4KCTxkaXYgaWQ9Im5vdmFXcmFwcGVyIj4KCQk8ZGl2IGlkPSJjbGVhckhlYWRlciI+CgkJCTxkaXYgaWQ9ImxvZ28iPjxpbWcgc3JjPSIvZWNsaXBzZS5vcmctY29tbW9uL3RoZW1lcy9Ob3ZhL2ltYWdlcy9lY2xpcHNlLnBuZyIgYWx0PSJFY2xpcHNlLm9yZyIvPjwvZGl2PgoJCQk8ZGl2IGlkPSJvdGhlclNpdGVzIj4KCQkJCTxkaXYgaWQ9InNpdGVzIj4KCQkJCTx1bCBpZD0ic2l0ZXNVTCI+CjxsaT48YSBocmVmPSdodHRwOi8vbWFya2V0cGxhY2UuZWNsaXBzZS5vcmcnPjxpbWcgYWx0PSJFY2xpcHNlIE1hcmtldHBsYWNlIiBzcmM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvY3VzdG9tX2ljb25zL25ldHdvcmstd2lyZWQtYncucG5nIi8+Jm5ic3A7PGRpdj5FY2xpcHNlIE1hcmtldHBsYWNlPC9kaXY+PC9hPjwvbGk+CjxsaT48YSBocmVmPSdodHRwOi8vbGl2ZS5lY2xpcHNlLm9yZyc+PGltZyBhbHQ9IkVjbGlwc2UgTGl2ZSIgc3JjPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2N1c3RvbV9pY29ucy9hdWRpby1pbnB1dC1taWNyb3Bob25lLWJ3LnBuZyIvPiZuYnNwOzxkaXY+RWNsaXBzZSBMaXZlPC9kaXY+PC9hPjwvbGk+CjxsaT48YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy8nPjxpbWcgYWx0PSJCdWd6aWxsYSIgc3JjPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2N1c3RvbV9pY29ucy9zeXN0ZW0tc2VhcmNoLWJ3LnBuZyIvPiZuYnNwOzxkaXY+QnVnemlsbGE8L2Rpdj48L2E+PC9saT4KPGxpPjxhIGhyZWY9J2h0dHA6Ly93d3cucGxhbmV0ZWNsaXBzZS5vcmcvJz48aW1nIGFsdD0iUGxhbmV0IEVjbGlwc2UiIHNyYz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9sYXJnZV9pY29ucy9kZXZpY2VzL2F1ZGlvLWNhcmQucG5nIi8+Jm5ic3A7PGRpdj5QbGFuZXQgRWNsaXBzZTwvZGl2PjwvYT48L2xpPgo8bGk+PGEgaHJlZj0naHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvJz48aW1nIGFsdD0iRWNsaXBzZSBXaWtpIiBzcmM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvY3VzdG9tX2ljb25zL2FjY2Vzc29yaWVzLXRleHQtZWRpdG9yLWJ3LnBuZyIvPiZuYnNwOzxkaXY+RWNsaXBzZSBXaWtpPC9kaXY+PC9hPjwvbGk+CjxsaT48YSBocmVmPSdodHRwOi8vcG9ydGFsLmVjbGlwc2Uub3JnJz48aW1nIGFsdD0iTXlGb3VuZGF0aW9uIFBvcnRhbCIgc3JjPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2N1c3RvbV9pY29ucy9wcmVmZXJlbmNlcy1zeXN0ZW0tbmV0d29yay1wcm94eS1idy5wbmciLz48ZGl2Pk15IEZvdW5kYXRpb24gUG9ydGFsPC9kaXY+PC9hPjwvbGk+CjwvdWw+CgkJICAgIAk8L2Rpdj48L2Rpdj48L2Rpdj4KCQk8ZGl2IGlkPSJoZWFkZXIiPgkJCQoJCQk8ZGl2IGlkPSJtZW51Ij4KCQkJPHVsPgo8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iIHRhcmdldD0iX3NlbGYiPkhvbWU8L2E+PC9saT4gCjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VzZXJzLyIgdGFyZ2V0PSJfc2VsZiI+VXNlcnM8L2E+PC9saT4gCjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL21lbWJlcnNoaXAvIiB0YXJnZXQ9Il9zZWxmIj5NZW1iZXJzPC9hPjwvbGk+IAo8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9jb21taXR0ZXJzLyIgdGFyZ2V0PSJfc2VsZiI+Q29tbWl0dGVyczwvYT48L2xpPiAKPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzLyIgdGFyZ2V0PSJfc2VsZiI+RG93bmxvYWRzPC9hPjwvbGk+IAo8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9yZXNvdXJjZXMvIiB0YXJnZXQ9Il9zZWxmIj5SZXNvdXJjZXM8L2E+PC9saT4gCjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3Byb2plY3RzLyIgdGFyZ2V0PSJfc2VsZiI+UHJvamVjdHM8L2E+PC9saT4gCjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy8iIHRhcmdldD0iX3NlbGYiPkFib3V0IFVzPC9hPjwvbGk+IAoJCQk8L3VsPgoJCQk8L2Rpdj48ZGl2IGlkPSJzZWFyY2giPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jc2UiIGlkPSJzZWFyY2hib3hfMDE3OTQxMzM0ODkzNzkzNDEzNzAzOnNxZnJkdGQxMTJzIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY3giIHZhbHVlPSIwMTc5NDEzMzQ4OTM3OTM0MTM3MDM6c3FmcmR0ZDExMnMiIC8+CjxpbnB1dCBpZD0ic2VhcmNoQm94IiB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBzaXplPSIyNSIgLz4KPGlucHV0IGlkPSJzZWFyY2hCdXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0ic2EiIHZhbHVlPSJTZWFyY2giIC8+CjwvZm9ybT48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vY29vcC9jc2UvYnJhbmQ/Zm9ybT1zZWFyY2hib3hfMDE3OTQxMzM0ODkzNzkzNDEzNzAzJTNBc3FmcmR0ZDExMnMmbGFuZz1lbiI+PC9zY3JpcHQ+CgkJCTwvZGl2PjwvZGl2PgoJPHN0eWxlPgoJcHJlIHsgcGFkZGluZy1sZWZ0OiAxNXB4OyBwYWRkaW5nLWJvdHRvbTogMTVweDsgd2lkdGg6IDk4JTt9CglwIHsgcGFkZGluZy1sZWZ0OiAxNXB4OyB3aWR0aDogOTglO30KCTwvc3R5bGU+Cgk8ZGl2IGlkPSJub3ZhQ29udGVudCI+Cgk8ZGl2IGlkPSJmdWxsY29sdW1uIj4KCTxoMSBzdHlsZT0icGFkZGluZy1sZWZ0OiAxNXB4OyI+UGFnZSBUaXRsZTwvaDE+Cgk8cD5BbGwgZG93bmxvYWRzIGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5waHAiIHRhcmdldD0iX3RvcCI+RWNsaXBzZSBGb3VuZGF0aW9uIApTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvYT4gdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIDwvcD4KUEsDBAoAAAgAAGeqCT/GXz3YdgAAAHYAAAAfAAAAT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmp1bm8udGVzdHMKQnVuZGxlLU5hbWUgPSBSZWxlbmcgVGVzdHMgZm9yIEp1bm8gUmVsZWFzZQpCdW5kbGUtVmVuZG9yID0gRWNsaXBzZSBTaW1SZWxQSwMECgAACAAAGRtEQAqhvop7EQAAexEAAAkAAAB2ZXJpZnkuc2gjIS91c3IvYmluL2VudiBiYXNoCgppZiBbWyAkIyAhPSAxIF1dIAp0aGVuCiAgICBwcmludGYgIlx0RVJST1I6IHRoaXMgc2NyaXB0LCAiJHswIyMqL30iLCByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudDsgdGhlIG5hbWUgb3IgcGF0aCBvZiBqYXIgb3IgamFyLnBhY2suZ3ogZmlsZS5cbiIgPiYyCiAgICBleGl0IDEKZmkKCmlmIFtbIC16ICRWRVJJRllPVVRESVIgXV0gCnRoZW4KICAgIHByaW50ZiAiXHRFUlJPUjogdGhpcyBzY3JpcHQsICIkezAjIyovfSIsIHJlcXVpcmVzIFZFUklGWU9VVERJUiB0byBiZSBkZWZpbmVkLlxuIiA+JjIKICAgIGV4aXQgMQpmaQoKCgpmaWxlbmFtZT0iJHsxfSIKCmlmIFsgISAtZSAiJHtmaWxlbmFtZX0iIF0KdGhlbgogICAgcHJpbnRmICJcdEVSUk9SOiBmaWxlIGRvZXMgbm90IGV4aXN0OiIgIiR7ZmlsZW5hbWV9XG4iID4mMgogICAgZXhpdCAxCmZpCgpqYXJuYW1lPSQoYmFzZW5hbWUgIiR7ZmlsZW5hbWV9IikKCiMgbW9zdCB1c2VycyBuZWVkIG9ubHkgb25lLCBKYXZhIDUgb3IgSmF2YSA2LCBidXQgc29tZXRpbWVzIG1heSB3YW50IHRvIAojIGNoYW5nZSBKQVZBX0hPTUUsIGJlbG93LCB0byBzd2l0Y2ggYmFjayBhbmQgZm9ydGguCiMgVXNlIEpBVkEgNSB0byBlbnN1cmUgcGFjay5neiBmaWxlcyBjYW4gYmUgdW5wYWNrZWQgKGluc3RhbGxlZCkgd2l0aCBKQVZBIDUuIAojIFNvbWUgcGFjay5neiBmaWxlcyBjYW4gbm90IGJlIHVucGFja2VkIHdpdGggSmF2YSA2IChpbiBTaW1SZWwgcmVwb3NpdG9yaWVzKSwgCiMgc28gdXNlIEpBVkEgNiBpZiB5b3UgZG8gbm90IGNhcmUgKGkuZS4geW91ciB1c2UgY2FzZXMgYWxsIHVzZSBKQVZBIDYpCiMgdG8gYXZvaWQgdGhlIGVycm9yIG1lc3NhZ2VzLgojSkFWQV81X0hPTUU9L2hvbWUvc2hhcmVkL3dlYnRvb2xzL2FwcHMvaWJtLWphdmEyLWkzODYtNTAxMQojSkFWQV81X0hPTUU9L3NoYXJlZC9jb21tb24vamRrLTEuNS4wLTIyLng4Nl82NC8KI0pBVkFfNl9IT01FPS9ob21lL3NoYXJlZC93ZWJ0b29scy9hcHBzL2libS1qYXZhLWkzODYtNjA4CiNKQVZBXzZfSE9NRT0vc2hhcmVkL2NvbW1vbi9qZGstMS42Lng4Nl82NC8KCiMgV2UgYWx3YXlzIHNldCBKQVZBX0hPTUUgZXhwbGljaXRseSB0byB3aGF0IHdlIHdhbnQsIHNpbmNlIG9uIG1hbnkgc3lzdGVtcywgCiMgaXMgaXQgc2V0IHRvIHNvbWUgSlJFIHRoYXQgd291bGQgbm90IHN1ZmZpY2UuIAojSkFWQV9IT01FPSR7SkFWQV82X0hPTUV9CgojIFRPRE86IHRoaXMgZmlsZSBtYXkgYmUgd3JpdHRlbiBodW5kcmVkcyBvZiB0aW1lcywgYnV0IGltcG9ydGFudCB0byBoYXZlIHJlY29yZCwgCiMgdG8gd2UnbGwgaW1wcm92ZSBsb2dnaW5nIGxhdGVyLgplY2hvICJKQVZBX0hPTUU6ICR7SkFWQV9IT01FfSIgPiAiJHtWRVJJRllPVVRESVJ9Ii9pbmZvLnR4dAplY2hvICJ2ZXJpZnkgc2NyaXB0OiAkezB9IiA+PiAiJHtWRVJJRllPVVRESVJ9Ii9pbmZvLnR4dAoKCmlmIFsgISAtZSAiJHtKQVZBX0hPTUV9IiBdCnRoZW4KICAgIHByaW50ZiAiXHRFUlJPUjogdGhpcyBzY3JpcHQsICIkezAjIyovfSIsIHJlcXVpcmVzIEpBVkFfSE9NRSB0byBiZSBkZWZpbmVkIGFuZCBleGlzdC5cbiIgPiYyCiAgICBleGl0IDEKZmkKClVOUEFDSzIwMF9FWEU9JEpBVkFfSE9NRS9qcmUvYmluL3VucGFjazIwMApWRVJJRllfRVhFPSRKQVZBX0hPTUUvYmluL2phcnNpZ25lcgoKICAgIFZFUklGSUVEX09VVEZJTEU9IiR7VkVSSUZZT1VURElSfSIvdmVyaWZpZWQudHh0CiAgICBLTk9XTl9FWENFUFRJT049IiR7VkVSSUZZT1VURElSfSIva25vd251bnNpZ25lZC50eHQKICAgIFVOU0lHTkVEX09VVEZJTEU9IiR7VkVSSUZZT1VURElSfSIvdW5zaWduZWQudHh0CiAgICBOT01BTklGRVNUPSIke1ZFUklGWU9VVERJUn0iL25vbWFuaWZlc3QudHh0CiAgICBFUlJPUl9FWElUX0ZJTEU9IiR7VkVSSUZZT1VURElSfSIvZXJyb3IudHh0CgpQUEFUX1BBQ0tHWj0iKC4qKS5wYWNrLmd6JCIKaWYgW1sgIiRqYXJuYW1lIiA9fiAgJFBQQVRfUEFDS0daIF1dCnRoZW4gCiAgICBiYXNlamFybmFtZT0ke0JBU0hfUkVNQVRDSFsxXX0KICAgICNlY2hvIC1lICJcbiBiYXNlamFybmFtZTogIiAkYmFzZWphcm5hbWUgIlxuIgogICAgIiR7VU5QQUNLMjAwX0VYRX0iICRmaWxlbmFtZSAvdG1wLyRiYXNlamFybmFtZQogICAgdnJlc3VsdD1gIiR7VkVSSUZZX0VYRX0iIC12ZXJpZnkgL3RtcC8kYmFzZWphcm5hbWVgCiAgICBleGl0Y29kZT0kPwogICAgcm0gL3RtcC8kYmFzZWphcm5hbWUKZWxzZQogICAgdnJlc3VsdD1gIiR7VkVSSUZZX0VYRX0iIC12ZXJpZnkgJGZpbGVuYW1lYAogICAgZXhpdGNvZGU9JD8KZmkKCiMgamFyc2lnbmVyIHNvbWV0aW1lcyByZXR1cm5zIG9uZSBsaW5lLCBzb21ldGltZXMgdHdvIC4uLiB3ZSB0YWtlIAojIG91dCBFT0xzIHRvIHByaW50IGNvbXBhY3RseQp2cmVzdWx0PWBlY2hvICIke3ZyZXN1bHR9IiB8IHRyICdcbicgJyAnYAoKIyBrbm93biByZXNwb25zZSBwYXR0ZXJucyBmcm9tIGphcnNpZ25lcgpQUEFUX1ZFUklGSUVEPSJeamFyXCB2ZXJpZmllZC4qIgojIG5vIG1hbmlmZXN0IGlzIG5vdCBzaWduZWQgZm9yIG91ciBwdXJwb3NlcyAuLi4gb2NjdXJzIGEgbG90IGZvciB1bnNpZ25lZCBmZWF0dXJlIGphcnMKUFBBVF9VTlNJR05FRF9PUl9OT01BTklGRVNUPSJeKGphciBpcyB1bnNpZ25lZCl8KG5vIG1hbmlmZXN0KS4qIgojIGRvIG5vdCBjdXJyZW50bHkgdXNlIHVuc2lnbmVkIG9yIG5vIG1hbmlmZXN0IChieSB0aGVtc2VsdmVzKSAKIyBub3IgImNvcHkgbW9kZSIgLi4uIGNvcHkgbW9kZSBwcmludGVkIHRvIHN0ZG91dCBieSB1bnBhY2syMDAKI1BQQVRfVU5TSUdORUQ9Il5qYXIgaXMgdW5zaWduZWQuKiIKI1BQQVRfTk9NQU5JRkVTVD0iXm5vIG1hbmlmZXN0LioiCiNQUEFUX0NPUFlNT0RFPSJeQ29weS1tb2RlXC4uKiIKCmlmIFtbICIke3ZyZXN1bHR9IiA9fiAkUFBBVF9WRVJJRklFRCBdXQp0aGVuCiAgICBwcmludGYgJyUtODBzIFx0XHQnICIgICAke2phcm5hbWV9OiAiID4+ICIke1ZFUklGSUVEX09VVEZJTEV9IiAKICAgIHByaW50ZiAnJXNcbicgIiAke3ZyZXN1bHR9ICIgPj4gIiR7VkVSSUZJRURfT1VURklMRX0iCmVsaWYgW1sgIiR7dnJlc3VsdH0iID1+ICRQUEFUX1VOU0lHTkVEX09SX05PTUFOSUZFU1QgXV0KdGhlbgoKICAgICMgbGlzdCAia25vd24gY2FzZXMiLCB0aGF0IGNhbiBub3QgYmUgc2lnbmVkLCAKICAgICMgaW4gdGhlaXIgb3duICJrbm93biBleGNlcHRpb24gZmlsZSIsIGVsc2UgbGlzdCBpbiAidW5zaWduZWQiIGZpbGUuCgogICAgIyBGb3IgcmVhc29ucyBvZiBhZGRpdGlvbiBvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5iYXRjaCBzZWUKICAgICMgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NjM4MgogICAgIyBGb3Igc21hbGwgcG9pbnRlciBhYm91dCBjb21tb25qLnNkbywgc2VlCiAgICAjIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY5OTkKICAgIFBQQVRfS05PV05fVU5TSUdORUQ9JyhvcmdcLmVjbGlwc2VcLmpkdFwuY29yZVwuY29tcGlsZXJcLmJhdGNoLiopfChj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Y2xpcHNlL2p1bm8vdGVzdHMvamFycy9CUkVFVGVzdC5qYXZhUEsBAgoACgAACAAAj7VHQHZwqrLqIAAA6iAAACgAAAAAAAAAAAAAAAAAYMsAAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9FU1Rlc3QuY2xhc3NQSwECCgAKAAAIAACZGkRAIwXm8jAlAAAwJQAAJwAAAAAAAAAAAAAAAACQ7AAAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL0VTVGVzdC5qYXZhUEsBAgoACgAACAAAj7VHQGN9+ZrjRgAA40YAADAAAAAAAAAAAAAAAAAABRIBAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0TGF5b3V0VGVzdC5jbGFzc1BLAQIKAAoAAAgAAJkaREDemTsuGWIAABliAAAvAAAAAAAAAAAAAAAAADZZAQBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QuamF2YVBLAQIKAAoAAAgAAI+1R0ArozNGQBwAAEAcAAAtAAAAAAAAAAAAAAAAAJy7AQBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvUGFjazIwMFRlc3QuY2xhc3NQSwECCgAKAAAIAACZGkRAuHC9W7EiAACxIgAALAAAAAAAAAAAAAAAAAAn2AEAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0LmphdmFQSwECCgAKAAAIAACPtUdAMLoz3sIVAADCFQAALQAAAAAAAAAAAAAAAAAi+wEAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL1ZlcnNpb25UZXN0LmNsYXNzUEsBAgoACgAACAAAmRpEQBrqWxQoGQAAKBkAACwAAAAAAAAAAAAAAAAALxECAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9WZXJzaW9uVGVzdC5qYXZhUEsBAgoACgAACAAAj7VHQEXieG31CgAA9QoAACoAAAAAAAAAAAAAAAAAoSoCAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvamFycy9UZXN0SmFycy5jbGFzc1BLAQIKAAoAAAgAAJkaREBBuYBPIA4AACAOAAApAAAAAAAAAAAAAAAAAN41AgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvVGVzdEphcnMuamF2YVBLAQIKAAoAAAgAAFqpCT/HL+5u/wMAAP8DAAAtAAAAAAAAAAAAAAAAAEVEAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvY29uZmlnLnByb3BlcnRpZXNQSwECCgAKAAAIAABaqQk/ToF6UXQHAAB0BwAAMQAAAAAAAAAAAAAAAACPSAIAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9qYXJzL2NvbmZpZ0hPTEQucHJvcGVydGllc1BLAQIKAAoAAAgAAFqpCT/tt5302AMAANgDAAAxAAAAAAAAAAAAAAAAAFJQAgBvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL2phcnMvZXhjZXB0aW9ucy5wcm9wZXJ0aWVzUEsBAgoACgAACAAAj7VHQBVfTDYkJAAAJCQAADIAAAAAAAAAAAAAAAAAeVQCAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nLmNsYXNzUEsBAgoACgAACAAAWqkJP15iLNGlLQAApS0AADEAAAAAAAAAAAAAAAAA7XgCAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVmVyc2lvbkNoZWNraW5nLmphdmFQSwECCgAKAAAIAACPtUdAvlVfhVYZAABWGQAAMAAAAAAAAAAAAAAAAADhpgIAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmNsYXNzUEsBAgoACgAACAAAWqkJP0qmn2amIwAApiMAAC8AAAAAAAAAAAAAAAAAhcACAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlci5qYXZhUEsBAgoACgAACAAAj7VHQDsM1y5CGwAAQhsAADUAAAAAAAAAAAAAAAAAeOQCAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzLmNsYXNzUEsBAgoACgAACAAAZ6oJP2DQoB9XFwAAVxcAADQAAAAAAAAAAAAAAAAADQADAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzLmphdmFQSwECCgAKAAAIAACPtUdA4D/bXgQbAAAEGwAANgAAAAAAAAAAAAAAAAC2FwMAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyLmNsYXNzUEsBAgoACgAACAAAWqkJP/lb4Ku9HQAAvR0AADUAAAAAAAAAAAAAAAAADjMDAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvUHJvdmlkZXJOYW1lQ2hlY2tlci5qYXZhUEsBAgoACgAACAAAjLZHQG6770wjPgAAIz4AAEAAAAAAAAAAAAAAAAAAHlEDAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuY2xhc3NQSwECCgAKAAAIAACMtkdAh02EiaNBAACjQQAAPwAAAAAAAAAAAAAAAACfjwMAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlci5qYXZhUEsBAgoACgAACAAAj7VHQEVVUvIMHgAADB4AACsAAAAAAAAAAAAAAAAAn9EDAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3MvVGVzdFJlcG8uY2xhc3NQSwECCgAKAAAIAAA0q0dAR4/pezEcAAAxHAAAKgAAAAAAAAAAAAAAAAD07wMAb3JnL2VjbGlwc2UvanVuby90ZXN0cy9yZXBvcy9UZXN0UmVwby5qYXZhUEsBAgoACgAACAAAWqkJP8hlmLiHPwAAhz8AADgAAAAAAAAAAAAAAAAAbQwEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvcmVwb3Mvc3RhbmRhcmRMaWNlbnNlcy5wcm9wZXJ0aWVzUEsBAgoACgAACAAAj7VHQDA2lDBSBQAAUgUAADgAAAAAAAAAAAAAAAAASkwEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmNsYXNzUEsBAgoACgAACAAAWqkJP+clrJNSBAAAUgQAADcAAAAAAAAAAAAAAAAA8lEEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmphdmFQSwECCgAKAAAIAACPtUdATYjsbvQDAAD0AwAAOQAAAAAAAAAAAAAAAACZVgQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9TdHJpbmdMZW5ndGhDb21wYXJhdG9yLmNsYXNzUEsBAgoACgAACAAAWqkJPzC+6ZU+AgAAPgIAADgAAAAAAAAAAAAAAAAA5FoEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5qYXZhUEsBAgoACgAACAAAj7VHQD5hQdgbBAAAGwQAADEAAAAAAAAAAAAAAAAAeF0EAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IuY2xhc3NQSwECCgAKAAAIAABaqQk/3uxJgUoCAABKAgAAMAAAAAAAAAAAAAAAAADiYQQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvci5qYXZhUEsBAgoACgAACAAAj7VHQHXLlES2AgAAtgIAADcAAAAAAAAAAAAAAAAAemQEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuY2xhc3NQSwECCgAKAAAIAABaqQk/js/0QVEBAABRAQAANgAAAAAAAAAAAAAAAACFZwQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlci5qYXZhUEsBAgoACgAACAAAj7VHQH06SRZeBQAAXgUAADwAAAAAAAAAAAAAAAAAKmkEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSVVQcm92aWRlckFuZElkQ29tcGFyYXRvci5jbGFzc1BLAQIKAAoAAAgAAFqpCT+qo3eyVgQAAFYEAAA7AAAAAAAAAAAAAAAAAOJuBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAgAAI+1R0D6mKNVngIAAJ4CAAA0AAAAAAAAAAAAAAAAAJFzBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyLmNsYXNzUEsBAgoACgAACAAAWqkJPxr5Etk4AQAAOAEAADMAAAAAAAAAAAAAAAAAgXYEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIuamF2YVBLAQIKAAoAAAgAAI+1R0AIwjCY1AkAANQJAAAvAAAAAAAAAAAAAAAAAAp4BABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlci5jbGFzc1BLAQIKAAoAAAgAAFqpCT/7KQBoDgcAAA4HAAAuAAAAAAAAAAAAAAAAACuCBABvcmcvZWNsaXBzZS9qdW5vL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlci5qYXZhUEsBAgoACgAACAAAj7VHQA/WOKD6BwAA+gcAADQAAAAAAAAAAAAAAAAAhYkEAG9yZy9lY2xpcHNlL2p1bm8vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuY2xhc3NQSwECCgAKAAAIAABaqQk/CZx0bmQKAABkCgAAMwAAAAAAAAAAAAAAAADRkQQAb3JnL2VjbGlwc2UvanVuby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlci5qYXZhUEsBAgoACgAACAAA7YwJP43P6VGWBQAAlgUAAAoAAAAAAAAAAAAAAAAAhpwEAGFib3V0Lmh0bWxQSwECCgAKAAAIAABaqQk/64RjcUwBAABMAQAACgAAAAAAAAAAAAAAAABEogQAcGx1Z2luLnhtbFBLAQIKAAoAAAgAAO2MCT/2E0FdYwAAAGMAAAAGAAAAAAAAAAAAAAAAALijBABhbnQuc2hQSwECCgAKAAAIAABnqgk/LpR33vkBAAD5AQAAEwAAAAAAAAAAAAAAAAA/pAQAaW52b2tlQW50UnVubmVyLnhtbFBLAQIKAAoAAAgAAPBhCj/zs7jWlQwAAJUMAAARAAAAAAAAAAAAAAAAAGmmBABnZXRSZWxlbmdUZXN0cy5zaFBLAQIKAAoAAAgAAO2MCT/z0ziaEAUAABAFAAAfAAAAAAAAAAAAAAAAAC2zBAB0ZW1wbGF0ZUZpbGVzL2luZGV4UGVuZGluZy5odG1sUEsBAgoACgAACAAA7YwJP2Ugqe0vLwAALy8AABwAAAAAAAAAAAAAAAAAergEAHRlbXBsYXRlRmlsZXMvaW5kZXhtYWluLmh0bWxQSwECCgAKAAAIAADtjAk/USu/XrktAAC5LQAAIwAAAAAAAAAAAAAAAADj5wQAdGVtcGxhdGVGaWxlcy9pbmRleG1haW5wcmVzaWduLmh0bWxQSwECCgAKAAAIAADtjAk/P04PD0gCAABIAgAAHQAAAAAAAAAAAAAAAADdFQUAdGVtcGxhdGVGaWxlcy9ub3ZhRm9vdGVyLmh0bWxQSwECCgAKAAAIAADtjAk/H+yZ82oQAABqEAAAHQAAAAAAAAAAAAAAAABgGAUAdGVtcGxhdGVGaWxlcy9ub3ZhSGVhZGVyLmh0bWxQSwECCgAKAAAIAABnqgk/xl892HYAAAB2AAAAHwAAAAAAAAAAAAAAAAAFKQUAT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllc1BLAQIKAAoAAAgAABkbREAKob6KexEAAHsRAAAJAAAAAAAAAAAAAAAAALgpBQB2ZXJpZnkuc2hQSwUGAAAAAEIAQgCoFgAAWjsFAAAA