ZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvY29uZmlnLmpzb24gYi9kb2NzL2VuLzEuMi4wL2NvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGE5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL2NvbmZpZy5qc29uCkBAIC0wLDAgKzEsMTY3IEBACit7CisgICAgImxhbmd1YWdlIjogIkVuZ2xpc2giLAorICAgICJtZXJnZSI6IHsKKyAgICAgICAgImFjY2VsZXJvbWV0ZXIubWQiOiBbCisgICAgICAgICAgICAicGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIuZ2V0Q3VycmVudEFjY2VsZXJhdGlvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaC5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyYXRpb24vYWNjZWxlcmF0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9hY2NlbGVyb21ldGVyL3BhcmFtZXRlcnMvYWNjZWxlcm9tZXRlclN1Y2Nlc3MubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2FjY2VsZXJvbWV0ZXIvcGFyYW1ldGVycy9hY2NlbGVyb21ldGVyRXJyb3IubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2FjY2VsZXJvbWV0ZXIvcGFyYW1ldGVycy9hY2NlbGVyb21ldGVyT3B0aW9ucy5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgImNhbWVyYS5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9jYW1lcmEvY2FtZXJhLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jYW1lcmEvY2FtZXJhLmdldFBpY3R1cmUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NhbWVyYS9wYXJhbWV0ZXIvY2FtZXJhU3VjY2Vzcy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFFcnJvci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFPcHRpb25zLm1kIgorICAgICAgICBdLAorICAgICAgICAiY2FwdHVyZS5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUF1ZGlvLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVBdWRpb09wdGlvbnMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUltYWdlLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVJbWFnZU9wdGlvbnMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZVZpZGVvLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVWaWRlb09wdGlvbnMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvQ2FwdHVyZUVycm9yLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9jYXB0dXJlL0NhcHR1cmVDQi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9DYXB0dXJlRXJyb3JDQi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9Db25maWd1cmF0aW9uRGF0YS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9NZWRpYUZpbGUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvTWVkaWFGaWxlLmdldEZvcm1hdERhdGEubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL2NhcHR1cmUvTWVkaWFGaWxlRGF0YS5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgImNvbXBhc3MubWQiOiBbCisgICAgICAgICAgICAicGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb21wYXNzL2NvbXBhc3MuZ2V0Q3VycmVudEhlYWRpbmcubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbXBhc3MvY29tcGFzcy53YXRjaEhlYWRpbmcubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbXBhc3MvY29tcGFzcy5jbGVhcldhdGNoLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb21wYXNzL2NvbXBhc3Mud2F0Y2hIZWFkaW5nRmlsdGVyLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb21wYXNzL2NvbXBhc3MuY2xlYXJXYXRjaEZpbHRlci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NTdWNjZXNzLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc0Vycm9yLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc09wdGlvbnMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbXBhc3MvcGFyYW1ldGVycy9jb21wYXNzSGVhZGluZy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29tcGFzcy9jb21wYXNzRXJyb3IvY29tcGFzc0Vycm9yLm1kIgorICAgICAgICBdLAorICAgICAgICAiY29udGFjdHMubWQiOiBbCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbnRhY3RzL2NvbnRhY3RzLmNyZWF0ZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMuZmluZC5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvQ29udGFjdC9jb250YWN0Lm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb250YWN0cy9Db250YWN0QWRkcmVzcy9jb250YWN0YWRkcmVzcy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEZpZWxkL2NvbnRhY3RmaWVsZC5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEZpbmRPcHRpb25zL2NvbnRhY3RmaW5kb3B0aW9ucy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvQ29udGFjdE5hbWUvY29udGFjdG5hbWUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RPcmdhbml6YXRpb24vY29udGFjdG9yZ2FuaXphdGlvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEVycm9yL2NvbnRhY3RFcnJvci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0U3VjY2Vzcy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0RXJyb3IubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEZpZWxkcy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0RmluZE9wdGlvbnMubWQiCisgICAgICAgIF0sCisgICAgICAgICJkZXZpY2UubWQiOiBbCisgICAgICAgICAgICAicGhvbmVnYXAvZGV2aWNlL2RldmljZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZGV2aWNlL2RldmljZS5uYW1lLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9kZXZpY2UvZGV2aWNlLnBob25lZ2FwLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9kZXZpY2UvZGV2aWNlLnBsYXRmb3JtLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9kZXZpY2UvZGV2aWNlLnV1aWQubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2RldmljZS9kZXZpY2UudmVyc2lvbi5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgImV2ZW50cy5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLmRldmljZXJlYWR5Lm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLnBhdXNlLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLnJlc3VtZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5vbmxpbmUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2V2ZW50cy9ldmVudHMub2ZmbGluZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5iYWNrYnV0dG9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLm1lbnVidXR0b24ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2V2ZW50cy9ldmVudHMuc2VhcmNoYnV0dG9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLnN0YXJ0Y2FsbGJ1dHRvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5lbmRjYWxsYnV0dG9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ldmVudHMvZXZlbnRzLnZvbHVtZWRvd25idXR0b24ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2V2ZW50cy9ldmVudHMudm9sdW1ldXBidXR0b24ubWQiCisgICAgICAgIF0sCisgICAgICAgICJmaWxlLm1kIjogWworICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZmlsZS9maWxlb2JqL2ZpbGVvYmoubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZXJlYWRlci9maWxlcmVhZGVyLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9maWxlL2ZpbGV3cml0ZXIvZmlsZXdyaXRlci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZmlsZS9maWxlc3lzdGVtL2ZpbGVzeXN0ZW0ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZWVudHJ5L2ZpbGVlbnRyeS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZmlsZS9kaXJlY3RvcnllbnRyeS9kaXJlY3RvcnllbnRyeS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZmlsZS9kaXJlY3RvcnlyZWFkZXIvZGlyZWN0b3J5cmVhZGVyLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9maWxlL2ZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXIubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZXVwbG9hZG9wdGlvbnMvZmlsZXVwbG9hZG9wdGlvbnMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZXVwbG9hZHJlc3VsdC9maWxldXBsb2FkcmVzdWx0Lm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9maWxlL2ZsYWdzL2ZsYWdzLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9maWxlL2xvY2FsZmlsZXN5c3RlbS9sb2NhbGZpbGVzeXN0ZW0ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvbWV0YWRhdGEvbWV0YWRhdGEubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2ZpbGUvZmlsZWVycm9yL2ZpbGVlcnJvci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZmlsZS9maWxldHJhbnNmZXJlcnJvci9maWxldHJhbnNmZXJlcnJvci5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgImdlb2xvY2F0aW9uLm1kIjogWworICAgICAgICAgICAgInBob25lZ2FwL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLmNsZWFyV2F0Y2gubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL2dlb2xvY2F0aW9uL0Nvb3JkaW5hdGVzL2Nvb3JkaW5hdGVzLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9nZW9sb2NhdGlvbi9Qb3NpdGlvbi9wb3NpdGlvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZ2VvbG9jYXRpb24vUG9zaXRpb25FcnJvci9wb3NpdGlvbkVycm9yLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uU3VjY2Vzcy5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvZ2VvbG9jYXRpb24vcGFyYW1ldGVycy9nZW9sb2NhdGlvbkVycm9yLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uLm9wdGlvbnMubWQiCisgICAgICAgIF0sCisgICAgICAgICJtZWRpYS5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9tZWRpYS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9tZWRpYS9tZWRpYS5nZXREdXJhdGlvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvbWVkaWEucGF1c2UubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL21lZGlhLnBsYXkubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL21lZGlhLnJlbGVhc2UubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL21lZGlhLnNlZWtUby5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvbWVkaWEuc3RhcnRSZWNvcmQubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL21lZGlhLnN0b3AubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL21lZGlhLnN0b3BSZWNvcmQubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL21lZGlhL01lZGlhRXJyb3IvbWVkaWFFcnJvci5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbWVkaWEvUGFyYW1ldGVycy9tZWRpYUVycm9yLm1kIgorICAgICAgICBdLAorICAgICAgICAibmV0d29yay5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9uZXR3b3JrL25ldHdvcmsubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL25ldHdvcmsvbmV0d29yay5pc1JlYWNoYWJsZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbmV0d29yay9OZXR3b3JrU3RhdHVzL05ldHdvcmtTdGF0dXMubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL25ldHdvcmsvcGFyYW1ldGVycy9yZWFjaGFibGVDYWxsYmFjay5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbmV0d29yay9wYXJhbWV0ZXJzL3JlYWNoYWJsZUhvc3RuYW1lLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9uZXR3b3JrL3BhcmFtZXRlcnMvcmVhY2hhYmxlT3B0aW9ucy5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgImNvbm5lY3Rpb24ubWQiOiBbCisgICAgICAgICAgICAicGhvbmVnYXAvY29ubmVjdGlvbi9jb25uZWN0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9jb25uZWN0aW9uL2Nvbm5lY3Rpb24udHlwZS5tZCIKKyAgICAgICAgXSwKKyAgICAgICAgIm5vdGlmaWNhdGlvbi5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmFsZXJ0Lm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbmZpcm0ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uYmVlcC5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi52aWJyYXRlLm1kIgorICAgICAgICBdLAorICAgICAgICAic3RvcmFnZS5tZCI6IFsKKyAgICAgICAgICAgICJwaG9uZWdhcC9zdG9yYWdlL3N0b3JhZ2UubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2Uvc3RvcmFnZS5vcGVuZGF0YWJhc2UubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2UvcGFyYW1ldGVycy9uYW1lLm1kIiwKKyAgICAgICAgICAgICJwaG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvdmVyc2lvbi5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL2Rpc3BsYXlfbmFtZS5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL3NpemUubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2UvZGF0YWJhc2UvZGF0YWJhc2UubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2Uvc3FsdHJhbnNhY3Rpb24vc3FsdHJhbnNhY3Rpb24ubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2Uvc3FscmVzdWx0c2V0L3NxbHJlc3VsdHNldC5tZCIsCisgICAgICAgICAgICAicGhvbmVnYXAvc3RvcmFnZS9zcWxyZXN1bHRzZXRsaXN0L3NxbHJlc3VsdHNldGxpc3QubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2Uvc3FsZXJyb3Ivc3FsZXJyb3IubWQiLAorICAgICAgICAgICAgInBob25lZ2FwL3N0b3JhZ2UvbG9jYWxzdG9yYWdlL2xvY2Fsc3RvcmFnZS5tZCIKKyAgICAgICAgXQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvaW5kZXgubWQgYi9kb2NzL2VuLzEuMi4wL2luZGV4Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOWYwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL2luZGV4Lm1kCkBAIC0wLDAgKzEsNjQgQEAKKzxkaXYgaWQ9ImhvbWUiPgorICAgIDxoMT5BUEkgUmVmZXJlbmNlPC9oMT4KKyAgICA8dWw+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxoMj5BY2NlbGVyb21ldGVyPC9oMj4KKyAgICAgICAgICAgIDxzcGFuPlRhcCBpbnRvIHRoZSBkZXZpY2UncyBtb3Rpb24gc2Vuc29yLjwvc3Bhbj4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGgyPkNhbWVyYTwvaDI+CisgICAgICAgICAgICA8c3Bhbj5DYXB0dXJlIGEgcGhvdG8gdXNpbmcgdGhlIGRldmljZSdzIGNhbWVyYS48L3NwYW4+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxoMj5DYXB0dXJlPC9oMj4KKyAgICAgICAgICAgIDxzcGFuPkNhcHR1cmUgbWVkaWEgZmlsZXMgdXNpbmcgZGV2aWNlJ3MgbWVkaWEgY2FwdHVyZSBhcHBsaWNhdGlvbnMuPC9zcGFuPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8aDI+Q29tcGFzczwvaDI+CisgICAgICAgICAgICA8c3Bhbj5PYnRhaW4gdGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBkZXZpY2UgaXMgcG9pbnRpbmcuPC9zcGFuPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8aDI+Q29ubmVjdGlvbjwvaDI+CisgICAgICAgICAgICA8c3Bhbj5RdWlja2x5IGNoZWNrIHRoZSBuZXR3b3JrIHN0YXRlLCBhbmQgY2VsbHVsYXIgbmV0d29yayBpbmZvcm1hdGlvbi48L3NwYW4+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxoMj5Db250YWN0czwvaDI+CisgICAgICAgICAgICA8c3Bhbj5Xb3JrIHdpdGggdGhlIGRldmljZXMgY29udGFjdCBkYXRhYmFzZS48L3NwYW4+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxoMj5EZXZpY2U8L2gyPgorICAgICAgICAgICAgPHNwYW4+R2F0aGVyIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi48L3NwYW4+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxoMj5FdmVudHM8L2gyPgorICAgICAgICAgICAgPHNwYW4+SG9vayBpbnRvIG5hdGl2ZSBldmVudHMgdGhyb3VnaCBKYXZhU2NyaXB0Ljwvc3Bhbj4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGgyPkZpbGU8L2gyPgorICAgICAgICAgICAgPHNwYW4+SG9vayBpbnRvIG5hdGl2ZSBmaWxlIHN5c3RlbSB0aHJvdWdoIEphdmFTY3JpcHQuPC9zcGFuPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8aDI+R2VvbG9jYXRpb248L2gyPgorICAgICAgICAgICAgPHNwYW4+TWFrZSB5b3VyIGFwcGxpY2F0aW9uIGxvY2F0aW9uIGF3YXJlLjwvc3Bhbj4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGgyPk1lZGlhPC9oMj4KKyAgICAgICAgICAgIDxzcGFuPlJlY29yZCBhbmQgcGxheSBiYWNrIGF1ZGlvIGZpbGVzLjwvc3Bhbj4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGgyPk5vdGlmaWNhdGlvbjwvaDI+CisgICAgICAgICAgICA8c3Bhbj5WaXN1YWwsIGF1ZGlibGUsIGFuZCB0YWN0aWxlIGRldmljZSBub3RpZmljYXRpb25zLjwvc3Bhbj4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGgyPlN0b3JhZ2U8L2gyPgorICAgICAgICAgICAgPHNwYW4+SG9vayBpbnRvIHRoZSBkZXZpY2VzIG5hdGl2ZSBzdG9yYWdlIG9wdGlvbnMuPC9zcGFuPgorICAgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgxPkd1aWRlczwvaDE+CisgICAgPHVsPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8aDI+PGEgaHJlZj0iX2luZGV4Lmh0bWwiPktleXdvcmQgSW5kZXg8L2E+PC9oMj4KKyAgICAgICAgICAgIDxzcGFuPkZ1bGwgaW5kZXggb2YgdGhlIFBob25lR2FwIERvY3VtZW50YXRpb24uPC9zcGFuPgorICAgICAgICA8L2xpPgorICAgIDwvdWw+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvYWNjZWxlcmF0aW9uL2FjY2VsZXJhdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyYXRpb24vYWNjZWxlcmF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWE1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvYWNjZWxlcmF0aW9uL2FjY2VsZXJhdGlvbi5tZApAQCAtMCwwICsxLDg1IEBACitBY2NlbGVyYXRpb24KKz09PT09PT09PT09PQorCitDb250YWlucyBgQWNjZWxlcm9tZXRlcmAgZGF0YSBjYXB0dXJlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRpbWUuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX3g6X18gQW1vdW50IG9mIG1vdGlvbiBvbiB0aGUgeC1heGlzLiBSYW5nZSBbMCwgMV0gKGBOdW1iZXJgKQorLSBfX3k6X18gQW1vdW50IG9mIG1vdGlvbiBvbiB0aGUgeS1heGlzLiBSYW5nZSBbMCwgMV0gKGBOdW1iZXJgKQorLSBfX3o6X18gQW1vdW50IG9mIG1vdGlvbiBvbiB0aGUgei1heGlzLiBSYW5nZSBbMCwgMV0gKGBOdW1iZXJgKQorLSBfX3RpbWVzdGFtcDpfXyBDcmVhdGlvbiB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLiAoYERPTVRpbWVTdGFtcGApCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBwb3B1bGF0ZWQgYnkgUGhvbmVHYXAsIGFuZCByZXR1cm5lZCBieSBhbiBgQWNjZWxlcm9tZXRlcmAgbWV0aG9kLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb24gb25TdWNjZXNzKGFjY2VsZXJhdGlvbikgeworICAgICAgICBhbGVydCgnQWNjZWxlcmF0aW9uIFg6ICcgKyBhY2NlbGVyYXRpb24ueCArICdcbicgKworICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFk6ICcgKyBhY2NlbGVyYXRpb24ueSArICdcbicgKworICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFo6ICcgKyBhY2NlbGVyYXRpb24ueiArICdcbicgKworICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICAgICAgKyBhY2NlbGVyYXRpb24udGltZXN0YW1wICsgJ1xuJyk7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9uRXJyb3IoKSB7CisgICAgICAgIGFsZXJ0KCdvbkVycm9yIScpOworICAgIH07CisKKyAgICBuYXZpZ2F0b3IuYWNjZWxlcm9tZXRlci5nZXRDdXJyZW50QWNjZWxlcmF0aW9uKG9uU3VjY2Vzcywgb25FcnJvcik7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+QWNjZWxlcmF0aW9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIuZ2V0Q3VycmVudEFjY2VsZXJhdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb25TdWNjZXNzOiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBhY2NlbGVyYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKCkgeworICAgICAgICAgICAgYWxlcnQoJ0FjY2VsZXJhdGlvbiBYOiAnICsgYWNjZWxlcmF0aW9uLnggKyAnXG4nICsKKyAgICAgICAgICAgICAgICAgICdBY2NlbGVyYXRpb24gWTogJyArIGFjY2VsZXJhdGlvbi55ICsgJ1xuJyArCisgICAgICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFo6ICcgKyBhY2NlbGVyYXRpb24ueiArICdcbicgKworICAgICAgICAgICAgICAgICAgJ1RpbWVzdGFtcDogJyAgICAgICsgYWNjZWxlcmF0aW9uLnRpbWVzdGFtcCArICdcbicpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb25FcnJvcjogRmFpbGVkIHRvIGdldCB0aGUgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoKSB7CisgICAgICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+Z2V0Q3VycmVudEFjY2VsZXJhdGlvbjwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2gubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjNWMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2gubWQKQEAgLTAsMCArMSw5MSBAQAorYWNjZWxlcm9tZXRlci5jbGVhcldhdGNoCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RvcCB3YXRjaGluZyB0aGUgYEFjY2VsZXJhdGlvbmAgcmVmZXJlbmNlZCBieSB0aGUgd2F0Y2ggSUQgcGFyYW1ldGVyLgorCisgICAgbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaCh3YXRjaElEKTsKKworLSBfX3dhdGNoSURfXzogVGhlIElEIHJldHVybmVkIGJ5IGBhY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uYC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICB2YXIgd2F0Y2hJRCA9IG5hdmlnYXRvci5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgCisgICAgLy8gLi4uIGxhdGVyIG9uIC4uLgorICAgIAorICAgIG5hdmlnYXRvci5hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2god2F0Y2hJRCk7CisgICAgCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkFjY2VsZXJhdGlvbiBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFRoZSB3YXRjaCBpZCByZWZlcmVuY2VzIHRoZSBjdXJyZW50IGB3YXRjaEFjY2VsZXJhdGlvbmAKKyAgICAgICAgdmFyIHdhdGNoSUQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgc3RhcnRXYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgdGhlIGFjY2VsZXJhdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdGFydFdhdGNoKCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBVcGRhdGUgYWNjZWxlcmF0aW9uIGV2ZXJ5IDMgc2Vjb25kcworICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGZyZXF1ZW5jeTogMzAwMCB9OworICAgICAgICAgICAgCisgICAgICAgICAgICB3YXRjaElEID0gbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3RvcCB3YXRjaGluZyB0aGUgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIHN0b3BXYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICh3YXRjaElEKSB7CisgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaCh3YXRjaElEKTsKKyAgICAgICAgICAgICAgICB3YXRjaElEID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhhY2NlbGVyYXRpb24pIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjY2VsZXJvbWV0ZXInKTsKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0FjY2VsZXJhdGlvbiBYOiAnICsgYWNjZWxlcmF0aW9uLnggKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlbGVyYXRpb24gWTogJyArIGFjY2VsZXJhdGlvbi55ICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFo6ICcgKyBhY2NlbGVyYXRpb24ueiArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lc3RhbXA6ICcgICAgICArIGFjY2VsZXJhdGlvbi50aW1lc3RhbXAgKyAnPGJyIC8+JzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGFjY2VsZXJhdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKCkgeworICAgICAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8ZGl2IGlkPSJhY2NlbGVyb21ldGVyIj5XYWl0aW5nIGZvciBhY2NlbGVyb21ldGVyLi4uPC9kaXY+CisJCTxidXR0b24gb25jbGljaz0ic3RvcFdhdGNoKCk7Ij5TdG9wIFdhdGNoaW5nPC9idXR0b24+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIuZ2V0Q3VycmVudEFjY2VsZXJhdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLmdldEN1cnJlbnRBY2NlbGVyYXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyZTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9hY2NlbGVyb21ldGVyLmdldEN1cnJlbnRBY2NlbGVyYXRpb24ubWQKQEAgLTAsMCArMSw4NyBAQAorYWNjZWxlcm9tZXRlci5nZXRDdXJyZW50QWNjZWxlcmF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworR2V0IHRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhpcy4KKworICAgIG5hdmlnYXRvci5hY2NlbGVyb21ldGVyLmdldEN1cnJlbnRBY2NlbGVyYXRpb24oYWNjZWxlcm9tZXRlclN1Y2Nlc3MsIGFjY2VsZXJvbWV0ZXJFcnJvcik7CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYWNjZWxlcm9tZXRlciBpcyBhIG1vdGlvbiBzZW5zb3IgdGhhdCBkZXRlY3RzIHRoZSBjaGFuZ2UgKGRlbHRhKSBpbiBtb3ZlbWVudCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkZXZpY2Ugb3JpZW50YXRpb24uIFRoZSBhY2NlbGVyb21ldGVyIGNhbiBkZXRlY3QgM0QgbW92ZW1lbnQgYWxvbmcgdGhlIHgsIHksIGFuZCB6IGF4aXMuCisKK1RoZSBhY2NlbGVyYXRpb24gaXMgcmV0dXJuZWQgdXNpbmcgdGhlIGBhY2NlbGVyb21ldGVyU3VjY2Vzc2AgY2FsbGJhY2sgZnVuY3Rpb24uCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb24gb25TdWNjZXNzKGFjY2VsZXJhdGlvbikgeworICAgICAgICBhbGVydCgnQWNjZWxlcmF0aW9uIFg6ICcgKyBhY2NlbGVyYXRpb24ueCArICdcbicgKworICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFk6ICcgKyBhY2NlbGVyYXRpb24ueSArICdcbicgKworICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFo6ICcgKyBhY2NlbGVyYXRpb24ueiArICdcbicgKworICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICAgICAgKyBhY2NlbGVyYXRpb24udGltZXN0YW1wICsgJ1xuJyk7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9uRXJyb3IoKSB7CisgICAgICAgIGFsZXJ0KCdvbkVycm9yIScpOworICAgIH07CisKKyAgICBuYXZpZ2F0b3IuYWNjZWxlcm9tZXRlci5nZXRDdXJyZW50QWNjZWxlcmF0aW9uKG9uU3VjY2Vzcywgb25FcnJvcik7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+QWNjZWxlcmF0aW9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIuZ2V0Q3VycmVudEFjY2VsZXJhdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhhY2NlbGVyYXRpb24pIHsKKyAgICAgICAgICAgIGFsZXJ0KCdBY2NlbGVyYXRpb24gWDogJyArIGFjY2VsZXJhdGlvbi54ICsgJ1xuJyArCisgICAgICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFk6ICcgKyBhY2NlbGVyYXRpb24ueSArICdcbicgKworICAgICAgICAgICAgICAgICAgJ0FjY2VsZXJhdGlvbiBaOiAnICsgYWNjZWxlcmF0aW9uLnogKyAnXG4nICsKKyAgICAgICAgICAgICAgICAgICdUaW1lc3RhbXA6ICcgICAgICArIGFjY2VsZXJhdGlvbi50aW1lc3RhbXAgKyAnXG4nKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBhY2NlbGVyYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25FcnJvcigpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdvbkVycm9yIScpOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5nZXRDdXJyZW50QWNjZWxlcmF0aW9uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgICAKK2lQaG9uZSBRdWlya3MKKy0tLS0tLS0tLS0tLS0KKworLSBpUGhvbmUgZG9lc24ndCBoYXZlIHRoZSBjb25jZXB0IG9mIGdldHRpbmcgdGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uIGF0IGFueSBnaXZlbiBwb2ludC4KKy0gWW91IG11c3Qgd2F0Y2ggdGhlIGFjY2VsZXJhdGlvbiBhbmQgY2FwdHVyZSB0aGUgZGF0YSBhdCBnaXZlbiB0aW1lIGludGVydmFscy4KKy0gVGh1cywgdGhlIGBnZXRDdXJyZW50QWNjZWxlcmF0aW9uYCBmdW5jdGlvbiB3aWxsIGdpdmUgeW91IHRoZSBsYXN0IHZhbHVlIHJlcG9ydGVkIGZyb20gYSBwaG9uZUdhcCBgd2F0Y2hBY2NlbGVyb21ldGVyYCBjYWxsLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvYWNjZWxlcm9tZXRlci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2I2ODEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIubWQKQEAgLTAsMCArMSwyMyBAQAorQWNjZWxlcm9tZXRlcgorPT09PT09PT09PT09PQorCis+IENhcHR1cmVzIGRldmljZSBtb3Rpb24gaW4gdGhlIHgsIHksIGFuZCB6IGRpcmVjdGlvbi4KKworTWV0aG9kcworLS0tLS0tLQorCistIGFjY2VsZXJvbWV0ZXIuZ2V0Q3VycmVudEFjY2VsZXJhdGlvbgorLSBhY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uCistIGFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaAorCitBcmd1bWVudHMKKy0tLS0tLS0tLQorCistIGFjY2VsZXJvbWV0ZXJTdWNjZXNzCistIGFjY2VsZXJvbWV0ZXJFcnJvcgorLSBhY2NlbGVyb21ldGVyT3B0aW9ucworCitPYmplY3RzIChSZWFkLU9ubHkpCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQWNjZWxlcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvYWNjZWxlcm9tZXRlci53YXRjaEFjY2VsZXJhdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZjMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL2FjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ubWQKQEAgLTAsMCArMSwxMTYgQEAKK2FjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXQgYSByZWd1bGFyIGludGVydmFsLCBnZXQgdGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhpcy4KKworICAgIHZhciB3YXRjaElEID0gbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24oYWNjZWxlcm9tZXRlclN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJvbWV0ZXJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VsZXJvbWV0ZXJPcHRpb25zXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBhY2NlbGVyb21ldGVyIGlzIGEgbW90aW9uIHNlbnNvciB0aGF0IGRldGVjdHMgdGhlIGNoYW5nZSAoZGVsdGEpIGluIG1vdmVtZW50IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGUgYWNjZWxlcm9tZXRlciBjYW4gZGV0ZWN0IDNEIG1vdmVtZW50IGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGlzLgorCitUaGUgYGFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb25gIGdldHMgdGhlIGRldmljZSdzIGN1cnJlbnQgYWNjZWxlcmF0aW9uIGF0IGEgcmVndWxhciBpbnRlcnZhbC4gRWFjaCB0aW1lIHRoZSBgQWNjZWxlcmF0aW9uYCBpcyByZXRyaWV2ZWQsIHRoZSBgYWNjZWxlcm9tZXRlclN1Y2Nlc3NgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLiBTcGVjaWZ5IHRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdmlhIHRoZSBgZnJlcXVlbmN5YCBwYXJhbWV0ZXIgaW4gdGhlIGBhY2NlbGVyYXRvck9wdGlvbnNgIG9iamVjdC4KKworVGhlIHJldHVybmVkIHdhdGNoIElEIHJlZmVyZW5jZXMgcmVmZXJlbmNlcyB0aGUgYWNjZWxlcm9tZXRlciB3YXRjaCBpbnRlcnZhbC4gVGhlIHdhdGNoIElEIGNhbiBiZSB1c2VkIHdpdGggYGFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaGAgdG8gc3RvcCB3YXRjaGluZyB0aGUgYWNjZWxlcm9tZXRlci4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhhY2NlbGVyYXRpb24pIHsKKyAgICAgICAgYWxlcnQoJ0FjY2VsZXJhdGlvbiBYOiAnICsgYWNjZWxlcmF0aW9uLnggKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FjY2VsZXJhdGlvbiBZOiAnICsgYWNjZWxlcmF0aW9uLnkgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FjY2VsZXJhdGlvbiBaOiAnICsgYWNjZWxlcmF0aW9uLnogKyAnXG4nICsKKyAgICAgICAgICAgICAgJ1RpbWVzdGFtcDogJyAgICAgICsgYWNjZWxlcmF0aW9uLnRpbWVzdGFtcCArICdcbicpOworICAgIH07CisKKyAgICBmdW5jdGlvbiBvbkVycm9yKCkgeworICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICB9OworCisgICAgdmFyIG9wdGlvbnMgPSB7IGZyZXF1ZW5jeTogMzAwMCB9OyAgLy8gVXBkYXRlIGV2ZXJ5IDMgc2Vjb25kcworICAgIAorICAgIHZhciB3YXRjaElEID0gbmF2aWdhdG9yLmFjY2VsZXJvbWV0ZXIud2F0Y2hBY2NlbGVyYXRpb24ob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5BY2NlbGVyYXRpb24gRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBUaGUgd2F0Y2ggaWQgcmVmZXJlbmNlcyB0aGUgY3VycmVudCBgd2F0Y2hBY2NlbGVyYXRpb25gCisgICAgICAgIHZhciB3YXRjaElEID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHN0YXJ0V2F0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIHRoZSBhY2NlbGVyYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gc3RhcnRXYXRjaCgpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVXBkYXRlIGFjY2VsZXJhdGlvbiBldmVyeSAzIHNlY29uZHMKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBmcmVxdWVuY3k6IDMwMDAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2F0Y2hJRCA9IG5hdmlnYXRvci5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgdGhlIGFjY2VsZXJhdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdG9wV2F0Y2goKSB7CisgICAgICAgICAgICBpZiAod2F0Y2hJRCkgeworICAgICAgICAgICAgICAgIG5hdmlnYXRvci5hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2god2F0Y2hJRCk7CisgICAgICAgICAgICAgICAgd2F0Y2hJRCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhhY2NlbGVyYXRpb24pIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjY2VsZXJvbWV0ZXInKTsKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0FjY2VsZXJhdGlvbiBYOiAnICsgYWNjZWxlcmF0aW9uLnggKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlbGVyYXRpb24gWTogJyArIGFjY2VsZXJhdGlvbi55ICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWNjZWxlcmF0aW9uIFo6ICcgKyBhY2NlbGVyYXRpb24ueiArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RpbWVzdGFtcDogJyAgICAgICsgYWNjZWxlcmF0aW9uLnRpbWVzdGFtcCArICc8YnIgLz4nOworICAgICAgICB9CisKKyAgICAgICAgLy8gb25FcnJvcjogRmFpbGVkIHRvIGdldCB0aGUgYWNjZWxlcmF0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoKSB7CisgICAgICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxkaXYgaWQ9ImFjY2VsZXJvbWV0ZXIiPldhaXRpbmcgZm9yIGFjY2VsZXJvbWV0ZXIuLi48L2Rpdj4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisgICAgCisgaVBob25lIFF1aXJrcworLS0tLS0tLS0tLS0tLQorCistIEF0IHRoZSBpbnRlcnZhbCByZXF1ZXN0ZWQsIFBob25lR2FwIHdpbGwgY2FsbCB0aGUgc3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbiBhbmQgcGFzcyB0aGUgYWNjZWxlcm9tZXRlciByZXN1bHRzLgorLSBIb3dldmVyLCBpbiByZXF1ZXN0cyB0byB0aGUgZGV2aWNlIFBob25lR2FwIHJlc3RyaWN0cyB0aGUgaW50ZXJ2YWwgdG8gbWluaW11bSBvZiBldmVyeSA0MG1zIGFuZCBhIG1heGltdW0gb2YgZXZlcnkgMTAwMG1zLgorICAtIEZvciBleGFtcGxlLCBpZiB5b3UgcmVxdWVzdCBhbiBpbnRlcnZhbCBvZiAzIHNlY29uZHMgKDMwMDBtcyksIFBob25lR2FwIHdpbGwgcmVxdWVzdCBhbiBpbnRlcnZhbCBvZiAxIHNlY29uZCBmcm9tIHRoZSBkZXZpY2UgYnV0IGludm9rZSB0aGUgc3VjY2VzcyBjYWxsYmFjayBhdCB0aGUgcmVxdWVzdGVkIGludGVydmFsIG9mIDMgc2Vjb25kcy4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9wYXJhbWV0ZXJzL2FjY2VsZXJvbWV0ZXJFcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9wYXJhbWV0ZXJzL2FjY2VsZXJvbWV0ZXJFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY1YmZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL3BhcmFtZXRlcnMvYWNjZWxlcm9tZXRlckVycm9yLm1kCkBAIC0wLDAgKzEsOCBAQAorYWNjZWxlcm9tZXRlckVycm9yCis9PT09PT09PT09PT09PT09PT0KKworb25FcnJvciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucy4KKworICAgIGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIGVycm9yCisgICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9wYXJhbWV0ZXJzL2FjY2VsZXJvbWV0ZXJPcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9hY2NlbGVyb21ldGVyL3BhcmFtZXRlcnMvYWNjZWxlcm9tZXRlck9wdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwNjZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9wYXJhbWV0ZXJzL2FjY2VsZXJvbWV0ZXJPcHRpb25zLm1kCkBAIC0wLDAgKzEsOSBAQAorYWNjZWxlcm9tZXRlck9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT09CisKK0FuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBjdXN0b21pemUgdGhlIHJldHJpZXZhbCBvZiB0aGUgYWNjZWxlcm9tZXRlci4KKworT3B0aW9ucworLS0tLS0tLQorCistIF9fZnJlcXVlbmN5Ol9fIEhvdyBvZnRlbiB0byByZXRyaWV2ZSB0aGUgYEFjY2VsZXJhdGlvbmAgaW4gbWlsbGlzZWNvbmRzLiBfKE51bWJlcilfIChEZWZhdWx0OiAxMDAwMCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvcGFyYW1ldGVycy9hY2NlbGVyb21ldGVyU3VjY2Vzcy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvYWNjZWxlcm9tZXRlci9wYXJhbWV0ZXJzL2FjY2VsZXJvbWV0ZXJTdWNjZXNzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTdhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2FjY2VsZXJvbWV0ZXIvcGFyYW1ldGVycy9hY2NlbGVyb21ldGVyU3VjY2Vzcy5tZApAQCAtMCwwICsxLDIzIEBACithY2NlbGVyb21ldGVyU3VjY2VzcworPT09PT09PT09PT09PT09PT09PT0KKworb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIEFjY2VsZXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgIGZ1bmN0aW9uKGFjY2VsZXJhdGlvbikgeworICAgICAgICAvLyBEbyBzb21ldGhpbmcKKyAgICB9CisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX2FjY2VsZXJhdGlvbjpfXyBUaGUgYWNjZWxlcmF0aW9uIGF0IGEgc2luZ2xlIG1vbWVudCBpbiB0aW1lLiAoQWNjZWxlcmF0aW9uKQorCitFeGFtcGxlCistLS0tLS0tCisKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoYWNjZWxlcmF0aW9uKSB7CisgICAgICAgIGFsZXJ0KCdBY2NlbGVyYXRpb24gWDogJyArIGFjY2VsZXJhdGlvbi54ICsgJ1xuJyArCisgICAgICAgICAgICAgICdBY2NlbGVyYXRpb24gWTogJyArIGFjY2VsZXJhdGlvbi55ICsgJ1xuJyArCisgICAgICAgICAgICAgICdBY2NlbGVyYXRpb24gWjogJyArIGFjY2VsZXJhdGlvbi56ICsgJ1xuJyArCisgICAgICAgICAgICAgICdUaW1lc3RhbXA6ICcgICAgICArIGFjY2VsZXJhdGlvbi50aW1lc3RhbXAgKyAnXG4nKTsKKyAgICB9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL2NhbWVyYS5nZXRQaWN0dXJlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jYW1lcmEvY2FtZXJhLmdldFBpY3R1cmUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MDAyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL2NhbWVyYS5nZXRQaWN0dXJlLm1kCkBAIC0wLDAgKzEsMTcxIEBACitjYW1lcmEuZ2V0UGljdHVyZQorPT09PT09PT09PT09PT09PT0KKworVGFrZXMgYSBwaG90byB1c2luZyB0aGUgY2FtZXJhIG9yIHJldHJpZXZlcyBhIHBob3RvIGZyb20gdGhlIGRldmljZSdzIGFsYnVtLiAgVGhlIGltYWdlIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgYFN0cmluZ2Agb3IgYXMgdGhlIFVSSSBvZiBhbiBpbWFnZSBmaWxlLgorCisgICAgbmF2aWdhdG9yLmNhbWVyYS5nZXRQaWN0dXJlKCBjYW1lcmFTdWNjZXNzLCBjYW1lcmFFcnJvciwgWyBjYW1lcmFPcHRpb25zIF0gKTsKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0Z1bmN0aW9uIGBjYW1lcmEuZ2V0UGljdHVyZWAgb3BlbnMgdGhlIGRldmljZSdzIGRlZmF1bHQgY2FtZXJhIGFwcGxpY2F0aW9uIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHRha2UgYSBwaWN0dXJlIChpZiBgQ2FtZXJhLnNvdXJjZVR5cGUgPSBDYW1lcmEuUGljdHVyZVNvdXJjZVR5cGUuQ0FNRVJBYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpLiBPbmNlIHRoZSBwaG90byBpcyB0YWtlbiwgdGhlIGNhbWVyYSBhcHBsaWNhdGlvbiBjbG9zZXMgYW5kIHlvdXIgYXBwbGljYXRpb24gaXMgcmVzdG9yZWQuCisKK0lmIGBDYW1lcmEuc291cmNlVHlwZSA9IENhbWVyYS5QaWN0dXJlU291cmNlVHlwZS5QSE9UT0xJQlJBUllgIG9yIGBDYW1lcmEuUGljdHVyZVNvdXJjZVR5cGUuU0FWRURQSE9UT0FMQlVNYCwgdGhlbiBhIHBob3RvIGNob29zZXIgZGlhbG9nIGlzIHNob3duLCBmcm9tIHdoaWNoIGEgcGhvdG8gZnJvbSB0aGUgYWxidW0gY2FuIGJlIHNlbGVjdGVkLgorCitUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgc2VudCB0byB0aGUgYGNhbWVyYVN1Y2Nlc3NgIGZ1bmN0aW9uLCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzLCBkZXBlbmRpbmcgb24gdGhlIGBjYW1lcmFPcHRpb25zYCB5b3Ugc3BlY2lmeToKKworLSBBIGBTdHJpbmdgIGNvbnRhaW5pbmcgdGhlIEJhc2U2NCBlbmNvZGVkIHBob3RvIGltYWdlIChkZWZhdWx0KS4gCistIEEgYFN0cmluZ2AgcmVwcmVzZW50aW5nIHRoZSBpbWFnZSBmaWxlIGxvY2F0aW9uIG9uIGxvY2FsIHN0b3JhZ2UuICAKKworWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoZSBlbmNvZGVkIGltYWdlIG9yIFVSSSwgZm9yIGV4YW1wbGU6CisKKy0gUmVuZGVyIHRoZSBpbWFnZSBpbiBhbiBgPGltZz5gIHRhZyBfKHNlZSBleGFtcGxlIGJlbG93KV8KKy0gU2F2ZSB0aGUgZGF0YSBsb2NhbGx5IChgTG9jYWxTdG9yYWdlYCwgW0xhd25jaGFpcl0oaHR0cDovL2JyaWFubGVyb3V4LmdpdGh1Yi5jb20vbGF3bmNoYWlyLyksIGV0YykKKy0gUG9zdCB0aGUgZGF0YSB0byBhIHJlbW90ZSBzZXJ2ZXIKKworTm90ZTogVGhlIGltYWdlIHF1YWxpdHkgb2YgcGljdHVyZXMgdGFrZW4gdXNpbmcgdGhlIGNhbWVyYSBvbiBuZXdlciBkZXZpY2VzIGlzIHF1aXRlIGdvb2QuICBfRW5jb2Rpbmcgc3VjaCBpbWFnZXMgdXNpbmcgQmFzZTY0IGhhcyBjYXVzZWQgbWVtb3J5IGlzc3VlcyBvbiBzb21lIG9mIHRoZXNlIGRldmljZXMgKGlQaG9uZSA0LCBCbGFja0JlcnJ5IFRvcmNoIDk4MDApLl8gIFRoZXJlZm9yZSwgdXNpbmcgRklMRV9VUkkgYXMgdGhlICdDYW1lcmEuZGVzdGluYXRpb25UeXBlJyBpcyBoaWdobHkgcmVjb21tZW5kZWQuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrYmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKK1Rha2UgcGhvdG8gYW5kIHJldHJpZXZlIEJhc2U2NC1lbmNvZGVkIGltYWdlOgorCisgICAgbmF2aWdhdG9yLmNhbWVyYS5nZXRQaWN0dXJlKG9uU3VjY2Vzcywgb25GYWlsLCB7IHF1YWxpdHk6IDUwIH0pOyAKKworICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhpbWFnZURhdGEpIHsKKyAgICAgICAgdmFyIGltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215SW1hZ2UnKTsKKyAgICAgICAgaW1hZ2Uuc3JjID0gImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsIiArIGltYWdlRGF0YTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvbkZhaWwobWVzc2FnZSkgeworICAgICAgICBhbGVydCgnRmFpbGVkIGJlY2F1c2U6ICcgKyBtZXNzYWdlKTsKKyAgICB9CisKK1Rha2UgcGhvdG8gYW5kIHJldHJpZXZlIGltYWdlIGZpbGUgbG9jYXRpb246IAorCisgICAgbmF2aWdhdG9yLmNhbWVyYS5nZXRQaWN0dXJlKG9uU3VjY2Vzcywgb25GYWlsLCB7IHF1YWxpdHk6IDUwLCAKKyAgICAgICAgZGVzdGluYXRpb25UeXBlOiBDYW1lcmEuRGVzdGluYXRpb25UeXBlLkZJTEVfVVJJIH0pOyAKKworICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhpbWFnZVVSSSkgeworICAgICAgICB2YXIgaW1hZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlJbWFnZScpOworICAgICAgICBpbWFnZS5zcmMgPSBpbWFnZVVSSTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvbkZhaWwobWVzc2FnZSkgeworICAgICAgICBhbGVydCgnRmFpbGVkIGJlY2F1c2U6ICcgKyBtZXNzYWdlKTsKKyAgICB9CisKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5DYXB0dXJlIFBob3RvPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIHZhciBwaWN0dXJlU291cmNlOyAgIC8vIHBpY3R1cmUgc291cmNlCisgICAgICAgIHZhciBkZXN0aW5hdGlvblR5cGU7IC8vIHNldHMgdGhlIGZvcm1hdCBvZiByZXR1cm5lZCB2YWx1ZSAKKyAgICAgICAgCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGNvbm5lY3Qgd2l0aCB0aGUgZGV2aWNlCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5IixvbkRldmljZVJlYWR5LGZhbHNlKTsKKyAgICAKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkgdG8gYmUgdXNlZCEKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHBpY3R1cmVTb3VyY2U9bmF2aWdhdG9yLmNhbWVyYS5QaWN0dXJlU291cmNlVHlwZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uVHlwZT1uYXZpZ2F0b3IuY2FtZXJhLkRlc3RpbmF0aW9uVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgcGhvdG8gaXMgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblBob3RvRGF0YVN1Y2Nlc3MoaW1hZ2VEYXRhKSB7CisgICAgICAgICAgLy8gVW5jb21tZW50IHRvIHZpZXcgdGhlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEKKyAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpbWFnZURhdGEpOworICAgICAgCisgICAgICAgICAgLy8gR2V0IGltYWdlIGhhbmRsZQorICAgICAgICAgIC8vCisgICAgICAgICAgdmFyIHNtYWxsSW1hZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hbGxJbWFnZScpOworICAgICAgCisgICAgICAgICAgLy8gVW5oaWRlIGltYWdlIGVsZW1lbnRzCisgICAgICAgICAgLy8KKyAgICAgICAgICBzbWFsbEltYWdlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOworICAgICAgCisgICAgICAgICAgLy8gU2hvdyB0aGUgY2FwdHVyZWQgcGhvdG8KKyAgICAgICAgICAvLyBUaGUgaW5saW5lIENTUyBydWxlcyBhcmUgdXNlZCB0byByZXNpemUgdGhlIGltYWdlCisgICAgICAgICAgLy8KKyAgICAgICAgICBzbWFsbEltYWdlLnNyYyA9ICJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCIgKyBpbWFnZURhdGE7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHBob3RvIGlzIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25QaG90b1VSSVN1Y2Nlc3MoaW1hZ2VVUkkpIHsKKyAgICAgICAgICAvLyBVbmNvbW1lbnQgdG8gdmlldyB0aGUgaW1hZ2UgZmlsZSBVUkkgCisgICAgICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2VVUkkpOworICAgICAgCisgICAgICAgICAgLy8gR2V0IGltYWdlIGhhbmRsZQorICAgICAgICAgIC8vCisgICAgICAgICAgdmFyIGxhcmdlSW1hZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFyZ2VJbWFnZScpOworICAgICAgCisgICAgICAgICAgLy8gVW5oaWRlIGltYWdlIGVsZW1lbnRzCisgICAgICAgICAgLy8KKyAgICAgICAgICBsYXJnZUltYWdlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOworICAgICAgCisgICAgICAgICAgLy8gU2hvdyB0aGUgY2FwdHVyZWQgcGhvdG8KKyAgICAgICAgICAvLyBUaGUgaW5saW5lIENTUyBydWxlcyBhcmUgdXNlZCB0byByZXNpemUgdGhlIGltYWdlCisgICAgICAgICAgLy8KKyAgICAgICAgICBsYXJnZUltYWdlLnNyYyA9IGltYWdlVVJJOworICAgICAgICB9CisKKyAgICAgICAgLy8gQSBidXR0b24gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gY2FwdHVyZVBob3RvKCkgeworICAgICAgICAgIC8vIFRha2UgcGljdHVyZSB1c2luZyBkZXZpY2UgY2FtZXJhIGFuZCByZXRyaWV2ZSBpbWFnZSBhcyBiYXNlNjQtZW5jb2RlZCBzdHJpbmcKKyAgICAgICAgICBuYXZpZ2F0b3IuY2FtZXJhLmdldFBpY3R1cmUob25QaG90b0RhdGFTdWNjZXNzLCBvbkZhaWwsIHsgcXVhbGl0eTogNTAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGJ1dHRvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBjYXB0dXJlUGhvdG9FZGl0KCkgeworICAgICAgICAgIC8vIFRha2UgcGljdHVyZSB1c2luZyBkZXZpY2UgY2FtZXJhLCBhbGxvdyBlZGl0LCBhbmQgcmV0cmlldmUgaW1hZ2UgYXMgYmFzZTY0LWVuY29kZWQgc3RyaW5nICAKKyAgICAgICAgICBuYXZpZ2F0b3IuY2FtZXJhLmdldFBpY3R1cmUob25QaG90b0RhdGFTdWNjZXNzLCBvbkZhaWwsIHsgcXVhbGl0eTogMjAsIGFsbG93RWRpdDogdHJ1ZSB9KTsgCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gQSBidXR0b24gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gZ2V0UGhvdG8oc291cmNlKSB7CisgICAgICAgICAgLy8gUmV0cmlldmUgaW1hZ2UgZmlsZSBsb2NhdGlvbiBmcm9tIHNwZWNpZmllZCBzb3VyY2UKKyAgICAgICAgICBuYXZpZ2F0b3IuY2FtZXJhLmdldFBpY3R1cmUob25QaG90b1VSSVN1Y2Nlc3MsIG9uRmFpbCwgeyBxdWFsaXR5OiA1MCwgCisgICAgICAgICAgICBkZXN0aW5hdGlvblR5cGU6IGRlc3RpbmF0aW9uVHlwZS5GSUxFX1VSSSwKKyAgICAgICAgICAgIHNvdXJjZVR5cGU6IHNvdXJjZSB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGxlZCBpZiBzb21ldGhpbmcgYmFkIGhhcHBlbnMuCisgICAgICAgIC8vIAorICAgICAgICBmdW5jdGlvbiBvbkZhaWwobWVzc2FnZSkgeworICAgICAgICAgIGFsZXJ0KCdGYWlsZWQgYmVjYXVzZTogJyArIG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJjYXB0dXJlUGhvdG8oKTsiPkNhcHR1cmUgUGhvdG88L2J1dHRvbj4gPGJyPgorICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImNhcHR1cmVQaG90b0VkaXQoKTsiPkNhcHR1cmUgRWRpdGFibGUgUGhvdG88L2J1dHRvbj4gPGJyPgorICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImdldFBob3RvKHBpY3R1cmVTb3VyY2UuUEhPVE9MSUJSQVJZKTsiPkZyb20gUGhvdG8gTGlicmFyeTwvYnV0dG9uPjxicj4KKyAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJnZXRQaG90byhwaWN0dXJlU291cmNlLlNBVkVEUEhPVE9BTEJVTSk7Ij5Gcm9tIFBob3RvIEFsYnVtPC9idXR0b24+PGJyPgorICAgICAgICA8aW1nIHN0eWxlPSJkaXNwbGF5Om5vbmU7d2lkdGg6NjBweDtoZWlnaHQ6NjBweDsiIGlkPSJzbWFsbEltYWdlIiBzcmM9IiIgLz4KKyAgICAgICAgPGltZyBzdHlsZT0iZGlzcGxheTpub25lOyIgaWQ9ImxhcmdlSW1hZ2UiIHNyYz0iIiAvPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL2NhbWVyYS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL2NhbWVyYS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGVjMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jYW1lcmEvY2FtZXJhLm1kCkBAIC0wLDAgKzEsOSBAQAorQ2FtZXJhCis9PT09PT0KKworPiBUaGUgYGNhbWVyYWAgb2JqZWN0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGV2aWNlJ3MgZGVmYXVsdCBjYW1lcmEgYXBwbGljYXRpb24uCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBjYW1lcmEuZ2V0UGljdHVyZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFFcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIxOWViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jYW1lcmEvcGFyYW1ldGVyL2NhbWVyYUVycm9yLm1kCkBAIC0wLDAgKzEsMTMgQEAKK2NhbWVyYUVycm9yCis9PT09PT09PT09PQorCitvbkVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYW4gZXJyb3IgbWVzc2FnZS4KKworICAgIGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICAgICAgLy8gU2hvdyBhIGhlbHBmdWwgbWVzc2FnZQorICAgIH0KKworUGFyYW1ldGVycworLS0tLS0tLS0tLQorCistIF9fbWVzc2FnZTpfXyBUaGUgbWVzc2FnZSBpcyBwcm92aWRlZCBieSB0aGUgZGV2aWNlJ3MgbmF0aXZlIGNvZGUuIChgU3RyaW5nYCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NhbWVyYS9wYXJhbWV0ZXIvY2FtZXJhT3B0aW9ucy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFPcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjQxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NhbWVyYS9wYXJhbWV0ZXIvY2FtZXJhT3B0aW9ucy5tZApAQCAtMCwwICsxLDkwIEBACitjYW1lcmFPcHRpb25zCis9PT09PT09PT09PT09CisKK09wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY3VzdG9taXplIHRoZSBjYW1lcmEgc2V0dGluZ3MuCisKKyAgICB7IHF1YWxpdHkgOiA3NSwgCisgICAgICBkZXN0aW5hdGlvblR5cGUgOiBDYW1lcmEuRGVzdGluYXRpb25UeXBlLkRBVEFfVVJMLCAKKyAgICAgIHNvdXJjZVR5cGUgOiBDYW1lcmEuUGljdHVyZVNvdXJjZVR5cGUuQ0FNRVJBLCAKKyAgICAgIGFsbG93RWRpdCA6IHRydWUsCisgICAgICBlbmNvZGluZ1R5cGU6IENhbWVyYS5FbmNvZGluZ1R5cGUuSlBFRywKKyAgICAgIHRhcmdldFdpZHRoOiAxMDAsCisgICAgICB0YXJnZXRIZWlnaHQ6IDEwMCB9OworCitPcHRpb25zCistLS0tLS0tCisKKy0gX19xdWFsaXR5Ol9fIFF1YWxpdHkgb2Ygc2F2ZWQgaW1hZ2UuIFJhbmdlIGlzIFswLCAxMDBdLiAoYE51bWJlcmApCisKKy0gX19kZXN0aW5hdGlvblR5cGU6X18gQ2hvb3NlIHRoZSBmb3JtYXQgb2YgdGhlIHJldHVybiB2YWx1ZS4gIERlZmluZWQgaW4gbmF2aWdhdG9yLmNhbWVyYS5EZXN0aW5hdGlvblR5cGUgKGBOdW1iZXJgKQorICAgICAgICAKKyAgICAgICAgICAgIENhbWVyYS5EZXN0aW5hdGlvblR5cGUgPSB7CisgICAgICAgICAgICAgICAgREFUQV9VUkwgOiAwLCAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaW1hZ2UgYXMgYmFzZTY0IGVuY29kZWQgc3RyaW5nCisgICAgICAgICAgICAgICAgRklMRV9VUkkgOiAxICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaW1hZ2UgZmlsZSBVUkkKKyAgICAgICAgICAgIH07CisKKy0gX19zb3VyY2VUeXBlOl9fIFNldCB0aGUgc291cmNlIG9mIHRoZSBwaWN0dXJlLiAgRGVmaW5lZCBpbiBuYWdpdmF0b3IuY2FtZXJhLlBpY3R1cmVTb3VyY2VUeXBlIChgTnVtYmVyYCkKKyAgICAgCisgICAgICAgIENhbWVyYS5QaWN0dXJlU291cmNlVHlwZSA9IHsKKyAgICAgICAgICAgIFBIT1RPTElCUkFSWSA6IDAsCisgICAgICAgICAgICBDQU1FUkEgOiAxLAorICAgICAgICAgICAgU0FWRURQSE9UT0FMQlVNIDogMgorICAgICAgICB9OworCistIF9fYWxsb3dFZGl0Ol9fIEFsbG93IHNpbXBsZSBlZGl0aW5nIG9mIGltYWdlIGJlZm9yZSBzZWxlY3Rpb24uIChgQm9vbGVhbmApCisgIAorLSBfX0VuY29kaW5nVHlwZTpfXyBDaG9vc2UgdGhlIGVuY29kaW5nIG9mIHRoZSByZXR1cm5lZCBpbWFnZSBmaWxlLiAgRGVmaW5lZCBpbiBuYXZpZ2F0b3IuY2FtZXJhLkVuY29kaW5nVHlwZSAoYE51bWJlcmApCisgICAgICAgIAorICAgICAgICAgICAgQ2FtZXJhLkVuY29kaW5nVHlwZSA9IHsKKyAgICAgICAgICAgICAgICBKUEVHIDogMCwgICAgICAgICAgICAgICAvLyBSZXR1cm4gSlBFRyBlbmNvZGVkIGltYWdlCisgICAgICAgICAgICAgICAgUE5HIDogMSAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIFBORyBlbmNvZGVkIGltYWdlCisgICAgICAgICAgICB9OworCistIF9fdGFyZ2V0V2lkdGg6X18gV2lkdGggaW4gcGl4ZWxzIHRvIHNjYWxlIGltYWdlLiBNdXN0IGJlIHVzZWQgd2l0aCB0YXJnZXRIZWlnaHQuICBBc3BlY3QgcmF0aW8gaXMgbWFpbnRhaW5lZC4gKGBOdW1iZXJgKQorLSBfX3RhcmdldEhlaWdodDpfXyBIZWlnaHQgaW4gcGl4ZWxzIHRvIHNjYWxlIGltYWdlLiBNdXN0IGJlIHVzZWQgd2l0aCB0YXJnZXRXaWR0aC4gQXNwZWN0IHJhdGlvIGlzIG1haW50YWluZWQuIChgTnVtYmVyYCkKKworLSBfX01lZGlhVHlwZTpfXyBTZXQgdGhlIHR5cGUgb2YgbWVkaWEgdG8gc2VsZWN0IGZyb20uICBPbmx5IHdvcmtzIHdoZW4gUGljdHVyZVNvdXJjZVR5cGUgaXMgUEhPVE9MSUJSQVJZIG9yIFNBVkVEUEhPVE9BTEJVTS4gRGVmaW5lZCBpbiBuYWdpdmF0b3IuY2FtZXJhLk1lZGlhVHlwZSAoYE51bWJlcmApCisgICAgIAorICAgICAgICBDYW1lcmEuTWVkaWFUeXBlID0geyAKKwkJCVBJQ1RVUkU6IDAsICAgICAgICAgICAgIC8vIGFsbG93IHNlbGVjdGlvbiBvZiBzdGlsbCBwaWN0dXJlcyBvbmx5LiBERUZBVUxULiBXaWxsIHJldHVybiBmb3JtYXQgc3BlY2lmaWVkIHZpYSBEZXN0aW5hdGlvblR5cGUKKwkJCVZJREVPOiAxLCAgICAgICAgICAgICAgIC8vIGFsbG93IHNlbGVjdGlvbiBvZiB2aWRlbyBvbmx5LCBXSUxMIEFMV0FZUyBSRVRVUk4gRklMRV9VUkkKKwkJCUFMTE1FRElBIDogMgkJCS8vIGFsbG93IHNlbGVjdGlvbiBmcm9tIGFsbCBtZWRpYSB0eXBlcworfTsKKyAgCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBJZ25vcmVzIHRoZSBgYWxsb3dFZGl0YCBwYXJhbWV0ZXIuCistIENhbWVyYS5QaWN0dXJlU291cmNlVHlwZS5QSE9UT0xJQlJBUlkgYW5kIENhbWVyYS5QaWN0dXJlU291cmNlVHlwZS5TQVZFRFBIT1RPQUxCVU0gYm90aCBkaXNwbGF5IHRoZSBzYW1lIHBob3RvIGFsYnVtLgorLSBDYW1lcmEuRW5jb2RpbmdUeXBlIGlzIG5vdCBzdXBwb3J0ZWQuCisKK0JsYWNrQmVycnkgUXVpcmtzCistLS0tLS0tLS0tLS0tLS0tLQorCistIElnbm9yZXMgdGhlIGBxdWFsaXR5YCBwYXJhbWV0ZXIuCistIElnbm9yZXMgdGhlIGBzb3VyY2VUeXBlYCBwYXJhbWV0ZXIuCistIElnbm9yZXMgdGhlIGBhbGxvd0VkaXRgIHBhcmFtZXRlci4KKy0gQXBwbGljYXRpb24gbXVzdCBoYXZlIGtleSBpbmplY3Rpb24gcGVybWlzc2lvbnMgdG8gY2xvc2UgbmF0aXZlIENhbWVyYSBhcHBsaWNhdGlvbiBhZnRlciBwaG90byBpcyB0YWtlbi4KKy0gVXNpbmcgTGFyZ2UgaW1hZ2Ugc2l6ZXMgbWF5IHJlc3VsdCBpbiBpbmFiaWxpdHkgdG8gZW5jb2RlIGltYWdlIG9uIGxhdGVyIG1vZGVsIGRldmljZXMgd2l0aCBoaWdoIHJlc29sdXRpb24gY2FtZXJhcyAoZS5nLiBUb3JjaCA5ODAwKS4KKy0gQ2FtZXJhLk1lZGlhVHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorCitQYWxtIFF1aXJrcworLS0tLS0tLS0tLS0KKworLSBJZ25vcmVzIHRoZSBgcXVhbGl0eWAgcGFyYW1ldGVyLgorLSBJZ25vcmVzIHRoZSBgc291cmNlVHlwZWAgcGFyYW1ldGVyLgorLSBJZ25vcmVzIHRoZSBgYWxsb3dFZGl0YCBwYXJhbWV0ZXIuCistIENhbWVyYS5NZWRpYVR5cGUgaXMgbm90IHN1cHBvcnRlZC4KKworaVBob25lIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBTZXQgYHF1YWxpdHlgIGJlbG93IDUwIHRvIGF2b2lkIG1lbW9yeSBlcnJvciBvbiBzb21lIGRldmljZXMuCistIFdoZW4gYGRlc3RpbmF0aW9uVHlwZS5GSUxFX1VSSWAgaXMgdXNlZCwgcGhvdG9zIGFyZSBzYXZlZCBpbiB0aGUgYXBwbGljYXRpb24ncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorLSBUaGUgY29udGVudHMgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyBkZWxldGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGVuZHMuIERldmVsb3BlcnMgbWF5IGFsc28gZGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSB1c2luZyB0aGUgbmF2aWdhdG9yLmZpbGVNZ3IgQVBJcyBpZiBzdG9yYWdlIHNwYWNlIGlzIGEgY29uY2Vybi4KKworV2luZG93cyBQaG9uZSA3IFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBJZ25vcmVzIHRoZSBgYWxsb3dFZGl0YCBwYXJhbWV0ZXIuCisgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFTdWNjZXNzLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jYW1lcmEvcGFyYW1ldGVyL2NhbWVyYVN1Y2Nlc3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0YThlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY2FtZXJhL3BhcmFtZXRlci9jYW1lcmFTdWNjZXNzLm1kCkBAIC0wLDAgKzEsMjMgQEAKK2NhbWVyYVN1Y2Nlc3MKKz09PT09PT09PT09PT0KKworb25TdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIGltYWdlIGRhdGEuCisKKyAgICBmdW5jdGlvbihpbWFnZURhdGEpIHsKKyAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIGltYWdlCisgICAgfQorCitQYXJhbWV0ZXJzCistLS0tLS0tLS0tCisKKy0gX19pbWFnZURhdGE6X18gQmFzZTY0IGVuY29kaW5nIG9mIHRoZSBpbWFnZSBkYXRhLCBPUiB0aGUgaW1hZ2UgZmlsZSBVUkksIGRlcGVuZGluZyBvbiBgY2FtZXJhT3B0aW9uc2AgdXNlZC4gKGBTdHJpbmdgKQorCitFeGFtcGxlCistLS0tLS0tCisKKyAgICAvLyBTaG93IGltYWdlCisgICAgLy8KKyAgICBmdW5jdGlvbiBjYW1lcmFDYWxsYmFjayhpbWFnZURhdGEpIHsKKyAgICAgICAgdmFyIGltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215SW1hZ2UnKTsKKyAgICAgICAgaW1hZ2Uuc3JjID0gImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsIiArIGltYWdlRGF0YTsKKyAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3MuY2xlYXJXYXRjaC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLmNsZWFyV2F0Y2gubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzY1ZGM4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLmNsZWFyV2F0Y2gubWQKQEAgLTAsMCArMSw5MCBAQAorY29tcGFzcy5jbGVhcldhdGNoCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RvcCB3YXRjaGluZyB0aGUgY29tcGFzcyByZWZlcmVuY2VkIGJ5IHRoZSB3YXRjaCBJRCBwYXJhbWV0ZXIuCisKKyAgICBuYXZpZ2F0b3IuY29tcGFzcy5jbGVhcldhdGNoKHdhdGNoSUQpOworCistIF9fd2F0Y2hJRF9fOiBUaGUgSUQgcmV0dXJuZWQgYnkgYGNvbXBhc3Mud2F0Y2hIZWFkaW5nYC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkgaWYgYXZhaWxhYmxlIGluIGhhcmR3YXJlCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIHZhciB3YXRjaElEID0gbmF2aWdhdG9yLmNvbXBhc3Mud2F0Y2hIZWFkaW5nKG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgCisgICAgLy8gLi4uIGxhdGVyIG9uIC4uLgorICAgIAorICAgIG5hdmlnYXRvci5jb21wYXNzLmNsZWFyV2F0Y2god2F0Y2hJRCk7CisgICAgCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbXBhc3MgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBUaGUgd2F0Y2ggaWQgcmVmZXJlbmNlcyB0aGUgY3VycmVudCBgd2F0Y2hIZWFkaW5nYAorICAgICAgICB2YXIgd2F0Y2hJRCA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICBzdGFydFdhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB3YXRjaGluZyB0aGUgY29tcGFzcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdGFydFdhdGNoKCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBVcGRhdGUgY29tcGFzcyBldmVyeSAzIHNlY29uZHMKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBmcmVxdWVuY3k6IDMwMDAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2F0Y2hJRCA9IG5hdmlnYXRvci5jb21wYXNzLndhdGNoSGVhZGluZyhvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTdG9wIHdhdGNoaW5nIHRoZSBjb21wYXNzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIHN0b3BXYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICh3YXRjaElEKSB7CisgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNvbXBhc3MuY2xlYXJXYXRjaCh3YXRjaElEKTsKKyAgICAgICAgICAgICAgICB3YXRjaElEID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gb25TdWNjZXNzOiBHZXQgdGhlIGN1cnJlbnQgaGVhZGluZworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoaGVhZGluZykgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGluZycpOworICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnSGVhZGluZzogJyArIGhlYWRpbmcubWFnbmV0aWNIZWFkaW5nOworICAgICAgICB9CisKKyAgICAgICAgLy8gb25FcnJvcjogRmFpbGVkIHRvIGdldCB0aGUgaGVhZGluZworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGNvbXBhc3NFcnJvcikgeworICAgICAgICAgICAgYWxlcnQoJ0NvbXBhc3MgZXJyb3I6ICcgKyBjb21wYXNzRXJyb3IuY29kZSk7CisgICAgICAgIH0KKworCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxkaXYgaWQ9ImhlYWRpbmciPldhaXRpbmcgZm9yIGhlYWRpbmcuLi48L2Rpdj4KKyAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJzdGFydFdhdGNoKCk7Ij5TdGFydCBXYXRjaGluZzwvYnV0dG9uPgorICAgICAgICA8YnV0dG9uIG9uY2xpY2s9InN0b3BXYXRjaCgpOyI+U3RvcCBXYXRjaGluZzwvYnV0dG9uPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLmNsZWFyV2F0Y2hGaWx0ZXIubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvY29tcGFzcy5jbGVhcldhdGNoRmlsdGVyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDUwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvY29tcGFzcy5jbGVhcldhdGNoRmlsdGVyLm1kCkBAIC0wLDAgKzEsODggQEAKK2NvbXBhc3MuY2xlYXJXYXRjaEZpbHRlcgorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1N0b3Agd2F0Y2hpbmcgdGhlIGNvbXBhc3MgcmVmZXJlbmNlZCBieSB0aGUgd2F0Y2ggSUQgcGFyYW1ldGVyLgorCisgICAgbmF2aWdhdG9yLmNvbXBhc3MuY2xlYXJXYXRjaEZpbHRlcih3YXRjaElEKTsKKworLSBfX3dhdGNoSURfXzogVGhlIElEIHJldHVybmVkIGJ5IGBjb21wYXNzLndhdGNoSGVhZGluZ0ZpbHRlcmAuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBpUGhvbmUKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgdmFyIHdhdGNoSUQgPSBuYXZpZ2F0b3IuY29tcGFzcy53YXRjaEhlYWRpbmdGaWx0ZXIob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAKKyAgICAvLyAuLi4gbGF0ZXIgb24gLi4uCisgICAgCisgICAgbmF2aWdhdG9yLmNvbXBhc3MuY2xlYXJXYXRjaEZpbHRlcih3YXRjaElEKTsKKyAgICAKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Q29tcGFzcyBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFRoZSB3YXRjaCBpZCByZWZlcmVuY2VzIHRoZSBjdXJyZW50IGB3YXRjaEhlYWRpbmdgCisgICAgICAgIHZhciB3YXRjaElEID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHN0YXJ0V2F0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIHRoZSBjb21wYXNzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIHN0YXJ0V2F0Y2goKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEdldCBub3RpZmllZCBvbiBjb21wYXNzIGhlYWRpbmcgY2hhbmdlcyBvciAxMCBkZWdyZWVzIG9yIG1vcmUKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBmaWx0ZXI6IDEwIH07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdhdGNoSUQgPSBuYXZpZ2F0b3IuY29tcGFzcy53YXRjaEhlYWRpbmdGaWx0ZXIob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3RvcCB3YXRjaGluZyB0aGUgY29tcGFzcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdG9wV2F0Y2goKSB7CisgICAgICAgICAgICBpZiAod2F0Y2hJRCkgeworICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jb21wYXNzLmNsZWFyV2F0Y2hGaWx0ZXIod2F0Y2hJRCk7CisgICAgICAgICAgICAgICAgd2F0Y2hJRCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IHRoZSBjdXJyZW50IGhlYWRpbmcKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGhlYWRpbmcpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRpbmcnKTsKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0hlYWRpbmc6ICcgKyBoZWFkaW5nLm1hZ25ldGljSGVhZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGhlYWRpbmcKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25FcnJvcihjb21wYXNzRXJyb3IpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdDb21wYXNzIGVycm9yOiAnICsgY29tcGFzc0Vycm9yLmNvZGUpOworICAgICAgICB9CisKKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8ZGl2IGlkPSJoZWFkaW5nIj5XYWl0aW5nIGZvciBoZWFkaW5nLi4uPC9kaXY+CisgICAgICAgIDxidXR0b24gb25jbGljaz0ic3RhcnRXYXRjaCgpOyI+U3RhcnQgV2F0Y2hpbmcgdmlhIEZpbHRlcjwvYnV0dG9uPgorICAgICAgICA8YnV0dG9uIG9uY2xpY2s9InN0b3BXYXRjaCgpOyI+U3RvcCBXYXRjaGluZzwvYnV0dG9uPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLmdldEN1cnJlbnRIZWFkaW5nLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3MuZ2V0Q3VycmVudEhlYWRpbmcubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZjMDJlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLmdldEN1cnJlbnRIZWFkaW5nLm1kCkBAIC0wLDAgKzEsNzUgQEAKK2NvbXBhc3MuZ2V0Q3VycmVudEhlYWRpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworR2V0IHRoZSBjdXJyZW50IGNvbXBhc3MgaGVhZGluZy4KKworICAgIG5hdmlnYXRvci5jb21wYXNzLmdldEN1cnJlbnRIZWFkaW5nKGNvbXBhc3NTdWNjZXNzLCBjb21wYXNzRXJyb3IsIGNvbXBhc3NPcHRpb25zKTsKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBjb21wYXNzIGlzIGEgc2Vuc29yIHRoYXQgZGV0ZWN0cyB0aGUgZGlyZWN0aW9uIG9yIGhlYWRpbmcgdGhhdCB0aGUgZGV2aWNlIGlzIHBvaW50ZWQuICBJdCBtZWFzdXJlcyB0aGUgaGVhZGluZyBpbiBkZWdyZWVzIGZyb20gMCB0byAzNTkuOTkuCisKK1RoZSBjb21wYXNzIGhlYWRpbmcgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgdmlhIGEgQ29tcGFzc0hlYWRpbmcgb2JqZWN0IHVzaW5nIHRoZSBgY29tcGFzc1N1Y2Nlc3NgIGNhbGxiYWNrIGZ1bmN0aW9uLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKSBpZiBhdmFpbGFibGUgaW4gaGFyZHdhcmUKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb24gb25TdWNjZXNzKGhlYWRpbmcpIHsKKyAgICAgICAgYWxlcnQoJ0hlYWRpbmc6ICcgKyBoZWFkaW5nLm1hZ25ldGljSGVhZGluZyk7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoJ0NvbXBhc3NFcnJvcjogJyBlcnJvci5jb2RlKTsKKyAgICB9OworCisgICAgbmF2aWdhdG9yLmNvbXBhc3MuZ2V0Q3VycmVudEhlYWRpbmcob25TdWNjZXNzLCBvbkVycm9yKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db21wYXNzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgbmF2aWdhdG9yLmNvbXBhc3MuZ2V0Q3VycmVudEhlYWRpbmcob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3M6IEdldCB0aGUgY3VycmVudCBoZWFkaW5nCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhoZWFkaW5nKSB7CisgICAgICAgICAgICBhbGVydCgnSGVhZGluZzogJyArIGhlYWRpbmcubWFnbmV0aWNIZWFkaW5nKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBoZWFkaW5nCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29tcGFzc0Vycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnQ29tcGFzcyBFcnJvcjogJyArIGNvbXBhc3NFcnJvci5jb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+Z2V0Q3VycmVudEhlYWRpbmc8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICAgIApkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3MubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvY29tcGFzcy5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjQ3MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3MubWQKQEAgLTAsMCArMSwyMSBAQAorQ29tcGFzcworPT09PT09PQorCis+IE9idGFpbnMgdGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBkZXZpY2UgaXMgcG9pbnRpbmcuCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBjb21wYXNzLmdldEN1cnJlbnRIZWFkaW5nCistIGNvbXBhc3Mud2F0Y2hIZWFkaW5nCistIGNvbXBhc3MuY2xlYXJXYXRjaAorLSBjb21wYXNzLndhdGNoSGVhZGluZ0ZpbHRlcgorLSBjb21wYXNzLmNsZWFyV2F0Y2hGaWx0ZXIKKworQXJndW1lbnRzCistLS0tLS0tLS0KKworLSBjb21wYXNzU3VjY2VzcworLSBjb21wYXNzRXJyb3IKKy0gY29tcGFzc09wdGlvbnMKKy0gY29tcGFzc0hlYWRpbmcKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLndhdGNoSGVhZGluZy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9jb21wYXNzLndhdGNoSGVhZGluZy5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NmQ4OWJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3Mud2F0Y2hIZWFkaW5nLm1kCkBAIC0wLDAgKzEsMTA1IEBACitjb21wYXNzLndhdGNoSGVhZGluZworPT09PT09PT09PT09PT09PT09PT0KKworQXQgYSByZWd1bGFyIGludGVydmFsLCBnZXQgdGhlIGNvbXBhc3MgaGVhZGluZyBpbiBkZWdyZWVzLgorCisgICAgdmFyIHdhdGNoSUQgPSBuYXZpZ2F0b3IuY29tcGFzcy53YXRjaEhlYWRpbmcoY29tcGFzc1N1Y2Nlc3MsIGNvbXBhc3NFcnJvciwgW2NvbXBhc3NPcHRpb25zXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBjb21wYXNzIGlzIGEgc2Vuc29yIHRoYXQgZGV0ZWN0cyB0aGUgZGlyZWN0aW9uIG9yIGhlYWRpbmcgdGhhdCB0aGUgZGV2aWNlIGlzIHBvaW50ZWQuICBJdCBtZWFzdXJlcyB0aGUgaGVhZGluZyBpbiBkZWdyZWVzIGZyb20gMCB0byAzNTkuOTkuCisKK1RoZSBgY29tcGFzcy53YXRjaEhlYWRpbmdgIGdldHMgdGhlIGRldmljZSdzIGN1cnJlbnQgaGVhZGluZyBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwuIEVhY2ggdGltZSB0aGUgaGVhZGluZyBpcyByZXRyaWV2ZWQsIHRoZSBgaGVhZGluZ1N1Y2Nlc3NgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLiBTcGVjaWZ5IHRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdmlhIHRoZSBgZnJlcXVlbmN5YCBwYXJhbWV0ZXIgaW4gdGhlIGBjb21wYXNzT3B0aW9uc2Agb2JqZWN0LgorCitUaGUgcmV0dXJuZWQgd2F0Y2ggSUQgcmVmZXJlbmNlcyByZWZlcmVuY2VzIHRoZSBjb21wYXNzIHdhdGNoIGludGVydmFsLiBUaGUgd2F0Y2ggSUQgY2FuIGJlIHVzZWQgd2l0aCBgY29tcGFzcy5jbGVhcldhdGNoYCB0byBzdG9wIHdhdGNoaW5nIHRoZSBjb21wYXNzLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKSBpZiBhdmFpbGFibGUgaW4gaGFyZHdhcmUKKworCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoaGVhZGluZykgeworICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkaW5nJyk7CisgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0hlYWRpbmc6ICcgKyBoZWFkaW5nLm1hZ25ldGljSGVhZGluZzsKKyAgICB9OworCisgICAgZnVuY3Rpb24gb25FcnJvcihjb21wYXNzRXJyb3IpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdDb21wYXNzIGVycm9yOiAnICsgY29tcGFzc0Vycm9yLmNvZGUpOworICAgIH07CisKKyAgICB2YXIgb3B0aW9ucyA9IHsgZnJlcXVlbmN5OiAzMDAwIH07ICAvLyBVcGRhdGUgZXZlcnkgMyBzZWNvbmRzCisgICAgCisgICAgdmFyIHdhdGNoSUQgPSBuYXZpZ2F0b3IuY29tcGFzcy53YXRjaEhlYWRpbmcob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db21wYXNzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gVGhlIHdhdGNoIGlkIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgYHdhdGNoSGVhZGluZ2AKKyAgICAgICAgdmFyIHdhdGNoSUQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgc3RhcnRXYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgdGhlIGNvbXBhc3MKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gc3RhcnRXYXRjaCgpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVXBkYXRlIGNvbXBhc3MgZXZlcnkgMyBzZWNvbmRzCisgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHsgZnJlcXVlbmN5OiAzMDAwIH07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdhdGNoSUQgPSBuYXZpZ2F0b3IuY29tcGFzcy53YXRjaEhlYWRpbmcob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3RvcCB3YXRjaGluZyB0aGUgY29tcGFzcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdG9wV2F0Y2goKSB7CisgICAgICAgICAgICBpZiAod2F0Y2hJRCkgeworICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jb21wYXNzLmNsZWFyV2F0Y2god2F0Y2hJRCk7CisgICAgICAgICAgICAgICAgd2F0Y2hJRCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IHRoZSBjdXJyZW50IGhlYWRpbmcKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGhlYWRpbmcpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRpbmcnKTsKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0hlYWRpbmc6ICcgKyBoZWFkaW5nLm1hZ25ldGljSGVhZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGhlYWRpbmcKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25FcnJvcihjb21wYXNzRXJyb3IpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdDb21wYXNzIGVycm9yOiAnICsgY29tcGFzc0Vycm9yLmNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGRpdiBpZD0iaGVhZGluZyI+V2FpdGluZyBmb3IgaGVhZGluZy4uLjwvZGl2PgorICAgICAgICA8YnV0dG9uIG9uY2xpY2s9InN0YXJ0V2F0Y2goKTsiPlN0YXJ0IFdhdGNoaW5nPC9idXR0b24+CisgICAgICAgIDxidXR0b24gb25jbGljaz0ic3RvcFdhdGNoKCk7Ij5TdG9wIFdhdGNoaW5nPC9idXR0b24+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICAgIApkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3Mud2F0Y2hIZWFkaW5nRmlsdGVyLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3Mud2F0Y2hIZWFkaW5nRmlsdGVyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjgzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvY29tcGFzcy53YXRjaEhlYWRpbmdGaWx0ZXIubWQKQEAgLTAsMCArMSwxMDMgQEAKK2NvbXBhc3Mud2F0Y2hIZWFkaW5nRmlsdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitHZXQgdGhlIGNvbXBhc3MgaGVhZGluZyBpbiBkZWdyZWVzIHdoZW4gaXQgY2hhbmdlcyBieSBhdCBsZWFzdCBhIGNlcnRhaW4gbnVtYmVyIG9mIGRlZ3JlZXMuCisKKyAgICB2YXIgd2F0Y2hJRCA9IG5hdmlnYXRvci5jb21wYXNzLndhdGNoSGVhZGluZ0ZpbHRlcihjb21wYXNzU3VjY2VzcywgY29tcGFzc0Vycm9yLCBjb21wYXNzT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBjb21wYXNzIGlzIGEgc2Vuc29yIHRoYXQgZGV0ZWN0cyB0aGUgZGlyZWN0aW9uIG9yIGhlYWRpbmcgdGhhdCB0aGUgZGV2aWNlIGlzIHBvaW50ZWQuICBJdCBtZWFzdXJlcyB0aGUgaGVhZGluZyBpbiBkZWdyZWVzIGZyb20gMCB0byAzNTkuOTkuCisKK1RoZSBgY29tcGFzcy53YXRjaEhlYWRpbmdGaWx0ZXJgIGdldHMgdGhlIGRldmljZSdzIGN1cnJlbnQgaGVhZGluZyB3aGVuIGl0IGNoYW5nZXMgYnkgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlZ3JlZXMuIEVhY2ggdGltZSB0aGUgaGVhZGluZyBjaGFuZ2VzIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlZ3JlZXMgb3IgbW9yZSwgdGhlIGBoZWFkaW5nU3VjY2Vzc2AgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLiBTcGVjaWZ5IHRoZSBkZWdyZWVzIG9mIGNoYW5nZSB2aWEgdGhlIGBmaWx0ZXJgIHBhcmFtZXRlciBpbiB0aGUgYGNvbXBhc3NPcHRpb25zYCBvYmplY3QuCisKK1RoZSByZXR1cm5lZCB3YXRjaCBJRCByZWZlcmVuY2VzIHJlZmVyZW5jZXMgdGhlIGNvbXBhc3Mgd2F0Y2ggaW50ZXJ2YWwuIFRoZSB3YXRjaCBJRCBjYW4gYmUgdXNlZCB3aXRoIGBjb21wYXNzLmNsZWFyV2F0Y2hGaWx0ZXJgIHRvIHN0b3Agd2F0Y2hpbmcgdGhlIGNvbXBhc3MgdmlhIGEgZGVncmVlIGZpbHRlci4gIE9ubHkgb25lIHdhdGNoSGVhZGluZ0ZpbHRlciBjYW4gYmUgaW4gZWZmZWN0IGF0IG9uZSB0aW1lLiAgSWYgYSB3YXRjaEhlYWRpbmdGaWx0ZXIgaXMgaW4gZWZmZWN0LCBjYWxsaW5nIGdldEN1cnJlbnRIZWFkaW5nIG9yIHdhdGNoSGVhZGluZyB3aWxsIHVzZSB0aGUgZXhpc3RpbmcgZmlsdGVyIHZhbHVlIGZvciBzcGVjaWZ5aW5nIGhlYWRpbmcgY2hhbmdlcy4gT24gaU9TIHRoaXMgbWV0aG9kIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29tcGFzcy53YXRjaEZpbHRlcigpIGJhc2VkIG9uIHRoZSBpT1MgbWVjaGFuaXNtIGZvciBtb25pdG9yaW5nIGNvbXBhc3MgaGVhZGluZyBjaGFuZ2VzLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gaVBob25lCisKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb24gb25TdWNjZXNzKGhlYWRpbmcpIHsKKyAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGluZycpOworICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdIZWFkaW5nOiAnICsgaGVhZGluZy5tYWduZXRpY0hlYWRpbmc7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29tcGFzc0Vycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnQ29tcGFzcyBlcnJvcjogJyArIGNvbXBhc3NFcnJvci5jb2RlKTsKKyAgICB9OworCisgICAgdmFyIG9wdGlvbnMgPSB7IGZpbHRlcjogMTAgfTsgIC8vIEdldCBub3RpZmllZCBvbiBjb21wYXNzIGhlYWRpbmcgY2hhbmdlcyBvciAxMCBkZWdyZWVzIG9yIG1vcmUKKyAgICAKKyAgICB2YXIgd2F0Y2hJRCA9IG5hdmlnYXRvci5jb21wYXNzLndhdGNoSGVhZGluZ0ZpbHRlcihvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbXBhc3MgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBUaGUgd2F0Y2ggaWQgcmVmZXJlbmNlcyB0aGUgY3VycmVudCBgd2F0Y2hIZWFkaW5nYAorICAgICAgICB2YXIgd2F0Y2hJRCA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICBzdGFydFdhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB3YXRjaGluZyB0aGUgY29tcGFzcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzdGFydFdhdGNoKCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBHZXQgbm90aWZpZWQgb24gY29tcGFzcyBoZWFkaW5nIGNoYW5nZXMgb3IgMTAgZGVncmVlcyBvciBtb3JlCisgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHsgZmlsdGVyOiAxMCB9OworICAgICAgICAgICAgCisgICAgICAgICAgICB3YXRjaElEID0gbmF2aWdhdG9yLmNvbXBhc3Mud2F0Y2hIZWFkaW5nRmlsdGVyKG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgdGhlIGNvbXBhc3MKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gc3RvcFdhdGNoKCkgeworICAgICAgICAgICAgaWYgKHdhdGNoSUQpIHsKKyAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY29tcGFzcy5jbGVhcldhdGNoRmlsdGVyKHdhdGNoSUQpOworICAgICAgICAgICAgICAgIHdhdGNoSUQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3M6IEdldCB0aGUgY3VycmVudCBoZWFkaW5nCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhoZWFkaW5nKSB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkaW5nJyk7CisgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdIZWFkaW5nOiAnICsgaGVhZGluZy5tYWduZXRpY0hlYWRpbmc7CisgICAgICAgIH0KKworICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBoZWFkaW5nCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29tcGFzc0Vycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnQ29tcGFzcyBlcnJvcjogJyArIGNvbXBhc3NFcnJvci5jb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxkaXYgaWQ9ImhlYWRpbmciPldhaXRpbmcgZm9yIGhlYWRpbmcuLi48L2Rpdj4KKyAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJzdGFydFdhdGNoKCk7Ij5TdGFydCBXYXRjaGluZyB2aWEgRmlsdGVyPC9idXR0b24+CisgICAgICAgIDxidXR0b24gb25jbGljaz0ic3RvcFdhdGNoKCk7Ij5TdG9wIFdhdGNoaW5nPC9idXR0b24+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICAgIApkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3NFcnJvci9jb21wYXNzRXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvY29tcGFzc0Vycm9yL2NvbXBhc3NFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFhMjRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL2NvbXBhc3NFcnJvci9jb21wYXNzRXJyb3IubWQKQEAgLTAsMCArMSwyMSBAQAorQ29tcGFzc0Vycm9yCis9PT09PT09PT09CisKK0EgYENvbXBhc3NFcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSBgY29tcGFzc0Vycm9yYCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fY29kZTpfXyBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgY29kZXMgbGlzdGVkIGJlbG93LgorCitDb25zdGFudHMKKy0tLS0tLS0tLQorLSBgQ29tcGFzc0Vycm9yLkNPTVBBU1NfSU5URVJOQUxfRVJSYCAKKy0gYENvbXBhc3NFcnJvci5DT01QQVNTX05PVF9TVVBQT1JURURgCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYENvbXBhc3NFcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIGBjb21wYXNzRXJyb3JgIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgorCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NFcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTUwZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc0Vycm9yLm1kCkBAIC0wLDAgKzEsMTEgQEAKK2NvbXBhc3NFcnJvcgorPT09PT09PT09PQorCitvbkVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBjb21wYXNzIGZ1bmN0aW9ucy4gCisKK0V4YW1wbGUKKy0tLS0tLS0KKworZnVuY3Rpb24oQ29tcGFzc0Vycm9yKSB7CisgICAgLy8gSGFuZGxlIHRoZSBlcnJvcgorfQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc0hlYWRpbmcubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbXBhc3MvcGFyYW1ldGVycy9jb21wYXNzSGVhZGluZy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTU3ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc0hlYWRpbmcubWQKQEAgLTAsMCArMSwzMyBAQAorY29tcGFzc0hlYWRpbmcKKz09PT09PT09PT0KKworQSBgQ29tcGFzc0hlYWRpbmdgIG9iamVjdCBpcyByZXR1cm5lZCB0byB0aGUgYGNvbXBhc3NTdWNjZXNzYCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorLSBfX21hZ25ldGljSGVhZGluZzpfXyBUaGUgaGVhZGluZyBpbiBkZWdyZWVzIGZyb20gMCAtIDM1OS45OSBhdCBhIHNpbmdsZSBtb21lbnQgaW4gdGltZS4gXyhOdW1iZXIpXworLSBfX3RydWVIZWFkaW5nOl9fIFRoZSBoZWFkaW5nIHJlbGF0aXZlIHRvIHRoZSBnZW9ncmFwaGljIE5vcnRoIFBvbGUgaW4gZGVncmVlcyAwIC0gMzU5Ljk5IGF0IGEgc2luZ2xlIG1vbWVudCBpbiB0aW1lLiBBIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0cnVlIGhlYWRpbmcgY291bGQgbm90IGJlIGRldGVybWluZWQuICBfKE51bWJlcilfCistIF9faGVhZGluZ0FjY3VyYWN5Ol9fIFRoZSBkZXZpYXRpb24gaW4gZGVncmVlcyBiZXR3ZWVuIHRoZSByZXBvcnRlZCBoZWFkaW5nIGFuZCB0aGUgdHJ1ZSBoZWFkaW5nLiBfKE51bWJlcilfCistIF9fdGltZXN0YW1wOl9fIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgaGVhZGluZyB3YXMgZGV0ZXJtaW5lZC4gIF8obWlsbGlzZWNvbmRzKV8KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBgQ29tcGFzc0hlYWRpbmdgIG9iamVjdCBpcyByZXR1cm5lZCB0byB0aGUgdXNlciB0aHJvdWdoIHRoZSBgY29tcGFzc1N1Y2Nlc3NgIGNhbGxiYWNrIGZ1bmN0aW9uLgorCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKy0gdHJ1ZUhlYWRpbmcgaXMgbm90IHN1cHBvcnRlZC4gSXQgd2lsbCByZXBvcnQgdGhlIHNhbWUgdmFsdWUgYXMgbWFnbmV0aWNIZWFkaW5nCistIGhlYWRpbmdBY2N1cmFjeSB3aWxsIGFsd2F5cyBiZSAwIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWFnbmV0aWNIZWFkaW5nIGFuZCB0cnVlSGVhZGluZyBvbiBBbmRyb2lkLgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tCisKKy0gdHJ1ZUhlYWRpbmcgaXMgb25seSByZXR1cm5lZCB3aGVuIGxvY2F0aW9uIHNlcnZpY2VzIGFyZSBydW5uaW5nIHZpYSBgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoTG9jYXRpb24oKWAKKy0gRm9yIGlPUyA+IDQgZGV2aWNlcywgaWYgdGhlIGRldmljZSBpcyByb3RhdGVkIGFuZCB0aGUgYXBwIHN1cHBvcnRzIHRoYXQgb3JpZW50YXRpb24sIHRoZSBoZWFkaW5nIHZhbHVlcyB3aWxsIGJlIHJlcG9ydGVkIAorYmFjayB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgb3JpZW50YXRpb24uIAorCitXaW5kb3dzIFBob25lIDcgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKKy0gcmV0dXJucyB0cnVlSGVhZGluZyBvbmx5LCBub3RlIHRoYXQgdGhpcyBjb2RlIGlzIGxhcmdlbHkgdW50ZXN0ZWQgYmVjYXVzZSBvZiBhIGxhY2sgb2YgZGV2aWNlcyB0aGF0IHN1cHBvcnQgY29tcGFzcy4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NPcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc09wdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhlOGJkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NPcHRpb25zLm1kCkBAIC0wLDAgKzEsMTkgQEAKK2NvbXBhc3NPcHRpb25zCis9PT09PT09PT09PT09PQorCitBbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gY3VzdG9taXplIHRoZSByZXRyaWV2YWwgb2YgdGhlIGNvbXBhc3MuCisKK09wdGlvbnMKKy0tLS0tLS0KKworLSBfX2ZyZXF1ZW5jeTpfXyBIb3cgb2Z0ZW4gdG8gcmV0cmlldmUgdGhlIGNvbXBhc3MgaGVhZGluZyBpbiBtaWxsaXNlY29uZHMuIF8oTnVtYmVyKV8gKERlZmF1bHQ6IDEwMCkKKy0gX19maWx0ZXI6X18gVGhlIGNoYW5nZSBpbiBkZWdyZWVzIHJlcXVpcmVkIHRvIGluaXRpYXRlIGEgd2F0Y2hIZWFkaW5nRmlsdGVyIHN1Y2Nlc3MgY2FsbGJhY2suIF8oTnVtYmVyKV8KKworQW5kcm9pZCBRdWlya3MKK19fX19fX19fX19fX19fCistIGZpbHRlciBpcyBub3Qgc3VwcG9ydGVkLgorCitXaW5kb3dzIFBob25lIDcgUXVpcmtzCistLS0tLS0tLS0tLS0tLQorCistIGZpbHRlciBpcyBub3Qgc3VwcG9ydGVkLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NTdWNjZXNzLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb21wYXNzL3BhcmFtZXRlcnMvY29tcGFzc1N1Y2Nlc3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxMmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29tcGFzcy9wYXJhbWV0ZXJzL2NvbXBhc3NTdWNjZXNzLm1kCkBAIC0wLDAgKzEsMjEgQEAKK2NvbXBhc3NTdWNjZXNzCis9PT09PT09PT09PT09PQorCitvblN1Y2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgY29tcGFzcyBoZWFkaW5nIGluZm9ybWF0aW9uIHZpYSBhIGNvbXBhc3NIZWFkaW5nIG9iamVjdC4KKworICAgIGZ1bmN0aW9uKGhlYWRpbmcpIHsKKyAgICAgICAgLy8gRG8gc29tZXRoaW5nCisgICAgfQorCitQYXJhbWV0ZXJzCistLS0tLS0tLS0tCisKKworLSBfX2hlYWRpbmc6X18gVGhlIGhlYWRpbmcgaW5mb3JtYXRpb24uIF8oY29tcGFzc0hlYWRpbmcpXworCitFeGFtcGxlCistLS0tLS0tCisKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoaGVhZGluZykgeworICAgICAgICBhbGVydCgnSGVhZGluZzogJyArIGhlYWRpbmcubWFnbmV0aWNIZWFkaW5nKTsKKyAgICB9OwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb25uZWN0aW9uL2Nvbm5lY3Rpb24ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2Nvbm5lY3Rpb24vY29ubmVjdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzAyZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb25uZWN0aW9uL2Nvbm5lY3Rpb24ubWQKQEAgLTAsMCArMSwyMyBAQAorQ29ubmVjdGlvbgorPT09PT09PT09PQorCis+IFRoZSBgY29ubmVjdGlvbmAgb2JqZWN0IGdpdmVzIGFjY2VzcyB0byB0aGUgZGV2aWNlJ3MgY2VsbHVsYXIgYW5kIHdpZmkgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4KKworVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdW5kZXIgdGhlIG5hdmlnYXRvci5uZXR3b3JrIGludGVyZmFjZS4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIGNvbm5lY3Rpb24udHlwZQorCitDb25zdGFudHMKKy0tLS0tLS0tLQorCistIENvbm5lY3Rpb24uVU5LTk9XTgorLSBDb25uZWN0aW9uLkVUSEVSTkVUCistIENvbm5lY3Rpb24uV0lGSQorLSBDb25uZWN0aW9uLkNFTExfMkcKKy0gQ29ubmVjdGlvbi5DRUxMXzNHCistIENvbm5lY3Rpb24uQ0VMTF80RworLSBDb25uZWN0aW9uLk5PTkUKKwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb25uZWN0aW9uL2Nvbm5lY3Rpb24udHlwZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29ubmVjdGlvbi9jb25uZWN0aW9uLnR5cGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzNDA1MAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29ubmVjdGlvbi9jb25uZWN0aW9uLnR5cGUubWQKQEAgLTAsMCArMSw4MiBAQAorY29ubmVjdGlvbi50eXBlCis9PT09PT09PT09PT09PT09PT09CisKK0NoZWNrcyB0aGUgYWN0aXZlIG5ldHdvcmsgY29ubmVjdGlvbiB0aGF0IGlzIGJlaW5nIHVzZWQuCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIHByb3BlcnR5IGlzIGEgZmFzdCB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBkZXZpY2UncyBuZXR3b3JrIGNvbm5lY3Rpb24gc3RhdGUsIGFuZCB0eXBlIG9mIGNvbm5lY3Rpb24uCisKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIGlPUworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGlvbigpIHsKKyAgICAgICAgdmFyIG5ldHdvcmtTdGF0ZSA9IG5hdmlnYXRvci5uZXR3b3JrLmNvbm5lY3Rpb24udHlwZTsKKyAgICAgICAgCisgICAgICAgIHZhciBzdGF0ZXMgPSB7fTsKKyAgICAgICAgc3RhdGVzW0Nvbm5lY3Rpb24uVU5LTk9XTl0JPSAnVW5rbm93biBjb25uZWN0aW9uJzsKKyAgICAgICAgc3RhdGVzW0Nvbm5lY3Rpb24uRVRIRVJORVRdCT0gJ0V0aGVybmV0IGNvbm5lY3Rpb24nOworICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5XSUZJXSAgIAk9ICdXaUZpIGNvbm5lY3Rpb24nOworICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5DRUxMXzJHXQk9ICdDZWxsIDJHIGNvbm5lY3Rpb24nOworICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5DRUxMXzNHXQk9ICdDZWxsIDNHIGNvbm5lY3Rpb24nOworICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5DRUxMXzRHXQk9ICdDZWxsIDRHIGNvbm5lY3Rpb24nOworICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5OT05FXSAgIAk9ICdObyBuZXR3b3JrIGNvbm5lY3Rpb24nOworICAgIAorICAgICAgICBhbGVydCgnQ29ubmVjdGlvbiB0eXBlOiAnICsgc3RhdGVzW25ldHdvcmtTdGF0ZV0pOworICAgIH0KKyAgICAKKyAgICBjaGVja0Nvbm5lY3Rpb24oKTsKKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPm5hdmlnYXRvci5uZXR3b3JrLmNvbm5lY3Rpb24udHlwZSBFeGFtcGxlPC90aXRsZT4KKyAgICAgICAgCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisgICAgICAgICAgICAKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLyAKKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIAorICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIGl0IGlzIG5vdyBzYWZlIHRvIG1ha2UgY2FsbHMgUGhvbmVHYXAgbWV0aG9kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgY2hlY2tDb25uZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgCisJICAgIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGlvbigpIHsKKwkgICAgICAgIHZhciBuZXR3b3JrU3RhdGUgPSBuYXZpZ2F0b3IubmV0d29yay5jb25uZWN0aW9uLnR5cGU7CisKKwkgICAgICAgIHZhciBzdGF0ZXMgPSB7fTsKKwkgICAgICAgIHN0YXRlc1tDb25uZWN0aW9uLlVOS05PV05dCT0gJ1Vua25vd24gY29ubmVjdGlvbic7CisJICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5FVEhFUk5FVF0JPSAnRXRoZXJuZXQgY29ubmVjdGlvbic7CisJICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5XSUZJXSAgIAk9ICdXaUZpIGNvbm5lY3Rpb24nOworCSAgICAgICAgc3RhdGVzW0Nvbm5lY3Rpb24uQ0VMTF8yR10JPSAnQ2VsbCAyRyBjb25uZWN0aW9uJzsKKwkgICAgICAgIHN0YXRlc1tDb25uZWN0aW9uLkNFTExfM0ddCT0gJ0NlbGwgM0cgY29ubmVjdGlvbic7CisJICAgICAgICBzdGF0ZXNbQ29ubmVjdGlvbi5DRUxMXzRHXQk9ICdDZWxsIDRHIGNvbm5lY3Rpb24nOworCSAgICAgICAgc3RhdGVzW0Nvbm5lY3Rpb24uTk9ORV0gICAJPSAnTm8gbmV0d29yayBjb25uZWN0aW9uJzsKKworCSAgICAgICAgYWxlcnQoJ0Nvbm5lY3Rpb24gdHlwZTogJyArIHN0YXRlc1tuZXR3b3JrU3RhdGVdKTsKKwkgICAgfQorICAgICAgICAKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPHA+QSBkaWFsb2cgYm94IHdpbGwgcmVwb3J0IHRoZSBuZXR3b3JrIHN0YXRlLjwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3QvY29udGFjdC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvQ29udGFjdC9jb250YWN0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjJlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3QvY29udGFjdC5tZApAQCAtMCwwICsxLDIwMiBAQAorQ29udGFjdAorPT09PT09PQorCitDb250YWlucyBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgYSBjb250YWN0LCBzdWNoIGFzIGEgdXNlcidzIHBlcnNvbmFsIG9yIGJ1c2luZXNzIGNvbnRhY3QuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2lkOl9fIEEgZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIuIF8oRE9NU3RyaW5nKV8KKy0gX19kaXNwbGF5TmFtZTpfXyBUaGUgbmFtZSBvZiB0aGlzIENvbnRhY3QsIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIGVuZC11c2Vycy4gXyhET01TdHJpbmcpXworLSBfX25hbWU6X18gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgb2YgYSBwZXJzb25zIG5hbWUuIF8oQ29udGFjdE5hbWUpXworLSBfX25pY2tuYW1lOl9fIEEgY2FzdWFsIG5hbWUgdG8gYWRkcmVzcyB0aGUgY29udGFjdCBieS4gXyhET01TdHJpbmcpXworLSBfX3Bob25lTnVtYmVyczpfXyBBbiBhcnJheSBvZiBhbGwgdGhlIGNvbnRhY3QncyBwaG9uZSBudW1iZXJzLiBfKENvbnRhY3RGaWVsZFtdKV8KKy0gX19lbWFpbHM6X18gQW4gYXJyYXkgb2YgYWxsIHRoZSBjb250YWN0J3MgZW1haWwgYWRkcmVzc2VzLiBfKENvbnRhY3RGaWVsZFtdKV8KKy0gX19hZGRyZXNzZXM6X18gQW4gYXJyYXkgb2YgYWxsIHRoZSBjb250YWN0J3MgYWRkcmVzc2VzLiBfKENvbnRhY3RBZGRyZXNzZXNbXSlfCistIF9faW1zOl9fIEFuIGFycmF5IG9mIGFsbCB0aGUgY29udGFjdCdzIElNIGFkZHJlc3Nlcy4gXyhDb250YWN0RmllbGRbXSlfCistIF9fb3JnYW5pemF0aW9uczpfXyBBbiBhcnJheSBvZiBhbGwgdGhlIGNvbnRhY3QncyBvcmdhbml6YXRpb25zLiBfKENvbnRhY3RPcmdhbml6YXRpb25bXSlfCistIF9fYmlydGhkYXk6X18gVGhlIGJpcnRoZGF5IG9mIHRoZSBjb250YWN0LiBfKERhdGUpXworLSBfX25vdGU6X18gQSBub3RlIGFib3V0IHRoZSBjb250YWN0LiBfKERPTVN0cmluZylfCistIF9fcGhvdG9zOl9fIEFuIGFycmF5IG9mIHRoZSBjb250YWN0J3MgcGhvdG9zLiBfKENvbnRhY3RGaWVsZFtdKV8KKy0gX19jYXRlZ29yaWVzOl9fICBBbiBhcnJheSBvZiBhbGwgdGhlIGNvbnRhY3RzIHVzZXIgZGVmaW5lZCBjYXRlZ29yaWVzLiBfKENvbnRhY3RGaWVsZFtdKV8KKy0gX191cmxzOl9fICBBbiBhcnJheSBvZiB3ZWIgcGFnZXMgYXNzb2NpYXRlZCB0byB0aGUgY29udGFjdC4gXyhDb250YWN0RmllbGRbXSlfCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBfX2Nsb25lX186IFJldHVybnMgYSBuZXcgQ29udGFjdCBvYmplY3QgdGhhdCBpcyBhIGRlZXAgY29weSBvZiB0aGUgY2FsbGluZyBvYmplY3QsIHdpdGggdGhlIGlkIHByb3BlcnR5IHNldCB0byBgbnVsbGAuIAorLSBfX3JlbW92ZV9fOiBSZW1vdmVzIHRoZSBjb250YWN0IGZyb20gdGhlIGRldmljZSBjb250YWN0cyBkYXRhYmFzZS4gIEFuIGVycm9yIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGEgYENvbnRhY3RFcnJvcmAgb2JqZWN0IGlmIHRoZSByZW1vdmFsIGlzIHVuc3VjY2Vzc2Z1bC4KKy0gX19zYXZlX186IFNhdmVzIGEgbmV3IGNvbnRhY3QgdG8gdGhlIGRldmljZSBjb250YWN0cyBkYXRhYmFzZSwgb3IgdXBkYXRlcyBhbiBleGlzdGluZyBjb250YWN0IGlmIGEgY29udGFjdCB3aXRoIHRoZSBzYW1lIF9faWRfXyBhbHJlYWR5IGV4aXN0cy4KKworCitEZXRhaWxzCistLS0tLS0tCisKK1RoZSBgQ29udGFjdGAgb2JqZWN0IHJlcHJlc2VudHMgYSB1c2VyIGNvbnRhY3QuICBDb250YWN0cyBjYW4gYmUgY3JlYXRlZCwgc2F2ZWQgdG8sIG9yIHJlbW92ZWQgZnJvbSB0aGUgZGV2aWNlIGNvbnRhY3RzIGRhdGFiYXNlLiAgQ29udGFjdHMgY2FuIGFsc28gYmUgcmV0cmlldmVkIChpbmRpdmlkdWFsbHkgb3IgaW4gYnVsaykgZnJvbSB0aGUgZGF0YWJhc2UgYnkgaW52b2tpbmcgdGhlIGBjb250YWN0cy5maW5kYCBtZXRob2QuCisKK19Ob3RlOiBOb3QgYWxsIG9mIHRoZSBhYm92ZSBjb250YWN0IGZpZWxkcyBhcmUgc3VwcG9ydGVkIG9uIGV2ZXJ5IGRldmljZSBwbGF0Zm9ybS4gIFBsZWFzZSBjaGVjayBlYWNoIHBsYXRmb3JtJ3MgUXVpcmtzIHNlY3Rpb24gZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZpZWxkcyBhcmUgc3VwcG9ydGVkLl8KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworCitTYXZlIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gb25TdWNjZXNzKGNvbnRhY3QpIHsKKwkJYWxlcnQoIlNhdmUgU3VjY2VzcyIpOworCX07CisKKwlmdW5jdGlvbiBvbkVycm9yKGNvbnRhY3RFcnJvcikgeworCQlhbGVydCgiRXJyb3IgPSAiICsgY29udGFjdEVycm9yLmNvZGUpOworCX07CisKKwkvLyBjcmVhdGUgYSBuZXcgY29udGFjdCBvYmplY3QKKyAgICB2YXIgY29udGFjdCA9IG5hdmlnYXRvci5jb250YWN0cy5jcmVhdGUoKTsKKwljb250YWN0LmRpc3BsYXlOYW1lID0gIlBsdW1iZXIiOworCWNvbnRhY3Qubmlja25hbWUgPSAiUGx1bWJlciI7IAkJLy9zcGVjaWZ5IGJvdGggdG8gc3VwcG9ydCBhbGwgZGV2aWNlcworCQorCS8vIHBvcHVsYXRlIHNvbWUgZmllbGRzCisJdmFyIG5hbWUgPSBuZXcgQ29udGFjdE5hbWUoKTsKKwluYW1lLmdpdmVuTmFtZSA9ICJKYW5lIjsKKwluYW1lLmZhbWlseU5hbWUgPSAiRG9lIjsKKwljb250YWN0Lm5hbWUgPSBuYW1lOworCQorCS8vIHNhdmUgdG8gZGV2aWNlCisJY29udGFjdC5zYXZlKG9uU3VjY2VzcyxvbkVycm9yKTsKKworQ2xvbmUgUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gY2xvbmUgdGhlIGNvbnRhY3Qgb2JqZWN0CisJdmFyIGNsb25lID0gY29udGFjdC5jbG9uZSgpOworCWNsb25lLm5hbWUuZ2l2ZW5OYW1lID0gIkpvaG4iOworCWNvbnNvbGUubG9nKCJPcmlnaW5hbCBjb250YWN0IG5hbWUgPSAiICsgY29udGFjdC5uYW1lLmdpdmVuTmFtZSk7CisJY29uc29sZS5sb2coIkNsb25lZCBjb250YWN0IG5hbWUgPSAiICsgY2xvbmUubmFtZS5naXZlbk5hbWUpOyAKKworUmVtb3ZlIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7CisgICAgICAgIGFsZXJ0KCJSZW1vdmFsIFN1Y2Nlc3MiKTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gb25FcnJvcihjb250YWN0RXJyb3IpIHsKKyAgICAgICAgYWxlcnQoIkVycm9yID0gIiArIGNvbnRhY3RFcnJvci5jb2RlKTsKKyAgICB9OworCisJLy8gcmVtb3ZlIHRoZSBjb250YWN0IGZyb20gdGhlIGRldmljZQorCWNvbnRhY3QucmVtb3ZlKG9uU3VjY2VzcyxvbkVycm9yKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkgICAgLy8gY3JlYXRlCisJCSAgICB2YXIgY29udGFjdCA9IG5hdmlnYXRvci5jb250YWN0cy5jcmVhdGUoKTsKKwkJCWNvbnRhY3QuZGlzcGxheU5hbWUgPSAiUGx1bWJlciI7CisJCQljb250YWN0Lm5pY2tuYW1lID0gIlBsdW1iZXIiOyAJCS8vc3BlY2lmeSBib3RoIHRvIHN1cHBvcnQgYWxsIGRldmljZXMKKwkJCXZhciBuYW1lID0gbmV3IENvbnRhY3ROYW1lKCk7CisJCQluYW1lLmdpdmVuTmFtZSA9ICJKYW5lIjsKKwkJCW5hbWUuZmFtaWx5TmFtZSA9ICJEb2UiOworCQkJY29udGFjdC5uYW1lID0gbmFtZTsKKworCQkJLy8gc2F2ZQorCQkJY29udGFjdC5zYXZlKG9uU2F2ZVN1Y2Nlc3Msb25TYXZlRXJyb3IpOworCQkJCisJCQkvLyBjbG9uZQorCQkJdmFyIGNsb25lID0gY29udGFjdC5jbG9uZSgpOworCQkJY2xvbmUubmFtZS5naXZlbk5hbWUgPSAiSm9obiI7CisJCQljb25zb2xlLmxvZygiT3JpZ2luYWwgY29udGFjdCBuYW1lID0gIiArIGNvbnRhY3QubmFtZS5naXZlbk5hbWUpOworCQkJY29uc29sZS5sb2coIkNsb25lZCBjb250YWN0IG5hbWUgPSAiICsgY2xvbmUubmFtZS5naXZlbk5hbWUpOyAKKwkJCQorCQkJLy8gcmVtb3ZlCisJCQljb250YWN0LnJlbW92ZShvblJlbW92ZVN1Y2Nlc3Msb25SZW1vdmVFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG9uU2F2ZVN1Y2Nlc3M6IEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGNvbnRhY3RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU2F2ZVN1Y2Nlc3MoY29udGFjdCkgeworCQkJYWxlcnQoIlNhdmUgU3VjY2VzcyIpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uU2F2ZUVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBjb250YWN0cworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblNhdmVFcnJvcihjb250YWN0RXJyb3IpIHsKKwkJCWFsZXJ0KCJFcnJvciA9ICIgKyBjb250YWN0RXJyb3IuY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG9uUmVtb3ZlU3VjY2VzczogR2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgY29udGFjdHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25SZW1vdmVTdWNjZXNzKGNvbnRhY3RzKSB7CisJCQlhbGVydCgiUmVtb3ZhbCBTdWNjZXNzIik7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gb25SZW1vdmVFcnJvcjogRmFpbGVkIHRvIGdldCB0aGUgY29udGFjdHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25SZW1vdmVFcnJvcihjb250YWN0RXJyb3IpIHsKKwkJCWFsZXJ0KCJFcnJvciA9ICIgKyBjb250YWN0RXJyb3IuY29kZSk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPkZpbmQgQ29udGFjdHM8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCitBbmRyb2lkIDIuWCBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLQorCistIF9fY2F0ZWdvcmllczpfXyAgVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydCBieSBBbmRyb2lkIDIuWCBkZXZpY2VzLCBhbmQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgYXMgYG51bGxgLgorCitBbmRyb2lkIDEuWCBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLQorCistIF9fbmFtZTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgMS5YIGRldmljZXMsIGFuZCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBhcyBgbnVsbGAuCistIF9fbmlja25hbWU6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzLCBhbmQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgYXMgYG51bGxgLgorLSBfX2JpcnRoZGF5Ol9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnQgYnkgQW5kcm9pZCAxLlggZGV2aWNlcywgYW5kIHdpbGwgYWx3YXlzIGJlIHJldHVybmVkIGFzIGBudWxsYC4KKy0gX19waG90b3M6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzLCBhbmQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgYXMgYG51bGxgLgorLSBfX2NhdGVnb3JpZXM6X18gIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnQgYnkgQW5kcm9pZCAxLlggZGV2aWNlcywgYW5kIHdpbGwgYWx3YXlzIGJlIHJldHVybmVkIGFzIGBudWxsYC4KKy0gX191cmxzOl9fICBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgMS5YIGRldmljZXMsIGFuZCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBhcyBgbnVsbGAuCisKKworQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gX19pZDpfXyBTdXBwb3J0ZWQuICBBc3NpZ25lZCBieSBkZXZpY2Ugd2hlbiBjb250YWN0IGlzIHNhdmVkLgorLSBfX2Rpc3BsYXlOYW1lOl9fIFN1cHBvcnRlZC4gIFN0b3JlZCBpbiBCbGFja0JlcnJ5IF9fdXNlcjFfXyBmaWVsZC4KKy0gX19uaWNrbmFtZTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBhcyBgbnVsbGAuIAorLSBfX3Bob25lTnVtYmVyczpfXyBQYXJ0aWFsbHkgc3VwcG9ydGVkLiAgUGhvbmUgbnVtYmVycyB3aWxsIGJlIHN0b3JlZCBpbiBCbGFja0JlcnJ5IGZpZWxkcyBfX2hvbWVQaG9uZTFfXyBhbmQgX19ob21lUGhvbmUyX18gaWYgX3R5cGVfIGlzICdob21lJywgX193b3JrUGhvbmUxX18gYW5kIF9fd29ya1Bob25lMl9fIGlmIF90eXBlXyBpcyAnd29yaycsIF9fbW9iaWxlUGhvbmVfXyBpZiBfdHlwZV8gaXMgJ21vYmlsZScsIF9fZmF4UGhvbmVfXyBpZiBfdHlwZV8gaXMgJ2ZheCcsIF9fcGFnZXJQaG9uZV9fIGlmIF90eXBlXyBpcyAncGFnZXInLCBhbmQgX19vdGhlclBob25lX18gaWYgX3R5cGVfIGlzIG5vbmUgb2YgdGhlIGFib3ZlLgorLSBfX2VtYWlsczpfXyBQYXJ0aWFsbHkgc3VwcG9ydGVkLiAgVGhlIGZpcnN0IHRocmVlIGVtYWlsIGFkZHJlc3NlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQmxhY2tCZXJyeSBfX2VtYWlsMV9fLCBfX2VtYWlsMl9fLCBhbmQgX19lbWFpbDNfXyBmaWVsZHMsIHJlc3BlY3RpdmVseS4KKy0gX19hZGRyZXNzZXM6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIFRoZSBmaXJzdCBhbmQgc2Vjb25kIGFkZHJlc3NlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQmxhY2tCZXJyeSBfX2hvbWVBZGRyZXNzX18gYW5kIF9fd29ya0FkZHJlc3NfXyBmaWVsZHMsIHJlc3BlY3RpdmVseS4KKy0gX19pbXM6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiAKKy0gX19vcmdhbml6YXRpb25zOl9fIFBhcnRpYWxseSBzdXBwb3J0ZWQuICBUaGUgX19uYW1lX18gYW5kIF9fdGl0bGVfXyBvZiB0aGUgZmlyc3Qgb3JnYW5pemF0aW9uIGFyZSBzdG9yZWQgaW4gdGhlIEJsYWNrQmVycnkgX19jb21wYW55X18gYW5kIF9fdGl0bGVfXyBmaWVsZHMsIHJlc3BlY3RpdmVseS4KKy0gX19waG90b3M6X18gLSBQYXJ0aWFsbHkgc3VwcG9ydGVkLiAgQSBzaW5nbGUgdGh1bWJuYWlsLXNpemVkIHBob3RvIGlzIHN1cHBvcnRlZC4gIFRvIHNldCBhIGNvbnRhY3QncyBwaG90bywgcGFzcyBpbiBhIGVpdGhlciBhIEJhc2U2NCBlbmNvZGVkIGltYWdlLCBvciBhIFVSTCBwb2ludGluZyB0byB0aGUgaW1hZ2UuICBUaGUgaW1hZ2Ugd2lsbCBiZSBzY2FsZWQgZG93biBiZWZvcmUgc2F2aW5nIHRvIHRoZSBCbGFja0JlcnJ5IGNvbnRhY3RzIGRhdGFiYXNlLiAgIFRoZSBjb250YWN0IHBob3RvIGlzIHJldHVybmVkIGFzIGEgQmFzZTY0IGVuY29kZWQgaW1hZ2UuCistIF9fY2F0ZWdvcmllczpfXyAgUGFydGlhbGx5IHN1cHBvcnRlZC4gIE9ubHkgJ0J1c2luZXNzJyBhbmQgJ1BlcnNvbmFsJyBjYXRlZ29yaWVzIGFyZSBzdXBwb3J0ZWQuIAorLSBfX3VybHM6X18gIFBhcnRpYWxseSBzdXBwb3J0ZWQuIFRoZSBmaXJzdCB1cmwgaXMgc3RvcmVkIGluIEJsYWNrQmVycnkgX193ZWJwYWdlX18gZmllbGQuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KKy0gX19kaXNwbGF5TmFtZTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgaU9TIGFuZCB3aWxsIGJlIHJldHVybmVkIGFzIGBudWxsYCB1bmxlc3MgdGhlcmUgaXMgbm8gQ29udGFjdE5hbWUgc3BlY2lmaWVkLiAgSWYgdGhlcmUgaXMgbm8gQ29udGFjdE5hbWUsIHRoZW4gY29tcG9zaXRlIG5hbWUsIF9fbmlja2FtZV9fIG9yICIiIGlzIHJldHVybmVkIGZvciBfX2Rpc3BsYXlOYW1lX18sIHJlc3BlY3RpdmVseS4gCistIF9fYmlydGhkYXk6X18gRm9yIGlucHV0LCB0aGlzIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgYXMgYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0LiBJdCBpcyByZXR1cm5lZCBhcyBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3QuCistIF9fcGhvdG9zOl9fIFJldHVybmVkIFBob3RvIGlzIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24ncyB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBhIEZpbGUgVVJMIHRvIHBob3RvIGlzIHJldHVybmVkLiAgQ29udGVudHMgb2YgdGVtcG9yYXJ5IGZvbGRlciBpcyBkZWxldGVkIHdoZW4gYXBwbGljYXRpb24gZXhpdHMuIAorLSBfX2NhdGVnb3JpZXM6X18gIFRoaXMgcHJvcGVydHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYW5kIHdpbGwgYWx3YXlzIGJlIHJldHVybmVkIGFzIGBudWxsYC4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEFkZHJlc3MvY29udGFjdGFkZHJlc3MubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RBZGRyZXNzL2NvbnRhY3RhZGRyZXNzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NGMxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RBZGRyZXNzL2NvbnRhY3RhZGRyZXNzLm1kCkBAIC0wLDAgKzEsMTQ1IEBACitDb250YWN0QWRkcmVzcworPT09PT09PT09PT09PT0KKworQ29udGFpbnMgYWRkcmVzcyBwcm9wZXJ0aWVzIGZvciBhIGBDb250YWN0YCBvYmplY3QuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKy0gX19wcmVmOl9fIFNldCB0byBgdHJ1ZWAgaWYgdGhpcyBgQ29udGFjdEFkZHJlc3NgIGNvbnRhaW5zIHRoZSB1c2VyJ3MgcHJlZmVycmVkIHZhbHVlLiBfKGJvb2xlYW4pXworLSBfX3R5cGU6X18gQSBzdHJpbmcgdGhhdCB0ZWxscyB5b3Ugd2hhdCB0eXBlIG9mIGZpZWxkIHRoaXMgaXMgKGV4YW1wbGU6ICdob21lJykuIF8oRE9NU3RyaW5nKQorLSBfX2Zvcm1hdHRlZDpfXyBUaGUgZnVsbCBhZGRyZXNzIGZvcm1hdHRlZCBmb3IgZGlzcGxheS4gXyhET01TdHJpbmcpXworLSBfX3N0cmVldEFkZHJlc3M6X18gVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuIF8oRE9NU3RyaW5nKV8KKy0gX19sb2NhbGl0eTpfXyBUaGUgY2l0eSBvciBsb2NhbGl0eS4gXyhET01TdHJpbmcpXworLSBfX3JlZ2lvbjpfXyBUaGUgc3RhdGUgb3IgcmVnaW9uLiBfKERPTVN0cmluZylfCistIF9fcG9zdGFsQ29kZTpfXyBUaGUgemlwIGNvZGUgb3IgcG9zdGFsIGNvZGUuIF8oRE9NU3RyaW5nKV8KKy0gX19jb3VudHJ5Ol9fIFRoZSBjb3VudHJ5IG5hbWUuIF8oRE9NU3RyaW5nKV8KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYENvbnRhY3RBZGRyZXNzYCBvYmplY3Qgc3RvcmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIGFkZHJlc3Mgb2YgYSBjb250YWN0LiAgQSBgQ29udGFjdGAgb2JqZWN0IGNhbiBoYXZlIG9uZSBvciBtb3JlIGFkZHJlc3NlcyBpbiBhICBgQ29udGFjdEFkZHJlc3NbXWAgYXJyYXkuIAorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworCS8vIGRpc3BsYXkgdGhlIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIGFsbCBjb250YWN0cworICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhjb250YWN0cykgeworCQlmb3IgKHZhciBpPTA7IGk8Y29udGFjdHMubGVuZ3RoOyBpKyspIHsKKwkJCWZvciAodmFyIGo9MDsgajxjb250YWN0c1tpXS5hZGRyZXNzZXMubGVuZ3RoOyBqKyspIHsKKwkJCQlhbGVydCgiUHJlZjogIiArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5wcmVmICsgIlxuIiArCisJCQkJCQkiVHlwZTogIiArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS50eXBlICsgIlxuIiArCisJCQkJCQkiRm9ybWF0dGVkOiAiICsgY29udGFjdHNbaV0uYWRkcmVzc2VzW2pdLmZvcm1hdHRlZCArICJcbiIgKyAKKwkJCQkJCSJTdHJlZXQgQWRkcmVzczogIiAgKyBjb250YWN0c1tpXS5hZGRyZXNzZXNbal0uc3RyZWV0QWRkcmVzcyArICJcbiIgKyAKKwkJCQkJCSJMb2NhbGl0eTogIiAgKyBjb250YWN0c1tpXS5hZGRyZXNzZXNbal0ubG9jYWxpdHkgKyAiXG4iICsgCisJCQkJCQkiUmVnaW9uOiAiICArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5yZWdpb24gKyAiXG4iICsgCisJCQkJCQkiUG9zdGFsIENvZGU6ICIgICsgY29udGFjdHNbaV0uYWRkcmVzc2VzW2pdLnBvc3RhbENvZGUgKyAiXG4iICsgCisJCQkJCQkiQ291bnRyeTogIiAgKyBjb250YWN0c1tpXS5hZGRyZXNzZXNbal0uY291bnRyeSk7CisJCQl9CisJCX0KKyAgICB9OworCisgICAgZnVuY3Rpb24gb25FcnJvcihjb250YWN0RXJyb3IpIHsKKyAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgfTsKKworICAgIC8vIGZpbmQgYWxsIGNvbnRhY3RzCisgICAgdmFyIG9wdGlvbnMgPSBuZXcgQ29udGFjdEZpbmRPcHRpb25zKCk7CisJb3B0aW9ucy5maWx0ZXI9IiI7IAorCXZhciBmaWx0ZXIgPSBbImRpc3BsYXlOYW1lIiwiYWRkcmVzc2VzIl07CisgICAgbmF2aWdhdG9yLmNvbnRhY3RzLmZpbmQoZmlsdGVyLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCSAgICAvLyBmaW5kIGFsbCBjb250YWN0cworCQkgICAgdmFyIG9wdGlvbnMgPSBuZXcgQ29udGFjdEZpbmRPcHRpb25zKCk7CisJCQlvcHRpb25zLmZpbHRlcj0iIjsgCisJCQl2YXIgZmlsdGVyID0gWyJkaXNwbGF5TmFtZSIsImFkZHJlc3NlcyJdOworCQkgICAgbmF2aWdhdG9yLmNvbnRhY3RzLmZpbmQoZmlsdGVyLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uU3VjY2VzczogR2V0IGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgY29udGFjdHMKKyAgICAgICAgLy8KKwkJZnVuY3Rpb24gb25TdWNjZXNzKGNvbnRhY3RzKSB7CisJCQkvLyBkaXNwbGF5IHRoZSBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciBhbGwgY29udGFjdHMKKwkJCWZvciAodmFyIGk9MDsgaTxjb250YWN0cy5sZW5ndGg7IGkrKykgeworCQkJCWZvciAodmFyIGo9MDsgajxjb250YWN0c1tpXS5hZGRyZXNzZXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJYWxlcnQoIlByZWY6ICIgKyBjb250YWN0c1tpXS5hZGRyZXNzZXNbal0ucHJlZiArICJcbiIgKworCQkJCQkJCSJUeXBlOiAiICsgY29udGFjdHNbaV0uYWRkcmVzc2VzW2pdLnR5cGUgKyAiXG4iICsKKwkJCQkJCQkiRm9ybWF0dGVkOiAiICsgY29udGFjdHNbaV0uYWRkcmVzc2VzW2pdLmZvcm1hdHRlZCArICJcbiIgKyAKKwkJCQkJCQkiU3RyZWV0IEFkZHJlc3M6ICIgICsgY29udGFjdHNbaV0uYWRkcmVzc2VzW2pdLnN0cmVldEFkZHJlc3MgKyAiXG4iICsgCisJCQkJCQkJIkxvY2FsaXR5OiAiICArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5sb2NhbGl0eSArICJcbiIgKyAKKwkJCQkJCQkiUmVnaW9uOiAiICArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5yZWdpb24gKyAiXG4iICsgCisJCQkJCQkJIlBvc3RhbCBDb2RlOiAiICArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5wb3N0YWxDb2RlICsgIlxuIiArIAorCQkJCQkJCSJDb3VudHJ5OiAiICArIGNvbnRhY3RzW2ldLmFkZHJlc3Nlc1tqXS5jb3VudHJ5KTsKKwkJCQl9CisJCQl9CisJCX07CisgICAgCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGNvbnRhY3RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29udGFjdEVycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+RmluZCBDb250YWN0czwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK0FuZHJvaWQgMi5YIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gX19wcmVmOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIDIuWCBkZXZpY2VzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYGZhbHNlYC4KKworQW5kcm9pZCAxLlggUXVpcmtzCistLS0tLS0tLS0tLS0tLS0tLS0KKworLSBfX3ByZWY6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFuZHJvaWQgMS5YIGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLgorLSBfX3R5cGU6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFuZHJvaWQgMS5YIGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgbnVsbGAuCistIF9fc3RyZWV0QWRkcmVzczpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgMS5YIGRldmljZXMsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorLSBfX2xvY2FsaXR5Ol9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnQgYnkgQW5kcm9pZCAxLlggZGV2aWNlcywgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgbnVsbGAuCistIF9fcmVnaW9uOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnQgYnkgQW5kcm9pZCAxLlggZGV2aWNlcywgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgbnVsbGAuCistIF9fcG9zdGFsQ29kZTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgMS5YIGRldmljZXMsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorLSBfX2NvdW50cnk6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzLCBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGBudWxsYC4KKworQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gX19wcmVmOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBvbiBCbGFja2JlcnJ5IGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLgorLSBfX3R5cGU6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIE9ubHkgb25lIGVhY2ggb2YgIldvcmsiIGFuZCAiSG9tZSIgdHlwZSBhZGRyZXNzZXMgY2FuIGJlIHN0b3JlZCBwZXIgY29udGFjdC4gCistIF9fZm9ybWF0dGVkOl9fIFBhcnRpYWxseSBzdXBwb3J0ZWQuICBXaWxsIHJldHVybiBjb25jYXRlbmF0aW9uIG9mIGFsbCBCbGFja0JlcnJ5IGFkZHJlc3MgZmllbGRzLgorLSBfX3N0cmVldEFkZHJlc3M6X18gU3VwcG9ydGVkLiAgV2lsbCByZXR1cm4gY29uY2F0ZW5hdGlvbiBvZiBCbGFja0JlcnJ5IF9fYWRkcmVzczFfXyBhbmQgX19hZGRyZXNzMl9fIGFkZHJlc3MgZmllbGRzLiAKKy0gX19sb2NhbGl0eTpfXyBTdXBwb3J0ZWQuICBTdG9yZWQgaW4gQmxhY2tCZXJyeSBfX2NpdHlfXyBhZGRyZXNzIGZpZWxkLgorLSBfX3JlZ2lvbjpfXyBTdXBwb3J0ZWQuICBTdG9yZWQgaW4gQmxhY2tCZXJyeSBfX3N0YXRlUHJvdmluY2VfXyBhZGRyZXNzIGZpZWxkLgorLSBfX3Bvc3RhbENvZGU6X18gU3VwcG9ydGVkLiAgU3RvcmVkIGluIEJsYWNrQmVycnkgX196aXBQb3N0YWxfXyBhZGRyZXNzIGZpZWxkLgorLSBfX2NvdW50cnk6X18gU3VwcG9ydGVkLgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tCistIF9fcHJlZjpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaU9TIGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLgorLSBfX2Zvcm1hdHRlZDpfXyBOb3QgY3VycmVudGx5IHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEVycm9yL2NvbnRhY3RFcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvQ29udGFjdEVycm9yL2NvbnRhY3RFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJkOWZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RXJyb3IvY29udGFjdEVycm9yLm1kCkBAIC0wLDAgKzEsMjYgQEAKK0NvbnRhY3RFcnJvcgorPT09PT09PT0KKworQSBgQ29udGFjdEVycm9yYCBvYmplY3QgaXMgcmV0dXJuZWQgdG8gdGhlIGBjb250YWN0RXJyb3JgIGNhbGxiYWNrIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19jb2RlOl9fIE9uZSBvZiB0aGUgcHJlZGVmaW5lZCBlcnJvciBjb2RlcyBsaXN0ZWQgYmVsb3cuCisKK0NvbnN0YW50cworLS0tLS0tLS0tCisKKy0gYENvbnRhY3RFcnJvci5VTktOT1dOX0VSUk9SYAorLSBgQ29udGFjdEVycm9yLklOVkFMSURfQVJHVU1FTlRfRVJST1JgCistIGBDb250YWN0RXJyb3IuVElNRU9VVF9FUlJPUmAKKy0gYENvbnRhY3RFcnJvci5QRU5ESU5HX09QRVJBVElPTl9FUlJPUmAKKy0gYENvbnRhY3RFcnJvci5JT19FUlJPUmAKKy0gYENvbnRhY3RFcnJvci5OT1RfU1VQUE9SVEVEX0VSUk9SYAorLSBgQ29udGFjdEVycm9yLlBFUk1JU1NJT05fREVOSUVEX0VSUk9SYAorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIGBDb250YWN0RXJyb3JgIG9iamVjdCBpcyByZXR1cm5lZCB0byB0aGUgdXNlciB0aHJvdWdoIHRoZSBgY29udGFjdEVycm9yYCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RmllbGQvY29udGFjdGZpZWxkLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RmllbGQvY29udGFjdGZpZWxkLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjBhOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RmllbGQvY29udGFjdGZpZWxkLm1kCkBAIC0wLDAgKzEsMTIyIEBACitDb250YWN0RmllbGQKKz09PT09PT09PT09PQorCitTdXBwb3J0cyBnZW5lcmljIGZpZWxkcyBpbiBhIGBDb250YWN0YCBvYmplY3QuICBTb21lIHByb3BlcnRpZXMgdGhhdCBhcmUgc3RvcmVkIGFzIGBDb250YWN0RmllbGRgIG9iamVjdHMgaW5jbHVkZSBlbWFpbCBhZGRyZXNzZXMsIHBob25lIG51bWJlcnMsIGFuZCB1cmxzLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX190eXBlOl9fIEEgc3RyaW5nIHRoYXQgdGVsbHMgeW91IHdoYXQgdHlwZSBvZiBmaWVsZCB0aGlzIGlzIChleGFtcGxlOiAnaG9tZScpLiBfKERPTVN0cmluZylfCistIF9fdmFsdWU6X18gVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCAoc3VjaCBhcyBhIHBob25lIG51bWJlciBvciBlbWFpbCBhZGRyZXNzKS4gXyhET01TdHJpbmcpXworLSBfX3ByZWY6X18gU2V0IHRvIGB0cnVlYCBpZiB0aGlzIGBDb250YWN0RmllbGRgIGNvbnRhaW5zIHRoZSB1c2VyJ3MgcHJlZmVycmVkIHZhbHVlLiBfKGJvb2xlYW4pXworCitEZXRhaWxzCistLS0tLS0tCisKK1RoZSBgQ29udGFjdEZpZWxkYCBvYmplY3QgaXMgYSByZXVzYWJsZSBjb21wb25lbnQgdGhhdCBpcyB1c2VkIHRvIHN1cHBvcnQgY29udGFjdCBmaWVsZHMgaW4gYSBnZW5lcmljIGZhc2hpb24uICBFYWNoIGBDb250YWN0RmllbGRgIG9iamVjdCBjb250YWlucyBhIHZhbHVlIHByb3BlcnR5LCBhIHR5cGUgcHJvcGVydHksIGFuZCBhIHByZWYgcHJvcGVydHkuICBBIGBDb250YWN0YCBvYmplY3Qgc3RvcmVzIHNldmVyYWwgcHJvcGVydGllcyBpbiBgQ29udGFjdEZpZWxkW11gIGFycmF5cywgc3VjaCBhcyBwaG9uZSBudW1iZXJzIGFuZCBlbWFpbCBhZGRyZXNzZXMuCisKK0luIG1vc3QgaW5zdGFuY2VzLCB0aGVyZSBhcmUgbm8gcHJlLWRldGVybWluZWQgdmFsdWVzIGZvciB0aGUgX190eXBlX18gYXR0cmlidXRlIG9mIGEgYENvbnRhY3RGaWVsZGAgb2JqZWN0LiAgRm9yIGV4YW1wbGUsIGEgcGhvbmUgbnVtYmVyIGNhbiBoYXZlIF9fdHlwZV9fIHZhbHVlcyBvZiAnaG9tZScsICd3b3JrJywgJ21vYmlsZScsICdpUGhvbmUnLCBvciBhbnkgb3RoZXIgdmFsdWUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRhY3QgZGF0YWJhc2Ugb24gYSBwYXJ0aWN1bGFyIGRldmljZSBwbGF0Zm9ybS4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIHRoZSBgQ29udGFjdGAgX19waG90b3NfXyBmaWVsZCwgUGhvbmVHYXAgbWFrZXMgdXNlIG9mIHRoZSBfX3R5cGVfXyBmaWVsZCB0byBpbmRpY2F0ZSB0aGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBpbWFnZS4gIFBob25lR2FwIHdpbGwgcmV0dXJuIF9fdHlwZTogJ3VybCdfXyB3aGVuIHRoZSBfX3ZhbHVlX18gYXR0cmlidXRlIGNvbnRhaW5zIGEgVVJMIHRvIHRoZSBwaG90byBpbWFnZSwgb3IgX190eXBlOiAnYmFzZTY0J19fIHdoZW4gdGhlIHJldHVybmVkIF9fdmFsdWVfXyBhdHRyaWJ1dGUgY29udGFpbnMgYSBCYXNlNjQgZW5jb2RlZCBpbWFnZSBzdHJpbmcuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisJLy8gY3JlYXRlIGEgbmV3IGNvbnRhY3QKKwl2YXIgY29udGFjdCA9IG5hdmlnYXRvci5jb250YWN0cy5jcmVhdGUoKTsKKwkKKwkvLyBzdG9yZSBjb250YWN0IHBob25lIG51bWJlcnMgaW4gQ29udGFjdEZpZWxkW10KKwl2YXIgcGhvbmVOdW1iZXJzID0gWzNdOworCXBob25lTnVtYmVyc1swXSA9IG5ldyBDb250YWN0RmllbGQoJ3dvcmsnLCAnMjEyLTU1NS0xMjM0JywgZmFsc2UpOworCXBob25lTnVtYmVyc1sxXSA9IG5ldyBDb250YWN0RmllbGQoJ21vYmlsZScsICc5MTctNTU1LTU0MzInLCB0cnVlKTsgLy8gcHJlZmVycmVkIG51bWJlcgorCXBob25lTnVtYmVyc1syXSA9IG5ldyBDb250YWN0RmllbGQoJ2hvbWUnLCAnMjAzLTU1NS03ODkwJywgZmFsc2UpOworCWNvbnRhY3QucGhvbmVOdW1iZXJzID0gcGhvbmVOdW1iZXJzOworCQorCS8vIHNhdmUgdGhlIGNvbnRhY3QKKwljb250YWN0LnNhdmUoKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJLy8gY3JlYXRlIGEgbmV3IGNvbnRhY3QKKwkJCXZhciBjb250YWN0ID0gbmF2aWdhdG9yLmNvbnRhY3RzLmNyZWF0ZSgpOworCisJCQkvLyBzdG9yZSBjb250YWN0IHBob25lIG51bWJlcnMgaW4gQ29udGFjdEZpZWxkW10KKwkJCXZhciBwaG9uZU51bWJlcnMgPSBbM107CisJCQlwaG9uZU51bWJlcnNbMF0gPSBuZXcgQ29udGFjdEZpZWxkKCd3b3JrJywgJzIxMi01NTUtMTIzNCcsIGZhbHNlKTsKKwkJCXBob25lTnVtYmVyc1sxXSA9IG5ldyBDb250YWN0RmllbGQoJ21vYmlsZScsICc5MTctNTU1LTU0MzInLCB0cnVlKTsgLy8gcHJlZmVycmVkIG51bWJlcgorCQkJcGhvbmVOdW1iZXJzWzJdID0gbmV3IENvbnRhY3RGaWVsZCgnaG9tZScsICcyMDMtNTU1LTc4OTAnLCBmYWxzZSk7CisJCQljb250YWN0LnBob25lTnVtYmVycyA9IHBob25lTnVtYmVyczsKKworCQkJLy8gc2F2ZSB0aGUgY29udGFjdAorCQkJY29udGFjdC5zYXZlKCk7CisKKwkJCS8vIHNlYXJjaCBjb250YWN0cywgcmV0dXJuaW5nIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmUgbnVtYmVycworCQkJdmFyIG9wdGlvbnMgPSBuZXcgQ29udGFjdEZpbmRPcHRpb25zKCk7CisJCQlvcHRpb25zLmZpbHRlcj0iIjsKKwkJCWZpbHRlciA9IFsiZGlzcGxheU5hbWUiLCJwaG9uZU51bWJlcnMiXTsKKwkJCW5hdmlnYXRvci5jb250YWN0cy5maW5kKGZpbHRlciwgb25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3M6IEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGNvbnRhY3RzCisgICAgICAgIC8vCisJCWZ1bmN0aW9uIG9uU3VjY2Vzcyhjb250YWN0cykgeworCQkJZm9yICh2YXIgaT0wOyBpPGNvbnRhY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gZGlzcGxheSBwaG9uZSBudW1iZXJzCisJCQkJZm9yICh2YXIgaj0wOyBqPGNvbnRhY3RzW2ldLnBob25lTnVtYmVycy5sZW5ndGg7IGorKykgeworCQkJCQlhbGVydCgiVHlwZTogIiArIGNvbnRhY3RzW2ldLnBob25lTnVtYmVyc1tqXS50eXBlICsgIlxuIiArIAorCQkJCQkJCSJWYWx1ZTogIiAgKyBjb250YWN0c1tpXS5waG9uZU51bWJlcnNbal0udmFsdWUgKyAiXG4iICsgCisJCQkJCQkJIlByZWZlcnJlZDogIiAgKyBjb250YWN0c1tpXS5waG9uZU51bWJlcnNbal0ucHJlZik7CisJCQkJfQorCQkJfQorCQl9OworICAgIAorICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBjb250YWN0cworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGNvbnRhY3RFcnJvcikgeworICAgICAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPkZpbmQgQ29udGFjdHM8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBfX3ByZWY6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydCBieSBBbmRyb2lkIGRldmljZXMsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYGZhbHNlYC4KKworQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBfX3R5cGU6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIFVzZWQgZm9yIHBob25lIG51bWJlcnMuCistIF9fdmFsdWU6X18gU3VwcG9ydGVkLgorLSBfX3ByZWY6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGBmYWxzZWAuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0tCistIF9fcHJlZjpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaU9TIGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RmluZE9wdGlvbnMvY29udGFjdGZpbmRvcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0RmluZE9wdGlvbnMvY29udGFjdGZpbmRvcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmJhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RGaW5kT3B0aW9ucy9jb250YWN0ZmluZG9wdGlvbnMubWQKQEAgLTAsMCArMSw5MyBAQAorQ29udGFjdEZpbmRPcHRpb25zCis9PT09PT09PT09PT09PT09PT0KKworQ29udGFpbnMgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cyBvZiBhIGBjb250YWN0cy5maW5kYCBvcGVyYXRpb24uCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2ZpbHRlcjpfXyBUaGUgc2VhcmNoIHN0cmluZyB1c2VkIHRvIGZpbmQgY29udGFjdHMuIF8oRE9NU3RyaW5nKV8gKERlZmF1bHQ6ICIiKQorLSBfX211bHRpcGxlOl9fIERldGVybWluZXMgaWYgdGhlIGZpbmQgb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gbXVsdGlwbGUgY29udGFjdHMuIF8oQm9vbGVhbilfIChEZWZhdWx0OiBmYWxzZSkKKworCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworCS8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoY29udGFjdHMpIHsKKwkJZm9yICh2YXIgaT0wOyBpPGNvbnRhY3RzLmxlbmd0aDsgaSsrKSB7CisJCQlhbGVydChjb250YWN0c1tpXS5kaXNwbGF5TmFtZSk7CisJCX0KKyAgICB9OworCisJLy8gZXJyb3IgY2FsbGJhY2sKKyAgICBmdW5jdGlvbiBvbkVycm9yKGNvbnRhY3RFcnJvcikgeworICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICB9OworCisJLy8gc3BlY2lmeSBjb250YWN0IHNlYXJjaCBjcml0ZXJpYQorICAgIHZhciBvcHRpb25zID0gbmV3IENvbnRhY3RGaW5kT3B0aW9ucygpOworCW9wdGlvbnMuZmlsdGVyPSIiOwkJCS8vIGVtcHR5IHNlYXJjaCBzdHJpbmcgcmV0dXJucyBhbGwgY29udGFjdHMKKwlvcHRpb25zLm11bHRpcGxlPXRydWU7CQkvLyByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cworCWZpbHRlciA9IFsiZGlzcGxheU5hbWUiXTsJLy8gcmV0dXJuIGNvbnRhY3QuZGlzcGxheU5hbWUgZmllbGQKKwkKKwkvLyBmaW5kIGNvbnRhY3RzCisgICAgbmF2aWdhdG9yLmNvbnRhY3RzLmZpbmQoZmlsdGVyLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQkvLyBzcGVjaWZ5IGNvbnRhY3Qgc2VhcmNoIGNyaXRlcmlhCisJCSAgICB2YXIgb3B0aW9ucyA9IG5ldyBDb250YWN0RmluZE9wdGlvbnMoKTsKKwkJCW9wdGlvbnMuZmlsdGVyPSIiOwkJCS8vIGVtcHR5IHNlYXJjaCBzdHJpbmcgcmV0dXJucyBhbGwgY29udGFjdHMKKwkJCW9wdGlvbnMubXVsdGlwbGU9dHJ1ZTsJCS8vIHJldHVybiBtdWx0aXBsZSByZXN1bHRzCisJCQlmaWx0ZXIgPSBbImRpc3BsYXlOYW1lIl07CS8vIHJldHVybiBjb250YWN0LmRpc3BsYXlOYW1lIGZpZWxkCisKKwkJCS8vIGZpbmQgY29udGFjdHMKKwkJICAgIG5hdmlnYXRvci5jb250YWN0cy5maW5kKGZpbHRlciwgb25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3M6IEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGNvbnRhY3RzCisgICAgICAgIC8vCisJCWZ1bmN0aW9uIG9uU3VjY2Vzcyhjb250YWN0cykgeworCQkJZm9yICh2YXIgaT0wOyBpPGNvbnRhY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJYWxlcnQoY29udGFjdHNbaV0uZGlzcGxheU5hbWUpOworCQkJfQorCQl9OworICAgIAorICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBjb250YWN0cworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGNvbnRhY3RFcnJvcikgeworICAgICAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPkZpbmQgQ29udGFjdHM8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3ROYW1lL2NvbnRhY3RuYW1lLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0TmFtZS9jb250YWN0bmFtZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk5ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9Db250YWN0TmFtZS9jb250YWN0bmFtZS5tZApAQCAtMCwwICsxLDExOCBAQAorQ29udGFjdE5hbWUKKz09PT09PT09PT09CisKK0NvbnRhaW5zIG5hbWUgcHJvcGVydGllcyBvZiBhIGBDb250YWN0YCBvYmplY3QuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2Zvcm1hdHRlZDpfXyBUaGUgY29tcGxldGUgbmFtZSBvZiB0aGUgY29udGFjdC4gXyhET01TdHJpbmcpXworLSBfX2ZhbWlseU5hbWU6X18gVGhlIGNvbnRhY3RzIGZhbWlseSBuYW1lLiBfKERPTVN0cmluZylfCistIF9fZ2l2ZW5OYW1lOl9fIFRoZSBjb250YWN0cyBnaXZlbiBuYW1lLiBfKERPTVN0cmluZylfCistIF9fbWlkZGxlTmFtZTpfXyBUaGUgY29udGFjdHMgbWlkZGxlIG5hbWUuIF8oRE9NU3RyaW5nKV8KKy0gX19ob25vcmlmaWNQcmVmaXg6X18gVGhlIGNvbnRhY3RzIHByZWZpeCAoZXhhbXBsZSBNci4gb3IgRHIuKSBfKERPTVN0cmluZylfCistIF9faG9ub3JpZmljU3VmZml4Ol9fIFRoZSBjb250YWN0cyBzdWZmaXggKGV4YW1wbGUgRXNxLikuIF8oRE9NU3RyaW5nKV8KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYENvbnRhY3ROYW1lYCBvYmplY3Qgc3RvcmVzIG5hbWUgcHJvcGVydGllcyBvZiBhIGNvbnRhY3QuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkIDIuWAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhjb250YWN0cykgeworCQlmb3IgKHZhciBpPTA7IGk8Y29udGFjdHMubGVuZ3RoOyBpKyspIHsKKwkJCWFsZXJ0KCJGb3JtYXR0ZWQ6ICIgKyBjb250YWN0c1tpXS5uYW1lLmZvcm1hdHRlZCArICJcbiIgKyAKKwkJCQkJIkZhbWlseSBOYW1lOiAiICArIGNvbnRhY3RzW2ldLm5hbWUuZmFtaWx5TmFtZSArICJcbiIgKyAKKwkJCQkJIkdpdmVuIE5hbWU6ICIgICsgY29udGFjdHNbaV0ubmFtZS5naXZlbk5hbWUgKyAiXG4iICsgCisJCQkJCSJNaWRkbGUgTmFtZTogIiAgKyBjb250YWN0c1tpXS5uYW1lLm1pZGRsZU5hbWUgKyAiXG4iICsgCisJCQkJCSJTdWZmaXg6ICIgICsgY29udGFjdHNbaV0ubmFtZS5ob25vcmlmaWNTdWZmaXggKyAiXG4iICsgCisJCQkJCSJQcmVmaXg6ICIgICsgY29udGFjdHNbaV0ubmFtZS5ob25vcmlmaWNTdWZmaXgpOworCQl9CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29udGFjdEVycm9yKSB7CisgICAgICAgIGFsZXJ0KCdvbkVycm9yIScpOworICAgIH07CisKKyAgICB2YXIgb3B0aW9ucyA9IG5ldyBDb250YWN0RmluZE9wdGlvbnMoKTsKKwlvcHRpb25zLmZpbHRlcj0iIjsKKwlmaWx0ZXIgPSBbImRpc3BsYXlOYW1lIiwibmFtZSJdOworICAgIG5hdmlnYXRvci5jb250YWN0cy5maW5kKGZpbHRlciwgb25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJdmFyIG9wdGlvbnMgPSBuZXcgQ29udGFjdEZpbmRPcHRpb25zKCk7CisJCQlvcHRpb25zLmZpbHRlcj0iIjsKKwkJCWZpbHRlciA9IFsiZGlzcGxheU5hbWUiLCJuYW1lIl07CisJCQluYXZpZ2F0b3IuY29udGFjdHMuZmluZChmaWx0ZXIsIG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gb25TdWNjZXNzOiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBjb250YWN0cworICAgICAgICAvLworCQlmdW5jdGlvbiBvblN1Y2Nlc3MoY29udGFjdHMpIHsKKwkJCWZvciAodmFyIGk9MDsgaTxjb250YWN0cy5sZW5ndGg7IGkrKykgeworCQkJCWFsZXJ0KCJGb3JtYXR0ZWQ6ICIgKyBjb250YWN0c1tpXS5uYW1lLmZvcm1hdHRlZCArICJcbiIgKyAKKwkJCQkJCSJGYW1pbHkgTmFtZTogIiAgKyBjb250YWN0c1tpXS5uYW1lLmZhbWlseU5hbWUgKyAiXG4iICsgCisJCQkJCQkiR2l2ZW4gTmFtZTogIiAgKyBjb250YWN0c1tpXS5uYW1lLmdpdmVuTmFtZSArICJcbiIgKyAKKwkJCQkJCSJNaWRkbGUgTmFtZTogIiAgKyBjb250YWN0c1tpXS5uYW1lLm1pZGRsZU5hbWUgKyAiXG4iICsgCisJCQkJCQkiU3VmZml4OiAiICArIGNvbnRhY3RzW2ldLm5hbWUuaG9ub3JpZmljU3VmZml4ICsgIlxuIiArIAorCQkJCQkJIlByZWZpeDogIiAgKyBjb250YWN0c1tpXS5uYW1lLmhvbm9yaWZpY1ByZWZpeCk7CisJCQl9CisJCX07CisgICAgCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGNvbnRhY3RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29udGFjdEVycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+RmluZCBDb250YWN0czwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK0FuZHJvaWQgUXVpcmtzCistLS0tLS0tLS0tLS0KKy0gX19mb3JtYXR0ZWQ6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIFdpbGwgcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIGhvbm9yaWZpY1ByZWZpeCwgZ2l2ZW5OYW1lLCBtaWRkbGVOYW1lLCBmYW1pbHlOYW1lIGFuZCBob25vcmlmaWNTdWZmaXggYnV0IHdpbGwgbm90IHN0b3JlLgorCitCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikgUXVpcmtzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBfX2Zvcm1hdHRlZDpfXyBQYXJ0aWFsbHkgc3VwcG9ydGVkLiAgV2lsbCByZXR1cm4gY29uY2F0ZW5hdGlvbiBvZiBCbGFja0JlcnJ5IF9fZmlyc3ROYW1lX18gYW5kIF9fbGFzdE5hbWVfXyBmaWVsZHMuCistIF9fZmFtaWx5TmFtZTpfXyBTdXBwb3J0ZWQuICBTdG9yZWQgaW4gQmxhY2tCZXJyeSBfX2xhc3ROYW1lX18gZmllbGQuCistIF9fZ2l2ZW5OYW1lOl9fIFN1cHBvcnRlZC4gIFN0b3JlZCBpbiBCbGFja0JlcnJ5IF9fZmlyc3ROYW1lX18gZmllbGQuCistIF9fbWlkZGxlTmFtZTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorLSBfX2hvbm9yaWZpY1ByZWZpeDpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorLSBfX2hvbm9yaWZpY1N1ZmZpeDpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tLS0KKy0gX19mb3JtYXR0ZWQ6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIFdpbGwgcmV0dXJuIGlPUyBDb21wb3NpdGUgTmFtZSBidXQgd2lsbCBub3Qgc3RvcmUuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RPcmdhbml6YXRpb24vY29udGFjdG9yZ2FuaXphdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvQ29udGFjdE9yZ2FuaXphdGlvbi9jb250YWN0b3JnYW5pemF0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjRmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL0NvbnRhY3RPcmdhbml6YXRpb24vY29udGFjdG9yZ2FuaXphdGlvbi5tZApAQCAtMCwwICsxLDEzMSBAQAorQ29udGFjdE9yZ2FuaXphdGlvbgorPT09PT09PT09PT09PT09PT09PQorCitDb250YWlucyBvcmdhbml6YXRpb24gcHJvcGVydGllcyBvZiBhIGBDb250YWN0YCBvYmplY3QuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKy0gX19wcmVmOl9fIFNldCB0byBgdHJ1ZWAgaWYgdGhpcyBgQ29udGFjdE9yZ2FuaXphdGlvbmAgY29udGFpbnMgdGhlIHVzZXIncyBwcmVmZXJyZWQgdmFsdWUuIF8oYm9vbGVhbilfCistIF9fdHlwZTpfXyBBIHN0cmluZyB0aGF0IHRlbGxzIHlvdSB3aGF0IHR5cGUgb2YgZmllbGQgdGhpcyBpcyAoZXhhbXBsZTogJ2hvbWUnKS4gXyhET01TdHJpbmcpCistIF9fbmFtZTpfXyBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uLiBfKERPTVN0cmluZylfCistIF9fZGVwYXJ0bWVudDpfXyBUaGUgZGVwYXJ0bWVudCB0aGUgY29udHJhY3Qgd29ya3MgZm9yLiBfKERPTVN0cmluZylfCistIF9fdGl0bGU6X18gVGhlIGNvbnRhY3RzIHRpdGxlIGF0IHRoZSBvcmdhbml6YXRpb24uIF8oRE9NU3RyaW5nKV8KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYENvbnRhY3RPcmdhbml6YXRpb25gIG9iamVjdCBzdG9yZXMgYSBjb250YWN0J3Mgb3JnYW5pemF0aW9uIHByb3BlcnRpZXMuICBBIGBDb250YWN0YCBvYmplY3Qgc3RvcmVzIG9uZSBvciBtb3JlIGBDb250YWN0T3JnYW5pemF0aW9uYCBvYmplY3RzIGluIGFuIGFycmF5LiAKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoY29udGFjdHMpIHsKKwkJZm9yICh2YXIgaT0wOyBpPGNvbnRhY3RzLmxlbmd0aDsgaSsrKSB7CisJCQlmb3IgKHZhciBqPTA7IGo8Y29udGFjdHNbaV0ub3JnYW5pemF0aW9ucy5sZW5ndGg7IGorKykgeworCQkJCWFsZXJ0KCJQcmVmOiAiICsgY29udGFjdHNbaV0ub3JnYW5pemF0aW9uc1tqXS5wcmVmICsgIlxuIiArCisJCQkJCQkiVHlwZTogIiArIGNvbnRhY3RzW2ldLm9yZ2FuaXphdGlvbnNbal0udHlwZSArICJcbiIgKworCQkJCQkJIk5hbWU6ICIgKyBjb250YWN0c1tpXS5vcmdhbml6YXRpb25zW2pdLm5hbWUgKyAiXG4iICsgCisJCQkJCQkiRGVwYXJ0bWVudDogIiAgKyBjb250YWN0c1tpXS5vcmdhbml6YXRpb25zW2pdLmRlcGFydG1lbnQgKyAiXG4iICsgCisJCQkJCQkiVGl0bGU6ICIgICsgY29udGFjdHNbaV0ub3JnYW5pemF0aW9uc1tqXS50aXRsZSk7CisJCQl9CisJCX0KKyAgICB9OworCisgICAgZnVuY3Rpb24gb25FcnJvcihjb250YWN0RXJyb3IpIHsKKyAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgfTsKKworICAgIHZhciBvcHRpb25zID0gbmV3IENvbnRhY3RGaW5kT3B0aW9ucygpOworCW9wdGlvbnMuZmlsdGVyPSIiOworCWZpbHRlciA9IFsiZGlzcGxheU5hbWUiLCJvcmdhbml6YXRpb25zIl07CisgICAgbmF2aWdhdG9yLmNvbnRhY3RzLmZpbmQoZmlsdGVyLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQl2YXIgb3B0aW9ucyA9IG5ldyBDb250YWN0RmluZE9wdGlvbnMoKTsKKwkJCW9wdGlvbnMuZmlsdGVyPSIiOworCQkJZmlsdGVyID0gWyJkaXNwbGF5TmFtZSIsIm9yZ2FuaXphdGlvbnMiXTsKKwkJCW5hdmlnYXRvci5jb250YWN0cy5maW5kKGZpbHRlciwgb25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3M6IEdldCBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGNvbnRhY3RzCisgICAgICAgIC8vCisJCWZ1bmN0aW9uIG9uU3VjY2Vzcyhjb250YWN0cykgeworCQkJZm9yICh2YXIgaT0wOyBpPGNvbnRhY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJZm9yICh2YXIgaj0wOyBqPGNvbnRhY3RzW2ldLm9yZ2FuaXphdGlvbnMubGVuZ3RoOyBqKyspIHsKKwkJCQkJYWxlcnQoIlByZWY6ICIgKyBjb250YWN0c1tpXS5vcmdhbml6YXRpb25zW2pdLnByZWYgKyAiXG4iICsKKwkJCQkJCQkiVHlwZTogIiArIGNvbnRhY3RzW2ldLm9yZ2FuaXphdGlvbnNbal0udHlwZSArICJcbiIgKworCQkJCQkJCSJOYW1lOiAiICsgY29udGFjdHNbaV0ub3JnYW5pemF0aW9uc1tqXS5uYW1lICsgIlxuIiArIAorCQkJCQkJCSJEZXBhcnRtZW50OiAiICArIGNvbnRhY3RzW2ldLm9yZ2FuaXphdGlvbnNbal0uZGVwYXJ0bWVudCArICJcbiIgKyAKKwkJCQkJCQkiVGl0bGU6ICIgICsgY29udGFjdHNbaV0ub3JnYW5pemF0aW9uc1tqXS50aXRsZSk7CisJCQkJfQorCQkJfQorCQl9OworICAgIAorICAgICAgICAvLyBvbkVycm9yOiBGYWlsZWQgdG8gZ2V0IHRoZSBjb250YWN0cworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGNvbnRhY3RFcnJvcikgeworICAgICAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPkZpbmQgQ29udGFjdHM8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCQorCitBbmRyb2lkIDIuWCBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLQorCistIF9fcHJlZjpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCAyLlggZGV2aWNlcyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGBmYWxzZWAuCisKK0FuZHJvaWQgMS5YIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gX19wcmVmOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYGZhbHNlYC4KKy0gX190eXBlOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgLgorLSBfX3RpdGxlOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIDEuWCBkZXZpY2VzLCBhbmQgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiAKKworQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gX19wcmVmOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBieSBCbGFja2JlcnJ5IGRldmljZXMgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLgorLSBfX3R5cGU6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEJsYWNrYmVycnkgZGV2aWNlcyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGBudWxsYC4KKy0gX19uYW1lOl9fIFBhcnRpYWxseSBzdXBwb3J0ZWQuICBUaGUgZmlyc3Qgb3JnYW5pemF0aW9uIG5hbWUgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIEJsYWNrQmVycnkgX19jb21wYW55X18gZmllbGQuCistIF9fZGVwYXJ0bWVudDpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBhcyBgbnVsbGAuCistIF9fdGl0bGU6X18gUGFydGlhbGx5IHN1cHBvcnRlZC4gIFRoZSBmaXJzdCBvcmdhbml6YXRpb24gdGl0bGUgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIEJsYWNrQmVycnkgX19qb2JUaXRsZV9fIGZpZWxkLgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tLQorLSBfX3ByZWY6X18gVGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIG9uIGlPUyBkZXZpY2VzIGFuZCB3aWxsIGFsd2F5cyByZXR1cm4gYGZhbHNlYC4KKy0gX190eXBlOl9fIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpT1MgZGV2aWNlcyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGBudWxsYC4KKy0gX19uYW1lOl9fIFBhcnRpYWxseSBzdXBwb3J0ZWQuICBUaGUgZmlyc3Qgb3JnYW5pemF0aW9uIG5hbWUgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGlPUyBfX2tBQlBlcnNvbk9yZ2FuaXphdGlvblByb3BlcnR5X18gZmllbGQuCistIF9fZGVwYXJ0bWVudF9fOiBQYXJ0aWFsbHkgc3VwcG9ydGVkLiAgVGhlIGZpcnN0IGRlcGFydG1lbnQgbmFtZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgaU9TIF9fa0FCUGVyc29uRGVwYXJ0bWVudFByb3BlcnR5X18gZmllbGQuCistIF9fdGl0bGVfXzogUGFydGlhbGx5IHN1cHBvcnRlZC4gIFRoZSBmaXJzdCB0aXRsZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgaU9TIF9fa0FCUGVyc29uSm9iVGl0bGVQcm9wZXJ0eV9fIGZpZWxkLgorCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMuY3JlYXRlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9jb250YWN0cy5jcmVhdGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2MzRmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMuY3JlYXRlLm1kCkBAIC0wLDAgKzEsNTcgQEAKK2NvbnRhY3RzLmNyZWF0ZQorPT09PT09PT09PT09PT09CisKK1JldHVybnMgYSBuZXcgQ29udGFjdCBvYmplY3QuCisKKyAgICB2YXIgY29udGFjdCA9IG5hdmlnYXRvci5jb250YWN0cy5jcmVhdGUocHJvcGVydGllcyk7CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitjb250YWN0cy5jcmVhdGUgaXMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgYENvbnRhY3RgIG9iamVjdC4KKworVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyc2lzdCB0aGUgQ29udGFjdCBvYmplY3QgdG8gdGhlIGRldmljZSBjb250YWN0cyBkYXRhYmFzZS4gIFRvIHBlcnNpc3QgdGhlIENvbnRhY3Qgb2JqZWN0IHRvIHRoZSBkZXZpY2UsIGludm9rZSB0aGUgYENvbnRhY3Quc2F2ZWAgbWV0aG9kLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIHZhciBteUNvbnRhY3QgPSBuYXZpZ2F0b3IuY29udGFjdHMuY3JlYXRlKHsiZGlzcGxheU5hbWUiOiAiVGVzdCBVc2VyIn0pOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQl2YXIgbXlDb250YWN0ID0gbmF2aWdhdG9yLmNvbnRhY3RzLmNyZWF0ZSh7ImRpc3BsYXlOYW1lIjogIlRlc3QgVXNlciJ9KTsKKwkJCW15Q29udGFjdC5nZW5kZXIgPSAibWFsZSI7CisJCQljb25zb2xlLmxvZygiVGhlIGNvbnRhY3QsICIgKyBteUNvbnRhY3QuZGlzcGxheU5hbWUgKyAiLCBpcyBvZiB0aGUgIiArIG15Q29udGFjdC5nZW5kZXIgKyAiIGdlbmRlciIpOworICAgICAgICB9CisgICAgCisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5DcmVhdGUgQ29udGFjdDwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL2NvbnRhY3RzLmZpbmQubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL2NvbnRhY3RzLmZpbmQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwY2VmMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMuZmluZC5tZApAQCAtMCwwICsxLDk2IEBACitjb250YWN0cy5maW5kCis9PT09PT09PT09PT09CisKK1F1ZXJpZXMgdGhlIGRldmljZSBjb250YWN0cyBkYXRhYmFzZSBhbmQgcmV0dXJucyBvbmUgb3IgbW9yZSBgQ29udGFjdGAgb2JqZWN0cywgZWFjaCBjb250YWluaW5nIHRoZSBmaWVsZHMgc3BlY2lmaWVkLgorCisgICAgbmF2aWdhdG9yLmNvbnRhY3RzLmZpbmQoY29udGFjdEZpZWxkcywgY29udGFjdFN1Y2Nlc3MsIGNvbnRhY3RFcnJvciwgY29udGFjdEZpbmRPcHRpb25zKTsKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK2NvbnRhY3RzLmZpbmQgaXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcXVlcmllcyB0aGUgZGV2aWNlIGNvbnRhY3RzIGRhdGFiYXNlIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGBDb250YWN0YCBvYmplY3RzLiAgVGhlIHJlc3VsdGluZyBvYmplY3RzIGFyZSBwYXNzZWQgdG8gdGhlIGBjb250YWN0U3VjY2Vzc2AgY2FsbGJhY2sgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSBfX2NvbnRhY3RTdWNjZXNzX18gcGFyYW1ldGVyLiAgCisKK1VzZXJzIG11c3Qgc3BlY2lmeSB0aGUgY29udGFjdCBmaWVsZHMgdG8gYmUgdXNlZCBhcyBhIHNlYXJjaCBxdWFsaWZpZXIgaW4gdGhlIF9fY29udGFjdEZpZWxkc19fIHBhcmFtZXRlci4gIE9ubHkgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gdGhlIF9fY29udGFjdEZpZWxkc19fIHBhcmFtZXRlciB3aWxsIGJlIHJldHVybmVkIGFzIHByb3BlcnRpZXMgb2YgdGhlIGBDb250YWN0YCBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgX19jb250YWN0U3VjY2Vzc19fIGNhbGxiYWNrIGZ1bmN0aW9uLiAgQSB6ZXJvLWxlbmd0aCBfX2NvbnRhY3RGaWVsZHNfXyBwYXJhbWV0ZXIgd2lsbCByZXN1bHQgaW4gYW4gYXJyYXkgb2YgYENvbnRhY3RgIG9iamVjdHMgd2l0aCBvbmx5IHRoZSBgaWRgIHByb3BlcnR5IHBvcHVsYXRlZC4gQSBfX2NvbnRhY3RGaWVsZHNfXyB2YWx1ZSBvZiBbIioiXSB3aWxsIHJldHVybiBhbGwgY29udGFjdCBmaWVsZHMuIAorCitUaGUgX19jb250YWN0RmluZE9wdGlvbnMuZmlsdGVyX18gc3RyaW5nIGNhbiBiZSB1c2VkIGFzIGEgc2VhcmNoIGZpbHRlciB3aGVuIHF1ZXJ5aW5nIHRoZSBjb250YWN0cyBkYXRhYmFzZS4gIElmIHByb3ZpZGVkLCBhIGNhc2UtaW5zZW5zaXRpdmUsIHBhcnRpYWwgdmFsdWUgbWF0Y2ggaXMgYXBwbGllZCB0byBlYWNoIGZpZWxkIHNwZWNpZmllZCBpbiB0aGUgX19jb250YWN0RmllbGRzX18gcGFyYW1ldGVyLiAgSWYgYSBtYXRjaCBpcyBmb3VuZCBpbiBhIGNvbXBhcmlzb24gd2l0aCBfYW55XyBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkcywgdGhlIGNvbnRhY3QgaXMgcmV0dXJuZWQuCisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX2NvbnRhY3RGaWVsZHM6X18gQ29udGFjdCBmaWVsZHMgdG8gYmUgdXNlZCBhcyBzZWFyY2ggcXVhbGlmaWVyLiBPbmx5IHRoZXNlIGZpZWxkcyB3aWxsIGhhdmUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgYENvbnRhY3RgIG9iamVjdHMuIF8oRE9NU3RyaW5nW10pXyBbUmVxdWlyZWRdCistIF9fY29udGFjdFN1Y2Nlc3M6X18gU3VjY2VzcyBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2l0aCB0aGUgY29udGFjdHMgcmV0dXJuZWQgZnJvbSB0aGUgY29udGFjdHMgZGF0YWJhc2UuIFtSZXF1aXJlZF0KKy0gX19jb250YWN0RXJyb3I6X18gRXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24uIEludm9rZWQgd2hlbiBlcnJvciBvY2N1cnMuIFtPcHRpb25hbF0KKy0gX19jb250YWN0RmluZE9wdGlvbnM6X18gU2VhcmNoIG9wdGlvbnMgdG8gZmlsdGVyIGNvbnRhY3RzLiBbT3B0aW9uYWxdCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb24gb25TdWNjZXNzKGNvbnRhY3RzKSB7CisgICAgICAgIGFsZXJ0KCdGb3VuZCAnICsgY29udGFjdHMubGVuZ3RoICsgJyBjb250YWN0cy4nKTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gb25FcnJvcihjb250YWN0RXJyb3IpIHsKKyAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgfTsKKworICAgIC8vIGZpbmQgYWxsIGNvbnRhY3RzIHdpdGggJ0JvYicgaW4gYW55IG5hbWUgZmllbGQKKyAgICB2YXIgb3B0aW9ucyA9IG5ldyBDb250YWN0RmluZE9wdGlvbnMoKTsKKwlvcHRpb25zLmZpbHRlcj0iQm9iIjsgCisJdmFyIGZpZWxkcyA9IFsiZGlzcGxheU5hbWUiLCAibmFtZSJdOworICAgIG5hdmlnYXRvci5jb250YWN0cy5maW5kKGZpZWxkcywgb25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkgICAgLy8gZmluZCBhbGwgY29udGFjdHMgd2l0aCAnQm9iJyBpbiBhbnkgbmFtZSBmaWVsZAorCQkgICAgdmFyIG9wdGlvbnMgPSBuZXcgQ29udGFjdEZpbmRPcHRpb25zKCk7CisJCQlvcHRpb25zLmZpbHRlcj0iQm9iIjsgCisJCQl2YXIgZmllbGRzID0gWyJkaXNwbGF5TmFtZSIsICJuYW1lIl07CisJCSAgICBuYXZpZ2F0b3IuY29udGFjdHMuZmluZChmaWVsZHMsIG9uU3VjY2Vzcywgb25FcnJvciwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gb25TdWNjZXNzOiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBjb250YWN0cworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoY29udGFjdHMpIHsKKwkJCWZvciAodmFyIGk9MDsgaTxjb250YWN0cy5sZW5ndGg7IGkrKykgeworCQkJCWNvbnNvbGUubG9nKCJEaXNwbGF5IE5hbWUgPSAiICsgY29udGFjdHNbaV0uZGlzcGxheU5hbWUpOworCQkJfQorICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uRXJyb3I6IEZhaWxlZCB0byBnZXQgdGhlIGNvbnRhY3RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoY29udGFjdEVycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnb25FcnJvciEnKTsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+RmluZCBDb250YWN0czwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisgICAgCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvY29udGFjdHMubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL2NvbnRhY3RzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDc4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL2NvbnRhY3RzLm1kCkBAIC0wLDAgKzEsMjkgQEAKK0NvbnRhY3RzCis9PT09PT09PQorCis+IFRoZSBgY29udGFjdHNgIG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRldmljZSBjb250YWN0cyBkYXRhYmFzZS4gIAorCitNZXRob2RzCistLS0tLS0tCisKKy0gY29udGFjdHMuY3JlYXRlCistIGNvbnRhY3RzLmZpbmQKKworQXJndW1lbnRzCistLS0tLS0tLS0KKworLSBjb250YWN0RmllbGRzCistIGNvbnRhY3RTdWNjZXNzCistIGNvbnRhY3RFcnJvcgorLSBjb250YWN0RmluZE9wdGlvbnMKKworT2JqZWN0cworLS0tLS0tLQorCistIENvbnRhY3QKKy0gQ29udGFjdE5hbWUKKy0gQ29udGFjdEZpZWxkCistIENvbnRhY3RBZGRyZXNzCistIENvbnRhY3RPcmdhbml6YXRpb24KKy0gQ29udGFjdEZpbmRPcHRpb25zCistIENvbnRhY3RFcnJvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0RXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEVycm9yLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWFmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEVycm9yLm1kCkBAIC0wLDAgKzEsOCBAQAorY29udGFjdEVycm9yCis9PT09PT09PT09PT0KKworRXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGNvbnRhY3QgZnVuY3Rpb25zLgorCisgICAgZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBlcnJvcgorICAgIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEZpZWxkcy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0RmllbGRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjAwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEZpZWxkcy5tZApAQCAtMCwwICsxLDYgQEAKK2NvbnRhY3RGaWVsZHMKKz09PT09PT09PT09PT0KKworUmVxdWlyZWQgcGFyYW1ldGVyIG9mIHRoZSBgY29udGFjdHMuZmluZGAgbWV0aG9kLiAgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgYENvbnRhY3RgIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gYSBmaW5kIG9wZXJhdGlvbi4KKworICAgIFsibmFtZSIsICJwaG9uZU51bWJlcnMiLCAiZW1haWxzIl0KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0RmluZE9wdGlvbnMubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEZpbmRPcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODhlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2NvbnRhY3RzL3BhcmFtZXRlcnMvY29udGFjdEZpbmRPcHRpb25zLm1kCkBAIC0wLDAgKzEsMTYgQEAKK2NvbnRhY3RGaW5kT3B0aW9ucworPT09PT09PT09PT09PT09PT09CisKK09wdGlvbmFsIHBhcmFtZXRlciBvZiB0aGUgYGNvbnRhY3RzLmZpbmRgIG1ldGhvZC4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBmaWx0ZXIgdGhlIGNvbnRhY3RzIHJldHVybmVkIGZyb20gdGhlIGNvbnRhY3RzIGRhdGFiYXNlLgorCisgICAgeyAKKwkJZmlsdGVyOiAiIiwKKwkJbXVsdGlwbGU6IHRydWUsCisJfTsKKworT3B0aW9ucworLS0tLS0tLQorCistIF9fZmlsdGVyOl9fIFRoZSBzZWFyY2ggc3RyaW5nIHVzZWQgdG8gZmlsdGVyIGNvbnRhY3RzLiBfKERPTVN0cmluZylfIChEZWZhdWx0OiAiIikKKy0gX19tdWx0aXBsZTpfXyBEZXRlcm1pbmVzIGlmIHRoZSBmaW5kIG9wZXJhdGlvbiBzaG91bGQgcmV0dXJuIG11bHRpcGxlIGNvbnRhY3RzLiBfKEJvb2xlYW4pXyAoRGVmYXVsdDogZmFsc2UpCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0U3VjY2Vzcy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvY29udGFjdHMvcGFyYW1ldGVycy9jb250YWN0U3VjY2Vzcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI1Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9jb250YWN0cy9wYXJhbWV0ZXJzL2NvbnRhY3RTdWNjZXNzLm1kCkBAIC0wLDAgKzEsMjEgQEAKK2NvbnRhY3RTdWNjZXNzCis9PT09PT09PT09PT09PQorCitTdWNjZXNzIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIGBDb250YWN0YCBhcnJheSByZXN1bHRpbmcgZnJvbSBhIGBjb250YWN0cy5maW5kYCBvcGVyYXRpb24uCisKKyAgICBmdW5jdGlvbihjb250YWN0cykgeworICAgICAgICAvLyBEbyBzb21ldGhpbmcKKyAgICB9CisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX2NvbnRhY3RzOl9fIFRoZSBjb250YWN0IGFycmF5IHJlc3VsdGluZyBmcm9tIGEgZmluZCBvcGVyYXRpb24uIChgQ29udGFjdGApCisKK0V4YW1wbGUKKy0tLS0tLS0KKworICAgIGZ1bmN0aW9uIGNvbnRhY3RTdWNjZXNzKGNvbnRhY3RzKSB7CisJCWZvciAodmFyIGk9MDsgaTxjb250YWN0cy5sZW5ndGg7IGkrKykgeworCQkJY29uc29sZS5sb2coIkRpc3BsYXkgTmFtZSA9ICIgKyBjb250YWN0c1tpXS5kaXNwbGF5TmFtZTsKKyAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9kZXZpY2UvZGV2aWNlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9kZXZpY2UvZGV2aWNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWY3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UubWQKQEAgLTAsMCArMSwyMyBAQAorRGV2aWNlCis9PT09PT0KKworPiBUaGUgYGRldmljZWAgb2JqZWN0IGRlc2NyaWJlcyB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgYW5kIHNvZnR3YXJlLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gZGV2aWNlLm5hbWUKKy0gZGV2aWNlLnBob25lZ2FwCistIGRldmljZS5wbGF0Zm9ybQorLSBkZXZpY2UudXVpZAorLSBkZXZpY2UudmVyc2lvbgorCitWYXJpYWJsZSBTY29wZQorLS0tLS0tLS0tLS0tLS0KKworU2luY2UgYGRldmljZWAgaXMgYXNzaWduZWQgdG8gdGhlIGB3aW5kb3dgIG9iamVjdCwgaXQgaXMgaW1wbGljaXRseSBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorCisgICAgLy8gVGhlc2UgcmVmZXJlbmNlIHRoZSBzYW1lIGBkZXZpY2VgCisgICAgLy8KKyAgICB2YXIgcGhvbmVOYW1lID0gd2luZG93LmRldmljZS5uYW1lOworICAgIHZhciBwaG9uZU5hbWUgPSBkZXZpY2UubmFtZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UubmFtZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZGV2aWNlL2RldmljZS5uYW1lLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWQ5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UubmFtZS5tZApAQCAtMCwwICsxLDc5IEBACitkZXZpY2UubmFtZQorPT09PT09PT09PT0KKworR2V0IHRoZSBkZXZpY2UncyBtb2RlbCBuYW1lLgorCisgICAgdmFyIHN0cmluZyA9IGRldmljZS5uYW1lOworICAgIAorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK2BkZXZpY2UubmFtZWAgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlJ3MgbW9kZWwgb3IgcHJvZHVjdC4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIgYW5kIG1heSBiZSBkaWZmZXJlbnQgYWNyb3NzIHZlcnNpb25zIG9mIHRoZSBzYW1lIHByb2R1Y3QuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIEFuZHJvaWQ6ICAgIE5leHVzIE9uZSAgICAgICByZXR1cm5zICJQYXNzaW9uIiAoTmV4dXMgT25lIGNvZGUgbmFtZSkKKyAgICAvLyAgICAgICAgICAgICBNb3Rvcm9sYSBEcm9pZCAgcmV0dXJucyAidm9sZXMiCisgICAgLy8gQmxhY2tCZXJyeTogQm9sZCA4OTAwICAgICAgIHJldHVybnMgIjg5MDAiCisgICAgLy8gaVBob25lOiAgICAgQWxsIGRldmljZXMgICAgIHJldHVybnMgYSBuYW1lIHNldCBieSBpVHVuZXMgZS5nLiAiSm9lJ3MgaVBob25lIgorICAgIC8vCisgICAgdmFyIG5hbWUgPSBkZXZpY2UubmFtZTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5EZXZpY2UgUHJvcGVydGllcyBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZVByb3BlcnRpZXMnKTsKKyAgICAKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0RldmljZSBOYW1lOiAnICAgICArIGRldmljZS5uYW1lICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgUGhvbmVHYXA6ICcgKyBkZXZpY2UucGhvbmVnYXAgKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFBsYXRmb3JtOiAnICsgZGV2aWNlLnBsYXRmb3JtICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBVVUlEOiAnICAgICArIGRldmljZS51dWlkICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgVmVyc2lvbjogJyAgKyBkZXZpY2UudmVyc2lvbiAgKyAnPGJyIC8+JzsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwIGlkPSJkZXZpY2VQcm9wZXJ0aWVzIj5Mb2FkaW5nIGRldmljZSBwcm9wZXJ0aWVzLi4uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBHZXRzIHRoZSBbcHJvZHVjdCBuYW1lXShodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwjUFJPRFVDVCkgaW5zdGVhZCBvZiB0aGUgW21vZGVsIG5hbWVdKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvQnVpbGQuaHRtbCNNT0RFTCkuCisgICAgLSBUaGUgcHJvZHVjdCBuYW1lIGlzIG9mdGVuIHRoZSBjb2RlIG5hbWUgZ2l2ZW4gZHVyaW5nIHByb2R1Y3Rpb24uCisgICAgLSBlLmcuIE5leHVzIE9uZSByZXR1cm5zICJQYXNzaW9uIiwgTW90b3JvbGEgRHJvaWQgcmV0dXJucyAidm9sZXMiCisKK2lQaG9uZSBRdWlya3MKKy0tLS0tLS0tLS0tLS0KKworLSBHZXRzIHRoZSBbZGV2aWNlJ3MgY3VzdG9tIG5hbWVdKGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2lwaG9uZS9saWJyYXJ5L2RvY3VtZW50YXRpb24vdWlraXQvcmVmZXJlbmNlL1VJRGV2aWNlX0NsYXNzL1JlZmVyZW5jZS9VSURldmljZS5odG1sIy8vYXBwbGVfcmVmL2RvYy91aWQvVFA0MDAwNjkwMi1DSDMtU1cxMykgaW5zdGVhZCBvZiB0aGUgW2RldmljZSBtb2RlbCBuYW1lXShodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9pcGhvbmUvbGlicmFyeS9kb2N1bWVudGF0aW9uL3Vpa2l0L3JlZmVyZW5jZS9VSURldmljZV9DbGFzcy9SZWZlcmVuY2UvVUlEZXZpY2UuaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL1RQNDAwMDY5MDItQ0gzLVNXMSkuCisgICAgLSBUaGUgY3VzdG9tIG5hbWUgaXMgc2V0IGJ5IHRoZSBvd25lciBpbiBpVHVuZXMuCisgICAgLSBlLmcuICJKb2UncyBpUGhvbmUiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9kZXZpY2UvZGV2aWNlLnBob25lZ2FwLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9kZXZpY2UvZGV2aWNlLnBob25lZ2FwLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZGE4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UucGhvbmVnYXAubWQKQEAgLTAsMCArMSw2MCBAQAorZGV2aWNlLnBob25lZ2FwCis9PT09PT09PT09PT09PT0KKworR2V0IHRoZSB2ZXJzaW9uIG9mIHBob25lZ2FwIHJ1bm5pbmcgb24gdGhlIGRldmljZS4KKworICAgIHZhciBzdHJpbmcgPSBkZXZpY2UucGhvbmVnYXA7CisgICAgCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworYGRldmljZS5waG9uZWdhcGAgcmV0dXJucyB0aGUgdmVyc2lvbiBvZiBwaG9uZWdhcCBydW5uaW5nIG9uIHRoZSBkZXZpY2UuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIHZhciBuYW1lID0gZGV2aWNlLnBob25lZ2FwOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkRldmljZSBQcm9wZXJ0aWVzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV2aWNlUHJvcGVydGllcycpOworICAgIAorICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnRGV2aWNlIE5hbWU6ICcgICAgICsgZGV2aWNlLm5hbWUgICAgICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBQaG9uZUdhcDogJyArIGRldmljZS5waG9uZWdhcCArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgUGxhdGZvcm06ICcgKyBkZXZpY2UucGxhdGZvcm0gKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFVVSUQ6ICcgICAgICsgZGV2aWNlLnV1aWQgICAgICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBWZXJzaW9uOiAnICArIGRldmljZS52ZXJzaW9uICArICc8YnIgLz4nOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPHAgaWQ9ImRldmljZVByb3BlcnRpZXMiPkxvYWRpbmcgZGV2aWNlIHByb3BlcnRpZXMuLi48L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZGV2aWNlL2RldmljZS5wbGF0Zm9ybS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZGV2aWNlL2RldmljZS5wbGF0Zm9ybS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM4Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9kZXZpY2UvZGV2aWNlLnBsYXRmb3JtLm1kCkBAIC0wLDAgKzEsNzAgQEAKK2RldmljZS5wbGF0Zm9ybQorPT09PT09PT09PT09PT09CisKK0dldCB0aGUgZGV2aWNlJ3Mgb3BlcmF0aW5nIHN5c3RlbSBuYW1lLgorCisgICAgdmFyIHN0cmluZyA9IGRldmljZS5wbGF0Zm9ybTsKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeQorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UsIGEgZmV3IGV4YW1wbGVzIGFyZToKKyAgICAvLyAgIC0gIkFuZHJvaWQiCisgICAgLy8gICAtICJCbGFja0JlcnJ5IgorICAgIC8vICAgLSAiaVBob25lIgorICAgIC8vICAgLSAid2ViT1MiCisgICAgLy8gICAtICJXaW5DRSIKKyAgICB2YXIgZGV2aWNlUGxhdGZvcm0gPSBkZXZpY2UucGxhdGZvcm07CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+RGV2aWNlIFByb3BlcnRpZXMgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXZpY2VQcm9wZXJ0aWVzJyk7CisgICAgCisgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdEZXZpY2UgTmFtZTogJyAgICAgKyBkZXZpY2UubmFtZSAgICAgKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFBob25lR2FwOiAnICsgZGV2aWNlLnBob25lZ2FwICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBQbGF0Zm9ybTogJyArIGRldmljZS5wbGF0Zm9ybSArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgVVVJRDogJyAgICAgKyBkZXZpY2UudXVpZCAgICAgKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFZlcnNpb246ICcgICsgZGV2aWNlLnZlcnNpb24gICsgJzxiciAvPic7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8cCBpZD0iZGV2aWNlUHJvcGVydGllcyI+TG9hZGluZyBkZXZpY2UgcHJvcGVydGllcy4uLjwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisgICAgCitpUGhvbmUgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKK0FsbCBkZXZpY2VzIHJldHVybiBgaVBob25lYCBhcyB0aGUgcGxhdGZvcm0uIFRoaXMgaXMgaW5hY2N1cmF0ZSBiZWNhdXNlIEFwcGxlIGhhcyByZWJyYW5kZWQgdGhlIGlQaG9uZSBvcGVyYXRpbmcgc3lzdGVtIGFzIGBpT1NgLgorCitCbGFja0JlcnJ5IFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0KKworRGV2aWNlcyBtYXkgcmV0dXJuIHRoZSBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBwbGF0Zm9ybSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBTdG9ybTIgOTU1MCB3b3VsZCByZXR1cm4gJzIuMTMuMC45NScgb3Igc2ltaWxhci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UudXVpZC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZGV2aWNlL2RldmljZS51dWlkLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODJkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UudXVpZC5tZApAQCAtMCwwICsxLDcyIEBACitkZXZpY2UudXVpZAorPT09PT09PT09PT0KKworR2V0IHRoZSBkZXZpY2UncyBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoW1VVSURdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfVW5pcXVlX0lkZW50aWZpZXIpKS4KKworICAgIHZhciBzdHJpbmcgPSBkZXZpY2UudXVpZDsKKyAgICAKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgZGV0YWlscyBvZiBob3cgYSBVVUlEIGlzIGdlbmVyYXRlZCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlciBhbmQgc3BlY2lmaWMgdG8gdGhlIGRldmljZSdzIHBsYXRmb3JtIG9yIG1vZGVsLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5CistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBBbmRyb2lkOiBSZXR1cm5zIGEgcmFuZG9tIDY0LWJpdCBpbnRlZ2VyIChhcyBhIHN0cmluZywgYWdhaW4hKQorICAgIC8vICAgICAgICAgIFRoZSBpbnRlZ2VyIGlzIGdlbmVyYXRlZCBvbiB0aGUgZGV2aWNlJ3MgZmlyc3QgYm9vdAorICAgIC8vCisgICAgLy8gQmxhY2tCZXJyeTogUmV0dXJucyB0aGUgUElOIG51bWJlciBvZiB0aGUgZGV2aWNlCisgICAgLy8gICAgICAgICAgICAgVGhpcyBpcyBhIG5pbmUtZGlnaXQgdW5pcXVlIGludGVnZXIgKGFzIGEgc3RyaW5nLCB0aG91Z2ghKQorICAgIC8vCisgICAgLy8gaVBob25lOiAoUGFyYXBocmFzZWQgZnJvbSB0aGUgVUlEZXZpY2UgQ2xhc3MgZG9jdW1lbnRhdGlvbikKKyAgICAvLyAgICAgICAgIFJldHVybnMgYSBzdHJpbmcgb2YgaGFzaCB2YWx1ZXMgY3JlYXRlZCBmcm9tIG11bHRpcGxlIGhhcmR3YXJlIGlkZW50aWZpZXMuCisgICAgLy8gICAgICAgICBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBmb3IgZXZlcnkgZGV2aWNlIGFuZCBjYW5ub3QgYmUgdGllZAorICAgIC8vICAgICAgICAgdG8gdGhlIHVzZXIgYWNjb3VudC4KKyAgICAvLyBXaW5kb3dzIFBob25lIDcgOiBSZXR1cm5zIGEgaGFzaCBvZiBkZXZpY2UrY3VycmVudCB1c2VyLCAKKyAgICAvLyBpZiB0aGUgdXNlciBpcyBub3QgZGVmaW5lZCwgYSBndWlkIGlzIGdlbmVyYXRlZCBhbmQgd2lsbCBwZXJzaXN0IHVudGlsIHRoZSBhcHAgaXMgdW5pbnN0YWxsZWQKKyAgICAvLyAKKyAgICB2YXIgZGV2aWNlSUQgPSBkZXZpY2UudXVpZDsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5EZXZpY2UgUHJvcGVydGllcyBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZVByb3BlcnRpZXMnKTsKKyAgICAKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0RldmljZSBOYW1lOiAnICAgICArIGRldmljZS5uYW1lICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgUGhvbmVHYXA6ICcgKyBkZXZpY2UucGhvbmVnYXAgKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFBsYXRmb3JtOiAnICsgZGV2aWNlLnBsYXRmb3JtICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBVVUlEOiAnICAgICArIGRldmljZS51dWlkICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgVmVyc2lvbjogJyAgKyBkZXZpY2UudmVyc2lvbiAgKyAnPGJyIC8+JzsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwIGlkPSJkZXZpY2VQcm9wZXJ0aWVzIj5Mb2FkaW5nIGRldmljZSBwcm9wZXJ0aWVzLi4uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UudmVyc2lvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZGV2aWNlL2RldmljZS52ZXJzaW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDE3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2RldmljZS9kZXZpY2UudmVyc2lvbi5tZApAQCAtMCwwICsxLDYzIEBACitkZXZpY2UudmVyc2lvbgorPT09PT09PT09PT09PT0KKworR2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb24uCisKKyAgICB2YXIgc3RyaW5nID0gZGV2aWNlLnZlcnNpb247CisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkIDIuMSsKKy0gQmxhY2tCZXJyeQorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gQW5kcm9pZDogICAgRnJveW8gT1Mgd291bGQgcmV0dXJuICIyLjIiCisgICAgLy8gICAgICAgICAgICAgRWNsYWlyIE9TIHdvdWxkIHJldHVybiAiMi4xIiwgIjIuMC4xIiwgb3IgIjIuMCIKKyAgICAvLyAgICAgICAgICAgICBWZXJzaW9uIGNhbiBhbHNvIHJldHVybiB1cGRhdGUgbGV2ZWwgIjIuMS11cGRhdGUxIiAKKyAgICAvLworICAgIC8vIEJsYWNrQmVycnk6IEJvbGQgOTAwMCB1c2luZyBPUyA0LjYgd291bGQgcmV0dXJuICI0LjYuMC4yODIiCisgICAgLy8KKyAgICAvLyBpUGhvbmU6ICAgICBpT1MgMy4yIHJldHVybnMgIjMuMiIKKyAgICAvLworICAgIC8vIFdpbmRvd3MgUGhvbmUgNzogcmV0dXJucyBjdXJyZW50IE9TIHZlcnNpb24gbnVtYmVyLCBleC4gb24gTWFuZ28gcmV0dXJucyA3LjEwLjc3MjAKKyAgICB2YXIgZGV2aWNlVmVyc2lvbiA9IGRldmljZS52ZXJzaW9uOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkRldmljZSBQcm9wZXJ0aWVzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV2aWNlUHJvcGVydGllcycpOworICAgICAgICAKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0RldmljZSBOYW1lOiAnICAgICArIGRldmljZS5uYW1lICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgUGhvbmVHYXA6ICcgKyBkZXZpY2UucGhvbmVnYXAgKyAnPGJyIC8+JyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGV2aWNlIFBsYXRmb3JtOiAnICsgZGV2aWNlLnBsYXRmb3JtICsgJzxiciAvPicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RldmljZSBVVUlEOiAnICAgICArIGRldmljZS51dWlkICAgICArICc8YnIgLz4nICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEZXZpY2UgVmVyc2lvbjogJyAgKyBkZXZpY2UudmVyc2lvbiAgKyAnPGJyIC8+JzsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwIGlkPSJkZXZpY2VQcm9wZXJ0aWVzIj5Mb2FkaW5nIGRldmljZSBwcm9wZXJ0aWVzLi4uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5iYWNrYnV0dG9uLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLmJhY2tidXR0b24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0OWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5iYWNrYnV0dG9uLm1kCkBAIC0wLDAgKzEsNjcgQEAKK2JhY2tidXR0b24KKz09PT09PT09PT09CisKK1RoaXMgaXMgYW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGJhY2sgYnV0dG9uLgorCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsIHlvdXJDYWxsYmFja0Z1bmN0aW9uLCBmYWxzZSk7CisKK0RldGFpbHMKKy0tLS0tLS0KKworSWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFjayBidXR0b24gYmVoYXZpb3VyIHlvdSBjYW4gcmVnaXN0ZXIgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSAnYmFja2J1dHRvbicgZXZlbnQuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGNhbGwgYW55IG90aGVyIG1ldGhvZCB0byBvdmVyIHJpZGUgdGhlIGJhY2sgYnV0dG9uIGJlaGF2aW91ci4gIE5vdywgeW91IG9ubHkgbmVlZCB0byByZWdpc3RlciBhbiBldmVudCBsaXN0ZW5lciBmb3IgJ2JhY2tidXR0b24nLgorCitUeXBpY2FsbHksIHlvdSB3aWxsIHdhbnQgdG8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJgIG9uY2UgeW91IHJlY2VpdmUgdGhlIFBob25lR2FwICdkZXZpY2VyZWFkeScgZXZlbnQuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIiwgb25CYWNrS2V5RG93biwgZmFsc2UpOworCisgICAgZnVuY3Rpb24gb25CYWNrS2V5RG93bigpIHsKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBiYWNrIGJ1dHRvbgorICAgIH0KKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QaG9uZUdhcCBCYWNrIEJ1dHRvbiBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIENhbGwgb25EZXZpY2VSZWFkeSB3aGVuIFBob25lR2FwIGlzIGxvYWRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgYnV0IHBob25lZ2FwLmpzIGhhcyBub3QuCisgICAgICAgIC8vIFdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCB0YWxraW5nIHdpdGggdGhlIG5hdGl2ZSBkZXZpY2UsCisgICAgICAgIC8vIGl0IHdpbGwgY2FsbCB0aGUgZXZlbnQgYGRldmljZXJlYWR5YC4KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Mb2FkKCkgeworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIGl0IGlzIG5vdyBzYWZlIHRvIGNhbGwgUGhvbmVHYXAgbWV0aG9kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIiwgb25CYWNrS2V5RG93biwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBIYW5kbGUgdGhlIGJhY2sgYnV0dG9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uQmFja0tleURvd24oKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5kZXZpY2VyZWFkeS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5kZXZpY2VyZWFkeS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNlMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLmRldmljZXJlYWR5Lm1kCkBAIC0wLDAgKzEsOTIgQEAKK2RldmljZXJlYWR5Cis9PT09PT09PT09PQorCitUaGlzIGlzIGFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBQaG9uZUdhcCBpcyBmdWxseSBsb2FkZWQuCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIHlvdXJDYWxsYmFja0Z1bmN0aW9uLCBmYWxzZSk7CisKK0RldGFpbHMKKy0tLS0tLS0KKworVGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IGV2ZW50IHRoYXQgZXZlcnkgUGhvbmVHYXAgYXBwbGljYXRpb24gc2hvdWxkIHVzZS4KKworUGhvbmVHYXAgY29uc2lzdHMgb2YgdHdvIGNvZGUgYmFzZXM6IG5hdGl2ZSBhbmQgSmF2YVNjcmlwdC4gV2hpbGUgdGhlIG5hdGl2ZSBjb2RlIGlzIGxvYWRpbmcsIGEgY3VzdG9tIGxvYWRpbmcgaW1hZ2UgaXMgZGlzcGxheWVkLiBIb3dldmVyLCBKYXZhU2NyaXB0IGlzIG9ubHkgbG9hZGVkIG9uY2UgdGhlIERPTSBsb2Fkcy4gVGhpcyBtZWFucyB5b3VyIHdlYiBhcHBsaWNhdGlvbiBjb3VsZCwgcG90ZW50aWFsbHksIGNhbGwgYSBQaG9uZUdhcCBKYXZhU2NyaXB0IGZ1bmN0aW9uIGJlZm9yZSBpdCBpcyBsb2FkZWQuCisKK1RoZSBQaG9uZUdhcCBgZGV2aWNlcmVhZHlgIGV2ZW50IGZpcmVzIG9uY2UgUGhvbmVHYXAgaGFzIGZ1bGx5IGxvYWRlZC4gQWZ0ZXIgdGhlIGRldmljZSBoYXMgZmlyZWQsIHlvdSBjYW4gc2FmZWx5IG1ha2UgY2FsbHMgdG8gUGhvbmVHYXAgZnVuY3Rpb24uCisKK1R5cGljYWxseSwgeW91IHdpbGwgd2FudCB0byBhdHRhY2ggYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcmAgb25jZSB0aGUgSFRNTCBkb2N1bWVudCdzIERPTSBoYXMgbG9hZGVkLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgLy8gTm93IHNhZmUgdG8gdXNlIHRoZSBQaG9uZUdhcCBBUEkKKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgRGV2aWNlIFJlYWR5IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbCBvbkRldmljZVJlYWR5IHdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkLgorICAgICAgICAvLworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCBidXQgcGhvbmVnYXAuanMgaGFzIG5vdC4KKyAgICAgICAgLy8gV2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIHRhbGtpbmcgd2l0aCB0aGUgbmF0aXZlIGRldmljZSwKKyAgICAgICAgLy8gaXQgd2lsbCBjYWxsIHRoZSBldmVudCBgZGV2aWNlcmVhZHlgLgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgaXQgaXMgbm93IHNhZmUgdG8gbWFrZSBjYWxscyBQaG9uZUdhcCBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAvLyBOb3cgc2FmZSB0byB1c2UgdGhlIFBob25lR2FwIEFQSQorICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisgICAgCitCbGFja0JlcnJ5IChPUyA0LjYpIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ3VzdG9tIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgUklNIEJyb3dzZXJGaWVsZCAod2ViIGJyb3dzZXIgdmlldyksIHNvIHRoZSBgZGV2aWNlcmVhZHlgIGV2ZW50IHdpbGwgbmV2ZXIgZmlyZS4KKworQSB3b3JrYXJvdW5kIGlzIHRvIG1hbnVhbGx5IHF1ZXJ5IGBQaG9uZUdhcC5hdmFpbGFibGVgIHVudGlsIFBob25lR2FwIGhhcyBmdWxseSBsb2FkZWQuCisKKyAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgIC8vIEJsYWNrQmVycnkgT1MgNCBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZXZlbnRzLgorICAgICAgICAvLyBTbywgbWFudWFsbHkgd2FpdCB1bnRpbCBQaG9uZUdhcCBpcyBhdmFpbGFibGUuCisgICAgICAgIC8vCisgICAgICAgIHZhciBpbnRlcnZhbElEID0gd2luZG93LnNldEludGVydmFsKAorICAgICAgICAgIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICBpZiAoUGhvbmVHYXAuYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTsKKyAgICAgICAgICAgICAgICAgIG9uRGV2aWNlUmVhZHkoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgNTAwCisgICAgICAgICk7CisgICAgfQorCisgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgLy8gTm93IHNhZmUgdG8gdXNlIHRoZSBQaG9uZUdhcCBBUEkKKyAgICB9CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMuZW5kY2FsbGJ1dHRvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5lbmRjYWxsYnV0dG9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGIyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMuZW5kY2FsbGJ1dHRvbi5tZApAQCAtMCwwICsxLDY3IEBACitlbmRjYWxsYnV0dG9uCis9PT09PT09PT09PQorCitUaGlzIGlzIGFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBlbmQgY2FsbCBidXR0b24uCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlbmRjYWxsYnV0dG9uIiwgeW91ckNhbGxiYWNrRnVuY3Rpb24sIGZhbHNlKTsKKworRGV0YWlscworLS0tLS0tLQorCitJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBlbmQgY2FsbCBiZWhhdmlvdXIgeW91IGNhbiByZWdpc3RlciBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlICdlbmRjYWxsYnV0dG9uJyBldmVudC4KKworVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyYCBvbmNlIHlvdSByZWNlaXZlIHRoZSBQaG9uZUdhcCAnZGV2aWNlcmVhZHknIGV2ZW50LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImVuZGNhbGxidXR0b24iLCBvbkVuZENhbGxLZXlEb3duLCBmYWxzZSk7CisKKyAgICBmdW5jdGlvbiBvbkVuZENhbGxLZXlEb3duKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIGVuZCBjYWxsIGJ1dHRvbgorICAgIH0KKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QaG9uZUdhcCBFbmQgQ2FsbCBCdXR0b24gRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBDYWxsIG9uRGV2aWNlUmVhZHkgd2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIGJ1dCBwaG9uZWdhcC5qcyBoYXMgbm90LgorICAgICAgICAvLyBXaGVuIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgdGFsa2luZyB3aXRoIHRoZSBuYXRpdmUgZGV2aWNlLAorICAgICAgICAvLyBpdCB3aWxsIGNhbGwgdGhlIGV2ZW50IGBkZXZpY2VyZWFkeWAuCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uTG9hZCgpIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCBpdCBpcyBub3cgc2FmZSB0byBtYWtlIGNhbGxzIFBob25lR2FwIG1ldGhvZHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBldmVudCBsaXN0ZW5lcgorICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZW5kY2FsbGJ1dHRvbiIsIG9uRW5kQ2FsbEtleURvd24sIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSB0aGUgZW5kIGNhbGwgYnV0dG9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRW5kQ2FsbEtleURvd24oKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY3ODgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLm1kCkBAIC0wLDAgKzEsMjEgQEAKK0V2ZW50cworPT09PT09CisKKz4gUGhvbmVHYXAgbGlmZWN5Y2xlIGV2ZW50cy4KKworRXZlbnQgVHlwZXMKKy0tLS0tLS0tLS0tCisKKy0gZGV2aWNlcmVhZHkKKy0gcGF1c2UKKy0gcmVzdW1lCistIG9ubGluZQorLSBvZmZsaW5lCistIGJhY2tidXR0b24KKy0gbWVudWJ1dHRvbgorLSBzZWFyY2hidXR0b24KKy0gc3RhcnRjYWxsYnV0dG9uCistIGVuZGNhbGxidXR0b24KKy0gdm9sdW1lZG93bmJ1dHRvbgorLSB2b2x1bWV1cGJ1dHRvbgorCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMubWVudWJ1dHRvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5tZW51YnV0dG9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyM2ZhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMubWVudWJ1dHRvbi5tZApAQCAtMCwwICsxLDY4IEBACittZW51YnV0dG9uCis9PT09PT09PT09PQorCitUaGlzIGlzIGFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBtZW51IGJ1dHRvbi4KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1lbnVidXR0b24iLCB5b3VyQ2FsbGJhY2tGdW5jdGlvbiwgZmFsc2UpOworCitEZXRhaWxzCistLS0tLS0tCisKK0lmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1lbnUgYnV0dG9uIGJlaGF2aW91ciB5b3UgY2FuIHJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbnRlciBmb3IgdGhlICdtZW51YnV0dG9uJyBldmVudC4KKworVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyYCBvbmNlIHlvdSByZWNlaXZlIHRoZSBQaG9uZUdhcCAnZGV2aWNlcmVhZHknIGV2ZW50LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibWVudWJ1dHRvbiIsIG9uTWVudUtleURvd24sIGZhbHNlKTsKKworICAgIGZ1bmN0aW9uIG9uTWVudUtleURvd24oKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgYmFjayBidXR0b24KKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgTWVudSBCdXR0b24gRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBDYWxsIG9uRGV2aWNlUmVhZHkgd2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIGJ1dCBwaG9uZWdhcC5qcyBoYXMgbm90LgorICAgICAgICAvLyBXaGVuIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgdGFsa2luZyB3aXRoIHRoZSBuYXRpdmUgZGV2aWNlLAorICAgICAgICAvLyBpdCB3aWxsIGNhbGwgdGhlIGV2ZW50IGBkZXZpY2VyZWFkeWAuCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uTG9hZCgpIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCBpdCBpcyBub3cgc2FmZSB0byBtYWtlIGNhbGxzIFBob25lR2FwIG1ldGhvZHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBldmVudCBsaXN0ZW5lcgorICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibWVudWJ1dHRvbiIsIG9uTWVudUtleURvd24sIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSB0aGUgbWVudSBidXR0b24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25NZW51S2V5RG93bigpIHsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLm9mZmxpbmUubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMub2ZmbGluZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EyN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLm9mZmxpbmUubWQKQEAgLTAsMCArMSw3MSBAQAorb2ZmbGluZQorPT09PT09PT09PT0KKworVGhpcyBpcyBhbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gYSBQaG9uZUdhcCBhcHBsaWNhdGlvbiBpcyBvZmZsaW5lIChub3QgY29ubmVjdGVkIHRvIHRoZSBJbnRlcm5ldCkuCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvZmZsaW5lIiwgeW91ckNhbGxiYWNrRnVuY3Rpb24sIGZhbHNlKTsKKworRGV0YWlscworLS0tLS0tLQorCitXaGVuIHRoZSBhcHBsaWNhdGlvbidzIG5ldHdvcmsgY29ubmVjdGlvbiBjaGFuZ2VzIHRvIGJlaW5nIG9mZmxpbmUsIHRoZSBvZmZsaW5lIGV2ZW50IGlzIGZpcmVkLiAgCisKK1R5cGljYWxseSwgeW91IHdpbGwgd2FudCB0byBhdHRhY2ggYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcmAgb25jZSB5b3UgcmVjZWl2ZSB0aGUgUGhvbmVHYXAgJ2RldmljZXJlYWR5JyBldmVudC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvZmZsaW5lIiwgb25PZmZsaW5lLCBmYWxzZSk7CisKKyAgICBmdW5jdGlvbiBvbk9mZmxpbmUoKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgb2ZmbGluZSBldmVudAorICAgIH0KKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QaG9uZUdhcCBPZmZsaW5lIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbCBvbkRldmljZVJlYWR5IHdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkLgorICAgICAgICAvLworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCBidXQgcGhvbmVnYXAuanMgaGFzIG5vdC4KKyAgICAgICAgLy8gV2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIHRhbGtpbmcgd2l0aCB0aGUgbmF0aXZlIGRldmljZSwKKyAgICAgICAgLy8gaXQgd2lsbCBjYWxsIHRoZSBldmVudCBgZGV2aWNlcmVhZHlgLgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgaXQgaXMgbm93IHNhZmUgdG8gbWFrZSBjYWxscyBQaG9uZUdhcCBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCSAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvZmZsaW5lIiwgb25PZmZsaW5lLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdGhlIG9mZmxpbmUgZXZlbnQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25PZmZsaW5lKCkgeworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEdXJpbmcgaW5pdGlhbCBzdGFydHVwLCB0aGUgZmlyc3Qgb2ZmbGluZSBldmVudCAoaWYgYXBwbGljYWJsZSkgd2lsbCB0YWtlIGF0IGxlYXN0IGEgc2Vjb25kIHRvIGZpcmUuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMub25saW5lLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLm9ubGluZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkyNDViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLm9ubGluZS5tZApAQCAtMCwwICsxLDcxIEBACitvbmxpbmUKKz09PT09PT09PT09CisKK1RoaXMgaXMgYW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIGEgUGhvbmVHYXAgYXBwbGljYXRpb24gaXMgb25saW5lIChjb25uZWN0ZWQgdG8gdGhlIEludGVybmV0KS4KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm9ubGluZSIsIHlvdXJDYWxsYmFja0Z1bmN0aW9uLCBmYWxzZSk7CisKK0RldGFpbHMKKy0tLS0tLS0KKworV2hlbiB0aGUgYXBwbGljYXRpb24ncyBuZXR3b3JrIGNvbm5lY3Rpb24gY2hhbmdlcyB0byBiZWluZyBvbmxpbmUsIHRoZSBvbmxpbmUgZXZlbnQgaXMgZmlyZWQuICAKKworVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyYCBvbmNlIHlvdSByZWNlaXZlIHRoZSBQaG9uZUdhcCAnZGV2aWNlcmVhZHknIGV2ZW50LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm9ubGluZSIsIG9uT25saW5lLCBmYWxzZSk7CisKKyAgICBmdW5jdGlvbiBvbk9ubGluZSgpIHsKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBvbmxpbmUgZXZlbnQKKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgT25saW5lIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbCBvbkRldmljZVJlYWR5IHdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkLgorICAgICAgICAvLworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCBidXQgcGhvbmVnYXAuanMgaGFzIG5vdC4KKyAgICAgICAgLy8gV2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIHRhbGtpbmcgd2l0aCB0aGUgbmF0aXZlIGRldmljZSwKKyAgICAgICAgLy8gaXQgd2lsbCBjYWxsIHRoZSBldmVudCBgZGV2aWNlcmVhZHlgLgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgaXQgaXMgbm93IHNhZmUgdG8gbWFrZSBjYWxscyBQaG9uZUdhcCBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvbmxpbmUiLCBvbk9ubGluZSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBvbmxpbmUgZXZlbnQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25PbmxpbmUoKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworaU9TIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0R1cmluZyBpbml0aWFsIHN0YXJ0dXAsIHRoZSBmaXJzdCBvbmxpbmUgZXZlbnQgKGlmIGFwcGxpY2FibGUpIHdpbGwgdGFrZSBhdCBsZWFzdCBhIHNlY29uZCB0byBmaXJlLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnBhdXNlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnBhdXNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTBhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMucGF1c2UubWQKQEAgLTAsMCArMSw3MSBAQAorcGF1c2UKKz09PT09PT09PT09CisKK1RoaXMgaXMgYW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIGEgUGhvbmVHYXAgYXBwbGljYXRpb24gaXMgcHV0IGludG8gdGhlIGJhY2tncm91bmQuCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsIHlvdXJDYWxsYmFja0Z1bmN0aW9uLCBmYWxzZSk7CisKK0RldGFpbHMKKy0tLS0tLS0KKworUGhvbmVHYXAgY29uc2lzdHMgb2YgdHdvIGNvZGUgYmFzZXM6IG5hdGl2ZSBhbmQgSmF2YVNjcmlwdC4gV2hpbGUgdGhlIG5hdGl2ZSBjb2RlIHB1dHMgdGhlIGFwcGxpY2F0aW9uIGludG8gdGhlIGJhY2tncm91bmQgdGhlIHBhdXNlIGV2ZW50IGlzIGZpcmVkLiAgCisKK1R5cGljYWxseSwgeW91IHdpbGwgd2FudCB0byBhdHRhY2ggYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcmAgb25jZSB5b3UgcmVjZWl2ZSB0aGUgUGhvbmVHYXAgJ2RldmljZXJlYWR5JyBldmVudC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsIG9uUGF1c2UsIGZhbHNlKTsKKworICAgIGZ1bmN0aW9uIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgcGF1c2UgZXZlbnQKKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgUGF1c2UgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBDYWxsIG9uRGV2aWNlUmVhZHkgd2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIGJ1dCBwaG9uZWdhcC5qcyBoYXMgbm90LgorICAgICAgICAvLyBXaGVuIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgdGFsa2luZyB3aXRoIHRoZSBuYXRpdmUgZGV2aWNlLAorICAgICAgICAvLyBpdCB3aWxsIGNhbGwgdGhlIGV2ZW50IGBkZXZpY2VyZWFkeWAuCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uTG9hZCgpIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCBpdCBpcyBub3cgc2FmZSB0byBtYWtlIGNhbGxzIFBob25lR2FwIG1ldGhvZHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKwkJICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBhdXNlIiwgb25QYXVzZSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBwYXVzZSBldmVudAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblBhdXNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keSBvbmxvYWQ9Im9uTG9hZCgpIj4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbiB0aGUgcGF1c2UgaGFuZGxlciwgYW55IGNhbGxzIHRoYXQgZ28gdGhyb3VnaCBPYmplY3RpdmUtQyB3aWxsIG5vdCB3b3JrLCBub3Igd2lsbCBhbnkgY2FsbHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUsIGxpa2UgYWxlcnRzLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbm5vdCBjYWxsIGNvbnNvbGUubG9nIChhbmQgaXRzIHZhcmlhbnRzKSwgb3IgYW55IGNhbGxzIGZyb20gUGx1Z2lucyBvciB0aGUgUGhvbmVHYXAgQVBJLiBUaGVzZSB3aWxsIG9ubHkgYmUgcHJvY2Vzc2VkIHdoZW4gdGhlIGFwcCByZXN1bWVzIChwcm9jZXNzZWQgb24gdGhlIG5leHQgcnVuLWxvb3ApLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnJlc3VtZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5yZXN1bWUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmZjhkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5yZXN1bWUubWQKQEAgLTAsMCArMSw2NyBAQAorcmVzdW1lCis9PT09PT09PT09PQorCitUaGlzIGlzIGFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBhIFBob25lR2FwIGFwcGxpY2F0aW9uIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIiwgeW91ckNhbGxiYWNrRnVuY3Rpb24sIGZhbHNlKTsKKworRGV0YWlscworLS0tLS0tLQorCitQaG9uZUdhcCBjb25zaXN0cyBvZiB0d28gY29kZSBiYXNlczogbmF0aXZlIGFuZCBKYXZhU2NyaXB0LiBXaGlsZSB0aGUgbmF0aXZlIGNvZGUgcHVsbHMgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIGJhY2tncm91bmQgdGhlIHJlc3VtZSBldmVudCBpcyBmaXJlZC4gIAorCitUeXBpY2FsbHksIHlvdSB3aWxsIHdhbnQgdG8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJgIG9uY2UgeW91IHJlY2VpdmUgdGhlIFBob25lR2FwICdkZXZpY2VyZWFkeScgZXZlbnQuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIiwgb25SZXN1bWUsIGZhbHNlKTsKKworICAgIGZ1bmN0aW9uIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VtZSBldmVudAorICAgIH0KKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QaG9uZUdhcCBSZXN1bWUgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBDYWxsIG9uRGV2aWNlUmVhZHkgd2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIGJ1dCBwaG9uZWdhcC5qcyBoYXMgbm90LgorICAgICAgICAvLyBXaGVuIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgdGFsa2luZyB3aXRoIHRoZSBuYXRpdmUgZGV2aWNlLAorICAgICAgICAvLyBpdCB3aWxsIGNhbGwgdGhlIGV2ZW50IGBkZXZpY2VyZWFkeWAuCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uTG9hZCgpIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCBpdCBpcyBub3cgc2FmZSB0byBtYWtlIGNhbGxzIFBob25lR2FwIG1ldGhvZHMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlc3VtZSIsIG9uUmVzdW1lLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VtZSBldmVudAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblJlc3VtZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnNlYXJjaGJ1dHRvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5zZWFyY2hidXR0b24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzM2I1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5zZWFyY2hidXR0b24ubWQKQEAgLTAsMCArMSw2NyBAQAorc2VhcmNoYnV0dG9uCis9PT09PT09PT09PQorCitUaGlzIGlzIGFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBzZWFyY2ggYnV0dG9uIG9uIEFuZHJvaWQuCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWFyY2hidXR0b24iLCB5b3VyQ2FsbGJhY2tGdW5jdGlvbiwgZmFsc2UpOworCitEZXRhaWxzCistLS0tLS0tCisKK0lmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlYXJjaCBidXR0b24gYmVoYXZpb3VyIG9uIEFuZHJvaWQgeW91IGNhbiByZWdpc3RlciBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlICdzZWFyY2hidXR0b24nIGV2ZW50LgorCitUeXBpY2FsbHksIHlvdSB3aWxsIHdhbnQgdG8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJgIG9uY2UgeW91IHJlY2VpdmUgdGhlIFBob25lR2FwICdkZXZpY2VyZWFkeScgZXZlbnQuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlYXJjaGJ1dHRvbiIsIG9uU2VhcmNoS2V5RG93biwgZmFsc2UpOworCisgICAgZnVuY3Rpb24gb25TZWFyY2hLZXlEb3duKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIHNlYXJjaCBidXR0b24KKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgU2VhcmNoIEJ1dHRvbiBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIENhbGwgb25EZXZpY2VSZWFkeSB3aGVuIFBob25lR2FwIGlzIGxvYWRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgYnV0IHBob25lZ2FwLmpzIGhhcyBub3QuCisgICAgICAgIC8vIFdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCB0YWxraW5nIHdpdGggdGhlIG5hdGl2ZSBkZXZpY2UsCisgICAgICAgIC8vIGl0IHdpbGwgY2FsbCB0aGUgZXZlbnQgYGRldmljZXJlYWR5YC4KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Mb2FkKCkgeworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIGl0IGlzIG5vdyBzYWZlIHRvIG1ha2UgY2FsbHMgUGhvbmVHYXAgbWV0aG9kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWFyY2hidXR0b24iLCBvblNlYXJjaEtleURvd24sIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSB0aGUgc2VhcmNoIGJ1dHRvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblNlYXJjaEtleURvd24oKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy5zdGFydGNhbGxidXR0b24ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMuc3RhcnRjYWxsYnV0dG9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZWM1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMuc3RhcnRjYWxsYnV0dG9uLm1kCkBAIC0wLDAgKzEsNjcgQEAKK3N0YXJ0Y2FsbGJ1dHRvbgorPT09PT09PT09PT0KKworVGhpcyBpcyBhbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgc3RhcnQgY2FsbCBidXR0b24uCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdGFydGNhbGxidXR0b24iLCB5b3VyQ2FsbGJhY2tGdW5jdGlvbiwgZmFsc2UpOworCitEZXRhaWxzCistLS0tLS0tCisKK0lmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHN0YXJ0IGNhbGwgYmVoYXZpb3VyIHlvdSBjYW4gcmVnaXN0ZXIgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSAnc3RhcnRjYWxsYnV0dG9uJyBldmVudC4KKworVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyYCBvbmNlIHlvdSByZWNlaXZlIHRoZSBQaG9uZUdhcCAnZGV2aWNlcmVhZHknIGV2ZW50LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0Y2FsbGJ1dHRvbiIsIG9uU3RhcnRDYWxsS2V5RG93biwgZmFsc2UpOworCisgICAgZnVuY3Rpb24gb25TdGFydENhbGxLZXlEb3duKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIHN0YXJ0IGNhbGwgYnV0dG9uCisgICAgfQorCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBob25lR2FwIFN0YXJ0IENhbGwgQnV0dG9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbCBvbkRldmljZVJlYWR5IHdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkLgorICAgICAgICAvLworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCBidXQgcGhvbmVnYXAuanMgaGFzIG5vdC4KKyAgICAgICAgLy8gV2hlbiBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIHRhbGtpbmcgd2l0aCB0aGUgbmF0aXZlIGRldmljZSwKKyAgICAgICAgLy8gaXQgd2lsbCBjYWxsIHRoZSBldmVudCBgZGV2aWNlcmVhZHlgLgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBob25lR2FwIGlzIGxvYWRlZCBhbmQgaXQgaXMgbm93IHNhZmUgdG8gbWFrZSBjYWxscyBQaG9uZUdhcCBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnQgbGlzdGVuZXIKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0Y2FsbGJ1dHRvbiIsIG9uU3RhcnRDYWxsS2V5RG93biwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBzdGFydCBjYWxsIGJ1dHRvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblN0YXJ0Q2FsbEtleURvd24oKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy52b2x1bWVkb3duYnV0dG9uLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnZvbHVtZWRvd25idXR0b24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzNmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZXZlbnRzL2V2ZW50cy52b2x1bWVkb3duYnV0dG9uLm1kCkBAIC0wLDAgKzEsNjcgQEAKK3ZvbHVtZWRvd25idXR0b24KKz09PT09PT09PT09CisKK1RoaXMgaXMgYW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHZvbHVtZSBkb3duIGJ1dHRvbi4KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZvbHVtZWRvd25idXR0b24iLCB5b3VyQ2FsbGJhY2tGdW5jdGlvbiwgZmFsc2UpOworCitEZXRhaWxzCistLS0tLS0tCisKK0lmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZvbHVtZSBkb3duIGJlaGF2aW91ciB5b3UgY2FuIHJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgJ3ZvbHVtZWRvd25idXR0b24nIGV2ZW50LgorCitUeXBpY2FsbHksIHlvdSB3aWxsIHdhbnQgdG8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJgIG9uY2UgeW91IHJlY2VpdmUgdGhlIFBob25lR2FwICdkZXZpY2VyZWFkeScgZXZlbnQuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidm9sdW1lZG93bmJ1dHRvbiIsIG9uVm9sdW1lRG93bktleURvd24sIGZhbHNlKTsKKworICAgIGZ1bmN0aW9uIG9uVm9sdW1lRG93bktleURvd24oKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgdm9sdW1lIGRvd24gYnV0dG9uCisgICAgfQorCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBob25lR2FwIFZvbHVtZSBEb3duIEJ1dHRvbiBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIENhbGwgb25EZXZpY2VSZWFkeSB3aGVuIFBob25lR2FwIGlzIGxvYWRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgYnV0IHBob25lZ2FwLmpzIGhhcyBub3QuCisgICAgICAgIC8vIFdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCB0YWxraW5nIHdpdGggdGhlIG5hdGl2ZSBkZXZpY2UsCisgICAgICAgIC8vIGl0IHdpbGwgY2FsbCB0aGUgZXZlbnQgYGRldmljZXJlYWR5YC4KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Mb2FkKCkgeworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIGl0IGlzIG5vdyBzYWZlIHRvIG1ha2UgY2FsbHMgUGhvbmVHYXAgbWV0aG9kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2b2x1bWVkb3duYnV0dG9uIiwgb25Wb2x1bWVEb3duS2V5RG93biwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIHRoZSB2b2x1bWUgZG93biBidXR0b24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Wb2x1bWVEb3duS2V5RG93bigpIHsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHkgb25sb2FkPSJvbkxvYWQoKSI+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnZvbHVtZXVwYnV0dG9uLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ldmVudHMvZXZlbnRzLnZvbHVtZXVwYnV0dG9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2V2ZW50cy9ldmVudHMudm9sdW1ldXBidXR0b24ubWQKQEAgLTAsMCArMSw2NyBAQAordm9sdW1ldXBidXR0b24KKz09PT09PT09PT09CisKK1RoaXMgaXMgYW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHZvbHVtZSB1cCBidXR0b24uCisKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2b2x1bWV1cGJ1dHRvbiIsIHlvdXJDYWxsYmFja0Z1bmN0aW9uLCBmYWxzZSk7CisKK0RldGFpbHMKKy0tLS0tLS0KKworSWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdm9sdW1lIHVwIGJlaGF2aW91ciB5b3UgY2FuIHJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgJ3ZvbHVtZXVwYnV0dG9uJyBldmVudC4KKworVHlwaWNhbGx5LCB5b3Ugd2lsbCB3YW50IHRvIGF0dGFjaCBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyYCBvbmNlIHlvdSByZWNlaXZlIHRoZSBQaG9uZUdhcCAnZGV2aWNlcmVhZHknIGV2ZW50LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZvbHVtZXVwYnV0dG9uIiwgb25Wb2x1bWVVcEtleURvd24sIGZhbHNlKTsKKworICAgIGZ1bmN0aW9uIG9uVm9sdW1lVXBLZXlEb3duKCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIHZvbHVtZSB1cCBidXR0b24KKyAgICB9CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGhvbmVHYXAgVm9sdW1lIFVwIEJ1dHRvbiBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIENhbGwgb25EZXZpY2VSZWFkeSB3aGVuIFBob25lR2FwIGlzIGxvYWRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgYnV0IHBob25lZ2FwLmpzIGhhcyBub3QuCisgICAgICAgIC8vIFdoZW4gUGhvbmVHYXAgaXMgbG9hZGVkIGFuZCB0YWxraW5nIHdpdGggdGhlIG5hdGl2ZSBkZXZpY2UsCisgICAgICAgIC8vIGl0IHdpbGwgY2FsbCB0aGUgZXZlbnQgYGRldmljZXJlYWR5YC4KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Mb2FkKCkgeworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIGl0IGlzIG5vdyBzYWZlIHRvIG1ha2UgY2FsbHMgUGhvbmVHYXAgbWV0aG9kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2b2x1bWV1cGJ1dHRvbiIsIG9uVm9sdW1lVXBLZXlEb3duLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdGhlIHZvbHVtZSB1cCBidXR0b24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25Wb2x1bWVVcEtleURvd24oKSB7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IG9ubG9hZD0ib25Mb2FkKCkiPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9kaXJlY3RvcnllbnRyeS9kaXJlY3RvcnllbnRyeS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9kaXJlY3RvcnllbnRyeS9kaXJlY3RvcnllbnRyeS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzMwZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2RpcmVjdG9yeWVudHJ5L2RpcmVjdG9yeWVudHJ5Lm1kCkBAIC0wLDAgKzEsMzAwIEBACitEaXJlY3RvcnlFbnRyeQorPT09PT09PT09PT09PT0KKworVGhpcyBvYmplY3QgcmVwcmVzZW50cyBhIGRpcmVjdG9yeSBvbiBhIGZpbGUgc3lzdGVtLiAgSXQgaXMgZGVmaW5lZCBpbiB0aGUgW1czQyBEaXJlY3RvcmllcyBhbmQgU3lzdGVtc10oaHR0cDovL3d3dy53My5vcmcvVFIvZmlsZS1zeXN0ZW0tYXBpLykgc3BlY2lmaWNhdGlvbi4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9faXNGaWxlOl9fIEFsd2F5cyBmYWxzZS4gXyhib29sZWFuKV8KKy0gX19pc0RpcmVjdG9yeTpfXyBBbHdheXMgdHJ1ZS4gXyhib29sZWFuKV8KKy0gX19uYW1lOl9fIFRoZSBuYW1lIG9mIHRoZSBEaXJlY3RvcnlFbnRyeSwgZXhjbHVkaW5nIHRoZSBwYXRoIGxlYWRpbmcgdG8gaXQuIF8oRE9NU3RyaW5nKV8KKy0gX19mdWxsUGF0aDpfXyBUaGUgZnVsbCBhYnNvbHV0ZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIERpcmVjdG9yeUVudHJ5LiBfKERPTVN0cmluZylfCisKK05PVEU6IFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBieSB0aGUgVzNDIHNwZWNpZmljYXRpb24sIGJ1dCBhcmUgX19ub3Qgc3VwcG9ydGVkX18gYnkgUGhvbmVHYXA6CisKKy0gX19maWxlc3lzdGVtOl9fIFRoZSBmaWxlIHN5c3RlbSBvbiB3aGljaCB0aGUgRGlyZWN0b3J5RW50cnkgcmVzaWRlcy4gXyhGaWxlU3lzdGVtKV8gCisKK01ldGhvZHMKKy0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBpbnZva2VkIG9uIGEgRGlyZWN0b3J5RW50cnkgb2JqZWN0OgorCistIF9fZ2V0TWV0YWRhdGFfXzogTG9vayB1cCBtZXRhZGF0YSBhYm91dCBhIGRpcmVjdG9yeS4gCistIF9fbW92ZVRvX186IE1vdmUgYSBkaXJlY3RvcnkgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGZpbGUgc3lzdGVtLgorLSBfX2NvcHlUb19fOiBDb3B5IGEgZGlyZWN0b3J5IHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4KKy0gX190b1VSSV9fOiBSZXR1cm4gYSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2NhdGUgYSBkaXJlY3RvcnkuCistIF9fcmVtb3ZlX186IERlbGV0ZSBhIGRpcmVjdG9yeS4gIFRoZSBkaXJlY3RvcnkgbXVzdCBiZSBlbXB0eS4KKy0gX19nZXRQYXJlbnRfXzogTG9vayB1cCB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKy0gX19jcmVhdGVSZWFkZXJfXzogQ3JlYXRlIGEgbmV3IERpcmVjdG9yeVJlYWRlciB0aGF0IGNhbiByZWFkIGVudHJpZXMgZnJvbSBhIGRpcmVjdG9yeS4KKy0gX19nZXREaXJlY3RvcnlfXzogQ3JlYXRlIG9yIGxvb2sgdXAgYSBkaXJlY3RvcnkuCistIF9fZ2V0RmlsZV9fOiBDcmVhdGUgb3IgbG9vayB1cCBhIGZpbGUuCistIF9fcmVtb3ZlUmVjdXJzaXZlbHlfXzogRGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgorCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitnZXRNZXRhZGF0YQorLS0tLS0tLS0tLS0KKworTG9vayB1cCBtZXRhZGF0YSBhYm91dCBhIGRpcmVjdG9yeS4KKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCBhIE1ldGFkYXRhIG9iamVjdC4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgcmV0cmlldmluZyB0aGUgTWV0YWRhdGEuIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCisKK19fUXVpY2sgRXhhbXBsZV9fCisKKyAgICBmdW5jdGlvbiBzdWNjZXNzKG1ldGFkYXRhKSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJMYXN0IE1vZGlmaWVkOiAiICsgbWV0YWRhdGEubW9kaWZpY2F0aW9uVGltZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gZmFpbChlcnJvcikgeworICAgICAgICBhbGVydChlcnJvci5jb2RlKTsKKyAgICB9CisKKyAgICAvLyBSZXF1ZXN0IHRoZSBtZXRhZGF0YSBvYmplY3QgZm9yIHRoaXMgZW50cnkKKyAgICBlbnRyeS5nZXRNZXRhZGF0YShzdWNjZXNzLCBmYWlsKTsJCisKKworbW92ZVRvCistLS0tLS0KKworTW92ZSBhIGRpcmVjdG9yeSB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgZmlsZSBzeXN0ZW0uIEl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG86CisKKy0gbW92ZSBhIGRpcmVjdG9yeSBpbnNpZGUgaXRzZWxmIG9yIHRvIGFueSBjaGlsZCBhdCBhbnkgZGVwdGg7CistIG1vdmUgYSBkaXJlY3RvcnkgaW50byBpdHMgcGFyZW50IGlmIGEgbmFtZSBkaWZmZXJlbnQgZnJvbSBpdHMgY3VycmVudCBvbmUgaXMgbm90IHByb3ZpZGVkOworLSBtb3ZlIGEgZGlyZWN0b3J5IHRvIGEgcGF0aCBvY2N1cGllZCBieSBhIGZpbGU7CistIG1vdmUgYSBkaXJlY3RvcnkgdG8gYSBwYXRoIG9jY3VwaWVkIGJ5IGEgZGlyZWN0b3J5IHdoaWNoIGlzIG5vdCBlbXB0eS4KKworSW4gYWRkaXRpb24sIGFuIGF0dGVtcHQgdG8gbW92ZSBhIGRpcmVjdG9yeSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgZW1wdHkgZGlyZWN0b3J5IG11c3QgYXR0ZW1wdCB0byBkZWxldGUgYW5kIHJlcGxhY2UgdGhhdCBkaXJlY3RvcnkuCisKK19fUGFyYW1ldGVyczpfXworCistIF9fcGFyZW50X18gLSBUaGUgcGFyZW50IGRpcmVjdG9yeSB0byB3aGljaCB0byBtb3ZlIHRoZSBkaXJlY3RvcnkuIF8oRGlyZWN0b3J5RW50cnkpXworLSBfX25ld05hbWVfXyAtIFRoZSBuZXcgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBuYW1lIGlmIHVuc3BlY2lmaWVkLiBfKERPTVN0cmluZylfCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIERpcmVjdG9yeUVudHJ5IG9iamVjdCBvZiB0aGUgbmV3IGRpcmVjdG9yeS4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBhdHRlbXB0aW5nIHRvIG1vdmUgdGhlIGRpcmVjdG9yeS4gIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCisKK19fUXVpY2sgRXhhbXBsZV9fCisKKyAgICBmdW5jdGlvbiBzdWNjZXNzKGVudHJ5KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJOZXcgUGF0aDogIiArIGVudHJ5LmZ1bGxQYXRoKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KGVycm9yLmNvZGUpOworICAgIH0KKwkKKwlmdW5jdGlvbiBtb3ZlRGlyKGVudHJ5KSB7CisgICAgICAgIHZhciBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFyZW50JykudmFsdWUsCisgICAgICAgICAgICBuZXdOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ld05hbWUnKS52YWx1ZSwKKyAgICAgICAgICAgIHBhcmVudEVudHJ5ID0gbmV3IERpcmVjdG9yeUVudHJ5KHtmdWxsUGF0aDogcGFyZW50fSk7CisKKyAgICAgICAgLy8gbW92ZSB0aGUgZGlyZWN0b3J5IHRvIGEgbmV3IGRpcmVjdG9yeSBhbmQgcmVuYW1lIGl0CisgICAgICAgIGVudHJ5Lm1vdmVUbyhwYXJlbnRFbnRyeSwgbmV3TmFtZSwgc3VjY2VzcywgZmFpbCk7CisgICAgfQorCitjb3B5VG8KKy0tLS0tLQorCitDb3B5IGEgZGlyZWN0b3J5IHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4gSXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0bzoKKworLSBjb3B5IGEgZGlyZWN0b3J5IGluc2lkZSBpdHNlbGYgYXQgYW55IGRlcHRoOworLSBjb3B5IGEgZGlyZWN0b3J5IGludG8gaXRzIHBhcmVudCBpZiBhIG5hbWUgZGlmZmVyZW50IGZyb20gaXRzIGN1cnJlbnQgb25lIGlzIG5vdCBwcm92aWRlZC4gCisKK0RpcmVjdG9yeSBjb3BpZXMgYXJlIGFsd2F5cyByZWN1cnNpdmUgLSB0aGF0IGlzLCB0aGV5IGNvcHkgYWxsIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkuCisKK19fUGFyYW1ldGVyczpfXworCistIF9fcGFyZW50X18gLSBUaGUgcGFyZW50IGRpcmVjdG9yeSB0byB3aGljaCB0byBjb3B5IHRoZSBkaXJlY3RvcnkuIF8oRGlyZWN0b3J5RW50cnkpXworLSBfX25ld05hbWVfXyAtIFRoZSBuZXcgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBuYW1lIGlmIHVuc3BlY2lmaWVkLiBfKERPTVN0cmluZylfCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIERpcmVjdG9yeUVudHJ5IG9iamVjdCBvZiB0aGUgbmV3IGRpcmVjdG9yeS4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBhdHRlbXB0aW5nIHRvIGNvcHkgdGhlIHVuZGVybHlpbmcgZGlyZWN0b3J5LiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKKworX19RdWljayBFeGFtcGxlX18KKworCWZ1bmN0aW9uIHdpbihlbnRyeSkgeworCQljb25zb2xlLmxvZygiTmV3IFBhdGg6ICIgKyBlbnRyeS5mdWxsUGF0aCk7CisJfQorCQorCWZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKwkJYWxlcnQoZXJyb3IuY29kZSk7CisJfQorCQorCWZ1bmN0aW9uIGNvcHlEaXIoZW50cnkpIHsKKyAgICAgICAgdmFyIHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJlbnQnKS52YWx1ZSwKKyAgICAgICAgICAgIG5ld05hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3TmFtZScpLnZhbHVlLAorICAgICAgICAgICAgcGFyZW50RW50cnkgPSBuZXcgRGlyZWN0b3J5RW50cnkoe2Z1bGxQYXRoOiBwYXJlbnR9KTsKKworICAgICAgICAvLyBjb3B5IHRoZSBkaXJlY3RvcnkgdG8gYSBuZXcgZGlyZWN0b3J5IGFuZCByZW5hbWUgaXQKKyAgICAgICAgZW50cnkuY29weVRvKHBhcmVudEVudHJ5LCBuZXdOYW1lLCBzdWNjZXNzLCBmYWlsKTsKKyAgICB9CisKKwordG9VUkkKKy0tLS0tCisKK1JldHVybnMgYSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2NhdGUgdGhlIGRpcmVjdG9yeS4gCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgLy8gR2V0IHRoZSBVUkkgZm9yIHRoaXMgZGlyZWN0b3J5CisgICAgdmFyIHVyaSA9IGVudHJ5LnRvVVJJKCk7CisgICAgY29uc29sZS5sb2codXJpKTsKKworCityZW1vdmUKKy0tLS0tLQorCitEZWxldGVzIGEgZGlyZWN0b3J5LiBJdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvOgorCistIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzIG5vdCBlbXB0eTsKKy0gZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIGZpbGVzeXN0ZW0uCisKK19fUGFyYW1ldGVyczpfXworCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGFmdGVyIHRoZSBkaXJlY3RvcnkgaGFzIGJlZW4gZGVsZXRlZC4gIEludm9rZWQgd2l0aCBubyBwYXJhbWV0ZXJzLiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBkaXJlY3RvcnkuICBJbnZva2VkIHdpdGggYSBGaWxlRXJyb3Igb2JqZWN0LiBfKEZ1bmN0aW9uKV8KKworX19RdWljayBFeGFtcGxlX18KKwkKKyAgICBmdW5jdGlvbiBzdWNjZXNzKGVudHJ5KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJSZW1vdmFsIHN1Y2NlZWRlZCIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoJ0Vycm9yIHJlbW92aW5nIGRpcmVjdG9yeTogJyArIGVycm9yLmNvZGUpOworICAgIH0KKworICAgIC8vIHJlbW92ZSB0aGlzIGRpcmVjdG9yeQorICAgIGVudHJ5LnJlbW92ZShzdWNjZXNzLCBmYWlsKTsKKworCitnZXRQYXJlbnQKKy0tLS0tLS0tLQorCitMb29rIHVwIHRoZSBwYXJlbnQgRGlyZWN0b3J5RW50cnkgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5LiAKKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgZGlyZWN0b3J5J3MgcGFyZW50IERpcmVjdG9yeUVudHJ5LiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgdGhlIHBhcmVudCBEaXJlY3RvcnlFbnRyeS4gIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCitfX1F1aWNrIEV4YW1wbGVfXworCQorICAgIGZ1bmN0aW9uIHN1Y2Nlc3MocGFyZW50KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJQYXJlbnQgTmFtZTogIiArIHBhcmVudC5uYW1lKTsKKyAgICB9CisgCisgICAgZnVuY3Rpb24gZmFpbChlcnJvcikgeworICAgICAgICBhbGVydCgnRmFpbGVkIHRvIGdldCBwYXJlbnQgZGlyZWN0b3J5OiAnICsgZXJyb3IuY29kZSk7CisgICAgfQorCQorCS8vIEdldCB0aGUgcGFyZW50IERpcmVjdG9yeUVudHJ5CisJZW50cnkuZ2V0UGFyZW50KHN1Y2Nlc3MsIGZhaWwpOwkKKworCitjcmVhdGVSZWFkZXIKKy0tLS0tLS0tLS0tLQorCitDcmVhdGVzIGEgbmV3IERpcmVjdG9yeVJlYWRlciB0byByZWFkIGVudHJpZXMgaW4gYSBkaXJlY3RvcnkuCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgLy8gY3JlYXRlIGEgZGlyZWN0b3J5IHJlYWRlcgorICAgIHZhciBkaXJlY3RvcnlSZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTsJCisKKworZ2V0RGlyZWN0b3J5CistLS0tLS0tLS0tLS0KKworQ3JlYXRlcyBvciBsb29rcyB1cCBhbiBleGlzdGluZyBkaXJlY3RvcnkuICBJdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvOgorCistIGNyZWF0ZSBhIGRpcmVjdG9yeSB3aG9zZSBpbW1lZGlhdGUgcGFyZW50IGRvZXMgbm90IHlldCBleGlzdC4KKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19wYXRoX18gLSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGJlIGxvb2tlZCB1cCBvciBjcmVhdGVkLiAgRWl0aGVyIGFuIGFic29sdXRlIHBhdGgsIG9yIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoaXMgRGlyZWN0b3J5RW50cnkuIF8oRE9NU3RyaW5nKV8KKy0gX19vcHRpb25zX18gLSBPcHRpb25zIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBleGlzdC4gIF8oRmxhZ3MpXworLSBfX3N1Y2Nlc3NDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2l0aCBhIERpcmVjdG9yeUVudHJ5IG9iamVjdC4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgb3IgbG9va2luZyB1cCB0aGUgZGlyZWN0b3J5LiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgZnVuY3Rpb24gc3VjY2VzcyhwYXJlbnQpIHsKKyAgICAgICAgY29uc29sZS5sb2coIlBhcmVudCBOYW1lOiAiICsgcGFyZW50Lm5hbWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoIlVuYWJsZSB0byBjcmVhdGUgbmV3IGRpcmVjdG9yeTogIiArIGVycm9yLmNvZGUpOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgb3IgY3JlYXRlIGl0IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QKKyAgICBlbnRyeS5nZXREaXJlY3RvcnkoIm5ld0RpciIsIHtjcmVhdGU6IHRydWUsIGV4Y2x1c2l2ZTogZmFsc2V9LCBzdWNjZXNzLCBmYWlsKTsJCisKKworZ2V0RmlsZQorLS0tLS0tLQorCitDcmVhdGVzIG9yIGxvb2tzIHVwIGEgZmlsZS4gIEl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG86CisKKy0gY3JlYXRlIGEgZmlsZSB3aG9zZSBpbW1lZGlhdGUgcGFyZW50IGRvZXMgbm90IHlldCBleGlzdC4KKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19wYXRoX18gLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBsb29rZWQgdXAgb3IgY3JlYXRlZC4gIEVpdGhlciBhbiBhYnNvbHV0ZSBwYXRoLCBvciBhIHJlbGF0aXZlIHBhdGggZnJvbSB0aGlzIERpcmVjdG9yeUVudHJ5LiBfKERPTVN0cmluZylfCistIF9fb3B0aW9uc19fIC0gT3B0aW9ucyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgXyhGbGFncylfCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aXRoIGEgRmlsZUVudHJ5IG9iamVjdC4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgb3IgbG9va2luZyB1cCB0aGUgZmlsZS4gIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCitfX1F1aWNrIEV4YW1wbGVfXworCQorICAgIGZ1bmN0aW9uIHN1Y2Nlc3MocGFyZW50KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJQYXJlbnQgTmFtZTogIiArIHBhcmVudC5uYW1lKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KCJGYWlsZWQgdG8gcmV0cmlldmUgZmlsZTogIiArIGVycm9yLmNvZGUpOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGFuIGV4aXN0aW5nIGZpbGUsIG9yIGNyZWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgIGVudHJ5LmdldEZpbGUoIm5ld0ZpbGUudHh0Iiwge2NyZWF0ZTogdHJ1ZSwgZXhjbHVzaXZlOiBmYWxzZX0sIHN1Y2Nlc3MsIGZhaWwpOwkKKworCityZW1vdmVSZWN1cnNpdmVseQorLS0tLS0tLS0tLS0tLS0tLS0KKworRGVsZXRlcyBhIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4gIEluIHRoZSBldmVudCBvZiBhbiBlcnJvciAoZS5nLiB0cnlpbmcgdG8gZGVsZXRlIAorYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIGZpbGUgdGhhdCBjYW5ub3QgYmUgcmVtb3ZlZCksIHNvbWUgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgbWF5IAorYmUgZGVsZXRlZC4gICBJdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvOgorCistIGRlbGV0ZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBmaWxlc3lzdGVtLgorCitfX1BhcmFtZXRlcnM6X18KKworLSBfX3N1Y2Nlc3NDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBhZnRlciB0aGUgRGlyZWN0b3J5RW50cnkgaGFzIGJlZW4gZGVsZXRlZC4gIEludm9rZWQgd2l0aCBubyBwYXJhbWV0ZXJzLiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBEaXJlY3RvcnlFbnRyeS4gIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCitfX1F1aWNrIEV4YW1wbGVfXworCQorICAgIGZ1bmN0aW9uIHN1Y2Nlc3MocGFyZW50KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJSZW1vdmUgUmVjdXJzaXZlbHkgU3VjY2VlZGVkIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gZmFpbChlcnJvcikgeworICAgICAgICBhbGVydCgiRmFpbGVkIHRvIHJlbW92ZSBkaXJlY3Rvcnkgb3IgaXQncyBjb250ZW50czogIiArIGVycm9yLmNvZGUpOworICAgIH0KKworICAgIC8vIHJlbW92ZSB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgaXQncyBjb250ZW50cworICAgIGVudHJ5LnJlbW92ZVJlY3Vyc2l2ZWx5KHN1Y2Nlc3MsIGZhaWwpOwkKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9kaXJlY3RvcnlyZWFkZXIvZGlyZWN0b3J5cmVhZGVyLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2RpcmVjdG9yeXJlYWRlci9kaXJlY3RvcnlyZWFkZXIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNzcwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9kaXJlY3RvcnlyZWFkZXIvZGlyZWN0b3J5cmVhZGVyLm1kCkBAIC0wLDAgKzEsNDcgQEAKK0RpcmVjdG9yeVJlYWRlcgorPT09PT09PT09PT09PT09CisKK0FuIG9iamVjdCB0aGF0IGxpc3RzIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiBhIGRpcmVjdG9yeS4gIERlZmluZWQgaW4gdGhlIFtEaXJlY3RvcmllcyBhbmQgU3lzdGVtc10oaHR0cDovL3d3dy53My5vcmcvVFIvZmlsZS1zeXN0ZW0tYXBpLykgc3BlY2lmaWNhdGlvbi4KKworTWV0aG9kcworLS0tLS0tLQorCistIF9fcmVhZEVudHJpZXNfXzogUmVhZCB0aGUgZW50cmllcyBpbiBhIGRpcmVjdG9yeS4gCisKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK3JlYWRFbnRyaWVzCistLS0tLS0tLS0tLQorCitSZWFkIHRoZSBlbnRyaWVzIGluIHRoaXMgZGlyZWN0b3J5LgorCitfX1BhcmFtZXRlcnM6X18KKworLSBfX3N1Y2Nlc3NDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCBhbiBhcnJheSBvZiBGaWxlRW50cnkgYW5kIERpcmVjdG9yeUVudHJ5IG9iamVjdHMuIF8oRnVuY3Rpb24pXworLSBfX2Vycm9yQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHJldHJpZXZpbmcgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiBJbnZva2VkIHdpdGggYSBGaWxlRXJyb3Igb2JqZWN0LiBfKEZ1bmN0aW9uKV8KKworX19RdWljayBFeGFtcGxlX18KKwkKKyAgICBmdW5jdGlvbiBzdWNjZXNzKGVudHJpZXMpIHsKKyAgICAgICAgdmFyIGk7CisgICAgICAgIGZvciAoaT0wOyBpPGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGVudHJpZXNbaV0ubmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KCJGYWlsZWQgdG8gbGlzdCBkaXJlY3RvcnkgY29udGVudHM6ICIgKyBlcnJvci5jb2RlKTsKKyAgICB9CisKKyAgICAvLyBHZXQgYSBkaXJlY3RvcnkgcmVhZGVyCisgICAgdmFyIGRpcmVjdG9yeVJlYWRlciA9IGRpckVudHJ5LmNyZWF0ZVJlYWRlcigpOworCisgICAgLy8gR2V0IGEgbGlzdCBvZiBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeQorICAgIGRpcmVjdG9yeVJlYWRlci5yZWFkRW50cmllcyhzdWNjZXNzLGZhaWwpOwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGUubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQzNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGUubWQKQEAgLTAsMCArMSwyMyBAQAorRmlsZQorPT09PT09PT09PQorCis+IEFuIEFQSSB0byByZWFkLCB3cml0ZSBhbmQgbmF2aWdhdGUgZmlsZSBzeXN0ZW0gaGllcmFyY2hpZXMuIAorCitPYmplY3RzCistLS0tLS0tCisKKy0gRGlyZWN0b3J5RW50cnkKKy0gRGlyZWN0b3J5UmVhZGVyCistIEZpbGUKKy0gRmlsZUVudHJ5CistIEZpbGVFcnJvcgorLSBGaWxlUmVhZGVyCistIEZpbGVTeXN0ZW0KKy0gRmlsZVRyYW5zZmVyCistIEZpbGVUcmFuc2ZlckVycm9yCistIEZpbGVVcGxvYWRPcHRpb25zCistIEZpbGVVcGxvYWRSZXN1bHQKKy0gRmlsZVdyaXRlcgorLSBGbGFncworLSBMb2NhbEZpbGVTeXN0ZW0KKy0gTWV0YWRhdGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZWVudHJ5L2ZpbGVlbnRyeS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxlZW50cnkvZmlsZWVudHJ5Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjA0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZWVudHJ5L2ZpbGVlbnRyeS5tZApAQCAtMCwwICsxLDI0MiBAQAorRmlsZUVudHJ5Cis9PT09PT09PT09CisKK1RoaXMgb2JqZWN0IHJlcHJlc2VudHMgYSBmaWxlIG9uIGEgZmlsZSBzeXN0ZW0uICBJdCBpcyBkZWZpbmVkIGluIHRoZSBbVzNDIERpcmVjdG9yaWVzIGFuZCBTeXN0ZW1zXShodHRwOi8vd3d3LnczLm9yZy9UUi9maWxlLXN5c3RlbS1hcGkvKSBzcGVjaWZpY2F0aW9uLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19pc0ZpbGU6X18gQWx3YXlzIHRydWUuIF8oYm9vbGVhbilfCistIF9faXNEaXJlY3Rvcnk6X18gQWx3YXlzIGZhbHNlLiBfKGJvb2xlYW4pXworLSBfX25hbWU6X18gVGhlIG5hbWUgb2YgdGhlIEZpbGVFbnRyeSwgZXhjbHVkaW5nIHRoZSBwYXRoIGxlYWRpbmcgdG8gaXQuIF8oRE9NU3RyaW5nKV8KKy0gX19mdWxsUGF0aDpfXyBUaGUgZnVsbCBhYnNvbHV0ZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIEZpbGVFbnRyeS4gXyhET01TdHJpbmcpXworCitOT1RFOiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYnkgdGhlIFczQyBzcGVjaWZpY2F0aW9uLCBidXQgYXJlIF9fbm90IHN1cHBvcnRlZF9fIGJ5IFBob25lR2FwOgorCistIF9fZmlsZXN5c3RlbTpfXyBUaGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggdGhlIEZpbGVFbnRyeSByZXNpZGVzLiBfKEZpbGVTeXN0ZW0pXworCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBfX2dldE1ldGFkYXRhX186IExvb2sgdXAgbWV0YWRhdGEgYWJvdXQgYSBmaWxlLiAKKy0gX19tb3ZlVG9fXzogTW92ZSBhIGZpbGUgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gb24gdGhlIGZpbGUgc3lzdGVtLgorLSBfX2NvcHlUb19fOiBDb3B5IGEgZmlsZSB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBvbiB0aGUgZmlsZSBzeXN0ZW0uCistIF9fdG9VUklfXzogUmV0dXJuIGEgVVJJIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9jYXRlIGEgZmlsZS4KKy0gX19yZW1vdmVfXzogRGVsZXRlIGEgZmlsZS4gIAorLSBfX2dldFBhcmVudF9fOiBMb29rIHVwIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorLSBfX2NyZWF0ZVdyaXRlcl9fOiBDcmVhdGVzIGEgRmlsZVdyaXRlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byBhIGZpbGUuCistIF9fZmlsZV9fOiBDcmVhdGVzIGEgRmlsZSBvYmplY3QgY29udGFpbmluZyBmaWxlIHByb3BlcnRpZXMuCisKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKKworZ2V0TWV0YWRhdGEKKy0tLS0tLS0tLS0tLS0tLS0KKworTG9vayB1cCBtZXRhZGF0YSBhYm91dCBhIGZpbGUuCisKK19fUGFyYW1ldGVyczpfXworCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggYSBNZXRhZGF0YSBvYmplY3QuIF8oRnVuY3Rpb24pXworLSBfX2Vycm9yQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHJldHJpZXZpbmcgdGhlIE1ldGFkYXRhLiBJbnZva2VkIHdpdGggYSBGaWxlRXJyb3Igb2JqZWN0LiBfKEZ1bmN0aW9uKV8KKworCitfX1F1aWNrIEV4YW1wbGVfXworCisgICAgZnVuY3Rpb24gc3VjY2VzcyhtZXRhZGF0YSkgeworICAgICAgICBjb25zb2xlLmxvZygiTGFzdCBNb2RpZmllZDogIiArIG1ldGFkYXRhLm1vZGlmaWNhdGlvblRpbWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoZXJyb3IuY29kZSk7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCB0aGUgbWV0YWRhdGEgb2JqZWN0IGZvciB0aGlzIGVudHJ5CisgICAgZW50cnkuZ2V0TWV0YWRhdGEoc3VjY2VzcywgZmFpbCk7CQorCisKK21vdmVUbworLS0tLS0tCisKK01vdmUgYSBmaWxlIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4gSXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0bzoKKworLSBtb3ZlIGEgZmlsZSBpbnRvIGl0cyBwYXJlbnQgaWYgYSBuYW1lIGRpZmZlcmVudCBmcm9tIGl0cyBjdXJyZW50IG9uZSBpc24ndCBwcm92aWRlZDsKKy0gbW92ZSBhIGZpbGUgdG8gYSBwYXRoIG9jY3VwaWVkIGJ5IGEgZGlyZWN0b3J5OworCitJbiBhZGRpdGlvbiwgYW4gYXR0ZW1wdCB0byBtb3ZlIGEgZmlsZSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgZmlsZSBtdXN0IGF0dGVtcHQgdG8gZGVsZXRlIGFuZCByZXBsYWNlIHRoYXQgZmlsZS4gCisKK19fUGFyYW1ldGVyczpfXworCistIF9fcGFyZW50X18gLSBUaGUgcGFyZW50IGRpcmVjdG9yeSB0byB3aGljaCB0byBtb3ZlIHRoZSBmaWxlLiBfKERpcmVjdG9yeUVudHJ5KV8KKy0gX19uZXdOYW1lX18gLSBUaGUgbmV3IG5hbWUgb2YgdGhlIGZpbGUuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IG5hbWUgaWYgdW5zcGVjaWZpZWQuIF8oRE9NU3RyaW5nKV8KKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgRmlsZUVudHJ5IG9iamVjdCBvZiB0aGUgbmV3IGZpbGUuIF8oRnVuY3Rpb24pXworLSBfX2Vycm9yQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gYXR0ZW1wdGluZyB0byBtb3ZlIHRoZSBmaWxlLiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKKworX19RdWljayBFeGFtcGxlX18KKworICAgIGZ1bmN0aW9uIHN1Y2Nlc3MoZW50cnkpIHsKKyAgICAgICAgY29uc29sZS5sb2coIk5ldyBQYXRoOiAiICsgZW50cnkuZnVsbFBhdGgpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoZXJyb3IuY29kZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gbW92ZUZpbGUoZW50cnkpIHsKKyAgICAgICAgdmFyIHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJlbnQnKS52YWx1ZSwKKyAgICAgICAgICAgIHBhcmVudEVudHJ5ID0gbmV3IERpcmVjdG9yeUVudHJ5KHtmdWxsUGF0aDogcGFyZW50fSk7CisKKyAgICAgICAgLy8gbW92ZSB0aGUgZmlsZSB0byBhIG5ldyBkaXJlY3RvcnkgYW5kIHJlbmFtZSBpdAorICAgICAgICBlbnRyeS5tb3ZlVG8ocGFyZW50RW50cnksICJuZXdGaWxlLnR4dCIsIHN1Y2Nlc3MsIGZhaWwpOworICAgIH0KKwkKKworY29weVRvCistLS0tLS0KKworQ29weSBhIGZpbGUgdG8gYSBuZXcgbG9jYXRpb24gb24gdGhlIGZpbGUgc3lzdGVtLiAgSXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0bzoKKworLSBjb3B5IGEgZmlsZSBpbnRvIGl0cyBwYXJlbnQgaWYgYSBuYW1lIGRpZmZlcmVudCBmcm9tIGl0cyBjdXJyZW50IG9uZSBpcyBub3QgcHJvdmlkZWQuIAorCitfX1BhcmFtZXRlcnM6X18KKworLSBfX3BhcmVudF9fIC0gVGhlIHBhcmVudCBkaXJlY3RvcnkgdG8gd2hpY2ggdG8gY29weSB0aGUgZmlsZS4gXyhEaXJlY3RvcnlFbnRyeSlfCistIF9fbmV3TmFtZV9fIC0gVGhlIG5ldyBuYW1lIG9mIHRoZSBmaWxlLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBuYW1lIGlmIHVuc3BlY2lmaWVkLiBfKERPTVN0cmluZylfCistIF9fc3VjY2Vzc0NhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIEZpbGVFbnRyeSBvYmplY3Qgb2YgdGhlIG5ldyBmaWxlLiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gY29weSB0aGUgZmlsZS4gIEludm9rZWQgd2l0aCBhIEZpbGVFcnJvciBvYmplY3QuIF8oRnVuY3Rpb24pXworCisKK19fUXVpY2sgRXhhbXBsZV9fCisKKyAgICBmdW5jdGlvbiB3aW4oZW50cnkpIHsKKwkgICAgY29uc29sZS5sb2coIk5ldyBQYXRoOiAiICsgZW50cnkuZnVsbFBhdGgpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKwkgICAgYWxlcnQoZXJyb3IuY29kZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gY29weUZpbGUoZW50cnkpIHsKKyAgICAgICAgdmFyIHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJlbnQnKS52YWx1ZSwKKyAgICAgICAgICAgIHBhcmVudEVudHJ5ID0gbmV3IERpcmVjdG9yeUVudHJ5KHtmdWxsUGF0aDogcGFyZW50fSk7CisKKyAgICAgICAgLy8gY29weSB0aGUgZmlsZSB0byBhIG5ldyBkaXJlY3RvcnkgYW5kIHJlbmFtZSBpdAorICAgICAgICBlbnRyeS5jb3B5VG8ocGFyZW50RW50cnksICJmaWxlLmNvcHkiLCBzdWNjZXNzLCBmYWlsKTsKKyAgICB9CisKKwkKK3RvVVJJCistLS0tLQorCitSZXR1cm5zIGEgVVJJIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlLiAKKworX19RdWljayBFeGFtcGxlX18KKwkKKyAgICAvLyBSZXF1ZXN0IHRoZSBVUkkgZm9yIHRoaXMgZW50cnkKKyAgICB2YXIgdXJpID0gZW50cnkudG9VUkkoKTsKKyAgICBjb25zb2xlLmxvZyh1cmkpOworCisKK3JlbW92ZQorLS0tLS0tCisKK0RlbGV0ZXMgYSBmaWxlLiAKKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZC4gIEludm9rZWQgd2l0aCBubyBwYXJhbWV0ZXJzLiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBmaWxlLiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgZnVuY3Rpb24gc3VjY2VzcyhlbnRyeSkgeworICAgICAgICBjb25zb2xlLmxvZygiUmVtb3ZhbCBzdWNjZWVkZWQiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KCdFcnJvciByZW1vdmluZyBmaWxlOiAnICsgZXJyb3IuY29kZSk7CisgICAgfQorCisgICAgLy8gcmVtb3ZlIHRoZSBmaWxlCisgICAgZW50cnkucmVtb3ZlKHN1Y2Nlc3MsIGZhaWwpOworCisKK2dldFBhcmVudAorLS0tLS0tLS0tCisKK0xvb2sgdXAgdGhlIHBhcmVudCBEaXJlY3RvcnlFbnRyeSBjb250YWluaW5nIHRoZSBmaWxlLiAKKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgZmlsZSdzIHBhcmVudCBEaXJlY3RvcnlFbnRyeS4gXyhGdW5jdGlvbilfCistIF9fZXJyb3JDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRoZSBwYXJlbnQgRGlyZWN0b3J5RW50cnkuICBJbnZva2VkIHdpdGggYSBGaWxlRXJyb3Igb2JqZWN0LiBfKEZ1bmN0aW9uKV8KKworX19RdWljayBFeGFtcGxlX18KKwkKKyAgICBmdW5jdGlvbiBzdWNjZXNzKHBhcmVudCkgeworICAgICAgICBjb25zb2xlLmxvZygiUGFyZW50IE5hbWU6ICIgKyBwYXJlbnQubmFtZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gZmFpbChlcnJvcikgeworICAgICAgICBhbGVydChlcnJvci5jb2RlKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHBhcmVudCBEaXJlY3RvcnlFbnRyeQorICAgIGVudHJ5LmdldFBhcmVudChzdWNjZXNzLCBmYWlsKTsJCisKKworY3JlYXRlV3JpdGVyCistLS0tLS0tLS0tLS0KKworQ3JlYXRlIGEgRmlsZVdyaXRlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHRoYXQgdGhlIEZpbGVFbnRyeSByZXByZXNlbnRzLgorCitfX1BhcmFtZXRlcnM6X18KKworLSBfX3N1Y2Nlc3NDYWxsYmFja19fIC0gQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aXRoIGEgRmlsZVdyaXRlciBvYmplY3QuIF8oRnVuY3Rpb24pXworLSBfX2Vycm9yQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZSBGaWxlV3JpdGVyLiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgZnVuY3Rpb24gc3VjY2Vzcyh3cml0ZXIpIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKCJTb21lIHRleHQgdG8gdGhlIGZpbGUiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KGVycm9yLmNvZGUpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBhIEZpbGVXcml0ZXIgdG8gd3JpdGUgdG8gdGhlIGZpbGUKKyAgICBlbnRyeS5jcmVhdGVXcml0ZXIoc3VjY2VzcywgZmFpbCk7CQorCisKK2ZpbGUKKy0tLS0KKworUmV0dXJuIGEgRmlsZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmaWxlIHRoYXQgdGhpcyBGaWxlRW50cnkgcmVwcmVzZW50cy4KKworX19QYXJhbWV0ZXJzOl9fCisKKy0gX19zdWNjZXNzQ2FsbGJhY2tfXyAtIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCBhIEZpbGUgb2JqZWN0LiBfKEZ1bmN0aW9uKV8KKy0gX19lcnJvckNhbGxiYWNrX18gLSBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGNyZWF0aW5nIHRoZSBGaWxlIG9iamVjdCAoZS5nLiB0aGUgdW5kZXJseWluZyBmaWxlIG5vIGxvbmdlciBleGlzdHMpLiAgSW52b2tlZCB3aXRoIGEgRmlsZUVycm9yIG9iamVjdC4gXyhGdW5jdGlvbilfCisKK19fUXVpY2sgRXhhbXBsZV9fCisJCisgICAgZnVuY3Rpb24gc3VjY2VzcyhmaWxlKSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJGaWxlIHNpemU6ICIgKyBmaWxlLnNpemUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAgICAgYWxlcnQoIlVuYWJsZSB0byByZXRyaWV2ZSBmaWxlIHByb3BlcnRpZXM6ICIgKyBlcnJvci5jb2RlKTsKKyAgICB9CisgCisgICAgLy8gb2J0YWluIHByb3BlcnRpZXMgb2YgYSBmaWxlCisgICAgZW50cnkuZmlsZShzdWNjZXNzLCBmYWlsKTsJCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZWVycm9yL2ZpbGVlcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxlZXJyb3IvZmlsZWVycm9yLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzlhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZWVycm9yL2ZpbGVlcnJvci5tZApAQCAtMCwwICsxLDMwIEBACitGaWxlRXJyb3IKKz09PT09PT09CisKK0EgJ0ZpbGVFcnJvcicgb2JqZWN0IGlzIHNldCB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiBhbnkgb2YgdGhlIEZpbGUgQVBJIG1ldGhvZHMuIAorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19jb2RlOl9fIE9uZSBvZiB0aGUgcHJlZGVmaW5lZCBlcnJvciBjb2RlcyBsaXN0ZWQgYmVsb3cuCisKK0NvbnN0YW50cworLS0tLS0tLS0tCisKKy0gYEZpbGVFcnJvci5OT1RfRk9VTkRfRVJSYAorLSBgRmlsZUVycm9yLlNFQ1VSSVRZX0VSUmAKKy0gYEZpbGVFcnJvci5BQk9SVF9FUlJgCistIGBGaWxlRXJyb3IuTk9UX1JFQURBQkxFX0VSUmAKKy0gYEZpbGVFcnJvci5FTkNPRElOR19FUlJgCistIGBGaWxlRXJyb3IuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSYAorLSBgRmlsZUVycm9yLklOVkFMSURfU1RBVEVfRVJSYAorLSBgRmlsZUVycm9yLlNZTlRBWF9FUlJgCistIGBGaWxlRXJyb3IuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSYAorLSBgRmlsZUVycm9yLlFVT1RBX0VYQ0VFREVEX0VSUmAKKy0gYEZpbGVFcnJvci5UWVBFX01JU01BVENIX0VSUmAKKy0gYEZpbGVFcnJvci5QQVRIX0VYSVNUU19FUlJgCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYEZpbGVFcnJvcmAgb2JqZWN0IGlzIHRoZSBvbmx5IHBhcmFtZXRlciBvZiBhbnkgb2YgdGhlIEZpbGUgQVBJJ3MgZXJyb3IgY2FsbGJhY2tzLiAgRGV2ZWxvcGVycyBtdXN0IHJlYWQgdGhlIGNvZGUgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGVycm9yLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxlb2JqL2ZpbGVvYmoubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZW9iai9maWxlb2JqLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjc4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZW9iai9maWxlb2JqLm1kCkBAIC0wLDAgKzEsMjYgQEAKK0ZpbGUKKz09PT0KKworVGhpcyBvYmplY3QgY29udGFpbnMgYXR0cmlidXRlcyBvZiBhIHNpbmdsZSBmaWxlLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19uYW1lOl9fIFRoZSBuYW1lIG9mIHRoZSBmaWxlLiBfKERPTVN0cmluZylfCistIF9fZnVsbFBhdGg6X18gVGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZS4gXyhET01TdHJpbmcpXworLSBfX3R5cGU6X18gVGhlIG1pbWUgdHlwZSBvZiB0aGUgZmlsZS4gXyhET01TdHJpbmcpXworLSBfX2xhc3RNb2RpZmllZERhdGU6X18gVGhlIGxhc3QgdGltZSB0aGUgZmlsZSB3YXMgbW9kaWZpZWQuIF8oRGF0ZSlfCistIF9fc2l6ZTpfXyBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4gXyhsb25nKV8KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYEZpbGVgIG9iamVjdCBjb250YWlucyBhdHRyaWJ1dGVzIG9mIGEgc2luZ2xlIGZpbGUuICBZb3UgY2FuIGdldCBhbiBpbnN0YW5jZSBvZiBhIEZpbGUgb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIF9fZmlsZV9fIG1ldGhvZCBvZiBhIGBGaWxlRW50cnlgIG9iamVjdC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXJlYWRlci9maWxlcmVhZGVyLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGVyZWFkZXIvZmlsZXJlYWRlci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJmYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGVyZWFkZXIvZmlsZXJlYWRlci5tZApAQCAtMCwwICsxLDE3NyBAQAorRmlsZVJlYWRlcgorPT09PT09PT09PQorCitGaWxlUmVhZGVyIGlzIGFuIG9iamVjdCB0aGF0IGFsbG93cyBvbmUgdG8gcmVhZCBhIGZpbGUuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX3JlYWR5U3RhdGU6X18gT25lIG9mIHRoZSB0aHJlZSBzdGF0ZXMgdGhlIHJlYWRlciBjYW4gYmUgaW4gRU1QVFksIExPQURJTkcgb3IgRE9ORS4KKy0gX19yZXN1bHQ6X18gVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRoYXQgaGFzIGJlZW4gcmVhZC4gXyhET01TdHJpbmcpXworLSBfX2Vycm9yOl9fIEFuIG9iamVjdCBjb250YWluaW5nIGVycm9ycy4gXyhGaWxlRXJyb3IpXworLSBfX29ubG9hZHN0YXJ0Ol9fIENhbGxlZCB3aGVuIHRoZSByZWFkIHN0YXJ0cy4gLiBfKEZ1bmN0aW9uKV8KKy0gX19vbnByb2dyZXNzOl9fIENhbGxlZCB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLCByZXBvcnRzIHByb2dyZXNzIChwcm9nZXNzLmxvYWRlZC9wcm9ncmVzcy50b3RhbCkuIF8oRnVuY3Rpb24pXyAtTk9UIFNVUFBPUlRFRAorLSBfX29ubG9hZDpfXyBDYWxsZWQgd2hlbiB0aGUgcmVhZCBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gXyhGdW5jdGlvbilfCistIF9fb25hYm9ydDpfXyBDYWxsZWQgd2hlbiB0aGUgcmVhZCBoYXMgYmVlbiBhYm9ydGVkLiBGb3IgaW5zdGFuY2UsIGJ5IGludm9raW5nIHRoZSBhYm9ydCgpIG1ldGhvZC4gXyhGdW5jdGlvbilfCistIF9fb25lcnJvcjpfXyBDYWxsZWQgd2hlbiB0aGUgcmVhZCBoYXMgZmFpbGVkLiBfKEZ1bmN0aW9uKV8KKy0gX19vbmxvYWRlbmQ6X18gQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCAoZWl0aGVyIGluIHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuICBfKEZ1bmN0aW9uKV8KKworTWV0aG9kcworLS0tLS0tLQorCistIF9fYWJvcnRfXzogQWJvcnRzIHJlYWRpbmcgZmlsZS4gCistIF9fcmVhZEFzRGF0YVVSTF9fOiBSZWFkIGZpbGUgYW5kIHJldHVybiBkYXRhIGFzIGEgYmFzZTY0IGVuY29kZWQgZGF0YSB1cmwuCistIF9fcmVhZEFzVGV4dF9fOiBSZWFkcyB0ZXh0IGZpbGUuCisKK0RldGFpbHMKKy0tLS0tLS0KKworVGhlIGBGaWxlUmVhZGVyYCBvYmplY3QgaXMgYSB3YXkgdG8gcmVhZCBmaWxlcyBmcm9tIHRoZSBkZXZpY2VzIGZpbGUgc3lzdGVtLiAgRmlsZXMgY2FuIGJlIHJlYWQgYXMgdGV4dCBvciBhcyBhIGJhc2U2NCBkYXRhIGVuY29kZWQgc3RyaW5nLiAgVXNlcnMgcmVnaXN0ZXIgdGhlaXIgb3duIGV2ZW50IGxpc3RuZXJzIHRvIHJlY2VpdmUgdGhlIGxvYWRzdGFydCwgcHJvZ3Jlc3MsIGxvYWQsIGxvYWRlbmQsIGVycm9yIGFuZCBhYm9ydCBldmVudHMuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitSZWFkIEFzIERhdGEgVVJMIAorLS0tLS0tLS0tLS0tLS0tLQorCitfX1BhcmFtZXRlcnM6X18KKy0gZmlsZSAtIHRoZSBmaWxlIG9iamVjdCB0byByZWFkCisKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gd2luKGZpbGUpIHsKKwkJdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CisJCXJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgCWNvbnNvbGUubG9nKCJyZWFkIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2dC50YXJnZXQucmVzdWx0KTsKKyAgICAgICAgfTsKKwkJcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CisJfTsKKworCXZhciBmYWlsID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgCWNvbnNvbGUubG9nKGVycm9yLmNvZGUpOworCX07CisJCisgICAgZW50cnkuZmlsZSh3aW4sIGZhaWwpOworCitSZWFkIEFzIFRleHQKKy0tLS0tLS0tLS0tLQorCitfX1BhcmFtZXRlcnM6X18KKworLSBmaWxlIC0gdGhlIGZpbGUgb2JqZWN0IHRvIHJlYWQKKy0gZW5jb2RpbmcgLSB0aGUgZW5jb2RpbmcgdG8gdXNlIHRvIGVuY29kZSB0aGUgZmlsZSdzIGNvbnRlbnQuIERlZmF1bHQgaXMgVVRGOC4KKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gd2luKGZpbGUpIHsKKwkJdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CisJCXJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgCWNvbnNvbGUubG9nKCJyZWFkIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2dC50YXJnZXQucmVzdWx0KTsKKyAgICAgICAgfTsKKwkJcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7CisJfTsKKworCXZhciBmYWlsID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgCWNvbnNvbGUubG9nKGVycm9yLmNvZGUpOworCX07CisJCisgICAgZW50cnkuZmlsZSh3aW4sIGZhaWwpOworCitBYm9ydCBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlmdW5jdGlvbiB3aW4oZmlsZSkgeworCQl2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKKwkJcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAJY29uc29sZS5sb2coInJlYWQgc3VjY2VzcyIpOworICAgICAgICAgICAgY29uc29sZS5sb2coZXZ0LnRhcmdldC5yZXN1bHQpOworICAgICAgICB9OworCQlyZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKKwkJcmVhZGVyLmFib3J0KCk7CisJfTsKKworICAgIGZ1bmN0aW9uIGZhaWwoZXJyb3IpIHsKKyAgICAJY29uc29sZS5sb2coZXJyb3IuY29kZSk7CisgICAgfQorCQorICAgIGVudHJ5LmZpbGUod2luLCBmYWlsKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5GaWxlUmVhZGVyIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkxvYWQoKSB7CisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQl3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0oTG9jYWxGaWxlU3lzdGVtLlBFUlNJU1RFTlQsIDAsIGdvdEZTLCBmYWlsKTsKKyAgICAgICAgfQorCQkKKwkJZnVuY3Rpb24gZ290RlMoZmlsZVN5c3RlbSkgeworCQkJZmlsZVN5c3RlbS5yb290LmdldEZpbGUoInJlYWRtZS50eHQiLCBudWxsLCBnb3RGaWxlRW50cnksIGZhaWwpOworCQl9CisJCQorCQlmdW5jdGlvbiBnb3RGaWxlRW50cnkoZmlsZUVudHJ5KSB7CisJCQlmaWxlRW50cnkuZmlsZShnb3RGaWxlLCBmYWlsKTsKKwkJfQorCQkKKyAgICAgICAgZnVuY3Rpb24gZ290RmlsZShmaWxlKXsKKwkJCXJlYWREYXRhVXJsKGZpbGUpOworCQkJcmVhZEFzVGV4dChmaWxlKTsKKwkJfQorICAgICAgICAKKyAgICAgICAgZnVuY3Rpb24gcmVhZERhdGFVcmwoZmlsZSkgeworICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlJlYWQgYXMgZGF0YSBVUkwiKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhldnQudGFyZ2V0LnJlc3VsdCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIHJlYWRBc1RleHQoZmlsZSkgeworICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlJlYWQgYXMgdGV4dCIpOworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2dC50YXJnZXQucmVzdWx0KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZnVuY3Rpb24gZmFpbChldnQpIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2dC50YXJnZXQuZXJyb3IuY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+UmVhZCBGaWxlPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworaU9TIFF1aXJrcworLS0tLS0tLS0tLQorLSBfX2VuY29kaW5nX18gcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQsIFVURjggZW5jb2RpbmcgaXMgYWx3YXlzIHVzZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGVzeXN0ZW0vZmlsZXN5c3RlbS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxlc3lzdGVtL2ZpbGVzeXN0ZW0ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxlc3lzdGVtL2ZpbGVzeXN0ZW0ubWQKQEAgLTAsMCArMSw3MiBAQAorRmlsZVN5c3RlbQorPT09PT09PT09PQorCitUaGlzIG9iamVjdCByZXByZXNlbnRzIGEgZmlsZSBzeXN0ZW0uCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX25hbWU6X18gVGhlIG5hbWUgb2YgdGhlIGZpbGUgc3lzdGVtLiBfKERPTVN0cmluZylfCistIF9fcm9vdDpfXyBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUgc3lzdGVtLiBfKERpcmVjdG9yeUVudHJ5KV8KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYEZpbGVTeXN0ZW1gIG9iamVjdCByZXByZXNlbnRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIHN5c3RlbS4gVGhlIG5hbWUgb2YgdGhlIGZpbGUgc3lzdGVtIHdpbGwgYmUgdW5pcXVlIGFjcm9zcyB0aGUgbGlzdCBvZiBleHBvc2VkIGZpbGUgc3lzdGVtcy4gIFRoZSByb290IHByb3BlcnR5IGNvbnRhaW5zIGEgYERpcmVjdG9yeUVudHJ5YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUgc3lzdGVtLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworRmlsZSBTeXN0ZW0gUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gb25TdWNjZXNzKGZpbGVTeXN0ZW0pIHsKKwkJY29uc29sZS5sb2coZmlsZVN5c3RlbS5uYW1lKTsKKwkJY29uc29sZS5sb2coZmlsZVN5c3RlbS5yb290Lm5hbWUpOworCX0KKwkKKwkvLyByZXF1ZXN0IHRoZSBwZXJzaXN0ZW50IGZpbGUgc3lzdGVtCisJd2luZG93LnJlcXVlc3RGaWxlU3lzdGVtKExvY2FsRmlsZVN5c3RlbS5QRVJTSVNURU5ULCAwLCBvblN1Y2Nlc3MsIG51bGwpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkZpbGUgU3lzdGVtIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJd2luZG93LnJlcXVlc3RGaWxlU3lzdGVtKExvY2FsRmlsZVN5c3RlbS5QRVJTSVNURU5ULCAwLCBvbkZpbGVTeXN0ZW1TdWNjZXNzLCBmYWlsKTsKKyAgICAgICAgfQorCisJCWZ1bmN0aW9uIG9uRmlsZVN5c3RlbVN1Y2Nlc3MoZmlsZVN5c3RlbSkgeworCQkJY29uc29sZS5sb2coZmlsZVN5c3RlbS5uYW1lKTsKKwkJCWNvbnNvbGUubG9nKGZpbGVTeXN0ZW0ucm9vdC5uYW1lKTsKKwkJfQorCQkKKwkJZnVuY3Rpb24gZmFpbChldnQpIHsKKwkJCWNvbnNvbGUubG9nKGV2dC50YXJnZXQuZXJyb3IuY29kZSk7CisJCX0KKwkJCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+RmlsZSBTeXN0ZW08L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXIubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXRyYW5zZmVyL2ZpbGV0cmFuc2Zlci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ1NjZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV0cmFuc2Zlci9maWxldHJhbnNmZXIubWQKQEAgLTAsMCArMSwxMjAgQEAKK0ZpbGVUcmFuc2ZlcgorPT09PT09PT09PQorCitGaWxlVHJhbnNmZXIgaXMgYW4gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byB1cGxvYWQgZmlsZXMgdG8gYSBzZXJ2ZXIuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworTi9BCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBfX3VwbG9hZF9fOiBzZW5kcyBhIGZpbGUgdG8gYSBzZXJ2ZXIuIAorCitEZXRhaWxzCistLS0tLS0tCisKK1RoZSBgRmlsZVRyYW5zZmVyYCBvYmplY3QgcHJvdmlkZXMgYSB3YXkgdG8gdXBsb2FkIGZpbGVzIHRvIGEgcmVtb3RlIHNlcnZlciB1c2luZyBhbiBIVFRQIG11bHRpLXBhcnQgUE9TVCByZXF1ZXN0LiAgQm90aCBIVFRQIGFuZCBIVFRQUyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZC4gIE9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBieSBwYXNzaW5nIGEgRmlsZVVwbG9hZE9wdGlvbnMgb2JqZWN0IHRvIHRoZSB1cGxvYWQgbWV0aG9kLiAgT24gc3VjY2Vzc2Z1bCB1cGxvYWQsIHRoZSBzdWNjZXNzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBGaWxlVXBsb2FkUmVzdWx0IG9iamVjdC4gIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGVycm9yIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgRmlsZVRyYW5zZmVyRXJyb3Igb2JqZWN0LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCisJLy8gISEgQXNzdW1lcyB2YXJpYWJsZSBmaWxlVVJJIGNvbnRhaW5zIGEgdmFsaWQgVVJJIHRvIGEgIHRleHQgZmlsZSBvbiB0aGUgZGV2aWNlCisJCisgIAl2YXIgd2luID0gZnVuY3Rpb24ocikgeworICAgICAgICBjb25zb2xlLmxvZygiQ29kZSA9ICIgKyByLnJlc3BvbnNlQ29kZSk7CisgICAgICAgIGNvbnNvbGUubG9nKCJSZXNwb25zZSA9ICIgKyByLnJlc3BvbnNlKTsKKyAgICAgICAgY29uc29sZS5sb2coIlNlbnQgPSAiICsgci5ieXRlc1NlbnQpOworCX0KKwkKKyAgICB2YXIgZmFpbCA9IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KCJBbiBlcnJvciBoYXMgb2NjdXJyZWQ6IENvZGUgPSAiID0gZXJyb3IuY29kZSk7CisgICAgfQorCQorCXZhciBvcHRpb25zID0gbmV3IEZpbGVVcGxvYWRPcHRpb25zKCk7CisJb3B0aW9ucy5maWxlS2V5PSJmaWxlIjsKKwlvcHRpb25zLmZpbGVOYW1lPWZpbGVVUkkuc3Vic3RyKGZpbGVVUkkubGFzdEluZGV4T2YoJy8nKSsxKTsKKwlvcHRpb25zLm1pbWVUeXBlPSJ0ZXh0L3BsYWluIjsKKworICAgIHZhciBwYXJhbXMgPSBuZXcgT2JqZWN0KCk7CisJcGFyYW1zLnZhbHVlMSA9ICJ0ZXN0IjsKKwlwYXJhbXMudmFsdWUyID0gInBhcmFtIjsKKwkJCisJb3B0aW9ucy5wYXJhbXMgPSBwYXJhbXM7CisJCisJdmFyIGZ0ID0gbmV3IEZpbGVUcmFuc2ZlcigpOworICAgIGZ0LnVwbG9hZChmaWxlVVJJLCAiaHR0cDovL3NvbWUuc2VydmVyLmNvbS91cGxvYWQucGhwIiwgd2luLCBmYWlsLCBvcHRpb25zKTsKKyAgICAKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICA8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkZpbGUgVHJhbnNmZXIgRXhhbXBsZTwvdGl0bGU+CisgICAgCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC4wLjkuNC5taW4uanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBpbWFnZSBmaWxlIGxvY2F0aW9uIGZyb20gc3BlY2lmaWVkIHNvdXJjZQorICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jYW1lcmEuZ2V0UGljdHVyZSh1cGxvYWRQaG90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obWVzc2FnZSkgeyBhbGVydCgnZ2V0IHBpY3R1cmUgZmFpbGVkJyk7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcXVhbGl0eTogNTAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblR5cGU6IG5hdmlnYXRvci5jYW1lcmEuRGVzdGluYXRpb25UeXBlLkZJTEVfVVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBuYXZpZ2F0b3IuY2FtZXJhLlBpY3R1cmVTb3VyY2VUeXBlLlBIT1RPTElCUkFSWSB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHVwbG9hZFBob3RvKGltYWdlVVJJKSB7CisgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgRmlsZVVwbG9hZE9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVLZXk9ImZpbGUiOworICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZU5hbWU9aW1hZ2VVUkkuc3Vic3RyKGltYWdlVVJJLmxhc3RJbmRleE9mKCcvJykrMSk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5taW1lVHlwZT0iaW1hZ2UvanBlZyI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsdWUxID0gInRlc3QiOworICAgICAgICAgICAgICAgIHBhcmFtcy52YWx1ZTIgPSAicGFyYW0iOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1zID0gcGFyYW1zOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBmdCA9IG5ldyBGaWxlVHJhbnNmZXIoKTsKKyAgICAgICAgICAgICAgICBmdC51cGxvYWQoaW1hZ2VVUkksICJodHRwOi8vc29tZS5zZXJ2ZXIuY29tL3VwbG9hZC5waHAiLCB3aW4sIGZhaWwsIG9wdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmdW5jdGlvbiB3aW4ocikgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJDb2RlID0gIiArIHIucmVzcG9uc2VDb2RlKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiUmVzcG9uc2UgPSAiICsgci5yZXNwb25zZSk7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlNlbnQgPSAiICsgci5ieXRlc1NlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgICAgICAgICAgYWxlcnQoIkFuIGVycm9yIGhhcyBvY2N1cnJlZDogQ29kZSA9ICIgPSBlcnJvci5jb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPlVwbG9hZCBGaWxlPC9wPgorICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxldHJhbnNmZXJlcnJvci9maWxldHJhbnNmZXJlcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxldHJhbnNmZXJlcnJvci9maWxldHJhbnNmZXJlcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjgxMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV0cmFuc2ZlcmVycm9yL2ZpbGV0cmFuc2ZlcmVycm9yLm1kCkBAIC0wLDAgKzEsMjEgQEAKK0ZpbGVUcmFuc2ZlckVycm9yCis9PT09PT09PQorCitBIGBGaWxlVHJhbnNmZXJFcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHZpYSB0aGUgZXJyb3IgY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2NvZGU6X18gT25lIG9mIHRoZSBwcmVkZWZpbmVkIGVycm9yIGNvZGVzIGxpc3RlZCBiZWxvdy4gKGludCkKKworQ29uc3RhbnRzCistLS0tLS0tLS0KKworLSBgRmlsZVRyYW5zZmVyRXJyb3IuRklMRV9OT1RfRk9VTkRfRVJSYAorLSBgRmlsZVRyYW5zZmVyRXJyb3IuSU5WQUxJRF9VUkxfRVJSYAorLSBgRmlsZVRyYW5zZmVyRXJyb3IuQ09OTkVDVElPTl9FUlJgCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYEZpbGVUcmFuc2ZlckVycm9yYCBvYmplY3QgaXMgcmV0dXJuZWQgdmlhIHRoZSBlcnJvciBjYWxsYmFjayAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hlbiB1cGxvYWRpbmcgYSBmaWxlLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV1cGxvYWRvcHRpb25zL2ZpbGV1cGxvYWRvcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV1cGxvYWRvcHRpb25zL2ZpbGV1cGxvYWRvcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXVwbG9hZG9wdGlvbnMvZmlsZXVwbG9hZG9wdGlvbnMubWQKQEAgLTAsMCArMSwxOSBAQAorRmlsZVVwbG9hZE9wdGlvbnMKKz09PT09PT09CisKK0EgYEZpbGVVcGxvYWRPcHRpb25zYCBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byB0aGUgRmlsZVRyYW5zZmVyIG9iamVjdHMgdXBsb2FkIG1ldGhvZCBpbiBvcmRlciB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgdXBsb2FkIHNjcmlwdC4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fZmlsZUtleTpfXyBUaGUgbmFtZSBvZiB0aGUgZm9ybSBlbGVtZW50LiAgSWYgbm90IHNldCBkZWZhdWx0cyB0byAiZmlsZSIuIChET01TdHJpbmcpCistIF9fZmlsZU5hbWU6X18gVGhlIGZpbGUgbmFtZSB5b3Ugd2FudCB0aGUgZmlsZSB0byBiZSBzYXZlZCBhcyBvbiB0aGUgc2VydmVyLiAgSWYgbm90IHNldCBkZWZhdWx0cyB0byAiaW1hZ2UuanBnIi4gKERPTVN0cmluZykKKy0gX19taW1lVHlwZTpfXyBUaGUgbWltZSB0eXBlIG9mIHRoZSBkYXRhIHlvdSBhcmUgdXBsb2FkaW5nLiAgSWYgbm90IHNldCBkZWZhdWx0cyB0byAiaW1hZ2UvanBlZyIuIChET01TdHJpbmcpCistIF9fcGFyYW1zOl9fIEEgc2V0IG9mIG9wdGlvbmFsIGtleS92YWx1ZSBwYWlycyB0byBiZSBwYXNzZWQgYWxvbmcgaW4gdGhlIEhUVFAgcmVxdWVzdC4gKE9iamVjdCkKKy0gX19jaHVua2VkTW9kZTpfXyBTaG91bGQgdGhlIGRhdGEgYmUgdXBsb2FkZWQgaW4gY2h1bmtlZCBzdHJlYW1pbmcgbW9kZS4gSWYgbm90IHNldCBkZWZhdWx0cyB0byAidHJ1ZSIuIChCb29sZWFuKQorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitBIGBGaWxlVXBsb2FkT3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIEZpbGVUcmFuc2ZlciBvYmplY3RzIHVwbG9hZCBtZXRob2QgaW4gb3JkZXIgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIHVwbG9hZCBzY3JpcHQuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXVwbG9hZHJlc3VsdC9maWxldXBsb2FkcmVzdWx0Lm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV1cGxvYWRyZXN1bHQvZmlsZXVwbG9hZHJlc3VsdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI5ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZpbGV1cGxvYWRyZXN1bHQvZmlsZXVwbG9hZHJlc3VsdC5tZApAQCAtMCwwICsxLDIxIEBACitGaWxlVXBsb2FkUmVzdWx0Cis9PT09PT09PQorCitBIGBGaWxlVXBsb2FkUmVzdWx0YCBvYmplY3QgaXMgcmV0dXJuZWQgdmlhIHRoZSBzdWNjZXNzIGNhbGxiYWNrIG9mIHRoZSBGaWxlVHJhbnNmZXIgdXBsb2FkIG1ldGhvZC4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fYnl0ZXNTZW50Ol9fIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCB0byB0aGUgc2VydmVyIGFzIHBhcnQgb2YgdGhlIHVwbG9hZC4gKGxvbmcpCistIF9fcmVzcG9uc2VDb2RlOl9fIFRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci4gKGxvbmcpCistIF9fcmVzcG9uc2U6X18gVGhlIEhUVFAgcmVzcG9uc2UgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci4gKERPTVN0cmluZykKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBgRmlsZVVwbG9hZFJlc3VsdGAgb2JqZWN0IGlzIHJldHVybmVkIHZpYSB0aGUgc3VjY2VzcyBjYWxsYmFjayBvZiB0aGUgRmlsZVRyYW5zZmVyIHVwbG9hZCBtZXRob2QuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KKy0gaU9TIGRvZXMgbm90IGluY2x1ZGUgdmFsdWVzIGZvciByZXNwb25zZUNvZGUgbm9yIGJ5dGVzU2VudCBpbiB0aGUgc3VjY2VzcyBjYWxsYmFjayBGaWxlVXBsb2FkUmVzdWx0IG9iamVjdC4gCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9maWxld3JpdGVyL2ZpbGV3cml0ZXIubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXdyaXRlci9maWxld3JpdGVyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Y2EzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvZmlsZXdyaXRlci9maWxld3JpdGVyLm1kCkBAIC0wLDAgKzEsMTczIEBACitGaWxlV3JpdGVyCis9PT09PT09PT09CisKK0ZpbGVXcml0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgYWxsb3dzIG9uZSB0byB3cml0ZSBhIGZpbGUuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX3JlYWR5U3RhdGU6X18gT25lIG9mIHRoZSB0aHJlZSBzdGF0ZXMgdGhlIHJlYWRlciBjYW4gYmUgaW4gSU5JVCwgV1JJVElORyBvciBET05FLgorLSBfX2ZpbGVOYW1lOl9fIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4uIF8oRE9NU3RyaW5nKV8KKy0gX19sZW5ndGg6X18gVGhlIGxlbmd0aCBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuLiBfKGxvbmcpXworLSBfX3Bvc2l0aW9uOl9fIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBmaWxlIHBvaW50ZXIuIF8obG9uZylfCistIF9fZXJyb3I6X18gQW4gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzLiBfKEZpbGVFcnJvcilfCistIF9fb253cml0ZXN0YXJ0Ol9fIENhbGxlZCB3aGVuIHRoZSB3cml0ZSBzdGFydHMuIC4gXyhGdW5jdGlvbilfCistIF9fb25wcm9ncmVzczpfXyBDYWxsZWQgd2hpbGUgd3JpdGluZyB0aGUgZmlsZSwgcmVwb3J0cyBwcm9ncmVzcyAocHJvZ2Vzcy5sb2FkZWQvcHJvZ3Jlc3MudG90YWwpLiBfKEZ1bmN0aW9uKV8gLU5PVCBTVVBQT1JURUQKKy0gX19vbndyaXRlOl9fIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAgXyhGdW5jdGlvbilfCistIF9fb25hYm9ydDpfXyBDYWxsZWQgd2hlbiB0aGUgd3JpdGUgaGFzIGJlZW4gYWJvcnRlZC4gRm9yIGluc3RhbmNlLCBieSBpbnZva2luZyB0aGUgYWJvcnQoKSBtZXRob2QuIF8oRnVuY3Rpb24pXworLSBfX29uZXJyb3I6X18gQ2FsbGVkIHdoZW4gdGhlIHdyaXRlIGhhcyBmYWlsZWQuIF8oRnVuY3Rpb24pXworLSBfX29ud3JpdGVlbmQ6X18gQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCAoZWl0aGVyIGluIHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuICBfKEZ1bmN0aW9uKV8KKworTWV0aG9kcworLS0tLS0tLQorCistIF9fYWJvcnRfXzogQWJvcnRzIHdyaXRpbmcgZmlsZS4gCistIF9fc2Vla19fOiBNb3ZlcyB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBieXRlIHNwZWNpZmllZC4KKy0gX190cnVuY2F0ZV9fOiBTaG9ydGVucyB0aGUgZmlsZSB0byB0aGUgbGVuZ3RoIHNwZWNpZmllZC4KKy0gX193cml0ZV9fOiBXcml0ZXMgZGF0YSB0byB0aGUgZmlsZS4KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYEZpbGVXcml0ZXJgIG9iamVjdCBpcyBhIHdheSB0byB3cml0ZSBmaWxlcyBmcm9tIHRoZSBkZXZpY2VzIGZpbGUgc3lzdGVtLiAgVXNlcnMgcmVnaXN0ZXIgdGhlaXIgb3duIGV2ZW50IGxpc3RlbmVycyB0byByZWNlaXZlIHRoZSB3cml0ZXN0YXJ0LCBwcm9ncmVzcywgd3JpdGUsIHdyaXRlZW5kLCBlcnJvciBhbmQgYWJvcnQgZXZlbnRzLgorCitBIEZpbGVXcml0ZXIgaXMgY3JlYXRlZCBmb3IgYSBzaW5nbGUgZmlsZS4gWW91IGNhbiB1c2UgaXQgdG8gd3JpdGUgdG8gYSBmaWxlIG11bHRpcGxlIHRpbWVzLiBUaGUgRmlsZVdyaXRlciBtYWludGFpbnMgdGhlIGZpbGUncyBwb3NpdGlvbiBhbmQgbGVuZ3RoIGF0dHJpYnV0ZXMsIHNvIHlvdSBjYW4gc2VlayBhbmQgd3JpdGUgYW55d2hlcmUgaW4gdGhlIGZpbGUuIEJ5IGRlZmF1bHQsIHRoZSBGaWxlV3JpdGVyIHdyaXRlcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICh3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBkYXRhKS4gU2V0IHRoZSBvcHRpb25hbCBhcHBlbmQgYm9vbGVhbiB0byB0cnVlIGluIHRoZSBGaWxlV3JpdGVyJ3MgY29uc3RydWN0b3IgdG8gYmVnaW4gd3JpdGluZyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworU2VlayBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCWZ1bmN0aW9uIHdpbih3cml0ZXIpIHsKKwkJLy8gZmFzdCBmb3J3YXJkcyBmaWxlIHBvaW50ZXIgdG8gZW5kIG9mIGZpbGUKKwkJd3JpdGVyLnNlZWsod3JpdGVyLmxlbmd0aCk7CQorCX07CisKKwl2YXIgZmFpbCA9IGZ1bmN0aW9uKGV2dCkgeworICAgIAljb25zb2xlLmxvZyhlcnJvci5jb2RlKTsKKwl9OworCQorICAgIGVudHJ5LmNyZWF0ZVdyaXRlcih3aW4sIGZhaWwpOworCitUcnVuY2F0ZSBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gd2luKHdyaXRlcikgeworCQl3cml0ZXIudHJ1bmNhdGUoMTApOwkKKwl9OworCisJdmFyIGZhaWwgPSBmdW5jdGlvbihldnQpIHsKKyAgICAJY29uc29sZS5sb2coZXJyb3IuY29kZSk7CisJfTsKKwkKKyAgICBlbnRyeS5jcmVhdGVXcml0ZXIod2luLCBmYWlsKTsKKworV3JpdGUgUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQkKKworCWZ1bmN0aW9uIHdpbih3cml0ZXIpIHsKKwkJd3JpdGVyLm9ud3JpdGUgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgCWNvbnNvbGUubG9nKCJ3cml0ZSBzdWNjZXNzIik7CisgICAgICAgIH07CisJCXdyaXRlci53cml0ZSgic29tZSBzYW1wbGUgdGV4dCIpOworCX07CisKKwl2YXIgZmFpbCA9IGZ1bmN0aW9uKGV2dCkgeworICAgIAljb25zb2xlLmxvZyhlcnJvci5jb2RlKTsKKwl9OworCQorICAgIGVudHJ5LmNyZWF0ZVdyaXRlcih3aW4sIGZhaWwpOworCitBcHBlbmQgUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisKKwlmdW5jdGlvbiB3aW4od3JpdGVyKSB7CisJCXdyaXRlci5vbndyaXRlID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIAljb25zb2xlLmxvZygid3JpdGUgc3VjY2VzcyIpOworICAgICAgICB9OworICAgICAgICB3cml0ZXIuc2Vlayh3cml0ZXIubGVuZ3RoKTsKKwkJd3JpdGVyLndyaXRlKCJhcHBlbmRlZCB0ZXh0Iik7CisJfTsKKworCXZhciBmYWlsID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgCWNvbnNvbGUubG9nKGVycm9yLmNvZGUpOworCX07CisJCisgICAgZW50cnkuY3JlYXRlV3JpdGVyKHdpbiwgZmFpbCk7CisJCitBYm9ydCBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlmdW5jdGlvbiB3aW4od3JpdGVyKSB7CisJCXdyaXRlci5vbndyaXRlID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIAljb25zb2xlLmxvZygid3JpdGUgc3VjY2VzcyIpOworICAgICAgICB9OworCQl3cml0ZXIud3JpdGUoInNvbWUgc2FtcGxlIHRleHQiKTsKKwkJd3JpdGVyLmFib3J0KCk7CisJfTsKKworCXZhciBmYWlsID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgCWNvbnNvbGUubG9nKGVycm9yLmNvZGUpOworCX07CisJCisgICAgZW50cnkuY3JlYXRlV3JpdGVyKHdpbiwgZmFpbCk7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkZpbGVXcml0ZXIgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLjAuOS40LmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQl3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0oTG9jYWxGaWxlU3lzdGVtLlBFUlNJU1RFTlQsIDAsIGdvdEZTLCBmYWlsKTsKKyAgICAgICAgfQorCQkKKwkJZnVuY3Rpb24gZ290RlMoZmlsZVN5c3RlbSkgeworCQkJZmlsZVN5c3RlbS5yb290LmdldEZpbGUoInJlYWRtZS50eHQiLCBudWxsLCBnb3RGaWxlRW50cnksIGZhaWwpOworCQl9CisJCQorCQlmdW5jdGlvbiBnb3RGaWxlRW50cnkoZmlsZUVudHJ5KSB7CisJCQlmaWxlRW50cnkuY3JlYXRlV3JpdGVyKGdvdEZpbGVXcml0ZXIsIGZhaWwpOworCQl9CisJCQorCQlmdW5jdGlvbiBnb3RGaWxlV3JpdGVyKHdyaXRlcikgeworCSAgICAgICAgd3JpdGVyLm9ud3JpdGUgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygid3JpdGUgc3VjY2VzcyIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgic29tZSBzYW1wbGUgdGV4dCIpOworCQkJLy8gY29udGVudHMgb2YgZmlsZSBub3cgJ3NvbWUgc2FtcGxlIHRleHQnCisJCQl3cml0ZXIudHJ1bmNhdGUoMTEpOworCQkJLy8gY29udGVudHMgb2YgZmlsZSBub3cgJ3NvbWUgc2FtcGxlJworCQkJd3JpdGVyLnNlZWsoNCk7CisJCQkvLyBjb250ZW50cyBvZiBmaWxlIHN0aWxsICdzb21lIHNhbXBsZScgYnV0IGZpbGUgcG9pbnRlciBpcyBhZnRlciB0aGUgJ2UnIGluICdzb21lJworCQkJd3JpdGVyLndyaXRlKCIgZGlmZmVyZW50IHRleHQiKTsKKwkJCS8vIGNvbnRlbnRzIG9mIGZpbGUgbm93ICdzb21lIGRpZmZlcmVudCB0ZXh0JworCQl9CisgICAgICAgIAorICAgICAgICBmdW5jdGlvbiBmYWlsKGVycm9yKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5jb2RlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5Xcml0ZSBGaWxlPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9mbGFncy9mbGFncy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9mbGFncy9mbGFncy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ3ODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL2ZsYWdzL2ZsYWdzLm1kCkBAIC0wLDAgKzEsMjcgQEAKK0ZsYWdzCis9PT09PQorCitUaGlzIG9iamVjdCBpcyB1c2VkIHRvIHN1cHBseSBhcmd1bWVudHMgdG8gdGhlIGBEaXJlY3RvcnlFbnRyeWAgX19nZXRGaWxlX18gYW5kIF9fZ2V0RGlyZWN0b3J5X18gbWV0aG9kcywgd2hpY2ggbG9vayB1cCBvciBjcmVhdGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXNwZWN0aXZlbHkuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2NyZWF0ZTpfXyBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkLCBpZiBpdCBkb2VzIG5vdCBleGlzdC4gXyhib29sZWFuKV8KKy0gX19leGNsdXNpdmU6X18gQnkgaXRzZWxmLCBleGNsdXNpdmUgaGFzIG5vIGVmZmVjdC4gVXNlZCB3aXRoIGNyZWF0ZSwgaXQgY2F1c2VzIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBjcmVhdGlvbiB0byBmYWlsIGlmIHRoZSB0YXJnZXQgcGF0aCBhbHJlYWR5IGV4aXN0cy4gXyhib29sZWFuKV8KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIEdldCB0aGUgZGF0YSBkaXJlY3RvcnksIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgZGF0YURpciA9IGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3RvcnkoImRhdGEiLCB7Y3JlYXRlOiB0cnVlfSk7CisKKyAgICAvLyBDcmVhdGUgdGhlIGxvY2sgZmlsZSwgaWYgYW5kIG9ubHkgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICBsb2NrRmlsZSA9IGRhdGFEaXIuZ2V0RmlsZSgibG9ja2ZpbGUudHh0Iiwge2NyZWF0ZTogdHJ1ZSwgZXhjbHVzaXZlOiB0cnVlfSk7CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvbG9jYWxmaWxlc3lzdGVtL2xvY2FsZmlsZXN5c3RlbS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZmlsZS9sb2NhbGZpbGVzeXN0ZW0vbG9jYWxmaWxlc3lzdGVtLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDBiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvbG9jYWxmaWxlc3lzdGVtL2xvY2FsZmlsZXN5c3RlbS5tZApAQCAtMCwwICsxLDkxIEBACitMb2NhbEZpbGVTeXN0ZW0KKz09PT09PT09PT09PT09PQorCitUaGlzIG9iamVjdCBwcm92aWRlcyBhIHdheSB0byBvYnRhaW4gcm9vdCBmaWxlIHN5c3RlbXMuCisKK01ldGhvZHMKKy0tLS0tLS0tLS0KKworLSBfX3JlcXVlc3RGaWxlU3lzdGVtOl9fIFJlcXVlc3RzIGEgZmlsZXN5c3RlbS4gXyhGdW5jdGlvbilfCistIF9fcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSTpfXyBSZXRyaWV2ZSBhIERpcmVjdG9yeUVudHJ5IG9yIEZpbGVFbnRyeSB1c2luZyBsb2NhbCBVUkkuIF8oRnVuY3Rpb24pXworCitDb25zdGFudHMKKy0tLS0tLS0tLQorCistIGBMb2NhbEZpbGVTeXN0ZW0uUEVSU0lTVEVOVGA6IFVzZWQgZm9yIHN0b3JhZ2UgdGhhdCBzaG91bGQgbm90IGJlIHJlbW92ZWQgYnkgdGhlIHVzZXIgYWdlbnQgd2l0aG91dCBhcHBsaWNhdGlvbiBvciB1c2VyIHBlcm1pc3Npb24uCistIGBMb2NhbEZpbGVTeXN0ZW0uVEVNUE9SQVJZYDogVXNlZCBmb3Igc3RvcmFnZSB3aXRoIG5vIGd1YXJhbnRlZSBvZiBwZXJzaXN0ZW5jZS4KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgYExvY2FsRmlsZVN5c3RlbWAgb2JqZWN0IG1ldGhvZHMgYXJlIGRlZmluZWQgb24gdGhlIF9fd2luZG93X18gb2JqZWN0LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUmVxdWVzdCBGaWxlIFN5c3RlbSBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCWZ1bmN0aW9uIG9uU3VjY2VzcyhmaWxlU3lzdGVtKSB7CisJCWNvbnNvbGUubG9nKGZpbGVTeXN0ZW0ubmFtZSk7CisJfQorCQorCS8vIHJlcXVlc3QgdGhlIHBlcnNpc3RlbnQgZmlsZSBzeXN0ZW0KKwl3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0oTG9jYWxGaWxlU3lzdGVtLlBFUlNJU1RFTlQsIDAsIG9uU3VjY2Vzcywgb25FcnJvcik7CisKK1Jlc29sdmUgTG9jYWwgRmlsZSBTeXN0ZW0gVVJJIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCWZ1bmN0aW9uIG9uU3VjY2VzcyhmaWxlRW50cnkpIHsKKwkJY29uc29sZS5sb2coZmlsZUVudHJ5Lm5hbWUpOworCX0KKworCXdpbmRvdy5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlOi8vL2V4YW1wbGUudHh0Iiwgb25TdWNjZXNzLCBvbkVycm9yKTsKKwkKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Mb2NhbCBGaWxlIFN5c3RlbSBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKwkJCXdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbShMb2NhbEZpbGVTeXN0ZW0uUEVSU0lTVEVOVCwgMCwgb25GaWxlU3lzdGVtU3VjY2VzcywgZmFpbCk7CisJCQl3aW5kb3cucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZTovLy9leGFtcGxlLnR4dCIsIG9uUmVzb2x2ZVN1Y2Nlc3MsIGZhaWwpOworICAgICAgICB9CisKKwkJZnVuY3Rpb24gb25GaWxlU3lzdGVtU3VjY2VzcyhmaWxlU3lzdGVtKSB7CisJCQljb25zb2xlLmxvZyhmaWxlU3lzdGVtLm5hbWUpOworCQl9CisKKwkJZnVuY3Rpb24gb25SZXNvbHZlU3VjY2VzcyhmaWxlRW50cnkpIHsKKwkJCWNvbnNvbGUubG9nKGZpbGVFbnRyeS5uYW1lKTsKKwkJfQorCQkKKwkJZnVuY3Rpb24gZmFpbChldnQpIHsKKwkJCWNvbnNvbGUubG9nKGV2dC50YXJnZXQuZXJyb3IuY29kZSk7CisJCX0KKwkJCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+TG9jYWwgRmlsZSBTeXN0ZW08L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL21ldGFkYXRhL21ldGFkYXRhLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9maWxlL21ldGFkYXRhL21ldGFkYXRhLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTJmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2ZpbGUvbWV0YWRhdGEvbWV0YWRhdGEubWQKQEAgLTAsMCArMSwzMiBAQAorTWV0YWRhdGEKKz09PT09PT09PT0KKworVGhpcyBpbnRlcmZhY2Ugc3VwcGxpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIG9mIGEgZmlsZSBvciBkaXJlY3RvcnkuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX21vZGlmaWNhdGlvblRpbWU6X18gVGhpcyBpcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIGxhc3QgbW9kaWZpZWQuIF8oRGF0ZSlfCisKK0RldGFpbHMKKy0tLS0tLS0KKworVGhlIGBNZXRhZGF0YWAgb2JqZWN0IHJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIG9mIGEgZmlsZSBvciBkaXJlY3RvcnkuICBZb3UgY2FuIGdldCBhbiBpbnN0YW5jZSBvZiBhIE1ldGFkYXRhIG9iamVjdCBieSBjYWxsaW5nIHRoZSBfX2dldE1ldGFkYXRhX18gbWV0aG9kIG9mIGEgYERpcmVjdG9yeUVudHJ5YCBvciBgRmlsZUVudHJ5YCBvYmplY3QuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKwlmdW5jdGlvbiB3aW4obWV0YWRhdGEpIHsKKwkJY29uc29sZS5sb2coIkxhc3QgTW9kaWZpZWQ6ICIgKyBtZXRhZGF0YS5tb2RpZmljYXRpb25UaW1lKTsKKwl9CisJCisJLy8gUmVxdWVzdCB0aGUgbWV0YWRhdGEgb2JqZWN0IGZvciB0aGlzIGVudHJ5CisJZW50cnkuZ2V0TWV0YWRhdGEod2luLCBudWxsKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL0Nvb3JkaW5hdGVzL2Nvb3JkaW5hdGVzLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Db29yZGluYXRlcy9jb29yZGluYXRlcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVjMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Db29yZGluYXRlcy9jb29yZGluYXRlcy5tZApAQCAtMCwwICsxLDEwNSBAQAorQ29vcmRpbmF0ZXMKKz09PT09PT09PT09CisKK0Egc2V0IG9mIHByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSB0aGUgZ2VvZ3JhcGhpYyBjb29yZGluYXRlcyBvZiBhIHBvc2l0aW9uLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKyogX19sYXRpdHVkZV9fOiBMYXRpdHVkZSBpbiBkZWNpbWFsIGRlZ3JlZXMuIF8oTnVtYmVyKV8KKyogX19sb25naXR1ZGVfXzogTG9uZ2l0dWRlIGluIGRlY2ltYWwgZGVncmVlcy4gXyhOdW1iZXIpXworKiBfX2FsdGl0dWRlX186IEhlaWdodCBvZiB0aGUgcG9zaXRpb24gaW4gbWV0ZXJzIGFib3ZlIHRoZSBlbGxpcHNvaWQuIF8oTnVtYmVyKV8KKyogX19hY2N1cmFjeV9fOiBBY2N1cmFjeSBsZXZlbCBvZiB0aGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBjb29yZGluYXRlcyBpbiBtZXRlcnMuIF8oTnVtYmVyKV8KKyogX19hbHRpdHVkZUFjY3VyYWN5X186IEFjY3VyYWN5IGxldmVsIG9mIHRoZSBhbHRpdHVkZSBjb29yZGluYXRlIGluIG1ldGVycy4gXyhOdW1iZXIpXworKiBfX2hlYWRpbmdfXzogRGlyZWN0aW9uIG9mIHRyYXZlbCwgc3BlY2lmaWVkIGluIGRlZ3JlZXMgY291bnRpbmcgY2xvY2t3aXNlIHJlbGF0aXZlIHRvIHRoZSB0cnVlIG5vcnRoLiBfKE51bWJlcilfCisqIF9fc3BlZWRfXzogQ3VycmVudCBncm91bmQgc3BlZWQgb2YgdGhlIGRldmljZSwgc3BlY2lmaWVkIGluIG1ldGVycyBwZXIgc2Vjb25kLiBfKE51bWJlcilfCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYENvb3JkaW5hdGVzYCBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcG9wdWxhdGVkIGJ5IFBob25lR2FwLCBhbmQgYXR0YWNoZWQgdG8gdGhlIGBQb3NpdGlvbmAgb2JqZWN0LiBUaGUgYFBvc2l0aW9uYCBvYmplY3QgaXMgdGhlbiByZXR1cm5lZCB0byB0aGUgdXNlciB0aHJvdWdoIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgKE9TIDQuNikKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uU3VjY2VzcyBDYWxsYmFjaworICAgIC8vCisgICAgdmFyIG9uU3VjY2VzcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgIGFsZXJ0KCdMYXRpdHVkZTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FsdGl0dWRlOiAnICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdBY2N1cmFjeTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnQWx0aXR1ZGUgQWNjdXJhY3k6ICcgKyBwb3NpdGlvbi5jb29yZHMuYWx0aXR1ZGVBY2N1cmFjeSAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0hlYWRpbmc6ICcgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmhlYWRpbmcgICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdTcGVlZDogJyAgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5zcGVlZCAgICAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICAgICAgICAgKyBuZXcgRGF0ZShwb3NpdGlvbi50aW1lc3RhbXApICAgICAgKyAnXG4nKTsKKyAgICB9OworCisgICAgLy8gb25FcnJvciBDYWxsYmFjaworICAgIC8vCisgICAgdmFyIG9uRXJyb3IgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgYWxlcnQoJ29uRXJyb3IhJyk7CisgICAgfTsKKworICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24ob25TdWNjZXNzLCBvbkVycm9yKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5HZW9sb2NhdGlvbiBQb3NpdGlvbiBFeGFtcGxlPC90aXRsZT4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBTZXQgYW4gZXZlbnQgdG8gd2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyBsb2FkZWQgYW5kIFJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gRGlzcGxheSBgUG9zaXRpb25gIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2VvbG9jYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKHBvc2l0aW9uKSB7CisgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215RGl2Jyk7CisgICAgICAgIAorICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICdMYXRpdHVkZTogJyAgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSAgKyAnPGJyLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICsgJzxici8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsdGl0dWRlOiAnICAgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlICArICc8YnIvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY2N1cmFjeTogJyAgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeSAgKyAnPGJyLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWx0aXR1ZGUgQWNjdXJhY3k6ICcgICAgKyBwb3NpdGlvbi5jb29yZHMuYWx0aXR1ZGVBY2N1cmFjeSAgKyAnPGJyLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGluZzogJyAgICAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuaGVhZGluZyAgICsgJzxici8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWVkOiAnICAgICAgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLnNwZWVkICAgICArICc8YnIvPic7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gU2hvdyBhbiBhbGVydCBpZiB0aGVyZSBpcyBhIHByb2JsZW0gZ2V0dGluZyB0aGUgZ2VvbG9jYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25FcnJvcigpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdvbkVycm9yIScpOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGRpdiBpZD0ibXlEaXYiPjwvZGl2PgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgICAKK0FuZHJvaWQgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKK19fYWx0aXR1ZGVBY2N1cmFjeTpfXyBUaGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgZGV2aWNlcywgaXQgd2lsbCBhbHdheXMgcmV0dXJuIG51bGwuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL1Bvc2l0aW9uL3Bvc2l0aW9uLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Qb3NpdGlvbi9wb3NpdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzAyNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Qb3NpdGlvbi9wb3NpdGlvbi5tZApAQCAtMCwwICsxLDExMSBAQAorUG9zaXRpb24KKz09PT09PT09CisKK0NvbnRhaW5zIGBQb3NpdGlvbmAgY29vcmRpbmF0ZXMgdGhhdCBhcmUgY3JlYXRlZCBieSB0aGUgZ2VvbG9jYXRpb24gQVBJLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19jb29yZHM6X18gQSBzZXQgb2YgZ2VvZ3JhcGhpYyBjb29yZGluYXRlcy4gXyhDb29yZGluYXRlcylfCistIF9fdGltZXN0YW1wOl9fIENyZWF0aW9uIHRpbWVzdGFtcCBmb3IgYGNvb3Jkc2AgaW4gbWlsbGlzZWNvbmRzLiBfKERPTVRpbWVTdGFtcClfCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYFBvc2l0aW9uYCBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcG9wdWxhdGVkIGJ5IFBob25lR2FwLCBhbmQgcmV0dXJuZWQgdG8gdGhlIHVzZXIgdGhyb3VnaCBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IChPUyA0LjYpCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBvblN1Y2Nlc3MgQ2FsbGJhY2sKKyAgICAvLworICAgIHZhciBvblN1Y2Nlc3MgPSBmdW5jdGlvbihwb3NpdGlvbikgeworICAgICAgICBhbGVydCgnTGF0aXR1ZGU6ICcgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0xvbmdpdHVkZTogJyAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdBbHRpdHVkZTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hbHRpdHVkZSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnQWNjdXJhY3k6ICcgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3kgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FsdGl0dWRlIEFjY3VyYWN5OiAnICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlQWNjdXJhY3kgICsgJ1xuJyArCisgICAgICAgICAgICAgICdIZWFkaW5nOiAnICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5oZWFkaW5nICAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnU3BlZWQ6ICcgICAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuc3BlZWQgICAgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ1RpbWVzdGFtcDogJyAgICAgICAgICsgbmV3IERhdGUocG9zaXRpb24udGltZXN0YW1wKSAgICAgICsgJ1xuJyk7CisgICAgfTsKKworICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgcmVjZWl2ZXMgYSBQb3NpdGlvbkVycm9yIG9iamVjdAorICAgIC8vCisgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgeworICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisgICAgfQorCisgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkRldmljZSBQcm9wZXJ0aWVzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uU3VjY2VzcyBHZW9sb2NhdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MocG9zaXRpb24pIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlb2xvY2F0aW9uJyk7CisgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdMYXRpdHVkZTogJyAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgICAgICAgICAgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAgICAgICAgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsdGl0dWRlOiAnICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hbHRpdHVkZSAgICAgICAgICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY2N1cmFjeTogJyAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3kgICAgICAgICAgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWx0aXR1ZGUgQWNjdXJhY3k6ICcgICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlQWNjdXJhY3kgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRpbmc6ICcgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5oZWFkaW5nICAgICAgICAgICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTcGVlZDogJyAgICAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuc3BlZWQgICAgICAgICAgICAgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICAgICAgICAgICsgbmV3IERhdGUocG9zaXRpb24udGltZXN0YW1wKSAgICAgICAgICArICc8YnIgLz4nOworICAgICAgICB9CisgICAgCisJICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgcmVjZWl2ZXMgYSBQb3NpdGlvbkVycm9yIG9iamVjdAorCSAgICAvLworCSAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisJICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsKKwkgICAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworCSAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPHAgaWQ9Imdlb2xvY2F0aW9uIj5GaW5kaW5nIGdlb2xvY2F0aW9uLi4uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworaVBob25lIFF1aXJrcworLS0tLS0tLS0tLS0tLQorCistIF9fdGltZXN0YW1wOl9fIFVzZXMgc2Vjb25kcyBpbnN0ZWFkIG9mIG1pbGxpc2Vjb25kcy4KKworQSB3b3JrYXJvdW5kIGlzIHRvIG1hbnVhbGx5IGNvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBtaWxsaXNlY29uZHMgKHggMTAwMCk6CisKKyAgICAgICAgdmFyIG9uU3VjY2VzcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICBhbGVydCgnTGF0aXR1ZGU6ICcgICsgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlICAgICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICsgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAgICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICsgbmV3IERhdGUocG9zaXRpb24udGltZXN0YW1wICogMTAwMCkgICsgJ1xuJyk7CisgICAgICAgIH07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Qb3NpdGlvbkVycm9yL3Bvc2l0aW9uRXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL1Bvc2l0aW9uRXJyb3IvcG9zaXRpb25FcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMWQ3NjExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9Qb3NpdGlvbkVycm9yL3Bvc2l0aW9uRXJyb3IubWQKQEAgLTAsMCArMSwyMyBAQAorUG9zaXRpb25FcnJvcgorPT09PT09PT0KKworQSBgUG9zaXRpb25FcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSBnZW9sb2NhdGlvbkVycm9yIGNhbGxiYWNrIHdoZW4gYW4gZXJyb3Igb2NjdXJzLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19jb2RlOl9fIE9uZSBvZiB0aGUgcHJlZGVmaW5lZCBlcnJvciBjb2RlcyBsaXN0ZWQgYmVsb3cuCistIF9fbWVzc2FnZTpfXyBFcnJvciBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGRldGFpbHMgb2YgdGhlIGVycm9yIGVuY291bnRlcmVkLgorCitDb25zdGFudHMKKy0tLS0tLS0tLQorCistIGBQb3NpdGlvbkVycm9yLlBFUk1JU1NJT05fREVOSUVEYAorLSBgUG9zaXRpb25FcnJvci5QT1NJVElPTl9VTkFWQUlMQUJMRWAKKy0gYFBvc2l0aW9uRXJyb3IuVElNRU9VVGAKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBgUG9zaXRpb25FcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIGBnZW9sb2NhdGlvbkVycm9yYCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycyB3aXRoIGdlb2xvY2F0aW9uLgorCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLmNsZWFyV2F0Y2gubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLmNsZWFyV2F0Y2gubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uY2xlYXJXYXRjaC5tZApAQCAtMCwwICsxLDk1IEBACitnZW9sb2NhdGlvbi5jbGVhcldhdGNoCis9PT09PT09PT09PT09PT09PT09PT09CisKK1N0b3Agd2F0Y2hpbmcgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSdzIGxvY2F0aW9uIHJlZmVyZW5jZWQgYnkgdGhlIGB3YXRjaElEYCBwYXJhbWV0ZXIuCisKKyAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh3YXRjaElEKTsKKworUGFyYW1ldGVycworLS0tLS0tLS0tLQorCistIF9fd2F0Y2hJRDpfXyBUaGUgaWQgb2YgdGhlIGB3YXRjaFBvc2l0aW9uYCBpbnRlcnZhbCB0byBjbGVhci4gKFN0cmluZykKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0Z1bmN0aW9uIGBnZW9sb2NhdGlvbi5jbGVhcldhdGNoYCBzdG9wcyB3YXRjaGluZyBjaGFuZ2VzIHRvIHRoZSBkZXZpY2UncyBsb2NhdGlvbiBieSBjbGVhcmluZyB0aGUgYGdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb25gIHJlZmVyZW5jZWQgYnkgYHdhdGNoSURgLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IChPUyA0LjYpCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBPcHRpb25zOiByZXRyaWV2ZSB0aGUgbG9jYXRpb24gZXZlcnkgMyBzZWNvbmRzCisgICAgLy8KKyAgICB2YXIgd2F0Y2hJRCA9IG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKG9uU3VjY2Vzcywgb25FcnJvciwgeyBmcmVxdWVuY3k6IDMwMDAgfSk7CisKKyAgICAvLyAuLi5sYXRlciBvbi4uLgorCisgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hJRCk7CisKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5EZXZpY2UgUHJvcGVydGllcyBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgdmFyIHdhdGNoSUQgPSBudWxsOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgZXZlcnkgMyBzZWNvbmRzCisgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHsgZnJlcXVlbmN5OiAzMDAwIH07CisgICAgICAgICAgICB3YXRjaElEID0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24ob25TdWNjZXNzLCBvbkVycm9yLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3MgR2VvbG9jYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKHBvc2l0aW9uKSB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW9sb2NhdGlvbicpOworICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnTGF0aXR1ZGU6ICcgICsgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb25naXR1ZGU6ICcgKyBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociAvPicgICAgICArIGVsZW1lbnQuaW5uZXJIVE1MOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYXIgdGhlIHdhdGNoIHRoYXQgd2FzIHN0YXJ0ZWQgZWFybGllcgorICAgICAgICAvLyAKKyAgICAgICAgZnVuY3Rpb24gY2xlYXJXYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICh3YXRjaElEICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh3YXRjaElEKTsKKyAgICAgICAgICAgICAgICB3YXRjaElEID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorCSAgICAvLyBvbkVycm9yIENhbGxiYWNrIHJlY2VpdmVzIGEgUG9zaXRpb25FcnJvciBvYmplY3QKKwkgICAgLy8KKwkgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgeworCSAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKworCSAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworCSAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPHAgaWQ9Imdlb2xvY2F0aW9uIj5XYXRjaGluZyBnZW9sb2NhdGlvbi4uLjwvcD4KKyAgICAJPGJ1dHRvbiBvbmNsaWNrPSJjbGVhcldhdGNoKCk7Ij5DbGVhciBXYXRjaDwvYnV0dG9uPiAgICAgCisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5YjIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uLm1kCkBAIC0wLDAgKzEsMTA2IEBACitnZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXR1cm5zIHRoZSBkZXZpY2UncyBjdXJyZW50IHBvc2l0aW9uIGFzIGEgYFBvc2l0aW9uYCBvYmplY3QuCisKKyAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGdlb2xvY2F0aW9uU3VjY2VzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2VvbG9jYXRpb25FcnJvcl0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dlb2xvY2F0aW9uT3B0aW9uc10pOworCitQYXJhbWV0ZXJzCistLS0tLS0tLS0tCisKKy0gX19nZW9sb2NhdGlvblN1Y2Nlc3NfXzogVGhlIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgcG9zaXRpb24uCistIF9fZ2VvbG9jYXRpb25FcnJvcl9fOiAoT3B0aW9uYWwpIFRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCistIF9fZ2VvbG9jYXRpb25PcHRpb25zX186IChPcHRpb25hbCkgVGhlIGdlb2xvY2F0aW9uIG9wdGlvbnMuCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitGdW5jdGlvbiBgZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0b25gIGlzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbi4gSXQgcmV0dXJucyB0aGUgZGV2aWNlJ3MgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgYGdlb2xvY2F0aW9uU3VjY2Vzc2AgY2FsbGJhY2sgd2l0aCBhIGBQb3NpdGlvbmAgb2JqZWN0IGFzIHRoZSBwYXJhbWV0ZXIuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGBnZW9sb2NhdGlvbkVycm9yYCBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggYSBgUG9zaXRpb25FcnJvcmAgb2JqZWN0LgorCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgKE9TIDQuNikKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisgICAgCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBvblN1Y2Nlc3MgQ2FsbGJhY2sKKyAgICAvLyAgIFRoaXMgbWV0aG9kIGFjY2VwdHMgYSBgUG9zaXRpb25gIG9iamVjdCwgd2hpY2ggY29udGFpbnMKKyAgICAvLyAgIHRoZSBjdXJyZW50IEdQUyBjb29yZGluYXRlcworICAgIC8vCisgICAgdmFyIG9uU3VjY2VzcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgIGFsZXJ0KCdMYXRpdHVkZTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FsdGl0dWRlOiAnICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdBY2N1cmFjeTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnQWx0aXR1ZGUgQWNjdXJhY3k6ICcgKyBwb3NpdGlvbi5jb29yZHMuYWx0aXR1ZGVBY2N1cmFjeSAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0hlYWRpbmc6ICcgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmhlYWRpbmcgICAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdTcGVlZDogJyAgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5zcGVlZCAgICAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnVGltZXN0YW1wOiAnICAgICAgICAgKyBuZXcgRGF0ZShwb3NpdGlvbi50aW1lc3RhbXApICAgICAgKyAnXG4nKTsKKyAgICB9OworCisgICAgLy8gb25FcnJvciBDYWxsYmFjayByZWNlaXZlcyBhIFBvc2l0aW9uRXJyb3Igb2JqZWN0CisgICAgLy8KKyAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKworICAgICAgICAgICAgICAnbWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyAnXG4nKTsKKyAgICB9CisKKyAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG9uU3VjY2Vzcywgb25FcnJvcik7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+RGV2aWNlIFByb3BlcnRpZXMgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gb25TdWNjZXNzIEdlb2xvY2F0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhwb3NpdGlvbikgeworICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VvbG9jYXRpb24nKTsKKyAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJ0xhdGl0dWRlOiAnICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSAgICAgICAgICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMb25naXR1ZGU6ICcgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICAgICAgICAgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWx0aXR1ZGU6ICcgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlICAgICAgICAgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY3VyYWN5OiAnICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeSAgICAgICAgICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBbHRpdHVkZSBBY2N1cmFjeTogJyAgKyBwb3NpdGlvbi5jb29yZHMuYWx0aXR1ZGVBY2N1cmFjeSAgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGluZzogJyAgICAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmhlYWRpbmcgICAgICAgICAgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWVkOiAnICAgICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5zcGVlZCAgICAgICAgICAgICAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lc3RhbXA6ICcgICAgICAgICAgKyBuZXcgRGF0ZShwb3NpdGlvbi50aW1lc3RhbXApICAgICAgICAgICsgJzxiciAvPic7CisgICAgICAgIH0KKyAgICAKKwkgICAgLy8gb25FcnJvciBDYWxsYmFjayByZWNlaXZlcyBhIFBvc2l0aW9uRXJyb3Igb2JqZWN0CisJICAgIC8vCisJICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKwkgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKworCSAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisJICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8cCBpZD0iZ2VvbG9jYXRpb24iPkZpbmRpbmcgZ2VvbG9jYXRpb24uLi48L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24ubWQKQEAgLTAsMCArMSwzMCBAQAorR2VvbG9jYXRpb24KKz09PT09PT09PT09CisKKz4gVGhlIGBnZW9sb2NhdGlvbmAgb2JqZWN0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGV2aWNlJ3MgR1BTIHNlbnNvci4gCisKK0dlb2xvY2F0aW9uIHByb3ZpZGVzIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZGV2aWNlLCBzdWNoIGFzIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuIENvbW1vbiBzb3VyY2VzIG9mIGxvY2F0aW9uIGluZm9ybWF0aW9uIGluY2x1ZGUgR2xvYmFsIFBvc2l0aW9uaW5nIFN5c3RlbSAoR1BTKSBhbmQgbG9jYXRpb24gaW5mZXJyZWQgZnJvbSBuZXR3b3JrIHNpZ25hbHMgc3VjaCBhcyBJUCBhZGRyZXNzLCBSRklELCBXaUZpIGFuZCBCbHVldG9vdGggTUFDIGFkZHJlc3NlcywgYW5kIEdTTS9DRE1BIGNlbGwgSURzLiBObyBndWFyYW50ZWUgaXMgZ2l2ZW4gdGhhdCB0aGUgQVBJIHJldHVybnMgdGhlIGRldmljZSdzIGFjdHVhbCBsb2NhdGlvbi4gCisKK1RoaXMgQVBJIGlzIGJhc2VkIG9uIHRoZSBbVzNDIEdlbyBsb2NhdGlvbiBBUEkgU3BlY2lmaWNhdGlvbl0oaHR0cDovL2Rldi53My5vcmcvZ2VvL2FwaS9zcGVjLXNvdXJjZS5odG1sKS4gIFNvbWUgZGV2aWNlcyBhbHJlYWR5IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzcGVjLiAgRm9yIHRob3NlIGRldmljZXMsIHRoZSBidWlsdC1pbiBzdXBwb3J0IGlzIHVzZWQgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXQgd2l0aCBQaG9uZUdhcCdzIGltcGxlbWVudGF0aW9uLiAgRm9yIGRldmljZXMgdGhhdCBkb24ndCBoYXZlIGdlb2xvY2F0aW9uIHN1cHBvcnQsIFBob25lR2FwJ3MgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgVzNDIHNwZWNpZmljYXRpb24uCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBnZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24KKy0gZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbgorLSBnZW9sb2NhdGlvbi5jbGVhcldhdGNoCisKKworQXJndW1lbnRzCistLS0tLS0tLS0KKworLSBnZW9sb2NhdGlvblN1Y2Nlc3MKKy0gZ2VvbG9jYXRpb25FcnJvcgorLSBnZW9sb2NhdGlvbk9wdGlvbnMKKworT2JqZWN0cyAoUmVhZC1Pbmx5KQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIFBvc2l0aW9uCistIFBvc2l0aW9uRXJyb3IKKy0gQ29vcmRpbmF0ZXMKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNjODk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uLm1kCkBAIC0wLDAgKzEsMTA4IEBACitnZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dhdGNoZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSdzIGN1cnJlbnQgcG9zaXRpb24uCisKKyAgICB2YXIgd2F0Y2hJZCA9IG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKGdlb2xvY2F0aW9uU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZW9sb2NhdGlvbkVycm9yXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZW9sb2NhdGlvbk9wdGlvbnNdKTsKKworUGFyYW1ldGVycworLS0tLS0tLS0tLQorCistIF9fZ2VvbG9jYXRpb25TdWNjZXNzX186IFRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorLSBfX2dlb2xvY2F0aW9uRXJyb3JfXzogKE9wdGlvbmFsKSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorLSBfX2dlb2xvY2F0aW9uT3B0aW9uc19fOiAoT3B0aW9uYWwpIFRoZSBnZW9sb2NhdGlvbiBvcHRpb25zLgorCitSZXR1cm5zCistLS0tLS0tCisKKy0gX19TdHJpbmdfXzogcmV0dXJucyBhIHdhdGNoIGlkIHRoYXQgcmVmZXJlbmNlcyB0aGUgd2F0Y2ggcG9zaXRpb24gaW50ZXJ2YWwuIFRoZSB3YXRjaCBpZCBjYW4gYmUgdXNlZCB3aXRoIGBnZW9sb2NhdGlvbi5jbGVhcldhdGNoYCB0byBzdG9wIHdhdGNoaW5nIGZvciBjaGFuZ2VzIGluIHBvc2l0aW9uLgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYGdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb25gIGlzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbi4gSXQgcmV0dXJucyB0aGUgZGV2aWNlJ3MgY3VycmVudCBwb3NpdGlvbiB3aGVuIGEgY2hhbmdlIGluIHBvc2l0aW9uIGhhcyBiZWVuIGRldGVjdGVkLiAgV2hlbiB0aGUgZGV2aWNlIGhhcyByZXRyaWV2ZWQgYSBuZXcgbG9jYXRpb24sIHRoZSBgZ2VvbG9jYXRpb25TdWNjZXNzYCBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggYSBgUG9zaXRpb25gIG9iamVjdCBhcyB0aGUgcGFyYW1ldGVyLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBgZ2VvbG9jYXRpb25FcnJvcmAgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoIGEgYFBvc2l0aW9uRXJyb3JgIG9iamVjdC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSAoT1MgNC42KQorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gb25TdWNjZXNzIENhbGxiYWNrCisgICAgLy8gICBUaGlzIG1ldGhvZCBhY2NlcHRzIGEgYFBvc2l0aW9uYCBvYmplY3QsIHdoaWNoIGNvbnRhaW5zCisgICAgLy8gICB0aGUgY3VycmVudCBHUFMgY29vcmRpbmF0ZXMKKyAgICAvLworICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhwb3NpdGlvbikgeworICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW9sb2NhdGlvbicpOworICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdMYXRpdHVkZTogJyAgKyBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTG9uZ2l0dWRlOiAnICsgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAgICAgKyAnPGJyIC8+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociAvPicgICAgICArIGVsZW1lbnQuaW5uZXJIVE1MOworICAgIH0KKworICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgcmVjZWl2ZXMgYSBQb3NpdGlvbkVycm9yIG9iamVjdAorICAgIC8vCisgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgeworICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisgICAgfQorCisgICAgLy8gT3B0aW9uczogcmV0cmlldmUgdGhlIGxvY2F0aW9uIGV2ZXJ5IDMgc2Vjb25kcworICAgIC8vCisgICAgdmFyIHdhdGNoSUQgPSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IsIHsgZnJlcXVlbmN5OiAzMDAwIH0pOworICAgIAorCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkRldmljZSBQcm9wZXJ0aWVzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICB2YXIgd2F0Y2hJRCA9IG51bGw7CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBldmVyeSAzIHNlY29uZHMKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBmcmVxdWVuY3k6IDMwMDAgfTsKKyAgICAgICAgICAgIHdhdGNoSUQgPSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihvblN1Y2Nlc3MsIG9uRXJyb3IsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uU3VjY2VzcyBHZW9sb2NhdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MocG9zaXRpb24pIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlb2xvY2F0aW9uJyk7CisgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICdMYXRpdHVkZTogJyAgKyBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgICAgICArICc8YnIgLz4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvbmdpdHVkZTogJyArIHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUgICAgICsgJzxiciAvPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGhyIC8+JyAgICAgICsgZWxlbWVudC5pbm5lckhUTUw7CisgICAgICAgIH0KKyAgICAKKwkgICAgLy8gb25FcnJvciBDYWxsYmFjayByZWNlaXZlcyBhIFBvc2l0aW9uRXJyb3Igb2JqZWN0CisJICAgIC8vCisJICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKwkgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKworCSAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisJICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8cCBpZD0iZ2VvbG9jYXRpb24iPldhdGNoaW5nIGdlb2xvY2F0aW9uLi4uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vcGFyYW1ldGVycy9nZW9sb2NhdGlvbi5vcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uLm9wdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MDk1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vcGFyYW1ldGVycy9nZW9sb2NhdGlvbi5vcHRpb25zLm1kCkBAIC0wLDAgKzEsMjIgQEAKK2dlb2xvY2F0aW9uT3B0aW9ucworPT09PT09PT09PT09PT09PT09CisKK09wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY3VzdG9taXplIHRoZSByZXRyaWV2YWwgb2YgdGhlIGdlb2xvY2F0aW9uLgorCisgICAgeyBtYXhpbXVtQWdlOiAzMDAwLCB0aW1lb3V0OiA1MDAwLCBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWUgfTsKKworT3B0aW9ucworLS0tLS0tLQorCistIF9fZnJlcXVlbmN5Ol9fIEhvdyBvZnRlbiB0byByZXRyaWV2ZSB0aGUgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLiBUaGlzIG9wdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgVzNDIHNwZWMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBtYXhpbXVtQWdlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuIF8oTnVtYmVyKV8gKERlZmF1bHQ6IDEwMDAwKQorLSBfX2VuYWJsZUhpZ2hBY2N1cmFjeTpfXyBQcm92aWRlcyBhIGhpbnQgdGhhdCB0aGUgYXBwbGljYXRpb24gd291bGQgbGlrZSB0byByZWNlaXZlIHRoZSBiZXN0IHBvc3NpYmxlIHJlc3VsdHMuIF8oQm9vbGVhbilfCistIF9fdGltZW91dDpfXyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGltZSAobXNlYykgdGhhdCBpcyBhbGxvd2VkIHRvIHBhc3MgZnJvbSB0aGUgY2FsbCB0byBgZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uYCBvciBgZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbmAgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgYGdlb2xvY2F0aW9uU3VjY2Vzc2AgY2FsbGJhY2sgaXMgaW52b2tlZC4gXyhOdW1iZXIpXworLSBfX21heGltdW1BZ2U6X18gQWNjZXB0IGEgY2FjaGVkIHBvc2l0aW9uIHdob3NlIGFnZSBpcyBubyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gXyhOdW1iZXIpXworCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworVGhlIEFuZHJvaWQgMi54IHNpbXVsYXRvcnMgd2lsbCBub3QgcmV0dXJuIGEgZ2VvbG9jYXRpb24gcmVzdWx0IHVubGVzcyB0aGUgZW5hYmxlSGlnaEFjY3VyYWN5IG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS4KKworICAgIHsgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlIH0KKwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uRXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL2dlb2xvY2F0aW9uL3BhcmFtZXRlcnMvZ2VvbG9jYXRpb25FcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQzYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uRXJyb3IubWQKQEAgLTAsMCArMSwxMyBAQAorZ2VvbG9jYXRpb25FcnJvcgorPT09PT09PT09PT09PT09PQorCitUaGUgdXNlcidzIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgZm9yIGdlb2xvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IKKyAgICB9CisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX2Vycm9yOl9fIFRoZSBlcnJvciByZXR1cm5lZCBieSB0aGUgZGV2aWNlLiAoYFBvc2l0aW9uRXJyb3JgKQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9nZW9sb2NhdGlvbi9wYXJhbWV0ZXJzL2dlb2xvY2F0aW9uU3VjY2Vzcy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vcGFyYW1ldGVycy9nZW9sb2NhdGlvblN1Y2Nlc3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjZjMwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvZ2VvbG9jYXRpb24vcGFyYW1ldGVycy9nZW9sb2NhdGlvblN1Y2Nlc3MubWQKQEAgLTAsMCArMSwyNyBAQAorZ2VvbG9jYXRpb25TdWNjZXNzCis9PT09PT09PT09PT09PT09PT0KKworVGhlIHVzZXIncyBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZ2VvbG9jYXRpb24gcG9zaXRpb24gaXMgYXZhaWxhYmxlLgorCisgICAgZnVuY3Rpb24ocG9zaXRpb24pIHsKKyAgICAgICAgLy8gRG8gc29tZXRoaW5nCisgICAgfQorCitQYXJhbWV0ZXJzCistLS0tLS0tLS0tCisKKy0gX19wb3NpdGlvbjpfXyBUaGUgZ2VvbG9jYXRpb24gcG9zaXRpb24gcmV0dXJuZWQgYnkgdGhlIGRldmljZS4gKGBQb3NpdGlvbmApCisKK0V4YW1wbGUKKy0tLS0tLS0KKworICAgIGZ1bmN0aW9uIGdlb2xvY2F0aW9uU3VjY2Vzcyhwb3NpdGlvbikgeworICAgICAgICBhbGVydCgnTGF0aXR1ZGU6ICcgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0xvbmdpdHVkZTogJyAgICAgICAgICsgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAgICAgICAgICsgJ1xuJyArCisgICAgICAgICAgICAgICdBbHRpdHVkZTogJyAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5hbHRpdHVkZSAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnQWNjdXJhY3k6ICcgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3kgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ0FsdGl0dWRlIEFjY3VyYWN5OiAnICsgcG9zaXRpb24uY29vcmRzLmFsdGl0dWRlQWNjdXJhY3kgICsgJ1xuJyArCisgICAgICAgICAgICAgICdIZWFkaW5nOiAnICAgICAgICAgICArIHBvc2l0aW9uLmNvb3Jkcy5oZWFkaW5nICAgICAgICAgICArICdcbicgKworICAgICAgICAgICAgICAnU3BlZWQ6ICcgICAgICAgICAgICAgKyBwb3NpdGlvbi5jb29yZHMuc3BlZWQgICAgICAgICAgICAgKyAnXG4nICsKKyAgICAgICAgICAgICAgJ1RpbWVzdGFtcDogJyAgICAgICAgICsgbmV3IERhdGUocG9zaXRpb24udGltZXN0YW1wKSAgICAgICsgJ1xuJyk7CisgICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvTWVkaWFFcnJvci9tZWRpYUVycm9yLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9NZWRpYUVycm9yL21lZGlhRXJyb3IubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NjIwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvTWVkaWFFcnJvci9tZWRpYUVycm9yLm1kCkBAIC0wLDAgKzEsMjUgQEAKK01lZGlhRXJyb3IKKz09PT09PT09PT0KKworQSBgTWVkaWFFcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSBgbWVkaWFFcnJvcmAgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhbiBlcnJvciBvY2N1cnMuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2NvZGU6X18gT25lIG9mIHRoZSBwcmVkZWZpbmVkIGVycm9yIGNvZGVzIGxpc3RlZCBiZWxvdy4KKy0gX19tZXNzYWdlOl9fIEVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZGV0YWlscyBvZiB0aGUgZXJyb3IuCisKK0NvbnN0YW50cworLS0tLS0tLS0tCisKKy0gYE1lZGlhRXJyb3IuTUVESUFfRVJSX0FCT1JURURgCistIGBNZWRpYUVycm9yLk1FRElBX0VSUl9ORVRXT1JLYAorLSBgTWVkaWFFcnJvci5NRURJQV9FUlJfREVDT0RFYAorLSBgTWVkaWFFcnJvci5NRURJQV9FUlJfTk9ORV9TVVBQT1JURURgCisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBgTWVkaWFFcnJvcmAgb2JqZWN0IGlzIHJldHVybmVkIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIGBtZWRpYUVycm9yYCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9QYXJhbWV0ZXJzL21lZGlhRXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL1BhcmFtZXRlcnMvbWVkaWFFcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFjNTAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9QYXJhbWV0ZXJzL21lZGlhRXJyb3IubWQKQEAgLTAsMCArMSwxMyBAQAorbWVkaWFFcnJvcgorPT09PT09PT09PQorCitBIHVzZXIgc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIG1lZGlhIGZ1bmN0aW9ucy4KKworICAgIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IKKyAgICB9CisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX2Vycm9yOl9fIFRoZSBlcnJvciByZXR1cm5lZCBieSB0aGUgZGV2aWNlLiAoYE1lZGlhRXJyb3JgKQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL0NhcHR1cmVDQi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9DYXB0dXJlQ0IubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzZTQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9DYXB0dXJlQ0IubWQKQEAgLTAsMCArMSwyNSBAQAorQ2FwdHVyZUNCCis9PT09PT09PT0KKworPiBJbnZva2VkIHVwb24gYSBzdWNjZXNzZnVsIG1lZGlhIGNhcHR1cmUgb3BlcmF0aW9uLgorCisgICAgZnVuY3Rpb24gY2FwdHVyZVN1Y2Nlc3MoIE1lZGlhRmlsZVtdIG1lZGlhRmlsZXMgKSB7IC4uLiB9OworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYXB0dXJlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAgVGhpcyBtZWFucyBhIG1lZGlhIGZpbGUgaGFzIGJlZW4gY2FwdHVyZWQsIGFuZCBlaXRoZXIgdGhlIHVzZXIgaGFzIGV4aXRlZCB0aGUgbWVkaWEgY2FwdHVyZSBhcHBsaWNhdGlvbiwgb3IgdGhlIGNhcHR1cmUgbGltaXQgaGFzIGJlZW4gcmVhY2hlZC4KKworRWFjaCBNZWRpYUZpbGUgb2JqZWN0IGRlc2NyaWJlcyBhIGNhcHR1cmVkIG1lZGlhIGZpbGUuICAKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gY2FwdHVyZSBjYWxsYmFjaworICAgIGZ1bmN0aW9uIGNhcHR1cmVTdWNjZXNzKG1lZGlhRmlsZXMpIHsKKyAgICAgICAgdmFyIGksIHBhdGgsIGxlbjsKKyAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbWVkaWFGaWxlcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgeworICAgICAgICAgICAgcGF0aCA9IG1lZGlhRmlsZXNbaV0uZnVsbFBhdGg7CisgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgaW50ZXJlc3Rpbmcgd2l0aCB0aGUgZmlsZQorICAgICAgICB9CisgICAgfTsKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9DYXB0dXJlRXJyb3IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvQ2FwdHVyZUVycm9yLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2ZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvQ2FwdHVyZUVycm9yLm1kCkBAIC0wLDAgKzEsMTggQEAKK0NhcHR1cmVFcnJvcgorPT09PT09PT09PT09CisKKz4gRW5jYXBzdWxhdGVzIHRoZSBlcnJvciBjb2RlIHJlc3VsdGluZyBmcm9tIGEgZmFpbGVkIG1lZGlhIGNhcHR1cmUgb3BlcmF0aW9uLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19jb2RlOl9fIE9uZSBvZiB0aGUgcHJlLWRlZmluZWQgZXJyb3IgY29kZXMgbGlzdGVkIGJlbG93LgorCitDb25zdGFudHMKKy0tLS0tLS0tLQorCistIENhcHR1cmVFcnJvci5gQ0FQVFVSRV9JTlRFUk5BTF9FUlJgOiBDYW1lcmEgb3IgbWljcm9waG9uZSBmYWlsZWQgdG8gY2FwdHVyZSBpbWFnZSBvciBzb3VuZC4gCistIENhcHR1cmVFcnJvci5gQ0FQVFVSRV9BUFBMSUNBVElPTl9CVVNZYDogQ2FtZXJhIGFwcGxpY2F0aW9uIG9yIGF1ZGlvIGNhcHR1cmUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHNlcnZpbmcgb3RoZXIgY2FwdHVyZSByZXF1ZXN0LgorLSBDYXB0dXJlRXJyb3IuYENBUFRVUkVfSU5WQUxJRF9BUkdVTUVOVGA6IEludmFsaWQgdXNlIG9mIHRoZSBBUEkgKGUuZy4gbGltaXQgcGFyYW1ldGVyIGhhcyB2YWx1ZSBsZXNzIHRoYW4gb25lKS4KKy0gQ2FwdHVyZUVycm9yLmBDQVBUVVJFX05PX01FRElBX0ZJTEVTYDogVXNlciBleGl0ZWQgY2FtZXJhIGFwcGxpY2F0aW9uIG9yIGF1ZGlvIGNhcHR1cmUgYXBwbGljYXRpb24gYmVmb3JlIGNhcHR1cmluZyBhbnl0aGluZy4KKy0gQ2FwdHVyZUVycm9yLmBDQVBUVVJFX05PVF9TVVBQT1JURURgOiBUaGUgcmVxdWVzdGVkIGNhcHR1cmUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvQ2FwdHVyZUVycm9yQ0IubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvQ2FwdHVyZUVycm9yQ0IubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlYTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9DYXB0dXJlRXJyb3JDQi5tZApAQCAtMCwwICsxLDIxIEBACitDYXB0dXJlRXJyb3JDQgorPT09PT09PT09PT09PT0KKworPiBJbnZva2VkIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSBtZWRpYSBjYXB0dXJlIG9wZXJhdGlvbi4KKworICAgIGZ1bmN0aW9uIGNhcHR1cmVFcnJvciggQ2FwdHVyZUVycm9yIGVycm9yICkgeyAuLi4gfTsKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gbGF1bmNoIGEgbWVkaWEgY2FwdHVyZSBvcGVyYXRpb24gYW5kIHRoZSBjYXB0dXJlIGFwcGxpY2F0aW9uIGlzIGJ1c3ksIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0aGUgY2FwdHVyZSBvcGVyYXRpb24gaXMgdGFraW5nIHBsYWNlLCBvciBpZiB0aGUgY2FwdHVyZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGFueSBtZWRpYSBmaWxlcyBoYXZlIGJlZW4gY2FwdHVyZWQuCisKK1RoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGEgQ2FwdHVyZUVycm9yIG9iamVjdCBjb250YWluaW5nIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIGNhcHR1cmUgZXJyb3IgY2FsbGJhY2sKKyAgICB2YXIgY2FwdHVyZUVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgnRXJyb3IgY29kZTogJyArIGVycm9yLmNvZGUsIG51bGwsICdDYXB0dXJlIEVycm9yJyk7CisgICAgfTsKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9Db25maWd1cmF0aW9uRGF0YS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9Db25maWd1cmF0aW9uRGF0YS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEyMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL0NvbmZpZ3VyYXRpb25EYXRhLm1kCkBAIC0wLDAgKzEsNDMgQEAKK0NvbmZpZ3VyYXRpb25EYXRhCis9PT09PT09PT09PT09PT09PQorCis+IEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBtZWRpYSBjYXB0dXJlIHBhcmFtZXRlcnMgdGhhdCBhIGRldmljZSBzdXBwb3J0cy4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgb2JqZWN0IGlzIHVzZWQgdG8gZGVzY3JpYmUgbWVkaWEgY2FwdHVyZSBtb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gIFRoZSBjb25maWd1cmF0aW9uIGRhdGEgaW5jbHVkZXMgdGhlIE1JTUUgdHlwZSwgYW5kIGNhcHR1cmUgZGltZW5zaW9ucyAoZm9yIHZpZGVvIG9yIGltYWdlIGNhcHR1cmUpLiAgCisKK1RoZSBNSU1FIHR5cGVzIHNob3VsZCBhZGhlcmUgdG8gW1JGQzIwNDZdKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDYudHh0KS4gIEV4YW1wbGVzOgorCistIHZpZGVvLzNncHAKKy0gdmlkZW8vcXVpY2t0aW1lCistIGltYWdlL2pwZWcKKy0gYXVkaW8vYW1yCistIGF1ZGlvL3dhdiAKKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fdHlwZTpfXyBUaGUgQVNDSUktZW5jb2RlZCBzdHJpbmcgaW4gbG93ZXIgY2FzZSByZXByZXNlbnRpbmcgdGhlIG1lZGlhIHR5cGUuIChET01TdHJpbmcpCistIF9faGVpZ2h0Ol9fIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIG9yIHZpZGVvIGluIHBpeGVscy4gIEluIHRoZSBjYXNlIG9mIGEgc291bmQgY2xpcCwgdGhpcyBhdHRyaWJ1dGUgaGFzIHZhbHVlIDAuIChOdW1iZXIpCistIF9fd2lkdGg6X18gVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBvciB2aWRlbyBpbiBwaXhlbHMuICBJbiB0aGUgY2FzZSBvZiBhIHNvdW5kIGNsaXAsIHRoaXMgYXR0cmlidXRlIGhhcyB2YWx1ZSAwLiAoTnVtYmVyKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyByZXRyaWV2ZSBzdXBwb3J0ZWQgaW1hZ2UgbW9kZXMKKyAgICB2YXIgaW1hZ2VNb2RlcyA9IG5hdmlnYXRvci5kZXZpY2UuY2FwdHVyZS5zdXBwb3J0ZWRJbWFnZU1vZGVzOworCisgICAgLy8gU2VsZWN0IG1vZGUgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgaG9yaXpvbnRhbCByZXNvbHV0aW9uCisgICAgdmFyIHdpZHRoID0gMDsKKyAgICB2YXIgc2VsZWN0ZWRtb2RlOworICAgIGZvciBlYWNoICh2YXIgbW9kZSBpbiBpbWFnZU1vZGVzKSB7CisgICAgICAgIGlmIChtb2RlLndpZHRoID4gd2lkdGgpIHsKKyAgICAgICAgICAgIHdpZHRoID0gbW9kZS53aWR0aDsKKyAgICAgICAgICAgIHNlbGVjdGVkbW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisKKworTm90IHN1cHBvcnRlZCBieSBhbnkgcGxhdGZvcm0uICBBbGwgY29uZmlndXJhdGlvbiBkYXRhIGFycmF5cyBhcmUgZW1wdHkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL01lZGlhRmlsZS5nZXRGb3JtYXREYXRhLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL01lZGlhRmlsZS5nZXRGb3JtYXREYXRhLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTZjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvTWVkaWFGaWxlLmdldEZvcm1hdERhdGEubWQKQEAgLTAsMCArMSwzNCBAQAorTWVkaWFGaWxlLmdldEZvcm1hdERhdGEKKz09PT09PT09PT09PT09PT09PT09PT09CisKKz4gUmV0cmlldmVzIGZvcm1hdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgY2FwdHVyZSBmaWxlLgorCisgICAgbWVkaWFGaWxlLmdldEZvcm1hdERhdGEoIAorICAgICAgICBNZWRpYUZpbGVEYXRhU3VjY2Vzc0NCIHN1Y2Nlc3NDYWxsYmFjaywgCisgICAgICAgIFtNZWRpYUZpbGVEYXRhRXJyb3JDQiBlcnJvckNhbGxiYWNrXQorICAgICk7CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5IGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBmb3JtYXQgaW5mb3JtYXRpb24gZm9yIHRoZSBtZWRpYSBmaWxlLiAgSWYgc3VjY2Vzc2Z1bCwgaXQgaW52b2tlcyB0aGUgTWVkaWFGaWxlRGF0YVN1Y2Nlc3NDQiBjYWxsYmFjayB3aXRoIGEgTWVkaWFGaWxlRGF0YSBvYmplY3QuICBJZiB0aGUgYXR0ZW1wdCBmYWlscywgdGhpcyBmdW5jdGlvbiB3aWxsIGludm9rZSB0aGUgTWVkaWFGaWxlRGF0YUVycm9yQ0IgY2FsbGJhY2suCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitCbGFja0JlcnJ5IFdlYldvcmtzIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGlzIG5vIEFQSSB0aGF0IHByb3ZpZGVzIGZvcm1hdCBpbmZvcm1hdGlvbiBvZiBtZWRpYSBmaWxlcy4gIFRoZXJlZm9yZSwgYWxsIE1lZGlhRmlsZURhdGEgb2JqZWN0cyB3aWxsIGJlIHJldHVybmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuICBTZWUgTWVkaWFGaWxlRGF0YSBkb2N1bWVudGF0aW9uLgorCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KK1RoZSBBUEkgZm9yIHJldHJpZXZpbmcgbWVkaWEgZmlsZSBmb3JtYXQgaW5mb3JtYXRpb24gaXMgbGltaXRlZC4gIFRoZXJlZm9yZSwgbm90IGFsbCBNZWRpYUZpbGVEYXRhIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZC4gIFNlZSBNZWRpYUZpbGVEYXRhIGRvY3VtZW50YXRpb24uCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KK1RoZSBBUEkgZm9yIHJldHJpZXZpbmcgbWVkaWEgZmlsZSBmb3JtYXQgaW5mb3JtYXRpb24gaXMgbGltaXRlZC4gIFRoZXJlZm9yZSwgbm90IGFsbCBNZWRpYUZpbGVEYXRhIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZC4gIFNlZSBNZWRpYUZpbGVEYXRhIGRvY3VtZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL01lZGlhRmlsZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9NZWRpYUZpbGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1OGRlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9NZWRpYUZpbGUubWQKQEAgLTAsMCArMSwxOCBAQAorTWVkaWFGaWxlCis9PT09PT09PT0KKworPiBFbmNhcHN1bGF0ZXMgcHJvcGVydGllcyBvZiBhIG1lZGlhIGNhcHR1cmUgZmlsZS4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fbmFtZTpfXyBUaGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBwYXRoIGluZm9ybWF0aW9uLiAoRE9NU3RyaW5nKQorLSBfX2Z1bGxQYXRoOl9fIFRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUsIGluY2x1ZGluZyB0aGUgbmFtZS4gKERPTVN0cmluZykKKy0gX190eXBlOl9fIFRoZSBtaW1lIHR5cGUgKERPTVN0cmluZykKKy0gX19sYXN0TW9kaWZpZWREYXRlOl9fIFRoZSBkYXRlIGFuZCB0aW1lIHRoYXQgdGhlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuIChEYXRlKQorLSBfX3NpemU6X18gVGhlIHNpemUgb2YgdGhlIGZpbGUsIGluIGJ5dGVzLiAoTnVtYmVyKQorCitNZXRob2RzCistLS0tLS0tCisKKy0gX19NZWRpYUZpbGUuZ2V0Rm9ybWF0RGF0YTpfXyBSZXRyaWV2ZXMgdGhlIGZvcm1hdCBpbmZvcm1hdGlvbiBvZiB0aGUgbWVkaWEgZmlsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvTWVkaWFGaWxlRGF0YS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9NZWRpYUZpbGVEYXRhLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjN2YzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvTWVkaWFGaWxlRGF0YS5tZApAQCAtMCwwICsxLDQzIEBACitNZWRpYUZpbGVEYXRhCis9PT09PT09PT09PT09CisKKz4gRW5jYXBzdWxhdGVzIGZvcm1hdCBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIGZpbGUuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2NvZGVjczpfXyBUaGUgYWN0dWFsIGZvcm1hdCBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIGNvbnRlbnQuIChET01TdHJpbmcpCistIF9fYml0cmF0ZTpfXyBUaGUgYXZlcmFnZSBiaXRyYXRlIG9mIHRoZSBjb250ZW50LiAgSW4gY2FzZSBvZiBhbiBpbWFnZSwgdGhpcyBhdHRyaWJ1dGUgaGFzIHZhbHVlIDAuIChOdW1iZXIpCistIF9faGVpZ2h0Ol9fIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIG9yIHZpZGVvIGluIHBpeGVscy4gSW4gdGhlIGNhc2Ugb2YgYSBzb3VuZCBjbGlwLCB0aGlzIGF0dHJpYnV0ZSBoYXMgdmFsdWUgMC4gKE51bWJlcikKKy0gX193aWR0aDpfXyBUaGUgd2lkdGggb2YgdGhlIGltYWdlIG9yIHZpZGVvIGluIHBpeGVscy4gSW4gdGhlIGNhc2Ugb2YgYSBzb3VuZCBjbGlwLCB0aGlzIGF0dHJpYnV0ZSBoYXMgdmFsdWUgMC4gKE51bWJlcikKKy0gX19kdXJhdGlvbjpfXyBUaGUgbGVuZ3RoIG9mIHRoZSB2aWRlbyBvciBzb3VuZCBjbGlwIGluIHNlY29uZHMuIEluIHRoZSBjYXNlIG9mIGFuIGltYWdlLCB0aGlzIGF0dHJpYnV0ZSBoYXMgdmFsdWUgMC4gKE51bWJlcikKKworQmxhY2tCZXJyeSBXZWJXb3JrcyBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGVyZSBpcyBubyBBUEkgdGhhdCBwcm92aWRlcyBmb3JtYXQgaW5mb3JtYXRpb24gb2YgbWVkaWEgZmlsZXMuICBTbyB0aGUgTWVkaWFGaWxlRGF0YSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIE1lZGlhRmlsZS5nZXRGb3JtYXREYXRhIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdmFsdWVzOgorCistIF9fY29kZWNzOl9fIE5vdCBzdXBwb3J0ZWQuIFRoZSBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgYmUgbnVsbC4KKy0gX19iaXRyYXRlOl9fIE5vdCBzdXBwb3J0ZWQuICBUaGUgYXR0cmlidXRlIHdpbGwgYWx3YXlzIGJlIDAuCistIF9faGVpZ2h0Ol9fIE5vdCBzdXBwb3J0ZWQuICBUaGUgYXR0cmlidXRlIHdpbGwgYWx3YXlzIGJlIDAuCistIF9fd2lkdGg6X18gTm90IHN1cHBvcnRlZC4gIFRoZSBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgYmUgMC4KKy0gX19kdXJhdGlvbjpfXyBOb3Qgc3VwcG9ydGVkLiAgVGhlIGF0dHJpYnV0ZSB3aWxsIGFsd2F5cyBiZSAwLgorCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KK1N1cHBvcnQgZm9yIHRoZSBNZWRpYUZpbGVEYXRhIHByb3BlcnRpZXMgaXMgYXMgZm9sbG93czoKKworLSBfX2NvZGVjczpfXyBOb3Qgc3VwcG9ydGVkLiAgVGhlIGF0dHJpYnV0ZSB3aWxsIGFsd2F5cyBiZSBudWxsLgorLSBfX2JpdHJhdGU6X18gTm90IHN1cHBvcnRlZC4gIFRoZSBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgYmUgMC4KKy0gX19oZWlnaHQ6X18gU3VwcG9ydGVkLiAgKEltYWdlIGFuZCB2aWRlbyBmaWxlcyBvbmx5KS4gIAorLSBfX3dpZHRoOl9fIFN1cHBvcnRlZC4gIChJbWFnZSBhbmQgdmlkZW8gZmlsZXMgb25seSkuIAorLSBfX2R1cmF0aW9uOl9fIFN1cHBvcnRlZC4gIChBdWRpbyBhbmQgdmlkZW8gZmlsZXMgb25seSkuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KK1N1cHBvcnQgZm9yIHRoZSBNZWRpYUZpbGVEYXRhIHByb3BlcnRpZXMgaXMgYXMgZm9sbG93czoKKworLSBfX2NvZGVjczpfXyBOb3Qgc3VwcG9ydGVkLiAgVGhlIGF0dHJpYnV0ZSB3aWxsIGFsd2F5cyBiZSBudWxsLgorLSBfX2JpdHJhdGU6X18gU3VwcG9ydGVkIG9uIGlPUzQgZGV2aWNlcyBmb3IgYXVkaW8gb25seS4gVGhlIGF0dHJpYnV0ZSB3aWxsIGFsd2F5cyBiZSAwIGZvciBpbWFnZSBhbmQgdmlkZW8uCistIF9faGVpZ2h0Ol9fIFN1cHBvcnRlZC4gIChJbWFnZSBhbmQgdmlkZW8gZmlsZXMgb25seSkuICAKKy0gX193aWR0aDpfXyBTdXBwb3J0ZWQuICAoSW1hZ2UgYW5kIHZpZGVvIGZpbGVzIG9ubHkpLiAKKy0gX19kdXJhdGlvbjpfXyBTdXBwb3J0ZWQuICAoQXVkaW8gYW5kIHZpZGVvIGZpbGVzIG9ubHkpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMTAxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlLm1kCkBAIC0wLDAgKzEsNTYgQEAKK0NhcHR1cmUKKz09PT09PT0KKworPiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGF1ZGlvLCBpbWFnZSwgYW5kIHZpZGVvIGNhcHR1cmUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UuCisKK09iamVjdHMKKy0tLS0tLS0KKworLSBDYXB0dXJlCistIENhcHR1cmVBdWRpb09wdGlvbnMKKy0gQ2FwdHVyZUltYWdlT3B0aW9ucworLSBDYXB0dXJlVmlkZW9PcHRpb25zCistIENhcHR1cmVDQgorLSBDYXB0dXJlRXJyb3JDQgorLSBDb25maWd1cmF0aW9uRGF0YQorLSBNZWRpYUZpbGUKKy0gTWVkaWFGaWxlRGF0YQorCitNZXRob2RzCistLS0tLS0tCisKKy0gY2FwdHVyZS5jYXB0dXJlQXVkaW8KKy0gY2FwdHVyZS5jYXB0dXJlSW1hZ2UKKy0gY2FwdHVyZS5jYXB0dXJlVmlkZW8KKy0gTWVkaWFGaWxlLmdldEZvcm1hdERhdGEKKworU2NvcGUKKy0tLS0tCisKK1RoZSBfX2NhcHR1cmVfXyBvYmplY3QgaXMgYXNzaWduZWQgdG8gdGhlIF9fbmF2aWdhdG9yLmRldmljZV9fIG9iamVjdCwgYW5kIHRoZXJlZm9yZSBoYXMgZ2xvYmFsIHNjb3BlLgorCisgICAgLy8gVGhlIGdsb2JhbCBjYXB0dXJlIG9iamVjdAorICAgIHZhciBjYXB0dXJlID0gbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlOworCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19zdXBwb3J0ZWRBdWRpb01vZGVzOl9fIFRoZSBhdWRpbyByZWNvcmRpbmcgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gKENvbmZpZ3VyYXRpb25EYXRhW10pCistIF9fc3VwcG9ydGVkSW1hZ2VNb2RlczpfXyBUaGUgcmVjb3JkaW5nIGltYWdlIHNpemVzIGFuZCBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLiAoQ29uZmlndXJhdGlvbkRhdGFbXSkKKy0gX19zdXBwb3J0ZWRWaWRlb01vZGVzOl9fIFRoZSByZWNvcmRpbmcgdmlkZW8gcmVzb2x1dGlvbnMgYW5kIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIChDb25maWd1cmF0aW9uRGF0YVtdKQorCitNZXRob2RzCistLS0tLS0tCisKKy0gY2FwdHVyZS5jYXB0dXJlQXVkaW86IExhdW5jaCB0aGUgZGV2aWNlIGF1ZGlvIHJlY29yZGluZyBhcHBsaWNhdGlvbiBmb3IgcmVjb3JkaW5nIGF1ZGlvIGNsaXAocykuCistIGNhcHR1cmUuY2FwdHVyZUltYWdlOiBMYXVuY2ggdGhlIGRldmljZSBjYW1lcmEgYXBwbGljYXRpb24gZm9yIHRha2luZyBpbWFnZShzKS4KKy0gY2FwdHVyZS5jYXB0dXJlVmlkZW86IExhdW5jaCB0aGUgZGV2aWNlIHZpZGVvIHJlY29yZGVyIGFwcGxpY2F0aW9uIGZvciByZWNvcmRpbmcgdmlkZW8ocykuCisKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUF1ZGlvLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVBdWRpby5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmFiZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVBdWRpby5tZApAQCAtMCwwICsxLDExNiBAQAorY2FwdHVyZS5jYXB0dXJlQXVkaW8KKz09PT09PT09PT09PT09PT09PT09CisKKz4gU3RhcnQgdGhlIGF1ZGlvIHJlY29yZGVyIGFwcGxpY2F0aW9uIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgY2FwdHVyZWQgYXVkaW8gY2xpcCBmaWxlKHMpLgorCisgICAgbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlLmNhcHR1cmVBdWRpbyggCisJICAgIENhcHR1cmVDQiBjYXB0dXJlU3VjY2VzcywgQ2FwdHVyZUVycm9yQ0IgY2FwdHVyZUVycm9yLCAgW0NhcHR1cmVBdWRpb09wdGlvbnMgb3B0aW9uc10KKwkpOworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBtZXRob2Qgc3RhcnRzIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gY2FwdHVyZSBhdWRpbyByZWNvcmRpbmdzIHVzaW5nIHRoZSBkZXZpY2UncyBkZWZhdWx0IGF1ZGlvIHJlY29yZGluZyBhcHBsaWNhdGlvbi4gIFRoZSBvcGVyYXRpb24gYWxsb3dzIHRoZSBkZXZpY2UgdXNlciB0byBjYXB0dXJlIG11bHRpcGxlIHJlY29yZGluZ3MgaW4gYSBzaW5nbGUgc2Vzc2lvbi4KKworVGhlIGNhcHR1cmUgb3BlcmF0aW9uIGVuZHMgd2hlbiBlaXRoZXIgdGhlIHVzZXIgZXhpdHMgdGhlIGF1ZGlvIHJlY29yZGluZyBhcHBsaWNhdGlvbiwgb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZGluZ3MsIHNwZWNpZmllZCBieSB0aGUgX19saW1pdF9fIHBhcmFtZXRlciBpbiBDYXB0dXJlQXVkaW9PcHRpb25zLCBoYXMgYmVlbiByZWFjaGVkLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgZm9yIHRoZSBfX2xpbWl0X18gcGFyYW1ldGVyLCBhIGRlZmF1bHQgdmFsdWUgb2Ygb25lICgxKSBpcyB1c2VkLCBhbmQgdGhlIGNhcHR1cmUgb3BlcmF0aW9uIHdpbGwgdGVybWluYXRlIGFmdGVyIHRoZSB1c2VyIHJlY29yZHMgYSBzaW5nbGUgYXVkaW8gY2xpcC4KKworV2hlbiB0aGUgY2FwdHVyZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIGl0IHdpbGwgaW52b2tlIHRoZSBDYXB0dXJlQ0IgY2FsbGJhY2sgd2l0aCBhbiBhcnJheSBvZiBNZWRpYUZpbGUgb2JqZWN0cyBkZXNjcmliaW5nIGVhY2ggY2FwdHVyZWQgYXVkaW8gY2xpcCBmaWxlLiAgSWYgdGhlIG9wZXJhdGlvbiBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBhbiBhdWRpbyBjbGlwIGlzIGNhcHR1cmVkLCB0aGUgQ2FwdHVyZUVycm9yQ0IgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdpdGggYSBDYXB0dXJlRXJyb3Igb2JqZWN0IHdpdGggdGhlIENhcHR1cmVFcnJvci5gQ0FQVFVSRV9OT19NRURJQV9GSUxFU2AgZXJyb3IgY29kZS4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIGNhcHR1cmUgY2FsbGJhY2sKKyAgICB2YXIgY2FwdHVyZVN1Y2Nlc3MgPSBmdW5jdGlvbihtZWRpYUZpbGVzKSB7CisgICAgICAgIHZhciBpLCBwYXRoLCBsZW47CisgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG1lZGlhRmlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKKyAgICAgICAgICAgIHBhdGggPSBtZWRpYUZpbGVzW2ldLmZ1bGxQYXRoOworICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGludGVyZXN0aW5nIHdpdGggdGhlIGZpbGUKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBjYXB0dXJlIGVycm9yIGNhbGxiYWNrCisgICAgdmFyIGNhcHR1cmVFcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYWxlcnQoJ0Vycm9yIGNvZGU6ICcgKyBlcnJvci5jb2RlLCBudWxsLCAnQ2FwdHVyZSBFcnJvcicpOworICAgIH07CisKKyAgICAvLyBzdGFydCBhdWRpbyBjYXB0dXJlCisgICAgbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlLmNhcHR1cmVBdWRpbyhjYXB0dXJlU3VjY2VzcywgY2FwdHVyZUVycm9yLCB7bGltaXQ6Mn0pOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNhcHR1cmUgQXVkaW88L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJqc29uMi5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY2FwdHVyZSBvcGVyYXRpb24gaXMgZmluaXNoZWQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gY2FwdHVyZVN1Y2Nlc3MobWVkaWFGaWxlcykgeworICAgICAgICAgICAgdmFyIGksIGxlbjsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG1lZGlhRmlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICB1cGxvYWRGaWxlKG1lZGlhRmlsZXNbaV0pOworICAgICAgICAgICAgfQkgICAgCisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsZWQgaWYgc29tZXRoaW5nIGJhZCBoYXBwZW5zLgorICAgICAgICAvLyAKKyAgICAgICAgZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycm9yKSB7CisJICAgICAgICB2YXIgbXNnID0gJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjYXB0dXJlOiAnICsgZXJyb3IuY29kZTsKKyAgICAgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYWxlcnQobXNnLCBudWxsLCAnVWggb2ghJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGJ1dHRvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBjYXB0dXJlQXVkaW8oKSB7CisgICAgICAgICAgICAvLyBMYXVuY2ggZGV2aWNlIGF1ZGlvIHJlY29yZGluZyBhcHBsaWNhdGlvbiwgCisgICAgICAgICAgICAvLyBhbGxvd2luZyB1c2VyIHRvIGNhcHR1cmUgdXAgdG8gMiBhdWRpbyBjbGlwcworICAgICAgICAgICAgbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlLmNhcHR1cmVBdWRpbyhjYXB0dXJlU3VjY2VzcywgY2FwdHVyZUVycm9yLCB7bGltaXQ6IDJ9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwbG9hZCBmaWxlcyB0byBzZXJ2ZXIKKyAgICAgICAgZnVuY3Rpb24gdXBsb2FkRmlsZShtZWRpYUZpbGUpIHsKKyAgICAgICAgICAgIHZhciBmdCA9IG5ldyBGaWxlVHJhbnNmZXIoKSwKKyAgICAgICAgICAgICAgICBwYXRoID0gbWVkaWFGaWxlLmZ1bGxQYXRoLAorICAgICAgICAgICAgICAgIG5hbWUgPSBtZWRpYUZpbGUubmFtZTsKKworICAgICAgICAgICAgZnQudXBsb2FkKHBhdGgsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9teS5kb21haW4uY29tL3VwbG9hZC5waHAiLAorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXBsb2FkIHN1Y2Nlc3M6ICcgKyByZXN1bHQucmVzcG9uc2VDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmJ5dGVzU2VudCArICcgYnl0ZXMgc2VudCcpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHVwbG9hZGluZyBmaWxlICcgKyBwYXRoICsgJzogJyArIGVycm9yLmNvZGUpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeyBmaWxlTmFtZTogbmFtZSB9KTsgICAKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJjYXB0dXJlQXVkaW8oKTsiPkNhcHR1cmUgQXVkaW88L2J1dHRvbj4gPGJyPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCitCbGFja0JlcnJ5IFdlYldvcmtzIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBQaG9uZUdhcCBmb3IgQmxhY2tCZXJyeSBXZWJXb3JrcyBhdHRlbXB0cyB0byBsYXVuY2ggdGhlIF9fVm9pY2UgTm90ZXMgUmVjb3JkZXJfXyBhcHBsaWNhdGlvbiwgcHJvdmlkZWQgYnkgUklNLCB0byBjYXB0dXJlIHRoZSBhdWRpbyByZWNvcmRpbmdzLiAgVGhlIGRldmVsb3BlciB3aWxsIHJlY2VpdmUgYSBDYXB0dXJlRXJyb3IuYENBUFRVUkVfTk9UX1NVUFBPUlRFRGAgZXJyb3IgY29kZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tCisKKy0gaU9TIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGF1ZGlvIHJlY29yZGluZyBhcHBsaWNhdGlvbiBzbyBhIHNpbXBsZSB1c2VyIGludGVyZmFjZSBpcyBwcm92aWRlZC4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlQXVkaW9PcHRpb25zLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVBdWRpb09wdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMzBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlQXVkaW9PcHRpb25zLm1kCkBAIC0wLDAgKzEsMzcgQEAKK0NhcHR1cmVBdWRpb09wdGlvbnMKKz09PT09PT09PT09PT09PT09PT0KKworPiBFbmNhcHN1bGF0ZXMgYXVkaW8gY2FwdHVyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisKK1Byb3BlcnRpZXMKKy0tLS0tLS0tLS0KKworLSBfX2xpbWl0Ol9fIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjbGlwcyB0aGUgZGV2aWNlIHVzZXIgY2FuIHJlY29yZCBpbiBhIHNpbmdsZSBjYXB0dXJlIG9wZXJhdGlvbi4gIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIChkZWZhdWx0cyB0byAxKS4KKy0gX19kdXJhdGlvbjpfXyBUaGUgbWF4aW11bSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBzb3VuZCBjbGlwLCBpbiBzZWNvbmRzLgorLSBfX21vZGU6X18gVGhlIHNlbGVjdGVkIGF1ZGlvIG1vZGUuICBUaGUgdmFsdWUgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVsZW1lbnRzIGluIGBjYXB0dXJlLnN1cHBvcnRlZEF1ZGlvTW9kZXNgLgorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBsaW1pdCBjYXB0dXJlIG9wZXJhdGlvbiB0byAzIG1lZGlhIGZpbGVzLCBubyBsb25nZXIgdGhhbiAxMCBzZWNvbmRzIGVhY2gKKyAgICB2YXIgb3B0aW9ucyA9IHsgbGltaXQ6IDMsIGR1cmF0aW9uOiAxMCB9OworCisgICAgbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlLmNhcHR1cmVBdWRpbyhjYXB0dXJlU3VjY2VzcywgY2FwdHVyZUVycm9yLCBvcHRpb25zKTsKKworQW5kcm9pZCBRdWlya3MKKy0tLS0tLS0tLS0tLS0tCisKKy0gVGhlIF9fZHVyYXRpb25fXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFJlY29yZGluZyBsZW5ndGhzIGNhbm5vdCBiZSBsaW1pdGVkIHByb2dyYW1tYXRpY2FsbHkuCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhdWRpbyByZWNvcmRpbmcgZm9ybWF0IGNhbm5vdCBiZSBhbHRlcmVkIHByb2dyYW1tYXRpY2FsbHkuICBSZWNvcmRpbmdzIGFyZSBlbmNvZGVkIHVzaW5nIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgZm9ybWF0IChhdWRpby9hbXIpLgorCitCbGFja0JlcnJ5IFdlYldvcmtzIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBUaGUgX19kdXJhdGlvbl9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiAgUmVjb3JkaW5nIGxlbmd0aHMgY2Fubm90IGJlIGxpbWl0ZWQgcHJvZ3JhbW1hdGljYWxseS4KKy0gVGhlIF9fbW9kZV9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiAgVGhlIGF1ZGlvIHJlY29yZGluZyBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseS4gIFJlY29yZGluZ3MgYXJlIGVuY29kZWQgdXNpbmcgQWRhcHRpdmUgTXVsdGktUmF0ZSAoQU1SKSBmb3JtYXQgKGF1ZGlvL2FtcikuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KKworLSBUaGUgX19saW1pdF9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiBPbmUgcmVjb3JkaW5nIGNhbiBiZSBjcmVhdGVkIGZvciBlYWNoIGludm9jYXRpb24uCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhdWRpbyByZWNvcmRpbmcgZm9ybWF0IGNhbm5vdCBiZSBhbHRlcmVkIHByb2dyYW1tYXRpY2FsbHkuICBSZWNvcmRpbmdzIGFyZSBlbmNvZGVkIHVzaW5nIFdhdmVmb3JtIEF1ZGlvIChXQVYpIGZvcm1hdCAoYXVkaW8vd2F2KS4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlSW1hZ2UubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUltYWdlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODkxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUltYWdlLm1kCkBAIC0wLDAgKzEsMTA4IEBACitjYXB0dXJlLmNhcHR1cmVJbWFnZQorPT09PT09PT09PT09PT09PT09PT0KKworPiBTdGFydCB0aGUgY2FtZXJhIGFwcGxpY2F0aW9uIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgY2FwdHVyZWQgaW1hZ2UgZmlsZShzKS4KKworICAgIG5hdmlnYXRvci5kZXZpY2UuY2FwdHVyZS5jYXB0dXJlSW1hZ2UoIAorCSAgICBDYXB0dXJlQ0IgY2FwdHVyZVN1Y2Nlc3MsIENhcHR1cmVFcnJvckNCIGNhcHR1cmVFcnJvciwgW0NhcHR1cmVJbWFnZU9wdGlvbnMgb3B0aW9uc10KKwkpOworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBtZXRob2Qgc3RhcnRzIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gY2FwdHVyZSBpbWFnZXMgdXNpbmcgdGhlIGRldmljZSBjYW1lcmEgYXBwbGljYXRpb24uICBUaGUgb3BlcmF0aW9uIGFsbG93cyB0aGUgZGV2aWNlIHVzZXIgdG8gY2FwdHVyZSBtdWx0aXBsZSBpbWFnZXMgaW4gYSBzaW5nbGUgc2Vzc2lvbi4KKworVGhlIGNhcHR1cmUgb3BlcmF0aW9uIGVuZHMgd2hlbiBlaXRoZXIgdGhlIHVzZXIgZXhpdHMgdGhlIGNhbWVyYSBhcHBsaWNhdGlvbiwgb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcywgc3BlY2lmaWVkIGJ5IHRoZSBfX2xpbWl0X18gcGFyYW1ldGVyIGluIENhcHR1cmVJbWFnZU9wdGlvbnMsIGhhcyBiZWVuIHJlYWNoZWQuICBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgdGhlIF9fbGltaXRfXyBwYXJhbWV0ZXIsIGEgZGVmYXVsdCB2YWx1ZSBvZiBvbmUgKDEpIGlzIHVzZWQsIGFuZCB0aGUgY2FwdHVyZSBvcGVyYXRpb24gd2lsbCB0ZXJtaW5hdGUgYWZ0ZXIgdGhlIHVzZXIgY2FwdHVyZXMgYSBzaW5nbGUgaW1hZ2UuCisKK1doZW4gdGhlIGNhcHR1cmUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBpdCB3aWxsIGludm9rZSB0aGUgQ2FwdHVyZUNCIGNhbGxiYWNrIHdpdGggYW4gYXJyYXkgb2YgTWVkaWFGaWxlIG9iamVjdHMgZGVzY3JpYmluZyBlYWNoIGNhcHR1cmVkIGltYWdlIGZpbGUuICBJZiB0aGUgb3BlcmF0aW9uIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGFuIGltYWdlIGlzIGNhcHR1cmVkLCB0aGUgQ2FwdHVyZUVycm9yQ0IgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdpdGggYSBDYXB0dXJlRXJyb3Igb2JqZWN0IHdpdGggdGhlIENhcHR1cmVFcnJvci5gQ0FQVFVSRV9OT19NRURJQV9GSUxFU2AgZXJyb3IgY29kZS4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIGNhcHR1cmUgY2FsbGJhY2sKKyAgICB2YXIgY2FwdHVyZVN1Y2Nlc3MgPSBmdW5jdGlvbihtZWRpYUZpbGVzKSB7CisgICAgICAgIHZhciBpLCBwYXRoLCBsZW47CisgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG1lZGlhRmlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKKyAgICAgICAgICAgIHBhdGggPSBtZWRpYUZpbGVzW2ldLmZ1bGxQYXRoOworICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGludGVyZXN0aW5nIHdpdGggdGhlIGZpbGUKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBjYXB0dXJlIGVycm9yIGNhbGxiYWNrCisgICAgdmFyIGNhcHR1cmVFcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYWxlcnQoJ0Vycm9yIGNvZGU6ICcgKyBlcnJvci5jb2RlLCBudWxsLCAnQ2FwdHVyZSBFcnJvcicpOworICAgIH07CisKKyAgICAvLyBzdGFydCBpbWFnZSBjYXB0dXJlCisgICAgbmF2aWdhdG9yLmRldmljZS5jYXB0dXJlLmNhcHR1cmVJbWFnZShjYXB0dXJlU3VjY2VzcywgY2FwdHVyZUVycm9yLCB7bGltaXQ6Mn0pOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNhcHR1cmUgSW1hZ2U8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJqc29uMi5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY2FwdHVyZSBvcGVyYXRpb24gaXMgZmluaXNoZWQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gY2FwdHVyZVN1Y2Nlc3MobWVkaWFGaWxlcykgeworICAgICAgICAgICAgdmFyIGksIGxlbjsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG1lZGlhRmlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICB1cGxvYWRGaWxlKG1lZGlhRmlsZXNbaV0pOworICAgICAgICAgICAgfQkgICAgCisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsZWQgaWYgc29tZXRoaW5nIGJhZCBoYXBwZW5zLgorICAgICAgICAvLyAKKyAgICAgICAgZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycm9yKSB7CisJICAgICAgICB2YXIgbXNnID0gJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjYXB0dXJlOiAnICsgZXJyb3IuY29kZTsKKyAgICAgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYWxlcnQobXNnLCBudWxsLCAnVWggb2ghJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGJ1dHRvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBjYXB0dXJlSW1hZ2UoKSB7CisgICAgICAgICAgICAvLyBMYXVuY2ggZGV2aWNlIGNhbWVyYSBhcHBsaWNhdGlvbiwgCisgICAgICAgICAgICAvLyBhbGxvd2luZyB1c2VyIHRvIGNhcHR1cmUgdXAgdG8gMiBpbWFnZXMKKyAgICAgICAgICAgIG5hdmlnYXRvci5kZXZpY2UuY2FwdHVyZS5jYXB0dXJlSW1hZ2UoY2FwdHVyZVN1Y2Nlc3MsIGNhcHR1cmVFcnJvciwge2xpbWl0OiAyfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGxvYWQgZmlsZXMgdG8gc2VydmVyCisgICAgICAgIGZ1bmN0aW9uIHVwbG9hZEZpbGUobWVkaWFGaWxlKSB7CisgICAgICAgICAgICB2YXIgZnQgPSBuZXcgRmlsZVRyYW5zZmVyKCksCisgICAgICAgICAgICAgICAgcGF0aCA9IG1lZGlhRmlsZS5mdWxsUGF0aCwKKyAgICAgICAgICAgICAgICBuYW1lID0gbWVkaWFGaWxlLm5hbWU7CisKKyAgICAgICAgICAgIGZ0LnVwbG9hZChwYXRoLAorICAgICAgICAgICAgICAgICJodHRwOi8vbXkuZG9tYWluLmNvbS91cGxvYWQucGhwIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwbG9hZCBzdWNjZXNzOiAnICsgcmVzdWx0LnJlc3BvbnNlQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5ieXRlc1NlbnQgKyAnIGJ5dGVzIHNlbnQnKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB1cGxvYWRpbmcgZmlsZSAnICsgcGF0aCArICc6ICcgKyBlcnJvci5jb2RlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsgZmlsZU5hbWU6IG5hbWUgfSk7ICAgCisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iY2FwdHVyZUltYWdlKCk7Ij5DYXB0dXJlIEltYWdlPC9idXR0b24+IDxicj4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUltYWdlT3B0aW9ucy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlSW1hZ2VPcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjQwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZUltYWdlT3B0aW9ucy5tZApAQCAtMCwwICsxLDM0IEBACitDYXB0dXJlSW1hZ2VPcHRpb25zCis9PT09PT09PT09PT09PT09PT09CisKKz4gRW5jYXBzdWxhdGVzIGltYWdlIGNhcHR1cmUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19saW1pdDpfXyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIHRoZSBkZXZpY2UgdXNlciBjYW4gY2FwdHVyZSBpbiBhIHNpbmdsZSBjYXB0dXJlIG9wZXJhdGlvbi4gIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIChkZWZhdWx0cyB0byAxKS4KKy0gX19tb2RlOl9fIFRoZSBzZWxlY3RlZCBpbWFnZSBtb2RlLiAgVGhlIHZhbHVlIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlbGVtZW50cyBpbiBgY2FwdHVyZS5zdXBwb3J0ZWRJbWFnZU1vZGVzYC4KKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gbGltaXQgY2FwdHVyZSBvcGVyYXRpb24gdG8gMyBpbWFnZXMKKyAgICB2YXIgb3B0aW9ucyA9IHsgbGltaXQ6IDMgfTsKKworICAgIG5hdmlnYXRvci5kZXZpY2UuY2FwdHVyZS5jYXB0dXJlSW1hZ2UoY2FwdHVyZVN1Y2Nlc3MsIGNhcHR1cmVFcnJvciwgb3B0aW9ucyk7CisKK0FuZHJvaWQgUXVpcmtzCistLS0tLS0tLS0tLS0tLQorCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBpbWFnZSBzaXplIGFuZCBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseTsgaG93ZXZlciwgdGhlIGltYWdlIHNpemUgY2FuIGJlIGFsdGVyZWQgYnkgdGhlIGRldmljZSB1c2VyLiAgSW1hZ2VzIGFyZSBzYXZlZCBpbiBKUEVHIGZvcm1hdCAoaW1hZ2UvanBlZykuCisKK0JsYWNrQmVycnkgV2ViV29ya3MgUXVpcmtzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBpbWFnZSBzaXplIGFuZCBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseTsgaG93ZXZlciwgdGhlIGltYWdlIHNpemUgY2FuIGJlIGFsdGVyZWQgYnkgdGhlIGRldmljZSB1c2VyLiAgSW1hZ2VzIGFyZSBzYXZlZCBpbiBKUEVHIGZvcm1hdCAoaW1hZ2UvanBlZykuCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KKworLSBUaGUgX19saW1pdF9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiBPbmUgaW1hZ2UgaXMgdGFrZW4gcGVyIGludm9jYXRpb24uCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBpbWFnZSBzaXplIGFuZCBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseS4gIEltYWdlcyBhcmUgc2F2ZWQgaW4gSlBFRyBmb3JtYXQgKGltYWdlL2pwZWcpLgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9jYXB0dXJlL2NhcHR1cmVWaWRlby5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlVmlkZW8ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNGRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlVmlkZW8ubWQKQEAgLTAsMCArMSwxMTEgQEAKK2NhcHR1cmUuY2FwdHVyZVZpZGVvCis9PT09PT09PT09PT09PT09PT09PQorCis+IFN0YXJ0IHRoZSB2aWRlbyByZWNvcmRlciBhcHBsaWNhdGlvbiBhbmQgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGNhcHR1cmVkIHZpZGVvIGNsaXAgZmlsZShzKS4KKworICAgIG5hdmlnYXRvci5kZXZpY2UuY2FwdHVyZS5jYXB0dXJlVmlkZW8oIAorCSAgICBDYXB0dXJlQ0IgY2FwdHVyZVN1Y2Nlc3MsIENhcHR1cmVFcnJvckNCIGNhcHR1cmVFcnJvciwgW0NhcHR1cmVWaWRlb09wdGlvbnMgb3B0aW9uc10KKwkpOworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBtZXRob2Qgc3RhcnRzIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gY2FwdHVyZSB2aWRlbyByZWNvcmRpbmdzIHVzaW5nIHRoZSBkZXZpY2UgdmlkZW8gcmVjb3JkaW5nIGFwcGxpY2F0aW9uLiAgVGhlIG9wZXJhdGlvbiBhbGxvd3MgdGhlIGRldmljZSB1c2VyIHRvIGNhcHR1cmUgbXVsdGlwbGUgcmVjb3JkaW5ncyBpbiBhIHNpbmdsZSBzZXNzaW9uLgorCitUaGUgY2FwdHVyZSBvcGVyYXRpb24gZW5kcyB3aGVuIGVpdGhlciB0aGUgdXNlciBleGl0cyB0aGUgdmlkZW8gcmVjb3JkaW5nIGFwcGxpY2F0aW9uLCBvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkaW5ncywgc3BlY2lmaWVkIGJ5IHRoZSBfX2xpbWl0X18gcGFyYW1ldGVyIGluIENhcHR1cmVWaWRlb09wdGlvbnMsIGhhcyBiZWVuIHJlYWNoZWQuICBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgdGhlIF9fbGltaXRfXyBwYXJhbWV0ZXIsIGEgZGVmYXVsdCB2YWx1ZSBvZiBvbmUgKDEpIGlzIHVzZWQsIGFuZCB0aGUgY2FwdHVyZSBvcGVyYXRpb24gd2lsbCB0ZXJtaW5hdGUgYWZ0ZXIgdGhlIHVzZXIgcmVjb3JkcyBhIHNpbmdsZSB2aWRlbyBjbGlwLgorCitXaGVuIHRoZSBjYXB0dXJlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZCwgaXQgd2lsbCBpbnZva2UgdGhlIENhcHR1cmVDQiBjYWxsYmFjayB3aXRoIGFuIGFycmF5IG9mIE1lZGlhRmlsZSBvYmplY3RzIGRlc2NyaWJpbmcgZWFjaCBjYXB0dXJlZCB2aWRlbyBjbGlwIGZpbGUuICBJZiB0aGUgb3BlcmF0aW9uIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGFuIHZpZGVvIGNsaXAgaXMgY2FwdHVyZWQsIHRoZSBDYXB0dXJlRXJyb3JDQiBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2l0aCBhIENhcHR1cmVFcnJvciBvYmplY3Qgd2l0aCB0aGUgQ2FwdHVyZUVycm9yLmBDQVBUVVJFX05PX01FRElBX0ZJTEVTYCBlcnJvciBjb2RlLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gY2FwdHVyZSBjYWxsYmFjaworICAgIHZhciBjYXB0dXJlU3VjY2VzcyA9IGZ1bmN0aW9uKG1lZGlhRmlsZXMpIHsKKyAgICAgICAgdmFyIGksIHBhdGgsIGxlbjsKKyAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbWVkaWFGaWxlcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgeworICAgICAgICAgICAgcGF0aCA9IG1lZGlhRmlsZXNbaV0uZnVsbFBhdGg7CisgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgaW50ZXJlc3Rpbmcgd2l0aCB0aGUgZmlsZQorICAgICAgICB9CisgICAgfTsKKworICAgIC8vIGNhcHR1cmUgZXJyb3IgY2FsbGJhY2sKKyAgICB2YXIgY2FwdHVyZUVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgnRXJyb3IgY29kZTogJyArIGVycm9yLmNvZGUsIG51bGwsICdDYXB0dXJlIEVycm9yJyk7CisgICAgfTsKKworICAgIC8vIHN0YXJ0IHZpZGVvIGNhcHR1cmUKKyAgICBuYXZpZ2F0b3IuZGV2aWNlLmNhcHR1cmUuY2FwdHVyZVZpZGVvKGNhcHR1cmVTdWNjZXNzLCBjYXB0dXJlRXJyb3IsIHtsaW1pdDoyfSk7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Q2FwdHVyZSBWaWRlbzwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Impzb24yLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBDYWxsZWQgd2hlbiBjYXB0dXJlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBjYXB0dXJlU3VjY2VzcyhtZWRpYUZpbGVzKSB7CisgICAgICAgICAgICB2YXIgaSwgbGVuOworICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbWVkaWFGaWxlcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgeworICAgICAgICAgICAgICAgIHVwbG9hZEZpbGUobWVkaWFGaWxlc1tpXSk7CisgICAgICAgICAgICB9CSAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGxlZCBpZiBzb21ldGhpbmcgYmFkIGhhcHBlbnMuCisgICAgICAgIC8vIAorICAgICAgICBmdW5jdGlvbiBjYXB0dXJlRXJyb3IoZXJyb3IpIHsKKwkgICAgICAgIHZhciBtc2cgPSAnQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNhcHR1cmU6ICcgKyBlcnJvci5jb2RlOworICAgICAgICAgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydChtc2csIG51bGwsICdVaCBvaCEnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEEgYnV0dG9uIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIGNhcHR1cmVWaWRlbygpIHsKKyAgICAgICAgICAgIC8vIExhdW5jaCBkZXZpY2UgdmlkZW8gcmVjb3JkaW5nIGFwcGxpY2F0aW9uLCAKKyAgICAgICAgICAgIC8vIGFsbG93aW5nIHVzZXIgdG8gY2FwdHVyZSB1cCB0byAyIHZpZGVvIGNsaXBzCisgICAgICAgICAgICBuYXZpZ2F0b3IuZGV2aWNlLmNhcHR1cmUuY2FwdHVyZVZpZGVvKGNhcHR1cmVTdWNjZXNzLCBjYXB0dXJlRXJyb3IsIHtsaW1pdDogMn0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBsb2FkIGZpbGVzIHRvIHNlcnZlcgorICAgICAgICBmdW5jdGlvbiB1cGxvYWRGaWxlKG1lZGlhRmlsZSkgeworICAgICAgICAgICAgdmFyIGZ0ID0gbmV3IEZpbGVUcmFuc2ZlcigpLAorICAgICAgICAgICAgICAgIHBhdGggPSBtZWRpYUZpbGUuZnVsbFBhdGgsCisgICAgICAgICAgICAgICAgbmFtZSA9IG1lZGlhRmlsZS5uYW1lOworCisgICAgICAgICAgICBmdC51cGxvYWQocGF0aCwKKyAgICAgICAgICAgICAgICAiaHR0cDovL215LmRvbWFpbi5jb20vdXBsb2FkLnBocCIsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVcGxvYWQgc3VjY2VzczogJyArIHJlc3VsdC5yZXNwb25zZUNvZGUpOworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuYnl0ZXNTZW50ICsgJyBieXRlcyBzZW50Jyk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgdXBsb2FkaW5nIGZpbGUgJyArIHBhdGggKyAnOiAnICsgZXJyb3IuY29kZSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7IGZpbGVOYW1lOiBuYW1lIH0pOyAgIAorICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImNhcHR1cmVWaWRlbygpOyI+Q2FwdHVyZSBWaWRlbzwvYnV0dG9uPiA8YnI+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK0JsYWNrQmVycnkgV2ViV29ya3MgUXVpcmtzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIFBob25lR2FwIGZvciBCbGFja0JlcnJ5IFdlYldvcmtzIGF0dGVtcHRzIHRvIGxhdW5jaCB0aGUgX19WaWRlbyBSZWNvcmRlcl9fIGFwcGxpY2F0aW9uLCBwcm92aWRlZCBieSBSSU0sIHRvIGNhcHR1cmUgdGhlIHZpZGVvIHJlY29yZGluZ3MuICBUaGUgZGV2ZWxvcGVyIHdpbGwgcmVjZWl2ZSBhIENhcHR1cmVFcnJvci5gQ0FQVFVSRV9OT1RfU1VQUE9SVEVEYCBlcnJvciBjb2RlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZVZpZGVvT3B0aW9ucy5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvY2FwdHVyZS9jYXB0dXJlVmlkZW9PcHRpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWEwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL2NhcHR1cmUvY2FwdHVyZVZpZGVvT3B0aW9ucy5tZApAQCAtMCwwICsxLDQwIEBACitDYXB0dXJlVmlkZW9PcHRpb25zCis9PT09PT09PT09PT09PT09PT09CisKKz4gRW5jYXBzdWxhdGVzIHZpZGVvIGNhcHR1cmUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCitQcm9wZXJ0aWVzCistLS0tLS0tLS0tCisKKy0gX19saW1pdDpfXyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmlkZW8gY2xpcHMgdGhlIGRldmljZSB1c2VyIGNhbiBjYXB0dXJlIGluIGEgc2luZ2xlIGNhcHR1cmUgb3BlcmF0aW9uLiAgVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgKGRlZmF1bHRzIHRvIDEpLgorLSBfX2R1cmF0aW9uOl9fIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIGEgdmlkZW8gY2xpcCwgaW4gc2Vjb25kcy4KKy0gX19tb2RlOl9fIFRoZSBzZWxlY3RlZCB2aWRlbyBjYXB0dXJlIG1vZGUuICBUaGUgdmFsdWUgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVsZW1lbnRzIGluIGBjYXB0dXJlLnN1cHBvcnRlZFZpZGVvTW9kZXNgLgorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBsaW1pdCBjYXB0dXJlIG9wZXJhdGlvbiB0byAzIHZpZGVvIGNsaXBzCisgICAgdmFyIG9wdGlvbnMgPSB7IGxpbWl0OiAzIH07CisKKyAgICBuYXZpZ2F0b3IuZGV2aWNlLmNhcHR1cmUuY2FwdHVyZVZpZGVvKGNhcHR1cmVTdWNjZXNzLCBjYXB0dXJlRXJyb3IsIG9wdGlvbnMpOworCitBbmRyb2lkIFF1aXJrcworLS0tLS0tLS0tLS0tLS0KKworLSBUaGUgX19kdXJhdGlvbl9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiAgUmVjb3JkaW5nIGxlbmd0aHMgY2Fubm90IGJlIGxpbWl0ZWQgcHJvZ3JhbW1hdGljYWxseS4KKy0gVGhlIF9fbW9kZV9fIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLiAgVGhlIHZpZGVvIHNpemUgYW5kIGZvcm1hdCBjYW5ub3QgYmUgYWx0ZXJlZCBwcm9ncmFtbWF0aWNhbGx5OyBob3dldmVyLCB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSBkZXZpY2UgdXNlci4gQnkgZGVmYXVsdCwgdmlkZW9zIGFyZSByZWNvcmRlZCBpbiAzR1BQICh2aWRlby8zZ3BwKSBmb3JtYXQuCisKKworQmxhY2tCZXJyeSBXZWJXb3JrcyBRdWlya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gVGhlIF9fZHVyYXRpb25fXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFJlY29yZGluZyBsZW5ndGhzIGNhbm5vdCBiZSBsaW1pdGVkIHByb2dyYW1tYXRpY2FsbHkuCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSB2aWRlbyBzaXplIGFuZCBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseTsgaG93ZXZlciwgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY2hhbmdlZCBieSB0aGUgZGV2aWNlIHVzZXIuIEJ5IGRlZmF1bHQsIHZpZGVvcyBhcmUgcmVjb3JkZWQgaW4gM0dQUCAodmlkZW8vM2dwcCkgZm9ybWF0LgorCitpT1MgUXVpcmtzCistLS0tLS0tLS0tCisKKy0gVGhlIF9fbGltaXRfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIE9uZSB2aWRlbyBpcyByZWNvcmRlZCBwZXIgaW52b2NhdGlvbi4KKy0gVGhlIF9fZHVyYXRpb25fXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFJlY29yZGluZyBsZW5ndGhzIGNhbm5vdCBiZSBsaW1pdGVkIHByb2dyYW1tYXRpY2FsbHkuCistIFRoZSBfX21vZGVfXyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSB2aWRlbyBzaXplIGFuZCBmb3JtYXQgY2Fubm90IGJlIGFsdGVyZWQgcHJvZ3JhbW1hdGljYWxseS4gQnkgZGVmYXVsdCwgdmlkZW9zIGFyZSByZWNvcmRlZCBpbiBNT1YgKHZpZGVvL3F1aWNrdGltZSkgZm9ybWF0LgorCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLmdldEN1cnJlbnRQb3NpdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLmdldEN1cnJlbnRQb3NpdGlvbi5tZApAQCAtMCwwICsxLDE1MyBAQAorbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gYW4gYXVkaW8gZmlsZS4KKworICAgIG1lZGlhLmdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVN1Y2Nlc3MsIFttZWRpYUVycm9yXSk7CisKK1BhcmFtZXRlcnMKKy0tLS0tLS0tLS0KKworLSBfX21lZGlhU3VjY2Vzc19fOiBUaGUgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBzZWNvbmRzLgorLSBfX21lZGlhRXJyb3JfXzogKE9wdGlvbmFsKSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYG1lZGlhLmdldEN1cnJlbnRQb3NpdGlvbmAgaXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdW5kZXJseWluZyBhdWRpbyBmaWxlIG9mIGEgTWVkaWEgb2JqZWN0LiBBbHNvIHVwZGF0ZXMgdGhlIF9fX3Bvc2l0aW9uX18gcGFyYW1ldGVyIHdpdGhpbiB0aGUgTWVkaWEgb2JqZWN0LiAKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKyAgICAKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgLy8KKyAgICAgICAgdmFyIG15X21lZGlhID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKworICAgICAgICAvLyBVcGRhdGUgbWVkaWEgcG9zaXRpb24gZXZlcnkgc2Vjb25kCisgICAgICAgIHZhciBtZWRpYVRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBnZXQgbWVkaWEgcG9zaXRpb24KKyAgICAgICAgICAgIG15X21lZGlhLmdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgICAgICAgICAvLyBzdWNjZXNzIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgZnVuY3Rpb24ocG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKChwb3NpdGlvbikgKyAiIHNlYyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIGdldHRpbmcgcG9zPSIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICB9LCAxMDAwKTsKKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPk1lZGlhIEV4YW1wbGU8L3RpdGxlPgorICAgICAgICAKKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAgICAgICAKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAgICAgcGxheUF1ZGlvKCJodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXVkaW8gcGxheWVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdmFyIG15X21lZGlhID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBtZWRpYVRpbWVyID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQbGF5IGF1ZGlvCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gcGxheUF1ZGlvKHNyYykgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBNZWRpYSBvYmplY3QgZnJvbSBzcmMKKyAgICAgICAgICAgICAgICBteV9tZWRpYSA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgICAgICBteV9tZWRpYS5wbGF5KCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBteV9tZWRpYSBwb3NpdGlvbiBldmVyeSBzZWNvbmQKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFUaW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBteV9tZWRpYSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbigocG9zaXRpb24pICsgIiBzZWMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvciBnZXR0aW5nIHBvcz0iICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUG9zaXRpb24oIkVycm9yOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFBhdXNlIGF1ZGlvCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHBhdXNlQXVkaW8oKSB7CisgICAgICAgICAgICAgICAgaWYgKG15X21lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFN0b3AgYXVkaW8KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gc3RvcEF1ZGlvKCkgeworICAgICAgICAgICAgICAgIGlmIChteV9tZWRpYSkgeworICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobWVkaWFUaW1lcik7CisgICAgICAgICAgICAgICAgbWVkaWFUaW1lciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25TdWNjZXNzIENhbGxiYWNrCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJwbGF5QXVkaW8oKTpBdWRpbyBTdWNjZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25FcnJvciBDYWxsYmFjayAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAgICAgYWxlcnQoJ2NvZGU6ICcgICAgKyBlcnJvci5jb2RlICAgICsgJ1xuJyArIAorICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCBhdWRpbyBwb3NpdGlvbgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBzZXRBdWRpb1Bvc2l0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvX3Bvc2l0aW9uJykuaW5uZXJIVE1MID0gcG9zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGxheUF1ZGlvKCdodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzJyk7Ij5QbGF5IEF1ZGlvPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGF1c2VBdWRpbygpOyI+UGF1c2UgUGxheWluZyBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InN0b3BBdWRpbygpOyI+U3RvcCBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPHAgaWQ9ImF1ZGlvX3Bvc2l0aW9uIj48L3A+CisgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9tZWRpYS5nZXREdXJhdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuZ2V0RHVyYXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMThmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuZ2V0RHVyYXRpb24ubWQKQEAgLTAsMCArMSwxNDUgQEAKK21lZGlhLmdldER1cmF0aW9uCis9PT09PT09PT09PT09PT09PQorCitSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBmaWxlLgorCisgICAgbWVkaWEuZ2V0RHVyYXRpb24oKTsKKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYG1lZGlhLmdldER1cmF0aW9uYCBpcyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUgaW4gc2Vjb25kcywgaWYga25vd24uICBJZiB0aGUgZHVyYXRpb24gaXMgdW5rbm93biwgYSB2YWx1ZSBvZiAtMSBpcyByZXR1cm5lZC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKyAgICAKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgLy8KKyAgICAgICAgdmFyIG15X21lZGlhID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKworICAgICAgICAvLyBHZXQgZHVyYXRpb24KKyAgICAgICAgdmFyIGNvdW50ZXIgPSAwOworICAgICAgICB2YXIgdGltZXJEdXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTAwOworICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiAyMDAwKSB7CisgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lckR1cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgZHVyID0gbXlfbWVkaWEuZ2V0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChkdXIgPiAwKSB7CisgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lckR1cik7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvX2R1cmF0aW9uJykuaW5uZXJIVE1MID0gKGR1cikgKyAiIHNlYyI7CisgICAgICAgICAgICB9CisgICAgICAgfSwgMTAwKTsKKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+TWVkaWEgRXhhbXBsZTwvdGl0bGU+CisgICAgICAgIAorICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisgICAgICAgIAorICAgICAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgICAgICBwbGF5QXVkaW8oImh0dHA6Ly9hdWRpby5pYmVhdC5vcmcvY29udGVudC9wMXJqMXMvcDFyajFzXy1fcm9ja0d1aXRhci5tcDMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB2YXIgbXlfbWVkaWEgPSBudWxsOworICAgICAgICAgICAgdmFyIG1lZGlhVGltZXIgPSBudWxsOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBwbGF5QXVkaW8oc3JjKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIE1lZGlhIG9iamVjdCBmcm9tIHNyYworICAgICAgICAgICAgICAgIG15X21lZGlhID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUGxheSBhdWRpbworICAgICAgICAgICAgICAgIG15X21lZGlhLnBsYXkoKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG15X21lZGlhIHBvc2l0aW9uIGV2ZXJ5IHNlY29uZAorICAgICAgICAgICAgICAgIGlmIChtZWRpYVRpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG15X21lZGlhIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5nZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1Bvc2l0aW9uKChwb3NpdGlvbikgKyAiIHNlYyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIGdldHRpbmcgcG9zPSIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbigiRXJyb3I6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gUGF1c2UgYXVkaW8KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gcGF1c2VBdWRpbygpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlfbWVkaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEucGF1c2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gU3RvcCBhdWRpbworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBzdG9wQXVkaW8oKSB7CisgICAgICAgICAgICAgICAgaWYgKG15X21lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChtZWRpYVRpbWVyKTsKKyAgICAgICAgICAgICAgICBtZWRpYVRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBvblN1Y2Nlc3MgQ2FsbGJhY2sKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIFN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBvbkVycm9yIENhbGxiYWNrIAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsgCisgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gU2V0IGF1ZGlvIHBvc2l0aW9uCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHNldEF1ZGlvUG9zaXRpb24ocG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW9fcG9zaXRpb24nKS5pbm5lckhUTUwgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYnRuIGxhcmdlIiBvbmNsaWNrPSJwbGF5QXVkaW8oJ2h0dHA6Ly9hdWRpby5pYmVhdC5vcmcvY29udGVudC9wMXJqMXMvcDFyajFzXy1fcm9ja0d1aXRhci5tcDMnKTsiPlBsYXkgQXVkaW88L2E+CisgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYnRuIGxhcmdlIiBvbmNsaWNrPSJwYXVzZUF1ZGlvKCk7Ij5QYXVzZSBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0ic3RvcEF1ZGlvKCk7Ij5TdG9wIFBsYXlpbmcgQXVkaW88L2E+CisgICAgICAgICAgICA8cCBpZD0iYXVkaW9fcG9zaXRpb24iPjwvcD4KKyAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzM3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLm1kCkBAIC0wLDAgKzEsNDQgQEAKK01lZGlhCis9PT09PQorCis+IFRoZSBgTWVkaWFgIG9iamVjdCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byByZWNvcmQgYW5kIHBsYXkgYmFjayBhdWRpbyBmaWxlcyBvbiBhIGRldmljZS4gCisKKyAgICB2YXIgbWVkaWEgPSBuZXcgTWVkaWEoc3JjLCBtZWRpYVN1Y2Nlc3MsIFttZWRpYUVycm9yXSwgW21lZGlhU3RhdHVzXSk7CisKKworTm90ZTogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWRoZXJlIHRvIGEgVzNDIHNwZWNpZmljYXRpb24gZm9yIG1lZGlhIGNhcHR1cmUsIGFuZCBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2Ugb25seS4gIEEgZnV0dXJlIGltcGxlbWVudGF0aW9uIHdpbGwgYWRoZXJlIHRvIHRoZSBsYXRlc3QgVzNDIHNwZWNpZmljYXRpb24gYW5kIG1heSBkZXByZWNhdGUgdGhlIGN1cnJlbnQgQVBJcy4KKworUGFyYW1ldGVycworLS0tLS0tLS0tLQorCistIF9fc3JjX186IEEgVVJJIGNvbnRhaW5pbmcgdGhlIGF1ZGlvIGNvbnRlbnQuIF8oRE9NU3RyaW5nKV8KKy0gX19tZWRpYVN1Y2Nlc3NfXzogKE9wdGlvbmFsKSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGFmdGVyIGEgTWVkaWEgb2JqZWN0IGhhcyBjb21wbGV0ZWQgdGhlIGN1cnJlbnQgcGxheS9yZWNvcmQgb3Igc3RvcCBhY3Rpb24uIF8oRnVuY3Rpb24pXworLSBfX21lZGlhRXJyb3JfXzogKE9wdGlvbmFsKSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gXyhGdW5jdGlvbilfCistIF9fbWVkaWFTdGF0dXNfXzogKE9wdGlvbmFsKSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHRvIGluZGljYXRlIHN0YXR1cyBjaGFuZ2VzLiBfKEZ1bmN0aW9uKV8KKworTWV0aG9kcworLS0tLS0tLQorCistIG1lZGlhLmdldEN1cnJlbnRQb3NpdGlvbjogUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gYW4gYXVkaW8gZmlsZS4KKy0gbWVkaWEuZ2V0RHVyYXRpb246IFJldHVybnMgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIGZpbGUuCistIG1lZGlhLnBsYXk6IFN0YXJ0IG9yIHJlc3VtZSBwbGF5aW5nIGF1ZGlvIGZpbGUuCistIG1lZGlhLnBhdXNlOiBQYXVzZSBwbGF5aW5nIGF1ZGlvIGZpbGUuCistIG1lZGlhLnJlbGVhc2U6IFJlbGVhc2VzIHRoZSB1bmRlcmx5aW5nIE9TJ2VzIGF1ZGlvIHJlc291cmNlcy4KKy0gbWVkaWEuc2Vla1RvOiBNb3ZlcyB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBhdWRpbyBmaWxlLgorLSBtZWRpYS5zdGFydFJlY29yZDogU3RhcnQgcmVjb3JkaW5nIGF1ZGlvIGZpbGUuCistIG1lZGlhLnN0b3BSZWNvcmQ6IFN0b3AgcmVjb3JkaW5nIGF1ZGlvIGZpbGUuCistIG1lZGlhLnN0b3A6IFN0b3AgcGxheWluZyBhdWRpbyBmaWxlLgorCitBZGRpdGlvbmFsIFJlYWRPbmx5IFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIF9fX3Bvc2l0aW9uX186IFRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGF1ZGlvIHBsYXliYWNrIGluIHNlY29uZHMuICBOb3QgYXV0b21hdGljYWxseSB1cGRhdGVkIGR1cmluZyBwbGF5LCBjYWxsIGdldEN1cnJlbnRQb3NpdGlvbiB0byB1cGRhdGUuCistIF9fX2R1cmF0aW9uX186IFRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaW4gc2Vjb25kcy4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKwpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9tZWRpYS5wYXVzZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEucGF1c2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxOGI4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEucGF1c2UubWQKQEAgLTAsMCArMSwxNTAgQEAKK21lZGlhLnBhdXNlCis9PT09PT09PT09PQorCitQYXVzZXMgcGxheWluZyBhbiBhdWRpbyBmaWxlLgorCisgICAgbWVkaWEucGF1c2UoKTsKKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYG1lZGlhLnBhdXNlYCBpcyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcGF1c2VzIHBsYXlpbmcgYW4gYXVkaW8gZmlsZS4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKyAgICAKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIFBsYXkgYXVkaW8KKyAgICAvLworICAgIGZ1bmN0aW9uIHBsYXlBdWRpbyh1cmwpIHsKKyAgICAgICAgLy8gUGxheSB0aGUgYXVkaW8gZmlsZSBhdCB1cmwKKyAgICAgICAgdmFyIG15X21lZGlhID0gbmV3IE1lZGlhKHVybCwKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICAgICAgICAgIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJwbGF5QXVkaW8oKTpBdWRpbyBTdWNjZXNzIik7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgIGZ1bmN0aW9uKGVycikgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJwbGF5QXVkaW8oKTpBdWRpbyBFcnJvcjogIitlcnIpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBQbGF5IGF1ZGlvCisgICAgICAgIG15X21lZGlhLnBsYXkoKTsKKworICAgICAgICAvLyBQYXVzZSBhZnRlciAxMCBzZWNvbmRzCisgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBtZWRpYS5wYXVzZSgpOworICAgICAgICB9LCAxMDAwMCk7ICAgICAgICAKKyAgICB9CisKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgICAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPk1lZGlhIEV4YW1wbGU8L3RpdGxlPgorICAgICAgICAKKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAgICAgICAKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAgICAgcGxheUF1ZGlvKCJodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXVkaW8gcGxheWVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdmFyIG15X21lZGlhID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBtZWRpYVRpbWVyID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQbGF5IGF1ZGlvCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gcGxheUF1ZGlvKHNyYykgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBNZWRpYSBvYmplY3QgZnJvbSBzcmMKKyAgICAgICAgICAgICAgICBteV9tZWRpYSA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgICAgICBteV9tZWRpYS5wbGF5KCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBteV9tZWRpYSBwb3NpdGlvbiBldmVyeSBzZWNvbmQKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFUaW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBteV9tZWRpYSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbigocG9zaXRpb24pICsgIiBzZWMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvciBnZXR0aW5nIHBvcz0iICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUG9zaXRpb24oIkVycm9yOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFBhdXNlIGF1ZGlvCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHBhdXNlQXVkaW8oKSB7CisgICAgICAgICAgICAgICAgaWYgKG15X21lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFN0b3AgYXVkaW8KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gc3RvcEF1ZGlvKCkgeworICAgICAgICAgICAgICAgIGlmIChteV9tZWRpYSkgeworICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobWVkaWFUaW1lcik7CisgICAgICAgICAgICAgICAgbWVkaWFUaW1lciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25TdWNjZXNzIENhbGxiYWNrCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJwbGF5QXVkaW8oKTpBdWRpbyBTdWNjZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25FcnJvciBDYWxsYmFjayAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAgICAgYWxlcnQoJ2NvZGU6ICcgICAgKyBlcnJvci5jb2RlICAgICsgJ1xuJyArIAorICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCBhdWRpbyBwb3NpdGlvbgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBzZXRBdWRpb1Bvc2l0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvX3Bvc2l0aW9uJykuaW5uZXJIVE1MID0gcG9zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGxheUF1ZGlvKCdodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzJyk7Ij5QbGF5IEF1ZGlvPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGF1c2VBdWRpbygpOyI+UGF1c2UgUGxheWluZyBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InN0b3BBdWRpbygpOyI+U3RvcCBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPHAgaWQ9ImF1ZGlvX3Bvc2l0aW9uIj48L3A+CisgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnBsYXkubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnBsYXkubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZjAxYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEucGxheS5tZApAQCAtMCwwICsxLDE0NiBAQAorbWVkaWEucGxheQorPT09PT09PT09PQorCitTdGFydHMgb3IgcmVzdW1lcyBwbGF5aW5nIGFuIGF1ZGlvIGZpbGUuCisKKyAgICBtZWRpYS5wbGF5KCk7CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0Z1bmN0aW9uIGBtZWRpYS5wbGF5YCBpcyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIG9yIHJlc3VtZXMgcGxheWluZyBhbiBhdWRpbyBmaWxlLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorICAgIAorUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gUGxheSBhdWRpbworICAgIC8vCisgICAgZnVuY3Rpb24gcGxheUF1ZGlvKHVybCkgeworICAgICAgICAvLyBQbGF5IHRoZSBhdWRpbyBmaWxlIGF0IHVybAorICAgICAgICB2YXIgbXlfbWVkaWEgPSBuZXcgTWVkaWEodXJsLAorICAgICAgICAgICAgLy8gc3VjY2VzcyBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIFN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oZXJyKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIEVycm9yOiAiK2Vycik7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgbXlfbWVkaWEucGxheSgpOworICAgIH0KKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+TWVkaWEgRXhhbXBsZTwvdGl0bGU+CisgICAgICAgIAorICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisgICAgICAgIAorICAgICAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgICAgICBwbGF5QXVkaW8oImh0dHA6Ly9hdWRpby5pYmVhdC5vcmcvY29udGVudC9wMXJqMXMvcDFyajFzXy1fcm9ja0d1aXRhci5tcDMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB2YXIgbXlfbWVkaWEgPSBudWxsOworICAgICAgICAgICAgdmFyIG1lZGlhVGltZXIgPSBudWxsOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBwbGF5QXVkaW8oc3JjKSB7CisgICAgICAgICAgICAJaWYgKG15X21lZGlhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAJLy8gQ3JlYXRlIE1lZGlhIG9iamVjdCBmcm9tIHNyYworICAgICAgICAgICAgICAgIAlteV9tZWRpYSA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICAJfSAvLyBlbHNlIHBsYXkgY3VycmVudCBhdWRpbworICAgICAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgICAgICBteV9tZWRpYS5wbGF5KCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBteV9tZWRpYSBwb3NpdGlvbiBldmVyeSBzZWNvbmQKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFUaW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBteV9tZWRpYSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEuZ2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbigocG9zaXRpb24pICsgIiBzZWMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvciBnZXR0aW5nIHBvcz0iICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUG9zaXRpb24oIkVycm9yOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFBhdXNlIGF1ZGlvCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHBhdXNlQXVkaW8oKSB7CisgICAgICAgICAgICAgICAgaWYgKG15X21lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFN0b3AgYXVkaW8KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gc3RvcEF1ZGlvKCkgeworICAgICAgICAgICAgICAgIGlmIChteV9tZWRpYSkgeworICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobWVkaWFUaW1lcik7CisgICAgICAgICAgICAgICAgbWVkaWFUaW1lciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25TdWNjZXNzIENhbGxiYWNrCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJwbGF5QXVkaW8oKTpBdWRpbyBTdWNjZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gb25FcnJvciBDYWxsYmFjayAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAgICAgYWxlcnQoJ2NvZGU6ICcgICAgKyBlcnJvci5jb2RlICAgICsgJ1xuJyArIAorICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCBhdWRpbyBwb3NpdGlvbgorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBzZXRBdWRpb1Bvc2l0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvX3Bvc2l0aW9uJykuaW5uZXJIVE1MID0gcG9zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGxheUF1ZGlvKCdodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzJyk7Ij5QbGF5IEF1ZGlvPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0icGF1c2VBdWRpbygpOyI+UGF1c2UgUGxheWluZyBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InN0b3BBdWRpbygpOyI+U3RvcCBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPHAgaWQ9ImF1ZGlvX3Bvc2l0aW9uIj48L3A+CisgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnJlbGVhc2UubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnJlbGVhc2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3MzdlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEucmVsZWFzZS5tZApAQCAtMCwwICsxLDEzNCBAQAorbWVkaWEucmVsZWFzZQorPT09PT09PT09PT09PT09PT0KKworUmVsZWFzZXMgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbXMgYXVkaW8gcmVzb3VyY2VzLgorCisgICAgbWVkaWEucmVsZWFzZSgpOworCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitGdW5jdGlvbiBgbWVkaWEucmVsZWFzZWAgaXMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHJlbGVhc2VzIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW1zIGF1ZGlvIHJlc291cmNlcy4gIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgQW5kcm9pZCBhcyB0aGVyZSBhcmUgYSBmaW5pdGUgYW1vdW50IG9mIE9wZW5Db3JlIGluc3RhbmNlcyBmb3IgbWVkaWEgcGxheWJhY2suICBEZXZlbG9wZXJzIHNob3VsZCBjYWxsIHRoZSAncmVsZWFzZScgZnVuY3Rpb24gd2hlbiB0aGV5IG5vIGxvbmdlciBuZWVkIHRoZSBNZWRpYSByZXNvdXJjZS4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKyAgICAKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgLy8KKyAgICAgICAgdmFyIG15X21lZGlhID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgCisgICAgICAgIG15X21lZGlhLnBsYXkoKTsKKyAgICAgICAgbXlfbWVkaWEuc3RvcCgpOworICAgICAgICBteV9tZWRpYS5yZWxlYXNlKCk7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICAgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorICAgICAgICA8aHRtbD4KKyAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5NZWRpYSBFeGFtcGxlPC90aXRsZT4KKyAgICAgICAgCisgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICAgICAgCisgICAgICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgICAgIHBsYXlBdWRpbygiaHR0cDovL2F1ZGlvLmliZWF0Lm9yZy9jb250ZW50L3Axcmoxcy9wMXJqMXNfLV9yb2NrR3VpdGFyLm1wMyIpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIEF1ZGlvIHBsYXllcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHZhciBteV9tZWRpYSA9IG51bGw7CisgICAgICAgICAgICB2YXIgbWVkaWFUaW1lciA9IG51bGw7CisgICAgICAgIAorICAgICAgICAgICAgLy8gUGxheSBhdWRpbworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIHBsYXlBdWRpbyhzcmMpIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgTWVkaWEgb2JqZWN0IGZyb20gc3JjCisgICAgICAgICAgICAgICAgbXlfbWVkaWEgPSBuZXcgTWVkaWEoc3JjLCBvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBQbGF5IGF1ZGlvCisgICAgICAgICAgICAgICAgbXlfbWVkaWEucGxheSgpOworICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbXlfbWVkaWEgcG9zaXRpb24gZXZlcnkgc2Vjb25kCisgICAgICAgICAgICAgICAgaWYgKG1lZGlhVGltZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbXlfbWVkaWEgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLmdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZXNzIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ocG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUG9zaXRpb24oKHBvc2l0aW9uKSArICIgc2VjIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRXJyb3IgZ2V0dGluZyBwb3M9IiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1Bvc2l0aW9uKCJFcnJvcjogIiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBQYXVzZSBhdWRpbworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBwYXVzZUF1ZGlvKCkgeworICAgICAgICAgICAgICAgIGlmIChteV9tZWRpYSkgeworICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5wYXVzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBTdG9wIGF1ZGlvCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHN0b3BBdWRpbygpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlfbWVkaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEuc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKG1lZGlhVGltZXIpOworICAgICAgICAgICAgICAgIG1lZGlhVGltZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIG9uU3VjY2VzcyBDYWxsYmFjaworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcygpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicGxheUF1ZGlvKCk6QXVkaW8gU3VjY2VzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgeworICAgICAgICAgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyAnXG4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBTZXQgYXVkaW8gcG9zaXRpb24KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gc2V0QXVkaW9Qb3NpdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpb19wb3NpdGlvbicpLmlubmVySFRNTCA9IHBvc2l0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InBsYXlBdWRpbygnaHR0cDovL2F1ZGlvLmliZWF0Lm9yZy9jb250ZW50L3Axcmoxcy9wMXJqMXNfLV9yb2NrR3VpdGFyLm1wMycpOyI+UGxheSBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InBhdXNlQXVkaW8oKTsiPlBhdXNlIFBsYXlpbmcgQXVkaW88L2E+CisgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYnRuIGxhcmdlIiBvbmNsaWNrPSJzdG9wQXVkaW8oKTsiPlN0b3AgUGxheWluZyBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxwIGlkPSJhdWRpb19wb3NpdGlvbiI+PC9wPgorICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9tZWRpYS5zZWVrVG8ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnNlZWtUby5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIxMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9tZWRpYS5zZWVrVG8ubWQKQEAgLTAsMCArMSwxMzIgQEAKK21lZGlhLnNlZWtUbworPT09PT09PT09PT09PT09PT09PT09PT09CisKK1NldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGFuIGF1ZGlvIGZpbGUuCisKKyAgICBtZWRpYS5zZWVrVG8obWlsbGlzZWNvbmRzKTsKKworUGFyYW1ldGVycworLS0tLS0tLS0tLQorCistIF9fbWlsbGlzZWNvbmRzX186IFRoZSBwb3NpdGlvbiB0byBzZXQgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdpdGhpbiB0aGUgYXVkaW8gaW4gbWlsbGlzZWNvbmRzLiAuCisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0Z1bmN0aW9uIGBtZWRpYS5zZWVrVG9gIGlzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHVuZGVybHlpbmcgYXVkaW8gZmlsZSBvZiBhIE1lZGlhIG9iamVjdC4gQWxzbyB1cGRhdGVzIHRoZSBfX19wb3NpdGlvbl9fIHBhcmFtZXRlciB3aXRoaW4gdGhlIE1lZGlhIG9iamVjdC4gCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisgICAgCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAgICAgLy8gQXVkaW8gcGxheWVyCisgICAgICAgIC8vCisgICAgICAgIHZhciBteV9tZWRpYSA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisJCW15X21lZGlhLnBsYXkoKTsKKyAgICAgICAgLy8gU2Vla1RvIHRvIDEwIHNlY29uZHMgYWZ0ZXIgNSBzZWNvbmRzCisgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBteV9tZWRpYS5zZWVrVG8oMTAwMDApOworICAgICAgICB9LCA1MDAwKTsKKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPk1lZGlhIEV4YW1wbGU8L3RpdGxlPgorICAgICAgICAKKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAgICAgICAKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAgICAgcGxheUF1ZGlvKCJodHRwOi8vYXVkaW8uaWJlYXQub3JnL2NvbnRlbnQvcDFyajFzL3Axcmoxc18tX3JvY2tHdWl0YXIubXAzIik7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXVkaW8gcGxheWVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdmFyIG15X21lZGlhID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBtZWRpYVRpbWVyID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBQbGF5IGF1ZGlvCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gcGxheUF1ZGlvKHNyYykgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBNZWRpYSBvYmplY3QgZnJvbSBzcmMKKyAgICAgICAgICAgICAgICBteV9tZWRpYSA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgICAgICBteV9tZWRpYS5wbGF5KCk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG1lZGlhIHBvc2l0aW9uIGV2ZXJ5IHNlY29uZAorICAgICAgICAJCW1lZGlhVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIAkJLy8gZ2V0IG1lZGlhIHBvc2l0aW9uCisgICAgICAgICAgIAkJCW15X21lZGlhLmdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgICAgICAgICAJCS8vIHN1Y2Nlc3MgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAJCWZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIAkJaWYgKHBvc2l0aW9uID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0QXVkaW9Qb3NpdGlvbihwb3NpdGlvbiArICIgc2VjIik7CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAkJfSwKKyAgICAgICAgICAgICAgICAJCS8vIGVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgCQlmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAgICAgICAgIAkJY29uc29sZS5sb2coIkVycm9yIGdldHRpbmcgcG9zPSIgKyBlKTsKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJKTsKKyAgICAgICAgCQl9LCAxMDAwKTsKKyAgICAgICAgCQkvLyBTZWVrVG8gdG8gMTAgc2Vjb25kcyBhZnRlciA1IHNlY29uZHMKKyAgICAgICAgCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgCQlteV9tZWRpYS5zZWVrVG8oMTAwMDApOworICAgICAgICAgICAJCX0sIDUwMDApOworICAgICAJCX0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBTdG9wIGF1ZGlvCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHN0b3BBdWRpbygpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlfbWVkaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEuc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKG1lZGlhVGltZXIpOworICAgICAgICAgICAgICAgIG1lZGlhVGltZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIG9uU3VjY2VzcyBDYWxsYmFjaworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcygpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicGxheUF1ZGlvKCk6QXVkaW8gU3VjY2VzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgeworICAgICAgICAgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKyAKKyAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyAnXG4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBTZXQgYXVkaW8gcG9zaXRpb24KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gc2V0QXVkaW9Qb3NpdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpb19wb3NpdGlvbicpLmlubmVySFRNTCA9IHBvc2l0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InBsYXlBdWRpbygnaHR0cDovL2F1ZGlvLmliZWF0Lm9yZy9jb250ZW50L3Axcmoxcy9wMXJqMXNfLV9yb2NrR3VpdGFyLm1wMycpOyI+UGxheSBBdWRpbzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gbGFyZ2UiIG9uY2xpY2s9InN0b3BBdWRpbygpOyI+U3RvcCBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPHAgaWQ9ImF1ZGlvX3Bvc2l0aW9uIj48L3A+CisgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9tZWRpYS9tZWRpYS5zdGFydFJlY29yZC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuc3RhcnRSZWNvcmQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ODgwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuc3RhcnRSZWNvcmQubWQKQEAgLTAsMCArMSwxMTcgQEAKK21lZGlhLnN0YXJ0UmVjb3JkCis9PT09PT09PT09PT09PT09PQorCitTdGFydHMgcmVjb3JkaW5nIGFuIGF1ZGlvIGZpbGUuCisKKyAgICBtZWRpYS5zdGFydFJlY29yZCgpOworCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitGdW5jdGlvbiBgbWVkaWEuc3RhcnRSZWNvcmRgIGlzIGEgc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBzdGFydHMgcmVjb3JkaW5nIGFuIGF1ZGlvIGZpbGUuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIGlPUworLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisgICAgCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBSZWNvcmQgYXVkaW8KKyAgICAvLyAKKyAgICBmdW5jdGlvbiByZWNvcmRBdWRpbygpIHsKKyAgICAgICAgdmFyIHNyYyA9ICJteXJlY29yZGluZy5tcDMiOworICAgICAgICB2YXIgbWVkaWFSZWMgPSBuZXcgTWVkaWEoc3JjLAorICAgICAgICAgICAgLy8gc3VjY2VzcyBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInJlY29yZEF1ZGlvKCk6QXVkaW8gU3VjY2VzcyIpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgIGZ1bmN0aW9uKGVycikgeworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJyZWNvcmRBdWRpbygpOkF1ZGlvIEVycm9yOiAiKyBlcnIuY29kZSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBSZWNvcmQgYXVkaW8KKyAgICAgICAgbWVkaWFSZWMuc3RhcnRSZWNvcmQoKTsKKyAgICB9CisKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5EZXZpY2UgUHJvcGVydGllcyBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0icGhvbmVnYXAuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorCisgICAgICAgIC8vIFdhaXQgZm9yIFBob25lR2FwIHRvIGxvYWQKKyAgICAgICAgLy8KKyAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlcmVhZHkiLCBvbkRldmljZVJlYWR5LCBmYWxzZSk7CisKKyAgICAgICAgLy8gUmVjb3JkIGF1ZGlvCisgICAgICAgIC8vIAorICAgICAgICBmdW5jdGlvbiByZWNvcmRBdWRpbygpIHsKKyAgICAgICAgICAgIHZhciBzcmMgPSAibXlyZWNvcmRpbmcubXAzIjsKKyAgICAgICAgICAgIHZhciBtZWRpYVJlYyA9IG5ldyBNZWRpYShzcmMsIG9uU3VjY2Vzcywgb25FcnJvcik7CisKKyAgICAgICAgICAgIC8vIFJlY29yZCBhdWRpbworICAgICAgICAgICAgbWVkaWFSZWMuc3RhcnRSZWNvcmQoKTsKKworICAgICAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgYWZ0ZXIgMTAgc2VjCisgICAgICAgICAgICB2YXIgcmVjVGltZSA9IDA7CisgICAgICAgICAgICB2YXIgcmVjSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZWNUaW1lID0gcmVjVGltZSArIDE7CisgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbihyZWNUaW1lICsgIiBzZWMiKTsKKyAgICAgICAgICAgICAgICBpZiAocmVjVGltZSA+PSAxMCkgeworICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJlY0ludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFSZWMuc3RvcFJlY29yZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEwMDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGhvbmVHYXAgaXMgcmVhZHkKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgIHJlY29yZEF1ZGlvKCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gb25TdWNjZXNzIENhbGxiYWNrCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcygpIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJyZWNvcmRBdWRpbygpOkF1ZGlvIFN1Y2Nlc3MiKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvbkVycm9yIENhbGxiYWNrIAorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CisgICAgICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsgCisgICAgICAgICAgICAgICAgICAnbWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyAnXG4nKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBhdWRpbyBwb3NpdGlvbgorICAgICAgICAvLyAKKyAgICAgICAgZnVuY3Rpb24gc2V0QXVkaW9Qb3NpdGlvbihwb3NpdGlvbikgeworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvX3Bvc2l0aW9uJykuaW5uZXJIVE1MID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8cCBpZD0ibWVkaWEiPlJlY29yZGluZyBhdWRpby4uLjwvcD4KKyAgICAgICAgPHAgaWQ9ImF1ZGlvX3Bvc2l0aW9uIj48L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCisKK2lPUyBRdWlya3MKKy0tLS0tLS0tLS0KKworLSBUaGUgZmlsZSB0byByZWNvcmQgdG8gbXVzdCBhbHJlYWR5IGV4aXN0IGFuZCBzaG91bGQgYmUgb2YgdHlwZSAud2F2LiBUaGUgRmlsZSBBUEkncyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGZpbGUuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnN0b3AubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnN0b3AubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwOGJmNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuc3RvcC5tZApAQCAtMCwwICsxLDE0OSBAQAorbWVkaWEuc3RvcAorPT09PT09PT09PQorCitTdG9wcyBwbGF5aW5nIGFuIGF1ZGlvIGZpbGUuCisKKyAgICBtZWRpYS5zdG9wKCk7CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK0Z1bmN0aW9uIGBtZWRpYS5zdG9wYCBpcyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgc3RvcHMgcGxheWluZyBhbiBhdWRpbyBmaWxlLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBpT1MKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorICAgIAorUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gUGxheSBhdWRpbworICAgIC8vCisgICAgZnVuY3Rpb24gcGxheUF1ZGlvKHVybCkgeworICAgICAgICAvLyBQbGF5IHRoZSBhdWRpbyBmaWxlIGF0IHVybAorICAgICAgICB2YXIgbXlfbWVkaWEgPSBuZXcgTWVkaWEodXJsLAorICAgICAgICAgICAgLy8gc3VjY2VzcyBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIFN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oZXJyKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIEVycm9yOiAiK2Vycik7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgbXlfbWVkaWEucGxheSgpOworCisgICAgICAgIC8vIFBhdXNlIGFmdGVyIDEwIHNlY29uZHMKKyAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIG15X21lZGlhLnN0b3AoKTsKKyAgICAgICAgfSwgMTAwMDApOyAgICAgICAgCisgICAgfQorCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+TWVkaWEgRXhhbXBsZTwvdGl0bGU+CisgICAgICAgIAorICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisgICAgICAgIAorICAgICAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgICAgICAvLworICAgICAgICAgICAgZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKyAgICAgICAgICAgICAgICBwbGF5QXVkaW8oImh0dHA6Ly9hdWRpby5pYmVhdC5vcmcvY29udGVudC9wMXJqMXMvcDFyajFzXy1fcm9ja0d1aXRhci5tcDMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBBdWRpbyBwbGF5ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB2YXIgbXlfbWVkaWEgPSBudWxsOworICAgICAgICAgICAgdmFyIG1lZGlhVGltZXIgPSBudWxsOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFBsYXkgYXVkaW8KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBwbGF5QXVkaW8oc3JjKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIE1lZGlhIG9iamVjdCBmcm9tIHNyYworICAgICAgICAgICAgICAgIG15X21lZGlhID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUGxheSBhdWRpbworICAgICAgICAgICAgICAgIG15X21lZGlhLnBsYXkoKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG15X21lZGlhIHBvc2l0aW9uIGV2ZXJ5IHNlY29uZAorICAgICAgICAgICAgICAgIGlmIChtZWRpYVRpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG15X21lZGlhIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBteV9tZWRpYS5nZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1Bvc2l0aW9uKChwb3NpdGlvbikgKyAiIHNlYyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIGdldHRpbmcgcG9zPSIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9Qb3NpdGlvbigiRXJyb3I6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gUGF1c2UgYXVkaW8KKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgZnVuY3Rpb24gcGF1c2VBdWRpbygpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlfbWVkaWEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfbWVkaWEucGF1c2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gU3RvcCBhdWRpbworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBmdW5jdGlvbiBzdG9wQXVkaW8oKSB7CisgICAgICAgICAgICAgICAgaWYgKG15X21lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIG15X21lZGlhLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChtZWRpYVRpbWVyKTsKKyAgICAgICAgICAgICAgICBtZWRpYVRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBvblN1Y2Nlc3MgQ2FsbGJhY2sKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInBsYXlBdWRpbygpOkF1ZGlvIFN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBvbkVycm9yIENhbGxiYWNrIAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBhbGVydCgnY29kZTogJyAgICArIGVycm9yLmNvZGUgICAgKyAnXG4nICsgCisgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2U6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xuJyk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gU2V0IGF1ZGlvIHBvc2l0aW9uCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIGZ1bmN0aW9uIHNldEF1ZGlvUG9zaXRpb24ocG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW9fcG9zaXRpb24nKS5pbm5lckhUTUwgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYnRuIGxhcmdlIiBvbmNsaWNrPSJwbGF5QXVkaW8oJ2h0dHA6Ly9hdWRpby5pYmVhdC5vcmcvY29udGVudC9wMXJqMXMvcDFyajFzXy1fcm9ja0d1aXRhci5tcDMnKTsiPlBsYXkgQXVkaW88L2E+CisgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYnRuIGxhcmdlIiBvbmNsaWNrPSJwYXVzZUF1ZGlvKCk7Ij5QYXVzZSBQbGF5aW5nIEF1ZGlvPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBsYXJnZSIgb25jbGljaz0ic3RvcEF1ZGlvKCk7Ij5TdG9wIFBsYXlpbmcgQXVkaW88L2E+CisgICAgICAgICAgICA8cCBpZD0iYXVkaW9fcG9zaXRpb24iPjwvcD4KKyAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnN0b3BSZWNvcmQubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL21lZGlhL21lZGlhLnN0b3BSZWNvcmQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjZjllMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbWVkaWEvbWVkaWEuc3RvcFJlY29yZC5tZApAQCAtMCwwICsxLDExOSBAQAorbWVkaWEuc3RvcFJlY29yZAorPT09PT09PT09PT09PT09PQorCitTdG9wcyByZWNvcmRpbmcgYW4gYXVkaW8gZmlsZS4KKworICAgIG1lZGlhLnN0b3BSZWNvcmQoKTsKKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYG1lZGlhLnN0b3BSZWNvcmRgIGlzIGEgc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBzdG9wcyByZWNvcmRpbmcgYW4gYXVkaW8gZmlsZS4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gaU9TCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKyAgICAKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworICAgIC8vIFJlY29yZCBhdWRpbworICAgIC8vIAorICAgIGZ1bmN0aW9uIHJlY29yZEF1ZGlvKCkgeworICAgICAgICB2YXIgc3JjID0gIm15cmVjb3JkaW5nLm1wMyI7CisgICAgICAgIHZhciBtZWRpYVJlYyA9IG5ldyBNZWRpYShzcmMsCisgICAgICAgICAgICAvLyBzdWNjZXNzIGNhbGxiYWNrCisgICAgICAgICAgICBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicmVjb3JkQXVkaW8oKTpBdWRpbyBTdWNjZXNzIik7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBlcnJvciBjYWxsYmFjaworICAgICAgICAgICAgZnVuY3Rpb24oZXJyKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInJlY29yZEF1ZGlvKCk6QXVkaW8gRXJyb3I6ICIrIGVyci5jb2RlKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIFJlY29yZCBhdWRpbworICAgICAgICBtZWRpYVJlYy5zdGFydFJlY29yZCgpOworCisgICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nIGFmdGVyIDEwIHNlY29uZHMKKyAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIG1lZGlhUmVjLnN0b3BSZWNvcmQoKTsKKyAgICAgICAgfSwgMTAwMDApOworICAgIH0KKworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkRldmljZSBQcm9wZXJ0aWVzIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBSZWNvcmQgYXVkaW8KKyAgICAgICAgLy8gCisgICAgICAgIGZ1bmN0aW9uIHJlY29yZEF1ZGlvKCkgeworICAgICAgICAgICAgdmFyIHNyYyA9ICJteXJlY29yZGluZy5tcDMiOworICAgICAgICAgICAgdmFyIG1lZGlhUmVjID0gbmV3IE1lZGlhKHNyYywgb25TdWNjZXNzLCBvbkVycm9yKTsKKworICAgICAgICAgICAgLy8gUmVjb3JkIGF1ZGlvCisgICAgICAgICAgICBtZWRpYVJlYy5zdGFydFJlY29yZCgpOworCisgICAgICAgICAgICAvLyBTdG9wIHJlY29yZGluZyBhZnRlciAxMCBzZWMKKyAgICAgICAgICAgIHZhciByZWNUaW1lID0gMDsKKyAgICAgICAgICAgIHZhciByZWNJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHJlY1RpbWUgPSByZWNUaW1lICsgMTsKKyAgICAgICAgICAgICAgICBzZXRBdWRpb1Bvc2l0aW9uKHJlY1RpbWUgKyAiIHNlYyIpOworICAgICAgICAgICAgICAgIGlmIChyZWNUaW1lID49IDEwKSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVjSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICBtZWRpYVJlYy5zdG9wUmVjb3JkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTAwMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgcmVjb3JkQXVkaW8oKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBvblN1Y2Nlc3MgQ2FsbGJhY2sKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKCkgeworICAgICAgICAgICAgY29uc29sZS5sb2coInJlY29yZEF1ZGlvKCk6QXVkaW8gU3VjY2VzcyIpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIG9uRXJyb3IgQ2FsbGJhY2sgCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgIGFsZXJ0KCdjb2RlOiAnICAgICsgZXJyb3IuY29kZSAgICArICdcbicgKyAKKyAgICAgICAgICAgICAgICAgICdtZXNzYWdlOiAnICsgZXJyb3IubWVzc2FnZSArICdcbicpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IGF1ZGlvIHBvc2l0aW9uCisgICAgICAgIC8vIAorICAgICAgICBmdW5jdGlvbiBzZXRBdWRpb1Bvc2l0aW9uKHBvc2l0aW9uKSB7CisgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW9fcG9zaXRpb24nKS5pbm5lckhUTUwgPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwIGlkPSJtZWRpYSI+UmVjb3JkaW5nIGF1ZGlvLi4uPC9wPgorICAgICAgICA8cCBpZD0iYXVkaW9fcG9zaXRpb24iPjwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKKworCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uYWxlcnQubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uYWxlcnQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YzY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5hbGVydC5tZApAQCAtMCwwICsxLDk0IEBACitub3RpZmljYXRpb24uYWxlcnQKKz09PT09PT09PT09PT09PT09PQorCitTaG93cyBhIGN1c3RvbSBhbGVydCBvciBkaWFsb2cgYm94LgorCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydChtZXNzYWdlLCBhbGVydENhbGxiYWNrLCBbdGl0bGVdLCBbYnV0dG9uTmFtZV0pCisKKy0gX19tZXNzYWdlOl9fIERpYWxvZyBtZXNzYWdlIChgU3RyaW5nYCkKKy0gX19hbGVydENhbGxiYWNrOl9fIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGFsZXJ0IGRpYWxvZyBpcyBkaXNtaXNzZWQuIChgRnVuY3Rpb25gKQorLSBfX3RpdGxlOl9fIERpYWxvZyB0aXRsZSAoYFN0cmluZ2ApIChPcHRpb25hbCwgRGVmYXVsdDogIkFsZXJ0IikKKy0gX19idXR0b25OYW1lOl9fIEJ1dHRvbiBuYW1lIChgU3RyaW5nYCkgKE9wdGlvbmFsLCBEZWZhdWx0OiAiT0siKQorICAgIAorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK01vc3QgUGhvbmVHYXAgaW1wbGVtZW50YXRpb25zIHVzZSBhIG5hdGl2ZSBkaWFsb2cgYm94IGZvciB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBzb21lIHBsYXRmb3JtcyBzaW1wbHkgdXNlIHRoZSBicm93c2VyJ3MgYGFsZXJ0YCBmdW5jdGlvbiwgd2hpY2ggaXMgdHlwaWNhbGx5IGxlc3MgY3VzdG9taXphYmxlLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IChPUyA0LjYpCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDUuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKy0gV2luZG93cyBQaG9uZSA3ICggTWFuZ28gKQorCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBBbmRyb2lkIC8gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpIC8gaVBob25lCisgICAgLy8KKyAgICBmdW5jdGlvbiBhbGVydERpc21pc3NlZCgpIHsKKyAgICAgICAgLy8gZG8gc29tZXRoaW5nCisgICAgfQorCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgKKyAgICAgICAgJ1lvdSBhcmUgdGhlIHdpbm5lciEnLCAgLy8gbWVzc2FnZQorICAgICAgICBhbGVydERpc21pc3NlZCwgICAgICAgICAvLyBjYWxsYmFjaworICAgICAgICAnR2FtZSBPdmVyJywgICAgICAgICAgICAvLyB0aXRsZQorICAgICAgICAnRG9uZScgICAgICAgICAgICAgICAgICAvLyBidXR0b25OYW1lCisgICAgKTsKKworICAgIC8vIEJsYWNrQmVycnkgKE9TIDQuNikgLyB3ZWJPUworICAgIC8vCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgnWW91IGFyZSB0aGUgd2lubmVyIScpOworICAgICAgICAKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Tm90aWZpY2F0aW9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gRW1wdHkKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBhbGVydCBkaWFsb2cgZGlzbWlzc2VkCisJICAgIGZ1bmN0aW9uIGFsZXJ0RGlzbWlzc2VkKCkgeworCSAgICAgICAgLy8gZG8gc29tZXRoaW5nCisJICAgIH0KKworICAgICAgICAvLyBTaG93IGEgY3VzdG9tIGFsZXJ0CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIHNob3dBbGVydCgpIHsKKwkJICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYWxlcnQoCisJCSAgICAgICAgJ1lvdSBhcmUgdGhlIHdpbm5lciEnLCAgLy8gbWVzc2FnZQorCQkgICAgICAgIGFsZXJ0RGlzbWlzc2VkLCAgICAgICAgIC8vIGNhbGxiYWNrCisJCSAgICAgICAgJ0dhbWUgT3ZlcicsICAgICAgICAgICAgLy8gdGl0bGUKKwkJICAgICAgICAnRG9uZScgICAgICAgICAgICAgICAgICAvLyBidXR0b25OYW1lCisJCSAgICApOworICAgICAgICB9CisgICAgCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InNob3dBbGVydCgpOyByZXR1cm4gZmFsc2U7Ij5TaG93IEFsZXJ0PC9hPjwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK1dpbmRvd3MgUGhvbmUgNyBRdWlya3MKKy0tLS0tLS0tLS0tLS0KKworLSBJZ25vcmVzIGJ1dHRvbiBuYW1lcywgYWx3YXlzIHVzZXMgJ09LJyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uYmVlcC5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5iZWVwLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTdhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uYmVlcC5tZApAQCAtMCwwICsxLDk0IEBACitub3RpZmljYXRpb24uYmVlcAorPT09PT09PT09PT09PT09PT0KKworVGhlIGRldmljZSB3aWxsIHBsYXkgYSBiZWVwIHNvdW5kLgorCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5iZWVwKHRpbWVzKTsKKworLSBfX3RpbWVzOl9fIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBiZWVwIChgTnVtYmVyYCkKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSAoT1MgNC42KQorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNyAoIE1hbmdvICkKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgLy8gQmVlcCB0d2ljZSEKKyAgICBuYXZpZ2F0b3Iubm90aWZpY2F0aW9uLmJlZXAoMik7CisKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Tm90aWZpY2F0aW9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gRW1wdHkKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNob3cgYSBjdXN0b20gYWxlcnQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gc2hvd0FsZXJ0KCkgeworCQkgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgKKwkJICAgICAgICAnWW91IGFyZSB0aGUgd2lubmVyIScsICAvLyBtZXNzYWdlCisJCSAgICAgICAgJ0dhbWUgT3ZlcicsICAgICAgICAgICAgLy8gdGl0bGUKKwkJICAgICAgICAnRG9uZScgICAgICAgICAgICAgICAgICAvLyBidXR0b25OYW1lCisJCSAgICApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmVlcCB0aHJlZSB0aW1lcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBwbGF5QmVlcCgpIHsKKyAgICAgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uYmVlcCgzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZpYnJhdGUgZm9yIDIgc2Vjb25kcworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiB2aWJyYXRlKCkgeworICAgICAgICAgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi52aWJyYXRlKDIwMDApOworICAgICAgICB9CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPHA+PGEgaHJlZj0iIyIgb25jbGljaz0ic2hvd0FsZXJ0KCk7IHJldHVybiBmYWxzZTsiPlNob3cgQWxlcnQ8L2E+PC9wPgorICAgICAgICA8cD48YSBocmVmPSIjIiBvbmNsaWNrPSJwbGF5QmVlcCgpOyByZXR1cm4gZmFsc2U7Ij5QbGF5IEJlZXA8L2E+PC9wPgorICAgICAgICA8cD48YSBocmVmPSIjIiBvbmNsaWNrPSJ2aWJyYXRlKCk7IHJldHVybiBmYWxzZTsiPlZpYnJhdGU8L2E+PC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworQW5kcm9pZCBRdWlya3MKKy0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZCBwbGF5cyB0aGUgZGVmYXVsdCAiTm90aWZpY2F0aW9uIHJpbmd0b25lIiBzcGVjaWZpZWQgdW5kZXIgdGhlICJTZXR0aW5ncy9Tb3VuZCAmIERpc3BsYXkiIHBhbmVsLgorCitpUGhvbmUgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKKy0gSWdub3JlcyB0aGUgYmVlcCBjb3VudCBhcmd1bWVudC4KKy0gVGhlcmUgaXMgbm8gbmF0aXZlIGJlZXAgQVBJIGZvciBpUGhvbmUuCisgIC0gUGhvbmVHYXAgaW1wbGVtZW50cyBiZWVwIGJ5IHBsYXlpbmcgYW4gYXVkaW8gZmlsZSB2aWEgdGhlIG1lZGlhIEFQSS4KKyAgLSBUaGUgdXNlciBtdXN0IHByb3ZpZGUgYSBmaWxlIHdpdGggdGhlIGRlc2lyZWQgYmVlcCB0b25lLgorICAtIFRoaXMgZmlsZSBtdXN0IGJlIGxlc3MgdGhhbiAzMCBzZWNvbmRzIGxvbmcsIGxvY2F0ZWQgaW4gdGhlIHd3dy8gcm9vdCwgYW5kIG11c3QgYmUgbmFtZWQgYGJlZXAud2F2YC4KKworV2luZG93cyBQaG9uZSA3IFF1aXJrcworLS0tLS0tLS0tLS0tLQorCistIFdQNyBQaG9uZUdhcCBsaWIgaW5jbHVkZXMgYSBnZW5lcmljIGJlZXAgZmlsZSB0aGF0IGlzIHVzZWQuIApkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbmZpcm0ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uY29uZmlybS5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2I4ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmNvbmZpcm0ubWQKQEAgLTAsMCArMSw5MiBAQAorbm90aWZpY2F0aW9uLmNvbmZpcm0KKz09PT09PT09PT09PT09PT09PT09CisKK1Nob3dzIGEgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBkaWFsb2cgYm94LgorCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5jb25maXJtKG1lc3NhZ2UsIGNvbmZpcm1DYWxsYmFjaywgW3RpdGxlXSwgW2J1dHRvbkxhYmVsc10pCisKKy0gX19tZXNzYWdlOl9fIERpYWxvZyBtZXNzYWdlIChgU3RyaW5nYCkKKy0gX19jb25maXJtQ2FsbGJhY2s6X18gLSBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBpbmRleCBvZiBidXR0b24gcHJlc3NlZCAoMSwgMiBvciAzKS4gKGBOdW1iZXJgKQorLSBfX3RpdGxlOl9fIERpYWxvZyB0aXRsZSAoYFN0cmluZ2ApIChPcHRpb25hbCwgRGVmYXVsdDogIkNvbmZpcm0iKQorLSBfX2J1dHRvbkxhYmVsczpfXyBDb21tYSBzZXBhcmF0ZWQgc3RyaW5nIHdpdGggYnV0dG9uIGxhYmVscyAoYFN0cmluZ2ApIChPcHRpb25hbCwgRGVmYXVsdDogIk9LLENhbmNlbCIpCisgICAgCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRnVuY3Rpb24gYG5vdGlmaWNhdGlvbi5jb25maXJtYCBkaXNwbGF5cyBhIG5hdGl2ZSBkaWFsb2cgYm94IHRoYXQgaXMgbW9yZSBjdXN0b21pemFibGUgdGhhbiB0aGUgYnJvd3NlcidzIGBjb25maXJtYCBmdW5jdGlvbi4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNS4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorLSBXaW5kb3dzIFBob25lIDcgKCBNYW5nbyApCisKK1F1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworCS8vIHByb2Nlc3MgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgcmVzdWx0CisJZnVuY3Rpb24gb25Db25maXJtKGJ1dHRvbikgeworCQlhbGVydCgnWW91IHNlbGVjdGVkIGJ1dHRvbiAnICsgYnV0dG9uKTsKKwl9CisKKyAgICAvLyBTaG93IGEgY3VzdG9tIGNvbmZpcm1hdGlvbiBkaWFsb2cKKyAgICAvLworICAgIGZ1bmN0aW9uIHNob3dDb25maXJtKCkgeworICAgICAgICBuYXZpZ2F0b3Iubm90aWZpY2F0aW9uLmNvbmZpcm0oCisJICAgICAgICAnWW91IGFyZSB0aGUgd2lubmVyIScsICAvLyBtZXNzYWdlCisJCQlvbkNvbmZpcm0sCQkJCS8vIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGluZGV4IG9mIGJ1dHRvbiBwcmVzc2VkCisJICAgICAgICAnR2FtZSBPdmVyJywgICAgICAgICAgICAvLyB0aXRsZQorCSAgICAgICAgJ1Jlc3RhcnQsRXhpdCcgICAgICAgICAgLy8gYnV0dG9uTGFiZWxzCisgICAgICAgICk7CisgICAgfQorICAgICAgICAKK0Z1bGwgRXhhbXBsZQorLS0tLS0tLS0tLS0tCisKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Tm90aWZpY2F0aW9uIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworICAgICAgICAgICAgLy8gRW1wdHkKKyAgICAgICAgfQorICAgIAorCQkvLyBwcm9jZXNzIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIHJlc3VsdAorCQlmdW5jdGlvbiBvbkNvbmZpcm0oYnV0dG9uKSB7CisJCQlhbGVydCgnWW91IHNlbGVjdGVkIGJ1dHRvbiAnICsgYnV0dG9uKTsKKwkJfQorCisgICAgICAgIC8vIFNob3cgYSBjdXN0b20gY29uZmlybWF0aW9uIGRpYWxvZworICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBzaG93Q29uZmlybSgpIHsKKyAgICAgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24uY29uZmlybSgKKwkJICAgICAgICAnWW91IGFyZSB0aGUgd2lubmVyIScsICAvLyBtZXNzYWdlCisJCQkJb25Db25maXJtLAkJCQkvLyBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCBpbmRleCBvZiBidXR0b24gcHJlc3NlZAorCQkgICAgICAgICdHYW1lIE92ZXInLCAgICAgICAgICAgIC8vIHRpdGxlCisJCSAgICAgICAgJ1Jlc3RhcnQsRXhpdCcgICAgICAgICAgLy8gYnV0dG9uTGFiZWxzCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InNob3dDb25maXJtKCk7IHJldHVybiBmYWxzZTsiPlNob3cgQ29uZmlybTwvYT48L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCitXaW5kb3dzIFBob25lIDcgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKKy0gSWdub3JlcyBidXR0b24gbmFtZXMsIGFsd2F5cyAnT0t8Q2FuY2VsJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTdiN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLm1kCkBAIC0wLDAgKzEsMTIgQEAKK05vdGlmaWNhdGlvbgorPT09PT09PT09PT09CisKKz4gVmlzdWFsLCBhdWRpYmxlLCBhbmQgdGFjdGlsZSBkZXZpY2Ugbm90aWZpY2F0aW9ucy4KKworTWV0aG9kcworLS0tLS0tLQorCistIG5vdGlmaWNhdGlvbi5hbGVydAorLSBub3RpZmljYXRpb24uY29uZmlybQorLSBub3RpZmljYXRpb24uYmVlcAorLSBub3RpZmljYXRpb24udmlicmF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi52aWJyYXRlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnZpYnJhdGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1NmQzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi52aWJyYXRlLm1kCkBAIC0wLDAgKzEsODQgQEAKK25vdGlmaWNhdGlvbi52aWJyYXRlCis9PT09PT09PT09PT09PT09PT09PQorCitWaWJyYXRlcyB0aGUgZGV2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLgorCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi52aWJyYXRlKG1pbGxpc2Vjb25kcykKKworLSBfX3RpbWU6X18gTWlsbGlzZWNvbmRzIHRvIHZpYnJhdGUgdGhlIGRldmljZS4gMTAwMCBtaWxsaXNlY29uZHMgZXF1YWxzIDEgc2Vjb25kIChgTnVtYmVyYCkKKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSAoT1MgNC42KQorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA1LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCistIFdpbmRvd3MgUGhvbmUgNworCitRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICAvLyBWaWJyYXRlIGZvciAyLjUgc2Vjb25kcworICAgIC8vCisgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi52aWJyYXRlKDI1MDApOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorICAgIAorICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Ob3RpZmljYXRpb24gRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisgICAgICAgICAgICAvLyBFbXB0eQorICAgICAgICB9CisgICAgCisgICAgICAgIC8vIFNob3cgYSBjdXN0b20gYWxlcnQKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gc2hvd0FsZXJ0KCkgeworCQkgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi5hbGVydCgKKwkJICAgICAgICAnWW91IGFyZSB0aGUgd2lubmVyIScsICAvLyBtZXNzYWdlCisJCSAgICAgICAgJ0dhbWUgT3ZlcicsICAgICAgICAgICAgLy8gdGl0bGUKKwkJICAgICAgICAnRG9uZScgICAgICAgICAgICAgICAgICAvLyBidXR0b25OYW1lCisJCSAgICApOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIEJlZXAgdGhyZWUgdGltZXMKKyAgICAgICAgLy8KKyAgICAgICAgZnVuY3Rpb24gcGxheUJlZXAoKSB7CisgICAgICAgICAgICBuYXZpZ2F0b3Iubm90aWZpY2F0aW9uLmJlZXAoMyk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gVmlicmF0ZSBmb3IgMiBzZWNvbmRzCisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIHZpYnJhdGUoKSB7CisgICAgICAgICAgICBuYXZpZ2F0b3Iubm90aWZpY2F0aW9uLnZpYnJhdGUoMjAwMCk7CisgICAgICAgIH0KKworICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8cD48YSBocmVmPSIjIiBvbmNsaWNrPSJzaG93QWxlcnQoKTsgcmV0dXJuIGZhbHNlOyI+U2hvdyBBbGVydDwvYT48L3A+CisgICAgICAgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InBsYXlCZWVwKCk7IHJldHVybiBmYWxzZTsiPlBsYXkgQmVlcDwvYT48L3A+CisgICAgICAgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InZpYnJhdGUoKTsgcmV0dXJuIGZhbHNlOyI+VmlicmF0ZTwvYT48L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCitpUGhvbmUgUXVpcmtzCistLS0tLS0tLS0tLS0tCisKKy0gX190aW1lOl9fIElnbm9yZXMgdGhlIHRpbWUgYW5kIHZpYnJhdGVzIGZvciBhIHByZS1zZXQgYW1vdW50IG9mIHRpbWUuCisKKyAgICAgICAgbmF2aWdhdG9yLm5vdGlmaWNhdGlvbi52aWJyYXRlKCk7CisgICAgICAgIG5hdmlnYXRvci5ub3RpZmljYXRpb24udmlicmF0ZSgyNTAwKTsgICAvLyAyNTAwIGlzIGlnbm9yZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvZGF0YWJhc2UvZGF0YWJhc2UubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvZGF0YWJhc2UvZGF0YWJhc2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1YTQzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9kYXRhYmFzZS9kYXRhYmFzZS5tZApAQCAtMCwwICsxLDEwNCBAQAorRGF0YWJhc2UKKz09PT09PT0KKworQ29udGFpbnMgbWV0aG9kcyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIG1hbmlwdWxhdGUgdGhlIERhdGFiYXNlCisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBfX3RyYW5zYWN0aW9uX186IFJ1bnMgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbi4gCistIF9fY2hhbmdlVmVyc2lvbl9fOiBtZXRob2QgYWxsb3dzIHNjcmlwdHMgdG8gYXRvbWljYWxseSB2ZXJpZnkgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBjaGFuZ2UgaXQgYXQgdGhlIHNhbWUgdGltZSBhcyBkb2luZyBhIHNjaGVtYSB1cGRhdGUuIAorCitEZXRhaWxzCistLS0tLS0tCisKK0EgRGF0YWJhc2Ugb2JqZWN0IGlzIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIGB3aW5kb3cub3BlbkRhdGFiYXNlKClgLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA2LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCisKK1RyYW5zYWN0aW9uIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCWZ1bmN0aW9uIHBvcHVsYXRlREIodHgpIHsKKwkJIHR4LmV4ZWN1dGVTcWwoJ0RST1AgVEFCTEUgSUYgRVhJU1RTIERFTU8nKTsKKwkJIHR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIERFTU8gKGlkIHVuaXF1ZSwgZGF0YSknKTsKKwkJIHR4LmV4ZWN1dGVTcWwoJ0lOU0VSVCBJTlRPIERFTU8gKGlkLCBkYXRhKSBWQUxVRVMgKDEsICJGaXJzdCByb3ciKScpOworCQkgdHguZXhlY3V0ZVNxbCgnSU5TRVJUIElOVE8gREVNTyAoaWQsIGRhdGEpIFZBTFVFUyAoMiwgIlNlY29uZCByb3ciKScpOworCX0KKwkKKwlmdW5jdGlvbiBlcnJvckNCKGVycikgeworCQlhbGVydCgiRXJyb3IgcHJvY2Vzc2luZyBTUUw6ICIrZXJyLmNvZGUpOworCX0KKwkKKwlmdW5jdGlvbiBzdWNjZXNzQ0IoKSB7CisJCWFsZXJ0KCJzdWNjZXNzISIpOworCX0KKwkKKwl2YXIgZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKCJEYXRhYmFzZSIsICIxLjAiLCAiUGhvbmVHYXAgRGVtbyIsIDIwMDAwMCk7CisJZGIudHJhbnNhY3Rpb24ocG9wdWxhdGVEQiwgZXJyb3JDQiwgc3VjY2Vzc0NCKTsKKworQ2hhbmdlIFZlcnNpb24gUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCWRiLmNoYW5nZVZlcnNpb24oIjEuMCIsICIxLjEiKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCQkJZGIudHJhbnNhY3Rpb24ocG9wdWxhdGVEQiwgZXJyb3JDQiwgc3VjY2Vzc0NCKTsKKyAgICAgICAgfQorCQkKKwkJLy8gUG9wdWxhdGUgdGhlIGRhdGFiYXNlIAorCQkvLworCQlmdW5jdGlvbiBwb3B1bGF0ZURCKHR4KSB7CisJCQkgdHguZXhlY3V0ZVNxbCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgREVNTycpOworCQkJIHR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIERFTU8gKGlkIHVuaXF1ZSwgZGF0YSknKTsKKwkJCSB0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgxLCAiRmlyc3Qgcm93IiknKTsKKwkJCSB0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgyLCAiU2Vjb25kIHJvdyIpJyk7CisJCX0KKwkJCisJCS8vIFRyYW5zYWN0aW9uIGVycm9yIGNhbGxiYWNrCisJCS8vCisJCWZ1bmN0aW9uIGVycm9yQ0IodHgsIGVycikgeworCQkJYWxlcnQoIkVycm9yIHByb2Nlc3NpbmcgU1FMOiAiK2Vycik7CisJCX0KKwkJCisJCS8vIFRyYW5zYWN0aW9uIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJLy8KKwkJZnVuY3Rpb24gc3VjY2Vzc0NCKCkgeworCQkJYWxlcnQoInN1Y2Nlc3MhIik7CisJCX0KKwkKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5EYXRhYmFzZTwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKK0FuZHJvaWQgMS5YIFF1aXJrcworLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gX19jaGFuZ2VWZXJzaW9uOl9fIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0IGJ5IEFuZHJvaWQgMS5YIGRldmljZXMuCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvbG9jYWxzdG9yYWdlL2xvY2Fsc3RvcmFnZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9sb2NhbHN0b3JhZ2UvbG9jYWxzdG9yYWdlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2ExODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvbG9jYWxzdG9yYWdlL2xvY2Fsc3RvcmFnZS5tZApAQCAtMCwwICsxLDkxIEBACitsb2NhbFN0b3JhZ2UKKz09PT09PT09PT09PT09PQorCitQcm92aWRlcyBhY2Nlc3MgdG8gYSBXM0MgU3RvcmFnZSBpbnRlcmZhY2UgKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnN0b3JhZ2UvI3RoZS1sb2NhbHN0b3JhZ2UtYXR0cmlidXRlKQorCisgICAgdmFyIHN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlOworCitNZXRob2RzCistLS0tLS0tCisKKy0gX19rZXlfXzogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUga2V5IGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQuIAorLSBfX2dldEl0ZW1fXzogUmV0dXJucyB0aGUgaXRlbSBpZGVudGlmaWVkIGJ5IGl0J3Mga2V5LgorLSBfX3NldEl0ZW1fXzogU2F2ZXMgYW5kIGl0ZW0gYXQgdGhlIGtleSBwcm92aWRlZC4KKy0gX19yZW1vdmVJdGVtX186IFJlbW92ZXMgdGhlIGl0ZW0gaWRlbnRpZmllZCBieSBpdCdzIGtleS4KKy0gX19jbGVhcl9fOiBSZW1vdmVzIGFsbCBvZiB0aGUga2V5IHZhbHVlIHBhaXJzLgorCitEZXRhaWxzCistLS0tLS0tLS0tLQorCitsb2NhbFN0b3JhZ2UgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGEgVzNDIFN0b3JhZ2UgaW50ZXJmYWNlLiAgSXQgYWxsb3dzIG9uZSB0byBzYXZlIGRhdGEgYXMga2V5LXZhbHVlIHBhaXJzLgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA2LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCisKK0tleSBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICB2YXIga2V5TmFtZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2Uua2V5KDApOworCitTZXQgSXRlbSBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKyAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oImtleSIsICJ2YWx1ZSIpOworCitHZXQgSXRlbSBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tCisKKwl2YXIgdmFsdWUgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oImtleSIpOworCS8vIHZhbHVlIGlzIG5vdyBlcXVhbCB0byAidmFsdWUiCisKK1JlbW92ZSBJdGVtIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworCXdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgia2V5Iik7CisKK0NsZWFyIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0KKworCXdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJrZXkiLCAidmFsdWUiKTsKKwkJCXZhciBrZXluYW1lID0gd2luZG93LmxvY2FsU3RvcmFnZS5rZXkoaSk7CisJCQkvLyBrZXluYW1lIGlzIG5vdyBlcXVhbCB0byAia2V5IgorCQkJdmFyIHZhbHVlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJrZXkiKTsKKwkJCS8vIHZhbHVlIGlzIG5vdyBlcXVhbCB0byAidmFsdWUiCisJCQl3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImtleSIpOworCQkJd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJrZXkyIiwgInZhbHVlMiIpOworCQkJd2luZG93LmxvY2FsU3RvcmFnZS5jbGVhcigpOworCQkJLy8gbG9jYWxTdG9yYWdlIGlzIG5vdyBlbXB0eQorICAgICAgICB9CisgICAgCisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5sb2NhbFN0b3JhZ2U8L3A+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvZGlzcGxheV9uYW1lLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvZGlzcGxheV9uYW1lLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvcGFyYW1ldGVycy9kaXNwbGF5X25hbWUubWQKQEAgLTAsMCArMSw0IEBACitkaXNwbGF5X25hbWUKKz09PT09PT09PT09PT09PT09PQorCitUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBkYXRhYmFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2UvcGFyYW1ldGVycy9uYW1lLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvbmFtZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWU1YWZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvbmFtZS5tZApAQCAtMCwwICsxLDQgQEAKK25hbWUKKz09PT09PT09PT09PQorCitUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvc2l6ZS5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL3NpemUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNjZhYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL3NpemUubWQKQEAgLTAsMCArMSw0IEBACitzaXplCis9PT09PT09PT09PT09PQorCitUaGUgc2l6ZSBvZiB0aGUgZGF0YWJhc2UgaW4gYnl0ZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3BhcmFtZXRlcnMvdmVyc2lvbi5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL3ZlcnNpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2YzVlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9wYXJhbWV0ZXJzL3ZlcnNpb24ubWQKQEAgLTAsMCArMSw0IEBACit2ZXJzaW9uCis9PT09PT09PT09PT09CisKK1RoZSB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZS4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWxlcnJvci9zcWxlcnJvci5tZCBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWxlcnJvci9zcWxlcnJvci5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjEyMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3NxbGVycm9yL3NxbGVycm9yLm1kCkBAIC0wLDAgKzEsMjggQEAKK1NRTEVycm9yCis9PT09PT09PQorCitBIGBTUUxFcnJvcmAgb2JqZWN0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKworUHJvcGVydGllcworLS0tLS0tLS0tLQorCistIF9fY29kZTpfXyBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgY29kZXMgbGlzdGVkIGJlbG93LgorLSBfX21lc3NhZ2U6X18gQSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCisKK0NvbnN0YW50cworLS0tLS0tLS0tCisKKy0gYFNRTEVycm9yLlVOS05PV05fRVJSYAorLSBgU1FMRXJyb3IuREFUQUJBU0VfRVJSYAorLSBgU1FMRXJyb3IuVkVSU0lPTl9FUlJgCistIGBTUUxFcnJvci5UT09fTEFSR0VfRVJSYAorLSBgU1FMRXJyb3IuUVVPVEFfRVJSYAorLSBgU1FMRXJyb3IuU1lOVEFYX0VSUmAKKy0gYFNRTEVycm9yLkNPTlNUUkFJTlRfRVJSYAorLSBgU1FMRXJyb3IuVElNRU9VVF9FUlJgCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgYFNRTEVycm9yYCBvYmplY3QgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoZW4gbWFuaXB1bGF0aW5nIGEgZGF0YWJhc2UuCisKZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWxyZXN1bHRzZXQvc3FscmVzdWx0c2V0Lm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3NxbHJlc3VsdHNldC9zcWxyZXN1bHRzZXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNzBiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWxyZXN1bHRzZXQvc3FscmVzdWx0c2V0Lm1kCkBAIC0wLDAgKzEsMTE1IEBACitTUUxSZXN1bHRTZXQKKz09PT09PT0KKworV2hlbiB0aGUgZXhlY3V0ZVNxbCBtZXRob2Qgb2YgYSBTUUxUcmFuc2FjdGlvbiBpcyBjYWxsZWQgaXQgd2lsbCBpbnZva2UgaXQncyBjYWxsYmFjayB3aXRoIGEgU1FMUmVzdWx0U2V0LgorCitQcm9wZXJ0aWVzCistLS0tLS0tCisKKy0gX19pbnNlcnRJZF9fOiB0aGUgcm93IElEIG9mIHRoZSByb3cgdGhhdCB0aGUgU1FMUmVzdWx0U2V0IG9iamVjdCdzIFNRTCBzdGF0ZW1lbnQgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UKKy0gX19yb3dBZmZlY3RlZF9fOiB0aGUgbnVtYmVyIG9mIHJvd3MgdGhhdCB3ZXJlIGNoYW5nZWQgYnkgdGhlIFNRTCBzdGF0ZW1lbnQuICBJZiB0aGUgc3RhdGVtZW50IGRpZCBub3QgYWZmZWN0IGFueSByb3dzIHRoZW4gaXQgaXMgc2V0IHRvIDAuIAorLSBfX3Jvd3NfXzogYSBTUUxSZXN1bHRTZXRSb3dMaXN0IHJlcHJlc2VudGluZyB0aGUgcm93cyByZXR1cm5lZC4gIElmIG5vIHJvd3MgYXJlIHJldHVybmVkIHRoZSBvYmplY3Qgd2lsbCBiZSBlbXB0eS4KKworRGV0YWlscworLS0tLS0tLQorCitXaGVuIHlvdSBjYWxsIHRoZSBTUUxUcmFuc2FjdGlvbiBleGVjdXRlU3FsIG1ldGhvZCBpdCdzIGNhbGxiYWNrIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIFNRTFJlc3VsdFNldCBvYmplY3QuICBUaGUgcmVzdWx0IG9iamVjdCBoYXMgdGhyZWUgcHJvcGVydGllcy4gIFRoZSBmaXJzdCBpcyB0aGUgYGluc2VydElkYCB3aGljaCB3aWxsIHJldHVybiB0aGUgcm93IG51bWJlciBvZiBhIHN1Y2Nlc3MgU1FMIGluc2VydCBzdGF0ZW1lbnQuICBJZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBub3QgYW4gaW5zZXJ0IHRoZW4gdGhlIGBpbnNlcnRJZGAgaXMgbm90IHNldC4gIFRoZSBgcm93QWZmZWN0ZWRgIGlzIGFsd2F5cyAwIGZvciBhIFNRTCBzZWxlY3Qgc3RhdGVtZW50LiAgRm9yIGluc2VydCBvciB1cGRhdGUgc3RhdGVtZW50cyBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZC4gIFRoZSBmaW5hbCBwcm9wZXJ0eSBpcyBvZiB0eXBlIFNRTFJlc3VsdFNldExpc3QgYW5kIGl0IGNvbnRhaW5zIHRoZSBkYXRhIHJldHVybmVkIGZyb20gYSBTUUwgc2VsZWN0IHN0YXRlbWVudC4KKworU3VwcG9ydGVkIFBsYXRmb3JtcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEFuZHJvaWQKKy0gQmxhY2tCZXJyeSBXZWJXb3JrcyAoT1MgNi4wIGFuZCBoaWdoZXIpCistIGlQaG9uZQorCitFeGVjdXRlIFNRTCBRdWljayBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0KKworCWZ1bmN0aW9uIHF1ZXJ5REIodHgpIHsKKwkJdHguZXhlY3V0ZVNxbCgnU0VMRUNUICogRlJPTSBERU1PJywgW10sIHF1ZXJ5U3VjY2VzcywgZXJyb3JDQik7CisJfQorCisJZnVuY3Rpb24gcXVlcnlTdWNjZXNzKHR4LCByZXN1bHRzKSB7CisJCS8vIHRoaXMgd2lsbCBiZSBlbXB0eSBzaW5jZSBubyByb3dzIHdlcmUgaW5zZXJ0ZWQuCisJCWNvbnNvbGUubG9nKCJJbnNlcnQgSUQgPSAiICsgcmVzdWx0cy5pbnNlcnRJZCk7CisJCS8vIHRoaXMgd2lsbCBiZSAwIHNpbmNlIGl0IGlzIGEgc2VsZWN0IHN0YXRlbWVudAorCQljb25zb2xlLmxvZygiUm93cyBBZmZlY3RlZCA9ICIgKyByZXN1bHRzLnJvd0FmZmVjdGVkKTsKKwkJLy8gdGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkIGJ5IHRoZSBzZWxlY3Qgc3RhdGVtZW50CisJCWNvbnNvbGUubG9nKCJJbnNlcnQgSUQgPSAiICsgcmVzdWx0cy5yb3dzLmxlbmd0aCk7CisJfQorCQorCWZ1bmN0aW9uIGVycm9yQ0IoZXJyKSB7CisJCWFsZXJ0KCJFcnJvciBwcm9jZXNzaW5nIFNRTDogIitlcnIuY29kZSk7CisJfQorCQorCXZhciBkYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UoIkRhdGFiYXNlIiwgIjEuMCIsICJQaG9uZUdhcCBEZW1vIiwgMjAwMDAwKTsKKwlkYi50cmFuc2FjdGlvbihxdWVyeURCLCBlcnJvckNCKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworCQkvLyBQb3B1bGF0ZSB0aGUgZGF0YWJhc2UgCisJCS8vCisJCWZ1bmN0aW9uIHBvcHVsYXRlREIodHgpIHsKKwkJCXR4LmV4ZWN1dGVTcWwoJ0RST1AgVEFCTEUgSUYgRVhJU1RTIERFTU8nKTsKKwkJCXR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIERFTU8gKGlkIHVuaXF1ZSwgZGF0YSknKTsKKwkJCXR4LmV4ZWN1dGVTcWwoJ0lOU0VSVCBJTlRPIERFTU8gKGlkLCBkYXRhKSBWQUxVRVMgKDEsICJGaXJzdCByb3ciKScpOworCQkJdHguZXhlY3V0ZVNxbCgnSU5TRVJUIElOVE8gREVNTyAoaWQsIGRhdGEpIFZBTFVFUyAoMiwgIlNlY29uZCByb3ciKScpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIGRhdGFiYXNlCisJCS8vCisJCWZ1bmN0aW9uIHF1ZXJ5REIodHgpIHsKKwkJCXR4LmV4ZWN1dGVTcWwoJ1NFTEVDVCAqIEZST00gREVNTycsIFtdLCBxdWVyeVN1Y2Nlc3MsIGVycm9yQ0IpOworCQl9CisKKwkJLy8gUXVlcnkgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJLy8KKwkJZnVuY3Rpb24gcXVlcnlTdWNjZXNzKHR4LCByZXN1bHRzKSB7CisJCQkvLyB0aGlzIHdpbGwgYmUgZW1wdHkgc2luY2Ugbm8gcm93cyB3ZXJlIGluc2VydGVkLgorCQkJY29uc29sZS5sb2coIkluc2VydCBJRCA9ICIgKyByZXN1bHRzLmluc2VydElkKTsKKwkJCS8vIHRoaXMgd2lsbCBiZSAwIHNpbmNlIGl0IGlzIGEgc2VsZWN0IHN0YXRlbWVudAorCQkJY29uc29sZS5sb2coIlJvd3MgQWZmZWN0ZWQgPSAiICsgcmVzdWx0cy5yb3dBZmZlY3RlZCk7CisJCQkvLyB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNlbGVjdCBzdGF0ZW1lbnQKKwkJCWNvbnNvbGUubG9nKCJJbnNlcnQgSUQgPSAiICsgcmVzdWx0cy5yb3dzLmxlbmd0aCk7CisJCX0KKworCQkvLyBUcmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjaworCQkvLworCQlmdW5jdGlvbiBlcnJvckNCKGVycikgeworCQkJY29uc29sZS5sb2coIkVycm9yIHByb2Nlc3NpbmcgU1FMOiAiK2Vyci5jb2RlKTsKKwkJfQorCisJCS8vIFRyYW5zYWN0aW9uIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJLy8KKwkJZnVuY3Rpb24gc3VjY2Vzc0NCKCkgeworCQkJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCQkJZGIudHJhbnNhY3Rpb24ocXVlcnlEQiwgZXJyb3JDQik7CisJCX0KKworCQkvLyBQaG9uZUdhcCBpcyByZWFkeQorCQkvLworCQlmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCQkJZGIudHJhbnNhY3Rpb24ocG9wdWxhdGVEQiwgZXJyb3JDQiwgc3VjY2Vzc0NCKTsKKwkJfQorCQorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPkRhdGFiYXNlPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWxyZXN1bHRzZXRsaXN0L3NxbHJlc3VsdHNldGxpc3QubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3FscmVzdWx0c2V0bGlzdC9zcWxyZXN1bHRzZXRsaXN0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjRmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3FscmVzdWx0c2V0bGlzdC9zcWxyZXN1bHRzZXRsaXN0Lm1kCkBAIC0wLDAgKzEsMTE2IEBACitTUUxSZXN1bHRTZXRMaXN0Cis9PT09PT09CisKK09uZSBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgU1FMUmVzdWx0U2V0IGNvbnRhaW5pbmcgdGhlIHJvd3MgcmV0dXJuZWQgZnJvbSBhIFNRTCBxdWVyeS4KKworUHJvcGVydGllcworLS0tLS0tLQorCistIF9fbGVuZ3RoX186IHRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCBieSB0aGUgU1FMIHF1ZXJ5CisKK01ldGhvZHMKKy0tLS0tLS0KKworLSBfX2l0ZW1fXzogcmV0dXJucyB0aGUgcm93IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggcmVwcmVzZW50ZWQgYnkgYSBKYXZhU2NyaXB0IG9iamVjdC4KKworRGV0YWlscworLS0tLS0tLQorCitUaGUgU1FMUmVzdWx0U2V0TGlzdCBjb250YWlucyB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIGEgU1FMIHNlbGVjdCBzdGF0ZW1lbnQuICBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgbGVuZ3RoIHByb3BlcnR5IGxldHRpbmcgeW91IGtub3cgaG93IG1hbnkgcm93cyB0aGUgc2VsZWN0IHN0YXRlbWVudCBoYXMgYmVlbiByZXR1cm5lZC4gIFRvIGdldCBhIHJvdyBvZiBkYXRhIHlvdSB3b3VsZCBjYWxsIHRoZSBgaXRlbWAgbWV0aG9kIHNwZWNpZmluZyBhbiBpbmRleC4gIFRoZSBpdGVtIG1ldGhvZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBPYmplY3Qgd2hvJ3MgcHJvcGVydGllcyBhcmUgdGhlIGNvbHVtbnMgb2YgdGhlIGRhdGFiYXNlIHRoZSBzZWxlY3Qgc3RhdGVtZW50IHdhcyBleGVjdXRlZCBhZ2FpbnN0LgorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA2LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCisKK0V4ZWN1dGUgU1FMIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gcXVlcnlEQih0eCkgeworCQl0eC5leGVjdXRlU3FsKCdTRUxFQ1QgKiBGUk9NIERFTU8nLCBbXSwgcXVlcnlTdWNjZXNzLCBlcnJvckNCKTsKKwl9CisKKwlmdW5jdGlvbiBxdWVyeVN1Y2Nlc3ModHgsIHJlc3VsdHMpIHsKKwkJdmFyIGxlbiA9IHJlc3VsdHMucm93cy5sZW5ndGg7CisJoKCgCWNvbnNvbGUubG9nKCJERU1PIHRhYmxlOiAiICsgbGVuICsgIiByb3dzIGZvdW5kLiIpOworCaCgoAlmb3IgKHZhciBpPTA7IGk8bGVuOyBpKyspeworCaCgoKAJY29uc29sZS5sb2coIlJvdyA9ICIgKyBpICsgIiBJRCA9ICIgKyByZXN1bHRzLnJvd3MuaXRlbShpKS5pZCArICIgRGF0YSA9ICAiICsgcmVzdWx0cy5yb3dzLml0ZW0oaSkuZGF0YSk7CisJCX0KKwl9CisJCisJZnVuY3Rpb24gZXJyb3JDQihlcnIpIHsKKwkJYWxlcnQoIkVycm9yIHByb2Nlc3NpbmcgU1FMOiAiK2Vyci5jb2RlKTsKKwl9CisJCisJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCWRiLnRyYW5zYWN0aW9uKHF1ZXJ5REIsIGVycm9yQ0IpOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisJCS8vIFBvcHVsYXRlIHRoZSBkYXRhYmFzZSAKKwkJLy8KKwkJZnVuY3Rpb24gcG9wdWxhdGVEQih0eCkgeworCQkJdHguZXhlY3V0ZVNxbCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgREVNTycpOworCQkJdHguZXhlY3V0ZVNxbCgnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgREVNTyAoaWQgdW5pcXVlLCBkYXRhKScpOworCQkJdHguZXhlY3V0ZVNxbCgnSU5TRVJUIElOVE8gREVNTyAoaWQsIGRhdGEpIFZBTFVFUyAoMSwgIkZpcnN0IHJvdyIpJyk7CisJCQl0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgyLCAiU2Vjb25kIHJvdyIpJyk7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgZGF0YWJhc2UKKwkJLy8KKwkJZnVuY3Rpb24gcXVlcnlEQih0eCkgeworCQkJdHguZXhlY3V0ZVNxbCgnU0VMRUNUICogRlJPTSBERU1PJywgW10sIHF1ZXJ5U3VjY2VzcywgZXJyb3JDQik7CisJCX0KKworCQkvLyBRdWVyeSB0aGUgc3VjY2VzcyBjYWxsYmFjaworCQkvLworCQlmdW5jdGlvbiBxdWVyeVN1Y2Nlc3ModHgsIHJlc3VsdHMpIHsKKwkJCXZhciBsZW4gPSByZXN1bHRzLnJvd3MubGVuZ3RoOworCQkJY29uc29sZS5sb2coIkRFTU8gdGFibGU6ICIgKyBsZW4gKyAiIHJvd3MgZm91bmQuIik7CisJCQlmb3IgKHZhciBpPTA7IGk8bGVuOyBpKyspeworCQkJCWNvbnNvbGUubG9nKCJSb3cgPSAiICsgaSArICIgSUQgPSAiICsgcmVzdWx0cy5yb3dzLml0ZW0oaSkuaWQgKyAiIERhdGEgPSAgIiArIHJlc3VsdHMucm93cy5pdGVtKGkpLmRhdGEpOworCQkJfQorCQl9CisKKwkJLy8gVHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sKKwkJLy8KKwkJZnVuY3Rpb24gZXJyb3JDQihlcnIpIHsKKwkJCWNvbnNvbGUubG9nKCJFcnJvciBwcm9jZXNzaW5nIFNRTDogIitlcnIuY29kZSk7CisJCX0KKworCQkvLyBUcmFuc2FjdGlvbiBzdWNjZXNzIGNhbGxiYWNrCisJCS8vCisJCWZ1bmN0aW9uIHN1Y2Nlc3NDQigpIHsKKwkJCXZhciBkYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UoIkRhdGFiYXNlIiwgIjEuMCIsICJQaG9uZUdhcCBEZW1vIiwgMjAwMDAwKTsKKwkJCWRiLnRyYW5zYWN0aW9uKHF1ZXJ5REIsIGVycm9yQ0IpOworCQl9CisKKwkJLy8gUGhvbmVHYXAgaXMgcmVhZHkKKwkJLy8KKwkJZnVuY3Rpb24gb25EZXZpY2VSZWFkeSgpIHsKKwkJCXZhciBkYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UoIkRhdGFiYXNlIiwgIjEuMCIsICJQaG9uZUdhcCBEZW1vIiwgMjAwMDAwKTsKKwkJCWRiLnRyYW5zYWN0aW9uKHBvcHVsYXRlREIsIGVycm9yQ0IsIHN1Y2Nlc3NDQik7CisJCX0KKwkKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgPGgxPkV4YW1wbGU8L2gxPgorICAgICAgICA8cD5EYXRhYmFzZTwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3FsdHJhbnNhY3Rpb24vc3FsdHJhbnNhY3Rpb24ubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3FsdHJhbnNhY3Rpb24vc3FsdHJhbnNhY3Rpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MDNkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zcWx0cmFuc2FjdGlvbi9zcWx0cmFuc2FjdGlvbi5tZApAQCAtMCwwICsxLDkzIEBACitTUUxUcmFuc2FjdGlvbgorPT09PT09PQorCitDb250YWlucyBtZXRob2RzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gZXhlY3V0ZSBTUUwgc3RhdGVtZW50cyBhZ2FpbnN0IHRoZSBEYXRhYmFzZS4KKworTWV0aG9kcworLS0tLS0tLQorCistIF9fZXhlY3V0ZVNxbF9fOiBleGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQKKworRGV0YWlscworLS0tLS0tLQorCitXaGVuIHlvdSBjYWxsIGEgRGF0YWJhc2Ugb2JqZWN0cyB0cmFuc2FjdGlvbiBtZXRob2QgaXQncyBjYWxsYmFjayBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBTUUxUcmFuc2FjdGlvbiBvYmplY3QuICBUaGUgdXNlciBjYW4gYnVpbGQgdXAgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBieSBjYWxsaW5nIHRoZSBleGVjdXRlU3FsIG1ldGhvZCBtdWx0aXBsZSB0aW1lcy4gIAorCitTdXBwb3J0ZWQgUGxhdGZvcm1zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQW5kcm9pZAorLSBCbGFja0JlcnJ5IFdlYldvcmtzIChPUyA2LjAgYW5kIGhpZ2hlcikKKy0gaVBob25lCisKK0V4ZWN1dGUgU1FMIFF1aWNrIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisJZnVuY3Rpb24gcG9wdWxhdGVEQih0eCkgeworCQkgdHguZXhlY3V0ZVNxbCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgREVNTycpOworCQkgdHguZXhlY3V0ZVNxbCgnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgREVNTyAoaWQgdW5pcXVlLCBkYXRhKScpOworCQkgdHguZXhlY3V0ZVNxbCgnSU5TRVJUIElOVE8gREVNTyAoaWQsIGRhdGEpIFZBTFVFUyAoMSwgIkZpcnN0IHJvdyIpJyk7CisJCSB0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgyLCAiU2Vjb25kIHJvdyIpJyk7CisJfQorCQorCWZ1bmN0aW9uIGVycm9yQ0IoZXJyKSB7CisJCWFsZXJ0KCJFcnJvciBwcm9jZXNzaW5nIFNRTDogIitlcnIpOworCX0KKwkKKwlmdW5jdGlvbiBzdWNjZXNzQ0IoKSB7CisJCWFsZXJ0KCJzdWNjZXNzISIpOworCX0KKwkKKwl2YXIgZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKCJEYXRhYmFzZSIsICIxLjAiLCAiUGhvbmVHYXAgRGVtbyIsIDIwMDAwMCk7CisJZGIudHJhbnNhY3Rpb24ocG9wdWxhdGVEQiwgZXJyb3JDQiwgc3VjY2Vzc0NCKTsKKworRnVsbCBFeGFtcGxlCistLS0tLS0tLS0tLS0KKworICAgIDwhRE9DVFlQRSBodG1sPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Db250YWN0IEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJwaG9uZWdhcC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisKKyAgICAgICAgLy8gV2FpdCBmb3IgUGhvbmVHYXAgdG8gbG9hZAorICAgICAgICAvLworICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkZXZpY2VyZWFkeSIsIG9uRGV2aWNlUmVhZHksIGZhbHNlKTsKKworICAgICAgICAvLyBQaG9uZUdhcCBpcyByZWFkeQorICAgICAgICAvLworICAgICAgICBmdW5jdGlvbiBvbkRldmljZVJlYWR5KCkgeworCQkJdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgiRGF0YWJhc2UiLCAiMS4wIiwgIlBob25lR2FwIERlbW8iLCAyMDAwMDApOworCQkJZGIudHJhbnNhY3Rpb24ocG9wdWxhdGVEQiwgZXJyb3JDQiwgc3VjY2Vzc0NCKTsKKyAgICAgICAgfQorCQkKKwkJLy8gUG9wdWxhdGUgdGhlIGRhdGFiYXNlIAorCQkvLworCQlmdW5jdGlvbiBwb3B1bGF0ZURCKHR4KSB7CisJCQkgdHguZXhlY3V0ZVNxbCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgREVNTycpOworCQkJIHR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIERFTU8gKGlkIHVuaXF1ZSwgZGF0YSknKTsKKwkJCSB0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgxLCAiRmlyc3Qgcm93IiknKTsKKwkJCSB0eC5leGVjdXRlU3FsKCdJTlNFUlQgSU5UTyBERU1PIChpZCwgZGF0YSkgVkFMVUVTICgyLCAiU2Vjb25kIHJvdyIpJyk7CisJCX0KKwkJCisJCS8vIFRyYW5zYWN0aW9uIGVycm9yIGNhbGxiYWNrCisJCS8vCisJCWZ1bmN0aW9uIGVycm9yQ0IoZXJyKSB7CisJCQlhbGVydCgiRXJyb3IgcHJvY2Vzc2luZyBTUUw6ICIrZXJyKTsKKwkJfQorCQkKKwkJLy8gVHJhbnNhY3Rpb24gc3VjY2VzcyBjYWxsYmFjaworCQkvLworCQlmdW5jdGlvbiBzdWNjZXNzQ0IoKSB7CisJCQlhbGVydCgic3VjY2VzcyEiKTsKKwkJfQorCQorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+RXhhbXBsZTwvaDE+CisgICAgICAgIDxwPlNRTFRyYW5zYWN0aW9uPC9wPgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zdG9yYWdlLm1kIGIvZG9jcy9lbi8xLjIuMC9waG9uZWdhcC9zdG9yYWdlL3N0b3JhZ2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyNGE3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zdG9yYWdlLm1kCkBAIC0wLDAgKzEsMjkgQEAKK1N0b3JhZ2UKKz09PT09PT09PT0KKworPiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRldmljZXMgc3RvcmFnZSBvcHRpb25zLiAgCisKK1RoaXMgQVBJIGlzIGJhc2VkIG9uIHRoZSBbVzNDIFdlYiBTUUwgRGF0YWJhc2UgU3BlY2lmaWNhdGlvbl0oaHR0cDovL2Rldi53My5vcmcvaHRtbDUvd2ViZGF0YWJhc2UvKSBhbmQgW1czQyBXZWIgU3RvcmFnZSBBUEkgU3BlY2lmaWNhdGlvbl0oaHR0cDovL2Rldi53My5vcmcvaHRtbDUvd2Vic3RvcmFnZS8pLiBTb21lIGRldmljZXMgYWxyZWFkeSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgc3BlYy4gRm9yIHRob3NlIGRldmljZXMsIHRoZSBidWlsdC1pbiBzdXBwb3J0IGlzIHVzZWQgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXQgd2l0aCBQaG9uZUdhcCdzIGltcGxlbWVudGF0aW9uLiBGb3IgZGV2aWNlcyB0aGF0IGRvbid0IGhhdmUgc3RvcmFnZSBzdXBwb3J0LCBQaG9uZUdhcCdzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFczQyBzcGVjaWZpY2F0aW9uLgorCitNZXRob2RzCistLS0tLS0tCisKKy0gb3BlbkRhdGFiYXNlCisKK0FyZ3VtZW50cworLS0tLS0tLS0tCisKKy0gbmFtZQorLSB2ZXJzaW9uCistIGRpc3BsYXlfbmFtZQorLSBzaXplCisKK09iamVjdHMKKy0tLS0tLS0KKworLSBEYXRhYmFzZQorLSBTUUxUcmFuc2FjdGlvbgorLSBTUUxSZXN1bHRTZXQKKy0gU1FMUmVzdWx0U2V0TGlzdAorLSBTUUxFcnJvcgorLSBsb2NhbFN0b3JhZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3RvcmFnZS5vcGVuZGF0YWJhc2UubWQgYi9kb2NzL2VuLzEuMi4wL3Bob25lZ2FwL3N0b3JhZ2Uvc3RvcmFnZS5vcGVuZGF0YWJhc2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2Mzc0OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZW4vMS4yLjAvcGhvbmVnYXAvc3RvcmFnZS9zdG9yYWdlLm9wZW5kYXRhYmFzZS5tZApAQCAtMCwwICsxLDU0IEBACitvcGVuRGF0YWJhc2UKKz09PT09PT09PT09PT09PQorCitSZXR1cm5zIGEgbmV3IERhdGFiYXNlIG9iamVjdC4KKworICAgIHZhciBkYlNoZWxsID0gd2luZG93Lm9wZW5EYXRhYmFzZShuYW1lLCB2ZXJzaW9uLCBkaXNwbGF5X25hbWUsIHNpemUpOworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKword2luZG93Lm9wZW5EYXRhYmFzZSByZXR1cm5zIGEgbmV3IERhdGFiYXNlIG9iamVjdC4KKworVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBuZXcgU1FMIExpdGUgRGF0YWJhc2UgYW5kIHJldHVybiBhIERhdGFiYXNlIG9iamVjdC4gIFVzZSB0aGUgRGF0YWJhc2UgT2JqZWN0IHRvIG1hbmlwdWxhdGUgdGhlIGRhdGEuCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBbmRyb2lkCistIEJsYWNrQmVycnkgV2ViV29ya3MgKE9TIDYuMCBhbmQgaGlnaGVyKQorLSBpUGhvbmUKKworUXVpY2sgRXhhbXBsZQorLS0tLS0tLS0tLS0tLQorCisgICAgdmFyIGRiID0gd2luZG93Lm9wZW5EYXRhYmFzZSgidGVzdCIsICIxLjAiLCAiVGVzdCBEQiIsIDEwMDAwMDApOworCitGdWxsIEV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkNvbnRhY3QgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InBob25lZ2FwLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KKworICAgICAgICAvLyBXYWl0IGZvciBQaG9uZUdhcCB0byBsb2FkCisgICAgICAgIC8vCisgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRldmljZXJlYWR5Iiwgb25EZXZpY2VSZWFkeSwgZmFsc2UpOworCisgICAgICAgIC8vIFBob25lR2FwIGlzIHJlYWR5CisgICAgICAgIC8vCisgICAgICAgIGZ1bmN0aW9uIG9uRGV2aWNlUmVhZHkoKSB7CisJCQl2YXIgZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKCJ0ZXN0IiwgIjEuMCIsICJUZXN0IERCIiwgMTAwMDAwMCk7CisgICAgICAgIH0KKwkJCisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT5FeGFtcGxlPC9oMT4KKyAgICAgICAgPHA+T3BlbiBEYXRhYmFzZTwvcD4KKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cg==